incanto 0.7.1 → 0.9.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 (50) hide show
  1. package/bin/incanto-check.mjs +6 -4
  2. package/dist/2d.d.ts +91 -3
  3. package/dist/2d.js +4 -4
  4. package/dist/3d.d.ts +43 -4
  5. package/dist/3d.js +4 -4
  6. package/dist/{audio-player-C3bH_eZ5.d.ts → audio-player-Dyjg5k92.d.ts} +1 -1
  7. package/dist/audit-C6rMyict.js +58 -0
  8. package/dist/{behavior-q3cejJgs.d.ts → behavior-Bod1AyJS.d.ts} +31 -1
  9. package/dist/{create-game-rFulaS3s.js → create-game-Bydey3CZ.js} +4 -5
  10. package/dist/{create-game-DuDkqnjl.js → create-game-C7Zsqbko.js} +4 -5
  11. package/dist/debug.d.ts +1 -1
  12. package/dist/{errors-BMFaY68Q.d.ts → errors-1dXlIwoR.d.ts} +7 -1
  13. package/dist/{gameplay-CDFgSG6z.js → gameplay-DPMgZk9W.js} +108 -1
  14. package/dist/gameplay.d.ts +44 -3
  15. package/dist/gameplay.js +2 -2
  16. package/dist/index.d.ts +151 -9
  17. package/dist/index.js +189 -4
  18. package/dist/{loader-DnLMMRy8.d.ts → loader-BcUDfNHn.d.ts} +1 -1
  19. package/dist/net.d.ts +46 -2
  20. package/dist/net.js +54 -2
  21. package/dist/particle-sim-CyUU7HVU.js +281 -0
  22. package/dist/{physics-2d-CZM5Y90X.js → physics-2d-DweTURFt.js} +45 -4
  23. package/dist/{physics-3d-DT5e8izo.js → physics-3d-Clv1uFzk.js} +1 -1
  24. package/dist/react.d.ts +1 -1
  25. package/dist/react.js +1 -1
  26. package/dist/{register-Cl3pAxX-.js → register-BD6zgrv_.js} +254 -4
  27. package/dist/{register-C35HDZpm.js → register-Cwc-yCYx.js} +1 -1
  28. package/dist/{particle-sim-m3CdTGSl.js → register-DJZXxwAn.js} +1178 -278
  29. package/dist/{register-CpXcMiEk.js → register-iUPtts7T.js} +141 -4
  30. package/dist/test.d.ts +4 -10
  31. package/dist/test.js +11 -16
  32. package/editor/assets/{agent8-N4bwVH7C.js → agent8-B0ZGx-N1.js} +1 -1
  33. package/editor/assets/index-BLzp8moy.js +7417 -0
  34. package/editor/assets/{index-DF3tMeKJ.css → index-D8QvwvOm.css} +1 -1
  35. package/editor/index.html +2 -2
  36. package/package.json +1 -1
  37. package/schemas/scene.schema.json +427 -0
  38. package/skills/incanto-3d-character.md +14 -0
  39. package/skills/incanto-audio.md +23 -0
  40. package/skills/incanto-building-2d-games.md +31 -0
  41. package/skills/incanto-building-3d-games.md +21 -0
  42. package/skills/incanto-editor.md +13 -0
  43. package/skills/incanto-gameplay-behaviors.md +28 -0
  44. package/skills/incanto-hud.md +24 -0
  45. package/skills/incanto-multiplayer.md +27 -0
  46. package/skills/incanto-node-reference.md +73 -0
  47. package/skills/incanto-physics-and-input.md +9 -0
  48. package/skills/incanto-verifying-your-game.md +31 -0
  49. package/dist/register-Dl_ixIJe.js +0 -834
  50. package/editor/assets/index-CXFNanuR.js +0 -7417
@@ -1 +1 @@
1
- :root{--bg-0:#0b0d14;--bg-1:#10131d;--bg-2:#161a27;--bg-3:#1d2231;--line:#262c3e;--line-strong:#343c54;--text:#e2e6f0;--text-dim:#9aa3bd;--text-faint:#5d6680;--accent:#6ee7dc;--accent-deep:#14b8a6;--violet:#a78bfa;--amber:#fbbf24;--rose:#fb7185;--green:#86efac;--shadow:0 12px 40px #0000008c;--r-sm:6px;--r-md:10px;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}*{box-sizing:border-box}html,body{background:var(--bg-0);height:100%;color:var(--text);-webkit-font-smoothing:antialiased;margin:0;font:13px/1.55 Inter,-apple-system,Segoe UI,system-ui,sans-serif;overflow:hidden}code,textarea,.mono{font-family:ui-monospace,SF Mono,Menlo,monospace}#topbar{background:linear-gradient(to bottom, var(--bg-2), var(--bg-1));border-bottom:1px solid var(--line);align-items:center;gap:10px;height:46px;padding:0 14px;display:flex}.brand{align-items:baseline;gap:7px;margin-right:6px;display:flex}.brand-mark{background:linear-gradient(135deg, var(--accent), var(--accent-deep));color:#07211d;border-radius:6px;align-self:center;place-items:center;width:22px;height:22px;font-size:11px;font-weight:800;display:inline-grid}.brand strong{letter-spacing:.2px;font-weight:700}.brand-sub{color:var(--text-faint);font-size:12px}#file-chip{border:1px solid var(--line);background:var(--bg-1);color:var(--text-dim);border-radius:999px;align-items:center;gap:6px;max-width:320px;padding:4px 10px;font-size:12px;display:flex}#file-path{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.pill{background:var(--bg-3);color:var(--text-faint);border-radius:999px;padding:2px 9px;font-family:ui-monospace,Menlo,monospace;font-size:11px}.spacer{flex:1}button{font:inherit;border-radius:var(--r-sm);color:var(--text);cursor:pointer;background:0 0;border:1px solid #0000;align-items:center;gap:6px;padding:6px 12px;font-size:12.5px;font-weight:600;transition:background .12s,border-color .12s,color .12s,opacity .12s;display:inline-flex}button:disabled{opacity:.35;cursor:default}button.ghost{border-color:var(--line);background:var(--bg-1);color:var(--text-dim)}button.ghost:not(:disabled):hover{border-color:var(--line-strong);color:var(--text)}button.ghost.danger:not(:disabled):hover{border-color:var(--rose);color:var(--rose)}button.primary{background:linear-gradient(135deg, var(--accent), var(--accent-deep));color:#06201c}button.primary:not(:disabled):hover{filter:brightness(1.1)}button.play{border-color:var(--green);color:var(--green);background:#86efac14}button.play:not(:disabled):hover{background:#86efac29}button.play.stop{border-color:var(--rose);color:var(--rose);background:#fb71851a}input,select,textarea{font:inherit;color:var(--text);background:var(--bg-0);border:1px solid var(--line);border-radius:var(--r-sm);min-width:0;padding:6px 9px;font-size:12.5px;transition:border-color .12s}select{appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%239aa3bd' stroke-width='2.4'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");background-position:right 9px center;background-repeat:no-repeat;background-size:12px;padding-right:30px}input:focus,select:focus,textarea:focus{border-color:var(--accent-deep);outline:none}textarea{resize:vertical;font-size:12px;line-height:1.5}textarea.invalid{border-color:var(--rose);background:#fb71850d}#error-banner{color:var(--rose);white-space:pre-wrap;background:#fb71851a;border-bottom:1px solid #fb718559;max-height:110px;padding:8px 14px;font-family:ui-monospace,Menlo,monospace;font-size:12px;overflow:auto}#play-notice{color:var(--green);background:#86efac14;border-bottom:1px solid #86efac40;padding:7px 14px;font-size:12px}main{height:calc(100% - 46px);display:flex}#tree-pane{background:var(--bg-1);border-right:1px solid var(--line);flex-direction:column;width:256px;display:flex}#inspector-pane{background:var(--bg-1);border-left:1px solid var(--line);width:336px;overflow-y:auto}#viewport-pane{background:radial-gradient(1200px 500px at 50% -10%, #6ee7dc0d, transparent), var(--bg-0);flex:1;position:relative;overflow:hidden}#viewport,#overlay,#play-canvas{width:100%;height:100%;position:absolute;inset:0}#overlay{cursor:crosshair}#play-canvas{z-index:3}#hints-dock{z-index:4;align-items:center;gap:8px;display:flex;position:absolute;bottom:12px;right:16px}#hints-toggle{border:1px solid var(--line-strong);width:40px;height:40px;color:var(--text-dim);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);background:#10131de0;border-radius:50%;flex:none;justify-content:center;align-items:center;display:inline-flex}#hints-toggle:hover{color:var(--accent);border-color:var(--accent-deep)}#hints-dock.open #hints-toggle{color:var(--accent)}.hints{opacity:0;white-space:nowrap;max-width:0;color:var(--text-faint);pointer-events:none;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);background:#10131dd9;border:1px solid #0000;border-radius:999px;gap:14px;padding:5px 0;font-size:11px;transition:max-width .22s,opacity .18s,padding .22s;display:flex;overflow:hidden}.hints b{color:var(--text-dim);font-weight:600}.pane-title{letter-spacing:1.6px;text-transform:uppercase;color:var(--text-faint);border-bottom:1px solid var(--line);padding:9px 14px 7px;font-size:10.5px;font-weight:700}#tree{flex:1;padding:8px;overflow-y:auto}.tree-row{border-radius:var(--r-sm);cursor:pointer;white-space:nowrap;color:var(--text-dim);border:1px solid #0000;align-items:center;gap:6px;padding:3px 8px 3px 4px;display:flex;position:relative;overflow:hidden}.chevron{align-items:center;transition:transform .12s;display:inline-flex}.chevron.collapsed{transform:rotate(-90deg)}.chevron-legacy{text-align:center;width:14px;color:var(--text-faint);cursor:pointer;-webkit-user-select:none;user-select:none;flex:none;font-size:9px}.chevron.leaf{cursor:default;opacity:.35}.chevron:not(.leaf):hover{color:var(--accent)}.tree-children{border-left:1px solid var(--line);margin-left:11px;padding-left:8px}.tree-row.dragging{opacity:.4}.tree-row.drop-into{border-color:var(--accent);background:#6ee7dc24}.tree-row.drop-before:before,.tree-row.drop-after:after{content:"";background:var(--accent);border-radius:2px;height:2px;position:absolute;left:4px;right:4px}.tree-row.drop-before:before{top:-1px}.tree-row.drop-after:after{bottom:-1px}.tree-row:hover{background:var(--bg-2);color:var(--text)}.tree-row.selected{color:var(--accent);background:#6ee7dc1a;border-color:#6ee7dc4d}.tree-name{text-overflow:ellipsis;overflow:hidden}.tree-icon{cursor:help;border-radius:4px;flex:none;place-items:center;width:17px;height:17px;display:inline-grid}.tree-icon:hover{background:var(--bg-3)}.cat-core{color:var(--violet);background:#a78bfa26}.cat-2d{color:var(--accent);background:#6ee7dc1f}.cat-3d{color:var(--amber);background:#fbbf241f}.cat-body{color:var(--green);background:#86efac1f}.cat-net{color:var(--rose);background:#fb71851f}.scene-row{color:var(--text-faint);margin-bottom:6px}.scene-row.selected{color:var(--accent)}#tree-actions{border-top:1px solid var(--line);gap:7px;padding:10px;display:flex}#add-type{flex:1}#inspector{padding:12px 14px 40px}.section-title{letter-spacing:1.4px;text-transform:uppercase;color:var(--accent);align-items:center;gap:7px;margin:16px 0 8px;font-size:11px;font-weight:700;display:flex}.section-title:first-child{margin-top:2px}.section-title .rule{background:var(--line);flex:1;height:1px}.field{grid-template-columns:92px 1fr;align-items:center;gap:8px;margin-bottom:7px;display:grid}.field>span{color:var(--text-dim);text-overflow:ellipsis;align-items:center;gap:5px;font-size:11.5px;display:flex;overflow:hidden}.field.wide{grid-template-columns:1fr}.field.wide>span{margin-bottom:2px}.vector-row{gap:6px;display:flex}.vector-row input{width:100%}.help-btn{border:1px solid var(--line-strong);width:15px;height:15px;color:var(--text-faint);border-radius:50%;flex:none;justify-content:center;padding:0;font-size:10px;font-weight:700}.help-btn:hover{border-color:var(--accent);color:var(--accent)}.chips{border:1px solid var(--line);border-radius:var(--r-sm);background:var(--bg-0);cursor:text;flex-wrap:wrap;gap:5px;padding:5px 7px;display:flex}.chip{color:var(--accent);background:#6ee7dc1f;border-radius:999px;align-items:center;gap:4px;padding:1px 8px;font-size:11.5px;display:inline-flex}.chip button{color:inherit;opacity:.7;padding:0;font-size:12px}.chips input{background:0 0;border:none;flex:1;min-width:70px;padding:2px}.chips input:focus{outline:none}.subcard{border:1px solid var(--line);border-radius:var(--r-md);background:var(--bg-2);margin-bottom:10px;padding:10px}.subcard .field{grid-template-columns:78px 1fr}.subcard-head{color:var(--text-dim);align-items:center;gap:7px;margin-bottom:8px;font-size:11.5px;font-weight:600;display:flex}.subcard-head .spacer{flex:1}.linklike{color:var(--accent);padding:2px 6px;font-size:11px;font-weight:600}.linklike:hover{text-decoration:underline}.muted-note{color:var(--text-faint);margin:-2px 0 8px;font-size:11px}.asset-control{align-items:stretch;gap:6px;display:flex}.asset-control input{flex:1;min-width:0}.asset-toggle{border:1px solid var(--line);border-radius:var(--r-sm);background:var(--bg-1);width:26px;color:var(--text-dim);flex:none;font-size:11px}.asset-toggle:hover{border-color:var(--accent);color:var(--accent)}.asset-panel{border:1px solid var(--line-strong);border-radius:var(--r-sm);background:var(--bg-0);margin-top:6px;padding:6px}.asset-search{width:100%;margin-bottom:6px}.asset-options{flex-direction:column;gap:3px;max-height:220px;display:flex;overflow-y:auto}button.asset-option{text-align:left;border-radius:var(--r-sm);background:var(--bg-2);color:var(--text);border:1px solid #0000;flex-direction:column;align-items:flex-start;gap:1px;width:100%;padding:5px 8px;display:flex}button.asset-option:hover{border-color:var(--accent);background:var(--bg-3)}button.asset-option strong{font-size:11.5px;font-weight:600}button.asset-option small{color:var(--text-faint);white-space:nowrap;text-overflow:ellipsis;max-width:100%;font-size:10px;overflow:hidden}.asset-empty{color:var(--text-faint);padding:4px 8px;font-size:11px}.asset-note{margin-top:5px}.varieties{cursor:default}.variety-opt{color:var(--text-dim);cursor:pointer;align-items:center;gap:5px;font-size:11.5px;display:inline-flex}.variety-opt input[type=checkbox]{width:auto}#popover{z-index:50;background:var(--bg-3);border:1px solid var(--line-strong);border-radius:var(--r-md);width:300px;box-shadow:var(--shadow);color:var(--text-dim);padding:12px 14px;font-size:12px;position:fixed}#popover h4{color:var(--text);margin:0 0 6px;font-size:12.5px}#popover code{background:var(--bg-0);color:var(--accent);border-radius:4px;padding:1px 5px;font-size:11px}#popover pre{background:var(--bg-0);border-radius:var(--r-sm);color:var(--text-dim);margin:8px 0 0;padding:8px 10px;font-size:11px;line-height:1.5;overflow-x:auto}#popover .pop-actions{justify-content:flex-end;margin-top:8px;display:flex}#picker{z-index:40;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);background:#07090ec7;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}#picker[hidden]{display:none}#picker-card{background:var(--bg-2);border:1px solid var(--line-strong);width:460px;max-height:72vh;box-shadow:var(--shadow);border-radius:14px;flex-direction:column;display:flex;overflow:hidden}#picker-list{flex:1;padding:10px;overflow-y:auto}#picker-list .tree-row{padding:9px 12px;font-family:ui-monospace,Menlo,monospace;font-size:12.5px}#picker-new{border-top:1px solid var(--line);gap:8px;padding:12px;display:flex}#picker-path{flex:1;font-family:ui-monospace,Menlo,monospace}::-webkit-scrollbar{width:9px;height:9px}::-webkit-scrollbar-thumb{background:var(--line-strong);border:2px solid var(--bg-1);border-radius:99px}::-webkit-scrollbar-track{background:0 0}body.playing #tree-pane,body.playing #inspector-pane{pointer-events:none;opacity:.45;filter:saturate(.6);transition:opacity .2s}.rename-input{flex:1;min-width:0;padding:1px 6px;font-size:12.5px}.balloon{z-index:60;background:var(--bg-3);border:1px solid var(--line-strong);border-radius:var(--r-md);max-width:230px;box-shadow:var(--shadow);color:var(--text-dim);flex-direction:column;gap:2px;padding:8px 11px;font-size:11.5px;display:flex;position:fixed}.balloon .balloon-title{color:var(--accent);font-size:12px;font-weight:700}.context-menu{z-index:60;background:var(--bg-3);border:1px solid var(--line-strong);border-radius:var(--r-md);min-width:190px;box-shadow:var(--shadow);flex-direction:column;padding:5px;display:flex;position:fixed}.menu-item{border-radius:var(--r-sm);color:var(--text);justify-content:space-between;padding:6px 10px;font-weight:500}.menu-item:not(:disabled):hover{background:var(--bg-2)}.menu-item.danger:not(:disabled):hover{color:var(--rose)}.menu-item kbd{color:var(--text-faint);font-family:inherit;font-size:10px}.menu-divider{background:var(--line);height:1px;margin:4px 6px}.hints[hidden]{display:none}#hints-dock.open .hints:not([hidden]){opacity:1;border-color:var(--line);max-width:1100px;padding:5px 14px}body.playing #hints-dock{display:none}#gameview-btn{z-index:4;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);background:#10131dcc;padding:4px 10px;font-size:11.5px;position:absolute;top:104px;right:18px}.field input[type=checkbox]{width:15px;height:15px;accent-color:var(--accent-deep);cursor:pointer;justify-self:start}.picker-title{justify-content:space-between;align-items:center;display:flex}#picker-close{color:var(--text-faint);background:0 0;border:none;padding:0 4px;font-size:12px}#picker-close:hover{color:var(--text)}.uid-row{gap:6px;display:flex}.uid-row input{flex:1;min-width:0;font-size:11.5px}.uid-row .ghost{padding:4px 8px}#confirm{z-index:70;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);background:#07090ec7;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}#confirm[hidden]{display:none}#confirm-card{background:var(--bg-2);border:1px solid var(--line-strong);width:480px;max-height:70vh;box-shadow:var(--shadow);border-radius:14px;flex-direction:column;display:flex;overflow:hidden}#confirm-body{color:var(--text-dim);padding:14px;font-size:12.5px;overflow-y:auto}#confirm-list:empty{display:none}#confirm-list{background:var(--bg-0);border-radius:var(--r-sm);flex-direction:column;gap:4px;margin:10px 0 0;padding:10px 12px;font-family:ui-monospace,Menlo,monospace;font-size:11.5px;display:flex}#confirm-actions{border-top:1px solid var(--line);justify-content:flex-end;gap:8px;padding:12px 14px;display:flex}#confirm-delete{border-color:var(--rose);color:var(--rose);background:#fb718514}#confirm-delete:hover{background:#fb718529}.color-row{align-items:center;gap:6px;display:flex}.color-row input[type=color]{cursor:pointer;width:30px;height:26px;padding:2px}.color-row input[type=text]{flex:1;min-width:0;font-size:11.5px}.slider-row{align-items:center;gap:8px;display:flex}.slider-row input[type=range]{accent-color:var(--accent-deep);background:0 0;border:none;flex:1;padding:0}.slider-row input[type=number]{width:64px}.asset-row{border-radius:var(--r-sm);cursor:pointer;align-items:center;gap:7px;padding:5px 8px;display:flex}.asset-row:hover,.asset-row.open{background:var(--bg-3)}.asset-key{color:var(--accent)}.asset-url{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--text-faint);flex:1;font-family:ui-monospace,Menlo,monospace;font-size:11px;overflow:hidden}.danger-link{color:var(--text-faint)}.danger-link:hover{color:var(--rose)}.asset-editor{border:1px solid var(--line);border-radius:var(--r-sm);background:var(--bg-0);flex-direction:column;gap:4px;margin:2px 0 10px;padding:10px;display:flex}.asset-editor .field{grid-template-columns:52px 1fr;margin-bottom:4px}.meta-row{grid-template-columns:1fr 1fr 24px;align-items:center;gap:6px;display:grid}.meta-row input{padding:4px 7px;font-size:11.5px}#docs{z-index:60;-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);background:#07090ecc;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}#docs[hidden]{display:none}#docs-card{background:var(--bg-2);border:1px solid var(--line-strong);width:min(920px,92vw);height:min(680px,88vh);box-shadow:var(--shadow);border-radius:14px;flex-direction:column;display:flex;overflow:hidden}#docs-layout{flex:1;min-height:0;display:flex}#docs-tabs{border-right:1px solid var(--line);flex-direction:column;gap:4px;width:168px;padding:10px;display:flex}.docs-tab{border-radius:var(--r-sm);color:var(--text-dim);justify-content:flex-start;padding:7px 12px;font-weight:500}.docs-tab:hover{background:var(--bg-3);color:var(--text)}.docs-tab.active{color:var(--accent);background:#6ee7dc1a;font-weight:700}#docs-body{flex:1;padding:18px 24px 40px;overflow-y:auto}#docs-body h2{margin:0 0 6px;font-size:18px}#docs-body h3{color:var(--accent);margin:18px 0 4px;font-size:13.5px}#docs-body p{color:var(--text-dim);margin:4px 0 10px;font-size:13px;line-height:1.7}.docs-intro{background:var(--bg-1);border:1px solid var(--line);border-radius:var(--r-md);padding:10px 14px}.docs-node{border:1px solid var(--line);border-radius:var(--r-md);margin-bottom:8px;overflow:hidden}.docs-node.open{border-color:var(--line-strong)}.docs-node-head{text-align:left;border-radius:0;align-items:center;gap:9px;width:100%;padding:9px 12px;display:flex}.docs-node-head:hover{background:var(--bg-3)}.docs-node-head strong{font-size:13px}.docs-summary{color:var(--text-faint);text-overflow:ellipsis;white-space:nowrap;font-size:12px;font-weight:400;overflow:hidden}.docs-detail{border-top:1px solid var(--line);background:var(--bg-1);padding:4px 14px 12px}.docs-props{border-collapse:collapse;width:100%;margin-top:8px;font-size:11.5px}.docs-props th{text-align:left;color:var(--text-faint);border-bottom:1px solid var(--line);padding:4px 8px;font-weight:600}.docs-props td{border-bottom:1px solid var(--line);color:var(--text-dim);padding:3px 8px}#mode-toolbar{z-index:4;border-radius:var(--r-md);border:1px solid var(--line);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);background:#10131dd9;gap:4px;padding:4px;display:flex;position:absolute;top:12px;left:12px}.tool{border-radius:var(--r-sm);width:30px;height:28px;color:var(--text-faint);justify-content:center;padding:0}.tool:hover{color:var(--text);background:var(--bg-3)}.tool.active{color:var(--accent);background:#6ee7dc24}.lang-menu{min-width:130px}.lang-check{color:var(--accent);font-weight:700}.explorer-section{border-top:1px solid var(--line);justify-content:space-between;align-items:center;margin-top:4px;display:flex}.explorer-section .ghost{padding:1px 8px}#asset-tree{max-height:30%;padding:2px 8px 10px;overflow-y:auto}.explorer-empty{padding:4px 10px;font-size:11px}.asset-row .asset-key{color:var(--accent);font-family:ui-monospace,Menlo,monospace}.asset-icon-texture{color:#f0abfc}.asset-icon-spritesheet{color:#fbbf24}.asset-icon-model{color:#7aa2ff}.asset-icon-animation{color:#86efac}.uid-value{align-items:center;gap:7px;min-width:0;display:flex}.uid-value code{color:var(--text-dim);letter-spacing:.3px;text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,Menlo,monospace;font-size:11px;overflow:hidden}.uid-copy{border-radius:var(--r-sm);color:var(--text-faint);background:0 0;border:none;padding:3px 5px;line-height:0}.uid-copy:hover{color:var(--text);background:var(--bg-3)}.uid-copy.copied{color:var(--accent);font-size:10px;line-height:1}.section-toggle{box-sizing:border-box;text-align:left;cursor:pointer;background:var(--bg-1);border:none;border-top:1px solid var(--line-strong);border-bottom:1px solid var(--line);border-radius:0;justify-content:flex-start;align-items:center;gap:6px;width:100%;height:30px;padding-top:0;padding-bottom:0;display:flex}.section-toggle:hover{color:var(--text)}.section-toggle .chev{color:var(--text-dim);transition:transform .12s;display:inline-flex}.section-toggle.collapsed .chev{transform:rotate(-90deg)}.section-add{min-width:24px;height:20px;color:var(--text-dim);border:1px solid var(--line-strong);border-radius:var(--r-sm);background:var(--bg-2);justify-content:center;align-items:center;padding:0 6px;font-size:13px;display:inline-flex}.section-add:hover{background:var(--bg-3);color:var(--accent);border-color:var(--accent-deep)}[data-body][hidden],aside#tree-pane #scene-body[hidden]{display:none}#scene-body{flex-direction:column;flex:1;min-height:0;display:flex}.asset-folder{color:var(--text-dim);cursor:pointer;border-radius:var(--r-sm);align-items:center;gap:6px;padding:4px 8px;display:flex}.asset-folder:hover{background:var(--bg-3)}.asset-folder .chev{color:var(--text-dim);transition:transform .12s;display:inline-flex}.asset-folder.collapsed .chev{transform:rotate(-90deg)}.asset-folder svg{color:#e7c66a}.asset-row.grouped{margin-left:18px}.asset-folder .count{color:var(--text-faint);margin-left:auto;font-size:10.5px}.asset-folder.selected{color:var(--accent);background:#6ee7dc14}.asset-folder.drop-target,#asset-tree.drop-target{outline:1.5px dashed var(--accent);outline-offset:-2px;border-radius:var(--r-sm)}.asset-row[draggable=true]{cursor:grab}body.playing #mode-toolbar,body.playing #gameview-btn{display:none}.tool-divider{background:var(--line);align-self:center;width:1px;height:18px;margin:0 2px}#generate{z-index:70;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);background:#07090ec7;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}#generate[hidden]{display:none}#generate-card{background:var(--bg-2);border:1px solid var(--line-strong);width:420px;max-height:78vh;box-shadow:var(--shadow);border-radius:14px;flex-direction:column;display:flex;overflow:hidden}#generate-body{padding:14px;overflow-y:auto}#generate-body .gen-hint{color:var(--text-faint);margin:0 0 12px;font-size:11.5px}#generate-body .gen-desc{color:var(--text-dim);margin:2px 0 12px;font-size:11.5px}#generate-params{border-top:1px solid var(--line);padding-top:2px}#generate-params .field:first-child{margin-top:10px}.gen-seed-row{gap:6px;display:flex}.gen-seed-row input{flex:1;min-width:0}.gen-seed-row .ghost{padding:4px 9px}#generate-actions{border-top:1px solid var(--line);justify-content:flex-end;align-items:center;gap:8px;padding:12px 14px;display:flex}#generate-status{color:var(--rose);margin-right:auto;font-size:11px}.const-picker{border:1px solid var(--line);border-radius:var(--r-sm);background:var(--bg-1);width:30px;color:var(--text-dim);flex:none;margin-left:6px;font-size:11px}.const-picker:hover{border-color:var(--accent);color:var(--accent)}.field.const-bound>span{color:var(--accent)}.const-row{align-items:stretch;gap:6px;display:flex}.const-row .field{flex:1;min-width:0}.const-del{border:1px solid var(--line);border-radius:var(--r-sm);background:var(--bg-1);width:26px;color:var(--text-dim);flex:none;font-size:11px}.const-del:hover{border-color:var(--rose);color:var(--rose)}.const-add{align-items:stretch;gap:6px;margin-top:6px;display:flex}.const-add input{flex:1;min-width:0}
1
+ :root{--bg-0:#0b0d14;--bg-1:#10131d;--bg-2:#161a27;--bg-3:#1d2231;--line:#262c3e;--line-strong:#343c54;--text:#e2e6f0;--text-dim:#9aa3bd;--text-faint:#5d6680;--accent:#6ee7dc;--accent-deep:#14b8a6;--violet:#a78bfa;--amber:#fbbf24;--rose:#fb7185;--green:#86efac;--shadow:0 12px 40px #0000008c;--r-sm:6px;--r-md:10px;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}*{box-sizing:border-box}html,body{background:var(--bg-0);height:100%;color:var(--text);-webkit-font-smoothing:antialiased;margin:0;font:13px/1.55 Inter,-apple-system,Segoe UI,system-ui,sans-serif;overflow:hidden}code,textarea,.mono{font-family:ui-monospace,SF Mono,Menlo,monospace}#topbar{background:linear-gradient(to bottom, var(--bg-2), var(--bg-1));border-bottom:1px solid var(--line);align-items:center;gap:10px;height:46px;padding:0 14px;display:flex}.brand{align-items:baseline;gap:7px;margin-right:6px;display:flex}.brand-mark{background:linear-gradient(135deg, var(--accent), var(--accent-deep));color:#07211d;border-radius:6px;align-self:center;place-items:center;width:22px;height:22px;font-size:11px;font-weight:800;display:inline-grid}.brand strong{letter-spacing:.2px;font-weight:700}.brand-sub{color:var(--text-faint);font-size:12px}#file-chip{border:1px solid var(--line);background:var(--bg-1);color:var(--text-dim);border-radius:999px;align-items:center;gap:6px;max-width:320px;padding:4px 10px;font-size:12px;display:flex}#file-path{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.pill{background:var(--bg-3);color:var(--text-faint);border-radius:999px;padding:2px 9px;font-family:ui-monospace,Menlo,monospace;font-size:11px}.spacer{flex:1}button{font:inherit;border-radius:var(--r-sm);color:var(--text);cursor:pointer;background:0 0;border:1px solid #0000;align-items:center;gap:6px;padding:6px 12px;font-size:12.5px;font-weight:600;transition:background .12s,border-color .12s,color .12s,opacity .12s;display:inline-flex}button:disabled{opacity:.35;cursor:default}button.ghost{border-color:var(--line);background:var(--bg-1);color:var(--text-dim)}button.ghost:not(:disabled):hover{border-color:var(--line-strong);color:var(--text)}button.ghost.danger:not(:disabled):hover{border-color:var(--rose);color:var(--rose)}button.primary{background:linear-gradient(135deg, var(--accent), var(--accent-deep));color:#06201c}button.primary:not(:disabled):hover{filter:brightness(1.1)}button.play{border-color:var(--green);color:var(--green);background:#86efac14}button.play:not(:disabled):hover{background:#86efac29}button.play.stop{border-color:var(--rose);color:var(--rose);background:#fb71851a}input,select,textarea{font:inherit;color:var(--text);background:var(--bg-0);border:1px solid var(--line);border-radius:var(--r-sm);min-width:0;padding:6px 9px;font-size:12.5px;transition:border-color .12s}select{appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%239aa3bd' stroke-width='2.4'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");background-position:right 9px center;background-repeat:no-repeat;background-size:12px;padding-right:30px}input:focus,select:focus,textarea:focus{border-color:var(--accent-deep);outline:none}textarea{resize:vertical;font-size:12px;line-height:1.5}textarea.invalid{border-color:var(--rose);background:#fb71850d}#error-banner{color:var(--rose);white-space:pre-wrap;background:#fb71851a;border-bottom:1px solid #fb718559;max-height:110px;padding:8px 14px;font-family:ui-monospace,Menlo,monospace;font-size:12px;overflow:auto}#play-notice{color:var(--green);background:#86efac14;border-bottom:1px solid #86efac40;padding:7px 14px;font-size:12px}main{height:calc(100% - 46px);display:flex}#tree-pane{background:var(--bg-1);border-right:1px solid var(--line);flex-direction:column;width:256px;display:flex}#inspector-pane{background:var(--bg-1);border-left:1px solid var(--line);width:336px;overflow-y:auto}#viewport-pane{background:radial-gradient(1200px 500px at 50% -10%, #6ee7dc0d, transparent), var(--bg-0);flex:1;position:relative;overflow:hidden}#viewport,#overlay,#play-canvas{width:100%;height:100%;position:absolute;inset:0}#overlay{cursor:crosshair}#play-canvas{z-index:3}#hints-dock{z-index:4;align-items:center;gap:8px;display:flex;position:absolute;bottom:12px;right:16px}#hints-toggle{border:1px solid var(--line-strong);width:40px;height:40px;color:var(--text-dim);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);background:#10131de0;border-radius:50%;flex:none;justify-content:center;align-items:center;display:inline-flex}#hints-toggle:hover{color:var(--accent);border-color:var(--accent-deep)}#hints-dock.open #hints-toggle{color:var(--accent)}.hints{opacity:0;white-space:nowrap;max-width:0;color:var(--text-faint);pointer-events:none;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);background:#10131dd9;border:1px solid #0000;border-radius:999px;gap:14px;padding:5px 0;font-size:11px;transition:max-width .22s,opacity .18s,padding .22s;display:flex;overflow:hidden}.hints b{color:var(--text-dim);font-weight:600}.pane-title{letter-spacing:1.6px;text-transform:uppercase;color:var(--text-faint);border-bottom:1px solid var(--line);padding:9px 14px 7px;font-size:10.5px;font-weight:700}#tree{flex:1;padding:8px;overflow-y:auto}.tree-row{border-radius:var(--r-sm);cursor:pointer;white-space:nowrap;color:var(--text-dim);border:1px solid #0000;align-items:center;gap:6px;padding:3px 8px 3px 4px;display:flex;position:relative;overflow:hidden}.chevron{align-items:center;transition:transform .12s;display:inline-flex}.chevron.collapsed{transform:rotate(-90deg)}.chevron-legacy{text-align:center;width:14px;color:var(--text-faint);cursor:pointer;-webkit-user-select:none;user-select:none;flex:none;font-size:9px}.chevron.leaf{cursor:default;opacity:.35}.chevron:not(.leaf):hover{color:var(--accent)}.tree-children{border-left:1px solid var(--line);margin-left:11px;padding-left:8px}.tree-row.dragging{opacity:.4}.tree-row.drop-into{border-color:var(--accent);background:#6ee7dc24}.tree-row.drop-before:before,.tree-row.drop-after:after{content:"";background:var(--accent);border-radius:2px;height:2px;position:absolute;left:4px;right:4px}.tree-row.drop-before:before{top:-1px}.tree-row.drop-after:after{bottom:-1px}.tree-row:hover{background:var(--bg-2);color:var(--text)}.tree-row.selected{color:var(--accent);background:#6ee7dc1a;border-color:#6ee7dc4d}.tree-name{text-overflow:ellipsis;overflow:hidden}.tree-icon{cursor:help;border-radius:4px;flex:none;place-items:center;width:17px;height:17px;display:inline-grid}.tree-icon:hover{background:var(--bg-3)}.cat-core{color:var(--violet);background:#a78bfa26}.cat-2d{color:var(--accent);background:#6ee7dc1f}.cat-3d{color:var(--amber);background:#fbbf241f}.cat-body{color:var(--green);background:#86efac1f}.cat-net{color:var(--rose);background:#fb71851f}.scene-row{color:var(--text-faint);margin-bottom:6px}.scene-row.selected{color:var(--accent)}#tree-actions{border-top:1px solid var(--line);gap:7px;padding:10px;display:flex}#add-type{flex:1}#inspector{padding:12px 14px 40px}.section-title{letter-spacing:1.4px;text-transform:uppercase;color:var(--accent);align-items:center;gap:7px;margin:16px 0 8px;font-size:11px;font-weight:700;display:flex}.section-title:first-child{margin-top:2px}.section-title .rule{background:var(--line);flex:1;height:1px}.field{grid-template-columns:92px 1fr;align-items:center;gap:8px;margin-bottom:7px;display:grid}.field>span{color:var(--text-dim);text-overflow:ellipsis;align-items:center;gap:5px;font-size:11.5px;display:flex;overflow:hidden}.field.wide{grid-template-columns:1fr}.field.wide>span{margin-bottom:2px}.vector-row{gap:6px;display:flex}.vector-row input{width:100%}.help-btn{border:1px solid var(--line-strong);width:15px;height:15px;color:var(--text-faint);border-radius:50%;flex:none;justify-content:center;padding:0;font-size:10px;font-weight:700}.help-btn:hover{border-color:var(--accent);color:var(--accent)}.chips{border:1px solid var(--line);border-radius:var(--r-sm);background:var(--bg-0);cursor:text;flex-wrap:wrap;gap:5px;padding:5px 7px;display:flex}.chip{color:var(--accent);background:#6ee7dc1f;border-radius:999px;align-items:center;gap:4px;padding:1px 8px;font-size:11.5px;display:inline-flex}.chip button{color:inherit;opacity:.7;padding:0;font-size:12px}.chips input{background:0 0;border:none;flex:1;min-width:70px;padding:2px}.chips input:focus{outline:none}.subcard{border:1px solid var(--line);border-radius:var(--r-md);background:var(--bg-2);margin-bottom:10px;padding:10px}.subcard .field{grid-template-columns:78px 1fr}.subcard-head{color:var(--text-dim);align-items:center;gap:7px;margin-bottom:8px;font-size:11.5px;font-weight:600;display:flex}.subcard-head .spacer{flex:1}.linklike{color:var(--accent);padding:2px 6px;font-size:11px;font-weight:600}.linklike:hover{text-decoration:underline}.muted-note{color:var(--text-faint);margin:-2px 0 8px;font-size:11px}.asset-control{align-items:stretch;gap:6px;display:flex}.asset-control input{flex:1;min-width:0}.asset-toggle{border:1px solid var(--line);border-radius:var(--r-sm);background:var(--bg-1);width:26px;color:var(--text-dim);flex:none;font-size:11px}.asset-toggle:hover{border-color:var(--accent);color:var(--accent)}.asset-panel{border:1px solid var(--line-strong);border-radius:var(--r-sm);background:var(--bg-0);margin-top:6px;padding:6px}.asset-search{width:100%;margin-bottom:6px}.asset-options{flex-direction:column;gap:3px;max-height:220px;display:flex;overflow-y:auto}button.asset-option{text-align:left;border-radius:var(--r-sm);background:var(--bg-2);color:var(--text);border:1px solid #0000;flex-direction:column;align-items:flex-start;gap:1px;width:100%;padding:5px 8px;display:flex}button.asset-option:hover{border-color:var(--accent);background:var(--bg-3)}button.asset-option strong{font-size:11.5px;font-weight:600}button.asset-option small{color:var(--text-faint);white-space:nowrap;text-overflow:ellipsis;max-width:100%;font-size:10px;overflow:hidden}.asset-empty{color:var(--text-faint);padding:4px 8px;font-size:11px}.asset-note{margin-top:5px}.varieties{cursor:default}.variety-opt{color:var(--text-dim);cursor:pointer;align-items:center;gap:5px;font-size:11.5px;display:inline-flex}.variety-opt input[type=checkbox]{width:auto}#popover{z-index:50;background:var(--bg-3);border:1px solid var(--line-strong);border-radius:var(--r-md);width:300px;box-shadow:var(--shadow);color:var(--text-dim);padding:12px 14px;font-size:12px;position:fixed}#popover h4{color:var(--text);margin:0 0 6px;font-size:12.5px}#popover code{background:var(--bg-0);color:var(--accent);border-radius:4px;padding:1px 5px;font-size:11px}#popover pre{background:var(--bg-0);border-radius:var(--r-sm);color:var(--text-dim);margin:8px 0 0;padding:8px 10px;font-size:11px;line-height:1.5;overflow-x:auto}#popover .pop-actions{justify-content:flex-end;margin-top:8px;display:flex}#picker{z-index:40;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);background:#07090ec7;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}#picker[hidden]{display:none}#picker-card{background:var(--bg-2);border:1px solid var(--line-strong);width:460px;max-height:72vh;box-shadow:var(--shadow);border-radius:14px;flex-direction:column;display:flex;overflow:hidden}#picker-list{flex:1;padding:10px;overflow-y:auto}#picker-list .tree-row{padding:9px 12px;font-family:ui-monospace,Menlo,monospace;font-size:12.5px}#picker-new{border-top:1px solid var(--line);gap:8px;padding:12px;display:flex}#picker-path{flex:1;font-family:ui-monospace,Menlo,monospace}::-webkit-scrollbar{width:9px;height:9px}::-webkit-scrollbar-thumb{background:var(--line-strong);border:2px solid var(--bg-1);border-radius:99px}::-webkit-scrollbar-track{background:0 0}body.playing #tree-pane,body.playing #inspector-pane{pointer-events:none;opacity:.45;filter:saturate(.6);transition:opacity .2s}.rename-input{flex:1;min-width:0;padding:1px 6px;font-size:12.5px}.balloon{z-index:60;background:var(--bg-3);border:1px solid var(--line-strong);border-radius:var(--r-md);max-width:230px;box-shadow:var(--shadow);color:var(--text-dim);flex-direction:column;gap:2px;padding:8px 11px;font-size:11.5px;display:flex;position:fixed}.balloon .balloon-title{color:var(--accent);font-size:12px;font-weight:700}.context-menu{z-index:60;background:var(--bg-3);border:1px solid var(--line-strong);border-radius:var(--r-md);min-width:190px;box-shadow:var(--shadow);flex-direction:column;padding:5px;display:flex;position:fixed}.menu-item{border-radius:var(--r-sm);color:var(--text);justify-content:space-between;padding:6px 10px;font-weight:500}.menu-item:not(:disabled):hover{background:var(--bg-2)}.menu-item.danger:not(:disabled):hover{color:var(--rose)}.menu-item kbd{color:var(--text-faint);font-family:inherit;font-size:10px}.menu-divider{background:var(--line);height:1px;margin:4px 6px}.hints[hidden]{display:none}#hints-dock.open .hints:not([hidden]){opacity:1;border-color:var(--line);max-width:1100px;padding:5px 14px}body.playing #hints-dock{display:none}#gameview-btn{z-index:4;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);background:#10131dcc;padding:4px 10px;font-size:11.5px;position:absolute;top:104px;right:18px}.field input[type=checkbox]{width:15px;height:15px;accent-color:var(--accent-deep);cursor:pointer;justify-self:start}.picker-title{justify-content:space-between;align-items:center;display:flex}#picker-close{color:var(--text-faint);background:0 0;border:none;padding:0 4px;font-size:12px}#picker-close:hover{color:var(--text)}.uid-row{gap:6px;display:flex}.uid-row input{flex:1;min-width:0;font-size:11.5px}.uid-row .ghost{padding:4px 8px}#confirm{z-index:70;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);background:#07090ec7;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}#confirm[hidden]{display:none}#confirm-card{background:var(--bg-2);border:1px solid var(--line-strong);width:480px;max-height:70vh;box-shadow:var(--shadow);border-radius:14px;flex-direction:column;display:flex;overflow:hidden}#confirm-body{color:var(--text-dim);padding:14px;font-size:12.5px;overflow-y:auto}#confirm-list:empty{display:none}#confirm-list{background:var(--bg-0);border-radius:var(--r-sm);flex-direction:column;gap:4px;margin:10px 0 0;padding:10px 12px;font-family:ui-monospace,Menlo,monospace;font-size:11.5px;display:flex}#confirm-actions{border-top:1px solid var(--line);justify-content:flex-end;gap:8px;padding:12px 14px;display:flex}#confirm-delete{border-color:var(--rose);color:var(--rose);background:#fb718514}#confirm-delete:hover{background:#fb718529}.color-row{align-items:center;gap:6px;display:flex}.color-row input[type=color]{cursor:pointer;width:30px;height:26px;padding:2px}.color-row input[type=text]{flex:1;min-width:0;font-size:11.5px}.slider-row{align-items:center;gap:8px;display:flex}.slider-row input[type=range]{accent-color:var(--accent-deep);background:0 0;border:none;flex:1;padding:0}.slider-row input[type=number]{width:64px}.asset-row{border-radius:var(--r-sm);cursor:pointer;align-items:center;gap:7px;padding:5px 8px;display:flex}.asset-row:hover,.asset-row.open{background:var(--bg-3)}.asset-key{color:var(--accent)}.asset-url{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--text-faint);flex:1;font-family:ui-monospace,Menlo,monospace;font-size:11px;overflow:hidden}.danger-link{color:var(--text-faint)}.danger-link:hover{color:var(--rose)}.asset-editor{border:1px solid var(--line);border-radius:var(--r-sm);background:var(--bg-0);flex-direction:column;gap:4px;margin:2px 0 10px;padding:10px;display:flex}.asset-editor .field{grid-template-columns:52px 1fr;margin-bottom:4px}.meta-row{grid-template-columns:1fr 1fr 24px;align-items:center;gap:6px;display:grid}.meta-row input{padding:4px 7px;font-size:11.5px}#docs{z-index:60;-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);background:#07090ecc;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}#docs[hidden]{display:none}#docs-card{background:var(--bg-2);border:1px solid var(--line-strong);width:min(920px,92vw);height:min(680px,88vh);box-shadow:var(--shadow);border-radius:14px;flex-direction:column;display:flex;overflow:hidden}#docs-layout{flex:1;min-height:0;display:flex}#docs-tabs{border-right:1px solid var(--line);flex-direction:column;gap:4px;width:168px;padding:10px;display:flex}.docs-tab{border-radius:var(--r-sm);color:var(--text-dim);justify-content:flex-start;padding:7px 12px;font-weight:500}.docs-tab:hover{background:var(--bg-3);color:var(--text)}.docs-tab.active{color:var(--accent);background:#6ee7dc1a;font-weight:700}#docs-body{flex:1;padding:18px 24px 40px;overflow-y:auto}#docs-body h2{margin:0 0 6px;font-size:18px}#docs-body h3{color:var(--accent);margin:18px 0 4px;font-size:13.5px}#docs-body p{color:var(--text-dim);margin:4px 0 10px;font-size:13px;line-height:1.7}.docs-intro{background:var(--bg-1);border:1px solid var(--line);border-radius:var(--r-md);padding:10px 14px}.docs-node{border:1px solid var(--line);border-radius:var(--r-md);margin-bottom:8px;overflow:hidden}.docs-node.open{border-color:var(--line-strong)}.docs-node-head{text-align:left;border-radius:0;align-items:center;gap:9px;width:100%;padding:9px 12px;display:flex}.docs-node-head:hover{background:var(--bg-3)}.docs-node-head strong{font-size:13px}.docs-summary{color:var(--text-faint);text-overflow:ellipsis;white-space:nowrap;font-size:12px;font-weight:400;overflow:hidden}.docs-detail{border-top:1px solid var(--line);background:var(--bg-1);padding:4px 14px 12px}.docs-props{border-collapse:collapse;width:100%;margin-top:8px;font-size:11.5px}.docs-props th{text-align:left;color:var(--text-faint);border-bottom:1px solid var(--line);padding:4px 8px;font-weight:600}.docs-props td{border-bottom:1px solid var(--line);color:var(--text-dim);padding:3px 8px}#mode-toolbar{z-index:4;border-radius:var(--r-md);border:1px solid var(--line);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);background:#10131dd9;gap:4px;padding:4px;display:flex;position:absolute;top:12px;left:12px}.tool{border-radius:var(--r-sm);width:30px;height:28px;color:var(--text-faint);justify-content:center;padding:0}.tool:hover{color:var(--text);background:var(--bg-3)}.tool.active{color:var(--accent);background:#6ee7dc24}.lang-menu{min-width:130px}.lang-check{color:var(--accent);font-weight:700}.explorer-section{border-top:1px solid var(--line);justify-content:space-between;align-items:center;margin-top:4px;display:flex}.explorer-section .ghost{padding:1px 8px}#asset-tree{max-height:30%;padding:2px 8px 10px;overflow-y:auto}.explorer-empty{padding:4px 10px;font-size:11px}.asset-row .asset-key{color:var(--accent);font-family:ui-monospace,Menlo,monospace}.asset-icon-texture{color:#f0abfc}.asset-icon-spritesheet{color:#fbbf24}.asset-icon-model{color:#7aa2ff}.asset-icon-animation{color:#86efac}.uid-value{align-items:center;gap:7px;min-width:0;display:flex}.uid-value code{color:var(--text-dim);letter-spacing:.3px;text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,Menlo,monospace;font-size:11px;overflow:hidden}.uid-copy{border-radius:var(--r-sm);color:var(--text-faint);background:0 0;border:none;padding:3px 5px;line-height:0}.uid-copy:hover{color:var(--text);background:var(--bg-3)}.uid-copy.copied{color:var(--accent);font-size:10px;line-height:1}.section-toggle{box-sizing:border-box;text-align:left;cursor:pointer;background:var(--bg-1);border:none;border-top:1px solid var(--line-strong);border-bottom:1px solid var(--line);border-radius:0;justify-content:flex-start;align-items:center;gap:6px;width:100%;height:30px;padding-top:0;padding-bottom:0;display:flex}.section-toggle:hover{color:var(--text)}.section-toggle .chev{color:var(--text-dim);transition:transform .12s;display:inline-flex}.section-toggle.collapsed .chev{transform:rotate(-90deg)}.section-add{min-width:24px;height:20px;color:var(--text-dim);border:1px solid var(--line-strong);border-radius:var(--r-sm);background:var(--bg-2);justify-content:center;align-items:center;padding:0 6px;font-size:13px;display:inline-flex}.section-add:hover{background:var(--bg-3);color:var(--accent);border-color:var(--accent-deep)}[data-body][hidden],aside#tree-pane #scene-body[hidden]{display:none}#scene-body{flex-direction:column;flex:1;min-height:0;display:flex}.asset-folder{color:var(--text-dim);cursor:pointer;border-radius:var(--r-sm);align-items:center;gap:6px;padding:4px 8px;display:flex}.asset-folder:hover{background:var(--bg-3)}.asset-folder .chev{color:var(--text-dim);transition:transform .12s;display:inline-flex}.asset-folder.collapsed .chev{transform:rotate(-90deg)}.asset-folder svg{color:#e7c66a}.asset-row.grouped{margin-left:18px}.asset-folder .count{color:var(--text-faint);margin-left:auto;font-size:10.5px}.asset-folder.selected{color:var(--accent);background:#6ee7dc14}.asset-folder.drop-target,#asset-tree.drop-target{outline:1.5px dashed var(--accent);outline-offset:-2px;border-radius:var(--r-sm)}.asset-row[draggable=true]{cursor:grab}body.playing #mode-toolbar,body.playing #gameview-btn{display:none}.tool-divider{background:var(--line);align-self:center;width:1px;height:18px;margin:0 2px}#generate{z-index:70;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);background:#07090ec7;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}#generate[hidden]{display:none}#generate-card{background:var(--bg-2);border:1px solid var(--line-strong);width:420px;max-height:78vh;box-shadow:var(--shadow);border-radius:14px;flex-direction:column;display:flex;overflow:hidden}#generate-body{padding:14px;overflow-y:auto}#generate-body .gen-hint{color:var(--text-faint);margin:0 0 12px;font-size:11.5px}#generate-body .gen-desc{color:var(--text-dim);margin:2px 0 12px;font-size:11.5px}#generate-params{border-top:1px solid var(--line);padding-top:2px}#generate-params .field:first-child{margin-top:10px}.gen-seed-row{gap:6px;display:flex}.gen-seed-row input{flex:1;min-width:0}.gen-seed-row .ghost{padding:4px 9px}#generate-actions{border-top:1px solid var(--line);justify-content:flex-end;align-items:center;gap:8px;padding:12px 14px;display:flex}#generate-status{color:var(--rose);margin-right:auto;font-size:11px}.const-picker{border:1px solid var(--line);border-radius:var(--r-sm);background:var(--bg-1);width:30px;color:var(--text-dim);flex:none;margin-left:6px;font-size:11px}.const-picker:hover{border-color:var(--accent);color:var(--accent)}.field.const-bound>span{color:var(--accent)}.const-row{align-items:stretch;gap:6px;display:flex}.const-row .field{flex:1;min-width:0}.const-del{border:1px solid var(--line);border-radius:var(--r-sm);background:var(--bg-1);width:26px;color:var(--text-dim);flex:none;font-size:11px}.const-del:hover{border-color:var(--rose);color:var(--rose)}.const-add{align-items:stretch;gap:6px;margin-top:6px;display:flex}.const-add input{flex:1;min-width:0}.tile-paint{flex-direction:column;gap:6px;display:flex}.paint-toggle{cursor:pointer;border:1px solid var(--border,#444);color:inherit;font:inherit;background:0 0;border-radius:6px;padding:6px 10px}.paint-toggle.on{color:#fff;background:#2e6b2e;border-color:#4a9e4a}.paint-palette{flex-wrap:wrap;align-items:center;gap:4px;display:flex}.paint-chip{cursor:pointer;border:1px solid var(--border,#444);width:26px;height:26px;color:inherit;background:0 0;border-radius:5px;font:600 13px/1 monospace}.paint-chip.on{color:#fff;background:#3a5a8c;border-color:#6a9ae0}.paint-brush-input{text-align:center;width:32px;color:inherit;border:1px solid var(--border,#444);background:0 0;border-radius:5px;padding:4px;font:600 13px/1 monospace}.paint-hint{opacity:.6;font-size:11px}
package/editor/index.html CHANGED
@@ -5,9 +5,9 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>Incanto Scene Editor</title>
7
7
  <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><rect width='16' height='16' rx='3' fill='%236ee7dc'/><text x='8' y='12' text-anchor='middle' font-size='11' font-family='monospace' fill='%230e1018'>i</text></svg>" />
8
- <script type="module" crossorigin src="./assets/index-CXFNanuR.js"></script>
8
+ <script type="module" crossorigin src="./assets/index-BLzp8moy.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="./assets/GameServer-C56iOUgF.js">
10
- <link rel="stylesheet" crossorigin href="./assets/index-DF3tMeKJ.css">
10
+ <link rel="stylesheet" crossorigin href="./assets/index-D8QvwvOm.css">
11
11
  </head>
12
12
  <body>
13
13
  <header id="topbar">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "incanto",
3
- "version": "0.7.1",
3
+ "version": "0.9.0",
4
4
  "description": "Vibe-coding-first web game engine SDK — JSON-driven scenes on three.js",
5
5
  "keywords": [
6
6
  "game-engine",
@@ -283,9 +283,15 @@
283
283
  {
284
284
  "$ref": "#/$defs/Terrain3D"
285
285
  },
286
+ {
287
+ "$ref": "#/$defs/TileMap2D"
288
+ },
286
289
  {
287
290
  "$ref": "#/$defs/Timer"
288
291
  },
292
+ {
293
+ "$ref": "#/$defs/Trail3D"
294
+ },
289
295
  {
290
296
  "$ref": "#/$defs/Tree3D"
291
297
  },
@@ -298,6 +304,12 @@
298
304
  {
299
305
  "$ref": "#/$defs/UiBar"
300
306
  },
307
+ {
308
+ "$ref": "#/$defs/UiButton"
309
+ },
310
+ {
311
+ "$ref": "#/$defs/UiDialogue"
312
+ },
301
313
  {
302
314
  "$ref": "#/$defs/UiText"
303
315
  },
@@ -1753,6 +1765,10 @@
1753
1765
  "skinYawOffset": {
1754
1766
  "type": "number",
1755
1767
  "default": 0
1768
+ },
1769
+ "animations": {
1770
+ "type": "object",
1771
+ "default": {}
1756
1772
  }
1757
1773
  },
1758
1774
  "additionalProperties": false
@@ -4842,6 +4858,124 @@
4842
4858
  },
4843
4859
  "required": ["name", "type"]
4844
4860
  },
4861
+ "TileMap2D": {
4862
+ "type": "object",
4863
+ "properties": {
4864
+ "name": {
4865
+ "type": "string"
4866
+ },
4867
+ "uid": {
4868
+ "type": "string"
4869
+ },
4870
+ "type": {
4871
+ "const": "TileMap2D"
4872
+ },
4873
+ "groups": {
4874
+ "type": "array",
4875
+ "items": {
4876
+ "type": "string"
4877
+ }
4878
+ },
4879
+ "tags": {
4880
+ "type": "object"
4881
+ },
4882
+ "props": {
4883
+ "type": "object",
4884
+ "properties": {
4885
+ "position": {
4886
+ "type": "array",
4887
+ "items": {
4888
+ "type": "number"
4889
+ },
4890
+ "minItems": 2,
4891
+ "maxItems": 2,
4892
+ "default": [0, 0]
4893
+ },
4894
+ "rotation": {
4895
+ "type": "number",
4896
+ "default": 0
4897
+ },
4898
+ "static": {
4899
+ "type": "boolean",
4900
+ "default": false
4901
+ },
4902
+ "scale": {
4903
+ "type": "array",
4904
+ "items": {
4905
+ "type": "number"
4906
+ },
4907
+ "minItems": 2,
4908
+ "maxItems": 2,
4909
+ "default": [1, 1]
4910
+ },
4911
+ "renderOrder": {
4912
+ "type": "number",
4913
+ "default": 0
4914
+ },
4915
+ "orderGroup": {
4916
+ "type": "string",
4917
+ "enum": ["background", "terrain", "default", "characters", "effects", "overlay"],
4918
+ "default": "default"
4919
+ },
4920
+ "visible": {
4921
+ "type": "boolean",
4922
+ "default": true
4923
+ },
4924
+ "texture": {
4925
+ "type": "string",
4926
+ "default": ""
4927
+ },
4928
+ "tileSize": {
4929
+ "type": "number",
4930
+ "default": 32
4931
+ },
4932
+ "columns": {
4933
+ "type": "number",
4934
+ "default": 0
4935
+ },
4936
+ "cells": {
4937
+ "type": "array",
4938
+ "default": []
4939
+ },
4940
+ "legend": {
4941
+ "type": "object",
4942
+ "default": {}
4943
+ },
4944
+ "solid": {
4945
+ "type": "array",
4946
+ "default": []
4947
+ },
4948
+ "opacity": {
4949
+ "type": "number",
4950
+ "default": 1
4951
+ }
4952
+ },
4953
+ "additionalProperties": false
4954
+ },
4955
+ "script": {
4956
+ "type": "object",
4957
+ "properties": {
4958
+ "name": {
4959
+ "type": "string"
4960
+ },
4961
+ "props": {
4962
+ "type": "object"
4963
+ }
4964
+ },
4965
+ "required": ["name"]
4966
+ },
4967
+ "network": {
4968
+ "type": "object"
4969
+ },
4970
+ "children": {
4971
+ "type": "array",
4972
+ "items": {
4973
+ "$ref": "#/$defs/node"
4974
+ }
4975
+ }
4976
+ },
4977
+ "required": ["name", "type"]
4978
+ },
4845
4979
  "Timer": {
4846
4980
  "type": "object",
4847
4981
  "x-signals": ["timeout"],
@@ -4906,6 +5040,129 @@
4906
5040
  },
4907
5041
  "required": ["name", "type"]
4908
5042
  },
5043
+ "Trail3D": {
5044
+ "type": "object",
5045
+ "properties": {
5046
+ "name": {
5047
+ "type": "string"
5048
+ },
5049
+ "uid": {
5050
+ "type": "string"
5051
+ },
5052
+ "type": {
5053
+ "const": "Trail3D"
5054
+ },
5055
+ "groups": {
5056
+ "type": "array",
5057
+ "items": {
5058
+ "type": "string"
5059
+ }
5060
+ },
5061
+ "tags": {
5062
+ "type": "object"
5063
+ },
5064
+ "props": {
5065
+ "type": "object",
5066
+ "properties": {
5067
+ "position": {
5068
+ "type": "array",
5069
+ "items": {
5070
+ "type": "number"
5071
+ },
5072
+ "minItems": 3,
5073
+ "maxItems": 3,
5074
+ "default": [0, 0, 0]
5075
+ },
5076
+ "rotation": {
5077
+ "type": "array",
5078
+ "items": {
5079
+ "type": "number"
5080
+ },
5081
+ "minItems": 3,
5082
+ "maxItems": 3,
5083
+ "default": [0, 0, 0]
5084
+ },
5085
+ "static": {
5086
+ "type": "boolean",
5087
+ "default": false
5088
+ },
5089
+ "scale": {
5090
+ "type": "array",
5091
+ "items": {
5092
+ "type": "number"
5093
+ },
5094
+ "minItems": 3,
5095
+ "maxItems": 3,
5096
+ "default": [1, 1, 1]
5097
+ },
5098
+ "visible": {
5099
+ "type": "boolean",
5100
+ "default": true
5101
+ },
5102
+ "renderOrder": {
5103
+ "type": "number",
5104
+ "default": 0
5105
+ },
5106
+ "orderGroup": {
5107
+ "type": "string",
5108
+ "enum": ["background", "terrain", "default", "characters", "effects", "overlay"],
5109
+ "default": "default"
5110
+ },
5111
+ "width": {
5112
+ "type": "number",
5113
+ "default": 0.3
5114
+ },
5115
+ "color": {
5116
+ "type": "string",
5117
+ "default": "#ffffff"
5118
+ },
5119
+ "opacity": {
5120
+ "type": "number",
5121
+ "default": 0.8
5122
+ },
5123
+ "seconds": {
5124
+ "type": "number",
5125
+ "default": 0.6
5126
+ },
5127
+ "emitting": {
5128
+ "type": "boolean",
5129
+ "default": true
5130
+ },
5131
+ "additive": {
5132
+ "type": "boolean",
5133
+ "default": false
5134
+ },
5135
+ "minDistance": {
5136
+ "type": "number",
5137
+ "default": 0.05
5138
+ }
5139
+ },
5140
+ "additionalProperties": false
5141
+ },
5142
+ "script": {
5143
+ "type": "object",
5144
+ "properties": {
5145
+ "name": {
5146
+ "type": "string"
5147
+ },
5148
+ "props": {
5149
+ "type": "object"
5150
+ }
5151
+ },
5152
+ "required": ["name"]
5153
+ },
5154
+ "network": {
5155
+ "type": "object"
5156
+ },
5157
+ "children": {
5158
+ "type": "array",
5159
+ "items": {
5160
+ "$ref": "#/$defs/node"
5161
+ }
5162
+ }
5163
+ },
5164
+ "required": ["name", "type"]
5165
+ },
4909
5166
  "Tree3D": {
4910
5167
  "type": "object",
4911
5168
  "properties": {
@@ -5315,6 +5572,176 @@
5315
5572
  },
5316
5573
  "required": ["name", "type"]
5317
5574
  },
5575
+ "UiButton": {
5576
+ "type": "object",
5577
+ "x-signals": ["pressed"],
5578
+ "properties": {
5579
+ "name": {
5580
+ "type": "string"
5581
+ },
5582
+ "uid": {
5583
+ "type": "string"
5584
+ },
5585
+ "type": {
5586
+ "const": "UiButton"
5587
+ },
5588
+ "groups": {
5589
+ "type": "array",
5590
+ "items": {
5591
+ "type": "string"
5592
+ }
5593
+ },
5594
+ "tags": {
5595
+ "type": "object"
5596
+ },
5597
+ "props": {
5598
+ "type": "object",
5599
+ "properties": {
5600
+ "anchor": {
5601
+ "type": "string",
5602
+ "enum": [
5603
+ "topLeft",
5604
+ "top",
5605
+ "topRight",
5606
+ "left",
5607
+ "center",
5608
+ "right",
5609
+ "bottomLeft",
5610
+ "bottom",
5611
+ "bottomRight"
5612
+ ],
5613
+ "default": "topLeft"
5614
+ },
5615
+ "visible": {
5616
+ "type": "boolean",
5617
+ "default": true
5618
+ },
5619
+ "text": {
5620
+ "type": "string",
5621
+ "default": "OK"
5622
+ },
5623
+ "size": {
5624
+ "type": "number",
5625
+ "default": 16
5626
+ },
5627
+ "color": {
5628
+ "type": "string",
5629
+ "default": "#ffffff"
5630
+ },
5631
+ "background": {
5632
+ "type": "string",
5633
+ "default": "rgba(255,255,255,0.14)"
5634
+ },
5635
+ "disabled": {
5636
+ "type": "boolean",
5637
+ "default": false
5638
+ }
5639
+ },
5640
+ "additionalProperties": false
5641
+ },
5642
+ "script": {
5643
+ "type": "object",
5644
+ "properties": {
5645
+ "name": {
5646
+ "type": "string"
5647
+ },
5648
+ "props": {
5649
+ "type": "object"
5650
+ }
5651
+ },
5652
+ "required": ["name"]
5653
+ },
5654
+ "network": {
5655
+ "type": "object"
5656
+ },
5657
+ "children": {
5658
+ "type": "array",
5659
+ "items": {
5660
+ "$ref": "#/$defs/node"
5661
+ }
5662
+ }
5663
+ },
5664
+ "required": ["name", "type"]
5665
+ },
5666
+ "UiDialogue": {
5667
+ "type": "object",
5668
+ "x-signals": ["lineShown", "choiceMade", "dialogueFinished"],
5669
+ "properties": {
5670
+ "name": {
5671
+ "type": "string"
5672
+ },
5673
+ "uid": {
5674
+ "type": "string"
5675
+ },
5676
+ "type": {
5677
+ "const": "UiDialogue"
5678
+ },
5679
+ "groups": {
5680
+ "type": "array",
5681
+ "items": {
5682
+ "type": "string"
5683
+ }
5684
+ },
5685
+ "tags": {
5686
+ "type": "object"
5687
+ },
5688
+ "props": {
5689
+ "type": "object",
5690
+ "properties": {
5691
+ "anchor": {
5692
+ "type": "string",
5693
+ "enum": [
5694
+ "topLeft",
5695
+ "top",
5696
+ "topRight",
5697
+ "left",
5698
+ "center",
5699
+ "right",
5700
+ "bottomLeft",
5701
+ "bottom",
5702
+ "bottomRight"
5703
+ ],
5704
+ "default": "bottom"
5705
+ },
5706
+ "visible": {
5707
+ "type": "boolean",
5708
+ "default": true
5709
+ },
5710
+ "charsPerSecond": {
5711
+ "type": "number",
5712
+ "default": 40
5713
+ },
5714
+ "width": {
5715
+ "type": "number",
5716
+ "default": 520
5717
+ }
5718
+ },
5719
+ "additionalProperties": false
5720
+ },
5721
+ "script": {
5722
+ "type": "object",
5723
+ "properties": {
5724
+ "name": {
5725
+ "type": "string"
5726
+ },
5727
+ "props": {
5728
+ "type": "object"
5729
+ }
5730
+ },
5731
+ "required": ["name"]
5732
+ },
5733
+ "network": {
5734
+ "type": "object"
5735
+ },
5736
+ "children": {
5737
+ "type": "array",
5738
+ "items": {
5739
+ "$ref": "#/$defs/node"
5740
+ }
5741
+ }
5742
+ },
5743
+ "required": ["name", "type"]
5744
+ },
5318
5745
  "UiText": {
5319
5746
  "type": "object",
5320
5747
  "properties": {
@@ -97,6 +97,20 @@ shambling clip + glowing eyes for an enemy that reads as a different creature.
97
97
  "animation": "$walk", "castShadow": true } }
98
98
  ```
99
99
 
100
+ ## Animations without code
101
+
102
+ Map movement states straight in JSON — no behavior needed:
103
+
104
+ ```json
105
+ { "name": "Controller", "type": "CharacterController3D",
106
+ "props": { "view": "free",
107
+ "animations": { "idle": "$idle", "walk": "$walk", "run": "$run",
108
+ "fastRun": "$sprint", "airborne": "$jump" } } }
109
+ ```
110
+
111
+ The controller writes `skin.animation` on every state change (crossfaded by
112
+ the model). The `movementStateChanged` signal still fires for extras.
113
+
100
114
  The controller also yaw-rotates the sibling at `skinPath` ('../Skin') toward
101
115
  the move direction at `turnSpeed` rad/s (100 = instant snap) — the body
102
116
  itself never rotates. The skin MOUNTS at 180° (facing away from the default
@@ -98,6 +98,29 @@ something up, `hurt` when Health takes damage:
98
98
  > same unlock listener that retries `src` players also resumes the SFX context
99
99
  > (see §2).
100
100
 
101
+ ### Continuous voices — engine hum, wind, thrusters (`startVoice`)
102
+
103
+ One-shot presets can't do a sound that **lasts and retunes** — a motor that
104
+ follows the RPM, wind that rises with speed. `engine.sfx.startVoice(preset)`
105
+ starts a live synth voice you retune every frame:
106
+
107
+ ```ts
108
+ const motor = engine.sfx.startVoice('engine'); // presets: engine | wind | hum | noise
109
+ // per frame (e.g. in a script's update):
110
+ motor.set({ pitch: 0.8 + speed / maxSpeed, volume: throttle * 0.6 });
111
+ // on destroy / scene change:
112
+ motor.stop(); // fades out over 0.15s and frees the WebAudio nodes
113
+ motor.stop(1.2); // …or a slow custom fade
114
+ ```
115
+
116
+ - **`pitch`** — 1 = the preset's base tone; drive it from speed/RPM/height.
117
+ - **`volume`** — 0..1; `startVoice(preset, gain)` sets an overall ceiling.
118
+ - Presets: `engine` (detuned-saw motor growl), `wind` (band-passed rush),
119
+ `hum` (soft pad — shields, auras, reactors), `noise` (thrusters, static).
120
+ - Headless the handle is **inert** (`set`/`stop` are no-ops) — keep the same
121
+ call sites, no `if (browser)` guards. Voices need the same first-gesture
122
+ unlock as everything else.
123
+
101
124
  ---
102
125
 
103
126
  ## 2. The AudioPlayer node (preset vs src file)