-
Notifications
You must be signed in to change notification settings - Fork 64
Expand file tree
/
Copy pathbreadcrumbs.element.ts
More file actions
85 lines (73 loc) · 2.47 KB
/
breadcrumbs.element.ts
File metadata and controls
85 lines (73 loc) · 2.47 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import { css, html, LitElement } from 'lit';
import { queryAssignedElements } from 'lit/decorators.js';
import { UUIBreadcrumbItemElement } from './breadcrumb-item.element.js';
import '../responsive-container/responsive-container.js';
/**
* A breadcrumbs component to be used in combination with the uui-breadcrumb-item.
* @element uui-breadcrumbs
* @slot - Slot to display nested breadcrumb items. It supports `<uui-breadcrumb-item>` elements or elements containing the `role="listitem"` attribute
*/
export class UUIBreadcrumbsElement extends LitElement {
@queryAssignedElements({
flatten: true,
selector: 'uui-breadcrumb-item, [uui-breadcrumb-item], [role=listitem]',
})
private readonly slotNodes!: HTMLElement[];
private elementIsBreadcrumbItem(el: unknown): el is UUIBreadcrumbItemElement {
return el instanceof UUIBreadcrumbItemElement;
}
connectedCallback() {
super.connectedCallback();
this.setAttribute('aria-label', 'breadcrumb');
this.setAttribute('role', 'navigation');
}
handleSlotChange() {
if (this.slotNodes.length > 0) {
const lastItem = this.slotNodes[this.slotNodes.length - 1];
lastItem.setAttribute('aria-current', 'page');
if (this.elementIsBreadcrumbItem(lastItem)) {
lastItem.lastItem = true;
}
}
}
render() {
return html`<uui-responsive-container
id="breadcrumbs-list"
collapse="start">
<span slot="trigger-content">
<span class="ellipsis">…</span> <span class="separator">/</span>
</span>
<slot @slotchange=${this.handleSlotChange}></slot>
</uui-responsive-container>`;
}
static override readonly styles = [
css`
:host {
display: flex;
}
#breadcrumbs-list {
display: flex;
list-style-type: decimal;
margin-block-start: 0em;
margin-block-end: 0em;
margin-inline-start: 0px;
margin-inline-end: 0px;
padding-inline-start: 0px;
}
uui-responsive-container {
--uui-responsive-container-gap: 0;
}
/* Style the trigger content to match breadcrumb items */
[slot='trigger-content'] {
font-size: var(--uui-type-small-size);
}
[slot='trigger-content'] .ellipsis {
color: currentColor; /* Black/default text color */
}
[slot='trigger-content'] .separator {
color: var(--uui-color-border); /* Matches breadcrumb separator */
margin-left: var(--uui-size-2);
}
`,
];
}