wj-elements 0.5.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/light.css +6 -0
- package/dist/packages/wje-breadcrumb/breadcrumb.element.d.ts +57 -0
- package/dist/packages/wje-breadcrumbs/breadcrumbs.element.d.ts +56 -0
- package/dist/wje-breadcrumb.js +136 -10
- package/dist/wje-breadcrumb.js.map +1 -1
- package/dist/wje-breadcrumbs.js +113 -2
- package/dist/wje-breadcrumbs.js.map +1 -1
- package/dist/wje-menu-item.js +1 -1
- package/package.json +2 -2
package/dist/light.css
CHANGED
|
@@ -270,6 +270,12 @@
|
|
|
270
270
|
--wje-breadcrumb-font-size: var(--wje-font-size);
|
|
271
271
|
--wje-breadcrumb-active-font-weight: var(--wje-font-weight-bold);
|
|
272
272
|
--wje-breadcrumb-active-font-size: var(--wje-font-size);
|
|
273
|
+
--wje-breadcrumb-line-height: var(--wje-line-height-normal);
|
|
274
|
+
--wje-breadcrumb-native-line-height: var(--wje-breadcrumb-line-height);
|
|
275
|
+
--wje-breadcrumb-native-margin: 0;
|
|
276
|
+
--wje-breadcrumb-native-padding: var(--wje-spacing-3x-small) var(--wje-spacing-small);
|
|
277
|
+
--wje-breadcrumb-margin: var(--wje-breadcrumb-native-margin);
|
|
278
|
+
--wje-breadcrumb-padding: var(--wje-breadcrumb-native-padding);
|
|
273
279
|
--wje-breadcrumb-a: var(--wje-color-contrast-8);
|
|
274
280
|
--wje-breadcrumb-a-hover: var(--wje-color-contrast-6);
|
|
275
281
|
|
|
@@ -12,6 +12,12 @@ import { default as WJElement } from '../wje-element/element.js';
|
|
|
12
12
|
* @csspart separator - The separator between breadcrumb items.
|
|
13
13
|
* @cssproperty [--wje-breadcrumb-a=var(--wje-color-contrast-8)] - The color of the breadcrumb text.
|
|
14
14
|
* @cssproperty [--wje-breadcrumb-a-hover=var(--wje-color-contrast-6)] - The color of the breadcrumb separator line.
|
|
15
|
+
* @cssproperty [--wje-breadcrumb-line-height=1.5] - Controls the vertical rhythm of breadcrumb text.
|
|
16
|
+
* @cssproperty [--wje-breadcrumb-native-line-height=var(--wje-breadcrumb-line-height)] - Controls the line height of the native breadcrumb wrapper.
|
|
17
|
+
* @cssproperty [--wje-breadcrumb-native-margin=0] - Sets outer spacing around the native breadcrumb wrapper.
|
|
18
|
+
* @cssproperty [--wje-breadcrumb-native-padding=0.25rem 0.75rem] - Sets inner spacing inside the native breadcrumb wrapper.
|
|
19
|
+
* @cssproperty [--wje-breadcrumb-margin=var(--wje-breadcrumb-native-margin)] - Backwards-compatible alias for native breadcrumb margin.
|
|
20
|
+
* @cssproperty [--wje-breadcrumb-padding=var(--wje-breadcrumb-native-padding)] - Backwards-compatible alias for native breadcrumb padding.
|
|
15
21
|
* @tag wje-breadcrumb
|
|
16
22
|
*/
|
|
17
23
|
export default class Breadcrumb extends WJElement {
|
|
@@ -86,6 +92,22 @@ export default class Breadcrumb extends WJElement {
|
|
|
86
92
|
*/
|
|
87
93
|
draw(): object;
|
|
88
94
|
native: HTMLAnchorElement;
|
|
95
|
+
/**
|
|
96
|
+
* Returns whether the separator should be visible after this breadcrumb.
|
|
97
|
+
* @returns {boolean}
|
|
98
|
+
*/
|
|
99
|
+
shouldRenderSeparator(): boolean;
|
|
100
|
+
/**
|
|
101
|
+
* Returns whether any later breadcrumb is still visible in the rendered trail.
|
|
102
|
+
* @returns {boolean}
|
|
103
|
+
*/
|
|
104
|
+
hasVisibleBreadcrumbAfter(): boolean;
|
|
105
|
+
/**
|
|
106
|
+
* Returns whether a breadcrumb is visible in the rendered trail.
|
|
107
|
+
* @param {Element} breadcrumb Breadcrumb element to inspect.
|
|
108
|
+
* @returns {boolean}
|
|
109
|
+
*/
|
|
110
|
+
isBreadcrumbVisibleInTrail(breadcrumb: Element): boolean;
|
|
89
111
|
/**
|
|
90
112
|
* Synchronizes host attributes to the internal anchor.
|
|
91
113
|
*/
|
|
@@ -115,6 +137,41 @@ export default class Breadcrumb extends WJElement {
|
|
|
115
137
|
* @returns {HTMLElement} A configured dropdown element containing a button as trigger and a menu with breadcrumb items.
|
|
116
138
|
*/
|
|
117
139
|
collapseDropdown(): HTMLElement;
|
|
140
|
+
/**
|
|
141
|
+
* Creates the dropdown trigger for collapsed breadcrumbs.
|
|
142
|
+
* @param {boolean} isBreakpointMenuIndicator Whether this trigger controls the full breakpoint menu.
|
|
143
|
+
* @returns {HTMLElement}
|
|
144
|
+
*/
|
|
145
|
+
createCollapsedDropdownTrigger(isBreakpointMenuIndicator: boolean): HTMLElement;
|
|
146
|
+
/**
|
|
147
|
+
* Resolves the icon used by the default dropdown trigger.
|
|
148
|
+
* @param {boolean} isBreakpointMenuIndicator Whether this trigger controls the full breakpoint menu.
|
|
149
|
+
* @returns {string}
|
|
150
|
+
*/
|
|
151
|
+
getCollapsedDropdownIcon(isBreakpointMenuIndicator: boolean): string;
|
|
152
|
+
/**
|
|
153
|
+
* Copies breadcrumb content into a collapsed menu item.
|
|
154
|
+
* @param {HTMLElement} menuItem Menu item receiving the content.
|
|
155
|
+
* @param {HTMLElement} breadcrumb Source breadcrumb.
|
|
156
|
+
*/
|
|
157
|
+
populateCollapsedMenuItem(menuItem: HTMLElement, breadcrumb: HTMLElement): void;
|
|
158
|
+
/**
|
|
159
|
+
* Resolves a readable label for icon-only collapsed menu items.
|
|
160
|
+
* @param {HTMLElement} breadcrumb Source breadcrumb.
|
|
161
|
+
* @returns {string}
|
|
162
|
+
*/
|
|
163
|
+
getCollapsedMenuItemLabel(breadcrumb: HTMLElement): string;
|
|
164
|
+
/**
|
|
165
|
+
* Turns a URL segment into a readable menu label.
|
|
166
|
+
* @param {string} value URL segment.
|
|
167
|
+
* @returns {string}
|
|
168
|
+
*/
|
|
169
|
+
humanizeCollapsedMenuItemLabel(value: string): string;
|
|
170
|
+
/**
|
|
171
|
+
* Returns whether this collapsed indicator represents the full breakpoint menu.
|
|
172
|
+
* @returns {boolean}
|
|
173
|
+
*/
|
|
174
|
+
isBreakpointMenuIndicator(): boolean;
|
|
118
175
|
/**
|
|
119
176
|
* Creates a button element that expands hidden breadcrumbs when clicked.
|
|
120
177
|
* The button is set with appropriate attributes and event listeners to handle
|
|
@@ -5,11 +5,16 @@ import { default as WJElement } from '../wje-element/element.js';
|
|
|
5
5
|
* @status stable
|
|
6
6
|
* @augments WJElement
|
|
7
7
|
* @slot - The container for breadcrumb elements.
|
|
8
|
+
* @slot breakpoint-collapse-trigger - Custom trigger used when breakpoint-collapse="menu" moves the full trail into a dropdown.
|
|
8
9
|
* @csspart container - The component's container wrapper.
|
|
9
10
|
* @property {Array<{id: string|number, label: string, href?: string, icon?: string, disabled?: boolean, data?: any}>} items - Data-driven breadcrumb items.
|
|
10
11
|
* @attribute {number} max-items - The maximum number of visible breadcrumbs before collapsing.
|
|
11
12
|
* @attribute {number} items-before-collapse - The number of breadcrumbs to show before the collapsed indicator.
|
|
12
13
|
* @attribute {number} items-after-collapse - The number of breadcrumbs to show after the collapsed indicator.
|
|
14
|
+
* @attribute {string} collapsed-variant - The UI used for collapsed breadcrumbs. Use "dropdown" to render a menu.
|
|
15
|
+
* @attribute {string} breakpoint - The viewport breakpoint where collapsing starts.
|
|
16
|
+
* @attribute {string} breakpoint-collapse - The collapse behavior used below the breakpoint. Use "menu" to put the whole trail into one menu.
|
|
17
|
+
* @attribute {string} breakpoint-collapse-icon - Icon used by the default breakpoint menu trigger.
|
|
13
18
|
* // @fires wje-breadcrumbs:item-click - Dispatched when a data-driven breadcrumb item is clicked.
|
|
14
19
|
* @tag wje-breadcrumbs
|
|
15
20
|
* @example
|
|
@@ -75,6 +80,11 @@ export default class Breadcrumbs extends WJElement {
|
|
|
75
80
|
* @returns {string}
|
|
76
81
|
*/
|
|
77
82
|
get variant(): string;
|
|
83
|
+
/**
|
|
84
|
+
* Get the collapsed indicator variant.
|
|
85
|
+
* @param {string} value Collapsed indicator variant.
|
|
86
|
+
*/
|
|
87
|
+
set collapsedVariant(value: string);
|
|
78
88
|
/**
|
|
79
89
|
* Get the collapsed indicator variant.
|
|
80
90
|
* @returns {string}
|
|
@@ -90,6 +100,26 @@ export default class Breadcrumbs extends WJElement {
|
|
|
90
100
|
* @returns {string}
|
|
91
101
|
*/
|
|
92
102
|
get breakpoint(): string;
|
|
103
|
+
/**
|
|
104
|
+
* Sets the collapse behavior used below the configured breakpoint.
|
|
105
|
+
* @param {string} value Collapse behavior.
|
|
106
|
+
*/
|
|
107
|
+
set breakpointCollapse(value: string);
|
|
108
|
+
/**
|
|
109
|
+
* Gets the collapse behavior used below the configured breakpoint.
|
|
110
|
+
* @returns {string}
|
|
111
|
+
*/
|
|
112
|
+
get breakpointCollapse(): string;
|
|
113
|
+
/**
|
|
114
|
+
* Sets the icon used by the default breakpoint menu trigger.
|
|
115
|
+
* @param {string} value Icon name.
|
|
116
|
+
*/
|
|
117
|
+
set breakpointCollapseIcon(value: string);
|
|
118
|
+
/**
|
|
119
|
+
* Gets the icon used by the default breakpoint menu trigger.
|
|
120
|
+
* @returns {string}
|
|
121
|
+
*/
|
|
122
|
+
get breakpointCollapseIcon(): string;
|
|
93
123
|
/**
|
|
94
124
|
* Get items before collapse attribute.
|
|
95
125
|
* @param {string} value
|
|
@@ -120,6 +150,13 @@ export default class Breadcrumbs extends WJElement {
|
|
|
120
150
|
* @returns {number}
|
|
121
151
|
*/
|
|
122
152
|
get itemsAfterCollapse(): number;
|
|
153
|
+
/**
|
|
154
|
+
* Handles attribute changes that affect light-DOM breadcrumb indicators.
|
|
155
|
+
* @param {string} name Updated attribute.
|
|
156
|
+
* @param {string|null} oldValue Previous value.
|
|
157
|
+
* @param {string|null} newValue Next value.
|
|
158
|
+
*/
|
|
159
|
+
attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
|
|
123
160
|
/**
|
|
124
161
|
* Draw method for the Breadcrumbs element.
|
|
125
162
|
* @returns {object} fragment - The document fragment
|
|
@@ -228,6 +265,16 @@ export default class Breadcrumbs extends WJElement {
|
|
|
228
265
|
* @returns {void}
|
|
229
266
|
*/
|
|
230
267
|
updateCollapse(): void;
|
|
268
|
+
/**
|
|
269
|
+
* Collapses the whole breadcrumb trail into a single menu indicator.
|
|
270
|
+
* @param {Array<Element>} breadcrumbs Breadcrumb items.
|
|
271
|
+
*/
|
|
272
|
+
applyMenuCollapse(breadcrumbs: Array<Element>): void;
|
|
273
|
+
/**
|
|
274
|
+
* Returns whether the active breakpoint mode should move the full trail into one menu.
|
|
275
|
+
* @returns {boolean}
|
|
276
|
+
*/
|
|
277
|
+
isBreakpointMenuCollapseActive(): boolean;
|
|
231
278
|
/**
|
|
232
279
|
* Clears attributes/classes managed by the collapse algorithm.
|
|
233
280
|
* @param {Array<Element>} breadcrumbs Breadcrumb items.
|
|
@@ -240,6 +287,10 @@ export default class Breadcrumbs extends WJElement {
|
|
|
240
287
|
* @param {boolean} isEnabled Whether the attribute should be present.
|
|
241
288
|
*/
|
|
242
289
|
syncManagedAttribute(element: Element, name: string, isEnabled: boolean): void;
|
|
290
|
+
/**
|
|
291
|
+
* Redraws active collapsed indicators when parent-only rendering inputs change.
|
|
292
|
+
*/
|
|
293
|
+
refreshCollapsedIndicators(): void;
|
|
243
294
|
/**
|
|
244
295
|
* Returns whether collapse rules should currently be applied.
|
|
245
296
|
* @returns {boolean}
|
|
@@ -250,6 +301,11 @@ export default class Breadcrumbs extends WJElement {
|
|
|
250
301
|
* @returns {number|null}
|
|
251
302
|
*/
|
|
252
303
|
getBreakpointWidth(): number | null;
|
|
304
|
+
/**
|
|
305
|
+
* Returns the custom trigger element configured for breakpoint menu collapse.
|
|
306
|
+
* @returns {Element|null}
|
|
307
|
+
*/
|
|
308
|
+
getBreakpointCollapseTrigger(): Element | null;
|
|
253
309
|
/**
|
|
254
310
|
* Retrieves all breadcrumb elements within the current instance.
|
|
255
311
|
* @returns {Array<Element>} An array of breadcrumb elements (`wje-breadcrumb`) found within the instance. Returns an empty array if no breadcrumbs are found.
|
package/dist/wje-breadcrumb.js
CHANGED
|
@@ -4,7 +4,14 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
4
4
|
import WJElement from "./wje-element.js";
|
|
5
5
|
import { WjElementUtils } from "./element-utils.js";
|
|
6
6
|
import { event } from "./event.js";
|
|
7
|
-
|
|
7
|
+
import "./wje-button.js";
|
|
8
|
+
import "./wje-dropdown.js";
|
|
9
|
+
import "./icon-CReYMzAK.js";
|
|
10
|
+
import "./wje-menu.js";
|
|
11
|
+
import "./wje-menu-item.js";
|
|
12
|
+
import "./wje-popup.js";
|
|
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";
|
|
8
15
|
class Breadcrumb extends WJElement {
|
|
9
16
|
/**
|
|
10
17
|
* Breadcrumb constructor method.
|
|
@@ -97,7 +104,7 @@ class Breadcrumb extends WJElement {
|
|
|
97
104
|
* @returns {Array<string>} - The observed attributes array for the Breadcrumb element.
|
|
98
105
|
*/
|
|
99
106
|
static get observedAttributes() {
|
|
100
|
-
return ["show-collapsed-indicator", "collapsed", "last", "href", "target", "rel", "download", "disabled"];
|
|
107
|
+
return ["show-collapsed-indicator", "collapsed", "last", "href", "target", "rel", "download", "disabled", "title", "aria-label"];
|
|
101
108
|
}
|
|
102
109
|
/**
|
|
103
110
|
* Handles attribute changes for the custom element and updates its behavior or appearance accordingly.
|
|
@@ -115,6 +122,7 @@ class Breadcrumb extends WJElement {
|
|
|
115
122
|
(_a = super.attributeChangedCallback) == null ? void 0 : _a.call(this, name, oldValue, newValue);
|
|
116
123
|
const isOn = newValue !== null && WjElementUtils.stringToBoolean(newValue);
|
|
117
124
|
this._showCollapsedIndicator = isOn;
|
|
125
|
+
this.classList.toggle("collapsed", this.hasAttribute("collapsed") && !isOn);
|
|
118
126
|
this.refresh();
|
|
119
127
|
} else if (name === "last") {
|
|
120
128
|
(_b = super.attributeChangedCallback) == null ? void 0 : _b.call(this, name, oldValue, newValue);
|
|
@@ -165,7 +173,7 @@ class Breadcrumb extends WJElement {
|
|
|
165
173
|
fragment.append(this.drawCollapsedIndicator());
|
|
166
174
|
native.classList.add("hidden");
|
|
167
175
|
}
|
|
168
|
-
if (this.
|
|
176
|
+
if (this.shouldRenderSeparator()) {
|
|
169
177
|
let separator = document.createElement("span");
|
|
170
178
|
separator.classList.add("separator");
|
|
171
179
|
separator.setAttribute("part", "separator");
|
|
@@ -180,6 +188,34 @@ class Breadcrumb extends WJElement {
|
|
|
180
188
|
}
|
|
181
189
|
return fragment;
|
|
182
190
|
}
|
|
191
|
+
/**
|
|
192
|
+
* Returns whether the separator should be visible after this breadcrumb.
|
|
193
|
+
* @returns {boolean}
|
|
194
|
+
*/
|
|
195
|
+
shouldRenderSeparator() {
|
|
196
|
+
return this.showSeparator && this.hasVisibleBreadcrumbAfter();
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Returns whether any later breadcrumb is still visible in the rendered trail.
|
|
200
|
+
* @returns {boolean}
|
|
201
|
+
*/
|
|
202
|
+
hasVisibleBreadcrumbAfter() {
|
|
203
|
+
var _a, _b;
|
|
204
|
+
const breadcrumbs = (_b = (_a = this.parentElement) == null ? void 0 : _a.getBreadcrumbs) == null ? void 0 : _b.call(_a);
|
|
205
|
+
if (!Array.isArray(breadcrumbs)) return true;
|
|
206
|
+
const index = breadcrumbs.indexOf(this);
|
|
207
|
+
if (index === -1) return true;
|
|
208
|
+
return breadcrumbs.slice(index + 1).some((breadcrumb) => this.isBreadcrumbVisibleInTrail(breadcrumb));
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Returns whether a breadcrumb is visible in the rendered trail.
|
|
212
|
+
* @param {Element} breadcrumb Breadcrumb element to inspect.
|
|
213
|
+
* @returns {boolean}
|
|
214
|
+
*/
|
|
215
|
+
isBreadcrumbVisibleInTrail(breadcrumb) {
|
|
216
|
+
var _a, _b;
|
|
217
|
+
return !(((_a = breadcrumb == null ? void 0 : breadcrumb.hasAttribute) == null ? void 0 : _a.call(breadcrumb, "collapsed")) && !((_b = breadcrumb == null ? void 0 : breadcrumb.hasAttribute) == null ? void 0 : _b.call(breadcrumb, "show-collapsed-indicator")));
|
|
218
|
+
}
|
|
183
219
|
/**
|
|
184
220
|
* Synchronizes host attributes to the internal anchor.
|
|
185
221
|
*/
|
|
@@ -201,6 +237,13 @@ class Breadcrumb extends WJElement {
|
|
|
201
237
|
native.removeAttribute(attr);
|
|
202
238
|
}
|
|
203
239
|
});
|
|
240
|
+
["title", "aria-label"].forEach((attr) => {
|
|
241
|
+
if (this.hasAttribute(attr)) {
|
|
242
|
+
native.setAttribute(attr, this.getAttribute(attr));
|
|
243
|
+
} else {
|
|
244
|
+
native.removeAttribute(attr);
|
|
245
|
+
}
|
|
246
|
+
});
|
|
204
247
|
native.classList.toggle("active", Boolean(this.active));
|
|
205
248
|
native.classList.toggle("disabled", isDisabled);
|
|
206
249
|
if (this.active) native.setAttribute("aria-current", "page");
|
|
@@ -262,15 +305,14 @@ class Breadcrumb extends WJElement {
|
|
|
262
305
|
* @returns {HTMLElement} A configured dropdown element containing a button as trigger and a menu with breadcrumb items.
|
|
263
306
|
*/
|
|
264
307
|
collapseDropdown() {
|
|
308
|
+
const isBreakpointMenuIndicator = this.isBreakpointMenuIndicator();
|
|
265
309
|
let dropdown = document.createElement("wje-dropdown");
|
|
266
|
-
dropdown.setAttribute("placement", "bottom");
|
|
310
|
+
dropdown.setAttribute("placement", isBreakpointMenuIndicator ? "bottom-start" : "bottom");
|
|
267
311
|
dropdown.setAttribute("offset", "10");
|
|
268
|
-
|
|
269
|
-
button.setAttribute("slot", "trigger");
|
|
270
|
-
button.setAttribute("fill", "link");
|
|
271
|
-
button.innerHTML = `<wje-icon name="dots"></wje-icon>`;
|
|
312
|
+
const trigger = this.createCollapsedDropdownTrigger(isBreakpointMenuIndicator);
|
|
272
313
|
let menu = document.createElement("wje-menu");
|
|
273
314
|
menu.setAttribute("variant", "context");
|
|
315
|
+
menu.style.setProperty("--wje-menu-item-justify-content", "flex-start");
|
|
274
316
|
menu.addEventListener("click", (e) => {
|
|
275
317
|
var _a;
|
|
276
318
|
e.stopPropagation();
|
|
@@ -278,7 +320,7 @@ class Breadcrumb extends WJElement {
|
|
|
278
320
|
});
|
|
279
321
|
this.getBreadcrumbs().getBreadcrumbsCollapsed().forEach((b) => {
|
|
280
322
|
let menuItem = document.createElement("wje-menu-item");
|
|
281
|
-
menuItem
|
|
323
|
+
this.populateCollapsedMenuItem(menuItem, b);
|
|
282
324
|
menuItem.__breadcrumb = b;
|
|
283
325
|
menuItem.addEventListener("wje-menu-item:click", (e) => {
|
|
284
326
|
var _a, _b, _c;
|
|
@@ -304,9 +346,93 @@ class Breadcrumb extends WJElement {
|
|
|
304
346
|
});
|
|
305
347
|
menu.append(menuItem);
|
|
306
348
|
});
|
|
307
|
-
dropdown.append(
|
|
349
|
+
dropdown.append(trigger, menu);
|
|
308
350
|
return dropdown;
|
|
309
351
|
}
|
|
352
|
+
/**
|
|
353
|
+
* Creates the dropdown trigger for collapsed breadcrumbs.
|
|
354
|
+
* @param {boolean} isBreakpointMenuIndicator Whether this trigger controls the full breakpoint menu.
|
|
355
|
+
* @returns {HTMLElement}
|
|
356
|
+
*/
|
|
357
|
+
createCollapsedDropdownTrigger(isBreakpointMenuIndicator) {
|
|
358
|
+
var _a, _b;
|
|
359
|
+
if (isBreakpointMenuIndicator) {
|
|
360
|
+
const customTrigger = (_b = (_a = this.getBreadcrumbs()) == null ? void 0 : _a.getBreakpointCollapseTrigger) == null ? void 0 : _b.call(_a);
|
|
361
|
+
if (customTrigger) {
|
|
362
|
+
const trigger = customTrigger.cloneNode(true);
|
|
363
|
+
trigger.setAttribute("slot", "trigger");
|
|
364
|
+
if (!trigger.hasAttribute("aria-label")) {
|
|
365
|
+
trigger.setAttribute("aria-label", "Show breadcrumb menu");
|
|
366
|
+
}
|
|
367
|
+
return trigger;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
let button = document.createElement("wje-button");
|
|
371
|
+
button.setAttribute("slot", "trigger");
|
|
372
|
+
button.setAttribute("fill", "link");
|
|
373
|
+
button.setAttribute("aria-label", "Show more breadcrumbs");
|
|
374
|
+
button.innerHTML = `<wje-icon name="${this.getCollapsedDropdownIcon(isBreakpointMenuIndicator)}"></wje-icon>`;
|
|
375
|
+
return button;
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Resolves the icon used by the default dropdown trigger.
|
|
379
|
+
* @param {boolean} isBreakpointMenuIndicator Whether this trigger controls the full breakpoint menu.
|
|
380
|
+
* @returns {string}
|
|
381
|
+
*/
|
|
382
|
+
getCollapsedDropdownIcon(isBreakpointMenuIndicator) {
|
|
383
|
+
var _a;
|
|
384
|
+
if (!isBreakpointMenuIndicator) return "dots";
|
|
385
|
+
return ((_a = this.getBreadcrumbs()) == null ? void 0 : _a.breakpointCollapseIcon) || "menu";
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Copies breadcrumb content into a collapsed menu item.
|
|
389
|
+
* @param {HTMLElement} menuItem Menu item receiving the content.
|
|
390
|
+
* @param {HTMLElement} breadcrumb Source breadcrumb.
|
|
391
|
+
*/
|
|
392
|
+
populateCollapsedMenuItem(menuItem, breadcrumb) {
|
|
393
|
+
const nodes = Array.from(breadcrumb.childNodes).map((node) => node.cloneNode(true));
|
|
394
|
+
menuItem.replaceChildren(...nodes);
|
|
395
|
+
if (menuItem.textContent.trim()) return;
|
|
396
|
+
const label = this.getCollapsedMenuItemLabel(breadcrumb);
|
|
397
|
+
if (label) {
|
|
398
|
+
menuItem.append(document.createTextNode(label));
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Resolves a readable label for icon-only collapsed menu items.
|
|
403
|
+
* @param {HTMLElement} breadcrumb Source breadcrumb.
|
|
404
|
+
* @returns {string}
|
|
405
|
+
*/
|
|
406
|
+
getCollapsedMenuItemLabel(breadcrumb) {
|
|
407
|
+
var _a;
|
|
408
|
+
const explicitLabel = breadcrumb.getAttribute("aria-label") || breadcrumb.getAttribute("title");
|
|
409
|
+
if (explicitLabel == null ? void 0 : explicitLabel.trim()) return explicitLabel.trim();
|
|
410
|
+
const text = breadcrumb.textContent.trim();
|
|
411
|
+
if (text) return text;
|
|
412
|
+
const iconName = (_a = breadcrumb.querySelector('wje-icon[slot="start"]')) == null ? void 0 : _a.getAttribute("name");
|
|
413
|
+
if (iconName === "home") return "Home";
|
|
414
|
+
const href = breadcrumb.getAttribute("href");
|
|
415
|
+
const path = (href == null ? void 0 : href.split(/[?#]/)[0]) || "";
|
|
416
|
+
const segment = path.split("/").filter(Boolean).pop();
|
|
417
|
+
return segment ? this.humanizeCollapsedMenuItemLabel(segment) : "";
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Turns a URL segment into a readable menu label.
|
|
421
|
+
* @param {string} value URL segment.
|
|
422
|
+
* @returns {string}
|
|
423
|
+
*/
|
|
424
|
+
humanizeCollapsedMenuItemLabel(value) {
|
|
425
|
+
return decodeURIComponent(value).replace(/[-_]+/g, " ").replace(/\b\w/g, (letter) => letter.toUpperCase());
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* Returns whether this collapsed indicator represents the full breakpoint menu.
|
|
429
|
+
* @returns {boolean}
|
|
430
|
+
*/
|
|
431
|
+
isBreakpointMenuIndicator() {
|
|
432
|
+
var _a;
|
|
433
|
+
const breadcrumbs = this.parentElement;
|
|
434
|
+
return this.hasAttribute("show-collapsed-indicator") && this.hasAttribute("collapsed") && ((_a = breadcrumbs == null ? void 0 : breadcrumbs.isBreakpointMenuCollapseActive) == null ? void 0 : _a.call(breadcrumbs));
|
|
435
|
+
}
|
|
310
436
|
/**
|
|
311
437
|
* Creates a button element that expands hidden breadcrumbs when clicked.
|
|
312
438
|
* The button is set with appropriate attributes and event listeners to handle
|
|
@@ -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 * @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'];\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.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.showSeparator) {\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 * 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 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 let dropdown = document.createElement('wje-dropdown');\n dropdown.setAttribute('placement', 'bottom');\n dropdown.setAttribute('offset', '10');\n\n let button = document.createElement('wje-button');\n button.setAttribute('slot', 'trigger');\n button.setAttribute('fill', 'link');\n button.innerHTML = `<wje-icon name=\"dots\"></wje-icon>`;\n\n let menu = document.createElement('wje-menu');\n menu.setAttribute('variant', 'context');\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 menuItem.innerHTML = b.innerHTML;\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(button, menu);\n\n return dropdown;\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';\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\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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"}
|
package/dist/wje-breadcrumbs.js
CHANGED
|
@@ -55,6 +55,14 @@ const _Breadcrumbs = class _Breadcrumbs extends WJElement {
|
|
|
55
55
|
get variant() {
|
|
56
56
|
return this.getAttribute("variant") || "button";
|
|
57
57
|
}
|
|
58
|
+
/**
|
|
59
|
+
* Get the collapsed indicator variant.
|
|
60
|
+
* @param {string} value Collapsed indicator variant.
|
|
61
|
+
*/
|
|
62
|
+
set collapsedVariant(value) {
|
|
63
|
+
if (value) this.setAttribute("collapsed-variant", value);
|
|
64
|
+
else this.removeAttribute("collapsed-variant");
|
|
65
|
+
}
|
|
58
66
|
/**
|
|
59
67
|
* Get the collapsed indicator variant.
|
|
60
68
|
* @returns {string}
|
|
@@ -77,6 +85,36 @@ const _Breadcrumbs = class _Breadcrumbs extends WJElement {
|
|
|
77
85
|
get breakpoint() {
|
|
78
86
|
return this.getAttribute("breakpoint") || "";
|
|
79
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* Sets the collapse behavior used below the configured breakpoint.
|
|
90
|
+
* @param {string} value Collapse behavior.
|
|
91
|
+
*/
|
|
92
|
+
set breakpointCollapse(value) {
|
|
93
|
+
if (value) this.setAttribute("breakpoint-collapse", value);
|
|
94
|
+
else this.removeAttribute("breakpoint-collapse");
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Gets the collapse behavior used below the configured breakpoint.
|
|
98
|
+
* @returns {string}
|
|
99
|
+
*/
|
|
100
|
+
get breakpointCollapse() {
|
|
101
|
+
return (this.getAttribute("breakpoint-collapse") || "items").toLowerCase();
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Sets the icon used by the default breakpoint menu trigger.
|
|
105
|
+
* @param {string} value Icon name.
|
|
106
|
+
*/
|
|
107
|
+
set breakpointCollapseIcon(value) {
|
|
108
|
+
if (value) this.setAttribute("breakpoint-collapse-icon", value);
|
|
109
|
+
else this.removeAttribute("breakpoint-collapse-icon");
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Gets the icon used by the default breakpoint menu trigger.
|
|
113
|
+
* @returns {string}
|
|
114
|
+
*/
|
|
115
|
+
get breakpointCollapseIcon() {
|
|
116
|
+
return this.getAttribute("breakpoint-collapse-icon") || "";
|
|
117
|
+
}
|
|
80
118
|
/**
|
|
81
119
|
* Get items before collapse attribute.
|
|
82
120
|
* @param {string} value
|
|
@@ -137,7 +175,16 @@ const _Breadcrumbs = class _Breadcrumbs extends WJElement {
|
|
|
137
175
|
* @returns {Array<string>} - The observed attributes array for the Breadcrumb element.
|
|
138
176
|
*/
|
|
139
177
|
static get observedAttributes() {
|
|
140
|
-
return [
|
|
178
|
+
return [
|
|
179
|
+
"breakpoint",
|
|
180
|
+
"breakpoint-collapse",
|
|
181
|
+
"max-items",
|
|
182
|
+
"items-before-collapse",
|
|
183
|
+
"items-after-collapse",
|
|
184
|
+
"collapsed-variant",
|
|
185
|
+
"breakpoint-collapse-icon",
|
|
186
|
+
"variant"
|
|
187
|
+
];
|
|
141
188
|
}
|
|
142
189
|
/**
|
|
143
190
|
* Setup attributes for the Breadcrumbs element.
|
|
@@ -150,6 +197,20 @@ const _Breadcrumbs = class _Breadcrumbs extends WJElement {
|
|
|
150
197
|
this.items = this.getAttribute("items");
|
|
151
198
|
}
|
|
152
199
|
}
|
|
200
|
+
/**
|
|
201
|
+
* Handles attribute changes that affect light-DOM breadcrumb indicators.
|
|
202
|
+
* @param {string} name Updated attribute.
|
|
203
|
+
* @param {string|null} oldValue Previous value.
|
|
204
|
+
* @param {string|null} newValue Next value.
|
|
205
|
+
*/
|
|
206
|
+
attributeChangedCallback(name, oldValue, newValue) {
|
|
207
|
+
var _a;
|
|
208
|
+
if (oldValue === newValue) return;
|
|
209
|
+
(_a = super.attributeChangedCallback) == null ? void 0 : _a.call(this, name, oldValue, newValue);
|
|
210
|
+
if (name === "collapsed-variant" || name === "variant" || name === "breakpoint-collapse" || name === "breakpoint-collapse-icon") {
|
|
211
|
+
this.refreshCollapsedIndicators();
|
|
212
|
+
}
|
|
213
|
+
}
|
|
153
214
|
/**
|
|
154
215
|
* Draw method for the Breadcrumbs element.
|
|
155
216
|
* @returns {object} fragment - The document fragment
|
|
@@ -461,8 +522,14 @@ const _Breadcrumbs = class _Breadcrumbs extends WJElement {
|
|
|
461
522
|
let breadcrumbs = this.getBreadcrumbs();
|
|
462
523
|
if (breadcrumbs.length === 0) return;
|
|
463
524
|
this._isCollapsedByBreakpoint = this.shouldApplyBreakpointCollapse();
|
|
525
|
+
const shouldCollapseToMenu = this.isBreakpointMenuCollapseActive() && breadcrumbs.length > 1;
|
|
526
|
+
if (shouldCollapseToMenu) {
|
|
527
|
+
this.applyMenuCollapse(breadcrumbs);
|
|
528
|
+
return;
|
|
529
|
+
}
|
|
464
530
|
const effectiveItemsAfterCollapse = this.itemsAfterCollapse;
|
|
465
|
-
const
|
|
531
|
+
const shouldUseItemCollapse = this.breakpointCollapse === "menu" || this._isCollapsedByBreakpoint;
|
|
532
|
+
const shouldCollapse = shouldUseItemCollapse && this.maxItems > 0 && breadcrumbs.length > this.maxItems && this.itemsBeforeCollapse + effectiveItemsAfterCollapse + 1 <= this.maxItems;
|
|
466
533
|
const lastIndex = breadcrumbs.length - 1;
|
|
467
534
|
const indicatorIndex = shouldCollapse ? this.itemsBeforeCollapse : -1;
|
|
468
535
|
const collapseStart = this.itemsBeforeCollapse;
|
|
@@ -477,6 +544,31 @@ const _Breadcrumbs = class _Breadcrumbs extends WJElement {
|
|
|
477
544
|
}
|
|
478
545
|
});
|
|
479
546
|
}
|
|
547
|
+
/**
|
|
548
|
+
* Collapses the whole breadcrumb trail into a single menu indicator.
|
|
549
|
+
* @param {Array<Element>} breadcrumbs Breadcrumb items.
|
|
550
|
+
*/
|
|
551
|
+
applyMenuCollapse(breadcrumbs) {
|
|
552
|
+
const lastIndex = breadcrumbs.length - 1;
|
|
553
|
+
breadcrumbs.forEach((breadcrumb, index) => {
|
|
554
|
+
const isIndicator = index === 0;
|
|
555
|
+
this.syncManagedAttribute(breadcrumb, "last", index === lastIndex);
|
|
556
|
+
this.syncManagedAttribute(breadcrumb, "show-collapsed-indicator", isIndicator);
|
|
557
|
+
this.syncManagedAttribute(breadcrumb, "collapsed", true);
|
|
558
|
+
if (isIndicator) {
|
|
559
|
+
breadcrumb.classList.remove("collapsed");
|
|
560
|
+
}
|
|
561
|
+
});
|
|
562
|
+
}
|
|
563
|
+
/**
|
|
564
|
+
* Returns whether the active breakpoint mode should move the full trail into one menu.
|
|
565
|
+
* @returns {boolean}
|
|
566
|
+
*/
|
|
567
|
+
isBreakpointMenuCollapseActive() {
|
|
568
|
+
return Boolean(
|
|
569
|
+
this.getBreakpointWidth() && this._isCollapsedByBreakpoint && this.breakpointCollapse === "menu"
|
|
570
|
+
);
|
|
571
|
+
}
|
|
480
572
|
/**
|
|
481
573
|
* Clears attributes/classes managed by the collapse algorithm.
|
|
482
574
|
* @param {Array<Element>} breadcrumbs Breadcrumb items.
|
|
@@ -505,6 +597,15 @@ const _Breadcrumbs = class _Breadcrumbs extends WJElement {
|
|
|
505
597
|
element.removeAttribute(name);
|
|
506
598
|
}
|
|
507
599
|
}
|
|
600
|
+
/**
|
|
601
|
+
* Redraws active collapsed indicators when parent-only rendering inputs change.
|
|
602
|
+
*/
|
|
603
|
+
refreshCollapsedIndicators() {
|
|
604
|
+
this.getBreadcrumbs().filter((breadcrumb) => breadcrumb.hasAttribute("show-collapsed-indicator")).forEach((breadcrumb) => {
|
|
605
|
+
var _a;
|
|
606
|
+
return (_a = breadcrumb.refresh) == null ? void 0 : _a.call(breadcrumb);
|
|
607
|
+
});
|
|
608
|
+
}
|
|
508
609
|
/**
|
|
509
610
|
* Returns whether collapse rules should currently be applied.
|
|
510
611
|
* @returns {boolean}
|
|
@@ -533,6 +634,16 @@ const _Breadcrumbs = class _Breadcrumbs extends WJElement {
|
|
|
533
634
|
const directNumber = parseFloat(token);
|
|
534
635
|
return Number.isFinite(directNumber) ? directNumber : null;
|
|
535
636
|
}
|
|
637
|
+
/**
|
|
638
|
+
* Returns the custom trigger element configured for breakpoint menu collapse.
|
|
639
|
+
* @returns {Element|null}
|
|
640
|
+
*/
|
|
641
|
+
getBreakpointCollapseTrigger() {
|
|
642
|
+
return Array.from(this.children).find((child) => {
|
|
643
|
+
var _a;
|
|
644
|
+
return ((_a = child.getAttribute) == null ? void 0 : _a.call(child, "slot")) === "breakpoint-collapse-trigger";
|
|
645
|
+
}) || null;
|
|
646
|
+
}
|
|
536
647
|
/**
|
|
537
648
|
* Retrieves all breadcrumb elements within the current instance.
|
|
538
649
|
* @returns {Array<Element>} An array of breadcrumb elements (`wje-breadcrumb`) found within the instance. Returns an empty array if no breadcrumbs are found.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wje-breadcrumbs.js","sources":["../packages/wje-breadcrumbs/breadcrumbs.element.js","../packages/wje-breadcrumbs/breadcrumbs.js"],"sourcesContent":["import { default as WJElement } from '../wje-element/element.js';\nimport styles from './styles/styles.css?inline';\n\nconst MANAGED_ITEM_ATTRIBUTE = 'data-wje-breadcrumbs-item';\n\n/**\n * @summary This class represents a Breadcrumbs container, extending the WJElement class. It acts as a wrapper for individual breadcrumb elements and manages their behavior, such as collapsing and marking the last breadcrumb.\n * @documentation https://elements.webjet.sk/components/breadcrumbs\n * @status stable\n * @augments WJElement\n * @slot - The container for breadcrumb elements.\n * @csspart container - The component's container wrapper.\n * @property {Array<{id: string|number, label: string, href?: string, icon?: string, disabled?: boolean, data?: any}>} items - Data-driven breadcrumb items.\n * @attribute {number} max-items - The maximum number of visible breadcrumbs before collapsing.\n * @attribute {number} items-before-collapse - The number of breadcrumbs to show before the collapsed indicator.\n * @attribute {number} items-after-collapse - The number of breadcrumbs to show after the collapsed indicator.\n * // @fires wje-breadcrumbs:item-click - Dispatched when a data-driven breadcrumb item is clicked.\n * @tag wje-breadcrumbs\n * @example\n * <!-- Example usage -->\n * <wje-breadcrumbs max-items=\"5\" items-before-collapse=\"2\" items-after-collapse=\"2\">\n * <wje-breadcrumb>Home</wje-breadcrumb>\n * <wje-breadcrumb>About</wje-breadcrumb>\n * <wje-breadcrumb>Services</wje-breadcrumb>\n * <wje-breadcrumb>Portfolio</wje-breadcrumb>\n * <wje-breadcrumb>Contact</wje-breadcrumb>\n * </wje-breadcrumbs>\n *\n * <!-- Output: Only the first two and last two breadcrumbs will be visible, with a collapsed indicator in the middle -->\n */\n\nexport default class Breadcrumbs extends WJElement {\n static BREAKPOINTS = {\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n '2xl': 1450,\n xxl: 1450,\n };\n\n /**\n * Breadcrumbs constructor method.\n * @class\n */\n constructor() {\n super();\n\n /**\n * Last breadcrumb flag\n * @type {boolean}\n */\n this.last = false;\n this._isCollapsedByBreakpoint = null;\n this._items = [];\n this._itemRecords = [];\n this._hasItemsValue = false;\n this.handleManagedItemClick = (e) => this.dispatchManagedItemClick(e);\n }\n\n /**\n * Sets data-driven breadcrumb items.\n * @param {Array|string|null|undefined} value Breadcrumb items or a JSON string.\n */\n set items(value) {\n const records = this.normalizeItems(value);\n\n this._hasItemsValue = true;\n this._items = records.map((record) => record.item);\n this._itemRecords = records;\n\n this.syncItems(records);\n }\n\n /**\n * Gets data-driven breadcrumb items.\n * @returns {Array}\n */\n get items() {\n return this._items;\n }\n\n /**\n * Set variant attribute for the Breadcrumbs element.\n * @param value\n */\n set variant(value) {\n this.setAttribute('variant', value);\n }\n\n /**\n * Get variant attribute for the Breadcrumbs element.\n * @returns {string}\n */\n get variant() {\n return this.getAttribute('variant') || 'button';\n }\n\n /**\n * Get the collapsed indicator variant.\n * @returns {string}\n */\n get collapsedVariant() {\n return this.getAttribute('collapsed-variant') || this.variant;\n }\n\n /**\n * Sets the collapse breakpoint token or value.\n * @param {string} value Breakpoint token or CSS size.\n */\n set breakpoint(value) {\n if (value) this.setAttribute('breakpoint', value);\n else this.removeAttribute('breakpoint');\n }\n\n /**\n * Gets the collapse breakpoint token or value.\n * @returns {string}\n */\n get breakpoint() {\n return this.getAttribute('breakpoint') || '';\n }\n\n /**\n * Get items before collapse attribute.\n * @param {string} value\n */\n set maxItems(value) {\n this.setAttribute('max-items', value || 0);\n }\n\n /**\n * Get items before collapse attribute.\n * @returns {number}\n */\n get maxItems() {\n return +this.getAttribute('max-items' || 0);\n }\n\n /**\n * Get items before collapse attribute.\n * @param value\n */\n set itemsBeforeCollapse(value) {\n this.setAttribute('items-before-collapse', value || 1);\n }\n\n /**\n * Get items before collapse attribute.\n * @returns {number}\n */\n get itemsBeforeCollapse() {\n return +this.getAttribute('items-before-collapse') || 1;\n }\n\n /**\n * Get items after collapse attribute.\n * @param value\n */\n set itemsAfterCollapse(value) {\n this.setAttribute('items-after-collapse', value || 1);\n }\n\n /**\n * Get items after collapse attribute.\n * @returns {number}\n */\n get itemsAfterCollapse() {\n if (this.hasAttribute('items-after-collapse')) {\n return +this.getAttribute('items-after-collapse') || 1;\n }\n\n const derivedItemsAfterCollapse = this.maxItems - this.itemsBeforeCollapse - 1;\n\n return derivedItemsAfterCollapse > 0 ? derivedItemsAfterCollapse : 1;\n }\n\n /**\n * Class name for the Breadcrumbs element.\n * @type {string}\n */\n className = 'Breadcrumbs';\n\n /**\n * Get CSS stylesheet for the Breadcrumbs 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 ['breakpoint', 'max-items', 'items-before-collapse', 'items-after-collapse', 'collapsed-variant', 'variant'];\n }\n\n /**\n * Setup attributes for the Breadcrumbs element.\n */\n setupAttributes() {\n this.isShadowRoot = 'open';\n this.setAriaState({ role: 'navigation' });\n this.upgradeProperty('items');\n\n if (!this._hasItemsValue && this.hasAttribute('items')) {\n this.items = this.getAttribute('items');\n }\n }\n\n /**\n * Draw method for the Breadcrumbs element.\n * @returns {object} fragment - The document fragment\n */\n draw() {\n let fragment = document.createDocumentFragment();\n\n let element = document.createElement('slot');\n\n fragment.appendChild(element);\n this.defaultSlot = element;\n\n return fragment;\n }\n\n /**\n * Updates the breadcrumb elements after they are drawn on the page.\n * It manages attributes on breadcrumb items and handles the logic for collapsing breadcrumbs\n * if the total exceeds the specified maximum items.\n * @returns {void} This method does not return a value.\n */\n afterDraw() {\n this.onSlotChange = () => this.updateCollapse();\n this.defaultSlot?.addEventListener('slotchange', this.onSlotChange);\n this.addEventListener('click', this.handleManagedItemClick);\n this.handleResize = () => this.handleBreakpointResize();\n\n if (this.getBreakpointWidth()) {\n window.addEventListener('resize', this.handleResize);\n }\n\n if (this._itemRecords.length > 0 && this.getManagedBreadcrumbs().length === 0) {\n this.syncItems(this._itemRecords);\n }\n\n this.updateCollapse();\n }\n\n /**\n * Removes listeners after disconnect.\n */\n afterDisconnect() {\n this.defaultSlot?.removeEventListener('slotchange', this.onSlotChange);\n this.removeEventListener('click', this.handleManagedItemClick);\n window.removeEventListener('resize', this.handleResize);\n this._isCollapsedByBreakpoint = null;\n }\n\n /**\n * Upgrades properties set before the custom element definition was loaded.\n * @param {string} property Property name.\n */\n upgradeProperty(property) {\n if (!Object.prototype.hasOwnProperty.call(this, property)) return;\n\n const value = this[property];\n delete this[property];\n this[property] = value;\n }\n\n /**\n * Normalizes incoming item data for keyed DOM diffing.\n * @param {Array|string|null|undefined} value Breadcrumb item data.\n * @returns {Array<object>}\n */\n normalizeItems(value) {\n let items = value;\n\n if (typeof items === 'string') {\n try {\n items = JSON.parse(items);\n } catch (e) {\n console.warn('Invalid JSON passed to wje-breadcrumbs.items', e);\n items = [];\n }\n }\n\n if (items === null || items === undefined) return [];\n\n if (!Array.isArray(items)) {\n console.warn('wje-breadcrumbs.items expects an array.');\n return [];\n }\n\n const usedKeys = new Set();\n\n return items.map((item, index) => this.normalizeItem(item, index, usedKeys));\n }\n\n /**\n * Normalizes a single item while preserving the original object for events.\n * @param {object|string|number} item Source value for a breadcrumb entry.\n * @param {number} index Position of the value in the current items array.\n * @param {Set<string>} usedKeys Keys that have already been assigned during this update.\n * @returns {object}\n */\n normalizeItem(item, index, usedKeys) {\n const isObject = item !== null && typeof item === 'object';\n const source = isObject\n ? item\n : {\n id: index,\n label: item === null || item === undefined ? '' : String(item),\n };\n\n return {\n item: source,\n key: this.getItemKey(source, index, usedKeys),\n index,\n label: source.label === null || source.label === undefined ? '' : String(source.label),\n href: source.href === null || source.href === undefined ? null : String(source.href),\n icon: source.icon === null || source.icon === undefined || source.icon === '' ? null : String(source.icon),\n disabled: source.disabled === true || source.disabled === '' || source.disabled === 'true' || source.disabled === 1 || source.disabled === '1',\n };\n }\n\n /**\n * Resolves a stable key for an item.\n * @param {object} item Normalized source object used to resolve the key.\n * @param {number} index Fallback position used when the item has no id.\n * @param {Set<string>} usedKeys Keys that have already been assigned during this update.\n * @returns {string}\n */\n getItemKey(item, index, usedKeys) {\n const baseKey = item.id === null || item.id === undefined\n ? String(index)\n : String(item.id);\n let key = baseKey;\n let suffix = 1;\n\n while (usedKeys.has(key)) {\n key = `${baseKey}:${suffix}`;\n suffix += 1;\n }\n\n usedKeys.add(key);\n return key;\n }\n\n /**\n * Incrementally synchronizes data-driven items into light DOM breadcrumbs.\n * @param {Array<object>} records Normalized records for the next breadcrumb trail.\n */\n syncItems(records) {\n const managed = this.getManagedBreadcrumbs();\n const managedByKey = new Map(managed.map((breadcrumb) => [breadcrumb.__wjeBreadcrumbKey || breadcrumb.getAttribute(MANAGED_ITEM_ATTRIBUTE), breadcrumb]));\n const nextKeys = new Set(records.map((record) => record.key));\n\n managed.forEach((breadcrumb) => {\n const key = breadcrumb.__wjeBreadcrumbKey || breadcrumb.getAttribute(MANAGED_ITEM_ATTRIBUTE);\n\n if (!nextKeys.has(key)) {\n breadcrumb.remove();\n }\n });\n\n let referenceNode = this.firstChild;\n\n records.forEach((record, index) => {\n let breadcrumb = managedByKey.get(record.key);\n const signature = this.getItemStructureSignature(record);\n\n if (breadcrumb && breadcrumb.__wjeBreadcrumbSignature !== signature) {\n const previousBreadcrumb = breadcrumb;\n const replacement = this.createItemElement(record, index);\n breadcrumb.replaceWith(replacement);\n breadcrumb = replacement;\n if (referenceNode === previousBreadcrumb) referenceNode = breadcrumb;\n } else if (!breadcrumb) {\n breadcrumb = this.createItemElement(record, index);\n } else {\n this.updateItemElement(breadcrumb, record, index);\n }\n\n if (breadcrumb !== referenceNode) {\n this.insertBefore(breadcrumb, referenceNode);\n }\n\n referenceNode = breadcrumb.nextSibling;\n });\n\n this.updateCollapse();\n }\n\n /**\n * Creates a managed breadcrumb element.\n * @param {object} record Normalized data used to create the breadcrumb.\n * @param {number} index Position assigned to the created breadcrumb.\n * @returns {HTMLElement}\n */\n createItemElement(record, index) {\n const breadcrumb = document.createElement('wje-breadcrumb');\n this.updateItemElement(breadcrumb, record, index);\n\n return breadcrumb;\n }\n\n /**\n * Updates a managed breadcrumb element only where values changed.\n * @param {HTMLElement} breadcrumb Existing managed element to update.\n * @param {object} record Normalized data used for the next rendered state.\n * @param {number} index Position assigned to the managed breadcrumb.\n */\n updateItemElement(breadcrumb, record, index) {\n breadcrumb.__wjeBreadcrumbManaged = true;\n breadcrumb.__wjeBreadcrumbItem = record.item;\n breadcrumb.__wjeBreadcrumbIndex = index;\n breadcrumb.__wjeBreadcrumbKey = record.key;\n breadcrumb.__wjeBreadcrumbSignature = this.getItemStructureSignature(record);\n\n if (breadcrumb.getAttribute(MANAGED_ITEM_ATTRIBUTE) !== record.key) {\n breadcrumb.setAttribute(MANAGED_ITEM_ATTRIBUTE, record.key);\n }\n\n this.syncItemAttribute(breadcrumb, 'href', record.href);\n this.syncItemAttribute(breadcrumb, 'aria-label', record.label || null);\n this.syncBooleanItemAttribute(breadcrumb, 'disabled', record.disabled);\n this.syncItemContent(breadcrumb, record);\n }\n\n /**\n * Synchronizes an attribute when its value changed.\n * @param {HTMLElement} element Element receiving the synchronized attribute.\n * @param {string} name Attribute to add, update, or remove.\n * @param {string|null|undefined} value Next serialized value for the attribute.\n */\n syncItemAttribute(element, name, value) {\n if (value === null || value === undefined || value === false) {\n if (element.hasAttribute(name)) element.removeAttribute(name);\n return;\n }\n\n const normalizedValue = String(value);\n\n if (element.getAttribute(name) !== normalizedValue) {\n element.setAttribute(name, normalizedValue);\n }\n }\n\n /**\n * Synchronizes a boolean attribute.\n * @param {HTMLElement} element Element receiving the boolean attribute.\n * @param {string} name Boolean attribute to toggle.\n * @param {boolean} isEnabled Whether the attribute should be present.\n */\n syncBooleanItemAttribute(element, name, isEnabled) {\n if (isEnabled && !element.hasAttribute(name)) {\n element.setAttribute(name, '');\n }\n\n if (!isEnabled && element.hasAttribute(name)) {\n element.removeAttribute(name);\n }\n }\n\n /**\n * Synchronizes slotted icon and text nodes for a managed breadcrumb.\n * @param {HTMLElement} breadcrumb Breadcrumb element.\n * @param {object} record Normalized item record.\n */\n syncItemContent(breadcrumb, record) {\n let icon = breadcrumb.__wjeBreadcrumbIcon;\n\n if (record.icon) {\n if (!icon || icon.parentElement !== breadcrumb) {\n icon = document.createElement('wje-icon');\n icon.setAttribute('slot', 'start');\n breadcrumb.insertBefore(icon, breadcrumb.firstChild);\n breadcrumb.__wjeBreadcrumbIcon = icon;\n }\n\n if (icon.getAttribute('name') !== record.icon) {\n icon.setAttribute('name', record.icon);\n }\n } else if (icon) {\n icon.remove();\n breadcrumb.__wjeBreadcrumbIcon = null;\n }\n\n let labelNode = breadcrumb.__wjeBreadcrumbLabelNode;\n\n if (!labelNode || labelNode.parentNode !== breadcrumb) {\n labelNode = document.createTextNode('');\n breadcrumb.appendChild(labelNode);\n breadcrumb.__wjeBreadcrumbLabelNode = labelNode;\n }\n\n if (labelNode.textContent !== record.label) {\n labelNode.textContent = record.label;\n }\n }\n\n /**\n * Returns a small signature for structural changes that need item replacement.\n * @param {object} record Normalized item record.\n * @returns {string}\n */\n getItemStructureSignature(record) {\n return `icon:${record.icon ? '1' : '0'}`;\n }\n\n /**\n * Dispatches the data-driven item click event.\n * @param {MouseEvent} e Original click event.\n */\n dispatchManagedItemClick(e) {\n const breadcrumb = this.getManagedBreadcrumbFromEvent(e);\n if (!breadcrumb) return;\n\n const item = breadcrumb.__wjeBreadcrumbItem;\n\n if (item?.disabled || breadcrumb.hasAttribute('disabled')) {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation?.();\n return;\n }\n\n const itemClickEvent = new CustomEvent('wje-breadcrumbs:item-click', {\n detail: {\n item,\n index: breadcrumb.__wjeBreadcrumbIndex,\n originalEvent: e,\n },\n bubbles: true,\n composed: true,\n cancelable: true,\n });\n\n const shouldContinue = this.dispatchEvent(itemClickEvent);\n\n if (!shouldContinue) {\n e.preventDefault();\n }\n }\n\n /**\n * Finds the managed breadcrumb that originated an event.\n * @param {Event} e Event whose composed path should be inspected.\n * @returns {HTMLElement|null}\n */\n getManagedBreadcrumbFromEvent(e) {\n const path = typeof e.composedPath === 'function' ? e.composedPath() : [];\n\n return path.find((node) => (\n node?.nodeType === Node.ELEMENT_NODE &&\n node.tagName?.toLowerCase() === 'wje-breadcrumb' &&\n node.parentElement === this &&\n node.hasAttribute(MANAGED_ITEM_ATTRIBUTE)\n )) || null;\n }\n\n /**\n * Reacts to viewport resize only when the breakpoint mode actually changes.\n * @returns {void}\n */\n handleBreakpointResize() {\n if (!this.getBreakpointWidth()) return;\n\n const nextState = this.shouldApplyBreakpointCollapse();\n\n if (this._isCollapsedByBreakpoint === nextState) return;\n\n this.updateCollapse();\n }\n\n /**\n * Recalculates breadcrumb collapse state.\n * @returns {void}\n */\n updateCollapse() {\n let breadcrumbs = this.getBreadcrumbs();\n\n if (breadcrumbs.length === 0) return;\n\n this._isCollapsedByBreakpoint = this.shouldApplyBreakpointCollapse();\n const effectiveItemsAfterCollapse = this.itemsAfterCollapse;\n const shouldCollapse =\n this._isCollapsedByBreakpoint &&\n this.maxItems > 0 &&\n breadcrumbs.length > this.maxItems &&\n this.itemsBeforeCollapse + effectiveItemsAfterCollapse + 1 <= this.maxItems;\n\n const lastIndex = breadcrumbs.length - 1;\n const indicatorIndex = shouldCollapse ? this.itemsBeforeCollapse : -1;\n const collapseStart = this.itemsBeforeCollapse;\n const collapseEnd = breadcrumbs.length - effectiveItemsAfterCollapse;\n\n breadcrumbs.forEach((breadcrumb, index) => {\n this.syncManagedAttribute(breadcrumb, 'last', index === lastIndex);\n this.syncManagedAttribute(breadcrumb, 'show-collapsed-indicator', index === indicatorIndex);\n\n const isCollapsed =\n shouldCollapse &&\n index >= collapseStart &&\n index < collapseEnd;\n\n this.syncManagedAttribute(breadcrumb, 'collapsed', isCollapsed);\n\n if (!isCollapsed && breadcrumb.classList.contains('collapsed')) {\n breadcrumb.classList.remove('collapsed');\n }\n });\n }\n\n /**\n * Clears attributes/classes managed by the collapse algorithm.\n * @param {Array<Element>} breadcrumbs Breadcrumb items.\n */\n resetCollapseState(breadcrumbs = this.getBreadcrumbs()) {\n breadcrumbs.forEach((breadcrumb) => {\n breadcrumb.removeAttribute('collapsed');\n breadcrumb.removeAttribute('show-collapsed-indicator');\n breadcrumb.removeAttribute('last');\n breadcrumb.classList.remove('collapsed');\n });\n }\n\n /**\n * Applies a managed boolean attribute only when its value truly changes.\n * @param {Element} element Breadcrumb item whose responsive state is being synchronized.\n * @param {string} name Managed state flag that should be synchronized on the breadcrumb item.\n * @param {boolean} isEnabled Whether the attribute should be present.\n */\n syncManagedAttribute(element, name, isEnabled) {\n if (!element) return;\n\n const hasAttribute = element.hasAttribute(name);\n\n if (isEnabled && !hasAttribute) {\n element.setAttribute(name, true);\n }\n\n if (!isEnabled && hasAttribute) {\n element.removeAttribute(name);\n }\n }\n\n /**\n * Returns whether collapse rules should currently be applied.\n * @returns {boolean}\n */\n shouldApplyBreakpointCollapse() {\n const breakpointWidth = this.getBreakpointWidth();\n\n if (!breakpointWidth) return true;\n\n return window.innerWidth < breakpointWidth;\n }\n\n /**\n * Resolves the configured breakpoint to a pixel width.\n * @returns {number|null}\n */\n getBreakpointWidth() {\n if (!this.breakpoint) return null;\n\n const token = this.breakpoint.trim().toLowerCase();\n const cssValue = getComputedStyle(this).getPropertyValue(`--wje-breadcrumbs-breakpoint-${token}`).trim();\n const namedBreakpoint = Breadcrumbs.BREAKPOINTS[token];\n\n if (cssValue) {\n const cssNumber = parseFloat(cssValue);\n if (Number.isFinite(cssNumber)) return cssNumber;\n }\n\n if (Number.isFinite(namedBreakpoint)) {\n return namedBreakpoint;\n }\n\n const directNumber = parseFloat(token);\n return Number.isFinite(directNumber) ? directNumber : null;\n }\n\n /**\n * Retrieves all breadcrumb elements within the current instance.\n * @returns {Array<Element>} An array of breadcrumb elements (`wje-breadcrumb`) found within the instance. Returns an empty array if no breadcrumbs are found.\n */\n getBreadcrumbs() {\n return Array.from(this.querySelectorAll('wje-breadcrumb')) || [];\n }\n\n /**\n * Retrieves breadcrumbs managed by the items property.\n * @returns {Array<Element>}\n */\n getManagedBreadcrumbs() {\n return Array.from(this.querySelectorAll(`wje-breadcrumb[${MANAGED_ITEM_ATTRIBUTE}]`)) || [];\n }\n\n /**\n * Retrieves all breadcrumb elements that have the 'collapsed' attribute.\n * @returns {Array<Element>} An array of DOM elements representing breadcrumbs with the 'collapsed' attribute.\n */\n getBreadcrumbsCollapsed() {\n return Array.from(this.querySelectorAll('wje-breadcrumb[collapsed]')) || [];\n }\n}\n","import Breadcrumbs from './breadcrumbs.element.js';\n\nexport default Breadcrumbs;\n\nBreadcrumbs.define('wje-breadcrumbs', Breadcrumbs);\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"wje-breadcrumbs.js","sources":["../packages/wje-breadcrumbs/breadcrumbs.element.js","../packages/wje-breadcrumbs/breadcrumbs.js"],"sourcesContent":["import { default as WJElement } from '../wje-element/element.js';\nimport styles from './styles/styles.css?inline';\n\nconst MANAGED_ITEM_ATTRIBUTE = 'data-wje-breadcrumbs-item';\n\n/**\n * @summary This class represents a Breadcrumbs container, extending the WJElement class. It acts as a wrapper for individual breadcrumb elements and manages their behavior, such as collapsing and marking the last breadcrumb.\n * @documentation https://elements.webjet.sk/components/breadcrumbs\n * @status stable\n * @augments WJElement\n * @slot - The container for breadcrumb elements.\n * @slot breakpoint-collapse-trigger - Custom trigger used when breakpoint-collapse=\"menu\" moves the full trail into a dropdown.\n * @csspart container - The component's container wrapper.\n * @property {Array<{id: string|number, label: string, href?: string, icon?: string, disabled?: boolean, data?: any}>} items - Data-driven breadcrumb items.\n * @attribute {number} max-items - The maximum number of visible breadcrumbs before collapsing.\n * @attribute {number} items-before-collapse - The number of breadcrumbs to show before the collapsed indicator.\n * @attribute {number} items-after-collapse - The number of breadcrumbs to show after the collapsed indicator.\n * @attribute {string} collapsed-variant - The UI used for collapsed breadcrumbs. Use \"dropdown\" to render a menu.\n * @attribute {string} breakpoint - The viewport breakpoint where collapsing starts.\n * @attribute {string} breakpoint-collapse - The collapse behavior used below the breakpoint. Use \"menu\" to put the whole trail into one menu.\n * @attribute {string} breakpoint-collapse-icon - Icon used by the default breakpoint menu trigger.\n * // @fires wje-breadcrumbs:item-click - Dispatched when a data-driven breadcrumb item is clicked.\n * @tag wje-breadcrumbs\n * @example\n * <!-- Example usage -->\n * <wje-breadcrumbs max-items=\"5\" items-before-collapse=\"2\" items-after-collapse=\"2\">\n * <wje-breadcrumb>Home</wje-breadcrumb>\n * <wje-breadcrumb>About</wje-breadcrumb>\n * <wje-breadcrumb>Services</wje-breadcrumb>\n * <wje-breadcrumb>Portfolio</wje-breadcrumb>\n * <wje-breadcrumb>Contact</wje-breadcrumb>\n * </wje-breadcrumbs>\n *\n * <!-- Output: Only the first two and last two breadcrumbs will be visible, with a collapsed indicator in the middle -->\n */\n\nexport default class Breadcrumbs extends WJElement {\n static BREAKPOINTS = {\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n '2xl': 1450,\n xxl: 1450,\n };\n\n /**\n * Breadcrumbs constructor method.\n * @class\n */\n constructor() {\n super();\n\n /**\n * Last breadcrumb flag\n * @type {boolean}\n */\n this.last = false;\n this._isCollapsedByBreakpoint = null;\n this._items = [];\n this._itemRecords = [];\n this._hasItemsValue = false;\n this.handleManagedItemClick = (e) => this.dispatchManagedItemClick(e);\n }\n\n /**\n * Sets data-driven breadcrumb items.\n * @param {Array|string|null|undefined} value Breadcrumb items or a JSON string.\n */\n set items(value) {\n const records = this.normalizeItems(value);\n\n this._hasItemsValue = true;\n this._items = records.map((record) => record.item);\n this._itemRecords = records;\n\n this.syncItems(records);\n }\n\n /**\n * Gets data-driven breadcrumb items.\n * @returns {Array}\n */\n get items() {\n return this._items;\n }\n\n /**\n * Set variant attribute for the Breadcrumbs element.\n * @param value\n */\n set variant(value) {\n this.setAttribute('variant', value);\n }\n\n /**\n * Get variant attribute for the Breadcrumbs element.\n * @returns {string}\n */\n get variant() {\n return this.getAttribute('variant') || 'button';\n }\n\n /**\n * Get the collapsed indicator variant.\n * @param {string} value Collapsed indicator variant.\n */\n set collapsedVariant(value) {\n if (value) this.setAttribute('collapsed-variant', value);\n else this.removeAttribute('collapsed-variant');\n }\n\n /**\n * Get the collapsed indicator variant.\n * @returns {string}\n */\n get collapsedVariant() {\n return this.getAttribute('collapsed-variant') || this.variant;\n }\n\n /**\n * Sets the collapse breakpoint token or value.\n * @param {string} value Breakpoint token or CSS size.\n */\n set breakpoint(value) {\n if (value) this.setAttribute('breakpoint', value);\n else this.removeAttribute('breakpoint');\n }\n\n /**\n * Gets the collapse breakpoint token or value.\n * @returns {string}\n */\n get breakpoint() {\n return this.getAttribute('breakpoint') || '';\n }\n\n /**\n * Sets the collapse behavior used below the configured breakpoint.\n * @param {string} value Collapse behavior.\n */\n set breakpointCollapse(value) {\n if (value) this.setAttribute('breakpoint-collapse', value);\n else this.removeAttribute('breakpoint-collapse');\n }\n\n /**\n * Gets the collapse behavior used below the configured breakpoint.\n * @returns {string}\n */\n get breakpointCollapse() {\n return (this.getAttribute('breakpoint-collapse') || 'items').toLowerCase();\n }\n\n /**\n * Sets the icon used by the default breakpoint menu trigger.\n * @param {string} value Icon name.\n */\n set breakpointCollapseIcon(value) {\n if (value) this.setAttribute('breakpoint-collapse-icon', value);\n else this.removeAttribute('breakpoint-collapse-icon');\n }\n\n /**\n * Gets the icon used by the default breakpoint menu trigger.\n * @returns {string}\n */\n get breakpointCollapseIcon() {\n return this.getAttribute('breakpoint-collapse-icon') || '';\n }\n\n /**\n * Get items before collapse attribute.\n * @param {string} value\n */\n set maxItems(value) {\n this.setAttribute('max-items', value || 0);\n }\n\n /**\n * Get items before collapse attribute.\n * @returns {number}\n */\n get maxItems() {\n return +this.getAttribute('max-items' || 0);\n }\n\n /**\n * Get items before collapse attribute.\n * @param value\n */\n set itemsBeforeCollapse(value) {\n this.setAttribute('items-before-collapse', value || 1);\n }\n\n /**\n * Get items before collapse attribute.\n * @returns {number}\n */\n get itemsBeforeCollapse() {\n return +this.getAttribute('items-before-collapse') || 1;\n }\n\n /**\n * Get items after collapse attribute.\n * @param value\n */\n set itemsAfterCollapse(value) {\n this.setAttribute('items-after-collapse', value || 1);\n }\n\n /**\n * Get items after collapse attribute.\n * @returns {number}\n */\n get itemsAfterCollapse() {\n if (this.hasAttribute('items-after-collapse')) {\n return +this.getAttribute('items-after-collapse') || 1;\n }\n\n const derivedItemsAfterCollapse = this.maxItems - this.itemsBeforeCollapse - 1;\n\n return derivedItemsAfterCollapse > 0 ? derivedItemsAfterCollapse : 1;\n }\n\n /**\n * Class name for the Breadcrumbs element.\n * @type {string}\n */\n className = 'Breadcrumbs';\n\n /**\n * Get CSS stylesheet for the Breadcrumbs 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 [\n 'breakpoint',\n 'breakpoint-collapse',\n 'max-items',\n 'items-before-collapse',\n 'items-after-collapse',\n 'collapsed-variant',\n 'breakpoint-collapse-icon',\n 'variant',\n ];\n }\n\n /**\n * Setup attributes for the Breadcrumbs element.\n */\n setupAttributes() {\n this.isShadowRoot = 'open';\n this.setAriaState({ role: 'navigation' });\n this.upgradeProperty('items');\n\n if (!this._hasItemsValue && this.hasAttribute('items')) {\n this.items = this.getAttribute('items');\n }\n }\n\n /**\n * Handles attribute changes that affect light-DOM breadcrumb indicators.\n * @param {string} name Updated attribute.\n * @param {string|null} oldValue Previous value.\n * @param {string|null} newValue Next value.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (oldValue === newValue) return;\n\n super.attributeChangedCallback?.(name, oldValue, newValue);\n\n if (name === 'collapsed-variant' || name === 'variant' || name === 'breakpoint-collapse' || name === 'breakpoint-collapse-icon') {\n this.refreshCollapsedIndicators();\n }\n }\n\n /**\n * Draw method for the Breadcrumbs element.\n * @returns {object} fragment - The document fragment\n */\n draw() {\n let fragment = document.createDocumentFragment();\n\n let element = document.createElement('slot');\n\n fragment.appendChild(element);\n this.defaultSlot = element;\n\n return fragment;\n }\n\n /**\n * Updates the breadcrumb elements after they are drawn on the page.\n * It manages attributes on breadcrumb items and handles the logic for collapsing breadcrumbs\n * if the total exceeds the specified maximum items.\n * @returns {void} This method does not return a value.\n */\n afterDraw() {\n this.onSlotChange = () => this.updateCollapse();\n this.defaultSlot?.addEventListener('slotchange', this.onSlotChange);\n this.addEventListener('click', this.handleManagedItemClick);\n this.handleResize = () => this.handleBreakpointResize();\n\n if (this.getBreakpointWidth()) {\n window.addEventListener('resize', this.handleResize);\n }\n\n if (this._itemRecords.length > 0 && this.getManagedBreadcrumbs().length === 0) {\n this.syncItems(this._itemRecords);\n }\n\n this.updateCollapse();\n }\n\n /**\n * Removes listeners after disconnect.\n */\n afterDisconnect() {\n this.defaultSlot?.removeEventListener('slotchange', this.onSlotChange);\n this.removeEventListener('click', this.handleManagedItemClick);\n window.removeEventListener('resize', this.handleResize);\n this._isCollapsedByBreakpoint = null;\n }\n\n /**\n * Upgrades properties set before the custom element definition was loaded.\n * @param {string} property Property name.\n */\n upgradeProperty(property) {\n if (!Object.prototype.hasOwnProperty.call(this, property)) return;\n\n const value = this[property];\n delete this[property];\n this[property] = value;\n }\n\n /**\n * Normalizes incoming item data for keyed DOM diffing.\n * @param {Array|string|null|undefined} value Breadcrumb item data.\n * @returns {Array<object>}\n */\n normalizeItems(value) {\n let items = value;\n\n if (typeof items === 'string') {\n try {\n items = JSON.parse(items);\n } catch (e) {\n console.warn('Invalid JSON passed to wje-breadcrumbs.items', e);\n items = [];\n }\n }\n\n if (items === null || items === undefined) return [];\n\n if (!Array.isArray(items)) {\n console.warn('wje-breadcrumbs.items expects an array.');\n return [];\n }\n\n const usedKeys = new Set();\n\n return items.map((item, index) => this.normalizeItem(item, index, usedKeys));\n }\n\n /**\n * Normalizes a single item while preserving the original object for events.\n * @param {object|string|number} item Source value for a breadcrumb entry.\n * @param {number} index Position of the value in the current items array.\n * @param {Set<string>} usedKeys Keys that have already been assigned during this update.\n * @returns {object}\n */\n normalizeItem(item, index, usedKeys) {\n const isObject = item !== null && typeof item === 'object';\n const source = isObject\n ? item\n : {\n id: index,\n label: item === null || item === undefined ? '' : String(item),\n };\n\n return {\n item: source,\n key: this.getItemKey(source, index, usedKeys),\n index,\n label: source.label === null || source.label === undefined ? '' : String(source.label),\n href: source.href === null || source.href === undefined ? null : String(source.href),\n icon: source.icon === null || source.icon === undefined || source.icon === '' ? null : String(source.icon),\n disabled: source.disabled === true || source.disabled === '' || source.disabled === 'true' || source.disabled === 1 || source.disabled === '1',\n };\n }\n\n /**\n * Resolves a stable key for an item.\n * @param {object} item Normalized source object used to resolve the key.\n * @param {number} index Fallback position used when the item has no id.\n * @param {Set<string>} usedKeys Keys that have already been assigned during this update.\n * @returns {string}\n */\n getItemKey(item, index, usedKeys) {\n const baseKey = item.id === null || item.id === undefined\n ? String(index)\n : String(item.id);\n let key = baseKey;\n let suffix = 1;\n\n while (usedKeys.has(key)) {\n key = `${baseKey}:${suffix}`;\n suffix += 1;\n }\n\n usedKeys.add(key);\n return key;\n }\n\n /**\n * Incrementally synchronizes data-driven items into light DOM breadcrumbs.\n * @param {Array<object>} records Normalized records for the next breadcrumb trail.\n */\n syncItems(records) {\n const managed = this.getManagedBreadcrumbs();\n const managedByKey = new Map(managed.map((breadcrumb) => [breadcrumb.__wjeBreadcrumbKey || breadcrumb.getAttribute(MANAGED_ITEM_ATTRIBUTE), breadcrumb]));\n const nextKeys = new Set(records.map((record) => record.key));\n\n managed.forEach((breadcrumb) => {\n const key = breadcrumb.__wjeBreadcrumbKey || breadcrumb.getAttribute(MANAGED_ITEM_ATTRIBUTE);\n\n if (!nextKeys.has(key)) {\n breadcrumb.remove();\n }\n });\n\n let referenceNode = this.firstChild;\n\n records.forEach((record, index) => {\n let breadcrumb = managedByKey.get(record.key);\n const signature = this.getItemStructureSignature(record);\n\n if (breadcrumb && breadcrumb.__wjeBreadcrumbSignature !== signature) {\n const previousBreadcrumb = breadcrumb;\n const replacement = this.createItemElement(record, index);\n breadcrumb.replaceWith(replacement);\n breadcrumb = replacement;\n if (referenceNode === previousBreadcrumb) referenceNode = breadcrumb;\n } else if (!breadcrumb) {\n breadcrumb = this.createItemElement(record, index);\n } else {\n this.updateItemElement(breadcrumb, record, index);\n }\n\n if (breadcrumb !== referenceNode) {\n this.insertBefore(breadcrumb, referenceNode);\n }\n\n referenceNode = breadcrumb.nextSibling;\n });\n\n this.updateCollapse();\n }\n\n /**\n * Creates a managed breadcrumb element.\n * @param {object} record Normalized data used to create the breadcrumb.\n * @param {number} index Position assigned to the created breadcrumb.\n * @returns {HTMLElement}\n */\n createItemElement(record, index) {\n const breadcrumb = document.createElement('wje-breadcrumb');\n this.updateItemElement(breadcrumb, record, index);\n\n return breadcrumb;\n }\n\n /**\n * Updates a managed breadcrumb element only where values changed.\n * @param {HTMLElement} breadcrumb Existing managed element to update.\n * @param {object} record Normalized data used for the next rendered state.\n * @param {number} index Position assigned to the managed breadcrumb.\n */\n updateItemElement(breadcrumb, record, index) {\n breadcrumb.__wjeBreadcrumbManaged = true;\n breadcrumb.__wjeBreadcrumbItem = record.item;\n breadcrumb.__wjeBreadcrumbIndex = index;\n breadcrumb.__wjeBreadcrumbKey = record.key;\n breadcrumb.__wjeBreadcrumbSignature = this.getItemStructureSignature(record);\n\n if (breadcrumb.getAttribute(MANAGED_ITEM_ATTRIBUTE) !== record.key) {\n breadcrumb.setAttribute(MANAGED_ITEM_ATTRIBUTE, record.key);\n }\n\n this.syncItemAttribute(breadcrumb, 'href', record.href);\n this.syncItemAttribute(breadcrumb, 'aria-label', record.label || null);\n this.syncBooleanItemAttribute(breadcrumb, 'disabled', record.disabled);\n this.syncItemContent(breadcrumb, record);\n }\n\n /**\n * Synchronizes an attribute when its value changed.\n * @param {HTMLElement} element Element receiving the synchronized attribute.\n * @param {string} name Attribute to add, update, or remove.\n * @param {string|null|undefined} value Next serialized value for the attribute.\n */\n syncItemAttribute(element, name, value) {\n if (value === null || value === undefined || value === false) {\n if (element.hasAttribute(name)) element.removeAttribute(name);\n return;\n }\n\n const normalizedValue = String(value);\n\n if (element.getAttribute(name) !== normalizedValue) {\n element.setAttribute(name, normalizedValue);\n }\n }\n\n /**\n * Synchronizes a boolean attribute.\n * @param {HTMLElement} element Element receiving the boolean attribute.\n * @param {string} name Boolean attribute to toggle.\n * @param {boolean} isEnabled Whether the attribute should be present.\n */\n syncBooleanItemAttribute(element, name, isEnabled) {\n if (isEnabled && !element.hasAttribute(name)) {\n element.setAttribute(name, '');\n }\n\n if (!isEnabled && element.hasAttribute(name)) {\n element.removeAttribute(name);\n }\n }\n\n /**\n * Synchronizes slotted icon and text nodes for a managed breadcrumb.\n * @param {HTMLElement} breadcrumb Breadcrumb element.\n * @param {object} record Normalized item record.\n */\n syncItemContent(breadcrumb, record) {\n let icon = breadcrumb.__wjeBreadcrumbIcon;\n\n if (record.icon) {\n if (!icon || icon.parentElement !== breadcrumb) {\n icon = document.createElement('wje-icon');\n icon.setAttribute('slot', 'start');\n breadcrumb.insertBefore(icon, breadcrumb.firstChild);\n breadcrumb.__wjeBreadcrumbIcon = icon;\n }\n\n if (icon.getAttribute('name') !== record.icon) {\n icon.setAttribute('name', record.icon);\n }\n } else if (icon) {\n icon.remove();\n breadcrumb.__wjeBreadcrumbIcon = null;\n }\n\n let labelNode = breadcrumb.__wjeBreadcrumbLabelNode;\n\n if (!labelNode || labelNode.parentNode !== breadcrumb) {\n labelNode = document.createTextNode('');\n breadcrumb.appendChild(labelNode);\n breadcrumb.__wjeBreadcrumbLabelNode = labelNode;\n }\n\n if (labelNode.textContent !== record.label) {\n labelNode.textContent = record.label;\n }\n }\n\n /**\n * Returns a small signature for structural changes that need item replacement.\n * @param {object} record Normalized item record.\n * @returns {string}\n */\n getItemStructureSignature(record) {\n return `icon:${record.icon ? '1' : '0'}`;\n }\n\n /**\n * Dispatches the data-driven item click event.\n * @param {MouseEvent} e Original click event.\n */\n dispatchManagedItemClick(e) {\n const breadcrumb = this.getManagedBreadcrumbFromEvent(e);\n if (!breadcrumb) return;\n\n const item = breadcrumb.__wjeBreadcrumbItem;\n\n if (item?.disabled || breadcrumb.hasAttribute('disabled')) {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation?.();\n return;\n }\n\n const itemClickEvent = new CustomEvent('wje-breadcrumbs:item-click', {\n detail: {\n item,\n index: breadcrumb.__wjeBreadcrumbIndex,\n originalEvent: e,\n },\n bubbles: true,\n composed: true,\n cancelable: true,\n });\n\n const shouldContinue = this.dispatchEvent(itemClickEvent);\n\n if (!shouldContinue) {\n e.preventDefault();\n }\n }\n\n /**\n * Finds the managed breadcrumb that originated an event.\n * @param {Event} e Event whose composed path should be inspected.\n * @returns {HTMLElement|null}\n */\n getManagedBreadcrumbFromEvent(e) {\n const path = typeof e.composedPath === 'function' ? e.composedPath() : [];\n\n return path.find((node) => (\n node?.nodeType === Node.ELEMENT_NODE &&\n node.tagName?.toLowerCase() === 'wje-breadcrumb' &&\n node.parentElement === this &&\n node.hasAttribute(MANAGED_ITEM_ATTRIBUTE)\n )) || null;\n }\n\n /**\n * Reacts to viewport resize only when the breakpoint mode actually changes.\n * @returns {void}\n */\n handleBreakpointResize() {\n if (!this.getBreakpointWidth()) return;\n\n const nextState = this.shouldApplyBreakpointCollapse();\n\n if (this._isCollapsedByBreakpoint === nextState) return;\n\n this.updateCollapse();\n }\n\n /**\n * Recalculates breadcrumb collapse state.\n * @returns {void}\n */\n updateCollapse() {\n let breadcrumbs = this.getBreadcrumbs();\n\n if (breadcrumbs.length === 0) return;\n\n this._isCollapsedByBreakpoint = this.shouldApplyBreakpointCollapse();\n const shouldCollapseToMenu = this.isBreakpointMenuCollapseActive() && breadcrumbs.length > 1;\n\n if (shouldCollapseToMenu) {\n this.applyMenuCollapse(breadcrumbs);\n return;\n }\n\n const effectiveItemsAfterCollapse = this.itemsAfterCollapse;\n const shouldUseItemCollapse = this.breakpointCollapse === 'menu' || this._isCollapsedByBreakpoint;\n const shouldCollapse =\n shouldUseItemCollapse &&\n this.maxItems > 0 &&\n breadcrumbs.length > this.maxItems &&\n this.itemsBeforeCollapse + effectiveItemsAfterCollapse + 1 <= this.maxItems;\n\n const lastIndex = breadcrumbs.length - 1;\n const indicatorIndex = shouldCollapse ? this.itemsBeforeCollapse : -1;\n const collapseStart = this.itemsBeforeCollapse;\n const collapseEnd = breadcrumbs.length - effectiveItemsAfterCollapse;\n\n breadcrumbs.forEach((breadcrumb, index) => {\n this.syncManagedAttribute(breadcrumb, 'last', index === lastIndex);\n this.syncManagedAttribute(breadcrumb, 'show-collapsed-indicator', index === indicatorIndex);\n\n const isCollapsed =\n shouldCollapse &&\n index >= collapseStart &&\n index < collapseEnd;\n\n this.syncManagedAttribute(breadcrumb, 'collapsed', isCollapsed);\n\n if (!isCollapsed && breadcrumb.classList.contains('collapsed')) {\n breadcrumb.classList.remove('collapsed');\n }\n });\n }\n\n /**\n * Collapses the whole breadcrumb trail into a single menu indicator.\n * @param {Array<Element>} breadcrumbs Breadcrumb items.\n */\n applyMenuCollapse(breadcrumbs) {\n const lastIndex = breadcrumbs.length - 1;\n\n breadcrumbs.forEach((breadcrumb, index) => {\n const isIndicator = index === 0;\n\n this.syncManagedAttribute(breadcrumb, 'last', index === lastIndex);\n this.syncManagedAttribute(breadcrumb, 'show-collapsed-indicator', isIndicator);\n this.syncManagedAttribute(breadcrumb, 'collapsed', true);\n\n if (isIndicator) {\n breadcrumb.classList.remove('collapsed');\n }\n });\n }\n\n /**\n * Returns whether the active breakpoint mode should move the full trail into one menu.\n * @returns {boolean}\n */\n isBreakpointMenuCollapseActive() {\n return Boolean(\n this.getBreakpointWidth() &&\n this._isCollapsedByBreakpoint &&\n this.breakpointCollapse === 'menu'\n );\n }\n\n /**\n * Clears attributes/classes managed by the collapse algorithm.\n * @param {Array<Element>} breadcrumbs Breadcrumb items.\n */\n resetCollapseState(breadcrumbs = this.getBreadcrumbs()) {\n breadcrumbs.forEach((breadcrumb) => {\n breadcrumb.removeAttribute('collapsed');\n breadcrumb.removeAttribute('show-collapsed-indicator');\n breadcrumb.removeAttribute('last');\n breadcrumb.classList.remove('collapsed');\n });\n }\n\n /**\n * Applies a managed boolean attribute only when its value truly changes.\n * @param {Element} element Breadcrumb item whose responsive state is being synchronized.\n * @param {string} name Managed state flag that should be synchronized on the breadcrumb item.\n * @param {boolean} isEnabled Whether the attribute should be present.\n */\n syncManagedAttribute(element, name, isEnabled) {\n if (!element) return;\n\n const hasAttribute = element.hasAttribute(name);\n\n if (isEnabled && !hasAttribute) {\n element.setAttribute(name, true);\n }\n\n if (!isEnabled && hasAttribute) {\n element.removeAttribute(name);\n }\n }\n\n /**\n * Redraws active collapsed indicators when parent-only rendering inputs change.\n */\n refreshCollapsedIndicators() {\n this.getBreadcrumbs()\n .filter((breadcrumb) => breadcrumb.hasAttribute('show-collapsed-indicator'))\n .forEach((breadcrumb) => breadcrumb.refresh?.());\n }\n\n /**\n * Returns whether collapse rules should currently be applied.\n * @returns {boolean}\n */\n shouldApplyBreakpointCollapse() {\n const breakpointWidth = this.getBreakpointWidth();\n\n if (!breakpointWidth) return true;\n\n return window.innerWidth < breakpointWidth;\n }\n\n /**\n * Resolves the configured breakpoint to a pixel width.\n * @returns {number|null}\n */\n getBreakpointWidth() {\n if (!this.breakpoint) return null;\n\n const token = this.breakpoint.trim().toLowerCase();\n const cssValue = getComputedStyle(this).getPropertyValue(`--wje-breadcrumbs-breakpoint-${token}`).trim();\n const namedBreakpoint = Breadcrumbs.BREAKPOINTS[token];\n\n if (cssValue) {\n const cssNumber = parseFloat(cssValue);\n if (Number.isFinite(cssNumber)) return cssNumber;\n }\n\n if (Number.isFinite(namedBreakpoint)) {\n return namedBreakpoint;\n }\n\n const directNumber = parseFloat(token);\n return Number.isFinite(directNumber) ? directNumber : null;\n }\n\n /**\n * Returns the custom trigger element configured for breakpoint menu collapse.\n * @returns {Element|null}\n */\n getBreakpointCollapseTrigger() {\n return Array.from(this.children)\n .find((child) => child.getAttribute?.('slot') === 'breakpoint-collapse-trigger') || null;\n }\n\n /**\n * Retrieves all breadcrumb elements within the current instance.\n * @returns {Array<Element>} An array of breadcrumb elements (`wje-breadcrumb`) found within the instance. Returns an empty array if no breadcrumbs are found.\n */\n getBreadcrumbs() {\n return Array.from(this.querySelectorAll('wje-breadcrumb')) || [];\n }\n\n /**\n * Retrieves breadcrumbs managed by the items property.\n * @returns {Array<Element>}\n */\n getManagedBreadcrumbs() {\n return Array.from(this.querySelectorAll(`wje-breadcrumb[${MANAGED_ITEM_ATTRIBUTE}]`)) || [];\n }\n\n /**\n * Retrieves all breadcrumb elements that have the 'collapsed' attribute.\n * @returns {Array<Element>} An array of DOM elements representing breadcrumbs with the 'collapsed' attribute.\n */\n getBreadcrumbsCollapsed() {\n return Array.from(this.querySelectorAll('wje-breadcrumb[collapsed]')) || [];\n }\n}\n","import Breadcrumbs from './breadcrumbs.element.js';\n\nexport default Breadcrumbs;\n\nBreadcrumbs.define('wje-breadcrumbs', Breadcrumbs);\n"],"names":[],"mappings":"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"}
|
package/dist/wje-menu-item.js
CHANGED
|
@@ -32,7 +32,7 @@ const styles = `/*
|
|
|
32
32
|
display: flex;
|
|
33
33
|
flex-wrap: nowrap;
|
|
34
34
|
align-items: center;
|
|
35
|
-
justify-content: center;
|
|
35
|
+
justify-content: var(--wje-menu-item-justify-content, center);
|
|
36
36
|
color: var(--wje-menu-item-color);
|
|
37
37
|
padding-top: var(--wje-menu-item-padding-top);
|
|
38
38
|
padding-bottom: var(--wje-menu-item-padding-bottom);
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wj-elements",
|
|
3
3
|
"description": "WebJET Elements is a modern set of user interface tools harnessing the power of web components designed to simplify web application development.",
|
|
4
|
-
"version": "0.5.
|
|
4
|
+
"version": "0.5.1",
|
|
5
5
|
"homepage": "https://github.com/lencys/wj-elements",
|
|
6
6
|
"author": "Lukáš Ondrejček <lukas.ondrejcek@gmail.com>",
|
|
7
7
|
"license": "MIT",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
],
|
|
16
16
|
"repository": {
|
|
17
17
|
"type": "git",
|
|
18
|
-
"url": "https://github.com/lencys/wj-elements.git"
|
|
18
|
+
"url": "git+https://github.com/lencys/wj-elements.git"
|
|
19
19
|
},
|
|
20
20
|
"type": "module",
|
|
21
21
|
"web-types": "dist/web-types.json",
|