@krollins/blueprint 0.1.11 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/dist/components/accordion.js +393 -0
  2. package/dist/components/accordion.js.map +1 -0
  3. package/dist/components/alert.js +213 -0
  4. package/dist/components/alert.js.map +1 -0
  5. package/dist/components/avatar.js +237 -0
  6. package/dist/components/avatar.js.map +1 -0
  7. package/dist/components/badge.js +144 -0
  8. package/dist/components/badge.js.map +1 -0
  9. package/dist/components/breadcrumb.js +481 -0
  10. package/dist/components/breadcrumb.js.map +1 -0
  11. package/dist/components/button.js +192 -0
  12. package/dist/components/button.js.map +1 -0
  13. package/dist/components/card.js +223 -0
  14. package/dist/components/card.js.map +1 -0
  15. package/dist/components/checkbox.js +337 -0
  16. package/dist/components/checkbox.js.map +1 -0
  17. package/dist/components/color-picker.js +1660 -0
  18. package/dist/components/color-picker.js.map +1 -0
  19. package/dist/components/combobox.js +595 -0
  20. package/dist/components/combobox.js.map +1 -0
  21. package/dist/components/date-picker.js +726 -0
  22. package/dist/components/date-picker.js.map +1 -0
  23. package/dist/components/divider.js +214 -0
  24. package/dist/components/divider.js.map +1 -0
  25. package/dist/components/drawer.js +568 -0
  26. package/dist/components/drawer.js.map +1 -0
  27. package/dist/components/dropdown.js +377 -0
  28. package/dist/components/dropdown.js.map +1 -0
  29. package/dist/components/file-upload.js +669 -0
  30. package/dist/components/file-upload.js.map +1 -0
  31. package/dist/components/heading.js +161 -0
  32. package/dist/components/heading.js.map +1 -0
  33. package/dist/components/icon.js +599 -0
  34. package/dist/components/icon.js.map +1 -0
  35. package/dist/components/input.js +363 -0
  36. package/dist/components/input.js.map +1 -0
  37. package/dist/components/link.js +178 -0
  38. package/dist/components/link.js.map +1 -0
  39. package/dist/components/menu.js +331 -0
  40. package/dist/components/menu.js.map +1 -0
  41. package/dist/components/modal.js +317 -0
  42. package/dist/components/modal.js.map +1 -0
  43. package/dist/components/multi-select.js +642 -0
  44. package/dist/components/multi-select.js.map +1 -0
  45. package/dist/components/notification.js +429 -0
  46. package/dist/components/notification.js.map +1 -0
  47. package/dist/components/number-input.js +556 -0
  48. package/dist/components/number-input.js.map +1 -0
  49. package/dist/components/pagination.js +320 -0
  50. package/dist/components/pagination.js.map +1 -0
  51. package/dist/components/popover.js +597 -0
  52. package/dist/components/popover.js.map +1 -0
  53. package/dist/components/progress.js +219 -0
  54. package/dist/components/progress.js.map +1 -0
  55. package/dist/components/radio.js +321 -0
  56. package/dist/components/radio.js.map +1 -0
  57. package/dist/components/select.js +498 -0
  58. package/dist/components/select.js.map +1 -0
  59. package/dist/components/skeleton.js +240 -0
  60. package/dist/components/skeleton.js.map +1 -0
  61. package/dist/components/slider.js +9 -0
  62. package/dist/components/slider.js.map +1 -0
  63. package/dist/components/spinner.js +133 -0
  64. package/dist/components/spinner.js.map +1 -0
  65. package/dist/components/stepper.js +812 -0
  66. package/dist/components/stepper.js.map +1 -0
  67. package/dist/components/switch.js +380 -0
  68. package/dist/components/switch.js.map +1 -0
  69. package/dist/components/table.js +642 -0
  70. package/dist/components/table.js.map +1 -0
  71. package/dist/components/tabs.js +547 -0
  72. package/dist/components/tabs.js.map +1 -0
  73. package/dist/components/tag.js +291 -0
  74. package/dist/components/tag.js.map +1 -0
  75. package/dist/components/text.js +278 -0
  76. package/dist/components/text.js.map +1 -0
  77. package/dist/components/textarea.js +380 -0
  78. package/dist/components/textarea.js.map +1 -0
  79. package/dist/components/time-picker.js +457 -0
  80. package/dist/components/time-picker.js.map +1 -0
  81. package/dist/components/tooltip.js +239 -0
  82. package/dist/components/tooltip.js.map +1 -0
  83. package/dist/components/tree.js +582 -0
  84. package/dist/components/tree.js.map +1 -0
  85. package/dist/index.js +93 -17799
  86. package/dist/index.js.map +1 -1
  87. package/dist/shared/boolean-converter-XDGfS9LC.js +12 -0
  88. package/dist/shared/boolean-converter-XDGfS9LC.js.map +1 -0
  89. package/dist/shared/debounce-BckY30Sf.js +23 -0
  90. package/dist/shared/debounce-BckY30Sf.js.map +1 -0
  91. package/dist/shared/memoize-DlOFy-92.js +16 -0
  92. package/dist/shared/memoize-DlOFy-92.js.map +1 -0
  93. package/dist/shared/slider-BNt5TITl.js +484 -0
  94. package/dist/shared/slider-BNt5TITl.js.map +1 -0
  95. package/package.json +49 -3
@@ -0,0 +1,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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"}