@nvidia-elements/core 2.6.1 → 2.7.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/CHANGELOG.md +7 -0
- package/dist/accordion/accordion2.js +4 -4
- package/dist/alert/alert-group2.js +1 -1
- package/dist/alert/alert2.js +1 -1
- package/dist/avatar/avatar-group2.js +1 -1
- package/dist/avatar/avatar2.js +1 -1
- package/dist/badge/badge2.js +1 -1
- package/dist/breadcrumb/breadcrumb2.js +1 -1
- package/dist/bundles/index.d.ts +1 -0
- package/dist/bundles/index.js +5 -5
- package/dist/button/button2.js +1 -1
- package/dist/button-group/button-group2.js +1 -1
- package/dist/card/card2.js +4 -4
- package/dist/chat-message/chat-message2.js +1 -1
- package/dist/checkbox/checkbox-group2.js +1 -1
- package/dist/checkbox/checkbox2.js +1 -1
- package/dist/color/color2.js +1 -1
- package/dist/combobox/combobox2.js +1 -1
- package/dist/copy-button/copy-button2.js +1 -1
- package/dist/custom-elements.json +588 -184
- package/dist/date/date2.js +1 -1
- package/dist/datetime/datetime2.js +1 -1
- package/dist/dialog/dialog-footer2.js +1 -1
- package/dist/dialog/dialog-header2.js +1 -1
- package/dist/dialog/dialog2.js +1 -1
- package/dist/divider/divider2.js +1 -1
- package/dist/dot/dot2.js +1 -1
- package/dist/drawer/drawer-content2.js +1 -1
- package/dist/drawer/drawer-footer2.js +1 -1
- package/dist/drawer/drawer-header2.js +1 -1
- package/dist/drawer/drawer2.js +1 -1
- package/dist/dropdown/dropdown-footer2.js +1 -1
- package/dist/dropdown/dropdown-header2.js +1 -1
- package/dist/dropdown/dropdown2.js +1 -1
- package/dist/dropdown-group/dropdown-group.js +1 -1
- package/dist/dropzone/dropzone2.js +1 -1
- package/dist/file/file2.js +1 -1
- package/dist/format-bytes/format-bytes2.js +1 -1
- package/dist/format-datetime/format-datetime2.js +1 -1
- package/dist/format-number/format-number2.js +1 -1
- package/dist/format-relative-time/format-relative-time2.js +1 -1
- package/dist/format-truncate/format-truncate2.js +1 -1
- package/dist/forms/control/control2.js +1 -1
- package/dist/forms/control-group/control-group2.js +1 -1
- package/dist/forms/control-message/control-message2.js +1 -1
- package/dist/gauge/gauge2.js +1 -1
- package/dist/grid/cell/cell2.js +1 -1
- package/dist/grid/column/column2.js +1 -1
- package/dist/grid/footer/footer2.js +1 -1
- package/dist/grid/grid2.js +1 -1
- package/dist/grid/header/header2.js +1 -1
- package/dist/grid/placeholder/placeholder2.js +1 -1
- package/dist/grid/row/row2.js +1 -1
- package/dist/icon/icon2.js +2 -2
- package/dist/icon-button/icon-button2.js +1 -1
- package/dist/index.js +1 -1
- package/dist/input/input-group2.js +1 -1
- package/dist/input/input2.js +1 -1
- package/dist/internal/controllers/gesture.controller.d.ts +65 -0
- package/dist/internal/controllers/gesture.controller.examples.js +6 -0
- package/dist/internal/controllers/gesture.controller.examples.js.map +1 -0
- package/dist/internal/controllers/gesture.controller.examples.json +16 -0
- package/dist/internal/controllers/gesture.controller.js +235 -0
- package/dist/internal/controllers/gesture.controller.js.map +1 -0
- package/dist/internal/controllers/keynav-spatial.controller.d.ts +24 -0
- package/dist/internal/controllers/keynav-spatial.controller.js +75 -0
- package/dist/internal/controllers/keynav-spatial.controller.js.map +1 -0
- package/dist/internal/index.d.ts +2 -1
- package/dist/internal/index.js +30 -29
- package/dist/internal/services/global.service.js +1 -1
- package/dist/logo/logo2.js +1 -1
- package/dist/menu/menu-item2.js +1 -1
- package/dist/menu/menu2.js +1 -1
- package/dist/month/month2.js +1 -1
- package/dist/notification/notification-group2.js +1 -1
- package/dist/notification/notification2.js +1 -1
- package/dist/page/page-panel/page-panel-content2.js +1 -1
- package/dist/page/page-panel/page-panel-footer2.js +1 -1
- package/dist/page/page-panel/page-panel-header2.js +1 -1
- package/dist/page/page-panel/page-panel2.js +1 -1
- package/dist/page/page2.js +1 -1
- package/dist/page-header/page-header2.js +1 -1
- package/dist/page-loader/page-loader2.js +1 -1
- package/dist/pagination/pagination2.js +1 -1
- package/dist/panel/panel2.js +4 -4
- package/dist/password/password2.js +1 -1
- package/dist/preferences-input/preferences-input2.js +1 -1
- package/dist/progress-bar/progress-bar2.js +1 -1
- package/dist/progress-ring/progress-ring2.js +1 -1
- package/dist/progressive-filter-chip/progressive-filter-chip2.js +1 -1
- package/dist/pulse/pulse2.js +1 -1
- package/dist/radio/radio-group2.js +1 -1
- package/dist/radio/radio2.js +1 -1
- package/dist/range/range2.js +1 -1
- package/dist/resize-handle/resize-handle.d.ts +1 -0
- package/dist/resize-handle/resize-handle2.js +42 -23
- package/dist/resize-handle/resize-handle2.js.map +1 -1
- package/dist/search/search2.js +1 -1
- package/dist/select/select2.js +1 -1
- package/dist/skeleton/skeleton2.js +1 -1
- package/dist/sort-button/sort-button2.js +1 -1
- package/dist/sparkline/sparkline2.js +1 -1
- package/dist/star-rating/star-rating2.js +1 -1
- package/dist/steps/steps2.js +2 -2
- package/dist/switch/switch-group2.js +1 -1
- package/dist/switch/switch2.js +1 -1
- package/dist/tabs/tabs-group2.js +1 -1
- package/dist/tabs/tabs2.js +2 -2
- package/dist/tag/tag2.js +1 -1
- package/dist/textarea/textarea2.js +1 -1
- package/dist/time/time2.js +1 -1
- package/dist/toast/toast2.js +1 -1
- package/dist/toggletip/toggletip-footer2.js +1 -1
- package/dist/toggletip/toggletip-header2.js +1 -1
- package/dist/toggletip/toggletip2.js +1 -1
- package/dist/toolbar/toolbar2.js +1 -1
- package/dist/tooltip/tooltip2.js +1 -1
- package/dist/tree/tree-node2.js +1 -1
- package/dist/tree/tree2.js +1 -1
- package/dist/week/week2.js +1 -1
- package/package.json +23 -1
- package/dist/internal/controllers/type-touch.controller.d.ts +0 -22
- package/dist/internal/controllers/type-touch.controller.examples.js +0 -6
- package/dist/internal/controllers/type-touch.controller.examples.js.map +0 -1
- package/dist/internal/controllers/type-touch.controller.examples.json +0 -16
- package/dist/internal/controllers/type-touch.controller.js +0 -58
- package/dist/internal/controllers/type-touch.controller.js.map +0 -1
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
//#region src/internal/controllers/gesture.controller.ts
|
|
2
|
+
var e = [
|
|
3
|
+
"auxclick",
|
|
4
|
+
"click",
|
|
5
|
+
"contextmenu",
|
|
6
|
+
"lostpointercapture",
|
|
7
|
+
"pointercancel",
|
|
8
|
+
"pointerdown",
|
|
9
|
+
"pointermove",
|
|
10
|
+
"pointerup",
|
|
11
|
+
"wheel"
|
|
12
|
+
], t = class {
|
|
13
|
+
#e;
|
|
14
|
+
#t;
|
|
15
|
+
#n = /* @__PURE__ */ new Set();
|
|
16
|
+
#r = /* @__PURE__ */ new Map();
|
|
17
|
+
#i = !1;
|
|
18
|
+
#a;
|
|
19
|
+
#o;
|
|
20
|
+
constructor(e, t) {
|
|
21
|
+
this.#e = e, this.#t = t, e.addController(this);
|
|
22
|
+
}
|
|
23
|
+
set target(e) {
|
|
24
|
+
e !== this.#o && (this.#c(), this.#E(), this.#o = e, this.#s());
|
|
25
|
+
}
|
|
26
|
+
hostConnected() {
|
|
27
|
+
this.#i = !0, this.#s();
|
|
28
|
+
}
|
|
29
|
+
hostDisconnected() {
|
|
30
|
+
this.#c(), this.#E(), this.#i = !1;
|
|
31
|
+
}
|
|
32
|
+
#s() {
|
|
33
|
+
if (!(!this.#i || !this.#o)) for (let t of e) this.#o.addEventListener(t, this.#l, !0);
|
|
34
|
+
}
|
|
35
|
+
#c() {
|
|
36
|
+
if (!(!this.#i || !this.#o)) for (let t of e) this.#o.removeEventListener(t, this.#l, !0);
|
|
37
|
+
}
|
|
38
|
+
#l = (e) => {
|
|
39
|
+
let t = this.#o;
|
|
40
|
+
if (!t || e.currentTarget !== t || this.#t.shouldIgnore?.(e)) return;
|
|
41
|
+
this.#t.prepare?.();
|
|
42
|
+
let n = this.#t.getCapabilities();
|
|
43
|
+
e instanceof WheelEvent ? this.#u(e, n) : e.type === "contextmenu" ? n.pan && e.preventDefault() : e instanceof PointerEvent && this.#d(e, n);
|
|
44
|
+
};
|
|
45
|
+
#u(e, t) {
|
|
46
|
+
let n = this.#o;
|
|
47
|
+
!t.wheel || !n || (this.#w({
|
|
48
|
+
deltaPixels: i(e, n),
|
|
49
|
+
event: e,
|
|
50
|
+
kind: "wheel"
|
|
51
|
+
}), e.preventDefault());
|
|
52
|
+
}
|
|
53
|
+
#d(e, t) {
|
|
54
|
+
switch (e.type) {
|
|
55
|
+
case "auxclick":
|
|
56
|
+
case "click":
|
|
57
|
+
this.#f(e, t);
|
|
58
|
+
break;
|
|
59
|
+
case "lostpointercapture":
|
|
60
|
+
this.#r.delete(e.pointerId), this.#n.delete(e.pointerId), this.#a?.pointerIds.includes(e.pointerId) && (this.#a = void 0), this.#T({
|
|
61
|
+
event: e,
|
|
62
|
+
kind: "lostpointercapture"
|
|
63
|
+
});
|
|
64
|
+
break;
|
|
65
|
+
case "pointercancel":
|
|
66
|
+
this.#r.delete(e.pointerId), this.#n.delete(e.pointerId), this.#a = void 0, this.#T({
|
|
67
|
+
event: e,
|
|
68
|
+
kind: "pointercancel"
|
|
69
|
+
});
|
|
70
|
+
break;
|
|
71
|
+
case "pointerdown":
|
|
72
|
+
this.#p(e, t);
|
|
73
|
+
break;
|
|
74
|
+
case "pointermove":
|
|
75
|
+
this.#h(e, t);
|
|
76
|
+
break;
|
|
77
|
+
case "pointerup":
|
|
78
|
+
this.#m(e);
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
#f(e, t) {
|
|
83
|
+
e.button === 2 && t.pan ? r(e) : e.type === "click" && this.#T({
|
|
84
|
+
event: e,
|
|
85
|
+
kind: "click"
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
#p(e, t) {
|
|
89
|
+
let i = t.pinch && this.#t.createPinchContext !== void 0;
|
|
90
|
+
if (this.#r.set(e.pointerId, {
|
|
91
|
+
x: e.clientX,
|
|
92
|
+
y: e.clientY
|
|
93
|
+
}), e.button === 2 && t.pan && this.#n.add(e.pointerId), n(t, i) && this.#C(e.pointerId), this.#n.has(e.pointerId)) {
|
|
94
|
+
r(e);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
i && this.#b(), this.#T({
|
|
98
|
+
event: e,
|
|
99
|
+
kind: "pointerdown"
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
#m(e) {
|
|
103
|
+
this.#r.delete(e.pointerId);
|
|
104
|
+
let t = this.#n.delete(e.pointerId);
|
|
105
|
+
this.#a?.pointerIds.includes(e.pointerId) && (this.#a = void 0), t ? r(e) : this.#T({
|
|
106
|
+
event: e,
|
|
107
|
+
kind: "pointerup"
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
#h(e, t) {
|
|
111
|
+
if (e.buttons === 0) {
|
|
112
|
+
this.#g(e);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
let r = t.pinch && this.#t.createPinchContext !== void 0, i = this.#v(e);
|
|
116
|
+
if (!i || !n(t, r)) return this.#T({
|
|
117
|
+
event: e,
|
|
118
|
+
kind: "pointermove"
|
|
119
|
+
});
|
|
120
|
+
if (!this.#_(e, i, t) && !(this.#r.size >= 2 && r && this.#y(e))) {
|
|
121
|
+
if (!t.drag) return this.#T({
|
|
122
|
+
event: e,
|
|
123
|
+
kind: "pointermove"
|
|
124
|
+
});
|
|
125
|
+
this.#C(e.pointerId), e.preventDefault(), this.#w({
|
|
126
|
+
event: e,
|
|
127
|
+
kind: "drag",
|
|
128
|
+
movementX: i.x,
|
|
129
|
+
movementY: i.y
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
#g(e) {
|
|
134
|
+
this.#r.delete(e.pointerId), this.#n.delete(e.pointerId), this.#a = void 0, this.#T({
|
|
135
|
+
event: e,
|
|
136
|
+
kind: "pointermove"
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
#_(e, t, n) {
|
|
140
|
+
return !n.pan || !this.#n.has(e.pointerId) ? !1 : (this.#C(e.pointerId), e.preventDefault(), this.#w({
|
|
141
|
+
event: e,
|
|
142
|
+
kind: "pan",
|
|
143
|
+
movementX: t.x,
|
|
144
|
+
movementY: t.y
|
|
145
|
+
}), !0);
|
|
146
|
+
}
|
|
147
|
+
#v(e) {
|
|
148
|
+
let t = this.#r.get(e.pointerId);
|
|
149
|
+
if (!t) return;
|
|
150
|
+
this.#r.set(e.pointerId, {
|
|
151
|
+
x: e.clientX,
|
|
152
|
+
y: e.clientY
|
|
153
|
+
});
|
|
154
|
+
let n = {
|
|
155
|
+
x: e.clientX - t.x,
|
|
156
|
+
y: e.clientY - t.y
|
|
157
|
+
};
|
|
158
|
+
return n.x === 0 && n.y === 0 ? void 0 : n;
|
|
159
|
+
}
|
|
160
|
+
#y(e) {
|
|
161
|
+
let t = this.#t.createPinchContext;
|
|
162
|
+
if (!t) return !1;
|
|
163
|
+
if (this.#a && !this.#a.pointerIds.includes(e.pointerId)) return !0;
|
|
164
|
+
let n = this.#a?.pointerIds ?? this.#x();
|
|
165
|
+
if (!n) return !1;
|
|
166
|
+
let r = this.#S(n);
|
|
167
|
+
return r === void 0 || r <= 0 ? !1 : (this.#a ??= {
|
|
168
|
+
context: t(),
|
|
169
|
+
distance: r,
|
|
170
|
+
pointerIds: n
|
|
171
|
+
}, this.#C(e.pointerId), e.preventDefault(), this.#w({
|
|
172
|
+
context: this.#a.context,
|
|
173
|
+
event: e,
|
|
174
|
+
kind: "pinch",
|
|
175
|
+
scale: r / this.#a.distance
|
|
176
|
+
}), !0);
|
|
177
|
+
}
|
|
178
|
+
#b() {
|
|
179
|
+
let e = this.#t.createPinchContext;
|
|
180
|
+
if (this.#r.size !== 2 || !e) return;
|
|
181
|
+
let t = this.#x();
|
|
182
|
+
if (!t) return;
|
|
183
|
+
let n = this.#S(t);
|
|
184
|
+
n !== void 0 && n > 0 && (this.#a = {
|
|
185
|
+
context: e(),
|
|
186
|
+
distance: n,
|
|
187
|
+
pointerIds: t
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
#x() {
|
|
191
|
+
let e = [...this.#r.keys()], t = e[0], n = e[1];
|
|
192
|
+
return t === void 0 || n === void 0 ? void 0 : [t, n];
|
|
193
|
+
}
|
|
194
|
+
#S(e) {
|
|
195
|
+
let t = this.#r.get(e[0]), n = this.#r.get(e[1]);
|
|
196
|
+
return t && n ? Math.hypot(t.x - n.x, t.y - n.y) : void 0;
|
|
197
|
+
}
|
|
198
|
+
#C(e) {
|
|
199
|
+
try {
|
|
200
|
+
this.#o?.setPointerCapture?.(e);
|
|
201
|
+
} catch {}
|
|
202
|
+
}
|
|
203
|
+
#w(e) {
|
|
204
|
+
this.#e.dispatchEvent(new CustomEvent("nve-gesture", {
|
|
205
|
+
bubbles: !1,
|
|
206
|
+
cancelable: !1,
|
|
207
|
+
composed: !1,
|
|
208
|
+
detail: e
|
|
209
|
+
}));
|
|
210
|
+
}
|
|
211
|
+
#T(e) {
|
|
212
|
+
this.#e.dispatchEvent(new CustomEvent("nve-pointer-input", {
|
|
213
|
+
bubbles: !1,
|
|
214
|
+
cancelable: !1,
|
|
215
|
+
composed: !1,
|
|
216
|
+
detail: e
|
|
217
|
+
}));
|
|
218
|
+
}
|
|
219
|
+
#E() {
|
|
220
|
+
this.#r.clear(), this.#n.clear(), this.#a = void 0;
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
function n(e, t) {
|
|
224
|
+
return e.drag || e.pan || t;
|
|
225
|
+
}
|
|
226
|
+
function r(e) {
|
|
227
|
+
e.preventDefault(), e.stopImmediatePropagation();
|
|
228
|
+
}
|
|
229
|
+
function i(e, t) {
|
|
230
|
+
return e.deltaMode === WheelEvent.DOM_DELTA_LINE ? e.deltaY * 16 : e.deltaMode === WheelEvent.DOM_DELTA_PAGE ? e.deltaY * t.getBoundingClientRect().height : e.deltaY;
|
|
231
|
+
}
|
|
232
|
+
//#endregion
|
|
233
|
+
export { t as GestureController };
|
|
234
|
+
|
|
235
|
+
//# sourceMappingURL=gesture.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gesture.controller.js","names":["#host","#options","#panPointerIds","#pointerPositions","#target","#removeTargetListeners","#resetGestureState","#addTargetListeners","#connected","#handleEvent","#handleWheel","#handlePointer","#dispatchGesture","#handleClick","#pinch","#dispatchPointerInput","#handlePointerDown","#handlePointerMove","#handlePointerUp","#capturePointer","#startPinchIfNeeded","#handlePointerButtonsReleased","#updatePointerPosition","#handlePanMove","#handlePinch","#getPinchPointerIds","#getPointerDistance"],"sources":["../../../src/internal/controllers/gesture.controller.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ReactiveController, ReactiveControllerHost } from 'lit';\n\nconst GESTURE_EVENT_TYPES = [\n 'auxclick',\n 'click',\n 'contextmenu',\n 'lostpointercapture',\n 'pointercancel',\n 'pointerdown',\n 'pointermove',\n 'pointerup',\n 'wheel'\n] as const;\n\ninterface Point {\n readonly x: number;\n readonly y: number;\n}\n\nexport interface GestureCapabilities {\n readonly drag: boolean;\n readonly pan: boolean;\n readonly pinch: boolean;\n readonly wheel: boolean;\n}\n\ninterface PointerMovementGesture {\n readonly event: PointerEvent;\n readonly movementX: number;\n readonly movementY: number;\n}\n\nexport type Gesture<TPinchContext> =\n | (PointerMovementGesture & { readonly kind: 'drag' })\n | (PointerMovementGesture & { readonly kind: 'pan' })\n | {\n readonly context: TPinchContext;\n readonly event: PointerEvent;\n readonly kind: 'pinch';\n readonly scale: number;\n }\n | {\n readonly deltaPixels: number;\n readonly event: WheelEvent;\n readonly kind: 'wheel';\n };\n\nexport type UnhandledPointerInput =\n | { readonly event: PointerEvent; readonly kind: 'click' }\n | { readonly event: PointerEvent; readonly kind: 'lostpointercapture' }\n | { readonly event: PointerEvent; readonly kind: 'pointercancel' }\n | { readonly event: PointerEvent; readonly kind: 'pointerdown' }\n | { readonly event: PointerEvent; readonly kind: 'pointermove' }\n | { readonly event: PointerEvent; readonly kind: 'pointerup' };\n\nexport interface GestureControllerOptions<TPinchContext = undefined> {\n /** Creates a snapshot of caller state when a pinch begins. Omit this field to disable pinch recognition. */\n readonly createPinchContext?: () => TPinchContext;\n /** Returns the gesture kinds that the controller can recognize for the current input event. */\n readonly getCapabilities: () => GestureCapabilities;\n /** Updates caller state before the controller reads capabilities for a nonignored input event. */\n readonly prepare?: () => void;\n /** Returns whether the controller should skip an input event before preparing or recognizing it. */\n readonly shouldIgnore?: (event: Event) => boolean;\n}\n\ninterface PinchState<TPinchContext> {\n readonly context: TPinchContext;\n readonly distance: number;\n readonly pointerIds: readonly [number, number];\n}\n\ntype GestureHost = EventTarget & ReactiveControllerHost;\n\n/** Recognizes drag, pan, pinch, and wheel input on a dynamically assigned target. */\nexport class GestureController<TPinchContext = undefined> implements ReactiveController {\n readonly #host: GestureHost;\n readonly #options: GestureControllerOptions<TPinchContext>;\n readonly #panPointerIds = new Set<number>();\n readonly #pointerPositions = new Map<number, Point>();\n #connected = false;\n #pinch?: PinchState<TPinchContext>;\n #target?: HTMLElement;\n\n constructor(host: GestureHost, options: GestureControllerOptions<TPinchContext>) {\n this.#host = host;\n this.#options = options;\n host.addController(this);\n }\n\n set target(target: HTMLElement | undefined) {\n if (target === this.#target) return;\n this.#removeTargetListeners();\n this.#resetGestureState();\n this.#target = target;\n this.#addTargetListeners();\n }\n\n hostConnected(): void {\n this.#connected = true;\n this.#addTargetListeners();\n }\n\n hostDisconnected(): void {\n this.#removeTargetListeners();\n this.#resetGestureState();\n this.#connected = false;\n }\n\n #addTargetListeners(): void {\n if (!this.#connected || !this.#target) return;\n for (const type of GESTURE_EVENT_TYPES) this.#target.addEventListener(type, this.#handleEvent, true);\n }\n\n #removeTargetListeners(): void {\n if (!this.#connected || !this.#target) return;\n for (const type of GESTURE_EVENT_TYPES) this.#target.removeEventListener(type, this.#handleEvent, true);\n }\n\n #handleEvent = (event: Event): void => {\n const target = this.#target;\n if (!target || event.currentTarget !== target || this.#options.shouldIgnore?.(event)) return;\n this.#options.prepare?.();\n const capabilities = this.#options.getCapabilities();\n if (event instanceof WheelEvent) {\n this.#handleWheel(event, capabilities);\n } else if (event.type === 'contextmenu') {\n if (capabilities.pan) event.preventDefault();\n } else if (event instanceof PointerEvent) {\n this.#handlePointer(event, capabilities);\n }\n };\n\n #handleWheel(event: WheelEvent, capabilities: GestureCapabilities): void {\n const target = this.#target;\n if (!capabilities.wheel || !target) return;\n this.#dispatchGesture({\n deltaPixels: normalizeWheelDelta(event, target),\n event,\n kind: 'wheel'\n });\n event.preventDefault();\n }\n\n #handlePointer(event: PointerEvent, capabilities: GestureCapabilities): void {\n switch (event.type) {\n case 'auxclick':\n case 'click':\n this.#handleClick(event, capabilities);\n break;\n case 'lostpointercapture':\n this.#pointerPositions.delete(event.pointerId);\n this.#panPointerIds.delete(event.pointerId);\n if (this.#pinch?.pointerIds.includes(event.pointerId)) this.#pinch = undefined;\n this.#dispatchPointerInput({ event, kind: 'lostpointercapture' });\n break;\n case 'pointercancel':\n this.#pointerPositions.delete(event.pointerId);\n this.#panPointerIds.delete(event.pointerId);\n this.#pinch = undefined;\n this.#dispatchPointerInput({ event, kind: 'pointercancel' });\n break;\n case 'pointerdown':\n this.#handlePointerDown(event, capabilities);\n break;\n case 'pointermove':\n this.#handlePointerMove(event, capabilities);\n break;\n case 'pointerup':\n this.#handlePointerUp(event);\n break;\n }\n }\n\n #handleClick(event: PointerEvent, capabilities: GestureCapabilities): void {\n if (event.button === 2 && capabilities.pan) {\n consumePanBoundaryEvent(event);\n } else if (event.type === 'click') {\n this.#dispatchPointerInput({ event, kind: 'click' });\n }\n }\n\n #handlePointerDown(event: PointerEvent, capabilities: GestureCapabilities): void {\n const canPinch = capabilities.pinch && this.#options.createPinchContext !== undefined;\n this.#pointerPositions.set(event.pointerId, { x: event.clientX, y: event.clientY });\n if (event.button === 2 && capabilities.pan) this.#panPointerIds.add(event.pointerId);\n if (hasPointerCapability(capabilities, canPinch)) this.#capturePointer(event.pointerId);\n if (this.#panPointerIds.has(event.pointerId)) {\n consumePanBoundaryEvent(event);\n return;\n }\n if (canPinch) this.#startPinchIfNeeded();\n this.#dispatchPointerInput({ event, kind: 'pointerdown' });\n }\n\n #handlePointerUp(event: PointerEvent): void {\n this.#pointerPositions.delete(event.pointerId);\n const wasPanPointer = this.#panPointerIds.delete(event.pointerId);\n if (this.#pinch?.pointerIds.includes(event.pointerId)) this.#pinch = undefined;\n if (wasPanPointer) {\n consumePanBoundaryEvent(event);\n } else {\n this.#dispatchPointerInput({ event, kind: 'pointerup' });\n }\n }\n\n #handlePointerMove(event: PointerEvent, capabilities: GestureCapabilities): void {\n if (event.buttons === 0) {\n this.#handlePointerButtonsReleased(event);\n return;\n }\n const canPinch = capabilities.pinch && this.#options.createPinchContext !== undefined;\n const movement = this.#updatePointerPosition(event);\n if (!movement || !hasPointerCapability(capabilities, canPinch)) {\n return this.#dispatchPointerInput({ event, kind: 'pointermove' });\n }\n if (this.#handlePanMove(event, movement, capabilities)) return;\n if (this.#pointerPositions.size >= 2 && canPinch && this.#handlePinch(event)) return;\n if (!capabilities.drag) return this.#dispatchPointerInput({ event, kind: 'pointermove' });\n this.#capturePointer(event.pointerId);\n event.preventDefault();\n this.#dispatchGesture({ event, kind: 'drag', movementX: movement.x, movementY: movement.y });\n }\n\n #handlePointerButtonsReleased(event: PointerEvent): void {\n this.#pointerPositions.delete(event.pointerId);\n this.#panPointerIds.delete(event.pointerId);\n this.#pinch = undefined;\n this.#dispatchPointerInput({ event, kind: 'pointermove' });\n }\n\n #handlePanMove(event: PointerEvent, movement: Point, capabilities: GestureCapabilities): boolean {\n if (!capabilities.pan || !this.#panPointerIds.has(event.pointerId)) return false;\n this.#capturePointer(event.pointerId);\n event.preventDefault();\n this.#dispatchGesture({ event, kind: 'pan', movementX: movement.x, movementY: movement.y });\n return true;\n }\n\n #updatePointerPosition(event: PointerEvent): Point | undefined {\n const previous = this.#pointerPositions.get(event.pointerId);\n if (!previous) return undefined;\n this.#pointerPositions.set(event.pointerId, { x: event.clientX, y: event.clientY });\n const movement = { x: event.clientX - previous.x, y: event.clientY - previous.y };\n return movement.x === 0 && movement.y === 0 ? undefined : movement;\n }\n\n #handlePinch(event: PointerEvent): boolean {\n const createPinchContext = this.#options.createPinchContext;\n if (!createPinchContext) return false;\n if (this.#pinch && !this.#pinch.pointerIds.includes(event.pointerId)) return true;\n const pointerIds = this.#pinch?.pointerIds ?? this.#getPinchPointerIds();\n if (!pointerIds) return false;\n const distance = this.#getPointerDistance(pointerIds);\n if (distance === undefined || distance <= 0) return false;\n this.#pinch ??= { context: createPinchContext(), distance, pointerIds };\n this.#capturePointer(event.pointerId);\n event.preventDefault();\n this.#dispatchGesture({\n context: this.#pinch.context,\n event,\n kind: 'pinch',\n scale: distance / this.#pinch.distance\n });\n return true;\n }\n\n #startPinchIfNeeded(): void {\n const createPinchContext = this.#options.createPinchContext;\n if (this.#pointerPositions.size !== 2 || !createPinchContext) return;\n const pointerIds = this.#getPinchPointerIds();\n if (!pointerIds) return;\n const distance = this.#getPointerDistance(pointerIds);\n if (distance !== undefined && distance > 0) {\n this.#pinch = { context: createPinchContext(), distance, pointerIds };\n }\n }\n\n #getPinchPointerIds(): [number, number] | undefined {\n const pointerIds = [...this.#pointerPositions.keys()];\n const first = pointerIds[0];\n const second = pointerIds[1];\n return first === undefined || second === undefined ? undefined : [first, second];\n }\n\n #getPointerDistance(pointerIds: readonly [number, number]): number | undefined {\n const first = this.#pointerPositions.get(pointerIds[0]);\n const second = this.#pointerPositions.get(pointerIds[1]);\n return first && second ? Math.hypot(first.x - second.x, first.y - second.y) : undefined;\n }\n\n #capturePointer(pointerId: number): void {\n try {\n this.#target?.setPointerCapture?.(pointerId);\n } catch {\n // Synthetic test events and browser implementations may not have an active pointer to capture.\n }\n }\n\n #dispatchGesture(gesture: Gesture<TPinchContext>): void {\n this.#host.dispatchEvent(\n new CustomEvent<Gesture<TPinchContext>>('nve-gesture', {\n bubbles: false,\n cancelable: false,\n composed: false,\n detail: gesture\n })\n );\n }\n\n #dispatchPointerInput(input: UnhandledPointerInput): void {\n this.#host.dispatchEvent(\n new CustomEvent<UnhandledPointerInput>('nve-pointer-input', {\n bubbles: false,\n cancelable: false,\n composed: false,\n detail: input\n })\n );\n }\n\n #resetGestureState(): void {\n this.#pointerPositions.clear();\n this.#panPointerIds.clear();\n this.#pinch = undefined;\n }\n}\n\nfunction hasPointerCapability(capabilities: GestureCapabilities, canPinch: boolean): boolean {\n return capabilities.drag || capabilities.pan || canPinch;\n}\n\nfunction consumePanBoundaryEvent(event: Event): void {\n event.preventDefault();\n event.stopImmediatePropagation();\n}\n\nfunction normalizeWheelDelta(event: WheelEvent, target: HTMLElement): number {\n if (event.deltaMode === WheelEvent.DOM_DELTA_LINE) return event.deltaY * 16;\n if (event.deltaMode === WheelEvent.DOM_DELTA_PAGE) return event.deltaY * target.getBoundingClientRect().height;\n return event.deltaY;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ReactiveController, ReactiveControllerHost } from 'lit';
|
|
2
|
+
type SpatialKeyHost = ReactiveControllerHost & HTMLElement;
|
|
3
|
+
export type SpatialKeyHandling = 'handled' | 'ignored';
|
|
4
|
+
export type SpatialKeyCommand = {
|
|
5
|
+
readonly ctrlKey: boolean;
|
|
6
|
+
readonly event: KeyboardEvent;
|
|
7
|
+
readonly kind: 'direction';
|
|
8
|
+
readonly horizontal: -1 | 0 | 1;
|
|
9
|
+
readonly key: 'ArrowDown' | 'ArrowLeft' | 'ArrowRight' | 'ArrowUp';
|
|
10
|
+
readonly shiftKey: boolean;
|
|
11
|
+
readonly vertical: -1 | 0 | 1;
|
|
12
|
+
} | {
|
|
13
|
+
readonly event: KeyboardEvent;
|
|
14
|
+
readonly kind: 'zoom';
|
|
15
|
+
readonly key: '+' | '-' | '=';
|
|
16
|
+
};
|
|
17
|
+
/** Converts direct-host keyboard input into spatial direction and zoom commands. */
|
|
18
|
+
export declare class KeyNavigationSpatialController implements ReactiveController {
|
|
19
|
+
#private;
|
|
20
|
+
constructor(host: SpatialKeyHost);
|
|
21
|
+
hostConnected(): void;
|
|
22
|
+
hostDisconnected(): void;
|
|
23
|
+
}
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
//#region src/internal/controllers/keynav-spatial.controller.ts
|
|
2
|
+
var e = class {
|
|
3
|
+
#e;
|
|
4
|
+
constructor(e) {
|
|
5
|
+
this.#e = e, e.addController(this);
|
|
6
|
+
}
|
|
7
|
+
hostConnected() {
|
|
8
|
+
this.#e.addEventListener("keydown", this.#t);
|
|
9
|
+
}
|
|
10
|
+
hostDisconnected() {
|
|
11
|
+
this.#e.removeEventListener("keydown", this.#t);
|
|
12
|
+
}
|
|
13
|
+
#t = (e) => {
|
|
14
|
+
if (e.composedPath()[0] !== this.#e) return;
|
|
15
|
+
let n = t(e);
|
|
16
|
+
n && this.#e.dispatchEvent(new CustomEvent("nve-key", {
|
|
17
|
+
bubbles: !1,
|
|
18
|
+
cancelable: !1,
|
|
19
|
+
composed: !1,
|
|
20
|
+
detail: n
|
|
21
|
+
}));
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
function t(e) {
|
|
25
|
+
switch (e.key) {
|
|
26
|
+
case "ArrowDown": return {
|
|
27
|
+
ctrlKey: e.ctrlKey,
|
|
28
|
+
event: e,
|
|
29
|
+
horizontal: 0,
|
|
30
|
+
key: e.key,
|
|
31
|
+
kind: "direction",
|
|
32
|
+
shiftKey: e.shiftKey,
|
|
33
|
+
vertical: -1
|
|
34
|
+
};
|
|
35
|
+
case "ArrowLeft": return {
|
|
36
|
+
ctrlKey: e.ctrlKey,
|
|
37
|
+
event: e,
|
|
38
|
+
horizontal: -1,
|
|
39
|
+
key: e.key,
|
|
40
|
+
kind: "direction",
|
|
41
|
+
shiftKey: e.shiftKey,
|
|
42
|
+
vertical: 0
|
|
43
|
+
};
|
|
44
|
+
case "ArrowRight": return {
|
|
45
|
+
ctrlKey: e.ctrlKey,
|
|
46
|
+
event: e,
|
|
47
|
+
horizontal: 1,
|
|
48
|
+
key: e.key,
|
|
49
|
+
kind: "direction",
|
|
50
|
+
shiftKey: e.shiftKey,
|
|
51
|
+
vertical: 0
|
|
52
|
+
};
|
|
53
|
+
case "ArrowUp": return {
|
|
54
|
+
ctrlKey: e.ctrlKey,
|
|
55
|
+
event: e,
|
|
56
|
+
horizontal: 0,
|
|
57
|
+
key: e.key,
|
|
58
|
+
kind: "direction",
|
|
59
|
+
shiftKey: e.shiftKey,
|
|
60
|
+
vertical: 1
|
|
61
|
+
};
|
|
62
|
+
case "+":
|
|
63
|
+
case "-":
|
|
64
|
+
case "=": return {
|
|
65
|
+
event: e,
|
|
66
|
+
key: e.key,
|
|
67
|
+
kind: "zoom"
|
|
68
|
+
};
|
|
69
|
+
default: return;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//#endregion
|
|
73
|
+
export { e as KeyNavigationSpatialController };
|
|
74
|
+
|
|
75
|
+
//# sourceMappingURL=keynav-spatial.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keynav-spatial.controller.js","names":["#host","#handleKeydown"],"sources":["../../../src/internal/controllers/keynav-spatial.controller.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ReactiveController, ReactiveControllerHost } from 'lit';\n\ntype SpatialKeyHost = ReactiveControllerHost & HTMLElement;\n\nexport type SpatialKeyHandling = 'handled' | 'ignored';\n\nexport type SpatialKeyCommand =\n | {\n readonly ctrlKey: boolean;\n readonly event: KeyboardEvent;\n readonly kind: 'direction';\n readonly horizontal: -1 | 0 | 1;\n readonly key: 'ArrowDown' | 'ArrowLeft' | 'ArrowRight' | 'ArrowUp';\n readonly shiftKey: boolean;\n readonly vertical: -1 | 0 | 1;\n }\n | {\n readonly event: KeyboardEvent;\n readonly kind: 'zoom';\n readonly key: '+' | '-' | '=';\n };\n\n/** Converts direct-host keyboard input into spatial direction and zoom commands. */\nexport class KeyNavigationSpatialController implements ReactiveController {\n readonly #host: SpatialKeyHost;\n\n constructor(host: SpatialKeyHost) {\n this.#host = host;\n host.addController(this);\n }\n\n hostConnected(): void {\n this.#host.addEventListener('keydown', this.#handleKeydown);\n }\n\n hostDisconnected(): void {\n this.#host.removeEventListener('keydown', this.#handleKeydown);\n }\n\n #handleKeydown = (event: KeyboardEvent): void => {\n if (event.composedPath()[0] !== this.#host) return;\n const command = getSpatialKeyCommand(event);\n if (!command) return;\n this.#host.dispatchEvent(\n new CustomEvent<SpatialKeyCommand>('nve-key', {\n bubbles: false,\n cancelable: false,\n composed: false,\n detail: command\n })\n );\n };\n}\n\nfunction getSpatialKeyCommand(event: KeyboardEvent): SpatialKeyCommand | undefined {\n switch (event.key) {\n case 'ArrowDown':\n return {\n ctrlKey: event.ctrlKey,\n event,\n horizontal: 0,\n key: event.key,\n kind: 'direction',\n shiftKey: event.shiftKey,\n vertical: -1\n };\n case 'ArrowLeft':\n return {\n ctrlKey: event.ctrlKey,\n event,\n horizontal: -1,\n key: event.key,\n kind: 'direction',\n shiftKey: event.shiftKey,\n vertical: 0\n };\n case 'ArrowRight':\n return {\n ctrlKey: event.ctrlKey,\n event,\n horizontal: 1,\n key: event.key,\n kind: 'direction',\n shiftKey: event.shiftKey,\n vertical: 0\n };\n case 'ArrowUp':\n return {\n ctrlKey: event.ctrlKey,\n event,\n horizontal: 0,\n key: event.key,\n kind: 'direction',\n shiftKey: event.shiftKey,\n vertical: 1\n };\n case '+':\n case '-':\n case '=':\n return { event, key: event.key, kind: 'zoom' };\n default:\n return undefined;\n }\n}\n"],"mappings":";AA0BA,IAAa,IAAb,MAA0E;CACxE;CAEA,YAAY,GAAsB;EAEhC,AADA,KAAKA,KAAQ,GACb,EAAK,cAAc,IAAI;CACzB;CAEA,gBAAsB;EACpB,KAAKA,GAAM,iBAAiB,WAAW,KAAKC,EAAc;CAC5D;CAEA,mBAAyB;EACvB,KAAKD,GAAM,oBAAoB,WAAW,KAAKC,EAAc;CAC/D;CAEA,MAAkB,MAA+B;EAC/C,IAAI,EAAM,aAAa,CAAC,CAAC,OAAO,KAAKD,IAAO;EAC5C,IAAM,IAAU,EAAqB,CAAK;EACrC,KACL,KAAKA,GAAM,cACT,IAAI,YAA+B,WAAW;GAC5C,SAAS;GACT,YAAY;GACZ,UAAU;GACV,QAAQ;EACV,CAAC,CACH;CACF;AACF;AAEA,SAAS,EAAqB,GAAqD;CACjF,QAAQ,EAAM,KAAd;EACE,KAAK,aACH,OAAO;GACL,SAAS,EAAM;GACf;GACA,YAAY;GACZ,KAAK,EAAM;GACX,MAAM;GACN,UAAU,EAAM;GAChB,UAAU;EACZ;EACF,KAAK,aACH,OAAO;GACL,SAAS,EAAM;GACf;GACA,YAAY;GACZ,KAAK,EAAM;GACX,MAAM;GACN,UAAU,EAAM;GAChB,UAAU;EACZ;EACF,KAAK,cACH,OAAO;GACL,SAAS,EAAM;GACf;GACA,YAAY;GACZ,KAAK,EAAM;GACX,MAAM;GACN,UAAU,EAAM;GAChB,UAAU;EACZ;EACF,KAAK,WACH,OAAO;GACL,SAAS,EAAM;GACf;GACA,YAAY;GACZ,KAAK,EAAM;GACX,MAAM;GACN,UAAU,EAAM;GAChB,UAAU;EACZ;EACF,KAAK;EACL,KAAK;EACL,KAAK,KACH,OAAO;GAAE;GAAO,KAAK,EAAM;GAAK,MAAM;EAAO;EAC/C,SACE;CACJ;AACF"}
|
package/dist/internal/index.d.ts
CHANGED
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
* @internal private common utilities for Elements
|
|
3
3
|
*/
|
|
4
4
|
export * from './controllers/audit.controller.js';
|
|
5
|
+
export * from './controllers/gesture.controller.js';
|
|
5
6
|
export * from './controllers/i18n.controller.js';
|
|
6
7
|
export * from './controllers/keynav-grid.controller.js';
|
|
7
8
|
export * from './controllers/keynav-list.controller.js';
|
|
9
|
+
export * from './controllers/keynav-spatial.controller.js';
|
|
8
10
|
export * from './controllers/state-expanded.controller.js';
|
|
9
11
|
export * from './controllers/state-highlighted.controller.js';
|
|
10
12
|
export * from './controllers/state-scroll.controller.js';
|
|
@@ -15,7 +17,6 @@ export * from './controllers/type-expandable.controller.js';
|
|
|
15
17
|
export * from './controllers/type-selectable.controller.js';
|
|
16
18
|
export * from './controllers/type-native-popover.controller.js';
|
|
17
19
|
export * from './controllers/type-ssr.controller.js';
|
|
18
|
-
export * from './controllers/type-touch.controller.js';
|
|
19
20
|
export * from './decorators/host-attr.js';
|
|
20
21
|
export * from './decorators/scoped-registry.js';
|
|
21
22
|
export * from './styles/index.js';
|
package/dist/internal/index.js
CHANGED
|
@@ -3,32 +3,33 @@ import { deepMerge as r, formatStandardNumber as i, getDifference as a, isObject
|
|
|
3
3
|
import { GlobalState as l, GlobalStateService as u } from "./services/global.service.js";
|
|
4
4
|
import { auditParentElement as d, auditSlots as f } from "./utils/audit.js";
|
|
5
5
|
import { AuditController as p, audit as m, excessiveInstanceLimit as h } from "./controllers/audit.controller.js";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
31
|
-
import {
|
|
32
|
-
import {
|
|
33
|
-
import {
|
|
34
|
-
|
|
6
|
+
import { GestureController as g } from "./controllers/gesture.controller.js";
|
|
7
|
+
import { I18nService as _, I18nService_ as v } from "./services/i18n.service.js";
|
|
8
|
+
import { I18nController as y, i18n as b } from "./controllers/i18n.controller.js";
|
|
9
|
+
import { debounce as x, onChildListMutation as S, stopEvent as C, throttle as w } from "./utils/events.js";
|
|
10
|
+
import { LogService as T } from "./services/log.service.js";
|
|
11
|
+
import { focusElement as E, focusElementTimeout as D, getActiveElement as O, initializeKeyListItems as k, isFocusable as A, isSimpleFocusable as j, onListboxActivate as M, setActiveKeyListItem as N } from "./utils/focus.js";
|
|
12
|
+
import { KeynavCode as P, appendAnchorName as F, appendRootNodeStyle as I, applySlotContentStates as L, clickOutsideElementBounds as R, createGhostElement as z, define as B, defineElement as V, endOfScrollBox as H, generateId as U, getAnchorNames as W, getAttributeChanges as G, getAttributeListChanges as K, getChildren as q, getDisplayValue as J, getElementUpdate as Y, getFlattenedDOMTree as X, getFlattenedFocusableItems as Z, getPropertyChanges as Q, getThemeTokens as $, hasHorizontalScrollBar as ee, hasInvalidDOMGrid as te, hasScrollBar as ne, isContextMenuClick as re, matchesElementName as ie, openEyeDropper as ae, parseTokenNumber as oe, removeAnchorName as se, removeEmptySlotWhitespace as ce, removeEmptyTextNode as le, sameOrderedStringArray as ue, sameRenderRoot as de, scrollBarWidth as fe, slotContainsOnlyWhitespace as pe, styleSheetToString as me, supportsScopedRegistry as he, uniqueNonEmptyStrings as ge, validKeyNavigationCode as _e } from "./utils/dom.js";
|
|
13
|
+
import { KeyNavigationGridController as ve, getNextKeyGridItem as ye, keyNavigationGrid as be } from "./controllers/keynav-grid.controller.js";
|
|
14
|
+
import { KeyNavigationListController as xe, getNextKeyListItem as Se, keyNavigationList as Ce } from "./controllers/keynav-list.controller.js";
|
|
15
|
+
import { KeyNavigationSpatialController as we } from "./controllers/keynav-spatial.controller.js";
|
|
16
|
+
import { associateAriaDescribedBy as Te, associateAriaLabel as Ee, associateControlGroup as De, associateDataList as Oe, associateLabel as ke, attachInternals as Ae } from "./utils/a11y.js";
|
|
17
|
+
import { StateExpandedController as je, stateExpanded as Me } from "./controllers/state-expanded.controller.js";
|
|
18
|
+
import { StateHighlightedController as Ne, stateHighlighted as Pe } from "./controllers/state-highlighted.controller.js";
|
|
19
|
+
import { StateScrollController as Fe, stateScroll as Ie } from "./controllers/state-scroll.controller.js";
|
|
20
|
+
import { StateSelectedController as Le, stateSelected as Re } from "./controllers/state-selected.controller.js";
|
|
21
|
+
import { TypeAnchorController as ze, typeAnchor as Be } from "./controllers/type-anchor.controller.js";
|
|
22
|
+
import { TypeClosableController as Ve } from "./controllers/type-closable.controller.js";
|
|
23
|
+
import { TypeExpandableController as He } from "./controllers/type-expandable.controller.js";
|
|
24
|
+
import { TypeSelectableController as Ue } from "./controllers/type-selectable.controller.js";
|
|
25
|
+
import { TypeNativePopoverController as We } from "./controllers/type-native-popover.controller.js";
|
|
26
|
+
import { TypeSSRController as Ge, typeSSR as Ke } from "./controllers/type-ssr.controller.js";
|
|
27
|
+
import { hostAttr as qe } from "./decorators/host-attr.js";
|
|
28
|
+
import { scopedRegistry as Je } from "./decorators/scoped-registry.js";
|
|
29
|
+
import { colorStateStyles as Ye, statusStateStyles as Xe, supportStateStyles as Ze, useStyles as Qe } from "./styles/index.js";
|
|
30
|
+
import { supportsCSSLegacyInsetArea as $e, supportsCSSPositionArea as et, supportsNativeCSSAnchorPosition as tt } from "./utils/supports.js";
|
|
31
|
+
import { popoverStyles as nt } from "./styles/popover2.js";
|
|
32
|
+
import { TransitionService as rt } from "./services/transition.service.js";
|
|
33
|
+
import { statusIcons as it } from "./types/index.js";
|
|
34
|
+
import { createLightDismiss as at, onKeys as ot } from "./utils/keynav.js";
|
|
35
|
+
export { p as AuditController, e as DOCS_URL, g as GestureController, l as GlobalState, u as GlobalStateService, y as I18nController, _ as I18nService, v as I18nService_, ve as KeyNavigationGridController, xe as KeyNavigationListController, we as KeyNavigationSpatialController, P as KeynavCode, T as LogService, je as StateExpandedController, Ne as StateHighlightedController, Fe as StateScrollController, Le as StateSelectedController, rt as TransitionService, ze as TypeAnchorController, Ve as TypeClosableController, He as TypeExpandableController, We as TypeNativePopoverController, Ge as TypeSSRController, Ue as TypeSelectableController, F as appendAnchorName, I as appendRootNodeStyle, L as applySlotContentStates, Te as associateAriaDescribedBy, Ee as associateAriaLabel, De as associateControlGroup, Oe as associateDataList, ke as associateLabel, Ae as attachInternals, m as audit, d as auditParentElement, f as auditSlots, R as clickOutsideElementBounds, Ye as colorStateStyles, z as createGhostElement, at as createLightDismiss, x as debounce, r as deepMerge, B as define, V as defineElement, H as endOfScrollBox, h as excessiveInstanceLimit, E as focusElement, D as focusElementTimeout, t as formatFileSize, i as formatStandardNumber, U as generateId, O as getActiveElement, W as getAnchorNames, G as getAttributeChanges, K as getAttributeListChanges, q as getChildren, a as getDifference, J as getDisplayValue, Y as getElementUpdate, X as getFlattenedDOMTree, Z as getFlattenedFocusableItems, ye as getNextKeyGridItem, Se as getNextKeyListItem, Q as getPropertyChanges, $ as getThemeTokens, ee as hasHorizontalScrollBar, te as hasInvalidDOMGrid, ne as hasScrollBar, qe as hostAttr, b as i18n, k as initializeKeyListItems, re as isContextMenuClick, A as isFocusable, o as isObject, s as isObjectLiteral, j as isSimpleFocusable, be as keyNavigationGrid, Ce as keyNavigationList, ie as matchesElementName, S as onChildListMutation, ot as onKeys, M as onListboxActivate, ae as openEyeDropper, oe as parseTokenNumber, c as parseVersion, nt as popoverStyles, se as removeAnchorName, ce as removeEmptySlotWhitespace, le as removeEmptyTextNode, ue as sameOrderedStringArray, de as sameRenderRoot, Je as scopedRegistry, fe as scrollBarWidth, N as setActiveKeyListItem, n as shiftLeft, pe as slotContainsOnlyWhitespace, Me as stateExpanded, Pe as stateHighlighted, Ie as stateScroll, Re as stateSelected, it as statusIcons, Xe as statusStateStyles, C as stopEvent, me as styleSheetToString, Ze as supportStateStyles, $e as supportsCSSLegacyInsetArea, et as supportsCSSPositionArea, tt as supportsNativeCSSAnchorPosition, he as supportsScopedRegistry, w as throttle, Be as typeAnchor, Ke as typeSSR, ge as uniqueNonEmptyStrings, Qe as useStyles, _e as validKeyNavigationCode };
|
|
@@ -19,7 +19,7 @@ var a = class {
|
|
|
19
19
|
i18nRegistry: {},
|
|
20
20
|
audit: {}
|
|
21
21
|
}
|
|
22
|
-
}, globalThis.NVE_ELEMENTS.state.versions = Array.from(/* @__PURE__ */ new Set([...globalThis.NVE_ELEMENTS.state.versions, "2.
|
|
22
|
+
}, globalThis.NVE_ELEMENTS.state.versions = Array.from(/* @__PURE__ */ new Set([...globalThis.NVE_ELEMENTS.state.versions, "2.7.0"])), globalThis.NVE_ELEMENTS.state.scopedRegistry ??= {}, globalThis.NVE_ELEMENTS.state.scopedRegistry["2.7.0"] = i(), globalThis.NVE_ELEMENTS.state.versions.length > 1 && globalThis.NVE_ELEMENTS.state.env !== "production" && console.warn(e(), `\n\n${JSON.stringify(globalThis.NVE_ELEMENTS.state.versions, null, 2)}`);
|
|
23
23
|
}
|
|
24
24
|
get state() {
|
|
25
25
|
return globalThis.NVE_ELEMENTS.state;
|
package/dist/logo/logo2.js
CHANGED
package/dist/menu/menu-item2.js
CHANGED
package/dist/menu/menu2.js
CHANGED
package/dist/month/month2.js
CHANGED
package/dist/page/page2.js
CHANGED