@dabalabs/lang 0.0.1-beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/environment.ts","../src/edit/dev-mode.ts","../src/api/translate-api.ts","../src/dom/ignore.ts","../src/dom/crawler.ts","../src/dom/apply.ts","../src/dom/document-lang.ts","../src/edit/inline-editor.ts","../src/path-routing.ts","../src/ui/flag-svgs.ts","../src/ui/language-switcher.ts","../src/dabalang.ts"],"names":[],"mappings":"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","file":"dabalang.cjs","sourcesContent":["/**\n * Which deployment tier this widget talks to.\n *\n * Production is the default in every direction: an embed that says\n * nothing about its environment is a customer's live site, and the one\n * outcome worth engineering against is a production page silently\n * pointing at staging. So the mapping is deliberately asymmetric —\n * \"staging\" must be asked for by name, and anything else resolves to\n * production.\n */\nexport type DabaEnvironment = \"production\" | \"staging\";\n\nconst GATEWAY_URLS: Record<DabaEnvironment, string> = {\n production: \"https://api.dabalabs.com\",\n staging: \"https://api-staging.dabalabs.com\",\n};\n\n/**\n * Resolve the gateway origin from the two ways a caller can express it.\n *\n * Precedence is explicit-over-implicit: an absolute `gatewayUrl` always\n * wins, because it is the only option that can name a host neither tier\n * covers (a self-hosted deployment, a branch preview, a local gateway).\n * `env` is the shorthand for the two hosts we run.\n *\n * An unrecognised `env` warns and falls back to production rather than\n * throwing: a typo like \"stagng\" must not take down a customer's page,\n * but it must also not quietly route live traffic somewhere unintended,\n * and the console is where an integrator will look.\n */\nexport function resolveGatewayUrl(gatewayUrl?: string, env?: string): string {\n if (gatewayUrl) return gatewayUrl;\n if (env === undefined || env === null || env === \"\") {\n return GATEWAY_URLS.production;\n }\n const normalised = String(env).trim().toLowerCase();\n if (normalised === \"staging\") return GATEWAY_URLS.staging;\n if (normalised !== \"production\") {\n console.warn(\n `[dabalang] unknown env \"${env}\" — falling back to production. ` +\n `Use env: \"staging\" for the staging gateway, or pass an explicit gatewayUrl.`,\n );\n }\n return GATEWAY_URLS.production;\n}\n","// Copied verbatim from daba-agent's src/api/agent-api.ts::isDevEnvironment\n// — there it only affects error-message verbosity; here it gates whether\n// the double-click-to-edit UI wires up at all. No server-side enforcement\n// exists or is intended: this is a workflow safety rail for a site's own\n// developer, not a security boundary (see routes/public_translate.rs's\n// module doc in dabalabs-core).\nexport function isDevEnvironment(): boolean {\n if (typeof window === \"undefined\") return false;\n const host = window.location.hostname;\n return (\n host === \"localhost\" ||\n host === \"127.0.0.1\" ||\n host === \"[::1]\" ||\n host.endsWith(\".local\") ||\n host.endsWith(\".test\")\n );\n}\n","import { isDevEnvironment } from \"../edit/dev-mode\";\nimport type { DabaLangError, ProjectMetadata, TranslationResult } from \"../types\";\n\nexport class DabaLangFetchError extends Error {\n readonly dabaError: DabaLangError;\n constructor(dabaError: DabaLangError, cause?: unknown) {\n super(dabaError.message);\n this.dabaError = dabaError;\n this.cause = cause;\n }\n}\n\ninterface PublicProjectResponse {\n project_id: string;\n title: string;\n source_lang: string;\n target_languages: string[];\n // Optional so the widget keeps working against gateways that predate\n // per-language configuration.\n enable_path_routing?: boolean;\n languages?: {\n code: string;\n provider: string;\n path_prefix: string | null;\n is_default: boolean;\n }[];\n}\n\ninterface BatchTranslateResponse {\n translations: {\n source_text: string;\n translated_text: string;\n source: TranslationResult[\"source\"];\n }[];\n}\n\ninterface CorrectionResponse {\n id: string;\n source_text: string;\n corrected_text: string;\n}\n\nfunction classifyError(status: number): DabaLangError[\"kind\"] {\n if (status === 401) return \"invalid_key\";\n if (status === 403) return \"origin_not_allowed\";\n if (status === 404) return \"not_found\";\n if (status === 400) return \"bad_request\";\n return \"network\";\n}\n\nfunction formatHttpError(status: number, serverMessage?: string | null): string {\n if (serverMessage && serverMessage !== \"Unauthorized\" && serverMessage !== \"Not Found\") {\n return serverMessage;\n }\n switch (status) {\n case 401:\n return isDevEnvironment()\n ? \"Invalid API key (401). Check your apiKey or data-api-key attribute.\"\n : \"Translation is temporarily unavailable.\";\n case 403:\n return isDevEnvironment()\n ? \"Origin not allowed for this API key (403). Verify allowed origins in dashboard.\"\n : \"Translation is temporarily unavailable.\";\n case 404:\n return isDevEnvironment()\n ? \"Translate project not found (404). Check your projectId or data-project-id attribute.\"\n : \"Translation is temporarily unavailable.\";\n default:\n return \"Translation is temporarily unavailable. Please try again later.\";\n }\n}\n\nfunction formatNetworkError(gatewayUrl: string): string {\n if (isDevEnvironment()) {\n return `Could not reach gateway at ${gatewayUrl}. Verify network connection and gateway URL.`;\n }\n return \"Translation is temporarily unavailable.\";\n}\n\nasync function parseOrThrow<T>(response: Response): Promise<T> {\n if (!response.ok) {\n const body = await response.json().catch(() => ({ error: null }));\n const error: DabaLangError = {\n kind: classifyError(response.status),\n message: formatHttpError(response.status, body.error),\n };\n throw new DabaLangFetchError(error);\n }\n return (await response.json()) as T;\n}\n\nfunction cleanGateway(gatewayUrl: string): string {\n return gatewayUrl.replace(/\\/+$/, \"\");\n}\n\nexport async function fetchProjectMetadata(\n gatewayUrl: string,\n projectId: string,\n apiKey: string,\n): Promise<ProjectMetadata> {\n const base = cleanGateway(gatewayUrl);\n const url = `${base}/v1/public/translate/${encodeURIComponent(projectId)}?key=${encodeURIComponent(apiKey)}`;\n\n let response: Response;\n try {\n response = await fetch(url, { method: \"GET\" });\n } catch (cause) {\n throw new DabaLangFetchError({ kind: \"network\", message: formatNetworkError(base) }, cause);\n }\n\n const data = await parseOrThrow<PublicProjectResponse>(response);\n return {\n projectId: data.project_id,\n title: data.title,\n sourceLang: data.source_lang,\n targetLanguages: data.target_languages,\n enablePathRouting: data.enable_path_routing ?? false,\n languages: (data.languages ?? []).map((l) => ({\n code: l.code,\n provider: l.provider,\n pathPrefix: l.path_prefix,\n isDefault: l.is_default,\n })),\n };\n}\n\nexport async function batchTranslate(\n gatewayUrl: string,\n projectId: string,\n apiKey: string,\n targetLang: string,\n texts: string[],\n): Promise<TranslationResult[]> {\n const base = cleanGateway(gatewayUrl);\n const url = `${base}/v1/public/translate/${encodeURIComponent(projectId)}/batch?key=${encodeURIComponent(apiKey)}`;\n\n let response: Response;\n try {\n response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ target_lang: targetLang, texts }),\n });\n } catch (cause) {\n throw new DabaLangFetchError({ kind: \"network\", message: formatNetworkError(base) }, cause);\n }\n\n const data = await parseOrThrow<BatchTranslateResponse>(response);\n return data.translations.map((t) => ({\n sourceText: t.source_text,\n translatedText: t.translated_text,\n source: t.source,\n }));\n}\n\nexport async function submitCorrection(\n gatewayUrl: string,\n projectId: string,\n apiKey: string,\n targetLang: string,\n sourceText: string,\n correctedText: string,\n pageUrl?: string,\n): Promise<void> {\n const base = cleanGateway(gatewayUrl);\n const url = `${base}/v1/public/translate/${encodeURIComponent(projectId)}/corrections?key=${encodeURIComponent(apiKey)}`;\n\n let response: Response;\n try {\n response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n target_lang: targetLang,\n source_text: sourceText,\n corrected_text: correctedText,\n page_url: pageUrl,\n }),\n });\n } catch (cause) {\n throw new DabaLangFetchError({ kind: \"network\", message: formatNetworkError(base) }, cause);\n }\n\n await parseOrThrow<CorrectionResponse>(response);\n}\n","// Opt-out attribute + sensitive-input skip-list, adapted from daba-agent's\n// src/utils/page-context.ts (SENSITIVE_ELEMENT_SELECTOR /\n// isInsideIgnoredElement) — same reasoning: never translate/send off-page\n// text a visitor typed into a password or hidden field.\nexport const IGNORE_ATTR = \"data-dabalang-ignore\";\n\nconst SENSITIVE_ELEMENT_SELECTOR =\n `[${IGNORE_ATTR}], input[type=\"password\"], input[type=\"hidden\"], ` +\n '[autocomplete=\"current-password\"], [autocomplete=\"new-password\"], ' +\n '[autocomplete^=\"cc-\"]';\n\nexport function isInsideIgnoredElement(el: Element): boolean {\n return el.closest(SENSITIVE_ELEMENT_SELECTOR) !== null;\n}\n","import { isInsideIgnoredElement } from \"./ignore\";\n\n/** One crawled text node — unlike daba-agent's page-context.ts (which\n * only needs the concatenated string for an LLM prompt), dabalang keeps\n * the live `Text` node reference so it can later mutate `node.textContent`\n * in place when a translation arrives, and hit-test which node a visitor\n * double-clicked for the correction UI. `sourceText` is captured once at\n * crawl time — the permanent \"original\" value restored when switching\n * back to the source language. */\nexport interface CrawledNode {\n node: Text;\n sourceText: string;\n}\n\nfunction cleanText(s: string): string {\n return s.replace(/\\s+/g, \" \").trim();\n}\n\n/** Same TreeWalker + reject-list + visibility-check shape as daba-agent's\n * extractVisibleText, adapted to keep node references instead of\n * collapsing to one string. */\nexport function crawlVisibleText(root: Element = document.body): CrawledNode[] {\n if (!root) return [];\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, {\n acceptNode(node) {\n const parent = (node as Text).parentElement;\n if (!parent) return NodeFilter.FILTER_REJECT;\n const tag = parent.tagName;\n if (tag === \"SCRIPT\" || tag === \"STYLE\" || tag === \"NOSCRIPT\") {\n return NodeFilter.FILTER_REJECT;\n }\n if (isInsideIgnoredElement(parent)) {\n return NodeFilter.FILTER_REJECT;\n }\n const style = window.getComputedStyle(parent);\n if (style.display === \"none\" || style.visibility === \"hidden\") {\n return NodeFilter.FILTER_REJECT;\n }\n return node.textContent && node.textContent.trim() ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;\n },\n });\n\n const results: CrawledNode[] = [];\n let current = walker.nextNode();\n while (current) {\n const text = cleanText(current.textContent ?? \"\");\n if (text) {\n results.push({ node: current as Text, sourceText: text });\n }\n current = walker.nextNode();\n }\n return results;\n}\n\n/** Groups crawled nodes by their (identical) source text — the same\n * sentence repeating on a page (e.g. a nav link in the header and footer)\n * should only be translated once, and the result applied to every\n * occurrence. */\nexport function groupByText(nodes: CrawledNode[]): Map<string, Text[]> {\n const groups = new Map<string, Text[]>();\n for (const { node, sourceText } of nodes) {\n const existing = groups.get(sourceText);\n if (existing) {\n existing.push(node);\n } else {\n groups.set(sourceText, [node]);\n }\n }\n return groups;\n}\n","import { batchTranslate } from \"../api/translate-api\";\nimport { crawlVisibleText, groupByText, type CrawledNode } from \"./crawler\";\nimport type { TranslationResult } from \"../types\";\n\n/** Owns the crawled node map and drives translate-in-place. Translation is\n * lazy and session-cached: a target language is only batch-translated the\n * first time a visitor selects its pill (not pre-fetched for every\n * configured language on load), and re-selecting a language already\n * fetched this session reuses the in-memory result instead of a second\n * network call — the gateway's own translate_cache table is the\n * cross-visitor cache; this is just the per-session layer on top of it. */\nexport class TranslationApplier {\n private groups: Map<string, Text[]>;\n private fetchedLanguages = new Map<string, Map<string, string>>();\n private activeLang: string | null = null;\n\n constructor(\n private root: Element,\n private gatewayUrl: string,\n private projectId: string,\n private apiKey: string,\n ) {\n this.groups = groupByText(crawlVisibleText(root));\n }\n\n /** Re-crawls the current DOM — call after content is known to have\n * changed (e.g. after a route change in an SPA). Not called\n * automatically; dabalang does one crawl per page load. */\n recrawl(): void {\n this.groups = groupByText(crawlVisibleText(this.root));\n }\n\n currentLanguage(): string | null {\n return this.activeLang;\n }\n\n /** Every distinct source text currently on the page — used both to\n * build a batch-translate request and, from the inline editor, to\n * resolve a double-clicked node's original sentence. */\n sourceTexts(): string[] {\n return Array.from(this.groups.keys());\n }\n\n nodesFor(sourceText: string): Text[] {\n return this.groups.get(sourceText) ?? [];\n }\n\n /** Finds the source text a given (translated) DOM node currently\n * displays, by matching its live node reference back into the group\n * map — used by the inline editor to key a correction. */\n sourceTextForNode(node: Node): string | null {\n for (const [sourceText, nodes] of this.groups) {\n if (nodes.includes(node as Text)) return sourceText;\n }\n return null;\n }\n\n async applyLanguage(targetLang: string): Promise<void> {\n const cached = this.fetchedLanguages.get(targetLang);\n const allTexts = this.sourceTexts();\n const missing = cached ? allTexts.filter((t) => !cached.has(t)) : allTexts;\n\n if (missing.length > 0) {\n const results = await batchTranslate(this.gatewayUrl, this.projectId, this.apiKey, targetLang, missing);\n const map = cached ?? new Map<string, string>();\n for (const r of results) map.set(r.sourceText, r.translatedText);\n this.fetchedLanguages.set(targetLang, map);\n }\n\n const translations = this.fetchedLanguages.get(targetLang)!;\n for (const [sourceText, nodes] of this.groups) {\n const translated = translations.get(sourceText);\n if (translated === undefined) continue;\n for (const node of nodes) node.textContent = translated;\n }\n this.activeLang = targetLang;\n }\n\n restoreOriginal(): void {\n for (const [sourceText, nodes] of this.groups) {\n for (const node of nodes) node.textContent = sourceText;\n }\n this.activeLang = null;\n }\n\n /** Reflects a just-submitted correction immediately (every node showing\n * that source text, not just the one double-clicked) and updates this\n * session's cache so switching away and back doesn't revert it. */\n applyCorrection(sourceText: string, correctedText: string): void {\n if (!this.activeLang) return;\n const nodes = this.groups.get(sourceText) ?? [];\n for (const node of nodes) node.textContent = correctedText;\n const map = this.fetchedLanguages.get(this.activeLang);\n if (map) map.set(sourceText, correctedText);\n }\n}\n\nexport type { CrawledNode, TranslationResult };\n","/** Keeps the document's `lang` and `dir` attributes in step with the\n * selected language, per W3C i18n practice — screen readers pick the\n * right voice, `:lang()` CSS and hyphenation follow, and right-to-left\n * scripts flip the page direction. Restores the page's own attributes\n * when the visitor switches back to the original language. */\n\n/** Primary subtags whose scripts run right-to-left (the common web set:\n * Arabic, Hebrew, Farsi, Urdu, Pashto, Sindhi, Kurdish (Sorani is the\n * ambiguous case — Arabic-script by default), Divehi, Yiddish). */\nconst RTL_LANGS = new Set([\"ar\", \"he\", \"fa\", \"ur\", \"ps\", \"sd\", \"ckb\", \"dv\", \"yi\"]);\n\nexport function isRtlLanguage(lang: string): boolean {\n const primary = lang.toLowerCase().split(/[-_]/)[0];\n return RTL_LANGS.has(primary);\n}\n\nexport class DocumentLangController {\n private originalLang: string | null = null;\n private originalDir: string | null = null;\n private applied = false;\n\n /** Point the document at `lang`, remembering the page's own\n * attributes the first time so they can be put back exactly. */\n apply(lang: string): void {\n const el = document.documentElement;\n if (!this.applied) {\n this.originalLang = el.getAttribute(\"lang\");\n this.originalDir = el.getAttribute(\"dir\");\n this.applied = true;\n }\n el.setAttribute(\"lang\", lang);\n if (isRtlLanguage(lang)) {\n el.setAttribute(\"dir\", \"rtl\");\n } else if (this.originalDir !== null) {\n el.setAttribute(\"dir\", this.originalDir);\n } else {\n el.removeAttribute(\"dir\");\n }\n }\n\n /** Put the page's own `lang`/`dir` back, byte for byte. */\n restore(): void {\n if (!this.applied) return;\n const el = document.documentElement;\n if (this.originalLang !== null) el.setAttribute(\"lang\", this.originalLang);\n else el.removeAttribute(\"lang\");\n if (this.originalDir !== null) el.setAttribute(\"dir\", this.originalDir);\n else el.removeAttribute(\"dir\");\n this.applied = false;\n }\n}\n","import { submitCorrection } from \"../api/translate-api\";\nimport type { TranslationApplier } from \"../dom/apply\";\nimport { isDevEnvironment } from \"./dev-mode\";\n\nconst OVERLAY_ID = \"dabalang-edit-overlay\";\n\ninterface CaretPositionLike {\n offsetNode: Node;\n}\n\n/** Standard hit-test for \"which exact text node is under this point\" —\n * `caretPositionFromPoint` (Firefox/Chromium) with a `caretRangeFromPoint`\n * (Safari/older Chromium) fallback. This is what lets a double-click\n * resolve to one specific sentence rather than the whole containing\n * element, even when several translated sentences share a parent. */\nfunction textNodeAtPoint(x: number, y: number): Text | null {\n const doc = document as Document & {\n caretPositionFromPoint?: (x: number, y: number) => CaretPositionLike | null;\n caretRangeFromPoint?: (x: number, y: number) => Range | null;\n };\n if (typeof doc.caretPositionFromPoint === \"function\") {\n const pos = doc.caretPositionFromPoint(x, y);\n if (pos && pos.offsetNode.nodeType === Node.TEXT_NODE) return pos.offsetNode as Text;\n }\n if (typeof doc.caretRangeFromPoint === \"function\") {\n const range = doc.caretRangeFromPoint(x, y);\n if (range && range.startContainer.nodeType === Node.TEXT_NODE) return range.startContainer as Text;\n }\n return null;\n}\n\nexport interface InlineEditorOptions {\n gatewayUrl: string;\n projectId: string;\n apiKey: string;\n applier: TranslationApplier;\n}\n\n/** Dev-only double-click-to-correct UI. Attaches a single delegated\n * `dblclick` listener on `document.body` — never per-node listeners,\n * since the page can have thousands of translated text nodes — and only\n * does anything when (a) `isDevEnvironment()` is true and (b) a\n * non-original language is currently active (there's nothing to correct\n * against the source language). A correction is applied to every node\n * showing that source text via `applier.applyCorrection`, which mutates\n * the original `Text` node references directly — no DOM node swap, so no\n * risk of losing track of a node's identity across future language\n * switches. */\nexport class InlineEditor {\n private attached = false;\n private readonly handler = (event: MouseEvent) => this.onDoubleClick(event);\n\n constructor(private readonly options: InlineEditorOptions) {}\n\n attach(): void {\n if (this.attached || !isDevEnvironment()) return;\n document.body.addEventListener(\"dblclick\", this.handler);\n this.attached = true;\n }\n\n detach(): void {\n if (!this.attached) return;\n document.body.removeEventListener(\"dblclick\", this.handler);\n this.attached = false;\n document.getElementById(OVERLAY_ID)?.remove();\n }\n\n private onDoubleClick(event: MouseEvent): void {\n const targetLang = this.options.applier.currentLanguage();\n if (!targetLang) return;\n\n const node = textNodeAtPoint(event.clientX, event.clientY);\n if (!node) return;\n const sourceText = this.options.applier.sourceTextForNode(node);\n if (!sourceText) return;\n\n event.preventDefault();\n this.openEditor(node, sourceText, targetLang);\n }\n\n private openEditor(node: Text, sourceText: string, targetLang: string): void {\n document.getElementById(OVERLAY_ID)?.remove();\n\n const rect = node.parentElement?.getBoundingClientRect();\n const overlay = document.createElement(\"div\");\n overlay.id = OVERLAY_ID;\n Object.assign(overlay.style, {\n position: \"fixed\",\n top: `${(rect?.bottom ?? 0) + 6}px`,\n left: `${rect?.left ?? 0}px`,\n zIndex: \"2147483647\",\n background: \"#ffffff\",\n border: \"1px solid rgba(0,0,0,0.15)\",\n borderRadius: \"8px\",\n boxShadow: \"0 4px 16px rgba(0,0,0,0.15)\",\n padding: \"8px\",\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n fontSize: \"13px\",\n });\n\n const textarea = document.createElement(\"textarea\");\n textarea.value = node.textContent ?? \"\";\n Object.assign(textarea.style, {\n display: \"block\",\n width: \"260px\",\n minHeight: \"56px\",\n marginBottom: \"6px\",\n font: \"inherit\",\n padding: \"4px\",\n boxSizing: \"border-box\",\n });\n\n const status = document.createElement(\"div\");\n Object.assign(status.style, { fontSize: \"11px\", color: \"#b91c1c\", minHeight: \"14px\" });\n\n const actions = document.createElement(\"div\");\n Object.assign(actions.style, { display: \"flex\", gap: \"6px\" });\n\n const saveBtn = document.createElement(\"button\");\n saveBtn.type = \"button\";\n saveBtn.textContent = \"Save\";\n const cancelBtn = document.createElement(\"button\");\n cancelBtn.type = \"button\";\n cancelBtn.textContent = \"Cancel\";\n\n const close = () => overlay.remove();\n cancelBtn.addEventListener(\"click\", close);\n\n const save = async () => {\n const correctedText = textarea.value.trim();\n if (!correctedText) return;\n saveBtn.disabled = true;\n status.textContent = \"\";\n try {\n await submitCorrection(\n this.options.gatewayUrl,\n this.options.projectId,\n this.options.apiKey,\n targetLang,\n sourceText,\n correctedText,\n window.location.href,\n );\n this.options.applier.applyCorrection(sourceText, correctedText);\n close();\n } catch (err) {\n status.textContent = err instanceof Error ? err.message : \"Failed to save correction.\";\n saveBtn.disabled = false;\n }\n };\n\n saveBtn.addEventListener(\"click\", () => void save());\n textarea.addEventListener(\"keydown\", (event) => {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n void save();\n } else if (event.key === \"Escape\") {\n close();\n }\n });\n\n actions.append(saveBtn, cancelBtn);\n overlay.append(textarea, status, actions);\n document.body.appendChild(overlay);\n textarea.focus();\n textarea.select();\n }\n}\n","import type { LanguageConfig } from \"./types\";\n\n/** Pure URL logic for path-prefix routing (`/ar/about` -> Arabic).\n *\n * The widget NEVER redirects on page load — the server owns redirects.\n * On load it only *detects* the active language from the pathname and\n * applies translations in place; navigation happens exclusively when the\n * visitor picks a language from the switcher, and only to swap/strip a\n * configured prefix. Languages without a prefix keep translating in\n * place, exactly as when path routing is off. */\nexport class PathRouter {\n /** Longest prefix first so overlapping prefixes resolve to the most\n * specific one (matching is segment-safe either way). */\n private readonly prefixed: LanguageConfig[];\n private readonly defaultLang: LanguageConfig | null;\n\n constructor(languages: LanguageConfig[]) {\n this.prefixed = languages\n .filter((l): l is LanguageConfig & { pathPrefix: string } => Boolean(l.pathPrefix))\n .sort((a, b) => b.pathPrefix.length - a.pathPrefix.length);\n this.defaultLang = languages.find((l) => l.isDefault) ?? null;\n }\n\n /** Language the current pathname is serving: the language whose prefix\n * starts the path (\"/ar\", \"/ar/about\" — but never \"/arbitrary\"), else\n * the configured default language for un-prefixed paths, else null. */\n detect(pathname: string): string | null {\n return this.detectFromPrefix(pathname) ?? this.defaultLang?.code ?? null;\n }\n\n /** Like detect(), but only a real prefix match — no default-language\n * fallback. Used to tell \"this URL is the language's own path\" (where\n * a site-translated language needs no translate pass) apart from \"the\n * default language applies here\". */\n detectFromPrefix(pathname: string): string | null {\n return this.matchPrefix(pathname)?.code ?? null;\n }\n\n /** URL (path + search + hash) the switcher should navigate to for\n * `langCode` (null = the original/source language), or null when no\n * navigation is needed and the widget should translate in place:\n * the target language has no prefix and none needs stripping, or the\n * URL wouldn't change. */\n urlFor(\n langCode: string | null,\n location: { pathname: string; search: string; hash: string },\n ): string | null {\n const current = this.matchPrefix(location.pathname);\n const target =\n langCode === null ? null : (this.prefixed.find((l) => l.code === langCode) ?? null);\n // A language without a prefix always translates in place — navigating\n // anywhere would lose the visitor's choice on reload, since no path\n // maps back to it. (Only the original language, langCode null, strips\n // the prefix: the source lives at the bare path by definition.)\n if (langCode !== null && !target) return null;\n if (!current && !target) return null;\n\n const rest = current\n ? location.pathname.slice(current.pathPrefix!.length) || \"/\"\n : location.pathname;\n const path = target ? target.pathPrefix + (rest === \"/\" ? \"\" : rest) : rest;\n if (path === location.pathname) return null;\n return path + location.search + location.hash;\n }\n\n private matchPrefix(pathname: string): LanguageConfig | null {\n for (const lang of this.prefixed) {\n const prefix = lang.pathPrefix!;\n if (pathname === prefix || pathname.startsWith(prefix + \"/\")) return lang;\n }\n return null;\n }\n}\n","// Real flag images for dabalang's language switcher — rasterized at build\n// time from the \"flag-icons\" npm package\n// (https://github.com/lipis/flag-icons, MIT License, Copyright (c) 2013\n// Panayiotis Lipiridis). Rasterizing to a small flat PNG (rather than\n// embedding the original vector SVGs, some of which include full detailed\n// coat-of-arms artwork running 100-180KB each) keeps the bundle size\n// bounded regardless of how intricate a country's official flag art is —\n// at the 60x45 display size these render pixel-identical\n// either way. Only the 46 country codes dabalang actually\n// uses are included (see FLAG_COUNTRY and ALL_WORLD_LANGUAGES in\n// language-switcher.ts). Regenerate with\n// `node scripts/generate-flag-svgs.mjs` if the language list changes\n// (needs `npm install sharp` first — it is not a normal devDependency).\nexport const FLAG_IMAGES: Record<string, string> = {\n us: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAACClBMVEUZL13jrrHw0tQaMF7nurzsxsj46uv///+9PUT03t++rLjhqKv68PCcOkkfNWEwQ20lOmUcMV8dMmAvQ2wxRW4nPGc6TXXR1d9hcJAeNGE4S3MeM2A3SnI2SXEkOWV+iqQtQWs+UHdwfptndZQrP2o8T3Zba4s5THQoPWi+xNFSYoUgNmJKW39jcpEhNmPx8vVPYINZaYozR29ebY1reZc9UHbh5OpYaIkpPmiYordfb49IWX5MXYGTnbPS1t98iaM0R3BVZYcwRG4uQmwyRm8sQGqbpLh/i6WosMEqPmnn6e6Qm7FDVXtNXoLV2eFCVXqAjKU1SHE5THMmOmZod5XQ1d6apLiMl64iN2OGkqqHk6vc3+Z9iqTJztmcpbnN0tyPmrBUZIbf4ui5j5w/UXjNydO+nqnIu8UbMV7AxtNWZojCp7N4haD9/f7o6u6NmK8bMV+1vMvZ3eTM0dv8/f16hqGiq75sepccMl+eqLvr7fHL0Nr7/PyUnrNzgZ2WoLU7TnVldJJGWH3k5+yEkKmCjqeRm7G7ws/X2+Owt8dgb497iKJOX4JBU3nx8/Xi5etAUnh5haDHzNi6wc9ebo6OmbDFy9b09fd0gZ3Fsb2ep7onO2dicZAjOGSmrsBHWX3U2OFxf5tEVnustMW3vsyIk6tJWn9RYoTCyNR3hJ+oscJygJydprrny88smqUCAAAACXBIWXMAAC4jAAAuIwF4pT92AAACiUlEQVRIx9WURXMbQRCFOxk7tgMLkqyILLAtiy2DZEuKZWaMmSnMzMzMzMzwH/NGqcptd6uyB5Xf4aup3p6dhukh0tSafCXhY5nAXSwc21KcvY5/Bk61zaUb2hlR3e4yuO7dIxKVP3loJyqKdsDQES1SP3lTnIzkdphAr0cGPR5A8PpAn1egjauUlInNdrCYhz8aJpKnAm1Epgc3EU1wNMi/rs1TEj4ysp+uBAfGWsCRzwB7bAFtYzZQdbO0Kw4Pt0vkITS8JApZmpCz39UIQ6PLT5tXKwm+9ePw8jytA13TTkTy6SOWhd08leLuQvWCiSKZKeFsA0W3zIb+GoQEp5gQ1DcTDR04DKZqcLicnnUTVdVPIpWmu02al8RAhoYgeM/VAj56RjJj92uxdMw4QNqSoyRckvQOnOJN3sZ/Ks6ibBMN7604PInGUThZpVpttn09vIpqesEzJ2XwzRwg9JeAJf2Cep+dEq0jJ+OUJmTDB5IkesusQsYgWGlrgZIyBTNfvASej/ahYC/etaC901eQSu2dWs2CFZIhEgbPWdxgMEWv7ezVLSwHbwyC6lO1vxinXAj08RSvomChuR4+VYFqGKoDGlPVfhRove4BI0fwH5riFbR2VoKVnVbamaskPhisPObHMAzHnIyONUcExkIjpfuISTEJZvVqExlPXOYhnhoAj18bJuqq6eFdP1ShOZImsttsYKupCzSbyV/OfD4sjc1GkJ4vVxJR27cZJPql/isfotlmPEM/fuGGOeYzl2TeoV6wyQgvWDrOH5NxfsO+/+Q3bGERXFzQnKr/fnpXauq3cs55OqRvc64OUb4OZXFzgQ5lsVU5OrRUW7VCh7LYqmU6tERb9Qf3Y5Nqb/wo6gAAAABJRU5ErkJggg==\",\n es: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAACjlBMVEXxvwDvuwHbpRvMzMy5Xg25XQ25XA6qFRvflQe6Xw3UyaHkxEjYyIuwJxblnwWtFxnRyrKho12Tn2+SnnPuvgTCrz/IsSTDriTDrxfsuwbvvQHxwAW9ZSnxwATYtReUnnDswA7OkDLHjlGyuZvWx4XxwQ+3vKPxvgC7ZSHhpBvJrxaUoG/DrxnwvgHlwS7vvwDxwQnfrBfpwBC/QxjUigfxwg68rJXUpo/KsTLtwhDHflbuwA/koQW/foDquhfaxGjEsBrrwA/knQXxwhGxqTK1RBXotgHmwBLrwA7ZmzC3UjXPgg7VjQfUsgHivkbBiovFVhnqvgbdw1retxPOaQzerRS2ShDYgQnFggnouxO2Ri64Vg/ouwDRtCiuGBnitBXLw8PLbhW9SCbYmwXVtALTfQrbwlXLfT7cnAXYhgiMNSW1RRG+ZFW4UxXPbgzepBS2TTDtwBfYnT24UQ+2SxHvvgDsvwzRsAK5PhPWjge9ag9mPk+8WRTewkqzMRWxIhm4Vw66WRa5UhK6ViG3SivLoIJTUGTTsn26Shu6Wy7hmAa9aAu5VSGxTh+obxe3Uw+mRhPKnX+6TDy2Qye8XBRNfXbGhwZwPETBRhLIfgnWxG3euAG7nRHbx30yWIW2TRDUxYrRwZHKqAnSsHtsNkzgrAO2RhG2RyWXdjXHmgrJiU/WqrzJimKpHBe4Vg6uGRitFRnJiWK4oBDmwCa/QhK9QxHoqAO4Ww6lnCqtfB+3TRbloAWwKhbTpAOhjyzBpwi9dArDrge/RBK5ORO9YTnckrHWxYXQyLLZp6voqgPAZ0TPv8Xpfa68YjnTw7HWscKSWGW2YUjao7u4WA7hlbfVtMG6UCLMv8LfmLi8SRHD0HM/AAAACXBIWXMAAC4jAAAuIwF4pT92AAABR0lEQVRIx2NgpwAwjGoe1UxbzRwUAIbBBHS1yNVp4Ozh7uJoqSpLhl7rwPiM1NjwUDcjadI1R1bUN9VV8ebGeZuSrrl05q51U7obG2qSSdVpE1HJwLB308ppcxYtZWDwMSFJc0z57G1bDm09vGrhgmNzGVJ89UnRXDZrM9+G7QfWb1x99MQ5hto0kmwuZObezb//4J41l86cF2Dg4SJFL2NiQccM/n071l68fuPK8ZvXOjNJ0RyQUNTFu3PF9HkXTl8VOLl4Yh4pVtv5J+U39/S2TV1y9sgpvkmtpOhVN7b1Y2Jl4cyqnjD/8nKG9pwQUnRrMnODNLNFlfQtmwwMMCdSNCuo6BmCNHtFF/e3MATZkxRVYhLiUjKcnBrmrmHZ6cEOOnKkaBYUFhKRVFRSVjOz8mSw0JYXZRi8gKLSc7SuGtU8eDUDAPIPhMyWJ3B8AAAAAElFTkSuQmCC\",\n fr: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAAACVBMVEXhAA////8AAJEvy8XiAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAJUlEQVRIx+3LoQEAAAgDoOn/R/vAsgk62WKKNLIsy7Isy7L8lA8mRgqN3ggn0gAAAABJRU5ErkJggg==\",\n de: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAAACVBMVEX/AAD/zAAAAAF1CnsLAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAJklEQVRIx+3LoQEAAAgDIPX/oz1iBgN0agIly/J1Bl7pgCzL13kBKyYKjT9HauoAAAAASUVORK5CYII=\",\n pt: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAADAFBMVEX/AAAtdAC4vwDuIwAjdADZcgD8AAAAZgD////zYWFikgDUrAD+AADQwADwEwDtIADcTwC1uwAwegBzmgDEywDLtgDdSgDUngDNzgACZgDMrQB+owDsSENZeb37AwPur6++y+V7lsrw4uTxlJTxGQBkhMLGaADvtLD/EQDRbQfjHQC3xuPsREHzXFzGZiTpdkzuvr54ngCvugDtQ0DsLgDhMADwHgDBvwDXwQDPyADZXwDRpwDYyQDb2wDSnQDEvgDFwgAhcwD3AgDbYQDYogDOiwDVegDW0gCtvACpuQCPqQDHuQD49wDdMwDGxgDyFgDrHgDGzwDQ0wDEzAAldQDXbAC9uwDXuADrJQDXeQDYngDHswC0wgCypQAreAAccADVgQDWywDk2wB7oADVtgDRmQC/rQAGZACUrABDfwDNxwDHqgC9vwCzugDCxADOnETUXAlUiQAXbgBSigCfsgC9xwCxuADVpADQh0zy8AC/rCT6BAC/lwCBngCkuADJfQDLtwDXeADWwwDPoEXGvwDSxgBOiACluQDRbAjOekChtQCesgCpuwCxvAB6mADlkVfNSRfCwgDPeADVdwDXtwDeXTLHmADiWUplkAnKeADAzea8vQCQlkHCyAB/mcziYkqrrUa2xQDj4wDhKwDIklPzDQDNqwDqWUzM1uvUi1TPcAfXcibAxgB4ksipgADROQLoOgDvGwBUdrvSVgDutqfRn0r3CgC6wAC4jwDyNTXuSkThc0rJtADsSj+/xQCzwuHWeEpohcO0r0pXeLzBzeZFa7TTcUHIrADtQkHsRUHZjQDjaC6qfQDH0ulhgcC7pEPF0ejTUwDuwbIfcQCIlkrDhAB5nwDs7gDS0gD5+QDJ1OmEl0poiErCggDuUEvVdCW7wgDyFwBwjEq5kgDdXDHoNgC5x+NkjwC1vwDGyADuSz44fQB3eUushADNTBfSOAGXpwDVcESlswDBxgBIbbbyNjasuQDjUkqytyQGZwDZkADhai2pfQDxDwC7dleksgBVIaFkAAAACXBIWXMAAC4jAAAuIwF4pT92AAABt0lEQVRIx2NgxwEYiAGjmkc1DzXNRcW19QJ8ZGku7JJYuH3PlFZxAZI1x5eIGF5ml2Zl4J/clOpPmua40gV3Ht2+cmjrgd3zpzenMJOimbGM6YnaQwaGi5sZGFTUpjak8ZGgWWLRg/uPnzIw3L3KwLBhx+qZLbHEa86ceOPmK417BgaXtsjL79LYKzUtK4BozcL7rr80ZuDk4JA9zMHByXCCh6E8lGjNddeefzbWAmqepwjUrKUjtq0ximjNgkafvun9+fjswiyFs9rHzuiJH5eKJlZz+uwPjOy/f+l/UT286eBR/VOnGRbXhDkRqVly7n8mIx0GXe1bRxRW7NdlOLlMNJuXjVhntxtKCn1n+MrBobiWg2Mnw/JJ1ZEuxId2D/vPf3/fq3OonuNQX7+0vzKBm5VozSF53S9+vHurqaykpLxq3YSqJB8HZuJTmGBO3+s3mioMbGwMGzsqEv1sLUlIniwiub1rzsvIMTDIyeTzetubm5KSq4SCMxjbZsxZsrKzQMzXzsKEtPzs6BmYzALKzxFuNtZmJJckXB5BMUyi4e7cVjzklGEsXF6uzvyjhf6o5hGrGQD80J6th/+JrwAAAABJRU5ErkJggg==\",\n it: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAAACVBMVEX///8AkkbOKzc+FDngAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAJUlEQVRIx+3LoQEAAAgDoOn/R/vAsgk6mSLFFpFlWZZlWZblp3xTRwqN7KEs+QAAAABJRU5ErkJggg==\",\n jp: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAAAilBMVEW8AC3JMVXSUnH9+PnikKS/Czb+/f3////pqrnUXXq+BzPoqbjQTGz78fPZboj55+vDHETvxM788vTQTWzXZYDEHUX99/j//v7tu8fKN1r99vjikaTwxc/KNln+/P2/DDftusbYaYPdf5a+CDToqLe/DTjYaoT56e356u7ADjm8AS6/CjXij6PYa4Vb/dw5AAAACXBIWXMAAC4jAAAuIwF4pT92AAAAw0lEQVRIx+3VxxaCMBCF4aEHsIAKUgXs9f1fT3RlyZxJ5MSF8u+/DYfcAadD0OMfwFnITNMPM3lsM92Ce5bObDlca/CQVkvg+RJeGi1EsTGFtwaGIJ4BJ1cMm8DtLIJ3Gz6uxgK4AaSGxhMPw96QxGtA80ns4tglcYnjksQBjgMSn3C8InGE44jEKY5TtV/bxzFT+4c5WwxfBB7G/tDhVTk5H+fql6TbhrXrefx4PduS591OvncxbsVFe6tYEffH/d/xFWDtPp4hr6zuAAAAAElFTkSuQmCC\",\n kr: \"data:image/png;base64,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\",\n cn: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAAA+VBMVEXuHCXwMCLuHyX//ADwMSLuHSXuICT//wD80gfuHiXvLyL93gXwPCD5swz4oQ/yVRz1dxbwMiH1exX1fBX94AXxSR7+9QLvIyTwMyHyUB380Qj4nhD1gBX7ywjzYhr//gD4ow/0cBfzWxv4nRDvLiL3kxLvJST5rw37xwn96wPwOCD96QT4pQ/vLCLzXhrvJCT81gf6uAzzYRr4mxD6wgrwOSD/+QH1fhX81wf+8wLyURz95wTxRx70axj6vAv+7AP7xgn6uwvwNSH0aRn2iRP+9wHvKiPuIiTvKyPvJyPvJiP0ahj2gRXxPx/95QT80wf1dhbxRR73jxI/rTiIAAAACXBIWXMAAC4jAAAuIwF4pT92AAAA6klEQVRIx2NgGFSAlYFTi2zNbArqcqTq4YKzVNktREnTyyINY6nI2JGol0FIkwnOdmJkYOAkRbMGOz8KP0gikHhXM7PzIfMFRcS4iNEnyMvBwcHNzi4GpKQUoSEe4O8nRJStasry7BCgrQcXFGYk1tdK1mC9vLoIIXHig8scpNeeibxU5cDObsaOEt4eXsSHtaUAiyNKeHs7u7MSp1lYlgeYIQRE4O7mdHFl9iHSZklIyPKwwEU4ubk9yc5ajL5uEmRlSVYuK/Lzs6GBLflFiQ67iQ3Z3jUyNqWgFNMXZxgFo2AUjIJRQCMAALm+D6lLBmpsAAAAAElFTkSuQmCC\",\n ae: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAAAFVBMVEX/////AAAAcy8AAAGgKxKgAAD/X1+QsgBGAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAMUlEQVRIx+3LsREAMAgDMQcS9h+ZBShc5KhevXQGNzwik8kbuWQik8kb+aWHTCb/zg1Wtw/TFr9jxAAAAABJRU5ErkJggg==\",\n in: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAAA81BMVEX/mTOQkMqGhseRkcySks3U1OuFhccSiAf////Ozuj4+PwvL57q6vbr6/br6/XS0uouLp07O6TR0eqoqNa3t93MzOdOTq29veChodO5ud/h4fGOjsrk5PKIiMbl5fLj4/KMjMqNjcri4vHd3e8EBIqLi8qmptZcXLJcXLOpqderq9gvL588PKRaWrE8PKNNTayrq9lbW7Kurtk/P6U9PaSQkMtxcb0wMJ6np9b39/u2tt3s7PbIyObk5POtrdhzc7+lpdXn5/TDw+Onp9dsbLrm5vRra7owMJ9xcb5tbbtPT63l5fPExOTHx+V0dL+1tdxvb7w1aQlOAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAv0lEQVRIx2NgGAWjYBQMJsBBAcCn2dJfUdGKizzNFu5+Cgr25sLkaDb1UvaWl3NUEmMmXbOQsbWUr5qDkwyfDj/JmnWNWCUZmZgYxVm11EnWrM3DycLm5sLGwskjQLJmPV5RCVkVFVkJUV5BkjVz8wJtDvAE2cxNsmZDO5ifDTRID20TPiUbZzUfGT5B0kObg1lM2VZezlVKn5mcFCbM7aGqaiagSV7a5hKRlhYhM20TkavYKQCjmkc1j2qmtmYA6cxAgXuPEfIAAAAASUVORK5CYII=\",\n ru: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAAACVBMVEUAOabVKx7///95ANL1AAAACXBIWXMAAC4jAAAuIwF4pT92AAAAJklEQVRIx+3LoQEAAAgDIPX/oz1iBgN0agIly/J1Bl7pgCzL13kBKyYKjT9HauoAAAAASUVORK5CYII=\",\n nl: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAAACVBMVEX///+uHCghRot4F7ptAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAJklEQVRIx+3LoQEAAAgDIPX/oz1iBgN0qgMly/J1Bl6ZgCzL13kBCBcKjW4ANfcAAAAASUVORK5CYII=\",\n tr: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAABg1BMVEXjChfjDBnjCxjjDRrpQUvlGibqSlT//////PzkFSHzmp/60dPnKjX1qq/++Pnwe4L3u77mJzL0n6TvdHv97O3kFiLsWGHlHCj2rbL73d/86ertY2zzlpzvdXzzk5n61NbtYWrlGSb/+/vykZfweYH++fr0oabqRk/mIy/ykJXkFCDmKDP1qa32srb72tz5zdDxhIvsV2D0naLnMTz85eb5xsn//f3mICzoMTzuaXHsWGLmIi7zmJ/mJjHkFSDnJTL2tLnpO0bmJTHoND/tYGjyipD4w8fkDhr1qKzoMj3+9fbkDxv84ePkFiP5ys3sVV761tjvc3rubXX85ef1q7DnLDfsWWLmJDDsXGT74OLqR1Hyj5XoN0L3trr2sbXvb3f2sLT+9PX5ycz60tTkER35ys74v8L0o6juZm7+8/PyjpTweIDpPEb4xcjtYmvsVl/+9vflFyTwfoXqRE7rVF3tYGn60NL96uv//v7oOUT97e785ufvcHflHSn61df5y874xMcak0+6AAAACXBIWXMAAC4jAAAuIwF4pT92AAABUElEQVRIx+3VZW/DMBAG4FvTUGldaYUxMzMzMzMzM9NPXy4DtW6V2P0yTcpJ+ZDXeRQ5ZzsARhn1HyshXmg+ursXLwL+s0t22if+1NPxDptNlZA9nF6dX9+4nbtJLDZFfeXe4/etraWV3rpV2xv2uXxttNbmQFsYkXXS4hK05USbkgGmOH2bmYtYIFIeYCZRH2egrTFFD2w4VoBfGNfE2YjzYgysioEtadurie2IK8h0dnJtU8mDOi0vRUxOb355Wu3fus6cLfhQWlQ8vDSi5Iuj2jgHcW2MgTHRZR9yaeNqxHUFRNoPYPWbQO6p19bpqC1E2A4wIFOssErEWfkRWZdyyVTr04na0x2WNDdQ7yq+DPXh7e8qE5oY9nOxVW3qe0jZDuCd62hkOkmKqqSvMyj49ixNmFkPscF9j6qljwMujuOTO/G9hIRX4wdk1F/WJ8RFJN4T8zRNAAAAAElFTkSuQmCC\",\n tw: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAABU1BMVEUAAJUSEpwcHKFDQ7E/AHADA5YGBpf/AAD///9/AEsEBJcCApZycsSnp9pMTLVSUrezs9+2tuFxccR2dsZISLPb2/D7+/3w8PmfADgaGqAXF59AQLAxMakfH6K1teAQEJx6esg5Oa1jY75qasF1dcbx8fkLC5oODppBQbCTk9I8PK4ICJi5ueJYWLqWltNWVrknJ6UNDZoYGJ8VFZ5dXbzn5/U/P6/+/v+trd3p6faCgsugoNhra8Jzc8VoaMDFxefJyelTU7ientcmJqWKis6FhcyQkNHMzOoTE52urt2EhMysrNx/f8r9/f5bW7rX1+6rq9xmZr9pacG6uuLAwOVaWrr39/xUVLheXr3h4fPe3vFXV7kuLqixsd/q6va7u+OAgMqGhs0BAZXc3PD6+v1lZb7v7/lRUbY+Pq6SktJvb8MJCZk6Oq18fMnl5fRGRrLv7/j5SXLzAAAACXBIWXMAAC4jAAAuIwF4pT92AAAA/ElEQVRIx2NgIARY2HECBqpq5qZEMx8jmZqdmRkYNPkZGJRYydCcFMXM4K/HYGtBlrN503J8eHQ57EjWzJgpFJMeHSxuam1iYGalwEqazUyieRFiHEBgqW8uwEaqs5lS4zjAIDaXjURnG/K5+UH0cqSEJmhxkaLZ2MvdNxCqmSMoLF6ZjTRne4hA9UZmZJMcVcIB3hDNWcnMpGoWFvcUEQRqFUsMDynQIDGeFVkZXJ34hWwc7fMZ1KS5SE5hDoLqqjpMoi7kJE95AW0GORUGI15yNEsBo4dHhoFBkpXM/CzLPVDFEEmaOQkBCTya2SkAo5pHNY9qHtU8YjUDANt9UPSjofyXAAAAAElFTkSuQmCC\",\n vn: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAAA/FBMVEXaJR3fQBncLxzaJx3bKhz++gHqhBD//wDfQhncNBv98gL87gL30wbkYRXzuAnaJh3ePxn99QHwqAzdNRv75wPyrwviVRf53gTgSxjmaRT86wPpfBHbKxznchP//QDztQr+/AD30Qb2yQflYxXlZRTwpgz42AXqgBH64ATmaxT98ALztgryswrcMhvncxP1xAjvoQ363wTodRLfQRn2xwfmbBT99AHhSxjjXRbzugndNxvysArbLRzbKB3vng3gRxjbKRzwqgv+9gHcMBzhThjcLhz+9wH//gDePBrncBP++wHiUxf65AT0vwn//ADlZBXbLBz3zgbiURfndRKgjZ52AAAACXBIWXMAAC4jAAAuIwF4pT92AAAA9klEQVRIx2NgGAWjgMGcAr0elhRoVndzJV+zPrsm2Xp1Wdmtydasx87OxUKuZm12dnZeMvXKmAE1q5KpWQWol12KmRQtLJwgYMXBwSEK0swuyQEFAkRotnFkxwq4ifO9kRMWvTwCRLrcRQNDrxDxUeYsj6pV0JOkkJZmRdIrLkFiPImJwPXyMZEcy0pwzWwk6+VUgGs2IVmzLMLLfsKkatYBaZNTA+sOJlGvrRYoUSnzs3mBQoxEzRZAPYqMQIa3DzCaA0jTbMfubuAAZgn7srP7k6bZkMsUxuRnYxUiSa89jzESLyiQpEzNiJoPOJkYRsEoGGIAABCBE0VIpKVSAAAAAElFTkSuQmCC\",\n th: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAAAFVBMVEUtKkqlGTH09fjNh5XGxc+6UmVbWXI1VVfrAAAACXBIWXMAAC4jAAAuIwF4pT92AAAANUlEQVRIx+3WyQkAMBDDQOfsv+QtQmEhoPnra5wBxLgzPkAmYNwaXyCSXtuAA9gaL8BP8k1cETkNmT0ckfQAAAAASUVORK5CYII=\",\n id: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAAACVBMVEX3qq/////nABHNIpM2AAAAAXRSTlPA24Ia1gAAAAlwSFlzAAAuIwAALiMBeKU/dgAAACVJREFUSMftyzEBAAAIA6Bp/9CG2Cn8ZAuRZVl+mytTkGVZfpsPIGAPeeyKuB8AAAAASUVORK5CYII=\",\n my: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAABZVBMVEXMAADcU1MJAGI2H23NBgbXNzftpqYAAGb////QEhL87u7QFRXmg4PmgID/zAD0ycnwuLjWLy/eWloGBWQZFFwDAmUMCmFwWjmIbTANCmFFN0oCAmV3XzYwJlMvJlOXeSpMPUgLCWIHBmN9ZDRYRkNSQkURDl8PDGCTdis6Lk+cfSgtJFTJoRZaSELCmxgBAWb0wwSJbi8fGVoKCGLvvwZKO0j+ywAIBmP9ygHYrRCyjh/xwQYoIFb8ygGeficzKVJBNEw/Mk2igiXtvgcmHlfdsQ4uJVQYE1zVqhHnuQo7L05TQkUiG1ijgiVvWTritQxlUT5GOEr7yQKmhSQSDl+7lhsOC2D4xgPwwAaGazCWeCpmUj1XRkMpIVbOpRRoUzwdF1osI1THnxbDnBjQphPquwiQcyxZR0JkUD7zwgVxWjn6yAJjTz6RdCwlHleNcS71xAQxJ1JOPkdbSUJsVjtyWzgjHFiVC1jCAAAACXBIWXMAAC4jAAAuIwF4pT92AAABW0lEQVRIx9WUZW/DMBCGM3RHN2ibpinTysw0ZmZmZt5+/yInUrcvt6SZlO35ZEt+dNZ7PjONKAwOQdFO7kb5QdahfJHHhnlDfbJxYQrGRzjThOWb3IsiyYZTWPRRL03IMTHqFQSWj8CZdGW9j1jJnpK0Obh+oAt2n+wcxcLbJOym+z4UKrMZeJRKZQOHJ5sH3lBQdmAvAM/0bH+KjSYAYGvZPGeWKb9DLi1WCobOq4K8Mh2w0X0PCpU9UDWKsoUvCS7kVmdkB/YKkBKvfXl3cyvIid2lWZdM+aMAb1Jghth9plBOrvvlt6oExTxduKJs0lm8Mq15xWfSjiLKlTI44lJtK7mIWxW97ewTzNPeEP8G4cmkXtFgVCIwyjkHh+xC7O7aYHSg1EbS7nEMmGx/5hvqQvmtb6gOuQmlE4XRjjYVMDoVaCg3q0DDVrWqQMO0G1SgYdotKving/EJT7tc+kZgNh0AAAAASUVORK5CYII=\",\n ph: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAACfFBMVEWIHlH+8br80hv///7////80Rb/+ujQqLvOESYAOKj//vr95oP+7aX95Xv//vv+99f/++v/+eD+7Jz/++z93lb+8r/+99b+7J7+6pL80hn+9Mb//vz+7ab920n+9tH+6ZH+6ZDqmKGRqdm7yuj++vsrWrf6+/3gaXbQHTFegcjPFCkNQqz92kL///3+6Y/+7J/jeYT//O/+7aJvj8780Rj/++r+77D+6pf+9c781zIDOqn92kP82Dr81zb95XzwuL794GT94WX96In93lj93E393VCzxOX95n/95oH95oD931v95n7+9tL+65n//vn94m7+9c/943D81zTSJjn+/v/tqLAWSbAGPar43N/99fbULUD87/HOEyj55Ob//v7ywMXcV2bicH3lgIv1ztMeT7I6ZbzniJPWOEoIPqvPFyvZR1dmiMvZ4fLXPE3L1u3vsLcCOqlLc8LQGC13ldGqveLzwsjl6/b65+mAnNTi6PX//f2/zemitt8vXbjRHzPv8/r19/zxusD9/f4PRK377e/VNUfUMEL++fr5+v0iU7Ts8PnroKjOEifSJDfcU2L+88T92T/+76z80yEBOaj+65v931z+99X+7qr+8rz//PD+99T+7J381CSZr9z81jH/+d/+9tBHb8D80hz+88D32dz96Ij20dX93E787vD80h3W3/H93lcUSK/aS1vt8fn/++n+7KHokJrUL0H65uj81zf94mv954X920f+8bb+8bj954bO2e794Wn920r80ho+aL3+65j81CX+7qf94Wb+9c395Hf+65r96Irk6vaIotb94GH+9s/99/f95HkhUrP/+eP93VX+6pX81Cb2+PzYg7IGAAAACHRSTlPA////////4sxqf9wAAAAJcEhZcwAALiMAAC4jAXilP3YAAAJJSURBVEjHpdUHUxNBFAfwJLyLzxQTYkICqSBSRFFQBFR6L1Lsvffee1ewgAo2sHfB3nvvvX8hL5c9Qxy83C7/mcy92bnf5N7evVlFt+6dmaOAmONX2DHAtb4D2DHApdOsWOlKC4XCnWzYcjHdDrAjKoEBG/LDVf29z75i7iKGns1GtdA5LJhOj0NBzLBl0+h3259Nq2axY4DV8R3AAGvXdwDDlnUjGPCbMlJsXDqSFke4816J9bzF8rG6axhAeclrG18aw4Sl4MMqYmuGpwo0b6sdYNfre/rWYqK2ysOWYmduBXiyy0GnHdhbfPZd0sMq4uuPtKUvKl8+e2oqMec2+7fh8XNZG/bwrorzZpD1cMAbKPwWDGv4333Bcv2OAIR0+WuV8PtjgiROsaXqbnAk2U0HEvf28tHB+iEhAB/i9/8fJx3j0gsuizjjYMM+Lpm8wXCu4Dt/7aRoN8I9RluqI1nEOY2mxIiAf74dW4/tpU3PTtLzoX96/nIzDlEK83nwhOy2KSlgt7NuIQbB6nvFpe+qf6nyrUXm80o/vXAVMSi2lDnfV4D7kwscbb6wbX16oAx89I77M2i+VurAnplJvu3oyA2IcrAwVS5tjsdbGoSliTMR5WHfPP/8oRPrUZMQqTBUFZFi7JTZSItJ1gwfisiIl89HZMTjYxEZ8egZS5AK+8+qCQvHINLhvBRySk6dg0iHDS3kfF45eRzSYjh75gQ/gdsj4xDpsfJU2knIqkVkwXzO7UFkxK3SgyeFo+t2I2MUm2uQOX8AwoyqVCRs9SEAAAAASUVORK5CYII=\",\n pl: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAAACVBMVEX////cFDztiZ3x9YxaAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAIklEQVRIx+3LMQEAAAgDoGn/0HbQU/hJAFjog9SBLMvy2zwS3QWhUuTc8gAAAABJRU5ErkJggg==\",\n ua: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAAACVBMVEUAV7j/1wB/l1wTezQyAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAIklEQVRIx+3LMQEAAAgDoGn/0HbQU/hJAFjog9SBLMvy2zwS3QWhUuTc8gAAAABJRU5ErkJggg==\",\n cz: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAAAJ1BMVEXkYmaFVXDXFBr///8RRX5YfKTn7PJTNV0iQXagtcuVJDvGGCIhUYevy8xzAAAAAnRSTlPA2DVhQJAAAAAJcEhZcwAALiMAAC4jAXilP3YAAACxSURBVEjHpc1ZDoNAEAPRyaSz5/7njUAgGOjFdur/qdrtfpVr9n39gc3k+YTl+YzV+YK1+Yql+YaF+Q7z8wGz8xGT8yOm5ifMzB2Mzz0Mz30MzgOMzUOMzGMMzDNczlNczQuczytsdmlxBX2+e1yBH5+u4nRb4Hyb4mqb4XIbY2AbYmQbYGzrY3DrYXjrYHx7wsz2iKntiMntgNntDvPbDQvbFUvbBWvbGavbCcvb3vsPus0gXTzSiD4AAAAASUVORK5CYII=\",\n se: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAAACVBMVEUAUpP+ywB/j0kXq4KkAAAACXBIWXMAAC4jAAAuIwF4pT92AAAALklEQVRIx+3ToREAAAjDwNL9h8agcFwliX8ZaeWarHtgMPgpriDwE8xVYDA4xg12SwPN9dHGiwAAAABJRU5ErkJggg==\",\n no: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAAAFVBMVEXtKTn///8AJmSvu87vRFJ4jKzxW2hLgtpAAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAUklEQVRIx+3UQQoAIQxD0cRW73/kYVzIoDAiXQiav3+bEgp0OWnpzUjHYsLCwluxd5UPLv4fONbwrBi2sVxxtmlIga7EoWvvG0lo2/okwsLH4Af6hAoLQP96EgAAAABJRU5ErkJggg==\",\n dk: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAAADFBMVEXIEC7////vvMT67O6nMZ7HAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAOklEQVRIx+3SIRIAIAwDwTT9/58ZsBUMVCC482sykWqOmXUVGAwGH2LXcuH0NkWjL3Frbb4NBoPf4gFuJQNtOAeJIAAAAABJRU5ErkJggg==\",\n fi: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAAAG1BMVEX///8AL2xbeaBGaJRyjK5zja4ZQ3opUYMpUIRqG4r8AAAACXBIWXMAAC4jAAAuIwF4pT92AAAAQklEQVRIx+3TuwoAIAxD0dT3/3+xo5JBKEW65O5nSwCq26nCmbCwcCou1LzwKO9ggYSFP2Pe6/Jsm2uRSwoLC2fiDYPcBdIjHewZAAAAAElFTkSuQmCC\",\n gr: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAAAD1BMVEUNXq////8OX6/+/v/9/f9kIxy1AAAACXBIWXMAAC4jAAAuIwF4pT92AAAASklEQVRIx2NggANGEGAgEwwPzUyEAW7NzIwEwYjUTIyx+CMIG2AavppHUxgSn4WZIGAYLcMYydBCJhiRmkciYKIAjKaw0RRGWwAAr00Ft+dVDPkAAAAASUVORK5CYII=\",\n il: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAABVlBMVEUAOLgRRb27yuwEO7kiU8EzYMbM1/H////d5Pbu8voGPbr5+v0DOrn8/f4JP7vy9fv3+f3v8/sKQLsUSL5Gb8taftEmVsMWSb6zxOq+zO0IPrrY4fSwwekSRr3U3fPV3vMCOrmyw+pqi9b9/f7c5PUBObjJ1fBFbstHb8yuwOj19/y4yOvh6PfE0e/z9vzAzu3I1PB9mtsuXMXa4vUsWsSWreKXruK9y+0HPbpUes/Q2vL+/v8ZTL/b4/UpWMN5ltodT8BpitWasOM8Z8mZr+MjU8LF0u8tW8WVrOFtjdbG0++Hod4cTcBZfdHBzu77/P4VSL6ftOSBnNzd5fULQbtxkNcCObl2lNlkhtTt8fro7flYfdA6Zcj4+v3S3PIFPLmYr+IlVcIqWcR+mttzktgnVsPP2vJbf9FOdc6qveeKpN40YcYkVMIrWsREbcuxwulXfNA3Y8f4DF/HAAAACXBIWXMAAC4jAAAuIwF4pT92AAABNUlEQVRIx2NgpwAwDFHNrBQAhlFAIuCgAOCPZ10KEomkkA7ZmnmN+ETJ1mwqayClT6ZmQWEzdkMTfxI167GBgSiLMYeceBAkYLWI1cwthhGh4oJEOzufS42Ts7AAbFBOOidnJkMgCX7WyGNX5FIBMzV55LhTs5VJ0CzPrJmbAmWrZ2QpqJEU2kp8spFQZhoPXwRpUaWiGorwQ1gwaZodFWz4ocy4eNVwkjTLM7s42EOYyjFJyVzSpGgWcbZ24rIFMxMYJGMT1UnQLMNsxc5rZwliRjFGA/kMiuzEpzAeRkZGCwYGZkbGEAYGKUZGBhYBYjVzMoGAm6+PF5tfgBIkofOTmKs4hb3ZPV0FyMzPHkISzBJklyTuPCLkl2HmuCKYqFpSm5ZVLAsFYLTKJBVwUgCGaCMOABfcUIWqAz5TAAAAAElFTkSuQmCC\",\n hu: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAAAD1BMVEU4jQD////UNRb//f3UNheVJ7xlAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAK0lEQVRIx+3LqQEAIBADsPLsPzMLnKtBJD65heyCLMtTPoWsgizLUwZ+8gABHQt9z6Q2+QAAAABJRU5ErkJggg==\",\n ro: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAAADFBMVEXeIRAAMZz/3gABMpvYuVFOAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAJklEQVRIx+3LJwEAAAgAME7/zgQAjdr8IreuQ1xkWZZlWZZl+SkPxjsK5xY4LCIAAAAASUVORK5CYII=\",\n bg: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAAACVBMVEXWJhL///8Alm5Wkjw3AAAACXBIWXMAAC4jAAAuIwF4pT92AAAAJklEQVRIx+3LoQEAAAgDIPX/oz1iBgN0qgMly/J1noAsy+cZ+GQBKyYKjbJcloAAAAAASUVORK5CYII=\",\n hr: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAACf1BMVEX/////u7v/X1//paX/3d3/8vL/mZkXF5b/AAD/Wlr/hIT/g4P/ZmYAk93/qKj/RET/IiL/AgL/Cgr/hYX/CAj/zMz/9fX/V1f/XFz/rKz/7+//sLD/9/f//v7/r6//nJz/m5v/iIj/CQn/DQ2wiqD/BgaeiqbvKzD/hoYHlt4XF5UaF5RLI4Y5HIhjLYM7HIf9dHX/pqb/29vxqbEbF5SKQID+bW1kK4BNIoP/pKT9cnP/qqr/o6P/amr+a2uLPX3/qanjk6Lyp68rFYkZF5UtFYjjkJ/+i4z+iov/YGD/Skr/SEj/Kyv/8/P/Jyf/kpL7GBn/9PTJb3//oqL+HR39FBX+Hx/Lb379GBnYX2v4MDQuodwimM79FhcanuDaX2o3puD3MDSMtdbXfYezhJrUZXEmouGwoxpxo8jgR1jSZXJCg3Nxps8tLaBatOSsAwMVnOBsWan/yMj/xsZ7Za3qO0dDqN8ppOIjhp7Gb4MrK59QgmDvOkO2jKEohZgNisDEc4fcRlmti6MPmd85fLw5hH9uKXhiveoMmN/yAQhhodVKsueFDE+0FzyWXJYjFo6+UHTDBidHEncxMqFgaqupCTinLlkcn+GcCkAcF5M6fnbkOkl+D1VKEnX8AAIClN0fneCko742NaOuPj8+fnFeglFmD2P/JSX7AAJSf1pLgGL/GxsVk9D/Ghp6iDc2od8mmtvjAxJ8hzQVmd4qgY1+ijUWlM8tfodmg0wzNaT/KCgTk9pGPl7lO0mEjDE1itK/UHOXXJXChJAxD19yXyslj9Y7K2mzbY3OthWSgiM3quRBSp7QWFqkExMZGJJ7qNR+cCx+PSMpHYQ9N2Rep9mt2rWvAAAACXBIWXMAAC4jAAAuIwF4pT92AAABxklEQVRIx2PgoAAwjGqmluYoQQ6O1CwODsFE0jQLhnFwZOYWltY2dzTVlFQ1cnCECBKtOTwup7KtZ2rvrJWrluxkZ1/UkBETRKzm0ITsipbOiTPmLN20bseei4e1FtSlRwcQqTmet7qVd3L/3GWbt2zfffnEydOn5tfzRhKpWbWMl3f6tHkrNm7Yuu/osSMXjp89szBPlVg/p5S3d0+ZNJN9/Zpt+7XOXTp/aHF+MtEBFpvGq9nVN2H28rWrd+09cPCKZkFSBPHxrKKmjsxVV1PBHs9YgTATE1ORqKgGE5OGqGgxkCPMQDzgBhorxsDAycHBycDACuRwkag5kBLNvuRqdmBhYfETEAhmYVEQEPABcqxJ0CwHxCIcHMwMDMwcHMpAjjSJmpXI1WzDyMjozc/vz8goz8/vBeRYkhhgrAwMEhwc4uSFNtmaudA1k5LCFNjY2Hh4eBTZ2BR5eGyBHHkSNEvCo4qPg0MIKkAsMJJC1SzFQoJmBkNYPEM08+FQxo4V6FshcpUMh4EudlU4NLOb2yE0m+mxk6aZ3cJJFqJZ1liHnVTN7Cb2bh5Mnu6OptrspGsGAhdXZ3zS+DUTAqOaRzUTBADUW48hhKY0pQAAAABJRU5ErkJggg==\",\n rs: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAADAFBMVEXGNjzosLLENzv++fl3UWzDUVn019gMQHb///9XVnn89vbfiTPo4ODi39/Yc3fo5eXorK/y8fH02Nril5n45ufxzs/lpKf24eLIPUL99/j88/Pd29ru6ur//v7ru73dh4rjm57Z2Nf129zFWlj+/Pzqs7Xh2NjafIDEPDrbysrHdWn18fG9cDX49vbYs7TDkXq4VzXaeTTMljG/iSzk4eHkx8jboqTekJPJX2bHW1/FSjmBYXh8W3Xcx8jTYUfo4+PgkZTwycr66+zQVlbuwcGxUjbTzMvFNjz5+PjOUDq0azHXcTfBj0LDiC3NZjbHQ0i2hkrh3NvQwcHgjzLbgoWrfC+5fEbgyMm+g3O4ji3ZfjPIki758/PEb3HGjy3Fk5TFlS+3eDnJmZrRpabHYmfFoKHHOD7b09DSsbHTZmvCkzvHfS/SeHrCkVG9cjLVvX7NnjTBkC3VhYn77/DQnJi+PznGsZC/fC+7gzHLm0+7VzS4SjXXv7/23t+8XTPGU1nrtrh4Vm5yTmfwysyNcITy0dLFe2723d7imZzCmGRZXH7OdTLil4TgrK704+TQWkynczby0NLOfjHHWlHGTlJoUXG1XTDczMzt09TQu7u6ilScbjDRu7rXxsjEn3fRt7e8SkXY0dDEtZPEenfNS07WbW66NzrHe33NcDTWbTbDPUKlOz7FoFvu7u7VxsbZubrEnp/DcjG8NjzKRTquhzTanZ65kDW7e33Hp2nLmi3q6enYs6rBTEzm2traxMTBjk3Qn5/WoqTMi4zCi4y1aWnIdXm1Yj3UZDe9ajTVdnrBamjQWTi9ZES3g4Ofij3MozbFfoCkgTrPxcTr5eTWkpTHmTZVVXq5mDa8fX/d0NDUgYPdhDPf1NPKkZNJVn7IiUjRazzYr7HewsLjnaDk09SBQUnWgzLbpi/KpajNrmDFi33Or2HAbEq7c0HEpVy2ijGTeleShWTHo0m9XTXIwbOEW0XDZVrfri3TbnLtzMrmpajIY2jLam718eriv7/Yi5A3ZlVQAAAACXBIWXMAAC4jAAAuIwF4pT92AAACdElEQVRIx2NgGD6ASYMCzQYb3cnX/PQrmRpXnXql/+GjfsRif5K1TokoyzWornxZXRW2SF+ZNL3K807k5zEwVL5mYvicn9epRZrmNRq575gYsj6VMvjsYPBpI0mz+yyDY5EGWuUVb84Yey0IWEWauzVmh4XmvS2v0NEJTZzgSmqITfONjtsZnVAYZ+TrRXJwL9tyNbvg+rnz2VmRJFvMsOligbFR4Xsj44RtqwmrZkcCXaysKazf/lvU11sWabFasLLasOMFKJo5GcRqrb6X6Zr/0P7y3I/RUYKFFM2ZHGJMdYl/5cxlA+pK+TgcSNIsJyguwWT1k0tUykqDQU6wjyTNMWt1GRnS2GSZufwZ1D0EPUjyM48Mf8x/M15FE0XTTC5eGfsWUjTPDFSTrrH8Y/bP4neSzEI1TWtSNM/hCb/0gu+XgJCC+g23uWq2JGmez8OrliqvKiD0WGG7Ij+vbSMpmoOkFTVTGRlrixkZ49fxSrs1kaJ5Pa+J6QY2tmJJNrakcBlpe5KiKvmyvelZvg4BIXn5I/vsBaeTpPnKHcGM+JMKAkLmIYeT7XfpkaL52q2bgnc1L4QICPEdDTrEw3OQFM33cp48KkmvWd47IzYjfbfe3q1TCWjmQAJSRQ8t75fEMupqi6cc2L9Hz2wiB16Aopkj58HtZ6cZnGRlJRk2Pwv2nsxMimY5Q+7jK9OkVFQknT2jDLk7OEjRrLLUkJu7h4uZS9KFO9jbzokkzRwiS1Z0CyuJiLe7+E2SaOYgTTOHUr+niDibaKuSs50jB6maOaQc+ITFxITVhUU4SNfMwcEsqtogysXBQZZm4sGoZnpqBgAviNVjq404xQAAAABJRU5ErkJggg==\",\n sk: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAABy1BMVEX////uISqJqtLzWWAQUaTyVVz5q68LTqLuHCXzWV8VTJ2Usdakvdz0cnj4m5/0anDvJy/zY2nvLTX//f3+8/PzW2LzYGb2i5D4pKj94+T1eH3+9vbwMDnW2+jwMjqZhal0Zpj4naH42d31eoDyWF7ErcMvTpbp2+P4oKT4pqoWTJ31eX7uIiv2hYoNTaF4ZZPd2uj5ysxiO3KpLEsPUaP6ztDi2uXuICns2N/y193m2uJUVI+SfqREQYI8Q4f1zdPH0+bwOkLvMDgoY63yztJPUo8OTaCcuNl0msr4oqXm0Nnw1ttFeLju2N4kSJTUIjNEUZFxOGqBa5fzXWPjHyvc2uanK0wrSpOPrtSMrNP0b3XzX2Xbwc6eudqatdjvJS7E1Oh8NWQSTZ7yV10vRY5BQoRLfbofS5nzWmGqK0rn2+TO1ubxRUw7TZHWxtUuaK8rR5BwmMnUgpPxRk3yS1LyUFfByt/yUVfRm6zqHSf1fYL4panzZWv3lZn0aG76wcP95+j81df5srX5qq7yTlXxSE/3mJz7xsj3j5P3mp77x8n6wsT3jpL3kJT2hov2gof1d3z+9PX819n6u77yTFP2gYb7zc//+fnxSVFApzAhAAAACXBIWXMAAC4jAAAuIwF4pT92AAABYklEQVRIx+3TRW/DQBAFYKdJupOm4YbLzMzMzMzMzMzMTD+3dmwriQ/OOrdKfqc38n4rjaUlCDFi/klUCk7iBOBAcOTYeqqlW4IALKHJFWGlC2jwrYEheuKeaTp+gFwSRJ233NyZDe9PlrNDchjwQTxxw6kUvmCv1ZGDtBcbZ1PY9iX/tX98mh4vyUGuxMb5zKbw5suUrWFsnEsePzq/fXn9+bY9X58YATaHsHEeiQ+c/9IEsOGPjRtIvG/WKBT2B4VRpd4BWMTHXezOAezO0j5sPDrCxf212Fg5QZO97V0G1zVi42m1Q3ROITRG46ZMbCyb186tTnanUz2jrbmopaMGYWO0tu6H0Hg1VcmCiksqBGDZwpLr2M77LLgYrSzPOIeqUpkHDO6ZHexhPxVUlgN/uBjk9a0OmpySpgehGMqyCuMRio6KTQThGHKSYkJDwiMBvMEAwWEREvAW40bEIvaYP2JPYKtnffG8AAAAAElFTkSuQmCC\",\n si: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAABR1BMVEX///8EALuWluUzAJEBAb/VAQGXl+XVAAD///8AAL8mAJ2np+n6+v6EhOCbKGL59vrcx94hAKHxrKyPXam4kcGuM17zt7crK8r2y8tLHJxtOJ5LQoeId1lEAIIyDaHv5O759fnq3OkRD7IxK5oDA8ANC7VQRoNEO4tYTX0bBKv64OAXFK4aF6waD6vCSmZVAHP99fVmAGTYZHF4BVnpfn/tk5OQFVX8/P4wMMuzs+wTAK7xqak/P896AFEQEMMjI8gpAJoFALtKBIF2cthRUdNzc9z+/v8IALhsAF2OjuNwAFvZ2fXCwvB4AFNhFYDb2/ZeW9N5AFMbAKcQALFhAGiDAEo6AIsiAKBXTMmioud9ddWYmOWUlORuBGBtEXCameV9fd65ue14eN3v7/uamuaKiuJhAGdsWsV+AE6treptDm1lOaZ2AFRcjgufAAAAAXRSTlP+GuMHfQAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAO1JREFUSMdj4CAfMDCMaqZEs4KiPFma+UWk5HSlObXVNSWFBUjVzMfJyamkwamjBqQFhUjULMoJAqpgklmMRM16YG0yyiBSVoJEzUZgzSpgUl+LRM0mjCBtTOIg0tCARM2mVpz23BbmljaenJzGpIa2tYOdNwcPBxC5cpoRq5kTCricfKBibi62nEQBFrhmRy9/mInOHqRq5gwMiEnlZWNKYuP14yJZc1BsAndmdEoiW4QvJ8maOcOy4oFuTk4PdSdDM2d4RnZkVFwIIyc5moGJOictmJOTTM2kgVHNQ0gzO/mAdVTzqOZRzdTWDACstmcHboP4RAAAAABJRU5ErkJggg==\",\n lt: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAAAD1BMVEXBJy0AakT9uRO0Ky/ttBbpMiVEAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAKklEQVRIx+3LOQEAMBADoPTxr7kGuuVG2MkuRJblT76FrIIsy+P5FAIMe5MGC7n3UQ/PAAAAAElFTkSuQmCC\",\n lv: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAAABlBMVEWYHjL////RHhI6AAAACXBIWXMAAC4jAAAuIwF4pT92AAAAH0lEQVRIx+3LMQEAAAwCINe/9EJ4Cj8JQO0K8kgGqD1afAIdQsJJ+gAAAABJRU5ErkJggg==\",\n ee: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAAACVBMVEX///8Xkf8AAAEl5qO5AAAACXBIWXMAAC4jAAAuIwF4pT92AAAAJklEQVRIx+3LoQEAAAgDIPX/oz1iBgN0qgMly/J1noAsy+cZ+GQBKyYKjbJcloAAAAAASUVORK5CYII=\",\n ir: \"data:image/png;base64,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\",\n pk: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAABDlBMVEUMWQsWYBX9/v0dZRwNWgzk7eTt8+0MWQv///80dDNMhUsqbioUXhM+ez37/PsOWg3L28oSXRFEf0OMsIsjaSL2+fYaYxmJrohmlmXg6t9yn3EfZh5ekV2tx60wci9ZjllPh05Ohk3q8erZ5dlKg0n8/fxdkFzM3MymwqaStZIbYxoucC0RXBB2oXWHrYbP3s+hv6CWt5YsbyxBfUFilGHh6uB4o3eyyrEQXA83djZwnW/x9fF1oXSQs4++076Eq4S1zLRCfkJ9pn2iv6HU4tRnl2fr8ev+/v58pnxhk2Bgkl+nw6fJ2sg5eDhHgUYWYBbd6N2Vt5WAqIClwqX1+PXT4dPu8+6dvJxTilO2zbW4FTU7AAAAAXRSTlP+GuMHfQAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAQFJREFUSMdj4EAGnOykAAaGUc2jmoekZiNjsjUL2przk6tZTICVGcbmJVGzoB2HFVxRZAS7nyMJmsU5rHngioJDQln9idfMLcrhAFMiIh7GwSFFgrOFOTjsoUwWmXBJDo4AaeI1m3Jw2CAUyfBJBDmxEKtZBMg0QygSCiQltIWATEOEImkxUjRzAZn65CZPXhBbm0zNWqpAtga5GUMdyGZSIVOzLojDJoeilIVYzYxKYN2KCIU8JsSnbTUwl8+AG8Ll93SxJCFLakIEmASEpSQ8vN3cvUjJzyx6yOKiriQWQwrKcGEfX5LLMB15WVagmKQzF5mlJyOzxWiNMap5aGoGADnfWYBRwr+6AAAAAElFTkSuQmCC\",\n bd: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAAA8FBMVEUAak45W0sJZ00GaU6iQEXsLEFqTkj0KkFyTUjhL0LFNkQCaU4HaE5BWUoLZ06rPUUBak5iUUlpTkjvK0ILZ00IaE4iYUwXZE0wXUziL0IYZEzuK0EeYk2SQ0ZhUUlzTEjmLkJcUkl0TEgVZU08WkvDN0ReUUnAN0TNNETHNkNPVUqeQEa/OEQ2XEs6W0tXU0mTQ0abQkXINUO0O0RMVkroLUJRVUo0XUtkUEnZMUOaQkZrTUnMNEM3XEvTM0OhQEbdMEJsTkicQUZ7SUhOVkp6SkdOVUofYkzfL0KUREdfUUkcY0zUM0NQVUkUZE3GNkQnntLyAAAACXBIWXMAAC4jAAAuIwF4pT92AAAA+klEQVRIx+3WWVeCUBDAcRZrAJESMJekxT1Ny61FK3PJ3Mrv/218yAdD7sxFDw91/L//zj0HLjMIwqG/nS7OFKU/TvuX4YdQG366GX76s5ElbGQ5WX4aq4ArNcdrU0XYyoryWbsBXhV47GnI08JRlQM/AaOFTlrjnYWhS+IM04JqU7jExvBF2DPEwoDAxxhOEvgew5DC8QmKEzhuolgM8OQpiuMBPm30PXeoG/aC4BGFL5G7bVBYemZik/6eoyz7Ju8xSR555pCU98R3fBMwfrtNzy+453bdbSc1PxtD+3Ws8+1vV5V7V2uqfeyw6+TXa0UxW/PD/8I/aQWdeB/2B21/SgAAAABJRU5ErkJggg==\",\n ke: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAABnlBMVEUAAAHst7cAAAC6AADtu7t/sn9/f38AZgC7AAD///8xAADUX1+8AgJMAAABAABrAADcenrhmprJNDTdgIADAwTILi6bAACZAAABAQLPTEzQTU2+CgoGWwYCAgMAYACgpqASAAA5AAD019cDYAOyAAARAABgAAC9BwfqsbEYAAAXAACTk5NnAACSkpLqsrJ1dXVOTk8VFRa4LS2goKC4KysMYAAnAAEMAAHUXl6jAACsKSnKNzerNymjDQC6AQDrs7PrtLTJNjb12Nj01taGhobBGBg6AADBFxc7AADHLS1fAACcnJyaAACfn59AQEFmfmaYAABhAABCakJofmhGbEYQXBCcpJxpAAAAZAAAZQAlXyWZoZm9CQmJlokiXiJDQ0RlAABUVFW9CAhPT1DV1dXPz8/Ozs6srKzp6enX19fT09Pq6uro6OiTmpMSXBJ+U1PPS0utra3W1taGk4bUXV1+aFOVnJXn5+d/UlImUQAgVAAgAAFvAAAdVgBvKQCwBgAnUQAdAAGwAAC+CwtxAACBaFSvAADQTk6vBwBxKAA8HpDFAAAACXBIWXMAAC4jAAAuIwF4pT92AAABpUlEQVRIx+2UVVcDMRCFkyywd4uWIoWixaHFihR3d3d3d3eHf00KD1hTmvLA4Rzuw8xkz/3ObLKZJeRfv6yQkC9Pot2naz95jT4SrdusH9cZLRLwhDblSAXFxQWOPKO1S8DGucUcQq7uDYbrE0JyVuaNMkeWrVlJYZGpovKmqJBkaNlyB751QG5RQmkJTsnqgsjl41xZtkMFD5RGQtmwZQlMRBNoKQ/wpdQXyJ0VeYiXQHoAdkp3edKLPAQCTSpABKWbvLSIPEI4LRwIpjQY6EyXhVtZMpCSmpoCNLMwSTiQ6XgMCuJBxwIlYX8Wx2NoKA9JzF8SjmcBCvyqzX5QAli9JKxjLBF1mtaARPayA/nO5pqXzo2e7bnJoz3/6LTDWBcwnZk5CiRLf+d3Nyxc+obBwu92JKURvBwQwq6mio+k3eVUiWZ1+22el4Xz7C3Q/l3562uX762JPER1rvEd9QlVlFbhXB0bFpgE8FD/uppfxv+eprJ8tW9kUAru7uDh7NFguDjmRU+vDBwTm+BIl6WlR46cEBsj0znK5fIb2D39w38GfgZjEV/+h7zoCQAAAABJRU5ErkJggg==\",\n et: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAAB11BMVEX/xiEfdrLMs0ICbMRGkwvyPxoBbMXvIRgpjAgAa8YJbsADbMQNcL4edbMFbcPiuzQzfqU+gZ5RiJFQh5LYuDoXc7cYdLZkj4XJs0TjvDMVcrlylHyNnWuaomI7gKC9r0vpvi80faUZdLaQn2khd7C1rFAid7B3lXlDg5ubomJ5lngte6mpp1m7rk2Rn2g8gZ+UoGbnvTHOtUG4rU/XuDvuIRn7xSPpQSD9xSMaY7PtQB2eOlOVPVqtNUfnIx2oN0whYa7qIhw/gp1UXIqKnG1hTH/zwigdgz9vkn5hWYEpeqs+jiFFVpQKb7/NtEJDVpZlTHwwXaMpiwkliRkTcrkjhyYliRiepF8OdocSdZcfgzgGbcInea3twC1AkByAmHQCbbxhjYgPd4IUd5Ajd7AleK4QcLwddrMDbbrTtj1Yio0yfaWyqlNGhJk1fqSvqlUOcL0mea1Eg5pukn9Nh5TZuDqsqVbBsEk2fqNTiJGipV3PtUB0lHuMnWtBgpzduje/r0sMb7+0q1EkeK/LtEIufKhijoeXoWW3rFCJnG7RtT8EbMSTn2fDsEhai4wUc7l2lXmOnWrFsUZZi435xCXEsUflvTIbdbTbuTjQtj+Hm258l3Yse6qphPCcAAAACXBIWXMAAC4jAAAuIwF4pT92AAABeElEQVRIx+3SZVPDMBgH8K6DlmeuMHS+wTZgG8Pd3d3d3d3d3fmwpLxeuRTecEf/d0me3vV3uScJEfSLEDzm8T/ETY31dT/DbX0jANDTUvwdDvCbrn4kwclMreUBbCH8RiMVzSLnFQJQIm0VwSWdgzATuwvXl0oA+xiYQrngXrRr1DHcRsZBfAyqVRysRsz0apfKlfJzl4ipdfi4m7LYDhWK+1en78qosAnGhSX4OApWD8i7WMPbI0mSO275JJTh42EAmdlqevmA54SwvQQtQCU+HkJdUjdP72jxeTYo5isJG3eALDpOGfHgllzEbK7MoeMLw99ZJZkIt4A33nF2srUeHG41C/PwcTNzO4LtI89paMiiAJUQgY+LghGeX9PtR0uX9VOolhg4vJJIBPQLMnCB2DGK6gJOjzsE2tUILaFhbAB1Ctt/gf6SVsq0DdNfc35yIEsI2n/ScxAbQCM1I5FmCxumczNrKmqrC7OzaJo7xgmPefyH8Sc/Y2zOavYt4wAAAABJRU5ErkJggg==\",\n za: \"data:image/png;base64,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\",\n is: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAtCAMAAADFqPh+AAAAElBMVEXXKCj//v4AOJf///9/m8u+zOR3mSGYAAAACXBIWXMAAC4jAAAuIwF4pT92AAAASUlEQVRIx+3TywoAIAhE0THt/385JGphgYS7mLO/Gx9okanAiVpLgDFjxv/EFvUdd0tATytOQS5mnAM9Kk27tOfShfGfGTNm7AY23hKB7BpgoAAAAABJRU5ErkJggg==\",\n};\n","// A single trigger (current language) that opens a centered modal listing\n// every configured language as a flag + name grid, modeled on the\n// language-picker pattern used by large multi-language government sites\n// (e.g. dubaipolice.gov.ae): globe-icon trigger -> dimmed/blurred backdrop\n// -> centered white card -> \"Select your Language\" header with a close\n// button -> a grid of selectable language options, the active one marked\n// with a green checkmark. Selecting an option closes the modal immediately.\nimport { FLAG_IMAGES } from \"./flag-svgs\";\n\nconst STYLE_ID = \"dabalang-switcher-styles\";\n\nconst LANGUAGE_LABELS: Record<string, string> = {\n en: \"English\",\n es: \"Española\",\n fr: \"Français\",\n de: \"Deutschland\",\n pt: \"Português\",\n it: \"Italiano\",\n ja: \"日本語\",\n ko: \"한국어\",\n zh: \"中文\",\n ar: \"عربي\",\n hi: \"हिन्दी\",\n ru: \"Русский\",\n nl: \"Nederlands\",\n tr: \"Türkçe\",\n};\n\n// Representative country per language, as a lowercase ISO 3166-1 alpha-2\n// code — same spirit as the reference picker (one flag badge per language,\n// not a literal locale->country standard). Falls back to the dabalang logo\n// when a code has no entry. Codes are looked up against FLAG_IMAGES (see\n// `renderIcon`), a set of real flag images embedded directly in the\n// bundle, so this list stays real flag *images* rather than emoji glyphs —\n// matching the reference component's own image-based flags — with no\n// external network request needed to show one.\nconst FLAG_COUNTRY: Record<string, string> = {\n en: \"us\",\n es: \"es\",\n fr: \"fr\",\n de: \"de\",\n pt: \"pt\",\n it: \"it\",\n ja: \"jp\",\n ko: \"kr\",\n zh: \"cn\",\n ar: \"ae\",\n hi: \"in\",\n ru: \"ru\",\n nl: \"nl\",\n tr: \"tr\",\n};\n\nexport function labelForLanguage(code: string): string {\n return LANGUAGE_LABELS[code] ?? code.toUpperCase();\n}\n\nfunction flagForLanguage(code: string): string {\n return FLAG_COUNTRY[code] ?? \"\";\n}\n\n// The dabalang brand mark — a simple \"D\" monogram, used wherever the UI\n// needs a generic/app icon rather than a specific language's flag (the\n// trigger pill, the modal header, and the \"Original\" entry when the\n// page's source language isn't a language we have a flag for). Sized via\n// the containing element's font-size (1em), same as the emoji it replaces.\nconst DABALANG_LOGO_SVG =\n '<svg viewBox=\"0 0 32 32\" width=\"1em\" height=\"1em\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" style=\"display:block\">' +\n '<rect width=\"32\" height=\"32\" rx=\"9\" fill=\"#0c8c5e\"/>' +\n '<text x=\"16\" y=\"22\" text-anchor=\"middle\" font-family=\"-apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif\" font-size=\"17\" font-weight=\"700\" fill=\"#ffffff\">D</text>' +\n \"</svg>\";\n\n/** Sets an icon span's content to either a real flag image (a lowercase\n * ISO country code resolved against the embedded FLAG_IMAGES map) or the\n * dabalang logo — never both, so no stale image lingers behind the SVG on\n * the next render. Falls back to the logo when no country code is set, or\n * when a code has no embedded image, so an unmapped language code never\n * renders a broken image. */\nfunction renderIcon(el: HTMLElement, entry: { flag: string; isLogo?: boolean }): void {\n el.innerHTML = \"\";\n const src = !entry.isLogo && entry.flag ? FLAG_IMAGES[entry.flag] : undefined;\n if (!src) {\n el.innerHTML = DABALANG_LOGO_SVG;\n return;\n }\n const img = document.createElement(\"img\");\n img.className = \"dabalang-lang-flag-img\";\n img.src = src;\n img.alt = \"\";\n el.appendChild(img);\n}\n\n// Decorative \"browse the rest of the world\" list shown below the project's\n// real, working target languages. These are NOT wired to translation — the\n// project only ever supports its configured target_languages — so each one\n// renders disabled with a \"Soon\" badge rather than a working click handler.\n// Purely visual, matching large government/enterprise language pickers that\n// show a short \"top languages\" row plus a long \"all languages\" grid.\nconst ALL_WORLD_LANGUAGES: { code: string; label: string; flag: string }[] = [\n { code: \"zh-hant\", label: \"繁體中文\", flag: \"tw\" },\n { code: \"vi\", label: \"Tiếng Việt\", flag: \"vn\" },\n { code: \"th\", label: \"ไทย\", flag: \"th\" },\n { code: \"id\", label: \"Bahasa Indonesia\", flag: \"id\" },\n { code: \"ms\", label: \"Bahasa Melayu\", flag: \"my\" },\n { code: \"tl\", label: \"Filipino\", flag: \"ph\" },\n { code: \"pl\", label: \"Polski\", flag: \"pl\" },\n { code: \"uk\", label: \"Українська\", flag: \"ua\" },\n { code: \"cs\", label: \"Čeština\", flag: \"cz\" },\n { code: \"sv\", label: \"Svenska\", flag: \"se\" },\n { code: \"no\", label: \"Norsk\", flag: \"no\" },\n { code: \"da\", label: \"Dansk\", flag: \"dk\" },\n { code: \"fi\", label: \"Suomi\", flag: \"fi\" },\n { code: \"el\", label: \"Ελληνικά\", flag: \"gr\" },\n { code: \"he\", label: \"עברית\", flag: \"il\" },\n { code: \"hu\", label: \"Magyar\", flag: \"hu\" },\n { code: \"ro\", label: \"Română\", flag: \"ro\" },\n { code: \"bg\", label: \"Български\", flag: \"bg\" },\n { code: \"hr\", label: \"Hrvatski\", flag: \"hr\" },\n { code: \"sr\", label: \"Српски\", flag: \"rs\" },\n { code: \"sk\", label: \"Slovenčina\", flag: \"sk\" },\n { code: \"sl\", label: \"Slovenščina\", flag: \"si\" },\n { code: \"lt\", label: \"Lietuvių\", flag: \"lt\" },\n { code: \"lv\", label: \"Latviešu\", flag: \"lv\" },\n { code: \"et\", label: \"Eesti\", flag: \"ee\" },\n { code: \"fa\", label: \"فارسی\", flag: \"ir\" },\n { code: \"ur\", label: \"اردو\", flag: \"pk\" },\n { code: \"bn\", label: \"বাংলা\", flag: \"bd\" },\n { code: \"pa\", label: \"ਪੰਜਾਬੀ\", flag: \"in\" },\n { code: \"ta\", label: \"தமிழ்\", flag: \"in\" },\n { code: \"te\", label: \"తెలుగు\", flag: \"in\" },\n { code: \"mr\", label: \"मराठी\", flag: \"in\" },\n { code: \"gu\", label: \"ગુજરાતી\", flag: \"in\" },\n { code: \"sw\", label: \"Kiswahili\", flag: \"ke\" },\n { code: \"am\", label: \"አማርኛ\", flag: \"et\" },\n { code: \"zu\", label: \"isiZulu\", flag: \"za\" },\n { code: \"af\", label: \"Afrikaans\", flag: \"za\" },\n { code: \"is\", label: \"Íslenska\", flag: \"is\" },\n];\n\nfunction injectStyles(): void {\n if (document.getElementById(STYLE_ID)) return;\n const style = document.createElement(\"style\");\n style.id = STYLE_ID;\n style.textContent = `\n.dabalang-trigger {\n appearance: none;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n border: 1px solid rgba(0, 0, 0, 0.12);\n background: #ffffff;\n color: rgba(0, 0, 0, 0.75);\n border-radius: 999px;\n padding: 6px 12px;\n cursor: pointer;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n font-size: 13px;\n line-height: 1.4;\n transition: background 120ms ease, border-color 120ms ease;\n}\n.dabalang-trigger:hover {\n background: rgba(0, 0, 0, 0.04);\n}\n.dabalang-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.3);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n z-index: 2147483000;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n animation: dabalang-backdrop-in 220ms ease-out;\n perspective: 1400px;\n}\n.dabalang-modal {\n background: #ffffff;\n border-radius: 24px;\n width: calc(100% - 64px);\n max-width: 924px;\n max-height: 80vh;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n box-shadow: 0 0 16px rgba(0, 0, 0, 0.2);\n transform-origin: bottom center;\n animation: dabalang-modal-in 560ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n.dabalang-backdrop[data-closing=\"true\"] {\n animation: dabalang-backdrop-out 240ms ease-in forwards;\n}\n.dabalang-backdrop[data-closing=\"true\"] .dabalang-modal {\n animation: dabalang-modal-out 240ms cubic-bezier(0.4, 0, 1, 1) forwards;\n}\n@keyframes dabalang-backdrop-in {\n from { opacity: 0; }\n}\n@keyframes dabalang-backdrop-out {\n to { opacity: 0; }\n}\n/* Hinges from the bottom edge: the bottom stays close to the viewer while\n the top recedes into the distance (rotateX around a bottom-anchored\n transform-origin), so the card visually reads as \"bigger at the bottom,\n smaller at the top\" as it swings up into place — like a trapdoor. */\n@keyframes dabalang-modal-in {\n from { opacity: 0; transform: translateY(min(24vh, 180px)) rotateX(-60deg) scale(0.94); }\n 55% { transform: translateY(0) rotateX(8deg) scale(1.01); }\n 100% { transform: translateY(0) rotateX(0deg) scale(1); }\n}\n@keyframes dabalang-modal-out {\n to { opacity: 0; transform: translateY(min(16vh, 130px)) rotateX(-40deg) scale(0.96); }\n}\n.dabalang-modal-header {\n position: relative;\n padding: 46px 32px 30px 48px;\n background: rgba(255, 255, 255, 0.95);\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n border-radius: 24px 24px 0 0;\n flex-shrink: 0;\n box-sizing: border-box;\n}\n.dabalang-modal-title {\n display: flex;\n align-items: center;\n font-size: 30px;\n font-weight: 700;\n line-height: 34px;\n color: #363637;\n}\n.dabalang-modal-title-globe {\n font-size: 38px;\n line-height: 1;\n margin-right: 6px;\n}\n.dabalang-modal-close {\n appearance: none;\n border: none;\n background: #f4f4f4;\n color: #121212;\n font-size: 20px;\n line-height: 1;\n cursor: pointer;\n width: 44px;\n height: 44px;\n position: absolute;\n top: 32px;\n right: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 12px;\n transition: background 150ms ease-in, color 150ms ease-in;\n}\n.dabalang-modal-close:hover {\n background: #ebebeb;\n color: #000000;\n}\n.dabalang-modal-body {\n padding: 0 32px 48px 48px;\n overflow-y: auto;\n box-sizing: border-box;\n}\n.dabalang-modal-body::-webkit-scrollbar {\n width: 8px;\n}\n.dabalang-modal-body::-webkit-scrollbar-track {\n background: #f0f0f0;\n border-radius: 4px;\n}\n.dabalang-modal-body::-webkit-scrollbar-thumb {\n background: #c2c2c2;\n border-radius: 4px;\n}\n.dabalang-modal-body::-webkit-scrollbar-thumb:hover {\n background: #a0a0a0;\n}\n.dabalang-modal-section {\n margin-bottom: 32px;\n}\n.dabalang-modal-section:last-child {\n margin-bottom: 0;\n}\n.dabalang-modal-section-label {\n font-size: 18px;\n font-weight: 700;\n line-height: 27px;\n color: #121212;\n margin: 0 0 4px;\n}\n.dabalang-modal-section-info {\n font-size: 16px;\n line-height: 24px;\n color: #4b4c4d;\n margin: 0 0 16px;\n}\n.dabalang-modal-grid {\n display: flex;\n flex-wrap: wrap;\n column-gap: 24px;\n margin: 0;\n}\n.dabalang-lang-option {\n appearance: none;\n position: relative;\n display: flex;\n align-items: center;\n width: calc(25% - 24px);\n box-sizing: border-box;\n border: none;\n background: transparent;\n border-radius: 12px;\n padding: 8px;\n margin: 0 0 8px 0;\n cursor: pointer;\n text-align: left;\n color: #363637;\n font-size: 14px;\n transition: background 300ms ease-in;\n}\n.dabalang-lang-option:hover {\n background: #f0f4f3;\n}\n.dabalang-lang-option[data-active=\"true\"] {\n background: #e8eeeb;\n}\n.dabalang-lang-flag {\n flex-shrink: 0;\n width: 30px;\n height: 30px;\n margin-right: 8px;\n border-radius: 999px;\n background: #f4f4f4;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 30px;\n overflow: hidden;\n}\n.dabalang-lang-flag-img {\n width: 100%;\n height: 100%;\n object-fit: contain;\n display: block;\n}\n.dabalang-lang-name {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.dabalang-lang-check {\n position: absolute;\n top: 12px;\n right: 10px;\n flex-shrink: 0;\n width: 16px;\n height: 16px;\n border-radius: 999px;\n background: #008755;\n color: #ffffff;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 10px;\n line-height: 1;\n}\n.dabalang-lang-option[disabled] {\n cursor: not-allowed;\n opacity: 0.45;\n}\n.dabalang-lang-option[disabled]:hover {\n background: transparent;\n}\n.dabalang-lang-soon {\n flex-shrink: 0;\n margin-left: auto;\n font-size: 10px;\n font-weight: 700;\n letter-spacing: 0.02em;\n color: #8a8a8a;\n background: #f4f4f4;\n border-radius: 999px;\n padding: 2px 7px;\n}\n.dabalang-switcher-root {\n position: relative;\n display: inline-block;\n}\n.dabalang-trigger-flag {\n flex-shrink: 0;\n width: 16px;\n height: 16px;\n border-radius: 999px;\n overflow: hidden;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n.dabalang-trigger-caret {\n flex-shrink: 0;\n font-size: 9px;\n line-height: 1;\n color: rgba(0, 0, 0, 0.45);\n transition: transform 150ms ease;\n}\n.dabalang-trigger[aria-expanded=\"true\"] .dabalang-trigger-caret {\n transform: rotate(180deg);\n}\n.dabalang-dropdown {\n position: absolute;\n top: calc(100% + 6px);\n left: 0;\n min-width: 200px;\n max-height: 320px;\n overflow-y: auto;\n background: #ffffff;\n border: 1px solid rgba(0, 0, 0, 0.1);\n border-radius: 14px;\n box-shadow: 0 12px 32px rgba(0, 0, 0, 0.14);\n padding: 6px;\n box-sizing: border-box;\n z-index: 2147483000;\n animation: dabalang-dropdown-in 160ms ease-out;\n}\n.dabalang-dropdown[data-align=\"right\"] {\n left: auto;\n right: 0;\n}\n@keyframes dabalang-dropdown-in {\n from { opacity: 0; transform: translateY(-4px); }\n}\n.dabalang-dropdown .dabalang-lang-option {\n width: 100%;\n margin-bottom: 2px;\n}\n.dabalang-dropdown .dabalang-lang-option:last-child {\n margin-bottom: 0;\n}\n.dabalang-dropdown .dabalang-lang-flag {\n width: 22px;\n height: 22px;\n font-size: 22px;\n}\n.dabalang-dropdown .dabalang-lang-check {\n position: static;\n margin-left: auto;\n}\n@media (max-width: 767px) {\n .dabalang-modal-header {\n padding: 32px 24px 20px 24px;\n }\n .dabalang-modal-title {\n font-size: 22px;\n line-height: 26px;\n }\n .dabalang-modal-title-globe {\n font-size: 26px;\n }\n .dabalang-modal-close {\n top: 20px;\n right: 20px;\n width: 36px;\n height: 36px;\n }\n .dabalang-modal-body {\n padding: 0 20px 24px 20px;\n }\n .dabalang-lang-option {\n width: 100%;\n }\n}\n@media (min-width: 768px) and (max-width: 900px) {\n .dabalang-lang-option {\n width: calc(50% - 24px);\n }\n}\n`;\n document.head.appendChild(style);\n}\n\nexport interface LanguageSwitcherHandle {\n root: HTMLElement;\n setActive: (langCode: string | null) => void;\n destroy: () => void;\n}\n\ninterface LangEntry {\n code: string | \"original\";\n label: string;\n flag: string;\n isLogo?: boolean;\n}\n\n/** Renders a single trigger button inside `container`; clicking it opens a\n * modal (appended to `document.body` so it centers on the viewport\n * regardless of where the trigger sits in the host page) listing the\n * page's detected source language (`sourceLang`, e.g. \"en\" -> \"English\")\n * plus every configured target language. `onSelect(null)` means the\n * source/original language was chosen. */\nexport function renderLanguageSwitcher(\n container: HTMLElement,\n targetLanguages: string[],\n sourceLang: string | undefined,\n onSelect: (langCode: string | null) => void,\n view: \"modal\" | \"dropdown\" = \"modal\",\n): LanguageSwitcherHandle {\n injectStyles();\n\n // The \"original\" entry always reflects the page's real detected source\n // language rather than a generic placeholder — a known flag when we have\n // one, the dabalang logo otherwise (still restores the original DOM text\n // either way; only the icon/label shown differs).\n const originalEntry: LangEntry = sourceLang\n ? { code: \"original\", label: labelForLanguage(sourceLang), flag: flagForLanguage(sourceLang), isLogo: !FLAG_COUNTRY[sourceLang] }\n : { code: \"original\", label: \"Original\", flag: \"\", isLogo: true };\n\n const entries: LangEntry[] = [\n originalEntry,\n ...targetLanguages.map((code) => ({ code, label: labelForLanguage(code), flag: flagForLanguage(code) })),\n ];\n\n const CLOSE_ANIMATION_MS = 240;\n\n let activeCode: string | \"original\" = \"original\";\n let backdrop: HTMLDivElement | null = null;\n let optionButtons: HTMLButtonElement[] = [];\n let closing = false;\n\n const root = document.createElement(\"div\");\n root.className = \"dabalang-switcher-root\";\n\n const trigger = document.createElement(\"button\");\n trigger.type = \"button\";\n trigger.className = \"dabalang-trigger\";\n root.appendChild(trigger);\n\n function renderTrigger(): void {\n const active = entries.find((e) => e.code === activeCode) ?? entries[0];\n if (view === \"dropdown\") {\n trigger.innerHTML = \"\";\n const flag = document.createElement(\"span\");\n flag.className = \"dabalang-trigger-flag\";\n renderIcon(flag, active);\n const label = document.createElement(\"span\");\n label.textContent = active.label;\n const caret = document.createElement(\"span\");\n caret.className = \"dabalang-trigger-caret\";\n caret.textContent = \"▼\";\n caret.setAttribute(\"aria-hidden\", \"true\");\n trigger.append(flag, label, caret);\n } else {\n trigger.textContent = active.label;\n }\n }\n\n function closeModal(): void {\n if (!backdrop || closing) return;\n closing = true;\n const overlay = backdrop;\n overlay.dataset.closing = \"true\";\n document.removeEventListener(\"keydown\", onKeydown);\n // Play the exit animation (CSS, driven by [data-closing=\"true\"]) before\n // actually removing the node — an instant removal would skip it.\n window.setTimeout(() => {\n overlay.remove();\n closing = false;\n }, CLOSE_ANIMATION_MS);\n backdrop = null;\n optionButtons = [];\n }\n\n function onKeydown(event: KeyboardEvent): void {\n if (event.key === \"Escape\") closeModal();\n }\n\n function updateOptionStates(): void {\n for (const btn of optionButtons) {\n const isActive = btn.dataset.lang === activeCode;\n btn.dataset.active = String(isActive);\n const check = btn.querySelector(\".dabalang-lang-check\");\n if (isActive && !check) {\n const c = document.createElement(\"span\");\n c.className = \"dabalang-lang-check\";\n c.textContent = \"✓\";\n btn.appendChild(c);\n } else if (!isActive && check) {\n check.remove();\n }\n }\n }\n\n function openModal(): void {\n if (backdrop) return;\n\n const overlay = document.createElement(\"div\");\n overlay.className = \"dabalang-backdrop\";\n overlay.addEventListener(\"mousedown\", (e) => {\n if (e.target === overlay) closeModal();\n });\n\n const modal = document.createElement(\"div\");\n modal.className = \"dabalang-modal\";\n modal.setAttribute(\"role\", \"dialog\");\n modal.setAttribute(\"aria-modal\", \"true\");\n modal.setAttribute(\"aria-label\", \"Select your language\");\n\n const header = document.createElement(\"div\");\n header.className = \"dabalang-modal-header\";\n const title = document.createElement(\"div\");\n title.className = \"dabalang-modal-title\";\n const titleGlobe = document.createElement(\"span\");\n titleGlobe.className = \"dabalang-modal-title-globe\";\n titleGlobe.innerHTML = DABALANG_LOGO_SVG;\n const titleText = document.createElement(\"span\");\n titleText.textContent = \"Select your Language\";\n title.append(titleGlobe, titleText);\n const closeBtn = document.createElement(\"button\");\n closeBtn.type = \"button\";\n closeBtn.className = \"dabalang-modal-close\";\n closeBtn.setAttribute(\"aria-label\", \"Close\");\n closeBtn.textContent = \"✕\";\n closeBtn.addEventListener(\"click\", closeModal);\n header.append(title, closeBtn);\n\n const body = document.createElement(\"div\");\n body.className = \"dabalang-modal-body\";\n\n const suggestedSection = document.createElement(\"div\");\n suggestedSection.className = \"dabalang-modal-section\";\n const sectionLabel = document.createElement(\"p\");\n sectionLabel.className = \"dabalang-modal-section-label\";\n sectionLabel.textContent = `Suggested Languages (${entries.length})`;\n const grid = document.createElement(\"div\");\n grid.className = \"dabalang-modal-grid\";\n\n optionButtons = entries.map((entry) => {\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.className = \"dabalang-lang-option\";\n btn.dataset.lang = entry.code;\n\n const flag = document.createElement(\"span\");\n flag.className = \"dabalang-lang-flag\";\n renderIcon(flag, entry);\n const name = document.createElement(\"span\");\n name.className = \"dabalang-lang-name\";\n name.textContent = entry.label;\n btn.append(flag, name);\n\n btn.addEventListener(\"click\", () => {\n closeModal();\n onSelect(entry.code === \"original\" ? null : entry.code);\n });\n grid.appendChild(btn);\n return btn;\n });\n updateOptionStates();\n\n suggestedSection.append(sectionLabel, grid);\n body.append(suggestedSection);\n\n // Decorative \"rest of the world\" section — not wired to real\n // translation, so every option here is disabled with a \"Soon\" badge\n // rather than a working click handler (see ALL_WORLD_LANGUAGES).\n const configuredCodes = new Set(entries.map((e) => e.code));\n const extraLanguages = ALL_WORLD_LANGUAGES.filter((l) => !configuredCodes.has(l.code));\n if (extraLanguages.length > 0) {\n const otherSection = document.createElement(\"div\");\n otherSection.className = \"dabalang-modal-section\";\n\n const allSectionLabel = document.createElement(\"p\");\n allSectionLabel.className = \"dabalang-modal-section-label\";\n allSectionLabel.textContent = `Other Languages (${extraLanguages.length})`;\n\n const allSectionInfo = document.createElement(\"p\");\n allSectionInfo.className = \"dabalang-modal-section-info\";\n allSectionInfo.textContent = \"These aren't set up for this site yet — check back soon.\";\n\n const allGrid = document.createElement(\"div\");\n allGrid.className = \"dabalang-modal-grid\";\n\n for (const entry of extraLanguages) {\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.className = \"dabalang-lang-option\";\n btn.disabled = true;\n btn.setAttribute(\"aria-disabled\", \"true\");\n\n const flag = document.createElement(\"span\");\n flag.className = \"dabalang-lang-flag\";\n renderIcon(flag, entry);\n const name = document.createElement(\"span\");\n name.className = \"dabalang-lang-name\";\n name.textContent = entry.label;\n const soon = document.createElement(\"span\");\n soon.className = \"dabalang-lang-soon\";\n soon.textContent = \"Soon\";\n btn.append(flag, name, soon);\n allGrid.appendChild(btn);\n }\n\n otherSection.append(allSectionLabel, allSectionInfo, allGrid);\n body.append(otherSection);\n }\n\n modal.append(header, body);\n overlay.appendChild(modal);\n document.body.appendChild(overlay);\n backdrop = overlay;\n document.addEventListener(\"keydown\", onKeydown);\n }\n\n // --- dropdown view: the configured languages listed directly in an\n // anchored panel — one click, no overlay. Same entries, same onSelect.\n let dropdown: HTMLDivElement | null = null;\n\n function closeDropdown(): void {\n if (!dropdown) return;\n dropdown.remove();\n dropdown = null;\n trigger.setAttribute(\"aria-expanded\", \"false\");\n document.removeEventListener(\"mousedown\", onOutsideMousedown);\n document.removeEventListener(\"keydown\", onDropdownKeydown);\n optionButtons = [];\n }\n\n function onOutsideMousedown(event: MouseEvent): void {\n if (event.target instanceof Node && !root.contains(event.target)) closeDropdown();\n }\n\n function onDropdownKeydown(event: KeyboardEvent): void {\n if (event.key === \"Escape\") closeDropdown();\n }\n\n function openDropdown(): void {\n if (dropdown) return;\n\n const panel = document.createElement(\"div\");\n panel.className = \"dabalang-dropdown\";\n panel.setAttribute(\"role\", \"listbox\");\n panel.setAttribute(\"aria-label\", \"Select your language\");\n\n optionButtons = entries.map((entry) => {\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.className = \"dabalang-lang-option\";\n btn.dataset.lang = entry.code;\n btn.setAttribute(\"role\", \"option\");\n\n const flag = document.createElement(\"span\");\n flag.className = \"dabalang-lang-flag\";\n renderIcon(flag, entry);\n const name = document.createElement(\"span\");\n name.className = \"dabalang-lang-name\";\n name.textContent = entry.label;\n btn.append(flag, name);\n\n btn.addEventListener(\"click\", () => {\n closeDropdown();\n onSelect(entry.code === \"original\" ? null : entry.code);\n });\n panel.appendChild(btn);\n return btn;\n });\n updateOptionStates();\n\n root.appendChild(panel);\n // Keep the panel on-screen when the trigger sits near the right edge.\n const rect = panel.getBoundingClientRect();\n if (rect.right > window.innerWidth - 8) panel.dataset.align = \"right\";\n\n dropdown = panel;\n trigger.setAttribute(\"aria-expanded\", \"true\");\n document.addEventListener(\"mousedown\", onOutsideMousedown);\n document.addEventListener(\"keydown\", onDropdownKeydown);\n }\n\n if (view === \"dropdown\") {\n trigger.setAttribute(\"aria-haspopup\", \"listbox\");\n trigger.setAttribute(\"aria-expanded\", \"false\");\n trigger.addEventListener(\"click\", () => {\n if (dropdown) {\n closeDropdown();\n } else {\n openDropdown();\n }\n });\n } else {\n trigger.addEventListener(\"click\", () => {\n if (backdrop) {\n closeModal();\n } else {\n openModal();\n }\n });\n }\n\n renderTrigger();\n container.appendChild(root);\n\n function setActive(langCode: string | null): void {\n activeCode = langCode ?? \"original\";\n renderTrigger();\n updateOptionStates();\n }\n\n return {\n root,\n setActive,\n destroy: () => {\n closeModal();\n closeDropdown();\n root.remove();\n },\n };\n}\n","import { resolveGatewayUrl } from \"./environment\";\nimport { DabaLangFetchError, fetchProjectMetadata } from \"./api/translate-api\";\nimport { TranslationApplier } from \"./dom/apply\";\nimport { DocumentLangController } from \"./dom/document-lang\";\nimport { InlineEditor } from \"./edit/inline-editor\";\nimport { PathRouter } from \"./path-routing\";\nimport { renderLanguageSwitcher, type LanguageSwitcherHandle } from \"./ui/language-switcher\";\nimport type { DabaLangError, DabaLangOptions, ProjectMetadata } from \"./types\";\n\n\n/** The main class — composes: fetch project config -> crawl the page ->\n * render the language-switcher pills -> on selection, batch-translate and\n * swap text in place -> (dev only) wire up the double-click corrector. */\nexport class DabaLang {\n private readonly container: HTMLElement;\n private readonly gatewayUrl: string;\n private applier: TranslationApplier | null = null;\n private readonly docLang = new DocumentLangController();\n private editor: InlineEditor | null = null;\n private switcher: LanguageSwitcherHandle | null = null;\n private metadata: ProjectMetadata | null = null;\n private pathRouter: PathRouter | null = null;\n /** Currently active language (null = original). Tracked here rather\n * than via the applier because a site-translated page (see\n * isSiteTranslated) never runs the applier at all. */\n private activeLang: string | null = null;\n private readonly ready: Promise<void>;\n\n constructor(private readonly options: DabaLangOptions) {\n const resolved =\n typeof options.container === \"string\"\n ? document.querySelector<HTMLElement>(options.container)\n : options.container;\n if (!resolved) {\n throw new Error(`dabalang: container \"${String(options.container)}\" not found`);\n }\n this.container = resolved;\n this.gatewayUrl = resolveGatewayUrl(options.gatewayUrl, options.env);\n this.ready = this.init();\n }\n\n private async init(): Promise<void> {\n try {\n this.metadata = await fetchProjectMetadata(this.gatewayUrl, this.options.projectId, this.options.apiKey);\n } catch (err) {\n this.handleError(err);\n return;\n }\n\n this.applier = new TranslationApplier(document.body, this.gatewayUrl, this.options.projectId, this.options.apiKey);\n this.editor = new InlineEditor({\n gatewayUrl: this.gatewayUrl,\n projectId: this.options.projectId,\n apiKey: this.options.apiKey,\n applier: this.applier,\n });\n\n this.switcher = renderLanguageSwitcher(\n this.container,\n this.metadata.targetLanguages,\n this.metadata.sourceLang,\n (langCode) => {\n void this.selectLanguage(langCode);\n },\n this.options.view ?? \"modal\",\n );\n\n // Path routing: detect the language this URL is serving. Detection\n // only — the widget never redirects on load (the server owns\n // redirects); navigation happens only on switch.\n if (this.metadata.enablePathRouting && typeof window !== \"undefined\") {\n this.pathRouter = new PathRouter(this.metadata.languages);\n const detected = this.pathRouter.detect(window.location.pathname);\n const fromPrefix = this.pathRouter.detectFromPrefix(window.location.pathname);\n if (detected && detected !== this.metadata.sourceLang) {\n if (detected === fromPrefix && this.isSiteTranslated(detected)) {\n // \"developer\" language on its own path: the site itself\n // already serves this page translated (a CMS/localized build)\n // — the page IS the translation, so no translate pass at all.\n // Just reflect the language: document lang/dir + active pill.\n this.docLang.apply(detected);\n this.activeLang = detected;\n this.switcher.setActive(detected);\n this.options.onLanguageChange?.(detected);\n } else {\n await this.selectLanguage(detected, { navigate: false });\n }\n }\n }\n }\n\n /** True when the site serves this language's content itself (CMS,\n * localized build): a pre-translated (\"developer\") language. Combined\n * with a prefix match, the widget never machine-translates that page.\n * (A prefix-less developer language instead swaps its uploaded\n * catalogue in place.) */\n private isSiteTranslated(langCode: string): boolean {\n const config = this.metadata?.languages.find((l) => l.code === langCode);\n return config?.provider === \"developer\";\n }\n\n private async selectLanguage(\n langCode: string | null,\n { navigate = true }: { navigate?: boolean } = {},\n ): Promise<void> {\n if (!this.applier || !this.switcher) return;\n // With path routing on, switching to a language that lives under a\n // URL prefix means going to that URL — the destination page's widget\n // re-detects and (only if needed) translates. Prefix-less languages\n // (and unchanged URLs) fall through to in-place translation.\n if (navigate && this.pathRouter) {\n const url = this.pathRouter.urlFor(langCode, window.location);\n if (url !== null) {\n this.navigateTo(url);\n return;\n }\n }\n try {\n if (langCode === null) {\n this.applier.restoreOriginal();\n this.docLang.restore();\n this.editor?.detach();\n } else {\n await this.applier.applyLanguage(langCode);\n this.docLang.apply(langCode);\n this.editor?.attach();\n }\n this.activeLang = langCode;\n this.switcher.setActive(langCode);\n this.options.onLanguageChange?.(langCode ?? this.metadata?.sourceLang ?? \"\");\n } catch (err) {\n this.handleError(err);\n }\n }\n\n /** Overridable seam for tests — jsdom can't perform real navigation. */\n protected navigateTo(url: string): void {\n window.location.assign(url);\n }\n\n private handleError(err: unknown): void {\n const dabaError: DabaLangError =\n err instanceof DabaLangFetchError\n ? err.dabaError\n : { kind: \"network\", message: err instanceof Error ? err.message : \"Unknown error\" };\n if (this.options.onError) {\n this.options.onError(dabaError);\n } else {\n console.error(\"[dabalang]\", dabaError.kind, dabaError.message);\n }\n }\n\n /** Resolves once the initial metadata fetch + pill render has settled\n * (successfully or not) — mainly useful in tests. */\n whenReady(): Promise<void> {\n return this.ready;\n }\n\n currentLanguage(): string | null {\n return this.activeLang;\n }\n\n destroy(): void {\n this.editor?.detach();\n this.switcher?.destroy();\n this.docLang.restore();\n }\n}\n"]}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Which deployment tier this widget talks to.
3
+ *
4
+ * Production is the default in every direction: an embed that says
5
+ * nothing about its environment is a customer's live site, and the one
6
+ * outcome worth engineering against is a production page silently
7
+ * pointing at staging. So the mapping is deliberately asymmetric —
8
+ * "staging" must be asked for by name, and anything else resolves to
9
+ * production.
10
+ */
11
+ type DabaEnvironment = "production" | "staging";
12
+
13
+ interface DabaLangOptions {
14
+ /** CSS selector or element — where the language-switcher pills mount.
15
+ * The rest of the page is crawled/translated regardless of this. */
16
+ container: string | HTMLElement;
17
+ projectId: string;
18
+ apiKey: string;
19
+ /** Defaults to https://api.dabalabs.com. Overrides `env` when both are
20
+ * given — it is the only option that can name a host neither tier
21
+ * covers (self-hosted, a branch preview, a local gateway). */
22
+ gatewayUrl?: string;
23
+ /** Which Dabalabs tier to talk to. Omit for production; pass "staging"
24
+ * to point the widget at the staging gateway. */
25
+ env?: DabaEnvironment;
26
+ /** How the switcher presents the configured languages:
27
+ * - "modal" (default): a trigger button that opens the centered
28
+ * flag-grid modal.
29
+ * - "dropdown": a compact select-style control that lists the
30
+ * project's languages directly, anchored to the trigger — for sites
31
+ * that want the languages visible in one click, no overlay. */
32
+ view?: "modal" | "dropdown";
33
+ onError?: (error: DabaLangError) => void;
34
+ onLanguageChange?: (langCode: string) => void;
35
+ }
36
+ interface DabaLangError {
37
+ kind: "invalid_key" | "origin_not_allowed" | "not_found" | "network" | "bad_request";
38
+ message: string;
39
+ }
40
+ /** Per-language configuration from the dashboard. Languages that only
41
+ * exist in the legacy target list have no entry here and behave as
42
+ * automatic with no path prefix. */
43
+ interface LanguageConfig {
44
+ code: string;
45
+ /** "auto" (the platform translates) or "developer" (pre-translated
46
+ * catalogue uploaded by the site's developer). Informational to the
47
+ * widget — both are served through the same batch endpoint. */
48
+ provider: string;
49
+ /** URL prefix ("/ar") this language lives under when the project has
50
+ * path routing enabled. */
51
+ pathPrefix: string | null;
52
+ /** Language applied on un-prefixed paths when path routing is on. */
53
+ isDefault: boolean;
54
+ }
55
+ interface ProjectMetadata {
56
+ projectId: string;
57
+ title: string;
58
+ sourceLang: string;
59
+ targetLanguages: string[];
60
+ /** When true, the widget detects the language from the URL path prefix
61
+ * on load and navigates between prefixes on switch (see PathRouter). */
62
+ enablePathRouting: boolean;
63
+ languages: LanguageConfig[];
64
+ }
65
+ type TranslationSource = "correction" | "cache" | "fresh";
66
+ interface TranslationResult {
67
+ sourceText: string;
68
+ translatedText: string;
69
+ source: TranslationSource;
70
+ }
71
+
72
+ /** The main class — composes: fetch project config -> crawl the page ->
73
+ * render the language-switcher pills -> on selection, batch-translate and
74
+ * swap text in place -> (dev only) wire up the double-click corrector. */
75
+ declare class DabaLang {
76
+ private readonly options;
77
+ private readonly container;
78
+ private readonly gatewayUrl;
79
+ private applier;
80
+ private readonly docLang;
81
+ private editor;
82
+ private switcher;
83
+ private metadata;
84
+ private pathRouter;
85
+ /** Currently active language (null = original). Tracked here rather
86
+ * than via the applier because a site-translated page (see
87
+ * isSiteTranslated) never runs the applier at all. */
88
+ private activeLang;
89
+ private readonly ready;
90
+ constructor(options: DabaLangOptions);
91
+ private init;
92
+ /** True when the site serves this language's content itself (CMS,
93
+ * localized build): a pre-translated ("developer") language. Combined
94
+ * with a prefix match, the widget never machine-translates that page.
95
+ * (A prefix-less developer language instead swaps its uploaded
96
+ * catalogue in place.) */
97
+ private isSiteTranslated;
98
+ private selectLanguage;
99
+ /** Overridable seam for tests — jsdom can't perform real navigation. */
100
+ protected navigateTo(url: string): void;
101
+ private handleError;
102
+ /** Resolves once the initial metadata fetch + pill render has settled
103
+ * (successfully or not) — mainly useful in tests. */
104
+ whenReady(): Promise<void>;
105
+ currentLanguage(): string | null;
106
+ destroy(): void;
107
+ }
108
+
109
+ /** Pure URL logic for path-prefix routing (`/ar/about` -> Arabic).
110
+ *
111
+ * The widget NEVER redirects on page load — the server owns redirects.
112
+ * On load it only *detects* the active language from the pathname and
113
+ * applies translations in place; navigation happens exclusively when the
114
+ * visitor picks a language from the switcher, and only to swap/strip a
115
+ * configured prefix. Languages without a prefix keep translating in
116
+ * place, exactly as when path routing is off. */
117
+ declare class PathRouter {
118
+ /** Longest prefix first so overlapping prefixes resolve to the most
119
+ * specific one (matching is segment-safe either way). */
120
+ private readonly prefixed;
121
+ private readonly defaultLang;
122
+ constructor(languages: LanguageConfig[]);
123
+ /** Language the current pathname is serving: the language whose prefix
124
+ * starts the path ("/ar", "/ar/about" — but never "/arbitrary"), else
125
+ * the configured default language for un-prefixed paths, else null. */
126
+ detect(pathname: string): string | null;
127
+ /** Like detect(), but only a real prefix match — no default-language
128
+ * fallback. Used to tell "this URL is the language's own path" (where
129
+ * a site-translated language needs no translate pass) apart from "the
130
+ * default language applies here". */
131
+ detectFromPrefix(pathname: string): string | null;
132
+ /** URL (path + search + hash) the switcher should navigate to for
133
+ * `langCode` (null = the original/source language), or null when no
134
+ * navigation is needed and the widget should translate in place:
135
+ * the target language has no prefix and none needs stripping, or the
136
+ * URL wouldn't change. */
137
+ urlFor(langCode: string | null, location: {
138
+ pathname: string;
139
+ search: string;
140
+ hash: string;
141
+ }): string | null;
142
+ private matchPrefix;
143
+ }
144
+
145
+ export { DabaLang, type DabaLangError, type DabaLangOptions, type LanguageConfig, PathRouter, type ProjectMetadata, type TranslationResult };
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Which deployment tier this widget talks to.
3
+ *
4
+ * Production is the default in every direction: an embed that says
5
+ * nothing about its environment is a customer's live site, and the one
6
+ * outcome worth engineering against is a production page silently
7
+ * pointing at staging. So the mapping is deliberately asymmetric —
8
+ * "staging" must be asked for by name, and anything else resolves to
9
+ * production.
10
+ */
11
+ type DabaEnvironment = "production" | "staging";
12
+
13
+ interface DabaLangOptions {
14
+ /** CSS selector or element — where the language-switcher pills mount.
15
+ * The rest of the page is crawled/translated regardless of this. */
16
+ container: string | HTMLElement;
17
+ projectId: string;
18
+ apiKey: string;
19
+ /** Defaults to https://api.dabalabs.com. Overrides `env` when both are
20
+ * given — it is the only option that can name a host neither tier
21
+ * covers (self-hosted, a branch preview, a local gateway). */
22
+ gatewayUrl?: string;
23
+ /** Which Dabalabs tier to talk to. Omit for production; pass "staging"
24
+ * to point the widget at the staging gateway. */
25
+ env?: DabaEnvironment;
26
+ /** How the switcher presents the configured languages:
27
+ * - "modal" (default): a trigger button that opens the centered
28
+ * flag-grid modal.
29
+ * - "dropdown": a compact select-style control that lists the
30
+ * project's languages directly, anchored to the trigger — for sites
31
+ * that want the languages visible in one click, no overlay. */
32
+ view?: "modal" | "dropdown";
33
+ onError?: (error: DabaLangError) => void;
34
+ onLanguageChange?: (langCode: string) => void;
35
+ }
36
+ interface DabaLangError {
37
+ kind: "invalid_key" | "origin_not_allowed" | "not_found" | "network" | "bad_request";
38
+ message: string;
39
+ }
40
+ /** Per-language configuration from the dashboard. Languages that only
41
+ * exist in the legacy target list have no entry here and behave as
42
+ * automatic with no path prefix. */
43
+ interface LanguageConfig {
44
+ code: string;
45
+ /** "auto" (the platform translates) or "developer" (pre-translated
46
+ * catalogue uploaded by the site's developer). Informational to the
47
+ * widget — both are served through the same batch endpoint. */
48
+ provider: string;
49
+ /** URL prefix ("/ar") this language lives under when the project has
50
+ * path routing enabled. */
51
+ pathPrefix: string | null;
52
+ /** Language applied on un-prefixed paths when path routing is on. */
53
+ isDefault: boolean;
54
+ }
55
+ interface ProjectMetadata {
56
+ projectId: string;
57
+ title: string;
58
+ sourceLang: string;
59
+ targetLanguages: string[];
60
+ /** When true, the widget detects the language from the URL path prefix
61
+ * on load and navigates between prefixes on switch (see PathRouter). */
62
+ enablePathRouting: boolean;
63
+ languages: LanguageConfig[];
64
+ }
65
+ type TranslationSource = "correction" | "cache" | "fresh";
66
+ interface TranslationResult {
67
+ sourceText: string;
68
+ translatedText: string;
69
+ source: TranslationSource;
70
+ }
71
+
72
+ /** The main class — composes: fetch project config -> crawl the page ->
73
+ * render the language-switcher pills -> on selection, batch-translate and
74
+ * swap text in place -> (dev only) wire up the double-click corrector. */
75
+ declare class DabaLang {
76
+ private readonly options;
77
+ private readonly container;
78
+ private readonly gatewayUrl;
79
+ private applier;
80
+ private readonly docLang;
81
+ private editor;
82
+ private switcher;
83
+ private metadata;
84
+ private pathRouter;
85
+ /** Currently active language (null = original). Tracked here rather
86
+ * than via the applier because a site-translated page (see
87
+ * isSiteTranslated) never runs the applier at all. */
88
+ private activeLang;
89
+ private readonly ready;
90
+ constructor(options: DabaLangOptions);
91
+ private init;
92
+ /** True when the site serves this language's content itself (CMS,
93
+ * localized build): a pre-translated ("developer") language. Combined
94
+ * with a prefix match, the widget never machine-translates that page.
95
+ * (A prefix-less developer language instead swaps its uploaded
96
+ * catalogue in place.) */
97
+ private isSiteTranslated;
98
+ private selectLanguage;
99
+ /** Overridable seam for tests — jsdom can't perform real navigation. */
100
+ protected navigateTo(url: string): void;
101
+ private handleError;
102
+ /** Resolves once the initial metadata fetch + pill render has settled
103
+ * (successfully or not) — mainly useful in tests. */
104
+ whenReady(): Promise<void>;
105
+ currentLanguage(): string | null;
106
+ destroy(): void;
107
+ }
108
+
109
+ /** Pure URL logic for path-prefix routing (`/ar/about` -> Arabic).
110
+ *
111
+ * The widget NEVER redirects on page load — the server owns redirects.
112
+ * On load it only *detects* the active language from the pathname and
113
+ * applies translations in place; navigation happens exclusively when the
114
+ * visitor picks a language from the switcher, and only to swap/strip a
115
+ * configured prefix. Languages without a prefix keep translating in
116
+ * place, exactly as when path routing is off. */
117
+ declare class PathRouter {
118
+ /** Longest prefix first so overlapping prefixes resolve to the most
119
+ * specific one (matching is segment-safe either way). */
120
+ private readonly prefixed;
121
+ private readonly defaultLang;
122
+ constructor(languages: LanguageConfig[]);
123
+ /** Language the current pathname is serving: the language whose prefix
124
+ * starts the path ("/ar", "/ar/about" — but never "/arbitrary"), else
125
+ * the configured default language for un-prefixed paths, else null. */
126
+ detect(pathname: string): string | null;
127
+ /** Like detect(), but only a real prefix match — no default-language
128
+ * fallback. Used to tell "this URL is the language's own path" (where
129
+ * a site-translated language needs no translate pass) apart from "the
130
+ * default language applies here". */
131
+ detectFromPrefix(pathname: string): string | null;
132
+ /** URL (path + search + hash) the switcher should navigate to for
133
+ * `langCode` (null = the original/source language), or null when no
134
+ * navigation is needed and the widget should translate in place:
135
+ * the target language has no prefix and none needs stripping, or the
136
+ * URL wouldn't change. */
137
+ urlFor(langCode: string | null, location: {
138
+ pathname: string;
139
+ search: string;
140
+ hash: string;
141
+ }): string | null;
142
+ private matchPrefix;
143
+ }
144
+
145
+ export { DabaLang, type DabaLangError, type DabaLangOptions, type LanguageConfig, PathRouter, type ProjectMetadata, type TranslationResult };