@krollins/blueprint 0.1.12 → 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.
- package/dist/components/accordion.js +393 -0
- package/dist/components/accordion.js.map +1 -0
- package/dist/components/alert.js +213 -0
- package/dist/components/alert.js.map +1 -0
- package/dist/components/avatar.js +237 -0
- package/dist/components/avatar.js.map +1 -0
- package/dist/components/badge.js +144 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/breadcrumb.js +481 -0
- package/dist/components/breadcrumb.js.map +1 -0
- package/dist/components/button.js +192 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/card.js +223 -0
- package/dist/components/card.js.map +1 -0
- package/dist/components/checkbox.js +337 -0
- package/dist/components/checkbox.js.map +1 -0
- package/dist/components/color-picker.js +1660 -0
- package/dist/components/color-picker.js.map +1 -0
- package/dist/components/combobox.js +595 -0
- package/dist/components/combobox.js.map +1 -0
- package/dist/components/date-picker.js +726 -0
- package/dist/components/date-picker.js.map +1 -0
- package/dist/components/divider.js +214 -0
- package/dist/components/divider.js.map +1 -0
- package/dist/components/drawer.js +568 -0
- package/dist/components/drawer.js.map +1 -0
- package/dist/components/dropdown.js +377 -0
- package/dist/components/dropdown.js.map +1 -0
- package/dist/components/file-upload.js +669 -0
- package/dist/components/file-upload.js.map +1 -0
- package/dist/components/heading.js +161 -0
- package/dist/components/heading.js.map +1 -0
- package/dist/components/icon.js +599 -0
- package/dist/components/icon.js.map +1 -0
- package/dist/components/input.js +363 -0
- package/dist/components/input.js.map +1 -0
- package/dist/components/link.js +178 -0
- package/dist/components/link.js.map +1 -0
- package/dist/components/menu.js +331 -0
- package/dist/components/menu.js.map +1 -0
- package/dist/components/modal.js +317 -0
- package/dist/components/modal.js.map +1 -0
- package/dist/components/multi-select.js +642 -0
- package/dist/components/multi-select.js.map +1 -0
- package/dist/components/notification.js +429 -0
- package/dist/components/notification.js.map +1 -0
- package/dist/components/number-input.js +556 -0
- package/dist/components/number-input.js.map +1 -0
- package/dist/components/pagination.js +320 -0
- package/dist/components/pagination.js.map +1 -0
- package/dist/components/popover.js +597 -0
- package/dist/components/popover.js.map +1 -0
- package/dist/components/progress.js +219 -0
- package/dist/components/progress.js.map +1 -0
- package/dist/components/radio.js +321 -0
- package/dist/components/radio.js.map +1 -0
- package/dist/components/select.js +498 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/skeleton.js +240 -0
- package/dist/components/skeleton.js.map +1 -0
- package/dist/components/slider.js +9 -0
- package/dist/components/slider.js.map +1 -0
- package/dist/components/spinner.js +133 -0
- package/dist/components/spinner.js.map +1 -0
- package/dist/components/stepper.js +812 -0
- package/dist/components/stepper.js.map +1 -0
- package/dist/components/switch.js +380 -0
- package/dist/components/switch.js.map +1 -0
- package/dist/components/table.js +642 -0
- package/dist/components/table.js.map +1 -0
- package/dist/components/tabs.js +547 -0
- package/dist/components/tabs.js.map +1 -0
- package/dist/components/tag.js +291 -0
- package/dist/components/tag.js.map +1 -0
- package/dist/components/text.js +278 -0
- package/dist/components/text.js.map +1 -0
- package/dist/components/textarea.js +380 -0
- package/dist/components/textarea.js.map +1 -0
- package/dist/components/time-picker.js +457 -0
- package/dist/components/time-picker.js.map +1 -0
- package/dist/components/tooltip.js +239 -0
- package/dist/components/tooltip.js.map +1 -0
- package/dist/components/tree.js +582 -0
- package/dist/components/tree.js.map +1 -0
- package/dist/index.js +93 -17799
- package/dist/index.js.map +1 -1
- package/dist/shared/boolean-converter-XDGfS9LC.js +12 -0
- package/dist/shared/boolean-converter-XDGfS9LC.js.map +1 -0
- package/dist/shared/debounce-BckY30Sf.js +23 -0
- package/dist/shared/debounce-BckY30Sf.js.map +1 -0
- package/dist/shared/memoize-DlOFy-92.js +16 -0
- package/dist/shared/memoize-DlOFy-92.js.map +1 -0
- package/dist/shared/slider-BNt5TITl.js +484 -0
- package/dist/shared/slider-BNt5TITl.js.map +1 -0
- package/package.json +44 -2
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
import { css as f, LitElement as c, html as m } from "lit";
|
|
2
|
+
import { property as n, customElement as h } from "lit/decorators.js";
|
|
3
|
+
import { classMap as b } from "lit/directives/class-map.js";
|
|
4
|
+
const u = f`
|
|
5
|
+
/* ===== ACCORDION CONTAINER ===== */
|
|
6
|
+
|
|
7
|
+
:host {
|
|
8
|
+
display: block;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.accordion {
|
|
12
|
+
font-family: var(--bp-font-family);
|
|
13
|
+
display: flex;
|
|
14
|
+
flex-direction: column;
|
|
15
|
+
border: var(--bp-border-width) solid var(--bp-color-border);
|
|
16
|
+
border-radius: var(--bp-border-radius);
|
|
17
|
+
overflow: hidden;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/* Disabled state */
|
|
21
|
+
.accordion--disabled {
|
|
22
|
+
opacity: var(--bp-opacity-disabled);
|
|
23
|
+
pointer-events: none;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/* ===== ACCORDION ITEM ===== */
|
|
27
|
+
|
|
28
|
+
/* Separators between items */
|
|
29
|
+
:host(:not(:first-of-type)) {
|
|
30
|
+
border-top: var(--bp-border-width) solid var(--bp-color-border);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.item {
|
|
34
|
+
display: flex;
|
|
35
|
+
flex-direction: column;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* Header button */
|
|
39
|
+
.item__header {
|
|
40
|
+
/* Reset */
|
|
41
|
+
appearance: none;
|
|
42
|
+
border: none;
|
|
43
|
+
background: transparent;
|
|
44
|
+
margin: 0;
|
|
45
|
+
|
|
46
|
+
/* Layout */
|
|
47
|
+
display: flex;
|
|
48
|
+
align-items: center;
|
|
49
|
+
justify-content: space-between;
|
|
50
|
+
width: 100%;
|
|
51
|
+
padding: var(--bp-spacing-4) var(--bp-spacing-4);
|
|
52
|
+
gap: var(--bp-spacing-3);
|
|
53
|
+
|
|
54
|
+
/* Typography */
|
|
55
|
+
font-family: var(--bp-font-family);
|
|
56
|
+
font-size: var(--bp-font-size-base);
|
|
57
|
+
font-weight: var(--bp-font-weight-medium);
|
|
58
|
+
text-align: left;
|
|
59
|
+
color: var(--bp-color-text);
|
|
60
|
+
line-height: var(--bp-line-height-normal);
|
|
61
|
+
|
|
62
|
+
/* Interaction */
|
|
63
|
+
cursor: pointer;
|
|
64
|
+
transition: background-color var(--bp-transition-fast);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.item__header:hover:not(:disabled) {
|
|
68
|
+
background-color: var(--bp-color-surface);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.item__header:focus {
|
|
72
|
+
outline: none;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.item__header:focus-visible {
|
|
76
|
+
outline: var(--bp-focus-width) var(--bp-focus-style) var(--bp-color-focus);
|
|
77
|
+
outline-offset: var(--bp-focus-offset);
|
|
78
|
+
}
|
|
79
|
+
.item__header:active:not(:disabled) {
|
|
80
|
+
background-color: var(--bp-color-surface-hover);
|
|
81
|
+
transform: translateY(1px);
|
|
82
|
+
}
|
|
83
|
+
.item__header-content {
|
|
84
|
+
display: flex;
|
|
85
|
+
align-items: center;
|
|
86
|
+
gap: var(--bp-spacing-3);
|
|
87
|
+
flex: 1;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/* Expand/collapse icon */
|
|
91
|
+
.item__icon {
|
|
92
|
+
display: flex;
|
|
93
|
+
align-items: center;
|
|
94
|
+
justify-content: center;
|
|
95
|
+
flex-shrink: 0;
|
|
96
|
+
color: var(--bp-color-text-muted);
|
|
97
|
+
transition: transform var(--bp-transition-fast);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/* Icon is sized by bp-icon component */
|
|
101
|
+
|
|
102
|
+
/* Rotate icon when expanded */
|
|
103
|
+
.item--expanded .item__icon {
|
|
104
|
+
transform: rotate(180deg);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/* Collapsible content */
|
|
108
|
+
.item__content {
|
|
109
|
+
display: grid;
|
|
110
|
+
grid-template-rows: 0fr;
|
|
111
|
+
overflow: hidden;
|
|
112
|
+
transition: grid-template-rows var(--bp-transition-base);
|
|
113
|
+
content-visibility: hidden;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.item--expanded .item__content {
|
|
117
|
+
grid-template-rows: 1fr;
|
|
118
|
+
content-visibility: visible;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.item__body {
|
|
122
|
+
min-height: 0;
|
|
123
|
+
padding: 0 var(--bp-spacing-4) var(--bp-spacing-4) var(--bp-spacing-4);
|
|
124
|
+
color: var(--bp-color-text);
|
|
125
|
+
font-size: var(--bp-font-size-sm);
|
|
126
|
+
line-height: var(--bp-line-height-relaxed);
|
|
127
|
+
overflow: hidden;
|
|
128
|
+
opacity: 0;
|
|
129
|
+
transition: opacity var(--bp-transition-fast);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.item--expanded .item__body {
|
|
133
|
+
opacity: 1;
|
|
134
|
+
transition-delay: 100ms;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.item:not(.item--expanded) .item__body {
|
|
138
|
+
padding-top: 0;
|
|
139
|
+
padding-bottom: 0;
|
|
140
|
+
opacity: 0;
|
|
141
|
+
transition-delay: 0ms;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/* Disabled state */
|
|
145
|
+
.item--disabled .item__header {
|
|
146
|
+
cursor: not-allowed;
|
|
147
|
+
opacity: var(--bp-opacity-disabled);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.item--disabled .item__icon {
|
|
151
|
+
opacity: 1;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.item--disabled .item__header:hover {
|
|
155
|
+
background-color: transparent;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/* Reduced motion */
|
|
159
|
+
@media (prefers-reduced-motion: reduce) {
|
|
160
|
+
.item__icon {
|
|
161
|
+
transition: none;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
.item__content {
|
|
165
|
+
transition: none;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
.item__body {
|
|
169
|
+
transition: none;
|
|
170
|
+
opacity: 1;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.item__header:active:not(:disabled) {
|
|
174
|
+
transform: none;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
`;
|
|
178
|
+
var v = Object.defineProperty, y = Object.getOwnPropertyDescriptor, d = (e, t, i, a) => {
|
|
179
|
+
for (var s = a > 1 ? void 0 : a ? y(t, i) : t, l = e.length - 1, p; l >= 0; l--)
|
|
180
|
+
(p = e[l]) && (s = (a ? p(t, i, s) : p(s)) || s);
|
|
181
|
+
return a && s && v(t, i, s), s;
|
|
182
|
+
};
|
|
183
|
+
let r = class extends c {
|
|
184
|
+
constructor() {
|
|
185
|
+
super(), this.handleItemToggle = (e) => {
|
|
186
|
+
const t = e, { id: i, expanded: a } = t.detail;
|
|
187
|
+
a ? (this.multiple ? this.expandedItems = [...this.expandedItems, i] : this.expandedItems = [i], this.dispatchEvent(
|
|
188
|
+
new CustomEvent("bp-expand", {
|
|
189
|
+
detail: { id: i },
|
|
190
|
+
bubbles: !0,
|
|
191
|
+
composed: !0
|
|
192
|
+
})
|
|
193
|
+
)) : (this.expandedItems = this.expandedItems.filter((s) => s !== i), this.dispatchEvent(
|
|
194
|
+
new CustomEvent("bp-collapse", {
|
|
195
|
+
detail: { id: i },
|
|
196
|
+
bubbles: !0,
|
|
197
|
+
composed: !0
|
|
198
|
+
})
|
|
199
|
+
)), this.updateChildItems();
|
|
200
|
+
}, this.multiple = !1, this.expandedItems = [], this.disabled = !1;
|
|
201
|
+
}
|
|
202
|
+
connectedCallback() {
|
|
203
|
+
super.connectedCallback(), this.addEventListener("bp-item-toggle", this.handleItemToggle);
|
|
204
|
+
}
|
|
205
|
+
disconnectedCallback() {
|
|
206
|
+
super.disconnectedCallback(), this.removeEventListener("bp-item-toggle", this.handleItemToggle);
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Synchronizes child accordion items with the expandedItems state.
|
|
210
|
+
* Also applies disabled state to all items when accordion is disabled.
|
|
211
|
+
*/
|
|
212
|
+
updateChildItems() {
|
|
213
|
+
this.querySelectorAll("bp-accordion-item").forEach((t) => {
|
|
214
|
+
const i = t, a = this.expandedItems.includes(i.itemId);
|
|
215
|
+
i.expanded = a, this.disabled && (i.disabled = !0);
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Initializes expandedItems array from children with expanded attribute.
|
|
220
|
+
* Called on first render to respect items marked as expanded in HTML.
|
|
221
|
+
*/
|
|
222
|
+
initializeExpandedItems() {
|
|
223
|
+
const e = this.querySelectorAll("bp-accordion-item"), t = [];
|
|
224
|
+
e.forEach((i) => {
|
|
225
|
+
const a = i;
|
|
226
|
+
a.expanded && a.itemId && t.push(a.itemId);
|
|
227
|
+
}), t.length > 0 && (this.expandedItems = this.multiple ? t : [t[0]]);
|
|
228
|
+
}
|
|
229
|
+
firstUpdated() {
|
|
230
|
+
this.initializeExpandedItems(), this.updateChildItems();
|
|
231
|
+
}
|
|
232
|
+
updated(e) {
|
|
233
|
+
(e.has("expandedItems") || e.has("disabled")) && this.updateChildItems();
|
|
234
|
+
}
|
|
235
|
+
/** Expand an item by ID */
|
|
236
|
+
expand(e) {
|
|
237
|
+
this.expandedItems.includes(e) || (this.multiple ? this.expandedItems = [...this.expandedItems, e] : this.expandedItems = [e], this.updateChildItems(), this.dispatchEvent(
|
|
238
|
+
new CustomEvent("bp-expand", {
|
|
239
|
+
detail: { id: e },
|
|
240
|
+
bubbles: !0,
|
|
241
|
+
composed: !0
|
|
242
|
+
})
|
|
243
|
+
));
|
|
244
|
+
}
|
|
245
|
+
/** Collapse an item by ID */
|
|
246
|
+
collapse(e) {
|
|
247
|
+
this.expandedItems.includes(e) && (this.expandedItems = this.expandedItems.filter((t) => t !== e), this.updateChildItems(), this.dispatchEvent(
|
|
248
|
+
new CustomEvent("bp-collapse", {
|
|
249
|
+
detail: { id: e },
|
|
250
|
+
bubbles: !0,
|
|
251
|
+
composed: !0
|
|
252
|
+
})
|
|
253
|
+
));
|
|
254
|
+
}
|
|
255
|
+
/** Expand all items (only works in multiple mode) */
|
|
256
|
+
expandAll() {
|
|
257
|
+
if (!this.multiple) return;
|
|
258
|
+
const e = this.querySelectorAll("bp-accordion-item"), t = [];
|
|
259
|
+
e.forEach((i) => {
|
|
260
|
+
const a = i;
|
|
261
|
+
a.disabled || t.push(a.itemId);
|
|
262
|
+
}), this.expandedItems = t, this.updateChildItems();
|
|
263
|
+
}
|
|
264
|
+
/** Collapse all items */
|
|
265
|
+
collapseAll() {
|
|
266
|
+
this.expandedItems = [], this.updateChildItems();
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Handles slot changes - when children are added or removed.
|
|
270
|
+
* Initializes expanded state from new children.
|
|
271
|
+
*/
|
|
272
|
+
handleSlotChange() {
|
|
273
|
+
this.expandedItems.length === 0 && this.initializeExpandedItems(), this.updateChildItems();
|
|
274
|
+
}
|
|
275
|
+
render() {
|
|
276
|
+
const e = {
|
|
277
|
+
accordion: !0,
|
|
278
|
+
"accordion--disabled": this.disabled
|
|
279
|
+
};
|
|
280
|
+
return m`
|
|
281
|
+
<div class=${b(e)} part="accordion" role="presentation">
|
|
282
|
+
<slot @slotchange=${this.handleSlotChange}></slot>
|
|
283
|
+
</div>
|
|
284
|
+
`;
|
|
285
|
+
}
|
|
286
|
+
};
|
|
287
|
+
r.styles = [u];
|
|
288
|
+
d([
|
|
289
|
+
n({ type: Boolean, reflect: !0 })
|
|
290
|
+
], r.prototype, "multiple", 2);
|
|
291
|
+
d([
|
|
292
|
+
n({ type: Array })
|
|
293
|
+
], r.prototype, "expandedItems", 2);
|
|
294
|
+
d([
|
|
295
|
+
n({ type: Boolean, reflect: !0 })
|
|
296
|
+
], r.prototype, "disabled", 2);
|
|
297
|
+
r = d([
|
|
298
|
+
h("bp-accordion")
|
|
299
|
+
], r);
|
|
300
|
+
let o = class extends c {
|
|
301
|
+
constructor() {
|
|
302
|
+
super(), this.itemId = "", this.header = "", this.expanded = !1, this.disabled = !1;
|
|
303
|
+
}
|
|
304
|
+
connectedCallback() {
|
|
305
|
+
super.connectedCallback(), this.itemId || (this.itemId = `accordion-item-${Math.random().toString(36).slice(2, 9)}`);
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Handles toggle action and dispatches bp-item-toggle event.
|
|
309
|
+
* Also manages focus on the header button after expansion.
|
|
310
|
+
*/
|
|
311
|
+
handleToggle() {
|
|
312
|
+
this.disabled || (this.dispatchEvent(
|
|
313
|
+
new CustomEvent("bp-item-toggle", {
|
|
314
|
+
detail: { id: this.itemId, expanded: !this.expanded },
|
|
315
|
+
bubbles: !0,
|
|
316
|
+
composed: !0
|
|
317
|
+
})
|
|
318
|
+
), this.updateComplete.then(() => {
|
|
319
|
+
this.shadowRoot?.querySelector(
|
|
320
|
+
".item__header"
|
|
321
|
+
)?.focus();
|
|
322
|
+
}));
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Handles keyboard navigation.
|
|
326
|
+
* Triggers toggle on Enter or Space key press.
|
|
327
|
+
*/
|
|
328
|
+
handleKeyDown(e) {
|
|
329
|
+
this.disabled || (e.key === "Enter" || e.key === " ") && (e.preventDefault(), this.handleToggle());
|
|
330
|
+
}
|
|
331
|
+
render() {
|
|
332
|
+
const e = {
|
|
333
|
+
item: !0,
|
|
334
|
+
"item--expanded": this.expanded,
|
|
335
|
+
"item--disabled": this.disabled
|
|
336
|
+
}, t = `${this.itemId}-header`, i = `${this.itemId}-content`;
|
|
337
|
+
return m`
|
|
338
|
+
<div class=${b(e)} part="item">
|
|
339
|
+
<button
|
|
340
|
+
class="item__header"
|
|
341
|
+
part="header"
|
|
342
|
+
id=${t}
|
|
343
|
+
aria-expanded=${this.expanded}
|
|
344
|
+
aria-controls=${i}
|
|
345
|
+
aria-disabled=${this.disabled}
|
|
346
|
+
?disabled=${this.disabled}
|
|
347
|
+
@click=${this.handleToggle}
|
|
348
|
+
@keydown=${this.handleKeyDown}
|
|
349
|
+
>
|
|
350
|
+
<span class="item__header-content">
|
|
351
|
+
<slot name="icon"></slot>
|
|
352
|
+
<slot name="header">${this.header}</slot>
|
|
353
|
+
</span>
|
|
354
|
+
<span class="item__icon" part="icon" aria-hidden="true">
|
|
355
|
+
<bp-icon name="chevron-down" size="md"></bp-icon>
|
|
356
|
+
</span>
|
|
357
|
+
</button>
|
|
358
|
+
<div
|
|
359
|
+
class="item__content"
|
|
360
|
+
part="content"
|
|
361
|
+
id=${i}
|
|
362
|
+
role="region"
|
|
363
|
+
aria-labelledby=${t}
|
|
364
|
+
>
|
|
365
|
+
<div class="item__body" part="body">
|
|
366
|
+
<slot></slot>
|
|
367
|
+
</div>
|
|
368
|
+
</div>
|
|
369
|
+
</div>
|
|
370
|
+
`;
|
|
371
|
+
}
|
|
372
|
+
};
|
|
373
|
+
o.styles = [u];
|
|
374
|
+
d([
|
|
375
|
+
n({ type: String, attribute: "item-id", reflect: !0 })
|
|
376
|
+
], o.prototype, "itemId", 2);
|
|
377
|
+
d([
|
|
378
|
+
n({ type: String })
|
|
379
|
+
], o.prototype, "header", 2);
|
|
380
|
+
d([
|
|
381
|
+
n({ type: Boolean, reflect: !0 })
|
|
382
|
+
], o.prototype, "expanded", 2);
|
|
383
|
+
d([
|
|
384
|
+
n({ type: Boolean, reflect: !0 })
|
|
385
|
+
], o.prototype, "disabled", 2);
|
|
386
|
+
o = d([
|
|
387
|
+
h("bp-accordion-item")
|
|
388
|
+
], o);
|
|
389
|
+
export {
|
|
390
|
+
r as BpAccordion,
|
|
391
|
+
o as BpAccordionItem
|
|
392
|
+
};
|
|
393
|
+
//# sourceMappingURL=accordion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accordion.js","sources":["../../source/components/accordion/accordion.style.ts","../../source/components/accordion/accordion.ts"],"sourcesContent":["import { css } from 'lit';\r\n\r\nexport const accordionStyles = css`\r\n /* ===== ACCORDION CONTAINER ===== */\r\n\r\n :host {\r\n display: block;\r\n }\r\n\r\n .accordion {\r\n font-family: var(--bp-font-family);\r\n display: flex;\r\n flex-direction: column;\r\n border: var(--bp-border-width) solid var(--bp-color-border);\r\n border-radius: var(--bp-border-radius);\r\n overflow: hidden;\r\n }\r\n\r\n /* Disabled state */\r\n .accordion--disabled {\r\n opacity: var(--bp-opacity-disabled);\r\n pointer-events: none;\r\n }\r\n\r\n /* ===== ACCORDION ITEM ===== */\r\n\r\n /* Separators between items */\r\n :host(:not(:first-of-type)) {\r\n border-top: var(--bp-border-width) solid var(--bp-color-border);\r\n }\r\n\r\n .item {\r\n display: flex;\r\n flex-direction: column;\r\n }\r\n\r\n /* Header button */\r\n .item__header {\r\n /* Reset */\r\n appearance: none;\r\n border: none;\r\n background: transparent;\r\n margin: 0;\r\n\r\n /* Layout */\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n width: 100%;\r\n padding: var(--bp-spacing-4) var(--bp-spacing-4);\r\n gap: var(--bp-spacing-3);\r\n\r\n /* Typography */\r\n font-family: var(--bp-font-family);\r\n font-size: var(--bp-font-size-base);\r\n font-weight: var(--bp-font-weight-medium);\r\n text-align: left;\r\n color: var(--bp-color-text);\r\n line-height: var(--bp-line-height-normal);\r\n\r\n /* Interaction */\r\n cursor: pointer;\r\n transition: background-color var(--bp-transition-fast);\r\n }\r\n\r\n .item__header:hover:not(:disabled) {\r\n background-color: var(--bp-color-surface);\r\n }\r\n\r\n .item__header:focus {\r\n outline: none;\r\n }\r\n\r\n .item__header: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 .item__header:active:not(:disabled) {\r\n background-color: var(--bp-color-surface-hover);\r\n transform: translateY(1px);\r\n }\r\n .item__header-content {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--bp-spacing-3);\r\n flex: 1;\r\n }\r\n\r\n /* Expand/collapse icon */\r\n .item__icon {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex-shrink: 0;\r\n color: var(--bp-color-text-muted);\r\n transition: transform var(--bp-transition-fast);\r\n }\r\n\r\n /* Icon is sized by bp-icon component */\r\n\r\n /* Rotate icon when expanded */\r\n .item--expanded .item__icon {\r\n transform: rotate(180deg);\r\n }\r\n\r\n /* Collapsible content */\r\n .item__content {\r\n display: grid;\r\n grid-template-rows: 0fr;\r\n overflow: hidden;\r\n transition: grid-template-rows var(--bp-transition-base);\r\n content-visibility: hidden;\r\n }\r\n\r\n .item--expanded .item__content {\r\n grid-template-rows: 1fr;\r\n content-visibility: visible;\r\n }\r\n\r\n .item__body {\r\n min-height: 0;\r\n padding: 0 var(--bp-spacing-4) var(--bp-spacing-4) var(--bp-spacing-4);\r\n color: var(--bp-color-text);\r\n font-size: var(--bp-font-size-sm);\r\n line-height: var(--bp-line-height-relaxed);\r\n overflow: hidden;\r\n opacity: 0;\r\n transition: opacity var(--bp-transition-fast);\r\n }\r\n\r\n .item--expanded .item__body {\r\n opacity: 1;\r\n transition-delay: 100ms;\r\n }\r\n\r\n .item:not(.item--expanded) .item__body {\r\n padding-top: 0;\r\n padding-bottom: 0;\r\n opacity: 0;\r\n transition-delay: 0ms;\r\n }\r\n\r\n /* Disabled state */\r\n .item--disabled .item__header {\r\n cursor: not-allowed;\r\n opacity: var(--bp-opacity-disabled);\r\n }\r\n\r\n .item--disabled .item__icon {\r\n opacity: 1;\r\n }\r\n\r\n .item--disabled .item__header:hover {\r\n background-color: transparent;\r\n }\r\n\r\n /* Reduced motion */\r\n @media (prefers-reduced-motion: reduce) {\r\n .item__icon {\r\n transition: none;\r\n }\r\n\r\n .item__content {\r\n transition: none;\r\n }\r\n\r\n .item__body {\r\n transition: none;\r\n opacity: 1;\r\n }\r\n\r\n .item__header:active:not(:disabled) {\r\n transform: none;\r\n }\r\n }\r\n`;\r\n","import { LitElement, html } from 'lit';\r\nimport { customElement, property } from 'lit/decorators.js';\r\nimport { classMap } from 'lit/directives/class-map.js';\r\nimport { accordionStyles } from './accordion.style.js';\r\nimport '../icon/icon.js';\r\n\r\n/**\r\n * A container component that groups accordion items.\r\n * Controls single or multiple expansion behavior.\r\n *\r\n * @element bp-accordion\r\n *\r\n * @property {boolean} multiple - Whether multiple items can be expanded simultaneously\r\n * @property {string[]} expandedItems - Array of expanded item IDs\r\n * @property {boolean} disabled - Whether all items are disabled\r\n *\r\n * @fires bp-expand - Fired when an item is expanded\r\n * @fires bp-collapse - Fired when an item is collapsed\r\n *\r\n * @slot - Default slot for bp-accordion-item elements\r\n *\r\n * @csspart accordion - The main accordion container\r\n */\r\n@customElement('bp-accordion')\r\nexport class BpAccordion extends LitElement {\r\n /** Whether multiple items can be expanded simultaneously */\r\n @property({ type: Boolean, reflect: true }) declare multiple: boolean;\r\n\r\n /** Array of expanded item IDs */\r\n @property({ type: Array }) declare expandedItems: string[];\r\n\r\n /** Whether all items are disabled */\r\n @property({ type: Boolean, reflect: true }) declare disabled: boolean;\r\n\r\n static styles = [accordionStyles];\r\n\r\n constructor() {\r\n super();\r\n this.multiple = false;\r\n this.expandedItems = [];\r\n this.disabled = false;\r\n }\r\n\r\n connectedCallback(): void {\r\n super.connectedCallback();\r\n this.addEventListener('bp-item-toggle', this.handleItemToggle);\r\n }\r\n\r\n disconnectedCallback(): void {\r\n super.disconnectedCallback();\r\n this.removeEventListener('bp-item-toggle', this.handleItemToggle);\r\n }\r\n\r\n /**\r\n * Handles item toggle events from child accordion items.\r\n * Updates expandedItems array based on multiple mode and dispatches expand/collapse events.\r\n */\r\n private handleItemToggle = (event: Event) => {\r\n const customEvent = event as CustomEvent<{ id: string; expanded: boolean }>;\r\n const { id, expanded } = customEvent.detail;\r\n\r\n if (expanded) {\r\n if (this.multiple) {\r\n this.expandedItems = [...this.expandedItems, id];\r\n } else {\r\n // Close other items when not in multiple mode\r\n this.expandedItems = [id];\r\n }\r\n this.dispatchEvent(\r\n new CustomEvent('bp-expand', {\r\n detail: { id },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n } else {\r\n this.expandedItems = this.expandedItems.filter((itemId) => itemId !== id);\r\n this.dispatchEvent(\r\n new CustomEvent('bp-collapse', {\r\n detail: { id },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n this.updateChildItems();\r\n };\r\n\r\n /**\r\n * Synchronizes child accordion items with the expandedItems state.\r\n * Also applies disabled state to all items when accordion is disabled.\r\n */\r\n private updateChildItems() {\r\n const items = this.querySelectorAll('bp-accordion-item');\r\n items.forEach((item) => {\r\n const accordionItem = item as BpAccordionItem;\r\n const isExpanded = this.expandedItems.includes(accordionItem.itemId);\r\n accordionItem.expanded = isExpanded;\r\n if (this.disabled) {\r\n accordionItem.disabled = true;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Initializes expandedItems array from children with expanded attribute.\r\n * Called on first render to respect items marked as expanded in HTML.\r\n */\r\n private initializeExpandedItems() {\r\n const items = this.querySelectorAll('bp-accordion-item');\r\n const expandedIds: string[] = [];\r\n\r\n items.forEach((item) => {\r\n const accordionItem = item as BpAccordionItem;\r\n if (accordionItem.expanded && accordionItem.itemId) {\r\n expandedIds.push(accordionItem.itemId);\r\n }\r\n });\r\n\r\n if (expandedIds.length > 0) {\r\n // In single mode, only keep the first expanded item\r\n this.expandedItems = this.multiple ? expandedIds : [expandedIds[0]];\r\n }\r\n }\r\n\r\n firstUpdated(): void {\r\n // Initialize expanded items from children on first render\r\n this.initializeExpandedItems();\r\n this.updateChildItems();\r\n }\r\n\r\n updated(changedProperties: Map<string, unknown>): void {\r\n if (\r\n changedProperties.has('expandedItems') ||\r\n changedProperties.has('disabled')\r\n ) {\r\n this.updateChildItems();\r\n }\r\n }\r\n\r\n /** Expand an item by ID */\r\n expand(id: string) {\r\n if (!this.expandedItems.includes(id)) {\r\n if (this.multiple) {\r\n this.expandedItems = [...this.expandedItems, id];\r\n } else {\r\n this.expandedItems = [id];\r\n }\r\n this.updateChildItems();\r\n this.dispatchEvent(\r\n new CustomEvent('bp-expand', {\r\n detail: { id },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n }\r\n\r\n /** Collapse an item by ID */\r\n collapse(id: string) {\r\n if (this.expandedItems.includes(id)) {\r\n this.expandedItems = this.expandedItems.filter((itemId) => itemId !== id);\r\n this.updateChildItems();\r\n this.dispatchEvent(\r\n new CustomEvent('bp-collapse', {\r\n detail: { id },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n }\r\n\r\n /** Expand all items (only works in multiple mode) */\r\n expandAll() {\r\n if (!this.multiple) return;\r\n const items = this.querySelectorAll('bp-accordion-item');\r\n const ids: string[] = [];\r\n items.forEach((item) => {\r\n const accordionItem = item as BpAccordionItem;\r\n if (!accordionItem.disabled) {\r\n ids.push(accordionItem.itemId);\r\n }\r\n });\r\n this.expandedItems = ids;\r\n this.updateChildItems();\r\n }\r\n\r\n /** Collapse all items */\r\n collapseAll() {\r\n this.expandedItems = [];\r\n this.updateChildItems();\r\n }\r\n\r\n /**\r\n * Handles slot changes - when children are added or removed.\r\n * Initializes expanded state from new children.\r\n */\r\n private handleSlotChange() {\r\n // Only initialize from children if expandedItems is empty\r\n // Otherwise respect the parent's state\r\n if (this.expandedItems.length === 0) {\r\n this.initializeExpandedItems();\r\n }\r\n this.updateChildItems();\r\n }\r\n\r\n render() {\r\n const classes = {\r\n accordion: true,\r\n 'accordion--disabled': this.disabled,\r\n };\r\n\r\n return html`\r\n <div class=${classMap(classes)} part=\"accordion\" role=\"presentation\">\r\n <slot @slotchange=${this.handleSlotChange}></slot>\r\n </div>\r\n `;\r\n }\r\n}\r\n\r\n/**\r\n * An individual accordion item with header and collapsible content.\r\n *\r\n * @element bp-accordion-item\r\n *\r\n * @property {string} itemId - Unique identifier for this item\r\n * @property {string} header - Header text displayed in the trigger button\r\n * @property {boolean} expanded - Whether the content is expanded\r\n * @property {boolean} disabled - Whether this item is disabled\r\n *\r\n * @slot - Default slot for the collapsible content\r\n * @slot header - Custom header content (overrides header property)\r\n * @slot icon - Custom icon for the header\r\n *\r\n * @csspart item - The accordion item container\r\n * @csspart header - The header/trigger button\r\n * @csspart icon - The expand/collapse icon\r\n * @csspart content - The collapsible content wrapper\r\n * @csspart body - The inner content container\r\n */\r\n@customElement('bp-accordion-item')\r\nexport class BpAccordionItem extends LitElement {\r\n /** Unique identifier for this item */\r\n @property({ type: String, attribute: 'item-id', reflect: true })\r\n declare itemId: string;\r\n\r\n /** Header text displayed in the trigger button */\r\n @property({ type: String }) declare header: string;\r\n\r\n /** Whether the content is expanded */\r\n @property({ type: Boolean, reflect: true }) declare expanded: boolean;\r\n\r\n /** Whether this item is disabled */\r\n @property({ type: Boolean, reflect: true }) declare disabled: boolean;\r\n\r\n static styles = [accordionStyles];\r\n\r\n constructor() {\r\n super();\r\n this.itemId = '';\r\n this.header = '';\r\n this.expanded = false;\r\n this.disabled = false;\r\n }\r\n\r\n connectedCallback(): void {\r\n super.connectedCallback();\r\n // Generate ID if not provided\r\n if (!this.itemId) {\r\n this.itemId = `accordion-item-${Math.random().toString(36).slice(2, 9)}`;\r\n }\r\n }\r\n\r\n /**\r\n * Handles toggle action and dispatches bp-item-toggle event.\r\n * Also manages focus on the header button after expansion.\r\n */\r\n private handleToggle() {\r\n if (this.disabled) return;\r\n\r\n this.dispatchEvent(\r\n new CustomEvent('bp-item-toggle', {\r\n detail: { id: this.itemId, expanded: !this.expanded },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n\r\n // Focus management: focus header after toggle completes\r\n this.updateComplete.then(() => {\r\n const header = this.shadowRoot?.querySelector(\r\n '.item__header'\r\n ) as HTMLElement;\r\n header?.focus();\r\n });\r\n }\r\n\r\n /**\r\n * Handles keyboard navigation.\r\n * Triggers toggle on Enter or Space key press.\r\n */\r\n private handleKeyDown(event: KeyboardEvent) {\r\n if (this.disabled) return;\r\n\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n this.handleToggle();\r\n }\r\n }\r\n\r\n render() {\r\n const itemClasses = {\r\n item: true,\r\n 'item--expanded': this.expanded,\r\n 'item--disabled': this.disabled,\r\n };\r\n\r\n const headerId = `${this.itemId}-header`;\r\n const contentId = `${this.itemId}-content`;\r\n\r\n return html`\r\n <div class=${classMap(itemClasses)} part=\"item\">\r\n <button\r\n class=\"item__header\"\r\n part=\"header\"\r\n id=${headerId}\r\n aria-expanded=${this.expanded}\r\n aria-controls=${contentId}\r\n aria-disabled=${this.disabled}\r\n ?disabled=${this.disabled}\r\n @click=${this.handleToggle}\r\n @keydown=${this.handleKeyDown}\r\n >\r\n <span class=\"item__header-content\">\r\n <slot name=\"icon\"></slot>\r\n <slot name=\"header\">${this.header}</slot>\r\n </span>\r\n <span class=\"item__icon\" part=\"icon\" aria-hidden=\"true\">\r\n <bp-icon name=\"chevron-down\" size=\"md\"></bp-icon>\r\n </span>\r\n </button>\r\n <div\r\n class=\"item__content\"\r\n part=\"content\"\r\n id=${contentId}\r\n role=\"region\"\r\n aria-labelledby=${headerId}\r\n >\r\n <div class=\"item__body\" part=\"body\">\r\n <slot></slot>\r\n </div>\r\n </div>\r\n </div>\r\n `;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'bp-accordion': BpAccordion;\r\n 'bp-accordion-item': BpAccordionItem;\r\n }\r\n}\r\n"],"names":["accordionStyles","css","BpAccordion","LitElement","event","customEvent","id","expanded","itemId","item","accordionItem","isExpanded","items","expandedIds","changedProperties","ids","classes","html","classMap","__decorateClass","property","customElement","BpAccordionItem","itemClasses","headerId","contentId"],"mappings":"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"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { css as b, LitElement as d, html as c } from "lit";
|
|
2
|
+
import { property as p, customElement as v } from "lit/decorators.js";
|
|
3
|
+
const f = b`
|
|
4
|
+
/* Base styles */
|
|
5
|
+
:host {
|
|
6
|
+
display: block;
|
|
7
|
+
animation: slideIn var(--bp-transition-base) ease-out;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
@keyframes slideIn {
|
|
11
|
+
from {
|
|
12
|
+
opacity: 0;
|
|
13
|
+
transform: translateY(calc(-1 * var(--bp-spacing-md)));
|
|
14
|
+
}
|
|
15
|
+
to {
|
|
16
|
+
opacity: 1;
|
|
17
|
+
transform: translateY(0);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.alert {
|
|
22
|
+
position: relative;
|
|
23
|
+
display: flex;
|
|
24
|
+
align-items: flex-start;
|
|
25
|
+
gap: var(--bp-spacing-md);
|
|
26
|
+
padding: var(--bp-spacing-sm) var(--bp-spacing-md);
|
|
27
|
+
font-family: var(--bp-font-family);
|
|
28
|
+
font-size: var(--bp-font-size-base);
|
|
29
|
+
line-height: var(--bp-line-height-relaxed);
|
|
30
|
+
border-radius: var(--bp-border-radius-md);
|
|
31
|
+
border-width: var(--bp-border-width);
|
|
32
|
+
border-style: solid;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
@media (min-width: var(--bp-breakpoint-sm)) {
|
|
36
|
+
.alert {
|
|
37
|
+
padding: var(--bp-spacing-md) var(--bp-spacing-lg);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.alert-content {
|
|
42
|
+
display: flex;
|
|
43
|
+
align-items: flex-start;
|
|
44
|
+
gap: var(--bp-spacing-md);
|
|
45
|
+
flex: 1;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.alert-icon {
|
|
49
|
+
display: flex;
|
|
50
|
+
align-items: flex-start;
|
|
51
|
+
padding-top: var(--bp-spacing-0-5);
|
|
52
|
+
flex-shrink: 0;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.alert-icon svg {
|
|
56
|
+
width: var(--bp-spacing-5);
|
|
57
|
+
height: var(--bp-spacing-5);
|
|
58
|
+
flex-shrink: 0;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.alert-message {
|
|
62
|
+
flex: 1;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
::slotted([slot='title']) {
|
|
66
|
+
display: block;
|
|
67
|
+
font-weight: var(--bp-font-weight-semibold);
|
|
68
|
+
line-height: var(--bp-line-height-tight);
|
|
69
|
+
margin-bottom: var(--bp-spacing-xs);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.alert-close {
|
|
73
|
+
display: flex;
|
|
74
|
+
align-items: center;
|
|
75
|
+
justify-content: center;
|
|
76
|
+
background: none;
|
|
77
|
+
border: none;
|
|
78
|
+
cursor: pointer;
|
|
79
|
+
padding: var(--bp-spacing-2xs);
|
|
80
|
+
border-radius: var(--bp-border-radius-sm);
|
|
81
|
+
color: inherit;
|
|
82
|
+
opacity: 0.8;
|
|
83
|
+
transition: all var(--bp-transition-fast);
|
|
84
|
+
flex-shrink: 0;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.alert-close:hover {
|
|
88
|
+
opacity: 1;
|
|
89
|
+
background-color: currentColor;
|
|
90
|
+
opacity: 0.1;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.alert-close:active {
|
|
94
|
+
opacity: 0.15;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.alert-close:focus-visible {
|
|
98
|
+
outline: var(--bp-focus-ring);
|
|
99
|
+
outline-offset: var(--bp-focus-offset);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/* Variants */
|
|
103
|
+
.alert--info {
|
|
104
|
+
background-color: var(--bp-color-surface-elevated);
|
|
105
|
+
border-color: var(--bp-color-info);
|
|
106
|
+
border-left-width: var(--bp-spacing-1);
|
|
107
|
+
color: var(--bp-color-text);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.alert--success {
|
|
111
|
+
background-color: var(--bp-color-surface-elevated);
|
|
112
|
+
border-color: var(--bp-color-success);
|
|
113
|
+
border-left-width: var(--bp-spacing-1);
|
|
114
|
+
color: var(--bp-color-text);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.alert--warning {
|
|
118
|
+
background-color: var(--bp-color-surface-elevated);
|
|
119
|
+
border-color: var(--bp-color-warning);
|
|
120
|
+
border-left-width: var(--bp-spacing-1);
|
|
121
|
+
color: var(--bp-color-text);
|
|
122
|
+
box-shadow: var(--bp-shadow-sm);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.alert--error {
|
|
126
|
+
background-color: var(--bp-color-surface-elevated);
|
|
127
|
+
border-color: var(--bp-color-error);
|
|
128
|
+
border-left-width: var(--bp-spacing-1);
|
|
129
|
+
color: var(--bp-color-text);
|
|
130
|
+
box-shadow: var(--bp-shadow-sm);
|
|
131
|
+
}
|
|
132
|
+
`;
|
|
133
|
+
var g = Object.defineProperty, h = Object.getOwnPropertyDescriptor, s = (e, a, i, o) => {
|
|
134
|
+
for (var r = o > 1 ? void 0 : o ? h(a, i) : a, l = e.length - 1, n; l >= 0; l--)
|
|
135
|
+
(n = e[l]) && (r = (o ? n(a, i, r) : n(r)) || r);
|
|
136
|
+
return o && r && g(a, i, r), r;
|
|
137
|
+
};
|
|
138
|
+
let t = class extends d {
|
|
139
|
+
constructor() {
|
|
140
|
+
super(), this.variant = "info", this.dismissible = !1, this.showIcon = !1;
|
|
141
|
+
}
|
|
142
|
+
handleClose() {
|
|
143
|
+
const e = new CustomEvent("bp-close", {
|
|
144
|
+
detail: {
|
|
145
|
+
variant: this.variant,
|
|
146
|
+
timestamp: Date.now()
|
|
147
|
+
},
|
|
148
|
+
bubbles: !0,
|
|
149
|
+
composed: !0,
|
|
150
|
+
cancelable: !0
|
|
151
|
+
});
|
|
152
|
+
this.dispatchEvent(e), e.defaultPrevented || this.remove();
|
|
153
|
+
}
|
|
154
|
+
getIconName() {
|
|
155
|
+
return {
|
|
156
|
+
info: "info-circle",
|
|
157
|
+
success: "check-circle",
|
|
158
|
+
warning: "warning-circle",
|
|
159
|
+
error: "cross-circle"
|
|
160
|
+
}[this.variant];
|
|
161
|
+
}
|
|
162
|
+
render() {
|
|
163
|
+
return c`
|
|
164
|
+
<div
|
|
165
|
+
class="alert alert--${this.variant}"
|
|
166
|
+
part="alert"
|
|
167
|
+
role="alert"
|
|
168
|
+
aria-live="polite"
|
|
169
|
+
>
|
|
170
|
+
<div class="alert-content">
|
|
171
|
+
${this.showIcon ? c`
|
|
172
|
+
<div class="alert-icon" part="icon">
|
|
173
|
+
<slot name="icon">
|
|
174
|
+
<bp-icon name=${this.getIconName()}></bp-icon>
|
|
175
|
+
</slot>
|
|
176
|
+
</div>
|
|
177
|
+
` : null}
|
|
178
|
+
<div class="alert-message" part="message">
|
|
179
|
+
<slot name="title"></slot>
|
|
180
|
+
<slot></slot>
|
|
181
|
+
</div>
|
|
182
|
+
</div>
|
|
183
|
+
${this.dismissible ? c`
|
|
184
|
+
<button
|
|
185
|
+
class="alert-close"
|
|
186
|
+
part="close-button"
|
|
187
|
+
@click=${this.handleClose}
|
|
188
|
+
aria-label="Close alert"
|
|
189
|
+
>
|
|
190
|
+
<bp-icon name="cross"></bp-icon>
|
|
191
|
+
</button>
|
|
192
|
+
` : null}
|
|
193
|
+
</div>
|
|
194
|
+
`;
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
t.styles = [f];
|
|
198
|
+
s([
|
|
199
|
+
p({ type: String, reflect: !0 })
|
|
200
|
+
], t.prototype, "variant", 2);
|
|
201
|
+
s([
|
|
202
|
+
p({ type: Boolean, reflect: !0 })
|
|
203
|
+
], t.prototype, "dismissible", 2);
|
|
204
|
+
s([
|
|
205
|
+
p({ type: Boolean, reflect: !0 })
|
|
206
|
+
], t.prototype, "showIcon", 2);
|
|
207
|
+
t = s([
|
|
208
|
+
v("bp-alert")
|
|
209
|
+
], t);
|
|
210
|
+
export {
|
|
211
|
+
t as BpAlert
|
|
212
|
+
};
|
|
213
|
+
//# sourceMappingURL=alert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert.js","sources":["../../source/components/alert/alert.style.ts","../../source/components/alert/alert.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const alertStyles = css`\n /* Base styles */\n :host {\n display: block;\n animation: slideIn var(--bp-transition-base) ease-out;\n }\n\n @keyframes slideIn {\n from {\n opacity: 0;\n transform: translateY(calc(-1 * var(--bp-spacing-md)));\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n .alert {\n position: relative;\n display: flex;\n align-items: flex-start;\n gap: var(--bp-spacing-md);\n padding: var(--bp-spacing-sm) var(--bp-spacing-md);\n font-family: var(--bp-font-family);\n font-size: var(--bp-font-size-base);\n line-height: var(--bp-line-height-relaxed);\n border-radius: var(--bp-border-radius-md);\n border-width: var(--bp-border-width);\n border-style: solid;\n }\n\n @media (min-width: var(--bp-breakpoint-sm)) {\n .alert {\n padding: var(--bp-spacing-md) var(--bp-spacing-lg);\n }\n }\n\n .alert-content {\n display: flex;\n align-items: flex-start;\n gap: var(--bp-spacing-md);\n flex: 1;\n }\n\n .alert-icon {\n display: flex;\n align-items: flex-start;\n padding-top: var(--bp-spacing-0-5);\n flex-shrink: 0;\n }\n\n .alert-icon svg {\n width: var(--bp-spacing-5);\n height: var(--bp-spacing-5);\n flex-shrink: 0;\n }\n\n .alert-message {\n flex: 1;\n }\n\n ::slotted([slot='title']) {\n display: block;\n font-weight: var(--bp-font-weight-semibold);\n line-height: var(--bp-line-height-tight);\n margin-bottom: var(--bp-spacing-xs);\n }\n\n .alert-close {\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n cursor: pointer;\n padding: var(--bp-spacing-2xs);\n border-radius: var(--bp-border-radius-sm);\n color: inherit;\n opacity: 0.8;\n transition: all var(--bp-transition-fast);\n flex-shrink: 0;\n }\n\n .alert-close:hover {\n opacity: 1;\n background-color: currentColor;\n opacity: 0.1;\n }\n\n .alert-close:active {\n opacity: 0.15;\n }\n\n .alert-close:focus-visible {\n outline: var(--bp-focus-ring);\n outline-offset: var(--bp-focus-offset);\n }\n\n /* Variants */\n .alert--info {\n background-color: var(--bp-color-surface-elevated);\n border-color: var(--bp-color-info);\n border-left-width: var(--bp-spacing-1);\n color: var(--bp-color-text);\n }\n\n .alert--success {\n background-color: var(--bp-color-surface-elevated);\n border-color: var(--bp-color-success);\n border-left-width: var(--bp-spacing-1);\n color: var(--bp-color-text);\n }\n\n .alert--warning {\n background-color: var(--bp-color-surface-elevated);\n border-color: var(--bp-color-warning);\n border-left-width: var(--bp-spacing-1);\n color: var(--bp-color-text);\n box-shadow: var(--bp-shadow-sm);\n }\n\n .alert--error {\n background-color: var(--bp-color-surface-elevated);\n border-color: var(--bp-color-error);\n border-left-width: var(--bp-spacing-1);\n color: var(--bp-color-text);\n box-shadow: var(--bp-shadow-sm);\n }\n`;\n","import { LitElement, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { alertStyles } from './alert.style.js';\nimport { type IconName } from '../icon/icons/registry.generated.js';\nimport '../icon/icon.js';\n\nexport type AlertVariant = 'info' | 'success' | 'warning' | 'error';\ninterface IconMap {\n info: IconName;\n success: IconName;\n warning: IconName;\n error: IconName;\n}\n\n/**\n * An alert component for displaying notification messages to users.\n *\n * @slot - Message content\n * @slot title - Optional title/heading for the alert\n * @slot icon - Optional custom icon (replaces default icon)\n *\n * @fires bp-close - Fired when the alert is dismissed (cancelable)\n */\n@customElement('bp-alert')\nexport class BpAlert extends LitElement {\n /**\n * Visual variant indicating the type of alert\n */\n @property({ type: String, reflect: true }) declare variant: AlertVariant;\n\n /**\n * Whether the alert can be dismissed by the user\n */\n @property({ type: Boolean, reflect: true }) declare dismissible: boolean;\n\n /**\n * Whether to show a default icon for the variant\n */\n @property({ type: Boolean, reflect: true }) declare showIcon: boolean;\n\n static styles = [alertStyles];\n\n constructor() {\n super();\n this.variant = 'info';\n this.dismissible = false;\n this.showIcon = false;\n }\n\n private handleClose() {\n const event = new CustomEvent('bp-close', {\n detail: {\n variant: this.variant,\n timestamp: Date.now(),\n },\n bubbles: true,\n composed: true,\n cancelable: true,\n });\n\n this.dispatchEvent(event);\n\n // Only remove if event wasn't prevented\n if (!event.defaultPrevented) {\n this.remove();\n }\n }\n\n private getIconName(): IconName {\n const iconMap: IconMap = {\n info: 'info-circle',\n success: 'check-circle',\n warning: 'warning-circle',\n error: 'cross-circle',\n };\n return iconMap[this.variant];\n }\n\n render() {\n return html`\n <div\n class=\"alert alert--${this.variant}\"\n part=\"alert\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n <div class=\"alert-content\">\n ${this.showIcon\n ? html`\n <div class=\"alert-icon\" part=\"icon\">\n <slot name=\"icon\">\n <bp-icon name=${this.getIconName()}></bp-icon>\n </slot>\n </div>\n `\n : null}\n <div class=\"alert-message\" part=\"message\">\n <slot name=\"title\"></slot>\n <slot></slot>\n </div>\n </div>\n ${this.dismissible\n ? html`\n <button\n class=\"alert-close\"\n part=\"close-button\"\n @click=${this.handleClose}\n aria-label=\"Close alert\"\n >\n <bp-icon name=\"cross\"></bp-icon>\n </button>\n `\n : null}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'bp-alert': BpAlert;\n }\n}\n"],"names":["alertStyles","css","BpAlert","LitElement","event","html","__decorateClass","property","customElement"],"mappings":";;AAEO,MAAMA,IAAcC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;ACsBpB,IAAMC,IAAN,cAAsBC,EAAW;AAAA,EAkBtC,cAAc;AACZ,UAAA,GACA,KAAK,UAAU,QACf,KAAK,cAAc,IACnB,KAAK,WAAW;AAAA,EAClB;AAAA,EAEQ,cAAc;AACpB,UAAMC,IAAQ,IAAI,YAAY,YAAY;AAAA,MACxC,QAAQ;AAAA,QACN,SAAS,KAAK;AAAA,QACd,WAAW,KAAK,IAAA;AAAA,MAAI;AAAA,MAEtB,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAY;AAAA,IAAA,CACb;AAED,SAAK,cAAcA,CAAK,GAGnBA,EAAM,oBACT,KAAK,OAAA;AAAA,EAET;AAAA,EAEQ,cAAwB;AAO9B,WANyB;AAAA,MACvB,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,IAAA,EAEM,KAAK,OAAO;AAAA,EAC7B;AAAA,EAEA,SAAS;AACP,WAAOC;AAAA;AAAA,8BAEmB,KAAK,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAM9B,KAAK,WACHA;AAAA;AAAA;AAAA,oCAGsB,KAAK,aAAa;AAAA;AAAA;AAAA,kBAIxC,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAMR,KAAK,cACHA;AAAA;AAAA;AAAA;AAAA,yBAIa,KAAK,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,gBAM7B,IAAI;AAAA;AAAA;AAAA,EAGd;AACF;AA5FaH,EAgBJ,SAAS,CAACF,CAAW;AAZuBM,EAAA;AAAA,EAAlDC,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GAJ9BL,EAIwC,WAAA,WAAA,CAAA;AAKCI,EAAA;AAAA,EAAnDC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GAT/BL,EASyC,WAAA,eAAA,CAAA;AAKAI,EAAA;AAAA,EAAnDC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GAd/BL,EAcyC,WAAA,YAAA,CAAA;AAdzCA,IAANI,EAAA;AAAA,EADNE,EAAc,UAAU;AAAA,GACZN,CAAA;"}
|