@expressivecss/expressive 0.13.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 (257) hide show
  1. package/CHANGELOG.md +196 -1
  2. package/README.md +2 -1
  3. package/dist/css/expressive.css +432 -311
  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-DTKR54I6.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-WJXDBPXQ.mjs → chunk-5CEAOLUA.mjs} +17 -20
  11. package/dist/js/chunks/chunk-5CEAOLUA.mjs.map +7 -0
  12. package/dist/js/chunks/{chunk-CKQP6P76.mjs → chunk-6VATUZC6.mjs} +12 -7
  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-DLWYKFEI.mjs → chunk-AIURVCG6.mjs} +3 -3
  17. package/dist/js/chunks/{chunk-NNYP33NB.mjs → chunk-BGZLF6JZ.mjs} +19 -18
  18. package/dist/js/chunks/chunk-BGZLF6JZ.mjs.map +7 -0
  19. package/dist/js/chunks/chunk-C6CHEWYP.mjs +154 -0
  20. package/dist/js/chunks/chunk-C6CHEWYP.mjs.map +7 -0
  21. package/dist/js/chunks/{chunk-GVGT6MIU.mjs → chunk-CK2XCICY.mjs} +2 -2
  22. package/dist/js/chunks/{chunk-XGHORT7J.mjs → chunk-CXXM2L4F.mjs} +8 -9
  23. package/dist/js/chunks/chunk-CXXM2L4F.mjs.map +7 -0
  24. package/dist/js/chunks/{chunk-QVVEWBOF.mjs → chunk-DXGRXYYL.mjs} +25 -37
  25. package/dist/js/chunks/chunk-DXGRXYYL.mjs.map +7 -0
  26. package/dist/js/chunks/{chunk-QV2JAWIZ.mjs → chunk-FM5CZOUB.mjs} +5 -8
  27. package/dist/js/chunks/{chunk-QV2JAWIZ.mjs.map → chunk-FM5CZOUB.mjs.map} +2 -2
  28. package/dist/js/chunks/{chunk-PLYXLSH3.mjs → chunk-GJL6GCIU.mjs} +46 -58
  29. package/dist/js/chunks/chunk-GJL6GCIU.mjs.map +7 -0
  30. package/dist/js/chunks/chunk-K3HZMFMD.mjs +135 -0
  31. package/dist/js/chunks/chunk-K3HZMFMD.mjs.map +7 -0
  32. package/dist/js/chunks/chunk-KHXZ2A4K.mjs +395 -0
  33. package/dist/js/chunks/chunk-KHXZ2A4K.mjs.map +7 -0
  34. package/dist/js/chunks/chunk-KQACNQ22.mjs +7 -0
  35. package/dist/js/chunks/{chunk-4PWAPV6F.mjs.map → chunk-KQACNQ22.mjs.map} +1 -1
  36. package/dist/js/chunks/chunk-KUFHW3DS.mjs +214 -0
  37. package/dist/js/chunks/chunk-KUFHW3DS.mjs.map +7 -0
  38. package/dist/js/chunks/{chunk-LWBQIX5J.mjs → chunk-KVJAVDBC.mjs} +46 -57
  39. package/dist/js/chunks/chunk-KVJAVDBC.mjs.map +7 -0
  40. package/dist/js/chunks/{chunk-YDCS5S3J.mjs → chunk-L27Q6ZMI.mjs} +2 -2
  41. package/dist/js/chunks/{chunk-CCWDV5CR.mjs → chunk-LQWUDNHZ.mjs} +3 -3
  42. package/dist/js/chunks/{chunk-6OMRGML6.mjs → chunk-M372EDXD.mjs} +7 -13
  43. package/dist/js/chunks/{chunk-6OMRGML6.mjs.map → chunk-M372EDXD.mjs.map} +2 -2
  44. package/dist/js/chunks/{chunk-EC63CHXU.mjs → chunk-M3MURWMB.mjs} +20 -16
  45. package/dist/js/chunks/chunk-M3MURWMB.mjs.map +7 -0
  46. package/dist/js/chunks/{chunk-U2OTHOTI.mjs → chunk-NUHMOAOY.mjs} +19 -33
  47. package/dist/js/chunks/chunk-NUHMOAOY.mjs.map +7 -0
  48. package/dist/js/chunks/{chunk-P3G3QHII.mjs → chunk-OWG3LMUL.mjs} +17 -14
  49. package/dist/js/chunks/chunk-OWG3LMUL.mjs.map +7 -0
  50. package/dist/js/chunks/{chunk-LTWPGFBR.mjs → chunk-PD6HYHAE.mjs} +4 -15
  51. package/dist/js/chunks/chunk-PD6HYHAE.mjs.map +7 -0
  52. package/dist/js/chunks/{chunk-PIJ2TAR3.mjs → chunk-PDG64UHF.mjs} +3 -3
  53. package/dist/js/chunks/{chunk-IFXVDDDH.mjs → chunk-PO3AXVR3.mjs} +38 -64
  54. package/dist/js/chunks/chunk-PO3AXVR3.mjs.map +7 -0
  55. package/dist/js/chunks/{chunk-QKWPQK5N.mjs → chunk-QYGK36OG.mjs} +16 -14
  56. package/dist/js/chunks/chunk-QYGK36OG.mjs.map +7 -0
  57. package/dist/js/chunks/{chunk-UNEMYWEW.mjs → chunk-SFI2U4YW.mjs} +28 -44
  58. package/dist/js/chunks/chunk-SFI2U4YW.mjs.map +7 -0
  59. package/dist/js/chunks/{chunk-VTLBW7QS.mjs → chunk-SMY7GJSS.mjs} +3 -3
  60. package/dist/js/chunks/{chunk-O5XPWXIQ.mjs → chunk-TCCA2HDG.mjs} +39 -31
  61. package/dist/js/chunks/chunk-TCCA2HDG.mjs.map +7 -0
  62. package/dist/js/chunks/{chunk-UBLRRJ7N.mjs → chunk-TSZYSW7F.mjs} +4 -4
  63. package/dist/js/chunks/{chunk-UBLRRJ7N.mjs.map → chunk-TSZYSW7F.mjs.map} +2 -2
  64. package/dist/js/chunks/{chunk-UEZUJQ66.mjs → chunk-UAZSDUVP.mjs} +3 -4
  65. package/dist/js/chunks/{chunk-UEZUJQ66.mjs.map → chunk-UAZSDUVP.mjs.map} +2 -2
  66. package/dist/js/chunks/{chunk-6N2XAEFK.mjs → chunk-UBRZZWRA.mjs} +10 -8
  67. package/dist/js/chunks/chunk-UBRZZWRA.mjs.map +7 -0
  68. package/dist/js/chunks/{chunk-3VOK6J7U.mjs → chunk-UCOE7ZDL.mjs} +47 -45
  69. package/dist/js/chunks/chunk-UCOE7ZDL.mjs.map +7 -0
  70. package/dist/js/chunks/{chunk-K4CJCRGE.mjs → chunk-UETTGDLI.mjs} +3 -3
  71. package/dist/js/chunks/{chunk-RHRQKTTX.mjs → chunk-UNCRDLP6.mjs} +6 -9
  72. package/dist/js/chunks/chunk-UNCRDLP6.mjs.map +7 -0
  73. package/dist/js/chunks/{chunk-LNCCYGPC.mjs → chunk-VGNYF6FB.mjs} +8 -10
  74. package/dist/js/chunks/chunk-VGNYF6FB.mjs.map +7 -0
  75. package/dist/js/chunks/{chunk-UAEAQBRC.mjs → chunk-VGPGBNGL.mjs} +4 -12
  76. package/dist/js/chunks/chunk-VGPGBNGL.mjs.map +7 -0
  77. package/dist/js/chunks/chunk-VKAUVTQY.mjs +1 -0
  78. package/dist/js/chunks/{chunk-HKT2S7VM.mjs → chunk-VM4FTS7L.mjs} +3 -3
  79. package/dist/js/chunks/{chunk-55IA2XUC.mjs → chunk-WDK4T63U.mjs} +8 -11
  80. package/dist/js/chunks/chunk-WDK4T63U.mjs.map +7 -0
  81. package/dist/js/chunks/{chunk-XH6BEEMY.mjs → chunk-WOCCTVUF.mjs} +51 -39
  82. package/dist/js/chunks/chunk-WOCCTVUF.mjs.map +7 -0
  83. package/dist/js/chunks/{chunk-GZWPXXY6.mjs → chunk-WQYN5L4E.mjs} +14 -16
  84. package/dist/js/chunks/chunk-WQYN5L4E.mjs.map +7 -0
  85. package/dist/js/chunks/{chunk-6WLSDZ4O.mjs → chunk-X4ISMKE2.mjs} +2 -2
  86. package/dist/js/chunks/{chunk-3DHK5CZU.mjs → chunk-XAEAEHIX.mjs} +6 -8
  87. package/dist/js/chunks/chunk-XAEAEHIX.mjs.map +7 -0
  88. package/dist/js/chunks/{chunk-3CLXLPYS.mjs → chunk-ZX6M7SWO.mjs} +43 -29
  89. package/dist/js/chunks/chunk-ZX6M7SWO.mjs.map +7 -0
  90. package/dist/js/expressive.cjs +1337 -572
  91. package/dist/js/expressive.cjs.map +4 -4
  92. package/dist/js/expressive.js +1337 -572
  93. package/dist/js/expressive.js.map +4 -4
  94. package/dist/js/expressive.min.js +10 -13
  95. package/dist/js/expressive.min.js.map +4 -4
  96. package/dist/js/expressive.mjs +71 -55
  97. package/dist/js/expressive.mjs.map +1 -1
  98. package/dist/js/internal/behaviors/bottomSheets.mjs +3 -3
  99. package/dist/js/internal/behaviors/dialogs.mjs +2 -2
  100. package/dist/js/internal/behaviors/forms.mjs +2 -2
  101. package/dist/js/internal/behaviors/sheetDrag.mjs +2 -2
  102. package/dist/js/internal/behaviors/sideSheets.mjs +3 -3
  103. package/dist/js/internal/components/appBar.mjs +2 -2
  104. package/dist/js/internal/components/autocomplete.mjs +4 -4
  105. package/dist/js/internal/components/barChart.mjs +4 -4
  106. package/dist/js/internal/components/buttonGroup.mjs +2 -2
  107. package/dist/js/internal/components/buttons.mjs +3 -3
  108. package/dist/js/internal/components/cards.mjs +3 -3
  109. package/dist/js/internal/components/carousel.mjs +3 -3
  110. package/dist/js/internal/components/characterCounter.mjs +2 -2
  111. package/dist/js/internal/components/chips.mjs +5 -5
  112. package/dist/js/internal/components/columnChart.mjs +3 -3
  113. package/dist/js/internal/components/commandPalette.mjs +3 -3
  114. package/dist/js/internal/components/confetti.mjs +8 -0
  115. package/dist/js/internal/components/confetti.mjs.map +7 -0
  116. package/dist/js/internal/components/datepicker.mjs +6 -6
  117. package/dist/js/internal/components/expandingCard.mjs +3 -3
  118. package/dist/js/internal/components/heatmapChart.mjs +3 -3
  119. package/dist/js/internal/components/index.mjs +64 -48
  120. package/dist/js/internal/components/keypad.mjs +9 -0
  121. package/dist/js/internal/components/keypad.mjs.map +7 -0
  122. package/dist/js/internal/components/lightbox.mjs +3 -3
  123. package/dist/js/internal/components/lineChart.mjs +6 -2
  124. package/dist/js/internal/components/mapView.mjs +9 -0
  125. package/dist/js/internal/components/mapView.mjs.map +7 -0
  126. package/dist/js/internal/components/menu.mjs +3 -3
  127. package/dist/js/internal/components/messageScroller.mjs +3 -3
  128. package/dist/js/internal/components/mixedChart.mjs +4 -4
  129. package/dist/js/internal/components/navigationRail.mjs +2 -2
  130. package/dist/js/internal/components/particles.mjs +8 -0
  131. package/dist/js/internal/components/particles.mjs.map +7 -0
  132. package/dist/js/internal/components/pieChart.mjs +3 -3
  133. package/dist/js/internal/components/questionnaire.mjs +3 -3
  134. package/dist/js/internal/components/radarChart.mjs +3 -3
  135. package/dist/js/internal/components/radialChart.mjs +3 -3
  136. package/dist/js/internal/components/registry.mjs +41 -37
  137. package/dist/js/internal/components/richTextEditor.mjs +3 -3
  138. package/dist/js/internal/components/scrollspy.mjs +2 -2
  139. package/dist/js/internal/components/select.mjs +4 -4
  140. package/dist/js/internal/components/slider.mjs +3 -3
  141. package/dist/js/internal/components/snackbar.mjs +2 -2
  142. package/dist/js/internal/components/tabs.mjs +4 -4
  143. package/dist/js/internal/components/timepicker.mjs +4 -4
  144. package/dist/js/internal/components/tooltip.mjs +3 -3
  145. package/dist/js/internal/core/component.mjs +1 -1
  146. package/dist/js/internal/core/utils.mjs +1 -1
  147. package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +2 -2
  148. package/dist/js/modular.mjs +71 -55
  149. package/dist/types/behaviors/forms.d.ts +5 -0
  150. package/dist/types/components/autocomplete.d.ts +1 -0
  151. package/dist/types/components/carousel.d.ts +2 -0
  152. package/dist/types/components/confetti.d.ts +103 -0
  153. package/dist/types/components/datepicker.d.ts +5 -4
  154. package/dist/types/components/expandingCard.d.ts +2 -0
  155. package/dist/types/components/index.d.ts +4 -0
  156. package/dist/types/components/keypad.d.ts +34 -0
  157. package/dist/types/components/lightbox.d.ts +3 -5
  158. package/dist/types/components/lineChart.d.ts +4 -0
  159. package/dist/types/components/mapView.d.ts +151 -0
  160. package/dist/types/components/menu.d.ts +1 -0
  161. package/dist/types/components/particles.d.ts +72 -0
  162. package/dist/types/components/pieChart.d.ts +3 -0
  163. package/dist/types/components/radialChart.d.ts +0 -1
  164. package/dist/types/components/registry.d.ts +12 -0
  165. package/dist/types/components/slider.d.ts +3 -1
  166. package/dist/types/components/snackbar.d.ts +3 -0
  167. package/dist/types/components/tabs.d.ts +5 -1
  168. package/dist/types/components/timepicker.d.ts +2 -0
  169. package/dist/types/modular.d.ts +1 -1
  170. package/dist/types/plugins/dockedDisplayPlugin.d.ts +4 -3
  171. package/package.json +2 -1
  172. package/src/sass/abstracts/_breakpoints.scss +0 -1
  173. package/src/sass/abstracts/_elevation.scss +1 -1
  174. package/src/sass/abstracts/_mixins.scss +20 -60
  175. package/src/sass/abstracts/_variables.scss +10 -0
  176. package/src/sass/base/_global.scss +3 -12
  177. package/src/sass/base/_index.scss +1 -1
  178. package/src/sass/components/_badges.scss +1 -8
  179. package/src/sass/components/_bar-chart.scss +1 -1
  180. package/src/sass/components/_button-groups.scss +31 -66
  181. package/src/sass/components/_buttons.scss +1 -1
  182. package/src/sass/components/_cards.scss +6 -25
  183. package/src/sass/components/_carousel.scss +16 -55
  184. package/src/sass/components/_chips.scss +0 -6
  185. package/src/sass/components/_column-chart.scss +1 -1
  186. package/src/sass/components/_confetti.scss +14 -0
  187. package/src/sass/components/_data-table.scss +1 -3
  188. package/src/sass/components/_datepicker.scss +3 -22
  189. package/src/sass/components/_dialog.scss +1 -4
  190. package/src/sass/components/_heatmap-chart.scss +2 -2
  191. package/src/sass/components/_icon-buttons.scss +0 -1
  192. package/src/sass/components/_index.scss +4 -0
  193. package/src/sass/components/_keypad.scss +162 -0
  194. package/src/sass/components/_lightbox.scss +3 -8
  195. package/src/sass/components/_map.scss +188 -0
  196. package/src/sass/components/_menu.scss +31 -74
  197. package/src/sass/components/_mixed-chart.scss +1 -1
  198. package/src/sass/components/_navbar.scss +9 -45
  199. package/src/sass/components/_navigation-rail.scss +23 -32
  200. package/src/sass/components/_page-footer.scss +15 -12
  201. package/src/sass/components/_panes.scss +2 -6
  202. package/src/sass/components/_particles.scss +14 -0
  203. package/src/sass/components/_progress.scss +6 -4
  204. package/src/sass/components/_side-sheet.scss +1 -4
  205. package/src/sass/components/_stepper.scss +0 -4
  206. package/src/sass/components/_table_of_contents.scss +3 -1
  207. package/src/sass/components/_timepicker.scss +4 -36
  208. package/src/sass/components/_toolbar.scss +0 -4
  209. package/src/sass/components/forms/_checkboxes.scss +44 -67
  210. package/src/sass/components/forms/_fieldset.scss +3 -3
  211. package/src/sass/components/forms/_file-input.scss +0 -1
  212. package/src/sass/components/forms/_radio-buttons.scss +10 -36
  213. package/src/sass/components/forms/_select.scss +0 -3
  214. package/src/sass/components/forms/_slider.scss +72 -259
  215. package/src/sass/tokens/_state.scss +2 -2
  216. package/src/sass/tokens/_theme.scss +1 -1
  217. package/src/sass/utilities/_colors.scss +6 -1
  218. package/src/sass/utilities/_index.scss +1 -1
  219. package/dist/js/chunks/chunk-3CLXLPYS.mjs.map +0 -7
  220. package/dist/js/chunks/chunk-3DHK5CZU.mjs.map +0 -7
  221. package/dist/js/chunks/chunk-3VOK6J7U.mjs.map +0 -7
  222. package/dist/js/chunks/chunk-4PWAPV6F.mjs +0 -7
  223. package/dist/js/chunks/chunk-55IA2XUC.mjs.map +0 -7
  224. package/dist/js/chunks/chunk-6N2XAEFK.mjs.map +0 -7
  225. package/dist/js/chunks/chunk-CKQP6P76.mjs.map +0 -7
  226. package/dist/js/chunks/chunk-EC63CHXU.mjs.map +0 -7
  227. package/dist/js/chunks/chunk-GZWPXXY6.mjs.map +0 -7
  228. package/dist/js/chunks/chunk-IFXVDDDH.mjs.map +0 -7
  229. package/dist/js/chunks/chunk-LNCCYGPC.mjs.map +0 -7
  230. package/dist/js/chunks/chunk-LTWPGFBR.mjs.map +0 -7
  231. package/dist/js/chunks/chunk-LWBQIX5J.mjs.map +0 -7
  232. package/dist/js/chunks/chunk-NNYP33NB.mjs.map +0 -7
  233. package/dist/js/chunks/chunk-NQLC3YMW.mjs +0 -1
  234. package/dist/js/chunks/chunk-O5XPWXIQ.mjs.map +0 -7
  235. package/dist/js/chunks/chunk-P3G3QHII.mjs.map +0 -7
  236. package/dist/js/chunks/chunk-PLYXLSH3.mjs.map +0 -7
  237. package/dist/js/chunks/chunk-QKWPQK5N.mjs.map +0 -7
  238. package/dist/js/chunks/chunk-QVVEWBOF.mjs.map +0 -7
  239. package/dist/js/chunks/chunk-RHRQKTTX.mjs.map +0 -7
  240. package/dist/js/chunks/chunk-SPETGK25.mjs.map +0 -7
  241. package/dist/js/chunks/chunk-U2OTHOTI.mjs.map +0 -7
  242. package/dist/js/chunks/chunk-UAEAQBRC.mjs.map +0 -7
  243. package/dist/js/chunks/chunk-UNEMYWEW.mjs.map +0 -7
  244. package/dist/js/chunks/chunk-WJXDBPXQ.mjs.map +0 -7
  245. package/dist/js/chunks/chunk-XGHORT7J.mjs.map +0 -7
  246. package/dist/js/chunks/chunk-XH6BEEMY.mjs.map +0 -7
  247. /package/dist/js/chunks/{chunk-DTKR54I6.mjs.map → chunk-33QVDDGR.mjs.map} +0 -0
  248. /package/dist/js/chunks/{chunk-DLWYKFEI.mjs.map → chunk-AIURVCG6.mjs.map} +0 -0
  249. /package/dist/js/chunks/{chunk-GVGT6MIU.mjs.map → chunk-CK2XCICY.mjs.map} +0 -0
  250. /package/dist/js/chunks/{chunk-YDCS5S3J.mjs.map → chunk-L27Q6ZMI.mjs.map} +0 -0
  251. /package/dist/js/chunks/{chunk-CCWDV5CR.mjs.map → chunk-LQWUDNHZ.mjs.map} +0 -0
  252. /package/dist/js/chunks/{chunk-PIJ2TAR3.mjs.map → chunk-PDG64UHF.mjs.map} +0 -0
  253. /package/dist/js/chunks/{chunk-VTLBW7QS.mjs.map → chunk-SMY7GJSS.mjs.map} +0 -0
  254. /package/dist/js/chunks/{chunk-K4CJCRGE.mjs.map → chunk-UETTGDLI.mjs.map} +0 -0
  255. /package/dist/js/chunks/{chunk-NQLC3YMW.mjs.map → chunk-VKAUVTQY.mjs.map} +0 -0
  256. /package/dist/js/chunks/{chunk-HKT2S7VM.mjs.map → chunk-VM4FTS7L.mjs.map} +0 -0
  257. /package/dist/js/chunks/{chunk-6WLSDZ4O.mjs.map → chunk-X4ISMKE2.mjs.map} +0 -0
@@ -177,210 +177,53 @@ input[type="range"] {
177
177
  margin: 0 8px;
178
178
  }
179
179
 
180
+ // A stop dot at one end of the track.
181
+ @function _stop($at) {
182
+ @return radial-gradient(
183
+ circle var(--md-comp-slider-stop-size) at var(--md-comp-slider-stop-at-#{$at}),
184
+ var(--md-comp-slider-stop-color) 99%,
185
+ transparent
186
+ );
187
+ }
188
+
189
+ // Four color stops: $before up to the handle, a gap around it, $after from there.
190
+ // $pos must stay a plain Sass value; interpolating it keeps the inner calc().
191
+ @function _handle-gap($before, $pos, $after) {
192
+ $start: max(0%, calc($pos - var(--md-comp-slider-gap) - var(--md-comp-slider-handle-width) / 2));
193
+ $end: min(100%, calc($pos + var(--md-comp-slider-gap) + var(--md-comp-slider-handle-width) / 2));
194
+ @return $before $start, transparent $start, transparent $end, $after $end;
195
+ }
196
+
197
+ $_active: var(--md-comp-slider-active-track-color);
198
+ $_inactive: var(--md-comp-slider-inactive-track-color);
199
+ $_active-pos: var(--md-comp-slider-active-position, var(--md-comp-slider-active-fraction));
200
+
180
201
  // Gap around the handle so the tracks do not run under it.
181
202
  @mixin range-track-fill {
182
203
  background-image:
183
- radial-gradient(
184
- circle var(--md-comp-slider-stop-size) at var(--md-comp-slider-stop-at-end),
185
- var(--md-comp-slider-stop-color) 99%,
186
- transparent
187
- ),
188
- linear-gradient(
189
- var(--md-comp-slider-gradient),
190
- var(--md-comp-slider-active-track-color)
191
- max(
192
- 0%,
193
- calc(
194
- var(--md-comp-slider-active-position, var(--md-comp-slider-active-fraction)) - var(--md-comp-slider-gap) -
195
- var(--md-comp-slider-handle-width) / 2
196
- )
197
- ),
198
- transparent
199
- max(
200
- 0%,
201
- calc(
202
- var(--md-comp-slider-active-position, var(--md-comp-slider-active-fraction)) - var(--md-comp-slider-gap) -
203
- var(--md-comp-slider-handle-width) / 2
204
- )
205
- ),
206
- transparent
207
- min(
208
- 100%,
209
- calc(
210
- var(--md-comp-slider-active-position, var(--md-comp-slider-active-fraction)) + var(--md-comp-slider-gap) +
211
- var(--md-comp-slider-handle-width) / 2
212
- )
213
- ),
214
- var(--md-comp-slider-inactive-track-color)
215
- min(
216
- 100%,
217
- calc(
218
- var(--md-comp-slider-active-position, var(--md-comp-slider-active-fraction)) + var(--md-comp-slider-gap) +
219
- var(--md-comp-slider-handle-width) / 2
220
- )
221
- )
222
- );
204
+ _stop(end),
205
+ linear-gradient(var(--md-comp-slider-gradient), _handle-gap($_active, $_active-pos, $_inactive));
223
206
  }
224
207
 
225
208
  @mixin range-track-fill-centered {
226
209
  background-image:
227
- radial-gradient(
228
- circle var(--md-comp-slider-stop-size) at var(--md-comp-slider-stop-at-start),
229
- var(--md-comp-slider-stop-color) 99%,
230
- transparent
231
- ),
232
- radial-gradient(
233
- circle var(--md-comp-slider-stop-size) at var(--md-comp-slider-stop-at-end),
234
- var(--md-comp-slider-stop-color) 99%,
235
- transparent
236
- ),
210
+ _stop(start),
211
+ _stop(end),
237
212
  linear-gradient(
238
213
  var(--md-comp-slider-gradient),
239
- var(--md-comp-slider-inactive-track-color)
240
- max(
241
- 0%,
242
- calc(
243
- min(50%, var(--md-comp-slider-active-position, var(--md-comp-slider-active-fraction))) - var(--md-comp-slider-gap) -
244
- var(--md-comp-slider-handle-width) / 2
245
- )
246
- ),
247
- transparent
248
- max(
249
- 0%,
250
- calc(
251
- min(50%, var(--md-comp-slider-active-position, var(--md-comp-slider-active-fraction))) - var(--md-comp-slider-gap) -
252
- var(--md-comp-slider-handle-width) / 2
253
- )
254
- ),
255
- transparent
256
- min(
257
- 100%,
258
- calc(
259
- min(50%, var(--md-comp-slider-active-position, var(--md-comp-slider-active-fraction))) + var(--md-comp-slider-gap) +
260
- var(--md-comp-slider-handle-width) / 2
261
- )
262
- ),
263
- var(--md-comp-slider-active-track-color)
264
- min(
265
- 100%,
266
- calc(
267
- min(50%, var(--md-comp-slider-active-position, var(--md-comp-slider-active-fraction))) + var(--md-comp-slider-gap) +
268
- var(--md-comp-slider-handle-width) / 2
269
- )
270
- ),
271
- var(--md-comp-slider-active-track-color)
272
- max(
273
- 0%,
274
- calc(
275
- max(50%, var(--md-comp-slider-active-position, var(--md-comp-slider-active-fraction))) - var(--md-comp-slider-gap) -
276
- var(--md-comp-slider-handle-width) / 2
277
- )
278
- ),
279
- transparent
280
- max(
281
- 0%,
282
- calc(
283
- max(50%, var(--md-comp-slider-active-position, var(--md-comp-slider-active-fraction))) - var(--md-comp-slider-gap) -
284
- var(--md-comp-slider-handle-width) / 2
285
- )
286
- ),
287
- transparent
288
- min(
289
- 100%,
290
- calc(
291
- max(50%, var(--md-comp-slider-active-position, var(--md-comp-slider-active-fraction))) + var(--md-comp-slider-gap) +
292
- var(--md-comp-slider-handle-width) / 2
293
- )
294
- ),
295
- var(--md-comp-slider-inactive-track-color)
296
- min(
297
- 100%,
298
- calc(
299
- max(50%, var(--md-comp-slider-active-position, var(--md-comp-slider-active-fraction))) + var(--md-comp-slider-gap) +
300
- var(--md-comp-slider-handle-width) / 2
301
- )
302
- )
214
+ _handle-gap($_inactive, min(50%, $_active-pos), $_active),
215
+ _handle-gap($_active, max(50%, $_active-pos), $_inactive)
303
216
  );
304
217
  }
305
218
 
306
219
  @mixin range-track-fill-dual {
307
220
  background-image:
308
- radial-gradient(
309
- circle var(--md-comp-slider-stop-size) at var(--md-comp-slider-stop-at-start),
310
- var(--md-comp-slider-stop-color) 99%,
311
- transparent
312
- ),
313
- radial-gradient(
314
- circle var(--md-comp-slider-stop-size) at var(--md-comp-slider-stop-at-end),
315
- var(--md-comp-slider-stop-color) 99%,
316
- transparent
317
- ),
221
+ _stop(start),
222
+ _stop(end),
318
223
  linear-gradient(
319
224
  var(--md-comp-slider-gradient),
320
- var(--md-comp-slider-inactive-track-color)
321
- max(
322
- 0%,
323
- calc(
324
- var(--md-comp-slider-start-position, var(--md-comp-slider-start-fraction)) - var(--md-comp-slider-gap) -
325
- var(--md-comp-slider-handle-width) / 2
326
- )
327
- ),
328
- transparent
329
- max(
330
- 0%,
331
- calc(
332
- var(--md-comp-slider-start-position, var(--md-comp-slider-start-fraction)) - var(--md-comp-slider-gap) -
333
- var(--md-comp-slider-handle-width) / 2
334
- )
335
- ),
336
- transparent
337
- min(
338
- 100%,
339
- calc(
340
- var(--md-comp-slider-start-position, var(--md-comp-slider-start-fraction)) + var(--md-comp-slider-gap) +
341
- var(--md-comp-slider-handle-width) / 2
342
- )
343
- ),
344
- var(--md-comp-slider-active-track-color)
345
- min(
346
- 100%,
347
- calc(
348
- var(--md-comp-slider-start-position, var(--md-comp-slider-start-fraction)) + var(--md-comp-slider-gap) +
349
- var(--md-comp-slider-handle-width) / 2
350
- )
351
- ),
352
- var(--md-comp-slider-active-track-color)
353
- max(
354
- 0%,
355
- calc(
356
- var(--md-comp-slider-end-position, var(--md-comp-slider-end-fraction)) - var(--md-comp-slider-gap) -
357
- var(--md-comp-slider-handle-width) / 2
358
- )
359
- ),
360
- transparent
361
- max(
362
- 0%,
363
- calc(
364
- var(--md-comp-slider-end-position, var(--md-comp-slider-end-fraction)) - var(--md-comp-slider-gap) -
365
- var(--md-comp-slider-handle-width) / 2
366
- )
367
- ),
368
- transparent
369
- min(
370
- 100%,
371
- calc(
372
- var(--md-comp-slider-end-position, var(--md-comp-slider-end-fraction)) + var(--md-comp-slider-gap) +
373
- var(--md-comp-slider-handle-width) / 2
374
- )
375
- ),
376
- var(--md-comp-slider-inactive-track-color)
377
- min(
378
- 100%,
379
- calc(
380
- var(--md-comp-slider-end-position, var(--md-comp-slider-end-fraction)) + var(--md-comp-slider-gap) +
381
- var(--md-comp-slider-handle-width) / 2
382
- )
383
- )
225
+ _handle-gap($_inactive, var(--md-comp-slider-start-position, var(--md-comp-slider-start-fraction)), $_active),
226
+ _handle-gap($_active, var(--md-comp-slider-end-position, var(--md-comp-slider-end-fraction)), $_inactive)
384
227
  );
385
228
  }
386
229
 
@@ -418,86 +261,56 @@ input[type="range"] {
418
261
  border-radius: calc(var(--md-comp-slider-handle-width) / 2);
419
262
  }
420
263
 
421
- input[type="range"]::-webkit-slider-runnable-track {
422
- @include range-track;
423
- @include range-track-fill;
424
- }
425
-
426
- input[type="range"]::-webkit-slider-thumb {
427
- @include range-thumb;
428
- margin-top: calc((var(--md-comp-slider-track-height) - var(--md-comp-slider-handle-height)) / 2);
429
- }
430
-
431
- input[type="range"]:hover:not(:disabled)::-webkit-slider-thumb {
432
- box-shadow: 0 0 0 18px color-mix(in oklab, var(--md-comp-slider-handle-color) 8%, transparent);
433
- }
434
-
435
- input[type="range"]:focus-visible:not(:disabled)::-webkit-slider-thumb {
436
- box-shadow: 0 0 0 18px color-mix(in oklab, var(--md-comp-slider-handle-color) 10%, transparent);
437
- }
438
-
439
- input[type="range"]:active:not(:disabled)::-webkit-slider-thumb {
440
- width: var(--md-comp-slider-handle-width-pressed);
441
- }
442
-
443
- :is(#{$_host}).centered [type="range"]::-webkit-slider-runnable-track {
444
- @include range-track-fill-centered;
445
- }
446
-
447
- :is(#{$_host}).vertical > [type="range"]::-webkit-slider-runnable-track {
448
- @include range-track-vertical;
449
- margin-left: calc((var(--md-comp-slider-handle-height) - var(--md-comp-slider-track-height)) / 2);
450
- }
451
-
452
- :is(#{$_host}).vertical > [type="range"]::-webkit-slider-thumb {
453
- @include range-thumb-vertical;
454
- margin-top: 0;
455
- margin-left: calc((var(--md-comp-slider-track-height) - var(--md-comp-slider-handle-height)) / 2);
456
- }
264
+ // One set of rules per engine: a browser drops a whole rule with a pseudo-element
265
+ // it does not know, so the two cannot share a selector list.
266
+ @each $track, $thumb in ("::-webkit-slider-runnable-track" "::-webkit-slider-thumb", "::-moz-range-track" "::-moz-range-thumb") {
267
+ $webkit: $thumb == "::-webkit-slider-thumb";
457
268
 
458
- :is(#{$_host}).vertical > [type="range"]:active:not(:disabled)::-webkit-slider-thumb {
459
- width: var(--md-comp-slider-handle-height);
460
- height: var(--md-comp-slider-handle-width-pressed);
461
- }
462
-
463
- input[type="range"]::-moz-range-track {
464
- @include range-track;
465
- @include range-track-fill;
466
- }
269
+ input[type="range"]#{$track} {
270
+ @include range-track;
271
+ @include range-track-fill;
272
+ }
467
273
 
468
- input[type="range"]::-moz-range-thumb {
469
- @include range-thumb;
470
- }
274
+ input[type="range"]#{$thumb} {
275
+ @include range-thumb;
276
+ @if $webkit {
277
+ margin-top: calc((var(--md-comp-slider-track-height) - var(--md-comp-slider-handle-height)) / 2);
278
+ }
279
+ }
471
280
 
472
- input[type="range"]:hover:not(:disabled)::-moz-range-thumb {
473
- box-shadow: 0 0 0 18px color-mix(in oklab, var(--md-comp-slider-handle-color) 8%, transparent);
474
- }
281
+ input[type="range"]:hover:not(:disabled)#{$thumb} {
282
+ box-shadow: 0 0 0 18px color-mix(in oklab, var(--md-comp-slider-handle-color) 8%, transparent);
283
+ }
475
284
 
476
- input[type="range"]:focus-visible:not(:disabled)::-moz-range-thumb {
477
- box-shadow: 0 0 0 18px color-mix(in oklab, var(--md-comp-slider-handle-color) 10%, transparent);
478
- }
285
+ input[type="range"]:focus-visible:not(:disabled)#{$thumb} {
286
+ box-shadow: 0 0 0 18px color-mix(in oklab, var(--md-comp-slider-handle-color) 10%, transparent);
287
+ }
479
288
 
480
- input[type="range"]:active:not(:disabled)::-moz-range-thumb {
481
- width: var(--md-comp-slider-handle-width-pressed);
482
- }
289
+ input[type="range"]:active:not(:disabled)#{$thumb} {
290
+ width: var(--md-comp-slider-handle-width-pressed);
291
+ }
483
292
 
484
- :is(#{$_host}).centered [type="range"]::-moz-range-track {
485
- @include range-track-fill-centered;
486
- }
293
+ :is(#{$_host}).centered [type="range"]#{$track} {
294
+ @include range-track-fill-centered;
295
+ }
487
296
 
488
- :is(#{$_host}).vertical > [type="range"]::-moz-range-track {
489
- @include range-track-vertical;
490
- margin-left: calc((var(--md-comp-slider-handle-height) - var(--md-comp-slider-track-height)) / 2);
491
- }
297
+ :is(#{$_host}).vertical > [type="range"]#{$track} {
298
+ @include range-track-vertical;
299
+ margin-left: calc((var(--md-comp-slider-handle-height) - var(--md-comp-slider-track-height)) / 2);
300
+ }
492
301
 
493
- :is(#{$_host}).vertical > [type="range"]::-moz-range-thumb {
494
- @include range-thumb-vertical;
495
- margin-left: calc((var(--md-comp-slider-track-height) - var(--md-comp-slider-handle-height)) / 2);
496
- }
302
+ :is(#{$_host}).vertical > [type="range"]#{$thumb} {
303
+ @include range-thumb-vertical;
304
+ @if $webkit {
305
+ margin-top: 0;
306
+ }
307
+ margin-left: calc((var(--md-comp-slider-track-height) - var(--md-comp-slider-handle-height)) / 2);
308
+ }
497
309
 
498
- :is(#{$_host}).vertical > [type="range"]:active:not(:disabled)::-moz-range-thumb {
499
- width: var(--md-comp-slider-handle-height);
500
- height: var(--md-comp-slider-handle-width-pressed);
310
+ :is(#{$_host}).vertical > [type="range"]:active:not(:disabled)#{$thumb} {
311
+ width: var(--md-comp-slider-handle-height);
312
+ height: var(--md-comp-slider-handle-width-pressed);
313
+ }
501
314
  }
502
315
 
503
316
  // Dual-handle range. Two inputs share one host; the host paints the track.
@@ -10,8 +10,8 @@
10
10
  // pressed are 0.1, not the 0.12 quoted in some secondary sources.
11
11
  //
12
12
  // Two shapes consume these. An overlay pseudo-element uses the number as an
13
- // `opacity` directly; a ring drawn with `color-mix()` needs a percentage, so it
14
- // multiplies by 100% - see the `state-layer-ring` mixin in abstracts.
13
+ // `opacity` directly; a `color-mix()` tint needs a percentage, which
14
+ // `state-opacity()` in abstracts supplies.
15
15
 
16
16
  @use "../abstracts" as *;
17
17
 
@@ -18,7 +18,7 @@
18
18
  //
19
19
  // The --md-sys-color-*-light / -dark pairs are deliberately left in place.
20
20
  // They are the documented way to re-theme the framework (see the docs' Themes
21
- // page) and several components reference them directly.
21
+ // page). Components read the live names, not the pairs.
22
22
 
23
23
  :root, :host {
24
24
  // `light dark` means: follow the OS unless an ancestor says otherwise.
@@ -19,7 +19,12 @@ $_role-named: "primary-container", "secondary-container", "tertiary-container";
19
19
  $_role-named-hosts: ":not(.extend):not(.fab-menu)";
20
20
 
21
21
  @each $role in $sys-color-roles {
22
- #{if(list.index($_role-named, $role), ".#{$role}#{$_role-named-hosts}", ".#{$role}")} {
22
+ $fill: ".#{$role}";
23
+ @if list.index($_role-named, $role) {
24
+ $fill: "#{$fill}#{$_role-named-hosts}";
25
+ }
26
+
27
+ #{$fill} {
23
28
  background-color: var(--md-sys-color-#{$role});
24
29
  }
25
30
 
@@ -5,6 +5,6 @@
5
5
  @forward "z-depth"; // .z-depth-0 ... .z-depth-5, .hoverable
6
6
  @forward "spacing"; // .m-3, .pt-2, .px-4, ...
7
7
  @forward "visibility"; // .hide, .hide-on-med-and-down, .show-on-large, ...
8
- @forward "helpers"; // alignment, floats, truncate, responsive media
8
+ @forward "helpers"; // alignment, flex, truncate, responsive media
9
9
  @forward "scroll-area"; // native scrolling with themed scrollbars
10
10
  @forward "shapes"; // .shape-pebble, .shape-scallop-6, ... (masks)
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/ts/components/autocomplete.ts"],
4
- "sourcesContent": ["import { Utils } from '../core/utils';\nimport { Menu, MenuOptions } from './menu';\nimport { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nexport interface AutocompleteData {\n /**\n * A primitive value that can be converted to string.\n * If \"text\" is not provided, it will also be used as \"option text\" as well\n */\n id: string | number;\n /**\n * This optional attribute is used as \"display value\" for the current entry.\n * When provided, it will also be taken into consideration by the standard search function.\n */\n text?: string;\n /**\n * This optional attribute is used to provide a valid image URL to the current option.\n */\n image?: string;\n /**\n * Optional attributes which describes the option.\n */\n description?: string;\n}\n\nexport interface AutocompleteOptions extends BaseOptions {\n i18n: Partial<{\n loading: string;\n noResults: string;\n results: (count: number) => string;\n selected: (count: number) => string;\n }>;\n /**\n * Data object defining autocomplete options with\n * optional icon strings.\n */\n data: AutocompleteData[];\n /**\n * Flag which can be set if multiple values can be selected. The Result will be an Array.\n * @default false\n */\n isMultiSelect: boolean;\n /**\n * Callback for when autocompleted.\n */\n onAutocomplete: (entries: AutocompleteData[]) => void;\n /**\n * Minimum number of characters before autocomplete starts.\n * @default 1\n */\n minLength: number;\n /**\n * The height of the Menu which can be set via css-property.\n * @default '300px'\n */\n maxMenuHeight: string;\n /**\n * Function is called when the input text is altered and data can also be loaded asynchronously.\n * If the results are collected the items in the list can be updated via the function setMenuItems(collectedItems).\n * @param text Searched text.\n * @param autocomplete Current autocomplete instance.\n */\n onSearch: (text: string, autocomplete: Autocomplete) => void;\n /**\n * If true will render the key from each item directly as HTML.\n * User input MUST be properly sanitized first.\n * @default false\n */\n allowUnsafeHTML: boolean;\n /**\n * Pass options object to select menu initialization.\n * @default {}\n */\n menuOptions: Partial<MenuOptions>;\n /**\n * Predefined selected values\n */\n selected: number[] | string[];\n}\n\nconst _defaults: AutocompleteOptions = {\n i18n: {\n loading: 'Loading results.',\n noResults: 'No results.',\n results: count => `${count} ${count === 1 ? 'result' : 'results'} available.`,\n selected: count => `${count} ${count === 1 ? 'item' : 'items'} selected.`\n },\n data: [], // Autocomplete data set\n onAutocomplete: null, // Callback for when autocompleted\n menuOptions: {\n // Default menu options\n autoFocus: false,\n closeOnClick: false,\n coverTrigger: false\n },\n minLength: 1, // Min characters before autocomplete starts\n isMultiSelect: false,\n onSearch: (text: string, autocomplete: Autocomplete) => {\n const normSearch = text.toLocaleLowerCase();\n const data = autocomplete.options.data;\n autocomplete.setMenuItems(\n data.filter((option) =>\n option.id.toString().toLocaleLowerCase().includes(normSearch)\n || option.text?.toLocaleLowerCase().includes(normSearch)\n\n )\n );\n autocomplete.options.data = data;\n },\n maxMenuHeight: '300px',\n allowUnsafeHTML: false,\n selected: []\n};\n\nexport class Autocomplete extends Component<AutocompleteOptions> {\n declare el: HTMLInputElement;\n /** If the autocomplete is open. */\n isOpen: boolean;\n /** Number of matching autocomplete options. */\n count: number;\n /** Index of the current selected option. */\n activeIndex: number;\n private oldVal: string;\n private $active: HTMLElement | null;\n private _openTimer: ReturnType<typeof setTimeout> | undefined;\n private _statusInfo: HTMLElement;\n private _announcer: HTMLElement;\n\n /**\n * The active entry, for both the eye and the screen reader. The class alone\n * was invisible to assistive technology; aria-activedescendant on the input\n * is what reports the move.\n *\n * Deliberately does not touch aria-selected. Active and selected are two\n * different things - in a multi-select the checkboxes track real choices,\n * and folding the highlight into aria-selected would announce a committed\n * choice as unselected the moment the user arrowed past it.\n */\n private _setActive(item: HTMLElement | null) {\n this.$active?.classList.remove('active');\n this.$active = item;\n if (item) {\n item.classList.add('active');\n this.el.setAttribute('aria-activedescendant', item.id);\n } else {\n this.el.removeAttribute('aria-activedescendant');\n }\n }\n private _pointerDown: boolean;\n container: HTMLElement;\n /** Instance of the menu plugin for this autocomplete. */\n menu: Menu;\n static _keydown: boolean;\n selectedValues: AutocompleteData[];\n menuItems: AutocompleteData[];\n\n constructor(el: HTMLInputElement, options: Partial<AutocompleteOptions>) {\n super(el, options, Autocomplete);\n this.el['Expressive_Autocomplete'] = this;\n\n this.options = {\n ...Autocomplete.defaults,\n ...options,\n i18n: { ...Autocomplete.defaults.i18n, ...options?.i18n }\n };\n\n this.isOpen = false;\n this.count = 0;\n this.activeIndex = -1;\n this.oldVal = '';\n this.selectedValues = this.options.selected.map((id) => this.options.data.find(entry => entry.id === id) ?? { id });\n this.menuItems = this.options.data || [];\n this.$active = null;\n this._pointerDown = false;\n this._setupMenu();\n this._setupEventHandlers();\n }\n\n static get defaults(): AutocompleteOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Autocomplete.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLInputElement, options?: Partial<AutocompleteOptions>): Autocomplete;\n /**\n * Initializes instances of Autocomplete.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InitElements<HTMLInputElement | InitElement>,\n options?: Partial<AutocompleteOptions>\n ): Autocomplete[];\n /**\n * Initializes instances of Autocomplete.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLInputElement | InitElements<HTMLInputElement | InitElement>,\n options: Partial<AutocompleteOptions> = {}\n ): Autocomplete | Autocomplete[] {\n return super.init(els, options, Autocomplete);\n }\n\n static getInstance(el: HTMLElement): Autocomplete {\n return el['Expressive_Autocomplete'];\n }\n\n /**\n * The three-dot loading indicator, parsed once and cloned thereafter.\n *\n * It is shown on every input change, and it used to be assigned as an\n * innerHTML string each time - re-running the HTML parser over the same\n * fixed markup on every keystroke.\n */\n private static _loadingTemplate: HTMLElement = null;\n\n private static _loadingIndicator(): HTMLElement {\n if (!Autocomplete._loadingTemplate) {\n const template = document.createElement('template');\n template.innerHTML = `<div style=\"height:100%;width:50px;\"><svg version=\"1.1\" id=\"L4\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 100 100\" enable-background=\"new 0 0 0 0\" xml:space=\"preserve\">\n <circle fill=\"#888c\" stroke=\"none\" cx=\"6\" cy=\"50\" r=\"6\"><animate attributeName=\"opacity\" dur=\"1s\" values=\"0;1;0\" repeatCount=\"indefinite\" begin=\"0.1\"/></circle>\n <circle fill=\"#888c\" stroke=\"none\" cx=\"26\" cy=\"50\" r=\"6\"><animate attributeName=\"opacity\" dur=\"1s\" values=\"0;1;0\" repeatCount=\"indefinite\" begin=\"0.2\"/></circle>\n <circle fill=\"#888c\" stroke=\"none\" cx=\"46\" cy=\"50\" r=\"6\"><animate attributeName=\"opacity\" dur=\"1s\" values=\"0;1;0\" repeatCount=\"indefinite\" begin=\"0.3\"/></circle>\n </svg></div>`;\n Autocomplete._loadingTemplate = template.content.firstElementChild as HTMLElement;\n }\n return Autocomplete._loadingTemplate.cloneNode(true) as HTMLElement;\n }\n\n destroy() {\n // open() defers menu.open() to a timer. Without cancelling it, destroying\n // an autocomplete that was opened in the same tick let the callback run\n // against a menu whose element had already been removed.\n if (this._openTimer !== undefined) {\n clearTimeout(this._openTimer);\n this._openTimer = undefined;\n }\n this._removeEventHandlers();\n this.menu.destroy();\n this.isOpen = false;\n this._removeMenu();\n this._statusInfo.remove();\n this._announcer.remove();\n this.el['Expressive_Autocomplete'] = undefined;\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('blur', this._handleInputBlur);\n this.el.addEventListener('input', this._handleInput);\n this.el.addEventListener('keyup', this._handleInputKeyup);\n this.el.addEventListener('focus', this._handleInputFocus);\n this.el.addEventListener('keydown', this._handleInputKeydown);\n this.el.addEventListener('click', this._handleInputClick);\n // One pair, not two. These used to be a mouse pair plus a touch pair behind\n // a `window.ontouchstart` feature detect; a pointer event covers both, and\n // the detect covered nothing the browser does not report itself.\n this.container.addEventListener('pointerdown', this._handleContainerPointerDown);\n this.container.addEventListener('pointerup', this._handleContainerPointerUp);\n this.container.addEventListener('pointercancel', this._handleContainerPointerUp);\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('blur', this._handleInputBlur);\n this.el.removeEventListener('input', this._handleInput);\n this.el.removeEventListener('keyup', this._handleInputKeyup);\n this.el.removeEventListener('focus', this._handleInputFocus);\n this.el.removeEventListener('keydown', this._handleInputKeydown);\n this.el.removeEventListener('click', this._handleInputClick);\n this.container.removeEventListener('pointerdown', this._handleContainerPointerDown);\n this.container.removeEventListener('pointerup', this._handleContainerPointerUp);\n this.container.removeEventListener('pointercancel', this._handleContainerPointerUp);\n }\n\n _setupMenu() {\n this.container = document.createElement('menu');\n this.container.style.maxHeight = this.options.maxMenuHeight;\n this.container.id = `autocomplete-options-${Utils.guid()}`;\n this.container.classList.add('autocomplete-content');\n this.container.ariaExpanded = 'true';\n // An autocomplete is the textbook combobox, and this one already\n // implements the keyboard contract the roles promise - Up and Down move\n // the active entry, Enter commits it - so it is allowed to claim them.\n // It had none: the suggestions were an unlabelled list of <li>, and the\n // highlight moved with a class no assistive technology could see.\n this.container.setAttribute('role', 'listbox');\n this.el.setAttribute('role', 'combobox');\n this.el.setAttribute('aria-autocomplete', 'list');\n this.el.setAttribute('aria-controls', this.container.id);\n this.el.setAttribute('data-target', this.container.id);\n\n this.menuItems.forEach((menuItem) => {\n const itemElement = this._createMenuItem(menuItem);\n this.container.append(itemElement);\n });\n\n // ! Issue in Component Menu: _placeMenu moves dom-position\n this.el.parentElement.appendChild(this.container);\n\n // Initialize menu\n const menuOptions = {\n ...Autocomplete.defaults.menuOptions,\n ...this.options.menuOptions\n };\n const userOnOpenStart = menuOptions.onOpenStart;\n const userOnCloseStart = menuOptions.onCloseStart;\n menuOptions.onOpenStart = (el) => {\n this.isOpen = true;\n if (typeof userOnOpenStart === 'function') userOnOpenStart.call(this.menu, el);\n };\n menuOptions.onCloseStart = (el) => {\n this.isOpen = false;\n if (typeof userOnCloseStart === 'function') userOnCloseStart.call(this.menu, el);\n };\n // The wrapper is installed unconditionally: selecting the clicked entry is\n // how the autocomplete works, not an optional extra. Only the forwarding to\n // a user-supplied handler is conditional, and it hands over exactly what\n // Menu would have (the clicked `li`, called on the Menu instance).\n const userOnItemClick = menuOptions.onItemClick;\n menuOptions.onItemClick = (li) => {\n if (!li) return;\n const entryID = li.getAttribute('data-id');\n this.selectOption(entryID);\n if (typeof userOnItemClick === 'function') userOnItemClick.call(this.menu, li);\n };\n this.menu = Menu.init(this.el, menuOptions);\n this.el.setAttribute('aria-haspopup', 'listbox');\n\n // ! Workaround for Label: move label up again\n // TODO: Just use PopperJS in future!\n const label = this.el.parentElement.querySelector('label');\n if (label) this.el.after(label);\n\n // Sketchy removal of menu click handler\n this.el.removeEventListener('click', this.menu._handleClick);\n if (!this.options.isMultiSelect) this._refreshInputText();\n // Set Value if already set in HTML\n if (this.el.value) this.selectOption(this.el.value);\n // Add StatusInfo\n const div = document.createElement('div');\n div.classList.add('status-info');\n div.setAttribute('aria-hidden', 'true');\n div.setAttribute('style', 'position: absolute;right:0;top:0;');\n this.el.parentElement.appendChild(div);\n this._statusInfo = div;\n this._announcer = document.createElement('div');\n this._announcer.classList.add('autocomplete-status');\n this._announcer.setAttribute('role', 'status');\n this._announcer.setAttribute('aria-live', 'polite');\n this._announcer.setAttribute('aria-atomic', 'true');\n this.el.parentElement.appendChild(this._announcer);\n this._updateSelectedInfo();\n }\n\n _removeMenu() {\n this.container.ariaExpanded = 'false';\n this.container.parentNode.removeChild(this.container);\n }\n\n _handleInputBlur = () => {\n if (!this._pointerDown) {\n this.close();\n this._resetAutocomplete();\n }\n };\n\n _handleInputKeyup = () => {\n Autocomplete._keydown = false;\n };\n\n _handleInput = () => {\n this.count = 0;\n const actualValue = this.el.value.toLocaleLowerCase();\n // Check if the input isn't empty, and that focus arrived by keyboard -\n // which is what `:focus-visible` means, and used to be a global flag this\n // bundle maintained from four capture-phase document listeners.\n if (this.oldVal !== actualValue && this.el.matches(':focus-visible')) {\n this.open();\n }\n this._inputChangeDetection(actualValue);\n };\n\n _handleInputFocus = () => {\n this.count = 0;\n const actualValue = this.el.value.toLocaleLowerCase();\n this._inputChangeDetection(actualValue);\n };\n\n _inputChangeDetection = (value: string) => {\n if (!this.options.isMultiSelect && this.selectedValues.length && this.el.value !== (this.selectedValues[0].text || String(this.selectedValues[0].id))) {\n this.selectedValues = [];\n }\n // Value has changed!\n if (this.oldVal !== value) {\n this._setStatusLoading();\n this.options.onSearch(this.el.value, this);\n }\n // Reset Single-Select when Input cleared\n if (!this.options.isMultiSelect && this.el.value.length === 0) {\n this.selectedValues = [];\n this._triggerChanged();\n }\n this.oldVal = value;\n };\n\n _handleInputKeydown = (e: KeyboardEvent) => {\n Autocomplete._keydown = true;\n if (e.key === Utils.keys.ESC || e.key === 'Tab') {\n this.close();\n this._resetCurrentElementPosition();\n return;\n }\n // Arrow keys and enter key usage\n const numItems = this.container.querySelectorAll('li').length;\n // select element on Enter\n if (e.key === Utils.keys.ENTER && this.activeIndex >= 0) {\n const liElement = this.container.querySelectorAll('li')[this.activeIndex];\n if (liElement) {\n this.selectOption(liElement.getAttribute('data-id'));\n e.preventDefault();\n }\n return;\n }\n // Capture up and down key\n if (e.key === Utils.keys.ARROW_UP || e.key === Utils.keys.ARROW_DOWN) {\n e.preventDefault();\n if (e.key === Utils.keys.ARROW_UP && this.activeIndex > 0) this.activeIndex--;\n if (e.key === Utils.keys.ARROW_DOWN && this.activeIndex < numItems - 1)\n this.activeIndex++;\n this._setActive(null);\n if (this.activeIndex >= 0) {\n this._setActive(this.container.querySelectorAll('li')[this.activeIndex]);\n // Focus selected\n this.container.children[this.activeIndex].scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'nearest'\n });\n }\n }\n };\n\n _handleInputClick = () => {\n this.open();\n };\n\n // The flag says \"a press is in flight inside the option list\", so that a blur\n // caused by that press does not close the list out from under it. Without the\n // cancel half, a cancelled gesture left the flag set and the next blur could\n // not close the list at all.\n _handleContainerPointerDown = (e: PointerEvent) => {\n if (!e.isPrimary) return;\n if (e.pointerType === 'mouse' && e.button !== 0) return;\n this._pointerDown = true;\n };\n\n _handleContainerPointerUp = () => {\n this._pointerDown = false;\n };\n\n _resetCurrentElementPosition() {\n this.activeIndex = -1;\n this._setActive(null);\n }\n\n _resetAutocomplete() {\n this.container.replaceChildren();\n this._resetCurrentElementPosition();\n this.oldVal = null;\n this._pointerDown = false;\n }\n\n _highlightPartialText(input: string, label: string) {\n const start = label.toLocaleLowerCase().indexOf('' + input.toLocaleLowerCase() + '');\n const end = start + input.length - 1;\n //custom filters may return results where the string does not match any part\n if (start == -1 || end == -1) {\n return [label, '', ''];\n }\n return [label.slice(0, start), label.slice(start, end + 1), label.slice(end + 1)];\n }\n\n _createMenuItem(entry: AutocompleteData) {\n const item = document.createElement('li');\n item.id = `autocomplete-option-${Utils.guid()}`;\n item.setAttribute('role', 'option');\n // role=option promises a selection state on every entry, not just the\n // chosen one - and it has to be the *real* one. A multi-select entry that\n // is already committed is selected whether or not it is the highlighted\n // row.\n const isSelected = this.selectedValues.some((sel) => sel.id === entry.id);\n item.setAttribute('aria-selected', isSelected ? 'true' : 'false');\n item.setAttribute('data-id', <string>entry.id);\n item.setAttribute(\n 'style',\n 'display:grid; grid-auto-flow: column; user-select: none; align-items: center;'\n );\n item.tabIndex = -1;\n // Checkbox\n if (this.options.isMultiSelect) {\n const selection = document.createElement('div');\n selection.classList.add('item-selection');\n selection.style.textAlign = 'center';\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.tabIndex = -1;\n checkbox.checked = isSelected;\n const spacer = document.createElement('span');\n spacer.style.paddingLeft = '21px';\n selection.append(checkbox, spacer);\n item.appendChild(selection);\n }\n // Image\n if (entry.image) {\n const img = document.createElement('img');\n img.classList.add('circle');\n img.src = entry.image;\n item.appendChild(img);\n }\n\n // Text\n const inputText = this.el.value.toLocaleLowerCase();\n const parts = this._highlightPartialText(inputText, (entry.text || entry.id).toString());\n const div = document.createElement('div');\n div.setAttribute('style', 'line-height:1.2;font-weight:500;');\n if (this.options.allowUnsafeHTML) {\n div.innerHTML = parts[0] + '<span class=\"highlight\">' + parts[1] + '</span>' + parts[2];\n } else {\n div.appendChild(document.createTextNode(parts[0]));\n if (parts[1]) {\n const highlight = document.createElement('span');\n highlight.textContent = parts[1];\n highlight.classList.add('highlight');\n div.appendChild(highlight);\n div.appendChild(document.createTextNode(parts[2]));\n }\n }\n\n const itemText = document.createElement('div');\n itemText.classList.add('item-text');\n itemText.setAttribute('style', 'padding:5px;overflow:hidden;');\n item.appendChild(itemText);\n item.querySelector('.item-text').appendChild(div);\n // Description\n if (\n typeof entry.description === 'string' ||\n (typeof entry.description === 'number' && !isNaN(entry.description))\n ) {\n const description = document.createElement('small');\n description.setAttribute(\n 'style',\n 'line-height:1.3;color:grey;white-space:nowrap;text-overflow:ellipsis;display:block;width:90%;overflow:hidden;'\n );\n description.innerText = entry.description;\n item.querySelector('.item-text').appendChild(description);\n }\n // Set Grid\n const getGridConfig = () => {\n if (this.options.isMultiSelect) {\n if (entry.image) return '40px min-content auto'; // cb-img-txt\n return '40px auto'; // cb-txt\n }\n if (entry.image) return 'min-content auto'; // img-txt\n return 'auto'; // txt\n };\n item.style.gridTemplateColumns = getGridConfig();\n return item;\n }\n\n _renderMenu() {\n this._resetAutocomplete();\n // Check if Data is empty\n if (this.menuItems.length === 0) {\n this.menuItems = this.selectedValues; // Show selected Items\n }\n for (let i = 0; i < this.menuItems.length; i++) {\n const item = this._createMenuItem(this.menuItems[i]);\n this.container.append(item);\n }\n }\n\n _setStatusLoading() {\n const statusElement = this._statusInfo;\n if (statusElement) statusElement.replaceChildren(Autocomplete._loadingIndicator());\n this._announce(this.options.i18n.loading);\n }\n\n private _announce(message: string) {\n if (!this._announcer) return;\n const text = this.el.matches(':focus') && this.el.value.length >= this.options.minLength ? message : '';\n if (this._announcer.textContent !== text) this._announcer.textContent = text;\n }\n\n _updateSelectedInfo() {\n const statusElement = this._statusInfo;\n if (statusElement) {\n if (this.options.isMultiSelect)\n statusElement.textContent = this.selectedValues.length.toString();\n else statusElement.replaceChildren();\n }\n }\n\n _refreshInputText() {\n if (this.selectedValues.length === 1) {\n const entry = this.selectedValues[0];\n this.el.value = entry.text || <string>entry.id; // Write Text to Input\n }\n }\n\n _triggerChanged() {\n this.el.dispatchEvent(new Event('change', { bubbles: true, cancelable: true, composed: true }));\n // Trigger Autocomplete Event\n if (typeof this.options.onAutocomplete === 'function')\n this.options.onAutocomplete.call(this, this.selectedValues);\n }\n\n /**\n * Show autocomplete.\n */\n open = () => {\n const inputText = this.el.value.toLocaleLowerCase();\n this._resetAutocomplete();\n if (inputText.length >= this.options.minLength) {\n this._renderMenu();\n this._announce(this.menuItems.length ? this.options.i18n.results(this.menuItems.length) : this.options.i18n.noResults);\n }\n // Open menu\n if (!this.menu.isOpen) {\n // Cancel first: two open() calls before the callback fires would leave\n // the earlier timer untracked, and destroy() can only cancel the one it\n // knows about.\n if (this._openTimer !== undefined) clearTimeout(this._openTimer);\n this._openTimer = setTimeout(() => {\n this._openTimer = undefined;\n this.menu.open();\n }, 0); // TODO: why?\n } else this.menu.recalculateDimensions(); // Recalculate menu when its already open\n };\n\n /**\n * Hide autocomplete.\n */\n close = () => {\n if (this._announcer) this._announcer.textContent = '';\n if (this._openTimer !== undefined) {\n clearTimeout(this._openTimer);\n this._openTimer = undefined;\n }\n this.isOpen = false;\n this.menu.close();\n };\n\n /**\n * Updates the visible or selectable items shown in the menu.\n * @param menuItems Items to be available.\n * @param selected Selected item ids\n * @param open Option to conditionally open menu\n */\n setMenuItems(menuItems: AutocompleteData[], selected: number[] | string[] = null, open: boolean = true) {\n if (this.el['Expressive_Autocomplete'] !== this) return;\n const resultCount = menuItems.length;\n this.menuItems = menuItems;\n this.options.data = menuItems;\n if (selected) {\n this.selectedValues = this.menuItems.filter(\n (item) => !(selected.indexOf(<never>item.id) === -1)\n );\n }\n if (this.options.isMultiSelect) {\n this._renderMenu();\n } else {\n this._refreshInputText();\n }\n if (open) this.open();\n this._updateSelectedInfo();\n this._announce(open ? resultCount ? this.options.i18n.results(resultCount) : this.options.i18n.noResults : '');\n this._triggerChanged();\n }\n\n /**\n * Select a specific autocomplete option via id-property.\n * @param id The id of a data-entry.\n */\n selectOption(id: number | string) {\n const entry = this.menuItems.find((item) => item.id == id);\n if (!entry) return;\n // Toggle Checkbox\n /* const li = this.container.querySelector('li[data-id=\"' + id + '\"]');\n if (!li) return;*/\n if (this.options.isMultiSelect) {\n /* const checkbox = <HTMLInputElement | null>li.querySelector('input[type=\"checkbox\"]');\n checkbox.checked = !checkbox.checked;*/\n if (!(this.selectedValues.filter(\n (selectedEntry) => selectedEntry.id === entry.id\n ).length >= 1)) this.selectedValues.push(entry);\n else this.selectedValues = this.selectedValues.filter(\n (selectedEntry) => selectedEntry.id !== entry.id\n );\n this._renderMenu();\n this.el.focus();\n } else {\n // Single-Select\n this.selectedValues = [entry];\n this._refreshInputText();\n this._resetAutocomplete();\n this.close();\n }\n this._updateSelectedInfo();\n if (this.options.isMultiSelect) this._announce(this.options.i18n.selected(this.selectedValues.length));\n this._triggerChanged();\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/ts/components/radarChart.ts"],
4
- "sourcesContent": ["import { InitElements, InitElement } from '../core/component';\nimport { LineChart, LineChartOptions, COLORS, svgNode as node } from './lineChart';\n\nexport type RadarChartOptions = LineChartOptions;\n\n/** Grid rings, evenly spaced from the middle to the rim. */\nconst RINGS = 4;\n\n/**\n * Radar chart. It reads its <table> like LineChart, but each row is a spoke,\n * clockwise from the top, and each value column is a series drawn as a\n * shape joining its values on the spokes, from zero in the middle to the\n * scale's top at the rim. The row labels sit round the rim.\n *\n * Re-run `RadarChart.init(el)` after changing the table.\n */\nexport class RadarChart extends LineChart {\n protected get _type() {\n return 'radar-chart';\n }\n\n protected get _key() {\n return 'Expressive_RadarChart';\n }\n\n /** The scale starts at zero, the middle, so shapes compare by size. */\n protected get _fromZero() {\n return true;\n }\n\n protected get _circular() {\n return true;\n }\n\n static init(el: HTMLElement, options?: Partial<RadarChartOptions>): RadarChart;\n static init(els: InitElements<InitElement>, options?: Partial<RadarChartOptions>): RadarChart[];\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<RadarChartOptions> = {}\n ): RadarChart | RadarChart[] {\n return super.init(els as HTMLElement, options) as RadarChart | RadarChart[];\n }\n\n static getInstance(el: HTMLElement): RadarChart {\n return el['Expressive_RadarChart'];\n }\n\n /**\n * The cursor is a spoke turned by --turn, and the tooltip sits past its\n * tip. LineChart's points on the spoke keep their top, a share of the\n * radius, which stops at the rim and the middle like the shapes.\n */\n protected _place(index: number) {\n for (const dot of this._cursor.children as HTMLCollectionOf<HTMLElement>) {\n dot.style.top = `${Math.min(100, Math.max(0, parseFloat(dot.style.top)))}%`;\n }\n const turn = this._turn(index);\n this._cursor.style.setProperty('--turn', String(turn));\n this._tooltip.style.setProperty('--turn', String(turn));\n // On the right half it opens leftwards, over the chart.\n this._tooltip.classList.toggle('end', turn > 0 && turn < 0.5);\n }\n\n /** A row's spoke as a fraction of a turn clockwise from the top. */\n private _turn(index: number) {\n return index / this.labels.length;\n }\n\n /** Only the legend; the labels go round the rim in _draw. */\n protected _guides(): Element[] {\n return this._legend();\n }\n\n /** The nearest spoke to the pointer, by its angle from the middle. */\n protected _indexAt(e: PointerEvent) {\n const [turn] = this._polarAt(e);\n return Math.round(turn * this.labels.length) % this.labels.length;\n }\n\n /**\n * An SVG in a -50 to 50 box: the rings and spokes of the grid, then each\n * series' shape, with its points for .points. The rim is the box's edge;\n * the labels round it are HTML.\n */\n protected _draw(): Element {\n const at = (index: number, share: number) => {\n const angle = this._turn(index) * 2 * Math.PI;\n return `${(50 * share * Math.sin(angle)).toFixed(3)},${(-50 * share * Math.cos(angle)).toFixed(3)}`;\n };\n // The rim is the scale's top, so _y is the distance in from the rim.\n const share = (value: number) => Math.min(1, Math.max(0, 1 - this._y(value) / 100));\n const rows = this.labels.map((_, i) => i);\n const ring = (r: number) => `M${rows.map((i) => at(i, r)).join('L')}Z`;\n\n const svg = node('svg', { viewBox: '-50 -50 100 100', 'aria-hidden': 'true', focusable: 'false' });\n svg.append(node('path', {\n class: 'radar-chart-grid',\n d: Array.from({ length: RINGS }, (_, r) => ring((r + 1) / RINGS)).join('')\n + rows.map((i) => `M0,0L${at(i, 1)}`).join('')\n }));\n const points = this.el.classList.contains('points');\n this.series.forEach((series, s) => {\n const group = node('g', {\n class: `radar-chart-series ${series.className}`.trim(),\n 'data-series': String((s % COLORS) + 1)\n });\n // ponytail: a gap joins the spokes either side of it; mark gaps if charts need them.\n const drawn = rows.filter((i) => series.values[i] !== null);\n const corners = drawn.map((i) => at(i, share(series.values[i]!)));\n group.append(node('path', { class: 'radar-chart-shape', d: corners.length ? `M${corners.join('L')}Z` : '' }));\n // Round caps on zero-length lines, so CSS sizes the points in pixels.\n if (points) group.append(node('path', { class: 'radar-chart-points', d: corners.map((c) => `M${c}h0`).join('') }));\n svg.append(group);\n });\n\n const labels = document.createElement('ol');\n labels.className = 'radar-chart-axes';\n labels.setAttribute('aria-hidden', 'true');\n this.labels.forEach((text, i) => {\n const li = document.createElement('li');\n li.textContent = text;\n li.style.setProperty('--turn', String(this._turn(i)));\n labels.append(li);\n });\n\n const web = document.createElement('div');\n web.className = 'radar-chart-web';\n web.append(svg, labels);\n return web;\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["share"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/ts/components/tabs.ts"],
4
- "sourcesContent": ["import { Carousel } from './carousel';\nimport { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nexport interface TabsOptions extends BaseOptions {\n /**\n * Transition duration in milliseconds.\n * @default 300\n */\n duration: number;\n /**\n * Callback for when a new tab content is shown.\n * @default null\n */\n onShow: (newContent: Element) => void;\n /**\n * Set to true to enable swipeable tabs.\n * This also uses the responsiveThreshold option.\n * @default false\n */\n swipeable: boolean;\n /**\n * The maximum width of the screen, in pixels,\n * where the swipeable functionality initializes.\n * @default infinity\n */\n responsiveThreshold: number;\n}\n\nconst _defaults: TabsOptions = {\n duration: 300,\n onShow: null,\n swipeable: false,\n responsiveThreshold: Infinity // breakpoint for swipeable\n};\n\nexport class Tabs extends Component<TabsOptions> {\n _tabLinks: NodeListOf<HTMLAnchorElement>;\n _index: number;\n _indicator: HTMLElement;\n _tabWidth: number;\n _tabsWidth: number;\n _tabsCarousel: Carousel;\n _activeTabLink: HTMLAnchorElement;\n _content: HTMLElement;\n private _originalPanels = new Map<HTMLElement, { display: string; priority: string; active: boolean; carousel: boolean; marker?: Comment }>();\n private _originalLinks = new Map<HTMLAnchorElement, { active: boolean; current: string | null }>();\n\n constructor(el: HTMLElement, options: Partial<TabsOptions>) {\n super(el, options, Tabs);\n this.el['Expressive_Tabs'] = this;\n\n this.options = {\n ...Tabs.defaults,\n ...options\n };\n\n this._tabLinks = this._queryTabLinks();\n this._tabLinks.forEach(link => {\n this._originalLinks.set(link, { active: link.classList.contains('active'), current: link.getAttribute('aria-current') });\n if (link.hasAttribute('target')) return;\n const panel = link.hash && document.getElementById(link.hash.slice(1));\n if (panel) this._originalPanels.set(panel, {\n display: panel.style.display, priority: panel.style.getPropertyPriority('display'),\n active: panel.classList.contains('active'), carousel: panel.classList.contains('carousel-item')\n });\n });\n this.options.swipeable &&= window.innerWidth <= this.options.responsiveThreshold;\n this._index = 0;\n this._setupActiveTabLink();\n if (this.options.swipeable) {\n this._setupSwipeableTabs();\n } else {\n this._setupNormalTabs();\n }\n // Setup tabs indicator after content to ensure accurate widths\n this._setTabsAndTabWidth();\n this._createIndicator();\n this._setupEventHandlers();\n }\n\n static get defaults(): TabsOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Tabs.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<TabsOptions>): Tabs;\n /**\n * Initializes instances of Tabs.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<InitElement>, options?: Partial<TabsOptions>): Tabs[];\n /**\n * Initializes instances of Tabs.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<TabsOptions> = {}\n ): Tabs | Tabs[] {\n return super.init(els, options, Tabs);\n }\n\n static getInstance(el: HTMLElement): Tabs {\n return el['Expressive_Tabs'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this._indicator.remove();\n if (this.options.swipeable) {\n this._teardownSwipeableTabs();\n }\n this._originalPanels.forEach((original, panel) => {\n panel.style.setProperty('display', original.display, original.priority);\n panel.classList.toggle('active', original.active);\n panel.classList.toggle('carousel-item', original.carousel);\n if (!panel.className) panel.removeAttribute('class');\n });\n this._originalLinks.forEach((original, link) => {\n link.classList.toggle('active', original.active);\n if (original.current === null) link.removeAttribute('aria-current');\n else link.setAttribute('aria-current', original.current);\n });\n this.el['Expressive_Tabs'] = undefined;\n }\n\n /**\n * The index of tab that is currently shown.\n */\n get index() {\n return this._index;\n }\n\n _setupEventHandlers() {\n window.addEventListener('resize', this._handleWindowResize);\n this.el.addEventListener('click', this._handleTabClick);\n }\n\n _removeEventHandlers() {\n window.removeEventListener('resize', this._handleWindowResize);\n this.el.removeEventListener('click', this._handleTabClick);\n }\n\n _handleWindowResize = () => {\n this._setTabsAndTabWidth();\n if (this._tabWidth !== 0 && this._tabsWidth !== 0) {\n this._indicator.style.left = this._calcLeftPos(this._activeTabLink) + 'px';\n this._indicator.style.right = this._calcRightPos(this._activeTabLink) + 'px';\n }\n };\n\n _queryTabLinks() {\n return this.el.querySelectorAll<HTMLAnchorElement>(\n ':scope > a, :scope > .tab > a'\n );\n }\n\n _handleTabClick = (e: MouseEvent) => {\n const target = e.target as Element | null;\n if (!target) return;\n const tabLink = target.closest('a') as HTMLAnchorElement | null;\n if (!tabLink || !Array.from(this._tabLinks).includes(tabLink)) return;\n\n const tab = tabLink.parentElement;\n const disabled =\n tabLink.classList.contains('disabled') ||\n tabLink.getAttribute('aria-disabled') === 'true' ||\n tab?.classList.contains('disabled');\n if (disabled) {\n e.preventDefault();\n return;\n }\n // Act as regular link if target attribute is specified.\n if (tabLink.hasAttribute('target')) return;\n if (this.options.swipeable) {\n const panel = tabLink.hash && document.getElementById(tabLink.hash.slice(1));\n const index = this._tabsCarousel.images.indexOf(panel as HTMLElement);\n if (index >= 0) this._tabsCarousel.set(index);\n e.preventDefault();\n return;\n }\n const _oldContent = this._content;\n this._tabLinks = this._queryTabLinks();\n // Moves the class and aria-current together, off the old tab and onto this\n // one - they used to be able to disagree.\n const prevIndex = this._index;\n this._setActiveTabLink(tabLink);\n\n // Swap content\n if (this._content) {\n this._content.style.display = 'block';\n this._content.classList.add('active');\n if (typeof this.options.onShow === 'function')\n this.options.onShow.call(this, this._content);\n if (_oldContent && _oldContent !== this._content) {\n _oldContent.style.display = 'none';\n _oldContent.classList.remove('active');\n }\n }\n // Update widths after content is swapped (scrollbar bugfix)\n this._setTabsAndTabWidth();\n this._animateIndicator(prevIndex);\n e.preventDefault();\n };\n\n _createIndicator() {\n const tag = this.el.tagName === 'UL' || this.el.tagName === 'OL' ? 'li' : 'span';\n const indicator = document.createElement(tag);\n indicator.classList.add('indicator');\n this.el.appendChild(indicator);\n this._indicator = indicator;\n this._indicator.style.left = this._calcLeftPos(this._activeTabLink) + 'px';\n this._indicator.style.right = this._calcRightPos(this._activeTabLink) + 'px';\n }\n\n /**\n * Which tab is current, for the eye and for assistive technology.\n *\n * The class alone is a colour. `aria-current` is the part a screen reader\n * reads, and because tabs are navigation rather than a tablist (rule 2 -\n * there is no keyboard model here to back a tablist), \"current\" is exactly\n * the right word for it. Its *value* changes as the user clicks, which makes\n * maintaining it the component's job, not the author's - see CONTEXT.md on\n * static semantics versus dynamic state. Writing it once in the markup and\n * never moving it left the old tab announcing itself as current.\n */\n private _setActiveTabLink(tabLink: HTMLAnchorElement) {\n Array.from(this._tabLinks).forEach((a: HTMLAnchorElement) => {\n a.classList.remove('active');\n a.removeAttribute('aria-current');\n });\n this._activeTabLink = tabLink;\n tabLink.classList.add('active');\n tabLink.setAttribute('aria-current', 'page');\n this._index = Array.from(this._tabLinks).indexOf(tabLink);\n this._content = tabLink.hasAttribute('target') ? null : document.getElementById(tabLink.hash.slice(1));\n }\n\n _setupActiveTabLink() {\n // If the location.hash matches one of the links, use that as the active tab.\n this._activeTabLink = Array.from(this._tabLinks).find(\n (a: HTMLAnchorElement) => a.getAttribute('href') === location.hash\n );\n // If no match is found, use the first link or any with class 'active' as the initial active tab.\n if (!this._activeTabLink) {\n let activeTabLink = this.el.querySelector('a.active');\n if (!activeTabLink) {\n activeTabLink = this._tabLinks[0];\n }\n this._activeTabLink = activeTabLink as HTMLAnchorElement;\n }\n this._setActiveTabLink(this._activeTabLink);\n\n this._originalPanels.forEach((_, panel) => panel.classList.toggle('active', panel === this._content));\n }\n\n _setupSwipeableTabs() {\n const tabsContent = [];\n this._tabLinks.forEach((a) => {\n if (a.hash && !a.hasAttribute('target')) {\n const currContent = document.getElementById(a.hash.slice(1));\n if (!currContent) return;\n currContent.classList.add('carousel-item');\n tabsContent.push(currContent);\n }\n });\n\n // Create Carousel-Wrapper around Tab-Contents\n const tabsWrapper = document.createElement('div');\n tabsWrapper.classList.add('tabs-content', 'carousel', 'flat');\n\n // Wrap around\n tabsContent[0].parentElement.insertBefore(tabsWrapper, tabsContent[0]);\n tabsContent.forEach((tabContent) => {\n const marker = document.createComment('');\n tabContent.before(marker);\n this._originalPanels.get(tabContent).marker = marker;\n tabsWrapper.appendChild(tabContent);\n tabContent.style.display = '';\n });\n\n this._tabsCarousel = Carousel.init(tabsWrapper, {\n fullWidth: true,\n noWrap: true,\n duration: this.options.duration,\n onCycleTo: (item) => {\n const prevIndex = this._index;\n this._setActiveTabLink(Array.from(this._tabLinks).find(a => !a.hasAttribute('target') && a.hash === '#' + item.id));\n this._setTabsAndTabWidth();\n this._animateIndicator(prevIndex);\n if (typeof this.options.onShow === 'function')\n this.options.onShow.call(this, this._content);\n }\n });\n }\n\n _teardownSwipeableTabs() {\n const tabsWrapper = this._tabsCarousel.el;\n this._tabsCarousel.destroy();\n this._originalPanels.forEach((original, panel) => original.marker?.replaceWith(panel));\n tabsWrapper.remove();\n }\n\n _setupNormalTabs() {\n // Hide Tabs Content\n Array.from(this._tabLinks).forEach((a) => {\n if (a === this._activeTabLink || a.hasAttribute('target')) return;\n if (a.hash) {\n const currContent = document.getElementById(a.hash.slice(1));\n if (currContent) currContent.style.display = 'none';\n }\n });\n }\n\n _setTabsAndTabWidth() {\n this._tabsWidth = this.el.getBoundingClientRect().width;\n this._tabWidth = Math.max(this._tabsWidth, this.el.scrollWidth) / this._tabLinks.length;\n }\n\n _calcRightPos(el) {\n return Math.ceil(this._tabsWidth - el.offsetLeft - el.getBoundingClientRect().width);\n }\n\n _calcLeftPos(el) {\n return Math.floor(el.offsetLeft);\n }\n\n /**\n * Recalculate tab indicator position. This is useful when\n * the indicator position is not correct.\n */\n updateTabIndicator() {\n this._setTabsAndTabWidth();\n this._animateIndicator(this._index);\n }\n\n _animateIndicator(prevIndex) {\n let leftDelay = 0,\n rightDelay = 0;\n\n const isMovingLeftOrStaying = this._index - prevIndex >= 0;\n if (isMovingLeftOrStaying) leftDelay = 90;\n else rightDelay = 90;\n\n // in v1: easeOutQuad\n this._indicator.style.transition = `\n left ${this.options.duration}ms ease-out ${leftDelay}ms,\n right ${this.options.duration}ms ease-out ${rightDelay}ms`;\n\n this._indicator.style.left = this._calcLeftPos(this._activeTabLink) + 'px';\n this._indicator.style.right = this._calcRightPos(this._activeTabLink) + 'px';\n }\n\n /**\n * Show tab content that corresponds to the tab with the id.\n * @param tabId The id of the tab that you want to switch to.\n */\n select(tabId: string) {\n const tab = Array.from(this._tabLinks).find(\n (a: HTMLAnchorElement) => a.getAttribute('href') === '#' + tabId\n );\n if (tab) (<HTMLAnchorElement>tab).click();\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- // src/ts/modular.ts
2
- var version = "0.13.1";
3
-
4
- export {
5
- version
6
- };
7
- //# sourceMappingURL=chunk-4PWAPV6F.mjs.map