-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
popover.js
118 lines (101 loc) · 3.51 KB
/
popover.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
// function handlePopover({ currentTarget }) {
// currentTarget.addEventListener('click', ({ currentTarget }) => {
// switch(currentTarget.popoverTargetAction) {
// case 'show':
// currentTarget.popoverTargetElement.showPopover();
// break;
// case 'hide':
// currentTarget.popoverTargetElement.hidePopover();
// break;
// default:
// currentTarget.popoverTargetElement.togglePopover();
// }
// }, { capture: true });
// }
// export function initPopover(target = document.body) {
// target.querySelectorAll('button[popovertarget], input[type="button"][popovertarget]')
// .forEach(el => el.addEventListener('click', handlePopover));
// }
// if ((globalThis.ToggleEvent instanceof Function)) {
// class ToggleEvent extends Event {
// #newState;
// #oldState;
// constructor(type, { newState, oldState }) {
// super(type, { bubbles: true });
// this.#newState = newState;
// this.#oldState = oldState;
// }
// get newState() {
// return this.#newState;
// }
// get oldState() {
// return this.#oldState;
// }
// }
// globalThis.ToggleEvent = ToggleEvent;
// }
// if (! (HTMLElement.prototype.showPopover instanceof Function)) {
// const isPopoverOpen = el => el.classList.contains('_popover-open');
// Object.defineProperties(HTMLElement.prototype, {
// showPopover: {
// value: function showPopover() {
// if (! isPopoverOpen(this)) {
// this.dispatchEvent(new ToggleEvent('beforetoggle', { oldState: 'closed', newState: 'open' }));
// if (this.getAttribute('popover') === 'auto') {
// const controller = new AbortController();
// document.body.addEventListener('click', ({ target }) => {
// if (! this.contains(target) && ! this.isSameNode(target.popoverTargetElement)) {
// controller.abort();
// this.hidePopover();
// }
// }, { signal: controller.signal, capture: true });
// document.body.addEventListener('keydown', ({ key }) => {
// if (key === 'Escape') {
// controller.abort();
// this.hidePopover();
// }
// }, { signal: controller.signal, capture: true });
// document.addEventListener('beforetoggle', ({ target }) => {
// if (! target.isSameNode(this) && target.getAttribute('popover') === 'auto') {
// controller.abort();
// this.hidePopover();
// }
// }, { signal: controller.signal });
// }
// this.classList.add('_popover-open');
// this.dispatchEvent(new ToggleEvent('toggle', { oldState: 'closed', newState: 'open' }));
// }
// }
// },
// hidePopover: {
// value: function hidePopover() {
// if (isPopoverOpen(this)) {
// this.dispatchEvent(new ToggleEvent('beforetoggle', { oldState: 'open', newState: 'closed' }));
// queueMicrotask(() => this.classList.remove('_popover-open'));
// this.dispatchEvent(new ToggleEvent('toggle', { oldState: 'open', newState: 'closed' }));
// }
// }
// },
// togglePopover: {
// value: function togglePopover() {
// isPopoverOpen(this) ? this.hidePopover() : this.showPopover();
// }
// }
// });
// Object.defineProperties(HTMLButtonElement.prototype, {
// popoverTargetElement: {
// get() {
// return document.getElementById(this.getAttribute('popovertarget'));
// }
// },
// popoverTargetAction: {
// get() {
// return this.getAttribute('popovertargetaction') || 'toggle';
// },
// set(val) {
// this.setAttribute('popovertargetaction', val);
// }
// }
// });
// initPopover();
// }