@prefecthq/graphs 0.1.1

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 (48) hide show
  1. package/README.md +22 -0
  2. package/dist/graphs.mjs +15118 -0
  3. package/dist/graphs.mjs.map +1 -0
  4. package/dist/graphs.umd.js +1057 -0
  5. package/dist/graphs.umd.js.map +1 -0
  6. package/dist/style.css +1 -0
  7. package/dist/types/demo/App.vue.d.ts +44 -0
  8. package/dist/types/demo/components/ComponentPage.vue.d.ts +97 -0
  9. package/dist/types/demo/components/ContextSidebar.vue.d.ts +44 -0
  10. package/dist/types/demo/components/HashLink.vue.d.ts +65 -0
  11. package/dist/types/demo/components/PContextAccordionItem.vue.d.ts +75 -0
  12. package/dist/types/demo/components/ResizableSection.vue.d.ts +48 -0
  13. package/dist/types/demo/components/contextAccordionChildItem.d.ts +5 -0
  14. package/dist/types/demo/components/router.d.ts +3 -0
  15. package/dist/types/demo/main.d.ts +2 -0
  16. package/dist/types/demo/router/index.d.ts +3 -0
  17. package/dist/types/demo/router/menu.d.ts +4 -0
  18. package/dist/types/demo/router/routeRecords.d.ts +5 -0
  19. package/dist/types/demo/router/routeRecordsFlat.d.ts +4 -0
  20. package/dist/types/demo/sections/Data.vue.d.ts +44 -0
  21. package/dist/types/demo/sections/Home.vue.d.ts +44 -0
  22. package/dist/types/demo/sections/components/FlowRunTimelineDemo.vue.d.ts +44 -0
  23. package/dist/types/demo/sections/components/HelloWorld.vue.d.ts +44 -0
  24. package/dist/types/demo/sections/components/TimescaleTable.vue.d.ts +81 -0
  25. package/dist/types/demo/sections/components/index.d.ts +2 -0
  26. package/dist/types/demo/sections/index.d.ts +2 -0
  27. package/dist/types/demo/utilities/randomColor.d.ts +5 -0
  28. package/dist/types/demo/utilities/randomDate.d.ts +7 -0
  29. package/dist/types/demo/utilities/randomStarName.d.ts +4 -0
  30. package/dist/types/demo/utilities/starnames/index.d.ts +3 -0
  31. package/dist/types/demo/utilities/starnames/names.d.ts +2 -0
  32. package/dist/types/demo/utilities/starnames/prefixes.d.ts +2 -0
  33. package/dist/types/demo/utilities/starnames/suffixes.d.ts +2 -0
  34. package/dist/types/demo/utilities/timescaleData.d.ts +20 -0
  35. package/dist/types/src/FlowRunTimeline.vue.d.ts +66 -0
  36. package/dist/types/src/index.d.ts +1 -0
  37. package/dist/types/src/models/FlowRunTimeline.d.ts +15 -0
  38. package/dist/types/src/models/index.d.ts +1 -0
  39. package/dist/types/src/pixiFunctions/index.d.ts +4 -0
  40. package/dist/types/src/pixiFunctions/initBitmapFonts.d.ts +2 -0
  41. package/dist/types/src/pixiFunctions/initPixiApp.d.ts +2 -0
  42. package/dist/types/src/pixiFunctions/initViewport.d.ts +3 -0
  43. package/dist/types/src/pixiFunctions/timelineGuides.d.ts +17 -0
  44. package/dist/types/src/utilities/index.d.ts +2 -0
  45. package/dist/types/src/utilities/math.d.ts +13 -0
  46. package/dist/types/src/utilities/time.d.ts +16 -0
  47. package/dist/types/vite.config.d.ts +2 -0
  48. package/package.json +70 -0
@@ -0,0 +1,81 @@
1
+ import { TimescaleItem } from '../../utilities/timescaleData';
2
+ declare const _default: {
3
+ new (...args: any[]): {
4
+ $: import("vue").ComponentInternalInstance;
5
+ $data: {};
6
+ $props: Partial<{
7
+ data: TimescaleItem[];
8
+ }> & Omit<Readonly<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
9
+ data?: TimescaleItem[] | undefined;
10
+ }>, {
11
+ data: () => never[];
12
+ }>>> & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, "data">;
13
+ $attrs: {
14
+ [x: string]: unknown;
15
+ };
16
+ $refs: {
17
+ [x: string]: unknown;
18
+ };
19
+ $slots: Readonly<{
20
+ [name: string]: import("vue").Slot | undefined;
21
+ }>;
22
+ $root: import("vue").ComponentPublicInstance<{}, {}, {}, {}, {}, {}, {}, {}, false, import("vue").ComponentOptionsBase<any, any, any, any, any, any, any, any, any, {}, {}, string>, {}> | null;
23
+ $parent: import("vue").ComponentPublicInstance<{}, {}, {}, {}, {}, {}, {}, {}, false, import("vue").ComponentOptionsBase<any, any, any, any, any, any, any, any, any, {}, {}, string>, {}> | null;
24
+ $emit: (event: string, ...args: any[]) => void;
25
+ $el: any;
26
+ $options: import("vue").ComponentOptionsBase<Readonly<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
27
+ data?: TimescaleItem[] | undefined;
28
+ }>, {
29
+ data: () => never[];
30
+ }>>>, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, {
31
+ data: TimescaleItem[];
32
+ }, {}, string> & {
33
+ beforeCreate?: ((() => void) | (() => void)[]) | undefined;
34
+ created?: ((() => void) | (() => void)[]) | undefined;
35
+ beforeMount?: ((() => void) | (() => void)[]) | undefined;
36
+ mounted?: ((() => void) | (() => void)[]) | undefined;
37
+ beforeUpdate?: ((() => void) | (() => void)[]) | undefined;
38
+ updated?: ((() => void) | (() => void)[]) | undefined;
39
+ activated?: ((() => void) | (() => void)[]) | undefined;
40
+ deactivated?: ((() => void) | (() => void)[]) | undefined;
41
+ beforeDestroy?: ((() => void) | (() => void)[]) | undefined;
42
+ beforeUnmount?: ((() => void) | (() => void)[]) | undefined;
43
+ destroyed?: ((() => void) | (() => void)[]) | undefined;
44
+ unmounted?: ((() => void) | (() => void)[]) | undefined;
45
+ renderTracked?: (((e: import("vue").DebuggerEvent) => void) | ((e: import("vue").DebuggerEvent) => void)[]) | undefined;
46
+ renderTriggered?: (((e: import("vue").DebuggerEvent) => void) | ((e: import("vue").DebuggerEvent) => void)[]) | undefined;
47
+ errorCaptured?: (((err: unknown, instance: import("vue").ComponentPublicInstance<{}, {}, {}, {}, {}, {}, {}, {}, false, import("vue").ComponentOptionsBase<any, any, any, any, any, any, any, any, any, {}, {}, string>, {}> | null, info: string) => boolean | void) | ((err: unknown, instance: import("vue").ComponentPublicInstance<{}, {}, {}, {}, {}, {}, {}, {}, false, import("vue").ComponentOptionsBase<any, any, any, any, any, any, any, any, any, {}, {}, string>, {}> | null, info: string) => boolean | void)[]) | undefined;
48
+ };
49
+ $forceUpdate: () => void;
50
+ $nextTick: typeof import("vue").nextTick;
51
+ $watch<T extends string | ((...args: any) => any)>(source: T, cb: T extends (...args: any) => infer R ? (args_0: R, args_1: R) => any : (...args: any) => any, options?: import("vue").WatchOptions<boolean> | undefined): import("vue").WatchStopHandle;
52
+ } & Readonly<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
53
+ data?: TimescaleItem[] | undefined;
54
+ }>, {
55
+ data: () => never[];
56
+ }>>> & import("vue").ShallowUnwrapRef<{}> & {} & import("vue").ComponentCustomProperties & {};
57
+ __isFragment?: undefined;
58
+ __isTeleport?: undefined;
59
+ __isSuspense?: undefined;
60
+ } & import("vue").ComponentOptionsBase<Readonly<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
61
+ data?: TimescaleItem[] | undefined;
62
+ }>, {
63
+ data: () => never[];
64
+ }>>>, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, {
65
+ data: TimescaleItem[];
66
+ }, {}, string> & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps;
67
+ export default _default;
68
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
69
+ type __VLS_TypePropsToRuntimeProps<T> = {
70
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
71
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
72
+ } : {
73
+ type: import('vue').PropType<T[K]>;
74
+ required: true;
75
+ };
76
+ };
77
+ type __VLS_WithDefaults<P, D> = {
78
+ [K in keyof Pick<P, keyof P>]: K extends keyof D ? P[K] & {
79
+ default: D[K];
80
+ } : P[K];
81
+ };
@@ -0,0 +1,2 @@
1
+ import { Section } from '../../router/routeRecords';
2
+ export declare const components: Section;
@@ -0,0 +1,2 @@
1
+ import { Section } from '../router/routeRecords';
2
+ export declare const sections: Section;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generates a psuedo-random hex color
3
+ * @returns string - a hex color in the format #000000
4
+ */
5
+ export declare const randomColor: () => string;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * A method that generates a random date (optional: between two dates)
3
+ * @param start (optional) - defaults to random date in the past
4
+ * @param end (optional) - defaults to now
5
+ * @returns Date
6
+ */
7
+ export declare const randomDate: (start?: Date, end?: Date) => Date;
@@ -0,0 +1,4 @@
1
+ /**
2
+ * @returns string - a random star name
3
+ */
4
+ export declare const randomStarName: () => string;
@@ -0,0 +1,3 @@
1
+ export * from './names';
2
+ export * from './prefixes';
3
+ export * from './suffixes';
@@ -0,0 +1,2 @@
1
+ declare const names: string[];
2
+ export { names };
@@ -0,0 +1,2 @@
1
+ declare const prefixes: string[];
2
+ export { prefixes };
@@ -0,0 +1,2 @@
1
+ declare const suffixes: string[];
2
+ export { suffixes };
@@ -0,0 +1,20 @@
1
+ export type State = 'completed' | 'running' | 'scheduled' | 'pending' | 'failed' | 'cancelled' | 'crashed' | 'paused';
2
+ export type Shape = 'linear' | 'fanOut' | 'fanOutIn';
3
+ export type DataOptions = {
4
+ start?: Date;
5
+ end?: Date;
6
+ shape?: Shape;
7
+ size?: number;
8
+ fanMultiplier?: number;
9
+ };
10
+ type TimescaleItem = {
11
+ id: string;
12
+ label: string;
13
+ start: Date;
14
+ end: Date | null;
15
+ upstreamDependencies: TimescaleItem[];
16
+ state: State;
17
+ };
18
+ declare const generateTimescaleData: (options?: DataOptions) => TimescaleItem[];
19
+ export type { TimescaleItem };
20
+ export { generateTimescaleData };
@@ -0,0 +1,66 @@
1
+ import { TimelineNodeData } from './models';
2
+ declare const _default: {
3
+ new (...args: any[]): {
4
+ $: import("vue").ComponentInternalInstance;
5
+ $data: {};
6
+ $props: Partial<{}> & Omit<Readonly<import("vue").ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{
7
+ graphData: TimelineNodeData[];
8
+ isRunning?: boolean | undefined;
9
+ }>>> & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, never>;
10
+ $attrs: {
11
+ [x: string]: unknown;
12
+ };
13
+ $refs: {
14
+ [x: string]: unknown;
15
+ };
16
+ $slots: Readonly<{
17
+ [name: string]: import("vue").Slot | undefined;
18
+ }>;
19
+ $root: import("vue").ComponentPublicInstance<{}, {}, {}, {}, {}, {}, {}, {}, false, import("vue").ComponentOptionsBase<any, any, any, any, any, any, any, any, any, {}, {}, string>, {}> | null;
20
+ $parent: import("vue").ComponentPublicInstance<{}, {}, {}, {}, {}, {}, {}, {}, false, import("vue").ComponentOptionsBase<any, any, any, any, any, any, any, any, any, {}, {}, string>, {}> | null;
21
+ $emit: (event: string, ...args: any[]) => void;
22
+ $el: any;
23
+ $options: import("vue").ComponentOptionsBase<Readonly<import("vue").ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{
24
+ graphData: TimelineNodeData[];
25
+ isRunning?: boolean | undefined;
26
+ }>>>, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, {}, {}, string> & {
27
+ beforeCreate?: ((() => void) | (() => void)[]) | undefined;
28
+ created?: ((() => void) | (() => void)[]) | undefined;
29
+ beforeMount?: ((() => void) | (() => void)[]) | undefined;
30
+ mounted?: ((() => void) | (() => void)[]) | undefined;
31
+ beforeUpdate?: ((() => void) | (() => void)[]) | undefined;
32
+ updated?: ((() => void) | (() => void)[]) | undefined;
33
+ activated?: ((() => void) | (() => void)[]) | undefined;
34
+ deactivated?: ((() => void) | (() => void)[]) | undefined;
35
+ beforeDestroy?: ((() => void) | (() => void)[]) | undefined;
36
+ beforeUnmount?: ((() => void) | (() => void)[]) | undefined;
37
+ destroyed?: ((() => void) | (() => void)[]) | undefined;
38
+ unmounted?: ((() => void) | (() => void)[]) | undefined;
39
+ renderTracked?: (((e: import("vue").DebuggerEvent) => void) | ((e: import("vue").DebuggerEvent) => void)[]) | undefined;
40
+ renderTriggered?: (((e: import("vue").DebuggerEvent) => void) | ((e: import("vue").DebuggerEvent) => void)[]) | undefined;
41
+ errorCaptured?: (((err: unknown, instance: import("vue").ComponentPublicInstance<{}, {}, {}, {}, {}, {}, {}, {}, false, import("vue").ComponentOptionsBase<any, any, any, any, any, any, any, any, any, {}, {}, string>, {}> | null, info: string) => boolean | void) | ((err: unknown, instance: import("vue").ComponentPublicInstance<{}, {}, {}, {}, {}, {}, {}, {}, false, import("vue").ComponentOptionsBase<any, any, any, any, any, any, any, any, any, {}, {}, string>, {}> | null, info: string) => boolean | void)[]) | undefined;
42
+ };
43
+ $forceUpdate: () => void;
44
+ $nextTick: typeof import("vue").nextTick;
45
+ $watch<T extends string | ((...args: any) => any)>(source: T, cb: T extends (...args: any) => infer R ? (args_0: R, args_1: R) => any : (...args: any) => any, options?: import("vue").WatchOptions<boolean> | undefined): import("vue").WatchStopHandle;
46
+ } & Readonly<import("vue").ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{
47
+ graphData: TimelineNodeData[];
48
+ isRunning?: boolean | undefined;
49
+ }>>> & import("vue").ShallowUnwrapRef<{}> & {} & import("vue").ComponentCustomProperties & {};
50
+ __isFragment?: undefined;
51
+ __isTeleport?: undefined;
52
+ __isSuspense?: undefined;
53
+ } & import("vue").ComponentOptionsBase<Readonly<import("vue").ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{
54
+ graphData: TimelineNodeData[];
55
+ isRunning?: boolean | undefined;
56
+ }>>>, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, {}, {}, string> & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps;
57
+ export default _default;
58
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
59
+ type __VLS_TypePropsToRuntimeProps<T> = {
60
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
61
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
62
+ } : {
63
+ type: import('vue').PropType<T[K]>;
64
+ required: true;
65
+ };
66
+ };
@@ -0,0 +1 @@
1
+ export { default as FlowRunTimeline } from './FlowRunTimeline.vue';
@@ -0,0 +1,15 @@
1
+ import { IBitmapTextStyle } from 'pixi.js';
2
+ export type State = 'completed' | 'running' | 'scheduled' | 'pending' | 'failed' | 'cancelled' | 'crashed' | 'paused';
3
+ export type TimelineNodeData = {
4
+ id: string;
5
+ label: string;
6
+ start: Date;
7
+ end: Date | null;
8
+ upstreamDependencies: TimelineNodeData[];
9
+ state: State;
10
+ };
11
+ export type TextStyles = {
12
+ nodeTextDefault: Partial<IBitmapTextStyle>;
13
+ nodeTextInverse: Partial<IBitmapTextStyle>;
14
+ timeMarkerLabel: Partial<IBitmapTextStyle>;
15
+ };
@@ -0,0 +1 @@
1
+ export * from './FlowRunTimeline';
@@ -0,0 +1,4 @@
1
+ export * from './initBitmapFonts';
2
+ export * from './initPixiApp';
3
+ export * from './initViewport';
4
+ export * from './timelineGuides';
@@ -0,0 +1,2 @@
1
+ import { TextStyles } from '../models';
2
+ export declare function initBitmapFonts(devicePixelRatio: number): Promise<TextStyles>;
@@ -0,0 +1,2 @@
1
+ import { Application } from 'pixi.js';
2
+ export declare function initPixiApp(stage: HTMLElement): Application;
@@ -0,0 +1,3 @@
1
+ import { Viewport } from 'pixi-viewport';
2
+ import { Application } from 'pixi.js';
3
+ export declare function initViewport(stage: HTMLElement, app: Application): Viewport;
@@ -0,0 +1,17 @@
1
+ import { Viewport } from 'pixi-viewport';
2
+ import { Application, Container } from 'pixi.js';
3
+ import { TextStyles } from '../models';
4
+ type TimelineGuidesProps = {
5
+ app: Application;
6
+ viewport: Viewport;
7
+ stage: HTMLElement | undefined;
8
+ timelineGuidesContainer: Container;
9
+ minimumStartDate: Date;
10
+ overallGraphWidth: number;
11
+ isRunning: boolean | undefined;
12
+ dateScale: (x: number) => number;
13
+ xScale: (date: Date) => number;
14
+ textStyles: TextStyles;
15
+ };
16
+ export declare function initTimelineGuides(props: TimelineGuidesProps): void;
17
+ export {};
@@ -0,0 +1,2 @@
1
+ export * from './math';
2
+ export * from './time';
@@ -0,0 +1,13 @@
1
+ export declare const abs: (x: number) => number, atan2: (y: number, x: number) => number, cos: (x: number) => number, max: (...values: number[]) => number, min: (...values: number[]) => number, sin: (x: number) => number, tan: (x: number) => number, sqrt: (x: number) => number, pow: (x: number, y: number) => number, floor: (x: number) => number, ceil: (x: number) => number, random: () => number;
2
+ export declare const epsilon = 1e-12;
3
+ export declare const pi: number;
4
+ export declare const halfPi: number;
5
+ export declare const tau: number;
6
+ export declare const acos: (x: number) => number;
7
+ export declare const asin: (x: number) => number;
8
+ export declare const pow2: (n: number) => number;
9
+ export declare const choice: <T>(list: T[] | readonly T[]) => T;
10
+ export declare const range: (min: number, max: number) => number[];
11
+ export declare const uniform: (min: number, max: number) => number;
12
+ export declare const coinflip: (weight: number) => boolean;
13
+ export declare const weightedNumber: () => number;
@@ -0,0 +1,16 @@
1
+ export declare const intervals: {
2
+ readonly year: 31536000;
3
+ readonly day: 86400;
4
+ readonly hour: 3600;
5
+ readonly minute: 60;
6
+ readonly second: 1;
7
+ };
8
+ export declare function secondsToString(input: number, showOnes?: boolean): string;
9
+ export declare function secondsToApproximateString(input: number, showOnes?: boolean): string;
10
+ export declare function getDateBounds(datesArray: {
11
+ start: Date;
12
+ end: Date | null;
13
+ }[]): {
14
+ min: Date;
15
+ max: Date;
16
+ };
@@ -0,0 +1,2 @@
1
+ declare const _default: import("vite").UserConfigExport;
2
+ export default _default;
package/package.json ADDED
@@ -0,0 +1,70 @@
1
+ {
2
+ "name": "@prefecthq/graphs",
3
+ "private": false,
4
+ "version": "0.1.1",
5
+ "description": "Large scale graphs designed for Prefect",
6
+ "scripts": {
7
+ "serve": "vite --host --mode=demo",
8
+ "dev": "vue-tsc -w & tsc-alias -w & vite build -w",
9
+ "build": "vue-tsc && tsc-alias && vite build",
10
+ "build:demo": "vite build --mode=demo",
11
+ "lint": "eslint src",
12
+ "lint:fix": "eslint src --fix",
13
+ "changelog": "auto-changelog --package --commit-limit 0",
14
+ "version": "npm run changelog && git add CHANGELOG.md"
15
+ },
16
+ "main": "./dist/prefect-graphs.umd.js",
17
+ "module": "./dist/prefect-graphs.mjs",
18
+ "exports": {
19
+ ".": {
20
+ "import": "./dist/prefect-graphs.mjs",
21
+ "require": "./dist/prefect-graphs.umd.js"
22
+ },
23
+ "./dist/style.css": "./dist/style.css"
24
+ },
25
+ "files": [
26
+ "dist"
27
+ ],
28
+ "types": "./dist/types/src/index.d.ts",
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "git+https://github.com/PrefectHQ/graphs.git"
32
+ },
33
+ "author": "",
34
+ "license": "ISC",
35
+ "bugs": {
36
+ "url": "https://github.com/PrefectHQ/graphs/issues"
37
+ },
38
+ "homepage": "https://github.com/PrefectHQ/graphs#readme",
39
+ "devDependencies": {
40
+ "@fontsource/inconsolata": "^4.5.9",
41
+ "@fontsource/inter": "4.5.14",
42
+ "@prefecthq/eslint-config": "1.0.17",
43
+ "@types/fontfaceobserver": "^2.1.0",
44
+ "@types/node": "^18.11.11",
45
+ "@vitejs/plugin-vue": "4.0.0",
46
+ "auto-changelog": "^2.4.0",
47
+ "autoprefixer": "10.4.13",
48
+ "eslint": "8.29.0",
49
+ "postcss": "8.4.19",
50
+ "tailwindcss": "3.2.4",
51
+ "tsc-alias": "1.8.2",
52
+ "typescript": "^4.9.3",
53
+ "vite": "4.0.1",
54
+ "vite-svg-loader": "^3.6.0",
55
+ "vue-tsc": "1.0.9"
56
+ },
57
+ "peerDependencies": {
58
+ "@prefecthq/prefect-design": "^1.1.35",
59
+ "vue": "^3.2.45",
60
+ "vue-router": "^4.0.12"
61
+ },
62
+ "dependencies": {
63
+ "@pixi-essentials/cull": "^1.1.0",
64
+ "@prefecthq/vue-compositions": "1.0.0",
65
+ "date-fns": "2.29.3",
66
+ "fontfaceobserver": "^2.3.0",
67
+ "pixi-viewport": "^4.38.0",
68
+ "pixi.js": "^6.5.8"
69
+ }
70
+ }