@krollins/blueprint 0.1.12 → 0.1.14

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 (109) hide show
  1. package/README.md +9 -3
  2. package/README.npm.md +9 -3
  3. package/dist/components/accordion.js +393 -0
  4. package/dist/components/accordion.js.map +1 -0
  5. package/dist/components/alert.js +213 -0
  6. package/dist/components/alert.js.map +1 -0
  7. package/dist/components/avatar.js +237 -0
  8. package/dist/components/avatar.js.map +1 -0
  9. package/dist/components/badge/badge.d.ts.map +1 -1
  10. package/dist/components/badge.js +144 -0
  11. package/dist/components/badge.js.map +1 -0
  12. package/dist/components/breadcrumb.js +481 -0
  13. package/dist/components/breadcrumb.js.map +1 -0
  14. package/dist/components/button.js +192 -0
  15. package/dist/components/button.js.map +1 -0
  16. package/dist/components/card.js +223 -0
  17. package/dist/components/card.js.map +1 -0
  18. package/dist/components/checkbox.js +336 -0
  19. package/dist/components/checkbox.js.map +1 -0
  20. package/dist/components/code-block/code-block.d.ts +143 -0
  21. package/dist/components/code-block/code-block.d.ts.map +1 -0
  22. package/dist/components/code-block/code-block.style.d.ts +2 -0
  23. package/dist/components/code-block/code-block.style.d.ts.map +1 -0
  24. package/dist/components/code-block.js +587 -0
  25. package/dist/components/code-block.js.map +1 -0
  26. package/dist/components/color-picker/color-picker.d.ts.map +1 -1
  27. package/dist/components/color-picker.js +1660 -0
  28. package/dist/components/color-picker.js.map +1 -0
  29. package/dist/components/combobox.js +595 -0
  30. package/dist/components/combobox.js.map +1 -0
  31. package/dist/components/date-picker.js +726 -0
  32. package/dist/components/date-picker.js.map +1 -0
  33. package/dist/components/divider.js +214 -0
  34. package/dist/components/divider.js.map +1 -0
  35. package/dist/components/drawer.js +568 -0
  36. package/dist/components/drawer.js.map +1 -0
  37. package/dist/components/dropdown.js +377 -0
  38. package/dist/components/dropdown.js.map +1 -0
  39. package/dist/components/file-upload.js +669 -0
  40. package/dist/components/file-upload.js.map +1 -0
  41. package/dist/components/heading.js +161 -0
  42. package/dist/components/heading.js.map +1 -0
  43. package/dist/components/icon.js +599 -0
  44. package/dist/components/icon.js.map +1 -0
  45. package/dist/components/index.d.ts +3 -0
  46. package/dist/components/index.d.ts.map +1 -1
  47. package/dist/components/input.js +363 -0
  48. package/dist/components/input.js.map +1 -0
  49. package/dist/components/link.js +178 -0
  50. package/dist/components/link.js.map +1 -0
  51. package/dist/components/menu.js +331 -0
  52. package/dist/components/menu.js.map +1 -0
  53. package/dist/components/modal.js +317 -0
  54. package/dist/components/modal.js.map +1 -0
  55. package/dist/components/multi-select.js +642 -0
  56. package/dist/components/multi-select.js.map +1 -0
  57. package/dist/components/notification.js +429 -0
  58. package/dist/components/notification.js.map +1 -0
  59. package/dist/components/number-input.js +556 -0
  60. package/dist/components/number-input.js.map +1 -0
  61. package/dist/components/pagination.js +320 -0
  62. package/dist/components/pagination.js.map +1 -0
  63. package/dist/components/popover.js +597 -0
  64. package/dist/components/popover.js.map +1 -0
  65. package/dist/components/progress.js +219 -0
  66. package/dist/components/progress.js.map +1 -0
  67. package/dist/components/radio.js +321 -0
  68. package/dist/components/radio.js.map +1 -0
  69. package/dist/components/select.js +498 -0
  70. package/dist/components/select.js.map +1 -0
  71. package/dist/components/skeleton.js +240 -0
  72. package/dist/components/skeleton.js.map +1 -0
  73. package/dist/components/slider.js +9 -0
  74. package/dist/components/slider.js.map +1 -0
  75. package/dist/components/spinner.js +133 -0
  76. package/dist/components/spinner.js.map +1 -0
  77. package/dist/components/stepper.js +812 -0
  78. package/dist/components/stepper.js.map +1 -0
  79. package/dist/components/switch.js +379 -0
  80. package/dist/components/switch.js.map +1 -0
  81. package/dist/components/table.js +642 -0
  82. package/dist/components/table.js.map +1 -0
  83. package/dist/components/tabs.js +547 -0
  84. package/dist/components/tabs.js.map +1 -0
  85. package/dist/components/tag/tag.d.ts.map +1 -1
  86. package/dist/components/tag.js +291 -0
  87. package/dist/components/tag.js.map +1 -0
  88. package/dist/components/text.js +278 -0
  89. package/dist/components/text.js.map +1 -0
  90. package/dist/components/textarea.js +380 -0
  91. package/dist/components/textarea.js.map +1 -0
  92. package/dist/components/time-picker.js +457 -0
  93. package/dist/components/time-picker.js.map +1 -0
  94. package/dist/components/tooltip.js +239 -0
  95. package/dist/components/tooltip.js.map +1 -0
  96. package/dist/components/tree.js +582 -0
  97. package/dist/components/tree.js.map +1 -0
  98. package/dist/index.js +96 -17799
  99. package/dist/index.js.map +1 -1
  100. package/dist/shared/boolean-converter-XDGfS9LC.js +12 -0
  101. package/dist/shared/boolean-converter-XDGfS9LC.js.map +1 -0
  102. package/dist/shared/debounce-BckY30Sf.js +23 -0
  103. package/dist/shared/debounce-BckY30Sf.js.map +1 -0
  104. package/dist/shared/memoize-DlOFy-92.js +16 -0
  105. package/dist/shared/memoize-DlOFy-92.js.map +1 -0
  106. package/dist/shared/slider-BNt5TITl.js +484 -0
  107. package/dist/shared/slider-BNt5TITl.js.map +1 -0
  108. package/dist/utilities/memoize.d.ts.map +1 -1
  109. package/package.json +44 -2
@@ -0,0 +1,568 @@
1
+ import { css as b, LitElement as u, nothing as l, html as n } from "lit";
2
+ import { property as a, customElement as f } from "lit/decorators.js";
3
+ import { b as d } from "../shared/boolean-converter-XDGfS9LC.js";
4
+ const w = b`
5
+ /* Base styles */
6
+ :host {
7
+ display: contents;
8
+ }
9
+
10
+ .drawer {
11
+ font-family: var(--bp-font-family);
12
+ font-size: var(--bp-font-size-base);
13
+ color: var(--bp-color-text);
14
+ }
15
+
16
+ /* Overlay mode */
17
+ .drawer--overlay {
18
+ position: fixed;
19
+ inset: 0;
20
+ z-index: var(--bp-z-modal);
21
+ pointer-events: none;
22
+ }
23
+
24
+ .drawer--overlay.drawer--open {
25
+ pointer-events: auto;
26
+ }
27
+
28
+ /* Backdrop */
29
+ .backdrop {
30
+ position: absolute;
31
+ inset: 0;
32
+ background-color: oklch(from var(--bp-color-text) l c h / 0.5);
33
+ opacity: 0;
34
+ transition: opacity var(--bp-transition-base) ease-out;
35
+ }
36
+
37
+ .backdrop--visible {
38
+ opacity: 1;
39
+ }
40
+
41
+ /* Panel base */
42
+ .panel {
43
+ position: absolute;
44
+ display: flex;
45
+ flex-direction: column;
46
+ background-color: var(--bp-color-surface);
47
+ box-shadow: var(--bp-shadow-xl);
48
+ transition: transform var(--bp-transition-base) ease-out;
49
+ overflow: hidden;
50
+ }
51
+
52
+ .drawer--overlay .panel:focus {
53
+ outline: none;
54
+ }
55
+
56
+ /* Horizontal drawers (left/right) */
57
+ .drawer--horizontal .panel {
58
+ top: 0;
59
+ bottom: 0;
60
+ height: 100%;
61
+ }
62
+
63
+ .drawer--left .panel {
64
+ left: 0;
65
+ transform: translateX(-100%);
66
+ }
67
+
68
+ .drawer--left .panel--open {
69
+ transform: translateX(0);
70
+ }
71
+
72
+ .drawer--right .panel {
73
+ right: 0;
74
+ transform: translateX(100%);
75
+ }
76
+
77
+ .drawer--right .panel--open {
78
+ transform: translateX(0);
79
+ }
80
+
81
+ /* Vertical drawers (top/bottom) */
82
+ .drawer--vertical .panel {
83
+ left: 0;
84
+ right: 0;
85
+ width: 100%;
86
+ }
87
+
88
+ .drawer--top .panel {
89
+ top: 0;
90
+ transform: translateY(-100%);
91
+ }
92
+
93
+ .drawer--top .panel--open {
94
+ transform: translateY(0);
95
+ }
96
+
97
+ .drawer--bottom .panel {
98
+ bottom: 0;
99
+ transform: translateY(100%);
100
+ }
101
+
102
+ .drawer--bottom .panel--open {
103
+ transform: translateY(0);
104
+ }
105
+
106
+ /* Sizes - horizontal (width) */
107
+ .drawer--horizontal.drawer--sm .panel {
108
+ width: calc(var(--bp-spacing-24) * 3);
109
+ }
110
+
111
+ .drawer--horizontal.drawer--md .panel {
112
+ width: calc(var(--bp-spacing-24) * 4 + var(--bp-spacing-16));
113
+ }
114
+
115
+ .drawer--horizontal.drawer--lg .panel {
116
+ width: var(--bp-breakpoint-sm);
117
+ }
118
+
119
+ .drawer--horizontal.drawer--full .panel {
120
+ width: 100%;
121
+ }
122
+
123
+ /* Sizes - vertical (height) */
124
+ .drawer--vertical.drawer--sm .panel {
125
+ height: calc(var(--bp-spacing-24) * 2);
126
+ }
127
+
128
+ .drawer--vertical.drawer--md .panel {
129
+ height: calc(var(--bp-spacing-24) * 3 + var(--bp-spacing-8));
130
+ }
131
+
132
+ .drawer--vertical.drawer--lg .panel {
133
+ height: calc(var(--bp-spacing-24) * 5);
134
+ }
135
+
136
+ .drawer--vertical.drawer--full .panel {
137
+ height: 100%;
138
+ }
139
+
140
+ /* Header */
141
+ .header {
142
+ display: flex;
143
+ align-items: center;
144
+ justify-content: space-between;
145
+ gap: var(--bp-spacing-4);
146
+ padding: var(--bp-spacing-4) var(--bp-spacing-5);
147
+ border-bottom: var(--bp-border-width) solid var(--bp-color-border);
148
+ flex-shrink: 0;
149
+ }
150
+
151
+ .header--empty {
152
+ display: none;
153
+ }
154
+
155
+ .header ::slotted(*) {
156
+ margin: 0;
157
+ font-size: var(--bp-font-size-lg);
158
+ font-weight: var(--bp-font-weight-semibold);
159
+ }
160
+
161
+ /* Body */
162
+ .body {
163
+ flex: 1;
164
+ overflow-y: auto;
165
+ padding: var(--bp-spacing-5);
166
+ }
167
+
168
+ /* Footer */
169
+ .footer {
170
+ display: flex;
171
+ align-items: center;
172
+ gap: var(--bp-spacing-4);
173
+ padding: var(--bp-spacing-4) var(--bp-spacing-5);
174
+ border-top: var(--bp-border-width) solid var(--bp-color-border);
175
+ flex-shrink: 0;
176
+ }
177
+
178
+ /* Close button */
179
+ .close-button {
180
+ display: flex;
181
+ align-items: center;
182
+ justify-content: center;
183
+ width: 44px;
184
+ height: 44px;
185
+ padding: 0;
186
+ margin-left: auto;
187
+ background: transparent;
188
+ border: none;
189
+ border-radius: var(--bp-border-radius-sm);
190
+ color: var(--bp-color-text-muted);
191
+ cursor: pointer;
192
+ transition:
193
+ background-color var(--bp-transition-fast),
194
+ color var(--bp-transition-fast),
195
+ transform var(--bp-transition-fast);
196
+ }
197
+
198
+ .close-button:hover {
199
+ background-color: var(--bp-color-surface-subdued);
200
+ color: var(--bp-color-text);
201
+ }
202
+
203
+ .close-button:active {
204
+ background-color: var(--bp-color-surface-pressed);
205
+ transform: translateY(1px);
206
+ }
207
+
208
+ .close-button:focus {
209
+ outline: var(--bp-focus-width) var(--bp-focus-style) var(--bp-color-focus);
210
+ outline-offset: var(--bp-focus-offset);
211
+ }
212
+
213
+ .close-button:focus:not(:focus-visible) {
214
+ outline: none;
215
+ }
216
+
217
+ .close-button:focus-visible {
218
+ outline: var(--bp-focus-width) var(--bp-focus-style) var(--bp-color-focus);
219
+ outline-offset: var(--bp-focus-offset);
220
+ }
221
+
222
+ /* Inline mode - static sidebar */
223
+ .drawer--inline {
224
+ display: block;
225
+ }
226
+
227
+ .drawer--inline .panel {
228
+ position: relative;
229
+ transform: none;
230
+ box-shadow: none;
231
+ border: var(--bp-border-width) solid var(--bp-color-border);
232
+ border-radius: var(--bp-border-radius-md);
233
+ }
234
+
235
+ .drawer--inline.drawer--horizontal {
236
+ height: 100%;
237
+ }
238
+
239
+ .drawer--inline.drawer--vertical {
240
+ width: 100%;
241
+ }
242
+
243
+ /* Inline sizes - horizontal */
244
+ .drawer--inline.drawer--horizontal.drawer--small {
245
+ width: calc(var(--bp-spacing-24) * 3);
246
+ }
247
+
248
+ .drawer--inline.drawer--horizontal.drawer--medium {
249
+ width: calc(var(--bp-spacing-24) * 4 + var(--bp-spacing-16));
250
+ }
251
+
252
+ .drawer--inline.drawer--horizontal.drawer--large {
253
+ width: var(--bp-breakpoint-sm);
254
+ }
255
+
256
+ .drawer--inline.drawer--horizontal.drawer--full {
257
+ width: 100%;
258
+ }
259
+
260
+ /* Inline sizes - vertical */
261
+ .drawer--inline.drawer--vertical.drawer--small .panel {
262
+ height: calc(var(--bp-spacing-24) * 2);
263
+ }
264
+
265
+ .drawer--inline.drawer--vertical.drawer--medium .panel {
266
+ height: calc(var(--bp-spacing-24) * 3 + var(--bp-spacing-8));
267
+ }
268
+
269
+ .drawer--inline.drawer--vertical.drawer--large .panel {
270
+ height: calc(var(--bp-spacing-24) * 5);
271
+ }
272
+
273
+ .drawer--inline.drawer--vertical.drawer--full .panel {
274
+ height: auto;
275
+ }
276
+
277
+ /* Border positioning for inline drawers */
278
+ .drawer--inline.drawer--left .panel {
279
+ border-left: none;
280
+ border-top-left-radius: 0;
281
+ border-bottom-left-radius: 0;
282
+ }
283
+
284
+ .drawer--inline.drawer--right .panel {
285
+ border-right: none;
286
+ border-top-right-radius: 0;
287
+ border-bottom-right-radius: 0;
288
+ }
289
+
290
+ .drawer--inline.drawer--top .panel {
291
+ border-top: none;
292
+ border-top-left-radius: 0;
293
+ border-top-right-radius: 0;
294
+ }
295
+
296
+ .drawer--inline.drawer--bottom .panel {
297
+ border-bottom: none;
298
+ border-bottom-left-radius: 0;
299
+ border-bottom-right-radius: 0;
300
+ }
301
+
302
+ /* Reduced motion */
303
+ @media (prefers-reduced-motion: reduce) {
304
+ .panel {
305
+ transition: none;
306
+ }
307
+
308
+ .backdrop {
309
+ transition: none;
310
+ }
311
+ }
312
+ `;
313
+ var v = Object.defineProperty, m = Object.getOwnPropertyDescriptor, o = (e, t, p, i) => {
314
+ for (var s = i > 1 ? void 0 : i ? m(t, p) : t, c = e.length - 1, h; c >= 0; c--)
315
+ (h = e[c]) && (s = (i ? h(t, p, s) : h(s)) || s);
316
+ return i && s && v(t, p, s), s;
317
+ };
318
+ let r = class extends u {
319
+ constructor() {
320
+ super(), this.hasHeader = !1, this.hasFooter = !1, this.previouslyFocusedElement = null, this.handleKeyDown = (e) => {
321
+ e.key === "Escape" && this.closeOnEscape && this.open && !this.inline && (e.preventDefault(), this.hide("escape"));
322
+ }, this.handleBackdropClick = () => {
323
+ this.closeOnBackdrop && this.hide("backdrop");
324
+ }, this.handleCloseClick = () => {
325
+ this.hide("close-button");
326
+ }, this.handleHeaderSlotChange = (e) => {
327
+ const t = e.target;
328
+ this.hasHeader = t.assignedNodes({ flatten: !0 }).length > 0;
329
+ }, this.handleFooterSlotChange = (e) => {
330
+ const t = e.target;
331
+ this.hasFooter = t.assignedNodes({ flatten: !0 }).length > 0;
332
+ }, this.open = !1, this.placement = "left", this.size = "md", this.showClose = !0, this.closeOnBackdrop = !0, this.closeOnEscape = !0, this.showBackdrop = !0, this.label = "", this.inline = !1;
333
+ }
334
+ connectedCallback() {
335
+ super.connectedCallback(), this.addEventListener("keydown", this.handleKeyDown);
336
+ }
337
+ disconnectedCallback() {
338
+ super.disconnectedCallback(), this.removeEventListener("keydown", this.handleKeyDown);
339
+ }
340
+ /**
341
+ * Open the drawer.
342
+ * Sets open property to true and manages focus/scroll behavior.
343
+ *
344
+ * @fires bp-open - Emitted when the drawer opens
345
+ * @fires bp-after-open - Emitted after open animation completes
346
+ */
347
+ show() {
348
+ this.open || (this.open = !0);
349
+ }
350
+ /**
351
+ * Close the drawer.
352
+ * Sets open property to false if bp-close event is not prevented.
353
+ *
354
+ * @param reason - The reason the drawer was closed
355
+ * @fires bp-close - Emitted when the drawer closes (cancelable)
356
+ * @fires bp-after-close - Emitted after close animation completes
357
+ */
358
+ hide(e = "api") {
359
+ if (!this.open) return;
360
+ const t = new CustomEvent("bp-close", {
361
+ detail: { reason: e },
362
+ bubbles: !0,
363
+ composed: !0,
364
+ cancelable: !0
365
+ });
366
+ this.dispatchEvent(t), t.defaultPrevented || (this.open = !1);
367
+ }
368
+ /**
369
+ * Toggle the drawer open/closed state.
370
+ * Calls hide() if open, show() if closed.
371
+ */
372
+ toggle() {
373
+ this.open ? this.hide("api") : this.show();
374
+ }
375
+ updated(e) {
376
+ e.has("open") && (this.open ? this.handleOpen() : this.handleClose());
377
+ }
378
+ handleOpen() {
379
+ this.inline || (this.previouslyFocusedElement = document.activeElement, document.body.style.overflow = "hidden"), this.dispatchEvent(
380
+ new CustomEvent("bp-open", {
381
+ bubbles: !0,
382
+ composed: !0
383
+ })
384
+ ), this.updateComplete.then(() => {
385
+ this.shadowRoot?.querySelector(".panel")?.focus(), this.dispatchEvent(
386
+ new CustomEvent("bp-after-open", {
387
+ bubbles: !0,
388
+ composed: !0
389
+ })
390
+ );
391
+ });
392
+ }
393
+ handleClose() {
394
+ this.inline || (document.body.style.overflow = "", this.previouslyFocusedElement && (this.previouslyFocusedElement.focus(), this.previouslyFocusedElement = null)), this.updateComplete.then(() => {
395
+ this.dispatchEvent(
396
+ new CustomEvent("bp-after-close", {
397
+ bubbles: !0,
398
+ composed: !0
399
+ })
400
+ );
401
+ });
402
+ }
403
+ render() {
404
+ const e = this.placement === "left" || this.placement === "right";
405
+ return this.inline ? n`
406
+ <aside
407
+ class="drawer drawer--inline drawer--${this.placement} drawer--${this.size} ${e ? "drawer--horizontal" : "drawer--vertical"}"
408
+ part="drawer"
409
+ role="complementary"
410
+ aria-label=${this.label || l}
411
+ >
412
+ <div class="panel" part="panel">
413
+ ${this.hasHeader || this.showClose ? n`
414
+ <header class="header" part="header">
415
+ <slot
416
+ name="header"
417
+ @slotchange=${this.handleHeaderSlotChange}
418
+ ></slot>
419
+ </header>
420
+ ` : n`<slot
421
+ name="header"
422
+ @slotchange=${this.handleHeaderSlotChange}
423
+ ></slot>`}
424
+ <div class="body" part="body">
425
+ <slot></slot>
426
+ </div>
427
+ ${this.hasFooter ? n`
428
+ <footer class="footer" part="footer">
429
+ <slot
430
+ name="footer"
431
+ @slotchange=${this.handleFooterSlotChange}
432
+ ></slot>
433
+ </footer>
434
+ ` : n`<slot
435
+ name="footer"
436
+ @slotchange=${this.handleFooterSlotChange}
437
+ ></slot>`}
438
+ </div>
439
+ </aside>
440
+ ` : n`
441
+ <div
442
+ class="drawer drawer--overlay drawer--${this.placement} drawer--${this.size} ${e ? "drawer--horizontal" : "drawer--vertical"} ${this.open ? "drawer--open" : ""}"
443
+ part="drawer"
444
+ >
445
+ ${this.showBackdrop ? n`
446
+ <div
447
+ class="backdrop ${this.open ? "backdrop--visible" : ""}"
448
+ part="backdrop"
449
+ @click=${this.handleBackdropClick}
450
+ aria-hidden="true"
451
+ ></div>
452
+ ` : l}
453
+ <aside
454
+ class="panel ${this.open ? "panel--open" : ""}"
455
+ part="panel"
456
+ role="dialog"
457
+ aria-modal="true"
458
+ aria-label=${this.label || l}
459
+ tabindex="-1"
460
+ >
461
+ <header
462
+ class="header ${this.hasHeader || this.showClose ? "" : "header--empty"}"
463
+ part="header"
464
+ >
465
+ <slot
466
+ name="header"
467
+ @slotchange=${this.handleHeaderSlotChange}
468
+ ></slot>
469
+ ${this.showClose ? n`
470
+ <button
471
+ class="close-button"
472
+ part="close-button"
473
+ type="button"
474
+ aria-label="Close drawer"
475
+ @click=${this.handleCloseClick}
476
+ >
477
+ <bp-icon name="close" size="sm"></bp-icon>
478
+ </button>
479
+ ` : l}
480
+ </header>
481
+ <div class="body" part="body">
482
+ <slot></slot>
483
+ </div>
484
+ ${this.hasFooter ? n`
485
+ <footer class="footer" part="footer">
486
+ <slot
487
+ name="footer"
488
+ @slotchange=${this.handleFooterSlotChange}
489
+ ></slot>
490
+ </footer>
491
+ ` : n`<slot
492
+ name="footer"
493
+ @slotchange=${this.handleFooterSlotChange}
494
+ ></slot>`}
495
+ </aside>
496
+ </div>
497
+ `;
498
+ }
499
+ };
500
+ r.styles = [w];
501
+ o([
502
+ a({ type: Boolean, reflect: !0 })
503
+ ], r.prototype, "open", 2);
504
+ o([
505
+ a({
506
+ type: String,
507
+ reflect: !0,
508
+ converter: {
509
+ fromAttribute: (e) => e && ["left", "right", "top", "bottom"].includes(e) ? e : "left"
510
+ }
511
+ })
512
+ ], r.prototype, "placement", 2);
513
+ o([
514
+ a({
515
+ type: String,
516
+ reflect: !0,
517
+ converter: {
518
+ fromAttribute: (e) => e && ["sm", "md", "lg", "full"].includes(e) ? e : "md"
519
+ }
520
+ })
521
+ ], r.prototype, "size", 2);
522
+ o([
523
+ a({
524
+ converter: d,
525
+ attribute: "show-close",
526
+ reflect: !0
527
+ })
528
+ ], r.prototype, "showClose", 2);
529
+ o([
530
+ a({
531
+ converter: d,
532
+ attribute: "close-on-backdrop",
533
+ reflect: !0
534
+ })
535
+ ], r.prototype, "closeOnBackdrop", 2);
536
+ o([
537
+ a({
538
+ converter: d,
539
+ attribute: "close-on-escape",
540
+ reflect: !0
541
+ })
542
+ ], r.prototype, "closeOnEscape", 2);
543
+ o([
544
+ a({
545
+ converter: d,
546
+ attribute: "show-backdrop",
547
+ reflect: !0
548
+ })
549
+ ], r.prototype, "showBackdrop", 2);
550
+ o([
551
+ a({ type: String })
552
+ ], r.prototype, "label", 2);
553
+ o([
554
+ a({ type: Boolean, reflect: !0 })
555
+ ], r.prototype, "inline", 2);
556
+ o([
557
+ a({ type: Boolean, attribute: !1 })
558
+ ], r.prototype, "hasHeader", 2);
559
+ o([
560
+ a({ type: Boolean, attribute: !1 })
561
+ ], r.prototype, "hasFooter", 2);
562
+ r = o([
563
+ f("bp-drawer")
564
+ ], r);
565
+ export {
566
+ r as BpDrawer
567
+ };
568
+ //# sourceMappingURL=drawer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drawer.js","sources":["../../source/components/drawer/drawer.style.ts","../../source/components/drawer/drawer.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const drawerStyles = css`\n /* Base styles */\n :host {\n display: contents;\n }\n\n .drawer {\n font-family: var(--bp-font-family);\n font-size: var(--bp-font-size-base);\n color: var(--bp-color-text);\n }\n\n /* Overlay mode */\n .drawer--overlay {\n position: fixed;\n inset: 0;\n z-index: var(--bp-z-modal);\n pointer-events: none;\n }\n\n .drawer--overlay.drawer--open {\n pointer-events: auto;\n }\n\n /* Backdrop */\n .backdrop {\n position: absolute;\n inset: 0;\n background-color: oklch(from var(--bp-color-text) l c h / 0.5);\n opacity: 0;\n transition: opacity var(--bp-transition-base) ease-out;\n }\n\n .backdrop--visible {\n opacity: 1;\n }\n\n /* Panel base */\n .panel {\n position: absolute;\n display: flex;\n flex-direction: column;\n background-color: var(--bp-color-surface);\n box-shadow: var(--bp-shadow-xl);\n transition: transform var(--bp-transition-base) ease-out;\n overflow: hidden;\n }\n\n .drawer--overlay .panel:focus {\n outline: none;\n }\n\n /* Horizontal drawers (left/right) */\n .drawer--horizontal .panel {\n top: 0;\n bottom: 0;\n height: 100%;\n }\n\n .drawer--left .panel {\n left: 0;\n transform: translateX(-100%);\n }\n\n .drawer--left .panel--open {\n transform: translateX(0);\n }\n\n .drawer--right .panel {\n right: 0;\n transform: translateX(100%);\n }\n\n .drawer--right .panel--open {\n transform: translateX(0);\n }\n\n /* Vertical drawers (top/bottom) */\n .drawer--vertical .panel {\n left: 0;\n right: 0;\n width: 100%;\n }\n\n .drawer--top .panel {\n top: 0;\n transform: translateY(-100%);\n }\n\n .drawer--top .panel--open {\n transform: translateY(0);\n }\n\n .drawer--bottom .panel {\n bottom: 0;\n transform: translateY(100%);\n }\n\n .drawer--bottom .panel--open {\n transform: translateY(0);\n }\n\n /* Sizes - horizontal (width) */\n .drawer--horizontal.drawer--sm .panel {\n width: calc(var(--bp-spacing-24) * 3);\n }\n\n .drawer--horizontal.drawer--md .panel {\n width: calc(var(--bp-spacing-24) * 4 + var(--bp-spacing-16));\n }\n\n .drawer--horizontal.drawer--lg .panel {\n width: var(--bp-breakpoint-sm);\n }\n\n .drawer--horizontal.drawer--full .panel {\n width: 100%;\n }\n\n /* Sizes - vertical (height) */\n .drawer--vertical.drawer--sm .panel {\n height: calc(var(--bp-spacing-24) * 2);\n }\n\n .drawer--vertical.drawer--md .panel {\n height: calc(var(--bp-spacing-24) * 3 + var(--bp-spacing-8));\n }\n\n .drawer--vertical.drawer--lg .panel {\n height: calc(var(--bp-spacing-24) * 5);\n }\n\n .drawer--vertical.drawer--full .panel {\n height: 100%;\n }\n\n /* Header */\n .header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--bp-spacing-4);\n padding: var(--bp-spacing-4) var(--bp-spacing-5);\n border-bottom: var(--bp-border-width) solid var(--bp-color-border);\n flex-shrink: 0;\n }\n\n .header--empty {\n display: none;\n }\n\n .header ::slotted(*) {\n margin: 0;\n font-size: var(--bp-font-size-lg);\n font-weight: var(--bp-font-weight-semibold);\n }\n\n /* Body */\n .body {\n flex: 1;\n overflow-y: auto;\n padding: var(--bp-spacing-5);\n }\n\n /* Footer */\n .footer {\n display: flex;\n align-items: center;\n gap: var(--bp-spacing-4);\n padding: var(--bp-spacing-4) var(--bp-spacing-5);\n border-top: var(--bp-border-width) solid var(--bp-color-border);\n flex-shrink: 0;\n }\n\n /* Close button */\n .close-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 44px;\n height: 44px;\n padding: 0;\n margin-left: auto;\n background: transparent;\n border: none;\n border-radius: var(--bp-border-radius-sm);\n color: var(--bp-color-text-muted);\n cursor: pointer;\n transition:\n background-color var(--bp-transition-fast),\n color var(--bp-transition-fast),\n transform var(--bp-transition-fast);\n }\n\n .close-button:hover {\n background-color: var(--bp-color-surface-subdued);\n color: var(--bp-color-text);\n }\n\n .close-button:active {\n background-color: var(--bp-color-surface-pressed);\n transform: translateY(1px);\n }\n\n .close-button:focus {\n outline: var(--bp-focus-width) var(--bp-focus-style) var(--bp-color-focus);\n outline-offset: var(--bp-focus-offset);\n }\n\n .close-button:focus:not(:focus-visible) {\n outline: none;\n }\n\n .close-button:focus-visible {\n outline: var(--bp-focus-width) var(--bp-focus-style) var(--bp-color-focus);\n outline-offset: var(--bp-focus-offset);\n }\n\n /* Inline mode - static sidebar */\n .drawer--inline {\n display: block;\n }\n\n .drawer--inline .panel {\n position: relative;\n transform: none;\n box-shadow: none;\n border: var(--bp-border-width) solid var(--bp-color-border);\n border-radius: var(--bp-border-radius-md);\n }\n\n .drawer--inline.drawer--horizontal {\n height: 100%;\n }\n\n .drawer--inline.drawer--vertical {\n width: 100%;\n }\n\n /* Inline sizes - horizontal */\n .drawer--inline.drawer--horizontal.drawer--small {\n width: calc(var(--bp-spacing-24) * 3);\n }\n\n .drawer--inline.drawer--horizontal.drawer--medium {\n width: calc(var(--bp-spacing-24) * 4 + var(--bp-spacing-16));\n }\n\n .drawer--inline.drawer--horizontal.drawer--large {\n width: var(--bp-breakpoint-sm);\n }\n\n .drawer--inline.drawer--horizontal.drawer--full {\n width: 100%;\n }\n\n /* Inline sizes - vertical */\n .drawer--inline.drawer--vertical.drawer--small .panel {\n height: calc(var(--bp-spacing-24) * 2);\n }\n\n .drawer--inline.drawer--vertical.drawer--medium .panel {\n height: calc(var(--bp-spacing-24) * 3 + var(--bp-spacing-8));\n }\n\n .drawer--inline.drawer--vertical.drawer--large .panel {\n height: calc(var(--bp-spacing-24) * 5);\n }\n\n .drawer--inline.drawer--vertical.drawer--full .panel {\n height: auto;\n }\n\n /* Border positioning for inline drawers */\n .drawer--inline.drawer--left .panel {\n border-left: none;\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n\n .drawer--inline.drawer--right .panel {\n border-right: none;\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n\n .drawer--inline.drawer--top .panel {\n border-top: none;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n\n .drawer--inline.drawer--bottom .panel {\n border-bottom: none;\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n }\n\n /* Reduced motion */\n @media (prefers-reduced-motion: reduce) {\n .panel {\n transition: none;\n }\n\n .backdrop {\n transition: none;\n }\n }\n`;\n","import { LitElement, html, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { drawerStyles } from './drawer.style.js';\nimport { booleanConverter } from '../../utilities/boolean-converter.js';\nimport '../icon/icon.js';\n\nexport type DrawerPlacement = 'left' | 'right' | 'top' | 'bottom';\nexport type DrawerSize = 'sm' | 'md' | 'lg' | 'full';\n\n/**\n * A slide-in panel component that can appear from any edge of the viewport.\n *\n * @fires bp-open - Fired when the drawer opens\n * @fires bp-close - Fired when the drawer closes (includes reason: 'escape' | 'backdrop' | 'close-button' | 'api')\n * @fires bp-after-open - Fired after open animation completes\n * @fires bp-after-close - Fired after close animation completes\n *\n * @slot - Default slot for drawer content\n * @slot header - Optional header content\n * @slot footer - Optional footer content\n *\n * @csspart drawer - The drawer container\n * @csspart backdrop - The backdrop overlay (when not inline)\n * @csspart panel - The drawer panel\n * @csspart header - The header section\n * @csspart body - The body/content section\n * @csspart footer - The footer section\n * @csspart close-button - The close button\n */\n@customElement('bp-drawer')\nexport class BpDrawer extends LitElement {\n /** Whether the drawer is open */\n @property({ type: Boolean, reflect: true }) declare open: boolean;\n\n /** Which edge the drawer slides in from */\n @property({\n type: String,\n reflect: true,\n converter: {\n fromAttribute: (value: string | null) => {\n const valid = ['left', 'right', 'top', 'bottom'];\n return value && valid.includes(value)\n ? (value as DrawerPlacement)\n : 'left';\n },\n },\n })\n declare placement: DrawerPlacement;\n\n /** Size of the drawer (width for left/right, height for top/bottom) */\n @property({\n type: String,\n reflect: true,\n converter: {\n fromAttribute: (value: string | null) => {\n const valid = ['sm', 'md', 'lg', 'full'];\n return value && valid.includes(value) ? (value as DrawerSize) : 'md';\n },\n },\n })\n declare size: DrawerSize;\n\n /** Whether to show the close button */\n @property({\n converter: booleanConverter,\n attribute: 'show-close',\n reflect: true,\n })\n declare showClose: boolean;\n\n /** Whether clicking the backdrop closes the drawer */\n @property({\n converter: booleanConverter,\n attribute: 'close-on-backdrop',\n reflect: true,\n })\n declare closeOnBackdrop: boolean;\n\n /** Whether pressing Escape closes the drawer */\n @property({\n converter: booleanConverter,\n attribute: 'close-on-escape',\n reflect: true,\n })\n declare closeOnEscape: boolean;\n\n /** Whether to show the backdrop overlay */\n @property({\n converter: booleanConverter,\n attribute: 'show-backdrop',\n reflect: true,\n })\n declare showBackdrop: boolean;\n\n /** Accessible label for the drawer */\n @property({ type: String }) declare label: string;\n\n /**\n * Whether the drawer is rendered inline (always visible, part of document flow).\n * When true, the drawer acts as a static sidebar without overlay behavior.\n */\n @property({ type: Boolean, reflect: true }) declare inline: boolean;\n\n /** Whether the drawer has a header slot content */\n @property({ type: Boolean, attribute: false }) private hasHeader = false;\n\n /** Whether the drawer has a footer slot content */\n @property({ type: Boolean, attribute: false }) private hasFooter = false;\n\n private previouslyFocusedElement: HTMLElement | null = null;\n\n static styles = [drawerStyles];\n\n constructor() {\n super();\n this.open = false;\n this.placement = 'left';\n this.size = 'md';\n this.showClose = true;\n this.closeOnBackdrop = true;\n this.closeOnEscape = true;\n this.showBackdrop = true;\n this.label = '';\n this.inline = false;\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('keydown', this.handleKeyDown);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('keydown', this.handleKeyDown);\n }\n\n /**\n * Open the drawer.\n * Sets open property to true and manages focus/scroll behavior.\n *\n * @fires bp-open - Emitted when the drawer opens\n * @fires bp-after-open - Emitted after open animation completes\n */\n show(): void {\n if (this.open) return;\n this.open = true;\n }\n\n /**\n * Close the drawer.\n * Sets open property to false if bp-close event is not prevented.\n *\n * @param reason - The reason the drawer was closed\n * @fires bp-close - Emitted when the drawer closes (cancelable)\n * @fires bp-after-close - Emitted after close animation completes\n */\n hide(reason: 'escape' | 'backdrop' | 'close-button' | 'api' = 'api'): void {\n if (!this.open) return;\n\n const event = new CustomEvent('bp-close', {\n detail: { reason },\n bubbles: true,\n composed: true,\n cancelable: true,\n });\n\n this.dispatchEvent(event);\n\n if (!event.defaultPrevented) {\n this.open = false;\n }\n }\n\n /**\n * Toggle the drawer open/closed state.\n * Calls hide() if open, show() if closed.\n */\n toggle(): void {\n if (this.open) {\n this.hide('api');\n } else {\n this.show();\n }\n }\n\n protected updated(changedProperties: Map<string, unknown>): void {\n if (changedProperties.has('open')) {\n if (this.open) {\n this.handleOpen();\n } else {\n this.handleClose();\n }\n }\n }\n\n private handleOpen(): void {\n if (!this.inline) {\n // Store currently focused element\n this.previouslyFocusedElement = document.activeElement as HTMLElement;\n\n // Prevent body scroll\n document.body.style.overflow = 'hidden';\n }\n\n this.dispatchEvent(\n new CustomEvent('bp-open', {\n bubbles: true,\n composed: true,\n })\n );\n\n // Focus the drawer panel for accessibility\n this.updateComplete.then(() => {\n const panel = this.shadowRoot?.querySelector('.panel') as HTMLElement;\n panel?.focus();\n\n this.dispatchEvent(\n new CustomEvent('bp-after-open', {\n bubbles: true,\n composed: true,\n })\n );\n });\n }\n\n private handleClose(): void {\n if (!this.inline) {\n // Restore body scroll\n document.body.style.overflow = '';\n\n // Restore focus\n if (this.previouslyFocusedElement) {\n this.previouslyFocusedElement.focus();\n this.previouslyFocusedElement = null;\n }\n }\n\n this.updateComplete.then(() => {\n this.dispatchEvent(\n new CustomEvent('bp-after-close', {\n bubbles: true,\n composed: true,\n })\n );\n });\n }\n\n private handleKeyDown = (event: KeyboardEvent): void => {\n if (\n event.key === 'Escape' &&\n this.closeOnEscape &&\n this.open &&\n !this.inline\n ) {\n event.preventDefault();\n this.hide('escape');\n }\n };\n\n /**\n * Handles click events on the backdrop overlay.\n * Closes the drawer if closeOnBackdrop is true.\n */\n private handleBackdropClick = (): void => {\n if (this.closeOnBackdrop) {\n this.hide('backdrop');\n }\n };\n\n /**\n * Handles click events on the close button.\n * Closes the drawer with reason 'close-button'.\n */\n private handleCloseClick = (): void => {\n this.hide('close-button');\n };\n\n /**\n * Handles slot change events for the header slot.\n * Updates hasHeader state to control header visibility.\n *\n * @param event - The slotchange event\n */\n private handleHeaderSlotChange = (event: Event): void => {\n const slot = event.target as HTMLElement & {\n assignedNodes: (options?: { flatten?: boolean }) => Node[];\n };\n this.hasHeader = slot.assignedNodes({ flatten: true }).length > 0;\n };\n\n /**\n * Handles slot change events for the footer slot.\n * Updates hasFooter state to control footer visibility.\n *\n * @param event - The slotchange event\n */\n private handleFooterSlotChange = (event: Event): void => {\n const slot = event.target as HTMLElement & {\n assignedNodes: (options?: { flatten?: boolean }) => Node[];\n };\n this.hasFooter = slot.assignedNodes({ flatten: true }).length > 0;\n };\n\n render() {\n const isHorizontal =\n this.placement === 'left' || this.placement === 'right';\n\n // Inline mode: always visible, no backdrop, no overlay behavior\n if (this.inline) {\n return html`\n <aside\n class=\"drawer drawer--inline drawer--${this.placement} drawer--${this\n .size} ${isHorizontal ? 'drawer--horizontal' : 'drawer--vertical'}\"\n part=\"drawer\"\n role=\"complementary\"\n aria-label=${this.label || nothing}\n >\n <div class=\"panel\" part=\"panel\">\n ${this.hasHeader || this.showClose\n ? html`\n <header class=\"header\" part=\"header\">\n <slot\n name=\"header\"\n @slotchange=${this.handleHeaderSlotChange}\n ></slot>\n </header>\n `\n : html`<slot\n name=\"header\"\n @slotchange=${this.handleHeaderSlotChange}\n ></slot>`}\n <div class=\"body\" part=\"body\">\n <slot></slot>\n </div>\n ${this.hasFooter\n ? html`\n <footer class=\"footer\" part=\"footer\">\n <slot\n name=\"footer\"\n @slotchange=${this.handleFooterSlotChange}\n ></slot>\n </footer>\n `\n : html`<slot\n name=\"footer\"\n @slotchange=${this.handleFooterSlotChange}\n ></slot>`}\n </div>\n </aside>\n `;\n }\n\n // Overlay mode: slide-in panel with backdrop\n return html`\n <div\n class=\"drawer drawer--overlay drawer--${this.placement} drawer--${this\n .size} ${isHorizontal\n ? 'drawer--horizontal'\n : 'drawer--vertical'} ${this.open ? 'drawer--open' : ''}\"\n part=\"drawer\"\n >\n ${this.showBackdrop\n ? html`\n <div\n class=\"backdrop ${this.open ? 'backdrop--visible' : ''}\"\n part=\"backdrop\"\n @click=${this.handleBackdropClick}\n aria-hidden=\"true\"\n ></div>\n `\n : nothing}\n <aside\n class=\"panel ${this.open ? 'panel--open' : ''}\"\n part=\"panel\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=${this.label || nothing}\n tabindex=\"-1\"\n >\n <header\n class=\"header ${this.hasHeader || this.showClose\n ? ''\n : 'header--empty'}\"\n part=\"header\"\n >\n <slot\n name=\"header\"\n @slotchange=${this.handleHeaderSlotChange}\n ></slot>\n ${this.showClose\n ? html`\n <button\n class=\"close-button\"\n part=\"close-button\"\n type=\"button\"\n aria-label=\"Close drawer\"\n @click=${this.handleCloseClick}\n >\n <bp-icon name=\"close\" size=\"sm\"></bp-icon>\n </button>\n `\n : nothing}\n </header>\n <div class=\"body\" part=\"body\">\n <slot></slot>\n </div>\n ${this.hasFooter\n ? html`\n <footer class=\"footer\" part=\"footer\">\n <slot\n name=\"footer\"\n @slotchange=${this.handleFooterSlotChange}\n ></slot>\n </footer>\n `\n : html`<slot\n name=\"footer\"\n @slotchange=${this.handleFooterSlotChange}\n ></slot>`}\n </aside>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'bp-drawer': BpDrawer;\n }\n}\n"],"names":["drawerStyles","css","BpDrawer","LitElement","event","slot","reason","changedProperties","isHorizontal","html","nothing","__decorateClass","property","value","booleanConverter","customElement"],"mappings":";;;AAEO,MAAMA,IAAeC;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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"}