@expressivecss/expressive 0.14.1 → 0.15.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 (242) hide show
  1. package/CHANGELOG.md +88 -1
  2. package/README.md +1 -1
  3. package/dist/css/expressive.css +200 -241
  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-4KMNFIFZ.mjs → chunk-33QVDDGR.mjs} +3 -3
  8. package/dist/js/chunks/{chunk-SPETGK25.mjs → chunk-45FER6RI.mjs} +5 -5
  9. package/dist/js/chunks/chunk-45FER6RI.mjs.map +7 -0
  10. package/dist/js/chunks/{chunk-GIW4K4SE.mjs → chunk-5CEAOLUA.mjs} +11 -10
  11. package/dist/js/chunks/{chunk-GIW4K4SE.mjs.map → chunk-5CEAOLUA.mjs.map} +2 -2
  12. package/dist/js/chunks/{chunk-LRZMJZ3T.mjs → chunk-6VATUZC6.mjs} +10 -6
  13. package/dist/js/chunks/chunk-6VATUZC6.mjs.map +7 -0
  14. package/dist/js/chunks/{chunk-QDAL4IYN.mjs → chunk-74MXKKLN.mjs} +2 -2
  15. package/dist/js/chunks/{chunk-QDAL4IYN.mjs.map → chunk-74MXKKLN.mjs.map} +2 -2
  16. package/dist/js/chunks/{chunk-CUQPB25U.mjs → chunk-AIURVCG6.mjs} +3 -3
  17. package/dist/js/chunks/{chunk-KHV6DZXX.mjs → chunk-BGZLF6JZ.mjs} +16 -16
  18. package/dist/js/chunks/chunk-BGZLF6JZ.mjs.map +7 -0
  19. package/dist/js/chunks/{chunk-BG6ZRB5H.mjs → chunk-C6CHEWYP.mjs} +2 -2
  20. package/dist/js/chunks/{chunk-GVGT6MIU.mjs → chunk-CK2XCICY.mjs} +2 -2
  21. package/dist/js/chunks/{chunk-KY6U46SM.mjs → chunk-CXXM2L4F.mjs} +8 -9
  22. package/dist/js/chunks/chunk-CXXM2L4F.mjs.map +7 -0
  23. package/dist/js/chunks/{chunk-Z2NRKI7R.mjs → chunk-DXGRXYYL.mjs} +25 -37
  24. package/dist/js/chunks/chunk-DXGRXYYL.mjs.map +7 -0
  25. package/dist/js/chunks/{chunk-MZ6Z24BX.mjs → chunk-FM5CZOUB.mjs} +3 -7
  26. package/dist/js/chunks/{chunk-MZ6Z24BX.mjs.map → chunk-FM5CZOUB.mjs.map} +2 -2
  27. package/dist/js/chunks/{chunk-5HQSGDZ5.mjs → chunk-GJL6GCIU.mjs} +34 -55
  28. package/dist/js/chunks/chunk-GJL6GCIU.mjs.map +7 -0
  29. package/dist/js/chunks/chunk-K3HZMFMD.mjs +135 -0
  30. package/dist/js/chunks/chunk-K3HZMFMD.mjs.map +7 -0
  31. package/dist/js/chunks/{chunk-TBM3FT7G.mjs → chunk-KHXZ2A4K.mjs} +12 -15
  32. package/dist/js/chunks/{chunk-TBM3FT7G.mjs.map → chunk-KHXZ2A4K.mjs.map} +2 -2
  33. package/dist/js/chunks/chunk-KQACNQ22.mjs +7 -0
  34. package/dist/js/chunks/{chunk-KBNN3QDH.mjs.map → chunk-KQACNQ22.mjs.map} +1 -1
  35. package/dist/js/chunks/{chunk-UEXCIMJZ.mjs → chunk-KUFHW3DS.mjs} +2 -2
  36. package/dist/js/chunks/{chunk-A7ALMYUR.mjs → chunk-KVJAVDBC.mjs} +7 -15
  37. package/dist/js/chunks/chunk-KVJAVDBC.mjs.map +7 -0
  38. package/dist/js/chunks/{chunk-YDCS5S3J.mjs → chunk-L27Q6ZMI.mjs} +2 -2
  39. package/dist/js/chunks/{chunk-NS2UMNZV.mjs → chunk-LQWUDNHZ.mjs} +3 -3
  40. package/dist/js/chunks/{chunk-MNPROCZF.mjs → chunk-M372EDXD.mjs} +4 -10
  41. package/dist/js/chunks/chunk-M372EDXD.mjs.map +7 -0
  42. package/dist/js/chunks/{chunk-YMSXJON6.mjs → chunk-M3MURWMB.mjs} +15 -12
  43. package/dist/js/chunks/{chunk-YMSXJON6.mjs.map → chunk-M3MURWMB.mjs.map} +2 -2
  44. package/dist/js/chunks/{chunk-JIDMQGK6.mjs → chunk-NUHMOAOY.mjs} +18 -33
  45. package/dist/js/chunks/chunk-NUHMOAOY.mjs.map +7 -0
  46. package/dist/js/chunks/{chunk-VGZSAFTX.mjs → chunk-OWG3LMUL.mjs} +7 -11
  47. package/dist/js/chunks/chunk-OWG3LMUL.mjs.map +7 -0
  48. package/dist/js/chunks/{chunk-LTWPGFBR.mjs → chunk-PD6HYHAE.mjs} +4 -15
  49. package/dist/js/chunks/chunk-PD6HYHAE.mjs.map +7 -0
  50. package/dist/js/chunks/{chunk-ZAS25YFD.mjs → chunk-PDG64UHF.mjs} +3 -3
  51. package/dist/js/chunks/{chunk-QERLECVU.mjs → chunk-PO3AXVR3.mjs} +38 -64
  52. package/dist/js/chunks/chunk-PO3AXVR3.mjs.map +7 -0
  53. package/dist/js/chunks/{chunk-ILP3PDTL.mjs → chunk-QYGK36OG.mjs} +7 -13
  54. package/dist/js/chunks/chunk-QYGK36OG.mjs.map +7 -0
  55. package/dist/js/chunks/{chunk-S3XDFGSZ.mjs → chunk-SFI2U4YW.mjs} +28 -44
  56. package/dist/js/chunks/chunk-SFI2U4YW.mjs.map +7 -0
  57. package/dist/js/chunks/{chunk-FS7XY3HT.mjs → chunk-SMY7GJSS.mjs} +3 -3
  58. package/dist/js/chunks/{chunk-O5XPWXIQ.mjs → chunk-TCCA2HDG.mjs} +39 -31
  59. package/dist/js/chunks/chunk-TCCA2HDG.mjs.map +7 -0
  60. package/dist/js/chunks/{chunk-PM655FXL.mjs → chunk-TSZYSW7F.mjs} +4 -4
  61. package/dist/js/chunks/{chunk-PM655FXL.mjs.map → chunk-TSZYSW7F.mjs.map} +2 -2
  62. package/dist/js/chunks/{chunk-UEZUJQ66.mjs → chunk-UAZSDUVP.mjs} +3 -4
  63. package/dist/js/chunks/{chunk-UEZUJQ66.mjs.map → chunk-UAZSDUVP.mjs.map} +2 -2
  64. package/dist/js/chunks/{chunk-6N2XAEFK.mjs → chunk-UBRZZWRA.mjs} +10 -8
  65. package/dist/js/chunks/chunk-UBRZZWRA.mjs.map +7 -0
  66. package/dist/js/chunks/{chunk-5BKHWHYY.mjs → chunk-UCOE7ZDL.mjs} +41 -46
  67. package/dist/js/chunks/chunk-UCOE7ZDL.mjs.map +7 -0
  68. package/dist/js/chunks/{chunk-4TKTLGEM.mjs → chunk-UETTGDLI.mjs} +3 -3
  69. package/dist/js/chunks/{chunk-RHRQKTTX.mjs → chunk-UNCRDLP6.mjs} +6 -9
  70. package/dist/js/chunks/chunk-UNCRDLP6.mjs.map +7 -0
  71. package/dist/js/chunks/{chunk-GUB3TNO2.mjs → chunk-VGNYF6FB.mjs} +3 -6
  72. package/dist/js/chunks/{chunk-GUB3TNO2.mjs.map → chunk-VGNYF6FB.mjs.map} +2 -2
  73. package/dist/js/chunks/{chunk-X7OCHZVF.mjs → chunk-VGPGBNGL.mjs} +4 -12
  74. package/dist/js/chunks/chunk-VGPGBNGL.mjs.map +7 -0
  75. package/dist/js/chunks/chunk-VKAUVTQY.mjs +1 -0
  76. package/dist/js/chunks/{chunk-HKT2S7VM.mjs → chunk-VM4FTS7L.mjs} +3 -3
  77. package/dist/js/chunks/{chunk-3GVFZ4XO.mjs → chunk-WDK4T63U.mjs} +8 -11
  78. package/dist/js/chunks/chunk-WDK4T63U.mjs.map +7 -0
  79. package/dist/js/chunks/{chunk-GZKEFWPM.mjs → chunk-WOCCTVUF.mjs} +38 -34
  80. package/dist/js/chunks/chunk-WOCCTVUF.mjs.map +7 -0
  81. package/dist/js/chunks/{chunk-QJABDLSD.mjs → chunk-WQYN5L4E.mjs} +11 -16
  82. package/dist/js/chunks/chunk-WQYN5L4E.mjs.map +7 -0
  83. package/dist/js/chunks/{chunk-DAIU5SLG.mjs → chunk-X4ISMKE2.mjs} +2 -2
  84. package/dist/js/chunks/{chunk-3DHK5CZU.mjs → chunk-XAEAEHIX.mjs} +6 -8
  85. package/dist/js/chunks/chunk-XAEAEHIX.mjs.map +7 -0
  86. package/dist/js/chunks/{chunk-4HZMB7LI.mjs → chunk-ZX6M7SWO.mjs} +24 -24
  87. package/dist/js/chunks/chunk-ZX6M7SWO.mjs.map +7 -0
  88. package/dist/js/expressive.cjs +484 -507
  89. package/dist/js/expressive.cjs.map +4 -4
  90. package/dist/js/expressive.js +484 -507
  91. package/dist/js/expressive.js.map +4 -4
  92. package/dist/js/expressive.min.js +10 -13
  93. package/dist/js/expressive.min.js.map +4 -4
  94. package/dist/js/expressive.mjs +54 -50
  95. package/dist/js/expressive.mjs.map +1 -1
  96. package/dist/js/internal/behaviors/bottomSheets.mjs +3 -3
  97. package/dist/js/internal/behaviors/dialogs.mjs +2 -2
  98. package/dist/js/internal/behaviors/forms.mjs +2 -2
  99. package/dist/js/internal/behaviors/sheetDrag.mjs +2 -2
  100. package/dist/js/internal/behaviors/sideSheets.mjs +3 -3
  101. package/dist/js/internal/components/appBar.mjs +2 -2
  102. package/dist/js/internal/components/autocomplete.mjs +4 -4
  103. package/dist/js/internal/components/barChart.mjs +4 -4
  104. package/dist/js/internal/components/buttonGroup.mjs +2 -2
  105. package/dist/js/internal/components/buttons.mjs +3 -3
  106. package/dist/js/internal/components/cards.mjs +3 -3
  107. package/dist/js/internal/components/carousel.mjs +3 -3
  108. package/dist/js/internal/components/characterCounter.mjs +2 -2
  109. package/dist/js/internal/components/chips.mjs +5 -5
  110. package/dist/js/internal/components/columnChart.mjs +3 -3
  111. package/dist/js/internal/components/commandPalette.mjs +3 -3
  112. package/dist/js/internal/components/confetti.mjs +2 -2
  113. package/dist/js/internal/components/datepicker.mjs +6 -6
  114. package/dist/js/internal/components/expandingCard.mjs +3 -3
  115. package/dist/js/internal/components/heatmapChart.mjs +3 -3
  116. package/dist/js/internal/components/index.mjs +47 -43
  117. package/dist/js/internal/components/keypad.mjs +9 -0
  118. package/dist/js/internal/components/keypad.mjs.map +7 -0
  119. package/dist/js/internal/components/lightbox.mjs +3 -3
  120. package/dist/js/internal/components/lineChart.mjs +6 -2
  121. package/dist/js/internal/components/mapView.mjs +3 -3
  122. package/dist/js/internal/components/menu.mjs +3 -3
  123. package/dist/js/internal/components/messageScroller.mjs +3 -3
  124. package/dist/js/internal/components/mixedChart.mjs +4 -4
  125. package/dist/js/internal/components/navigationRail.mjs +2 -2
  126. package/dist/js/internal/components/particles.mjs +2 -2
  127. package/dist/js/internal/components/pieChart.mjs +3 -3
  128. package/dist/js/internal/components/questionnaire.mjs +3 -3
  129. package/dist/js/internal/components/radarChart.mjs +3 -3
  130. package/dist/js/internal/components/radialChart.mjs +3 -3
  131. package/dist/js/internal/components/registry.mjs +41 -40
  132. package/dist/js/internal/components/richTextEditor.mjs +3 -3
  133. package/dist/js/internal/components/scrollspy.mjs +2 -2
  134. package/dist/js/internal/components/select.mjs +4 -4
  135. package/dist/js/internal/components/slider.mjs +3 -3
  136. package/dist/js/internal/components/snackbar.mjs +2 -2
  137. package/dist/js/internal/components/tabs.mjs +4 -4
  138. package/dist/js/internal/components/timepicker.mjs +4 -4
  139. package/dist/js/internal/components/tooltip.mjs +3 -3
  140. package/dist/js/internal/core/component.mjs +1 -1
  141. package/dist/js/internal/core/utils.mjs +1 -1
  142. package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +2 -2
  143. package/dist/js/modular.mjs +54 -50
  144. package/dist/types/components/autocomplete.d.ts +1 -0
  145. package/dist/types/components/datepicker.d.ts +3 -4
  146. package/dist/types/components/expandingCard.d.ts +2 -0
  147. package/dist/types/components/index.d.ts +1 -0
  148. package/dist/types/components/keypad.d.ts +34 -0
  149. package/dist/types/components/lightbox.d.ts +3 -5
  150. package/dist/types/components/lineChart.d.ts +4 -0
  151. package/dist/types/components/menu.d.ts +1 -0
  152. package/dist/types/components/radialChart.d.ts +0 -1
  153. package/dist/types/components/registry.d.ts +4 -0
  154. package/dist/types/components/slider.d.ts +2 -0
  155. package/dist/types/components/snackbar.d.ts +1 -0
  156. package/dist/types/components/tabs.d.ts +4 -0
  157. package/dist/types/components/timepicker.d.ts +2 -0
  158. package/dist/types/modular.d.ts +1 -1
  159. package/dist/types/plugins/dockedDisplayPlugin.d.ts +1 -0
  160. package/package.json +1 -1
  161. package/src/sass/abstracts/_breakpoints.scss +0 -1
  162. package/src/sass/abstracts/_elevation.scss +1 -1
  163. package/src/sass/abstracts/_mixins.scss +20 -60
  164. package/src/sass/abstracts/_variables.scss +10 -0
  165. package/src/sass/base/_global.scss +3 -12
  166. package/src/sass/base/_index.scss +1 -1
  167. package/src/sass/components/_badges.scss +1 -8
  168. package/src/sass/components/_bar-chart.scss +1 -1
  169. package/src/sass/components/_button-groups.scss +31 -66
  170. package/src/sass/components/_cards.scss +6 -25
  171. package/src/sass/components/_carousel.scss +16 -55
  172. package/src/sass/components/_chips.scss +0 -6
  173. package/src/sass/components/_column-chart.scss +1 -1
  174. package/src/sass/components/_data-table.scss +1 -3
  175. package/src/sass/components/_datepicker.scss +3 -22
  176. package/src/sass/components/_dialog.scss +1 -4
  177. package/src/sass/components/_heatmap-chart.scss +2 -2
  178. package/src/sass/components/_icon-buttons.scss +0 -1
  179. package/src/sass/components/_index.scss +1 -0
  180. package/src/sass/components/_keypad.scss +162 -0
  181. package/src/sass/components/_lightbox.scss +3 -8
  182. package/src/sass/components/_map.scss +2 -2
  183. package/src/sass/components/_menu.scss +31 -74
  184. package/src/sass/components/_mixed-chart.scss +1 -1
  185. package/src/sass/components/_navbar.scss +9 -45
  186. package/src/sass/components/_navigation-rail.scss +23 -32
  187. package/src/sass/components/_page-footer.scss +15 -12
  188. package/src/sass/components/_panes.scss +2 -6
  189. package/src/sass/components/_progress.scss +6 -4
  190. package/src/sass/components/_side-sheet.scss +1 -4
  191. package/src/sass/components/_stepper.scss +0 -4
  192. package/src/sass/components/_timepicker.scss +4 -36
  193. package/src/sass/components/_toolbar.scss +0 -4
  194. package/src/sass/components/forms/_checkboxes.scss +37 -65
  195. package/src/sass/components/forms/_fieldset.scss +3 -3
  196. package/src/sass/components/forms/_file-input.scss +0 -1
  197. package/src/sass/components/forms/_radio-buttons.scss +10 -36
  198. package/src/sass/components/forms/_select.scss +0 -3
  199. package/src/sass/components/forms/_slider.scss +72 -259
  200. package/src/sass/tokens/_state.scss +2 -2
  201. package/src/sass/tokens/_theme.scss +1 -1
  202. package/src/sass/utilities/_colors.scss +6 -1
  203. package/src/sass/utilities/_index.scss +1 -1
  204. package/dist/js/chunks/chunk-3DHK5CZU.mjs.map +0 -7
  205. package/dist/js/chunks/chunk-3GVFZ4XO.mjs.map +0 -7
  206. package/dist/js/chunks/chunk-4HZMB7LI.mjs.map +0 -7
  207. package/dist/js/chunks/chunk-5BKHWHYY.mjs.map +0 -7
  208. package/dist/js/chunks/chunk-5HQSGDZ5.mjs.map +0 -7
  209. package/dist/js/chunks/chunk-6N2XAEFK.mjs.map +0 -7
  210. package/dist/js/chunks/chunk-A7ALMYUR.mjs.map +0 -7
  211. package/dist/js/chunks/chunk-GZKEFWPM.mjs.map +0 -7
  212. package/dist/js/chunks/chunk-ILP3PDTL.mjs.map +0 -7
  213. package/dist/js/chunks/chunk-JIDMQGK6.mjs.map +0 -7
  214. package/dist/js/chunks/chunk-KBNN3QDH.mjs +0 -7
  215. package/dist/js/chunks/chunk-KHV6DZXX.mjs.map +0 -7
  216. package/dist/js/chunks/chunk-KY6U46SM.mjs.map +0 -7
  217. package/dist/js/chunks/chunk-LRZMJZ3T.mjs.map +0 -7
  218. package/dist/js/chunks/chunk-LTWPGFBR.mjs.map +0 -7
  219. package/dist/js/chunks/chunk-MNPROCZF.mjs.map +0 -7
  220. package/dist/js/chunks/chunk-O5XPWXIQ.mjs.map +0 -7
  221. package/dist/js/chunks/chunk-QERLECVU.mjs.map +0 -7
  222. package/dist/js/chunks/chunk-QJABDLSD.mjs.map +0 -7
  223. package/dist/js/chunks/chunk-RHRQKTTX.mjs.map +0 -7
  224. package/dist/js/chunks/chunk-S3XDFGSZ.mjs.map +0 -7
  225. package/dist/js/chunks/chunk-SPETGK25.mjs.map +0 -7
  226. package/dist/js/chunks/chunk-VGZSAFTX.mjs.map +0 -7
  227. package/dist/js/chunks/chunk-X7OCHZVF.mjs.map +0 -7
  228. package/dist/js/chunks/chunk-Z2NRKI7R.mjs.map +0 -7
  229. package/dist/js/chunks/chunk-ZKZKNSLC.mjs +0 -1
  230. /package/dist/js/chunks/{chunk-4KMNFIFZ.mjs.map → chunk-33QVDDGR.mjs.map} +0 -0
  231. /package/dist/js/chunks/{chunk-CUQPB25U.mjs.map → chunk-AIURVCG6.mjs.map} +0 -0
  232. /package/dist/js/chunks/{chunk-BG6ZRB5H.mjs.map → chunk-C6CHEWYP.mjs.map} +0 -0
  233. /package/dist/js/chunks/{chunk-GVGT6MIU.mjs.map → chunk-CK2XCICY.mjs.map} +0 -0
  234. /package/dist/js/chunks/{chunk-UEXCIMJZ.mjs.map → chunk-KUFHW3DS.mjs.map} +0 -0
  235. /package/dist/js/chunks/{chunk-YDCS5S3J.mjs.map → chunk-L27Q6ZMI.mjs.map} +0 -0
  236. /package/dist/js/chunks/{chunk-NS2UMNZV.mjs.map → chunk-LQWUDNHZ.mjs.map} +0 -0
  237. /package/dist/js/chunks/{chunk-ZAS25YFD.mjs.map → chunk-PDG64UHF.mjs.map} +0 -0
  238. /package/dist/js/chunks/{chunk-FS7XY3HT.mjs.map → chunk-SMY7GJSS.mjs.map} +0 -0
  239. /package/dist/js/chunks/{chunk-4TKTLGEM.mjs.map → chunk-UETTGDLI.mjs.map} +0 -0
  240. /package/dist/js/chunks/{chunk-ZKZKNSLC.mjs.map → chunk-VKAUVTQY.mjs.map} +0 -0
  241. /package/dist/js/chunks/{chunk-HKT2S7VM.mjs.map → chunk-VM4FTS7L.mjs.map} +0 -0
  242. /package/dist/js/chunks/{chunk-DAIU5SLG.mjs.map → chunk-X4ISMKE2.mjs.map} +0 -0
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  Utils
3
- } from "./chunk-MNPROCZF.mjs";
3
+ } from "./chunk-M372EDXD.mjs";
4
4
  import {
5
5
  Component
6
- } from "./chunk-LTWPGFBR.mjs";
6
+ } from "./chunk-PD6HYHAE.mjs";
7
7
 
8
8
  // src/ts/components/tooltip.ts
9
9
  var _defaults = {
@@ -136,8 +136,12 @@ var Tooltip = class _Tooltip extends Component {
136
136
  this.tooltipEl.id = `tooltip-${Utils.guid()}`;
137
137
  this.tooltipEl.setAttribute("role", "tooltip");
138
138
  this.el.setAttribute("aria-describedby", [this.el.getAttribute("aria-describedby"), this.tooltipEl.id].filter(Boolean).join(" "));
139
- const tooltipContentEl = this.options.tooltipId ? Utils.getElementById(this.el, this.options.tooltipId) : document.createElement("div");
140
- if (this.options.tooltipId) {
139
+ const richContentEl = this.options.tooltipId ? Utils.getElementById(this.el, this.options.tooltipId) : null;
140
+ if (this.options.tooltipId && !richContentEl) {
141
+ console.error(`Tooltip: no element with id "${this.options.tooltipId}"; showing the text tooltip instead.`);
142
+ }
143
+ const tooltipContentEl = richContentEl ?? document.createElement("div");
144
+ if (richContentEl) {
141
145
  this.tooltipEl.classList.add("rich");
142
146
  const marker = document.createComment("");
143
147
  tooltipContentEl.before(marker);
@@ -158,7 +162,7 @@ var Tooltip = class _Tooltip extends Component {
158
162
  Utils.portalRoot(this.el).appendChild(this.tooltipEl);
159
163
  }
160
164
  _setTooltipContent(tooltipContentEl) {
161
- if (this.options.tooltipId) return;
165
+ if (this._originalContent) return;
162
166
  tooltipContentEl.innerText = this.options.text;
163
167
  }
164
168
  _updateTooltipContent() {
@@ -288,4 +292,4 @@ var Tooltip = class _Tooltip extends Component {
288
292
  export {
289
293
  Tooltip
290
294
  };
291
- //# sourceMappingURL=chunk-LRZMJZ3T.mjs.map
295
+ //# sourceMappingURL=chunk-6VATUZC6.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/tooltip.ts"],
4
+ "sourcesContent": ["import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nexport type TooltipPosition = 'top' | 'right' | 'bottom' | 'left';\n\nexport interface TooltipOptions extends BaseOptions {\n /**\n * Delay time before tooltip disappears.\n * @default 200\n */\n exitDelay: number;\n /**\n * Delay time before tooltip appears.\n * @default 0\n */\n enterDelay: number;\n /**\n * Element Id for the tooltip.\n * @default \"\"\n */\n tooltipId?: string;\n /**\n * Text string for the tooltip.\n * @default \"\"\n */\n text: string;\n /**\n * Set distance tooltip appears away from its activator\n * excluding transitionMovement.\n * @default 4\n */\n margin: number;\n /**\n * Enter transition duration.\n * @default 300\n */\n inDuration: number;\n /**\n * Opacity of the tooltip.\n * @default 1\n */\n opacity: number;\n /**\n * Exit transition duration.\n * @default 250\n */\n outDuration: number;\n /**\n * Set the direction of the tooltip.\n * @default 'bottom'\n */\n position: TooltipPosition;\n /**\n * Amount in px that the tooltip moves during its transition.\n * @default 10\n */\n transitionMovement: number;\n}\n\nconst _defaults: TooltipOptions = {\n exitDelay: 200,\n enterDelay: 0,\n text: '',\n margin: 4,\n inDuration: 250,\n outDuration: 200,\n position: 'bottom',\n transitionMovement: 10,\n opacity: 1\n};\n\nexport class Tooltip extends Component<TooltipOptions> {\n /**\n * If tooltip is open.\n */\n isOpen: boolean;\n /**\n * If tooltip is hovered.\n */\n isHovered: boolean;\n /**\n * If tooltip is focused.\n */\n isFocused: boolean;\n tooltipEl: HTMLElement;\n private _exitDelayTimeout: ReturnType<typeof setTimeout>;\n private _enterDelayTimeout: ReturnType<typeof setTimeout>;\n private _animationTimeout: ReturnType<typeof setTimeout>;\n private _originalContent: {\n el: HTMLElement;\n marker: Comment;\n display: string;\n priority: string;\n hidden: string | null;\n contentClass: boolean;\n };\n xMovement: number;\n yMovement: number;\n\n constructor(el: HTMLElement, options: Partial<TooltipOptions>) {\n super(el, options, Tooltip);\n this.el['Expressive_Tooltip'] = this;\n\n this.options = {\n ...Tooltip.defaults,\n ...this._getAttributeOptions(),\n ...options\n };\n\n this.isOpen = false;\n this.isHovered = false;\n this.isFocused = false;\n this._appendTooltipEl();\n this._setupEventHandlers();\n }\n\n static get defaults(): TooltipOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Tooltip.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<TooltipOptions>): Tooltip;\n /**\n * Initializes instances of Tooltip.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<InitElement>, options?: Partial<TooltipOptions>): Tooltip[];\n /**\n * Initializes instances of Tooltip.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<TooltipOptions> = {}\n ): Tooltip | Tooltip[] {\n return super.init(els, options, Tooltip);\n }\n\n static getInstance(el: HTMLElement): Tooltip {\n return el['Expressive_Tooltip'];\n }\n\n destroy() {\n clearTimeout(this._enterDelayTimeout);\n clearTimeout(this._exitDelayTimeout);\n clearTimeout(this._animationTimeout);\n this.isOpen = false;\n this.isHovered = false;\n this.isFocused = false;\n const descriptions = this.el.getAttribute('aria-describedby')?.split(/\\s+/);\n if (descriptions?.includes(this.tooltipEl.id)) {\n const remaining = descriptions.filter(id => id && id !== this.tooltipEl.id).join(' ');\n if (remaining) this.el.setAttribute('aria-describedby', remaining);\n else this.el.removeAttribute('aria-describedby');\n }\n if (this._originalContent) {\n const { el, marker, display, priority, hidden, contentClass } = this._originalContent;\n el.style.setProperty('display', display, priority);\n if (hidden === null) el.removeAttribute('hidden');\n else el.setAttribute('hidden', hidden);\n el.classList.toggle('tooltip-content', contentClass);\n if (!el.className) el.removeAttribute('class');\n marker.replaceWith(el);\n this._originalContent = null;\n }\n this.tooltipEl.remove();\n this._removeEventHandlers();\n this.el['Expressive_Tooltip'] = undefined;\n }\n\n _appendTooltipEl() {\n this.tooltipEl = document.createElement('div');\n this.tooltipEl.classList.add('tooltip');\n this.tooltipEl.id = `tooltip-${Utils.guid()}`;\n this.tooltipEl.setAttribute('role', 'tooltip');\n this.el.setAttribute('aria-describedby', [this.el.getAttribute('aria-describedby'), this.tooltipEl.id].filter(Boolean).join(' '));\n\n const richContentEl = this.options.tooltipId\n ? Utils.getElementById(this.el, this.options.tooltipId)\n : null;\n if (this.options.tooltipId && !richContentEl) {\n console.error(`Tooltip: no element with id \"${this.options.tooltipId}\"; showing the text tooltip instead.`);\n }\n const tooltipContentEl = richContentEl ?? document.createElement('div');\n if (richContentEl) {\n this.tooltipEl.classList.add('rich');\n const marker = document.createComment('');\n tooltipContentEl.before(marker);\n this._originalContent = {\n el: tooltipContentEl, marker,\n display: tooltipContentEl.style.display,\n priority: tooltipContentEl.style.getPropertyPriority('display'),\n hidden: tooltipContentEl.getAttribute('hidden'),\n contentClass: tooltipContentEl.classList.contains('tooltip-content')\n };\n tooltipContentEl.removeAttribute('hidden');\n }\n tooltipContentEl.style.display = '';\n tooltipContentEl.classList.add('tooltip-content');\n this._setTooltipContent(tooltipContentEl);\n this.tooltipEl.appendChild(tooltipContentEl);\n Utils.portalRoot(this.el).appendChild(this.tooltipEl);\n }\n\n _setTooltipContent(tooltipContentEl: HTMLElement) {\n if (this._originalContent) return;\n tooltipContentEl.innerText = this.options.text;\n }\n\n _updateTooltipContent() {\n this._setTooltipContent(this.tooltipEl.querySelector('.tooltip-content'));\n }\n\n _setupEventHandlers() {\n for (const el of [this.el, this.tooltipEl]) {\n el.addEventListener('mouseenter', this._handleMouseEnter);\n el.addEventListener('mouseleave', this._handleMouseLeave);\n el.addEventListener('focus', this._handleFocus, true);\n el.addEventListener('blur', this._handleBlur, true);\n }\n }\n\n _removeEventHandlers() {\n for (const el of [this.el, this.tooltipEl]) {\n el.removeEventListener('mouseenter', this._handleMouseEnter);\n el.removeEventListener('mouseleave', this._handleMouseLeave);\n el.removeEventListener('focus', this._handleFocus, true);\n el.removeEventListener('blur', this._handleBlur, true);\n }\n // Escape is only listened for while open; see open() and close().\n this.el.ownerDocument.removeEventListener('keydown', this._handleKeydown, true);\n }\n\n /**\n * Show tooltip.\n */\n open = (isManual: boolean = true) => {\n if (this.isOpen) return;\n clearTimeout(this._exitDelayTimeout);\n clearTimeout(this._animationTimeout);\n this.isOpen = true;\n this.el.ownerDocument.addEventListener('keydown', this._handleKeydown, true);\n // Update tooltip content with HTML attribute options\n this.options = { ...this.options, ...this._getAttributeOptions() };\n this._updateTooltipContent();\n this._setEnterDelayTimeout(isManual);\n };\n\n /**\n * Hide tooltip.\n */\n close = () => {\n if (!this.isOpen) return;\n this.isHovered = false;\n this.isFocused = false;\n this.isOpen = false;\n this.el.ownerDocument.removeEventListener('keydown', this._handleKeydown, true);\n clearTimeout(this._enterDelayTimeout);\n this._setExitDelayTimeout();\n };\n\n _setExitDelayTimeout() {\n clearTimeout(this._exitDelayTimeout);\n this._exitDelayTimeout = setTimeout(() => {\n if (this.isHovered || this.isFocused) return;\n this._animateOut();\n }, this.options.exitDelay);\n }\n\n _setEnterDelayTimeout(isManual) {\n clearTimeout(this._enterDelayTimeout);\n this._enterDelayTimeout = setTimeout(() => {\n if (!this.isHovered && !this.isFocused && !isManual) return;\n this._animateIn();\n }, this.options.enterDelay);\n }\n\n _positionTooltip() {\n const tooltip: HTMLElement = this.tooltipEl;\n const origin = this.el,\n originHeight = origin.offsetHeight,\n originWidth = origin.offsetWidth,\n tooltipHeight = tooltip.offsetHeight,\n tooltipWidth = tooltip.offsetWidth,\n margin = this.options.margin;\n\n this.xMovement = 0;\n this.yMovement = 0;\n\n const originRect = origin.getBoundingClientRect();\n let targetTop = originRect.top + Utils.getDocumentScrollTop();\n let targetLeft = originRect.left + Utils.getDocumentScrollLeft();\n if (this.options.position === 'top') {\n targetTop += -tooltipHeight - margin;\n targetLeft += originWidth / 2 - tooltipWidth / 2;\n this.yMovement = -this.options.transitionMovement;\n } else if (this.options.position === 'right') {\n targetTop += originHeight / 2 - tooltipHeight / 2;\n targetLeft += originWidth + margin;\n this.xMovement = this.options.transitionMovement;\n } else if (this.options.position === 'left') {\n targetTop += originHeight / 2 - tooltipHeight / 2;\n targetLeft += -tooltipWidth - margin;\n this.xMovement = -this.options.transitionMovement;\n } else {\n targetTop += originHeight + margin;\n targetLeft += originWidth / 2 - tooltipWidth / 2;\n this.yMovement = this.options.transitionMovement;\n }\n\n const newCoordinates = this._repositionWithinScreen(\n targetLeft,\n targetTop,\n tooltipWidth,\n tooltipHeight\n );\n\n tooltip.style.setProperty('--md-comp-tooltip-anchor-gap', `${Math.max(0, margin) + Math.abs(this.options.transitionMovement)}px`);\n tooltip.style.top = newCoordinates.y + 'px';\n tooltip.style.left = newCoordinates.x + 'px';\n }\n\n _repositionWithinScreen(x: number, y: number, width: number, height: number) {\n return Utils._repositionWithinScreen(\n x, y, width, height, this.options.margin, this.options.transitionMovement, 'center'\n );\n }\n\n _animateIn() { this._animate(true); }\n\n _animateOut() { this._animate(false); }\n\n _animate(show: boolean) {\n const style = this.tooltipEl.style;\n const reduce = this.el.ownerDocument.defaultView.matchMedia('(prefers-reduced-motion: reduce)').matches;\n const duration = reduce ? 0 : show ? this.options.inDuration : this.options.outDuration;\n if (show) {\n this._positionTooltip();\n style.visibility = 'visible';\n style.overflow = 'visible';\n }\n style.transition = `transform ${duration}ms ease-out, opacity ${duration}ms ease-out`;\n clearTimeout(this._animationTimeout);\n this._animationTimeout = setTimeout(() => {\n style.transform = show && !reduce ? `translateX(${this.xMovement}px) translateY(${this.yMovement}px)` : 'none';\n style.opacity = show ? (this.options.opacity || 1).toString() : '0';\n if (!show) this._animationTimeout = setTimeout(() => {\n style.visibility = 'hidden';\n style.overflow = '';\n }, duration);\n }, 1);\n }\n\n _handleMouseEnter = () => {\n this.isHovered = true;\n this.open(false);\n };\n\n _handleMouseLeave = (event: MouseEvent) => {\n const next = event.relatedTarget as Node | null;\n if (next && (this.el.contains(next) || this.tooltipEl.contains(next))) return;\n this.isHovered = false;\n if (!this.isFocused) this.close();\n };\n\n _handleKeydown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape' || !this.isOpen) return;\n event.preventDefault();\n event.stopPropagation();\n this.close();\n clearTimeout(this._exitDelayTimeout);\n this._animateOut();\n };\n\n // Focus opens the tooltip only when it arrived by keyboard: a pointer press\n // on the trigger also focuses it, and _handleMouseEnter already covers that.\n _handleFocus = (event: FocusEvent) => {\n if ((event.target as HTMLElement).matches(':focus-visible')) {\n this.isFocused = true;\n this.open(false);\n }\n };\n\n _handleBlur = (event: FocusEvent) => {\n const next = event.relatedTarget as Node | null;\n if (next && (this.el.contains(next) || this.tooltipEl.contains(next))) return;\n this.isFocused = false;\n if (!this.isHovered) this.close();\n };\n\n _getAttributeOptions(): Partial<TooltipOptions> {\n const attributeOptions: Partial<TooltipOptions> = {};\n const tooltipTextOption = this.el.getAttribute('data-tooltip');\n const tooltipId = this.el.getAttribute('data-tooltip-id');\n const positionOption = this.el.getAttribute('data-position');\n if (tooltipTextOption) {\n attributeOptions.text = tooltipTextOption;\n }\n if (positionOption) {\n attributeOptions.position = positionOption as TooltipPosition;\n }\n if (tooltipId) {\n attributeOptions.tooltipId = tooltipId;\n }\n\n return attributeOptions;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Component
3
- } from "./chunk-LTWPGFBR.mjs";
3
+ } from "./chunk-PD6HYHAE.mjs";
4
4
 
5
5
  // src/ts/components/characterCounter.ts
6
6
  var _defaults = Object.freeze({});
@@ -82,4 +82,4 @@ var CharacterCounter = class _CharacterCounter extends Component {
82
82
  export {
83
83
  CharacterCounter
84
84
  };
85
- //# sourceMappingURL=chunk-QDAL4IYN.mjs.map
85
+ //# sourceMappingURL=chunk-74MXKKLN.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/ts/components/characterCounter.ts"],
4
- "sourcesContent": ["import { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nconst _defaults = Object.freeze({});\n\ntype InputElement = HTMLInputElement | HTMLTextAreaElement;\n\nexport class CharacterCounter extends Component<BaseOptions> {\n declare el: InputElement;\n /** Stores the reference to the counter HTML element. */\n counterEl: HTMLSpanElement;\n /** Specifies whether the input is valid or not. */\n isInvalid: boolean;\n /** Specifies whether the input text has valid length or not. */\n isValidLength: boolean;\n\n constructor(el: HTMLInputElement | HTMLTextAreaElement, options: Partial<BaseOptions>) {\n super(el, {}, CharacterCounter);\n this.el['Expressive_CharacterCounter'] = this;\n\n this.options = {\n ...CharacterCounter.defaults,\n ...options\n };\n\n this.isInvalid = false;\n this.isValidLength = false;\n\n this._setupCounter();\n this._setupEventHandlers();\n }\n\n static get defaults(): BaseOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of CharacterCounter.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: InputElement, options?: Partial<BaseOptions>): CharacterCounter;\n /**\n * Initializes instances of CharacterCounter.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InitElements<InputElement | InitElement>,\n options?: Partial<BaseOptions>\n ): CharacterCounter[];\n /**\n * Initializes instances of CharacterCounter.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InputElement | InitElements<InputElement | InitElement>,\n options: Partial<BaseOptions> = {}\n ): CharacterCounter | CharacterCounter[] {\n return super.init(els, options, CharacterCounter);\n }\n\n static getInstance(el: InputElement): CharacterCounter {\n return el['Expressive_CharacterCounter'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this.el['Expressive_CharacterCounter'] = undefined;\n this._removeCounter();\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('focus', this.updateCounter, true);\n this.el.addEventListener('input', this.updateCounter, true);\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('focus', this.updateCounter, true);\n this.el.removeEventListener('input', this.updateCounter, true);\n }\n\n _setupCounter() {\n this.counterEl = document.createElement('span');\n this.counterEl.classList.add('character-counter');\n // The count is the whole point of the component and it changes as the\n // user types, so it has to be a live region - otherwise a screen reader\n // user reaches the limit without ever being told one existed. Polite so\n // it waits for a pause instead of interrupting every keystroke, and\n // atomic so \"18/20\" is read as one figure rather than a changed digit.\n this.counterEl.setAttribute('aria-live', 'polite');\n this.counterEl.setAttribute('aria-atomic', 'true');\n this.counterEl.style.float = 'right';\n this.counterEl.style.fontSize = '12px';\n this.counterEl.style.height = '1';\n this.el.parentElement.appendChild(this.counterEl);\n }\n\n _removeCounter() {\n this.counterEl.remove();\n }\n\n updateCounter = () => {\n const maxLength = parseInt(this.el.getAttribute('maxlength')),\n actualLength = (this.el as HTMLInputElement).value.length;\n\n this.isValidLength = actualLength <= maxLength;\n let counterString = actualLength.toString();\n if (maxLength) {\n counterString += '/' + maxLength;\n this._validateInput();\n }\n this.counterEl.textContent = counterString;\n };\n\n _validateInput() {\n if (this.isValidLength && this.isInvalid) {\n this.isInvalid = false;\n this.el.classList.remove('invalid');\n } else if (!this.isValidLength && !this.isInvalid) {\n this.isInvalid = true;\n this.el.classList.remove('valid');\n this.el.classList.add('invalid');\n }\n }\n}\n"],
5
- "mappings": ";;;;;AAEA,IAAM,YAAY,OAAO,OAAO,CAAC,CAAC;AAI3B,IAAM,mBAAN,MAAM,0BAAyB,UAAuB;AAAA,EAS3D,YAAY,IAA4C,SAA+B;AACrF,UAAM,IAAI,CAAC,GAAG,iBAAgB;AAsFhC,yBAAgB,MAAM;AACpB,YAAM,YAAY,SAAS,KAAK,GAAG,aAAa,WAAW,CAAC,GAC1D,eAAgB,KAAK,GAAwB,MAAM;AAErD,WAAK,gBAAgB,gBAAgB;AACrC,UAAI,gBAAgB,aAAa,SAAS;AAC1C,UAAI,WAAW;AACb,yBAAiB,MAAM;AACvB,aAAK,eAAe;AAAA,MACtB;AACA,WAAK,UAAU,cAAc;AAAA,IAC/B;AAhGE,SAAK,GAAG,6BAA6B,IAAI;AAEzC,SAAK,UAAU;AAAA,MACb,GAAG,kBAAiB;AAAA,MACpB,GAAG;AAAA,IACL;AAEA,SAAK,YAAY;AACjB,SAAK,gBAAgB;AAErB,SAAK,cAAc;AACnB,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,WAAW,WAAwB;AACjC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,OAAO,KACL,KACA,UAAgC,CAAC,GACM;AACvC,WAAO,MAAM,KAAK,KAAK,SAAS,iBAAgB;AAAA,EAClD;AAAA,EAEA,OAAO,YAAY,IAAoC;AACrD,WAAO,GAAG,6BAA6B;AAAA,EACzC;AAAA,EAEA,UAAU;AACR,SAAK,qBAAqB;AAC1B,SAAK,GAAG,6BAA6B,IAAI;AACzC,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,sBAAsB;AACpB,SAAK,GAAG,iBAAiB,SAAS,KAAK,eAAe,IAAI;AAC1D,SAAK,GAAG,iBAAiB,SAAS,KAAK,eAAe,IAAI;AAAA,EAC5D;AAAA,EAEA,uBAAuB;AACrB,SAAK,GAAG,oBAAoB,SAAS,KAAK,eAAe,IAAI;AAC7D,SAAK,GAAG,oBAAoB,SAAS,KAAK,eAAe,IAAI;AAAA,EAC/D;AAAA,EAEA,gBAAgB;AACd,SAAK,YAAY,SAAS,cAAc,MAAM;AAC9C,SAAK,UAAU,UAAU,IAAI,mBAAmB;AAMhD,SAAK,UAAU,aAAa,aAAa,QAAQ;AACjD,SAAK,UAAU,aAAa,eAAe,MAAM;AACjD,SAAK,UAAU,MAAM,QAAQ;AAC7B,SAAK,UAAU,MAAM,WAAW;AAChC,SAAK,UAAU,MAAM,SAAS;AAC9B,SAAK,GAAG,cAAc,YAAY,KAAK,SAAS;AAAA,EAClD;AAAA,EAEA,iBAAiB;AACf,SAAK,UAAU,OAAO;AAAA,EACxB;AAAA,EAeA,iBAAiB;AACf,QAAI,KAAK,iBAAiB,KAAK,WAAW;AACxC,WAAK,YAAY;AACjB,WAAK,GAAG,UAAU,OAAO,SAAS;AAAA,IACpC,WAAW,CAAC,KAAK,iBAAiB,CAAC,KAAK,WAAW;AACjD,WAAK,YAAY;AACjB,WAAK,GAAG,UAAU,OAAO,OAAO;AAChC,WAAK,GAAG,UAAU,IAAI,SAAS;AAAA,IACjC;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nconst _defaults = Object.freeze({});\n\ntype InputElement = HTMLInputElement | HTMLTextAreaElement;\n\nexport class CharacterCounter extends Component<BaseOptions> {\n declare el: InputElement;\n /** Stores the reference to the counter HTML element. */\n counterEl: HTMLSpanElement;\n /** Specifies whether the input is valid or not. */\n isInvalid: boolean;\n /** Specifies whether the input text has valid length or not. */\n isValidLength: boolean;\n\n constructor(el: HTMLInputElement | HTMLTextAreaElement, options: Partial<BaseOptions>) {\n super(el, {}, CharacterCounter);\n this.el['Expressive_CharacterCounter'] = this;\n\n this.options = {\n ...CharacterCounter.defaults,\n ...options\n };\n\n this.isInvalid = false;\n this.isValidLength = false;\n\n this._setupCounter();\n this._setupEventHandlers();\n }\n\n static get defaults(): BaseOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of CharacterCounter.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: InputElement, options?: Partial<BaseOptions>): CharacterCounter;\n /**\n * Initializes instances of CharacterCounter.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InitElements<InputElement | InitElement>,\n options?: Partial<BaseOptions>\n ): CharacterCounter[];\n /**\n * Initializes instances of CharacterCounter.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InputElement | InitElements<InputElement | InitElement>,\n options: Partial<BaseOptions> = {}\n ): CharacterCounter | CharacterCounter[] {\n return super.init(els, options, CharacterCounter);\n }\n\n static getInstance(el: InputElement): CharacterCounter {\n return el['Expressive_CharacterCounter'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this.el['Expressive_CharacterCounter'] = undefined;\n this._removeCounter();\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('focus', this.updateCounter, true);\n this.el.addEventListener('input', this.updateCounter, true);\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('focus', this.updateCounter, true);\n this.el.removeEventListener('input', this.updateCounter, true);\n }\n\n _setupCounter() {\n this.counterEl = document.createElement('span');\n this.counterEl.classList.add('character-counter');\n // The count is the whole point of the component and it changes as the\n // user types, so it has to be a live region - otherwise a screen reader\n // user reaches the limit without ever being told one existed. Polite so\n // it waits for a pause instead of interrupting every keystroke, and\n // atomic so \"18/20\" is read as one figure rather than a changed digit.\n this.counterEl.setAttribute('aria-live', 'polite');\n this.counterEl.setAttribute('aria-atomic', 'true');\n this.counterEl.style.float = 'right';\n this.counterEl.style.fontSize = '12px';\n this.counterEl.style.height = '1';\n this.el.parentElement.appendChild(this.counterEl);\n }\n\n _removeCounter() {\n this.counterEl.remove();\n }\n\n updateCounter = () => {\n const maxLength = parseInt(this.el.getAttribute('maxlength')),\n actualLength = this.el.value.length;\n\n this.isValidLength = actualLength <= maxLength;\n let counterString = actualLength.toString();\n if (maxLength) {\n counterString += '/' + maxLength;\n this._validateInput();\n }\n this.counterEl.textContent = counterString;\n };\n\n _validateInput() {\n if (this.isValidLength && this.isInvalid) {\n this.isInvalid = false;\n this.el.classList.remove('invalid');\n } else if (!this.isValidLength && !this.isInvalid) {\n this.isInvalid = true;\n this.el.classList.remove('valid');\n this.el.classList.add('invalid');\n }\n }\n}\n"],
5
+ "mappings": ";;;;;AAEA,IAAM,YAAY,OAAO,OAAO,CAAC,CAAC;AAI3B,IAAM,mBAAN,MAAM,0BAAyB,UAAuB;AAAA,EAS3D,YAAY,IAA4C,SAA+B;AACrF,UAAM,IAAI,CAAC,GAAG,iBAAgB;AAsFhC,yBAAgB,MAAM;AACpB,YAAM,YAAY,SAAS,KAAK,GAAG,aAAa,WAAW,CAAC,GAC1D,eAAe,KAAK,GAAG,MAAM;AAE/B,WAAK,gBAAgB,gBAAgB;AACrC,UAAI,gBAAgB,aAAa,SAAS;AAC1C,UAAI,WAAW;AACb,yBAAiB,MAAM;AACvB,aAAK,eAAe;AAAA,MACtB;AACA,WAAK,UAAU,cAAc;AAAA,IAC/B;AAhGE,SAAK,GAAG,6BAA6B,IAAI;AAEzC,SAAK,UAAU;AAAA,MACb,GAAG,kBAAiB;AAAA,MACpB,GAAG;AAAA,IACL;AAEA,SAAK,YAAY;AACjB,SAAK,gBAAgB;AAErB,SAAK,cAAc;AACnB,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,WAAW,WAAwB;AACjC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,OAAO,KACL,KACA,UAAgC,CAAC,GACM;AACvC,WAAO,MAAM,KAAK,KAAK,SAAS,iBAAgB;AAAA,EAClD;AAAA,EAEA,OAAO,YAAY,IAAoC;AACrD,WAAO,GAAG,6BAA6B;AAAA,EACzC;AAAA,EAEA,UAAU;AACR,SAAK,qBAAqB;AAC1B,SAAK,GAAG,6BAA6B,IAAI;AACzC,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,sBAAsB;AACpB,SAAK,GAAG,iBAAiB,SAAS,KAAK,eAAe,IAAI;AAC1D,SAAK,GAAG,iBAAiB,SAAS,KAAK,eAAe,IAAI;AAAA,EAC5D;AAAA,EAEA,uBAAuB;AACrB,SAAK,GAAG,oBAAoB,SAAS,KAAK,eAAe,IAAI;AAC7D,SAAK,GAAG,oBAAoB,SAAS,KAAK,eAAe,IAAI;AAAA,EAC/D;AAAA,EAEA,gBAAgB;AACd,SAAK,YAAY,SAAS,cAAc,MAAM;AAC9C,SAAK,UAAU,UAAU,IAAI,mBAAmB;AAMhD,SAAK,UAAU,aAAa,aAAa,QAAQ;AACjD,SAAK,UAAU,aAAa,eAAe,MAAM;AACjD,SAAK,UAAU,MAAM,QAAQ;AAC7B,SAAK,UAAU,MAAM,WAAW;AAChC,SAAK,UAAU,MAAM,SAAS;AAC9B,SAAK,GAAG,cAAc,YAAY,KAAK,SAAS;AAAA,EAClD;AAAA,EAEA,iBAAiB;AACf,SAAK,UAAU,OAAO;AAAA,EACxB;AAAA,EAeA,iBAAiB;AACf,QAAI,KAAK,iBAAiB,KAAK,WAAW;AACxC,WAAK,YAAY;AACjB,WAAK,GAAG,UAAU,OAAO,SAAS;AAAA,IACpC,WAAW,CAAC,KAAK,iBAAiB,CAAC,KAAK,WAAW;AACjD,WAAK,YAAY;AACjB,WAAK,GAAG,UAAU,OAAO,OAAO;AAChC,WAAK,GAAG,UAAU,IAAI,SAAS;AAAA,IACjC;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  installSheetDrag
3
- } from "./chunk-QJABDLSD.mjs";
3
+ } from "./chunk-WQYN5L4E.mjs";
4
4
  import {
5
5
  Utils
6
- } from "./chunk-MNPROCZF.mjs";
6
+ } from "./chunk-M372EDXD.mjs";
7
7
 
8
8
  // src/ts/behaviors/bottomSheets.ts
9
9
  var SHEET_SELECTOR = "dialog.bottom-sheet, dialog.bottom";
@@ -52,4 +52,4 @@ var BottomSheets = _BottomSheets;
52
52
  export {
53
53
  BottomSheets
54
54
  };
55
- //# sourceMappingURL=chunk-CUQPB25U.mjs.map
55
+ //# sourceMappingURL=chunk-AIURVCG6.mjs.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Utils
3
- } from "./chunk-MNPROCZF.mjs";
3
+ } from "./chunk-M372EDXD.mjs";
4
4
 
5
5
  // src/ts/components/snackbar.ts
6
6
  var _defaults = {
@@ -126,10 +126,7 @@ var _Snackbar = class _Snackbar {
126
126
  snackbar.wasSwiped = true;
127
127
  snackbar.dismiss();
128
128
  } else {
129
- snackbar.el.style.transition = "transform .2s, opacity .2s";
130
- snackbar.el.style.transform = "";
131
- snackbar.el.style.opacity = "";
132
- snackbar._resumeTimer();
129
+ snackbar._snapBack();
133
130
  }
134
131
  _Snackbar._draggedSnackbar = null;
135
132
  }
@@ -146,12 +143,15 @@ var _Snackbar = class _Snackbar {
146
143
  if (!snackbar) return;
147
144
  snackbar.panning = false;
148
145
  snackbar.el.classList.remove("panning");
149
- snackbar.el.style.transition = "transform .2s, opacity .2s";
150
- snackbar.el.style.transform = "";
151
- snackbar.el.style.opacity = "";
152
- snackbar._resumeTimer();
146
+ snackbar._snapBack();
153
147
  _Snackbar._draggedSnackbar = null;
154
148
  }
149
+ _snapBack() {
150
+ this.el.style.transition = "transform .2s, opacity .2s";
151
+ this.el.style.transform = "";
152
+ this.el.style.opacity = "";
153
+ this._resumeTimer();
154
+ }
155
155
  /**
156
156
  * dismiss all snackbars.
157
157
  */
@@ -321,15 +321,15 @@ var _Snackbar = class _Snackbar {
321
321
  this.counterTimeout = null;
322
322
  this._restoreFocus();
323
323
  if (this._events.signal.aborted) return;
324
- const activationDistance = this.el.offsetWidth * this.options.activationPercent;
324
+ const duration = this.options.outDuration;
325
+ const transitions = [`margin ${duration}ms ease`, `opacity ${duration}ms ease`];
325
326
  if (this.wasSwiped) {
326
- this.el.style.transition = "transform .05s, opacity .05s";
327
- this.el.style.transform = `translateX(${activationDistance}px)`;
327
+ const direction = this.xPos < this.startingXPos ? -1 : 1;
328
+ this.el.style.transform = `translateX(${direction * this.el.offsetWidth}px)`;
328
329
  this.el.style.opacity = "0";
330
+ transitions.push(`transform ${duration}ms ease`);
329
331
  }
330
- this.el.style.transition = `
331
- margin ${this.options.outDuration}ms ease,
332
- opacity ${this.options.outDuration}ms ease`;
332
+ this.el.style.transition = transitions.join(", ");
333
333
  clearTimeout(this._transitionTimer);
334
334
  this._transitionTimer = setTimeout(() => {
335
335
  this.el.style.opacity = "0";
@@ -353,4 +353,4 @@ var Snackbar = _Snackbar;
353
353
  export {
354
354
  Snackbar
355
355
  };
356
- //# sourceMappingURL=chunk-KHV6DZXX.mjs.map
356
+ //# sourceMappingURL=chunk-BGZLF6JZ.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/snackbar.ts"],
4
+ "sourcesContent": ["import { BaseOptions } from '../core/component';\nimport { Utils } from '../core/utils';\n\nexport interface SnackbarOptions extends BaseOptions {\n /**\n * The content of the Snackbar.\n * @default \"\"\n */\n text: string;\n /**\n * Optional action label. Rendered as a trailing text button.\n * @default \"\"\n */\n action: string;\n /**\n * Called when the action button is pressed. The snackbar still dismisses.\n * @default null\n */\n onAction: () => void;\n /**\n * Show a trailing close icon button.\n * Defaults to true when action is set, otherwise false.\n */\n dismissible: boolean;\n /**\n * Element id of a `<template>` (or another element) used as the snackbar body.\n * @default \"\"\n */\n snackbarId?: string;\n /**\n * Length in ms the Snackbar stays before dismissal.\n * `Infinity` keeps it on screen until the user acts.\n * When `action` is set and this is omitted, the default is Infinity.\n * @default 4000\n */\n displayLength: number;\n /**\n * Transition in duration in milliseconds.\n * @default 300\n */\n inDuration: number;\n /**\n * Transition out duration in milliseconds.\n * @default 375\n */\n outDuration: number;\n /**\n * Classes to be added to the snackbar element.\n * @default \"\"\n */\n classes: string;\n /**\n * Callback function called when the snackbar is dismissed.\n * @default null\n */\n completeCallback: () => void;\n /**\n * The percentage of the snackbar's width it takes for a drag\n * to dismiss a Snackbar.\n * @default 0.8\n */\n activationPercent: number;\n /**\n * Any element in the tree the snackbar should render into. A Snackbar has no\n * originating element to infer this from, so pass one when the page lives in\n * a shadow root \u2014 the container is appended to that root instead of to\n * `document.body`, where a root-scoped stylesheet could not reach it.\n * @default null\n */\n root: HTMLElement;\n}\n\nconst _defaults: SnackbarOptions = {\n text: '',\n action: '',\n onAction: null,\n dismissible: false,\n displayLength: 4000,\n inDuration: 300,\n outDuration: 375,\n classes: '',\n completeCallback: null,\n activationPercent: 0.8,\n root: null\n};\n\nexport class Snackbar {\n /** The snackbar element. */\n el: HTMLElement;\n /**\n * The remaining amount of time in ms that the snackbar\n * will stay before dismissal.\n */\n timeRemaining: number;\n /**\n * Describes the current pan state of the Snackbar.\n */\n panning: boolean;\n options: SnackbarOptions;\n message: string;\n counterTimeout: ReturnType<typeof setTimeout>;\n /** Wall-clock time the snackbar is due to dismiss, for pause/resume. */\n private _deadline: number;\n wasSwiped: boolean;\n startingXPos: number;\n xPos: number;\n time: number;\n deltaX: number;\n velocityX: number;\n /** Swipe distance that dismisses, measured once when the drag starts. */\n private _activationDistance: number;\n private _dismissed = false;\n private _returnFocus: HTMLElement | null = null;\n private _events: AbortController;\n private _restoreElement: (() => void) | null = null;\n private _transitionTimer: ReturnType<typeof setTimeout>;\n private _dismissTimer: ReturnType<typeof setTimeout>;\n private _focusTimer: ReturnType<typeof setTimeout>;\n\n static _snackbars: Snackbar[];\n static _container: HTMLElement;\n static _draggedSnackbar: Snackbar;\n /** Which pointer owns the drag in flight; a second finger is ignored. */\n static _dragPointerId: number | null = null;\n\n constructor(options: Partial<SnackbarOptions> = {}) {\n this.options = {\n ...Snackbar.defaults,\n ...options\n };\n if (options.displayLength === undefined && this.options.action) {\n this.options.displayLength = Infinity;\n }\n if (options.dismissible === undefined && this.options.action) this.options.dismissible = true;\n this.message = this.options.text;\n this.panning = false;\n this.timeRemaining = this.options.displayLength;\n // One snackbar at a time so a new update does not stack over the page.\n while (Snackbar._snackbars.length > 0) {\n const snackbar = Snackbar._snackbars.shift();\n snackbar._dismissed = true;\n snackbar._restoreFocus(true);\n }\n let focused = document.activeElement;\n while (focused?.shadowRoot?.activeElement) focused = focused.shadowRoot.activeElement;\n this._returnFocus = focused instanceof HTMLElement ? focused : null;\n this.el = this._createSnackbar();\n // One container serves every snackbar, and only one snackbar shows at a\n // time \u2014 so it is moved rather than duplicated when the root changes.\n const root = Utils.portalRoot(this.options.root ?? document.body);\n if (\n !Snackbar._container ||\n !Snackbar._container.isConnected ||\n Snackbar._container.parentNode !== root\n ) {\n if (Snackbar._container) Snackbar._removeContainer();\n Snackbar._createContainer(root);\n }\n Snackbar._container.appendChild(this.el);\n this.el['Expressive_Snackbar'] = this;\n Snackbar._snackbars.push(this);\n this._animateIn();\n this._setTimer();\n }\n\n static get defaults(): SnackbarOptions {\n return _defaults;\n }\n\n static getInstance(el: HTMLElement): Snackbar {\n return el['Expressive_Snackbar'];\n }\n\n static _createContainer(root: HTMLElement | ShadowRoot = document.body) {\n const container = document.createElement('div');\n container.setAttribute('id', 'snackbar-container');\n // One listener per stage. These used to be a touch trio on the container\n // plus a mouse trio split across the container and the document, with a\n // helper picking `targetTouches[0].clientX` or `clientX` apart afterwards.\n // Move and up stay on the document so a drag that leaves the container\n // still completes.\n container.addEventListener('pointerdown', Snackbar._onDragStart);\n document.addEventListener('pointermove', Snackbar._onDragMove);\n document.addEventListener('pointerup', Snackbar._onDragEnd);\n document.addEventListener('pointercancel', Snackbar._onDragCancel);\n root.appendChild(container);\n Snackbar._container = container;\n }\n\n static _removeContainer() {\n document.removeEventListener('pointermove', Snackbar._onDragMove);\n document.removeEventListener('pointerup', Snackbar._onDragEnd);\n document.removeEventListener('pointercancel', Snackbar._onDragCancel);\n Snackbar._container.remove();\n Snackbar._container = null;\n }\n\n static _onDragStart(e: PointerEvent) {\n if (!e.isPrimary) return;\n if (e.pointerType === 'mouse' && e.button !== 0) return;\n const target = e.target as HTMLElement | null;\n // Don't start a swipe from the action or close \u2014 those are buttons.\n if (target && !target.closest('button, a') && target.closest('.snackbar')) {\n const snackbarElem = target.closest('.snackbar') as HTMLElement;\n const snackbar: Snackbar = snackbarElem['Expressive_Snackbar'];\n if (!snackbar) return;\n snackbar.panning = true;\n snackbar._pauseTimer();\n Snackbar._draggedSnackbar = snackbar;\n snackbar.el.classList.add('panning');\n snackbar.el.style.transition = '';\n Snackbar._dragPointerId = e.pointerId;\n snackbar.startingXPos = e.clientX;\n snackbar.velocityX = 0;\n snackbar.time = Date.now();\n snackbar.xPos = e.clientX;\n // A translateX does not change the width, so one read covers the drag.\n snackbar._activationDistance = snackbar.el.offsetWidth * snackbar.options.activationPercent;\n }\n }\n\n static _onDragMove(e: PointerEvent) {\n if (Snackbar._dragPointerId !== e.pointerId) return;\n if (!!Snackbar._draggedSnackbar) {\n e.preventDefault();\n const snackbar = Snackbar._draggedSnackbar;\n snackbar.deltaX = Math.abs(snackbar.xPos - e.clientX);\n snackbar.xPos = e.clientX;\n snackbar.velocityX = snackbar.deltaX / (Date.now() - snackbar.time);\n snackbar.time = Date.now();\n\n const totalDeltaX = snackbar.xPos - snackbar.startingXPos;\n const activationDistance = snackbar._activationDistance;\n snackbar.el.style.transform = `translateX(${totalDeltaX}px)`;\n snackbar.el.style.opacity = (1 - Math.abs(totalDeltaX / activationDistance)).toString();\n }\n }\n\n static _onDragEnd(e: PointerEvent) {\n if (Snackbar._dragPointerId !== e.pointerId) return;\n Snackbar._dragPointerId = null;\n if (!!Snackbar._draggedSnackbar) {\n const snackbar = Snackbar._draggedSnackbar;\n snackbar.panning = false;\n snackbar.el.classList.remove('panning');\n\n const totalDeltaX = snackbar.xPos - snackbar.startingXPos;\n const activationDistance = snackbar._activationDistance;\n const velocity = Date.now() - snackbar.time < 100 ? snackbar.velocityX : 0;\n const shouldBeDismissed = Math.abs(totalDeltaX) > activationDistance || velocity > 1;\n\n // Remove snackbar\n if (shouldBeDismissed) {\n snackbar.wasSwiped = true;\n snackbar.dismiss();\n // Animate snackbar back to original position\n } else {\n snackbar._snapBack();\n }\n Snackbar._draggedSnackbar = null;\n }\n }\n\n /**\n * A cancelled pointer is not a short swipe. Snap back and resume the timer\n * without consulting the distance travelled - the browser took the gesture\n * over, so the movement so far says nothing about what the user wanted.\n */\n static _onDragCancel(e: PointerEvent) {\n if (Snackbar._dragPointerId !== e.pointerId) return;\n Snackbar._dragPointerId = null;\n const snackbar = Snackbar._draggedSnackbar;\n if (!snackbar) return;\n snackbar.panning = false;\n snackbar.el.classList.remove('panning');\n snackbar._snapBack();\n Snackbar._draggedSnackbar = null;\n }\n\n private _snapBack() {\n this.el.style.transition = 'transform .2s, opacity .2s';\n this.el.style.transform = '';\n this.el.style.opacity = '';\n this._resumeTimer();\n }\n\n /**\n * dismiss all snackbars.\n */\n static dismissAll() {\n // Copy first: dismiss() splices the list it is iterating.\n for (const snackbar of [...Snackbar._snackbars]) {\n snackbar.dismiss();\n }\n }\n\n _createSnackbar() {\n let snackbar: HTMLElement = this.options.snackbarId\n ? Utils.getElementById(this.options.root ?? document.body, this.options.snackbarId)\n : document.createElement('div');\n if (snackbar instanceof HTMLTemplateElement) {\n const node = snackbar.content.cloneNode(true);\n snackbar = (node as HTMLElement).firstElementChild as HTMLElement;\n } else if (snackbar && this.options.snackbarId) {\n const placeholder = document.createComment('');\n snackbar.before(placeholder);\n const children = [...snackbar.childNodes];\n const attributes = ['class', 'style', 'role', 'aria-live', 'aria-atomic', 'inert']\n .map(name => [name, snackbar.getAttribute(name)]);\n this._restoreElement = () => {\n snackbar.replaceChildren(...children);\n for (const [name, value] of attributes) {\n if (value === null) snackbar.removeAttribute(name);\n else snackbar.setAttribute(name, value);\n }\n placeholder.replaceWith(snackbar);\n };\n }\n if (!snackbar) throw new Error('Snackbar body not found');\n this._events = new (snackbar.ownerDocument.defaultView ?? window).AbortController();\n const listenerOptions = { signal: this._events.signal };\n snackbar.classList.add('snackbar');\n snackbar.setAttribute('role', 'status');\n snackbar.setAttribute('aria-live', 'polite');\n snackbar.setAttribute('aria-atomic', 'true');\n snackbar.inert = false;\n snackbar.addEventListener('focusin', (e) => {\n if (e.relatedTarget instanceof HTMLElement && !snackbar.contains(e.relatedTarget)) {\n this._returnFocus = e.relatedTarget;\n }\n this._pauseTimer();\n }, listenerOptions);\n snackbar.addEventListener('keydown', (e) => {\n if (e.key !== 'Escape' || e.defaultPrevented || this._dismissed) return;\n e.preventDefault();\n e.stopPropagation();\n this.dismiss();\n }, listenerOptions);\n snackbar.addEventListener('focusout', () => {\n clearTimeout(this._focusTimer);\n this._focusTimer = setTimeout(() => this._resumeTimer(), 0);\n }, listenerOptions);\n snackbar.addEventListener('pointerenter', () => this._pauseTimer(), listenerOptions);\n snackbar.addEventListener('pointerleave', () => this._resumeTimer(), listenerOptions);\n // Add custom classes onto snackbar\n if (this.options.classes.length > 0) {\n snackbar.classList.add(...this.options.classes.split(' ').filter(Boolean));\n }\n if (this.message) {\n const text = document.createElement('p');\n text.textContent = this.message;\n snackbar.replaceChildren(text);\n }\n if (this.options.action) {\n const action = document.createElement('button');\n action.type = 'button';\n action.textContent = this.options.action;\n action.addEventListener('click', (e) => {\n e.stopPropagation();\n if (this._dismissed) return;\n try {\n if (typeof this.options.onAction === 'function') this.options.onAction();\n } finally {\n this.dismiss();\n }\n }, listenerOptions);\n snackbar.appendChild(action);\n }\n if (this.options.dismissible) {\n const close = document.createElement('button');\n close.type = 'button';\n close.className = 'circle';\n close.setAttribute('aria-label', 'Dismiss');\n const icon = document.createElement('i');\n icon.className = 'material-symbols';\n icon.setAttribute('aria-hidden', 'true');\n icon.textContent = 'close';\n close.appendChild(icon);\n close.addEventListener('click', (e) => {\n e.stopPropagation();\n this.dismiss();\n }, listenerOptions);\n snackbar.appendChild(close);\n }\n return snackbar;\n }\n\n private _remove() {\n if (this._events.signal.aborted) return;\n this._events.abort();\n clearTimeout(this.counterTimeout);\n clearTimeout(this._transitionTimer);\n clearTimeout(this._dismissTimer);\n clearTimeout(this._focusTimer);\n this.counterTimeout = null;\n if (Snackbar._draggedSnackbar === this) {\n Snackbar._draggedSnackbar = null;\n Snackbar._dragPointerId = null;\n }\n this.el['Expressive_Snackbar'] = undefined;\n if (this._restoreElement) this._restoreElement();\n else this.el.remove();\n const index = Snackbar._snackbars.indexOf(this);\n if (index >= 0) Snackbar._snackbars.splice(index, 1);\n if (!Snackbar._snackbars.length && Snackbar._container?.childElementCount === 0) {\n Snackbar._removeContainer();\n }\n }\n\n _animateIn() {\n this.el.style.display = '';\n this.el.style.opacity = '0';\n this.el.style.transform = 'translateY(24px)';\n this.el.style.transition = `\n transform ${this.options.inDuration}ms ease,\n opacity ${this.options.inDuration}ms ease\n `;\n this._transitionTimer = setTimeout(() => {\n this.el.style.transform = '';\n this.el.style.opacity = '1';\n }, 1);\n }\n\n /**\n * Arm the dismissal timer.\n *\n * One timeout, not a 20ms interval ticking a counter down: the old form woke\n * the page up 50 times a second per snackbar purely to subtract 20 from a\n * number. Dragging pauses the countdown via _pauseTimer/_resumeTimer instead.\n */\n _setTimer() {\n if (this.timeRemaining === Infinity) return;\n this._deadline = Date.now() + this.timeRemaining;\n this.counterTimeout = setTimeout(() => this.dismiss(), this.timeRemaining);\n }\n\n /** Stop the countdown, banking the time that was left on it. */\n _pauseTimer() {\n if (this.counterTimeout == null) return;\n clearTimeout(this.counterTimeout);\n this.counterTimeout = null;\n this.timeRemaining = Math.max(0, this._deadline - Date.now());\n }\n\n /** Restart a countdown stopped by {@link _pauseTimer}. */\n _resumeTimer() {\n if (this._dismissed || this.panning || this.el.matches(':hover, :focus-within') || this.counterTimeout != null) return;\n this._setTimer();\n }\n\n private _restoreFocus(remove = false) {\n const focused = (this.el.getRootNode() as Document | ShadowRoot).activeElement;\n const returnFocus = focused && this.el.contains(focused) ? this._returnFocus : null;\n this.el.inert = true;\n if (remove) this._remove();\n if (returnFocus?.isConnected) returnFocus.focus({ preventScroll: true });\n }\n\n /**\n * Dismiss snackbar with animation.\n */\n dismiss() {\n if (this._dismissed) return;\n this._dismissed = true;\n clearTimeout(this.counterTimeout);\n this.counterTimeout = null;\n this._restoreFocus();\n if (this._events.signal.aborted) return;\n const duration = this.options.outDuration;\n const transitions = [`margin ${duration}ms ease`, `opacity ${duration}ms ease`];\n\n if (this.wasSwiped) {\n // Carry on off the side the user swiped toward, from where they let go.\n const direction = this.xPos < this.startingXPos ? -1 : 1;\n this.el.style.transform = `translateX(${direction * this.el.offsetWidth}px)`;\n this.el.style.opacity = '0';\n transitions.push(`transform ${duration}ms ease`);\n }\n\n this.el.style.transition = transitions.join(', ');\n\n clearTimeout(this._transitionTimer);\n this._transitionTimer = setTimeout(() => {\n this.el.style.opacity = '0';\n this.el.style.marginTop = '-40px';\n }, 1);\n\n this._dismissTimer = setTimeout(() => {\n this._remove();\n // Call the optional callback\n if (typeof this.options.completeCallback === 'function') {\n this.options.completeCallback();\n }\n }, this.options.outDuration);\n }\n\n static {\n Snackbar._snackbars = [];\n Snackbar._container = null;\n Snackbar._draggedSnackbar = null;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Component
3
- } from "./chunk-LTWPGFBR.mjs";
3
+ } from "./chunk-PD6HYHAE.mjs";
4
4
 
5
5
  // src/ts/components/particles.ts
6
6
  var _defaults = {
@@ -151,4 +151,4 @@ var Particles = class _Particles extends Component {
151
151
  export {
152
152
  Particles
153
153
  };
154
- //# sourceMappingURL=chunk-BG6ZRB5H.mjs.map
154
+ //# sourceMappingURL=chunk-C6CHEWYP.mjs.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ColumnChart
3
- } from "./chunk-SPETGK25.mjs";
3
+ } from "./chunk-45FER6RI.mjs";
4
4
 
5
5
  // src/ts/components/barChart.ts
6
6
  var BarChart = class extends ColumnChart {
@@ -44,4 +44,4 @@ var BarChart = class extends ColumnChart {
44
44
  export {
45
45
  BarChart
46
46
  };
47
- //# sourceMappingURL=chunk-GVGT6MIU.mjs.map
47
+ //# sourceMappingURL=chunk-CK2XCICY.mjs.map
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  Autocomplete
3
- } from "./chunk-4HZMB7LI.mjs";
3
+ } from "./chunk-ZX6M7SWO.mjs";
4
4
  import {
5
5
  Utils
6
- } from "./chunk-MNPROCZF.mjs";
6
+ } from "./chunk-M372EDXD.mjs";
7
7
  import {
8
8
  Component
9
- } from "./chunk-LTWPGFBR.mjs";
9
+ } from "./chunk-PD6HYHAE.mjs";
10
10
 
11
11
  // src/ts/components/chips.ts
12
12
  var _defaults = {
@@ -54,7 +54,7 @@ var _Chips = class _Chips extends Component {
54
54
  return;
55
55
  }
56
56
  e.preventDefault();
57
- if (!this.hasAutocomplete || this.hasAutocomplete && !this.options.autocompleteOnly) {
57
+ if (!this.hasAutocomplete || !this.options.autocompleteOnly) {
58
58
  this.addChip({ id: this._input.value });
59
59
  }
60
60
  this._input.value = "";
@@ -147,9 +147,8 @@ var _Chips = class _Chips extends Component {
147
147
  static _handleChipsKeydown(e) {
148
148
  _Chips._keydown = true;
149
149
  const chips = e.target.closest(".chips");
150
- const chipsKeydown = e.target && chips;
151
150
  const tag = e.target.tagName;
152
- if (tag === "INPUT" || tag === "TEXTAREA" || !chipsKeydown) return;
151
+ if (tag === "INPUT" || tag === "TEXTAREA" || !chips) return;
153
152
  const currChips = chips["Expressive_Chips"];
154
153
  if (!currChips) return;
155
154
  if (e.key === Utils.keys.BACKSPACE || e.key === Utils.keys.DELETE) {
@@ -249,9 +248,9 @@ var _Chips = class _Chips extends Component {
249
248
  }
250
249
  _setPlaceholder() {
251
250
  if (!this._input) return;
252
- if (this.chipsData !== void 0 && !this.chipsData.length && this.options.placeholder) {
251
+ if (!this.chipsData.length && this.options.placeholder) {
253
252
  this._input.placeholder = this.options.placeholder;
254
- } else if ((this.chipsData === void 0 || !!this.chipsData.length) && this.options.secondaryPlaceholder) {
253
+ } else if (this.chipsData.length && this.options.secondaryPlaceholder) {
255
254
  this._input.placeholder = this.options.secondaryPlaceholder;
256
255
  }
257
256
  }
@@ -342,4 +341,4 @@ var Chips = _Chips;
342
341
  export {
343
342
  Chips
344
343
  };
345
- //# sourceMappingURL=chunk-KY6U46SM.mjs.map
344
+ //# sourceMappingURL=chunk-CXXM2L4F.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/chips.ts"],
4
+ "sourcesContent": ["import { Utils } from '../core/utils';\nimport { Autocomplete, AutocompleteOptions } from './autocomplete';\nimport { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nexport interface ChipData {\n /**\n * Unique identifier.\n */\n id: number | string;\n /**\n * Chip text. If not specified, \"id\" will be used.\n */\n text?: string;\n /**\n * Chip image (URL).\n */\n image?: string;\n}\n\nexport interface ChipsI18nOptions {\n /** Prefix for the delete button's accessible name. */\n remove: string;\n}\n\nexport interface ChipsOptions extends BaseOptions {\n /**\n * Set the chip data.\n * @default []\n */\n data: ChipData[];\n /**\n * Set first placeholder when there are no tags.\n * @default \"\"\n */\n placeholder: string;\n /**\n * Set second placeholder when adding additional tags.\n * @default \"\"\n */\n secondaryPlaceholder: string;\n /**\n * Set autocomplete options.\n * @default {}\n */\n autocompleteOptions: Partial<AutocompleteOptions>;\n /**\n * Toggles abililty to add custom value not in autocomplete list.\n * @default false\n */\n autocompleteOnly: boolean;\n /**\n * Set chips limit.\n * @default Infinity\n */\n limit: number;\n /**\n * Specifies class to be used in \"close\" button.\n * @default 'material-symbols'\n */\n closeIconClass: string;\n /**\n * Specifies option to render user input field\n * @default false;\n */\n allowUserInput: boolean;\n /**\n * Strings the component generates. `remove` prefixes the delete button's\n * accessible name, giving \"Remove Apple\".\n * @default { remove: 'Remove' }\n */\n i18n: Partial<ChipsI18nOptions>;\n /**\n * Callback for chip add.\n * @default null\n */\n onChipAdd: (element: HTMLElement, chip: HTMLElement) => void;\n /**\n * Callback for chip select.\n * @default null\n */\n onChipSelect: (element: HTMLElement, chip: HTMLElement) => void;\n /**\n * Callback for chip delete.\n * @default null\n */\n onChipDelete: (element: HTMLElement, chip: HTMLElement) => void;\n}\n\nconst _defaults: ChipsOptions = {\n data: [],\n placeholder: '',\n secondaryPlaceholder: '',\n closeIconClass: 'material-symbols',\n autocompleteOptions: {},\n autocompleteOnly: false,\n limit: Infinity,\n allowUserInput: false,\n i18n: { remove: 'Remove' },\n onChipAdd: null,\n onChipSelect: null,\n onChipDelete: null\n};\n\nexport class Chips extends Component<ChipsOptions> {\n /** Array of the current chips data. */\n chipsData: ChipData[];\n /** If the chips has autocomplete enabled. */\n hasAutocomplete: boolean;\n /** Autocomplete instance, if any. */\n autocomplete: Autocomplete;\n _input: HTMLInputElement;\n _label: HTMLLabelElement;\n _chips: HTMLElement[];\n static _keydown: boolean;\n private _selectedChip: HTMLElement;\n\n /**\n * Selection is drawn by a class now, not by `:focus`, so it does not clear\n * itself when focus moves - every path that changes the selection has to go\n * through here or the class and the field drift apart.\n *\n * Deliberately no `aria-selected`: the chip is not an option in a listbox,\n * and putting the attribute on an element with no such role is the same\n * defect the semantics standard exists to remove.\n */\n private _setSelected(chip: HTMLElement | null) {\n this._selectedChip?.classList.remove('selected');\n this._selectedChip = chip;\n chip?.classList.add('selected');\n }\n\n constructor(el: HTMLElement, options: Partial<ChipsOptions>) {\n super(el, options, Chips);\n this.el['Expressive_Chips'] = this;\n\n this.options = {\n ...Chips.defaults,\n ...options\n };\n // Spreading options over the defaults replaces the i18n object wholesale,\n // so passing one string would drop the rest. Same fix as Datepicker.\n if (options?.i18n) this.options.i18n = { ...Chips.defaults.i18n, ...options.i18n };\n\n this.el.classList.add('chips');\n this.chipsData = [];\n this._chips = [];\n\n // Render initial chips\n if (this.options.data.length) {\n this.chipsData = this.options.data;\n this._renderChips();\n }\n\n // Render input element, setup event handlers\n if (this.options.allowUserInput) {\n this.el.classList.add('field');\n this._setupInput();\n this._setupEventHandlers();\n // move input to end\n this.el.append(this._input);\n }\n // After _setupInput: the label points at the input's id, which is only\n // assigned there. Running this first threw on any .chips with a <label>.\n this._setupLabel();\n }\n\n static get defaults() {\n return _defaults;\n }\n\n /**\n * Initializes instance of Chips.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<ChipsOptions>): Chips;\n /**\n * Initializes instances of Chips.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<InitElement>, options?: Partial<ChipsOptions>): Chips[];\n /**\n * Initializes instances of Chips.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<ChipsOptions> = {}\n ): Chips | Chips[] {\n return super.init(els, options, Chips);\n }\n\n static getInstance(el: HTMLElement): Chips {\n return el['Expressive_Chips'];\n }\n\n getData() {\n return this.chipsData;\n }\n\n destroy() {\n if (this.autocomplete && Autocomplete.getInstance(this._input) === this.autocomplete) {\n this.autocomplete.destroy();\n }\n if (this.options.allowUserInput) {\n this._removeEventHandlers();\n }\n this._chips.forEach((c) => c.remove());\n this._chips = [];\n this.el['Expressive_Chips'] = undefined;\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('click', this._handleChipClick);\n this.el.addEventListener('keydown', Chips._handleChipsKeydown);\n this.el.addEventListener('keyup', Chips._handleChipsKeyup);\n this.el.addEventListener('blur', Chips._handleChipsBlur, true);\n this._input.addEventListener('focus', this._handleInputFocus);\n this._input.addEventListener('blur', this._handleInputBlur);\n this._input.addEventListener('keydown', this._handleInputKeydown);\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('click', this._handleChipClick);\n this.el.removeEventListener('keydown', Chips._handleChipsKeydown);\n this.el.removeEventListener('keyup', Chips._handleChipsKeyup);\n this.el.removeEventListener('blur', Chips._handleChipsBlur, true);\n this._input.removeEventListener('focus', this._handleInputFocus);\n this._input.removeEventListener('blur', this._handleInputBlur);\n this._input.removeEventListener('keydown', this._handleInputKeydown);\n }\n\n _handleChipClick = (e: MouseEvent) => {\n const _chip = (<HTMLElement>e.target).closest('.chip');\n // closest, not classList: the close button now wraps an icon span, so a\n // click on the glyph reports the span as the target.\n const clickedClose = !!(<HTMLElement>e.target).closest('.close');\n if (_chip) {\n // Index into the chip list, not into the container's children: the\n // container also holds the label and the input, so counting children\n // gave an index that did not line up with chipsData.\n const index = this._chips.indexOf(_chip as HTMLElement);\n if (index < 0) return;\n if (clickedClose) {\n this._deleteChip(index, 'input');\n } else {\n this.selectChip(index);\n }\n // Default handle click to focus on input\n } else {\n this._input.focus();\n }\n };\n\n static _handleChipsKeydown(e: KeyboardEvent) {\n Chips._keydown = true;\n const chips = (<HTMLElement>e.target).closest('.chips');\n\n // Don't handle keydown inputs on input and textarea\n const tag = (<HTMLElement>e.target).tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || !chips) return;\n\n const currChips: Chips = chips['Expressive_Chips'];\n if (!currChips) return; // .chips markup without an instance behind it\n\n if (e.key === Utils.keys.BACKSPACE || e.key === Utils.keys.DELETE) {\n const index = currChips._chips.indexOf((e.target as HTMLElement).closest('.chip'));\n if (index < 0) return;\n e.preventDefault();\n currChips._deleteChip(index, 'previous');\n } else if (e.key === Utils.keys.ARROW_LEFT) {\n if (currChips._selectedChip) {\n const selectIndex = currChips._chips.indexOf(currChips._selectedChip) - 1;\n if (selectIndex < 0) return;\n currChips.selectChip(selectIndex);\n }\n } else if (e.key === Utils.keys.ARROW_RIGHT) {\n if (currChips._selectedChip) {\n const selectIndex = currChips._chips.indexOf(currChips._selectedChip) + 1;\n if (selectIndex >= currChips.chipsData.length) {\n // Walking off the end returns to the input, so nothing is selected\n // any more - without this the last chip kept the class.\n currChips._setSelected(null);\n currChips._input.focus();\n }\n else currChips.selectChip(selectIndex);\n }\n }\n }\n\n static _handleChipsKeyup() {\n Chips._keydown = false;\n }\n\n static _handleChipsBlur(e: Event) {\n if (!Chips._keydown && document.hidden) {\n const chips = (<HTMLElement>e.target).closest('.chips');\n const currChips: Chips = chips?.['Expressive_Chips'];\n if (currChips) currChips._setSelected(null);\n }\n }\n\n _handleInputFocus = () => {\n this.el.classList.add('focus');\n };\n\n _handleInputBlur = () => {\n this.el.classList.remove('focus');\n };\n\n _handleInputKeydown = (e: KeyboardEvent) => {\n Chips._keydown = true;\n if (e.key === Utils.keys.ENTER) {\n // Override enter if autocompleting.\n if (this.hasAutocomplete && this.autocomplete?.isOpen &&\n this.autocomplete.container.querySelector('[role=\"option\"]')) {\n return;\n }\n e.preventDefault();\n if (!this.hasAutocomplete || !this.options.autocompleteOnly) {\n this.addChip({ id: this._input.value });\n }\n this._input.value = '';\n } else if (\n (e.key === Utils.keys.BACKSPACE || e.key === Utils.keys.ARROW_LEFT) &&\n this._input.value === '' &&\n this.chipsData.length\n ) {\n e.preventDefault();\n this.selectChip(this.chipsData.length - 1);\n }\n };\n\n _renderChip(chip: ChipData): HTMLElement {\n if (!chip.id && chip.id !== 0) return;\n const label = chip.text || <string>chip.id;\n // <span>, not <div>: a chip is inline, and the container itself is not a\n // control. It used to be a <div tabindex=\"0\"> with no role - focusable,\n // and announcing nothing.\n const renderedChip = document.createElement('span');\n renderedChip.classList.add('chip');\n renderedChip.innerText = label;\n // attach image if needed\n if (chip.image) {\n const img = document.createElement('img');\n img.setAttribute('src', chip.image);\n renderedChip.insertBefore(img, renderedChip.firstChild);\n }\n if (this.options.allowUserInput) {\n // The delete affordance is the control, so it is the <button> and it\n // carries the name. `type` is explicit because a bare button inside a\n // form submits it.\n const closeButton = document.createElement('button');\n closeButton.type = 'button';\n closeButton.classList.add('close');\n closeButton.setAttribute('aria-label', `${this.options.i18n.remove} ${label}`);\n // The ligature is text and is read out, so the glyph is hidden and the\n // button's own label is what gets announced.\n const closeIcon = document.createElement('span');\n closeIcon.classList.add(this.options.closeIconClass);\n closeIcon.setAttribute('aria-hidden', 'true');\n closeIcon.innerText = 'close';\n closeButton.appendChild(closeIcon);\n renderedChip.appendChild(closeButton);\n }\n return renderedChip;\n }\n\n _renderChips() {\n this._chips = []; //.remove();\n for (let i = 0; i < this.chipsData.length; i++) {\n const chipElem = this._renderChip(this.chipsData[i]);\n this.el.appendChild(chipElem);\n this._chips.push(chipElem);\n }\n }\n\n _setupAutocomplete() {\n this.options.autocompleteOptions.onAutocomplete = (items) => {\n if (Chips.getInstance(this.el) !== this) return;\n if (items.length > 0) {\n this.addChip({\n id: items[0].id,\n text: items[0].text,\n image: items[0].image\n });\n this._input.value = '';\n this._input.focus();\n }\n };\n this.autocomplete = Autocomplete.init(this._input, this.options.autocompleteOptions);\n }\n\n _setupInput() {\n this._input = this.el.querySelector('input');\n if (!this._input) {\n this._input = document.createElement('input');\n this.el.append(this._input);\n }\n this._input.classList.add('input');\n this.hasAutocomplete = Object.keys(this.options.autocompleteOptions).length > 0;\n // Setup autocomplete if needed\n if (this.hasAutocomplete) this._setupAutocomplete();\n this._setPlaceholder();\n // Set input id\n if (!this._input.getAttribute('id')) this._input.setAttribute('id', Utils.guid());\n }\n\n _setupLabel() {\n this._label = this.el.querySelector('label');\n // No input to point at when allowUserInput is off.\n if (this._label && this._input) this._label.setAttribute('for', this._input.getAttribute('id'));\n }\n\n _setPlaceholder() {\n if (!this._input) return;\n if (!this.chipsData.length && this.options.placeholder) {\n this._input.placeholder = this.options.placeholder;\n } else if (this.chipsData.length && this.options.secondaryPlaceholder) {\n this._input.placeholder = this.options.secondaryPlaceholder;\n }\n }\n\n _isValidAndNotExist(chip: ChipData) {\n const isValid = !!chip.id || chip.id === 0;\n const doesNotExist = !this.chipsData.some((item) => item.id == chip.id);\n return isValid && doesNotExist;\n }\n\n /**\n * Add chip to input.\n * @param chip Chip data object\n */\n addChip(chip: ChipData) {\n if (!this._isValidAndNotExist(chip) || this.chipsData.length >= this.options.limit) return;\n const renderedChip = this._renderChip(chip);\n this._chips.push(renderedChip);\n this.chipsData.push(chip);\n if (this._input) this._input.before(renderedChip);\n else this.el.append(renderedChip);\n this._setPlaceholder();\n // fire chipAdd callback\n if (typeof this.options.onChipAdd === 'function') {\n this.options.onChipAdd(this.el, renderedChip);\n }\n }\n\n /**\n * Delete nth chip.\n * @param chipIndex Index of chip\n */\n deleteChip(chipIndex: number) {\n const root = this.el.getRootNode() as Document | ShadowRoot;\n this._deleteChip(chipIndex, this._chips[chipIndex]?.contains(root.activeElement) ? 'input' : null);\n }\n\n private _deleteChip(chipIndex: number, focus: 'input' | 'previous' | null) {\n const chip = this._chips[chipIndex];\n if (!chip) return;\n if (this._selectedChip === chip) this._setSelected(null);\n chip.remove();\n this._chips.splice(chipIndex, 1);\n this.chipsData.splice(chipIndex, 1);\n this._setPlaceholder();\n const focusPath: { root: Document | ShadowRoot; element: Element | null }[] = [];\n let root = this.el.getRootNode() as Document | ShadowRoot;\n while (root) {\n focusPath.push({ root, element: root.activeElement });\n root = 'host' in root ? root.host.getRootNode() as Document | ShadowRoot : null;\n }\n // fire chipDelete callback\n if (typeof this.options.onChipDelete === 'function') {\n this.options.onChipDelete(this.el, chip);\n }\n if (!focus || focusPath.some(({ root, element }) => root.activeElement !== element) || this.el['Expressive_Chips'] !== this) return;\n if (focus === 'previous' && this._chips.length) this.selectChip(Math.max(chipIndex - 1, 0));\n else {\n this._setSelected(null);\n this._input?.focus();\n }\n }\n\n /**\n * Select nth chip.\n * @param chipIndex Index of chip\n */\n selectChip(chipIndex: number) {\n const chip = this._chips[chipIndex];\n if (!chip) return;\n this._setSelected(chip);\n // The chip is not a control any more, so focus goes to the one thing in it\n // that is - the delete button.\n (chip.querySelector('.close') as HTMLElement | null)?.focus();\n // fire chipSelect callback\n if (typeof this.options.onChipSelect === 'function') {\n this.options.onChipSelect(this.el, chip);\n }\n }\n\n static Init() {\n // Handle removal of static chips - markup written by hand, with no Chips\n // instance behind it. Where there *is* an instance, _handleChipClick owns\n // the close button: removing the node here as well left chipsData holding\n // an entry whose element was gone.\n Utils.onDocumentReady(() => {\n const chips = document.querySelectorAll('.chips');\n chips.forEach((el) => {\n el.addEventListener('click', (e) => {\n if (el['Expressive_Chips']) return;\n // closest: the close button wraps an icon span, so a click on the\n // glyph reports the span.\n if ((<HTMLElement>e.target).closest('.close')) {\n const chip = (<HTMLElement>e.target).closest('.chip');\n if (chip) chip.remove();\n }\n });\n });\n });\n }\n\n static {\n Chips._keydown = false;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["root"]
7
+ }
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  Utils
3
- } from "./chunk-MNPROCZF.mjs";
3
+ } from "./chunk-M372EDXD.mjs";
4
4
  import {
5
5
  Component
6
- } from "./chunk-LTWPGFBR.mjs";
6
+ } from "./chunk-PD6HYHAE.mjs";
7
7
 
8
8
  // src/ts/components/expandingCard.ts
9
9
  var _defaults = {
@@ -42,11 +42,7 @@ var ExpandingCard = class _ExpandingCard extends Component {
42
42
  };
43
43
  this._handleNativeClose = () => {
44
44
  if (this.dialog.open) return;
45
- this.closeGeneration++;
46
- this.isOpen = false;
47
- this.trigger.ariaExpanded = "false";
48
- this.dialog.ariaExpanded = "false";
49
- this.dialog.classList.remove("expanded");
45
+ this._collapse();
50
46
  };
51
47
  this._setTransitionOrigin = () => {
52
48
  if (!this.dialog) return;
@@ -55,26 +51,15 @@ var ExpandingCard = class _ExpandingCard extends Component {
55
51
  ":scope > figure, :scope > img"
56
52
  );
57
53
  const mediaRect = media?.getBoundingClientRect();
58
- this.dialog.style.setProperty(
59
- "--md-comp-expanding-card-from-top",
60
- `${Math.max(0, card.top)}px`
61
- );
62
- this.dialog.style.setProperty(
63
- "--md-comp-expanding-card-from-right",
64
- `${Math.max(0, window.innerWidth - card.right)}px`
65
- );
66
- this.dialog.style.setProperty(
67
- "--md-comp-expanding-card-from-bottom",
68
- `${Math.max(0, window.innerHeight - card.bottom)}px`
69
- );
70
- this.dialog.style.setProperty(
71
- "--md-comp-expanding-card-from-left",
72
- `${Math.max(0, card.left)}px`
73
- );
74
- this.dialog.style.setProperty(
75
- "--md-comp-expanding-card-from-media-height",
76
- `${Math.max(0, mediaRect?.height ?? 0)}px`
54
+ const set = (side, px) => this.dialog.style.setProperty(
55
+ `--md-comp-expanding-card-from-${side}`,
56
+ `${Math.max(0, px)}px`
77
57
  );
58
+ set("top", card.top);
59
+ set("right", window.innerWidth - card.right);
60
+ set("bottom", window.innerHeight - card.bottom);
61
+ set("left", card.left);
62
+ set("media-height", mediaRect?.height ?? 0);
78
63
  };
79
64
  this.open = () => {
80
65
  if (this.isOpen || !this.dialog || !this.trigger) return;
@@ -93,12 +78,9 @@ var ExpandingCard = class _ExpandingCard extends Component {
93
78
  };
94
79
  this.close = () => {
95
80
  if (!this.isOpen || !this.dialog || !this.trigger) return;
96
- const generation = ++this.closeGeneration;
97
81
  this._setTransitionOrigin();
98
- this.isOpen = false;
99
- this.trigger.ariaExpanded = "false";
100
- this.dialog.ariaExpanded = "false";
101
- this.dialog.classList.remove("expanded");
82
+ this._collapse();
83
+ const generation = this.closeGeneration;
102
84
  if (typeof this.options.onClose === "function") {
103
85
  this.options.onClose.call(this, this.el);
104
86
  }
@@ -149,18 +131,24 @@ var ExpandingCard = class _ExpandingCard extends Component {
149
131
  }
150
132
  destroy() {
151
133
  this._removeEventHandlers();
134
+ this._collapse();
135
+ if (this.dialog?.open) this.dialog.close();
136
+ this.el["Expressive_ExpandingCard"] = void 0;
137
+ }
138
+ /** Marks the card closed and invalidates any pending close. */
139
+ _collapse() {
152
140
  this.closeGeneration++;
153
141
  this.isOpen = false;
154
142
  if (this.trigger) this.trigger.ariaExpanded = "false";
155
- if (this.dialog) this.dialog.ariaExpanded = "false";
156
- this.dialog?.classList.remove("expanded");
157
- if (this.dialog?.open) this.dialog.close();
158
- this.el["Expressive_ExpandingCard"] = void 0;
143
+ if (this.dialog) {
144
+ this.dialog.ariaExpanded = "false";
145
+ this.dialog.classList.remove("expanded");
146
+ }
159
147
  }
160
148
  static Init() {
161
149
  Utils.onDocumentReady(() => {
162
150
  document.querySelectorAll(EXPANDING_CARD_SELECTOR).forEach((el) => {
163
- if (el && el["Expressive_ExpandingCard"] == void 0) {
151
+ if (el["Expressive_ExpandingCard"] == void 0) {
164
152
  this.init(el);
165
153
  }
166
154
  });
@@ -172,4 +160,4 @@ export {
172
160
  EXPANDING_CARD_SELECTOR,
173
161
  ExpandingCard
174
162
  };
175
- //# sourceMappingURL=chunk-Z2NRKI7R.mjs.map
163
+ //# sourceMappingURL=chunk-DXGRXYYL.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/expandingCard.ts"],
4
+ "sourcesContent": ["import { Utils } from \"../core/utils\";\nimport {\n Component,\n BaseOptions,\n InitElements,\n InitElement,\n Openable,\n} 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\n extends Component<ExpandingCardOptions>\n implements Openable\n{\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\n constructor(el: HTMLElement, options: Partial<ExpandingCardOptions>) {\n super(el, options, ExpandingCard);\n this.el[\"Expressive_ExpandingCard\"] = this;\n\n this.options = {\n ...ExpandingCard.defaults,\n ...options,\n };\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 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.dialog.ariaExpanded = \"false\";\n this._setupEventHandlers();\n }\n }\n\n static get defaults(): ExpandingCardOptions {\n return _defaults;\n }\n\n static init(\n el: HTMLElement,\n options?: Partial<ExpandingCardOptions>,\n ): ExpandingCard;\n static init(\n els: InitElements<InitElement>,\n options?: Partial<ExpandingCardOptions>,\n ): ExpandingCard[];\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options?: Partial<ExpandingCardOptions>,\n ): ExpandingCard | ExpandingCard[] {\n return super.init(els, options, ExpandingCard);\n }\n\n static getInstance(el: HTMLElement): ExpandingCard {\n return el[\"Expressive_ExpandingCard\"];\n }\n\n destroy() {\n this._removeEventHandlers();\n this._collapse();\n if (this.dialog?.open) this.dialog.close();\n this.el[\"Expressive_ExpandingCard\"] = undefined;\n }\n\n private _setupEventHandlers = () => {\n this.trigger?.addEventListener(\"click\", this.open);\n this.trigger?.addEventListener(\"keypress\", this._handleTriggerKeypress);\n this.closeButton?.addEventListener(\"click\", this.close);\n this.dialog?.addEventListener(\"cancel\", this._handleCancel);\n this.dialog?.addEventListener(\"close\", this._handleNativeClose);\n };\n\n private _removeEventHandlers = () => {\n this.trigger?.removeEventListener(\"click\", this.open);\n this.trigger?.removeEventListener(\"keypress\", this._handleTriggerKeypress);\n this.closeButton?.removeEventListener(\"click\", this.close);\n this.dialog?.removeEventListener(\"cancel\", this._handleCancel);\n this.dialog?.removeEventListener(\"close\", this._handleNativeClose);\n };\n\n private _handleTriggerKeypress = (event: KeyboardEvent) => {\n if (event.key === Utils.keys.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 this._collapse();\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 if (this.dialog) {\n this.dialog.ariaExpanded = \"false\";\n this.dialog.classList.remove(\"expanded\");\n }\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.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 if (typeof this.options.onOpen === \"function\") {\n this.options.onOpen.call(this, this.el);\n }\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 if (typeof this.options.onClose === \"function\") {\n this.options.onClose.call(this, this.el);\n }\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
+ }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Component
3
- } from "./chunk-LTWPGFBR.mjs";
3
+ } from "./chunk-PD6HYHAE.mjs";
4
4
 
5
5
  // src/ts/components/scrollspy.ts
6
6
  var _defaultGetActiveElement = (id) => `a[href="#${id}"]`;
@@ -119,11 +119,7 @@ var _ScrollSpy = class _ScrollSpy extends Component {
119
119
  }
120
120
  }
121
121
  const href = `#${id}`;
122
- const links = document.querySelectorAll('a[href^="#"]');
123
- for (let i = 0; i < links.length; i++) {
124
- if (links[i].getAttribute("href") === href) return links[i];
125
- }
126
- return null;
122
+ return Array.from(document.querySelectorAll('a[href^="#"]')).find((link) => link.getAttribute("href") === href) ?? null;
127
123
  }
128
124
  };
129
125
  _ScrollSpy._elements = [];
@@ -133,4 +129,4 @@ var ScrollSpy = _ScrollSpy;
133
129
  export {
134
130
  ScrollSpy
135
131
  };
136
- //# sourceMappingURL=chunk-MZ6Z24BX.mjs.map
132
+ //# sourceMappingURL=chunk-FM5CZOUB.mjs.map