@zcomponent/core 0.0.2 → 0.0.5

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.
@@ -32,4 +32,16 @@
32
32
  background-color: white;
33
33
  height: 12px;
34
34
  border-radius: 6px;
35
+ }
36
+
37
+ #zcomponent-overlay {
38
+ position: fixed;
39
+ top: 0;
40
+ left: 0;
41
+ pointer-events: none;
42
+ overflow: hidden;
43
+ }
44
+
45
+ #zcomponent-overlay > * {
46
+ pointer-events: auto;
35
47
  }
@@ -1,5 +1,9 @@
1
1
  import { ActionBehavior } from "../actionbehavior";
2
2
  /**
3
+ * Navigates the user to the provided URL.
4
+ *
5
+ * **Important Note**: Safari on iOS will not open URLs in new tabs for pointer events except `onPointerUp`.
6
+ *
3
7
  * @zbehavior
4
8
  * @zgroup Actions
5
9
  */
@@ -12,6 +16,7 @@ export declare class LaunchURL extends ActionBehavior {
12
16
  /**
13
17
  * If true, the URL will be opened in a new tab (using target '_blank')
14
18
  * @zprop
19
+ * @zdefault true
15
20
  */
16
21
  openInNew: boolean;
17
22
  perform(): void;
@@ -1,5 +1,9 @@
1
1
  import { ActionBehavior } from "../actionbehavior";
2
2
  /**
3
+ * Navigates the user to the provided URL.
4
+ *
5
+ * **Important Note**: Safari on iOS will not open URLs in new tabs for pointer events except `onPointerUp`.
6
+ *
3
7
  * @zbehavior
4
8
  * @zgroup Actions
5
9
  */
@@ -1,5 +1,9 @@
1
1
  import { ActionBehavior } from "../actionbehavior";
2
2
  /**
3
+ * Logs an event through the currently configured analytics provider(s).
4
+ *
5
+ * Note: you must have added an analytics provider to the Hierarchy in one of your components for this behavior to have any effect.
6
+ *
3
7
  * @zbehavior
4
8
  * @zgroup Actions
5
9
  */
@@ -1,6 +1,10 @@
1
1
  import { ActionBehavior } from "../actionbehavior";
2
2
  import { logEvent } from "../contexts/analyticscontext";
3
3
  /**
4
+ * Logs an event through the currently configured analytics provider(s).
5
+ *
6
+ * Note: you must have added an analytics provider to the Hierarchy in one of your components for this behavior to have any effect.
7
+ *
4
8
  * @zbehavior
5
9
  * @zgroup Actions
6
10
  */
@@ -9,6 +9,8 @@ export interface PlaySoundProps extends ActionBehaviorConstructorProps {
9
9
  source: string;
10
10
  }
11
11
  /**
12
+ * Plays a sound
13
+ *
12
14
  * @zbehavior
13
15
  * @zgroup Actions
14
16
  */
@@ -2,6 +2,8 @@ import { ActionBehavior, } from "../actionbehavior";
2
2
  import { registerBehaviorRunAtDesignTime } from "../behavior";
3
3
  import { registerLoadable } from "../contexts/loadcontext";
4
4
  /**
5
+ * Plays a sound
6
+ *
5
7
  * @zbehavior
6
8
  * @zgroup Actions
7
9
  */
@@ -12,7 +14,10 @@ export class PlaySound extends ActionBehavior {
12
14
  this._elm.preload = 'auto';
13
15
  registerLoadable(contextManager, new Promise((resolve, reject) => {
14
16
  this._elm.addEventListener('canplaythrough', () => resolve());
15
- this._elm.addEventListener('error', reject);
17
+ this._elm.addEventListener('error', err => {
18
+ console.error('Unable to create PlaySound', err);
19
+ reject(err);
20
+ });
16
21
  }));
17
22
  this._elm.src = props.source;
18
23
  }
@@ -23,7 +23,7 @@ export declare class DefaultLoader extends Component<DefaultLoaderConstructorPro
23
23
  * @zgroup Design Time
24
24
  * @zgrouppriority 30
25
25
  */
26
- preview: Observable<boolean>;
26
+ preview: Observable<boolean, never>;
27
27
  /** @zprop
28
28
  * @zgroup Text
29
29
  * @zgrouppriority 20
@@ -0,0 +1,45 @@
1
+ import { Component, ConstructorProps, ContextManager } from "..";
2
+ export interface LongLoadConstructorProps extends ConstructorProps {
3
+ /**
4
+ * The number of loading processes to simulate
5
+ * @zprop
6
+ * @zgroup LongLoad
7
+ * @zgrouppriority 10
8
+ * @zdefault 10
9
+ */
10
+ numberOfLoads: number;
11
+ /**
12
+ * The shortest time (in milliseconds) that a given load should take
13
+ * @zprop
14
+ * @zgroup LongLoad
15
+ * @zgrouppriority 10
16
+ * @zdefault 500
17
+ */
18
+ minimumLoadTime: number;
19
+ /**
20
+ * The shortest time (in milliseconds) that a given load should take
21
+ * @zprop
22
+ * @zgroup LongLoad
23
+ * @zgrouppriority 10
24
+ * @zdefault 5000
25
+ */
26
+ maximumLoadTime: number;
27
+ /**
28
+ * If the long loading process should occur in production builds (in addition to development builds)
29
+ * @zprop
30
+ * @zgroup LongLoad
31
+ * @zgrouppriority 10
32
+ * @zdefault false
33
+ */
34
+ runInProduction: boolean;
35
+ }
36
+ /**
37
+ * Simulates long random loading times to facilitate development and debugging of loading processes.
38
+ *
39
+ * @zcomponent
40
+ * @zicon settings
41
+ * @zgroup Advanced
42
+ */
43
+ export declare class LongLoad extends Component<LongLoadConstructorProps> {
44
+ constructor(props: LongLoadConstructorProps, contextManager: ContextManager);
45
+ }
@@ -0,0 +1,28 @@
1
+ import { Component, isDevelopmentBuild, registerLoadable } from "..";
2
+ /**
3
+ * Simulates long random loading times to facilitate development and debugging of loading processes.
4
+ *
5
+ * @zcomponent
6
+ * @zicon settings
7
+ * @zgroup Advanced
8
+ */
9
+ export class LongLoad extends Component {
10
+ constructor(props, contextManager) {
11
+ super(props, contextManager);
12
+ if (!props.runInProduction && !isDevelopmentBuild(contextManager))
13
+ return;
14
+ const minimumLoadTime = props.minimumLoadTime ?? 500;
15
+ const maximumLoadTime = props.maximumLoadTime ?? 5000;
16
+ for (let i = 0; i < (props.numberOfLoads ?? 10); i++) {
17
+ registerLoadable(contextManager, new Promise(resolve => {
18
+ if (this.disposed)
19
+ return;
20
+ setTimeout(() => {
21
+ if (this.disposed)
22
+ return;
23
+ resolve();
24
+ }, minimumLoadTime + Math.random() * (maximumLoadTime - minimumLoadTime));
25
+ }));
26
+ }
27
+ }
28
+ }
@@ -7,9 +7,15 @@ export interface CanvasContext {
7
7
  onAfterRender: Event<[number]>;
8
8
  size: Observable<[number, number]>;
9
9
  dispose: () => void;
10
+ overlayDefault: HTMLDivElement;
11
+ overlay: Observable<HTMLDivElement>;
10
12
  }
11
- export declare const CanvasContext: import("../context").ContextTypeWithDefault<CanvasContext, [canvas?: HTMLCanvasElement | undefined]>;
13
+ export interface CanvasContextOptions {
14
+ overlay: HTMLDivElement;
15
+ }
16
+ export declare const CanvasContext: import("../context").ContextTypeWithDefault<CanvasContext, [canvas?: HTMLCanvasElement | undefined, options?: CanvasContextOptions | undefined]>;
12
17
  export declare function useCanvas(mgr: ContextManager): HTMLCanvasElement;
13
- export declare function useCanvasSize(mgr: ContextManager): Observable<[number, number]>;
18
+ export declare function useOverlay(mgr: ContextManager): Observable<HTMLDivElement, never>;
19
+ export declare function useCanvasSize(mgr: ContextManager): Observable<[number, number], never>;
14
20
  export declare function useOnBeforeRender(mgr: ContextManager): Event<[number]>;
15
21
  export declare function useOnAfterRender(mgr: ContextManager): Event<[number]>;
@@ -1,7 +1,7 @@
1
1
  import { defineContextType } from '../context';
2
2
  import { Event } from '../event';
3
3
  import { Observable } from '../observable';
4
- export const CanvasContext = defineContextType((ctx, canvas) => {
4
+ export const CanvasContext = defineContextType((ctx, canvas, options) => {
5
5
  if (!canvas) {
6
6
  canvas = document.createElement("canvas");
7
7
  canvas.style.position = "fixed";
@@ -12,6 +12,11 @@ export const CanvasContext = defineContextType((ctx, canvas) => {
12
12
  canvas.style.touchAction = "none";
13
13
  document.body.append(canvas);
14
14
  }
15
+ const overlayDefault = options?.overlay ?? document.createElement('div');
16
+ overlayDefault.id = 'zcomponent-overlay';
17
+ if (!options?.overlay) {
18
+ document.body.append(overlayDefault);
19
+ }
15
20
  const size = new Observable([canvas.clientWidth, canvas.clientHeight]);
16
21
  const resizeObserver = new ResizeObserver(entries => {
17
22
  for (const entry of entries) {
@@ -21,12 +26,29 @@ export const CanvasContext = defineContextType((ctx, canvas) => {
21
26
  }
22
27
  });
23
28
  resizeObserver.observe(canvas);
29
+ const onBeforeRender = new Event();
30
+ let lastRect;
31
+ onBeforeRender.bindfn(() => {
32
+ const rect = canvas.getBoundingClientRect();
33
+ if (lastRect && lastRect.top === rect.top && lastRect.left === rect.left && lastRect.width === rect.width && lastRect.height === rect.height)
34
+ return;
35
+ overlayDefault.style.top = rect.top.toString() + 'px';
36
+ overlayDefault.style.left = rect.left.toString() + 'px';
37
+ overlayDefault.style.width = rect.width.toString() + 'px';
38
+ overlayDefault.style.height = rect.height.toString() + 'px';
39
+ lastRect = rect;
40
+ });
41
+ const onAfterRender = new Event();
24
42
  return {
25
43
  canvas,
26
- onBeforeRender: new Event(),
27
- onAfterRender: new Event(),
44
+ onBeforeRender,
45
+ onAfterRender,
28
46
  size,
47
+ overlayDefault,
48
+ overlay: new Observable(overlayDefault, undefined, false),
29
49
  dispose: () => {
50
+ onBeforeRender.clear();
51
+ onAfterRender.clear();
30
52
  resizeObserver.disconnect();
31
53
  }
32
54
  };
@@ -34,6 +56,9 @@ export const CanvasContext = defineContextType((ctx, canvas) => {
34
56
  export function useCanvas(mgr) {
35
57
  return mgr.get(CanvasContext).canvas;
36
58
  }
59
+ export function useOverlay(mgr) {
60
+ return mgr.get(CanvasContext).overlay;
61
+ }
37
62
  export function useCanvasSize(mgr) {
38
63
  return mgr.get(CanvasContext).size;
39
64
  }
@@ -27,12 +27,12 @@ export interface CookieConsentContext {
27
27
  showSettings: Observable<(() => void) | undefined>;
28
28
  }
29
29
  export declare const CookieConsentContext: import("../context").ContextTypeWithDefault<CookieConsentContext, []>;
30
- export declare function useCookieConsentFunctional(mgr: ContextManager): Observable<ConsentStatus>;
31
- export declare function useCookieConsentPerformance(mgr: ContextManager): Observable<ConsentStatus>;
32
- export declare function useCookieConsentMarketing(mgr: ContextManager): Observable<ConsentStatus>;
33
- export declare function useCookieConsentStatus(mgr: ContextManager): Observable<Status>;
30
+ export declare function useCookieConsentFunctional(mgr: ContextManager): Observable<ConsentStatus, never>;
31
+ export declare function useCookieConsentPerformance(mgr: ContextManager): Observable<ConsentStatus, never>;
32
+ export declare function useCookieConsentMarketing(mgr: ContextManager): Observable<ConsentStatus, never>;
33
+ export declare function useCookieConsentStatus(mgr: ContextManager): Observable<Status, never>;
34
34
  export declare function registerPerformanceVendor(mgr: ContextManager, vendor: Vendor): void;
35
35
  export declare function registerMarketingVendor(mgr: ContextManager, vendor: Vendor): void;
36
36
  export declare function usePerformanceVendors(mgr: ContextManager): Vendor[];
37
37
  export declare function useMarketingVendors(mgr: ContextManager): Vendor[];
38
- export declare function useShowCookieSettings(mgr: ContextManager): Observable<(() => void) | undefined>;
38
+ export declare function useShowCookieSettings(mgr: ContextManager): Observable<(() => void) | undefined, never>;
@@ -7,3 +7,4 @@ export interface EnvirontmentContext {
7
7
  export declare const EnvironmentContext: import("../context").ContextTypeWithDefault<EnvirontmentContext, []>;
8
8
  export declare function isDesignTime(ctx: ContextManager): boolean;
9
9
  export declare function isEditTime(ctx: ContextManager): boolean;
10
+ export declare function isDevelopmentBuild(ctx: ContextManager): boolean;
@@ -12,3 +12,6 @@ export function isDesignTime(ctx) {
12
12
  export function isEditTime(ctx) {
13
13
  return ctx.get(EnvironmentContext).editTime.value;
14
14
  }
15
+ export function isDevelopmentBuild(ctx) {
16
+ return (typeof process !== 'undefined' && process?.env?.NODE_ENV === 'development');
17
+ }
@@ -11,13 +11,13 @@ export interface LoadContext {
11
11
  startWhenLoaded: () => void;
12
12
  }
13
13
  export declare const LoadContext: import("../context").ContextTypeWithDefault<LoadContext, []>;
14
- export declare function useIsLoaded(mgr: ContextManager): Observable<boolean>;
14
+ export declare function useIsLoaded(mgr: ContextManager): Observable<boolean, never>;
15
15
  export declare function isLoaded(mgr: ContextManager): boolean;
16
- export declare function useIsStarted(mgr: ContextManager): Observable<boolean>;
16
+ export declare function useIsStarted(mgr: ContextManager): Observable<boolean, never>;
17
17
  export declare function isStarted(mgr: ContextManager): boolean;
18
- export declare function useIsConstructed(mgr: ContextManager): Observable<boolean>;
18
+ export declare function useIsConstructed(mgr: ContextManager): Observable<boolean, never>;
19
19
  export declare function isConstructed(mgr: ContextManager): boolean;
20
- export declare function useLoadPercent(mgr: ContextManager): Observable<number>;
20
+ export declare function useLoadPercent(mgr: ContextManager): Observable<number, never>;
21
21
  export declare function registerLoadable(mgr: ContextManager, p: Promise<any>): void;
22
22
  export declare function start(mgr: ContextManager): void;
23
23
  export declare function startWhenLoaded(mgr: ContextManager): void;
package/lib/event.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { Observable } from "./observable";
2
2
  export declare class Event<Args extends Array<any> = []> {
3
- hasBindings: Observable<boolean>;
3
+ hasBindings: Observable<boolean, never>;
4
4
  private _funcs;
5
5
  private _emitting;
6
6
  private _toUnbind;
@@ -1,4 +1,5 @@
1
- export declare class Observable<T> {
1
+ declare type Resolved<T, M> = [T] extends [never] ? M : T;
2
+ export declare class Observable<T = never, M extends any[] | [] | never = never> {
2
3
  private _default;
3
4
  private _deep;
4
5
  private _proxies;
@@ -6,11 +7,13 @@ export declare class Observable<T> {
6
7
  private _nextToken;
7
8
  private _handlersByToken;
8
9
  private _tokenByHandler;
9
- constructor(_default: T, withHandler?: ((v: T) => void), _deep?: boolean);
10
- get value(): T;
10
+ constructor(def: M, withHandler?: ((v: M) => void), deep?: boolean);
11
+ constructor(def: T, withHandler?: ((v: T) => void), deep?: boolean);
12
+ get value(): Resolved<T, M>;
11
13
  private _wrap;
12
- set value(v: T | undefined);
13
- withValue(fn: (v: T) => void): number;
14
- removeWithValue(fnOrToken: number | ((v: T) => void)): void;
14
+ set value(v: Resolved<T, M> | undefined);
15
+ withValue(fn: (v: Resolved<T, M>) => void): number;
16
+ removeWithValue(fnOrToken: number | ((v: Resolved<T, M>) => void)): void;
15
17
  private _emitValue;
16
18
  }
19
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zcomponent/core",
3
- "version": "0.0.2",
3
+ "version": "0.0.5",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",