speakid-hangman 1.0.8 → 1.0.11
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: \"24px\", // ✅ Увеличен отступ сверху для большего пространства\n left: \"24px\", // ✅ Увеличен отступ слева для большего пространства\n width: \"auto\",\n zIndex: 30, // ✅ Унифицирован zIndex для консистентности\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(3, size / 100); // ✅ Увеличена минимальная толщина с 2 до 3 для лучшей видимости на маленьких экранах\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 viewBox=\"0 0 200 250\" // ✅ Добавлен viewBox для правильного масштабирования на iOS Safari\n style={{ \n display: \"block\",\n margin: \"0 auto\",\n overflow: \"visible\", // ✅ Для корректного отображения линий\n WebkitFontSmoothing: \"antialiased\", // ✅ Для лучшего рендеринга на iOS\n transform: \"translateZ(0)\", // ✅ Включение аппаратного ускорения на iOS\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 const [isLandscape, setIsLandscape] = useState(false); // ✅ Landscape режим на мобильных\n const [isMediumScreen, setIsMediumScreen] = useState(false); // ✅ Для разрешений 1200-1400 (включая 1366x768)\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 const landscapeScale = isLandscape ? 0.8 : 1; // ✅ Уменьшаем на 20% в landscape\n const mediumScreenScale = isMediumScreen ? 0.9 : 1; // ✅ Уменьшаем на 10% для medium screens (1200-1400px)\n const combinedScale = landscapeScale * mediumScreenScale;\n return {\n headline1: isMobile \n ? Math.max(24, Math.min(30, 30 * fontSizeScale * combinedScale)) // Mobile: 30px\n : Math.max(28, Math.min(32, 32 * fontSizeScale * mediumScreenScale)), // Desktop: 32px\n headline2: Math.max(20, Math.min(28, 24 * fontSizeScale * combinedScale)), // Desktop: 24px\n headline3: isMobile\n ? Math.max(14, Math.min(18, 16 * fontSizeScale * combinedScale)) // Mobile: 16px\n : Math.max(20, Math.min(26, 24 * fontSizeScale * combinedScale)), // Desktop: 24px\n bodyL: Math.max(14, Math.min(20, 18 * fontSizeScale * combinedScale)), // Desktop: 18px\n bodyM: isMobile\n ? Math.max(12, Math.min(16, 14 * fontSizeScale * combinedScale)) // Mobile: 14px\n : Math.max(14, Math.min(18, 16 * fontSizeScale * combinedScale)), // Desktop: 16px\n bodyS: isMobile\n ? Math.max(10, Math.min(14, 12 * fontSizeScale * combinedScale)) // Mobile: 12px\n : Math.max(12, Math.min(16, 14 * fontSizeScale * combinedScale)), // Desktop: 14px\n wordDisplay: Math.max(18, Math.min(32, 26 * fontSizeScale * combinedScale)), // Адаптивный размер\n button: Math.max(12, Math.min(18, 16 * fontSizeScale * combinedScale)), // Desktop: 16px\n };\n }, [isMobile, containerSize, gameCubeSize, isLandscape, isMediumScreen]);\n\n // Адаптивные отступы и размеры (минималистичный стиль - мягкие углы)\n // Специальные настройки для Nest Hub (1024x600) и landscape режима\n const padding = useMemo(() => {\n const fontSizeScale = (containerSize || gameCubeSize || 1000) / 400;\n const landscapeScale = isLandscape ? 0.65 : 1; // ✅ Уменьшаем на 35% в landscape\n const mediumScreenScale = isMediumScreen ? 0.85 : 1; // ✅ Уменьшаем на 15% для medium screens (1200-1400px)\n if (isNestHub) {\n return Math.max(8, Math.min(12, 10 * fontSizeScale));\n }\n const basePadding = Math.max(12, Math.min(24, 16 * fontSizeScale));\n return basePadding * landscapeScale * mediumScreenScale;\n }, [isNestHub, containerSize, gameCubeSize, isLandscape, isMediumScreen]);\n const gap = useMemo(() => {\n const fontSizeScale = (containerSize || gameCubeSize || 1000) / 400;\n const landscapeScale = isLandscape ? 0.65 : 1; // ✅ Уменьшаем на 35% в landscape\n const mediumScreenScale = isMediumScreen ? 0.85 : 1; // ✅ Уменьшаем на 15% для medium screens (1200-1400px)\n if (isNestHub) {\n return Math.max(3, Math.min(6, 5 * fontSizeScale));\n }\n const baseGap = Math.max(4, Math.min(12, 8 * fontSizeScale));\n return baseGap * landscapeScale * mediumScreenScale;\n }, [isNestHub, containerSize, gameCubeSize, isLandscape, isMediumScreen]);\n const borderRadius = useMemo(() => {\n const fontSizeScale = (containerSize || gameCubeSize || 1000) / 400;\n const mediumScreenScale = isMediumScreen ? 0.9 : 1; // ✅ Уменьшаем на 10% для medium screens (1200-1400px)\n return Math.max(6, Math.min(10, 8 * fontSizeScale * mediumScreenScale));\n }, [containerSize, gameCubeSize, isMediumScreen]); // Мягкие углы для плоского стиля\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 const landscape = mobile && width > height; // ✅ Landscape режим на мобильных\n // ✅ Определение разрешений 1200-1400 (включая 1366x768)\n const mediumScreen = width >= 1200 && width <= 1400;\n \n setIsMobile(mobile);\n setIsNestHub(nestHub);\n setIsLandscape(landscape);\n setIsMediumScreen(mediumScreen);\n\n // ✅ Адаптивные размеры контейнера\n if (mobile) {\n // Мобильные устройства: используем 100% ширины/высоты\n setContainerSize(null);\n setScale(1);\n } else if (isSmallHeight) {\n // Маленькая высота: используем 100% ширины/высоты\n setContainerSize(null);\n setScale(1);\n } else {\n // Десктоп/планшет: рассчитываем оптимальный размер\n const minSize = 400;\n const maxSize = 1200;\n \n // Рассчитываем максимальный размер, который поместится на экране\n // Учитываем отступы (примерно 40px с каждой стороны) и минимальные размеры\n const availableWidth = width - 80; // Отступы по 40px с каждой стороны\n const availableHeight = height - 80;\n const maxAvailableSize = Math.min(availableWidth, availableHeight);\n \n // Если передан gameCubeSize, используем его, но не больше доступного размера\n let targetSize: number;\n if (gameCubeSize && gameCubeSize >= 320) {\n targetSize = Math.min(gameCubeSize, maxAvailableSize);\n } else {\n // Используем 90% от минимального размера экрана\n targetSize = Math.min(1000, maxAvailableSize * 0.9);\n }\n \n // Ограничиваем минимальным и максимальным размером\n const finalSize = Math.max(minSize, Math.min(maxSize, targetSize));\n setContainerSize(finalSize);\n \n // Для широких экранов уменьшаем масштаб\n if (isWideScreen) {\n setScale(0.85);\n } else {\n setScale(1);\n }\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 // Определение планшета: ширина >= 768px и < 1024px (и не мобильный)\n const isTablet = !isMobile && typeof window !== \"undefined\" && window.innerWidth >= 768 && window.innerWidth < 1024;\n // Условие для отображения логотипа: не мобильный, showLogo включен, И (не экран игры ИЛИ планшет)\n const shouldShowLogo = !isMobile && showLogo && (stage !== \"game\" || isTablet);\n\n const containerStyle: React.CSSProperties = {\n ...styles.gmCenterScreen,\n width: \"100%\",\n height: \"100%\",\n padding: `${padding}px`,\n paddingTop: shouldShowLogo ? `${80}px` : `${padding}px`, // ✅ Резервируем больше места под логотип (24px top + 28px высота + 28px отступ)\n overflow: isMediumScreen ? \"hidden\" : \"auto\", // ✅ Для разрешений 1200-1400 убираем скролл\n position: \"relative\",\n boxSizing: \"border-box\",\n background: \"transparent\",\n };\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}>\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, stage]\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: \"60px\", // ✅ Под логотипом (24px top логотипа + 28px высота + 8px отступ)\n left: \"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: \"60px\", // ✅ Под логотипом (24px top логотипа + 28px высота + 8px отступ)\n left: \"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 {!isLandscape && <div dangerouslySetInnerHTML={{ __html: kidsDoodlesSvg }} />} {/* ✅ Скрываем декоративные элементы в landscape */}\n <div style={{\n ...styles.gmInfoBox,\n padding: `${isLandscape ? gap * 0.6 : gap * 0.8}px`, // ✅ Уменьшаем padding в landscape\n marginBottom: `${isLandscape ? gap * 0.3 : gap * 0.5}px`, // ✅ Уменьшаем margin в landscape\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: `${isLandscape ? gap * 0.3 : gap * 0.5}px`, // ✅ Уменьшаем margin в landscape\n marginBottom: `${isLandscape ? gap * 0.5 : gap}px`, // ✅ Уменьшаем margin в landscape\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: `${isLandscape ? gap * 0.5 : gap}px 0`, // ✅ Уменьшаем margin в landscape\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 : isMobile\n ? isLandscape\n ? Math.max(70, Math.min(120, Math.min(window.innerWidth * 0.25, window.innerHeight * 0.15))) // ✅ Уменьшаем на 25% в landscape\n : Math.max(100, Math.min(150, Math.min(window.innerWidth * 0.3, window.innerHeight * 0.2))) // ✅ Улучшенный расчет для мобильных\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: `${isLandscape ? gap * 0.5 : gap}px 0`, // ✅ Уменьшаем margin в landscape\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: `${isLandscape ? gap * 0.6 : gap}px`, // ✅ Уменьшаем padding в landscape\n marginTop: `${isLandscape ? gap * 0.5 : gap}px`, // ✅ Уменьшаем margin в landscape\n marginBottom: `${isLandscape ? gap * 0.5 : gap}px`, // ✅ Уменьшаем margin в landscape\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","isLandscape","setIsLandscape","isMediumScreen","setIsMediumScreen","baseFontSize","useMemo","fontSizeScale","landscapeScale","mediumScreenScale","combinedScale","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","landscape","mediumScreen","availableWidth","availableHeight","maxAvailableSize","targetSize","finalSize","kidsDoodlesSvg","isTablet","shouldShowLogo","containerStyle","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: \"24px\", // ✅ Увеличен отступ сверху для большего пространства\n left: \"24px\", // ✅ Увеличен отступ слева для большего пространства\n width: \"auto\",\n zIndex: 30, // ✅ Унифицирован zIndex для консистентности\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(3, size / 100); // ✅ Увеличена минимальная толщина с 2 до 3 для лучшей видимости на маленьких экранах\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 viewBox=\"0 0 200 250\" // ✅ Добавлен viewBox для правильного масштабирования на iOS Safari\n style={{ \n display: \"block\",\n margin: \"0 auto\",\n overflow: \"visible\", // ✅ Для корректного отображения линий\n WebkitFontSmoothing: \"antialiased\", // ✅ Для лучшего рендеринга на iOS\n transform: \"translateZ(0)\", // ✅ Включение аппаратного ускорения на iOS\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 const [isLandscape, setIsLandscape] = useState(false); // ✅ Landscape режим на мобильных\n const [isMediumScreen, setIsMediumScreen] = useState(false); // ✅ Для разрешений 1200-1400 (включая 1366x768)\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 const landscapeScale = isLandscape ? 0.8 : 1; // ✅ Уменьшаем на 20% в landscape\n const mediumScreenScale = isMediumScreen ? 0.9 : 1; // ✅ Уменьшаем на 10% для medium screens (1200-1400px)\n const combinedScale = landscapeScale * mediumScreenScale;\n return {\n headline1: isMobile \n ? Math.max(24, Math.min(30, 30 * fontSizeScale * combinedScale)) // Mobile: 30px\n : Math.max(28, Math.min(32, 32 * fontSizeScale * mediumScreenScale)), // Desktop: 32px\n headline2: Math.max(20, Math.min(28, 24 * fontSizeScale * combinedScale)), // Desktop: 24px\n headline3: isMobile\n ? Math.max(14, Math.min(18, 16 * fontSizeScale * combinedScale)) // Mobile: 16px\n : Math.max(20, Math.min(26, 24 * fontSizeScale * combinedScale)), // Desktop: 24px\n bodyL: Math.max(14, Math.min(20, 18 * fontSizeScale * combinedScale)), // Desktop: 18px\n bodyM: isMobile\n ? Math.max(12, Math.min(16, 14 * fontSizeScale * combinedScale)) // Mobile: 14px\n : Math.max(14, Math.min(18, 16 * fontSizeScale * combinedScale)), // Desktop: 16px\n bodyS: isMobile\n ? Math.max(10, Math.min(14, 12 * fontSizeScale * combinedScale)) // Mobile: 12px\n : Math.max(12, Math.min(16, 14 * fontSizeScale * combinedScale)), // Desktop: 14px\n wordDisplay: Math.max(18, Math.min(32, 26 * fontSizeScale * combinedScale)), // Адаптивный размер\n button: Math.max(12, Math.min(18, 16 * fontSizeScale * combinedScale)), // Desktop: 16px\n };\n }, [isMobile, containerSize, gameCubeSize, isLandscape, isMediumScreen]);\n\n // Адаптивные отступы и размеры (минималистичный стиль - мягкие углы)\n // Специальные настройки для Nest Hub (1024x600) и landscape режима\n const padding = useMemo(() => {\n const fontSizeScale = (containerSize || gameCubeSize || 1000) / 400;\n const landscapeScale = isLandscape ? 0.65 : 1; // ✅ Уменьшаем на 35% в landscape\n const mediumScreenScale = isMediumScreen ? 0.85 : 1; // ✅ Уменьшаем на 15% для medium screens (1200-1400px)\n if (isNestHub) {\n return Math.max(8, Math.min(12, 10 * fontSizeScale));\n }\n const basePadding = Math.max(12, Math.min(24, 16 * fontSizeScale));\n return basePadding * landscapeScale * mediumScreenScale;\n }, [isNestHub, containerSize, gameCubeSize, isLandscape, isMediumScreen]);\n const gap = useMemo(() => {\n const fontSizeScale = (containerSize || gameCubeSize || 1000) / 400;\n const landscapeScale = isLandscape ? 0.65 : 1; // ✅ Уменьшаем на 35% в landscape\n const mediumScreenScale = isMediumScreen ? 0.85 : 1; // ✅ Уменьшаем на 15% для medium screens (1200-1400px)\n if (isNestHub) {\n return Math.max(3, Math.min(6, 5 * fontSizeScale));\n }\n const baseGap = Math.max(4, Math.min(12, 8 * fontSizeScale));\n return baseGap * landscapeScale * mediumScreenScale;\n }, [isNestHub, containerSize, gameCubeSize, isLandscape, isMediumScreen]);\n const borderRadius = useMemo(() => {\n const fontSizeScale = (containerSize || gameCubeSize || 1000) / 400;\n const mediumScreenScale = isMediumScreen ? 0.9 : 1; // ✅ Уменьшаем на 10% для medium screens (1200-1400px)\n return Math.max(6, Math.min(10, 8 * fontSizeScale * mediumScreenScale));\n }, [containerSize, gameCubeSize, isMediumScreen]); // Мягкие углы для плоского стиля\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 const landscape = mobile && width > height; // ✅ Landscape режим на мобильных\n // ✅ Определение разрешений 1200-1400 (включая 1366x768)\n const mediumScreen = width >= 1200 && width <= 1400;\n \n setIsMobile(mobile);\n setIsNestHub(nestHub);\n setIsLandscape(landscape);\n setIsMediumScreen(mediumScreen);\n\n // ✅ Адаптивные размеры контейнера\n if (mobile) {\n // Мобильные устройства: используем 100% ширины/высоты\n setContainerSize(null);\n setScale(1);\n } else if (isSmallHeight) {\n // Маленькая высота: используем 100% ширины/высоты\n setContainerSize(null);\n setScale(1);\n } else {\n // Десктоп/планшет: рассчитываем оптимальный размер\n const minSize = 400;\n const maxSize = 1200;\n \n // Рассчитываем максимальный размер, который поместится на экране\n // Учитываем отступы (примерно 40px с каждой стороны) и минимальные размеры\n const availableWidth = width - 80; // Отступы по 40px с каждой стороны\n const availableHeight = height - 80;\n const maxAvailableSize = Math.min(availableWidth, availableHeight);\n \n // Если передан gameCubeSize, используем его, но не больше доступного размера\n let targetSize: number;\n if (gameCubeSize && gameCubeSize >= 320) {\n targetSize = Math.min(gameCubeSize, maxAvailableSize);\n } else {\n // Используем 90% от минимального размера экрана\n targetSize = Math.min(1000, maxAvailableSize * 0.9);\n }\n \n // Ограничиваем минимальным и максимальным размером\n const finalSize = Math.max(minSize, Math.min(maxSize, targetSize));\n setContainerSize(finalSize);\n \n // Для широких экранов уменьшаем масштаб\n if (isWideScreen) {\n setScale(0.85);\n } else {\n setScale(1);\n }\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 // Определение планшета: ширина >= 768px и < 1024px (и не мобильный)\n const isTablet = !isMobile && typeof window !== \"undefined\" && window.innerWidth >= 768 && window.innerWidth < 1024;\n // Условие для отображения логотипа: не мобильный, showLogo включен, И (не экран игры ИЛИ планшет)\n const shouldShowLogo = !isMobile && showLogo && (stage !== \"game\" || isTablet);\n\n const containerStyle: React.CSSProperties = {\n ...styles.gmCenterScreen,\n width: \"100%\",\n height: \"100%\",\n padding: `${padding}px`,\n paddingTop: shouldShowLogo ? `${80}px` : `${padding}px`, // ✅ Резервируем больше места под логотип (24px top + 28px высота + 28px отступ)\n overflow: isMediumScreen ? \"hidden\" : \"auto\", // ✅ Для разрешений 1200-1400 убираем скролл\n position: \"relative\",\n boxSizing: \"border-box\",\n background: \"transparent\",\n };\n\n // Мемоизированный логотип (рендерится вне условных блоков)\n const MemoizedLogo = useMemo(\n () => {\n // Проверяем showLogo ПЕРЕД проверкой размеров экрана\n if (!shouldShowLogo) {\n return null;\n }\n \n // Скрываем логотип только на мобильных устройствах в landscape режиме\n // Убрали проверку height < 700, чтобы уважать проп showLogo на всех разрешениях\n const width = window.innerWidth;\n if (isMobile && width > window.innerHeight) {\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}>\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, stage]\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: \"60px\", // ✅ Под логотипом (24px top логотипа + 28px высота + 8px отступ)\n left: \"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: \"60px\", // ✅ Под логотипом (24px top логотипа + 28px высота + 8px отступ)\n left: \"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 {!isLandscape && <div dangerouslySetInnerHTML={{ __html: kidsDoodlesSvg }} />} {/* ✅ Скрываем декоративные элементы в landscape */}\n <div style={{\n ...styles.gmInfoBox,\n padding: `${isLandscape ? gap * 0.6 : gap * 0.8}px`, // ✅ Уменьшаем padding в landscape\n marginBottom: `${isLandscape ? gap * 0.3 : gap * 0.5}px`, // ✅ Уменьшаем margin в landscape\n maxWidth: `${(containerSize || gameCubeSize) * 0.9}px`,\n textAlign: \"center\", // ✅ Центрируем текст по плашке\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}>\n <h3 style={{ ...styles.gmHeadline3, fontSize: `${baseFontSize.headline3}px`, marginBottom: `${gap * 0.2}px`, textAlign: \"center\" }}>\n Category: {category}\n </h3>\n <p style={{ ...styles.gmBodyM, fontSize: `${baseFontSize.bodyM}px`, marginBottom: `0px`, textAlign: \"center\" }}>\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: `${isLandscape ? gap * 0.3 : gap * 0.5}px`, // ✅ Уменьшаем margin в landscape\n marginBottom: `${isLandscape ? gap * 0.5 : gap}px`, // ✅ Уменьшаем margin в landscape\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: `${isLandscape ? gap * 0.5 : gap}px 0`, // ✅ Уменьшаем margin в landscape\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 : isMobile\n ? isLandscape\n ? Math.max(70, Math.min(120, Math.min(window.innerWidth * 0.25, window.innerHeight * 0.15))) // ✅ Уменьшаем на 25% в landscape\n : Math.max(100, Math.min(150, Math.min(window.innerWidth * 0.3, window.innerHeight * 0.2))) // ✅ Улучшенный расчет для мобильных\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: `${isLandscape ? gap * 0.5 : gap}px 0`, // ✅ Уменьшаем margin в landscape\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: `${isLandscape ? gap * 0.6 : gap}px`, // ✅ Уменьшаем padding в landscape\n marginTop: `${isLandscape ? gap * 0.5 : gap}px`, // ✅ Уменьшаем margin в landscape\n marginBottom: `${isLandscape ? gap * 0.5 : gap}px`, // ✅ Уменьшаем margin в landscape\n maxWidth: `${(containerSize || gameCubeSize) * 0.95}px`,\n }}>\n <div style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: `${gap / 3}px`,\n justifyContent: \"center\",\n alignItems: \"center\",\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 flex: \"1 1 auto\",\n padding: `${gap * 0.5}px ${gap * 0.4}px`,\n borderRadius: `${borderRadius * 0.5}px`,\n background: \"#f9f9f9\",\n color: \"#1f2937\",\n border: \"1px solid #e5e7eb\",\n minWidth: `${Math.max((containerSize || gameCubeSize) * 0.06, gap * 2)}px`,\n maxWidth: `${Math.max((containerSize || gameCubeSize) * 0.12, gap * 3)}px`,\n textAlign: \"center\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: roundResult === null ? \"pointer\" : \"default\",\n fontFamily: '\"Onest\", system-ui, sans-serif',\n fontSize: `${Math.max(14, Math.min(20, baseFontSize.bodyS * 1.2))}px`,\n fontWeight: 500,\n transition: \"background-color 0.2s ease\",\n }}\n >\n {letter.toUpperCase()}\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","isLandscape","setIsLandscape","isMediumScreen","setIsMediumScreen","baseFontSize","useMemo","fontSizeScale","landscapeScale","mediumScreenScale","combinedScale","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","landscape","mediumScreen","availableWidth","availableHeight","maxAvailableSize","targetSize","finalSize","kidsDoodlesSvg","isTablet","shouldShowLogo","containerStyle","MemoizedLogo","logoBaseUrl","renderContent","Fragment","e"],"mappings":"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"}
|
package/package.json
CHANGED
package/dist/logo.svg
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
<svg width="401" height="69" viewBox="0 0 401 69" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
-
<path d="M28.0968 68.2857C23.4573 68.2857 19.1312 67.5647 15.1187 66.1227C11.1688 64.6807 7.84589 62.3922 5.14995 59.2574C2.51671 56.1226 0.855254 52.0787 0.165594 47.1257H13.8961C14.4604 49.2574 15.4948 50.9815 16.9996 52.2981C18.5043 53.5521 20.2911 54.4612 22.3601 55.0254C24.4918 55.5897 26.7175 55.8718 29.0372 55.8718C30.7927 55.8718 32.5169 55.6524 34.2097 55.2135C35.9025 54.7746 37.2818 54.0223 38.3476 52.9564C39.4762 51.8906 40.0404 50.4486 40.0404 48.6304C40.0404 47.2511 39.727 46.1226 39.1 45.2448C38.5357 44.3671 37.6893 43.6774 36.5608 43.1758C35.495 42.6116 34.1783 42.11 32.6109 41.6711C31.2943 41.2949 29.915 40.9815 28.473 40.7307C27.0937 40.4799 25.7143 40.1664 24.335 39.7902C23.0184 39.414 21.7331 38.9752 20.4792 38.4736C18.0967 37.8466 15.8083 37.0943 13.614 36.2165C11.4196 35.2761 9.476 34.1162 7.7832 32.7369C6.0904 31.2949 4.74243 29.508 3.73928 27.3764C2.79884 25.2447 2.32862 22.6741 2.32862 19.6647C2.32862 16.4045 2.86154 13.6459 3.92737 11.3888C5.05591 9.13173 6.52927 7.28219 8.34746 5.84018C10.2284 4.33546 12.2973 3.17558 14.5544 2.36053C16.8742 1.54548 19.1939 0.981211 21.5137 0.66773C23.8335 0.354248 26.0278 0.197508 28.0968 0.197508C32.4228 0.197508 36.31 0.949863 39.7583 2.45457C43.2066 3.95928 46.0279 6.21635 48.2223 9.22578C50.4167 12.2352 51.6706 16.0283 51.9841 20.6052H38.9119C38.6611 18.7243 37.9715 17.1882 36.8429 15.997C35.7144 14.8057 34.2724 13.928 32.5169 13.3637C30.8241 12.7995 28.9119 12.5173 26.7802 12.5173C25.4009 12.5173 24.0529 12.6427 22.7363 12.8935C21.4196 13.1443 20.2284 13.5518 19.1626 14.1161C18.1594 14.6177 17.3444 15.3073 16.7174 16.1851C16.1532 17.0628 15.871 18.1287 15.871 19.3826C15.871 20.6365 16.2158 21.7337 16.9055 22.6741C17.5952 23.5519 18.5983 24.3356 19.9149 25.0252C21.2943 25.6522 22.893 26.2478 24.7112 26.8121C26.5921 27.4391 28.567 27.9406 30.636 28.3168C32.705 28.693 34.6799 29.1945 36.5608 29.8215C38.9433 30.4485 41.169 31.2008 43.238 32.0786C45.3069 32.8936 47.1251 33.9595 48.6925 35.2761C50.2599 36.53 51.4825 38.1601 52.3603 40.1664C53.238 42.11 53.6769 44.5238 53.6769 47.4078C53.6769 51.2323 52.9559 54.4925 51.5139 57.1884C50.1345 59.8217 48.2223 61.9534 45.7772 63.5835C43.3947 65.2136 40.6674 66.4048 37.5953 67.1572C34.5232 67.9095 31.357 68.2857 28.0968 68.2857ZM65.071 67.5333V0.949865H91.0272C96.1056 0.949865 100.526 1.73357 104.288 3.30097C108.112 4.80568 111.059 7.25084 113.128 10.6364C115.197 13.9593 116.231 18.4108 116.231 23.9908C116.231 29.1945 115.071 33.5519 112.752 37.0629C110.494 40.5739 107.391 43.2072 103.441 44.9627C99.4912 46.6555 95.0084 47.5019 89.9927 47.5019H78.5193V67.5333H65.071ZM78.5193 35.4642H89.8047C93.8172 35.4642 96.9834 34.5237 99.3031 32.6428C101.686 30.6993 102.877 27.7839 102.877 23.8967C102.877 20.4484 101.874 17.8465 99.8674 16.091C97.9238 14.3355 94.789 13.4578 90.463 13.4578H78.5193V35.4642ZM126.512 67.5333V0.949865H174.475V13.4578H139.96V28.5049H169.584V40.5426H139.96V55.1195H174.475V67.5333H126.512ZM177.963 67.5333L203.92 0.949865H218.967L244.641 67.5333H230.158L226.02 56.154H196.584L192.446 67.5333H177.963ZM200.91 44.0222H221.788L211.443 15.2446L200.91 44.0222ZM251.782 67.5333V0.949865H265.231V28.5989H274.635L291.939 0.949865H307.363L285.92 33.3012L307.363 67.5333H291.563L275.199 41.0128H265.231V67.5333H251.782Z" fill="black"/>
|
|
3
|
-
<path d="M314.968 67.5333V0.949865H328.417V67.5333H314.968ZM342.52 67.5333V0.949865H367.63C374.59 0.949865 380.514 2.26649 385.405 4.89973C390.358 7.53298 394.12 11.3261 396.69 16.2791C399.323 21.2321 400.64 27.2823 400.64 34.4297C400.64 41.4517 399.355 47.4392 396.784 52.3922C394.276 57.2825 390.577 61.0443 385.687 63.6775C380.797 66.2481 374.809 67.5333 367.724 67.5333H342.52ZM355.969 55.1195H367.63C372.27 55.1195 376 54.2417 378.822 52.4862C381.643 50.7307 383.712 48.2856 385.029 45.1508C386.345 42.0159 387.003 38.4109 387.003 34.3356C387.003 30.3858 386.345 26.8434 385.029 23.7086C383.775 20.5111 381.706 18.0033 378.822 16.1851C376 14.3669 372.176 13.4578 367.348 13.4578H355.969V55.1195Z" fill="#F04F4F"/>
|
|
4
|
-
</svg>
|