ecspresso 0.14.7 → 0.14.9

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 CHANGED
@@ -1,4 +1,4 @@
1
- var o=((j)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(j,{get:(D,$)=>(typeof require<"u"?require:D)[$]}):j)(function(j){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+j+'" is not supported')});class H{parentMap=new Map;childrenMap=new Map;_bfsQueue=[];setParent(j,D){if(j===D)throw Error(`Cannot set entity ${j} as its own parent`);if(this.wouldCreateCycle(j,D))throw Error("Cannot set parent: would create circular reference");let $=this.parentMap.get(j);if($!==void 0){let J=this.childrenMap.get($);if(J){let X=J.indexOf(j);if(X!==-1)J.splice(X,1)}}this.parentMap.set(j,D);let G=this.childrenMap.get(D);if(G)G.push(j);else this.childrenMap.set(D,[j]);return this}removeParent(j){let D=this.parentMap.get(j);if(D===void 0)return!1;let $=this.childrenMap.get(D);if($){let G=$.indexOf(j);if(G!==-1)$.splice(G,1)}return this.parentMap.delete(j),!0}getParent(j){return this.parentMap.get(j)??null}getChildren(j){let D=this.childrenMap.get(j);return D?[...D]:[]}getChildAt(j,D){if(D<0)return null;let $=this.childrenMap.get(j);if(!$||D>=$.length)return null;return $[D]??null}getChildIndex(j,D){let $=this.childrenMap.get(j);if(!$)return-1;return $.indexOf(D)}removeEntity(j){let D=this.parentMap.get(j)??null;if(D!==null){let J=this.childrenMap.get(D);if(J){let X=J.indexOf(j);if(X!==-1)J.splice(X,1)}}this.parentMap.delete(j);let $=this.childrenMap.get(j)??[],G=[...$];for(let J of $)this.parentMap.delete(J);return this.childrenMap.delete(j),{oldParent:D,orphanedChildren:G}}getAncestors(j){let D=[],$=this.parentMap.get(j);while($!==void 0)D.push($),$=this.parentMap.get($);return D}getDescendants(j){let D=[],$=this.childrenMap.get(j);if(!$)return D;let G=$.slice().reverse();while(G.length>0){let J=G.pop();D.push(J);let X=this.childrenMap.get(J);if(X)for(let Y=X.length-1;Y>=0;Y--)G.push(X[Y])}return D}getRoot(j){let D=j,$=this.parentMap.get(D);while($!==void 0)D=$,$=this.parentMap.get(D);return D}getSiblings(j){let D=this.parentMap.get(j);if(D===void 0)return[];let $=this.childrenMap.get(D);if(!$)return[];return $.filter((G)=>G!==j)}isDescendantOf(j,D){if(j===D)return!1;let $=this.parentMap.get(j);while($!==void 0){if($===D)return!0;$=this.parentMap.get($)}return!1}isAncestorOf(j,D){return this.isDescendantOf(D,j)}get hasHierarchy(){return this.childrenMap.size>0}getRootEntities(){let j=[];for(let D of this.childrenMap.keys())if(!this.parentMap.has(D))j.push(D);return j}wouldCreateCycle(j,D){let $=D;while($!==void 0){if($===j)return!0;$=this.parentMap.get($)}return!1}forEachInHierarchy(j,D){let $=D?.roots??this.getRootEntities(),G=this._bfsQueue;G.length=0;for(let J of $)G.push(J,-1,0);for(let J=0;J<G.length;J+=3){let X=G[J],Y=G[J+1],Z=G[J+2];j(X,Y===-1?null:Y,Z);let _=this.childrenMap.get(X);if(_){let Q=Z+1;for(let W of _)G.push(W,X,Q)}}}*hierarchyIterator(j){let D=j?.roots??this.getRootEntities(),$=[];for(let G of D)$.push({entityId:G,parentId:null,depth:0});for(let G of $){yield G;let J=this.childrenMap.get(G.entityId);if(J)for(let X of J)$.push({entityId:X,parentId:G.entityId,depth:G.depth+1})}}}function v(j,D){for(let $ of D)if(!($ in j))return!1;return!0}function N(j,D){for(let $ of D)if($ in j)return!0;return!1}function p(j,D,$){if(!j)return!1;for(let G of D)if((j.get(G)??-1)>$)return!0;return!1}class T{callbacks=[];_iterDepth=0;_pendingRemovals=[];add(j){this.callbacks.push(j)}remove(j){if(this._iterDepth>0){this._pendingRemovals.push(j);return}let D=this.callbacks.indexOf(j);if(D!==-1)this.callbacks.splice(D,1)}invoke(j){this._iterDepth++;let D=this.callbacks.length;for(let $=0;$<D;$++){let G=this.callbacks[$];if(G)G(j)}if(this._iterDepth--,this._iterDepth===0&&this._pendingRemovals.length>0){for(let $ of this._pendingRemovals){let G=this.callbacks.indexOf($);if(G!==-1)this.callbacks.splice(G,1)}this._pendingRemovals.length=0}}}class z{nextId=1;entities=new Map;componentIndices=new Map;addedCallbacks=new Map;removedCallbacks=new Map;hierarchyManager=new H;disposeCallbacks=new Map;changeSeqs=new Map;_changeSeq=0;_afterComponentAddedHooks=[];_afterEntityMutatedHooks=[];_afterComponentRemovedHooks=[];_beforeEntityRemovedHooks=[];_afterParentChangedHooks=[];_batchingDepth=0;_batchedEntityIds=new Set;_pendingBatchKeys=null;get entityCount(){return this.entities.size}createEntity(){let j=this.nextId++,D={id:j,components:{}};return this.entities.set(j,D),D}registerDispose(j,D){this.disposeCallbacks.set(j,D)}getDisposeCallbacks(){return this.disposeCallbacks}invokeDispose(j,D,$){let G=this.disposeCallbacks.get(j);if(!G)return;try{G({value:D,entityId:$})}catch(J){console.warn(`Component dispose callback for '${String(j)}' threw:`,J)}}addComponent(j,D,$){let G=this.entities.get(j);if(!G)throw Error(`Cannot add component '${String(D)}': Entity with ID ${j} does not exist`);let J=G.components[D];if(J!==void 0)this.invokeDispose(D,J,G.id);if(G.components[D]=$,!this.componentIndices.has(D))this.componentIndices.set(D,new Set);this.componentIndices.get(D)?.add(G.id);let X=this.addedCallbacks.get(D);if(X)X.invoke({value:$,entity:G});this._batchingDepth++;for(let Y of this._afterComponentAddedHooks)Y(G.id,D);if(this._batchedEntityIds.add(G.id),this._batchingDepth--,this._batchingDepth===0){for(let Y of this._batchedEntityIds)for(let Z of this._afterEntityMutatedHooks)Z(Y);this._batchedEntityIds.clear()}return this}addComponents(j,D){let $=this.entities.get(j);if(!$)throw Error(`Cannot add components: Entity with ID ${j} does not exist`);let G=this._pendingBatchKeys;this._pendingBatchKeys=new Set(Object.keys(D)),this._batchingDepth++;for(let J in D)this.addComponent($.id,J,D[J]);if(this._batchingDepth--,this._pendingBatchKeys=G,this._batchingDepth===0){for(let J of this._batchedEntityIds)for(let X of this._afterEntityMutatedHooks)X(J);this._batchedEntityIds.clear()}return this}removeComponent(j,D){let $=this.entities.get(j);if(!$)throw Error(`Cannot remove component '${String(D)}': Entity with ID ${j} does not exist`);let G=$.components[D];if(G!==void 0)this.invokeDispose(D,G,$.id);delete $.components[D];let J=this.removedCallbacks.get(D);if(J&&G!==void 0)J.invoke({value:G,entity:$});if(this.componentIndices.get(D)?.delete($.id),G!==void 0)for(let X of this._afterComponentRemovedHooks)X($.id,D);return this}getComponent(j,D){return this.entities.get(j)?.components[D]}getEntitiesWithQuery(j=[],D=[],$,G,J){return this.getEntitiesWithQueryInto([],j,D,$,G,J)}getEntitiesWithQueryInto(j,D=[],$=[],G,J,X){j.length=0;let Y=G!==void 0&&G.length>0&&J!==void 0,Z=X!==void 0&&X.length>0;if(D.length===0){if($.length===0&&!Y&&!Z){for(let L of this.entities.values())j.push(L);return j}for(let L of this.entities.values()){if($.length>0&&N(L.components,$))continue;if(Y&&!p(this.changeSeqs.get(L.id),G,J))continue;if(Z&&!this.parentHasComponents(L.id,X))continue;j.push(L)}return j}let _=D[0];if(_===void 0)return j;let Q=_,W=this.componentIndices.get(_)?.size??0;for(let L=1;L<D.length;L++){let B=D[L];if(B===void 0)continue;let U=this.componentIndices.get(B)?.size??0;if(U<W)Q=B,W=U}let F=this.componentIndices.get(Q);if(!F||F.size===0)return j;for(let L of F){let B=this.entities.get(L);if(!B)continue;if(!v(B.components,D))continue;if($.length>0&&N(B.components,$))continue;if(Y&&!p(this.changeSeqs.get(L),G,J))continue;if(Z&&!this.parentHasComponents(L,X))continue;j.push(B)}return j}parentHasComponents(j,D){let $=this.hierarchyManager.getParent(j);if($===null)return!1;let G=this.entities.get($);if(!G)return!1;return v(G.components,D)}removeEntity(j,D){let $=this.entities.get(j);if(!$)return!1;if(D?.cascade??!0){let J=this.hierarchyManager.getDescendants($.id);for(let X=J.length-1;X>=0;X--){let Y=J[X];if(Y===void 0)continue;for(let Z of this._beforeEntityRemovedHooks)Z(Y)}for(let X of this._beforeEntityRemovedHooks)X($.id);for(let X=J.length-1;X>=0;X--){let Y=J[X];if(Y===void 0)continue;this.removeEntityInternal(Y)}}else for(let J of this._beforeEntityRemovedHooks)J($.id);return this.removeEntityInternal($.id)}removeEntityInternal(j){let D=this.entities.get(j);if(!D)return!1;this.hierarchyManager.removeEntity(j);for(let $ of Object.keys(D.components)){let G=D.components[$];if(G!==void 0){this.invokeDispose($,G,D.id);let J=this.removedCallbacks.get($);if(J)J.invoke({value:G,entity:D})}this.componentIndices.get($)?.delete(D.id)}return this.changeSeqs.delete(D.id),this.entities.delete(D.id)}getEntity(j){return this.entities.get(j)}onComponentAdded(j,D){let $=D,G=this.addedCallbacks.get(j);if(!G)G=new T,this.addedCallbacks.set(j,G);return G.add($),()=>{this.addedCallbacks.get(j)?.remove($)}}onComponentRemoved(j,D){let $=D,G=this.removedCallbacks.get(j);if(!G)G=new T,this.removedCallbacks.set(j,G);return G.add($),()=>{this.removedCallbacks.get(j)?.remove($)}}onAfterComponentAdded(j){return this._afterComponentAddedHooks.push(j),()=>{let D=this._afterComponentAddedHooks.indexOf(j);if(D!==-1)this._afterComponentAddedHooks.splice(D,1)}}onAfterEntityMutated(j){return this._afterEntityMutatedHooks.push(j),()=>{let D=this._afterEntityMutatedHooks.indexOf(j);if(D!==-1)this._afterEntityMutatedHooks.splice(D,1)}}onAfterComponentRemoved(j){return this._afterComponentRemovedHooks.push(j),()=>{let D=this._afterComponentRemovedHooks.indexOf(j);if(D!==-1)this._afterComponentRemovedHooks.splice(D,1)}}onBeforeEntityRemoved(j){return this._beforeEntityRemovedHooks.push(j),()=>{let D=this._beforeEntityRemovedHooks.indexOf(j);if(D!==-1)this._beforeEntityRemovedHooks.splice(D,1)}}onAfterParentChanged(j){return this._afterParentChangedHooks.push(j),()=>{let D=this._afterParentChangedHooks.indexOf(j);if(D!==-1)this._afterParentChangedHooks.splice(D,1)}}get changeSeq(){return this._changeSeq}markChanged(j,D){let $=++this._changeSeq,G=this.changeSeqs.get(j);if(!G)G=new Map,this.changeSeqs.set(j,G);G.set(D,$)}getChangeSeq(j,D){return this.changeSeqs.get(j)?.get(D)??-1}spawnChild(j,D){let $=this.createEntity();return this.addComponents($.id,D),this.setParent($.id,j),$}setParent(j,D){this.hierarchyManager.setParent(j,D);for(let $ of this._afterParentChangedHooks)$(j);return this}removeParent(j){let D=this.hierarchyManager.removeParent(j);if(D)for(let $ of this._afterParentChangedHooks)$(j);return D}getParent(j){return this.hierarchyManager.getParent(j)}getChildren(j){return this.hierarchyManager.getChildren(j)}getChildAt(j,D){return this.hierarchyManager.getChildAt(j,D)}getChildIndex(j,D){return this.hierarchyManager.getChildIndex(j,D)}getAncestors(j){return this.hierarchyManager.getAncestors(j)}getDescendants(j){return this.hierarchyManager.getDescendants(j)}getRoot(j){return this.hierarchyManager.getRoot(j)}getSiblings(j){return this.hierarchyManager.getSiblings(j)}isDescendantOf(j,D){return this.hierarchyManager.isDescendantOf(j,D)}isAncestorOf(j,D){return this.hierarchyManager.isAncestorOf(j,D)}get hasHierarchy(){return this.hierarchyManager.hasHierarchy}getRootEntities(){return this.hierarchyManager.getRootEntities()}forEachInHierarchy(j,D){this.hierarchyManager.forEachInHierarchy(j,D)}hierarchyIterator(j){return this.hierarchyManager.hierarchyIterator(j)}}class V{handlers=new Map;subscribe(j,D){return this.addHandler(j,D,!1)}once(j,D){return this.addHandler(j,D,!0)}unsubscribe(j,D){let $=this.handlers.get(j);if(!$)return!1;let G=$.findIndex((J)=>J.callback===D);if(G===-1)return!1;return $.splice(G,1),!0}addHandler(j,D,$){let G=this.handlers.get(j);if(!G)G=[],this.handlers.set(j,G);let J={callback:D,once:$};return G.push(J),()=>{let X=this.handlers.get(j);if(X){let Y=X.indexOf(J);if(Y!==-1)X.splice(Y,1)}}}publish(...[j,D]){let $=this.handlers.get(j);if(!$||$.length===0)return;let G=!1,J=$.length;for(let X=0;X<J&&X<$.length;X++){let Y=$[X];if(!Y)continue;if(Y.callback(D),Y.once)G=!0}if(G){for(let X=$.length-1;X>=0;X--)if($[X]?.once)$.splice(X,1)}}clear(){this.handlers.clear()}clearEvent(j){this.handlers.delete(j)}}var C=Symbol("resource-direct");function i(j){return{[C]:j}}function x(j){if(typeof j==="object"&&j!==null&&!Array.isArray(j))return{...j};return{$value:j}}function l(j,D){if(typeof j==="object"&&j!==null&&!Array.isArray(j)){let $=j;for(let G in D)if(!Object.is($[G],D[G]))return!0;return!1}return!Object.is(j,D.$value)}function c(j){return typeof j==="object"&&j!==null&&"factory"in j&&typeof j.factory==="function"}function d(j){return typeof j==="object"&&j!==null&&C in j}function b(j,D){let $=[],G=new Set,J=new Set;function X(Y,Z=[]){if(G.has(Y))return;if(J.has(Y))throw Error(`Circular resource dependency: ${[...Z,Y].join(" -> ")}`);J.add(Y);for(let _ of D(Y)){let Q=j.find((W)=>W===_);if(Q)X(Q,[...Z,Y])}J.delete(Y),G.add(Y),$.push(Y)}for(let Y of j)X(Y);return $}class E{resources=new Map;resourceFactories=new Map;resourceDependencies=new Map;resourceDisposers=new Map;initializedResourceKeys=new Set;_changeSubscribers=new Map;_observedSnapshots=new Map;add(j,D){let $=(G)=>{this.resources.set(j,G),this.initializedResourceKeys.add(j),this.resourceDependencies.set(j,[])};if(c(D)){if(this.resourceFactories.set(j,D.factory),this.resourceDependencies.set(j,D.dependsOn??[]),D.onDispose)this.resourceDisposers.set(j,D.onDispose)}else if(d(D))$(D[C]);else if(typeof D==="function")this.resourceFactories.set(j,D),this.resourceDependencies.set(j,[]);else $(D);return this}tryGet(j,...D){if(!this.has(j))return;return this.get(j,...D)}get(j,...D){let $=this.resources.get(j);if($!==void 0)return $;let G=this.resourceFactories.get(j);if(G===void 0)throw Error(`Resource ${String(j)} not found`);let J=D[0],X=G(J);if(!(X instanceof Promise))this.resources.set(j,X),this.initializedResourceKeys.add(j);return X}has(j){return this.resources.has(j)||this.resourceFactories.has(j)}remove(j){let D=this.resources.delete(j),$=this.resourceFactories.delete(j);return this.resourceDependencies.delete(j),this.resourceDisposers.delete(j),this.initializedResourceKeys.delete(j),D||$}getKeys(){let j=new Set([...this.resources.keys(),...this.resourceFactories.keys()]);return Array.from(j)}needsInitialization(j){return this.resourceFactories.has(j)&&!this.initializedResourceKeys.has(j)}getPendingInitializationKeys(){return Array.from(this.resourceFactories.keys()).filter((j)=>!this.initializedResourceKeys.has(j))}async initializeResource(j,...D){if(!this.resourceFactories.has(j)||this.initializedResourceKeys.has(j))return;let $=this.resourceFactories.get(j);if(!$)return;let G=D[0],J=await $(G);this.resources.set(j,J),this.initializedResourceKeys.add(j),this.resourceFactories.delete(j)}async initializeResources(...j){let D=j.slice(1),$=D.length===0?this.getPendingInitializationKeys():D;if($.length===0)return;let G=b($,(J)=>[...this.resourceDependencies.get(J)??[]]);for(let J of G)await this.initializeResource(J,...j.slice(0,1))}getDependencies(j){return this.resourceDependencies.get(j)??[]}async disposeResource(j,...D){if(!this.resources.has(j)&&!this.resourceFactories.has(j))return!1;if(this.initializedResourceKeys.has(j)){let $=this.resourceDisposers.get(j),G=this.resources.get(j);if($&&G!==void 0){let J=D[0];await $(G,J)}}return this.resources.delete(j),this.resourceFactories.delete(j),this.resourceDependencies.delete(j),this.resourceDisposers.delete(j),this.initializedResourceKeys.delete(j),this._changeSubscribers.delete(j),!0}onResourceChange(j,D){let $=this._changeSubscribers.get(j),G=$??new Set;if(!$){this._changeSubscribers.set(j,G);let X=this.resources.get(j);this._observedSnapshots.set(j,x(X))}let J=D;return G.add(J),()=>{if(G.delete(J),G.size===0)this._changeSubscribers.delete(j),this._observedSnapshots.delete(j)}}notifyChange(j,D,$){if(Object.is(D,$))return;let G=this._changeSubscribers.get(j);if(!G||G.size===0)return;if(this._observedSnapshots.has(j))this._observedSnapshots.set(j,x(D));let J=[...G];for(let X of J)X(D,$)}isObserved(j){return this._observedSnapshots.has(j)}flushObserved(){if(this._observedSnapshots.size===0)return;for(let[j,D]of this._observedSnapshots){let $=this.resources.get(j);if(!l($,D))continue;let G="$value"in D?D.$value:D,J=x($),X=this._changeSubscribers.get(j);for(let Y of X)Y($,G);this._observedSnapshots.set(j,J)}}async disposeResources(...j){let D=Array.from(this.initializedResourceKeys);if(D.length===0)return;let $=b(D,(G)=>[...this.resourceDependencies.get(G)??[]]).reverse();for(let G of $)await this.disposeResource(G,...j)}}class R{queries=new Map;entityManager;_hasParentHasQueries=!1;constructor(j){this.entityManager=j}get hasParentHasQueries(){return this._hasParentHasQueries}addQuery(j,D){let $={definition:D,matchingEntities:new Set};if(this.queries.set(j,$),D.parentHas?.length)this._hasParentHasQueries=!0;let G=this.entityManager.getEntitiesWithQuery(D.with,D.without??[]);for(let J of G)if(this.entityMatchesQuery(J,$.definition))$.matchingEntities.add(J.id),$.definition.onEnter?.(J)}removeQuery(j){let D=this.queries.delete(j);if(D)this._recalcParentHasFlag();return D}entityMatchesQuery(j,D){for(let $ of D.with)if(!($ in j.components))return!1;if(D.without){for(let $ of D.without)if($ in j.components)return!1}if(D.parentHas?.length){let $=this.entityManager.getParent(j.id);if($===null)return!1;let G=this.entityManager.getEntity($);if(!G)return!1;for(let J of D.parentHas)if(!(J in G.components))return!1}return!0}_applyQueryTransition(j,D){let $=D.matchingEntities.has(j.id),G=this.entityMatchesQuery(j,D.definition);if(!$&&G)D.matchingEntities.add(j.id),D.definition.onEnter?.(j);else if($&&!G)D.matchingEntities.delete(j.id),D.definition.onExit?.(j.id)}onComponentAdded(j,D){for(let[,$]of this.queries)this._applyQueryTransition(j,$);if(this._hasParentHasQueries)this._recheckChildren(j.id)}onComponentRemoved(j,D){for(let[,$]of this.queries)this._applyQueryTransition(j,$);if(this._hasParentHasQueries)this._recheckChildren(j.id)}onEntityRemoved(j){for(let[D,$]of this.queries)if($.matchingEntities.has(j))$.matchingEntities.delete(j),$.definition.onExit?.(j)}recheckEntity(j){for(let[,D]of this.queries)this._applyQueryTransition(j,D)}recheckEntityAndChildren(j){if(this.recheckEntity(j),this._hasParentHasQueries)this._recheckChildren(j.id)}_recheckChildren(j){let D=this.entityManager.getChildren(j);for(let $ of D){let G=this.entityManager.getEntity($);if(G)this.recheckEntity(G)}}_recalcParentHasFlag(){this._hasParentHasQueries=!1;for(let[,j]of this.queries)if(j.definition.parentHas?.length){this._hasParentHasQueries=!0;return}}}class w{commands=[];removeEntity(j,D){this.commands.push(($)=>{$.removeEntity(j,D)})}addComponent(j,D,$){this.commands.push((G)=>{G.addComponent(j,D,$)})}removeComponent(j,D){this.commands.push(($)=>{$.removeComponent(j,D)})}spawn(j){this.commands.push((D)=>{D.spawn(j)})}spawnChild(j,D){this.commands.push(($)=>{$.spawnChild(j,D)})}addComponents(j,D){this.commands.push(($)=>{$.addComponents(j,D)})}setParent(j,D){this.commands.push(($)=>{$.setParent(j,D)})}mutateComponent(j,D,$){this.commands.push((G)=>{G.mutateComponent(j,D,$)})}markChanged(j,D){this.commands.push(($)=>{$.markChanged(j,D)})}removeParent(j){this.commands.push((D)=>{D.removeParent(j)})}playback(j){for(let D of this.commands)try{D(j)}catch($){console.warn("CommandBuffer: Command failed during playback:",$)}this.commands.length=0}clear(){this.commands.length=0}get length(){return this.commands.length}}class h{_id;constructor(j){this._id=j}withComponentTypes(){return this}withEventTypes(){return this}withResourceTypes(){return this}withAssetTypes(){return this}withScreenTypes(){return this}withLabels(){return this}withGroups(){return this}withAssetGroupNames(){return this}withReactiveQueryNames(){return this}requires(){return this}install(j){return{id:this._id,install:j}}}function M(j){return new h(j)}class S{_label;queries={};processFunction;detachFunction;initializeFunction;eventHandlers;_priority=0;_phase="update";_groups=[];_inScreens;_excludeScreens;_requiredAssets;_runWhenEmpty=!1;_entityEnterHandlers={};_resourceKeys;constructor(j){this._label=j}get label(){return this._label}_createSystemObject(){let j={label:this._label,entityQueries:this.queries,priority:this._priority,phase:this._phase};if(this.processFunction)j.process=this.processFunction;if(this.detachFunction)j.onDetach=this.detachFunction;if(this.initializeFunction)j.onInitialize=this.initializeFunction;if(this.eventHandlers)j.eventHandlers=this.eventHandlers;if(this._groups.length>0)j.groups=[...this._groups];if(this._inScreens)j.inScreens=this._inScreens;if(this._excludeScreens)j.excludeScreens=this._excludeScreens;if(this._requiredAssets)j.requiredAssets=this._requiredAssets;if(this._runWhenEmpty)j.runWhenEmpty=!0;if(Object.keys(this._entityEnterHandlers).length>0)j.onEntityEnter={...this._entityEnterHandlers};return j}setPriority(j){return this._priority=j,this}inPhase(j){return this._phase=j,this}inGroup(j){if(!this._groups.includes(j))this._groups.push(j);return this}inScreens(j){return this._inScreens=[...j],this}excludeScreens(j){return this._excludeScreens=[...j],this}requiresAssets(j){return this._requiredAssets=[...j],this}runWhenEmpty(){return this._runWhenEmpty=!0,this}withResources(j){return this._resourceKeys=[...j],this}addQuery(j,D){let $=this;return $.queries={...this.queries,[j]:D},$}setProcess(j){return this.processFunction=this._wrapWithResources(j),this}_wrapWithResources(j){if(!this._resourceKeys?.length)return j;let D=this._resourceKeys,$={},G=!1;return(J)=>{for(let X of D)if(!G||J.ecs.isResourceObserved(X))$[X]=J.ecs.getResource(X);G=!0,J.resources=$,j(J)}}setProcessEach(j,D){let $=this;if(Object.keys($.queries).length>0||$.processFunction!==void 0)throw Error("setProcessEach requires a SystemBuilder with no prior queries or process function. Use addQuery + setProcess for multi-query systems.");$.queries.__each=j;let G={entity:void 0,dt:0,ecs:void 0,resources:void 0},J=(X)=>{let Y=X,Z=Y.queries.__each;if(!Z)return;G.dt=Y.dt,G.ecs=Y.ecs,G.resources=Y.resources;for(let _ of Z)G.entity=_,D(G)};return $.processFunction=$._wrapWithResources(J),this}setOnEntityEnter(j,D){return this._entityEnterHandlers[j]=D,this}setOnDetach(j){return this.detachFunction=j,this}setOnInitialize(j){return this.initializeFunction=j,this}setEventHandlers(j){return this.eventHandlers=j,this}}function k(j,D,$){let G=new Set,J=[D];while(J.length>0){let X=J.pop();if(X===void 0)break;if(X===j)throw Error(`Circular required component dependency: '${String(j)}' -> '${String(D)}' -> ... -> '${String(j)}'`);if(G.has(X))continue;G.add(X);let Y=$(X);if(Y)for(let Z of Y)J.push(Z.component)}}var I="0.14.7";class K{assets=new Map;groups=new Map;eventBus=null;setEventBus(j){this.eventBus=j}register(j,D){if(this.assets.set(j,{definition:D,status:"pending"}),D.group){let $=this.groups.get(D.group)??new Set;$.add(j),this.groups.set(D.group,$)}}async loadEagerAssets(){let j=[];for(let[D,$]of this.assets)if($.definition.eager&&$.status==="pending")j.push(D);await Promise.all(j.map((D)=>this.loadAsset(D)))}async loadAsset(j){let D=this.assets.get(j);if(!D)throw Error(`Asset '${String(j)}' not found`);if(D.status==="loaded"&&D.value!==void 0)return D.value;if(D.status==="loading"&&D.loadPromise)return D.loadPromise;if(D.status==="failed")D.status="pending";D.status="loading",D.loadPromise=D.definition.loader();try{let $=await D.loadPromise;return D.value=$,D.status="loaded",D.loadPromise=void 0,this.eventBus?.publish("assetLoaded",{key:j}),this.checkGroupProgress(D.definition.group),$}catch($){let G=$ instanceof Error?$:Error(String($));throw D.status="failed",D.error=G,D.loadPromise=void 0,this.eventBus?.publish("assetFailed",{key:j,error:G}),G}}async loadAssetGroup(j){let D=this.groups.get(j);if(!D||D.size===0)throw Error(`Asset group '${j}' not found or empty`);await Promise.all(Array.from(D).map(($)=>this.loadAsset($)))}get(j){let D=this.assets.get(j);if(!D)throw Error(`Asset '${String(j)}' not found`);if(D.status!=="loaded"||D.value===void 0)throw Error(`Asset '${String(j)}' is not loaded (status: ${D.status})`);return D.value}tryGet(j){let D=this.assets.get(j);if(!D||D.status!=="loaded")return;return D.value}getHandle(j){let D=this.assets.get(j);if(!D)throw Error(`Asset '${String(j)}' not found`);let $=this;return{get status(){return D.status},get isLoaded(){return D.status==="loaded"},get(){return $.get(j)},tryGet(){return $.tryGet(j)}}}getStatus(j){let D=this.assets.get(j);if(!D)throw Error(`Asset '${String(j)}' not found`);return D.status}isLoaded(j){return this.assets.get(j)?.status==="loaded"}isGroupLoaded(j){let D=this.groups.get(j);if(!D||D.size===0)return!1;for(let $ of D){let G=this.assets.get($);if(!G||G.status!=="loaded")return!1}return!0}getGroupProgress(j){return this.getGroupProgressDetails(j).progress}getGroupProgressDetails(j){let D=this.groups.get(j);if(!D||D.size===0)return{loaded:0,total:0,progress:0};let $=0;for(let J of D)if(this.assets.get(J)?.status==="loaded")$++;let G=D.size;return{loaded:$,total:G,progress:$/G}}checkGroupProgress(j){if(!j||!this.eventBus)return;let D=j,$=this.getGroupProgressDetails(D);if(this.eventBus.publish("assetGroupProgress",{group:D,...$}),$.loaded===$.total)this.eventBus.publish("assetGroupLoaded",{group:D})}createResource(){let j=this;return{getStatus(D){return j.getStatus(D)},isLoaded(D){return j.isLoaded(D)},isGroupLoaded(D){return j.isGroupLoaded(D)},getGroupProgress(D){return j.getGroupProgress(D)},get(D){return j.get(D)},tryGet(D){return j.tryGet(D)},getHandle(D){return j.getHandle(D)}}}getKeys(){return Array.from(this.assets.keys())}getGroupNames(){return Array.from(this.groups.keys())}getGroupKeys(j){let D=this.groups.get(j);return D?Array.from(D):[]}}class u{manager;constructor(j){this.manager=j}add(j,D){return this.manager.register(j,{loader:D,eager:!0}),this}addWithConfig(j,D){return this.manager.register(j,D),this}addGroup(j,D){for(let[$,G]of Object.entries(D))this.manager.register($,{loader:G,eager:!1,group:j});return this}getManager(){return this.manager}}function q(j){return new u(j??new K)}class A{screens=new Map;currentScreen=null;screenStack=[];eventBus=null;assetManager=null;ecs=null;setDependencies(j,D,$){this.eventBus=j,this.assetManager=D,this.ecs=$}requireEcs(){if(!this.ecs)throw Error("ScreenManager: dependencies not set. Call setDependencies() first.");return this.ecs}register(j,D){this.screens.set(j,{definition:D})}async setScreen(j,D){let $=this.screens.get(j);if(!$)throw Error(`Screen '${String(j)}' not found`);await this.verifyRequiredAssets($.definition.requiredAssets,$.definition.requiredAssetGroups);while(this.screenStack.length>0){let J=this.screenStack.pop();if(J)await this.exitScreen(J.name)}if(this.currentScreen)await this.exitScreen(this.currentScreen.name);let G=$.definition.initialState(D);this.currentScreen={name:j,config:D,state:G},await $.definition.onEnter?.({config:D,ecs:this.requireEcs()}),this.eventBus?.publish("screenEnter",{screen:j,config:D})}async pushScreen(j,D){let $=this.screens.get(j);if(!$)throw Error(`Screen '${String(j)}' not found`);if(await this.verifyRequiredAssets($.definition.requiredAssets,$.definition.requiredAssetGroups),this.currentScreen)this.screenStack.push(this.currentScreen);let G=$.definition.initialState(D);this.currentScreen={name:j,config:D,state:G},await $.definition.onEnter?.({config:D,ecs:this.requireEcs()}),this.eventBus?.publish("screenPush",{screen:j,config:D})}async popScreen(){if(this.screenStack.length===0)throw Error("Cannot pop screen: stack is empty");if(this.currentScreen)await this.exitScreen(this.currentScreen.name),this.eventBus?.publish("screenPop",{screen:this.currentScreen.name});this.currentScreen=this.screenStack.pop()??null}async exitScreen(j){let D=this.screens.get(j);if(D?.definition.onExit)await D.definition.onExit(this.requireEcs());this.eventBus?.publish("screenExit",{screen:j})}async verifyRequiredAssets(j,D){if(!this.assetManager)return;if(j){for(let $ of j)if(!this.assetManager.isLoaded($))await this.assetManager.loadAsset($)}if(D){for(let $ of D)if(!this.assetManager.isGroupLoaded($))await this.assetManager.loadAssetGroup($)}}getCurrentScreen(){return this.currentScreen?.name??null}getConfig(j){if(!this.currentScreen)throw Error("No current screen");if(j!==void 0&&this.currentScreen.name!==j)throw Error(`Expected current screen '${String(j)}', but current is '${String(this.currentScreen.name)}'`);return this.currentScreen.config}tryGetConfig(j){if(!this.currentScreen)return;if(j!==void 0&&this.currentScreen.name!==j)return;return this.currentScreen.config}getState(j){if(!this.currentScreen)throw Error("No current screen");if(j!==void 0&&this.currentScreen.name!==j)throw Error(`Expected current screen '${String(j)}', but current is '${String(this.currentScreen.name)}'`);return this.currentScreen.state}tryGetState(j){if(!this.currentScreen)return;if(j!==void 0&&this.currentScreen.name!==j)return;return this.currentScreen.state}updateState(j,D){if(!this.currentScreen)throw Error("No current screen");if(D!==void 0&&this.currentScreen.name!==D)throw Error(`Expected current screen '${String(D)}', but current is '${String(this.currentScreen.name)}'`);let $=typeof j==="function"?j(this.currentScreen.state):j;this.currentScreen.state={...this.currentScreen.state,...$}}getStackDepth(){return this.screenStack.length}isOverlay(){return this.screenStack.length>0}isActive(j){if(this.currentScreen?.name===j)return!0;return this.screenStack.some((D)=>D.name===j)}isCurrent(j){return this.currentScreen?.name===j}createResource(){let j=this;return{get current(){return j.getCurrentScreen()},get config(){return j.tryGetConfig()??null},get state(){return j.tryGetState()??null},set state(D){if(j.currentScreen&&D!==null)j.currentScreen.state=D},get stack(){return j.screenStack},get isOverlay(){return j.isOverlay()},get stackDepth(){return j.getStackDepth()},isActive(D){return j.isActive(D)},isCurrent(D){return j.isCurrent(D)}}}getScreenNames(){return Array.from(this.screens.keys())}hasScreen(j){return this.screens.has(j)}}class s{manager;constructor(j){this.manager=j}add(j,D){return this.manager.register(j,D),this}getManager(){return this.manager}}function f(j){return new s(j??new A)}class g{assetConfigurator=null;screenConfigurator=null;pendingResources=[];pendingDisposeCallbacks=[];pendingRequiredComponents=[];pendingPlugins=[];_fixedDt=null;constructor(){}withPlugin(j){return this.pendingPlugins.push(j),this}withComponentTypes(){return this}withEventTypes(){return this}withResourceTypes(){return this}withResource(j,D){return this.pendingResources.push({key:j,value:D}),this}withDispose(j,D){return this.pendingDisposeCallbacks.push({key:j,callback:D}),this}withRequired(j,D,$){return this.pendingRequiredComponents.push({trigger:j,required:D,factory:$}),this}withAssets(j){let D=q();return j(D),this.assetConfigurator=D,this}withScreens(j){let D=f();return j(D),this.screenConfigurator=D,this}withFixedTimestep(j){return this._fixedDt=j,this}withReactiveQueryNames(){return this}pluginFactory(){return(j)=>M(j.id).install(j.install)}build(){let j=new P;for(let D of this.pendingPlugins)j._installPluginUnchecked(D);for(let{key:D,value:$}of this.pendingResources)j.addResource(D,$);for(let{key:D,callback:$}of this.pendingDisposeCallbacks)j.registerDispose(D,$);for(let{trigger:D,required:$,factory:G}of this.pendingRequiredComponents)j.registerRequired(D,$,G);if(this.assetConfigurator)j._setAssetManager(this.assetConfigurator.getManager());else if(j._hasPendingPluginAssets())j._setAssetManager(new K);if(this.screenConfigurator)j._setScreenManager(this.screenConfigurator.getManager());else if(j._hasPendingPluginScreens())j._setScreenManager(new A);if(this._fixedDt!==null)j._setFixedDt(this._fixedDt);return j}}var m=["preUpdate","fixedUpdate","update","postUpdate","render"];class P{static VERSION=I;_entityManager;_eventBus;_resourceManager;_commandBuffer;_systems=[];_phaseSystems={preUpdate:[],fixedUpdate:[],update:[],postUpdate:[],render:[]};_installedPlugins=new Set;_disabledGroups=new Set;_assetManager=null;_screenManager=null;_reactiveQueryManager;_postUpdateHooks=[];_currentTick=0;_systemLastSeqs=new Map;_changeThreshold=0;_fixedDt=0.016666666666666666;_fixedAccumulator=0;_interpolationAlpha=0;_maxFixedSteps=8;_requiredComponents=new Map;_pendingPluginAssets=[];_pendingPluginScreens=[];_diagnosticsEnabled=!1;_systemTimings=new Map;_phaseTimings={preUpdate:0,fixedUpdate:0,update:0,postUpdate:0,render:0};_entityEnterTracking=new Map;_entityEnterFrameSet=new Set;_systemContexts=new WeakMap;_pendingFinalizers=[];_batchingRegistrations=!1;constructor(){this._entityManager=new z,this._eventBus=new V,this._resourceManager=new E,this._reactiveQueryManager=new R(this._entityManager),this._commandBuffer=new w,this._subscribeLifecycleHooks()}_subscribeLifecycleHooks(){this._entityManager.onAfterComponentAdded((j,D)=>{this._entityManager.markChanged(j,D);let $=this._requiredComponents.get(D);if($){let G=this._entityManager.getEntity(j);if(G){let J=G.components[D];for(let{component:X,factory:Y}of $){if(this._entityManager._pendingBatchKeys?.has(X))continue;if(!(X in G.components))this._entityManager.addComponent(j,X,Y(J))}}}}),this._entityManager.onAfterEntityMutated((j)=>{let D=this._entityManager.getEntity(j);if(D)this._reactiveQueryManager.recheckEntityAndChildren(D)}),this._entityManager.onAfterComponentRemoved((j,D)=>{let $=this._entityManager.getEntity(j);if($)this._reactiveQueryManager.onComponentRemoved($,D)}),this._entityManager.onBeforeEntityRemoved((j)=>{this._reactiveQueryManager.onEntityRemoved(j)}),this._entityManager.onAfterParentChanged((j)=>{if(this._reactiveQueryManager.hasParentHasQueries){let D=this._entityManager.getEntity(j);if(D)this._reactiveQueryManager.recheckEntity(D)}})}static create(){return new g}addSystem(j){let D=new S(j);return this._pendingFinalizers.push(()=>{this._registerSystem(D._createSystemObject())}),D}_finalizePendingBuilders(){if(this._pendingFinalizers.length===0)return;this._batchingRegistrations=!0;while(this._pendingFinalizers.length>0){let j=this._pendingFinalizers;this._pendingFinalizers=[];for(let D of j)D()}this._batchingRegistrations=!1,this._rebuildPhaseSystems()}update(j){this._finalizePendingBuilders();let D=this._screenManager?.getCurrentScreen()??null,$=this._diagnosticsEnabled;this._runPhase("preUpdate",j,D,$);let G=$?performance.now():0;this._fixedAccumulator+=j;let J=0;while(this._fixedAccumulator>=this._fixedDt&&J<this._maxFixedSteps)this._executePhase(this._phaseSystems.fixedUpdate,this._fixedDt,D),this._commandBuffer.playback(this),this._fixedAccumulator-=this._fixedDt,J++;if(this._fixedAccumulator>=this._fixedDt)this._fixedAccumulator=0;if($)this._phaseTimings.fixedUpdate=performance.now()-G;this._interpolationAlpha=this._fixedAccumulator/this._fixedDt,this._runPhase("update",j,D,$),this._runPhase("postUpdate",j,D,$);for(let X of this._postUpdateHooks)X({ecs:this,dt:j});this._runPhase("render",j,D,$),this._resourceManager.flushObserved(),this._changeThreshold=this._entityManager.changeSeq,this._currentTick++}_executePhase(j,D,$){for(let G of j){if(!G.process&&!G.onEntityEnter)continue;if(G.groups?.length){let W=!1;for(let F of G.groups)if(this._disabledGroups.has(F)){W=!0;break}if(W)continue}if(G.inScreens?.length){if($===null||!G.inScreens.includes($))continue}if(G.excludeScreens?.length){if($!==null&&G.excludeScreens.includes($))continue}if(G.requiredAssets?.length&&this._assetManager){let W=!0;for(let F of G.requiredAssets)if(!this._assetManager.isLoaded(F)){W=!1;break}if(!W)continue}let J=this._systemLastSeqs.get(G)??0;this._changeThreshold=J;let X=this._systemContexts.get(G);if(!X)X={queries:{},dt:0,ecs:this},this._systemContexts.set(G,X);X.dt=D;let Y=X.queries,Z=!1,_=!1;if(G.entityQueries)for(let W in G.entityQueries){_=!0;let F=G.entityQueries[W];if(F){let B=Y[W]??(Y[W]=[]);if(this._entityManager.getEntitiesWithQueryInto(B,F.with,F.without||[],F.changed,F.changed?this._changeThreshold:void 0,F.parentHas),B.length)Z=!0}}let Q=this._entityEnterTracking.get(G);if(Q&&G.onEntityEnter)for(let W in G.onEntityEnter){let F=Y[W],L=Q.get(W);if(!F||!L)continue;let B=G.onEntityEnter[W];if(!B)continue;let U=this._entityEnterFrameSet;U.clear();for(let O of F)if(U.add(O.id),!L.has(O.id))L.add(O.id),B({entity:O,ecs:this});for(let O of L)if(!U.has(O))L.delete(O)}if(G.process){if(this._diagnosticsEnabled){let W=performance.now();if(Z||G.runWhenEmpty)G.process(X);else if(!_)G.process(X);this._systemTimings.set(G.label,performance.now()-W)}else if(Z||G.runWhenEmpty)G.process(X);else if(!_)G.process(X)}this._systemLastSeqs.set(G,this._entityManager.changeSeq)}}_runPhase(j,D,$,G){if(G){let J=performance.now();this._executePhase(this._phaseSystems[j],D,$),this._phaseTimings[j]=performance.now()-J}else this._executePhase(this._phaseSystems[j],D,$);this._commandBuffer.playback(this)}async initialize(){if(this._finalizePendingBuilders(),await this.initializeResources(),this._assetManager)this._assetManager.setEventBus(this._eventBus),await this._assetManager.loadEagerAssets(),this._resourceManager.add("$assets",this._assetManager.createResource());if(this._screenManager)this._screenManager.setDependencies(this._eventBus,this._assetManager,this),this._resourceManager.add("$screen",this._screenManager.createResource());for(let j of this._systems)await j.onInitialize?.(this)}async initializeResources(...j){await this._resourceManager.initializeResources(this,...j)}_rebuildPhaseSystems(){for(let j of m)this._phaseSystems[j]=[];for(let j of this._systems){let D=j.phase??"update";this._phaseSystems[D].push(j)}for(let j of m)this._phaseSystems[j].sort((D,$)=>{let G=D.priority??0;return($.priority??0)-G})}updateSystemPriority(j,D){this._finalizePendingBuilders();let $=this._systems.find((G)=>G.label===j);if(!$)return!1;return $.priority=D,this._rebuildPhaseSystems(),!0}updateSystemPhase(j,D){this._finalizePendingBuilders();let $=this._systems.find((G)=>G.label===j);if(!$)return!1;return $.phase=D,this._rebuildPhaseSystems(),!0}get interpolationAlpha(){return this._interpolationAlpha}get fixedDt(){return this._fixedDt}disableSystemGroup(j){this._disabledGroups.add(j)}enableSystemGroup(j){this._disabledGroups.delete(j)}isSystemGroupEnabled(j){return!this._disabledGroups.has(j)}getSystemsInGroup(j){return this._finalizePendingBuilders(),this._systems.filter((D)=>D.groups?.includes(j)).map((D)=>D.label)}removeSystem(j){this._finalizePendingBuilders();let D=this._systems.findIndex((G)=>G.label===j);if(D===-1)return!1;let $=this._systems[D];if(!$)return!1;if($.onDetach)$.onDetach(this);return this._systems.splice(D,1),this._systemLastSeqs.delete($),this._entityEnterTracking.delete($),this._rebuildPhaseSystems(),!0}_registerSystem(j){if(this._systems.push(j),this._systemLastSeqs.set(j,this._changeThreshold),!this._batchingRegistrations)this._rebuildPhaseSystems();if(j.onEntityEnter){let D=new Map;for(let $ in j.onEntityEnter)D.set($,new Set);this._entityEnterTracking.set(j,D)}if(!j.eventHandlers)return;for(let D in j.eventHandlers){let $=j.eventHandlers[D];if($)this._eventBus.subscribe(D,(G)=>{$({data:G,ecs:this})})}}hasResource(j){return this._resourceManager.has(j)}getResource(j){if(!this._resourceManager.has(j))throw Error(`Resource '${String(j)}' not found. Available resources: [${this.getResourceKeys().map((D)=>String(D)).join(", ")}]`);return this._resourceManager.get(j,this)}tryGetResource(j){let D=j;if(!this._resourceManager.has(D))return;return this._resourceManager.get(D,this)}addResource(j,D){return this._resourceManager.add(j,D),this}removeResource(j){return this._resourceManager.remove(j)}async disposeResource(j){return this._resourceManager.disposeResource(j,this)}async disposeResources(){return this._resourceManager.disposeResources(this)}updateResource(j,D){let $=this.getResource(j),G=D($);return this._resourceManager.add(j,G),this._resourceManager.notifyChange(j,G,$),this}setResource(j,D){let $=this.tryGetResource(j);if(this._resourceManager.add(j,D),$!==void 0)this._resourceManager.notifyChange(j,D,$);return this}onResourceChange(j,D){return this._resourceManager.onResourceChange(j,D)}isResourceObserved(j){return this._resourceManager.isObserved(j)}getResourceKeys(){return this._resourceManager.getKeys()}resourceNeedsInitialization(j){return this._resourceManager.needsInitialization(j)}getEntity(j){return this._entityManager.getEntity(j)}getComponent(j,D){return this._entityManager.getComponent(j,D)}addComponent(j,D,$){this._entityManager.addComponent(j,D,$)}addComponents(j,D){this._entityManager.addComponents(j,D)}removeComponent(j,D){this._entityManager.removeComponent(j,D)}hasComponent(j,D){return this._entityManager.getComponent(j,D)!==void 0}spawn(j){let D=this._entityManager.createEntity();return this._entityManager.addComponents(D.id,j),D}getEntitiesWithQuery(j,D=[],$,G){return this._entityManager.getEntitiesWithQuery(j,D,$,$?this._changeThreshold:void 0,G)}getSingleton(j,D=[]){let $=this._entityManager.getEntitiesWithQuery(j,D);if($.length===0)throw Error(`getSingleton: no entity matches query with=[${String(j)}] without=[${String(D)}]`);if($.length>1)throw Error(`getSingleton: expected 1 entity but found ${$.length} matching query with=[${String(j)}] without=[${String(D)}]`);let G=$[0];if(!G)throw Error("getSingleton: unexpected empty result");return G}tryGetSingleton(j,D=[]){let $=this._entityManager.getEntitiesWithQuery(j,D);if($.length===0)return;if($.length>1)throw Error(`tryGetSingleton: expected 0 or 1 entity but found ${$.length} matching query with=[${String(j)}] without=[${String(D)}]`);return $[0]}removeEntity(j,D){return this._entityManager.removeEntity(j,D)}spawnChild(j,D){let $=this._entityManager.spawnChild(j,D);return this._emitHierarchyChanged($.id,null,j),$}setParent(j,D){let $=this._entityManager.getParent(j);return this._entityManager.setParent(j,D),this._emitHierarchyChanged(j,$,D),this}removeParent(j){let D=this._entityManager.getParent(j),$=this._entityManager.removeParent(j);if($)this._emitHierarchyChanged(j,D,null);return $}getParent(j){return this._entityManager.getParent(j)}getChildren(j){return this._entityManager.getChildren(j)}getChildAt(j,D){return this._entityManager.getChildAt(j,D)}getChildIndex(j,D){return this._entityManager.getChildIndex(j,D)}getAncestors(j){return this._entityManager.getAncestors(j)}getDescendants(j){return this._entityManager.getDescendants(j)}getRoot(j){return this._entityManager.getRoot(j)}getSiblings(j){return this._entityManager.getSiblings(j)}isDescendantOf(j,D){return this._entityManager.isDescendantOf(j,D)}isAncestorOf(j,D){return this._entityManager.isAncestorOf(j,D)}getRootEntities(){return this._entityManager.getRootEntities()}forEachInHierarchy(j,D){this._entityManager.forEachInHierarchy(j,D)}hierarchyIterator(j){return this._entityManager.hierarchyIterator(j)}_emitHierarchyChanged(j,D,$){this._eventBus.publish("hierarchyChanged",{entityId:j,oldParent:D,newParent:$})}get installedPlugins(){return Array.from(this._installedPlugins)}get entityManager(){return this._entityManager}get eventBus(){return this._finalizePendingBuilders(),this._eventBus}get commands(){return this._commandBuffer}get currentTick(){return this._currentTick}get changeThreshold(){return this._changeThreshold}enableDiagnostics(j){if(this._diagnosticsEnabled=j,!j)this._systemTimings.clear(),this._phaseTimings={preUpdate:0,fixedUpdate:0,update:0,postUpdate:0,render:0}}get diagnosticsEnabled(){return this._diagnosticsEnabled}get systemTimings(){return this._systemTimings}get phaseTimings(){return this._phaseTimings}get entityCount(){return this._entityManager.entityCount}mutateComponent(j,D,$){let G=this._entityManager.getComponent(j,D);if(G===void 0)throw Error(`Entity ${j} does not have component "${String(D)}"`);return $(G),this._entityManager.markChanged(j,D),G}markChanged(j,D){this._entityManager.markChanged(j,D)}registerDispose(j,D){this._entityManager.registerDispose(j,D)}registerRequired(j,D,$){if(String(j)===String(D))throw Error(`Cannot require a component to depend on itself: '${String(j)}'`);let G=this._requiredComponents.get(j)??[];if(G.some((J)=>J.component===D))throw Error(`Required component '${String(D)}' already registered for trigger '${String(j)}'`);this._checkRequiredCycle(j,D),G.push({component:D,factory:$}),this._requiredComponents.set(j,G)}_checkRequiredCycle(j,D){k(j,D,($)=>this._requiredComponents.get($))}onComponentAdded(j,D){return this._entityManager.onComponentAdded(j,D)}onComponentRemoved(j,D){return this._entityManager.onComponentRemoved(j,D)}addReactiveQuery(j,D){this._reactiveQueryManager.addQuery(j,D)}removeReactiveQuery(j){return this._reactiveQueryManager.removeQuery(j)}on(j,D){return this._eventBus.subscribe(j,D)}off(j,D){return this._eventBus.unsubscribe(j,D)}onPostUpdate(j){return this._postUpdateHooks.push(j),()=>{let D=this._postUpdateHooks.indexOf(j);if(D!==-1)this._postUpdateHooks.splice(D,1)}}requireAssetManager(){if(!this._assetManager)throw Error("Asset manager not configured. Use withAssets() in builder.");return this._assetManager}getAsset(j){return this.requireAssetManager().get(j)}tryGetAsset(j){return this._assetManager?.tryGet(j)}getAssetHandle(j){return this.requireAssetManager().getHandle(j)}isAssetLoaded(j){return this._assetManager?.isLoaded(j)??!1}async loadAsset(j){return this.requireAssetManager().loadAsset(j)}async loadAssetGroup(j){return this.requireAssetManager().loadAssetGroup(j)}isAssetGroupLoaded(j){return this._assetManager?.isGroupLoaded(j)??!1}getAssetGroupProgress(j){return this._assetManager?.getGroupProgress(j)??0}requireScreenManager(){if(!this._screenManager)throw Error("Screen manager not configured. Use withScreens() in builder.");return this._screenManager}async setScreen(j,D){return this.requireScreenManager().setScreen(j,D)}async pushScreen(j,D){return this.requireScreenManager().pushScreen(j,D)}async popScreen(){return this.requireScreenManager().popScreen()}getCurrentScreen(){return this._screenManager?.getCurrentScreen()??null}getScreenConfig(j){return this.requireScreenManager().getConfig(j)}tryGetScreenConfig(j){return this._screenManager?.tryGetConfig(j)??void 0}getScreenState(j){return this.requireScreenManager().getState(j)}tryGetScreenState(j){return this._screenManager?.tryGetState(j)??void 0}updateScreenState(j,D){if(typeof j==="string")this.requireScreenManager().updateState(D,j);else this.requireScreenManager().updateState(j)}isCurrentScreen(j){return this._screenManager?.isCurrent(j)??!1}isScreenActive(j){return this._screenManager?.isActive(j)??!1}getScreenStackDepth(){return this._screenManager?.getStackDepth()??0}_setAssetManager(j){this._assetManager=j;for(let[D,$]of this._pendingPluginAssets)this._assetManager.register(D,$);this._pendingPluginAssets=[]}_setScreenManager(j){this._screenManager=j;for(let[D,$]of this._pendingPluginScreens)this._screenManager.register(D,$);this._pendingPluginScreens=[]}_hasPendingPluginAssets(){return this._pendingPluginAssets.length>0}_hasPendingPluginScreens(){return this._pendingPluginScreens.length>0}_setFixedDt(j){this._fixedDt=j}_registerAsset(j,D){this._pendingPluginAssets.push([j,D])}_registerScreen(j,D){this._pendingPluginScreens.push([j,D])}installPlugin(j){return this._installPluginUnchecked(j)}_installPluginUnchecked(j){if(this._installedPlugins.has(j.id))return this;return this._installedPlugins.add(j.id),j.install(this),this}pluginFactory(){return(j)=>M(j.id).install(j.install)}getHelpers(j){return j(this)}}function Tj(j){return j}function Cj(j,D){return{x:j,y:D}}function qj(){return{x:0,y:0}}function fj(j,D){return{x:j.x+D.x,y:j.y+D.y}}function gj(j,D){return{x:j.x-D.x,y:j.y-D.y}}function vj(j,D){return{x:j.x*D,y:j.y*D}}function Nj(j){return{x:-j.x,y:-j.y}}function pj(j,D){return j.x*D.x+j.y*D.y}function bj(j,D){return j.x*D.y-j.y*D.x}function hj(j){return j.x*j.x+j.y*j.y}function kj(j){return Math.sqrt(j.x*j.x+j.y*j.y)}function Ij(j){let D=Math.sqrt(j.x*j.x+j.y*j.y);if(D===0)return{x:0,y:0};return{x:j.x/D,y:j.y/D}}function uj(j,D){let $=j.x-D.x,G=j.y-D.y;return $*$+G*G}function sj(j,D){let $=j.x-D.x,G=j.y-D.y;return Math.sqrt($*$+G*G)}function mj(j,D,$=0.0000000001){return Math.abs(j.x-D.x)<=$&&Math.abs(j.y-D.y)<=$}function ij(j,D,$){return{x:j,y:D,z:$}}function lj(){return{x:0,y:0,z:0}}function cj(j,D){return{x:j.x+D.x,y:j.y+D.y,z:j.z+D.z}}function dj(j,D){return{x:j.x-D.x,y:j.y-D.y,z:j.z-D.z}}function yj(j,D){return{x:j.x*D,y:j.y*D,z:j.z*D}}function oj(j){return{x:-j.x,y:-j.y,z:-j.z}}function rj(j,D){return j.x*D.x+j.y*D.y+j.z*D.z}function aj(j,D){return{x:j.y*D.z-j.z*D.y,y:j.z*D.x-j.x*D.z,z:j.x*D.y-j.y*D.x}}function tj(j){return j.x*j.x+j.y*j.y+j.z*j.z}function nj(j){return Math.sqrt(j.x*j.x+j.y*j.y+j.z*j.z)}function ej(j){let D=Math.sqrt(j.x*j.x+j.y*j.y+j.z*j.z);if(D===0)return{x:0,y:0,z:0};return{x:j.x/D,y:j.y/D,z:j.z/D}}function j3(j,D){let $=j.x-D.x,G=j.y-D.y,J=j.z-D.z;return $*$+G*G+J*J}function D3(j,D){let $=j.x-D.x,G=j.y-D.y,J=j.z-D.z;return Math.sqrt($*$+G*G+J*J)}function $3(j,D,$=0.0000000001){return Math.abs(j.x-D.x)<=$&&Math.abs(j.y-D.y)<=$&&Math.abs(j.z-D.z)<=$}var U3=P;export{lj as vec3Zero,dj as vec3Sub,yj as vec3Scale,ej as vec3Normalize,oj as vec3Negate,tj as vec3LengthSq,nj as vec3Length,$3 as vec3Equals,rj as vec3Dot,j3 as vec3DistanceSq,D3 as vec3Distance,aj as vec3Cross,cj as vec3Add,ij as vec3,qj as vec2Zero,gj as vec2Sub,vj as vec2Scale,Ij as vec2Normalize,Nj as vec2Negate,hj as vec2LengthSq,kj as vec2Length,mj as vec2Equals,pj as vec2Dot,uj as vec2DistanceSq,sj as vec2Distance,bj as vec2Cross,fj as vec2Add,Cj as vec2,i as directValue,M as definePlugin,U3 as default,f as createScreenConfigurator,Tj as createQueryDefinition,q as createAssetConfigurator,S as SystemBuilder,A as ScreenManager,K as AssetManager};
1
+ var o=((j)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(j,{get:(D,$)=>(typeof require<"u"?require:D)[$]}):j)(function(j){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+j+'" is not supported')});class H{parentMap=new Map;childrenMap=new Map;_bfsQueue=[];setParent(j,D){if(j===D)throw Error(`Cannot set entity ${j} as its own parent`);if(this.wouldCreateCycle(j,D))throw Error("Cannot set parent: would create circular reference");let $=this.parentMap.get(j);if($!==void 0){let J=this.childrenMap.get($);if(J){let X=J.indexOf(j);if(X!==-1)J.splice(X,1)}}this.parentMap.set(j,D);let G=this.childrenMap.get(D);if(G)G.push(j);else this.childrenMap.set(D,[j]);return this}removeParent(j){let D=this.parentMap.get(j);if(D===void 0)return!1;let $=this.childrenMap.get(D);if($){let G=$.indexOf(j);if(G!==-1)$.splice(G,1)}return this.parentMap.delete(j),!0}getParent(j){return this.parentMap.get(j)??null}getChildren(j){let D=this.childrenMap.get(j);return D?[...D]:[]}getChildAt(j,D){if(D<0)return null;let $=this.childrenMap.get(j);if(!$||D>=$.length)return null;return $[D]??null}getChildIndex(j,D){let $=this.childrenMap.get(j);if(!$)return-1;return $.indexOf(D)}removeEntity(j){let D=this.parentMap.get(j)??null;if(D!==null){let J=this.childrenMap.get(D);if(J){let X=J.indexOf(j);if(X!==-1)J.splice(X,1)}}this.parentMap.delete(j);let $=this.childrenMap.get(j)??[],G=[...$];for(let J of $)this.parentMap.delete(J);return this.childrenMap.delete(j),{oldParent:D,orphanedChildren:G}}getAncestors(j){let D=[],$=this.parentMap.get(j);while($!==void 0)D.push($),$=this.parentMap.get($);return D}getDescendants(j){let D=[],$=this.childrenMap.get(j);if(!$)return D;let G=$.slice().reverse();while(G.length>0){let J=G.pop();D.push(J);let X=this.childrenMap.get(J);if(X)for(let Y=X.length-1;Y>=0;Y--)G.push(X[Y])}return D}getRoot(j){let D=j,$=this.parentMap.get(D);while($!==void 0)D=$,$=this.parentMap.get(D);return D}getSiblings(j){let D=this.parentMap.get(j);if(D===void 0)return[];let $=this.childrenMap.get(D);if(!$)return[];return $.filter((G)=>G!==j)}isDescendantOf(j,D){if(j===D)return!1;let $=this.parentMap.get(j);while($!==void 0){if($===D)return!0;$=this.parentMap.get($)}return!1}isAncestorOf(j,D){return this.isDescendantOf(D,j)}get hasHierarchy(){return this.childrenMap.size>0}getRootEntities(){let j=[];for(let D of this.childrenMap.keys())if(!this.parentMap.has(D))j.push(D);return j}wouldCreateCycle(j,D){let $=D;while($!==void 0){if($===j)return!0;$=this.parentMap.get($)}return!1}forEachInHierarchy(j,D){let $=D?.roots??this.getRootEntities(),G=this._bfsQueue;G.length=0;for(let J of $)G.push(J,-1,0);for(let J=0;J<G.length;J+=3){let X=G[J],Y=G[J+1],Z=G[J+2];j(X,Y===-1?null:Y,Z);let _=this.childrenMap.get(X);if(_){let Q=Z+1;for(let W of _)G.push(W,X,Q)}}}*hierarchyIterator(j){let D=j?.roots??this.getRootEntities(),$=[];for(let G of D)$.push({entityId:G,parentId:null,depth:0});for(let G of $){yield G;let J=this.childrenMap.get(G.entityId);if(J)for(let X of J)$.push({entityId:X,parentId:G.entityId,depth:G.depth+1})}}}function v(j,D){for(let $ of D)if(!($ in j))return!1;return!0}function N(j,D){for(let $ of D)if($ in j)return!0;return!1}function p(j,D,$){if(!j)return!1;for(let G of D)if((j.get(G)??-1)>$)return!0;return!1}class T{callbacks=[];_iterDepth=0;_pendingRemovals=[];add(j){this.callbacks.push(j)}remove(j){if(this._iterDepth>0){this._pendingRemovals.push(j);return}let D=this.callbacks.indexOf(j);if(D!==-1)this.callbacks.splice(D,1)}invoke(j){this._iterDepth++;let D=this.callbacks.length;for(let $=0;$<D;$++){let G=this.callbacks[$];if(G)G(j)}if(this._iterDepth--,this._iterDepth===0&&this._pendingRemovals.length>0){for(let $ of this._pendingRemovals){let G=this.callbacks.indexOf($);if(G!==-1)this.callbacks.splice(G,1)}this._pendingRemovals.length=0}}}class z{nextId=1;entities=new Map;componentIndices=new Map;addedCallbacks=new Map;removedCallbacks=new Map;hierarchyManager=new H;disposeCallbacks=new Map;changeSeqs=new Map;_changeSeq=0;_afterComponentAddedHooks=[];_afterEntityMutatedHooks=[];_afterComponentRemovedHooks=[];_beforeEntityRemovedHooks=[];_afterParentChangedHooks=[];_batchingDepth=0;_batchedEntityIds=new Set;_pendingBatchKeys=null;get entityCount(){return this.entities.size}createEntity(){let j=this.nextId++,D={id:j,components:{}};return this.entities.set(j,D),D}registerDispose(j,D){this.disposeCallbacks.set(j,D)}getDisposeCallbacks(){return this.disposeCallbacks}invokeDispose(j,D,$){let G=this.disposeCallbacks.get(j);if(!G)return;try{G({value:D,entityId:$})}catch(J){console.warn(`Component dispose callback for '${String(j)}' threw:`,J)}}addComponent(j,D,$){let G=this.entities.get(j);if(!G)throw Error(`Cannot add component '${String(D)}': Entity with ID ${j} does not exist`);let J=G.components[D];if(J!==void 0)this.invokeDispose(D,J,G.id);if(G.components[D]=$,!this.componentIndices.has(D))this.componentIndices.set(D,new Set);this.componentIndices.get(D)?.add(G.id);let X=this.addedCallbacks.get(D);if(X)X.invoke({value:$,entity:G});this._batchingDepth++;for(let Y of this._afterComponentAddedHooks)Y(G.id,D);if(this._batchedEntityIds.add(G.id),this._batchingDepth--,this._batchingDepth===0){for(let Y of this._batchedEntityIds)for(let Z of this._afterEntityMutatedHooks)Z(Y);this._batchedEntityIds.clear()}return this}addComponents(j,D){let $=this.entities.get(j);if(!$)throw Error(`Cannot add components: Entity with ID ${j} does not exist`);let G=this._pendingBatchKeys;this._pendingBatchKeys=new Set(Object.keys(D)),this._batchingDepth++;for(let J in D)this.addComponent($.id,J,D[J]);if(this._batchingDepth--,this._pendingBatchKeys=G,this._batchingDepth===0){for(let J of this._batchedEntityIds)for(let X of this._afterEntityMutatedHooks)X(J);this._batchedEntityIds.clear()}return this}removeComponent(j,D){let $=this.entities.get(j);if(!$)throw Error(`Cannot remove component '${String(D)}': Entity with ID ${j} does not exist`);let G=$.components[D];if(G!==void 0)this.invokeDispose(D,G,$.id);delete $.components[D];let J=this.removedCallbacks.get(D);if(J&&G!==void 0)J.invoke({value:G,entity:$});if(this.componentIndices.get(D)?.delete($.id),G!==void 0)for(let X of this._afterComponentRemovedHooks)X($.id,D);return this}getComponent(j,D){return this.entities.get(j)?.components[D]}getEntitiesWithQuery(j=[],D=[],$,G,J){return this.getEntitiesWithQueryInto([],j,D,$,G,J)}getEntitiesWithQueryInto(j,D=[],$=[],G,J,X){j.length=0;let Y=G!==void 0&&G.length>0&&J!==void 0,Z=X!==void 0&&X.length>0;if(D.length===0){if($.length===0&&!Y&&!Z){for(let L of this.entities.values())j.push(L);return j}for(let L of this.entities.values()){if($.length>0&&N(L.components,$))continue;if(Y&&!p(this.changeSeqs.get(L.id),G,J))continue;if(Z&&!this.parentHasComponents(L.id,X))continue;j.push(L)}return j}let _=D[0];if(_===void 0)return j;let Q=_,W=this.componentIndices.get(_)?.size??0;for(let L=1;L<D.length;L++){let B=D[L];if(B===void 0)continue;let U=this.componentIndices.get(B)?.size??0;if(U<W)Q=B,W=U}let F=this.componentIndices.get(Q);if(!F||F.size===0)return j;for(let L of F){let B=this.entities.get(L);if(!B)continue;if(!v(B.components,D))continue;if($.length>0&&N(B.components,$))continue;if(Y&&!p(this.changeSeqs.get(L),G,J))continue;if(Z&&!this.parentHasComponents(L,X))continue;j.push(B)}return j}parentHasComponents(j,D){let $=this.hierarchyManager.getParent(j);if($===null)return!1;let G=this.entities.get($);if(!G)return!1;return v(G.components,D)}removeEntity(j,D){let $=this.entities.get(j);if(!$)return!1;if(D?.cascade??!0){let J=this.hierarchyManager.getDescendants($.id);for(let X=J.length-1;X>=0;X--){let Y=J[X];if(Y===void 0)continue;for(let Z of this._beforeEntityRemovedHooks)Z(Y)}for(let X of this._beforeEntityRemovedHooks)X($.id);for(let X=J.length-1;X>=0;X--){let Y=J[X];if(Y===void 0)continue;this.removeEntityInternal(Y)}}else for(let J of this._beforeEntityRemovedHooks)J($.id);return this.removeEntityInternal($.id)}removeEntityInternal(j){let D=this.entities.get(j);if(!D)return!1;this.hierarchyManager.removeEntity(j);for(let $ of Object.keys(D.components)){let G=D.components[$];if(G!==void 0){this.invokeDispose($,G,D.id);let J=this.removedCallbacks.get($);if(J)J.invoke({value:G,entity:D})}this.componentIndices.get($)?.delete(D.id)}return this.changeSeqs.delete(D.id),this.entities.delete(D.id)}getEntity(j){return this.entities.get(j)}onComponentAdded(j,D){let $=D,G=this.addedCallbacks.get(j);if(!G)G=new T,this.addedCallbacks.set(j,G);return G.add($),()=>{this.addedCallbacks.get(j)?.remove($)}}onComponentRemoved(j,D){let $=D,G=this.removedCallbacks.get(j);if(!G)G=new T,this.removedCallbacks.set(j,G);return G.add($),()=>{this.removedCallbacks.get(j)?.remove($)}}onAfterComponentAdded(j){return this._afterComponentAddedHooks.push(j),()=>{let D=this._afterComponentAddedHooks.indexOf(j);if(D!==-1)this._afterComponentAddedHooks.splice(D,1)}}onAfterEntityMutated(j){return this._afterEntityMutatedHooks.push(j),()=>{let D=this._afterEntityMutatedHooks.indexOf(j);if(D!==-1)this._afterEntityMutatedHooks.splice(D,1)}}onAfterComponentRemoved(j){return this._afterComponentRemovedHooks.push(j),()=>{let D=this._afterComponentRemovedHooks.indexOf(j);if(D!==-1)this._afterComponentRemovedHooks.splice(D,1)}}onBeforeEntityRemoved(j){return this._beforeEntityRemovedHooks.push(j),()=>{let D=this._beforeEntityRemovedHooks.indexOf(j);if(D!==-1)this._beforeEntityRemovedHooks.splice(D,1)}}onAfterParentChanged(j){return this._afterParentChangedHooks.push(j),()=>{let D=this._afterParentChangedHooks.indexOf(j);if(D!==-1)this._afterParentChangedHooks.splice(D,1)}}get changeSeq(){return this._changeSeq}markChanged(j,D){let $=++this._changeSeq,G=this.changeSeqs.get(j);if(!G)G=new Map,this.changeSeqs.set(j,G);G.set(D,$)}getChangeSeq(j,D){return this.changeSeqs.get(j)?.get(D)??-1}spawnChild(j,D){let $=this.createEntity();return this.addComponents($.id,D),this.setParent($.id,j),$}setParent(j,D){this.hierarchyManager.setParent(j,D);for(let $ of this._afterParentChangedHooks)$(j);return this}removeParent(j){let D=this.hierarchyManager.removeParent(j);if(D)for(let $ of this._afterParentChangedHooks)$(j);return D}getParent(j){return this.hierarchyManager.getParent(j)}getChildren(j){return this.hierarchyManager.getChildren(j)}getChildAt(j,D){return this.hierarchyManager.getChildAt(j,D)}getChildIndex(j,D){return this.hierarchyManager.getChildIndex(j,D)}getAncestors(j){return this.hierarchyManager.getAncestors(j)}getDescendants(j){return this.hierarchyManager.getDescendants(j)}getRoot(j){return this.hierarchyManager.getRoot(j)}getSiblings(j){return this.hierarchyManager.getSiblings(j)}isDescendantOf(j,D){return this.hierarchyManager.isDescendantOf(j,D)}isAncestorOf(j,D){return this.hierarchyManager.isAncestorOf(j,D)}get hasHierarchy(){return this.hierarchyManager.hasHierarchy}getRootEntities(){return this.hierarchyManager.getRootEntities()}forEachInHierarchy(j,D){this.hierarchyManager.forEachInHierarchy(j,D)}hierarchyIterator(j){return this.hierarchyManager.hierarchyIterator(j)}}class V{handlers=new Map;subscribe(j,D){return this.addHandler(j,D,!1)}once(j,D){return this.addHandler(j,D,!0)}unsubscribe(j,D){let $=this.handlers.get(j);if(!$)return!1;let G=$.findIndex((J)=>J.callback===D);if(G===-1)return!1;return $.splice(G,1),!0}addHandler(j,D,$){let G=this.handlers.get(j);if(!G)G=[],this.handlers.set(j,G);let J={callback:D,once:$};return G.push(J),()=>{let X=this.handlers.get(j);if(X){let Y=X.indexOf(J);if(Y!==-1)X.splice(Y,1)}}}publish(...[j,D]){let $=this.handlers.get(j);if(!$||$.length===0)return;let G=!1,J=$.length;for(let X=0;X<J&&X<$.length;X++){let Y=$[X];if(!Y)continue;if(Y.callback(D),Y.once)G=!0}if(G){for(let X=$.length-1;X>=0;X--)if($[X]?.once)$.splice(X,1)}}clear(){this.handlers.clear()}clearEvent(j){this.handlers.delete(j)}}var C=Symbol("resource-direct");function i(j){return{[C]:j}}function x(j){if(typeof j==="object"&&j!==null&&!Array.isArray(j))return{...j};return{$value:j}}function l(j,D){if(typeof j==="object"&&j!==null&&!Array.isArray(j)){let $=j;for(let G in D)if(!Object.is($[G],D[G]))return!0;return!1}return!Object.is(j,D.$value)}function c(j){return typeof j==="object"&&j!==null&&"factory"in j&&typeof j.factory==="function"}function d(j){return typeof j==="object"&&j!==null&&C in j}function b(j,D){let $=[],G=new Set,J=new Set;function X(Y,Z=[]){if(G.has(Y))return;if(J.has(Y))throw Error(`Circular resource dependency: ${[...Z,Y].join(" -> ")}`);J.add(Y);for(let _ of D(Y)){let Q=j.find((W)=>W===_);if(Q)X(Q,[...Z,Y])}J.delete(Y),G.add(Y),$.push(Y)}for(let Y of j)X(Y);return $}class E{resources=new Map;resourceFactories=new Map;resourceDependencies=new Map;resourceDisposers=new Map;initializedResourceKeys=new Set;_changeSubscribers=new Map;_observedSnapshots=new Map;add(j,D){let $=(G)=>{this.resources.set(j,G),this.initializedResourceKeys.add(j),this.resourceDependencies.set(j,[])};if(c(D)){if(this.resourceFactories.set(j,D.factory),this.resourceDependencies.set(j,D.dependsOn??[]),D.onDispose)this.resourceDisposers.set(j,D.onDispose)}else if(d(D))$(D[C]);else if(typeof D==="function")this.resourceFactories.set(j,D),this.resourceDependencies.set(j,[]);else $(D);return this}tryGet(j,...D){if(!this.has(j))return;return this.get(j,...D)}get(j,...D){let $=this.resources.get(j);if($!==void 0)return $;let G=this.resourceFactories.get(j);if(G===void 0)throw Error(`Resource ${String(j)} not found`);let J=D[0],X=G(J);if(!(X instanceof Promise))this.resources.set(j,X),this.initializedResourceKeys.add(j);return X}has(j){return this.resources.has(j)||this.resourceFactories.has(j)}remove(j){let D=this.resources.delete(j),$=this.resourceFactories.delete(j);return this.resourceDependencies.delete(j),this.resourceDisposers.delete(j),this.initializedResourceKeys.delete(j),D||$}getKeys(){let j=new Set([...this.resources.keys(),...this.resourceFactories.keys()]);return Array.from(j)}needsInitialization(j){return this.resourceFactories.has(j)&&!this.initializedResourceKeys.has(j)}getPendingInitializationKeys(){return Array.from(this.resourceFactories.keys()).filter((j)=>!this.initializedResourceKeys.has(j))}async initializeResource(j,...D){if(!this.resourceFactories.has(j)||this.initializedResourceKeys.has(j))return;let $=this.resourceFactories.get(j);if(!$)return;let G=D[0],J=await $(G);this.resources.set(j,J),this.initializedResourceKeys.add(j),this.resourceFactories.delete(j)}async initializeResources(...j){let D=j.slice(1),$=D.length===0?this.getPendingInitializationKeys():D;if($.length===0)return;let G=b($,(J)=>[...this.resourceDependencies.get(J)??[]]);for(let J of G)await this.initializeResource(J,...j.slice(0,1))}getDependencies(j){return this.resourceDependencies.get(j)??[]}async disposeResource(j,...D){if(!this.resources.has(j)&&!this.resourceFactories.has(j))return!1;if(this.initializedResourceKeys.has(j)){let $=this.resourceDisposers.get(j),G=this.resources.get(j);if($&&G!==void 0){let J=D[0];await $(G,J)}}return this.resources.delete(j),this.resourceFactories.delete(j),this.resourceDependencies.delete(j),this.resourceDisposers.delete(j),this.initializedResourceKeys.delete(j),this._changeSubscribers.delete(j),!0}onResourceChange(j,D){let $=this._changeSubscribers.get(j),G=$??new Set;if(!$){this._changeSubscribers.set(j,G);let X=this.resources.get(j);this._observedSnapshots.set(j,x(X))}let J=D;return G.add(J),()=>{if(G.delete(J),G.size===0)this._changeSubscribers.delete(j),this._observedSnapshots.delete(j)}}notifyChange(j,D,$){if(Object.is(D,$))return;let G=this._changeSubscribers.get(j);if(!G||G.size===0)return;if(this._observedSnapshots.has(j))this._observedSnapshots.set(j,x(D));let J=[...G];for(let X of J)X(D,$)}isObserved(j){return this._observedSnapshots.has(j)}flushObserved(){if(this._observedSnapshots.size===0)return;for(let[j,D]of this._observedSnapshots){let $=this.resources.get(j);if(!l($,D))continue;let G="$value"in D?D.$value:D,J=x($),X=this._changeSubscribers.get(j);for(let Y of X)Y($,G);this._observedSnapshots.set(j,J)}}async disposeResources(...j){let D=Array.from(this.initializedResourceKeys);if(D.length===0)return;let $=b(D,(G)=>[...this.resourceDependencies.get(G)??[]]).reverse();for(let G of $)await this.disposeResource(G,...j)}}class R{queries=new Map;entityManager;_hasParentHasQueries=!1;constructor(j){this.entityManager=j}get hasParentHasQueries(){return this._hasParentHasQueries}addQuery(j,D){let $={definition:D,matchingEntities:new Set};if(this.queries.set(j,$),D.parentHas?.length)this._hasParentHasQueries=!0;let G=this.entityManager.getEntitiesWithQuery(D.with,D.without??[]);for(let J of G)if(this.entityMatchesQuery(J,$.definition))$.matchingEntities.add(J.id),$.definition.onEnter?.(J)}removeQuery(j){let D=this.queries.delete(j);if(D)this._recalcParentHasFlag();return D}entityMatchesQuery(j,D){for(let $ of D.with)if(!($ in j.components))return!1;if(D.without){for(let $ of D.without)if($ in j.components)return!1}if(D.parentHas?.length){let $=this.entityManager.getParent(j.id);if($===null)return!1;let G=this.entityManager.getEntity($);if(!G)return!1;for(let J of D.parentHas)if(!(J in G.components))return!1}return!0}_applyQueryTransition(j,D){let $=D.matchingEntities.has(j.id),G=this.entityMatchesQuery(j,D.definition);if(!$&&G)D.matchingEntities.add(j.id),D.definition.onEnter?.(j);else if($&&!G)D.matchingEntities.delete(j.id),D.definition.onExit?.(j.id)}onComponentAdded(j,D){for(let[,$]of this.queries)this._applyQueryTransition(j,$);if(this._hasParentHasQueries)this._recheckChildren(j.id)}onComponentRemoved(j,D){for(let[,$]of this.queries)this._applyQueryTransition(j,$);if(this._hasParentHasQueries)this._recheckChildren(j.id)}onEntityRemoved(j){for(let[D,$]of this.queries)if($.matchingEntities.has(j))$.matchingEntities.delete(j),$.definition.onExit?.(j)}recheckEntity(j){for(let[,D]of this.queries)this._applyQueryTransition(j,D)}recheckEntityAndChildren(j){if(this.recheckEntity(j),this._hasParentHasQueries)this._recheckChildren(j.id)}_recheckChildren(j){let D=this.entityManager.getChildren(j);for(let $ of D){let G=this.entityManager.getEntity($);if(G)this.recheckEntity(G)}}_recalcParentHasFlag(){this._hasParentHasQueries=!1;for(let[,j]of this.queries)if(j.definition.parentHas?.length){this._hasParentHasQueries=!0;return}}}class w{commands=[];removeEntity(j,D){this.commands.push(($)=>{$.removeEntity(j,D)})}addComponent(j,D,$){this.commands.push((G)=>{G.addComponent(j,D,$)})}removeComponent(j,D){this.commands.push(($)=>{$.removeComponent(j,D)})}spawn(j){this.commands.push((D)=>{D.spawn(j)})}spawnChild(j,D){this.commands.push(($)=>{$.spawnChild(j,D)})}addComponents(j,D){this.commands.push(($)=>{$.addComponents(j,D)})}setParent(j,D){this.commands.push(($)=>{$.setParent(j,D)})}mutateComponent(j,D,$){this.commands.push((G)=>{G.mutateComponent(j,D,$)})}markChanged(j,D){this.commands.push(($)=>{$.markChanged(j,D)})}removeParent(j){this.commands.push((D)=>{D.removeParent(j)})}playback(j){for(let D of this.commands)try{D(j)}catch($){console.warn("CommandBuffer: Command failed during playback:",$)}this.commands.length=0}clear(){this.commands.length=0}get length(){return this.commands.length}}class h{_id;constructor(j){this._id=j}withComponentTypes(){return this}withEventTypes(){return this}withResourceTypes(){return this}withAssetTypes(){return this}withScreenTypes(){return this}withLabels(){return this}withGroups(){return this}withAssetGroupNames(){return this}withReactiveQueryNames(){return this}requires(){return this}install(j){return{id:this._id,install:j}}}function M(j){return new h(j)}class S{_label;queries={};processFunction;detachFunction;initializeFunction;eventHandlers;_priority=0;_phase="update";_groups=[];_inScreens;_excludeScreens;_requiredAssets;_runWhenEmpty=!1;_entityEnterHandlers={};_resourceKeys;constructor(j){this._label=j}get label(){return this._label}_createSystemObject(){let j={label:this._label,entityQueries:this.queries,priority:this._priority,phase:this._phase};if(this.processFunction)j.process=this.processFunction;if(this.detachFunction)j.onDetach=this.detachFunction;if(this.initializeFunction)j.onInitialize=this.initializeFunction;if(this.eventHandlers)j.eventHandlers=this.eventHandlers;if(this._groups.length>0)j.groups=[...this._groups];if(this._inScreens)j.inScreens=this._inScreens;if(this._excludeScreens)j.excludeScreens=this._excludeScreens;if(this._requiredAssets)j.requiredAssets=this._requiredAssets;if(this._runWhenEmpty)j.runWhenEmpty=!0;if(Object.keys(this._entityEnterHandlers).length>0)j.onEntityEnter={...this._entityEnterHandlers};return j}setPriority(j){return this._priority=j,this}inPhase(j){return this._phase=j,this}inGroup(j){if(!this._groups.includes(j))this._groups.push(j);return this}inScreens(j){return this._inScreens=[...j],this}excludeScreens(j){return this._excludeScreens=[...j],this}requiresAssets(j){return this._requiredAssets=[...j],this}runWhenEmpty(){return this._runWhenEmpty=!0,this}withResources(j){return this._resourceKeys=[...j],this}addQuery(j,D){let $=this;return $.queries={...this.queries,[j]:D},$}setProcess(j){return this.processFunction=this._wrapWithResources(j),this}_wrapWithResources(j){if(!this._resourceKeys?.length)return j;let D=this._resourceKeys,$={},G=!1;return(J)=>{for(let X of D)if(!G||J.ecs.isResourceObserved(X))$[X]=J.ecs.getResource(X);G=!0,J.resources=$,j(J)}}setProcessEach(j,D){let $=this;if(Object.keys($.queries).length>0||$.processFunction!==void 0)throw Error("setProcessEach requires a SystemBuilder with no prior queries or process function. Use addQuery + setProcess for multi-query systems.");$.queries.__each=j;let G={entity:void 0,dt:0,ecs:void 0,resources:void 0},J=(X)=>{let Y=X,Z=Y.queries.__each;if(!Z)return;G.dt=Y.dt,G.ecs=Y.ecs,G.resources=Y.resources;for(let _ of Z)G.entity=_,D(G)};return $.processFunction=$._wrapWithResources(J),this}setOnEntityEnter(j,D){return this._entityEnterHandlers[j]=D,this}setOnDetach(j){return this.detachFunction=j,this}setOnInitialize(j){return this.initializeFunction=j,this}setEventHandlers(j){return this.eventHandlers=j,this}}function k(j,D,$){let G=new Set,J=[D];while(J.length>0){let X=J.pop();if(X===void 0)break;if(X===j)throw Error(`Circular required component dependency: '${String(j)}' -> '${String(D)}' -> ... -> '${String(j)}'`);if(G.has(X))continue;G.add(X);let Y=$(X);if(Y)for(let Z of Y)J.push(Z.component)}}var I="0.14.9";class K{assets=new Map;groups=new Map;eventBus=null;setEventBus(j){this.eventBus=j}register(j,D){if(this.assets.set(j,{definition:D,status:"pending"}),D.group){let $=this.groups.get(D.group)??new Set;$.add(j),this.groups.set(D.group,$)}}async loadEagerAssets(){let j=[];for(let[D,$]of this.assets)if($.definition.eager&&$.status==="pending")j.push(D);await Promise.all(j.map((D)=>this.loadAsset(D)))}async loadAsset(j){let D=this.assets.get(j);if(!D)throw Error(`Asset '${String(j)}' not found`);if(D.status==="loaded"&&D.value!==void 0)return D.value;if(D.status==="loading"&&D.loadPromise)return D.loadPromise;if(D.status==="failed")D.status="pending";D.status="loading",D.loadPromise=D.definition.loader();try{let $=await D.loadPromise;return D.value=$,D.status="loaded",D.loadPromise=void 0,this.eventBus?.publish("assetLoaded",{key:j}),this.checkGroupProgress(D.definition.group),$}catch($){let G=$ instanceof Error?$:Error(String($));throw D.status="failed",D.error=G,D.loadPromise=void 0,this.eventBus?.publish("assetFailed",{key:j,error:G}),G}}async loadAssetGroup(j){let D=this.groups.get(j);if(!D||D.size===0)throw Error(`Asset group '${j}' not found or empty`);await Promise.all(Array.from(D).map(($)=>this.loadAsset($)))}get(j){let D=this.assets.get(j);if(!D)throw Error(`Asset '${String(j)}' not found`);if(D.status!=="loaded"||D.value===void 0)throw Error(`Asset '${String(j)}' is not loaded (status: ${D.status})`);return D.value}tryGet(j){let D=this.assets.get(j);if(!D||D.status!=="loaded")return;return D.value}getHandle(j){let D=this.assets.get(j);if(!D)throw Error(`Asset '${String(j)}' not found`);let $=this;return{get status(){return D.status},get isLoaded(){return D.status==="loaded"},get(){return $.get(j)},tryGet(){return $.tryGet(j)}}}getStatus(j){let D=this.assets.get(j);if(!D)throw Error(`Asset '${String(j)}' not found`);return D.status}isLoaded(j){return this.assets.get(j)?.status==="loaded"}isGroupLoaded(j){let D=this.groups.get(j);if(!D||D.size===0)return!1;for(let $ of D){let G=this.assets.get($);if(!G||G.status!=="loaded")return!1}return!0}getGroupProgress(j){return this.getGroupProgressDetails(j).progress}getGroupProgressDetails(j){let D=this.groups.get(j);if(!D||D.size===0)return{loaded:0,total:0,progress:0};let $=0;for(let J of D)if(this.assets.get(J)?.status==="loaded")$++;let G=D.size;return{loaded:$,total:G,progress:$/G}}checkGroupProgress(j){if(!j||!this.eventBus)return;let D=j,$=this.getGroupProgressDetails(D);if(this.eventBus.publish("assetGroupProgress",{group:D,...$}),$.loaded===$.total)this.eventBus.publish("assetGroupLoaded",{group:D})}createResource(){let j=this;return{getStatus(D){return j.getStatus(D)},isLoaded(D){return j.isLoaded(D)},isGroupLoaded(D){return j.isGroupLoaded(D)},getGroupProgress(D){return j.getGroupProgress(D)},get(D){return j.get(D)},tryGet(D){return j.tryGet(D)},getHandle(D){return j.getHandle(D)}}}getKeys(){return Array.from(this.assets.keys())}getGroupNames(){return Array.from(this.groups.keys())}getGroupKeys(j){let D=this.groups.get(j);return D?Array.from(D):[]}}class u{manager;constructor(j){this.manager=j}add(j,D){return this.manager.register(j,{loader:D,eager:!0}),this}addWithConfig(j,D){return this.manager.register(j,D),this}addGroup(j,D){for(let[$,G]of Object.entries(D))this.manager.register($,{loader:G,eager:!1,group:j});return this}getManager(){return this.manager}}function q(j){return new u(j??new K)}class A{screens=new Map;currentScreen=null;screenStack=[];eventBus=null;assetManager=null;ecs=null;setDependencies(j,D,$){this.eventBus=j,this.assetManager=D,this.ecs=$}requireEcs(){if(!this.ecs)throw Error("ScreenManager: dependencies not set. Call setDependencies() first.");return this.ecs}register(j,D){this.screens.set(j,{definition:D})}async setScreen(j,D){let $=this.screens.get(j);if(!$)throw Error(`Screen '${String(j)}' not found`);await this.verifyRequiredAssets($.definition.requiredAssets,$.definition.requiredAssetGroups);while(this.screenStack.length>0){let J=this.screenStack.pop();if(J)await this.exitScreen(J.name)}if(this.currentScreen)await this.exitScreen(this.currentScreen.name);let G=$.definition.initialState(D);this.currentScreen={name:j,config:D,state:G},await $.definition.onEnter?.({config:D,ecs:this.requireEcs()}),this.eventBus?.publish("screenEnter",{screen:j,config:D})}async pushScreen(j,D){let $=this.screens.get(j);if(!$)throw Error(`Screen '${String(j)}' not found`);if(await this.verifyRequiredAssets($.definition.requiredAssets,$.definition.requiredAssetGroups),this.currentScreen)this.screenStack.push(this.currentScreen);let G=$.definition.initialState(D);this.currentScreen={name:j,config:D,state:G},await $.definition.onEnter?.({config:D,ecs:this.requireEcs()}),this.eventBus?.publish("screenPush",{screen:j,config:D})}async popScreen(){if(this.screenStack.length===0)throw Error("Cannot pop screen: stack is empty");if(this.currentScreen)await this.exitScreen(this.currentScreen.name),this.eventBus?.publish("screenPop",{screen:this.currentScreen.name});this.currentScreen=this.screenStack.pop()??null}async exitScreen(j){let D=this.screens.get(j);if(D?.definition.onExit)await D.definition.onExit(this.requireEcs());this.eventBus?.publish("screenExit",{screen:j})}async verifyRequiredAssets(j,D){if(!this.assetManager)return;if(j){for(let $ of j)if(!this.assetManager.isLoaded($))await this.assetManager.loadAsset($)}if(D){for(let $ of D)if(!this.assetManager.isGroupLoaded($))await this.assetManager.loadAssetGroup($)}}getCurrentScreen(){return this.currentScreen?.name??null}getConfig(j){if(!this.currentScreen)throw Error("No current screen");if(j!==void 0&&this.currentScreen.name!==j)throw Error(`Expected current screen '${String(j)}', but current is '${String(this.currentScreen.name)}'`);return this.currentScreen.config}tryGetConfig(j){if(!this.currentScreen)return;if(j!==void 0&&this.currentScreen.name!==j)return;return this.currentScreen.config}getState(j){if(!this.currentScreen)throw Error("No current screen");if(j!==void 0&&this.currentScreen.name!==j)throw Error(`Expected current screen '${String(j)}', but current is '${String(this.currentScreen.name)}'`);return this.currentScreen.state}tryGetState(j){if(!this.currentScreen)return;if(j!==void 0&&this.currentScreen.name!==j)return;return this.currentScreen.state}updateState(j,D){if(!this.currentScreen)throw Error("No current screen");if(D!==void 0&&this.currentScreen.name!==D)throw Error(`Expected current screen '${String(D)}', but current is '${String(this.currentScreen.name)}'`);let $=typeof j==="function"?j(this.currentScreen.state):j;this.currentScreen.state={...this.currentScreen.state,...$}}getStackDepth(){return this.screenStack.length}isOverlay(){return this.screenStack.length>0}isActive(j){if(this.currentScreen?.name===j)return!0;return this.screenStack.some((D)=>D.name===j)}isCurrent(j){return this.currentScreen?.name===j}createResource(){let j=this;return{get current(){return j.getCurrentScreen()},get config(){return j.tryGetConfig()??null},get state(){return j.tryGetState()??null},set state(D){if(j.currentScreen&&D!==null)j.currentScreen.state=D},get stack(){return j.screenStack},get isOverlay(){return j.isOverlay()},get stackDepth(){return j.getStackDepth()},isActive(D){return j.isActive(D)},isCurrent(D){return j.isCurrent(D)}}}getScreenNames(){return Array.from(this.screens.keys())}hasScreen(j){return this.screens.has(j)}}class s{manager;constructor(j){this.manager=j}add(j,D){return this.manager.register(j,D),this}getManager(){return this.manager}}function f(j){return new s(j??new A)}class g{assetConfigurator=null;screenConfigurator=null;pendingResources=[];pendingDisposeCallbacks=[];pendingRequiredComponents=[];pendingPlugins=[];_fixedDt=null;constructor(){}withPlugin(j){return this.pendingPlugins.push(j),this}withComponentTypes(){return this}withEventTypes(){return this}withResourceTypes(){return this}withResource(j,D){return this.pendingResources.push({key:j,value:D}),this}withDispose(j,D){return this.pendingDisposeCallbacks.push({key:j,callback:D}),this}withRequired(j,D,$){return this.pendingRequiredComponents.push({trigger:j,required:D,factory:$}),this}withAssets(j){let D=q();return j(D),this.assetConfigurator=D,this}withScreens(j){let D=f();return j(D),this.screenConfigurator=D,this}withFixedTimestep(j){return this._fixedDt=j,this}withReactiveQueryNames(){return this}pluginFactory(){return(j)=>M(j.id).install(j.install)}build(){let j=new P;for(let D of this.pendingPlugins)j._installPluginUnchecked(D);for(let{key:D,value:$}of this.pendingResources)j.addResource(D,$);for(let{key:D,callback:$}of this.pendingDisposeCallbacks)j.registerDispose(D,$);for(let{trigger:D,required:$,factory:G}of this.pendingRequiredComponents)j.registerRequired(D,$,G);if(this.assetConfigurator)j._setAssetManager(this.assetConfigurator.getManager());else if(j._hasPendingPluginAssets())j._setAssetManager(new K);if(this.screenConfigurator)j._setScreenManager(this.screenConfigurator.getManager());else if(j._hasPendingPluginScreens())j._setScreenManager(new A);if(this._fixedDt!==null)j._setFixedDt(this._fixedDt);return j}}var m=["preUpdate","fixedUpdate","update","postUpdate","render"];class P{static VERSION=I;_entityManager;_eventBus;_resourceManager;_commandBuffer;_systems=[];_phaseSystems={preUpdate:[],fixedUpdate:[],update:[],postUpdate:[],render:[]};_installedPlugins=new Set;_disabledGroups=new Set;_assetManager=null;_screenManager=null;_reactiveQueryManager;_postUpdateHooks=[];_currentTick=0;_systemLastSeqs=new Map;_changeThreshold=0;_fixedDt=0.016666666666666666;_fixedAccumulator=0;_interpolationAlpha=0;_maxFixedSteps=8;_requiredComponents=new Map;_pendingPluginAssets=[];_pendingPluginScreens=[];_diagnosticsEnabled=!1;_systemTimings=new Map;_phaseTimings={preUpdate:0,fixedUpdate:0,update:0,postUpdate:0,render:0};_entityEnterTracking=new Map;_entityEnterFrameSet=new Set;_systemContexts=new WeakMap;_pendingFinalizers=[];_batchingRegistrations=!1;constructor(){this._entityManager=new z,this._eventBus=new V,this._resourceManager=new E,this._reactiveQueryManager=new R(this._entityManager),this._commandBuffer=new w,this._subscribeLifecycleHooks()}_subscribeLifecycleHooks(){this._entityManager.onAfterComponentAdded((j,D)=>{this._entityManager.markChanged(j,D);let $=this._requiredComponents.get(D);if($){let G=this._entityManager.getEntity(j);if(G){let J=G.components[D];for(let{component:X,factory:Y}of $){if(this._entityManager._pendingBatchKeys?.has(X))continue;if(!(X in G.components))this._entityManager.addComponent(j,X,Y(J))}}}}),this._entityManager.onAfterEntityMutated((j)=>{let D=this._entityManager.getEntity(j);if(D)this._reactiveQueryManager.recheckEntityAndChildren(D)}),this._entityManager.onAfterComponentRemoved((j,D)=>{let $=this._entityManager.getEntity(j);if($)this._reactiveQueryManager.onComponentRemoved($,D)}),this._entityManager.onBeforeEntityRemoved((j)=>{this._reactiveQueryManager.onEntityRemoved(j)}),this._entityManager.onAfterParentChanged((j)=>{if(this._reactiveQueryManager.hasParentHasQueries){let D=this._entityManager.getEntity(j);if(D)this._reactiveQueryManager.recheckEntity(D)}})}static create(){return new g}addSystem(j){let D=new S(j);return this._pendingFinalizers.push(()=>{this._registerSystem(D._createSystemObject())}),D}_finalizePendingBuilders(){if(this._pendingFinalizers.length===0)return;this._batchingRegistrations=!0;while(this._pendingFinalizers.length>0){let j=this._pendingFinalizers;this._pendingFinalizers=[];for(let D of j)D()}this._batchingRegistrations=!1,this._rebuildPhaseSystems()}update(j){this._finalizePendingBuilders();let D=this._screenManager?.getCurrentScreen()??null,$=this._diagnosticsEnabled;this._runPhase("preUpdate",j,D,$);let G=$?performance.now():0;this._fixedAccumulator+=j;let J=0;while(this._fixedAccumulator>=this._fixedDt&&J<this._maxFixedSteps)this._executePhase(this._phaseSystems.fixedUpdate,this._fixedDt,D),this._commandBuffer.playback(this),this._fixedAccumulator-=this._fixedDt,J++;if(this._fixedAccumulator>=this._fixedDt)this._fixedAccumulator=0;if($)this._phaseTimings.fixedUpdate=performance.now()-G;this._interpolationAlpha=this._fixedAccumulator/this._fixedDt,this._runPhase("update",j,D,$),this._runPhase("postUpdate",j,D,$);for(let X of this._postUpdateHooks)X({ecs:this,dt:j});this._runPhase("render",j,D,$),this._resourceManager.flushObserved(),this._changeThreshold=this._entityManager.changeSeq,this._currentTick++}_executePhase(j,D,$){for(let G of j){if(!G.process&&!G.onEntityEnter)continue;if(G.groups?.length){let W=!1;for(let F of G.groups)if(this._disabledGroups.has(F)){W=!0;break}if(W)continue}if(G.inScreens?.length){if($===null||!G.inScreens.includes($))continue}if(G.excludeScreens?.length){if($!==null&&G.excludeScreens.includes($))continue}if(G.requiredAssets?.length&&this._assetManager){let W=!0;for(let F of G.requiredAssets)if(!this._assetManager.isLoaded(F)){W=!1;break}if(!W)continue}let J=this._systemLastSeqs.get(G)??0;this._changeThreshold=J;let X=this._systemContexts.get(G);if(!X)X={queries:{},dt:0,ecs:this},this._systemContexts.set(G,X);X.dt=D;let Y=X.queries,Z=!1,_=!1;if(G.entityQueries)for(let W in G.entityQueries){_=!0;let F=G.entityQueries[W];if(F){let B=Y[W]??(Y[W]=[]);if(this._entityManager.getEntitiesWithQueryInto(B,F.with,F.without||[],F.changed,F.changed?this._changeThreshold:void 0,F.parentHas),B.length)Z=!0}}let Q=this._entityEnterTracking.get(G);if(Q&&G.onEntityEnter)for(let W in G.onEntityEnter){let F=Y[W],L=Q.get(W);if(!F||!L)continue;let B=G.onEntityEnter[W];if(!B)continue;let U=this._entityEnterFrameSet;U.clear();for(let O of F)if(U.add(O.id),!L.has(O.id))L.add(O.id),B({entity:O,ecs:this});for(let O of L)if(!U.has(O))L.delete(O)}if(G.process){if(this._diagnosticsEnabled){let W=performance.now();if(Z||G.runWhenEmpty)G.process(X);else if(!_)G.process(X);this._systemTimings.set(G.label,performance.now()-W)}else if(Z||G.runWhenEmpty)G.process(X);else if(!_)G.process(X)}this._systemLastSeqs.set(G,this._entityManager.changeSeq)}}_runPhase(j,D,$,G){if(G){let J=performance.now();this._executePhase(this._phaseSystems[j],D,$),this._phaseTimings[j]=performance.now()-J}else this._executePhase(this._phaseSystems[j],D,$);this._commandBuffer.playback(this)}async initialize(){if(this._finalizePendingBuilders(),await this.initializeResources(),this._assetManager)this._assetManager.setEventBus(this._eventBus),await this._assetManager.loadEagerAssets(),this._resourceManager.add("$assets",this._assetManager.createResource());if(this._screenManager)this._screenManager.setDependencies(this._eventBus,this._assetManager,this),this._resourceManager.add("$screen",this._screenManager.createResource());for(let j of this._systems)await j.onInitialize?.(this)}async initializeResources(...j){await this._resourceManager.initializeResources(this,...j)}_rebuildPhaseSystems(){for(let j of m)this._phaseSystems[j]=[];for(let j of this._systems){let D=j.phase??"update";this._phaseSystems[D].push(j)}for(let j of m)this._phaseSystems[j].sort((D,$)=>{let G=D.priority??0;return($.priority??0)-G})}updateSystemPriority(j,D){this._finalizePendingBuilders();let $=this._systems.find((G)=>G.label===j);if(!$)return!1;return $.priority=D,this._rebuildPhaseSystems(),!0}updateSystemPhase(j,D){this._finalizePendingBuilders();let $=this._systems.find((G)=>G.label===j);if(!$)return!1;return $.phase=D,this._rebuildPhaseSystems(),!0}get interpolationAlpha(){return this._interpolationAlpha}get fixedDt(){return this._fixedDt}disableSystemGroup(j){this._disabledGroups.add(j)}enableSystemGroup(j){this._disabledGroups.delete(j)}isSystemGroupEnabled(j){return!this._disabledGroups.has(j)}getSystemsInGroup(j){return this._finalizePendingBuilders(),this._systems.filter((D)=>D.groups?.includes(j)).map((D)=>D.label)}removeSystem(j){this._finalizePendingBuilders();let D=this._systems.findIndex((G)=>G.label===j);if(D===-1)return!1;let $=this._systems[D];if(!$)return!1;if($.onDetach)$.onDetach(this);return this._systems.splice(D,1),this._systemLastSeqs.delete($),this._entityEnterTracking.delete($),this._rebuildPhaseSystems(),!0}_registerSystem(j){if(this._systems.push(j),this._systemLastSeqs.set(j,this._changeThreshold),!this._batchingRegistrations)this._rebuildPhaseSystems();if(j.onEntityEnter){let D=new Map;for(let $ in j.onEntityEnter)D.set($,new Set);this._entityEnterTracking.set(j,D)}if(!j.eventHandlers)return;for(let D in j.eventHandlers){let $=j.eventHandlers[D];if($)this._eventBus.subscribe(D,(G)=>{$({data:G,ecs:this})})}}hasResource(j){return this._resourceManager.has(j)}getResource(j){if(!this._resourceManager.has(j))throw Error(`Resource '${String(j)}' not found. Available resources: [${this.getResourceKeys().map((D)=>String(D)).join(", ")}]`);return this._resourceManager.get(j,this)}tryGetResource(j){let D=j;if(!this._resourceManager.has(D))return;return this._resourceManager.get(D,this)}addResource(j,D){return this._resourceManager.add(j,D),this}removeResource(j){return this._resourceManager.remove(j)}async disposeResource(j){return this._resourceManager.disposeResource(j,this)}async disposeResources(){return this._resourceManager.disposeResources(this)}updateResource(j,D){let $=this.getResource(j),G=D($);return this._resourceManager.add(j,G),this._resourceManager.notifyChange(j,G,$),this}setResource(j,D){let $=this.tryGetResource(j);if(this._resourceManager.add(j,D),$!==void 0)this._resourceManager.notifyChange(j,D,$);return this}onResourceChange(j,D){return this._resourceManager.onResourceChange(j,D)}isResourceObserved(j){return this._resourceManager.isObserved(j)}getResourceKeys(){return this._resourceManager.getKeys()}resourceNeedsInitialization(j){return this._resourceManager.needsInitialization(j)}getEntity(j){return this._entityManager.getEntity(j)}getComponent(j,D){return this._entityManager.getComponent(j,D)}addComponent(j,D,$){this._entityManager.addComponent(j,D,$)}addComponents(j,D){this._entityManager.addComponents(j,D)}removeComponent(j,D){this._entityManager.removeComponent(j,D)}hasComponent(j,D){return this._entityManager.getComponent(j,D)!==void 0}spawn(j){let D=this._entityManager.createEntity();return this._entityManager.addComponents(D.id,j),D}getEntitiesWithQuery(j,D=[],$,G){return this._entityManager.getEntitiesWithQuery(j,D,$,$?this._changeThreshold:void 0,G)}getSingleton(j,D=[]){let $=this._entityManager.getEntitiesWithQuery(j,D);if($.length===0)throw Error(`getSingleton: no entity matches query with=[${String(j)}] without=[${String(D)}]`);if($.length>1)throw Error(`getSingleton: expected 1 entity but found ${$.length} matching query with=[${String(j)}] without=[${String(D)}]`);let G=$[0];if(!G)throw Error("getSingleton: unexpected empty result");return G}tryGetSingleton(j,D=[]){let $=this._entityManager.getEntitiesWithQuery(j,D);if($.length===0)return;if($.length>1)throw Error(`tryGetSingleton: expected 0 or 1 entity but found ${$.length} matching query with=[${String(j)}] without=[${String(D)}]`);return $[0]}removeEntity(j,D){return this._entityManager.removeEntity(j,D)}spawnChild(j,D){let $=this._entityManager.spawnChild(j,D);return this._emitHierarchyChanged($.id,null,j),$}setParent(j,D){let $=this._entityManager.getParent(j);return this._entityManager.setParent(j,D),this._emitHierarchyChanged(j,$,D),this}removeParent(j){let D=this._entityManager.getParent(j),$=this._entityManager.removeParent(j);if($)this._emitHierarchyChanged(j,D,null);return $}getParent(j){return this._entityManager.getParent(j)}getChildren(j){return this._entityManager.getChildren(j)}getChildAt(j,D){return this._entityManager.getChildAt(j,D)}getChildIndex(j,D){return this._entityManager.getChildIndex(j,D)}getAncestors(j){return this._entityManager.getAncestors(j)}getDescendants(j){return this._entityManager.getDescendants(j)}getRoot(j){return this._entityManager.getRoot(j)}getSiblings(j){return this._entityManager.getSiblings(j)}isDescendantOf(j,D){return this._entityManager.isDescendantOf(j,D)}isAncestorOf(j,D){return this._entityManager.isAncestorOf(j,D)}getRootEntities(){return this._entityManager.getRootEntities()}forEachInHierarchy(j,D){this._entityManager.forEachInHierarchy(j,D)}hierarchyIterator(j){return this._entityManager.hierarchyIterator(j)}_emitHierarchyChanged(j,D,$){this._eventBus.publish("hierarchyChanged",{entityId:j,oldParent:D,newParent:$})}get installedPlugins(){return Array.from(this._installedPlugins)}get entityManager(){return this._entityManager}get eventBus(){return this._finalizePendingBuilders(),this._eventBus}get commands(){return this._commandBuffer}get currentTick(){return this._currentTick}get changeThreshold(){return this._changeThreshold}enableDiagnostics(j){if(this._diagnosticsEnabled=j,!j)this._systemTimings.clear(),this._phaseTimings={preUpdate:0,fixedUpdate:0,update:0,postUpdate:0,render:0}}get diagnosticsEnabled(){return this._diagnosticsEnabled}get systemTimings(){return this._systemTimings}get phaseTimings(){return this._phaseTimings}get entityCount(){return this._entityManager.entityCount}mutateComponent(j,D,$){let G=this._entityManager.getComponent(j,D);if(G===void 0)throw Error(`Entity ${j} does not have component "${String(D)}"`);return $(G),this._entityManager.markChanged(j,D),G}markChanged(j,D){this._entityManager.markChanged(j,D)}registerDispose(j,D){this._entityManager.registerDispose(j,D)}registerRequired(j,D,$){if(String(j)===String(D))throw Error(`Cannot require a component to depend on itself: '${String(j)}'`);let G=this._requiredComponents.get(j)??[];if(G.some((J)=>J.component===D))throw Error(`Required component '${String(D)}' already registered for trigger '${String(j)}'`);this._checkRequiredCycle(j,D),G.push({component:D,factory:$}),this._requiredComponents.set(j,G)}_checkRequiredCycle(j,D){k(j,D,($)=>this._requiredComponents.get($))}onComponentAdded(j,D){return this._entityManager.onComponentAdded(j,D)}onComponentRemoved(j,D){return this._entityManager.onComponentRemoved(j,D)}addReactiveQuery(j,D){this._reactiveQueryManager.addQuery(j,D)}removeReactiveQuery(j){return this._reactiveQueryManager.removeQuery(j)}on(j,D){return this._eventBus.subscribe(j,D)}off(j,D){return this._eventBus.unsubscribe(j,D)}onPostUpdate(j){return this._postUpdateHooks.push(j),()=>{let D=this._postUpdateHooks.indexOf(j);if(D!==-1)this._postUpdateHooks.splice(D,1)}}requireAssetManager(){if(!this._assetManager)throw Error("Asset manager not configured. Use withAssets() in builder.");return this._assetManager}getAsset(j){return this.requireAssetManager().get(j)}tryGetAsset(j){return this._assetManager?.tryGet(j)}getAssetHandle(j){return this.requireAssetManager().getHandle(j)}isAssetLoaded(j){return this._assetManager?.isLoaded(j)??!1}async loadAsset(j){return this.requireAssetManager().loadAsset(j)}async loadAssetGroup(j){return this.requireAssetManager().loadAssetGroup(j)}isAssetGroupLoaded(j){return this._assetManager?.isGroupLoaded(j)??!1}getAssetGroupProgress(j){return this._assetManager?.getGroupProgress(j)??0}requireScreenManager(){if(!this._screenManager)throw Error("Screen manager not configured. Use withScreens() in builder.");return this._screenManager}async setScreen(j,D){return this.requireScreenManager().setScreen(j,D)}async pushScreen(j,D){return this.requireScreenManager().pushScreen(j,D)}async popScreen(){return this.requireScreenManager().popScreen()}getCurrentScreen(){return this._screenManager?.getCurrentScreen()??null}getScreenConfig(j){return this.requireScreenManager().getConfig(j)}tryGetScreenConfig(j){return this._screenManager?.tryGetConfig(j)??void 0}getScreenState(j){return this.requireScreenManager().getState(j)}tryGetScreenState(j){return this._screenManager?.tryGetState(j)??void 0}updateScreenState(j,D){if(typeof j==="string")this.requireScreenManager().updateState(D,j);else this.requireScreenManager().updateState(j)}isCurrentScreen(j){return this._screenManager?.isCurrent(j)??!1}isScreenActive(j){return this._screenManager?.isActive(j)??!1}getScreenStackDepth(){return this._screenManager?.getStackDepth()??0}_setAssetManager(j){this._assetManager=j;for(let[D,$]of this._pendingPluginAssets)this._assetManager.register(D,$);this._pendingPluginAssets=[]}_setScreenManager(j){this._screenManager=j;for(let[D,$]of this._pendingPluginScreens)this._screenManager.register(D,$);this._pendingPluginScreens=[]}_hasPendingPluginAssets(){return this._pendingPluginAssets.length>0}_hasPendingPluginScreens(){return this._pendingPluginScreens.length>0}_setFixedDt(j){this._fixedDt=j}_registerAsset(j,D){this._pendingPluginAssets.push([j,D])}_registerScreen(j,D){this._pendingPluginScreens.push([j,D])}installPlugin(j){return this._installPluginUnchecked(j)}_installPluginUnchecked(j){if(this._installedPlugins.has(j.id))return this;return this._installedPlugins.add(j.id),j.install(this),this}pluginFactory(){return(j)=>M(j.id).install(j.install)}getHelpers(j){return j(this)}}function Tj(j){return j}function Cj(j,D){return{x:j,y:D}}function qj(){return{x:0,y:0}}function fj(j,D){return{x:j.x+D.x,y:j.y+D.y}}function gj(j,D){return{x:j.x-D.x,y:j.y-D.y}}function vj(j,D){return{x:j.x*D,y:j.y*D}}function Nj(j){return{x:-j.x,y:-j.y}}function pj(j,D){return j.x*D.x+j.y*D.y}function bj(j,D){return j.x*D.y-j.y*D.x}function hj(j){return j.x*j.x+j.y*j.y}function kj(j){return Math.sqrt(j.x*j.x+j.y*j.y)}function Ij(j){let D=Math.sqrt(j.x*j.x+j.y*j.y);if(D===0)return{x:0,y:0};return{x:j.x/D,y:j.y/D}}function uj(j,D){let $=j.x-D.x,G=j.y-D.y;return $*$+G*G}function sj(j,D){let $=j.x-D.x,G=j.y-D.y;return Math.sqrt($*$+G*G)}function mj(j,D,$=0.0000000001){return Math.abs(j.x-D.x)<=$&&Math.abs(j.y-D.y)<=$}function ij(j,D,$){return{x:j,y:D,z:$}}function lj(){return{x:0,y:0,z:0}}function cj(j,D){return{x:j.x+D.x,y:j.y+D.y,z:j.z+D.z}}function dj(j,D){return{x:j.x-D.x,y:j.y-D.y,z:j.z-D.z}}function yj(j,D){return{x:j.x*D,y:j.y*D,z:j.z*D}}function oj(j){return{x:-j.x,y:-j.y,z:-j.z}}function rj(j,D){return j.x*D.x+j.y*D.y+j.z*D.z}function aj(j,D){return{x:j.y*D.z-j.z*D.y,y:j.z*D.x-j.x*D.z,z:j.x*D.y-j.y*D.x}}function tj(j){return j.x*j.x+j.y*j.y+j.z*j.z}function nj(j){return Math.sqrt(j.x*j.x+j.y*j.y+j.z*j.z)}function ej(j){let D=Math.sqrt(j.x*j.x+j.y*j.y+j.z*j.z);if(D===0)return{x:0,y:0,z:0};return{x:j.x/D,y:j.y/D,z:j.z/D}}function j3(j,D){let $=j.x-D.x,G=j.y-D.y,J=j.z-D.z;return $*$+G*G+J*J}function D3(j,D){let $=j.x-D.x,G=j.y-D.y,J=j.z-D.z;return Math.sqrt($*$+G*G+J*J)}function $3(j,D,$=0.0000000001){return Math.abs(j.x-D.x)<=$&&Math.abs(j.y-D.y)<=$&&Math.abs(j.z-D.z)<=$}var U3=P;export{lj as vec3Zero,dj as vec3Sub,yj as vec3Scale,ej as vec3Normalize,oj as vec3Negate,tj as vec3LengthSq,nj as vec3Length,$3 as vec3Equals,rj as vec3Dot,j3 as vec3DistanceSq,D3 as vec3Distance,aj as vec3Cross,cj as vec3Add,ij as vec3,qj as vec2Zero,gj as vec2Sub,vj as vec2Scale,Ij as vec2Normalize,Nj as vec2Negate,hj as vec2LengthSq,kj as vec2Length,mj as vec2Equals,pj as vec2Dot,uj as vec2DistanceSq,sj as vec2Distance,bj as vec2Cross,fj as vec2Add,Cj as vec2,i as directValue,M as definePlugin,U3 as default,f as createScreenConfigurator,Tj as createQueryDefinition,q as createAssetConfigurator,S as SystemBuilder,A as ScreenManager,K as AssetManager};
2
2
 
3
- //# debugId=F5E819A46EFBFBD764756E2164756E21
3
+ //# debugId=82B4E2F9008BA76064756E2164756E21
4
4
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -20,6 +20,6 @@
20
20
  "import ECSpresso from './ecspresso';\nimport { SystemBuilder, type ProcessContext } from './system-builder';\nimport { type Plugin, type BasePluginOptions, definePlugin } from './plugin';\n\nexport * from './types';\nexport * from './asset-types';\nexport * from './screen-types';\nexport * from './utils/math';\nexport type { ReactiveQueryDefinition } from './reactive-query-manager';\nexport { default as AssetManager, createAssetConfigurator } from './asset-manager';\nexport { default as ScreenManager, createScreenConfigurator } from './screen-manager';\nexport { SystemBuilder, type ProcessContext };\nexport { type Plugin, type BasePluginOptions, definePlugin };\nexport { directValue, type ResourceDirectValue } from './resource-manager';\nexport default ECSpresso;\n"
21
21
  ],
22
22
  "mappings": "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",
23
- "debugId": "F5E819A46EFBFBD764756E2164756E21",
23
+ "debugId": "82B4E2F9008BA76064756E2164756E21",
24
24
  "names": []
25
25
  }
@@ -151,6 +151,22 @@ export interface InputPluginOptions<A extends string = string, G extends string
151
151
  x: number;
152
152
  y: number;
153
153
  };
154
+ /**
155
+ * Keys whose browser default behaviour should be suppressed (e.g. `['Tab', ' ', 'ArrowDown']`).
156
+ * Ignored when `shouldPreventDefault` is provided.
157
+ */
158
+ preventDefaultKeys?: KeyCode[];
159
+ /**
160
+ * Pointer button indices whose browser default behaviour should be suppressed (e.g. `[0, 2]`).
161
+ * Ignored when `shouldPreventDefault` is provided.
162
+ */
163
+ preventDefaultPointerButtons?: number[];
164
+ /**
165
+ * Custom predicate for full control over `preventDefault`. Receives the raw DOM event and returns
166
+ * `true` to suppress its default behaviour. When provided, `preventDefaultKeys` and
167
+ * `preventDefaultPointerButtons` are ignored.
168
+ */
169
+ shouldPreventDefault?: (event: KeyboardEvent | PointerEvent) => boolean;
154
170
  }
155
171
  /** Create a single action binding. Identity function that provides type inference for inline literals. */
156
172
  export declare function createActionBinding(binding: ActionBinding): ActionBinding;
@@ -1,4 +1,4 @@
1
- var Jj=((j)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(j,{get:(q,W)=>(typeof require<"u"?require:q)[W]}):j)(function(j){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+j+'" is not supported')});import{definePlugin as i}from"ecspresso";function Wj(j){return j}function Yj(j,...q){return q.map((W)=>({pad:j,button:W}))}function $j(j,q,W,G){return G===void 0?{pad:j,axis:q,direction:W}:{pad:j,axis:q,direction:W,threshold:G}}var s=0.5,o=0.15,H=4;function n(){return{keysDown:new Set,keysPressed:[],keysReleased:[],pointerButtonsDown:new Set,pointerButtonsPressed:[],pointerButtonsReleased:[],pointerX:0,pointerY:0,lastPointerX:0,lastPointerY:0,pointerMoved:!1}}function d(){return{keysDown:new Set,keysPressed:new Set,keysReleased:new Set,pointerButtonsDown:new Set,pointerButtonsPressed:new Set,pointerButtonsReleased:new Set,pointerX:0,pointerY:0,pointerDeltaX:0,pointerDeltaY:0}}function r(){return{connected:!1,id:null,buttonsDown:new Set,buttonsPrev:new Set,buttonsPressed:new Set,buttonsReleased:new Set,buttonValues:[],axes:[],rawAxes:[]}}function h(){return{active:new Set,prev:new Set}}function B(j,q){j.clear();for(let W of q)j.add(W)}function t(j,q){B(j.keysDown,q.keysDown),B(j.keysPressed,q.keysPressed),B(j.keysReleased,q.keysReleased),B(j.pointerButtonsDown,q.pointerButtonsDown),B(j.pointerButtonsPressed,q.pointerButtonsPressed),B(j.pointerButtonsReleased,q.pointerButtonsReleased),j.pointerDeltaX=q.pointerMoved?q.pointerX-q.lastPointerX:0,j.pointerDeltaY=q.pointerMoved?q.pointerY-q.lastPointerY:0,j.pointerX=q.pointerX,j.pointerY=q.pointerY,q.keysPressed.length=0,q.keysReleased.length=0,q.pointerButtonsPressed.length=0,q.pointerButtonsReleased.length=0,q.lastPointerX=q.pointerX,q.lastPointerY=q.pointerY,q.pointerMoved=!1}function a(j){return()=>{if(typeof navigator>"u"||typeof navigator.getGamepads!=="function"){for(let W=0;W<j.length;W++)j[W]=null;return j}let q=navigator.getGamepads();for(let W=0;W<j.length;W++)j[W]=q[W]??null;return j}}function D(j,q,W,G,Z){let $=Math.sqrt(j*j+q*q);if($<W){G[Z]=0,G[Z+1]=0;return}let V=Math.min(($-W)/(1-W),1);G[Z]=j/$*V,G[Z+1]=q/$*V}function e(j,q,W){if(q.length=j.length,j.length>=2)D(j[0]??0,j[1]??0,W,q,0);if(j.length>=4)D(j[2]??0,j[3]??0,W,q,2);for(let G=4;G<j.length;G++)q[G]=j[G]??0}function jj(j,q,W){let G=q();for(let Z=0;Z<H;Z++){let $=G[Z]??null,V=j[Z];if(!V)continue;let R=V.buttonsPrev;if(B(R,V.buttonsDown),V.buttonsDown.clear(),V.buttonsPressed.clear(),V.buttonsReleased.clear(),!$||!$.connected){if(V.connected){for(let Y of R)V.buttonsReleased.add(Y);V.connected=!1,V.id=null,V.buttonValues.length=0,V.axes.length=0,V.rawAxes.length=0}continue}V.connected=!0,V.id=$.id,V.buttonValues.length=$.buttons.length;for(let Y=0;Y<$.buttons.length;Y++){let E=$.buttons[Y];if(!E){V.buttonValues[Y]=0;continue}if(V.buttonValues[Y]=E.value,E.pressed)V.buttonsDown.add(Y)}for(let Y of V.buttonsDown)if(!R.has(Y))V.buttonsPressed.add(Y);for(let Y of R)if(!V.buttonsDown.has(Y))V.buttonsReleased.add(Y);V.rawAxes.length=$.axes.length;for(let Y=0;Y<$.axes.length;Y++)V.rawAxes[Y]=$.axes[Y]??0;e(V.rawAxes,V.axes,W)}}function qj(j,q,W,G){if(j.keys?.some((Z)=>q.has(Z)))return!0;if(j.pointerButtons?.some((Z)=>W.has(Z)))return!0;if(j.gamepadButtons?.some(({pad:Z,button:$})=>G[Z]?.buttonsDown.has($)??!1))return!0;if(j.gamepadAxes?.some(({pad:Z,axis:$,direction:V,threshold:R=s})=>{let Y=G[Z]?.axes[$]??0;return V>0?Y>R:Y<-R}))return!0;return!1}function k(j,q,W,G,Z){let $=j.prev;j.prev=j.active,j.active=$,$.clear();for(let[V,R]of Object.entries(q))if(qj(R,W,G,Z))$.add(V)}function g(j){return{isActive:(q)=>j.active.has(q),justActivated:(q)=>j.active.has(q)&&!j.prev.has(q),justDeactivated:(q)=>!j.active.has(q)&&j.prev.has(q)}}function Xj(j){let{systemGroup:q="input",priority:W=100,phase:G="preUpdate",target:Z=globalThis,gamepad:$={},coordinateTransform:V}=j??{},R={...j?.actions??{}},Y=new Map(Object.entries(j?.players??{})),E=$.deadzone??o,S=$.poll??a(Array(H).fill(null)),C=n(),K=d(),L=Array.from({length:H},r),z=h(),O=new Map,N=new Map,T=[],I={x:0,y:0},F={x:0,y:0},U=R,A={isDown:(J)=>K.keysDown.has(J),justPressed:(J)=>K.keysPressed.has(J),justReleased:(J)=>K.keysReleased.has(J)},y={position:I,delta:F,isDown:(J)=>K.pointerButtonsDown.has(J),justPressed:(J)=>K.pointerButtonsPressed.has(J),justReleased:(J)=>K.pointerButtonsReleased.has(J)};function b(J){let Q=L[J];if(!Q)throw Error(`Invalid gamepad index: ${J}`);return{get connected(){return Q.connected},get id(){return Q.id},isDown:(X)=>Q.buttonsDown.has(X),justPressed:(X)=>Q.buttonsPressed.has(X),justReleased:(X)=>Q.buttonsReleased.has(X),buttonValue:(X)=>Q.buttonValues[X]??0,axis:(X)=>Q.axes[X]??0,rawAxis:(X)=>Q.rawAxes[X]??0}}let c=Array.from({length:H},(J,Q)=>b(Q)),f=g(z);function M(J){let Q=O.get(J);if(Q)return Q;let X=h();return O.set(J,X),X}function P(J){let Q=M(J);return{actions:g(Q),setActionMap:(X)=>{if(!Y.has(J))throw Error(`Player '${J}' was removed`);Y.set(J,{...X})},getActionMap:()=>{let X=Y.get(J);if(!X)throw Error(`Player '${J}' was removed`);return{...X}}}}for(let J of Y.keys())N.set(J,P(J));let x={keyboard:A,pointer:y,gamepads:c,actions:f,setActionMap(J){U={...J}},getActionMap(){return{...U}},definePlayer(J,Q){if(Y.set(J,{...Q}),!N.has(J))N.set(J,P(J))},removePlayer(J){let Q=Y.delete(J);return N.delete(J),O.delete(J),Q},player(J){return N.get(J)},playerIds(){return Array.from(Y.keys())}};function m(J){let Q=J;if(Q.repeat)return;C.keysDown.add(Q.key),C.keysPressed.push(Q.key)}function u(J){let Q=J;C.keysDown.delete(Q.key),C.keysReleased.push(Q.key)}function w(J){let Q=J;C.pointerButtonsDown.add(Q.button),C.pointerButtonsPressed.push(Q.button)}function l(J){let Q=J;if(V){let{x:X,y:v}=V(Q.clientX,Q.clientY);C.pointerX=X,C.pointerY=v}else C.pointerX=Q.clientX,C.pointerY=Q.clientY;C.pointerMoved=!0}function p(J){let Q=J;C.pointerButtonsDown.delete(Q.button),C.pointerButtonsReleased.push(Q.button)}function _(J,Q){Z.addEventListener(J,Q),T.push(()=>{Z.removeEventListener(J,Q)})}return i("input").withResourceTypes().withLabels().withGroups().install((J)=>{J.addResource("inputState",x),J.addSystem("input-state").setPriority(W).inPhase(G).inGroup(q).setOnInitialize(()=>{_("keydown",m),_("keyup",u),_("pointerdown",w),_("pointermove",l),_("pointerup",p)}).setOnDetach(()=>{for(let Q of T)Q();T.length=0}).setProcess(()=>{jj(L,S,E),t(K,C),I.x=K.pointerX,I.y=K.pointerY,F.x=K.pointerDeltaX,F.y=K.pointerDeltaY,k(z,U,K.keysDown,K.pointerButtonsDown,L);for(let[Q,X]of Y){let v=M(Q);k(v,X,K.keysDown,K.pointerButtonsDown,L)}})})}export{Yj as gamepadButtonsOn,$j as gamepadAxisOn,Xj as createInputPlugin,Wj as createActionBinding};
1
+ var Xj=((j)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(j,{get:(J,W)=>(typeof require<"u"?require:J)[W]}):j)(function(j){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+j+'" is not supported')});import{definePlugin as t}from"ecspresso";function Cj(j){return j}function Rj(j,...J){return J.map((W)=>({pad:j,button:W}))}function Ej(j,J,W,G){return G===void 0?{pad:j,axis:J,direction:W}:{pad:j,axis:J,direction:W,threshold:G}}var a=0.5,e=0.15,T=4;function jj(){return{keysDown:new Set,keysPressed:[],keysReleased:[],pointerButtonsDown:new Set,pointerButtonsPressed:[],pointerButtonsReleased:[],pointerX:0,pointerY:0,lastPointerX:0,lastPointerY:0,pointerMoved:!1}}function qj(){return{keysDown:new Set,keysPressed:new Set,keysReleased:new Set,pointerButtonsDown:new Set,pointerButtonsPressed:new Set,pointerButtonsReleased:new Set,pointerX:0,pointerY:0,pointerDeltaX:0,pointerDeltaY:0}}function Jj(){return{connected:!1,id:null,buttonsDown:new Set,buttonsPrev:new Set,buttonsPressed:new Set,buttonsReleased:new Set,buttonValues:[],axes:[],rawAxes:[]}}function k(){return{active:new Set,prev:new Set}}function N(j,J){j.clear();for(let W of J)j.add(W)}function Qj(j,J){N(j.keysDown,J.keysDown),N(j.keysPressed,J.keysPressed),N(j.keysReleased,J.keysReleased),N(j.pointerButtonsDown,J.pointerButtonsDown),N(j.pointerButtonsPressed,J.pointerButtonsPressed),N(j.pointerButtonsReleased,J.pointerButtonsReleased),j.pointerDeltaX=J.pointerMoved?J.pointerX-J.lastPointerX:0,j.pointerDeltaY=J.pointerMoved?J.pointerY-J.lastPointerY:0,j.pointerX=J.pointerX,j.pointerY=J.pointerY,J.keysPressed.length=0,J.keysReleased.length=0,J.pointerButtonsPressed.length=0,J.pointerButtonsReleased.length=0,J.lastPointerX=J.pointerX,J.lastPointerY=J.pointerY,J.pointerMoved=!1}function Vj(j){return()=>{if(typeof navigator>"u"||typeof navigator.getGamepads!=="function"){for(let W=0;W<j.length;W++)j[W]=null;return j}let J=navigator.getGamepads();for(let W=0;W<j.length;W++)j[W]=J[W]??null;return j}}function D(j,J,W,G,Z){let Y=Math.sqrt(j*j+J*J);if(Y<W){G[Z]=0,G[Z+1]=0;return}let V=Math.min((Y-W)/(1-W),1);G[Z]=j/Y*V,G[Z+1]=J/Y*V}function Wj(j,J,W){if(J.length=j.length,j.length>=2)D(j[0]??0,j[1]??0,W,J,0);if(j.length>=4)D(j[2]??0,j[3]??0,W,J,2);for(let G=4;G<j.length;G++)J[G]=j[G]??0}function Yj(j,J,W){let G=J();for(let Z=0;Z<T;Z++){let Y=G[Z]??null,V=j[Z];if(!V)continue;let E=V.buttonsPrev;if(N(E,V.buttonsDown),V.buttonsDown.clear(),V.buttonsPressed.clear(),V.buttonsReleased.clear(),!Y||!Y.connected){if(V.connected){for(let $ of E)V.buttonsReleased.add($);V.connected=!1,V.id=null,V.buttonValues.length=0,V.axes.length=0,V.rawAxes.length=0}continue}V.connected=!0,V.id=Y.id,V.buttonValues.length=Y.buttons.length;for(let $=0;$<Y.buttons.length;$++){let B=Y.buttons[$];if(!B){V.buttonValues[$]=0;continue}if(V.buttonValues[$]=B.value,B.pressed)V.buttonsDown.add($)}for(let $ of V.buttonsDown)if(!E.has($))V.buttonsPressed.add($);for(let $ of E)if(!V.buttonsDown.has($))V.buttonsReleased.add($);V.rawAxes.length=Y.axes.length;for(let $=0;$<Y.axes.length;$++)V.rawAxes[$]=Y.axes[$]??0;Wj(V.rawAxes,V.axes,W)}}function $j(j,J,W,G){if(j.keys?.some((Z)=>J.has(Z)))return!0;if(j.pointerButtons?.some((Z)=>W.has(Z)))return!0;if(j.gamepadButtons?.some(({pad:Z,button:Y})=>G[Z]?.buttonsDown.has(Y)??!1))return!0;if(j.gamepadAxes?.some(({pad:Z,axis:Y,direction:V,threshold:E=a})=>{let $=G[Z]?.axes[Y]??0;return V>0?$>E:$<-E}))return!0;return!1}function S(j,J,W,G,Z){let Y=j.prev;j.prev=j.active,j.active=Y,Y.clear();for(let[V,E]of Object.entries(J))if($j(E,W,G,Z))Y.add(V)}function A(j){return{isActive:(J)=>j.active.has(J),justActivated:(J)=>j.active.has(J)&&!j.prev.has(J),justDeactivated:(J)=>!j.active.has(J)&&j.prev.has(J)}}function Kj(j){let{systemGroup:J="input",priority:W=100,phase:G="preUpdate",target:Z=globalThis,gamepad:Y={},coordinateTransform:V,shouldPreventDefault:E,preventDefaultKeys:$,preventDefaultPointerButtons:B}=j??{},y=new Set($??[]),b=new Set(B??[]);function H(q){if(E){if(E(q))q.preventDefault();return}if("key"in q){if(y.has(q.key))q.preventDefault()}else if(b.has(q.button))q.preventDefault()}let x={...j?.actions??{}},K=new Map(Object.entries(j?.players??{})),c=Y.deadzone??e,f=Y.poll??Vj(Array(T).fill(null)),R=jj(),C=qj(),O=Array.from({length:T},Jj),g=k(),I=new Map,_=new Map,F=[],U={x:0,y:0},z={x:0,y:0},M=x,m={isDown:(q)=>C.keysDown.has(q),justPressed:(q)=>C.keysPressed.has(q),justReleased:(q)=>C.keysReleased.has(q)},u={position:U,delta:z,isDown:(q)=>C.pointerButtonsDown.has(q),justPressed:(q)=>C.pointerButtonsPressed.has(q),justReleased:(q)=>C.pointerButtonsReleased.has(q)};function w(q){let Q=O[q];if(!Q)throw Error(`Invalid gamepad index: ${q}`);return{get connected(){return Q.connected},get id(){return Q.id},isDown:(X)=>Q.buttonsDown.has(X),justPressed:(X)=>Q.buttonsPressed.has(X),justReleased:(X)=>Q.buttonsReleased.has(X),buttonValue:(X)=>Q.buttonValues[X]??0,axis:(X)=>Q.axes[X]??0,rawAxis:(X)=>Q.rawAxes[X]??0}}let l=Array.from({length:T},(q,Q)=>w(Q)),p=A(g);function P(q){let Q=I.get(q);if(Q)return Q;let X=k();return I.set(q,X),X}function h(q){let Q=P(q);return{actions:A(Q),setActionMap:(X)=>{if(!K.has(q))throw Error(`Player '${q}' was removed`);K.set(q,{...X})},getActionMap:()=>{let X=K.get(q);if(!X)throw Error(`Player '${q}' was removed`);return{...X}}}}for(let q of K.keys())_.set(q,h(q));let i={keyboard:m,pointer:u,gamepads:l,actions:p,setActionMap(q){M={...q}},getActionMap(){return{...M}},definePlayer(q,Q){if(K.set(q,{...Q}),!_.has(q))_.set(q,h(q))},removePlayer(q){let Q=K.delete(q);return _.delete(q),I.delete(q),Q},player(q){return _.get(q)},playerIds(){return Array.from(K.keys())}};function s(q){let Q=q;if(Q.repeat)return;H(Q),R.keysDown.add(Q.key),R.keysPressed.push(Q.key)}function d(q){let Q=q;H(Q),R.keysDown.delete(Q.key),R.keysReleased.push(Q.key)}function o(q){let Q=q;H(Q),R.pointerButtonsDown.add(Q.button),R.pointerButtonsPressed.push(Q.button)}function n(q){let Q=q;if(V){let{x:X,y:v}=V(Q.clientX,Q.clientY);R.pointerX=X,R.pointerY=v}else R.pointerX=Q.clientX,R.pointerY=Q.clientY;R.pointerMoved=!0}function r(q){let Q=q;H(Q),R.pointerButtonsDown.delete(Q.button),R.pointerButtonsReleased.push(Q.button)}function L(q,Q){Z.addEventListener(q,Q),F.push(()=>{Z.removeEventListener(q,Q)})}return t("input").withResourceTypes().withLabels().withGroups().install((q)=>{q.addResource("inputState",i),q.addSystem("input-state").setPriority(W).inPhase(G).inGroup(J).setOnInitialize(()=>{L("keydown",s),L("keyup",d),L("pointerdown",o),L("pointermove",n),L("pointerup",r)}).setOnDetach(()=>{for(let Q of F)Q();F.length=0}).setProcess(()=>{Yj(O,f,c),Qj(C,R),U.x=C.pointerX,U.y=C.pointerY,z.x=C.pointerDeltaX,z.y=C.pointerDeltaY,S(g,M,C.keysDown,C.pointerButtonsDown,O);for(let[Q,X]of K){let v=P(Q);S(v,X,C.keysDown,C.pointerButtonsDown,O)}})})}export{Rj as gamepadButtonsOn,Ej as gamepadAxisOn,Kj as createInputPlugin,Cj as createActionBinding};
2
2
 
3
- //# debugId=A6B7FF490EDEEA4864756E2164756E21
3
+ //# debugId=79740F7A05160D2964756E2164756E21
4
4
  //# sourceMappingURL=input.js.map
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/plugins/input/input.ts"],
4
4
  "sourcesContent": [
5
- "/**\n * Input Plugin for ECSpresso\n *\n * Resource-only plugin — input is polled via the `inputState` resource. Provides\n * frame-accurate keyboard, pointer (mouse + touch via PointerEvent), up to 4\n * gamepads, and unified + per-player action maps.\n *\n * Mutation model: DOM events accumulate into `raw` between frames and are\n * flattened once per frame into a stable `frame` object whose Sets are cleared\n * and refilled in place (no per-frame allocations). Gamepads are polled once\n * per frame via `navigator.getGamepads()` (or an injected poll function).\n * Unified and per-player action states ping-pong two Sets (`active` / `prev`)\n * so edge detection costs nothing beyond one `.add()` per active action.\n */\n\nimport { definePlugin, type BasePluginOptions, type Vector2D } from 'ecspresso';\n\n// ==================== Public Types ====================\n\n// Key codes per the UI Events spec (KeyboardEvent.key values)\n// https://developer.mozilla.org/en-US/docs/Web/API/UI_Events/Keyboard_event_key_values\n\ntype LowercaseLetter =\n\t| 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm'\n\t| 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z';\n\ntype Digit = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9';\n\ntype Punctuation =\n\t| '`' | '~' | '!' | '@' | '#' | '$' | '%' | '^' | '&' | '*' | '(' | ')'\n\t| '-' | '_' | '=' | '+' | '[' | '{' | ']' | '}' | '\\\\' | '|'\n\t| ';' | ':' | \"'\" | '\"' | ',' | '<' | '.' | '>' | '/' | '?';\n\ntype ModifierKey =\n\t| 'Alt' | 'AltGraph' | 'CapsLock' | 'Control' | 'Fn' | 'FnLock'\n\t| 'Hyper' | 'Meta' | 'NumLock' | 'ScrollLock' | 'Shift'\n\t| 'Super' | 'Symbol' | 'SymbolLock';\n\ntype WhitespaceKey = 'Enter' | 'Tab' | ' ';\n\ntype NavigationKey =\n\t| `Arrow${'Down' | 'Left' | 'Right' | 'Up'}`\n\t| 'End' | 'Home' | 'PageDown' | 'PageUp';\n\ntype EditingKey =\n\t| 'Backspace' | 'Clear' | 'Copy' | 'CrSel' | 'Cut' | 'Delete'\n\t| 'EraseEof' | 'ExSel' | 'Insert' | 'Paste' | 'Redo' | 'Undo';\n\ntype UIKey =\n\t| 'Accept' | 'Again' | 'Attn' | 'Cancel' | 'ContextMenu' | 'Escape'\n\t| 'Execute' | 'Find' | 'Finish' | 'Help' | 'Pause' | 'Play'\n\t| 'Props' | 'Select' | 'ZoomIn' | 'ZoomOut';\n\ntype DeviceKey =\n\t| 'BrightnessDown' | 'BrightnessUp' | 'Eject' | 'Hibernate'\n\t| 'LogOff' | 'Power' | 'PowerOff' | 'PrintScreen' | 'Standby' | 'WakeUp';\n\ntype IMEKey =\n\t| 'AllCandidates' | 'Alphanumeric' | 'CodeInput' | 'Compose' | 'Convert'\n\t| 'FinalMode' | 'GroupFirst' | 'GroupLast' | 'GroupNext' | 'GroupPrevious'\n\t| 'ModeChange' | 'NextCandidate' | 'NonConvert' | 'PreviousCandidate'\n\t| 'Process' | 'SingleCandidate'\n\t| 'HangulMode' | 'HanjaMode' | 'JunjaMode'\n\t| 'Eisu' | 'Hankaku' | 'Hiragana' | 'HiraganaKatakana' | 'KanaMode'\n\t| 'KanjiMode' | 'Katakana' | 'Romaji' | 'Zenkaku' | 'ZenkakuHankaku';\n\ntype FunctionKey =\n\t| `F${1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24}`\n\t| 'Soft1' | 'Soft2' | 'Soft3' | 'Soft4';\n\ntype PhoneKey =\n\t| 'AppSwitch' | 'Call' | 'Camera' | 'CameraFocus' | 'EndCall'\n\t| 'GoBack' | 'GoHome' | 'HeadsetHook' | 'LastNumberRedial'\n\t| 'Notification' | 'MannerMode' | 'VoiceDial';\n\ntype MultimediaKey =\n\t| 'ChannelDown' | 'ChannelUp'\n\t| `Media${\n\t\t'FastForward' | 'Pause' | 'Play' | 'PlayPause'\n\t\t| 'Record' | 'Rewind' | 'Stop' | 'TrackNext' | 'TrackPrevious'\n\t}`;\n\ntype AudioKey =\n\t| `Audio${\n\t\t'BalanceLeft' | 'BalanceRight' | 'BassDown' | 'BassBoostDown'\n\t\t| 'BassBoostToggle' | 'BassBoostUp' | 'BassUp' | 'FaderFront' | 'FaderRear'\n\t\t| 'SurroundModeNext' | 'TrebleDown' | 'TrebleUp'\n\t\t| 'VolumeDown' | 'VolumeMute' | 'VolumeUp'\n\t}`\n\t| `Microphone${'Toggle' | 'VolumeDown' | 'VolumeMute' | 'VolumeUp'}`;\n\ntype TVKey =\n\t| 'TV'\n\t| `TV${\n\t\t'3DMode' | 'AntennaCable' | 'AudioDescription' | 'AudioDescriptionMixDown'\n\t\t| 'AudioDescriptionMixUp' | 'ContentsMenu' | 'DataService' | 'Input'\n\t\t| 'InputComponent1' | 'InputComponent2' | 'InputComposite1' | 'InputComposite2'\n\t\t| 'InputHDMI1' | 'InputHDMI2' | 'InputHDMI3' | 'InputHDMI4' | 'InputVGA1'\n\t\t| 'MediaContext' | 'Network' | 'NumberEntry' | 'Power' | 'RadioService'\n\t\t| 'Satellite' | 'SatelliteBS' | 'SatelliteCS' | 'SatelliteToggle'\n\t\t| 'TerrestrialAnalog' | 'TerrestrialDigital' | 'Timer'\n\t}`;\n\ntype MediaControllerKey =\n\t| 'AVRInput' | 'AVRPower'\n\t| `Color${'F0Red' | 'F1Green' | 'F2Yellow' | 'F3Blue' | 'F4Grey' | 'F5Brown'}`\n\t| 'ClosedCaptionToggle' | 'Dimmer' | 'DisplaySwap' | 'DVR' | 'Exit'\n\t| `Favorite${'Clear' | 'Recall' | 'Store'}${0 | 1 | 2 | 3}`\n\t| 'Guide' | 'GuideNextDay' | 'GuidePreviousDay' | 'Info' | 'InstantReplay'\n\t| 'Link' | 'ListProgram' | 'LiveContent' | 'Lock'\n\t| `Media${\n\t\t'Apps' | 'AudioTrack' | 'Last' | 'SkipBackward'\n\t\t| 'SkipForward' | 'StepBackward' | 'StepForward' | 'TopMenu'\n\t}`\n\t| `Navigate${'In' | 'Next' | 'Out' | 'Previous'}`\n\t| 'NextFavoriteChannel' | 'NextUserProfile' | 'OnDemand' | 'Pairing'\n\t| `PinP${'Down' | 'Move' | 'Toggle' | 'Up'}`\n\t| `PlaySpeed${'Down' | 'Reset' | 'Up'}`\n\t| 'RandomToggle' | 'RcLowBattery' | 'RecordSpeedNext' | 'RfBypass'\n\t| 'ScanChannelsToggle' | 'ScreenModeNext' | 'Settings' | 'SplitScreenToggle'\n\t| 'STBInput' | 'STBPower' | 'Subtitle' | 'Teletext'\n\t| 'VideoModeNext' | 'Wink' | 'ZoomToggle';\n\ntype SpeechKey = 'SpeechCorrectionList' | 'SpeechInputToggle';\n\ntype DocumentKey =\n\t| 'Close' | 'New' | 'Open' | 'Print' | 'Save' | 'SpellCheck'\n\t| 'MailForward' | 'MailReply' | 'MailSend';\n\ntype LaunchKey = `Launch${\n\t| 'Calculator' | 'Calendar' | 'Contacts' | 'Mail' | 'MediaPlayer'\n\t| 'MusicPlayer' | 'MyComputer' | 'Phone' | 'ScreenSaver' | 'Spreadsheet'\n\t| 'WebBrowser' | 'WebCam' | 'WordProcessor'\n\t| `Application${1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16}`\n}`;\n\ntype BrowserKey = `Browser${'Back' | 'Favorites' | 'Forward' | 'Home' | 'Refresh' | 'Search' | 'Stop'}`;\n\ntype NumpadKey = 'Decimal' | 'Key11' | 'Key12' | 'Multiply' | 'Add' | 'Divide' | 'Subtract' | 'Separator';\n\nexport type KeyCode =\n\t| LowercaseLetter | Uppercase<LowercaseLetter> | Digit | Punctuation\n\t| ModifierKey | WhitespaceKey | NavigationKey | EditingKey | UIKey | DeviceKey\n\t| IMEKey | FunctionKey | PhoneKey | MultimediaKey | AudioKey | TVKey\n\t| MediaControllerKey | SpeechKey | DocumentKey | LaunchKey | BrowserKey | NumpadKey\n\t| 'Unidentified' | 'Dead';\n\nexport interface KeyboardState {\n\tisDown(key: KeyCode): boolean;\n\tjustPressed(key: KeyCode): boolean;\n\tjustReleased(key: KeyCode): boolean;\n}\n\nexport interface PointerState {\n\treadonly position: Readonly<Vector2D>;\n\treadonly delta: Readonly<Vector2D>;\n\tisDown(button: number): boolean;\n\tjustPressed(button: number): boolean;\n\tjustReleased(button: number): boolean;\n}\n\nexport interface GamepadState {\n\treadonly connected: boolean;\n\treadonly id: string | null;\n\tisDown(button: number): boolean;\n\tjustPressed(button: number): boolean;\n\tjustReleased(button: number): boolean;\n\t/** Analog button value in [0, 1]. Useful for triggers. Returns 0 when disconnected or out of range. */\n\tbuttonValue(button: number): number;\n\t/** Deadzone-applied axis value in [-1, 1]. Sticks use radial deadzone on axis pairs (0,1) and (2,3). */\n\taxis(index: number): number;\n\t/** Raw axis value in [-1, 1] with no deadzone applied. */\n\trawAxis(index: number): number;\n}\n\nexport interface ActionState<A extends string = string> {\n\tisActive(action: A): boolean;\n\tjustActivated(action: A): boolean;\n\tjustDeactivated(action: A): boolean;\n}\n\nexport interface PlayerInput<A extends string = string> {\n\treadonly actions: ActionState<A>;\n\tsetActionMap(map: ActionMap<A>): void;\n\tgetActionMap(): Readonly<ActionMap<A>>;\n}\n\nexport interface InputState<A extends string = string> {\n\treadonly keyboard: KeyboardState;\n\treadonly pointer: PointerState;\n\t/** Always length 4 (standard web gamepad slot count). Disconnected slots return `connected: false`. */\n\treadonly gamepads: ReadonlyArray<GamepadState>;\n\t/** Unified action state — fires when any bound input (keyboard, pointer, any pad) is active. Intended for menu/shared input. */\n\treadonly actions: ActionState<A>;\n\tsetActionMap(actions: ActionMap<A>): void;\n\tgetActionMap(): Readonly<ActionMap<A>>;\n\t/** Register or replace a player's action map. Per-player states are isolated from the unified `actions`. */\n\tdefinePlayer(id: string, map: ActionMap<A>): void;\n\t/** Returns true if the player existed and was removed. */\n\tremovePlayer(id: string): boolean;\n\t/** Returns a handle to a registered player's input, or undefined if no such player. */\n\tplayer(id: string): PlayerInput<A> | undefined;\n\tplayerIds(): readonly string[];\n}\n\nexport interface GamepadButtonRef {\n\tpad: number;\n\tbutton: number;\n}\n\nexport interface GamepadAxisRef {\n\tpad: number;\n\taxis: number;\n\t/** Which half of the axis counts as \"active\". */\n\tdirection: 1 | -1;\n\t/** Magnitude at which the axis triggers the action. Applied to the deadzone-adjusted axis value. Default: 0.5. */\n\tthreshold?: number;\n}\n\nexport interface ActionBinding {\n\tkeys?: KeyCode[];\n\t/** Pointer (mouse/touch) button indices — 0 = primary, 1 = auxiliary, 2 = secondary, etc. */\n\tpointerButtons?: number[];\n\tgamepadButtons?: GamepadButtonRef[];\n\tgamepadAxes?: GamepadAxisRef[];\n}\n\nexport type ActionMap<A extends string = string> = Record<A, ActionBinding>;\n\nexport interface InputResourceTypes<A extends string = string> {\n\tinputState: InputState<A>;\n}\n\n/**\n * Minimal gamepad shape required by the injectable poll function. A structural\n * subset of the browser `Gamepad` interface — `navigator.getGamepads()` satisfies\n * it directly, and test doubles can supply just these fields.\n */\nexport interface GamepadLike {\n\tid: string;\n\tconnected: boolean;\n\tbuttons: ReadonlyArray<{ pressed: boolean; value: number }>;\n\taxes: ReadonlyArray<number>;\n}\n\nexport interface GamepadOptions {\n\t/** Radial deadzone applied to stick pairs (axes 0,1 and 2,3). Value in [0, 1]. Default: 0.15. */\n\tdeadzone?: number;\n\t/**\n\t * Custom poll function returning up to 4 gamepad slots. Defaults to `navigator.getGamepads()`.\n\t * Primarily an injection point for tests; in the browser the default is correct.\n\t */\n\tpoll?: () => ReadonlyArray<GamepadLike | null>;\n}\n\nexport interface InputPluginOptions<A extends string = string, G extends string = 'input'> extends BasePluginOptions<G> {\n\t/** Initial unified action map. */\n\tactions?: ActionMap<A>;\n\t/** Initial per-player action maps, keyed by player id. */\n\tplayers?: Record<string, ActionMap<A>>;\n\t/** EventTarget to attach listeners to (default: globalThis). Pass a custom target for testability. */\n\ttarget?: EventTarget;\n\t/** Gamepad polling and deadzone configuration. */\n\tgamepad?: GamepadOptions;\n\t/**\n\t * Optional conversion from raw DOM client coordinates to the space `inputState.pointer.position` should report.\n\t * Renderer-agnostic: wire to `clientToLogical(...)` from renderer2D when using `screenScale`, or to a renderer-specific helper.\n\t * When omitted, pointer coords remain raw `clientX`/`clientY` (not canvas-relative).\n\t */\n\tcoordinateTransform?: (clientX: number, clientY: number) => { x: number; y: number };\n}\n\n// ==================== Helper Functions ====================\n\n/** Create a single action binding. Identity function that provides type inference for inline literals. */\nexport function createActionBinding(binding: ActionBinding): ActionBinding {\n\treturn binding;\n}\n\n/** Build an array of gamepad button refs scoped to one pad — `gamepadButtonsOn(0, 0, 1, 9)` = pad 0's buttons 0, 1, 9. */\nexport function gamepadButtonsOn(pad: number, ...buttons: number[]): GamepadButtonRef[] {\n\treturn buttons.map((button) => ({ pad, button }));\n}\n\n/** Build a gamepad axis ref. `threshold` defaults to 0.5 at activation time. */\nexport function gamepadAxisOn(pad: number, axis: number, direction: 1 | -1, threshold?: number): GamepadAxisRef {\n\treturn threshold === undefined ? { pad, axis, direction } : { pad, axis, direction, threshold };\n}\n\n// ==================== Internal Types ====================\n\ninterface RawKeyPointerState {\n\tkeysDown: Set<string>;\n\tkeysPressed: string[];\n\tkeysReleased: string[];\n\tpointerButtonsDown: Set<number>;\n\tpointerButtonsPressed: number[];\n\tpointerButtonsReleased: number[];\n\tpointerX: number;\n\tpointerY: number;\n\tlastPointerX: number;\n\tlastPointerY: number;\n\tpointerMoved: boolean;\n}\n\n/**\n * Stable per-frame view of keyboard + pointer input. Sets are mutated in place\n * each frame (cleared and refilled from raw), so closures over this object see\n * consistent state throughout a frame without per-frame Set allocation.\n */\ninterface FrameState {\n\tkeysDown: Set<string>;\n\tkeysPressed: Set<string>;\n\tkeysReleased: Set<string>;\n\tpointerButtonsDown: Set<number>;\n\tpointerButtonsPressed: Set<number>;\n\tpointerButtonsReleased: Set<number>;\n\tpointerX: number;\n\tpointerY: number;\n\tpointerDeltaX: number;\n\tpointerDeltaY: number;\n}\n\ninterface PadRuntime {\n\tconnected: boolean;\n\tid: string | null;\n\tbuttonsDown: Set<number>;\n\tbuttonsPrev: Set<number>;\n\tbuttonsPressed: Set<number>;\n\tbuttonsReleased: Set<number>;\n\tbuttonValues: number[];\n\taxes: number[];\n\trawAxes: number[];\n}\n\n/** Two ping-ponged Sets backing an ActionState. Each frame we swap `active` ↔ `prev`, clear the new `active`, and refill. */\ninterface ActionSlot {\n\tactive: Set<string>;\n\tprev: Set<string>;\n}\n\n// ==================== Helpers ====================\n\nconst DEFAULT_AXIS_THRESHOLD = 0.5;\nconst DEFAULT_DEADZONE = 0.15;\nconst PAD_COUNT = 4;\n\nfunction createRawKeyPointerState(): RawKeyPointerState {\n\treturn {\n\t\tkeysDown: new Set(),\n\t\tkeysPressed: [],\n\t\tkeysReleased: [],\n\t\tpointerButtonsDown: new Set(),\n\t\tpointerButtonsPressed: [],\n\t\tpointerButtonsReleased: [],\n\t\tpointerX: 0,\n\t\tpointerY: 0,\n\t\tlastPointerX: 0,\n\t\tlastPointerY: 0,\n\t\tpointerMoved: false,\n\t};\n}\n\nfunction createFrameState(): FrameState {\n\treturn {\n\t\tkeysDown: new Set(),\n\t\tkeysPressed: new Set(),\n\t\tkeysReleased: new Set(),\n\t\tpointerButtonsDown: new Set(),\n\t\tpointerButtonsPressed: new Set(),\n\t\tpointerButtonsReleased: new Set(),\n\t\tpointerX: 0,\n\t\tpointerY: 0,\n\t\tpointerDeltaX: 0,\n\t\tpointerDeltaY: 0,\n\t};\n}\n\nfunction createPadRuntime(): PadRuntime {\n\treturn {\n\t\tconnected: false,\n\t\tid: null,\n\t\tbuttonsDown: new Set(),\n\t\tbuttonsPrev: new Set(),\n\t\tbuttonsPressed: new Set(),\n\t\tbuttonsReleased: new Set(),\n\t\tbuttonValues: [],\n\t\taxes: [],\n\t\trawAxes: [],\n\t};\n}\n\nfunction createActionSlot(): ActionSlot {\n\treturn { active: new Set(), prev: new Set() };\n}\n\nfunction refillSet<T>(dest: Set<T>, source: Iterable<T>): void {\n\tdest.clear();\n\tfor (const item of source) dest.add(item);\n}\n\nfunction updateFrameStateFromRaw(frame: FrameState, raw: RawKeyPointerState): void {\n\trefillSet(frame.keysDown, raw.keysDown);\n\trefillSet(frame.keysPressed, raw.keysPressed);\n\trefillSet(frame.keysReleased, raw.keysReleased);\n\trefillSet(frame.pointerButtonsDown, raw.pointerButtonsDown);\n\trefillSet(frame.pointerButtonsPressed, raw.pointerButtonsPressed);\n\trefillSet(frame.pointerButtonsReleased, raw.pointerButtonsReleased);\n\n\tframe.pointerDeltaX = raw.pointerMoved ? raw.pointerX - raw.lastPointerX : 0;\n\tframe.pointerDeltaY = raw.pointerMoved ? raw.pointerY - raw.lastPointerY : 0;\n\tframe.pointerX = raw.pointerX;\n\tframe.pointerY = raw.pointerY;\n\n\traw.keysPressed.length = 0;\n\traw.keysReleased.length = 0;\n\traw.pointerButtonsPressed.length = 0;\n\traw.pointerButtonsReleased.length = 0;\n\traw.lastPointerX = raw.pointerX;\n\traw.lastPointerY = raw.pointerY;\n\traw.pointerMoved = false;\n}\n\nfunction defaultPoll(out: Array<GamepadLike | null>): () => ReadonlyArray<GamepadLike | null> {\n\treturn () => {\n\t\tif (typeof navigator === 'undefined' || typeof navigator.getGamepads !== 'function') {\n\t\t\tfor (let i = 0; i < out.length; i++) out[i] = null;\n\t\t\treturn out;\n\t\t}\n\t\tconst pads = navigator.getGamepads();\n\t\tfor (let i = 0; i < out.length; i++) out[i] = pads[i] ?? null;\n\t\treturn out;\n\t};\n}\n\nfunction applyStickDeadzone(x: number, y: number, deadzone: number, out: number[], baseIndex: number): void {\n\tconst mag = Math.sqrt(x * x + y * y);\n\tif (mag < deadzone) {\n\t\tout[baseIndex] = 0;\n\t\tout[baseIndex + 1] = 0;\n\t\treturn;\n\t}\n\tconst scaled = Math.min((mag - deadzone) / (1 - deadzone), 1);\n\tout[baseIndex] = (x / mag) * scaled;\n\tout[baseIndex + 1] = (y / mag) * scaled;\n}\n\nfunction applyAxisDeadzoning(rawAxes: number[], axes: number[], deadzone: number): void {\n\taxes.length = rawAxes.length;\n\tif (rawAxes.length >= 2) {\n\t\tapplyStickDeadzone(rawAxes[0] ?? 0, rawAxes[1] ?? 0, deadzone, axes, 0);\n\t}\n\tif (rawAxes.length >= 4) {\n\t\tapplyStickDeadzone(rawAxes[2] ?? 0, rawAxes[3] ?? 0, deadzone, axes, 2);\n\t}\n\t// Axes beyond the two standard sticks pass through with no deadzone (triggers, dpad-as-axis, etc.)\n\tfor (let i = 4; i < rawAxes.length; i++) {\n\t\taxes[i] = rawAxes[i] ?? 0;\n\t}\n}\n\nfunction pollGamepadsInto(pads: PadRuntime[], pollFn: () => ReadonlyArray<GamepadLike | null>, deadzone: number): void {\n\tconst polled = pollFn();\n\tfor (let i = 0; i < PAD_COUNT; i++) {\n\t\tconst pad = polled[i] ?? null;\n\t\tconst state = pads[i];\n\t\tif (!state) continue;\n\n\t\t// Rotate button sets using the existing `prev` set as scratch, then clear what we'll refill.\n\t\tconst reusedPrev = state.buttonsPrev;\n\t\trefillSet(reusedPrev, state.buttonsDown);\n\t\tstate.buttonsDown.clear();\n\t\tstate.buttonsPressed.clear();\n\t\tstate.buttonsReleased.clear();\n\n\t\tif (!pad || !pad.connected) {\n\t\t\tif (state.connected) {\n\t\t\t\t// Newly disconnected: synthesize justReleased for anything that was held, then clear values.\n\t\t\t\tfor (const b of reusedPrev) state.buttonsReleased.add(b);\n\t\t\t\tstate.connected = false;\n\t\t\t\tstate.id = null;\n\t\t\t\tstate.buttonValues.length = 0;\n\t\t\t\tstate.axes.length = 0;\n\t\t\t\tstate.rawAxes.length = 0;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tstate.connected = true;\n\t\tstate.id = pad.id;\n\n\t\tstate.buttonValues.length = pad.buttons.length;\n\t\tfor (let b = 0; b < pad.buttons.length; b++) {\n\t\t\tconst info = pad.buttons[b];\n\t\t\tif (!info) {\n\t\t\t\tstate.buttonValues[b] = 0;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tstate.buttonValues[b] = info.value;\n\t\t\tif (info.pressed) state.buttonsDown.add(b);\n\t\t}\n\n\t\tfor (const b of state.buttonsDown) {\n\t\t\tif (!reusedPrev.has(b)) state.buttonsPressed.add(b);\n\t\t}\n\t\tfor (const b of reusedPrev) {\n\t\t\tif (!state.buttonsDown.has(b)) state.buttonsReleased.add(b);\n\t\t}\n\n\t\tstate.rawAxes.length = pad.axes.length;\n\t\tfor (let a = 0; a < pad.axes.length; a++) {\n\t\t\tstate.rawAxes[a] = pad.axes[a] ?? 0;\n\t\t}\n\t\tapplyAxisDeadzoning(state.rawAxes, state.axes, deadzone);\n\t}\n}\n\nfunction isBindingActive(\n\tbinding: ActionBinding,\n\tkeysDown: ReadonlySet<string>,\n\tpointerButtonsDown: ReadonlySet<number>,\n\tpads: ReadonlyArray<PadRuntime>,\n): boolean {\n\tif (binding.keys?.some((k) => keysDown.has(k))) return true;\n\tif (binding.pointerButtons?.some((b) => pointerButtonsDown.has(b))) return true;\n\tif (binding.gamepadButtons?.some(({ pad, button }) => pads[pad]?.buttonsDown.has(button) ?? false)) return true;\n\tif (binding.gamepadAxes?.some(({ pad, axis, direction, threshold = DEFAULT_AXIS_THRESHOLD }) => {\n\t\tconst value = pads[pad]?.axes[axis] ?? 0;\n\t\treturn direction > 0 ? value > threshold : value < -threshold;\n\t})) return true;\n\treturn false;\n}\n\n/**\n * Recompute the slot's `active` set in place from `map` against current input sources.\n * Rotates `active` ↔ `prev` (reusing Set instances) so edge detection works with no allocations.\n */\nfunction advanceActionSlot(\n\tslot: ActionSlot,\n\tmap: ActionMap,\n\tkeysDown: ReadonlySet<string>,\n\tpointerButtonsDown: ReadonlySet<number>,\n\tpads: ReadonlyArray<PadRuntime>,\n): void {\n\tconst nextActive = slot.prev;\n\tslot.prev = slot.active;\n\tslot.active = nextActive;\n\tnextActive.clear();\n\n\tfor (const [name, binding] of Object.entries(map)) {\n\t\tif (isBindingActive(binding, keysDown, pointerButtonsDown, pads)) nextActive.add(name);\n\t}\n}\n\nfunction makeActionState<A extends string>(slot: ActionSlot): ActionState<A> {\n\treturn {\n\t\tisActive: (action) => slot.active.has(action),\n\t\tjustActivated: (action) => slot.active.has(action) && !slot.prev.has(action),\n\t\tjustDeactivated: (action) => !slot.active.has(action) && slot.prev.has(action),\n\t};\n}\n\n// ==================== Plugin Factory ====================\n\n/**\n * Create an input plugin for ECSpresso.\n *\n * Provides:\n * - Frame-accurate keyboard state (isDown, justPressed, justReleased)\n * - Pointer position/delta and button state (mouse + touch via PointerEvent)\n * - Up to 4 gamepads polled per frame, with radial deadzone on sticks and analog button values\n * - Unified action mapping (keyboard + pointer + any pad)\n * - Per-player action maps for local co-op (`definePlayer`, `player(id)`)\n * - Automatic listener cleanup on detach\n *\n * @example\n * ```typescript\n * const ecs = ECSpresso.create()\n * .withPlugin(createInputPlugin({\n * actions: {\n * jump: { keys: [' ', 'ArrowUp'], gamepadButtons: [{ pad: 0, button: 0 }] },\n * shoot: { keys: ['z'], pointerButtons: [0] },\n * },\n * players: {\n * p1: { jump: { keys: [' '] }, shoot: { keys: ['z'] } },\n * p2: {\n * jump: { gamepadButtons: gamepadButtonsOn(0, 0) },\n * shoot: { gamepadButtons: gamepadButtonsOn(0, 2) },\n * },\n * },\n * }))\n * .build();\n *\n * const input = ecs.getResource('inputState');\n * if (input.actions.justActivated('jump')) { ... } // any source\n * if (input.player('p1')?.actions.isActive('jump')) { ... } // just player 1\n * if (input.gamepads[0].isDown(0)) { ... } // raw pad 0 A-button\n * ```\n */\nexport function createInputPlugin<A extends string = string, G extends string = 'input'>(\n\toptions?: InputPluginOptions<A, G>\n) {\n\tconst {\n\t\tsystemGroup = 'input',\n\t\tpriority = 100,\n\t\tphase = 'preUpdate',\n\t\ttarget = globalThis,\n\t\tgamepad: gamepadOpts = {},\n\t\tcoordinateTransform,\n\t} = options ?? {};\n\n\t// Construction-time casts: option defaults of `{}` don't structurally satisfy a narrow `ActionMap<A>`,\n\t// but at this boundary we know the user either supplied a valid map or is using A = string.\n\tconst unifiedActionMap = { ...(options?.actions ?? {}) } as ActionMap<A>;\n\tconst playerMaps = new Map<string, ActionMap<A>>(\n\t\tObject.entries(options?.players ?? {}) as Array<[string, ActionMap<A>]>,\n\t);\n\n\tconst deadzone = gamepadOpts.deadzone ?? DEFAULT_DEADZONE;\n\tconst pollFn = gamepadOpts.poll ?? defaultPoll(new Array<GamepadLike | null>(PAD_COUNT).fill(null));\n\n\tconst raw = createRawKeyPointerState();\n\tconst frame = createFrameState();\n\tconst pads: PadRuntime[] = Array.from({ length: PAD_COUNT }, createPadRuntime);\n\tconst unifiedSlot = createActionSlot();\n\tconst playerSlots = new Map<string, ActionSlot>();\n\tconst playerHandles = new Map<string, PlayerInput<A>>();\n\tconst cleanupFns: Array<() => void> = [];\n\n\t// Vector2Ds exposed via the resource — updated in place each frame.\n\tconst position: Vector2D = { x: 0, y: 0 };\n\tconst delta: Vector2D = { x: 0, y: 0 };\n\n\tlet currentUnifiedMap = unifiedActionMap;\n\n\tconst keyboard: KeyboardState = {\n\t\tisDown: (key) => frame.keysDown.has(key),\n\t\tjustPressed: (key) => frame.keysPressed.has(key),\n\t\tjustReleased: (key) => frame.keysReleased.has(key),\n\t};\n\n\tconst pointer: PointerState = {\n\t\tposition,\n\t\tdelta,\n\t\tisDown: (button) => frame.pointerButtonsDown.has(button),\n\t\tjustPressed: (button) => frame.pointerButtonsPressed.has(button),\n\t\tjustReleased: (button) => frame.pointerButtonsReleased.has(button),\n\t};\n\n\tfunction makeGamepadState(index: number): GamepadState {\n\t\tconst state = pads[index];\n\t\tif (!state) throw new Error(`Invalid gamepad index: ${index}`);\n\t\treturn {\n\t\t\tget connected() { return state.connected; },\n\t\t\tget id() { return state.id; },\n\t\t\tisDown: (button) => state.buttonsDown.has(button),\n\t\t\tjustPressed: (button) => state.buttonsPressed.has(button),\n\t\t\tjustReleased: (button) => state.buttonsReleased.has(button),\n\t\t\tbuttonValue: (button) => state.buttonValues[button] ?? 0,\n\t\t\taxis: (index) => state.axes[index] ?? 0,\n\t\t\trawAxis: (index) => state.rawAxes[index] ?? 0,\n\t\t};\n\t}\n\n\tconst gamepadStates: ReadonlyArray<GamepadState> = Array.from({ length: PAD_COUNT }, (_, i) => makeGamepadState(i));\n\n\tconst unifiedActions = makeActionState<A>(unifiedSlot);\n\n\tfunction ensurePlayerSlot(id: string): ActionSlot {\n\t\tconst existing = playerSlots.get(id);\n\t\tif (existing) return existing;\n\t\tconst slot = createActionSlot();\n\t\tplayerSlots.set(id, slot);\n\t\treturn slot;\n\t}\n\n\tfunction createPlayerHandle(id: string): PlayerInput<A> {\n\t\tconst slot = ensurePlayerSlot(id);\n\t\treturn {\n\t\t\tactions: makeActionState<A>(slot),\n\t\t\tsetActionMap: (map) => {\n\t\t\t\tif (!playerMaps.has(id)) throw new Error(`Player '${id}' was removed`);\n\t\t\t\tplayerMaps.set(id, { ...map });\n\t\t\t},\n\t\t\tgetActionMap: () => {\n\t\t\t\tconst map = playerMaps.get(id);\n\t\t\t\tif (!map) throw new Error(`Player '${id}' was removed`);\n\t\t\t\treturn { ...map };\n\t\t\t},\n\t\t};\n\t}\n\n\tfor (const id of playerMaps.keys()) {\n\t\tplayerHandles.set(id, createPlayerHandle(id));\n\t}\n\n\tconst inputState: InputState<A> = {\n\t\tkeyboard,\n\t\tpointer,\n\t\tgamepads: gamepadStates,\n\t\tactions: unifiedActions,\n\t\tsetActionMap(newMap) {\n\t\t\tcurrentUnifiedMap = { ...newMap };\n\t\t},\n\t\tgetActionMap() {\n\t\t\treturn { ...currentUnifiedMap };\n\t\t},\n\t\tdefinePlayer(id, map) {\n\t\t\tplayerMaps.set(id, { ...map });\n\t\t\tif (!playerHandles.has(id)) playerHandles.set(id, createPlayerHandle(id));\n\t\t},\n\t\tremovePlayer(id) {\n\t\t\tconst existed = playerMaps.delete(id);\n\t\t\tplayerHandles.delete(id);\n\t\t\tplayerSlots.delete(id);\n\t\t\treturn existed;\n\t\t},\n\t\tplayer(id) {\n\t\t\treturn playerHandles.get(id);\n\t\t},\n\t\tplayerIds() {\n\t\t\treturn Array.from(playerMaps.keys());\n\t\t},\n\t};\n\n\tfunction onKeyDown(e: Event) {\n\t\tconst ke = e as KeyboardEvent;\n\t\tif (ke.repeat) return;\n\t\traw.keysDown.add(ke.key);\n\t\traw.keysPressed.push(ke.key);\n\t}\n\n\tfunction onKeyUp(e: Event) {\n\t\tconst ke = e as KeyboardEvent;\n\t\traw.keysDown.delete(ke.key);\n\t\traw.keysReleased.push(ke.key);\n\t}\n\n\tfunction onPointerDown(e: Event) {\n\t\tconst pe = e as PointerEvent;\n\t\traw.pointerButtonsDown.add(pe.button);\n\t\traw.pointerButtonsPressed.push(pe.button);\n\t}\n\n\tfunction onPointerMove(e: Event) {\n\t\tconst pe = e as PointerEvent;\n\t\tif (coordinateTransform) {\n\t\t\tconst { x, y } = coordinateTransform(pe.clientX, pe.clientY);\n\t\t\traw.pointerX = x;\n\t\t\traw.pointerY = y;\n\t\t} else {\n\t\t\traw.pointerX = pe.clientX;\n\t\t\traw.pointerY = pe.clientY;\n\t\t}\n\t\traw.pointerMoved = true;\n\t}\n\n\tfunction onPointerUp(e: Event) {\n\t\tconst pe = e as PointerEvent;\n\t\traw.pointerButtonsDown.delete(pe.button);\n\t\traw.pointerButtonsReleased.push(pe.button);\n\t}\n\n\tfunction addListener(type: string, handler: (e: Event) => void) {\n\t\ttarget.addEventListener(type, handler);\n\t\tcleanupFns.push(() => { target.removeEventListener(type, handler); });\n\t}\n\n\treturn definePlugin('input')\n\t\t.withResourceTypes<InputResourceTypes<A>>()\n\t\t.withLabels<'input-state'>()\n\t\t.withGroups<G>()\n\t\t.install((world) => {\n\t\t\tworld.addResource('inputState', inputState);\n\n\t\t\tworld\n\t\t\t\t.addSystem('input-state')\n\t\t\t\t.setPriority(priority)\n\t\t\t\t.inPhase(phase)\n\t\t\t\t.inGroup(systemGroup)\n\t\t\t\t.setOnInitialize(() => {\n\t\t\t\t\taddListener('keydown', onKeyDown);\n\t\t\t\t\taddListener('keyup', onKeyUp);\n\t\t\t\t\taddListener('pointerdown', onPointerDown);\n\t\t\t\t\taddListener('pointermove', onPointerMove);\n\t\t\t\t\taddListener('pointerup', onPointerUp);\n\t\t\t\t})\n\t\t\t\t.setOnDetach(() => {\n\t\t\t\t\tfor (const cleanup of cleanupFns) cleanup();\n\t\t\t\t\tcleanupFns.length = 0;\n\t\t\t\t})\n\t\t\t\t.setProcess(() => {\n\t\t\t\t\t// Pads must be polled before action computation so a single frame reflects\n\t\t\t\t\t// both DOM-driven (keyboard/pointer) and polled (gamepad) sources consistently.\n\t\t\t\t\tpollGamepadsInto(pads, pollFn, deadzone);\n\t\t\t\t\tupdateFrameStateFromRaw(frame, raw);\n\n\t\t\t\t\tposition.x = frame.pointerX;\n\t\t\t\t\tposition.y = frame.pointerY;\n\t\t\t\t\tdelta.x = frame.pointerDeltaX;\n\t\t\t\t\tdelta.y = frame.pointerDeltaY;\n\n\t\t\t\t\tadvanceActionSlot(unifiedSlot, currentUnifiedMap, frame.keysDown, frame.pointerButtonsDown, pads);\n\t\t\t\t\tfor (const [id, map] of playerMaps) {\n\t\t\t\t\t\tconst slot = ensurePlayerSlot(id);\n\t\t\t\t\t\tadvanceActionSlot(slot, map, frame.keysDown, frame.pointerButtonsDown, pads);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t});\n}\n"
5
+ "/**\n * Input Plugin for ECSpresso\n *\n * Resource-only plugin — input is polled via the `inputState` resource. Provides\n * frame-accurate keyboard, pointer (mouse + touch via PointerEvent), up to 4\n * gamepads, and unified + per-player action maps.\n *\n * Mutation model: DOM events accumulate into `raw` between frames and are\n * flattened once per frame into a stable `frame` object whose Sets are cleared\n * and refilled in place (no per-frame allocations). Gamepads are polled once\n * per frame via `navigator.getGamepads()` (or an injected poll function).\n * Unified and per-player action states ping-pong two Sets (`active` / `prev`)\n * so edge detection costs nothing beyond one `.add()` per active action.\n */\n\nimport { definePlugin, type BasePluginOptions, type Vector2D } from 'ecspresso';\n\n// ==================== Public Types ====================\n\n// Key codes per the UI Events spec (KeyboardEvent.key values)\n// https://developer.mozilla.org/en-US/docs/Web/API/UI_Events/Keyboard_event_key_values\n\ntype LowercaseLetter =\n\t| 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm'\n\t| 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z';\n\ntype Digit = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9';\n\ntype Punctuation =\n\t| '`' | '~' | '!' | '@' | '#' | '$' | '%' | '^' | '&' | '*' | '(' | ')'\n\t| '-' | '_' | '=' | '+' | '[' | '{' | ']' | '}' | '\\\\' | '|'\n\t| ';' | ':' | \"'\" | '\"' | ',' | '<' | '.' | '>' | '/' | '?';\n\ntype ModifierKey =\n\t| 'Alt' | 'AltGraph' | 'CapsLock' | 'Control' | 'Fn' | 'FnLock'\n\t| 'Hyper' | 'Meta' | 'NumLock' | 'ScrollLock' | 'Shift'\n\t| 'Super' | 'Symbol' | 'SymbolLock';\n\ntype WhitespaceKey = 'Enter' | 'Tab' | ' ';\n\ntype NavigationKey =\n\t| `Arrow${'Down' | 'Left' | 'Right' | 'Up'}`\n\t| 'End' | 'Home' | 'PageDown' | 'PageUp';\n\ntype EditingKey =\n\t| 'Backspace' | 'Clear' | 'Copy' | 'CrSel' | 'Cut' | 'Delete'\n\t| 'EraseEof' | 'ExSel' | 'Insert' | 'Paste' | 'Redo' | 'Undo';\n\ntype UIKey =\n\t| 'Accept' | 'Again' | 'Attn' | 'Cancel' | 'ContextMenu' | 'Escape'\n\t| 'Execute' | 'Find' | 'Finish' | 'Help' | 'Pause' | 'Play'\n\t| 'Props' | 'Select' | 'ZoomIn' | 'ZoomOut';\n\ntype DeviceKey =\n\t| 'BrightnessDown' | 'BrightnessUp' | 'Eject' | 'Hibernate'\n\t| 'LogOff' | 'Power' | 'PowerOff' | 'PrintScreen' | 'Standby' | 'WakeUp';\n\ntype IMEKey =\n\t| 'AllCandidates' | 'Alphanumeric' | 'CodeInput' | 'Compose' | 'Convert'\n\t| 'FinalMode' | 'GroupFirst' | 'GroupLast' | 'GroupNext' | 'GroupPrevious'\n\t| 'ModeChange' | 'NextCandidate' | 'NonConvert' | 'PreviousCandidate'\n\t| 'Process' | 'SingleCandidate'\n\t| 'HangulMode' | 'HanjaMode' | 'JunjaMode'\n\t| 'Eisu' | 'Hankaku' | 'Hiragana' | 'HiraganaKatakana' | 'KanaMode'\n\t| 'KanjiMode' | 'Katakana' | 'Romaji' | 'Zenkaku' | 'ZenkakuHankaku';\n\ntype FunctionKey =\n\t| `F${1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24}`\n\t| 'Soft1' | 'Soft2' | 'Soft3' | 'Soft4';\n\ntype PhoneKey =\n\t| 'AppSwitch' | 'Call' | 'Camera' | 'CameraFocus' | 'EndCall'\n\t| 'GoBack' | 'GoHome' | 'HeadsetHook' | 'LastNumberRedial'\n\t| 'Notification' | 'MannerMode' | 'VoiceDial';\n\ntype MultimediaKey =\n\t| 'ChannelDown' | 'ChannelUp'\n\t| `Media${\n\t\t'FastForward' | 'Pause' | 'Play' | 'PlayPause'\n\t\t| 'Record' | 'Rewind' | 'Stop' | 'TrackNext' | 'TrackPrevious'\n\t}`;\n\ntype AudioKey =\n\t| `Audio${\n\t\t'BalanceLeft' | 'BalanceRight' | 'BassDown' | 'BassBoostDown'\n\t\t| 'BassBoostToggle' | 'BassBoostUp' | 'BassUp' | 'FaderFront' | 'FaderRear'\n\t\t| 'SurroundModeNext' | 'TrebleDown' | 'TrebleUp'\n\t\t| 'VolumeDown' | 'VolumeMute' | 'VolumeUp'\n\t}`\n\t| `Microphone${'Toggle' | 'VolumeDown' | 'VolumeMute' | 'VolumeUp'}`;\n\ntype TVKey =\n\t| 'TV'\n\t| `TV${\n\t\t'3DMode' | 'AntennaCable' | 'AudioDescription' | 'AudioDescriptionMixDown'\n\t\t| 'AudioDescriptionMixUp' | 'ContentsMenu' | 'DataService' | 'Input'\n\t\t| 'InputComponent1' | 'InputComponent2' | 'InputComposite1' | 'InputComposite2'\n\t\t| 'InputHDMI1' | 'InputHDMI2' | 'InputHDMI3' | 'InputHDMI4' | 'InputVGA1'\n\t\t| 'MediaContext' | 'Network' | 'NumberEntry' | 'Power' | 'RadioService'\n\t\t| 'Satellite' | 'SatelliteBS' | 'SatelliteCS' | 'SatelliteToggle'\n\t\t| 'TerrestrialAnalog' | 'TerrestrialDigital' | 'Timer'\n\t}`;\n\ntype MediaControllerKey =\n\t| 'AVRInput' | 'AVRPower'\n\t| `Color${'F0Red' | 'F1Green' | 'F2Yellow' | 'F3Blue' | 'F4Grey' | 'F5Brown'}`\n\t| 'ClosedCaptionToggle' | 'Dimmer' | 'DisplaySwap' | 'DVR' | 'Exit'\n\t| `Favorite${'Clear' | 'Recall' | 'Store'}${0 | 1 | 2 | 3}`\n\t| 'Guide' | 'GuideNextDay' | 'GuidePreviousDay' | 'Info' | 'InstantReplay'\n\t| 'Link' | 'ListProgram' | 'LiveContent' | 'Lock'\n\t| `Media${\n\t\t'Apps' | 'AudioTrack' | 'Last' | 'SkipBackward'\n\t\t| 'SkipForward' | 'StepBackward' | 'StepForward' | 'TopMenu'\n\t}`\n\t| `Navigate${'In' | 'Next' | 'Out' | 'Previous'}`\n\t| 'NextFavoriteChannel' | 'NextUserProfile' | 'OnDemand' | 'Pairing'\n\t| `PinP${'Down' | 'Move' | 'Toggle' | 'Up'}`\n\t| `PlaySpeed${'Down' | 'Reset' | 'Up'}`\n\t| 'RandomToggle' | 'RcLowBattery' | 'RecordSpeedNext' | 'RfBypass'\n\t| 'ScanChannelsToggle' | 'ScreenModeNext' | 'Settings' | 'SplitScreenToggle'\n\t| 'STBInput' | 'STBPower' | 'Subtitle' | 'Teletext'\n\t| 'VideoModeNext' | 'Wink' | 'ZoomToggle';\n\ntype SpeechKey = 'SpeechCorrectionList' | 'SpeechInputToggle';\n\ntype DocumentKey =\n\t| 'Close' | 'New' | 'Open' | 'Print' | 'Save' | 'SpellCheck'\n\t| 'MailForward' | 'MailReply' | 'MailSend';\n\ntype LaunchKey = `Launch${\n\t| 'Calculator' | 'Calendar' | 'Contacts' | 'Mail' | 'MediaPlayer'\n\t| 'MusicPlayer' | 'MyComputer' | 'Phone' | 'ScreenSaver' | 'Spreadsheet'\n\t| 'WebBrowser' | 'WebCam' | 'WordProcessor'\n\t| `Application${1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16}`\n}`;\n\ntype BrowserKey = `Browser${'Back' | 'Favorites' | 'Forward' | 'Home' | 'Refresh' | 'Search' | 'Stop'}`;\n\ntype NumpadKey = 'Decimal' | 'Key11' | 'Key12' | 'Multiply' | 'Add' | 'Divide' | 'Subtract' | 'Separator';\n\nexport type KeyCode =\n\t| LowercaseLetter | Uppercase<LowercaseLetter> | Digit | Punctuation\n\t| ModifierKey | WhitespaceKey | NavigationKey | EditingKey | UIKey | DeviceKey\n\t| IMEKey | FunctionKey | PhoneKey | MultimediaKey | AudioKey | TVKey\n\t| MediaControllerKey | SpeechKey | DocumentKey | LaunchKey | BrowserKey | NumpadKey\n\t| 'Unidentified' | 'Dead';\n\nexport interface KeyboardState {\n\tisDown(key: KeyCode): boolean;\n\tjustPressed(key: KeyCode): boolean;\n\tjustReleased(key: KeyCode): boolean;\n}\n\nexport interface PointerState {\n\treadonly position: Readonly<Vector2D>;\n\treadonly delta: Readonly<Vector2D>;\n\tisDown(button: number): boolean;\n\tjustPressed(button: number): boolean;\n\tjustReleased(button: number): boolean;\n}\n\nexport interface GamepadState {\n\treadonly connected: boolean;\n\treadonly id: string | null;\n\tisDown(button: number): boolean;\n\tjustPressed(button: number): boolean;\n\tjustReleased(button: number): boolean;\n\t/** Analog button value in [0, 1]. Useful for triggers. Returns 0 when disconnected or out of range. */\n\tbuttonValue(button: number): number;\n\t/** Deadzone-applied axis value in [-1, 1]. Sticks use radial deadzone on axis pairs (0,1) and (2,3). */\n\taxis(index: number): number;\n\t/** Raw axis value in [-1, 1] with no deadzone applied. */\n\trawAxis(index: number): number;\n}\n\nexport interface ActionState<A extends string = string> {\n\tisActive(action: A): boolean;\n\tjustActivated(action: A): boolean;\n\tjustDeactivated(action: A): boolean;\n}\n\nexport interface PlayerInput<A extends string = string> {\n\treadonly actions: ActionState<A>;\n\tsetActionMap(map: ActionMap<A>): void;\n\tgetActionMap(): Readonly<ActionMap<A>>;\n}\n\nexport interface InputState<A extends string = string> {\n\treadonly keyboard: KeyboardState;\n\treadonly pointer: PointerState;\n\t/** Always length 4 (standard web gamepad slot count). Disconnected slots return `connected: false`. */\n\treadonly gamepads: ReadonlyArray<GamepadState>;\n\t/** Unified action state — fires when any bound input (keyboard, pointer, any pad) is active. Intended for menu/shared input. */\n\treadonly actions: ActionState<A>;\n\tsetActionMap(actions: ActionMap<A>): void;\n\tgetActionMap(): Readonly<ActionMap<A>>;\n\t/** Register or replace a player's action map. Per-player states are isolated from the unified `actions`. */\n\tdefinePlayer(id: string, map: ActionMap<A>): void;\n\t/** Returns true if the player existed and was removed. */\n\tremovePlayer(id: string): boolean;\n\t/** Returns a handle to a registered player's input, or undefined if no such player. */\n\tplayer(id: string): PlayerInput<A> | undefined;\n\tplayerIds(): readonly string[];\n}\n\nexport interface GamepadButtonRef {\n\tpad: number;\n\tbutton: number;\n}\n\nexport interface GamepadAxisRef {\n\tpad: number;\n\taxis: number;\n\t/** Which half of the axis counts as \"active\". */\n\tdirection: 1 | -1;\n\t/** Magnitude at which the axis triggers the action. Applied to the deadzone-adjusted axis value. Default: 0.5. */\n\tthreshold?: number;\n}\n\nexport interface ActionBinding {\n\tkeys?: KeyCode[];\n\t/** Pointer (mouse/touch) button indices — 0 = primary, 1 = auxiliary, 2 = secondary, etc. */\n\tpointerButtons?: number[];\n\tgamepadButtons?: GamepadButtonRef[];\n\tgamepadAxes?: GamepadAxisRef[];\n}\n\nexport type ActionMap<A extends string = string> = Record<A, ActionBinding>;\n\nexport interface InputResourceTypes<A extends string = string> {\n\tinputState: InputState<A>;\n}\n\n/**\n * Minimal gamepad shape required by the injectable poll function. A structural\n * subset of the browser `Gamepad` interface — `navigator.getGamepads()` satisfies\n * it directly, and test doubles can supply just these fields.\n */\nexport interface GamepadLike {\n\tid: string;\n\tconnected: boolean;\n\tbuttons: ReadonlyArray<{ pressed: boolean; value: number }>;\n\taxes: ReadonlyArray<number>;\n}\n\nexport interface GamepadOptions {\n\t/** Radial deadzone applied to stick pairs (axes 0,1 and 2,3). Value in [0, 1]. Default: 0.15. */\n\tdeadzone?: number;\n\t/**\n\t * Custom poll function returning up to 4 gamepad slots. Defaults to `navigator.getGamepads()`.\n\t * Primarily an injection point for tests; in the browser the default is correct.\n\t */\n\tpoll?: () => ReadonlyArray<GamepadLike | null>;\n}\n\nexport interface InputPluginOptions<A extends string = string, G extends string = 'input'> extends BasePluginOptions<G> {\n\t/** Initial unified action map. */\n\tactions?: ActionMap<A>;\n\t/** Initial per-player action maps, keyed by player id. */\n\tplayers?: Record<string, ActionMap<A>>;\n\t/** EventTarget to attach listeners to (default: globalThis). Pass a custom target for testability. */\n\ttarget?: EventTarget;\n\t/** Gamepad polling and deadzone configuration. */\n\tgamepad?: GamepadOptions;\n\t/**\n\t * Optional conversion from raw DOM client coordinates to the space `inputState.pointer.position` should report.\n\t * Renderer-agnostic: wire to `clientToLogical(...)` from renderer2D when using `screenScale`, or to a renderer-specific helper.\n\t * When omitted, pointer coords remain raw `clientX`/`clientY` (not canvas-relative).\n\t */\n\tcoordinateTransform?: (clientX: number, clientY: number) => { x: number; y: number };\n\t/**\n\t * Keys whose browser default behaviour should be suppressed (e.g. `['Tab', ' ', 'ArrowDown']`).\n\t * Ignored when `shouldPreventDefault` is provided.\n\t */\n\tpreventDefaultKeys?: KeyCode[];\n\t/**\n\t * Pointer button indices whose browser default behaviour should be suppressed (e.g. `[0, 2]`).\n\t * Ignored when `shouldPreventDefault` is provided.\n\t */\n\tpreventDefaultPointerButtons?: number[];\n\t/**\n\t * Custom predicate for full control over `preventDefault`. Receives the raw DOM event and returns\n\t * `true` to suppress its default behaviour. When provided, `preventDefaultKeys` and\n\t * `preventDefaultPointerButtons` are ignored.\n\t */\n\tshouldPreventDefault?: (event: KeyboardEvent | PointerEvent) => boolean;\n}\n\n// ==================== Helper Functions ====================\n\n/** Create a single action binding. Identity function that provides type inference for inline literals. */\nexport function createActionBinding(binding: ActionBinding): ActionBinding {\n\treturn binding;\n}\n\n/** Build an array of gamepad button refs scoped to one pad — `gamepadButtonsOn(0, 0, 1, 9)` = pad 0's buttons 0, 1, 9. */\nexport function gamepadButtonsOn(pad: number, ...buttons: number[]): GamepadButtonRef[] {\n\treturn buttons.map((button) => ({ pad, button }));\n}\n\n/** Build a gamepad axis ref. `threshold` defaults to 0.5 at activation time. */\nexport function gamepadAxisOn(pad: number, axis: number, direction: 1 | -1, threshold?: number): GamepadAxisRef {\n\treturn threshold === undefined ? { pad, axis, direction } : { pad, axis, direction, threshold };\n}\n\n// ==================== Internal Types ====================\n\ninterface RawKeyPointerState {\n\tkeysDown: Set<string>;\n\tkeysPressed: string[];\n\tkeysReleased: string[];\n\tpointerButtonsDown: Set<number>;\n\tpointerButtonsPressed: number[];\n\tpointerButtonsReleased: number[];\n\tpointerX: number;\n\tpointerY: number;\n\tlastPointerX: number;\n\tlastPointerY: number;\n\tpointerMoved: boolean;\n}\n\n/**\n * Stable per-frame view of keyboard + pointer input. Sets are mutated in place\n * each frame (cleared and refilled from raw), so closures over this object see\n * consistent state throughout a frame without per-frame Set allocation.\n */\ninterface FrameState {\n\tkeysDown: Set<string>;\n\tkeysPressed: Set<string>;\n\tkeysReleased: Set<string>;\n\tpointerButtonsDown: Set<number>;\n\tpointerButtonsPressed: Set<number>;\n\tpointerButtonsReleased: Set<number>;\n\tpointerX: number;\n\tpointerY: number;\n\tpointerDeltaX: number;\n\tpointerDeltaY: number;\n}\n\ninterface PadRuntime {\n\tconnected: boolean;\n\tid: string | null;\n\tbuttonsDown: Set<number>;\n\tbuttonsPrev: Set<number>;\n\tbuttonsPressed: Set<number>;\n\tbuttonsReleased: Set<number>;\n\tbuttonValues: number[];\n\taxes: number[];\n\trawAxes: number[];\n}\n\n/** Two ping-ponged Sets backing an ActionState. Each frame we swap `active` ↔ `prev`, clear the new `active`, and refill. */\ninterface ActionSlot {\n\tactive: Set<string>;\n\tprev: Set<string>;\n}\n\n// ==================== Helpers ====================\n\nconst DEFAULT_AXIS_THRESHOLD = 0.5;\nconst DEFAULT_DEADZONE = 0.15;\nconst PAD_COUNT = 4;\n\nfunction createRawKeyPointerState(): RawKeyPointerState {\n\treturn {\n\t\tkeysDown: new Set(),\n\t\tkeysPressed: [],\n\t\tkeysReleased: [],\n\t\tpointerButtonsDown: new Set(),\n\t\tpointerButtonsPressed: [],\n\t\tpointerButtonsReleased: [],\n\t\tpointerX: 0,\n\t\tpointerY: 0,\n\t\tlastPointerX: 0,\n\t\tlastPointerY: 0,\n\t\tpointerMoved: false,\n\t};\n}\n\nfunction createFrameState(): FrameState {\n\treturn {\n\t\tkeysDown: new Set(),\n\t\tkeysPressed: new Set(),\n\t\tkeysReleased: new Set(),\n\t\tpointerButtonsDown: new Set(),\n\t\tpointerButtonsPressed: new Set(),\n\t\tpointerButtonsReleased: new Set(),\n\t\tpointerX: 0,\n\t\tpointerY: 0,\n\t\tpointerDeltaX: 0,\n\t\tpointerDeltaY: 0,\n\t};\n}\n\nfunction createPadRuntime(): PadRuntime {\n\treturn {\n\t\tconnected: false,\n\t\tid: null,\n\t\tbuttonsDown: new Set(),\n\t\tbuttonsPrev: new Set(),\n\t\tbuttonsPressed: new Set(),\n\t\tbuttonsReleased: new Set(),\n\t\tbuttonValues: [],\n\t\taxes: [],\n\t\trawAxes: [],\n\t};\n}\n\nfunction createActionSlot(): ActionSlot {\n\treturn { active: new Set(), prev: new Set() };\n}\n\nfunction refillSet<T>(dest: Set<T>, source: Iterable<T>): void {\n\tdest.clear();\n\tfor (const item of source) dest.add(item);\n}\n\nfunction updateFrameStateFromRaw(frame: FrameState, raw: RawKeyPointerState): void {\n\trefillSet(frame.keysDown, raw.keysDown);\n\trefillSet(frame.keysPressed, raw.keysPressed);\n\trefillSet(frame.keysReleased, raw.keysReleased);\n\trefillSet(frame.pointerButtonsDown, raw.pointerButtonsDown);\n\trefillSet(frame.pointerButtonsPressed, raw.pointerButtonsPressed);\n\trefillSet(frame.pointerButtonsReleased, raw.pointerButtonsReleased);\n\n\tframe.pointerDeltaX = raw.pointerMoved ? raw.pointerX - raw.lastPointerX : 0;\n\tframe.pointerDeltaY = raw.pointerMoved ? raw.pointerY - raw.lastPointerY : 0;\n\tframe.pointerX = raw.pointerX;\n\tframe.pointerY = raw.pointerY;\n\n\traw.keysPressed.length = 0;\n\traw.keysReleased.length = 0;\n\traw.pointerButtonsPressed.length = 0;\n\traw.pointerButtonsReleased.length = 0;\n\traw.lastPointerX = raw.pointerX;\n\traw.lastPointerY = raw.pointerY;\n\traw.pointerMoved = false;\n}\n\nfunction defaultPoll(out: Array<GamepadLike | null>): () => ReadonlyArray<GamepadLike | null> {\n\treturn () => {\n\t\tif (typeof navigator === 'undefined' || typeof navigator.getGamepads !== 'function') {\n\t\t\tfor (let i = 0; i < out.length; i++) out[i] = null;\n\t\t\treturn out;\n\t\t}\n\t\tconst pads = navigator.getGamepads();\n\t\tfor (let i = 0; i < out.length; i++) out[i] = pads[i] ?? null;\n\t\treturn out;\n\t};\n}\n\nfunction applyStickDeadzone(x: number, y: number, deadzone: number, out: number[], baseIndex: number): void {\n\tconst mag = Math.sqrt(x * x + y * y);\n\tif (mag < deadzone) {\n\t\tout[baseIndex] = 0;\n\t\tout[baseIndex + 1] = 0;\n\t\treturn;\n\t}\n\tconst scaled = Math.min((mag - deadzone) / (1 - deadzone), 1);\n\tout[baseIndex] = (x / mag) * scaled;\n\tout[baseIndex + 1] = (y / mag) * scaled;\n}\n\nfunction applyAxisDeadzoning(rawAxes: number[], axes: number[], deadzone: number): void {\n\taxes.length = rawAxes.length;\n\tif (rawAxes.length >= 2) {\n\t\tapplyStickDeadzone(rawAxes[0] ?? 0, rawAxes[1] ?? 0, deadzone, axes, 0);\n\t}\n\tif (rawAxes.length >= 4) {\n\t\tapplyStickDeadzone(rawAxes[2] ?? 0, rawAxes[3] ?? 0, deadzone, axes, 2);\n\t}\n\t// Axes beyond the two standard sticks pass through with no deadzone (triggers, dpad-as-axis, etc.)\n\tfor (let i = 4; i < rawAxes.length; i++) {\n\t\taxes[i] = rawAxes[i] ?? 0;\n\t}\n}\n\nfunction pollGamepadsInto(pads: PadRuntime[], pollFn: () => ReadonlyArray<GamepadLike | null>, deadzone: number): void {\n\tconst polled = pollFn();\n\tfor (let i = 0; i < PAD_COUNT; i++) {\n\t\tconst pad = polled[i] ?? null;\n\t\tconst state = pads[i];\n\t\tif (!state) continue;\n\n\t\t// Rotate button sets using the existing `prev` set as scratch, then clear what we'll refill.\n\t\tconst reusedPrev = state.buttonsPrev;\n\t\trefillSet(reusedPrev, state.buttonsDown);\n\t\tstate.buttonsDown.clear();\n\t\tstate.buttonsPressed.clear();\n\t\tstate.buttonsReleased.clear();\n\n\t\tif (!pad || !pad.connected) {\n\t\t\tif (state.connected) {\n\t\t\t\t// Newly disconnected: synthesize justReleased for anything that was held, then clear values.\n\t\t\t\tfor (const b of reusedPrev) state.buttonsReleased.add(b);\n\t\t\t\tstate.connected = false;\n\t\t\t\tstate.id = null;\n\t\t\t\tstate.buttonValues.length = 0;\n\t\t\t\tstate.axes.length = 0;\n\t\t\t\tstate.rawAxes.length = 0;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tstate.connected = true;\n\t\tstate.id = pad.id;\n\n\t\tstate.buttonValues.length = pad.buttons.length;\n\t\tfor (let b = 0; b < pad.buttons.length; b++) {\n\t\t\tconst info = pad.buttons[b];\n\t\t\tif (!info) {\n\t\t\t\tstate.buttonValues[b] = 0;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tstate.buttonValues[b] = info.value;\n\t\t\tif (info.pressed) state.buttonsDown.add(b);\n\t\t}\n\n\t\tfor (const b of state.buttonsDown) {\n\t\t\tif (!reusedPrev.has(b)) state.buttonsPressed.add(b);\n\t\t}\n\t\tfor (const b of reusedPrev) {\n\t\t\tif (!state.buttonsDown.has(b)) state.buttonsReleased.add(b);\n\t\t}\n\n\t\tstate.rawAxes.length = pad.axes.length;\n\t\tfor (let a = 0; a < pad.axes.length; a++) {\n\t\t\tstate.rawAxes[a] = pad.axes[a] ?? 0;\n\t\t}\n\t\tapplyAxisDeadzoning(state.rawAxes, state.axes, deadzone);\n\t}\n}\n\nfunction isBindingActive(\n\tbinding: ActionBinding,\n\tkeysDown: ReadonlySet<string>,\n\tpointerButtonsDown: ReadonlySet<number>,\n\tpads: ReadonlyArray<PadRuntime>,\n): boolean {\n\tif (binding.keys?.some((k) => keysDown.has(k))) return true;\n\tif (binding.pointerButtons?.some((b) => pointerButtonsDown.has(b))) return true;\n\tif (binding.gamepadButtons?.some(({ pad, button }) => pads[pad]?.buttonsDown.has(button) ?? false)) return true;\n\tif (binding.gamepadAxes?.some(({ pad, axis, direction, threshold = DEFAULT_AXIS_THRESHOLD }) => {\n\t\tconst value = pads[pad]?.axes[axis] ?? 0;\n\t\treturn direction > 0 ? value > threshold : value < -threshold;\n\t})) return true;\n\treturn false;\n}\n\n/**\n * Recompute the slot's `active` set in place from `map` against current input sources.\n * Rotates `active` ↔ `prev` (reusing Set instances) so edge detection works with no allocations.\n */\nfunction advanceActionSlot(\n\tslot: ActionSlot,\n\tmap: ActionMap,\n\tkeysDown: ReadonlySet<string>,\n\tpointerButtonsDown: ReadonlySet<number>,\n\tpads: ReadonlyArray<PadRuntime>,\n): void {\n\tconst nextActive = slot.prev;\n\tslot.prev = slot.active;\n\tslot.active = nextActive;\n\tnextActive.clear();\n\n\tfor (const [name, binding] of Object.entries(map)) {\n\t\tif (isBindingActive(binding, keysDown, pointerButtonsDown, pads)) nextActive.add(name);\n\t}\n}\n\nfunction makeActionState<A extends string>(slot: ActionSlot): ActionState<A> {\n\treturn {\n\t\tisActive: (action) => slot.active.has(action),\n\t\tjustActivated: (action) => slot.active.has(action) && !slot.prev.has(action),\n\t\tjustDeactivated: (action) => !slot.active.has(action) && slot.prev.has(action),\n\t};\n}\n\n// ==================== Plugin Factory ====================\n\n/**\n * Create an input plugin for ECSpresso.\n *\n * Provides:\n * - Frame-accurate keyboard state (isDown, justPressed, justReleased)\n * - Pointer position/delta and button state (mouse + touch via PointerEvent)\n * - Up to 4 gamepads polled per frame, with radial deadzone on sticks and analog button values\n * - Unified action mapping (keyboard + pointer + any pad)\n * - Per-player action maps for local co-op (`definePlayer`, `player(id)`)\n * - Automatic listener cleanup on detach\n *\n * @example\n * ```typescript\n * const ecs = ECSpresso.create()\n * .withPlugin(createInputPlugin({\n * actions: {\n * jump: { keys: [' ', 'ArrowUp'], gamepadButtons: [{ pad: 0, button: 0 }] },\n * shoot: { keys: ['z'], pointerButtons: [0] },\n * },\n * players: {\n * p1: { jump: { keys: [' '] }, shoot: { keys: ['z'] } },\n * p2: {\n * jump: { gamepadButtons: gamepadButtonsOn(0, 0) },\n * shoot: { gamepadButtons: gamepadButtonsOn(0, 2) },\n * },\n * },\n * }))\n * .build();\n *\n * const input = ecs.getResource('inputState');\n * if (input.actions.justActivated('jump')) { ... } // any source\n * if (input.player('p1')?.actions.isActive('jump')) { ... } // just player 1\n * if (input.gamepads[0].isDown(0)) { ... } // raw pad 0 A-button\n * ```\n */\nexport function createInputPlugin<A extends string = string, G extends string = 'input'>(\n\toptions?: InputPluginOptions<A, G>\n) {\n\tconst {\n\t\tsystemGroup = 'input',\n\t\tpriority = 100,\n\t\tphase = 'preUpdate',\n\t\ttarget = globalThis,\n\t\tgamepad: gamepadOpts = {},\n\t\tcoordinateTransform,\n\t\tshouldPreventDefault,\n\t\tpreventDefaultKeys,\n\t\tpreventDefaultPointerButtons,\n\t} = options ?? {};\n\n\tconst preventKeySet = new Set<string>(preventDefaultKeys ?? []);\n\tconst preventPointerSet = new Set<number>(preventDefaultPointerButtons ?? []);\n\n\tfunction checkPreventDefault(e: KeyboardEvent | PointerEvent): void {\n\t\tif (shouldPreventDefault) {\n\t\t\tif (shouldPreventDefault(e)) e.preventDefault();\n\t\t\treturn;\n\t\t}\n\t\tif ('key' in e) {\n\t\t\tif (preventKeySet.has(e.key)) e.preventDefault();\n\t\t} else {\n\t\t\tif (preventPointerSet.has(e.button)) e.preventDefault();\n\t\t}\n\t}\n\n\t// Construction-time casts: option defaults of `{}` don't structurally satisfy a narrow `ActionMap<A>`,\n\t// but at this boundary we know the user either supplied a valid map or is using A = string.\n\tconst unifiedActionMap = { ...(options?.actions ?? {}) } as ActionMap<A>;\n\tconst playerMaps = new Map<string, ActionMap<A>>(\n\t\tObject.entries(options?.players ?? {}) as Array<[string, ActionMap<A>]>,\n\t);\n\n\tconst deadzone = gamepadOpts.deadzone ?? DEFAULT_DEADZONE;\n\tconst pollFn = gamepadOpts.poll ?? defaultPoll(new Array<GamepadLike | null>(PAD_COUNT).fill(null));\n\n\tconst raw = createRawKeyPointerState();\n\tconst frame = createFrameState();\n\tconst pads: PadRuntime[] = Array.from({ length: PAD_COUNT }, createPadRuntime);\n\tconst unifiedSlot = createActionSlot();\n\tconst playerSlots = new Map<string, ActionSlot>();\n\tconst playerHandles = new Map<string, PlayerInput<A>>();\n\tconst cleanupFns: Array<() => void> = [];\n\n\t// Vector2Ds exposed via the resource — updated in place each frame.\n\tconst position: Vector2D = { x: 0, y: 0 };\n\tconst delta: Vector2D = { x: 0, y: 0 };\n\n\tlet currentUnifiedMap = unifiedActionMap;\n\n\tconst keyboard: KeyboardState = {\n\t\tisDown: (key) => frame.keysDown.has(key),\n\t\tjustPressed: (key) => frame.keysPressed.has(key),\n\t\tjustReleased: (key) => frame.keysReleased.has(key),\n\t};\n\n\tconst pointer: PointerState = {\n\t\tposition,\n\t\tdelta,\n\t\tisDown: (button) => frame.pointerButtonsDown.has(button),\n\t\tjustPressed: (button) => frame.pointerButtonsPressed.has(button),\n\t\tjustReleased: (button) => frame.pointerButtonsReleased.has(button),\n\t};\n\n\tfunction makeGamepadState(index: number): GamepadState {\n\t\tconst state = pads[index];\n\t\tif (!state) throw new Error(`Invalid gamepad index: ${index}`);\n\t\treturn {\n\t\t\tget connected() { return state.connected; },\n\t\t\tget id() { return state.id; },\n\t\t\tisDown: (button) => state.buttonsDown.has(button),\n\t\t\tjustPressed: (button) => state.buttonsPressed.has(button),\n\t\t\tjustReleased: (button) => state.buttonsReleased.has(button),\n\t\t\tbuttonValue: (button) => state.buttonValues[button] ?? 0,\n\t\t\taxis: (index) => state.axes[index] ?? 0,\n\t\t\trawAxis: (index) => state.rawAxes[index] ?? 0,\n\t\t};\n\t}\n\n\tconst gamepadStates: ReadonlyArray<GamepadState> = Array.from({ length: PAD_COUNT }, (_, i) => makeGamepadState(i));\n\n\tconst unifiedActions = makeActionState<A>(unifiedSlot);\n\n\tfunction ensurePlayerSlot(id: string): ActionSlot {\n\t\tconst existing = playerSlots.get(id);\n\t\tif (existing) return existing;\n\t\tconst slot = createActionSlot();\n\t\tplayerSlots.set(id, slot);\n\t\treturn slot;\n\t}\n\n\tfunction createPlayerHandle(id: string): PlayerInput<A> {\n\t\tconst slot = ensurePlayerSlot(id);\n\t\treturn {\n\t\t\tactions: makeActionState<A>(slot),\n\t\t\tsetActionMap: (map) => {\n\t\t\t\tif (!playerMaps.has(id)) throw new Error(`Player '${id}' was removed`);\n\t\t\t\tplayerMaps.set(id, { ...map });\n\t\t\t},\n\t\t\tgetActionMap: () => {\n\t\t\t\tconst map = playerMaps.get(id);\n\t\t\t\tif (!map) throw new Error(`Player '${id}' was removed`);\n\t\t\t\treturn { ...map };\n\t\t\t},\n\t\t};\n\t}\n\n\tfor (const id of playerMaps.keys()) {\n\t\tplayerHandles.set(id, createPlayerHandle(id));\n\t}\n\n\tconst inputState: InputState<A> = {\n\t\tkeyboard,\n\t\tpointer,\n\t\tgamepads: gamepadStates,\n\t\tactions: unifiedActions,\n\t\tsetActionMap(newMap) {\n\t\t\tcurrentUnifiedMap = { ...newMap };\n\t\t},\n\t\tgetActionMap() {\n\t\t\treturn { ...currentUnifiedMap };\n\t\t},\n\t\tdefinePlayer(id, map) {\n\t\t\tplayerMaps.set(id, { ...map });\n\t\t\tif (!playerHandles.has(id)) playerHandles.set(id, createPlayerHandle(id));\n\t\t},\n\t\tremovePlayer(id) {\n\t\t\tconst existed = playerMaps.delete(id);\n\t\t\tplayerHandles.delete(id);\n\t\t\tplayerSlots.delete(id);\n\t\t\treturn existed;\n\t\t},\n\t\tplayer(id) {\n\t\t\treturn playerHandles.get(id);\n\t\t},\n\t\tplayerIds() {\n\t\t\treturn Array.from(playerMaps.keys());\n\t\t},\n\t};\n\n\tfunction onKeyDown(e: Event) {\n\t\tconst ke = e as KeyboardEvent;\n\t\tif (ke.repeat) return;\n\t\tcheckPreventDefault(ke);\n\t\traw.keysDown.add(ke.key);\n\t\traw.keysPressed.push(ke.key);\n\t}\n\n\tfunction onKeyUp(e: Event) {\n\t\tconst ke = e as KeyboardEvent;\n\t\tcheckPreventDefault(ke);\n\t\traw.keysDown.delete(ke.key);\n\t\traw.keysReleased.push(ke.key);\n\t}\n\n\tfunction onPointerDown(e: Event) {\n\t\tconst pe = e as PointerEvent;\n\t\tcheckPreventDefault(pe);\n\t\traw.pointerButtonsDown.add(pe.button);\n\t\traw.pointerButtonsPressed.push(pe.button);\n\t}\n\n\tfunction onPointerMove(e: Event) {\n\t\tconst pe = e as PointerEvent;\n\t\tif (coordinateTransform) {\n\t\t\tconst { x, y } = coordinateTransform(pe.clientX, pe.clientY);\n\t\t\traw.pointerX = x;\n\t\t\traw.pointerY = y;\n\t\t} else {\n\t\t\traw.pointerX = pe.clientX;\n\t\t\traw.pointerY = pe.clientY;\n\t\t}\n\t\traw.pointerMoved = true;\n\t}\n\n\tfunction onPointerUp(e: Event) {\n\t\tconst pe = e as PointerEvent;\n\t\tcheckPreventDefault(pe);\n\t\traw.pointerButtonsDown.delete(pe.button);\n\t\traw.pointerButtonsReleased.push(pe.button);\n\t}\n\n\tfunction addListener(type: string, handler: (e: Event) => void) {\n\t\ttarget.addEventListener(type, handler);\n\t\tcleanupFns.push(() => { target.removeEventListener(type, handler); });\n\t}\n\n\treturn definePlugin('input')\n\t\t.withResourceTypes<InputResourceTypes<A>>()\n\t\t.withLabels<'input-state'>()\n\t\t.withGroups<G>()\n\t\t.install((world) => {\n\t\t\tworld.addResource('inputState', inputState);\n\n\t\t\tworld\n\t\t\t\t.addSystem('input-state')\n\t\t\t\t.setPriority(priority)\n\t\t\t\t.inPhase(phase)\n\t\t\t\t.inGroup(systemGroup)\n\t\t\t\t.setOnInitialize(() => {\n\t\t\t\t\taddListener('keydown', onKeyDown);\n\t\t\t\t\taddListener('keyup', onKeyUp);\n\t\t\t\t\taddListener('pointerdown', onPointerDown);\n\t\t\t\t\taddListener('pointermove', onPointerMove);\n\t\t\t\t\taddListener('pointerup', onPointerUp);\n\t\t\t\t})\n\t\t\t\t.setOnDetach(() => {\n\t\t\t\t\tfor (const cleanup of cleanupFns) cleanup();\n\t\t\t\t\tcleanupFns.length = 0;\n\t\t\t\t})\n\t\t\t\t.setProcess(() => {\n\t\t\t\t\t// Pads must be polled before action computation so a single frame reflects\n\t\t\t\t\t// both DOM-driven (keyboard/pointer) and polled (gamepad) sources consistently.\n\t\t\t\t\tpollGamepadsInto(pads, pollFn, deadzone);\n\t\t\t\t\tupdateFrameStateFromRaw(frame, raw);\n\n\t\t\t\t\tposition.x = frame.pointerX;\n\t\t\t\t\tposition.y = frame.pointerY;\n\t\t\t\t\tdelta.x = frame.pointerDeltaX;\n\t\t\t\t\tdelta.y = frame.pointerDeltaY;\n\n\t\t\t\t\tadvanceActionSlot(unifiedSlot, currentUnifiedMap, frame.keysDown, frame.pointerButtonsDown, pads);\n\t\t\t\t\tfor (const [id, map] of playerMaps) {\n\t\t\t\t\t\tconst slot = ensurePlayerSlot(id);\n\t\t\t\t\t\tadvanceActionSlot(slot, map, frame.keysDown, frame.pointerButtonsDown, pads);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t});\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "A6B7FF490EDEEA4864756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "79740F7A05160D2964756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -87,6 +87,17 @@ export type UIInteractionState = 'none' | 'hover' | 'pressed';
87
87
  export interface UIInteraction {
88
88
  state: UIInteractionState;
89
89
  }
90
+ export interface LogFragment {
91
+ text: string;
92
+ color: number;
93
+ }
94
+ export interface UIMessageLog {
95
+ lines: LogFragment[][];
96
+ maxLines: number;
97
+ visibleLines: number;
98
+ lineHeight: number;
99
+ style: UITextStyle;
100
+ }
90
101
  export interface UIComponentTypes {
91
102
  uiElement: UIElement;
92
103
  uiLabel: UILabel;
@@ -96,6 +107,7 @@ export interface UIComponentTypes {
96
107
  uiInteractive: {};
97
108
  uiInteraction: UIInteraction;
98
109
  uiDisabled: {};
110
+ uiMessageLog: UIMessageLog;
99
111
  }
100
112
  export interface UIButtonPressedEvent {
101
113
  entityId: number;
@@ -104,9 +116,14 @@ export interface UIButtonHoveredEvent {
104
116
  entityId: number;
105
117
  entered: boolean;
106
118
  }
119
+ export interface UIMessageLogAppendedEvent {
120
+ entityId: number;
121
+ line: LogFragment[];
122
+ }
107
123
  export interface UIEventTypes {
108
124
  uiButtonPressed: UIButtonPressedEvent;
109
125
  uiButtonHovered: UIButtonHoveredEvent;
126
+ uiLogAppended: UIMessageLogAppendedEvent;
110
127
  }
111
128
  export interface CreateUIElementInput {
112
129
  anchor: AnchorInput;
@@ -131,11 +148,37 @@ export interface CreateUIProgressBarInput {
131
148
  direction?: ProgressDirection;
132
149
  }
133
150
  export declare function createUIProgressBar(input: CreateUIProgressBarInput): Pick<UIComponentTypes, 'uiProgressBar'>;
151
+ export interface CreateUIMessageLogInput {
152
+ maxLines: number;
153
+ visibleLines: number;
154
+ lineHeight: number;
155
+ style?: Partial<UITextStyle>;
156
+ initialLines?: LogFragment[][];
157
+ }
158
+ export declare function createUIMessageLog(input: CreateUIMessageLogInput): Pick<UIComponentTypes, 'uiMessageLog'>;
134
159
  export declare function createUIInteractive(): Pick<UIComponentTypes, 'uiInteractive'>;
135
160
  export declare function createUIButton(): Pick<UIComponentTypes, 'uiButton'>;
136
161
  export declare function createUIDisabled(): Pick<UIComponentTypes, 'uiDisabled'>;
162
+ /** Structural ECS surface for `appendLogLine`; mirrors the `CoroutineWorld` pattern. */
163
+ export interface MessageLogWorld {
164
+ commands: {
165
+ mutateComponent(entityId: number, componentName: 'uiMessageLog', mutator: (value: UIMessageLog) => void): void;
166
+ };
167
+ eventBus: {
168
+ publish(event: 'uiLogAppended', payload: UIMessageLogAppendedEvent): void;
169
+ };
170
+ }
171
+ /**
172
+ * Append a line (vector of fragments) to a `uiMessageLog` entity.
173
+ *
174
+ * Queues a buffered mutation that swaps `lines` for a fresh array (FIFO-truncated to
175
+ * `maxLines`) — the array-identity change is the sync system's redraw signal — and
176
+ * synchronously publishes `uiLogAppended` carrying the line for entry-animation
177
+ * listeners. Safe to call from inside a system process callback.
178
+ */
179
+ export declare function appendLogLine(ecs: MessageLogWorld, entityId: number, line: LogFragment[]): void;
137
180
  type UIRequires = WorldConfigFrom<TransformComponentTypes, {}, BoundsResourceTypes & InputResourceTypes>;
138
- type UILabels = 'ui-anchor-resolve' | 'ui-interaction' | 'ui-label-sync' | 'ui-panel-sync' | 'ui-progress-sync';
181
+ type UILabels = 'ui-anchor-resolve' | 'ui-interaction' | 'ui-label-sync' | 'ui-panel-sync' | 'ui-progress-sync' | 'ui-message-log-sync';
139
182
  export interface UIPluginOptions<G extends string = 'ui'> extends BasePluginOptions<G> {
140
183
  /** Priority for the anchor-resolve system in preUpdate (default: 0). */
141
184
  anchorPriority?: number;
@@ -144,5 +187,5 @@ export interface UIPluginOptions<G extends string = 'ui'> extends BasePluginOpti
144
187
  /** Priority for render-sync systems (default: 480, just before renderer2D's 500). */
145
188
  renderSyncPriority?: number;
146
189
  }
147
- export declare function createUIPlugin<G extends string = 'ui'>(options?: UIPluginOptions<G>): import("ecspresso").Plugin<import("ecspresso").WithEvents<import("ecspresso").WithComponents<import("ecspresso").EmptyConfig, UIComponentTypes>, UIEventTypes>, UIRequires, UILabels, G, never, "ui-labels" | "ui-panels" | "ui-progress-bars">;
190
+ export declare function createUIPlugin<G extends string = 'ui'>(options?: UIPluginOptions<G>): import("ecspresso").Plugin<import("ecspresso").WithEvents<import("ecspresso").WithComponents<import("ecspresso").EmptyConfig, UIComponentTypes>, UIEventTypes>, UIRequires, UILabels, G, never, "ui-labels" | "ui-panels" | "ui-progress-bars" | "ui-message-logs">;
148
191
  export {};
@@ -1,4 +1,4 @@
1
- var _=((k)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(k,{get:(J,K)=>(typeof require<"u"?require:J)[K]}):k)(function(k){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+k+'" is not supported')});import{definePlugin as F}from"ecspresso";var B={x:0,y:0,rotation:0,scaleX:1,scaleY:1},s={x:0,y:0,rotation:0,scaleX:1,scaleY:1};function a(k,J){return{localTransform:{x:k,y:J,rotation:0,scaleX:1,scaleY:1}}}function i(k,J){return{worldTransform:{x:k,y:J,rotation:0,scaleX:1,scaleY:1}}}function o(k,J,K){let Q=K?.scale??K?.scaleX??1,$=K?.scale??K?.scaleY??1,G=K?.rotation??0,M={x:k,y:J,rotation:G,scaleX:Q,scaleY:$};return{localTransform:{...M},worldTransform:{...M}}}function l(k){let{systemGroup:J="transform",priority:K=500,phase:Q="postUpdate"}=k??{};return F("transform").withComponentTypes().withLabels().withGroups().install(($)=>{$.registerRequired("localTransform","worldTransform",(D)=>({x:D.x,y:D.y,rotation:D.rotation,scaleX:D.scaleX,scaleY:D.scaleY}));let G=[],M=new Set;$.addSystem("transform-propagation").setPriority(K).inPhase(Q).inGroup(J).setProcess(({ecs:D})=>{x(D,G,M)})})}function x(k,J,K){let Q=k.entityManager;if(!Q.hasHierarchy){Q.getEntitiesWithQueryInto(J,["localTransform","worldTransform"]);for(let $ of J){let{localTransform:G,worldTransform:M}=$.components;if(E(G,M))k.markChanged($.id,"worldTransform")}return}K.clear(),k.forEachInHierarchy(($,G)=>{K.add($);let M=Q.getComponent($,"localTransform"),D=Q.getComponent($,"worldTransform");if(!M||!D)return;let U=G!==null?Q.getComponent(G,"worldTransform"):null;if(U?P(U,M,D):E(M,D))k.markChanged($,"worldTransform")}),Q.getEntitiesWithQueryInto(J,["localTransform","worldTransform"]);for(let $ of J){if(K.has($.id))continue;let{localTransform:G,worldTransform:M}=$.components;if(E(G,M))k.markChanged($.id,"worldTransform")}}function E(k,J){if(J.x===k.x&&J.y===k.y&&J.rotation===k.rotation&&J.scaleX===k.scaleX&&J.scaleY===k.scaleY)return!1;return J.x=k.x,J.y=k.y,J.rotation=k.rotation,J.scaleX=k.scaleX,J.scaleY=k.scaleY,!0}function P(k,J,K){let Q=J.x*k.scaleX,$=J.y*k.scaleY,G=Math.cos(k.rotation),M=Math.sin(k.rotation),D=Q*G-$*M,U=Q*M+$*G,X=k.x+D,N=k.y+U,z=k.rotation+J.rotation,W=k.scaleX*J.scaleX,q=k.scaleY*J.scaleY;if(K.x===X&&K.y===N&&K.rotation===z&&K.scaleX===W&&K.scaleY===q)return!1;return K.x=X,K.y=N,K.rotation=z,K.scaleX=W,K.scaleY=q,!0}import{definePlugin as I}from"ecspresso";var T=Object.freeze({"top-left":Object.freeze({x:0,y:0}),"top-center":Object.freeze({x:0.5,y:0}),"top-right":Object.freeze({x:1,y:0}),"center-left":Object.freeze({x:0,y:0.5}),center:Object.freeze({x:0.5,y:0.5}),"center-right":Object.freeze({x:1,y:0.5}),"bottom-left":Object.freeze({x:0,y:1}),"bottom-center":Object.freeze({x:0.5,y:1}),"bottom-right":Object.freeze({x:1,y:1})});function L(k){if(typeof k==="string"){let J=T[k];return{x:J.x,y:J.y}}return{x:k.x,y:k.y}}function f(k,J,K,Q,$,G){G.x=k.x*Q.width+K.x-J.x*$.width,G.y=k.y*Q.height+K.y-J.y*$.height}function h(k,J){if(J<=0)return 0;if(k<=0)return 0;if(k>=J)return J;return k}var w={ltr:(k,J,K,Q)=>{Q.x=0,Q.y=0,Q.width=k*K,Q.height=J},rtl:(k,J,K,Q)=>{Q.x=k*(1-K),Q.y=0,Q.width=k*K,Q.height=J},ttb:(k,J,K,Q)=>{Q.x=0,Q.y=0,Q.width=k,Q.height=J*K},btt:(k,J,K,Q)=>{Q.x=0,Q.y=J*(1-K),Q.width=k,Q.height=J*K}};function y(k,J,K,Q,$){w[Q](k,J,K,$)}var b=Object.freeze({fontFamily:"sans-serif",fontSize:16,fill:16777215,align:"left"});function e(k){let J=L(k.anchor),K=k.pivot===void 0?{x:J.x,y:J.y}:L(k.pivot),Q=k.offset===void 0?{x:0,y:0}:{x:k.offset.x,y:k.offset.y};return{uiElement:{anchor:J,pivot:K,offset:Q,width:k.width,height:k.height}}}function kk(k,J){return{uiLabel:{text:k,style:{...b,...J}}}}function Jk(k){return{uiPanel:{fillColor:k.fillColor,borderColor:k.borderColor,borderWidth:k.borderWidth??0}}}function Kk(k){return{uiProgressBar:{value:k.value,max:k.max,fillColor:k.fillColor,bgColor:k.bgColor,direction:k.direction??"ltr"}}}function Qk(){return{uiInteractive:{}}}function Zk(){return{uiButton:{}}}function $k(){return{uiDisabled:{}}}function Hk(k){let{systemGroup:J="ui",anchorPriority:K=0,interactionPriority:Q=200,renderSyncPriority:$=480}=k??{},G=new Map,M=new Map,D=new Map,U={x:0,y:0},X={x:0,y:0,width:0,height:0};return I("ui").withComponentTypes().withEventTypes().withLabels().withGroups().withReactiveQueryNames().requires().install((N)=>{N.registerRequired("uiElement","localTransform",()=>({x:B.x,y:B.y,rotation:B.rotation,scaleX:B.scaleX,scaleY:B.scaleY})),N.registerRequired("uiButton","uiInteractive",()=>({})),N.registerRequired("uiInteractive","uiInteraction",()=>({state:"none"})),N.addSystem("ui-anchor-resolve").setPriority(K).inPhase("preUpdate").inGroup(J).addQuery("uiElements",{with:["uiElement","localTransform"]}).setProcess(({queries:z,ecs:W})=>{let q=W.getResource("bounds");for(let H of z.uiElements){let{uiElement:Z,localTransform:V}=H.components;if(f(Z.anchor,Z.pivot,Z.offset,q,Z,U),V.x!==U.x||V.y!==U.y)V.x=U.x,V.y=U.y,W.markChanged(H.id,"localTransform")}}),N.addSystem("ui-interaction").setPriority(Q).inPhase("preUpdate").inGroup(J).addQuery("interactables",{with:["uiInteractive","uiInteraction","uiElement","worldTransform"],without:["uiDisabled"]}).setProcess(({queries:z,ecs:W})=>{let q=W.getResource("inputState").pointer,H=q.position.x,Z=q.position.y,V=q.isDown(0),g=q.justReleased(0);for(let Y of z.interactables){let{uiElement:v,worldTransform:C,uiInteraction:A}=Y.components,R=H>=C.x&&H<C.x+v.width&&Z>=C.y&&Z<C.y+v.height,j=A.state,O=!R?"none":V?j==="none"?"hover":"pressed":"hover";if(j==="pressed"&&O==="hover"&&g&&R)W.eventBus.publish("uiButtonPressed",{entityId:Y.id});if(j==="none"&&O!=="none")W.eventBus.publish("uiButtonHovered",{entityId:Y.id,entered:!0});if(j!=="none"&&O==="none")W.eventBus.publish("uiButtonHovered",{entityId:Y.id,entered:!1});if(j!==O)A.state=O,W.markChanged(Y.id,"uiInteraction")}}),N.addSystem("ui-panel-sync").setPriority($).inPhase("render").inGroup(J).setOnInitialize(async(z)=>{let W=await import("pixi.js"),q=z.tryGetResource("rootContainer");z.addReactiveQuery("ui-panels",{with:["uiPanel","uiElement"],onEnter:(H)=>{let Z=new W.Graphics;if(M.set(H.id,{pixiGraphics:Z,lastFillColor:Number.NaN,lastBorderColor:void 0,lastBorderWidth:Number.NaN,lastWidth:Number.NaN,lastHeight:Number.NaN}),q)q.addChild(Z)},onExit:(H)=>{let Z=M.get(H);if(Z)Z.pixiGraphics.removeFromParent(),Z.pixiGraphics.destroy(),M.delete(H)}})}).setProcess(({ecs:z})=>{for(let[W,q]of M){let H=z.getComponent(W,"uiPanel"),Z=z.getComponent(W,"uiElement");if(!H||!Z)continue;p(q,H,Z),S(q.pixiGraphics,z.getComponent(W,"worldTransform"))}}),N.addSystem("ui-progress-sync").setPriority($).inPhase("render").inGroup(J).setOnInitialize(async(z)=>{let W=await import("pixi.js"),q=z.tryGetResource("rootContainer");z.addReactiveQuery("ui-progress-bars",{with:["uiProgressBar","uiElement"],onEnter:(H)=>{let Z=new W.Graphics;if(D.set(H.id,{pixiGraphics:Z,lastValue:Number.NaN,lastMax:Number.NaN,lastFillColor:Number.NaN,lastBgColor:Number.NaN,lastDirection:"ltr",lastWidth:Number.NaN,lastHeight:Number.NaN}),q)q.addChild(Z)},onExit:(H)=>{let Z=D.get(H);if(Z)Z.pixiGraphics.removeFromParent(),Z.pixiGraphics.destroy(),D.delete(H)}})}).setProcess(({ecs:z})=>{for(let[W,q]of D){let H=z.getComponent(W,"uiProgressBar"),Z=z.getComponent(W,"uiElement");if(!H||!Z)continue;m(q,H,Z,X),S(q.pixiGraphics,z.getComponent(W,"worldTransform"))}}),N.addSystem("ui-label-sync").setPriority($).inPhase("render").inGroup(J).setOnInitialize(async(z)=>{let W=await import("pixi.js"),q=z.tryGetResource("rootContainer");z.addReactiveQuery("ui-labels",{with:["uiLabel"],onEnter:(H)=>{let Z=H.components.uiLabel,V=new W.Text({text:Z.text,style:{fontFamily:Z.style.fontFamily,fontSize:Z.style.fontSize,fill:Z.style.fill,align:Z.style.align}});if(G.set(H.id,{pixiText:V,lastText:Z.text,lastFontSize:Z.style.fontSize,lastFill:Z.style.fill,lastAlign:Z.style.align,lastFontFamily:Z.style.fontFamily}),q)q.addChild(V)},onExit:(H)=>{let Z=G.get(H);if(Z)Z.pixiText.removeFromParent(),Z.pixiText.destroy(),G.delete(H)}})}).setProcess(({ecs:z})=>{for(let[W,q]of G){let H=z.getComponent(W,"uiLabel");if(!H)continue;d(q,H),S(q.pixiText,z.getComponent(W,"worldTransform"))}})})}function S(k,J){if(!J)return;if(k.position.x!==J.x)k.position.x=J.x;if(k.position.y!==J.y)k.position.y=J.y}function d(k,J){if(k.lastText!==J.text)k.pixiText.text=J.text,k.lastText=J.text;let K=k.pixiText.style;if(k.lastFontSize!==J.style.fontSize)K.fontSize=J.style.fontSize,k.lastFontSize=J.style.fontSize;if(k.lastFill!==J.style.fill)K.fill=J.style.fill,k.lastFill=J.style.fill;if(k.lastAlign!==J.style.align)K.align=J.style.align,k.lastAlign=J.style.align;if(k.lastFontFamily!==J.style.fontFamily)K.fontFamily=J.style.fontFamily,k.lastFontFamily=J.style.fontFamily}function p(k,J,K){if(!(k.lastFillColor!==J.fillColor||k.lastBorderColor!==J.borderColor||k.lastBorderWidth!==J.borderWidth||k.lastWidth!==K.width||k.lastHeight!==K.height))return;let $=k.pixiGraphics;if($.clear(),$.rect(0,0,K.width,K.height),$.fill({color:J.fillColor}),J.borderColor!==void 0&&J.borderWidth>0)$.stroke({color:J.borderColor,width:J.borderWidth});k.lastFillColor=J.fillColor,k.lastBorderColor=J.borderColor,k.lastBorderWidth=J.borderWidth,k.lastWidth=K.width,k.lastHeight=K.height}function m(k,J,K,Q){if(!(k.lastValue!==J.value||k.lastMax!==J.max||k.lastFillColor!==J.fillColor||k.lastBgColor!==J.bgColor||k.lastDirection!==J.direction||k.lastWidth!==K.width||k.lastHeight!==K.height))return;let G=h(J.value,J.max),M=J.max>0?G/J.max:0;y(K.width,K.height,M,J.direction,Q);let D=k.pixiGraphics;if(D.clear(),D.rect(0,0,K.width,K.height),D.fill({color:J.bgColor}),Q.width>0&&Q.height>0)D.rect(Q.x,Q.y,Q.width,Q.height),D.fill({color:J.fillColor});k.lastValue=J.value,k.lastMax=J.max,k.lastFillColor=J.fillColor,k.lastBgColor=J.bgColor,k.lastDirection=J.direction,k.lastWidth=K.width,k.lastHeight=K.height}export{L as resolveAnchorPreset,f as resolveAnchorPosition,Kk as createUIProgressBar,Hk as createUIPlugin,Jk as createUIPanel,kk as createUILabel,Qk as createUIInteractive,e as createUIElement,$k as createUIDisabled,Zk as createUIButton,y as computeProgressFillRect,h as clampProgressValue,T as ANCHOR_PRESETS};
1
+ var E=((J)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(J,{get:(K,Q)=>(typeof require<"u"?require:K)[Q]}):J)(function(J){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+J+'" is not supported')});import{definePlugin as x}from"ecspresso";var M={x:0,y:0,rotation:0,scaleX:1,scaleY:1},l={x:0,y:0,rotation:0,scaleX:1,scaleY:1};function i(J,K){return{localTransform:{x:J,y:K,rotation:0,scaleX:1,scaleY:1}}}function r(J,K){return{worldTransform:{x:J,y:K,rotation:0,scaleX:1,scaleY:1}}}function n(J,K,Q){let Z=Q?.scale??Q?.scaleX??1,k=Q?.scale??Q?.scaleY??1,N=Q?.rotation??0,G={x:J,y:K,rotation:N,scaleX:Z,scaleY:k};return{localTransform:{...G},worldTransform:{...G}}}function t(J){let{systemGroup:K="transform",priority:Q=500,phase:Z="postUpdate"}=J??{};return x("transform").withComponentTypes().withLabels().withGroups().install((k)=>{k.registerRequired("localTransform","worldTransform",(q)=>({x:q.x,y:q.y,rotation:q.rotation,scaleX:q.scaleX,scaleY:q.scaleY}));let N=[],G=new Set;k.addSystem("transform-propagation").setPriority(Q).inPhase(Z).inGroup(K).setProcess(({ecs:q})=>{f(q,N,G)})})}function f(J,K,Q){let Z=J.entityManager;if(!Z.hasHierarchy){Z.getEntitiesWithQueryInto(K,["localTransform","worldTransform"]);for(let k of K){let{localTransform:N,worldTransform:G}=k.components;if(R(N,G))J.markChanged(k.id,"worldTransform")}return}Q.clear(),J.forEachInHierarchy((k,N)=>{Q.add(k);let G=Z.getComponent(k,"localTransform"),q=Z.getComponent(k,"worldTransform");if(!G||!q)return;let B=N!==null?Z.getComponent(N,"worldTransform"):null;if(B?h(B,G,q):R(G,q))J.markChanged(k,"worldTransform")}),Z.getEntitiesWithQueryInto(K,["localTransform","worldTransform"]);for(let k of K){if(Q.has(k.id))continue;let{localTransform:N,worldTransform:G}=k.components;if(R(N,G))J.markChanged(k.id,"worldTransform")}}function R(J,K){if(K.x===J.x&&K.y===J.y&&K.rotation===J.rotation&&K.scaleX===J.scaleX&&K.scaleY===J.scaleY)return!1;return K.x=J.x,K.y=J.y,K.rotation=J.rotation,K.scaleX=J.scaleX,K.scaleY=J.scaleY,!0}function h(J,K,Q){let Z=K.x*J.scaleX,k=K.y*J.scaleY,N=Math.cos(J.rotation),G=Math.sin(J.rotation),q=Z*N-k*G,B=Z*G+k*N,U=J.x+q,X=J.y+B,V=J.rotation+K.rotation,Y=J.scaleX*K.scaleX,H=J.scaleY*K.scaleY;if(Q.x===U&&Q.y===X&&Q.rotation===V&&Q.scaleX===Y&&Q.scaleY===H)return!1;return Q.x=U,Q.y=X,Q.rotation=V,Q.scaleX=Y,Q.scaleY=H,!0}import{definePlugin as w}from"ecspresso";var b=Object.freeze({"top-left":Object.freeze({x:0,y:0}),"top-center":Object.freeze({x:0.5,y:0}),"top-right":Object.freeze({x:1,y:0}),"center-left":Object.freeze({x:0,y:0.5}),center:Object.freeze({x:0.5,y:0.5}),"center-right":Object.freeze({x:1,y:0.5}),"bottom-left":Object.freeze({x:0,y:1}),"bottom-center":Object.freeze({x:0.5,y:1}),"bottom-right":Object.freeze({x:1,y:1})});function P(J){if(typeof J==="string"){let K=b[J];return{x:K.x,y:K.y}}return{x:J.x,y:J.y}}function g(J,K,Q,Z,k,N){N.x=J.x*Z.width+Q.x-K.x*k.width,N.y=J.y*Z.height+Q.y-K.y*k.height}function y(J,K){if(K<=0)return 0;if(J<=0)return 0;if(J>=K)return K;return J}var d={ltr:(J,K,Q,Z)=>{Z.x=0,Z.y=0,Z.width=J*Q,Z.height=K},rtl:(J,K,Q,Z)=>{Z.x=J*(1-Q),Z.y=0,Z.width=J*Q,Z.height=K},ttb:(J,K,Q,Z)=>{Z.x=0,Z.y=0,Z.width=J,Z.height=K*Q},btt:(J,K,Q,Z)=>{Z.x=0,Z.y=K*(1-Q),Z.width=J,Z.height=K*Q}};function p(J,K,Q,Z,k){d[Z](J,K,Q,k)}var T=Object.freeze({fontFamily:"sans-serif",fontSize:16,fill:16777215,align:"left"});function QJ(J){let K=P(J.anchor),Q=J.pivot===void 0?{x:K.x,y:K.y}:P(J.pivot),Z=J.offset===void 0?{x:0,y:0}:{x:J.offset.x,y:J.offset.y};return{uiElement:{anchor:K,pivot:Q,offset:Z,width:J.width,height:J.height}}}function ZJ(J,K){return{uiLabel:{text:J,style:{...T,...K}}}}function $J(J){return{uiPanel:{fillColor:J.fillColor,borderColor:J.borderColor,borderWidth:J.borderWidth??0}}}function kJ(J){return{uiProgressBar:{value:J.value,max:J.max,fillColor:J.fillColor,bgColor:J.bgColor,direction:J.direction??"ltr"}}}function HJ(J){return{uiMessageLog:{lines:J.initialLines===void 0?[]:[...J.initialLines],maxLines:J.maxLines,visibleLines:J.visibleLines,lineHeight:J.lineHeight,style:{...T,...J.style}}}}function WJ(){return{uiInteractive:{}}}function qJ(){return{uiButton:{}}}function zJ(){return{uiDisabled:{}}}function NJ(J,K,Q){J.commands.mutateComponent(K,"uiMessageLog",(Z)=>{let k=Math.max(0,Z.maxLines),N=[...Z.lines,Q];Z.lines=N.length>k?N.slice(N.length-k):N}),J.eventBus.publish("uiLogAppended",{entityId:K,line:Q})}function DJ(J){let{systemGroup:K="ui",anchorPriority:Q=0,interactionPriority:Z=200,renderSyncPriority:k=480}=J??{},N=new Map,G=new Map,q=new Map,B=new Map,U={x:0,y:0},X={x:0,y:0,width:0,height:0},V=null;return w("ui").withComponentTypes().withEventTypes().withLabels().withGroups().withReactiveQueryNames().requires().install((Y)=>{Y.registerRequired("uiElement","localTransform",()=>({x:M.x,y:M.y,rotation:M.rotation,scaleX:M.scaleX,scaleY:M.scaleY})),Y.registerRequired("uiButton","uiInteractive",()=>({})),Y.registerRequired("uiInteractive","uiInteraction",()=>({state:"none"})),Y.addSystem("ui-anchor-resolve").setPriority(Q).inPhase("preUpdate").inGroup(K).addQuery("uiElements",{with:["uiElement","localTransform"]}).setProcess(({queries:H,ecs:z})=>{let D=z.getResource("bounds");for(let W of H.uiElements){let{uiElement:$,localTransform:O}=W.components;if(g($.anchor,$.pivot,$.offset,D,$,U),O.x!==U.x||O.y!==U.y)O.x=U.x,O.y=U.y,z.markChanged(W.id,"localTransform")}}),Y.addSystem("ui-interaction").setPriority(Z).inPhase("preUpdate").inGroup(K).addQuery("interactables",{with:["uiInteractive","uiInteraction","uiElement","worldTransform"],without:["uiDisabled"]}).setProcess(({queries:H,ecs:z})=>{let D=z.getResource("inputState").pointer,W=D.position.x,$=D.position.y,O=D.isDown(0),I=D.justReleased(0);for(let j of H.interactables){let{uiElement:v,worldTransform:C,uiInteraction:F}=j.components,L=W>=C.x&&W<C.x+v.width&&$>=C.y&&$<C.y+v.height,_=F.state,S=!L?"none":O?_==="none"?"hover":"pressed":"hover";if(_==="pressed"&&S==="hover"&&I&&L)z.eventBus.publish("uiButtonPressed",{entityId:j.id});if(_==="none"&&S!=="none")z.eventBus.publish("uiButtonHovered",{entityId:j.id,entered:!0});if(_!=="none"&&S==="none")z.eventBus.publish("uiButtonHovered",{entityId:j.id,entered:!1});if(_!==S)F.state=S,z.markChanged(j.id,"uiInteraction")}}),Y.addSystem("ui-panel-sync").setPriority(k).inPhase("render").inGroup(K).setOnInitialize(async(H)=>{let z=await import("pixi.js"),D=H.tryGetResource("rootContainer");H.addReactiveQuery("ui-panels",{with:["uiPanel","uiElement"],onEnter:(W)=>{let $=new z.Graphics;if(G.set(W.id,{pixiGraphics:$,lastFillColor:Number.NaN,lastBorderColor:void 0,lastBorderWidth:Number.NaN,lastWidth:Number.NaN,lastHeight:Number.NaN}),D)D.addChild($)},onExit:(W)=>{let $=G.get(W);if($)$.pixiGraphics.removeFromParent(),$.pixiGraphics.destroy(),G.delete(W)}})}).setProcess(({ecs:H})=>{for(let[z,D]of G){let W=H.getComponent(z,"uiPanel"),$=H.getComponent(z,"uiElement");if(!W||!$)continue;m(D,W,$),A(D.pixiGraphics,H.getComponent(z,"worldTransform"))}}),Y.addSystem("ui-progress-sync").setPriority(k).inPhase("render").inGroup(K).setOnInitialize(async(H)=>{let z=await import("pixi.js"),D=H.tryGetResource("rootContainer");H.addReactiveQuery("ui-progress-bars",{with:["uiProgressBar","uiElement"],onEnter:(W)=>{let $=new z.Graphics;if(q.set(W.id,{pixiGraphics:$,lastValue:Number.NaN,lastMax:Number.NaN,lastFillColor:Number.NaN,lastBgColor:Number.NaN,lastDirection:"ltr",lastWidth:Number.NaN,lastHeight:Number.NaN}),D)D.addChild($)},onExit:(W)=>{let $=q.get(W);if($)$.pixiGraphics.removeFromParent(),$.pixiGraphics.destroy(),q.delete(W)}})}).setProcess(({ecs:H})=>{for(let[z,D]of q){let W=H.getComponent(z,"uiProgressBar"),$=H.getComponent(z,"uiElement");if(!W||!$)continue;u(D,W,$,X),A(D.pixiGraphics,H.getComponent(z,"worldTransform"))}}),Y.addSystem("ui-message-log-sync").setPriority(k).inPhase("render").inGroup(K).setOnInitialize(async(H)=>{let z=await import("pixi.js");V=z;let D=H.tryGetResource("rootContainer");H.addReactiveQuery("ui-message-logs",{with:["uiMessageLog","uiElement"],onEnter:(W)=>{let $=new z.Container;if(B.set(W.id,{rootContainer:$,lines:[],lastLinesRef:null,lastVisibleLines:-1,lastLineHeight:Number.NaN,lastFontFamily:"",lastFontSize:Number.NaN,lastAlign:""}),D)D.addChild($)},onExit:(W)=>{let $=B.get(W);if($)$.rootContainer.removeFromParent(),$.rootContainer.destroy({children:!0}),B.delete(W)}})}).setProcess(({ecs:H})=>{if(!V)return;for(let[z,D]of B){let W=H.getComponent(z,"uiMessageLog");if(!W)continue;s(D,W,V),A(D.rootContainer,H.getComponent(z,"worldTransform"))}}),Y.addSystem("ui-label-sync").setPriority(k).inPhase("render").inGroup(K).setOnInitialize(async(H)=>{let z=await import("pixi.js"),D=H.tryGetResource("rootContainer");H.addReactiveQuery("ui-labels",{with:["uiLabel"],onEnter:(W)=>{let $=W.components.uiLabel,O=new z.Text({text:$.text,style:{fontFamily:$.style.fontFamily,fontSize:$.style.fontSize,fill:$.style.fill,align:$.style.align}});if(N.set(W.id,{pixiText:O,lastText:$.text,lastFontSize:$.style.fontSize,lastFill:$.style.fill,lastAlign:$.style.align,lastFontFamily:$.style.fontFamily}),D)D.addChild(O)},onExit:(W)=>{let $=N.get(W);if($)$.pixiText.removeFromParent(),$.pixiText.destroy(),N.delete(W)}})}).setProcess(({ecs:H})=>{for(let[z,D]of N){let W=H.getComponent(z,"uiLabel");if(!W)continue;c(D,W),A(D.pixiText,H.getComponent(z,"worldTransform"))}})})}function A(J,K){if(!K)return;if(J.position.x!==K.x)J.position.x=K.x;if(J.position.y!==K.y)J.position.y=K.y}function c(J,K){if(J.lastText!==K.text)J.pixiText.text=K.text,J.lastText=K.text;let Q=J.pixiText.style;if(J.lastFontSize!==K.style.fontSize)Q.fontSize=K.style.fontSize,J.lastFontSize=K.style.fontSize;if(J.lastFill!==K.style.fill)Q.fill=K.style.fill,J.lastFill=K.style.fill;if(J.lastAlign!==K.style.align)Q.align=K.style.align,J.lastAlign=K.style.align;if(J.lastFontFamily!==K.style.fontFamily)Q.fontFamily=K.style.fontFamily,J.lastFontFamily=K.style.fontFamily}function m(J,K,Q){if(!(J.lastFillColor!==K.fillColor||J.lastBorderColor!==K.borderColor||J.lastBorderWidth!==K.borderWidth||J.lastWidth!==Q.width||J.lastHeight!==Q.height))return;let k=J.pixiGraphics;if(k.clear(),k.rect(0,0,Q.width,Q.height),k.fill({color:K.fillColor}),K.borderColor!==void 0&&K.borderWidth>0)k.stroke({color:K.borderColor,width:K.borderWidth});J.lastFillColor=K.fillColor,J.lastBorderColor=K.borderColor,J.lastBorderWidth=K.borderWidth,J.lastWidth=Q.width,J.lastHeight=Q.height}function u(J,K,Q,Z){if(!(J.lastValue!==K.value||J.lastMax!==K.max||J.lastFillColor!==K.fillColor||J.lastBgColor!==K.bgColor||J.lastDirection!==K.direction||J.lastWidth!==Q.width||J.lastHeight!==Q.height))return;let N=y(K.value,K.max),G=K.max>0?N/K.max:0;p(Q.width,Q.height,G,K.direction,Z);let q=J.pixiGraphics;if(q.clear(),q.rect(0,0,Q.width,Q.height),q.fill({color:K.bgColor}),Z.width>0&&Z.height>0)q.rect(Z.x,Z.y,Z.width,Z.height),q.fill({color:K.fillColor});J.lastValue=K.value,J.lastMax=K.max,J.lastFillColor=K.fillColor,J.lastBgColor=K.bgColor,J.lastDirection=K.direction,J.lastWidth=Q.width,J.lastHeight=Q.height}function s(J,K,Q){let Z=J.lastFontFamily!==K.style.fontFamily||J.lastFontSize!==K.style.fontSize||J.lastAlign!==K.style.align,k=J.lastLinesRef!==K.lines,N=J.lastVisibleLines!==K.visibleLines||J.lastLineHeight!==K.lineHeight;if(!k&&!N&&!Z)return;let G=K.lines.slice(-K.visibleLines);while(J.lines.length<G.length){let q=new Q.Container;J.rootContainer.addChild(q),J.lines.push({container:q,texts:[]})}if(J.lines.forEach((q,B)=>{if(B>=G.length)q.container.visible=!1}),G.forEach((q,B)=>{let U=J.lines[B];if(!U)return;U.container.visible=!0,U.container.position.y=B*K.lineHeight;while(U.texts.length<q.length){let V=new Q.Text({text:"",style:{fontFamily:K.style.fontFamily,fontSize:K.style.fontSize,fill:16777215,align:K.style.align}});U.container.addChild(V),U.texts.push(V)}let X=0;U.texts.forEach((V,Y)=>{let H=q[Y];if(!H){V.visible=!1;return}if(V.visible=!0,V.text!==H.text)V.text=H.text;if(V.style.fill!==H.color)V.style.fill=H.color;V.position.x=X,X+=V.width})}),Z)J.lines.forEach((q)=>{q.texts.forEach((B)=>{let U=B.style;if(U.fontFamily!==K.style.fontFamily)U.fontFamily=K.style.fontFamily;if(U.fontSize!==K.style.fontSize)U.fontSize=K.style.fontSize;if(U.align!==K.style.align)U.align=K.style.align})});J.lastLinesRef=K.lines,J.lastVisibleLines=K.visibleLines,J.lastLineHeight=K.lineHeight,J.lastFontFamily=K.style.fontFamily,J.lastFontSize=K.style.fontSize,J.lastAlign=K.style.align}export{P as resolveAnchorPreset,g as resolveAnchorPosition,kJ as createUIProgressBar,DJ as createUIPlugin,$J as createUIPanel,HJ as createUIMessageLog,ZJ as createUILabel,WJ as createUIInteractive,QJ as createUIElement,zJ as createUIDisabled,qJ as createUIButton,p as computeProgressFillRect,y as clampProgressValue,NJ as appendLogLine,b as ANCHOR_PRESETS};
2
2
 
3
- //# debugId=C99ACED21032E0BC64756E2164756E21
3
+ //# debugId=B6E1260EDCFC611D64756E2164756E21
4
4
  //# sourceMappingURL=ui.js.map
@@ -3,9 +3,9 @@
3
3
  "sources": ["../src/plugins/spatial/transform.ts", "../src/plugins/ui/ui.ts"],
4
4
  "sourcesContent": [
5
5
  "/**\n * Transform Plugin for ECSpresso\n *\n * Provides hierarchical transform propagation following Bevy's Transform/GlobalTransform pattern.\n * LocalTransform is modified by user code; WorldTransform is computed automatically.\n *\n * @see https://docs.rs/bevy/latest/bevy/transform/components/struct.GlobalTransform.html\n */\n\nimport { definePlugin, type BasePluginOptions } from 'ecspresso';\nimport type ECSpresso from 'ecspresso';\nimport type { WorldConfigFrom } from '../../type-utils';\n\n// ==================== Component Types ====================\n\n/**\n * Local transform relative to parent (or world if no parent).\n * This is the transform you modify directly.\n */\nexport interface LocalTransform {\n\tx: number;\n\ty: number;\n\trotation: number;\n\tscaleX: number;\n\tscaleY: number;\n}\n\n/**\n * Computed world transform (accumulated from parent chain).\n * Read-only - managed by the transform propagation system.\n */\nexport interface WorldTransform {\n\tx: number;\n\ty: number;\n\trotation: number;\n\tscaleX: number;\n\tscaleY: number;\n}\n\n/**\n * Component types provided by the transform plugin.\n * Included automatically via `.withPlugin(createTransformPlugin())`.\n *\n * @example\n * ```typescript\n * const ecs = ECSpresso.create()\n * .withPlugin(createTransformPlugin())\n * .withComponentTypes<{ sprite: Sprite; velocity: { x: number; y: number } }>()\n * .build();\n * ```\n */\nexport interface TransformComponentTypes {\n\tlocalTransform: LocalTransform;\n\tworldTransform: WorldTransform;\n}\n\n/**\n * WorldConfig representing the transform plugin's provided components.\n * Used as the `Requires` type parameter by plugins that depend on transform.\n */\nexport type TransformWorldConfig = WorldConfigFrom<TransformComponentTypes>;\n\n// ==================== Plugin Options ====================\n\n/**\n * Configuration options for the transform plugin.\n */\nexport interface TransformPluginOptions<G extends string = 'transform'> extends BasePluginOptions<G> {}\n\n// ==================== Default Values ====================\n\n/**\n * Default local transform values.\n */\nexport const DEFAULT_LOCAL_TRANSFORM: Readonly<LocalTransform> = {\n\tx: 0,\n\ty: 0,\n\trotation: 0,\n\tscaleX: 1,\n\tscaleY: 1,\n};\n\n/**\n * Default world transform values.\n */\nexport const DEFAULT_WORLD_TRANSFORM: Readonly<WorldTransform> = {\n\tx: 0,\n\ty: 0,\n\trotation: 0,\n\tscaleX: 1,\n\tscaleY: 1,\n};\n\n// ==================== Helper Functions ====================\n\n/**\n * Create a local transform component with position only.\n * Uses default rotation (0) and scale (1, 1).\n *\n * @param x The x coordinate\n * @param y The y coordinate\n * @returns Component object suitable for spreading into spawn()\n *\n * @example\n * ```typescript\n * ecs.spawn({\n * ...createLocalTransform(100, 200),\n * sprite,\n * });\n * ```\n */\nexport function createLocalTransform(x: number, y: number): Pick<TransformComponentTypes, 'localTransform'> {\n\treturn {\n\t\tlocalTransform: {\n\t\t\tx,\n\t\t\ty,\n\t\t\trotation: 0,\n\t\t\tscaleX: 1,\n\t\t\tscaleY: 1,\n\t\t},\n\t};\n}\n\n/**\n * Create a world transform component with position only.\n * Typically used alongside createLocalTransform for initial state.\n *\n * @param x The x coordinate\n * @param y The y coordinate\n * @returns Component object suitable for spreading into spawn()\n */\nexport function createWorldTransform(x: number, y: number): Pick<TransformComponentTypes, 'worldTransform'> {\n\treturn {\n\t\tworldTransform: {\n\t\t\tx,\n\t\t\ty,\n\t\t\trotation: 0,\n\t\t\tscaleX: 1,\n\t\t\tscaleY: 1,\n\t\t},\n\t};\n}\n\n/**\n * Options for creating a full transform.\n */\nexport interface TransformOptions {\n\trotation?: number;\n\tscaleX?: number;\n\tscaleY?: number;\n\t/** Uniform scale (overrides scaleX/scaleY if provided) */\n\tscale?: number;\n}\n\n/**\n * Create both local and world transform components.\n * World transform is initialized to match local transform.\n *\n * @param x The x coordinate\n * @param y The y coordinate\n * @param options Optional rotation and scale\n * @returns Component object suitable for spreading into spawn()\n *\n * @example\n * ```typescript\n * ecs.spawn({\n * ...createTransform(100, 200),\n * sprite,\n * });\n *\n * // With rotation and scale\n * ecs.spawn({\n * ...createTransform(100, 200, { rotation: Math.PI / 4, scale: 2 }),\n * sprite,\n * });\n * ```\n */\nexport function createTransform(\n\tx: number,\n\ty: number,\n\toptions?: TransformOptions\n): TransformComponentTypes {\n\tconst scaleX = options?.scale ?? options?.scaleX ?? 1;\n\tconst scaleY = options?.scale ?? options?.scaleY ?? 1;\n\tconst rotation = options?.rotation ?? 0;\n\n\tconst transform = {\n\t\tx,\n\t\ty,\n\t\trotation,\n\t\tscaleX,\n\t\tscaleY,\n\t};\n\n\treturn {\n\t\tlocalTransform: { ...transform },\n\t\tworldTransform: { ...transform },\n\t};\n}\n\n// ==================== Plugin Factory ====================\n\n/**\n * Create a transform plugin for ECSpresso.\n *\n * This plugin provides:\n * - Transform propagation system that computes world transforms from local transforms\n * - Parent-first traversal ensures parents are processed before children\n * - Supports full transform hierarchy (position, rotation, scale)\n *\n * @example\n * ```typescript\n * const ecs = ECSpresso\n * .create<Components, Events, Resources>()\n * .withPlugin(createTransformPlugin())\n * .withPlugin(createPhysics2DPlugin())\n * .build();\n *\n * // Spawn entity with transform\n * ecs.spawn({\n * ...createTransform(100, 200),\n * velocity: { x: 50, y: 0 },\n * });\n * ```\n */\nexport function createTransformPlugin<G extends string = 'transform'>(\n\toptions?: TransformPluginOptions<G>\n) {\n\tconst {\n\t\tsystemGroup = 'transform',\n\t\tpriority = 500,\n\t\tphase = 'postUpdate',\n\t} = options ?? {};\n\n\treturn definePlugin('transform')\n\t\t.withComponentTypes<TransformComponentTypes>()\n\t\t.withLabels<'transform-propagation'>()\n\t\t.withGroups<G>()\n\t\t.install((world) => {\n\t\t\t// localTransform requires worldTransform — initialize from localTransform values\n\t\t\tworld.registerRequired('localTransform', 'worldTransform', (lt) => ({\n\t\t\t\tx: lt.x, y: lt.y, rotation: lt.rotation, scaleX: lt.scaleX, scaleY: lt.scaleY,\n\t\t\t}));\n\n\t\t\tconst orphanBuffer: Array<import('../../types').FilteredEntity<TransformComponentTypes, 'localTransform' | 'worldTransform'>> = [];\n\t\t\tconst hierarchyVisited = new Set<number>();\n\n\t\t\tworld\n\t\t\t\t.addSystem('transform-propagation')\n\t\t\t\t.setPriority(priority)\n\t\t\t\t.inPhase(phase)\n\t\t\t\t.inGroup(systemGroup)\n\t\t\t\t.setProcess(({ ecs }) => {\n\t\t\t\t\tpropagateTransforms(ecs, orphanBuffer, hierarchyVisited);\n\t\t\t\t});\n\t\t});\n}\n\n/**\n * Propagate transforms through the hierarchy.\n * Parent-first traversal ensures parents are computed before children.\n *\n * Runs unconditionally for all entities with transforms — user code can\n * freely mutate localTransform without needing to call markChanged.\n * Only marks worldTransform as changed when values actually differ,\n * so downstream systems (e.g. renderer sync) can skip static entities.\n */\nfunction propagateTransforms(\n\tecs: ECSpresso<WorldConfigFrom<TransformComponentTypes>>,\n\torphanBuffer: Array<import('../../types').FilteredEntity<TransformComponentTypes, 'localTransform' | 'worldTransform'>>,\n\thierarchyVisited: Set<number>,\n): void {\n\tconst em = ecs.entityManager;\n\n\t// Fast path: no hierarchy relationships exist — all entities are flat\n\tif (!em.hasHierarchy) {\n\t\tem.getEntitiesWithQueryInto(orphanBuffer, ['localTransform', 'worldTransform']);\n\t\tfor (const entity of orphanBuffer) {\n\t\t\tconst { localTransform, worldTransform } = entity.components;\n\t\t\tif (copyTransform(localTransform, worldTransform)) {\n\t\t\t\tecs.markChanged(entity.id, 'worldTransform');\n\t\t\t}\n\t\t}\n\t\treturn;\n\t}\n\n\t// Hierarchy exists — use parent-first traversal then process remaining orphans\n\thierarchyVisited.clear();\n\n\tecs.forEachInHierarchy((entityId, parentId) => {\n\t\thierarchyVisited.add(entityId);\n\t\tconst localTransform = em.getComponent(entityId, 'localTransform');\n\t\tconst worldTransform = em.getComponent(entityId, 'worldTransform');\n\n\t\tif (!localTransform || !worldTransform) return;\n\n\t\tconst parentWorld = parentId !== null\n\t\t\t? em.getComponent(parentId, 'worldTransform')\n\t\t\t: null;\n\n\t\tconst changed = parentWorld\n\t\t\t? combineTransforms(parentWorld, localTransform, worldTransform)\n\t\t\t: copyTransform(localTransform, worldTransform);\n\n\t\tif (changed) ecs.markChanged(entityId, 'worldTransform');\n\t});\n\n\tem.getEntitiesWithQueryInto(orphanBuffer, ['localTransform', 'worldTransform']);\n\tfor (const entity of orphanBuffer) {\n\t\tif (hierarchyVisited.has(entity.id)) continue;\n\t\tconst { localTransform, worldTransform } = entity.components;\n\t\tif (copyTransform(localTransform, worldTransform)) {\n\t\t\tecs.markChanged(entity.id, 'worldTransform');\n\t\t}\n\t}\n}\n\n/**\n * Copy transform values from source to destination.\n * Returns true if the destination was actually modified.\n */\nfunction copyTransform(src: LocalTransform, dest: WorldTransform): boolean {\n\tif (dest.x === src.x && dest.y === src.y &&\n\t\tdest.rotation === src.rotation &&\n\t\tdest.scaleX === src.scaleX && dest.scaleY === src.scaleY) {\n\t\treturn false;\n\t}\n\tdest.x = src.x;\n\tdest.y = src.y;\n\tdest.rotation = src.rotation;\n\tdest.scaleX = src.scaleX;\n\tdest.scaleY = src.scaleY;\n\treturn true;\n}\n\n/**\n * Combine parent world transform with child local transform into child world transform.\n * Returns true if the destination was actually modified.\n */\nfunction combineTransforms(\n\tparent: WorldTransform,\n\tlocal: LocalTransform,\n\tworld: WorldTransform\n): boolean {\n\t// Apply parent's scale to local position\n\tconst scaledLocalX = local.x * parent.scaleX;\n\tconst scaledLocalY = local.y * parent.scaleY;\n\n\t// Rotate local position by parent's rotation\n\tconst cos = Math.cos(parent.rotation);\n\tconst sin = Math.sin(parent.rotation);\n\tconst rotatedX = scaledLocalX * cos - scaledLocalY * sin;\n\tconst rotatedY = scaledLocalX * sin + scaledLocalY * cos;\n\n\t// Add to parent's position\n\tconst newX = parent.x + rotatedX;\n\tconst newY = parent.y + rotatedY;\n\tconst newRotation = parent.rotation + local.rotation;\n\tconst newScaleX = parent.scaleX * local.scaleX;\n\tconst newScaleY = parent.scaleY * local.scaleY;\n\n\tif (world.x === newX && world.y === newY &&\n\t\tworld.rotation === newRotation &&\n\t\tworld.scaleX === newScaleX && world.scaleY === newScaleY) {\n\t\treturn false;\n\t}\n\n\tworld.x = newX;\n\tworld.y = newY;\n\tworld.rotation = newRotation;\n\tworld.scaleX = newScaleX;\n\tworld.scaleY = newScaleY;\n\treturn true;\n}\n",
6
- "/**\n * UI / HUD Plugin for ECSpresso.\n *\n * Screen-space primitives:\n * - `uiElement` — anchor/pivot/offset positioning resolved against the `bounds` resource\n * - `uiLabel` — PixiJS Text\n * - `uiPanel` — PixiJS Graphics rectangle with optional border\n * - `uiProgressBar` — PixiJS Graphics value indicator with four fill directions\n *\n * Pointer interaction (buttons):\n * - `uiInteractive` (marker) opts an entity into hit-testing\n * - `uiInteraction.state` — `'none' | 'hover' | 'pressed'` (Bevy-style single enum)\n * - `uiButton` marker composes `uiInteractive` + `uiInteraction`\n * - `uiDisabled` skips hit-testing entirely\n * - Emits `uiButtonPressed` (confirmed down→up on same widget) and `uiButtonHovered`\n *\n * Depends on `renderer2D` (for the `bounds` resource + scene graph + screen-space layer),\n * the transform plugin (bundled by renderer2D), and the input plugin.\n *\n * Future phases will add the message log (Phase 3).\n */\n\nimport type { Container, Graphics, Text } from 'pixi.js';\nimport { definePlugin, type BasePluginOptions } from 'ecspresso';\nimport type { WorldConfigFrom } from '../../type-utils';\nimport type { Vector2D } from '../../utils/math';\nimport {\n\tDEFAULT_LOCAL_TRANSFORM,\n\ttype LocalTransform,\n\ttype TransformComponentTypes,\n\ttype WorldTransform,\n} from '../spatial/transform';\nimport type { BoundsResourceTypes } from '../spatial/bounds';\nimport type { InputResourceTypes } from '../input/input';\n\n// ==================== Anchor Presets ====================\n\nexport type AnchorPreset =\n\t| 'top-left' | 'top-center' | 'top-right'\n\t| 'center-left' | 'center' | 'center-right'\n\t| 'bottom-left' | 'bottom-center' | 'bottom-right';\n\nexport const ANCHOR_PRESETS: Readonly<Record<AnchorPreset, Readonly<Vector2D>>> = Object.freeze({\n\t'top-left': Object.freeze({ x: 0, y: 0 }),\n\t'top-center': Object.freeze({ x: 0.5, y: 0 }),\n\t'top-right': Object.freeze({ x: 1, y: 0 }),\n\t'center-left': Object.freeze({ x: 0, y: 0.5 }),\n\t'center': Object.freeze({ x: 0.5, y: 0.5 }),\n\t'center-right': Object.freeze({ x: 1, y: 0.5 }),\n\t'bottom-left': Object.freeze({ x: 0, y: 1 }),\n\t'bottom-center': Object.freeze({ x: 0.5, y: 1 }),\n\t'bottom-right': Object.freeze({ x: 1, y: 1 }),\n});\n\nexport type AnchorInput = AnchorPreset | Vector2D;\n\n/** Resolve a preset string or vec2 into a mutable Vector2D copy. */\nexport function resolveAnchorPreset(input: AnchorInput): Vector2D {\n\tif (typeof input === 'string') {\n\t\tconst preset = ANCHOR_PRESETS[input];\n\t\treturn { x: preset.x, y: preset.y };\n\t}\n\treturn { x: input.x, y: input.y };\n}\n\n/**\n * Write the top-left screen position of a widget into `out`.\n *\n * Formula: position = anchor * bounds + offset - pivot * size.\n * `anchor` specifies where on the canvas the widget attaches (0..1 normalized).\n * `pivot` specifies where on the widget that attachment point lands (0..1 normalized).\n * Writes in place to avoid per-frame allocation.\n */\nexport function resolveAnchorPosition(\n\tanchor: Readonly<Vector2D>,\n\tpivot: Readonly<Vector2D>,\n\toffset: Readonly<Vector2D>,\n\tbounds: Readonly<{ width: number; height: number }>,\n\tsize: Readonly<{ width: number; height: number }>,\n\tout: Vector2D,\n): void {\n\tout.x = anchor.x * bounds.width + offset.x - pivot.x * size.width;\n\tout.y = anchor.y * bounds.height + offset.y - pivot.y * size.height;\n}\n\n// ==================== Progress Bar Math ====================\n\nexport type ProgressDirection = 'ltr' | 'rtl' | 'ttb' | 'btt';\n\nexport interface FillRect {\n\tx: number;\n\ty: number;\n\twidth: number;\n\theight: number;\n}\n\nexport function clampProgressValue(value: number, max: number): number {\n\tif (max <= 0) return 0;\n\tif (value <= 0) return 0;\n\tif (value >= max) return max;\n\treturn value;\n}\n\ntype FillComputer = (w: number, h: number, ratio: number, out: FillRect) => void;\n\nconst FILL_COMPUTERS: Readonly<Record<ProgressDirection, FillComputer>> = {\n\tltr: (w, h, r, o) => { o.x = 0; o.y = 0; o.width = w * r; o.height = h; },\n\trtl: (w, h, r, o) => { o.x = w * (1 - r); o.y = 0; o.width = w * r; o.height = h; },\n\tttb: (w, h, r, o) => { o.x = 0; o.y = 0; o.width = w; o.height = h * r; },\n\tbtt: (w, h, r, o) => { o.x = 0; o.y = h * (1 - r); o.width = w; o.height = h * r; },\n};\n\nexport function computeProgressFillRect(\n\twidth: number,\n\theight: number,\n\tratio: number,\n\tdirection: ProgressDirection,\n\tout: FillRect,\n): void {\n\tFILL_COMPUTERS[direction](width, height, ratio, out);\n}\n\n// ==================== Component Types ====================\n\nexport interface UIElement {\n\tanchor: Vector2D;\n\tpivot: Vector2D;\n\toffset: Vector2D;\n\twidth: number;\n\theight: number;\n}\n\nexport interface UITextStyle {\n\tfontFamily: string;\n\tfontSize: number;\n\tfill: number;\n\talign: 'left' | 'center' | 'right';\n}\n\nexport interface UILabel {\n\ttext: string;\n\tstyle: UITextStyle;\n}\n\nexport interface UIPanel {\n\tfillColor: number;\n\tborderColor?: number;\n\tborderWidth: number;\n}\n\nexport interface UIProgressBar {\n\tvalue: number;\n\tmax: number;\n\tfillColor: number;\n\tbgColor: number;\n\tdirection: ProgressDirection;\n}\n\nexport type UIInteractionState = 'none' | 'hover' | 'pressed';\n\nexport interface UIInteraction {\n\tstate: UIInteractionState;\n}\n\nexport interface UIComponentTypes {\n\tuiElement: UIElement;\n\tuiLabel: UILabel;\n\tuiPanel: UIPanel;\n\tuiProgressBar: UIProgressBar;\n\tuiButton: {};\n\tuiInteractive: {};\n\tuiInteraction: UIInteraction;\n\tuiDisabled: {};\n}\n\n// ==================== Event Types ====================\n\nexport interface UIButtonPressedEvent {\n\tentityId: number;\n}\n\nexport interface UIButtonHoveredEvent {\n\tentityId: number;\n\tentered: boolean;\n}\n\nexport interface UIEventTypes {\n\tuiButtonPressed: UIButtonPressedEvent;\n\tuiButtonHovered: UIButtonHoveredEvent;\n}\n\n// ==================== Component Factories ====================\n\nconst DEFAULT_TEXT_STYLE: Readonly<UITextStyle> = Object.freeze({\n\tfontFamily: 'sans-serif',\n\tfontSize: 16,\n\tfill: 0xffffff,\n\talign: 'left',\n});\n\nexport interface CreateUIElementInput {\n\tanchor: AnchorInput;\n\tpivot?: AnchorInput;\n\toffset?: Vector2D;\n\twidth: number;\n\theight: number;\n}\n\nexport function createUIElement(input: CreateUIElementInput): Pick<UIComponentTypes, 'uiElement'> {\n\tconst anchor = resolveAnchorPreset(input.anchor);\n\tconst pivot = input.pivot === undefined ? { x: anchor.x, y: anchor.y } : resolveAnchorPreset(input.pivot);\n\tconst offset = input.offset === undefined ? { x: 0, y: 0 } : { x: input.offset.x, y: input.offset.y };\n\treturn {\n\t\tuiElement: {\n\t\t\tanchor,\n\t\t\tpivot,\n\t\t\toffset,\n\t\t\twidth: input.width,\n\t\t\theight: input.height,\n\t\t},\n\t};\n}\n\nexport function createUILabel(\n\ttext: string,\n\tstyle?: Partial<UITextStyle>,\n): Pick<UIComponentTypes, 'uiLabel'> {\n\treturn {\n\t\tuiLabel: {\n\t\t\ttext,\n\t\t\tstyle: { ...DEFAULT_TEXT_STYLE, ...style },\n\t\t},\n\t};\n}\n\nexport interface CreateUIPanelInput {\n\tfillColor: number;\n\tborderColor?: number;\n\tborderWidth?: number;\n}\n\nexport function createUIPanel(input: CreateUIPanelInput): Pick<UIComponentTypes, 'uiPanel'> {\n\treturn {\n\t\tuiPanel: {\n\t\t\tfillColor: input.fillColor,\n\t\t\tborderColor: input.borderColor,\n\t\t\tborderWidth: input.borderWidth ?? 0,\n\t\t},\n\t};\n}\n\nexport interface CreateUIProgressBarInput {\n\tvalue: number;\n\tmax: number;\n\tfillColor: number;\n\tbgColor: number;\n\tdirection?: ProgressDirection;\n}\n\nexport function createUIProgressBar(input: CreateUIProgressBarInput): Pick<UIComponentTypes, 'uiProgressBar'> {\n\treturn {\n\t\tuiProgressBar: {\n\t\t\tvalue: input.value,\n\t\t\tmax: input.max,\n\t\t\tfillColor: input.fillColor,\n\t\t\tbgColor: input.bgColor,\n\t\t\tdirection: input.direction ?? 'ltr',\n\t\t},\n\t};\n}\n\nexport function createUIInteractive(): Pick<UIComponentTypes, 'uiInteractive'> {\n\treturn { uiInteractive: {} };\n}\n\nexport function createUIButton(): Pick<UIComponentTypes, 'uiButton'> {\n\treturn { uiButton: {} };\n}\n\nexport function createUIDisabled(): Pick<UIComponentTypes, 'uiDisabled'> {\n\treturn { uiDisabled: {} };\n}\n\n// ==================== Runtime Data (Side Storage) ====================\n\ninterface UILabelRuntime {\n\tpixiText: Text;\n\tlastText: string;\n\tlastFontSize: number;\n\tlastFill: number;\n\tlastAlign: string;\n\tlastFontFamily: string;\n}\n\ninterface UIPanelRuntime {\n\tpixiGraphics: Graphics;\n\tlastFillColor: number;\n\tlastBorderColor: number | undefined;\n\tlastBorderWidth: number;\n\tlastWidth: number;\n\tlastHeight: number;\n}\n\ninterface UIProgressRuntime {\n\tpixiGraphics: Graphics;\n\tlastValue: number;\n\tlastMax: number;\n\tlastFillColor: number;\n\tlastBgColor: number;\n\tlastDirection: ProgressDirection;\n\tlastWidth: number;\n\tlastHeight: number;\n}\n\n// ==================== Plugin Factory ====================\n\ntype UIRequires = WorldConfigFrom<\n\tTransformComponentTypes,\n\t{},\n\tBoundsResourceTypes & InputResourceTypes\n>;\n\ntype UILabels =\n\t| 'ui-anchor-resolve'\n\t| 'ui-interaction'\n\t| 'ui-label-sync'\n\t| 'ui-panel-sync'\n\t| 'ui-progress-sync';\n\nexport interface UIPluginOptions<G extends string = 'ui'> extends BasePluginOptions<G> {\n\t/** Priority for the anchor-resolve system in preUpdate (default: 0). */\n\tanchorPriority?: number;\n\t/** Priority for the pointer hit-test system in preUpdate (default: 200, after input's 100). */\n\tinteractionPriority?: number;\n\t/** Priority for render-sync systems (default: 480, just before renderer2D's 500). */\n\trenderSyncPriority?: number;\n}\n\nexport function createUIPlugin<G extends string = 'ui'>(\n\toptions?: UIPluginOptions<G>,\n) {\n\tconst {\n\t\tsystemGroup = 'ui' as G,\n\t\tanchorPriority = 0,\n\t\tinteractionPriority = 200,\n\t\trenderSyncPriority = 480,\n\t} = options ?? {};\n\n\tconst labelPool = new Map<number, UILabelRuntime>();\n\tconst panelPool = new Map<number, UIPanelRuntime>();\n\tconst progressPool = new Map<number, UIProgressRuntime>();\n\tconst scratchPos: Vector2D = { x: 0, y: 0 };\n\tconst scratchFill: FillRect = { x: 0, y: 0, width: 0, height: 0 };\n\n\treturn definePlugin('ui')\n\t\t.withComponentTypes<UIComponentTypes>()\n\t\t.withEventTypes<UIEventTypes>()\n\t\t.withLabels<UILabels>()\n\t\t.withGroups<G>()\n\t\t.withReactiveQueryNames<'ui-labels' | 'ui-panels' | 'ui-progress-bars'>()\n\t\t.requires<UIRequires>()\n\t\t.install((world) => {\n\t\t\tworld.registerRequired('uiElement', 'localTransform', (): LocalTransform => ({\n\t\t\t\tx: DEFAULT_LOCAL_TRANSFORM.x,\n\t\t\t\ty: DEFAULT_LOCAL_TRANSFORM.y,\n\t\t\t\trotation: DEFAULT_LOCAL_TRANSFORM.rotation,\n\t\t\t\tscaleX: DEFAULT_LOCAL_TRANSFORM.scaleX,\n\t\t\t\tscaleY: DEFAULT_LOCAL_TRANSFORM.scaleY,\n\t\t\t}));\n\t\t\tworld.registerRequired('uiButton', 'uiInteractive', () => ({}));\n\t\t\tworld.registerRequired('uiInteractive', 'uiInteraction', (): UIInteraction => ({ state: 'none' }));\n\n\t\t\t// Anchor resolve: writes localTransform.{x,y} from uiElement + bounds.\n\t\t\tworld\n\t\t\t\t.addSystem('ui-anchor-resolve')\n\t\t\t\t.setPriority(anchorPriority)\n\t\t\t\t.inPhase('preUpdate')\n\t\t\t\t.inGroup(systemGroup)\n\t\t\t\t.addQuery('uiElements', {\n\t\t\t\t\twith: ['uiElement', 'localTransform'],\n\t\t\t\t})\n\t\t\t\t.setProcess(({ queries, ecs }) => {\n\t\t\t\t\tconst bounds = ecs.getResource('bounds');\n\t\t\t\t\tfor (const entity of queries.uiElements) {\n\t\t\t\t\t\tconst { uiElement, localTransform } = entity.components;\n\t\t\t\t\t\tresolveAnchorPosition(\n\t\t\t\t\t\t\tuiElement.anchor,\n\t\t\t\t\t\t\tuiElement.pivot,\n\t\t\t\t\t\t\tuiElement.offset,\n\t\t\t\t\t\t\tbounds,\n\t\t\t\t\t\t\tuiElement,\n\t\t\t\t\t\t\tscratchPos,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (localTransform.x !== scratchPos.x || localTransform.y !== scratchPos.y) {\n\t\t\t\t\t\t\tlocalTransform.x = scratchPos.x;\n\t\t\t\t\t\t\tlocalTransform.y = scratchPos.y;\n\t\t\t\t\t\t\tecs.markChanged(entity.id, 'localTransform');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t// Pointer hit-test: reads inputState.pointer, updates uiInteraction.state, emits events.\n\t\t\tworld\n\t\t\t\t.addSystem('ui-interaction')\n\t\t\t\t.setPriority(interactionPriority)\n\t\t\t\t.inPhase('preUpdate')\n\t\t\t\t.inGroup(systemGroup)\n\t\t\t\t.addQuery('interactables', {\n\t\t\t\t\twith: ['uiInteractive', 'uiInteraction', 'uiElement', 'worldTransform'],\n\t\t\t\t\twithout: ['uiDisabled'],\n\t\t\t\t})\n\t\t\t\t.setProcess(({ queries, ecs }) => {\n\t\t\t\t\tconst pointer = ecs.getResource('inputState').pointer;\n\t\t\t\t\tconst px = pointer.position.x;\n\t\t\t\t\tconst py = pointer.position.y;\n\t\t\t\t\tconst down = pointer.isDown(0);\n\t\t\t\t\tconst justReleased = pointer.justReleased(0);\n\t\t\t\t\tfor (const entity of queries.interactables) {\n\t\t\t\t\t\tconst { uiElement, worldTransform, uiInteraction } = entity.components;\n\t\t\t\t\t\tconst hit =\n\t\t\t\t\t\t\tpx >= worldTransform.x &&\n\t\t\t\t\t\t\tpx < worldTransform.x + uiElement.width &&\n\t\t\t\t\t\t\tpy >= worldTransform.y &&\n\t\t\t\t\t\t\tpy < worldTransform.y + uiElement.height;\n\t\t\t\t\t\tconst prev = uiInteraction.state;\n\t\t\t\t\t\tconst next: UIInteractionState =\n\t\t\t\t\t\t\t!hit ? 'none'\n\t\t\t\t\t\t\t: down ? (prev === 'none' ? 'hover' : 'pressed')\n\t\t\t\t\t\t\t: 'hover';\n\n\t\t\t\t\t\tif (prev === 'pressed' && next === 'hover' && justReleased && hit) {\n\t\t\t\t\t\t\tecs.eventBus.publish('uiButtonPressed', { entityId: entity.id });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (prev === 'none' && next !== 'none') {\n\t\t\t\t\t\t\tecs.eventBus.publish('uiButtonHovered', { entityId: entity.id, entered: true });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (prev !== 'none' && next === 'none') {\n\t\t\t\t\t\t\tecs.eventBus.publish('uiButtonHovered', { entityId: entity.id, entered: false });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (prev !== next) {\n\t\t\t\t\t\t\tuiInteraction.state = next;\n\t\t\t\t\t\t\tecs.markChanged(entity.id, 'uiInteraction');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t// Panel sync: lazy-initialize PixiJS Graphics, redraw when panel or size changes.\n\t\t\t// Registered before labels/progress so panel Graphics sits BEHIND text/fill when an\n\t\t\t// entity carries multiple visual components (e.g. a button with uiPanel + uiLabel).\n\t\t\tworld\n\t\t\t\t.addSystem('ui-panel-sync')\n\t\t\t\t.setPriority(renderSyncPriority)\n\t\t\t\t.inPhase('render')\n\t\t\t\t.inGroup(systemGroup)\n\t\t\t\t.setOnInitialize(async (ecs) => {\n\t\t\t\t\tconst pixi = await import('pixi.js');\n\t\t\t\t\tconst rootContainer = ecs.tryGetResource<Container>('rootContainer');\n\t\t\t\t\tecs.addReactiveQuery('ui-panels', {\n\t\t\t\t\t\twith: ['uiPanel', 'uiElement'],\n\t\t\t\t\t\tonEnter: (entity) => {\n\t\t\t\t\t\t\tconst g = new pixi.Graphics();\n\t\t\t\t\t\t\tpanelPool.set(entity.id, {\n\t\t\t\t\t\t\t\tpixiGraphics: g,\n\t\t\t\t\t\t\t\tlastFillColor: Number.NaN,\n\t\t\t\t\t\t\t\tlastBorderColor: undefined,\n\t\t\t\t\t\t\t\tlastBorderWidth: Number.NaN,\n\t\t\t\t\t\t\t\tlastWidth: Number.NaN,\n\t\t\t\t\t\t\t\tlastHeight: Number.NaN,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif (rootContainer) rootContainer.addChild(g);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonExit: (entityId) => {\n\t\t\t\t\t\t\tconst runtime = panelPool.get(entityId);\n\t\t\t\t\t\t\tif (runtime) {\n\t\t\t\t\t\t\t\truntime.pixiGraphics.removeFromParent();\n\t\t\t\t\t\t\t\truntime.pixiGraphics.destroy();\n\t\t\t\t\t\t\t\tpanelPool.delete(entityId);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.setProcess(({ ecs }) => {\n\t\t\t\t\tfor (const [entityId, runtime] of panelPool) {\n\t\t\t\t\t\tconst panel = ecs.getComponent(entityId, 'uiPanel');\n\t\t\t\t\t\tconst element = ecs.getComponent(entityId, 'uiElement');\n\t\t\t\t\t\tif (!panel || !element) continue;\n\t\t\t\t\t\tsyncPanelRuntime(runtime, panel, element);\n\t\t\t\t\t\tapplyTransform(runtime.pixiGraphics, ecs.getComponent(entityId, 'worldTransform'));\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t// Progress bar sync.\n\t\t\tworld\n\t\t\t\t.addSystem('ui-progress-sync')\n\t\t\t\t.setPriority(renderSyncPriority)\n\t\t\t\t.inPhase('render')\n\t\t\t\t.inGroup(systemGroup)\n\t\t\t\t.setOnInitialize(async (ecs) => {\n\t\t\t\t\tconst pixi = await import('pixi.js');\n\t\t\t\t\tconst rootContainer = ecs.tryGetResource<Container>('rootContainer');\n\t\t\t\t\tecs.addReactiveQuery('ui-progress-bars', {\n\t\t\t\t\t\twith: ['uiProgressBar', 'uiElement'],\n\t\t\t\t\t\tonEnter: (entity) => {\n\t\t\t\t\t\t\tconst g = new pixi.Graphics();\n\t\t\t\t\t\t\tprogressPool.set(entity.id, {\n\t\t\t\t\t\t\t\tpixiGraphics: g,\n\t\t\t\t\t\t\t\tlastValue: Number.NaN,\n\t\t\t\t\t\t\t\tlastMax: Number.NaN,\n\t\t\t\t\t\t\t\tlastFillColor: Number.NaN,\n\t\t\t\t\t\t\t\tlastBgColor: Number.NaN,\n\t\t\t\t\t\t\t\tlastDirection: 'ltr',\n\t\t\t\t\t\t\t\tlastWidth: Number.NaN,\n\t\t\t\t\t\t\t\tlastHeight: Number.NaN,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif (rootContainer) rootContainer.addChild(g);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonExit: (entityId) => {\n\t\t\t\t\t\t\tconst runtime = progressPool.get(entityId);\n\t\t\t\t\t\t\tif (runtime) {\n\t\t\t\t\t\t\t\truntime.pixiGraphics.removeFromParent();\n\t\t\t\t\t\t\t\truntime.pixiGraphics.destroy();\n\t\t\t\t\t\t\t\tprogressPool.delete(entityId);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.setProcess(({ ecs }) => {\n\t\t\t\t\tfor (const [entityId, runtime] of progressPool) {\n\t\t\t\t\t\tconst bar = ecs.getComponent(entityId, 'uiProgressBar');\n\t\t\t\t\t\tconst element = ecs.getComponent(entityId, 'uiElement');\n\t\t\t\t\t\tif (!bar || !element) continue;\n\t\t\t\t\t\tsyncProgressRuntime(runtime, bar, element, scratchFill);\n\t\t\t\t\t\tapplyTransform(runtime.pixiGraphics, ecs.getComponent(entityId, 'worldTransform'));\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t// Label sync: registered last so Text sits ON TOP of panels and progress bars when an\n\t\t\t// entity carries multiple visual components.\n\t\t\tworld\n\t\t\t\t.addSystem('ui-label-sync')\n\t\t\t\t.setPriority(renderSyncPriority)\n\t\t\t\t.inPhase('render')\n\t\t\t\t.inGroup(systemGroup)\n\t\t\t\t.setOnInitialize(async (ecs) => {\n\t\t\t\t\tconst pixi = await import('pixi.js');\n\t\t\t\t\tconst rootContainer = ecs.tryGetResource<Container>('rootContainer');\n\t\t\t\t\tecs.addReactiveQuery('ui-labels', {\n\t\t\t\t\t\twith: ['uiLabel'],\n\t\t\t\t\t\tonEnter: (entity) => {\n\t\t\t\t\t\t\tconst label = entity.components.uiLabel;\n\t\t\t\t\t\t\tconst text = new pixi.Text({\n\t\t\t\t\t\t\t\ttext: label.text,\n\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\tfontFamily: label.style.fontFamily,\n\t\t\t\t\t\t\t\t\tfontSize: label.style.fontSize,\n\t\t\t\t\t\t\t\t\tfill: label.style.fill,\n\t\t\t\t\t\t\t\t\talign: label.style.align,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tlabelPool.set(entity.id, {\n\t\t\t\t\t\t\t\tpixiText: text,\n\t\t\t\t\t\t\t\tlastText: label.text,\n\t\t\t\t\t\t\t\tlastFontSize: label.style.fontSize,\n\t\t\t\t\t\t\t\tlastFill: label.style.fill,\n\t\t\t\t\t\t\t\tlastAlign: label.style.align,\n\t\t\t\t\t\t\t\tlastFontFamily: label.style.fontFamily,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif (rootContainer) rootContainer.addChild(text);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonExit: (entityId) => {\n\t\t\t\t\t\t\tconst runtime = labelPool.get(entityId);\n\t\t\t\t\t\t\tif (runtime) {\n\t\t\t\t\t\t\t\truntime.pixiText.removeFromParent();\n\t\t\t\t\t\t\t\truntime.pixiText.destroy();\n\t\t\t\t\t\t\t\tlabelPool.delete(entityId);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.setProcess(({ ecs }) => {\n\t\t\t\t\tfor (const [entityId, runtime] of labelPool) {\n\t\t\t\t\t\tconst label = ecs.getComponent(entityId, 'uiLabel');\n\t\t\t\t\t\tif (!label) continue;\n\t\t\t\t\t\tsyncLabelRuntime(runtime, label);\n\t\t\t\t\t\tapplyTransform(runtime.pixiText, ecs.getComponent(entityId, 'worldTransform'));\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t});\n}\n\n// ==================== Sync Helpers ====================\n\nfunction applyTransform(\n\tobj: { position: { x: number; y: number } },\n\twt: WorldTransform | undefined,\n): void {\n\tif (!wt) return;\n\tif (obj.position.x !== wt.x) obj.position.x = wt.x;\n\tif (obj.position.y !== wt.y) obj.position.y = wt.y;\n}\n\nfunction syncLabelRuntime(runtime: UILabelRuntime, label: UILabel): void {\n\tif (runtime.lastText !== label.text) {\n\t\truntime.pixiText.text = label.text;\n\t\truntime.lastText = label.text;\n\t}\n\tconst style = runtime.pixiText.style;\n\tif (runtime.lastFontSize !== label.style.fontSize) {\n\t\tstyle.fontSize = label.style.fontSize;\n\t\truntime.lastFontSize = label.style.fontSize;\n\t}\n\tif (runtime.lastFill !== label.style.fill) {\n\t\tstyle.fill = label.style.fill;\n\t\truntime.lastFill = label.style.fill;\n\t}\n\tif (runtime.lastAlign !== label.style.align) {\n\t\tstyle.align = label.style.align;\n\t\truntime.lastAlign = label.style.align;\n\t}\n\tif (runtime.lastFontFamily !== label.style.fontFamily) {\n\t\tstyle.fontFamily = label.style.fontFamily;\n\t\truntime.lastFontFamily = label.style.fontFamily;\n\t}\n}\n\nfunction syncPanelRuntime(runtime: UIPanelRuntime, panel: UIPanel, element: UIElement): void {\n\tconst changed =\n\t\truntime.lastFillColor !== panel.fillColor ||\n\t\truntime.lastBorderColor !== panel.borderColor ||\n\t\truntime.lastBorderWidth !== panel.borderWidth ||\n\t\truntime.lastWidth !== element.width ||\n\t\truntime.lastHeight !== element.height;\n\tif (!changed) return;\n\n\tconst g = runtime.pixiGraphics;\n\tg.clear();\n\tg.rect(0, 0, element.width, element.height);\n\tg.fill({ color: panel.fillColor });\n\tif (panel.borderColor !== undefined && panel.borderWidth > 0) {\n\t\tg.stroke({ color: panel.borderColor, width: panel.borderWidth });\n\t}\n\truntime.lastFillColor = panel.fillColor;\n\truntime.lastBorderColor = panel.borderColor;\n\truntime.lastBorderWidth = panel.borderWidth;\n\truntime.lastWidth = element.width;\n\truntime.lastHeight = element.height;\n}\n\nfunction syncProgressRuntime(\n\truntime: UIProgressRuntime,\n\tbar: UIProgressBar,\n\telement: UIElement,\n\tscratchFill: FillRect,\n): void {\n\tconst changed =\n\t\truntime.lastValue !== bar.value ||\n\t\truntime.lastMax !== bar.max ||\n\t\truntime.lastFillColor !== bar.fillColor ||\n\t\truntime.lastBgColor !== bar.bgColor ||\n\t\truntime.lastDirection !== bar.direction ||\n\t\truntime.lastWidth !== element.width ||\n\t\truntime.lastHeight !== element.height;\n\tif (!changed) return;\n\n\tconst clamped = clampProgressValue(bar.value, bar.max);\n\tconst ratio = bar.max > 0 ? clamped / bar.max : 0;\n\tcomputeProgressFillRect(element.width, element.height, ratio, bar.direction, scratchFill);\n\n\tconst g = runtime.pixiGraphics;\n\tg.clear();\n\tg.rect(0, 0, element.width, element.height);\n\tg.fill({ color: bar.bgColor });\n\tif (scratchFill.width > 0 && scratchFill.height > 0) {\n\t\tg.rect(scratchFill.x, scratchFill.y, scratchFill.width, scratchFill.height);\n\t\tg.fill({ color: bar.fillColor });\n\t}\n\n\truntime.lastValue = bar.value;\n\truntime.lastMax = bar.max;\n\truntime.lastFillColor = bar.fillColor;\n\truntime.lastBgColor = bar.bgColor;\n\truntime.lastDirection = bar.direction;\n\truntime.lastWidth = element.width;\n\truntime.lastHeight = element.height;\n}\n"
6
+ "/**\n * UI / HUD Plugin for ECSpresso.\n *\n * Screen-space primitives:\n * - `uiElement` — anchor/pivot/offset positioning resolved against the `bounds` resource\n * - `uiLabel` — PixiJS Text\n * - `uiPanel` — PixiJS Graphics rectangle with optional border\n * - `uiProgressBar` — PixiJS Graphics value indicator with four fill directions\n *\n * Pointer interaction (buttons):\n * - `uiInteractive` (marker) opts an entity into hit-testing\n * - `uiInteraction.state` — `'none' | 'hover' | 'pressed'` (Bevy-style single enum)\n * - `uiButton` marker composes `uiInteractive` + `uiInteraction`\n * - `uiDisabled` skips hit-testing entirely\n * - Emits `uiButtonPressed` (confirmed down→up on same widget) and `uiButtonHovered`\n *\n * Depends on `renderer2D` (for the `bounds` resource + scene graph + screen-space layer),\n * the transform plugin (bundled by renderer2D), and the input plugin.\n *\n * Future phases will add the message log (Phase 3).\n */\n\nimport type { Container, Graphics, Text } from 'pixi.js';\nimport { definePlugin, type BasePluginOptions } from 'ecspresso';\nimport type { WorldConfigFrom } from '../../type-utils';\nimport type { Vector2D } from '../../utils/math';\nimport {\n\tDEFAULT_LOCAL_TRANSFORM,\n\ttype LocalTransform,\n\ttype TransformComponentTypes,\n\ttype WorldTransform,\n} from '../spatial/transform';\nimport type { BoundsResourceTypes } from '../spatial/bounds';\nimport type { InputResourceTypes } from '../input/input';\n\n// ==================== Anchor Presets ====================\n\nexport type AnchorPreset =\n\t| 'top-left' | 'top-center' | 'top-right'\n\t| 'center-left' | 'center' | 'center-right'\n\t| 'bottom-left' | 'bottom-center' | 'bottom-right';\n\nexport const ANCHOR_PRESETS: Readonly<Record<AnchorPreset, Readonly<Vector2D>>> = Object.freeze({\n\t'top-left': Object.freeze({ x: 0, y: 0 }),\n\t'top-center': Object.freeze({ x: 0.5, y: 0 }),\n\t'top-right': Object.freeze({ x: 1, y: 0 }),\n\t'center-left': Object.freeze({ x: 0, y: 0.5 }),\n\t'center': Object.freeze({ x: 0.5, y: 0.5 }),\n\t'center-right': Object.freeze({ x: 1, y: 0.5 }),\n\t'bottom-left': Object.freeze({ x: 0, y: 1 }),\n\t'bottom-center': Object.freeze({ x: 0.5, y: 1 }),\n\t'bottom-right': Object.freeze({ x: 1, y: 1 }),\n});\n\nexport type AnchorInput = AnchorPreset | Vector2D;\n\n/** Resolve a preset string or vec2 into a mutable Vector2D copy. */\nexport function resolveAnchorPreset(input: AnchorInput): Vector2D {\n\tif (typeof input === 'string') {\n\t\tconst preset = ANCHOR_PRESETS[input];\n\t\treturn { x: preset.x, y: preset.y };\n\t}\n\treturn { x: input.x, y: input.y };\n}\n\n/**\n * Write the top-left screen position of a widget into `out`.\n *\n * Formula: position = anchor * bounds + offset - pivot * size.\n * `anchor` specifies where on the canvas the widget attaches (0..1 normalized).\n * `pivot` specifies where on the widget that attachment point lands (0..1 normalized).\n * Writes in place to avoid per-frame allocation.\n */\nexport function resolveAnchorPosition(\n\tanchor: Readonly<Vector2D>,\n\tpivot: Readonly<Vector2D>,\n\toffset: Readonly<Vector2D>,\n\tbounds: Readonly<{ width: number; height: number }>,\n\tsize: Readonly<{ width: number; height: number }>,\n\tout: Vector2D,\n): void {\n\tout.x = anchor.x * bounds.width + offset.x - pivot.x * size.width;\n\tout.y = anchor.y * bounds.height + offset.y - pivot.y * size.height;\n}\n\n// ==================== Progress Bar Math ====================\n\nexport type ProgressDirection = 'ltr' | 'rtl' | 'ttb' | 'btt';\n\nexport interface FillRect {\n\tx: number;\n\ty: number;\n\twidth: number;\n\theight: number;\n}\n\nexport function clampProgressValue(value: number, max: number): number {\n\tif (max <= 0) return 0;\n\tif (value <= 0) return 0;\n\tif (value >= max) return max;\n\treturn value;\n}\n\ntype FillComputer = (w: number, h: number, ratio: number, out: FillRect) => void;\n\nconst FILL_COMPUTERS: Readonly<Record<ProgressDirection, FillComputer>> = {\n\tltr: (w, h, r, o) => { o.x = 0; o.y = 0; o.width = w * r; o.height = h; },\n\trtl: (w, h, r, o) => { o.x = w * (1 - r); o.y = 0; o.width = w * r; o.height = h; },\n\tttb: (w, h, r, o) => { o.x = 0; o.y = 0; o.width = w; o.height = h * r; },\n\tbtt: (w, h, r, o) => { o.x = 0; o.y = h * (1 - r); o.width = w; o.height = h * r; },\n};\n\nexport function computeProgressFillRect(\n\twidth: number,\n\theight: number,\n\tratio: number,\n\tdirection: ProgressDirection,\n\tout: FillRect,\n): void {\n\tFILL_COMPUTERS[direction](width, height, ratio, out);\n}\n\n// ==================== Component Types ====================\n\nexport interface UIElement {\n\tanchor: Vector2D;\n\tpivot: Vector2D;\n\toffset: Vector2D;\n\twidth: number;\n\theight: number;\n}\n\nexport interface UITextStyle {\n\tfontFamily: string;\n\tfontSize: number;\n\tfill: number;\n\talign: 'left' | 'center' | 'right';\n}\n\nexport interface UILabel {\n\ttext: string;\n\tstyle: UITextStyle;\n}\n\nexport interface UIPanel {\n\tfillColor: number;\n\tborderColor?: number;\n\tborderWidth: number;\n}\n\nexport interface UIProgressBar {\n\tvalue: number;\n\tmax: number;\n\tfillColor: number;\n\tbgColor: number;\n\tdirection: ProgressDirection;\n}\n\nexport type UIInteractionState = 'none' | 'hover' | 'pressed';\n\nexport interface UIInteraction {\n\tstate: UIInteractionState;\n}\n\nexport interface LogFragment {\n\ttext: string;\n\tcolor: number;\n}\n\nexport interface UIMessageLog {\n\tlines: LogFragment[][];\n\tmaxLines: number;\n\tvisibleLines: number;\n\tlineHeight: number;\n\tstyle: UITextStyle;\n}\n\nexport interface UIComponentTypes {\n\tuiElement: UIElement;\n\tuiLabel: UILabel;\n\tuiPanel: UIPanel;\n\tuiProgressBar: UIProgressBar;\n\tuiButton: {};\n\tuiInteractive: {};\n\tuiInteraction: UIInteraction;\n\tuiDisabled: {};\n\tuiMessageLog: UIMessageLog;\n}\n\n// ==================== Event Types ====================\n\nexport interface UIButtonPressedEvent {\n\tentityId: number;\n}\n\nexport interface UIButtonHoveredEvent {\n\tentityId: number;\n\tentered: boolean;\n}\n\nexport interface UIMessageLogAppendedEvent {\n\tentityId: number;\n\tline: LogFragment[];\n}\n\nexport interface UIEventTypes {\n\tuiButtonPressed: UIButtonPressedEvent;\n\tuiButtonHovered: UIButtonHoveredEvent;\n\tuiLogAppended: UIMessageLogAppendedEvent;\n}\n\n// ==================== Component Factories ====================\n\nconst DEFAULT_TEXT_STYLE: Readonly<UITextStyle> = Object.freeze({\n\tfontFamily: 'sans-serif',\n\tfontSize: 16,\n\tfill: 0xffffff,\n\talign: 'left',\n});\n\nexport interface CreateUIElementInput {\n\tanchor: AnchorInput;\n\tpivot?: AnchorInput;\n\toffset?: Vector2D;\n\twidth: number;\n\theight: number;\n}\n\nexport function createUIElement(input: CreateUIElementInput): Pick<UIComponentTypes, 'uiElement'> {\n\tconst anchor = resolveAnchorPreset(input.anchor);\n\tconst pivot = input.pivot === undefined ? { x: anchor.x, y: anchor.y } : resolveAnchorPreset(input.pivot);\n\tconst offset = input.offset === undefined ? { x: 0, y: 0 } : { x: input.offset.x, y: input.offset.y };\n\treturn {\n\t\tuiElement: {\n\t\t\tanchor,\n\t\t\tpivot,\n\t\t\toffset,\n\t\t\twidth: input.width,\n\t\t\theight: input.height,\n\t\t},\n\t};\n}\n\nexport function createUILabel(\n\ttext: string,\n\tstyle?: Partial<UITextStyle>,\n): Pick<UIComponentTypes, 'uiLabel'> {\n\treturn {\n\t\tuiLabel: {\n\t\t\ttext,\n\t\t\tstyle: { ...DEFAULT_TEXT_STYLE, ...style },\n\t\t},\n\t};\n}\n\nexport interface CreateUIPanelInput {\n\tfillColor: number;\n\tborderColor?: number;\n\tborderWidth?: number;\n}\n\nexport function createUIPanel(input: CreateUIPanelInput): Pick<UIComponentTypes, 'uiPanel'> {\n\treturn {\n\t\tuiPanel: {\n\t\t\tfillColor: input.fillColor,\n\t\t\tborderColor: input.borderColor,\n\t\t\tborderWidth: input.borderWidth ?? 0,\n\t\t},\n\t};\n}\n\nexport interface CreateUIProgressBarInput {\n\tvalue: number;\n\tmax: number;\n\tfillColor: number;\n\tbgColor: number;\n\tdirection?: ProgressDirection;\n}\n\nexport function createUIProgressBar(input: CreateUIProgressBarInput): Pick<UIComponentTypes, 'uiProgressBar'> {\n\treturn {\n\t\tuiProgressBar: {\n\t\t\tvalue: input.value,\n\t\t\tmax: input.max,\n\t\t\tfillColor: input.fillColor,\n\t\t\tbgColor: input.bgColor,\n\t\t\tdirection: input.direction ?? 'ltr',\n\t\t},\n\t};\n}\n\nexport interface CreateUIMessageLogInput {\n\tmaxLines: number;\n\tvisibleLines: number;\n\tlineHeight: number;\n\tstyle?: Partial<UITextStyle>;\n\tinitialLines?: LogFragment[][];\n}\n\nexport function createUIMessageLog(input: CreateUIMessageLogInput): Pick<UIComponentTypes, 'uiMessageLog'> {\n\treturn {\n\t\tuiMessageLog: {\n\t\t\tlines: input.initialLines === undefined ? [] : [...input.initialLines],\n\t\t\tmaxLines: input.maxLines,\n\t\t\tvisibleLines: input.visibleLines,\n\t\t\tlineHeight: input.lineHeight,\n\t\t\tstyle: { ...DEFAULT_TEXT_STYLE, ...input.style },\n\t\t},\n\t};\n}\n\nexport function createUIInteractive(): Pick<UIComponentTypes, 'uiInteractive'> {\n\treturn { uiInteractive: {} };\n}\n\nexport function createUIButton(): Pick<UIComponentTypes, 'uiButton'> {\n\treturn { uiButton: {} };\n}\n\nexport function createUIDisabled(): Pick<UIComponentTypes, 'uiDisabled'> {\n\treturn { uiDisabled: {} };\n}\n\n// ==================== Message Log Helper ====================\n\n/** Structural ECS surface for `appendLogLine`; mirrors the `CoroutineWorld` pattern. */\nexport interface MessageLogWorld {\n\tcommands: {\n\t\tmutateComponent(\n\t\t\tentityId: number,\n\t\t\tcomponentName: 'uiMessageLog',\n\t\t\tmutator: (value: UIMessageLog) => void,\n\t\t): void;\n\t};\n\teventBus: {\n\t\tpublish(event: 'uiLogAppended', payload: UIMessageLogAppendedEvent): void;\n\t};\n}\n\n/**\n * Append a line (vector of fragments) to a `uiMessageLog` entity.\n *\n * Queues a buffered mutation that swaps `lines` for a fresh array (FIFO-truncated to\n * `maxLines`) — the array-identity change is the sync system's redraw signal — and\n * synchronously publishes `uiLogAppended` carrying the line for entry-animation\n * listeners. Safe to call from inside a system process callback.\n */\nexport function appendLogLine(\n\tecs: MessageLogWorld,\n\tentityId: number,\n\tline: LogFragment[],\n): void {\n\tecs.commands.mutateComponent(entityId, 'uiMessageLog', (log) => {\n\t\tconst cap = Math.max(0, log.maxLines);\n\t\tconst next = [...log.lines, line];\n\t\tlog.lines = next.length > cap ? next.slice(next.length - cap) : next;\n\t});\n\tecs.eventBus.publish('uiLogAppended', { entityId, line });\n}\n\n// ==================== Runtime Data (Side Storage) ====================\n\ninterface UILabelRuntime {\n\tpixiText: Text;\n\tlastText: string;\n\tlastFontSize: number;\n\tlastFill: number;\n\tlastAlign: string;\n\tlastFontFamily: string;\n}\n\ninterface UIPanelRuntime {\n\tpixiGraphics: Graphics;\n\tlastFillColor: number;\n\tlastBorderColor: number | undefined;\n\tlastBorderWidth: number;\n\tlastWidth: number;\n\tlastHeight: number;\n}\n\ninterface UIProgressRuntime {\n\tpixiGraphics: Graphics;\n\tlastValue: number;\n\tlastMax: number;\n\tlastFillColor: number;\n\tlastBgColor: number;\n\tlastDirection: ProgressDirection;\n\tlastWidth: number;\n\tlastHeight: number;\n}\n\ninterface UIMessageLogLineRuntime {\n\tcontainer: Container;\n\ttexts: Text[];\n}\n\ninterface UIMessageLogRuntime {\n\trootContainer: Container;\n\tlines: UIMessageLogLineRuntime[];\n\tlastLinesRef: LogFragment[][] | null;\n\tlastVisibleLines: number;\n\tlastLineHeight: number;\n\tlastFontFamily: string;\n\tlastFontSize: number;\n\tlastAlign: string;\n}\n\n// ==================== Plugin Factory ====================\n\ntype UIRequires = WorldConfigFrom<\n\tTransformComponentTypes,\n\t{},\n\tBoundsResourceTypes & InputResourceTypes\n>;\n\ntype UILabels =\n\t| 'ui-anchor-resolve'\n\t| 'ui-interaction'\n\t| 'ui-label-sync'\n\t| 'ui-panel-sync'\n\t| 'ui-progress-sync'\n\t| 'ui-message-log-sync';\n\nexport interface UIPluginOptions<G extends string = 'ui'> extends BasePluginOptions<G> {\n\t/** Priority for the anchor-resolve system in preUpdate (default: 0). */\n\tanchorPriority?: number;\n\t/** Priority for the pointer hit-test system in preUpdate (default: 200, after input's 100). */\n\tinteractionPriority?: number;\n\t/** Priority for render-sync systems (default: 480, just before renderer2D's 500). */\n\trenderSyncPriority?: number;\n}\n\nexport function createUIPlugin<G extends string = 'ui'>(\n\toptions?: UIPluginOptions<G>,\n) {\n\tconst {\n\t\tsystemGroup = 'ui' as G,\n\t\tanchorPriority = 0,\n\t\tinteractionPriority = 200,\n\t\trenderSyncPriority = 480,\n\t} = options ?? {};\n\n\tconst labelPool = new Map<number, UILabelRuntime>();\n\tconst panelPool = new Map<number, UIPanelRuntime>();\n\tconst progressPool = new Map<number, UIProgressRuntime>();\n\tconst messageLogPool = new Map<number, UIMessageLogRuntime>();\n\tconst scratchPos: Vector2D = { x: 0, y: 0 };\n\tconst scratchFill: FillRect = { x: 0, y: 0, width: 0, height: 0 };\n\t// Captured at init for the message-log sync, which (unlike other sync systems) must create\n\t// new Text/Container nodes during process() as fragments grow via appendLogLine.\n\tlet pixiModuleForMessageLog: typeof import('pixi.js') | null = null;\n\n\treturn definePlugin('ui')\n\t\t.withComponentTypes<UIComponentTypes>()\n\t\t.withEventTypes<UIEventTypes>()\n\t\t.withLabels<UILabels>()\n\t\t.withGroups<G>()\n\t\t.withReactiveQueryNames<'ui-labels' | 'ui-panels' | 'ui-progress-bars' | 'ui-message-logs'>()\n\t\t.requires<UIRequires>()\n\t\t.install((world) => {\n\t\t\tworld.registerRequired('uiElement', 'localTransform', (): LocalTransform => ({\n\t\t\t\tx: DEFAULT_LOCAL_TRANSFORM.x,\n\t\t\t\ty: DEFAULT_LOCAL_TRANSFORM.y,\n\t\t\t\trotation: DEFAULT_LOCAL_TRANSFORM.rotation,\n\t\t\t\tscaleX: DEFAULT_LOCAL_TRANSFORM.scaleX,\n\t\t\t\tscaleY: DEFAULT_LOCAL_TRANSFORM.scaleY,\n\t\t\t}));\n\t\t\tworld.registerRequired('uiButton', 'uiInteractive', () => ({}));\n\t\t\tworld.registerRequired('uiInteractive', 'uiInteraction', (): UIInteraction => ({ state: 'none' }));\n\n\t\t\t// Anchor resolve: writes localTransform.{x,y} from uiElement + bounds.\n\t\t\tworld\n\t\t\t\t.addSystem('ui-anchor-resolve')\n\t\t\t\t.setPriority(anchorPriority)\n\t\t\t\t.inPhase('preUpdate')\n\t\t\t\t.inGroup(systemGroup)\n\t\t\t\t.addQuery('uiElements', {\n\t\t\t\t\twith: ['uiElement', 'localTransform'],\n\t\t\t\t})\n\t\t\t\t.setProcess(({ queries, ecs }) => {\n\t\t\t\t\tconst bounds = ecs.getResource('bounds');\n\t\t\t\t\tfor (const entity of queries.uiElements) {\n\t\t\t\t\t\tconst { uiElement, localTransform } = entity.components;\n\t\t\t\t\t\tresolveAnchorPosition(\n\t\t\t\t\t\t\tuiElement.anchor,\n\t\t\t\t\t\t\tuiElement.pivot,\n\t\t\t\t\t\t\tuiElement.offset,\n\t\t\t\t\t\t\tbounds,\n\t\t\t\t\t\t\tuiElement,\n\t\t\t\t\t\t\tscratchPos,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (localTransform.x !== scratchPos.x || localTransform.y !== scratchPos.y) {\n\t\t\t\t\t\t\tlocalTransform.x = scratchPos.x;\n\t\t\t\t\t\t\tlocalTransform.y = scratchPos.y;\n\t\t\t\t\t\t\tecs.markChanged(entity.id, 'localTransform');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t// Pointer hit-test: reads inputState.pointer, updates uiInteraction.state, emits events.\n\t\t\tworld\n\t\t\t\t.addSystem('ui-interaction')\n\t\t\t\t.setPriority(interactionPriority)\n\t\t\t\t.inPhase('preUpdate')\n\t\t\t\t.inGroup(systemGroup)\n\t\t\t\t.addQuery('interactables', {\n\t\t\t\t\twith: ['uiInteractive', 'uiInteraction', 'uiElement', 'worldTransform'],\n\t\t\t\t\twithout: ['uiDisabled'],\n\t\t\t\t})\n\t\t\t\t.setProcess(({ queries, ecs }) => {\n\t\t\t\t\tconst pointer = ecs.getResource('inputState').pointer;\n\t\t\t\t\tconst px = pointer.position.x;\n\t\t\t\t\tconst py = pointer.position.y;\n\t\t\t\t\tconst down = pointer.isDown(0);\n\t\t\t\t\tconst justReleased = pointer.justReleased(0);\n\t\t\t\t\tfor (const entity of queries.interactables) {\n\t\t\t\t\t\tconst { uiElement, worldTransform, uiInteraction } = entity.components;\n\t\t\t\t\t\tconst hit =\n\t\t\t\t\t\t\tpx >= worldTransform.x &&\n\t\t\t\t\t\t\tpx < worldTransform.x + uiElement.width &&\n\t\t\t\t\t\t\tpy >= worldTransform.y &&\n\t\t\t\t\t\t\tpy < worldTransform.y + uiElement.height;\n\t\t\t\t\t\tconst prev = uiInteraction.state;\n\t\t\t\t\t\tconst next: UIInteractionState =\n\t\t\t\t\t\t\t!hit ? 'none'\n\t\t\t\t\t\t\t: down ? (prev === 'none' ? 'hover' : 'pressed')\n\t\t\t\t\t\t\t: 'hover';\n\n\t\t\t\t\t\tif (prev === 'pressed' && next === 'hover' && justReleased && hit) {\n\t\t\t\t\t\t\tecs.eventBus.publish('uiButtonPressed', { entityId: entity.id });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (prev === 'none' && next !== 'none') {\n\t\t\t\t\t\t\tecs.eventBus.publish('uiButtonHovered', { entityId: entity.id, entered: true });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (prev !== 'none' && next === 'none') {\n\t\t\t\t\t\t\tecs.eventBus.publish('uiButtonHovered', { entityId: entity.id, entered: false });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (prev !== next) {\n\t\t\t\t\t\t\tuiInteraction.state = next;\n\t\t\t\t\t\t\tecs.markChanged(entity.id, 'uiInteraction');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t// Panel sync: lazy-initialize PixiJS Graphics, redraw when panel or size changes.\n\t\t\t// Registered before labels/progress so panel Graphics sits BEHIND text/fill when an\n\t\t\t// entity carries multiple visual components (e.g. a button with uiPanel + uiLabel).\n\t\t\tworld\n\t\t\t\t.addSystem('ui-panel-sync')\n\t\t\t\t.setPriority(renderSyncPriority)\n\t\t\t\t.inPhase('render')\n\t\t\t\t.inGroup(systemGroup)\n\t\t\t\t.setOnInitialize(async (ecs) => {\n\t\t\t\t\tconst pixi = await import('pixi.js');\n\t\t\t\t\tconst rootContainer = ecs.tryGetResource<Container>('rootContainer');\n\t\t\t\t\tecs.addReactiveQuery('ui-panels', {\n\t\t\t\t\t\twith: ['uiPanel', 'uiElement'],\n\t\t\t\t\t\tonEnter: (entity) => {\n\t\t\t\t\t\t\tconst g = new pixi.Graphics();\n\t\t\t\t\t\t\tpanelPool.set(entity.id, {\n\t\t\t\t\t\t\t\tpixiGraphics: g,\n\t\t\t\t\t\t\t\tlastFillColor: Number.NaN,\n\t\t\t\t\t\t\t\tlastBorderColor: undefined,\n\t\t\t\t\t\t\t\tlastBorderWidth: Number.NaN,\n\t\t\t\t\t\t\t\tlastWidth: Number.NaN,\n\t\t\t\t\t\t\t\tlastHeight: Number.NaN,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif (rootContainer) rootContainer.addChild(g);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonExit: (entityId) => {\n\t\t\t\t\t\t\tconst runtime = panelPool.get(entityId);\n\t\t\t\t\t\t\tif (runtime) {\n\t\t\t\t\t\t\t\truntime.pixiGraphics.removeFromParent();\n\t\t\t\t\t\t\t\truntime.pixiGraphics.destroy();\n\t\t\t\t\t\t\t\tpanelPool.delete(entityId);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.setProcess(({ ecs }) => {\n\t\t\t\t\tfor (const [entityId, runtime] of panelPool) {\n\t\t\t\t\t\tconst panel = ecs.getComponent(entityId, 'uiPanel');\n\t\t\t\t\t\tconst element = ecs.getComponent(entityId, 'uiElement');\n\t\t\t\t\t\tif (!panel || !element) continue;\n\t\t\t\t\t\tsyncPanelRuntime(runtime, panel, element);\n\t\t\t\t\t\tapplyTransform(runtime.pixiGraphics, ecs.getComponent(entityId, 'worldTransform'));\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t// Progress bar sync.\n\t\t\tworld\n\t\t\t\t.addSystem('ui-progress-sync')\n\t\t\t\t.setPriority(renderSyncPriority)\n\t\t\t\t.inPhase('render')\n\t\t\t\t.inGroup(systemGroup)\n\t\t\t\t.setOnInitialize(async (ecs) => {\n\t\t\t\t\tconst pixi = await import('pixi.js');\n\t\t\t\t\tconst rootContainer = ecs.tryGetResource<Container>('rootContainer');\n\t\t\t\t\tecs.addReactiveQuery('ui-progress-bars', {\n\t\t\t\t\t\twith: ['uiProgressBar', 'uiElement'],\n\t\t\t\t\t\tonEnter: (entity) => {\n\t\t\t\t\t\t\tconst g = new pixi.Graphics();\n\t\t\t\t\t\t\tprogressPool.set(entity.id, {\n\t\t\t\t\t\t\t\tpixiGraphics: g,\n\t\t\t\t\t\t\t\tlastValue: Number.NaN,\n\t\t\t\t\t\t\t\tlastMax: Number.NaN,\n\t\t\t\t\t\t\t\tlastFillColor: Number.NaN,\n\t\t\t\t\t\t\t\tlastBgColor: Number.NaN,\n\t\t\t\t\t\t\t\tlastDirection: 'ltr',\n\t\t\t\t\t\t\t\tlastWidth: Number.NaN,\n\t\t\t\t\t\t\t\tlastHeight: Number.NaN,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif (rootContainer) rootContainer.addChild(g);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonExit: (entityId) => {\n\t\t\t\t\t\t\tconst runtime = progressPool.get(entityId);\n\t\t\t\t\t\t\tif (runtime) {\n\t\t\t\t\t\t\t\truntime.pixiGraphics.removeFromParent();\n\t\t\t\t\t\t\t\truntime.pixiGraphics.destroy();\n\t\t\t\t\t\t\t\tprogressPool.delete(entityId);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.setProcess(({ ecs }) => {\n\t\t\t\t\tfor (const [entityId, runtime] of progressPool) {\n\t\t\t\t\t\tconst bar = ecs.getComponent(entityId, 'uiProgressBar');\n\t\t\t\t\t\tconst element = ecs.getComponent(entityId, 'uiElement');\n\t\t\t\t\t\tif (!bar || !element) continue;\n\t\t\t\t\t\tsyncProgressRuntime(runtime, bar, element, scratchFill);\n\t\t\t\t\t\tapplyTransform(runtime.pixiGraphics, ecs.getComponent(entityId, 'worldTransform'));\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t// Message log sync: registered between progress and label so log text sits over panels\n\t\t\t// but under foreground labels when widgets overlap.\n\t\t\tworld\n\t\t\t\t.addSystem('ui-message-log-sync')\n\t\t\t\t.setPriority(renderSyncPriority)\n\t\t\t\t.inPhase('render')\n\t\t\t\t.inGroup(systemGroup)\n\t\t\t\t.setOnInitialize(async (ecs) => {\n\t\t\t\t\tconst pixi = await import('pixi.js');\n\t\t\t\t\tpixiModuleForMessageLog = pixi;\n\t\t\t\t\tconst rootContainer = ecs.tryGetResource<Container>('rootContainer');\n\t\t\t\t\tecs.addReactiveQuery('ui-message-logs', {\n\t\t\t\t\t\twith: ['uiMessageLog', 'uiElement'],\n\t\t\t\t\t\tonEnter: (entity) => {\n\t\t\t\t\t\t\tconst root = new pixi.Container();\n\t\t\t\t\t\t\tmessageLogPool.set(entity.id, {\n\t\t\t\t\t\t\t\trootContainer: root,\n\t\t\t\t\t\t\t\tlines: [],\n\t\t\t\t\t\t\t\tlastLinesRef: null,\n\t\t\t\t\t\t\t\tlastVisibleLines: -1,\n\t\t\t\t\t\t\t\tlastLineHeight: Number.NaN,\n\t\t\t\t\t\t\t\tlastFontFamily: '',\n\t\t\t\t\t\t\t\tlastFontSize: Number.NaN,\n\t\t\t\t\t\t\t\tlastAlign: '',\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif (rootContainer) rootContainer.addChild(root);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonExit: (entityId) => {\n\t\t\t\t\t\t\tconst runtime = messageLogPool.get(entityId);\n\t\t\t\t\t\t\tif (runtime) {\n\t\t\t\t\t\t\t\truntime.rootContainer.removeFromParent();\n\t\t\t\t\t\t\t\truntime.rootContainer.destroy({ children: true });\n\t\t\t\t\t\t\t\tmessageLogPool.delete(entityId);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.setProcess(({ ecs }) => {\n\t\t\t\t\tif (!pixiModuleForMessageLog) return;\n\t\t\t\t\tfor (const [entityId, runtime] of messageLogPool) {\n\t\t\t\t\t\tconst log = ecs.getComponent(entityId, 'uiMessageLog');\n\t\t\t\t\t\tif (!log) continue;\n\t\t\t\t\t\tsyncMessageLogRuntime(runtime, log, pixiModuleForMessageLog);\n\t\t\t\t\t\tapplyTransform(runtime.rootContainer, ecs.getComponent(entityId, 'worldTransform'));\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t// Label sync: registered last so Text sits ON TOP of panels and progress bars when an\n\t\t\t// entity carries multiple visual components.\n\t\t\tworld\n\t\t\t\t.addSystem('ui-label-sync')\n\t\t\t\t.setPriority(renderSyncPriority)\n\t\t\t\t.inPhase('render')\n\t\t\t\t.inGroup(systemGroup)\n\t\t\t\t.setOnInitialize(async (ecs) => {\n\t\t\t\t\tconst pixi = await import('pixi.js');\n\t\t\t\t\tconst rootContainer = ecs.tryGetResource<Container>('rootContainer');\n\t\t\t\t\tecs.addReactiveQuery('ui-labels', {\n\t\t\t\t\t\twith: ['uiLabel'],\n\t\t\t\t\t\tonEnter: (entity) => {\n\t\t\t\t\t\t\tconst label = entity.components.uiLabel;\n\t\t\t\t\t\t\tconst text = new pixi.Text({\n\t\t\t\t\t\t\t\ttext: label.text,\n\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\tfontFamily: label.style.fontFamily,\n\t\t\t\t\t\t\t\t\tfontSize: label.style.fontSize,\n\t\t\t\t\t\t\t\t\tfill: label.style.fill,\n\t\t\t\t\t\t\t\t\talign: label.style.align,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tlabelPool.set(entity.id, {\n\t\t\t\t\t\t\t\tpixiText: text,\n\t\t\t\t\t\t\t\tlastText: label.text,\n\t\t\t\t\t\t\t\tlastFontSize: label.style.fontSize,\n\t\t\t\t\t\t\t\tlastFill: label.style.fill,\n\t\t\t\t\t\t\t\tlastAlign: label.style.align,\n\t\t\t\t\t\t\t\tlastFontFamily: label.style.fontFamily,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif (rootContainer) rootContainer.addChild(text);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonExit: (entityId) => {\n\t\t\t\t\t\t\tconst runtime = labelPool.get(entityId);\n\t\t\t\t\t\t\tif (runtime) {\n\t\t\t\t\t\t\t\truntime.pixiText.removeFromParent();\n\t\t\t\t\t\t\t\truntime.pixiText.destroy();\n\t\t\t\t\t\t\t\tlabelPool.delete(entityId);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.setProcess(({ ecs }) => {\n\t\t\t\t\tfor (const [entityId, runtime] of labelPool) {\n\t\t\t\t\t\tconst label = ecs.getComponent(entityId, 'uiLabel');\n\t\t\t\t\t\tif (!label) continue;\n\t\t\t\t\t\tsyncLabelRuntime(runtime, label);\n\t\t\t\t\t\tapplyTransform(runtime.pixiText, ecs.getComponent(entityId, 'worldTransform'));\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t});\n}\n\n// ==================== Sync Helpers ====================\n\nfunction applyTransform(\n\tobj: { position: { x: number; y: number } },\n\twt: WorldTransform | undefined,\n): void {\n\tif (!wt) return;\n\tif (obj.position.x !== wt.x) obj.position.x = wt.x;\n\tif (obj.position.y !== wt.y) obj.position.y = wt.y;\n}\n\nfunction syncLabelRuntime(runtime: UILabelRuntime, label: UILabel): void {\n\tif (runtime.lastText !== label.text) {\n\t\truntime.pixiText.text = label.text;\n\t\truntime.lastText = label.text;\n\t}\n\tconst style = runtime.pixiText.style;\n\tif (runtime.lastFontSize !== label.style.fontSize) {\n\t\tstyle.fontSize = label.style.fontSize;\n\t\truntime.lastFontSize = label.style.fontSize;\n\t}\n\tif (runtime.lastFill !== label.style.fill) {\n\t\tstyle.fill = label.style.fill;\n\t\truntime.lastFill = label.style.fill;\n\t}\n\tif (runtime.lastAlign !== label.style.align) {\n\t\tstyle.align = label.style.align;\n\t\truntime.lastAlign = label.style.align;\n\t}\n\tif (runtime.lastFontFamily !== label.style.fontFamily) {\n\t\tstyle.fontFamily = label.style.fontFamily;\n\t\truntime.lastFontFamily = label.style.fontFamily;\n\t}\n}\n\nfunction syncPanelRuntime(runtime: UIPanelRuntime, panel: UIPanel, element: UIElement): void {\n\tconst changed =\n\t\truntime.lastFillColor !== panel.fillColor ||\n\t\truntime.lastBorderColor !== panel.borderColor ||\n\t\truntime.lastBorderWidth !== panel.borderWidth ||\n\t\truntime.lastWidth !== element.width ||\n\t\truntime.lastHeight !== element.height;\n\tif (!changed) return;\n\n\tconst g = runtime.pixiGraphics;\n\tg.clear();\n\tg.rect(0, 0, element.width, element.height);\n\tg.fill({ color: panel.fillColor });\n\tif (panel.borderColor !== undefined && panel.borderWidth > 0) {\n\t\tg.stroke({ color: panel.borderColor, width: panel.borderWidth });\n\t}\n\truntime.lastFillColor = panel.fillColor;\n\truntime.lastBorderColor = panel.borderColor;\n\truntime.lastBorderWidth = panel.borderWidth;\n\truntime.lastWidth = element.width;\n\truntime.lastHeight = element.height;\n}\n\nfunction syncProgressRuntime(\n\truntime: UIProgressRuntime,\n\tbar: UIProgressBar,\n\telement: UIElement,\n\tscratchFill: FillRect,\n): void {\n\tconst changed =\n\t\truntime.lastValue !== bar.value ||\n\t\truntime.lastMax !== bar.max ||\n\t\truntime.lastFillColor !== bar.fillColor ||\n\t\truntime.lastBgColor !== bar.bgColor ||\n\t\truntime.lastDirection !== bar.direction ||\n\t\truntime.lastWidth !== element.width ||\n\t\truntime.lastHeight !== element.height;\n\tif (!changed) return;\n\n\tconst clamped = clampProgressValue(bar.value, bar.max);\n\tconst ratio = bar.max > 0 ? clamped / bar.max : 0;\n\tcomputeProgressFillRect(element.width, element.height, ratio, bar.direction, scratchFill);\n\n\tconst g = runtime.pixiGraphics;\n\tg.clear();\n\tg.rect(0, 0, element.width, element.height);\n\tg.fill({ color: bar.bgColor });\n\tif (scratchFill.width > 0 && scratchFill.height > 0) {\n\t\tg.rect(scratchFill.x, scratchFill.y, scratchFill.width, scratchFill.height);\n\t\tg.fill({ color: bar.fillColor });\n\t}\n\n\truntime.lastValue = bar.value;\n\truntime.lastMax = bar.max;\n\truntime.lastFillColor = bar.fillColor;\n\truntime.lastBgColor = bar.bgColor;\n\truntime.lastDirection = bar.direction;\n\truntime.lastWidth = element.width;\n\truntime.lastHeight = element.height;\n}\n\nfunction syncMessageLogRuntime(\n\truntime: UIMessageLogRuntime,\n\tlog: UIMessageLog,\n\tpixi: typeof import('pixi.js'),\n): void {\n\tconst styleChanged =\n\t\truntime.lastFontFamily !== log.style.fontFamily ||\n\t\truntime.lastFontSize !== log.style.fontSize ||\n\t\truntime.lastAlign !== log.style.align;\n\tconst linesChanged = runtime.lastLinesRef !== log.lines;\n\tconst layoutChanged =\n\t\truntime.lastVisibleLines !== log.visibleLines ||\n\t\truntime.lastLineHeight !== log.lineHeight;\n\tif (!linesChanged && !layoutChanged && !styleChanged) return;\n\n\tconst visible = log.lines.slice(-log.visibleLines);\n\n\twhile (runtime.lines.length < visible.length) {\n\t\tconst container = new pixi.Container();\n\t\truntime.rootContainer.addChild(container);\n\t\truntime.lines.push({ container, texts: [] });\n\t}\n\truntime.lines.forEach((line, index) => {\n\t\tif (index >= visible.length) line.container.visible = false;\n\t});\n\n\tvisible.forEach((fragments, lineIndex) => {\n\t\tconst line = runtime.lines[lineIndex];\n\t\tif (!line) return;\n\t\tline.container.visible = true;\n\t\tline.container.position.y = lineIndex * log.lineHeight;\n\n\t\twhile (line.texts.length < fragments.length) {\n\t\t\tconst t = new pixi.Text({\n\t\t\t\ttext: '',\n\t\t\t\tstyle: {\n\t\t\t\t\tfontFamily: log.style.fontFamily,\n\t\t\t\t\tfontSize: log.style.fontSize,\n\t\t\t\t\tfill: 0xffffff,\n\t\t\t\t\talign: log.style.align,\n\t\t\t\t},\n\t\t\t});\n\t\t\tline.container.addChild(t);\n\t\t\tline.texts.push(t);\n\t\t}\n\n\t\tlet cursorX = 0;\n\t\tline.texts.forEach((t, j) => {\n\t\t\tconst frag = fragments[j];\n\t\t\tif (!frag) {\n\t\t\t\tt.visible = false;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tt.visible = true;\n\t\t\tif (t.text !== frag.text) t.text = frag.text;\n\t\t\tif (t.style.fill !== frag.color) t.style.fill = frag.color;\n\t\t\tt.position.x = cursorX;\n\t\t\tcursorX += t.width;\n\t\t});\n\t});\n\n\t// Style fields are shared across all fragments — apply once per Text when they change,\n\t// keeping the per-fragment loop above limited to per-fragment text + color writes.\n\tif (styleChanged) {\n\t\truntime.lines.forEach((line) => {\n\t\t\tline.texts.forEach((t) => {\n\t\t\t\tconst s = t.style;\n\t\t\t\tif (s.fontFamily !== log.style.fontFamily) s.fontFamily = log.style.fontFamily;\n\t\t\t\tif (s.fontSize !== log.style.fontSize) s.fontSize = log.style.fontSize;\n\t\t\t\tif (s.align !== log.style.align) s.align = log.style.align;\n\t\t\t});\n\t\t});\n\t}\n\n\truntime.lastLinesRef = log.lines;\n\truntime.lastVisibleLines = log.visibleLines;\n\truntime.lastLineHeight = log.lineHeight;\n\truntime.lastFontFamily = log.style.fontFamily;\n\truntime.lastFontSize = log.style.fontSize;\n\truntime.lastAlign = log.style.align;\n}\n"
7
7
  ],
8
- "mappings": "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",
9
- "debugId": "C99ACED21032E0BC64756E2164756E21",
8
+ "mappings": "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",
9
+ "debugId": "B6E1260EDCFC611D64756E2164756E21",
10
10
  "names": []
11
11
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ecspresso",
3
- "version": "0.14.7",
3
+ "version": "0.14.9",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/index.js",
6
6
  "types": "dist/index.d.ts",