canvasengine 2.0.0-beta.11 → 2.0.0-beta.13

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.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/engine/directive.ts","../src/engine/utils.ts","../src/directives/KeyboardControls.ts","../src/directives/Scheduler.ts","../src/directives/ViewportFollow.ts","../src/directives/Sound.ts","../src/directives/Drag.ts","../src/directives/Transition.ts","../src/index.ts","../src/components/Canvas.ts","../src/engine/reactive.ts","../src/hooks/useProps.ts","../src/components/DisplayObject.ts","../src/components/Container.ts","../src/components/Graphic.ts","../src/engine/signal.ts","../src/components/Scene.ts","../src/components/ParticleEmitter.ts","../src/components/Sprite.ts","../src/engine/animation.ts","../src/components/Video.ts","../src/components/Text.ts","../src/engine/trigger.ts","../src/components/TilingSprite.ts","../src/components/Viewport.ts","../src/components/NineSliceSprite.ts","../src/engine/bootstrap.ts","../src/utils/Ease.ts","../src/utils/RadialGradient.ts"],"sourcesContent":["import { Element } from \"./reactive\"\n\nexport const directives: { [key: string]: any } = {}\n\nexport abstract class Directive {\n abstract onDestroy();\n abstract onInit(element: Element<any>);\n abstract onMount(element: Element<any>);\n abstract onUpdate(props: any);\n}\n\nexport function registerDirective(name: string, directive: any) {\n directives[name] = directive\n}\n\nexport function applyDirective(element: Element, directiveName: string) {\n if (!directives[directiveName]) {\n return null\n }\n const directive = new directives[directiveName]()\n directive.onInit?.(element)\n return directive\n}","import { ObservablePoint } from \"pixi.js\"\n\n/**\n * Checks if code is running in a browser environment\n * @returns {boolean} True if running in browser, false otherwise\n */\nexport function isBrowser(): boolean {\n return typeof window !== 'undefined'\n}\n\n/**\n * Returns current high-resolution timestamp\n * @returns {number} Current time in milliseconds\n */\nexport function preciseNow(): number {\n return typeof performance !== 'undefined' ? performance.now() : Date.now()\n}\n\n/**\n * Converts frames per second to milliseconds\n * @param {number} fps - Frames per second\n * @returns {number} Milliseconds per frame\n */\nexport function fps2ms(fps: number): number {\n return 1000 / fps\n}\n\n/**\n * Checks if a value is a Promise\n * @param {any} value - Value to check\n * @returns {boolean} True if value is a Promise, false otherwise\n */\nexport function isPromise(value: any): boolean {\n return value && value instanceof Promise\n}\n\nexport function arrayEquals(a: any[], b: any[]): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n const v = a[i];\n const bv = b[i];\n if (typeof v === 'object' && v !== null) {\n if (typeof bv !== 'object' || bv === null) return false;\n if (Array.isArray(v)) {\n if (!Array.isArray(bv) || !arrayEquals(v, bv)) return false;\n } else if (!objectEquals(v, bv)) {\n return false;\n }\n } else if (v !== bv) {\n return false;\n }\n }\n return true;\n}\n\nfunction objectEquals(a: object, b: object): boolean {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n for (let key of keysA) {\n if (!b.hasOwnProperty(key)) return false;\n if (!deepEquals(a[key], b[key])) return false;\n }\n return true;\n}\n\nfunction deepEquals(a: any, b: any): boolean {\n if (a === b) return true;\n if (typeof a !== typeof b) return false;\n if (typeof a === 'object' && a !== null) {\n if (Array.isArray(a)) {\n return Array.isArray(b) && arrayEquals(a, b);\n }\n return objectEquals(a, b);\n }\n return false;\n}\n\n/**\n * Checks if a value is a function\n * @param {unknown} val - Value to check\n * @returns {boolean} True if value is a function, false otherwise\n */\nexport function isFunction(val: unknown): boolean {\n return {}.toString.call(val) === '[object Function]'\n}\n\n/**\n * Checks if a value is a plain object\n * @param {unknown} val - Value to check\n * @returns {boolean} True if value is an object (not null and not array), false otherwise\n */\nexport function isObject(val: unknown): boolean {\n return typeof val == 'object' && val != null && !Array.isArray(val)\n}\n\n/**\n * Sets a value in an object using a dot notation path\n * @param {Record<string, any>} obj - Target object\n * @param {string | string[]} path - Path to set value at (e.g., 'a.b.c' or ['a', 'b', 'c'])\n * @param {any} value - Value to set\n * @param {boolean} onlyPlainObject - If true, only creates plain objects in path\n * @returns {Record<string, any>} Modified object\n */\nexport function set(\n obj: Record<string, any>, \n path: string | string[], \n value: any, \n onlyPlainObject = false\n): Record<string, any> {\n if (Object(obj) !== obj) return obj;\n\n if (typeof path === 'string') {\n path = path.split('.');\n }\n\n let len = path.length;\n if (!len) return obj;\n\n let current = obj;\n for (let i = 0; i < len - 1; i++) {\n let segment = path[i];\n let nextSegment: number | string = path[i + 1];\n let isNextNumeric = !isNaN(Number(nextSegment)) && isFinite(Number(nextSegment));\n\n if (!current[segment] || typeof current[segment] !== 'object') {\n current[segment] = (isNextNumeric && !onlyPlainObject) ? [] : {};\n }\n\n current = current[segment];\n }\n\n current[path[len - 1]] = value;\n\n return obj;\n}\n\n/**\n * Gets a value from an object using a dot notation path\n * @param {Record<string, any>} obj - Source object\n * @param {string} path - Path to get value from (e.g., 'a.b.c')\n * @returns {any} Value at path or undefined if not found\n */\nexport function get(obj: Record<string, any>, path: string): any {\n const keys = path.split('.');\n let current = obj;\n\n for (let key of keys) {\n if (current[key] === undefined) {\n return undefined;\n }\n current = current[key];\n }\n\n return current;\n}\n\n/**\n * Logs a message to console\n * @param {any} text - Message to log\n */\nexport function log(text: any): void {\n console.log(text)\n}\n\n/**\n * Logs an error message to console\n * @param {any} text - Error message to log\n */\nexport function error(text: any): void {\n console.error(text)\n}\n\n/**\n * Sets the position of an ObservablePoint using various input formats\n * @param {ObservablePoint} observablePoint - The point to modify\n * @param {Object | number | [number, number]} point - New position value\n */\nexport function setObservablePoint(\n observablePoint: ObservablePoint, \n point: { x: number, y: number } | number | [number, number]\n): void {\n if (typeof point === 'number') {\n observablePoint.set(point);\n }\n else if (Array.isArray(point)) {\n observablePoint.set(point[0], point[1]);\n }\n else {\n observablePoint.set(point.x, point.y);\n }\n}\n\n/**\n * Calculates the Euclidean distance between two points\n * @param {number} x1 - X coordinate of first point\n * @param {number} y1 - Y coordinate of first point\n * @param {number} x2 - X coordinate of second point\n * @param {number} y2 - Y coordinate of second point\n * @returns {number} Distance between the points\n */\nexport function calculateDistance(\n x1: number, \n y1: number, \n x2: number, \n y2: number\n): number {\n const dx = x1 - x2;\n const dy = y1 - y2;\n return Math.sqrt(dx * dx + dy * dy);\n}","import { Directive, registerDirective } from \"../engine/directive\";\nimport { Element } from \"../engine/reactive\";\nimport { fps2ms } from \"../engine/utils\";\n\nexport enum Input {\n Break = 'break',\n Backspace = 'backspace',\n Tab = 'tab',\n Clear = 'clear',\n Enter = 'enter',\n Shift = 'shift',\n Ctrl = 'ctrl',\n Alt = 'alt',\n Pause = 'pause/break',\n CapsLock = 'caps lock',\n Escape = 'escape',\n Conversion = 'conversion',\n NonConversion = 'non-conversion',\n Space = 'space',\n PageUp = 'page up',\n PageDown = 'page down',\n End = 'end',\n Home = 'home',\n Left = 4,\n Up = 1,\n Right = 2,\n Down = 3,\n Select = 'select',\n Print = 'print',\n Execute = 'execute',\n PrintScreen = 'Print Screen',\n Insert = 'insert',\n Delete = 'delete',\n Zero = '0',\n One = '1',\n Two = '2',\n Three = '3',\n Four = '4',\n Five = '5',\n Six = '6',\n Seven = '7',\n Height = '8',\n Nine = '9',\n Equal = '=',\n Semicolon = 'semicolon (firefox), equals',\n LessThan = '<',\n Equals = 'equals (firefox)',\n Beta = 'ß',\n At = '@',\n A = 'a',\n B = 'b',\n C = 'c',\n D = 'd',\n E = 'e',\n F = 'f',\n G = 'g',\n H = 'h',\n I = 'i',\n J = 'j',\n K = 'k',\n L = 'l',\n M = 'm',\n N = 'n',\n O = 'o',\n P = 'p',\n Q = 'q',\n R = 'r',\n S = 's',\n T = 't',\n U = 'u',\n V = 'v',\n W = 'w',\n X = 'x',\n Y = 'y',\n Z = 'z',\n SearchKey = 'Windows Key / Left ⌘ / Chromebook Search key',\n NumPad0 = 'numpad 0',\n NumPad1 = 'numpad 1',\n NumPad2 = 'numpad 2',\n NumPad3 = 'numpad 3',\n NumPad4 = 'numpad 4',\n NumPad5 = 'numpad 5',\n NumPad6 = 'numpad 6',\n NumPad7 = 'numpad 7',\n NumPad8 = 'numpad 8',\n NumPad9 = 'numpad 9',\n Multiply = 'multiply',\n Add = 'add',\n Subtract = 'subtract',\n DecimalPoint = 'decimal point',\n Divide = 'divide',\n F1 = 'f1',\n F2 = 'f2',\n F3 = 'f3',\n F4 = 'f4',\n F5 = 'f5',\n F6 = 'f6',\n F7 = 'f7',\n F8 = 'f8',\n F9 = 'f9',\n F10 = 'f10',\n F11 = 'f11',\n F12 = 'f12',\n F13 = 'f13',\n F14 = 'f14',\n F15 = 'f15',\n F16 = 'f16',\n F17 = 'f17',\n F18 = 'f18',\n F19 = 'f19',\n F20 = 'f20',\n F21 = 'f21',\n F22 = 'f22',\n F23 = 'f23',\n F24 = 'f24',\n NumLock = 'num lock',\n ScrollLock = 'scroll lock',\n CircumflexAccent = '^',\n ExclamationMark = '!',\n Hash = '#',\n Dollar = '$',\n AccentU = 'ù',\n PageBackward = 'page backward',\n PageForWard = 'page forward',\n Star = '*',\n DecreaseVolume = 'decrease volume level',\n IncreaseVolume = 'increase volume level',\n Next = 'next',\n Previous = 'previous',\n Stop = 'stop',\n PlayPause = 'play/pause',\n Email = 'e-mail',\n SemiColon = 'semi-colon / ñ',\n EqualSign = 'equal sign',\n Comma = 'comma',\n Dash = 'dash',\n FowardSlach = 'forward slash / ç',\n GraveAccent = 'grave accent / ñ / æ',\n OpenBracket = 'open bracket',\n BackSlach = 'back slash',\n CloseBracket = 'close bracket / å',\n SingleQuote = 'single quote / ø',\n BackQuote = '`',\n Altgr = 'altgr'\n}\n\nexport interface ControlOptions {\n repeat?: boolean;\n bind: string | string[];\n keyUp?: Function;\n keyDown?: Function;\n delay?: number | {\n duration: number;\n otherControls?: (string)[];\n };\n}\nexport interface Controls {\n [controlName: string]: ControlOptions;\n}\n\n// keyboard handling\nconst keyCodeTable = {\n 3: 'break',\n 8: 'backspace', // backspace / delete\n 9: 'tab',\n 12: 'clear',\n 13: 'enter',\n 16: 'shift',\n 17: 'ctrl',\n 18: 'alt',\n 19: 'pause/break',\n 20: 'caps lock',\n 27: 'escape',\n 28: 'conversion',\n 29: 'non-conversion',\n 32: 'space',\n 33: 'page up',\n 34: 'page down',\n 35: 'end',\n 36: 'home',\n 37: 'left',\n 38: 'up',\n 39: 'right',\n 40: 'down',\n 41: 'select',\n 42: 'print',\n 43: 'execute',\n 44: 'Print Screen',\n 45: 'insert',\n 46: 'delete',\n 48: 'n0',\n 49: 'n1',\n 50: 'n2',\n 51: 'n3',\n 52: 'n4',\n 53: 'n5',\n 54: 'n6',\n 55: 'n7',\n 56: 'n8',\n 57: 'n9',\n 58: ':',\n 59: 'semicolon (firefox), equals',\n 60: '<',\n 61: 'equals (firefox)',\n 63: 'ß',\n 64: '@',\n 65: 'a',\n 66: 'b',\n 67: 'c',\n 68: 'd',\n 69: 'e',\n 70: 'f',\n 71: 'g',\n 72: 'h',\n 73: 'i',\n 74: 'j',\n 75: 'k',\n 76: 'l',\n 77: 'm',\n 78: 'n',\n 79: 'o',\n 80: 'p',\n 81: 'q',\n 82: 'r',\n 83: 's',\n 84: 't',\n 85: 'u',\n 86: 'v',\n 87: 'w',\n 88: 'x',\n 89: 'y',\n 90: 'z',\n 91: 'Windows Key / Left ⌘ / Chromebook Search key',\n 92: 'right window key',\n 93: 'Windows Menu / Right ⌘',\n 96: 'numpad 0',\n 97: 'numpad 1',\n 98: 'numpad 2',\n 99: 'numpad 3',\n 100: 'numpad 4',\n 101: 'numpad 5',\n 102: 'numpad 6',\n 103: 'numpad 7',\n 104: 'numpad 8',\n 105: 'numpad 9',\n 106: 'multiply',\n 107: 'add',\n 108: 'numpad period (firefox)',\n 109: 'subtract',\n 110: 'decimal point',\n 111: 'divide',\n 112: 'f1',\n 113: 'f2',\n 114: 'f3',\n 115: 'f4',\n 116: 'f5',\n 117: 'f6',\n 118: 'f7',\n 119: 'f8',\n 120: 'f9',\n 121: 'f10',\n 122: 'f11',\n 123: 'f12',\n 124: 'f13',\n 125: 'f14',\n 126: 'f15',\n 127: 'f16',\n 128: 'f17',\n 129: 'f18',\n 130: 'f19',\n 131: 'f20',\n 132: 'f21',\n 133: 'f22',\n 134: 'f23',\n 135: 'f24',\n 144: 'num lock',\n 145: 'scroll lock',\n 160: '^',\n 161: '!',\n 163: '#',\n 164: '$',\n 165: 'ù',\n 166: 'page backward',\n 167: 'page forward',\n 169: 'closing paren (AZERTY)',\n 170: '*',\n 171: '~ + * key',\n 173: 'minus (firefox), mute/unmute',\n 174: 'decrease volume level',\n 175: 'increase volume level',\n 176: 'next',\n 177: 'previous',\n 178: 'stop',\n 179: 'play/pause',\n 180: 'e-mail',\n 181: 'mute/unmute (firefox)',\n 182: 'decrease volume level (firefox)',\n 183: 'increase volume level (firefox)',\n 186: 'semi-colon / ñ',\n 187: 'equal sign',\n 188: 'comma',\n 189: 'dash',\n 190: 'period',\n 191: 'forward slash / ç',\n 192: 'grave accent / ñ / æ',\n 193: '?, / or °',\n 194: 'numpad period (chrome)',\n 219: 'open bracket',\n 220: 'back slash',\n 221: 'close bracket / å',\n 222: 'single quote / ø',\n 223: '`',\n 224: 'left or right ⌘ key (firefox)',\n 225: 'altgr',\n 226: '< /git >',\n 230: 'GNOME Compose Key',\n 231: 'ç',\n 233: 'XF86Forward',\n 234: 'XF86Back',\n 240: 'alphanumeric',\n 242: 'hiragana/katakana',\n 243: 'half-width/full-width',\n 244: 'kanji',\n 255: 'toggle touchpad'\n};\n\nconst inverse = (obj) => {\n const newObj = {}\n for (let key in obj) {\n const val = obj[key]\n newObj[val] = key\n }\n return newObj\n}\n\nconst inverseKeyCodeTable = inverse(keyCodeTable)\n\ntype BoundKey = { actionName: string, options: ControlOptions, parameters?: any }\n\nexport class KeyboardControls extends Directive {\n private keyState: {\n [keyName: string]: {\n isDown: boolean,\n count: number\n } | null\n } = {}\n private boundKeys: {\n [keyName: string]: BoundKey\n } = {}\n private stop: boolean = false\n private lastKeyPressed: number | null = null\n private _controlsOptions: Controls = {}\n private interval: any\n // TODO: This should be dynamic\n private serverFps: number = 60\n private directionState: {\n up: boolean,\n down: boolean,\n left: boolean,\n right: boolean\n } = {\n up: false,\n down: false,\n left: false,\n right: false\n };\n\n onInit(element: Element) {\n this.setupListeners();\n this.setInputs(element.props.controls.value)\n // The processing is outside the rendering loop because if the FPS are lower (or higher) then the sending to the server would be slower or faster. Here it is constant\n this.interval = setInterval(() => {\n this.preStep()\n }, fps2ms(this.serverFps ?? 60))\n }\n\n onMount(element: Element) {}\n\n onUpdate(props) {\n this.setInputs(props)\n }\n\n onDestroy() {\n clearInterval(this.interval)\n document.removeEventListener('keydown', (e) => { this.onKeyChange(e, true); });\n document.removeEventListener('keyup', (e) => { this.onKeyChange(e, false); });\n }\n\n /** @internal */\n preStep() {\n if (this.stop) return;\n\n const direction = this.getDirection();\n if (direction !== 'none') {\n // Trigger only the composite direction\n const directionControl = this.boundKeys[direction];\n if (directionControl) {\n const { keyDown } = directionControl.options;\n if (keyDown ) {\n this.applyInput(direction);\n }\n }\n } else {\n // Process other controls as before\n const boundKeys = Object.keys(this.boundKeys);\n for (let keyName of boundKeys) {\n this.applyInput(keyName);\n }\n }\n }\n\n private applyInput(keyName: string) {\n const keyState = this.keyState[keyName];\n if (!keyState) return;\n const { isDown, count } = keyState;\n if (isDown) {\n const { repeat, keyDown } = this.boundKeys[keyName].options;\n if ((repeat || count == 0)) {\n let parameters = this.boundKeys[keyName].parameters;\n if (typeof parameters === \"function\") {\n parameters = parameters();\n }\n if (keyDown) {\n keyDown(this.boundKeys[keyName]);\n }\n this.keyState[keyName]!.count++;\n }\n }\n }\n\n private setupListeners() {\n document.addEventListener('keydown', (e) => { this.onKeyChange(e, true); });\n document.addEventListener('keyup', (e) => { this.onKeyChange(e, false); });\n }\n\n private bindKey(keys: Input | Input[], actionName: string, options: ControlOptions, parameters?: object) {\n if (!Array.isArray(keys)) keys = [keys] as Input[]\n const keyOptions = Object.assign({\n repeat: false\n }, options);\n (keys as Input[]).forEach(keyName => {\n this.boundKeys[keyName] = { actionName, options: keyOptions, parameters }\n })\n }\n\n private applyKeyDown(name: string) {\n const code = inverseKeyCodeTable[name]\n const e: any = new Event('keydown')\n e.keyCode = code\n this.onKeyChange(e, true)\n }\n\n private applyKeyUp(name: string) {\n const code = inverseKeyCodeTable[name]\n const e: any = new Event('keyup')\n e.keyCode = code\n this.onKeyChange(e, false)\n }\n\n private applyKeyPress(name: string): Promise<void> {\n return new Promise((resolve: any) => {\n this.applyKeyDown(name)\n setTimeout(() => {\n this.applyKeyUp(name)\n resolve()\n }, 200)\n })\n }\n\n private onKeyChange(e: KeyboardEvent, isDown: boolean) {\n e = (e || window.event) as KeyboardEvent;\n\n const keyName: string = keyCodeTable[e.keyCode];\n\n if (keyName && this.boundKeys[keyName]) {\n if (this.keyState[keyName] == null) {\n this.keyState[keyName] = {\n count: 0,\n isDown: true\n };\n }\n this.keyState[keyName]!.isDown = isDown;\n\n // key up, reset press count\n if (!isDown) {\n this.keyState[keyName]!.count = 0\n const { keyUp } = this.boundKeys[keyName].options\n if (keyUp) {\n keyUp(this.boundKeys[keyName]);\n }\n }\n\n // keep reference to the last key pressed to avoid duplicates\n this.lastKeyPressed = isDown ? e.keyCode : null;\n }\n\n if (keyName) {\n this.updateDirectionState(keyName, isDown);\n }\n }\n\n private updateDirectionState(keyName: string, isDown: boolean) {\n switch (keyName) {\n case 'up':\n this.directionState.up = isDown;\n break;\n case 'down':\n this.directionState.down = isDown;\n break;\n case 'left':\n this.directionState.left = isDown;\n break;\n case 'right':\n this.directionState.right = isDown;\n break;\n }\n }\n\n private getDirection(): string {\n const { up, down, left, right } = this.directionState;\n\n if (up && left) return 'up_left';\n if (up && right) return 'up_right';\n if (down && left) return 'down_left';\n if (down && right) return 'down_right';\n if (up) return 'up';\n if (down) return 'down';\n if (left) return 'left';\n if (right) return 'right';\n\n return 'none';\n }\n\n /**\n * From the name of the entry, we retrieve the control information\n * \n * ```ts \n * import { Input, inject, KeyboardControls } from '@rpgjs/client'\n * \n * const controls = inject(KeyboardControls)\n * controls.getControl(Input.Enter)\n\n * if (control) {\n * console.log(control.actionName) // action\n * }\n * ```\n * @title Get Control\n * @method getControl(inputName)\n * @param {string} inputName\n * @returns { { actionName: string, options: any } | undefined }\n * @memberof KeyboardControls\n */\n getControl(inputName: string): BoundKey | undefined {\n return this.boundKeys[inputName]\n }\n\n /**\n * Returns all controls\n * \n * @method getControls()\n * @since 4.2.0\n * @returns { { [key: string]: BoundKey } }\n * @memberof KeyboardControls\n */\n getControls(): { [key: string]: BoundKey } {\n return this.boundKeys\n }\n\n /**\n * Triggers an input according to the name of the control\n * \n * ```ts \n * import { Control, inject, KeyboardControls } from '@rpgjs/client'\n * \n * const controls = inject(KeyboardControls)\n * controls.applyControl(Control.Action)\n * ```\n * \n * You can put a second parameter or indicate on whether the key is pressed or released\n * \n * ```ts \n * import { Control, inject, KeyboardControls } from '@rpgjs/client'\n * \n * const controls = inject(KeyboardControls)\n * controls.applyControl(Control.Up, true) // keydown\n * controls.applyControl(Control.Up, false) // keyup\n * ```\n * @title Apply Control\n * @method applyControl(controlName,isDown)\n * @param {string} controlName\n * @param {boolean} [isDown]\n * @returns {Promise<void>}\n * @memberof KeyboardControls\n */\n async applyControl(controlName: string | number, isDown?: boolean | undefined): Promise<void> {\n const control = this._controlsOptions[controlName]\n if (control) {\n const input = Array.isArray(control.bind) ? control.bind[0] : control.bind\n if (isDown === undefined) {\n await this.applyKeyPress(input as string)\n }\n else if (isDown) {\n this.applyKeyDown(input as string)\n }\n else {\n this.applyKeyUp(input as string)\n }\n }\n }\n\n /**\n * Stop listening to the inputs. Pressing a key won't do anything\n * \n * @title Stop Inputs\n * @method stopInputs()\n * @returns {void}\n * @memberof KeyboardControls\n */\n stopInputs() {\n this.stop = true\n }\n\n /**\n * Listen to the inputs again\n * \n * @title Listen Inputs\n * @method listenInputs()\n * @returns {void}\n * @memberof KeyboardControls\n */\n listenInputs() {\n this.stop = false\n this.keyState = {}\n }\n\n /**\n * Assign custom inputs to the scene\n * \n * The object is the following:\n * \n * * the key of the object is the name of the control. Either it is existing controls (Up, Dow, Left, Right, Action, Back) or customized controls\n * * The value is an object representing control information:\n * * repeat {boolean} The key can be held down to repeat the action. (false by default)\n * * bind {string | string[]} To which key is linked the control\n * * method {Function} Function to be triggered. If you do not set this property, the name of the control is sent directly to the server.\n * * delay {object|number} (since v3.2.0) Indicates how long (in milliseconds) the player can press the key again to perform the action\n * * delay.duration\n * * delay.otherControls {string | string[]} Indicates the other controls that will also have the delay at the same time\n * \n * ```ts \n * import { Control, Input, inject, KeyboardControls } from '@rpgjs/client'\n * \n * const controls = inject(KeyboardControls)\n * controls.setInputs({\n [Control.Up]: {\n repeat: true,\n bind: Input.Up\n },\n [Control.Down]: {\n repeat: true,\n bind: Input.Down\n },\n [Control.Right]: {\n repeat: true,\n bind: Input.Right\n },\n [Control.Left]: {\n repeat: true,\n bind: Input.Left\n },\n [Control.Action]: {\n bind: [Input.Space, Input.Enter]\n },\n [Control.Back]: {\n bind: Input.Escape\n },\n\n // The myscustom1 control is sent to the server when the A key is pressed.\n mycustom1: {\n bind: Input.A\n },\n\n // the myAction method is executed when the B key is pressed\n mycustom2: {\n bind: Input.B,\n method({ actionName }) {\n console.log('cool', actionName)\n }\n },\n\n // The player can redo the action after 400ms\n mycustom3: {\n bind: Input.C,\n delay: 400 // ms\n },\n\n // The player can redo the action (mycustom4) and the directions after 400ms\n mycustom4: {\n bind: Input.C,\n delay: {\n duration: 400,\n otherControls: [Control.Up, Control.Down, Control.Left, Control.Right]\n }\n }\n })\n * \n * ```\n * @enum {string} Control \n * \n * Control.Up | up\n * Control.Down | down\n * Control.Left | left\n * Control.Right | right\n * Control.Action | action\n * Control.Back | back\n * \n * @enum {string} Mouse Event \n * \n * click | Click\n * dblclick | Double Click\n * mousedown | Mouse Down\n * mouseup | Mouse Up\n * mouseover | Mouse Over\n * mousemove | Mouse Move\n * mouseout | Mouse Out\n * contextmenu | Context Menu\n * \n * \n * @enum {string} Input \n * \n * break | Pause\n * backspace | Backspace / Delete\n * tab | Tab\n * clear | Clear\n * enter | Enter\n * shift | Shift\n * ctrl | Control\n * alt | Alt\n * pause/break | Pause / Break\n * caps lock | Caps Lock\n * escape | Escape\n * conversion | Conversion\n * non-conversion | Non-conversion\n * space | Space\n * page up | Page Up\n * page down | Page Down\n * end | End\n * home | Home\n * left | Left Arrow\n * up | Up Arrow\n * right | Right Arrow\n * down | Down Arrow\n * select | Select\n * print | Print\n * execute | Execute\n * Print Screen | Print Screen\n * insert | Insert\n * delete | Delete\n * n0 | 0\n * n1 | 1\n * n2 | 2\n * n3 | 3\n * n4 | 4\n * n5 | 5\n * n6 | 6\n * n7 | 7\n * n8 | 8\n * n9 | 9\n * : | Colon\n * semicolon (firefox), equals | Semicolon (Firefox), Equals\n * < | Less Than\n * equals (firefox) | Equals (Firefox)\n * ß | Eszett\n * @ | At\n * a | A\n * b | B\n * c | C\n * d | D\n * e | E\n * f | F\n * g | G\n * h | H\n * i | I\n * j | J\n * k | K\n * l | L\n * m | M\n * n | N\n * o | O\n * p | P\n * q | Q\n * r | R\n * s | S\n * t | T\n * u | U\n * v | V\n * w | W\n * x | X\n * y | Y\n * z | Z\n * Windows Key / Left ⌘ / Chromebook Search key | Windows Key / Left Command ⌘ / Chromebook Search Key\n * right window key | Right Windows Key\n * Windows Menu / Right ⌘ | Windows Menu / Right Command ⌘\n * numpad 0 | Numpad 0\n * numpad 1 | Numpad 1\n * numpad 2 | Numpad 2\n * numpad 3 | Numpad 3\n * numpad 4 | Numpad 4\n * numpad 5 | Numpad 5\n * numpad 6 | Numpad 6\n * numpad 7 | Numpad 7\n * numpad 8 | Numpad 8\n * numpad 9 | Numpad 9\n * multiply | Multiply\n * add | Add\n * numpad period (firefox) | Numpad Period (Firefox)\n * subtract | Subtract\n * decimal point | Decimal Point\n * divide | Divide\n * f1 | F1\n * f2 | F2\n * f3 | F3\n * f4 | F4\n * f5 | F5\n * f6 | F6\n * f7 | F7\n * f8 | F8\n * f9 | F9\n * f10 | F10\n * f11 | F11\n * f12 | F12\n * f13 | F13\n * f14 | F14\n * f15 | F15\n * f16 | F16\n * f17 | F17\n * f18 | F18\n * f19 | F19\n * f20 | F20\n * f21 | F21\n * f22 | F22\n * f23 | F23\n * f24 | F24\n * num lock | Num Lock\n * scroll lock | Scroll Lock\n * ^ | Caret\n * ! | Exclamation Point\n * # | Hash\n * $ | Dollar Sign\n * ù | Grave Accent U\n * page backward | Page Backward\n * page forward | Page Forward\n * closing paren (AZERTY) | Closing Parenthesis (AZERTY)\n * * | Asterisk\n * ~ + * key | Tilde + Asterisk Key\n * minus (firefox), mute/unmute | Minus (Firefox), Mute/Unmute\n * decrease volume level | Decrease Volume Level\n * increase volume level | Increase Volume Level\n * next | Next\n * previous | Previous\n * stop | Stop\n * play/pause | Play/Pause\n * e-mail | Email\n * mute/unmute (firefox) | Mute/Unmute (Firefox)\n * decrease volume level (firefox) | Decrease Volume Level (Firefox)\n * increase volume level (firefox) | Increase Volume Level (Firefox)\n * semi-colon / ñ | Semicolon / ñ\n * equal sign | Equal Sign\n * comma | Comma\n * dash | Dash\n * period | Period\n * forward slash / ç | Forward Slash / ç\n * grave accent / ñ / æ | Grave Accent / ñ / æ\n * ?, / or ° | ?, / or °\n * numpad period (chrome) | Numpad Period (Chrome)\n * open bracket | Open Bracket\n * back slash | Backslash\n * close bracket / å | Close Bracket / å\n * single quote / ø | Single Quote / ø\n * \\` | Backtick\n * left or right ⌘ key (firefox) | Left or Right Command Key (Firefox)\n * altgr | AltGr\n * < /git > | < /git >\n * GNOME Compose Key | GNOME Compose Key\n * ç | ç\n * XF86Forward | XF86Forward\n * XF86Back | XF86Back\n * alphanumeric | Alphanumeric\n * hiragana/katakana | Hiragana/Katakana\n * half-width/full-width | Half-Width/Full-Width\n * kanji | Kanji\n * toggle touchpad | Toggle Touchpad\n * \n * @title Set Inputs\n * @method setInputs(inputs)\n * @param {object} inputs\n * @memberof KeyboardControls\n */\n setInputs(inputs: Controls) {\n if (!inputs) return\n this.boundKeys = {}\n let inputsTransformed: any = {}\n for (let control in inputs) {\n const option = inputs[control]\n const { bind } = option\n let inputsKey: any = bind\n if (!Array.isArray(inputsKey)) {\n inputsKey = [bind]\n }\n for (let input of inputsKey) {\n this.bindKey(input, control, option)\n }\n }\n this._controlsOptions = inputs\n }\n\n get options(): Controls {\n return this._controlsOptions\n }\n}\n\nregisterDirective('controls', KeyboardControls)","import { WritableSignal } from '@signe/reactive';\nimport { Directive, registerDirective } from '../engine/directive';\nimport { Element } from '../engine/reactive';\nimport * as Utils from '../engine/utils';\n\nexport interface Tick {\n timestamp: number\n deltaTime: number\n frame: number\n deltaRatio: number\n}\n\nexport class Scheduler extends Directive {\n private maxFps?: number\n private fps: number = 60\n private deltaTime: number = 0\n public frame: number = 0\n private timestamp: number = 0\n private requestedDelay: number = 0\n private lastTimestamp: number = 0\n private _stop: boolean = false\n private tick: WritableSignal<Tick | null>\n \n onInit(element: Element) { \n this.tick = element.propObservables?.tick as any\n }\n\n onDestroy() { }\n onMount(element: Element) { }\n onUpdate(props: any) { }\n\n nextTick(timestamp: number) {\n this.lastTimestamp = this.lastTimestamp || this.timestamp // first\n this.deltaTime = Utils.preciseNow() - this.timestamp\n this.timestamp = timestamp\n this.tick.set({\n timestamp: this.timestamp,\n deltaTime: this.deltaTime,\n frame: this.frame,\n deltaRatio: ~~this.deltaTime / ~~Utils.fps2ms(this.fps)\n })\n this.lastTimestamp = this.timestamp\n this.frame++\n }\n /**\n * start the schedule\n * @return {Scheduler} returns this scheduler instance\n */\n start(options: {\n maxFps?: number\n fps?: number,\n delay?: number\n } = {}) {\n if (options.maxFps) this.maxFps = options.maxFps\n if (options.fps) this.fps = options.fps\n if (options.delay) this.requestedDelay = options.delay\n const requestAnimationFrame = (fn: (timestamp: number) => void) => {\n if (Utils.isBrowser()) {\n window.requestAnimationFrame(fn.bind(this))\n }\n else {\n setTimeout(() => {\n this.requestedDelay = 0\n fn(Utils.preciseNow())\n }, Utils.fps2ms(this.fps) + this.requestedDelay)\n }\n }\n\n if (!this.maxFps) {\n const loop = (timestamp: number) => {\n requestAnimationFrame(loop)\n this.nextTick(timestamp)\n }\n requestAnimationFrame(loop)\n }\n else {\n const msInterval = Utils.fps2ms(this.maxFps)\n let now = Utils.preciseNow()\n let then = Utils.preciseNow()\n const loop = (timestamp: number) => {\n if (this._stop) return\n requestAnimationFrame(loop)\n now = Utils.preciseNow()\n const elapsed = now - then\n if (elapsed > msInterval) {\n then = now - (elapsed % msInterval)\n this.nextTick(timestamp)\n }\n }\n requestAnimationFrame(loop)\n }\n\n return this;\n }\n\n stop() {\n this._stop = true\n }\n}\n\nregisterDirective('tick', Scheduler)","import { ComponentInstance } from '../components/DisplayObject';\nimport { Directive, registerDirective } from '../engine/directive';\nimport { Element } from '../engine/reactive';\nimport { error } from '../engine/utils';\n\nexport class ViewportFollow extends Directive {\n onInit(element: Element<ComponentInstance>) {\n\n }\n onMount(element: Element) {\n const { viewportFollow } = element.props\n const { viewport } = element.props.context\n if (!viewport) {\n throw error('ViewportFollow directive requires a Viewport component to be mounted in the same context')\n }\n viewport.follow(element.componentInstance)\n }\n onUpdate(props: any) {\n\n }\n onDestroy() {\n\n }\n}\n\nregisterDirective('viewportFollow', ViewportFollow)","import { effect } from '@signe/reactive';\nimport { Howl } from 'howler';\nimport { Container } from 'pixi.js';\nimport { Subscription } from 'rxjs';\nimport { Directive, registerDirective } from '../engine/directive';\nimport { Element } from '../engine/reactive';\nimport { calculateDistance, error } from '../engine/utils';\n\nconst EVENTS = ['load', 'loaderror', 'playerror', 'play', 'end', 'pause', 'stop', 'mute', 'volume', 'rate', 'seek', 'fade', 'unlock']\n\nexport class Sound extends Directive {\n private sound: Howl\n private eventsFn: ((...args: any[]) => void)[] = []\n private maxVolume: number = 1\n private maxDistance: number = 100\n private tickSubscription?: Subscription \n\n onInit(element: Element<Container>) { }\n\n onMount(element: Element<Container>) {\n const { props } = element\n const tick = props.context.tick\n const { src, autoplay, loop, volume, spatial } = props.sound\n this.sound = new Howl({\n src,\n autoplay,\n loop,\n volume\n })\n for (let event of EVENTS) {\n if (!props.sound[event]) continue\n const fn = props.sound[event]\n this.eventsFn.push(fn)\n this.sound.on(event, fn);\n }\n\n if (spatial) {\n const { soundListenerPosition } = props.context\n if (!soundListenerPosition) {\n throw new error('SoundListenerPosition directive is required for spatial sound in component parent')\n }\n const { x: listenerX, y: listenerY } = soundListenerPosition\n this.tickSubscription = effect(() => {\n tick()\n const { x, y } = element.componentInstance\n const distance = calculateDistance(x, y, listenerX(), listenerY());\n const volume = Math.max(this.maxVolume - (distance / this.maxDistance), 0)\n this.sound.volume(volume)\n }).subscription\n }\n }\n\n onUpdate(props: any) {\n const { volume, loop, mute, seek, playing, rate, spatial } = props\n if (volume != undefined) this.sound.volume(volume)\n if (loop != undefined) this.sound.loop(loop)\n if (mute != undefined) this.sound.mute(mute)\n if (seek != undefined) this.sound.seek(seek)\n if (playing != undefined) {\n if (playing) this.sound.play()\n else this.sound.pause()\n }\n if (spatial) {\n this.maxVolume = spatial.maxVolume ?? this.maxVolume\n this.maxDistance = spatial.maxDistance ?? this.maxDistance\n }\n if (rate != undefined) this.sound.rate(rate)\n }\n\n onDestroy() {\n this.sound.stop()\n this.tickSubscription?.unsubscribe()\n for (let event of EVENTS) {\n if (this.eventsFn[event]) {\n this.sound.off(event, this.eventsFn[event]);\n }\n }\n }\n}\n\nclass SoundListenerPosition extends Directive {\n onMount(element: Element<any>) {\n element.props.context.soundListenerPosition = element.propObservables?.soundListenerPosition\n }\n onInit(element: Element<any>) { }\n onUpdate(props: any) { }\n onDestroy() { }\n}\n\nregisterDirective('sound', Sound)\nregisterDirective('soundListenerPosition', SoundListenerPosition)","import { effect, isSignal } from '@signe/reactive';\nimport { Container, Rectangle } from 'pixi.js';\nimport { Directive, registerDirective } from '../engine/directive';\nimport { Element } from '../engine/reactive';\nimport { snap } from 'popmotion';\nimport { addContext } from '../hooks/addContext';\n\nexport class Drop extends Directive {\n onInit(element: Element<Container>) {}\n\n onMount(element: Element<Container>) {\n addContext(element, 'drop', element)\n }\n\n onUpdate() {}\n\n onDestroy() {}\n}\n\nexport class Drag extends Directive {\n onInit(element: Element<Container>) {}\n\n onMount(element: Element<Container>) {\n const { rootElement, canvasSize } = element.props.context\n const { propObservables } = element\n const { drag } = element.props\n const instance = element.componentInstance\n const stage = rootElement.componentInstance\n instance.eventMode = 'static'\n stage.eventMode = 'static'\n\n const snapTo = snap(drag?.snap ?? 0);\n\n effect(() => {\n stage.hitArea = new Rectangle(0, 0, canvasSize().width, canvasSize().height)\n })\n\n let x = 0\n let y = 0\n\n const onDragMove = (event) => {\n drag.move?.(event)\n x += event.movementX\n y += event.movementY\n if (drag?.snap) {\n instance.position.x = snapTo(x)\n instance.position.y = snapTo(y)\n } else {\n instance.position.x = x\n instance.position.y = y\n }\n const { x: xProp, y: yProp } = propObservables as any\n if (xProp !== undefined && isSignal(xProp)) {\n xProp.set(instance.position.x)\n }\n if (yProp !== undefined && isSignal(yProp)) {\n yProp.set(instance.position.y)\n }\n }\n\n const onDragEnd = () => {\n drag.end?.()\n stage.off('pointermove', onDragMove)\n console.log(rootElement.allElements)\n } \n\n instance.on('pointerdown', () => {\n drag.start?.()\n stage.on('pointermove', onDragMove)\n });\n\n stage.on('pointerup', onDragEnd)\n stage.on('pointerupoutside', onDragEnd)\n }\n\n onUpdate() {}\n\n onDestroy() {\n\n }\n}\n\n// registerDirective('drag', Drag)\n// registerDirective('drop', Drop)","import { Container, DisplacementFilter, Sprite, Texture, WRAP_MODES } from 'pixi.js';\nimport { animate } from 'popmotion';\nimport { Directive, registerDirective } from '../engine/directive';\nimport { Element } from '../engine/reactive';\n\n\nexport class Transition extends Directive {\n \n\n onInit(element: Element<Container>) {\n }\n\n onMount(element: Element<Container>) {\n const { image } = element.props.transition\n const displacementSprite = new Sprite(Texture.from(image))\n displacementSprite.texture.baseTexture.wrapMode = WRAP_MODES.REPEAT\n const displacementFilter = new DisplacementFilter(displacementSprite)\n const instance = element.componentInstance\n instance.filters = [displacementFilter]\n\n instance.addChild(displacementSprite)\n\n setTimeout(() => {\n animate({\n from: 0,\n to: 1,\n duration: 500,\n onUpdate: (progress) => {\n displacementFilter.scale.x = progress\n displacementFilter.scale.y = progress\n }\n })\n }, 5000)\n }\n\n onUpdate(props: any) {\n\n }\n\n onDestroy() {\n\n }\n}\n\nregisterDirective('transition', Transition)","import './directives'\nexport * from '@signe/reactive'\nexport { Howler } from 'howler'\nexport * from './components'\nexport * from './engine/reactive'\nexport * from './engine/signal'\nexport * from './engine/trigger'\nexport * from './engine/bootstrap'\nexport * from './engine/animation'\nexport { useProps, useDefineProps } from './hooks/useProps'\nexport * from './utils/Ease'\nexport * from './utils/RadialGradient'\nexport * from './components/DisplayObject'\nexport { isObservable } from 'rxjs'\nexport * as Utils from './engine/utils'","import { effect, Signal, signal } from \"@signe/reactive\";\nimport { Container, autoDetectRenderer } from \"pixi.js\";\nimport { loadYoga } from \"yoga-layout\";\nimport { Props, createComponent, registerComponent, Element } from \"../engine/reactive\";\nimport { useProps } from \"../hooks/useProps\";\nimport { ComponentInstance, DisplayObject } from \"./DisplayObject\";\nimport { ComponentFunction } from \"../engine/signal\";\nimport { SignalOrPrimitive } from \"./types\";\nimport { Size } from \"./types/DisplayObject\";\nimport { Scheduler, Tick } from \"../directives/Scheduler\";\n\ninterface CanvasElement extends Element<ComponentInstance> {\n render: (rootElement: HTMLElement) => void;\n directives: {\n tick: Scheduler\n };\n propObservables: {\n tick: Signal<Tick>\n };\n}\n\nregisterComponent(\"Canvas\", class Canvas extends DisplayObject(Container) {});\n\nexport interface CanvasProps extends Props {\n cursorStyles?: () => any;\n width?: SignalOrPrimitive<Size>;\n height?: SignalOrPrimitive<Size>;\n canvasEl?: HTMLElement;\n selector?: string;\n isRoot?: boolean;\n tick?: any;\n class?: SignalOrPrimitive<string>;\n}\n\nexport const Canvas: ComponentFunction<CanvasProps> = async (props = {}) => {\n let { cursorStyles, width, height, class: className } = useProps(props);\n const Yoga = await loadYoga();\n\n if (!props.width) width = signal<Size>(800)\n if (!props.height) height = signal<Size>(600)\n\n const renderer = await autoDetectRenderer({\n ...props,\n width: width?.(),\n height: height?.(),\n });\n\n const canvasSize = signal({\n width: renderer.width,\n height: renderer.height,\n });\n\n props.isRoot = true;\n const options: CanvasProps = {\n ...props,\n context: {\n Yoga,\n renderer,\n canvasSize,\n },\n width: width?.(),\n height: height?.(),\n };\n\n if (!props.tick) {\n options.context!.tick = options.tick = signal({\n timestamp: 0,\n deltaTime: 0,\n frame: 0,\n deltaRatio: 1,\n });\n }\n const canvasElement = createComponent(\"Canvas\", options) as CanvasElement;\n\n canvasElement.render = (rootElement: HTMLElement) => {\n const canvasEl = renderer.view.canvas as HTMLCanvasElement;\n\n (globalThis as any).__PIXI_STAGE__ = canvasElement.componentInstance;\n (globalThis as any).__PIXI_RENDERER__ = renderer;\n\n if (props.tickStart !== false) canvasElement.directives.tick.start()\n\n effect(() => {\n canvasElement.propObservables!.tick();\n renderer.render(canvasElement.componentInstance as any);\n });\n\n if (cursorStyles) {\n effect(() => {\n renderer.events.cursorStyles = cursorStyles();\n });\n }\n\n if (className) {\n effect(() => {\n canvasEl.classList.add(className());\n });\n }\n\n const resizeCanvas = async () => {\n let w, h;\n if (width?.() === \"100%\" && height?.() === \"100%\") {\n const parent = canvasEl.parentElement;\n w = parent ? parent.clientWidth : window.innerWidth;\n h = parent ? parent.clientHeight : window.innerHeight;\n } else {\n w = width?.() ?? canvasEl.offsetWidth;\n h = height?.() ?? canvasEl.offsetHeight;\n }\n renderer.resize(w, h);\n canvasSize.set({ width: w, height: h });\n canvasElement.componentInstance.setWidth(w)\n canvasElement.componentInstance.setHeight(h)\n };\n\n // Listen for window resize events\n window.addEventListener(\"resize\", resizeCanvas);\n\n // Check if a canvas already exists in the rootElement\n const existingCanvas = rootElement.querySelector('canvas');\n if (existingCanvas) {\n // If it exists, replace it with the new canvas\n rootElement.replaceChild(canvasEl, existingCanvas);\n } else {\n // If it doesn't exist, append the new canvas\n rootElement.appendChild(canvasEl);\n }\n\n // Initial resize\n resizeCanvas();\n };\n\n return canvasElement;\n};\n","import { Signal, WritableArraySignal, WritableObjectSignal, isSignal } from \"@signe/reactive\";\nimport {\n Observable,\n Subject,\n Subscription,\n defer,\n from,\n map,\n of,\n switchMap,\n} from \"rxjs\";\nimport { ComponentInstance } from \"../components/DisplayObject\";\nimport { Directive, applyDirective } from \"./directive\";\nimport { isObject, isPromise, set } from \"./utils\";\n\nexport interface Props {\n [key: string]: any;\n}\n\nexport type ArrayChange<T> = {\n type: \"add\" | \"remove\" | \"update\" | \"init\" | \"reset\";\n index?: number;\n items: T[];\n};\n\nexport type ObjectChange<T> = {\n type: \"add\" | \"remove\" | \"update\" | \"init\" | \"reset\";\n key?: string;\n value?: T;\n items: T[];\n};\n\ntype ElementObservable<T> = Observable<\n (ArrayChange<T> | ObjectChange<T>) & {\n value: Element | Element[];\n }\n>;\n\ntype NestedSignalObjects = {\n [Key in string]: NestedSignalObjects | Signal<any>;\n};\n\nexport interface Element<T = ComponentInstance> {\n tag: string;\n props: Props;\n componentInstance: T;\n propSubscriptions: Subscription[];\n effectSubscriptions: Subscription[];\n effectMounts: (() => void)[];\n effectUnmounts: ((element?: Element) => void)[];\n propObservables: NestedSignalObjects | undefined;\n parent: Element | null;\n context?: {\n [key: string]: any;\n };\n directives: {\n [key: string]: Directive;\n };\n destroy: () => void;\n allElements: Subject<void>;\n}\n\ntype FlowResult = {\n elements: Element[];\n prev?: Element;\n fullElements?: Element[];\n};\n\ntype FlowObservable = Observable<FlowResult>;\n\nconst components: { [key: string]: any } = {};\n\nexport const isElement = (value: any): value is Element => {\n return (\n value &&\n typeof value === \"object\" &&\n \"tag\" in value &&\n \"props\" in value &&\n \"componentInstance\" in value\n );\n};\n\nexport const isPrimitive = (value) => {\n return (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n value === null ||\n value === undefined\n );\n};\n\nexport function registerComponent(name, component) {\n components[name] = component;\n}\n\nfunction destroyElement(element: Element | Element[]) {\n if (Array.isArray(element)) {\n element.forEach((e) => destroyElement(e));\n return;\n }\n if (!element) {\n return;\n }\n element.propSubscriptions.forEach((sub) => sub.unsubscribe());\n element.effectSubscriptions.forEach((sub) => sub.unsubscribe());\n for (let name in element.directives) {\n element.directives[name].onDestroy?.();\n }\n element.componentInstance.onDestroy?.(element.parent as any);\n element.effectUnmounts.forEach((fn) => fn?.());\n}\n\n/**\n * Creates a virtual element or a representation thereof, with properties that can be dynamically updated based on BehaviorSubjects.\n *\n * @param {string} tag - The tag name of the element to create.\n * @param {Object} props - An object containing properties for the element. Each property can either be a direct value\n * or an array where the first element is a function that returns a value based on input parameters,\n * and the second element is an array of BehaviorSubjects. The property is updated dynamically\n * using the combineLatest RxJS operator to wait for all BehaviorSubjects to emit.\n * @returns {Object} An object representing the created element, including tag name and dynamic properties.\n */\nexport function createComponent(tag: string, props?: Props): Element {\n if (!components[tag]) {\n throw new Error(`Component ${tag} is not registered`);\n }\n const instance = new components[tag]();\n const element: Element = {\n tag,\n props: {},\n componentInstance: instance,\n propSubscriptions: [],\n propObservables: props,\n parent: null,\n directives: {},\n effectUnmounts: [],\n effectSubscriptions: [],\n effectMounts: [],\n destroy() {\n destroyElement(this);\n },\n allElements: new Subject(),\n };\n\n // Iterate over each property in the props object\n if (props) {\n const recursiveProps = (props, path = \"\") => {\n const _set = (path, key, value) => {\n if (path == \"\") {\n element.props[key] = value;\n return;\n }\n set(element.props, path + \".\" + key, value);\n };\n\n Object.entries(props).forEach(([key, value]: [string, unknown]) => {\n if (isSignal(value)) {\n const _value = value as Signal<any>;\n if (\"dependencies\" in _value && _value.dependencies.size == 0) {\n _set(path, key, _value());\n return;\n }\n element.propSubscriptions.push(\n _value.observable.subscribe((value) => {\n _set(path, key, value);\n if (element.directives[key]) {\n element.directives[key].onUpdate?.(value);\n }\n if (key == \"tick\") {\n return\n }\n instance.onUpdate?.(\n path == \"\"\n ? {\n [key]: value,\n }\n : set({}, path + \".\" + key, value)\n );\n })\n );\n } else {\n if (isObject(value) && key != \"context\" && !isElement(value)) {\n recursiveProps(value, (path ? path + \".\" : \"\") + key);\n } else {\n _set(path, key, value);\n }\n }\n });\n };\n recursiveProps(props);\n }\n\n instance.onInit?.(element.props);\n\n const elementsListen = new Subject<any>()\n\n if (props?.isRoot) {\n element.allElements = elementsListen\n element.props.context.rootElement = element;\n element.componentInstance.onMount?.(element);\n propagateContext(element);\n }\n\n if (props) {\n for (let key in props) {\n const directive = applyDirective(element, key);\n if (directive) element.directives[key] = directive;\n }\n }\n\n function onMount(parent: Element, element: Element, index?: number) {\n element.props.context = parent.props.context;\n element.parent = parent;\n element.componentInstance.onMount?.(element, index);\n for (let name in element.directives) {\n element.directives[name].onMount?.(element);\n }\n element.effectMounts.forEach((fn: any) => {\n element.effectUnmounts.push(fn(element));\n });\n };\n\n async function propagateContext(element) {\n if (element.props.attach) {\n const isReactiveAttach = isSignal(element.propObservables?.attach)\n if (!isReactiveAttach) {\n element.props.children.push(element.props.attach)\n }\n else {\n await new Promise((resolve) => {\n let lastElement = null\n element.propSubscriptions.push(element.propObservables.attach.observable.subscribe(async (args) => {\n const value = args?.value ?? args\n if (!value) {\n throw new Error(`attach in ${element.tag} is undefined or null, add a component`)\n }\n if (lastElement) {\n destroyElement(lastElement)\n }\n lastElement = value\n await createElement(element, value)\n resolve(undefined)\n }))\n })\n }\n }\n if (!element.props.children) {\n return;\n }\n for (let child of element.props.children) {\n if (!child) continue;\n await createElement(element, child)\n }\n };\n\n async function createElement(parent: Element, child: Element) {\n if (isPromise(child)) {\n child = await child;\n }\n if (child instanceof Observable) {\n child.subscribe(\n ({\n elements: comp,\n prev,\n }: {\n elements: Element[];\n prev?: Element;\n }) => {\n // if prev, insert element after this\n const components = comp.filter((c) => c !== null);\n if (prev) {\n components.forEach((c) => {\n const index = parent.props.children.indexOf(prev.props.key);\n onMount(parent, c, index + 1);\n propagateContext(c);\n });\n return;\n }\n components.forEach((component) => {\n if (!Array.isArray(component)) {\n onMount(parent, component);\n propagateContext(component);\n } else {\n component.forEach((comp) => {\n onMount(parent, comp);\n propagateContext(comp);\n });\n }\n });\n elementsListen.next(undefined)\n }\n );\n } else {\n onMount(parent, child);\n await propagateContext(child);\n }\n }\n\n // Return the created element representation\n return element;\n}\n\n/**\n * Observes a BehaviorSubject containing an array or object of items and dynamically creates child elements for each item.\n *\n * @param {WritableArraySignal<T> | WritableObjectSignal<T>} itemsSubject - A signal that emits an array or object of items.\n * @param {Function} createElementFn - A function that takes an item and returns an element representation.\n * @returns {Observable} An observable that emits the list of created child elements.\n */\nexport function loop<T>(\n itemsSubject: WritableArraySignal<T[]> | WritableObjectSignal<T>,\n createElementFn: (item: T, index: number | string) => Element | null\n): FlowObservable {\n return defer(() => {\n let elements: Element[] = [];\n let elementMap = new Map<string | number, Element>();\n let isFirstSubscription = true;\n\n const isArraySignal = (signal: any): signal is WritableArraySignal<T[]> => \n Array.isArray(signal());\n\n return new Observable<FlowResult>(subscriber => {\n const subscription = isArraySignal(itemsSubject)\n ? itemsSubject.observable.subscribe(change => {\n if (isFirstSubscription) {\n isFirstSubscription = false;\n elements.forEach(el => el.destroy());\n elements = [];\n elementMap.clear();\n\n const items = itemsSubject();\n if (items) {\n items.forEach((item, index) => {\n const element = createElementFn(item, index);\n if (element) {\n elements.push(element);\n elementMap.set(index, element);\n }\n });\n }\n subscriber.next({\n elements: [...elements]\n });\n return;\n }\n\n if (change.type === 'init' || change.type === 'reset') {\n elements.forEach(el => el.destroy());\n elements = [];\n elementMap.clear();\n\n const items = itemsSubject();\n if (items) {\n items.forEach((item, index) => {\n const element = createElementFn(item, index);\n if (element) {\n elements.push(element);\n elementMap.set(index, element);\n }\n });\n }\n } else if (change.type === 'add' && change.index !== undefined) {\n const newElements = change.items.map((item, i) => {\n const element = createElementFn(item as T, change.index! + i);\n if (element) {\n elementMap.set(change.index! + i, element);\n }\n return element;\n }).filter((el): el is Element => el !== null);\n \n elements.splice(change.index, 0, ...newElements);\n } else if (change.type === 'remove' && change.index !== undefined) {\n const removed = elements.splice(change.index, 1);\n removed.forEach(el => {\n el.destroy();\n elementMap.delete(change.index!);\n });\n }\n\n subscriber.next({\n elements: [...elements] // Create a new array to ensure change detection\n });\n })\n : (itemsSubject as WritableObjectSignal<T>).observable.subscribe(change => {\n const key = change.key as string | number\n if (isFirstSubscription) {\n isFirstSubscription = false;\n elements.forEach(el => el.destroy());\n elements = [];\n elementMap.clear();\n\n const items = (itemsSubject as WritableObjectSignal<T>)();\n if (items) {\n Object.entries(items).forEach(([key, value]) => {\n const element = createElementFn(value, key);\n if (element) {\n elements.push(element);\n elementMap.set(key, element);\n }\n });\n }\n subscriber.next({\n elements: [...elements]\n });\n return;\n }\n\n if (change.type === 'init' || change.type === 'reset') {\n elements.forEach(el => el.destroy());\n elements = [];\n elementMap.clear();\n\n const items = (itemsSubject as WritableObjectSignal<T>)();\n if (items) {\n Object.entries(items).forEach(([key, value]) => {\n const element = createElementFn(value, key);\n if (element) {\n elements.push(element);\n elementMap.set(key, element);\n }\n });\n }\n } else if (change.type === 'add' && change.key && change.value !== undefined) {\n const element = createElementFn(change.value as T, key);\n if (element) {\n elements.push(element);\n elementMap.set(key, element);\n }\n } else if (change.type === 'remove' && change.key) {\n const index = elements.findIndex(el => elementMap.get(key) === el);\n if (index !== -1) {\n const [removed] = elements.splice(index, 1);\n removed.destroy();\n elementMap.delete(key);\n }\n } else if (change.type === 'update' && change.key && change.value !== undefined) {\n const index = elements.findIndex(el => elementMap.get(key) === el);\n if (index !== -1) {\n const oldElement = elements[index];\n oldElement.destroy();\n const newElement = createElementFn(change.value as T, key);\n if (newElement) {\n elements[index] = newElement;\n elementMap.set(key, newElement);\n }\n }\n }\n\n subscriber.next({\n elements: [...elements] // Create a new array to ensure change detection\n });\n });\n\n return subscription;\n });\n });\n}\n\n/**\n * Conditionally creates and destroys elements based on a condition signal.\n *\n * @param {Signal<boolean> | boolean} condition - A signal or boolean that determines whether to create an element.\n * @param {Function} createElementFn - A function that returns an element or a promise that resolves to an element.\n * @returns {Observable} An observable that emits the created or destroyed element.\n */\nexport function cond(\n condition: Signal<boolean> | boolean,\n createElementFn: () => Element | Promise<Element>\n): FlowObservable {\n let element: Element | null = null;\n \n if (isSignal(condition)) {\n const signalCondition = condition as WritableObjectSignal<boolean>;\n return new Observable<{elements: Element[], type?: \"init\" | \"remove\"}>(subscriber => {\n return signalCondition.observable.subscribe(bool => {\n if (bool) {\n let _el = createElementFn();\n if (isPromise(_el)) {\n from(_el as Promise<Element>).subscribe(el => {\n element = el;\n subscriber.next({\n type: \"init\",\n elements: [el],\n });\n });\n } else {\n element = _el as Element;\n subscriber.next({\n type: \"init\",\n elements: [element],\n });\n }\n } else if (element) {\n destroyElement(element);\n subscriber.next({\n elements: [],\n });\n } else {\n subscriber.next({\n elements: [],\n });\n }\n });\n });\n } else {\n // Handle boolean case\n if (condition) {\n let _el = createElementFn();\n if (isPromise(_el)) {\n return from(_el as Promise<Element>).pipe(\n map((el) => ({\n type: \"init\",\n elements: [el],\n }))\n );\n }\n return of({\n type: \"init\",\n elements: [_el as Element],\n });\n }\n return of({\n elements: [],\n });\n }\n}\n","import { isSignal, signal } from \"@signe/reactive\"\nimport { isPrimitive } from \"../engine/reactive\"\n\n/**\n * Converts props into reactive signals if they are primitive values.\n * \n * @param {object} props - The properties to convert.\n * @param {object} [defaults={}] - Default values for properties.\n * @returns {object} An object with reactive signals.\n * \n * @example\n * const props = useProps({ count: 0, name: \"John\" });\n * console.log(props.count()); // 0\n * props.count.set(1);\n * console.log(props.count()); // 1\n */\nexport const useProps = (props, defaults = {}): any => {\n if (isSignal(props)) {\n return props()\n }\n const obj = {}\n for (let key in props) {\n const value = props[key]\n obj[key] = isPrimitive(value) ? signal(value) : value\n }\n for (let key in defaults) {\n if (!(key in obj)) {\n obj[key] = signal(defaults[key])\n }\n }\n return obj\n}\n\ntype PropType = NumberConstructor | StringConstructor | BooleanConstructor | \n FunctionConstructor | ObjectConstructor | ArrayConstructor | \n null | (new (...args: any[]) => any);\n\ninterface PropConfig {\n type?: PropType | PropType[];\n required?: boolean;\n default?: any | ((props: any) => any);\n validator?: (value: any, props: any) => boolean;\n}\n\ntype PropSchema = {\n [key: string]: PropType | PropType[] | PropConfig;\n}\n\n/**\n * Validates and defines properties based on a schema.\n * \n * @param {object} props - The properties to validate.\n * @returns {function} A function that takes a schema and returns validated properties.\n * \n * @example\n * const schema = {\n * age: { type: Number, required: true },\n * name: { type: String, default: \"Anonymous\" }\n * };\n * const validatedProps = useDefineProps({ age: 25 })(schema);\n * console.log(validatedProps.age()); // 25\n * console.log(validatedProps.name()); // \"Anonymous\"\n */\nexport const useDefineProps = (props: any) => {\n return (schema?: PropSchema) => {\n const rawProps = isSignal(props) ? props() : props\n const validatedProps: { [key: string]: any } = {}\n\n for (const key in schema) {\n const propConfig = schema[key]\n const value = rawProps[key]\n let validatedValue: any\n\n // Handle simple type definition\n if (typeof propConfig === 'function') {\n validateType(key, value, [propConfig])\n validatedValue = value\n }\n // Handle array of types\n else if (Array.isArray(propConfig)) {\n validateType(key, value, propConfig)\n validatedValue = value\n }\n // Handle detailed configuration object\n else if (propConfig && typeof propConfig === 'object') {\n // Check required prop\n if (propConfig.required && value === undefined) {\n throw new Error(`Missing required prop: ${key}`)\n }\n \n // Validate type if specified\n if (propConfig.type) {\n const types = Array.isArray(propConfig.type) ? propConfig.type : [propConfig.type]\n validateType(key, value, types)\n }\n \n // Run custom validator if provided\n if (propConfig.validator && !propConfig.validator(value, rawProps)) {\n throw new Error(`Invalid prop: custom validation failed for prop \"${key}\"`)\n }\n \n // Set default value if value is undefined\n if (value === undefined && 'default' in propConfig) {\n validatedValue = typeof propConfig.default === 'function' \n ? propConfig.default(rawProps)\n : propConfig.default\n } else {\n validatedValue = value\n }\n }\n\n validatedProps[key] = isSignal(validatedValue) \n ? validatedValue \n : signal(validatedValue)\n }\n \n return {\n ...useProps(rawProps),\n ...validatedProps\n }\n }\n}\n\n/**\n * Validates the type of a property.\n * \n * @param {string} key - The property key.\n * @param {any} value - The property value.\n * @param {any[]} types - The expected types.\n * @throws Will throw an error if the type check fails.\n */\nfunction validateType(key: string, value: any, types: any[]) {\n if (value === undefined || value === null) return\n \n // Si c'est un signal, on vérifie la valeur du signal\n const valueToCheck = isSignal(value) ? value() : value\n \n const valid = types.some(type => {\n if (type === Number) return typeof valueToCheck === 'number'\n if (type === String) return typeof valueToCheck === 'string'\n if (type === Boolean) return typeof valueToCheck === 'boolean'\n if (type === Function) return typeof valueToCheck === 'function'\n if (type === Object) return typeof valueToCheck === 'object'\n if (type === Array) return Array.isArray(valueToCheck)\n if (type === null) return valueToCheck === null\n return valueToCheck instanceof type\n })\n \n if (!valid) {\n throw new Error(\n `Invalid prop: type check failed for prop \"${key}\". ` +\n `Expected ${types.map(t => t.name).join(' or ')}`\n )\n }\n}","import { Node } from \"yoga-layout\";\nimport { Element, isElement, Props } from \"../engine/reactive\";\nimport { setObservablePoint } from \"../engine/utils\";\nimport type {\n AlignContent,\n EdgeSize,\n FlexDirection,\n Size,\n} from \"./types/DisplayObject\";\nimport { effect, Signal, signal } from \"@signe/reactive\";\nimport { DropShadowFilter } from \"pixi-filters\";\nimport { BlurFilter, ObservablePoint } from \"pixi.js\";\n\nexport interface ComponentInstance extends PixiMixins.ContainerOptions {\n id?: string;\n children?: ComponentInstance[];\n onInit?(props: Props): void;\n onUpdate?(props: Props): void;\n onDestroy?(parent: Element): void;\n onMount?(context: Element, index?: number): void;\n setWidth(width: number): void;\n setHeight(height: number): void;\n}\n\nexport const EVENTS = [\n \"added\",\n \"childAdded\",\n \"childRemoved\",\n \"click\",\n \"clickcapture\",\n \"destroyed\",\n \"globalmousemove\",\n \"globalpointermove\",\n \"globaltouchmove\",\n \"mousedown\",\n \"mousedowncapture\",\n \"mouseenter\",\n \"mouseentercapture\",\n \"mouseleave\",\n \"mouseleavecapture\",\n \"mousemove\",\n \"mousemovecapture\",\n \"mouseout\",\n \"mouseoutcapture\",\n \"mouseover\",\n \"mouseovercapture\",\n \"mouseup\",\n \"mouseupcapture\",\n \"mouseupoutside\",\n \"mouseupoutsidecapture\",\n \"pointercancel\",\n \"pointercancelcapture\",\n \"pointerdown\",\n \"pointerdowncapture\",\n \"pointerenter\",\n \"pointerentercapture\",\n \"pointerleave\",\n \"pointerleavecapture\",\n \"pointermove\",\n \"pointermovecapture\",\n \"pointerout\",\n \"pointeroutcapture\",\n \"pointerover\",\n \"pointerovercapture\",\n \"pointertap\",\n \"pointertapcapture\",\n \"pointerup\",\n \"pointerupcapture\",\n \"pointerupoutside\",\n \"pointerupoutsidecapture\",\n \"removed\",\n \"rightclick\",\n \"rightclickcapture\",\n \"rightdown\",\n \"rightdowncapture\",\n \"rightup\",\n \"rightupcapture\",\n \"rightupoutside\",\n \"rightupoutsidecapture\",\n \"tap\",\n \"tapcapture\",\n \"touchcancel\",\n \"touchcancelcapture\",\n \"touchend\",\n \"touchendcapture\",\n \"touchendoutside\",\n \"touchendoutsidecapture\",\n \"touchmove\",\n \"touchmovecapture\",\n \"touchstart\",\n \"touchstartcapture\",\n \"wheel\",\n \"wheelcapture\",\n];\n\nexport function DisplayObject(extendClass) {\n return class DisplayObject extends extendClass {\n #canvasContext: {\n [key: string]: any;\n } | null = null;\n isFlex: boolean = false;\n fullProps: Props = {};\n isMounted: boolean = false;\n _anchorPoints = new ObservablePoint(\n { _onUpdate: () => {} },\n 0,\n 0\n );\n isCustomAnchor: boolean = false;\n displayWidth = signal(0);\n displayHeight = signal(0);\n overrideProps: string[] = [];\n node: Node;\n\n get yoga() {\n return this.#canvasContext?.Yoga;\n }\n\n get deltaRatio() {\n return this.#canvasContext?.scheduler?.tick.value.deltaRatio;\n }\n\n onInit(props) {\n this._id = props.id;\n for (let event of EVENTS) {\n if (props[event] && !this.overrideProps.includes(event)) {\n this.eventMode = \"static\";\n this.on(event, props[event]);\n }\n }\n }\n\n onMount({ parent, props }: Element<DisplayObject>, index?: number) {\n this.#canvasContext = props.context;\n this.node = this.yoga.Node.create();\n if (parent) {\n const instance = parent.componentInstance as DisplayObject;\n if (index === undefined) {\n instance.addChild(this);\n } else {\n instance.addChildAt(this, index);\n }\n if (instance.layer) this.parentLayer = instance.layer;\n this.isMounted = true;\n this.effectSize(props.width, props.height);\n this.onUpdate(props);\n this.parent.node.insertChild(\n this.node,\n this.parent.node.getChildCount()\n );\n if (parent.props.flexDirection) {\n this.parent.node.calculateLayout();\n for (let child of this.parent.children) {\n const { left, top } = child.getComputedLayout();\n child.x = left;\n child.y = top;\n }\n }\n \n }\n }\n\n effectSize(width: Size, height: Size) {\n const handleSize = (\n size: Size,\n setter: (value: number) => void,\n parentSize: Signal<number>\n ) => {\n if (typeof size === \"string\" && size.endsWith(\"%\")) {\n effect(() => {\n setter(parentSize() * (parseInt(size) / 100));\n if (this.isFlex) {\n this.applyFlexLayout();\n }\n });\n } else {\n setter(+size);\n }\n };\n\n if (width != undefined)\n handleSize(width, this.setWidth.bind(this), this.parent.displayWidth);\n if (height != undefined)\n handleSize(\n height,\n this.setHeight.bind(this),\n this.parent.displayHeight\n );\n }\n\n applyFlexLayout() {\n this.calculateLayout();\n for (let child of this.children) {\n const { left, top } = child.node.getComputedLayout();\n child.x = left;\n child.y = top;\n }\n }\n\n #flexRender(props) {\n if (!this.parent) return;\n if (props.flexDirection || props.justifyContent) {\n this.isFlex = true;\n this.applyFlexLayout();\n }\n }\n\n onUpdate(props) {\n this.fullProps = {\n ...this.fullProps,\n ...props,\n };\n\n if (!this.#canvasContext || !this.parent) return;\n if (props.x !== undefined) this.setX(props.x);\n if (props.y !== undefined) this.setY(props.y);\n if (props.scale !== undefined)\n setObservablePoint(this.scale, props.scale);\n if (props.anchor !== undefined && !this.isCustomAnchor) {\n setObservablePoint(this.anchor, props.anchor);\n }\n if (props.skew !== undefined) setObservablePoint(this.skew, props.skew);\n if (props.tint) this.tint = props.tint;\n if (props.rotation !== undefined) this.rotation = props.rotation;\n if (props.angle !== undefined) this.angle = props.angle;\n if (props.zIndex !== undefined) this.zIndex = props.zIndex;\n if (props.roundPixels !== undefined) this.roundPixels = props.roundPixels;\n if (props.cursor) this.cursor = props.cursor;\n if (props.visible !== undefined) this.visible = props.visible;\n if (props.alpha !== undefined) this.alpha = props.alpha;\n if (props.pivot) setObservablePoint(this.pivot, props.pivot);\n if (props.flexDirection) this.setFlexDirection(props.flexDirection);\n if (props.flexWrap) this.setFlexWrap(props.flexWrap);\n if (props.justifyContent) this.setJustifyContent(props.justifyContent);\n if (props.alignItems) this.setAlignItems(props.alignItems);\n if (props.alignContent) this.setAlignContent(props.alignContent);\n if (props.alignSelf) this.setAlignSelf(props.alignSelf);\n if (props.margin) this.setMargin(props.margin);\n if (props.padding) this.setPadding(props.padding);\n if (props.gap) this.setGap(props.gap);\n if (props.border) this.setBorder(props.border);\n if (props.positionType) this.setPositionType(props.positionType);\n if (props.filters) this.filters = props.filters;\n if (props.maskOf) {\n if (isElement(props.maskOf)) {\n props.maskOf.componentInstance.mask = this;\n }\n }\n if (props.blendMode) this.blendMode = props.blendMode;\n if (props.filterArea) this.filterArea = props.filterArea;\n const currentFilters = this.filters || [];\n\n if (props.shadow) {\n let dropShadowFilter = currentFilters.find(\n (filter) => filter instanceof DropShadowFilter\n );\n if (!dropShadowFilter) {\n dropShadowFilter = new DropShadowFilter();\n currentFilters.push(dropShadowFilter);\n }\n Object.assign(dropShadowFilter, props.shadow);\n }\n\n if (props.blur) {\n let blurFilter = currentFilters.find(\n (filter) => filter instanceof BlurFilter\n );\n if (!blurFilter) {\n const options =\n typeof props.blur === \"number\"\n ? {\n strength: props.blur,\n }\n : props.blur;\n blurFilter = new BlurFilter(options);\n currentFilters.push(blurFilter);\n }\n Object.assign(blurFilter, props.blur);\n }\n\n this.filters = currentFilters;\n\n this.#flexRender(props);\n }\n\n onDestroy() {\n super.destroy();\n this.node?.freeRecursive();\n }\n\n getComputedLayout() {\n return this.node.getComputedLayout();\n }\n\n applyComputedLayout() {\n const layout = this.getComputedLayout();\n this.x = layout.left;\n this.y = layout.top;\n }\n\n calculateLayout() {\n this.node.calculateLayout();\n }\n\n setFlexDirection(direction: FlexDirection) {\n const mapping = {\n row: this.yoga.FLEX_DIRECTION_ROW,\n column: this.yoga.FLEX_DIRECTION_COLUMN,\n \"row-reverse\": this.yoga.FLEX_DIRECTION_ROW_REVERSE,\n \"column-reverse\": this.yoga.FLEX_DIRECTION_COLUMN_REVERSE,\n };\n this.node.setFlexDirection(mapping[direction]);\n }\n\n setFlexWrap(wrap: \"wrap\" | \"nowrap\" | \"wrap-reverse\") {\n const mapping = {\n wrap: this.yoga.WRAP_WRAP,\n nowrap: this.yoga.WRAP_NO_WRAP,\n \"wrap-reverse\": this.yoga.WRAP_WRAP_REVERSE,\n };\n this.node.setFlexWrap(mapping[wrap]);\n }\n\n #setAlign(methodName: string, align: AlignContent) {\n const mapping = {\n auto: this.yoga.ALIGN_AUTO,\n \"flex-start\": this.yoga.ALIGN_FLEX_START,\n \"flex-end\": this.yoga.ALIGN_FLEX_END,\n center: this.yoga.ALIGN_CENTER,\n stretch: this.yoga.ALIGN_STRETCH,\n baseline: this.yoga.ALIGN_BASELINE,\n \"space-between\": this.yoga.ALIGN_SPACE_BETWEEN,\n \"space-around\": this.yoga.ALIGN_SPACE_AROUND,\n };\n const method = (this.node as any)[methodName].bind(this.node);\n method(mapping[align]);\n }\n\n setAlignContent(align: AlignContent) {\n this.#setAlign(\"setAlignContent\", align);\n }\n\n setAlignSelf(align: AlignContent) {\n this.#setAlign(\"setAlignSelf\", align);\n }\n\n setAlignItems(align: AlignContent) {\n this.#setAlign(\"setAlignItems\", align);\n }\n\n setJustifyContent(\n justifyContent:\n | \"flex-start\"\n | \"flex-end\"\n | \"center\"\n | \"space-between\"\n | \"space-around\"\n ) {\n const mapping = {\n \"flex-start\": this.yoga.JUSTIFY_FLEX_START,\n \"flex-end\": this.yoga.JUSTIFY_FLEX_END,\n center: this.yoga.JUSTIFY_CENTER,\n \"space-between\": this.yoga.JUSTIFY_SPACE_BETWEEN,\n \"space-around\": this.yoga.JUSTIFY_SPACE_AROUND,\n };\n this.node.setJustifyContent(mapping[justifyContent]);\n }\n\n #setEdgeSize(methodName: string, size: EdgeSize) {\n const method = (this.node as any)[methodName].bind(this.node);\n if (size instanceof Array) {\n if (size.length === 2) {\n method(this.yoga.EDGE_VERTICAL, size[0]);\n method(this.yoga.EDGE_HORIZONTAL, size[1]);\n } else if (size.length === 4) {\n method(this.yoga.EDGE_TOP, size[0]);\n method(this.yoga.EDGE_RIGHT, size[1]);\n method(this.yoga.EDGE_BOTTOM, size[2]);\n method(this.yoga.EDGE_LEFT, size[3]);\n }\n } else {\n method(this.yoga.EDGE_ALL, size);\n }\n }\n\n setPosition(position: EdgeSize) {\n this.#setEdgeSize(\"setPosition\", position);\n }\n\n setX(x: number) {\n x = x + this.getWidth() * this._anchorPoints.x;\n if (!this.parent.isFlex) {\n this.x = x;\n }\n this.node.setPosition(this.yoga.EDGE_LEFT, x);\n }\n\n setY(y: number) {\n y = y + this.getHeight() * this._anchorPoints.y;\n if (!this.parent.isFlex) {\n this.y = y;\n }\n this.node.setPosition(this.yoga.EDGE_TOP, y);\n }\n\n setPadding(padding: EdgeSize) {\n this.#setEdgeSize(\"setPadding\", padding);\n }\n\n setMargin(margin: EdgeSize) {\n this.#setEdgeSize(\"setMargin\", margin);\n }\n\n setGap(gap: EdgeSize) {\n this.node.setGap(this.yoga.GAP_ALL, +gap);\n }\n\n setBorder(border: EdgeSize) {\n this.#setEdgeSize(\"setBorder\", border);\n }\n\n setPositionType(positionType: \"relative\" | \"absolute\") {\n const mapping = {\n relative: this.yoga.POSITION_TYPE_RELATIVE,\n absolute: this.yoga.POSITION_TYPE_ABSOLUTE,\n };\n this.node.setPositionType(mapping[positionType]);\n }\n\n calculateBounds() {\n super.calculateBounds();\n if (!this._geometry) return;\n const bounds = this._geometry.bounds;\n const width = Math.abs(bounds.minX - bounds.maxX);\n const height = Math.abs(bounds.minY - bounds.maxY);\n // this.node.setWidth(width);\n // this.node.setHeight(height);\n }\n\n setWidth(width: number) {\n this.displayWidth.set(width);\n this.node?.setWidth(width);\n }\n\n setHeight(height: number) {\n this.displayHeight.set(height);\n this.node?.setHeight(height);\n }\n\n getWidth() {\n return this.displayWidth();\n }\n\n getHeight() {\n return this.displayHeight();\n }\n };\n}\n","import { Container as PixiContainer } from \"pixi.js\";\nimport { createComponent, registerComponent } from \"../engine/reactive\";\nimport { DisplayObject } from \"./DisplayObject\";\nimport { ComponentFunction } from \"../engine/signal\";\nimport { DisplayObjectProps } from \"./types/DisplayObject\";\nimport { setObservablePoint } from \"../engine/utils\";\n\ninterface ContainerProps extends DisplayObjectProps {\n sortableChildren?: boolean;\n}\n\nexport class CanvasContainer extends DisplayObject(PixiContainer) {\n isCustomAnchor = true;\n \n onUpdate(props) {\n if (props.anchor) {\n setObservablePoint(this._anchorPoints, props.anchor);\n props.pivot = [\n this.getWidth() * this._anchorPoints.x,\n this.getHeight() * this._anchorPoints.y\n ]\n }\n super.onUpdate(props);\n if (props.sortableChildren != undefined) {\n this.sortableChildren = props.sortableChildren;\n }\n }\n onMount(args) {\n super.onMount(args);\n const { componentInstance, props } = args;\n const { pixiChildren } = props;\n if (pixiChildren) {\n pixiChildren.forEach((child) => {\n componentInstance.addChild(child);\n });\n }\n }\n}\n\nexport interface CanvasContainer extends DisplayObjectProps {}\n\nregisterComponent(\"Container\", CanvasContainer);\n\nexport const Container: ComponentFunction<ContainerProps> = (props) => {\n return createComponent(\"Container\", props);\n};\n","import { effect, Signal } from \"@signe/reactive\";\nimport { Graphics as PixiGraphics } from \"pixi.js\";\nimport { createComponent, registerComponent } from \"../engine/reactive\";\nimport { DisplayObject } from \"./DisplayObject\";\nimport { DisplayObjectProps } from \"./types/DisplayObject\";\nimport { useProps } from \"../hooks/useProps\";\n\ninterface GraphicsProps extends DisplayObjectProps {\n draw?: (graphics: PixiGraphics) => void;\n}\n\ninterface RectProps extends DisplayObjectProps {\n width: number;\n height: number;\n color: string;\n}\n\ninterface CircleProps extends DisplayObjectProps {\n radius: number;\n color: string;\n}\n\ninterface EllipseProps extends DisplayObjectProps {\n width: number;\n height: number;\n color: string;\n}\n\ninterface TriangleProps extends DisplayObjectProps {\n base: number;\n height: number;\n color: string;\n}\n\ninterface SvgProps extends DisplayObjectProps {\n svg: string;\n}\n\nclass CanvasGraphics extends DisplayObject(PixiGraphics) {\n onInit(props) {\n super.onInit(props);\n if (props.draw) {\n effect(() => {\n this.clear();\n props.draw?.(this);\n });\n }\n }\n}\n\ninterface CanvasGraphics extends PixiGraphics {}\n\nregisterComponent(\"Graphics\", CanvasGraphics);\n\nexport function Graphics(props: GraphicsProps) {\n return createComponent(\"Graphics\", props);\n}\n\nexport function Rect(props: RectProps) {\n const { width, height, color, borderRadius, border } = useProps(props, {\n borderRadius: null,\n border: null\n })\n return Graphics({\n draw: (g) => {\n if (borderRadius()) {\n g.roundRect(0, 0, width(), height(), borderRadius());\n } else {\n g.rect(0, 0, width(), height());\n }\n if (border) {\n g.stroke(border);\n }\n g.fill(color());\n },\n ...props\n })\n}\n\nfunction drawShape(g: PixiGraphics, shape: 'circle' | 'ellipse', props: {\n radius: Signal<number>;\n color: Signal<string>;\n border: Signal<number>;\n} | {\n width: Signal<number>;\n height: Signal<number>;\n color: Signal<string>;\n border: Signal<number>;\n}) {\n const { color, border } = props;\n if ('radius' in props) {\n g.circle(0, 0, props.radius());\n } else {\n g.ellipse(0, 0, props.width() / 2, props.height() / 2);\n }\n if (border()) {\n g.stroke(border());\n }\n g.fill(color());\n}\n\nexport function Circle(props: CircleProps) { \n const { radius, color, border } = useProps(props, {\n border: null\n })\n return Graphics({\n draw: (g) => drawShape(g, 'circle', { radius, color, border }),\n ...props\n })\n}\n\nexport function Ellipse(props: EllipseProps) {\n const { width, height, color, border } = useProps(props, {\n border: null\n })\n return Graphics({\n draw: (g) => drawShape(g, 'ellipse', { width, height, color, border }),\n ...props\n })\n}\n\nexport function Triangle(props: TriangleProps) {\n const { width, height, color, border } = useProps(props, {\n border: null,\n color: '#000'\n })\n return Graphics({\n draw: (g) => {\n g.moveTo(0, height());\n g.lineTo(width() / 2, 0);\n g.lineTo(width(), height());\n g.lineTo(0, height());\n g.fill(color());\n if (border) {\n g.stroke(border);\n }\n },\n ...props\n })\n}\n\nexport function Svg(props: SvgProps) {\n return Graphics({\n draw: (g) => g.svg(props.svg),\n ...props\n })\n}","import {\n Subscription\n} from \"rxjs\";\nimport type { Element } from \"./reactive\";\nimport { Tick } from \"../directives/Scheduler\";\n\ntype MountFunction = (fn: (element: Element) => void) => void;\n\n// Define ComponentFunction type\nexport type ComponentFunction<P = {}> = (props: P) => Element | Promise<Element>;\n\nexport let currentSubscriptionsTracker: ((subscription: Subscription) => void) | null = null;\nexport let mountTracker: MountFunction | null = null;\n\n/**\n * Registers a mount function to be called when the component is mounted.\n * To unmount the component, the function must return a function that will be called by the engine.\n * \n * @param {(element: Element) => void} fn - The function to be called on mount.\n * @example\n * ```ts\n * mount((el) => {\n * console.log('mounted', el);\n * });\n * ```\n * Unmount the component by returning a function:\n * ```ts\n * mount((el) => {\n * console.log('mounted', el);\n * return () => {\n * console.log('unmounted', el);\n * }\n * });\n * ```\n */\nexport function mount(fn: (element: Element) => void) {\n mountTracker?.(fn);\n}\n\n/**\n * Registers a tick function to be called on each tick of the component's context.\n * @param {(tickValue: Tick, element: Element) => void} fn - The function to be called on each tick.\n * @example\n * ```ts\n * tick((tickValue, el) => {\n * console.log('tick', tickValue, el);\n * });\n * ```\n */\nexport function tick(fn: (tickValue: Tick, element: Element) => void) {\n mount((el: Element) => {\n const { context } = el.props\n let subscription: Subscription | undefined\n if (context.tick) {\n subscription = context.tick.observable.subscribe(({ value }) => {\n fn(value, el)\n })\n }\n return () => {\n subscription?.unsubscribe()\n }\n })\n}\n\n/**\n * Add tracking for subscriptions and mounts, then create an element from a component function.\n * @template C\n * @param {C} componentFunction - The component function to create an element from.\n * @param {Parameters<C>[0]} [props={}] - The props to pass to the component function.\n * @param {...any[]} children - The children elements of the component.\n * @returns {ReturnType<C>}\n * @example\n * ```ts\n * const el = h(MyComponent, {\n * x: 100,\n * y: 100,\n * });\n * ```\n * \n * with children:\n * ```ts\n * const el = h(MyComponent, {\n * x: 100,\n * y: 100,\n * }, \n * h(MyChildComponent, {\n * x: 50,\n * y: 50,\n * }),\n * );\n * ```\n */\nexport function h<C extends ComponentFunction<any>>(\n componentFunction: C,\n props: Parameters<C>[0] = {} as Parameters<C>[0],\n ...children: any[]\n): ReturnType<C> {\n const allSubscriptions = new Set<Subscription>();\n const allMounts = new Set<MountFunction>();\n\n currentSubscriptionsTracker = (subscription) => {\n allSubscriptions.add(subscription);\n };\n\n mountTracker = (fn: any) => {\n allMounts.add(fn);\n };\n\n if (children[0] instanceof Array) {\n children = children[0]\n }\n\n let component = componentFunction({ ...props, children }) as Element;\n\n if (!component) {\n component = {} as any\n }\n\n component.effectSubscriptions = Array.from(allSubscriptions);\n component.effectMounts = [\n ...Array.from(allMounts),\n ...((component as any).effectMounts ?? [])\n ];\n\n // call mount hook for root component\n if (component instanceof Promise) {\n component.then((component) => {\n if (component.props.isRoot) {\n allMounts.forEach((fn) => fn(component));\n }\n })\n }\n\n currentSubscriptionsTracker = null;\n mountTracker = null;\n\n return component as ReturnType<C>;\n}\n","import { h } from \"../engine/signal\";\nimport { Container } from \"./Container\";\n\nexport function Scene(props) {\n return h(Container)\n}","import * as particles from \"@barvynkoa/particle-emitter\";\nimport { createComponent, registerComponent } from \"../engine/reactive\";\nimport { CanvasContainer } from \"./Container\";\nimport { Signal } from \"@signe/reactive\";\n\nclass CanvasParticlesEmitter extends CanvasContainer {\n private emitter: particles.Emitter | null;\n private elapsed: number = Date.now();\n\n onMount(params) {\n super.onMount(params);\n const { props } = params;\n const tick: Signal = props.context.tick;\n this.emitter = new particles.Emitter(this as any, props.config);\n //this.emitter.emit = true\n\n this.subscriptionTick = tick.observable.subscribe((value) => {\n if (!this.emitter) return;\n const now = Date.now();\n this.emitter.update((now - this.elapsed) * 0.001);\n this.elapsed = now;\n });\n }\n\n onUpdate(props) {}\n\n onDestroy(): void {\n super.onDestroy();\n this.emitter?.destroy();\n this.emitter = null;\n this.subscriptionTick.unsubscribe();\n }\n}\n\nregisterComponent(\"ParticlesEmitter\", CanvasParticlesEmitter);\n\nexport function ParticlesEmitter(props) {\n return createComponent(\"ParticlesEmitter\", props);\n}\n","import { computed, effect, isSignal, Signal, WritableSignal } from \"@signe/reactive\";\nimport {\n Assets,\n Container,\n Sprite as PixiSprite,\n Rectangle,\n Texture,\n} from \"pixi.js\";\nimport { Subscription } from \"rxjs\";\nimport {\n Element,\n createComponent,\n registerComponent,\n} from \"../engine/reactive\";\nimport { arrayEquals, isFunction } from \"../engine/utils\";\nimport { DisplayObject } from \"./DisplayObject\";\nimport {\n AnimationFrames,\n FrameOptions,\n SpritesheetOptions,\n TextureOptions,\n TransformOptions,\n} from \"./types/Spritesheet\";\nimport { ComponentFunction } from \"../engine/signal\";\nimport { DisplayObjectProps } from \"./types/DisplayObject\";\nimport { AnimatedSignal, isAnimatedSignal } from \"../engine/animation\";\n\nconst log = console.log;\n\ntype Image = { image: string };\n\ntype TextureOptionsMerging = TextureOptions & {\n spriteWidth: number;\n spriteHeight: number;\n sound?: string;\n} & Image &\n TransformOptions;\n\ntype FrameOptionsMerging = TextureOptionsMerging & FrameOptions;\ntype SpritesheetOptionsMerging = TextureOptionsMerging & SpritesheetOptions;\ntype TransformOptionsAsArray = Pick<\n TransformOptions,\n \"anchor\" | \"scale\" | \"skew\" | \"pivot\"\n>;\n\ntype AnimationDataFrames = {\n sprites: FrameOptionsMerging[];\n frames: Texture[][];\n name: string;\n animations: AnimationFrames;\n params: any[];\n data: TextureOptionsMerging;\n};\n\nexport enum StandardAnimation {\n Stand = \"stand\",\n Walk = \"walk\",\n}\n\nexport class CanvasSprite extends DisplayObject(PixiSprite) {\n public hitbox: { w: number; h: number };\n public applyTransform: (\n frame: FrameOptionsMerging,\n data: TextureOptionsMerging,\n spritesheet: SpritesheetOptionsMerging\n ) => Partial<FrameOptionsMerging>;\n private spritesheet: SpritesheetOptionsMerging;\n private currentAnimation: AnimationDataFrames | null = null;\n private time: number = 0;\n private frameIndex: number = 0;\n private animations: Map<string, AnimationDataFrames> = new Map();\n private subscriptionTick: Subscription;\n private subscriptionSheet: Subscription[] = [];\n private sheetParams: any = {};\n private sheetCurrentAnimation: string = StandardAnimation.Stand;\n onFinish: () => void;\n\n private currentAnimationContainer: Container | null = null;\n\n private async createTextures(\n options: Required<TextureOptionsMerging>\n ): Promise<Texture[][]> {\n const { width, height, framesHeight, framesWidth, image, offset } = options;\n const texture = await Assets.load(image);\n const spriteWidth = options.spriteWidth;\n const spriteHeight = options.spriteHeight;\n const frames: Texture[][] = [];\n const offsetX = (offset && offset.x) || 0;\n const offsetY = (offset && offset.y) || 0;\n for (let i = 0; i < framesHeight; i++) {\n frames[i] = [];\n for (let j = 0; j < framesWidth; j++) {\n const rectX = j * spriteWidth + offsetX;\n const rectY = i * spriteHeight + offsetY;\n if (rectY > height) {\n throw log(\n `Warning, there is a problem with the height of the \"${this.id}\" spritesheet. When cutting into frames, the frame exceeds the height of the image.`\n );\n }\n if (rectX > width) {\n throw log(\n `Warning, there is a problem with the width of the \"${this.id}\" spritesheet. When cutting into frames, the frame exceeds the width of the image.`\n );\n }\n frames[i].push(\n new Texture({\n source: texture.source,\n frame: new Rectangle(rectX, rectY, spriteWidth, spriteHeight),\n })\n );\n }\n }\n return frames;\n }\n\n private async createAnimations() {\n const { textures } = this.spritesheet;\n if (!textures) {\n return;\n }\n for (let animationName in textures) {\n const props: (keyof TextureOptionsMerging)[] = [\n \"width\",\n \"height\",\n \"framesHeight\",\n \"framesWidth\",\n \"rectWidth\",\n \"rectHeight\",\n \"offset\",\n \"image\",\n \"sound\",\n ];\n const parentObj = props.reduce(\n (prev, val) => ({ ...prev, [val]: this.spritesheet[val] }),\n {}\n );\n const optionsTextures: TextureOptionsMerging = {\n ...parentObj,\n ...textures[animationName],\n } as any;\n const {\n rectWidth,\n width = 0,\n framesWidth = 1,\n rectHeight,\n height = 0,\n framesHeight = 1,\n } = optionsTextures;\n optionsTextures.spriteWidth = rectWidth ? rectWidth : width / framesWidth;\n optionsTextures.spriteHeight = rectHeight\n ? rectHeight\n : height / framesHeight;\n this.animations.set(animationName, {\n frames: await this.createTextures(\n optionsTextures as Required<TextureOptionsMerging>\n ),\n name: animationName,\n animations: textures[animationName].animations,\n params: [],\n data: optionsTextures,\n sprites: [],\n });\n }\n }\n\n async onMount(params: Element<CanvasSprite>) {\n const { props, propObservables } = params;\n const tick: Signal = props.context.tick;\n const sheet = props.sheet ?? {};\n if (sheet?.onFinish) {\n this.onFinish = sheet.onFinish;\n }\n this.subscriptionTick = tick.observable.subscribe((value) => {\n this.update(value);\n });\n if (props.sheet?.definition) {\n this.spritesheet = props.sheet.definition;\n await this.createAnimations();\n }\n if (sheet.params) {\n for (let key in propObservables?.sheet[\"params\"]) {\n const value = propObservables?.sheet[\"params\"][key] as Signal;\n if (isSignal(value)) {\n this.subscriptionSheet.push(\n value.observable.subscribe((value) => {\n if (this.animations.size == 0) return;\n this.play(this.sheetCurrentAnimation, [{ [key]: value }]);\n })\n );\n } else {\n this.play(this.sheetCurrentAnimation, [{ [key]: value }]);\n }\n }\n }\n\n const isMoving = computed(() => {\n const { x, y } = propObservables ?? {};\n if (!x || !y) return false;\n const xSignal = x as AnimatedSignal<any>;\n const ySignal = y as AnimatedSignal<any>;\n const isMovingX =\n isAnimatedSignal(xSignal) &&\n xSignal.animatedState().current !== xSignal.animatedState().end;\n const isMovingY =\n isAnimatedSignal(ySignal) &&\n ySignal.animatedState().current !== ySignal.animatedState().end;\n return isMovingX || isMovingY;\n });\n\n effect(() => {\n const _isMoving = isMoving();\n\n if (!this.isMounted) return;\n\n if (_isMoving) {\n this.sheetCurrentAnimation = StandardAnimation.Walk;\n } else {\n this.sheetCurrentAnimation = StandardAnimation.Stand;\n }\n\n this.play(this.sheetCurrentAnimation, [this.sheetParams]);\n });\n\n super.onMount(params);\n }\n\n async onUpdate(props) {\n super.onUpdate(props);\n\n const setTexture = async (image: string) => {\n const onProgress = this.fullProps.loader?.onProgress;\n const texture = await Assets.load(image, (progress) => {\n if (onProgress) onProgress(progress);\n if (progress == 1) {\n const onComplete = this.fullProps.loader?.onComplete;\n if (onComplete) {\n // hack to memoize the texture\n setTimeout(() => {\n onComplete(texture);\n });\n }\n }\n });\n\n return texture\n }\n\n const sheet = props.sheet;\n if (sheet?.params) this.sheetParams = sheet?.params;\n\n if (sheet?.playing && this.isMounted) {\n this.sheetCurrentAnimation = sheet?.playing;\n this.play(this.sheetCurrentAnimation, [this.sheetParams]);\n }\n\n if (props.hitbox) this.hitbox = props.hitbox;\n\n if (props.scaleMode) this.baseTexture.scaleMode = props.scaleMode;\n else if (props.image && this.fullProps.rectangle === undefined) {\n this.texture = await setTexture(this.fullProps.image);\n } else if (props.texture) {\n this.texture = props.texture;\n }\n if (props.rectangle !== undefined) {\n const { x, y, width, height } = props.rectangle?.value ?? props.rectangle;\n const texture = await setTexture(this.fullProps.image);\n this.texture = new Texture({\n source: texture.source,\n frame: new Rectangle(x, y, width, height),\n });\n }\n }\n\n onDestroy(): void {\n super.onDestroy();\n this.subscriptionSheet.forEach((sub) => sub.unsubscribe());\n this.subscriptionTick.unsubscribe();\n if (this.currentAnimationContainer && this.parent instanceof Container) {\n this.parent.removeChild(this.currentAnimationContainer);\n }\n }\n\n has(name: string): boolean {\n return this.animations.has(name);\n }\n\n get(name: string): AnimationDataFrames {\n return this.animations.get(name) as AnimationDataFrames;\n }\n\n isPlaying(name?: string): boolean {\n if (!name) return !!this.currentAnimation;\n if (this.currentAnimation == null) return false;\n return this.currentAnimation.name == name;\n }\n\n stop() {\n this.currentAnimation = null;\n this.destroy();\n }\n\n play(name: string, params: any[] = []) {\n const animParams = this.currentAnimation?.params;\n\n if (this.isPlaying(name) && arrayEquals(params, animParams || [])) return;\n\n const animation = this.get(name);\n\n if (!animation) {\n throw new Error(\n `Impossible to play the ${name} animation because it doesn't exist on the \"${this.id}\" spritesheet`\n );\n }\n\n const cloneParams = structuredClone(params);\n\n this.removeChildren();\n animation.sprites = [];\n this.currentAnimation = animation;\n this.currentAnimation.params = cloneParams;\n this.time = 0;\n this.frameIndex = 0;\n let animations: any = animation.animations;\n animations = isFunction(animations)\n ? (animations as Function)(...cloneParams)\n : animations;\n\n this.currentAnimationContainer = new Container();\n\n for (let container of animations as FrameOptionsMerging[][]) {\n const sprite = new PixiSprite();\n for (let frame of container) {\n this.currentAnimation.sprites.push(frame);\n }\n this.currentAnimationContainer.addChild(sprite);\n }\n\n const sound = this.currentAnimation.data.sound;\n\n if (sound) {\n //RpgSound.get(sound).play()\n }\n\n // Updates immediately to avoid flickering\n this.update({\n deltaRatio: 1,\n });\n }\n\n update({ deltaRatio }) {\n if (\n !this.isPlaying() ||\n !this.currentAnimation ||\n !this.currentAnimationContainer\n )\n return;\n\n const self = this;\n const { frames, sprites, data } = this.currentAnimation;\n let frame = sprites[this.frameIndex];\n const nextFrame = sprites[this.frameIndex + 1];\n\n for (let _sprite of this.currentAnimationContainer.children) {\n const sprite = _sprite as PixiSprite;\n\n if (!frame || frame.frameY == undefined || frame.frameX == undefined) {\n continue;\n }\n\n this.texture = frames[frame.frameY][frame.frameX];\n\n const getVal = <T extends keyof TransformOptions>(\n prop: T\n ): TransformOptions[T] | undefined => {\n return frame[prop] ?? data[prop] ?? this.spritesheet[prop];\n };\n\n const applyTransform = <T extends keyof TransformOptionsAsArray>(\n prop: T\n ): void => {\n const val = getVal<T>(prop);\n if (val) {\n this[prop as string].set(...val!);\n }\n };\n\n function applyTransformValue<T extends keyof TransformOptions>(prop: T);\n function applyTransformValue<T extends keyof TransformOptions>(\n prop: string,\n alias: T\n );\n function applyTransformValue<T extends keyof TransformOptions>(\n prop: T,\n alias?: T\n ): void {\n const optionProp = alias || prop;\n const val = getVal<T>(optionProp);\n if (val !== undefined) {\n self[prop as string] = val;\n }\n }\n\n if (this.applyTransform) {\n frame = {\n ...frame,\n ...this.applyTransform(frame, data, this.spritesheet),\n };\n }\n\n const realSize = getVal<\"spriteRealSize\">(\"spriteRealSize\");\n const heightOfSprite =\n typeof realSize == \"number\" ? realSize : realSize?.height;\n const widthOfSprite =\n typeof realSize == \"number\" ? realSize : realSize?.width;\n\n const applyAnchorBySize = () => {\n if (heightOfSprite && this.hitbox) {\n const { spriteWidth, spriteHeight } = data;\n const w = (spriteWidth - this.hitbox.w) / 2 / spriteWidth;\n const gap = (spriteHeight - heightOfSprite) / 2;\n const h = (spriteHeight - this.hitbox.h - gap) / spriteHeight;\n this.anchor.set(w, h);\n }\n };\n\n if (frame.sound) {\n //RpgSound.get(frame.sound).play()\n }\n\n applyAnchorBySize();\n\n applyTransform(\"anchor\");\n applyTransform(\"scale\");\n applyTransform(\"skew\");\n applyTransform(\"pivot\");\n\n applyTransformValue(\"alpha\", \"opacity\");\n applyTransformValue(\"x\");\n applyTransformValue(\"y\");\n applyTransformValue(\"angle\");\n applyTransformValue(\"rotation\");\n applyTransformValue(\"visible\");\n }\n\n if (!nextFrame) {\n this.time = 0;\n this.frameIndex = 0;\n if (this.onFinish && sprites.length > 1) this.onFinish();\n return;\n }\n\n this.time += deltaRatio ?? 1;\n\n if (this.time >= nextFrame.time) {\n this.frameIndex++;\n }\n }\n}\n\nexport interface CanvasSprite extends PixiSprite {}\n\nregisterComponent(\"Sprite\", CanvasSprite);\n\n// Define the props interface for Sprite\nexport interface SpriteProps extends DisplayObjectProps {\n sheet?: {\n definition?: SpritesheetOptionsMerging;\n playing?: string;\n params?: any;\n onFinish?: () => void;\n };\n scaleMode?: number;\n image?: string;\n rectangle?: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n context?: {\n tick: Signal;\n };\n}\n\nexport interface SpritePropsWithImage extends Omit<SpriteProps, \"sheet\"> {\n image: string;\n rectangle?: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n}\n\nexport interface SpritePropsWithSheet\n extends Omit<SpriteProps, \"image\" | \"rectangle\"> {\n sheet: {\n definition: SpritesheetOptionsMerging;\n playing?: string;\n params?: any;\n onFinish?: () => void;\n };\n loader?: {\n onProgress?: (progress: number) => void;\n onComplete?: (texture: Texture) => void;\n };\n}\n\nexport type SpritePropTypes = SpritePropsWithImage | SpritePropsWithSheet;\n\n// Update the Sprite function to use the props interface\nexport const Sprite: ComponentFunction<SpritePropTypes> = (props) => {\n return createComponent(\"Sprite\", props);\n};\n","import { effect, signal, type WritableSignal } from \"@signe/reactive\";\nimport { animate as animatePopmotion } from \"popmotion\";\n\nexport interface AnimateOptions<T> {\n duration?: number;\n ease?: (t: number) => number;\n onUpdate?: (value: T) => void;\n onComplete?: () => void;\n}\n\nexport interface AnimatedState<T> {\n current: T;\n start: T;\n end: T;\n}\n\nexport interface AnimatedSignal<T> extends Omit<WritableSignal<T>, 'set'> {\n (): T;\n set: (newValue: T, options?: AnimateOptions<T>) => Promise<void>;\n animatedState: WritableSignal<AnimatedState<T>>;\n update: (updater: (value: T) => T) => void;\n}\n\nexport function isAnimatedSignal(signal: WritableSignal<any>): boolean {\n return (signal as unknown as AnimatedSignal<any>).animatedState !== undefined;\n}\n\n/**\n * Creates an animated signal with the given initial value and animation options.\n * It's a writable signal that can be animated using popmotion. Properties of the animated signal are:\n * - current: the current value of the signal.\n * - start: the start value of the animation.\n * - end: the end value of the animation.\n * \n * @param initialValue The initial value of the signal.\n * @param options The animation options.\n * @returns The animated signal.\n * @example\n * const animatedValue = animatedSignal(0, { duration: 1000 });\n * animatedValue.set(10);\n * animatedValue.update((value) => value + 1);\n * console.log(animatedValue()); // 11\n * \n * animatedValue.animatedState() // { current: 10, start: 10, end: 11 }\n */\nexport function animatedSignal<T>(initialValue: T, options: AnimateOptions<T> = {}): AnimatedSignal<T> {\n const state: AnimatedState<T> = {\n current: initialValue,\n start: initialValue,\n end: initialValue,\n };\n let animation\n\n const publicSignal = signal(initialValue);\n const privateSignal = signal(state);\n\n effect(() => {\n const currentState = privateSignal();\n publicSignal.set(currentState.current);\n });\n\n function animatedSignal(): AnimatedState<T>;\n function animatedSignal(newValue: T): void;\n function animatedSignal(newValue: T, animationConfig: AnimateOptions<T>): void;\n function animatedSignal(newValue?: T, animationConfig: AnimateOptions<T> = {}): AnimatedState<T> | void {\n if (newValue === undefined) {\n return privateSignal();\n }\n \n const prevState = privateSignal();\n const newState: AnimatedState<T> = {\n current: prevState.current,\n start: prevState.current,\n end: newValue,\n };\n\n privateSignal.set(newState);\n\n if (animation) {\n animation.stop();\n }\n\n animation = animatePopmotion({\n // TODO\n duration: 20,\n ...options,\n ...animationConfig,\n from: prevState.current,\n to: newValue,\n onUpdate: (value) => {\n privateSignal.update(s => ({ ...s, current: value as T }));\n if (options.onUpdate) {\n options.onUpdate(value as T);\n }\n },\n });\n }\n\n const fn = function() {\n return privateSignal().current\n }\n\n for (const key in publicSignal) {\n fn[key] = publicSignal[key]\n }\n\n fn.animatedState = privateSignal\n fn.update = (updater: (value: T) => any) => {\n animatedSignal(updater(privateSignal().current));\n }\n fn.set = async (newValue: T, animationConfig: AnimateOptions<T> = {}) => {\n return new Promise<void>((resolve) => {\n animatedSignal(newValue, {\n ...animationConfig,\n onComplete: resolve\n });\n })\n }\n\n return fn as any\n}\n\n/**\n * Executes a sequence of animations. If an array is provided as an element in the sequence,\n * those animations will be executed in parallel.\n * \n * @param sequence Array of animation functions or arrays of animation functions for parallel execution\n * @returns Promise that resolves when all animations are complete\n * @example\n * ```ts\n * await animatedSequence([\n * () => value1.set(10),\n * [\n * () => value2.set(20),\n * () => value3.set(30)\n * ],\n * () => value1.set(0)\n * ])\n * ```\n */\nexport async function animatedSequence(sequence: ((() => Promise<void>) | (() => Promise<void>)[])[]) {\n for (const item of sequence) {\n if (Array.isArray(item)) {\n await Promise.all(item.map(fn => fn()));\n } else {\n await item();\n }\n }\n}","import { Texture } from \"pixi.js\";\nimport { h, mount } from \"../engine/signal\";\nimport { useDefineProps } from \"../hooks/useProps\";\nimport { Sprite } from \"./Sprite\";\nimport { effect, Signal, signal } from \"@signe/reactive\";\n\ninterface VideoProps {\n src: string;\n paused?: boolean;\n loop?: boolean;\n muted?: boolean;\n loader?: {\n onComplete?: (texture: Texture) => void;\n onProgress?: (progress: number) => void;\n };\n}\n\nexport function Video(props: VideoProps) {\n const eventsMap = {\n audioprocess: null,\n canplay: null,\n canplaythrough: null,\n complete: null,\n durationchange: null,\n emptied: null,\n ended: null,\n loadeddata: null,\n loadedmetadata: null,\n pause: null,\n play: null,\n playing: null,\n progress: null,\n ratechange: null,\n seeked: null,\n seeking: null,\n stalled: null,\n suspend: null,\n timeupdate: null,\n volumechange: null,\n waiting: null\n }\n\n const video: Signal<HTMLVideoElement | null> = signal(null)\n const defineProps = useDefineProps(props)\n const { play, loop, muted } = defineProps({\n play: {\n type: Boolean,\n default: true\n },\n loop: {\n type: Boolean,\n default: false\n },\n muted: {\n type: Boolean,\n default: false\n }\n })\n\n effect(() => {\n const _video = video()\n const state = play()\n if (_video && state !== undefined) {\n if (state) {\n _video.play()\n } else {\n _video.pause()\n }\n }\n if (_video && loop()) {\n _video.loop = loop()\n }\n if (_video && muted()) {\n _video.muted = muted()\n }\n })\n\n mount(() => {\n return () => {\n for (let event in eventsMap) {\n if (eventsMap[event]) {\n video().removeEventListener(event, eventsMap[event])\n }\n }\n }\n })\n\n return h(Sprite, {\n ...props,\n image: props.src,\n loader: {\n onComplete: (texture) => {\n const source = texture.source.resource\n video.set(source)\n if (props?.loader?.onComplete) {\n props.loader.onComplete(texture)\n }\n for (let event in eventsMap) {\n if (props[event]) {\n const cb = (ev) => {\n props[event](ev)\n }\n eventsMap[event] = cb\n source.addEventListener(event, cb)\n }\n }\n }\n }\n })\n}","import { Text as PixiText, TextStyle } from \"pixi.js\";\nimport { createComponent, registerComponent } from \"../engine/reactive\";\nimport { DisplayObject } from \"./DisplayObject\";\nimport { DisplayObjectProps } from \"./types/DisplayObject\";\nimport { Signal } from \"@signe/reactive\";\nimport { on } from \"../engine/trigger\";\n\nenum TextEffect {\n Typewriter = \"typewriter\",\n}\n\ninterface TextProps extends DisplayObjectProps {\n text?: string;\n style?: Partial<TextStyle>;\n color?: string;\n size?: string;\n fontFamily?: string;\n typewriter?: {\n speed?: number;\n start?: () => void;\n onComplete?: () => void;\n skip?: () => void;\n };\n}\n\nclass CanvasText extends DisplayObject(PixiText) {\n private subscriptionTick: any;\n private fullText: string = \"\";\n private currentIndex: number = 0;\n private typewriterSpeed: number = 1; // Default speed\n private _wordWrapWidth: number = 0;\n private typewriterOptions: any = {};\n private skipSignal?: () => void;\n\n onMount(args) {\n super.onMount(args);\n const { props } = args;\n const tick: Signal = props.context.tick;\n\n if (props.text && props.typewriter) {\n this.fullText = props.text;\n this.text = \"\";\n this.currentIndex = 0;\n // Set typewriter options\n if (props.typewriter) {\n this.typewriterOptions = props.typewriter;\n if (this.typewriterOptions.skip) {\n on(this.typewriterOptions.skip, () => {\n this.skipTypewriter();\n });\n }\n }\n }\n this.subscriptionTick = tick.observable.subscribe(() => {\n if (props.typewriter) {\n this.typewriterEffect();\n }\n });\n }\n\n onUpdate(props: TextProps) {\n super.onUpdate(props);\n if (props.typewriter) {\n if (props.typewriter) {\n this.typewriterOptions = props.typewriter;\n }\n }\n if (props.text !== undefined) {\n this.text = ''+props.text;\n }\n if (props.text !== undefined && props.text !== this.fullText && this.fullProps.typewriter) {\n this.text = \"\";\n this.currentIndex = 0;\n this.fullText = props.text;\n }\n if (props.style) {\n for (const key in props.style) {\n this.style[key] = props.style[key];\n }\n if (props.style.wordWrapWidth) {\n this._wordWrapWidth = props.style.wordWrapWidth;\n }\n }\n if (props.color) {\n this.style.fill = props.color;\n }\n if (props.size) {\n this.style.fontSize = props.size;\n }\n if (props.fontFamily) {\n this.style.fontFamily = props.fontFamily;\n }\n if (this._wordWrapWidth) {\n this.setWidth(this._wordWrapWidth);\n } else {\n this.setWidth(this.width);\n }\n this.setHeight(this.height);\n }\n\n get onCompleteCallback() {\n return this.typewriterOptions.onComplete;\n }\n\n private typewriterEffect() {\n if (this.currentIndex < this.fullText.length) {\n const nextIndex = Math.min(\n this.currentIndex + (this.typewriterOptions.speed ?? 1),\n this.fullText.length\n );\n this.text = this.fullText.slice(0, nextIndex);\n this.currentIndex = nextIndex;\n\n // Check if typewriter effect is complete\n if (\n this.currentIndex === this.fullText.length &&\n this.onCompleteCallback\n ) {\n this.onCompleteCallback();\n }\n }\n }\n\n // Add a method to skip the typewriter effect\n private skipTypewriter() {\n if (this.skipSignal) {\n this.skipSignal();\n }\n this.text = this.fullText;\n this.currentIndex = this.fullText.length;\n }\n\n onDestroy(): void {\n super.onDestroy();\n this.subscriptionTick.unsubscribe();\n }\n}\n\ninterface CanvasText extends PixiText {}\n\nregisterComponent(\"Text\", CanvasText);\n\nexport function Text(props: TextProps) {\n return createComponent(\"Text\", props);\n}\n","import { effect, signal } from \"@signe/reactive\";\n\ninterface Listen<T = any> {\n config: T | undefined;\n seed: {\n config: T | undefined;\n value: number;\n resolve: (value: any) => void;\n };\n}\n\ninterface Trigger<T = any> {\n start: () => Promise<void>;\n listen: () => Listen<T> | undefined;\n}\n\n/**\n * Checks if the given argument is a Trigger object\n * @param arg - The value to check\n * @returns True if the argument is a Trigger object\n */\nexport function isTrigger(arg: any): arg is Trigger<any> {\n return arg?.start && arg?.listen;\n}\n\n/**\n * Creates a new trigger that can be used to pass data between components\n * @param globalConfig - Optional configuration data to be passed when the trigger is activated\n * @returns A Trigger object with start and listen methods\n * @example\n * ```ts\n * const myTrigger = trigger()\n * \n * on(myTrigger, (data) => {\n * console.log('Triggered with data:', data)\n * })\n * \n * myTrigger.start({ message: 'Hello' })\n * ```\n */\nexport function trigger<T = any>(globalConfig?: T): Trigger<T> {\n const _signal = signal({\n config: globalConfig,\n value: 0,\n resolve: (value: any) => void 0,\n });\n return {\n start: (config?: T) => {\n return new Promise((resolve: (value: any) => void) => {\n _signal.set({\n config: {\n ...globalConfig,\n ...config,\n },\n resolve,\n value: Math.random(),\n });\n });\n },\n listen: (): Listen<T> | undefined => {\n return {\n config: globalConfig,\n seed: _signal(),\n };\n },\n };\n}\n\n/**\n * Subscribes to a trigger and executes a callback when the trigger is activated\n * @param triggerSignal - The trigger to subscribe to\n * @param callback - Function to execute when the trigger is activated\n * @throws Error if triggerSignal is not a valid trigger\n * @example\n * ```ts\n * const click = trigger()\n * \n * on(click, () => {\n * console.log('Click triggered')\n * })\n * ```\n */\nexport function on(triggerSignal: any, callback: (config: any) => void | Promise<void>) {\n if (!isTrigger(triggerSignal)) {\n throw new Error(\"In 'on(arg)' must have a trigger signal type\");\n }\n effect(() => {\n const result = triggerSignal.listen();\n if (result?.seed.value) {\n const ret = callback(result?.seed.config);\n if (ret && typeof ret.then === 'function') {\n ret.then(result?.seed.resolve);\n }\n }\n });\n}\n","import { TilingSprite as PixiTilingSprite, Texture } from 'pixi.js';\nimport { createComponent, registerComponent } from '../engine/reactive';\nimport { DisplayObject } from './DisplayObject';\nimport { DisplayObjectProps } from './types/DisplayObject';\n\ninterface TilingSpriteProps extends DisplayObjectProps {\n image?: string;\n tileScale?: { x: number; y: number };\n tilePosition?: { x: number; y: number };\n width?: number;\n height?: number;\n}\n\nclass CanvasTilingSprite extends DisplayObject(PixiTilingSprite) {\n onUpdate(props: TilingSpriteProps): void {\n super.onUpdate(props);\n if (props.image) {\n this.texture = Texture.from(props.image);\n }\n if (props.tileScale) {\n this.tileScale.set(props.tileScale.x, props.tileScale.y);\n }\n if (props.tilePosition) {\n this.tilePosition.set(props.tilePosition.x, props.tilePosition.y);\n }\n if (props.width !== undefined) {\n this.width = props.width;\n }\n if (props.height !== undefined) {\n this.height = props.height;\n }\n }\n}\n\nregisterComponent('TilingSprite', CanvasTilingSprite)\n\nexport function TilingSprite(props: TilingSpriteProps) {\n return createComponent('TilingSprite', props)\n}","import { Viewport as PixiViewport } from 'pixi-viewport';\nimport { Subscription } from 'rxjs';\nimport { createComponent, registerComponent } from '../engine/reactive';\nimport { DisplayObject } from './DisplayObject';\nimport { effect } from '@signe/reactive';\n\nconst EVENTS = [\n 'bounce-x-end',\n 'bounce-x-start',\n 'bounce-y-end',\n 'bounce-y-start',\n 'clicked',\n 'drag-end',\n 'drag-start',\n 'frame-end',\n 'mouse-edge-end',\n 'mouse-edge-start',\n 'moved',\n 'moved-end',\n 'pinch-end',\n 'pinch-start',\n 'snap-end',\n 'snap-start',\n 'snap-zoom-end',\n 'snap-zoom-start',\n 'wheel-scroll',\n 'zoomed',\n 'zoomed-end'\n]\n\nexport class CanvasViewport extends DisplayObject(PixiViewport) {\n private tickSubscription: Subscription\n overrideProps = ['wheel']\n\n constructor() {\n const defaultOptions = {\n noTicker: true,\n events: {\n domElement: {\n addEventListener: () => {}\n }\n },\n }\n // @ts-ignore\n super(defaultOptions) \n }\n\n onInit(props) {\n super.onInit(props)\n for (let event of EVENTS) {\n const camelCaseEvent = event.replace(/-([a-z])/g, (g) => g[1].toUpperCase());\n if (props[camelCaseEvent]) {\n this.on(event, props[camelCaseEvent])\n }\n }\n }\n\n onMount(element) {\n super.onMount(element)\n const { tick, renderer, canvasSize } = element.props.context\n let isDragging = false\n \n effect(() => {\n this.screenWidth = canvasSize().width\n this.screenHeight = canvasSize().height\n })\n\n renderer.events.domElement.addEventListener(\n 'wheel',\n this.input.wheelFunction\n );\n this.options.events = renderer.events\n \n this.tickSubscription = tick.observable.subscribe(({ value }) => {\n this.update(value.timestamp)\n })\n\n element.props.context.viewport = this\n this.updateViewportSettings(element.props)\n }\n\n onUpdate(props) {\n super.onUpdate(props)\n this.updateViewportSettings(props)\n }\n\n private updateViewportSettings(props) {\n if (props.screenWidth !== undefined) {\n this.screenWidth = props.screenWidth\n }\n if (props.screenHeight !== undefined) {\n this.screenHeight = props.screenHeight\n }\n if (props.worldWidth !== undefined) {\n this.worldWidth = props.worldWidth\n }\n if (props.worldHeight !== undefined) {\n this.worldHeight = props.worldHeight\n }\n // if (props.drag) {\n // if (props.drag === true) {\n \n // } else {\n // this.drag(props.drag)\n // }\n // }\n if (props.clamp) {\n this.clamp(props.clamp)\n }\n if (props.wheel) {\n if (props.wheel === true) {\n this.wheel()\n } else {\n this.wheel(props.wheel)\n }\n }\n if (props.decelerate) {\n if (props.decelerate === true) {\n this.decelerate()\n } else {\n this.decelerate(props.decelerate)\n }\n }\n if (props.pinch) {\n if (props.pinch === true) {\n this.pinch()\n } else {\n this.pinch(props.pinch)\n }\n }\n }\n\n onDestroy(): void {\n super.onDestroy()\n this.tickSubscription.unsubscribe()\n }\n}\n\nexport interface CanvasViewport extends PixiViewport { }\n\nregisterComponent('Viewport', CanvasViewport)\n\nexport interface ViewportProps {\n screenWidth?: number;\n screenHeight?: number;\n worldWidth?: number;\n worldHeight?: number;\n clamp?: boolean | {\n left?: number;\n right?: number;\n top?: number;\n bottom?: number;\n };\n [key: string]: any;\n}\n\nexport function Viewport(props: ViewportProps) {\n return createComponent('Viewport', props);\n}","import { Assets, NineSliceSprite as PixiNineSliceSprite, Texture } from \"pixi.js\";\nimport { createComponent, registerComponent } from \"../engine/reactive\";\nimport { DisplayObject } from \"./DisplayObject\";\nimport { DisplayObjectProps } from \"./types/DisplayObject\";\n\ninterface NineSliceSpriteProps extends DisplayObjectProps {\n image?: string;\n texture?: Texture;\n width?: number;\n height?: number;\n leftWidth?: number;\n rightWidth?: number;\n topHeight?: number;\n bottomHeight?: number;\n roundPixels?: boolean;\n}\n\nclass CanvasNineSliceSprite extends DisplayObject(PixiNineSliceSprite) {\n constructor() {\n // @ts-ignore\n super({\n width: 0,\n height: 0\n });\n }\n\n async onUpdate(props: NineSliceSpriteProps) {\n for (const [key, value] of Object.entries(props)) {\n if (value !== undefined) {\n if (key === 'image') {\n this.texture = await Assets.load(value);\n } else if (key in this) {\n (this as any)[key] = value;\n }\n }\n }\n }\n}\n\ninterface CanvasNineSliceSprite extends PixiNineSliceSprite {}\n\nregisterComponent(\"NineSliceSprite\", CanvasNineSliceSprite);\n\nexport function NineSliceSprite(props: NineSliceSpriteProps) {\n return createComponent(\"NineSliceSprite\", props);\n}\n","import { ComponentFunction, h } from \"./signal\";\n\n/**\n * Bootstraps a canvas element and renders it to the DOM.\n * \n * @param rootElement - The HTML element where the canvas will be rendered. Can be null.\n * @param canvas - A Promise that resolves to an Element representing the canvas component.\n * @returns A Promise that resolves to the rendered canvas element.\n * @throws {Error} If the provided element is not a Canvas component.\n */\nexport const bootstrapCanvas = async (rootElement: HTMLElement | null, canvas: ComponentFunction<any>) => {\n const canvasElement = await h(canvas);\n if (canvasElement.tag != 'Canvas') {\n throw new Error('Canvas is required');\n }\n (canvasElement as any).render(rootElement);\n\n return canvasElement;\n};\n","import { \n linear,\n easeIn,\n easeInOut,\n easeOut,\n circIn,\n circInOut,\n circOut,\n backIn,\n backInOut,\n backOut,\n anticipate,\n bounceIn,\n bounceInOut,\n bounceOut\n} from \"popmotion\"\n\nexport const Easing = {\n linear,\n easeIn,\n easeInOut,\n easeOut,\n circIn,\n circInOut,\n circOut,\n backIn,\n backInOut,\n backOut,\n anticipate,\n bounceIn,\n bounceInOut,\n bounceOut\n}","import { Texture, ImageSource, DOMAdapter, Matrix } from \"pixi.js\";\n\n/**\n * Creates a radial gradient texture that can be used in PixiJS.\n * @example\n * const gradient = new RadialGradient(size, size, 0, size, size, 0);\n * gradient.addColorStop(0, \"rgba(255, 255, 0, 1)\");\n * gradient.addColorStop(0.5, \"rgba(255, 255, 0, 0.3)\");\n * gradient.addColorStop(0.8, \"rgba(255, 255, 0, 0)\");\n */\nexport class RadialGradient {\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D | null;\n private gradient: CanvasGradient | null = null;\n private texture: Texture | null = null;\n public transform: Matrix;\n\n public size = 600;\n\n /**\n * Creates a new RadialGradient instance\n * @param x0 - The x-coordinate of the starting circle\n * @param y0 - The y-coordinate of the starting circle\n * @param x1 - The x-coordinate of the ending circle\n * @param y1 - The y-coordinate of the ending circle\n * @param x2 - The x-coordinate for gradient transformation\n * @param y2 - The y-coordinate for gradient transformation\n * @param focalPoint - The focal point of the gradient (0-1), defaults to 0\n */\n constructor(\n private x0: number,\n private y0: number,\n private x1: number,\n private y1: number,\n private x2: number,\n private y2: number,\n private focalPoint: number = 0\n ) {\n this.size = x0;\n const halfSize = this.size * 0.5;\n\n this.canvas = DOMAdapter.get().createCanvas() as any;\n this.canvas.width = this.size;\n this.canvas.height = this.size;\n this.ctx = this.canvas.getContext(\"2d\");\n\n if (this.ctx) {\n this.gradient = this.ctx.createRadialGradient(\n halfSize * (1 - focalPoint),\n halfSize,\n 0,\n halfSize,\n halfSize,\n halfSize - 0.5\n );\n }\n }\n\n /**\n * Adds a color stop to the gradient\n * @param offset - The position of the color stop (0-1)\n * @param color - The color value (any valid CSS color string)\n */\n addColorStop(offset: number, color: string) {\n if (this.gradient) {\n this.gradient.addColorStop(offset, color);\n }\n }\n\n /**\n * Renders the gradient and returns the texture with its transformation matrix\n * @param options - Render options\n * @param options.translate - Optional translation coordinates\n * @returns Object containing the texture and transformation matrix\n */\n render({ translate }: { translate?: { x: number; y: number } } = {}) {\n const { x0, y0, x1, y1, x2, y2, focalPoint } = this;\n const defaultSize = this.size;\n if (this.ctx && this.gradient) {\n this.ctx.fillStyle = this.gradient;\n this.ctx.fillRect(0, 0, defaultSize, defaultSize);\n\n this.texture = new Texture({\n source: new ImageSource({\n resource: this.canvas,\n addressModeU: \"clamp-to-edge\",\n addressModeV: \"clamp-to-edge\",\n }),\n });\n\n const m = new Matrix();\n const dx = Math.sqrt((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0));\n const dy = Math.sqrt((x2 - x0) * (x2 - x0) + (y2 - y0) * (y2 - y0));\n const angle = Math.atan2(y1 - y0, x1 - x0);\n\n // Calculate the scale factors correctly\n const scaleX = dx / defaultSize;\n const scaleY = dy / defaultSize;\n\n // Apply transformations in the correct order\n m.rotate(-angle);\n m.scale(scaleX, scaleY);\n if (translate) {\n m.translate(translate.x, translate.y);\n }\n\n this.transform = m;\n }\n\n return {\n texture: this.texture,\n matrix: this.transform,\n };\n }\n}\n"],"mappings":"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J,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EAC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","names":["loop","tick","loop","volume","effect","effect","signal","Container","isSignal","props","path","isSignal","value","element","components","comp","signal","key","isSignal","isSignal","effect","signal","EVENTS","signal","effect","Container","Canvas","signal","effect","h","Container","effect","effect","component","Container","tick","effect","isSignal","Container","Rectangle","Texture","effect","signal","animatedSignal","log","log","Texture","Rectangle","tick","isSignal","value","effect","Container","h","Sprite","effect","signal","loop","Sprite","effect","signal","tick","Texture","Texture","effect","EVENTS","tick","Assets","Assets","Texture"]}
1
+ {"version":3,"sources":["../src/engine/directive.ts","../src/engine/utils.ts","../src/directives/KeyboardControls.ts","../src/directives/Scheduler.ts","../src/directives/ViewportFollow.ts","../src/directives/Sound.ts","../src/directives/Drag.ts","../src/hooks/addContext.ts","../src/hooks/useProps.ts","../src/engine/reactive.ts","../src/directives/Transition.ts","../src/index.ts","../src/components/Canvas.ts","../src/components/DisplayObject.ts","../src/components/Container.ts","../src/components/Graphic.ts","../src/engine/signal.ts","../src/components/Scene.ts","../src/components/ParticleEmitter.ts","../src/components/Sprite.ts","../src/engine/animation.ts","../src/components/Video.ts","../src/components/Text.ts","../src/engine/trigger.ts","../src/components/TilingSprite.ts","../src/components/Viewport.ts","../src/components/NineSliceSprite.ts","../src/engine/bootstrap.ts","../src/utils/Ease.ts","../src/utils/RadialGradient.ts"],"sourcesContent":["import { Element } from \"./reactive\"\n\nexport const directives: { [key: string]: any } = {}\n\nexport abstract class Directive {\n abstract onDestroy(element: Element<any>);\n abstract onInit(element: Element<any>);\n abstract onMount(element: Element<any>);\n abstract onUpdate(props: any, element: Element<any>);\n}\n\nexport function registerDirective(name: string, directive: any) {\n directives[name] = directive\n}\n\nexport function applyDirective(element: Element, directiveName: string) {\n if (!directives[directiveName]) {\n return null\n }\n const directive = new directives[directiveName]()\n directive.onInit?.(element)\n return directive\n}","import { ObservablePoint } from \"pixi.js\"\n\n/**\n * Checks if code is running in a browser environment\n * @returns {boolean} True if running in browser, false otherwise\n */\nexport function isBrowser(): boolean {\n return typeof window !== 'undefined'\n}\n\n/**\n * Returns current high-resolution timestamp\n * @returns {number} Current time in milliseconds\n */\nexport function preciseNow(): number {\n return typeof performance !== 'undefined' ? performance.now() : Date.now()\n}\n\n/**\n * Converts frames per second to milliseconds\n * @param {number} fps - Frames per second\n * @returns {number} Milliseconds per frame\n */\nexport function fps2ms(fps: number): number {\n return 1000 / fps\n}\n\n/**\n * Checks if a value is a Promise\n * @param {any} value - Value to check\n * @returns {boolean} True if value is a Promise, false otherwise\n */\nexport function isPromise(value: any): boolean {\n return value && value instanceof Promise\n}\n\nexport function arrayEquals(a: any[], b: any[]): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n const v = a[i];\n const bv = b[i];\n if (typeof v === 'object' && v !== null) {\n if (typeof bv !== 'object' || bv === null) return false;\n if (Array.isArray(v)) {\n if (!Array.isArray(bv) || !arrayEquals(v, bv)) return false;\n } else if (!objectEquals(v, bv)) {\n return false;\n }\n } else if (v !== bv) {\n return false;\n }\n }\n return true;\n}\n\nfunction objectEquals(a: object, b: object): boolean {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n for (let key of keysA) {\n if (!b.hasOwnProperty(key)) return false;\n if (!deepEquals(a[key], b[key])) return false;\n }\n return true;\n}\n\nfunction deepEquals(a: any, b: any): boolean {\n if (a === b) return true;\n if (typeof a !== typeof b) return false;\n if (typeof a === 'object' && a !== null) {\n if (Array.isArray(a)) {\n return Array.isArray(b) && arrayEquals(a, b);\n }\n return objectEquals(a, b);\n }\n return false;\n}\n\n/**\n * Checks if a value is a function\n * @param {unknown} val - Value to check\n * @returns {boolean} True if value is a function, false otherwise\n */\nexport function isFunction(val: unknown): boolean {\n return {}.toString.call(val) === '[object Function]'\n}\n\n/**\n * Checks if a value is a plain object\n * @param {unknown} val - Value to check\n * @returns {boolean} True if value is an object (not null and not array), false otherwise\n */\nexport function isObject(val: unknown): boolean {\n return typeof val == 'object' && val != null && !Array.isArray(val)\n}\n\n/**\n * Sets a value in an object using a dot notation path\n * @param {Record<string, any>} obj - Target object\n * @param {string | string[]} path - Path to set value at (e.g., 'a.b.c' or ['a', 'b', 'c'])\n * @param {any} value - Value to set\n * @param {boolean} onlyPlainObject - If true, only creates plain objects in path\n * @returns {Record<string, any>} Modified object\n */\nexport function set(\n obj: Record<string, any>, \n path: string | string[], \n value: any, \n onlyPlainObject = false\n): Record<string, any> {\n if (Object(obj) !== obj) return obj;\n\n if (typeof path === 'string') {\n path = path.split('.');\n }\n\n let len = path.length;\n if (!len) return obj;\n\n let current = obj;\n for (let i = 0; i < len - 1; i++) {\n let segment = path[i];\n let nextSegment: number | string = path[i + 1];\n let isNextNumeric = !isNaN(Number(nextSegment)) && isFinite(Number(nextSegment));\n\n if (!current[segment] || typeof current[segment] !== 'object') {\n current[segment] = (isNextNumeric && !onlyPlainObject) ? [] : {};\n }\n\n current = current[segment];\n }\n\n current[path[len - 1]] = value;\n\n return obj;\n}\n\n/**\n * Gets a value from an object using a dot notation path\n * @param {Record<string, any>} obj - Source object\n * @param {string} path - Path to get value from (e.g., 'a.b.c')\n * @returns {any} Value at path or undefined if not found\n */\nexport function get(obj: Record<string, any>, path: string): any {\n const keys = path.split('.');\n let current = obj;\n\n for (let key of keys) {\n if (current[key] === undefined) {\n return undefined;\n }\n current = current[key];\n }\n\n return current;\n}\n\n/**\n * Logs a message to console\n * @param {any} text - Message to log\n */\nexport function log(text: any): void {\n console.log(text)\n}\n\n/**\n * Logs an error message to console\n * @param {any} text - Error message to log\n */\nexport function error(text: any): void {\n console.error(text)\n}\n\n/**\n * Sets the position of an ObservablePoint using various input formats\n * @param {ObservablePoint} observablePoint - The point to modify\n * @param {Object | number | [number, number]} point - New position value\n */\nexport function setObservablePoint(\n observablePoint: ObservablePoint, \n point: { x: number, y: number } | number | [number, number]\n): void {\n if (typeof point === 'number') {\n observablePoint.set(point);\n }\n else if (Array.isArray(point)) {\n observablePoint.set(point[0], point[1]);\n }\n else {\n observablePoint.set(point.x, point.y);\n }\n}\n\n/**\n * Calculates the Euclidean distance between two points\n * @param {number} x1 - X coordinate of first point\n * @param {number} y1 - Y coordinate of first point\n * @param {number} x2 - X coordinate of second point\n * @param {number} y2 - Y coordinate of second point\n * @returns {number} Distance between the points\n */\nexport function calculateDistance(\n x1: number, \n y1: number, \n x2: number, \n y2: number\n): number {\n const dx = x1 - x2;\n const dy = y1 - y2;\n return Math.sqrt(dx * dx + dy * dy);\n}","import { Directive, registerDirective } from \"../engine/directive\";\nimport { Element } from \"../engine/reactive\";\nimport { fps2ms } from \"../engine/utils\";\n\nexport enum Input {\n Break = 'break',\n Backspace = 'backspace',\n Tab = 'tab',\n Clear = 'clear',\n Enter = 'enter',\n Shift = 'shift',\n Ctrl = 'ctrl',\n Alt = 'alt',\n Pause = 'pause/break',\n CapsLock = 'caps lock',\n Escape = 'escape',\n Conversion = 'conversion',\n NonConversion = 'non-conversion',\n Space = 'space',\n PageUp = 'page up',\n PageDown = 'page down',\n End = 'end',\n Home = 'home',\n Left = 4,\n Up = 1,\n Right = 2,\n Down = 3,\n Select = 'select',\n Print = 'print',\n Execute = 'execute',\n PrintScreen = 'Print Screen',\n Insert = 'insert',\n Delete = 'delete',\n Zero = '0',\n One = '1',\n Two = '2',\n Three = '3',\n Four = '4',\n Five = '5',\n Six = '6',\n Seven = '7',\n Height = '8',\n Nine = '9',\n Equal = '=',\n Semicolon = 'semicolon (firefox), equals',\n LessThan = '<',\n Equals = 'equals (firefox)',\n Beta = 'ß',\n At = '@',\n A = 'a',\n B = 'b',\n C = 'c',\n D = 'd',\n E = 'e',\n F = 'f',\n G = 'g',\n H = 'h',\n I = 'i',\n J = 'j',\n K = 'k',\n L = 'l',\n M = 'm',\n N = 'n',\n O = 'o',\n P = 'p',\n Q = 'q',\n R = 'r',\n S = 's',\n T = 't',\n U = 'u',\n V = 'v',\n W = 'w',\n X = 'x',\n Y = 'y',\n Z = 'z',\n SearchKey = 'Windows Key / Left ⌘ / Chromebook Search key',\n NumPad0 = 'numpad 0',\n NumPad1 = 'numpad 1',\n NumPad2 = 'numpad 2',\n NumPad3 = 'numpad 3',\n NumPad4 = 'numpad 4',\n NumPad5 = 'numpad 5',\n NumPad6 = 'numpad 6',\n NumPad7 = 'numpad 7',\n NumPad8 = 'numpad 8',\n NumPad9 = 'numpad 9',\n Multiply = 'multiply',\n Add = 'add',\n Subtract = 'subtract',\n DecimalPoint = 'decimal point',\n Divide = 'divide',\n F1 = 'f1',\n F2 = 'f2',\n F3 = 'f3',\n F4 = 'f4',\n F5 = 'f5',\n F6 = 'f6',\n F7 = 'f7',\n F8 = 'f8',\n F9 = 'f9',\n F10 = 'f10',\n F11 = 'f11',\n F12 = 'f12',\n F13 = 'f13',\n F14 = 'f14',\n F15 = 'f15',\n F16 = 'f16',\n F17 = 'f17',\n F18 = 'f18',\n F19 = 'f19',\n F20 = 'f20',\n F21 = 'f21',\n F22 = 'f22',\n F23 = 'f23',\n F24 = 'f24',\n NumLock = 'num lock',\n ScrollLock = 'scroll lock',\n CircumflexAccent = '^',\n ExclamationMark = '!',\n Hash = '#',\n Dollar = '$',\n AccentU = 'ù',\n PageBackward = 'page backward',\n PageForWard = 'page forward',\n Star = '*',\n DecreaseVolume = 'decrease volume level',\n IncreaseVolume = 'increase volume level',\n Next = 'next',\n Previous = 'previous',\n Stop = 'stop',\n PlayPause = 'play/pause',\n Email = 'e-mail',\n SemiColon = 'semi-colon / ñ',\n EqualSign = 'equal sign',\n Comma = 'comma',\n Dash = 'dash',\n FowardSlach = 'forward slash / ç',\n GraveAccent = 'grave accent / ñ / æ',\n OpenBracket = 'open bracket',\n BackSlach = 'back slash',\n CloseBracket = 'close bracket / å',\n SingleQuote = 'single quote / ø',\n BackQuote = '`',\n Altgr = 'altgr'\n}\n\nexport interface ControlOptions {\n repeat?: boolean;\n bind: string | string[];\n keyUp?: Function;\n keyDown?: Function;\n delay?: number | {\n duration: number;\n otherControls?: (string)[];\n };\n}\nexport interface Controls {\n [controlName: string]: ControlOptions;\n}\n\n// keyboard handling\nconst keyCodeTable = {\n 3: 'break',\n 8: 'backspace', // backspace / delete\n 9: 'tab',\n 12: 'clear',\n 13: 'enter',\n 16: 'shift',\n 17: 'ctrl',\n 18: 'alt',\n 19: 'pause/break',\n 20: 'caps lock',\n 27: 'escape',\n 28: 'conversion',\n 29: 'non-conversion',\n 32: 'space',\n 33: 'page up',\n 34: 'page down',\n 35: 'end',\n 36: 'home',\n 37: 'left',\n 38: 'up',\n 39: 'right',\n 40: 'down',\n 41: 'select',\n 42: 'print',\n 43: 'execute',\n 44: 'Print Screen',\n 45: 'insert',\n 46: 'delete',\n 48: 'n0',\n 49: 'n1',\n 50: 'n2',\n 51: 'n3',\n 52: 'n4',\n 53: 'n5',\n 54: 'n6',\n 55: 'n7',\n 56: 'n8',\n 57: 'n9',\n 58: ':',\n 59: 'semicolon (firefox), equals',\n 60: '<',\n 61: 'equals (firefox)',\n 63: 'ß',\n 64: '@',\n 65: 'a',\n 66: 'b',\n 67: 'c',\n 68: 'd',\n 69: 'e',\n 70: 'f',\n 71: 'g',\n 72: 'h',\n 73: 'i',\n 74: 'j',\n 75: 'k',\n 76: 'l',\n 77: 'm',\n 78: 'n',\n 79: 'o',\n 80: 'p',\n 81: 'q',\n 82: 'r',\n 83: 's',\n 84: 't',\n 85: 'u',\n 86: 'v',\n 87: 'w',\n 88: 'x',\n 89: 'y',\n 90: 'z',\n 91: 'Windows Key / Left ⌘ / Chromebook Search key',\n 92: 'right window key',\n 93: 'Windows Menu / Right ⌘',\n 96: 'numpad 0',\n 97: 'numpad 1',\n 98: 'numpad 2',\n 99: 'numpad 3',\n 100: 'numpad 4',\n 101: 'numpad 5',\n 102: 'numpad 6',\n 103: 'numpad 7',\n 104: 'numpad 8',\n 105: 'numpad 9',\n 106: 'multiply',\n 107: 'add',\n 108: 'numpad period (firefox)',\n 109: 'subtract',\n 110: 'decimal point',\n 111: 'divide',\n 112: 'f1',\n 113: 'f2',\n 114: 'f3',\n 115: 'f4',\n 116: 'f5',\n 117: 'f6',\n 118: 'f7',\n 119: 'f8',\n 120: 'f9',\n 121: 'f10',\n 122: 'f11',\n 123: 'f12',\n 124: 'f13',\n 125: 'f14',\n 126: 'f15',\n 127: 'f16',\n 128: 'f17',\n 129: 'f18',\n 130: 'f19',\n 131: 'f20',\n 132: 'f21',\n 133: 'f22',\n 134: 'f23',\n 135: 'f24',\n 144: 'num lock',\n 145: 'scroll lock',\n 160: '^',\n 161: '!',\n 163: '#',\n 164: '$',\n 165: 'ù',\n 166: 'page backward',\n 167: 'page forward',\n 169: 'closing paren (AZERTY)',\n 170: '*',\n 171: '~ + * key',\n 173: 'minus (firefox), mute/unmute',\n 174: 'decrease volume level',\n 175: 'increase volume level',\n 176: 'next',\n 177: 'previous',\n 178: 'stop',\n 179: 'play/pause',\n 180: 'e-mail',\n 181: 'mute/unmute (firefox)',\n 182: 'decrease volume level (firefox)',\n 183: 'increase volume level (firefox)',\n 186: 'semi-colon / ñ',\n 187: 'equal sign',\n 188: 'comma',\n 189: 'dash',\n 190: 'period',\n 191: 'forward slash / ç',\n 192: 'grave accent / ñ / æ',\n 193: '?, / or °',\n 194: 'numpad period (chrome)',\n 219: 'open bracket',\n 220: 'back slash',\n 221: 'close bracket / å',\n 222: 'single quote / ø',\n 223: '`',\n 224: 'left or right ⌘ key (firefox)',\n 225: 'altgr',\n 226: '< /git >',\n 230: 'GNOME Compose Key',\n 231: 'ç',\n 233: 'XF86Forward',\n 234: 'XF86Back',\n 240: 'alphanumeric',\n 242: 'hiragana/katakana',\n 243: 'half-width/full-width',\n 244: 'kanji',\n 255: 'toggle touchpad'\n};\n\nconst inverse = (obj) => {\n const newObj = {}\n for (let key in obj) {\n const val = obj[key]\n newObj[val] = key\n }\n return newObj\n}\n\nconst inverseKeyCodeTable = inverse(keyCodeTable)\n\ntype BoundKey = { actionName: string, options: ControlOptions, parameters?: any }\n\nexport class KeyboardControls extends Directive {\n private keyState: {\n [keyName: string]: {\n isDown: boolean,\n count: number\n } | null\n } = {}\n private boundKeys: {\n [keyName: string]: BoundKey\n } = {}\n private stop: boolean = false\n private lastKeyPressed: number | null = null\n private _controlsOptions: Controls = {}\n private interval: any\n // TODO: This should be dynamic\n private serverFps: number = 60\n private directionState: {\n up: boolean,\n down: boolean,\n left: boolean,\n right: boolean\n } = {\n up: false,\n down: false,\n left: false,\n right: false\n };\n\n onInit(element: Element) {\n const value = element.props.controls.value ?? element.props.controls\n if (!value) return\n this.setupListeners();\n this.setInputs(value)\n // The processing is outside the rendering loop because if the FPS are lower (or higher) then the sending to the server would be slower or faster. Here it is constant\n this.interval = setInterval(() => {\n this.preStep()\n }, fps2ms(this.serverFps ?? 60))\n }\n\n onMount(element: Element) {}\n\n onUpdate(props) {\n this.setInputs(props)\n }\n\n onDestroy() {\n clearInterval(this.interval)\n document.removeEventListener('keydown', (e) => { this.onKeyChange(e, true); });\n document.removeEventListener('keyup', (e) => { this.onKeyChange(e, false); });\n }\n\n /** @internal */\n preStep() {\n if (this.stop) return;\n\n const direction = this.getDirection();\n if (direction !== 'none') {\n // Trigger only the composite direction\n const directionControl = this.boundKeys[direction];\n if (directionControl) {\n const { keyDown } = directionControl.options;\n if (keyDown ) {\n this.applyInput(direction);\n }\n }\n } else {\n // Process other controls as before\n const boundKeys = Object.keys(this.boundKeys);\n for (let keyName of boundKeys) {\n this.applyInput(keyName);\n }\n }\n }\n\n private applyInput(keyName: string) {\n const keyState = this.keyState[keyName];\n if (!keyState) return;\n const { isDown, count } = keyState;\n if (isDown) {\n const { repeat, keyDown } = this.boundKeys[keyName].options;\n if ((repeat || count == 0)) {\n let parameters = this.boundKeys[keyName].parameters;\n if (typeof parameters === \"function\") {\n parameters = parameters();\n }\n if (keyDown) {\n keyDown(this.boundKeys[keyName]);\n }\n this.keyState[keyName]!.count++;\n }\n }\n }\n\n private setupListeners() {\n document.addEventListener('keydown', (e) => { this.onKeyChange(e, true); });\n document.addEventListener('keyup', (e) => { this.onKeyChange(e, false); });\n }\n\n private bindKey(keys: Input | Input[], actionName: string, options: ControlOptions, parameters?: object) {\n if (!Array.isArray(keys)) keys = [keys] as Input[]\n const keyOptions = Object.assign({\n repeat: false\n }, options);\n (keys as Input[]).forEach(keyName => {\n this.boundKeys[keyName] = { actionName, options: keyOptions, parameters }\n })\n }\n\n private applyKeyDown(name: string) {\n const code = inverseKeyCodeTable[name]\n const e: any = new Event('keydown')\n e.keyCode = code\n this.onKeyChange(e, true)\n }\n\n private applyKeyUp(name: string) {\n const code = inverseKeyCodeTable[name]\n const e: any = new Event('keyup')\n e.keyCode = code\n this.onKeyChange(e, false)\n }\n\n private applyKeyPress(name: string): Promise<void> {\n return new Promise((resolve: any) => {\n this.applyKeyDown(name)\n setTimeout(() => {\n this.applyKeyUp(name)\n resolve()\n }, 200)\n })\n }\n\n private onKeyChange(e: KeyboardEvent, isDown: boolean) {\n e = (e || window.event) as KeyboardEvent;\n\n const keyName: string = keyCodeTable[e.keyCode];\n\n if (keyName && this.boundKeys[keyName]) {\n if (this.keyState[keyName] == null) {\n this.keyState[keyName] = {\n count: 0,\n isDown: true\n };\n }\n this.keyState[keyName]!.isDown = isDown;\n\n // key up, reset press count\n if (!isDown) {\n this.keyState[keyName]!.count = 0\n const { keyUp } = this.boundKeys[keyName].options\n if (keyUp) {\n keyUp(this.boundKeys[keyName]);\n }\n }\n\n // keep reference to the last key pressed to avoid duplicates\n this.lastKeyPressed = isDown ? e.keyCode : null;\n }\n\n if (keyName) {\n this.updateDirectionState(keyName, isDown);\n }\n }\n\n private updateDirectionState(keyName: string, isDown: boolean) {\n switch (keyName) {\n case 'up':\n this.directionState.up = isDown;\n break;\n case 'down':\n this.directionState.down = isDown;\n break;\n case 'left':\n this.directionState.left = isDown;\n break;\n case 'right':\n this.directionState.right = isDown;\n break;\n }\n }\n\n private getDirection(): string {\n const { up, down, left, right } = this.directionState;\n\n if (up && left) return 'up_left';\n if (up && right) return 'up_right';\n if (down && left) return 'down_left';\n if (down && right) return 'down_right';\n if (up) return 'up';\n if (down) return 'down';\n if (left) return 'left';\n if (right) return 'right';\n\n return 'none';\n }\n\n /**\n * From the name of the entry, we retrieve the control information\n * \n * ```ts \n * import { Input, inject, KeyboardControls } from '@rpgjs/client'\n * \n * const controls = inject(KeyboardControls)\n * controls.getControl(Input.Enter)\n\n * if (control) {\n * console.log(control.actionName) // action\n * }\n * ```\n * @title Get Control\n * @method getControl(inputName)\n * @param {string} inputName\n * @returns { { actionName: string, options: any } | undefined }\n * @memberof KeyboardControls\n */\n getControl(inputName: string): BoundKey | undefined {\n return this.boundKeys[inputName]\n }\n\n /**\n * Returns all controls\n * \n * @method getControls()\n * @since 4.2.0\n * @returns { { [key: string]: BoundKey } }\n * @memberof KeyboardControls\n */\n getControls(): { [key: string]: BoundKey } {\n return this.boundKeys\n }\n\n /**\n * Triggers an input according to the name of the control\n * \n * ```ts \n * import { Control, inject, KeyboardControls } from '@rpgjs/client'\n * \n * const controls = inject(KeyboardControls)\n * controls.applyControl(Control.Action)\n * ```\n * \n * You can put a second parameter or indicate on whether the key is pressed or released\n * \n * ```ts \n * import { Control, inject, KeyboardControls } from '@rpgjs/client'\n * \n * const controls = inject(KeyboardControls)\n * controls.applyControl(Control.Up, true) // keydown\n * controls.applyControl(Control.Up, false) // keyup\n * ```\n * @title Apply Control\n * @method applyControl(controlName,isDown)\n * @param {string} controlName\n * @param {boolean} [isDown]\n * @returns {Promise<void>}\n * @memberof KeyboardControls\n */\n async applyControl(controlName: string | number, isDown?: boolean | undefined): Promise<void> {\n const control = this._controlsOptions[controlName]\n if (control) {\n const input = Array.isArray(control.bind) ? control.bind[0] : control.bind\n if (isDown === undefined) {\n await this.applyKeyPress(input as string)\n }\n else if (isDown) {\n this.applyKeyDown(input as string)\n }\n else {\n this.applyKeyUp(input as string)\n }\n }\n }\n\n /**\n * Stop listening to the inputs. Pressing a key won't do anything\n * \n * @title Stop Inputs\n * @method stopInputs()\n * @returns {void}\n * @memberof KeyboardControls\n */\n stopInputs() {\n this.stop = true\n }\n\n /**\n * Listen to the inputs again\n * \n * @title Listen Inputs\n * @method listenInputs()\n * @returns {void}\n * @memberof KeyboardControls\n */\n listenInputs() {\n this.stop = false\n this.keyState = {}\n }\n\n /**\n * Assign custom inputs to the scene\n * \n * The object is the following:\n * \n * * the key of the object is the name of the control. Either it is existing controls (Up, Dow, Left, Right, Action, Back) or customized controls\n * * The value is an object representing control information:\n * * repeat {boolean} The key can be held down to repeat the action. (false by default)\n * * bind {string | string[]} To which key is linked the control\n * * method {Function} Function to be triggered. If you do not set this property, the name of the control is sent directly to the server.\n * * delay {object|number} (since v3.2.0) Indicates how long (in milliseconds) the player can press the key again to perform the action\n * * delay.duration\n * * delay.otherControls {string | string[]} Indicates the other controls that will also have the delay at the same time\n * \n * ```ts \n * import { Control, Input, inject, KeyboardControls } from '@rpgjs/client'\n * \n * const controls = inject(KeyboardControls)\n * controls.setInputs({\n [Control.Up]: {\n repeat: true,\n bind: Input.Up\n },\n [Control.Down]: {\n repeat: true,\n bind: Input.Down\n },\n [Control.Right]: {\n repeat: true,\n bind: Input.Right\n },\n [Control.Left]: {\n repeat: true,\n bind: Input.Left\n },\n [Control.Action]: {\n bind: [Input.Space, Input.Enter]\n },\n [Control.Back]: {\n bind: Input.Escape\n },\n\n // The myscustom1 control is sent to the server when the A key is pressed.\n mycustom1: {\n bind: Input.A\n },\n\n // the myAction method is executed when the B key is pressed\n mycustom2: {\n bind: Input.B,\n method({ actionName }) {\n console.log('cool', actionName)\n }\n },\n\n // The player can redo the action after 400ms\n mycustom3: {\n bind: Input.C,\n delay: 400 // ms\n },\n\n // The player can redo the action (mycustom4) and the directions after 400ms\n mycustom4: {\n bind: Input.C,\n delay: {\n duration: 400,\n otherControls: [Control.Up, Control.Down, Control.Left, Control.Right]\n }\n }\n })\n * \n * ```\n * @enum {string} Control \n * \n * Control.Up | up\n * Control.Down | down\n * Control.Left | left\n * Control.Right | right\n * Control.Action | action\n * Control.Back | back\n * \n * @enum {string} Mouse Event \n * \n * click | Click\n * dblclick | Double Click\n * mousedown | Mouse Down\n * mouseup | Mouse Up\n * mouseover | Mouse Over\n * mousemove | Mouse Move\n * mouseout | Mouse Out\n * contextmenu | Context Menu\n * \n * \n * @enum {string} Input \n * \n * break | Pause\n * backspace | Backspace / Delete\n * tab | Tab\n * clear | Clear\n * enter | Enter\n * shift | Shift\n * ctrl | Control\n * alt | Alt\n * pause/break | Pause / Break\n * caps lock | Caps Lock\n * escape | Escape\n * conversion | Conversion\n * non-conversion | Non-conversion\n * space | Space\n * page up | Page Up\n * page down | Page Down\n * end | End\n * home | Home\n * left | Left Arrow\n * up | Up Arrow\n * right | Right Arrow\n * down | Down Arrow\n * select | Select\n * print | Print\n * execute | Execute\n * Print Screen | Print Screen\n * insert | Insert\n * delete | Delete\n * n0 | 0\n * n1 | 1\n * n2 | 2\n * n3 | 3\n * n4 | 4\n * n5 | 5\n * n6 | 6\n * n7 | 7\n * n8 | 8\n * n9 | 9\n * : | Colon\n * semicolon (firefox), equals | Semicolon (Firefox), Equals\n * < | Less Than\n * equals (firefox) | Equals (Firefox)\n * ß | Eszett\n * @ | At\n * a | A\n * b | B\n * c | C\n * d | D\n * e | E\n * f | F\n * g | G\n * h | H\n * i | I\n * j | J\n * k | K\n * l | L\n * m | M\n * n | N\n * o | O\n * p | P\n * q | Q\n * r | R\n * s | S\n * t | T\n * u | U\n * v | V\n * w | W\n * x | X\n * y | Y\n * z | Z\n * Windows Key / Left ⌘ / Chromebook Search key | Windows Key / Left Command ⌘ / Chromebook Search Key\n * right window key | Right Windows Key\n * Windows Menu / Right ⌘ | Windows Menu / Right Command ⌘\n * numpad 0 | Numpad 0\n * numpad 1 | Numpad 1\n * numpad 2 | Numpad 2\n * numpad 3 | Numpad 3\n * numpad 4 | Numpad 4\n * numpad 5 | Numpad 5\n * numpad 6 | Numpad 6\n * numpad 7 | Numpad 7\n * numpad 8 | Numpad 8\n * numpad 9 | Numpad 9\n * multiply | Multiply\n * add | Add\n * numpad period (firefox) | Numpad Period (Firefox)\n * subtract | Subtract\n * decimal point | Decimal Point\n * divide | Divide\n * f1 | F1\n * f2 | F2\n * f3 | F3\n * f4 | F4\n * f5 | F5\n * f6 | F6\n * f7 | F7\n * f8 | F8\n * f9 | F9\n * f10 | F10\n * f11 | F11\n * f12 | F12\n * f13 | F13\n * f14 | F14\n * f15 | F15\n * f16 | F16\n * f17 | F17\n * f18 | F18\n * f19 | F19\n * f20 | F20\n * f21 | F21\n * f22 | F22\n * f23 | F23\n * f24 | F24\n * num lock | Num Lock\n * scroll lock | Scroll Lock\n * ^ | Caret\n * ! | Exclamation Point\n * # | Hash\n * $ | Dollar Sign\n * ù | Grave Accent U\n * page backward | Page Backward\n * page forward | Page Forward\n * closing paren (AZERTY) | Closing Parenthesis (AZERTY)\n * * | Asterisk\n * ~ + * key | Tilde + Asterisk Key\n * minus (firefox), mute/unmute | Minus (Firefox), Mute/Unmute\n * decrease volume level | Decrease Volume Level\n * increase volume level | Increase Volume Level\n * next | Next\n * previous | Previous\n * stop | Stop\n * play/pause | Play/Pause\n * e-mail | Email\n * mute/unmute (firefox) | Mute/Unmute (Firefox)\n * decrease volume level (firefox) | Decrease Volume Level (Firefox)\n * increase volume level (firefox) | Increase Volume Level (Firefox)\n * semi-colon / ñ | Semicolon / ñ\n * equal sign | Equal Sign\n * comma | Comma\n * dash | Dash\n * period | Period\n * forward slash / ç | Forward Slash / ç\n * grave accent / ñ / æ | Grave Accent / ñ / æ\n * ?, / or ° | ?, / or °\n * numpad period (chrome) | Numpad Period (Chrome)\n * open bracket | Open Bracket\n * back slash | Backslash\n * close bracket / å | Close Bracket / å\n * single quote / ø | Single Quote / ø\n * \\` | Backtick\n * left or right ⌘ key (firefox) | Left or Right Command Key (Firefox)\n * altgr | AltGr\n * < /git > | < /git >\n * GNOME Compose Key | GNOME Compose Key\n * ç | ç\n * XF86Forward | XF86Forward\n * XF86Back | XF86Back\n * alphanumeric | Alphanumeric\n * hiragana/katakana | Hiragana/Katakana\n * half-width/full-width | Half-Width/Full-Width\n * kanji | Kanji\n * toggle touchpad | Toggle Touchpad\n * \n * @title Set Inputs\n * @method setInputs(inputs)\n * @param {object} inputs\n * @memberof KeyboardControls\n */\n setInputs(inputs: Controls) {\n if (!inputs) return\n this.boundKeys = {}\n let inputsTransformed: any = {}\n for (let control in inputs) {\n const option = inputs[control]\n const { bind } = option\n let inputsKey: any = bind\n if (!Array.isArray(inputsKey)) {\n inputsKey = [bind]\n }\n for (let input of inputsKey) {\n this.bindKey(input, control, option)\n }\n }\n this._controlsOptions = inputs\n }\n\n get options(): Controls {\n return this._controlsOptions\n }\n}\n\nregisterDirective('controls', KeyboardControls)","import { WritableSignal } from '@signe/reactive';\nimport { Directive, registerDirective } from '../engine/directive';\nimport { Element } from '../engine/reactive';\nimport * as Utils from '../engine/utils';\n\nexport interface Tick {\n timestamp: number\n deltaTime: number\n frame: number\n deltaRatio: number\n}\n\nexport class Scheduler extends Directive {\n private maxFps?: number\n private fps: number = 60\n private deltaTime: number = 0\n public frame: number = 0\n private timestamp: number = 0\n private requestedDelay: number = 0\n private lastTimestamp: number = 0\n private _stop: boolean = false\n private tick: WritableSignal<Tick | null>\n \n onInit(element: Element) { \n this.tick = element.propObservables?.tick as any\n }\n\n onDestroy() { }\n onMount(element: Element) { }\n onUpdate(props: any) { }\n\n nextTick(timestamp: number) {\n this.lastTimestamp = this.lastTimestamp || this.timestamp // first\n this.deltaTime = Utils.preciseNow() - this.timestamp\n this.timestamp = timestamp\n this.tick.set({\n timestamp: this.timestamp,\n deltaTime: this.deltaTime,\n frame: this.frame,\n deltaRatio: ~~this.deltaTime / ~~Utils.fps2ms(this.fps)\n })\n this.lastTimestamp = this.timestamp\n this.frame++\n }\n /**\n * start the schedule\n * @return {Scheduler} returns this scheduler instance\n */\n start(options: {\n maxFps?: number\n fps?: number,\n delay?: number\n } = {}) {\n if (options.maxFps) this.maxFps = options.maxFps\n if (options.fps) this.fps = options.fps\n if (options.delay) this.requestedDelay = options.delay\n const requestAnimationFrame = (fn: (timestamp: number) => void) => {\n if (Utils.isBrowser()) {\n window.requestAnimationFrame(fn.bind(this))\n }\n else {\n setTimeout(() => {\n this.requestedDelay = 0\n fn(Utils.preciseNow())\n }, Utils.fps2ms(this.fps) + this.requestedDelay)\n }\n }\n\n if (!this.maxFps) {\n const loop = (timestamp: number) => {\n requestAnimationFrame(loop)\n this.nextTick(timestamp)\n }\n requestAnimationFrame(loop)\n }\n else {\n const msInterval = Utils.fps2ms(this.maxFps)\n let now = Utils.preciseNow()\n let then = Utils.preciseNow()\n const loop = (timestamp: number) => {\n if (this._stop) return\n requestAnimationFrame(loop)\n now = Utils.preciseNow()\n const elapsed = now - then\n if (elapsed > msInterval) {\n then = now - (elapsed % msInterval)\n this.nextTick(timestamp)\n }\n }\n requestAnimationFrame(loop)\n }\n\n return this;\n }\n\n stop() {\n this._stop = true\n }\n}\n\nregisterDirective('tick', Scheduler)","import { ComponentInstance } from '../components/DisplayObject';\nimport { Directive, registerDirective } from '../engine/directive';\nimport { Element } from '../engine/reactive';\nimport { error } from '../engine/utils';\n\nexport class ViewportFollow extends Directive {\n onInit(element: Element<ComponentInstance>) {\n\n }\n onMount(element: Element) {\n this.onUpdate(element.props, element)\n }\n onUpdate(props: any, element: Element) {\n const { viewportFollow } = element.props\n const { viewport } = element.props.context\n if (!viewport) {\n throw error('ViewportFollow directive requires a Viewport component to be mounted in the same context')\n }\n if (viewportFollow) {\n viewport.follow(element.componentInstance)\n } else {\n viewport.plugins.remove('follow')\n }\n }\n onDestroy(element: Element) {\n const { viewportFollow } = element.props\n const { viewport } = element.props.context\n if (viewportFollow) viewport.plugins.remove('follow')\n }\n}\n\nregisterDirective('viewportFollow', ViewportFollow)","import { effect } from '@signe/reactive';\nimport { Howl } from 'howler';\nimport { Container } from 'pixi.js';\nimport { Subscription } from 'rxjs';\nimport { Directive, registerDirective } from '../engine/directive';\nimport { Element } from '../engine/reactive';\nimport { calculateDistance, error } from '../engine/utils';\n\nconst EVENTS = ['load', 'loaderror', 'playerror', 'play', 'end', 'pause', 'stop', 'mute', 'volume', 'rate', 'seek', 'fade', 'unlock']\n\nexport class Sound extends Directive {\n private sound: Howl\n private eventsFn: ((...args: any[]) => void)[] = []\n private maxVolume: number = 1\n private maxDistance: number = 100\n private tickSubscription?: Subscription \n\n onInit(element: Element<Container>) { }\n\n onMount(element: Element<Container>) {\n const { props } = element\n const tick = props.context.tick\n const { src, autoplay, loop, volume, spatial } = props.sound\n this.sound = new Howl({\n src,\n autoplay,\n loop,\n volume\n })\n for (let event of EVENTS) {\n if (!props.sound[event]) continue\n const fn = props.sound[event]\n this.eventsFn.push(fn)\n this.sound.on(event, fn);\n }\n\n if (spatial) {\n const { soundListenerPosition } = props.context\n if (!soundListenerPosition) {\n throw new error('SoundListenerPosition directive is required for spatial sound in component parent')\n }\n const { x: listenerX, y: listenerY } = soundListenerPosition\n this.tickSubscription = effect(() => {\n tick()\n const { x, y } = element.componentInstance\n const distance = calculateDistance(x, y, listenerX(), listenerY());\n const volume = Math.max(this.maxVolume - (distance / this.maxDistance), 0)\n this.sound.volume(volume)\n }).subscription\n }\n }\n\n onUpdate(props: any) {\n const { volume, loop, mute, seek, playing, rate, spatial } = props\n if (volume != undefined) this.sound.volume(volume)\n if (loop != undefined) this.sound.loop(loop)\n if (mute != undefined) this.sound.mute(mute)\n if (seek != undefined) this.sound.seek(seek)\n if (playing != undefined) {\n if (playing) this.sound.play()\n else this.sound.pause()\n }\n if (spatial) {\n this.maxVolume = spatial.maxVolume ?? this.maxVolume\n this.maxDistance = spatial.maxDistance ?? this.maxDistance\n }\n if (rate != undefined) this.sound.rate(rate)\n }\n\n onDestroy() {\n this.sound.stop()\n this.tickSubscription?.unsubscribe()\n for (let event of EVENTS) {\n if (this.eventsFn[event]) {\n this.sound.off(event, this.eventsFn[event]);\n }\n }\n }\n}\n\nclass SoundListenerPosition extends Directive {\n onMount(element: Element<any>) {\n element.props.context.soundListenerPosition = element.propObservables?.soundListenerPosition\n }\n onInit(element: Element<any>) { }\n onUpdate(props: any) { }\n onDestroy() { }\n}\n\nregisterDirective('sound', Sound)\nregisterDirective('soundListenerPosition', SoundListenerPosition)","import { effect, isSignal, signal } from '@signe/reactive';\nimport { Container, Rectangle, Point, FederatedPointerEvent } from 'pixi.js';\nimport { Directive, registerDirective } from '../engine/directive';\nimport { Element } from '../engine/reactive';\nimport { snap } from 'popmotion';\nimport { addContext } from '../hooks/addContext';\nimport { Subscription } from 'rxjs';\nimport { useProps } from '../hooks/useProps';\n\nexport class Drop extends Directive {\n private elementRef: Element<Container> | null = null;\n\n onInit(element: Element<Container>) {\n this.elementRef = element;\n }\n\n onMount(element: Element<Container>) {\n addContext(element, 'drop', element);\n }\n\n onUpdate() {}\n\n onDestroy() {\n this.elementRef = null;\n }\n}\n\nexport class Drag extends Directive {\n private elementRef: Element<Container> | null = null;\n private stageRef: Container | null = null;\n private offsetInParent = new Point();\n private isDragging = false;\n private viewport: any | null = null;\n private animationFrameId: number | null = null;\n private lastPointerPosition: Point = new Point();\n\n private onDragMoveHandler: (event: FederatedPointerEvent) => void = () => {};\n private onDragEndHandler: () => void = () => {};\n private onDragStartHandler: (event: FederatedPointerEvent) => void = () => {};\n\n private subscriptions: Subscription[] = [];\n\n onInit(element: Element<Container>) {\n this.elementRef = element;\n this.onDragMoveHandler = this.onDragMove.bind(this);\n this.onDragEndHandler = this.onDragEnd.bind(this);\n this.onDragStartHandler = this.onPointerDown.bind(this);\n }\n\n onMount(element: Element<Container>) {\n const { rootElement, canvasSize, viewport, tick } = element.props.context;\n const instance = element.componentInstance;\n const dragProps = this.dragProps;\n const haveNotProps = Object.keys(dragProps).length === 0;\n\n if (haveNotProps) {\n this.onDestroy();\n return;\n }\n \n if (!instance) return;\n this.stageRef = rootElement.componentInstance;\n if (!this.stageRef) return;\n this.viewport = viewport;\n\n instance.eventMode = 'static';\n this.stageRef.eventMode = 'static';\n\n const _effect = effect(() => {\n if (this.stageRef) {\n this.stageRef.hitArea = new Rectangle(0, 0, canvasSize().width, canvasSize().height);\n }\n });\n\n instance.on('pointerdown', this.onDragStartHandler);\n this.stageRef.on('pointerup', this.onDragEndHandler);\n this.stageRef.on('pointerupoutside', this.onDragEndHandler);\n\n this.subscriptions = [\n tick.observable.subscribe(() => {\n if (this.isDragging && this.viewport) {\n this.updateViewportPosition(this.lastPointerPosition);\n }\n }),\n _effect.subscription\n ]\n }\n\n get dragProps() {\n const drag = this.elementRef?.props.drag\n const options = useProps(drag?.value ?? drag, {\n snap: 0,\n viewport: {},\n direction: 'all'\n });\n options.viewport = useProps(options.viewport, {\n edgeThreshold: 300,\n maxSpeed: 40\n });\n return options;\n }\n\n get axis() {\n const direction = this.dragProps.direction();\n const axis = {\n x: true,\n y: true,\n }\n if (direction === 'x') {\n axis.y = false;\n }\n if (direction === 'y') {\n axis.x = false;\n }\n return axis;\n }\n\n /**\n * Updates element position when dragging and starts continuous viewport movement\n * @param event The pointer event that triggered the drag move\n */\n private onDragMove(event: FederatedPointerEvent) {\n if (!this.isDragging || !this.elementRef?.componentInstance || !this.elementRef.componentInstance.parent) return;\n\n const instance = this.elementRef.componentInstance;\n const parent = instance.parent;\n const dragProps = this.dragProps;\n const propObservables = this.elementRef.propObservables;\n const snapTo = snap(dragProps?.snap() ?? 0);\n\n dragProps?.move?.(event);\n\n const currentParentLocalPointer = parent.toLocal(event.global);\n\n const newX = currentParentLocalPointer.x - this.offsetInParent.x;\n const newY = currentParentLocalPointer.y - this.offsetInParent.y;\n\n if (dragProps?.snap()) {\n instance.position.x = snapTo(newX);\n instance.position.y = snapTo(newY);\n } else {\n if (this.axis.x) instance.position.x = newX;\n if (this.axis.y) instance.position.y = newY;\n }\n\n // Store the last pointer position for continuous viewport movement\n this.lastPointerPosition.copyFrom(event.global);\n\n const { x: xProp, y: yProp } = propObservables as any;\n if (xProp !== undefined && isSignal(xProp)) {\n // xProp.set(instance.position.x)\n }\n if (yProp !== undefined && isSignal(yProp)) {\n // yProp.set(instance.position.y)\n }\n }\n\n /**\n * Moves the viewport if the dragged element is near screen edges\n * @param globalPosition The global pointer position\n */\n private updateViewportPosition(globalPosition: Point) {\n if (!this.viewport || !this.elementRef) return;\n\n const dragProps = this.dragProps;\n const edgeThreshold = dragProps?.viewport?.edgeThreshold(); // Distance from edge to trigger viewport movement\n const maxSpeed = dragProps?.viewport?.maxSpeed(); // Maximum speed when element is at the very edge\n \n // Calculate screen boundaries\n const screenLeft = 0;\n const screenRight = this.viewport.screenWidth;\n const screenTop = 0;\n const screenBottom = this.viewport.screenHeight;\n const instance = this.elementRef.componentInstance;\n \n // Calculate distances from element to screen edges\n const distanceFromLeft = globalPosition.x - screenLeft;\n const distanceFromRight = screenRight - globalPosition.x;\n const distanceFromTop = globalPosition.y - screenTop;\n const distanceFromBottom = screenBottom - globalPosition.y;\n \n let moveX = 0;\n let moveY = 0;\n \n // Calculate horizontal movement with dynamic velocity\n if (distanceFromLeft < edgeThreshold) {\n // Velocity increases as distance decreases\n // When distance = 0, velocity = maxSpeed\n // When distance = threshold, velocity = 0\n const velocity = maxSpeed * (1 - (distanceFromLeft / edgeThreshold));\n moveX = -velocity;\n } else if (distanceFromRight < edgeThreshold) {\n const velocity = maxSpeed * (1 - (distanceFromRight / edgeThreshold));\n moveX = velocity;\n }\n \n // Calculate vertical movement with dynamic velocity\n if (distanceFromTop < edgeThreshold) {\n const velocity = maxSpeed * (1 - (distanceFromTop / edgeThreshold));\n moveY = -velocity;\n } else if (distanceFromBottom < edgeThreshold) {\n const velocity = maxSpeed * (1 - (distanceFromBottom / edgeThreshold));\n moveY = velocity;\n }\n \n // Apply movement with velocity-based displacement\n if (moveX !== 0 || moveY !== 0) {\n const lastViewValue = this.viewport.center;\n this.viewport.moveCenter(\n this.viewport.center.x + moveX,\n this.viewport.center.y + moveY\n );\n if (this.axis.x && lastViewValue.x !== this.viewport.center.x) {\n instance.position.x += moveX;\n }\n if (this.axis.y && lastViewValue.y !== this.viewport.center.y) {\n instance.position.y += moveY;\n }\n }\n }\n\n /**\n * Handles drag end event and stops viewport movement\n */\n private onDragEnd() {\n if (!this.isDragging || !this.elementRef) return;\n\n const dragProps = this.dragProps;\n this.isDragging = false;\n dragProps?.end?.();\n \n if (this.stageRef) {\n this.stageRef.off('pointermove', this.onDragMoveHandler);\n }\n }\n\n private onPointerDown(event: FederatedPointerEvent) {\n if (!this.elementRef?.componentInstance || !this.stageRef || !this.elementRef.componentInstance.parent) return;\n\n const instance = this.elementRef.componentInstance;\n const parent = instance.parent;\n const dragProps = this.dragProps;\n\n const parentLocalPointer = parent.toLocal(event.global);\n\n this.offsetInParent.x = parentLocalPointer.x - instance.position.x;\n this.offsetInParent.y = parentLocalPointer.y - instance.position.y;\n\n this.isDragging = true;\n \n // Store initial pointer position\n this.lastPointerPosition.copyFrom(event.global);\n \n dragProps?.start?.();\n this.stageRef.on('pointermove', this.onDragMoveHandler);\n }\n\n onUpdate(props) {\n if (props.type && props.type === 'reset') {\n this.onDestroy();\n this.onMount(this.elementRef);\n }\n }\n\n onDestroy() {\n this.subscriptions.forEach(subscription => subscription.unsubscribe());\n const instance = this.elementRef?.componentInstance;\n if (instance) {\n instance.off('pointerdown', this.onDragStartHandler);\n }\n if (this.stageRef) {\n this.stageRef.off('pointermove', this.onDragMoveHandler);\n this.stageRef.off('pointerup', this.onDragEndHandler);\n this.stageRef.off('pointerupoutside', this.onDragEndHandler);\n }\n this.stageRef = null;\n this.viewport = null;\n }\n}\n\nregisterDirective('drag', Drag);\nregisterDirective('drop', Drop);","export const addContext = (element, key, value) => {\n element.props.context = {\n ...(element.props.context ?? {}),\n [key]: value\n }\n}","import { isSignal, signal } from \"@signe/reactive\"\nimport { isPrimitive } from \"../engine/reactive\"\n\n/**\n * Converts props into reactive signals if they are primitive values.\n * \n * @param {object} props - The properties to convert.\n * @param {object} [defaults={}] - Default values for properties.\n * @returns {object} An object with reactive signals.\n * \n * @example\n * const props = useProps({ count: 0, name: \"John\" });\n * console.log(props.count()); // 0\n * props.count.set(1);\n * console.log(props.count()); // 1\n */\nexport const useProps = (props, defaults = {}): any => {\n if (isSignal(props)) {\n return props()\n }\n const obj = {}\n for (let key in props) {\n const value = props[key]\n obj[key] = isPrimitive(value) ? signal(value) : value\n }\n for (let key in defaults) {\n if (!(key in obj)) {\n obj[key] = isPrimitive(defaults[key]) ? signal(defaults[key]) : defaults[key]\n }\n }\n return obj\n}\n\ntype PropType = NumberConstructor | StringConstructor | BooleanConstructor | \n FunctionConstructor | ObjectConstructor | ArrayConstructor | \n null | (new (...args: any[]) => any);\n\ninterface PropConfig {\n type?: PropType | PropType[];\n required?: boolean;\n default?: any | ((props: any) => any);\n validator?: (value: any, props: any) => boolean;\n}\n\ntype PropSchema = {\n [key: string]: PropType | PropType[] | PropConfig;\n}\n\n/**\n * Validates and defines properties based on a schema.\n * \n * @param {object} props - The properties to validate.\n * @returns {function} A function that takes a schema and returns validated properties.\n * \n * @example\n * const schema = {\n * age: { type: Number, required: true },\n * name: { type: String, default: \"Anonymous\" }\n * };\n * const validatedProps = useDefineProps({ age: 25 })(schema);\n * console.log(validatedProps.age()); // 25\n * console.log(validatedProps.name()); // \"Anonymous\"\n */\nexport const useDefineProps = (props: any) => {\n return (schema?: PropSchema) => {\n const rawProps = isSignal(props) ? props() : props\n const validatedProps: { [key: string]: any } = {}\n\n for (const key in schema) {\n const propConfig = schema[key]\n const value = rawProps[key]\n let validatedValue: any\n\n // Handle simple type definition\n if (typeof propConfig === 'function') {\n validateType(key, value, [propConfig])\n validatedValue = value\n }\n // Handle array of types\n else if (Array.isArray(propConfig)) {\n validateType(key, value, propConfig)\n validatedValue = value\n }\n // Handle detailed configuration object\n else if (propConfig && typeof propConfig === 'object') {\n // Check required prop\n if (propConfig.required && value === undefined) {\n throw new Error(`Missing required prop: ${key}`)\n }\n \n // Validate type if specified\n if (propConfig.type) {\n const types = Array.isArray(propConfig.type) ? propConfig.type : [propConfig.type]\n validateType(key, value, types)\n }\n \n // Run custom validator if provided\n if (propConfig.validator && !propConfig.validator(value, rawProps)) {\n throw new Error(`Invalid prop: custom validation failed for prop \"${key}\"`)\n }\n \n // Set default value if value is undefined\n if (value === undefined && 'default' in propConfig) {\n validatedValue = typeof propConfig.default === 'function' \n ? propConfig.default(rawProps)\n : propConfig.default\n } else {\n validatedValue = value\n }\n }\n\n validatedProps[key] = isSignal(validatedValue) \n ? validatedValue \n : signal(validatedValue)\n }\n \n return {\n ...useProps(rawProps),\n ...validatedProps\n }\n }\n}\n\n/**\n * Validates the type of a property.\n * \n * @param {string} key - The property key.\n * @param {any} value - The property value.\n * @param {any[]} types - The expected types.\n * @throws Will throw an error if the type check fails.\n */\nfunction validateType(key: string, value: any, types: any[]) {\n if (value === undefined || value === null) return\n \n // Si c'est un signal, on vérifie la valeur du signal\n const valueToCheck = isSignal(value) ? value() : value\n \n const valid = types.some(type => {\n if (type === Number) return typeof valueToCheck === 'number'\n if (type === String) return typeof valueToCheck === 'string'\n if (type === Boolean) return typeof valueToCheck === 'boolean'\n if (type === Function) return typeof valueToCheck === 'function'\n if (type === Object) return typeof valueToCheck === 'object'\n if (type === Array) return Array.isArray(valueToCheck)\n if (type === null) return valueToCheck === null\n return valueToCheck instanceof type\n })\n \n if (!valid) {\n throw new Error(\n `Invalid prop: type check failed for prop \"${key}\". ` +\n `Expected ${types.map(t => t.name).join(' or ')}`\n )\n }\n}","import { Signal, WritableArraySignal, WritableObjectSignal, isSignal } from \"@signe/reactive\";\nimport {\n Observable,\n Subject,\n Subscription,\n defer,\n from,\n map,\n of,\n switchMap,\n} from \"rxjs\";\nimport { ComponentInstance } from \"../components/DisplayObject\";\nimport { Directive, applyDirective } from \"./directive\";\nimport { isObject, isPromise, set } from \"./utils\";\n\nexport interface Props {\n [key: string]: any;\n}\n\nexport type ArrayChange<T> = {\n type: \"add\" | \"remove\" | \"update\" | \"init\" | \"reset\";\n index?: number;\n items: T[];\n};\n\nexport type ObjectChange<T> = {\n type: \"add\" | \"remove\" | \"update\" | \"init\" | \"reset\";\n key?: string;\n value?: T;\n items: T[];\n};\n\ntype ElementObservable<T> = Observable<\n (ArrayChange<T> | ObjectChange<T>) & {\n value: Element | Element[];\n }\n>;\n\ntype NestedSignalObjects = {\n [Key in string]: NestedSignalObjects | Signal<any>;\n};\n\nexport interface Element<T = ComponentInstance> {\n tag: string;\n props: Props;\n componentInstance: T;\n propSubscriptions: Subscription[];\n effectSubscriptions: Subscription[];\n effectMounts: (() => void)[];\n effectUnmounts: ((element?: Element) => void)[];\n propObservables: NestedSignalObjects | undefined;\n parent: Element | null;\n context?: {\n [key: string]: any;\n };\n directives: {\n [key: string]: Directive;\n };\n destroy: () => void;\n allElements: Subject<void>;\n}\n\ntype FlowResult = {\n elements: Element[];\n prev?: Element;\n fullElements?: Element[];\n};\n\ntype FlowObservable = Observable<FlowResult>;\n\nconst components: { [key: string]: any } = {};\n\nexport const isElement = (value: any): value is Element => {\n return (\n value &&\n typeof value === \"object\" &&\n \"tag\" in value &&\n \"props\" in value &&\n \"componentInstance\" in value\n );\n};\n\nexport const isPrimitive = (value) => {\n return (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n value === null ||\n value === undefined\n );\n};\n\nexport function registerComponent(name, component) {\n components[name] = component;\n}\n\nfunction destroyElement(element: Element | Element[]) {\n if (Array.isArray(element)) {\n element.forEach((e) => destroyElement(e));\n return;\n }\n if (!element) {\n return;\n }\n element.propSubscriptions.forEach((sub) => sub.unsubscribe());\n element.effectSubscriptions.forEach((sub) => sub.unsubscribe());\n for (let name in element.directives) {\n element.directives[name].onDestroy?.(element);\n }\n element.componentInstance.onDestroy?.(element.parent as any);\n element.effectUnmounts.forEach((fn) => fn?.());\n}\n\n/**\n * Creates a virtual element or a representation thereof, with properties that can be dynamically updated based on BehaviorSubjects.\n *\n * @param {string} tag - The tag name of the element to create.\n * @param {Object} props - An object containing properties for the element. Each property can either be a direct value\n * or an array where the first element is a function that returns a value based on input parameters,\n * and the second element is an array of BehaviorSubjects. The property is updated dynamically\n * using the combineLatest RxJS operator to wait for all BehaviorSubjects to emit.\n * @returns {Object} An object representing the created element, including tag name and dynamic properties.\n */\nexport function createComponent(tag: string, props?: Props): Element {\n if (!components[tag]) {\n throw new Error(`Component ${tag} is not registered`);\n }\n const instance = new components[tag]();\n const element: Element = {\n tag,\n props: {},\n componentInstance: instance,\n propSubscriptions: [],\n propObservables: props,\n parent: null,\n directives: {},\n effectUnmounts: [],\n effectSubscriptions: [],\n effectMounts: [],\n destroy() {\n destroyElement(this);\n },\n allElements: new Subject(),\n };\n\n // Iterate over each property in the props object\n if (props) {\n const recursiveProps = (props, path = \"\") => {\n const _set = (path, key, value) => {\n if (path == \"\") {\n element.props[key] = value;\n return;\n }\n set(element.props, path + \".\" + key, value);\n };\n\n Object.entries(props).forEach(([key, value]: [string, unknown]) => {\n if (isSignal(value)) {\n const _value = value as Signal<any>;\n if (\"dependencies\" in _value && _value.dependencies.size == 0) {\n _set(path, key, _value());\n return;\n }\n element.propSubscriptions.push(\n _value.observable.subscribe((value) => {\n _set(path, key, value);\n if (element.directives[key]) {\n element.directives[key].onUpdate?.(value, element);\n }\n if (key == \"tick\") {\n return\n }\n instance.onUpdate?.(\n path == \"\"\n ? {\n [key]: value,\n }\n : set({}, path + \".\" + key, value)\n );\n })\n );\n } else {\n if (isObject(value) && key != \"context\" && !isElement(value)) {\n recursiveProps(value, (path ? path + \".\" : \"\") + key);\n } else {\n _set(path, key, value);\n }\n }\n });\n };\n recursiveProps(props);\n }\n\n instance.onInit?.(element.props);\n\n const elementsListen = new Subject<any>()\n\n if (props?.isRoot) {\n element.allElements = elementsListen\n element.props.context.rootElement = element;\n element.componentInstance.onMount?.(element);\n propagateContext(element);\n }\n\n if (props) {\n for (let key in props) {\n const directive = applyDirective(element, key);\n if (directive) element.directives[key] = directive;\n }\n }\n\n function onMount(parent: Element, element: Element, index?: number) {\n element.props.context = parent.props.context;\n element.parent = parent;\n element.componentInstance.onMount?.(element, index);\n for (let name in element.directives) {\n element.directives[name].onMount?.(element);\n }\n element.effectMounts.forEach((fn: any) => {\n element.effectUnmounts.push(fn(element));\n });\n };\n\n async function propagateContext(element) {\n if (element.props.attach) {\n const isReactiveAttach = isSignal(element.propObservables?.attach)\n if (!isReactiveAttach) {\n element.props.children.push(element.props.attach)\n }\n else {\n await new Promise((resolve) => {\n let lastElement = null\n element.propSubscriptions.push(element.propObservables.attach.observable.subscribe(async (args) => {\n const value = args?.value ?? args\n if (!value) {\n throw new Error(`attach in ${element.tag} is undefined or null, add a component`)\n }\n if (lastElement) {\n destroyElement(lastElement)\n }\n lastElement = value\n await createElement(element, value)\n resolve(undefined)\n }))\n })\n }\n }\n if (!element.props.children) {\n return;\n }\n for (let child of element.props.children) {\n if (!child) continue;\n await createElement(element, child)\n }\n };\n\n async function createElement(parent: Element, child: Element) {\n if (isPromise(child)) {\n child = await child;\n }\n if (child instanceof Observable) {\n child.subscribe(\n ({\n elements: comp,\n prev,\n }: {\n elements: Element[];\n prev?: Element;\n }) => {\n // if prev, insert element after this\n const components = comp.filter((c) => c !== null);\n if (prev) {\n components.forEach((c) => {\n const index = parent.props.children.indexOf(prev.props.key);\n onMount(parent, c, index + 1);\n propagateContext(c);\n });\n return;\n }\n components.forEach((component) => {\n if (!Array.isArray(component)) {\n onMount(parent, component);\n propagateContext(component);\n } else {\n component.forEach((comp) => {\n onMount(parent, comp);\n propagateContext(comp);\n });\n }\n });\n elementsListen.next(undefined)\n }\n );\n } else {\n onMount(parent, child);\n await propagateContext(child);\n }\n }\n\n // Return the created element representation\n return element;\n}\n\n/**\n * Observes a BehaviorSubject containing an array or object of items and dynamically creates child elements for each item.\n *\n * @param {WritableArraySignal<T> | WritableObjectSignal<T>} itemsSubject - A signal that emits an array or object of items.\n * @param {Function} createElementFn - A function that takes an item and returns an element representation.\n * @returns {Observable} An observable that emits the list of created child elements.\n */\nexport function loop<T>(\n itemsSubject: WritableArraySignal<T[]> | WritableObjectSignal<T>,\n createElementFn: (item: T, index: number | string) => Element | null\n): FlowObservable {\n return defer(() => {\n let elements: Element[] = [];\n let elementMap = new Map<string | number, Element>();\n let isFirstSubscription = true;\n\n const isArraySignal = (signal: any): signal is WritableArraySignal<T[]> => \n Array.isArray(signal());\n\n return new Observable<FlowResult>(subscriber => {\n const subscription = isArraySignal(itemsSubject)\n ? itemsSubject.observable.subscribe(change => {\n if (isFirstSubscription) {\n isFirstSubscription = false;\n elements.forEach(el => el.destroy());\n elements = [];\n elementMap.clear();\n\n const items = itemsSubject();\n if (items) {\n items.forEach((item, index) => {\n const element = createElementFn(item, index);\n if (element) {\n elements.push(element);\n elementMap.set(index, element);\n }\n });\n }\n subscriber.next({\n elements: [...elements]\n });\n return;\n }\n\n if (change.type === 'init' || change.type === 'reset') {\n elements.forEach(el => el.destroy());\n elements = [];\n elementMap.clear();\n\n const items = itemsSubject();\n if (items) {\n items.forEach((item, index) => {\n const element = createElementFn(item, index);\n if (element) {\n elements.push(element);\n elementMap.set(index, element);\n }\n });\n }\n } else if (change.type === 'add' && change.index !== undefined) {\n const newElements = change.items.map((item, i) => {\n const element = createElementFn(item as T, change.index! + i);\n if (element) {\n elementMap.set(change.index! + i, element);\n }\n return element;\n }).filter((el): el is Element => el !== null);\n \n elements.splice(change.index, 0, ...newElements);\n } else if (change.type === 'remove' && change.index !== undefined) {\n const removed = elements.splice(change.index, 1);\n removed.forEach(el => {\n el.destroy();\n elementMap.delete(change.index!);\n });\n }\n\n subscriber.next({\n elements: [...elements] // Create a new array to ensure change detection\n });\n })\n : (itemsSubject as WritableObjectSignal<T>).observable.subscribe(change => {\n const key = change.key as string | number\n if (isFirstSubscription) {\n isFirstSubscription = false;\n elements.forEach(el => el.destroy());\n elements = [];\n elementMap.clear();\n\n const items = (itemsSubject as WritableObjectSignal<T>)();\n if (items) {\n Object.entries(items).forEach(([key, value]) => {\n const element = createElementFn(value, key);\n if (element) {\n elements.push(element);\n elementMap.set(key, element);\n }\n });\n }\n subscriber.next({\n elements: [...elements]\n });\n return;\n }\n\n if (change.type === 'init' || change.type === 'reset') {\n elements.forEach(el => el.destroy());\n elements = [];\n elementMap.clear();\n\n const items = (itemsSubject as WritableObjectSignal<T>)();\n if (items) {\n Object.entries(items).forEach(([key, value]) => {\n const element = createElementFn(value, key);\n if (element) {\n elements.push(element);\n elementMap.set(key, element);\n }\n });\n }\n } else if (change.type === 'add' && change.key && change.value !== undefined) {\n const element = createElementFn(change.value as T, key);\n if (element) {\n elements.push(element);\n elementMap.set(key, element);\n }\n } else if (change.type === 'remove' && change.key) {\n const index = elements.findIndex(el => elementMap.get(key) === el);\n if (index !== -1) {\n const [removed] = elements.splice(index, 1);\n removed.destroy();\n elementMap.delete(key);\n }\n } else if (change.type === 'update' && change.key && change.value !== undefined) {\n const index = elements.findIndex(el => elementMap.get(key) === el);\n if (index !== -1) {\n const oldElement = elements[index];\n oldElement.destroy();\n const newElement = createElementFn(change.value as T, key);\n if (newElement) {\n elements[index] = newElement;\n elementMap.set(key, newElement);\n }\n }\n }\n\n subscriber.next({\n elements: [...elements] // Create a new array to ensure change detection\n });\n });\n\n return subscription;\n });\n });\n}\n\n/**\n * Conditionally creates and destroys elements based on a condition signal.\n *\n * @param {Signal<boolean> | boolean} condition - A signal or boolean that determines whether to create an element.\n * @param {Function} createElementFn - A function that returns an element or a promise that resolves to an element.\n * @returns {Observable} An observable that emits the created or destroyed element.\n */\nexport function cond(\n condition: Signal<boolean> | boolean,\n createElementFn: () => Element | Promise<Element>\n): FlowObservable {\n let element: Element | null = null;\n \n if (isSignal(condition)) {\n const signalCondition = condition as WritableObjectSignal<boolean>;\n return new Observable<{elements: Element[], type?: \"init\" | \"remove\"}>(subscriber => {\n return signalCondition.observable.subscribe(bool => {\n if (bool) {\n let _el = createElementFn();\n if (isPromise(_el)) {\n from(_el as Promise<Element>).subscribe(el => {\n element = el;\n subscriber.next({\n type: \"init\",\n elements: [el],\n });\n });\n } else {\n element = _el as Element;\n subscriber.next({\n type: \"init\",\n elements: [element],\n });\n }\n } else if (element) {\n destroyElement(element);\n subscriber.next({\n elements: [],\n });\n } else {\n subscriber.next({\n elements: [],\n });\n }\n });\n });\n } else {\n // Handle boolean case\n if (condition) {\n let _el = createElementFn();\n if (isPromise(_el)) {\n return from(_el as Promise<Element>).pipe(\n map((el) => ({\n type: \"init\",\n elements: [el],\n }))\n );\n }\n return of({\n type: \"init\",\n elements: [_el as Element],\n });\n }\n return of({\n elements: [],\n });\n }\n}\n","import { Container, DisplacementFilter, Sprite, Texture, WRAP_MODES } from 'pixi.js';\nimport { animate } from 'popmotion';\nimport { Directive, registerDirective } from '../engine/directive';\nimport { Element } from '../engine/reactive';\n\n\nexport class Transition extends Directive {\n \n\n onInit(element: Element<Container>) {\n }\n\n onMount(element: Element<Container>) {\n const { image } = element.props.transition\n const displacementSprite = new Sprite(Texture.from(image))\n displacementSprite.texture.baseTexture.wrapMode = WRAP_MODES.REPEAT\n const displacementFilter = new DisplacementFilter(displacementSprite)\n const instance = element.componentInstance\n instance.filters = [displacementFilter]\n\n instance.addChild(displacementSprite)\n\n setTimeout(() => {\n animate({\n from: 0,\n to: 1,\n duration: 500,\n onUpdate: (progress) => {\n displacementFilter.scale.x = progress\n displacementFilter.scale.y = progress\n }\n })\n }, 5000)\n }\n\n onUpdate(props: any) {\n\n }\n\n onDestroy() {\n\n }\n}\n\nregisterDirective('transition', Transition)","import './directives'\nexport * from '@signe/reactive'\nexport { Howler } from 'howler'\nexport * from './components'\nexport * from './engine/reactive'\nexport * from './engine/signal'\nexport * from './engine/trigger'\nexport * from './engine/bootstrap'\nexport * from './engine/animation'\nexport { useProps, useDefineProps } from './hooks/useProps'\nexport * from './utils/Ease'\nexport * from './utils/RadialGradient'\nexport * from './components/DisplayObject'\nexport { isObservable } from 'rxjs'\nexport * as Utils from './engine/utils'","import { effect, Signal, signal } from \"@signe/reactive\";\nimport { Container, autoDetectRenderer } from \"pixi.js\";\nimport { loadYoga } from \"yoga-layout\";\nimport { Props, createComponent, registerComponent, Element } from \"../engine/reactive\";\nimport { useProps } from \"../hooks/useProps\";\nimport { ComponentInstance, DisplayObject } from \"./DisplayObject\";\nimport { ComponentFunction } from \"../engine/signal\";\nimport { SignalOrPrimitive } from \"./types\";\nimport { Size } from \"./types/DisplayObject\";\nimport { Scheduler, Tick } from \"../directives/Scheduler\";\n\ninterface CanvasElement extends Element<ComponentInstance> {\n render: (rootElement: HTMLElement) => void;\n directives: {\n tick: Scheduler\n };\n propObservables: {\n tick: Signal<Tick>\n };\n}\n\nregisterComponent(\"Canvas\", class Canvas extends DisplayObject(Container) {});\n\nexport interface CanvasProps extends Props {\n cursorStyles?: () => any;\n width?: SignalOrPrimitive<Size>;\n height?: SignalOrPrimitive<Size>;\n canvasEl?: HTMLElement;\n selector?: string;\n isRoot?: boolean;\n tick?: any;\n class?: SignalOrPrimitive<string>;\n}\n\nexport const Canvas: ComponentFunction<CanvasProps> = async (props = {}) => {\n let { cursorStyles, width, height, class: className } = useProps(props);\n const Yoga = await loadYoga();\n\n if (!props.width) width = signal<Size>(800)\n if (!props.height) height = signal<Size>(600)\n\n const renderer = await autoDetectRenderer({\n ...props,\n width: width?.(),\n height: height?.(),\n });\n\n const canvasSize = signal({\n width: renderer.width,\n height: renderer.height,\n });\n\n props.isRoot = true;\n const options: CanvasProps = {\n ...props,\n context: {\n Yoga,\n renderer,\n canvasSize,\n },\n width: width?.(),\n height: height?.(),\n };\n\n if (!props.tick) {\n options.context!.tick = options.tick = signal({\n timestamp: 0,\n deltaTime: 0,\n frame: 0,\n deltaRatio: 1,\n });\n }\n const canvasElement = createComponent(\"Canvas\", options) as CanvasElement;\n\n canvasElement.render = (rootElement: HTMLElement) => {\n const canvasEl = renderer.view.canvas as HTMLCanvasElement;\n\n (globalThis as any).__PIXI_STAGE__ = canvasElement.componentInstance;\n (globalThis as any).__PIXI_RENDERER__ = renderer;\n\n if (props.tickStart !== false) canvasElement.directives.tick.start()\n\n effect(() => {\n canvasElement.propObservables!.tick();\n renderer.render(canvasElement.componentInstance as any);\n });\n\n if (cursorStyles) {\n effect(() => {\n renderer.events.cursorStyles = cursorStyles();\n });\n }\n\n if (className) {\n effect(() => {\n canvasEl.classList.add(className());\n });\n }\n\n const resizeCanvas = async () => {\n let w, h;\n if (width?.() === \"100%\" && height?.() === \"100%\") {\n const parent = canvasEl.parentElement;\n w = parent ? parent.clientWidth : window.innerWidth;\n h = parent ? parent.clientHeight : window.innerHeight;\n } else {\n w = width?.() ?? canvasEl.offsetWidth;\n h = height?.() ?? canvasEl.offsetHeight;\n }\n renderer.resize(w, h);\n canvasSize.set({ width: w, height: h });\n canvasElement.componentInstance.setWidth(w)\n canvasElement.componentInstance.setHeight(h)\n };\n\n // Listen for window resize events\n window.addEventListener(\"resize\", resizeCanvas);\n\n // Check if a canvas already exists in the rootElement\n const existingCanvas = rootElement.querySelector('canvas');\n if (existingCanvas) {\n // If it exists, replace it with the new canvas\n rootElement.replaceChild(canvasEl, existingCanvas);\n } else {\n // If it doesn't exist, append the new canvas\n rootElement.appendChild(canvasEl);\n }\n\n // Initial resize\n resizeCanvas();\n };\n\n return canvasElement;\n};\n","import { Node } from \"yoga-layout\";\nimport { Element, isElement, Props } from \"../engine/reactive\";\nimport { setObservablePoint } from \"../engine/utils\";\nimport type {\n AlignContent,\n EdgeSize,\n FlexDirection,\n Size,\n} from \"./types/DisplayObject\";\nimport { effect, Signal, signal } from \"@signe/reactive\";\nimport { DropShadowFilter } from \"pixi-filters\";\nimport { BlurFilter, ObservablePoint } from \"pixi.js\";\n\nexport interface ComponentInstance extends PixiMixins.ContainerOptions {\n id?: string;\n children?: ComponentInstance[];\n onInit?(props: Props): void;\n onUpdate?(props: Props): void;\n onDestroy?(parent: Element): void;\n onMount?(context: Element, index?: number): void;\n setWidth(width: number): void;\n setHeight(height: number): void;\n}\n\nexport const EVENTS = [\n \"added\",\n \"childAdded\",\n \"childRemoved\",\n \"click\",\n \"clickcapture\",\n \"destroyed\",\n \"globalmousemove\",\n \"globalpointermove\",\n \"globaltouchmove\",\n \"mousedown\",\n \"mousedowncapture\",\n \"mouseenter\",\n \"mouseentercapture\",\n \"mouseleave\",\n \"mouseleavecapture\",\n \"mousemove\",\n \"mousemovecapture\",\n \"mouseout\",\n \"mouseoutcapture\",\n \"mouseover\",\n \"mouseovercapture\",\n \"mouseup\",\n \"mouseupcapture\",\n \"mouseupoutside\",\n \"mouseupoutsidecapture\",\n \"pointercancel\",\n \"pointercancelcapture\",\n \"pointerdown\",\n \"pointerdowncapture\",\n \"pointerenter\",\n \"pointerentercapture\",\n \"pointerleave\",\n \"pointerleavecapture\",\n \"pointermove\",\n \"pointermovecapture\",\n \"pointerout\",\n \"pointeroutcapture\",\n \"pointerover\",\n \"pointerovercapture\",\n \"pointertap\",\n \"pointertapcapture\",\n \"pointerup\",\n \"pointerupcapture\",\n \"pointerupoutside\",\n \"pointerupoutsidecapture\",\n \"removed\",\n \"rightclick\",\n \"rightclickcapture\",\n \"rightdown\",\n \"rightdowncapture\",\n \"rightup\",\n \"rightupcapture\",\n \"rightupoutside\",\n \"rightupoutsidecapture\",\n \"tap\",\n \"tapcapture\",\n \"touchcancel\",\n \"touchcancelcapture\",\n \"touchend\",\n \"touchendcapture\",\n \"touchendoutside\",\n \"touchendoutsidecapture\",\n \"touchmove\",\n \"touchmovecapture\",\n \"touchstart\",\n \"touchstartcapture\",\n \"wheel\",\n \"wheelcapture\",\n];\n\nexport function DisplayObject(extendClass) {\n return class DisplayObject extends extendClass {\n #canvasContext: {\n [key: string]: any;\n } | null = null;\n isFlex: boolean = false;\n fullProps: Props = {};\n isMounted: boolean = false;\n _anchorPoints = new ObservablePoint(\n { _onUpdate: () => {} },\n 0,\n 0\n );\n isCustomAnchor: boolean = false;\n displayWidth = signal(0);\n displayHeight = signal(0);\n overrideProps: string[] = [];\n node: Node;\n\n get yoga() {\n return this.#canvasContext?.Yoga;\n }\n\n get deltaRatio() {\n return this.#canvasContext?.scheduler?.tick.value.deltaRatio;\n }\n\n onInit(props) {\n this._id = props.id;\n for (let event of EVENTS) {\n if (props[event] && !this.overrideProps.includes(event)) {\n this.eventMode = \"static\";\n this.on(event, props[event]);\n }\n }\n }\n\n onMount({ parent, props }: Element<DisplayObject>, index?: number) {\n this.#canvasContext = props.context;\n this.node = this.yoga.Node.create();\n if (parent) {\n const instance = parent.componentInstance as DisplayObject;\n if (index === undefined) {\n instance.addChild(this);\n } else {\n instance.addChildAt(this, index);\n }\n if (instance.layer) this.parentLayer = instance.layer;\n this.isMounted = true;\n this.effectSize(props.width, props.height);\n this.onUpdate(props);\n this.parent.node.insertChild(\n this.node,\n this.parent.node.getChildCount()\n );\n if (parent.props.flexDirection) {\n this.parent.node.calculateLayout();\n for (let child of this.parent.children) {\n const { left, top } = child.getComputedLayout();\n child.x = left;\n child.y = top;\n }\n }\n \n }\n }\n\n effectSize(width: Size, height: Size) {\n const handleSize = (\n size: Size,\n setter: (value: number) => void,\n parentSize: Signal<number>\n ) => {\n if (typeof size === \"string\" && size.endsWith(\"%\")) {\n effect(() => {\n setter(parentSize() * (parseInt(size) / 100));\n if (this.isFlex) {\n this.applyFlexLayout();\n }\n });\n } else {\n setter(+size);\n }\n };\n\n if (width != undefined)\n handleSize(width, this.setWidth.bind(this), this.parent.displayWidth);\n if (height != undefined)\n handleSize(\n height,\n this.setHeight.bind(this),\n this.parent.displayHeight\n );\n }\n\n applyFlexLayout() {\n this.calculateLayout();\n for (let child of this.children) {\n const { left, top } = child.node.getComputedLayout();\n child.x = left;\n child.y = top;\n }\n }\n\n #flexRender(props) {\n if (!this.parent) return;\n if (props.flexDirection || props.justifyContent) {\n this.isFlex = true;\n this.applyFlexLayout();\n }\n }\n\n onUpdate(props) {\n this.fullProps = {\n ...this.fullProps,\n ...props,\n };\n\n if (!this.#canvasContext || !this.parent) return;\n if (props.x !== undefined) this.setX(props.x);\n if (props.y !== undefined) this.setY(props.y);\n if (props.scale !== undefined)\n setObservablePoint(this.scale, props.scale);\n if (props.anchor !== undefined && !this.isCustomAnchor) {\n setObservablePoint(this.anchor, props.anchor);\n }\n if (props.skew !== undefined) setObservablePoint(this.skew, props.skew);\n if (props.tint) this.tint = props.tint;\n if (props.rotation !== undefined) this.rotation = props.rotation;\n if (props.angle !== undefined) this.angle = props.angle;\n if (props.zIndex !== undefined) this.zIndex = props.zIndex;\n if (props.roundPixels !== undefined) this.roundPixels = props.roundPixels;\n if (props.cursor) this.cursor = props.cursor;\n if (props.visible !== undefined) this.visible = props.visible;\n if (props.alpha !== undefined) this.alpha = props.alpha;\n if (props.pivot) setObservablePoint(this.pivot, props.pivot);\n if (props.flexDirection) this.setFlexDirection(props.flexDirection);\n if (props.flexWrap) this.setFlexWrap(props.flexWrap);\n if (props.justifyContent) this.setJustifyContent(props.justifyContent);\n if (props.alignItems) this.setAlignItems(props.alignItems);\n if (props.alignContent) this.setAlignContent(props.alignContent);\n if (props.alignSelf) this.setAlignSelf(props.alignSelf);\n if (props.margin) this.setMargin(props.margin);\n if (props.padding) this.setPadding(props.padding);\n if (props.gap) this.setGap(props.gap);\n if (props.border) this.setBorder(props.border);\n if (props.positionType) this.setPositionType(props.positionType);\n if (props.filters) this.filters = props.filters;\n if (props.maskOf) {\n if (isElement(props.maskOf)) {\n props.maskOf.componentInstance.mask = this;\n }\n }\n if (props.blendMode) this.blendMode = props.blendMode;\n if (props.filterArea) this.filterArea = props.filterArea;\n const currentFilters = this.filters || [];\n\n if (props.shadow) {\n let dropShadowFilter = currentFilters.find(\n (filter) => filter instanceof DropShadowFilter\n );\n if (!dropShadowFilter) {\n dropShadowFilter = new DropShadowFilter();\n currentFilters.push(dropShadowFilter);\n }\n Object.assign(dropShadowFilter, props.shadow);\n }\n\n if (props.blur) {\n let blurFilter = currentFilters.find(\n (filter) => filter instanceof BlurFilter\n );\n if (!blurFilter) {\n const options =\n typeof props.blur === \"number\"\n ? {\n strength: props.blur,\n }\n : props.blur;\n blurFilter = new BlurFilter(options);\n currentFilters.push(blurFilter);\n }\n Object.assign(blurFilter, props.blur);\n }\n\n this.filters = currentFilters;\n\n this.#flexRender(props);\n }\n\n onDestroy() {\n super.destroy();\n this.node?.freeRecursive();\n }\n\n getComputedLayout() {\n return this.node.getComputedLayout();\n }\n\n applyComputedLayout() {\n const layout = this.getComputedLayout();\n this.x = layout.left;\n this.y = layout.top;\n }\n\n calculateLayout() {\n this.node.calculateLayout();\n }\n\n setFlexDirection(direction: FlexDirection) {\n const mapping = {\n row: this.yoga.FLEX_DIRECTION_ROW,\n column: this.yoga.FLEX_DIRECTION_COLUMN,\n \"row-reverse\": this.yoga.FLEX_DIRECTION_ROW_REVERSE,\n \"column-reverse\": this.yoga.FLEX_DIRECTION_COLUMN_REVERSE,\n };\n this.node.setFlexDirection(mapping[direction]);\n }\n\n setFlexWrap(wrap: \"wrap\" | \"nowrap\" | \"wrap-reverse\") {\n const mapping = {\n wrap: this.yoga.WRAP_WRAP,\n nowrap: this.yoga.WRAP_NO_WRAP,\n \"wrap-reverse\": this.yoga.WRAP_WRAP_REVERSE,\n };\n this.node.setFlexWrap(mapping[wrap]);\n }\n\n #setAlign(methodName: string, align: AlignContent) {\n const mapping = {\n auto: this.yoga.ALIGN_AUTO,\n \"flex-start\": this.yoga.ALIGN_FLEX_START,\n \"flex-end\": this.yoga.ALIGN_FLEX_END,\n center: this.yoga.ALIGN_CENTER,\n stretch: this.yoga.ALIGN_STRETCH,\n baseline: this.yoga.ALIGN_BASELINE,\n \"space-between\": this.yoga.ALIGN_SPACE_BETWEEN,\n \"space-around\": this.yoga.ALIGN_SPACE_AROUND,\n };\n const method = (this.node as any)[methodName].bind(this.node);\n method(mapping[align]);\n }\n\n setAlignContent(align: AlignContent) {\n this.#setAlign(\"setAlignContent\", align);\n }\n\n setAlignSelf(align: AlignContent) {\n this.#setAlign(\"setAlignSelf\", align);\n }\n\n setAlignItems(align: AlignContent) {\n this.#setAlign(\"setAlignItems\", align);\n }\n\n setJustifyContent(\n justifyContent:\n | \"flex-start\"\n | \"flex-end\"\n | \"center\"\n | \"space-between\"\n | \"space-around\"\n ) {\n const mapping = {\n \"flex-start\": this.yoga.JUSTIFY_FLEX_START,\n \"flex-end\": this.yoga.JUSTIFY_FLEX_END,\n center: this.yoga.JUSTIFY_CENTER,\n \"space-between\": this.yoga.JUSTIFY_SPACE_BETWEEN,\n \"space-around\": this.yoga.JUSTIFY_SPACE_AROUND,\n };\n this.node.setJustifyContent(mapping[justifyContent]);\n }\n\n #setEdgeSize(methodName: string, size: EdgeSize) {\n const method = (this.node as any)[methodName].bind(this.node);\n if (size instanceof Array) {\n if (size.length === 2) {\n method(this.yoga.EDGE_VERTICAL, size[0]);\n method(this.yoga.EDGE_HORIZONTAL, size[1]);\n } else if (size.length === 4) {\n method(this.yoga.EDGE_TOP, size[0]);\n method(this.yoga.EDGE_RIGHT, size[1]);\n method(this.yoga.EDGE_BOTTOM, size[2]);\n method(this.yoga.EDGE_LEFT, size[3]);\n }\n } else {\n method(this.yoga.EDGE_ALL, size);\n }\n }\n\n setPosition(position: EdgeSize) {\n this.#setEdgeSize(\"setPosition\", position);\n }\n\n setX(x: number) {\n x = x + this.getWidth() * this._anchorPoints.x;\n if (!this.parent.isFlex) {\n this.x = x;\n }\n this.node.setPosition(this.yoga.EDGE_LEFT, x);\n }\n\n setY(y: number) {\n y = y + this.getHeight() * this._anchorPoints.y;\n if (!this.parent.isFlex) {\n this.y = y;\n }\n this.node.setPosition(this.yoga.EDGE_TOP, y);\n }\n\n setPadding(padding: EdgeSize) {\n this.#setEdgeSize(\"setPadding\", padding);\n }\n\n setMargin(margin: EdgeSize) {\n this.#setEdgeSize(\"setMargin\", margin);\n }\n\n setGap(gap: EdgeSize) {\n this.node.setGap(this.yoga.GAP_ALL, +gap);\n }\n\n setBorder(border: EdgeSize) {\n this.#setEdgeSize(\"setBorder\", border);\n }\n\n setPositionType(positionType: \"relative\" | \"absolute\") {\n const mapping = {\n relative: this.yoga.POSITION_TYPE_RELATIVE,\n absolute: this.yoga.POSITION_TYPE_ABSOLUTE,\n };\n this.node.setPositionType(mapping[positionType]);\n }\n\n calculateBounds() {\n super.calculateBounds();\n if (!this._geometry) return;\n const bounds = this._geometry.bounds;\n const width = Math.abs(bounds.minX - bounds.maxX);\n const height = Math.abs(bounds.minY - bounds.maxY);\n // this.node.setWidth(width);\n // this.node.setHeight(height);\n }\n\n setWidth(width: number) {\n this.displayWidth.set(width);\n this.node?.setWidth(width);\n }\n\n setHeight(height: number) {\n this.displayHeight.set(height);\n this.node?.setHeight(height);\n }\n\n getWidth() {\n return this.displayWidth();\n }\n\n getHeight() {\n return this.displayHeight();\n }\n };\n}\n","import { Container as PixiContainer } from \"pixi.js\";\nimport { createComponent, registerComponent } from \"../engine/reactive\";\nimport { DisplayObject } from \"./DisplayObject\";\nimport { ComponentFunction } from \"../engine/signal\";\nimport { DisplayObjectProps } from \"./types/DisplayObject\";\nimport { setObservablePoint } from \"../engine/utils\";\n\ninterface ContainerProps extends DisplayObjectProps {\n sortableChildren?: boolean;\n}\n\nexport class CanvasContainer extends DisplayObject(PixiContainer) {\n isCustomAnchor = true;\n \n onUpdate(props) {\n if (props.anchor) {\n setObservablePoint(this._anchorPoints, props.anchor);\n props.pivot = [\n this.getWidth() * this._anchorPoints.x,\n this.getHeight() * this._anchorPoints.y\n ]\n }\n super.onUpdate(props);\n if (props.sortableChildren != undefined) {\n this.sortableChildren = props.sortableChildren;\n }\n }\n onMount(args) {\n super.onMount(args);\n const { componentInstance, props } = args;\n const { pixiChildren } = props;\n if (pixiChildren) {\n pixiChildren.forEach((child) => {\n componentInstance.addChild(child);\n });\n }\n }\n}\n\nexport interface CanvasContainer extends DisplayObjectProps {}\n\nregisterComponent(\"Container\", CanvasContainer);\n\nexport const Container: ComponentFunction<ContainerProps> = (props) => {\n return createComponent(\"Container\", props);\n};\n","import { effect, Signal } from \"@signe/reactive\";\nimport { Graphics as PixiGraphics } from \"pixi.js\";\nimport { createComponent, registerComponent } from \"../engine/reactive\";\nimport { DisplayObject } from \"./DisplayObject\";\nimport { DisplayObjectProps } from \"./types/DisplayObject\";\nimport { useProps } from \"../hooks/useProps\";\n\ninterface GraphicsProps extends DisplayObjectProps {\n draw?: (graphics: PixiGraphics) => void;\n}\n\ninterface RectProps extends DisplayObjectProps {\n width: number;\n height: number;\n color: string;\n}\n\ninterface CircleProps extends DisplayObjectProps {\n radius: number;\n color: string;\n}\n\ninterface EllipseProps extends DisplayObjectProps {\n width: number;\n height: number;\n color: string;\n}\n\ninterface TriangleProps extends DisplayObjectProps {\n base: number;\n height: number;\n color: string;\n}\n\ninterface SvgProps extends DisplayObjectProps {\n svg: string;\n}\n\nclass CanvasGraphics extends DisplayObject(PixiGraphics) {\n onInit(props) {\n super.onInit(props);\n if (props.draw) {\n effect(() => {\n this.clear();\n props.draw?.(this);\n });\n }\n }\n}\n\ninterface CanvasGraphics extends PixiGraphics {}\n\nregisterComponent(\"Graphics\", CanvasGraphics);\n\nexport function Graphics(props: GraphicsProps) {\n return createComponent(\"Graphics\", props);\n}\n\nexport function Rect(props: RectProps) {\n const { width, height, color, borderRadius, border } = useProps(props, {\n borderRadius: null,\n border: null\n })\n return Graphics({\n draw: (g) => {\n if (borderRadius()) {\n g.roundRect(0, 0, width(), height(), borderRadius());\n } else {\n g.rect(0, 0, width(), height());\n }\n if (border) {\n g.stroke(border);\n }\n g.fill(color());\n },\n ...props\n })\n}\n\nfunction drawShape(g: PixiGraphics, shape: 'circle' | 'ellipse', props: {\n radius: Signal<number>;\n color: Signal<string>;\n border: Signal<number>;\n} | {\n width: Signal<number>;\n height: Signal<number>;\n color: Signal<string>;\n border: Signal<number>;\n}) {\n const { color, border } = props;\n if ('radius' in props) {\n g.circle(0, 0, props.radius());\n } else {\n g.ellipse(0, 0, props.width() / 2, props.height() / 2);\n }\n if (border()) {\n g.stroke(border());\n }\n g.fill(color());\n}\n\nexport function Circle(props: CircleProps) { \n const { radius, color, border } = useProps(props, {\n border: null\n })\n return Graphics({\n draw: (g) => drawShape(g, 'circle', { radius, color, border }),\n ...props\n })\n}\n\nexport function Ellipse(props: EllipseProps) {\n const { width, height, color, border } = useProps(props, {\n border: null\n })\n return Graphics({\n draw: (g) => drawShape(g, 'ellipse', { width, height, color, border }),\n ...props\n })\n}\n\nexport function Triangle(props: TriangleProps) {\n const { width, height, color, border } = useProps(props, {\n border: null,\n color: '#000'\n })\n return Graphics({\n draw: (g) => {\n g.moveTo(0, height());\n g.lineTo(width() / 2, 0);\n g.lineTo(width(), height());\n g.lineTo(0, height());\n g.fill(color());\n if (border) {\n g.stroke(border);\n }\n },\n ...props\n })\n}\n\nexport function Svg(props: SvgProps) {\n return Graphics({\n draw: (g) => g.svg(props.svg),\n ...props\n })\n}","import {\n Subscription\n} from \"rxjs\";\nimport type { Element } from \"./reactive\";\nimport { Tick } from \"../directives/Scheduler\";\n\ntype MountFunction = (fn: (element: Element) => void) => void;\n\n// Define ComponentFunction type\nexport type ComponentFunction<P = {}> = (props: P) => Element | Promise<Element>;\n\nexport let currentSubscriptionsTracker: ((subscription: Subscription) => void) | null = null;\nexport let mountTracker: MountFunction | null = null;\n\n/**\n * Registers a mount function to be called when the component is mounted.\n * To unmount the component, the function must return a function that will be called by the engine.\n * \n * @param {(element: Element) => void} fn - The function to be called on mount.\n * @example\n * ```ts\n * mount((el) => {\n * console.log('mounted', el);\n * });\n * ```\n * Unmount the component by returning a function:\n * ```ts\n * mount((el) => {\n * console.log('mounted', el);\n * return () => {\n * console.log('unmounted', el);\n * }\n * });\n * ```\n */\nexport function mount(fn: (element: Element) => void) {\n mountTracker?.(fn);\n}\n\n/**\n * Registers a tick function to be called on each tick of the component's context.\n * @param {(tickValue: Tick, element: Element) => void} fn - The function to be called on each tick.\n * @example\n * ```ts\n * tick((tickValue, el) => {\n * console.log('tick', tickValue, el);\n * });\n * ```\n */\nexport function tick(fn: (tickValue: Tick, element: Element) => void) {\n mount((el: Element) => {\n const { context } = el.props\n let subscription: Subscription | undefined\n if (context.tick) {\n subscription = context.tick.observable.subscribe(({ value }) => {\n fn(value, el)\n })\n }\n return () => {\n subscription?.unsubscribe()\n }\n })\n}\n\n/**\n * Add tracking for subscriptions and mounts, then create an element from a component function.\n * @template C\n * @param {C} componentFunction - The component function to create an element from.\n * @param {Parameters<C>[0]} [props={}] - The props to pass to the component function.\n * @param {...any[]} children - The children elements of the component.\n * @returns {ReturnType<C>}\n * @example\n * ```ts\n * const el = h(MyComponent, {\n * x: 100,\n * y: 100,\n * });\n * ```\n * \n * with children:\n * ```ts\n * const el = h(MyComponent, {\n * x: 100,\n * y: 100,\n * }, \n * h(MyChildComponent, {\n * x: 50,\n * y: 50,\n * }),\n * );\n * ```\n */\nexport function h<C extends ComponentFunction<any>>(\n componentFunction: C,\n props: Parameters<C>[0] = {} as Parameters<C>[0],\n ...children: any[]\n): ReturnType<C> {\n const allSubscriptions = new Set<Subscription>();\n const allMounts = new Set<MountFunction>();\n\n currentSubscriptionsTracker = (subscription) => {\n allSubscriptions.add(subscription);\n };\n\n mountTracker = (fn: any) => {\n allMounts.add(fn);\n };\n\n if (children[0] instanceof Array) {\n children = children[0]\n }\n\n let component = componentFunction({ ...props, children }) as Element;\n\n if (!component) {\n component = {} as any\n }\n\n component.effectSubscriptions = Array.from(allSubscriptions);\n component.effectMounts = [\n ...Array.from(allMounts),\n ...((component as any).effectMounts ?? [])\n ];\n\n // call mount hook for root component\n if (component instanceof Promise) {\n component.then((component) => {\n if (component.props.isRoot) {\n allMounts.forEach((fn) => fn(component));\n }\n })\n }\n\n currentSubscriptionsTracker = null;\n mountTracker = null;\n\n return component as ReturnType<C>;\n}\n","import { h } from \"../engine/signal\";\nimport { Container } from \"./Container\";\n\nexport function Scene(props) {\n return h(Container)\n}","import * as particles from \"@barvynkoa/particle-emitter\";\nimport { createComponent, registerComponent } from \"../engine/reactive\";\nimport { CanvasContainer } from \"./Container\";\nimport { Signal } from \"@signe/reactive\";\n\nclass CanvasParticlesEmitter extends CanvasContainer {\n private emitter: particles.Emitter | null;\n private elapsed: number = Date.now();\n\n onMount(params) {\n super.onMount(params);\n const { props } = params;\n const tick: Signal = props.context.tick;\n this.emitter = new particles.Emitter(this as any, props.config);\n //this.emitter.emit = true\n\n this.subscriptionTick = tick.observable.subscribe((value) => {\n if (!this.emitter) return;\n const now = Date.now();\n this.emitter.update((now - this.elapsed) * 0.001);\n this.elapsed = now;\n });\n }\n\n onUpdate(props) {}\n\n onDestroy(): void {\n super.onDestroy();\n this.emitter?.destroy();\n this.emitter = null;\n this.subscriptionTick.unsubscribe();\n }\n}\n\nregisterComponent(\"ParticlesEmitter\", CanvasParticlesEmitter);\n\nexport function ParticlesEmitter(props) {\n return createComponent(\"ParticlesEmitter\", props);\n}\n","import { computed, effect, isSignal, Signal, WritableSignal } from \"@signe/reactive\";\nimport {\n Assets,\n Container,\n Sprite as PixiSprite,\n Rectangle,\n Texture,\n} from \"pixi.js\";\nimport { Subscription } from \"rxjs\";\nimport {\n Element,\n createComponent,\n registerComponent,\n} from \"../engine/reactive\";\nimport { arrayEquals, isFunction } from \"../engine/utils\";\nimport { DisplayObject } from \"./DisplayObject\";\nimport {\n AnimationFrames,\n FrameOptions,\n SpritesheetOptions,\n TextureOptions,\n TransformOptions,\n} from \"./types/Spritesheet\";\nimport { ComponentFunction } from \"../engine/signal\";\nimport { DisplayObjectProps } from \"./types/DisplayObject\";\nimport { AnimatedSignal, isAnimatedSignal } from \"../engine/animation\";\n\nconst log = console.log;\n\ntype Image = { image: string };\n\ntype TextureOptionsMerging = TextureOptions & {\n spriteWidth: number;\n spriteHeight: number;\n sound?: string;\n} & Image &\n TransformOptions;\n\ntype FrameOptionsMerging = TextureOptionsMerging & FrameOptions;\ntype SpritesheetOptionsMerging = TextureOptionsMerging & SpritesheetOptions;\ntype TransformOptionsAsArray = Pick<\n TransformOptions,\n \"anchor\" | \"scale\" | \"skew\" | \"pivot\"\n>;\n\ntype AnimationDataFrames = {\n sprites: FrameOptionsMerging[];\n frames: Texture[][];\n name: string;\n animations: AnimationFrames;\n params: any[];\n data: TextureOptionsMerging;\n};\n\nexport enum StandardAnimation {\n Stand = \"stand\",\n Walk = \"walk\",\n}\n\nexport class CanvasSprite extends DisplayObject(PixiSprite) {\n public hitbox: { w: number; h: number };\n public applyTransform: (\n frame: FrameOptionsMerging,\n data: TextureOptionsMerging,\n spritesheet: SpritesheetOptionsMerging\n ) => Partial<FrameOptionsMerging>;\n private spritesheet: SpritesheetOptionsMerging;\n private currentAnimation: AnimationDataFrames | null = null;\n private time: number = 0;\n private frameIndex: number = 0;\n private animations: Map<string, AnimationDataFrames> = new Map();\n private subscriptionTick: Subscription;\n private subscriptionSheet: Subscription[] = [];\n private sheetParams: any = {};\n private sheetCurrentAnimation: string = StandardAnimation.Stand;\n onFinish: () => void;\n\n private currentAnimationContainer: Container | null = null;\n\n private async createTextures(\n options: Required<TextureOptionsMerging>\n ): Promise<Texture[][]> {\n const { width, height, framesHeight, framesWidth, image, offset } = options;\n const texture = await Assets.load(image);\n const spriteWidth = options.spriteWidth;\n const spriteHeight = options.spriteHeight;\n const frames: Texture[][] = [];\n const offsetX = (offset && offset.x) || 0;\n const offsetY = (offset && offset.y) || 0;\n for (let i = 0; i < framesHeight; i++) {\n frames[i] = [];\n for (let j = 0; j < framesWidth; j++) {\n const rectX = j * spriteWidth + offsetX;\n const rectY = i * spriteHeight + offsetY;\n if (rectY > height) {\n throw log(\n `Warning, there is a problem with the height of the \"${this.id}\" spritesheet. When cutting into frames, the frame exceeds the height of the image.`\n );\n }\n if (rectX > width) {\n throw log(\n `Warning, there is a problem with the width of the \"${this.id}\" spritesheet. When cutting into frames, the frame exceeds the width of the image.`\n );\n }\n frames[i].push(\n new Texture({\n source: texture.source,\n frame: new Rectangle(rectX, rectY, spriteWidth, spriteHeight),\n })\n );\n }\n }\n return frames;\n }\n\n private async createAnimations() {\n const { textures } = this.spritesheet;\n if (!textures) {\n return;\n }\n for (let animationName in textures) {\n const props: (keyof TextureOptionsMerging)[] = [\n \"width\",\n \"height\",\n \"framesHeight\",\n \"framesWidth\",\n \"rectWidth\",\n \"rectHeight\",\n \"offset\",\n \"image\",\n \"sound\",\n ];\n const parentObj = props.reduce(\n (prev, val) => ({ ...prev, [val]: this.spritesheet[val] }),\n {}\n );\n const optionsTextures: TextureOptionsMerging = {\n ...parentObj,\n ...textures[animationName],\n } as any;\n const {\n rectWidth,\n width = 0,\n framesWidth = 1,\n rectHeight,\n height = 0,\n framesHeight = 1,\n } = optionsTextures;\n optionsTextures.spriteWidth = rectWidth ? rectWidth : width / framesWidth;\n optionsTextures.spriteHeight = rectHeight\n ? rectHeight\n : height / framesHeight;\n this.animations.set(animationName, {\n frames: await this.createTextures(\n optionsTextures as Required<TextureOptionsMerging>\n ),\n name: animationName,\n animations: textures[animationName].animations,\n params: [],\n data: optionsTextures,\n sprites: [],\n });\n }\n }\n\n async onMount(params: Element<CanvasSprite>) {\n const { props, propObservables } = params;\n const tick: Signal = props.context.tick;\n const sheet = props.sheet ?? {};\n if (sheet?.onFinish) {\n this.onFinish = sheet.onFinish;\n }\n this.subscriptionTick = tick.observable.subscribe((value) => {\n this.update(value);\n });\n if (props.sheet?.definition) {\n this.spritesheet = props.sheet.definition;\n await this.createAnimations();\n }\n if (sheet.params) {\n for (let key in propObservables?.sheet[\"params\"]) {\n const value = propObservables?.sheet[\"params\"][key] as Signal;\n if (isSignal(value)) {\n this.subscriptionSheet.push(\n value.observable.subscribe((value) => {\n if (this.animations.size == 0) return;\n this.play(this.sheetCurrentAnimation, [{ [key]: value }]);\n })\n );\n } else {\n this.play(this.sheetCurrentAnimation, [{ [key]: value }]);\n }\n }\n }\n\n const isMoving = computed(() => {\n const { x, y } = propObservables ?? {};\n if (!x || !y) return false;\n const xSignal = x as AnimatedSignal<any>;\n const ySignal = y as AnimatedSignal<any>;\n const isMovingX =\n isAnimatedSignal(xSignal) &&\n xSignal.animatedState().current !== xSignal.animatedState().end;\n const isMovingY =\n isAnimatedSignal(ySignal) &&\n ySignal.animatedState().current !== ySignal.animatedState().end;\n return isMovingX || isMovingY;\n });\n\n effect(() => {\n const _isMoving = isMoving();\n\n if (!this.isMounted) return;\n\n if (_isMoving) {\n this.sheetCurrentAnimation = StandardAnimation.Walk;\n } else {\n this.sheetCurrentAnimation = StandardAnimation.Stand;\n }\n\n this.play(this.sheetCurrentAnimation, [this.sheetParams]);\n });\n\n super.onMount(params);\n }\n\n async onUpdate(props) {\n super.onUpdate(props);\n\n const setTexture = async (image: string) => {\n const onProgress = this.fullProps.loader?.onProgress;\n const texture = await Assets.load(image, (progress) => {\n if (onProgress) onProgress(progress);\n if (progress == 1) {\n const onComplete = this.fullProps.loader?.onComplete;\n if (onComplete) {\n // hack to memoize the texture\n setTimeout(() => {\n onComplete(texture);\n });\n }\n }\n });\n\n return texture\n }\n\n const sheet = props.sheet;\n if (sheet?.params) this.sheetParams = sheet?.params;\n\n if (sheet?.playing && this.isMounted) {\n this.sheetCurrentAnimation = sheet?.playing;\n this.play(this.sheetCurrentAnimation, [this.sheetParams]);\n }\n\n if (props.hitbox) this.hitbox = props.hitbox;\n\n if (props.scaleMode) this.baseTexture.scaleMode = props.scaleMode;\n else if (props.image && this.fullProps.rectangle === undefined) {\n this.texture = await setTexture(this.fullProps.image);\n } else if (props.texture) {\n this.texture = props.texture;\n }\n if (props.rectangle !== undefined) {\n const { x, y, width, height } = props.rectangle?.value ?? props.rectangle;\n const texture = await setTexture(this.fullProps.image);\n this.texture = new Texture({\n source: texture.source,\n frame: new Rectangle(x, y, width, height),\n });\n }\n }\n\n onDestroy(): void {\n super.onDestroy();\n this.subscriptionSheet.forEach((sub) => sub.unsubscribe());\n this.subscriptionTick.unsubscribe();\n if (this.currentAnimationContainer && this.parent instanceof Container) {\n this.parent.removeChild(this.currentAnimationContainer);\n }\n }\n\n has(name: string): boolean {\n return this.animations.has(name);\n }\n\n get(name: string): AnimationDataFrames {\n return this.animations.get(name) as AnimationDataFrames;\n }\n\n isPlaying(name?: string): boolean {\n if (!name) return !!this.currentAnimation;\n if (this.currentAnimation == null) return false;\n return this.currentAnimation.name == name;\n }\n\n stop() {\n this.currentAnimation = null;\n this.destroy();\n }\n\n play(name: string, params: any[] = []) {\n const animParams = this.currentAnimation?.params;\n\n if (this.isPlaying(name) && arrayEquals(params, animParams || [])) return;\n\n const animation = this.get(name);\n\n if (!animation) {\n throw new Error(\n `Impossible to play the ${name} animation because it doesn't exist on the \"${this.id}\" spritesheet`\n );\n }\n\n const cloneParams = structuredClone(params);\n\n this.removeChildren();\n animation.sprites = [];\n this.currentAnimation = animation;\n this.currentAnimation.params = cloneParams;\n this.time = 0;\n this.frameIndex = 0;\n let animations: any = animation.animations;\n animations = isFunction(animations)\n ? (animations as Function)(...cloneParams)\n : animations;\n\n this.currentAnimationContainer = new Container();\n\n for (let container of animations as FrameOptionsMerging[][]) {\n const sprite = new PixiSprite();\n for (let frame of container) {\n this.currentAnimation.sprites.push(frame);\n }\n this.currentAnimationContainer.addChild(sprite);\n }\n\n const sound = this.currentAnimation.data.sound;\n\n if (sound) {\n //RpgSound.get(sound).play()\n }\n\n // Updates immediately to avoid flickering\n this.update({\n deltaRatio: 1,\n });\n }\n\n update({ deltaRatio }) {\n if (\n !this.isPlaying() ||\n !this.currentAnimation ||\n !this.currentAnimationContainer\n )\n return;\n\n const self = this;\n const { frames, sprites, data } = this.currentAnimation;\n let frame = sprites[this.frameIndex];\n const nextFrame = sprites[this.frameIndex + 1];\n\n for (let _sprite of this.currentAnimationContainer.children) {\n const sprite = _sprite as PixiSprite;\n\n if (!frame || frame.frameY == undefined || frame.frameX == undefined) {\n continue;\n }\n\n this.texture = frames[frame.frameY][frame.frameX];\n\n const getVal = <T extends keyof TransformOptions>(\n prop: T\n ): TransformOptions[T] | undefined => {\n return frame[prop] ?? data[prop] ?? this.spritesheet[prop];\n };\n\n const applyTransform = <T extends keyof TransformOptionsAsArray>(\n prop: T\n ): void => {\n const val = getVal<T>(prop);\n if (val) {\n this[prop as string].set(...val!);\n }\n };\n\n function applyTransformValue<T extends keyof TransformOptions>(prop: T);\n function applyTransformValue<T extends keyof TransformOptions>(\n prop: string,\n alias: T\n );\n function applyTransformValue<T extends keyof TransformOptions>(\n prop: T,\n alias?: T\n ): void {\n const optionProp = alias || prop;\n const val = getVal<T>(optionProp);\n if (val !== undefined) {\n self[prop as string] = val;\n }\n }\n\n if (this.applyTransform) {\n frame = {\n ...frame,\n ...this.applyTransform(frame, data, this.spritesheet),\n };\n }\n\n const realSize = getVal<\"spriteRealSize\">(\"spriteRealSize\");\n const heightOfSprite =\n typeof realSize == \"number\" ? realSize : realSize?.height;\n const widthOfSprite =\n typeof realSize == \"number\" ? realSize : realSize?.width;\n\n const applyAnchorBySize = () => {\n if (heightOfSprite && this.hitbox) {\n const { spriteWidth, spriteHeight } = data;\n const w = (spriteWidth - this.hitbox.w) / 2 / spriteWidth;\n const gap = (spriteHeight - heightOfSprite) / 2;\n const h = (spriteHeight - this.hitbox.h - gap) / spriteHeight;\n this.anchor.set(w, h);\n }\n };\n\n if (frame.sound) {\n //RpgSound.get(frame.sound).play()\n }\n\n applyAnchorBySize();\n\n applyTransform(\"anchor\");\n applyTransform(\"scale\");\n applyTransform(\"skew\");\n applyTransform(\"pivot\");\n\n applyTransformValue(\"alpha\", \"opacity\");\n applyTransformValue(\"x\");\n applyTransformValue(\"y\");\n applyTransformValue(\"angle\");\n applyTransformValue(\"rotation\");\n applyTransformValue(\"visible\");\n }\n\n if (!nextFrame) {\n this.time = 0;\n this.frameIndex = 0;\n if (this.onFinish && sprites.length > 1) this.onFinish();\n return;\n }\n\n this.time += deltaRatio ?? 1;\n\n if (this.time >= nextFrame.time) {\n this.frameIndex++;\n }\n }\n}\n\nexport interface CanvasSprite extends PixiSprite {}\n\nregisterComponent(\"Sprite\", CanvasSprite);\n\n// Define the props interface for Sprite\nexport interface SpriteProps extends DisplayObjectProps {\n sheet?: {\n definition?: SpritesheetOptionsMerging;\n playing?: string;\n params?: any;\n onFinish?: () => void;\n };\n scaleMode?: number;\n image?: string;\n rectangle?: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n context?: {\n tick: Signal;\n };\n}\n\nexport interface SpritePropsWithImage extends Omit<SpriteProps, \"sheet\"> {\n image: string;\n rectangle?: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n}\n\nexport interface SpritePropsWithSheet\n extends Omit<SpriteProps, \"image\" | \"rectangle\"> {\n sheet: {\n definition: SpritesheetOptionsMerging;\n playing?: string;\n params?: any;\n onFinish?: () => void;\n };\n loader?: {\n onProgress?: (progress: number) => void;\n onComplete?: (texture: Texture) => void;\n };\n}\n\nexport type SpritePropTypes = SpritePropsWithImage | SpritePropsWithSheet;\n\n// Update the Sprite function to use the props interface\nexport const Sprite: ComponentFunction<SpritePropTypes> = (props) => {\n return createComponent(\"Sprite\", props);\n};\n","import { effect, signal, type WritableSignal } from \"@signe/reactive\";\nimport { animate as animatePopmotion } from \"popmotion\";\n\nexport interface AnimateOptions<T> {\n duration?: number;\n ease?: (t: number) => number;\n onUpdate?: (value: T) => void;\n onComplete?: () => void;\n}\n\nexport interface AnimatedState<T> {\n current: T;\n start: T;\n end: T;\n}\n\nexport interface AnimatedSignal<T> extends Omit<WritableSignal<T>, 'set'> {\n (): T;\n set: (newValue: T, options?: AnimateOptions<T>) => Promise<void>;\n animatedState: WritableSignal<AnimatedState<T>>;\n update: (updater: (value: T) => T) => void;\n}\n\nexport function isAnimatedSignal(signal: WritableSignal<any>): boolean {\n return (signal as unknown as AnimatedSignal<any>).animatedState !== undefined;\n}\n\n/**\n * Creates an animated signal with the given initial value and animation options.\n * It's a writable signal that can be animated using popmotion. Properties of the animated signal are:\n * - current: the current value of the signal.\n * - start: the start value of the animation.\n * - end: the end value of the animation.\n * \n * @param initialValue The initial value of the signal.\n * @param options The animation options.\n * @returns The animated signal.\n * @example\n * const animatedValue = animatedSignal(0, { duration: 1000 });\n * animatedValue.set(10);\n * animatedValue.update((value) => value + 1);\n * console.log(animatedValue()); // 11\n * \n * animatedValue.animatedState() // { current: 10, start: 10, end: 11 }\n */\nexport function animatedSignal<T>(initialValue: T, options: AnimateOptions<T> = {}): AnimatedSignal<T> {\n const state: AnimatedState<T> = {\n current: initialValue,\n start: initialValue,\n end: initialValue,\n };\n let animation\n\n const publicSignal = signal(initialValue);\n const privateSignal = signal(state);\n\n effect(() => {\n const currentState = privateSignal();\n publicSignal.set(currentState.current);\n });\n\n function animatedSignal(): AnimatedState<T>;\n function animatedSignal(newValue: T): void;\n function animatedSignal(newValue: T, animationConfig: AnimateOptions<T>): void;\n function animatedSignal(newValue?: T, animationConfig: AnimateOptions<T> = {}): AnimatedState<T> | void {\n if (newValue === undefined) {\n return privateSignal();\n }\n \n const prevState = privateSignal();\n const newState: AnimatedState<T> = {\n current: prevState.current,\n start: prevState.current,\n end: newValue,\n };\n\n privateSignal.set(newState);\n\n if (animation) {\n animation.stop();\n }\n\n animation = animatePopmotion({\n // TODO\n duration: 20,\n ...options,\n ...animationConfig,\n from: prevState.current,\n to: newValue,\n onUpdate: (value) => {\n privateSignal.update(s => ({ ...s, current: value as T }));\n if (options.onUpdate) {\n options.onUpdate(value as T);\n }\n },\n });\n }\n\n const fn = function() {\n return privateSignal().current\n }\n\n for (const key in publicSignal) {\n fn[key] = publicSignal[key]\n }\n\n fn.animatedState = privateSignal\n fn.update = (updater: (value: T) => any) => {\n animatedSignal(updater(privateSignal().current));\n }\n fn.set = async (newValue: T, animationConfig: AnimateOptions<T> = {}) => {\n return new Promise<void>((resolve) => {\n animatedSignal(newValue, {\n ...animationConfig,\n onComplete: resolve\n });\n })\n }\n\n return fn as any\n}\n\n/**\n * Executes a sequence of animations. If an array is provided as an element in the sequence,\n * those animations will be executed in parallel.\n * \n * @param sequence Array of animation functions or arrays of animation functions for parallel execution\n * @returns Promise that resolves when all animations are complete\n * @example\n * ```ts\n * await animatedSequence([\n * () => value1.set(10),\n * [\n * () => value2.set(20),\n * () => value3.set(30)\n * ],\n * () => value1.set(0)\n * ])\n * ```\n */\nexport async function animatedSequence(sequence: ((() => Promise<void>) | (() => Promise<void>)[])[]) {\n for (const item of sequence) {\n if (Array.isArray(item)) {\n await Promise.all(item.map(fn => fn()));\n } else {\n await item();\n }\n }\n}","import { Texture } from \"pixi.js\";\nimport { h, mount } from \"../engine/signal\";\nimport { useDefineProps } from \"../hooks/useProps\";\nimport { Sprite } from \"./Sprite\";\nimport { effect, Signal, signal } from \"@signe/reactive\";\n\ninterface VideoProps {\n src: string;\n paused?: boolean;\n loop?: boolean;\n muted?: boolean;\n loader?: {\n onComplete?: (texture: Texture) => void;\n onProgress?: (progress: number) => void;\n };\n}\n\nexport function Video(props: VideoProps) {\n const eventsMap = {\n audioprocess: null,\n canplay: null,\n canplaythrough: null,\n complete: null,\n durationchange: null,\n emptied: null,\n ended: null,\n loadeddata: null,\n loadedmetadata: null,\n pause: null,\n play: null,\n playing: null,\n progress: null,\n ratechange: null,\n seeked: null,\n seeking: null,\n stalled: null,\n suspend: null,\n timeupdate: null,\n volumechange: null,\n waiting: null\n }\n\n const video: Signal<HTMLVideoElement | null> = signal(null)\n const defineProps = useDefineProps(props)\n const { play, loop, muted } = defineProps({\n play: {\n type: Boolean,\n default: true\n },\n loop: {\n type: Boolean,\n default: false\n },\n muted: {\n type: Boolean,\n default: false\n }\n })\n\n effect(() => {\n const _video = video()\n const state = play()\n if (_video && state !== undefined) {\n if (state) {\n _video.play()\n } else {\n _video.pause()\n }\n }\n if (_video && loop()) {\n _video.loop = loop()\n }\n if (_video && muted()) {\n _video.muted = muted()\n }\n })\n\n mount(() => {\n return () => {\n for (let event in eventsMap) {\n if (eventsMap[event]) {\n video().removeEventListener(event, eventsMap[event])\n }\n }\n }\n })\n\n return h(Sprite, {\n ...props,\n image: props.src,\n loader: {\n onComplete: (texture) => {\n const source = texture.source.resource\n video.set(source)\n if (props?.loader?.onComplete) {\n props.loader.onComplete(texture)\n }\n for (let event in eventsMap) {\n if (props[event]) {\n const cb = (ev) => {\n props[event](ev)\n }\n eventsMap[event] = cb\n source.addEventListener(event, cb)\n }\n }\n }\n }\n })\n}","import { Text as PixiText, TextStyle } from \"pixi.js\";\nimport { createComponent, registerComponent } from \"../engine/reactive\";\nimport { DisplayObject } from \"./DisplayObject\";\nimport { DisplayObjectProps } from \"./types/DisplayObject\";\nimport { Signal } from \"@signe/reactive\";\nimport { on } from \"../engine/trigger\";\n\nenum TextEffect {\n Typewriter = \"typewriter\",\n}\n\ninterface TextProps extends DisplayObjectProps {\n text?: string;\n style?: Partial<TextStyle>;\n color?: string;\n size?: string;\n fontFamily?: string;\n typewriter?: {\n speed?: number;\n start?: () => void;\n onComplete?: () => void;\n skip?: () => void;\n };\n}\n\nclass CanvasText extends DisplayObject(PixiText) {\n private subscriptionTick: any;\n private fullText: string = \"\";\n private currentIndex: number = 0;\n private typewriterSpeed: number = 1; // Default speed\n private _wordWrapWidth: number = 0;\n private typewriterOptions: any = {};\n private skipSignal?: () => void;\n\n onMount(args) {\n super.onMount(args);\n const { props } = args;\n const tick: Signal = props.context.tick;\n\n if (props.text && props.typewriter) {\n this.fullText = props.text;\n this.text = \"\";\n this.currentIndex = 0;\n // Set typewriter options\n if (props.typewriter) {\n this.typewriterOptions = props.typewriter;\n if (this.typewriterOptions.skip) {\n on(this.typewriterOptions.skip, () => {\n this.skipTypewriter();\n });\n }\n }\n }\n this.subscriptionTick = tick.observable.subscribe(() => {\n if (props.typewriter) {\n this.typewriterEffect();\n }\n });\n }\n\n onUpdate(props: TextProps) {\n super.onUpdate(props);\n if (props.typewriter) {\n if (props.typewriter) {\n this.typewriterOptions = props.typewriter;\n }\n }\n if (props.text !== undefined) {\n this.text = ''+props.text;\n }\n if (props.text !== undefined && props.text !== this.fullText && this.fullProps.typewriter) {\n this.text = \"\";\n this.currentIndex = 0;\n this.fullText = props.text;\n }\n if (props.style) {\n for (const key in props.style) {\n this.style[key] = props.style[key];\n }\n if (props.style.wordWrapWidth) {\n this._wordWrapWidth = props.style.wordWrapWidth;\n }\n }\n if (props.color) {\n this.style.fill = props.color;\n }\n if (props.size) {\n this.style.fontSize = props.size;\n }\n if (props.fontFamily) {\n this.style.fontFamily = props.fontFamily;\n }\n if (this._wordWrapWidth) {\n this.setWidth(this._wordWrapWidth);\n } else {\n this.setWidth(this.width);\n }\n this.setHeight(this.height);\n }\n\n get onCompleteCallback() {\n return this.typewriterOptions.onComplete;\n }\n\n private typewriterEffect() {\n if (this.currentIndex < this.fullText.length) {\n const nextIndex = Math.min(\n this.currentIndex + (this.typewriterOptions.speed ?? 1),\n this.fullText.length\n );\n this.text = this.fullText.slice(0, nextIndex);\n this.currentIndex = nextIndex;\n\n // Check if typewriter effect is complete\n if (\n this.currentIndex === this.fullText.length &&\n this.onCompleteCallback\n ) {\n this.onCompleteCallback();\n }\n }\n }\n\n // Add a method to skip the typewriter effect\n private skipTypewriter() {\n if (this.skipSignal) {\n this.skipSignal();\n }\n this.text = this.fullText;\n this.currentIndex = this.fullText.length;\n }\n\n onDestroy(): void {\n super.onDestroy();\n this.subscriptionTick.unsubscribe();\n }\n}\n\ninterface CanvasText extends PixiText {}\n\nregisterComponent(\"Text\", CanvasText);\n\nexport function Text(props: TextProps) {\n return createComponent(\"Text\", props);\n}\n","import { effect, signal } from \"@signe/reactive\";\n\ninterface Listen<T = any> {\n config: T | undefined;\n seed: {\n config: T | undefined;\n value: number;\n resolve: (value: any) => void;\n };\n}\n\ninterface Trigger<T = any> {\n start: () => Promise<void>;\n listen: () => Listen<T> | undefined;\n}\n\n/**\n * Checks if the given argument is a Trigger object\n * @param arg - The value to check\n * @returns True if the argument is a Trigger object\n */\nexport function isTrigger(arg: any): arg is Trigger<any> {\n return arg?.start && arg?.listen;\n}\n\n/**\n * Creates a new trigger that can be used to pass data between components\n * @param globalConfig - Optional configuration data to be passed when the trigger is activated\n * @returns A Trigger object with start and listen methods\n * @example\n * ```ts\n * const myTrigger = trigger()\n * \n * on(myTrigger, (data) => {\n * console.log('Triggered with data:', data)\n * })\n * \n * myTrigger.start({ message: 'Hello' })\n * ```\n */\nexport function trigger<T = any>(globalConfig?: T): Trigger<T> {\n const _signal = signal({\n config: globalConfig,\n value: 0,\n resolve: (value: any) => void 0,\n });\n return {\n start: (config?: T) => {\n return new Promise((resolve: (value: any) => void) => {\n _signal.set({\n config: {\n ...globalConfig,\n ...config,\n },\n resolve,\n value: Math.random(),\n });\n });\n },\n listen: (): Listen<T> | undefined => {\n return {\n config: globalConfig,\n seed: _signal(),\n };\n },\n };\n}\n\n/**\n * Subscribes to a trigger and executes a callback when the trigger is activated\n * @param triggerSignal - The trigger to subscribe to\n * @param callback - Function to execute when the trigger is activated\n * @throws Error if triggerSignal is not a valid trigger\n * @example\n * ```ts\n * const click = trigger()\n * \n * on(click, () => {\n * console.log('Click triggered')\n * })\n * ```\n */\nexport function on(triggerSignal: any, callback: (config: any) => void | Promise<void>) {\n if (!isTrigger(triggerSignal)) {\n throw new Error(\"In 'on(arg)' must have a trigger signal type\");\n }\n effect(() => {\n const result = triggerSignal.listen();\n if (result?.seed.value) {\n const ret = callback(result?.seed.config);\n if (ret && typeof ret.then === 'function') {\n ret.then(result?.seed.resolve);\n }\n }\n });\n}\n","import { TilingSprite as PixiTilingSprite, Texture } from 'pixi.js';\nimport { createComponent, registerComponent } from '../engine/reactive';\nimport { DisplayObject } from './DisplayObject';\nimport { DisplayObjectProps } from './types/DisplayObject';\n\ninterface TilingSpriteProps extends DisplayObjectProps {\n image?: string;\n tileScale?: { x: number; y: number };\n tilePosition?: { x: number; y: number };\n width?: number;\n height?: number;\n}\n\nclass CanvasTilingSprite extends DisplayObject(PixiTilingSprite) {\n onUpdate(props: TilingSpriteProps): void {\n super.onUpdate(props);\n if (props.image) {\n this.texture = Texture.from(props.image);\n }\n if (props.tileScale) {\n this.tileScale.set(props.tileScale.x, props.tileScale.y);\n }\n if (props.tilePosition) {\n this.tilePosition.set(props.tilePosition.x, props.tilePosition.y);\n }\n if (props.width !== undefined) {\n this.width = props.width;\n }\n if (props.height !== undefined) {\n this.height = props.height;\n }\n }\n}\n\nregisterComponent('TilingSprite', CanvasTilingSprite)\n\nexport function TilingSprite(props: TilingSpriteProps) {\n return createComponent('TilingSprite', props)\n}","import { Viewport as PixiViewport } from 'pixi-viewport';\nimport { Subscription } from 'rxjs';\nimport { createComponent, registerComponent } from '../engine/reactive';\nimport { DisplayObject } from './DisplayObject';\nimport { effect } from '@signe/reactive';\n\nconst EVENTS = [\n 'bounce-x-end',\n 'bounce-x-start',\n 'bounce-y-end',\n 'bounce-y-start',\n 'clicked',\n 'drag-end',\n 'drag-start',\n 'frame-end',\n 'mouse-edge-end',\n 'mouse-edge-start',\n 'moved',\n 'moved-end',\n 'pinch-end',\n 'pinch-start',\n 'snap-end',\n 'snap-start',\n 'snap-zoom-end',\n 'snap-zoom-start',\n 'wheel-scroll',\n 'zoomed',\n 'zoomed-end'\n]\n\nexport class CanvasViewport extends DisplayObject(PixiViewport) {\n private tickSubscription: Subscription\n overrideProps = ['wheel']\n\n constructor() {\n const defaultOptions = {\n noTicker: true,\n events: {\n domElement: {\n addEventListener: () => {}\n }\n },\n }\n // @ts-ignore\n super(defaultOptions) \n }\n\n onInit(props) {\n super.onInit(props)\n for (let event of EVENTS) {\n if (props[event]) this.on(event, props[event])\n }\n }\n\n onMount(element) {\n super.onMount(element)\n const { tick, renderer, canvasSize } = element.props.context\n let isDragging = false\n \n effect(() => {\n this.screenWidth = canvasSize().width\n this.screenHeight = canvasSize().height\n })\n\n renderer.events.domElement.addEventListener(\n 'wheel',\n this.input.wheelFunction\n );\n\n this.options.events = renderer.events\n \n this.tickSubscription = tick.observable.subscribe(({ value }) => {\n this.update(value.timestamp)\n })\n\n element.props.context.viewport = this\n this.updateViewportSettings(element.props)\n }\n\n onUpdate(props) {\n super.onUpdate(props)\n this.updateViewportSettings(props)\n }\n\n private updateViewportSettings(props) {\n if (props.screenWidth !== undefined) {\n this.screenWidth = props.screenWidth\n }\n if (props.screenHeight !== undefined) {\n this.screenHeight = props.screenHeight\n }\n if (props.worldWidth !== undefined) {\n this.worldWidth = props.worldWidth\n }\n if (props.worldHeight !== undefined) {\n this.worldHeight = props.worldHeight\n }\n if (props.drag) {\n this.drag(props.drag)\n }\n if (props.clamp) {\n this.clamp(props.clamp.value ?? props.clamp)\n }\n if (props.wheel) {\n if (props.wheel === true) {\n this.wheel()\n } else {\n this.wheel(props.wheel)\n }\n }\n if (props.decelerate) {\n if (props.decelerate === true) {\n this.decelerate()\n } else {\n this.decelerate(props.decelerate)\n }\n }\n if (props.pinch) {\n if (props.pinch === true) {\n this.pinch()\n } else {\n this.pinch(props.pinch)\n }\n }\n }\n\n onDestroy(): void {\n super.onDestroy()\n this.tickSubscription.unsubscribe()\n }\n}\n\nexport interface CanvasViewport extends PixiViewport { }\n\nregisterComponent('Viewport', CanvasViewport)\n\nexport interface ViewportProps {\n screenWidth?: number;\n screenHeight?: number;\n worldWidth?: number;\n worldHeight?: number;\n clamp?: boolean | {\n left?: number;\n right?: number;\n top?: number;\n bottom?: number;\n };\n [key: string]: any;\n}\n\nexport function Viewport(props: ViewportProps) {\n return createComponent('Viewport', props);\n}","import { Assets, NineSliceSprite as PixiNineSliceSprite, Texture } from \"pixi.js\";\nimport { createComponent, registerComponent } from \"../engine/reactive\";\nimport { DisplayObject } from \"./DisplayObject\";\nimport { DisplayObjectProps } from \"./types/DisplayObject\";\n\ninterface NineSliceSpriteProps extends DisplayObjectProps {\n image?: string;\n texture?: Texture;\n width?: number;\n height?: number;\n leftWidth?: number;\n rightWidth?: number;\n topHeight?: number;\n bottomHeight?: number;\n roundPixels?: boolean;\n}\n\nclass CanvasNineSliceSprite extends DisplayObject(PixiNineSliceSprite) {\n constructor() {\n // @ts-ignore\n super({\n width: 0,\n height: 0\n });\n }\n\n async onUpdate(props: NineSliceSpriteProps) {\n for (const [key, value] of Object.entries(props)) {\n if (value !== undefined) {\n if (key === 'image') {\n this.texture = await Assets.load(value);\n } else if (key in this) {\n (this as any)[key] = value;\n }\n }\n }\n }\n}\n\ninterface CanvasNineSliceSprite extends PixiNineSliceSprite {}\n\nregisterComponent(\"NineSliceSprite\", CanvasNineSliceSprite);\n\nexport function NineSliceSprite(props: NineSliceSpriteProps) {\n return createComponent(\"NineSliceSprite\", props);\n}\n","import { ComponentFunction, h } from \"./signal\";\n\n/**\n * Bootstraps a canvas element and renders it to the DOM.\n * \n * @param rootElement - The HTML element where the canvas will be rendered. Can be null.\n * @param canvas - A Promise that resolves to an Element representing the canvas component.\n * @returns A Promise that resolves to the rendered canvas element.\n * @throws {Error} If the provided element is not a Canvas component.\n */\nexport const bootstrapCanvas = async (rootElement: HTMLElement | null, canvas: ComponentFunction<any>) => {\n const canvasElement = await h(canvas);\n if (canvasElement.tag != 'Canvas') {\n throw new Error('Canvas is required');\n }\n (canvasElement as any).render(rootElement);\n\n return canvasElement;\n};\n","import { \n linear,\n easeIn,\n easeInOut,\n easeOut,\n circIn,\n circInOut,\n circOut,\n backIn,\n backInOut,\n backOut,\n anticipate,\n bounceIn,\n bounceInOut,\n bounceOut\n} from \"popmotion\"\n\nexport const Easing = {\n linear,\n easeIn,\n easeInOut,\n easeOut,\n circIn,\n circInOut,\n circOut,\n backIn,\n backInOut,\n backOut,\n anticipate,\n bounceIn,\n bounceInOut,\n bounceOut\n}","import { Texture, ImageSource, DOMAdapter, Matrix } from \"pixi.js\";\n\n/**\n * Creates a radial gradient texture that can be used in PixiJS.\n * @example\n * const gradient = new RadialGradient(size, size, 0, size, size, 0);\n * gradient.addColorStop(0, \"rgba(255, 255, 0, 1)\");\n * gradient.addColorStop(0.5, \"rgba(255, 255, 0, 0.3)\");\n * gradient.addColorStop(0.8, \"rgba(255, 255, 0, 0)\");\n */\nexport class RadialGradient {\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D | null;\n private gradient: CanvasGradient | null = null;\n private texture: Texture | null = null;\n public transform: Matrix;\n\n public size = 600;\n\n /**\n * Creates a new RadialGradient instance\n * @param x0 - The x-coordinate of the starting circle\n * @param y0 - The y-coordinate of the starting circle\n * @param x1 - The x-coordinate of the ending circle\n * @param y1 - The y-coordinate of the ending circle\n * @param x2 - The x-coordinate for gradient transformation\n * @param y2 - The y-coordinate for gradient transformation\n * @param focalPoint - The focal point of the gradient (0-1), defaults to 0\n */\n constructor(\n private x0: number,\n private y0: number,\n private x1: number,\n private y1: number,\n private x2: number,\n private y2: number,\n private focalPoint: number = 0\n ) {\n this.size = x0;\n const halfSize = this.size * 0.5;\n\n this.canvas = DOMAdapter.get().createCanvas() as any;\n this.canvas.width = this.size;\n this.canvas.height = this.size;\n this.ctx = this.canvas.getContext(\"2d\");\n\n if (this.ctx) {\n this.gradient = this.ctx.createRadialGradient(\n halfSize * (1 - focalPoint),\n halfSize,\n 0,\n halfSize,\n halfSize,\n halfSize - 0.5\n );\n }\n }\n\n /**\n * Adds a color stop to the gradient\n * @param offset - The position of the color stop (0-1)\n * @param color - The color value (any valid CSS color string)\n */\n addColorStop(offset: number, color: string) {\n if (this.gradient) {\n this.gradient.addColorStop(offset, color);\n }\n }\n\n /**\n * Renders the gradient and returns the texture with its transformation matrix\n * @param options - Render options\n * @param options.translate - Optional translation coordinates\n * @returns Object containing the texture and transformation matrix\n */\n render({ translate }: { translate?: { x: number; y: number } } = {}) {\n const { x0, y0, x1, y1, x2, y2, focalPoint } = this;\n const defaultSize = this.size;\n if (this.ctx && this.gradient) {\n this.ctx.fillStyle = this.gradient;\n this.ctx.fillRect(0, 0, defaultSize, defaultSize);\n\n this.texture = new Texture({\n source: new ImageSource({\n resource: this.canvas,\n addressModeU: \"clamp-to-edge\",\n addressModeV: \"clamp-to-edge\",\n }),\n });\n\n const m = new Matrix();\n const dx = Math.sqrt((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0));\n const dy = Math.sqrt((x2 - x0) * (x2 - x0) + (y2 - y0) * (y2 - y0));\n const angle = Math.atan2(y1 - y0, x1 - x0);\n\n // Calculate the scale factors correctly\n const scaleX = dx / defaultSize;\n const scaleY = dy / defaultSize;\n\n // Apply transformations in the correct order\n m.rotate(-angle);\n m.scale(scaleX, scaleY);\n if (translate) {\n m.translate(translate.x, translate.y);\n }\n\n this.transform = m;\n }\n\n return {\n texture: this.texture,\n matrix: this.transform,\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAEO,IAAM,aAAqC,CAAC;AAE5C,IAAe,YAAf,MAAyB;AAKhC;AAEO,SAAS,kBAAkB,MAAc,WAAgB;AAC5D,aAAW,IAAI,IAAI;AACvB;AAEO,SAAS,eAAe,SAAkB,eAAuB;AACpE,MAAI,CAAC,WAAW,aAAa,GAAG;AAC5B,WAAO;AAAA,EACX;AACA,QAAM,YAAY,IAAI,WAAW,aAAa,EAAE;AAChD,YAAU,SAAS,OAAO;AAC1B,SAAO;AACX;;;ACtBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMO,SAAS,YAAqB;AACjC,SAAO,OAAO,WAAW;AAC7B;AAMO,SAAS,aAAqB;AACjC,SAAO,OAAO,gBAAgB,cAAc,YAAY,IAAI,IAAI,KAAK,IAAI;AAC7E;AAOO,SAAS,OAAO,KAAqB;AACxC,SAAO,MAAO;AAClB;AAOO,SAAS,UAAU,OAAqB;AAC3C,SAAO,SAAS,iBAAiB;AACrC;AAEO,SAAS,YAAY,GAAU,GAAmB;AACrD,MAAI,EAAE,WAAW,EAAE,OAAQ,QAAO;AAClC,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AAC/B,UAAM,IAAI,EAAE,CAAC;AACb,UAAM,KAAK,EAAE,CAAC;AACd,QAAI,OAAO,MAAM,YAAY,MAAM,MAAM;AACrC,UAAI,OAAO,OAAO,YAAY,OAAO,KAAM,QAAO;AAClD,UAAI,MAAM,QAAQ,CAAC,GAAG;AAClB,YAAI,CAAC,MAAM,QAAQ,EAAE,KAAK,CAAC,YAAY,GAAG,EAAE,EAAG,QAAO;AAAA,MAC1D,WAAW,CAAC,aAAa,GAAG,EAAE,GAAG;AAC7B,eAAO;AAAA,MACX;AAAA,IACJ,WAAW,MAAM,IAAI;AACjB,aAAO;AAAA,IACX;AAAA,EACJ;AACA,SAAO;AACX;AAEA,SAAS,aAAa,GAAW,GAAoB;AACjD,QAAM,QAAQ,OAAO,KAAK,CAAC;AAC3B,QAAM,QAAQ,OAAO,KAAK,CAAC;AAC3B,MAAI,MAAM,WAAW,MAAM,OAAQ,QAAO;AAC1C,WAAS,OAAO,OAAO;AACnB,QAAI,CAAC,EAAE,eAAe,GAAG,EAAG,QAAO;AACnC,QAAI,CAAC,WAAW,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,EAAG,QAAO;AAAA,EAC5C;AACA,SAAO;AACX;AAEA,SAAS,WAAW,GAAQ,GAAiB;AACzC,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,OAAO,MAAM,OAAO,EAAG,QAAO;AAClC,MAAI,OAAO,MAAM,YAAY,MAAM,MAAM;AACrC,QAAI,MAAM,QAAQ,CAAC,GAAG;AAClB,aAAO,MAAM,QAAQ,CAAC,KAAK,YAAY,GAAG,CAAC;AAAA,IAC/C;AACA,WAAO,aAAa,GAAG,CAAC;AAAA,EAC5B;AACA,SAAO;AACX;AAOO,SAAS,WAAW,KAAuB;AAC9C,SAAO,CAAC,EAAE,SAAS,KAAK,GAAG,MAAM;AACrC;AAOO,SAAS,SAAS,KAAuB;AAC5C,SAAO,OAAO,OAAO,YAAY,OAAO,QAAQ,CAAC,MAAM,QAAQ,GAAG;AACtE;AAUO,SAAS,IACZ,KACA,MACA,OACA,kBAAkB,OACC;AACnB,MAAI,OAAO,GAAG,MAAM,IAAK,QAAO;AAEhC,MAAI,OAAO,SAAS,UAAU;AAC1B,WAAO,KAAK,MAAM,GAAG;AAAA,EACzB;AAEA,MAAI,MAAM,KAAK;AACf,MAAI,CAAC,IAAK,QAAO;AAEjB,MAAI,UAAU;AACd,WAAS,IAAI,GAAG,IAAI,MAAM,GAAG,KAAK;AAC9B,QAAI,UAAU,KAAK,CAAC;AACpB,QAAI,cAA+B,KAAK,IAAI,CAAC;AAC7C,QAAI,gBAAgB,CAAC,MAAM,OAAO,WAAW,CAAC,KAAK,SAAS,OAAO,WAAW,CAAC;AAE/E,QAAI,CAAC,QAAQ,OAAO,KAAK,OAAO,QAAQ,OAAO,MAAM,UAAU;AAC3D,cAAQ,OAAO,IAAK,iBAAiB,CAAC,kBAAmB,CAAC,IAAI,CAAC;AAAA,IACnE;AAEA,cAAU,QAAQ,OAAO;AAAA,EAC7B;AAEA,UAAQ,KAAK,MAAM,CAAC,CAAC,IAAI;AAEzB,SAAO;AACX;AAQO,SAAS,IAAI,KAA0B,MAAmB;AAC7D,QAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,MAAI,UAAU;AAEd,WAAS,OAAO,MAAM;AAClB,QAAI,QAAQ,GAAG,MAAM,QAAW;AAC5B,aAAO;AAAA,IACX;AACA,cAAU,QAAQ,GAAG;AAAA,EACzB;AAEA,SAAO;AACX;AAMO,SAAS,IAAI,MAAiB;AACjC,UAAQ,IAAI,IAAI;AACpB;AAMO,SAAS,MAAM,MAAiB;AACnC,UAAQ,MAAM,IAAI;AACtB;AAOO,SAAS,mBACZ,iBACA,OACI;AACJ,MAAI,OAAO,UAAU,UAAU;AAC3B,oBAAgB,IAAI,KAAK;AAAA,EAC7B,WACS,MAAM,QAAQ,KAAK,GAAG;AAC3B,oBAAgB,IAAI,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AAAA,EAC1C,OACK;AACD,oBAAgB,IAAI,MAAM,GAAG,MAAM,CAAC;AAAA,EACxC;AACJ;AAUO,SAAS,kBACZ,IACA,IACA,IACA,IACM;AACN,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,KAAK;AAChB,SAAO,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AACtC;;;ACjDA,IAAM,eAAe;AAAA,EACjB,GAAG;AAAA,EACH,GAAG;AAAA;AAAA,EACH,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EAC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","names":["loop","tick","loop","volume","effect","isSignal","isSignal","props","path","value","element","components","comp","signal","key","isSignal","tick","effect","isSignal","effect","signal","Container","effect","signal","EVENTS","signal","effect","Container","Canvas","signal","effect","h","Container","effect","effect","component","Container","tick","effect","isSignal","Container","Rectangle","Texture","effect","signal","animatedSignal","log","log","Texture","Rectangle","tick","isSignal","value","effect","Container","h","Sprite","effect","signal","loop","Sprite","effect","signal","tick","Texture","Texture","effect","EVENTS","tick","Assets","Assets","Texture"]}