@m3e/web 2.3.2 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/all.js +746 -32
- package/dist/all.js.map +1 -1
- package/dist/all.min.js +15 -15
- package/dist/all.min.js.map +1 -1
- package/dist/core.js +2 -2
- package/dist/core.js.map +1 -1
- package/dist/core.min.js +1 -1
- package/dist/core.min.js.map +1 -1
- package/dist/css-custom-data.json +375 -265
- package/dist/custom-elements.json +17627 -16439
- package/dist/html-custom-data.json +195 -156
- package/dist/list.js +1 -1
- package/dist/list.js.map +1 -1
- package/dist/list.min.js +1 -1
- package/dist/list.min.js.map +1 -1
- package/dist/nav-menu.js +18 -26
- package/dist/nav-menu.js.map +1 -1
- package/dist/nav-menu.min.js +1 -1
- package/dist/nav-menu.min.js.map +1 -1
- package/dist/src/all.d.ts +1 -0
- package/dist/src/all.d.ts.map +1 -1
- package/dist/src/core/shared/primitives/PseudoCheckboxElement.d.ts.map +1 -1
- package/dist/src/core/shared/primitives/PseudoRadioElement.d.ts.map +1 -1
- package/dist/src/list/ListItemElement.d.ts.map +1 -1
- package/dist/src/nav-menu/NavMenuElement.d.ts +18 -6
- package/dist/src/nav-menu/NavMenuElement.d.ts.map +1 -1
- package/dist/src/nav-menu/NavMenuItemElement.d.ts +3 -5
- package/dist/src/nav-menu/NavMenuItemElement.d.ts.map +1 -1
- package/dist/src/tree/TreeElement.d.ts +150 -0
- package/dist/src/tree/TreeElement.d.ts.map +1 -0
- package/dist/src/tree/TreeItemElement.d.ts +131 -0
- package/dist/src/tree/TreeItemElement.d.ts.map +1 -0
- package/dist/src/tree/index.d.ts +3 -0
- package/dist/src/tree/index.d.ts.map +1 -0
- package/dist/tree.js +737 -0
- package/dist/tree.js.map +1 -0
- package/dist/tree.min.js +7 -0
- package/dist/tree.min.js.map +1 -0
- package/package.json +7 -2
package/dist/tree.js
ADDED
|
@@ -0,0 +1,737 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license MIT
|
|
3
|
+
* Copyright (c) 2025–2026 matraic
|
|
4
|
+
* See LICENSE file in the project root for full license text.
|
|
5
|
+
*/
|
|
6
|
+
import { __classPrivateFieldGet, __classPrivateFieldSet, __decorate } from 'tslib';
|
|
7
|
+
import { LitElement, nothing, html, unsafeCSS, css } from 'lit';
|
|
8
|
+
import { query, state, property } from 'lit/decorators.js';
|
|
9
|
+
import { Selected, Disabled, EventAttribute, AttachInternals, Role, MutationController, setCustomState, hasAssignedNodes, DesignToken, customElement, PressedController, FocusController, scrollIntoViewIfNeeded, registerStyleSheet } from '@m3e/web/core';
|
|
10
|
+
import { selectionManager, SelectionManager } from '@m3e/web/core/a11y';
|
|
11
|
+
import { M3eDirectionality } from '@m3e/web/core/bidi';
|
|
12
|
+
import { ifDefined } from 'lit/directives/if-defined.js';
|
|
13
|
+
|
|
14
|
+
var _M3eTreeItemElement_instances, _M3eTreeItemElement_treeMutationController, _M3eTreeItemElement_items, _M3eTreeItemElement_tree, _M3eTreeItemElement_path, _M3eTreeItemElement_link, _M3eTreeItemElement_renderIcon, _M3eTreeItemElement_handleOpenToggleIconSlotChange, _M3eTreeItemElement_handleIconSlotChange, _M3eTreeItemElement_handleSlotChange, _M3eTreeItemElement_handleItemSlotChange, _M3eTreeItemElement_handleTreeChange, _M3eTreeItemElement_handleClick, _M3eTreeItemElement_handleCheckboxClick, _M3eTreeItemElement_handleCollapsibleEvent;
|
|
15
|
+
var M3eTreeItemElement_1;
|
|
16
|
+
/**
|
|
17
|
+
* An expandable item in a tree.
|
|
18
|
+
*
|
|
19
|
+
* @description
|
|
20
|
+
* The `m3e-tree-item` component represents a single item within an `m3e-tree`.
|
|
21
|
+
* It supports nested child items, expand/collapse behavior, selection,
|
|
22
|
+
* disabled state, and interaction styling. Items may contain a child group
|
|
23
|
+
* that hosts additional `m3e-tree-item` elements.
|
|
24
|
+
*
|
|
25
|
+
* @tag m3e-tree-item
|
|
26
|
+
*
|
|
27
|
+
* @slot - Renders the nested child items.
|
|
28
|
+
* @slot label - Renders the label of the item.
|
|
29
|
+
* @slot icon - Renders the icon of the item.
|
|
30
|
+
* @slot selected-icon - Renders the icon of the item when selected.
|
|
31
|
+
* @slot toggle-icon - Renders the toggle icon.
|
|
32
|
+
* @slot open-toggle-icon - Renders the toggle icon when selected.
|
|
33
|
+
*
|
|
34
|
+
* @attr disabled - Whether the element is disabled.
|
|
35
|
+
* @attr indeterminate - Whether the element's checked state is indeterminate.
|
|
36
|
+
* @attr open - Whether the item is expanded.
|
|
37
|
+
* @attr selected - Whether the item is selected.
|
|
38
|
+
*
|
|
39
|
+
* @fires opening - Emitted when the item begins to open.
|
|
40
|
+
* @fires opened - Emitted when the item has opened.
|
|
41
|
+
* @fires closing - Emitted when the item begins to close.
|
|
42
|
+
* @fires closed - Emitted when the item has closed.
|
|
43
|
+
* @fires click - Emitted when the element is clicked.
|
|
44
|
+
*
|
|
45
|
+
* @cssprop --m3e-tree-item-font-size - Font size for the item label.
|
|
46
|
+
* @cssprop --m3e-tree-item-font-weight - Font weight for the item label.
|
|
47
|
+
* @cssprop --m3e-tree-item-line-height - Line height for the item label.
|
|
48
|
+
* @cssprop --m3e-tree-item-tracking - Letter spacing for the item label.
|
|
49
|
+
* @cssprop --m3e-tree-item-padding - Inline padding for the item.
|
|
50
|
+
* @cssprop --m3e-tree-item-height - Height of the item.
|
|
51
|
+
* @cssprop --m3e-tree-item-shape - Border radius of the item and focus ring.
|
|
52
|
+
* @cssprop --m3e-tree-item-icon-size - Size of the icon.
|
|
53
|
+
* @cssprop --m3e-tree-item-inset - Indentation for nested items.
|
|
54
|
+
* @cssprop --m3e-tree-item-label-color - Text color for the item label.
|
|
55
|
+
* @cssprop --m3e-tree-item-selected-label-color - Text color for selected item label.
|
|
56
|
+
* @cssprop --m3e-tree-item-selected-container-color - Background color for selected item.
|
|
57
|
+
* @cssprop --m3e-tree-item-selected-container-focus-color - Focus color for selected item container.
|
|
58
|
+
* @cssprop --m3e-tree-item-selected-container-hover-color - Hover color for selected item container.
|
|
59
|
+
* @cssprop --m3e-tree-item-selected-ripple-color - Ripple color for selected item.
|
|
60
|
+
* @cssprop --m3e-tree-item-unselected-container-focus-color - Focus color for unselected item container.
|
|
61
|
+
* @cssprop --m3e-tree-item-unselected-container-hover-color - Hover color for unselected item container.
|
|
62
|
+
* @cssprop --m3e-tree-item-unselected-ripple-color - Ripple color for unselected item.
|
|
63
|
+
* @cssprop --m3e-tree-item-disabled-color - Text color for disabled item.
|
|
64
|
+
* @cssprop --m3e-tree-item-disabled-color-opacity - Opacity for disabled item text color.
|
|
65
|
+
*/
|
|
66
|
+
let M3eTreeItemElement = M3eTreeItemElement_1 = class M3eTreeItemElement extends Selected(Disabled(EventAttribute(AttachInternals(Role(LitElement, "treeitem"), true), "opening", "opened", "closing", "closed"))) {
|
|
67
|
+
constructor() {
|
|
68
|
+
super(...arguments);
|
|
69
|
+
_M3eTreeItemElement_instances.add(this);
|
|
70
|
+
/** @private */
|
|
71
|
+
this._hasChildItems = false;
|
|
72
|
+
/** @private */
|
|
73
|
+
this._multi = false;
|
|
74
|
+
/** @private */
|
|
75
|
+
_M3eTreeItemElement_treeMutationController.set(this, new MutationController(this, {
|
|
76
|
+
target: null,
|
|
77
|
+
skipInitial: true,
|
|
78
|
+
config: {
|
|
79
|
+
attributeFilter: ["multi"]
|
|
80
|
+
},
|
|
81
|
+
callback: () => __classPrivateFieldGet(this, _M3eTreeItemElement_instances, "m", _M3eTreeItemElement_handleTreeChange).call(this)
|
|
82
|
+
}));
|
|
83
|
+
/** @private */
|
|
84
|
+
_M3eTreeItemElement_items.set(this, []);
|
|
85
|
+
/** @private */
|
|
86
|
+
_M3eTreeItemElement_tree.set(this, null);
|
|
87
|
+
/** @private */
|
|
88
|
+
_M3eTreeItemElement_path.set(this, new Array());
|
|
89
|
+
/** @private */
|
|
90
|
+
_M3eTreeItemElement_link.set(this, null);
|
|
91
|
+
/**
|
|
92
|
+
* Whether the item is expanded.
|
|
93
|
+
* @default false
|
|
94
|
+
*/
|
|
95
|
+
this.open = false;
|
|
96
|
+
/**
|
|
97
|
+
* A value indicating whether the element's selected / checked state is indeterminate.
|
|
98
|
+
* @default false
|
|
99
|
+
*/
|
|
100
|
+
this.indeterminate = false;
|
|
101
|
+
}
|
|
102
|
+
/** A reference to the nested `HTMLAnchorElement`. */
|
|
103
|
+
get link() {
|
|
104
|
+
return __classPrivateFieldGet(this, _M3eTreeItemElement_link, "f");
|
|
105
|
+
}
|
|
106
|
+
/** A reference to the element used to present the label of the item. */
|
|
107
|
+
get label() {
|
|
108
|
+
return this._base ?? null;
|
|
109
|
+
}
|
|
110
|
+
/** Whether the item is visible. */
|
|
111
|
+
get visible() {
|
|
112
|
+
return !__classPrivateFieldGet(this, _M3eTreeItemElement_path, "f").some(x => !x.open);
|
|
113
|
+
}
|
|
114
|
+
/** The full path of the item, starting with the top-most ancestor, including this item. */
|
|
115
|
+
get path() {
|
|
116
|
+
return [...__classPrivateFieldGet(this, _M3eTreeItemElement_path, "f"), this];
|
|
117
|
+
}
|
|
118
|
+
/** Whether the item has child items. */
|
|
119
|
+
get hasChildItems() {
|
|
120
|
+
return this._hasChildItems;
|
|
121
|
+
}
|
|
122
|
+
/** The parenting item. */
|
|
123
|
+
get parentItem() {
|
|
124
|
+
return __classPrivateFieldGet(this, _M3eTreeItemElement_path, "f")[__classPrivateFieldGet(this, _M3eTreeItemElement_path, "f").length - 1] ?? null;
|
|
125
|
+
}
|
|
126
|
+
/** The items that immediately descend from this item. */
|
|
127
|
+
get childItems() {
|
|
128
|
+
return __classPrivateFieldGet(this, _M3eTreeItemElement_items, "f");
|
|
129
|
+
}
|
|
130
|
+
/** The one-based level of the item. */
|
|
131
|
+
get level() {
|
|
132
|
+
return __classPrivateFieldGet(this, _M3eTreeItemElement_path, "f").length + 1;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Expands this item, and optionally, all descendants.
|
|
136
|
+
* @param {boolean} [descendants=false] Whether to expand all descendants.
|
|
137
|
+
*/
|
|
138
|
+
expand(descendants = false) {
|
|
139
|
+
if (this.hasChildItems) {
|
|
140
|
+
this.open = true;
|
|
141
|
+
if (descendants) {
|
|
142
|
+
this.childItems.forEach(x => x.expand(true));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Collapses this item, and optionally, all descendants.
|
|
148
|
+
* @param {boolean} [descendants=false] Whether to collapse all descendants.
|
|
149
|
+
*/
|
|
150
|
+
collapse(descendants = false) {
|
|
151
|
+
if (this.hasChildItems) {
|
|
152
|
+
this.open = false;
|
|
153
|
+
if (descendants) {
|
|
154
|
+
this.childItems.forEach(x => x.collapse(true));
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/** Toggles the expanded state of the item. */
|
|
159
|
+
toggle() {
|
|
160
|
+
if (this.hasChildItems) {
|
|
161
|
+
this.open = !this.open;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/** @inheritdoc */
|
|
165
|
+
connectedCallback() {
|
|
166
|
+
super.connectedCallback();
|
|
167
|
+
__classPrivateFieldGet(this, _M3eTreeItemElement_path, "f").length = 0;
|
|
168
|
+
for (let item = this.parentElement?.closest("m3e-tree-item"); item; item = item.parentElement?.closest("m3e-tree-item")) {
|
|
169
|
+
__classPrivateFieldGet(this, _M3eTreeItemElement_path, "f").push(item);
|
|
170
|
+
}
|
|
171
|
+
__classPrivateFieldGet(this, _M3eTreeItemElement_path, "f").reverse();
|
|
172
|
+
this.style.setProperty("--_tree-item-level", `${this.level - 1}`);
|
|
173
|
+
__classPrivateFieldSet(this, _M3eTreeItemElement_tree, this.closest("m3e-tree"), "f");
|
|
174
|
+
if (__classPrivateFieldGet(this, _M3eTreeItemElement_tree, "f")) {
|
|
175
|
+
__classPrivateFieldGet(this, _M3eTreeItemElement_treeMutationController, "f").observe(__classPrivateFieldGet(this, _M3eTreeItemElement_tree, "f"));
|
|
176
|
+
__classPrivateFieldGet(this, _M3eTreeItemElement_instances, "m", _M3eTreeItemElement_handleTreeChange).call(this);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/** @inheritdoc */
|
|
180
|
+
disconnectedCallback() {
|
|
181
|
+
super.disconnectedCallback();
|
|
182
|
+
__classPrivateFieldGet(this, _M3eTreeItemElement_path, "f").length = 0;
|
|
183
|
+
if (__classPrivateFieldGet(this, _M3eTreeItemElement_tree, "f")) {
|
|
184
|
+
__classPrivateFieldGet(this, _M3eTreeItemElement_treeMutationController, "f").unobserve(__classPrivateFieldGet(this, _M3eTreeItemElement_tree, "f"));
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/** @inheritdoc */
|
|
188
|
+
update(changedProperties) {
|
|
189
|
+
super.update(changedProperties);
|
|
190
|
+
if (changedProperties.has("selected") || changedProperties.has("indeterminate") || changedProperties.has("_multi")) {
|
|
191
|
+
if (__classPrivateFieldGet(this, _M3eTreeItemElement_tree, "f")?.multi) {
|
|
192
|
+
this.ariaSelected = null;
|
|
193
|
+
this.ariaChecked = this.indeterminate ? "mixed" : `${this.selected}`;
|
|
194
|
+
} else {
|
|
195
|
+
this.ariaSelected = `${this.selected}`;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (changedProperties.has("selected")) {
|
|
199
|
+
for (const icon of this.querySelectorAll(":scope > m3e-icon[slot]:not([slot='toggle-icon']):not([slot='open-toggle-icon'])")) {
|
|
200
|
+
icon.toggleAttribute("filled", this.selected);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
if (changedProperties.has("open") || changedProperties.has("_hasChildItems")) {
|
|
204
|
+
this.ariaExpanded = this._hasChildItems ? `${this.open}` : null;
|
|
205
|
+
}
|
|
206
|
+
if (changedProperties.has("_hasChildItems") && this.disabled || changedProperties.has("disabled")) {
|
|
207
|
+
__classPrivateFieldGet(this, _M3eTreeItemElement_items, "f").forEach(x => x.disabled = this.disabled);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/** @inheritdoc */
|
|
211
|
+
firstUpdated(_changedProperties) {
|
|
212
|
+
super.firstUpdated(_changedProperties);
|
|
213
|
+
const base = this._base;
|
|
214
|
+
if (base) {
|
|
215
|
+
[this.focusRing, this.stateLayer, this.ripple].forEach(x => x?.attach(base));
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/** @inheritdoc */
|
|
219
|
+
render() {
|
|
220
|
+
return html`<div class="base" @click="${__classPrivateFieldGet(this, _M3eTreeItemElement_instances, "m", _M3eTreeItemElement_handleClick)}"><m3e-state-layer class="state-layer" ?disabled="${this.disabled}"></m3e-state-layer><m3e-focus-ring class="focus-ring" inward ?disabled="${this.disabled}"></m3e-focus-ring><m3e-ripple class="ripple" ?disabled="${this.disabled}"></m3e-ripple><div aria-hidden="true" class="inset"></div><div aria-hidden="true" class="toggle"><slot name="toggle-icon"><svg class="toggle-icon" viewBox="0 -960 960 960" fill="currentColor"><path d="M504-480 320-664l56-56 240 240-240 240-56-56 184-184Z"/></svg></slot><slot name="open-toggle-icon" @slotchange="${__classPrivateFieldGet(this, _M3eTreeItemElement_instances, "m", _M3eTreeItemElement_handleOpenToggleIconSlotChange)}"></slot></div>${this._multi ? html`<m3e-pseudo-checkbox class="checkbox" ?checked="${this.selected}" ?indeterminate="${this.indeterminate}" ?disabled="${this.disabled}" @click="${__classPrivateFieldGet(this, _M3eTreeItemElement_instances, "m", _M3eTreeItemElement_handleCheckboxClick)}"></m3e-pseudo-checkbox>` : nothing}<div class="icon" aria-hidden="true">${__classPrivateFieldGet(this, _M3eTreeItemElement_instances, "m", _M3eTreeItemElement_renderIcon).call(this)}</div><div class="label"><slot name="label" @slotchange="${__classPrivateFieldGet(this, _M3eTreeItemElement_instances, "m", _M3eTreeItemElement_handleSlotChange)}"></slot></div></div><m3e-collapsible class="group" role="group" aria-hidden="${ifDefined(this._hasChildItems ? undefined : "true")}" ?open="${this._hasChildItems && this.open}" @opening="${__classPrivateFieldGet(this, _M3eTreeItemElement_instances, "m", _M3eTreeItemElement_handleCollapsibleEvent)}" @opened="${__classPrivateFieldGet(this, _M3eTreeItemElement_instances, "m", _M3eTreeItemElement_handleCollapsibleEvent)}" @closing="${__classPrivateFieldGet(this, _M3eTreeItemElement_instances, "m", _M3eTreeItemElement_handleCollapsibleEvent)}" @closed="${__classPrivateFieldGet(this, _M3eTreeItemElement_instances, "m", _M3eTreeItemElement_handleCollapsibleEvent)}"><slot @slotchange="${__classPrivateFieldGet(this, _M3eTreeItemElement_instances, "m", _M3eTreeItemElement_handleItemSlotChange)}"></slot></m3e-collapsible>`;
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
_M3eTreeItemElement_treeMutationController = new WeakMap();
|
|
224
|
+
_M3eTreeItemElement_items = new WeakMap();
|
|
225
|
+
_M3eTreeItemElement_tree = new WeakMap();
|
|
226
|
+
_M3eTreeItemElement_path = new WeakMap();
|
|
227
|
+
_M3eTreeItemElement_link = new WeakMap();
|
|
228
|
+
_M3eTreeItemElement_instances = new WeakSet();
|
|
229
|
+
_M3eTreeItemElement_renderIcon = function _M3eTreeItemElement_renderIcon() {
|
|
230
|
+
const icon = html`<slot name="icon" @slotchange="${__classPrivateFieldGet(this, _M3eTreeItemElement_instances, "m", _M3eTreeItemElement_handleIconSlotChange)}"></slot>`;
|
|
231
|
+
return this.selected && !this.hasChildItems ? html`<slot name="selected-icon" @slotchange="${__classPrivateFieldGet(this, _M3eTreeItemElement_instances, "m", _M3eTreeItemElement_handleIconSlotChange)}">${icon}</slot>` : icon;
|
|
232
|
+
};
|
|
233
|
+
_M3eTreeItemElement_handleOpenToggleIconSlotChange = function _M3eTreeItemElement_handleOpenToggleIconSlotChange(e) {
|
|
234
|
+
setCustomState(this, "-with-open-toggle-icon", hasAssignedNodes(e.target));
|
|
235
|
+
};
|
|
236
|
+
_M3eTreeItemElement_handleIconSlotChange = function _M3eTreeItemElement_handleIconSlotChange(e) {
|
|
237
|
+
setCustomState(this, "-with-icon", hasAssignedNodes(e.target));
|
|
238
|
+
};
|
|
239
|
+
_M3eTreeItemElement_handleSlotChange = function _M3eTreeItemElement_handleSlotChange(e) {
|
|
240
|
+
__classPrivateFieldSet(this, _M3eTreeItemElement_link, e.target.assignedElements({
|
|
241
|
+
flatten: true
|
|
242
|
+
}).find(x => x instanceof HTMLAnchorElement) ?? null, "f");
|
|
243
|
+
__classPrivateFieldGet(this, _M3eTreeItemElement_link, "f")?.setAttribute("tabindex", "-1");
|
|
244
|
+
};
|
|
245
|
+
_M3eTreeItemElement_handleItemSlotChange = function _M3eTreeItemElement_handleItemSlotChange(e) {
|
|
246
|
+
__classPrivateFieldSet(this, _M3eTreeItemElement_items, e.target.assignedElements({
|
|
247
|
+
flatten: true
|
|
248
|
+
}).filter(x => x instanceof M3eTreeItemElement_1), "f");
|
|
249
|
+
const hadChildItems = this._hasChildItems;
|
|
250
|
+
this._hasChildItems = __classPrivateFieldGet(this, _M3eTreeItemElement_items, "f").length > 0;
|
|
251
|
+
setCustomState(this, "-with-items", this._hasChildItems);
|
|
252
|
+
if (hadChildItems || this._hasChildItems) {
|
|
253
|
+
if (this._multi && __classPrivateFieldGet(this, _M3eTreeItemElement_tree, "f")?.cascade) {
|
|
254
|
+
let anySelected = false,
|
|
255
|
+
anyDeselected = false;
|
|
256
|
+
for (const child of this.querySelectorAll("m3e-tree-item")) {
|
|
257
|
+
anySelected = anySelected || child.selected;
|
|
258
|
+
anyDeselected = anyDeselected || !child.selected;
|
|
259
|
+
if (anySelected && anyDeselected) {
|
|
260
|
+
break;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
if (anyDeselected) {
|
|
264
|
+
__classPrivateFieldGet(this, _M3eTreeItemElement_tree, "f")?.[selectionManager].deselect(this);
|
|
265
|
+
this.indeterminate = anySelected;
|
|
266
|
+
} else {
|
|
267
|
+
__classPrivateFieldGet(this, _M3eTreeItemElement_tree, "f")?.[selectionManager].select(this, false);
|
|
268
|
+
this.indeterminate = false;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
};
|
|
273
|
+
_M3eTreeItemElement_handleTreeChange = function _M3eTreeItemElement_handleTreeChange() {
|
|
274
|
+
this._multi = __classPrivateFieldGet(this, _M3eTreeItemElement_tree, "f")?.multi === true;
|
|
275
|
+
console.log(this._multi);
|
|
276
|
+
setCustomState(this, "-multi", this._multi);
|
|
277
|
+
};
|
|
278
|
+
_M3eTreeItemElement_handleClick = function _M3eTreeItemElement_handleClick() {
|
|
279
|
+
if (this.disabled) return;
|
|
280
|
+
__classPrivateFieldGet(this, _M3eTreeItemElement_tree, "f")?.[selectionManager].setActiveItem(this);
|
|
281
|
+
if (!this._hasChildItems) {
|
|
282
|
+
if (this._multi) {
|
|
283
|
+
if (this.selected) {
|
|
284
|
+
__classPrivateFieldGet(this, _M3eTreeItemElement_tree, "f")?.deselect(this);
|
|
285
|
+
} else {
|
|
286
|
+
__classPrivateFieldGet(this, _M3eTreeItemElement_tree, "f")?.select(this);
|
|
287
|
+
}
|
|
288
|
+
} else {
|
|
289
|
+
__classPrivateFieldGet(this, _M3eTreeItemElement_tree, "f")?.select(this);
|
|
290
|
+
}
|
|
291
|
+
__classPrivateFieldGet(this, _M3eTreeItemElement_link, "f")?.click();
|
|
292
|
+
} else {
|
|
293
|
+
if (!this._multi) {
|
|
294
|
+
__classPrivateFieldGet(this, _M3eTreeItemElement_tree, "f")?.select(this);
|
|
295
|
+
}
|
|
296
|
+
this.toggle();
|
|
297
|
+
}
|
|
298
|
+
};
|
|
299
|
+
_M3eTreeItemElement_handleCheckboxClick = function _M3eTreeItemElement_handleCheckboxClick(e) {
|
|
300
|
+
e.stopPropagation();
|
|
301
|
+
if (!this.selected) {
|
|
302
|
+
__classPrivateFieldGet(this, _M3eTreeItemElement_tree, "f")?.select(this);
|
|
303
|
+
} else {
|
|
304
|
+
__classPrivateFieldGet(this, _M3eTreeItemElement_tree, "f")?.deselect(this);
|
|
305
|
+
}
|
|
306
|
+
};
|
|
307
|
+
_M3eTreeItemElement_handleCollapsibleEvent = function _M3eTreeItemElement_handleCollapsibleEvent(e) {
|
|
308
|
+
e.stopPropagation();
|
|
309
|
+
this.dispatchEvent(new Event(e.type, {
|
|
310
|
+
bubbles: true
|
|
311
|
+
}));
|
|
312
|
+
};
|
|
313
|
+
/** The styles of the element. */
|
|
314
|
+
M3eTreeItemElement.styles = css`:host { display: block; flex: none; outline: none; user-select: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } .base { display: flex; align-items: center; position: relative; height: calc(var(--m3e-tree-item-height, 3rem) + ${DesignToken.density.calc(-3)}); padding-inline: var(--m3e-tree-item-padding, 1rem); font-size: var(--m3e-tree-item-font-size, ${DesignToken.typescale.standard.label.large.fontSize}); font-weight: var(--m3e-tree-item-font-weight, ${DesignToken.typescale.standard.label.large.fontWeight}); line-height: var(--m3e-tree-item-line-height, ${DesignToken.typescale.standard.label.large.lineHeight}); letter-spacing: var(--m3e-tree-item-tracking, ${DesignToken.typescale.standard.label.large.tracking}); transition: ${unsafeCSS(`color ${DesignToken.motion.duration.short4} ${DesignToken.motion.easing.standard},
|
|
315
|
+
background-color ${DesignToken.motion.duration.short4} ${DesignToken.motion.easing.standard}`)}; } .base, .focus-ring { border-radius: var(--m3e-tree-item-shape, ${DesignToken.shape.corner.none}); } .label { flex: 1 1 auto; display: flex; align-items: center; position: relative; overflow: hidden; vertical-align: middle; } .checkbox { flex: none; margin-inline-end: 0.5rem; } .icon, .toggle { flex: none; align-items: center; justify-content: center; position: relative; vertical-align: middle; margin-inline-end: 0.5rem; } .toggle { display: var(--_tree-item-toggle-display, none); } :host(:not(:state(-with-icon))) .icon { display: none; } .inset { margin-inline-start: calc(var(--m3e-tree-item-inset, 2rem) * var(--_tree-item-level, 0)); } :host([open]) .toggle-icon { transform: rotate(90deg); } :host(:not(:state(-with-items))) .toggle { visibility: hidden; } :host(:not(:state(-with-items))) .group { display: none; } ::slotted([slot="selected-icon"]), ::slotted([slot="icon"]), ::slotted([slot="toggle-icon"]), ::slotted([slot="open-toggle-icon"]), .toggle-icon { vertical-align: middle; width: 1em; height: 1em; font-size: var(--m3e-tree-item-icon-size, 1.5rem); } .toggle-icon { transition: ${unsafeCSS(`transform var(--m3e-collapsible-animation-duration, ${DesignToken.motion.duration.medium1})
|
|
316
|
+
${DesignToken.motion.easing.standard}`)}; } :host(:state(-with-open-toggle-icon)[open]) slot[name="toggle-icon"], :host(:state(-with-open-toggle-icon):not([open])) slot[name="open-toggle-icon"] { display: none; } :host(:not(:disabled)) .base { cursor: pointer; } :host(:not(:disabled)) .base { color: var(--m3e-tree-item-label-color, ${DesignToken.color.onSurfaceVariant}); } :host(:disabled) .base { color: color-mix( in srgb, var(--m3e-tree-item-disabled-color, ${DesignToken.color.onSurface}) var(--m3e-tree-item-disabled-color-opacity, 38%), transparent ); } :host([selected]:not(:disabled)) .base { color: var(--m3e-tree-item-selected-label-color, ${DesignToken.color.onSecondaryContainer}); background-color: var(--m3e-tree-item-selected-container-color, ${DesignToken.color.secondaryContainer}); --m3e-state-layer-focus-color: var( --m3e-tree-item-selected-container-focus-color, ${DesignToken.color.onSecondaryContainer} ); --m3e-state-layer-hover-color: var( --m3e-tree-item-selected-container-hover-color, ${DesignToken.color.onSecondaryContainer} ); --m3e-ripple-color: var(--m3e-tree-item-selected-ripple-color, ${DesignToken.color.onSecondaryContainer}); } :host(:not([selected]):not(:disabled)) .base { --m3e-state-layer-focus-color: var( --m3e-tree-item-unselected-container-focus-color, ${DesignToken.color.onSurface} ); --m3e-state-layer-hover-color: var( --m3e-tree-item-unselected-container-hover-color, ${DesignToken.color.onSurface} ); --m3e-ripple-color: var(--m3e-tree-item-unselected-ripple-color, ${DesignToken.color.onSurface}); } .state-layer { margin-inline: auto; } ::slotted(a[slot="label"]) { all: unset; } @media (prefers-reduced-motion) { .base, .toggle, .state-layer { transition: none !important; } } @media (forced-colors: active) { .base, .state-layer { transition: none !important; } :host(:disabled) .base { color: GrayText; } :host(:not(:disabled)) .base { color: CanvasText; background-color: Canvas; } :host([selected]:not(:state(-multi)):not(:disabled)) slot[name="icon"], :host([selected]:not(:state(-multi)):not(:disabled)) slot[name="label"] { color: Highlight; } }`;
|
|
317
|
+
__decorate([query(".state-layer")], M3eTreeItemElement.prototype, "stateLayer", void 0);
|
|
318
|
+
__decorate([query(".focus-ring")], M3eTreeItemElement.prototype, "focusRing", void 0);
|
|
319
|
+
__decorate([query(".ripple")], M3eTreeItemElement.prototype, "ripple", void 0);
|
|
320
|
+
__decorate([query(".base")], M3eTreeItemElement.prototype, "_base", void 0);
|
|
321
|
+
__decorate([state()], M3eTreeItemElement.prototype, "_hasChildItems", void 0);
|
|
322
|
+
__decorate([state()], M3eTreeItemElement.prototype, "_multi", void 0);
|
|
323
|
+
__decorate([property({
|
|
324
|
+
type: Boolean,
|
|
325
|
+
reflect: true
|
|
326
|
+
})], M3eTreeItemElement.prototype, "open", void 0);
|
|
327
|
+
__decorate([property({
|
|
328
|
+
type: Boolean,
|
|
329
|
+
reflect: true
|
|
330
|
+
})], M3eTreeItemElement.prototype, "indeterminate", void 0);
|
|
331
|
+
M3eTreeItemElement = M3eTreeItemElement_1 = __decorate([customElement("m3e-tree-item")], M3eTreeItemElement);
|
|
332
|
+
|
|
333
|
+
var _M3eTreeElement_instances, _M3eTreeElement_ignoreFocusVisible, _M3eTreeElement_ignoreFocus, _M3eTreeElement_keyDownHandler, _M3eTreeElement_keyUpHandler, _M3eTreeElement_pointerDownHandler, _M3eTreeElement_handleSlotChange, _M3eTreeElement_handleKeyDown, _M3eTreeElement_handleKeyUp, _M3eTreeElement_handlePointerDown, _M3eTreeElement_activateItem, _M3eTreeElement_updateFocusVisible, _M3eTreeElement_updateItemFocusVisible, _M3eTreeElement_cascadeAncestorSelected, _b;
|
|
334
|
+
var M3eTreeElement_1;
|
|
335
|
+
/**
|
|
336
|
+
* Presents hierarchical data in a tree structure.
|
|
337
|
+
*
|
|
338
|
+
* @description
|
|
339
|
+
* The `m3e-tree` component presents hierarchical data in a structure that users can
|
|
340
|
+
* navigate, with nested levels that open and collapse as needed.
|
|
341
|
+
*
|
|
342
|
+
* @example
|
|
343
|
+
* The following example illustrates a simple tree with nested child items.
|
|
344
|
+
* ```html
|
|
345
|
+
* <m3e-tree>
|
|
346
|
+
* <m3e-tree-item open>
|
|
347
|
+
* <span slot="label">Getting Started</span>
|
|
348
|
+
* <m3e-tree-item>
|
|
349
|
+
* <span slot="label">Overview</span>
|
|
350
|
+
* </m3e-tree-item>
|
|
351
|
+
* <m3e-tree-item>
|
|
352
|
+
* <span slot="label">Installation</span>
|
|
353
|
+
* </m3e-tree-item>
|
|
354
|
+
* </m3e-tree-item>
|
|
355
|
+
* <m3e-tree-item>
|
|
356
|
+
* <span slot="label">Components</span>
|
|
357
|
+
* <m3e-tree-item>
|
|
358
|
+
* <span slot="label">Button</span>
|
|
359
|
+
* </m3e-tree-item>
|
|
360
|
+
* <m3e-tree-item>
|
|
361
|
+
* <span slot="label">Card</span>
|
|
362
|
+
* </m3e-tree-item>
|
|
363
|
+
* </m3e-tree-item>
|
|
364
|
+
* </m3e-tree>
|
|
365
|
+
* ```
|
|
366
|
+
*
|
|
367
|
+
* @example
|
|
368
|
+
* The next example demonstrates multi-selection with cascading selection state.
|
|
369
|
+
* ```html
|
|
370
|
+
* <m3e-tree multi cascade>
|
|
371
|
+
* <m3e-tree-item>
|
|
372
|
+
* <span slot="label">Fruits</span>
|
|
373
|
+
* <m3e-tree-item>
|
|
374
|
+
* <span slot="label">Apples</span>
|
|
375
|
+
* </m3e-tree-item>
|
|
376
|
+
* <m3e-tree-item>
|
|
377
|
+
* <span slot="label">Oranges</span>
|
|
378
|
+
* </m3e-tree-item>
|
|
379
|
+
* <m3e-tree-item>
|
|
380
|
+
* <span slot="label">Bananas</span>
|
|
381
|
+
* </m3e-tree-item>
|
|
382
|
+
* </m3e-tree-item>
|
|
383
|
+
* <m3e-tree-item>
|
|
384
|
+
* <span slot="label">Vegetables</span>
|
|
385
|
+
* <m3e-tree-item>
|
|
386
|
+
* <span slot="label">Carrots</span>
|
|
387
|
+
* </m3e-tree-item>
|
|
388
|
+
* <m3e-tree-item>
|
|
389
|
+
* <span slot="label">Broccoli</span>
|
|
390
|
+
* </m3e-tree-item>
|
|
391
|
+
* <m3e-tree-item>
|
|
392
|
+
* <span slot="label">Spinach</span>
|
|
393
|
+
* </m3e-tree-item>
|
|
394
|
+
* </m3e-tree-item>
|
|
395
|
+
* </m3e-tree>
|
|
396
|
+
* ```
|
|
397
|
+
*
|
|
398
|
+
* @tag m3e-tree
|
|
399
|
+
*
|
|
400
|
+
* @slot - Renders the items of the tree.
|
|
401
|
+
*
|
|
402
|
+
* @attr multi - Whether multiple items can be selected.
|
|
403
|
+
* @attr cascade -Whether multiple item selection cascades to child items.
|
|
404
|
+
*
|
|
405
|
+
* @fires change - Emitted when the selected state changes.
|
|
406
|
+
*
|
|
407
|
+
* @cssprop --m3e-tree-scrollbar-width - Width of the tree scrollbar.
|
|
408
|
+
* @cssprop --m3e-tree-scrollbar-color - Color of the tree scrollbar.
|
|
409
|
+
*/
|
|
410
|
+
let M3eTreeElement = M3eTreeElement_1 = class M3eTreeElement extends Role(LitElement, "tree") {
|
|
411
|
+
constructor() {
|
|
412
|
+
super();
|
|
413
|
+
_M3eTreeElement_instances.add(this);
|
|
414
|
+
/** @private */
|
|
415
|
+
_M3eTreeElement_ignoreFocusVisible.set(this, false);
|
|
416
|
+
/** @private */
|
|
417
|
+
_M3eTreeElement_ignoreFocus.set(this, false);
|
|
418
|
+
/** @private */
|
|
419
|
+
this[_b] = new SelectionManager().withVerticalOrientation().withHomeAndEnd().withPageUpAndDown().withTypeahead().withSkipPredicate(x => x.disabled || !x.visible).disableRovingTabIndex().onActiveItemChange(() => {
|
|
420
|
+
if (this[selectionManager].activeItem) {
|
|
421
|
+
__classPrivateFieldGet(this, _M3eTreeElement_instances, "m", _M3eTreeElement_activateItem).call(this, this[selectionManager].activeItem);
|
|
422
|
+
}
|
|
423
|
+
});
|
|
424
|
+
/** @private */
|
|
425
|
+
_M3eTreeElement_keyDownHandler.set(this, e => __classPrivateFieldGet(this, _M3eTreeElement_instances, "m", _M3eTreeElement_handleKeyDown).call(this, e));
|
|
426
|
+
/** @private */
|
|
427
|
+
_M3eTreeElement_keyUpHandler.set(this, () => __classPrivateFieldGet(this, _M3eTreeElement_instances, "m", _M3eTreeElement_handleKeyUp).call(this));
|
|
428
|
+
/** @private */
|
|
429
|
+
_M3eTreeElement_pointerDownHandler.set(this, e => __classPrivateFieldGet(this, _M3eTreeElement_instances, "m", _M3eTreeElement_handlePointerDown).call(this, e));
|
|
430
|
+
/**
|
|
431
|
+
* Whether multiple items can be selected.
|
|
432
|
+
* @default false
|
|
433
|
+
*/
|
|
434
|
+
this.multi = false;
|
|
435
|
+
/**
|
|
436
|
+
* Whether multiple item selection cascades to child items.
|
|
437
|
+
* @default false
|
|
438
|
+
*/
|
|
439
|
+
this.cascade = false;
|
|
440
|
+
new PressedController(this, {
|
|
441
|
+
callback: pressed => __classPrivateFieldSet(this, _M3eTreeElement_ignoreFocus, pressed, "f")
|
|
442
|
+
});
|
|
443
|
+
new FocusController(this, {
|
|
444
|
+
callback: () => {
|
|
445
|
+
if (!__classPrivateFieldGet(this, _M3eTreeElement_ignoreFocus, "f")) {
|
|
446
|
+
__classPrivateFieldGet(this, _M3eTreeElement_instances, "m", _M3eTreeElement_updateFocusVisible).call(this);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
/** The selected items of the tree. */
|
|
452
|
+
get selected() {
|
|
453
|
+
return this[selectionManager].selectedItems;
|
|
454
|
+
}
|
|
455
|
+
/** All the items of the tree. */
|
|
456
|
+
get items() {
|
|
457
|
+
return this[selectionManager].items;
|
|
458
|
+
}
|
|
459
|
+
/** @internal */
|
|
460
|
+
expand(itemsOrDescendants, maybeDescendants = false) {
|
|
461
|
+
const items = Array.isArray(itemsOrDescendants) ? itemsOrDescendants : this[selectionManager].items;
|
|
462
|
+
const descendants = typeof itemsOrDescendants === "boolean" ? itemsOrDescendants : maybeDescendants;
|
|
463
|
+
items.forEach(x => x.expand(descendants));
|
|
464
|
+
}
|
|
465
|
+
/** @internal */
|
|
466
|
+
collapse(itemsOrDescendants, maybeDescendants = false) {
|
|
467
|
+
const items = Array.isArray(itemsOrDescendants) ? itemsOrDescendants : this[selectionManager].items;
|
|
468
|
+
const descendants = typeof itemsOrDescendants === "boolean" ? itemsOrDescendants : maybeDescendants;
|
|
469
|
+
items.forEach(x => x.collapse(descendants));
|
|
470
|
+
const activeItem = this[selectionManager].activeItem;
|
|
471
|
+
if (activeItem && !activeItem.visible) {
|
|
472
|
+
for (let parent = activeItem.parentItem; parent; parent = parent.parentItem) {
|
|
473
|
+
if (parent.visible) {
|
|
474
|
+
this[selectionManager].setActiveItem(parent);
|
|
475
|
+
break;
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* Selects the specified item.
|
|
482
|
+
* @param {M3eTreeItemElement} item The item to select.
|
|
483
|
+
* @param {boolean} [activate=false] A value indicating whether to activate the item.
|
|
484
|
+
*/
|
|
485
|
+
select(item, activate = false) {
|
|
486
|
+
this[selectionManager].select(item, activate);
|
|
487
|
+
item.indeterminate = false;
|
|
488
|
+
if (this.multi && this.cascade) {
|
|
489
|
+
if (item.hasChildItems) {
|
|
490
|
+
item.childItems.forEach(x => this.select(x));
|
|
491
|
+
}
|
|
492
|
+
__classPrivateFieldGet(this, _M3eTreeElement_instances, "m", _M3eTreeElement_cascadeAncestorSelected).call(this, item);
|
|
493
|
+
}
|
|
494
|
+
if (activate) {
|
|
495
|
+
__classPrivateFieldGet(this, _M3eTreeElement_instances, "m", _M3eTreeElement_activateItem).call(this, item);
|
|
496
|
+
}
|
|
497
|
+
this.dispatchEvent(new Event("change", {
|
|
498
|
+
bubbles: true
|
|
499
|
+
}));
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* Deselects the specified item.
|
|
503
|
+
* @param {M3eTreeItemElement} item The item to deselect.
|
|
504
|
+
*/
|
|
505
|
+
deselect(item) {
|
|
506
|
+
this[selectionManager].deselect(item);
|
|
507
|
+
item.indeterminate = false;
|
|
508
|
+
if (this.multi && this.cascade) {
|
|
509
|
+
if (item.hasChildItems) {
|
|
510
|
+
item.childItems.forEach(x => this.deselect(x));
|
|
511
|
+
}
|
|
512
|
+
__classPrivateFieldGet(this, _M3eTreeElement_instances, "m", _M3eTreeElement_cascadeAncestorSelected).call(this, item);
|
|
513
|
+
}
|
|
514
|
+
this.dispatchEvent(new Event("change", {
|
|
515
|
+
bubbles: true
|
|
516
|
+
}));
|
|
517
|
+
}
|
|
518
|
+
/** @inheritdoc */
|
|
519
|
+
connectedCallback() {
|
|
520
|
+
super.connectedCallback();
|
|
521
|
+
this.setAttribute("tabindex", "0");
|
|
522
|
+
this.addEventListener("keydown", __classPrivateFieldGet(this, _M3eTreeElement_keyDownHandler, "f"));
|
|
523
|
+
this.addEventListener("keyup", __classPrivateFieldGet(this, _M3eTreeElement_keyUpHandler, "f"));
|
|
524
|
+
this.addEventListener("pointerdown", __classPrivateFieldGet(this, _M3eTreeElement_pointerDownHandler, "f"));
|
|
525
|
+
}
|
|
526
|
+
/** @inheritdoc */
|
|
527
|
+
disconnectedCallback() {
|
|
528
|
+
super.disconnectedCallback();
|
|
529
|
+
this.removeEventListener("keydown", __classPrivateFieldGet(this, _M3eTreeElement_keyDownHandler, "f"));
|
|
530
|
+
this.removeEventListener("keyup", __classPrivateFieldGet(this, _M3eTreeElement_keyUpHandler, "f"));
|
|
531
|
+
this.removeEventListener("pointerdown", __classPrivateFieldGet(this, _M3eTreeElement_pointerDownHandler, "f"));
|
|
532
|
+
}
|
|
533
|
+
/** @inheritdoc */
|
|
534
|
+
willUpdate(_changedProperties) {
|
|
535
|
+
super.willUpdate(_changedProperties);
|
|
536
|
+
if (_changedProperties.has("multi")) {
|
|
537
|
+
this[selectionManager].multi = this.multi;
|
|
538
|
+
if (this.multi) {
|
|
539
|
+
this.setAttribute("aria-multiselectable", "true");
|
|
540
|
+
} else {
|
|
541
|
+
this.removeAttribute("aria-multiselectable");
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
/** @inheritdoc */
|
|
546
|
+
render() {
|
|
547
|
+
return html`<div class="base"><slot @slotchange="${__classPrivateFieldGet(this, _M3eTreeElement_instances, "m", _M3eTreeElement_handleSlotChange)}"></slot></div>`;
|
|
548
|
+
}
|
|
549
|
+
};
|
|
550
|
+
_M3eTreeElement_ignoreFocusVisible = new WeakMap();
|
|
551
|
+
_M3eTreeElement_ignoreFocus = new WeakMap();
|
|
552
|
+
_M3eTreeElement_keyDownHandler = new WeakMap();
|
|
553
|
+
_M3eTreeElement_keyUpHandler = new WeakMap();
|
|
554
|
+
_M3eTreeElement_pointerDownHandler = new WeakMap();
|
|
555
|
+
_M3eTreeElement_instances = new WeakSet();
|
|
556
|
+
_b = selectionManager;
|
|
557
|
+
_M3eTreeElement_handleSlotChange = function _M3eTreeElement_handleSlotChange() {
|
|
558
|
+
const {
|
|
559
|
+
added
|
|
560
|
+
} = this[selectionManager].setItems([...this.querySelectorAll("m3e-tree-item")]);
|
|
561
|
+
for (const item of added) {
|
|
562
|
+
item.id = item.id || `m3e-tree-item-${M3eTreeElement_1.__nextId++}`;
|
|
563
|
+
}
|
|
564
|
+
if (this[selectionManager].activeItem) {
|
|
565
|
+
this.setAttribute("aria-activedescendant", this[selectionManager].activeItem.id);
|
|
566
|
+
__classPrivateFieldGet(this, _M3eTreeElement_instances, "m", _M3eTreeElement_updateFocusVisible).call(this);
|
|
567
|
+
} else {
|
|
568
|
+
this.removeAttribute("aria-activedescendant");
|
|
569
|
+
}
|
|
570
|
+
};
|
|
571
|
+
_M3eTreeElement_handleKeyDown = function _M3eTreeElement_handleKeyDown(e) {
|
|
572
|
+
__classPrivateFieldSet(this, _M3eTreeElement_ignoreFocusVisible, false, "f");
|
|
573
|
+
__classPrivateFieldGet(this, _M3eTreeElement_instances, "m", _M3eTreeElement_updateFocusVisible).call(this);
|
|
574
|
+
const item = this[selectionManager].activeItem;
|
|
575
|
+
if (e.defaultPrevented || !item || item.disabled) return;
|
|
576
|
+
switch (e.key) {
|
|
577
|
+
case "Enter":
|
|
578
|
+
if (!this.multi) {
|
|
579
|
+
if (!item.selected) {
|
|
580
|
+
this.select(item);
|
|
581
|
+
item.link?.click();
|
|
582
|
+
}
|
|
583
|
+
} else {
|
|
584
|
+
if (item.ripple && !item.ripple.visible) {
|
|
585
|
+
item.ripple.centered = true;
|
|
586
|
+
item.ripple.show(0, 0, true);
|
|
587
|
+
item.ripple.centered = false;
|
|
588
|
+
}
|
|
589
|
+
item.link?.click();
|
|
590
|
+
}
|
|
591
|
+
break;
|
|
592
|
+
case " ":
|
|
593
|
+
e.preventDefault();
|
|
594
|
+
if (this.multi) {
|
|
595
|
+
if (item.selected) {
|
|
596
|
+
this.deselect(item);
|
|
597
|
+
} else {
|
|
598
|
+
this.select(item);
|
|
599
|
+
}
|
|
600
|
+
} else {
|
|
601
|
+
if (item.ripple && !item.ripple.visible) {
|
|
602
|
+
item.ripple.centered = true;
|
|
603
|
+
item.ripple.show(0, 0, true);
|
|
604
|
+
item.ripple.centered = false;
|
|
605
|
+
}
|
|
606
|
+
this.select(item);
|
|
607
|
+
item.link?.click();
|
|
608
|
+
}
|
|
609
|
+
break;
|
|
610
|
+
case "*":
|
|
611
|
+
e.preventDefault();
|
|
612
|
+
item.expand(true);
|
|
613
|
+
break;
|
|
614
|
+
case "Left":
|
|
615
|
+
case "ArrowLeft":
|
|
616
|
+
e.preventDefault();
|
|
617
|
+
if (M3eDirectionality.current === "ltr") {
|
|
618
|
+
if (item.hasChildItems && item.open) {
|
|
619
|
+
requestAnimationFrame(() => item.collapse());
|
|
620
|
+
} else {
|
|
621
|
+
const parent = item.parentItem;
|
|
622
|
+
if (parent) {
|
|
623
|
+
this[selectionManager].setActiveItem(parent);
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
} else if (item.hasChildItems && !item.open) {
|
|
627
|
+
item.expand();
|
|
628
|
+
}
|
|
629
|
+
break;
|
|
630
|
+
case "Right":
|
|
631
|
+
case "ArrowRight":
|
|
632
|
+
e.preventDefault();
|
|
633
|
+
if (M3eDirectionality.current === "rtl") {
|
|
634
|
+
if (item.hasChildItems && item.open) {
|
|
635
|
+
requestAnimationFrame(() => item.collapse());
|
|
636
|
+
} else {
|
|
637
|
+
const parent = item.parentItem;
|
|
638
|
+
if (parent) {
|
|
639
|
+
this[selectionManager].setActiveItem(parent);
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
} else if (item.hasChildItems && !item.open) {
|
|
643
|
+
item.expand();
|
|
644
|
+
}
|
|
645
|
+
break;
|
|
646
|
+
default:
|
|
647
|
+
this[selectionManager].onKeyDown(e);
|
|
648
|
+
break;
|
|
649
|
+
}
|
|
650
|
+
};
|
|
651
|
+
_M3eTreeElement_handleKeyUp = function _M3eTreeElement_handleKeyUp() {
|
|
652
|
+
const item = this[selectionManager].activeItem;
|
|
653
|
+
if (item && !item.disabled && item.ripple?.visible) {
|
|
654
|
+
item.ripple.hide();
|
|
655
|
+
}
|
|
656
|
+
};
|
|
657
|
+
_M3eTreeElement_handlePointerDown = function _M3eTreeElement_handlePointerDown(e) {
|
|
658
|
+
if (!e.defaultPrevented && !__classPrivateFieldGet(this, _M3eTreeElement_ignoreFocusVisible, "f")) {
|
|
659
|
+
__classPrivateFieldSet(this, _M3eTreeElement_ignoreFocusVisible, true, "f");
|
|
660
|
+
const item = e.composedPath().reverse().find(x => x instanceof M3eTreeItemElement);
|
|
661
|
+
if (item && !item.disabled) {
|
|
662
|
+
__classPrivateFieldGet(this, _M3eTreeElement_instances, "m", _M3eTreeElement_updateItemFocusVisible).call(this, item, true, false);
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
};
|
|
666
|
+
_M3eTreeElement_activateItem = function _M3eTreeElement_activateItem(item) {
|
|
667
|
+
this.setAttribute("aria-activedescendant", item.id);
|
|
668
|
+
if (item.label) {
|
|
669
|
+
scrollIntoViewIfNeeded(item.label, this, {
|
|
670
|
+
block: "nearest",
|
|
671
|
+
behavior: "smooth"
|
|
672
|
+
});
|
|
673
|
+
}
|
|
674
|
+
__classPrivateFieldGet(this, _M3eTreeElement_instances, "m", _M3eTreeElement_updateFocusVisible).call(this);
|
|
675
|
+
};
|
|
676
|
+
_M3eTreeElement_updateFocusVisible = function _M3eTreeElement_updateFocusVisible() {
|
|
677
|
+
const focused = this.matches(":focus") || this.matches(":focus-within");
|
|
678
|
+
const focusVisible = !__classPrivateFieldGet(this, _M3eTreeElement_ignoreFocusVisible, "f") && this.matches(":focus-visible");
|
|
679
|
+
this[selectionManager].items.forEach(x => {
|
|
680
|
+
const active = x === this[selectionManager].activeItem;
|
|
681
|
+
__classPrivateFieldGet(this, _M3eTreeElement_instances, "m", _M3eTreeElement_updateItemFocusVisible).call(this, x, active && focused, active && focusVisible);
|
|
682
|
+
});
|
|
683
|
+
};
|
|
684
|
+
_M3eTreeElement_updateItemFocusVisible = function _M3eTreeElement_updateItemFocusVisible(item, focused, focusVisible) {
|
|
685
|
+
if (focused && focusVisible) {
|
|
686
|
+
item.stateLayer?.show("focused");
|
|
687
|
+
} else {
|
|
688
|
+
item.stateLayer?.hide("focused");
|
|
689
|
+
}
|
|
690
|
+
if (focusVisible) {
|
|
691
|
+
item.focusRing?.show();
|
|
692
|
+
} else {
|
|
693
|
+
item.focusRing?.hide();
|
|
694
|
+
}
|
|
695
|
+
};
|
|
696
|
+
_M3eTreeElement_cascadeAncestorSelected = function _M3eTreeElement_cascadeAncestorSelected(item) {
|
|
697
|
+
for (let parent = item.parentItem; parent; parent = parent.parentItem) {
|
|
698
|
+
let hasSelected = false,
|
|
699
|
+
hasDeselected = false;
|
|
700
|
+
for (const child of parent.querySelectorAll("m3e-tree-item")) {
|
|
701
|
+
hasSelected = hasSelected || child.selected;
|
|
702
|
+
hasDeselected = hasDeselected || !child.selected;
|
|
703
|
+
if (hasSelected && hasDeselected) {
|
|
704
|
+
break;
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
if (hasDeselected) {
|
|
708
|
+
this[selectionManager].deselect(parent);
|
|
709
|
+
parent.indeterminate = hasSelected;
|
|
710
|
+
} else {
|
|
711
|
+
this[selectionManager].select(parent, false);
|
|
712
|
+
parent.indeterminate = false;
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
};
|
|
716
|
+
(() => {
|
|
717
|
+
// NOTE: unsafeCSS used here due to linting error with use of '>'.
|
|
718
|
+
registerStyleSheet(css`${unsafeCSS(`m3e-tree:has(> m3e-tree-item:state(-with-items)) {
|
|
719
|
+
--_tree-item-toggle-display: flex;
|
|
720
|
+
}`)}`);
|
|
721
|
+
})();
|
|
722
|
+
/** The styles of the element. */
|
|
723
|
+
M3eTreeElement.styles = css`:host { display: block; outline: none; overflow-y: auto; overflow-x: hidden; min-height: 0; scrollbar-width: ${DesignToken.scrollbar.width}; scrollbar-color: ${DesignToken.scrollbar.color}; } .base { width: 100%; display: flex; flex-direction: column; position: relative; min-height: inherit; box-sizing: border-box; }`;
|
|
724
|
+
/** @private */
|
|
725
|
+
M3eTreeElement.__nextId = 0;
|
|
726
|
+
__decorate([property({
|
|
727
|
+
type: Boolean,
|
|
728
|
+
reflect: true
|
|
729
|
+
})], M3eTreeElement.prototype, "multi", void 0);
|
|
730
|
+
__decorate([property({
|
|
731
|
+
type: Boolean,
|
|
732
|
+
reflect: true
|
|
733
|
+
})], M3eTreeElement.prototype, "cascade", void 0);
|
|
734
|
+
M3eTreeElement = M3eTreeElement_1 = __decorate([customElement("m3e-tree")], M3eTreeElement);
|
|
735
|
+
|
|
736
|
+
export { M3eTreeElement, M3eTreeItemElement };
|
|
737
|
+
//# sourceMappingURL=tree.js.map
|