1 | import { abreElementoHtml } from "../abreElementoHtml.js" |
2 | import { cierraElementoHtmo } from "../cierraElementoHtmo.js" |
3 | |
4 | export class MdOverflowMenu extends HTMLElement { |
5 | |
6 | getContent() { |
7 | return ` |
8 | |
9 | <style> |
10 | |
11 | :host { |
12 | position: fixed; |
13 | min-width: 7rem; |
14 | max-width: 280px; |
15 | } |
16 | |
17 | ::slotted(*) { |
18 | text-align: start; |
19 | width: 100%; |
20 | border: none; |
21 | background-color: transparent; |
22 | } |
23 | |
24 | </style> |
25 | |
26 | <slot></slot>` |
27 | } |
28 | |
29 | constructor() { |
30 | super() |
31 | const shadow = this.attachShadow({ mode: "open" }) |
32 | shadow.innerHTML = this.getContent() |
33 | this.clicCierra = this.clicCierra.bind(this) |
34 | |
35 | |
36 | |
37 | |
38 | this._toggleButton = null |
39 | } |
40 | |
41 | connectedCallback() { |
42 | this.classList.add("md-menu") |
43 | this.role = "menu" |
44 | } |
45 | |
46 | |
47 | |
48 | |
49 | alterna(toggleButton) { |
50 | this._toggleButton = toggleButton |
51 | const top = toggleButton.offsetTop + toggleButton.offsetHeight - 4 |
52 | const right = |
53 | innerWidth - (toggleButton.offsetLeft + toggleButton.offsetWidth) - 3 |
54 | this.style.top = `${top}px` |
55 | this.style.right = `${right}px` |
56 | const list = this.classList |
57 | if (list.contains("open")) { |
58 | this.cierra() |
59 | } else { |
60 | this.abre() |
61 | } |
62 | } |
63 | |
64 | abre() { |
65 | document.addEventListener("click", this.clicCierra) |
66 | abreElementoHtml(this) |
67 | } |
68 | |
69 | cierra() { |
70 | document.removeEventListener("click", this.clicCierra) |
71 | cierraElementoHtmo(this) |
72 | } |
73 | |
74 | |
75 | |
76 | |
77 | clicCierra(evt) { |
78 | const target = evt.target |
79 | if (this.classList.contains("open") |
80 | && this._toggleButton !== null |
81 | && target instanceof HTMLElement |
82 | && !this._toggleButton.contains(target)) { |
83 | this.cierra() |
84 | } |
85 | } |
86 | } |
87 | |
88 | customElements.define("md-overflow-menu", MdOverflowMenu) |