@krollins/blueprint 0.1.11 → 0.1.13

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 (95) hide show
  1. package/dist/components/accordion.js +393 -0
  2. package/dist/components/accordion.js.map +1 -0
  3. package/dist/components/alert.js +213 -0
  4. package/dist/components/alert.js.map +1 -0
  5. package/dist/components/avatar.js +237 -0
  6. package/dist/components/avatar.js.map +1 -0
  7. package/dist/components/badge.js +144 -0
  8. package/dist/components/badge.js.map +1 -0
  9. package/dist/components/breadcrumb.js +481 -0
  10. package/dist/components/breadcrumb.js.map +1 -0
  11. package/dist/components/button.js +192 -0
  12. package/dist/components/button.js.map +1 -0
  13. package/dist/components/card.js +223 -0
  14. package/dist/components/card.js.map +1 -0
  15. package/dist/components/checkbox.js +337 -0
  16. package/dist/components/checkbox.js.map +1 -0
  17. package/dist/components/color-picker.js +1660 -0
  18. package/dist/components/color-picker.js.map +1 -0
  19. package/dist/components/combobox.js +595 -0
  20. package/dist/components/combobox.js.map +1 -0
  21. package/dist/components/date-picker.js +726 -0
  22. package/dist/components/date-picker.js.map +1 -0
  23. package/dist/components/divider.js +214 -0
  24. package/dist/components/divider.js.map +1 -0
  25. package/dist/components/drawer.js +568 -0
  26. package/dist/components/drawer.js.map +1 -0
  27. package/dist/components/dropdown.js +377 -0
  28. package/dist/components/dropdown.js.map +1 -0
  29. package/dist/components/file-upload.js +669 -0
  30. package/dist/components/file-upload.js.map +1 -0
  31. package/dist/components/heading.js +161 -0
  32. package/dist/components/heading.js.map +1 -0
  33. package/dist/components/icon.js +599 -0
  34. package/dist/components/icon.js.map +1 -0
  35. package/dist/components/input.js +363 -0
  36. package/dist/components/input.js.map +1 -0
  37. package/dist/components/link.js +178 -0
  38. package/dist/components/link.js.map +1 -0
  39. package/dist/components/menu.js +331 -0
  40. package/dist/components/menu.js.map +1 -0
  41. package/dist/components/modal.js +317 -0
  42. package/dist/components/modal.js.map +1 -0
  43. package/dist/components/multi-select.js +642 -0
  44. package/dist/components/multi-select.js.map +1 -0
  45. package/dist/components/notification.js +429 -0
  46. package/dist/components/notification.js.map +1 -0
  47. package/dist/components/number-input.js +556 -0
  48. package/dist/components/number-input.js.map +1 -0
  49. package/dist/components/pagination.js +320 -0
  50. package/dist/components/pagination.js.map +1 -0
  51. package/dist/components/popover.js +597 -0
  52. package/dist/components/popover.js.map +1 -0
  53. package/dist/components/progress.js +219 -0
  54. package/dist/components/progress.js.map +1 -0
  55. package/dist/components/radio.js +321 -0
  56. package/dist/components/radio.js.map +1 -0
  57. package/dist/components/select.js +498 -0
  58. package/dist/components/select.js.map +1 -0
  59. package/dist/components/skeleton.js +240 -0
  60. package/dist/components/skeleton.js.map +1 -0
  61. package/dist/components/slider.js +9 -0
  62. package/dist/components/slider.js.map +1 -0
  63. package/dist/components/spinner.js +133 -0
  64. package/dist/components/spinner.js.map +1 -0
  65. package/dist/components/stepper.js +812 -0
  66. package/dist/components/stepper.js.map +1 -0
  67. package/dist/components/switch.js +380 -0
  68. package/dist/components/switch.js.map +1 -0
  69. package/dist/components/table.js +642 -0
  70. package/dist/components/table.js.map +1 -0
  71. package/dist/components/tabs.js +547 -0
  72. package/dist/components/tabs.js.map +1 -0
  73. package/dist/components/tag.js +291 -0
  74. package/dist/components/tag.js.map +1 -0
  75. package/dist/components/text.js +278 -0
  76. package/dist/components/text.js.map +1 -0
  77. package/dist/components/textarea.js +380 -0
  78. package/dist/components/textarea.js.map +1 -0
  79. package/dist/components/time-picker.js +457 -0
  80. package/dist/components/time-picker.js.map +1 -0
  81. package/dist/components/tooltip.js +239 -0
  82. package/dist/components/tooltip.js.map +1 -0
  83. package/dist/components/tree.js +582 -0
  84. package/dist/components/tree.js.map +1 -0
  85. package/dist/index.js +93 -17799
  86. package/dist/index.js.map +1 -1
  87. package/dist/shared/boolean-converter-XDGfS9LC.js +12 -0
  88. package/dist/shared/boolean-converter-XDGfS9LC.js.map +1 -0
  89. package/dist/shared/debounce-BckY30Sf.js +23 -0
  90. package/dist/shared/debounce-BckY30Sf.js.map +1 -0
  91. package/dist/shared/memoize-DlOFy-92.js +16 -0
  92. package/dist/shared/memoize-DlOFy-92.js.map +1 -0
  93. package/dist/shared/slider-BNt5TITl.js +484 -0
  94. package/dist/shared/slider-BNt5TITl.js.map +1 -0
  95. package/package.json +49 -3
@@ -0,0 +1,597 @@
1
+ import { css as b, LitElement as _, nothing as i, html as a } from "lit";
2
+ import { property as r, state as c, query as u, customElement as g } from "lit/decorators.js";
3
+ import { b as v } from "../shared/boolean-converter-XDGfS9LC.js";
4
+ const m = b`
5
+ /* Base styles */
6
+ :host {
7
+ display: inline-block;
8
+ position: relative;
9
+ }
10
+
11
+ .popover {
12
+ position: relative;
13
+ display: inline-block;
14
+ font-family: var(--bp-font-family);
15
+ font-size: var(--bp-font-size-base);
16
+ color: var(--bp-color-text);
17
+ }
18
+
19
+ /* Trigger */
20
+ .popover__trigger {
21
+ display: inline-flex;
22
+ align-items: center;
23
+ cursor: pointer;
24
+ outline: none;
25
+ user-select: none;
26
+ }
27
+
28
+ .popover__trigger:hover {
29
+ opacity: 0.8;
30
+ }
31
+
32
+ .popover__trigger:focus-visible {
33
+ outline: var(--bp-focus-width) var(--bp-focus-style) var(--bp-color-focus);
34
+ outline-offset: var(--bp-focus-offset);
35
+ border-radius: var(--bp-border-radius-sm);
36
+ }
37
+
38
+ .popover--disabled .popover__trigger {
39
+ cursor: not-allowed;
40
+ opacity: var(--bp-opacity-disabled);
41
+ }
42
+
43
+ /* Panel base */
44
+ .popover__panel {
45
+ position: absolute;
46
+ z-index: var(--bp-z-popover);
47
+ min-width: 160px;
48
+ max-width: 320px;
49
+ max-height: calc(100vh - 80px);
50
+ background-color: var(--bp-color-surface-elevated);
51
+ border: var(--bp-border-width) solid var(--bp-color-border);
52
+ border-radius: var(--bp-border-radius-lg);
53
+ box-shadow: var(--bp-shadow-lg);
54
+ opacity: 1;
55
+ animation: popover-fade-in var(--bp-transition-fast) ease-out;
56
+ }
57
+
58
+ @keyframes popover-fade-in {
59
+ from {
60
+ opacity: 0;
61
+ transform: scale(0.95);
62
+ }
63
+ to {
64
+ opacity: 1;
65
+ transform: scale(1);
66
+ }
67
+ }
68
+
69
+ /* Panel placements - Bottom */
70
+ .popover__panel--bottom,
71
+ .popover__panel--bottom-start,
72
+ .popover__panel--bottom-end {
73
+ top: 100%;
74
+ margin-top: var(--popover-distance);
75
+ }
76
+
77
+ .popover__panel--bottom {
78
+ left: 50%;
79
+ transform: translateX(-50%);
80
+ }
81
+
82
+ .popover__panel--bottom-start {
83
+ left: 0;
84
+ }
85
+
86
+ .popover__panel--bottom-end {
87
+ right: 0;
88
+ }
89
+
90
+ /* Panel placements - Top */
91
+ .popover__panel--top,
92
+ .popover__panel--top-start,
93
+ .popover__panel--top-end {
94
+ bottom: 100%;
95
+ margin-bottom: var(--popover-distance);
96
+ }
97
+
98
+ .popover__panel--top {
99
+ left: 50%;
100
+ transform: translateX(-50%);
101
+ }
102
+
103
+ .popover__panel--top-start {
104
+ left: 0;
105
+ }
106
+
107
+ .popover__panel--top-end {
108
+ right: 0;
109
+ }
110
+
111
+ /* Panel placements - Left */
112
+ .popover__panel--left,
113
+ .popover__panel--left-start,
114
+ .popover__panel--left-end {
115
+ right: 100%;
116
+ margin-right: var(--popover-distance);
117
+ }
118
+
119
+ .popover__panel--left {
120
+ top: 50%;
121
+ transform: translateY(-50%);
122
+ }
123
+
124
+ .popover__panel--left-start {
125
+ top: 0;
126
+ }
127
+
128
+ .popover__panel--left-end {
129
+ bottom: 0;
130
+ }
131
+
132
+ /* Panel placements - Right */
133
+ .popover__panel--right,
134
+ .popover__panel--right-start,
135
+ .popover__panel--right-end {
136
+ left: 100%;
137
+ margin-left: var(--popover-distance);
138
+ }
139
+
140
+ .popover__panel--right {
141
+ top: 50%;
142
+ transform: translateY(-50%);
143
+ }
144
+
145
+ .popover__panel--right-start {
146
+ top: 0;
147
+ }
148
+
149
+ .popover__panel--right-end {
150
+ bottom: 0;
151
+ }
152
+
153
+ /* Arrow */
154
+ .popover__arrow {
155
+ position: absolute;
156
+ width: var(--bp-spacing-5);
157
+ height: var(--bp-spacing-5);
158
+ background-color: var(--bp-color-surface-elevated);
159
+ border: var(--bp-border-width) solid var(--bp-color-border);
160
+ transform: rotate(45deg);
161
+ z-index: -1;
162
+ }
163
+
164
+ /* Arrow positions - bottom placements */
165
+ .popover__panel--bottom .popover__arrow,
166
+ .popover__panel--bottom-start .popover__arrow,
167
+ .popover__panel--bottom-end .popover__arrow {
168
+ top: calc(var(--bp-spacing-2) * -1);
169
+ border-bottom: none;
170
+ border-right: none;
171
+ }
172
+
173
+ .popover__panel--bottom .popover__arrow {
174
+ left: 50%;
175
+ transform: translateX(-50%) rotate(45deg);
176
+ }
177
+
178
+ .popover__panel--bottom-start .popover__arrow {
179
+ left: var(--bp-spacing-5);
180
+ }
181
+
182
+ .popover__panel--bottom-end .popover__arrow {
183
+ right: var(--bp-spacing-5);
184
+ }
185
+
186
+ /* Arrow positions - top placements */
187
+ .popover__panel--top .popover__arrow,
188
+ .popover__panel--top-start .popover__arrow,
189
+ .popover__panel--top-end .popover__arrow {
190
+ bottom: calc(var(--bp-spacing-2) * -1);
191
+ border-top: none;
192
+ border-left: none;
193
+ }
194
+
195
+ .popover__panel--top .popover__arrow {
196
+ left: 50%;
197
+ transform: translateX(-50%) rotate(45deg);
198
+ }
199
+
200
+ .popover__panel--top-start .popover__arrow {
201
+ left: var(--bp-spacing-5);
202
+ }
203
+
204
+ .popover__panel--top-end .popover__arrow {
205
+ right: var(--bp-spacing-5);
206
+ }
207
+
208
+ /* Arrow positions - left placements */
209
+ .popover__panel--left .popover__arrow,
210
+ .popover__panel--left-start .popover__arrow,
211
+ .popover__panel--left-end .popover__arrow {
212
+ right: calc(var(--bp-spacing-2) * -1);
213
+ border-left: none;
214
+ border-bottom: none;
215
+ }
216
+
217
+ .popover__panel--left .popover__arrow {
218
+ top: 50%;
219
+ transform: translateY(-50%) rotate(45deg);
220
+ }
221
+
222
+ .popover__panel--left-start .popover__arrow {
223
+ top: var(--bp-spacing-5);
224
+ }
225
+
226
+ .popover__panel--left-end .popover__arrow {
227
+ bottom: var(--bp-spacing-5);
228
+ }
229
+
230
+ /* Arrow positions - right placements */
231
+ .popover__panel--right .popover__arrow,
232
+ .popover__panel--right-start .popover__arrow,
233
+ .popover__panel--right-end .popover__arrow {
234
+ left: calc(var(--bp-spacing-2) * -1);
235
+ border-right: none;
236
+ border-top: none;
237
+ }
238
+
239
+ .popover__panel--right .popover__arrow {
240
+ top: 50%;
241
+ transform: translateY(-50%) rotate(45deg);
242
+ }
243
+
244
+ .popover__panel--right-start .popover__arrow {
245
+ top: var(--bp-spacing-5);
246
+ }
247
+
248
+ .popover__panel--right-end .popover__arrow {
249
+ bottom: var(--bp-spacing-5);
250
+ }
251
+
252
+ /* Header */
253
+ .popover__header {
254
+ display: flex;
255
+ align-items: center;
256
+ justify-content: space-between;
257
+ gap: var(--bp-spacing-4);
258
+ padding: var(--bp-spacing-4) var(--bp-spacing-5);
259
+ border-bottom: var(--bp-border-width) solid var(--bp-color-border);
260
+ }
261
+
262
+ .popover__header ::slotted(*) {
263
+ margin: 0;
264
+ font-size: var(--bp-font-size-base);
265
+ font-weight: var(--bp-font-weight-semibold);
266
+ color: var(--bp-color-text-strong);
267
+ }
268
+
269
+ /* Body */
270
+ .popover__body {
271
+ padding: var(--bp-spacing-4) var(--bp-spacing-5);
272
+ overflow-y: auto;
273
+ max-height: calc(100vh - 160px);
274
+ }
275
+
276
+ /* Footer */
277
+ .popover__footer {
278
+ display: flex;
279
+ align-items: center;
280
+ gap: var(--bp-spacing-4);
281
+ padding: var(--bp-spacing-4) var(--bp-spacing-5);
282
+ border-top: var(--bp-border-width) solid var(--bp-color-border);
283
+ }
284
+
285
+ /* Close button */
286
+ .popover__close {
287
+ display: flex;
288
+ align-items: center;
289
+ justify-content: center;
290
+ width: 44px;
291
+ height: 44px;
292
+ padding: 0;
293
+ margin-left: auto;
294
+ background: transparent;
295
+ border: none;
296
+ border-radius: var(--bp-border-radius-sm);
297
+ color: var(--bp-color-text-muted);
298
+ cursor: pointer;
299
+ transition:
300
+ background-color var(--bp-transition-fast),
301
+ color var(--bp-transition-fast),
302
+ transform var(--bp-transition-fast);
303
+ }
304
+
305
+ .popover__close:hover {
306
+ background-color: var(--bp-color-surface-subdued);
307
+ color: var(--bp-color-text);
308
+ }
309
+
310
+ .popover__close:active {
311
+ background-color: var(--bp-color-surface-pressed);
312
+ transform: translateY(1px);
313
+ }
314
+
315
+ .popover__close:focus {
316
+ outline: var(--bp-focus-width) var(--bp-focus-style) var(--bp-color-focus);
317
+ outline-offset: var(--bp-focus-offset);
318
+ }
319
+
320
+ .popover__close:focus:not(:focus-visible) {
321
+ outline: none;
322
+ }
323
+
324
+ .popover__close:focus-visible {
325
+ outline: var(--bp-focus-width) var(--bp-focus-style) var(--bp-color-focus);
326
+ outline-offset: var(--bp-focus-offset);
327
+ }
328
+
329
+ .popover__close bp-icon {
330
+ width: var(--bp-spacing-4);
331
+ height: var(--bp-spacing-4);
332
+ }
333
+
334
+ /* Reduced motion */
335
+ @media (prefers-reduced-motion: reduce) {
336
+ .popover__panel {
337
+ animation: none;
338
+ }
339
+
340
+ .popover__close {
341
+ transition: none;
342
+ }
343
+ }
344
+ `;
345
+ var f = Object.defineProperty, w = Object.getOwnPropertyDescriptor, t = (e, p, l, n) => {
346
+ for (var s = n > 1 ? void 0 : n ? w(p, l) : p, h = e.length - 1, d; h >= 0; h--)
347
+ (d = e[h]) && (s = (n ? d(p, l, s) : d(s)) || s);
348
+ return n && s && f(p, l, s), s;
349
+ };
350
+ let o = class extends _ {
351
+ constructor() {
352
+ super(), this.hasHeader = !1, this.hasFooter = !1, this.showTimeout = null, this.hideTimeout = null, this.popoverId = `popover-${Math.random().toString(36).substring(2, 11)}`, this.handleTriggerClick = (e) => {
353
+ this.disabled || this.trigger !== "click" || (e.stopPropagation(), this.toggle());
354
+ }, this.handleTriggerKeydown = (e) => {
355
+ this.disabled || this.trigger === "click" && (e.key === "Enter" || e.key === " ") && (e.preventDefault(), this.toggle());
356
+ }, this.handleTriggerMouseEnter = () => {
357
+ this.disabled || this.trigger !== "hover" || (this.clearTimeouts(), this.showTimeout = window.setTimeout(() => {
358
+ this.show();
359
+ }, this.showDelay));
360
+ }, this.handleTriggerMouseLeave = () => {
361
+ this.trigger === "hover" && (this.clearTimeouts(), this.hideTimeout = window.setTimeout(() => {
362
+ this.hide();
363
+ }, this.hideDelay));
364
+ }, this.handlePanelMouseEnter = () => {
365
+ this.trigger === "hover" && this.clearTimeouts();
366
+ }, this.handlePanelMouseLeave = () => {
367
+ this.trigger === "hover" && (this.clearTimeouts(), this.hideTimeout = window.setTimeout(() => {
368
+ this.hide();
369
+ }, this.hideDelay));
370
+ }, this.handleTriggerFocus = () => {
371
+ this.disabled || this.trigger !== "focus" || this.show();
372
+ }, this.handleTriggerBlur = () => {
373
+ this.trigger === "focus" && this.hide();
374
+ }, this.handleDocumentClick = (e) => {
375
+ if (!this.closeOnOutsideClick || !this.open || this.trigger === "manual") return;
376
+ e.composedPath().includes(this) || this.hide();
377
+ }, this.handleDocumentKeydown = (e) => {
378
+ !this.closeOnEscape || !this.open || e.key === "Escape" && (e.preventDefault(), this.hide(), this.triggerElement?.focus());
379
+ }, this.handleCloseClick = () => {
380
+ this.hide();
381
+ }, this.handleHeaderSlotChange = (e) => {
382
+ const p = e.target;
383
+ this.hasHeader = p.assignedNodes({ flatten: !0 }).length > 0;
384
+ }, this.handleFooterSlotChange = (e) => {
385
+ const p = e.target;
386
+ this.hasFooter = p.assignedNodes({ flatten: !0 }).length > 0;
387
+ }, this.open = !1, this.placement = "bottom", this.trigger = "click", this.arrow = !1, this.showClose = !1, this.closeOnOutsideClick = !0, this.closeOnEscape = !0, this.distance = 8, this.showDelay = 200, this.hideDelay = 200, this.disabled = !1, this.label = "";
388
+ }
389
+ connectedCallback() {
390
+ super.connectedCallback(), document.addEventListener("click", this.handleDocumentClick, {
391
+ passive: !0
392
+ }), document.addEventListener("keydown", this.handleDocumentKeydown);
393
+ }
394
+ disconnectedCallback() {
395
+ super.disconnectedCallback(), document.removeEventListener("click", this.handleDocumentClick, {
396
+ passive: !0
397
+ }), document.removeEventListener("keydown", this.handleDocumentKeydown), this.clearTimeouts();
398
+ }
399
+ /** Show the popover */
400
+ show() {
401
+ this.disabled || this.open || (this.clearTimeouts(), this.open = !0, this.dispatchEvent(
402
+ new CustomEvent("bp-show", { bubbles: !0, composed: !0 })
403
+ ), this.updateComplete.then(() => {
404
+ this.dispatchEvent(
405
+ new CustomEvent("bp-after-show", { bubbles: !0, composed: !0 })
406
+ );
407
+ }));
408
+ }
409
+ /** Hide the popover */
410
+ hide() {
411
+ this.open && (this.clearTimeouts(), this.open = !1, this.dispatchEvent(
412
+ new CustomEvent("bp-hide", { bubbles: !0, composed: !0 })
413
+ ), this.updateComplete.then(() => {
414
+ this.dispatchEvent(
415
+ new CustomEvent("bp-after-hide", { bubbles: !0, composed: !0 })
416
+ );
417
+ }));
418
+ }
419
+ /** Toggle the popover open/closed */
420
+ toggle() {
421
+ this.open ? this.hide() : this.show();
422
+ }
423
+ /**
424
+ * Clears any pending show/hide timeout operations.
425
+ * Prevents race conditions with rapid trigger interactions.
426
+ */
427
+ clearTimeouts() {
428
+ this.showTimeout !== null && (window.clearTimeout(this.showTimeout), this.showTimeout = null), this.hideTimeout !== null && (window.clearTimeout(this.hideTimeout), this.hideTimeout = null);
429
+ }
430
+ render() {
431
+ return a`
432
+ <div
433
+ class="popover ${this.open ? "popover--open" : ""} ${this.disabled ? "popover--disabled" : ""}"
434
+ >
435
+ <div
436
+ class="popover__trigger"
437
+ part="trigger"
438
+ tabindex=${this.disabled ? -1 : 0}
439
+ role="button"
440
+ aria-haspopup="dialog"
441
+ aria-expanded=${this.open}
442
+ aria-controls=${this.open ? this.popoverId : i}
443
+ aria-disabled=${this.disabled}
444
+ @click=${this.handleTriggerClick}
445
+ @keydown=${this.handleTriggerKeydown}
446
+ @mouseenter=${this.handleTriggerMouseEnter}
447
+ @mouseleave=${this.handleTriggerMouseLeave}
448
+ @focus=${this.handleTriggerFocus}
449
+ @blur=${this.handleTriggerBlur}
450
+ >
451
+ <slot></slot>
452
+ </div>
453
+ ${this.open ? a`
454
+ <div
455
+ id=${this.popoverId}
456
+ class="popover__panel popover__panel--${this.placement}"
457
+ part="panel"
458
+ role="dialog"
459
+ aria-label=${this.label || i}
460
+ aria-modal="false"
461
+ style="--popover-distance: ${this.distance}px;"
462
+ @mouseenter=${this.handlePanelMouseEnter}
463
+ @mouseleave=${this.handlePanelMouseLeave}
464
+ >
465
+ ${this.arrow ? a`<div class="popover__arrow" part="arrow"></div>` : i}
466
+ ${this.hasHeader || this.showClose ? a`
467
+ <div class="popover__header" part="header">
468
+ <slot
469
+ name="header"
470
+ @slotchange=${this.handleHeaderSlotChange}
471
+ ></slot>
472
+ ${this.showClose ? a`
473
+ <button
474
+ class="popover__close"
475
+ part="close-button"
476
+ type="button"
477
+ aria-label="Close popover"
478
+ @click=${this.handleCloseClick}
479
+ >
480
+ <bp-icon name="close" size="sm"></bp-icon>
481
+ </button>
482
+ ` : i}
483
+ </div>
484
+ ` : a`<slot
485
+ name="header"
486
+ @slotchange=${this.handleHeaderSlotChange}
487
+ ></slot>`}
488
+ <div class="popover__body" part="body">
489
+ <slot name="content"></slot>
490
+ </div>
491
+ ${this.hasFooter ? a`
492
+ <div class="popover__footer" part="footer">
493
+ <slot
494
+ name="footer"
495
+ @slotchange=${this.handleFooterSlotChange}
496
+ ></slot>
497
+ </div>
498
+ ` : a`<slot
499
+ name="footer"
500
+ @slotchange=${this.handleFooterSlotChange}
501
+ ></slot>`}
502
+ </div>
503
+ ` : i}
504
+ </div>
505
+ `;
506
+ }
507
+ };
508
+ o.styles = [m];
509
+ t([
510
+ r({ type: Boolean, reflect: !0 })
511
+ ], o.prototype, "open", 2);
512
+ t([
513
+ r({
514
+ type: String,
515
+ reflect: !0,
516
+ converter: {
517
+ fromAttribute: (e) => [
518
+ "top",
519
+ "top-start",
520
+ "top-end",
521
+ "bottom",
522
+ "bottom-start",
523
+ "bottom-end",
524
+ "left",
525
+ "left-start",
526
+ "left-end",
527
+ "right",
528
+ "right-start",
529
+ "right-end"
530
+ ].includes(e) ? e : "bottom"
531
+ }
532
+ })
533
+ ], o.prototype, "placement", 2);
534
+ t([
535
+ r({
536
+ type: String,
537
+ converter: {
538
+ fromAttribute: (e) => [
539
+ "click",
540
+ "hover",
541
+ "focus",
542
+ "manual"
543
+ ].includes(e) ? e : "click"
544
+ }
545
+ })
546
+ ], o.prototype, "trigger", 2);
547
+ t([
548
+ r({ type: Boolean })
549
+ ], o.prototype, "arrow", 2);
550
+ t([
551
+ r({ type: Boolean, attribute: "show-close" })
552
+ ], o.prototype, "showClose", 2);
553
+ t([
554
+ r({
555
+ converter: v,
556
+ attribute: "close-on-outside-click",
557
+ reflect: !0
558
+ })
559
+ ], o.prototype, "closeOnOutsideClick", 2);
560
+ t([
561
+ r({
562
+ converter: v,
563
+ attribute: "close-on-escape",
564
+ reflect: !0
565
+ })
566
+ ], o.prototype, "closeOnEscape", 2);
567
+ t([
568
+ r({ type: Number })
569
+ ], o.prototype, "distance", 2);
570
+ t([
571
+ r({ type: Number, attribute: "show-delay" })
572
+ ], o.prototype, "showDelay", 2);
573
+ t([
574
+ r({ type: Number, attribute: "hide-delay" })
575
+ ], o.prototype, "hideDelay", 2);
576
+ t([
577
+ r({ type: Boolean })
578
+ ], o.prototype, "disabled", 2);
579
+ t([
580
+ r({ type: String })
581
+ ], o.prototype, "label", 2);
582
+ t([
583
+ c()
584
+ ], o.prototype, "hasHeader", 2);
585
+ t([
586
+ c()
587
+ ], o.prototype, "hasFooter", 2);
588
+ t([
589
+ u(".popover__trigger")
590
+ ], o.prototype, "triggerElement", 2);
591
+ o = t([
592
+ g("bp-popover")
593
+ ], o);
594
+ export {
595
+ o as BpPopover
596
+ };
597
+ //# sourceMappingURL=popover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popover.js","sources":["../../source/components/popover/popover.style.ts","../../source/components/popover/popover.ts"],"sourcesContent":["import { css } from 'lit';\r\n\r\nexport const popoverStyles = css`\r\n /* Base styles */\r\n :host {\r\n display: inline-block;\r\n position: relative;\r\n }\r\n\r\n .popover {\r\n position: relative;\r\n display: inline-block;\r\n font-family: var(--bp-font-family);\r\n font-size: var(--bp-font-size-base);\r\n color: var(--bp-color-text);\r\n }\r\n\r\n /* Trigger */\r\n .popover__trigger {\r\n display: inline-flex;\r\n align-items: center;\r\n cursor: pointer;\r\n outline: none;\r\n user-select: none;\r\n }\r\n\r\n .popover__trigger:hover {\r\n opacity: 0.8;\r\n }\r\n\r\n .popover__trigger:focus-visible {\r\n outline: var(--bp-focus-width) var(--bp-focus-style) var(--bp-color-focus);\r\n outline-offset: var(--bp-focus-offset);\r\n border-radius: var(--bp-border-radius-sm);\r\n }\r\n\r\n .popover--disabled .popover__trigger {\r\n cursor: not-allowed;\r\n opacity: var(--bp-opacity-disabled);\r\n }\r\n\r\n /* Panel base */\r\n .popover__panel {\r\n position: absolute;\r\n z-index: var(--bp-z-popover);\r\n min-width: 160px;\r\n max-width: 320px;\r\n max-height: calc(100vh - 80px);\r\n background-color: var(--bp-color-surface-elevated);\r\n border: var(--bp-border-width) solid var(--bp-color-border);\r\n border-radius: var(--bp-border-radius-lg);\r\n box-shadow: var(--bp-shadow-lg);\r\n opacity: 1;\r\n animation: popover-fade-in var(--bp-transition-fast) ease-out;\r\n }\r\n\r\n @keyframes popover-fade-in {\r\n from {\r\n opacity: 0;\r\n transform: scale(0.95);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: scale(1);\r\n }\r\n }\r\n\r\n /* Panel placements - Bottom */\r\n .popover__panel--bottom,\r\n .popover__panel--bottom-start,\r\n .popover__panel--bottom-end {\r\n top: 100%;\r\n margin-top: var(--popover-distance);\r\n }\r\n\r\n .popover__panel--bottom {\r\n left: 50%;\r\n transform: translateX(-50%);\r\n }\r\n\r\n .popover__panel--bottom-start {\r\n left: 0;\r\n }\r\n\r\n .popover__panel--bottom-end {\r\n right: 0;\r\n }\r\n\r\n /* Panel placements - Top */\r\n .popover__panel--top,\r\n .popover__panel--top-start,\r\n .popover__panel--top-end {\r\n bottom: 100%;\r\n margin-bottom: var(--popover-distance);\r\n }\r\n\r\n .popover__panel--top {\r\n left: 50%;\r\n transform: translateX(-50%);\r\n }\r\n\r\n .popover__panel--top-start {\r\n left: 0;\r\n }\r\n\r\n .popover__panel--top-end {\r\n right: 0;\r\n }\r\n\r\n /* Panel placements - Left */\r\n .popover__panel--left,\r\n .popover__panel--left-start,\r\n .popover__panel--left-end {\r\n right: 100%;\r\n margin-right: var(--popover-distance);\r\n }\r\n\r\n .popover__panel--left {\r\n top: 50%;\r\n transform: translateY(-50%);\r\n }\r\n\r\n .popover__panel--left-start {\r\n top: 0;\r\n }\r\n\r\n .popover__panel--left-end {\r\n bottom: 0;\r\n }\r\n\r\n /* Panel placements - Right */\r\n .popover__panel--right,\r\n .popover__panel--right-start,\r\n .popover__panel--right-end {\r\n left: 100%;\r\n margin-left: var(--popover-distance);\r\n }\r\n\r\n .popover__panel--right {\r\n top: 50%;\r\n transform: translateY(-50%);\r\n }\r\n\r\n .popover__panel--right-start {\r\n top: 0;\r\n }\r\n\r\n .popover__panel--right-end {\r\n bottom: 0;\r\n }\r\n\r\n /* Arrow */\r\n .popover__arrow {\r\n position: absolute;\r\n width: var(--bp-spacing-5);\r\n height: var(--bp-spacing-5);\r\n background-color: var(--bp-color-surface-elevated);\r\n border: var(--bp-border-width) solid var(--bp-color-border);\r\n transform: rotate(45deg);\r\n z-index: -1;\r\n }\r\n\r\n /* Arrow positions - bottom placements */\r\n .popover__panel--bottom .popover__arrow,\r\n .popover__panel--bottom-start .popover__arrow,\r\n .popover__panel--bottom-end .popover__arrow {\r\n top: calc(var(--bp-spacing-2) * -1);\r\n border-bottom: none;\r\n border-right: none;\r\n }\r\n\r\n .popover__panel--bottom .popover__arrow {\r\n left: 50%;\r\n transform: translateX(-50%) rotate(45deg);\r\n }\r\n\r\n .popover__panel--bottom-start .popover__arrow {\r\n left: var(--bp-spacing-5);\r\n }\r\n\r\n .popover__panel--bottom-end .popover__arrow {\r\n right: var(--bp-spacing-5);\r\n }\r\n\r\n /* Arrow positions - top placements */\r\n .popover__panel--top .popover__arrow,\r\n .popover__panel--top-start .popover__arrow,\r\n .popover__panel--top-end .popover__arrow {\r\n bottom: calc(var(--bp-spacing-2) * -1);\r\n border-top: none;\r\n border-left: none;\r\n }\r\n\r\n .popover__panel--top .popover__arrow {\r\n left: 50%;\r\n transform: translateX(-50%) rotate(45deg);\r\n }\r\n\r\n .popover__panel--top-start .popover__arrow {\r\n left: var(--bp-spacing-5);\r\n }\r\n\r\n .popover__panel--top-end .popover__arrow {\r\n right: var(--bp-spacing-5);\r\n }\r\n\r\n /* Arrow positions - left placements */\r\n .popover__panel--left .popover__arrow,\r\n .popover__panel--left-start .popover__arrow,\r\n .popover__panel--left-end .popover__arrow {\r\n right: calc(var(--bp-spacing-2) * -1);\r\n border-left: none;\r\n border-bottom: none;\r\n }\r\n\r\n .popover__panel--left .popover__arrow {\r\n top: 50%;\r\n transform: translateY(-50%) rotate(45deg);\r\n }\r\n\r\n .popover__panel--left-start .popover__arrow {\r\n top: var(--bp-spacing-5);\r\n }\r\n\r\n .popover__panel--left-end .popover__arrow {\r\n bottom: var(--bp-spacing-5);\r\n }\r\n\r\n /* Arrow positions - right placements */\r\n .popover__panel--right .popover__arrow,\r\n .popover__panel--right-start .popover__arrow,\r\n .popover__panel--right-end .popover__arrow {\r\n left: calc(var(--bp-spacing-2) * -1);\r\n border-right: none;\r\n border-top: none;\r\n }\r\n\r\n .popover__panel--right .popover__arrow {\r\n top: 50%;\r\n transform: translateY(-50%) rotate(45deg);\r\n }\r\n\r\n .popover__panel--right-start .popover__arrow {\r\n top: var(--bp-spacing-5);\r\n }\r\n\r\n .popover__panel--right-end .popover__arrow {\r\n bottom: var(--bp-spacing-5);\r\n }\r\n\r\n /* Header */\r\n .popover__header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: var(--bp-spacing-4);\r\n padding: var(--bp-spacing-4) var(--bp-spacing-5);\r\n border-bottom: var(--bp-border-width) solid var(--bp-color-border);\r\n }\r\n\r\n .popover__header ::slotted(*) {\r\n margin: 0;\r\n font-size: var(--bp-font-size-base);\r\n font-weight: var(--bp-font-weight-semibold);\r\n color: var(--bp-color-text-strong);\r\n }\r\n\r\n /* Body */\r\n .popover__body {\r\n padding: var(--bp-spacing-4) var(--bp-spacing-5);\r\n overflow-y: auto;\r\n max-height: calc(100vh - 160px);\r\n }\r\n\r\n /* Footer */\r\n .popover__footer {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--bp-spacing-4);\r\n padding: var(--bp-spacing-4) var(--bp-spacing-5);\r\n border-top: var(--bp-border-width) solid var(--bp-color-border);\r\n }\r\n\r\n /* Close button */\r\n .popover__close {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 44px;\r\n height: 44px;\r\n padding: 0;\r\n margin-left: auto;\r\n background: transparent;\r\n border: none;\r\n border-radius: var(--bp-border-radius-sm);\r\n color: var(--bp-color-text-muted);\r\n cursor: pointer;\r\n transition:\r\n background-color var(--bp-transition-fast),\r\n color var(--bp-transition-fast),\r\n transform var(--bp-transition-fast);\r\n }\r\n\r\n .popover__close:hover {\r\n background-color: var(--bp-color-surface-subdued);\r\n color: var(--bp-color-text);\r\n }\r\n\r\n .popover__close:active {\r\n background-color: var(--bp-color-surface-pressed);\r\n transform: translateY(1px);\r\n }\r\n\r\n .popover__close:focus {\r\n outline: var(--bp-focus-width) var(--bp-focus-style) var(--bp-color-focus);\r\n outline-offset: var(--bp-focus-offset);\r\n }\r\n\r\n .popover__close:focus:not(:focus-visible) {\r\n outline: none;\r\n }\r\n\r\n .popover__close:focus-visible {\r\n outline: var(--bp-focus-width) var(--bp-focus-style) var(--bp-color-focus);\r\n outline-offset: var(--bp-focus-offset);\r\n }\r\n\r\n .popover__close bp-icon {\r\n width: var(--bp-spacing-4);\r\n height: var(--bp-spacing-4);\r\n }\r\n\r\n /* Reduced motion */\r\n @media (prefers-reduced-motion: reduce) {\r\n .popover__panel {\r\n animation: none;\r\n }\r\n\r\n .popover__close {\r\n transition: none;\r\n }\r\n }\r\n`;\r\n","import { LitElement, html, nothing } from 'lit';\r\nimport { customElement, property, state, query } from 'lit/decorators.js';\r\nimport { popoverStyles } from './popover.style.js';\r\nimport { booleanConverter } from '../../utilities/boolean-converter.js';\r\nimport '../icon/icon.js';\r\n\r\nexport type PopoverPlacement =\r\n | 'top'\r\n | 'top-start'\r\n | 'top-end'\r\n | 'bottom'\r\n | 'bottom-start'\r\n | 'bottom-end'\r\n | 'left'\r\n | 'left-start'\r\n | 'left-end'\r\n | 'right'\r\n | 'right-start'\r\n | 'right-end';\r\n\r\nexport type PopoverTrigger = 'click' | 'hover' | 'focus' | 'manual';\r\n\r\n/**\r\n * A popover component that displays rich content in a floating panel.\r\n * Supports multiple trigger modes: click, hover, focus, or manual control.\r\n *\r\n * @fires bp-show - Fired when the popover opens\r\n * @fires bp-hide - Fired when the popover closes\r\n * @fires bp-after-show - Fired after the popover open animation completes\r\n * @fires bp-after-hide - Fired after the popover close animation completes\r\n *\r\n * @slot - The trigger element that controls the popover\r\n * @slot content - The rich content to display in the popover panel\r\n * @slot header - Optional header content for the popover\r\n * @slot footer - Optional footer content for the popover\r\n *\r\n * @csspart trigger - The trigger wrapper element\r\n * @csspart panel - The popover panel container\r\n * @csspart header - The header section\r\n * @csspart body - The body/content section\r\n * @csspart footer - The footer section\r\n * @csspart arrow - The arrow pointing to the trigger\r\n * @csspart close-button - The close button (when showClose is true)\r\n */\r\n@customElement('bp-popover')\r\nexport class BpPopover extends LitElement {\r\n /** Whether the popover is currently open */\r\n @property({ type: Boolean, reflect: true }) declare open: boolean;\r\n\r\n /** Placement of the popover relative to the trigger */\r\n @property({\r\n type: String,\r\n reflect: true,\r\n converter: {\r\n fromAttribute: (value: string | null): PopoverPlacement => {\r\n const validPlacements: PopoverPlacement[] = [\r\n 'top',\r\n 'top-start',\r\n 'top-end',\r\n 'bottom',\r\n 'bottom-start',\r\n 'bottom-end',\r\n 'left',\r\n 'left-start',\r\n 'left-end',\r\n 'right',\r\n 'right-start',\r\n 'right-end',\r\n ];\r\n return validPlacements.includes(value as PopoverPlacement)\r\n ? (value as PopoverPlacement)\r\n : 'bottom';\r\n },\r\n },\r\n })\r\n declare placement: PopoverPlacement;\r\n\r\n /** How the popover is triggered */\r\n @property({\r\n type: String,\r\n converter: {\r\n fromAttribute: (value: string | null): PopoverTrigger => {\r\n const validTriggers: PopoverTrigger[] = [\r\n 'click',\r\n 'hover',\r\n 'focus',\r\n 'manual',\r\n ];\r\n return validTriggers.includes(value as PopoverTrigger)\r\n ? (value as PopoverTrigger)\r\n : 'click';\r\n },\r\n },\r\n })\r\n declare trigger: PopoverTrigger;\r\n\r\n /** Whether to show an arrow pointing to the trigger */\r\n @property({ type: Boolean }) declare arrow: boolean;\r\n\r\n /** Whether to show a close button in the popover */\r\n @property({ type: Boolean, attribute: 'show-close' })\r\n declare showClose: boolean;\r\n\r\n /** Whether clicking outside closes the popover */\r\n @property({\r\n converter: booleanConverter,\r\n attribute: 'close-on-outside-click',\r\n reflect: true,\r\n })\r\n declare closeOnOutsideClick: boolean;\r\n\r\n /** Whether pressing Escape closes the popover */\r\n @property({\r\n converter: booleanConverter,\r\n attribute: 'close-on-escape',\r\n reflect: true,\r\n })\r\n declare closeOnEscape: boolean;\r\n\r\n /** Distance in pixels between the trigger and the panel */\r\n @property({ type: Number }) declare distance: number;\r\n\r\n /** Delay in milliseconds before showing (for hover trigger) */\r\n @property({ type: Number, attribute: 'show-delay' })\r\n declare showDelay: number;\r\n\r\n /** Delay in milliseconds before hiding (for hover trigger) */\r\n @property({ type: Number, attribute: 'hide-delay' })\r\n declare hideDelay: number;\r\n\r\n /** Whether the popover is disabled */\r\n @property({ type: Boolean }) declare disabled: boolean;\r\n\r\n /** Accessible label for the popover panel */\r\n @property({ type: String }) declare label: string;\r\n\r\n /** Whether the popover has header slot content */\r\n @state() private hasHeader = false;\r\n\r\n /** Whether the popover has footer slot content */\r\n @state() private hasFooter = false;\r\n\r\n @query('.popover__trigger') private triggerElement!: HTMLElement;\r\n\r\n private showTimeout: number | null = null;\r\n private hideTimeout: number | null = null;\r\n private popoverId = `popover-${Math.random().toString(36).substring(2, 11)}`;\r\n\r\n static styles = [popoverStyles];\r\n\r\n constructor() {\r\n super();\r\n this.open = false;\r\n this.placement = 'bottom';\r\n this.trigger = 'click';\r\n this.arrow = false;\r\n this.showClose = false;\r\n this.closeOnOutsideClick = true;\r\n this.closeOnEscape = true;\r\n this.distance = 8;\r\n this.showDelay = 200;\r\n this.hideDelay = 200;\r\n this.disabled = false;\r\n this.label = '';\r\n }\r\n\r\n connectedCallback(): void {\r\n super.connectedCallback();\r\n document.addEventListener('click', this.handleDocumentClick, {\r\n passive: true,\r\n });\r\n document.addEventListener('keydown', this.handleDocumentKeydown);\r\n }\r\n\r\n disconnectedCallback(): void {\r\n super.disconnectedCallback();\r\n document.removeEventListener('click', this.handleDocumentClick, {\r\n passive: true,\r\n } as EventListenerOptions);\r\n document.removeEventListener('keydown', this.handleDocumentKeydown);\r\n this.clearTimeouts();\r\n }\r\n\r\n /** Show the popover */\r\n show(): void {\r\n if (this.disabled || this.open) return;\r\n\r\n this.clearTimeouts();\r\n this.open = true;\r\n\r\n this.dispatchEvent(\r\n new CustomEvent('bp-show', { bubbles: true, composed: true })\r\n );\r\n\r\n this.updateComplete.then(() => {\r\n this.dispatchEvent(\r\n new CustomEvent('bp-after-show', { bubbles: true, composed: true })\r\n );\r\n });\r\n }\r\n\r\n /** Hide the popover */\r\n hide(): void {\r\n if (!this.open) return;\r\n\r\n this.clearTimeouts();\r\n this.open = false;\r\n\r\n this.dispatchEvent(\r\n new CustomEvent('bp-hide', { bubbles: true, composed: true })\r\n );\r\n\r\n this.updateComplete.then(() => {\r\n this.dispatchEvent(\r\n new CustomEvent('bp-after-hide', { bubbles: true, composed: true })\r\n );\r\n });\r\n }\r\n\r\n /** Toggle the popover open/closed */\r\n toggle(): void {\r\n if (this.open) {\r\n this.hide();\r\n } else {\r\n this.show();\r\n }\r\n }\r\n\r\n /**\r\n * Clears any pending show/hide timeout operations.\r\n * Prevents race conditions with rapid trigger interactions.\r\n */\r\n private clearTimeouts(): void {\r\n if (this.showTimeout !== null) {\r\n window.clearTimeout(this.showTimeout);\r\n this.showTimeout = null;\r\n }\r\n if (this.hideTimeout !== null) {\r\n window.clearTimeout(this.hideTimeout);\r\n this.hideTimeout = null;\r\n }\r\n }\r\n\r\n /**\r\n * Handles click events on the trigger element.\r\n * Toggles popover state for click trigger mode.\r\n * @param event - The mouse click event\r\n */\r\n private handleTriggerClick = (event: MouseEvent): void => {\r\n if (this.disabled || this.trigger !== 'click') return;\r\n event.stopPropagation();\r\n this.toggle();\r\n };\r\n\r\n /**\r\n * Handles keyboard events on the trigger element.\r\n * Toggles popover on Enter or Space key for click trigger mode.\r\n * @param event - The keyboard event\r\n */\r\n private handleTriggerKeydown = (event: KeyboardEvent): void => {\r\n if (this.disabled) return;\r\n\r\n if (\r\n this.trigger === 'click' &&\r\n (event.key === 'Enter' || event.key === ' ')\r\n ) {\r\n event.preventDefault();\r\n this.toggle();\r\n }\r\n };\r\n\r\n /**\r\n * Handles mouse enter events on the trigger element.\r\n * Starts the show delay timer for hover trigger mode.\r\n */\r\n private handleTriggerMouseEnter = (): void => {\r\n if (this.disabled || this.trigger !== 'hover') return;\r\n\r\n this.clearTimeouts();\r\n this.showTimeout = window.setTimeout(() => {\r\n this.show();\r\n }, this.showDelay);\r\n };\r\n\r\n /**\r\n * Handles mouse leave events on the trigger element.\r\n * Starts the hide delay timer for hover trigger mode.\r\n */\r\n private handleTriggerMouseLeave = (): void => {\r\n if (this.trigger !== 'hover') return;\r\n\r\n this.clearTimeouts();\r\n this.hideTimeout = window.setTimeout(() => {\r\n this.hide();\r\n }, this.hideDelay);\r\n };\r\n\r\n /**\r\n * Handles mouse enter events on the popover panel.\r\n * Prevents the popover from hiding when hovering over panel content in hover trigger mode.\r\n */\r\n private handlePanelMouseEnter = (): void => {\r\n if (this.trigger !== 'hover') return;\r\n this.clearTimeouts();\r\n };\r\n\r\n /**\r\n * Handles mouse leave events on the popover panel.\r\n * Starts the hide delay timer when leaving panel in hover trigger mode.\r\n */\r\n private handlePanelMouseLeave = (): void => {\r\n if (this.trigger !== 'hover') return;\r\n\r\n this.clearTimeouts();\r\n this.hideTimeout = window.setTimeout(() => {\r\n this.hide();\r\n }, this.hideDelay);\r\n };\r\n\r\n /**\r\n * Handles focus events on the trigger element.\r\n * Shows popover immediately for focus trigger mode.\r\n */\r\n private handleTriggerFocus = (): void => {\r\n if (this.disabled || this.trigger !== 'focus') return;\r\n this.show();\r\n };\r\n\r\n /**\r\n * Handles blur events on the trigger element.\r\n * Hides popover immediately for focus trigger mode.\r\n */\r\n private handleTriggerBlur = (): void => {\r\n if (this.trigger !== 'focus') return;\r\n this.hide();\r\n };\r\n\r\n /**\r\n * Handles click events on the document.\r\n * Closes popover when clicking outside if closeOnOutsideClick is true.\r\n * @param event - The mouse click event\r\n */\r\n private handleDocumentClick = (event: MouseEvent): void => {\r\n if (!this.closeOnOutsideClick || !this.open) return;\r\n if (this.trigger === 'manual') return;\r\n\r\n const path = event.composedPath();\r\n if (!path.includes(this)) {\r\n this.hide();\r\n }\r\n };\r\n\r\n /**\r\n * Handles keyboard events on the document.\r\n * Closes popover on Escape key if closeOnEscape is true and returns focus to trigger.\r\n * @param event - The keyboard event\r\n */\r\n private handleDocumentKeydown = (event: KeyboardEvent): void => {\r\n if (!this.closeOnEscape || !this.open) return;\r\n\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n this.hide();\r\n this.triggerElement?.focus();\r\n }\r\n };\r\n\r\n /**\r\n * Handles click events on the close button.\r\n * Closes the popover immediately.\r\n */\r\n private handleCloseClick = (): void => {\r\n this.hide();\r\n };\r\n\r\n /**\r\n * Handles changes to the header slot.\r\n * Updates internal state to conditionally render header wrapper.\r\n * @param event - The slotchange event\r\n */\r\n private handleHeaderSlotChange = (event: Event): void => {\r\n const slot = event.target as HTMLElement & {\r\n assignedNodes: (options?: { flatten?: boolean }) => Node[];\r\n };\r\n this.hasHeader = slot.assignedNodes({ flatten: true }).length > 0;\r\n };\r\n\r\n /**\r\n * Handles changes to the footer slot.\r\n * Updates internal state to conditionally render footer wrapper.\r\n * @param event - The slotchange event\r\n */\r\n private handleFooterSlotChange = (event: Event): void => {\r\n const slot = event.target as HTMLElement & {\r\n assignedNodes: (options?: { flatten?: boolean }) => Node[];\r\n };\r\n this.hasFooter = slot.assignedNodes({ flatten: true }).length > 0;\r\n };\r\n\r\n render() {\r\n return html`\r\n <div\r\n class=\"popover ${this.open ? 'popover--open' : ''} ${this.disabled\r\n ? 'popover--disabled'\r\n : ''}\"\r\n >\r\n <div\r\n class=\"popover__trigger\"\r\n part=\"trigger\"\r\n tabindex=${this.disabled ? -1 : 0}\r\n role=\"button\"\r\n aria-haspopup=\"dialog\"\r\n aria-expanded=${this.open}\r\n aria-controls=${this.open ? this.popoverId : nothing}\r\n aria-disabled=${this.disabled}\r\n @click=${this.handleTriggerClick}\r\n @keydown=${this.handleTriggerKeydown}\r\n @mouseenter=${this.handleTriggerMouseEnter}\r\n @mouseleave=${this.handleTriggerMouseLeave}\r\n @focus=${this.handleTriggerFocus}\r\n @blur=${this.handleTriggerBlur}\r\n >\r\n <slot></slot>\r\n </div>\r\n ${this.open\r\n ? html`\r\n <div\r\n id=${this.popoverId}\r\n class=\"popover__panel popover__panel--${this.placement}\"\r\n part=\"panel\"\r\n role=\"dialog\"\r\n aria-label=${this.label || nothing}\r\n aria-modal=\"false\"\r\n style=\"--popover-distance: ${this.distance}px;\"\r\n @mouseenter=${this.handlePanelMouseEnter}\r\n @mouseleave=${this.handlePanelMouseLeave}\r\n >\r\n ${this.arrow\r\n ? html`<div class=\"popover__arrow\" part=\"arrow\"></div>`\r\n : nothing}\r\n ${this.hasHeader || this.showClose\r\n ? html`\r\n <div class=\"popover__header\" part=\"header\">\r\n <slot\r\n name=\"header\"\r\n @slotchange=${this.handleHeaderSlotChange}\r\n ></slot>\r\n ${this.showClose\r\n ? html`\r\n <button\r\n class=\"popover__close\"\r\n part=\"close-button\"\r\n type=\"button\"\r\n aria-label=\"Close popover\"\r\n @click=${this.handleCloseClick}\r\n >\r\n <bp-icon name=\"close\" size=\"sm\"></bp-icon>\r\n </button>\r\n `\r\n : nothing}\r\n </div>\r\n `\r\n : html`<slot\r\n name=\"header\"\r\n @slotchange=${this.handleHeaderSlotChange}\r\n ></slot>`}\r\n <div class=\"popover__body\" part=\"body\">\r\n <slot name=\"content\"></slot>\r\n </div>\r\n ${this.hasFooter\r\n ? html`\r\n <div class=\"popover__footer\" part=\"footer\">\r\n <slot\r\n name=\"footer\"\r\n @slotchange=${this.handleFooterSlotChange}\r\n ></slot>\r\n </div>\r\n `\r\n : html`<slot\r\n name=\"footer\"\r\n @slotchange=${this.handleFooterSlotChange}\r\n ></slot>`}\r\n </div>\r\n `\r\n : nothing}\r\n </div>\r\n `;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'bp-popover': BpPopover;\r\n }\r\n}\r\n"],"names":["popoverStyles","css","BpPopover","LitElement","event","slot","html","nothing","__decorateClass","property","value","booleanConverter","state","query","customElement"],"mappings":";;;AAEO,MAAMA,IAAgBC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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"}