@duskmoon-dev/el-popover 0.4.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.
- package/dist/cjs/index.js +467 -0
- package/dist/cjs/index.js.map +11 -0
- package/dist/cjs/register.js +470 -0
- package/dist/cjs/register.js.map +12 -0
- package/dist/esm/index.js +435 -0
- package/dist/esm/index.js.map +11 -0
- package/dist/esm/register.js +434 -0
- package/dist/esm/register.js.map +12 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types/el-dm-popover.d.ts +106 -0
- package/dist/types/el-dm-popover.d.ts.map +1 -0
- package/dist/types/index.d.ts +19 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/register.d.ts +2 -0
- package/dist/types/register.d.ts.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,467 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __moduleCache = /* @__PURE__ */ new WeakMap;
|
|
6
|
+
var __toCommonJS = (from) => {
|
|
7
|
+
var entry = __moduleCache.get(from), desc;
|
|
8
|
+
if (entry)
|
|
9
|
+
return entry;
|
|
10
|
+
entry = __defProp({}, "__esModule", { value: true });
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function")
|
|
12
|
+
__getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
|
|
13
|
+
get: () => from[key],
|
|
14
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
15
|
+
}));
|
|
16
|
+
__moduleCache.set(from, entry);
|
|
17
|
+
return entry;
|
|
18
|
+
};
|
|
19
|
+
var __export = (target, all) => {
|
|
20
|
+
for (var name in all)
|
|
21
|
+
__defProp(target, name, {
|
|
22
|
+
get: all[name],
|
|
23
|
+
enumerable: true,
|
|
24
|
+
configurable: true,
|
|
25
|
+
set: (newValue) => all[name] = () => newValue
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
// src/index.ts
|
|
30
|
+
var exports_src = {};
|
|
31
|
+
__export(exports_src, {
|
|
32
|
+
register: () => register,
|
|
33
|
+
ElDmPopover: () => ElDmPopover
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(exports_src);
|
|
36
|
+
|
|
37
|
+
// src/el-dm-popover.ts
|
|
38
|
+
var import_el_core = require("@duskmoon-dev/el-core");
|
|
39
|
+
var styles = import_el_core.css`
|
|
40
|
+
:host {
|
|
41
|
+
display: inline-block;
|
|
42
|
+
position: relative;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
:host([hidden]) {
|
|
46
|
+
display: none !important;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.popover-trigger {
|
|
50
|
+
display: inline-flex;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.popover-panel {
|
|
54
|
+
position: fixed;
|
|
55
|
+
z-index: 1000;
|
|
56
|
+
min-width: 8rem;
|
|
57
|
+
max-width: 20rem;
|
|
58
|
+
padding: 0.75rem 1rem;
|
|
59
|
+
background-color: var(--color-surface, #ffffff);
|
|
60
|
+
border: 1px solid var(--color-outline, #e0e0e0);
|
|
61
|
+
border-radius: 0.5rem;
|
|
62
|
+
box-shadow:
|
|
63
|
+
0 4px 6px -1px rgb(0 0 0 / 0.1),
|
|
64
|
+
0 2px 4px -2px rgb(0 0 0 / 0.1);
|
|
65
|
+
opacity: 0;
|
|
66
|
+
visibility: hidden;
|
|
67
|
+
transform: scale(0.95);
|
|
68
|
+
transition:
|
|
69
|
+
opacity 150ms ease,
|
|
70
|
+
visibility 150ms ease,
|
|
71
|
+
transform 150ms ease;
|
|
72
|
+
pointer-events: none;
|
|
73
|
+
font-family: inherit;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.popover-panel.visible {
|
|
77
|
+
opacity: 1;
|
|
78
|
+
visibility: visible;
|
|
79
|
+
transform: scale(1);
|
|
80
|
+
pointer-events: auto;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.popover-arrow {
|
|
84
|
+
position: absolute;
|
|
85
|
+
width: 0.75rem;
|
|
86
|
+
height: 0.75rem;
|
|
87
|
+
background-color: var(--color-surface, #ffffff);
|
|
88
|
+
border: 1px solid var(--color-outline, #e0e0e0);
|
|
89
|
+
transform: rotate(45deg);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/* Arrow positioning based on popover placement */
|
|
93
|
+
.popover-panel[data-placement^='top'] .popover-arrow {
|
|
94
|
+
bottom: -0.4375rem;
|
|
95
|
+
border-top: none;
|
|
96
|
+
border-left: none;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.popover-panel[data-placement^='bottom'] .popover-arrow {
|
|
100
|
+
top: -0.4375rem;
|
|
101
|
+
border-bottom: none;
|
|
102
|
+
border-right: none;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.popover-panel[data-placement^='left'] .popover-arrow {
|
|
106
|
+
right: -0.4375rem;
|
|
107
|
+
border-top: none;
|
|
108
|
+
border-left: none;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.popover-panel[data-placement^='right'] .popover-arrow {
|
|
112
|
+
left: -0.4375rem;
|
|
113
|
+
border-bottom: none;
|
|
114
|
+
border-right: none;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/* Center aligned arrows */
|
|
118
|
+
.popover-panel[data-placement='top'] .popover-arrow,
|
|
119
|
+
.popover-panel[data-placement='bottom'] .popover-arrow {
|
|
120
|
+
left: 50%;
|
|
121
|
+
transform: translateX(-50%) rotate(45deg);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.popover-panel[data-placement='left'] .popover-arrow,
|
|
125
|
+
.popover-panel[data-placement='right'] .popover-arrow {
|
|
126
|
+
top: 50%;
|
|
127
|
+
transform: translateY(-50%) rotate(45deg);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/* Start aligned arrows */
|
|
131
|
+
.popover-panel[data-placement='top-start'] .popover-arrow,
|
|
132
|
+
.popover-panel[data-placement='bottom-start'] .popover-arrow {
|
|
133
|
+
left: 1rem;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.popover-panel[data-placement='left-start'] .popover-arrow,
|
|
137
|
+
.popover-panel[data-placement='right-start'] .popover-arrow {
|
|
138
|
+
top: 1rem;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/* End aligned arrows */
|
|
142
|
+
.popover-panel[data-placement='top-end'] .popover-arrow,
|
|
143
|
+
.popover-panel[data-placement='bottom-end'] .popover-arrow {
|
|
144
|
+
right: 1rem;
|
|
145
|
+
left: auto;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.popover-panel[data-placement='left-end'] .popover-arrow,
|
|
149
|
+
.popover-panel[data-placement='right-end'] .popover-arrow {
|
|
150
|
+
bottom: 1rem;
|
|
151
|
+
top: auto;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.popover-content {
|
|
155
|
+
color: var(--color-on-surface, #1f1f1f);
|
|
156
|
+
font-size: 0.875rem;
|
|
157
|
+
line-height: 1.5;
|
|
158
|
+
}
|
|
159
|
+
`;
|
|
160
|
+
|
|
161
|
+
class ElDmPopover extends import_el_core.BaseElement {
|
|
162
|
+
static properties = {
|
|
163
|
+
open: { type: Boolean, reflect: true, default: false },
|
|
164
|
+
trigger: { type: String, reflect: true, default: "click" },
|
|
165
|
+
placement: { type: String, reflect: true, default: "bottom" },
|
|
166
|
+
offset: { type: Number, reflect: true, default: 8 },
|
|
167
|
+
arrow: { type: Boolean, reflect: true, default: true }
|
|
168
|
+
};
|
|
169
|
+
_boundHandleClickOutside;
|
|
170
|
+
_boundHandleKeyDown;
|
|
171
|
+
_boundHandleScroll;
|
|
172
|
+
_boundUpdatePosition;
|
|
173
|
+
_hoverTimeout = null;
|
|
174
|
+
_currentPlacement = "bottom";
|
|
175
|
+
constructor() {
|
|
176
|
+
super();
|
|
177
|
+
this.attachStyles(styles);
|
|
178
|
+
this._boundHandleClickOutside = this._handleClickOutside.bind(this);
|
|
179
|
+
this._boundHandleKeyDown = this._handleKeyDown.bind(this);
|
|
180
|
+
this._boundHandleScroll = this._handleScroll.bind(this);
|
|
181
|
+
this._boundUpdatePosition = this._updatePosition.bind(this);
|
|
182
|
+
}
|
|
183
|
+
connectedCallback() {
|
|
184
|
+
super.connectedCallback();
|
|
185
|
+
this._setupTriggerListeners();
|
|
186
|
+
}
|
|
187
|
+
disconnectedCallback() {
|
|
188
|
+
super.disconnectedCallback?.();
|
|
189
|
+
this._removeTriggerListeners();
|
|
190
|
+
this._removeGlobalListeners();
|
|
191
|
+
}
|
|
192
|
+
show() {
|
|
193
|
+
if (this.open)
|
|
194
|
+
return;
|
|
195
|
+
this.open = true;
|
|
196
|
+
this._currentPlacement = this.placement;
|
|
197
|
+
this._addGlobalListeners();
|
|
198
|
+
this._updatePosition();
|
|
199
|
+
this._setVisible(true);
|
|
200
|
+
this.emit("open");
|
|
201
|
+
}
|
|
202
|
+
hide() {
|
|
203
|
+
if (!this.open)
|
|
204
|
+
return;
|
|
205
|
+
this.open = false;
|
|
206
|
+
this._removeGlobalListeners();
|
|
207
|
+
this._setVisible(false);
|
|
208
|
+
this.emit("close");
|
|
209
|
+
}
|
|
210
|
+
toggle() {
|
|
211
|
+
if (this.open) {
|
|
212
|
+
this.hide();
|
|
213
|
+
} else {
|
|
214
|
+
this.show();
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
_setVisible(visible) {
|
|
218
|
+
const panel = this.shadowRoot?.querySelector(".popover-panel");
|
|
219
|
+
if (panel) {
|
|
220
|
+
panel.classList.toggle("visible", visible);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
_setupTriggerListeners() {
|
|
224
|
+
const triggerSlot = this.shadowRoot?.querySelector('slot[name="trigger"]');
|
|
225
|
+
if (!triggerSlot)
|
|
226
|
+
return;
|
|
227
|
+
triggerSlot.addEventListener("slotchange", () => {
|
|
228
|
+
this._attachTriggerEvents();
|
|
229
|
+
});
|
|
230
|
+
this._attachTriggerEvents();
|
|
231
|
+
}
|
|
232
|
+
_attachTriggerEvents() {
|
|
233
|
+
const triggerEl = this._getTriggerElement();
|
|
234
|
+
if (!triggerEl)
|
|
235
|
+
return;
|
|
236
|
+
this._detachTriggerEvents(triggerEl);
|
|
237
|
+
if (this.trigger === "click") {
|
|
238
|
+
triggerEl.addEventListener("click", this._handleTriggerClick);
|
|
239
|
+
} else if (this.trigger === "hover") {
|
|
240
|
+
triggerEl.addEventListener("mouseenter", this._handleTriggerMouseEnter);
|
|
241
|
+
triggerEl.addEventListener("mouseleave", this._handleTriggerMouseLeave);
|
|
242
|
+
this.addEventListener("mouseenter", this._handlePopoverMouseEnter);
|
|
243
|
+
this.addEventListener("mouseleave", this._handlePopoverMouseLeave);
|
|
244
|
+
} else if (this.trigger === "focus") {
|
|
245
|
+
triggerEl.addEventListener("focusin", this._handleTriggerFocus);
|
|
246
|
+
triggerEl.addEventListener("focusout", this._handleTriggerBlur);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
_detachTriggerEvents(triggerEl) {
|
|
250
|
+
triggerEl.removeEventListener("click", this._handleTriggerClick);
|
|
251
|
+
triggerEl.removeEventListener("mouseenter", this._handleTriggerMouseEnter);
|
|
252
|
+
triggerEl.removeEventListener("mouseleave", this._handleTriggerMouseLeave);
|
|
253
|
+
triggerEl.removeEventListener("focusin", this._handleTriggerFocus);
|
|
254
|
+
triggerEl.removeEventListener("focusout", this._handleTriggerBlur);
|
|
255
|
+
this.removeEventListener("mouseenter", this._handlePopoverMouseEnter);
|
|
256
|
+
this.removeEventListener("mouseleave", this._handlePopoverMouseLeave);
|
|
257
|
+
}
|
|
258
|
+
_removeTriggerListeners() {
|
|
259
|
+
const triggerEl = this._getTriggerElement();
|
|
260
|
+
if (triggerEl) {
|
|
261
|
+
this._detachTriggerEvents(triggerEl);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
_getTriggerElement() {
|
|
265
|
+
const triggerSlot = this.shadowRoot?.querySelector('slot[name="trigger"]');
|
|
266
|
+
if (!triggerSlot)
|
|
267
|
+
return null;
|
|
268
|
+
const assigned = triggerSlot.assignedElements();
|
|
269
|
+
return assigned[0] || null;
|
|
270
|
+
}
|
|
271
|
+
_handleTriggerClick = () => {
|
|
272
|
+
this.toggle();
|
|
273
|
+
};
|
|
274
|
+
_handleTriggerMouseEnter = () => {
|
|
275
|
+
if (this._hoverTimeout) {
|
|
276
|
+
clearTimeout(this._hoverTimeout);
|
|
277
|
+
this._hoverTimeout = null;
|
|
278
|
+
}
|
|
279
|
+
this.show();
|
|
280
|
+
};
|
|
281
|
+
_handleTriggerMouseLeave = () => {
|
|
282
|
+
this._hoverTimeout = window.setTimeout(() => {
|
|
283
|
+
this.hide();
|
|
284
|
+
}, 100);
|
|
285
|
+
};
|
|
286
|
+
_handlePopoverMouseEnter = () => {
|
|
287
|
+
if (this._hoverTimeout) {
|
|
288
|
+
clearTimeout(this._hoverTimeout);
|
|
289
|
+
this._hoverTimeout = null;
|
|
290
|
+
}
|
|
291
|
+
};
|
|
292
|
+
_handlePopoverMouseLeave = () => {
|
|
293
|
+
this._hoverTimeout = window.setTimeout(() => {
|
|
294
|
+
this.hide();
|
|
295
|
+
}, 100);
|
|
296
|
+
};
|
|
297
|
+
_handleTriggerFocus = () => {
|
|
298
|
+
this.show();
|
|
299
|
+
};
|
|
300
|
+
_handleTriggerBlur = () => {
|
|
301
|
+
setTimeout(() => {
|
|
302
|
+
if (!this.contains(document.activeElement)) {
|
|
303
|
+
this.hide();
|
|
304
|
+
}
|
|
305
|
+
}, 0);
|
|
306
|
+
};
|
|
307
|
+
_addGlobalListeners() {
|
|
308
|
+
document.addEventListener("click", this._boundHandleClickOutside, true);
|
|
309
|
+
document.addEventListener("keydown", this._boundHandleKeyDown);
|
|
310
|
+
window.addEventListener("scroll", this._boundHandleScroll, true);
|
|
311
|
+
window.addEventListener("resize", this._boundUpdatePosition);
|
|
312
|
+
}
|
|
313
|
+
_removeGlobalListeners() {
|
|
314
|
+
document.removeEventListener("click", this._boundHandleClickOutside, true);
|
|
315
|
+
document.removeEventListener("keydown", this._boundHandleKeyDown);
|
|
316
|
+
window.removeEventListener("scroll", this._boundHandleScroll, true);
|
|
317
|
+
window.removeEventListener("resize", this._boundUpdatePosition);
|
|
318
|
+
}
|
|
319
|
+
_handleClickOutside(e) {
|
|
320
|
+
if (this.trigger !== "click")
|
|
321
|
+
return;
|
|
322
|
+
const path = e.composedPath();
|
|
323
|
+
if (!path.includes(this)) {
|
|
324
|
+
this.hide();
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
_handleKeyDown(e) {
|
|
328
|
+
if (e.key === "Escape") {
|
|
329
|
+
this.hide();
|
|
330
|
+
const triggerEl = this._getTriggerElement();
|
|
331
|
+
triggerEl?.focus?.();
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
_handleScroll() {
|
|
335
|
+
if (this.open) {
|
|
336
|
+
this._updatePosition();
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
_updatePosition() {
|
|
340
|
+
const triggerEl = this._getTriggerElement();
|
|
341
|
+
const panel = this.shadowRoot?.querySelector(".popover-panel");
|
|
342
|
+
if (!triggerEl || !panel)
|
|
343
|
+
return;
|
|
344
|
+
const triggerRect = triggerEl.getBoundingClientRect();
|
|
345
|
+
const panelRect = panel.getBoundingClientRect();
|
|
346
|
+
const viewportWidth = window.innerWidth;
|
|
347
|
+
const viewportHeight = window.innerHeight;
|
|
348
|
+
const effectivePlacement = this._getEffectivePlacement(triggerRect, panelRect, viewportWidth, viewportHeight);
|
|
349
|
+
this._currentPlacement = effectivePlacement;
|
|
350
|
+
const position = this._calculatePosition(triggerRect, panelRect, effectivePlacement);
|
|
351
|
+
panel.style.left = `${position.x}px`;
|
|
352
|
+
panel.style.top = `${position.y}px`;
|
|
353
|
+
panel.setAttribute("data-placement", effectivePlacement);
|
|
354
|
+
}
|
|
355
|
+
_getEffectivePlacement(triggerRect, panelRect, viewportWidth, viewportHeight) {
|
|
356
|
+
const [mainAxis, alignment] = this.placement.split("-");
|
|
357
|
+
const spaceTop = triggerRect.top;
|
|
358
|
+
const spaceBottom = viewportHeight - triggerRect.bottom;
|
|
359
|
+
const spaceLeft = triggerRect.left;
|
|
360
|
+
const spaceRight = viewportWidth - triggerRect.right;
|
|
361
|
+
let effectiveMainAxis = mainAxis;
|
|
362
|
+
if (mainAxis === "top" && spaceTop < panelRect.height + this.offset) {
|
|
363
|
+
if (spaceBottom >= panelRect.height + this.offset) {
|
|
364
|
+
effectiveMainAxis = "bottom";
|
|
365
|
+
}
|
|
366
|
+
} else if (mainAxis === "bottom" && spaceBottom < panelRect.height + this.offset) {
|
|
367
|
+
if (spaceTop >= panelRect.height + this.offset) {
|
|
368
|
+
effectiveMainAxis = "top";
|
|
369
|
+
}
|
|
370
|
+
} else if (mainAxis === "left" && spaceLeft < panelRect.width + this.offset) {
|
|
371
|
+
if (spaceRight >= panelRect.width + this.offset) {
|
|
372
|
+
effectiveMainAxis = "right";
|
|
373
|
+
}
|
|
374
|
+
} else if (mainAxis === "right" && spaceRight < panelRect.width + this.offset) {
|
|
375
|
+
if (spaceLeft >= panelRect.width + this.offset) {
|
|
376
|
+
effectiveMainAxis = "left";
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
return alignment ? `${effectiveMainAxis}-${alignment}` : effectiveMainAxis;
|
|
380
|
+
}
|
|
381
|
+
_calculatePosition(triggerRect, panelRect, placement) {
|
|
382
|
+
const [mainAxis, alignment] = placement.split("-");
|
|
383
|
+
let x = 0;
|
|
384
|
+
let y = 0;
|
|
385
|
+
switch (mainAxis) {
|
|
386
|
+
case "top":
|
|
387
|
+
y = triggerRect.top - panelRect.height - this.offset;
|
|
388
|
+
break;
|
|
389
|
+
case "bottom":
|
|
390
|
+
y = triggerRect.bottom + this.offset;
|
|
391
|
+
break;
|
|
392
|
+
case "left":
|
|
393
|
+
x = triggerRect.left - panelRect.width - this.offset;
|
|
394
|
+
break;
|
|
395
|
+
case "right":
|
|
396
|
+
x = triggerRect.right + this.offset;
|
|
397
|
+
break;
|
|
398
|
+
}
|
|
399
|
+
if (mainAxis === "top" || mainAxis === "bottom") {
|
|
400
|
+
switch (alignment) {
|
|
401
|
+
case "start":
|
|
402
|
+
x = triggerRect.left;
|
|
403
|
+
break;
|
|
404
|
+
case "end":
|
|
405
|
+
x = triggerRect.right - panelRect.width;
|
|
406
|
+
break;
|
|
407
|
+
default:
|
|
408
|
+
x = triggerRect.left + (triggerRect.width - panelRect.width) / 2;
|
|
409
|
+
}
|
|
410
|
+
} else {
|
|
411
|
+
switch (alignment) {
|
|
412
|
+
case "start":
|
|
413
|
+
y = triggerRect.top;
|
|
414
|
+
break;
|
|
415
|
+
case "end":
|
|
416
|
+
y = triggerRect.bottom - panelRect.height;
|
|
417
|
+
break;
|
|
418
|
+
default:
|
|
419
|
+
y = triggerRect.top + (triggerRect.height - panelRect.height) / 2;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
const viewportWidth = window.innerWidth;
|
|
423
|
+
const viewportHeight = window.innerHeight;
|
|
424
|
+
const padding = 8;
|
|
425
|
+
x = Math.max(padding, Math.min(x, viewportWidth - panelRect.width - padding));
|
|
426
|
+
y = Math.max(padding, Math.min(y, viewportHeight - panelRect.height - padding));
|
|
427
|
+
return { x, y };
|
|
428
|
+
}
|
|
429
|
+
update() {
|
|
430
|
+
super.update();
|
|
431
|
+
if (this.open) {
|
|
432
|
+
requestAnimationFrame(() => {
|
|
433
|
+
this._updatePosition();
|
|
434
|
+
this._setVisible(true);
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
render() {
|
|
439
|
+
return `
|
|
440
|
+
<div class="popover-trigger">
|
|
441
|
+
<slot name="trigger"></slot>
|
|
442
|
+
</div>
|
|
443
|
+
<div
|
|
444
|
+
class="popover-panel"
|
|
445
|
+
part="popover"
|
|
446
|
+
role="dialog"
|
|
447
|
+
aria-modal="false"
|
|
448
|
+
data-placement="${this.placement}"
|
|
449
|
+
>
|
|
450
|
+
${this.arrow ? '<div class="popover-arrow" part="arrow"></div>' : ""}
|
|
451
|
+
<div class="popover-content" part="content">
|
|
452
|
+
<slot></slot>
|
|
453
|
+
</div>
|
|
454
|
+
</div>
|
|
455
|
+
`;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
// src/index.ts
|
|
460
|
+
function register() {
|
|
461
|
+
if (!customElements.get("el-dm-popover")) {
|
|
462
|
+
customElements.define("el-dm-popover", ElDmPopover);
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
//# debugId=9AD0C450FA37F1BF64756E2164756E21
|
|
467
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/el-dm-popover.ts", "../../src/index.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * DuskMoon Popover Element\n *\n * A contextual overlay/popup component that appears relative to a trigger element.\n * Supports multiple trigger modes, placements, and auto-flip when near viewport edges.\n *\n * @element el-dm-popover\n *\n * @attr {boolean} open - Whether the popover is visible\n * @attr {string} trigger - Trigger mode: click, hover, focus, manual\n * @attr {string} placement - Popover position relative to trigger\n * @attr {number} offset - Distance from trigger element in pixels\n * @attr {boolean} arrow - Whether to show arrow pointing to trigger\n *\n * @slot trigger - The element that triggers the popover\n * @slot - Default slot for popover content\n *\n * @fires open - Fired when popover opens\n * @fires close - Fired when popover closes\n *\n * @csspart popover - The popover container\n * @csspart content - The popover content area\n * @csspart arrow - The popover arrow\n */\n\nimport { BaseElement, css } from '@duskmoon-dev/el-core';\n\nexport type PopoverPlacement =\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'left'\n | 'left-start'\n | 'left-end'\n | 'right'\n | 'right-start'\n | 'right-end';\n\nexport type PopoverTrigger = 'click' | 'hover' | 'focus' | 'manual';\n\nconst styles = css`\n :host {\n display: inline-block;\n position: relative;\n }\n\n :host([hidden]) {\n display: none !important;\n }\n\n .popover-trigger {\n display: inline-flex;\n }\n\n .popover-panel {\n position: fixed;\n z-index: 1000;\n min-width: 8rem;\n max-width: 20rem;\n padding: 0.75rem 1rem;\n background-color: var(--color-surface, #ffffff);\n border: 1px solid var(--color-outline, #e0e0e0);\n border-radius: 0.5rem;\n box-shadow:\n 0 4px 6px -1px rgb(0 0 0 / 0.1),\n 0 2px 4px -2px rgb(0 0 0 / 0.1);\n opacity: 0;\n visibility: hidden;\n transform: scale(0.95);\n transition:\n opacity 150ms ease,\n visibility 150ms ease,\n transform 150ms ease;\n pointer-events: none;\n font-family: inherit;\n }\n\n .popover-panel.visible {\n opacity: 1;\n visibility: visible;\n transform: scale(1);\n pointer-events: auto;\n }\n\n .popover-arrow {\n position: absolute;\n width: 0.75rem;\n height: 0.75rem;\n background-color: var(--color-surface, #ffffff);\n border: 1px solid var(--color-outline, #e0e0e0);\n transform: rotate(45deg);\n }\n\n /* Arrow positioning based on popover placement */\n .popover-panel[data-placement^='top'] .popover-arrow {\n bottom: -0.4375rem;\n border-top: none;\n border-left: none;\n }\n\n .popover-panel[data-placement^='bottom'] .popover-arrow {\n top: -0.4375rem;\n border-bottom: none;\n border-right: none;\n }\n\n .popover-panel[data-placement^='left'] .popover-arrow {\n right: -0.4375rem;\n border-top: none;\n border-left: none;\n }\n\n .popover-panel[data-placement^='right'] .popover-arrow {\n left: -0.4375rem;\n border-bottom: none;\n border-right: none;\n }\n\n /* Center aligned arrows */\n .popover-panel[data-placement='top'] .popover-arrow,\n .popover-panel[data-placement='bottom'] .popover-arrow {\n left: 50%;\n transform: translateX(-50%) rotate(45deg);\n }\n\n .popover-panel[data-placement='left'] .popover-arrow,\n .popover-panel[data-placement='right'] .popover-arrow {\n top: 50%;\n transform: translateY(-50%) rotate(45deg);\n }\n\n /* Start aligned arrows */\n .popover-panel[data-placement='top-start'] .popover-arrow,\n .popover-panel[data-placement='bottom-start'] .popover-arrow {\n left: 1rem;\n }\n\n .popover-panel[data-placement='left-start'] .popover-arrow,\n .popover-panel[data-placement='right-start'] .popover-arrow {\n top: 1rem;\n }\n\n /* End aligned arrows */\n .popover-panel[data-placement='top-end'] .popover-arrow,\n .popover-panel[data-placement='bottom-end'] .popover-arrow {\n right: 1rem;\n left: auto;\n }\n\n .popover-panel[data-placement='left-end'] .popover-arrow,\n .popover-panel[data-placement='right-end'] .popover-arrow {\n bottom: 1rem;\n top: auto;\n }\n\n .popover-content {\n color: var(--color-on-surface, #1f1f1f);\n font-size: 0.875rem;\n line-height: 1.5;\n }\n`;\n\nexport class ElDmPopover extends BaseElement {\n static properties = {\n open: { type: Boolean, reflect: true, default: false },\n trigger: { type: String, reflect: true, default: 'click' },\n placement: { type: String, reflect: true, default: 'bottom' },\n offset: { type: Number, reflect: true, default: 8 },\n arrow: { type: Boolean, reflect: true, default: true },\n };\n\n declare open: boolean;\n declare trigger: PopoverTrigger;\n declare placement: PopoverPlacement;\n declare offset: number;\n declare arrow: boolean;\n\n private _boundHandleClickOutside: (e: MouseEvent) => void;\n private _boundHandleKeyDown: (e: KeyboardEvent) => void;\n private _boundHandleScroll: () => void;\n private _boundUpdatePosition: () => void;\n private _hoverTimeout: number | null = null;\n private _currentPlacement: PopoverPlacement = 'bottom';\n\n constructor() {\n super();\n this.attachStyles(styles);\n this._boundHandleClickOutside = this._handleClickOutside.bind(this);\n this._boundHandleKeyDown = this._handleKeyDown.bind(this);\n this._boundHandleScroll = this._handleScroll.bind(this);\n this._boundUpdatePosition = this._updatePosition.bind(this);\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n this._setupTriggerListeners();\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback?.();\n this._removeTriggerListeners();\n this._removeGlobalListeners();\n }\n\n /**\n * Show the popover\n */\n show(): void {\n if (this.open) return;\n this.open = true;\n this._currentPlacement = this.placement;\n this._addGlobalListeners();\n this._updatePosition();\n this._setVisible(true);\n this.emit('open');\n }\n\n /**\n * Hide the popover\n */\n hide(): void {\n if (!this.open) return;\n this.open = false;\n this._removeGlobalListeners();\n this._setVisible(false);\n this.emit('close');\n }\n\n /**\n * Toggle the popover visibility\n */\n toggle(): void {\n if (this.open) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n private _setVisible(visible: boolean): void {\n const panel = this.shadowRoot?.querySelector('.popover-panel');\n if (panel) {\n panel.classList.toggle('visible', visible);\n }\n }\n\n private _setupTriggerListeners(): void {\n const triggerSlot = this.shadowRoot?.querySelector(\n 'slot[name=\"trigger\"]',\n ) as HTMLSlotElement | null;\n\n if (!triggerSlot) return;\n\n triggerSlot.addEventListener('slotchange', () => {\n this._attachTriggerEvents();\n });\n\n // Initial attachment\n this._attachTriggerEvents();\n }\n\n private _attachTriggerEvents(): void {\n const triggerEl = this._getTriggerElement();\n if (!triggerEl) return;\n\n // Remove any existing listeners first\n this._detachTriggerEvents(triggerEl);\n\n if (this.trigger === 'click') {\n triggerEl.addEventListener('click', this._handleTriggerClick);\n } else if (this.trigger === 'hover') {\n triggerEl.addEventListener('mouseenter', this._handleTriggerMouseEnter);\n triggerEl.addEventListener('mouseleave', this._handleTriggerMouseLeave);\n // Also track hover on the popover panel\n this.addEventListener('mouseenter', this._handlePopoverMouseEnter);\n this.addEventListener('mouseleave', this._handlePopoverMouseLeave);\n } else if (this.trigger === 'focus') {\n triggerEl.addEventListener('focusin', this._handleTriggerFocus);\n triggerEl.addEventListener('focusout', this._handleTriggerBlur);\n }\n }\n\n private _detachTriggerEvents(triggerEl: Element): void {\n triggerEl.removeEventListener('click', this._handleTriggerClick);\n triggerEl.removeEventListener('mouseenter', this._handleTriggerMouseEnter);\n triggerEl.removeEventListener('mouseleave', this._handleTriggerMouseLeave);\n triggerEl.removeEventListener('focusin', this._handleTriggerFocus);\n triggerEl.removeEventListener('focusout', this._handleTriggerBlur);\n this.removeEventListener('mouseenter', this._handlePopoverMouseEnter);\n this.removeEventListener('mouseleave', this._handlePopoverMouseLeave);\n }\n\n private _removeTriggerListeners(): void {\n const triggerEl = this._getTriggerElement();\n if (triggerEl) {\n this._detachTriggerEvents(triggerEl);\n }\n }\n\n private _getTriggerElement(): Element | null {\n const triggerSlot = this.shadowRoot?.querySelector(\n 'slot[name=\"trigger\"]',\n ) as HTMLSlotElement | null;\n if (!triggerSlot) return null;\n const assigned = triggerSlot.assignedElements();\n return assigned[0] || null;\n }\n\n private _handleTriggerClick = (): void => {\n this.toggle();\n };\n\n private _handleTriggerMouseEnter = (): void => {\n if (this._hoverTimeout) {\n clearTimeout(this._hoverTimeout);\n this._hoverTimeout = null;\n }\n this.show();\n };\n\n private _handleTriggerMouseLeave = (): void => {\n this._hoverTimeout = window.setTimeout(() => {\n this.hide();\n }, 100);\n };\n\n private _handlePopoverMouseEnter = (): void => {\n if (this._hoverTimeout) {\n clearTimeout(this._hoverTimeout);\n this._hoverTimeout = null;\n }\n };\n\n private _handlePopoverMouseLeave = (): void => {\n this._hoverTimeout = window.setTimeout(() => {\n this.hide();\n }, 100);\n };\n\n private _handleTriggerFocus = (): void => {\n this.show();\n };\n\n private _handleTriggerBlur = (): void => {\n // Delay to allow focus to move to popover content\n setTimeout(() => {\n if (!this.contains(document.activeElement)) {\n this.hide();\n }\n }, 0);\n };\n\n private _addGlobalListeners(): void {\n document.addEventListener('click', this._boundHandleClickOutside, true);\n document.addEventListener('keydown', this._boundHandleKeyDown);\n window.addEventListener('scroll', this._boundHandleScroll, true);\n window.addEventListener('resize', this._boundUpdatePosition);\n }\n\n private _removeGlobalListeners(): void {\n document.removeEventListener('click', this._boundHandleClickOutside, true);\n document.removeEventListener('keydown', this._boundHandleKeyDown);\n window.removeEventListener('scroll', this._boundHandleScroll, true);\n window.removeEventListener('resize', this._boundUpdatePosition);\n }\n\n private _handleClickOutside(e: MouseEvent): void {\n if (this.trigger !== 'click') return;\n\n const path = e.composedPath();\n if (!path.includes(this)) {\n this.hide();\n }\n }\n\n private _handleKeyDown(e: KeyboardEvent): void {\n if (e.key === 'Escape') {\n this.hide();\n // Return focus to trigger element\n const triggerEl = this._getTriggerElement() as HTMLElement | null;\n triggerEl?.focus?.();\n }\n }\n\n private _handleScroll(): void {\n if (this.open) {\n this._updatePosition();\n }\n }\n\n private _updatePosition(): void {\n const triggerEl = this._getTriggerElement();\n const panel = this.shadowRoot?.querySelector('.popover-panel') as HTMLElement | null;\n\n if (!triggerEl || !panel) return;\n\n const triggerRect = triggerEl.getBoundingClientRect();\n const panelRect = panel.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n // Determine the best placement with auto-flip\n const effectivePlacement = this._getEffectivePlacement(\n triggerRect,\n panelRect,\n viewportWidth,\n viewportHeight,\n );\n\n this._currentPlacement = effectivePlacement;\n\n // Calculate position based on placement\n const position = this._calculatePosition(triggerRect, panelRect, effectivePlacement);\n\n // Apply position\n panel.style.left = `${position.x}px`;\n panel.style.top = `${position.y}px`;\n panel.setAttribute('data-placement', effectivePlacement);\n }\n\n private _getEffectivePlacement(\n triggerRect: DOMRect,\n panelRect: DOMRect,\n viewportWidth: number,\n viewportHeight: number,\n ): PopoverPlacement {\n const [mainAxis, alignment] = this.placement.split('-') as [\n 'top' | 'bottom' | 'left' | 'right',\n 'start' | 'end' | undefined,\n ];\n\n // Check if there's enough space in the preferred direction\n const spaceTop = triggerRect.top;\n const spaceBottom = viewportHeight - triggerRect.bottom;\n const spaceLeft = triggerRect.left;\n const spaceRight = viewportWidth - triggerRect.right;\n\n let effectiveMainAxis = mainAxis;\n\n // Flip main axis if needed\n if (mainAxis === 'top' && spaceTop < panelRect.height + this.offset) {\n if (spaceBottom >= panelRect.height + this.offset) {\n effectiveMainAxis = 'bottom';\n }\n } else if (mainAxis === 'bottom' && spaceBottom < panelRect.height + this.offset) {\n if (spaceTop >= panelRect.height + this.offset) {\n effectiveMainAxis = 'top';\n }\n } else if (mainAxis === 'left' && spaceLeft < panelRect.width + this.offset) {\n if (spaceRight >= panelRect.width + this.offset) {\n effectiveMainAxis = 'right';\n }\n } else if (mainAxis === 'right' && spaceRight < panelRect.width + this.offset) {\n if (spaceLeft >= panelRect.width + this.offset) {\n effectiveMainAxis = 'left';\n }\n }\n\n return alignment\n ? (`${effectiveMainAxis}-${alignment}` as PopoverPlacement)\n : effectiveMainAxis;\n }\n\n private _calculatePosition(\n triggerRect: DOMRect,\n panelRect: DOMRect,\n placement: PopoverPlacement,\n ): { x: number; y: number } {\n const [mainAxis, alignment] = placement.split('-') as [\n 'top' | 'bottom' | 'left' | 'right',\n 'start' | 'end' | undefined,\n ];\n\n let x = 0;\n let y = 0;\n\n // Calculate main axis position\n switch (mainAxis) {\n case 'top':\n y = triggerRect.top - panelRect.height - this.offset;\n break;\n case 'bottom':\n y = triggerRect.bottom + this.offset;\n break;\n case 'left':\n x = triggerRect.left - panelRect.width - this.offset;\n break;\n case 'right':\n x = triggerRect.right + this.offset;\n break;\n }\n\n // Calculate cross axis position based on alignment\n if (mainAxis === 'top' || mainAxis === 'bottom') {\n switch (alignment) {\n case 'start':\n x = triggerRect.left;\n break;\n case 'end':\n x = triggerRect.right - panelRect.width;\n break;\n default:\n x = triggerRect.left + (triggerRect.width - panelRect.width) / 2;\n }\n } else {\n switch (alignment) {\n case 'start':\n y = triggerRect.top;\n break;\n case 'end':\n y = triggerRect.bottom - panelRect.height;\n break;\n default:\n y = triggerRect.top + (triggerRect.height - panelRect.height) / 2;\n }\n }\n\n // Constrain to viewport\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const padding = 8;\n\n x = Math.max(padding, Math.min(x, viewportWidth - panelRect.width - padding));\n y = Math.max(padding, Math.min(y, viewportHeight - panelRect.height - padding));\n\n return { x, y };\n }\n\n update(): void {\n super.update();\n if (this.open) {\n // Defer position update to allow DOM to render\n requestAnimationFrame(() => {\n this._updatePosition();\n this._setVisible(true);\n });\n }\n }\n\n render(): string {\n return `\n <div class=\"popover-trigger\">\n <slot name=\"trigger\"></slot>\n </div>\n <div\n class=\"popover-panel\"\n part=\"popover\"\n role=\"dialog\"\n aria-modal=\"false\"\n data-placement=\"${this.placement}\"\n >\n ${this.arrow ? '<div class=\"popover-arrow\" part=\"arrow\"></div>' : ''}\n <div class=\"popover-content\" part=\"content\">\n <slot></slot>\n </div>\n </div>\n `;\n }\n}\n",
|
|
6
|
+
"/**\n * @duskmoon-dev/el-popover\n *\n * DuskMoon Popover custom element\n */\n\nimport { ElDmPopover } from './el-dm-popover.js';\n\nexport { ElDmPopover };\nexport type { PopoverPlacement, PopoverTrigger } from './el-dm-popover.js';\n\n/**\n * Register the el-dm-popover custom element\n *\n * @example\n * ```ts\n * import { register } from '@duskmoon-dev/el-popover';\n * register();\n * ```\n */\nexport function register(): void {\n if (!customElements.get('el-dm-popover')) {\n customElements.define('el-dm-popover', ElDmPopover);\n }\n}\n"
|
|
7
|
+
],
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "9AD0C450FA37F1BF64756E2164756E21",
|
|
10
|
+
"names": []
|
|
11
|
+
}
|