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 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 FlowObservable = Observable<{
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 {BehaviorSubject<Array>} itemsSubject - A BehaviorSubject that emits an array of items.
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 = any>(itemsSubject: WritableArraySignal<T>, createElementFn: (item: any, index: number) => Element | Promise<Element>): FlowObservable;
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 addAt = (items, insertIndex) => {
1311
- return items.map((item, index) => {
1312
- const element = createElementFn(item, insertIndex + index);
1313
- elements.splice(insertIndex + index, 0, element);
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 = [...itemsSubject._subject.items];
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, index } = event;
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
- const newElements = addAt(items, 0);
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
- const newElements = addAt(items, index);
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 (index != void 0 && type == "remove") {
1358
- const currentElement = elements[index];
1359
- destroyElement(currentElement);
1360
- elements.splice(index, 1);
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 {