speakid-hangman 1.0.2 → 1.0.3
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"speakid-hangman.es.js","sources":["../src/styles/style.ts","../src/components/HangmanLobbyGame.tsx"],"sourcesContent":["import { CSSProperties } from \"react\";\n\n// ===== Стили согласно визуальному гайдлайну: Onest, минималистичный, дружелюбный =====\n// Шрифт: Onest (Regular, Medium, SemiBold)\n// Стиль: Плоский, минималистичный, воздушный, без излишеств\n// Цвета: Мягкий контраст, дружелюбная палитра\n\nexport const styles: Record<string, CSSProperties> = {\n gmCenterScreen: {\n position: \"relative\",\n zIndex: 1,\n minHeight: \"100%\",\n width: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n alignItems: \"center\",\n textAlign: \"center\",\n color: \"#1f2937\", // colorTextPrimary\n padding: \"24px 16px\",\n boxSizing: \"border-box\",\n fontFamily: '\"Onest\", system-ui, -apple-system, \"Segoe UI\", Roboto, Arial, sans-serif',\n background: \"transparent\", // Прозрачный по умолчанию, переопределяется в компоненте\n },\n // Desktop: Headline 1 - Onest SemiBold 32px, line-height 110%\n gmHeadline1: {\n fontWeight: 600, // SemiBold\n fontSize: \"clamp(30px, 4vw, 32px)\", // Mobile 30px, Desktop 32px\n lineHeight: \"110%\",\n marginBottom: \"24px\",\n color: \"#1f2937\", // colorTextPrimary\n fontFamily: '\"Onest\", system-ui, sans-serif',\n },\n // Desktop: Headline 2 - Onest Medium 24px, line-height 110%\n gmHeadline2: {\n fontWeight: 500, // Medium\n fontSize: \"24px\",\n lineHeight: \"110%\",\n marginBottom: \"16px\",\n color: \"#1f2937\", // colorTextPrimary\n fontFamily: '\"Onest\", system-ui, sans-serif',\n },\n // Desktop: Headline 3 - Onest Medium 24px, line-height 110%\n // Mobile: Headline 3 - Onest Medium 16px, line-height 110%\n gmHeadline3: {\n fontWeight: 500, // Medium\n fontSize: \"clamp(16px, 2vw, 24px)\", // Mobile 16px, Desktop 24px\n lineHeight: \"110%\",\n marginBottom: \"12px\",\n color: \"#1f2937\", // colorTextPrimary\n fontFamily: '\"Onest\", system-ui, sans-serif',\n },\n // Desktop: Body L - Onest Regular 18px, line-height 120%\n gmBodyL: {\n fontWeight: 400, // Regular\n fontSize: \"18px\",\n lineHeight: \"120%\",\n marginBottom: \"12px\",\n color: \"#1f2937\", // colorTextPrimary\n fontFamily: '\"Onest\", system-ui, sans-serif',\n },\n // Desktop: Body M - Onest Regular 16px, line-height 120%\n // Mobile: Body M - Onest Regular 14px, line-height 120%\n gmBodyM: {\n fontWeight: 400, // Regular\n fontSize: \"clamp(14px, 1.5vw, 16px)\", // Mobile 14px, Desktop 16px\n lineHeight: \"120%\",\n marginBottom: \"8px\",\n color: \"#1f2937\", // colorTextPrimary\n fontFamily: '\"Onest\", system-ui, sans-serif',\n },\n // Desktop: Body S - Onest Regular 14px, line-height 120%\n // Mobile: Body S - Onest Regular 12px, line-height 120%\n gmBodyS: {\n fontWeight: 400, // Regular\n fontSize: \"clamp(12px, 1.5vw, 14px)\", // Mobile 12px, Desktop 14px\n lineHeight: \"120%\",\n color: \"#6b7280\", // colorTextSecondary\n marginBottom: \"8px\",\n fontFamily: '\"Onest\", system-ui, sans-serif',\n },\n // Button: Onest Regular 16px, line-height 100%\n gmButton: {\n fontFamily: '\"Onest\", system-ui, sans-serif',\n fontWeight: 400, // Regular\n fontSize: \"16px\",\n lineHeight: \"100%\",\n padding: \"10px 16px\",\n borderRadius: \"8px\", // Более мягкие углы для минималистичного стиля\n border: \"1px solid #e5e7eb\", // colorSeparator\n background: \"#ec4c44\", // colorAccent (Default)\n color: \"#ffffff\", // colorTextContrast\n cursor: \"pointer\",\n boxShadow: \"none\", // Плоский стиль без теней\n transition: \"background-color 0.2s ease, opacity 0.2s ease, transform 0.1s ease\",\n margin: \"4px\",\n },\n gmButtonActive: {\n background: \"#333\", // colorAccent Active\n color: \"#fff\", // colorTextContrast\n boxShadow: \"none\", // Плоский стиль\n },\n gmButtonSecondary: {\n background: \"#f9f9f9\", // colorBackgroundAccent\n color: \"#1f2937\", // colorTextPrimary\n border: \"1px solid #e5e7eb\", // colorSeparator\n boxShadow: \"none\", // Плоский стиль\n },\n gmButtonGroup: {\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"8px\",\n justifyContent: \"center\",\n marginBottom: \"24px\",\n },\n gmWordDisplay: {\n fontSize: \"clamp(20px, 5vw, 28px)\",\n fontWeight: 500, // Medium\n letterSpacing: \"6px\",\n margin: \"32px 0\",\n color: \"#1f2937\", // colorTextPrimary\n fontFamily: '\"Onest\", system-ui, sans-serif',\n lineHeight: \"120%\",\n },\n gmGuessedLetters: {\n fontSize: \"clamp(12px, 1.5vw, 16px)\", // Body S / Body M\n color: \"#6b7280\", // colorTextSecondary\n marginTop: \"16px\",\n minHeight: \"24px\",\n fontFamily: '\"Onest\", system-ui, sans-serif',\n lineHeight: \"120%\",\n },\n gmStatusWin: {\n color: \"#10b981\", // colorTextPositive / colorIconPositive\n fontWeight: 500, // Medium\n fontSize: \"clamp(14px, 1.5vw, 18px)\", // Body M / Body L\n lineHeight: \"120%\",\n margin: \"16px 0\",\n fontFamily: '\"Onest\", system-ui, sans-serif',\n },\n gmStatusLose: {\n color: \"#ec4c44\", // colorTextNegative / colorIconNegative\n fontWeight: 500, // Medium\n fontSize: \"clamp(14px, 1.5vw, 18px)\", // Body M / Body L\n lineHeight: \"120%\",\n margin: \"16px 0\",\n fontFamily: '\"Onest\", system-ui, sans-serif',\n },\n gmInfoBox: {\n background: \"#f9f9f9\", // colorBackgroundAccent\n border: \"1px solid #e5e7eb\", // colorSeparator\n borderRadius: \"8px\", // Мягкие углы\n padding: \"16px\",\n marginBottom: \"24px\",\n maxWidth: \"500px\",\n width: \"100%\",\n boxShadow: \"none\", // Плоский стиль\n },\n gmSection: {\n marginBottom: \"32px\",\n width: \"100%\",\n maxWidth: \"500px\",\n },\n // ✅ Обновлено только для качества логотипа (размер как в magic-sentence)\n gmLogoFixed: {\n position: \"absolute\",\n top: \"16px\",\n left: \"16px\",\n width: \"auto\",\n zIndex: 10,\n pointerEvents: \"none\",\n background: \"transparent\",\n transform: \"none\",\n willChange: \"auto\",\n },\n gmLogoImg: {\n height: \"28px\",\n width: \"auto\",\n background: \"transparent\",\n objectFit: \"contain\",\n imageRendering: \"auto\",\n transform: \"translateZ(0)\",\n backfaceVisibility: \"hidden\",\n WebkitFontSmoothing: \"antialiased\",\n display: \"block\",\n },\n gmLogoFallback: {\n height: \"28px\",\n width: \"auto\",\n background: \"transparent\",\n color: \"#ec4c44\",\n fontSize: \"16px\",\n fontWeight: 700,\n display: \"block\",\n },\n};\n\n// ===== Цветовая палитра для справки =====\n// colorTextPrimary: #1f2937\n// colorTextSecondary: #6b7280\n// colorTextNegative: #ec4c44\n// colorTextPositive: #10b981\n// colorBackgroundAccent: #f9f9f9\n// colorSeparator: #e5e7eb\n// colorAccent (Default): #ec4c44\n// colorAccent (Active): #333\n\n","import React, { useState, useEffect, useCallback, useMemo } from \"react\";\nimport { styles } from \"../styles/style\";\n\n// Компонент визуализации виселицы\nfunction HangmanDrawing({ \n mistakes, \n maxMistakes, \n size = 200 \n}: { \n mistakes: number; \n maxMistakes: number;\n size?: number;\n}) {\n // Адаптивные размеры SVG\n const svgWidth = size;\n const svgHeight = size * 1.25; // Соотношение 200:250\n const strokeWidth = Math.max(2, size / 100); // Адаптивная толщина линий\n \n // Координаты (пропорциональные исходному размеру 200x250)\n const baseX1 = 10 * (svgWidth / 200);\n const baseY = 240 * (svgHeight / 250);\n const baseX2 = 150 * (svgWidth / 200);\n \n const poleX = 80 * (svgWidth / 200);\n const poleY1 = 20 * (svgHeight / 250);\n const poleY2 = 240 * (svgHeight / 250);\n \n const topX1 = 80 * (svgWidth / 200);\n const topY = 20 * (svgHeight / 250);\n const topX2 = 150 * (svgWidth / 200);\n \n const ropeX = 150 * (svgWidth / 200);\n const ropeY1 = 20 * (svgHeight / 250);\n const ropeY2 = 50 * (svgHeight / 250);\n \n const headCX = 150 * (svgWidth / 200);\n const headCY = 70 * (svgHeight / 250);\n const headR = 20 * (svgWidth / 200);\n \n const bodyX = 150 * (svgWidth / 200);\n const bodyY1 = 90 * (svgHeight / 250);\n const bodyY2 = 150 * (svgHeight / 250);\n \n const leftArmX1 = 150 * (svgWidth / 200);\n const leftArmY1 = 110 * (svgHeight / 250);\n const leftArmX2 = 130 * (svgWidth / 200);\n const leftArmY2 = 130 * (svgHeight / 250);\n \n const rightArmX1 = 150 * (svgWidth / 200);\n const rightArmY1 = 110 * (svgHeight / 250);\n const rightArmX2 = 170 * (svgWidth / 200);\n const rightArmY2 = 130 * (svgHeight / 250);\n \n const leftLegX1 = 150 * (svgWidth / 200);\n const leftLegY1 = 150 * (svgHeight / 250);\n const leftLegX2 = 130 * (svgWidth / 200);\n const leftLegY2 = 190 * (svgHeight / 250);\n \n const rightLegX1 = 150 * (svgWidth / 200);\n const rightLegY1 = 150 * (svgHeight / 250);\n const rightLegX2 = 170 * (svgWidth / 200);\n const rightLegY2 = 190 * (svgHeight / 250);\n\n // Цвет в зависимости от количества ошибок\n const getStrokeColor = () => {\n if (mistakes === 0) return \"#1f2937\"; // colorTextPrimary\n if (mistakes <= maxMistakes * 0.5) return \"#1f2937\"; // Окей\n if (mistakes <= maxMistakes * 0.75) return \"#f59e0b\"; // Предупреждение\n return \"#ec4c44\"; // colorTextNegative - опасно\n };\n\n const strokeColor = getStrokeColor();\n\n return (\n <svg \n width={svgWidth} \n height={svgHeight} \n style={{ \n display: \"block\",\n margin: \"0 auto\",\n }}\n >\n {/* Виселица рисуется пошагово с ошибками */}\n {/* 1-я ошибка: Основание */}\n {mistakes > 0 && (\n <line \n x1={baseX1} \n y1={baseY} \n x2={baseX2} \n y2={baseY} \n stroke={strokeColor} \n strokeWidth={strokeWidth}\n />\n )}\n\n {/* 2-я ошибка: Стойка */}\n {mistakes > 1 && (\n <line \n x1={poleX} \n y1={poleY1} \n x2={poleX} \n y2={poleY2} \n stroke={strokeColor} \n strokeWidth={strokeWidth}\n />\n )}\n\n {/* 3-я ошибка: Верхняя перекладина */}\n {mistakes > 2 && (\n <line \n x1={topX1} \n y1={topY} \n x2={topX2} \n y2={topY} \n stroke={strokeColor} \n strokeWidth={strokeWidth}\n />\n )}\n\n {/* 4-я ошибка: Веревка */}\n {mistakes > 3 && (\n <line \n x1={ropeX} \n y1={ropeY1} \n x2={ropeX} \n y2={ropeY2} \n stroke={strokeColor} \n strokeWidth={strokeWidth}\n />\n )}\n\n {/* 5-я ошибка: Голова */}\n {mistakes > 4 && (\n <circle \n cx={headCX} \n cy={headCY} \n r={headR} \n stroke={strokeColor} \n fill=\"none\" \n strokeWidth={strokeWidth}\n />\n )}\n \n {/* 6-я ошибка: Тело */}\n {mistakes > 5 && (\n <line \n x1={bodyX} \n y1={bodyY1} \n x2={bodyX} \n y2={bodyY2} \n stroke={strokeColor} \n strokeWidth={strokeWidth}\n />\n )}\n \n {/* Дополнительные части (если maxMistakes больше 6) */}\n {mistakes > 6 && (\n <line \n x1={leftArmX1} \n y1={leftArmY1} \n x2={leftArmX2} \n y2={leftArmY2} \n stroke={strokeColor} \n strokeWidth={strokeWidth}\n />\n )}\n \n {mistakes > 7 && (\n <line \n x1={rightArmX1} \n y1={rightArmY1} \n x2={rightArmX2} \n y2={rightArmY2} \n stroke={strokeColor} \n strokeWidth={strokeWidth}\n />\n )}\n \n {mistakes > 8 && (\n <line \n x1={leftLegX1} \n y1={leftLegY1} \n x2={leftLegX2} \n y2={leftLegY2} \n stroke={strokeColor} \n strokeWidth={strokeWidth}\n />\n )}\n \n {mistakes > 9 && (\n <line \n x1={rightLegX1} \n y1={rightLegY1} \n x2={rightLegX2} \n y2={rightLegY2} \n stroke={strokeColor} \n strokeWidth={strokeWidth}\n />\n )}\n </svg>\n );\n}\n\nexport interface HangmanLobbyGameProps {\n gameCubeSize?: number;\n screenHeight?: number;\n screenWidth?: number;\n logoUrl?: string;\n showLogo?: boolean;\n baseURL?: string;\n}\n\nexport default function HangmanLobbyGame({\n gameCubeSize = 400,\n screenHeight = 800,\n screenWidth = 800,\n logoUrl,\n showLogo = true,\n baseURL,\n}: HangmanLobbyGameProps = {}) {\n const categories = {\n Professions: [\"teacher\", \"doctor\", \"nurse\", \"driver\", \"police\", \"firefighter\", \"cook\", \"waiter\", \"farmer\", \"builder\", \"singer\", \"actor\", \"dentist\", \"pilot\", \"vet\", \"artist\", \"cleaner\", \"student\", \"baker\", \"mechanic\"],\n Family: [\"mother\", \"father\", \"sister\", \"brother\", \"grandmother\", \"grandfather\", \"aunt\", \"uncle\", \"cousin\", \"baby\", \"parents\", \"children\", \"wife\", \"husband\", \"son\", \"daughter\", \"family\", \"twins\", \"relatives\"],\n \"Farm animals\": [\"cow\", \"pig\", \"horse\", \"sheep\", \"goat\", \"duck\", \"chicken\", \"rooster\", \"turkey\", \"goose\", \"rabbit\", \"mouse\", \"donkey\", \"bee\", \"hen\", \"lamb\", \"bull\", \"pony\"],\n Food: [\"apple\", \"banana\", \"bread\", \"cheese\", \"milk\", \"egg\", \"rice\", \"soup\", \"fish\", \"meat\", \"potato\", \"carrot\", \"tomato\", \"cucumber\", \"butter\", \"cake\", \"salad\", \"pasta\", \"pizza\", \"juice\"],\n Hobbies: [\"reading\", \"drawing\", \"painting\", \"dancing\", \"singing\", \"cooking\", \"swimming\", \"fishing\", \"running\", \"cycling\", \"skating\", \"writing\", \"camping\", \"photography\", \"hiking\", \"games\"],\n Christmas: [\"tree\", \"present\", \"gift\", \"santa\", \"snow\", \"snowman\", \"bell\", \"star\", \"lights\", \"card\", \"cookies\", \"elf\", \"sleigh\", \"reindeer\", \"candle\", \"stocking\"],\n Halloween: [\"pumpkin\", \"costume\", \"candy\", \"ghost\", \"witch\", \"spider\", \"bat\", \"skeleton\", \"mask\", \"monster\", \"mummy\", \"cat\", \"broom\", \"zombie\", \"trick\", \"treat\", \"candle\", \"night\", \"party\"],\n Sport: [\"football\", \"basketball\", \"tennis\", \"swimming\", \"running\", \"baseball\", \"skiing\", \"skating\", \"volleyball\", \"hockey\", \"golf\", \"boxing\", \"cycling\", \"rugby\", \"karate\", \"yoga\", \"surfing\", \"climbing\", \"dancing\", \"gym\", \"chess\"],\n \"Body parts\": [\"head\", \"hair\", \"eyes\", \"ears\", \"nose\", \"mouth\", \"teeth\", \"tongue\", \"neck\", \"shoulder\", \"arm\", \"hand\", \"finger\", \"leg\", \"knee\", \"foot\", \"toe\", \"back\", \"stomach\", \"heart\", \"legs\", \"nails\", \"chin\", \"beard\"],\n \"School subjects\": [\"math\", \"english\", \"history\", \"geography\", \"art\", \"music\", \"science\", \"biology\", \"chemistry\", \"physics\", \"pe\", \"literature\", \"drama\", \"design\", \"economics\"],\n Animals: [\"cat\", \"dog\", \"rabbit\", \"elephant\", \"lion\", \"tiger\", \"monkey\", \"bear\", \"fox\", \"wolf\", \"giraffe\", \"zebra\", \"crocodile\", \"dolphin\", \"whale\", \"shark\", \"frog\", \"parrot\", \"mouse\", \"penguin\", \"deer\", \"lizard\", \"turtle\", \"snake\"],\n Countries: [\"russia\", \"canada\", \"china\", \"japan\", \"france\", \"germany\", \"italy\", \"spain\", \"brazil\", \"india\", \"australia\", \"america\", \"england\", \"korea\", \"mexico\", \"egypt\", \"turkey\", \"vietnam\", \"norway\", \"finland\", \"thailand\", \"georgia\", \"kazakhstan\"],\n Clothes: [\"shirt\", \"dress\", \"skirt\", \"trousers\", \"jeans\", \"coat\", \"jacket\", \"sweater\", \"socks\", \"shoes\", \"boots\", \"hat\", \"scarf\", \"gloves\", \"shorts\", \"cap\", \"belt\", \"tie\", \"uniform\", \"pants\", \"underwear\"],\n Traveling: [\"ticket\", \"luggage\", \"suitcase\", \"airport\", \"flight\", \"passport\", \"visa\", \"map\", \"guide\", \"hotel\", \"reservation\", \"bus\", \"train\", \"taxi\", \"tourist\", \"sightseeing\", \"backpack\", \"journey\", \"adventure\", \"beach\", \"tour\", \"souvenir\"],\n Environment: [\"tree\", \"forest\", \"air\", \"water\", \"pollution\", \"recycle\", \"nature\", \"clean\", \"waste\", \"plastic\", \"energy\", \"animal\", \"climate\", \"earth\", \"ocean\", \"river\", \"planet\", \"save\", \"green\", \"environment\", \"litter\", \"organic\"],\n Space: [\"planet\", \"star\", \"sun\", \"moon\", \"astronaut\", \"rocket\", \"space\", \"galaxy\", \"universe\", \"telescope\", \"comet\", \"asteroid\", \"orbit\", \"gravity\", \"alien\", \"spaceship\", \"mars\", \"satellite\", \"sky\", \"eclipse\"],\n Devices: [\"computer\", \"laptop\", \"phone\", \"tablet\", \"tv\", \"keyboard\", \"mouse\", \"printer\", \"camera\", \"headphones\", \"charger\", \"screen\", \"watch\", \"microphone\", \"speaker\", \"console\", \"router\", \"battery\", \"cable\", \"remote\"],\n };\n\n const [stage, setStage] = useState<\"lobby\" | \"category\" | \"rounds\" | \"game\" | \"result\">(\"lobby\");\n const [category, setCategory] = useState<keyof typeof categories | \"\">(\"\");\n const [difficulty] = useState<\"Easy\" | \"Normal\" | \"Hard\">(\"Normal\"); // Фиксированная сложность\n const [rounds, setRounds] = useState(0); // 0 означает \"не выбрано\"\n const [currentRound, setCurrentRound] = useState(1);\n const [word, setWord] = useState(\"\");\n const [guessed, setGuessed] = useState<string[]>([]);\n const [mistakes, setMistakes] = useState(0);\n const [wins, setWins] = useState(0);\n const [roundResult, setRoundResult] = useState<\"win\" | \"lose\" | null>(null);\n const [containerSize, setContainerSize] = useState<number | null>(null);\n const [scale, setScale] = useState(1);\n const [usedWords, setUsedWords] = useState<string[]>([]); // Отслеживание использованных слов\n\n const maxMistakes = difficulty === \"Easy\" ? 8 : difficulty === \"Normal\" ? 6 : 4;\n\n // Вычисляем baseURL для изображений\n const imagesBaseURL = baseURL || (typeof window !== \"undefined\" && window.origin \n ? `${window.origin}/cloud/speakid/games/hangman`\n : \"/cloud/speakid/games/hangman\");\n\n // Определение мобильного устройства - используем window напрямую (как в magic-sentence)\n const [isMobile, setIsMobile] = useState(false);\n const [isNestHub, setIsNestHub] = useState(false);\n\n // Адаптивные размеры относительно gameCubeSize согласно визуальному гайдлайну\n // Desktop базовые размеры: Headline 1 - 32px, Headline 2 - 24px, Body M - 16px, Button - 16px\n // Mobile базовые размеры: Headline 1 - 30px, Headline 3 - 16px, Body M - 14px\n const baseFontSize = useMemo(() => {\n const fontSizeScale = (containerSize || gameCubeSize || 1000) / 400; // базовый размер 400px\n return {\n headline1: isMobile \n ? Math.max(24, Math.min(30, 30 * fontSizeScale)) // Mobile: 30px\n : Math.max(28, Math.min(32, 32 * fontSizeScale)), // Desktop: 32px\n headline2: Math.max(20, Math.min(28, 24 * fontSizeScale)), // Desktop: 24px\n headline3: isMobile\n ? Math.max(14, Math.min(18, 16 * fontSizeScale)) // Mobile: 16px\n : Math.max(20, Math.min(26, 24 * fontSizeScale)), // Desktop: 24px\n bodyL: Math.max(14, Math.min(20, 18 * fontSizeScale)), // Desktop: 18px\n bodyM: isMobile\n ? Math.max(12, Math.min(16, 14 * fontSizeScale)) // Mobile: 14px\n : Math.max(14, Math.min(18, 16 * fontSizeScale)), // Desktop: 16px\n bodyS: isMobile\n ? Math.max(10, Math.min(14, 12 * fontSizeScale)) // Mobile: 12px\n : Math.max(12, Math.min(16, 14 * fontSizeScale)), // Desktop: 14px\n wordDisplay: Math.max(18, Math.min(32, 26 * fontSizeScale)), // Адаптивный размер\n button: Math.max(12, Math.min(18, 16 * fontSizeScale)), // Desktop: 16px\n };\n }, [isMobile, containerSize, gameCubeSize]);\n\n // Адаптивные отступы и размеры (минималистичный стиль - мягкие углы)\n // Специальные настройки для Nest Hub (1024x600)\n const padding = useMemo(() => {\n const fontSizeScale = (containerSize || gameCubeSize || 1000) / 400;\n return isNestHub \n ? Math.max(8, Math.min(12, 10 * fontSizeScale))\n : Math.max(12, Math.min(24, 16 * fontSizeScale));\n }, [isNestHub, containerSize, gameCubeSize]);\n const gap = useMemo(() => {\n const fontSizeScale = (containerSize || gameCubeSize || 1000) / 400;\n return isNestHub\n ? Math.max(3, Math.min(6, 5 * fontSizeScale))\n : Math.max(4, Math.min(12, 8 * fontSizeScale));\n }, [isNestHub, containerSize, gameCubeSize]);\n const borderRadius = useMemo(() => {\n const fontSizeScale = (containerSize || gameCubeSize || 1000) / 400;\n return Math.max(6, Math.min(10, 8 * fontSizeScale));\n }, [containerSize, gameCubeSize]); // Мягкие углы для плоского стиля\n\n // Функции вдохновленные открытым кодом Hangman\n const isWordGuessed = (secretWord: string, lettersGuessed: string[]): boolean => {\n // Проверяем, все ли буквы слова угаданы\n return secretWord.split(\"\").every(letter => lettersGuessed.includes(letter));\n };\n\n const getGuessedWord = (secretWord: string, lettersGuessed: string[]): string => {\n // Возвращает строку с угаданными буквами и подчеркиваниями\n return secretWord\n .split(\"\")\n .map(letter => (lettersGuessed.includes(letter) ? letter : \"_\"))\n .join(\" \");\n };\n\n const getAvailableLetters = (lettersGuessed: string[]): string[] => {\n // Возвращает массив доступных букв (не угаданных)\n const alphabet = \"abcdefghijklmnopqrstuvwxyz\".split(\"\");\n return alphabet.filter(letter => !lettersGuessed.includes(letter));\n };\n\n const pickRandomCategory = (): keyof typeof categories => {\n const categoryKeys = Object.keys(categories) as Array<keyof typeof categories>;\n \n // Используем crypto.getRandomValues для более надежной случайности\n let randomIndex: number;\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n const array = new Uint32Array(1);\n crypto.getRandomValues(array);\n randomIndex = array[0] % categoryKeys.length;\n } else {\n // Fallback на Math.random если crypto недоступен\n randomIndex = Math.floor(Math.random() * categoryKeys.length);\n }\n \n return categoryKeys[randomIndex];\n };\n\n const pickRandomWord = (cat: keyof typeof categories, avoidWords: string[] = []): string => {\n if (!cat || !categories[cat]) {\n // Fallback если категория пустая или не существует\n const firstCategory = Object.keys(categories)[0] as keyof typeof categories;\n return categories[firstCategory]?.[0] || \"\";\n }\n \n const words = categories[cat];\n if (!words || words.length === 0) {\n // Fallback если слова пустые\n return \"\";\n }\n \n // Если есть доступные слова (не использованные), выбираем из них\n const availableWords = words.filter(w => !avoidWords.includes(w));\n const wordsToChooseFrom = availableWords.length > 0 ? availableWords : words;\n \n if (wordsToChooseFrom.length === 0) {\n return \"\";\n }\n \n // Используем crypto.getRandomValues для более надежной случайности\n // Преобразуем в дробное число от 0 до 1 для равномерного распределения\n let randomIndex: number;\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n const array = new Uint32Array(1);\n crypto.getRandomValues(array);\n // Преобразуем в дробное число от 0 до 1 для равномерного распределения\n const randomFloat = array[0] / 0xFFFFFFFF;\n randomIndex = Math.floor(randomFloat * wordsToChooseFrom.length);\n } else {\n // Fallback на Math.random если crypto недоступен\n randomIndex = Math.floor(Math.random() * wordsToChooseFrom.length);\n }\n \n return wordsToChooseFrom[randomIndex];\n };\n\n const startGame = () => {\n if (!category) return;\n setUsedWords([]); // Сбрасываем список использованных слов при новой игре\n const randomWord = pickRandomWord(category, []);\n if (!randomWord) {\n // Если не удалось выбрать слово, возвращаемся к выбору категории\n setStage(\"category\");\n return;\n }\n setWord(randomWord);\n setUsedWords([randomWord]); // Запоминаем первое слово\n setGuessed([]);\n setMistakes(0);\n setCurrentRound(1);\n setWins(0);\n setRoundResult(null);\n setStage(\"game\");\n };\n\n // Функция для обработки выбора буквы (используется и для клавиатуры, и для кликов)\n const handleLetterSelect = useCallback((letter: string) => {\n if (stage !== \"game\" || roundResult !== null) return;\n \n const lowerLetter = letter.toLowerCase();\n \n // Проверка: только буквы английского алфавита\n if (!/^[a-z]$/.test(lowerLetter)) return;\n \n // Проверяем, была ли буква уже угадана\n setGuessed((prevGuessed) => {\n if (prevGuessed.includes(lowerLetter)) {\n return prevGuessed;\n }\n \n // Добавляем букву в список угаданных\n return [...prevGuessed, lowerLetter];\n });\n \n // Проверяем, есть ли буква в текущем слове (используем функциональное обновление)\n setWord((currentWord) => {\n if (currentWord && !currentWord.includes(lowerLetter)) {\n setMistakes((m) => m + 1);\n }\n return currentWord;\n });\n }, [stage, roundResult]);\n\n const handleKey = useCallback((e: KeyboardEvent) => {\n handleLetterSelect(e.key);\n }, [handleLetterSelect]);\n\n useEffect(() => {\n if (stage === \"game\") {\n window.addEventListener(\"keydown\", handleKey);\n return () => window.removeEventListener(\"keydown\", handleKey);\n }\n }, [stage, handleKey]);\n\n // Используем функцию из открытого кода\n const masked = word ? getGuessedWord(word, guessed) : \"\";\n const isWin = word ? isWordGuessed(word, guessed) : false;\n // Игра проиграна когда виселица полностью нарисована (10 частей: основание, стойка, перекладина, веревка, голова, тело, левая рука, правая рука, левая нога, правая нога)\n const isLose = mistakes >= 10;\n const availableLetters = getAvailableLetters(guessed);\n\n // Функция для перехода к следующему раунду (вынесена для избежания дублирования)\n const moveToNextRound = useCallback(() => {\n if (!category || currentRound >= rounds) {\n setStage(\"result\");\n return;\n }\n \n setCurrentRound((r) => r + 1);\n setUsedWords((prev) => {\n const newWord = pickRandomWord(category as keyof typeof categories, prev);\n if (newWord) {\n setWord(newWord);\n return [...prev, newWord];\n }\n return prev;\n });\n setGuessed([]);\n setMistakes(0);\n setRoundResult(null);\n }, [category, currentRound, rounds]);\n\n useEffect(() => {\n if (isWin && roundResult === null) {\n setRoundResult(\"win\");\n setWins((w) => w + 1);\n \n const timer = setTimeout(() => {\n moveToNextRound();\n }, 2000);\n \n return () => clearTimeout(timer);\n }\n \n if (isLose && roundResult === null) {\n setRoundResult(\"lose\");\n \n const timer = setTimeout(() => {\n moveToNextRound();\n }, 2000);\n \n return () => clearTimeout(timer);\n }\n }, [isWin, isLose, roundResult, moveToNextRound]);\n\n const nextRound = () => {\n if (!category || currentRound >= rounds) {\n setStage(\"result\");\n return;\n }\n \n setCurrentRound((r) => r + 1);\n setUsedWords((prev) => {\n const newWord = pickRandomWord(category as keyof typeof categories, prev);\n if (newWord) {\n setWord(newWord);\n return [...prev, newWord]; // Добавляем новое слово в список использованных\n }\n return prev;\n });\n setGuessed([]);\n setMistakes(0);\n setRoundResult(null);\n };\n\n // ✅ Адаптив под мобилки, планшеты и десктоп (как в magic-sentence)\n useEffect(() => {\n const resize = () => {\n const width = window.innerWidth;\n const height = window.innerHeight;\n const mobile = width < 768 || (width === 926 && height === 428) || (width === 932 && height === 430);\n const isSmallHeight = height < 700;\n const isWideScreen = width / height > 1.8;\n const nestHub = width === 1024 && height === 600;\n \n setIsMobile(mobile);\n setIsNestHub(nestHub);\n\n // ✅ Адаптивные размеры контейнера\n // Если передан gameCubeSize, используем его (но с ограничениями)\n if (gameCubeSize && gameCubeSize >= 320) {\n const minSize = 320;\n const maxSize = 1200;\n const finalSize = Math.max(minSize, Math.min(maxSize, gameCubeSize));\n setContainerSize(finalSize);\n setScale(1);\n } else if (mobile) {\n setContainerSize(null);\n setScale(1);\n } else if (isSmallHeight) {\n setContainerSize(null);\n setScale(1);\n } else if (isWideScreen) {\n // ✅ Широкие экраны: используем стандартный размер но уменьшаем масштаб\n const minSize = 400;\n const maxSize = 1200;\n const finalSize = Math.min(1000, Math.min(width, height) * 0.9);\n setContainerSize(finalSize);\n setScale(0.85);\n } else {\n const minSize = 400;\n const maxSize = 1200;\n const finalSize = Math.min(1000, Math.min(width, height) * 0.9);\n setContainerSize(finalSize);\n setScale(1);\n }\n };\n resize();\n window.addEventListener(\"resize\", resize);\n return () => window.removeEventListener(\"resize\", resize);\n }, [gameCubeSize]);\n\n // SVG с детскими каракулями для фона (более резкие и яркие)\n const kidsDoodlesSvg = `\n <svg width=\"100%\" height=\"100%\" xmlns=\"http://www.w3.org/2000/svg\" style=\"position: absolute; top: 0; left: 0; pointer-events: none; opacity: 0.2;\">\n <!-- Каракули мелками и фломастерами -->\n \n <!-- Сердечко -->\n <path d=\"M 85% 15% Q 85% 10%, 90% 10% Q 95% 10%, 95% 15% Q 95% 20%, 90% 25% Q 85% 30%, 85% 15%\" \n fill=\"none\" stroke=\"#FF69B4\" stroke-width=\"3\" stroke-linecap=\"round\"/>\n \n <!-- Звезда -->\n <path d=\"M 10% 85% L 12% 80% L 14% 85% L 18% 85% L 13% 88% L 15% 92% L 10% 89% L 5% 92% L 7% 88% L 2% 85% Z\" \n fill=\"#FFA500\" stroke=\"#FF8C00\" stroke-width=\"1.5\"/>\n \n <!-- Волнистые линии (мелки) -->\n <path d=\"M 20% 25% Q 22% 23%, 24% 25% T 28% 25% T 32% 25%\" \n fill=\"none\" stroke=\"#FF6B6B\" stroke-width=\"3.5\" stroke-linecap=\"round\"/>\n <path d=\"M 60% 30% Q 62% 28%, 64% 30% T 68% 30% T 72% 30%\" \n fill=\"none\" stroke=\"#4ECDC4\" stroke-width=\"3.5\" stroke-linecap=\"round\"/>\n \n <!-- Спираль -->\n <path d=\"M 5% 45% Q 8% 42%, 10% 45% Q 12% 48%, 10% 50% Q 8% 52%, 5% 50% Q 3% 48%, 5% 45%\" \n fill=\"none\" stroke=\"#9B59B6\" stroke-width=\"3\" stroke-linecap=\"round\"/>\n \n <!-- Зигзаг -->\n <path d=\"M 88% 55% L 92% 50% L 94% 55% L 96% 50% L 98% 55%\" \n fill=\"none\" stroke=\"#E74C3C\" stroke-width=\"3.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n \n <!-- Ромашка -->\n <circle cx=\"25%\" cy=\"70%\" r=\"15\" fill=\"none\" stroke=\"#FFD700\" stroke-width=\"2.5\"/>\n <circle cx=\"25%\" cy=\"70%\" r=\"8\" fill=\"#FFD700\"/>\n <line x1=\"25%\" y1=\"70%\" x2=\"22%\" y2=\"65%\" stroke=\"#FFFFFF\" stroke-width=\"2.5\"/>\n <line x1=\"25%\" y1=\"70%\" x2=\"28%\" y2=\"65%\" stroke=\"#FFFFFF\" stroke-width=\"2.5\"/>\n <line x1=\"25%\" y1=\"70%\" x2=\"22%\" y2=\"75%\" stroke=\"#FFFFFF\" stroke-width=\"2.5\"/>\n <line x1=\"25%\" y1=\"70%\" x2=\"28%\" y2=\"75%\" stroke=\"#FFFFFF\" stroke-width=\"2.5\"/>\n \n <!-- Каляки-маляки (случайные линии) -->\n <path d=\"M 40% 20% Q 42% 22%, 40% 24% T 40% 28%\" \n fill=\"none\" stroke=\"#32CD32\" stroke-width=\"3\" stroke-linecap=\"round\"/>\n <path d=\"M 50% 60% L 53% 57% L 55% 60% L 57% 57%\" \n fill=\"none\" stroke=\"#FF1493\" stroke-width=\"3\" stroke-linecap=\"round\"/>\n \n <!-- Еще волнистые линии -->\n <path d=\"M 35% 85% Q 37% 83%, 39% 85% T 43% 85% T 47% 85%\" \n fill=\"none\" stroke=\"#FF4500\" stroke-width=\"3.5\" stroke-linecap=\"round\"/>\n </svg>\n `;\n\n // Адаптивные стили для контента (без фиксированных размеров)\n const containerStyle: React.CSSProperties = {\n ...styles.gmCenterScreen,\n width: \"100%\",\n height: \"100%\",\n padding: `${padding}px`,\n overflow: \"auto\",\n position: \"relative\",\n boxSizing: \"border-box\",\n background: \"transparent\",\n };\n\n // Условие для отображения логотипа (на desktop и планшетах)\n const shouldShowLogo = !isMobile && showLogo;\n\n // Мемоизированный логотип (рендерится вне условных блоков)\n const MemoizedLogo = useMemo(\n () => {\n // Скрываем логотип на мобильных устройствах в landscape режиме и на малых экранах\n const width = window.innerWidth;\n const height = window.innerHeight;\n if ((isMobile && width > height) || height < 700) {\n return null;\n }\n \n if (!shouldShowLogo) {\n return null;\n }\n \n const logoBaseUrl = logoUrl || (typeof window !== \"undefined\" && window.origin \n ? `${window.origin}/cloud/speakid/games/hangman/logo`\n : \"/cloud/speakid/games/hangman/logo\");\n \n return (\n <div style={{ ...styles.gmLogoFixed, position: \"absolute\", top: 16, left: 16, zIndex: 30 }}>\n <picture>\n <source\n srcSet={`${logoBaseUrl}.svg`}\n type=\"image/svg+xml\"\n />\n <img\n src={`${logoBaseUrl}.png`}\n alt=\"SPEAKID Logo\"\n style={styles.gmLogoImg}\n loading=\"lazy\"\n />\n </picture>\n </div>\n );\n },\n [isMobile, shouldShowLogo, logoUrl]\n );\n\n // Общая структура рендеринга (как в magic-sentence)\n const renderContent = () => {\n // Начальный экран лобби\n if (stage === \"lobby\") {\n return (\n <>\n {MemoizedLogo}\n <div dangerouslySetInnerHTML={{ __html: kidsDoodlesSvg }} />\n <h1 style={{ \n ...styles.gmHeadline1, \n fontSize: `${baseFontSize.headline1}px`, \n marginBottom: `${gap * 3}px`,\n position: \"relative\",\n zIndex: 1,\n }}>\n HANGMAN\n </h1>\n <button\n onClick={() => setStage(\"category\")}\n style={{\n fontFamily: '\"Onest\", system-ui, sans-serif',\n fontWeight: 500, // Medium для более заметности\n fontSize: `${baseFontSize.button}px`,\n padding: `${gap * 1.2}px ${gap * 3}px`,\n borderRadius: `${borderRadius * 1.5}px`,\n position: \"relative\",\n zIndex: 1,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"#ec4c44\",\n color: \"#ffffff\",\n border: \"none\",\n cursor: \"pointer\",\n transition: \"background 0.2s ease, transform 0.1s ease\",\n boxShadow: \"0 2px 8px rgba(236, 76, 68, 0.2)\",\n minWidth: \"120px\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"#d43a32\";\n e.currentTarget.style.transform = \"translateY(-2px)\";\n e.currentTarget.style.boxShadow = \"0 4px 12px rgba(236, 76, 68, 0.3)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"#ec4c44\";\n e.currentTarget.style.transform = \"translateY(0)\";\n e.currentTarget.style.boxShadow = \"0 2px 8px rgba(236, 76, 68, 0.2)\";\n }}\n onMouseDown={(e) => {\n e.currentTarget.style.transform = \"translateY(0)\";\n }}\n >\n <svg\n width={`${baseFontSize.button * 1.3}px`}\n height={`${baseFontSize.button * 1.3}px`}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ display: \"block\", marginRight: `${gap}px` }}\n >\n <path\n d=\"M8 5V19L19 12L8 5Z\"\n fill=\"#ffffff\"\n stroke=\"none\"\n />\n </svg>\n <span style={{ fontWeight: 500 }}>PLAY</span>\n </button>\n <div style={{\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n width: \"100%\",\n height: \"100%\",\n pointerEvents: \"none\",\n zIndex: 0,\n }}>\n <img\n src={`${imagesBaseURL}/sun.png`}\n alt=\"Sun\"\n style={{\n position: \"absolute\",\n left: isMobile ? \"-10%\" : \"5%\",\n top: \"20%\",\n width: \"auto\",\n height: isMobile \n ? `${Math.min(window.innerHeight * 0.33, 200)}px`\n : `${Math.min((containerSize || gameCubeSize || 1000) * 0.33, 300)}px`,\n maxHeight: \"33vh\",\n objectFit: \"contain\",\n opacity: 0.6,\n }}\n />\n <img\n src={`${imagesBaseURL}/character.png`}\n alt=\"Hangman character\"\n style={{\n position: \"absolute\",\n right: isMobile ? \"5%\" : \"10%\",\n bottom: \"10%\",\n width: \"auto\",\n height: isMobile \n ? `${Math.min(window.innerHeight * 0.33, 200)}px`\n : `${Math.min((containerSize || gameCubeSize || 1000) * 0.33, 300)}px`,\n maxHeight: \"33vh\",\n objectFit: \"contain\",\n opacity: 0.6,\n }}\n />\n </div>\n </>\n );\n }\n\n // Экран выбора категории\n if (stage === \"category\") {\n return (\n <>\n {MemoizedLogo}\n <div dangerouslySetInnerHTML={{ __html: kidsDoodlesSvg }} />\n <button\n onClick={() => setStage(\"lobby\")}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = \"#e5e7eb\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"#f9f9f9\";\n }}\n style={{\n ...styles.gmButton,\n ...styles.gmButtonSecondary,\n fontSize: `${baseFontSize.button}px`,\n padding: `${gap}px ${gap * 1.5}px`,\n borderRadius: `${borderRadius}px`,\n position: \"absolute\",\n top: `${padding}px`,\n left: `${padding + 100}px`, // ✅ Смещаем правее логотипа\n zIndex: 10,\n }}\n >\n ←\n </button>\n\n <div style={{ ...styles.gmButtonGroup, gap: `${gap}px`, marginBottom: `${gap * 3}px`, marginTop: `${gap * 4}px`, position: \"relative\", zIndex: 1 }}>\n {Object.keys(categories).map((cat) => {\n // Облачки с border вместо заливки\n return (\n <button\n key={cat}\n onClick={() => {\n setCategory(cat as keyof typeof categories);\n setStage(\"rounds\");\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = \"#f0f0f0\";\n e.currentTarget.style.borderColor = \"#1f2937\";\n e.currentTarget.style.transform = \"scale(1.05)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"transparent\";\n e.currentTarget.style.borderColor = \"#e5e7eb\";\n e.currentTarget.style.transform = \"scale(1)\";\n }}\n style={{\n fontFamily: '\"Onest\", system-ui, sans-serif',\n fontWeight: 500,\n fontSize: `${baseFontSize.button}px`,\n padding: `${gap * 1.2}px ${gap * 2}px`,\n borderRadius: `${borderRadius * 2}px`, // Более округлые для облачков\n margin: `${gap / 2}px`,\n background: \"transparent\",\n border: \"2px solid #e5e7eb\",\n color: \"#1f2937\",\n cursor: \"pointer\",\n transition: \"background-color 0.2s ease, border-color 0.2s ease, transform 0.2s ease\",\n boxShadow: \"none\",\n }}\n >\n {cat}\n </button>\n );\n })}\n </div>\n </>\n );\n }\n\n // Экран выбора количества раундов\n if (stage === \"rounds\") {\n return (\n <>\n {MemoizedLogo}\n <div dangerouslySetInnerHTML={{ __html: kidsDoodlesSvg }} />\n <button\n onClick={() => setStage(\"category\")}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = \"#e5e7eb\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"#f9f9f9\";\n }}\n style={{\n ...styles.gmButton,\n ...styles.gmButtonSecondary,\n fontSize: `${baseFontSize.button}px`,\n padding: `${gap}px ${gap * 1.5}px`,\n borderRadius: `${borderRadius}px`,\n position: \"absolute\",\n top: `${padding}px`,\n left: `${padding + 100}px`, // ✅ Смещаем правее логотипа\n zIndex: 10,\n }}\n >\n ←\n </button>\n\n <h1 style={{ ...styles.gmHeadline1, fontSize: `${baseFontSize.headline1}px`, marginBottom: `${gap * 2}px`, position: \"relative\", zIndex: 1 }}>\n Choose rounds\n </h1>\n\n <div style={{ ...styles.gmButtonGroup, gap: `${gap}px`, marginBottom: `${gap * 3}px`, position: \"relative\", zIndex: 1 }}>\n {[1, 3, 5].map((r) => {\n // Облачки с border вместо заливки\n return (\n <button\n key={r}\n onClick={() => {\n setRounds(r);\n startGame();\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = \"#f0f0f0\";\n e.currentTarget.style.borderColor = \"#1f2937\";\n e.currentTarget.style.transform = \"scale(1.05)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"transparent\";\n e.currentTarget.style.borderColor = \"#e5e7eb\";\n e.currentTarget.style.transform = \"scale(1)\";\n }}\n style={{\n fontFamily: '\"Onest\", system-ui, sans-serif',\n fontWeight: 500,\n fontSize: `${baseFontSize.button}px`,\n padding: `${gap * 1.2}px ${gap * 2}px`,\n borderRadius: `${borderRadius * 2}px`, // Более округлые для облачков\n margin: `${gap / 2}px`,\n background: \"transparent\",\n border: \"2px solid #e5e7eb\",\n color: \"#1f2937\",\n cursor: \"pointer\",\n transition: \"background-color 0.2s ease, border-color 0.2s ease, transform 0.2s ease\",\n boxShadow: \"none\",\n }}\n >\n {r}\n </button>\n );\n })}\n </div>\n </>\n );\n }\n\n // Игровой экран\n if (stage === \"game\") {\n return (\n <>\n {MemoizedLogo}\n <div style={{\n ...styles.gmInfoBox,\n padding: `${gap * 0.8}px`,\n marginBottom: `${gap * 0.5}px`,\n maxWidth: `${(containerSize || gameCubeSize) * 0.9}px`,\n }}>\n <h3 style={{ ...styles.gmHeadline3, fontSize: `${baseFontSize.headline3}px`, marginBottom: `${gap * 0.5}px` }}>\n Category: {category}\n </h3>\n <p style={{ ...styles.gmBodyM, fontSize: `${baseFontSize.bodyM}px`, marginBottom: `0px` }}>\n Round {currentRound} of {rounds}\n </p>\n </div>\n\n {word && (\n <p style={{\n ...styles.gmBodyS,\n fontSize: `${baseFontSize.bodyS}px`,\n marginTop: `${gap * 0.5}px`,\n marginBottom: `${gap}px`,\n }}>\n I am thinking of a word that is <strong>{word.length}</strong> letters long\n </p>\n )}\n\n {/* Визуализация виселицы */}\n <div style={{\n margin: `${gap}px 0`,\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n }}>\n <HangmanDrawing \n mistakes={mistakes} \n maxMistakes={maxMistakes}\n size={isNestHub \n ? Math.max(80, Math.min(110, (containerSize || gameCubeSize) * 0.16))\n : Math.max(100, Math.min(150, (containerSize || gameCubeSize) * 0.2))}\n />\n </div>\n\n <div style={{\n ...styles.gmWordDisplay,\n fontSize: `${Math.max(16, Math.min(24, baseFontSize.wordDisplay * 0.9))}px`,\n margin: `${gap}px 0`,\n letterSpacing: `${gap * 0.8}px`,\n minHeight: `${Math.max(16, Math.min(24, baseFontSize.wordDisplay * 0.9)) * 1.2}px`,\n }}>{masked || \"Loading...\"}</div>\n\n {/* Алфавит - вдохновлено getAvailableLetters */}\n <div style={{\n ...styles.gmInfoBox,\n padding: `${gap}px`,\n marginTop: `${gap}px`,\n marginBottom: `${gap}px`,\n maxWidth: `${(containerSize || gameCubeSize) * 0.95}px`,\n }}>\n <p style={{\n ...styles.gmBodyS,\n fontSize: `${baseFontSize.bodyS}px`,\n marginBottom: `${gap}px`,\n fontWeight: 500, // Medium\n }}>\n Available letters:\n </p>\n <div style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: `${gap / 3}px`,\n justifyContent: \"center\",\n fontSize: `${Math.max(9, Math.min(12, baseFontSize.bodyS * 0.75))}px`,\n fontFamily: '\"Onest\", system-ui, sans-serif',\n }}>\n {availableLetters.map((letter) => (\n <button\n key={letter}\n onClick={() => handleLetterSelect(letter)}\n disabled={roundResult !== null}\n onMouseEnter={(e) => {\n if (roundResult === null) {\n e.currentTarget.style.backgroundColor = \"#e5e7eb\";\n e.currentTarget.style.cursor = \"pointer\";\n }\n }}\n onMouseLeave={(e) => {\n if (roundResult === null) {\n e.currentTarget.style.backgroundColor = \"#f9f9f9\";\n e.currentTarget.style.cursor = \"pointer\";\n }\n }}\n style={{\n padding: `${gap / 4}px ${gap / 3}px`,\n borderRadius: `${borderRadius * 0.5}px`,\n background: \"#f9f9f9\",\n color: \"#1f2937\",\n border: \"1px solid #e5e7eb\",\n minWidth: `${Math.max(gap * 1.5, (containerSize || gameCubeSize) * 0.04)}px`,\n textAlign: \"center\",\n display: \"inline-block\",\n cursor: roundResult === null ? \"pointer\" : \"default\",\n fontFamily: '\"Onest\", system-ui, sans-serif',\n fontSize: `${Math.max(9, Math.min(12, baseFontSize.bodyS * 0.75))}px`,\n transition: \"background-color 0.2s ease\",\n }}\n >\n {letter}\n </button>\n ))}\n </div>\n </div>\n\n {/* Уже угаданные буквы */}\n {guessed.length > 0 && (\n <div style={{\n ...styles.gmGuessedLetters,\n fontSize: `${Math.max(10, Math.min(12, baseFontSize.bodyS * 0.85))}px`,\n marginTop: `${gap * 0.5}px`,\n marginBottom: `2px`,\n }}>\n <span style={{ color: \"#6b7280\" }}>\n Guessed letters: <strong>{guessed.join(\", \")}</strong>\n </span>\n </div>\n )}\n\n {roundResult === \"win\" && (\n <div style={{\n ...styles.gmStatusWin,\n fontSize: `${baseFontSize.bodyL}px`,\n margin: `2px 0`,\n }}>\n 🎉 You won this round!\n </div>\n )}\n\n {roundResult === \"lose\" && (\n <div style={{\n ...styles.gmStatusLose,\n fontSize: `${baseFontSize.bodyL}px`,\n margin: `2px 0`,\n }}>\n The hangman is complete! The word was: <strong>{word}</strong>\n </div>\n )}\n\n {roundResult !== null && currentRound < rounds && (\n <div style={{ marginTop: `2px`, marginBottom: `${gap}px` }}>\n <button\n onClick={nextRound}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = \"#d43a32\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"#ec4c44\";\n }}\n style={{\n ...styles.gmButton,\n fontSize: `${Math.max(11, Math.min(14, baseFontSize.button * 0.85))}px`,\n padding: `${gap * 0.6}px ${gap * 1.2}px`,\n borderRadius: `${borderRadius}px`,\n }}\n >\n NEXT\n </button>\n </div>\n )}\n\n {roundResult !== null && currentRound >= rounds && (\n <div style={{ marginTop: `2px`, marginBottom: `${gap}px` }}>\n <button\n onClick={() => setStage(\"result\")}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = \"#d43a32\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"#ec4c44\";\n }}\n style={{\n ...styles.gmButton,\n fontSize: `${baseFontSize.button}px`,\n padding: `${gap}px ${gap * 1.5}px`,\n borderRadius: `${borderRadius}px`,\n }}\n >\n View Results →\n </button>\n </div>\n )}\n\n {roundResult === null && guessed.length === 0 && (\n <p style={{\n ...styles.gmBodyS,\n fontSize: `${baseFontSize.bodyS}px`,\n marginTop: `${gap}px`,\n marginBottom: `${gap}px`,\n }}>\n Type a letter on your keyboard\n </p>\n )}\n </>\n );\n }\n\n // Экран результатов\n if (stage === \"result\") {\n return (\n <>\n {MemoizedLogo}\n <h1 style={{\n ...styles.gmHeadline1,\n fontSize: `${baseFontSize.headline1}px`,\n marginBottom: `${gap * 2}px`,\n }}>\n 🎊 Game Finished!\n </h1>\n <p style={{\n ...styles.gmBodyL,\n fontSize: `${baseFontSize.bodyL}px`,\n marginBottom: `${gap * 2}px`,\n }}>\n You guessed <strong>{wins}</strong> out of <strong>{rounds}</strong> words correctly.\n </p>\n \n <div style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: `${gap}px`,\n alignItems: \"center\",\n }}>\n <button\n onClick={() => {\n // Сбрасываем состояние и запускаем новую игру с той же категорией и раундами\n if (!category || rounds === 0) {\n setStage(\"lobby\");\n return;\n }\n \n setUsedWords([]);\n const randomWord = pickRandomWord(category as keyof typeof categories, []);\n if (randomWord) {\n setWord(randomWord);\n setUsedWords([randomWord]);\n setGuessed([]);\n setMistakes(0);\n setCurrentRound(1);\n setWins(0);\n setRoundResult(null);\n setStage(\"game\");\n }\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = \"#d43a32\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"#ec4c44\";\n }}\n style={{\n ...styles.gmButton,\n fontSize: `${baseFontSize.button}px`,\n padding: `${gap}px ${gap * 1.5}px`,\n borderRadius: `${borderRadius}px`,\n minWidth: \"200px\",\n }}\n >\n Play again\n </button>\n \n <button\n onClick={() => setStage(\"lobby\")}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = \"#e5e7eb\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"#f9f9f9\";\n }}\n style={{\n ...styles.gmButton,\n ...styles.gmButtonSecondary,\n fontSize: `${baseFontSize.button}px`,\n padding: `${gap}px ${gap * 1.5}px`,\n borderRadius: `${borderRadius}px`,\n minWidth: \"200px\",\n }}\n >\n Exit\n </button>\n </div>\n </>\n );\n }\n\n return null;\n };\n\n // Единый return с трехуровневой структурой (как в magic-sentence)\n return (\n <div\n style={{\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n background: \"transparent\",\n overflow: \"hidden\",\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0\n }}\n >\n <div\n style={{\n width: isMobile ? \"100%\" : (containerSize || gameCubeSize || 1000),\n height: isMobile ? \"100%\" : (containerSize || gameCubeSize || 1000),\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n overflow: \"hidden\",\n borderRadius: isMobile ? 0 : \"20px\",\n background: \"#ffffff\",\n boxShadow: isMobile ? \"none\" : \"0 0 40px rgba(0,0,0,0.1)\",\n margin: isMobile ? \"0 auto\" : \"unset\",\n position: \"relative\", // needed so absolute logo is inside the square\n transform: `scale(${scale})`,\n }}\n >\n <div\n style={{\n transform: \"translateZ(0)\",\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n }}\n >\n <div style={containerStyle}>\n {renderContent()}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n"],"names":["styles","HangmanDrawing","mistakes","maxMistakes","size","svgWidth","svgHeight","strokeWidth","baseX1","baseY","baseX2","poleX","poleY1","poleY2","topX1","topY","topX2","ropeX","ropeY1","ropeY2","headCX","headCY","headR","bodyX","bodyY1","bodyY2","leftArmX1","leftArmY1","leftArmX2","leftArmY2","rightArmX1","rightArmY1","rightArmX2","rightArmY2","leftLegX1","leftLegY1","leftLegX2","leftLegY2","rightLegX1","rightLegY1","rightLegX2","rightLegY2","strokeColor","jsxs","jsx","HangmanLobbyGame","gameCubeSize","screenHeight","screenWidth","logoUrl","showLogo","baseURL","categories","stage","setStage","useState","category","setCategory","difficulty","rounds","setRounds","currentRound","setCurrentRound","word","setWord","guessed","setGuessed","setMistakes","wins","setWins","roundResult","setRoundResult","containerSize","setContainerSize","scale","setScale","usedWords","setUsedWords","imagesBaseURL","isMobile","setIsMobile","isNestHub","setIsNestHub","baseFontSize","useMemo","fontSizeScale","padding","gap","borderRadius","isWordGuessed","secretWord","lettersGuessed","letter","getGuessedWord","getAvailableLetters","pickRandomWord","cat","avoidWords","firstCategory","_a","words","availableWords","w","wordsToChooseFrom","randomIndex","array","randomFloat","startGame","randomWord","handleLetterSelect","useCallback","lowerLetter","prevGuessed","currentWord","m","handleKey","useEffect","masked","isWin","isLose","availableLetters","moveToNextRound","r","prev","newWord","timer","nextRound","resize","width","height","mobile","isSmallHeight","isWideScreen","nestHub","finalSize","kidsDoodlesSvg","containerStyle","shouldShowLogo","MemoizedLogo","logoBaseUrl","renderContent","Fragment","e"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"speakid-hangman.es.js","sources":["../src/styles/style.ts","../src/components/HangmanLobbyGame.tsx"],"sourcesContent":["import { CSSProperties } from \"react\";\n\n// ===== Стили согласно визуальному гайдлайну: Onest, минималистичный, дружелюбный =====\n// Шрифт: Onest (Regular, Medium, SemiBold)\n// Стиль: Плоский, минималистичный, воздушный, без излишеств\n// Цвета: Мягкий контраст, дружелюбная палитра\n\nexport const styles: Record<string, CSSProperties> = {\n gmCenterScreen: {\n position: \"relative\",\n zIndex: 1,\n minHeight: \"100%\",\n width: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n alignItems: \"center\",\n textAlign: \"center\",\n color: \"#1f2937\", // colorTextPrimary\n padding: \"24px 16px\",\n boxSizing: \"border-box\",\n fontFamily: '\"Onest\", system-ui, -apple-system, \"Segoe UI\", Roboto, Arial, sans-serif',\n background: \"transparent\", // Прозрачный по умолчанию, переопределяется в компоненте\n },\n // Desktop: Headline 1 - Onest SemiBold 32px, line-height 110%\n gmHeadline1: {\n fontWeight: 600, // SemiBold\n fontSize: \"clamp(30px, 4vw, 32px)\", // Mobile 30px, Desktop 32px\n lineHeight: \"110%\",\n marginBottom: \"24px\",\n color: \"#1f2937\", // colorTextPrimary\n fontFamily: '\"Onest\", system-ui, sans-serif',\n },\n // Desktop: Headline 2 - Onest Medium 24px, line-height 110%\n gmHeadline2: {\n fontWeight: 500, // Medium\n fontSize: \"24px\",\n lineHeight: \"110%\",\n marginBottom: \"16px\",\n color: \"#1f2937\", // colorTextPrimary\n fontFamily: '\"Onest\", system-ui, sans-serif',\n },\n // Desktop: Headline 3 - Onest Medium 24px, line-height 110%\n // Mobile: Headline 3 - Onest Medium 16px, line-height 110%\n gmHeadline3: {\n fontWeight: 500, // Medium\n fontSize: \"clamp(16px, 2vw, 24px)\", // Mobile 16px, Desktop 24px\n lineHeight: \"110%\",\n marginBottom: \"12px\",\n color: \"#1f2937\", // colorTextPrimary\n fontFamily: '\"Onest\", system-ui, sans-serif',\n },\n // Desktop: Body L - Onest Regular 18px, line-height 120%\n gmBodyL: {\n fontWeight: 400, // Regular\n fontSize: \"18px\",\n lineHeight: \"120%\",\n marginBottom: \"12px\",\n color: \"#1f2937\", // colorTextPrimary\n fontFamily: '\"Onest\", system-ui, sans-serif',\n },\n // Desktop: Body M - Onest Regular 16px, line-height 120%\n // Mobile: Body M - Onest Regular 14px, line-height 120%\n gmBodyM: {\n fontWeight: 400, // Regular\n fontSize: \"clamp(14px, 1.5vw, 16px)\", // Mobile 14px, Desktop 16px\n lineHeight: \"120%\",\n marginBottom: \"8px\",\n color: \"#1f2937\", // colorTextPrimary\n fontFamily: '\"Onest\", system-ui, sans-serif',\n },\n // Desktop: Body S - Onest Regular 14px, line-height 120%\n // Mobile: Body S - Onest Regular 12px, line-height 120%\n gmBodyS: {\n fontWeight: 400, // Regular\n fontSize: \"clamp(12px, 1.5vw, 14px)\", // Mobile 12px, Desktop 14px\n lineHeight: \"120%\",\n color: \"#6b7280\", // colorTextSecondary\n marginBottom: \"8px\",\n fontFamily: '\"Onest\", system-ui, sans-serif',\n },\n // Button: Onest Regular 16px, line-height 100%\n gmButton: {\n fontFamily: '\"Onest\", system-ui, sans-serif',\n fontWeight: 400, // Regular\n fontSize: \"16px\",\n lineHeight: \"100%\",\n padding: \"10px 16px\",\n borderRadius: \"8px\", // Более мягкие углы для минималистичного стиля\n border: \"1px solid #e5e7eb\", // colorSeparator\n background: \"#ec4c44\", // colorAccent (Default)\n color: \"#ffffff\", // colorTextContrast\n cursor: \"pointer\",\n boxShadow: \"none\", // Плоский стиль без теней\n transition: \"background-color 0.2s ease, opacity 0.2s ease, transform 0.1s ease\",\n margin: \"4px\",\n },\n gmButtonActive: {\n background: \"#333\", // colorAccent Active\n color: \"#fff\", // colorTextContrast\n boxShadow: \"none\", // Плоский стиль\n },\n gmButtonSecondary: {\n background: \"#f9f9f9\", // colorBackgroundAccent\n color: \"#1f2937\", // colorTextPrimary\n border: \"1px solid #e5e7eb\", // colorSeparator\n boxShadow: \"none\", // Плоский стиль\n },\n gmButtonGroup: {\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"8px\",\n justifyContent: \"center\",\n marginBottom: \"24px\",\n },\n gmWordDisplay: {\n fontSize: \"clamp(20px, 5vw, 28px)\",\n fontWeight: 500, // Medium\n letterSpacing: \"6px\",\n margin: \"32px 0\",\n color: \"#1f2937\", // colorTextPrimary\n fontFamily: '\"Onest\", system-ui, sans-serif',\n lineHeight: \"120%\",\n },\n gmGuessedLetters: {\n fontSize: \"clamp(12px, 1.5vw, 16px)\", // Body S / Body M\n color: \"#6b7280\", // colorTextSecondary\n marginTop: \"16px\",\n minHeight: \"24px\",\n fontFamily: '\"Onest\", system-ui, sans-serif',\n lineHeight: \"120%\",\n },\n gmStatusWin: {\n color: \"#10b981\", // colorTextPositive / colorIconPositive\n fontWeight: 500, // Medium\n fontSize: \"clamp(14px, 1.5vw, 18px)\", // Body M / Body L\n lineHeight: \"120%\",\n margin: \"16px 0\",\n fontFamily: '\"Onest\", system-ui, sans-serif',\n },\n gmStatusLose: {\n color: \"#ec4c44\", // colorTextNegative / colorIconNegative\n fontWeight: 500, // Medium\n fontSize: \"clamp(14px, 1.5vw, 18px)\", // Body M / Body L\n lineHeight: \"120%\",\n margin: \"16px 0\",\n fontFamily: '\"Onest\", system-ui, sans-serif',\n },\n gmInfoBox: {\n background: \"#f9f9f9\", // colorBackgroundAccent\n border: \"1px solid #e5e7eb\", // colorSeparator\n borderRadius: \"8px\", // Мягкие углы\n padding: \"16px\",\n marginBottom: \"24px\",\n maxWidth: \"500px\",\n width: \"100%\",\n boxShadow: \"none\", // Плоский стиль\n },\n gmSection: {\n marginBottom: \"32px\",\n width: \"100%\",\n maxWidth: \"500px\",\n },\n // ✅ Обновлено только для качества логотипа (размер как в magic-sentence)\n gmLogoFixed: {\n position: \"absolute\",\n top: \"16px\",\n left: \"16px\",\n width: \"auto\",\n zIndex: 10,\n pointerEvents: \"none\",\n background: \"transparent\",\n transform: \"none\",\n willChange: \"auto\",\n },\n gmLogoImg: {\n height: \"28px\",\n width: \"auto\",\n background: \"transparent\",\n objectFit: \"contain\",\n imageRendering: \"auto\",\n transform: \"translateZ(0)\",\n backfaceVisibility: \"hidden\",\n WebkitFontSmoothing: \"antialiased\",\n display: \"block\",\n },\n gmLogoFallback: {\n height: \"28px\",\n width: \"auto\",\n background: \"transparent\",\n color: \"#ec4c44\",\n fontSize: \"16px\",\n fontWeight: 700,\n display: \"block\",\n },\n};\n\n// ===== Цветовая палитра для справки =====\n// colorTextPrimary: #1f2937\n// colorTextSecondary: #6b7280\n// colorTextNegative: #ec4c44\n// colorTextPositive: #10b981\n// colorBackgroundAccent: #f9f9f9\n// colorSeparator: #e5e7eb\n// colorAccent (Default): #ec4c44\n// colorAccent (Active): #333\n\n","import React, { useState, useEffect, useCallback, useMemo } from \"react\";\nimport { styles } from \"../styles/style\";\n\n// Компонент визуализации виселицы\nfunction HangmanDrawing({ \n mistakes, \n maxMistakes, \n size = 200 \n}: { \n mistakes: number; \n maxMistakes: number;\n size?: number;\n}) {\n // Адаптивные размеры SVG\n const svgWidth = size;\n const svgHeight = size * 1.25; // Соотношение 200:250\n const strokeWidth = Math.max(2, size / 100); // Адаптивная толщина линий\n \n // Координаты (пропорциональные исходному размеру 200x250)\n const baseX1 = 10 * (svgWidth / 200);\n const baseY = 240 * (svgHeight / 250);\n const baseX2 = 150 * (svgWidth / 200);\n \n const poleX = 80 * (svgWidth / 200);\n const poleY1 = 20 * (svgHeight / 250);\n const poleY2 = 240 * (svgHeight / 250);\n \n const topX1 = 80 * (svgWidth / 200);\n const topY = 20 * (svgHeight / 250);\n const topX2 = 150 * (svgWidth / 200);\n \n const ropeX = 150 * (svgWidth / 200);\n const ropeY1 = 20 * (svgHeight / 250);\n const ropeY2 = 50 * (svgHeight / 250);\n \n const headCX = 150 * (svgWidth / 200);\n const headCY = 70 * (svgHeight / 250);\n const headR = 20 * (svgWidth / 200);\n \n const bodyX = 150 * (svgWidth / 200);\n const bodyY1 = 90 * (svgHeight / 250);\n const bodyY2 = 150 * (svgHeight / 250);\n \n const leftArmX1 = 150 * (svgWidth / 200);\n const leftArmY1 = 110 * (svgHeight / 250);\n const leftArmX2 = 130 * (svgWidth / 200);\n const leftArmY2 = 130 * (svgHeight / 250);\n \n const rightArmX1 = 150 * (svgWidth / 200);\n const rightArmY1 = 110 * (svgHeight / 250);\n const rightArmX2 = 170 * (svgWidth / 200);\n const rightArmY2 = 130 * (svgHeight / 250);\n \n const leftLegX1 = 150 * (svgWidth / 200);\n const leftLegY1 = 150 * (svgHeight / 250);\n const leftLegX2 = 130 * (svgWidth / 200);\n const leftLegY2 = 190 * (svgHeight / 250);\n \n const rightLegX1 = 150 * (svgWidth / 200);\n const rightLegY1 = 150 * (svgHeight / 250);\n const rightLegX2 = 170 * (svgWidth / 200);\n const rightLegY2 = 190 * (svgHeight / 250);\n\n // Цвет в зависимости от количества ошибок\n const getStrokeColor = () => {\n if (mistakes === 0) return \"#1f2937\"; // colorTextPrimary\n if (mistakes <= maxMistakes * 0.5) return \"#1f2937\"; // Окей\n if (mistakes <= maxMistakes * 0.75) return \"#f59e0b\"; // Предупреждение\n return \"#ec4c44\"; // colorTextNegative - опасно\n };\n\n const strokeColor = getStrokeColor();\n\n return (\n <svg \n width={svgWidth} \n height={svgHeight} \n style={{ \n display: \"block\",\n margin: \"0 auto\",\n }}\n >\n {/* Виселица рисуется пошагово с ошибками */}\n {/* 1-я ошибка: Основание */}\n {mistakes > 0 && (\n <line \n x1={baseX1} \n y1={baseY} \n x2={baseX2} \n y2={baseY} \n stroke={strokeColor} \n strokeWidth={strokeWidth}\n />\n )}\n\n {/* 2-я ошибка: Стойка */}\n {mistakes > 1 && (\n <line \n x1={poleX} \n y1={poleY1} \n x2={poleX} \n y2={poleY2} \n stroke={strokeColor} \n strokeWidth={strokeWidth}\n />\n )}\n\n {/* 3-я ошибка: Верхняя перекладина */}\n {mistakes > 2 && (\n <line \n x1={topX1} \n y1={topY} \n x2={topX2} \n y2={topY} \n stroke={strokeColor} \n strokeWidth={strokeWidth}\n />\n )}\n\n {/* 4-я ошибка: Веревка */}\n {mistakes > 3 && (\n <line \n x1={ropeX} \n y1={ropeY1} \n x2={ropeX} \n y2={ropeY2} \n stroke={strokeColor} \n strokeWidth={strokeWidth}\n />\n )}\n\n {/* 5-я ошибка: Голова */}\n {mistakes > 4 && (\n <circle \n cx={headCX} \n cy={headCY} \n r={headR} \n stroke={strokeColor} \n fill=\"none\" \n strokeWidth={strokeWidth}\n />\n )}\n \n {/* 6-я ошибка: Тело */}\n {mistakes > 5 && (\n <line \n x1={bodyX} \n y1={bodyY1} \n x2={bodyX} \n y2={bodyY2} \n stroke={strokeColor} \n strokeWidth={strokeWidth}\n />\n )}\n \n {/* Дополнительные части (если maxMistakes больше 6) */}\n {mistakes > 6 && (\n <line \n x1={leftArmX1} \n y1={leftArmY1} \n x2={leftArmX2} \n y2={leftArmY2} \n stroke={strokeColor} \n strokeWidth={strokeWidth}\n />\n )}\n \n {mistakes > 7 && (\n <line \n x1={rightArmX1} \n y1={rightArmY1} \n x2={rightArmX2} \n y2={rightArmY2} \n stroke={strokeColor} \n strokeWidth={strokeWidth}\n />\n )}\n \n {mistakes > 8 && (\n <line \n x1={leftLegX1} \n y1={leftLegY1} \n x2={leftLegX2} \n y2={leftLegY2} \n stroke={strokeColor} \n strokeWidth={strokeWidth}\n />\n )}\n \n {mistakes > 9 && (\n <line \n x1={rightLegX1} \n y1={rightLegY1} \n x2={rightLegX2} \n y2={rightLegY2} \n stroke={strokeColor} \n strokeWidth={strokeWidth}\n />\n )}\n </svg>\n );\n}\n\nexport interface HangmanLobbyGameProps {\n gameCubeSize?: number;\n screenHeight?: number;\n screenWidth?: number;\n logoUrl?: string;\n showLogo?: boolean;\n baseURL?: string;\n}\n\nexport default function HangmanLobbyGame({\n gameCubeSize = 400,\n screenHeight = 800,\n screenWidth = 800,\n logoUrl,\n showLogo = true,\n baseURL,\n}: HangmanLobbyGameProps = {}) {\n const categories = {\n Professions: [\"teacher\", \"doctor\", \"nurse\", \"driver\", \"police\", \"firefighter\", \"cook\", \"waiter\", \"farmer\", \"builder\", \"singer\", \"actor\", \"dentist\", \"pilot\", \"vet\", \"artist\", \"cleaner\", \"student\", \"baker\", \"mechanic\"],\n Family: [\"mother\", \"father\", \"sister\", \"brother\", \"grandmother\", \"grandfather\", \"aunt\", \"uncle\", \"cousin\", \"baby\", \"parents\", \"children\", \"wife\", \"husband\", \"son\", \"daughter\", \"family\", \"twins\", \"relatives\"],\n \"Farm animals\": [\"cow\", \"pig\", \"horse\", \"sheep\", \"goat\", \"duck\", \"chicken\", \"rooster\", \"turkey\", \"goose\", \"rabbit\", \"mouse\", \"donkey\", \"bee\", \"hen\", \"lamb\", \"bull\", \"pony\"],\n Food: [\"apple\", \"banana\", \"bread\", \"cheese\", \"milk\", \"egg\", \"rice\", \"soup\", \"fish\", \"meat\", \"potato\", \"carrot\", \"tomato\", \"cucumber\", \"butter\", \"cake\", \"salad\", \"pasta\", \"pizza\", \"juice\"],\n Hobbies: [\"reading\", \"drawing\", \"painting\", \"dancing\", \"singing\", \"cooking\", \"swimming\", \"fishing\", \"running\", \"cycling\", \"skating\", \"writing\", \"camping\", \"photography\", \"hiking\", \"games\"],\n Christmas: [\"tree\", \"present\", \"gift\", \"santa\", \"snow\", \"snowman\", \"bell\", \"star\", \"lights\", \"card\", \"cookies\", \"elf\", \"sleigh\", \"reindeer\", \"candle\", \"stocking\"],\n Halloween: [\"pumpkin\", \"costume\", \"candy\", \"ghost\", \"witch\", \"spider\", \"bat\", \"skeleton\", \"mask\", \"monster\", \"mummy\", \"cat\", \"broom\", \"zombie\", \"trick\", \"treat\", \"candle\", \"night\", \"party\"],\n Sport: [\"football\", \"basketball\", \"tennis\", \"swimming\", \"running\", \"baseball\", \"skiing\", \"skating\", \"volleyball\", \"hockey\", \"golf\", \"boxing\", \"cycling\", \"rugby\", \"karate\", \"yoga\", \"surfing\", \"climbing\", \"dancing\", \"gym\", \"chess\"],\n \"Body parts\": [\"head\", \"hair\", \"eyes\", \"ears\", \"nose\", \"mouth\", \"teeth\", \"tongue\", \"neck\", \"shoulder\", \"arm\", \"hand\", \"finger\", \"leg\", \"knee\", \"foot\", \"toe\", \"back\", \"stomach\", \"heart\", \"legs\", \"nails\", \"chin\", \"beard\"],\n \"School subjects\": [\"math\", \"english\", \"history\", \"geography\", \"art\", \"music\", \"science\", \"biology\", \"chemistry\", \"physics\", \"pe\", \"literature\", \"drama\", \"design\", \"economics\"],\n Animals: [\"cat\", \"dog\", \"rabbit\", \"elephant\", \"lion\", \"tiger\", \"monkey\", \"bear\", \"fox\", \"wolf\", \"giraffe\", \"zebra\", \"crocodile\", \"dolphin\", \"whale\", \"shark\", \"frog\", \"parrot\", \"mouse\", \"penguin\", \"deer\", \"lizard\", \"turtle\", \"snake\"],\n Countries: [\"russia\", \"canada\", \"china\", \"japan\", \"france\", \"germany\", \"italy\", \"spain\", \"brazil\", \"india\", \"australia\", \"america\", \"england\", \"korea\", \"mexico\", \"egypt\", \"turkey\", \"vietnam\", \"norway\", \"finland\", \"thailand\", \"georgia\", \"kazakhstan\"],\n Clothes: [\"shirt\", \"dress\", \"skirt\", \"trousers\", \"jeans\", \"coat\", \"jacket\", \"sweater\", \"socks\", \"shoes\", \"boots\", \"hat\", \"scarf\", \"gloves\", \"shorts\", \"cap\", \"belt\", \"tie\", \"uniform\", \"pants\", \"underwear\"],\n Traveling: [\"ticket\", \"luggage\", \"suitcase\", \"airport\", \"flight\", \"passport\", \"visa\", \"map\", \"guide\", \"hotel\", \"reservation\", \"bus\", \"train\", \"taxi\", \"tourist\", \"sightseeing\", \"backpack\", \"journey\", \"adventure\", \"beach\", \"tour\", \"souvenir\"],\n Environment: [\"tree\", \"forest\", \"air\", \"water\", \"pollution\", \"recycle\", \"nature\", \"clean\", \"waste\", \"plastic\", \"energy\", \"animal\", \"climate\", \"earth\", \"ocean\", \"river\", \"planet\", \"save\", \"green\", \"environment\", \"litter\", \"organic\"],\n Space: [\"planet\", \"star\", \"sun\", \"moon\", \"astronaut\", \"rocket\", \"space\", \"galaxy\", \"universe\", \"telescope\", \"comet\", \"asteroid\", \"orbit\", \"gravity\", \"alien\", \"spaceship\", \"mars\", \"satellite\", \"sky\", \"eclipse\"],\n Devices: [\"computer\", \"laptop\", \"phone\", \"tablet\", \"tv\", \"keyboard\", \"mouse\", \"printer\", \"camera\", \"headphones\", \"charger\", \"screen\", \"watch\", \"microphone\", \"speaker\", \"console\", \"router\", \"battery\", \"cable\", \"remote\"],\n };\n\n const [stage, setStage] = useState<\"lobby\" | \"category\" | \"rounds\" | \"game\" | \"result\">(\"lobby\");\n const [category, setCategory] = useState<keyof typeof categories | \"\">(\"\");\n const [difficulty] = useState<\"Easy\" | \"Normal\" | \"Hard\">(\"Normal\"); // Фиксированная сложность\n const [rounds, setRounds] = useState(0); // 0 означает \"не выбрано\"\n const [currentRound, setCurrentRound] = useState(1);\n const [word, setWord] = useState(\"\");\n const [guessed, setGuessed] = useState<string[]>([]);\n const [mistakes, setMistakes] = useState(0);\n const [wins, setWins] = useState(0);\n const [roundResult, setRoundResult] = useState<\"win\" | \"lose\" | null>(null);\n const [containerSize, setContainerSize] = useState<number | null>(null);\n const [scale, setScale] = useState(1);\n const [usedWords, setUsedWords] = useState<string[]>([]); // Отслеживание использованных слов\n\n const maxMistakes = difficulty === \"Easy\" ? 8 : difficulty === \"Normal\" ? 6 : 4;\n\n // Вычисляем baseURL для изображений\n const imagesBaseURL = baseURL || (typeof window !== \"undefined\" && window.origin \n ? `${window.origin}/cloud/speakid/games/hangman`\n : \"/cloud/speakid/games/hangman\");\n\n // Определение мобильного устройства - используем window напрямую (как в magic-sentence)\n const [isMobile, setIsMobile] = useState(false);\n const [isNestHub, setIsNestHub] = useState(false);\n\n // Адаптивные размеры относительно gameCubeSize согласно визуальному гайдлайну\n // Desktop базовые размеры: Headline 1 - 32px, Headline 2 - 24px, Body M - 16px, Button - 16px\n // Mobile базовые размеры: Headline 1 - 30px, Headline 3 - 16px, Body M - 14px\n const baseFontSize = useMemo(() => {\n const fontSizeScale = (containerSize || gameCubeSize || 1000) / 400; // базовый размер 400px\n return {\n headline1: isMobile \n ? Math.max(24, Math.min(30, 30 * fontSizeScale)) // Mobile: 30px\n : Math.max(28, Math.min(32, 32 * fontSizeScale)), // Desktop: 32px\n headline2: Math.max(20, Math.min(28, 24 * fontSizeScale)), // Desktop: 24px\n headline3: isMobile\n ? Math.max(14, Math.min(18, 16 * fontSizeScale)) // Mobile: 16px\n : Math.max(20, Math.min(26, 24 * fontSizeScale)), // Desktop: 24px\n bodyL: Math.max(14, Math.min(20, 18 * fontSizeScale)), // Desktop: 18px\n bodyM: isMobile\n ? Math.max(12, Math.min(16, 14 * fontSizeScale)) // Mobile: 14px\n : Math.max(14, Math.min(18, 16 * fontSizeScale)), // Desktop: 16px\n bodyS: isMobile\n ? Math.max(10, Math.min(14, 12 * fontSizeScale)) // Mobile: 12px\n : Math.max(12, Math.min(16, 14 * fontSizeScale)), // Desktop: 14px\n wordDisplay: Math.max(18, Math.min(32, 26 * fontSizeScale)), // Адаптивный размер\n button: Math.max(12, Math.min(18, 16 * fontSizeScale)), // Desktop: 16px\n };\n }, [isMobile, containerSize, gameCubeSize]);\n\n // Адаптивные отступы и размеры (минималистичный стиль - мягкие углы)\n // Специальные настройки для Nest Hub (1024x600)\n const padding = useMemo(() => {\n const fontSizeScale = (containerSize || gameCubeSize || 1000) / 400;\n return isNestHub \n ? Math.max(8, Math.min(12, 10 * fontSizeScale))\n : Math.max(12, Math.min(24, 16 * fontSizeScale));\n }, [isNestHub, containerSize, gameCubeSize]);\n const gap = useMemo(() => {\n const fontSizeScale = (containerSize || gameCubeSize || 1000) / 400;\n return isNestHub\n ? Math.max(3, Math.min(6, 5 * fontSizeScale))\n : Math.max(4, Math.min(12, 8 * fontSizeScale));\n }, [isNestHub, containerSize, gameCubeSize]);\n const borderRadius = useMemo(() => {\n const fontSizeScale = (containerSize || gameCubeSize || 1000) / 400;\n return Math.max(6, Math.min(10, 8 * fontSizeScale));\n }, [containerSize, gameCubeSize]); // Мягкие углы для плоского стиля\n\n // Функции вдохновленные открытым кодом Hangman\n const isWordGuessed = (secretWord: string, lettersGuessed: string[]): boolean => {\n // Проверяем, все ли буквы слова угаданы\n return secretWord.split(\"\").every(letter => lettersGuessed.includes(letter));\n };\n\n const getGuessedWord = (secretWord: string, lettersGuessed: string[]): string => {\n // Возвращает строку с угаданными буквами и подчеркиваниями\n return secretWord\n .split(\"\")\n .map(letter => (lettersGuessed.includes(letter) ? letter : \"_\"))\n .join(\" \");\n };\n\n const getAvailableLetters = (lettersGuessed: string[]): string[] => {\n // Возвращает массив доступных букв (не угаданных)\n const alphabet = \"abcdefghijklmnopqrstuvwxyz\".split(\"\");\n return alphabet.filter(letter => !lettersGuessed.includes(letter));\n };\n\n const pickRandomCategory = (): keyof typeof categories => {\n const categoryKeys = Object.keys(categories) as Array<keyof typeof categories>;\n \n // Используем crypto.getRandomValues для более надежной случайности\n let randomIndex: number;\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n const array = new Uint32Array(1);\n crypto.getRandomValues(array);\n randomIndex = array[0] % categoryKeys.length;\n } else {\n // Fallback на Math.random если crypto недоступен\n randomIndex = Math.floor(Math.random() * categoryKeys.length);\n }\n \n return categoryKeys[randomIndex];\n };\n\n const pickRandomWord = (cat: keyof typeof categories, avoidWords: string[] = []): string => {\n if (!cat || !categories[cat]) {\n // Fallback если категория пустая или не существует\n const firstCategory = Object.keys(categories)[0] as keyof typeof categories;\n return categories[firstCategory]?.[0] || \"\";\n }\n \n const words = categories[cat];\n if (!words || words.length === 0) {\n // Fallback если слова пустые\n return \"\";\n }\n \n // Если есть доступные слова (не использованные), выбираем из них\n const availableWords = words.filter(w => !avoidWords.includes(w));\n const wordsToChooseFrom = availableWords.length > 0 ? availableWords : words;\n \n if (wordsToChooseFrom.length === 0) {\n return \"\";\n }\n \n // Используем crypto.getRandomValues для более надежной случайности\n // Преобразуем в дробное число от 0 до 1 для равномерного распределения\n let randomIndex: number;\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n const array = new Uint32Array(1);\n crypto.getRandomValues(array);\n // Преобразуем в дробное число от 0 до 1 для равномерного распределения\n const randomFloat = array[0] / 0xFFFFFFFF;\n randomIndex = Math.floor(randomFloat * wordsToChooseFrom.length);\n } else {\n // Fallback на Math.random если crypto недоступен\n randomIndex = Math.floor(Math.random() * wordsToChooseFrom.length);\n }\n \n return wordsToChooseFrom[randomIndex];\n };\n\n const startGame = () => {\n if (!category) return;\n setUsedWords([]); // Сбрасываем список использованных слов при новой игре\n const randomWord = pickRandomWord(category, []);\n if (!randomWord) {\n // Если не удалось выбрать слово, возвращаемся к выбору категории\n setStage(\"category\");\n return;\n }\n setWord(randomWord);\n setUsedWords([randomWord]); // Запоминаем первое слово\n setGuessed([]);\n setMistakes(0);\n setCurrentRound(1);\n setWins(0);\n setRoundResult(null);\n setStage(\"game\");\n };\n\n // Функция для обработки выбора буквы (используется и для клавиатуры, и для кликов)\n const handleLetterSelect = useCallback((letter: string) => {\n if (stage !== \"game\" || roundResult !== null) return;\n \n const lowerLetter = letter.toLowerCase();\n \n // Проверка: только буквы английского алфавита\n if (!/^[a-z]$/.test(lowerLetter)) return;\n \n // Проверяем, была ли буква уже угадана\n setGuessed((prevGuessed) => {\n if (prevGuessed.includes(lowerLetter)) {\n return prevGuessed;\n }\n \n // Добавляем букву в список угаданных\n return [...prevGuessed, lowerLetter];\n });\n \n // Проверяем, есть ли буква в текущем слове (используем функциональное обновление)\n setWord((currentWord) => {\n if (currentWord && !currentWord.includes(lowerLetter)) {\n setMistakes((m) => m + 1);\n }\n return currentWord;\n });\n }, [stage, roundResult]);\n\n const handleKey = useCallback((e: KeyboardEvent) => {\n handleLetterSelect(e.key);\n }, [handleLetterSelect]);\n\n useEffect(() => {\n if (stage === \"game\") {\n window.addEventListener(\"keydown\", handleKey);\n return () => window.removeEventListener(\"keydown\", handleKey);\n }\n }, [stage, handleKey]);\n\n // Используем функцию из открытого кода\n const masked = word ? getGuessedWord(word, guessed) : \"\";\n const isWin = word ? isWordGuessed(word, guessed) : false;\n // Игра проиграна когда виселица полностью нарисована (10 частей: основание, стойка, перекладина, веревка, голова, тело, левая рука, правая рука, левая нога, правая нога)\n const isLose = mistakes >= 10;\n const availableLetters = getAvailableLetters(guessed);\n\n // Функция для перехода к следующему раунду (вынесена для избежания дублирования)\n const moveToNextRound = useCallback(() => {\n if (!category || currentRound >= rounds) {\n setStage(\"result\");\n return;\n }\n \n setCurrentRound((r) => r + 1);\n setUsedWords((prev) => {\n const newWord = pickRandomWord(category as keyof typeof categories, prev);\n if (newWord) {\n setWord(newWord);\n return [...prev, newWord];\n }\n return prev;\n });\n setGuessed([]);\n setMistakes(0);\n setRoundResult(null);\n }, [category, currentRound, rounds]);\n\n useEffect(() => {\n if (isWin && roundResult === null) {\n setRoundResult(\"win\");\n setWins((w) => w + 1);\n \n const timer = setTimeout(() => {\n moveToNextRound();\n }, 2000);\n \n return () => clearTimeout(timer);\n }\n \n if (isLose && roundResult === null) {\n setRoundResult(\"lose\");\n \n const timer = setTimeout(() => {\n moveToNextRound();\n }, 2000);\n \n return () => clearTimeout(timer);\n }\n }, [isWin, isLose, roundResult, moveToNextRound]);\n\n const nextRound = () => {\n if (!category || currentRound >= rounds) {\n setStage(\"result\");\n return;\n }\n \n setCurrentRound((r) => r + 1);\n setUsedWords((prev) => {\n const newWord = pickRandomWord(category as keyof typeof categories, prev);\n if (newWord) {\n setWord(newWord);\n return [...prev, newWord]; // Добавляем новое слово в список использованных\n }\n return prev;\n });\n setGuessed([]);\n setMistakes(0);\n setRoundResult(null);\n };\n\n // ✅ Адаптив под мобилки, планшеты и десктоп (как в magic-sentence)\n useEffect(() => {\n const resize = () => {\n const width = window.innerWidth;\n const height = window.innerHeight;\n const mobile = width < 768 || (width === 926 && height === 428) || (width === 932 && height === 430);\n const isSmallHeight = height < 700;\n const isWideScreen = width / height > 1.8;\n const nestHub = width === 1024 && height === 600;\n \n setIsMobile(mobile);\n setIsNestHub(nestHub);\n\n // ✅ Адаптивные размеры контейнера\n // Если передан gameCubeSize, используем его (но с ограничениями)\n if (gameCubeSize && gameCubeSize >= 320) {\n const minSize = 320;\n const maxSize = 1200;\n const finalSize = Math.max(minSize, Math.min(maxSize, gameCubeSize));\n setContainerSize(finalSize);\n setScale(1);\n } else if (mobile) {\n setContainerSize(null);\n setScale(1);\n } else if (isSmallHeight) {\n setContainerSize(null);\n setScale(1);\n } else if (isWideScreen) {\n // ✅ Широкие экраны: используем стандартный размер но уменьшаем масштаб\n const minSize = 400;\n const maxSize = 1200;\n const finalSize = Math.min(1000, Math.min(width, height) * 0.9);\n setContainerSize(finalSize);\n setScale(0.85);\n } else {\n const minSize = 400;\n const maxSize = 1200;\n const finalSize = Math.min(1000, Math.min(width, height) * 0.9);\n setContainerSize(finalSize);\n setScale(1);\n }\n };\n resize();\n window.addEventListener(\"resize\", resize);\n return () => window.removeEventListener(\"resize\", resize);\n }, [gameCubeSize]);\n\n // SVG с детскими каракулями для фона (более резкие и яркие)\n const kidsDoodlesSvg = `\n <svg width=\"100%\" height=\"100%\" xmlns=\"http://www.w3.org/2000/svg\" style=\"position: absolute; top: 0; left: 0; pointer-events: none; opacity: 0.2;\">\n <!-- Каракули мелками и фломастерами -->\n \n <!-- Сердечко -->\n <path d=\"M 85% 15% Q 85% 10%, 90% 10% Q 95% 10%, 95% 15% Q 95% 20%, 90% 25% Q 85% 30%, 85% 15%\" \n fill=\"none\" stroke=\"#FF69B4\" stroke-width=\"3\" stroke-linecap=\"round\"/>\n \n <!-- Звезда -->\n <path d=\"M 10% 85% L 12% 80% L 14% 85% L 18% 85% L 13% 88% L 15% 92% L 10% 89% L 5% 92% L 7% 88% L 2% 85% Z\" \n fill=\"#FFA500\" stroke=\"#FF8C00\" stroke-width=\"1.5\"/>\n \n <!-- Волнистые линии (мелки) -->\n <path d=\"M 20% 25% Q 22% 23%, 24% 25% T 28% 25% T 32% 25%\" \n fill=\"none\" stroke=\"#FF6B6B\" stroke-width=\"3.5\" stroke-linecap=\"round\"/>\n <path d=\"M 60% 30% Q 62% 28%, 64% 30% T 68% 30% T 72% 30%\" \n fill=\"none\" stroke=\"#4ECDC4\" stroke-width=\"3.5\" stroke-linecap=\"round\"/>\n \n <!-- Спираль -->\n <path d=\"M 5% 45% Q 8% 42%, 10% 45% Q 12% 48%, 10% 50% Q 8% 52%, 5% 50% Q 3% 48%, 5% 45%\" \n fill=\"none\" stroke=\"#9B59B6\" stroke-width=\"3\" stroke-linecap=\"round\"/>\n \n <!-- Зигзаг -->\n <path d=\"M 88% 55% L 92% 50% L 94% 55% L 96% 50% L 98% 55%\" \n fill=\"none\" stroke=\"#E74C3C\" stroke-width=\"3.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n \n <!-- Ромашка -->\n <circle cx=\"25%\" cy=\"70%\" r=\"15\" fill=\"none\" stroke=\"#FFD700\" stroke-width=\"2.5\"/>\n <circle cx=\"25%\" cy=\"70%\" r=\"8\" fill=\"#FFD700\"/>\n <line x1=\"25%\" y1=\"70%\" x2=\"22%\" y2=\"65%\" stroke=\"#FFFFFF\" stroke-width=\"2.5\"/>\n <line x1=\"25%\" y1=\"70%\" x2=\"28%\" y2=\"65%\" stroke=\"#FFFFFF\" stroke-width=\"2.5\"/>\n <line x1=\"25%\" y1=\"70%\" x2=\"22%\" y2=\"75%\" stroke=\"#FFFFFF\" stroke-width=\"2.5\"/>\n <line x1=\"25%\" y1=\"70%\" x2=\"28%\" y2=\"75%\" stroke=\"#FFFFFF\" stroke-width=\"2.5\"/>\n \n <!-- Каляки-маляки (случайные линии) -->\n <path d=\"M 40% 20% Q 42% 22%, 40% 24% T 40% 28%\" \n fill=\"none\" stroke=\"#32CD32\" stroke-width=\"3\" stroke-linecap=\"round\"/>\n <path d=\"M 50% 60% L 53% 57% L 55% 60% L 57% 57%\" \n fill=\"none\" stroke=\"#FF1493\" stroke-width=\"3\" stroke-linecap=\"round\"/>\n \n <!-- Еще волнистые линии -->\n <path d=\"M 35% 85% Q 37% 83%, 39% 85% T 43% 85% T 47% 85%\" \n fill=\"none\" stroke=\"#FF4500\" stroke-width=\"3.5\" stroke-linecap=\"round\"/>\n </svg>\n `;\n\n // Адаптивные стили для контента (без фиксированных размеров)\n const containerStyle: React.CSSProperties = {\n ...styles.gmCenterScreen,\n width: \"100%\",\n height: \"100%\",\n padding: `${padding}px`,\n overflow: \"auto\",\n position: \"relative\",\n boxSizing: \"border-box\",\n background: \"transparent\",\n };\n\n // Условие для отображения логотипа (на desktop и планшетах)\n const shouldShowLogo = !isMobile && showLogo;\n\n // Мемоизированный логотип (рендерится вне условных блоков)\n const MemoizedLogo = useMemo(\n () => {\n // Скрываем логотип на мобильных устройствах в landscape режиме и на малых экранах\n const width = window.innerWidth;\n const height = window.innerHeight;\n if ((isMobile && width > height) || height < 700) {\n return null;\n }\n \n if (!shouldShowLogo) {\n return null;\n }\n \n const logoBaseUrl = logoUrl || (typeof window !== \"undefined\" && window.origin \n ? `${window.origin}/cloud/speakid/games/hangman/logo`\n : \"/cloud/speakid/games/hangman/logo\");\n \n return (\n <div style={{ ...styles.gmLogoFixed, position: \"absolute\", top: 16, left: 16, zIndex: 30 }}>\n <picture>\n <source\n srcSet={`${logoBaseUrl}.svg`}\n type=\"image/svg+xml\"\n />\n <img\n src={`${logoBaseUrl}.png`}\n alt=\"SPEAKID Logo\"\n style={styles.gmLogoImg}\n loading=\"lazy\"\n />\n </picture>\n </div>\n );\n },\n [isMobile, shouldShowLogo, logoUrl]\n );\n\n // Общая структура рендеринга (как в magic-sentence)\n const renderContent = () => {\n // Начальный экран лобби\n if (stage === \"lobby\") {\n return (\n <>\n {MemoizedLogo}\n <div dangerouslySetInnerHTML={{ __html: kidsDoodlesSvg }} />\n <h1 style={{ \n ...styles.gmHeadline1, \n fontSize: `${baseFontSize.headline1}px`, \n marginBottom: `${gap * 3}px`,\n position: \"relative\",\n zIndex: 1,\n }}>\n HANGMAN\n </h1>\n <button\n onClick={() => setStage(\"category\")}\n style={{\n fontFamily: '\"Onest\", system-ui, sans-serif',\n fontWeight: 500, // Medium для более заметности\n fontSize: `${baseFontSize.button}px`,\n padding: `${gap * 1.2}px ${gap * 3}px`,\n borderRadius: `${borderRadius * 1.5}px`,\n position: \"relative\",\n zIndex: 1,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"#ec4c44\",\n color: \"#ffffff\",\n border: \"none\",\n cursor: \"pointer\",\n transition: \"background 0.2s ease, transform 0.1s ease\",\n boxShadow: \"0 2px 8px rgba(236, 76, 68, 0.2)\",\n minWidth: \"120px\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"#d43a32\";\n e.currentTarget.style.transform = \"translateY(-2px)\";\n e.currentTarget.style.boxShadow = \"0 4px 12px rgba(236, 76, 68, 0.3)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"#ec4c44\";\n e.currentTarget.style.transform = \"translateY(0)\";\n e.currentTarget.style.boxShadow = \"0 2px 8px rgba(236, 76, 68, 0.2)\";\n }}\n onMouseDown={(e) => {\n e.currentTarget.style.transform = \"translateY(0)\";\n }}\n >\n <svg\n width={`${baseFontSize.button * 1.3}px`}\n height={`${baseFontSize.button * 1.3}px`}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ display: \"block\", marginRight: `${gap}px` }}\n >\n <path\n d=\"M8 5V19L19 12L8 5Z\"\n fill=\"#ffffff\"\n stroke=\"none\"\n />\n </svg>\n <span style={{ fontWeight: 500 }}>PLAY</span>\n </button>\n <div style={{\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n width: \"100%\",\n height: \"100%\",\n pointerEvents: \"none\",\n zIndex: 0,\n }}>\n <img\n src={`${imagesBaseURL}/sun.png`}\n alt=\"Sun\"\n style={{\n position: \"absolute\",\n left: isMobile ? \"-10%\" : \"5%\",\n top: \"20%\",\n width: \"auto\",\n height: isMobile \n ? `${Math.min(window.innerHeight * 0.33, 200)}px`\n : `${Math.min((containerSize || gameCubeSize || 1000) * 0.33, 300)}px`,\n maxHeight: \"33vh\",\n objectFit: \"contain\",\n opacity: 0.6,\n }}\n />\n <img\n src={`${imagesBaseURL}/character.png`}\n alt=\"Hangman character\"\n style={{\n position: \"absolute\",\n right: isMobile ? \"5%\" : \"10%\",\n bottom: \"10%\",\n width: \"auto\",\n height: isMobile \n ? `${Math.min(window.innerHeight * 0.33, 200)}px`\n : `${Math.min((containerSize || gameCubeSize || 1000) * 0.33, 300)}px`,\n maxHeight: \"33vh\",\n objectFit: \"contain\",\n opacity: 0.6,\n }}\n />\n </div>\n </>\n );\n }\n\n // Экран выбора категории\n if (stage === \"category\") {\n return (\n <>\n {MemoizedLogo}\n <div dangerouslySetInnerHTML={{ __html: kidsDoodlesSvg }} />\n <button\n onClick={() => setStage(\"lobby\")}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = \"#e5e7eb\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"#f9f9f9\";\n }}\n style={{\n ...styles.gmButton,\n ...styles.gmButtonSecondary,\n fontSize: `${baseFontSize.button}px`,\n padding: `${gap}px ${gap * 1.5}px`,\n borderRadius: `${borderRadius}px`,\n position: \"absolute\",\n top: `${padding}px`,\n left: \"160px\", // ✅ Фиксированное смещение правее логотипа (16px + ~120px логотип + 24px отступ)\n zIndex: 10,\n }}\n >\n ←\n </button>\n\n <div style={{ ...styles.gmButtonGroup, gap: `${gap}px`, marginBottom: `${gap * 3}px`, marginTop: `${gap * 4}px`, position: \"relative\", zIndex: 1 }}>\n {Object.keys(categories).map((cat) => {\n // Облачки с border вместо заливки\n return (\n <button\n key={cat}\n onClick={() => {\n setCategory(cat as keyof typeof categories);\n setStage(\"rounds\");\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = \"#f0f0f0\";\n e.currentTarget.style.borderColor = \"#1f2937\";\n e.currentTarget.style.transform = \"scale(1.05)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"transparent\";\n e.currentTarget.style.borderColor = \"#e5e7eb\";\n e.currentTarget.style.transform = \"scale(1)\";\n }}\n style={{\n fontFamily: '\"Onest\", system-ui, sans-serif',\n fontWeight: 500,\n fontSize: `${baseFontSize.button}px`,\n padding: `${gap * 1.2}px ${gap * 2}px`,\n borderRadius: `${borderRadius * 2}px`, // Более округлые для облачков\n margin: `${gap / 2}px`,\n background: \"transparent\",\n border: \"2px solid #e5e7eb\",\n color: \"#1f2937\",\n cursor: \"pointer\",\n transition: \"background-color 0.2s ease, border-color 0.2s ease, transform 0.2s ease\",\n boxShadow: \"none\",\n }}\n >\n {cat}\n </button>\n );\n })}\n </div>\n </>\n );\n }\n\n // Экран выбора количества раундов\n if (stage === \"rounds\") {\n return (\n <>\n {MemoizedLogo}\n <div dangerouslySetInnerHTML={{ __html: kidsDoodlesSvg }} />\n <button\n onClick={() => setStage(\"category\")}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = \"#e5e7eb\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"#f9f9f9\";\n }}\n style={{\n ...styles.gmButton,\n ...styles.gmButtonSecondary,\n fontSize: `${baseFontSize.button}px`,\n padding: `${gap}px ${gap * 1.5}px`,\n borderRadius: `${borderRadius}px`,\n position: \"absolute\",\n top: `${padding}px`,\n left: \"160px\", // ✅ Фиксированное смещение правее логотипа (16px + ~120px логотип + 24px отступ)\n zIndex: 10,\n }}\n >\n ←\n </button>\n\n <h1 style={{ ...styles.gmHeadline1, fontSize: `${baseFontSize.headline1}px`, marginBottom: `${gap * 2}px`, position: \"relative\", zIndex: 1 }}>\n Choose rounds\n </h1>\n\n <div style={{ ...styles.gmButtonGroup, gap: `${gap}px`, marginBottom: `${gap * 3}px`, position: \"relative\", zIndex: 1 }}>\n {[1, 3, 5].map((r) => {\n // Облачки с border вместо заливки\n return (\n <button\n key={r}\n onClick={() => {\n setRounds(r);\n startGame();\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = \"#f0f0f0\";\n e.currentTarget.style.borderColor = \"#1f2937\";\n e.currentTarget.style.transform = \"scale(1.05)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"transparent\";\n e.currentTarget.style.borderColor = \"#e5e7eb\";\n e.currentTarget.style.transform = \"scale(1)\";\n }}\n style={{\n fontFamily: '\"Onest\", system-ui, sans-serif',\n fontWeight: 500,\n fontSize: `${baseFontSize.button}px`,\n padding: `${gap * 1.2}px ${gap * 2}px`,\n borderRadius: `${borderRadius * 2}px`, // Более округлые для облачков\n margin: `${gap / 2}px`,\n background: \"transparent\",\n border: \"2px solid #e5e7eb\",\n color: \"#1f2937\",\n cursor: \"pointer\",\n transition: \"background-color 0.2s ease, border-color 0.2s ease, transform 0.2s ease\",\n boxShadow: \"none\",\n }}\n >\n {r}\n </button>\n );\n })}\n </div>\n </>\n );\n }\n\n // Игровой экран\n if (stage === \"game\") {\n return (\n <>\n {MemoizedLogo}\n <div style={{\n ...styles.gmInfoBox,\n padding: `${gap * 0.8}px`,\n marginBottom: `${gap * 0.5}px`,\n maxWidth: `${(containerSize || gameCubeSize) * 0.9}px`,\n }}>\n <h3 style={{ ...styles.gmHeadline3, fontSize: `${baseFontSize.headline3}px`, marginBottom: `${gap * 0.5}px` }}>\n Category: {category}\n </h3>\n <p style={{ ...styles.gmBodyM, fontSize: `${baseFontSize.bodyM}px`, marginBottom: `0px` }}>\n Round {currentRound} of {rounds}\n </p>\n </div>\n\n {word && (\n <p style={{\n ...styles.gmBodyS,\n fontSize: `${baseFontSize.bodyS}px`,\n marginTop: `${gap * 0.5}px`,\n marginBottom: `${gap}px`,\n }}>\n I am thinking of a word that is <strong>{word.length}</strong> letters long\n </p>\n )}\n\n {/* Визуализация виселицы */}\n <div style={{\n margin: `${gap}px 0`,\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n }}>\n <HangmanDrawing \n mistakes={mistakes} \n maxMistakes={maxMistakes}\n size={isNestHub \n ? Math.max(80, Math.min(110, (containerSize || gameCubeSize) * 0.16))\n : Math.max(100, Math.min(150, (containerSize || gameCubeSize) * 0.2))}\n />\n </div>\n\n <div style={{\n ...styles.gmWordDisplay,\n fontSize: `${Math.max(16, Math.min(24, baseFontSize.wordDisplay * 0.9))}px`,\n margin: `${gap}px 0`,\n letterSpacing: `${gap * 0.8}px`,\n minHeight: `${Math.max(16, Math.min(24, baseFontSize.wordDisplay * 0.9)) * 1.2}px`,\n }}>{masked || \"Loading...\"}</div>\n\n {/* Алфавит - вдохновлено getAvailableLetters */}\n <div style={{\n ...styles.gmInfoBox,\n padding: `${gap}px`,\n marginTop: `${gap}px`,\n marginBottom: `${gap}px`,\n maxWidth: `${(containerSize || gameCubeSize) * 0.95}px`,\n }}>\n <p style={{\n ...styles.gmBodyS,\n fontSize: `${baseFontSize.bodyS}px`,\n marginBottom: `${gap}px`,\n fontWeight: 500, // Medium\n }}>\n Available letters:\n </p>\n <div style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: `${gap / 3}px`,\n justifyContent: \"center\",\n fontSize: `${Math.max(9, Math.min(12, baseFontSize.bodyS * 0.75))}px`,\n fontFamily: '\"Onest\", system-ui, sans-serif',\n }}>\n {availableLetters.map((letter) => (\n <button\n key={letter}\n onClick={() => handleLetterSelect(letter)}\n disabled={roundResult !== null}\n onMouseEnter={(e) => {\n if (roundResult === null) {\n e.currentTarget.style.backgroundColor = \"#e5e7eb\";\n e.currentTarget.style.cursor = \"pointer\";\n }\n }}\n onMouseLeave={(e) => {\n if (roundResult === null) {\n e.currentTarget.style.backgroundColor = \"#f9f9f9\";\n e.currentTarget.style.cursor = \"pointer\";\n }\n }}\n style={{\n padding: `${gap / 4}px ${gap / 3}px`,\n borderRadius: `${borderRadius * 0.5}px`,\n background: \"#f9f9f9\",\n color: \"#1f2937\",\n border: \"1px solid #e5e7eb\",\n minWidth: `${Math.max(gap * 1.5, (containerSize || gameCubeSize) * 0.04)}px`,\n textAlign: \"center\",\n display: \"inline-block\",\n cursor: roundResult === null ? \"pointer\" : \"default\",\n fontFamily: '\"Onest\", system-ui, sans-serif',\n fontSize: `${Math.max(9, Math.min(12, baseFontSize.bodyS * 0.75))}px`,\n transition: \"background-color 0.2s ease\",\n }}\n >\n {letter}\n </button>\n ))}\n </div>\n </div>\n\n {/* Уже угаданные буквы */}\n {guessed.length > 0 && (\n <div style={{\n ...styles.gmGuessedLetters,\n fontSize: `${Math.max(10, Math.min(12, baseFontSize.bodyS * 0.85))}px`,\n marginTop: `${gap * 0.5}px`,\n marginBottom: `2px`,\n }}>\n <span style={{ color: \"#6b7280\" }}>\n Guessed letters: <strong>{guessed.join(\", \")}</strong>\n </span>\n </div>\n )}\n\n {roundResult === \"win\" && (\n <div style={{\n ...styles.gmStatusWin,\n fontSize: `${baseFontSize.bodyL}px`,\n margin: `2px 0`,\n }}>\n 🎉 You won this round!\n </div>\n )}\n\n {roundResult === \"lose\" && (\n <div style={{\n ...styles.gmStatusLose,\n fontSize: `${baseFontSize.bodyL}px`,\n margin: `2px 0`,\n }}>\n The hangman is complete! The word was: <strong>{word}</strong>\n </div>\n )}\n\n {roundResult !== null && currentRound < rounds && (\n <div style={{ marginTop: `2px`, marginBottom: `${gap}px` }}>\n <button\n onClick={nextRound}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = \"#d43a32\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"#ec4c44\";\n }}\n style={{\n ...styles.gmButton,\n fontSize: `${Math.max(11, Math.min(14, baseFontSize.button * 0.85))}px`,\n padding: `${gap * 0.6}px ${gap * 1.2}px`,\n borderRadius: `${borderRadius}px`,\n }}\n >\n NEXT\n </button>\n </div>\n )}\n\n {roundResult !== null && currentRound >= rounds && (\n <div style={{ marginTop: `2px`, marginBottom: `${gap}px` }}>\n <button\n onClick={() => setStage(\"result\")}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = \"#d43a32\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"#ec4c44\";\n }}\n style={{\n ...styles.gmButton,\n fontSize: `${baseFontSize.button}px`,\n padding: `${gap}px ${gap * 1.5}px`,\n borderRadius: `${borderRadius}px`,\n }}\n >\n View Results →\n </button>\n </div>\n )}\n\n {roundResult === null && guessed.length === 0 && (\n <p style={{\n ...styles.gmBodyS,\n fontSize: `${baseFontSize.bodyS}px`,\n marginTop: `${gap}px`,\n marginBottom: `${gap}px`,\n }}>\n Type a letter on your keyboard\n </p>\n )}\n </>\n );\n }\n\n // Экран результатов\n if (stage === \"result\") {\n return (\n <>\n {MemoizedLogo}\n <h1 style={{\n ...styles.gmHeadline1,\n fontSize: `${baseFontSize.headline1}px`,\n marginBottom: `${gap * 2}px`,\n }}>\n 🎊 Game Finished!\n </h1>\n <p style={{\n ...styles.gmBodyL,\n fontSize: `${baseFontSize.bodyL}px`,\n marginBottom: `${gap * 2}px`,\n }}>\n You guessed <strong>{wins}</strong> out of <strong>{rounds}</strong> words correctly.\n </p>\n \n <div style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: `${gap}px`,\n alignItems: \"center\",\n }}>\n <button\n onClick={() => {\n // Сбрасываем состояние и запускаем новую игру с той же категорией и раундами\n if (!category || rounds === 0) {\n setStage(\"lobby\");\n return;\n }\n \n setUsedWords([]);\n const randomWord = pickRandomWord(category as keyof typeof categories, []);\n if (randomWord) {\n setWord(randomWord);\n setUsedWords([randomWord]);\n setGuessed([]);\n setMistakes(0);\n setCurrentRound(1);\n setWins(0);\n setRoundResult(null);\n setStage(\"game\");\n }\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = \"#d43a32\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"#ec4c44\";\n }}\n style={{\n ...styles.gmButton,\n fontSize: `${baseFontSize.button}px`,\n padding: `${gap}px ${gap * 1.5}px`,\n borderRadius: `${borderRadius}px`,\n minWidth: \"200px\",\n }}\n >\n Play again\n </button>\n \n <button\n onClick={() => setStage(\"lobby\")}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = \"#e5e7eb\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"#f9f9f9\";\n }}\n style={{\n ...styles.gmButton,\n ...styles.gmButtonSecondary,\n fontSize: `${baseFontSize.button}px`,\n padding: `${gap}px ${gap * 1.5}px`,\n borderRadius: `${borderRadius}px`,\n minWidth: \"200px\",\n }}\n >\n Exit\n </button>\n </div>\n </>\n );\n }\n\n return null;\n };\n\n // Единый return с трехуровневой структурой (как в magic-sentence)\n return (\n <div\n style={{\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n background: \"transparent\",\n overflow: \"hidden\",\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0\n }}\n >\n <div\n style={{\n width: isMobile ? \"100%\" : (containerSize || gameCubeSize || 1000),\n height: isMobile ? \"100%\" : (containerSize || gameCubeSize || 1000),\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n overflow: \"hidden\",\n borderRadius: isMobile ? 0 : \"20px\",\n background: \"#ffffff\",\n boxShadow: isMobile ? \"none\" : \"0 0 40px rgba(0,0,0,0.1)\",\n margin: isMobile ? \"0 auto\" : \"unset\",\n position: \"relative\", // needed so absolute logo is inside the square\n transform: `scale(${scale})`,\n }}\n >\n <div\n style={{\n transform: \"translateZ(0)\",\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n }}\n >\n <div style={containerStyle}>\n {renderContent()}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n"],"names":["styles","HangmanDrawing","mistakes","maxMistakes","size","svgWidth","svgHeight","strokeWidth","baseX1","baseY","baseX2","poleX","poleY1","poleY2","topX1","topY","topX2","ropeX","ropeY1","ropeY2","headCX","headCY","headR","bodyX","bodyY1","bodyY2","leftArmX1","leftArmY1","leftArmX2","leftArmY2","rightArmX1","rightArmY1","rightArmX2","rightArmY2","leftLegX1","leftLegY1","leftLegX2","leftLegY2","rightLegX1","rightLegY1","rightLegX2","rightLegY2","strokeColor","jsxs","jsx","HangmanLobbyGame","gameCubeSize","screenHeight","screenWidth","logoUrl","showLogo","baseURL","categories","stage","setStage","useState","category","setCategory","difficulty","rounds","setRounds","currentRound","setCurrentRound","word","setWord","guessed","setGuessed","setMistakes","wins","setWins","roundResult","setRoundResult","containerSize","setContainerSize","scale","setScale","usedWords","setUsedWords","imagesBaseURL","isMobile","setIsMobile","isNestHub","setIsNestHub","baseFontSize","useMemo","fontSizeScale","padding","gap","borderRadius","isWordGuessed","secretWord","lettersGuessed","letter","getGuessedWord","getAvailableLetters","pickRandomWord","cat","avoidWords","firstCategory","_a","words","availableWords","w","wordsToChooseFrom","randomIndex","array","randomFloat","startGame","randomWord","handleLetterSelect","useCallback","lowerLetter","prevGuessed","currentWord","m","handleKey","useEffect","masked","isWin","isLose","availableLetters","moveToNextRound","r","prev","newWord","timer","nextRound","resize","width","height","mobile","isSmallHeight","isWideScreen","nestHub","finalSize","kidsDoodlesSvg","containerStyle","shouldShowLogo","MemoizedLogo","logoBaseUrl","renderContent","Fragment","e"],"mappings":"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"}
|
package/package.json
CHANGED