wj-elements 0.5.1 → 0.6.0

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.
@@ -11,7 +11,8 @@ import "./wje-menu.js";
11
11
  import "./wje-menu-item.js";
12
12
  import "./wje-popup.js";
13
13
  import "./wje-tooltip.js";
14
- const styles = "/*\n[ WJ Breadcrumb ]\n*/\n\n:host {\n display: flex;\n flex: 0 0 auto;\n align-items: center;\n line-height: var(--wje-breadcrumb-line-height, 1.5);\n\n .native-breadcrumb {\n display: flex;\n align-items: center;\n width: 100%;\n outline: none;\n background: inherit;\n margin: var(--wje-breadcrumb-margin, var(--wje-breadcrumb-native-margin, 0));\n padding: var(--wje-breadcrumb-padding, var(--wje-breadcrumb-native-padding, 0.25rem 0.75rem));\n color: var(--wje-breadcrumb-a);\n text-decoration: none;\n font-size: var(--wje-breadcrumb-font-size);\n line-height: var(--wje-breadcrumb-native-line-height, var(--wje-breadcrumb-line-height, 1.5));\n &.hidden {\n display: none;\n }\n &.active {\n font-weight: var(--wje-breadcrumb-active-font-weight);\n font-size: var(--wje-breadcrumb-active-font-size);\n }\n &.disabled {\n cursor: default;\n opacity: 0.6;\n }\n &:hover {\n color: var(--wje-breadcrumb-a-hover);\n }\n }\n\n button {\n margin-inline: 0.75rem;\n border: 0 solid transparent;\n border-radius: 3px;\n background-color: transparent;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n }\n\n .separator {\n display: inline-flex;\n align-items: center;\n }\n}\n\n:host(.collapsed) {\n display: none;\n}\n\n::slotted([slot='start']) {\n margin-inline: 0 0.5rem;\n}\n\n::slotted([slot='end']) {\n margin-inline: 0.5rem 0;\n}\n";
14
+ const styles = "/*\n[ WJ Breadcrumb ]\n*/\n\n:host {\n display: flex;\n flex: 0 0 auto;\n align-items: center;\n line-height: var(--wje-breadcrumb-line-height, 1.5);\n\n .native-breadcrumb {\n display: flex;\n align-items: center;\n width: 100%;\n outline: none;\n background: inherit;\n margin: var(--wje-breadcrumb-margin, var(--wje-breadcrumb-native-margin, 0));\n padding: var(--wje-breadcrumb-padding, var(--wje-breadcrumb-native-padding, 0.25rem 0.75rem));\n color: var(--wje-breadcrumb-a);\n text-decoration: none;\n font-size: var(--wje-breadcrumb-font-size);\n line-height: var(--wje-breadcrumb-native-line-height, var(--wje-breadcrumb-line-height, 1.5));\n &.hidden {\n display: none;\n }\n &.active {\n font-weight: var(--wje-breadcrumb-active-font-weight);\n font-size: var(--wje-breadcrumb-active-font-size);\n }\n &.disabled {\n cursor: default;\n opacity: 0.6;\n }\n &:hover {\n color: var(--wje-breadcrumb-a-hover);\n }\n }\n\n button {\n margin-inline: 0.75rem;\n border: 0 solid transparent;\n border-radius: 3px;\n background-color: transparent;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n }\n\n .separator {\n display: inline-flex;\n align-items: center;\n }\n}\n\n:host(.collapsed) {\n display: none;\n}\n\n:host([mobile-collapsed-indicator]) {\n flex: 1 1 auto;\n min-width: 0;\n max-width: 100%;\n overflow: hidden;\n}\n\n.breadcrumb-mobile {\n display: flex;\n align-items: center;\n min-width: 0;\n max-width: 100%;\n color: var(--wje-breadcrumb-a);\n font-size: var(--wje-breadcrumb-font-size);\n line-height: var(--wje-breadcrumb-line-height, 1.5);\n}\n\n.breadcrumb-mobile--text,\n.breadcrumb-mobile--back,\n.breadcrumb-mobile--parent-title {\n width: 100%;\n}\n\n.breadcrumb-mobile--back,\n.breadcrumb-mobile--parent-title {\n flex-direction: column;\n align-items: flex-start;\n gap: 0.125rem;\n}\n\n.breadcrumb-mobile-dropdown,\n.breadcrumb-mobile__menu {\n min-width: 0;\n max-width: 100%;\n}\n\n.breadcrumb-mobile__menu {\n --wje-button-margin-inline: 0;\n --wje-padding-top: 0;\n --wje-padding-bottom: 0;\n --wje-padding-start: 0;\n --wje-padding-end: 0;\n gap: 0.35rem;\n color: var(--wje-breadcrumb-a);\n}\n\n.breadcrumb-mobile__back,\n.breadcrumb-mobile__parent,\n.breadcrumb-mobile__title {\n min-width: 0;\n max-width: 100%;\n overflow: hidden;\n color: inherit;\n font: inherit;\n line-height: inherit;\n text-align: start;\n text-decoration: none;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.breadcrumb-mobile__back,\n.breadcrumb-mobile__parent {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0;\n border: 0;\n background: transparent;\n color: var(--wje-breadcrumb-a);\n cursor: default;\n font-size: var(--wje-breadcrumb-mobile-parent-font-size, 0.8125rem);\n opacity: 0.72;\n}\n\nbutton.breadcrumb-mobile__back,\nbutton.breadcrumb-mobile__parent,\nbutton.breadcrumb-mobile__title {\n margin-inline: 0;\n cursor: pointer;\n}\n\nbutton.breadcrumb-mobile__back:hover,\nbutton.breadcrumb-mobile__parent:hover,\nbutton.breadcrumb-mobile__title:hover,\n.breadcrumb-mobile__menu:hover {\n color: var(--wje-breadcrumb-a-hover);\n}\n\n.breadcrumb-mobile__title {\n display: block;\n font-weight: var(--wje-breadcrumb-active-font-weight, 600);\n font-size: var(--wje-breadcrumb-active-font-size, inherit);\n}\n\n.breadcrumb-mobile__label {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.breadcrumb-mobile__icon {\n flex: 0 0 auto;\n}\n\n::slotted([slot='start']) {\n margin-inline: 0 0.5rem;\n}\n\n::slotted([slot='end']) {\n margin-inline: 0.5rem 0;\n}\n";
15
+ const MOBILE_COLLAPSED_VARIANTS = /* @__PURE__ */ new Set(["TEXT", "BACK", "PARENT-TITLE", "MENU-TITLE", "SHEET"]);
15
16
  class Breadcrumb extends WJElement {
16
17
  /**
17
18
  * Breadcrumb constructor method.
@@ -86,9 +87,15 @@ class Breadcrumb extends WJElement {
86
87
  * @returns {string} The collapsed variant value in uppercase.
87
88
  */
88
89
  get collapsedVariant() {
90
+ return this.collapsedVariantName.toUpperCase();
91
+ }
92
+ /**
93
+ * Get collapsed variant token.
94
+ * @returns {string}
95
+ */
96
+ get collapsedVariantName() {
89
97
  var _a, _b;
90
- let variant = ((_a = this.parentElement) == null ? void 0 : _a.collapsedVariant) || ((_b = this.parentElement) == null ? void 0 : _b.variant) || this._collapsedVariant || "button";
91
- return variant.toUpperCase();
98
+ return String(((_a = this.parentElement) == null ? void 0 : _a.collapsedVariant) || ((_b = this.parentElement) == null ? void 0 : _b.variant) || this._collapsedVariant || "button").trim();
92
99
  }
93
100
  /**
94
101
  * Get CSS stylesheet for the Breadcrumb element.
@@ -284,17 +291,25 @@ class Breadcrumb extends WJElement {
284
291
  /**
285
292
  * Renders the collapsed indicator based on the current collapsed variant.
286
293
  * If the collapsed variant is 'DROPDOWN', it invokes the collapseDropdown method.
287
- * Otherwise, it invokes the collapseButton method.
294
+ * Mobile breakpoint variants render compact breadcrumb summaries, otherwise the default button is used.
288
295
  * @returns {any} The rendered collapsed indicator, either as a dropdown or a button.
289
296
  */
290
297
  drawCollapsedIndicator() {
291
- let collapsedIndicator = null;
292
- if (this.collapsedVariant === "DROPDOWN") {
293
- collapsedIndicator = this.collapseDropdown();
294
- } else {
295
- collapsedIndicator = this.collapseButton();
298
+ const variant = this.collapsedVariant;
299
+ if (variant === "DROPDOWN") {
300
+ return this.collapseDropdown();
301
+ }
302
+ if (this.isMobileCollapsedVariant() && this.isBreakpointMenuIndicator()) {
303
+ return this.collapseMobileVariant(variant);
296
304
  }
297
- return collapsedIndicator;
305
+ return this.collapseButton();
306
+ }
307
+ /**
308
+ * Returns whether the current collapsed variant is a compact mobile layout.
309
+ * @returns {boolean}
310
+ */
311
+ isMobileCollapsedVariant() {
312
+ return MOBILE_COLLAPSED_VARIANTS.has(this.collapsedVariant);
298
313
  }
299
314
  /**
300
315
  * Creates and returns a dropdown UI component for collapsed breadcrumbs.
@@ -306,11 +321,37 @@ class Breadcrumb extends WJElement {
306
321
  */
307
322
  collapseDropdown() {
308
323
  const isBreakpointMenuIndicator = this.isBreakpointMenuIndicator();
309
- let dropdown = document.createElement("wje-dropdown");
310
- dropdown.setAttribute("placement", isBreakpointMenuIndicator ? "bottom-start" : "bottom");
311
- dropdown.setAttribute("offset", "10");
324
+ const breadcrumbs = this.getCollapsedMenuBreadcrumbs(isBreakpointMenuIndicator);
312
325
  const trigger = this.createCollapsedDropdownTrigger(isBreakpointMenuIndicator);
313
- let menu = document.createElement("wje-menu");
326
+ return this.createBreadcrumbDropdown({
327
+ breadcrumbs,
328
+ trigger,
329
+ placement: isBreakpointMenuIndicator ? "bottom-start" : "bottom"
330
+ });
331
+ }
332
+ /**
333
+ * Creates a dropdown containing breadcrumb menu items.
334
+ * @param {object} options Configuration for the dropdown shell.
335
+ * @param {Array<HTMLElement>} options.breadcrumbs Breadcrumb elements to mirror in the menu.
336
+ * @param {HTMLElement} options.trigger Element assigned to the dropdown trigger slot.
337
+ * @param {string} options.placement Floating UI placement token for the popup.
338
+ * @returns {HTMLElement}
339
+ */
340
+ createBreadcrumbDropdown({ breadcrumbs, trigger, placement = "bottom" }) {
341
+ const dropdown = document.createElement("wje-dropdown");
342
+ dropdown.setAttribute("placement", placement);
343
+ dropdown.setAttribute("offset", "10");
344
+ const menu = this.createCollapsedBreadcrumbMenu(breadcrumbs);
345
+ dropdown.append(trigger, menu);
346
+ return dropdown;
347
+ }
348
+ /**
349
+ * Creates the menu used by collapsed dropdown variants.
350
+ * @param {Array<HTMLElement>} breadcrumbs Breadcrumb items represented by menu items.
351
+ * @returns {HTMLElement}
352
+ */
353
+ createCollapsedBreadcrumbMenu(breadcrumbs) {
354
+ const menu = document.createElement("wje-menu");
314
355
  menu.setAttribute("variant", "context");
315
356
  menu.style.setProperty("--wje-menu-item-justify-content", "flex-start");
316
357
  menu.addEventListener("click", (e) => {
@@ -318,37 +359,286 @@ class Breadcrumb extends WJElement {
318
359
  e.stopPropagation();
319
360
  (_a = e.stopImmediatePropagation) == null ? void 0 : _a.call(e);
320
361
  });
321
- this.getBreadcrumbs().getBreadcrumbsCollapsed().forEach((b) => {
322
- let menuItem = document.createElement("wje-menu-item");
323
- this.populateCollapsedMenuItem(menuItem, b);
324
- menuItem.__breadcrumb = b;
362
+ breadcrumbs.forEach((breadcrumb) => {
363
+ const menuItem = document.createElement("wje-menu-item");
364
+ this.populateCollapsedMenuItem(menuItem, breadcrumb);
365
+ menuItem.__breadcrumb = breadcrumb;
325
366
  menuItem.addEventListener("wje-menu-item:click", (e) => {
326
- var _a, _b, _c;
367
+ var _a, _b;
327
368
  (_a = e.preventDefault) == null ? void 0 : _a.call(e);
328
369
  e.stopPropagation();
329
370
  (_b = e.stopImmediatePropagation) == null ? void 0 : _b.call(e);
330
- const breadcrumb = e.currentTarget.__breadcrumb;
331
- if (!breadcrumb) return;
332
- const native = breadcrumb.native || ((_c = breadcrumb.context) == null ? void 0 : _c.querySelector("a.native-breadcrumb"));
333
- if (native && typeof native.click === "function") {
334
- native.click();
335
- } else if (typeof breadcrumb.click === "function") {
336
- breadcrumb.click();
337
- } else {
338
- breadcrumb.dispatchEvent(
339
- new MouseEvent("click", {
340
- bubbles: true,
341
- composed: true,
342
- cancelable: true
343
- })
344
- );
345
- }
371
+ this.forwardBreadcrumbClick(e.currentTarget.__breadcrumb);
346
372
  });
347
373
  menu.append(menuItem);
348
374
  });
349
- dropdown.append(trigger, menu);
375
+ return menu;
376
+ }
377
+ /**
378
+ * Returns breadcrumbs that should be exposed in a collapsed menu.
379
+ * @param {boolean} isBreakpointMenuIndicator Whether this trigger controls the full breakpoint menu.
380
+ * @returns {Array<HTMLElement>}
381
+ */
382
+ getCollapsedMenuBreadcrumbs(isBreakpointMenuIndicator) {
383
+ var _a, _b;
384
+ const breadcrumbs = this.getBreadcrumbs();
385
+ if (isBreakpointMenuIndicator) {
386
+ return ((_a = breadcrumbs == null ? void 0 : breadcrumbs.getBreadcrumbs) == null ? void 0 : _a.call(breadcrumbs)) || [];
387
+ }
388
+ return ((_b = breadcrumbs == null ? void 0 : breadcrumbs.getBreadcrumbsCollapsed) == null ? void 0 : _b.call(breadcrumbs)) || [];
389
+ }
390
+ /**
391
+ * Renders one of the compact mobile breakpoint variants.
392
+ * @param {string} variant Normalized uppercase variant token.
393
+ * @returns {HTMLElement}
394
+ */
395
+ collapseMobileVariant(variant) {
396
+ if (variant === "TEXT") return this.collapseMobileText();
397
+ if (variant === "BACK") return this.collapseMobileBack();
398
+ if (variant === "PARENT-TITLE") return this.collapseMobileParentTitle();
399
+ if (variant === "MENU-TITLE") return this.collapseMobileMenuTitle();
400
+ if (variant === "SHEET") return this.collapseMobileSheet();
401
+ return this.collapseButton();
402
+ }
403
+ /**
404
+ * Renders only the current breadcrumb title.
405
+ * @returns {HTMLElement}
406
+ */
407
+ collapseMobileText() {
408
+ const current = this.getCurrentBreadcrumb();
409
+ const container = this.createMobileContainer("breadcrumb-mobile--text");
410
+ const title = this.createMobileBreadcrumbControl(current, "breadcrumb-mobile__title", {
411
+ ariaCurrent: true,
412
+ actionable: this.isBreadcrumbActionable(current)
413
+ });
414
+ container.append(title);
415
+ return container;
416
+ }
417
+ /**
418
+ * Renders a parent back action above the current title.
419
+ * @returns {HTMLElement}
420
+ */
421
+ collapseMobileBack() {
422
+ const current = this.getCurrentBreadcrumb();
423
+ const parent = this.getParentBreadcrumb();
424
+ const container = this.createMobileContainer("breadcrumb-mobile--back");
425
+ if (parent) {
426
+ const back = this.createMobileBreadcrumbControl(parent, "breadcrumb-mobile__back", {
427
+ ariaLabel: "Go to parent",
428
+ icon: "arrow-left",
429
+ actionable: this.isBreadcrumbActionable(parent)
430
+ });
431
+ container.append(back);
432
+ }
433
+ const title = this.createMobileBreadcrumbControl(current, "breadcrumb-mobile__title", {
434
+ ariaCurrent: true,
435
+ actionable: false
436
+ });
437
+ container.append(title);
438
+ return container;
439
+ }
440
+ /**
441
+ * Renders parent context above the current title.
442
+ * @returns {HTMLElement}
443
+ */
444
+ collapseMobileParentTitle() {
445
+ const current = this.getCurrentBreadcrumb();
446
+ const parent = this.getParentBreadcrumb();
447
+ const container = this.createMobileContainer("breadcrumb-mobile--parent-title");
448
+ if (parent) {
449
+ const parentControl = this.createMobileBreadcrumbControl(parent, "breadcrumb-mobile__parent", {
450
+ actionable: this.isBreadcrumbActionable(parent)
451
+ });
452
+ container.append(parentControl);
453
+ }
454
+ const title = this.createMobileBreadcrumbControl(current, "breadcrumb-mobile__title", {
455
+ ariaCurrent: true,
456
+ actionable: false
457
+ });
458
+ container.append(title);
459
+ return container;
460
+ }
461
+ /**
462
+ * Renders a menu trigger with the current title.
463
+ * @returns {HTMLElement}
464
+ */
465
+ collapseMobileMenuTitle() {
466
+ const trigger = this.createMobileDropdownTrigger({
467
+ icon: "dots",
468
+ label: this.getBreadcrumbLabel(this.getCurrentBreadcrumb()),
469
+ ariaLabel: "Show breadcrumb menu",
470
+ className: "breadcrumb-mobile--menu-title"
471
+ });
472
+ return this.createMobileDropdown(trigger);
473
+ }
474
+ /**
475
+ * Renders the future sheet variant using the dropdown fallback for now.
476
+ * @returns {HTMLElement}
477
+ */
478
+ collapseMobileSheet() {
479
+ const trigger = this.createMobileDropdownTrigger({
480
+ icon: "chevron-down",
481
+ iconPosition: "end",
482
+ label: this.getBreadcrumbLabel(this.getCurrentBreadcrumb()),
483
+ ariaLabel: "Show breadcrumb path",
484
+ className: "breadcrumb-mobile--sheet"
485
+ });
486
+ return this.createMobileDropdown(trigger);
487
+ }
488
+ /**
489
+ * Creates a dropdown fallback for mobile menu-like variants.
490
+ * @param {HTMLElement} trigger Element that opens the fallback dropdown.
491
+ * @returns {HTMLElement}
492
+ */
493
+ createMobileDropdown(trigger) {
494
+ const dropdown = this.createBreadcrumbDropdown({
495
+ breadcrumbs: this.getTrailBreadcrumbs(),
496
+ trigger,
497
+ placement: "bottom-start"
498
+ });
499
+ dropdown.classList.add("breadcrumb-mobile-dropdown");
350
500
  return dropdown;
351
501
  }
502
+ /**
503
+ * Creates a compact mobile dropdown trigger.
504
+ * @param {object} options Visual settings for the compact trigger.
505
+ * @param {string} options.icon Icon shown next to the title.
506
+ * @param {string} options.iconPosition Whether the icon renders at the start or end.
507
+ * @param {string} options.label Current breadcrumb label shown beside the icon.
508
+ * @param {string} options.ariaLabel Accessible name for the dropdown trigger.
509
+ * @param {string} options.className Variant-specific class applied to the trigger.
510
+ * @returns {HTMLElement}
511
+ */
512
+ createMobileDropdownTrigger({ icon, iconPosition = "start", label, ariaLabel, className }) {
513
+ const trigger = document.createElement("wje-button");
514
+ trigger.setAttribute("slot", "trigger");
515
+ trigger.setAttribute("fill", "link");
516
+ trigger.setAttribute("aria-label", ariaLabel);
517
+ trigger.classList.add("breadcrumb-mobile", "breadcrumb-mobile__menu", className);
518
+ const iconElement = document.createElement("wje-icon");
519
+ iconElement.setAttribute("name", icon);
520
+ iconElement.setAttribute("slot", iconPosition === "end" ? "end" : "start");
521
+ iconElement.classList.add("breadcrumb-mobile__icon");
522
+ const title = document.createElement("span");
523
+ title.classList.add("breadcrumb-mobile__title");
524
+ title.setAttribute("aria-current", "page");
525
+ title.textContent = label;
526
+ if (label) title.setAttribute("title", label);
527
+ if (iconPosition === "end") {
528
+ trigger.append(title, iconElement);
529
+ } else {
530
+ trigger.append(iconElement, title);
531
+ }
532
+ return trigger;
533
+ }
534
+ /**
535
+ * Creates a wrapper for compact mobile breadcrumb variants.
536
+ * @param {string} className Variant class.
537
+ * @returns {HTMLElement}
538
+ */
539
+ createMobileContainer(className) {
540
+ const container = document.createElement("div");
541
+ container.classList.add("breadcrumb-mobile", className);
542
+ return container;
543
+ }
544
+ /**
545
+ * Creates a text or button control for a breadcrumb.
546
+ * @param {HTMLElement|null} breadcrumb Source breadcrumb.
547
+ * @param {string} className Class applied to the created control.
548
+ * @param {object} options Behavior and accessibility settings for the control.
549
+ * @param {boolean} options.actionable Whether clicks should forward to the source breadcrumb.
550
+ * @param {boolean} options.ariaCurrent Whether the control marks the current page.
551
+ * @param {string} options.ariaLabel Accessible name for action controls.
552
+ * @param {string} options.icon Optional icon shown before the label.
553
+ * @returns {HTMLElement}
554
+ */
555
+ createMobileBreadcrumbControl(breadcrumb, className, { actionable = false, ariaCurrent = false, ariaLabel, icon } = {}) {
556
+ const label = this.getBreadcrumbLabel(breadcrumb);
557
+ const control = document.createElement(actionable ? "button" : "span");
558
+ control.classList.add(className);
559
+ if (actionable) {
560
+ control.setAttribute("type", "button");
561
+ control.addEventListener("click", (e) => {
562
+ var _a;
563
+ e.preventDefault();
564
+ e.stopPropagation();
565
+ (_a = e.stopImmediatePropagation) == null ? void 0 : _a.call(e);
566
+ this.forwardBreadcrumbClick(breadcrumb);
567
+ });
568
+ }
569
+ if (ariaCurrent) control.setAttribute("aria-current", "page");
570
+ if (ariaLabel && actionable) control.setAttribute("aria-label", ariaLabel);
571
+ if (label) control.setAttribute("title", label);
572
+ if (icon) {
573
+ const iconElement = document.createElement("wje-icon");
574
+ iconElement.setAttribute("name", icon);
575
+ iconElement.classList.add("breadcrumb-mobile__icon");
576
+ control.append(iconElement);
577
+ }
578
+ const text = document.createElement("span");
579
+ text.classList.add("breadcrumb-mobile__label");
580
+ text.textContent = label;
581
+ control.append(text);
582
+ return control;
583
+ }
584
+ /**
585
+ * Returns the full trail of sibling breadcrumbs.
586
+ * @returns {Array<HTMLElement>}
587
+ */
588
+ getTrailBreadcrumbs() {
589
+ var _a, _b;
590
+ return ((_b = (_a = this.getBreadcrumbs()) == null ? void 0 : _a.getBreadcrumbs) == null ? void 0 : _b.call(_a)) || [];
591
+ }
592
+ /**
593
+ * Returns the current breadcrumb item.
594
+ * @returns {HTMLElement|null}
595
+ */
596
+ getCurrentBreadcrumb() {
597
+ const breadcrumbs = this.getTrailBreadcrumbs();
598
+ return breadcrumbs[breadcrumbs.length - 1] || null;
599
+ }
600
+ /**
601
+ * Returns the parent breadcrumb item.
602
+ * @returns {HTMLElement|null}
603
+ */
604
+ getParentBreadcrumb() {
605
+ const breadcrumbs = this.getTrailBreadcrumbs();
606
+ return breadcrumbs.length > 1 ? breadcrumbs[breadcrumbs.length - 2] : null;
607
+ }
608
+ /**
609
+ * Returns whether a breadcrumb has a known action to forward.
610
+ * @param {HTMLElement|null} breadcrumb Breadcrumb to inspect.
611
+ * @returns {boolean}
612
+ */
613
+ isBreadcrumbActionable(breadcrumb) {
614
+ var _a, _b, _c, _d;
615
+ if (!breadcrumb || breadcrumb.disabled || ((_a = breadcrumb.hasAttribute) == null ? void 0 : _a.call(breadcrumb, "disabled"))) return false;
616
+ return Boolean(
617
+ ((_b = breadcrumb.hasAttribute) == null ? void 0 : _b.call(breadcrumb, "href")) || ((_c = breadcrumb.hasAttribute) == null ? void 0 : _c.call(breadcrumb, "onclick")) || breadcrumb.__wjeBreadcrumbManaged || ((_d = breadcrumb.hasAttribute) == null ? void 0 : _d.call(breadcrumb, "data-wje-breadcrumbs-item"))
618
+ );
619
+ }
620
+ /**
621
+ * Forwards a compact control or menu item click to the original breadcrumb.
622
+ * @param {HTMLElement|null} breadcrumb Source breadcrumb.
623
+ */
624
+ forwardBreadcrumbClick(breadcrumb) {
625
+ var _a;
626
+ if (!breadcrumb) return;
627
+ const native = breadcrumb.native || ((_a = breadcrumb.context) == null ? void 0 : _a.querySelector("a.native-breadcrumb"));
628
+ if (native && typeof native.click === "function") {
629
+ native.click();
630
+ } else if (typeof breadcrumb.click === "function") {
631
+ breadcrumb.click();
632
+ } else {
633
+ breadcrumb.dispatchEvent(
634
+ new MouseEvent("click", {
635
+ bubbles: true,
636
+ composed: true,
637
+ cancelable: true
638
+ })
639
+ );
640
+ }
641
+ }
352
642
  /**
353
643
  * Creates the dropdown trigger for collapsed breadcrumbs.
354
644
  * @param {boolean} isBreakpointMenuIndicator Whether this trigger controls the full breakpoint menu.
@@ -393,11 +683,20 @@ class Breadcrumb extends WJElement {
393
683
  const nodes = Array.from(breadcrumb.childNodes).map((node) => node.cloneNode(true));
394
684
  menuItem.replaceChildren(...nodes);
395
685
  if (menuItem.textContent.trim()) return;
396
- const label = this.getCollapsedMenuItemLabel(breadcrumb);
686
+ const label = this.getBreadcrumbLabel(breadcrumb);
397
687
  if (label) {
398
688
  menuItem.append(document.createTextNode(label));
399
689
  }
400
690
  }
691
+ /**
692
+ * Resolves a readable label for a breadcrumb item.
693
+ * @param {HTMLElement|null} breadcrumb Source breadcrumb.
694
+ * @returns {string}
695
+ */
696
+ getBreadcrumbLabel(breadcrumb) {
697
+ if (!breadcrumb) return "";
698
+ return this.getCollapsedMenuItemLabel(breadcrumb);
699
+ }
401
700
  /**
402
701
  * Resolves a readable label for icon-only collapsed menu items.
403
702
  * @param {HTMLElement} breadcrumb Source breadcrumb.
@@ -1 +1 @@
1
- {"version":3,"file":"wje-breadcrumb.js","sources":["../packages/wje-breadcrumb/breadcrumb.element.js","../packages/wje-breadcrumb/breadcrumb.js"],"sourcesContent":["import { default as WJElement, event, WjElementUtils } from '../wje-element/element.js';\nimport styles from './styles/styles.css?inline';\n\n/**\n * @summary This class represents a Breadcrumb element, extending the WJElement class. It provides a navigational aid in user interfaces, displaying the current location within a hierarchy.\n * @documentation https://elements.webjet.sk/components/breadcrumb\n * @status stable\n * @augments WJElement\n * @slot - The main content of the breadcrumb.\n * @slot start - Slot for content at the start of the breadcrumb.\n * @slot end - Slot for content at the end of the breadcrumb.\n * @slot separator - Slot for a custom separator between breadcrumb items.\n * @csspart native - The native wrapper of the breadcrumb component.\n * @csspart separator - The separator between breadcrumb items.\n * @cssproperty [--wje-breadcrumb-a=var(--wje-color-contrast-8)] - The color of the breadcrumb text.\n * @cssproperty [--wje-breadcrumb-a-hover=var(--wje-color-contrast-6)] - The color of the breadcrumb separator line.\n * @cssproperty [--wje-breadcrumb-line-height=1.5] - Controls the vertical rhythm of breadcrumb text.\n * @cssproperty [--wje-breadcrumb-native-line-height=var(--wje-breadcrumb-line-height)] - Controls the line height of the native breadcrumb wrapper.\n * @cssproperty [--wje-breadcrumb-native-margin=0] - Sets outer spacing around the native breadcrumb wrapper.\n * @cssproperty [--wje-breadcrumb-native-padding=0.25rem 0.75rem] - Sets inner spacing inside the native breadcrumb wrapper.\n * @cssproperty [--wje-breadcrumb-margin=var(--wje-breadcrumb-native-margin)] - Backwards-compatible alias for native breadcrumb margin.\n * @cssproperty [--wje-breadcrumb-padding=var(--wje-breadcrumb-native-padding)] - Backwards-compatible alias for native breadcrumb padding.\n * @tag wje-breadcrumb\n */\nexport default class Breadcrumb extends WJElement {\n /**\n * Breadcrumb constructor method.\n */\n constructor() {\n super();\n\n this._showSeparator = true;\n this._showCollapsedIndicator = false;\n this.handleNativeClick = (e) => this.handleDisabledNativeClick(e);\n }\n\n /**\n * Sets the breadcrumb link URL.\n * @param {string|null} value Link URL.\n */\n set href(value) {\n if (value === null || value === undefined) this.removeAttribute('href');\n else this.setAttribute('href', value);\n }\n\n /**\n * Gets the breadcrumb link URL.\n * @returns {string|null}\n */\n get href() {\n return this.getAttribute('href');\n }\n\n /**\n * Sets the disabled state.\n * @param {boolean} value Disabled state.\n */\n set disabled(value) {\n if (value === true || value === '' || value === 'true' || value === 1 || value === '1') {\n this.setAttribute('disabled', '');\n } else {\n this.removeAttribute('disabled');\n }\n }\n\n /**\n * Gets the disabled state.\n * @returns {boolean}\n */\n get disabled() {\n return this.hasAttribute('disabled');\n }\n\n /**\n * Get show separator flag.\n * @returns {boolean} showSeparator - The show separator flag\n */\n get showSeparator() {\n return this._showSeparator;\n }\n\n /**\n * Set show separator flag.\n * @param {boolean} value The value to set\n */\n set showSeparator(value) {\n this._showSeparator = value;\n }\n\n /**\n * Set collapsed variant.\n * @param {string} value The value to set\n */\n set collapsedVariant(value) {\n this._collapsedVariant = value;\n }\n\n /**\n * Get collapsed variant.\n * @returns {string} The collapsed variant value in uppercase.\n */\n get collapsedVariant() {\n let variant = this.parentElement?.collapsedVariant || this.parentElement?.variant || this._collapsedVariant || 'button';\n return variant.toUpperCase();\n }\n\n /**\n * Class name for the Breadcrumb element.\n * @type {string}\n */\n className = 'Breadcrumb';\n\n /**\n * Get CSS stylesheet for the Breadcrumb element.\n * @static\n * @returns {object} styles - The CSS styles\n */\n static get cssStyleSheet() {\n return styles;\n }\n\n /**\n * Get observed attributes for the Breadcrumb element.\n * @static\n * @returns {Array<string>} - The observed attributes array for the Breadcrumb element.\n */\n static get observedAttributes() {\n return ['show-collapsed-indicator', 'collapsed', 'last', 'href', 'target', 'rel', 'download', 'disabled', 'title', 'aria-label'];\n }\n\n /**\n * Handles attribute changes for the custom element and updates its behavior or appearance accordingly.\n * @param {string} name The name of the attribute that was changed.\n * @param {string|null} oldValue The previous value of the attribute before it was changed. Null if the attribute was not previously set.\n * @param {string|null} newValue The new value of the attribute after it was changed. Null if the attribute was removed.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (oldValue === newValue) return;\n\n if (name === 'collapsed') {\n const isCollapsed = newValue !== null && WjElementUtils.stringToBoolean(newValue);\n\n this.classList.toggle('collapsed', isCollapsed && !this.hasAttribute('show-collapsed-indicator'));\n\n } else if (name === 'show-collapsed-indicator') {\n super.attributeChangedCallback?.(name, oldValue, newValue);\n const isOn = newValue !== null && WjElementUtils.stringToBoolean(newValue);\n this._showCollapsedIndicator = isOn;\n this.classList.toggle('collapsed', this.hasAttribute('collapsed') && !isOn);\n this.refresh();\n\n } else if (name === 'last') {\n super.attributeChangedCallback?.(name, oldValue, newValue);\n const isLast = newValue !== null && WjElementUtils.stringToBoolean(newValue);\n this.active = isLast;\n this.showSeparator = !isLast;\n this.syncAria();\n this.syncNativeAttributes();\n this.refresh();\n } else {\n this.syncAria();\n this.syncNativeAttributes();\n }\n }\n\n /**\n * Setup attributes for the Breadcrumb element.\n */\n setupAttributes() {\n this.isShadowRoot = 'open';\n this.syncAria();\n }\n\n syncAria() {\n this.setAriaState({ role: 'link' });\n if (this.active) this.setAriaState({ current: 'page' });\n else this.removeAttribute('aria-current');\n\n if (this.disabled) this.setAriaState({ disabled: true });\n else this.removeAttribute('aria-disabled');\n }\n\n /**\n * Draw method for the Breadcrumb element.\n * @returns {object} fragment - The document fragment\n */\n draw() {\n let fragment = document.createDocumentFragment();\n\n let native = document.createElement('a');\n native.classList.add('native-breadcrumb');\n native.setAttribute('part', 'native');\n\n this.native = native;\n this.syncNativeAttributes();\n\n let slot = document.createElement('slot');\n\n let start = document.createElement('slot');\n start.setAttribute('name', 'start');\n\n let end = document.createElement('slot');\n end.setAttribute('name', 'end');\n\n native.append(start, slot, end);\n\n // APPEND\n fragment.append(native);\n\n if (WjElementUtils.stringToBoolean(this._showCollapsedIndicator)) {\n // pridame button za native element\n fragment.append(this.drawCollapsedIndicator());\n\n // skryjeme native element\n native.classList.add('hidden');\n }\n\n if (this.shouldRenderSeparator()) {\n let separator = document.createElement('span');\n separator.classList.add('separator');\n separator.setAttribute('part', 'separator');\n\n if (WjElementUtils.hasSlot(this, 'separator')) {\n let slotSeparator = document.createElement('slot');\n slotSeparator.setAttribute('name', 'separator');\n\n separator.append(slotSeparator);\n } else {\n separator.innerHTML = `<wje-icon name=${this.separator || 'chevron-right'}></wje-icon>`;\n }\n\n fragment.append(separator);\n }\n\n return fragment;\n }\n\n /**\n * Returns whether the separator should be visible after this breadcrumb.\n * @returns {boolean}\n */\n shouldRenderSeparator() {\n return this.showSeparator && this.hasVisibleBreadcrumbAfter();\n }\n\n /**\n * Returns whether any later breadcrumb is still visible in the rendered trail.\n * @returns {boolean}\n */\n hasVisibleBreadcrumbAfter() {\n const breadcrumbs = this.parentElement?.getBreadcrumbs?.();\n\n if (!Array.isArray(breadcrumbs)) return true;\n\n const index = breadcrumbs.indexOf(this);\n\n if (index === -1) return true;\n\n return breadcrumbs.slice(index + 1).some((breadcrumb) => this.isBreadcrumbVisibleInTrail(breadcrumb));\n }\n\n /**\n * Returns whether a breadcrumb is visible in the rendered trail.\n * @param {Element} breadcrumb Breadcrumb element to inspect.\n * @returns {boolean}\n */\n isBreadcrumbVisibleInTrail(breadcrumb) {\n return !(breadcrumb?.hasAttribute?.('collapsed') && !breadcrumb?.hasAttribute?.('show-collapsed-indicator'));\n }\n\n /**\n * Synchronizes host attributes to the internal anchor.\n */\n syncNativeAttributes() {\n const native = this.native || this.context?.querySelector('a.native-breadcrumb');\n if (!native) return;\n\n const isDisabled = this.disabled;\n const href = this.href;\n\n if (href !== null && href !== undefined && !isDisabled) {\n native.setAttribute('href', href);\n } else {\n native.removeAttribute('href');\n }\n\n ['target', 'rel', 'download'].forEach((attr) => {\n if (this.hasAttribute(attr) && !isDisabled) {\n native.setAttribute(attr, this.getAttribute(attr));\n } else {\n native.removeAttribute(attr);\n }\n });\n\n ['title', 'aria-label'].forEach((attr) => {\n if (this.hasAttribute(attr)) {\n native.setAttribute(attr, this.getAttribute(attr));\n } else {\n native.removeAttribute(attr);\n }\n });\n\n native.classList.toggle('active', Boolean(this.active));\n native.classList.toggle('disabled', isDisabled);\n\n if (this.active) native.setAttribute('aria-current', 'page');\n else native.removeAttribute('aria-current');\n\n if (isDisabled) {\n native.setAttribute('aria-disabled', 'true');\n native.setAttribute('tabindex', '-1');\n } else {\n native.removeAttribute('aria-disabled');\n native.removeAttribute('tabindex');\n }\n }\n\n /**\n * Sets up native anchor listeners after render.\n */\n afterDraw() {\n this.native?.addEventListener('click', this.handleNativeClick);\n }\n\n /**\n * Removes native anchor listeners before redraw/disconnect.\n */\n beforeDisconnect() {\n this.native?.removeEventListener('click', this.handleNativeClick);\n }\n\n /**\n * Prevents disabled breadcrumbs from navigating or bubbling click handlers.\n * @param {MouseEvent} e Click event.\n */\n handleDisabledNativeClick(e) {\n if (!this.disabled) return;\n\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation?.();\n }\n\n /**\n * Renders the collapsed indicator based on the current collapsed variant.\n * If the collapsed variant is 'DROPDOWN', it invokes the collapseDropdown method.\n * Otherwise, it invokes the collapseButton method.\n * @returns {any} The rendered collapsed indicator, either as a dropdown or a button.\n */\n drawCollapsedIndicator() {\n let collapsedIndicator = null;\n\n if (this.collapsedVariant === 'DROPDOWN') {\n collapsedIndicator = this.collapseDropdown();\n } else {\n collapsedIndicator = this.collapseButton();\n }\n\n return collapsedIndicator;\n }\n\n /**\n * Creates and returns a dropdown UI component for collapsed breadcrumbs.\n * This method generates a dropdown element with a button trigger and a menu populated with items corresponding\n * to the collapsed breadcrumbs. The dropdown is configured to handle specific interactions and ensure that\n * events are appropriately managed to avoid propagation issues. Menu items are linked to their corresponding\n * breadcrumbs, enabling the same functionality as clicking on the original breadcrumb.\n * @returns {HTMLElement} A configured dropdown element containing a button as trigger and a menu with breadcrumb items.\n */\n collapseDropdown() {\n const isBreakpointMenuIndicator = this.isBreakpointMenuIndicator();\n\n let dropdown = document.createElement('wje-dropdown');\n dropdown.setAttribute('placement', isBreakpointMenuIndicator ? 'bottom-start' : 'bottom');\n dropdown.setAttribute('offset', '10');\n\n const trigger = this.createCollapsedDropdownTrigger(isBreakpointMenuIndicator);\n\n let menu = document.createElement('wje-menu');\n menu.setAttribute('variant', 'context');\n menu.style.setProperty('--wje-menu-item-justify-content', 'flex-start');\n\n menu.addEventListener('click', (e) => {\n e.stopPropagation();\n e.stopImmediatePropagation?.();\n });\n\n this.getBreadcrumbs().getBreadcrumbsCollapsed().forEach((b) => {\n let menuItem = document.createElement('wje-menu-item');\n this.populateCollapsedMenuItem(menuItem, b);\n\n menuItem.__breadcrumb = b;\n\n menuItem.addEventListener('wje-menu-item:click', (e) => {\n e.preventDefault?.();\n e.stopPropagation();\n e.stopImmediatePropagation?.();\n\n const breadcrumb = e.currentTarget.__breadcrumb;\n if (!breadcrumb) return;\n\n // Prefer clicking the internal anchor (same behavior as real user click), fallback to host click.\n const native = breadcrumb.native || breadcrumb.context?.querySelector('a.native-breadcrumb');\n if (native && typeof native.click === 'function') {\n native.click();\n } else if (typeof breadcrumb.click === 'function') {\n breadcrumb.click();\n } else {\n breadcrumb.dispatchEvent(\n new MouseEvent('click', {\n bubbles: true,\n composed: true,\n cancelable: true\n })\n );\n }\n });\n\n menu.append(menuItem);\n });\n\n dropdown.append(trigger, menu);\n\n return dropdown;\n }\n\n /**\n * Creates the dropdown trigger for collapsed breadcrumbs.\n * @param {boolean} isBreakpointMenuIndicator Whether this trigger controls the full breakpoint menu.\n * @returns {HTMLElement}\n */\n createCollapsedDropdownTrigger(isBreakpointMenuIndicator) {\n if (isBreakpointMenuIndicator) {\n const customTrigger = this.getBreadcrumbs()?.getBreakpointCollapseTrigger?.();\n\n if (customTrigger) {\n const trigger = customTrigger.cloneNode(true);\n trigger.setAttribute('slot', 'trigger');\n\n if (!trigger.hasAttribute('aria-label')) {\n trigger.setAttribute('aria-label', 'Show breadcrumb menu');\n }\n\n return trigger;\n }\n }\n\n let button = document.createElement('wje-button');\n button.setAttribute('slot', 'trigger');\n button.setAttribute('fill', 'link');\n button.setAttribute('aria-label', 'Show more breadcrumbs');\n button.innerHTML = `<wje-icon name=\"${this.getCollapsedDropdownIcon(isBreakpointMenuIndicator)}\"></wje-icon>`;\n\n return button;\n }\n\n /**\n * Resolves the icon used by the default dropdown trigger.\n * @param {boolean} isBreakpointMenuIndicator Whether this trigger controls the full breakpoint menu.\n * @returns {string}\n */\n getCollapsedDropdownIcon(isBreakpointMenuIndicator) {\n if (!isBreakpointMenuIndicator) return 'dots';\n\n return this.getBreadcrumbs()?.breakpointCollapseIcon || 'menu';\n }\n\n /**\n * Copies breadcrumb content into a collapsed menu item.\n * @param {HTMLElement} menuItem Menu item receiving the content.\n * @param {HTMLElement} breadcrumb Source breadcrumb.\n */\n populateCollapsedMenuItem(menuItem, breadcrumb) {\n const nodes = Array.from(breadcrumb.childNodes).map((node) => node.cloneNode(true));\n\n menuItem.replaceChildren(...nodes);\n\n if (menuItem.textContent.trim()) return;\n\n const label = this.getCollapsedMenuItemLabel(breadcrumb);\n\n if (label) {\n menuItem.append(document.createTextNode(label));\n }\n }\n\n /**\n * Resolves a readable label for icon-only collapsed menu items.\n * @param {HTMLElement} breadcrumb Source breadcrumb.\n * @returns {string}\n */\n getCollapsedMenuItemLabel(breadcrumb) {\n const explicitLabel = breadcrumb.getAttribute('aria-label') || breadcrumb.getAttribute('title');\n\n if (explicitLabel?.trim()) return explicitLabel.trim();\n\n const text = breadcrumb.textContent.trim();\n\n if (text) return text;\n\n const iconName = breadcrumb.querySelector('wje-icon[slot=\"start\"]')?.getAttribute('name');\n\n if (iconName === 'home') return 'Home';\n\n const href = breadcrumb.getAttribute('href');\n const path = href?.split(/[?#]/)[0] || '';\n const segment = path.split('/').filter(Boolean).pop();\n\n return segment ? this.humanizeCollapsedMenuItemLabel(segment) : '';\n }\n\n /**\n * Turns a URL segment into a readable menu label.\n * @param {string} value URL segment.\n * @returns {string}\n */\n humanizeCollapsedMenuItemLabel(value) {\n return decodeURIComponent(value)\n .replace(/[-_]+/g, ' ')\n .replace(/\\b\\w/g, (letter) => letter.toUpperCase());\n }\n\n /**\n * Returns whether this collapsed indicator represents the full breakpoint menu.\n * @returns {boolean}\n */\n isBreakpointMenuIndicator() {\n const breadcrumbs = this.parentElement;\n\n return (\n this.hasAttribute('show-collapsed-indicator') &&\n this.hasAttribute('collapsed') &&\n breadcrumbs?.isBreakpointMenuCollapseActive?.()\n );\n }\n\n /**\n * Creates a button element that expands hidden breadcrumbs when clicked.\n * The button is set with appropriate attributes and event listeners to handle\n * the expanding of hidden breadcrumb elements. Clicking the button will remove\n * the button itself, reveal hidden breadcrumbs, and stop the current event\n * propagation.\n * @returns {HTMLButtonElement} The created button configured to expand breadcrumbs.\n */\n collapseButton() {\n let button = document.createElement('button');\n button.setAttribute('aria-label', 'Show more breadcrumbs');\n button.setAttribute('part', 'collapsed-indicator');\n button.innerHTML = `<wje-icon name=\"dots\"></wje-icon>`;\n\n event.addListener(button, 'click', null, (e) => {\n this.native.classList.remove('hidden');\n button.remove();\n this.getBreadcrumbs().getBreadcrumbsCollapsed().forEach((el) => {\n el.classList.remove('collapsed');\n });\n e.stopPropagation();\n });\n\n return button;\n }\n\n /**\n * Retrieves the breadcrumb trail for the current element by returning its parent element.\n * @returns {Element} The parent element representing the breadcrumb trail.\n */\n getBreadcrumbs() {\n return this.parentElement;\n }\n}\n","import Breadcrumb from './breadcrumb.element.js';\nimport '../wje-button/button.js';\nimport '../wje-dropdown/dropdown.js';\nimport '../wje-icon/icon.js';\nimport '../wje-menu/menu.js';\nimport '../wje-menu-item/menu-item.js';\nimport '../wje-popup/popup.js';\nimport '../wje-tooltip/tooltip.js';\n\n// export * from \"./breadcrumb.element.js\";\nexport default Breadcrumb;\n\nBreadcrumb.define('wje-breadcrumb', Breadcrumb);\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wje-breadcrumb.js","sources":["../packages/wje-breadcrumb/breadcrumb.element.js","../packages/wje-breadcrumb/breadcrumb.js"],"sourcesContent":["import { default as WJElement, event, WjElementUtils } from '../wje-element/element.js';\nimport styles from './styles/styles.css?inline';\n\nconst MOBILE_COLLAPSED_VARIANTS = new Set(['TEXT', 'BACK', 'PARENT-TITLE', 'MENU-TITLE', 'SHEET']);\n\n/**\n * @summary This class represents a Breadcrumb element, extending the WJElement class. It provides a navigational aid in user interfaces, displaying the current location within a hierarchy.\n * @documentation https://elements.webjet.sk/components/breadcrumb\n * @status stable\n * @augments WJElement\n * @slot - The main content of the breadcrumb.\n * @slot start - Slot for content at the start of the breadcrumb.\n * @slot end - Slot for content at the end of the breadcrumb.\n * @slot separator - Slot for a custom separator between breadcrumb items.\n * @csspart native - The native wrapper of the breadcrumb component.\n * @csspart separator - The separator between breadcrumb items.\n * @cssproperty [--wje-breadcrumb-a=var(--wje-color-contrast-8)] - The color of the breadcrumb text.\n * @cssproperty [--wje-breadcrumb-a-hover=var(--wje-color-contrast-6)] - The color of the breadcrumb separator line.\n * @cssproperty [--wje-breadcrumb-line-height=1.5] - Controls the vertical rhythm of breadcrumb text.\n * @cssproperty [--wje-breadcrumb-native-line-height=var(--wje-breadcrumb-line-height)] - Controls the line height of the native breadcrumb wrapper.\n * @cssproperty [--wje-breadcrumb-native-margin=0] - Sets outer spacing around the native breadcrumb wrapper.\n * @cssproperty [--wje-breadcrumb-native-padding=0.25rem 0.75rem] - Sets inner spacing inside the native breadcrumb wrapper.\n * @cssproperty [--wje-breadcrumb-margin=var(--wje-breadcrumb-native-margin)] - Backwards-compatible alias for native breadcrumb margin.\n * @cssproperty [--wje-breadcrumb-padding=var(--wje-breadcrumb-native-padding)] - Backwards-compatible alias for native breadcrumb padding.\n * @tag wje-breadcrumb\n */\nexport default class Breadcrumb extends WJElement {\n /**\n * Breadcrumb constructor method.\n */\n constructor() {\n super();\n\n this._showSeparator = true;\n this._showCollapsedIndicator = false;\n this.handleNativeClick = (e) => this.handleDisabledNativeClick(e);\n }\n\n /**\n * Sets the breadcrumb link URL.\n * @param {string|null} value Link URL.\n */\n set href(value) {\n if (value === null || value === undefined) this.removeAttribute('href');\n else this.setAttribute('href', value);\n }\n\n /**\n * Gets the breadcrumb link URL.\n * @returns {string|null}\n */\n get href() {\n return this.getAttribute('href');\n }\n\n /**\n * Sets the disabled state.\n * @param {boolean} value Disabled state.\n */\n set disabled(value) {\n if (value === true || value === '' || value === 'true' || value === 1 || value === '1') {\n this.setAttribute('disabled', '');\n } else {\n this.removeAttribute('disabled');\n }\n }\n\n /**\n * Gets the disabled state.\n * @returns {boolean}\n */\n get disabled() {\n return this.hasAttribute('disabled');\n }\n\n /**\n * Get show separator flag.\n * @returns {boolean} showSeparator - The show separator flag\n */\n get showSeparator() {\n return this._showSeparator;\n }\n\n /**\n * Set show separator flag.\n * @param {boolean} value The value to set\n */\n set showSeparator(value) {\n this._showSeparator = value;\n }\n\n /**\n * Set collapsed variant.\n * @param {string} value The value to set\n */\n set collapsedVariant(value) {\n this._collapsedVariant = value;\n }\n\n /**\n * Get collapsed variant.\n * @returns {string} The collapsed variant value in uppercase.\n */\n get collapsedVariant() {\n return this.collapsedVariantName.toUpperCase();\n }\n\n /**\n * Get collapsed variant token.\n * @returns {string}\n */\n get collapsedVariantName() {\n return String(this.parentElement?.collapsedVariant || this.parentElement?.variant || this._collapsedVariant || 'button').trim();\n }\n\n /**\n * Class name for the Breadcrumb element.\n * @type {string}\n */\n className = 'Breadcrumb';\n\n /**\n * Get CSS stylesheet for the Breadcrumb element.\n * @static\n * @returns {object} styles - The CSS styles\n */\n static get cssStyleSheet() {\n return styles;\n }\n\n /**\n * Get observed attributes for the Breadcrumb element.\n * @static\n * @returns {Array<string>} - The observed attributes array for the Breadcrumb element.\n */\n static get observedAttributes() {\n return ['show-collapsed-indicator', 'collapsed', 'last', 'href', 'target', 'rel', 'download', 'disabled', 'title', 'aria-label'];\n }\n\n /**\n * Handles attribute changes for the custom element and updates its behavior or appearance accordingly.\n * @param {string} name The name of the attribute that was changed.\n * @param {string|null} oldValue The previous value of the attribute before it was changed. Null if the attribute was not previously set.\n * @param {string|null} newValue The new value of the attribute after it was changed. Null if the attribute was removed.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (oldValue === newValue) return;\n\n if (name === 'collapsed') {\n const isCollapsed = newValue !== null && WjElementUtils.stringToBoolean(newValue);\n\n this.classList.toggle('collapsed', isCollapsed && !this.hasAttribute('show-collapsed-indicator'));\n\n } else if (name === 'show-collapsed-indicator') {\n super.attributeChangedCallback?.(name, oldValue, newValue);\n const isOn = newValue !== null && WjElementUtils.stringToBoolean(newValue);\n this._showCollapsedIndicator = isOn;\n this.classList.toggle('collapsed', this.hasAttribute('collapsed') && !isOn);\n this.refresh();\n\n } else if (name === 'last') {\n super.attributeChangedCallback?.(name, oldValue, newValue);\n const isLast = newValue !== null && WjElementUtils.stringToBoolean(newValue);\n this.active = isLast;\n this.showSeparator = !isLast;\n this.syncAria();\n this.syncNativeAttributes();\n this.refresh();\n } else {\n this.syncAria();\n this.syncNativeAttributes();\n }\n }\n\n /**\n * Setup attributes for the Breadcrumb element.\n */\n setupAttributes() {\n this.isShadowRoot = 'open';\n this.syncAria();\n }\n\n syncAria() {\n this.setAriaState({ role: 'link' });\n if (this.active) this.setAriaState({ current: 'page' });\n else this.removeAttribute('aria-current');\n\n if (this.disabled) this.setAriaState({ disabled: true });\n else this.removeAttribute('aria-disabled');\n }\n\n /**\n * Draw method for the Breadcrumb element.\n * @returns {object} fragment - The document fragment\n */\n draw() {\n let fragment = document.createDocumentFragment();\n\n let native = document.createElement('a');\n native.classList.add('native-breadcrumb');\n native.setAttribute('part', 'native');\n\n this.native = native;\n this.syncNativeAttributes();\n\n let slot = document.createElement('slot');\n\n let start = document.createElement('slot');\n start.setAttribute('name', 'start');\n\n let end = document.createElement('slot');\n end.setAttribute('name', 'end');\n\n native.append(start, slot, end);\n\n // APPEND\n fragment.append(native);\n\n if (WjElementUtils.stringToBoolean(this._showCollapsedIndicator)) {\n // pridame button za native element\n fragment.append(this.drawCollapsedIndicator());\n\n // skryjeme native element\n native.classList.add('hidden');\n }\n\n if (this.shouldRenderSeparator()) {\n let separator = document.createElement('span');\n separator.classList.add('separator');\n separator.setAttribute('part', 'separator');\n\n if (WjElementUtils.hasSlot(this, 'separator')) {\n let slotSeparator = document.createElement('slot');\n slotSeparator.setAttribute('name', 'separator');\n\n separator.append(slotSeparator);\n } else {\n separator.innerHTML = `<wje-icon name=${this.separator || 'chevron-right'}></wje-icon>`;\n }\n\n fragment.append(separator);\n }\n\n return fragment;\n }\n\n /**\n * Returns whether the separator should be visible after this breadcrumb.\n * @returns {boolean}\n */\n shouldRenderSeparator() {\n return this.showSeparator && this.hasVisibleBreadcrumbAfter();\n }\n\n /**\n * Returns whether any later breadcrumb is still visible in the rendered trail.\n * @returns {boolean}\n */\n hasVisibleBreadcrumbAfter() {\n const breadcrumbs = this.parentElement?.getBreadcrumbs?.();\n\n if (!Array.isArray(breadcrumbs)) return true;\n\n const index = breadcrumbs.indexOf(this);\n\n if (index === -1) return true;\n\n return breadcrumbs.slice(index + 1).some((breadcrumb) => this.isBreadcrumbVisibleInTrail(breadcrumb));\n }\n\n /**\n * Returns whether a breadcrumb is visible in the rendered trail.\n * @param {Element} breadcrumb Breadcrumb element to inspect.\n * @returns {boolean}\n */\n isBreadcrumbVisibleInTrail(breadcrumb) {\n return !(breadcrumb?.hasAttribute?.('collapsed') && !breadcrumb?.hasAttribute?.('show-collapsed-indicator'));\n }\n\n /**\n * Synchronizes host attributes to the internal anchor.\n */\n syncNativeAttributes() {\n const native = this.native || this.context?.querySelector('a.native-breadcrumb');\n if (!native) return;\n\n const isDisabled = this.disabled;\n const href = this.href;\n\n if (href !== null && href !== undefined && !isDisabled) {\n native.setAttribute('href', href);\n } else {\n native.removeAttribute('href');\n }\n\n ['target', 'rel', 'download'].forEach((attr) => {\n if (this.hasAttribute(attr) && !isDisabled) {\n native.setAttribute(attr, this.getAttribute(attr));\n } else {\n native.removeAttribute(attr);\n }\n });\n\n ['title', 'aria-label'].forEach((attr) => {\n if (this.hasAttribute(attr)) {\n native.setAttribute(attr, this.getAttribute(attr));\n } else {\n native.removeAttribute(attr);\n }\n });\n\n native.classList.toggle('active', Boolean(this.active));\n native.classList.toggle('disabled', isDisabled);\n\n if (this.active) native.setAttribute('aria-current', 'page');\n else native.removeAttribute('aria-current');\n\n if (isDisabled) {\n native.setAttribute('aria-disabled', 'true');\n native.setAttribute('tabindex', '-1');\n } else {\n native.removeAttribute('aria-disabled');\n native.removeAttribute('tabindex');\n }\n }\n\n /**\n * Sets up native anchor listeners after render.\n */\n afterDraw() {\n this.native?.addEventListener('click', this.handleNativeClick);\n }\n\n /**\n * Removes native anchor listeners before redraw/disconnect.\n */\n beforeDisconnect() {\n this.native?.removeEventListener('click', this.handleNativeClick);\n }\n\n /**\n * Prevents disabled breadcrumbs from navigating or bubbling click handlers.\n * @param {MouseEvent} e Click event.\n */\n handleDisabledNativeClick(e) {\n if (!this.disabled) return;\n\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation?.();\n }\n\n /**\n * Renders the collapsed indicator based on the current collapsed variant.\n * If the collapsed variant is 'DROPDOWN', it invokes the collapseDropdown method.\n * Mobile breakpoint variants render compact breadcrumb summaries, otherwise the default button is used.\n * @returns {any} The rendered collapsed indicator, either as a dropdown or a button.\n */\n drawCollapsedIndicator() {\n const variant = this.collapsedVariant;\n\n if (variant === 'DROPDOWN') {\n return this.collapseDropdown();\n }\n\n if (this.isMobileCollapsedVariant() && this.isBreakpointMenuIndicator()) {\n return this.collapseMobileVariant(variant);\n }\n\n return this.collapseButton();\n }\n\n /**\n * Returns whether the current collapsed variant is a compact mobile layout.\n * @returns {boolean}\n */\n isMobileCollapsedVariant() {\n return MOBILE_COLLAPSED_VARIANTS.has(this.collapsedVariant);\n }\n\n /**\n * Creates and returns a dropdown UI component for collapsed breadcrumbs.\n * This method generates a dropdown element with a button trigger and a menu populated with items corresponding\n * to the collapsed breadcrumbs. The dropdown is configured to handle specific interactions and ensure that\n * events are appropriately managed to avoid propagation issues. Menu items are linked to their corresponding\n * breadcrumbs, enabling the same functionality as clicking on the original breadcrumb.\n * @returns {HTMLElement} A configured dropdown element containing a button as trigger and a menu with breadcrumb items.\n */\n collapseDropdown() {\n const isBreakpointMenuIndicator = this.isBreakpointMenuIndicator();\n const breadcrumbs = this.getCollapsedMenuBreadcrumbs(isBreakpointMenuIndicator);\n const trigger = this.createCollapsedDropdownTrigger(isBreakpointMenuIndicator);\n\n return this.createBreadcrumbDropdown({\n breadcrumbs,\n trigger,\n placement: isBreakpointMenuIndicator ? 'bottom-start' : 'bottom',\n });\n }\n\n /**\n * Creates a dropdown containing breadcrumb menu items.\n * @param {object} options Configuration for the dropdown shell.\n * @param {Array<HTMLElement>} options.breadcrumbs Breadcrumb elements to mirror in the menu.\n * @param {HTMLElement} options.trigger Element assigned to the dropdown trigger slot.\n * @param {string} options.placement Floating UI placement token for the popup.\n * @returns {HTMLElement}\n */\n createBreadcrumbDropdown({ breadcrumbs, trigger, placement = 'bottom' }) {\n const dropdown = document.createElement('wje-dropdown');\n dropdown.setAttribute('placement', placement);\n dropdown.setAttribute('offset', '10');\n\n const menu = this.createCollapsedBreadcrumbMenu(breadcrumbs);\n\n dropdown.append(trigger, menu);\n\n return dropdown;\n }\n\n /**\n * Creates the menu used by collapsed dropdown variants.\n * @param {Array<HTMLElement>} breadcrumbs Breadcrumb items represented by menu items.\n * @returns {HTMLElement}\n */\n createCollapsedBreadcrumbMenu(breadcrumbs) {\n const menu = document.createElement('wje-menu');\n menu.setAttribute('variant', 'context');\n menu.style.setProperty('--wje-menu-item-justify-content', 'flex-start');\n\n menu.addEventListener('click', (e) => {\n e.stopPropagation();\n e.stopImmediatePropagation?.();\n });\n\n breadcrumbs.forEach((breadcrumb) => {\n const menuItem = document.createElement('wje-menu-item');\n this.populateCollapsedMenuItem(menuItem, breadcrumb);\n\n menuItem.__breadcrumb = breadcrumb;\n\n menuItem.addEventListener('wje-menu-item:click', (e) => {\n e.preventDefault?.();\n e.stopPropagation();\n e.stopImmediatePropagation?.();\n\n this.forwardBreadcrumbClick(e.currentTarget.__breadcrumb);\n });\n\n menu.append(menuItem);\n });\n\n return menu;\n }\n\n /**\n * Returns breadcrumbs that should be exposed in a collapsed menu.\n * @param {boolean} isBreakpointMenuIndicator Whether this trigger controls the full breakpoint menu.\n * @returns {Array<HTMLElement>}\n */\n getCollapsedMenuBreadcrumbs(isBreakpointMenuIndicator) {\n const breadcrumbs = this.getBreadcrumbs();\n\n if (isBreakpointMenuIndicator) {\n return breadcrumbs?.getBreadcrumbs?.() || [];\n }\n\n return breadcrumbs?.getBreadcrumbsCollapsed?.() || [];\n }\n\n /**\n * Renders one of the compact mobile breakpoint variants.\n * @param {string} variant Normalized uppercase variant token.\n * @returns {HTMLElement}\n */\n collapseMobileVariant(variant) {\n if (variant === 'TEXT') return this.collapseMobileText();\n if (variant === 'BACK') return this.collapseMobileBack();\n if (variant === 'PARENT-TITLE') return this.collapseMobileParentTitle();\n if (variant === 'MENU-TITLE') return this.collapseMobileMenuTitle();\n if (variant === 'SHEET') return this.collapseMobileSheet();\n\n return this.collapseButton();\n }\n\n /**\n * Renders only the current breadcrumb title.\n * @returns {HTMLElement}\n */\n collapseMobileText() {\n const current = this.getCurrentBreadcrumb();\n const container = this.createMobileContainer('breadcrumb-mobile--text');\n const title = this.createMobileBreadcrumbControl(current, 'breadcrumb-mobile__title', {\n ariaCurrent: true,\n actionable: this.isBreadcrumbActionable(current),\n });\n\n container.append(title);\n\n return container;\n }\n\n /**\n * Renders a parent back action above the current title.\n * @returns {HTMLElement}\n */\n collapseMobileBack() {\n const current = this.getCurrentBreadcrumb();\n const parent = this.getParentBreadcrumb();\n const container = this.createMobileContainer('breadcrumb-mobile--back');\n\n if (parent) {\n const back = this.createMobileBreadcrumbControl(parent, 'breadcrumb-mobile__back', {\n ariaLabel: 'Go to parent',\n icon: 'arrow-left',\n actionable: this.isBreadcrumbActionable(parent),\n });\n container.append(back);\n }\n\n const title = this.createMobileBreadcrumbControl(current, 'breadcrumb-mobile__title', {\n ariaCurrent: true,\n actionable: false,\n });\n container.append(title);\n\n return container;\n }\n\n /**\n * Renders parent context above the current title.\n * @returns {HTMLElement}\n */\n collapseMobileParentTitle() {\n const current = this.getCurrentBreadcrumb();\n const parent = this.getParentBreadcrumb();\n const container = this.createMobileContainer('breadcrumb-mobile--parent-title');\n\n if (parent) {\n const parentControl = this.createMobileBreadcrumbControl(parent, 'breadcrumb-mobile__parent', {\n actionable: this.isBreadcrumbActionable(parent),\n });\n container.append(parentControl);\n }\n\n const title = this.createMobileBreadcrumbControl(current, 'breadcrumb-mobile__title', {\n ariaCurrent: true,\n actionable: false,\n });\n container.append(title);\n\n return container;\n }\n\n /**\n * Renders a menu trigger with the current title.\n * @returns {HTMLElement}\n */\n collapseMobileMenuTitle() {\n const trigger = this.createMobileDropdownTrigger({\n icon: 'dots',\n label: this.getBreadcrumbLabel(this.getCurrentBreadcrumb()),\n ariaLabel: 'Show breadcrumb menu',\n className: 'breadcrumb-mobile--menu-title',\n });\n\n return this.createMobileDropdown(trigger);\n }\n\n /**\n * Renders the future sheet variant using the dropdown fallback for now.\n * @returns {HTMLElement}\n */\n collapseMobileSheet() {\n const trigger = this.createMobileDropdownTrigger({\n icon: 'chevron-down',\n iconPosition: 'end',\n label: this.getBreadcrumbLabel(this.getCurrentBreadcrumb()),\n ariaLabel: 'Show breadcrumb path',\n className: 'breadcrumb-mobile--sheet',\n });\n\n return this.createMobileDropdown(trigger);\n }\n\n /**\n * Creates a dropdown fallback for mobile menu-like variants.\n * @param {HTMLElement} trigger Element that opens the fallback dropdown.\n * @returns {HTMLElement}\n */\n createMobileDropdown(trigger) {\n const dropdown = this.createBreadcrumbDropdown({\n breadcrumbs: this.getTrailBreadcrumbs(),\n trigger,\n placement: 'bottom-start',\n });\n\n dropdown.classList.add('breadcrumb-mobile-dropdown');\n\n return dropdown;\n }\n\n /**\n * Creates a compact mobile dropdown trigger.\n * @param {object} options Visual settings for the compact trigger.\n * @param {string} options.icon Icon shown next to the title.\n * @param {string} options.iconPosition Whether the icon renders at the start or end.\n * @param {string} options.label Current breadcrumb label shown beside the icon.\n * @param {string} options.ariaLabel Accessible name for the dropdown trigger.\n * @param {string} options.className Variant-specific class applied to the trigger.\n * @returns {HTMLElement}\n */\n createMobileDropdownTrigger({ icon, iconPosition = 'start', label, ariaLabel, className }) {\n const trigger = document.createElement('wje-button');\n trigger.setAttribute('slot', 'trigger');\n trigger.setAttribute('fill', 'link');\n trigger.setAttribute('aria-label', ariaLabel);\n trigger.classList.add('breadcrumb-mobile', 'breadcrumb-mobile__menu', className);\n\n const iconElement = document.createElement('wje-icon');\n iconElement.setAttribute('name', icon);\n iconElement.setAttribute('slot', iconPosition === 'end' ? 'end' : 'start');\n iconElement.classList.add('breadcrumb-mobile__icon');\n\n const title = document.createElement('span');\n title.classList.add('breadcrumb-mobile__title');\n title.setAttribute('aria-current', 'page');\n title.textContent = label;\n if (label) title.setAttribute('title', label);\n\n if (iconPosition === 'end') {\n trigger.append(title, iconElement);\n } else {\n trigger.append(iconElement, title);\n }\n\n return trigger;\n }\n\n /**\n * Creates a wrapper for compact mobile breadcrumb variants.\n * @param {string} className Variant class.\n * @returns {HTMLElement}\n */\n createMobileContainer(className) {\n const container = document.createElement('div');\n container.classList.add('breadcrumb-mobile', className);\n\n return container;\n }\n\n /**\n * Creates a text or button control for a breadcrumb.\n * @param {HTMLElement|null} breadcrumb Source breadcrumb.\n * @param {string} className Class applied to the created control.\n * @param {object} options Behavior and accessibility settings for the control.\n * @param {boolean} options.actionable Whether clicks should forward to the source breadcrumb.\n * @param {boolean} options.ariaCurrent Whether the control marks the current page.\n * @param {string} options.ariaLabel Accessible name for action controls.\n * @param {string} options.icon Optional icon shown before the label.\n * @returns {HTMLElement}\n */\n createMobileBreadcrumbControl(breadcrumb, className, { actionable = false, ariaCurrent = false, ariaLabel, icon } = {}) {\n const label = this.getBreadcrumbLabel(breadcrumb);\n const control = document.createElement(actionable ? 'button' : 'span');\n\n control.classList.add(className);\n if (actionable) {\n control.setAttribute('type', 'button');\n control.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation?.();\n this.forwardBreadcrumbClick(breadcrumb);\n });\n }\n\n if (ariaCurrent) control.setAttribute('aria-current', 'page');\n if (ariaLabel && actionable) control.setAttribute('aria-label', ariaLabel);\n if (label) control.setAttribute('title', label);\n\n if (icon) {\n const iconElement = document.createElement('wje-icon');\n iconElement.setAttribute('name', icon);\n iconElement.classList.add('breadcrumb-mobile__icon');\n control.append(iconElement);\n }\n\n const text = document.createElement('span');\n text.classList.add('breadcrumb-mobile__label');\n text.textContent = label;\n control.append(text);\n\n return control;\n }\n\n /**\n * Returns the full trail of sibling breadcrumbs.\n * @returns {Array<HTMLElement>}\n */\n getTrailBreadcrumbs() {\n return this.getBreadcrumbs()?.getBreadcrumbs?.() || [];\n }\n\n /**\n * Returns the current breadcrumb item.\n * @returns {HTMLElement|null}\n */\n getCurrentBreadcrumb() {\n const breadcrumbs = this.getTrailBreadcrumbs();\n\n return breadcrumbs[breadcrumbs.length - 1] || null;\n }\n\n /**\n * Returns the parent breadcrumb item.\n * @returns {HTMLElement|null}\n */\n getParentBreadcrumb() {\n const breadcrumbs = this.getTrailBreadcrumbs();\n\n return breadcrumbs.length > 1 ? breadcrumbs[breadcrumbs.length - 2] : null;\n }\n\n /**\n * Returns whether a breadcrumb has a known action to forward.\n * @param {HTMLElement|null} breadcrumb Breadcrumb to inspect.\n * @returns {boolean}\n */\n isBreadcrumbActionable(breadcrumb) {\n if (!breadcrumb || breadcrumb.disabled || breadcrumb.hasAttribute?.('disabled')) return false;\n\n return Boolean(\n breadcrumb.hasAttribute?.('href') ||\n breadcrumb.hasAttribute?.('onclick') ||\n breadcrumb.__wjeBreadcrumbManaged ||\n breadcrumb.hasAttribute?.('data-wje-breadcrumbs-item')\n );\n }\n\n /**\n * Forwards a compact control or menu item click to the original breadcrumb.\n * @param {HTMLElement|null} breadcrumb Source breadcrumb.\n */\n forwardBreadcrumbClick(breadcrumb) {\n if (!breadcrumb) return;\n\n const native = breadcrumb.native || breadcrumb.context?.querySelector('a.native-breadcrumb');\n if (native && typeof native.click === 'function') {\n native.click();\n } else if (typeof breadcrumb.click === 'function') {\n breadcrumb.click();\n } else {\n breadcrumb.dispatchEvent(\n new MouseEvent('click', {\n bubbles: true,\n composed: true,\n cancelable: true\n })\n );\n }\n }\n\n /**\n * Creates the dropdown trigger for collapsed breadcrumbs.\n * @param {boolean} isBreakpointMenuIndicator Whether this trigger controls the full breakpoint menu.\n * @returns {HTMLElement}\n */\n createCollapsedDropdownTrigger(isBreakpointMenuIndicator) {\n if (isBreakpointMenuIndicator) {\n const customTrigger = this.getBreadcrumbs()?.getBreakpointCollapseTrigger?.();\n\n if (customTrigger) {\n const trigger = customTrigger.cloneNode(true);\n trigger.setAttribute('slot', 'trigger');\n\n if (!trigger.hasAttribute('aria-label')) {\n trigger.setAttribute('aria-label', 'Show breadcrumb menu');\n }\n\n return trigger;\n }\n }\n\n let button = document.createElement('wje-button');\n button.setAttribute('slot', 'trigger');\n button.setAttribute('fill', 'link');\n button.setAttribute('aria-label', 'Show more breadcrumbs');\n button.innerHTML = `<wje-icon name=\"${this.getCollapsedDropdownIcon(isBreakpointMenuIndicator)}\"></wje-icon>`;\n\n return button;\n }\n\n /**\n * Resolves the icon used by the default dropdown trigger.\n * @param {boolean} isBreakpointMenuIndicator Whether this trigger controls the full breakpoint menu.\n * @returns {string}\n */\n getCollapsedDropdownIcon(isBreakpointMenuIndicator) {\n if (!isBreakpointMenuIndicator) return 'dots';\n\n return this.getBreadcrumbs()?.breakpointCollapseIcon || 'menu';\n }\n\n /**\n * Copies breadcrumb content into a collapsed menu item.\n * @param {HTMLElement} menuItem Menu item receiving the content.\n * @param {HTMLElement} breadcrumb Source breadcrumb.\n */\n populateCollapsedMenuItem(menuItem, breadcrumb) {\n const nodes = Array.from(breadcrumb.childNodes).map((node) => node.cloneNode(true));\n\n menuItem.replaceChildren(...nodes);\n\n if (menuItem.textContent.trim()) return;\n\n const label = this.getBreadcrumbLabel(breadcrumb);\n\n if (label) {\n menuItem.append(document.createTextNode(label));\n }\n }\n\n /**\n * Resolves a readable label for a breadcrumb item.\n * @param {HTMLElement|null} breadcrumb Source breadcrumb.\n * @returns {string}\n */\n getBreadcrumbLabel(breadcrumb) {\n if (!breadcrumb) return '';\n\n return this.getCollapsedMenuItemLabel(breadcrumb);\n }\n\n /**\n * Resolves a readable label for icon-only collapsed menu items.\n * @param {HTMLElement} breadcrumb Source breadcrumb.\n * @returns {string}\n */\n getCollapsedMenuItemLabel(breadcrumb) {\n const explicitLabel = breadcrumb.getAttribute('aria-label') || breadcrumb.getAttribute('title');\n\n if (explicitLabel?.trim()) return explicitLabel.trim();\n\n const text = breadcrumb.textContent.trim();\n\n if (text) return text;\n\n const iconName = breadcrumb.querySelector('wje-icon[slot=\"start\"]')?.getAttribute('name');\n\n if (iconName === 'home') return 'Home';\n\n const href = breadcrumb.getAttribute('href');\n const path = href?.split(/[?#]/)[0] || '';\n const segment = path.split('/').filter(Boolean).pop();\n\n return segment ? this.humanizeCollapsedMenuItemLabel(segment) : '';\n }\n\n /**\n * Turns a URL segment into a readable menu label.\n * @param {string} value URL segment.\n * @returns {string}\n */\n humanizeCollapsedMenuItemLabel(value) {\n return decodeURIComponent(value)\n .replace(/[-_]+/g, ' ')\n .replace(/\\b\\w/g, (letter) => letter.toUpperCase());\n }\n\n /**\n * Returns whether this collapsed indicator represents the full breakpoint menu.\n * @returns {boolean}\n */\n isBreakpointMenuIndicator() {\n const breadcrumbs = this.parentElement;\n\n return (\n this.hasAttribute('show-collapsed-indicator') &&\n this.hasAttribute('collapsed') &&\n breadcrumbs?.isBreakpointMenuCollapseActive?.()\n );\n }\n\n /**\n * Creates a button element that expands hidden breadcrumbs when clicked.\n * The button is set with appropriate attributes and event listeners to handle\n * the expanding of hidden breadcrumb elements. Clicking the button will remove\n * the button itself, reveal hidden breadcrumbs, and stop the current event\n * propagation.\n * @returns {HTMLButtonElement} The created button configured to expand breadcrumbs.\n */\n collapseButton() {\n let button = document.createElement('button');\n button.setAttribute('aria-label', 'Show more breadcrumbs');\n button.setAttribute('part', 'collapsed-indicator');\n button.innerHTML = `<wje-icon name=\"dots\"></wje-icon>`;\n\n event.addListener(button, 'click', null, (e) => {\n this.native.classList.remove('hidden');\n button.remove();\n this.getBreadcrumbs().getBreadcrumbsCollapsed().forEach((el) => {\n el.classList.remove('collapsed');\n });\n e.stopPropagation();\n });\n\n return button;\n }\n\n /**\n * Retrieves the breadcrumb trail for the current element by returning its parent element.\n * @returns {Element} The parent element representing the breadcrumb trail.\n */\n getBreadcrumbs() {\n return this.parentElement;\n }\n}\n","import Breadcrumb from './breadcrumb.element.js';\nimport '../wje-button/button.js';\nimport '../wje-dropdown/dropdown.js';\nimport '../wje-icon/icon.js';\nimport '../wje-menu/menu.js';\nimport '../wje-menu-item/menu-item.js';\nimport '../wje-popup/popup.js';\nimport '../wje-tooltip/tooltip.js';\n\n// export * from \"./breadcrumb.element.js\";\nexport default Breadcrumb;\n\nBreadcrumb.define('wje-breadcrumb', Breadcrumb);\n"],"names":[],"mappings":"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"}