canvasengine 2.0.0-beta.42 → 2.0.0-beta.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{DebugRenderer-BosXI2Pd.js → DebugRenderer-K2IZBznP.js} +2 -2
- package/dist/{DebugRenderer-BosXI2Pd.js.map → DebugRenderer-K2IZBznP.js.map} +1 -1
- package/dist/components/Button.d.ts +3 -0
- package/dist/components/Button.d.ts.map +1 -1
- package/dist/components/DOMElement.d.ts.map +1 -1
- package/dist/components/Graphic.d.ts +1 -1
- package/dist/components/Graphic.d.ts.map +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/types/DisplayObject.d.ts +12 -16
- package/dist/components/types/DisplayObject.d.ts.map +1 -1
- package/dist/directives/FocusNavigation.d.ts +71 -0
- package/dist/directives/FocusNavigation.d.ts.map +1 -0
- package/dist/directives/KeyboardControls.d.ts.map +1 -1
- package/dist/directives/ViewportFollow.d.ts.map +1 -1
- package/dist/engine/FocusManager.d.ts +174 -0
- package/dist/engine/FocusManager.d.ts.map +1 -0
- package/dist/engine/reactive.d.ts.map +1 -1
- package/dist/hooks/useFocus.d.ts +61 -0
- package/dist/hooks/useFocus.d.ts.map +1 -0
- package/dist/{index-DNwqVzaq.js → index-B4hYyfVE.js} +5469 -4676
- package/dist/index-B4hYyfVE.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.global.js +7 -7
- package/dist/index.global.js.map +1 -1
- package/dist/index.js +66 -60
- package/package.json +2 -2
- package/src/components/Button.ts +7 -4
- package/src/components/Canvas.ts +1 -1
- package/src/components/DOMContainer.ts +27 -2
- package/src/components/DOMElement.ts +37 -29
- package/src/components/DisplayObject.ts +15 -3
- package/src/components/FocusContainer.ts +372 -0
- package/src/components/Graphic.ts +43 -48
- package/src/components/Sprite.ts +4 -2
- package/src/components/Viewport.ts +65 -26
- package/src/components/index.ts +2 -1
- package/src/components/types/DisplayObject.ts +7 -4
- package/src/directives/Controls.ts +1 -1
- package/src/directives/ControlsBase.ts +1 -1
- package/src/directives/FocusNavigation.ts +252 -0
- package/src/directives/KeyboardControls.ts +12 -8
- package/src/directives/ViewportFollow.ts +8 -5
- package/src/engine/FocusManager.ts +495 -0
- package/src/engine/reactive.ts +20 -19
- package/src/hooks/useFocus.ts +94 -0
- package/src/index.ts +2 -0
- package/dist/index-DNwqVzaq.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,83 +1,89 @@
|
|
|
1
|
-
import { h as a } from "./index-
|
|
2
|
-
import { A as r,
|
|
1
|
+
import { h as a } from "./index-B4hYyfVE.js";
|
|
2
|
+
import { A as r, a4 as i, a5 as n, B as l, M as c, H as u, C as p, k as m, a2 as S, a3 as g, au as d, m as C, D as b, at as h, ar as k, N as j, o as E, a7 as T, a as f, G as w, L as D, j as F, I as v, a6 as y, J as O, K as M, U as x, a1 as A, O as P, X as V, as as B, R as G, W as H, S as q, n as I, l as J, Y as N, Q as R, _ as z, $ as K, T as U, P as L, g as Q, Z as W, a0 as X, V as Y, aq as Z, ap as _, an as $, p as aa, ae as sa, ac as ea, af as ta, q as oa, f as ra, aj as ia, ao as na, s as la, t as ca, a8 as ua, ab as pa, v as ma, i as Sa, a9 as ga, w as da, ak as Ca, x as ba, ad as ha, ah as ka, ag as ja, am as Ea, r as Ta, aa as fa, y as wa, ai as Da, al as Fa, z as va, b as ya, e as Oa, c as Ma, d as xa, u as Aa } from "./index-B4hYyfVE.js";
|
|
3
3
|
const e = a.Howler;
|
|
4
4
|
export {
|
|
5
5
|
r as ArraySubject,
|
|
6
|
-
|
|
6
|
+
i as Button,
|
|
7
7
|
n as ButtonState,
|
|
8
8
|
l as Canvas,
|
|
9
9
|
c as Circle,
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
u as Container,
|
|
11
|
+
p as ControlsBase,
|
|
12
12
|
m as ControlsDirective,
|
|
13
|
-
|
|
13
|
+
S as DOMContainer,
|
|
14
14
|
g as DOMElement,
|
|
15
15
|
d as DisplayObject,
|
|
16
16
|
C as Drag,
|
|
17
17
|
b as Drop,
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
h as EVENTS,
|
|
19
|
+
k as Easing,
|
|
20
20
|
j as Ellipse,
|
|
21
|
-
|
|
21
|
+
E as Flash,
|
|
22
|
+
T as FocusContainer,
|
|
23
|
+
f as FocusManager,
|
|
22
24
|
w as GamepadControls,
|
|
23
25
|
D as Graphics,
|
|
24
|
-
|
|
26
|
+
F as Howl,
|
|
25
27
|
e as Howler,
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
28
|
+
v as Input,
|
|
29
|
+
y as Joystick,
|
|
30
|
+
O as JoystickControls,
|
|
31
|
+
M as KeyboardControls,
|
|
32
|
+
x as Mesh,
|
|
33
|
+
A as NineSliceSprite,
|
|
34
|
+
P as ObjectSubject,
|
|
35
|
+
V as ParticlesEmitter,
|
|
34
36
|
B as RadialGradient,
|
|
35
37
|
G as Rect,
|
|
36
38
|
H as Scene,
|
|
37
|
-
|
|
38
|
-
|
|
39
|
+
q as Scheduler,
|
|
40
|
+
I as Shake,
|
|
39
41
|
J as Sound,
|
|
40
42
|
N as Sprite,
|
|
41
43
|
R as Svg,
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
ia as
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
Sa as
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
wa as
|
|
78
|
-
Da as
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
44
|
+
z as Text,
|
|
45
|
+
K as TilingSprite,
|
|
46
|
+
U as Transition,
|
|
47
|
+
L as Triangle,
|
|
48
|
+
Q as Utils,
|
|
49
|
+
W as Video,
|
|
50
|
+
X as Viewport,
|
|
51
|
+
Y as ViewportFollow,
|
|
52
|
+
Z as animatedSequence,
|
|
53
|
+
_ as animatedSignal,
|
|
54
|
+
$ as bootstrapCanvas,
|
|
55
|
+
aa as computed,
|
|
56
|
+
sa as cond,
|
|
57
|
+
ea as createComponent,
|
|
58
|
+
ta as currentSubscriptionsTracker,
|
|
59
|
+
oa as effect,
|
|
60
|
+
ra as focusManager,
|
|
61
|
+
ia as h,
|
|
62
|
+
na as isAnimatedSignal,
|
|
63
|
+
la as isArraySubject,
|
|
64
|
+
ca as isComputed,
|
|
65
|
+
ua as isElement,
|
|
66
|
+
pa as isElementFrozen,
|
|
67
|
+
ma as isObjectSubject,
|
|
68
|
+
Sa as isObservable,
|
|
69
|
+
ga as isPrimitive,
|
|
70
|
+
da as isSignal,
|
|
71
|
+
Ca as isTrigger,
|
|
72
|
+
ba as linkedSignal,
|
|
73
|
+
ha as loop,
|
|
74
|
+
ka as mount,
|
|
75
|
+
ja as mountTracker,
|
|
76
|
+
Ea as on,
|
|
77
|
+
Ta as registerAllComponents,
|
|
78
|
+
fa as registerComponent,
|
|
79
|
+
wa as signal,
|
|
80
|
+
Da as tick,
|
|
81
|
+
Fa as trigger,
|
|
82
|
+
va as untracked,
|
|
83
|
+
ya as useDefineProps,
|
|
84
|
+
Oa as useFocusChange,
|
|
85
|
+
Ma as useFocusIndex,
|
|
86
|
+
xa as useFocusedElement,
|
|
87
|
+
Aa as useProps
|
|
82
88
|
};
|
|
83
89
|
//# sourceMappingURL=index.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "canvasengine",
|
|
3
|
-
"version": "2.0.0-beta.
|
|
3
|
+
"version": "2.0.0-beta.43",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
},
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"@barvynkoa/particle-emitter": "^0.0.1",
|
|
12
|
-
"@pixi/layout": "^3.0
|
|
12
|
+
"@pixi/layout": "^3.2.0",
|
|
13
13
|
"@signe/reactive": "^2.6.0",
|
|
14
14
|
"howler": "^2.2.4",
|
|
15
15
|
"joypad.js": "^2.3.5",
|
package/src/components/Button.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { effect, signal, computed, isSignal } from "@signe/reactive";
|
|
1
|
+
import { effect, signal, computed, isSignal, Signal } from "@signe/reactive";
|
|
2
2
|
import { FederatedPointerEvent } from "pixi.js";
|
|
3
3
|
import { h } from "../engine/signal";
|
|
4
4
|
import { useDefineProps } from "../hooks/useProps";
|
|
@@ -95,6 +95,8 @@ export interface ButtonProps {
|
|
|
95
95
|
background?: Element | any;
|
|
96
96
|
/** Custom children components for button content (takes priority over text if provided) */
|
|
97
97
|
children?: Element[];
|
|
98
|
+
/** Focus index for the button */
|
|
99
|
+
tabindex?: number | Signal<number>;
|
|
98
100
|
}
|
|
99
101
|
|
|
100
102
|
/**
|
|
@@ -270,7 +272,7 @@ export function Button(props: ButtonProps) {
|
|
|
270
272
|
if (!disabled()) {
|
|
271
273
|
isPressed.set(true);
|
|
272
274
|
props.pressDown?.(event);
|
|
273
|
-
|
|
275
|
+
|
|
274
276
|
// Apply control if controls and controlName are provided
|
|
275
277
|
const controls = getControls();
|
|
276
278
|
const name = controlName();
|
|
@@ -283,7 +285,7 @@ export function Button(props: ButtonProps) {
|
|
|
283
285
|
if (!disabled() && isPressed()) {
|
|
284
286
|
isPressed.set(false);
|
|
285
287
|
props.pressUp?.(event);
|
|
286
|
-
|
|
288
|
+
|
|
287
289
|
// Apply control release if controls and controlName are provided
|
|
288
290
|
const controls = getControls();
|
|
289
291
|
const name = controlName();
|
|
@@ -295,7 +297,7 @@ export function Button(props: ButtonProps) {
|
|
|
295
297
|
pointertap: async (event: FederatedPointerEvent) => {
|
|
296
298
|
if (!disabled()) {
|
|
297
299
|
props.click?.(event);
|
|
298
|
-
|
|
300
|
+
|
|
299
301
|
// Apply control if controls and controlName are provided (press and release)
|
|
300
302
|
const controls = getControls();
|
|
301
303
|
const name = controlName();
|
|
@@ -388,6 +390,7 @@ export function Button(props: ButtonProps) {
|
|
|
388
390
|
alpha: props.alpha,
|
|
389
391
|
visible: props.visible,
|
|
390
392
|
cursor: props.cursor || "pointer",
|
|
393
|
+
tabindex: props.tabindex,
|
|
391
394
|
...eventHandlers
|
|
392
395
|
}, [
|
|
393
396
|
getBackgroundElement(),
|
package/src/components/Canvas.ts
CHANGED
|
@@ -24,7 +24,7 @@ interface CanvasElement extends Element<ComponentInstance> {
|
|
|
24
24
|
};
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
registerComponent("Canvas", class Canvas extends DisplayObject(Container) {});
|
|
27
|
+
registerComponent("Canvas", class Canvas extends DisplayObject(Container) { });
|
|
28
28
|
|
|
29
29
|
export interface CanvasProps extends Props {
|
|
30
30
|
cursorStyles?: () => any;
|
|
@@ -109,12 +109,37 @@ export class CanvasDOMContainer extends DisplayObject(PixiDOMContainer) {
|
|
|
109
109
|
disableLayout = true;
|
|
110
110
|
|
|
111
111
|
onInit(props: any) {
|
|
112
|
-
|
|
112
|
+
// Handle internal _scopeClass prop for scoped CSS
|
|
113
|
+
const scopeClass = props._scopeClass;
|
|
114
|
+
let divProps: any = { element: "div" };
|
|
115
|
+
|
|
116
|
+
if (scopeClass) {
|
|
117
|
+
// Merge scope class with existing attrs.class
|
|
118
|
+
divProps.attrs = { ...props.attrs };
|
|
119
|
+
if (divProps.attrs.class) {
|
|
120
|
+
// If class exists, merge it with scope class
|
|
121
|
+
if (typeof divProps.attrs.class === 'string') {
|
|
122
|
+
divProps.attrs.class = `${scopeClass} ${divProps.attrs.class}`;
|
|
123
|
+
} else if (Array.isArray(divProps.attrs.class)) {
|
|
124
|
+
divProps.attrs.class = [scopeClass, ...divProps.attrs.class];
|
|
125
|
+
} else if (typeof divProps.attrs.class === 'object') {
|
|
126
|
+
// For object format, add scope class as true
|
|
127
|
+
divProps.attrs.class = { [scopeClass]: true, ...divProps.attrs.class };
|
|
128
|
+
}
|
|
129
|
+
} else {
|
|
130
|
+
// No existing class, just add scope class
|
|
131
|
+
divProps.attrs.class = scopeClass;
|
|
132
|
+
}
|
|
133
|
+
} else if (props.attrs) {
|
|
134
|
+
divProps.attrs = props.attrs;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const div = h(DOMElement, divProps, props.children) as unknown as Element<CanvasDOMElement>;
|
|
113
138
|
this.element = div.componentInstance.element;
|
|
114
139
|
}
|
|
115
140
|
}
|
|
116
141
|
|
|
117
|
-
export interface CanvasDOMContainer extends DisplayObjectProps {}
|
|
142
|
+
export interface CanvasDOMContainer extends DisplayObjectProps { }
|
|
118
143
|
|
|
119
144
|
registerComponent("DOMContainer", CanvasDOMContainer);
|
|
120
145
|
|
|
@@ -12,22 +12,22 @@ import { isSignal } from "@signe/reactive";
|
|
|
12
12
|
|
|
13
13
|
interface DOMContainerProps extends DisplayObjectProps {
|
|
14
14
|
element:
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
| string
|
|
16
|
+
| {
|
|
17
|
+
value: HTMLElement;
|
|
18
|
+
};
|
|
19
19
|
textContent?: string;
|
|
20
20
|
attrs?: Record<string, any> & {
|
|
21
21
|
class?:
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
22
|
+
| string
|
|
23
|
+
| string[]
|
|
24
|
+
| Record<string, boolean>
|
|
25
|
+
| { items?: string[] }
|
|
26
|
+
| { value?: string | string[] | Record<string, boolean> };
|
|
27
27
|
style?:
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
| string
|
|
29
|
+
| Record<string, string | number>
|
|
30
|
+
| { value?: string | Record<string, string | number> };
|
|
31
31
|
};
|
|
32
32
|
onBeforeDestroy?: OnHook;
|
|
33
33
|
}
|
|
@@ -234,11 +234,11 @@ export class CanvasDOMElement {
|
|
|
234
234
|
// Special handling for form submit events
|
|
235
235
|
if (event === "submit" && this.element.tagName.toLowerCase() === "form") {
|
|
236
236
|
e.preventDefault(); // Stop form submission propagation
|
|
237
|
-
|
|
237
|
+
|
|
238
238
|
// Collect all form data
|
|
239
239
|
const formData = new FormData(this.element as HTMLFormElement);
|
|
240
240
|
const formObject: Record<string, any> = {};
|
|
241
|
-
|
|
241
|
+
|
|
242
242
|
// Convert FormData to plain object
|
|
243
243
|
formData.forEach((value, key) => {
|
|
244
244
|
if (formObject[key]) {
|
|
@@ -252,7 +252,7 @@ export class CanvasDOMElement {
|
|
|
252
252
|
formObject[key] = value;
|
|
253
253
|
}
|
|
254
254
|
});
|
|
255
|
-
|
|
255
|
+
|
|
256
256
|
// Call the event handler with event and form data
|
|
257
257
|
props.attrs[event]?.(e, formObject);
|
|
258
258
|
} else {
|
|
@@ -292,9 +292,9 @@ export class CanvasDOMElement {
|
|
|
292
292
|
// Set initial value from signal
|
|
293
293
|
(
|
|
294
294
|
this.element as
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
295
|
+
| HTMLInputElement
|
|
296
|
+
| HTMLTextAreaElement
|
|
297
|
+
| HTMLSelectElement
|
|
298
298
|
).value = this.valueSignal();
|
|
299
299
|
|
|
300
300
|
// Listen for input events and update the signal
|
|
@@ -314,7 +314,15 @@ export class CanvasDOMElement {
|
|
|
314
314
|
onUpdate(props: DOMContainerProps) {
|
|
315
315
|
if (!this.element) return;
|
|
316
316
|
for (const [key, value] of Object.entries(props.attrs || {})) {
|
|
317
|
-
if (key === "
|
|
317
|
+
if (key === "tabindex") {
|
|
318
|
+
// Handle tabindex attribute
|
|
319
|
+
const tabindexValue = isSignal(value) ? value() : value;
|
|
320
|
+
if (tabindexValue !== undefined && tabindexValue !== null) {
|
|
321
|
+
this.element.setAttribute('tabindex', String(tabindexValue));
|
|
322
|
+
} else {
|
|
323
|
+
this.element.removeAttribute('tabindex');
|
|
324
|
+
}
|
|
325
|
+
} else if (key === "class") {
|
|
318
326
|
const classList = value.items || value.value || value;
|
|
319
327
|
|
|
320
328
|
// Clear existing classes first
|
|
@@ -355,26 +363,26 @@ export class CanvasDOMElement {
|
|
|
355
363
|
// Update the DOM element value if the signal value changed
|
|
356
364
|
const currentValue = (
|
|
357
365
|
this.element as
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
366
|
+
| HTMLInputElement
|
|
367
|
+
| HTMLTextAreaElement
|
|
368
|
+
| HTMLSelectElement
|
|
361
369
|
).value;
|
|
362
370
|
const signalValue = value();
|
|
363
371
|
if (currentValue !== signalValue) {
|
|
364
372
|
(
|
|
365
373
|
this.element as
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
374
|
+
| HTMLInputElement
|
|
375
|
+
| HTMLTextAreaElement
|
|
376
|
+
| HTMLSelectElement
|
|
369
377
|
).value = signalValue;
|
|
370
378
|
}
|
|
371
379
|
} else {
|
|
372
380
|
// If it's not a signal, set the value directly
|
|
373
381
|
(
|
|
374
382
|
this.element as
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
383
|
+
| HTMLInputElement
|
|
384
|
+
| HTMLTextAreaElement
|
|
385
|
+
| HTMLSelectElement
|
|
378
386
|
).value = value;
|
|
379
387
|
}
|
|
380
388
|
} else if (!EVENTS.includes(key)) {
|
|
@@ -412,7 +420,7 @@ export class CanvasDOMElement {
|
|
|
412
420
|
}
|
|
413
421
|
}
|
|
414
422
|
|
|
415
|
-
export interface CanvasDOMElement extends DisplayObjectProps {}
|
|
423
|
+
export interface CanvasDOMElement extends DisplayObjectProps { }
|
|
416
424
|
|
|
417
425
|
registerComponent("DOMElement", CanvasDOMElement);
|
|
418
426
|
|
|
@@ -597,15 +597,27 @@ export function DisplayObject(extendClass) {
|
|
|
597
597
|
|
|
598
598
|
// Object properties
|
|
599
599
|
setObjectFit(objectFit: ObjectFit) {
|
|
600
|
-
|
|
600
|
+
try {
|
|
601
|
+
this.layout = { objectFit };
|
|
602
|
+
} catch (error) {
|
|
603
|
+
// Ignore layout errors in test environments or when yoga-layout is not available
|
|
604
|
+
}
|
|
601
605
|
}
|
|
602
606
|
|
|
603
607
|
setObjectPosition(objectPosition: ObjectPosition) {
|
|
604
|
-
|
|
608
|
+
try {
|
|
609
|
+
this.layout = { objectPosition };
|
|
610
|
+
} catch (error) {
|
|
611
|
+
// Ignore layout errors in test environments or when yoga-layout is not available
|
|
612
|
+
}
|
|
605
613
|
}
|
|
606
614
|
|
|
607
615
|
setTransformOrigin(transformOrigin: TransformOrigin) {
|
|
608
|
-
|
|
616
|
+
try {
|
|
617
|
+
this.layout = { transformOrigin };
|
|
618
|
+
} catch (error) {
|
|
619
|
+
// Ignore layout errors in test environments or when yoga-layout is not available
|
|
620
|
+
}
|
|
609
621
|
}
|
|
610
622
|
};
|
|
611
623
|
}
|