{"version":3,"sources":["../src/utils/languages.ts","../src/utils/plurals.ts","../src/core/client.ts","../src/utils/fonts.ts","../src/utils/formatting.ts","../src/core/store.ts"],"sourcesContent":["// FILE: packages/sdk/src/utils/languages.ts\r\n//\r\n// This file is a KEY DIFFERENTIATOR of BhashaJS.\r\n//\r\n// Other i18n libraries like i18next treat every language the same —\r\n// they just swap strings. They don't know that Urdu is right-to-left,\r\n// that Hindi needs a specific font to render conjuncts properly, or\r\n// that Nepali should fall back to Hindi before falling back to English.\r\n//\r\n// BhashaJS ships with this knowledge built in. When a developer adds\r\n// Urdu support, we automatically handle RTL. When they add Bengali,\r\n// we know which font to load and which numbering system to use.\r\n//\r\n// This is what makes us purpose-built for South Asian languages.\r\n\r\nimport { LangInfo } from \"../types\";\r\n\r\n/**\r\n * Built-in language database — 14 entries covering 13 languages.\r\n * (Punjabi has two entries: Gurmukhi for India, Shahmukhi for Pakistan)\r\n *\r\n * Every South Asian language we support has:\r\n * - Its name in its own script (so the switcher shows हिन्दी not \"Hindi\")\r\n * - Text direction (RTL for Urdu/Shahmukhi Punjabi)\r\n * - A recommended Google Font that properly renders the script\r\n * - Default region, locale, currency, and numbering system for formatting\r\n */\r\nexport const LANGUAGES: Record<string, LangInfo> = {\r\n  en: {\r\n    code: \"en\",\r\n    name: \"English\",\r\n    englishName: \"English\",\r\n    dir: \"ltr\",\r\n    font: \"Inter, sans-serif\",\r\n    script: \"Latin\",\r\n    defaultRegion: \"IN\",\r\n    intlLocale: \"en-IN\",\r\n    numberingSystem: \"latn\",\r\n    defaultCurrency: \"INR\",\r\n  },\r\n  hi: {\r\n    code: \"hi\",\r\n    name: \"हिन्दी\",\r\n    englishName: \"Hindi\",\r\n    dir: \"ltr\",\r\n    font: \"Noto Sans Devanagari, sans-serif\",\r\n    script: \"Devanagari\",\r\n    defaultRegion: \"IN\",\r\n    intlLocale: \"hi-IN\",\r\n    numberingSystem: \"deva\",\r\n    defaultCurrency: \"INR\",\r\n  },\r\n  bn: {\r\n    code: \"bn\",\r\n    name: \"বাংলা\",\r\n    englishName: \"Bengali\",\r\n    dir: \"ltr\",\r\n    font: \"Noto Sans Bengali, sans-serif\",\r\n    script: \"Bengali\",\r\n    defaultRegion: \"BD\",\r\n    intlLocale: \"bn-BD\",\r\n    numberingSystem: \"beng\",\r\n    defaultCurrency: \"BDT\",\r\n  },\r\n  ur: {\r\n    code: \"ur\",\r\n    name: \"اردو\",\r\n    englishName: \"Urdu\",\r\n    dir: \"rtl\",\r\n    font: \"Noto Nastaliq Urdu, serif\",\r\n    script: \"Nastaliq\",\r\n    defaultRegion: \"PK\",\r\n    intlLocale: \"ur-PK\",\r\n    numberingSystem: \"arabext\",\r\n    defaultCurrency: \"PKR\",\r\n  },\r\n  ta: {\r\n    code: \"ta\",\r\n    name: \"தமிழ்\",\r\n    englishName: \"Tamil\",\r\n    dir: \"ltr\",\r\n    font: \"Noto Sans Tamil, sans-serif\",\r\n    script: \"Tamil\",\r\n    defaultRegion: \"IN\",\r\n    intlLocale: \"ta-IN\",\r\n    numberingSystem: \"tamldec\",\r\n    defaultCurrency: \"INR\",\r\n  },\r\n  te: {\r\n    code: \"te\",\r\n    name: \"తెలుగు\",\r\n    englishName: \"Telugu\",\r\n    dir: \"ltr\",\r\n    font: \"Noto Sans Telugu, sans-serif\",\r\n    script: \"Telugu\",\r\n    defaultRegion: \"IN\",\r\n    intlLocale: \"te-IN\",\r\n    numberingSystem: \"telu\",\r\n    defaultCurrency: \"INR\",\r\n  },\r\n  mr: {\r\n    code: \"mr\",\r\n    name: \"मराठी\",\r\n    englishName: \"Marathi\",\r\n    dir: \"ltr\",\r\n    font: \"Noto Sans Devanagari, sans-serif\",\r\n    script: \"Devanagari\",\r\n    defaultRegion: \"IN\",\r\n    intlLocale: \"mr-IN\",\r\n    numberingSystem: \"deva\",\r\n    defaultCurrency: \"INR\",\r\n  },\r\n  ne: {\r\n    code: \"ne\",\r\n    name: \"नेपाली\",\r\n    englishName: \"Nepali\",\r\n    dir: \"ltr\",\r\n    font: \"Noto Sans Devanagari, sans-serif\",\r\n    script: \"Devanagari\",\r\n    defaultRegion: \"NP\",\r\n    intlLocale: \"ne-NP\",\r\n    numberingSystem: \"deva\",\r\n    defaultCurrency: \"NPR\",\r\n  },\r\n  pa: {\r\n    code: \"pa\",\r\n    name: \"ਪੰਜਾਬੀ\",\r\n    englishName: \"Punjabi\",\r\n    dir: \"ltr\",\r\n    font: \"Noto Sans Gurmukhi, sans-serif\",\r\n    script: \"Gurmukhi\",\r\n    defaultRegion: \"IN\",\r\n    intlLocale: \"pa-IN\",\r\n    numberingSystem: \"guru\",\r\n    defaultCurrency: \"INR\",\r\n  },\r\n  \"pa-PK\": {\r\n    code: \"pa-PK\",\r\n    name: \"پنجابی\",\r\n    englishName: \"Punjabi (Shahmukhi)\",\r\n    dir: \"rtl\",\r\n    font: \"Noto Nastaliq Urdu, serif\",\r\n    script: \"Shahmukhi\",\r\n    defaultRegion: \"PK\",\r\n    intlLocale: \"pa-Arab-PK\",\r\n    numberingSystem: \"arabext\",\r\n    defaultCurrency: \"PKR\",\r\n  },\r\n  gu: {\r\n    code: \"gu\",\r\n    name: \"ગુજરાતી\",\r\n    englishName: \"Gujarati\",\r\n    dir: \"ltr\",\r\n    font: \"Noto Sans Gujarati, sans-serif\",\r\n    script: \"Gujarati\",\r\n    defaultRegion: \"IN\",\r\n    intlLocale: \"gu-IN\",\r\n    numberingSystem: \"gujr\",\r\n    defaultCurrency: \"INR\",\r\n  },\r\n  kn: {\r\n    code: \"kn\",\r\n    name: \"ಕನ್ನಡ\",\r\n    englishName: \"Kannada\",\r\n    dir: \"ltr\",\r\n    font: \"Noto Sans Kannada, sans-serif\",\r\n    script: \"Kannada\",\r\n    defaultRegion: \"IN\",\r\n    intlLocale: \"kn-IN\",\r\n    numberingSystem: \"knda\",\r\n    defaultCurrency: \"INR\",\r\n  },\r\n  ml: {\r\n    code: \"ml\",\r\n    name: \"മലയാളം\",\r\n    englishName: \"Malayalam\",\r\n    dir: \"ltr\",\r\n    font: \"Noto Sans Malayalam, sans-serif\",\r\n    script: \"Malayalam\",\r\n    defaultRegion: \"IN\",\r\n    intlLocale: \"ml-IN\",\r\n    numberingSystem: \"mlym\",\r\n    defaultCurrency: \"INR\",\r\n  },\r\n  si: {\r\n    code: \"si\",\r\n    name: \"සිංහල\",\r\n    englishName: \"Sinhala\",\r\n    dir: \"ltr\",\r\n    font: \"Noto Sans Sinhala, sans-serif\",\r\n    script: \"Sinhala\",\r\n    defaultRegion: \"LK\",\r\n    intlLocale: \"si-LK\",\r\n    numberingSystem: \"sinh\",\r\n    defaultCurrency: \"LKR\",\r\n  },\r\n\r\n  // ─── Latin-script (Romanized) variants — first-class locales ──────────\r\n  //\r\n  // These are NOT \"broken\" Hindi/Urdu/etc. — they're how Gen-Z South Asians\r\n  // actually type. WhatsApp, Twitter, Discord, dating apps, casual product\r\n  // copy: Latin script dominates. Treating them as their own locales (with\r\n  // their own translation memory, plural rules, fallback chains) is the\r\n  // unique edge no generic i18n tool offers.\r\n  //\r\n  // Naming follows the BCP 47 convention `<lang>-Latn`. The native `name`\r\n  // uses the colloquial term Gen-Z users recognize (\"Hinglish\", \"Banglish\").\r\n\r\n  \"hi-Latn\": {\r\n    code: \"hi-Latn\",\r\n    name: \"Hinglish\",\r\n    englishName: \"Hindi (Roman)\",\r\n    dir: \"ltr\",\r\n    font: \"Inter, sans-serif\",\r\n    script: \"Latin\",\r\n    defaultRegion: \"IN\",\r\n    intlLocale: \"hi-Latn-IN\",\r\n    numberingSystem: \"latn\",\r\n    defaultCurrency: \"INR\",\r\n  },\r\n  \"ne-Latn\": {\r\n    code: \"ne-Latn\",\r\n    name: \"Roman Nepali\",\r\n    englishName: \"Nepali (Roman)\",\r\n    dir: \"ltr\",\r\n    font: \"Inter, sans-serif\",\r\n    script: \"Latin\",\r\n    defaultRegion: \"NP\",\r\n    intlLocale: \"ne-Latn-NP\",\r\n    numberingSystem: \"latn\",\r\n    defaultCurrency: \"NPR\",\r\n  },\r\n  \"ur-Latn\": {\r\n    code: \"ur-Latn\",\r\n    name: \"Roman Urdu\",\r\n    englishName: \"Urdu (Roman)\",\r\n    dir: \"ltr\",\r\n    font: \"Inter, sans-serif\",\r\n    script: \"Latin\",\r\n    defaultRegion: \"PK\",\r\n    intlLocale: \"ur-Latn-PK\",\r\n    numberingSystem: \"latn\",\r\n    defaultCurrency: \"PKR\",\r\n  },\r\n  \"bn-Latn\": {\r\n    code: \"bn-Latn\",\r\n    name: \"Banglish\",\r\n    englishName: \"Bengali (Roman)\",\r\n    dir: \"ltr\",\r\n    font: \"Inter, sans-serif\",\r\n    script: \"Latin\",\r\n    defaultRegion: \"BD\",\r\n    intlLocale: \"bn-Latn-BD\",\r\n    numberingSystem: \"latn\",\r\n    defaultCurrency: \"BDT\",\r\n  },\r\n  \"pa-Latn\": {\r\n    code: \"pa-Latn\",\r\n    name: \"Roman Punjabi\",\r\n    englishName: \"Punjabi (Roman)\",\r\n    dir: \"ltr\",\r\n    font: \"Inter, sans-serif\",\r\n    script: \"Latin\",\r\n    defaultRegion: \"IN\",\r\n    intlLocale: \"pa-Latn-IN\",\r\n    numberingSystem: \"latn\",\r\n    defaultCurrency: \"INR\",\r\n  },\r\n};\r\n\r\n/**\r\n * Culturally-aware fallback chains.\r\n *\r\n * WHY THIS MATTERS:\r\n * If a Bengali translation is missing, what should we show?\r\n * Most i18n tools fall back to English. But a Bengali speaker\r\n * is more likely to understand Hindi than English. So we fall\r\n * back to Hindi first, then English.\r\n *\r\n * IMPORTANT: Dravidian languages (Tamil, Telugu, Kannada, Malayalam)\r\n * do NOT fall back to Hindi. They're from a completely different\r\n * language family. A Tamil speaker is NOT more likely to understand\r\n * Hindi than English.\r\n *\r\n * Developers can override these in the config if they want.\r\n */\r\nexport const FALLBACK_CHAINS: Record<string, string[]> = {\r\n  en: [\"en\"],\r\n  hi: [\"hi\", \"en\"],\r\n  bn: [\"bn\", \"hi\", \"en\"],        // Bengali → Hindi → English\r\n  ur: [\"ur\", \"hi\", \"en\"],        // Urdu → Hindi → English (mutually intelligible spoken)\r\n  ta: [\"ta\", \"en\"],              // Tamil → English (Dravidian — NO Hindi fallback)\r\n  te: [\"te\", \"en\"],              // Telugu → English (Dravidian — NO Hindi fallback)\r\n  mr: [\"mr\", \"hi\", \"en\"],        // Marathi → Hindi → English (both Devanagari)\r\n  ne: [\"ne\", \"hi\", \"en\"],        // Nepali → Hindi → English (very close to Hindi)\r\n  pa: [\"pa\", \"hi\", \"en\"],        // Punjabi (India) → Hindi → English\r\n  \"pa-PK\": [\"pa-PK\", \"ur\", \"en\"],// Punjabi (Pakistan) → Urdu → English\r\n  gu: [\"gu\", \"hi\", \"en\"],        // Gujarati → Hindi → English\r\n  kn: [\"kn\", \"en\"],              // Kannada → English (Dravidian — NO Hindi fallback)\r\n  ml: [\"ml\", \"en\"],              // Malayalam → English (Dravidian — NO Hindi fallback)\r\n  si: [\"si\", \"en\"],              // Sinhala → English\r\n\r\n  // Latin-script chains. Key insight: script bridges harder than language\r\n  // family does. A Roman-Hindi reader prefers English over Devanagari Hindi\r\n  // because the script flip is a worse experience than the language gap.\r\n  \"hi-Latn\": [\"hi-Latn\", \"en\"],                    // Hinglish → English\r\n  \"ne-Latn\": [\"ne-Latn\", \"hi-Latn\", \"en\"],         // Roman Nepali → Hinglish → English (same script + close lang)\r\n  \"ur-Latn\": [\"ur-Latn\", \"hi-Latn\", \"en\"],         // Roman Urdu → Hinglish → English (mutually intelligible)\r\n  \"bn-Latn\": [\"bn-Latn\", \"en\"],                    // Banglish → English (Bengali doesn't bridge to Hindi well in Latin)\r\n  \"pa-Latn\": [\"pa-Latn\", \"hi-Latn\", \"en\"],         // Roman Punjabi → Hinglish → English\r\n};\r\n\r\n/**\r\n * Region overrides for languages that span multiple countries.\r\n *\r\n * Some languages are spoken across borders with different currencies:\r\n * - Bengali: Bangladesh (৳ Taka) vs India (₹ Rupee)\r\n * - Tamil: India (₹ Rupee) vs Sri Lanka (Rs)\r\n * - Urdu: Pakistan (Rs) vs India (₹ Rupee)\r\n *\r\n * Developers pass region=\"IN\" to <I18nProvider> to override defaults.\r\n * The key format is \"{langCode}-{regionCode}\".\r\n */\r\nexport const REGION_OVERRIDES: Record<string, { currency: string; intlLocale: string }> = {\r\n  \"bn-IN\": { currency: \"INR\", intlLocale: \"bn-IN\" },\r\n  \"ta-LK\": { currency: \"LKR\", intlLocale: \"ta-LK\" },\r\n  \"ur-IN\": { currency: \"INR\", intlLocale: \"ur-IN\" },\r\n  \"si-IN\": { currency: \"INR\", intlLocale: \"si-IN\" },\r\n  \"ne-IN\": { currency: \"INR\", intlLocale: \"ne-IN\" },\r\n};\r\n\r\n/**\r\n * Get language info. Returns a default for unknown languages\r\n * so the SDK never crashes on an unrecognized code.\r\n */\r\nexport function getLangInfo(code: string): LangInfo {\r\n  if (LANGUAGES[code]) return LANGUAGES[code];\r\n\r\n  // Unknown code — infer direction so we never render an RTL language\r\n  // left-to-right (the exact South-Asian RTL audience we target). RTL if the\r\n  // base is a known RTL language or the code carries an Arabic-script subtag\r\n  // (e.g. \"ur-IN\", \"pa-Arab\"); a \"-Latn\" romanized variant is always LTR.\r\n  const lower = code.toLowerCase();\r\n  const isLatn = /-latn(-|$)/.test(lower);\r\n  const rtl =\r\n    !isLatn &&\r\n    (/^(ur|ar|fa|ps|sd|ks)(-|$)/.test(lower) || /-arab(-|$)/.test(lower));\r\n  return {\r\n    code,\r\n    name: code,\r\n    englishName: code,\r\n    dir: rtl ? (\"rtl\" as const) : (\"ltr\" as const),\r\n    font: \"sans-serif\",\r\n    script: rtl ? \"Arabic\" : isLatn ? \"Latin\" : \"Unknown\",\r\n    defaultRegion: \"IN\",\r\n    intlLocale: code,\r\n    numberingSystem: \"latn\",\r\n    defaultCurrency: \"INR\",\r\n  };\r\n}\r\n\r\n/**\r\n * Get the fallback chain for a language.\r\n * If no custom chain exists, defaults to [lang, \"en\"].\r\n */\r\nexport function getFallbackChain(lang: string): string[] {\r\n  return FALLBACK_CHAINS[lang] || [lang, \"en\"];\r\n}\r\n\r\n/**\r\n * Resolve the effective locale and currency for a language + optional region.\r\n * Checks REGION_OVERRIDES first, then falls back to the language's defaults.\r\n */\r\nexport function resolveRegion(\r\n  lang: string,\r\n  region?: string\r\n): { intlLocale: string; currency: string } {\r\n  const langInfo = getLangInfo(lang);\r\n\r\n  if (region) {\r\n    const overrideKey = `${lang}-${region}`;\r\n    const override = REGION_OVERRIDES[overrideKey];\r\n    if (override) {\r\n      return { intlLocale: override.intlLocale, currency: override.currency };\r\n    }\r\n    // If no specific override, just swap the region in the locale\r\n    return {\r\n      intlLocale: `${lang}-${region}`,\r\n      currency: langInfo.defaultCurrency,\r\n    };\r\n  }\r\n\r\n  return {\r\n    intlLocale: langInfo.intlLocale,\r\n    currency: langInfo.defaultCurrency,\r\n  };\r\n}\r\n\r\n/**\r\n * Google Fonts CSS URLs for each script.\r\n * We only load the fonts that are actually needed.\r\n */\r\nexport const FONT_URLS: Record<string, string> = {\r\n  \"Noto Sans Devanagari\":\r\n    \"https://fonts.googleapis.com/css2?family=Noto+Sans+Devanagari:wght@400;500;600;700&display=swap\",\r\n  \"Noto Sans Bengali\":\r\n    \"https://fonts.googleapis.com/css2?family=Noto+Sans+Bengali:wght@400;500;600;700&display=swap\",\r\n  \"Noto Nastaliq Urdu\":\r\n    \"https://fonts.googleapis.com/css2?family=Noto+Nastaliq+Urdu:wght@400;500;600;700&display=swap\",\r\n  \"Noto Sans Tamil\":\r\n    \"https://fonts.googleapis.com/css2?family=Noto+Sans+Tamil:wght@400;500;600;700&display=swap\",\r\n  \"Noto Sans Telugu\":\r\n    \"https://fonts.googleapis.com/css2?family=Noto+Sans+Telugu:wght@400;500;600;700&display=swap\",\r\n  \"Noto Sans Gurmukhi\":\r\n    \"https://fonts.googleapis.com/css2?family=Noto+Sans+Gurmukhi:wght@400;500;600;700&display=swap\",\r\n  \"Noto Sans Gujarati\":\r\n    \"https://fonts.googleapis.com/css2?family=Noto+Sans+Gujarati:wght@400;500;600;700&display=swap\",\r\n  \"Noto Sans Kannada\":\r\n    \"https://fonts.googleapis.com/css2?family=Noto+Sans+Kannada:wght@400;500;600;700&display=swap\",\r\n  \"Noto Sans Malayalam\":\r\n    \"https://fonts.googleapis.com/css2?family=Noto+Sans+Malayalam:wght@400;500;600;700&display=swap\",\r\n  \"Noto Sans Sinhala\":\r\n    \"https://fonts.googleapis.com/css2?family=Noto+Sans+Sinhala:wght@400;500;600;700&display=swap\",\r\n};\r\n","// FILE: packages/sdk/src/utils/plurals.ts\r\n//\r\n// CLDR-compliant pluralization for South Asian languages.\r\n//\r\n// WHY THIS IS CRITICAL:\r\n// Hindi treats 0 as singular: \"0 आइटम\" (not \"0 आइटमें\")\r\n// English treats 0 as plural: \"0 items\" (not \"0 item\")\r\n//\r\n// Most i18n tools apply English rules globally. This means Hindi\r\n// pluralization is WRONG in every app using i18next without custom\r\n// configuration. BhashaJS handles this correctly out of the box.\r\n//\r\n// CLDR PLURAL RULES (simplified for South Asian languages):\r\n// We only need \"one\" and \"other\" categories. More complex languages\r\n// (like Arabic with dual/few) are not in our scope.\r\n//\r\n// Group A — 0 AND 1 are \"one\" (singular):\r\n//   Hindi, Bengali, Marathi, Gujarati, Kannada, Sinhala, Punjabi\r\n//   Rule: n is 0 or n is 1 → \"one\"\r\n//\r\n// Group B — Only 1 is \"one\" (singular):\r\n//   English, Urdu, Tamil, Telugu, Malayalam, Nepali\r\n//   Rule: n is 1 → \"one\"\r\n//\r\n// Source: Unicode CLDR plural rules\r\n// https://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html\r\n\r\n/**\r\n * Languages where BOTH 0 and 1 are treated as singular (\"one\").\r\n * This is the South Asian plural rule that most tools get wrong.\r\n *\r\n * Latin-script variants (hi-Latn, bn-Latn, pa-Latn) inherit from their base\r\n * language — switching scripts doesn't change grammatical number rules. The\r\n * `getPluralCategory` function strips the `-Latn` suffix before lookup.\r\n */\r\nconst ZERO_AND_ONE_SINGULAR = new Set([\r\n  \"hi\",     // Hindi\r\n  \"bn\",     // Bengali\r\n  \"mr\",     // Marathi\r\n  \"gu\",     // Gujarati\r\n  \"kn\",     // Kannada\r\n  \"si\",     // Sinhala\r\n  \"pa\",     // Punjabi (Gurmukhi)\r\n  \"pa-PK\",  // Punjabi (Shahmukhi)\r\n]);\r\n\r\n/**\r\n * Map a locale code to its base language for plural-rule lookup.\r\n * `hi-Latn` → `hi`. `pa-PK` is intentionally NOT stripped because it's a\r\n * full locale (different script), not a romanization.\r\n */\r\nfunction baseLangForPlurals(lang: string): string {\r\n  return lang.endsWith(\"-Latn\") ? lang.slice(0, -5) : lang;\r\n}\r\n\r\n/**\r\n * Get the CLDR plural category for a number in a given language.\r\n *\r\n * @param count - The number to pluralize (e.g. 0, 1, 5)\r\n * @param lang  - The language code (e.g. \"hi\", \"en\")\r\n * @returns \"one\" (singular) or \"other\" (plural)\r\n *\r\n * @example\r\n * getPluralCategory(0, \"en\")  // → \"other\"  (English: \"0 items\")\r\n * getPluralCategory(0, \"hi\")  // → \"one\"    (Hindi: \"0 आइटम\")\r\n * getPluralCategory(1, \"en\")  // → \"one\"    (English: \"1 item\")\r\n * getPluralCategory(1, \"hi\")  // → \"one\"    (Hindi: \"1 आइटम\")\r\n * getPluralCategory(5, \"en\")  // → \"other\"  (English: \"5 items\")\r\n * getPluralCategory(5, \"hi\")  // → \"other\"  (Hindi: \"5 आइटमें\")\r\n */\r\nexport function getPluralCategory(\r\n  count: number,\r\n  lang: string\r\n): \"one\" | \"other\" {\r\n  // Use the absolute value for negative numbers\r\n  const n = Math.abs(count);\r\n  const base = baseLangForPlurals(lang);\r\n\r\n  // DELIBERATE MOAT OVERRIDE — South Asian \"0-as-singular\".\r\n  // For the Group-A languages, 0 is grammatically singular (\"0 आइटम\"),\r\n  // even where CLDR/Intl classifies it \"other\" (e.g. Marathi). This is the\r\n  // one intentional divergence from Intl.PluralRules and is allow-listed in\r\n  // cldr-plural.test.ts. It only applies to an EXACT zero — non-zero counts\r\n  // (including decimals like 0.5) defer to CLDR below.\r\n  if (ZERO_AND_ONE_SINGULAR.has(base) && n === 0) {\r\n    return \"one\";\r\n  }\r\n\r\n  // Everything else defers to the platform's CLDR data via Intl.PluralRules,\r\n  // which is correct for decimals (e.g. Sinhala/Punjabi 0.5 → \"other\",\r\n  // Marathi 0.5 → \"other\") where the old hand-rolled table diverged. The SDK\r\n  // only models \"one\"/\"other\", so we collapse Intl's category accordingly\r\n  // (Intl \"one\" → \"one\"; \"zero\"/\"two\"/\"few\"/\"many\"/\"other\" → \"other\").\r\n  try {\r\n    return new Intl.PluralRules(base).select(n) === \"one\" ? \"one\" : \"other\";\r\n  } catch {\r\n    // Unknown/unsupported locale — fall back to the old hand rule. Group-A\r\n    // bases already returned above for n === 0, so here Group A keeps 1 as\r\n    // singular and Group B keeps only 1 as singular.\r\n    if (ZERO_AND_ONE_SINGULAR.has(base)) {\r\n      return n <= 1 ? \"one\" : \"other\";\r\n    }\r\n    return n === 1 ? \"one\" : \"other\";\r\n  }\r\n}\r\n","// FILE: packages/sdk/src/core/client.ts\r\n//\r\n// The TranslationClient is the engine of the SDK.\r\n// It handles:\r\n//   1. Fetching translations from the BhashaJS API per (lang, register)\r\n//   2. Caching them in memory so we don't re-fetch\r\n//   3. Looking up a key with register + language fallback chain support\r\n//   4. String interpolation (replacing {name} with actual values)\r\n//\r\n// IMPORTANT: This class has ZERO React dependency.\r\n// It's pure TypeScript. This means in the future, you could\r\n// create a Vue or Svelte wrapper around the same client.\r\n// The React-specific stuff lives in the hooks and components.\r\n//\r\n// REGISTER FALLBACK:\r\n// A request for \"casual\" Hindi falls back to \"default\" Hindi if the casual\r\n// translation is missing — so a partially-localized casual register still\r\n// produces a usable bundle. Then the language fallback chain kicks in\r\n// (e.g. casual Bengali → default Bengali → default Hindi → English).\r\n\r\nimport { getFallbackChain } from \"../utils/languages\";\r\nimport { getPluralCategory } from \"../utils/plurals\";\r\nimport type { Register } from \"../types\";\r\n\r\nconst DEFAULT_REGISTER: Register = \"default\";\r\ntype ClientOptions = {\r\n  persistCache?: boolean;\r\n};\r\n\r\n/** Compose the cache key. We flatten (lang, register) so the inner cache\r\n *  stays a simple Record<key, string>. */\r\nfunction bundleKey(lang: string, register: Register): string {\r\n  return `${lang}:${register}`;\r\n}\r\n\r\nfunction ownString(obj: Record<string, string>, key: string): string | undefined {\r\n  if (!Object.prototype.hasOwnProperty.call(obj, key)) return undefined;\r\n  const value = obj[key];\r\n  return typeof value === \"string\" ? value : undefined;\r\n}\r\n\r\nfunction ownVoice(\r\n  obj: Record<string, { ipa: string; ssml: string }>,\r\n  key: string\r\n): { ipa: string; ssml: string } | undefined {\r\n  if (!Object.prototype.hasOwnProperty.call(obj, key)) return undefined;\r\n  const value = obj[key];\r\n  if (!value || typeof value !== \"object\") return undefined;\r\n  return value;\r\n}\r\n\r\nexport class TranslationClient {\r\n  private projectId: string;\r\n  private apiUrl: string;\r\n  private apiToken: string;\r\n  private projectKey: string;\r\n  private persistCache: boolean;\r\n  private onBundleUpdate?: () => void;\r\n\r\n  /**\r\n   * Cache structure: keyed by `${lang}:${register}`, mapping to a flat\r\n   * Record<key, translation>. So:\r\n   *   cache[\"hi:default\"] = { \"hero.title\": \"स्वागत\" }\r\n   *   cache[\"hi:casual\"]  = { \"hero.title\": \"Welcome है\" }\r\n   * Once a (lang, register) bundle is fetched, it stays in the cache for the\r\n   * lifetime of the app.\r\n   */\r\n  private cache: Record<string, Record<string, string>> = {};\r\n\r\n  /**\r\n   * Voice cache, parallel to `cache` but per-(lang, register, key) holding\r\n   * { ipa, ssml }. Populated lazily by `fetchVoice` — populated only when\r\n   * the developer enables voice mode or calls `formatPhonetic` / `formatSSML`\r\n   * before the first paint.\r\n   */\r\n  private voiceCache: Record<string, Record<string, { ipa: string; ssml: string }>> = {};\r\n\r\n  /**\r\n   * Tracks which (lang, register) bundles are currently being fetched.\r\n   * Prevents duplicate API calls if a component renders twice\r\n   * before the first fetch completes (React Strict Mode does this).\r\n   */\r\n  private fetchPromises: Record<string, Promise<Record<string, string>>> = {};\r\n\r\n  /** In-flight voice-bundle fetches, indexed the same way as fetchPromises. */\r\n  private voiceFetchPromises: Record<string, Promise<Record<string, { ipa: string; ssml: string }>>> = {};\r\n\r\n  /** List of supported languages, fetched from the project endpoint */\r\n  private supportedLangs: string[] = [];\r\n\r\n  constructor(\r\n    projectId: string,\r\n    apiUrl: string,\r\n    apiToken: string,\r\n    projectKey: string = \"\",\r\n    options: ClientOptions = {}\r\n  ) {\r\n    this.projectId = projectId;\r\n    this.apiUrl = apiUrl;\r\n    this.apiToken = apiToken;\r\n    this.projectKey = projectKey;\r\n    this.persistCache = options.persistCache !== false;\r\n  }\r\n\r\n  /** Whether this client uses the public SDK endpoints (API key auth) */\r\n  private get usePublicEndpoints(): boolean {\r\n    return !!this.projectKey;\r\n  }\r\n\r\n  /**\r\n   * Load preloaded translations into the cache.\r\n   * Accepts both shapes for backwards compat:\r\n   *   1. Flat (legacy):   { \"hi\": { \"hero.title\": \"स्वागत\" } }\r\n   *      → loaded into the \"default\" register.\r\n   *   2. Nested:          { \"hi\": { \"default\": { \"hero.title\": \"स्वागत\" },\r\n   *                                  \"casual\":  { \"hero.title\": \"Welcome है\" } } }\r\n   */\r\n  preload(\r\n    translations: Record<\r\n      string,\r\n      Record<string, string> | Partial<Record<Register, Record<string, string>>>\r\n    >\r\n  ): void {\r\n    for (const [lang, body] of Object.entries(translations)) {\r\n      // Heuristic: a register bundle is a \"register\" key whose value is itself\r\n      // a Record<string, string>. If we see strings as direct values, this is\r\n      // the legacy flat shape and we lift it to \"default\".\r\n      const looksLikeRegisterMap = Object.values(body).every(\r\n        (v) => typeof v === \"object\" && v !== null && !Array.isArray(v)\r\n      );\r\n\r\n      if (looksLikeRegisterMap) {\r\n        for (const [reg, strings] of Object.entries(body)) {\r\n          if (reg !== \"default\" && reg !== \"formal\" && reg !== \"casual\") continue;\r\n          this.cache[bundleKey(lang, reg as Register)] = strings as Record<string, string>;\r\n        }\r\n      } else {\r\n        this.cache[bundleKey(lang, DEFAULT_REGISTER)] = body as Record<string, string>;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Set the list of supported languages.\r\n   * Called by the provider after fetching project info.\r\n   */\r\n  setSupportedLangs(langs: string[]) {\r\n    this.supportedLangs = langs;\r\n  }\r\n\r\n  setOnBundleUpdate(fn?: (() => void) | null): void {\r\n    this.onBundleUpdate = fn || undefined;\r\n  }\r\n\r\n  getSupportedLangs(): string[] {\r\n    return this.supportedLangs;\r\n  }\r\n\r\n  /**\r\n   * Fetch translations for a specific (language, register) bundle from the API.\r\n   *\r\n   * HOW IT WORKS:\r\n   * 1. Check if the bundle is already in cache → return immediately\r\n   * 2. Check if a fetch is already in progress → wait for that one\r\n   * 3. Otherwise, make the API call, cache the result, return it\r\n   *\r\n   * The API endpoint GET /api/sdk/translations?lang=hi&register=casual\r\n   * returns flat JSON: { \"hero.title\": \"Welcome है\" } — already collapsed\r\n   * server-side with default-register fallback baked in.\r\n   */\r\n  async fetchTranslations(\r\n    lang: string,\r\n    register: Register = DEFAULT_REGISTER\r\n  ): Promise<Record<string, string>> {\r\n    const cacheKey = bundleKey(lang, register);\r\n\r\n    // Already cached? Return immediately (instant language switching!)\r\n    if (this.cache[cacheKey]) {\r\n      return this.cache[cacheKey];\r\n    }\r\n\r\n    const persisted = this.readPersistedBundle(lang, register);\r\n    if (persisted) {\r\n      this.cache[cacheKey] = persisted;\r\n      this.refreshTranslationsInBackground(lang, register, cacheKey, persisted);\r\n      return persisted;\r\n    }\r\n\r\n    // Already fetching? Wait for the existing promise\r\n    // This prevents duplicate API calls in React Strict Mode\r\n    if (cacheKey in this.fetchPromises) {\r\n      return this.fetchPromises[cacheKey];\r\n    }\r\n\r\n    // Build the fetch promise. Errors propagate so the I18nProvider can expose\r\n    // them via its `error` state — silent failure made auth bugs invisible.\r\n    const fetchPromise = (async () => {\r\n      try {\r\n        const params = `lang=${encodeURIComponent(lang)}&register=${encodeURIComponent(register)}`;\r\n        const url = this.usePublicEndpoints\r\n          ? `${this.apiUrl}/sdk/translations?${params}`\r\n          : `${this.apiUrl}/translations/${this.projectId}?${params}`;\r\n\r\n        const headers: Record<string, string> = {\r\n          \"Content-Type\": \"application/json\",\r\n        };\r\n\r\n        if (this.usePublicEndpoints) {\r\n          headers[\"x-api-key\"] = this.projectKey;\r\n        } else if (this.apiToken) {\r\n          headers[\"Authorization\"] = `Bearer ${this.apiToken}`;\r\n        }\r\n\r\n        const response = await fetch(url, { headers });\r\n\r\n        if (!response.ok) {\r\n          const detail = await response.text().catch(() => \"\");\r\n          throw new Error(\r\n            `BhashaJS: failed to load translations for \"${lang}/${register}\" (HTTP ${response.status})${detail ? \": \" + detail : \"\"}`\r\n          );\r\n        }\r\n\r\n        const json = await response.json();\r\n        const translations = json.data || json;\r\n\r\n        this.cache[cacheKey] = translations;\r\n        this.writePersistedBundle(lang, register, translations);\r\n        return translations;\r\n      } finally {\r\n        delete this.fetchPromises[cacheKey];\r\n      }\r\n    })();\r\n\r\n    // Store the promise so concurrent calls can wait for it\r\n    this.fetchPromises[cacheKey] = fetchPromise;\r\n\r\n    return fetchPromise;\r\n  }\r\n\r\n  private refreshTranslationsInBackground(\r\n    lang: string,\r\n    register: Register,\r\n    cacheKey: string,\r\n    current: Record<string, string>\r\n  ): void {\r\n    if (cacheKey in this.fetchPromises) return;\r\n    const fetchPromise = (async () => {\r\n      try {\r\n        const params = `lang=${encodeURIComponent(lang)}&register=${encodeURIComponent(register)}`;\r\n        const url = this.usePublicEndpoints\r\n          ? `${this.apiUrl}/sdk/translations?${params}`\r\n          : `${this.apiUrl}/translations/${this.projectId}?${params}`;\r\n\r\n        const headers: Record<string, string> = {\r\n          \"Content-Type\": \"application/json\",\r\n        };\r\n\r\n        if (this.usePublicEndpoints) {\r\n          headers[\"x-api-key\"] = this.projectKey;\r\n        } else if (this.apiToken) {\r\n          headers[\"Authorization\"] = `Bearer ${this.apiToken}`;\r\n        }\r\n\r\n        const response = await fetch(url, { headers });\r\n        if (!response.ok) return current;\r\n\r\n        const json = await response.json();\r\n        const fresh = json.data || json;\r\n        if (JSON.stringify(fresh) !== JSON.stringify(current)) {\r\n          this.cache[cacheKey] = fresh;\r\n          this.writePersistedBundle(lang, register, fresh);\r\n          this.onBundleUpdate?.();\r\n        }\r\n        return fresh;\r\n      } catch {\r\n        return current;\r\n      } finally {\r\n        delete this.fetchPromises[cacheKey];\r\n      }\r\n    })();\r\n    this.fetchPromises[cacheKey] = fetchPromise;\r\n  }\r\n\r\n  private persistedStorageKey(lang: string, register: Register): string {\r\n    return `bhashajs:b1:${this.projectKey || this.projectId}:${lang}:${register}`;\r\n  }\r\n\r\n  private persistedLangsKey(): string {\r\n    return `bhashajs:p1:${this.projectKey || this.projectId}`;\r\n  }\r\n\r\n  private readPersistedLangs(): string[] | null {\r\n    if (!this.persistCache || typeof localStorage === \"undefined\") return null;\r\n    try {\r\n      const raw = localStorage.getItem(this.persistedLangsKey());\r\n      if (!raw) return null;\r\n      const parsed = JSON.parse(raw);\r\n      if (!parsed || parsed.v !== 1 || !Array.isArray(parsed.langs)) return null;\r\n      return parsed.langs.filter((l: unknown) => typeof l === \"string\");\r\n    } catch {\r\n      return null;\r\n    }\r\n  }\r\n\r\n  private writePersistedLangs(langs: string[]): void {\r\n    if (!this.persistCache || typeof localStorage === \"undefined\") return;\r\n    try {\r\n      localStorage.setItem(\r\n        this.persistedLangsKey(),\r\n        JSON.stringify({ v: 1, t: Date.now(), langs })\r\n      );\r\n    } catch {\r\n      // Storage is best-effort: quota/privacy-mode errors must not break i18n.\r\n    }\r\n  }\r\n\r\n  private readPersistedBundle(lang: string, register: Register): Record<string, string> | null {\r\n    if (!this.persistCache || typeof localStorage === \"undefined\") return null;\r\n    try {\r\n      const raw = localStorage.getItem(this.persistedStorageKey(lang, register));\r\n      if (!raw) return null;\r\n      const parsed = JSON.parse(raw);\r\n      if (!parsed || parsed.v !== 1 || !parsed.data || typeof parsed.data !== \"object\") {\r\n        return null;\r\n      }\r\n      return parsed.data;\r\n    } catch {\r\n      return null;\r\n    }\r\n  }\r\n\r\n  private writePersistedBundle(\r\n    lang: string,\r\n    register: Register,\r\n    data: Record<string, string>\r\n  ): void {\r\n    if (!this.persistCache || typeof localStorage === \"undefined\") return;\r\n    try {\r\n      localStorage.setItem(\r\n        this.persistedStorageKey(lang, register),\r\n        JSON.stringify({ v: 1, t: Date.now(), data })\r\n      );\r\n    } catch {\r\n      // Storage is best-effort: quota/privacy-mode errors must not break i18n.\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Fetch the voice bundle for a (lang, register). Same auth model as\r\n   * `fetchTranslations`, separate endpoint. Cached so future calls are\r\n   * instant. Errors propagate so the provider can expose them.\r\n   */\r\n  async fetchVoice(\r\n    lang: string,\r\n    register: Register = DEFAULT_REGISTER\r\n  ): Promise<Record<string, { ipa: string; ssml: string }>> {\r\n    const cacheKey = bundleKey(lang, register);\r\n    if (this.voiceCache[cacheKey]) return this.voiceCache[cacheKey];\r\n    if (cacheKey in this.voiceFetchPromises) return this.voiceFetchPromises[cacheKey];\r\n\r\n    const fetchPromise = (async () => {\r\n      try {\r\n        const params = `lang=${encodeURIComponent(lang)}&register=${encodeURIComponent(register)}`;\r\n        const url = this.usePublicEndpoints\r\n          ? `${this.apiUrl}/sdk/voice?${params}`\r\n          : `${this.apiUrl}/translations/${this.projectId}?${params}`; // JWT path doesn't have voice yet — return empty\r\n\r\n        const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\r\n        if (this.usePublicEndpoints) headers[\"x-api-key\"] = this.projectKey;\r\n        else if (this.apiToken) headers[\"Authorization\"] = `Bearer ${this.apiToken}`;\r\n\r\n        const response = await fetch(url, { headers });\r\n        if (!response.ok) {\r\n          // Soft-fail: voice data is optional, never block the app.\r\n          this.voiceCache[cacheKey] = {};\r\n          return this.voiceCache[cacheKey];\r\n        }\r\n        const json = await response.json();\r\n        // The /translations endpoint doesn't return a voice bundle; only /sdk/voice does.\r\n        // If the response shape doesn't match { ipa, ssml }, fall back to empty.\r\n        const data = json.data || json;\r\n        const looksLikeVoice =\r\n          data && typeof data === \"object\" &&\r\n          Object.values(data).every((v: any) => v && typeof v === \"object\" && \"ipa\" in v && \"ssml\" in v);\r\n        const bundle: Record<string, { ipa: string; ssml: string }> = looksLikeVoice ? data : {};\r\n        this.voiceCache[cacheKey] = bundle;\r\n        return bundle;\r\n      } finally {\r\n        delete this.voiceFetchPromises[cacheKey];\r\n      }\r\n    })();\r\n\r\n    this.voiceFetchPromises[cacheKey] = fetchPromise;\r\n    return fetchPromise;\r\n  }\r\n\r\n  /**\r\n   * Look up voice data for a key, walking the same fallback chain as\r\n   * `translate()` — register-then-language. Returns undefined if no voice\r\n   * bundle has been loaded for any matching (lang, register).\r\n   */\r\n  getVoice(\r\n    key: string,\r\n    lang: string,\r\n    register: Register = DEFAULT_REGISTER\r\n  ): { ipa: string; ssml: string } | undefined {\r\n    const chain = getFallbackChain(lang);\r\n    for (const fallbackLang of chain) {\r\n      for (const reg of registerFallback(register)) {\r\n        const bundle = this.voiceCache[bundleKey(fallbackLang, reg)];\r\n        if (bundle) {\r\n          const cell = ownVoice(bundle, key);\r\n          if (cell) return cell;\r\n        }\r\n      }\r\n    }\r\n    return undefined;\r\n  }\r\n\r\n  /**\r\n   * Preload voice data into the cache. Useful for SSR or bundling voice with\r\n   * the app. Accepts the same shape as the API response.\r\n   */\r\n  preloadVoice(\r\n    voice: Record<\r\n      string,\r\n      Partial<Record<Register, Record<string, { ipa: string; ssml: string }>>>\r\n    >\r\n  ): void {\r\n    for (const [lang, byRegister] of Object.entries(voice)) {\r\n      for (const [reg, bundle] of Object.entries(byRegister)) {\r\n        if (reg !== \"default\" && reg !== \"formal\" && reg !== \"casual\") continue;\r\n        if (!bundle) continue;\r\n        this.voiceCache[bundleKey(lang, reg as Register)] = bundle;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Fetch project info to get the list of supported languages.\r\n   * Throws on auth/network failure so the provider can surface the error.\r\n   */\r\n  async fetchProjectInfo(): Promise<string[]> {\r\n    const url = this.usePublicEndpoints\r\n      ? `${this.apiUrl}/sdk/project`\r\n      : `${this.apiUrl}/projects/${this.projectId}`;\r\n\r\n    const headers: Record<string, string> = {\r\n      \"Content-Type\": \"application/json\",\r\n    };\r\n\r\n    if (this.usePublicEndpoints) {\r\n      headers[\"x-api-key\"] = this.projectKey;\r\n    } else if (this.apiToken) {\r\n      headers[\"Authorization\"] = `Bearer ${this.apiToken}`;\r\n    }\r\n\r\n    let response: Response;\r\n    try {\r\n      response = await fetch(url, { headers });\r\n    } catch (networkError) {\r\n      // OFFLINE / network failure (not an HTTP error): fall back to the\r\n      // persisted language list so a cold start can still serve cached\r\n      // bundles. An HTTP-level rejection (e.g. a revoked key → 401) is a real\r\n      // error and still throws below — never masked by the cache.\r\n      const cached = this.readPersistedLangs();\r\n      if (cached && cached.length > 0) {\r\n        this.supportedLangs = cached;\r\n        return this.supportedLangs;\r\n      }\r\n      throw networkError;\r\n    }\r\n\r\n    if (!response.ok) {\r\n      const detail = await response.text().catch(() => \"\");\r\n      throw new Error(\r\n        `BhashaJS: failed to fetch project info (HTTP ${response.status})${detail ? \": \" + detail : \"\"}`\r\n      );\r\n    }\r\n\r\n    const json = await response.json();\r\n    const project = json.data || json;\r\n\r\n    this.supportedLangs = project.supportedLanguages || [];\r\n    this.writePersistedLangs(this.supportedLangs);\r\n    return this.supportedLangs;\r\n  }\r\n\r\n  /**\r\n   * THE CORE FUNCTION — Translate a key.\r\n   *\r\n   * How fallback works:\r\n   *   1. Try the requested (lang, register) bundle.\r\n   *   2. If empty, try the same lang at \"default\" register.\r\n   *   3. If still empty, walk the language fallback chain at \"default\".\r\n   * First match wins.\r\n   *\r\n   * PLURALIZATION:\r\n   * If params contains a \"count\" key, we automatically resolve the\r\n   * correct plural form using CLDR rules for the language.\r\n   *\r\n   * @param key - The translation key (e.g. \"hero.title\")\r\n   * @param lang - The current language code (e.g. \"bn\")\r\n   * @param register - The current register (\"default\" | \"formal\" | \"casual\")\r\n   * @param params - Optional interpolation values (e.g. { name: \"Rohan\" })\r\n   */\r\n  translate(\r\n    key: string,\r\n    lang: string,\r\n    register: Register = DEFAULT_REGISTER,\r\n    params?: Record<string, string | number>\r\n  ): string {\r\n    const chain = getFallbackChain(lang);\r\n    const hasCount = params != null && params.count !== undefined;\r\n    const count = hasCount ? Number(params.count) : 0;\r\n\r\n    let result: string | undefined;\r\n\r\n    // Walk: each fallback lang × [requested register, \"default\"].\r\n    // We try the same register across all langs first? No — if the user wants\r\n    // casual Hindi but only formal Hindi exists, falling back to formal Hindi\r\n    // is better than falling back to casual English. So per-lang we try\r\n    // [register, default], then move on.\r\n    //\r\n    // PLURALIZATION happens PER CELL, using each fallback language's OWN rule —\r\n    // not the requested language's. Otherwise a Hindi count=0 (category \"one\")\r\n    // that falls back to English would pick English's \"_one\" cell and render\r\n    // English's singular (\"0 item\") instead of its correct plural (\"0 items\").\r\n    // A language's own base key also wins over a fallback language's plural form.\r\n    outer: for (const fallbackLang of chain) {\r\n      for (const reg of registerFallback(register)) {\r\n        const langCache = this.cache[bundleKey(fallbackLang, reg)];\r\n        if (!langCache) continue;\r\n\r\n        if (hasCount) {\r\n          const category = getPluralCategory(count, fallbackLang);\r\n          const categoryValue = ownString(langCache, `${key}_${category}`);\r\n          if (categoryValue) {\r\n            result = categoryValue;\r\n            break outer;\r\n          }\r\n          const otherValue = category !== \"other\" ? ownString(langCache, `${key}_other`) : undefined;\r\n          if (otherValue) {\r\n            result = otherValue;\r\n            break outer;\r\n          }\r\n        }\r\n\r\n        const value = ownString(langCache, key);\r\n        if (value) {\r\n          result = value;\r\n          break outer;\r\n        }\r\n      }\r\n    }\r\n\r\n    // If nothing found in any fallback, return the key itself\r\n    if (!result) {\r\n      return key;\r\n    }\r\n\r\n    // Handle interpolation: replace {name} with actual values.\r\n    //\r\n    // We use a literal split/join rather than `String.replace(RegExp, value)`\r\n    // on purpose. The RegExp approach had two real bugs:\r\n    //   1. The param KEY was spliced raw into a RegExp source, so a key\r\n    //      containing a metacharacter (e.g. \"a(b\") threw a SyntaxError and\r\n    //      crashed the render; a key like \"a.b\" silently failed to match.\r\n    //   2. The param VALUE was used as the replacement string, so values\r\n    //      containing `$&`, `$1`, `` $` ``, `$$` were reinterpreted as\r\n    //      replacement patterns and silently corrupted the output.\r\n    // split(literal).join(literal) treats both key and value as plain text,\r\n    // fixing both at once and supporting arbitrary param keys.\r\n    if (params) {\r\n      for (const [paramKey, paramValue] of Object.entries(params)) {\r\n        result = result.split(`{${paramKey}}`).join(String(paramValue));\r\n      }\r\n    }\r\n\r\n    return result;\r\n  }\r\n\r\n}\r\n\r\n/** Within a single language, prefer the requested register but fall back to default. */\r\nfunction registerFallback(register: Register): Register[] {\r\n  return register === DEFAULT_REGISTER ? [DEFAULT_REGISTER] : [register, DEFAULT_REGISTER];\r\n}\r\n","// FILE: packages/sdk/src/utils/fonts.ts\r\n//\r\n// Dynamic font loading for South Asian scripts.\r\n//\r\n// WHY THIS EXISTS:\r\n// Hindi, Bengali, Tamil, etc. all use different scripts that need\r\n// different fonts. If you just render Hindi text with a standard\r\n// font like Arial, the conjunct characters (like क्ष or त्र) will\r\n// look broken or ugly.\r\n//\r\n// Most i18n tools leave this problem to the developer. BhashaJS\r\n// handles it automatically — when you switch to Hindi, we load\r\n// the right font in the background.\r\n//\r\n// HOW IT WORKS:\r\n// We inject a <link> tag into the <head> that loads the Google Font.\r\n// We track which fonts are already loaded so we never load the same\r\n// font twice. The fonts load async, so there's a brief flash of\r\n// unstyled text on first load, but after that it's cached by the browser.\r\n\r\nimport { FONT_URLS, getLangInfo } from \"./languages\";\r\n\r\n// Track which fonts have already been loaded\r\nconst loadedFonts = new Set<string>();\r\n\r\n/**\r\n * Load the appropriate Google Font for a language.\r\n * Does nothing if the font is already loaded.\r\n *\r\n * @param lang - Language code (e.g. \"hi\", \"bn\", \"ur\")\r\n */\r\nexport function loadFontForLang(lang: string): void {\r\n  // No-op during server-side rendering — there's no document to inject into.\r\n  // The font <link> is added on the client after hydration instead.\r\n  if (typeof document === \"undefined\") return;\r\n\r\n  const langInfo = getLangInfo(lang);\r\n  const fontFamily = langInfo.font.split(\",\")[0].trim();\r\n\r\n  // Skip if already loaded or if it's a generic system font\r\n  if (loadedFonts.has(fontFamily) || !FONT_URLS[fontFamily]) {\r\n    return;\r\n  }\r\n\r\n  // Create a <link> element and inject it into <head>\r\n  const link = document.createElement(\"link\");\r\n  link.rel = \"stylesheet\";\r\n  link.href = FONT_URLS[fontFamily];\r\n  link.crossOrigin = \"anonymous\";\r\n  document.head.appendChild(link);\r\n\r\n  // Mark as loaded so we don't do it again\r\n  loadedFonts.add(fontFamily);\r\n}\r\n\r\n/**\r\n * Preload fonts for multiple languages at once.\r\n * Call this at app startup if you know which languages you'll need.\r\n */\r\nexport function preloadFonts(langs: string[]): void {\r\n  for (const lang of langs) {\r\n    loadFontForLang(lang);\r\n  }\r\n}\r\n","// FILE: packages/sdk/src/utils/formatting.ts\r\n//\r\n// South Asian number, currency, and date formatting.\r\n//\r\n// WHY THIS EXISTS:\r\n// South Asia uses a different number grouping system than the West:\r\n//   Western:     1,234,567     (groups of 3)\r\n//   South Asian: 12,34,567     (first group of 3, then groups of 2)\r\n//\r\n// This is called the lakh/crore system:\r\n//   1,00,000 = 1 lakh (100 thousand)\r\n//   1,00,00,000 = 1 crore (10 million)\r\n//\r\n// Additionally, many South Asian scripts have their own digit glyphs:\r\n//   Hindi: ०१२३४५६७८९  Bengali: ০১২৩৪৫৬৭৮৯  Tamil: ௦௧௨௩௪௫௬௭௮௯\r\n//\r\n// The Intl.NumberFormat API supports both lakh/crore grouping and\r\n// native digits via locale extensions (-u-nu-deva for Devanagari).\r\n// We wrap it with a clean API that auto-detects the right settings.\r\n\r\nimport { NumberFormatOptions, CurrencyFormatOptions, DateFormatOptions } from \"../types\";\r\nimport { getLangInfo, resolveRegion } from \"./languages\";\r\n\r\n// ─── South Asian (lakh/crore) grouping ──────────────────────────────\r\n//\r\n// Intl groups hi-IN, bn-BD, ta-IN, en-IN, ne-NP correctly as 12,34,567,\r\n// but some South Asian locales (notably ur-PK for PKR and si-LK for LKR)\r\n// fall back to Western 3-digit grouping. Rather than trust each locale's\r\n// CLDR grouping, we reassemble the integer with explicit 2,2,3 grouping for\r\n// every supported South Asian locale. This is idempotent for the locales\r\n// Intl already gets right (it produces the identical string), so the result\r\n// is consistent across the whole language set.\r\n\r\nconst SOUTH_ASIAN_LANGS = new Set([\r\n  \"en\", \"hi\", \"bn\", \"ur\", \"ta\", \"te\", \"mr\", \"ne\", \"pa\", \"pa-PK\",\r\n  \"gu\", \"kn\", \"ml\", \"si\",\r\n  \"hi-Latn\", \"ne-Latn\", \"ur-Latn\", \"bn-Latn\", \"pa-Latn\",\r\n]);\r\n\r\nfunction needsSouthAsianGrouping(lang: string): boolean {\r\n  if (SOUTH_ASIAN_LANGS.has(lang)) return true;\r\n  return SOUTH_ASIAN_LANGS.has(lang.split(\"-\")[0]);\r\n}\r\n\r\n/** Regroup a bare digit string into South Asian 2,2,3 grouping. Operates on\r\n *  whatever digit glyphs are passed in (Latin or native), so it composes with\r\n *  the `-u-nu-<system>` locale extension. */\r\nfunction groupSouthAsian(digits: string, sep: string): string {\r\n  if (digits.length <= 3) return digits;\r\n  const last3 = digits.slice(-3);\r\n  let rest = digits.slice(0, -3);\r\n  const groups: string[] = [];\r\n  while (rest.length > 2) {\r\n    groups.unshift(rest.slice(-2));\r\n    rest = rest.slice(0, -2);\r\n  }\r\n  if (rest.length) groups.unshift(rest);\r\n  return groups.join(sep) + sep + last3;\r\n}\r\n\r\n/** Rebuild an Intl.NumberFormat parts array with South Asian integer grouping,\r\n *  preserving sign, currency symbol, decimals, and the original digit glyphs. */\r\nfunction reassembleSouthAsianGrouping(parts: Intl.NumberFormatPart[]): string {\r\n  let sep = \",\";\r\n  let intDigits = \"\";\r\n  for (const p of parts) {\r\n    if (p.type === \"integer\") intDigits += p.value;\r\n    else if (p.type === \"group\") sep = p.value;\r\n  }\r\n  const grouped = groupSouthAsian(intDigits, sep);\r\n\r\n  let out = \"\";\r\n  let mergedInteger = false;\r\n  for (const p of parts) {\r\n    if (p.type === \"integer\") {\r\n      if (!mergedInteger) {\r\n        out += grouped;\r\n        mergedInteger = true;\r\n      }\r\n      // subsequent integer parts are already folded into `grouped`\r\n    } else if (p.type === \"group\") {\r\n      // grouping handled above\r\n    } else {\r\n      out += p.value;\r\n    }\r\n  }\r\n  return out;\r\n}\r\n\r\n/**\r\n * Format a number using South Asian conventions.\r\n *\r\n * Uses lakh/crore grouping automatically for South Asian locales.\r\n * Supports native digit rendering and compact notation.\r\n *\r\n * @param value   - The number to format\r\n * @param lang    - Language code (e.g. \"hi\", \"bn\")\r\n * @param region  - Optional region override (e.g. \"IN\", \"BD\")\r\n * @param options - Formatting options\r\n *\r\n * @example\r\n * formatNumber(1234567, \"hi\")                          // → \"12,34,567\"\r\n * formatNumber(1234567, \"hi\", undefined, { useNativeDigits: true })  // → \"१२,३४,५६७\"\r\n * formatNumber(1234567, \"en\")                          // → \"12,34,567\" (en-IN uses lakh/crore)\r\n * formatNumber(1500000, \"hi\", undefined, { compact: true })          // → \"15 लाख\"\r\n */\r\nexport function formatNumber(\r\n  value: number,\r\n  lang: string,\r\n  region?: string,\r\n  options?: NumberFormatOptions\r\n): string {\r\n  const langInfo = getLangInfo(lang);\r\n  const { intlLocale } = resolveRegion(lang, region);\r\n\r\n  // Build the locale string. Force Latin digits unless the caller explicitly\r\n  // opts in via useNativeDigits — otherwise some locales (bn-BD, ta-IN) silently\r\n  // emit native digits even when the developer passed nothing about digits.\r\n  let locale = intlLocale;\r\n  if (options?.useNativeDigits && langInfo.numberingSystem !== \"latn\") {\r\n    locale = `${intlLocale}-u-nu-${langInfo.numberingSystem}`;\r\n  } else {\r\n    locale = `${intlLocale}-u-nu-latn`;\r\n  }\r\n\r\n  const intlOptions: Intl.NumberFormatOptions = {};\r\n\r\n  if (options?.compact) {\r\n    intlOptions.notation = \"compact\";\r\n    intlOptions.compactDisplay = \"long\";\r\n  }\r\n\r\n  try {\r\n    const nf = new Intl.NumberFormat(locale, intlOptions);\r\n    // Compact notation has no thousands grouping, so skip the reassembly.\r\n    if (!options?.compact && needsSouthAsianGrouping(lang)) {\r\n      return reassembleSouthAsianGrouping(nf.formatToParts(value));\r\n    }\r\n    return nf.format(value);\r\n  } catch {\r\n    // Fallback to basic formatting if Intl doesn't support the locale\r\n    return value.toLocaleString();\r\n  }\r\n}\r\n\r\n/**\r\n * Format a currency value with region-aware symbol and lakh/crore grouping.\r\n *\r\n * Auto-detects the correct currency from the language and region:\r\n * - Hindi (IN) → ₹   Bengali (BD) → ৳   Urdu (PK) → Rs\r\n * - Bengali (IN) → ₹  (with region override)\r\n *\r\n * @param value   - The amount to format\r\n * @param lang    - Language code (e.g. \"hi\", \"bn\")\r\n * @param region  - Optional region override\r\n * @param options - Formatting options\r\n *\r\n * @example\r\n * formatCurrency(1234567, \"hi\")                           // → \"₹12,34,567.00\"\r\n * formatCurrency(1234567, \"bn\")                           // → \"৳12,34,567.00\" (Bangladesh default)\r\n * formatCurrency(1234567, \"bn\", \"IN\")                     // → \"₹12,34,567.00\" (India override)\r\n * formatCurrency(1234567, \"hi\", undefined, { display: \"code\" })  // → \"INR 12,34,567.00\"\r\n */\r\nexport function formatCurrency(\r\n  value: number,\r\n  lang: string,\r\n  region?: string,\r\n  options?: CurrencyFormatOptions\r\n): string {\r\n  const langInfo = getLangInfo(lang);\r\n  const resolved = resolveRegion(lang, region);\r\n\r\n  // Use explicit currency or auto-detect from language + region\r\n  const currencyCode = options?.currency || resolved.currency;\r\n\r\n  // Build locale with optional native digits (default to latn for consistency).\r\n  let locale = resolved.intlLocale;\r\n  if (options?.useNativeDigits && langInfo.numberingSystem !== \"latn\") {\r\n    locale = `${resolved.intlLocale}-u-nu-${langInfo.numberingSystem}`;\r\n  } else {\r\n    locale = `${resolved.intlLocale}-u-nu-latn`;\r\n  }\r\n\r\n  const intlOptions: Intl.NumberFormatOptions = {\r\n    style: \"currency\",\r\n    currency: currencyCode,\r\n    currencyDisplay: options?.display || \"symbol\",\r\n  };\r\n\r\n  try {\r\n    const nf = new Intl.NumberFormat(locale, intlOptions);\r\n    if (needsSouthAsianGrouping(lang)) {\r\n      return reassembleSouthAsianGrouping(nf.formatToParts(value));\r\n    }\r\n    return nf.format(value);\r\n  } catch {\r\n    // Fallback: basic format with currency code\r\n    return `${currencyCode} ${value.toLocaleString()}`;\r\n  }\r\n}\r\n\r\n/**\r\n * Format a date using South Asian conventions.\r\n *\r\n * Defaults to DD/MM/YYYY (not the American MM/DD/YYYY).\r\n * Supports four presets and native digit rendering.\r\n *\r\n * @param date    - Date to format (Date object, ISO string, or timestamp)\r\n * @param lang    - Language code\r\n * @param region  - Optional region override\r\n * @param options - Formatting options\r\n *\r\n * @example\r\n * formatDate(new Date(\"2026-03-19\"), \"hi\")                        // → \"19 मार्च 2026\"\r\n * formatDate(new Date(\"2026-03-19\"), \"hi\", undefined, { preset: \"short\" })  // → \"19/3/26\"\r\n * formatDate(new Date(\"2026-03-19\"), \"hi\", undefined, { preset: \"full\" })   // → \"गुरुवार, 19 मार्च 2026\"\r\n * formatDate(new Date(\"2026-03-19\"), \"hi\", undefined, { useNativeDigits: true }) // → \"१९ मार्च २०२६\"\r\n */\r\nexport function formatDate(\r\n  date: Date | string | number,\r\n  lang: string,\r\n  region?: string,\r\n  options?: DateFormatOptions\r\n): string {\r\n  const langInfo = getLangInfo(lang);\r\n  const { intlLocale } = resolveRegion(lang, region);\r\n\r\n  // Normalize the date input\r\n  const dateObj = date instanceof Date ? date : new Date(date);\r\n\r\n  // Guard against invalid input. Without this, Intl renders the literal\r\n  // English string \"Invalid Date\" into every locale's UI — a jarring,\r\n  // untranslated failure. Return an empty string so the caller decides.\r\n  if (isNaN(dateObj.getTime())) {\r\n    return \"\";\r\n  }\r\n\r\n  // Build locale with optional native digits (default to latn for consistency).\r\n  let locale = intlLocale;\r\n  if (options?.useNativeDigits && langInfo.numberingSystem !== \"latn\") {\r\n    locale = `${intlLocale}-u-nu-${langInfo.numberingSystem}`;\r\n  } else {\r\n    locale = `${intlLocale}-u-nu-latn`;\r\n  }\r\n\r\n  // Map presets to Intl.DateTimeFormat options\r\n  const preset = options?.preset || \"medium\";\r\n  const intlOptions = DATE_PRESETS[preset];\r\n\r\n  try {\r\n    return new Intl.DateTimeFormat(locale, intlOptions).format(dateObj);\r\n  } catch {\r\n    // Fallback to ISO date\r\n    return dateObj.toLocaleDateString();\r\n  }\r\n}\r\n\r\n/**\r\n * Date format presets mapped to Intl.DateTimeFormat options.\r\n *\r\n * short:  19/03/26\r\n * medium: 19 Mar 2026\r\n * long:   19 March 2026\r\n * full:   Thursday, 19 March 2026\r\n */\r\nconst DATE_PRESETS: Record<string, Intl.DateTimeFormatOptions> = {\r\n  short: {\r\n    day: \"numeric\",\r\n    month: \"numeric\",\r\n    year: \"2-digit\",\r\n  },\r\n  medium: {\r\n    day: \"numeric\",\r\n    month: \"short\",\r\n    year: \"numeric\",\r\n  },\r\n  long: {\r\n    day: \"numeric\",\r\n    month: \"long\",\r\n    year: \"numeric\",\r\n  },\r\n  full: {\r\n    weekday: \"long\",\r\n    day: \"numeric\",\r\n    month: \"long\",\r\n    year: \"numeric\",\r\n  },\r\n};\r\n","// FILE: packages/sdk/src/core/store.ts\r\n//\r\n// BhashaStore — the framework-agnostic engine.\r\n//\r\n// The TranslationClient already has zero React dependency; BhashaStore adds the\r\n// small amount of *state* a UI needs (current language + register, loading,\r\n// supported languages) plus a subscribe/emit API. Any framework — vanilla JS,\r\n// Vue, Svelte, Solid, Angular, React Native — can drive its UI from this:\r\n//\r\n//   const store = new BhashaStore({ projectKey: \"bjs_...\" });\r\n//   await store.init();\r\n//   store.subscribe(() => render(store.t(\"hero.title\")));\r\n//   store.setLang(\"hi\");\r\n//\r\n// The React <I18nProvider> is one binding over this idea; this class makes the\r\n// same engine usable everywhere else. It is intentionally synchronous for reads\r\n// (t(), formatters) and async only for the network-touching switches.\r\n\r\nimport { TranslationClient } from \"./client\";\r\nimport { getLangInfo } from \"../utils/languages\";\r\nimport { loadFontForLang, preloadFonts } from \"../utils/fonts\";\r\nimport {\r\n  formatNumber as formatNumberUtil,\r\n  formatCurrency as formatCurrencyUtil,\r\n  formatDate as formatDateUtil,\r\n} from \"../utils/formatting\";\r\nimport type {\r\n  BhashaConfig,\r\n  Register,\r\n  BhashaKey,\r\n  NumberFormatOptions,\r\n  CurrencyFormatOptions,\r\n  DateFormatOptions,\r\n} from \"../types\";\r\n\r\nconst DEFAULT_API_URL = \"https://api.bhashajs.com/api\";\r\nconst DEFAULT_REGISTER: Register = \"default\";\r\n\r\nexport interface BhashaState {\r\n  /** Active language code (e.g. \"hi\", \"bn\", \"ne-Latn\"). */\r\n  lang: string;\r\n  /** Active register (\"default\" | \"formal\" | \"casual\"). */\r\n  register: Register;\r\n  /** Languages this project supports. */\r\n  supportedLangs: string[];\r\n  /** True while a (lang, register) bundle is being fetched. */\r\n  isLoading: boolean;\r\n  /** Error message from the last failed init/switch, or null. */\r\n  error: string | null;\r\n  /** Active user segment label, if set. */\r\n  segment?: string;\r\n}\r\n\r\nexport type Unsubscribe = () => void;\r\ntype Listener = (state: BhashaState) => void;\r\n\r\nfunction resolveInitialRegister(config: BhashaConfig): Register {\r\n  const { userSegment, segmentRules, register } = config;\r\n  if (userSegment && segmentRules && segmentRules[userSegment]) {\r\n    return segmentRules[userSegment];\r\n  }\r\n  return register || DEFAULT_REGISTER;\r\n}\r\n\r\n/** Apply lang/dir/font to the document. SSR-safe (no-op without a document). */\r\nfunction applyLangToDocument(lang: string): void {\r\n  if (typeof document === \"undefined\") return;\r\n  const info = getLangInfo(lang);\r\n  const html = document.documentElement;\r\n  html.setAttribute(\"lang\", lang);\r\n  html.setAttribute(\"dir\", info.dir);\r\n  html.style.setProperty(\"--bhasha-font\", info.font);\r\n}\r\n\r\nexport class BhashaStore {\r\n  private client: TranslationClient;\r\n  private state: BhashaState;\r\n  private listeners = new Set<Listener>();\r\n  private region?: string;\r\n  private voiceEnabled: boolean;\r\n  private segmentRules?: Record<string, Register>;\r\n  private applyDocument: boolean;\r\n  private onLanguageChange?: (lang: string) => void;\r\n\r\n  // A (lang, register) pair is ONE atomic locale target. Tracking the two\r\n  // dimensions with separate request counters let an interleaved\r\n  // setLang(\"hi\") + setRegister(\"formal\") commit the final state \"hi/formal\"\r\n  // while each call only ever fetched the pair it could *see* at call time\r\n  // (\"hi/default\" and \"en/formal\") — so the actually-committed \"hi/formal\"\r\n  // bundle was never loaded. We instead keep a single shared counter plus a\r\n  // pending target every switch writes BEFORE fetching; applyLocale() fetches\r\n  // the CURRENT pending pair and, if still the latest request, commits both\r\n  // dimensions together. Last-requested wins.\r\n  private localeReq = 0;\r\n  private pendingLang: string;\r\n  private pendingRegister: Register;\r\n\r\n  constructor(config: BhashaConfig & { applyDocument?: boolean } = {}) {\r\n    const {\r\n      projectId = \"\",\r\n      projectKey = \"\",\r\n      apiUrl = DEFAULT_API_URL,\r\n      apiToken = \"\",\r\n      persistCache = true,\r\n      region,\r\n      voice = false,\r\n      defaultLang = \"en\",\r\n      segmentRules,\r\n      userSegment,\r\n      preloadedTranslations,\r\n      onLanguageChange,\r\n      applyDocument = true,\r\n    } = config;\r\n\r\n    this.client = new TranslationClient(projectId, apiUrl, apiToken, projectKey, { persistCache });\r\n    if (preloadedTranslations) this.client.preload(preloadedTranslations);\r\n\r\n    this.region = region;\r\n    this.voiceEnabled = voice;\r\n    this.segmentRules = segmentRules;\r\n    this.applyDocument = applyDocument;\r\n    this.onLanguageChange = onLanguageChange;\r\n\r\n    const initialRegister = resolveInitialRegister(config);\r\n    this.state = {\r\n      lang: defaultLang,\r\n      register: initialRegister,\r\n      supportedLangs: preloadedTranslations ? Object.keys(preloadedTranslations) : [],\r\n      isLoading: true,\r\n      error: null,\r\n      segment: userSegment,\r\n    };\r\n\r\n    // The pending target starts equal to the committed locale; each switch\r\n    // updates it before driving applyLocale().\r\n    this.pendingLang = defaultLang;\r\n    this.pendingRegister = initialRegister;\r\n\r\n    if (preloadedTranslations) {\r\n      this.client.setSupportedLangs(this.state.supportedLangs);\r\n    }\r\n    this.client.setOnBundleUpdate(() => this.emit({}));\r\n  }\r\n\r\n  /** Current state snapshot. Returns a shallow copy so a consumer (or a\r\n   *  framework adapter) mutating it can't poison canonical state — all real\r\n   *  changes must go through `emit`. */\r\n  getState(): BhashaState {\r\n    return { ...this.state };\r\n  }\r\n\r\n  /** Escape hatch to the underlying client (cache, voice, preload). */\r\n  getClient(): TranslationClient {\r\n    return this.client;\r\n  }\r\n\r\n  /** Subscribe to state changes. Returns an unsubscribe function. */\r\n  subscribe(fn: Listener): Unsubscribe {\r\n    this.listeners.add(fn);\r\n    return () => {\r\n      this.listeners.delete(fn);\r\n    };\r\n  }\r\n\r\n  private emit(patch: Partial<BhashaState>): void {\r\n    this.state = { ...this.state, ...patch };\r\n    for (const fn of this.listeners) {\r\n      // Isolate subscribers: one throwing listener must not starve the rest or\r\n      // abort the emit (which would desync a multi-framework UI).\r\n      try {\r\n        fn(this.state);\r\n      } catch (e) {\r\n        console.error(\"[BhashaJS] a subscriber threw during emit:\", e);\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Fetch project info (unless preloaded) and the initial (lang, register)\r\n   * bundle. Call this exactly once, before any setLang/setRegister — init() is\r\n   * not request-guarded, so a switch racing the initial load is undefined.\r\n   */\r\n  async init(): Promise<void> {\r\n    this.emit({ isLoading: true, error: null });\r\n    try {\r\n      if (this.state.supportedLangs.length === 0) {\r\n        const langs = await this.client.fetchProjectInfo();\r\n        this.emit({ supportedLangs: langs });\r\n      }\r\n\r\n      const { lang, register } = this.state;\r\n      await this.client.fetchTranslations(lang, register);\r\n      if (lang !== \"en\") await this.client.fetchTranslations(\"en\", DEFAULT_REGISTER);\r\n      if (register !== DEFAULT_REGISTER) {\r\n        await this.client.fetchTranslations(lang, DEFAULT_REGISTER);\r\n      }\r\n      if (this.voiceEnabled) {\r\n        await this.client.fetchVoice(lang, register);\r\n        if (register !== DEFAULT_REGISTER) await this.client.fetchVoice(lang, DEFAULT_REGISTER);\r\n      }\r\n\r\n      preloadFonts(this.client.getSupportedLangs());\r\n      if (this.applyDocument) applyLangToDocument(lang);\r\n\r\n      this.emit({ isLoading: false });\r\n    } catch (e: any) {\r\n      this.emit({ isLoading: false, error: e?.message || \"Failed to initialize BhashaJS\" });\r\n    }\r\n  }\r\n\r\n  /** Translate a key in the current (lang, register). */\r\n  t(key: BhashaKey, params?: Record<string, string | number>): string {\r\n    return this.client.translate(key as string, this.state.lang, this.state.register, params);\r\n  }\r\n\r\n  /**\r\n   * Fetch and commit the CURRENT pending (lang, register) target atomically.\r\n   *\r\n   * Every switch sets `pendingLang`/`pendingRegister` first, then calls this.\r\n   * We snapshot the pending pair, fetch THAT exact bundle (+ the English and\r\n   * default-register fallbacks + voice), and — guarded by the single shared\r\n   * counter — commit both dimensions together. Because the snapshot is taken\r\n   * from the pending target (not committed state), an interleaved\r\n   * setLang+setRegister fetches the real final pair, never a stale half-state.\r\n   * Last-requested wins; superseded requests bail without touching state.\r\n   */\r\n  private async applyLocale(): Promise<void> {\r\n    const reqId = ++this.localeReq;\r\n    const targetLang = this.pendingLang;\r\n    const targetRegister = this.pendingRegister;\r\n\r\n    this.emit({ isLoading: true, error: null });\r\n\r\n    try {\r\n      await this.client.fetchTranslations(targetLang, targetRegister);\r\n      if (targetLang !== \"en\") {\r\n        await this.client.fetchTranslations(\"en\", DEFAULT_REGISTER);\r\n      }\r\n      if (targetRegister !== DEFAULT_REGISTER) {\r\n        await this.client.fetchTranslations(targetLang, DEFAULT_REGISTER);\r\n      }\r\n      if (this.voiceEnabled) {\r\n        await this.client.fetchVoice(targetLang, targetRegister);\r\n        if (targetRegister !== DEFAULT_REGISTER) {\r\n          await this.client.fetchVoice(targetLang, DEFAULT_REGISTER);\r\n        }\r\n      }\r\n    } catch (e: any) {\r\n      // A failed switch must surface an error and clear loading instead of\r\n      // wedging isLoading:true forever (and it must not reject — these are\r\n      // commonly called un-awaited). If a newer switch superseded us, let it\r\n      // own the final state.\r\n      if (reqId !== this.localeReq) return;\r\n      // Roll the pending target back to the committed locale so an identical\r\n      // retry isn't short-circuited by the equality guard in the setters.\r\n      this.pendingLang = this.state.lang;\r\n      this.pendingRegister = this.state.register;\r\n      this.emit({\r\n        isLoading: false,\r\n        error: e?.message || `Failed to load locale \"${targetLang}/${targetRegister}\"`,\r\n      });\r\n      return;\r\n    }\r\n\r\n    if (reqId !== this.localeReq) return; // superseded by a newer switch\r\n\r\n    const langChanged = targetLang !== this.state.lang;\r\n    if (this.applyDocument && langChanged) {\r\n      loadFontForLang(targetLang);\r\n      applyLangToDocument(targetLang);\r\n    }\r\n    this.emit({ lang: targetLang, register: targetRegister, isLoading: false, error: null });\r\n    if (langChanged) this.onLanguageChange?.(targetLang);\r\n  }\r\n\r\n  /** Switch language. Updates the pending target, then applies the locale. */\r\n  async setLang(newLang: string): Promise<void> {\r\n    if (newLang === this.pendingLang) return;\r\n    this.pendingLang = newLang;\r\n    await this.applyLocale();\r\n  }\r\n\r\n  /** Switch register. Updates the pending target, then applies the locale. */\r\n  async setRegister(newRegister: Register): Promise<void> {\r\n    if (newRegister === this.pendingRegister) return;\r\n    this.pendingRegister = newRegister;\r\n    await this.applyLocale();\r\n  }\r\n\r\n  /** Set the user segment; flips register (via the same atomic path) if a\r\n   *  segmentRule matches. */\r\n  async setSegment(newSegment: string): Promise<void> {\r\n    this.emit({ segment: newSegment });\r\n    const mapped = this.segmentRules?.[newSegment];\r\n    if (mapped && mapped !== this.pendingRegister) {\r\n      await this.setRegister(mapped);\r\n    }\r\n  }\r\n\r\n  // ─── Formatters (pure, synchronous) ────────────────────────────\r\n  formatNumber(value: number, options?: NumberFormatOptions): string {\r\n    return formatNumberUtil(value, this.state.lang, this.region, options);\r\n  }\r\n  formatCurrency(value: number, options?: CurrencyFormatOptions): string {\r\n    return formatCurrencyUtil(value, this.state.lang, this.region, options);\r\n  }\r\n  formatDate(date: Date | string | number, options?: DateFormatOptions): string {\r\n    return formatDateUtil(date, this.state.lang, this.region, options);\r\n  }\r\n\r\n  // ─── Voice (synchronous reads of the lazily-fetched voice cache) ─\r\n  formatPhonetic(key: string): string {\r\n    return this.client.getVoice(key, this.state.lang, this.state.register)?.ipa || \"\";\r\n  }\r\n  formatSSML(key: string): string {\r\n    return this.client.getVoice(key, this.state.lang, this.state.register)?.ssml || \"\";\r\n  }\r\n}\r\n\r\n/** Convenience: construct a store and run init() before resolving. */\r\nexport async function createBhashaStore(\r\n  config: BhashaConfig & { applyDocument?: boolean } = {}\r\n): Promise<BhashaStore> {\r\n  const store = new BhashaStore(config);\r\n  await store.init();\r\n  return store;\r\n}\r\n"],"mappings":"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","names":["DEFAULT_REGISTER"]}