{"mappings":"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","sources":["","src/main.js","node_modules/language-observer/dist/index.module.js","node_modules/language-observer/dist/src/index.ts","node_modules/resource-injector/dist/index.module.js","node_modules/resource-injector/dist/src/index.ts"],"sourcesContent":["// import signupForm from './utils/signupForm';\nclass $9f02ed9a5af8fabd$var$$643fcf18b2d2e76f$var$LanguageObserver {\n constructor(){\n this.lang = \"ru\";\n this.observer = null;\n this.initializeObserver();\n this.checkInitialLanguage();\n }\n static getNestedTranslation(obj, path) {\n return path.split(\".\").reduce((acc, part)=>{\n if (acc && typeof acc === \"object\" && part in acc) return acc[part];\n return undefined;\n }, obj);\n }\n checkInitialLanguage() {\n const paramLang = this.detectLanguageFromParams();\n if (paramLang) {\n this.loadLanguage(paramLang);\n return;\n }\n const detectedLang = this.detectLanguageFromClass();\n this.loadLanguage(detectedLang);\n }\n detectLanguageFromParams() {\n if (typeof window === \"undefined\") return null;\n const urlParams = new URLSearchParams(window.location.search);\n const paramLang = urlParams.get(\"land-geo\");\n if (paramLang && globalThis.translations[paramLang]) {\n this.updateBodyClass(paramLang);\n return paramLang;\n }\n return null;\n }\n detectLanguageFromClass() {\n const localeClass = Array.from(document.body.classList).find((cls)=>cls.startsWith(\"locale-\"));\n const lang = localeClass ? localeClass.replace(\"locale-\", \"\") : \"ru\";\n const map = globalThis.translations;\n return map[lang] ? lang : \"ru\";\n }\n updateBodyClass(lang) {\n Array.from(document.body.classList).filter((cls)=>cls.startsWith(\"locale-\")).forEach((cls)=>document.body.classList.remove(cls));\n document.body.classList.add(`locale-${lang}`);\n }\n loadLanguage(lang) {\n return new Promise((resolve)=>{\n const map = globalThis.translations;\n if (map[lang]) this.lang = lang;\n else this.lang = \"ru\";\n this.applyTranslations();\n resolve();\n });\n }\n applyTranslations() {\n const map = globalThis.translations;\n const langData = map[this.lang];\n if (!langData) return;\n const elements = document.querySelectorAll(\"[data-i18n], [data-i18n-attr]\");\n elements.forEach((el)=>{\n const key = el.getAttribute(\"data-i18n\");\n const attrKeys = el.getAttribute(\"data-i18n-attr\");\n if (key) {\n const translation = $9f02ed9a5af8fabd$var$$643fcf18b2d2e76f$var$LanguageObserver.getNestedTranslation(langData, key);\n if (typeof translation === \"string\") this.updateElementText(el, translation);\n }\n if (attrKeys) {\n let attrMap;\n try {\n attrMap = JSON.parse(attrKeys);\n } catch {\n return;\n }\n Object.entries(attrMap).forEach(([attr, transKey])=>{\n const attrTranslation = $9f02ed9a5af8fabd$var$$643fcf18b2d2e76f$var$LanguageObserver.getNestedTranslation(langData, transKey);\n if (typeof attrTranslation === \"string\") el.setAttribute(attr, attrTranslation);\n });\n }\n });\n }\n updateElementText(el, translation) {\n if (el.childNodes.length) el.childNodes.forEach((node)=>{\n if (node.nodeType === Node.TEXT_NODE) node.textContent = translation;\n });\n else el.textContent = translation;\n }\n initializeObserver() {\n this.observer = new MutationObserver((mutations)=>{\n mutations.forEach((mutation)=>{\n if (mutation.type === \"attributes\" && mutation.attributeName === \"class\") {\n const detectedLang = this.detectLanguageFromClass();\n if (detectedLang !== this.lang) this.loadLanguage(detectedLang);\n }\n });\n });\n this.observer.observe(document.body, {\n attributes: true,\n attributeFilter: [\n \"class\"\n ]\n });\n }\n init(options = {}) {\n const { lang: lang } = options;\n if (lang) {\n this.updateBodyClass(lang);\n this.loadLanguage(lang);\n }\n }\n updateTranslations() {\n this.applyTranslations();\n }\n async loadTranslations(lang, translationLoader) {\n globalThis.translations[lang] = await translationLoader(lang);\n if (lang === this.lang) this.applyTranslations();\n }\n}\nvar $9f02ed9a5af8fabd$export$2e2bcd8739ae039 = $9f02ed9a5af8fabd$var$$643fcf18b2d2e76f$var$LanguageObserver;\n\n\nclass $ecebe1b2365b9e6d$var$$643fcf18b2d2e76f$var$ResourceInjector {\n static #_ = this.loadedResources = new Map();\n constructor(){}\n async loadResource(config) {\n const { url: url, type: type, options: options = {}, timeout: timeout = 10000, forceReload: forceReload = false, appendTimestamp: appendTimestamp = false } = config;\n const resourceUrl = appendTimestamp ? `${url}?t=${Date.now()}` : url;\n if (!forceReload && $ecebe1b2365b9e6d$var$$643fcf18b2d2e76f$var$ResourceInjector.loadedResources.has(resourceUrl)) return $ecebe1b2365b9e6d$var$$643fcf18b2d2e76f$var$ResourceInjector.loadedResources.get(resourceUrl);\n if (forceReload) {\n const existingElement = document.querySelector(type === \"script\" ? `script[src=\"${url}\"]` : `link[href=\"${url}\"]`);\n if (existingElement) existingElement.remove();\n $ecebe1b2365b9e6d$var$$643fcf18b2d2e76f$var$ResourceInjector.loadedResources.delete(resourceUrl);\n }\n const promise = new Promise((resolve, reject)=>{\n const element = type === \"script\" ? document.createElement(\"script\") : document.createElement(\"link\");\n if (type === \"script\") element.src = resourceUrl;\n else {\n element.href = resourceUrl;\n element.rel = \"stylesheet\";\n }\n Object.assign(element, options);\n const timer = setTimeout(()=>{\n reject(new Error(`Resource load timeout: ${resourceUrl}`));\n }, timeout);\n element.onload = ()=>{\n clearTimeout(timer);\n $ecebe1b2365b9e6d$var$$643fcf18b2d2e76f$var$ResourceInjector.loadedResources.set(resourceUrl, promise);\n resolve();\n };\n element.onerror = ()=>{\n clearTimeout(timer);\n $ecebe1b2365b9e6d$var$$643fcf18b2d2e76f$var$ResourceInjector.loadedResources.delete(resourceUrl);\n reject(new Error(`Failed to load resource: ${resourceUrl}`));\n };\n if (type === \"script\") document.body.appendChild(element);\n else document.head.appendChild(element);\n });\n $ecebe1b2365b9e6d$var$$643fcf18b2d2e76f$var$ResourceInjector.loadedResources.set(resourceUrl, promise);\n return promise;\n }\n}\nvar $ecebe1b2365b9e6d$export$2e2bcd8739ae039 = $ecebe1b2365b9e6d$var$$643fcf18b2d2e76f$var$ResourceInjector;\n\n\nconst $869ead33dd65bda5$var$App = {\n initLanguageObserver () {\n this.languageObserver = new (0, $9f02ed9a5af8fabd$export$2e2bcd8739ae039)();\n this.languageObserver.init();\n },\n async loadSignupForm () {\n const resourceInjector = new (0, $ecebe1b2365b9e6d$export$2e2bcd8739ae039)();\n await resourceInjector.loadResource({\n url: \"https://champcasino.ink/common/scripts/signup-form.js\",\n type: \"script\",\n timeout: 10000,\n forceReload: true,\n appendTimestamp: true\n });\n },\n async init () {\n // await signupForm.init();\n await this.loadSignupForm();\n this.initLanguageObserver();\n }\n};\ndocument.addEventListener(\"DOMContentLoaded\", ()=>$869ead33dd65bda5$var$App.init());\n\n\n//# sourceMappingURL=index.1d63d222.js.map\n","// import signupForm from './utils/signupForm';\r\nimport LanguageObserver from 'language-observer';\r\nimport ResourceInjector from 'resource-injector';\r\n\r\nconst App = {\r\n initLanguageObserver() {\r\n this.languageObserver = new LanguageObserver();\r\n this.languageObserver.init();\r\n },\r\n\r\n async loadSignupForm() {\r\n const resourceInjector = new ResourceInjector();\r\n\r\n await resourceInjector\r\n .loadResource({\r\n url: 'https://champcasino.ink/common/scripts/signup-form.js',\r\n type: 'script',\r\n timeout: 10000,\r\n forceReload: true,\r\n appendTimestamp: true,\r\n });\r\n },\r\n\r\n async init() {\r\n // await signupForm.init();\r\n await this.loadSignupForm();\r\n this.initLanguageObserver();\r\n },\r\n};\r\n\r\ndocument.addEventListener('DOMContentLoaded', () => App.init());\r\n","class $643fcf18b2d2e76f$var$LanguageObserver {\n constructor(){\n this.lang = 'ru';\n this.observer = null;\n this.initializeObserver();\n this.checkInitialLanguage();\n }\n static getNestedTranslation(obj, path) {\n return path.split('.').reduce((acc, part)=>{\n if (acc && typeof acc === 'object' && part in acc) return acc[part];\n return undefined;\n }, obj);\n }\n checkInitialLanguage() {\n const paramLang = this.detectLanguageFromParams();\n if (paramLang) {\n this.loadLanguage(paramLang);\n return;\n }\n const detectedLang = this.detectLanguageFromClass();\n this.loadLanguage(detectedLang);\n }\n detectLanguageFromParams() {\n if (typeof window === 'undefined') return null;\n const urlParams = new URLSearchParams(window.location.search);\n const paramLang = urlParams.get('land-geo');\n if (paramLang && globalThis.translations[paramLang]) {\n this.updateBodyClass(paramLang);\n return paramLang;\n }\n return null;\n }\n detectLanguageFromClass() {\n const localeClass = Array.from(document.body.classList).find((cls)=>cls.startsWith('locale-'));\n const lang = localeClass ? localeClass.replace('locale-', '') : 'ru';\n const map = globalThis.translations;\n return map[lang] ? lang : 'ru';\n }\n updateBodyClass(lang) {\n Array.from(document.body.classList).filter((cls)=>cls.startsWith('locale-')).forEach((cls)=>document.body.classList.remove(cls));\n document.body.classList.add(`locale-${lang}`);\n }\n loadLanguage(lang) {\n return new Promise((resolve)=>{\n const map = globalThis.translations;\n if (map[lang]) this.lang = lang;\n else this.lang = 'ru';\n this.applyTranslations();\n resolve();\n });\n }\n applyTranslations() {\n const map = globalThis.translations;\n const langData = map[this.lang];\n if (!langData) return;\n const elements = document.querySelectorAll('[data-i18n], [data-i18n-attr]');\n elements.forEach((el)=>{\n const key = el.getAttribute('data-i18n');\n const attrKeys = el.getAttribute('data-i18n-attr');\n if (key) {\n const translation = $643fcf18b2d2e76f$var$LanguageObserver.getNestedTranslation(langData, key);\n if (typeof translation === 'string') this.updateElementText(el, translation);\n }\n if (attrKeys) {\n let attrMap;\n try {\n attrMap = JSON.parse(attrKeys);\n } catch {\n return;\n }\n Object.entries(attrMap).forEach(([attr, transKey])=>{\n const attrTranslation = $643fcf18b2d2e76f$var$LanguageObserver.getNestedTranslation(langData, transKey);\n if (typeof attrTranslation === 'string') el.setAttribute(attr, attrTranslation);\n });\n }\n });\n }\n updateElementText(el, translation) {\n if (el.childNodes.length) el.childNodes.forEach((node)=>{\n if (node.nodeType === Node.TEXT_NODE) node.textContent = translation;\n });\n else el.textContent = translation;\n }\n initializeObserver() {\n this.observer = new MutationObserver((mutations)=>{\n mutations.forEach((mutation)=>{\n if (mutation.type === 'attributes' && mutation.attributeName === 'class') {\n const detectedLang = this.detectLanguageFromClass();\n if (detectedLang !== this.lang) this.loadLanguage(detectedLang);\n }\n });\n });\n this.observer.observe(document.body, {\n attributes: true,\n attributeFilter: [\n 'class'\n ]\n });\n }\n init(options = {}) {\n const { lang: lang } = options;\n if (lang) {\n this.updateBodyClass(lang);\n this.loadLanguage(lang);\n }\n }\n updateTranslations() {\n this.applyTranslations();\n }\n async loadTranslations(lang, translationLoader) {\n globalThis.translations[lang] = await translationLoader(lang);\n if (lang === this.lang) this.applyTranslations();\n }\n}\nvar $643fcf18b2d2e76f$export$2e2bcd8739ae039 = $643fcf18b2d2e76f$var$LanguageObserver;\n\n\nexport {$643fcf18b2d2e76f$export$2e2bcd8739ae039 as default};\n//# sourceMappingURL=index.module.js.map\n","type Language = string;\ntype TranslationLoader = (lang: Language) => Promise>;\n\ninterface InitOptions {\n lang?: string;\n}\n\ndeclare global {\n var translations: {\n [lang: string]: Record;\n };\n}\n\nclass LanguageObserver {\n private lang: Language = 'ru';\n private observer: MutationObserver | null = null;\n\n constructor() {\n this.initializeObserver();\n this.checkInitialLanguage();\n }\n\n static getNestedTranslation(obj: Record, path: string): unknown {\n return path.split('.').reduce((acc: unknown, part: string) => {\n if (acc && typeof acc === 'object' && part in acc) {\n return (acc as Record)[part];\n }\n\n return undefined;\n }, obj);\n }\n\n private checkInitialLanguage(): void {\n const paramLang = this.detectLanguageFromParams();\n\n if (paramLang) {\n void this.loadLanguage(paramLang);\n\n return;\n }\n\n const detectedLang = this.detectLanguageFromClass();\n\n void this.loadLanguage(detectedLang);\n }\n\n private detectLanguageFromParams(): Language | null {\n if (typeof window === 'undefined') return null;\n\n const urlParams = new URLSearchParams(window.location.search);\n const paramLang = urlParams.get('land-geo');\n\n if (paramLang && globalThis.translations[paramLang]) {\n this.updateBodyClass(paramLang);\n\n return paramLang;\n }\n\n return null;\n }\n\n private detectLanguageFromClass(): Language {\n const localeClass = Array.from(document.body.classList).find((cls) =>\n cls.startsWith('locale-'),\n );\n\n const lang = localeClass ? localeClass.replace('locale-', '') : 'ru';\n const map = globalThis.translations;\n\n return map[lang] ? lang : 'ru';\n }\n\n private updateBodyClass(lang: Language): void {\n Array.from(document.body.classList)\n .filter((cls) => cls.startsWith('locale-'))\n .forEach((cls) => document.body.classList.remove(cls));\n\n document.body.classList.add(`locale-${lang}`);\n }\n\n public loadLanguage(lang: Language): Promise {\n return new Promise((resolve) => {\n const map = globalThis.translations;\n\n if (map[lang]) {\n this.lang = lang;\n } else {\n this.lang = 'ru';\n }\n\n this.applyTranslations();\n\n resolve();\n });\n }\n\n public applyTranslations(): void {\n const map = globalThis.translations;\n const langData = map[this.lang];\n\n if (!langData) return;\n\n const elements = document.querySelectorAll('[data-i18n], [data-i18n-attr]');\n\n elements.forEach((el) => {\n const key = el.getAttribute('data-i18n');\n const attrKeys = el.getAttribute('data-i18n-attr');\n\n if (key) {\n const translation = LanguageObserver.getNestedTranslation(langData, key);\n\n if (typeof translation === 'string') {\n this.updateElementText(el, translation);\n }\n }\n\n if (attrKeys) {\n let attrMap: Record;\n\n try {\n attrMap = JSON.parse(attrKeys) as Record;\n } catch {\n return;\n }\n\n Object.entries(attrMap).forEach(([attr, transKey]) => {\n const attrTranslation = LanguageObserver.getNestedTranslation(langData, transKey);\n\n if (typeof attrTranslation === 'string') {\n el.setAttribute(attr, attrTranslation);\n }\n });\n }\n });\n }\n\n private updateElementText(el: Element, translation: string): void {\n if (el.childNodes.length) {\n el.childNodes.forEach((node) => {\n if (node.nodeType === Node.TEXT_NODE) {\n node.textContent = translation;\n }\n });\n } else {\n el.textContent = translation;\n }\n }\n\n private initializeObserver(): void {\n this.observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n if (mutation.type === 'attributes' && mutation.attributeName === 'class') {\n const detectedLang = this.detectLanguageFromClass();\n\n if (detectedLang !== this.lang) {\n void this.loadLanguage(detectedLang);\n }\n }\n });\n });\n\n this.observer.observe(document.body, {\n attributes: true,\n attributeFilter: ['class'],\n });\n }\n\n public init(options: InitOptions = {}): void {\n const { lang } = options;\n\n if (lang) {\n this.updateBodyClass(lang);\n\n void this.loadLanguage(lang);\n }\n }\n\n public updateTranslations(): void {\n this.applyTranslations();\n }\n\n public async loadTranslations(\n lang: Language,\n translationLoader: TranslationLoader,\n ): Promise {\n globalThis.translations[lang] = await translationLoader(lang);\n\n if (lang === this.lang) {\n this.applyTranslations();\n }\n }\n}\n\nexport default LanguageObserver;\n","class $643fcf18b2d2e76f$var$ResourceInjector {\n static #_ = this.loadedResources = new Map();\n constructor(){}\n async loadResource(config) {\n const { url: url, type: type, options: options = {}, timeout: timeout = 10000, forceReload: forceReload = false, appendTimestamp: appendTimestamp = false } = config;\n const resourceUrl = appendTimestamp ? `${url}?t=${Date.now()}` : url;\n if (!forceReload && $643fcf18b2d2e76f$var$ResourceInjector.loadedResources.has(resourceUrl)) return $643fcf18b2d2e76f$var$ResourceInjector.loadedResources.get(resourceUrl);\n if (forceReload) {\n const existingElement = document.querySelector(type === 'script' ? `script[src=\"${url}\"]` : `link[href=\"${url}\"]`);\n if (existingElement) existingElement.remove();\n $643fcf18b2d2e76f$var$ResourceInjector.loadedResources.delete(resourceUrl);\n }\n const promise = new Promise((resolve, reject)=>{\n const element = type === 'script' ? document.createElement('script') : document.createElement('link');\n if (type === 'script') element.src = resourceUrl;\n else {\n element.href = resourceUrl;\n element.rel = 'stylesheet';\n }\n Object.assign(element, options);\n const timer = setTimeout(()=>{\n reject(new Error(`Resource load timeout: ${resourceUrl}`));\n }, timeout);\n element.onload = ()=>{\n clearTimeout(timer);\n $643fcf18b2d2e76f$var$ResourceInjector.loadedResources.set(resourceUrl, promise);\n resolve();\n };\n element.onerror = ()=>{\n clearTimeout(timer);\n $643fcf18b2d2e76f$var$ResourceInjector.loadedResources.delete(resourceUrl);\n reject(new Error(`Failed to load resource: ${resourceUrl}`));\n };\n if (type === 'script') document.body.appendChild(element);\n else document.head.appendChild(element);\n });\n $643fcf18b2d2e76f$var$ResourceInjector.loadedResources.set(resourceUrl, promise);\n return promise;\n }\n}\nvar $643fcf18b2d2e76f$export$2e2bcd8739ae039 = $643fcf18b2d2e76f$var$ResourceInjector;\n\n\nexport {$643fcf18b2d2e76f$export$2e2bcd8739ae039 as default};\n//# sourceMappingURL=index.module.js.map\n","class ResourceInjector {\n private static loadedResources: Map> = new Map();\n\n constructor() {}\n\n async loadResource(config: {\n url: string;\n type: 'script' | 'style';\n options?: Partial;\n timeout?: number;\n forceReload?: boolean;\n appendTimestamp?: boolean;\n }): Promise {\n const {\n url,\n type,\n options = {},\n timeout = 10000,\n forceReload = false,\n appendTimestamp = false,\n } = config;\n\n const resourceUrl = appendTimestamp ? `${url}?t=${Date.now()}` : url;\n\n if (!forceReload && ResourceInjector.loadedResources.has(resourceUrl)) {\n return ResourceInjector.loadedResources.get(resourceUrl) as Promise;\n }\n\n if (forceReload) {\n const existingElement = document.querySelector(\n type === 'script' ? `script[src=\"${url}\"]` : `link[href=\"${url}\"]`,\n );\n\n if (existingElement) {\n existingElement.remove();\n }\n\n ResourceInjector.loadedResources.delete(resourceUrl);\n }\n\n const promise: Promise = new Promise((resolve, reject): void => {\n const element: HTMLScriptElement | HTMLLinkElement =\n type === 'script' ? document.createElement('script') : document.createElement('link');\n\n if (type === 'script') {\n (element as HTMLScriptElement).src = resourceUrl;\n } else {\n (element as HTMLLinkElement).href = resourceUrl;\n (element as HTMLLinkElement).rel = 'stylesheet';\n }\n\n Object.assign(element, options);\n\n const timer: ReturnType = setTimeout((): void => {\n reject(new Error(`Resource load timeout: ${resourceUrl}`));\n }, timeout);\n\n element.onload = (): void => {\n clearTimeout(timer);\n ResourceInjector.loadedResources.set(resourceUrl, promise);\n resolve();\n };\n\n element.onerror = (): void => {\n clearTimeout(timer);\n ResourceInjector.loadedResources.delete(resourceUrl);\n reject(new Error(`Failed to load resource: ${resourceUrl}`));\n };\n\n if (type === 'script') {\n document.body.appendChild(element as HTMLScriptElement);\n } else {\n document.head.appendChild(element as HTMLLinkElement);\n }\n });\n\n ResourceInjector.loadedResources.set(resourceUrl, promise);\n\n return promise;\n }\n}\n\nexport default ResourceInjector;\n"],"names":["$9f02ed9a5af8fabd$var$$643fcf18b2d2e76f$var$LanguageObserver","constructor","lang","observer","initializeObserver","checkInitialLanguage","getNestedTranslation","obj","path","split","reduce","acc","part","paramLang","detectLanguageFromParams","loadLanguage","detectedLang","detectLanguageFromClass","window","urlParams","URLSearchParams","location","search","get","globalThis","translations","updateBodyClass","localeClass","Array","from","document","body","classList","find","cls","startsWith","replace","map","filter","forEach","remove","add","Promise","resolve","applyTranslations","langData","elements","querySelectorAll","el","key","getAttribute","attrKeys","translation","updateElementText","attrMap","JSON","parse","Object","entries","attr","transKey","attrTranslation","setAttribute","childNodes","length","node","nodeType","Node","TEXT_NODE","textContent","MutationObserver","mutations","mutation","type","attributeName","observe","attributes","attributeFilter","init","options","updateTranslations","loadTranslations","translationLoader","$ecebe1b2365b9e6d$var$$643fcf18b2d2e76f$var$ResourceInjector","loadedResources","Map","loadResource","config","url","timeout","forceReload","appendTimestamp","resourceUrl","Date","now","has","existingElement","querySelector","delete","promise","reject","element","createElement","src","href","rel","assign","timer","setTimeout","Error","onload","clearTimeout","set","onerror","appendChild","head","$869ead33dd65bda5$var$App","initLanguageObserver","languageObserver","loadSignupForm","resourceInjector","addEventListener"],"version":3,"file":"index.1d63d222.js.map"}