@zcomponent/core 1.10.0-beta → 1.12.0-beta

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.
Files changed (52) hide show
  1. package/lib/behaviors/ActivateState.d.ts +2 -1
  2. package/lib/behaviors/ActivateState.js +2 -1
  3. package/lib/behaviors/CallFunction.d.ts +19 -0
  4. package/lib/behaviors/CallFunction.js +18 -0
  5. package/lib/behaviors/ConsoleLog.d.ts +1 -0
  6. package/lib/behaviors/ConsoleLog.js +1 -0
  7. package/lib/behaviors/DownloadSnapshot.d.ts +2 -1
  8. package/lib/behaviors/DownloadSnapshot.js +2 -1
  9. package/lib/behaviors/LaunchURL.d.ts +1 -0
  10. package/lib/behaviors/LaunchURL.js +1 -0
  11. package/lib/behaviors/LogAnalyticsEvent.d.ts +1 -0
  12. package/lib/behaviors/LogAnalyticsEvent.js +1 -0
  13. package/lib/behaviors/PauseLayerClip.d.ts +2 -1
  14. package/lib/behaviors/PauseLayerClip.js +2 -1
  15. package/lib/behaviors/PlayLayerClip.d.ts +2 -1
  16. package/lib/behaviors/PlayLayerClip.js +2 -1
  17. package/lib/behaviors/PlaySound.d.ts +2 -1
  18. package/lib/behaviors/PlaySound.js +2 -1
  19. package/lib/behaviors/SetLayerOff.d.ts +2 -1
  20. package/lib/behaviors/SetLayerOff.js +2 -1
  21. package/lib/behaviors/ShareSnapshot.d.ts +2 -1
  22. package/lib/behaviors/ShareSnapshot.js +2 -1
  23. package/lib/behaviors/ShowTextAlert.d.ts +3 -1
  24. package/lib/behaviors/ShowTextAlert.js +3 -1
  25. package/lib/behaviors/TakeSnapshot.d.ts +1 -0
  26. package/lib/behaviors/TakeSnapshot.js +6 -9
  27. package/lib/behaviors/ToggleLayerClips.d.ts +2 -1
  28. package/lib/behaviors/ToggleLayerClips.js +2 -1
  29. package/lib/behaviors/stream/PauseStream.d.ts +4 -1
  30. package/lib/behaviors/stream/PauseStream.js +4 -1
  31. package/lib/behaviors/stream/PlayStream.d.ts +2 -1
  32. package/lib/behaviors/stream/PlayStream.js +2 -1
  33. package/lib/behaviors/stream/SeekStream.d.ts +2 -1
  34. package/lib/behaviors/stream/SeekStream.js +2 -1
  35. package/lib/behaviors/stream/StopStream.d.ts +2 -1
  36. package/lib/behaviors/stream/StopStream.js +2 -1
  37. package/lib/components/Audio.d.ts +17 -5
  38. package/lib/components/Audio.js +17 -5
  39. package/lib/contexts/analyticscontext.d.ts +2 -0
  40. package/lib/contexts/analyticscontext.js +2 -0
  41. package/lib/contexts/canvascontext.d.ts +26 -0
  42. package/lib/contexts/canvascontext.js +71 -7
  43. package/lib/contexts/textalertcontext.d.ts +2 -0
  44. package/lib/contexts/textalertcontext.js +2 -0
  45. package/lib/data/core.d.ts +29 -0
  46. package/lib/data/core.js +6 -0
  47. package/lib/selectors.js +29 -0
  48. package/lib/types.d.ts +6 -0
  49. package/lib/types.js +33 -1
  50. package/lib/zcomponent.d.ts +2 -0
  51. package/lib/zcomponent.js +68 -1
  52. package/package.json +1 -1
@@ -38,8 +38,9 @@ export declare class ActivateState extends ActionBehavior {
38
38
  */
39
39
  easing?: string;
40
40
  constructor(contextManager: ContextManager, instance: Component, props: ActionBehaviorConstructorProps);
41
- perform(): void;
42
41
  /** @zprop */
42
+ perform(): void;
43
+ /** @zui */
43
44
  preview(): void;
44
45
  }
45
46
  export declare enum Pin {
@@ -10,6 +10,7 @@ export class ActivateState extends ActionBehavior {
10
10
  super(contextManager, instance, props);
11
11
  this.zcomponent = this.getZComponentInstance();
12
12
  }
13
+ /** @zprop */
13
14
  perform() {
14
15
  if (!this.state)
15
16
  return;
@@ -25,7 +26,7 @@ export class ActivateState extends ActionBehavior {
25
26
  };
26
27
  layerclip.play(opts);
27
28
  }
28
- /** @zprop */
29
+ /** @zui */
29
30
  preview() {
30
31
  this.perform();
31
32
  }
@@ -0,0 +1,19 @@
1
+ import { ActionBehavior } from "../actionbehavior";
2
+ /**
3
+ * Calls an exposed function on a context
4
+ *
5
+ * @zbehavior
6
+ * @zicon function
7
+ * @zgroup Actions
8
+ */
9
+ export declare class CallFunction extends ActionBehavior {
10
+ /**
11
+ * The function and arguments to call
12
+ * @zprop
13
+ */
14
+ function: () => any;
15
+ /** @zui
16
+ * @zprop
17
+ */
18
+ perform(): void;
19
+ }
@@ -0,0 +1,18 @@
1
+ import { ActionBehavior } from "../actionbehavior";
2
+ import { registerBehaviorRunAtDesignTime } from "../behavior";
3
+ /**
4
+ * Calls an exposed function on a context
5
+ *
6
+ * @zbehavior
7
+ * @zicon function
8
+ * @zgroup Actions
9
+ */
10
+ export class CallFunction extends ActionBehavior {
11
+ /** @zui
12
+ * @zprop
13
+ */
14
+ perform() {
15
+ this.function();
16
+ }
17
+ }
18
+ registerBehaviorRunAtDesignTime(CallFunction);
@@ -18,5 +18,6 @@ export declare class ConsoleLog extends ActionBehavior {
18
18
  * @zdefault true
19
19
  */
20
20
  includeEventName: boolean;
21
+ /** @zprop */
21
22
  perform(): void;
22
23
  }
@@ -8,6 +8,7 @@ import { registerBehaviorRunAtDesignTime } from "../behavior";
8
8
  * @zgroup Actions
9
9
  */
10
10
  export class ConsoleLog extends ActionBehavior {
11
+ /** @zprop */
11
12
  perform() {
12
13
  if (this.includeEventName ?? true)
13
14
  console.log(this.constructorProps.event, this.text);
@@ -14,8 +14,9 @@ export declare class DownloadSnapshot extends ActionBehavior<DownloadSnapshotPro
14
14
  /** @zui */
15
15
  onSave: Event<[]>;
16
16
  constructor(contextManager: ContextManager, instance: Component, props: DownloadSnapshotProps);
17
+ /** @zprop */
17
18
  perform(): void;
18
19
  private download;
19
- /** @zprop */
20
+ /** @zui */
20
21
  preview(): void;
21
22
  }
@@ -31,10 +31,11 @@ export class DownloadSnapshot extends ActionBehavior {
31
31
  this.onSave.emit();
32
32
  };
33
33
  }
34
+ /** @zprop */
34
35
  perform() {
35
36
  this.download();
36
37
  }
37
- /** @zprop */
38
+ /** @zui */
38
39
  preview() {
39
40
  this.perform();
40
41
  }
@@ -20,5 +20,6 @@ export declare class LaunchURL extends ActionBehavior {
20
20
  * @zdefault true
21
21
  */
22
22
  openInNew: boolean;
23
+ /** @zprop */
23
24
  perform(): void;
24
25
  }
@@ -9,6 +9,7 @@ import { ActionBehavior } from "../actionbehavior";
9
9
  * @zgroup Actions
10
10
  */
11
11
  export class LaunchURL extends ActionBehavior {
12
+ /** @zprop */
12
13
  perform() {
13
14
  if (this.openInNew ?? true)
14
15
  window.open(this.url, '_blank', 'noopener noreferrer');
@@ -13,5 +13,6 @@ export declare class LogAnalyticsEvent extends ActionBehavior {
13
13
  name: string;
14
14
  /** @zprop */
15
15
  params: any;
16
+ /** @zprop */
16
17
  perform(): void;
17
18
  }
@@ -10,6 +10,7 @@ import { logEvent } from "../contexts/analyticscontext";
10
10
  * @zgroup Actions
11
11
  */
12
12
  export class LogAnalyticsEvent extends ActionBehavior {
13
+ /** @zprop */
13
14
  perform() {
14
15
  logEvent(this.contextManager, this.name, this.params);
15
16
  }
@@ -14,7 +14,8 @@ export declare class PauseLayerClip extends ActionBehavior {
14
14
  */
15
15
  layerClip: string | undefined;
16
16
  constructor(contextManager: ContextManager, instance: Component, props: ActionBehaviorConstructorProps);
17
- perform(): void;
18
17
  /** @zprop */
18
+ perform(): void;
19
+ /** @zui */
19
20
  preview(): void;
20
21
  }
@@ -10,6 +10,7 @@ export class PauseLayerClip extends ActionBehavior {
10
10
  super(contextManager, instance, props);
11
11
  this.zcomponent = this.getZComponentInstance();
12
12
  }
13
+ /** @zprop */
13
14
  perform() {
14
15
  if (!this.layerClip)
15
16
  return;
@@ -18,7 +19,7 @@ export class PauseLayerClip extends ActionBehavior {
18
19
  return;
19
20
  layerclip.pause();
20
21
  }
21
- /** @zprop */
22
+ /** @zui */
22
23
  preview() {
23
24
  this.perform();
24
25
  }
@@ -68,8 +68,9 @@ export declare class PlayLayerClip extends ActionBehavior {
68
68
  */
69
69
  easing?: string;
70
70
  constructor(contextManager: ContextManager, instance: Component, props: ActionBehaviorConstructorProps);
71
- perform(): void;
72
71
  /** @zprop */
72
+ perform(): void;
73
+ /** @zui */
73
74
  preview(): void;
74
75
  }
75
76
  export declare enum Pin {
@@ -26,6 +26,7 @@ export class PlayLayerClip extends ActionBehavior {
26
26
  */
27
27
  this.fromStart = false;
28
28
  }
29
+ /** @zprop */
29
30
  perform() {
30
31
  if (!this.layerClip)
31
32
  return;
@@ -48,7 +49,7 @@ export class PlayLayerClip extends ActionBehavior {
48
49
  else
49
50
  layerclip.play(opts);
50
51
  }
51
- /** @zprop */
52
+ /** @zui */
52
53
  preview() {
53
54
  this.perform();
54
55
  }
@@ -44,8 +44,9 @@ export declare class PlaySound extends ActionBehavior<PlaySoundProps> {
44
44
  speed: Observable<number, never>;
45
45
  private _component;
46
46
  constructor(contextManager: ContextManager, instance: Component, props: PlaySoundProps);
47
- perform(): void;
48
47
  /** @zprop */
48
+ perform(): void;
49
+ /** @zui */
49
50
  preview(): void;
50
51
  dispose(): never;
51
52
  }
@@ -23,11 +23,12 @@ export class PlaySound extends ActionBehavior {
23
23
  this.muted = this._component.muted;
24
24
  this.volume = this._component.volume;
25
25
  }
26
+ /** @zprop */
26
27
  perform() {
27
28
  this._component.seek(0);
28
29
  this._component.play({ speed: this.speed.value });
29
30
  }
30
- /** @zprop */
31
+ /** @zui */
31
32
  preview() {
32
33
  this.perform();
33
34
  }
@@ -14,7 +14,8 @@ export declare class SetLayerOff extends ActionBehavior {
14
14
  */
15
15
  layer: string | undefined;
16
16
  constructor(contextManager: ContextManager, instance: Component, props: ActionBehaviorConstructorProps);
17
- perform(): void;
18
17
  /** @zprop */
18
+ perform(): void;
19
+ /** @zui */
19
20
  preview(): void;
20
21
  }
@@ -10,6 +10,7 @@ export class SetLayerOff extends ActionBehavior {
10
10
  super(contextManager, instance, props);
11
11
  this.zcomponent = this.getZComponentInstance();
12
12
  }
13
+ /** @zprop */
13
14
  perform() {
14
15
  if (!this.layer)
15
16
  return;
@@ -18,7 +19,7 @@ export class SetLayerOff extends ActionBehavior {
18
19
  return;
19
20
  layer.active = null;
20
21
  }
21
- /** @zprop */
22
+ /** @zui */
22
23
  preview() {
23
24
  this.perform();
24
25
  }
@@ -14,8 +14,9 @@ export declare class ShareSnapshot extends ActionBehavior<ShareCanvasProps> {
14
14
  /** @zui */
15
15
  onShare: Event<[]>;
16
16
  constructor(contextManager: ContextManager, instance: Component, props: ShareCanvasProps);
17
+ /** @zprop */
17
18
  perform(): void;
18
19
  private share;
19
- /** @zprop */
20
+ /** @zui */
20
21
  preview(): void;
21
22
  }
@@ -33,10 +33,11 @@ export class ShareSnapshot extends ActionBehavior {
33
33
  }
34
34
  };
35
35
  }
36
+ /** @zprop */
36
37
  perform() {
37
38
  this.share();
38
39
  }
39
- /** @zprop */
40
+ /** @zui */
40
41
  preview() {
41
42
  this.perform();
42
43
  }
@@ -56,8 +56,10 @@ export declare class ShowTextAlert extends ActionBehavior {
56
56
  classNames: Observable<string[], never>;
57
57
  /**
58
58
  * How long the alert will apear on the screen
59
+ *
60
+ * @zprop
59
61
  */
60
62
  perform(): void;
61
- /** @zprop */
63
+ /** @zui */
62
64
  preview(): void;
63
65
  }
@@ -61,6 +61,8 @@ export class ShowTextAlert extends ActionBehavior {
61
61
  }
62
62
  /**
63
63
  * How long the alert will apear on the screen
64
+ *
65
+ * @zprop
64
66
  */
65
67
  perform() {
66
68
  showTextAlert(this.contextManager, this.text.value, {
@@ -70,7 +72,7 @@ export class ShowTextAlert extends ActionBehavior {
70
72
  timeout: this.timeout.value
71
73
  });
72
74
  }
73
- /** @zprop */
75
+ /** @zui */
74
76
  preview() {
75
77
  this.perform();
76
78
  }
@@ -47,6 +47,7 @@ export declare class TakeSnapshot extends ActionBehavior<ActionBehaviorConstruct
47
47
  */
48
48
  title: Observable<string, never>;
49
49
  private dataUrl;
50
+ /** @zprop */
50
51
  perform(): void;
51
52
  private capture;
52
53
  preview(): void;
@@ -1,6 +1,6 @@
1
1
  import { ActionBehavior } from '../actionbehavior';
2
2
  import { registerBehaviorRunAtDesignTime } from '../behavior';
3
- import { useCanvas, useOnAfterRender } from '../contexts/canvascontext';
3
+ import { CanvasContext } from '../contexts/canvascontext';
4
4
  import { SnapshotContext } from '../contexts/snapshotContext';
5
5
  import { Observable } from '../observable';
6
6
  export var ImageFormat;
@@ -65,20 +65,17 @@ export class TakeSnapshot extends ActionBehavior {
65
65
  ssctx.title.value = title;
66
66
  });
67
67
  this.dataUrl = '';
68
- this.capture = () => {
69
- const canvas = useCanvas(this.contextManager);
70
- if (!canvas) {
71
- console.error('No canvas found in context');
72
- return;
73
- }
68
+ this.capture = async () => {
74
69
  const snapshotContext = this.contextManager.get(SnapshotContext);
75
70
  const mimeType = snapshotContext.fileType.value === ImageFormat.PNG ? 'image/png' : 'image/jpeg';
76
- this.dataUrl = canvas.toDataURL(mimeType, this.quality.value);
71
+ const canvasContext = this.contextManager.get(CanvasContext);
72
+ this.dataUrl = await canvasContext.captureToDataURL(mimeType, this.quality.value);
77
73
  snapshotContext.canvasImage.value = this.dataUrl;
78
74
  };
79
75
  }
76
+ /** @zprop */
80
77
  perform() {
81
- useOnAfterRender(this.contextManager).next.then(this.capture);
78
+ this.capture();
82
79
  }
83
80
  preview() {
84
81
  this.perform();
@@ -90,8 +90,9 @@ export declare class ToggleLayerClips extends ActionBehavior {
90
90
  easing?: string;
91
91
  isA: boolean;
92
92
  constructor(contextManager: ContextManager, instance: Component, props: ActionBehaviorConstructorProps);
93
- perform(): void;
94
93
  /** @zprop */
94
+ perform(): void;
95
+ /** @zui */
95
96
  preview(): void;
96
97
  }
97
98
  export declare enum Pin {
@@ -27,6 +27,7 @@ export class ToggleLayerClips extends ActionBehavior {
27
27
  this.fromStart = false;
28
28
  this.isA = true;
29
29
  }
30
+ /** @zprop */
30
31
  perform() {
31
32
  this.isA = !this.isA;
32
33
  const opts = {
@@ -62,7 +63,7 @@ export class ToggleLayerClips extends ActionBehavior {
62
63
  layerclip.play(opts);
63
64
  }
64
65
  }
65
- /** @zprop */
66
+ /** @zui */
66
67
  preview() {
67
68
  this.perform();
68
69
  }
@@ -17,6 +17,9 @@ export declare class PauseStream extends ActionBehavior {
17
17
  stream: string | undefined;
18
18
  constructor(contextManager: ContextManager, instance: Component, props: ActionBehaviorConstructorProps);
19
19
  perform(): void;
20
- /** @zprop */
20
+ /**
21
+ * @zprop
22
+ * @zui
23
+ */
21
24
  preview(): void;
22
25
  }
@@ -18,7 +18,10 @@ export class PauseStream extends ActionBehavior {
18
18
  return;
19
19
  stream.pause();
20
20
  }
21
- /** @zprop */
21
+ /**
22
+ * @zprop
23
+ * @zui
24
+ */
22
25
  preview() {
23
26
  this.perform();
24
27
  }
@@ -39,7 +39,8 @@ export declare class PlayStream extends ActionBehavior {
39
39
  */
40
40
  fromStart: boolean;
41
41
  constructor(contextManager: ContextManager, instance: Component, props: ActionBehaviorConstructorProps);
42
- perform(): void;
43
42
  /** @zprop */
43
+ perform(): void;
44
+ /** @zui */
44
45
  preview(): void;
45
46
  }
@@ -19,6 +19,7 @@ export class PlayStream extends ActionBehavior {
19
19
  */
20
20
  this.fromStart = false;
21
21
  }
22
+ /** @zprop */
22
23
  perform() {
23
24
  if (!this.stream)
24
25
  return;
@@ -29,7 +30,7 @@ export class PlayStream extends ActionBehavior {
29
30
  stream.seek(0);
30
31
  stream.play({ loop: this.loop, speed: this.speed });
31
32
  }
32
- /** @zprop */
33
+ /** @zui */
33
34
  preview() {
34
35
  this.perform();
35
36
  }
@@ -24,7 +24,8 @@ export declare class SeekStream extends ActionBehavior {
24
24
  */
25
25
  time: number;
26
26
  constructor(contextManager: ContextManager, instance: Component, props: ActionBehaviorConstructorProps);
27
- perform(): void;
28
27
  /** @zprop */
28
+ perform(): void;
29
+ /** @zui */
29
30
  preview(): void;
30
31
  }
@@ -18,6 +18,7 @@ export class SeekStream extends ActionBehavior {
18
18
  */
19
19
  this.time = 0;
20
20
  }
21
+ /** @zprop */
21
22
  perform() {
22
23
  if (!this.stream)
23
24
  return;
@@ -26,7 +27,7 @@ export class SeekStream extends ActionBehavior {
26
27
  return;
27
28
  stream.seek(this.time ?? 0);
28
29
  }
29
- /** @zprop */
30
+ /** @zui */
30
31
  preview() {
31
32
  this.perform();
32
33
  }
@@ -16,7 +16,8 @@ export declare class StopStream extends ActionBehavior {
16
16
  */
17
17
  stream: string | undefined;
18
18
  constructor(contextManager: ContextManager, instance: Component, props: ActionBehaviorConstructorProps);
19
- perform(): void;
20
19
  /** @zprop */
20
+ perform(): void;
21
+ /** @zui */
21
22
  preview(): void;
22
23
  }
@@ -10,6 +10,7 @@ export class StopStream extends ActionBehavior {
10
10
  super(contextManager, instance, props);
11
11
  this.zcomponent = this.getZComponentInstance();
12
12
  }
13
+ /** @zprop */
13
14
  perform() {
14
15
  if (!this.stream)
15
16
  return;
@@ -18,7 +19,7 @@ export class StopStream extends ActionBehavior {
18
19
  return;
19
20
  stream.stop();
20
21
  }
21
- /** @zprop */
22
+ /** @zui */
22
23
  preview() {
23
24
  this.perform();
24
25
  }
@@ -56,15 +56,27 @@ export declare class Audio extends Component<undefined, AudioConstructorProps> i
56
56
  * @zdefault 1
57
57
  */
58
58
  readonly volume: Observable<number, never>;
59
- /** @zprop */
59
+ /**
60
+ * @zprop
61
+ * @zui
62
+ */
60
63
  play(opts?: PlayOptions): void;
61
64
  private _pause;
62
- /** @zprop */
65
+ /**
66
+ * @zprop
67
+ * @zui
68
+ */
63
69
  pause(): void;
64
- /** @zprop */
70
+ /**
71
+ * @zprop
72
+ * @zui
73
+ */
65
74
  stop(): void;
66
- /** @zprop */
67
- seek(t: number): void;
75
+ /**
76
+ * @zprop
77
+ * @zui
78
+ */
79
+ seek(/** @ztype time-milliseconds */ t: number): void;
68
80
  length(): number | undefined;
69
81
  dispose(): never;
70
82
  }
@@ -68,7 +68,10 @@ export class Audio extends Component {
68
68
  }
69
69
  return this._reversed;
70
70
  }
71
- /** @zprop */
71
+ /**
72
+ * @zprop
73
+ * @zui
74
+ */
72
75
  play(opts) {
73
76
  if (!this.audioBuffer)
74
77
  return;
@@ -105,19 +108,28 @@ export class Audio extends Component {
105
108
  this._session.source.disconnect();
106
109
  delete this._session;
107
110
  }
108
- /** @zprop */
111
+ /**
112
+ * @zprop
113
+ * @zui
114
+ */
109
115
  pause() {
110
116
  this._pause();
111
117
  this.onPause.emit(this);
112
118
  }
113
- /** @zprop */
119
+ /**
120
+ * @zprop
121
+ * @zui
122
+ */
114
123
  stop() {
115
124
  this._pause();
116
125
  this._playhead = 0;
117
126
  this.onStop.emit(this);
118
127
  }
119
- /** @zprop */
120
- seek(t) {
128
+ /**
129
+ * @zprop
130
+ * @zui
131
+ */
132
+ seek(/** @ztype time-milliseconds */ t) {
121
133
  let previousSession = this._session;
122
134
  if (previousSession)
123
135
  this._pause();
@@ -1,7 +1,9 @@
1
1
  import { ContextManager, Context } from '../context';
2
2
  import { Event } from '../event';
3
+ /** @zcontext */
3
4
  export declare class AnalyticsContext extends Context {
4
5
  readonly onEvent: Event<[string, any]>;
6
+ /** @zprop */
5
7
  logEvent(name: string, params?: any): void;
6
8
  }
7
9
  export declare function logEvent(mgr: ContextManager, name: string, params?: any): void;
@@ -1,10 +1,12 @@
1
1
  import { Context } from '../context';
2
2
  import { Event } from '../event';
3
+ /** @zcontext */
3
4
  export class AnalyticsContext extends Context {
4
5
  constructor() {
5
6
  super(...arguments);
6
7
  this.onEvent = new Event();
7
8
  }
9
+ /** @zprop */
8
10
  logEvent(name, params) {
9
11
  this.onEvent.emit(name, params);
10
12
  }
@@ -17,6 +17,20 @@ export declare class CanvasContext extends Context {
17
17
  readonly size: Observable<[number, number]>;
18
18
  private _resizeObserver;
19
19
  constructor(contextManager: ContextManager, constructorProps: CanvasContextOptions);
20
+ /**
21
+ * Captures the canvas content and returns it as a Data URL after the current frame has rendered.
22
+ * @param type The MIME image format type.
23
+ * @param quality Between 0 and 1 indicating image quality. Defaults to 1.
24
+ */
25
+ captureToDataURL(type?: 'image/png' | 'image/jpeg', quality?: number): Promise<string>;
26
+ /**
27
+ * Captures the canvas content and returns it as an ArrayBuffer after the current frame has rendered.
28
+ * @param type The MIME image format type.
29
+ * @param quality Between 0 and 1 indicating image quality. Defaults to 1.
30
+ */
31
+ captureToArrayBuffer(type?: 'image/png' | 'image/jpeg', quality?: number): Promise<ArrayBuffer>;
32
+ private canvasToBlob;
33
+ private blobToArrayBuffer;
20
34
  dispose(): never;
21
35
  }
22
36
  export declare enum HorizontalAlignment {
@@ -34,4 +48,16 @@ export declare function useOverlay(mgr: ContextManager): Observable<HTMLDivEleme
34
48
  export declare function useCanvasSize(mgr: ContextManager): Observable<[number, number], never>;
35
49
  export declare function useOnBeforeRender(mgr: ContextManager): Event<[number]>;
36
50
  export declare function useOnAfterRender(mgr: ContextManager): Event<[number]>;
51
+ /**
52
+ * Returns a promise that resovles a data url of the canvas as jpeg.
53
+ *
54
+ * For custom MIME types or quality settings, use`contextManager.get(CanvasContext).captureToDataURL();`
55
+ */
56
+ export declare function useCanvasToDataURL(mgr: ContextManager): Promise<string>;
57
+ /**
58
+ * Returns a promise that resolves an array buffer of the canvas image.
59
+ *
60
+ * For custom MIME types or quality settings, use`contextManager.get(CanvasContext).captureToArrayBuffer();`
61
+ */
62
+ export declare function useCanvasToArrayBuffer(mgr: ContextManager): Promise<ArrayBuffer>;
37
63
  export declare function classNameForAlignment(h: HorizontalAlignment, v: VerticalAlignment): string;
@@ -16,13 +16,13 @@ export class CanvasContext extends Context {
16
16
  }
17
17
  });
18
18
  if (!constructorProps.canvas) {
19
- this.canvas = document.createElement("canvas");
20
- this.canvas.style.position = "fixed";
21
- this.canvas.style.top = "0px";
22
- this.canvas.style.left = "0px";
23
- this.canvas.style.width = "100%";
24
- this.canvas.style.height = "100%";
25
- this.canvas.style.touchAction = "none";
19
+ this.canvas = document.createElement('canvas');
20
+ this.canvas.style.position = 'fixed';
21
+ this.canvas.style.top = '0px';
22
+ this.canvas.style.left = '0px';
23
+ this.canvas.style.width = '100%';
24
+ this.canvas.style.height = '100%';
25
+ this.canvas.style.touchAction = 'none';
26
26
  document.body.append(this.canvas);
27
27
  }
28
28
  else {
@@ -48,6 +48,54 @@ export class CanvasContext extends Context {
48
48
  lastRect = rect;
49
49
  });
50
50
  }
51
+ /**
52
+ * Captures the canvas content and returns it as a Data URL after the current frame has rendered.
53
+ * @param type The MIME image format type.
54
+ * @param quality Between 0 and 1 indicating image quality. Defaults to 1.
55
+ */
56
+ async captureToDataURL(type = 'image/jpeg', quality = 1) {
57
+ await useOnAfterRender(this.contextManager).next;
58
+ return this.canvas.toDataURL(type, quality);
59
+ }
60
+ /**
61
+ * Captures the canvas content and returns it as an ArrayBuffer after the current frame has rendered.
62
+ * @param type The MIME image format type.
63
+ * @param quality Between 0 and 1 indicating image quality. Defaults to 1.
64
+ */
65
+ async captureToArrayBuffer(type = 'image/jpeg', quality = 1) {
66
+ await useOnAfterRender(this.contextManager).next;
67
+ const blob = await this.canvasToBlob(type, quality);
68
+ return this.blobToArrayBuffer(blob);
69
+ }
70
+ canvasToBlob(type, quality) {
71
+ return new Promise((resolve, reject) => {
72
+ this.canvas.toBlob(blob => {
73
+ if (blob) {
74
+ resolve(blob);
75
+ }
76
+ else {
77
+ reject(new Error('Failed to capture canvas as Blob'));
78
+ }
79
+ }, type, quality);
80
+ });
81
+ }
82
+ blobToArrayBuffer(blob) {
83
+ return new Promise((resolve, reject) => {
84
+ const reader = new FileReader();
85
+ reader.onloadend = () => {
86
+ if (reader.result instanceof ArrayBuffer) {
87
+ resolve(reader.result);
88
+ }
89
+ else {
90
+ reject(new Error('Failed to read Blob as ArrayBuffer'));
91
+ }
92
+ };
93
+ reader.onerror = () => {
94
+ reject(new Error('Error reading Blob as ArrayBuffer'));
95
+ };
96
+ reader.readAsArrayBuffer(blob);
97
+ });
98
+ }
51
99
  dispose() {
52
100
  this.onBeforeRender.clearListeners();
53
101
  this.onAfterRender.clearListeners();
@@ -86,6 +134,22 @@ export function useOnBeforeRender(mgr) {
86
134
  export function useOnAfterRender(mgr) {
87
135
  return mgr.get(CanvasContext).onAfterRender;
88
136
  }
137
+ /**
138
+ * Returns a promise that resovles a data url of the canvas as jpeg.
139
+ *
140
+ * For custom MIME types or quality settings, use`contextManager.get(CanvasContext).captureToDataURL();`
141
+ */
142
+ export function useCanvasToDataURL(mgr) {
143
+ return mgr.get(CanvasContext).captureToDataURL('image/jpeg', 1);
144
+ }
145
+ /**
146
+ * Returns a promise that resolves an array buffer of the canvas image.
147
+ *
148
+ * For custom MIME types or quality settings, use`contextManager.get(CanvasContext).captureToArrayBuffer();`
149
+ */
150
+ export function useCanvasToArrayBuffer(mgr) {
151
+ return mgr.get(CanvasContext).captureToArrayBuffer('image/jpeg', 1);
152
+ }
89
153
  export function classNameForAlignment(h, v) {
90
154
  const names = ['zcomponent-align'];
91
155
  switch (h) {
@@ -1,7 +1,9 @@
1
1
  import { ContextManager, Context } from '../context';
2
+ /** @zcontext */
2
3
  export declare class TextAlertContext extends Context {
3
4
  private _container;
4
5
  constructor(contextManager: ContextManager);
6
+ /** @zprop */
5
7
  showTextAlert(txt: string, options?: TextAlertOptions): void;
6
8
  }
7
9
  export interface TextAlertOptions {
@@ -1,5 +1,6 @@
1
1
  import { Context } from '../context';
2
2
  import { useOverlay } from './canvascontext';
3
+ /** @zcontext */
3
4
  export class TextAlertContext extends Context {
4
5
  constructor(contextManager) {
5
6
  super(contextManager, {});
@@ -9,6 +10,7 @@ export class TextAlertContext extends Context {
9
10
  val.appendChild(this._container);
10
11
  });
11
12
  }
13
+ /** @zprop */
12
14
  showTextAlert(txt, options) {
13
15
  const entry = document.createElement('div');
14
16
  entry.classList.add('zcomponent-textalert');
@@ -97,3 +97,32 @@ export interface ContextValueEntityPropOverride extends BaseEntityPropOverride {
97
97
  val: string;
98
98
  type: EntityPropOverrideType.ContextValue;
99
99
  }
100
+ export declare enum FunctionCallType {
101
+ Entity = "entity",
102
+ Context = "context",
103
+ Import = "import"
104
+ }
105
+ export interface BaseFunctionCall {
106
+ _zfn: true;
107
+ t: FunctionCallType;
108
+ args: {
109
+ [id: number]: any;
110
+ };
111
+ }
112
+ export interface EntityFunctionCall extends BaseFunctionCall {
113
+ entityID: string;
114
+ t: FunctionCallType.Entity;
115
+ fn: string;
116
+ }
117
+ export interface ContextFunctionCall extends BaseFunctionCall {
118
+ imp: string;
119
+ fn: string;
120
+ t: FunctionCallType.Context;
121
+ resolved?: any;
122
+ }
123
+ export interface ImportFunctionCall extends BaseFunctionCall {
124
+ imp: string;
125
+ t: FunctionCallType.Import;
126
+ resolved?: any;
127
+ }
128
+ export type FunctionCall = EntityFunctionCall | ContextFunctionCall | ImportFunctionCall;
package/lib/data/core.js CHANGED
@@ -4,3 +4,9 @@ export var EntityPropOverrideType;
4
4
  EntityPropOverrideType["Import"] = "import";
5
5
  EntityPropOverrideType["ContextValue"] = "contextvalue";
6
6
  })(EntityPropOverrideType || (EntityPropOverrideType = {}));
7
+ export var FunctionCallType;
8
+ (function (FunctionCallType) {
9
+ FunctionCallType["Entity"] = "entity";
10
+ FunctionCallType["Context"] = "context";
11
+ FunctionCallType["Import"] = "import";
12
+ })(FunctionCallType || (FunctionCallType = {}));
package/lib/selectors.js CHANGED
@@ -186,6 +186,35 @@ export function summaryForEntityPropOverrideDestination(o) {
186
186
  }
187
187
  return '?';
188
188
  }
189
+ function typeContainsType(p, name) {
190
+ if (p.name === name)
191
+ return true;
192
+ switch (p.name) {
193
+ case 'array':
194
+ return typeContainsType(p.child, name);
195
+ case 'function':
196
+ for (const arg of p.args) {
197
+ if (typeContainsType(arg.type, name))
198
+ return true;
199
+ }
200
+ if (p.ret)
201
+ return typeContainsType(p.ret, name);
202
+ return false;
203
+ case 'tuple':
204
+ for (const c of p.children) {
205
+ if (typeContainsType(c, name))
206
+ return true;
207
+ }
208
+ return false;
209
+ case 'union':
210
+ for (const c of p.children) {
211
+ if (typeContainsType(c, name))
212
+ return true;
213
+ }
214
+ return false;
215
+ }
216
+ return false;
217
+ }
189
218
  export const typeDefinitionForComponent = (nodes, props, constructorProps, scriptNames, layers, behaviors) => {
190
219
  const importMapping = new Map();
191
220
  let indx = 0;
package/lib/types.d.ts CHANGED
@@ -109,10 +109,15 @@ export interface Prop {
109
109
  default?: any;
110
110
  group?: string;
111
111
  groupPriority?: number;
112
+ groupCollapsed?: boolean;
112
113
  values?: Values[];
113
114
  order?: number;
114
115
  priority?: number;
115
116
  optional?: boolean;
117
+ showInUI?: boolean;
118
+ readonly?: boolean;
119
+ isConstructorProp?: boolean;
120
+ deprecated?: boolean;
116
121
  }
117
122
  export interface DefaultChild {
118
123
  label: string;
@@ -144,6 +149,7 @@ export interface ComponentInfo {
144
149
  streamsObjects: {
145
150
  [id: string]: string;
146
151
  };
152
+ deprecated?: boolean;
147
153
  }
148
154
  export interface ValueInfo {
149
155
  name: string;
package/lib/types.js CHANGED
@@ -1,4 +1,4 @@
1
- import { EntityPropOverrideType } from './data/core';
1
+ import { EntityPropOverrideType, FunctionCallType } from './data/core';
2
2
  import { getSafeKeyName } from './selectors';
3
3
  export var TypeName;
4
4
  (function (TypeName) {
@@ -138,6 +138,10 @@ export function mergeValues(a, b) {
138
138
  export function mergeProps(a, b) {
139
139
  if (a.name !== b.name)
140
140
  return;
141
+ if ((a.readonly && !b.readonly) || (b.readonly && !a.readonly))
142
+ return;
143
+ if ((a.deprecated ?? false) !== (b.deprecated ?? false))
144
+ return;
141
145
  const type = mergeTypes(a.type, b.type);
142
146
  if (!type)
143
147
  return;
@@ -151,9 +155,12 @@ export function mergeProps(a, b) {
151
155
  default: def,
152
156
  group: a.group === b.group ? a.group : undefined,
153
157
  groupPriority: Math.max(a.groupPriority ?? 0, b.groupPriority ?? 0),
158
+ groupCollapsed: a.groupCollapsed || b.groupCollapsed,
154
159
  priority: Math.max(a.priority ?? 0, b.priority ?? 0),
155
160
  values: mergeValues(a.values, b.values),
156
161
  order: Math.min(a.order ?? 0, b.order ?? 0),
162
+ deprecated: a.deprecated,
163
+ readonly: a.readonly,
157
164
  };
158
165
  }
159
166
  function mergeComments(a, b) {
@@ -328,6 +335,31 @@ export function isValidValueForType(def, t, allowUndefined) {
328
335
  return true;
329
336
  return def === t.value;
330
337
  case 'function':
338
+ if (typeof def !== 'object')
339
+ return false;
340
+ if (def['_zfn'] !== true)
341
+ return false;
342
+ if (typeof def['args'] !== 'object')
343
+ return false;
344
+ if (def['t'] === FunctionCallType.Context) {
345
+ if (typeof def['imp'] !== 'string' || def['imp'].length === 0)
346
+ return false;
347
+ if (typeof def['fn'] !== 'string' || def['fn'].length === 0)
348
+ return false;
349
+ return true;
350
+ }
351
+ if (def['t'] === FunctionCallType.Entity) {
352
+ if (typeof def['entityID'] !== 'string' || def['entityID'].length === 0)
353
+ return false;
354
+ if (typeof def['fn'] !== 'string' || def['fn'].length === 0)
355
+ return false;
356
+ return true;
357
+ }
358
+ if (def['t'] === FunctionCallType.Import) {
359
+ if (typeof def['imp'] !== 'string' || def['imp'].length === 0)
360
+ return false;
361
+ return true;
362
+ }
331
363
  return false;
332
364
  }
333
365
  return false;
@@ -59,8 +59,10 @@ export declare class ZComponent<RootType = any> extends Component<RootType> {
59
59
  private _constructorForNode;
60
60
  private _constructorForBehavior;
61
61
  resolveNodeID<T extends Component = Component>(id: string, type?: ConstructorForComponent<T>): T | undefined;
62
+ resolveEntityID<T extends Entity = Entity>(id: string): T | undefined;
62
63
  private _inflateBehaviors;
63
64
  private _wrapBehaviors;
65
+ private _wrapFunctionCall;
64
66
  notifyPropsChanged(entries: Map<string, Set<string>>): void;
65
67
  notifyClipsChanged(clips: Set<string>): void;
66
68
  private _initializeOverrides;
package/lib/zcomponent.js CHANGED
@@ -7,8 +7,9 @@ import { isDesignTime } from './contexts/environmentcontext';
7
7
  import { isStarted, started } from './contexts/loadcontext';
8
8
  import { TagContext } from './contexts/tagcontext';
9
9
  import { computeBehaviorHierarchy, computeNodeHierarchy } from './data';
10
+ import { Entity } from './entity';
10
11
  import { populateAnimationStructureFromData, populateAnimationTracksFromData, updateClipFromData } from './inflate';
11
- import { EntityPropOverrideType } from './data/core';
12
+ import { EntityPropOverrideType, FunctionCallType } from './data/core';
12
13
  import { Observable } from './observable';
13
14
  import { setCurrentZComponentConstruction } from './zcomponentconstruction';
14
15
  export class ZComponentContext extends Context {
@@ -188,6 +189,11 @@ export class ZComponent extends Component {
188
189
  ...(that._opts.constructorPropReplacement?.[behaviorId] ?? {}),
189
190
  ...(that._constructorPropOverridesByEntityID.get(behaviorId) ?? {}),
190
191
  };
192
+ for (const key in constructorProps) {
193
+ const val = constructorProps[key];
194
+ if (val !== undefined && val !== null && val['_zfn'] === true)
195
+ constructorProps[key] = that._wrapFunctionCall(val);
196
+ }
191
197
  setCurrentZComponentConstruction(that);
192
198
  super(contextManager, instance, constructorProps);
193
199
  that.entityByID.set(behaviorId, this);
@@ -227,6 +233,14 @@ export class ZComponent extends Component {
227
233
  return entity;
228
234
  return undefined;
229
235
  }
236
+ resolveEntityID(id) {
237
+ const entity = this.entityByID.get(id);
238
+ if (!entity)
239
+ return this.getZComponentInstance()?.resolveEntityID(id);
240
+ if (!(entity instanceof Entity))
241
+ return undefined;
242
+ return entity;
243
+ }
230
244
  _inflateBehaviors() {
231
245
  for (const [nodeID, impl, ctx] of this._behaviorsToInitialize) {
232
246
  this._wrapBehaviors(nodeID, impl, ctx);
@@ -248,6 +262,55 @@ export class ZComponent extends Component {
248
262
  }
249
263
  }
250
264
  }
265
+ _wrapFunctionCall(c) {
266
+ switch (c.t) {
267
+ case FunctionCallType.Context:
268
+ return () => {
269
+ try {
270
+ if (typeof c.imp !== 'string' || typeof c.fn !== 'string' || typeof c.args !== 'object')
271
+ throw new Error('Invalid function call data');
272
+ const contextConstructor = c.resolved;
273
+ if (!contextConstructor)
274
+ throw new Error('Unable to find context');
275
+ const context = this.contextManager.get(contextConstructor);
276
+ if (!context)
277
+ throw new Error('Unable to get context');
278
+ const func = context[c.fn];
279
+ if (!func || typeof func !== 'function')
280
+ throw new Error('Unable to find function on enttiy');
281
+ const tf = func;
282
+ const converted = [];
283
+ for (const key in c.args)
284
+ converted[key] = c.args[key];
285
+ return tf.call(context, ...converted);
286
+ }
287
+ catch (err) {
288
+ console.error('Unable to call context function', err);
289
+ }
290
+ };
291
+ case FunctionCallType.Entity:
292
+ return () => {
293
+ try {
294
+ if (typeof c.entityID !== 'string' || typeof c.fn !== 'string' || typeof c.args !== 'object')
295
+ throw new Error('Invalid function call data');
296
+ const entity = this.resolveEntityID(c.entityID);
297
+ if (!entity)
298
+ throw new Error('Unable to find entity');
299
+ const func = entity[c.fn];
300
+ if (!func || typeof func !== 'function')
301
+ throw new Error('Unable to find function on enttiy');
302
+ const tf = func;
303
+ const converted = [];
304
+ for (const key in c.args)
305
+ converted[key] = c.args[key];
306
+ return tf.call(entity, ...converted);
307
+ }
308
+ catch (err) {
309
+ console.error('Unable to call entity function', err);
310
+ }
311
+ };
312
+ }
313
+ }
251
314
  notifyPropsChanged(entries) {
252
315
  for (const [entityID, propSet] of entries.entries()) {
253
316
  const entity = this.entityByID.get(entityID);
@@ -354,6 +417,8 @@ export class ZComponent extends Component {
354
417
  }
355
418
  }
356
419
  _setEntityProp(entity, prop, v) {
420
+ if (v !== undefined && v !== null && v['_zfn'] === true)
421
+ v = this._wrapFunctionCall(v);
357
422
  if (entity[prop] instanceof Observable)
358
423
  entity[prop].value = v;
359
424
  else
@@ -373,6 +438,8 @@ export class ZComponent extends Component {
373
438
  parent = parent[currentKey];
374
439
  currentKey = propPath[i];
375
440
  }
441
+ if (v !== undefined && v !== null && v['_zfn'] === true)
442
+ v = this._wrapFunctionCall(v);
376
443
  parent[currentKey] = v;
377
444
  }
378
445
  _getNodeById(id) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zcomponent/core",
3
- "version": "1.10.0-beta",
3
+ "version": "1.12.0-beta",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",