canvasengine 2.0.0-beta.6 → 2.0.0-beta.7
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/index.d.ts +15 -7
- package/dist/index.js +74 -15
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/engine/reactive.ts +100 -23
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as _signe_reactive from '@signe/reactive';
|
|
2
|
-
import { WritableSignal, Signal, WritableArraySignal } from '@signe/reactive';
|
|
2
|
+
import { WritableSignal, Signal, WritableArraySignal, WritableObjectSignal } from '@signe/reactive';
|
|
3
3
|
export * from '@signe/reactive';
|
|
4
4
|
import { Subscription, Subject, Observable } from 'rxjs';
|
|
5
5
|
export { isObservable } from 'rxjs';
|
|
@@ -204,6 +204,12 @@ type ArrayChange<T> = {
|
|
|
204
204
|
index?: number;
|
|
205
205
|
items: T[];
|
|
206
206
|
};
|
|
207
|
+
type ObjectChange<T> = {
|
|
208
|
+
type: "add" | "remove" | "update" | "init" | "reset";
|
|
209
|
+
key?: string;
|
|
210
|
+
value?: T;
|
|
211
|
+
items: T[];
|
|
212
|
+
};
|
|
207
213
|
type NestedSignalObjects = {
|
|
208
214
|
[Key in string]: NestedSignalObjects | Signal<any>;
|
|
209
215
|
};
|
|
@@ -226,10 +232,12 @@ interface Element<T = ComponentInstance> {
|
|
|
226
232
|
destroy: () => void;
|
|
227
233
|
allElements: Subject<void>;
|
|
228
234
|
}
|
|
229
|
-
type
|
|
235
|
+
type FlowResult = {
|
|
230
236
|
elements: Element[];
|
|
231
237
|
prev?: Element;
|
|
232
|
-
|
|
238
|
+
fullElements?: Element[];
|
|
239
|
+
};
|
|
240
|
+
type FlowObservable = Observable<FlowResult>;
|
|
233
241
|
declare const isElement: (value: any) => value is Element;
|
|
234
242
|
declare const isPrimitive: (value: any) => boolean;
|
|
235
243
|
declare function registerComponent(name: any, component: any): void;
|
|
@@ -245,13 +253,13 @@ declare function registerComponent(name: any, component: any): void;
|
|
|
245
253
|
*/
|
|
246
254
|
declare function createComponent(tag: string, props?: Props): Element;
|
|
247
255
|
/**
|
|
248
|
-
* Observes a BehaviorSubject containing an array of items and dynamically creates child elements for each item.
|
|
256
|
+
* Observes a BehaviorSubject containing an array or object of items and dynamically creates child elements for each item.
|
|
249
257
|
*
|
|
250
|
-
* @param {
|
|
258
|
+
* @param {WritableArraySignal<T> | WritableObjectSignal<T>} itemsSubject - A signal that emits an array or object of items.
|
|
251
259
|
* @param {Function} createElementFn - A function that takes an item and returns an element representation.
|
|
252
260
|
* @returns {Observable} An observable that emits the list of created child elements.
|
|
253
261
|
*/
|
|
254
|
-
declare function loop<T
|
|
262
|
+
declare function loop<T>(itemsSubject: WritableArraySignal<T[]> | WritableObjectSignal<T>, createElementFn: (item: T, index: number | string) => Element | null): FlowObservable;
|
|
255
263
|
/**
|
|
256
264
|
* Conditionally creates and destroys elements based on a condition signal.
|
|
257
265
|
*
|
|
@@ -1106,4 +1114,4 @@ declare namespace utils {
|
|
|
1106
1114
|
export { utils_arrayEquals as arrayEquals, utils_calculateDistance as calculateDistance, utils_error as error, utils_fps2ms as fps2ms, utils_get as get, utils_isBrowser as isBrowser, utils_isFunction as isFunction, utils_isObject as isObject, utils_isPromise as isPromise, utils_log as log, utils_preciseNow as preciseNow, utils_set as set, utils_setObservablePoint as setObservablePoint };
|
|
1107
1115
|
}
|
|
1108
1116
|
|
|
1109
|
-
export { type AnimatedSignal, type AnimatedState, type ArrayChange, Canvas, Circle, type ComponentFunction, type ComponentInstance, Container, DisplayObject, EVENTS, Easing, type Element, Ellipse, Graphics, NineSliceSprite, ParticlesEmitter, type Props, RadialGradient, Rect, Scene, Sprite, Text, TilingSprite, Triangle, utils as Utils, Video, Viewport, animatedSignal, bootstrapCanvas, cond, createComponent, currentSubscriptionsTracker, h, isAnimatedSignal, isElement, isPrimitive, isTrigger, loop, mount, mountTracker, on, registerComponent, Svg as svg, tick, trigger, useDefineProps, useProps };
|
|
1117
|
+
export { type AnimatedSignal, type AnimatedState, type ArrayChange, Canvas, Circle, type ComponentFunction, type ComponentInstance, Container, DisplayObject, EVENTS, Easing, type Element, Ellipse, Graphics, NineSliceSprite, type ObjectChange, ParticlesEmitter, type Props, RadialGradient, Rect, Scene, Sprite, Text, TilingSprite, Triangle, utils as Utils, Video, Viewport, animatedSignal, bootstrapCanvas, cond, createComponent, currentSubscriptionsTracker, h, isAnimatedSignal, isElement, isPrimitive, isTrigger, loop, mount, mountTracker, on, registerComponent, Svg as svg, tick, trigger, useDefineProps, useProps };
|
package/dist/index.js
CHANGED
|
@@ -1307,19 +1307,42 @@ function createComponent(tag, props) {
|
|
|
1307
1307
|
}
|
|
1308
1308
|
function loop(itemsSubject, createElementFn) {
|
|
1309
1309
|
let elements = [];
|
|
1310
|
-
const
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1310
|
+
const isArraySignal = "_subject" in itemsSubject && "items" in itemsSubject._subject;
|
|
1311
|
+
const addAt = (items2, insertIndex, keys2) => {
|
|
1312
|
+
return items2.map((item, index) => {
|
|
1313
|
+
const key = keys2 ? keys2[index] : typeof insertIndex === "number" ? insertIndex + index : insertIndex;
|
|
1314
|
+
const element = createElementFn(item, key);
|
|
1315
|
+
if (typeof insertIndex === "number") {
|
|
1316
|
+
elements.splice(insertIndex + index, 0, element);
|
|
1317
|
+
} else {
|
|
1318
|
+
elements.push(element);
|
|
1319
|
+
}
|
|
1314
1320
|
return element;
|
|
1315
1321
|
});
|
|
1316
1322
|
};
|
|
1323
|
+
const getInitialItems = () => {
|
|
1324
|
+
if (isArraySignal) {
|
|
1325
|
+
return {
|
|
1326
|
+
items: itemsSubject._subject.items,
|
|
1327
|
+
keys: void 0
|
|
1328
|
+
};
|
|
1329
|
+
} else {
|
|
1330
|
+
const entries = Object.entries(itemsSubject._subject.value.value);
|
|
1331
|
+
return {
|
|
1332
|
+
items: entries.map(([_, value]) => value),
|
|
1333
|
+
keys: entries.map(([key]) => key)
|
|
1334
|
+
};
|
|
1335
|
+
}
|
|
1336
|
+
};
|
|
1337
|
+
const { items, keys } = getInitialItems();
|
|
1317
1338
|
return defer(() => {
|
|
1318
|
-
let initialItems = [...
|
|
1339
|
+
let initialItems = [...items];
|
|
1340
|
+
let initialKeys = keys ? [...keys] : void 0;
|
|
1319
1341
|
let init = true;
|
|
1320
1342
|
return itemsSubject.observable.pipe(
|
|
1321
1343
|
map((event) => {
|
|
1322
|
-
const { type, items
|
|
1344
|
+
const { type, items: items2 } = event;
|
|
1345
|
+
const index = "index" in event ? event.index : event.key;
|
|
1323
1346
|
if (init) {
|
|
1324
1347
|
if (elements.length > 0) {
|
|
1325
1348
|
return {
|
|
@@ -1327,8 +1350,9 @@ function loop(itemsSubject, createElementFn) {
|
|
|
1327
1350
|
fullElements: elements
|
|
1328
1351
|
};
|
|
1329
1352
|
}
|
|
1330
|
-
const newElements = addAt(initialItems, 0);
|
|
1353
|
+
const newElements = addAt(initialItems, 0, initialKeys);
|
|
1331
1354
|
initialItems = [];
|
|
1355
|
+
initialKeys = void 0;
|
|
1332
1356
|
init = false;
|
|
1333
1357
|
return {
|
|
1334
1358
|
elements: newElements,
|
|
@@ -1341,25 +1365,60 @@ function loop(itemsSubject, createElementFn) {
|
|
|
1341
1365
|
});
|
|
1342
1366
|
elements = [];
|
|
1343
1367
|
}
|
|
1344
|
-
|
|
1368
|
+
if (!isArraySignal) {
|
|
1369
|
+
const entries = Object.entries(itemsSubject._subject.value.value);
|
|
1370
|
+
const newElements2 = addAt(
|
|
1371
|
+
entries.map(([_, value]) => value),
|
|
1372
|
+
0,
|
|
1373
|
+
entries.map(([key]) => key)
|
|
1374
|
+
);
|
|
1375
|
+
return {
|
|
1376
|
+
elements: newElements2,
|
|
1377
|
+
fullElements: elements
|
|
1378
|
+
};
|
|
1379
|
+
}
|
|
1380
|
+
const newElements = addAt(items2, 0);
|
|
1345
1381
|
return {
|
|
1346
1382
|
elements: newElements,
|
|
1347
1383
|
fullElements: elements
|
|
1348
1384
|
};
|
|
1349
1385
|
} else if (type == "add" && index != void 0) {
|
|
1350
|
-
const lastElement = elements[index - 1];
|
|
1351
|
-
|
|
1386
|
+
const lastElement = typeof index === "number" ? elements[index - 1] : elements[elements.length - 1];
|
|
1387
|
+
let newElements;
|
|
1388
|
+
if (!isArraySignal && typeof index === "string") {
|
|
1389
|
+
const value = event.value;
|
|
1390
|
+
if (value !== void 0) {
|
|
1391
|
+
newElements = [createElementFn(value, index)];
|
|
1392
|
+
elements.push(newElements[0]);
|
|
1393
|
+
} else {
|
|
1394
|
+
newElements = [];
|
|
1395
|
+
}
|
|
1396
|
+
} else {
|
|
1397
|
+
newElements = addAt(items2, index);
|
|
1398
|
+
}
|
|
1352
1399
|
return {
|
|
1353
1400
|
prev: lastElement,
|
|
1354
1401
|
elements: newElements,
|
|
1355
1402
|
fullElements: elements
|
|
1356
1403
|
};
|
|
1357
|
-
} else if (
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1404
|
+
} else if (type == "remove") {
|
|
1405
|
+
if (!isArraySignal && typeof index === "string") {
|
|
1406
|
+
const elementIndex = elements.findIndex((el) => {
|
|
1407
|
+
return el.props.text === index || el.props.key === index;
|
|
1408
|
+
});
|
|
1409
|
+
if (elementIndex !== -1) {
|
|
1410
|
+
const currentElement = elements[elementIndex];
|
|
1411
|
+
destroyElement(currentElement);
|
|
1412
|
+
elements.splice(elementIndex, 1);
|
|
1413
|
+
}
|
|
1414
|
+
} else if (typeof index === "number") {
|
|
1415
|
+
const currentElement = elements[index];
|
|
1416
|
+
destroyElement(currentElement);
|
|
1417
|
+
elements.splice(index, 1);
|
|
1418
|
+
}
|
|
1361
1419
|
return {
|
|
1362
|
-
elements: []
|
|
1420
|
+
elements: [],
|
|
1421
|
+
fullElements: elements
|
|
1363
1422
|
};
|
|
1364
1423
|
}
|
|
1365
1424
|
return {
|