blecsd 0.1.0 → 0.2.0
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/README.md +44 -4
- package/dist/{chunk-QIKIOVP2.js → chunk-35I22JJO.js} +1 -1
- package/dist/chunk-3APDF6RW.js +1 -0
- package/dist/{chunk-OUXUPF3V.js → chunk-4GISPPOH.js} +27 -27
- package/dist/chunk-6N6BRCEM.js +4 -0
- package/dist/chunk-EAY7B5GL.js +1 -0
- package/dist/{chunk-TDXJDLY6.js → chunk-EJ5WVDDZ.js} +1 -1
- package/dist/{chunk-B6Z2JFRY.js → chunk-FMFEOAML.js} +1 -1
- package/dist/chunk-JUWDTH25.js +1 -0
- package/dist/chunk-K3SX2LY5.js +1 -0
- package/dist/chunk-LB3JA744.js +19 -0
- package/dist/chunk-OB66FB4F.js +1 -0
- package/dist/{chunk-FC5FFAAC.js → chunk-VCW7EOZ4.js} +1 -1
- package/dist/chunk-WHF27JF3.js +4 -0
- package/dist/chunk-WY3KY2TR.js +1 -0
- package/dist/componentStorage-DTkj1Qyj.d.ts +246 -0
- package/dist/components/index.d.ts +2 -1
- package/dist/components/index.js +1 -1
- package/dist/core/index.d.ts +226 -193
- package/dist/core/index.js +1 -1
- package/dist/debug/index.js +1 -1
- package/dist/index.d.ts +6 -4
- package/dist/index.js +1 -1
- package/dist/packedStore-480t2X74.d.ts +191 -0
- package/dist/systems/index.d.ts +235 -23
- package/dist/systems/index.js +1 -1
- package/dist/terminal/index.js +1 -1
- package/dist/{tilemap-D1HJvKy3.d.ts → tilemap-j0twN9-y.d.ts} +91 -2
- package/dist/utils/index.d.ts +3 -157
- package/dist/utils/index.js +1 -1
- package/dist/widgets/index.js +1 -1
- package/package.json +3 -2
- package/dist/chunk-AQ7LW75B.js +0 -1
- package/dist/chunk-J4JZ2NU2.js +0 -1
- package/dist/chunk-K37L3G4Z.js +0 -4
- package/dist/chunk-OVT2PPGW.js +0 -19
- package/dist/chunk-YAMOSPWB.js +0 -4
- package/dist/chunk-YD6ULIUR.js +0 -1
package/README.md
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
[](https://github.com/Kadajett/blECSd/actions/workflows/ci.yml)
|
|
4
4
|
[](https://www.npmjs.com/package/blecsd)
|
|
5
5
|
|
|
6
|
+

|
|
7
|
+
|
|
6
8
|
A high-performance terminal UI library built on TypeScript and bitECS.
|
|
7
9
|
|
|
8
10
|
blECSd provides a complete toolkit for building terminal applications: dashboards, file managers, system monitors, CLI tools, and games. It combines the performance of an Entity Component System with production-ready widgets and form controls.
|
|
@@ -26,8 +28,9 @@ npm install blecsd
|
|
|
26
28
|
## Quick Start
|
|
27
29
|
|
|
28
30
|
```typescript
|
|
29
|
-
import { createWorld, addEntity } from 'bitecs';
|
|
30
31
|
import {
|
|
32
|
+
createWorld,
|
|
33
|
+
addEntity,
|
|
31
34
|
setPosition,
|
|
32
35
|
setDimensions,
|
|
33
36
|
setBorder,
|
|
@@ -161,8 +164,7 @@ blECSd is a library, not a framework:
|
|
|
161
164
|
|
|
162
165
|
```typescript
|
|
163
166
|
// Your world, your control
|
|
164
|
-
import { createWorld, addEntity } from '
|
|
165
|
-
import { setPosition, setRenderable, layoutSystem, renderSystem } from 'blecsd';
|
|
167
|
+
import { createWorld, addEntity, setPosition, setRenderable, layoutSystem, renderSystem } from 'blecsd';
|
|
166
168
|
|
|
167
169
|
const world = createWorld();
|
|
168
170
|
const eid = addEntity(world);
|
|
@@ -175,6 +177,44 @@ layoutSystem(world);
|
|
|
175
177
|
renderSystem(world);
|
|
176
178
|
```
|
|
177
179
|
|
|
180
|
+
## PackedStore: Cache-Friendly Storage
|
|
181
|
+
|
|
182
|
+
blECSd includes a `PackedStore<T>` primitive for systems that iterate over entities in hot paths (rendering, animation, collision). It provides O(1) add/remove/get with dense, cache-friendly iteration.
|
|
183
|
+
|
|
184
|
+
### The Three-Vector Pattern
|
|
185
|
+
|
|
186
|
+
PackedStore uses four parallel arrays to keep live data contiguous:
|
|
187
|
+
|
|
188
|
+
```
|
|
189
|
+
data[] Dense values, packed into [0, size) with no gaps
|
|
190
|
+
dataIndex[] Maps handle.index -> position in data[]
|
|
191
|
+
id[] Maps data position -> handle.index (inverse of dataIndex)
|
|
192
|
+
generations[] Generation counter per slot for stale handle detection
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
Removals use swap-and-pop: the last element fills the gap, so `data[]` is always contiguous. This means iterating `data[0..size]` hits sequential memory with no pointer chasing, which is 2-5x faster than `Map.forEach` for iteration-heavy workloads.
|
|
196
|
+
|
|
197
|
+
### createComponentStore\<T\>()
|
|
198
|
+
|
|
199
|
+
For most code, use `createComponentStore<T>()` instead of PackedStore directly. It provides a Map-like API (`get`, `set`, `has`, `delete`, `forEach`) with two backing modes:
|
|
200
|
+
|
|
201
|
+
```typescript
|
|
202
|
+
import { createComponentStore } from 'blecsd';
|
|
203
|
+
|
|
204
|
+
// Iterable mode: backed by PackedStore, dense iteration via forEach/data()
|
|
205
|
+
// Use for stores iterated in hot paths (widget rendering, layout, animation)
|
|
206
|
+
const renderData = createComponentStore<RenderInfo>({ iterable: true });
|
|
207
|
+
|
|
208
|
+
// Non-iterable mode (default): backed by a plain Map
|
|
209
|
+
// Use for point lookups like callback registries or config
|
|
210
|
+
const callbacks = createComponentStore<() => void>({ iterable: false });
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
| Mode | Backing | Iteration | Best for |
|
|
214
|
+
|------|---------|-----------|----------|
|
|
215
|
+
| `iterable: true` | PackedStore | Dense, cache-friendly | Hot paths (render, animate, layout) |
|
|
216
|
+
| `iterable: false` | Map | Standard Map iteration | Callbacks, config, point lookups |
|
|
217
|
+
|
|
178
218
|
## Use Cases
|
|
179
219
|
|
|
180
220
|
- **Dashboards**: System monitors, log viewers, status displays
|
|
@@ -187,7 +227,7 @@ renderSystem(world);
|
|
|
187
227
|
|
|
188
228
|
| Feature | blECSd | Ink | blessed | Textual |
|
|
189
229
|
|---------|--------|-----|---------|---------|
|
|
190
|
-
| Architecture | ECS (data-oriented) | React (component) | Class-based | Widget classes |
|
|
230
|
+
| Architecture | ECS + PackedStore (data-oriented) | React (component) | Class-based | Widget classes |
|
|
191
231
|
| Language | TypeScript | TypeScript/JSX | JavaScript | Python |
|
|
192
232
|
| Widgets | 18 built-in | Few built-in | Many built-in | Many built-in |
|
|
193
233
|
| Animation | Physics-based | Manual | Manual | CSS-like |
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import {b,d as d$2}from'./chunk-4LWWONFK.js';import {
|
|
1
|
+
import {b,d as d$2}from'./chunk-4LWWONFK.js';import {d as d$1,A,i,B as B$1}from'./chunk-TWSWTBYL.js';import {a,e as e$1,r as r$1,o,t}from'./chunk-C5PCEQ6G.js';import {k as k$1}from'./chunk-VOCM5T2G.js';import {c as c$1,a as a$1}from'./chunk-XZA63ZPO.js';import {s,n as n$1,i as i$1}from'./chunk-LCN2ZITE.js';import {r,c,p as p$1,h,e}from'./chunk-W5OU7Z6J.js';import {n,k,i as i$2}from'./chunk-PXXGH3BV.js';import {z}from'zod';s();n();var d=z.number().int().min(0).max(4294967295),J=z.number().int().min(0).max(65535),ne=z.object({fg:d.optional(),bg:d.optional(),selectedFg:d.optional(),selectedBg:d.optional(),cursorFg:d.optional(),cursorBg:d.optional(),showLineNumbers:z.boolean().optional(),lineNumberWidth:z.number().int().nonnegative().max(20).optional(),attrs:J.optional()}),Re=z.object({fg:d.default(4294967295),bg:d.default(255),selectedFg:d.default(255),selectedBg:d.default(4294967295),cursorFg:d.default(255),cursorBg:d.default(16711935),showLineNumbers:z.boolean().default(false),lineNumberWidth:z.number().int().nonnegative().max(20).default(0),attrs:J.default(a.NONE)}),Q={fg:4294967295,bg:255,selectedFg:255,selectedBg:4294967295,cursorFg:255,cursorBg:16711935,showLineNumbers:false,lineNumberWidth:0,attrs:a.NONE},p=null,L=new Map,B=new Map;function Ne(t){p=t;}function Se(){return p}function Ve(){p=null;}function ve(t,e){L.set(t,e);}function we(t){return L.get(t)}function De(t){L.delete(t);}function ze(t,e){L.set(t,e);}function We(t,e){let r=ne.parse(e),f={};for(let[n,o]of Object.entries(r))o!==void 0&&(f[n]=o);let i=B.get(t)??Q;B.set(t,{...i,...f});}function re(t){return B.get(t)??Q}function Fe(t){B.delete(t);}function ie(t,e){if(!i$2(t,e,c))return a.NONE;let r=a.NONE;return c.bold[e]===1&&(r|=a.BOLD),c.underline[e]===1&&(r|=a.UNDERLINE),c.blink[e]===1&&(r|=a.BLINK),c.inverse[e]===1&&(r|=a.INVERSE),r}function oe(t,e){if(c$1(t,e))return {x:a$1.x[e],y:a$1.y[e],width:a$1.width[e],height:a$1.height[e]}}function fe(t,e){return n$1(t,e)?{top:i$1.top[e]===1?1:0,right:i$1.right[e]===1?1:0,bottom:i$1.bottom[e]===1?1:0,left:i$1.left[e]===1?1:0}:{top:0,right:0,bottom:0,left:0}}function ue(t,e){return {x:t.x+e.left,y:t.y+e.top,width:Math.max(0,t.width-e.left-e.right),height:Math.max(0,t.height-e.top-e.bottom)}}function M(t$1,e,r,f,i,n,o$1,u){let m=e$1(" ",n,o$1,u);for(let l=0;l<f;l++)o(t$1,e+l,r,m);let a=i.length>f?i.slice(0,f):i;a.length>0&&t(t$1,e,r,a,n,o$1,u);}function le(t$1,e,r,f,i,n,o){let u=`${String(i+1).padStart(f-1," ")} `;t(t$1,e,r,u.slice(0,f),n,o,a.DIM);}function ae(t,e,r,f,i,n){let{buffer:o}=t,{x:u,y:m,width:a$1,height:l}=r,x=k$1(i,f.start,f.end),S=n.showLineNumbers?u+n.lineNumberWidth:u,V=n.showLineNumbers?Math.max(0,a$1-n.lineNumberWidth):a$1,b=d$1.selectedLine[e],v=d$1.cursorLine[e];for(let c=0;c<x.lines.length;c++){let E=m+c;if(c>=l)break;let D=x.startLine+c,Z=x.lines[c]??"",z=n.fg,W=n.bg;D===v?(z=n.cursorFg,W=n.cursorBg):D===b&&(z=n.selectedFg,W=n.selectedBg),n.showLineNumbers&&le(o,u,E,n.lineNumberWidth,D,n.fg,n.bg),M(o,S,E,V,Z,z,W,n.attrs);}let T=Math.min(x.lines.length,l);for(let c=T;c<l;c++){let E=m+c;n.showLineNumbers&&M(o,u,E,n.lineNumberWidth,"",n.fg,n.bg,a.NONE),M(o,S,E,V,"",n.fg,n.bg,a.NONE);}}function se(t,e,r,f,i){if(r<=i)return;let{buffer:n}=t,o$1=e.height,u=e.x+e.width-1,m=e.y,a=i/r,l=Math.max(1,Math.floor(o$1*a)),x=Math.floor(f/r*o$1),S=e$1("\u2502",1717987071,255);for(let b=0;b<o$1;b++)o(n,u,m+b,S);let V=e$1("\u2588",2863311615,255);for(let b=0;b<l;b++){let v=m+x+b;v<m+o$1&&o(n,u,v,V);}}function de(t,e$2,r){let{world:f,buffer:i}=t,n=e(f,e$2);if(!n||n.transparent)return;let o=ie(f,e$2),u=e$1(" ",n.fg,n.bg,o);r$1(i,r.x,r.y,r.width,r.height,u);}function me(t,e){let{world:r,doubleBuffer:f}=t,i$1=oe(r,e);if(!i$1||i$1.width<=0||i$1.height<=0)return;let n=L.get(e);if(!n)return;let o=i(r,e);if(!o)return;let u=re(e);de(t,e,i$1);let m=fe(r,e),a=ue(i$1,m);a.width>0&&a.height>0&&ae(t,e,a,o,n,u);let l={firstVisibleLine:d$1.firstVisibleLine[e],visibleLineCount:d$1.visibleLineCount[e],totalLineCount:d$1.totalLineCount[e]};l.totalLineCount>l.visibleLineCount&&se(t,a,l.totalLineCount,l.firstVisibleLine,l.visibleLineCount),d$2(f,i$1.x,i$1.y,i$1.width,i$1.height),B$1(r,e),h(r,e);}var ce=t=>{if(!p)return t;let e=b(p),r$1={world:t,buffer:e,doubleBuffer:p},f=k(t,[d$1,r,c]);for(let i of f)p$1(t,i)&&(!A(t,i)&&c.dirty[i]!==1||me(r$1,i));return t};function Me(){return ce}function Oe(){p=null,L.clear(),B.clear();}function ke(t){L.delete(t),B.delete(t);}export{Re as a,Ne as b,Se as c,Ve as d,ve as e,we as f,De as g,ze as h,We as i,re as j,Fe as k,ce as l,Me as m,Oe as n,ke as o};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {f,B,a as a$3,b as b$1,A,x,y,z,D as D$1,Y,$,aa,pa,na,_ as _$1,ka,qa,xa,Ta,Ga,Aa as Aa$1,ca,ea as ea$1,za as za$1}from'./chunk-JUWDTH25.js';import {O,Q,_,va,ya,za,Aa,Ba,la,ia,ha,$ as $$1,ea,fa}from'./chunk-JKVHO4LH.js';import {k as k$1,l as l$1}from'./chunk-OB66FB4F.js';import {a as a$1}from'./chunk-WY3KY2TR.js';import {b,a as a$5}from'./chunk-H2YAOJDW.js';import {f as f$1,b as b$2,n as n$1}from'./chunk-BCADUCOZ.js';import {a as a$2}from'./chunk-EAY7B5GL.js';import {a,g,j as j$2,b as b$3,f as f$2}from'./chunk-K3SX2LY5.js';import {l,q as q$1,c as c$1,r as r$1}from'./chunk-KD55INV7.js';import {r,s,t,y as y$1,p as p$1,w,K as K$1,c as c$2,g as g$1,M as M$1}from'./chunk-W5OU7Z6J.js';import {a as a$4,i as i$1}from'./chunk-G7GIWWLE.js';import {n,k,i,d as d$1,j as j$1,e,l as l$2,m}from'./chunk-PXXGH3BV.js';n();var Tn=1e4;function Pn(e=Tn){return {animationId:new Uint32Array(e),playing:new Uint8Array(e),loop:new Uint8Array(e),speed:new Float32Array(e),elapsed:new Float32Array(e),currentFrameIndex:new Uint16Array(e),direction:new Int8Array(e)}}var kn=Pn(),Ht=new WeakSet,Dt=null;function Rt(e){return Ht.has(e)||(Dt=l$2(e,m(()=>kn)),Ht.add(e)),Dt}function Bt(e){let t=Rt(e);return Array.from(k(e,[t]))}function An(e,t){let n=Rt(e);return i(e,t,n)}var He=e=>{let t=b(),n=Bt(e);for(let r of n)O(e,r,t);return e};function Wn(){return He}function Fn(e,t=0){e.registerSystem(2,He,t);}function Hn(e,t,n){for(let r of t)O(e,r,n);}n();function Dn(e,t){if(w(e,t))return {x:r.x[t],y:r.y[t]}}function Rn(e,t,n,r$1,o){i(e,t,r)&&(r.x[t]=r.x[t]+n*o,r.y[t]=r.y[t]+r$1*o);}function Bn(e,t){let n=e.getPosition??Dn,r=e.applyMovement??Rn;return o=>{let i=e.getDelta(),s=t(o);for(let a of s)f(o,a)&&(B(o,a,i),Yn(o,a,i,n,r));return o}}function Yn(e,t,n,r,o){let i=a$3.behaviorType[t];if(i===b$1.Idle)return;if(i===b$1.Custom){A(e,t,n);return}let s=r(e,t);if(!s)return;if(i===b$1.Patrol){Xn(e,t,s.x,s.y,n,o);return}let a=a$3.targetEntity[t];if(a===0)return;let l=r(e,a);l&&(i===b$1.Chase?In(e,t,s.x,s.y,l.x,l.y,n,o):i===b$1.Flee&&zn(e,t,s.x,s.y,l.x,l.y,n,o));}function Xn(e,t,n,r,o,i){let s=x(e,t,n,r,o);s&&(s.dx!==0||s.dy!==0)&&i(e,t,s.dx,s.dy,o);}function In(e,t,n,r,o,i,s,a){let l=y(e,t,n,r,o,i);l&&(l.dx!==0||l.dy!==0)&&a(e,t,l.dx,l.dy,s);}function zn(e,t,n,r,o,i,s,a){let l=z(e,t,n,r,o,i);l&&(l.dx!==0||l.dy!==0)&&a(e,t,l.dx,l.dy,s);}n();function De(e){return Array.from(k(e,[D$1]))}var Re=e=>{let t=b(),n=De(e);for(let r of n)Y(e,r,t);return e};function Ln(){return Re}function On(e,t=20){e.registerSystem(2,Re,t);}function wn(e,t){let n=De(e);for(let r of n)Y(e,r,t);}n();var se=67108864;function Be(e,t){if(e>=se||t>=se)throw new RangeError(`Entity IDs must be below ${se} for collision-free pair keys. Got: ${e}, ${t}`);return e*se+t}var d={eventBus:a$1(),activePairs:a(),activeTriggers:a(),pairHandles:new Map,triggerHandles:new Map};function Vn(){return d.eventBus}function Gn(){return d.activePairs.size}function qn(){return {data:d.activePairs.data,size:d.activePairs.size}}function Un(){return d.activeTriggers.size}function Nn(){return {data:d.activeTriggers.data,size:d.activeTriggers.size}}function _n(){g(d.activePairs),g(d.activeTriggers),d.pairHandles.clear(),d.triggerHandles.clear();}function Xt(e){return Array.from(k(e,[Q]))}function Zn(e,t,n,r$1,o,i$1,s,a){if(!i(e,a,r))return;let l=Q.layer[a],u=Q.mask[a];if(!$$1(o,i$1,l,u))return;let m=r.x[a],y=r.y[a];if(!ea(t,n,r$1,a,m,y))return;let g=_(e,a);return fa(t,a,s||g)}function It(e){let t=Xt(e),n=[];for(let r$1=0;r$1<t.length;r$1++){let o=t[r$1];if(o===void 0||!i(e,o,r))continue;let i$1=r.x[o],s=r.y[o],a=Q.layer[o],l=Q.mask[o],u=_(e,o);for(let m=r$1+1;m<t.length;m++){let y=t[m];if(y===void 0)continue;let g=Zn(e,o,i$1,s,a,l,u,y);g&&n.push(g);}}return n}function Yt(e,t,n,r){let{data:o}=e;for(let i=e.size-1;i>=0;i--){let s=o[i];if(!s)continue;let a=Be(s.entityA,s.entityB);if(n.has(a))continue;let l=t.get(a);l&&(t.delete(a),f$2(e,l),d.eventBus.emit(r,{entityA:s.entityA,entityB:s.entityB}));}}function $n(e,t,n){let r=Be(e.entityA,e.entityB);if(e.isTrigger){if(n.add(r),!d.triggerHandles.has(r)){let o=b$3(d.activeTriggers,e);d.triggerHandles.set(r,o),d.eventBus.emit("triggerEnter",{entityA:e.entityA,entityB:e.entityB});}}else if(t.add(r),!d.pairHandles.has(r)){let o=b$3(d.activePairs,e);d.pairHandles.set(r,o),d.eventBus.emit("collisionStart",{entityA:e.entityA,entityB:e.entityB});}}function Qn(e){let t=new Set,n=new Set;for(let r of e)$n(r,t,n);Yt(d.activePairs,d.pairHandles,t,"collisionEnd"),Yt(d.activeTriggers,d.triggerHandles,n,"triggerExit");}var Ye=e=>{let t=It(e);return Qn(t),e};function Kn(){return Ye}function jn(e,t=10){e.registerSystem(2,Ye,t);}function Jn(e){let{data:t}=d.activePairs;for(let n=0;n<d.activePairs.size;n++){let r=t[n];if(r&&(r.entityA===e||r.entityB===e))return true}return false}function er(e){let{data:t}=d.activeTriggers;for(let n=0;n<d.activeTriggers.size;n++){let r=t[n];if(r&&(r.entityA===e||r.entityB===e))return true}return false}function tr(e){let t=[],{data:n}=d.activePairs;for(let r=0;r<d.activePairs.size;r++){let o=n[r];o&&(o.entityA===e?t.push(o.entityB):o.entityB===e&&t.push(o.entityA));}return t}function nr(e){let t=[],{data:n}=d.activeTriggers;for(let r=0;r<d.activeTriggers.size;r++){let o=n[r];o&&(o.entityA===e?t.push(o.entityB):o.entityB===e&&t.push(o.entityA));}return t}function rr(e,t){let n=Math.min(e,t),r=Math.max(e,t),o=Be(n,r);return d.pairHandles.has(o)||d.triggerHandles.has(o)}var ue=new Map,le=new Map;function or(){return {dragging:null,startX:0,startY:0,offsetX:0,offsetY:0,lastX:0,lastY:0,constraints:{},verifyCallback:null}}function ir(e,t){ue.set(e,t);}function zt(e){return ue.get(e)??{}}function ar(e){ue.delete(e);}function sr(e,t){t?le.set(e,t):le.delete(e);}function Lt(e){return le.get(e)??null}function lr(e,t,n,r$1){return r$1==="x"?{x:t,y:r.y[e]??n}:r$1==="y"?{x:r.x[e]??t,y:n}:{x:t,y:n}}function ur(e,t,n){return n?{x:Math.round(e/n.x)*n.x,y:Math.round(t/n.y)*n.y}:{x:e,y:t}}function cr(e,t,n){let r=e,o=t;return n.minX!==void 0&&(r=Math.max(r,n.minX)),n.maxX!==void 0&&(r=Math.min(r,n.maxX)),n.minY!==void 0&&(o=Math.max(o,n.minY)),n.maxY!==void 0&&(o=Math.min(o,n.maxY)),{x:r,y:o}}function mr(e,t,n,r,o){if(!o)return {x:n,y:r};let i=i$1(e,t);if(i===a$4)return {x:n,y:r};let s=M$1(e,i);if(!s)return {x:n,y:r};let a=M$1(e,t),l=a?.width??1,u=a?.height??1;return {x:Math.max(0,Math.min(n,s.width-l)),y:Math.max(0,Math.min(r,s.height-u))}}function fr(e,t,n,r,o){let i=lr(t,n,r,o.constrainAxis);return i=ur(i.x,i.y,o.snapToGrid),i=cr(i.x,i.y,o),i=mr(e,t,i.x,i.y,o.constrainToParent),i}function dr(e){let t$1=or();return {getState(){return t$1},isDragging(){return t$1.dragging!==null},getDraggingEntity(){return t$1.dragging},canDrag(n,r){return l(n,r)},startDrag(n,r,o,i){if(!l(n,r)||t$1.dragging!==null)return false;let s=t(n,r);if(!s)return false;if(t$1.dragging=r,t$1.startX=s.x,t$1.startY=s.y,t$1.offsetX=o-s.x,t$1.offsetY=i-s.y,t$1.lastX=s.x,t$1.lastY=s.y,t$1.constraints=zt(r),t$1.verifyCallback=Lt(r),t$1.constraints.bringToFront){let a=t$1.constraints.frontZIndex??9999;y$1(n,r,a);}return e.emit("dragstart",{entity:r,startX:s.x,startY:s.y,mouseX:o,mouseY:i}),true},updateDrag(n,r,o){if(t$1.dragging===null)return false;let i=t$1.dragging,s$1=r-t$1.offsetX,a=o-t$1.offsetY,l=fr(n,i,s$1,a,t$1.constraints);s$1=l.x,a=l.y;let u=s$1-t$1.lastX,m=a-t$1.lastY;return u===0&&m===0||t$1.verifyCallback&&!t$1.verifyCallback(i,u,m)?false:(s(n,i,s$1,a),t$1.lastX=s$1,t$1.lastY=a,e.emit("drag",{entity:i,x:s$1,y:a,dx:u,dy:m,mouseX:r,mouseY:o}),true)},endDrag(n,r=null,o=false){if(t$1.dragging===null)return;let i=t$1.dragging,s=t(n,i),a=s?.x??t$1.lastX,l=s?.y??t$1.lastY;e.emit("dragend",{entity:i,x:a,y:l,totalDx:a-t$1.startX,totalDy:l-t$1.startY,cancelled:o}),o||e.emit("drop",{entity:i,x:a,y:l,dropTarget:r}),t$1.dragging=null,t$1.startX=0,t$1.startY=0,t$1.offsetX=0,t$1.offsetY=0,t$1.lastX=0,t$1.lastY=0,t$1.constraints={},t$1.verifyCallback=null;},cancelDrag(n){if(t$1.dragging===null)return;let r=t$1.dragging;s(n,r,t$1.startX,t$1.startY),this.endDrag(n,null,true);}}}function pr(){ue.clear(),le.clear();}n();var ce=null,K=new WeakMap,Xe=new WeakMap;function Ie(e){let t=K.get(e);return t||(t=[],K.set(e,t)),t}function Ot(){return ce||(ce=a$1()),ce}function yr(){ce=null;}var gr=e=>k(e,[r,c$2,c$1]);function q(e){let t=gr(e),n=[];for(let r$1 of t){if(!q$1(e,r$1)||!p$1(e,r$1))continue;let o=c$1.tabIndex[r$1];o<0||n.push({eid:r$1,tabIndex:o,y:r.y[r$1],x:r.x[r$1]});}return n.sort((r,o)=>r.tabIndex!==0&&o.tabIndex!==0?r.tabIndex-o.tabIndex:r.tabIndex!==0?-1:o.tabIndex!==0?1:r.y!==o.y?r.y-o.y:r.x-o.x),n.map(r=>r.eid)}function me(e){let t=f$1(e);if(!t)return null;let n=b$2.focused[t];return n===a$4?null:n}function U(e,t,n,r){let o=Ot();r!==null&&(r$1(e,r,false),g$1(e,r),o.emit("blur",{entity:r,previousEntity:null,nextEntity:n})),n!==null&&(r$1(e,n,true),g$1(e,n),o.emit("focus",{entity:n,previousEntity:r,nextEntity:null})),n$1(e,t,n);}function X(e,t){let n=f$1(e);if(!n||!q$1(e,t)||!p$1(e,t))return false;let r=b$2.focused[n],o=r===0?null:r;return o===t||U(e,n,t,o),true}function wt(e){let t=f$1(e);if(!t)return;let n=b$2.focused[t],r=n===0?null:n;r!==null&&U(e,t,null,r);}function br(e){let t=f$1(e);if(!t)return null;let n=q(e);if(n.length===0)return null;let r=b$2.focused[t],o=r===0?null:r,i=0;if(o!==null){let a=n.indexOf(o);a>=0&&(i=(a+1)%n.length);}let s=n[i];return s===void 0?null:(U(e,t,s,o),s)}function Sr(e){let t=f$1(e);if(!t)return null;let n=q(e);if(n.length===0)return null;let r=b$2.focused[t],o=r===0?null:r,i=n.length-1;if(o!==null){let a=n.indexOf(o);a>=0&&(i=(a-1+n.length)%n.length);}let s=n[i];return s===void 0?null:(U(e,t,s,o),s)}function Vt(e){let t=q(e);if(t.length===0)return null;let n=t[0];return n===void 0?null:X(e,n)?n:null}function hr(e){let t=q(e);if(t.length===0)return null;let n=t[t.length-1];return n===void 0?null:X(e,n)?n:null}function xr(e,t){let n=Ie(e),r=me(e);return r!==null&&n.push(r),X(e,t)}function vr(e){let t=Ie(e);if(t.length===0)return wt(e),null;let n=t.pop();return q$1(e,n)&&p$1(e,n)?(X(e,n),n):Gt(e)}function Er(e){let t=me(e);Xe.set(e,t);}function Mr(e){let t=Xe.get(e);return Xe.delete(e),t==null?null:q$1(e,t)&&p$1(e,t)?(X(e,t),t):null}function Gt(e){let t=Ie(e);for(;t.length>0;){let n=t.pop();if(q$1(e,n)&&p$1(e,n))return X(e,n),n}return Vt(e)}function Cr(e,t){if(t===0)return me(e);let n=f$1(e);if(!n)return null;let r=q(e);if(r.length===0)return null;let o=b$2.focused[n],i=o===0?null:o,s=-1;i!==null&&(s=r.indexOf(i));let a;s<0?a=t>0?0:r.length-1:a=((s+t)%r.length+r.length)%r.length;let l=r[a];return l===void 0?null:(U(e,n,l,i),l)}function Tr(e){let t=K.get(e);return t?t.length:0}function Pr(e){let t=K.get(e);t&&(t.length=0);}function kr(e){let t=K.get(e);return !t||t.length===0?null:t[t.length-1]??null}var qt=e=>{let t=f$1(e);if(!t)return e;let n=b$2.focused[t];if(n!==0){let r=n;(!q$1(e,r)||!p$1(e,r))&&U(e,t,null,r);}return e};function Ar(){return qt}var Nt={targetFrameMs:16.67,phaseBudgets:{},rollingWindowSize:120,warnOnOverrun:true},p=null;function ze(e){return {samples:Array.from({length:e},()=>0),idx:0,count:0,total:0,min:Number.POSITIVE_INFINITY,max:0}}function _t(e,t){let n=e.samples[e.idx%e.samples.length]??0;e.samples[e.idx%e.samples.length]=t,e.idx++,e.count<e.samples.length?(e.count++,e.total+=t):e.total+=t-n,t<e.min&&(e.min=t),t>e.max&&(e.max=t);}function N(e,t){if(e.count===0)return 0;let n=e.samples.slice(0,e.count).sort((o,i)=>o-i),r=Math.min(Math.floor(n.length*t),n.length-1);return n[r]??0}function Ut(e){return e.count>0?e.total/e.count:0}function Wr(e){let t={...Nt,...e};return p={config:t,systemSamples:new Map,phaseTotals:new Map,frameSamples:ze(t.rollingWindowSize),totalFrames:0,budgetOverruns:0,alerts:[],onAlert:null},Le()}function Zt(e,t){if(!p)return;let n=p.systemSamples.get(e);n||(n=ze(p.config.rollingWindowSize),p.systemSamples.set(e,n)),_t(n,t);}function Fr(e,t){if(!p)return;p.phaseTotals.set(e,t);let n=p.config.phaseBudgets[e];if(n!==void 0&&t>n){let r={phase:e,budgetMs:n,actualMs:t,frame:p.totalFrames};p.alerts.push(r),p.alerts.length>100&&p.alerts.shift(),p.budgetOverruns++,p.onAlert&&p.onAlert(r);}}function Hr(e){p&&(_t(p.frameSamples,e),p.totalFrames++);}function Dr(e,t){return n=>{let r=performance.now(),o=t(n);return Zt(e,performance.now()-r),o}}function Le(){if(!p)return {config:Nt,stats:{frameTimeMs:0,avgFrameMs:0,p50FrameMs:0,p95FrameMs:0,p99FrameMs:0,fps:0,avgFps:0,totalFrames:0,budgetOverruns:0,systemTimings:[],phaseTimings:{}},alerts:[]};let e=p,t=[];for(let[i,s]of e.systemSamples)t.push({name:i,lastMs:s.count>0?s.samples[(s.idx-1+s.samples.length)%s.samples.length]??0:0,avgMs:Ut(s),minMs:s.min===Number.POSITIVE_INFINITY?0:s.min,maxMs:s.max,p50Ms:N(s,.5),p95Ms:N(s,.95),p99Ms:N(s,.99),count:s.count});let n={};for(let[i,s]of e.phaseTotals)n[a$5[i]??"unknown"]=s;let r=e.frameSamples.count>0?e.frameSamples.samples[(e.frameSamples.idx-1+e.frameSamples.samples.length)%e.frameSamples.samples.length]??0:0,o=Ut(e.frameSamples);return {config:e.config,stats:{frameTimeMs:r,avgFrameMs:o,p50FrameMs:N(e.frameSamples,.5),p95FrameMs:N(e.frameSamples,.95),p99FrameMs:N(e.frameSamples,.99),fps:r>0?1e3/r:0,avgFps:o>0?1e3/o:0,totalFrames:e.totalFrames,budgetOverruns:e.budgetOverruns,systemTimings:t,phaseTimings:n},alerts:[...e.alerts]}}function Rr(e){p&&(p.onAlert=e);}function Br(){p&&(p.systemSamples.clear(),p.phaseTotals.clear(),p.frameSamples=ze(p.config.rollingWindowSize),p.totalFrames=0,p.budgetOverruns=0,p.alerts=[]);}function Yr(){p=null;}function Xr(){let e=Le();return {config:e.config,stats:e.stats,alerts:e.alerts,exportedAt:Date.now()}}n();var Ir=1e4;function zr(e=Ir){return {x:new Float32Array(e),y:new Float32Array(e),maxSpeed:new Float32Array(e),friction:new Float32Array(e)}}var Lr=zr(),$t=new WeakSet,Qt=null;function Kt(e){return $t.has(e)||(Qt=l$2(e,m(()=>Lr)),$t.add(e)),Qt}function jt(e){let t=Kt(e);return Array.from(k(e,[t]))}function Or(e,t){let n=Kt(e);return i(e,t,n)}var Oe=e=>{let t=b(),n=jt(e);for(let r$1 of n)va(e,r$1)&&ya(r$1,t),za(r$1,t),Aa(r$1),i(e,r$1,r)&&Ba(r$1,t);return e};function wr(){return Oe}function Vr(e,t=0){e.registerSystem(4,Oe,t);}function Gr(e,t,n){for(let r$1 of t)la(e,r$1)&&(va(e,r$1)&&ya(r$1,n),za(r$1,n),Aa(r$1),i(e,r$1,r)&&Ba(r$1,n));}var j={minWidth:4,minHeight:2,maxWidth:0,maxHeight:0,constrainToScreen:true,screenWidth:80,screenHeight:24,snapGrid:0},we={deferLayout:true,outlineResize:false,keyboardStep:1,keyboardResizeStep:1};function Jt(){return {entity:void 0,isMoving:false,isResizing:false,resizeHandle:void 0,startX:0,startY:0,panelStartX:0,panelStartY:0,panelStartWidth:0,panelStartHeight:0,layoutDeferred:false}}function qr(e){return {...we,...e}}function Ur(e){return {...j,...e}}function Nr(e,t,n,r,o,i,s,a,l){let u={...we,...l};return {...e,entity:t,isMoving:true,isResizing:false,resizeHandle:void 0,startX:n,startY:r,panelStartX:o,panelStartY:i,panelStartWidth:s,panelStartHeight:a,layoutDeferred:u.deferLayout}}function _r(e,t,n,r,o,i,s,a,l,u){let m={...we,...u};return {...e,entity:t,isMoving:false,isResizing:true,resizeHandle:n,startX:r,startY:o,panelStartX:i,panelStartY:s,panelStartWidth:a,panelStartHeight:l,layoutDeferred:m.deferLayout}}function Zr(e,t,n,r){if(!e.isMoving)return {x:e.panelStartX,y:e.panelStartY,width:e.panelStartWidth,height:e.panelStartHeight,dirtyRects:[],clamped:false};let o={...j,...r},i=t-e.startX,s=n-e.startY,a=e.panelStartX+i,l=e.panelStartY+s,u=false;if(o.snapGrid>0&&(a=Math.round(a/o.snapGrid)*o.snapGrid,l=Math.round(l/o.snapGrid)*o.snapGrid),o.constrainToScreen){let y=Math.max(0,Math.min(a,o.screenWidth-e.panelStartWidth)),g=Math.max(0,Math.min(l,o.screenHeight-e.panelStartHeight));(y!==a||g!==l)&&(u=true),a=y,l=g;}let m=ao(e.panelStartX+(t-e.startX-i+i),e.panelStartY+(n-e.startY-s+s),a,l,e.panelStartWidth,e.panelStartHeight);return {x:a,y:l,width:e.panelStartWidth,height:e.panelStartHeight,dirtyRects:m,clamped:u}}function $r(e,t,n,r,o,i,s){let a=t,l=n,u=r,m=o;return (e.includes("right")||e==="right")&&(u+=i),(e.includes("bottom")||e==="bottom")&&(m+=s),(e.includes("left")||e==="left")&&(a+=i,u-=i),(e.includes("top")||e==="top")&&(l+=s,m-=s),{x:a,y:l,w:u,h:m}}function Qr(e,t,n){let r=e,o=t,i=false;return r<n.minWidth&&(r=n.minWidth,i=true),o<n.minHeight&&(o=n.minHeight,i=true),n.maxWidth>0&&r>n.maxWidth&&(r=n.maxWidth,i=true),n.maxHeight>0&&o>n.maxHeight&&(o=n.maxHeight,i=true),{width:r,height:o,clamped:i}}function Kr(e,t,n,r,o){return o<=0?{x:e,y:t,w:n,h:r}:{x:Math.round(e/o)*o,y:Math.round(t/o)*o,w:Math.round(n/o)*o,h:Math.round(r/o)*o}}function jr(e,t,n,r,o){if(!o.constrainToScreen)return {x:e,y:t,w:n,h:r};let i=Math.max(0,e),s=Math.max(0,t),a=n,l=r;return i+a>o.screenWidth&&(a=o.screenWidth-i),s+l>o.screenHeight&&(l=o.screenHeight-s),{x:i,y:s,w:a,h:l}}function Jr(e,t,n,r){if(!e.isResizing||!e.resizeHandle)return {x:e.panelStartX,y:e.panelStartY,width:e.panelStartWidth,height:e.panelStartHeight,dirtyRects:[],clamped:false};let o={...j,...r},i=t-e.startX,s=n-e.startY,a=$r(e.resizeHandle,e.panelStartX,e.panelStartY,e.panelStartWidth,e.panelStartHeight,i,s),l=Qr(a.w,a.h,o);a.w=l.width,a.h=l.height;let u=l.clamped;a=Kr(a.x,a.y,a.w,a.h,o.snapGrid),a=jr(a.x,a.y,a.w,a.h,o);let m=[{x:e.panelStartX,y:e.panelStartY,width:e.panelStartWidth,height:e.panelStartHeight},{x:a.x,y:a.y,width:a.w,height:a.h}];return {x:a.x,y:a.y,width:a.w,height:a.h,dirtyRects:m,clamped:u}}function eo(e){return {...e,isMoving:false,isResizing:false,resizeHandle:void 0,layoutDeferred:false}}function to(e){return {state:Jt(),restoreX:e.panelStartX,restoreY:e.panelStartY,restoreWidth:e.panelStartWidth,restoreHeight:e.panelStartHeight}}function no(e,t,n,r,o,i,s){let a={...j,...s},l=e,u=t;return o==="up"&&(u-=i),o==="down"&&(u+=i),o==="left"&&(l-=i),o==="right"&&(l+=i),a.constrainToScreen&&(l=Math.max(0,Math.min(l,a.screenWidth-n)),u=Math.max(0,Math.min(u,a.screenHeight-r))),a.snapGrid>0&&(l=Math.round(l/a.snapGrid)*a.snapGrid,u=Math.round(u/a.snapGrid)*a.snapGrid),{x:l,y:u}}function ro(e,t,n,r,o){let i={...j,...o},s=e,a=t;return n==="grow-horizontal"&&(s+=r),n==="shrink-horizontal"&&(s-=r),n==="grow-vertical"&&(a+=r),n==="shrink-vertical"&&(a-=r),s=Math.max(i.minWidth,s),a=Math.max(i.minHeight,a),i.maxWidth>0&&(s=Math.min(i.maxWidth,s)),i.maxHeight>0&&(a=Math.min(i.maxHeight,a)),{width:s,height:a}}function oo(e,t,n,r,o=1){let i=e<o,s=e>=n-o,a=t<o,l=t>=r-o;if(a&&i)return "topLeft";if(a&&s)return "topRight";if(l&&i)return "bottomLeft";if(l&&s)return "bottomRight";if(a)return "top";if(l)return "bottom";if(i)return "left";if(s)return "right"}function io(e){if(e.length===0)return;let t=Number.POSITIVE_INFINITY,n=Number.POSITIVE_INFINITY,r=0,o=0;for(let i of e)t=Math.min(t,i.x),n=Math.min(n,i.y),r=Math.max(r,i.x+i.width),o=Math.max(o,i.y+i.height);return {x:t,y:n,width:r-t,height:o-n}}function ao(e,t,n,r,o,i){return [{x:e,y:t,width:o,height:i},{x:n,y:r,width:o,height:i}]}n();function Ve(e,t,n,r$1){if(!i(e,t,$))return -1;let o;if(r$1){let P=k$1(e,r$1);if(P===null)return -1;o=P;}else o=d$1(e);let i$1=Math.floor(Math.random()*n.chars.length),s$1=n.chars[i$1]??42;aa(e,o,{lifetime:$.lifetime[t],char:s$1,startFg:n.startFg,endFg:n.endFg??n.startFg,fadeOut:n.fadeOut??true,emitter:t});let a=w(e,t)?r.x[t]:0,l=w(e,t)?r.y[t]:0;s(e,o,a,l);let u=$.angle[t],m=$.spread[t],y=u+(Math.random()-.5)*m,g=$.speed[t],v=Math.cos(y)*g,E=Math.sin(y)*g;return ia(e,o,v,E),pa(t,o),o}function so(e,t,n,r=1e3,o=0){if(!i(e,t,$))return [];let i$1=na(t);if(!i$1)return [];let s=n??$.burstCount[t],a=[];for(let l=0;l<s&&!(o+a.length>=r);l++){let u=Ve(e,t,i$1);u!==-1&&a.push(u);}return a}function Ge(e,t,n){if(!i(e,t,_$1))return;_$1.age[t]=_$1.age[t]+n;let r=_$1.emitter[t];if(r>0&&ka(e,r)){let o=$.gravity[r];o!==0&&la(e,t)&&(ha.y[t]=ha.y[t]+o*n);}}function qe(e,t,n){!w(e,t)||!la(e,t)||(r.x[t]=r.x[t]+ha.x[t]*n,r.y[t]=r.y[t]+ha.y[t]*n);}function Ue(e$1,t,n){let r=_$1.emitter[t];r>0&&qa(r,t),n?(j$1(e$1,t,_$1),l$1(e$1,n,t)):e(e$1,t);}function lo(e,t){return !(!i(e,t,$)||$.active[t]!==1)}function uo(e,t,n,r,o,i){let s=na(t);if(!s)return o;let a=$.rate[t];if(a<=0)return o;$.accumulator[t]=$.accumulator[t]+n;let l=1/a,u=o;for(;$.accumulator[t]>=l&&u<r;)$.accumulator[t]=$.accumulator[t]-l,Ve(e,t,s,i)!==-1&&u++;return u}function co(e,t,n,r,o,i){let s=o;for(let a of t)lo(e,a)&&(s=uo(e,a,n,r,s,i));return s}function mo(e,t,n,r){ca(e,t)&&(Ge(e,t,n),qe(e,t,n),ea$1(e,t)&&Ue(e,t,r));}function fo(e,t,n,r,o){for(let i=0;i<n;i++){let s=t[i];if(!s)continue;let a=s.particleId;ca(e,a)&&(o.add(a),Ge(e,a,r),qe(e,a,r));}}function po(e,t,n,r){for(let o=n-1;o>=0;o--){let i=t[o];if(!i)continue;let s=i.particleId;ca(e,s)?ea$1(e,s)&&Ue(e,s,r):qa(i.emitterId,s);}}function yo(e){let t=e.maxParticles??1e3,n=e.archetypeName,r=new Set;return o=>{let i=.016666666666666666,s=e.emitters(o),a=xa(),l=j$2(a),u=e.particles(o);co(o,s,i,t,u.length,n),r.clear(),fo(o,l,a.size,i,r),po(o,l,a.size,n);for(let m of u)r.has(m)||mo(o,m,i,n);return o}}var en={friction:.92,minVelocity:.1,maxVelocity:200,sensitivity:1,springStiffness:.3,springDamping:.8,maxOverscroll:50,enableMomentum:true,enableBounce:true},M=a$2({iterable:true});function go(e,t,n,r,o){let i=M.get(e);return i?(i.contentWidth=t,i.contentHeight=n,i.viewportWidth=r,i.viewportHeight=o):(i={scrollX:0,scrollY:0,velocityX:0,velocityY:0,contentWidth:t,contentHeight:n,viewportWidth:r,viewportHeight:o,isAnimating:false,isUserScrolling:false,targetX:null,targetY:null},M.set(e,i)),i}function bo(e){M.delete(e);}function So(){M.clear();}function ho(e,t,n,r){let o={...en,...r},i=M.get(e);i&&(i.velocityX+=t*o.sensitivity,i.velocityY+=n*o.sensitivity,i.velocityX=Math.max(-o.maxVelocity,Math.min(o.maxVelocity,i.velocityX)),i.velocityY=Math.max(-o.maxVelocity,Math.min(o.maxVelocity,i.velocityY)),i.isAnimating=true,i.targetX=null,i.targetY=null);}function xo(e,t,n){let r=M.get(e);r&&(r.targetX=t,r.targetY=n,r.isAnimating=true);}function vo(e,t,n){let r=M.get(e);r&&(r.scrollX=t,r.scrollY=n,r.velocityX=0,r.velocityY=0,r.targetX=null,r.targetY=null,r.isAnimating=false);}function Eo(e){let t=M.get(e);t&&(t.isUserScrolling=true,t.velocityX=0,t.velocityY=0);}function Mo(e,t,n){let r=M.get(e);r&&(r.isUserScrolling=false,r.velocityX=t,r.velocityY=n,r.isAnimating=Math.abs(t)>.1||Math.abs(n)>.1);}function Co(e,t){let n=Math.max(0,e.contentWidth-e.viewportWidth),r=Math.max(0,e.contentHeight-e.viewportHeight);if(!t.enableBounce){e.scrollX=Math.max(0,Math.min(n,e.scrollX)),e.scrollY=Math.max(0,Math.min(r,e.scrollY));return}let o=e.scrollX<0?e.scrollX:e.scrollX>n?e.scrollX-n:0,i=e.scrollY<0?e.scrollY:e.scrollY>r?e.scrollY-r:0;Math.abs(o)>0&&!e.isUserScrolling&&(e.velocityX-=o*t.springStiffness,e.velocityX*=t.springDamping),Math.abs(i)>0&&!e.isUserScrolling&&(e.velocityY-=i*t.springStiffness,e.velocityY*=t.springDamping),e.scrollX=Math.max(-t.maxOverscroll,Math.min(n+t.maxOverscroll,e.scrollX)),e.scrollY=Math.max(-t.maxOverscroll,Math.min(r+t.maxOverscroll,e.scrollY));}function To(e){if(!(e.targetX===null&&e.targetY===null)){if(e.targetX!==null){let t=e.targetX-e.scrollX;Math.abs(t)<.5?(e.scrollX=e.targetX,e.targetX=null,e.velocityX=0):e.velocityX=t*.15;}if(e.targetY!==null){let t=e.targetY-e.scrollY;Math.abs(t)<.5?(e.scrollY=e.targetY,e.targetY=null,e.velocityY=0):e.velocityY=t*.15;}}}function Po(e,t){e.scrollX+=e.velocityX*t*60,e.scrollY+=e.velocityY*t*60;}function ko(e,t){!t.enableMomentum||e.isUserScrolling||(e.velocityX*=t.friction,e.velocityY*=t.friction);}function Ao(e,t){return Math.abs(e.velocityX)<t.minVelocity&&Math.abs(e.velocityY)<t.minVelocity&&e.targetX===null&&e.targetY===null}function Wo(e){e.velocityX=0,e.velocityY=0,e.isAnimating=false,e.scrollX=Math.round(e.scrollX),e.scrollY=Math.round(e.scrollY);let t=Math.max(0,e.contentWidth-e.viewportWidth),n=Math.max(0,e.contentHeight-e.viewportHeight);e.scrollX=Math.max(0,Math.min(t,e.scrollX)),e.scrollY=Math.max(0,Math.min(n,e.scrollY));}function tn(e,t,n){let r={...en,...n};if(!e.isAnimating)return false;let o=e.scrollX,i=e.scrollY;return To(e),Po(e,t),ko(e,r),Co(e,r),Ao(e,r)&&Wo(e),e.scrollX!==o||e.scrollY!==i}function Fo(e){return M.get(e)?.isAnimating??false}function Ho(e){let t=M.get(e);return t?{x:t.scrollX,y:t.scrollY}:null}function Do(e){let t=performance.now();return n=>{let r=performance.now(),o=Math.min((r-t)/1e3,1/15);return t=r,M.forEach(i=>{tn(i,o,e);}),n}}n();var nn=8,Ro=.5;function Bo(e){return {cellSize:e?.cellSize??nn,cells:new Map,entityCells:new Map}}function _e(e,t){let n=e>=0?e*2:-e*2-1,r=t>=0?t*2:-t*2-1;return (n+r)*(n+r+1)/2+r}function Yo(e,t,n){return {cx:Math.floor(t/e.cellSize),cy:Math.floor(n/e.cellSize)}}function ee(e,t,n,r,o=1,i=1){Ze(e,t);let s=t,a=new Set,l=Math.floor(n/e.cellSize),u=Math.floor(r/e.cellSize),m=Math.floor((n+o-.001)/e.cellSize),y=Math.floor((r+i-.001)/e.cellSize);for(let g=l;g<=m;g++)for(let v=u;v<=y;v++){let E=_e(g,v);a.add(E);let P=e.cells.get(E);P||(P=new Set,e.cells.set(E,P)),P.add(s);}e.entityCells.set(s,a);}function Ze(e,t){let n=t,r=e.entityCells.get(n);if(r){for(let o of r){let i=e.cells.get(o);i&&(i.delete(n),i.size===0&&e.cells.delete(o));}e.entityCells.delete(n);}}function $e(e,t,n,r=1,o=1){let i=new Set,s=Math.floor(t/e.cellSize),a=Math.floor(n/e.cellSize),l=Math.floor((t+r-.001)/e.cellSize),u=Math.floor((n+o-.001)/e.cellSize);for(let m=s;m<=l;m++)for(let y=a;y<=u;y++){let g=_e(m,y),v=e.cells.get(g);if(v)for(let E of v)i.add(E);}return i}function Xo(e,t){let n=t,r=new Set,o=e.entityCells.get(n);if(!o)return r;for(let i of o){let s=e.cells.get(i);if(s)for(let a of s)a!==n&&r.add(a);}return r}function rn(e,t,n){let r=_e(t,n);return e.cells.get(r)??new Set}function Io(e,t,n){let r=Math.floor(t/e.cellSize),o=Math.floor(n/e.cellSize);return rn(e,r,o)}function on(e){e.cells.clear(),e.entityCells.clear();}function zo(e){let t=0,n=0;for(let o of e.cells.values())n+=o.size,o.size>t&&(t=o.size);let r=e.cells.size;return {cellCount:r,entityCount:e.entityCells.size,averageEntitiesPerCell:r>0?n/r:0,maxEntitiesInCell:t}}function Ne(e,t){on(e);let n=k(t,[r,Q]);for(let r$1 of n){let o=r.x[r$1],i=r.y[r$1],s=Q.width[r$1],a=Q.height[r$1],l=Q.offsetX[r$1],u=Q.offsetY[r$1];ee(e,r$1,o+l,i+u,s,a);}}function Qe(e=Ro){return {dirtyEntities:a(64),dirtyLookup:new Set,prevBounds:a$2({iterable:true}),initialized:false,dirtyThreshold:Math.max(0,Math.min(1,e))}}var J=null,T=Qe();function Lo(e){e!==J&&(T.initialized=false,T.prevBounds.clear()),J=e;}function Oo(){return J}function wo(){return T}function Vo(e){let t=e;T.dirtyLookup.has(t)||(b$3(T.dirtyEntities,t),T.dirtyLookup.add(t));}function Go(){return T.dirtyEntities.size}function qo(){T=Qe(T.dirtyThreshold);}function Uo(e){T.dirtyThreshold=Math.max(0,Math.min(1,e));}function Ke(e){let t=r.x[e]+Q.offsetX[e],n=r.y[e]+Q.offsetY[e],r$1=Q.width[e],o=Q.height[e];return {x:t,y:n,w:r$1,h:o}}function No(e,t){for(let n of t){let{x:r,y:o,w:i,h:s}=Ke(n),a=e.prevBounds.get(n);a?(a.x=r,a.y=o,a.w=i,a.h=s):e.prevBounds.set(n,{x:r,y:o,w:i,h:s});}}function _o(e,t,n){let r=[];t.prevBounds.forEach((o,i)=>{n.has(i)||r.push(i);});for(let o of r)Ze(e,o),t.prevBounds.delete(o);}function Zo(e,t){for(let n of t){let r=n,{x:o,y:i,w:s,h:a}=Ke(n),l=e.prevBounds.get(n);(!l||o!==l.x||i!==l.y||s!==l.w||a!==l.h)&&(e.dirtyLookup.has(r)||(b$3(e.dirtyEntities,r),e.dirtyLookup.add(r))),l?(l.x=o,l.y=i,l.w=s,l.h=a):e.prevBounds.set(n,{x:o,y:i,w:s,h:a});}}function an(e,t,n){let r$1=k(n,[r,Q]);if(!t.initialized){Ne(e,n),No(t,r$1),g(t.dirtyEntities),t.dirtyLookup.clear(),t.initialized=true;return}let o=new Set;for(let s of r$1)o.add(s);_o(e,t,o),Zo(t,r$1);let i$1=t.dirtyEntities.size;if(i$1>0){let s=r$1.length;if(s>0&&i$1>t.dirtyThreshold*s)Ne(e,n);else {let{data:a}=t.dirtyEntities;for(let l=0;l<i$1;l++){let u=a[l];if(u===void 0)continue;let m=u;if(!i(n,m,r)||!i(n,m,Q))continue;let{x:y,y:g,w:v,h:E}=Ke(m);ee(e,m,y,g,v,E);}}}g(t.dirtyEntities),t.dirtyLookup.clear();}var sn=e=>(J&&an(J,T,e),e);function $o(){return sn}n();var Qo=1e4;function Ko(e=Qo){return {machineId:new Uint32Array(e),currentState:new Uint16Array(e),previousState:new Uint16Array(e),stateAge:new Float32Array(e)}}var H=Ko(),ln=new WeakSet,un=null;function jo(e){return ln.has(e)||(un=l$2(e,m(()=>H)),ln.add(e)),un}function cn(e){let t=jo(e);return Array.from(k(e,[t]))}function Jo(){return H.stateAge}var je=e=>{let t=b(),n=cn(e);for(let r of n){let o=H.stateAge[r]??0;H.stateAge[r]=o+t;}return e};function ei(){return je}function ti(e,t=0){e.registerSystem(2,je,t);}function ni(e,t){for(let n of e){let r=H.stateAge[n]??0;H.stateAge[n]=r+t;}}function ri(e){H.stateAge[e]=0;}function oi(e){return H.stateAge[e]??0}n();var D=null,fe=null;function ii(e){D=e;}function ai(){return D}function si(){return fe}function li(){fe=null;}function ui(){D=null,fe=null;}function mn(e,t){let n=[];for(let r=0;r<t;r++){let o=[];for(let i=0;i<e;i++)o.push({char:" ",fg:0,bg:0});n.push(o);}return {width:e,height:t,cells:n}}function ci(e,t,n,r){let o=" ",i=0,s=0;for(let a of e.layers){if(!a.visible)continue;let l=a.tiles[r*e.width+n];if(l===za$1)continue;let u=t.tiles[l];u&&(o=u.char,i=u.fg,s=u.bg);}return {char:o,fg:i,bg:s}}function mi(e,t,n,r,o,i){for(let s=0;s<i;s++){let a=r+s;if(a<0||a>=e.height)continue;let l=e.cells[a];if(l)for(let u=0;u<o;u++){let m=n+u;m<0||m>=e.width||(l[m]=t);}}}function fi(e,t,n,r,o,i,s,a){let l=Math.max(0,Math.floor(-e/o)),u=Math.max(0,Math.floor(-t/i)),m=Math.min(n,Math.ceil((s-e)/o)),y=Math.min(r,Math.ceil((a-t)/i));return [l,u,m,y]}function fn(e,t,n,r$1){let o=Ta.width[t],i=Ta.height[t],s=Ta.tileWidth[t],a=Ta.tileHeight[t],l=Ta.dataId[t],u=Ta.tilesetId[t],m=Ga.data.get(l),y=Aa$1.tilesets.get(u);if(!m||!y)return;let g=r.x[t],v=r.y[t],E=g-n,P=v-r$1,[Sn,hn,xn,vn]=fi(E,P,o,i,s,a,e.width,e.height);for(let te=hn;te<vn;te++)for(let ne=Sn;ne<xn;ne++){let En=ci(m,y,ne,te),Mn=Math.round(E+ne*s),Cn=Math.round(P+te*a);mi(e,En,Mn,Cn,s,a);}}function dn(e){if(!D)return null;let t=mn(D.viewportWidth,D.viewportHeight),n=k(e,[Ta,r]);for(let r of n)fn(t,r,D.camera.x,D.camera.y);return fe=t,t}var pn=e=>(dn(e),e);function di(){return pn}n();function pi(){return {bounds:a$2({iterable:false})}}function yn(e,t,n,r,o,i,s){let a=t.bounds.get(n);return a&&a.x===r&&a.y===o&&a.w===i&&a.h===s?false:(ee(e,n,r,o,i,s),a?(a.x=r,a.y=o,a.w=i,a.h=s):t.bounds.set(n,{x:r,y:o,w:i,h:s}),true)}function yi(e,t){e.bounds.delete(t);}function gi(e){e.bounds.clear();}function Je(e,t){return $e(e,t.x,t.y,t.width,t.height)}function bi(e,t,n){let r=Je(e,t),o=Array.from(r);return {visible:o,total:n,culled:n-o.length}}function Si(e,t){return n=>{let r$1=k(n,[r]);for(let o of r$1){let i$1=r.x[o],s=r.y[o],a=1,l=1;i(n,o,K$1)&&(a=K$1.width[o],l=K$1.height[o]),yn(e,t,o,i$1,s,a,l);}return n}}function hi(e,t){return n=>{let r=t();return Je(e,r),n}}function xi(){try{let e=globalThis.require?.("os");if(e?.cpus)return Math.max(1,e.cpus().length-1)}catch{}return 2}var gn={maxWorkers:xi(),taskTimeout:5e3,enabled:true},c=null,et=0;function vi(e){return c={config:{...gn,...e},queue:[],running:new Map,handlers:new Map,completedCount:0,cancelledCount:0,failedCount:0,totalDurationMs:0},bn()}function Ei(e,t){c&&c.handlers.set(e,t);}function Mi(e,t,n="normal"){if(!c||!c.config.enabled)return ki(e,t);let r=`task-${et++}`,o={id:r,type:e,input:t,priority:n,queuedAt:Date.now()};return new Promise(i=>{if(!c){i({id:r,type:e,output:void 0,cancelled:false,error:"Worker pool not initialized",durationMs:0});return}let s=c.handlers.get(e);if(!s){i({id:r,type:e,output:void 0,cancelled:false,error:`No handler registered for task type: ${e}`,durationMs:0});return}let a={task:o,resolve:i,handler:s,timerHandle:null},l={high:0,normal:1,low:2},u=l[n],m=c.queue.length;for(let y=0;y<c.queue.length;y++){let g=c.queue[y];if(g&&l[g.task.priority]>u){m=y;break}}c.queue.splice(m,0,a),queueMicrotask(()=>Di());})}function Ci(e){if(!c)return false;let t=c.queue.findIndex(n=>n.task.id===e);if(t>=0){let[n]=c.queue.splice(t,1);return n?(n.resolve({id:e,type:n.task.type,output:void 0,cancelled:true,error:void 0,durationMs:0}),c.cancelledCount++,true):false}return false}function Ti(e){if(!c)return 0;let t=0,n=[];for(let r of c.queue)r.task.type===e?(r.resolve({id:r.task.id,type:e,output:void 0,cancelled:true,error:void 0,durationMs:0}),t++):n.push(r);return c.queue=n,c.cancelledCount+=t,t}function bn(){if(!c)return {config:gn,stats:{activeWorkers:0,idleWorkers:0,queuedTasks:0,runningTasks:0,completedTasks:0,cancelledTasks:0,failedTasks:0,avgDurationMs:0,enabled:false}};let e=c.completedCount+c.failedCount;return {config:c.config,stats:{activeWorkers:c.running.size,idleWorkers:Math.max(0,c.config.maxWorkers-c.running.size),queuedTasks:c.queue.length,runningTasks:c.running.size,completedTasks:c.completedCount,cancelledTasks:c.cancelledCount,failedTasks:c.failedCount,avgDurationMs:e>0?c.totalDurationMs/e:0,enabled:c.config.enabled}}}function Pi(){if(c){for(let e of c.queue)e.resolve({id:e.task.id,type:e.task.type,output:void 0,cancelled:true,error:void 0,durationMs:0});for(let e of c.running.values())e.timerHandle&&clearTimeout(e.timerHandle);c=null,et=0;}}function ki(e,t){let n=`sync-${et++}`,r=c?.handlers.get(e);if(!r)return Promise.resolve({id:n,type:e,output:void 0,cancelled:false,error:`No handler registered for task type: ${e}`,durationMs:0});let o=performance.now();try{let i=r(t);return Promise.resolve({id:n,type:e,output:i,cancelled:!1,error:void 0,durationMs:performance.now()-o})}catch(i){return Promise.resolve({id:n,type:e,output:void 0,cancelled:false,error:i instanceof Error?i.message:String(i),durationMs:performance.now()-o})}}function Ai(e,t){t<=0||(e.timerHandle=setTimeout(()=>{c&&(c.running.delete(e.task.id),c.failedCount++,e.resolve({id:e.task.id,type:e.task.type,output:void 0,cancelled:false,error:`Task timed out after ${t}ms`,durationMs:t}));},t));}function Wi(e,t,n){c&&c.running.has(e.task.id)&&(e.timerHandle&&clearTimeout(e.timerHandle),c.running.delete(e.task.id),c.completedCount++,c.totalDurationMs+=n,e.resolve({id:e.task.id,type:e.task.type,output:t,cancelled:false,error:void 0,durationMs:n}));}function Fi(e,t,n){c&&c.running.has(e.task.id)&&(e.timerHandle&&clearTimeout(e.timerHandle),c.running.delete(e.task.id),c.failedCount++,c.totalDurationMs+=n,e.resolve({id:e.task.id,type:e.task.type,output:void 0,cancelled:false,error:t instanceof Error?t.message:String(t),durationMs:n}));}function Hi(e){if(!c)return;Ai(e,c.config.taskTimeout);let t=performance.now();try{let n=e.handler(e.task.input),r=performance.now()-t;Wi(e,n,r);}catch(n){let r=performance.now()-t;Fi(e,n,r);}}function Di(){if(c)for(;c.queue.length>0&&c.running.size<c.config.maxWorkers;){let e=c.queue.shift();if(!e)break;c.running.set(e.task.id,e),Hi(e);}}export{kr as $,Ze as $a,nr as A,to as Aa,ii as Ab,rr as B,no as Ba,ai as Bb,ir as C,ro as Ca,si as Cb,zt as D,oo as Da,li as Db,ar as E,io as Ea,ui as Eb,sr as F,Ve as Fa,mn as Fb,Lt as G,so as Ga,fn as Gb,dr as H,Ge as Ha,dn as Hb,pr as I,qe as Ia,pn as Ib,Ot as J,Ue as Ja,di as Jb,yr as K,yo as Ka,pi as Kb,q as L,go as La,yn as Lb,me as M,bo as Ma,yi as Mb,X as N,So as Na,gi as Nb,wt as O,ho as Oa,Je as Ob,br as P,xo as Pa,bi as Pb,Sr as Q,vo as Qa,Si as Qb,Vt as R,Eo as Ra,hi as Rb,hr as S,Mo as Sa,vi as Sb,xr as T,tn as Ta,Ei as Tb,vr as U,Fo as Ua,Mi as Ub,Er as V,Ho as Va,Ci as Vb,Mr as W,Do as Wa,Ti as Wb,Gt as X,nn as Xa,bn as Xb,Cr as Y,Bo as Ya,Pi as Yb,Tr as Z,Yo as Za,Pr as _,ee as _a,Bt as a,qt as aa,$e as ab,An as b,Ar as ba,Xo as bb,He as c,Wr as ca,rn as cb,Wn as d,Zt as da,Io as db,Fn as e,Fr as ea,on as eb,Hn as f,Hr as fa,zo as fb,Bn as g,Dr as ga,Ne as gb,De as h,Le as ha,Qe as hb,Re as i,Rr as ia,Lo as ib,Ln as j,Br as ja,Oo as jb,On as k,Yr as ka,wo as kb,wn as l,Xr as la,Vo as lb,Vn as m,jt as ma,Go as mb,Gn as n,Or as na,qo as nb,qn as o,Oe as oa,Uo as ob,Un as p,wr as pa,an as pb,Nn as q,Vr as qa,sn as qb,_n as r,Gr as ra,$o as rb,Xt as s,Jt as sa,cn as sb,It as t,qr as ta,Jo as tb,Ye as u,Ur as ua,je as ub,Kn as v,Nr as va,ei as vb,jn as w,_r as wa,ti as wb,Jn as x,Zr as xa,ni as xb,er as y,Jr as ya,ri as yb,tr as z,eo as za,oi as zb};
|