@tabler/core 1.5.1 → 1.6.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 (961) hide show
  1. package/README.md +10 -1
  2. package/dist/css/tabler-flags.css +9 -1
  3. package/dist/css/tabler-flags.css.map +1 -1
  4. package/dist/css/tabler-flags.min.css +2 -2
  5. package/dist/css/tabler-flags.min.css.map +1 -1
  6. package/dist/css/tabler-flags.rtl.css +9 -1
  7. package/dist/css/tabler-flags.rtl.css.map +1 -1
  8. package/dist/css/tabler-flags.rtl.min.css +2 -2
  9. package/dist/css/tabler-flags.rtl.min.css.map +1 -1
  10. package/dist/css/tabler-marketing.css +78 -38
  11. package/dist/css/tabler-marketing.css.map +1 -1
  12. package/dist/css/tabler-marketing.min.css +2 -2
  13. package/dist/css/tabler-marketing.min.css.map +1 -1
  14. package/dist/css/tabler-marketing.rtl.css +78 -38
  15. package/dist/css/tabler-marketing.rtl.css.map +1 -1
  16. package/dist/css/tabler-marketing.rtl.min.css +2 -2
  17. package/dist/css/tabler-marketing.rtl.min.css.map +1 -1
  18. package/dist/css/tabler-payments.css +5 -1
  19. package/dist/css/tabler-payments.css.map +1 -1
  20. package/dist/css/tabler-payments.min.css +1 -1
  21. package/dist/css/tabler-payments.min.css.map +1 -1
  22. package/dist/css/tabler-payments.rtl.css +5 -1
  23. package/dist/css/tabler-payments.rtl.css.map +1 -1
  24. package/dist/css/tabler-payments.rtl.min.css +1 -1
  25. package/dist/css/tabler-payments.rtl.min.css.map +1 -1
  26. package/dist/css/tabler-props.css +207 -241
  27. package/dist/css/tabler-props.css.map +1 -1
  28. package/dist/css/tabler-props.min.css +2 -2
  29. package/dist/css/tabler-props.min.css.map +1 -1
  30. package/dist/css/tabler-props.rtl.css +207 -241
  31. package/dist/css/tabler-props.rtl.css.map +1 -1
  32. package/dist/css/tabler-props.rtl.min.css +2 -2
  33. package/dist/css/tabler-props.rtl.min.css.map +1 -1
  34. package/dist/css/tabler-socials.css +5 -1
  35. package/dist/css/tabler-socials.css.map +1 -1
  36. package/dist/css/tabler-socials.min.css +1 -1
  37. package/dist/css/tabler-socials.min.css.map +1 -1
  38. package/dist/css/tabler-socials.rtl.css +5 -1
  39. package/dist/css/tabler-socials.rtl.css.map +1 -1
  40. package/dist/css/tabler-socials.rtl.min.css +1 -1
  41. package/dist/css/tabler-socials.rtl.min.css.map +1 -1
  42. package/dist/css/tabler-themes.css +144 -94
  43. package/dist/css/tabler-themes.css.map +1 -1
  44. package/dist/css/tabler-themes.min.css +2 -2
  45. package/dist/css/tabler-themes.min.css.map +1 -1
  46. package/dist/css/tabler-themes.rtl.css +144 -94
  47. package/dist/css/tabler-themes.rtl.css.map +1 -1
  48. package/dist/css/tabler-themes.rtl.min.css +2 -2
  49. package/dist/css/tabler-themes.rtl.min.css.map +1 -1
  50. package/dist/css/tabler-vendors.css +203 -83
  51. package/dist/css/tabler-vendors.css.map +1 -1
  52. package/dist/css/tabler-vendors.min.css +2 -2
  53. package/dist/css/tabler-vendors.min.css.map +1 -1
  54. package/dist/css/tabler-vendors.rtl.css +203 -83
  55. package/dist/css/tabler-vendors.rtl.css.map +1 -1
  56. package/dist/css/tabler-vendors.rtl.min.css +2 -2
  57. package/dist/css/tabler-vendors.rtl.min.css.map +1 -1
  58. package/dist/css/tabler.css +4366 -5119
  59. package/dist/css/tabler.css.map +1 -1
  60. package/dist/css/tabler.min.css +2 -2
  61. package/dist/css/tabler.min.css.map +1 -1
  62. package/dist/css/tabler.rtl.css +4922 -5678
  63. package/dist/css/tabler.rtl.css.map +1 -1
  64. package/dist/css/tabler.rtl.min.css +2 -2
  65. package/dist/css/tabler.rtl.min.css.map +1 -1
  66. package/dist/img/flags/ad.svg +1 -1
  67. package/dist/img/flags/ae.svg +1 -1
  68. package/dist/img/flags/af.svg +1 -1
  69. package/dist/img/flags/afrun.svg +1 -1
  70. package/dist/img/flags/ag.svg +1 -1
  71. package/dist/img/flags/ai.svg +1 -1
  72. package/dist/img/flags/al.svg +1 -1
  73. package/dist/img/flags/am.svg +1 -1
  74. package/dist/img/flags/ao.svg +1 -1
  75. package/dist/img/flags/aq.svg +1 -1
  76. package/dist/img/flags/ar.svg +1 -1
  77. package/dist/img/flags/as.svg +1 -1
  78. package/dist/img/flags/at.svg +1 -1
  79. package/dist/img/flags/au.svg +1 -1
  80. package/dist/img/flags/aw.svg +1 -1
  81. package/dist/img/flags/ax.svg +1 -1
  82. package/dist/img/flags/az.svg +1 -1
  83. package/dist/img/flags/ba.svg +1 -1
  84. package/dist/img/flags/bb.svg +1 -1
  85. package/dist/img/flags/bd.svg +1 -1
  86. package/dist/img/flags/be.svg +1 -1
  87. package/dist/img/flags/bf.svg +1 -1
  88. package/dist/img/flags/bg.svg +1 -1
  89. package/dist/img/flags/bh.svg +1 -1
  90. package/dist/img/flags/bi.svg +1 -1
  91. package/dist/img/flags/bj.svg +1 -1
  92. package/dist/img/flags/bl.svg +1 -1
  93. package/dist/img/flags/bm.svg +1 -1
  94. package/dist/img/flags/bn.svg +1 -1
  95. package/dist/img/flags/bo.svg +1 -1
  96. package/dist/img/flags/bq-bo.svg +1 -1
  97. package/dist/img/flags/bq-sa.svg +1 -1
  98. package/dist/img/flags/bq-se.svg +1 -1
  99. package/dist/img/flags/br.svg +1 -1
  100. package/dist/img/flags/bs.svg +1 -1
  101. package/dist/img/flags/bt.svg +1 -1
  102. package/dist/img/flags/bv.svg +1 -1
  103. package/dist/img/flags/bw.svg +1 -1
  104. package/dist/img/flags/by.svg +1 -1
  105. package/dist/img/flags/bz.svg +1 -1
  106. package/dist/img/flags/ca.svg +1 -1
  107. package/dist/img/flags/cc.svg +1 -1
  108. package/dist/img/flags/cd.svg +1 -1
  109. package/dist/img/flags/cf.svg +1 -1
  110. package/dist/img/flags/cg.svg +1 -1
  111. package/dist/img/flags/ch.svg +1 -1
  112. package/dist/img/flags/ci.svg +1 -1
  113. package/dist/img/flags/ck.svg +1 -1
  114. package/dist/img/flags/cl.svg +1 -1
  115. package/dist/img/flags/cm.svg +1 -1
  116. package/dist/img/flags/cn.svg +1 -1
  117. package/dist/img/flags/co.svg +1 -1
  118. package/dist/img/flags/cr.svg +1 -1
  119. package/dist/img/flags/cu.svg +1 -1
  120. package/dist/img/flags/cv.svg +1 -1
  121. package/dist/img/flags/cw.svg +1 -1
  122. package/dist/img/flags/cx.svg +1 -1
  123. package/dist/img/flags/cy.svg +1 -1
  124. package/dist/img/flags/cz.svg +1 -1
  125. package/dist/img/flags/de.svg +1 -1
  126. package/dist/img/flags/dj.svg +1 -1
  127. package/dist/img/flags/dk.svg +1 -1
  128. package/dist/img/flags/dm.svg +1 -1
  129. package/dist/img/flags/do.svg +1 -1
  130. package/dist/img/flags/dz.svg +1 -1
  131. package/dist/img/flags/ec.svg +1 -1
  132. package/dist/img/flags/ee.svg +1 -1
  133. package/dist/img/flags/eg.svg +1 -1
  134. package/dist/img/flags/eh.svg +1 -1
  135. package/dist/img/flags/er.svg +1 -1
  136. package/dist/img/flags/es.svg +1 -1
  137. package/dist/img/flags/et.svg +1 -1
  138. package/dist/img/flags/eu.svg +1 -1
  139. package/dist/img/flags/fi.svg +1 -1
  140. package/dist/img/flags/fj.svg +1 -1
  141. package/dist/img/flags/fk.svg +1 -1
  142. package/dist/img/flags/fm.svg +1 -1
  143. package/dist/img/flags/fo.svg +1 -1
  144. package/dist/img/flags/fr.svg +1 -1
  145. package/dist/img/flags/ga.svg +1 -1
  146. package/dist/img/flags/gb-eng.svg +1 -1
  147. package/dist/img/flags/gb-nir.svg +1 -1
  148. package/dist/img/flags/gb-sct.svg +1 -1
  149. package/dist/img/flags/gb-wls.svg +1 -1
  150. package/dist/img/flags/gb.svg +1 -1
  151. package/dist/img/flags/gd.svg +1 -1
  152. package/dist/img/flags/ge.svg +1 -1
  153. package/dist/img/flags/gf.svg +1 -1
  154. package/dist/img/flags/gg.svg +1 -1
  155. package/dist/img/flags/gh.svg +1 -1
  156. package/dist/img/flags/gi.svg +1 -1
  157. package/dist/img/flags/gl.svg +1 -1
  158. package/dist/img/flags/gm.svg +1 -1
  159. package/dist/img/flags/gn.svg +1 -1
  160. package/dist/img/flags/gp.svg +1 -1
  161. package/dist/img/flags/gq.svg +1 -1
  162. package/dist/img/flags/gr.svg +1 -1
  163. package/dist/img/flags/gs.svg +1 -1
  164. package/dist/img/flags/gt.svg +1 -1
  165. package/dist/img/flags/gu.svg +1 -1
  166. package/dist/img/flags/gw.svg +1 -1
  167. package/dist/img/flags/gy.svg +1 -1
  168. package/dist/img/flags/hk.svg +1 -1
  169. package/dist/img/flags/hm.svg +1 -1
  170. package/dist/img/flags/hn.svg +1 -1
  171. package/dist/img/flags/hr.svg +1 -1
  172. package/dist/img/flags/ht.svg +1 -1
  173. package/dist/img/flags/hu.svg +1 -1
  174. package/dist/img/flags/id.svg +1 -1
  175. package/dist/img/flags/ie.svg +1 -1
  176. package/dist/img/flags/il.svg +1 -1
  177. package/dist/img/flags/im.svg +1 -1
  178. package/dist/img/flags/in.svg +1 -1
  179. package/dist/img/flags/io.svg +1 -1
  180. package/dist/img/flags/iq.svg +1 -1
  181. package/dist/img/flags/ir.svg +1 -1
  182. package/dist/img/flags/is.svg +1 -1
  183. package/dist/img/flags/it.svg +1 -1
  184. package/dist/img/flags/je.svg +1 -1
  185. package/dist/img/flags/jm.svg +1 -1
  186. package/dist/img/flags/jo.svg +1 -1
  187. package/dist/img/flags/jp.svg +1 -1
  188. package/dist/img/flags/ke.svg +1 -1
  189. package/dist/img/flags/kg.svg +1 -1
  190. package/dist/img/flags/kh.svg +1 -1
  191. package/dist/img/flags/ki.svg +1 -1
  192. package/dist/img/flags/km.svg +1 -1
  193. package/dist/img/flags/kn-sk.svg +1 -1
  194. package/dist/img/flags/kn.svg +1 -1
  195. package/dist/img/flags/kp.svg +1 -1
  196. package/dist/img/flags/kr.svg +1 -1
  197. package/dist/img/flags/kw.svg +1 -1
  198. package/dist/img/flags/ky.svg +1 -1
  199. package/dist/img/flags/kz.svg +1 -1
  200. package/dist/img/flags/la.svg +1 -1
  201. package/dist/img/flags/lb.svg +1 -1
  202. package/dist/img/flags/lc.svg +1 -1
  203. package/dist/img/flags/li.svg +1 -1
  204. package/dist/img/flags/lk.svg +1 -1
  205. package/dist/img/flags/lr.svg +1 -1
  206. package/dist/img/flags/ls.svg +1 -1
  207. package/dist/img/flags/lt.svg +1 -1
  208. package/dist/img/flags/lu.svg +1 -1
  209. package/dist/img/flags/lv.svg +1 -1
  210. package/dist/img/flags/ly.svg +1 -1
  211. package/dist/img/flags/ma.svg +1 -1
  212. package/dist/img/flags/mc.svg +1 -1
  213. package/dist/img/flags/md.svg +1 -1
  214. package/dist/img/flags/me.svg +1 -1
  215. package/dist/img/flags/mf.svg +1 -1
  216. package/dist/img/flags/mg.svg +1 -1
  217. package/dist/img/flags/mh.svg +1 -1
  218. package/dist/img/flags/mk.svg +1 -1
  219. package/dist/img/flags/ml.svg +1 -1
  220. package/dist/img/flags/mm.svg +1 -1
  221. package/dist/img/flags/mn.svg +1 -1
  222. package/dist/img/flags/mo.svg +1 -1
  223. package/dist/img/flags/mp.svg +1 -1
  224. package/dist/img/flags/mq.svg +1 -1
  225. package/dist/img/flags/mr.svg +1 -1
  226. package/dist/img/flags/ms.svg +1 -1
  227. package/dist/img/flags/mt.svg +1 -1
  228. package/dist/img/flags/mu.svg +1 -1
  229. package/dist/img/flags/mv.svg +1 -1
  230. package/dist/img/flags/mw.svg +1 -1
  231. package/dist/img/flags/mx.svg +1 -1
  232. package/dist/img/flags/my.svg +1 -1
  233. package/dist/img/flags/mz.svg +1 -1
  234. package/dist/img/flags/na.svg +1 -1
  235. package/dist/img/flags/nc.svg +1 -1
  236. package/dist/img/flags/ne.svg +1 -1
  237. package/dist/img/flags/nf.svg +1 -1
  238. package/dist/img/flags/ng.svg +1 -1
  239. package/dist/img/flags/ni.svg +1 -1
  240. package/dist/img/flags/nl.svg +1 -1
  241. package/dist/img/flags/no.svg +1 -1
  242. package/dist/img/flags/np.svg +1 -1
  243. package/dist/img/flags/nr.svg +1 -1
  244. package/dist/img/flags/nu.svg +1 -1
  245. package/dist/img/flags/nz.svg +1 -1
  246. package/dist/img/flags/om.svg +1 -1
  247. package/dist/img/flags/pa.svg +1 -1
  248. package/dist/img/flags/pe.svg +1 -1
  249. package/dist/img/flags/pf.svg +1 -1
  250. package/dist/img/flags/pg.svg +1 -1
  251. package/dist/img/flags/ph.svg +1 -1
  252. package/dist/img/flags/pk.svg +1 -1
  253. package/dist/img/flags/pl.svg +1 -1
  254. package/dist/img/flags/pm.svg +1 -1
  255. package/dist/img/flags/pn.svg +1 -1
  256. package/dist/img/flags/pr.svg +1 -1
  257. package/dist/img/flags/ps.svg +1 -1
  258. package/dist/img/flags/pt.svg +1 -1
  259. package/dist/img/flags/pw.svg +1 -1
  260. package/dist/img/flags/py.svg +1 -1
  261. package/dist/img/flags/qa.svg +1 -1
  262. package/dist/img/flags/rainbow.svg +1 -1
  263. package/dist/img/flags/re.svg +1 -1
  264. package/dist/img/flags/ro.svg +1 -1
  265. package/dist/img/flags/rs.svg +1 -1
  266. package/dist/img/flags/ru.svg +1 -1
  267. package/dist/img/flags/rw.svg +1 -1
  268. package/dist/img/flags/sa.svg +1 -1
  269. package/dist/img/flags/sb.svg +1 -1
  270. package/dist/img/flags/sc.svg +1 -1
  271. package/dist/img/flags/sd.svg +1 -1
  272. package/dist/img/flags/se.svg +1 -1
  273. package/dist/img/flags/sg.svg +1 -1
  274. package/dist/img/flags/sh.svg +1 -1
  275. package/dist/img/flags/si.svg +1 -1
  276. package/dist/img/flags/sj.svg +1 -1
  277. package/dist/img/flags/sk.svg +1 -1
  278. package/dist/img/flags/sl.svg +1 -1
  279. package/dist/img/flags/sm.svg +1 -1
  280. package/dist/img/flags/sn.svg +1 -1
  281. package/dist/img/flags/so.svg +1 -1
  282. package/dist/img/flags/sr.svg +1 -1
  283. package/dist/img/flags/ss.svg +1 -1
  284. package/dist/img/flags/st.svg +1 -1
  285. package/dist/img/flags/sv.svg +1 -1
  286. package/dist/img/flags/sx.svg +1 -1
  287. package/dist/img/flags/sy.svg +1 -1
  288. package/dist/img/flags/sz.svg +1 -1
  289. package/dist/img/flags/tc.svg +1 -1
  290. package/dist/img/flags/td.svg +1 -1
  291. package/dist/img/flags/tf.svg +1 -1
  292. package/dist/img/flags/tg.svg +1 -1
  293. package/dist/img/flags/th.svg +1 -1
  294. package/dist/img/flags/tj.svg +1 -1
  295. package/dist/img/flags/tk.svg +1 -1
  296. package/dist/img/flags/tl.svg +1 -1
  297. package/dist/img/flags/tm.svg +1 -1
  298. package/dist/img/flags/tn.svg +1 -1
  299. package/dist/img/flags/to.svg +1 -1
  300. package/dist/img/flags/tr.svg +1 -1
  301. package/dist/img/flags/tt.svg +1 -1
  302. package/dist/img/flags/tv.svg +1 -1
  303. package/dist/img/flags/tw.svg +1 -1
  304. package/dist/img/flags/tz.svg +1 -1
  305. package/dist/img/flags/ua.svg +1 -1
  306. package/dist/img/flags/ug.svg +1 -1
  307. package/dist/img/flags/um.svg +1 -1
  308. package/dist/img/flags/unasur.svg +1 -1
  309. package/dist/img/flags/us.svg +1 -1
  310. package/dist/img/flags/uy.svg +1 -1
  311. package/dist/img/flags/uz.svg +1 -1
  312. package/dist/img/flags/va.svg +1 -1
  313. package/dist/img/flags/vc.svg +1 -1
  314. package/dist/img/flags/ve.svg +1 -1
  315. package/dist/img/flags/vg.svg +1 -1
  316. package/dist/img/flags/vi.svg +1 -1
  317. package/dist/img/flags/vn.svg +1 -1
  318. package/dist/img/flags/vu.svg +1 -1
  319. package/dist/img/flags/wf.svg +1 -1
  320. package/dist/img/flags/ws.svg +1 -1
  321. package/dist/img/flags/ye.svg +1 -1
  322. package/dist/img/flags/yt.svg +1 -1
  323. package/dist/img/flags/za.svg +1 -1
  324. package/dist/img/flags/zm.svg +1 -1
  325. package/dist/img/flags/zw.svg +1 -1
  326. package/dist/img/payments/2c2p-dark.svg +1 -5
  327. package/dist/img/payments/2c2p.svg +1 -5
  328. package/dist/img/payments/2checkout-dark.svg +1 -4
  329. package/dist/img/payments/2checkout.svg +1 -4
  330. package/dist/img/payments/ach-transfer-dark.svg +1 -14
  331. package/dist/img/payments/ach-transfer.svg +1 -14
  332. package/dist/img/payments/adyen-dark.svg +1 -8
  333. package/dist/img/payments/adyen.svg +1 -8
  334. package/dist/img/payments/affirm-dark.svg +1 -9
  335. package/dist/img/payments/affirm.svg +1 -9
  336. package/dist/img/payments/afterpay-dark.svg +1 -13
  337. package/dist/img/payments/afterpay.svg +1 -13
  338. package/dist/img/payments/airtm-dark.svg +1 -4
  339. package/dist/img/payments/airtm.svg +1 -4
  340. package/dist/img/payments/airwallex-dark.svg +1 -11
  341. package/dist/img/payments/airwallex.svg +1 -11
  342. package/dist/img/payments/alipay-dark.svg +1 -12
  343. package/dist/img/payments/alipay-plus-dark.svg +1 -9
  344. package/dist/img/payments/alipay-plus.svg +1 -9
  345. package/dist/img/payments/alipay.svg +1 -12
  346. package/dist/img/payments/allegro-pay-dark.svg +1 -5
  347. package/dist/img/payments/allegro-pay.svg +1 -5
  348. package/dist/img/payments/amazon-dark.svg +1 -6
  349. package/dist/img/payments/amazon-pay-dark.svg +1 -7
  350. package/dist/img/payments/amazon-pay.svg +1 -7
  351. package/dist/img/payments/amazon.svg +1 -6
  352. package/dist/img/payments/americanexpress-dark.svg +1 -4
  353. package/dist/img/payments/americanexpress.svg +1 -4
  354. package/dist/img/payments/ant-group-dark.svg +1 -6
  355. package/dist/img/payments/ant-group.svg +1 -23
  356. package/dist/img/payments/applepay-dark.svg +1 -8
  357. package/dist/img/payments/applepay.svg +1 -8
  358. package/dist/img/payments/authorize-dark.svg +1 -17
  359. package/dist/img/payments/authorize.svg +1 -17
  360. package/dist/img/payments/autopay-dark.svg +1 -11
  361. package/dist/img/payments/autopay.svg +1 -11
  362. package/dist/img/payments/bancontact-dark.svg +1 -9
  363. package/dist/img/payments/bancontact.svg +1 -9
  364. package/dist/img/payments/bank-of-america-dark.svg +1 -10
  365. package/dist/img/payments/bank-of-america.svg +1 -10
  366. package/dist/img/payments/barclays-dark.svg +1 -11
  367. package/dist/img/payments/barclays.svg +1 -11
  368. package/dist/img/payments/bbva-dark.svg +1 -4
  369. package/dist/img/payments/bbva.svg +1 -4
  370. package/dist/img/payments/binance-dark.svg +1 -4
  371. package/dist/img/payments/binance-usd-dark.svg +1 -11
  372. package/dist/img/payments/binance-usd.svg +1 -11
  373. package/dist/img/payments/binance.svg +1 -4
  374. package/dist/img/payments/bitcoin-dark.svg +1 -13
  375. package/dist/img/payments/bitcoin.svg +1 -12
  376. package/dist/img/payments/bitpay-dark.svg +1 -4
  377. package/dist/img/payments/bitpay.svg +1 -4
  378. package/dist/img/payments/bkash-dark.svg +1 -16
  379. package/dist/img/payments/bkash.svg +1 -16
  380. package/dist/img/payments/blik-dark.svg +1 -5
  381. package/dist/img/payments/blik.svg +1 -12
  382. package/dist/img/payments/bnb-chain-dark.svg +1 -14
  383. package/dist/img/payments/bnb-chain.svg +1 -14
  384. package/dist/img/payments/bnp-paribas-dark.svg +1 -80
  385. package/dist/img/payments/bnp-paribas.svg +1 -80
  386. package/dist/img/payments/braintree-dark.svg +1 -6
  387. package/dist/img/payments/braintree.svg +1 -6
  388. package/dist/img/payments/brex-dark.svg +1 -4
  389. package/dist/img/payments/brex.svg +1 -4
  390. package/dist/img/payments/capital-one-dark.svg +1 -6
  391. package/dist/img/payments/capital-one.svg +1 -6
  392. package/dist/img/payments/cash-app-dark.svg +1 -8
  393. package/dist/img/payments/cash-app.svg +1 -8
  394. package/dist/img/payments/chase-dark.svg +1 -12
  395. package/dist/img/payments/chase.svg +1 -12
  396. package/dist/img/payments/checkout-com-dark.svg +1 -4
  397. package/dist/img/payments/checkout-com.svg +1 -4
  398. package/dist/img/payments/chime-dark.svg +1 -9
  399. package/dist/img/payments/chime.svg +1 -9
  400. package/dist/img/payments/china-construction-bank-dark.svg +1 -36
  401. package/dist/img/payments/china-construction-bank.svg +1 -36
  402. package/dist/img/payments/cirrus-dark.svg +1 -8
  403. package/dist/img/payments/cirrus.svg +1 -8
  404. package/dist/img/payments/citi-dark.svg +1 -8
  405. package/dist/img/payments/citi.svg +1 -8
  406. package/dist/img/payments/coinbase-dark.svg +1 -4
  407. package/dist/img/payments/coinbase.svg +1 -5
  408. package/dist/img/payments/coinkite-dark.svg +1 -6
  409. package/dist/img/payments/coinkite.svg +1 -6
  410. package/dist/img/payments/crypto-com-dark.svg +1 -8
  411. package/dist/img/payments/crypto-com.svg +1 -8
  412. package/dist/img/payments/deutsche-bank-dark.svg +1 -16
  413. package/dist/img/payments/deutsche-bank.svg +1 -16
  414. package/dist/img/payments/dinersclub-dark.svg +1 -7
  415. package/dist/img/payments/dinersclub.svg +1 -7
  416. package/dist/img/payments/directdebit-dark.svg +1 -4
  417. package/dist/img/payments/directdebit.svg +1 -4
  418. package/dist/img/payments/discover-dark.svg +1 -8
  419. package/dist/img/payments/discover.svg +1 -6
  420. package/dist/img/payments/dwolla-dark.svg +1 -5
  421. package/dist/img/payments/dwolla.svg +1 -5
  422. package/dist/img/payments/easypaisa-dark.svg +1 -14
  423. package/dist/img/payments/easypaisa.svg +1 -14
  424. package/dist/img/payments/ebay-dark.svg +1 -7
  425. package/dist/img/payments/ebay.svg +1 -7
  426. package/dist/img/payments/elo-dark.svg +1 -11
  427. package/dist/img/payments/elo.svg +1 -11
  428. package/dist/img/payments/epayco-dark.svg +1 -5
  429. package/dist/img/payments/epayco.svg +1 -5
  430. package/dist/img/payments/esewa-dark.svg +1 -11
  431. package/dist/img/payments/esewa.svg +1 -12
  432. package/dist/img/payments/ethereum-dark.svg +1 -13
  433. package/dist/img/payments/ethereum.svg +1 -18
  434. package/dist/img/payments/eway-dark.svg +1 -6
  435. package/dist/img/payments/eway.svg +1 -6
  436. package/dist/img/payments/fifth-third-bank-dark.svg +1 -7
  437. package/dist/img/payments/fifth-third-bank.svg +1 -7
  438. package/dist/img/payments/fiserv-dark.svg +1 -11
  439. package/dist/img/payments/fiserv.svg +1 -11
  440. package/dist/img/payments/flutterwave-dark.svg +1 -18
  441. package/dist/img/payments/flutterwave.svg +1 -18
  442. package/dist/img/payments/fonepay-dark.svg +1 -10
  443. package/dist/img/payments/fonepay.svg +1 -10
  444. package/dist/img/payments/gcash-dark.svg +1 -7
  445. package/dist/img/payments/gcash.svg +1 -7
  446. package/dist/img/payments/giropay-dark.svg +1 -13
  447. package/dist/img/payments/giropay.svg +1 -25
  448. package/dist/img/payments/goldman-sachs-dark.svg +1 -4
  449. package/dist/img/payments/goldman-sachs.svg +1 -4
  450. package/dist/img/payments/google-pay-dark.svg +1 -10
  451. package/dist/img/payments/google-pay.svg +1 -10
  452. package/dist/img/payments/googlewallet-dark.svg +1 -7
  453. package/dist/img/payments/googlewallet.svg +1 -7
  454. package/dist/img/payments/grabpay-dark.svg +1 -4
  455. package/dist/img/payments/grabpay.svg +1 -4
  456. package/dist/img/payments/hsbc-dark.svg +1 -12
  457. package/dist/img/payments/hsbc.svg +1 -12
  458. package/dist/img/payments/hubspot-dark.svg +1 -5
  459. package/dist/img/payments/hubspot.svg +1 -5
  460. package/dist/img/payments/huntington-bank-dark.svg +1 -5
  461. package/dist/img/payments/huntington-bank.svg +1 -5
  462. package/dist/img/payments/icbc-dark.svg +1 -8
  463. package/dist/img/payments/icbc.svg +1 -8
  464. package/dist/img/payments/ideal-dark.svg +1 -8
  465. package/dist/img/payments/ideal.svg +1 -7
  466. package/dist/img/payments/imepay-dark.svg +1 -11
  467. package/dist/img/payments/imepay.svg +1 -11
  468. package/dist/img/payments/imoje-dark.svg +1 -7
  469. package/dist/img/payments/imoje.svg +1 -8
  470. package/dist/img/payments/ing-dark.svg +1 -145
  471. package/dist/img/payments/ing.svg +1 -145
  472. package/dist/img/payments/ingenico-dark.svg +1 -4
  473. package/dist/img/payments/ingenico.svg +1 -4
  474. package/dist/img/payments/interac-dark.svg +1 -16
  475. package/dist/img/payments/interac.svg +1 -16
  476. package/dist/img/payments/jazzcash-dark.svg +1 -13
  477. package/dist/img/payments/jazzcash.svg +1 -13
  478. package/dist/img/payments/jcb-dark.svg +1 -8
  479. package/dist/img/payments/jcb.svg +1 -41
  480. package/dist/img/payments/khalti-dark.svg +1 -14
  481. package/dist/img/payments/khalti.svg +1 -14
  482. package/dist/img/payments/klarna-dark.svg +1 -11
  483. package/dist/img/payments/klarna.svg +1 -11
  484. package/dist/img/payments/kraken-dark.svg +1 -5
  485. package/dist/img/payments/kraken.svg +1 -5
  486. package/dist/img/payments/linepay-dark.svg +1 -10
  487. package/dist/img/payments/linepay.svg +1 -11
  488. package/dist/img/payments/litecoin-dark.svg +1 -14
  489. package/dist/img/payments/litecoin.svg +1 -14
  490. package/dist/img/payments/mada-dark.svg +1 -11
  491. package/dist/img/payments/mada.svg +1 -11
  492. package/dist/img/payments/maestro-dark.svg +1 -6
  493. package/dist/img/payments/maestro.svg +1 -6
  494. package/dist/img/payments/mastercard-dark.svg +1 -6
  495. package/dist/img/payments/mastercard.svg +1 -6
  496. package/dist/img/payments/mercado-pago-dark.svg +1 -9
  497. package/dist/img/payments/mercado-pago.svg +1 -9
  498. package/dist/img/payments/mercury-dark.svg +1 -4
  499. package/dist/img/payments/mercury.svg +1 -4
  500. package/dist/img/payments/meta-pay-dark.svg +1 -6
  501. package/dist/img/payments/meta-pay.svg +1 -16
  502. package/dist/img/payments/metamask-dark.svg +1 -40
  503. package/dist/img/payments/metamask.svg +1 -40
  504. package/dist/img/payments/mir-dark.svg +1 -4
  505. package/dist/img/payments/mir.svg +1 -11
  506. package/dist/img/payments/mitsubishi-ufj-dark.svg +1 -5
  507. package/dist/img/payments/mitsubishi-ufj.svg +1 -5
  508. package/dist/img/payments/mobilepay-dark.svg +1 -6
  509. package/dist/img/payments/mobilepay.svg +1 -6
  510. package/dist/img/payments/mollie-dark.svg +1 -4
  511. package/dist/img/payments/mollie.svg +1 -4
  512. package/dist/img/payments/monero-dark.svg +1 -5
  513. package/dist/img/payments/monero.svg +1 -5
  514. package/dist/img/payments/moneygram-dark.svg +1 -12
  515. package/dist/img/payments/moneygram.svg +1 -12
  516. package/dist/img/payments/mpesa-dark.svg +1 -5
  517. package/dist/img/payments/mpesa.svg +1 -5
  518. package/dist/img/payments/ncr-dark.svg +1 -9
  519. package/dist/img/payments/ncr.svg +1 -9
  520. package/dist/img/payments/neteller-dark.svg +1 -4
  521. package/dist/img/payments/neteller.svg +1 -4
  522. package/dist/img/payments/northone-dark.svg +1 -5
  523. package/dist/img/payments/northone.svg +1 -5
  524. package/dist/img/payments/nu-dark.svg +1 -5
  525. package/dist/img/payments/nu.svg +1 -5
  526. package/dist/img/payments/nuvei-dark.svg +1 -9
  527. package/dist/img/payments/nuvei.svg +1 -9
  528. package/dist/img/payments/opensea-dark.svg +1 -11
  529. package/dist/img/payments/opensea.svg +1 -11
  530. package/dist/img/payments/oxxo-dark.svg +1 -8
  531. package/dist/img/payments/oxxo.svg +1 -8
  532. package/dist/img/payments/paybox-dark.svg +1 -4
  533. package/dist/img/payments/paybox.svg +1 -4
  534. package/dist/img/payments/payconiq-dark.svg +1 -4
  535. package/dist/img/payments/payconiq.svg +1 -4
  536. package/dist/img/payments/payka-dark.svg +1 -18
  537. package/dist/img/payments/payka.svg +1 -12
  538. package/dist/img/payments/payline-dark.svg +1 -12
  539. package/dist/img/payments/payline.svg +1 -12
  540. package/dist/img/payments/paynow-dark.svg +1 -15
  541. package/dist/img/payments/paynow.svg +1 -15
  542. package/dist/img/payments/payone-dark.svg +1 -7
  543. package/dist/img/payments/payone.svg +1 -7
  544. package/dist/img/payments/payoneer-dark.svg +1 -4
  545. package/dist/img/payments/payoneer.svg +1 -4
  546. package/dist/img/payments/paypal-dark.svg +1 -8
  547. package/dist/img/payments/paypal.svg +1 -8
  548. package/dist/img/payments/paypay-dark.svg +1 -6
  549. package/dist/img/payments/paypay.svg +1 -6
  550. package/dist/img/payments/paypo-dark.svg +1 -11
  551. package/dist/img/payments/paypo.svg +1 -11
  552. package/dist/img/payments/paysafe-dark.svg +1 -6
  553. package/dist/img/payments/paysafe.svg +1 -6
  554. package/dist/img/payments/paysafecard-dark.svg +1 -4
  555. package/dist/img/payments/paysafecard.svg +1 -4
  556. package/dist/img/payments/paystack-dark.svg +1 -5
  557. package/dist/img/payments/paystack.svg +1 -5
  558. package/dist/img/payments/paytm-dark.svg +1 -8
  559. package/dist/img/payments/paytm.svg +1 -8
  560. package/dist/img/payments/payu-dark.svg +1 -4
  561. package/dist/img/payments/payu.svg +1 -4
  562. package/dist/img/payments/phonepe-dark.svg +1 -6
  563. package/dist/img/payments/phonepe.svg +1 -6
  564. package/dist/img/payments/pix-dark.svg +1 -6
  565. package/dist/img/payments/pix.svg +1 -6
  566. package/dist/img/payments/pnc-bank-dark.svg +1 -8
  567. package/dist/img/payments/pnc-bank.svg +1 -8
  568. package/dist/img/payments/poli-dark.svg +1 -8
  569. package/dist/img/payments/poli.svg +1 -8
  570. package/dist/img/payments/przelewy24-dark.svg +1 -18
  571. package/dist/img/payments/przelewy24.svg +1 -8
  572. package/dist/img/payments/rapyd-dark.svg +1 -8
  573. package/dist/img/payments/rapyd.svg +1 -8
  574. package/dist/img/payments/razorpay-dark.svg +1 -5
  575. package/dist/img/payments/razorpay.svg +1 -5
  576. package/dist/img/payments/revolut-pay-dark.svg +1 -8
  577. package/dist/img/payments/revolut-pay.svg +1 -8
  578. package/dist/img/payments/ripple-dark.svg +1 -5
  579. package/dist/img/payments/ripple.svg +1 -5
  580. package/dist/img/payments/rupay-dark.svg +1 -10
  581. package/dist/img/payments/rupay.svg +1 -10
  582. package/dist/img/payments/samsung-pay-dark.svg +1 -13
  583. package/dist/img/payments/samsung-pay.svg +1 -13
  584. package/dist/img/payments/santander-dark.svg +1 -4
  585. package/dist/img/payments/santander.svg +1 -4
  586. package/dist/img/payments/sepa-dark.svg +1 -5
  587. package/dist/img/payments/sepa.svg +1 -5
  588. package/dist/img/payments/shop-pay-dark.svg +1 -4
  589. package/dist/img/payments/shop-pay.svg +1 -4
  590. package/dist/img/payments/shopify-dark.svg +1 -6
  591. package/dist/img/payments/shopify.svg +1 -7
  592. package/dist/img/payments/skrill-dark.svg +1 -10
  593. package/dist/img/payments/skrill.svg +1 -10
  594. package/dist/img/payments/skycash-dark.svg +1 -10
  595. package/dist/img/payments/skycash.svg +1 -10
  596. package/dist/img/payments/sofort-dark.svg +1 -6
  597. package/dist/img/payments/sofort.svg +1 -6
  598. package/dist/img/payments/solana-dark.svg +1 -20
  599. package/dist/img/payments/solana.svg +1 -20
  600. package/dist/img/payments/spingo-dark.svg +1 -11
  601. package/dist/img/payments/spingo.svg +1 -11
  602. package/dist/img/payments/square-dark.svg +1 -4
  603. package/dist/img/payments/square.svg +1 -4
  604. package/dist/img/payments/stax-dark.svg +1 -5
  605. package/dist/img/payments/stax.svg +1 -5
  606. package/dist/img/payments/stcpay-dark.svg +1 -7
  607. package/dist/img/payments/stcpay.svg +1 -7
  608. package/dist/img/payments/stripe-dark.svg +1 -4
  609. package/dist/img/payments/stripe.svg +1 -4
  610. package/dist/img/payments/sumitomo-mitsui-dark.svg +1 -5
  611. package/dist/img/payments/sumitomo-mitsui.svg +1 -5
  612. package/dist/img/payments/swift-dark.svg +1 -4
  613. package/dist/img/payments/swift.svg +1 -4
  614. package/dist/img/payments/swish-dark.svg +1 -32
  615. package/dist/img/payments/swish.svg +1 -32
  616. package/dist/img/payments/synchrony-dark.svg +1 -5
  617. package/dist/img/payments/synchrony.svg +1 -5
  618. package/dist/img/payments/tether-dark.svg +1 -11
  619. package/dist/img/payments/tether.svg +1 -11
  620. package/dist/img/payments/tpay-dark.svg +1 -10
  621. package/dist/img/payments/tpay.svg +1 -4
  622. package/dist/img/payments/troy-dark.svg +1 -7
  623. package/dist/img/payments/troy.svg +1 -7
  624. package/dist/img/payments/true-usd-dark.svg +1 -5
  625. package/dist/img/payments/true-usd.svg +1 -7
  626. package/dist/img/payments/trustly-dark.svg +1 -11
  627. package/dist/img/payments/trustly.svg +1 -11
  628. package/dist/img/payments/twint-dark.svg +1 -29
  629. package/dist/img/payments/twint.svg +1 -29
  630. package/dist/img/payments/ubs-dark.svg +1 -5
  631. package/dist/img/payments/ubs.svg +1 -5
  632. package/dist/img/payments/unionpay-dark.svg +1 -6
  633. package/dist/img/payments/unionpay.svg +1 -7
  634. package/dist/img/payments/upi-dark.svg +1 -8
  635. package/dist/img/payments/upi.svg +1 -8
  636. package/dist/img/payments/us-bank-dark.svg +1 -13
  637. package/dist/img/payments/us-bank.svg +1 -13
  638. package/dist/img/payments/usdc-dark.svg +1 -4
  639. package/dist/img/payments/usdc.svg +1 -4
  640. package/dist/img/payments/venmo-dark.svg +1 -4
  641. package/dist/img/payments/venmo.svg +1 -4
  642. package/dist/img/payments/verifone-dark.svg +1 -5
  643. package/dist/img/payments/verifone.svg +1 -5
  644. package/dist/img/payments/vipps-dark.svg +1 -8
  645. package/dist/img/payments/vipps.svg +1 -8
  646. package/dist/img/payments/visa-dark.svg +1 -4
  647. package/dist/img/payments/visa.svg +1 -4
  648. package/dist/img/payments/we-chat-pay-dark.svg +1 -4
  649. package/dist/img/payments/we-chat-pay.svg +1 -4
  650. package/dist/img/payments/webmoney-dark.svg +1 -5
  651. package/dist/img/payments/webmoney.svg +1 -5
  652. package/dist/img/payments/wells-fargo-dark.svg +1 -4
  653. package/dist/img/payments/wells-fargo.svg +1 -4
  654. package/dist/img/payments/westernunion-dark.svg +1 -18
  655. package/dist/img/payments/westernunion.svg +1 -18
  656. package/dist/img/payments/wire-transfer-dark.svg +1 -32
  657. package/dist/img/payments/wire-transfer.svg +1 -32
  658. package/dist/img/payments/wise-dark.svg +1 -4
  659. package/dist/img/payments/wise.svg +1 -4
  660. package/dist/img/payments/worldpay-dark.svg +1 -4
  661. package/dist/img/payments/worldpay.svg +1 -5
  662. package/dist/img/payments/zelle-dark.svg +1 -9
  663. package/dist/img/payments/zelle.svg +1 -8
  664. package/dist/img/social/apple-gray.svg +1 -3
  665. package/dist/img/social/apple.svg +1 -3
  666. package/dist/img/social/discord-gray.svg +1 -3
  667. package/dist/img/social/discord.svg +1 -3
  668. package/dist/img/social/dribbble-gray.svg +1 -3
  669. package/dist/img/social/dribbble.svg +1 -4
  670. package/dist/img/social/facebook-gray.svg +1 -3
  671. package/dist/img/social/facebook.svg +1 -4
  672. package/dist/img/social/figma-gray.svg +1 -3
  673. package/dist/img/social/figma.svg +1 -7
  674. package/dist/img/social/github-gray.svg +1 -10
  675. package/dist/img/social/github.svg +1 -10
  676. package/dist/img/social/google-gray.svg +1 -3
  677. package/dist/img/social/google.svg +1 -6
  678. package/dist/img/social/instagram-gray.svg +1 -5
  679. package/dist/img/social/instagram.svg +1 -18
  680. package/dist/img/social/linkedin-gray.svg +1 -3
  681. package/dist/img/social/linkedin.svg +1 -3
  682. package/dist/img/social/medium-gray.svg +1 -5
  683. package/dist/img/social/medium.svg +1 -5
  684. package/dist/img/social/meta-gray.svg +1 -5
  685. package/dist/img/social/meta.svg +1 -17
  686. package/dist/img/social/metamask-gray.svg +1 -12
  687. package/dist/img/social/metamask.svg +1 -14
  688. package/dist/img/social/pinterest-gray.svg +1 -3
  689. package/dist/img/social/pinterest.svg +1 -4
  690. package/dist/img/social/reddit-gray.svg +1 -6
  691. package/dist/img/social/reddit.svg +1 -11
  692. package/dist/img/social/signal-gray.svg +1 -10
  693. package/dist/img/social/signal.svg +1 -10
  694. package/dist/img/social/skype-gray.svg +1 -3
  695. package/dist/img/social/skype.svg +1 -3
  696. package/dist/img/social/snapchat-gray.svg +1 -10
  697. package/dist/img/social/snapchat.svg +1 -11
  698. package/dist/img/social/spotify-gray.svg +1 -3
  699. package/dist/img/social/spotify.svg +1 -3
  700. package/dist/img/social/telegram-gray.svg +1 -3
  701. package/dist/img/social/telegram.svg +1 -10
  702. package/dist/img/social/tiktok-gray.svg +1 -3
  703. package/dist/img/social/tiktok.svg +1 -5
  704. package/dist/img/social/tumblr-gray.svg +1 -3
  705. package/dist/img/social/tumblr.svg +1 -3
  706. package/dist/img/social/twitch-gray.svg +1 -5
  707. package/dist/img/social/twitch.svg +1 -6
  708. package/dist/img/social/vk-gray.svg +1 -3
  709. package/dist/img/social/vk.svg +1 -4
  710. package/dist/img/social/x-gray.svg +1 -3
  711. package/dist/img/social/x.svg +1 -3
  712. package/dist/img/social/youtube-gray.svg +1 -3
  713. package/dist/img/social/youtube.svg +1 -11
  714. package/dist/js/tabler-theme.esm.js +6 -4
  715. package/dist/js/tabler-theme.esm.js.map +1 -1
  716. package/dist/js/tabler-theme.esm.min.js +2 -2
  717. package/dist/js/tabler-theme.esm.min.js.map +1 -1
  718. package/dist/js/tabler-theme.js +6 -4
  719. package/dist/js/tabler-theme.js.map +1 -1
  720. package/dist/js/tabler-theme.min.js +2 -2
  721. package/dist/js/tabler-theme.min.js.map +1 -1
  722. package/dist/js/tabler.esm.js +5999 -3586
  723. package/dist/js/tabler.esm.js.map +1 -1
  724. package/dist/js/tabler.esm.min.js +2 -2
  725. package/dist/js/tabler.esm.min.js.map +1 -1
  726. package/dist/js/tabler.js +6010 -3586
  727. package/dist/js/tabler.js.map +1 -1
  728. package/dist/js/tabler.min.js +2 -2
  729. package/dist/js/tabler.min.js.map +1 -1
  730. package/dist/libs/vanilla-calendar-pro/LICENSE +21 -0
  731. package/dist/libs/vanilla-calendar-pro/index.js +2 -0
  732. package/dist/types/src/autosize.d.ts +32 -1
  733. package/dist/types/src/bootstrap/alert.d.ts +2 -0
  734. package/dist/types/src/bootstrap/button.d.ts +3 -0
  735. package/dist/types/src/bootstrap/carousel.d.ts +16 -3
  736. package/dist/types/src/bootstrap/collapse.d.ts +13 -3
  737. package/dist/types/src/bootstrap/dom/event-handler.d.ts +7 -4
  738. package/dist/types/src/bootstrap/dropdown.d.ts +30 -7
  739. package/dist/types/src/bootstrap/modal.d.ts +12 -8
  740. package/dist/types/src/bootstrap/offcanvas.d.ts +12 -8
  741. package/dist/types/src/bootstrap/popover.d.ts +13 -9
  742. package/dist/types/src/bootstrap/scrollspy.d.ts +17 -3
  743. package/dist/types/src/bootstrap/tab.d.ts +2 -0
  744. package/dist/types/src/bootstrap/toast.d.ts +12 -3
  745. package/dist/types/src/bootstrap/tooltip.d.ts +57 -19
  746. package/dist/types/src/bootstrap/types.d.ts +25 -1
  747. package/dist/types/src/bootstrap/util/backdrop.d.ts +2 -2
  748. package/dist/types/src/bootstrap/util/component-functions.d.ts +22 -2
  749. package/dist/types/src/bootstrap/util/focustrap.d.ts +2 -2
  750. package/dist/types/src/bootstrap/util/index.d.ts +5 -1
  751. package/dist/types/src/bootstrap/util/swipe.d.ts +2 -2
  752. package/dist/types/src/bootstrap/util/template-factory.d.ts +2 -2
  753. package/dist/types/src/clipboard.d.ts +45 -0
  754. package/dist/types/src/confetti.d.ts +58 -0
  755. package/dist/types/src/countup.d.ts +64 -1
  756. package/dist/types/src/datepicker.d.ts +102 -0
  757. package/dist/types/src/deprecated.d.ts +11 -0
  758. package/dist/types/src/input-mask.d.ts +42 -1
  759. package/dist/types/src/otp-input.d.ts +71 -0
  760. package/dist/types/src/sortable.d.ts +41 -1
  761. package/dist/types/src/sparkline.d.ts +67 -0
  762. package/dist/types/src/strength.d.ts +52 -0
  763. package/dist/types/src/switch-icon.d.ts +31 -1
  764. package/dist/types/src/theme-config.d.ts +3 -1
  765. package/dist/types/tabler.d.ts +18 -1
  766. package/js/src/autosize.ts +136 -7
  767. package/js/src/bootstrap/alert.ts +20 -0
  768. package/js/src/bootstrap/base-component.ts +1 -1
  769. package/js/src/bootstrap/button.ts +16 -0
  770. package/js/src/bootstrap/carousel.ts +42 -7
  771. package/js/src/bootstrap/collapse.ts +38 -6
  772. package/js/src/bootstrap/dom/event-handler.ts +50 -16
  773. package/js/src/bootstrap/dropdown.ts +61 -22
  774. package/js/src/bootstrap/modal.ts +39 -14
  775. package/js/src/bootstrap/offcanvas.ts +36 -11
  776. package/js/src/bootstrap/popover.ts +35 -9
  777. package/js/src/bootstrap/scrollspy.ts +38 -7
  778. package/js/src/bootstrap/tab.ts +20 -1
  779. package/js/src/bootstrap/toast.ts +31 -5
  780. package/js/src/bootstrap/tooltip.ts +109 -53
  781. package/js/src/bootstrap/types.ts +30 -1
  782. package/js/src/bootstrap/util/backdrop.ts +1 -1
  783. package/js/src/bootstrap/util/component-functions.ts +74 -5
  784. package/js/src/bootstrap/util/focustrap.ts +2 -2
  785. package/js/src/bootstrap/util/index.ts +46 -2
  786. package/js/src/bootstrap/util/swipe.ts +3 -3
  787. package/js/src/bootstrap/util/template-factory.ts +2 -2
  788. package/js/src/clipboard.ts +197 -0
  789. package/js/src/confetti.ts +439 -0
  790. package/js/src/countup.ts +335 -29
  791. package/js/src/datepicker.ts +671 -0
  792. package/js/src/deprecated.ts +28 -0
  793. package/js/src/dropdown.ts +1 -1
  794. package/js/src/global.d.ts +12 -13
  795. package/js/src/input-mask.ts +128 -8
  796. package/js/src/otp-input.ts +432 -0
  797. package/js/src/sortable.ts +116 -15
  798. package/js/src/sparkline.ts +609 -0
  799. package/js/src/strength.ts +277 -0
  800. package/js/src/switch-icon.ts +165 -9
  801. package/js/src/theme-config.ts +3 -1
  802. package/js/tabler-theme.ts +2 -4
  803. package/js/tabler.ts +21 -2
  804. package/libs.json +45 -109
  805. package/package.json +40 -29
  806. package/scss/_config.scss +1 -0
  807. package/scss/_core.scss +6 -0
  808. package/scss/_deprecated-props.scss +40 -0
  809. package/scss/_deprecated.scss +153 -0
  810. package/scss/_extends.scss +6 -1
  811. package/scss/_maps.scss +10 -11
  812. package/scss/_mixins.scss +1 -0
  813. package/scss/_props.scss +40 -6
  814. package/scss/_settings.scss +3 -1
  815. package/scss/_utilities-marketing.scss +1 -2
  816. package/scss/_utilities.scss +62 -24
  817. package/scss/_variables-dark.scss +31 -42
  818. package/scss/_variables-deprecated.scss +60 -0
  819. package/scss/_variables.scss +252 -189
  820. package/scss/bootstrap/_buttons.scss +6 -33
  821. package/scss/bootstrap/_carousel.scss +6 -7
  822. package/scss/bootstrap/_list-group.scss +28 -14
  823. package/scss/bootstrap/_nav.scss +2 -2
  824. package/scss/bootstrap/_navbar.scss +6 -7
  825. package/scss/bootstrap/_offcanvas.scss +2 -0
  826. package/scss/bootstrap/_pagination.scss +7 -3
  827. package/scss/bootstrap/_reboot.scss +3 -3
  828. package/scss/bootstrap/_root.scss +10 -33
  829. package/scss/bootstrap/_tables.scss +7 -2
  830. package/scss/bootstrap/forms/_floating-labels.scss +1 -1
  831. package/scss/bootstrap/forms/_form-check.scss +54 -42
  832. package/scss/bootstrap/forms/_form-control.scss +4 -8
  833. package/scss/bootstrap/forms/_form-range.scss +4 -2
  834. package/scss/bootstrap/forms/_form-select.scss +4 -7
  835. package/scss/helpers/_index.scss +11 -4
  836. package/scss/layout/_accessibility.scss +2 -1
  837. package/scss/layout/_core.scss +0 -8
  838. package/scss/layout/_navbar.scss +129 -44
  839. package/scss/layout/_page.scss +15 -2
  840. package/scss/layout/_root.scss +4 -3
  841. package/scss/marketing/_hero.scss +0 -11
  842. package/scss/mixins/_deprecated.scss +110 -0
  843. package/scss/mixins/_functions.scss +67 -113
  844. package/scss/mixins/_mixins.scss +41 -8
  845. package/scss/mixins/bootstrap/_caret.scss +7 -6
  846. package/scss/mixins/bootstrap/_color-mode.scss +6 -0
  847. package/scss/mixins/bootstrap/_forms.scss +10 -11
  848. package/scss/mixins/bootstrap/_gradients.scss +1 -1
  849. package/scss/mixins/bootstrap/_table-variants.scss +4 -5
  850. package/scss/tabler-props.scss +5 -0
  851. package/scss/tabler-themes.scss +67 -66
  852. package/scss/tabler-vendors.scss +3 -1
  853. package/scss/tabler.scss +2 -0
  854. package/scss/ui/_accordion.scss +24 -31
  855. package/scss/ui/_alerts.scss +29 -8
  856. package/scss/ui/_avatars.scss +3 -1
  857. package/scss/ui/_badges.scss +2 -0
  858. package/scss/ui/_breadcrumbs.scss +2 -0
  859. package/scss/ui/_buttons.scss +83 -58
  860. package/scss/ui/_calendars.scss +4 -5
  861. package/scss/ui/_cards.scss +38 -33
  862. package/scss/ui/_carousel.scss +1 -1
  863. package/scss/ui/_chat.scss +2 -0
  864. package/scss/ui/_close.scss +5 -2
  865. package/scss/ui/_datagrid.scss +2 -0
  866. package/scss/ui/_datepicker.scss +425 -0
  867. package/scss/ui/_dropdowns.scss +5 -1
  868. package/scss/ui/_empty.scss +2 -0
  869. package/scss/ui/_forms.scss +33 -47
  870. package/scss/ui/_icons.scss +2 -0
  871. package/scss/ui/_legend.scss +145 -2
  872. package/scss/ui/_lists.scss +3 -3
  873. package/scss/ui/_markdown.scss +1 -0
  874. package/scss/ui/_modals.scss +20 -1
  875. package/scss/ui/_nav.scss +3 -3
  876. package/scss/ui/_offcanvas.scss +47 -0
  877. package/scss/ui/_patterns.scss +39 -18
  878. package/scss/ui/_progress.scss +5 -2
  879. package/scss/ui/_ribbons.scss +6 -2
  880. package/scss/ui/_segmented.scss +1 -1
  881. package/scss/ui/_signal.scss +57 -0
  882. package/scss/ui/_sortable.scss +73 -0
  883. package/scss/ui/_sparkline.scss +73 -0
  884. package/scss/ui/_stars.scss +2 -0
  885. package/scss/ui/_status.scss +2 -2
  886. package/scss/ui/_steps.scss +2 -0
  887. package/scss/ui/_switch-icon.scss +67 -11
  888. package/scss/ui/_tables.scss +3 -3
  889. package/scss/ui/_tags.scss +2 -0
  890. package/scss/ui/_timeline.scss +2 -0
  891. package/scss/ui/_tracking.scss +2 -0
  892. package/scss/ui/_type.scss +12 -4
  893. package/scss/ui/forms/_form-check.scss +10 -2
  894. package/scss/ui/forms/_form-colorinput.scss +4 -3
  895. package/scss/ui/forms/_form-custom.scss +0 -13
  896. package/scss/ui/forms/_form-imagecheck.scss +4 -3
  897. package/scss/ui/forms/_form-otp.scss +171 -0
  898. package/scss/ui/forms/_form-selectgroup.scss +7 -7
  899. package/scss/ui/forms/_strength.scss +63 -0
  900. package/scss/ui/forms/_validation.scss +5 -0
  901. package/scss/utils/_background.scss +2 -2
  902. package/scss/utils/_colors.scss +17 -14
  903. package/scss/vendor/_apexcharts.scss +10 -1
  904. package/scss/vendor/_coloris.scss +10 -3
  905. package/scss/vendor/_fslightbox.scss +2 -2
  906. package/scss/vendor/_jsvectormap.scss +1 -1
  907. package/scss/vendor/_nouislider.scss +2 -1
  908. package/scss/vendor/_tom-select.scss +84 -7
  909. package/dist/types/src/tabler.d.ts +0 -3
  910. package/js/src/tabler.ts +0 -17
  911. package/js/tests/helpers/fixture.ts +0 -33
  912. package/js/tests/unit/alert.spec.ts +0 -176
  913. package/js/tests/unit/base-component.spec.ts +0 -166
  914. package/js/tests/unit/button.spec.ts +0 -167
  915. package/js/tests/unit/carousel.spec.ts +0 -546
  916. package/js/tests/unit/collapse.spec.ts +0 -791
  917. package/js/tests/unit/dom/data.spec.ts +0 -180
  918. package/js/tests/unit/dom/event-handler.spec.ts +0 -460
  919. package/js/tests/unit/dom/manipulator.spec.ts +0 -201
  920. package/js/tests/unit/dom/selector-engine.spec.ts +0 -300
  921. package/js/tests/unit/dropdown.spec.ts +0 -1095
  922. package/js/tests/unit/modal.spec.ts +0 -629
  923. package/js/tests/unit/offcanvas.spec.ts +0 -434
  924. package/js/tests/unit/popover.spec.ts +0 -253
  925. package/js/tests/unit/scrollspy.spec.ts +0 -634
  926. package/js/tests/unit/sidebar.spec.ts +0 -118
  927. package/js/tests/unit/tab.spec.ts +0 -775
  928. package/js/tests/unit/tabler-theme.spec.ts +0 -100
  929. package/js/tests/unit/toast.spec.ts +0 -514
  930. package/js/tests/unit/tooltip.spec.ts +0 -679
  931. package/js/tests/unit/util/backdrop.spec.ts +0 -213
  932. package/js/tests/unit/util/component-functions.spec.ts +0 -88
  933. package/js/tests/unit/util/config.spec.ts +0 -150
  934. package/js/tests/unit/util/focustrap.spec.ts +0 -232
  935. package/js/tests/unit/util/index.spec.ts +0 -478
  936. package/js/tests/unit/util/sanitizer.spec.ts +0 -118
  937. package/js/tests/unit/util/scrollbar.spec.ts +0 -202
  938. package/js/tests/unit/util/swipe.spec.ts +0 -319
  939. package/js/tests/unit/util/template-factory.spec.ts +0 -233
  940. package/scss/tests/_add-subtract.test.scss +0 -48
  941. package/scss/tests/_border-radius.test.scss +0 -23
  942. package/scss/tests/_box-shadow.test.scss +0 -71
  943. package/scss/tests/_breakpoints.test.scss +0 -50
  944. package/scss/tests/_cards.test.scss +0 -31
  945. package/scss/tests/_caret.test.scss +0 -115
  946. package/scss/tests/_color-contrast.test.scss +0 -24
  947. package/scss/tests/_color-mode.test.scss +0 -28
  948. package/scss/tests/_color.test.scss +0 -44
  949. package/scss/tests/_colors-misc.test.scss +0 -80
  950. package/scss/tests/_css-var.test.scss +0 -37
  951. package/scss/tests/_divide.test.scss +0 -45
  952. package/scss/tests/_escape-svg.test.scss +0 -18
  953. package/scss/tests/_generate-utility.test.scss +0 -245
  954. package/scss/tests/_grid.test.scss +0 -153
  955. package/scss/tests/_maps.test.scss +0 -76
  956. package/scss/tests/_media-breakpoint.test.scss +0 -202
  957. package/scss/tests/_mixins-bootstrap.test.scss +0 -55
  958. package/scss/tests/_mixins.test.scss +0 -208
  959. package/scss/tests/_rfs.test.scss +0 -30
  960. package/scss/tests/_str-replace.test.scss +0 -34
  961. package/scss/tests/_transition.test.scss +0 -43
@@ -1,1095 +0,0 @@
1
- import { describe, it, expect, beforeAll, afterEach, vi } from 'vitest'
2
- import Dropdown from '../../src/bootstrap/dropdown'
3
- import { clearFixture, getFixture } from '../helpers/fixture'
4
-
5
- vi.mock('@popperjs/core', () => ({
6
- createPopper: vi.fn(() => ({
7
- destroy: vi.fn(),
8
- update: vi.fn(),
9
- setOptions: vi.fn(),
10
- })),
11
- }))
12
-
13
- describe('Dropdown', () => {
14
- let fixtureEl: HTMLElement
15
-
16
- beforeAll(() => {
17
- fixtureEl = getFixture()
18
- })
19
-
20
- afterEach(() => {
21
- clearFixture()
22
- vi.restoreAllMocks()
23
- })
24
-
25
- describe('VERSION', () => {
26
- it('should return plugin version', () => {
27
- expect(typeof Dropdown.VERSION).toBe('string')
28
- })
29
- })
30
-
31
- describe('Default', () => {
32
- it('should return plugin default config', () => {
33
- expect(typeof Dropdown.Default).toBe('object')
34
- })
35
- })
36
-
37
- describe('DefaultType', () => {
38
- it('should return plugin default type config', () => {
39
- expect(typeof Dropdown.DefaultType).toBe('object')
40
- })
41
- })
42
-
43
- describe('DATA_KEY', () => {
44
- it('should return plugin data key', () => {
45
- expect(Dropdown.DATA_KEY).toBe('bs.dropdown')
46
- })
47
- })
48
-
49
- describe('constructor', () => {
50
- it('should accept element as CSS selector or DOM element', () => {
51
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
52
-
53
- const btnDropdown = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
54
- const dropdownBySelector = new Dropdown('[data-bs-toggle="dropdown"]')
55
- const dropdownByElement = new Dropdown(btnDropdown)
56
-
57
- expect(dropdownBySelector._element).toBe(btnDropdown)
58
- expect(dropdownByElement._element).toBe(btnDropdown)
59
- })
60
-
61
- it('should create offset from string data attribute', () => {
62
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown" data-bs-offset="10,20">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
63
-
64
- const btnDropdown = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
65
- const dropdown = new Dropdown(btnDropdown)
66
-
67
- expect(dropdown._getOffset()).toEqual([10, 20])
68
- })
69
-
70
- it('should allow popperConfig override', () => {
71
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
72
-
73
- const btnDropdown = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
74
- const dropdown = new Dropdown(btnDropdown, {
75
- popperConfig: { placement: 'left' },
76
- })
77
-
78
- const popperConfig = dropdown._getPopperConfig()
79
- expect(popperConfig.placement).toBe('left')
80
- })
81
- })
82
-
83
- describe('toggle', () => {
84
- it('should toggle a dropdown', () => {
85
- return new Promise<void>((resolve) => {
86
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
87
-
88
- const btnDropdown = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
89
- const dropdown = new Dropdown(btnDropdown)
90
-
91
- btnDropdown.addEventListener('shown.bs.dropdown', () => {
92
- expect(btnDropdown.classList.contains('show')).toBe(true)
93
- expect(btnDropdown.getAttribute('aria-expanded')).toBe('true')
94
- resolve()
95
- })
96
-
97
- dropdown.toggle()
98
- })
99
- })
100
-
101
- it('should toggle dropup', () => {
102
- return new Promise<void>((resolve) => {
103
- fixtureEl.innerHTML = ['<div class="dropup">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
104
-
105
- const btnDropdown = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
106
- const dropdown = new Dropdown(btnDropdown)
107
-
108
- btnDropdown.addEventListener('shown.bs.dropdown', () => {
109
- expect(btnDropdown.classList.contains('show')).toBe(true)
110
- resolve()
111
- })
112
-
113
- dropdown.toggle()
114
- })
115
- })
116
-
117
- it('should toggle dropend', () => {
118
- return new Promise<void>((resolve) => {
119
- fixtureEl.innerHTML = ['<div class="dropend">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
120
-
121
- const btnDropdown = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
122
- const dropdown = new Dropdown(btnDropdown)
123
-
124
- btnDropdown.addEventListener('shown.bs.dropdown', () => {
125
- expect(btnDropdown.classList.contains('show')).toBe(true)
126
- resolve()
127
- })
128
-
129
- dropdown.toggle()
130
- })
131
- })
132
-
133
- it('should toggle dropstart', () => {
134
- return new Promise<void>((resolve) => {
135
- fixtureEl.innerHTML = ['<div class="dropstart">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
136
-
137
- const btnDropdown = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
138
- const dropdown = new Dropdown(btnDropdown)
139
-
140
- btnDropdown.addEventListener('shown.bs.dropdown', () => {
141
- expect(btnDropdown.classList.contains('show')).toBe(true)
142
- resolve()
143
- })
144
-
145
- dropdown.toggle()
146
- })
147
- })
148
- })
149
-
150
- describe('show', () => {
151
- it('should show a dropdown', () => {
152
- return new Promise<void>((resolve) => {
153
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
154
-
155
- const btnDropdown = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
156
- const dropdown = new Dropdown(btnDropdown)
157
-
158
- btnDropdown.addEventListener('shown.bs.dropdown', () => {
159
- expect(btnDropdown.classList.contains('show')).toBe(true)
160
- resolve()
161
- })
162
-
163
- dropdown.show()
164
- })
165
- })
166
-
167
- it('should not show if disabled', () => {
168
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown" disabled>Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
169
-
170
- const btnDropdown = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
171
- const dropdown = new Dropdown(btnDropdown)
172
-
173
- dropdown.show()
174
- expect(btnDropdown.classList.contains('show')).toBe(false)
175
- })
176
-
177
- it('should not show if already shown', () => {
178
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle show" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu show">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
179
-
180
- const btnDropdown = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
181
- const dropdown = new Dropdown(btnDropdown)
182
- const spy = vi.fn()
183
-
184
- btnDropdown.addEventListener('shown.bs.dropdown', spy)
185
- dropdown.show()
186
-
187
- expect(spy).not.toHaveBeenCalled()
188
- })
189
-
190
- it('should not show if show event is prevented', () => {
191
- return new Promise<void>((resolve) => {
192
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
193
-
194
- const btnDropdown = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
195
- const dropdown = new Dropdown(btnDropdown)
196
-
197
- btnDropdown.addEventListener('show.bs.dropdown', (ev) => {
198
- ev.preventDefault()
199
- setTimeout(() => {
200
- expect(btnDropdown.classList.contains('show')).toBe(false)
201
- resolve()
202
- }, 30)
203
- })
204
-
205
- dropdown.show()
206
- })
207
- })
208
- })
209
-
210
- describe('hide', () => {
211
- it('should hide a dropdown', () => {
212
- return new Promise<void>((resolve) => {
213
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
214
-
215
- const btnDropdown = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
216
- const dropdown = new Dropdown(btnDropdown)
217
-
218
- btnDropdown.addEventListener('shown.bs.dropdown', () => {
219
- dropdown.hide()
220
- })
221
-
222
- btnDropdown.addEventListener('hidden.bs.dropdown', () => {
223
- expect(btnDropdown.classList.contains('show')).toBe(false)
224
- expect(btnDropdown.getAttribute('aria-expanded')).toBe('false')
225
- resolve()
226
- })
227
-
228
- dropdown.show()
229
- })
230
- })
231
-
232
- it('should not hide if not shown', () => {
233
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
234
-
235
- const btnDropdown = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
236
- const dropdown = new Dropdown(btnDropdown)
237
- const spy = vi.fn()
238
-
239
- btnDropdown.addEventListener('hidden.bs.dropdown', spy)
240
- dropdown.hide()
241
-
242
- expect(spy).not.toHaveBeenCalled()
243
- })
244
-
245
- it('should not hide if hide event is prevented', () => {
246
- return new Promise<void>((resolve) => {
247
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
248
-
249
- const btnDropdown = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
250
- const dropdown = new Dropdown(btnDropdown)
251
-
252
- btnDropdown.addEventListener('shown.bs.dropdown', () => {
253
- btnDropdown.addEventListener('hide.bs.dropdown', (ev) => {
254
- ev.preventDefault()
255
- setTimeout(() => {
256
- expect(btnDropdown.classList.contains('show')).toBe(true)
257
- resolve()
258
- }, 30)
259
- })
260
- dropdown.hide()
261
- })
262
-
263
- dropdown.show()
264
- })
265
- })
266
- })
267
-
268
- describe('dispose', () => {
269
- it('should dispose a dropdown', () => {
270
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
271
-
272
- const btnDropdown = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
273
- const dropdown = new Dropdown(btnDropdown)
274
-
275
- expect(Dropdown.getInstance(btnDropdown)).not.toBeNull()
276
-
277
- dropdown.dispose()
278
-
279
- expect(Dropdown.getInstance(btnDropdown)).toBeNull()
280
- })
281
- })
282
-
283
- describe('update', () => {
284
- it('should call update on popper', () => {
285
- return new Promise<void>((resolve) => {
286
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
287
-
288
- const btnDropdown = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
289
- const dropdown = new Dropdown(btnDropdown)
290
-
291
- btnDropdown.addEventListener('shown.bs.dropdown', () => {
292
- dropdown.update()
293
- expect(dropdown._popper!.update).toHaveBeenCalled()
294
- resolve()
295
- })
296
-
297
- dropdown.show()
298
- })
299
- })
300
- })
301
-
302
- describe('getInstance', () => {
303
- it('should return null if no instance', () => {
304
- expect(Dropdown.getInstance(fixtureEl)).toBeNull()
305
- })
306
-
307
- it('should return dropdown instance', () => {
308
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu"></div>', '</div>'].join('')
309
-
310
- const btnDropdown = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
311
- const dropdown = new Dropdown(btnDropdown)
312
-
313
- expect(Dropdown.getInstance(btnDropdown)).toBe(dropdown)
314
- })
315
- })
316
-
317
- describe('getOrCreateInstance', () => {
318
- it('should return dropdown instance', () => {
319
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu"></div>', '</div>'].join('')
320
-
321
- const btnDropdown = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
322
- const dropdown = new Dropdown(btnDropdown)
323
-
324
- expect(Dropdown.getOrCreateInstance(btnDropdown)).toBe(dropdown)
325
- })
326
-
327
- it('should return new instance when there is no instance', () => {
328
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu"></div>', '</div>'].join('')
329
-
330
- const btnDropdown = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
331
-
332
- expect(Dropdown.getInstance(btnDropdown)).toBeNull()
333
- expect(Dropdown.getOrCreateInstance(btnDropdown)).toBeInstanceOf(Dropdown)
334
- })
335
- })
336
-
337
- describe('data-api', () => {
338
- it('should toggle via click on data-bs-toggle', () => {
339
- return new Promise<void>((resolve) => {
340
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
341
-
342
- const btnDropdown = fixtureEl.querySelector('[data-bs-toggle="dropdown"]') as HTMLElement
343
-
344
- btnDropdown.addEventListener('shown.bs.dropdown', () => {
345
- expect(btnDropdown.classList.contains('show')).toBe(true)
346
- resolve()
347
- })
348
-
349
- btnDropdown.click()
350
- })
351
- })
352
- })
353
-
354
- describe('_getPlacement', () => {
355
- it('should return right for dropend', () => {
356
- fixtureEl.innerHTML = ['<div class="dropend">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu"></div>', '</div>'].join('')
357
-
358
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
359
- const dropdown = new Dropdown(btn)
360
- const placement = dropdown._getPlacement()
361
-
362
- expect(placement).toMatch(/right|left/)
363
- })
364
-
365
- it('should return left for dropstart', () => {
366
- fixtureEl.innerHTML = ['<div class="dropstart">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu"></div>', '</div>'].join('')
367
-
368
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
369
- const dropdown = new Dropdown(btn)
370
- const placement = dropdown._getPlacement()
371
-
372
- expect(placement).toMatch(/right|left/)
373
- })
374
-
375
- it('should return top for dropup-center', () => {
376
- fixtureEl.innerHTML = ['<div class="dropup-center">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu"></div>', '</div>'].join('')
377
-
378
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
379
- const dropdown = new Dropdown(btn)
380
-
381
- expect(dropdown._getPlacement()).toBe('top')
382
- })
383
-
384
- it('should return bottom for dropdown-center', () => {
385
- fixtureEl.innerHTML = ['<div class="dropdown-center">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu"></div>', '</div>'].join('')
386
-
387
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
388
- const dropdown = new Dropdown(btn)
389
-
390
- expect(dropdown._getPlacement()).toBe('bottom')
391
- })
392
-
393
- it('should return top-start for dropup', () => {
394
- fixtureEl.innerHTML = ['<div class="dropup">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu"></div>', '</div>'].join('')
395
-
396
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
397
- const dropdown = new Dropdown(btn)
398
- const placement = dropdown._getPlacement()
399
-
400
- expect(placement).toMatch(/top/)
401
- })
402
-
403
- it('should return bottom-end when --bs-position is end', () => {
404
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu" style="--bs-position: end"></div>', '</div>'].join('')
405
-
406
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
407
- const menu = fixtureEl.querySelector('.dropdown-menu') as HTMLElement
408
- const dropdown = new Dropdown(btn)
409
-
410
- const originalGetComputedStyle = window.getComputedStyle
411
- vi.spyOn(window, 'getComputedStyle').mockImplementation((el) => {
412
- const result = originalGetComputedStyle(el)
413
- if (el === menu) {
414
- return new Proxy(result, {
415
- get(target, prop) {
416
- if (prop === 'getPropertyValue') {
417
- return (name: string) => (name === '--bs-position' ? 'end' : target.getPropertyValue(name))
418
- }
419
-
420
- return (target as any)[prop]
421
- },
422
- }) as CSSStyleDeclaration
423
- }
424
-
425
- return result
426
- })
427
-
428
- expect(dropdown._getPlacement()).toBe('bottom-end')
429
- })
430
-
431
- it('should return top-end for dropup with --bs-position end', () => {
432
- fixtureEl.innerHTML = ['<div class="dropup">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu" style="--bs-position: end"></div>', '</div>'].join('')
433
-
434
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
435
- const menu = fixtureEl.querySelector('.dropdown-menu') as HTMLElement
436
- const dropdown = new Dropdown(btn)
437
-
438
- const originalGetComputedStyle = window.getComputedStyle
439
- vi.spyOn(window, 'getComputedStyle').mockImplementation((el) => {
440
- const result = originalGetComputedStyle(el)
441
- if (el === menu) {
442
- return new Proxy(result, {
443
- get(target, prop) {
444
- if (prop === 'getPropertyValue') {
445
- return (name: string) => (name === '--bs-position' ? 'end' : target.getPropertyValue(name))
446
- }
447
-
448
- return (target as any)[prop]
449
- },
450
- }) as CSSStyleDeclaration
451
- }
452
-
453
- return result
454
- })
455
-
456
- expect(dropdown._getPlacement()).toBe('top-end')
457
- })
458
- })
459
-
460
- describe('_detectNavbar', () => {
461
- it('should detect when inside navbar', () => {
462
- fixtureEl.innerHTML = ['<nav class="navbar">', ' <div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu"></div>', ' </div>', '</nav>'].join('')
463
-
464
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
465
- const dropdown = new Dropdown(btn)
466
-
467
- expect(dropdown._inNavbar).toBe(true)
468
- })
469
-
470
- it('should detect when not inside navbar', () => {
471
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu"></div>', '</div>'].join('')
472
-
473
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
474
- const dropdown = new Dropdown(btn)
475
-
476
- expect(dropdown._inNavbar).toBe(false)
477
- })
478
- })
479
-
480
- describe('_getConfig', () => {
481
- it('should throw on invalid reference object', () => {
482
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu"></div>', '</div>'].join('')
483
-
484
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
485
-
486
- expect(() => {
487
- new Dropdown(btn, { reference: {} as any })
488
- }).toThrow(TypeError)
489
- })
490
- })
491
-
492
- describe('_getOffset', () => {
493
- it('should handle function offset', () => {
494
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu"></div>', '</div>'].join('')
495
-
496
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
497
- const offsetFn = vi.fn().mockReturnValue([10, 20])
498
- const dropdown = new Dropdown(btn, { offset: offsetFn })
499
-
500
- const offset = dropdown._getOffset()
501
- expect(typeof offset).toBe('function')
502
- })
503
-
504
- it('should handle array offset', () => {
505
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu"></div>', '</div>'].join('')
506
-
507
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
508
- const dropdown = new Dropdown(btn, { offset: [5, 10] })
509
-
510
- expect(dropdown._getOffset()).toEqual([5, 10])
511
- })
512
-
513
- it('should handle string offset', () => {
514
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu"></div>', '</div>'].join('')
515
-
516
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
517
- const dropdown = new Dropdown(btn, { offset: '10,20' as any })
518
-
519
- expect(dropdown._getOffset()).toEqual([10, 20])
520
- })
521
- })
522
-
523
- describe('_getPopperConfig', () => {
524
- it('should set popper static in navbar', () => {
525
- fixtureEl.innerHTML = ['<nav class="navbar">', ' <div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu"></div>', ' </div>', '</nav>'].join('')
526
-
527
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
528
- const dropdown = new Dropdown(btn)
529
-
530
- const config = dropdown._getPopperConfig()
531
- expect(config.modifiers).toBeDefined()
532
- expect(config.modifiers!.some((m: any) => m.name === 'applyStyles' && m.enabled === false)).toBe(true)
533
- })
534
-
535
- it('should set popper static when display is static', () => {
536
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu"></div>', '</div>'].join('')
537
-
538
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
539
- const dropdown = new Dropdown(btn, { display: 'static' })
540
-
541
- const config = dropdown._getPopperConfig()
542
- expect(config.modifiers).toBeDefined()
543
- expect(config.modifiers!.some((m: any) => m.name === 'applyStyles' && m.enabled === false)).toBe(true)
544
- })
545
-
546
- it('should apply custom popperConfig function', () => {
547
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu"></div>', '</div>'].join('')
548
-
549
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
550
- const customPopperConfig = (_defaultConfig: any) => ({ ..._defaultConfig, strategy: 'fixed' as const })
551
- const dropdown = new Dropdown(btn, { popperConfig: customPopperConfig })
552
-
553
- const config = dropdown._getPopperConfig()
554
- expect(config.strategy).toBe('fixed')
555
- })
556
- })
557
-
558
- describe('clearMenus', () => {
559
- it('should ignore right mouse button', () => {
560
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle show" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu show"></div>', '</div>'].join('')
561
-
562
- const event = new MouseEvent('click', { button: 2, bubbles: true })
563
- Dropdown.clearMenus(event)
564
-
565
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
566
- expect(btn.classList.contains('show')).toBe(true)
567
- })
568
- })
569
-
570
- describe('show with touch device', () => {
571
- it('should add mouseover listeners on touch device', () => {
572
- return new Promise<void>((resolve) => {
573
- Object.defineProperty(document.documentElement, 'ontouchstart', {
574
- value: null,
575
- writable: true,
576
- configurable: true,
577
- })
578
-
579
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
580
-
581
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
582
- const dropdown = new Dropdown(btn)
583
-
584
- btn.addEventListener('shown.bs.dropdown', () => {
585
- expect(btn.classList.contains('show')).toBe(true)
586
-
587
- btn.addEventListener('hidden.bs.dropdown', () => {
588
- delete (document.documentElement as any).ontouchstart
589
- resolve()
590
- })
591
-
592
- dropdown.hide()
593
- })
594
-
595
- dropdown.show()
596
- })
597
- })
598
- })
599
-
600
- describe('_completeHide', () => {
601
- it('should not hide if hide event is prevented', () => {
602
- return new Promise<void>((resolve) => {
603
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
604
-
605
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
606
- const dropdown = new Dropdown(btn)
607
-
608
- btn.addEventListener('shown.bs.dropdown', () => {
609
- btn.addEventListener('hide.bs.dropdown', (event) => {
610
- event.preventDefault()
611
- })
612
-
613
- dropdown._completeHide({ relatedTarget: btn })
614
-
615
- setTimeout(() => {
616
- expect(btn.classList.contains('show')).toBe(true)
617
- resolve()
618
- }, 30)
619
- })
620
-
621
- dropdown.show()
622
- })
623
- })
624
-
625
- it('should remove touch listeners on hide', () => {
626
- return new Promise<void>((resolve) => {
627
- Object.defineProperty(document.documentElement, 'ontouchstart', {
628
- value: null,
629
- writable: true,
630
- configurable: true,
631
- })
632
-
633
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
634
-
635
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
636
- const dropdown = new Dropdown(btn)
637
-
638
- btn.addEventListener('shown.bs.dropdown', () => {
639
- btn.addEventListener('hidden.bs.dropdown', () => {
640
- expect(btn.classList.contains('show')).toBe(false)
641
- delete (document.documentElement as any).ontouchstart
642
- resolve()
643
- })
644
-
645
- dropdown._completeHide({ relatedTarget: btn })
646
- })
647
-
648
- dropdown.show()
649
- })
650
- })
651
- })
652
-
653
- describe('_selectMenuItem', () => {
654
- it('should do nothing if no visible items', () => {
655
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu"></div>', '</div>'].join('')
656
-
657
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
658
- const dropdown = new Dropdown(btn)
659
-
660
- expect(() => {
661
- dropdown._selectMenuItem({ key: 'ArrowDown', target: btn as HTMLElement })
662
- }).not.toThrow()
663
- })
664
-
665
- it('should focus an item on ArrowDown when items are visible', () => {
666
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Item 1</a>', ' <a class="dropdown-item" href="#">Item 2</a>', ' </div>', '</div>'].join('')
667
-
668
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
669
- const dropdown = new Dropdown(btn)
670
-
671
- dropdown._selectMenuItem({ key: 'ArrowDown', target: btn as HTMLElement })
672
- })
673
- })
674
-
675
- describe('_createPopper with reference', () => {
676
- it('should use parent as reference', () => {
677
- return new Promise<void>((resolve) => {
678
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
679
-
680
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
681
- const dropdown = new Dropdown(btn, { reference: 'parent' })
682
-
683
- btn.addEventListener('shown.bs.dropdown', () => {
684
- expect(dropdown._popper).not.toBeNull()
685
- resolve()
686
- })
687
-
688
- dropdown.show()
689
- })
690
- })
691
-
692
- it('should use element reference', () => {
693
- return new Promise<void>((resolve) => {
694
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
695
-
696
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
697
- const dropdown = new Dropdown(btn, { reference: fixtureEl })
698
-
699
- btn.addEventListener('shown.bs.dropdown', () => {
700
- expect(dropdown._popper).not.toBeNull()
701
- resolve()
702
- })
703
-
704
- dropdown.show()
705
- })
706
- })
707
-
708
- it('should use virtual element reference', () => {
709
- return new Promise<void>((resolve) => {
710
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
711
-
712
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
713
- const virtualRef = {
714
- getBoundingClientRect: () => ({ top: 0, left: 0, bottom: 0, right: 0, width: 0, height: 0, x: 0, y: 0, toJSON: () => {} }),
715
- }
716
-
717
- const dropdown = new Dropdown(btn, { reference: virtualRef as any })
718
-
719
- btn.addEventListener('shown.bs.dropdown', () => {
720
- expect(dropdown._popper).not.toBeNull()
721
- resolve()
722
- })
723
-
724
- dropdown.show()
725
- })
726
- })
727
- })
728
-
729
- describe('dispose with popper', () => {
730
- it('should destroy popper on dispose', () => {
731
- return new Promise<void>((resolve) => {
732
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
733
-
734
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
735
- const dropdown = new Dropdown(btn)
736
-
737
- btn.addEventListener('shown.bs.dropdown', () => {
738
- const destroySpy = dropdown._popper!.destroy
739
- dropdown.dispose()
740
- expect(destroySpy).toHaveBeenCalled()
741
- resolve()
742
- })
743
-
744
- dropdown.show()
745
- })
746
- })
747
- })
748
-
749
- describe('clearMenus (full flow)', () => {
750
- it('should close open dropdown on outside click', () => {
751
- return new Promise<void>((resolve) => {
752
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>', '<div id="outside">outside</div>'].join('')
753
-
754
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
755
- const dropdown = new Dropdown(btn)
756
-
757
- btn.addEventListener('shown.bs.dropdown', () => {
758
- expect(btn.classList.contains('show')).toBe(true)
759
-
760
- btn.addEventListener('hidden.bs.dropdown', () => {
761
- expect(btn.classList.contains('show')).toBe(false)
762
- resolve()
763
- })
764
-
765
- const outsideEl = fixtureEl.querySelector('#outside')!
766
- outsideEl.dispatchEvent(new MouseEvent('click', { bubbles: true }))
767
- })
768
-
769
- dropdown.show()
770
- })
771
- })
772
-
773
- it('should skip autoClose=false dropdown', () => {
774
- return new Promise<void>((resolve) => {
775
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
776
-
777
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
778
- const dropdown = new Dropdown(btn, { autoClose: false })
779
-
780
- btn.addEventListener('shown.bs.dropdown', () => {
781
- const event = new MouseEvent('click', { bubbles: true })
782
- document.dispatchEvent(event)
783
-
784
- setTimeout(() => {
785
- expect(btn.classList.contains('show')).toBe(true)
786
- resolve()
787
- }, 30)
788
- })
789
-
790
- dropdown.show()
791
- })
792
- })
793
-
794
- it('should ignore keyup that is not Tab', () => {
795
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle show" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu show"></div>', '</div>'].join('')
796
-
797
- const event = new KeyboardEvent('keyup', { key: 'Escape', bubbles: true })
798
- Dropdown.clearMenus(event)
799
-
800
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
801
- expect(btn.classList.contains('show')).toBe(true)
802
- })
803
-
804
- it('should add clickEvent on click type event', () => {
805
- return new Promise<void>((resolve) => {
806
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
807
-
808
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
809
- const dropdown = new Dropdown(btn)
810
-
811
- btn.addEventListener('shown.bs.dropdown', () => {
812
- btn.addEventListener('hidden.bs.dropdown', () => {
813
- resolve()
814
- })
815
-
816
- document.body.dispatchEvent(new MouseEvent('click', { bubbles: true }))
817
- })
818
-
819
- dropdown.show()
820
- })
821
- })
822
-
823
- it('should not close autoClose=inside when clicked outside', () => {
824
- return new Promise<void>((resolve) => {
825
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>', '<div id="outside">outside</div>'].join('')
826
-
827
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
828
- const dropdown = new Dropdown(btn, { autoClose: 'inside' })
829
-
830
- btn.addEventListener('shown.bs.dropdown', () => {
831
- const outside = fixtureEl.querySelector('#outside')!
832
- outside.dispatchEvent(new MouseEvent('click', { bubbles: true }))
833
-
834
- setTimeout(() => {
835
- expect(btn.classList.contains('show')).toBe(true)
836
- resolve()
837
- }, 30)
838
- })
839
-
840
- dropdown.show()
841
- })
842
- })
843
-
844
- it('should not close autoClose=outside when clicked inside menu', () => {
845
- return new Promise<void>((resolve) => {
846
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
847
-
848
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
849
- const menu = fixtureEl.querySelector('.dropdown-menu')!
850
- const dropdown = new Dropdown(btn, { autoClose: 'outside' })
851
-
852
- btn.addEventListener('shown.bs.dropdown', () => {
853
- menu.querySelector('.dropdown-item')!.dispatchEvent(new MouseEvent('click', { bubbles: true }))
854
-
855
- setTimeout(() => {
856
- expect(btn.classList.contains('show')).toBe(true)
857
- resolve()
858
- }, 30)
859
- })
860
-
861
- dropdown.show()
862
- })
863
- })
864
-
865
- it('should not close when click composedPath includes toggle element', () => {
866
- return new Promise<void>((resolve) => {
867
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
868
-
869
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]') as HTMLElement
870
- const dropdown = new Dropdown(btn)
871
-
872
- btn.addEventListener('shown.bs.dropdown', () => {
873
- const event = new MouseEvent('click', { bubbles: true })
874
- Object.defineProperty(event, 'composedPath', {
875
- value: () => [btn, fixtureEl, document.body, document.documentElement, document],
876
- configurable: true,
877
- })
878
- Dropdown.clearMenus(event)
879
-
880
- setTimeout(() => {
881
- expect(btn.classList.contains('show')).toBe(true)
882
- resolve()
883
- }, 30)
884
- })
885
-
886
- dropdown.show()
887
- })
888
- })
889
-
890
- it('should not close on Tab keyup inside input within menu', () => {
891
- return new Promise<void>((resolve) => {
892
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <input type="text" class="form-control">', ' </div>', '</div>'].join('')
893
-
894
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
895
- const menu = fixtureEl.querySelector('.dropdown-menu')!
896
- const input = fixtureEl.querySelector('input') as HTMLElement
897
- const dropdown = new Dropdown(btn)
898
-
899
- btn.addEventListener('shown.bs.dropdown', () => {
900
- const tabEvent = new KeyboardEvent('keyup', { key: 'Tab', bubbles: true })
901
- Object.defineProperty(tabEvent, 'composedPath', {
902
- value: () => [input, menu, fixtureEl, document.body, document.documentElement, document],
903
- configurable: true,
904
- })
905
- Object.defineProperty(tabEvent, 'target', { value: input, configurable: true })
906
- Dropdown.clearMenus(tabEvent)
907
-
908
- setTimeout(() => {
909
- expect(btn.classList.contains('show')).toBe(true)
910
- resolve()
911
- }, 30)
912
- })
913
-
914
- dropdown.show()
915
- })
916
- })
917
-
918
- it('should close on Tab keyup targeting element outside menu', () => {
919
- return new Promise<void>((resolve) => {
920
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>', '<button id="outside-btn">Outside</button>'].join('')
921
-
922
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')!
923
- const outsideBtn = fixtureEl.querySelector('#outside-btn') as HTMLElement
924
- const dropdown = new Dropdown(btn)
925
-
926
- btn.addEventListener('shown.bs.dropdown', () => {
927
- btn.addEventListener('hidden.bs.dropdown', () => {
928
- resolve()
929
- })
930
-
931
- const tabEvent = new KeyboardEvent('keyup', { key: 'Tab', bubbles: true })
932
- Object.defineProperty(tabEvent, 'composedPath', {
933
- value: () => [outsideBtn, fixtureEl, document.body, document.documentElement, document],
934
- configurable: true,
935
- })
936
- Object.defineProperty(tabEvent, 'target', { value: outsideBtn, configurable: true })
937
- Dropdown.clearMenus(tabEvent)
938
- })
939
-
940
- dropdown.show()
941
- })
942
- })
943
- })
944
-
945
- describe('dataApiKeydownHandler', () => {
946
- it('should ignore non-arrow/escape keys', () => {
947
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
948
-
949
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]') as HTMLElement
950
- const preventSpy = vi.spyOn(Event.prototype, 'preventDefault')
951
-
952
- const keydown = new KeyboardEvent('keydown', { key: 'Enter', bubbles: true })
953
- btn.dispatchEvent(keydown)
954
-
955
- expect(preventSpy).not.toHaveBeenCalled()
956
- })
957
-
958
- it('should ignore arrow keys in input', () => {
959
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <input type="text" class="form-control">', ' </div>', '</div>'].join('')
960
-
961
- const input = fixtureEl.querySelector('input') as HTMLElement
962
- const preventSpy = vi.spyOn(Event.prototype, 'preventDefault')
963
-
964
- const keydown = new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true })
965
- Object.defineProperty(keydown, 'target', { value: input, configurable: true })
966
- input.dispatchEvent(keydown)
967
-
968
- expect(preventSpy).not.toHaveBeenCalled()
969
- })
970
-
971
- it('should open dropdown on ArrowDown and call _selectMenuItem', () => {
972
- return new Promise<void>((resolve) => {
973
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
974
-
975
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]') as HTMLElement
976
-
977
- btn.addEventListener('shown.bs.dropdown', () => {
978
- expect(btn.classList.contains('show')).toBe(true)
979
- resolve()
980
- })
981
-
982
- const keydown = new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true })
983
- btn.dispatchEvent(keydown)
984
- })
985
- })
986
-
987
- it('should close dropdown on Escape', () => {
988
- return new Promise<void>((resolve) => {
989
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
990
-
991
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]') as HTMLElement
992
- const dropdown = new Dropdown(btn)
993
-
994
- btn.addEventListener('shown.bs.dropdown', () => {
995
- btn.addEventListener('hidden.bs.dropdown', () => {
996
- expect(btn.classList.contains('show')).toBe(false)
997
- resolve()
998
- })
999
-
1000
- const keydown = new KeyboardEvent('keydown', { key: 'Escape', bubbles: true })
1001
- btn.dispatchEvent(keydown)
1002
- })
1003
-
1004
- dropdown.show()
1005
- })
1006
- })
1007
-
1008
- it('should allow Escape in input/textarea', () => {
1009
- return new Promise<void>((resolve) => {
1010
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <textarea class="form-control"></textarea>', ' </div>', '</div>'].join('')
1011
-
1012
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]') as HTMLElement
1013
- const textarea = fixtureEl.querySelector('textarea') as HTMLElement
1014
- const dropdown = new Dropdown(btn)
1015
-
1016
- btn.addEventListener('shown.bs.dropdown', () => {
1017
- btn.addEventListener('hidden.bs.dropdown', () => {
1018
- expect(btn.classList.contains('show')).toBe(false)
1019
- resolve()
1020
- })
1021
-
1022
- const keydown = new KeyboardEvent('keydown', { key: 'Escape', bubbles: true })
1023
- textarea.dispatchEvent(keydown)
1024
- })
1025
-
1026
- dropdown.show()
1027
- })
1028
- })
1029
-
1030
- it('should handle ArrowUp to show and select', () => {
1031
- return new Promise<void>((resolve) => {
1032
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
1033
-
1034
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]') as HTMLElement
1035
-
1036
- btn.addEventListener('shown.bs.dropdown', () => {
1037
- expect(btn.classList.contains('show')).toBe(true)
1038
- resolve()
1039
- })
1040
-
1041
- const keydown = new KeyboardEvent('keydown', { key: 'ArrowUp', bubbles: true })
1042
- btn.dispatchEvent(keydown)
1043
- })
1044
- })
1045
-
1046
- it('should find toggle from menu item via keydown', () => {
1047
- return new Promise<void>((resolve) => {
1048
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
1049
-
1050
- const btn = fixtureEl.querySelector('[data-bs-toggle="dropdown"]') as HTMLElement
1051
- const menu = fixtureEl.querySelector('.dropdown-menu') as HTMLElement
1052
- const dropdown = new Dropdown(btn)
1053
-
1054
- btn.addEventListener('shown.bs.dropdown', () => {
1055
- btn.addEventListener('hidden.bs.dropdown', () => {
1056
- expect(btn.classList.contains('show')).toBe(false)
1057
- resolve()
1058
- })
1059
-
1060
- const keydown = new KeyboardEvent('keydown', { key: 'Escape', bubbles: true })
1061
- menu.dispatchEvent(keydown)
1062
- })
1063
-
1064
- dropdown.show()
1065
- })
1066
- })
1067
- })
1068
-
1069
- describe('data-tblr-toggle', () => {
1070
- it('should toggle via data-tblr-toggle="dropdown"', () => {
1071
- return new Promise<void>((resolve) => {
1072
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-tblr-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu">', ' <a class="dropdown-item" href="#">Link</a>', ' </div>', '</div>'].join('')
1073
-
1074
- const btnDropdown = fixtureEl.querySelector('[data-tblr-toggle="dropdown"]') as HTMLElement
1075
-
1076
- btnDropdown.addEventListener('shown.bs.dropdown', () => {
1077
- expect(btnDropdown.classList.contains('show')).toBe(true)
1078
- expect(btnDropdown.getAttribute('aria-expanded')).toBe('true')
1079
- resolve()
1080
- })
1081
-
1082
- btnDropdown.click()
1083
- })
1084
- })
1085
-
1086
- it('should create instance via data-tblr-toggle', () => {
1087
- fixtureEl.innerHTML = ['<div class="dropdown">', ' <button class="btn dropdown-toggle" data-tblr-toggle="dropdown">Dropdown</button>', ' <div class="dropdown-menu"></div>', '</div>'].join('')
1088
-
1089
- const btnDropdown = fixtureEl.querySelector('[data-tblr-toggle="dropdown"]')!
1090
- const dropdown = new Dropdown(btnDropdown)
1091
-
1092
- expect(Dropdown.getInstance(btnDropdown)).toBe(dropdown)
1093
- })
1094
- })
1095
- })