dropdown.mjs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. import { N as it, C as R, K as S, B as bt, j as at, Z as u, G as U, Q as Z, J as T, a as z, t as Dt, m, L as Ct, H as yt, _ as J, x as A, M as $t, P as xt, T as V, E as dt, r as ct, d as M, y as X, v as F, R as lt, k as At, S as Ht, o as Pt, U as St, V as _, X as N, Y as Tt } from "./base-component-BMXjNJAi.mjs";
  2. import { y as _t } from "./index-CnhA8i0D.mjs";
  3. import { s as f } from "./showClass-C8hdJfjQ.mjs";
  4. import { d as pt } from "./dataBsToggle-B84TS15h.mjs";
  5. import { d as D } from "./dropdownClasses-CdCdZ-PX.mjs";
  6. import { i as Nt } from "./isDisabled-BG5MoQVt.mjs";
  7. const ut = "Dropdown", ft = "dropdown-menu", ht = (n) => {
  8. const t = it(n, "A");
  9. return n.tagName === "A" && R(n, "href") && S(n, "href")?.slice(-1) === "#" || t && R(t, "href") && S(t, "href")?.slice(-1) === "#";
  10. }, [p, j, I, L] = D, jt = `[${pt}="${p}"]`, h = (n) => Dt(n, ut), It = (n) => new kt(n), Lt = `${ft}-end`, Y = [p, j], q = [I, L], tt = ["A", "BUTTON"], Mt = {
  11. offset: 5,
  12. display: "dynamic"
  13. }, H = m(
  14. `show.bs.${p}`
  15. ), et = m(
  16. `shown.bs.${p}`
  17. ), P = m(
  18. `hide.bs.${p}`
  19. ), nt = m(`hidden.bs.${p}`), mt = m(`updated.bs.${p}`), ot = (n) => {
  20. const { element: t, menu: e, parentElement: i, options: s } = n, { offset: o } = s;
  21. if (Ct(e, "position") === "static") return;
  22. const r = yt(t), a = J(e, Lt);
  23. ["margin", "top", "bottom", "left", "right"].forEach((c) => {
  24. const Q = {};
  25. Q[c] = "", A(e, Q);
  26. });
  27. let d = D.find((c) => J(i, c)) || p;
  28. const gt = {
  29. dropdown: [o, 0, 0],
  30. dropup: [0, 0, o],
  31. dropstart: r ? [-1, 0, 0, o] : [-1, o, 0],
  32. dropend: r ? [-1, o, 0] : [-1, 0, 0, o]
  33. }, g = {
  34. dropdown: { top: "100%" },
  35. dropup: { top: "auto", bottom: "100%" },
  36. dropstart: r ? { left: "100%", right: "auto" } : { left: "auto", right: "100%" },
  37. dropend: r ? { left: "auto", right: "100%" } : { left: "100%", right: "auto" },
  38. menuStart: r ? { right: "0", left: "auto" } : { right: "auto", left: "0" },
  39. menuEnd: r ? { right: "auto", left: "0" } : { right: "0", left: "auto" }
  40. }, { offsetWidth: w, offsetHeight: C } = e, { clientWidth: O, clientHeight: W } = $t(t), {
  41. left: E,
  42. top: y,
  43. width: k,
  44. height: wt
  45. } = xt(t), $ = E - w - o < 0, x = E + w + k + o >= O, Et = y + C + o >= W, G = y + C + wt + o >= W, K = y - C - o < 0, v = (!r && a || r && !a) && E + k - w < 0, b = (r && a || !r && !a) && E + w >= O;
  46. if (q.includes(d) && $ && x && (d = p), d === I && (r ? x : $) && (d = L), d === L && (r ? $ : x) && (d = I), d === j && K && !G && (d = p), d === p && G && !K && (d = j), q.includes(d) && Et && V(g[d], {
  47. top: "auto",
  48. bottom: 0
  49. }), Y.includes(d) && (v || b)) {
  50. let c = { left: "auto", right: "auto" };
  51. !v && b && !r && (c = { left: "auto", right: 0 }), v && !b && r && (c = { left: 0, right: "auto" }), c && V(g[d], c);
  52. }
  53. const vt = gt[d];
  54. A(e, {
  55. ...g[d],
  56. margin: `${vt.map((c) => c && `${c}px`).join(" ")}`
  57. }), Y.includes(d) && a && a && A(e, g[!r && v || r && b ? "menuStart" : "menuEnd"]), u(i, mt);
  58. }, Ft = (n) => Array.from(n.children).map((t) => {
  59. if (t && tt.includes(t.tagName)) return t;
  60. const { firstElementChild: e } = t;
  61. return e && tt.includes(e.tagName) ? e : null;
  62. }).filter((t) => t), st = (n) => {
  63. const { element: t, options: e, menu: i } = n, s = n.open ? dt : ct, o = M(t);
  64. s(o, F, rt), s(o, lt, rt), s(o, At, Ot), s(o, Ht, Wt), e.display === "dynamic" && (n.open ? n._observer.observe(i) : n._observer.disconnect());
  65. }, B = (n) => {
  66. const t = [...D, "btn-group", "input-group"].map(
  67. (e) => at(`${e} ${f}`, M(n))
  68. ).find((e) => e.length);
  69. if (t && t.length)
  70. return [...t[0].children].find(
  71. (e) => D.some((i) => i === S(e, pt))
  72. );
  73. }, rt = (n) => {
  74. const { target: t, type: e } = n;
  75. if (!Pt(t)) return;
  76. const i = B(t), s = i && h(i);
  77. if (!s) return;
  78. const { parentElement: o, menu: r } = s, a = o && o.contains(t) && (t.tagName === "form" || it(t, "form") !== null);
  79. [F, St].includes(e) && ht(t) && n.preventDefault(), !a && e !== lt && t !== i && t !== r && s.hide();
  80. };
  81. function Bt(n) {
  82. const t = h(this);
  83. Nt(this) || t && (n.stopPropagation(), t.toggle(), ht(this) && n.preventDefault());
  84. }
  85. const Ot = (n) => {
  86. [_, N].includes(n.code) && n.preventDefault();
  87. };
  88. function Wt(n) {
  89. const { code: t } = n, e = B(this);
  90. if (!e) return;
  91. const i = h(e), { activeElement: s } = M(e);
  92. if (!i || !s) return;
  93. const { menu: o, open: r } = i, a = Ft(o);
  94. if (a && a.length && [_, N].includes(t)) {
  95. let l = a.indexOf(s);
  96. s === e ? l = 0 : t === N ? l = l > 1 ? l - 1 : 0 : t === _ && (l = l < a.length - 1 ? l + 1 : l), a[l] && T(a[l]);
  97. }
  98. Tt === t && r && (i.toggle(), T(e));
  99. }
  100. class kt extends bt {
  101. static selector = jt;
  102. static init = It;
  103. static getInstance = h;
  104. constructor(t, e) {
  105. super(t, e);
  106. const { parentElement: i } = this.element, [s] = at(
  107. ft,
  108. i
  109. );
  110. s && (this.parentElement = i, this.menu = s, this._observer = new _t(
  111. () => ot(this)
  112. ), this._toggleEventListeners(!0));
  113. }
  114. get name() {
  115. return ut;
  116. }
  117. get defaults() {
  118. return Mt;
  119. }
  120. toggle() {
  121. this.open ? this.hide() : this.show();
  122. }
  123. show() {
  124. const { element: t, open: e, menu: i, parentElement: s } = this;
  125. if (e) return;
  126. const o = B(t), r = o && h(o);
  127. r && r.hide(), [H, et, mt].forEach(
  128. (a) => {
  129. a.relatedTarget = t;
  130. }
  131. ), u(s, H), !H.defaultPrevented && (U(i, f), U(s, f), Z(t, X, "true"), ot(this), this.open = !e, T(t), st(this), u(s, et));
  132. }
  133. hide() {
  134. const { element: t, open: e, menu: i, parentElement: s } = this;
  135. e && ([P, nt].forEach((o) => {
  136. o.relatedTarget = t;
  137. }), u(s, P), !P.defaultPrevented && (z(i, f), z(s, f), Z(t, X, "false"), this.open = !e, st(this), u(s, nt)));
  138. }
  139. _toggleEventListeners = (t) => {
  140. (t ? dt : ct)(this.element, F, Bt);
  141. };
  142. dispose() {
  143. this.open && this.hide(), this._toggleEventListeners(), super.dispose();
  144. }
  145. }
  146. export {
  147. kt as default
  148. };
  149. //# sourceMappingURL=dropdown.mjs.map