@mblinkov/whats-missing 20.0.31 → 20.0.32

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.
@@ -1,9 +1,9 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),o=require("react"),ge=window.origin+"/cloud/speakid/games/whatsmissing/",Y=(r,m)=>r.map(([l,i])=>({src:`${ge}${m}/${i.replace(/\s/g,"%20")}.png`,name:i})),he=[["apple","apple"],["banana","banana"],["bread","bread"],["burger","burger"],["cake","cake"],["carrot","carrot"],["cheese","cheese"],["chicken","chicken"],["chocolate","chocolate"],["corn","corn"],["donut","donut"],["fish","fish"],["fries","fries"],["grapes","grapes"],["ice_cream","ice cream"],["milk","milk"],["orange","orange"],["pear","pear"],["pizza","pizza"],["rice","rice"],["sandwich","sandwich"],["soup","soup"],["strawberry","strawberry"],["tomato","tomato"],["watermelon","watermelon"]],fe=[["bear","bear"],["cat","cat"],["crocodile","crocodile"],["dolphin","dolphin"],["elephant","elephant"],["fox","fox"],["giraffe","giraffe"],["horse","horse"],["kangaroo","kangaroo"],["lion","lion"],["monkey","monkey"],["owl","owl"],["panda","panda"],["penguin","penguin"],["squirrel","squirrel"],["tiger","tiger"],["tortoise","tortoise"],["wolf","wolf"],["zebra","zebra"]],pe=[["ball","ball"],["balloon","balloon"],["blocks","blocks"],["car","car"],["doll","doll"],["drum","drum"],["guitar","guitar"],["jump_rope","jump rope"],["kite","kite"],["paints","paints"],["plane","plane"],["puzzle","puzzle"],["rocket","rocket"],["scooter","scooter"],["skateboard","skateboard"],["slide","slide"],["teddy_bear","teddy bear"],["yo-yo","yo-yo"],["crayons","crayons"]],P={food:Y(he,"food"),animals:Y(fe,"animals"),toys:Y(pe,"toys")},ye=`
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),s=require("react"),he=window.origin+"/cloud/speakid/games/whatsmissing/",Y=(a,m)=>a.map(([r,i])=>({src:`${he}${m}/${i.replace(/\s/g,"%20")}.png`,name:i})),fe=[["apple","apple"],["banana","banana"],["bread","bread"],["burger","burger"],["cake","cake"],["carrot","carrot"],["cheese","cheese"],["chicken","chicken"],["chocolate","chocolate"],["corn","corn"],["donut","donut"],["fish","fish"],["fries","fries"],["grapes","grapes"],["ice_cream","ice cream"],["milk","milk"],["orange","orange"],["pear","pear"],["pizza","pizza"],["rice","rice"],["sandwich","sandwich"],["soup","soup"],["strawberry","strawberry"],["tomato","tomato"],["watermelon","watermelon"]],pe=[["bear","bear"],["cat","cat"],["crocodile","crocodile"],["dolphin","dolphin"],["elephant","elephant"],["fox","fox"],["giraffe","giraffe"],["horse","horse"],["kangaroo","kangaroo"],["lion","lion"],["monkey","monkey"],["owl","owl"],["panda","panda"],["penguin","penguin"],["squirrel","squirrel"],["tiger","tiger"],["tortoise","tortoise"],["wolf","wolf"],["zebra","zebra"]],ye=[["ball","ball"],["balloon","balloon"],["blocks","blocks"],["car","car"],["doll","doll"],["drum","drum"],["guitar","guitar"],["jump_rope","jump rope"],["kite","kite"],["paints","paints"],["plane","plane"],["puzzle","puzzle"],["rocket","rocket"],["scooter","scooter"],["skateboard","skateboard"],["slide","slide"],["teddy_bear","teddy bear"],["yo-yo","yo-yo"],["crayons","crayons"]],P={food:Y(fe,"food"),animals:Y(pe,"animals"),toys:Y(ye,"toys")},xe=`
2
2
  @keyframes spin {
3
3
  from { transform: rotate(0deg); }
4
4
  to { transform: rotate(360deg); }
5
5
  }
6
- `;if(typeof document<"u"&&!document.getElementById("spin-keyframes")){const r=document.createElement("style");r.id="spin-keyframes",r.innerHTML=ye,document.head.appendChild(r)}const xe={animation:"spin 1.4s linear infinite"},n={gmCenterScreen:{position:"relative",zIndex:1,minHeight:"100%",width:"100%",display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",textAlign:"center",color:"#1f2937",padding:"24px 16px",boxSizing:"border-box",transform:"translateY(20px)"},gmHeadline1:{fontWeight:700,fontSize:"clamp(28px, 4vw, 40px)",lineHeight:"110%"},gmHeadline3:{fontWeight:600,fontSize:"18px",lineHeight:"130%"},gmBodyM:{fontWeight:400,fontSize:"16px",lineHeight:"140%"},gmBodyS:{fontWeight:400,fontSize:"14px",lineHeight:"140%",color:"#6b7280"},gmButton:{fontFamily:'"Geist", system-ui, -apple-system, "Segoe UI", Roboto, Arial, "Noto Sans"',fontWeight:600,fontSize:"16px",padding:"10px 16px",borderRadius:"12px",border:"1px solid #e5e7eb",background:"#ec4c44",color:"#ffffff",cursor:"pointer",boxShadow:"0 6px 18px rgba(236, 76, 68, .18)",transition:"transform .06s ease, box-shadow .2s ease, background .2s ease, opacity .2s ease"},gmButtonActive:{background:"#333",color:"#fff"},gmGameLayout:{position:"relative",width:"100%",maxWidth:"none",minHeight:"100%",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",textAlign:"center",color:"#1f2937",padding:"16px 8px",margin:"0 auto"},gmGrid:{width:"100%",maxWidth:"none",margin:"0 auto",display:"grid",gridTemplateColumns:"repeat(3, 210px)",gridAutoRows:"210px",gap:"20px",justifyContent:"center"},gmCard:{border:"1px solid #e5e7eb",borderRadius:"16px",background:"#f9f9f9",aspectRatio:"1 / 1",display:"flex",alignItems:"center",justifyContent:"center",overflow:"hidden",transition:"transform .2s ease, box-shadow .2s ease, border-color .2s ease"},gmCorrect:{border:"2px solid #10b981",boxShadow:"0 0 18px rgba(16,185,129,.45)",background:"#ecfdf5"},gmWrong:{border:"2px solid #ec4c44",boxShadow:"0 0 18px rgba(236,76,68,.35)",background:"#fef2f2"},gmInput:{padding:"6px 10px",borderRadius:"6px",border:"1px solid #ccc",fontSize:"16px",fontFamily:'"Geist", system-ui',width:"160px"},gmTable:{marginTop:"20px",marginBottom:"32px",borderCollapse:"collapse",width:"100%",maxWidth:"520px",tableLayout:"fixed",textAlign:"center"},gmTableCell:{padding:"8px 12px",borderBottom:"1px solid #e5e7eb",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},gmLogoFixed:{position:"absolute",top:"16px",left:"24px",width:"120px",zIndex:10,pointerEvents:"none",background:"transparent",transform:"none",willChange:"auto"},gmLogoImg:{height:"clamp(28px, 5vw, 40px)",width:"auto",background:"transparent",objectFit:"contain",imageRendering:"auto",transform:"translateZ(0)",backfaceVisibility:"hidden",WebkitFontSmoothing:"antialiased"},gmHourglass:{fontSize:"42px",...xe}},be=()=>{const r=document.createElement("style");r.textContent=`
6
+ `;if(typeof document<"u"&&!document.getElementById("spin-keyframes")){const a=document.createElement("style");a.id="spin-keyframes",a.innerHTML=xe,document.head.appendChild(a)}const be={animation:"spin 1.4s linear infinite"},n={gmCenterScreen:{position:"relative",zIndex:1,minHeight:"100%",width:"100%",display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",textAlign:"center",color:"#1f2937",padding:"24px 16px",boxSizing:"border-box",transform:"translateY(20px)"},gmHeadline1:{fontWeight:700,fontSize:"clamp(28px, 4vw, 40px)",lineHeight:"110%"},gmHeadline3:{fontWeight:600,fontSize:"18px",lineHeight:"130%"},gmBodyM:{fontWeight:400,fontSize:"16px",lineHeight:"140%"},gmBodyS:{fontWeight:400,fontSize:"14px",lineHeight:"140%",color:"#6b7280"},gmButton:{fontFamily:'"Geist", system-ui, -apple-system, "Segoe UI", Roboto, Arial, "Noto Sans"',fontWeight:600,fontSize:"16px",padding:"10px 16px",borderRadius:"12px",border:"1px solid #e5e7eb",background:"#ec4c44",color:"#ffffff",cursor:"pointer",boxShadow:"0 6px 18px rgba(236, 76, 68, .18)",transition:"transform .06s ease, box-shadow .2s ease, background .2s ease, opacity .2s ease"},gmButtonActive:{background:"#333",color:"#fff"},gmGameLayout:{position:"relative",width:"100%",maxWidth:"none",minHeight:"100%",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",textAlign:"center",color:"#1f2937",padding:"16px 8px",margin:"0 auto"},gmGrid:{width:"100%",maxWidth:"none",margin:"0 auto",display:"grid",gridTemplateColumns:"repeat(3, 210px)",gridAutoRows:"210px",gap:"20px",justifyContent:"center"},gmCard:{border:"1px solid #e5e7eb",borderRadius:"16px",background:"#f9f9f9",aspectRatio:"1 / 1",display:"flex",alignItems:"center",justifyContent:"center",overflow:"hidden",transition:"transform .2s ease, box-shadow .2s ease, border-color .2s ease"},gmCorrect:{border:"2px solid #10b981",boxShadow:"0 0 18px rgba(16,185,129,.45)",background:"#ecfdf5"},gmWrong:{border:"2px solid #ec4c44",boxShadow:"0 0 18px rgba(236,76,68,.35)",background:"#fef2f2"},gmInput:{padding:"6px 10px",borderRadius:"6px",border:"1px solid #ccc",fontSize:"16px",fontFamily:'"Geist", system-ui',width:"160px"},gmTable:{marginTop:"20px",marginBottom:"32px",borderCollapse:"collapse",width:"100%",maxWidth:"520px",tableLayout:"fixed",textAlign:"center"},gmTableCell:{padding:"8px 12px",borderBottom:"1px solid #e5e7eb",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},gmLogoFixed:{position:"absolute",top:"16px",left:"24px",width:"120px",zIndex:10,pointerEvents:"none",background:"transparent",transform:"none",willChange:"auto"},gmLogoImg:{height:"clamp(28px, 5vw, 40px)",width:"auto",background:"transparent",objectFit:"contain",imageRendering:"auto",transform:"translateZ(0)",backfaceVisibility:"hidden",WebkitFontSmoothing:"antialiased"},gmHourglass:{fontSize:"42px",...be}},we=()=>{const a=document.createElement("style");a.textContent=`
7
7
  #whats-missing-root, #whats-missing-root * { box-sizing: border-box; }
8
8
  #whats-missing-root img { max-width:100%; height:auto; display:block; user-select:none; }
9
- `,document.head.appendChild(r)},we=(r,m)=>{const l=Array.from({length:r.length+1},()=>Array(m.length+1).fill(0));for(let i=0;i<=r.length;i++)l[i][0]=i;for(let i=0;i<=m.length;i++)l[0][i]=i;for(let i=1;i<=r.length;i++)for(let u=1;u<=m.length;u++)l[i][u]=r[i-1]===m[u-1]?l[i-1][u-1]:Math.min(l[i-1][u-1],l[i][u-1],l[i-1][u])+1;return l[r.length][m.length]};function je(r,m={minDesktopWidth:1200,forceResize:!1}){const l=o.useRef(null),i=m.minDesktopWidth??1200,u=!!m.forceResize;o.useLayoutEffect(()=>{if(typeof window>"u"||!r||!r.current)return;const d=r.current,T=()=>{try{const a=document.body,g=getComputedStyle(a),C=parseFloat(a.style&&a.style.zoom||"");if(C&&!isNaN(C)&&C>0)return C;const w=parseFloat(g.zoom||"");if(w&&!isNaN(w)&&w>0)return w;const p=document.createElement("div");p.style.position="absolute",p.style.left="0",p.style.top="0",p.style.width="100px",p.style.height="1px",p.style.visibility="hidden",document.documentElement.appendChild(p);const y=p.getBoundingClientRect();if(document.documentElement.removeChild(p),y&&y.width>0){const M=y.width/100;if(!isNaN(M)&&M>0)return M}}catch{}return 1},j=()=>{if(i&&window.innerWidth<i){z();return}const a=T();if(!a||a===1){z();return}l.current||(l.current={transform:d.style.transform||null,transformOrigin:d.style.transformOrigin||null,width:d.style.width||null,height:d.style.height||null,willChange:d.style.willChange||null});const g=1/a;u&&(d.style.width=`${a*100}%`,d.style.height=`${a*100}%`),d.style.transformOrigin="50% 50%",d.style.transform=`scale(${g})`,d.style.willChange="transform"},z=()=>{if(!l.current)return;const a=l.current;d.style.transform=a.transform??"",d.style.transformOrigin=a.transformOrigin??"",d.style.width=a.width??"",d.style.height=a.height??"",d.style.willChange=a.willChange??"",l.current=null};let b=0;const S=()=>{cancelAnimationFrame(b),b=requestAnimationFrame(j)},v=new MutationObserver(a=>{for(const g of a)if(g.type==="attributes"&&(g.attributeName==="style"||g.attributeName==="class")){S();break}});return v.observe(document.body,{attributes:!0,attributeFilter:["style","class"]}),window.addEventListener("resize",S),S(),()=>{cancelAnimationFrame(b),v.disconnect(),window.removeEventListener("resize",S),z()}},[r,i,u])}function Se({gameCubeSize:r,screenHeight:m,screenWidth:l}){const i=o.useRef(null),u=o.useRef(null),[d,T]=o.useState(null);je(i,{minDesktopWidth:1024,forceResize:!1}),o.useEffect(()=>(be(),()=>{document.body.style.overflow=""}),[]);const[j,z]=o.useState(null),[b,S]=o.useState([]),[v,a]=o.useState(4),[g,C]=o.useState(!1),[w,p]=o.useState(1),[y,M]=o.useState(null),[x,H]=o.useState("ready"),[U,V]=o.useState(3),[E,A]=o.useState(10),[W,Z]=o.useState(20),[ie,F]=o.useState(0),[B,$]=o.useState(!1),[L,_]=o.useState(""),[R,G]=o.useState(!1),[N,K]=o.useState(!1),[J,I]=o.useState(null),[re,O]=o.useState([]),[le,Q]=o.useState([]),[h,ae]=o.useState(!1);o.useEffect(()=>{if(typeof window>"u")return;const t=()=>{const s=l??window.innerWidth,c=window.matchMedia&&window.matchMedia("(pointer: coarse)").matches;ae(s<=768||c)};return t(),window.addEventListener("resize",t),window.addEventListener("orientationchange",t),()=>{window.removeEventListener("resize",t),window.removeEventListener("orientationchange",t)}},[l]),o.useLayoutEffect(()=>{const t=u.current;if(!t||typeof window>"u")return;let s=null;try{s=new ResizeObserver(c=>{for(const f of c){const k=f.contentRect;T(Math.round(Math.min(k.width,k.height)))}}),s.observe(t),T(Math.round(Math.min(t.clientWidth,t.clientHeight)))}catch{T(Math.round(Math.min(t.clientWidth,t.clientHeight)))}return()=>s?.disconnect()},[h]);const X=t=>[...t].sort(()=>Math.random()-.5).slice(0,6),ee=()=>{if(!j)return;const t=X(P[j]);S(t),C(!0),$(!1),p(1),F(0),O([]),Q([]),te(t,[],!0)},te=(t=b,s=le,c=!1)=>{const f=X(t.length?t:P[j]);let k=Math.floor(Math.random()*f.length),q=f[k].name,se=0;for(;s.includes(q)&&se<20;)k=Math.floor(Math.random()*f.length),q=f[k].name,se++;S(f),M(k),Q([...s,q]),G(!1),_(""),Z(20),I(null),c?(H("ready"),V(3),A(10)):(H("memorize"),A(10))};o.useEffect(()=>{if(!(!g||B||R)){if(x==="ready")if(U<=0)H("memorize");else{const t=setTimeout(()=>V(s=>s-1),1e3);return()=>clearTimeout(t)}if(x==="memorize")if(E<=0)H("guess");else{const t=setTimeout(()=>A(s=>s-1),1e3);return()=>clearTimeout(t)}if(x==="guess"){if(W<=0){G(!0),I("wrong");const s=b[y].name;O(c=>[...c,{round:w,answer:L,correct:s,result:"wrong"}]);return}const t=setTimeout(()=>Z(s=>s-1),1e3);return()=>clearTimeout(t)}}},[x,U,E,W,g,B,R,b,y,w,L]);const de=()=>{if(y===null||N)return;const t=b[y].name,s=L.toLowerCase().trim();let c="wrong";s===t?(F(f=>f+1),I("correct"),c="correct"):we(s,t)===1?(F(f=>f+.5),I("almost"),c="almost"):(I("wrong"),c="wrong"),O(f=>[...f,{round:w,answer:s,correct:t,result:c}]),K(!0),setTimeout(()=>{K(!1),G(!0)},600)},ce=()=>w<v?(p(t=>t+1),te()):$(!0),me=()=>{C(!1),$(!1),z(null)},ue=o.useMemo(()=>e.jsx("div",{style:{...n.gmLogoFixed,position:"absolute",top:16,left:16,zIndex:30},children:e.jsxs("picture",{children:[e.jsx("source",{srcSet:window.origin+"/cloud/speakid/games/whatsmissing/logo.svg",type:"image/svg+xml"}),e.jsx("img",{src:window.origin+"/cloud/speakid/games/whatsmissing/logo.png",alt:"SPEAKID Logo",style:n.gmLogoImg,loading:"lazy"})]})}),[]),ne=1200,oe=700,D=o.useMemo(()=>{const t=l??(typeof window<"u"?window.innerWidth:ne),s=m??(typeof window<"u"?window.innerHeight:oe),c=Math.min(t/ne,s/oe);return Math.min(1.15,Math.max(.92,c))},[l,m,h]);return e.jsx("div",{ref:i,style:{position:"fixed",inset:0,display:"flex",justifyContent:"center",alignItems:"center",background:"linear-gradient(to bottom, #fff8f8 0%, #f9fafb 100%)",overflow:"hidden",zIndex:1},children:e.jsx("div",{ref:u,style:{width:h?"100%":`${Math.min(r??1e3,l??1e3,m??1e3)}px`,height:h?"100%":`${Math.min(r??1e3,l??1e3,m??1e3)}px`,borderRadius:h?0:"20px",background:"linear-gradient(to bottom, #fff8f8 0%, #f9fafb 100%)",position:"relative",overflow:"hidden",boxShadow:h?"none":"0 0 40px rgba(0,0,0,0.08)",display:"flex",justifyContent:"center",alignItems:"center"},children:e.jsxs("div",{id:"whats-missing-root",style:{transform:`scale(${D})`,transformOrigin:"center center",transition:"transform 0.2s ease-out",width:`${100/D}%`,height:`${100/D}%`,display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center"},children:[!h&&ue,!j&&!g&&e.jsxs("div",{style:n.gmCenterScreen,children:[e.jsx("h1",{style:n.gmHeadline1,children:"WHAT'S MISSING?"}),e.jsx("p",{style:n.gmBodyM,children:"Select a theme:"}),e.jsx("div",{style:{display:"flex",gap:16},children:["animals","food","toys"].map(t=>e.jsx("button",{style:n.gmButton,onClick:()=>z(t),children:t==="animals"?"🐶 Animals":t==="food"?"🍎 Food":"🧸 Toys"},t))}),e.jsxs("div",{style:{marginTop:24},children:[e.jsx("p",{style:n.gmBodyS,children:"Choose number of rounds:"}),e.jsx("div",{style:{display:"flex",gap:12,marginTop:8},children:[3,4,5].map(t=>e.jsx("button",{style:{...n.gmButton,...v===t?n.gmButtonActive:{}},onClick:()=>a(t),children:t},t))})]})]}),j&&!g&&e.jsxs("div",{style:n.gmCenterScreen,children:[e.jsxs("h1",{style:n.gmHeadline1,children:["Theme selected: ",j]}),e.jsxs("p",{style:n.gmBodyM,children:["Rounds: ",v]}),e.jsx("button",{style:n.gmButton,onClick:ee,children:"▶ Start game"})]}),B&&e.jsxs("div",{style:n.gmCenterScreen,children:[e.jsx("h1",{style:n.gmHeadline1,children:"Results"}),e.jsxs("h2",{style:n.gmHeadline3,children:["Your score: ",ie," / ",v]}),e.jsx("p",{style:{...n.gmBodyM,color:"#10b981",marginTop:12},children:"Yahoo! You did it! 🍬✨"}),e.jsxs("table",{style:n.gmTable,children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"Round"}),e.jsx("th",{children:"Your Answer"}),e.jsx("th",{children:"Correct"}),e.jsx("th",{children:"Result"})]})}),e.jsx("tbody",{children:re.map((t,s)=>e.jsxs("tr",{children:[e.jsx("td",{style:n.gmTableCell,children:t.round}),e.jsx("td",{style:n.gmTableCell,children:t.answer||"—"}),e.jsx("td",{style:n.gmTableCell,children:t.correct}),e.jsx("td",{style:n.gmTableCell,children:t.result==="correct"?"✔ Correct":t.result==="almost"?"◐ Almost (0.5)":"✘ Wrong"})]},s))})]}),e.jsxs("div",{style:{display:"flex",gap:12,marginTop:24},children:[e.jsx("button",{style:n.gmButton,onClick:ee,children:"🔁 Play again"}),e.jsx("button",{style:n.gmButton,onClick:me,children:"⬅️ Choose theme"})]})]}),g&&!B&&e.jsxs("div",{style:n.gmGameLayout,children:[e.jsxs("div",{style:{minHeight:160,display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center"},children:[x==="ready"&&e.jsxs(e.Fragment,{children:[e.jsx("h1",{style:{...n.gmHeadline1,color:"#ec4c44"},children:"GET READY"}),e.jsx("div",{style:n.gmHourglass,children:"⏳"})]}),x==="memorize"&&e.jsxs("p",{style:{...n.gmBodyM,color:"#10b981"},children:["MEMORIZE (",E,")"]}),x==="guess"&&!R&&e.jsxs("p",{style:n.gmBodyM,children:["⏳ Time left: ",W,"s"]})]}),x!=="ready"&&e.jsx("div",{style:{...n.gmGrid,display:"grid",gridTemplateColumns:`repeat(${h?2:3}, 1fr)`,gridTemplateRows:`repeat(${h?3:2}, 1fr)`,gap:h?12:20,justifyContent:"center",alignContent:"center",padding:h?8:16,width:"100%",height:"100%",maxWidth:h?"100%":600,maxHeight:h?"100%":400,boxSizing:"border-box"},children:b.map((t,s)=>{const c=y===s&&x==="guess"&&!R;return e.jsx("div",{style:{...n.gmCard,width:"100%",height:"100%",...J==="correct"&&y===s?n.gmCorrect:{},...J==="wrong"&&y===s?n.gmWrong:{}},children:!c&&e.jsx("img",{src:t.src,alt:t.name,style:{width:"100%",height:"100%",objectFit:"cover",display:"block"}})},s)})}),e.jsxs("div",{style:{marginTop:16,height:80},children:[x==="guess"&&!R&&e.jsxs("div",{children:[e.jsx("input",{type:"text",placeholder:"Type the missing word",value:L,onChange:t=>_(t.target.value),style:n.gmInput}),e.jsx("button",{style:{...n.gmButton,marginLeft:8},onClick:de,disabled:N,children:N?"...":"Check"})]}),R&&e.jsx("button",{type:"button",style:n.gmButton,onClick:ce,children:"Next round"})]})]})]})})})}exports.Game=Se;exports.themes=P;
9
+ `,document.head.appendChild(a)},je=(a,m)=>{const r=Array.from({length:a.length+1},()=>Array(m.length+1).fill(0));for(let i=0;i<=a.length;i++)r[i][0]=i;for(let i=0;i<=m.length;i++)r[0][i]=i;for(let i=1;i<=a.length;i++)for(let u=1;u<=m.length;u++)r[i][u]=a[i-1]===m[u-1]?r[i-1][u-1]:Math.min(r[i-1][u-1],r[i][u-1],r[i-1][u])+1;return r[a.length][m.length]};function Se(a,m={minDesktopWidth:1200,forceResize:!1}){const r=s.useRef(null),i=m.minDesktopWidth??1200,u=!!m.forceResize;s.useLayoutEffect(()=>{if(typeof window>"u"||!a||!a.current)return;const d=a.current,R=()=>{try{const l=document.body,j=getComputedStyle(l),b=parseFloat(l.style&&l.style.zoom||"");if(b&&!isNaN(b)&&b>0)return b;const S=parseFloat(j.zoom||"");if(S&&!isNaN(S)&&S>0)return S;const g=document.createElement("div");g.style.position="absolute",g.style.left="0",g.style.top="0",g.style.width="100px",g.style.height="1px",g.style.visibility="hidden",document.documentElement.appendChild(g);const k=g.getBoundingClientRect();if(document.documentElement.removeChild(g),k&&k.width>0){const p=k.width/100;if(!isNaN(p)&&p>0)return p}}catch{}return 1},I=()=>{if(i&&window.innerWidth<i){y();return}const l=R();if(!l||l===1){y();return}r.current||(r.current={transform:d.style.transform||null,transformOrigin:d.style.transformOrigin||null,width:d.style.width||null,height:d.style.height||null,willChange:d.style.willChange||null});const j=1/l;u&&(d.style.width=`${l*100}%`,d.style.height=`${l*100}%`),d.style.transformOrigin="50% 50%",d.style.transform=`scale(${j})`,d.style.willChange="transform"},y=()=>{if(!r.current)return;const l=r.current;d.style.transform=l.transform??"",d.style.transformOrigin=l.transformOrigin??"",d.style.width=l.width??"",d.style.height=l.height??"",d.style.willChange=l.willChange??"",r.current=null};let C=0;const x=()=>{cancelAnimationFrame(C),C=requestAnimationFrame(I)},T=new MutationObserver(l=>{for(const j of l)if(j.type==="attributes"&&(j.attributeName==="style"||j.attributeName==="class")){x();break}});return T.observe(document.body,{attributes:!0,attributeFilter:["style","class"]}),window.addEventListener("resize",x),x(),()=>{cancelAnimationFrame(C),T.disconnect(),window.removeEventListener("resize",x),y()}},[a,i,u])}function ve({gameCubeSize:a,screenHeight:m,screenWidth:r}){const i=s.useRef(null),u=s.useRef(null),[d,R]=s.useState(null);Se(i,{minDesktopWidth:1024,forceResize:!1});const I=s.useMemo(()=>{const e=a??Math.min(r??1e3,m??1e3),o=r??(typeof window<"u"?window.innerWidth:1e3);return e<600&&o>768?600:o<=768?Math.min(e,o-20):e},[a,r,m]);s.useEffect(()=>(we(),()=>{document.body.style.overflow=""}),[]);const[y,C]=s.useState(null),[x,T]=s.useState([]),[l,j]=s.useState(4),[b,S]=s.useState(!1),[g,k]=s.useState(1),[p,ie]=s.useState(null),[w,H]=s.useState("ready"),[U,V]=s.useState(3),[E,A]=s.useState(10),[W,Z]=s.useState(20),[re,F]=s.useState(0),[B,G]=s.useState(!1),[L,_]=s.useState(""),[z,$]=s.useState(!1),[N,K]=s.useState(!1),[J,M]=s.useState(null),[ae,O]=s.useState([]),[le,Q]=s.useState([]),[h,de]=s.useState(!1);s.useEffect(()=>{if(typeof window>"u")return;const e=()=>{const o=r??window.innerWidth,c=window.matchMedia&&window.matchMedia("(pointer: coarse)").matches;de(o<=768||c)};return e(),window.addEventListener("resize",e),window.addEventListener("orientationchange",e),()=>{window.removeEventListener("resize",e),window.removeEventListener("orientationchange",e)}},[r]),s.useLayoutEffect(()=>{const e=u.current;if(!e||typeof window>"u")return;let o=null;try{o=new ResizeObserver(c=>{for(const f of c){const v=f.contentRect;R(Math.round(Math.min(v.width,v.height)))}}),o.observe(e),R(Math.round(Math.min(e.clientWidth,e.clientHeight)))}catch{R(Math.round(Math.min(e.clientWidth,e.clientHeight)))}return()=>o?.disconnect()},[h]);const X=e=>[...e].sort(()=>Math.random()-.5).slice(0,6),ee=()=>{if(!y)return;const e=X(P[y]);T(e),S(!0),G(!1),k(1),F(0),O([]),Q([]),te(e,[],!0)},te=(e=x,o=le,c=!1)=>{const f=X(e.length?e:P[y]);let v=Math.floor(Math.random()*f.length),q=f[v].name,se=0;for(;o.includes(q)&&se<20;)v=Math.floor(Math.random()*f.length),q=f[v].name,se++;T(f),ie(v),Q([...o,q]),$(!1),_(""),Z(20),M(null),c?(H("ready"),V(3),A(10)):(H("memorize"),A(10))};s.useEffect(()=>{if(!(!b||B||z)){if(w==="ready")if(U<=0)H("memorize");else{const e=setTimeout(()=>V(o=>o-1),1e3);return()=>clearTimeout(e)}if(w==="memorize")if(E<=0)H("guess");else{const e=setTimeout(()=>A(o=>o-1),1e3);return()=>clearTimeout(e)}if(w==="guess"){if(W<=0){$(!0),M("wrong");const o=x[p].name;O(c=>[...c,{round:g,answer:L,correct:o,result:"wrong"}]);return}const e=setTimeout(()=>Z(o=>o-1),1e3);return()=>clearTimeout(e)}}},[w,U,E,W,b,B,z,x,p,g,L]);const ce=()=>{if(p===null||N)return;const e=x[p].name,o=L.toLowerCase().trim();let c="wrong";o===e?(F(f=>f+1),M("correct"),c="correct"):je(o,e)===1?(F(f=>f+.5),M("almost"),c="almost"):(M("wrong"),c="wrong"),O(f=>[...f,{round:g,answer:o,correct:e,result:c}]),K(!0),setTimeout(()=>{K(!1),$(!0)},600)},me=()=>g<l?(k(e=>e+1),te()):G(!0),ue=()=>{S(!1),G(!1),C(null)},ge=s.useMemo(()=>t.jsx("div",{style:{...n.gmLogoFixed,position:"absolute",top:16,left:16,zIndex:30},children:t.jsxs("picture",{children:[t.jsx("source",{srcSet:window.origin+"/cloud/speakid/games/whatsmissing/logo.svg",type:"image/svg+xml"}),t.jsx("img",{src:window.origin+"/cloud/speakid/games/whatsmissing/logo.png",alt:"SPEAKID Logo",style:n.gmLogoImg,loading:"lazy"})]})}),[]),ne=1200,oe=700,D=s.useMemo(()=>{const e=r??(typeof window<"u"?window.innerWidth:ne),o=m??(typeof window<"u"?window.innerHeight:oe),c=Math.min(e/ne,o/oe);return Math.min(1.15,Math.max(.92,c))},[r,m,h]);return t.jsx("div",{ref:i,style:{position:"fixed",inset:0,display:"flex",justifyContent:"center",alignItems:"center",background:"linear-gradient(to bottom, #fff8f8 0%, #f9fafb 100%)",overflow:"hidden",zIndex:1},children:t.jsx("div",{ref:u,style:{width:h?"100%":`${I}px`,height:h?"100%":`${I}px`,borderRadius:h?0:"20px",background:"linear-gradient(to bottom, #fff8f8 0%, #f9fafb 100%)",position:"relative",overflow:"hidden",boxShadow:h?"none":"0 0 40px rgba(0,0,0,0.08)",display:"flex",justifyContent:"center",alignItems:"center"},children:t.jsxs("div",{id:"whats-missing-root",style:{transform:`scale(${D})`,transformOrigin:"center center",transition:"transform 0.2s ease-out",width:`${100/D}%`,height:`${100/D}%`,display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center"},children:[!h&&ge,!y&&!b&&t.jsxs("div",{style:n.gmCenterScreen,children:[t.jsx("h1",{style:n.gmHeadline1,children:"WHAT'S MISSING?"}),t.jsx("p",{style:n.gmBodyM,children:"Select a theme:"}),t.jsx("div",{style:{display:"flex",gap:16},children:["animals","food","toys"].map(e=>t.jsx("button",{style:n.gmButton,onClick:()=>C(e),children:e==="animals"?"🐶 Animals":e==="food"?"🍎 Food":"🧸 Toys"},e))}),t.jsxs("div",{style:{marginTop:24},children:[t.jsx("p",{style:n.gmBodyS,children:"Choose number of rounds:"}),t.jsx("div",{style:{display:"flex",gap:12,marginTop:8},children:[3,4,5].map(e=>t.jsx("button",{style:{...n.gmButton,...l===e?n.gmButtonActive:{}},onClick:()=>j(e),children:e},e))})]})]}),y&&!b&&t.jsxs("div",{style:n.gmCenterScreen,children:[t.jsxs("h1",{style:n.gmHeadline1,children:["Theme selected: ",y]}),t.jsxs("p",{style:n.gmBodyM,children:["Rounds: ",l]}),t.jsx("button",{style:n.gmButton,onClick:ee,children:"▶ Start game"})]}),B&&t.jsxs("div",{style:n.gmCenterScreen,children:[t.jsx("h1",{style:n.gmHeadline1,children:"Results"}),t.jsxs("h2",{style:n.gmHeadline3,children:["Your score: ",re," / ",l]}),t.jsx("p",{style:{...n.gmBodyM,color:"#10b981",marginTop:12},children:"Yahoo! You did it! 🍬✨"}),t.jsxs("table",{style:n.gmTable,children:[t.jsx("thead",{children:t.jsxs("tr",{children:[t.jsx("th",{children:"Round"}),t.jsx("th",{children:"Your Answer"}),t.jsx("th",{children:"Correct"}),t.jsx("th",{children:"Result"})]})}),t.jsx("tbody",{children:ae.map((e,o)=>t.jsxs("tr",{children:[t.jsx("td",{style:n.gmTableCell,children:e.round}),t.jsx("td",{style:n.gmTableCell,children:e.answer||"—"}),t.jsx("td",{style:n.gmTableCell,children:e.correct}),t.jsx("td",{style:n.gmTableCell,children:e.result==="correct"?"✔ Correct":e.result==="almost"?"◐ Almost (0.5)":"✘ Wrong"})]},o))})]}),t.jsxs("div",{style:{display:"flex",gap:12,marginTop:24},children:[t.jsx("button",{style:n.gmButton,onClick:ee,children:"🔁 Play again"}),t.jsx("button",{style:n.gmButton,onClick:ue,children:"⬅️ Choose theme"})]})]}),b&&!B&&t.jsxs("div",{style:n.gmGameLayout,children:[t.jsxs("div",{style:{minHeight:160,display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center"},children:[w==="ready"&&t.jsxs(t.Fragment,{children:[t.jsx("h1",{style:{...n.gmHeadline1,color:"#ec4c44"},children:"GET READY"}),t.jsx("div",{style:n.gmHourglass,children:"⏳"})]}),w==="memorize"&&t.jsxs("p",{style:{...n.gmBodyM,color:"#10b981"},children:["MEMORIZE (",E,")"]}),w==="guess"&&!z&&t.jsxs("p",{style:n.gmBodyM,children:["⏳ Time left: ",W,"s"]})]}),w!=="ready"&&t.jsx("div",{style:{...n.gmGrid,display:"grid",gridTemplateColumns:`repeat(${h?2:3}, 1fr)`,gridTemplateRows:`repeat(${h?3:2}, 1fr)`,gap:h?12:20,justifyContent:"center",alignContent:"center",padding:h?8:16,width:"100%",height:"100%",maxWidth:h?"100%":600,maxHeight:h?"100%":400,boxSizing:"border-box"},children:x.map((e,o)=>{const c=p===o&&w==="guess"&&!z;return t.jsx("div",{style:{...n.gmCard,width:"100%",height:"100%",...J==="correct"&&p===o?n.gmCorrect:{},...J==="wrong"&&p===o?n.gmWrong:{}},children:!c&&t.jsx("img",{src:e.src,alt:e.name,style:{width:"100%",height:"100%",objectFit:"cover",display:"block"}})},o)})}),t.jsxs("div",{style:{marginTop:16,height:80},children:[w==="guess"&&!z&&t.jsxs("div",{children:[t.jsx("input",{type:"text",placeholder:"Type the missing word",value:L,onChange:e=>_(e.target.value),style:n.gmInput}),t.jsx("button",{style:{...n.gmButton,marginLeft:8},onClick:ce,disabled:N,children:N?"...":"Check"})]}),z&&t.jsx("button",{type:"button",style:n.gmButton,onClick:me,children:"Next round"})]})]})]})})})}exports.Game=ve;exports.themes=P;
@@ -1,9 +1,9 @@
1
- import { jsx as n, jsxs as l, Fragment as be } from "react/jsx-runtime";
2
- import { useRef as V, useState as a, useEffect as P, useLayoutEffect as de, useMemo as le } from "react";
3
- const we = window.origin + "/cloud/speakid/games/whatsmissing/", U = (r, g) => r.map(([s, i]) => ({
4
- src: `${we}${g}/${i.replace(/\s/g, "%20")}.png`,
1
+ import { jsx as n, jsxs as a, Fragment as be } from "react/jsx-runtime";
2
+ import { useRef as Z, useState as d, useMemo as P, useEffect as U, useLayoutEffect as de } from "react";
3
+ const xe = window.origin + "/cloud/speakid/games/whatsmissing/", V = (s, u) => s.map(([r, i]) => ({
4
+ src: `${xe}${u}/${i.replace(/\s/g, "%20")}.png`,
5
5
  name: i
6
- })), xe = [
6
+ })), ve = [
7
7
  ["apple", "apple"],
8
8
  ["banana", "banana"],
9
9
  ["bread", "bread"],
@@ -29,7 +29,7 @@ const we = window.origin + "/cloud/speakid/games/whatsmissing/", U = (r, g) => r
29
29
  ["strawberry", "strawberry"],
30
30
  ["tomato", "tomato"],
31
31
  ["watermelon", "watermelon"]
32
- ], ve = [
32
+ ], Ce = [
33
33
  ["bear", "bear"],
34
34
  ["cat", "cat"],
35
35
  ["crocodile", "crocodile"],
@@ -49,7 +49,7 @@ const we = window.origin + "/cloud/speakid/games/whatsmissing/", U = (r, g) => r
49
49
  ["tortoise", "tortoise"],
50
50
  ["wolf", "wolf"],
51
51
  ["zebra", "zebra"]
52
- ], Ce = [
52
+ ], ke = [
53
53
  ["ball", "ball"],
54
54
  ["balloon", "balloon"],
55
55
  ["blocks", "blocks"],
@@ -70,20 +70,20 @@ const we = window.origin + "/cloud/speakid/games/whatsmissing/", U = (r, g) => r
70
70
  ["yo-yo", "yo-yo"],
71
71
  ["crayons", "crayons"]
72
72
  ], ae = {
73
- food: U(xe, "food"),
74
- animals: U(ve, "animals"),
75
- toys: U(Ce, "toys")
76
- }, ke = `
73
+ food: V(ve, "food"),
74
+ animals: V(Ce, "animals"),
75
+ toys: V(ke, "toys")
76
+ }, ze = `
77
77
  @keyframes spin {
78
78
  from { transform: rotate(0deg); }
79
79
  to { transform: rotate(360deg); }
80
80
  }
81
81
  `;
82
82
  if (typeof document < "u" && !document.getElementById("spin-keyframes")) {
83
- const r = document.createElement("style");
84
- r.id = "spin-keyframes", r.innerHTML = ke, document.head.appendChild(r);
83
+ const s = document.createElement("style");
84
+ s.id = "spin-keyframes", s.innerHTML = ze, document.head.appendChild(s);
85
85
  }
86
- const ze = {
86
+ const Se = {
87
87
  animation: "spin 1.4s linear infinite"
88
88
  }, t = {
89
89
  gmCenterScreen: {
@@ -239,168 +239,173 @@ const ze = {
239
239
  },
240
240
  gmHourglass: {
241
241
  fontSize: "42px",
242
- ...ze
242
+ ...Se
243
243
  }
244
- }, Se = () => {
245
- const r = document.createElement("style");
246
- r.textContent = `
244
+ }, Te = () => {
245
+ const s = document.createElement("style");
246
+ s.textContent = `
247
247
  #whats-missing-root, #whats-missing-root * { box-sizing: border-box; }
248
248
  #whats-missing-root img { max-width:100%; height:auto; display:block; user-select:none; }
249
- `, document.head.appendChild(r);
250
- }, Te = (r, g) => {
251
- const s = Array.from({ length: r.length + 1 }, () => Array(g.length + 1).fill(0));
252
- for (let i = 0; i <= r.length; i++) s[i][0] = i;
253
- for (let i = 0; i <= g.length; i++) s[0][i] = i;
254
- for (let i = 1; i <= r.length; i++)
255
- for (let u = 1; u <= g.length; u++)
256
- s[i][u] = r[i - 1] === g[u - 1] ? s[i - 1][u - 1] : Math.min(s[i - 1][u - 1], s[i][u - 1], s[i - 1][u]) + 1;
257
- return s[r.length][g.length];
249
+ `, document.head.appendChild(s);
250
+ }, Re = (s, u) => {
251
+ const r = Array.from({ length: s.length + 1 }, () => Array(u.length + 1).fill(0));
252
+ for (let i = 0; i <= s.length; i++) r[i][0] = i;
253
+ for (let i = 0; i <= u.length; i++) r[0][i] = i;
254
+ for (let i = 1; i <= s.length; i++)
255
+ for (let g = 1; g <= u.length; g++)
256
+ r[i][g] = s[i - 1] === u[g - 1] ? r[i - 1][g - 1] : Math.min(r[i - 1][g - 1], r[i][g - 1], r[i - 1][g]) + 1;
257
+ return r[s.length][u.length];
258
258
  };
259
- function Re(r, g = { minDesktopWidth: 1200, forceResize: !1 }) {
260
- const s = V(null), i = g.minDesktopWidth ?? 1200, u = !!g.forceResize;
259
+ function Me(s, u = { minDesktopWidth: 1200, forceResize: !1 }) {
260
+ const r = Z(null), i = u.minDesktopWidth ?? 1200, g = !!u.forceResize;
261
261
  de(() => {
262
- if (typeof window > "u" || !r || !r.current) return;
263
- const c = r.current, I = () => {
262
+ if (typeof window > "u" || !s || !s.current) return;
263
+ const c = s.current, M = () => {
264
264
  try {
265
- const d = document.body, h = getComputedStyle(d), S = parseFloat(d.style && d.style.zoom || "");
266
- if (S && !isNaN(S) && S > 0) return S;
267
- const v = parseFloat(h.zoom || "");
268
- if (v && !isNaN(v) && v > 0) return v;
269
- const y = document.createElement("div");
270
- y.style.position = "absolute", y.style.left = "0", y.style.top = "0", y.style.width = "100px", y.style.height = "1px", y.style.visibility = "hidden", document.documentElement.appendChild(y);
271
- const b = y.getBoundingClientRect();
272
- if (document.documentElement.removeChild(y), b && b.width > 0) {
273
- const H = b.width / 100;
274
- if (!isNaN(H) && H > 0) return H;
265
+ const l = document.body, C = getComputedStyle(l), x = parseFloat(l.style && l.style.zoom || "");
266
+ if (x && !isNaN(x) && x > 0) return x;
267
+ const k = parseFloat(C.zoom || "");
268
+ if (k && !isNaN(k) && k > 0) return k;
269
+ const h = document.createElement("div");
270
+ h.style.position = "absolute", h.style.left = "0", h.style.top = "0", h.style.width = "100px", h.style.height = "1px", h.style.visibility = "hidden", document.documentElement.appendChild(h);
271
+ const T = h.getBoundingClientRect();
272
+ if (document.documentElement.removeChild(h), T && T.width > 0) {
273
+ const y = T.width / 100;
274
+ if (!isNaN(y) && y > 0) return y;
275
275
  }
276
276
  } catch {
277
277
  }
278
278
  return 1;
279
- }, C = () => {
279
+ }, B = () => {
280
280
  if (i && window.innerWidth < i) {
281
- R();
281
+ w();
282
282
  return;
283
283
  }
284
- const d = I();
285
- if (!d || d === 1) {
286
- R();
284
+ const l = M();
285
+ if (!l || l === 1) {
286
+ w();
287
287
  return;
288
288
  }
289
- s.current || (s.current = {
289
+ r.current || (r.current = {
290
290
  transform: c.style.transform || null,
291
291
  transformOrigin: c.style.transformOrigin || null,
292
292
  width: c.style.width || null,
293
293
  height: c.style.height || null,
294
294
  willChange: c.style.willChange || null
295
295
  });
296
- const h = 1 / d;
297
- u && (c.style.width = `${d * 100}%`, c.style.height = `${d * 100}%`), c.style.transformOrigin = "50% 50%", c.style.transform = `scale(${h})`, c.style.willChange = "transform";
298
- }, R = () => {
299
- if (!s.current) return;
300
- const d = s.current;
301
- c.style.transform = d.transform ?? "", c.style.transformOrigin = d.transformOrigin ?? "", c.style.width = d.width ?? "", c.style.height = d.height ?? "", c.style.willChange = d.willChange ?? "", s.current = null;
296
+ const C = 1 / l;
297
+ g && (c.style.width = `${l * 100}%`, c.style.height = `${l * 100}%`), c.style.transformOrigin = "50% 50%", c.style.transform = `scale(${C})`, c.style.willChange = "transform";
298
+ }, w = () => {
299
+ if (!r.current) return;
300
+ const l = r.current;
301
+ c.style.transform = l.transform ?? "", c.style.transformOrigin = l.transformOrigin ?? "", c.style.width = l.width ?? "", c.style.height = l.height ?? "", c.style.willChange = l.willChange ?? "", r.current = null;
302
302
  };
303
- let x = 0;
304
- const k = () => {
305
- cancelAnimationFrame(x), x = requestAnimationFrame(C);
306
- }, z = new MutationObserver((d) => {
307
- for (const h of d)
308
- if (h.type === "attributes" && (h.attributeName === "style" || h.attributeName === "class")) {
309
- k();
303
+ let S = 0;
304
+ const b = () => {
305
+ cancelAnimationFrame(S), S = requestAnimationFrame(B);
306
+ }, I = new MutationObserver((l) => {
307
+ for (const C of l)
308
+ if (C.type === "attributes" && (C.attributeName === "style" || C.attributeName === "class")) {
309
+ b();
310
310
  break;
311
311
  }
312
312
  });
313
- return z.observe(document.body, { attributes: !0, attributeFilter: ["style", "class"] }), window.addEventListener("resize", k), k(), () => {
314
- cancelAnimationFrame(x), z.disconnect(), window.removeEventListener("resize", k), R();
313
+ return I.observe(document.body, { attributes: !0, attributeFilter: ["style", "class"] }), window.addEventListener("resize", b), b(), () => {
314
+ cancelAnimationFrame(S), I.disconnect(), window.removeEventListener("resize", b), w();
315
315
  };
316
- }, [r, i, u]);
316
+ }, [s, i, g]);
317
317
  }
318
- function He({
319
- gameCubeSize: r,
320
- screenHeight: g,
321
- screenWidth: s
318
+ function Be({
319
+ gameCubeSize: s,
320
+ screenHeight: u,
321
+ screenWidth: r
322
322
  }) {
323
- const i = V(null), u = V(null), [c, I] = a(null);
324
- Re(i, { minDesktopWidth: 1024, forceResize: !1 }), P(() => (Se(), () => {
323
+ const i = Z(null), g = Z(null), [c, M] = d(null);
324
+ Me(i, { minDesktopWidth: 1024, forceResize: !1 });
325
+ const B = P(() => {
326
+ const e = s ?? Math.min(r ?? 1e3, u ?? 1e3), o = r ?? (typeof window < "u" ? window.innerWidth : 1e3);
327
+ return e < 600 && o > 768 ? 600 : o <= 768 ? Math.min(e, o - 20) : e;
328
+ }, [s, r, u]);
329
+ U(() => (Te(), () => {
325
330
  document.body.style.overflow = "";
326
331
  }), []);
327
- const [C, R] = a(null), [x, k] = a([]), [z, d] = a(4), [h, S] = a(!1), [v, y] = a(1), [b, H] = a(null), [w, L] = a("ready"), [Z, _] = a(3), [W, j] = a(10), [F, K] = a(20), [ce, $] = a(0), [A, N] = a(!1), [E, J] = a(""), [M, G] = a(!1), [D, Q] = a(!1), [X, B] = a(null), [me, O] = a([]), [ge, ee] = a([]), [f, ue] = a(!1);
328
- P(() => {
332
+ const [w, S] = d(null), [b, I] = d([]), [l, C] = d(4), [x, k] = d(!1), [h, T] = d(1), [y, ce] = d(null), [v, L] = d("ready"), [_, K] = d(3), [E, j] = d(10), [F, J] = d(20), [me, $] = d(0), [A, G] = d(!1), [W, Q] = d(""), [R, N] = d(!1), [D, X] = d(!1), [ee, H] = d(null), [ue, O] = d([]), [ge, te] = d([]), [f, he] = d(!1);
333
+ U(() => {
329
334
  if (typeof window > "u") return;
330
335
  const e = () => {
331
- const o = s ?? window.innerWidth, m = window.matchMedia && window.matchMedia("(pointer: coarse)").matches;
332
- ue(o <= 768 || m);
336
+ const o = r ?? window.innerWidth, m = window.matchMedia && window.matchMedia("(pointer: coarse)").matches;
337
+ he(o <= 768 || m);
333
338
  };
334
339
  return e(), window.addEventListener("resize", e), window.addEventListener("orientationchange", e), () => {
335
340
  window.removeEventListener("resize", e), window.removeEventListener("orientationchange", e);
336
341
  };
337
- }, [s]), de(() => {
338
- const e = u.current;
342
+ }, [r]), de(() => {
343
+ const e = g.current;
339
344
  if (!e || typeof window > "u") return;
340
345
  let o = null;
341
346
  try {
342
347
  o = new ResizeObserver((m) => {
343
348
  for (const p of m) {
344
- const T = p.contentRect;
345
- I(Math.round(Math.min(T.width, T.height)));
349
+ const z = p.contentRect;
350
+ M(Math.round(Math.min(z.width, z.height)));
346
351
  }
347
- }), o.observe(e), I(Math.round(Math.min(e.clientWidth, e.clientHeight)));
352
+ }), o.observe(e), M(Math.round(Math.min(e.clientWidth, e.clientHeight)));
348
353
  } catch {
349
- I(Math.round(Math.min(e.clientWidth, e.clientHeight)));
354
+ M(Math.round(Math.min(e.clientWidth, e.clientHeight)));
350
355
  }
351
356
  return () => o?.disconnect();
352
357
  }, [f]);
353
- const te = (e) => [...e].sort(() => Math.random() - 0.5).slice(0, 6), ne = () => {
354
- if (!C) return;
355
- const e = te(ae[C]);
356
- k(e), S(!0), N(!1), y(1), $(0), O([]), ee([]), oe(e, [], !0);
357
- }, oe = (e = x, o = ge, m = !1) => {
358
- const p = te(e.length ? e : ae[C]);
359
- let T = Math.floor(Math.random() * p.length), Y = p[T].name, se = 0;
360
- for (; o.includes(Y) && se < 20; )
361
- T = Math.floor(Math.random() * p.length), Y = p[T].name, se++;
362
- k(p), H(T), ee([...o, Y]), G(!1), J(""), K(20), B(null), m ? (L("ready"), _(3), j(10)) : (L("memorize"), j(10));
358
+ const ne = (e) => [...e].sort(() => Math.random() - 0.5).slice(0, 6), oe = () => {
359
+ if (!w) return;
360
+ const e = ne(ae[w]);
361
+ I(e), k(!0), G(!1), T(1), $(0), O([]), te([]), ie(e, [], !0);
362
+ }, ie = (e = b, o = ge, m = !1) => {
363
+ const p = ne(e.length ? e : ae[w]);
364
+ let z = Math.floor(Math.random() * p.length), Y = p[z].name, le = 0;
365
+ for (; o.includes(Y) && le < 20; )
366
+ z = Math.floor(Math.random() * p.length), Y = p[z].name, le++;
367
+ I(p), ce(z), te([...o, Y]), N(!1), Q(""), J(20), H(null), m ? (L("ready"), K(3), j(10)) : (L("memorize"), j(10));
363
368
  };
364
- P(() => {
365
- if (!(!h || A || M)) {
366
- if (w === "ready")
367
- if (Z <= 0) L("memorize");
369
+ U(() => {
370
+ if (!(!x || A || R)) {
371
+ if (v === "ready")
372
+ if (_ <= 0) L("memorize");
368
373
  else {
369
- const e = setTimeout(() => _((o) => o - 1), 1e3);
374
+ const e = setTimeout(() => K((o) => o - 1), 1e3);
370
375
  return () => clearTimeout(e);
371
376
  }
372
- if (w === "memorize")
373
- if (W <= 0) L("guess");
377
+ if (v === "memorize")
378
+ if (E <= 0) L("guess");
374
379
  else {
375
380
  const e = setTimeout(() => j((o) => o - 1), 1e3);
376
381
  return () => clearTimeout(e);
377
382
  }
378
- if (w === "guess") {
383
+ if (v === "guess") {
379
384
  if (F <= 0) {
380
- G(!0), B("wrong");
381
- const o = x[b].name;
385
+ N(!0), H("wrong");
386
+ const o = b[y].name;
382
387
  O((m) => [
383
388
  ...m,
384
- { round: v, answer: E, correct: o, result: "wrong" }
389
+ { round: h, answer: W, correct: o, result: "wrong" }
385
390
  ]);
386
391
  return;
387
392
  }
388
- const e = setTimeout(() => K((o) => o - 1), 1e3);
393
+ const e = setTimeout(() => J((o) => o - 1), 1e3);
389
394
  return () => clearTimeout(e);
390
395
  }
391
396
  }
392
- }, [w, Z, W, F, h, A, M, x, b, v, E]);
393
- const he = () => {
394
- if (b === null || D) return;
395
- const e = x[b].name, o = E.toLowerCase().trim();
397
+ }, [v, _, E, F, x, A, R, b, y, h, W]);
398
+ const fe = () => {
399
+ if (y === null || D) return;
400
+ const e = b[y].name, o = W.toLowerCase().trim();
396
401
  let m = "wrong";
397
- o === e ? ($((p) => p + 1), B("correct"), m = "correct") : Te(o, e) === 1 ? ($((p) => p + 0.5), B("almost"), m = "almost") : (B("wrong"), m = "wrong"), O((p) => [...p, { round: v, answer: o, correct: e, result: m }]), Q(!0), setTimeout(() => {
398
- Q(!1), G(!0);
402
+ o === e ? ($((p) => p + 1), H("correct"), m = "correct") : Re(o, e) === 1 ? ($((p) => p + 0.5), H("almost"), m = "almost") : (H("wrong"), m = "wrong"), O((p) => [...p, { round: h, answer: o, correct: e, result: m }]), X(!0), setTimeout(() => {
403
+ X(!1), N(!0);
399
404
  }, 600);
400
- }, fe = () => v < z ? (y((e) => e + 1), oe()) : N(!0), pe = () => {
401
- S(!1), N(!1), R(null);
402
- }, ye = le(
403
- () => /* @__PURE__ */ n("div", { style: { ...t.gmLogoFixed, position: "absolute", top: 16, left: 16, zIndex: 30 }, children: /* @__PURE__ */ l("picture", { children: [
405
+ }, pe = () => h < l ? (T((e) => e + 1), ie()) : G(!0), ye = () => {
406
+ k(!1), G(!1), S(null);
407
+ }, we = P(
408
+ () => /* @__PURE__ */ n("div", { style: { ...t.gmLogoFixed, position: "absolute", top: 16, left: 16, zIndex: 30 }, children: /* @__PURE__ */ a("picture", { children: [
404
409
  /* @__PURE__ */ n(
405
410
  "source",
406
411
  {
@@ -419,10 +424,10 @@ function He({
419
424
  )
420
425
  ] }) }),
421
426
  []
422
- ), ie = 1200, re = 700, q = le(() => {
423
- const e = s ?? (typeof window < "u" ? window.innerWidth : ie), o = g ?? (typeof window < "u" ? window.innerHeight : re), m = Math.min(e / ie, o / re);
427
+ ), re = 1200, se = 700, q = P(() => {
428
+ const e = r ?? (typeof window < "u" ? window.innerWidth : re), o = u ?? (typeof window < "u" ? window.innerHeight : se), m = Math.min(e / re, o / se);
424
429
  return Math.min(1.15, Math.max(0.92, m));
425
- }, [s, g, f]);
430
+ }, [r, u, f]);
426
431
  return /* @__PURE__ */ n(
427
432
  "div",
428
433
  {
@@ -440,10 +445,10 @@ function He({
440
445
  children: /* @__PURE__ */ n(
441
446
  "div",
442
447
  {
443
- ref: u,
448
+ ref: g,
444
449
  style: {
445
- width: f ? "100%" : `${Math.min(r ?? 1e3, s ?? 1e3, g ?? 1e3)}px`,
446
- height: f ? "100%" : `${Math.min(r ?? 1e3, s ?? 1e3, g ?? 1e3)}px`,
450
+ width: f ? "100%" : `${B}px`,
451
+ height: f ? "100%" : `${B}px`,
447
452
  borderRadius: f ? 0 : "20px",
448
453
  background: "linear-gradient(to bottom, #fff8f8 0%, #f9fafb 100%)",
449
454
  position: "relative",
@@ -453,7 +458,7 @@ function He({
453
458
  justifyContent: "center",
454
459
  alignItems: "center"
455
460
  },
456
- children: /* @__PURE__ */ l(
461
+ children: /* @__PURE__ */ a(
457
462
  "div",
458
463
  {
459
464
  id: "whats-missing-root",
@@ -469,68 +474,68 @@ function He({
469
474
  alignItems: "center"
470
475
  },
471
476
  children: [
472
- !f && ye,
473
- !C && !h && /* @__PURE__ */ l("div", { style: t.gmCenterScreen, children: [
477
+ !f && we,
478
+ !w && !x && /* @__PURE__ */ a("div", { style: t.gmCenterScreen, children: [
474
479
  /* @__PURE__ */ n("h1", { style: t.gmHeadline1, children: "WHAT'S MISSING?" }),
475
480
  /* @__PURE__ */ n("p", { style: t.gmBodyM, children: "Select a theme:" }),
476
- /* @__PURE__ */ n("div", { style: { display: "flex", gap: 16 }, children: ["animals", "food", "toys"].map((e) => /* @__PURE__ */ n("button", { style: t.gmButton, onClick: () => R(e), children: e === "animals" ? "🐶 Animals" : e === "food" ? "🍎 Food" : "🧸 Toys" }, e)) }),
477
- /* @__PURE__ */ l("div", { style: { marginTop: 24 }, children: [
481
+ /* @__PURE__ */ n("div", { style: { display: "flex", gap: 16 }, children: ["animals", "food", "toys"].map((e) => /* @__PURE__ */ n("button", { style: t.gmButton, onClick: () => S(e), children: e === "animals" ? "🐶 Animals" : e === "food" ? "🍎 Food" : "🧸 Toys" }, e)) }),
482
+ /* @__PURE__ */ a("div", { style: { marginTop: 24 }, children: [
478
483
  /* @__PURE__ */ n("p", { style: t.gmBodyS, children: "Choose number of rounds:" }),
479
484
  /* @__PURE__ */ n("div", { style: { display: "flex", gap: 12, marginTop: 8 }, children: [3, 4, 5].map((e) => /* @__PURE__ */ n(
480
485
  "button",
481
486
  {
482
487
  style: {
483
488
  ...t.gmButton,
484
- ...z === e ? t.gmButtonActive : {}
489
+ ...l === e ? t.gmButtonActive : {}
485
490
  },
486
- onClick: () => d(e),
491
+ onClick: () => C(e),
487
492
  children: e
488
493
  },
489
494
  e
490
495
  )) })
491
496
  ] })
492
497
  ] }),
493
- C && !h && /* @__PURE__ */ l("div", { style: t.gmCenterScreen, children: [
494
- /* @__PURE__ */ l("h1", { style: t.gmHeadline1, children: [
498
+ w && !x && /* @__PURE__ */ a("div", { style: t.gmCenterScreen, children: [
499
+ /* @__PURE__ */ a("h1", { style: t.gmHeadline1, children: [
495
500
  "Theme selected: ",
496
- C
501
+ w
497
502
  ] }),
498
- /* @__PURE__ */ l("p", { style: t.gmBodyM, children: [
503
+ /* @__PURE__ */ a("p", { style: t.gmBodyM, children: [
499
504
  "Rounds: ",
500
- z
505
+ l
501
506
  ] }),
502
- /* @__PURE__ */ n("button", { style: t.gmButton, onClick: ne, children: "▶ Start game" })
507
+ /* @__PURE__ */ n("button", { style: t.gmButton, onClick: oe, children: "▶ Start game" })
503
508
  ] }),
504
- A && /* @__PURE__ */ l("div", { style: t.gmCenterScreen, children: [
509
+ A && /* @__PURE__ */ a("div", { style: t.gmCenterScreen, children: [
505
510
  /* @__PURE__ */ n("h1", { style: t.gmHeadline1, children: "Results" }),
506
- /* @__PURE__ */ l("h2", { style: t.gmHeadline3, children: [
511
+ /* @__PURE__ */ a("h2", { style: t.gmHeadline3, children: [
507
512
  "Your score: ",
508
- ce,
513
+ me,
509
514
  " / ",
510
- z
515
+ l
511
516
  ] }),
512
517
  /* @__PURE__ */ n("p", { style: { ...t.gmBodyM, color: "#10b981", marginTop: 12 }, children: "Yahoo! You did it! 🍬✨" }),
513
- /* @__PURE__ */ l("table", { style: t.gmTable, children: [
514
- /* @__PURE__ */ n("thead", { children: /* @__PURE__ */ l("tr", { children: [
518
+ /* @__PURE__ */ a("table", { style: t.gmTable, children: [
519
+ /* @__PURE__ */ n("thead", { children: /* @__PURE__ */ a("tr", { children: [
515
520
  /* @__PURE__ */ n("th", { children: "Round" }),
516
521
  /* @__PURE__ */ n("th", { children: "Your Answer" }),
517
522
  /* @__PURE__ */ n("th", { children: "Correct" }),
518
523
  /* @__PURE__ */ n("th", { children: "Result" })
519
524
  ] }) }),
520
- /* @__PURE__ */ n("tbody", { children: me.map((e, o) => /* @__PURE__ */ l("tr", { children: [
525
+ /* @__PURE__ */ n("tbody", { children: ue.map((e, o) => /* @__PURE__ */ a("tr", { children: [
521
526
  /* @__PURE__ */ n("td", { style: t.gmTableCell, children: e.round }),
522
527
  /* @__PURE__ */ n("td", { style: t.gmTableCell, children: e.answer || "—" }),
523
528
  /* @__PURE__ */ n("td", { style: t.gmTableCell, children: e.correct }),
524
529
  /* @__PURE__ */ n("td", { style: t.gmTableCell, children: e.result === "correct" ? "✔ Correct" : e.result === "almost" ? "◐ Almost (0.5)" : "✘ Wrong" })
525
530
  ] }, o)) })
526
531
  ] }),
527
- /* @__PURE__ */ l("div", { style: { display: "flex", gap: 12, marginTop: 24 }, children: [
528
- /* @__PURE__ */ n("button", { style: t.gmButton, onClick: ne, children: "🔁 Play again" }),
529
- /* @__PURE__ */ n("button", { style: t.gmButton, onClick: pe, children: "⬅️ Choose theme" })
532
+ /* @__PURE__ */ a("div", { style: { display: "flex", gap: 12, marginTop: 24 }, children: [
533
+ /* @__PURE__ */ n("button", { style: t.gmButton, onClick: oe, children: "🔁 Play again" }),
534
+ /* @__PURE__ */ n("button", { style: t.gmButton, onClick: ye, children: "⬅️ Choose theme" })
530
535
  ] })
531
536
  ] }),
532
- h && !A && /* @__PURE__ */ l("div", { style: t.gmGameLayout, children: [
533
- /* @__PURE__ */ l(
537
+ x && !A && /* @__PURE__ */ a("div", { style: t.gmGameLayout, children: [
538
+ /* @__PURE__ */ a(
534
539
  "div",
535
540
  {
536
541
  style: {
@@ -541,16 +546,16 @@ function He({
541
546
  alignItems: "center"
542
547
  },
543
548
  children: [
544
- w === "ready" && /* @__PURE__ */ l(be, { children: [
549
+ v === "ready" && /* @__PURE__ */ a(be, { children: [
545
550
  /* @__PURE__ */ n("h1", { style: { ...t.gmHeadline1, color: "#ec4c44" }, children: "GET READY" }),
546
551
  /* @__PURE__ */ n("div", { style: t.gmHourglass, children: "⏳" })
547
552
  ] }),
548
- w === "memorize" && /* @__PURE__ */ l("p", { style: { ...t.gmBodyM, color: "#10b981" }, children: [
553
+ v === "memorize" && /* @__PURE__ */ a("p", { style: { ...t.gmBodyM, color: "#10b981" }, children: [
549
554
  "MEMORIZE (",
550
- W,
555
+ E,
551
556
  ")"
552
557
  ] }),
553
- w === "guess" && !M && /* @__PURE__ */ l("p", { style: t.gmBodyM, children: [
558
+ v === "guess" && !R && /* @__PURE__ */ a("p", { style: t.gmBodyM, children: [
554
559
  "⏳ Time left: ",
555
560
  F,
556
561
  "s"
@@ -558,7 +563,7 @@ function He({
558
563
  ]
559
564
  }
560
565
  ),
561
- w !== "ready" && /* @__PURE__ */ n(
566
+ v !== "ready" && /* @__PURE__ */ n(
562
567
  "div",
563
568
  {
564
569
  style: {
@@ -576,8 +581,8 @@ function He({
576
581
  maxHeight: f ? "100%" : 400,
577
582
  boxSizing: "border-box"
578
583
  },
579
- children: x.map((e, o) => {
580
- const m = b === o && w === "guess" && !M;
584
+ children: b.map((e, o) => {
585
+ const m = y === o && v === "guess" && !R;
581
586
  return /* @__PURE__ */ n(
582
587
  "div",
583
588
  {
@@ -585,8 +590,8 @@ function He({
585
590
  ...t.gmCard,
586
591
  width: "100%",
587
592
  height: "100%",
588
- ...X === "correct" && b === o ? t.gmCorrect : {},
589
- ...X === "wrong" && b === o ? t.gmWrong : {}
593
+ ...ee === "correct" && y === o ? t.gmCorrect : {},
594
+ ...ee === "wrong" && y === o ? t.gmWrong : {}
590
595
  },
591
596
  children: !m && /* @__PURE__ */ n(
592
597
  "img",
@@ -607,15 +612,15 @@ function He({
607
612
  })
608
613
  }
609
614
  ),
610
- /* @__PURE__ */ l("div", { style: { marginTop: 16, height: 80 }, children: [
611
- w === "guess" && !M && /* @__PURE__ */ l("div", { children: [
615
+ /* @__PURE__ */ a("div", { style: { marginTop: 16, height: 80 }, children: [
616
+ v === "guess" && !R && /* @__PURE__ */ a("div", { children: [
612
617
  /* @__PURE__ */ n(
613
618
  "input",
614
619
  {
615
620
  type: "text",
616
621
  placeholder: "Type the missing word",
617
- value: E,
618
- onChange: (e) => J(e.target.value),
622
+ value: W,
623
+ onChange: (e) => Q(e.target.value),
619
624
  style: t.gmInput
620
625
  }
621
626
  ),
@@ -623,13 +628,13 @@ function He({
623
628
  "button",
624
629
  {
625
630
  style: { ...t.gmButton, marginLeft: 8 },
626
- onClick: he,
631
+ onClick: fe,
627
632
  disabled: D,
628
633
  children: D ? "..." : "Check"
629
634
  }
630
635
  )
631
636
  ] }),
632
- M && /* @__PURE__ */ n("button", { type: "button", style: t.gmButton, onClick: fe, children: "Next round" })
637
+ R && /* @__PURE__ */ n("button", { type: "button", style: t.gmButton, onClick: pe, children: "Next round" })
633
638
  ] })
634
639
  ] })
635
640
  ]
@@ -641,6 +646,6 @@ function He({
641
646
  );
642
647
  }
643
648
  export {
644
- He as Game,
649
+ Be as Game,
645
650
  ae as themes
646
651
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mblinkov/whats-missing",
3
- "version": "20.0.31",
3
+ "version": "20.0.32",
4
4
  "main": "dist/whats-missing.umd.js",
5
5
  "module": "dist/whats-missing.es.js",
6
6
  "types": "dist/index.d.ts",
package/src/Game.tsx CHANGED
@@ -159,6 +159,24 @@ export default function Game({
159
159
  const [squareSize, setSquareSize] = useState<number | null>(null);
160
160
  useNeutralizeBodyZoom(containerRef, { minDesktopWidth: 1024, forceResize: false });
161
161
 
162
+ // ✅ защита от слишком маленьких размеров игры
163
+ const effectiveGameCubeSize = useMemo(() => {
164
+ const baseSize = gameCubeSize ?? Math.min(screenWidth ?? 1000, screenHeight ?? 1000);
165
+ const currentWidth = screenWidth ?? (typeof window !== "undefined" ? window.innerWidth : 1000);
166
+
167
+ // минимальный предел для десктопа и планшета
168
+ if (baseSize < 600 && currentWidth > 768) {
169
+ return 600;
170
+ }
171
+
172
+ // для мобилок в портретной ориентации пусть остаётся адаптивным
173
+ if (currentWidth <= 768) {
174
+ return Math.min(baseSize, currentWidth - 20);
175
+ }
176
+
177
+ return baseSize;
178
+ }, [gameCubeSize, screenWidth, screenHeight]);
179
+
162
180
  useEffect(() => {
163
181
  globalReset();
164
182
  return () => {
@@ -381,10 +399,10 @@ export default function Game({
381
399
  style={{
382
400
  width: isMobile
383
401
  ? "100%"
384
- : `${Math.min(gameCubeSize ?? 1000, screenWidth ?? 1000, screenHeight ?? 1000)}px`,
402
+ : `${effectiveGameCubeSize}px`,
385
403
  height: isMobile
386
404
  ? "100%"
387
- : `${Math.min(gameCubeSize ?? 1000, screenWidth ?? 1000, screenHeight ?? 1000)}px`,
405
+ : `${effectiveGameCubeSize}px`,
388
406
  borderRadius: isMobile ? 0 : "20px",
389
407
  background: "linear-gradient(to bottom, #fff8f8 0%, #f9fafb 100%)",
390
408
  position: "relative",