star-canvas 0.1.10 → 0.1.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var P=Object.defineProperty;var ee=Object.getOwnPropertyDescriptor;var te=Object.getOwnPropertyNames;var ne=Object.prototype.hasOwnProperty;var re=(a,o)=>{for(var s in o)P(a,s,{get:o[s],enumerable:!0})},oe=(a,o,s,n)=>{if(o&&typeof o=="object"||typeof o=="function")for(let l of te(o))!ne.call(a,l)&&l!==s&&P(a,l,{get:()=>o[l],enumerable:!(n=ee(o,l))||n.enumerable});return a};var ie=a=>oe(P({},"__esModule",{value:!0}),a);var de={};re(de,{createDragState:()=>U,game:()=>le,version:()=>ae});module.exports=ie(de);var ae="0.8.0",W={landscape:{width:640,height:360},portrait:{width:360,height:640},responsive:{}};function U(a){let o=null,s=0,n=0;return{point(l){return a(l)},grab(l,d){let{x,y:I}=a(l);o=d,s=x-d.x,n=I-d.y},move(l){if(o){let{x:d,y:x}=a(l);o.x=d-s,o.y=x-n}},release(){let l=o;return o=null,l},get dragging(){return o}}}function j(){return typeof window<"u"&&typeof document<"u"}function se(){if(!j()||document.getElementById("star-canvas-base"))return;let a=document.createElement("style");a.id="star-canvas-base",a.textContent=`
1
+ "use strict";var S=Object.defineProperty;var B=Object.getOwnPropertyDescriptor;var j=Object.getOwnPropertyNames;var V=Object.prototype.hasOwnProperty;var J=(o,r)=>{for(var a in r)S(o,a,{get:r[a],enumerable:!0})},K=(o,r,a,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let l of j(r))!V.call(o,l)&&l!==a&&S(o,l,{get:()=>r[l],enumerable:!(n=B(r,l))||n.enumerable});return o};var Q=o=>K(S({},"__esModule",{value:!0}),o);var re={};J(re,{createDragState:()=>ee,game:()=>ne,version:()=>Z});module.exports=Q(re);var Z="0.8.0",N={landscape:{width:640,height:360},portrait:{width:360,height:640},responsive:{}};function ee(o){}function $(){return typeof window<"u"&&typeof document<"u"}function te(){if(!$()||document.getElementById("star-canvas-base"))return;let o=document.createElement("style");o.id="star-canvas-base",o.textContent=`
2
2
  html, body { height: 100%; }
3
3
  body {
4
4
  margin: 0; min-height: 100dvh; overflow: hidden; background: #000;
@@ -29,4 +29,4 @@
29
29
  .star-ui textarea, .star-ui [data-interactive] {
30
30
  pointer-events: auto;
31
31
  }
32
- `,document.head.appendChild(a)}function le(a,o={}){j()&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>B(a,o),{once:!0}):queueMicrotask(()=>B(a,o)))}function B(a,o){if(se(),window.__STAR_DOM__?.destroy)try{window.__STAR_DOM__.destroy()}catch{}document.querySelectorAll(".star-ui, .star-canvas, .star-input").forEach(e=>e.remove());let s=document.createElement("div");s.className="star-ui",document.body.appendChild(s);let n=document.createElement("canvas");n.className="star-canvas",document.body.appendChild(n);let l=n.getContext("2d",o.contextAttributes??{alpha:!0});if(!l)throw new Error("[star-canvas] Failed to get 2D context");if(o.preventContextMenu!==!1){let e=t=>t.preventDefault();n.addEventListener("contextmenu",e)}let d=document.createElement("div");d.className="star-input",document.body.appendChild(d);let x=[],I=[],G=[],A=null,w={x:0,y:0,down:!1},S=null,R=[],L=new Map,z=null,M=null;Object.defineProperty(n,"onclick",{get:()=>z,set:e=>{M&&(d.removeEventListener("click",M),M=null),z=e,e&&(M=t=>{O(t)||e.call(n,t)},d.addEventListener("click",M))}});let V=n.addEventListener.bind(n),J=n.removeEventListener.bind(n),H=new WeakMap;function O(e){let t=e;if(t.clientX==null||t.clientY==null)return!1;let r=document.elementFromPoint(t.clientX,t.clientY);return r!==null&&r!==s&&s.contains(r)}let K=/^(click|pointerdown|mousedown|touchstart)$/;n.addEventListener=function(e,t,r){if(/^(click|pointer|mouse|touch)/.test(e)&&typeof t=="function"){let i=K.test(e),c=(u=>{i&&O(u)||t.call(n,u)});H.set(t,c),d.addEventListener(e,c,r)}else V(e,t,r)},n.removeEventListener=function(e,t,r){if(/^(click|pointer|mouse|touch)/.test(e)&&typeof t=="function"){let i=H.get(t);i&&(d.removeEventListener(e,i,r),H.delete(t))}else J(e,t,r)};let Q=o.preset??"landscape",X=W[Q]??W.landscape,T=o.width??X.width,C=o.height??X.height,Y=o.maxPixelRatio??2,$=o.pixelRatio??"device",D=o.fit??"contain",g=1,m=T??1,p=C??1,q=new Set,_=null,b=[];function Z(){return Math.min(typeof $=="number"?Math.max(1,$):Math.max(1,window.devicePixelRatio||1),Y)}function f(){g=Z();let e=document.body.getBoundingClientRect(),t=Math.max(1,Math.floor(e.width||window.innerWidth||800)),r=Math.max(1,Math.floor(e.height||window.innerHeight||600));if(T&&C){m=T,p=C;let u=m/p,v=t/r,h=1;if(D==="contain"?h=v>u?r/p:t/m:D==="cover"&&(h=v>u?t/m:r/p),D==="stretch")n.style.width="100%",n.style.height="100%";else{let y=Math.floor(m*h),N=Math.floor(p*h);n.style.width=`${y}px`,n.style.height=`${N}px`,n.style.position="absolute",n.style.left=`${Math.floor((t-y)/2)}px`,n.style.top=`${Math.floor((r-N)/2)}px`}}else if(C){p=C;let u=t/r;m=Math.floor(p*u),n.style.width="100%",n.style.height="100%",n.style.position="absolute",n.style.left="0",n.style.top="0"}else if(T){m=T;let u=t/r;p=Math.floor(m/u),n.style.width="100%",n.style.height="100%",n.style.position="absolute",n.style.left="0",n.style.top="0"}else m=t,p=r,n.style.width=`${m}px`,n.style.height=`${p}px`,n.style.position="absolute",n.style.left="0",n.style.top="0";let i=Math.max(1,Math.floor(m*g)),c=Math.max(1,Math.floor(p*g));n.width!==i&&(n.width=i),n.height!==c&&(n.height=c),l.setTransform(g,0,0,g,0,0),q.forEach(u=>u())}let F=new ResizeObserver(f);F.observe(document.body),b.push(()=>F.disconnect()),window.addEventListener("resize",f),b.push(()=>window.removeEventListener("resize",f));let k=window.visualViewport;k&&(k.addEventListener("resize",f),b.push(()=>k.removeEventListener("resize",f)));let E={stage:document.body,canvas:n,ctx:l,get width(){return m},get height(){return p},get dpr(){return g},resize:f,toStagePoint:e=>{let t=n.getBoundingClientRect(),r=(e.clientX-t.left)*(m/t.width),i=(e.clientY-t.top)*(p/t.height);return r=Math.max(0,Math.min(m,r)),i=Math.max(0,Math.min(p,i)),{x:r,y:i}},createDrag:()=>U(E.toStagePoint),onTap:e=>{x.push(e)},onMove:e=>{I.push(e)},onRelease:e=>{G.push(e)},get tap(){return A},get pointer(){return w},get released(){return S},get taps(){return R},get pointers(){return Array.from(L.values())},on:(e,t,r,i)=>{if(/^(click|pointer|mouse|touch)/.test(e))try{let v=t.split(",").map(y=>`.star-ui ${y.trim()}`).join(", "),h=document.createElement("style");h.textContent=`${v} { pointer-events: auto; }`,document.head.appendChild(h),b.push(()=>h.remove())}catch{}let c=v=>{let y=v.target?.closest?.(t);y&&r.call(y,v)};document.addEventListener(e,c,i);let u=()=>document.removeEventListener(e,c,i);return b.push(u),u},loop:e=>{let r=0,i=!1,c=0,u=v=>{if(!i)return;let h=c?Math.min((v-c)/1e3,.1):0;c=v;try{e(h,v)}catch(y){console.error("[star-canvas] Game loop error:",y)}A=null,S=null,R=[],r=requestAnimationFrame(u)};return _={get running(){return i},start(){i||(i=!0,c=performance.now(),r=requestAnimationFrame(u))},stop(){i&&(i=!1,cancelAnimationFrame(r))}},_.start(),_},ui:{root:s,render:e=>{s.innerHTML!==e&&(s.innerHTML=e)},el:e=>s.querySelector(e),all:e=>s.querySelectorAll(e)},destroy:()=>{_?.stop(),b.forEach(e=>e()),b=[],q.clear(),n.parentElement&&n.parentElement.removeChild(n),s.parentElement&&s.parentElement.removeChild(s),d.parentElement&&d.parentElement.removeChild(d)},scoped:e=>{l.save();try{e()}finally{l.restore()}}};d.addEventListener("pointerdown",e=>{let t=E.toStagePoint(e);if(w={x:t.x,y:t.y,down:!0},L.set(e.pointerId,{x:t.x,y:t.y,id:e.pointerId,down:!0}),O(e))return;A={x:t.x,y:t.y,time:e.timeStamp},R.push({x:t.x,y:t.y,id:e.pointerId,time:e.timeStamp});let r={...t,event:e};x.forEach(i=>i(r))}),d.addEventListener("pointermove",e=>{let t=E.toStagePoint(e);w={x:t.x,y:t.y,down:w.down};let r=L.get(e.pointerId);r&&L.set(e.pointerId,{...r,x:t.x,y:t.y});let i={...t,event:e};I.forEach(c=>c(i))}),d.addEventListener("pointerup",e=>{let t=E.toStagePoint(e);w={x:t.x,y:t.y,down:!1},S={x:t.x,y:t.y,time:e.timeStamp},L.delete(e.pointerId);let r={...t,event:e};G.forEach(i=>i(r))}),window.__STAR_DOM__={destroy:E.destroy},requestAnimationFrame(()=>requestAnimationFrame(()=>{f();try{a(E)}catch(e){console.error("[star-canvas] Game initialization failed:",e)}}))}0&&(module.exports={createDragState,game,version});
32
+ `,document.head.appendChild(o)}function ne(o,r={}){$()&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>Y(o,r),{once:!0}):queueMicrotask(()=>Y(o,r)))}function Y(o,r){if(te(),window.__STAR_DOM__?.destroy)try{window.__STAR_DOM__.destroy()}catch{}document.querySelectorAll(".star-ui, .star-canvas, .star-input").forEach(e=>e.remove());let a=document.createElement("div");a.className="star-ui",document.body.appendChild(a);let n=document.createElement("canvas");n.className="star-canvas",document.body.appendChild(n);let l=n.getContext("2d",r.contextAttributes??{alpha:!0});if(!l)throw new Error("[star-canvas] Failed to get 2D context");if(r.preventContextMenu!==!1){let e=t=>t.preventDefault();n.addEventListener("contextmenu",e)}let c=document.createElement("div");c.className="star-input",document.body.appendChild(c);let M=[],k=[],ie=[],C=null,x={x:0,y:0,down:!1},A=null,I=[],E=new Map;function q(e){let t=e;if(t.clientX==null||t.clientY==null)return!1;let i=document.elementFromPoint(t.clientX,t.clientY);return i!==null&&i!==a&&a.contains(i)}let U=r.preset??"landscape",P=N[U]??N.landscape,w=r.width??P.width,L=r.height??P.height,D=r.maxPixelRatio??2,G=r.pixelRatio??"device",O=r.fit??"contain",g=1,u=w??1,m=L??1,F=new Set,T=null,f=[];function W(){return Math.min(typeof G=="number"?Math.max(1,G):Math.max(1,window.devicePixelRatio||1),D)}function b(){g=W();let e=document.body.getBoundingClientRect(),t=Math.max(1,Math.floor(e.width||window.innerWidth||800)),i=Math.max(1,Math.floor(e.height||window.innerHeight||600));if(w&&L){u=w,m=L;let d=u/m,p=t/i,v=1;if(O==="contain"?v=p>d?i/m:t/u:O==="cover"&&(v=p>d?t/u:i/m),O==="stretch")n.style.width="100%",n.style.height="100%";else{let y=Math.floor(u*v),_=Math.floor(m*v);n.style.width=`${y}px`,n.style.height=`${_}px`,n.style.position="absolute",n.style.left=`${Math.floor((t-y)/2)}px`,n.style.top=`${Math.floor((i-_)/2)}px`}}else if(L){m=L;let d=t/i;u=Math.floor(m*d),n.style.width="100%",n.style.height="100%",n.style.position="absolute",n.style.left="0",n.style.top="0"}else if(w){u=w;let d=t/i;m=Math.floor(u/d),n.style.width="100%",n.style.height="100%",n.style.position="absolute",n.style.left="0",n.style.top="0"}else u=t,m=i,n.style.width=`${u}px`,n.style.height=`${m}px`,n.style.position="absolute",n.style.left="0",n.style.top="0";let s=Math.max(1,Math.floor(u*g)),h=Math.max(1,Math.floor(m*g));n.width!==s&&(n.width=s),n.height!==h&&(n.height=h),l.setTransform(g,0,0,g,0,0),F.forEach(d=>d())}let z=new ResizeObserver(b);z.observe(document.body),f.push(()=>z.disconnect()),window.addEventListener("resize",b),f.push(()=>window.removeEventListener("resize",b));let H=window.visualViewport;H&&(H.addEventListener("resize",b),f.push(()=>H.removeEventListener("resize",b)));function R(e){let t=n.getBoundingClientRect(),i=(e.clientX-t.left)*(u/t.width),s=(e.clientY-t.top)*(m/t.height);return i=Math.max(0,Math.min(u,i)),s=Math.max(0,Math.min(m,s)),{x:i,y:s}}let X={stage:document.body,canvas:n,ctx:l,get width(){return u},get height(){return m},get dpr(){return g},resize:b,get tap(){return C},get pointer(){return x},get released(){return A},get taps(){return I},get pointers(){return Array.from(E.values())},on:(e,t,i,s)=>{if(/^(click|pointer|mouse|touch)/.test(e))try{let p=t.split(",").map(y=>`.star-ui ${y.trim()}`).join(", "),v=document.createElement("style");v.textContent=`${p} { pointer-events: auto; }`,document.head.appendChild(v),f.push(()=>v.remove())}catch{}let h=p=>{let y=p.target?.closest?.(t);y&&i.call(y,p)};document.addEventListener(e,h,s);let d=()=>document.removeEventListener(e,h,s);return f.push(d),d},loop:e=>{let i=0,s=!1,h=0,d=p=>{if(!s)return;let v=h?Math.min((p-h)/1e3,.1):0;h=p;try{e(v,p)}catch(y){console.error("[star-canvas] Game loop error:",y)}C=null,A=null,I=[],i=requestAnimationFrame(d)};return T={get running(){return s},start(){s||(s=!0,h=performance.now(),i=requestAnimationFrame(d))},stop(){s&&(s=!1,cancelAnimationFrame(i))}},T.start(),T},ui:{root:a,render:e=>{a.innerHTML!==e&&(a.innerHTML=e)},el:e=>a.querySelector(e),all:e=>a.querySelectorAll(e)},destroy:()=>{T?.stop(),f.forEach(e=>e()),f=[],F.clear(),n.parentElement&&n.parentElement.removeChild(n),a.parentElement&&a.parentElement.removeChild(a),c.parentElement&&c.parentElement.removeChild(c)},scoped:e=>{l.save();try{e()}finally{l.restore()}}};c.addEventListener("pointerdown",e=>{let t=R(e);x={x:t.x,y:t.y,down:!0},E.set(e.pointerId,{x:t.x,y:t.y,id:e.pointerId,down:!0}),!q(e)&&(C={x:t.x,y:t.y,time:e.timeStamp},I.push({x:t.x,y:t.y,id:e.pointerId,time:e.timeStamp}))}),c.addEventListener("pointermove",e=>{let t=R(e);x={x:t.x,y:t.y,down:x.down};let i=E.get(e.pointerId);i&&E.set(e.pointerId,{...i,x:t.x,y:t.y})}),c.addEventListener("pointerup",e=>{let t=R(e);x={x:t.x,y:t.y,down:!1},A={x:t.x,y:t.y,time:e.timeStamp},E.delete(e.pointerId)}),window.__STAR_DOM__={destroy:X.destroy},requestAnimationFrame(()=>requestAnimationFrame(()=>{b();try{o(X)}catch(e){console.error("[star-canvas] Game initialization failed:",e)}}))}0&&(module.exports={createDragState,game,version});
package/dist/index.d.cts CHANGED
@@ -37,14 +37,6 @@ interface GameUI {
37
37
  /** Scoped querySelectorAll for the UI root. */
38
38
  all: <T extends Element = HTMLElement>(selector: string) => NodeListOf<T>;
39
39
  }
40
- /** Point with coordinates and the original event */
41
- interface InputPoint {
42
- x: number;
43
- y: number;
44
- event: PointerEvent;
45
- }
46
- /** Input handler type */
47
- type InputHandler = (point: InputPoint) => void;
48
40
  interface GameContext {
49
41
  /** The root <div> element for the canvas. */
50
42
  readonly stage: HTMLElement;
@@ -65,24 +57,6 @@ interface GameContext {
65
57
  /** The dedicated UI overlay manager. */
66
58
  readonly ui: GameUI;
67
59
  /** @deprecated Use g.tap/g.pointer coordinates directly — they're already in canvas-space. */
68
- toStagePoint: (e: {
69
- clientX: number;
70
- clientY: number;
71
- }) => {
72
- x: number;
73
- y: number;
74
- };
75
- /** @deprecated Use g.tap/g.pointer/g.released polling instead. */
76
- createDrag: <T extends {
77
- x: number;
78
- y: number;
79
- }>() => DragState<T>;
80
- /** @deprecated Use g.tap polling in the game loop instead. */
81
- onTap: (handler: InputHandler) => void;
82
- /** @deprecated Use g.pointer polling in the game loop instead. */
83
- onMove: (handler: InputHandler) => void;
84
- /** @deprecated Use g.released polling in the game loop instead. */
85
- onRelease: (handler: InputHandler) => void;
86
60
  /** Tap this frame (pointerdown). Null if none. Canvas-space coords. Read in your game loop. */
87
61
  readonly tap: {
88
62
  x: number;
@@ -164,49 +138,11 @@ interface GameOptions {
164
138
  */
165
139
  preventContextMenu?: boolean;
166
140
  }
167
- /** Drag state helper - handles coordinate conversion and offset tracking */
168
- interface DragState<T extends {
169
- x: number;
170
- y: number;
171
- }> {
172
- /** Convert event to stage coordinates (pure function, no side effects) */
173
- point: (e: {
174
- clientX: number;
175
- clientY: number;
176
- }) => {
177
- x: number;
178
- y: number;
179
- };
180
- /** Start dragging an object - computes offset from cursor to object origin */
181
- grab: (e: {
182
- clientX: number;
183
- clientY: number;
184
- }, obj: T) => void;
185
- /** Update the grabbed object's position based on pointer movement */
186
- move: (e: {
187
- clientX: number;
188
- clientY: number;
189
- }) => void;
190
- /** Release the grabbed object and return it (or null if nothing was grabbed) */
191
- release: () => T | null;
192
- /** The currently grabbed object (or null) */
193
- readonly dragging: T | null;
194
- }
195
141
  /** @deprecated Use g.tap/g.pointer/g.released polling for drag-and-drop instead. */
196
- declare function createDragState<T extends {
197
- x: number;
198
- y: number;
199
- }>(toStagePoint: (e: {
200
- clientX: number;
201
- clientY: number;
202
- }) => {
203
- x: number;
204
- y: number;
205
- }): DragState<T>;
206
142
  /**
207
143
  * The main entry point. Runs setup when the DOM is ready,
208
144
  * providing a safe context for building a game.
209
145
  */
210
146
  declare function game(setup: (g: GameContext) => void, options?: GameOptions): void;
211
147
 
212
- export { type DragState, type GameContext, type GameLoop, type GameOptions, type GameTick, type GameUI, type InputHandler, type InputPoint, createDragState, game, version };
148
+ export { type GameContext, type GameLoop, type GameOptions, type GameTick, type GameUI, game, version };
package/dist/index.d.ts CHANGED
@@ -37,14 +37,6 @@ interface GameUI {
37
37
  /** Scoped querySelectorAll for the UI root. */
38
38
  all: <T extends Element = HTMLElement>(selector: string) => NodeListOf<T>;
39
39
  }
40
- /** Point with coordinates and the original event */
41
- interface InputPoint {
42
- x: number;
43
- y: number;
44
- event: PointerEvent;
45
- }
46
- /** Input handler type */
47
- type InputHandler = (point: InputPoint) => void;
48
40
  interface GameContext {
49
41
  /** The root <div> element for the canvas. */
50
42
  readonly stage: HTMLElement;
@@ -65,24 +57,6 @@ interface GameContext {
65
57
  /** The dedicated UI overlay manager. */
66
58
  readonly ui: GameUI;
67
59
  /** @deprecated Use g.tap/g.pointer coordinates directly — they're already in canvas-space. */
68
- toStagePoint: (e: {
69
- clientX: number;
70
- clientY: number;
71
- }) => {
72
- x: number;
73
- y: number;
74
- };
75
- /** @deprecated Use g.tap/g.pointer/g.released polling instead. */
76
- createDrag: <T extends {
77
- x: number;
78
- y: number;
79
- }>() => DragState<T>;
80
- /** @deprecated Use g.tap polling in the game loop instead. */
81
- onTap: (handler: InputHandler) => void;
82
- /** @deprecated Use g.pointer polling in the game loop instead. */
83
- onMove: (handler: InputHandler) => void;
84
- /** @deprecated Use g.released polling in the game loop instead. */
85
- onRelease: (handler: InputHandler) => void;
86
60
  /** Tap this frame (pointerdown). Null if none. Canvas-space coords. Read in your game loop. */
87
61
  readonly tap: {
88
62
  x: number;
@@ -164,49 +138,11 @@ interface GameOptions {
164
138
  */
165
139
  preventContextMenu?: boolean;
166
140
  }
167
- /** Drag state helper - handles coordinate conversion and offset tracking */
168
- interface DragState<T extends {
169
- x: number;
170
- y: number;
171
- }> {
172
- /** Convert event to stage coordinates (pure function, no side effects) */
173
- point: (e: {
174
- clientX: number;
175
- clientY: number;
176
- }) => {
177
- x: number;
178
- y: number;
179
- };
180
- /** Start dragging an object - computes offset from cursor to object origin */
181
- grab: (e: {
182
- clientX: number;
183
- clientY: number;
184
- }, obj: T) => void;
185
- /** Update the grabbed object's position based on pointer movement */
186
- move: (e: {
187
- clientX: number;
188
- clientY: number;
189
- }) => void;
190
- /** Release the grabbed object and return it (or null if nothing was grabbed) */
191
- release: () => T | null;
192
- /** The currently grabbed object (or null) */
193
- readonly dragging: T | null;
194
- }
195
141
  /** @deprecated Use g.tap/g.pointer/g.released polling for drag-and-drop instead. */
196
- declare function createDragState<T extends {
197
- x: number;
198
- y: number;
199
- }>(toStagePoint: (e: {
200
- clientX: number;
201
- clientY: number;
202
- }) => {
203
- x: number;
204
- y: number;
205
- }): DragState<T>;
206
142
  /**
207
143
  * The main entry point. Runs setup when the DOM is ready,
208
144
  * providing a safe context for building a game.
209
145
  */
210
146
  declare function game(setup: (g: GameContext) => void, options?: GameOptions): void;
211
147
 
212
- export { type DragState, type GameContext, type GameLoop, type GameOptions, type GameTick, type GameUI, type InputHandler, type InputPoint, createDragState, game, version };
148
+ export { type GameContext, type GameLoop, type GameOptions, type GameTick, type GameUI, game, version };
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- var ee="0.8.0",N={landscape:{width:640,height:360},portrait:{width:360,height:640},responsive:{}};function Q(p){let i=null,l=0,n=0;return{point(m){return p(m)},grab(m,a){let{x,y:I}=p(m);i=a,l=x-a.x,n=I-a.y},move(m){if(i){let{x:a,y:x}=p(m);i.x=a-l,i.y=x-n}},release(){let m=i;return i=null,m},get dragging(){return i}}}function B(){return typeof window<"u"&&typeof document<"u"}function Z(){if(!B()||document.getElementById("star-canvas-base"))return;let p=document.createElement("style");p.id="star-canvas-base",p.textContent=`
1
+ var J="0.8.0",X={landscape:{width:640,height:360},portrait:{width:360,height:640},responsive:{}};function K(v){}function Y(){return typeof window<"u"&&typeof document<"u"}function W(){if(!Y()||document.getElementById("star-canvas-base"))return;let v=document.createElement("style");v.id="star-canvas-base",v.textContent=`
2
2
  html, body { height: 100%; }
3
3
  body {
4
4
  margin: 0; min-height: 100dvh; overflow: hidden; background: #000;
@@ -29,4 +29,4 @@ var ee="0.8.0",N={landscape:{width:640,height:360},portrait:{width:360,height:64
29
29
  .star-ui textarea, .star-ui [data-interactive] {
30
30
  pointer-events: auto;
31
31
  }
32
- `,document.head.appendChild(p)}function te(p,i={}){B()&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>W(p,i),{once:!0}):queueMicrotask(()=>W(p,i)))}function W(p,i){if(Z(),window.__STAR_DOM__?.destroy)try{window.__STAR_DOM__.destroy()}catch{}document.querySelectorAll(".star-ui, .star-canvas, .star-input").forEach(e=>e.remove());let l=document.createElement("div");l.className="star-ui",document.body.appendChild(l);let n=document.createElement("canvas");n.className="star-canvas",document.body.appendChild(n);let m=n.getContext("2d",i.contextAttributes??{alpha:!0});if(!m)throw new Error("[star-canvas] Failed to get 2D context");if(i.preventContextMenu!==!1){let e=t=>t.preventDefault();n.addEventListener("contextmenu",e)}let a=document.createElement("div");a.className="star-input",document.body.appendChild(a);let x=[],I=[],P=[],A=null,w={x:0,y:0,down:!1},S=null,R=[],L=new Map,G=null,M=null;Object.defineProperty(n,"onclick",{get:()=>G,set:e=>{M&&(a.removeEventListener("click",M),M=null),G=e,e&&(M=t=>{O(t)||e.call(n,t)},a.addEventListener("click",M))}});let U=n.addEventListener.bind(n),j=n.removeEventListener.bind(n),H=new WeakMap;function O(e){let t=e;if(t.clientX==null||t.clientY==null)return!1;let r=document.elementFromPoint(t.clientX,t.clientY);return r!==null&&r!==l&&l.contains(r)}let V=/^(click|pointerdown|mousedown|touchstart)$/;n.addEventListener=function(e,t,r){if(/^(click|pointer|mouse|touch)/.test(e)&&typeof t=="function"){let o=V.test(e),d=(s=>{o&&O(s)||t.call(n,s)});H.set(t,d),a.addEventListener(e,d,r)}else U(e,t,r)},n.removeEventListener=function(e,t,r){if(/^(click|pointer|mouse|touch)/.test(e)&&typeof t=="function"){let o=H.get(t);o&&(a.removeEventListener(e,o,r),H.delete(t))}else j(e,t,r)};let J=i.preset??"landscape",z=N[J]??N.landscape,T=i.width??z.width,C=i.height??z.height,X=i.maxPixelRatio??2,Y=i.pixelRatio??"device",D=i.fit??"contain",g=1,u=T??1,c=C??1,$=new Set,_=null,b=[];function K(){return Math.min(typeof Y=="number"?Math.max(1,Y):Math.max(1,window.devicePixelRatio||1),X)}function f(){g=K();let e=document.body.getBoundingClientRect(),t=Math.max(1,Math.floor(e.width||window.innerWidth||800)),r=Math.max(1,Math.floor(e.height||window.innerHeight||600));if(T&&C){u=T,c=C;let s=u/c,v=t/r,h=1;if(D==="contain"?h=v>s?r/c:t/u:D==="cover"&&(h=v>s?t/u:r/c),D==="stretch")n.style.width="100%",n.style.height="100%";else{let y=Math.floor(u*h),F=Math.floor(c*h);n.style.width=`${y}px`,n.style.height=`${F}px`,n.style.position="absolute",n.style.left=`${Math.floor((t-y)/2)}px`,n.style.top=`${Math.floor((r-F)/2)}px`}}else if(C){c=C;let s=t/r;u=Math.floor(c*s),n.style.width="100%",n.style.height="100%",n.style.position="absolute",n.style.left="0",n.style.top="0"}else if(T){u=T;let s=t/r;c=Math.floor(u/s),n.style.width="100%",n.style.height="100%",n.style.position="absolute",n.style.left="0",n.style.top="0"}else u=t,c=r,n.style.width=`${u}px`,n.style.height=`${c}px`,n.style.position="absolute",n.style.left="0",n.style.top="0";let o=Math.max(1,Math.floor(u*g)),d=Math.max(1,Math.floor(c*g));n.width!==o&&(n.width=o),n.height!==d&&(n.height=d),m.setTransform(g,0,0,g,0,0),$.forEach(s=>s())}let q=new ResizeObserver(f);q.observe(document.body),b.push(()=>q.disconnect()),window.addEventListener("resize",f),b.push(()=>window.removeEventListener("resize",f));let k=window.visualViewport;k&&(k.addEventListener("resize",f),b.push(()=>k.removeEventListener("resize",f)));let E={stage:document.body,canvas:n,ctx:m,get width(){return u},get height(){return c},get dpr(){return g},resize:f,toStagePoint:e=>{let t=n.getBoundingClientRect(),r=(e.clientX-t.left)*(u/t.width),o=(e.clientY-t.top)*(c/t.height);return r=Math.max(0,Math.min(u,r)),o=Math.max(0,Math.min(c,o)),{x:r,y:o}},createDrag:()=>Q(E.toStagePoint),onTap:e=>{x.push(e)},onMove:e=>{I.push(e)},onRelease:e=>{P.push(e)},get tap(){return A},get pointer(){return w},get released(){return S},get taps(){return R},get pointers(){return Array.from(L.values())},on:(e,t,r,o)=>{if(/^(click|pointer|mouse|touch)/.test(e))try{let v=t.split(",").map(y=>`.star-ui ${y.trim()}`).join(", "),h=document.createElement("style");h.textContent=`${v} { pointer-events: auto; }`,document.head.appendChild(h),b.push(()=>h.remove())}catch{}let d=v=>{let y=v.target?.closest?.(t);y&&r.call(y,v)};document.addEventListener(e,d,o);let s=()=>document.removeEventListener(e,d,o);return b.push(s),s},loop:e=>{let r=0,o=!1,d=0,s=v=>{if(!o)return;let h=d?Math.min((v-d)/1e3,.1):0;d=v;try{e(h,v)}catch(y){console.error("[star-canvas] Game loop error:",y)}A=null,S=null,R=[],r=requestAnimationFrame(s)};return _={get running(){return o},start(){o||(o=!0,d=performance.now(),r=requestAnimationFrame(s))},stop(){o&&(o=!1,cancelAnimationFrame(r))}},_.start(),_},ui:{root:l,render:e=>{l.innerHTML!==e&&(l.innerHTML=e)},el:e=>l.querySelector(e),all:e=>l.querySelectorAll(e)},destroy:()=>{_?.stop(),b.forEach(e=>e()),b=[],$.clear(),n.parentElement&&n.parentElement.removeChild(n),l.parentElement&&l.parentElement.removeChild(l),a.parentElement&&a.parentElement.removeChild(a)},scoped:e=>{m.save();try{e()}finally{m.restore()}}};a.addEventListener("pointerdown",e=>{let t=E.toStagePoint(e);if(w={x:t.x,y:t.y,down:!0},L.set(e.pointerId,{x:t.x,y:t.y,id:e.pointerId,down:!0}),O(e))return;A={x:t.x,y:t.y,time:e.timeStamp},R.push({x:t.x,y:t.y,id:e.pointerId,time:e.timeStamp});let r={...t,event:e};x.forEach(o=>o(r))}),a.addEventListener("pointermove",e=>{let t=E.toStagePoint(e);w={x:t.x,y:t.y,down:w.down};let r=L.get(e.pointerId);r&&L.set(e.pointerId,{...r,x:t.x,y:t.y});let o={...t,event:e};I.forEach(d=>d(o))}),a.addEventListener("pointerup",e=>{let t=E.toStagePoint(e);w={x:t.x,y:t.y,down:!1},S={x:t.x,y:t.y,time:e.timeStamp},L.delete(e.pointerId);let r={...t,event:e};P.forEach(o=>o(r))}),window.__STAR_DOM__={destroy:E.destroy},requestAnimationFrame(()=>requestAnimationFrame(()=>{f();try{p(E)}catch(e){console.error("[star-canvas] Game initialization failed:",e)}}))}export{Q as createDragState,te as game,ee as version};
32
+ `,document.head.appendChild(v)}function Q(v,o={}){Y()&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>N(v,o),{once:!0}):queueMicrotask(()=>N(v,o)))}function N(v,o){if(W(),window.__STAR_DOM__?.destroy)try{window.__STAR_DOM__.destroy()}catch{}document.querySelectorAll(".star-ui, .star-canvas, .star-input").forEach(e=>e.remove());let a=document.createElement("div");a.className="star-ui",document.body.appendChild(a);let n=document.createElement("canvas");n.className="star-canvas",document.body.appendChild(n);let p=n.getContext("2d",o.contextAttributes??{alpha:!0});if(!p)throw new Error("[star-canvas] Failed to get 2D context");if(o.preventContextMenu!==!1){let e=t=>t.preventDefault();n.addEventListener("contextmenu",e)}let l=document.createElement("div");l.className="star-input",document.body.appendChild(l);let M=[],S=[],B=[],C=null,x={x:0,y:0,down:!1},A=null,I=[],E=new Map;function $(e){let t=e;if(t.clientX==null||t.clientY==null)return!1;let r=document.elementFromPoint(t.clientX,t.clientY);return r!==null&&r!==a&&a.contains(r)}let q=o.preset??"landscape",k=X[q]??X.landscape,w=o.width??k.width,L=o.height??k.height,P=o.maxPixelRatio??2,D=o.pixelRatio??"device",O=o.fit??"contain",g=1,d=w??1,c=L??1,G=new Set,T=null,f=[];function U(){return Math.min(typeof D=="number"?Math.max(1,D):Math.max(1,window.devicePixelRatio||1),P)}function b(){g=U();let e=document.body.getBoundingClientRect(),t=Math.max(1,Math.floor(e.width||window.innerWidth||800)),r=Math.max(1,Math.floor(e.height||window.innerHeight||600));if(w&&L){d=w,c=L;let s=d/c,u=t/r,m=1;if(O==="contain"?m=u>s?r/c:t/d:O==="cover"&&(m=u>s?t/d:r/c),O==="stretch")n.style.width="100%",n.style.height="100%";else{let y=Math.floor(d*m),_=Math.floor(c*m);n.style.width=`${y}px`,n.style.height=`${_}px`,n.style.position="absolute",n.style.left=`${Math.floor((t-y)/2)}px`,n.style.top=`${Math.floor((r-_)/2)}px`}}else if(L){c=L;let s=t/r;d=Math.floor(c*s),n.style.width="100%",n.style.height="100%",n.style.position="absolute",n.style.left="0",n.style.top="0"}else if(w){d=w;let s=t/r;c=Math.floor(d/s),n.style.width="100%",n.style.height="100%",n.style.position="absolute",n.style.left="0",n.style.top="0"}else d=t,c=r,n.style.width=`${d}px`,n.style.height=`${c}px`,n.style.position="absolute",n.style.left="0",n.style.top="0";let i=Math.max(1,Math.floor(d*g)),h=Math.max(1,Math.floor(c*g));n.width!==i&&(n.width=i),n.height!==h&&(n.height=h),p.setTransform(g,0,0,g,0,0),G.forEach(s=>s())}let F=new ResizeObserver(b);F.observe(document.body),f.push(()=>F.disconnect()),window.addEventListener("resize",b),f.push(()=>window.removeEventListener("resize",b));let H=window.visualViewport;H&&(H.addEventListener("resize",b),f.push(()=>H.removeEventListener("resize",b)));function R(e){let t=n.getBoundingClientRect(),r=(e.clientX-t.left)*(d/t.width),i=(e.clientY-t.top)*(c/t.height);return r=Math.max(0,Math.min(d,r)),i=Math.max(0,Math.min(c,i)),{x:r,y:i}}let z={stage:document.body,canvas:n,ctx:p,get width(){return d},get height(){return c},get dpr(){return g},resize:b,get tap(){return C},get pointer(){return x},get released(){return A},get taps(){return I},get pointers(){return Array.from(E.values())},on:(e,t,r,i)=>{if(/^(click|pointer|mouse|touch)/.test(e))try{let u=t.split(",").map(y=>`.star-ui ${y.trim()}`).join(", "),m=document.createElement("style");m.textContent=`${u} { pointer-events: auto; }`,document.head.appendChild(m),f.push(()=>m.remove())}catch{}let h=u=>{let y=u.target?.closest?.(t);y&&r.call(y,u)};document.addEventListener(e,h,i);let s=()=>document.removeEventListener(e,h,i);return f.push(s),s},loop:e=>{let r=0,i=!1,h=0,s=u=>{if(!i)return;let m=h?Math.min((u-h)/1e3,.1):0;h=u;try{e(m,u)}catch(y){console.error("[star-canvas] Game loop error:",y)}C=null,A=null,I=[],r=requestAnimationFrame(s)};return T={get running(){return i},start(){i||(i=!0,h=performance.now(),r=requestAnimationFrame(s))},stop(){i&&(i=!1,cancelAnimationFrame(r))}},T.start(),T},ui:{root:a,render:e=>{a.innerHTML!==e&&(a.innerHTML=e)},el:e=>a.querySelector(e),all:e=>a.querySelectorAll(e)},destroy:()=>{T?.stop(),f.forEach(e=>e()),f=[],G.clear(),n.parentElement&&n.parentElement.removeChild(n),a.parentElement&&a.parentElement.removeChild(a),l.parentElement&&l.parentElement.removeChild(l)},scoped:e=>{p.save();try{e()}finally{p.restore()}}};l.addEventListener("pointerdown",e=>{let t=R(e);x={x:t.x,y:t.y,down:!0},E.set(e.pointerId,{x:t.x,y:t.y,id:e.pointerId,down:!0}),!$(e)&&(C={x:t.x,y:t.y,time:e.timeStamp},I.push({x:t.x,y:t.y,id:e.pointerId,time:e.timeStamp}))}),l.addEventListener("pointermove",e=>{let t=R(e);x={x:t.x,y:t.y,down:x.down};let r=E.get(e.pointerId);r&&E.set(e.pointerId,{...r,x:t.x,y:t.y})}),l.addEventListener("pointerup",e=>{let t=R(e);x={x:t.x,y:t.y,down:!1},A={x:t.x,y:t.y,time:e.timeStamp},E.delete(e.pointerId)}),window.__STAR_DOM__={destroy:z.destroy},requestAnimationFrame(()=>requestAnimationFrame(()=>{b();try{v(z)}catch(e){console.error("[star-canvas] Game initialization failed:",e)}}))}export{K as createDragState,Q as game,J as version};
package/dist/legacy.cjs CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var k=Object.defineProperty;var ne=Object.getOwnPropertyDescriptor;var re=Object.getOwnPropertyNames;var oe=Object.prototype.hasOwnProperty;var ie=(a,o)=>{for(var s in o)k(a,s,{get:o[s],enumerable:!0})},ae=(a,o,s,n)=>{if(o&&typeof o=="object"||typeof o=="function")for(let l of re(o))!oe.call(a,l)&&l!==s&&k(a,l,{get:()=>o[l],enumerable:!(n=ne(o,l))||n.enumerable});return a};var se=a=>ae(k({},"__esModule",{value:!0}),a);var ue={};ie(ue,{createDragState:()=>P,game:()=>de,version:()=>j});module.exports=se(ue);var j="0.8.0",U={landscape:{width:640,height:360},portrait:{width:360,height:640},responsive:{}};function P(a){let o=null,s=0,n=0;return{point(l){return a(l)},grab(l,d){let{x,y:I}=a(l);o=d,s=x-d.x,n=I-d.y},move(l){if(o){let{x:d,y:x}=a(l);o.x=d-s,o.y=x-n}},release(){let l=o;return o=null,l},get dragging(){return o}}}function V(){return typeof window<"u"&&typeof document<"u"}function le(){if(!V()||document.getElementById("star-canvas-base"))return;let a=document.createElement("style");a.id="star-canvas-base",a.textContent=`
1
+ "use strict";var S=Object.defineProperty;var J=Object.getOwnPropertyDescriptor;var K=Object.getOwnPropertyNames;var Q=Object.prototype.hasOwnProperty;var Z=(i,r)=>{for(var a in r)S(i,a,{get:r[a],enumerable:!0})},ee=(i,r,a,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let l of K(r))!Q.call(i,l)&&l!==a&&S(i,l,{get:()=>r[l],enumerable:!(n=J(r,l))||n.enumerable});return i};var te=i=>ee(S({},"__esModule",{value:!0}),i);var oe={};Z(oe,{createDragState:()=>q,game:()=>re,version:()=>$});module.exports=te(oe);var $="0.8.0",N={landscape:{width:640,height:360},portrait:{width:360,height:640},responsive:{}};function q(i){}function U(){return typeof window<"u"&&typeof document<"u"}function ne(){if(!U()||document.getElementById("star-canvas-base"))return;let i=document.createElement("style");i.id="star-canvas-base",i.textContent=`
2
2
  html, body { height: 100%; }
3
3
  body {
4
4
  margin: 0; min-height: 100dvh; overflow: hidden; background: #000;
@@ -29,4 +29,4 @@
29
29
  .star-ui textarea, .star-ui [data-interactive] {
30
30
  pointer-events: auto;
31
31
  }
32
- `,document.head.appendChild(a)}function J(a,o={}){V()&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>B(a,o),{once:!0}):queueMicrotask(()=>B(a,o)))}function B(a,o){if(le(),window.__STAR_DOM__?.destroy)try{window.__STAR_DOM__.destroy()}catch{}document.querySelectorAll(".star-ui, .star-canvas, .star-input").forEach(e=>e.remove());let s=document.createElement("div");s.className="star-ui",document.body.appendChild(s);let n=document.createElement("canvas");n.className="star-canvas",document.body.appendChild(n);let l=n.getContext("2d",o.contextAttributes??{alpha:!0});if(!l)throw new Error("[star-canvas] Failed to get 2D context");if(o.preventContextMenu!==!1){let e=t=>t.preventDefault();n.addEventListener("contextmenu",e)}let d=document.createElement("div");d.className="star-input",document.body.appendChild(d);let x=[],I=[],z=[],_=null,w={x:0,y:0,down:!1},A=null,G=[],L=new Map,X=null,M=null;Object.defineProperty(n,"onclick",{get:()=>X,set:e=>{M&&(d.removeEventListener("click",M),M=null),X=e,e&&(M=t=>{R(t)||e.call(n,t)},d.addEventListener("click",M))}});let K=n.addEventListener.bind(n),Q=n.removeEventListener.bind(n),O=new WeakMap;function R(e){let t=e;if(t.clientX==null||t.clientY==null)return!1;let r=document.elementFromPoint(t.clientX,t.clientY);return r!==null&&r!==s&&s.contains(r)}let Z=/^(click|pointerdown|mousedown|touchstart)$/;n.addEventListener=function(e,t,r){if(/^(click|pointer|mouse|touch)/.test(e)&&typeof t=="function"){let i=Z.test(e),c=(u=>{i&&R(u)||t.call(n,u)});O.set(t,c),d.addEventListener(e,c,r)}else K(e,t,r)},n.removeEventListener=function(e,t,r){if(/^(click|pointer|mouse|touch)/.test(e)&&typeof t=="function"){let i=O.get(t);i&&(d.removeEventListener(e,i,r),O.delete(t))}else Q(e,t,r)};let ee=o.preset??"landscape",Y=U[ee]??U.landscape,T=o.width??Y.width,C=o.height??Y.height,$=o.maxPixelRatio??2,q=o.pixelRatio??"device",H=o.fit??"contain",g=1,m=T??1,p=C??1,F=new Set,S=null,b=[];function te(){return Math.min(typeof q=="number"?Math.max(1,q):Math.max(1,window.devicePixelRatio||1),$)}function f(){g=te();let e=document.body.getBoundingClientRect(),t=Math.max(1,Math.floor(e.width||window.innerWidth||800)),r=Math.max(1,Math.floor(e.height||window.innerHeight||600));if(T&&C){m=T,p=C;let u=m/p,v=t/r,h=1;if(H==="contain"?h=v>u?r/p:t/m:H==="cover"&&(h=v>u?t/m:r/p),H==="stretch")n.style.width="100%",n.style.height="100%";else{let y=Math.floor(m*h),W=Math.floor(p*h);n.style.width=`${y}px`,n.style.height=`${W}px`,n.style.position="absolute",n.style.left=`${Math.floor((t-y)/2)}px`,n.style.top=`${Math.floor((r-W)/2)}px`}}else if(C){p=C;let u=t/r;m=Math.floor(p*u),n.style.width="100%",n.style.height="100%",n.style.position="absolute",n.style.left="0",n.style.top="0"}else if(T){m=T;let u=t/r;p=Math.floor(m/u),n.style.width="100%",n.style.height="100%",n.style.position="absolute",n.style.left="0",n.style.top="0"}else m=t,p=r,n.style.width=`${m}px`,n.style.height=`${p}px`,n.style.position="absolute",n.style.left="0",n.style.top="0";let i=Math.max(1,Math.floor(m*g)),c=Math.max(1,Math.floor(p*g));n.width!==i&&(n.width=i),n.height!==c&&(n.height=c),l.setTransform(g,0,0,g,0,0),F.forEach(u=>u())}let N=new ResizeObserver(f);N.observe(document.body),b.push(()=>N.disconnect()),window.addEventListener("resize",f),b.push(()=>window.removeEventListener("resize",f));let D=window.visualViewport;D&&(D.addEventListener("resize",f),b.push(()=>D.removeEventListener("resize",f)));let E={stage:document.body,canvas:n,ctx:l,get width(){return m},get height(){return p},get dpr(){return g},resize:f,toStagePoint:e=>{let t=n.getBoundingClientRect(),r=(e.clientX-t.left)*(m/t.width),i=(e.clientY-t.top)*(p/t.height);return r=Math.max(0,Math.min(m,r)),i=Math.max(0,Math.min(p,i)),{x:r,y:i}},createDrag:()=>P(E.toStagePoint),onTap:e=>{x.push(e)},onMove:e=>{I.push(e)},onRelease:e=>{z.push(e)},get tap(){return _},get pointer(){return w},get released(){return A},get taps(){return G},get pointers(){return Array.from(L.values())},on:(e,t,r,i)=>{if(/^(click|pointer|mouse|touch)/.test(e))try{let v=t.split(",").map(y=>`.star-ui ${y.trim()}`).join(", "),h=document.createElement("style");h.textContent=`${v} { pointer-events: auto; }`,document.head.appendChild(h),b.push(()=>h.remove())}catch{}let c=v=>{let y=v.target?.closest?.(t);y&&r.call(y,v)};document.addEventListener(e,c,i);let u=()=>document.removeEventListener(e,c,i);return b.push(u),u},loop:e=>{let r=0,i=!1,c=0,u=v=>{if(!i)return;let h=c?Math.min((v-c)/1e3,.1):0;c=v;try{e(h,v)}catch(y){console.error("[star-canvas] Game loop error:",y)}_=null,A=null,G=[],r=requestAnimationFrame(u)};return S={get running(){return i},start(){i||(i=!0,c=performance.now(),r=requestAnimationFrame(u))},stop(){i&&(i=!1,cancelAnimationFrame(r))}},S.start(),S},ui:{root:s,render:e=>{s.innerHTML!==e&&(s.innerHTML=e)},el:e=>s.querySelector(e),all:e=>s.querySelectorAll(e)},destroy:()=>{S?.stop(),b.forEach(e=>e()),b=[],F.clear(),n.parentElement&&n.parentElement.removeChild(n),s.parentElement&&s.parentElement.removeChild(s),d.parentElement&&d.parentElement.removeChild(d)},scoped:e=>{l.save();try{e()}finally{l.restore()}}};d.addEventListener("pointerdown",e=>{let t=E.toStagePoint(e);if(w={x:t.x,y:t.y,down:!0},L.set(e.pointerId,{x:t.x,y:t.y,id:e.pointerId,down:!0}),R(e))return;_={x:t.x,y:t.y,time:e.timeStamp},G.push({x:t.x,y:t.y,id:e.pointerId,time:e.timeStamp});let r={...t,event:e};x.forEach(i=>i(r))}),d.addEventListener("pointermove",e=>{let t=E.toStagePoint(e);w={x:t.x,y:t.y,down:w.down};let r=L.get(e.pointerId);r&&L.set(e.pointerId,{...r,x:t.x,y:t.y});let i={...t,event:e};I.forEach(c=>c(i))}),d.addEventListener("pointerup",e=>{let t=E.toStagePoint(e);w={x:t.x,y:t.y,down:!1},A={x:t.x,y:t.y,time:e.timeStamp},L.delete(e.pointerId);let r={...t,event:e};z.forEach(i=>i(r))}),window.__STAR_DOM__={destroy:E.destroy},requestAnimationFrame(()=>requestAnimationFrame(()=>{f();try{a(E)}catch(e){console.error("[star-canvas] Game initialization failed:",e)}}))}function de(a,o={}){let s={preset:"responsive",...o};return J(a,s)}0&&(module.exports={createDragState,game,version});
32
+ `,document.head.appendChild(i)}function W(i,r={}){U()&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>Y(i,r),{once:!0}):queueMicrotask(()=>Y(i,r)))}function Y(i,r){if(ne(),window.__STAR_DOM__?.destroy)try{window.__STAR_DOM__.destroy()}catch{}document.querySelectorAll(".star-ui, .star-canvas, .star-input").forEach(e=>e.remove());let a=document.createElement("div");a.className="star-ui",document.body.appendChild(a);let n=document.createElement("canvas");n.className="star-canvas",document.body.appendChild(n);let l=n.getContext("2d",r.contextAttributes??{alpha:!0});if(!l)throw new Error("[star-canvas] Failed to get 2D context");if(r.preventContextMenu!==!1){let e=t=>t.preventDefault();n.addEventListener("contextmenu",e)}let c=document.createElement("div");c.className="star-input",document.body.appendChild(c);let M=[],k=[],ie=[],C=null,x={x:0,y:0,down:!1},O=null,I=[],E=new Map;function B(e){let t=e;if(t.clientX==null||t.clientY==null)return!1;let o=document.elementFromPoint(t.clientX,t.clientY);return o!==null&&o!==a&&a.contains(o)}let j=r.preset??"landscape",G=N[j]??N.landscape,w=r.width??G.width,L=r.height??G.height,D=r.maxPixelRatio??2,P=r.pixelRatio??"device",A=r.fit??"contain",g=1,u=w??1,p=L??1,F=new Set,T=null,f=[];function V(){return Math.min(typeof P=="number"?Math.max(1,P):Math.max(1,window.devicePixelRatio||1),D)}function b(){g=V();let e=document.body.getBoundingClientRect(),t=Math.max(1,Math.floor(e.width||window.innerWidth||800)),o=Math.max(1,Math.floor(e.height||window.innerHeight||600));if(w&&L){u=w,p=L;let d=u/p,m=t/o,v=1;if(A==="contain"?v=m>d?o/p:t/u:A==="cover"&&(v=m>d?t/u:o/p),A==="stretch")n.style.width="100%",n.style.height="100%";else{let h=Math.floor(u*v),_=Math.floor(p*v);n.style.width=`${h}px`,n.style.height=`${_}px`,n.style.position="absolute",n.style.left=`${Math.floor((t-h)/2)}px`,n.style.top=`${Math.floor((o-_)/2)}px`}}else if(L){p=L;let d=t/o;u=Math.floor(p*d),n.style.width="100%",n.style.height="100%",n.style.position="absolute",n.style.left="0",n.style.top="0"}else if(w){u=w;let d=t/o;p=Math.floor(u/d),n.style.width="100%",n.style.height="100%",n.style.position="absolute",n.style.left="0",n.style.top="0"}else u=t,p=o,n.style.width=`${u}px`,n.style.height=`${p}px`,n.style.position="absolute",n.style.left="0",n.style.top="0";let s=Math.max(1,Math.floor(u*g)),y=Math.max(1,Math.floor(p*g));n.width!==s&&(n.width=s),n.height!==y&&(n.height=y),l.setTransform(g,0,0,g,0,0),F.forEach(d=>d())}let z=new ResizeObserver(b);z.observe(document.body),f.push(()=>z.disconnect()),window.addEventListener("resize",b),f.push(()=>window.removeEventListener("resize",b));let H=window.visualViewport;H&&(H.addEventListener("resize",b),f.push(()=>H.removeEventListener("resize",b)));function R(e){let t=n.getBoundingClientRect(),o=(e.clientX-t.left)*(u/t.width),s=(e.clientY-t.top)*(p/t.height);return o=Math.max(0,Math.min(u,o)),s=Math.max(0,Math.min(p,s)),{x:o,y:s}}let X={stage:document.body,canvas:n,ctx:l,get width(){return u},get height(){return p},get dpr(){return g},resize:b,get tap(){return C},get pointer(){return x},get released(){return O},get taps(){return I},get pointers(){return Array.from(E.values())},on:(e,t,o,s)=>{if(/^(click|pointer|mouse|touch)/.test(e))try{let m=t.split(",").map(h=>`.star-ui ${h.trim()}`).join(", "),v=document.createElement("style");v.textContent=`${m} { pointer-events: auto; }`,document.head.appendChild(v),f.push(()=>v.remove())}catch{}let y=m=>{let h=m.target?.closest?.(t);h&&o.call(h,m)};document.addEventListener(e,y,s);let d=()=>document.removeEventListener(e,y,s);return f.push(d),d},loop:e=>{let o=0,s=!1,y=0,d=m=>{if(!s)return;let v=y?Math.min((m-y)/1e3,.1):0;y=m;try{e(v,m)}catch(h){console.error("[star-canvas] Game loop error:",h)}C=null,O=null,I=[],o=requestAnimationFrame(d)};return T={get running(){return s},start(){s||(s=!0,y=performance.now(),o=requestAnimationFrame(d))},stop(){s&&(s=!1,cancelAnimationFrame(o))}},T.start(),T},ui:{root:a,render:e=>{a.innerHTML!==e&&(a.innerHTML=e)},el:e=>a.querySelector(e),all:e=>a.querySelectorAll(e)},destroy:()=>{T?.stop(),f.forEach(e=>e()),f=[],F.clear(),n.parentElement&&n.parentElement.removeChild(n),a.parentElement&&a.parentElement.removeChild(a),c.parentElement&&c.parentElement.removeChild(c)},scoped:e=>{l.save();try{e()}finally{l.restore()}}};c.addEventListener("pointerdown",e=>{let t=R(e);x={x:t.x,y:t.y,down:!0},E.set(e.pointerId,{x:t.x,y:t.y,id:e.pointerId,down:!0}),!B(e)&&(C={x:t.x,y:t.y,time:e.timeStamp},I.push({x:t.x,y:t.y,id:e.pointerId,time:e.timeStamp}))}),c.addEventListener("pointermove",e=>{let t=R(e);x={x:t.x,y:t.y,down:x.down};let o=E.get(e.pointerId);o&&E.set(e.pointerId,{...o,x:t.x,y:t.y})}),c.addEventListener("pointerup",e=>{let t=R(e);x={x:t.x,y:t.y,down:!1},O={x:t.x,y:t.y,time:e.timeStamp},E.delete(e.pointerId)}),window.__STAR_DOM__={destroy:X.destroy},requestAnimationFrame(()=>requestAnimationFrame(()=>{b();try{i(X)}catch(e){console.error("[star-canvas] Game initialization failed:",e)}}))}function re(i,r={}){let a={preset:"responsive",...r};return W(i,a)}0&&(module.exports={createDragState,game,version});
package/dist/legacy.d.cts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { GameContext, GameOptions } from './index.cjs';
2
- export { DragState, GameLoop, GameTick, GameUI, createDragState, version } from './index.cjs';
2
+ export { DragState, GameLoop, GameTick, GameUI, version } from './index.cjs';
3
3
 
4
4
  /**
5
5
  * Star DOM SDK - Legacy Entry Point
package/dist/legacy.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { GameContext, GameOptions } from './index.js';
2
- export { DragState, GameLoop, GameTick, GameUI, createDragState, version } from './index.js';
2
+ export { DragState, GameLoop, GameTick, GameUI, version } from './index.js';
3
3
 
4
4
  /**
5
5
  * Star DOM SDK - Legacy Entry Point
package/dist/legacy.mjs CHANGED
@@ -1,4 +1,4 @@
1
- var ee="0.8.0",N={landscape:{width:640,height:360},portrait:{width:360,height:640},responsive:{}};function U(u){let i=null,s=0,n=0;return{point(p){return u(p)},grab(p,a){let{x,y:I}=u(p);i=a,s=x-a.x,n=I-a.y},move(p){if(i){let{x:a,y:x}=u(p);i.x=a-s,i.y=x-n}},release(){let p=i;return i=null,p},get dragging(){return i}}}function B(){return typeof window<"u"&&typeof document<"u"}function te(){if(!B()||document.getElementById("star-canvas-base"))return;let u=document.createElement("style");u.id="star-canvas-base",u.textContent=`
1
+ var B="0.8.0",X={landscape:{width:640,height:360},portrait:{width:360,height:640},responsive:{}};function j(l){}function Y(){return typeof window<"u"&&typeof document<"u"}function V(){if(!Y()||document.getElementById("star-canvas-base"))return;let l=document.createElement("style");l.id="star-canvas-base",l.textContent=`
2
2
  html, body { height: 100%; }
3
3
  body {
4
4
  margin: 0; min-height: 100dvh; overflow: hidden; background: #000;
@@ -29,4 +29,4 @@ var ee="0.8.0",N={landscape:{width:640,height:360},portrait:{width:360,height:64
29
29
  .star-ui textarea, .star-ui [data-interactive] {
30
30
  pointer-events: auto;
31
31
  }
32
- `,document.head.appendChild(u)}function j(u,i={}){B()&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>W(u,i),{once:!0}):queueMicrotask(()=>W(u,i)))}function W(u,i){if(te(),window.__STAR_DOM__?.destroy)try{window.__STAR_DOM__.destroy()}catch{}document.querySelectorAll(".star-ui, .star-canvas, .star-input").forEach(e=>e.remove());let s=document.createElement("div");s.className="star-ui",document.body.appendChild(s);let n=document.createElement("canvas");n.className="star-canvas",document.body.appendChild(n);let p=n.getContext("2d",i.contextAttributes??{alpha:!0});if(!p)throw new Error("[star-canvas] Failed to get 2D context");if(i.preventContextMenu!==!1){let e=t=>t.preventDefault();n.addEventListener("contextmenu",e)}let a=document.createElement("div");a.className="star-input",document.body.appendChild(a);let x=[],I=[],k=[],_=null,w={x:0,y:0,down:!1},A=null,G=[],L=new Map,P=null,M=null;Object.defineProperty(n,"onclick",{get:()=>P,set:e=>{M&&(a.removeEventListener("click",M),M=null),P=e,e&&(M=t=>{R(t)||e.call(n,t)},a.addEventListener("click",M))}});let V=n.addEventListener.bind(n),J=n.removeEventListener.bind(n),O=new WeakMap;function R(e){let t=e;if(t.clientX==null||t.clientY==null)return!1;let r=document.elementFromPoint(t.clientX,t.clientY);return r!==null&&r!==s&&s.contains(r)}let K=/^(click|pointerdown|mousedown|touchstart)$/;n.addEventListener=function(e,t,r){if(/^(click|pointer|mouse|touch)/.test(e)&&typeof t=="function"){let o=K.test(e),d=(l=>{o&&R(l)||t.call(n,l)});O.set(t,d),a.addEventListener(e,d,r)}else V(e,t,r)},n.removeEventListener=function(e,t,r){if(/^(click|pointer|mouse|touch)/.test(e)&&typeof t=="function"){let o=O.get(t);o&&(a.removeEventListener(e,o,r),O.delete(t))}else J(e,t,r)};let Q=i.preset??"landscape",z=N[Q]??N.landscape,T=i.width??z.width,C=i.height??z.height,X=i.maxPixelRatio??2,Y=i.pixelRatio??"device",H=i.fit??"contain",g=1,c=T??1,m=C??1,$=new Set,S=null,b=[];function Z(){return Math.min(typeof Y=="number"?Math.max(1,Y):Math.max(1,window.devicePixelRatio||1),X)}function f(){g=Z();let e=document.body.getBoundingClientRect(),t=Math.max(1,Math.floor(e.width||window.innerWidth||800)),r=Math.max(1,Math.floor(e.height||window.innerHeight||600));if(T&&C){c=T,m=C;let l=c/m,v=t/r,h=1;if(H==="contain"?h=v>l?r/m:t/c:H==="cover"&&(h=v>l?t/c:r/m),H==="stretch")n.style.width="100%",n.style.height="100%";else{let y=Math.floor(c*h),F=Math.floor(m*h);n.style.width=`${y}px`,n.style.height=`${F}px`,n.style.position="absolute",n.style.left=`${Math.floor((t-y)/2)}px`,n.style.top=`${Math.floor((r-F)/2)}px`}}else if(C){m=C;let l=t/r;c=Math.floor(m*l),n.style.width="100%",n.style.height="100%",n.style.position="absolute",n.style.left="0",n.style.top="0"}else if(T){c=T;let l=t/r;m=Math.floor(c/l),n.style.width="100%",n.style.height="100%",n.style.position="absolute",n.style.left="0",n.style.top="0"}else c=t,m=r,n.style.width=`${c}px`,n.style.height=`${m}px`,n.style.position="absolute",n.style.left="0",n.style.top="0";let o=Math.max(1,Math.floor(c*g)),d=Math.max(1,Math.floor(m*g));n.width!==o&&(n.width=o),n.height!==d&&(n.height=d),p.setTransform(g,0,0,g,0,0),$.forEach(l=>l())}let q=new ResizeObserver(f);q.observe(document.body),b.push(()=>q.disconnect()),window.addEventListener("resize",f),b.push(()=>window.removeEventListener("resize",f));let D=window.visualViewport;D&&(D.addEventListener("resize",f),b.push(()=>D.removeEventListener("resize",f)));let E={stage:document.body,canvas:n,ctx:p,get width(){return c},get height(){return m},get dpr(){return g},resize:f,toStagePoint:e=>{let t=n.getBoundingClientRect(),r=(e.clientX-t.left)*(c/t.width),o=(e.clientY-t.top)*(m/t.height);return r=Math.max(0,Math.min(c,r)),o=Math.max(0,Math.min(m,o)),{x:r,y:o}},createDrag:()=>U(E.toStagePoint),onTap:e=>{x.push(e)},onMove:e=>{I.push(e)},onRelease:e=>{k.push(e)},get tap(){return _},get pointer(){return w},get released(){return A},get taps(){return G},get pointers(){return Array.from(L.values())},on:(e,t,r,o)=>{if(/^(click|pointer|mouse|touch)/.test(e))try{let v=t.split(",").map(y=>`.star-ui ${y.trim()}`).join(", "),h=document.createElement("style");h.textContent=`${v} { pointer-events: auto; }`,document.head.appendChild(h),b.push(()=>h.remove())}catch{}let d=v=>{let y=v.target?.closest?.(t);y&&r.call(y,v)};document.addEventListener(e,d,o);let l=()=>document.removeEventListener(e,d,o);return b.push(l),l},loop:e=>{let r=0,o=!1,d=0,l=v=>{if(!o)return;let h=d?Math.min((v-d)/1e3,.1):0;d=v;try{e(h,v)}catch(y){console.error("[star-canvas] Game loop error:",y)}_=null,A=null,G=[],r=requestAnimationFrame(l)};return S={get running(){return o},start(){o||(o=!0,d=performance.now(),r=requestAnimationFrame(l))},stop(){o&&(o=!1,cancelAnimationFrame(r))}},S.start(),S},ui:{root:s,render:e=>{s.innerHTML!==e&&(s.innerHTML=e)},el:e=>s.querySelector(e),all:e=>s.querySelectorAll(e)},destroy:()=>{S?.stop(),b.forEach(e=>e()),b=[],$.clear(),n.parentElement&&n.parentElement.removeChild(n),s.parentElement&&s.parentElement.removeChild(s),a.parentElement&&a.parentElement.removeChild(a)},scoped:e=>{p.save();try{e()}finally{p.restore()}}};a.addEventListener("pointerdown",e=>{let t=E.toStagePoint(e);if(w={x:t.x,y:t.y,down:!0},L.set(e.pointerId,{x:t.x,y:t.y,id:e.pointerId,down:!0}),R(e))return;_={x:t.x,y:t.y,time:e.timeStamp},G.push({x:t.x,y:t.y,id:e.pointerId,time:e.timeStamp});let r={...t,event:e};x.forEach(o=>o(r))}),a.addEventListener("pointermove",e=>{let t=E.toStagePoint(e);w={x:t.x,y:t.y,down:w.down};let r=L.get(e.pointerId);r&&L.set(e.pointerId,{...r,x:t.x,y:t.y});let o={...t,event:e};I.forEach(d=>d(o))}),a.addEventListener("pointerup",e=>{let t=E.toStagePoint(e);w={x:t.x,y:t.y,down:!1},A={x:t.x,y:t.y,time:e.timeStamp},L.delete(e.pointerId);let r={...t,event:e};k.forEach(o=>o(r))}),window.__STAR_DOM__={destroy:E.destroy},requestAnimationFrame(()=>requestAnimationFrame(()=>{f();try{u(E)}catch(e){console.error("[star-canvas] Game initialization failed:",e)}}))}function oe(u,i={}){let s={preset:"responsive",...i};return j(u,s)}export{U as createDragState,oe as game,ee as version};
32
+ `,document.head.appendChild(l)}function $(l,o={}){Y()&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>N(l,o),{once:!0}):queueMicrotask(()=>N(l,o)))}function N(l,o){if(V(),window.__STAR_DOM__?.destroy)try{window.__STAR_DOM__.destroy()}catch{}document.querySelectorAll(".star-ui, .star-canvas, .star-input").forEach(e=>e.remove());let a=document.createElement("div");a.className="star-ui",document.body.appendChild(a);let n=document.createElement("canvas");n.className="star-canvas",document.body.appendChild(n);let v=n.getContext("2d",o.contextAttributes??{alpha:!0});if(!v)throw new Error("[star-canvas] Failed to get 2D context");if(o.preventContextMenu!==!1){let e=t=>t.preventDefault();n.addEventListener("contextmenu",e)}let d=document.createElement("div");d.className="star-input",document.body.appendChild(d);let M=[],S=[],J=[],C=null,x={x:0,y:0,down:!1},O=null,I=[],E=new Map;function q(e){let t=e;if(t.clientX==null||t.clientY==null)return!1;let r=document.elementFromPoint(t.clientX,t.clientY);return r!==null&&r!==a&&a.contains(r)}let U=o.preset??"landscape",k=X[U]??X.landscape,w=o.width??k.width,L=o.height??k.height,G=o.maxPixelRatio??2,D=o.pixelRatio??"device",A=o.fit??"contain",g=1,c=w??1,u=L??1,P=new Set,T=null,f=[];function W(){return Math.min(typeof D=="number"?Math.max(1,D):Math.max(1,window.devicePixelRatio||1),G)}function b(){g=W();let e=document.body.getBoundingClientRect(),t=Math.max(1,Math.floor(e.width||window.innerWidth||800)),r=Math.max(1,Math.floor(e.height||window.innerHeight||600));if(w&&L){c=w,u=L;let s=c/u,p=t/r,m=1;if(A==="contain"?m=p>s?r/u:t/c:A==="cover"&&(m=p>s?t/c:r/u),A==="stretch")n.style.width="100%",n.style.height="100%";else{let h=Math.floor(c*m),_=Math.floor(u*m);n.style.width=`${h}px`,n.style.height=`${_}px`,n.style.position="absolute",n.style.left=`${Math.floor((t-h)/2)}px`,n.style.top=`${Math.floor((r-_)/2)}px`}}else if(L){u=L;let s=t/r;c=Math.floor(u*s),n.style.width="100%",n.style.height="100%",n.style.position="absolute",n.style.left="0",n.style.top="0"}else if(w){c=w;let s=t/r;u=Math.floor(c/s),n.style.width="100%",n.style.height="100%",n.style.position="absolute",n.style.left="0",n.style.top="0"}else c=t,u=r,n.style.width=`${c}px`,n.style.height=`${u}px`,n.style.position="absolute",n.style.left="0",n.style.top="0";let i=Math.max(1,Math.floor(c*g)),y=Math.max(1,Math.floor(u*g));n.width!==i&&(n.width=i),n.height!==y&&(n.height=y),v.setTransform(g,0,0,g,0,0),P.forEach(s=>s())}let F=new ResizeObserver(b);F.observe(document.body),f.push(()=>F.disconnect()),window.addEventListener("resize",b),f.push(()=>window.removeEventListener("resize",b));let H=window.visualViewport;H&&(H.addEventListener("resize",b),f.push(()=>H.removeEventListener("resize",b)));function R(e){let t=n.getBoundingClientRect(),r=(e.clientX-t.left)*(c/t.width),i=(e.clientY-t.top)*(u/t.height);return r=Math.max(0,Math.min(c,r)),i=Math.max(0,Math.min(u,i)),{x:r,y:i}}let z={stage:document.body,canvas:n,ctx:v,get width(){return c},get height(){return u},get dpr(){return g},resize:b,get tap(){return C},get pointer(){return x},get released(){return O},get taps(){return I},get pointers(){return Array.from(E.values())},on:(e,t,r,i)=>{if(/^(click|pointer|mouse|touch)/.test(e))try{let p=t.split(",").map(h=>`.star-ui ${h.trim()}`).join(", "),m=document.createElement("style");m.textContent=`${p} { pointer-events: auto; }`,document.head.appendChild(m),f.push(()=>m.remove())}catch{}let y=p=>{let h=p.target?.closest?.(t);h&&r.call(h,p)};document.addEventListener(e,y,i);let s=()=>document.removeEventListener(e,y,i);return f.push(s),s},loop:e=>{let r=0,i=!1,y=0,s=p=>{if(!i)return;let m=y?Math.min((p-y)/1e3,.1):0;y=p;try{e(m,p)}catch(h){console.error("[star-canvas] Game loop error:",h)}C=null,O=null,I=[],r=requestAnimationFrame(s)};return T={get running(){return i},start(){i||(i=!0,y=performance.now(),r=requestAnimationFrame(s))},stop(){i&&(i=!1,cancelAnimationFrame(r))}},T.start(),T},ui:{root:a,render:e=>{a.innerHTML!==e&&(a.innerHTML=e)},el:e=>a.querySelector(e),all:e=>a.querySelectorAll(e)},destroy:()=>{T?.stop(),f.forEach(e=>e()),f=[],P.clear(),n.parentElement&&n.parentElement.removeChild(n),a.parentElement&&a.parentElement.removeChild(a),d.parentElement&&d.parentElement.removeChild(d)},scoped:e=>{v.save();try{e()}finally{v.restore()}}};d.addEventListener("pointerdown",e=>{let t=R(e);x={x:t.x,y:t.y,down:!0},E.set(e.pointerId,{x:t.x,y:t.y,id:e.pointerId,down:!0}),!q(e)&&(C={x:t.x,y:t.y,time:e.timeStamp},I.push({x:t.x,y:t.y,id:e.pointerId,time:e.timeStamp}))}),d.addEventListener("pointermove",e=>{let t=R(e);x={x:t.x,y:t.y,down:x.down};let r=E.get(e.pointerId);r&&E.set(e.pointerId,{...r,x:t.x,y:t.y})}),d.addEventListener("pointerup",e=>{let t=R(e);x={x:t.x,y:t.y,down:!1},O={x:t.x,y:t.y,time:e.timeStamp},E.delete(e.pointerId)}),window.__STAR_DOM__={destroy:z.destroy},requestAnimationFrame(()=>requestAnimationFrame(()=>{b();try{l(z)}catch(e){console.error("[star-canvas] Game initialization failed:",e)}}))}function te(l,o={}){let a={preset:"responsive",...o};return $(l,a)}export{j as createDragState,te as game,B as version};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "star-canvas",
3
- "version": "0.1.10",
3
+ "version": "0.1.12",
4
4
  "private": false,
5
5
  "description": "Canvas game utilities for reliable game initialization - part of Star SDK.",
6
6
  "type": "module",
@@ -46,7 +46,7 @@
46
46
  "scripts": {
47
47
  "build": "tsup",
48
48
  "clean": "rm -rf dist",
49
- "prepublishOnly": "node ../../apps/web/scripts/process-sdks.js --package star-canvas --public-only && yarn build"
49
+ "prepublishOnly": "node ../../apps/web/scripts/process-sdks.js --package star-canvas --public-only && yarn build && node scripts/strip-platform-types.cjs && node scripts/verify-no-platform-code.cjs"
50
50
  },
51
51
  "license": "MIT",
52
52
  "homepage": "https://buildwithstar.com/docs/sdk",