luxen-ui 0.1.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/LICENSE +21 -0
- package/README.md +98 -0
- package/dist/css/elements/avatar.css +20 -0
- package/dist/css/elements/badge.css +159 -0
- package/dist/css/elements/button.css +171 -0
- package/dist/css/elements/close-button/circle.css +66 -0
- package/dist/css/elements/close-button/ring.css +71 -0
- package/dist/css/elements/close-button/square.css +70 -0
- package/dist/css/elements/disclosure.css +137 -0
- package/dist/css/elements/divider.css +75 -0
- package/dist/css/elements/input-otp.css +164 -0
- package/dist/css/elements/input-stepper/default.css +245 -0
- package/dist/css/elements/input-stepper/rounded.css +238 -0
- package/dist/css/elements/kbd.css +21 -0
- package/dist/css/elements/progress.css +114 -0
- package/dist/css/elements/select.css +71 -0
- package/dist/css/elements/skeleton.css +89 -0
- package/dist/css/elements/tabs/enclosed.css +148 -0
- package/dist/css/elements/tabs/line.css +138 -0
- package/dist/css/elements/toast.css +260 -0
- package/dist/css/index.css +885 -0
- package/dist/custom-elements.json +14424 -0
- package/dist/define.d.ts +9 -0
- package/dist/define.d.ts.map +1 -0
- package/dist/define.js +16 -0
- package/dist/elements/avatar/avatar.css +128 -0
- package/dist/elements/avatar/avatar.d.ts +21 -0
- package/dist/elements/avatar/avatar.d.ts.map +1 -0
- package/dist/elements/avatar/avatar.js +106 -0
- package/dist/elements/avatar/index.d.ts +8 -0
- package/dist/elements/avatar/index.d.ts.map +1 -0
- package/dist/elements/avatar/index.js +4 -0
- package/dist/elements/badge/badge.d.ts +17 -0
- package/dist/elements/badge/badge.d.ts.map +1 -0
- package/dist/elements/badge/badge.js +34 -0
- package/dist/elements/badge/index.d.ts +8 -0
- package/dist/elements/badge/index.d.ts.map +1 -0
- package/dist/elements/badge/index.js +4 -0
- package/dist/elements/carousel/carousel.css +205 -0
- package/dist/elements/carousel/carousel.d.ts +148 -0
- package/dist/elements/carousel/carousel.d.ts.map +1 -0
- package/dist/elements/carousel/carousel.js +473 -0
- package/dist/elements/carousel/index.d.ts +8 -0
- package/dist/elements/carousel/index.d.ts.map +1 -0
- package/dist/elements/carousel/index.js +4 -0
- package/dist/elements/carousel-item/carousel-item.css +11 -0
- package/dist/elements/carousel-item/carousel-item.d.ts +13 -0
- package/dist/elements/carousel-item/carousel-item.d.ts.map +1 -0
- package/dist/elements/carousel-item/carousel-item.js +20 -0
- package/dist/elements/carousel-item/index.d.ts +8 -0
- package/dist/elements/carousel-item/index.d.ts.map +1 -0
- package/dist/elements/carousel-item/index.js +4 -0
- package/dist/elements/dialog/dialog.css +92 -0
- package/dist/elements/dialog/dialog.d.ts +56 -0
- package/dist/elements/dialog/dialog.d.ts.map +1 -0
- package/dist/elements/dialog/dialog.js +204 -0
- package/dist/elements/dialog/dialog.styles.d.ts +8 -0
- package/dist/elements/dialog/dialog.styles.d.ts.map +1 -0
- package/dist/elements/dialog/dialog.styles.js +8 -0
- package/dist/elements/dialog/index.d.ts +8 -0
- package/dist/elements/dialog/index.d.ts.map +1 -0
- package/dist/elements/dialog/index.js +4 -0
- package/dist/elements/divider/divider.d.ts +23 -0
- package/dist/elements/divider/divider.d.ts.map +1 -0
- package/dist/elements/divider/divider.js +49 -0
- package/dist/elements/divider/index.d.ts +8 -0
- package/dist/elements/divider/index.d.ts.map +1 -0
- package/dist/elements/divider/index.js +4 -0
- package/dist/elements/drawer/drawer.css +66 -0
- package/dist/elements/drawer/drawer.d.ts +34 -0
- package/dist/elements/drawer/drawer.d.ts.map +1 -0
- package/dist/elements/drawer/drawer.js +46 -0
- package/dist/elements/drawer/index.d.ts +8 -0
- package/dist/elements/drawer/index.d.ts.map +1 -0
- package/dist/elements/drawer/index.js +4 -0
- package/dist/elements/dropdown/dropdown.css +31 -0
- package/dist/elements/dropdown/dropdown.d.ts +64 -0
- package/dist/elements/dropdown/dropdown.d.ts.map +1 -0
- package/dist/elements/dropdown/dropdown.js +322 -0
- package/dist/elements/dropdown/index.d.ts +8 -0
- package/dist/elements/dropdown/index.d.ts.map +1 -0
- package/dist/elements/dropdown/index.js +4 -0
- package/dist/elements/dropdown-item/dropdown-item.css +51 -0
- package/dist/elements/dropdown-item/dropdown-item.d.ts +25 -0
- package/dist/elements/dropdown-item/dropdown-item.d.ts.map +1 -0
- package/dist/elements/dropdown-item/dropdown-item.js +110 -0
- package/dist/elements/dropdown-item/index.d.ts +8 -0
- package/dist/elements/dropdown-item/index.d.ts.map +1 -0
- package/dist/elements/dropdown-item/index.js +4 -0
- package/dist/elements/icon/icon.css +10 -0
- package/dist/elements/icon/icon.d.ts +19 -0
- package/dist/elements/icon/icon.d.ts.map +1 -0
- package/dist/elements/icon/icon.js +53 -0
- package/dist/elements/icon/index.d.ts +8 -0
- package/dist/elements/icon/index.d.ts.map +1 -0
- package/dist/elements/icon/index.js +4 -0
- package/dist/elements/input-otp/index.d.ts +8 -0
- package/dist/elements/input-otp/index.d.ts.map +1 -0
- package/dist/elements/input-otp/index.js +4 -0
- package/dist/elements/input-otp/input-otp.d.ts +31 -0
- package/dist/elements/input-otp/input-otp.d.ts.map +1 -0
- package/dist/elements/input-otp/input-otp.js +139 -0
- package/dist/elements/input-stepper/index.d.ts +8 -0
- package/dist/elements/input-stepper/index.d.ts.map +1 -0
- package/dist/elements/input-stepper/index.js +4 -0
- package/dist/elements/input-stepper/input-stepper.d.ts +63 -0
- package/dist/elements/input-stepper/input-stepper.d.ts.map +1 -0
- package/dist/elements/input-stepper/input-stepper.js +249 -0
- package/dist/elements/popover/index.d.ts +8 -0
- package/dist/elements/popover/index.d.ts.map +1 -0
- package/dist/elements/popover/index.js +4 -0
- package/dist/elements/popover/popover.css +61 -0
- package/dist/elements/popover/popover.d.ts +62 -0
- package/dist/elements/popover/popover.d.ts.map +1 -0
- package/dist/elements/popover/popover.js +244 -0
- package/dist/elements/rating/index.d.ts +8 -0
- package/dist/elements/rating/index.d.ts.map +1 -0
- package/dist/elements/rating/index.js +4 -0
- package/dist/elements/rating/rating.css +102 -0
- package/dist/elements/rating/rating.d.ts +38 -0
- package/dist/elements/rating/rating.d.ts.map +1 -0
- package/dist/elements/rating/rating.js +193 -0
- package/dist/elements/skeleton/index.d.ts +8 -0
- package/dist/elements/skeleton/index.d.ts.map +1 -0
- package/dist/elements/skeleton/index.js +4 -0
- package/dist/elements/skeleton/skeleton.d.ts +12 -0
- package/dist/elements/skeleton/skeleton.d.ts.map +1 -0
- package/dist/elements/skeleton/skeleton.js +13 -0
- package/dist/elements/spinner/index.d.ts +8 -0
- package/dist/elements/spinner/index.d.ts.map +1 -0
- package/dist/elements/spinner/index.js +4 -0
- package/dist/elements/spinner/spinner.css +28 -0
- package/dist/elements/spinner/spinner.d.ts +16 -0
- package/dist/elements/spinner/spinner.d.ts.map +1 -0
- package/dist/elements/spinner/spinner.js +37 -0
- package/dist/elements/tabs/index.d.ts +8 -0
- package/dist/elements/tabs/index.d.ts.map +1 -0
- package/dist/elements/tabs/index.js +4 -0
- package/dist/elements/tabs/tabs.d.ts +48 -0
- package/dist/elements/tabs/tabs.d.ts.map +1 -0
- package/dist/elements/tabs/tabs.js +210 -0
- package/dist/elements/toast/index.d.ts +9 -0
- package/dist/elements/toast/index.d.ts.map +1 -0
- package/dist/elements/toast/index.js +5 -0
- package/dist/elements/toast/toast.d.ts +72 -0
- package/dist/elements/toast/toast.d.ts.map +1 -0
- package/dist/elements/toast/toast.js +375 -0
- package/dist/elements/tooltip/index.d.ts +8 -0
- package/dist/elements/tooltip/index.d.ts.map +1 -0
- package/dist/elements/tooltip/index.js +4 -0
- package/dist/elements/tooltip/tooltip.css +37 -0
- package/dist/elements/tooltip/tooltip.d.ts +59 -0
- package/dist/elements/tooltip/tooltip.d.ts.map +1 -0
- package/dist/elements/tooltip/tooltip.js +231 -0
- package/dist/elements/tree/index.d.ts +8 -0
- package/dist/elements/tree/index.d.ts.map +1 -0
- package/dist/elements/tree/index.js +4 -0
- package/dist/elements/tree/tree.css +26 -0
- package/dist/elements/tree/tree.d.ts +76 -0
- package/dist/elements/tree/tree.d.ts.map +1 -0
- package/dist/elements/tree/tree.js +432 -0
- package/dist/elements/tree-item/index.d.ts +8 -0
- package/dist/elements/tree-item/index.d.ts.map +1 -0
- package/dist/elements/tree-item/index.js +4 -0
- package/dist/elements/tree-item/tree-item.css +172 -0
- package/dist/elements/tree-item/tree-item.d.ts +74 -0
- package/dist/elements/tree-item/tree-item.d.ts.map +1 -0
- package/dist/elements/tree-item/tree-item.js +301 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/registry.d.ts +22 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +33 -0
- package/dist/shared/controllers/popover.d.ts +44 -0
- package/dist/shared/controllers/popover.d.ts.map +1 -0
- package/dist/shared/controllers/popover.js +359 -0
- package/dist/shared/luxen-element.d.ts +20 -0
- package/dist/shared/luxen-element.d.ts.map +1 -0
- package/dist/shared/luxen-element.js +23 -0
- package/dist/shared/luxen-form-associated-element.d.ts +49 -0
- package/dist/shared/luxen-form-associated-element.d.ts.map +1 -0
- package/dist/shared/luxen-form-associated-element.js +123 -0
- package/dist/shared/styles/host.css +13 -0
- package/dist/shared/styles/host.styles.d.ts +9 -0
- package/dist/shared/styles/host.styles.d.ts.map +1 -0
- package/dist/shared/styles/host.styles.js +9 -0
- package/dist/skills/luxen-ui/SKILL.md +82 -0
- package/dist/skills/luxen-ui/references/avatar.md +259 -0
- package/dist/skills/luxen-ui/references/badge.md +289 -0
- package/dist/skills/luxen-ui/references/button.md +309 -0
- package/dist/skills/luxen-ui/references/close-button.md +104 -0
- package/dist/skills/luxen-ui/references/dialog.md +435 -0
- package/dist/skills/luxen-ui/references/drawer.md +400 -0
- package/dist/skills/luxen-ui/references/progress.md +133 -0
- package/dist/skills/luxen-ui/references/select.md +100 -0
- package/dist/skills/luxen-ui/references/toast.md +396 -0
- package/dist/skills/luxen-ui/references/tree.md +359 -0
- package/package.json +116 -0
- package/postcss-plugin-prefix.js +63 -0
- package/vite-plugin.ts +29 -0
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
+
};
|
|
12
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
13
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
14
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
15
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
16
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
17
|
+
};
|
|
18
|
+
var _LuxenTree_selection_accessor_storage, _LuxenTree_independent_accessor_storage;
|
|
19
|
+
import { html, unsafeCSS } from 'lit';
|
|
20
|
+
import { property } from 'lit/decorators.js';
|
|
21
|
+
import { LuxenElement } from '../../shared/luxen-element';
|
|
22
|
+
import { tagName } from '../../registry';
|
|
23
|
+
import hostStyles from '../../shared/styles/host.styles';
|
|
24
|
+
import rawStyles from './tree.css?inline';
|
|
25
|
+
const styles = unsafeCSS(rawStyles);
|
|
26
|
+
/**
|
|
27
|
+
* A hierarchical tree view composed of `<l-tree-item>` children.
|
|
28
|
+
*
|
|
29
|
+
* @slot - One or more `l-tree-item` elements.
|
|
30
|
+
*
|
|
31
|
+
* @csspart base - The root tree container.
|
|
32
|
+
*
|
|
33
|
+
* @cssproperty --indent-size - Horizontal indent per depth level. Default `1rem`.
|
|
34
|
+
* @cssproperty --indent-guide-width - Thickness of the vertical guide line between a parent and its children. Default `1px`. Set to `0` to hide guides.
|
|
35
|
+
* @cssproperty --indent-guide-style - Line style of the guide (`solid`, `dashed`, `dotted`, `double`…). Default `solid`.
|
|
36
|
+
* @cssproperty --indent-guide-color - Color of the guide line.
|
|
37
|
+
* @cssproperty --row-height - Minimum row height. Default `1.75rem`.
|
|
38
|
+
* @cssproperty --row-padding-inline - Inner inline padding of the row; also drives the content slot left indent and the indent guide column. Default `0.25rem`.
|
|
39
|
+
* @cssproperty --chevron-size - Size of the expand/collapse chevron box. Default `1.125rem`.
|
|
40
|
+
* @cssproperty --item-gap - Horizontal gap between chevron, prefix, label and suffix on the row; also drives the content slot left indent. Default `0.375rem`.
|
|
41
|
+
*
|
|
42
|
+
* @event selection-change - Fired when the selected items change. Detail: `{ selection: LuxenTreeItem[] }`.
|
|
43
|
+
*/
|
|
44
|
+
export class LuxenTree extends LuxenElement {
|
|
45
|
+
constructor() {
|
|
46
|
+
super(...arguments);
|
|
47
|
+
this._lastFocusedItem = null;
|
|
48
|
+
_LuxenTree_selection_accessor_storage.set(this, 'single');
|
|
49
|
+
_LuxenTree_independent_accessor_storage.set(this, false);
|
|
50
|
+
// --- Selection handling ---
|
|
51
|
+
this._onItemToggle = (event) => {
|
|
52
|
+
const { item, checked } = event.detail;
|
|
53
|
+
this._selectItem(item, checked);
|
|
54
|
+
};
|
|
55
|
+
// --- Keyboard / focus ---
|
|
56
|
+
this._onClick = (event) => {
|
|
57
|
+
const item = this._itemFromEvent(event);
|
|
58
|
+
if (!item || item.disabled)
|
|
59
|
+
return;
|
|
60
|
+
const path = event.composedPath();
|
|
61
|
+
const onCheckbox = path.some((n) => n instanceof HTMLInputElement && n.type === 'checkbox');
|
|
62
|
+
if (onCheckbox)
|
|
63
|
+
return; // handled via change event
|
|
64
|
+
// Clicks on consumer-provided interactive elements (buttons, links, form
|
|
65
|
+
// controls, menu items…) must not toggle the row — the consumer owns that
|
|
66
|
+
// interaction. Works regardless of which slot the element was placed in.
|
|
67
|
+
const INTERACTIVE_TAGS = new Set(['BUTTON', 'A', 'INPUT', 'SELECT', 'TEXTAREA']);
|
|
68
|
+
const INTERACTIVE_ROLES = new Set(['button', 'link', 'menuitem', 'menuitemcheckbox']);
|
|
69
|
+
const onInteractive = path.some((n) => {
|
|
70
|
+
if (!(n instanceof HTMLElement) || n === item)
|
|
71
|
+
return false;
|
|
72
|
+
if (n.getAttribute?.('part') === 'expand-button')
|
|
73
|
+
return false;
|
|
74
|
+
if (n instanceof HTMLInputElement && n.type === 'checkbox')
|
|
75
|
+
return false;
|
|
76
|
+
if (INTERACTIVE_TAGS.has(n.tagName))
|
|
77
|
+
return true;
|
|
78
|
+
const role = n.getAttribute?.('role');
|
|
79
|
+
return role !== null && INTERACTIVE_ROLES.has(role);
|
|
80
|
+
});
|
|
81
|
+
if (onInteractive)
|
|
82
|
+
return;
|
|
83
|
+
const onExpand = path.some((n) => n instanceof HTMLElement && n.getAttribute?.('part') === 'expand-button');
|
|
84
|
+
this._focusItem(item);
|
|
85
|
+
if (onExpand) {
|
|
86
|
+
item.toggle();
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
// Row click (label area): mode-dependent behaviour.
|
|
90
|
+
switch (this.selection) {
|
|
91
|
+
case 'single':
|
|
92
|
+
this._setSingleSelection(item);
|
|
93
|
+
if (!item.isLeaf())
|
|
94
|
+
item.toggle();
|
|
95
|
+
break;
|
|
96
|
+
case 'leaf':
|
|
97
|
+
if (item.isLeaf())
|
|
98
|
+
this._setSingleSelection(item);
|
|
99
|
+
else
|
|
100
|
+
item.toggle();
|
|
101
|
+
break;
|
|
102
|
+
case 'multiple':
|
|
103
|
+
// The whole row acts like a <label> for the checkbox: clicking anywhere
|
|
104
|
+
// on it toggles selection. Use the chevron to expand/collapse branches.
|
|
105
|
+
this._selectItem(item, !item.selected);
|
|
106
|
+
break;
|
|
107
|
+
case 'none':
|
|
108
|
+
item.toggle();
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
this._onFocusIn = (event) => {
|
|
113
|
+
const target = event.target;
|
|
114
|
+
if (target instanceof HTMLElement) {
|
|
115
|
+
const item = target.closest(tagName('tree-item'));
|
|
116
|
+
if (item)
|
|
117
|
+
this._lastFocusedItem = item;
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
this._onKeyDown = (event) => {
|
|
121
|
+
const current = this._lastFocusedItem ?? this._visibleItems()[0];
|
|
122
|
+
if (!current)
|
|
123
|
+
return;
|
|
124
|
+
const visible = this._visibleItems();
|
|
125
|
+
const index = visible.indexOf(current);
|
|
126
|
+
switch (event.key) {
|
|
127
|
+
case 'ArrowDown': {
|
|
128
|
+
event.preventDefault();
|
|
129
|
+
const next = visible[Math.min(index + 1, visible.length - 1)];
|
|
130
|
+
if (next)
|
|
131
|
+
this._focusItem(next);
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
case 'ArrowUp': {
|
|
135
|
+
event.preventDefault();
|
|
136
|
+
const prev = visible[Math.max(index - 1, 0)];
|
|
137
|
+
if (prev)
|
|
138
|
+
this._focusItem(prev);
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
case 'ArrowRight': {
|
|
142
|
+
event.preventDefault();
|
|
143
|
+
if (!current.isLeaf() && !current.expanded) {
|
|
144
|
+
current.expanded = true;
|
|
145
|
+
}
|
|
146
|
+
else if (current.expanded) {
|
|
147
|
+
const first = current.getChildrenItems()[0];
|
|
148
|
+
if (first)
|
|
149
|
+
this._focusItem(first);
|
|
150
|
+
}
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
case 'ArrowLeft': {
|
|
154
|
+
event.preventDefault();
|
|
155
|
+
if (current.expanded && !current.isLeaf()) {
|
|
156
|
+
current.expanded = false;
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
const parent = current.parentElement?.closest(tagName('tree-item'));
|
|
160
|
+
if (parent)
|
|
161
|
+
this._focusItem(parent);
|
|
162
|
+
}
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
case 'Home': {
|
|
166
|
+
event.preventDefault();
|
|
167
|
+
if (visible[0])
|
|
168
|
+
this._focusItem(visible[0]);
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
case 'End': {
|
|
172
|
+
event.preventDefault();
|
|
173
|
+
const last = visible[visible.length - 1];
|
|
174
|
+
if (last)
|
|
175
|
+
this._focusItem(last);
|
|
176
|
+
break;
|
|
177
|
+
}
|
|
178
|
+
case 'Enter':
|
|
179
|
+
case ' ': {
|
|
180
|
+
event.preventDefault();
|
|
181
|
+
this._handleRowActivate(current);
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
case '*': {
|
|
185
|
+
event.preventDefault();
|
|
186
|
+
// Expand all siblings of the current item.
|
|
187
|
+
const siblings = (current.parentElement
|
|
188
|
+
? Array.from(current.parentElement.children)
|
|
189
|
+
: []).filter((el) => el.tagName === tagName('tree-item').toUpperCase());
|
|
190
|
+
for (const sib of siblings) {
|
|
191
|
+
if (!sib.isLeaf())
|
|
192
|
+
sib.expanded = true;
|
|
193
|
+
}
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Selection behaviour:
|
|
201
|
+
* - `single` (default): at most one item selected via `aria-selected`.
|
|
202
|
+
* - `multiple`: any number of items selected. Checkboxes are rendered.
|
|
203
|
+
* - `leaf`: only leaf items can be selected (single). Branches just toggle.
|
|
204
|
+
* - `none`: purely navigable, no selection state.
|
|
205
|
+
*/
|
|
206
|
+
get selection() { return __classPrivateFieldGet(this, _LuxenTree_selection_accessor_storage, "f"); }
|
|
207
|
+
set selection(value) { __classPrivateFieldSet(this, _LuxenTree_selection_accessor_storage, value, "f"); }
|
|
208
|
+
/**
|
|
209
|
+
* When set with `selection="multiple"`, parent and children selection are decoupled:
|
|
210
|
+
* toggling a parent does NOT toggle its descendants and vice versa.
|
|
211
|
+
* Without it, selection cascades both ways and branches may become indeterminate.
|
|
212
|
+
*/
|
|
213
|
+
get independent() { return __classPrivateFieldGet(this, _LuxenTree_independent_accessor_storage, "f"); }
|
|
214
|
+
set independent(value) { __classPrivateFieldSet(this, _LuxenTree_independent_accessor_storage, value, "f"); }
|
|
215
|
+
connectedCallback() {
|
|
216
|
+
super.connectedCallback();
|
|
217
|
+
this._mutationObserver = new MutationObserver(() => this._syncAll());
|
|
218
|
+
this._mutationObserver.observe(this, { childList: true, subtree: true });
|
|
219
|
+
this.addEventListener('l-tree-item-toggle', this._onItemToggle);
|
|
220
|
+
// Defer sync to let light DOM upgrade.
|
|
221
|
+
queueMicrotask(() => this._syncAll());
|
|
222
|
+
}
|
|
223
|
+
disconnectedCallback() {
|
|
224
|
+
super.disconnectedCallback();
|
|
225
|
+
this._mutationObserver?.disconnect();
|
|
226
|
+
this.removeEventListener('l-tree-item-toggle', this._onItemToggle);
|
|
227
|
+
}
|
|
228
|
+
updated(changed) {
|
|
229
|
+
if (changed.has('selection') || changed.has('independent')) {
|
|
230
|
+
this._syncAll();
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
// --- Public API ---
|
|
234
|
+
/** Returns all items in document (flat) order, including nested ones. */
|
|
235
|
+
getAllItems({ includeDisabled = true } = {}) {
|
|
236
|
+
const tag = tagName('tree-item');
|
|
237
|
+
return Array.from(this.querySelectorAll(tag)).filter((item) => includeDisabled || !item.disabled);
|
|
238
|
+
}
|
|
239
|
+
/** Returns currently selected items. */
|
|
240
|
+
getSelection() {
|
|
241
|
+
return this.getAllItems().filter((i) => i.selected);
|
|
242
|
+
}
|
|
243
|
+
/** Expands every item that has children. */
|
|
244
|
+
expandAll() {
|
|
245
|
+
for (const item of this.getAllItems()) {
|
|
246
|
+
if (!item.isLeaf())
|
|
247
|
+
item.expanded = true;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
/** Collapses every item. */
|
|
251
|
+
collapseAll() {
|
|
252
|
+
for (const item of this.getAllItems()) {
|
|
253
|
+
item.expanded = false;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
// --- Sync / ARIA / depth / checkbox visibility ---
|
|
257
|
+
_syncAll() {
|
|
258
|
+
const showCheckbox = this.selection === 'multiple';
|
|
259
|
+
const roots = this._rootItems();
|
|
260
|
+
for (const root of roots) {
|
|
261
|
+
this._syncSubtree(root, 0, showCheckbox);
|
|
262
|
+
}
|
|
263
|
+
this._updateBranchStates();
|
|
264
|
+
// Ensure at least one item is tabbable.
|
|
265
|
+
this._ensureTabStop();
|
|
266
|
+
}
|
|
267
|
+
_syncSubtree(item, depth, showCheckbox) {
|
|
268
|
+
item.depth = depth;
|
|
269
|
+
item.showCheckbox = showCheckbox && this._canShowCheckboxOn(item);
|
|
270
|
+
for (const child of item.getChildrenItems()) {
|
|
271
|
+
this._syncSubtree(child, depth + 1, showCheckbox);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
_canShowCheckboxOn(_item) {
|
|
275
|
+
if (this.selection !== 'multiple')
|
|
276
|
+
return false;
|
|
277
|
+
// In cascade mode, branches get a checkbox too so you can bulk-toggle children.
|
|
278
|
+
// In leaf-only selection, hidden here because selection !== 'multiple'.
|
|
279
|
+
return true;
|
|
280
|
+
}
|
|
281
|
+
_rootItems() {
|
|
282
|
+
const tag = tagName('tree-item').toUpperCase();
|
|
283
|
+
return Array.from(this.children).filter((el) => el.tagName === tag);
|
|
284
|
+
}
|
|
285
|
+
_ensureTabStop() {
|
|
286
|
+
const items = this._visibleItems();
|
|
287
|
+
if (items.length === 0)
|
|
288
|
+
return;
|
|
289
|
+
const hasTabStop = items.some((i) => i.tabIndex === 0);
|
|
290
|
+
if (!hasTabStop) {
|
|
291
|
+
for (const i of items)
|
|
292
|
+
i.tabIndex = -1;
|
|
293
|
+
items[0].tabIndex = 0;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
/** Items currently visible (parent chain all expanded). */
|
|
297
|
+
_visibleItems() {
|
|
298
|
+
const out = [];
|
|
299
|
+
const walk = (items) => {
|
|
300
|
+
for (const i of items) {
|
|
301
|
+
out.push(i);
|
|
302
|
+
if (i.expanded)
|
|
303
|
+
walk(i.getChildrenItems());
|
|
304
|
+
}
|
|
305
|
+
};
|
|
306
|
+
walk(this._rootItems());
|
|
307
|
+
return out;
|
|
308
|
+
}
|
|
309
|
+
_handleRowActivate(item) {
|
|
310
|
+
if (item.disabled)
|
|
311
|
+
return;
|
|
312
|
+
switch (this.selection) {
|
|
313
|
+
case 'single':
|
|
314
|
+
this._setSingleSelection(item);
|
|
315
|
+
break;
|
|
316
|
+
case 'leaf':
|
|
317
|
+
if (item.isLeaf())
|
|
318
|
+
this._setSingleSelection(item);
|
|
319
|
+
else
|
|
320
|
+
item.toggle();
|
|
321
|
+
break;
|
|
322
|
+
case 'multiple':
|
|
323
|
+
this._selectItem(item, !item.selected);
|
|
324
|
+
break;
|
|
325
|
+
case 'none':
|
|
326
|
+
item.toggle();
|
|
327
|
+
break;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
_setSingleSelection(item) {
|
|
331
|
+
for (const i of this.getAllItems()) {
|
|
332
|
+
if (i !== item && i.selected)
|
|
333
|
+
i.selected = false;
|
|
334
|
+
}
|
|
335
|
+
item.selected = true;
|
|
336
|
+
this._emitSelectionChange();
|
|
337
|
+
}
|
|
338
|
+
_selectItem(item, value) {
|
|
339
|
+
if (item.disabled)
|
|
340
|
+
return;
|
|
341
|
+
item.selected = value;
|
|
342
|
+
if (this.selection === 'multiple' && !this.independent) {
|
|
343
|
+
// Cascade DOWN: toggling a branch toggles all descendants.
|
|
344
|
+
this._setSubtreeSelection(item, value);
|
|
345
|
+
}
|
|
346
|
+
item.indeterminate = false;
|
|
347
|
+
this._updateBranchStates();
|
|
348
|
+
this._emitSelectionChange();
|
|
349
|
+
}
|
|
350
|
+
_setSubtreeSelection(item, value) {
|
|
351
|
+
for (const child of item.getChildrenItems()) {
|
|
352
|
+
if (child.disabled)
|
|
353
|
+
continue;
|
|
354
|
+
child.selected = value;
|
|
355
|
+
child.indeterminate = false;
|
|
356
|
+
this._setSubtreeSelection(child, value);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
/** Propagate child state UP to parents (indeterminate / auto-checked). */
|
|
360
|
+
_updateBranchStates() {
|
|
361
|
+
if (this.selection !== 'multiple' || this.independent) {
|
|
362
|
+
// In independent or non-multiple modes, clear any indeterminate flags.
|
|
363
|
+
for (const i of this.getAllItems())
|
|
364
|
+
i.indeterminate = false;
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
const recompute = (item) => {
|
|
368
|
+
const children = item.getChildrenItems({ includeDisabled: false });
|
|
369
|
+
if (children.length === 0) {
|
|
370
|
+
return { all: item.selected, any: item.selected };
|
|
371
|
+
}
|
|
372
|
+
let all = true;
|
|
373
|
+
let any = false;
|
|
374
|
+
for (const child of children) {
|
|
375
|
+
const state = recompute(child);
|
|
376
|
+
if (!state.all)
|
|
377
|
+
all = false;
|
|
378
|
+
if (state.any)
|
|
379
|
+
any = true;
|
|
380
|
+
}
|
|
381
|
+
item.selected = all;
|
|
382
|
+
item.indeterminate = !all && any;
|
|
383
|
+
return { all: all && (item.getChildrenItems().length > 0 ? all : item.selected), any };
|
|
384
|
+
};
|
|
385
|
+
for (const root of this._rootItems())
|
|
386
|
+
recompute(root);
|
|
387
|
+
}
|
|
388
|
+
_emitSelectionChange() {
|
|
389
|
+
this.emit('selection-change', { detail: { selection: this.getSelection() } });
|
|
390
|
+
}
|
|
391
|
+
_itemFromEvent(event) {
|
|
392
|
+
const tag = tagName('tree-item');
|
|
393
|
+
const path = event.composedPath();
|
|
394
|
+
for (const node of path) {
|
|
395
|
+
if (node instanceof HTMLElement && node.matches?.(tag)) {
|
|
396
|
+
return node;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
return null;
|
|
400
|
+
}
|
|
401
|
+
_focusItem(item) {
|
|
402
|
+
const visible = this._visibleItems();
|
|
403
|
+
for (const i of visible)
|
|
404
|
+
i.tabIndex = -1;
|
|
405
|
+
item.tabIndex = 0;
|
|
406
|
+
item.focus();
|
|
407
|
+
this._lastFocusedItem = item;
|
|
408
|
+
}
|
|
409
|
+
render() {
|
|
410
|
+
return html `
|
|
411
|
+
<div
|
|
412
|
+
class="tree"
|
|
413
|
+
part="base"
|
|
414
|
+
role="tree"
|
|
415
|
+
aria-multiselectable=${this.selection === 'multiple' ? 'true' : 'false'}
|
|
416
|
+
@click=${this._onClick}
|
|
417
|
+
@keydown=${this._onKeyDown}
|
|
418
|
+
@focusin=${this._onFocusIn}
|
|
419
|
+
>
|
|
420
|
+
<slot></slot>
|
|
421
|
+
</div>
|
|
422
|
+
`;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
_LuxenTree_selection_accessor_storage = new WeakMap(), _LuxenTree_independent_accessor_storage = new WeakMap();
|
|
426
|
+
LuxenTree.styles = [hostStyles, styles];
|
|
427
|
+
__decorate([
|
|
428
|
+
property({ reflect: true })
|
|
429
|
+
], LuxenTree.prototype, "selection", null);
|
|
430
|
+
__decorate([
|
|
431
|
+
property({ type: Boolean, reflect: true })
|
|
432
|
+
], LuxenTree.prototype, "independent", null);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/html/elements/tree-item/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,cAAc,aAAa,CAAC;AAG5B,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,aAAa,EAAE,aAAa,CAAC;KAC9B;CACF"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
:host {
|
|
2
|
+
display: block;
|
|
3
|
+
color: var(--l-color-text-primary, CanvasText);
|
|
4
|
+
font-size: 0.875rem;
|
|
5
|
+
line-height: 1.5;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
:host([disabled]) {
|
|
9
|
+
opacity: 0.4;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
:host([disabled]) .item {
|
|
13
|
+
cursor: not-allowed;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.item {
|
|
17
|
+
display: flex;
|
|
18
|
+
align-items: center;
|
|
19
|
+
gap: var(--item-gap);
|
|
20
|
+
min-block-size: var(--row-height);
|
|
21
|
+
padding-inline: var(--row-padding-inline);
|
|
22
|
+
padding-inline-start: calc(var(--indent-size) * var(--_depth, 0) + var(--row-padding-inline));
|
|
23
|
+
border-radius: 0.375rem;
|
|
24
|
+
cursor: pointer;
|
|
25
|
+
user-select: none;
|
|
26
|
+
transition:
|
|
27
|
+
background-color 120ms ease,
|
|
28
|
+
color 120ms ease;
|
|
29
|
+
position: relative;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.item:focus-visible,
|
|
33
|
+
:host(:focus-visible) .item {
|
|
34
|
+
outline: 2px solid var(--l-focus-ring, Highlight);
|
|
35
|
+
outline-offset: 1px;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
@media (hover: hover) {
|
|
39
|
+
:host(:not([disabled])) .item:hover {
|
|
40
|
+
background-color: var(--l-color-bg-state-hover);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
:host([selected]:not([disabled])) .item {
|
|
45
|
+
background-color: var(--l-color-bg-state-selected);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.expand {
|
|
49
|
+
inline-size: var(--chevron-size);
|
|
50
|
+
block-size: var(--chevron-size);
|
|
51
|
+
display: grid;
|
|
52
|
+
place-items: center;
|
|
53
|
+
flex: none;
|
|
54
|
+
color: var(--l-color-text-secondary, CanvasText);
|
|
55
|
+
border-radius: 3px;
|
|
56
|
+
cursor: pointer;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/* Hide the DEFAULT fallback chevron SVG on a leaf — slotted content
|
|
60
|
+
(user-provided icon, avatar, etc.) remains visible. */
|
|
61
|
+
:host(:not(:state(has-children)):not([lazy])) .expand > svg {
|
|
62
|
+
display: none;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.expand svg {
|
|
66
|
+
width: 100%;
|
|
67
|
+
height: 100%;
|
|
68
|
+
display: block;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.checkbox {
|
|
72
|
+
margin: 0;
|
|
73
|
+
flex: none;
|
|
74
|
+
accent-color: var(--l-color-bg-fill-brand, Highlight);
|
|
75
|
+
cursor: pointer;
|
|
76
|
+
inline-size: 1rem;
|
|
77
|
+
block-size: 1rem;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/* Checkbox is only rendered when the parent tree enables multi-selection */
|
|
81
|
+
:host(:not(:state(checkbox))) .checkbox {
|
|
82
|
+
display: none;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.label {
|
|
86
|
+
flex: 1;
|
|
87
|
+
min-inline-size: 0;
|
|
88
|
+
display: flex;
|
|
89
|
+
align-items: center;
|
|
90
|
+
gap: 0.375rem;
|
|
91
|
+
overflow: hidden;
|
|
92
|
+
text-overflow: ellipsis;
|
|
93
|
+
white-space: nowrap;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
.label ::slotted(*) {
|
|
97
|
+
min-inline-size: 0;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/* Wrapper around the content slot + children — anchor for the indent guide. */
|
|
101
|
+
.branch {
|
|
102
|
+
position: relative;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/* Content slot — block area between the row and the children.
|
|
106
|
+
Aligned under the label text: same left offset as the row's label
|
|
107
|
+
(depth indent + row padding + chevron + gap). Visible for leaves (no
|
|
108
|
+
children) and for expanded branches; hidden when a branch is collapsed
|
|
109
|
+
(mirrors the children visibility). */
|
|
110
|
+
.content {
|
|
111
|
+
display: block;
|
|
112
|
+
padding-inline-start: calc(
|
|
113
|
+
var(--indent-size) * var(--_depth, 0) + var(--row-padding-inline) + var(--chevron-size) +
|
|
114
|
+
var(--item-gap)
|
|
115
|
+
);
|
|
116
|
+
padding-inline-end: var(--row-padding-inline);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
:host(:state(has-children):not([expanded])) .content {
|
|
120
|
+
display: none;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.children {
|
|
124
|
+
display: none;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
:host([expanded]) .children {
|
|
128
|
+
display: block;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/* Vertical indent guide — spans the content + children block, starting
|
|
132
|
+
right below the row so it never overlaps the chevron/avatar.
|
|
133
|
+
The guide's visual centre sits exactly on the parent chevron's centre. */
|
|
134
|
+
.branch::before {
|
|
135
|
+
content: '';
|
|
136
|
+
position: absolute;
|
|
137
|
+
inset-block: 0;
|
|
138
|
+
inset-inline-start: calc(
|
|
139
|
+
var(--indent-size) * var(--_depth, 0) + var(--row-padding-inline) + (var(--chevron-size) / 2) -
|
|
140
|
+
(var(--indent-guide-width) / 2)
|
|
141
|
+
);
|
|
142
|
+
inline-size: 0;
|
|
143
|
+
border-inline-start: var(--indent-guide-width) var(--indent-guide-style) var(--indent-guide-color);
|
|
144
|
+
pointer-events: none;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/* Only render the guide for open branches that have children. */
|
|
148
|
+
:host(:not([expanded])) .branch::before,
|
|
149
|
+
:host(:not(:state(has-children))) .branch::before {
|
|
150
|
+
display: none;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.spinner {
|
|
154
|
+
inline-size: 0.875rem;
|
|
155
|
+
block-size: 0.875rem;
|
|
156
|
+
border-radius: 50%;
|
|
157
|
+
border: 2px solid var(--l-color-border, currentColor);
|
|
158
|
+
border-block-start-color: transparent;
|
|
159
|
+
animation: spin 700ms linear infinite;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
@media (prefers-reduced-motion: reduce) {
|
|
163
|
+
.spinner {
|
|
164
|
+
animation: none;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
@keyframes spin {
|
|
169
|
+
to {
|
|
170
|
+
transform: rotate(360deg);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { type PropertyValues } from 'lit';
|
|
2
|
+
import { LuxenElement } from '../../shared/luxen-element';
|
|
3
|
+
/**
|
|
4
|
+
* A node inside `<l-tree>`. Nested `<l-tree-item>` children become sub-nodes.
|
|
5
|
+
*
|
|
6
|
+
* @slot - Label content (kept to a single row).
|
|
7
|
+
* @slot prefix - Leading content before the label (e.g. icon).
|
|
8
|
+
* @slot suffix - Trailing content.
|
|
9
|
+
* @slot expand-icon - Icon shown when the item is collapsed.
|
|
10
|
+
* @slot collapse-icon - Icon shown when the item is expanded.
|
|
11
|
+
* @slot content - Block content that belongs to the item but not to its header row (e.g. comment body, action bar). Hidden when a branch is collapsed.
|
|
12
|
+
*
|
|
13
|
+
* @csspart base - The item row.
|
|
14
|
+
* @csspart expand-button - The chevron toggle area.
|
|
15
|
+
* @csspart checkbox - The native checkbox input.
|
|
16
|
+
* @csspart label - The label container.
|
|
17
|
+
* @csspart branch - Wrapper around the content and children slots; carries the indent guide.
|
|
18
|
+
* @csspart content - The content slot wrapper (block area between the row and the children).
|
|
19
|
+
* @csspart children - The nested items container.
|
|
20
|
+
*
|
|
21
|
+
* @cssproperty [--_depth] - Internal depth index driving indentation. Set by `<l-tree>`.
|
|
22
|
+
*
|
|
23
|
+
* Layout tokens (`--chevron-size`, `--row-height`, `--row-padding-inline`, `--item-gap`) live on `<l-tree>` and cascade down — see its CSS custom properties.
|
|
24
|
+
*
|
|
25
|
+
* @event expand - Fired when the item is expanded.
|
|
26
|
+
* @event collapse - Fired when the item is collapsed.
|
|
27
|
+
* @event lazy-load - Fired when a lazy item is expanded for the first time. Consumers should append children and set `lazy=false`.
|
|
28
|
+
*/
|
|
29
|
+
export declare class LuxenTreeItem extends LuxenElement {
|
|
30
|
+
static styles: import("lit").CSSResult[];
|
|
31
|
+
private _internals;
|
|
32
|
+
private _childObserver?;
|
|
33
|
+
/** Whether the item is expanded. */
|
|
34
|
+
accessor expanded: boolean;
|
|
35
|
+
/** Whether the item is selected. */
|
|
36
|
+
accessor selected: boolean;
|
|
37
|
+
/** Whether the checkbox is indeterminate (some descendants selected). */
|
|
38
|
+
accessor indeterminate: boolean;
|
|
39
|
+
/** Whether the item is disabled. */
|
|
40
|
+
accessor disabled: boolean;
|
|
41
|
+
/** Marks this item as having children that will be loaded on first expand. */
|
|
42
|
+
accessor lazy: boolean;
|
|
43
|
+
/** Whether the item is currently loading (shows a spinner). */
|
|
44
|
+
accessor loading: boolean;
|
|
45
|
+
/** Set by `<l-tree>`: whether a checkbox is shown. */
|
|
46
|
+
set showCheckbox(value: boolean);
|
|
47
|
+
get showCheckbox(): boolean;
|
|
48
|
+
private _showCheckbox;
|
|
49
|
+
/** Set by `<l-tree>`: depth of the item in the tree (0 = root). */
|
|
50
|
+
set depth(value: number);
|
|
51
|
+
get depth(): number;
|
|
52
|
+
private _depth;
|
|
53
|
+
/** Whether this item has nested tree-item children. */
|
|
54
|
+
get hasChildren(): boolean;
|
|
55
|
+
private _hasChildren;
|
|
56
|
+
/** Returns the child `<l-tree-item>` elements directly under this one. */
|
|
57
|
+
getChildrenItems({ includeDisabled }?: {
|
|
58
|
+
includeDisabled?: boolean | undefined;
|
|
59
|
+
}): LuxenTreeItem[];
|
|
60
|
+
/** Returns true if this item has no expandable children. */
|
|
61
|
+
isLeaf(): boolean;
|
|
62
|
+
/** Returns the text label of this item. */
|
|
63
|
+
getTextLabel(): string;
|
|
64
|
+
connectedCallback(): void;
|
|
65
|
+
disconnectedCallback(): void;
|
|
66
|
+
updated(changed: PropertyValues<this>): void;
|
|
67
|
+
private _setState;
|
|
68
|
+
private _syncChildren;
|
|
69
|
+
/** Toggle expand state. Emits `lazy-load` the first time a lazy item opens. */
|
|
70
|
+
toggle(): void;
|
|
71
|
+
private _onCheckboxChange;
|
|
72
|
+
render(): import("lit").TemplateResult<1>;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=tree-item.d.ts.map
|