speakid-build-a-sentence 1.0.12 → 1.0.14

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-build-a-sentence.umd.js","sources":["../node_modules/react/cjs/react-jsx-runtime.production.js","../node_modules/react/cjs/react-jsx-runtime.development.js","../node_modules/react/jsx-runtime.js","../src/Game.styles.ts","../src/hooks/useValidation.ts","../src/utils/accessibility.ts","../src/Game.tsx","../src/components/ErrorBoundary.tsx"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(type, key, props, owner, debugStack, debugTask) {\n var refProp = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== refProp ? refProp : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n maybeKey,\n getOwner(),\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n isValidElement(node)\n ? node._store && (node._store.validated = 1)\n : \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_LAZY_TYPE &&\n (\"fulfilled\" === node._payload.status\n ? isValidElement(node._payload.value) &&\n node._payload.value._store &&\n (node._payload.value._store.validated = 1)\n : node._store && (node._store.validated = 1));\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import { CSSProperties } from \"react\";\n\n// ===== Добавляем анимации в <head> с уникальным ID =====\nconst keyframes = `\n @keyframes magic-sentence-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n \n @keyframes magic-sentence-pulse {\n 0%, 100% { transform: scale(1); }\n 50% { transform: scale(1.05); }\n }\n \n @keyframes magic-sentence-shake {\n 0%, 100% { transform: translateX(0); }\n 25% { transform: translateX(-5px); }\n 75% { transform: translateX(5px); }\n }\n \n @keyframes magic-sentence-slideIn {\n from { transform: translateY(-20px); opacity: 0; }\n to { transform: translateY(0); opacity: 1; }\n }\n \n @keyframes magic-sentence-bounce {\n 0%, 20%, 53%, 80%, 100% { transform: translate3d(0,0,0); }\n 40%, 43% { transform: translate3d(0, -8px, 0); }\n 70% { transform: translate3d(0, -4px, 0); }\n 90% { transform: translate3d(0, -2px, 0); }\n }\n \n @keyframes magic-sentence-glow {\n 0%, 100% { box-shadow: 0 0 5px rgba(76, 175, 80, 0.5); }\n 50% { box-shadow: 0 0 20px rgba(76, 175, 80, 0.8), 0 0 30px rgba(76, 175, 80, 0.6); }\n }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"magic-sentence-keyframes\")) {\n const styleTag = document.createElement(\"style\");\n styleTag.id = \"magic-sentence-keyframes\";\n styleTag.innerHTML = keyframes;\n document.head.appendChild(styleTag);\n}\n\n// ===== Анимации =====\nconst animations = {\n spin: {\n animation: \"magic-sentence-spin 1.4s linear infinite\",\n },\n pulse: {\n animation: \"magic-sentence-pulse 0.6s ease-in-out\",\n },\n shake: {\n animation: \"magic-sentence-shake 0.4s ease-in-out\",\n },\n slideIn: {\n animation: \"magic-sentence-slideIn 0.3s ease-out\",\n },\n bounce: {\n animation: \"magic-sentence-bounce 0.6s ease-in-out\",\n },\n glow: {\n animation: \"magic-sentence-glow 1s ease-in-out infinite\",\n },\n};\n\n// ===== Основные стили =====\nexport const styles: Record<string, CSSProperties> = {\n gmCenterScreen: {\n position: \"relative\",\n zIndex: 1,\n // use percent so the component fits inside the centered square container\n // (100vh caused overflow on tablets because it measured the viewport, not the container)\n minHeight: \"100%\",\n width: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n alignItems: \"center\",\n textAlign: \"center\",\n color: \"#1f2937\",\n padding: \"24px 16px\",\n boxSizing: \"border-box\",\n transform: \"translateY(20px)\", // чуть вниз, чтобы компенсировать логотип\n },\n\n gmHeadline1: {\n fontWeight: 700,\n fontSize: \"clamp(28px, 4vw, 40px)\",\n lineHeight: \"110%\",\n },\n\n gmHeadline2: {\n fontWeight: 600,\n fontSize: \"24px\",\n lineHeight: \"120%\",\n },\n\n gmHeadline3: {\n fontWeight: 600,\n fontSize: \"18px\",\n lineHeight: \"130%\",\n },\n\n gmBodyL: {\n fontWeight: 400,\n fontSize: \"18px\",\n lineHeight: \"140%\",\n },\n\n gmBodyM: {\n fontWeight: 400,\n fontSize: \"16px\",\n lineHeight: \"140%\",\n },\n\n gmBodyS: {\n fontWeight: 400,\n fontSize: \"14px\",\n lineHeight: \"140%\",\n color: \"#6b7280\",\n },\n\n gmButton: {\n fontFamily:\n '\"Geist\", system-ui, -apple-system, \"Segoe UI\", Roboto, Arial, \"Noto Sans\"',\n fontWeight: 600,\n fontSize: \"16px\",\n padding: \"10px 16px\",\n borderRadius: \"12px\",\n border: \"1px solid #e5e7eb\",\n background: \"#ec4c44\",\n color: \"#ffffff\",\n cursor: \"pointer\",\n boxShadow: \"0 6px 18px rgba(236, 76, 68, .18)\",\n transition:\n \"transform .06s ease, box-shadow .2s ease, background .2s ease, opacity .2s ease\",\n },\n\n gmButtonActive: {\n background: \"#333\",\n color: \"#fff\",\n },\n\n gmGameLayout: {\n position: \"relative\",\n width: \"100%\",\n // allow the layout to expand within the square container for tablets/laptops\n maxWidth: \"none\",\n // should fill the parent square, not the full viewport\n minHeight: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n textAlign: \"center\",\n color: \"#1f2937\",\n padding: \"16px 8px\",\n margin: \"0 auto\",\n },\n\n gmGrid: {\n width: \"100%\",\n // let the grid use all available space; sizing is controlled in Game.tsx\n maxWidth: \"none\",\n margin: \"0 auto\",\n display: \"grid\",\n // defaults; overridden responsively in Game.tsx\n gridTemplateColumns: \"repeat(3, 210px)\",\n gridAutoRows: \"210px\",\n gap: \"20px\",\n justifyContent: \"center\",\n },\n\n gmCard: {\n border: \"1px solid #e5e7eb\",\n borderRadius: \"16px\",\n background: \"#f9f9f9\",\n aspectRatio: \"1 / 1\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n overflow: \"hidden\",\n transition:\n \"transform .2s ease, box-shadow .2s ease, border-color .2s ease\",\n },\n\n gmCorrect: {\n border: \"2px solid #10b981\",\n boxShadow: \"0 0 18px rgba(16,185,129,.45)\",\n background: \"#ecfdf5\",\n },\n\n gmWrong: {\n border: \"2px solid #ec4c44\",\n boxShadow: \"0 0 18px rgba(236,76,68,.35)\",\n background: \"#fef2f2\",\n },\n\n gmInput: {\n padding: \"6px 10px\",\n borderRadius: \"6px\",\n border: \"1px solid #ccc\",\n fontSize: \"16px\",\n fontFamily: '\"Geist\", system-ui',\n width: \"160px\",\n },\n\n gmTable: {\n marginTop: \"20px\",\n marginBottom: \"32px\",\n borderCollapse: \"collapse\",\n width: \"100%\",\n maxWidth: \"520px\",\n tableLayout: \"fixed\",\n textAlign: \"center\",\n },\n\n gmTableCell: {\n padding: \"8px 12px\",\n borderBottom: \"1px solid #e5e7eb\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n },\n\n // ✅ Обновлено под стандарты SPEAKID\n gmLogoFixed: {\n position: \"absolute\",\n top: \"16px\",\n left: \"16px\",\n width: \"120px\",\n zIndex: 30,\n pointerEvents: \"none\",\n background: \"transparent\",\n transform: \"none\",\n willChange: \"auto\",\n },\n\n gmLogoImg: {\n height: \"clamp(28px, 5vw, 40px)\",\n width: \"auto\",\n background: \"transparent\",\n backgroundImage: \"url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9IjQwIiB2aWV3Qm94PSIwIDAgMTAwIDQwIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8dGV4dCB4PSI1MCIgeT0iMjUiIGZvbnQtZmFtaWx5PSJBcmlhbCwgc2Fucy1zZXJpZiIgZm9udC1zaXplPSIyMCIgZm9udC13ZWlnaHQ9ImJvbGQiIGZpbGw9IiNlYzRjNDQiIHRleHQtYW5jaG9yPSJtaWRkbGUiPlNQRUFLSUQ8L3RleHQ+Cjwvc3ZnPgo=')\",\n backgroundSize: \"contain\",\n backgroundRepeat: \"no-repeat\",\n backgroundPosition: \"center\",\n transform: \"translateZ(0)\",\n backfaceVisibility: \"hidden\",\n WebkitFontSmoothing: \"antialiased\",\n objectFit: \"contain\",\n imageRendering: \"auto\",\n },\n\n gmReadyWrapper: {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n // use percent so the wrapper scales with the container square\n height: \"60%\",\n gap: \"16px\",\n },\n\n gmHourglass: {\n fontSize: \"42px\",\n ...animations.spin,\n },\n\n // ===== Анимационные стили =====\n ...animations,\n};","import { useState, useCallback } from 'react';\n\nexport interface ValidationError {\n type: 'length' | 'characters' | 'empty' | 'duplicate';\n message: string;\n}\n\nexport interface ValidationResult {\n isValid: boolean;\n errors: ValidationError[];\n}\n\nexport const useValidation = () => {\n const [errors, setErrors] = useState<ValidationError[]>([]);\n\n const validateSentence = useCallback((sentence: string, index: number, allSentences: string[]): ValidationResult => {\n const newErrors: ValidationError[] = [];\n\n // Проверка на пустоту\n if (!sentence.trim()) {\n newErrors.push({\n type: 'empty',\n message: 'Sentence cannot be empty'\n });\n }\n\n // Проверка длины\n if (sentence.length > 41) {\n newErrors.push({\n type: 'length',\n message: `Sentence is too long (${sentence.length}/41 characters)`\n });\n }\n\n // Проверка символов (только латиница)\n const latinRegex = /^[a-zA-Z0-9\\s.,!?;:'\"-]*$/;\n if (sentence && !latinRegex.test(sentence)) {\n newErrors.push({\n type: 'characters',\n message: 'Only Latin characters, numbers, spaces and punctuation are allowed'\n });\n }\n\n // Проверка на дубликаты\n const duplicateIndex = allSentences.findIndex((s, i) => i !== index && s.toLowerCase().trim() === sentence.toLowerCase().trim());\n if (duplicateIndex !== -1) {\n newErrors.push({\n type: 'duplicate',\n message: `Duplicate sentence (same as sentence ${duplicateIndex + 1})`\n });\n }\n\n setErrors(newErrors);\n return {\n isValid: newErrors.length === 0,\n errors: newErrors\n };\n }, []);\n\n const validateAllSentences = useCallback((sentences: string[]): ValidationResult => {\n const allErrors: ValidationError[] = [];\n \n sentences.forEach((sentence, index) => {\n const result = validateSentence(sentence, index, sentences);\n allErrors.push(...result.errors.map(error => ({\n ...error,\n message: `Sentence ${index + 1}: ${error.message}`\n })));\n });\n\n return {\n isValid: allErrors.length === 0,\n errors: allErrors\n };\n }, [validateSentence]);\n\n const clearErrors = useCallback(() => {\n setErrors([]);\n }, []);\n\n return {\n errors,\n validateSentence,\n validateAllSentences,\n clearErrors,\n };\n};\n\n","// Утилиты для улучшения доступности\n\nexport const createAriaLabel = (action: string, word?: string, context?: string): string => {\n if (word && context) {\n return `${action} word \"${word}\" ${context}`;\n }\n if (word) {\n return `${action} word \"${word}\"`;\n }\n return action;\n};\n\nexport const getRoleForElement = (type: 'button' | 'draggable' | 'droppable' | 'input'): string => {\n const roles = {\n button: 'button',\n draggable: 'button',\n droppable: 'region',\n input: 'textbox'\n };\n return roles[type];\n};\n\nexport const handleKeyDown = (\n event: React.KeyboardEvent,\n action: () => void,\n allowedKeys: string[] = ['Enter', ' ']\n) => {\n if (allowedKeys.includes(event.key)) {\n event.preventDefault();\n action();\n }\n};\n\nexport const announceToScreenReader = (message: string) => {\n // Создаем временный элемент для объявления\n const announcement = document.createElement('div');\n announcement.setAttribute('aria-live', 'polite');\n announcement.setAttribute('aria-atomic', 'true');\n announcement.style.position = 'absolute';\n announcement.style.left = '-10000px';\n announcement.style.width = '1px';\n announcement.style.height = '1px';\n announcement.style.overflow = 'hidden';\n \n document.body.appendChild(announcement);\n announcement.textContent = message;\n \n // Удаляем элемент после объявления\n setTimeout(() => {\n document.body.removeChild(announcement);\n }, 1000);\n};\n\nexport const getFocusableElements = (container: HTMLElement): HTMLElement[] => {\n const focusableSelectors = [\n 'button:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n '[role=\"button\"]:not([disabled])'\n ].join(', ');\n \n return Array.from(container.querySelectorAll(focusableSelectors));\n};\n\nexport const trapFocus = (container: HTMLElement) => {\n const focusableElements = getFocusableElements(container);\n \n if (focusableElements.length === 0) return;\n \n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n \n const handleTabKey = (e: KeyboardEvent) => {\n if (e.key === 'Tab') {\n if (e.shiftKey) {\n if (document.activeElement === firstElement) {\n lastElement.focus();\n e.preventDefault();\n }\n } else {\n if (document.activeElement === lastElement) {\n firstElement.focus();\n e.preventDefault();\n }\n }\n }\n };\n \n container.addEventListener('keydown', handleTabKey);\n \n // Фокусируем первый элемент\n firstElement.focus();\n \n // Возвращаем функцию для очистки\n return () => {\n container.removeEventListener('keydown', handleTabKey);\n };\n};\n\n","// ======================\n// MAGIC SENTENCE GAME (SPEAKID)\n// React 18 + TypeScript + Vite\n// Адаптивная верстка для всех устройств\n// ======================\n\nimport * as React from \"react\";\nimport { useState, useEffect, useRef } from \"react\";\nimport { styles } from \"./Game.styles\";\nimport { ErrorBoundary } from \"./components/ErrorBoundary\";\nimport { useValidation } from \"./hooks/useValidation\";\nimport { createAriaLabel, handleKeyDown, announceToScreenReader } from \"./utils/accessibility\";\n\ntype Stage = \"select\" | \"time\" | \"type\" | \"getready\" | \"play\" | \"results\";\ntype Token = { id: string; text: string };\n\n// ✅ базовый reset\nconst globalReset = () => {\n const style = document.createElement(\"style\");\n style.textContent = `\n #magic-sentence-root, #magic-sentence-root * {\n box-sizing: border-box;\n font-family: \"Geist\", system-ui, -apple-system, \"Segoe UI\", Roboto, Arial, sans-serif;\n }\n #magic-sentence-root img {\n max-width: 100%;\n height: auto;\n display: block;\n user-select: none;\n }\n html, body {\n margin: 0 !important;\n padding: 0 !important;\n width: 100% !important;\n height: 100% !important;\n overflow: hidden !important;\n zoom: 1 !important;\n }\n #root {\n margin: 0 !important;\n padding: 0 !important;\n width: 100% !important;\n height: 100% !important;\n overflow: hidden !important;\n }\n `;\n document.head.appendChild(style);\n};\n\nconst shuffle = (arr: string[]) => [...arr].sort(() => Math.random() - 0.5);\n\nexport interface GameProps {\n logoUrl?: string;\n showLogo?: boolean;\n baseURL?: string;\n}\n\nexport default function Game(props: GameProps = {}): React.JSX.Element {\n const { logoUrl, showLogo = true, baseURL } = props;\n const containerRef = useRef<HTMLDivElement>(null);\n \n // Новые хуки\n const { validateAllSentences, errors: validationErrors } = useValidation();\n\n // Функция для определения нужно ли переносить слова\n const shouldWrapWords = () => {\n // Переносим слова на всех мобильных устройствах\n return isMobile || window.innerWidth < 768;\n };\n\n // Универсальная функция для определения мобильных устройств\n const isMobileDevice = () => {\n return isMobile || \n window.innerWidth < 768 || \n (window.innerWidth >= 320 && window.innerWidth <= 932 && window.innerHeight >= 390 && window.innerHeight <= 932);\n };\n\n // Вспомогательная функция для мобильных размеров кнопок\n const getMobileButtonStyles = (type: 'small' | 'medium' | 'large' = 'medium') => {\n if (!isMobileDevice()) {\n return {\n padding: \"12px 24px\",\n fontSize: \"16px\",\n minWidth: \"auto\"\n };\n }\n\n switch (type) {\n case 'small':\n return {\n padding: \"4px 6px\",\n fontSize: \"9px\",\n minWidth: \"40px\"\n };\n case 'medium':\n return {\n padding: \"5px 8px\",\n fontSize: \"10px\",\n minWidth: \"50px\"\n };\n case 'large':\n return {\n padding: \"6px 10px\",\n fontSize: \"11px\",\n minWidth: \"60px\"\n };\n }\n };\n\n useEffect(() => {\n globalReset();\n return () => {\n document.body.style.overflow = \"\";\n };\n }, []);\n\n const [stage, setStage] = useState<Stage>(\"select\");\n const [rounds, setRounds] = useState<number | null>(null);\n const [timePerRound, setTimePerRound] = useState<number | null>(null);\n const [sentences, setSentences] = useState<string[]>([]);\n const [currentRound, setCurrentRound] = useState(0);\n const [words, setWords] = useState<Token[]>([]);\n const [selected, setSelected] = useState<Token[]>([]);\n const [timeLeft, setTimeLeft] = useState(20);\n const [score, setScore] = useState(0);\n const [countdown, setCountdown] = useState<number | null>(null);\n const [resultType, setResultType] = useState<\"correct\" | \"almost\" | \"wrong\" | null>(null);\n const [timeExpired, setTimeExpired] = useState(false);\n const [bestScore, setBestScore] = useState<number>(\n Number(localStorage.getItem(\"magicSentenceBest\")) || 0\n );\n const timerRef = useRef<number | null>(null);\n const [hover, setHover] = useState<{ list: ListName | null; index: number | null; side: \"left\" | \"right\" | null }>({ list: null, index: null, side: null });\n\n // Адаптивность\n const [isMobile, setIsMobile] = useState(false);\n const [scale, setScale] = useState(1);\n const [containerSize, setContainerSize] = useState<number | null>(null);\n const [isDesktopLayout, setIsDesktopLayout] = useState(false);\n const [isIPadMiniPortrait, setIsIPadMiniPortrait] = useState(false);\n const [isIPadMiniLandscape, setIsIPadMiniLandscape] = useState(false);\n const [isIPadAirPortrait, setIsIPadAirPortrait] = useState(false);\n const [isIPadAirLandscape, setIsIPadAirLandscape] = useState(false);\n const [isSurfaceDuoPortrait, setIsSurfaceDuoPortrait] = useState(false);\n const [isSurfaceDuoLandscape, setIsSurfaceDuoLandscape] = useState(false);\n const [isIPadProPortrait, setIsIPadProPortrait] = useState(false);\n const [isIPadProLandscape, setIsIPadProLandscape] = useState(false);\n\n // ✅ адаптив под мобилки, планшеты и десктоп\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 isLandscape = (width > height && mobile) || (width === 926 && height === 428) || (width === 932 && height === 430);\n const isSmallHeight = height < 700;\n \n // iPad размеры\n const isIPadMiniPortrait = width === 768 && height === 1024;\n const isIPadMiniLandscape = width === 1024 && height === 768;\n const isIPadAirPortrait = width === 820 && height === 1180;\n const isIPadAirLandscape = width === 1180 && height === 820;\n \n // Surface DUO размеры\n const isSurfaceDuoPortrait = width === 540 && height === 720;\n const isSurfaceDuoLandscape = width === 720 && height === 540;\n \n // iPad Pro размеры\n const isIPadProPortrait = width === 1024 && height === 1366;\n const isIPadProLandscape = width === 1366 && height === 1024;\n \n // Десктопные разрешения\n const desktopLayout = width >= 1200 && height >= 600 && !mobile;\n setIsDesktopLayout(desktopLayout);\n \n // Установка состояний для iPad и Surface DUO\n setIsIPadMiniPortrait(isIPadMiniPortrait);\n setIsIPadMiniLandscape(isIPadMiniLandscape);\n setIsIPadAirPortrait(isIPadAirPortrait);\n setIsIPadAirLandscape(isIPadAirLandscape);\n setIsSurfaceDuoPortrait(isSurfaceDuoPortrait);\n setIsSurfaceDuoLandscape(isSurfaceDuoLandscape);\n setIsIPadProPortrait(isIPadProPortrait);\n setIsIPadProLandscape(isIPadProLandscape);\n \n setIsMobile(mobile);\n\n // ✅ Адаптивные размеры контейнера\n if (mobile) {\n setContainerSize(null);\n setScale(1);\n } else if (isSmallHeight) {\n setContainerSize(null);\n setScale(1);\n } else {\n const minSize = 400;\n const maxSize = 1200;\n const finalSize = Math.min(1000, Math.min(width, height) * 0.9);\n setContainerSize(finalSize);\n setScale(1);\n }\n };\n resize();\n window.addEventListener(\"resize\", resize);\n return () => window.removeEventListener(\"resize\", resize);\n }, []);\n\n // =========================\n // DND HELPERS\n // =========================\n type ListName = \"bank\" | \"selected\";\n type DragPayload = { from: ListName; id: string };\n\n const moveToken = (\n from: ListName,\n to: ListName,\n id: string,\n insertIndex: number | null\n ) => {\n // Блокируем перемещение если время истекло\n if (timeExpired) return;\n\n let nextWords = [...words];\n let nextSelected = [...selected];\n\n const takeFrom = from === \"bank\" ? nextWords : nextSelected;\n const putTo = to === \"bank\" ? nextWords : nextSelected;\n\n const idx = takeFrom.findIndex((t) => t.id === id);\n if (idx === -1) return;\n const [token] = takeFrom.splice(idx, 1);\n\n let targetIndex = insertIndex;\n if (\n from === to &&\n targetIndex !== null &&\n targetIndex !== undefined\n ) {\n if (targetIndex > idx) targetIndex = targetIndex - 1;\n }\n\n if (\n targetIndex === null ||\n targetIndex === undefined ||\n targetIndex < 0 ||\n targetIndex > putTo.length\n ) {\n putTo.push(token);\n } else {\n putTo.splice(targetIndex, 0, token);\n }\n\n if (from === \"bank\") nextWords = takeFrom; else nextSelected = takeFrom;\n if (to === \"bank\") nextWords = putTo; else nextSelected = putTo;\n\n setWords(nextWords);\n setSelected(nextSelected);\n };\n\n const handleDropTo = (\n e: React.DragEvent,\n to: ListName,\n insertIndex: number | null\n ) => {\n e.preventDefault();\n \n // Блокируем drop если время истекло\n if (timeExpired) {\n setHover({ list: null, index: null, side: null });\n return;\n }\n\n const raw = e.dataTransfer.getData(\"application/x-token\") ||\n (() => {\n const fallbackId = e.dataTransfer.getData(\"text/plain\");\n if (!fallbackId) return \"\";\n const inBank = words.some((t) => t.id === fallbackId);\n const inSelected = selected.some((t) => t.id === fallbackId);\n const from: ListName | null = inBank ? \"bank\" : inSelected ? \"selected\" : null;\n return from ? JSON.stringify({ from, id: fallbackId }) : \"\";\n })();\n if (!raw) return;\n try {\n const payload = JSON.parse(raw) as DragPayload;\n if (!payload || !payload.id || !payload.from) return;\n moveToken(payload.from, to, payload.id, insertIndex);\n } catch {\n // ignore bad payload\n }\n setHover({ list: null, index: null, side: null });\n };\n\n // =========================\n // START / SETUP\n // =========================\n const handleSelect = (num: number) => {\n setRounds(num);\n setSentences(Array(num).fill(\"\"));\n setStage(\"time\");\n };\n\n const handleTimeSelect = (time: number) => {\n setTimePerRound(time);\n setStage(\"type\");\n };\n\n const handleChange = (index: number, value: string) => {\n // Ограничение на 41 символ (включая пробелы и точку)\n if (value.length > 41) {\n return;\n }\n \n // Проверка на латинские символы (a-z, A-Z, пробелы, цифры, знаки препинания)\n const latinRegex = /^[a-zA-Z0-9\\s.,!?;:'\"-]*$/;\n if (value && !latinRegex.test(value)) {\n return; // Не сохраняем, если есть нелатинские символы\n }\n \n const updated = [...sentences];\n updated[index] = value;\n setSentences(updated);\n \n // Валидация при вводе\n const validation = validateAllSentences(updated);\n if (!validation.isValid) {\n console.warn('Validation errors:', validation.errors);\n }\n };\n\n const normalizeSentence = (s: string) => s.trim().replace(/\\s+/g, \" \");\n\n // Адаптивный размер шрифта в зависимости от количества слов\n const getAdaptiveFontSize = (wordCount: number) => {\n if (wordCount <= 3) return 20;\n if (wordCount <= 5) return 18;\n if (wordCount <= 7) return 16;\n if (wordCount <= 9) return 14;\n return 12;\n };\n\n const startGame = () => {\n const hasEmpty = sentences.some((s) => s.trim().length === 0);\n if (hasEmpty) {\n return;\n }\n setSentences((prev) => prev.map((s) => normalizeSentence(s)));\n setScore(0);\n setCurrentRound(0);\n setCountdown(null); // Убираем цифровой отсчет\n setStage(\"getready\");\n };\n\n // GET READY с 3-секундной задержкой\n useEffect(() => {\n if (stage === \"getready\") {\n const t = setTimeout(() => startRound(0), 3000); // 3 секунды задержки\n return () => clearTimeout(t);\n }\n }, [stage]);\n\n const startRound = (index: number) => {\n const target = sentences[index];\n if (!target) return;\n const shuffled = shuffle(target\n .trim()\n .split(/\\s+/)\n .filter(Boolean)\n );\n const tokens: Token[] = shuffled.map((w, i) => ({\n id: `${Date.now()}-${index}-${i}-${Math.random().toString(36).slice(2)}`,\n text: w,\n }));\n setWords(tokens);\n setSelected([]);\n setCurrentRound(index);\n setTimeLeft(timePerRound || 20); // Используем выбранное время\n setResultType(null); // Сбрасываем результат\n setTimeExpired(false); // Сбрасываем состояние истечения времени\n setStage(\"play\");\n };\n\n // TIMER\n useEffect(() => {\n if (stage === \"play\" && !timeExpired) {\n if (timerRef.current !== null) window.clearTimeout(timerRef.current);\n if (timeLeft > 0) {\n timerRef.current = window.setTimeout(() => setTimeLeft((t) => t - 1), 1000);\n } else {\n // Время истекло - показываем результат и кнопку NEXT\n setTimeExpired(true);\n // Вызываем handleNext с manual=false для подсчета результата\n const correct = sentences[currentRound];\n const correctWords = correct.trim().split(/\\s+/);\n const selectedTexts = selected.map((t) => t.text);\n \n // Считаем ошибки: недостающие слова + лишние слова + неправильный порядок\n const missingWords = correctWords.filter(word => !selectedTexts.includes(word)).length;\n const extraWords = selectedTexts.filter(word => !correctWords.includes(word)).length;\n const wrongOrder = correctWords.filter((w, i) => w !== selectedTexts[i]).length;\n \n // Общее количество ошибок = недостающие + лишние + неправильный порядок\n const errors = missingWords + extraWords + wrongOrder;\n\n // Показываем результат\n if (errors === 0) {\n setResultType(\"correct\");\n playSound(\"correct\");\n announceToScreenReader(\"Correct! Well done!\");\n } else if (errors === 1) {\n setResultType(\"almost\");\n playSound(\"half\");\n announceToScreenReader(\"Almost correct! Just one mistake.\");\n } else {\n setResultType(\"wrong\");\n playSound(\"wrong\");\n announceToScreenReader(\"Not quite right. Keep trying!\");\n }\n }\n }\n return () => {\n if (timerRef.current !== null) window.clearTimeout(timerRef.current);\n };\n }, [stage, timeLeft, timeExpired, sentences, currentRound, selected]);\n\n // =========================\n // SCORING / NEXT ROUND\n // =========================\n const handleNext = (manual = true) => {\n // Если время истекло и это ручное нажатие NEXT, переходим к следующему раунду\n if (timeExpired && manual) {\n if (currentRound + 1 < (rounds || 0)) {\n startRound(currentRound + 1);\n } else {\n setStage(\"results\");\n setTimeout(() => triggerConfetti(), 600);\n }\n return;\n }\n\n // Если время не истекло, обрабатываем ручное нажатие\n if (manual && !timeExpired) {\n const correct = sentences[currentRound];\n const correctWords = correct.trim().split(/\\s+/);\n const selectedTexts = selected.map((t) => t.text);\n \n // Считаем ошибки: недостающие слова + лишние слова + неправильный порядок\n const missingWords = correctWords.filter(word => !selectedTexts.includes(word)).length;\n const extraWords = selectedTexts.filter(word => !correctWords.includes(word)).length;\n const wrongOrder = correctWords.filter((w, i) => w !== selectedTexts[i]).length;\n \n // Общее количество ошибок = недостающие + лишние + неправильный порядок\n const errors = missingWords + extraWords + wrongOrder;\n\n if (errors === 0 && timeLeft > 0) {\n setScore((s) => s + 1);\n setResultType(\"correct\");\n playSound(\"correct\");\n announceToScreenReader(\"Correct! Well done!\");\n } else if (errors === 1) {\n setScore((s) => s + 0.5);\n setResultType(\"almost\");\n playSound(\"half\");\n announceToScreenReader(\"Almost correct! Just one mistake.\");\n } else {\n setResultType(\"wrong\");\n playSound(\"wrong\");\n announceToScreenReader(\"Not quite right. Keep trying!\");\n }\n\n // Переходим к следующему раунду\n if (currentRound + 1 < (rounds || 0)) {\n setTimeout(() => startRound(currentRound + 1), 800);\n } else {\n setStage(\"results\");\n setTimeout(() => triggerConfetti(), 600);\n }\n }\n };\n\n // =========================\n // SAVE BEST SCORE\n // =========================\n useEffect(() => {\n if (stage === \"results\" && score > bestScore) {\n setBestScore(score);\n localStorage.setItem(\"magicSentenceBest\", String(score));\n }\n }, [stage, score, bestScore]);\n\n // =========================\n // SOUND EFFECTS\n // =========================\n const playSound = (type: \"start\" | \"click\" | \"correct\" | \"half\" | \"wrong\") => {\n const ctx = new (window.AudioContext || (window as any).webkitAudioContext)();\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.connect(gain);\n gain.connect(ctx.destination);\n\n switch (type) {\n case \"start\": osc.frequency.value = 500; break;\n case \"click\": osc.frequency.value = 800; break;\n case \"correct\": osc.frequency.value = 1000; break;\n case \"half\": osc.frequency.value = 700; break;\n case \"wrong\": osc.frequency.value = 200; break;\n }\n gain.gain.setValueAtTime(0.1, ctx.currentTime);\n osc.start();\n osc.stop(ctx.currentTime + 0.2);\n };\n\n // =========================\n // CONFETTI EFFECT\n // =========================\n const triggerConfetti = () => {\n const duration = 2500;\n const end = Date.now() + duration;\n const colors = [\"#ec4c44\", \"#f7c948\", \"#6fcf97\", \"#56ccf2\", \"#bb6bd9\"];\n\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\")!;\n canvas.width = window.innerWidth;\n canvas.height = window.innerHeight;\n canvas.style.position = \"fixed\";\n canvas.style.top = \"0\";\n canvas.style.left = \"0\";\n canvas.style.pointerEvents = \"none\";\n document.body.appendChild(canvas);\n\n const pieces = Array.from({ length: 100 }).map(() => ({\n x: Math.random() * canvas.width,\n y: Math.random() * canvas.height - canvas.height,\n size: 6 + Math.random() * 6,\n color: colors[Math.floor(Math.random() * colors.length)],\n speed: 2 + Math.random() * 4,\n tilt: Math.random() * 2 * Math.PI,\n }));\n\n const draw = () => {\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n pieces.forEach((p) => {\n ctx.fillStyle = p.color;\n ctx.beginPath();\n ctx.ellipse(p.x, p.y, p.size, p.size / 2, p.tilt, 0, 2 * Math.PI);\n ctx.fill();\n p.y += p.speed;\n p.x += Math.sin(p.tilt);\n });\n if (Date.now() < end) requestAnimationFrame(draw);\n else document.body.removeChild(canvas);\n };\n draw();\n };\n\n // =========================\n // RENDER SCREENS\n // =========================\n const renderSelect = () => (\n <div style={styles.gmCenterScreen}>\n <h1 style={styles.gmHeadline1}>MAGIC SENTENCE</h1>\n <p style={styles.gmBodyM}>Select number of rounds</p>\n <div style={{ \n display: \"flex\", \n gap: isMobileDevice() ? \"8px\" : \"16px\",\n justifyContent: \"center\" \n }}>\n {[3, 4, 5].map((num) => (\n <button \n key={num} \n onClick={() => handleSelect(num)} \n style={{\n ...styles.gmButton,\n ...getMobileButtonStyles('medium')\n }}\n >\n {num} ROUNDS\n </button>\n ))}\n </div>\n </div>\n );\n\n const renderTime = () => (\n <div style={styles.gmCenterScreen}>\n <h1 style={styles.gmHeadline1}>MAGIC SENTENCE</h1>\n <p style={styles.gmBodyM}>Select time per round</p>\n <div style={{ \n display: \"flex\", \n gap: isMobileDevice() ? \"8px\" : \"16px\",\n justifyContent: \"center\" \n }}>\n {[15, 20, 30].map((time) => (\n <button \n key={time} \n onClick={() => handleTimeSelect(time)} \n style={{\n ...styles.gmButton,\n ...getMobileButtonStyles('medium')\n }}\n >\n {time}s\n </button>\n ))}\n </div>\n </div>\n );\n\n const renderType = () => (\n <div style={styles.gmCenterScreen}>\n <h2 style={{...styles.gmBodyM, marginBottom: \"0px\"}}>\n Type down {rounds} sentence{rounds && rounds > 1 ? \"s\" : \"\"} for your student\n </h2>\n <p style={{...styles.gmBodyS, marginBottom: \"16px\", marginTop: \"0px\", color: \"#6b7280\"}}>\n Maximum 41 characters per sentence\n </p>\n <div style={{ \n display: \"flex\", \n flexDirection: \"column\", \n gap: 12, \n width: \"auto\", // Автоматическая ширина по содержимому\n minWidth: \"fit-content\", // Минимальная ширина по содержимому\n maxWidth: \"600px\" // Ограничиваем максимальную ширину\n }}>\n {sentences.map((text, i) => (\n <input\n key={i}\n value={text}\n placeholder={`Sentence ${i + 1}`}\n onChange={(e) => handleChange(i, e.target.value)}\n style={{\n ...styles.gmInput,\n padding: isMobileDevice() ? \"8px 12px\" : \"12px 16px\",\n fontSize: isMobileDevice() ? \"14px\" : \"16px\",\n width: \"100%\", // Поля теперь будут шире благодаря увеличенной ширине контейнера\n textAlign: \"center\" // Центрируем placeholder текст\n }}\n />\n ))}\n </div>\n <button\n onClick={startGame}\n disabled={sentences.some((s) => s.trim().length === 0)}\n style={{\n ...styles.gmButton,\n marginTop: 30,\n background: sentences.some((s) => s.trim().length === 0) ? \"#ccc\" : \"#ec4c44\",\n cursor: sentences.some((s) => s.trim().length === 0) ? \"not-allowed\" : \"pointer\",\n ...getMobileButtonStyles('large')\n }}\n >\n PLAY\n </button>\n </div>\n );\n\n const renderGetReady = () => (\n <div style={styles.gmReadyWrapper}>\n <h1 style={{ \n ...styles.gmHeadline1,\n fontSize: isMobileDevice() ? \"36px\" : \"72px\", \n color: \"#ec4c44\", \n marginBottom: \"20px\",\n animation: \"pulse 1s ease-in-out infinite\"\n }}>\n GET READY\n </h1>\n <div style={styles.gmHourglass}>⏳</div>\n </div>\n );\n\n const renderPlay = () => (\n <div style={styles.gmGameLayout}>\n <h2 style={{ \n marginBottom: isMobileDevice() ? \"5px\" : \"10px\",\n fontSize: isMobileDevice() ? \"16px\" : \"20px\"\n }}>\n Round {currentRound + 1}/{rounds} — {timeExpired ? \"TIME'S UP!\" : `Time: ${timeLeft}s`}\n </h2>\n\n {/* Progress bar */}\n <div\n style={{\n width: \"60%\",\n height: isMobileDevice() ? \"8px\" : \"14px\",\n borderRadius: 8,\n background: \"#eee\",\n overflow: \"hidden\",\n marginBottom: isMobileDevice() ? \"10px\" : \"20px\",\n }}\n >\n <div\n style={{\n height: \"100%\",\n width: `${(timeLeft / (timePerRound || 20)) * 100}%`,\n background: timeLeft <= 5 ? \"#ec4c44\" : \"#4caf50\",\n transition: \"width 1s linear\",\n }}\n ></div>\n </div>\n\n {/* Word bank */}\n <div\n onDragOver={(e) => e.preventDefault()}\n onDrop={(e) => handleDropTo(e, \"bank\", null)}\n style={{\n display: \"flex\",\n flexWrap: shouldWrapWords() ? \"wrap\" : \"nowrap\",\n gap: isMobile || window.innerWidth < 768 ? \"6px\" : \"10px\",\n justifyContent: \"center\",\n marginBottom: isMobile || window.innerWidth < 768 ? \"15px\" : \"30px\",\n padding: isMobile || window.innerWidth < 768 ? \"5px\" : \"10px\",\n width: \"100%\",\n boxSizing: \"border-box\"\n }}\n >\n {words.map((t, idx) => (\n <div\n key={t.id}\n draggable={!timeExpired}\n role=\"button\"\n tabIndex={timeExpired ? -1 : 0}\n aria-label={timeExpired ? `Word: ${t.text} (time expired)` : createAriaLabel(\"Drag word\", t.text, \"to build sentence\")}\n onDragStart={(e) => {\n if (timeExpired) {\n e.preventDefault();\n return;\n }\n e.dataTransfer.setData(\n \"application/x-token\",\n JSON.stringify({ from: \"bank\", id: t.id })\n );\n e.dataTransfer.setData(\"text/plain\", t.id);\n announceToScreenReader(`Dragging word: ${t.text}`);\n }}\n onKeyDown={(e) => {\n if (timeExpired) return;\n handleKeyDown(e, () => moveToken(\"bank\", \"selected\", t.id, null));\n }}\n onDragOver={(e) => e.preventDefault()}\n onDrop={(e) => {\n const rect = (e.currentTarget as HTMLDivElement).getBoundingClientRect();\n const mid = rect.left + rect.width / 2;\n const insertIndex = e.clientX > mid ? idx + 1 : idx;\n setHover({ list: null, index: null, side: null });\n e.stopPropagation();\n handleDropTo(e, \"bank\", insertIndex);\n }}\n onDragEnter={(e) => {\n if (timeExpired) return;\n const rect = (e.currentTarget as HTMLDivElement).getBoundingClientRect();\n const mid = rect.left + rect.width / 2;\n setHover({ list: \"bank\", index: idx, side: e.clientX > mid ? \"right\" : \"left\" });\n }}\n onDragLeave={() => setHover({ list: null, index: null, side: null })}\n onClick={() => {\n if (timeExpired) return;\n moveToken(\"bank\", \"selected\", t.id, null);\n }}\n style={{\n padding: isMobile || window.innerWidth < 768 ? \"6px 10px\" : \"10px 16px\",\n borderRadius: isMobile || window.innerWidth < 768 ? \"6px\" : \"10px\",\n border: \"1px solid #ccc\",\n background: timeExpired ? \"#f0f0f0\" : \"#f9f9f9\",\n cursor: timeExpired ? \"not-allowed\" : \"pointer\",\n fontSize: isMobile || window.innerWidth < 768 ? \"12px\" : \"18px\",\n borderLeft: hover.list === \"bank\" && hover.index === idx && hover.side === \"left\" ? \"3px solid #3b82f6\" : \"1px solid #ccc\",\n borderRight: hover.list === \"bank\" && hover.index === idx && hover.side === \"right\" ? \"3px solid #3b82f6\" : \"1px solid #ccc\",\n flexShrink: 0,\n flexBasis: \"auto\",\n opacity: timeExpired ? 0.6 : 1,\n transition: \"opacity 0.3s ease\",\n }}\n >\n {t.text}\n </div>\n ))}\n </div>\n\n {/* Selected sentence */}\n <div\n onDragOver={(e) => e.preventDefault()}\n onDrop={(e) => handleDropTo(e, \"selected\", null)}\n style={{\n minHeight: isMobile || window.innerWidth < 768 ? \"50px\" : \"70px\",\n width: \"auto\", // Автоматическая ширина в зависимости от содержимого\n maxWidth: \"none\", // Убираем ограничение максимальной ширины\n minWidth: \"245px\", // Минимальная ширина для растягивания\n border: resultType === \"correct\" ? \"2px dashed #4caf50\" : \n resultType === \"almost\" ? \"2px dashed #ff9800\" : \n resultType === \"wrong\" ? \"2px dashed #f44336\" : \"2px dashed #ccc\",\n borderRadius: isMobile || window.innerWidth < 768 ? \"8px\" : \"12px\",\n padding: isMobile || window.innerWidth < 768 ? \"8px\" : \"12px\",\n display: \"flex\",\n flexWrap: shouldWrapWords() ? \"wrap\" : \"nowrap\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: `${getAdaptiveFontSize(selected.length)}px`,\n background: resultType === \"correct\" ? \"#e8f5e8\" : \n resultType === \"almost\" ? \"#fff3e0\" : \n resultType === \"wrong\" ? \"#ffebee\" : \"#fafafa\",\n overflowX: shouldWrapWords() ? \"hidden\" : \"auto\",\n whiteSpace: shouldWrapWords() ? \"normal\" : \"nowrap\",\n }}\n >\n {selected.map((t, idx) => (\n <span\n key={t.id}\n draggable={!timeExpired}\n onDragStart={(e) => {\n if (timeExpired) {\n e.preventDefault();\n return;\n }\n e.dataTransfer.setData(\n \"application/x-token\",\n JSON.stringify({ from: \"selected\", id: t.id })\n );\n e.dataTransfer.setData(\"text/plain\", t.id);\n }}\n onDragOver={(e) => e.preventDefault()}\n onDrop={(e) => {\n const rect = (e.currentTarget as HTMLSpanElement).getBoundingClientRect();\n const mid = rect.left + rect.width / 2;\n const insertIndex = e.clientX > mid ? idx + 1 : idx;\n setHover({ list: null, index: null, side: null });\n e.stopPropagation();\n handleDropTo(e, \"selected\", insertIndex);\n }}\n onDragEnter={(e) => {\n if (timeExpired) return;\n const rect = (e.currentTarget as HTMLSpanElement).getBoundingClientRect();\n const mid = rect.left + rect.width / 2;\n setHover({ list: \"selected\", index: idx, side: e.clientX > mid ? \"right\" : \"left\" });\n }}\n onDragLeave={() => setHover({ list: null, index: null, side: null })}\n onClick={() => {\n if (timeExpired) return;\n moveToken(\"selected\", \"bank\", t.id, null);\n }}\n title={timeExpired ? \"Time expired\" : \"Click to remove back to bank\"}\n style={{\n padding: isMobileDevice() ? \"4px 6px\" : \"6px 10px\",\n margin: isMobileDevice() ? \"2px\" : \"4px\",\n borderRadius: isMobileDevice() ? \"4px\" : \"8px\",\n background: timeExpired ? \"#f0f0f0\" : \"#ffe9e7\",\n border: timeExpired ? \"1px solid #ccc\" : \"1px solid #ec4c44\",\n borderLeft: hover.list === \"selected\" && hover.index === idx && hover.side === \"left\" ? \"3px solid #3b82f6\" : undefined,\n borderRight: hover.list === \"selected\" && hover.index === idx && hover.side === \"right\" ? \"3px solid #3b82f6\" : undefined,\n cursor: timeExpired ? \"not-allowed\" : \"pointer\",\n userSelect: \"none\",\n fontSize: `${getAdaptiveFontSize(selected.length)}px`, // Адаптивный размер шрифта для слов\n fontFamily: '\"Roboto\", system-ui, -apple-system, \"Segoe UI\", Roboto, Arial, sans-serif', // Более плотный шрифт\n whiteSpace: \"nowrap\", // Запрещаем перенос слов\n opacity: timeExpired ? 0.6 : 1,\n transition: \"opacity 0.3s ease\",\n }}\n >\n {t.text}\n </span>\n ))}\n </div>\n\n <button\n onClick={() => handleNext(true)}\n disabled={!timeExpired && selected.length === 0}\n style={{\n marginTop: isMobileDevice() ? \"15px\" : \"30px\",\n fontSize: isMobileDevice() ? \"14px\" : \"20px\",\n padding: isMobileDevice() ? \"6px 12px\" : \"10px 24px\",\n borderRadius: isMobileDevice() ? \"8px\" : \"12px\",\n background: (timeExpired || selected.length > 0) ? \"#ec4c44\" : \"#ccc\",\n color: \"white\",\n border: \"none\",\n cursor: (timeExpired || selected.length > 0) ? \"pointer\" : \"not-allowed\",\n }}\n >\n {timeExpired ? \"NEXT\" : \"NEXT\"}\n </button>\n </div>\n );\n\n const renderResults = () => (\n <div style={styles.gmCenterScreen}>\n <h1 style={{\n ...styles.gmHeadline1,\n marginTop: (isMobile && window.innerWidth > window.innerHeight) || (window.innerWidth === 896 && window.innerHeight === 414) || (window.innerWidth === 844 && window.innerHeight === 390) || (window.innerWidth === 926 && window.innerHeight === 428) || (window.innerWidth === 932 && window.innerHeight === 430) || isIPadMiniPortrait || isIPadMiniLandscape || isIPadAirPortrait || isIPadAirLandscape || isSurfaceDuoPortrait || isSurfaceDuoLandscape || isIPadProPortrait || isIPadProLandscape ? \"0px\" : \"0px\",\n marginBottom: (isMobile && window.innerWidth > window.innerHeight) || (window.innerWidth === 896 && window.innerHeight === 414) || (window.innerWidth === 844 && window.innerHeight === 390) || (window.innerWidth === 926 && window.innerHeight === 428) || (window.innerWidth === 932 && window.innerHeight === 430) || isIPadMiniPortrait || isIPadMiniLandscape || isIPadAirPortrait || isIPadAirLandscape || isSurfaceDuoPortrait || isSurfaceDuoLandscape || isIPadProPortrait || isIPadProLandscape ? \"2px\" : \"10px\",\n fontSize: (isMobile && window.innerWidth <= 375 && window.innerHeight <= 667) || (window.innerWidth === 896 && window.innerHeight === 414) || (window.innerWidth === 844 && window.innerHeight === 390) || (window.innerWidth === 926 && window.innerHeight === 428) || (window.innerWidth === 932 && window.innerHeight === 430) ? \"32px\" : \"clamp(28px, 4vw, 40px)\"\n }}>\n Game Over 🎯\n </h1>\n <h2 style={{\n ...styles.gmHeadline2,\n marginTop: (isMobile && window.innerWidth > window.innerHeight) || (window.innerWidth === 896 && window.innerHeight === 414) || (window.innerWidth === 844 && window.innerHeight === 390) || (window.innerWidth === 926 && window.innerHeight === 428) || (window.innerWidth === 932 && window.innerHeight === 430) || isIPadMiniPortrait || isIPadMiniLandscape || isIPadAirPortrait || isIPadAirLandscape || isSurfaceDuoPortrait || isSurfaceDuoLandscape || isIPadProPortrait || isIPadProLandscape ? \"0px\" : \"0px\",\n marginBottom: (isMobile && window.innerWidth > window.innerHeight) || (window.innerWidth === 896 && window.innerHeight === 414) || (window.innerWidth === 844 && window.innerHeight === 390) || (window.innerWidth === 926 && window.innerHeight === 428) || (window.innerWidth === 932 && window.innerHeight === 430) || isIPadMiniPortrait || isIPadMiniLandscape || isIPadAirPortrait || isIPadAirLandscape || isSurfaceDuoPortrait || isSurfaceDuoLandscape || isIPadProPortrait || isIPadProLandscape ? \"2px\" : \"16px\",\n fontSize: (isMobile && window.innerWidth <= 375 && window.innerHeight <= 667) || (window.innerWidth === 896 && window.innerHeight === 414) || (window.innerWidth === 844 && window.innerHeight === 390) || (window.innerWidth === 926 && window.innerHeight === 428) || (window.innerWidth === 932 && window.innerHeight === 430) ? \"18px\" : \"24px\"\n }}>\n Your score: {score} out of {rounds}\n </h2>\n <p style={{ \n ...styles.gmBodyM, \n color: \"#10b981\", \n marginTop: (isMobile && window.innerWidth > window.innerHeight) || (window.innerWidth === 896 && window.innerHeight === 414) || (window.innerWidth === 844 && window.innerHeight === 390) || (window.innerWidth === 926 && window.innerHeight === 428) || (window.innerWidth === 932 && window.innerHeight === 430) || isIPadMiniPortrait || isIPadMiniLandscape || isIPadAirPortrait || isIPadAirLandscape || isSurfaceDuoPortrait || isSurfaceDuoLandscape || isIPadProPortrait || isIPadProLandscape ? \"0px\" : \"12px\",\n marginBottom: (isMobile && window.innerWidth > window.innerHeight) || (window.innerWidth === 896 && window.innerHeight === 414) || (window.innerWidth === 844 && window.innerHeight === 390) || (window.innerWidth === 926 && window.innerHeight === 428) || (window.innerWidth === 932 && window.innerHeight === 430) || isIPadMiniPortrait || isIPadMiniLandscape || isIPadAirPortrait || isIPadAirLandscape || isSurfaceDuoPortrait || isSurfaceDuoLandscape || isIPadProPortrait || isIPadProLandscape ? \"2px\" : \"16px\",\n fontSize: (isMobile && window.innerWidth <= 375 && window.innerHeight <= 667) || (window.innerWidth === 896 && window.innerHeight === 414) || (window.innerWidth === 844 && window.innerHeight === 390) || (window.innerWidth === 926 && window.innerHeight === 428) || (window.innerWidth === 932 && window.innerHeight === 430) ? \"14px\" : \"16px\"\n }}>\n Best score: {bestScore}\n </p>\n\n <div style={{ \n display: \"flex\", \n gap: (isMobile && window.innerWidth > window.innerHeight) || (isMobile && window.innerWidth <= 375 && window.innerHeight <= 667) || (window.innerWidth === 896 && window.innerHeight === 414) || (window.innerWidth === 844 && window.innerHeight === 390) || (window.innerWidth === 926 && window.innerHeight === 428) || (window.innerWidth === 932 && window.innerHeight === 430) ? \"6px\" : \"12px\", \n marginTop: (isMobile && window.innerWidth > window.innerHeight) || (isMobile && window.innerWidth <= 375 && window.innerHeight <= 667) || (window.innerWidth === 896 && window.innerHeight === 414) || (window.innerWidth === 844 && window.innerHeight === 390) || (window.innerWidth === 926 && window.innerHeight === 428) || (window.innerWidth === 932 && window.innerHeight === 430) ? \"2px\" : (window.innerWidth === 1366 && window.innerHeight === 766) || (window.innerWidth === 1366 && window.innerHeight === 768) || (window.innerWidth === 1280 && window.innerHeight === 720) || (window.innerWidth === 1440 && window.innerHeight === 900) || isDesktopLayout ? \"12px\" : \"24px\"\n }}>\n <button\n onClick={() => {\n triggerConfetti();\n playSound(\"start\");\n setTimeout(() => {\n setStage(\"getready\");\n setCountdown(null);\n setTimeExpired(false);\n }, 800);\n }}\n style={{\n ...styles.gmButton,\n ...getMobileButtonStyles('medium')\n }}\n >\n 🔁 Play again\n </button>\n\n <button\n onClick={() => {\n playSound(\"click\");\n setStage(\"select\");\n setRounds(null);\n setTimePerRound(null);\n setSentences([]);\n setScore(0);\n setSelected([]);\n setTimeExpired(false);\n }}\n style={{\n ...styles.gmButton,\n ...getMobileButtonStyles('medium')\n }}\n >\n ⬅️ Exit\n </button>\n </div>\n </div>\n );\n\n // Определяем URL логотипа\n const logoSrc = logoUrl || \n (baseURL \n ? `${baseURL.endsWith('/') ? baseURL.slice(0, -1) : baseURL}/logo.svg`\n : (typeof window !== 'undefined' && window.origin\n ? `${window.origin}/browser/speakid/games/magic%20sentence/logo.svg`\n : null));\n\n // Условие для отображения логотипа\n const shouldShowLogo = !isMobile && \n showLogo && \n !(window.innerWidth > window.innerHeight) && \n window.innerHeight >= 700;\n\n return (\n <div\n ref={containerRef}\n style={{\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n background: \"linear-gradient(to bottom, #fff8f8 0%, #f9fafb 100%)\",\n transition: \"background 0.3s ease\",\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 || 1000),\n height: isMobile ? \"100%\" : (containerSize || 1000),\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n overflow: \"hidden\",\n borderRadius: isMobile ? 0 : \"20px\",\n background: \"linear-gradient(to bottom, #fff8f8 0%, #f9fafb 100%)\",\n boxShadow: isMobile ? \"none\" : \"0 0 40px rgba(0,0,0,0.1)\",\n margin: isMobile ? \"0 auto\" : \"unset\",\n position: \"relative\",\n }}\n >\n <div\n style={{\n transform: \"none\",\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n }}\n >\n <div id=\"magic-sentence-root\">\n {shouldShowLogo && (\n <div style={{\n ...styles.gmLogoFixed,\n display: 'block'\n }}>\n {logoSrc ? (\n <img\n src={logoSrc}\n alt=\"SPEAKID Logo\"\n style={styles.gmLogoImg}\n loading=\"lazy\"\n />\n ) : (\n <div style={styles.gmLogoImg}>\n SPEAKID\n </div>\n )}\n </div>\n )}\n {stage === \"select\" && renderSelect()}\n {stage === \"time\" && renderTime()}\n {stage === \"type\" && renderType()}\n {stage === \"getready\" && renderGetReady()}\n {stage === \"play\" && renderPlay()}\n {stage === \"results\" && renderResults()}\n </div>\n </div>\n </div>\n </div>\n );\n}","import React, { Component, ErrorInfo, ReactNode } from 'react';\n\ninterface Props {\n children: ReactNode;\n fallback?: ReactNode;\n}\n\ninterface State {\n hasError: boolean;\n error?: Error;\n errorInfo?: ErrorInfo;\n}\n\nexport class ErrorBoundary extends Component<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(error: Error): State {\n return {\n hasError: true,\n error,\n };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n console.error('Game Error:', error, errorInfo);\n \n // В реальном приложении здесь можно отправить ошибку в аналитику\n // analytics.track('game_error', { error: error.message, stack: error.stack });\n \n this.setState({\n error,\n errorInfo,\n });\n }\n\n handleReset = () => {\n this.setState({ hasError: false, error: undefined, errorInfo: undefined });\n };\n\n render() {\n if (this.state.hasError) {\n if (this.props.fallback) {\n return this.props.fallback;\n }\n\n return (\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '100vh',\n padding: '20px',\n textAlign: 'center',\n backgroundColor: '#fef2f2',\n color: '#dc2626',\n fontFamily: 'system-ui, sans-serif'\n }}>\n <h1 style={{ fontSize: '24px', marginBottom: '16px' }}>\n 🚨 Oops! Something went wrong\n </h1>\n <p style={{ fontSize: '16px', marginBottom: '24px', maxWidth: '500px' }}>\n The game encountered an unexpected error. Don't worry, your progress is saved!\n </p>\n \n <button\n onClick={this.handleReset}\n style={{\n padding: '12px 24px',\n fontSize: '16px',\n backgroundColor: '#dc2626',\n color: 'white',\n border: 'none',\n borderRadius: '8px',\n cursor: 'pointer',\n transition: 'background-color 0.2s'\n }}\n onMouseOver={(e) => e.currentTarget.style.backgroundColor = '#b91c1c'}\n onMouseOut={(e) => e.currentTarget.style.backgroundColor = '#dc2626'}\n >\n 🔄 Restart Game\n </button>\n \n {typeof process !== 'undefined' && process.env.NODE_ENV === 'development' && this.state.error && (\n <details style={{ marginTop: '20px', textAlign: 'left', maxWidth: '600px' }}>\n <summary style={{ cursor: 'pointer', fontSize: '14px' }}>\n Technical Details (Development Only)\n </summary>\n <pre style={{\n backgroundColor: '#f3f4f6',\n padding: '12px',\n borderRadius: '4px',\n fontSize: '12px',\n overflow: 'auto',\n marginTop: '8px'\n }}>\n {this.state.error.toString()}\n {this.state.errorInfo?.componentStack}\n </pre>\n </details>\n )}\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n\n"],"names":["REACT_ELEMENT_TYPE","REACT_FRAGMENT_TYPE","jsxProd","type","config","maybeKey","key","propName","reactJsxRuntime_production","getComponentNameFromType","REACT_CLIENT_REFERENCE","REACT_PROFILER_TYPE","REACT_STRICT_MODE_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_ACTIVITY_TYPE","REACT_PORTAL_TYPE","REACT_CONTEXT_TYPE","REACT_CONSUMER_TYPE","REACT_FORWARD_REF_TYPE","innerType","REACT_MEMO_TYPE","REACT_LAZY_TYPE","testStringCoercion","value","checkKeyStringCoercion","JSCompiler_inline_result","JSCompiler_temp_const","JSCompiler_inline_result$jscomp$0","getTaskName","name","getOwner","dispatcher","ReactSharedInternals","UnknownOwner","hasValidKey","hasOwnProperty","getter","defineKeyPropWarningGetter","props","displayName","warnAboutAccessingKey","specialPropKeyWarningShown","elementRefGetterWithDeprecationWarning","componentName","didWarnAboutElementRef","ReactElement","owner","debugStack","debugTask","refProp","jsxDEVImpl","isStaticChildren","children","isArrayImpl","validateChildKeys","keys","k","didWarnAboutKeySpread","node","isValidElement","object","React","require$$0","createTask","callStackForError","unknownOwnerDebugStack","unknownOwnerDebugTask","reactJsxRuntime_development","trackActualOwner","jsxRuntimeModule","require$$1","keyframes","styleTag","animations","styles","useValidation","errors","setErrors","useState","validateSentence","useCallback","sentence","index","allSentences","newErrors","duplicateIndex","s","i","validateAllSentences","sentences","allErrors","result","error","clearErrors","createAriaLabel","action","word","context","handleKeyDown","event","allowedKeys","announceToScreenReader","message","announcement","globalReset","style","shuffle","arr","Game","logoUrl","showLogo","baseURL","containerRef","useRef","validationErrors","shouldWrapWords","isMobile","isMobileDevice","getMobileButtonStyles","useEffect","stage","setStage","rounds","setRounds","timePerRound","setTimePerRound","setSentences","currentRound","setCurrentRound","words","setWords","selected","setSelected","timeLeft","setTimeLeft","score","setScore","countdown","setCountdown","resultType","setResultType","timeExpired","setTimeExpired","bestScore","setBestScore","timerRef","hover","setHover","setIsMobile","scale","setScale","containerSize","setContainerSize","isDesktopLayout","setIsDesktopLayout","isIPadMiniPortrait","setIsIPadMiniPortrait","isIPadMiniLandscape","setIsIPadMiniLandscape","isIPadAirPortrait","setIsIPadAirPortrait","isIPadAirLandscape","setIsIPadAirLandscape","isSurfaceDuoPortrait","setIsSurfaceDuoPortrait","isSurfaceDuoLandscape","setIsSurfaceDuoLandscape","isIPadProPortrait","setIsIPadProPortrait","isIPadProLandscape","setIsIPadProLandscape","resize","width","height","mobile","isSmallHeight","desktopLayout","finalSize","moveToken","from","to","id","insertIndex","nextWords","nextSelected","takeFrom","putTo","idx","t","token","targetIndex","handleDropTo","e","raw","fallbackId","inBank","inSelected","payload","handleSelect","num","handleTimeSelect","time","handleChange","updated","validation","normalizeSentence","getAdaptiveFontSize","wordCount","startGame","prev","startRound","target","tokens","w","correctWords","selectedTexts","missingWords","extraWords","wrongOrder","playSound","handleNext","manual","triggerConfetti","ctx","osc","gain","end","colors","canvas","pieces","draw","renderSelect","jsxs","jsx","renderTime","renderType","text","renderGetReady","renderPlay","rect","mid","renderResults","logoSrc","shouldShowLogo","ErrorBoundary","Component","errorInfo"],"mappings":"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","x_google_ignoreList":[0,1,2]}
1
+ {"version":3,"file":"speakid-build-a-sentence.umd.js","sources":["../node_modules/react/cjs/react-jsx-runtime.production.js","../node_modules/react/cjs/react-jsx-runtime.development.js","../node_modules/react/jsx-runtime.js","../src/Game.styles.ts","../src/hooks/useValidation.ts","../src/utils/accessibility.ts","../src/Game.tsx","../src/components/ErrorBoundary.tsx"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(type, key, props, owner, debugStack, debugTask) {\n var refProp = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== refProp ? refProp : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n maybeKey,\n getOwner(),\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n isValidElement(node)\n ? node._store && (node._store.validated = 1)\n : \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_LAZY_TYPE &&\n (\"fulfilled\" === node._payload.status\n ? isValidElement(node._payload.value) &&\n node._payload.value._store &&\n (node._payload.value._store.validated = 1)\n : node._store && (node._store.validated = 1));\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import { CSSProperties } from \"react\";\n\n// ===== Добавляем анимации в <head> с уникальным ID =====\nconst keyframes = `\n @keyframes magic-sentence-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n \n @keyframes magic-sentence-pulse {\n 0%, 100% { transform: scale(1); }\n 50% { transform: scale(1.05); }\n }\n \n @keyframes magic-sentence-shake {\n 0%, 100% { transform: translateX(0); }\n 25% { transform: translateX(-5px); }\n 75% { transform: translateX(5px); }\n }\n \n @keyframes magic-sentence-slideIn {\n from { transform: translateY(-20px); opacity: 0; }\n to { transform: translateY(0); opacity: 1; }\n }\n \n @keyframes magic-sentence-bounce {\n 0%, 20%, 53%, 80%, 100% { transform: translate3d(0,0,0); }\n 40%, 43% { transform: translate3d(0, -8px, 0); }\n 70% { transform: translate3d(0, -4px, 0); }\n 90% { transform: translate3d(0, -2px, 0); }\n }\n \n @keyframes magic-sentence-glow {\n 0%, 100% { box-shadow: 0 0 5px rgba(76, 175, 80, 0.5); }\n 50% { box-shadow: 0 0 20px rgba(76, 175, 80, 0.8), 0 0 30px rgba(76, 175, 80, 0.6); }\n }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"magic-sentence-keyframes\")) {\n const styleTag = document.createElement(\"style\");\n styleTag.id = \"magic-sentence-keyframes\";\n styleTag.innerHTML = keyframes;\n document.head.appendChild(styleTag);\n}\n\n// ===== Анимации =====\nconst animations = {\n spin: {\n animation: \"magic-sentence-spin 1.4s linear infinite\",\n },\n pulse: {\n animation: \"magic-sentence-pulse 0.6s ease-in-out\",\n },\n shake: {\n animation: \"magic-sentence-shake 0.4s ease-in-out\",\n },\n slideIn: {\n animation: \"magic-sentence-slideIn 0.3s ease-out\",\n },\n bounce: {\n animation: \"magic-sentence-bounce 0.6s ease-in-out\",\n },\n glow: {\n animation: \"magic-sentence-glow 1s ease-in-out infinite\",\n },\n};\n\n// ===== Основные стили =====\nexport const styles: Record<string, CSSProperties> = {\n gmCenterScreen: {\n position: \"relative\",\n zIndex: 1,\n // use percent so the component fits inside the centered square container\n // (100vh caused overflow on tablets because it measured the viewport, not the container)\n minHeight: \"100%\",\n width: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n alignItems: \"center\",\n textAlign: \"center\",\n color: \"#1f2937\",\n padding: \"24px 16px\",\n boxSizing: \"border-box\",\n transform: \"translateY(20px)\", // чуть вниз, чтобы компенсировать логотип\n },\n\n gmHeadline1: {\n fontWeight: 700,\n fontSize: \"clamp(28px, 4vw, 40px)\",\n lineHeight: \"110%\",\n },\n\n gmHeadline2: {\n fontWeight: 600,\n fontSize: \"24px\",\n lineHeight: \"120%\",\n },\n\n gmHeadline3: {\n fontWeight: 600,\n fontSize: \"18px\",\n lineHeight: \"130%\",\n },\n\n gmBodyL: {\n fontWeight: 400,\n fontSize: \"18px\",\n lineHeight: \"140%\",\n },\n\n gmBodyM: {\n fontWeight: 400,\n fontSize: \"16px\",\n lineHeight: \"140%\",\n },\n\n gmBodyS: {\n fontWeight: 400,\n fontSize: \"14px\",\n lineHeight: \"140%\",\n color: \"#6b7280\",\n },\n\n gmButton: {\n fontFamily:\n '\"Geist\", system-ui, -apple-system, \"Segoe UI\", Roboto, Arial, \"Noto Sans\"',\n fontWeight: 600,\n fontSize: \"16px\",\n padding: \"10px 16px\",\n borderRadius: \"12px\",\n border: \"1px solid #e5e7eb\",\n background: \"#ec4c44\",\n color: \"#ffffff\",\n cursor: \"pointer\",\n boxShadow: \"0 6px 18px rgba(236, 76, 68, .18)\",\n transition:\n \"transform .06s ease, box-shadow .2s ease, background .2s ease, opacity .2s ease\",\n },\n\n gmButtonActive: {\n background: \"#333\",\n color: \"#fff\",\n },\n\n gmGameLayout: {\n position: \"relative\",\n width: \"100%\",\n // allow the layout to expand within the square container for tablets/laptops\n maxWidth: \"none\",\n // should fill the parent square, not the full viewport\n minHeight: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n textAlign: \"center\",\n color: \"#1f2937\",\n padding: \"16px 8px\",\n margin: \"0 auto\",\n },\n\n gmGrid: {\n width: \"100%\",\n // let the grid use all available space; sizing is controlled in Game.tsx\n maxWidth: \"none\",\n margin: \"0 auto\",\n display: \"grid\",\n // defaults; overridden responsively in Game.tsx\n gridTemplateColumns: \"repeat(3, 210px)\",\n gridAutoRows: \"210px\",\n gap: \"20px\",\n justifyContent: \"center\",\n },\n\n gmCard: {\n border: \"1px solid #e5e7eb\",\n borderRadius: \"16px\",\n background: \"#f9f9f9\",\n aspectRatio: \"1 / 1\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n overflow: \"hidden\",\n transition:\n \"transform .2s ease, box-shadow .2s ease, border-color .2s ease\",\n },\n\n gmCorrect: {\n border: \"2px solid #10b981\",\n boxShadow: \"0 0 18px rgba(16,185,129,.45)\",\n background: \"#ecfdf5\",\n },\n\n gmWrong: {\n border: \"2px solid #ec4c44\",\n boxShadow: \"0 0 18px rgba(236,76,68,.35)\",\n background: \"#fef2f2\",\n },\n\n gmInput: {\n padding: \"6px 10px\",\n borderRadius: \"6px\",\n border: \"1px solid #ccc\",\n fontSize: \"16px\",\n fontFamily: '\"Geist\", system-ui',\n width: \"160px\",\n },\n\n gmTable: {\n marginTop: \"20px\",\n marginBottom: \"32px\",\n borderCollapse: \"collapse\",\n width: \"100%\",\n maxWidth: \"520px\",\n tableLayout: \"fixed\",\n textAlign: \"center\",\n },\n\n gmTableCell: {\n padding: \"8px 12px\",\n borderBottom: \"1px solid #e5e7eb\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n },\n\n // ✅ Обновлено под стандарты SPEAKID\n gmLogoFixed: {\n position: \"absolute\",\n top: \"16px\",\n left: \"16px\",\n width: \"120px\",\n zIndex: 30,\n pointerEvents: \"none\",\n background: \"transparent\",\n transform: \"none\",\n willChange: \"auto\",\n },\n\n gmLogoImg: {\n height: \"clamp(28px, 5vw, 40px)\",\n width: \"auto\",\n background: \"transparent\",\n backgroundImage: \"url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9IjQwIiB2aWV3Qm94PSIwIDAgMTAwIDQwIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8dGV4dCB4PSI1MCIgeT0iMjUiIGZvbnQtZmFtaWx5PSJBcmlhbCwgc2Fucy1zZXJpZiIgZm9udC1zaXplPSIyMCIgZm9udC13ZWlnaHQ9ImJvbGQiIGZpbGw9IiNlYzRjNDQiIHRleHQtYW5jaG9yPSJtaWRkbGUiPlNQRUFLSUQ8L3RleHQ+Cjwvc3ZnPgo=')\",\n backgroundSize: \"contain\",\n backgroundRepeat: \"no-repeat\",\n backgroundPosition: \"center\",\n transform: \"translateZ(0)\",\n backfaceVisibility: \"hidden\",\n WebkitFontSmoothing: \"antialiased\",\n objectFit: \"contain\",\n imageRendering: \"auto\",\n },\n\n gmReadyWrapper: {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n // use percent so the wrapper scales with the container square\n height: \"60%\",\n gap: \"16px\",\n },\n\n gmHourglass: {\n fontSize: \"42px\",\n ...animations.spin,\n },\n\n // ===== Анимационные стили =====\n ...animations,\n};","import { useState, useCallback } from 'react';\n\nexport interface ValidationError {\n type: 'length' | 'characters' | 'empty' | 'duplicate';\n message: string;\n}\n\nexport interface ValidationResult {\n isValid: boolean;\n errors: ValidationError[];\n}\n\nexport const useValidation = () => {\n const [errors, setErrors] = useState<ValidationError[]>([]);\n\n const validateSentence = useCallback((sentence: string, index: number, allSentences: string[]): ValidationResult => {\n const newErrors: ValidationError[] = [];\n\n // Проверка на пустоту\n if (!sentence.trim()) {\n newErrors.push({\n type: 'empty',\n message: 'Sentence cannot be empty'\n });\n }\n\n // Проверка длины\n if (sentence.length > 41) {\n newErrors.push({\n type: 'length',\n message: `Sentence is too long (${sentence.length}/41 characters)`\n });\n }\n\n // Проверка символов (только латиница)\n const latinRegex = /^[a-zA-Z0-9\\s.,!?;:'\"-]*$/;\n if (sentence && !latinRegex.test(sentence)) {\n newErrors.push({\n type: 'characters',\n message: 'Only Latin characters, numbers, spaces and punctuation are allowed'\n });\n }\n\n // Проверка на дубликаты\n const duplicateIndex = allSentences.findIndex((s, i) => i !== index && s.toLowerCase().trim() === sentence.toLowerCase().trim());\n if (duplicateIndex !== -1) {\n newErrors.push({\n type: 'duplicate',\n message: `Duplicate sentence (same as sentence ${duplicateIndex + 1})`\n });\n }\n\n setErrors(newErrors);\n return {\n isValid: newErrors.length === 0,\n errors: newErrors\n };\n }, []);\n\n const validateAllSentences = useCallback((sentences: string[]): ValidationResult => {\n const allErrors: ValidationError[] = [];\n \n sentences.forEach((sentence, index) => {\n const result = validateSentence(sentence, index, sentences);\n allErrors.push(...result.errors.map(error => ({\n ...error,\n message: `Sentence ${index + 1}: ${error.message}`\n })));\n });\n\n return {\n isValid: allErrors.length === 0,\n errors: allErrors\n };\n }, [validateSentence]);\n\n const clearErrors = useCallback(() => {\n setErrors([]);\n }, []);\n\n return {\n errors,\n validateSentence,\n validateAllSentences,\n clearErrors,\n };\n};\n\n","// Утилиты для улучшения доступности\n\nexport const createAriaLabel = (action: string, word?: string, context?: string): string => {\n if (word && context) {\n return `${action} word \"${word}\" ${context}`;\n }\n if (word) {\n return `${action} word \"${word}\"`;\n }\n return action;\n};\n\nexport const getRoleForElement = (type: 'button' | 'draggable' | 'droppable' | 'input'): string => {\n const roles = {\n button: 'button',\n draggable: 'button',\n droppable: 'region',\n input: 'textbox'\n };\n return roles[type];\n};\n\nexport const handleKeyDown = (\n event: React.KeyboardEvent,\n action: () => void,\n allowedKeys: string[] = ['Enter', ' ']\n) => {\n if (allowedKeys.includes(event.key)) {\n event.preventDefault();\n action();\n }\n};\n\nexport const announceToScreenReader = (message: string) => {\n // Создаем временный элемент для объявления\n const announcement = document.createElement('div');\n announcement.setAttribute('aria-live', 'polite');\n announcement.setAttribute('aria-atomic', 'true');\n announcement.style.position = 'absolute';\n announcement.style.left = '-10000px';\n announcement.style.width = '1px';\n announcement.style.height = '1px';\n announcement.style.overflow = 'hidden';\n \n document.body.appendChild(announcement);\n announcement.textContent = message;\n \n // Удаляем элемент после объявления\n setTimeout(() => {\n document.body.removeChild(announcement);\n }, 1000);\n};\n\nexport const getFocusableElements = (container: HTMLElement): HTMLElement[] => {\n const focusableSelectors = [\n 'button:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n '[role=\"button\"]:not([disabled])'\n ].join(', ');\n \n return Array.from(container.querySelectorAll(focusableSelectors));\n};\n\nexport const trapFocus = (container: HTMLElement) => {\n const focusableElements = getFocusableElements(container);\n \n if (focusableElements.length === 0) return;\n \n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n \n const handleTabKey = (e: KeyboardEvent) => {\n if (e.key === 'Tab') {\n if (e.shiftKey) {\n if (document.activeElement === firstElement) {\n lastElement.focus();\n e.preventDefault();\n }\n } else {\n if (document.activeElement === lastElement) {\n firstElement.focus();\n e.preventDefault();\n }\n }\n }\n };\n \n container.addEventListener('keydown', handleTabKey);\n \n // Фокусируем первый элемент\n firstElement.focus();\n \n // Возвращаем функцию для очистки\n return () => {\n container.removeEventListener('keydown', handleTabKey);\n };\n};\n\n","// ======================\n// MAGIC SENTENCE GAME (SPEAKID)\n// React 18 + TypeScript + Vite\n// Адаптивная верстка для всех устройств\n// ======================\n\nimport * as React from \"react\";\nimport { useState, useEffect, useRef } from \"react\";\nimport { styles } from \"./Game.styles\";\nimport { ErrorBoundary } from \"./components/ErrorBoundary\";\nimport { useValidation } from \"./hooks/useValidation\";\nimport { createAriaLabel, handleKeyDown, announceToScreenReader } from \"./utils/accessibility\";\n\ntype Stage = \"select\" | \"time\" | \"type\" | \"getready\" | \"play\" | \"results\";\ntype Token = { id: string; text: string };\n\n// ✅ базовый reset\nconst globalReset = () => {\n const style = document.createElement(\"style\");\n style.textContent = `\n #magic-sentence-root, #magic-sentence-root * {\n box-sizing: border-box;\n font-family: \"Geist\", system-ui, -apple-system, \"Segoe UI\", Roboto, Arial, sans-serif;\n }\n #magic-sentence-root img {\n max-width: 100%;\n height: auto;\n display: block;\n user-select: none;\n }\n html, body {\n margin: 0 !important;\n padding: 0 !important;\n width: 100% !important;\n height: 100% !important;\n overflow: hidden !important;\n zoom: 1 !important;\n }\n #root {\n margin: 0 !important;\n padding: 0 !important;\n width: 100% !important;\n height: 100% !important;\n overflow: hidden !important;\n }\n `;\n document.head.appendChild(style);\n};\n\nconst shuffle = (arr: string[]) => [...arr].sort(() => Math.random() - 0.5);\n\nexport interface GameProps {\n logoUrl?: string;\n showLogo?: boolean;\n baseURL?: string;\n}\n\nexport default function Game(props: GameProps = {}): React.JSX.Element {\n const { logoUrl, showLogo = true, baseURL } = props;\n const containerRef = useRef<HTMLDivElement>(null);\n \n // Новые хуки\n const { validateAllSentences, errors: validationErrors } = useValidation();\n\n // Функция для определения нужно ли переносить слова\n const shouldWrapWords = () => {\n // Переносим слова на всех мобильных устройствах\n return isMobile || window.innerWidth < 768;\n };\n\n // Универсальная функция для определения мобильных устройств\n const isMobileDevice = () => {\n return isMobile || \n window.innerWidth < 768 || \n (window.innerWidth >= 320 && window.innerWidth <= 932 && window.innerHeight >= 390 && window.innerHeight <= 932);\n };\n\n // Вспомогательная функция для мобильных размеров кнопок\n const getMobileButtonStyles = (type: 'small' | 'medium' | 'large' = 'medium') => {\n if (!isMobileDevice()) {\n return {\n padding: \"12px 24px\",\n fontSize: \"16px\",\n minWidth: \"auto\"\n };\n }\n\n switch (type) {\n case 'small':\n return {\n padding: \"4px 6px\",\n fontSize: \"9px\",\n minWidth: \"40px\"\n };\n case 'medium':\n return {\n padding: \"5px 8px\",\n fontSize: \"10px\",\n minWidth: \"50px\"\n };\n case 'large':\n return {\n padding: \"6px 10px\",\n fontSize: \"11px\",\n minWidth: \"60px\"\n };\n }\n };\n\n useEffect(() => {\n globalReset();\n return () => {\n document.body.style.overflow = \"\";\n };\n }, []);\n\n const [stage, setStage] = useState<Stage>(\"select\");\n const [rounds, setRounds] = useState<number | null>(null);\n const [timePerRound, setTimePerRound] = useState<number | null>(null);\n const [sentences, setSentences] = useState<string[]>([]);\n const [currentRound, setCurrentRound] = useState(0);\n const [words, setWords] = useState<Token[]>([]);\n const [selected, setSelected] = useState<Token[]>([]);\n const [timeLeft, setTimeLeft] = useState(20);\n const [score, setScore] = useState(0);\n const [countdown, setCountdown] = useState<number | null>(null);\n const [resultType, setResultType] = useState<\"correct\" | \"almost\" | \"wrong\" | null>(null);\n const [timeExpired, setTimeExpired] = useState(false);\n const [bestScore, setBestScore] = useState<number>(\n Number(localStorage.getItem(\"magicSentenceBest\")) || 0\n );\n const timerRef = useRef<number | null>(null);\n const [hover, setHover] = useState<{ list: ListName | null; index: number | null; side: \"left\" | \"right\" | null }>({ list: null, index: null, side: null });\n\n // Адаптивность\n const [isMobile, setIsMobile] = useState(false);\n const [scale, setScale] = useState(1);\n const [containerSize, setContainerSize] = useState<number | null>(null);\n const [isDesktopLayout, setIsDesktopLayout] = useState(false);\n const [isIPadMiniPortrait, setIsIPadMiniPortrait] = useState(false);\n const [isIPadMiniLandscape, setIsIPadMiniLandscape] = useState(false);\n const [isIPadAirPortrait, setIsIPadAirPortrait] = useState(false);\n const [isIPadAirLandscape, setIsIPadAirLandscape] = useState(false);\n const [isSurfaceDuoPortrait, setIsSurfaceDuoPortrait] = useState(false);\n const [isSurfaceDuoLandscape, setIsSurfaceDuoLandscape] = useState(false);\n const [isIPadProPortrait, setIsIPadProPortrait] = useState(false);\n const [isIPadProLandscape, setIsIPadProLandscape] = useState(false);\n\n // ✅ адаптив под мобилки, планшеты и десктоп\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 isLandscape = (width > height && mobile) || (width === 926 && height === 428) || (width === 932 && height === 430);\n const isSmallHeight = height < 700;\n \n // iPad размеры\n const isIPadMiniPortrait = width === 768 && height === 1024;\n const isIPadMiniLandscape = width === 1024 && height === 768;\n const isIPadAirPortrait = width === 820 && height === 1180;\n const isIPadAirLandscape = width === 1180 && height === 820;\n \n // Surface DUO размеры\n const isSurfaceDuoPortrait = width === 540 && height === 720;\n const isSurfaceDuoLandscape = width === 720 && height === 540;\n \n // iPad Pro размеры\n const isIPadProPortrait = width === 1024 && height === 1366;\n const isIPadProLandscape = width === 1366 && height === 1024;\n \n // Десктопные разрешения\n const desktopLayout = width >= 1200 && height >= 600 && !mobile;\n setIsDesktopLayout(desktopLayout);\n \n // Установка состояний для iPad и Surface DUO\n setIsIPadMiniPortrait(isIPadMiniPortrait);\n setIsIPadMiniLandscape(isIPadMiniLandscape);\n setIsIPadAirPortrait(isIPadAirPortrait);\n setIsIPadAirLandscape(isIPadAirLandscape);\n setIsSurfaceDuoPortrait(isSurfaceDuoPortrait);\n setIsSurfaceDuoLandscape(isSurfaceDuoLandscape);\n setIsIPadProPortrait(isIPadProPortrait);\n setIsIPadProLandscape(isIPadProLandscape);\n \n setIsMobile(mobile);\n\n // ✅ Адаптивные размеры контейнера\n if (mobile) {\n setContainerSize(null);\n setScale(1);\n } else if (isSmallHeight) {\n setContainerSize(null);\n setScale(1);\n } else {\n const minSize = 400;\n const maxSize = 1200;\n const finalSize = Math.min(1000, Math.min(width, height) * 0.9);\n setContainerSize(finalSize);\n setScale(1);\n }\n };\n resize();\n window.addEventListener(\"resize\", resize);\n return () => window.removeEventListener(\"resize\", resize);\n }, []);\n\n // =========================\n // DND HELPERS\n // =========================\n type ListName = \"bank\" | \"selected\";\n type DragPayload = { from: ListName; id: string };\n\n const moveToken = (\n from: ListName,\n to: ListName,\n id: string,\n insertIndex: number | null\n ) => {\n // Блокируем перемещение если время истекло\n if (timeExpired) return;\n\n let nextWords = [...words];\n let nextSelected = [...selected];\n\n const takeFrom = from === \"bank\" ? nextWords : nextSelected;\n const putTo = to === \"bank\" ? nextWords : nextSelected;\n\n const idx = takeFrom.findIndex((t) => t.id === id);\n if (idx === -1) return;\n const [token] = takeFrom.splice(idx, 1);\n\n let targetIndex = insertIndex;\n if (\n from === to &&\n targetIndex !== null &&\n targetIndex !== undefined\n ) {\n if (targetIndex > idx) targetIndex = targetIndex - 1;\n }\n\n if (\n targetIndex === null ||\n targetIndex === undefined ||\n targetIndex < 0 ||\n targetIndex > putTo.length\n ) {\n putTo.push(token);\n } else {\n putTo.splice(targetIndex, 0, token);\n }\n\n if (from === \"bank\") nextWords = takeFrom; else nextSelected = takeFrom;\n if (to === \"bank\") nextWords = putTo; else nextSelected = putTo;\n\n setWords(nextWords);\n setSelected(nextSelected);\n };\n\n const handleDropTo = (\n e: React.DragEvent,\n to: ListName,\n insertIndex: number | null\n ) => {\n e.preventDefault();\n \n // Блокируем drop если время истекло\n if (timeExpired) {\n setHover({ list: null, index: null, side: null });\n return;\n }\n\n const raw = e.dataTransfer.getData(\"application/x-token\") ||\n (() => {\n const fallbackId = e.dataTransfer.getData(\"text/plain\");\n if (!fallbackId) return \"\";\n const inBank = words.some((t) => t.id === fallbackId);\n const inSelected = selected.some((t) => t.id === fallbackId);\n const from: ListName | null = inBank ? \"bank\" : inSelected ? \"selected\" : null;\n return from ? JSON.stringify({ from, id: fallbackId }) : \"\";\n })();\n if (!raw) return;\n try {\n const payload = JSON.parse(raw) as DragPayload;\n if (!payload || !payload.id || !payload.from) return;\n moveToken(payload.from, to, payload.id, insertIndex);\n } catch {\n // ignore bad payload\n }\n setHover({ list: null, index: null, side: null });\n };\n\n // =========================\n // START / SETUP\n // =========================\n const handleSelect = (num: number) => {\n setRounds(num);\n setSentences(Array(num).fill(\"\"));\n setStage(\"time\");\n };\n\n const handleTimeSelect = (time: number) => {\n setTimePerRound(time);\n setStage(\"type\");\n };\n\n const handleChange = (index: number, value: string) => {\n // Ограничение на 41 символ (включая пробелы и точку)\n if (value.length > 41) {\n return;\n }\n \n // Проверка на латинские символы (a-z, A-Z, пробелы, цифры, знаки препинания)\n const latinRegex = /^[a-zA-Z0-9\\s.,!?;:'\"-]*$/;\n if (value && !latinRegex.test(value)) {\n return; // Не сохраняем, если есть нелатинские символы\n }\n \n const updated = [...sentences];\n updated[index] = value;\n setSentences(updated);\n \n // Валидация при вводе\n const validation = validateAllSentences(updated);\n if (!validation.isValid) {\n console.warn('Validation errors:', validation.errors);\n }\n };\n\n const normalizeSentence = (s: string) => s.trim().replace(/\\s+/g, \" \");\n\n // Адаптивный размер шрифта в зависимости от количества слов\n const getAdaptiveFontSize = (wordCount: number) => {\n if (wordCount <= 3) return 20;\n if (wordCount <= 5) return 18;\n if (wordCount <= 7) return 16;\n if (wordCount <= 9) return 14;\n return 12;\n };\n\n const startGame = () => {\n const hasEmpty = sentences.some((s) => s.trim().length === 0);\n if (hasEmpty) {\n return;\n }\n setSentences((prev) => prev.map((s) => normalizeSentence(s)));\n setScore(0);\n setCurrentRound(0);\n setCountdown(null); // Убираем цифровой отсчет\n setStage(\"getready\");\n };\n\n // GET READY с 3-секундной задержкой\n useEffect(() => {\n if (stage === \"getready\") {\n const t = setTimeout(() => startRound(0), 3000); // 3 секунды задержки\n return () => clearTimeout(t);\n }\n }, [stage]);\n\n const startRound = (index: number) => {\n const target = sentences[index];\n if (!target) return;\n const shuffled = shuffle(target\n .trim()\n .split(/\\s+/)\n .filter(Boolean)\n );\n const tokens: Token[] = shuffled.map((w, i) => ({\n id: `${Date.now()}-${index}-${i}-${Math.random().toString(36).slice(2)}`,\n text: w,\n }));\n setWords(tokens);\n setSelected([]);\n setCurrentRound(index);\n setTimeLeft(timePerRound || 20); // Используем выбранное время\n setResultType(null); // Сбрасываем результат\n setTimeExpired(false); // Сбрасываем состояние истечения времени\n setStage(\"play\");\n };\n\n // TIMER\n useEffect(() => {\n if (stage === \"play\" && !timeExpired) {\n if (timerRef.current !== null) window.clearTimeout(timerRef.current);\n if (timeLeft > 0) {\n timerRef.current = window.setTimeout(() => setTimeLeft((t) => t - 1), 1000);\n } else {\n // Время истекло - показываем результат и кнопку NEXT\n setTimeExpired(true);\n // Вызываем handleNext с manual=false для подсчета результата\n const correct = sentences[currentRound];\n const correctWords = correct.trim().split(/\\s+/);\n const selectedTexts = selected.map((t) => t.text);\n \n // Считаем ошибки: недостающие слова + лишние слова + неправильный порядок\n const missingWords = correctWords.filter(word => !selectedTexts.includes(word)).length;\n const extraWords = selectedTexts.filter(word => !correctWords.includes(word)).length;\n const wrongOrder = correctWords.filter((w, i) => w !== selectedTexts[i]).length;\n \n // Общее количество ошибок = недостающие + лишние + неправильный порядок\n const errors = missingWords + extraWords + wrongOrder;\n\n // Показываем результат\n if (errors === 0) {\n setResultType(\"correct\");\n playSound(\"correct\");\n announceToScreenReader(\"Correct! Well done!\");\n } else if (errors === 1) {\n setResultType(\"almost\");\n playSound(\"half\");\n announceToScreenReader(\"Almost correct! Just one mistake.\");\n } else {\n setResultType(\"wrong\");\n playSound(\"wrong\");\n announceToScreenReader(\"Not quite right. Keep trying!\");\n }\n }\n }\n return () => {\n if (timerRef.current !== null) window.clearTimeout(timerRef.current);\n };\n }, [stage, timeLeft, timeExpired, sentences, currentRound, selected]);\n\n // =========================\n // SCORING / NEXT ROUND\n // =========================\n const handleNext = (manual = true) => {\n // Если время истекло и это ручное нажатие NEXT, переходим к следующему раунду\n if (timeExpired && manual) {\n if (currentRound + 1 < (rounds || 0)) {\n startRound(currentRound + 1);\n } else {\n setStage(\"results\");\n setTimeout(() => triggerConfetti(), 600);\n }\n return;\n }\n\n // Если время не истекло, обрабатываем ручное нажатие\n if (manual && !timeExpired) {\n const correct = sentences[currentRound];\n const correctWords = correct.trim().split(/\\s+/);\n const selectedTexts = selected.map((t) => t.text);\n \n // Считаем ошибки: недостающие слова + лишние слова + неправильный порядок\n const missingWords = correctWords.filter(word => !selectedTexts.includes(word)).length;\n const extraWords = selectedTexts.filter(word => !correctWords.includes(word)).length;\n const wrongOrder = correctWords.filter((w, i) => w !== selectedTexts[i]).length;\n \n // Общее количество ошибок = недостающие + лишние + неправильный порядок\n const errors = missingWords + extraWords + wrongOrder;\n\n if (errors === 0 && timeLeft > 0) {\n setScore((s) => s + 1);\n setResultType(\"correct\");\n playSound(\"correct\");\n announceToScreenReader(\"Correct! Well done!\");\n } else if (errors === 1) {\n setScore((s) => s + 0.5);\n setResultType(\"almost\");\n playSound(\"half\");\n announceToScreenReader(\"Almost correct! Just one mistake.\");\n } else {\n setResultType(\"wrong\");\n playSound(\"wrong\");\n announceToScreenReader(\"Not quite right. Keep trying!\");\n }\n\n // Переходим к следующему раунду\n if (currentRound + 1 < (rounds || 0)) {\n setTimeout(() => startRound(currentRound + 1), 800);\n } else {\n setStage(\"results\");\n setTimeout(() => triggerConfetti(), 600);\n }\n }\n };\n\n // =========================\n // SAVE BEST SCORE\n // =========================\n useEffect(() => {\n if (stage === \"results\" && score > bestScore) {\n setBestScore(score);\n localStorage.setItem(\"magicSentenceBest\", String(score));\n }\n }, [stage, score, bestScore]);\n\n // =========================\n // SOUND EFFECTS\n // =========================\n const playSound = (type: \"start\" | \"click\" | \"correct\" | \"half\" | \"wrong\") => {\n const ctx = new (window.AudioContext || (window as any).webkitAudioContext)();\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.connect(gain);\n gain.connect(ctx.destination);\n\n switch (type) {\n case \"start\": osc.frequency.value = 500; break;\n case \"click\": osc.frequency.value = 800; break;\n case \"correct\": osc.frequency.value = 1000; break;\n case \"half\": osc.frequency.value = 700; break;\n case \"wrong\": osc.frequency.value = 200; break;\n }\n gain.gain.setValueAtTime(0.1, ctx.currentTime);\n osc.start();\n osc.stop(ctx.currentTime + 0.2);\n };\n\n // =========================\n // CONFETTI EFFECT\n // =========================\n const triggerConfetti = () => {\n const duration = 2500;\n const end = Date.now() + duration;\n const colors = [\"#ec4c44\", \"#f7c948\", \"#6fcf97\", \"#56ccf2\", \"#bb6bd9\"];\n\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\")!;\n canvas.width = window.innerWidth;\n canvas.height = window.innerHeight;\n canvas.style.position = \"fixed\";\n canvas.style.top = \"0\";\n canvas.style.left = \"0\";\n canvas.style.pointerEvents = \"none\";\n document.body.appendChild(canvas);\n\n const pieces = Array.from({ length: 100 }).map(() => ({\n x: Math.random() * canvas.width,\n y: Math.random() * canvas.height - canvas.height,\n size: 6 + Math.random() * 6,\n color: colors[Math.floor(Math.random() * colors.length)],\n speed: 2 + Math.random() * 4,\n tilt: Math.random() * 2 * Math.PI,\n }));\n\n const draw = () => {\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n pieces.forEach((p) => {\n ctx.fillStyle = p.color;\n ctx.beginPath();\n ctx.ellipse(p.x, p.y, p.size, p.size / 2, p.tilt, 0, 2 * Math.PI);\n ctx.fill();\n p.y += p.speed;\n p.x += Math.sin(p.tilt);\n });\n if (Date.now() < end) requestAnimationFrame(draw);\n else document.body.removeChild(canvas);\n };\n draw();\n };\n\n // =========================\n // RENDER SCREENS\n // =========================\n const renderSelect = () => (\n <div style={styles.gmCenterScreen}>\n <h1 style={styles.gmHeadline1}>MAGIC SENTENCE</h1>\n <p style={styles.gmBodyM}>Select number of rounds</p>\n <div style={{ \n display: \"flex\", \n gap: isMobileDevice() ? \"8px\" : \"16px\",\n justifyContent: \"center\" \n }}>\n {[3, 4, 5].map((num) => (\n <button \n key={num} \n onClick={() => handleSelect(num)} \n style={{\n ...styles.gmButton,\n ...getMobileButtonStyles('medium')\n }}\n >\n {num} ROUNDS\n </button>\n ))}\n </div>\n </div>\n );\n\n const renderTime = () => (\n <div style={styles.gmCenterScreen}>\n <h1 style={styles.gmHeadline1}>MAGIC SENTENCE</h1>\n <p style={styles.gmBodyM}>Select time per round</p>\n <div style={{ \n display: \"flex\", \n gap: isMobileDevice() ? \"8px\" : \"16px\",\n justifyContent: \"center\" \n }}>\n {[15, 20, 30].map((time) => (\n <button \n key={time} \n onClick={() => handleTimeSelect(time)} \n style={{\n ...styles.gmButton,\n ...getMobileButtonStyles('medium')\n }}\n >\n {time}s\n </button>\n ))}\n </div>\n </div>\n );\n\n const renderType = () => (\n <div style={styles.gmCenterScreen}>\n <h2 style={{...styles.gmBodyM, marginBottom: \"0px\"}}>\n Type down {rounds} sentence{rounds && rounds > 1 ? \"s\" : \"\"} for your student\n </h2>\n <p style={{...styles.gmBodyS, marginBottom: \"16px\", marginTop: \"0px\", color: \"#6b7280\"}}>\n Maximum 41 characters per sentence\n </p>\n <div style={{ \n display: \"flex\", \n flexDirection: \"column\", \n gap: 12, \n width: \"auto\", // Автоматическая ширина по содержимому\n minWidth: \"fit-content\", // Минимальная ширина по содержимому\n maxWidth: \"600px\" // Ограничиваем максимальную ширину\n }}>\n {sentences.map((text, i) => (\n <input\n key={i}\n value={text}\n placeholder={`Sentence ${i + 1}`}\n onChange={(e) => handleChange(i, e.target.value)}\n style={{\n ...styles.gmInput,\n padding: isMobileDevice() ? \"8px 12px\" : \"12px 16px\",\n fontSize: isMobileDevice() ? \"14px\" : \"16px\",\n width: \"100%\", // Поля теперь будут шире благодаря увеличенной ширине контейнера\n textAlign: \"center\" // Центрируем placeholder текст\n }}\n />\n ))}\n </div>\n <button\n onClick={startGame}\n disabled={sentences.some((s) => s.trim().length === 0)}\n style={{\n ...styles.gmButton,\n marginTop: 30,\n background: sentences.some((s) => s.trim().length === 0) ? \"#ccc\" : \"#ec4c44\",\n cursor: sentences.some((s) => s.trim().length === 0) ? \"not-allowed\" : \"pointer\",\n ...getMobileButtonStyles('large')\n }}\n >\n PLAY\n </button>\n </div>\n );\n\n const renderGetReady = () => (\n <div style={styles.gmReadyWrapper}>\n <h1 style={{ \n ...styles.gmHeadline1,\n fontSize: isMobileDevice() ? \"36px\" : \"72px\", \n color: \"#ec4c44\", \n marginBottom: \"20px\",\n animation: \"pulse 1s ease-in-out infinite\"\n }}>\n GET READY\n </h1>\n <div style={styles.gmHourglass}>⏳</div>\n </div>\n );\n\n const renderPlay = () => (\n <div style={styles.gmGameLayout}>\n <h2 style={{ \n marginBottom: isMobileDevice() ? \"5px\" : \"10px\",\n fontSize: isMobileDevice() ? \"16px\" : \"20px\"\n }}>\n Round {currentRound + 1}/{rounds} — {timeExpired ? \"TIME'S UP!\" : `Time: ${timeLeft}s`}\n </h2>\n\n {/* Progress bar */}\n <div\n style={{\n width: \"60%\",\n height: isMobileDevice() ? \"8px\" : \"14px\",\n borderRadius: 8,\n background: \"#eee\",\n overflow: \"hidden\",\n marginBottom: isMobileDevice() ? \"10px\" : \"20px\",\n }}\n >\n <div\n style={{\n height: \"100%\",\n width: `${(timeLeft / (timePerRound || 20)) * 100}%`,\n background: timeLeft <= 5 ? \"#ec4c44\" : \"#4caf50\",\n transition: \"width 1s linear\",\n }}\n ></div>\n </div>\n\n {/* Word bank */}\n <div\n onDragOver={(e) => e.preventDefault()}\n onDrop={(e) => handleDropTo(e, \"bank\", null)}\n style={{\n display: \"flex\",\n flexWrap: shouldWrapWords() ? \"wrap\" : \"nowrap\",\n gap: isMobile || window.innerWidth < 768 ? \"6px\" : \"10px\",\n justifyContent: \"center\",\n marginBottom: isMobile || window.innerWidth < 768 ? \"15px\" : \"30px\",\n padding: isMobile || window.innerWidth < 768 ? \"5px\" : \"10px\",\n width: \"100%\",\n boxSizing: \"border-box\"\n }}\n >\n {words.map((t, idx) => (\n <div\n key={t.id}\n draggable={!timeExpired}\n role=\"button\"\n tabIndex={timeExpired ? -1 : 0}\n aria-label={timeExpired ? `Word: ${t.text} (time expired)` : createAriaLabel(\"Drag word\", t.text, \"to build sentence\")}\n onDragStart={(e) => {\n if (timeExpired) {\n e.preventDefault();\n return;\n }\n e.dataTransfer.setData(\n \"application/x-token\",\n JSON.stringify({ from: \"bank\", id: t.id })\n );\n e.dataTransfer.setData(\"text/plain\", t.id);\n announceToScreenReader(`Dragging word: ${t.text}`);\n }}\n onKeyDown={(e) => {\n if (timeExpired) return;\n handleKeyDown(e, () => moveToken(\"bank\", \"selected\", t.id, null));\n }}\n onDragOver={(e) => e.preventDefault()}\n onDrop={(e) => {\n const rect = (e.currentTarget as HTMLDivElement).getBoundingClientRect();\n const mid = rect.left + rect.width / 2;\n const insertIndex = e.clientX > mid ? idx + 1 : idx;\n setHover({ list: null, index: null, side: null });\n e.stopPropagation();\n handleDropTo(e, \"bank\", insertIndex);\n }}\n onDragEnter={(e) => {\n if (timeExpired) return;\n const rect = (e.currentTarget as HTMLDivElement).getBoundingClientRect();\n const mid = rect.left + rect.width / 2;\n setHover({ list: \"bank\", index: idx, side: e.clientX > mid ? \"right\" : \"left\" });\n }}\n onDragLeave={() => setHover({ list: null, index: null, side: null })}\n onClick={() => {\n if (timeExpired) return;\n moveToken(\"bank\", \"selected\", t.id, null);\n }}\n style={{\n padding: isMobile || window.innerWidth < 768 ? \"6px 10px\" : \"10px 16px\",\n borderRadius: isMobile || window.innerWidth < 768 ? \"6px\" : \"10px\",\n border: \"1px solid #ccc\",\n background: timeExpired ? \"#f0f0f0\" : \"#f9f9f9\",\n cursor: timeExpired ? \"not-allowed\" : \"pointer\",\n fontSize: isMobile || window.innerWidth < 768 ? \"12px\" : \"18px\",\n borderLeft: hover.list === \"bank\" && hover.index === idx && hover.side === \"left\" ? \"3px solid #3b82f6\" : \"1px solid #ccc\",\n borderRight: hover.list === \"bank\" && hover.index === idx && hover.side === \"right\" ? \"3px solid #3b82f6\" : \"1px solid #ccc\",\n flexShrink: 0,\n flexBasis: \"auto\",\n opacity: timeExpired ? 0.6 : 1,\n transition: \"opacity 0.3s ease\",\n }}\n >\n {t.text}\n </div>\n ))}\n </div>\n\n {/* Selected sentence */}\n <div\n onDragOver={(e) => e.preventDefault()}\n onDrop={(e) => handleDropTo(e, \"selected\", null)}\n style={{\n minHeight: isMobile || window.innerWidth < 768 ? \"50px\" : \"70px\",\n width: \"auto\", // Автоматическая ширина в зависимости от содержимого\n maxWidth: \"none\", // Убираем ограничение максимальной ширины\n minWidth: \"245px\", // Минимальная ширина для растягивания\n border: resultType === \"correct\" ? \"2px dashed #4caf50\" : \n resultType === \"almost\" ? \"2px dashed #ff9800\" : \n resultType === \"wrong\" ? \"2px dashed #f44336\" : \"2px dashed #ccc\",\n borderRadius: isMobile || window.innerWidth < 768 ? \"8px\" : \"12px\",\n padding: isMobile || window.innerWidth < 768 ? \"8px\" : \"12px\",\n display: \"flex\",\n flexWrap: shouldWrapWords() ? \"wrap\" : \"nowrap\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: `${getAdaptiveFontSize(selected.length)}px`,\n background: resultType === \"correct\" ? \"#e8f5e8\" : \n resultType === \"almost\" ? \"#fff3e0\" : \n resultType === \"wrong\" ? \"#ffebee\" : \"#fafafa\",\n overflowX: shouldWrapWords() ? \"hidden\" : \"auto\",\n whiteSpace: shouldWrapWords() ? \"normal\" : \"nowrap\",\n }}\n >\n {selected.map((t, idx) => (\n <span\n key={t.id}\n draggable={!timeExpired}\n onDragStart={(e) => {\n if (timeExpired) {\n e.preventDefault();\n return;\n }\n e.dataTransfer.setData(\n \"application/x-token\",\n JSON.stringify({ from: \"selected\", id: t.id })\n );\n e.dataTransfer.setData(\"text/plain\", t.id);\n }}\n onDragOver={(e) => e.preventDefault()}\n onDrop={(e) => {\n const rect = (e.currentTarget as HTMLSpanElement).getBoundingClientRect();\n const mid = rect.left + rect.width / 2;\n const insertIndex = e.clientX > mid ? idx + 1 : idx;\n setHover({ list: null, index: null, side: null });\n e.stopPropagation();\n handleDropTo(e, \"selected\", insertIndex);\n }}\n onDragEnter={(e) => {\n if (timeExpired) return;\n const rect = (e.currentTarget as HTMLSpanElement).getBoundingClientRect();\n const mid = rect.left + rect.width / 2;\n setHover({ list: \"selected\", index: idx, side: e.clientX > mid ? \"right\" : \"left\" });\n }}\n onDragLeave={() => setHover({ list: null, index: null, side: null })}\n onClick={() => {\n if (timeExpired) return;\n moveToken(\"selected\", \"bank\", t.id, null);\n }}\n title={timeExpired ? \"Time expired\" : \"Click to remove back to bank\"}\n style={{\n padding: isMobileDevice() ? \"4px 6px\" : \"6px 10px\",\n margin: isMobileDevice() ? \"2px\" : \"4px\",\n borderRadius: isMobileDevice() ? \"4px\" : \"8px\",\n background: timeExpired ? \"#f0f0f0\" : \"#ffe9e7\",\n border: timeExpired ? \"1px solid #ccc\" : \"1px solid #ec4c44\",\n borderLeft: hover.list === \"selected\" && hover.index === idx && hover.side === \"left\" ? \"3px solid #3b82f6\" : undefined,\n borderRight: hover.list === \"selected\" && hover.index === idx && hover.side === \"right\" ? \"3px solid #3b82f6\" : undefined,\n cursor: timeExpired ? \"not-allowed\" : \"pointer\",\n userSelect: \"none\",\n fontSize: `${getAdaptiveFontSize(selected.length)}px`, // Адаптивный размер шрифта для слов\n fontFamily: '\"Roboto\", system-ui, -apple-system, \"Segoe UI\", Roboto, Arial, sans-serif', // Более плотный шрифт\n whiteSpace: \"nowrap\", // Запрещаем перенос слов\n opacity: timeExpired ? 0.6 : 1,\n transition: \"opacity 0.3s ease\",\n }}\n >\n {t.text}\n </span>\n ))}\n </div>\n\n <button\n onClick={() => handleNext(true)}\n disabled={!timeExpired && selected.length === 0}\n style={{\n marginTop: isMobileDevice() ? \"15px\" : \"30px\",\n fontSize: isMobileDevice() ? \"14px\" : \"20px\",\n padding: isMobileDevice() ? \"6px 12px\" : \"10px 24px\",\n borderRadius: isMobileDevice() ? \"8px\" : \"12px\",\n background: (timeExpired || selected.length > 0) ? \"#ec4c44\" : \"#ccc\",\n color: \"white\",\n border: \"none\",\n cursor: (timeExpired || selected.length > 0) ? \"pointer\" : \"not-allowed\",\n }}\n >\n {timeExpired ? \"NEXT\" : \"NEXT\"}\n </button>\n </div>\n );\n\n const renderResults = () => (\n <div style={styles.gmCenterScreen}>\n <h1 style={{\n ...styles.gmHeadline1,\n marginTop: (isMobile && window.innerWidth > window.innerHeight) || (window.innerWidth === 896 && window.innerHeight === 414) || (window.innerWidth === 844 && window.innerHeight === 390) || (window.innerWidth === 926 && window.innerHeight === 428) || (window.innerWidth === 932 && window.innerHeight === 430) || isIPadMiniPortrait || isIPadMiniLandscape || isIPadAirPortrait || isIPadAirLandscape || isSurfaceDuoPortrait || isSurfaceDuoLandscape || isIPadProPortrait || isIPadProLandscape ? \"0px\" : \"0px\",\n marginBottom: (isMobile && window.innerWidth > window.innerHeight) || (window.innerWidth === 896 && window.innerHeight === 414) || (window.innerWidth === 844 && window.innerHeight === 390) || (window.innerWidth === 926 && window.innerHeight === 428) || (window.innerWidth === 932 && window.innerHeight === 430) || isIPadMiniPortrait || isIPadMiniLandscape || isIPadAirPortrait || isIPadAirLandscape || isSurfaceDuoPortrait || isSurfaceDuoLandscape || isIPadProPortrait || isIPadProLandscape ? \"2px\" : \"10px\",\n fontSize: (isMobile && window.innerWidth <= 375 && window.innerHeight <= 667) || (window.innerWidth === 896 && window.innerHeight === 414) || (window.innerWidth === 844 && window.innerHeight === 390) || (window.innerWidth === 926 && window.innerHeight === 428) || (window.innerWidth === 932 && window.innerHeight === 430) ? \"32px\" : \"clamp(28px, 4vw, 40px)\"\n }}>\n Game Over 🎯\n </h1>\n <h2 style={{\n ...styles.gmHeadline2,\n marginTop: (isMobile && window.innerWidth > window.innerHeight) || (window.innerWidth === 896 && window.innerHeight === 414) || (window.innerWidth === 844 && window.innerHeight === 390) || (window.innerWidth === 926 && window.innerHeight === 428) || (window.innerWidth === 932 && window.innerHeight === 430) || isIPadMiniPortrait || isIPadMiniLandscape || isIPadAirPortrait || isIPadAirLandscape || isSurfaceDuoPortrait || isSurfaceDuoLandscape || isIPadProPortrait || isIPadProLandscape ? \"0px\" : \"0px\",\n marginBottom: (isMobile && window.innerWidth > window.innerHeight) || (window.innerWidth === 896 && window.innerHeight === 414) || (window.innerWidth === 844 && window.innerHeight === 390) || (window.innerWidth === 926 && window.innerHeight === 428) || (window.innerWidth === 932 && window.innerHeight === 430) || isIPadMiniPortrait || isIPadMiniLandscape || isIPadAirPortrait || isIPadAirLandscape || isSurfaceDuoPortrait || isSurfaceDuoLandscape || isIPadProPortrait || isIPadProLandscape ? \"2px\" : \"16px\",\n fontSize: (isMobile && window.innerWidth <= 375 && window.innerHeight <= 667) || (window.innerWidth === 896 && window.innerHeight === 414) || (window.innerWidth === 844 && window.innerHeight === 390) || (window.innerWidth === 926 && window.innerHeight === 428) || (window.innerWidth === 932 && window.innerHeight === 430) ? \"18px\" : \"24px\"\n }}>\n Your score: {score} out of {rounds}\n </h2>\n <p style={{ \n ...styles.gmBodyM, \n color: \"#10b981\", \n marginTop: (isMobile && window.innerWidth > window.innerHeight) || (window.innerWidth === 896 && window.innerHeight === 414) || (window.innerWidth === 844 && window.innerHeight === 390) || (window.innerWidth === 926 && window.innerHeight === 428) || (window.innerWidth === 932 && window.innerHeight === 430) || isIPadMiniPortrait || isIPadMiniLandscape || isIPadAirPortrait || isIPadAirLandscape || isSurfaceDuoPortrait || isSurfaceDuoLandscape || isIPadProPortrait || isIPadProLandscape ? \"0px\" : \"12px\",\n marginBottom: (isMobile && window.innerWidth > window.innerHeight) || (window.innerWidth === 896 && window.innerHeight === 414) || (window.innerWidth === 844 && window.innerHeight === 390) || (window.innerWidth === 926 && window.innerHeight === 428) || (window.innerWidth === 932 && window.innerHeight === 430) || isIPadMiniPortrait || isIPadMiniLandscape || isIPadAirPortrait || isIPadAirLandscape || isSurfaceDuoPortrait || isSurfaceDuoLandscape || isIPadProPortrait || isIPadProLandscape ? \"2px\" : \"16px\",\n fontSize: (isMobile && window.innerWidth <= 375 && window.innerHeight <= 667) || (window.innerWidth === 896 && window.innerHeight === 414) || (window.innerWidth === 844 && window.innerHeight === 390) || (window.innerWidth === 926 && window.innerHeight === 428) || (window.innerWidth === 932 && window.innerHeight === 430) ? \"14px\" : \"16px\"\n }}>\n Best score: {bestScore}\n </p>\n\n <div style={{ \n display: \"flex\", \n gap: (isMobile && window.innerWidth > window.innerHeight) || (isMobile && window.innerWidth <= 375 && window.innerHeight <= 667) || (window.innerWidth === 896 && window.innerHeight === 414) || (window.innerWidth === 844 && window.innerHeight === 390) || (window.innerWidth === 926 && window.innerHeight === 428) || (window.innerWidth === 932 && window.innerHeight === 430) ? \"6px\" : \"12px\", \n marginTop: (isMobile && window.innerWidth > window.innerHeight) || (isMobile && window.innerWidth <= 375 && window.innerHeight <= 667) || (window.innerWidth === 896 && window.innerHeight === 414) || (window.innerWidth === 844 && window.innerHeight === 390) || (window.innerWidth === 926 && window.innerHeight === 428) || (window.innerWidth === 932 && window.innerHeight === 430) ? \"2px\" : (window.innerWidth === 1366 && window.innerHeight === 766) || (window.innerWidth === 1366 && window.innerHeight === 768) || (window.innerWidth === 1280 && window.innerHeight === 720) || (window.innerWidth === 1440 && window.innerHeight === 900) || isDesktopLayout ? \"12px\" : \"24px\"\n }}>\n <button\n onClick={() => {\n triggerConfetti();\n playSound(\"start\");\n setTimeout(() => {\n setStage(\"getready\");\n setCountdown(null);\n setTimeExpired(false);\n }, 800);\n }}\n style={{\n ...styles.gmButton,\n ...getMobileButtonStyles('medium')\n }}\n >\n 🔁 Play again\n </button>\n\n <button\n onClick={() => {\n playSound(\"click\");\n setStage(\"select\");\n setRounds(null);\n setTimePerRound(null);\n setSentences([]);\n setScore(0);\n setSelected([]);\n setTimeExpired(false);\n }}\n style={{\n ...styles.gmButton,\n ...getMobileButtonStyles('medium')\n }}\n >\n ⬅️ Exit\n </button>\n </div>\n </div>\n );\n\n // Определяем URL логотипа\n const logoSrc = logoUrl || \n (baseURL \n ? `${baseURL.endsWith('/') ? baseURL.slice(0, -1) : baseURL}/logo.svg`\n : (typeof window !== 'undefined' && window.origin\n ? `${window.origin}/browser/speakid/games/magic%20sentence/logo.svg`\n : null));\n\n // Условие для отображения логотипа\n const shouldShowLogo = !isMobile && \n showLogo && \n !(window.innerWidth > window.innerHeight) && \n window.innerHeight >= 700;\n\n return (\n <div\n ref={containerRef}\n style={{\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n background: \"linear-gradient(to bottom, #fff8f8 0%, #f9fafb 100%)\",\n transition: \"background 0.3s ease\",\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 || 1000),\n height: isMobile ? \"100%\" : (containerSize || 1000),\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n overflow: \"hidden\",\n borderRadius: isMobile ? 0 : \"20px\",\n background: \"linear-gradient(to bottom, #fff8f8 0%, #f9fafb 100%)\",\n boxShadow: isMobile ? \"none\" : \"0 0 40px rgba(0,0,0,0.1)\",\n margin: isMobile ? \"0 auto\" : \"unset\",\n position: \"relative\",\n }}\n >\n <div\n style={{\n transform: \"none\",\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n }}\n >\n <div id=\"magic-sentence-root\">\n {shouldShowLogo ? (\n <div style={{\n ...styles.gmLogoFixed,\n display: 'block'\n }}>\n {logoSrc ? (\n <img\n src={logoSrc}\n alt=\"SPEAKID Logo\"\n style={styles.gmLogoImg}\n loading=\"lazy\"\n />\n ) : (\n <div style={styles.gmLogoImg}>\n SPEAKID\n </div>\n )}\n </div>\n ) : null}\n {stage === \"select\" ? renderSelect() : null}\n {stage === \"time\" ? renderTime() : null}\n {stage === \"type\" ? renderType() : null}\n {stage === \"getready\" ? renderGetReady() : null}\n {stage === \"play\" ? renderPlay() : null}\n {stage === \"results\" ? renderResults() : null}\n </div>\n </div>\n </div>\n </div>\n );\n}","import React, { Component, ErrorInfo, ReactNode } from 'react';\n\ninterface Props {\n children: ReactNode;\n fallback?: ReactNode;\n}\n\ninterface State {\n hasError: boolean;\n error?: Error;\n errorInfo?: ErrorInfo;\n}\n\nexport class ErrorBoundary extends Component<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(error: Error): State {\n return {\n hasError: true,\n error,\n };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n console.error('Game Error:', error, errorInfo);\n \n // В реальном приложении здесь можно отправить ошибку в аналитику\n // analytics.track('game_error', { error: error.message, stack: error.stack });\n \n this.setState({\n error,\n errorInfo,\n });\n }\n\n handleReset = () => {\n this.setState({ hasError: false, error: undefined, errorInfo: undefined });\n };\n\n render() {\n if (this.state.hasError) {\n if (this.props.fallback) {\n return this.props.fallback;\n }\n\n return (\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '100vh',\n padding: '20px',\n textAlign: 'center',\n backgroundColor: '#fef2f2',\n color: '#dc2626',\n fontFamily: 'system-ui, sans-serif'\n }}>\n <h1 style={{ fontSize: '24px', marginBottom: '16px' }}>\n 🚨 Oops! Something went wrong\n </h1>\n <p style={{ fontSize: '16px', marginBottom: '24px', maxWidth: '500px' }}>\n The game encountered an unexpected error. Don't worry, your progress is saved!\n </p>\n \n <button\n onClick={this.handleReset}\n style={{\n padding: '12px 24px',\n fontSize: '16px',\n backgroundColor: '#dc2626',\n color: 'white',\n border: 'none',\n borderRadius: '8px',\n cursor: 'pointer',\n transition: 'background-color 0.2s'\n }}\n onMouseOver={(e) => e.currentTarget.style.backgroundColor = '#b91c1c'}\n onMouseOut={(e) => e.currentTarget.style.backgroundColor = '#dc2626'}\n >\n 🔄 Restart Game\n </button>\n \n {typeof process !== 'undefined' && process.env.NODE_ENV === 'development' && this.state.error && (\n <details style={{ marginTop: '20px', textAlign: 'left', maxWidth: '600px' }}>\n <summary style={{ cursor: 'pointer', fontSize: '14px' }}>\n Technical Details (Development Only)\n </summary>\n <pre style={{\n backgroundColor: '#f3f4f6',\n padding: '12px',\n borderRadius: '4px',\n fontSize: '12px',\n overflow: 'auto',\n marginTop: '8px'\n }}>\n {this.state.error.toString()}\n {this.state.errorInfo?.componentStack}\n </pre>\n </details>\n )}\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n\n"],"names":["REACT_ELEMENT_TYPE","REACT_FRAGMENT_TYPE","jsxProd","type","config","maybeKey","key","propName","reactJsxRuntime_production","getComponentNameFromType","REACT_CLIENT_REFERENCE","REACT_PROFILER_TYPE","REACT_STRICT_MODE_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_ACTIVITY_TYPE","REACT_PORTAL_TYPE","REACT_CONTEXT_TYPE","REACT_CONSUMER_TYPE","REACT_FORWARD_REF_TYPE","innerType","REACT_MEMO_TYPE","REACT_LAZY_TYPE","testStringCoercion","value","checkKeyStringCoercion","JSCompiler_inline_result","JSCompiler_temp_const","JSCompiler_inline_result$jscomp$0","getTaskName","name","getOwner","dispatcher","ReactSharedInternals","UnknownOwner","hasValidKey","hasOwnProperty","getter","defineKeyPropWarningGetter","props","displayName","warnAboutAccessingKey","specialPropKeyWarningShown","elementRefGetterWithDeprecationWarning","componentName","didWarnAboutElementRef","ReactElement","owner","debugStack","debugTask","refProp","jsxDEVImpl","isStaticChildren","children","isArrayImpl","validateChildKeys","keys","k","didWarnAboutKeySpread","node","isValidElement","object","React","require$$0","createTask","callStackForError","unknownOwnerDebugStack","unknownOwnerDebugTask","reactJsxRuntime_development","trackActualOwner","jsxRuntimeModule","require$$1","keyframes","styleTag","animations","styles","useValidation","errors","setErrors","useState","validateSentence","useCallback","sentence","index","allSentences","newErrors","duplicateIndex","s","i","validateAllSentences","sentences","allErrors","result","error","clearErrors","createAriaLabel","action","word","context","handleKeyDown","event","allowedKeys","announceToScreenReader","message","announcement","globalReset","style","shuffle","arr","Game","logoUrl","showLogo","baseURL","containerRef","useRef","validationErrors","shouldWrapWords","isMobile","isMobileDevice","getMobileButtonStyles","useEffect","stage","setStage","rounds","setRounds","timePerRound","setTimePerRound","setSentences","currentRound","setCurrentRound","words","setWords","selected","setSelected","timeLeft","setTimeLeft","score","setScore","countdown","setCountdown","resultType","setResultType","timeExpired","setTimeExpired","bestScore","setBestScore","timerRef","hover","setHover","setIsMobile","scale","setScale","containerSize","setContainerSize","isDesktopLayout","setIsDesktopLayout","isIPadMiniPortrait","setIsIPadMiniPortrait","isIPadMiniLandscape","setIsIPadMiniLandscape","isIPadAirPortrait","setIsIPadAirPortrait","isIPadAirLandscape","setIsIPadAirLandscape","isSurfaceDuoPortrait","setIsSurfaceDuoPortrait","isSurfaceDuoLandscape","setIsSurfaceDuoLandscape","isIPadProPortrait","setIsIPadProPortrait","isIPadProLandscape","setIsIPadProLandscape","resize","width","height","mobile","isSmallHeight","desktopLayout","finalSize","moveToken","from","to","id","insertIndex","nextWords","nextSelected","takeFrom","putTo","idx","t","token","targetIndex","handleDropTo","e","raw","fallbackId","inBank","inSelected","payload","handleSelect","num","handleTimeSelect","time","handleChange","updated","validation","normalizeSentence","getAdaptiveFontSize","wordCount","startGame","prev","startRound","target","tokens","w","correctWords","selectedTexts","missingWords","extraWords","wrongOrder","playSound","handleNext","manual","triggerConfetti","ctx","osc","gain","end","colors","canvas","pieces","draw","renderSelect","jsxs","jsx","renderTime","renderType","text","renderGetReady","renderPlay","rect","mid","renderResults","logoSrc","shouldShowLogo","ErrorBoundary","Component","errorInfo"],"mappings":"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","x_google_ignoreList":[0,1,2]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "speakid-build-a-sentence",
3
- "version": "1.0.12",
3
+ "version": "1.0.14",
4
4
  "description": "Magic Sentence Game - Interactive word building game for SPEAKID platform",
5
5
  "main": "dist/speakid-build-a-sentence.es.js",
6
6
  "module": "dist/speakid-build-a-sentence.es.js",