@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.
- 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 +49 -3
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
import { css as y, LitElement as d, html as s, nothing as h } from "lit";
|
|
2
|
+
import { property as p, customElement as f } from "lit/decorators.js";
|
|
3
|
+
import { classMap as b } from "lit/directives/class-map.js";
|
|
4
|
+
import { repeat as u } from "lit/directives/repeat.js";
|
|
5
|
+
import { ifDefined as v } from "lit/directives/if-defined.js";
|
|
6
|
+
const g = y`
|
|
7
|
+
/* Base styles */
|
|
8
|
+
:host {
|
|
9
|
+
display: block;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/* Separator variants - set custom properties on host to cross shadow boundaries */
|
|
13
|
+
:host([separator='slash']) {
|
|
14
|
+
--bp-breadcrumb-separator-content: '/';
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
:host([separator='chevron']) {
|
|
18
|
+
--bp-breadcrumb-separator-content: '›';
|
|
19
|
+
--bp-breadcrumb-separator-size: 1.2em;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
:host([separator='arrow']) {
|
|
23
|
+
--bp-breadcrumb-separator-content: '→';
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
:host([separator='dot']) {
|
|
27
|
+
--bp-breadcrumb-separator-content: '•';
|
|
28
|
+
--bp-breadcrumb-separator-size: var(--bp-font-size-lg);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/* Size variants - set custom properties on host to cross shadow boundaries */
|
|
32
|
+
:host([size='sm']) {
|
|
33
|
+
--bp-breadcrumb-font-size: var(--bp-font-size-sm);
|
|
34
|
+
--bp-breadcrumb-line-height: var(--bp-line-height-tight);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
:host([size='md']) {
|
|
38
|
+
--bp-breadcrumb-font-size: var(--bp-font-size-base);
|
|
39
|
+
--bp-breadcrumb-line-height: var(--bp-line-height-normal);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
:host([size='lg']) {
|
|
43
|
+
--bp-breadcrumb-font-size: var(--bp-font-size-lg);
|
|
44
|
+
--bp-breadcrumb-line-height: var(--bp-line-height-normal);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.breadcrumb {
|
|
48
|
+
font-family: var(--bp-font-family);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.list {
|
|
52
|
+
display: flex;
|
|
53
|
+
flex-wrap: wrap;
|
|
54
|
+
align-items: center;
|
|
55
|
+
list-style: none;
|
|
56
|
+
margin: 0;
|
|
57
|
+
padding: 0;
|
|
58
|
+
gap: 0;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.item {
|
|
62
|
+
display: inline-flex;
|
|
63
|
+
align-items: center;
|
|
64
|
+
gap: 0;
|
|
65
|
+
font-size: var(--bp-breadcrumb-font-size, var(--bp-font-size-base));
|
|
66
|
+
line-height: var(--bp-breadcrumb-line-height, var(--bp-line-height-normal));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.item__icon {
|
|
70
|
+
flex-shrink: 0;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.item__label {
|
|
74
|
+
white-space: nowrap;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/* Link styles */
|
|
78
|
+
.link {
|
|
79
|
+
display: inline-flex;
|
|
80
|
+
align-items: center;
|
|
81
|
+
gap: var(--bp-spacing-xs);
|
|
82
|
+
color: var(--bp-color-text-muted);
|
|
83
|
+
text-decoration: none;
|
|
84
|
+
transition: color var(--bp-transition-fast);
|
|
85
|
+
outline: none;
|
|
86
|
+
border-radius: var(--bp-border-radius);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.link:hover {
|
|
90
|
+
color: var(--bp-color-primary);
|
|
91
|
+
text-decoration: underline;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.link:active {
|
|
95
|
+
transform: translateY(1px);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.link:focus-visible {
|
|
99
|
+
outline: var(--bp-focus-width) var(--bp-focus-style) var(--bp-color-focus);
|
|
100
|
+
outline-offset: var(--bp-focus-offset);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/* Text (non-link) styles */
|
|
104
|
+
.text {
|
|
105
|
+
display: inline-flex;
|
|
106
|
+
align-items: center;
|
|
107
|
+
gap: var(--bp-spacing-xs);
|
|
108
|
+
color: var(--bp-color-text);
|
|
109
|
+
font-weight: var(--bp-font-weight-medium);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/* Current item */
|
|
113
|
+
.item--current .text {
|
|
114
|
+
color: var(--bp-color-text);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/* Separator styles */
|
|
118
|
+
.separator {
|
|
119
|
+
display: inline-flex;
|
|
120
|
+
align-items: center;
|
|
121
|
+
color: var(--bp-color-text-muted);
|
|
122
|
+
margin: 0 var(--bp-spacing-2xs);
|
|
123
|
+
user-select: none;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/* Hide separator on last item */
|
|
127
|
+
:host(:last-of-type) .separator {
|
|
128
|
+
display: none;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/* Separator content via ::before - uses custom properties from parent */
|
|
132
|
+
.separator::before {
|
|
133
|
+
content: var(--bp-breadcrumb-separator-content, '/');
|
|
134
|
+
font-size: var(--bp-breadcrumb-separator-size, inherit);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.separator__icon {
|
|
138
|
+
width: var(--bp-spacing-md);
|
|
139
|
+
height: var(--bp-spacing-md);
|
|
140
|
+
display: inline-flex;
|
|
141
|
+
align-items: center;
|
|
142
|
+
justify-content: center;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
.separator__icon--dot {
|
|
146
|
+
font-size: var(--bp-font-size-lg);
|
|
147
|
+
line-height: 1;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/* Ellipsis button */
|
|
151
|
+
.ellipsis-button {
|
|
152
|
+
appearance: none;
|
|
153
|
+
border: none;
|
|
154
|
+
background: transparent;
|
|
155
|
+
padding: var(--bp-spacing-xs);
|
|
156
|
+
margin: calc(-1 * var(--bp-spacing-xs));
|
|
157
|
+
cursor: pointer;
|
|
158
|
+
color: var(--bp-color-text-muted);
|
|
159
|
+
border-radius: var(--bp-border-radius);
|
|
160
|
+
transition: all var(--bp-transition-fast);
|
|
161
|
+
outline: none;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
.ellipsis-button:hover {
|
|
165
|
+
color: var(--bp-color-primary);
|
|
166
|
+
background: var(--bp-color-surface);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
.ellipsis-button:active {
|
|
170
|
+
transform: scale(0.95);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.ellipsis-button:focus-visible {
|
|
174
|
+
outline: var(--bp-focus-width) var(--bp-focus-style) var(--bp-color-focus);
|
|
175
|
+
outline-offset: var(--bp-focus-offset);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
.ellipsis-dots {
|
|
179
|
+
font-size: var(--bp-font-size-base);
|
|
180
|
+
letter-spacing: var(--bp-spacing-0-5);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/* Sizes */
|
|
184
|
+
.breadcrumb--sm {
|
|
185
|
+
font-size: var(--bp-font-size-sm);
|
|
186
|
+
line-height: var(--bp-line-height-tight);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
.breadcrumb--sm .separator__icon {
|
|
190
|
+
width: var(--bp-spacing-sm);
|
|
191
|
+
height: var(--bp-spacing-sm);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
.breadcrumb--md {
|
|
195
|
+
font-size: var(--bp-font-size-base);
|
|
196
|
+
line-height: var(--bp-line-height-normal);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
.breadcrumb--md .separator__icon {
|
|
200
|
+
width: var(--bp-spacing-md);
|
|
201
|
+
height: var(--bp-spacing-md);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
.breadcrumb--lg {
|
|
205
|
+
font-size: var(--bp-font-size-lg);
|
|
206
|
+
line-height: var(--bp-line-height-normal);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
.breadcrumb--lg .separator__icon {
|
|
210
|
+
width: var(--bp-spacing-lg);
|
|
211
|
+
height: var(--bp-spacing-lg);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/* Separator variants */
|
|
215
|
+
.breadcrumb--slash .separator__icon {
|
|
216
|
+
font-size: inherit;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
.breadcrumb--dot .separator__icon {
|
|
220
|
+
font-size: inherit;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/* Item ellipsis */
|
|
224
|
+
.item--ellipsis {
|
|
225
|
+
display: inline-flex;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/* Collapse on mobile - handled via maxItems property instead of CSS */
|
|
229
|
+
.breadcrumb--collapse-mobile {
|
|
230
|
+
/* Reserved for future container query support */
|
|
231
|
+
}
|
|
232
|
+
`;
|
|
233
|
+
var _ = Object.defineProperty, x = Object.getOwnPropertyDescriptor, n = (e, t, a, o) => {
|
|
234
|
+
for (var i = o > 1 ? void 0 : o ? x(t, a) : t, r = e.length - 1, m; r >= 0; r--)
|
|
235
|
+
(m = e[r]) && (i = (o ? m(t, a, i) : m(i)) || i);
|
|
236
|
+
return o && i && _(t, a, i), i;
|
|
237
|
+
};
|
|
238
|
+
let l = class extends d {
|
|
239
|
+
constructor() {
|
|
240
|
+
super(), this.items = [], this.size = "md", this.separator = "slash", this.ariaLabel = "Breadcrumb", this.collapseOnMobile = !1, this.maxItems = 0;
|
|
241
|
+
}
|
|
242
|
+
handleItemClick(e, t, a) {
|
|
243
|
+
this.dispatchEvent(
|
|
244
|
+
new CustomEvent("bp-breadcrumb-click", {
|
|
245
|
+
detail: { item: t, index: a },
|
|
246
|
+
bubbles: !0,
|
|
247
|
+
composed: !0
|
|
248
|
+
})
|
|
249
|
+
);
|
|
250
|
+
}
|
|
251
|
+
handleKeyDown(e, t, a) {
|
|
252
|
+
(e.key === "Enter" || e.key === " ") && (t.href || e.preventDefault(), this.dispatchEvent(
|
|
253
|
+
new CustomEvent("bp-breadcrumb-click", {
|
|
254
|
+
detail: { item: t, index: a },
|
|
255
|
+
bubbles: !0,
|
|
256
|
+
composed: !0
|
|
257
|
+
})
|
|
258
|
+
));
|
|
259
|
+
}
|
|
260
|
+
renderSeparator() {
|
|
261
|
+
const e = {
|
|
262
|
+
slash: s`<span class="separator__icon">/</span>`,
|
|
263
|
+
chevron: s`
|
|
264
|
+
<svg
|
|
265
|
+
class="separator__icon"
|
|
266
|
+
viewBox="0 0 24 24"
|
|
267
|
+
fill="none"
|
|
268
|
+
stroke="currentColor"
|
|
269
|
+
stroke-width="2"
|
|
270
|
+
>
|
|
271
|
+
<path d="M9 18l6-6-6-6" />
|
|
272
|
+
</svg>
|
|
273
|
+
`,
|
|
274
|
+
arrow: s`
|
|
275
|
+
<svg
|
|
276
|
+
class="separator__icon"
|
|
277
|
+
viewBox="0 0 24 24"
|
|
278
|
+
fill="none"
|
|
279
|
+
stroke="currentColor"
|
|
280
|
+
stroke-width="2"
|
|
281
|
+
>
|
|
282
|
+
<path d="M5 12h14M12 5l7 7-7 7" />
|
|
283
|
+
</svg>
|
|
284
|
+
`,
|
|
285
|
+
dot: s`<span class="separator__icon separator__icon--dot">•</span>`
|
|
286
|
+
};
|
|
287
|
+
return s`
|
|
288
|
+
<span class="separator" part="separator" aria-hidden="true">
|
|
289
|
+
<slot name="separator">${e[this.separator]}</slot>
|
|
290
|
+
</span>
|
|
291
|
+
`;
|
|
292
|
+
}
|
|
293
|
+
renderItem(e, t, a) {
|
|
294
|
+
const o = e.current || a;
|
|
295
|
+
return s`
|
|
296
|
+
<li
|
|
297
|
+
class=${b({
|
|
298
|
+
item: !0,
|
|
299
|
+
"item--current": o
|
|
300
|
+
})}
|
|
301
|
+
part="item ${o ? "item-current" : ""}"
|
|
302
|
+
>
|
|
303
|
+
${e.href && !o ? s`
|
|
304
|
+
<a
|
|
305
|
+
class="link"
|
|
306
|
+
part="link"
|
|
307
|
+
href=${e.href}
|
|
308
|
+
@click=${(r) => this.handleItemClick(r, e, t)}
|
|
309
|
+
@keydown=${(r) => this.handleKeyDown(r, e, t)}
|
|
310
|
+
>
|
|
311
|
+
${e.icon ? s`<bp-icon
|
|
312
|
+
name=${e.icon}
|
|
313
|
+
class="item__icon"
|
|
314
|
+
></bp-icon>` : h}
|
|
315
|
+
<span class="item__label">${e.label}</span>
|
|
316
|
+
</a>
|
|
317
|
+
` : s`
|
|
318
|
+
<span
|
|
319
|
+
class="text"
|
|
320
|
+
part="text"
|
|
321
|
+
aria-current=${v(o ? "page" : void 0)}
|
|
322
|
+
>
|
|
323
|
+
${e.icon ? s`<bp-icon
|
|
324
|
+
name=${e.icon}
|
|
325
|
+
class="item__icon"
|
|
326
|
+
></bp-icon>` : h}
|
|
327
|
+
<span class="item__label">${e.label}</span>
|
|
328
|
+
</span>
|
|
329
|
+
`}
|
|
330
|
+
${a ? h : this.renderSeparator()}
|
|
331
|
+
</li>
|
|
332
|
+
`;
|
|
333
|
+
}
|
|
334
|
+
renderEllipsis(e) {
|
|
335
|
+
return s`
|
|
336
|
+
<li class="item item--ellipsis" part="item ellipsis">
|
|
337
|
+
<button
|
|
338
|
+
class="ellipsis-button"
|
|
339
|
+
part="ellipsis-button"
|
|
340
|
+
aria-label="Show ${e} more items"
|
|
341
|
+
title="Show ${e} more items"
|
|
342
|
+
>
|
|
343
|
+
<span class="ellipsis-dots">…</span>
|
|
344
|
+
</button>
|
|
345
|
+
${this.renderSeparator()}
|
|
346
|
+
</li>
|
|
347
|
+
`;
|
|
348
|
+
}
|
|
349
|
+
getVisibleItems() {
|
|
350
|
+
if (this.maxItems <= 0 || this.items.length <= this.maxItems)
|
|
351
|
+
return { items: this.items, hiddenCount: 0, showEllipsis: !1 };
|
|
352
|
+
const e = this.items[0], t = this.items.slice(-(this.maxItems - 1)), a = this.items.length - this.maxItems;
|
|
353
|
+
return {
|
|
354
|
+
items: [e, ...t],
|
|
355
|
+
hiddenCount: a,
|
|
356
|
+
showEllipsis: !0
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
render() {
|
|
360
|
+
const e = {
|
|
361
|
+
breadcrumb: !0,
|
|
362
|
+
[`breadcrumb--${this.size}`]: !0,
|
|
363
|
+
[`breadcrumb--separator-${this.separator}`]: !0,
|
|
364
|
+
"breadcrumb--collapse-mobile": this.collapseOnMobile
|
|
365
|
+
}, {
|
|
366
|
+
items: t,
|
|
367
|
+
hiddenCount: a,
|
|
368
|
+
showEllipsis: o
|
|
369
|
+
} = this.getVisibleItems();
|
|
370
|
+
return this.items.length > 0 ? s`
|
|
371
|
+
<nav
|
|
372
|
+
class=${b(e)}
|
|
373
|
+
part="nav"
|
|
374
|
+
aria-label=${this.ariaLabel}
|
|
375
|
+
>
|
|
376
|
+
<ol class="list" part="list">
|
|
377
|
+
${o ? s`
|
|
378
|
+
${this.renderItem(t[0], 0, !1)}
|
|
379
|
+
${this.renderEllipsis(a)}
|
|
380
|
+
${u(
|
|
381
|
+
t.slice(1),
|
|
382
|
+
(i, r) => r,
|
|
383
|
+
(i, r) => this.renderItem(
|
|
384
|
+
i,
|
|
385
|
+
this.items.length - t.length + 1 + r,
|
|
386
|
+
r === t.length - 2
|
|
387
|
+
)
|
|
388
|
+
)}
|
|
389
|
+
` : u(
|
|
390
|
+
t,
|
|
391
|
+
(i, r) => r,
|
|
392
|
+
(i, r) => this.renderItem(
|
|
393
|
+
i,
|
|
394
|
+
r,
|
|
395
|
+
r === t.length - 1
|
|
396
|
+
)
|
|
397
|
+
)}
|
|
398
|
+
</ol>
|
|
399
|
+
</nav>
|
|
400
|
+
` : s`
|
|
401
|
+
<nav
|
|
402
|
+
class=${b(e)}
|
|
403
|
+
part="nav"
|
|
404
|
+
aria-label=${this.ariaLabel}
|
|
405
|
+
>
|
|
406
|
+
<ol class="list" part="list">
|
|
407
|
+
<slot></slot>
|
|
408
|
+
</ol>
|
|
409
|
+
</nav>
|
|
410
|
+
`;
|
|
411
|
+
}
|
|
412
|
+
};
|
|
413
|
+
l.styles = [g];
|
|
414
|
+
n([
|
|
415
|
+
p({ type: Array })
|
|
416
|
+
], l.prototype, "items", 2);
|
|
417
|
+
n([
|
|
418
|
+
p({ type: String, reflect: !0 })
|
|
419
|
+
], l.prototype, "size", 2);
|
|
420
|
+
n([
|
|
421
|
+
p({ type: String, reflect: !0 })
|
|
422
|
+
], l.prototype, "separator", 2);
|
|
423
|
+
n([
|
|
424
|
+
p({ type: String, attribute: "aria-label" })
|
|
425
|
+
], l.prototype, "ariaLabel", 2);
|
|
426
|
+
n([
|
|
427
|
+
p({ type: Boolean, attribute: "collapse-on-mobile" })
|
|
428
|
+
], l.prototype, "collapseOnMobile", 2);
|
|
429
|
+
n([
|
|
430
|
+
p({ type: Number, attribute: "max-items" })
|
|
431
|
+
], l.prototype, "maxItems", 2);
|
|
432
|
+
l = n([
|
|
433
|
+
f("bp-breadcrumb")
|
|
434
|
+
], l);
|
|
435
|
+
let c = class extends d {
|
|
436
|
+
constructor() {
|
|
437
|
+
super(), this.href = "", this.current = !1;
|
|
438
|
+
}
|
|
439
|
+
render() {
|
|
440
|
+
const e = {
|
|
441
|
+
item: !0,
|
|
442
|
+
"item--current": this.current
|
|
443
|
+
};
|
|
444
|
+
return s`
|
|
445
|
+
<li
|
|
446
|
+
class=${b(e)}
|
|
447
|
+
part="item ${this.current ? "item-current" : ""}"
|
|
448
|
+
>
|
|
449
|
+
${this.href && !this.current ? s`
|
|
450
|
+
<a class="link" part="link" href=${this.href}>
|
|
451
|
+
<slot></slot>
|
|
452
|
+
</a>
|
|
453
|
+
` : s`
|
|
454
|
+
<span
|
|
455
|
+
class="text"
|
|
456
|
+
part="text"
|
|
457
|
+
aria-current=${v(this.current ? "page" : void 0)}
|
|
458
|
+
>
|
|
459
|
+
<slot></slot>
|
|
460
|
+
</span>
|
|
461
|
+
`}
|
|
462
|
+
<span class="separator" part="separator" aria-hidden="true"></span>
|
|
463
|
+
</li>
|
|
464
|
+
`;
|
|
465
|
+
}
|
|
466
|
+
};
|
|
467
|
+
c.styles = [g];
|
|
468
|
+
n([
|
|
469
|
+
p({ type: String })
|
|
470
|
+
], c.prototype, "href", 2);
|
|
471
|
+
n([
|
|
472
|
+
p({ type: Boolean, reflect: !0 })
|
|
473
|
+
], c.prototype, "current", 2);
|
|
474
|
+
c = n([
|
|
475
|
+
f("bp-breadcrumb-item")
|
|
476
|
+
], c);
|
|
477
|
+
export {
|
|
478
|
+
l as BpBreadcrumb,
|
|
479
|
+
c as BpBreadcrumbItem
|
|
480
|
+
};
|
|
481
|
+
//# sourceMappingURL=breadcrumb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"breadcrumb.js","sources":["../../source/components/breadcrumb/breadcrumb.style.ts","../../source/components/breadcrumb/breadcrumb.ts"],"sourcesContent":["import { css } from 'lit';\r\n\r\nexport const breadcrumbStyles = css`\r\n /* Base styles */\r\n :host {\r\n display: block;\r\n }\r\n\r\n /* Separator variants - set custom properties on host to cross shadow boundaries */\r\n :host([separator='slash']) {\r\n --bp-breadcrumb-separator-content: '/';\r\n }\r\n\r\n :host([separator='chevron']) {\r\n --bp-breadcrumb-separator-content: '›';\r\n --bp-breadcrumb-separator-size: 1.2em;\r\n }\r\n\r\n :host([separator='arrow']) {\r\n --bp-breadcrumb-separator-content: '→';\r\n }\r\n\r\n :host([separator='dot']) {\r\n --bp-breadcrumb-separator-content: '•';\r\n --bp-breadcrumb-separator-size: var(--bp-font-size-lg);\r\n }\r\n\r\n /* Size variants - set custom properties on host to cross shadow boundaries */\r\n :host([size='sm']) {\r\n --bp-breadcrumb-font-size: var(--bp-font-size-sm);\r\n --bp-breadcrumb-line-height: var(--bp-line-height-tight);\r\n }\r\n\r\n :host([size='md']) {\r\n --bp-breadcrumb-font-size: var(--bp-font-size-base);\r\n --bp-breadcrumb-line-height: var(--bp-line-height-normal);\r\n }\r\n\r\n :host([size='lg']) {\r\n --bp-breadcrumb-font-size: var(--bp-font-size-lg);\r\n --bp-breadcrumb-line-height: var(--bp-line-height-normal);\r\n }\r\n\r\n .breadcrumb {\r\n font-family: var(--bp-font-family);\r\n }\r\n\r\n .list {\r\n display: flex;\r\n flex-wrap: wrap;\r\n align-items: center;\r\n list-style: none;\r\n margin: 0;\r\n padding: 0;\r\n gap: 0;\r\n }\r\n\r\n .item {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 0;\r\n font-size: var(--bp-breadcrumb-font-size, var(--bp-font-size-base));\r\n line-height: var(--bp-breadcrumb-line-height, var(--bp-line-height-normal));\r\n }\r\n\r\n .item__icon {\r\n flex-shrink: 0;\r\n }\r\n\r\n .item__label {\r\n white-space: nowrap;\r\n }\r\n\r\n /* Link styles */\r\n .link {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--bp-spacing-xs);\r\n color: var(--bp-color-text-muted);\r\n text-decoration: none;\r\n transition: color var(--bp-transition-fast);\r\n outline: none;\r\n border-radius: var(--bp-border-radius);\r\n }\r\n\r\n .link:hover {\r\n color: var(--bp-color-primary);\r\n text-decoration: underline;\r\n }\r\n\r\n .link:active {\r\n transform: translateY(1px);\r\n }\r\n\r\n .link: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 /* Text (non-link) styles */\r\n .text {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--bp-spacing-xs);\r\n color: var(--bp-color-text);\r\n font-weight: var(--bp-font-weight-medium);\r\n }\r\n\r\n /* Current item */\r\n .item--current .text {\r\n color: var(--bp-color-text);\r\n }\r\n\r\n /* Separator styles */\r\n .separator {\r\n display: inline-flex;\r\n align-items: center;\r\n color: var(--bp-color-text-muted);\r\n margin: 0 var(--bp-spacing-2xs);\r\n user-select: none;\r\n }\r\n\r\n /* Hide separator on last item */\r\n :host(:last-of-type) .separator {\r\n display: none;\r\n }\r\n\r\n /* Separator content via ::before - uses custom properties from parent */\r\n .separator::before {\r\n content: var(--bp-breadcrumb-separator-content, '/');\r\n font-size: var(--bp-breadcrumb-separator-size, inherit);\r\n }\r\n\r\n .separator__icon {\r\n width: var(--bp-spacing-md);\r\n height: var(--bp-spacing-md);\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n }\r\n\r\n .separator__icon--dot {\r\n font-size: var(--bp-font-size-lg);\r\n line-height: 1;\r\n }\r\n\r\n /* Ellipsis button */\r\n .ellipsis-button {\r\n appearance: none;\r\n border: none;\r\n background: transparent;\r\n padding: var(--bp-spacing-xs);\r\n margin: calc(-1 * var(--bp-spacing-xs));\r\n cursor: pointer;\r\n color: var(--bp-color-text-muted);\r\n border-radius: var(--bp-border-radius);\r\n transition: all var(--bp-transition-fast);\r\n outline: none;\r\n }\r\n\r\n .ellipsis-button:hover {\r\n color: var(--bp-color-primary);\r\n background: var(--bp-color-surface);\r\n }\r\n\r\n .ellipsis-button:active {\r\n transform: scale(0.95);\r\n }\r\n\r\n .ellipsis-button: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 .ellipsis-dots {\r\n font-size: var(--bp-font-size-base);\r\n letter-spacing: var(--bp-spacing-0-5);\r\n }\r\n\r\n /* Sizes */\r\n .breadcrumb--sm {\r\n font-size: var(--bp-font-size-sm);\r\n line-height: var(--bp-line-height-tight);\r\n }\r\n\r\n .breadcrumb--sm .separator__icon {\r\n width: var(--bp-spacing-sm);\r\n height: var(--bp-spacing-sm);\r\n }\r\n\r\n .breadcrumb--md {\r\n font-size: var(--bp-font-size-base);\r\n line-height: var(--bp-line-height-normal);\r\n }\r\n\r\n .breadcrumb--md .separator__icon {\r\n width: var(--bp-spacing-md);\r\n height: var(--bp-spacing-md);\r\n }\r\n\r\n .breadcrumb--lg {\r\n font-size: var(--bp-font-size-lg);\r\n line-height: var(--bp-line-height-normal);\r\n }\r\n\r\n .breadcrumb--lg .separator__icon {\r\n width: var(--bp-spacing-lg);\r\n height: var(--bp-spacing-lg);\r\n }\r\n\r\n /* Separator variants */\r\n .breadcrumb--slash .separator__icon {\r\n font-size: inherit;\r\n }\r\n\r\n .breadcrumb--dot .separator__icon {\r\n font-size: inherit;\r\n }\r\n\r\n /* Item ellipsis */\r\n .item--ellipsis {\r\n display: inline-flex;\r\n }\r\n\r\n /* Collapse on mobile - handled via maxItems property instead of CSS */\r\n .breadcrumb--collapse-mobile {\r\n /* Reserved for future container query support */\r\n }\r\n`;\r\n","import { LitElement, html, nothing } from 'lit';\r\nimport { customElement, property } from 'lit/decorators.js';\r\nimport { classMap } from 'lit/directives/class-map.js';\r\nimport { repeat } from 'lit/directives/repeat.js';\r\nimport { ifDefined } from 'lit/directives/if-defined.js';\r\nimport { breadcrumbStyles } from './breadcrumb.style.js';\r\nimport type { IconName } from '../icon/icons/registry.generated.js';\r\n\r\nexport type BreadcrumbSize = 'sm' | 'md' | 'lg';\r\nexport type BreadcrumbSeparator = 'slash' | 'chevron' | 'arrow' | 'dot';\r\n\r\n/**\r\n * Breadcrumb item interface for programmatic configuration\r\n */\r\nexport interface BreadcrumbItem {\r\n /** Display label for the breadcrumb item */\r\n label: string;\r\n /** URL for the breadcrumb link (omit for current page) */\r\n href?: string;\r\n /** Icon name to display before the label */\r\n icon?: IconName;\r\n /** Whether this is the current/active page */\r\n current?: boolean;\r\n}\r\n\r\n/**\r\n * A breadcrumb navigation component showing the user's location in a hierarchy.\r\n *\r\n * @element bp-breadcrumb\r\n *\r\n * @property {BreadcrumbItem[]} items - Array of breadcrumb items\r\n * @property {BreadcrumbSize} size - The size of the breadcrumb\r\n * @property {BreadcrumbSeparator} separator - The separator style between items\r\n * @property {string} ariaLabel - Accessible label for the navigation\r\n * @property {boolean} collapseOnMobile - Whether to collapse middle items on small screens\r\n * @property {number} maxItems - Maximum visible items before collapsing (0 = no limit)\r\n *\r\n * @slot - Default slot for custom breadcrumb items\r\n * @slot separator - Custom separator content\r\n *\r\n * @fires bp-breadcrumb-click - Fired when a breadcrumb item is clicked\r\n *\r\n * @csspart nav - The nav element wrapper\r\n * @csspart list - The ordered list element\r\n * @csspart item - Individual breadcrumb item\r\n * @csspart item-current - The current/active breadcrumb item\r\n * @csspart link - Breadcrumb link element\r\n * @csspart separator - Separator between items\r\n * @csspart ellipsis - The ellipsis button when items are collapsed\r\n */\r\n@customElement('bp-breadcrumb')\r\nexport class BpBreadcrumb extends LitElement {\r\n /**\r\n * Array of breadcrumb items\r\n */\r\n @property({ type: Array }) declare items: BreadcrumbItem[];\r\n\r\n /**\r\n * The size of the breadcrumb\r\n */\r\n @property({ type: String, reflect: true }) declare size: BreadcrumbSize;\r\n\r\n /**\r\n * The separator style between items\r\n */\r\n @property({ type: String, reflect: true })\r\n declare separator: BreadcrumbSeparator;\r\n\r\n /**\r\n * Accessible label for the navigation landmark\r\n */\r\n @property({ type: String, attribute: 'aria-label' })\r\n declare ariaLabel: string;\r\n\r\n /**\r\n * Whether to collapse middle items on small screens\r\n */\r\n @property({ type: Boolean, attribute: 'collapse-on-mobile' })\r\n declare collapseOnMobile: boolean;\r\n\r\n /**\r\n * Maximum visible items before collapsing (0 = no limit)\r\n */\r\n @property({ type: Number, attribute: 'max-items' }) declare maxItems: number;\r\n\r\n static styles = [breadcrumbStyles];\r\n\r\n constructor() {\r\n super();\r\n this.items = [];\r\n this.size = 'md';\r\n this.separator = 'slash';\r\n this.ariaLabel = 'Breadcrumb';\r\n this.collapseOnMobile = false;\r\n this.maxItems = 0;\r\n }\r\n\r\n private handleItemClick(\r\n _event: MouseEvent,\r\n item: BreadcrumbItem,\r\n index: number\r\n ) {\r\n // Don't prevent default for actual navigation\r\n this.dispatchEvent(\r\n new CustomEvent('bp-breadcrumb-click', {\r\n detail: { item, index },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private handleKeyDown(\r\n event: KeyboardEvent,\r\n item: BreadcrumbItem,\r\n index: number\r\n ) {\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n if (!item.href) {\r\n event.preventDefault();\r\n }\r\n this.dispatchEvent(\r\n new CustomEvent('bp-breadcrumb-click', {\r\n detail: { item, index },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n }\r\n\r\n private renderSeparator() {\r\n const separatorIcons = {\r\n slash: html`<span class=\"separator__icon\">/</span>`,\r\n chevron: html`\r\n <svg\r\n class=\"separator__icon\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n >\r\n <path d=\"M9 18l6-6-6-6\" />\r\n </svg>\r\n `,\r\n arrow: html`\r\n <svg\r\n class=\"separator__icon\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n >\r\n <path d=\"M5 12h14M12 5l7 7-7 7\" />\r\n </svg>\r\n `,\r\n dot: html`<span class=\"separator__icon separator__icon--dot\">•</span>`,\r\n };\r\n\r\n return html`\r\n <span class=\"separator\" part=\"separator\" aria-hidden=\"true\">\r\n <slot name=\"separator\">${separatorIcons[this.separator]}</slot>\r\n </span>\r\n `;\r\n }\r\n\r\n private renderItem(item: BreadcrumbItem, index: number, isLast: boolean) {\r\n const isCurrent = item.current || isLast;\r\n const itemClasses = {\r\n item: true,\r\n 'item--current': isCurrent,\r\n };\r\n\r\n return html`\r\n <li\r\n class=${classMap(itemClasses)}\r\n part=\"item ${isCurrent ? 'item-current' : ''}\"\r\n >\r\n ${item.href && !isCurrent\r\n ? html`\r\n <a\r\n class=\"link\"\r\n part=\"link\"\r\n href=${item.href}\r\n @click=${(e: MouseEvent) =>\r\n this.handleItemClick(e, item, index)}\r\n @keydown=${(e: KeyboardEvent) =>\r\n this.handleKeyDown(e, item, index)}\r\n >\r\n ${item.icon\r\n ? html`<bp-icon\r\n name=${item.icon}\r\n class=\"item__icon\"\r\n ></bp-icon>`\r\n : nothing}\r\n <span class=\"item__label\">${item.label}</span>\r\n </a>\r\n `\r\n : html`\r\n <span\r\n class=\"text\"\r\n part=\"text\"\r\n aria-current=${ifDefined(isCurrent ? 'page' : undefined)}\r\n >\r\n ${item.icon\r\n ? html`<bp-icon\r\n name=${item.icon}\r\n class=\"item__icon\"\r\n ></bp-icon>`\r\n : nothing}\r\n <span class=\"item__label\">${item.label}</span>\r\n </span>\r\n `}\r\n ${!isLast ? this.renderSeparator() : nothing}\r\n </li>\r\n `;\r\n }\r\n\r\n private renderEllipsis(hiddenCount: number) {\r\n return html`\r\n <li class=\"item item--ellipsis\" part=\"item ellipsis\">\r\n <button\r\n class=\"ellipsis-button\"\r\n part=\"ellipsis-button\"\r\n aria-label=\"Show ${hiddenCount} more items\"\r\n title=\"Show ${hiddenCount} more items\"\r\n >\r\n <span class=\"ellipsis-dots\">…</span>\r\n </button>\r\n ${this.renderSeparator()}\r\n </li>\r\n `;\r\n }\r\n\r\n private getVisibleItems(): {\r\n items: BreadcrumbItem[];\r\n hiddenCount: number;\r\n showEllipsis: boolean;\r\n } {\r\n if (this.maxItems <= 0 || this.items.length <= this.maxItems) {\r\n return { items: this.items, hiddenCount: 0, showEllipsis: false };\r\n }\r\n\r\n // Show first item, ellipsis, and last (maxItems - 1) items\r\n const firstItem = this.items[0];\r\n const lastItems = this.items.slice(-(this.maxItems - 1));\r\n const hiddenCount = this.items.length - this.maxItems;\r\n\r\n return {\r\n items: [firstItem, ...lastItems],\r\n hiddenCount,\r\n showEllipsis: true,\r\n };\r\n }\r\n\r\n render() {\r\n const containerClasses = {\r\n breadcrumb: true,\r\n [`breadcrumb--${this.size}`]: true,\r\n [`breadcrumb--separator-${this.separator}`]: true,\r\n 'breadcrumb--collapse-mobile': this.collapseOnMobile,\r\n };\r\n\r\n const {\r\n items: visibleItems,\r\n hiddenCount,\r\n showEllipsis,\r\n } = this.getVisibleItems();\r\n\r\n // If using programmatic items\r\n if (this.items.length > 0) {\r\n return html`\r\n <nav\r\n class=${classMap(containerClasses)}\r\n part=\"nav\"\r\n aria-label=${this.ariaLabel}\r\n >\r\n <ol class=\"list\" part=\"list\">\r\n ${showEllipsis\r\n ? html`\r\n ${this.renderItem(visibleItems[0], 0, false)}\r\n ${this.renderEllipsis(hiddenCount)}\r\n ${repeat(\r\n visibleItems.slice(1),\r\n (_item, index) => index,\r\n (item, index) =>\r\n this.renderItem(\r\n item,\r\n this.items.length - visibleItems.length + 1 + index,\r\n index === visibleItems.length - 2\r\n )\r\n )}\r\n `\r\n : repeat(\r\n visibleItems,\r\n (_item, index) => index,\r\n (item, index) =>\r\n this.renderItem(\r\n item,\r\n index,\r\n index === visibleItems.length - 1\r\n )\r\n )}\r\n </ol>\r\n </nav>\r\n `;\r\n }\r\n\r\n // Slotted content fallback\r\n return html`\r\n <nav\r\n class=${classMap(containerClasses)}\r\n part=\"nav\"\r\n aria-label=${this.ariaLabel}\r\n >\r\n <ol class=\"list\" part=\"list\">\r\n <slot></slot>\r\n </ol>\r\n </nav>\r\n `;\r\n }\r\n}\r\n\r\n/**\r\n * A breadcrumb item component for use with bp-breadcrumb.\r\n *\r\n * @element bp-breadcrumb-item\r\n *\r\n * @property {string} href - URL for the breadcrumb link\r\n * @property {boolean} current - Whether this is the current page\r\n *\r\n * @slot - Content of the breadcrumb item\r\n *\r\n * @csspart item - The item container\r\n * @csspart link - The link element (when href is provided)\r\n */\r\n@customElement('bp-breadcrumb-item')\r\nexport class BpBreadcrumbItem extends LitElement {\r\n /**\r\n * URL for the breadcrumb link (omit for current page)\r\n */\r\n @property({ type: String }) declare href: string;\r\n\r\n /**\r\n * Whether this is the current/active page\r\n */\r\n @property({ type: Boolean, reflect: true }) declare current: boolean;\r\n\r\n static styles = [breadcrumbStyles];\r\n\r\n constructor() {\r\n super();\r\n this.href = '';\r\n this.current = false;\r\n }\r\n\r\n render() {\r\n const itemClasses = {\r\n item: true,\r\n 'item--current': this.current,\r\n };\r\n\r\n return html`\r\n <li\r\n class=${classMap(itemClasses)}\r\n part=\"item ${this.current ? 'item-current' : ''}\"\r\n >\r\n ${this.href && !this.current\r\n ? html`\r\n <a class=\"link\" part=\"link\" href=${this.href}>\r\n <slot></slot>\r\n </a>\r\n `\r\n : html`\r\n <span\r\n class=\"text\"\r\n part=\"text\"\r\n aria-current=${ifDefined(this.current ? 'page' : undefined)}\r\n >\r\n <slot></slot>\r\n </span>\r\n `}\r\n <span class=\"separator\" part=\"separator\" aria-hidden=\"true\"></span>\r\n </li>\r\n `;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'bp-breadcrumb': BpBreadcrumb;\r\n 'bp-breadcrumb-item': BpBreadcrumbItem;\r\n }\r\n}\r\n"],"names":["breadcrumbStyles","css","BpBreadcrumb","LitElement","_event","item","index","event","separatorIcons","html","isLast","isCurrent","classMap","e","nothing","ifDefined","hiddenCount","firstItem","lastItems","containerClasses","visibleItems","showEllipsis","repeat","_item","__decorateClass","property","customElement","BpBreadcrumbItem","itemClasses"],"mappings":";;;;;AAEO,MAAMA,IAAmBC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;ACiDzB,IAAMC,IAAN,cAA2BC,EAAW;AAAA,EAoC3C,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"}
|