@mblinkov/whats-missing 21.0.0 → 21.0.1

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.
@@ -0,0 +1,6 @@
1
+ export default function AdaptiveGameShell({ gameCubeSize, screenHeight, screenWidth, seed, }: {
2
+ gameCubeSize?: number;
3
+ screenHeight?: number;
4
+ screenWidth?: number;
5
+ seed?: number;
6
+ }): import("react/jsx-runtime").JSX.Element;
package/dist/Game.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ export default function Game({ gameCubeSize, screenHeight, screenWidth, seed, }: {
2
+ gameCubeSize?: number;
3
+ screenHeight?: number;
4
+ screenWidth?: number;
5
+ seed?: number;
6
+ }): import("react/jsx-runtime").JSX.Element;
7
+ export { Game };
@@ -0,0 +1,2 @@
1
+ import { CSSProperties } from 'react';
2
+ export declare const styles: Record<string, CSSProperties>;
@@ -0,0 +1,4 @@
1
+ export declare function playSound(url: string, volume?: number): void;
2
+ /** Same correct/wrong sounds as Critter Quiz (CDN in prod, /public/sounds in dev). */
3
+ export declare function resolveSoundsBaseURL(): string;
4
+ export declare function playAnswerSound(result: "correct" | "wrong"): void;
@@ -0,0 +1,5 @@
1
+ export { default as Game } from './AdaptiveGameShell';
2
+ export { default as AdaptiveGameShell } from './AdaptiveGameShell';
3
+ export { default as RawGame } from './Game';
4
+ export { themes } from './themes';
5
+ export type { Theme } from './themes';
@@ -0,0 +1,7 @@
1
+ export type Theme = "animals" | "food" | "toys" | "clothes" | "transport" | "nature" | "home" | "school" | "music" | "sports" | "body" | "weather";
2
+ export type ImageItem = {
3
+ src: string;
4
+ name: string;
5
+ aliases?: string[];
6
+ };
7
+ export declare const themes: Record<Theme, ImageItem[]>;
@@ -0,0 +1,28 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),s=require("react");var te=typeof document<"u"?document.currentScript:null;function Oe(i,c=.45){if(!(typeof window>"u"))try{const n=new Audio(i);n.volume=c;const a=()=>{n.currentTime=0,n.play().catch(()=>{})};if(n.readyState>=HTMLMediaElement.HAVE_ENOUGH_DATA){a();return}n.addEventListener("canplaythrough",a,{once:!0}),n.addEventListener("error",()=>{},{once:!0}),n.load()}catch{}}const qe="/cloud/speakid/games/critter-quiz/sounds/";function Ve(){return typeof{url:typeof document>"u"?require("url").pathToFileURL(__filename).href:te&&te.tagName.toUpperCase()==="SCRIPT"&&te.src||new URL("whats-missing.cjs.js",document.baseURI).href}<"u"&&!1?`${window.origin}/sounds/`:`${window.origin}${qe}`}function se(i){const c=i==="correct"?"correct.wav":"wrong.wav";Oe(`${Ve()}${c}`)}const Ze='@import"https://fonts.googleapis.com/css2?family=Nunito:wght@600;700;800;900&display=swap";#whats-missing-root{font-family:Nunito,Fredoka,system-ui,-apple-system,Segoe UI,sans-serif;color:#1f2937;-webkit-font-smoothing:antialiased}#whats-missing-root h1,#whats-missing-root h2,#whats-missing-root p{margin:0}#whats-missing-root button{font:inherit;color:inherit;cursor:pointer}#whats-missing-root .wm-logo{position:absolute;top:28px;left:16px;z-index:30;pointer-events:none}#whats-missing-root .wm-logo img{display:block;height:28px;width:auto;object-fit:contain}#whats-missing-root .wm-lobby{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;gap:24px;padding:40px 48px;box-sizing:border-box}#whats-missing-root .wm-lobbyHero{display:flex;align-items:center;justify-content:center;gap:20px}#whats-missing-root .wm-heroGrid{display:grid;grid-template-columns:1fr 1fr;gap:8px;width:168px;padding:10px;border-radius:18px;overflow:hidden;border:4px solid #fff;box-shadow:0 10px 28px #ec4c442e;background:#fff}#whats-missing-root .wm-heroTile{aspect-ratio:1;border-radius:10px;background:linear-gradient(180deg,#dbeafe,#93c5fd);border:2px solid #f2c4be}#whats-missing-root .wm-heroTile:nth-child(2){background:linear-gradient(180deg,#ffe8e2,#fecaca)}#whats-missing-root .wm-heroTile:nth-child(3){background:linear-gradient(180deg,#d1fae5,#86efac)}#whats-missing-root .wm-heroTileMissing{display:flex;align-items:center;justify-content:center;background:repeating-linear-gradient(45deg,#fff7f5,#fff7f5 6px,#ffe8e2 6px 12px);color:#ec4c44;font-size:28px;font-weight:900;line-height:1}#whats-missing-root .wm-lobbyArrow{width:36px;height:36px;flex-shrink:0;border-radius:50%;background:#ffffffd9;border:2px solid #f2c4be;position:relative}#whats-missing-root .wm-lobbyArrow:after{content:"";position:absolute;top:50%;left:50%;width:10px;height:10px;border-top:3px solid #ec4c44;border-right:3px solid #ec4c44;transform:translate(-60%,-50%) rotate(45deg)}#whats-missing-root .wm-lobbyGuess{display:flex;flex-direction:column;align-items:center;gap:8px}#whats-missing-root .wm-guessCard{min-width:148px;padding:18px 20px 14px;border-radius:18px;background:#ffffffeb;border:3px solid #f2c4be;box-shadow:0 6px 16px #1f29370f;text-align:center}#whats-missing-root .wm-guessPrompt{font-size:13px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:#ec4c44}#whats-missing-root .wm-guessLine{margin-top:10px;height:28px;border-bottom:3px dashed #f2c4be;font-size:22px;font-weight:900;color:#1f2937;letter-spacing:.12em}#whats-missing-root .wm-lobbyHead{display:flex;flex-direction:column;align-items:center;gap:12px}#whats-missing-root .wm-brandTitle{font-size:48px;font-weight:900;letter-spacing:-.02em;color:#1f2937;text-align:center;line-height:1.05}#whats-missing-root .wm-brandAccent{color:#ec4c44}#whats-missing-root .wm-lobbySteps{display:flex;align-items:center;gap:20px;margin:0;padding:0;list-style:none}#whats-missing-root .wm-lobbySteps li{display:flex;align-items:center;gap:8px;font-size:18px;font-weight:700;color:#4b5563}#whats-missing-root .wm-stepIcon{width:28px;height:28px;border-radius:8px;flex-shrink:0;border:2px solid #f2c4be;background:#fff;position:relative}#whats-missing-root .wm-stepIconLook{background:linear-gradient(180deg,#dbeafe,#93c5fd)}#whats-missing-root .wm-stepIconLook:after{content:"";position:absolute;inset:6px;border-radius:3px;border:2px solid #fff;box-shadow:inset 0 0 0 1px #1f293726}#whats-missing-root .wm-stepIconGuess{background:#fff7f5}#whats-missing-root .wm-stepIconGuess:after{content:"?";position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-size:16px;font-weight:900;color:#ec4c44;line-height:1}#whats-missing-root .wm-stepIconWin{background:linear-gradient(180deg,#ffe8e2,#fecaca)}#whats-missing-root .wm-stepIconWin:after{content:"";position:absolute;left:50%;top:50%;width:10px;height:10px;border-radius:50%;background:#ec4c44;transform:translate(-50%,-50%);box-shadow:-6px 0 0 -2px #f9a8a4,6px 0 0 -2px #f9a8a4}#whats-missing-root .wm-roundsRow{display:flex;flex-direction:column;align-items:center;gap:8px}#whats-missing-root .wm-roundsLabel{font-size:14px;font-weight:800;color:#6b7280}#whats-missing-root .wm-roundsPills{display:flex;gap:10px}#whats-missing-root .wm-roundPill{min-width:56px;min-height:44px;padding:0 16px;border-radius:999px;border:3px solid #f2c4be;background:#ffffffe6;color:#4b5563;font-size:20px;font-weight:800;transition:border-color .15s,background .15s,transform .12s,color .15s}#whats-missing-root .wm-roundPill:hover{border-color:#ec4c44;transform:translateY(-1px)}#whats-missing-root .wm-roundPillActive{background:#ec4c44;border-color:#ec4c44;color:#fff;box-shadow:0 4px #c73a34}#whats-missing-root .wm-playBtn,#whats-missing-root .wm-againBtn{min-width:240px;min-height:72px;padding:0 48px;border:none;border-radius:999px;background:#ec4c44;color:#fff;font-size:32px;font-weight:800;letter-spacing:.04em;box-shadow:0 10px #c73a34;transition:transform .12s ease,box-shadow .12s ease}#whats-missing-root .wm-playBtn:hover,#whats-missing-root .wm-againBtn:hover{transform:translateY(-2px);box-shadow:0 12px #c73a34}#whats-missing-root .wm-playBtn:active,#whats-missing-root .wm-againBtn:active{transform:translateY(4px);box-shadow:0 4px #c73a34}#whats-missing-root .wm-topics{display:flex;flex-direction:column;height:100%;padding:28px 48px 32px;gap:14px;box-sizing:border-box}#whats-missing-root .wm-topicsHeader{display:flex;align-items:center;gap:16px;padding-top:44px;flex-shrink:0}#whats-missing-root .wm-topicsBack,#whats-missing-root .wm-ghostBtn{flex-shrink:0;min-height:44px;padding:0 18px;border:3px solid #f2c4be;border-radius:999px;background:#ffffffe6;color:#4b5563;font-size:16px;font-weight:700;transition:border-color .15s,transform .12s,background .15s}#whats-missing-root .wm-topicsBack:hover,#whats-missing-root .wm-ghostBtn:hover{border-color:#ec4c44;background:#fff;transform:translateY(-1px)}#whats-missing-root .wm-topicsTitle{font-size:36px;font-weight:800;color:#1f2937}#whats-missing-root .wm-topicsMeta{margin-left:auto;font-size:16px;font-weight:800;color:#ec4c44;padding:4px 12px;border-radius:999px;background:#ffffffeb;border:2px solid #f2c4be}#whats-missing-root .wm-topicsGrid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;flex:1;align-content:start;overflow:auto;padding-bottom:4px}#whats-missing-root .wm-topicCard{display:flex;flex-direction:row;align-items:stretch;gap:14px;min-height:88px;padding:0 16px 0 0;overflow:hidden;border:3px solid #f2c4be;border-radius:18px;background:#ffffffd9;text-align:left;transition:border-color .15s,transform .12s,background .15s}#whats-missing-root .wm-topicCardRandom{align-items:center;padding:10px 14px;background:linear-gradient(135deg,#fff7f5,#ffe8e2);border-color:#ec4c44;border-style:dashed}#whats-missing-root .wm-topicCard:hover{border-color:#ec4c44;transform:translateY(-2px);background:#fff}#whats-missing-root .wm-topicPreview{width:110px;flex-shrink:0;align-self:stretch;object-fit:cover;object-position:center;border:none;border-radius:15px 0 0 15px;background:#fff7f5}#whats-missing-root .wm-topicRandomIcon{width:52px;height:52px;flex-shrink:0;border-radius:12px;border:2px solid #f2c4be;background:#fff;position:relative}#whats-missing-root .wm-topicRandomIcon:before,#whats-missing-root .wm-topicRandomIcon:after{content:"";position:absolute;left:50%;top:50%;width:22px;height:4px;border-radius:2px;background:#ec4c44;transform:translate(-50%,-50%)}#whats-missing-root .wm-topicRandomIcon:after{transform:translate(-50%,-50%) rotate(90deg)}#whats-missing-root .wm-topicBody{display:flex;flex-direction:column;align-items:flex-start;justify-content:center;gap:2px;min-width:0}#whats-missing-root .wm-topicLabel{font-size:18px;font-weight:800;color:#1f2937;line-height:1.2}#whats-missing-root .wm-topicExample{font-size:13px;color:#6b7280;line-height:1.25;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}#whats-missing-root .wm-final{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;gap:14px;padding:48px;box-sizing:border-box}#whats-missing-root .wm-finalTitle{font-size:52px;font-weight:900;color:#ec4c44}#whats-missing-root .wm-finalScore{font-size:26px;font-weight:700;color:#4b5563}#whats-missing-root .wm-finalTeamLabel{font-size:22px;font-weight:800;color:#1f2937;margin-top:4px}#whats-missing-root .wm-trophyRow{display:flex;flex-wrap:wrap;justify-content:center;gap:16px;max-width:960px;margin:8px 0 12px;min-height:140px}#whats-missing-root .wm-trophyCard{display:flex;flex-direction:column;align-items:center;gap:8px;min-width:120px}#whats-missing-root .wm-trophy{width:112px;height:112px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;background:#ffffffd9;border-radius:24px;border:4px solid #f2c4be;padding:8px}#whats-missing-root .wm-trophy.correct{border-color:#10b981;background:#ecfdf5}#whats-missing-root .wm-trophy.almost{border-color:#f59e0b;background:#fffbeb}#whats-missing-root .wm-trophy.wrong{border-color:#ef4444;background:#fef2f2}#whats-missing-root .wm-trophyMark{font-size:28px;font-weight:900;line-height:1}#whats-missing-root .wm-trophy.correct .wm-trophyMark{color:#059669}#whats-missing-root .wm-trophy.almost .wm-trophyMark{color:#d97706}#whats-missing-root .wm-trophy.wrong .wm-trophyMark{color:#dc2626}#whats-missing-root .wm-trophyWord{font-size:13px;font-weight:800;color:#1f2937;text-align:center;max-width:100px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#whats-missing-root .wm-trophyEmpty{font-size:20px;color:#9ca3af;align-self:center}#whats-missing-root .wm-finalActions{display:flex;align-items:center;gap:14px;margin-top:8px}#whats-missing-root .wm-againBtn{font-size:26px;min-width:260px}#whats-missing-root .wm-play{display:flex;flex-direction:column;height:100%;min-height:0;padding:56px 40px 16px;box-sizing:border-box;gap:10px;position:relative}#whats-missing-root .wm-play--ready{justify-content:center;align-items:center;padding:0;gap:0}#whats-missing-root .wm-play--ready .wm-playStatus{min-height:0}#whats-missing-root .wm-play--ready .wm-playControls{display:none}#whats-missing-root .wm-playStatus{flex-shrink:0;text-align:center;font-size:22px;font-weight:800;color:#4b5563;min-height:32px;line-height:1.2}#whats-missing-root .wm-playStatusReady{color:#ec4c44;font-size:48px;font-weight:900;letter-spacing:.04em}#whats-missing-root .wm-readyBlock{display:flex;flex-direction:column;align-items:center;gap:28px}#whats-missing-root .wm-readyLoad{display:flex;flex-direction:column;align-items:center;gap:18px}#whats-missing-root .wm-readyTiles{display:grid;grid-template-columns:1fr 1fr;gap:6px;width:120px;padding:8px;border-radius:16px;overflow:hidden;border:4px solid #fff;box-shadow:0 10px 28px #ec4c442e;background:#fff}#whats-missing-root .wm-readyTiles .wm-heroTile{border-radius:8px}#whats-missing-root .wm-play--ready .wm-heroTileMissing{animation:wm-ready-pulse .9s ease-in-out infinite}#whats-missing-root .wm-readyBar{width:220px;height:14px;border-radius:999px;background:#fff;border:3px solid #f2c4be;box-shadow:0 4px #f2c4be;overflow:hidden;box-sizing:border-box}#whats-missing-root .wm-readyBarFill{display:block;height:100%;width:0;border-radius:inherit;background:#ec4c44;animation:wm-ready-fill var(--wm-ready-s, 5s) linear forwards}@keyframes wm-ready-fill{0%{width:0}to{width:100%}}@keyframes wm-ready-pulse{0%,to{transform:scale(1)}50%{transform:scale(.92)}}#whats-missing-root .wm-playStatusMemorize{color:#10b981}#whats-missing-root .wm-playSlot{flex:1 1 0;min-height:0;width:100%;display:flex;align-items:center;justify-content:center}#whats-missing-root .wm-playGrid{display:grid;grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr;gap:16px;width:min(100%,580px);aspect-ratio:1 / 1;max-height:100%}#whats-missing-root .wm-playCard{min-width:0;min-height:0;border-radius:18px;overflow:hidden;background:#fff;border:3px solid #f2c4be;box-shadow:0 8px 22px #ec4c441a;display:flex;align-items:center;justify-content:center}#whats-missing-root .wm-playCard img{width:100%;height:100%;object-fit:cover;object-position:center}#whats-missing-root .wm-playCardCorrect{border-color:#10b981;background:#ecfdf5;box-shadow:0 0 18px #10b98173}#whats-missing-root .wm-playCardWrong{border-color:#ec4c44;background:#fef2f2;box-shadow:0 0 18px #ec4c4459}#whats-missing-root .wm-playControls{flex-shrink:0;min-height:72px;display:flex;align-items:center;justify-content:center}#whats-missing-root .wm-guessRow{display:flex;align-items:center;justify-content:center;gap:12px}#whats-missing-root .wm-guessInput{width:280px;min-height:52px;padding:0 18px;border:3px solid #f2c4be;border-radius:16px;background:#fff;color:#1f2937;font-size:20px;font-weight:700;outline:none;box-sizing:border-box}#whats-missing-root .wm-guessInput:focus{border-color:#ec4c44}#whats-missing-root .wm-guessInput::placeholder{color:#9ca3af;font-weight:600}#whats-missing-root .wm-actionBtn{min-height:52px;min-width:140px;padding:0 28px;border:none;border-radius:999px;background:#ec4c44;color:#fff;font-size:20px;font-weight:800;letter-spacing:.02em;box-shadow:0 6px #c73a34;transition:transform .12s ease,box-shadow .12s ease}#whats-missing-root .wm-actionBtn:hover{transform:translateY(-2px);box-shadow:0 8px #c73a34}#whats-missing-root .wm-actionBtn:active{transform:translateY(3px);box-shadow:0 3px #c73a34}#whats-missing-root .wm-actionBtn:disabled{opacity:.7;cursor:default;transform:none;box-shadow:0 6px #c73a34}@media(prefers-reduced-motion:reduce){#whats-missing-root .wm-playBtn,#whats-missing-root .wm-againBtn,#whats-missing-root .wm-topicCard,#whats-missing-root .wm-roundPill,#whats-missing-root .wm-topicsBack,#whats-missing-root .wm-ghostBtn,#whats-missing-root .wm-actionBtn{transition:none}#whats-missing-root .wm-play--ready .wm-heroTileMissing{animation:none}#whats-missing-root .wm-readyBarFill{animation:none;width:100%}}',Ke=window.origin+"/cloud/speakid/games/whatsmissing/",Qe=i=>Ke,g=(i,c)=>i.map(([n,a,...d])=>({src:`${Qe()}${c}/${a.replace(/\s/g,"%20")}.png`,name:a,aliases:d?.length?d:void 0})),Xe=[["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"]],Je=[["bear","bear"],["cat","cat"],["crocodile","crocodile","alligator"],["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","turtle"],["wolf","wolf"],["zebra","zebra"]],et=[["ball","ball"],["balloon","balloon"],["blocks","blocks"],["car","car"],["doll","doll"],["drum","drum"],["robot","robot"],["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"]],tt=[["t-shirt","T-shirt"],["dress","dress"],["hat","hat"],["shoes","shoes"],["socks","socks"],["coat","coat"],["skirt","skirt"],["trousers","trousers"],["jacket","jacket"],["scarf","scarf"],["gloves","gloves"],["shorts","shorts"],["cap","cap"],["boots","boots"],["pyjamas","pyjamas"]],st=[["car","car"],["bus","bus"],["bike","bike"],["train","train"],["plane","plane"],["boat","boat"],["ship","ship"],["helicopter","helicopter"],["lorry","lorry","truck"],["taxi","taxi"],["rocket","rocket"],["van","van"],["motorbike","motorbike"],["tram","tram"],["submarine","submarine"]],ot=[["sun","sun"],["cloud","cloud"],["rain","rain"],["tree","tree"],["flower","flower"],["grass","grass"],["star","star"],["moon","moon"],["mountain","mountain"],["river","river"],["rainbow","rainbow"],["snowman","snowman"],["snow","snow"],["butterfly","butterfly"],["bird","bird"]],it=[["bed","bed"],["table","table"],["chair","chair"],["door","door"],["window","window"],["lamp","lamp"],["sofa","sofa"],["clock","clock"],["key","key"],["phone","phone"],["tv","TV"],["cup","cup"],["plate","plate"],["mirror","mirror"],["book","book"]],nt=[["book","book"],["pen","pen"],["pencil","pencil"],["bag","bag"],["ruler","ruler"],["rubber","rubber","eraser"],["desk","desk"],["board","board"],["crayon","crayon"],["glue","glue"],["scissors","scissors"],["notebook","notebook"],["pencil_case","pencil case"],["paintbrush","paintbrush"],["backpack","backpack"]],rt=[["piano","piano"],["bell","bell","bells"],["radio","radio"],["cd","CD","disc"],["mic","mic","microphone"],["singer","singer"],["dancer","dancer"],["stage","stage"],["band","band"],["ticket","ticket"],["karaoke","karaoke"],["guitar","guitar"],["fan","fan"]],at=[["football","football","soccer"],["basketball","basketball"],["tennis","tennis"],["skiing","skiing","ski"],["swimming","swimming","swim"],["skating","skating","ice skating"],["hockey","hockey","ice hockey"],["volleyball","volleyball"],["golf","golf"],["boxing","boxing"],["running","running","run"],["medal","medal"],["trophy","trophy"],["whistle","whistle"],["helmet","helmet"]],ct=[["head","head"],["eye","eye","eyes"],["ear","ear","ears"],["nose","nose"],["mouth","mouth"],["hand","hand","hands"],["finger","finger","fingers"],["arm","arm","arms"],["leg","leg","legs"],["foot","foot","feet"],["knee","knee","knees"],["hair","hair"],["tooth","tooth","teeth"],["tongue","tongue"],["shoulder","shoulder","shoulders"]],lt=[["umbrella","umbrella"],["lightning","lightning","thunder"],["wind","wind"],["storm","storm"],["fog","fog","mist"],["ice","ice"],["raincoat","raincoat"],["puddle","puddle"],["snowflake","snowflake"],["icicle","icicle"],["thermometer","thermometer"],["tornado","tornado"],["raindrop","raindrop","drop"],["frost","frost"]],S={food:g(Xe,"food"),animals:g(Je,"animals"),toys:g(et,"toys"),clothes:g(tt,"clothes"),transport:g(st,"transport"),nature:g(ot,"nature"),home:g(it,"home"),school:g(nt,"school"),music:g(rt,"music"),sports:g(at,"sports"),body:g(ct,"body"),weather:g(lt,"weather")},oe=["animals","food","toys","clothes","transport","nature","home","school","music","sports","body","weather"],dt={animals:"Animals",food:"Food",toys:"Toys",clothes:"Clothes",transport:"Transport",nature:"Nature",home:"Home",school:"School",music:"Music",sports:"Sports",body:"Body",weather:"Weather"},mt={animals:"cat, dog, bear…",food:"apple, pizza, cake…",toys:"ball, doll, robot…",clothes:"T-shirt, hat, shoes…",transport:"car, bus, plane…",nature:"sun, tree, flower…",home:"bed, table, lamp…",school:"book, pen, bag…",music:"piano, guitar, singer…",sports:"football, skiing, medal…",body:"head, hand, eye…",weather:"umbrella, storm, snowflake…"},pt=()=>{const i=document.createElement("style");i.id="whats-missing-reset",i.textContent=`
2
+ #whats-missing-root, #whats-missing-root * {
3
+ box-sizing: border-box;
4
+ font-family: "Nunito", "Fredoka", system-ui, -apple-system, "Segoe UI", sans-serif;
5
+ }
6
+ #whats-missing-root img {
7
+ max-width: 100%;
8
+ height: auto;
9
+ display: block;
10
+ user-select: none;
11
+ }
12
+ html, body {
13
+ margin: 0 !important;
14
+ padding: 0 !important;
15
+ width: 100% !important;
16
+ height: 100% !important;
17
+ overflow: hidden !important;
18
+ zoom: 1 !important; /* ✅ защита от подзума */
19
+ }
20
+ #root {
21
+ margin: 0 !important;
22
+ padding: 0 !important;
23
+ width: 100% !important;
24
+ height: 100% !important;
25
+ overflow: hidden !important;
26
+ }
27
+ ${Ze}
28
+ `;const c=document.getElementById("whats-missing-reset");c&&c.remove(),document.head.appendChild(i)};class ht{constructor(c){this.seed=c}next(){return this.seed=(this.seed*1664525+1013904223)%Math.pow(2,32),this.seed/Math.pow(2,32)}nextInt(c){return Math.floor(this.next()*c)}}const wt=(i,c)=>{const n=Array.from({length:i.length+1},()=>Array(c.length+1).fill(0));for(let a=0;a<=i.length;a++)n[a][0]=a;for(let a=0;a<=c.length;a++)n[0][a]=a;for(let a=1;a<=i.length;a++)for(let d=1;d<=c.length;d++)n[a][d]=i[a-1]===c[d-1]?n[a-1][d-1]:Math.min(n[a-1][d-1],n[a][d-1],n[a-1][d])+1;return n[i.length][c.length]},gt=i=>new Promise(c=>{const n=new Image;n.onload=()=>c(n),n.onerror=()=>c(n),n.src=i}),ie=async(i,c)=>{const n=new Map,a=i.map(async d=>{const u=await gt(d);n.set(d,u)});return await Promise.allSettled(a),n};function xe({gameCubeSize:i,screenHeight:c,screenWidth:n,seed:a}){const d=s.useRef(null);s.useEffect(()=>(pt(),()=>{document.documentElement.style.overflow="",document.body.style.overflow="";const t=document.getElementById("whats-missing-reset");t&&t.remove(),x.current&&x.current.abort()}),[]);const[u,T]=s.useState(null),[h,I]=s.useState([]),[P,ye]=s.useState(4),[ne,W]=s.useState(1),[N,re]=s.useState(!1),[M,ae]=s.useState(1),[b,ke]=s.useState(null),[f,R]=s.useState("ready"),[_,ce]=s.useState(5),[U,Y]=s.useState(6),[F,le]=s.useState(20),[je,O]=s.useState(0),[L,q]=s.useState(!1),[E,de]=s.useState(""),[k,V]=s.useState(!1),[C,me]=s.useState(!1),[pe,z]=s.useState(null),[he,Z]=s.useState([]),[ve,we]=s.useState([]),[ut,Se]=s.useState(!1),[xt,B]=s.useState(1),[bt,A]=s.useState(null),[yt,Ie]=s.useState(!1),[kt,Ne]=s.useState(!1),[jt,ze]=s.useState(!1),[vt,Te]=s.useState(!1),[St,Pe]=s.useState(!1),[It,Me]=s.useState(!1),[Nt,Re]=s.useState(!1),[zt,Le]=s.useState(!1),[Tt,Ee]=s.useState(!1),[Pt,Ce]=s.useState(!1),K=s.useRef(new Set),G=s.useRef(new Map),x=s.useRef(null),j=s.useRef(null);s.useEffect(()=>{a!==void 0?j.current=new ht(a):j.current=null},[a]);const Be=()=>j.current?j.current.next():Math.random(),Q=t=>j.current?j.current.nextInt(t):Math.floor(Math.random()*t);s.useEffect(()=>{const t=()=>{const o=n??window.innerWidth,r=c??window.innerHeight,l=o<768||o===926&&r===428||o===932&&r===430,m=r<700,p=o/r>1.8,w=o===768&&r===1024,ue=o===1024&&r===768,H=o===820&&r===1180,y=o===1180&&r===820,v=o===540&&r===720,$e=o===720&&r===540,We=o===1024&&r===1366,_e=o===1366&&r===1024,Ue=o>=1200&&r>=600&&!l;if(Ie(Ue),Ne(w),ze(ue),Te(H),Pe(y),Me(v),Re($e),Le(We),Ee(_e),Ce(p),Se(l),l)A(i&&i>=320?i:null),B(1);else if(m)A(i&&i>=400?i:null),B(1);else if(p){const ee=i?Math.max(400,Math.min(1200,i)):Math.min(1e3,Math.min(o,r)*.9);A(ee),B(1)}else{const ee=i?Math.max(400,Math.min(1200,i)):Math.min(1e3,Math.min(o,r)*.9);A(ee),B(1)}};return t(),window.addEventListener("resize",t),()=>window.removeEventListener("resize",t)},[n,c,i]);const X=t=>[...t].sort(()=>Be()-.5).slice(0,4),Ae=t=>{x.current&&x.current.abort(),x.current=new AbortController;const r=S[t].map(l=>l.src);ie(r,x.current.signal).then(l=>{r.forEach(m=>{K.current.add(m),l.has(m)&&G.current.set(m,l.get(m))})}).catch(()=>{})},J=t=>{const o=t??u;if(!o)return;t&&T(t),Ae(o);const r=X(S[o]);I(r),re(!0),q(!1),ae(1),O(0),Z([]),we([]);const l=r.map(m=>m.src);ie(l,x.current?.signal).then(m=>{l.forEach(p=>{K.current.add(p),m.has(p)&&G.current.set(p,m.get(p))})}).catch(()=>{}),ge(r,[],!0)},ge=(t=h,o=ve,r=!1)=>{const l=X(t.length?t:S[u]);let m=Q(l.length),p=l[m].name,w=0;for(;o.includes(p)&&w<20;)m=Q(l.length),p=l[m].name,w++;if(I(l),ke(m),we([...o,p]),V(!1),de(""),le(20),z(null),u&&!r){const H=X(S[u].filter(y=>!o.includes(y.name))).map(y=>y.src);ie(H,x.current?.signal).then(y=>{H.forEach(v=>{K.current.add(v),y.has(v)&&G.current.set(v,y.get(v))})}).catch(()=>{})}r?(R("ready"),ce(5),Y(6)):(R("memorize"),Y(6))};s.useEffect(()=>{if(!(!N||L||k)){if(f==="ready")if(_<=0)R("memorize");else{const t=setTimeout(()=>ce(o=>o-1),1e3);return()=>clearTimeout(t)}if(f==="memorize")if(U<=0)R("guess");else{const t=setTimeout(()=>Y(o=>o-1),1e3);return()=>clearTimeout(t)}if(f==="guess"){if(F<=0){V(!0),z("wrong");const o=h[b].name,r=h[b].aliases,l=[o,...r||[]].join(", ");Z(m=>[...m,{round:M,answer:E,correct:l,result:"wrong"}]);return}const t=setTimeout(()=>le(o=>o-1),1e3);return()=>clearTimeout(t)}}},[f,_,U,F,N,L,k,h,b,M,E]);const fe=()=>{if(b===null||C)return;const t=h[b].name,o=h[b].aliases,r=E.toLowerCase().trim();let l="wrong";const m=[t,...o||[]].map(w=>w.toLowerCase()),p=[t,...o||[]].join(", ");m.includes(r)?(O(w=>w+1),z("correct"),l="correct",se("correct")):m.some(w=>wt(r,w)===1)?(O(w=>w+.5),z("almost"),l="almost",se("correct")):(z("wrong"),l="wrong",se("wrong")),Z(w=>[...w,{round:M,answer:r,correct:p,result:l}]),me(!0),setTimeout(()=>{me(!1),V(!0)},600)},Ge=()=>M<P?(ae(t=>t+1),ge()):q(!0),He=()=>{x.current&&x.current.abort(),re(!1),q(!1),T(null),W(2)},De=s.useMemo(()=>e.jsx("div",{className:"wm-logo",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",loading:"lazy",draggable:!1})]})}),[]);return e.jsx("div",{ref:d,style:{width:"100%",height:"100%",display:"flex",justifyContent:"center",alignItems:"center",background:"radial-gradient(ellipse 80% 60% at 20% 10%, rgba(236, 76, 68, 0.12), transparent 55%), radial-gradient(ellipse 70% 50% at 90% 80%, rgba(123, 200, 164, 0.18), transparent 50%), linear-gradient(160deg, #fff7f5 0%, #ffe8e2 45%, #fff4ec 100%)",transition:"background 0.3s ease",overflow:"hidden",position:"absolute",top:0,left:0,right:0,bottom:0},children:e.jsx("div",{style:{width:"100%",height:"100%",display:"flex",justifyContent:"center",alignItems:"center",overflow:"hidden",borderRadius:0,background:"transparent",boxShadow:"none",margin:"0 auto",position:"relative",transform:"none"},children:e.jsx("div",{style:{transform:"translateZ(0)",width:"100%",height:"100%",display:"flex",justifyContent:"center",alignItems:"center"},children:e.jsxs("div",{id:"whats-missing-root",style:{position:"relative",width:"100%",height:"100%"},children:[De,!u&&!N&&ne===1&&e.jsxs("div",{className:"wm-lobby",children:[e.jsxs("div",{className:"wm-lobbyHero","aria-label":"Look at the pictures, guess what's missing",children:[e.jsxs("div",{className:"wm-heroGrid","aria-hidden":!0,children:[e.jsx("span",{className:"wm-heroTile"}),e.jsx("span",{className:"wm-heroTile"}),e.jsx("span",{className:"wm-heroTile"}),e.jsx("span",{className:"wm-heroTile wm-heroTileMissing",children:"?"})]}),e.jsx("div",{className:"wm-lobbyArrow","aria-hidden":!0}),e.jsx("div",{className:"wm-lobbyGuess",children:e.jsxs("div",{className:"wm-guessCard",children:[e.jsx("div",{className:"wm-guessPrompt",children:"Guess"}),e.jsx("div",{className:"wm-guessLine",children:"cat"})]})})]}),e.jsxs("div",{className:"wm-lobbyHead",children:[e.jsxs("h1",{className:"wm-brandTitle",children:["What's ",e.jsx("span",{className:"wm-brandAccent",children:"Missing"}),"?"]}),e.jsxs("ol",{className:"wm-lobbySteps",children:[e.jsxs("li",{children:[e.jsx("span",{className:"wm-stepIcon wm-stepIconLook","aria-hidden":!0}),"Look"]}),e.jsxs("li",{children:[e.jsx("span",{className:"wm-stepIcon wm-stepIconGuess","aria-hidden":!0}),"Guess"]}),e.jsxs("li",{children:[e.jsx("span",{className:"wm-stepIcon wm-stepIconWin","aria-hidden":!0}),"Win"]})]})]}),e.jsxs("div",{className:"wm-roundsRow",children:[e.jsx("p",{className:"wm-roundsLabel",children:"Rounds"}),e.jsx("div",{className:"wm-roundsPills",children:[3,4,5].map(t=>e.jsx("button",{type:"button",className:`wm-roundPill${P===t?" wm-roundPillActive":""}`,onClick:()=>ye(t),children:t},t))})]}),e.jsx("button",{type:"button",className:"wm-playBtn",onClick:()=>W(2),children:"PLAY"})]}),!u&&!N&&ne===2&&e.jsxs("div",{className:"wm-topics",children:[e.jsxs("div",{className:"wm-topicsHeader",children:[e.jsx("button",{type:"button",className:"wm-topicsBack",onClick:()=>W(1),children:"Back"}),e.jsx("h2",{className:"wm-topicsTitle",children:"Choose a theme"}),e.jsxs("span",{className:"wm-topicsMeta",children:[P," rounds"]})]}),e.jsxs("button",{type:"button",className:"wm-topicCard wm-topicCardRandom",onClick:()=>J(oe[Q(oe.length)]),children:[e.jsx("span",{className:"wm-topicRandomIcon","aria-hidden":!0}),e.jsxs("div",{className:"wm-topicBody",children:[e.jsx("span",{className:"wm-topicLabel",children:"Random theme"}),e.jsx("span",{className:"wm-topicExample",children:"Surprise me!"})]})]}),e.jsx("div",{className:"wm-topicsGrid",children:oe.map(t=>e.jsxs("button",{type:"button",className:"wm-topicCard",onClick:()=>J(t),children:[e.jsx("img",{className:"wm-topicPreview",src:S[t][0]?.src,alt:"",draggable:!1,onError:o=>{o.currentTarget.style.visibility="hidden"}}),e.jsxs("div",{className:"wm-topicBody",children:[e.jsx("span",{className:"wm-topicLabel",children:dt[t]}),e.jsx("span",{className:"wm-topicExample",children:mt[t]})]})]},t))})]}),L&&e.jsxs("div",{className:"wm-final",children:[e.jsx("h2",{className:"wm-finalTitle",children:"Great job!"}),e.jsxs("p",{className:"wm-finalScore",children:[je," / ",P," correct"]}),e.jsx("p",{className:"wm-finalTeamLabel",children:"Your round"}),e.jsx("div",{className:"wm-trophyRow",children:he.length===0?e.jsx("p",{className:"wm-trophyEmpty",children:"Play a round to see results"}):he.map(t=>e.jsxs("div",{className:"wm-trophyCard",children:[e.jsxs("div",{className:`wm-trophy ${t.result}`,children:[e.jsx("span",{className:"wm-trophyMark",children:t.result==="correct"?"✔":t.result==="almost"?"◐":"✘"}),e.jsx("span",{className:"wm-trophyWord",children:t.correct.split(",")[0]})]}),e.jsxs("span",{className:"wm-trophyName",children:["Round ",t.round]})]},t.round))}),e.jsxs("div",{className:"wm-finalActions",children:[e.jsx("button",{type:"button",className:"wm-againBtn",onClick:()=>J(),children:"Play again"}),e.jsx("button",{type:"button",className:"wm-ghostBtn",onClick:He,children:"Choose theme"})]})]}),N&&!L&&e.jsxs("div",{className:`wm-play${f==="ready"?" wm-play--ready":""}`,children:[e.jsxs("div",{className:"wm-playStatus",children:[f==="ready"&&e.jsxs("div",{className:"wm-readyBlock",style:{"--wm-ready-s":`${_}s`},children:[e.jsx("p",{className:"wm-playStatusReady",children:"GET READY"}),e.jsxs("div",{className:"wm-readyLoad","aria-hidden":!0,children:[e.jsxs("div",{className:"wm-readyTiles",children:[e.jsx("span",{className:"wm-heroTile"}),e.jsx("span",{className:"wm-heroTile"}),e.jsx("span",{className:"wm-heroTile"}),e.jsx("span",{className:"wm-heroTile wm-heroTileMissing",children:"?"})]}),e.jsx("div",{className:"wm-readyBar",children:e.jsx("span",{className:"wm-readyBarFill"})})]})]}),f==="memorize"&&e.jsxs("p",{className:"wm-playStatusMemorize",children:["MEMORIZE ",U]}),f==="guess"&&!k&&e.jsxs("p",{children:["Time left: ",F,"s"]})]}),f!=="ready"&&e.jsx("div",{className:"wm-playSlot",children:e.jsx("div",{className:"wm-playGrid",children:h.map((t,o)=>{const r=b===o&&f==="guess"&&!k,l=G.current.get(t.src),m=l?.complete&&l.src?l.src:t.src,p=["wm-playCard",pe==="correct"&&b===o?"wm-playCardCorrect":"",pe==="wrong"&&b===o?"wm-playCardWrong":""].filter(Boolean).join(" ");return e.jsx("div",{className:p,children:!r&&e.jsx("img",{src:m,alt:t.name,fetchPriority:"high",loading:"eager",decoding:"async",draggable:!1},`${t.src}-${l?.complete?"loaded":"pending"}`)},o)})})}),e.jsxs("div",{className:"wm-playControls",children:[f==="guess"&&!k&&e.jsxs("div",{className:"wm-guessRow",children:[e.jsx("input",{className:"wm-guessInput",type:"text",placeholder:"Type the missing word",value:E,onChange:t=>de(t.target.value),onKeyDown:t=>{t.key==="Enter"&&!C&&fe()}}),e.jsx("button",{type:"button",className:"wm-actionBtn",onClick:fe,disabled:C,children:C?"...":"Check"})]}),k&&e.jsx("button",{type:"button",className:"wm-actionBtn",onClick:Ge,children:"Next round"})]})]})]})})})})}const D=1280,$=720;function ft(i,c){const n=Math.min(i,c);return i<=768?Math.max(280,i-20):Math.max(400,Math.min(1200,n-40))}function be({gameCubeSize:i,screenHeight:c,screenWidth:n,seed:a}){const[d,u]=s.useState(()=>({width:typeof window<"u"?window.innerWidth:D,height:typeof window<"u"?window.innerHeight:$}));s.useEffect(()=>{const h=()=>{u({width:window.innerWidth,height:window.innerHeight})};h(),window.addEventListener("resize",h),window.addEventListener("orientationchange",h);const I=new ResizeObserver(h);return I.observe(document.documentElement),()=>{window.removeEventListener("resize",h),window.removeEventListener("orientationchange",h),I.disconnect()}},[]);const T=s.useMemo(()=>Math.min(d.width/D,d.height/$),[d.width,d.height]);return e.jsx("div",{style:{position:"relative",width:"100%",height:"100%",overflow:"hidden"},children:e.jsx("div",{style:{position:"absolute",left:"50%",top:"50%",width:`${D}px`,height:`${$}px`,transform:`translate(-50%, -50%) scale(${T})`,transformOrigin:"center center"},children:e.jsx("div",{style:{width:`${D}px`,height:`${$}px`,position:"relative",overflow:"hidden"},children:e.jsx(xe,{gameCubeSize:i??ft(d.width,d.height),screenWidth:n??d.width,screenHeight:c??d.height,seed:a})})})})}exports.AdaptiveGameShell=be;exports.Game=be;exports.RawGame=xe;exports.themes=S;
@@ -0,0 +1,861 @@
1
+ import { jsx as t, jsxs as i } from "react/jsx-runtime";
2
+ import { useRef as P, useEffect as L, useState as a, useMemo as ye } from "react";
3
+ function Ve(s, c = 0.45) {
4
+ if (!(typeof window > "u"))
5
+ try {
6
+ const n = new Audio(s);
7
+ n.volume = c;
8
+ const l = () => {
9
+ n.currentTime = 0, n.play().catch(() => {
10
+ });
11
+ };
12
+ if (n.readyState >= HTMLMediaElement.HAVE_ENOUGH_DATA) {
13
+ l();
14
+ return;
15
+ }
16
+ n.addEventListener("canplaythrough", l, { once: !0 }), n.addEventListener(
17
+ "error",
18
+ () => {
19
+ },
20
+ { once: !0 }
21
+ ), n.load();
22
+ } catch {
23
+ }
24
+ }
25
+ const qe = "/cloud/speakid/games/critter-quiz/sounds/";
26
+ function Ze() {
27
+ return typeof import.meta < "u" && !1 ? `${window.origin}/sounds/` : `${window.origin}${qe}`;
28
+ }
29
+ function ie(s) {
30
+ const c = s === "correct" ? "correct.wav" : "wrong.wav";
31
+ Ve(`${Ze()}${c}`);
32
+ }
33
+ const Ke = '@import"https://fonts.googleapis.com/css2?family=Nunito:wght@600;700;800;900&display=swap";#whats-missing-root{font-family:Nunito,Fredoka,system-ui,-apple-system,Segoe UI,sans-serif;color:#1f2937;-webkit-font-smoothing:antialiased}#whats-missing-root h1,#whats-missing-root h2,#whats-missing-root p{margin:0}#whats-missing-root button{font:inherit;color:inherit;cursor:pointer}#whats-missing-root .wm-logo{position:absolute;top:28px;left:16px;z-index:30;pointer-events:none}#whats-missing-root .wm-logo img{display:block;height:28px;width:auto;object-fit:contain}#whats-missing-root .wm-lobby{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;gap:24px;padding:40px 48px;box-sizing:border-box}#whats-missing-root .wm-lobbyHero{display:flex;align-items:center;justify-content:center;gap:20px}#whats-missing-root .wm-heroGrid{display:grid;grid-template-columns:1fr 1fr;gap:8px;width:168px;padding:10px;border-radius:18px;overflow:hidden;border:4px solid #fff;box-shadow:0 10px 28px #ec4c442e;background:#fff}#whats-missing-root .wm-heroTile{aspect-ratio:1;border-radius:10px;background:linear-gradient(180deg,#dbeafe,#93c5fd);border:2px solid #f2c4be}#whats-missing-root .wm-heroTile:nth-child(2){background:linear-gradient(180deg,#ffe8e2,#fecaca)}#whats-missing-root .wm-heroTile:nth-child(3){background:linear-gradient(180deg,#d1fae5,#86efac)}#whats-missing-root .wm-heroTileMissing{display:flex;align-items:center;justify-content:center;background:repeating-linear-gradient(45deg,#fff7f5,#fff7f5 6px,#ffe8e2 6px 12px);color:#ec4c44;font-size:28px;font-weight:900;line-height:1}#whats-missing-root .wm-lobbyArrow{width:36px;height:36px;flex-shrink:0;border-radius:50%;background:#ffffffd9;border:2px solid #f2c4be;position:relative}#whats-missing-root .wm-lobbyArrow:after{content:"";position:absolute;top:50%;left:50%;width:10px;height:10px;border-top:3px solid #ec4c44;border-right:3px solid #ec4c44;transform:translate(-60%,-50%) rotate(45deg)}#whats-missing-root .wm-lobbyGuess{display:flex;flex-direction:column;align-items:center;gap:8px}#whats-missing-root .wm-guessCard{min-width:148px;padding:18px 20px 14px;border-radius:18px;background:#ffffffeb;border:3px solid #f2c4be;box-shadow:0 6px 16px #1f29370f;text-align:center}#whats-missing-root .wm-guessPrompt{font-size:13px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:#ec4c44}#whats-missing-root .wm-guessLine{margin-top:10px;height:28px;border-bottom:3px dashed #f2c4be;font-size:22px;font-weight:900;color:#1f2937;letter-spacing:.12em}#whats-missing-root .wm-lobbyHead{display:flex;flex-direction:column;align-items:center;gap:12px}#whats-missing-root .wm-brandTitle{font-size:48px;font-weight:900;letter-spacing:-.02em;color:#1f2937;text-align:center;line-height:1.05}#whats-missing-root .wm-brandAccent{color:#ec4c44}#whats-missing-root .wm-lobbySteps{display:flex;align-items:center;gap:20px;margin:0;padding:0;list-style:none}#whats-missing-root .wm-lobbySteps li{display:flex;align-items:center;gap:8px;font-size:18px;font-weight:700;color:#4b5563}#whats-missing-root .wm-stepIcon{width:28px;height:28px;border-radius:8px;flex-shrink:0;border:2px solid #f2c4be;background:#fff;position:relative}#whats-missing-root .wm-stepIconLook{background:linear-gradient(180deg,#dbeafe,#93c5fd)}#whats-missing-root .wm-stepIconLook:after{content:"";position:absolute;inset:6px;border-radius:3px;border:2px solid #fff;box-shadow:inset 0 0 0 1px #1f293726}#whats-missing-root .wm-stepIconGuess{background:#fff7f5}#whats-missing-root .wm-stepIconGuess:after{content:"?";position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-size:16px;font-weight:900;color:#ec4c44;line-height:1}#whats-missing-root .wm-stepIconWin{background:linear-gradient(180deg,#ffe8e2,#fecaca)}#whats-missing-root .wm-stepIconWin:after{content:"";position:absolute;left:50%;top:50%;width:10px;height:10px;border-radius:50%;background:#ec4c44;transform:translate(-50%,-50%);box-shadow:-6px 0 0 -2px #f9a8a4,6px 0 0 -2px #f9a8a4}#whats-missing-root .wm-roundsRow{display:flex;flex-direction:column;align-items:center;gap:8px}#whats-missing-root .wm-roundsLabel{font-size:14px;font-weight:800;color:#6b7280}#whats-missing-root .wm-roundsPills{display:flex;gap:10px}#whats-missing-root .wm-roundPill{min-width:56px;min-height:44px;padding:0 16px;border-radius:999px;border:3px solid #f2c4be;background:#ffffffe6;color:#4b5563;font-size:20px;font-weight:800;transition:border-color .15s,background .15s,transform .12s,color .15s}#whats-missing-root .wm-roundPill:hover{border-color:#ec4c44;transform:translateY(-1px)}#whats-missing-root .wm-roundPillActive{background:#ec4c44;border-color:#ec4c44;color:#fff;box-shadow:0 4px #c73a34}#whats-missing-root .wm-playBtn,#whats-missing-root .wm-againBtn{min-width:240px;min-height:72px;padding:0 48px;border:none;border-radius:999px;background:#ec4c44;color:#fff;font-size:32px;font-weight:800;letter-spacing:.04em;box-shadow:0 10px #c73a34;transition:transform .12s ease,box-shadow .12s ease}#whats-missing-root .wm-playBtn:hover,#whats-missing-root .wm-againBtn:hover{transform:translateY(-2px);box-shadow:0 12px #c73a34}#whats-missing-root .wm-playBtn:active,#whats-missing-root .wm-againBtn:active{transform:translateY(4px);box-shadow:0 4px #c73a34}#whats-missing-root .wm-topics{display:flex;flex-direction:column;height:100%;padding:28px 48px 32px;gap:14px;box-sizing:border-box}#whats-missing-root .wm-topicsHeader{display:flex;align-items:center;gap:16px;padding-top:44px;flex-shrink:0}#whats-missing-root .wm-topicsBack,#whats-missing-root .wm-ghostBtn{flex-shrink:0;min-height:44px;padding:0 18px;border:3px solid #f2c4be;border-radius:999px;background:#ffffffe6;color:#4b5563;font-size:16px;font-weight:700;transition:border-color .15s,transform .12s,background .15s}#whats-missing-root .wm-topicsBack:hover,#whats-missing-root .wm-ghostBtn:hover{border-color:#ec4c44;background:#fff;transform:translateY(-1px)}#whats-missing-root .wm-topicsTitle{font-size:36px;font-weight:800;color:#1f2937}#whats-missing-root .wm-topicsMeta{margin-left:auto;font-size:16px;font-weight:800;color:#ec4c44;padding:4px 12px;border-radius:999px;background:#ffffffeb;border:2px solid #f2c4be}#whats-missing-root .wm-topicsGrid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;flex:1;align-content:start;overflow:auto;padding-bottom:4px}#whats-missing-root .wm-topicCard{display:flex;flex-direction:row;align-items:stretch;gap:14px;min-height:88px;padding:0 16px 0 0;overflow:hidden;border:3px solid #f2c4be;border-radius:18px;background:#ffffffd9;text-align:left;transition:border-color .15s,transform .12s,background .15s}#whats-missing-root .wm-topicCardRandom{align-items:center;padding:10px 14px;background:linear-gradient(135deg,#fff7f5,#ffe8e2);border-color:#ec4c44;border-style:dashed}#whats-missing-root .wm-topicCard:hover{border-color:#ec4c44;transform:translateY(-2px);background:#fff}#whats-missing-root .wm-topicPreview{width:110px;flex-shrink:0;align-self:stretch;object-fit:cover;object-position:center;border:none;border-radius:15px 0 0 15px;background:#fff7f5}#whats-missing-root .wm-topicRandomIcon{width:52px;height:52px;flex-shrink:0;border-radius:12px;border:2px solid #f2c4be;background:#fff;position:relative}#whats-missing-root .wm-topicRandomIcon:before,#whats-missing-root .wm-topicRandomIcon:after{content:"";position:absolute;left:50%;top:50%;width:22px;height:4px;border-radius:2px;background:#ec4c44;transform:translate(-50%,-50%)}#whats-missing-root .wm-topicRandomIcon:after{transform:translate(-50%,-50%) rotate(90deg)}#whats-missing-root .wm-topicBody{display:flex;flex-direction:column;align-items:flex-start;justify-content:center;gap:2px;min-width:0}#whats-missing-root .wm-topicLabel{font-size:18px;font-weight:800;color:#1f2937;line-height:1.2}#whats-missing-root .wm-topicExample{font-size:13px;color:#6b7280;line-height:1.25;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}#whats-missing-root .wm-final{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;gap:14px;padding:48px;box-sizing:border-box}#whats-missing-root .wm-finalTitle{font-size:52px;font-weight:900;color:#ec4c44}#whats-missing-root .wm-finalScore{font-size:26px;font-weight:700;color:#4b5563}#whats-missing-root .wm-finalTeamLabel{font-size:22px;font-weight:800;color:#1f2937;margin-top:4px}#whats-missing-root .wm-trophyRow{display:flex;flex-wrap:wrap;justify-content:center;gap:16px;max-width:960px;margin:8px 0 12px;min-height:140px}#whats-missing-root .wm-trophyCard{display:flex;flex-direction:column;align-items:center;gap:8px;min-width:120px}#whats-missing-root .wm-trophy{width:112px;height:112px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;background:#ffffffd9;border-radius:24px;border:4px solid #f2c4be;padding:8px}#whats-missing-root .wm-trophy.correct{border-color:#10b981;background:#ecfdf5}#whats-missing-root .wm-trophy.almost{border-color:#f59e0b;background:#fffbeb}#whats-missing-root .wm-trophy.wrong{border-color:#ef4444;background:#fef2f2}#whats-missing-root .wm-trophyMark{font-size:28px;font-weight:900;line-height:1}#whats-missing-root .wm-trophy.correct .wm-trophyMark{color:#059669}#whats-missing-root .wm-trophy.almost .wm-trophyMark{color:#d97706}#whats-missing-root .wm-trophy.wrong .wm-trophyMark{color:#dc2626}#whats-missing-root .wm-trophyWord{font-size:13px;font-weight:800;color:#1f2937;text-align:center;max-width:100px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#whats-missing-root .wm-trophyEmpty{font-size:20px;color:#9ca3af;align-self:center}#whats-missing-root .wm-finalActions{display:flex;align-items:center;gap:14px;margin-top:8px}#whats-missing-root .wm-againBtn{font-size:26px;min-width:260px}#whats-missing-root .wm-play{display:flex;flex-direction:column;height:100%;min-height:0;padding:56px 40px 16px;box-sizing:border-box;gap:10px;position:relative}#whats-missing-root .wm-play--ready{justify-content:center;align-items:center;padding:0;gap:0}#whats-missing-root .wm-play--ready .wm-playStatus{min-height:0}#whats-missing-root .wm-play--ready .wm-playControls{display:none}#whats-missing-root .wm-playStatus{flex-shrink:0;text-align:center;font-size:22px;font-weight:800;color:#4b5563;min-height:32px;line-height:1.2}#whats-missing-root .wm-playStatusReady{color:#ec4c44;font-size:48px;font-weight:900;letter-spacing:.04em}#whats-missing-root .wm-readyBlock{display:flex;flex-direction:column;align-items:center;gap:28px}#whats-missing-root .wm-readyLoad{display:flex;flex-direction:column;align-items:center;gap:18px}#whats-missing-root .wm-readyTiles{display:grid;grid-template-columns:1fr 1fr;gap:6px;width:120px;padding:8px;border-radius:16px;overflow:hidden;border:4px solid #fff;box-shadow:0 10px 28px #ec4c442e;background:#fff}#whats-missing-root .wm-readyTiles .wm-heroTile{border-radius:8px}#whats-missing-root .wm-play--ready .wm-heroTileMissing{animation:wm-ready-pulse .9s ease-in-out infinite}#whats-missing-root .wm-readyBar{width:220px;height:14px;border-radius:999px;background:#fff;border:3px solid #f2c4be;box-shadow:0 4px #f2c4be;overflow:hidden;box-sizing:border-box}#whats-missing-root .wm-readyBarFill{display:block;height:100%;width:0;border-radius:inherit;background:#ec4c44;animation:wm-ready-fill var(--wm-ready-s, 5s) linear forwards}@keyframes wm-ready-fill{0%{width:0}to{width:100%}}@keyframes wm-ready-pulse{0%,to{transform:scale(1)}50%{transform:scale(.92)}}#whats-missing-root .wm-playStatusMemorize{color:#10b981}#whats-missing-root .wm-playSlot{flex:1 1 0;min-height:0;width:100%;display:flex;align-items:center;justify-content:center}#whats-missing-root .wm-playGrid{display:grid;grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr;gap:16px;width:min(100%,580px);aspect-ratio:1 / 1;max-height:100%}#whats-missing-root .wm-playCard{min-width:0;min-height:0;border-radius:18px;overflow:hidden;background:#fff;border:3px solid #f2c4be;box-shadow:0 8px 22px #ec4c441a;display:flex;align-items:center;justify-content:center}#whats-missing-root .wm-playCard img{width:100%;height:100%;object-fit:cover;object-position:center}#whats-missing-root .wm-playCardCorrect{border-color:#10b981;background:#ecfdf5;box-shadow:0 0 18px #10b98173}#whats-missing-root .wm-playCardWrong{border-color:#ec4c44;background:#fef2f2;box-shadow:0 0 18px #ec4c4459}#whats-missing-root .wm-playControls{flex-shrink:0;min-height:72px;display:flex;align-items:center;justify-content:center}#whats-missing-root .wm-guessRow{display:flex;align-items:center;justify-content:center;gap:12px}#whats-missing-root .wm-guessInput{width:280px;min-height:52px;padding:0 18px;border:3px solid #f2c4be;border-radius:16px;background:#fff;color:#1f2937;font-size:20px;font-weight:700;outline:none;box-sizing:border-box}#whats-missing-root .wm-guessInput:focus{border-color:#ec4c44}#whats-missing-root .wm-guessInput::placeholder{color:#9ca3af;font-weight:600}#whats-missing-root .wm-actionBtn{min-height:52px;min-width:140px;padding:0 28px;border:none;border-radius:999px;background:#ec4c44;color:#fff;font-size:20px;font-weight:800;letter-spacing:.02em;box-shadow:0 6px #c73a34;transition:transform .12s ease,box-shadow .12s ease}#whats-missing-root .wm-actionBtn:hover{transform:translateY(-2px);box-shadow:0 8px #c73a34}#whats-missing-root .wm-actionBtn:active{transform:translateY(3px);box-shadow:0 3px #c73a34}#whats-missing-root .wm-actionBtn:disabled{opacity:.7;cursor:default;transform:none;box-shadow:0 6px #c73a34}@media(prefers-reduced-motion:reduce){#whats-missing-root .wm-playBtn,#whats-missing-root .wm-againBtn,#whats-missing-root .wm-topicCard,#whats-missing-root .wm-roundPill,#whats-missing-root .wm-topicsBack,#whats-missing-root .wm-ghostBtn,#whats-missing-root .wm-actionBtn{transition:none}#whats-missing-root .wm-play--ready .wm-heroTileMissing{animation:none}#whats-missing-root .wm-readyBarFill{animation:none;width:100%}}', Qe = window.origin + "/cloud/speakid/games/whatsmissing/", Xe = (s) => Qe, f = (s, c) => s.map(([n, l, ...m]) => ({
34
+ src: `${Xe()}${c}/${l.replace(/\s/g, "%20")}.png`,
35
+ name: l,
36
+ aliases: m?.length ? m : void 0
37
+ })), Je = [
38
+ ["apple", "apple"],
39
+ ["banana", "banana"],
40
+ ["bread", "bread"],
41
+ ["burger", "burger"],
42
+ ["cake", "cake"],
43
+ ["carrot", "carrot"],
44
+ ["cheese", "cheese"],
45
+ ["chicken", "chicken"],
46
+ ["chocolate", "chocolate"],
47
+ ["corn", "corn"],
48
+ ["donut", "donut"],
49
+ ["fish", "fish"],
50
+ ["fries", "fries"],
51
+ ["grapes", "grapes"],
52
+ ["ice_cream", "ice cream"],
53
+ ["milk", "milk"],
54
+ ["orange", "orange"],
55
+ ["pear", "pear"],
56
+ ["pizza", "pizza"],
57
+ ["rice", "rice"],
58
+ ["sandwich", "sandwich"],
59
+ ["soup", "soup"],
60
+ ["strawberry", "strawberry"],
61
+ ["tomato", "tomato"],
62
+ ["watermelon", "watermelon"]
63
+ ], et = [
64
+ ["bear", "bear"],
65
+ ["cat", "cat"],
66
+ ["crocodile", "crocodile", "alligator"],
67
+ ["dolphin", "dolphin"],
68
+ ["elephant", "elephant"],
69
+ ["fox", "fox"],
70
+ ["giraffe", "giraffe"],
71
+ ["horse", "horse"],
72
+ ["kangaroo", "kangaroo"],
73
+ ["lion", "lion"],
74
+ ["monkey", "monkey"],
75
+ ["owl", "owl"],
76
+ ["panda", "panda"],
77
+ ["penguin", "penguin"],
78
+ ["squirrel", "squirrel"],
79
+ ["tiger", "tiger"],
80
+ ["tortoise", "tortoise", "turtle"],
81
+ ["wolf", "wolf"],
82
+ ["zebra", "zebra"]
83
+ ], tt = [
84
+ ["ball", "ball"],
85
+ ["balloon", "balloon"],
86
+ ["blocks", "blocks"],
87
+ ["car", "car"],
88
+ ["doll", "doll"],
89
+ ["drum", "drum"],
90
+ ["robot", "robot"],
91
+ ["jump_rope", "jump rope"],
92
+ ["kite", "kite"],
93
+ ["paints", "paints"],
94
+ ["plane", "plane"],
95
+ ["puzzle", "puzzle"],
96
+ ["rocket", "rocket"],
97
+ ["scooter", "scooter"],
98
+ ["skateboard", "skateboard"],
99
+ ["slide", "slide"],
100
+ ["teddy_bear", "teddy bear"],
101
+ ["yo-yo", "yo-yo"],
102
+ ["crayons", "crayons"]
103
+ ], ot = [
104
+ ["t-shirt", "T-shirt"],
105
+ ["dress", "dress"],
106
+ ["hat", "hat"],
107
+ ["shoes", "shoes"],
108
+ ["socks", "socks"],
109
+ ["coat", "coat"],
110
+ ["skirt", "skirt"],
111
+ ["trousers", "trousers"],
112
+ ["jacket", "jacket"],
113
+ ["scarf", "scarf"],
114
+ ["gloves", "gloves"],
115
+ ["shorts", "shorts"],
116
+ ["cap", "cap"],
117
+ ["boots", "boots"],
118
+ ["pyjamas", "pyjamas"]
119
+ ], st = [
120
+ ["car", "car"],
121
+ ["bus", "bus"],
122
+ ["bike", "bike"],
123
+ ["train", "train"],
124
+ ["plane", "plane"],
125
+ ["boat", "boat"],
126
+ ["ship", "ship"],
127
+ ["helicopter", "helicopter"],
128
+ ["lorry", "lorry", "truck"],
129
+ ["taxi", "taxi"],
130
+ ["rocket", "rocket"],
131
+ ["van", "van"],
132
+ ["motorbike", "motorbike"],
133
+ ["tram", "tram"],
134
+ ["submarine", "submarine"]
135
+ ], it = [
136
+ ["sun", "sun"],
137
+ ["cloud", "cloud"],
138
+ ["rain", "rain"],
139
+ ["tree", "tree"],
140
+ ["flower", "flower"],
141
+ ["grass", "grass"],
142
+ ["star", "star"],
143
+ ["moon", "moon"],
144
+ ["mountain", "mountain"],
145
+ ["river", "river"],
146
+ ["rainbow", "rainbow"],
147
+ ["snowman", "snowman"],
148
+ ["snow", "snow"],
149
+ ["butterfly", "butterfly"],
150
+ ["bird", "bird"]
151
+ ], nt = [
152
+ ["bed", "bed"],
153
+ ["table", "table"],
154
+ ["chair", "chair"],
155
+ ["door", "door"],
156
+ ["window", "window"],
157
+ ["lamp", "lamp"],
158
+ ["sofa", "sofa"],
159
+ ["clock", "clock"],
160
+ ["key", "key"],
161
+ ["phone", "phone"],
162
+ ["tv", "TV"],
163
+ ["cup", "cup"],
164
+ ["plate", "plate"],
165
+ ["mirror", "mirror"],
166
+ ["book", "book"]
167
+ ], rt = [
168
+ ["book", "book"],
169
+ ["pen", "pen"],
170
+ ["pencil", "pencil"],
171
+ ["bag", "bag"],
172
+ ["ruler", "ruler"],
173
+ ["rubber", "rubber", "eraser"],
174
+ ["desk", "desk"],
175
+ ["board", "board"],
176
+ ["crayon", "crayon"],
177
+ ["glue", "glue"],
178
+ ["scissors", "scissors"],
179
+ ["notebook", "notebook"],
180
+ ["pencil_case", "pencil case"],
181
+ ["paintbrush", "paintbrush"],
182
+ ["backpack", "backpack"]
183
+ ], at = [
184
+ ["piano", "piano"],
185
+ ["bell", "bell", "bells"],
186
+ ["radio", "radio"],
187
+ ["cd", "CD", "disc"],
188
+ ["mic", "mic", "microphone"],
189
+ ["singer", "singer"],
190
+ ["dancer", "dancer"],
191
+ ["stage", "stage"],
192
+ ["band", "band"],
193
+ ["ticket", "ticket"],
194
+ ["karaoke", "karaoke"],
195
+ ["guitar", "guitar"],
196
+ ["fan", "fan"]
197
+ ], lt = [
198
+ ["football", "football", "soccer"],
199
+ ["basketball", "basketball"],
200
+ ["tennis", "tennis"],
201
+ ["skiing", "skiing", "ski"],
202
+ ["swimming", "swimming", "swim"],
203
+ ["skating", "skating", "ice skating"],
204
+ ["hockey", "hockey", "ice hockey"],
205
+ ["volleyball", "volleyball"],
206
+ ["golf", "golf"],
207
+ ["boxing", "boxing"],
208
+ ["running", "running", "run"],
209
+ ["medal", "medal"],
210
+ ["trophy", "trophy"],
211
+ ["whistle", "whistle"],
212
+ ["helmet", "helmet"]
213
+ ], ct = [
214
+ ["head", "head"],
215
+ ["eye", "eye", "eyes"],
216
+ ["ear", "ear", "ears"],
217
+ ["nose", "nose"],
218
+ ["mouth", "mouth"],
219
+ ["hand", "hand", "hands"],
220
+ ["finger", "finger", "fingers"],
221
+ ["arm", "arm", "arms"],
222
+ ["leg", "leg", "legs"],
223
+ ["foot", "foot", "feet"],
224
+ ["knee", "knee", "knees"],
225
+ ["hair", "hair"],
226
+ ["tooth", "tooth", "teeth"],
227
+ ["tongue", "tongue"],
228
+ ["shoulder", "shoulder", "shoulders"]
229
+ ], dt = [
230
+ ["umbrella", "umbrella"],
231
+ ["lightning", "lightning", "thunder"],
232
+ ["wind", "wind"],
233
+ ["storm", "storm"],
234
+ ["fog", "fog", "mist"],
235
+ ["ice", "ice"],
236
+ ["raincoat", "raincoat"],
237
+ ["puddle", "puddle"],
238
+ ["snowflake", "snowflake"],
239
+ ["icicle", "icicle"],
240
+ ["thermometer", "thermometer"],
241
+ ["tornado", "tornado"],
242
+ ["raindrop", "raindrop", "drop"],
243
+ ["frost", "frost"]
244
+ ], M = {
245
+ food: f(Je, "food"),
246
+ animals: f(et, "animals"),
247
+ toys: f(tt, "toys"),
248
+ clothes: f(ot, "clothes"),
249
+ transport: f(st, "transport"),
250
+ nature: f(it, "nature"),
251
+ home: f(nt, "home"),
252
+ school: f(rt, "school"),
253
+ music: f(at, "music"),
254
+ sports: f(lt, "sports"),
255
+ body: f(ct, "body"),
256
+ weather: f(dt, "weather")
257
+ }, ne = [
258
+ "animals",
259
+ "food",
260
+ "toys",
261
+ "clothes",
262
+ "transport",
263
+ "nature",
264
+ "home",
265
+ "school",
266
+ "music",
267
+ "sports",
268
+ "body",
269
+ "weather"
270
+ ], mt = {
271
+ animals: "Animals",
272
+ food: "Food",
273
+ toys: "Toys",
274
+ clothes: "Clothes",
275
+ transport: "Transport",
276
+ nature: "Nature",
277
+ home: "Home",
278
+ school: "School",
279
+ music: "Music",
280
+ sports: "Sports",
281
+ body: "Body",
282
+ weather: "Weather"
283
+ }, pt = {
284
+ animals: "cat, dog, bear…",
285
+ food: "apple, pizza, cake…",
286
+ toys: "ball, doll, robot…",
287
+ clothes: "T-shirt, hat, shoes…",
288
+ transport: "car, bus, plane…",
289
+ nature: "sun, tree, flower…",
290
+ home: "bed, table, lamp…",
291
+ school: "book, pen, bag…",
292
+ music: "piano, guitar, singer…",
293
+ sports: "football, skiing, medal…",
294
+ body: "head, hand, eye…",
295
+ weather: "umbrella, storm, snowflake…"
296
+ }, ht = () => {
297
+ const s = document.createElement("style");
298
+ s.id = "whats-missing-reset", s.textContent = `
299
+ #whats-missing-root, #whats-missing-root * {
300
+ box-sizing: border-box;
301
+ font-family: "Nunito", "Fredoka", system-ui, -apple-system, "Segoe UI", sans-serif;
302
+ }
303
+ #whats-missing-root img {
304
+ max-width: 100%;
305
+ height: auto;
306
+ display: block;
307
+ user-select: none;
308
+ }
309
+ html, body {
310
+ margin: 0 !important;
311
+ padding: 0 !important;
312
+ width: 100% !important;
313
+ height: 100% !important;
314
+ overflow: hidden !important;
315
+ zoom: 1 !important; /* ✅ защита от подзума */
316
+ }
317
+ #root {
318
+ margin: 0 !important;
319
+ padding: 0 !important;
320
+ width: 100% !important;
321
+ height: 100% !important;
322
+ overflow: hidden !important;
323
+ }
324
+ ${Ke}
325
+ `;
326
+ const c = document.getElementById("whats-missing-reset");
327
+ c && c.remove(), document.head.appendChild(s);
328
+ };
329
+ class wt {
330
+ constructor(c) {
331
+ this.seed = c;
332
+ }
333
+ // Linear Congruential Generator (LCG)
334
+ // Используем параметры из Numerical Recipes
335
+ next() {
336
+ return this.seed = (this.seed * 1664525 + 1013904223) % Math.pow(2, 32), this.seed / Math.pow(2, 32);
337
+ }
338
+ // Генерирует случайное число от 0 до max (не включая max)
339
+ nextInt(c) {
340
+ return Math.floor(this.next() * c);
341
+ }
342
+ }
343
+ const gt = (s, c) => {
344
+ const n = Array.from({ length: s.length + 1 }, () => Array(c.length + 1).fill(0));
345
+ for (let l = 0; l <= s.length; l++) n[l][0] = l;
346
+ for (let l = 0; l <= c.length; l++) n[0][l] = l;
347
+ for (let l = 1; l <= s.length; l++)
348
+ for (let m = 1; m <= c.length; m++)
349
+ n[l][m] = s[l - 1] === c[m - 1] ? n[l - 1][m - 1] : Math.min(n[l - 1][m - 1], n[l][m - 1], n[l - 1][m]) + 1;
350
+ return n[s.length][c.length];
351
+ }, ft = (s) => new Promise((c) => {
352
+ const n = new Image();
353
+ n.onload = () => c(n), n.onerror = () => c(n), n.src = s;
354
+ }), re = async (s, c) => {
355
+ const n = /* @__PURE__ */ new Map(), l = s.map(async (m) => {
356
+ const b = await ft(m);
357
+ n.set(m, b);
358
+ });
359
+ return await Promise.allSettled(l), n;
360
+ };
361
+ function ut({
362
+ gameCubeSize: s,
363
+ screenHeight: c,
364
+ screenWidth: n,
365
+ seed: l
366
+ }) {
367
+ const m = P(null);
368
+ L(() => (ht(), () => {
369
+ document.documentElement.style.overflow = "", document.body.style.overflow = "";
370
+ const e = document.getElementById("whats-missing-reset");
371
+ e && e.remove(), x.current && x.current.abort();
372
+ }), []);
373
+ const [b, B] = a(null), [w, z] = a([]), [E, ke] = a(4), [ae, U] = a(1), [T, le] = a(!1), [C, ce] = a(1), [y, ve] = a(null), [u, R] = a("ready"), [F, de] = a(5), [O, V] = a(6), [q, me] = a(20), [Ie, Z] = a(0), [A, K] = a(!1), [j, pe] = a(""), [v, Q] = a(!1), [G, he] = a(!1), [we, S] = a(null), [ge, X] = a([]), [Ne, fe] = a([]), [xt, ze] = a(!1), [yt, H] = a(1), [kt, D] = a(null), [vt, Te] = a(!1), [It, Se] = a(!1), [Nt, Pe] = a(!1), [zt, Me] = a(!1), [Tt, Le] = a(!1), [St, Be] = a(!1), [Pt, Ee] = a(!1), [Mt, Ce] = a(!1), [Lt, Re] = a(!1), [Bt, Ae] = a(!1), J = P(/* @__PURE__ */ new Set()), $ = P(/* @__PURE__ */ new Map()), x = P(null), I = P(null);
374
+ L(() => {
375
+ l !== void 0 ? I.current = new wt(l) : I.current = null;
376
+ }, [l]);
377
+ const je = () => I.current ? I.current.next() : Math.random(), ee = (e) => I.current ? I.current.nextInt(e) : Math.floor(Math.random() * e);
378
+ L(() => {
379
+ const e = () => {
380
+ const o = n ?? window.innerWidth, r = c ?? window.innerHeight, d = o < 768 || o === 926 && r === 428 || o === 932 && r === 430, p = r < 700, h = o / r > 1.8, g = o === 768 && r === 1024, xe = o === 1024 && r === 768, W = o === 820 && r === 1180, k = o === 1180 && r === 820, N = o === 540 && r === 720, We = o === 720 && r === 540, _e = o === 1024 && r === 1366, Ye = o === 1366 && r === 1024, Ue = o >= 1200 && r >= 600 && !d;
381
+ if (Te(Ue), Se(g), Pe(xe), Me(W), Le(k), Be(N), Ee(We), Ce(_e), Re(Ye), Ae(h), ze(d), d)
382
+ D(s && s >= 320 ? s : null), H(1);
383
+ else if (p)
384
+ D(s && s >= 400 ? s : null), H(1);
385
+ else if (h) {
386
+ const se = s ? Math.max(400, Math.min(1200, s)) : Math.min(1e3, Math.min(o, r) * 0.9);
387
+ D(se), H(1);
388
+ } else {
389
+ const se = s ? Math.max(400, Math.min(1200, s)) : Math.min(1e3, Math.min(o, r) * 0.9);
390
+ D(se), H(1);
391
+ }
392
+ };
393
+ return e(), window.addEventListener("resize", e), () => window.removeEventListener("resize", e);
394
+ }, [n, c, s]);
395
+ const te = (e) => [...e].sort(() => je() - 0.5).slice(0, 4), Ge = (e) => {
396
+ x.current && x.current.abort(), x.current = new AbortController();
397
+ const r = M[e].map((d) => d.src);
398
+ re(r, x.current.signal).then((d) => {
399
+ r.forEach((p) => {
400
+ J.current.add(p), d.has(p) && $.current.set(p, d.get(p));
401
+ });
402
+ }).catch(() => {
403
+ });
404
+ }, oe = (e) => {
405
+ const o = e ?? b;
406
+ if (!o) return;
407
+ e && B(e), Ge(o);
408
+ const r = te(M[o]);
409
+ z(r), le(!0), K(!1), ce(1), Z(0), X([]), fe([]);
410
+ const d = r.map((p) => p.src);
411
+ re(d, x.current?.signal).then((p) => {
412
+ d.forEach((h) => {
413
+ J.current.add(h), p.has(h) && $.current.set(h, p.get(h));
414
+ });
415
+ }).catch(() => {
416
+ }), ue(r, [], !0);
417
+ }, ue = (e = w, o = Ne, r = !1) => {
418
+ const d = te(e.length ? e : M[b]);
419
+ let p = ee(d.length), h = d[p].name, g = 0;
420
+ for (; o.includes(h) && g < 20; )
421
+ p = ee(d.length), h = d[p].name, g++;
422
+ if (z(d), ve(p), fe([...o, h]), Q(!1), pe(""), me(20), S(null), b && !r) {
423
+ const W = te(M[b].filter((k) => !o.includes(k.name))).map((k) => k.src);
424
+ re(W, x.current?.signal).then((k) => {
425
+ W.forEach((N) => {
426
+ J.current.add(N), k.has(N) && $.current.set(N, k.get(N));
427
+ });
428
+ }).catch(() => {
429
+ });
430
+ }
431
+ r ? (R("ready"), de(5), V(6)) : (R("memorize"), V(6));
432
+ };
433
+ L(() => {
434
+ if (!(!T || A || v)) {
435
+ if (u === "ready")
436
+ if (F <= 0) R("memorize");
437
+ else {
438
+ const e = setTimeout(() => de((o) => o - 1), 1e3);
439
+ return () => clearTimeout(e);
440
+ }
441
+ if (u === "memorize")
442
+ if (O <= 0) R("guess");
443
+ else {
444
+ const e = setTimeout(() => V((o) => o - 1), 1e3);
445
+ return () => clearTimeout(e);
446
+ }
447
+ if (u === "guess") {
448
+ if (q <= 0) {
449
+ Q(!0), S("wrong");
450
+ const o = w[y].name, r = w[y].aliases, d = [o, ...r || []].join(", ");
451
+ X((p) => [
452
+ ...p,
453
+ { round: C, answer: j, correct: d, result: "wrong" }
454
+ ]);
455
+ return;
456
+ }
457
+ const e = setTimeout(() => me((o) => o - 1), 1e3);
458
+ return () => clearTimeout(e);
459
+ }
460
+ }
461
+ }, [
462
+ u,
463
+ F,
464
+ O,
465
+ q,
466
+ T,
467
+ A,
468
+ v,
469
+ w,
470
+ y,
471
+ C,
472
+ j
473
+ ]);
474
+ const be = () => {
475
+ if (y === null || G) return;
476
+ const e = w[y].name, o = w[y].aliases, r = j.toLowerCase().trim();
477
+ let d = "wrong";
478
+ const p = [e, ...o || []].map((g) => g.toLowerCase()), h = [e, ...o || []].join(", ");
479
+ p.includes(r) ? (Z((g) => g + 1), S("correct"), d = "correct", ie("correct")) : p.some((g) => gt(r, g) === 1) ? (Z((g) => g + 0.5), S("almost"), d = "almost", ie("correct")) : (S("wrong"), d = "wrong", ie("wrong")), X((g) => [
480
+ ...g,
481
+ { round: C, answer: r, correct: h, result: d }
482
+ ]), he(!0), setTimeout(() => {
483
+ he(!1), Q(!0);
484
+ }, 600);
485
+ }, He = () => C < E ? (ce((e) => e + 1), ue()) : K(!0), De = () => {
486
+ x.current && x.current.abort(), le(!1), K(!1), B(null), U(2);
487
+ }, $e = ye(() => /* @__PURE__ */ t("div", { className: "wm-logo", children: /* @__PURE__ */ i("picture", { children: [
488
+ /* @__PURE__ */ t(
489
+ "source",
490
+ {
491
+ srcSet: window.origin + "/cloud/speakid/games/whatsmissing/logo.svg",
492
+ type: "image/svg+xml"
493
+ }
494
+ ),
495
+ /* @__PURE__ */ t(
496
+ "img",
497
+ {
498
+ src: window.origin + "/cloud/speakid/games/whatsmissing/logo.png",
499
+ alt: "SPEAKID",
500
+ loading: "lazy",
501
+ draggable: !1
502
+ }
503
+ )
504
+ ] }) }), []);
505
+ return /* @__PURE__ */ t(
506
+ "div",
507
+ {
508
+ ref: m,
509
+ style: {
510
+ width: "100%",
511
+ height: "100%",
512
+ display: "flex",
513
+ justifyContent: "center",
514
+ alignItems: "center",
515
+ background: "radial-gradient(ellipse 80% 60% at 20% 10%, rgba(236, 76, 68, 0.12), transparent 55%), radial-gradient(ellipse 70% 50% at 90% 80%, rgba(123, 200, 164, 0.18), transparent 50%), linear-gradient(160deg, #fff7f5 0%, #ffe8e2 45%, #fff4ec 100%)",
516
+ transition: "background 0.3s ease",
517
+ overflow: "hidden",
518
+ position: "absolute",
519
+ top: 0,
520
+ left: 0,
521
+ right: 0,
522
+ bottom: 0
523
+ },
524
+ children: /* @__PURE__ */ t(
525
+ "div",
526
+ {
527
+ style: {
528
+ width: "100%",
529
+ height: "100%",
530
+ display: "flex",
531
+ justifyContent: "center",
532
+ alignItems: "center",
533
+ overflow: "hidden",
534
+ borderRadius: 0,
535
+ background: "transparent",
536
+ boxShadow: "none",
537
+ margin: "0 auto",
538
+ position: "relative",
539
+ transform: "none"
540
+ },
541
+ children: /* @__PURE__ */ t(
542
+ "div",
543
+ {
544
+ style: {
545
+ transform: "translateZ(0)",
546
+ width: "100%",
547
+ height: "100%",
548
+ display: "flex",
549
+ justifyContent: "center",
550
+ alignItems: "center"
551
+ },
552
+ children: /* @__PURE__ */ i(
553
+ "div",
554
+ {
555
+ id: "whats-missing-root",
556
+ style: { position: "relative", width: "100%", height: "100%" },
557
+ children: [
558
+ $e,
559
+ !b && !T && ae === 1 && /* @__PURE__ */ i("div", { className: "wm-lobby", children: [
560
+ /* @__PURE__ */ i(
561
+ "div",
562
+ {
563
+ className: "wm-lobbyHero",
564
+ "aria-label": "Look at the pictures, guess what's missing",
565
+ children: [
566
+ /* @__PURE__ */ i("div", { className: "wm-heroGrid", "aria-hidden": !0, children: [
567
+ /* @__PURE__ */ t("span", { className: "wm-heroTile" }),
568
+ /* @__PURE__ */ t("span", { className: "wm-heroTile" }),
569
+ /* @__PURE__ */ t("span", { className: "wm-heroTile" }),
570
+ /* @__PURE__ */ t("span", { className: "wm-heroTile wm-heroTileMissing", children: "?" })
571
+ ] }),
572
+ /* @__PURE__ */ t("div", { className: "wm-lobbyArrow", "aria-hidden": !0 }),
573
+ /* @__PURE__ */ t("div", { className: "wm-lobbyGuess", children: /* @__PURE__ */ i("div", { className: "wm-guessCard", children: [
574
+ /* @__PURE__ */ t("div", { className: "wm-guessPrompt", children: "Guess" }),
575
+ /* @__PURE__ */ t("div", { className: "wm-guessLine", children: "cat" })
576
+ ] }) })
577
+ ]
578
+ }
579
+ ),
580
+ /* @__PURE__ */ i("div", { className: "wm-lobbyHead", children: [
581
+ /* @__PURE__ */ i("h1", { className: "wm-brandTitle", children: [
582
+ "What's ",
583
+ /* @__PURE__ */ t("span", { className: "wm-brandAccent", children: "Missing" }),
584
+ "?"
585
+ ] }),
586
+ /* @__PURE__ */ i("ol", { className: "wm-lobbySteps", children: [
587
+ /* @__PURE__ */ i("li", { children: [
588
+ /* @__PURE__ */ t("span", { className: "wm-stepIcon wm-stepIconLook", "aria-hidden": !0 }),
589
+ "Look"
590
+ ] }),
591
+ /* @__PURE__ */ i("li", { children: [
592
+ /* @__PURE__ */ t("span", { className: "wm-stepIcon wm-stepIconGuess", "aria-hidden": !0 }),
593
+ "Guess"
594
+ ] }),
595
+ /* @__PURE__ */ i("li", { children: [
596
+ /* @__PURE__ */ t("span", { className: "wm-stepIcon wm-stepIconWin", "aria-hidden": !0 }),
597
+ "Win"
598
+ ] })
599
+ ] })
600
+ ] }),
601
+ /* @__PURE__ */ i("div", { className: "wm-roundsRow", children: [
602
+ /* @__PURE__ */ t("p", { className: "wm-roundsLabel", children: "Rounds" }),
603
+ /* @__PURE__ */ t("div", { className: "wm-roundsPills", children: [3, 4, 5].map((e) => /* @__PURE__ */ t(
604
+ "button",
605
+ {
606
+ type: "button",
607
+ className: `wm-roundPill${E === e ? " wm-roundPillActive" : ""}`,
608
+ onClick: () => ke(e),
609
+ children: e
610
+ },
611
+ e
612
+ )) })
613
+ ] }),
614
+ /* @__PURE__ */ t("button", { type: "button", className: "wm-playBtn", onClick: () => U(2), children: "PLAY" })
615
+ ] }),
616
+ !b && !T && ae === 2 && /* @__PURE__ */ i("div", { className: "wm-topics", children: [
617
+ /* @__PURE__ */ i("div", { className: "wm-topicsHeader", children: [
618
+ /* @__PURE__ */ t("button", { type: "button", className: "wm-topicsBack", onClick: () => U(1), children: "Back" }),
619
+ /* @__PURE__ */ t("h2", { className: "wm-topicsTitle", children: "Choose a theme" }),
620
+ /* @__PURE__ */ i("span", { className: "wm-topicsMeta", children: [
621
+ E,
622
+ " rounds"
623
+ ] })
624
+ ] }),
625
+ /* @__PURE__ */ i(
626
+ "button",
627
+ {
628
+ type: "button",
629
+ className: "wm-topicCard wm-topicCardRandom",
630
+ onClick: () => oe(ne[ee(ne.length)]),
631
+ children: [
632
+ /* @__PURE__ */ t("span", { className: "wm-topicRandomIcon", "aria-hidden": !0 }),
633
+ /* @__PURE__ */ i("div", { className: "wm-topicBody", children: [
634
+ /* @__PURE__ */ t("span", { className: "wm-topicLabel", children: "Random theme" }),
635
+ /* @__PURE__ */ t("span", { className: "wm-topicExample", children: "Surprise me!" })
636
+ ] })
637
+ ]
638
+ }
639
+ ),
640
+ /* @__PURE__ */ t("div", { className: "wm-topicsGrid", children: ne.map((e) => /* @__PURE__ */ i(
641
+ "button",
642
+ {
643
+ type: "button",
644
+ className: "wm-topicCard",
645
+ onClick: () => oe(e),
646
+ children: [
647
+ /* @__PURE__ */ t(
648
+ "img",
649
+ {
650
+ className: "wm-topicPreview",
651
+ src: M[e][0]?.src,
652
+ alt: "",
653
+ draggable: !1,
654
+ onError: (o) => {
655
+ o.currentTarget.style.visibility = "hidden";
656
+ }
657
+ }
658
+ ),
659
+ /* @__PURE__ */ i("div", { className: "wm-topicBody", children: [
660
+ /* @__PURE__ */ t("span", { className: "wm-topicLabel", children: mt[e] }),
661
+ /* @__PURE__ */ t("span", { className: "wm-topicExample", children: pt[e] })
662
+ ] })
663
+ ]
664
+ },
665
+ e
666
+ )) })
667
+ ] }),
668
+ A && /* @__PURE__ */ i("div", { className: "wm-final", children: [
669
+ /* @__PURE__ */ t("h2", { className: "wm-finalTitle", children: "Great job!" }),
670
+ /* @__PURE__ */ i("p", { className: "wm-finalScore", children: [
671
+ Ie,
672
+ " / ",
673
+ E,
674
+ " correct"
675
+ ] }),
676
+ /* @__PURE__ */ t("p", { className: "wm-finalTeamLabel", children: "Your round" }),
677
+ /* @__PURE__ */ t("div", { className: "wm-trophyRow", children: ge.length === 0 ? /* @__PURE__ */ t("p", { className: "wm-trophyEmpty", children: "Play a round to see results" }) : ge.map((e) => /* @__PURE__ */ i("div", { className: "wm-trophyCard", children: [
678
+ /* @__PURE__ */ i("div", { className: `wm-trophy ${e.result}`, children: [
679
+ /* @__PURE__ */ t("span", { className: "wm-trophyMark", children: e.result === "correct" ? "✔" : e.result === "almost" ? "◐" : "✘" }),
680
+ /* @__PURE__ */ t("span", { className: "wm-trophyWord", children: e.correct.split(",")[0] })
681
+ ] }),
682
+ /* @__PURE__ */ i("span", { className: "wm-trophyName", children: [
683
+ "Round ",
684
+ e.round
685
+ ] })
686
+ ] }, e.round)) }),
687
+ /* @__PURE__ */ i("div", { className: "wm-finalActions", children: [
688
+ /* @__PURE__ */ t("button", { type: "button", className: "wm-againBtn", onClick: () => oe(), children: "Play again" }),
689
+ /* @__PURE__ */ t("button", { type: "button", className: "wm-ghostBtn", onClick: De, children: "Choose theme" })
690
+ ] })
691
+ ] }),
692
+ T && !A && /* @__PURE__ */ i("div", { className: `wm-play${u === "ready" ? " wm-play--ready" : ""}`, children: [
693
+ /* @__PURE__ */ i("div", { className: "wm-playStatus", children: [
694
+ u === "ready" && /* @__PURE__ */ i(
695
+ "div",
696
+ {
697
+ className: "wm-readyBlock",
698
+ style: { "--wm-ready-s": `${F}s` },
699
+ children: [
700
+ /* @__PURE__ */ t("p", { className: "wm-playStatusReady", children: "GET READY" }),
701
+ /* @__PURE__ */ i("div", { className: "wm-readyLoad", "aria-hidden": !0, children: [
702
+ /* @__PURE__ */ i("div", { className: "wm-readyTiles", children: [
703
+ /* @__PURE__ */ t("span", { className: "wm-heroTile" }),
704
+ /* @__PURE__ */ t("span", { className: "wm-heroTile" }),
705
+ /* @__PURE__ */ t("span", { className: "wm-heroTile" }),
706
+ /* @__PURE__ */ t("span", { className: "wm-heroTile wm-heroTileMissing", children: "?" })
707
+ ] }),
708
+ /* @__PURE__ */ t("div", { className: "wm-readyBar", children: /* @__PURE__ */ t("span", { className: "wm-readyBarFill" }) })
709
+ ] })
710
+ ]
711
+ }
712
+ ),
713
+ u === "memorize" && /* @__PURE__ */ i("p", { className: "wm-playStatusMemorize", children: [
714
+ "MEMORIZE ",
715
+ O
716
+ ] }),
717
+ u === "guess" && !v && /* @__PURE__ */ i("p", { children: [
718
+ "Time left: ",
719
+ q,
720
+ "s"
721
+ ] })
722
+ ] }),
723
+ u !== "ready" && /* @__PURE__ */ t("div", { className: "wm-playSlot", children: /* @__PURE__ */ t("div", { className: "wm-playGrid", children: w.map((e, o) => {
724
+ const r = y === o && u === "guess" && !v, d = $.current.get(e.src), p = d?.complete && d.src ? d.src : e.src, h = [
725
+ "wm-playCard",
726
+ we === "correct" && y === o ? "wm-playCardCorrect" : "",
727
+ we === "wrong" && y === o ? "wm-playCardWrong" : ""
728
+ ].filter(Boolean).join(" ");
729
+ return /* @__PURE__ */ t("div", { className: h, children: !r && /* @__PURE__ */ t(
730
+ "img",
731
+ {
732
+ src: p,
733
+ alt: e.name,
734
+ fetchPriority: "high",
735
+ loading: "eager",
736
+ decoding: "async",
737
+ draggable: !1
738
+ },
739
+ `${e.src}-${d?.complete ? "loaded" : "pending"}`
740
+ ) }, o);
741
+ }) }) }),
742
+ /* @__PURE__ */ i("div", { className: "wm-playControls", children: [
743
+ u === "guess" && !v && /* @__PURE__ */ i("div", { className: "wm-guessRow", children: [
744
+ /* @__PURE__ */ t(
745
+ "input",
746
+ {
747
+ className: "wm-guessInput",
748
+ type: "text",
749
+ placeholder: "Type the missing word",
750
+ value: j,
751
+ onChange: (e) => pe(e.target.value),
752
+ onKeyDown: (e) => {
753
+ e.key === "Enter" && !G && be();
754
+ }
755
+ }
756
+ ),
757
+ /* @__PURE__ */ t(
758
+ "button",
759
+ {
760
+ type: "button",
761
+ className: "wm-actionBtn",
762
+ onClick: be,
763
+ disabled: G,
764
+ children: G ? "..." : "Check"
765
+ }
766
+ )
767
+ ] }),
768
+ v && /* @__PURE__ */ t("button", { type: "button", className: "wm-actionBtn", onClick: He, children: "Next round" })
769
+ ] })
770
+ ] })
771
+ ]
772
+ }
773
+ )
774
+ }
775
+ )
776
+ }
777
+ )
778
+ }
779
+ );
780
+ }
781
+ const _ = 1280, Y = 720;
782
+ function bt(s, c) {
783
+ const n = Math.min(s, c);
784
+ return s <= 768 ? Math.max(280, s - 20) : Math.max(400, Math.min(1200, n - 40));
785
+ }
786
+ function Rt({
787
+ gameCubeSize: s,
788
+ screenHeight: c,
789
+ screenWidth: n,
790
+ seed: l
791
+ }) {
792
+ const [m, b] = a(() => ({
793
+ width: typeof window < "u" ? window.innerWidth : _,
794
+ height: typeof window < "u" ? window.innerHeight : Y
795
+ }));
796
+ L(() => {
797
+ const w = () => {
798
+ b({
799
+ width: window.innerWidth,
800
+ height: window.innerHeight
801
+ });
802
+ };
803
+ w(), window.addEventListener("resize", w), window.addEventListener("orientationchange", w);
804
+ const z = new ResizeObserver(w);
805
+ return z.observe(document.documentElement), () => {
806
+ window.removeEventListener("resize", w), window.removeEventListener("orientationchange", w), z.disconnect();
807
+ };
808
+ }, []);
809
+ const B = ye(() => Math.min(m.width / _, m.height / Y), [m.width, m.height]);
810
+ return /* @__PURE__ */ t(
811
+ "div",
812
+ {
813
+ style: {
814
+ position: "relative",
815
+ width: "100%",
816
+ height: "100%",
817
+ overflow: "hidden"
818
+ },
819
+ children: /* @__PURE__ */ t(
820
+ "div",
821
+ {
822
+ style: {
823
+ position: "absolute",
824
+ left: "50%",
825
+ top: "50%",
826
+ width: `${_}px`,
827
+ height: `${Y}px`,
828
+ transform: `translate(-50%, -50%) scale(${B})`,
829
+ transformOrigin: "center center"
830
+ },
831
+ children: /* @__PURE__ */ t(
832
+ "div",
833
+ {
834
+ style: {
835
+ width: `${_}px`,
836
+ height: `${Y}px`,
837
+ position: "relative",
838
+ overflow: "hidden"
839
+ },
840
+ children: /* @__PURE__ */ t(
841
+ ut,
842
+ {
843
+ gameCubeSize: s ?? bt(m.width, m.height),
844
+ screenWidth: n ?? m.width,
845
+ screenHeight: c ?? m.height,
846
+ seed: l
847
+ }
848
+ )
849
+ }
850
+ )
851
+ }
852
+ )
853
+ }
854
+ );
855
+ }
856
+ export {
857
+ Rt as AdaptiveGameShell,
858
+ Rt as Game,
859
+ ut as RawGame,
860
+ M as themes
861
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mblinkov/whats-missing",
3
- "version": "21.0.0",
3
+ "version": "21.0.1",
4
4
  "description": "A memory game component for React - Guess what's missing from a collection of images",
5
5
  "main": "dist/whats-missing.cjs.js",
6
6
  "module": "dist/whats-missing.es.js",