@pix3/cli 1.6.4 → 2.0.0-alpha.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.
Files changed (168) hide show
  1. package/LICENSE +201 -201
  2. package/README.md +722 -788
  3. package/dist/index.js +557 -421
  4. package/dist/runtime-types.json +1 -1
  5. package/dist/smoke/prebuilt/{build-7MIXIMSZ.mjs → build-7REMSA2S.mjs} +52 -52
  6. package/dist/smoke/prebuilt/chunk-4DGG2BKR.mjs +2 -0
  7. package/dist/smoke/prebuilt/chunk-YLBMUJ2H.mjs +238 -0
  8. package/dist/smoke/prebuilt/runtime.mjs +1 -1
  9. package/dist/smoke/prebuilt/smoke-worker.mjs +211 -2
  10. package/dist/smoke/prebuilt/tree-defaults.mjs +1 -1
  11. package/dist/validate/prebuilt/{build-AUGKXER3.js → build-ADF5EEE2.js} +52 -52
  12. package/dist/validate/prebuilt/bundle-main.js +223 -18
  13. package/dist/validate/prebuilt/chunk-VIHIF4G2.js +238 -0
  14. package/dist/validate/prebuilt/runtime.js +1 -1
  15. package/kit/files/.claude/skills/pix3-editor/SKILL.md +200 -0
  16. package/kit/files/.claude/skills/pix3-nodes/SKILL.md +13 -15
  17. package/kit/files/.claude/skills/pix3-nodes/reference.md +77 -71
  18. package/kit/files/.claude/skills/pix3-scene-format/SKILL.md +38 -41
  19. package/kit/files/.claude/skills/pix3-scene-format/pix3anim.md +185 -0
  20. package/kit/files/.claude/skills/pix3-scene-format/project-files.md +244 -0
  21. package/kit/files/.claude/skills/pix3-scene-format/reference.md +28 -16
  22. package/kit/files/.claude/skills/pix3-scripts/SKILL.md +34 -24
  23. package/kit/files/.claude/skills/pix3-scripts/reference.md +68 -141
  24. package/kit/files/.claude/skills/pix3-verify/SKILL.md +65 -326
  25. package/kit/files/.claude/skills/pix3-verify/reference.md +2 -14
  26. package/kit/files/AGENTS.md +76 -84
  27. package/kit/files/design/tests/bots/pix3-test-bot.d.ts +89 -0
  28. package/kit/kit.json +8 -5
  29. package/package.json +62 -54
  30. package/templates/2d/files/scenes/main.pix3scene +31 -0
  31. package/templates/2d/template.yaml +11 -0
  32. package/templates/3d/files/scenes/main.pix3scene +50 -0
  33. package/templates/3d/template.yaml +11 -0
  34. package/templates/base/files/README.md +39 -0
  35. package/templates/base/files/gitignore +11 -0
  36. package/templates/base/files/index.html +23 -0
  37. package/templates/base/files/package.json +28 -0
  38. package/templates/base/files/src/main.ts +3 -0
  39. package/templates/base/files/tsconfig.json +17 -0
  40. package/templates/base/files/vite.config.ts +10 -0
  41. package/dist/smoke/prebuilt/chunk-CBFYKDS7.mjs +0 -2
  42. package/dist/smoke/prebuilt/chunk-VJHJ5BCO.mjs +0 -239
  43. package/dist/validate/prebuilt/chunk-CFQFEI52.js +0 -239
  44. package/templates/empty-2d/files/README.md +0 -20
  45. package/templates/empty-2d/files/scenes/main.pix3scene +0 -68
  46. package/templates/empty-2d/files/sprites/pix3-logo.png +0 -0
  47. package/templates/empty-2d/template.yaml +0 -7
  48. package/templates/empty-3d/files/README.md +0 -20
  49. package/templates/empty-3d/files/scenes/main.pix3scene +0 -108
  50. package/templates/empty-3d/files/sprites/pix3-logo.png +0 -0
  51. package/templates/empty-3d/template.yaml +0 -7
  52. package/templates/idea-blank/files/README.md +0 -22
  53. package/templates/idea-blank/files/scenes/main.pix3scene +0 -37
  54. package/templates/idea-blank/template.yaml +0 -10
  55. package/templates/minigame-2d/files/README.md +0 -44
  56. package/templates/minigame-2d/files/design/tests/reachability.json +0 -1
  57. package/templates/minigame-2d/files/design/tests/routines/mute-music.json +0 -44
  58. package/templates/minigame-2d/files/scenes/main.pix3scene +0 -84
  59. package/templates/minigame-2d/files/scenes/menu.pix3scene +0 -118
  60. package/templates/minigame-2d/files/scenes/ui/settings-window.pix3scene +0 -138
  61. package/templates/minigame-2d/files/scripts/GameFlow.ts +0 -133
  62. package/templates/minigame-2d/files/scripts/MenuFlow.ts +0 -217
  63. package/templates/minigame-2d/files/scripts/SettingsWindow.ts +0 -198
  64. package/templates/minigame-2d/template.yaml +0 -10
  65. package/templates/playable-2d/files/README.md +0 -30
  66. package/templates/playable-2d/files/design/recipe.md +0 -83
  67. package/templates/playable-2d/files/design/tests/reachability.json +0 -4
  68. package/templates/playable-2d/files/design/tests/routines/intro-to-cta.json +0 -32
  69. package/templates/playable-2d/files/scenes/main.pix3scene +0 -111
  70. package/templates/playable-2d/files/scenes/ui/end-screen.pix3scene +0 -91
  71. package/templates/playable-2d/files/scenes/ui/intro.pix3scene +0 -65
  72. package/templates/playable-2d/files/scripts/CtaButton.ts +0 -55
  73. package/templates/playable-2d/files/scripts/GameFlow.ts +0 -256
  74. package/templates/playable-2d/files/sprites/pix3-logo.png +0 -0
  75. package/templates/playable-2d/template.yaml +0 -9
  76. package/templates/playable-3d/files/README.md +0 -32
  77. package/templates/playable-3d/files/design/recipe.md +0 -127
  78. package/templates/playable-3d/files/design/tests/reachability.json +0 -4
  79. package/templates/playable-3d/files/design/tests/routines/intro-to-cta.json +0 -32
  80. package/templates/playable-3d/files/scenes/main.pix3scene +0 -230
  81. package/templates/playable-3d/files/scenes/ui/end-screen.pix3scene +0 -91
  82. package/templates/playable-3d/files/scenes/ui/intro.pix3scene +0 -65
  83. package/templates/playable-3d/files/scripts/CtaButton.ts +0 -55
  84. package/templates/playable-3d/files/scripts/GameFlow.ts +0 -309
  85. package/templates/playable-3d/files/scripts/GameRules.ts +0 -290
  86. package/templates/playable-3d/files/scripts/ScoreHud.ts +0 -113
  87. package/templates/playable-3d/template.yaml +0 -9
  88. package/templates/recipe-arena-2d/files/README.md +0 -48
  89. package/templates/recipe-arena-2d/files/design/recipe.md +0 -127
  90. package/templates/recipe-arena-2d/files/design/tests/reachability.json +0 -4
  91. package/templates/recipe-arena-2d/files/design/tests/routines/terminal-retry.json +0 -23
  92. package/templates/recipe-arena-2d/files/scenes/main.pix3scene +0 -292
  93. package/templates/recipe-arena-2d/files/scenes/menu.pix3scene +0 -100
  94. package/templates/recipe-arena-2d/files/scenes/prefabs/hazard.pix3scene +0 -42
  95. package/templates/recipe-arena-2d/files/scenes/prefabs/pickup.pix3scene +0 -45
  96. package/templates/recipe-arena-2d/files/scenes/ui/result.pix3scene +0 -85
  97. package/templates/recipe-arena-2d/files/scripts/GameRules.ts +0 -368
  98. package/templates/recipe-arena-2d/files/scripts/MenuFlow.ts +0 -106
  99. package/templates/recipe-arena-2d/files/scripts/PlayerController.ts +0 -151
  100. package/templates/recipe-arena-2d/files/scripts/ScoreHud.ts +0 -94
  101. package/templates/recipe-arena-2d/files/scripts/Spawner.ts +0 -214
  102. package/templates/recipe-arena-2d/files/scripts/TouchRules.ts +0 -174
  103. package/templates/recipe-arena-2d/files/sprites/ph-avatar.png +0 -0
  104. package/templates/recipe-arena-2d/files/sprites/ph-hazard.png +0 -0
  105. package/templates/recipe-arena-2d/files/sprites/ph-pickup.png +0 -0
  106. package/templates/recipe-arena-2d/template.yaml +0 -10
  107. package/templates/recipe-blank-2d/files/README.md +0 -61
  108. package/templates/recipe-blank-2d/files/design/recipe.md +0 -148
  109. package/templates/recipe-blank-2d/files/design/tests/reachability.json +0 -4
  110. package/templates/recipe-blank-2d/files/design/tests/routines/restart.json +0 -27
  111. package/templates/recipe-blank-2d/files/design/tests/routines/terminal-retry.json +0 -23
  112. package/templates/recipe-blank-2d/files/scenes/main.pix3scene +0 -224
  113. package/templates/recipe-blank-2d/files/scenes/ui/result.pix3scene +0 -85
  114. package/templates/recipe-blank-2d/files/scripts/GameRules.ts +0 -350
  115. package/templates/recipe-blank-2d/files/scripts/ScoreHud.ts +0 -110
  116. package/templates/recipe-blank-2d/files/sprites/ph-bg.png +0 -0
  117. package/templates/recipe-blank-2d/files/sprites/ph-capsule.png +0 -0
  118. package/templates/recipe-blank-2d/files/sprites/ph-circle.png +0 -0
  119. package/templates/recipe-blank-2d/files/sprites/ph-orb.png +0 -0
  120. package/templates/recipe-blank-2d/files/sprites/ph-ring.png +0 -0
  121. package/templates/recipe-blank-2d/files/sprites/ph-star.png +0 -0
  122. package/templates/recipe-blank-2d/template.yaml +0 -10
  123. package/templates/recipe-bouncer-2d/files/README.md +0 -81
  124. package/templates/recipe-bouncer-2d/files/design/recipe.md +0 -146
  125. package/templates/recipe-bouncer-2d/files/design/tests/reachability.json +0 -4
  126. package/templates/recipe-bouncer-2d/files/design/tests/routines/terminal-retry.json +0 -23
  127. package/templates/recipe-bouncer-2d/files/scenes/main.pix3scene +0 -615
  128. package/templates/recipe-bouncer-2d/files/scenes/menu.pix3scene +0 -191
  129. package/templates/recipe-bouncer-2d/files/scenes/ui/result.pix3scene +0 -87
  130. package/templates/recipe-bouncer-2d/files/scripts/BallBody.ts +0 -298
  131. package/templates/recipe-bouncer-2d/files/scripts/GameRules.ts +0 -377
  132. package/templates/recipe-bouncer-2d/files/scripts/MenuFlow.ts +0 -109
  133. package/templates/recipe-bouncer-2d/files/scripts/PaddleController.ts +0 -112
  134. package/templates/recipe-bouncer-2d/files/scripts/ScoreHud.ts +0 -94
  135. package/templates/recipe-bouncer-2d/files/scripts/TouchRules.ts +0 -263
  136. package/templates/recipe-bouncer-2d/files/scripts/ball-collision.ts +0 -307
  137. package/templates/recipe-bouncer-2d/files/sprites/ph-ball.png +0 -0
  138. package/templates/recipe-bouncer-2d/files/sprites/ph-bg.png +0 -0
  139. package/templates/recipe-bouncer-2d/files/sprites/ph-bumper.png +0 -0
  140. package/templates/recipe-bouncer-2d/files/sprites/ph-paddle.png +0 -0
  141. package/templates/recipe-bouncer-2d/template.yaml +0 -10
  142. package/templates/recipe-grid-3d/files/README.md +0 -22
  143. package/templates/recipe-grid-3d/files/design/recipe.md +0 -110
  144. package/templates/recipe-grid-3d/files/scenes/main.pix3scene +0 -169
  145. package/templates/recipe-grid-3d/files/scenes/menu.pix3scene +0 -100
  146. package/templates/recipe-grid-3d/files/scenes/ui/result.pix3scene +0 -105
  147. package/templates/recipe-grid-3d/files/scripts/GridBoard.ts +0 -319
  148. package/templates/recipe-grid-3d/files/scripts/GridRules.ts +0 -278
  149. package/templates/recipe-grid-3d/files/scripts/MenuFlow.ts +0 -106
  150. package/templates/recipe-grid-3d/files/scripts/ScoreHud.ts +0 -94
  151. package/templates/recipe-grid-3d/template.yaml +0 -10
  152. package/templates/recipe-tapper-2d/files/README.md +0 -39
  153. package/templates/recipe-tapper-2d/files/design/recipe.md +0 -132
  154. package/templates/recipe-tapper-2d/files/design/tests/reachability.json +0 -4
  155. package/templates/recipe-tapper-2d/files/design/tests/routines/terminal-retry.json +0 -23
  156. package/templates/recipe-tapper-2d/files/scenes/main.pix3scene +0 -269
  157. package/templates/recipe-tapper-2d/files/scenes/menu.pix3scene +0 -100
  158. package/templates/recipe-tapper-2d/files/scenes/prefabs/hazard.pix3scene +0 -42
  159. package/templates/recipe-tapper-2d/files/scenes/prefabs/target.pix3scene +0 -45
  160. package/templates/recipe-tapper-2d/files/scenes/ui/result.pix3scene +0 -85
  161. package/templates/recipe-tapper-2d/files/scripts/GameRules.ts +0 -368
  162. package/templates/recipe-tapper-2d/files/scripts/MenuFlow.ts +0 -106
  163. package/templates/recipe-tapper-2d/files/scripts/ScoreHud.ts +0 -94
  164. package/templates/recipe-tapper-2d/files/scripts/Spawner.ts +0 -214
  165. package/templates/recipe-tapper-2d/files/scripts/TouchRules.ts +0 -192
  166. package/templates/recipe-tapper-2d/files/sprites/ph-hazard.png +0 -0
  167. package/templates/recipe-tapper-2d/files/sprites/ph-target.png +0 -0
  168. package/templates/recipe-tapper-2d/template.yaml +0 -10
@@ -1,2 +1,2 @@
1
1
  import { createRequire as __pix3CreateRequire } from 'node:module'; const require = __pix3CreateRequire(import.meta.url);
2
- import{$ as _,$a as $o,$b as $r,$c as $e,$d as om,$e as op,A as z,Aa as Ao,Ab as Ar,Ac as Ae,Ad as Bf,Ae as Bm,Af as Bp,B as A,Ba as Bo,Bb as Br,Bc as Be,Bd as Cf,Be as Cm,Bf as Cp,C as B,Ca as Co,Cb as Cr,Cc as Ce,Cd as Df,Ce as Dm,Cf as Dp,D as C,Da as Do,Db as Dr,Dc as De,Dd as Ef,De as Em,Df as Ep,E as D,Ea as Eo,Eb as Er,Ec as Ee,Ed as Ff,Ee as Fm,Ef as Fp,F as E,Fa as Fo,Fb as Fr,Fc as Fe,Fd as Gf,Fe as Gm,Ff as Gp,G as F,Ga as Go,Gb as Gr,Gc as Ge,Gd as Hf,Ge as Hm,Gf as Hp,H as G,Ha as Ho,Hb as Hr,Hc as He,Hd as If,He as Im,Hf as Ip,I as H,Ia as Io,Ib as Ir,Ic as Ie,Id as Jf,Ie as Jm,If as Jp,J as I,Ja as Jo,Jb as Jr,Jc as Je,Jd as Kf,Je as Km,Jf as Kp,K as J,Ka as Ko,Kb as Kr,Kc as Ke,Kd as Lf,Ke as Lm,Kf as Lp,L as K,La as Lo,Lb as Lr,Lc as Le,Ld as Mf,Le as Mm,Lf as Mp,M as L,Ma as Mo,Mb as Mr,Mc as Me,Md as Nf,Me as Nm,Mf as Np,N as M,Na as No,Nb as Nr,Nc as Ne,Nd as Of,Ne as Om,Nf as Op,O as N,Oa as Oo,Ob as Or,Oc as Oe,Od as Pf,Oe as Pm,Of as Pp,P as O,Pa as Po,Pb as Pr,Pc as Pe,Pd as Qf,Pe as Qm,Pf as Qp,Q as P,Qa as Qo,Qb as Qr,Qc as Qe,Qd as Rf,Qe as Rm,Qf as Rp,R as Q,Ra as Ro,Rb as Rr,Rc as Re,Rd as Sf,Re as Sm,Rf as Sp,S as R,Sa as So,Sb as Sr,Sc as Se,Sd as Tf,Se as Tm,Sf as Tp,T as S,Ta as To,Tb as Tr,Tc as Te,Td as Uf,Te as Um,Tf as Up,U as T,Ua as Uo,Ub as Ur,Uc as Ue,Ud as Vf,Ue as Vm,V as U,Va as Vo,Vb as Vr,Vc as Ve,Vd as Wf,Ve as Wm,W as V,Wa as Wo,Wb as Wr,Wc as We,Wd as Xf,We as Xm,X as W,Xa as Xo,Xb as Xr,Xc as Xe,Xd as Yf,Xe as Ym,Y as X,Ya as Yo,Yb as Yr,Yc as Ye,Yd as Zf,Ye as Zm,Z as Y,Za as Zo,Zb as Zr,Zc as Ze,Zd as _f,Ze as _m,_ as Z,_a as _o,_b as _r,_c as _e,_d as $f,_e as $m,aa as $,ab as or,ac as oe,ad as of,ae as rm,af as rp,b as o,ba as oo,bb as rr,bc as re,bd as rf,be as em,bf as ep,c as r,ca as ro,cb as er,cc as ee,cd as ef,ce as fm,cf as fp,d as e,da as eo,db as fr,dc as fe,dd as ff,de as mm,df as mp,e as f,ea as fo,eb as mr,ec as me,ed as mf,ee as pm,ef as pp,f as m,fa as mo,fb as pr,fc as pe,fd as pf,fe as tm,ff as tp,g as p,ga as po,gb as tr,gc as te,gd as tf,ge as xm,gf as xp,h as t,ha as to,hb as xr,hc as xe,hd as xf,he as am,hf as ap,i as x,ia as xo,ib as ar,ic as ae,id as af,ie as bm,if as bp,j as a,ja as ao,jb as br,jc as be,jd as bf,je as cm,jf as cp,k as b,ka as bo,kb as cr,kc as ce,kd as cf,ke as dm,kf as dp,l as c,la as co,lb as dr,lc as de,ld as df,le as gm,lf as gp,m as d,ma as go,mb as gr,mc as ge,md as gf,me as hm,mf as hp,n as g,na as ho,nb as hr,nc as he,nd as hf,ne as im,nf as ip,o as h,oa as io,ob as ir,oc as ie,od as jf,oe as jm,of as jp,p as i,pa as jo,pb as jr,pc as je,pd as kf,pe as km,pf as kp,q as j,qa as ko,qb as kr,qc as ke,qd as lf,qe as lm,qf as lp,r as k,ra as lo,rb as lr,rc as le,rd as nf,re as nm,rf as np,s as l,sa as no,sb as nr,sc as ne,sd as qf,se as qm,sf as qp,t as n,ta as qo,tb as qr,tc as qe,td as sf,te as sm,tf as sp,u as q,ua as so,ub as sr,uc as se,ud as uf,ue as um,uf as up,v as s,va as uo,vb as ur,vc as ue,vd as vf,ve as vm,vf as vp,w as u,wa as vo,wb as vr,wc as ve,wd as wf,we as wm,wf as wp,x as v,xa as wo,xb as wr,xc as we,xd as yf,xe as ym,xf as yp,y as w,ya as yo,yb as yr,yc as ye,yd as zf,ye as zm,yf as zp,z as y,za as zo,zb as zr,zc as ze,zd as Af,ze as Am,zf as Ap}from"./chunk-CFQFEI52.js";import"./chunk-6ACT6FNV.js";export{Ke as AO_MODES,up as ATLAS_MANIFEST_PATH,oo as ATLAS_REGION_KEY,vp as ATLAS_SHEET_DIR,$ as ATLAS_SHEET_SCHEME,ro as ATLAS_SIZE_KEY,ko as AUDIO_BUS_NAMES,Hr as AmbientLightNode,hr as AnimatedSprite2D,Qr as AnimatedSprite3D,rp as AnimationPlayerBehavior,jo as AssetLoader,Im as AudioApi,ve as AudioPlayer,lo as AudioService,fr as BATCHABLE_2D_KEY,Jo as BLEND_MODES_2D,Ko as BLEND_MODE_2D_OPTIONS,Vo as BUILTIN_SHADER_EFFECTS,wm as BURST_MAX_PARTICLES,ae as Bar2D,mr as Batch2DSystem,Gp as BurstOnSignalBehavior,te as Button2D,Ar as CAMERA2D_DEFAULTS,Op as CHARACTER_STATE_FINISHED_SIGNAL,Sf as CONTACT_MARGIN,Xe as CURRENT_SCENE_FORMAT_VERSION,Br as Camera2D,Ee as Camera3D,ep as CameraBrainBehavior,Dr as CanvasLayer2D,Pp as CharacterVisual2DBehavior,be as Checkbox2D,Lp as Collider2DBehavior,Rf as Collision2DService,kr as ColorRect2D,fp as CutsceneApi,Vm as DEFAULT_CLIP_DURATION,gp as DEFAULT_FIXED_DELTA_SEC,ye as DEFAULT_GEOMETRY_MATERIAL_TYPE,ip as DEFAULT_RUNTIME_TIME_CONFIG,k as DIRECTION_AXES_ENABLED_KEY,Er as DirectionalLightNode,Fe as EASING_NAMES,bp as ECSService,ff as EMOJI_GUARDED_TEXT_PROPERTIES,Cp as FadeBehavior,zm as FloatText2D,r as GAME_DEBUG_GLOBAL_KEY,ze as GEOMETRY_KINDS,we as GEOMETRY_MATERIAL_TYPES,sm as GameCommandRegistry,qm as GameTime,Ae as GeometryMesh,wr as Group2D,Or as HemisphereLightNode,Jp as Hitbox2DBehavior,ef as INSTANCE_TRANSFORM_KEYS,nf as InputService,Be as InstancedMesh3D,ce as InventorySlot2D,Wr as Joystick2D,Cm as JuiceApi,Ir as KNOWN_SCENE_NODE_TYPES,ie as LABEL_AUTO_SIZE_BLEED,je as LABEL_GLOW_STRENGTH_LIMIT,de as LABEL_H_ALIGN_VALUES,he as LABEL_LINE_HEIGHT_FACTOR,ge as LABEL_V_ALIGN_VALUES,ue as Label2D,mp as LocalizationService,Zf as MAX_NET_KIND,sf as MAX_POLYGON_VERTICES,hp as MAX_TICKS_PER_FRAME,Um as MIN_CLIP_DURATION,qf as MIN_POLYGON_VERTICES,L as MeshInstance,xm as NET_APP_FLAGS_SHIFT,tm as NET_OWNERSHIP_MASK,_f as NetKindTable,im as NetRoomVars,gm as NetworkConnectError,nm as NetworkNodeBinder,jm as NetworkService,dm as NetworkSpawnError,Qp as NetworkedNodeBehavior,Po as Node2D,G as Node3D,F as NodeBase,re as OVERLAY_2D_FLAG,h as PHYSICS_DEBUG_ENABLED_KEY,c as PHYSICS_DEBUG_GLOBAL_KEY,Oe as POST_PROCESS_DEFAULTS,Le as PROJECT_AO_MODES,xf as PROJECT_SCRIPT_DIRECTORIES,af as PROJECT_SCRIPT_ENTRY_PATTERN,S as PROJECT_TEXTURE_FILTERING_MODES,ym as ParticleBurst2D,Rr as Particles3D,Xf as Physics2DService,Kp as PhysicsBody2DBehavior,Mp as PhysicsWorld2DBehavior,Bp as PinToNodeBehavior,Ep as PlaySoundBehavior,Fr as PointLightNode,vm as PopInBehavior,Pe as PostProcess,xp as PostProcessingPipeline,um as PunchScaleBehavior,x as RUNTIME_PROPERTY_SINK_GLOBAL_KEY,m as RUNTIME_SCENE_GLOBAL_KEY,Dp as RadialProgressBehavior,Yf as RejectCode,Rp as ReplicatedTransformBehavior,o as ResourceManager,Np as RevoluteJoint2DBehavior,yp as RotateBehavior,sp as RuntimeRenderer,_e as SCENE_COMPONENT_DEFINITION_KEYS,$e as SCENE_DISK_FORMAT_TYPES,Ye as SCENE_DOCUMENT_KEYS,Ze as SCENE_NODE_DEFINITION_KEYS,u as SCRIPT_ERROR_SINK_GLOBAL_KEY,me as SEMANTIC_POINTER_ID,Em as SFX_PRESETS,E as SHARED_UNIT_QUAD_GEOMETRY,y as SIGNAL_EMIT_SINK_GLOBAL_KEY,Te as SceneLoader,lf as SceneManager,qp as SceneRunner,kf as SceneSaver,pp as SceneService,Se as SceneValidationError,qo as Script,no as ScriptRegistry,fe as ScrollContainer2D,Fp as SfxOnSignalBehavior,Hm as SfxSynth,or as ShaderEffectStack,yr as ShakeBehavior,zp as SimpleMoveBehavior,Ap as SineBehavior,xe as Slider2D,jr as SpineSkeleton2D,ir as SpineSkeletonView,Gr as SpotLightNode,ar as Sprite2D,Pr as Sprite3D,Ce as TARGET_DISTANCE,q as TEST_COMPONENT_TYPE_PREFIX,Am as TRAIL_MAX_POINTS,vr as TiledSprite2D,Bm as Trail2D,Dm as TweenApi,pe as UIControl2D,bf as USER_SCRIPT_ID_PREFIX,Ie as VIRTUAL_CAMERA_DEFAULTS,Je as VirtualCamera3D,mm as WS_CLOSE_NORMAL,fm as WS_CLOSE_PROTOCOL_VIOLATION,pm as WsTransport,nr as ZERO_SLICE_BORDER,Oo as Z_INDEX_LIMIT,De as aimCameraNodeAt,Qe as aoModeUsesSSAO,No as applyBlendMode2DToMaterial,Tm as applyClipAtTime,He as applyEasing,ap as applyLocaleToTree,$r as applyTextStyle,Y as applyTextureRegionToTexture,ee as assign2DRenderOrder,K as assignWithoutSchemaRefresh,fo as atlasSizeOf,Ao as attachComponentDefinitions,eo as baseRegionOf,Mo as blendingForMode2D,Ef as boxPolygon,ur as buildSkinGeometry,lr as buildTiledSpriteGeometry,Gf as capsulePolygon,Jf as circleIntersectsPolygon,Ff as circlePolygon,Gm as clampSfxPitch,Af as cleanPolygon,Ym as coerceKeyframeValue,er as coerceTextureResource,Ro as coerceToPropertyType,Mm as collectAudioKeysInRange,P as collectClipPointNames,Co as collectComponentDefinitions,Nm as collectEventKeysInRange,Ue as collectRenderabilityIssues,Lm as collectTimedKeysInRange,Uf as collideCirclePolygon,Tf as collideCircles,Vf as collidePolygons,Zo as composeEffectShaders,Z as composeTextureRegion,W as configure2DTexture,Bf as convexHull,Mf as convexPolygonsIntersect,po as copyAtlasMetadata,to as createAtlasResolver,Sm as createClipBindings,$m as createDefaultClip,_m as createEmptyAnimationSet,Zr as cssFont,Xr as cssFontFamily,Yr as cssFontWeight,lm as decodeSignalPayload,Of as decomposeConvex,So as defineGroup,Qo as defineProperty,uo as describeFontFace,hm as describeRejectCode,D as describeThrown,Nr as describeUnknownNodeType,If as distanceToPolygonBoundary,_r as drawStyledText,Uo as effectSupportsTarget,km as encodeSignalPayload,zf as ensureCounterClockwise,Cr as findActiveCamera2D,R as findAnimationClip,O as findAnimationFramePoint,tf as findEmojiArtInSceneYaml,op as findKeyframeClip,Om as fireEventKey,Qm as fromSchemaValue,Xm as generateTrackId,tr as getActiveLocalization,Yo as getAllShaderEffectTypes,M as getAnimationFrameTexturePath,zo as getComponentSchemaProperties,f as getGameDebug,$f as getNetKindTable,Do as getNodePropertySchema,g as getPhysicsDebugSource,Ne as getProjectAODefault,V as getProjectTextureFiltering,Eo as getPropertiesByGroup,Fo as getPropertyDefinition,Go as getPropertyDisplayValue,b as getRuntimeLivePropertySink,t as getRuntimeSceneRoot,of as getSceneNodeDiskFormat,w as getScriptErrorSink,Xo as getShaderEffectType,A as getSignalEmitSink,wp as installAtlasFromManifest,I as installReactiveSchemaProperties,Jm as interpolateValue,n as isDirectionAxesEnabled,mf as isEmojiOnlyText,wo as isFontFaceRegistered,Re as isHighEndDevice,We as isInertNode,Sr as isInteractive,Ge as isKeyframeEasing,Lr as isKnownSceneNodeType,cm as isNetTeleport,j as isPhysicsDebugEnabled,yf as isPolygonConvex,gf as isProjectScriptEntry,df as isProjectScriptPath,_ as isSameTextureRegion,so as isScriptComponent,hf as isScriptComponentClass,N as isSequenceAnimationFrame,Fm as isSfxPreset,$o as isShaderEffectHost,sr as isSliceBorderEmpty,ao as isSpineModuleAvailable,s as isTestHarnessComponentType,pf as isTextProperty,rr as isTextureResourceRef,Wm as isTrackValueType,ne as labelDecorationPadding,ke as labelGlowBlurPx,le as labelGlowPasses,qe as layoutLabelText,yo as loadProjectFonts,io as loadSpineAsset,bo as loadSpineModule,H as makeSchemaPropertyReactive,To as mergeSchemas,bm as netFlagsByte,am as netOwnershipOf,Q as normalizeAnimationResource,Lo as normalizeBlendMode2D,Zm as normalizeKeyframeAnimationSet,Jr as normalizeNodeTypeName,Hp as normalizePolygonConfig,T as normalizeProjectTextureFiltering,qr as normalizeSliceBorder,se as paintLabelCanvas,br as parseEventArgs,ho as parseSpineAtlasPageNames,np as playable,Hf as pointInPolygon,vf as polygonArea,Cf as polygonBounds,wf as polygonCentroid,uf as polygonSignedArea,Tp as property,Qf as quaternionToRotationZ,J as reactiveSchemaPropertyNames,Ur as readBooleanArg,Tr as readNumberArg,Vr as readStringArg,Pf as readWorldTransform2D,Lf as rectIntersectsConvexPolygon,Kf as rectIntersectsPolygon,Sp as registerBuiltInScripts,e as registerGameDebug,rm as registerNetworkPrefab,d as registerPhysicsDebugSource,jf as registerProjectScriptExports,a as registerRuntimeLivePropertySink,p as registerRuntimeSceneRoot,v as registerScriptErrorSink,Wo as registerShaderEffect,z as registerSignalEmitSink,C as reportScriptError,B as reportSignalEmit,em as resetNetKindTable,vo as resetProjectFontRegistry,cr as resolveAnimatedSpriteFrameLayout,dr as resolveFramePointToLocal,gr as resolveFramePolygonToLocal,xr as resolveLocalizedText,Bo as resolvePendingComponents,jp as resolveRuntimeTimeConfig,rf as resolveSceneDiskKey,Kr as resolveSceneNodeType,go as resolveSpinePagePath,Rm as resolveTrackTarget,Km as sampleTrack,X as sanitizeTextureRegion,Nf as segmentPolygonT,Ip as serializePolygonConfig,pr as setActiveLocalization,lp as setDefaultStoreUrl,l as setDirectionAxesEnabled,om as setNetworkPrefabTable,Io as setNodePropertyValue,i as setPhysicsDebugEnabled,kp as setPlayableAdapter,tp as setPostprocessingModuleLoader,Me as setProjectAODefault,U as setProjectTextureFiltering,xo as setSpineModuleLoader,_o as shaderEffectsCacheKey,zr as shakeNoise,co as spineAssetKey,mo as stampAtlasView,Up as state,oe as styledTextPadding,Mr as suggestSceneNodeType,Ve as summarizeRenderabilityIssues,Wf as sweepCircleAgainstPolygon,Pm as toSchemaValue,Df as transformPolygon,cf as userScriptComponentId,Ho as validatePropertyValue,cp as worldToCanvasLogical,dp as worldToCanvasThroughCamera};
2
+ import{$ as _,$a as $o,$b as $r,$c as $e,$d as om,$e as op,A as z,Aa as Ao,Ab as Ar,Ac as Ae,Ad as Bf,Ae as Bm,Af as Bp,B as A,Ba as Bo,Bb as Br,Bc as Be,Bd as Cf,Be as Cm,Bf as Cp,C as B,Ca as Co,Cb as Cr,Cc as Ce,Cd as Df,Ce as Dm,Cf as Dp,D as C,Da as Do,Db as Dr,Dc as De,Dd as Ef,De as Em,Df as Ep,E as D,Ea as Eo,Eb as Er,Ec as Ee,Ed as Ff,Ee as Fm,Ef as Fp,F as E,Fa as Fo,Fb as Fr,Fc as Fe,Fd as Gf,Fe as Gm,Ff as Gp,G as F,Ga as Go,Gb as Gr,Gc as Ge,Gd as Hf,Ge as Hm,Gf as Hp,H as G,Ha as Ho,Hb as Hr,Hc as He,Hd as If,He as Im,Hf as Ip,I as H,Ia as Io,Ib as Ir,Ic as Ie,Id as Jf,Ie as Jm,If as Jp,J as I,Ja as Jo,Jb as Jr,Jc as Je,Jd as Kf,Je as Km,Jf as Kp,K as J,Ka as Ko,Kb as Kr,Kc as Ke,Kd as Lf,Ke as Lm,Kf as Lp,L as K,La as Lo,Lb as Lr,Lc as Le,Ld as Mf,Le as Mm,Lf as Mp,M as L,Ma as Mo,Mb as Mr,Mc as Me,Md as Nf,Me as Nm,Mf as Np,N as M,Na as No,Nb as Nr,Nc as Ne,Nd as Of,Ne as Om,Nf as Op,O as N,Oa as Oo,Ob as Or,Oc as Oe,Od as Pf,Oe as Pm,Of as Pp,P as O,Pa as Po,Pb as Pr,Pc as Pe,Pd as Qf,Pe as Qm,Pf as Qp,Q as P,Qa as Qo,Qb as Qr,Qc as Qe,Qd as Rf,Qe as Rm,Qf as Rp,R as Q,Ra as Ro,Rb as Rr,Rc as Re,Rd as Sf,Re as Sm,Rf as Sp,S as R,Sa as So,Sb as Sr,Sc as Se,Sd as Tf,Se as Tm,Sf as Tp,T as S,Ta as To,Tb as Tr,Tc as Te,Td as Uf,Te as Um,Tf as Up,U as T,Ua as Uo,Ub as Ur,Uc as Ue,Ud as Vf,Ue as Vm,Uf as Vp,V as U,Va as Vo,Vb as Vr,Vc as Ve,Vd as Wf,Ve as Wm,Vf as Wp,W as V,Wa as Wo,Wb as Wr,Wc as We,Wd as Xf,We as Xm,Wf as Xp,X as W,Xa as Xo,Xb as Xr,Xc as Xe,Xd as Yf,Xe as Ym,Xf as Yp,Y as X,Ya as Yo,Yb as Yr,Yc as Ye,Yd as Zf,Ye as Zm,Yf as Zp,Z as Y,Za as Zo,Zb as Zr,Zc as Ze,Zd as _f,Ze as _m,Zf as _p,_ as Z,_a as _o,_b as _r,_c as _e,_d as $f,_e as $m,aa as $,ab as or,ac as oe,ad as of,ae as rm,af as rp,b as o,ba as oo,bb as rr,bc as re,bd as rf,be as em,bf as ep,c as r,ca as ro,cb as er,cc as ee,cd as ef,ce as fm,cf as fp,d as e,da as eo,db as fr,dc as fe,dd as ff,de as mm,df as mp,e as f,ea as fo,eb as mr,ec as me,ed as mf,ee as pm,ef as pp,f as m,fa as mo,fb as pr,fc as pe,fd as pf,fe as tm,ff as tp,g as p,ga as po,gb as tr,gc as te,gd as tf,ge as xm,gf as xp,h as t,ha as to,hb as xr,hc as xe,hd as xf,he as am,hf as ap,i as x,ia as xo,ib as ar,ic as ae,id as af,ie as bm,if as bp,j as a,ja as ao,jb as br,jc as be,jd as bf,je as cm,jf as cp,k as b,ka as bo,kb as cr,kc as ce,kd as cf,ke as dm,kf as dp,l as c,la as co,lb as dr,lc as de,ld as df,le as gm,lf as gp,m as d,ma as go,mb as gr,mc as ge,md as gf,me as hm,mf as hp,n as g,na as ho,nb as hr,nc as he,nd as hf,ne as im,nf as ip,o as h,oa as io,ob as ir,oc as ie,od as jf,oe as jm,of as jp,p as i,pa as jo,pb as jr,pc as je,pd as kf,pe as km,pf as kp,q as j,qa as ko,qb as kr,qc as ke,qd as lf,qe as lm,qf as lp,r as k,ra as lo,rb as lr,rc as le,rd as nf,re as nm,rf as np,s as l,sa as no,sb as nr,sc as ne,sd as qf,se as qm,sf as qp,t as n,ta as qo,tb as qr,tc as qe,td as sf,te as sm,tf as sp,u as q,ua as so,ub as sr,uc as se,ud as uf,ue as um,uf as up,v as s,va as uo,vb as ur,vc as ue,vd as vf,ve as vm,vf as vp,w as u,wa as vo,wb as vr,wc as ve,wd as wf,we as wm,wf as wp,x as v,xa as wo,xb as wr,xc as we,xd as yf,xe as ym,xf as yp,y as w,ya as yo,yb as yr,yc as ye,yd as zf,ye as zm,yf as zp,z as y,za as zo,zb as zr,zc as ze,zd as Af,ze as Am,zf as Ap}from"./chunk-VIHIF4G2.js";import"./chunk-6ACT6FNV.js";export{Ne as AO_MODES,Bp as ATLAS_MANIFEST_PATH,oo as ATLAS_REGION_KEY,Cp as ATLAS_SHEET_DIR,$ as ATLAS_SHEET_SCHEME,ro as ATLAS_SIZE_KEY,ko as AUDIO_BUS_NAMES,Kr as AmbientLightNode,kr as AnimatedSprite2D,Tr as AnimatedSprite3D,tp as AnimationPlayerBehavior,jo as AssetLoader,Nm as AudioApi,ze as AudioPlayer,lo as AudioService,tr as BATCHABLE_2D_KEY,Lo as BLEND_MODES_2D,Mo as BLEND_MODE_2D_OPTIONS,Yo as BUILTIN_SHADER_EFFECTS,Cm as BURST_MAX_PARTICLES,de as Bar2D,xr as Batch2DSystem,Mp as BurstOnSignalBehavior,be as Button2D,Dr as CAMERA2D_DEFAULTS,Up as CHARACTER_STATE_FINISHED_SIGNAL,Xf as CONTACT_MARGIN,Ze as CURRENT_SCENE_FORMAT_VERSION,Er as Camera2D,He as Camera3D,xp as CameraBrainBehavior,Gr as CanvasLayer2D,Vp as CharacterVisual2DBehavior,ge as Checkbox2D,Rp as Collider2DBehavior,Wf as Collision2DService,qr as ColorRect2D,ap as CutsceneApi,_m as DEFAULT_CLIP_DURATION,lp as DEFAULT_FIXED_DELTA_SEC,Be as DEFAULT_GEOMETRY_MATERIAL_TYPE,qp as DEFAULT_RUNTIME_TIME_CONFIG,k as DIRECTION_AXES_ENABLED_KEY,Hr as DirectionalLightNode,Ie as EASING_NAMES,ip as ECSService,pf as EMOJI_GUARDED_TEXT_PROPERTIES,Ip as FadeBehavior,Em as FloatText2D,r as GAME_DEBUG_GLOBAL_KEY,Ce as GEOMETRY_KINDS,Ae as GEOMETRY_MATERIAL_TYPES,zm as GameCommandRegistry,ym as GameTime,De as GeometryMesh,Ar as Group2D,Rr as HemisphereLightNode,Pp as Hitbox2DBehavior,mf as INSTANCE_TRANSFORM_KEYS,wf as InputService,Ee as InstancedMesh3D,he as InventorySlot2D,Zr as Joystick2D,Hm as JuiceApi,Lr as KNOWN_SCENE_NODE_TYPES,le as LABEL_AUTO_SIZE_BLEED,ne as LABEL_GLOW_STRENGTH_LIMIT,ie as LABEL_H_ALIGN_VALUES,ke as LABEL_LINE_HEIGHT_FACTOR,je as LABEL_V_ALIGN_VALUES,ye as Label2D,bp as LocalizationService,em as MAX_NET_KIND,zf as MAX_POLYGON_VERTICES,np as MAX_TICKS_PER_FRAME,Zm as MIN_CLIP_DURATION,yf as MIN_POLYGON_VERTICES,L as MeshInstance,gm as NET_APP_FLAGS_SHIFT,dm as NET_OWNERSHIP_MASK,Qo as NODE2D_MARGIN_SIDES,fm as NetKindTable,qm as NetRoomVars,lm as NetworkConnectError,wm as NetworkNodeBinder,sm as NetworkService,km as NetworkSpawnError,Wp as NetworkedNodeBehavior,So as Node2D,G as Node3D,F as NodeBase,me as OVERLAY_2D_FLAG,h as PHYSICS_DEBUG_ENABLED_KEY,c as PHYSICS_DEBUG_GLOBAL_KEY,Re as POST_PROCESS_DEFAULTS,Oe as PROJECT_AO_MODES,bf as PROJECT_SCRIPT_DIRECTORIES,cf as PROJECT_SCRIPT_EXCLUDE_PATTERN,S as PROJECT_TEXTURE_FILTERING_MODES,Dm as ParticleBurst2D,Ur as Particles3D,om as Physics2DService,Qp as PhysicsBody2DBehavior,Sp as PhysicsWorld2DBehavior,Hp as PinToNodeBehavior,Kp as PlaySoundBehavior,Ir as PointLightNode,Bm as PopInBehavior,Se as PostProcess,gp as PostProcessingPipeline,Am as PunchScaleBehavior,x as RUNTIME_PROPERTY_SINK_GLOBAL_KEY,m as RUNTIME_SCENE_GLOBAL_KEY,Jp as RadialProgressBehavior,rm as RejectCode,Xp as ReplicatedTransformBehavior,o as ResourceManager,Tp as RevoluteJoint2DBehavior,Ep as RotateBehavior,zp as RuntimeRenderer,of as SCENE_COMPONENT_DEFINITION_KEYS,rf as SCENE_DISK_FORMAT_TYPES,_e as SCENE_DOCUMENT_KEYS,$e as SCENE_NODE_DEFINITION_KEYS,u as SCRIPT_ERROR_SINK_GLOBAL_KEY,xe as SEMANTIC_POINTER_ID,Jm as SFX_PRESETS,E as SHARED_UNIT_QUAD_GEOMETRY,y as SIGNAL_EMIT_SINK_GLOBAL_KEY,We as SceneLoader,vf as SceneManager,yp as SceneRunner,uf as SceneSaver,cp as SceneService,Ve as SceneValidationError,qo as Script,no as ScriptRegistry,te as ScrollContainer2D,Lp as SfxOnSignalBehavior,Mm as SfxSynth,fr as ShaderEffectStack,Br as ShakeBehavior,Fp as SimpleMoveBehavior,Gp as SineBehavior,ce as Slider2D,nr as SpineSkeleton2D,lr as SpineSkeletonView,Jr as SpotLightNode,dr as Sprite2D,Sr as Sprite3D,Fe as TARGET_DISTANCE,q as TEST_COMPONENT_TYPE_PREFIX,Fm as TRAIL_MAX_POINTS,zr as TiledSprite2D,Gm as Trail2D,Im as TweenApi,ae as UIControl2D,gf as USER_SCRIPT_ID_PREFIX,Le as VIRTUAL_CAMERA_DEFAULTS,Me as VirtualCamera3D,bm as WS_CLOSE_NORMAL,am as WS_CLOSE_PROTOCOL_VIOLATION,cm as WsTransport,ur as ZERO_SLICE_BORDER,Ro as Z_INDEX_LIMIT,Ge as aimCameraNodeAt,Te as aoModeUsesSSAO,Po as applyBlendMode2DToMaterial,Ym as applyClipAtTime,Ke as applyEasing,hp as applyLocaleToTree,ee as applyTextStyle,Y as applyTextureRegionToTexture,pe as assign2DRenderOrder,K as assignWithoutSchemaRefresh,fo as atlasSizeOf,Ao as attachComponentDefinitions,qf as autoloadComponentType,eo as baseRegionOf,Oo as blendingForMode2D,Jf as boxPolygon,yr as buildSkinGeometry,sr as buildTiledSpriteGeometry,Lf as capsulePolygon,Of as circleIntersectsPolygon,Kf as circlePolygon,Lm as clampSfxPitch,Ff as cleanPolygon,rp as coerceKeyframeValue,pr as coerceTextureResource,Uo as coerceToPropertyType,Rm as collectAudioKeysInRange,P as collectClipPointNames,Eo as collectComponentDefinitions,Sm as collectEventKeysInRange,Xe as collectRenderabilityIssues,Qm as collectTimedKeysInRange,Zf as collideCirclePolygon,Yf as collideCircles,_f as collidePolygons,or as composeEffectShaders,Z as composeTextureRegion,W as configure2DTexture,Gf as convexHull,Rf as convexPolygonsIntersect,po as copyAtlasMetadata,to as createAtlasResolver,Xm as createClipBindings,mp as createDefaultClip,fp as createEmptyAnimationSet,oe as cssFont,_r as cssFontFamily,$r as cssFontWeight,vm as decodeSignalPayload,Tf as decomposeConvex,Vo as defineGroup,To as defineProperty,af as describeEmojiAsArt,uo as describeFontFace,nm as describeRejectCode,D as describeThrown,Qr as describeUnknownNodeType,Nf as distanceToPolygonBoundary,re as drawStyledText,Xo as effectSupportsTarget,um as encodeSignalPayload,Ef as ensureCounterClockwise,Fr as findActiveCamera2D,R as findAnimationClip,O as findAnimationFramePoint,pp as findKeyframeClip,Tm as fireEventKey,Vm as fromSchemaValue,op as generateTrackId,br as getActiveLocalization,$o as getAllShaderEffectTypes,M as getAnimationFrameTexturePath,zo as getComponentSchemaProperties,f as getGameDebug,mm as getNetKindTable,Fo as getNodePropertySchema,g as getPhysicsDebugSource,Qe as getProjectAODefault,V as getProjectTextureFiltering,Go as getPropertiesByGroup,Ho as getPropertyDefinition,Io as getPropertyDisplayValue,b as getRuntimeLivePropertySink,t as getRuntimeSceneRoot,ef as getSceneNodeDiskFormat,w as getScriptErrorSink,_o as getShaderEffectType,A as getSignalEmitSink,Dp as installAtlasFromManifest,I as installReactiveSchemaProperties,Om as interpolateValue,n as isDirectionAxesEnabled,tf as isEmojiOnlyText,wo as isFontFaceRegistered,Ue as isHighEndDevice,Ye as isInertNode,Vr as isInteractive,Je as isKeyframeEasing,Or as isKnownSceneNodeType,jm as isNetTeleport,j as isPhysicsDebugEnabled,Df as isPolygonConvex,kf as isProjectScriptEntry,jf as isProjectScriptPath,_ as isSameTextureRegion,so as isScriptComponent,lf as isScriptComponentClass,N as isSequenceAnimationFrame,Km as isSfxPreset,er as isShaderEffectHost,wr as isSliceBorderEmpty,ao as isSpineModuleAvailable,Co as isStaleComponent,s as isTestHarnessComponentType,xf as isTextProperty,mr as isTextureResourceRef,$m as isTrackValueType,ue as labelDecorationPadding,qe as labelGlowBlurPx,se as labelGlowPasses,ve as layoutLabelText,yo as loadProjectFonts,io as loadSpineAsset,bo as loadSpineModule,H as makeSchemaPropertyReactive,Wo as mergeSchemas,im as netFlagsByte,hm as netOwnershipOf,Q as normalizeAnimationResource,sf as normalizeAutoloads,No as normalizeBlendMode2D,ep as normalizeKeyframeAnimationSet,Mr as normalizeNodeTypeName,Np as normalizePolygonConfig,T as normalizeProjectTextureFiltering,vr as normalizeSliceBorder,we as paintLabelCanvas,gr as parseEventArgs,ho as parseSpineAtlasPageNames,wp as playable,Mf as pointInPolygon,Bf as polygonArea,Hf as polygonBounds,Cf as polygonCentroid,Af as polygonSignedArea,df as projectScriptGlobPatterns,Zp as property,Vf as quaternionToRotationZ,J as reactiveSchemaPropertyNames,Xr as readBooleanArg,Wr as readNumberArg,Yr as readStringArg,Uf as readWorldTransform2D,Qf as rectIntersectsConvexPolygon,Pf as rectIntersectsPolygon,Yp as registerBuiltInScripts,e as registerGameDebug,tm as registerNetworkPrefab,d as registerPhysicsDebugSource,nf as registerProjectScriptExports,a as registerRuntimeLivePropertySink,p as registerRuntimeSceneRoot,v as registerScriptErrorSink,Zo as registerShaderEffect,z as registerSignalEmitSink,Do as replaceStaleComponents,C as reportScriptError,B as reportSignalEmit,xm as resetNetKindTable,vo as resetProjectFontRegistry,hr as resolveAnimatedSpriteFrameLayout,ir as resolveFramePointToLocal,jr as resolveFramePolygonToLocal,cr as resolveLocalizedText,Bo as resolvePendingComponents,sp as resolveRuntimeTimeConfig,ff as resolveSceneDiskKey,Nr as resolveSceneNodeType,go as resolveSpinePagePath,Wm as resolveTrackTarget,Pm as sampleTrack,X as sanitizeTextureRegion,Ap as scanScriptLocalizationKeys,Sf as segmentPolygonT,Op as serializePolygonConfig,ar as setActiveLocalization,vp as setDefaultStoreUrl,l as setDirectionAxesEnabled,pm as setNetworkPrefabTable,Ko as setNodePropertyValue,i as setPhysicsDebugEnabled,up as setPlayableAdapter,dp as setPostprocessingModuleLoader,Pe as setProjectAODefault,U as setProjectTextureFiltering,xo as setSpineModuleLoader,rr as shaderEffectsCacheKey,Cr as shakeNoise,co as spineAssetKey,mo as stampAtlasView,_p as state,fe as styledTextPadding,Pr as suggestSceneNodeType,$f as sweepCircleAgainstPolygon,Um as toSchemaValue,If as transformPolygon,hf as userScriptComponentId,Jo as validatePropertyValue,jp as worldToCanvasLogical,kp as worldToCanvasThroughCamera};
@@ -0,0 +1,200 @@
1
+ ---
2
+ name: pix3-editor
3
+ description: How to drive the open Pix3 editor tab through Chrome DevTools MCP (the `pix3-browser` server) — find the tab, list the page's `pix3_*` tools, the sync → read → edit → sync loop, what a not-ok `pix3_sync` means (`expect_mismatch`, `stale` with a play owner, `gesture_in_progress`), play ownership, `pix3_game_run`, screenshots, the inline `evaluate_script` fallback when `list_3p_developer_tools` is missing, and sync before a build. Use whenever you run, test or inspect the game in the editor, after every batch of file edits, and before `npm run build`.
4
+ ---
5
+
6
+ <!-- Pix3 agent kit 2.0.0-alpha.0 -->
7
+ # Drive the editor
8
+
9
+ The human has this project open in the Pix3 editor: a tab at `<dev server>/__pix3/` in a Chrome
10
+ that `pix3 editor` started. That Chrome has no open debugging port: its DevTools protocol is
11
+ served by `pix3 editor`'s token proxy (`ws://127.0.0.1:9333/pix3`), and you reach the tab through
12
+ the `pix3-browser` MCP server (chrome-devtools-mcp), which `pix3 agent-setup` configured with the
13
+ proxy and its token. The tab registers its own tools on the page; you edit files, the editor
14
+ follows the disk, and `pix3_sync` is the barrier between the two.
15
+
16
+ ## 1. Find the tab (once per thread, and again after any reload)
17
+
18
+ 1. `.pix3/dev.json` in the project → `publicEditorUrl` when it is there (the address the
19
+ browser reached the server at, e.g. through a port forward), else `editorUrl` (e.g.
20
+ `http://localhost:5173/__pix3/` — but the port is whatever Vite got: 5174, 5175… when 5173 was
21
+ taken, so always read it from `dev.json` or from what `npm run dev` / `npm run editor` printed,
22
+ never assume 5173).
23
+ No file, or the server does not answer → `npm run editor` (= `npx pix3 editor`: starts the
24
+ dev server and Chrome). No `pix3-browser` server in
25
+ your MCP list → `npx pix3 agent-setup` once, then start a new thread. The server cannot
26
+ connect (`401`, connection refused) or `npm run editor` tells you to run
27
+ `pix3 agent-setup --repair` → `npm run editor`, then `npx pix3 agent-setup --repair`, then a
28
+ new thread (a running MCP server keeps the endpoint and token it started with). Never read,
29
+ print or copy the token (`~/.pix3/cdp-token`, `~/.pix3/remote-cdp-token`,
30
+ `~/.pix3/cdp-mcp.json`, `~/.pix3/remote-cdp.json`). An MCP config that still carries
31
+ `--wsHeaders` is an old launch: `npx pix3 agent-setup --repair`.
32
+ **Over SSH** (`npm run editor` answers «SSH session: Chrome is not launched here»): Chrome
33
+ runs on the human's machine. Give the human the lines it printed for their machine — they run
34
+ them, including the one ssh line that copies the token here — then `npx pix3 agent-setup
35
+ --remote` and a new thread. `npm run editor` says `CDP forward: live` once it works.
36
+ 2. `list_pages` → the page whose URL starts with that address → `select_page` with its id.
37
+ **No such page** (the human closed it, or Chrome was started without it) → `npm run editor`
38
+ again: it checks the tab through the proxy and opens it when missing; or open it yourself with
39
+ chrome-devtools-mcp's `new_page` on that URL. Then `list_pages` again. Open one tab only: a
40
+ second editor tab on the same project competes for the writer.
41
+ 3. `list_3p_developer_tools` → the `pix3` group with the seven `pix3_*` tools below. **Call it
42
+ again after every `select_page` and after any page reload** — the registration lives in the
43
+ page, and `execute_3p_developer_tool` answers `Tool … not found` until it is listed again in
44
+ the same MCP process.
45
+
46
+ Call a tool with `execute_3p_developer_tool {toolName: "pix3_sync", params: "{\"timeoutMs\": 15000}"}`
47
+ — `params` is a **JSON string** (escape the quotes). The answer is JSON text; every refusal is
48
+ `{ok:false, reason, detail}` and says what to do.
49
+
50
+ ## 2. The tools
51
+
52
+ | Tool | Params | Does |
53
+ | --- | --- | --- |
54
+ | `pix3_status` | — | versions, `activeScene`, `scriptsStatus`, `writer` (`self` = this tab saves), `dirty` scenes, `pending` unsaved keys per scene, `gestureInProgress`, `pendingExternal`, `play` `{playing, playOwner, startedAt}`, `errorCount` |
55
+ | `pix3_sync` | `expect?` `{path: sha256}`, `timeoutMs?` | flush the editor's unsaved edits to disk, rescan, wait until the editor runs the files on disk; `{ok, rev, changed, expectMismatch}` |
56
+ | `pix3_scene` | `path?`, `maxDepth?`, `nodeId?`, `find?` | the scene tree as the editor holds it (each node's `properties` = what the file gets, unsaved inspector edits included); with `nodeId` the answer is `{ok, node, saved, screen}` — `node` (with `components`), and **beside it, not inside it**, `saved` (the node as the file gets it) and `screen` (origin on the page in CSS px — `click_at {x, y}` taps it); the inline short form `node(id)` returns the node with `saved` merged in; with `find` the nodes whose name/type contains it, `{ok, path, matches: [{nodeId, type, name}]}` (no properties: read one with `nodeId`). Read-only |
57
+ | `pix3_play` | `action` `start\|stop\|restart\|pause\|status`, `scenePath?`, `force?` | play mode; `start` records you as the owner |
58
+ | `pix3_game_run` | `until`, `fail?`, `watch?`, `maxFrames?`, `maxWallMs?`, `settleMs?`, `bot?` | step the running game until a predicate holds or fails; read `verdict` first |
59
+ | `pix3_screenshot` | `target` `game\|viewport` | brings that surface to the front; the picture itself is chrome-devtools-mcp's `take_screenshot` (the tool never returns image data) |
60
+ | `pix3_errors` | `since?` (epoch ms), `clear?` | captured console / runtime errors, newest last |
61
+
62
+ Scenes and scripts are changed as **files** (`pix3-scene-format`, `pix3-scripts`). There is no
63
+ tool that sets a property, creates a node or writes a file, and no input tool: tap or drag the
64
+ running game with chrome-devtools-mcp's own `click_at {x, y}` / `press_key` at the `screen`
65
+ coordinates `pix3_scene {nodeId}` gives (the game runs in the editor's Game tab —
66
+ `pix3_screenshot {target:"game"}` brings it to the front first).
67
+
68
+ ## 3. The loop after you decide to change something
69
+
70
+ 1. **`pix3_sync` first, then read.** A successful sync means the disk holds what the designer
71
+ sees: their unsaved drags and inspector edits are written. Read the scene or script you are
72
+ about to change after that sync, never from memory.
73
+ 2. **Edit the lines you mean to change.** Search/replace in the `.pix3scene`; never regenerate a
74
+ whole scene from memory and never rewrite a file you did not just read — the designer may have
75
+ moved things a minute ago. Note the sha256 of every file you wrote (`pix3 check --json` prints
76
+ them under `files`; or compute it yourself).
77
+ 3. **`pix3_sync` with `expect`** = `{ "<path>": "<sha256>", … }` of the files you wrote. `ok:true`
78
+ = the editor runs exactly those bytes; its open scenes are reloaded, your script edits are
79
+ executed (`changed` lists what the rescan found).
80
+ 4. **Then verify**: `npm run check` (`pix3 check`), and in the editor `pix3_play {action:"restart"}`
81
+ or `start` → `pix3_game_run` with predicates → `pix3_errors` → `pix3_screenshot` +
82
+ `take_screenshot`.
83
+
84
+ ## 4. A not-ok sync is not a barrier
85
+
86
+ Read `reason`; nothing happened on the editor side until a sync answers `ok:true`.
87
+
88
+ | `reason` | Meaning | Do |
89
+ | --- | --- | --- |
90
+ | `gesture_in_progress` | the designer is mid-drag; nothing is written during a gesture | call again (the flush waits up to `timeoutMs` for pointerup) |
91
+ | `stale_modules` | a changed script has not been re-executed by the tab yet (`paths`) | call again |
92
+ | `expect_mismatch` | `expectMismatch` lists files whose sha256 on disk is not the one you passed: the designer or another writer changed them after your write | re-read those files, redo your edit on top of what is there, sync with the new hashes |
93
+ | `stale`, `playing: "agent"` | play is running and external changes are deferred until it stops; **an agent** started it (any agent thread) | `pix3_play {action:"restart"}` (stop → apply the deferred changes → start), or `stop`, then sync again |
94
+ | `stale`, `playing: "designer"` | the designer pressed Play; their session is theirs | do **not** stop it — wait and poll, or ask the human; `stop` and `restart` answer `not_owner` even with `force:true` |
95
+ | `external_change`, `write_failed` | the flush itself could not write (`conflicts` / `failed`) | read the listed scenes, then sync again |
96
+
97
+ `expectMismatch` is also present on an `ok:true` answer when you passed `expect` for files that
98
+ match — an empty array. Never paste a `rev` or hash into a report.
99
+
100
+ ## 5. Play ownership
101
+
102
+ `pix3_play start` records `playOwner: "agent"` in the page, not in your connection: a new thread,
103
+ a new MCP process, another agent — all may `stop` / `restart` it. A session started from the
104
+ editor's toolbar is `playOwner: "designer"`: `stop`, `restart` and `pause` refuse it with
105
+ `reason: "not_owner"`, `force` included. `pix3_play {action:"status"}` (or `pix3_status.play`)
106
+ tells you which it is before you act.
107
+
108
+ `pix3_game_run` needs a running session (`not_playing` otherwise). It steps the game far faster
109
+ than real time: a game whose `onStart` awaits something real (assets, a WASM module, a fetch)
110
+ needs `settleMs` (e.g. `2000`) first, and a readiness predicate before the one you care about.
111
+ The same holds for a `changeScene` the game starts **during** a run: the async load is starved
112
+ while the run steps frames, so the new scene never shows up within `maxFrames`. Run until the
113
+ change is requested, then a second run with `settleMs` and a readiness predicate on the next
114
+ scene (`{kind:"nodeAppeared", name}` of one of its nodes) before you assert anything in it.
115
+ Predicates (`until` / `fail` are lists, OR over each): `{kind:"nodeProperty", name, path, op, value}`
116
+ (a live node by name or id, dot path into its properties — `position.x`, `text`),
117
+ `{kind:"gameState", path, op, value}` and `{kind:"gameStateChanged", path, by?}` (the game's
118
+ `registerGameDebug` snapshot), `{kind:"nodeAppeared", name}`, `{kind:"nodeGone", name}`,
119
+ `{kind:"nodeMoved", name}`, `{kind:"newErrors", min?}`, `{kind:"frames", n}`,
120
+ `{kind:"command", name}`, `{kind:"signal", name}`; `op` is `eq`, `ne`, `gt`, `gte`, `lt`,
121
+ `lte` or `contains`.
122
+
123
+ `bot: {name}` lets a policy play while the predicates judge: `design/tests/bots/<name>.ts`
124
+ exports `{ name, tick(bot) { … } } satisfies BotPolicy`. The types are the kit's
125
+ `design/tests/bots/pix3-test-bot.d.ts` (global, no import); a starter's `pix3 check`
126
+ type-checks the policy. `tick` runs after the game's tick and what it presses lands on the next
127
+ one. A policy written or changed during play needs only `pix3_sync`, not a restart.
128
+
129
+ The answer — a `fail` or a `timeout` is still `ok: true`; `ok: false` means the run never started:
130
+
131
+ ```json
132
+ {
133
+ "ok": true,
134
+ "verdict": "PASS until[0] … (frame 42, 0.70s game) — ….",
135
+ "outcome": { "kind": "until", "channel": "until", "index": 0, "frame": 42, "gameTimeMs": 700, "detail": "…" },
136
+ "metrics": { "frames": 42, "gameTimeMs": 700, "wallMs": 95, "newErrors": 0, "framesPerSecond": 442 },
137
+ "game": { "provider": "…", "snapshot": { "score": 1 }, "changed": { "score": [0, 1] } },
138
+ "notes": [],
139
+ "timeline": []
140
+ }
141
+ ```
142
+
143
+ `outcome.kind` is `until`, `fail`, `timeout`, `error`, `precondition-already-met`,
144
+ `monkey-empty` or, in a bot run, `bot-pass`, `bot-fail`, `bot-error`, `bot-idle`. `game` is there
145
+ only when the game registers a snapshot (below): `game.snapshot` at the outcome frame,
146
+ `game.changed` = `{path: [atFrame0, atOutcome]}` for every scalar that moved.
147
+
148
+ **Judging a run** — a clean compile and a clean `pix3_errors` say nothing about whether the change
149
+ works; a run with a stated success condition does:
150
+
151
+ - **Read `verdict` first**: it is the one line that already decided the run.
152
+ - **Assert the change, not the value.** A predicate that is already true at frame 0 ends the run
153
+ with `PRECONDITION ALREADY MET` and proves nothing: assert `gameStateChanged` on `score`, not
154
+ `gameState score gte 0`; restart play to get a clean board.
155
+ - **Put a crash net in `fail`**: `{kind:"newErrors"}`. A `fail` beats an `until` on the same frame.
156
+ - **Count frames, not wall time** (`maxFrames`, `{kind:"frames", n}`): the same test then means the
157
+ same thing on a slow machine.
158
+ - **Make game state readable.** `gameState` / `gameStateChanged` read the snapshot the game
159
+ registers with `registerGameDebug({ name, snapshot })` (from `@pix3/runtime`); without one the
160
+ verdict says there is no provider. Keep it to the fields that decide a run (score, lives, phase,
161
+ wave) and add the field of every mechanic you add — state nothing reports is state nothing can
162
+ verify, and then only screenshots are left. `pix3 smoke` prints the same snapshot.
163
+ - **Transient effects** (a hover scale, a flash, a punch, a fade) are back at rest by the time a
164
+ separate `take_screenshot` runs — judge them by state: a `nodeProperty` predicate on `scale.x`
165
+ or `opacity` inside the run, not a picture after it. Screenshots are for layout, colour and
166
+ placement.
167
+ - **A black 3D screen** is usually a scene with no light or no camera, and the run's `notes` say
168
+ so (`SCENE NOT RENDERABLE — …`); when they do not, suspect a camera that looks away from the
169
+ content. The editor viewport lights the scene with fallback lights the running game does not
170
+ have, so the viewport is no evidence either way.
171
+
172
+ ## 6. Before a build
173
+
174
+ `npm run build` flushes the editor itself (and fails with `E_EDITOR_UNSYNCED` when the editor
175
+ cannot write in time), so a successful `pix3_sync` right before it is the honest sequence: sync →
176
+ `npm run build` → check `dist/`. `pix3 check` and `pix3 smoke` flush the editor the same way
177
+ (`--no-sync` reads the disk as it is).
178
+
179
+ ## 7. Inline fallback (no `list_3p_developer_tools`, or it answers an empty list)
180
+
181
+ The flag `--categoryExperimentalThirdParty=true` may be missing from the MCP config, or the
182
+ category may have moved in a chrome-devtools-mcp release. The same tools are on
183
+ `window.__PIX3_DEBUG__`; call them through `evaluate_script` with **`waitForStableDom: false`**
184
+ (otherwise every call waits up to 3 s for a DOM that never settles) and the page's `pageId`:
185
+
186
+ ```js
187
+ async () => await window.__PIX3_DEBUG__.call('pix3_sync', { timeoutMs: 15000 })
188
+ ```
189
+
190
+ Short forms exist for the common calls: `status()`, `sync({expect, timeoutMs})`, `scene(depth)`,
191
+ `node(id)`, `find(text)`, `screen(id)`, `play.start()` / `play.stop()` / `play.restart()` /
192
+ `play.status()`, `errors()`. One tool per `evaluate_script` call: a refusal of one must not take
193
+ the others with it. The answers are the same objects the 3p path returns.
194
+
195
+ ## 8. Keepalive
196
+
197
+ The tab is in the background while you work, and Chrome would throttle it. `pix3 editor` starts
198
+ Chrome with throttling off, and every bridge call keeps the editor's own loops running for 60 s
199
+ (a play session you started, until it stops). Nothing to do on your side; a tab that was opened
200
+ by hand in another Chrome may still pause when hidden.
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  name: pix3-nodes
3
- description: Compact property reference for the Pix3 2D node types used by the recipes — Group2D, ColorRect2D, Sprite2D, Label2D, Button2D, Bar2D, CanvasLayer2D, PostProcess — plus the Node2D base properties, anchor layout and paint order; the full per-node reference (every 2D and 3D node) is reference.md beside it. Use when adding a node to a .pix3scene, choosing which node type to use, or checking a property name/type before writing it.
3
+ description: Compact property reference for the Pix3 2D node types games use most — Group2D, ColorRect2D, Sprite2D, Label2D, Button2D, Bar2D, CanvasLayer2D, PostProcess — plus the Node2D base properties, anchor layout and paint order; the full per-node reference (every 2D and 3D node) is reference.md beside it. Use when adding a node to a .pix3scene, choosing which node type to use, or checking a property name/type before writing it.
4
4
  ---
5
5
 
6
- <!-- Pix3 agent kit 1.6.4 -->
6
+ <!-- Pix3 agent kit 2.0.0-alpha.0 -->
7
7
  # 2D nodes — compact reference
8
8
 
9
9
  Property names below are the exact YAML keys under `properties:`. A misspelled key is kept
@@ -41,7 +41,7 @@ keys — read their section in `reference.md` first. `Layout2D` is removed and f
41
41
  | `zIndex` | int | 0 | -4096..4096; higher draws on top; ties = tree order |
42
42
  | `zAsRelative` | bool | true | Add to the parent's z instead of absolute |
43
43
  | `blendMode` | enum | normal | `normal`, `additive` (glow/VFX), `multiply`, `subtract`; not inherited |
44
- | `layout` | block | — | `{ enabled, horizontalAlign: left/center/right/stretch, verticalAlign: top/center/bottom/stretch }` |
44
+ | `layout` | block | — | `{ enabled, horizontalAlign: left/center/right/stretch, verticalAlign: top/center/bottom/stretch, left, right, top, bottom }` — the margins (px from the parent's edge) place an anchored axis; its `position` component is then `0`, and `stretch` derives the size (`pix3-scene-format`) |
45
45
  | `flow` | block | — | `{ enabled, direction: vertical/horizontal, gap, paddingX, paddingY, align: start/center/end, autoSize }` |
46
46
 
47
47
  Paint order = tree order (later sibling / deeper node on top) unless `zIndex` says otherwise.
@@ -50,7 +50,7 @@ Shader `effects` exist only on `Sprite2D`, `AnimatedSprite2D` and `Button2D`.
50
50
  ## Group2D
51
51
 
52
52
  Sized container; draws nothing. Use it as the scene root (sized to `viewportBaseSize` from
53
- `pix3project.yaml` — `width: 1080, height: 1920` in the recipes — `layout` stretch/stretch) and for any panel whose children anchor or flow against it.
53
+ `pix3project.yaml` — e.g. `width: 1080, height: 1920` for a portrait game — `layout` stretch/stretch) and for any panel whose children anchor or flow against it.
54
54
 
55
55
  | Key | Type | Default |
56
56
  | --- | --- | --- |
@@ -78,7 +78,7 @@ The only untextured 2D fill. Build the game from these first, swap to sprites la
78
78
  | `aspectRatioLocked` | bool | false | Keep the texture's aspect while resizing |
79
79
  | `effects` | list | — | `[{ type: core:tint, params: { color: "#hex", amount: 1 } }]` — how a near-white placeholder gets its colour |
80
80
 
81
- There is no tint property: colour a sprite with a `core:tint` effect. Recipe placeholders are
81
+ There is no tint property: colour a sprite with a `core:tint` effect. Placeholders are
82
82
  near-white `sprites/ph-*.png` + `effects: [{ type: core:tint, params: { color, amount: 1 } }]`.
83
83
 
84
84
  ### An SVG you write as a sprite
@@ -111,6 +111,7 @@ xmlns), `E_SVG_NO_SIZE`, `W_SVG_VIEWBOX_ONLY`, `W_SVG_EXTERNAL_REF`.
111
111
  | Key | Type | Default | Notes |
112
112
  | --- | --- | --- | --- |
113
113
  | `label` | string | "" | The text; `\n` breaks lines. Never only emoji |
114
+ | `labelKey` | string | "" | A key of the locale tables (`locales/<id>.json` `strings`); when set it wins over `label`, and a key no table has shows as the key itself. Any UI control has it (`Button2D` too) — `project-files.md` → "Add or remove a locale" |
114
115
  | `labelFontSize` | number | 16 | px |
115
116
  | `labelColor` | colour | "#ffffff" | |
116
117
  | `labelFontFamily` | string | Arial | A family the project ships in `fonts/`, else a system face |
@@ -139,10 +140,7 @@ Scripts: `label.setText('SCORE 5')`.
139
140
  | `sliceBorderLeft/Right/Top/Bottom` | number | 0 | Nine-slice insets in source pixels |
140
141
  | `effects` | list | — | Shader effects on the skin |
141
142
 
142
- Signals: `pressed` (finger/button went down inside it), `released`, `click` (down **and** up
143
- inside it — a completed tap; sliding off cancels it), `pointerdown`, `pointerup`. The recipes
144
- wire `pressed` for an instant response; use `click` where an accidental touch must be
145
- cancellable (menus, purchases). `button.connect('click', this, handler)`.
143
+ Signals (`pressed` for game buttons, `click` for menus and purchases): `pix3-scripts` → "Signals".
146
144
 
147
145
  ## Bar2D
148
146
 
@@ -152,7 +150,7 @@ cancellable (menus, purchases). `button.connect('click', this, handler)`.
152
150
  | `minValue` / `maxValue` / `value` | number | 0 / 100 / 100 | Fill = value within the range (clamped) |
153
151
  | `barColor` | colour | "#ff4444" | Fill colour |
154
152
  | `backBackgroundColor` | colour | "#333333" | Trough colour |
155
- | `showBorder` / `borderColor` / `borderWidth` | bool / colour / px | true / "#000000" / 2 | The recipes set `showBorder: false` |
153
+ | `showBorder` / `borderColor` / `borderWidth` | bool / colour / px | true / "#000000" / 2 | Game skins set `showBorder: false` |
156
154
  | `textureTrough` / `textureFill` | texture | — | Skin sprites |
157
155
  | `sliceBorderLeft/Right/Top/Bottom` | number | 0 | Nine-slice insets of the skins |
158
156
 
@@ -192,19 +190,19 @@ screen blooms — **raise** `bloomThreshold` (0.85–0.95) so only the accents g
192
190
  labelColor: "#f5ae39"
193
191
  labelAlign: right
194
192
  transform:
195
- position: [340, 790]
193
+ position: [0, 0] # both axes anchored: the margins place it
196
194
  scale: [1, 1]
197
195
  rotation: 0
198
196
  layout:
199
197
  enabled: true
200
198
  horizontalAlign: right
201
199
  verticalAlign: top
200
+ right: 40 # px from the parent's right edge to the label's right edge
201
+ top: 60
202
202
  children: []
203
203
  ```
204
204
 
205
205
  ## Known gaps
206
206
 
207
- - On a **cloud** project (opened from the Pix3 server, not a folder or `pix3 serve`) an `.svg`
208
- sprite renders on first load and then goes blank: the local cache hands SVGs back as
209
- `text/plain`, which no browser decodes as an image. Folder and `pix3 serve` projects are fine;
210
- on cloud, use a PNG.
207
+ - An `.svg` sprite must be served as `image/svg+xml`: a host that hands it back as `text/plain`
208
+ draws nothing. The Vite dev server and the single-file build are fine.
@@ -1,4 +1,4 @@
1
- <!-- Pix3 agent kit 1.6.4 — generated from docs/node-types-reference.md. Do not edit: pix3 kit --update regenerates it. -->
1
+ <!-- Pix3 agent kit 2.0.0-alpha.0 — generated from docs/node-types-reference.md. Do not edit: pix3 kit --update regenerates it. -->
2
2
  # Pix3 node reference
3
3
 
4
4
  Every node type the loader knows, with its properties. **Grep `### <NodeName>`** for one node
@@ -9,47 +9,47 @@ Source paths quoted here (`src/…`, `packages/…`) are files of the Pix3 engin
9
9
 
10
10
  ## Quick reference
11
11
 
12
- | Node Type | Key Properties |
13
- | -------------------- | ---------------------------------------------------------------------------------------------------- |
14
- | NodeBase | id, name, type, visible, locked |
15
- | Node2D | position (Vector2), rotation, scale (Vector2), opacity, blendMode, zIndex |
16
- | Node3D | position (Vector3), rotation (Euler), scale (Vector3) |
17
- | Sprite2D | texture, width, height, anchor, aspectRatioLocked |
18
- | ColorRect2D | width, height, color (the only untextured 2D fill) |
19
- | TiledSprite2D | texture, width, height, patchMode, sliceBorderLeft/Right/Top/Bottom, drawCenter (nine-slice) |
20
- | AnimatedSprite2D | animationResourcePath, currentClip, isPlaying, freeOnFinish, width, height, sizeMode |
21
- | Group2D | width, height (+ flow\* / anchor layout — the 2D container) |
22
- | ScrollContainer2D | width, height, scrollY, dragScrollEnabled, inertiaDamping, showScrollbar |
23
- | SpineSkeleton2D | skeletonPath, atlasPath, animation, loop, skin, timeScale, defaultMix (optional Spine runtime) |
24
- | Camera2D | priority, zoom, offset, followTargetId, limitsEnabled, shakeAmplitude |
25
- | CanvasLayer2D | width, height (fixed HUD overlay; renders after post) |
26
- | Camera3D | projection, fov, near, far |
27
- | VirtualCamera3D | priority, followTargetId, lookAtTargetId, blendDuration, fov |
28
- | GeometryMesh | geometry, size, material, castShadow, receiveShadow |
29
- | MeshInstance | src |
30
- | Sprite3D | texture, width, height (world units), billboard, billboardRoll, opacity |
31
- | AnimatedSprite3D | width, height, fps, playing, loop, freeOnFinish, billboard (default true) |
32
- | InstancedMesh3D | maxInstances, enablePerInstanceColor, material.type/color (bulk write\*/flush from scripts) |
33
- | DirectionalLightNode | color, intensity, castShadow |
34
- | AmbientLightNode | color, intensity (flat fill, no shadows) |
35
- | HemisphereLightNode | skyColor, groundColor, intensity |
36
- | PointLightNode | color, intensity, distance, decay |
37
- | SpotLightNode | color, intensity, distance, angle, penumbra |
38
- | Button2D | width, height, backgroundColor, buttonAction, textureNormal/Hover/Pressed/Disabled, sliceBorder\* |
39
- | Slider2D | width, minValue, maxValue, value, textureTrack/Fill/Thumb, sliceBorder\* |
40
- | Joystick2D | enabled, radius, floating, axisHorizontal, axisVertical |
41
- | Checkbox2D | size, checked, textureBox, textureBoxChecked, textureMark |
42
- | Bar2D | width, value, minValue, maxValue, barColor, backBackgroundColor, textureTrough/Fill, sliceBorder\* |
43
- | InventorySlot2D | width, height, quantity, showQuantity, backdropColor, selectionColor |
44
- | AudioPlayer | audioTrack, autoplay, loop, volume, bus, pitchVariation, volumeVariation |
45
- | PostProcess | affect2D, bloom*, vignette*, chromaticAberration*, aoMode, ssao*, lut\* |
46
- | Group | NodeBase only — an organisational container |
12
+ | Node Type | Key Properties |
13
+ | -------------------- | -------------------------------------------------------------------------------------------------- |
14
+ | NodeBase | id, name, type, visible, locked |
15
+ | Node2D | position (Vector2), rotation, scale (Vector2), opacity, blendMode, zIndex |
16
+ | Node3D | position (Vector3), rotation (Euler), scale (Vector3) |
17
+ | Sprite2D | texture, width, height, anchor, aspectRatioLocked |
18
+ | ColorRect2D | width, height, color (the only untextured 2D fill) |
19
+ | TiledSprite2D | texture, width, height, patchMode, sliceBorderLeft/Right/Top/Bottom, drawCenter (nine-slice) |
20
+ | AnimatedSprite2D | animationResourcePath, currentClip, isPlaying, freeOnFinish, width, height, sizeMode |
21
+ | Group2D | width, height (+ flow\* / anchor layout — the 2D container) |
22
+ | ScrollContainer2D | width, height, scrollY, dragScrollEnabled, inertiaDamping, showScrollbar |
23
+ | SpineSkeleton2D | skeletonPath, atlasPath, animation, loop, skin, timeScale, defaultMix (optional Spine runtime) |
24
+ | Camera2D | priority, zoom, offset, followTargetId, limitsEnabled, shakeAmplitude |
25
+ | CanvasLayer2D | width, height (fixed HUD overlay; renders after post) |
26
+ | Camera3D | projection, fov, near, far |
27
+ | VirtualCamera3D | priority, followTargetId, lookAtTargetId, blendDuration, fov |
28
+ | GeometryMesh | geometry, size, material, castShadow, receiveShadow |
29
+ | MeshInstance | src |
30
+ | Sprite3D | texture, width, height (world units), billboard, billboardRoll, opacity |
31
+ | AnimatedSprite3D | width, height, fps, playing, loop, freeOnFinish, billboard (default true) |
32
+ | InstancedMesh3D | maxInstances, enablePerInstanceColor, material.type/color (bulk write\*/flush from scripts) |
33
+ | DirectionalLightNode | color, intensity, castShadow |
34
+ | AmbientLightNode | color, intensity (flat fill, no shadows) |
35
+ | HemisphereLightNode | skyColor, groundColor, intensity |
36
+ | PointLightNode | color, intensity, distance, decay |
37
+ | SpotLightNode | color, intensity, distance, angle, penumbra |
38
+ | Button2D | width, height, backgroundColor, buttonAction, textureNormal/Hover/Pressed/Disabled, sliceBorder\* |
39
+ | Slider2D | width, minValue, maxValue, value, textureTrack/Fill/Thumb, sliceBorder\* |
40
+ | Joystick2D | enabled, radius, floating, axisHorizontal, axisVertical |
41
+ | Checkbox2D | size, checked, textureBox, textureBoxChecked, textureMark |
42
+ | Bar2D | width, value, minValue, maxValue, barColor, backBackgroundColor, textureTrough/Fill, sliceBorder\* |
43
+ | InventorySlot2D | width, height, quantity, showQuantity, backdropColor, selectionColor |
44
+ | AudioPlayer | audioTrack, autoplay, loop, volume, bus, pitchVariation, volumeVariation |
45
+ | PostProcess | affect2D, bloom*, vignette*, chromaticAberration*, aoMode, ssao*, lut\* |
46
+ | Group | NodeBase only — an organisational container |
47
47
 
48
48
  ## Choosing the right node
49
49
 
50
50
  #### For 2D Projects:
51
51
 
52
- 1. **Start with a Group2D** as your scene root (the game viewport size comes from project settings; use anchor layout for responsiveness)
52
+ 1. **Start with a Group2D** as your scene root (the game viewport size is `viewportBaseSize` in `pix3project.yaml`; use anchor layout for responsiveness)
53
53
  2. Add **Sprite2D** for images and graphics
54
54
  3. Before the art exists, build with **ColorRect2D** — it is the only solid-colour 2D primitive, and
55
55
  a game made of coloured rects is playable a day before a game waiting on sprites
@@ -81,21 +81,25 @@ The base class for all 2D scene nodes. Use this for simple grouping or as a cont
81
81
 
82
82
  **Properties:**
83
83
 
84
- | Property | Type | Default | Description |
85
- | --------------------------------- | ------- | -------- | ----------------------------------------------------------------------------------------------------------------------------- |
86
- | `position` | Vector2 | (0, 0) | X and Y coordinates |
87
- | `rotation` | number | 0 | Rotation in degrees |
88
- | `scale` | Vector2 | (1, 1) | X and Y scale factors |
89
- | `opacity` | number | 1 | Local opacity multiplier, inherited by child 2D nodes |
90
- | `blendMode` | enum | normal | How the node's own visuals combine with the backdrop: `normal`, `additive`, `multiply`, `subtract`. NOT inherited by children |
91
- | `zIndex` | number | 0 | Draw-order override, `-4096..4096` (integer). Higher draws on top |
92
- | `zAsRelative` | boolean | true | Add `zIndex` to the parent's effective z instead of treating it as absolute |
93
- | `flow.enabled` | boolean | false | Stack this container's children in tree order instead of leaving them where they were authored |
94
- | `flow.direction` | enum | vertical | `vertical` (a column) or `horizontal` (a row) |
95
- | `flow.gap` | number | 0 | Space between two children, px |
96
- | `flow.paddingX` / `flow.paddingY` | number | 0 | Inset from the container's edges |
97
- | `flow.align` | enum | start | Cross-axis placement of each child: `start`, `center`, `end`. Inspector label: **Cross Axis** |
98
- | `flow.autoSize` | boolean | false | Grow the container along the flow axis so the last child fits |
84
+ | Property | Type | Default | Description |
85
+ | --------------------------------- | ------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
86
+ | `position` | Vector2 | (0, 0) | X and Y coordinates |
87
+ | `rotation` | number | 0 | Rotation in degrees |
88
+ | `scale` | Vector2 | (1, 1) | X and Y scale factors |
89
+ | `opacity` | number | 1 | Local opacity multiplier, inherited by child 2D nodes |
90
+ | `blendMode` | enum | normal | How the node's own visuals combine with the backdrop: `normal`, `additive`, `multiply`, `subtract`. NOT inherited by children |
91
+ | `zIndex` | number | 0 | Draw-order override, `-4096..4096` (integer). Higher draws on top |
92
+ | `zAsRelative` | boolean | true | Add `zIndex` to the parent's effective z instead of treating it as absolute |
93
+ | `layout.enabled` | boolean | false | Anchor this node to its parent's edges (inspector: `layoutEnabled`, section Anchors) |
94
+ | `layout.horizontalAlign` | enum | center | `left`, `center`, `right`, `stretch` |
95
+ | `layout.verticalAlign` | enum | center | `top`, `center`, `bottom`, `stretch` |
96
+ | `layout.left/right/top/bottom` | number | — | Margins of the anchored sides, px from the parent's edge to the node's (inspector: `layoutLeft` …). They place the node on that axis; its `position` component there is written as `0`, and under `stretch` the size is derived (a square's `size`/`radius`: the side is the stretched span). Omitted in a file → derived once from the rect (spec §7.2.3) |
97
+ | `flow.enabled` | boolean | false | Stack this container's children in tree order instead of leaving them where they were authored |
98
+ | `flow.direction` | enum | vertical | `vertical` (a column) or `horizontal` (a row) |
99
+ | `flow.gap` | number | 0 | Space between two children, px |
100
+ | `flow.paddingX` / `flow.paddingY` | number | 0 | Inset from the container's edges |
101
+ | `flow.align` | enum | start | Cross-axis placement of each child: `start`, `center`, `end`. Inspector label: **Cross Axis** |
102
+ | `flow.autoSize` | boolean | false | Grow the container along the flow axis so the last child fits |
99
103
 
100
104
  **Usage Notes:**
101
105
 
@@ -111,9 +115,9 @@ The base class for all 2D scene nodes. Use this for simple grouping or as a cont
111
115
  perpendicular placement (`flow.align`), and **Align** / **Distribute** are the
112
116
  one-shot operations on a selection (the viewport strip and `Node ▸ Align ▸`).
113
117
  Because Anchors and Flow are orthogonal — a panel can stretch to its parent
114
- *and* stack its children — the inspector shows them as two sub-blocks of one
118
+ _and_ stack its children — the inspector shows them as two sub-blocks of one
115
119
  **Layout** section, each with its own switch, rather than as one mode selector.
116
- A child of a flow container sees only its *driven* Position axis disabled:
120
+ A child of a flow container sees only its _driven_ Position axis disabled:
117
121
  the main axis always, the cross axis only when its own Anchors are off.
118
122
  - Cannot have children by default (set `isContainer = true` to enable)
119
123
  - Transforms affect all children in local space
@@ -148,12 +152,12 @@ mistake it exists to prevent: build the whole game out of coloured rects, then s
148
152
 
149
153
  **Properties** (plus everything on Node2D):
150
154
 
151
- | Property | Type | Default | Description |
152
- | -------- | ------ | ------- | ------------------------------- |
153
- | `width` | number | 100 | Width in design pixels |
154
- | `height` | number | 100 | Height in design pixels |
155
- | `color` | color | #ffffff | Fill colour (authored sRGB hex) |
156
- | `blocksPointerInput` | boolean | false | Block hover and presses on UI controls behind this visible rectangle |
155
+ | Property | Type | Default | Description |
156
+ | -------------------- | ------- | ------- | -------------------------------------------------------------------- |
157
+ | `width` | number | 100 | Width in design pixels |
158
+ | `height` | number | 100 | Height in design pixels |
159
+ | `color` | color | #ffffff | Fill colour (authored sRGB hex) |
160
+ | `blocksPointerInput` | boolean | false | Block hover and presses on UI controls behind this visible rectangle |
157
161
 
158
162
  **Usage Notes:**
159
163
 
@@ -194,7 +198,7 @@ A 2D image display node. Renders a textured quad that always faces the camera.
194
198
 
195
199
  A texture mapped onto a rectangle of arbitrary size by one of five fill algorithms — the node for
196
200
  **UI panels, windows, bars and repeating backgrounds**, where `Sprite2D`'s plain stretch would smear
197
- the corners. This is the engine's nine-slice; UI Kit Forge emits its slice borders directly.
201
+ the corners. This is the engine's nine-slice.
198
202
 
199
203
  **Type String:** `TiledSprite2D`
200
204
 
@@ -227,7 +231,8 @@ the corners. This is the engine's nine-slice; UI Kit Forge emits its slice borde
227
231
  ### AnimatedSprite2D
228
232
 
229
233
  Flipbook sprite animation driven by a `.pix3anim` resource — a set of named clips over a
230
- spritesheet or a list of frame images. Authored in the editor's Sprite Editor. For **skeletal**
234
+ spritesheet or a list of frame images, written as a file (the kit's `pix3-scene-format/pix3anim.md`;
235
+ `pix3 character-compile` for a character with variants). For **skeletal**
231
236
  animation use SpineSkeleton2D instead; for a property/timeline animation over any
232
237
  node, use the `core:AnimationPlayer` behaviour.
233
238
 
@@ -371,12 +376,12 @@ behaves.
371
376
  | `animation-looped` | `(name, trackIndex)` | A looping animation completed a loop |
372
377
  | `spine-event` | `(name, { int, float, string }, trackIndex)` | A keyed animation event fired |
373
378
 
374
- **Export:** the HTML / zip playable export bundles the Spine runtime _statically_
375
- into `index.html`, but only when a scene actually places a `SpineSkeleton2D` — a
376
- dynamic import would become a chunk that a single-file export can never fetch.
379
+ **Build:** `vite build` bundles the Spine runtime _statically_ (through
380
+ `virtual:pix3/spine`), but only when the project uses a `SpineSkeleton2D` — a
381
+ dynamic import would become a chunk that a single-file build can never fetch.
377
382
  Skeleton, atlas and the atlas' page images ship with it; projects without a
378
- skeleton are unaffected in size. The generated npm project gets the dependency
379
- added to its `package.json` on the same condition.
383
+ skeleton are unaffected in size. The project lists `@esotericsoftware/spine-threejs`
384
+ in its own dependencies (the starters do not).
380
385
 
381
386
  **Usage Notes:**
382
387
 
@@ -991,7 +996,7 @@ A `THREE.InstancedMesh` wrapper for rendering many copies of one geometry/materi
991
996
  | `castShadow` | boolean | — | Forwarded to the underlying mesh |
992
997
  | `receiveShadow` | boolean | — | Forwarded to the underlying mesh |
993
998
  | `frustumCulled` | boolean | — | Forwarded to the underlying mesh |
994
- | `visibleInstanceCount` | number | — | How many instances currently draw (read-only display; not saved) |
999
+ | `visibleInstanceCount` | number | — | How many instances currently draw (read-only display; not saved) |
995
1000
  | `material.type` | enum | `standard` | Material family — `standard` (PBR) / `lambert` (mobile default) / `basic` (unlit); inspector: **Material Type** |
996
1001
  | `material.color` | color | `#ffffff` | Colour every instance shares; a per-instance colour multiplies it |
997
1002
  | `material.roughness` / `material.metalness` | number | 0.35 / 0.25 | `standard` only; dropped from the file for the other families |
@@ -1009,7 +1014,7 @@ A `THREE.InstancedMesh` wrapper for rendering many copies of one geometry/materi
1009
1014
  - **Instance buffers are NOT serialized** — only the node-level config above is saved. Repopulate buffers at runtime.
1010
1015
  - The `material` block IS serialized, and is what makes an instanced mesh authorable: before it existed the loader built no material at all, so a scene-authored instanced mesh always rendered with a shared white PBR default — unreachable from the inspector and past the project's mobile material policy. A `material` handed to the constructor in code still wins over the authored block.
1011
1016
  - Raycasts against an instanced mesh return the hit `instanceId`.
1012
- - Backed by `ECSService` for project-managed ECS worlds; runtime lives in `packages/pix3-runtime/src/nodes/3D/InstancedMesh3D.ts` + `core/ECSService.ts`.
1017
+ - Backed by `ECSService` for project-managed ECS worlds; runtime lives in `packages/runtime/src/nodes/3D/InstancedMesh3D.ts` + `core/ECSService.ts`.
1013
1018
 
1014
1019
  ---
1015
1020
 
@@ -1280,8 +1285,9 @@ and builds a composer from it; with no such node the plain two-pass path runs an
1280
1285
  - It has no transform: the properties sit flat in `properties`, and position/rotation/scale do not
1281
1286
  apply.
1282
1287
  - The whole stack is one lazily-created composer. Every effect off = no composer at all.
1283
- - In a single-file playable export, `postprocessing` is pulled in through a generated
1284
- `virtual:runtime-*` module — using this node is fine for an export, it just adds weight.
1288
+ - In a single-file build, `postprocessing` is pulled in through the generated
1289
+ `virtual:pix3/postprocessing` module (a stub when no scene has a `PostProcess`) — using this
1290
+ node is fine for a build, it just adds weight.
1285
1291
 
1286
1292
  ## Audio
1287
1293