{"version":3,"file":"static-dict-adapter-BCgoKiVT.cjs","names":[],"sources":["../../../platform/i18n/src/locale-context.tsx","../../../platform/i18n/src/use-domain-dict.ts","../../../platform/i18n/src/translations.ts","../../../platform/i18n/src/static-dict-adapter.ts"],"sourcesContent":["import { createContext, type ReactNode, use, useMemo, useState } from \"react\";\n\ninterface LocaleContextValue {\n  locale: string;\n  setLocale: (locale: string) => void;\n}\n\nconst LocaleCtx = createContext<LocaleContextValue | null>(null);\n\nexport function LocaleProvider({\n  initialLocale,\n  onLocaleChange,\n  children,\n}: {\n  initialLocale: string;\n  onLocaleChange?: (locale: string) => void;\n  children: ReactNode;\n}): React.JSX.Element {\n  const [locale, setLocaleState] = useState(initialLocale);\n\n  const value = useMemo<LocaleContextValue>(\n    () => ({\n      locale,\n      setLocale(next) {\n        setLocaleState(next);\n        onLocaleChange?.(next);\n      },\n    }),\n    [locale, onLocaleChange],\n  );\n\n  return <LocaleCtx.Provider value={value}>{children}</LocaleCtx.Provider>;\n}\n\nexport function useActiveLocale(): LocaleContextValue {\n  const value = use(LocaleCtx);\n  if (!value) {\n    throw new Error(\"useActiveLocale must be used within a LocaleProvider\");\n  }\n  return value;\n}\n","import { useEffect, useState } from \"react\";\nimport type { DomainTranslations } from \"./translations\";\n\nexport function useDomainDict<D extends Record<string, string>>(\n  domain: DomainTranslations<D>,\n  locale: string,\n): D {\n  const [dict, setDict] = useState<D>(\n    () => domain.getCached(locale) ?? domain.fallback,\n  );\n\n  useEffect(() => {\n    let cancelled = false;\n    if (locale === domain.fallbackLocale) {\n      setDict(domain.fallback);\n      return;\n    }\n    const cached = domain.getCached(locale);\n    if (cached) {\n      setDict(cached);\n      return;\n    }\n    domain\n      .load(locale)\n      .then((next) => {\n        if (!cancelled) setDict(next);\n      })\n      .catch(() => {\n        if (!cancelled) setDict(domain.fallback);\n      });\n    return () => {\n      cancelled = true;\n    };\n  }, [domain, locale]);\n\n  return dict;\n}\n","export interface DomainTranslations<D extends Record<string, string>> {\n  fallback: D;\n  fallbackLocale: string;\n  load(locale: string): Promise<D>;\n  getCached(locale: string): D | null;\n}\n\nexport function createDomainTranslations<\n  D extends Record<string, string>,\n>(config: {\n  fallback: D;\n  fallbackLocale?: string;\n  loaders?: Record<string, () => Promise<Partial<D>>>;\n}): DomainTranslations<D> {\n  const fallbackLocale = config.fallbackLocale ?? \"en\";\n  const cache = new Map<string, D>();\n  return {\n    fallback: config.fallback,\n    fallbackLocale,\n    getCached(locale) {\n      if (locale === fallbackLocale) return config.fallback;\n      return cache.get(locale) ?? null;\n    },\n    async load(locale) {\n      if (locale === fallbackLocale) return config.fallback;\n      const cached = cache.get(locale);\n      if (cached) return cached;\n      const loader = config.loaders?.[locale];\n      if (!loader) return config.fallback;\n      const target = await loader();\n      const merged = { ...config.fallback, ...target } as D;\n      cache.set(locale, merged);\n      return merged;\n    },\n  };\n}\n","import type { TranslationApi } from \"./translation-api\";\nimport type { ParamsOf } from \"./params-of\";\n\nexport function createStaticDictAdapter<D extends Record<string, string>>(\n  locale: string,\n  dict: D,\n): TranslationApi<D> {\n  return {\n    locale,\n    t<K extends keyof D & string>(\n      key: K,\n      ...args: ParamsOf<D[K]> extends void ? [] : [params: ParamsOf<D[K]>]\n    ): string {\n      const template = dict[key] ?? key;\n      const params = args[0] as Record<string, string | number> | undefined;\n      if (!params) return template;\n      // Single regex pass to prevent re-interpolation of placeholder values\n      return template.replace(/\\{\\{(\\w+)\\}\\}/g, (match, name: string) =>\n        name in params ? String(params[name]) : match,\n      );\n    },\n  };\n}\n"],"mappings":";;;;AAOA,MAAM,aAAA,GAAA,MAAA,eAAqD,KAAK;AAEhE,SAAgB,eAAe,EAC7B,eACA,gBACA,YAKoB;CACpB,MAAM,CAAC,QAAQ,mBAAA,GAAA,MAAA,UAA2B,cAAc;CAExD,MAAM,SAAA,GAAA,MAAA,gBACG;EACL;EACA,UAAU,MAAM;AACd,kBAAe,KAAK;AACpB,oBAAiB,KAAK;;EAEzB,GACD,CAAC,QAAQ,eAAe,CACzB;AAED,QAAO,iBAAA,GAAA,kBAAA,KAAC,UAAU,UAAX;EAA2B;EAAQ;EAA8B,CAAA;;AAG1E,SAAgB,kBAAsC;CACpD,MAAM,SAAA,GAAA,MAAA,KAAY,UAAU;AAC5B,KAAI,CAAC,MACH,OAAM,IAAI,MAAM,uDAAuD;AAEzE,QAAO;;;;ACpCT,SAAgB,cACd,QACA,QACG;CACH,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,gBACL,OAAO,UAAU,OAAO,IAAI,OAAO,SAC1C;AAED,EAAA,GAAA,MAAA,iBAAgB;EACd,IAAI,YAAY;AAChB,MAAI,WAAW,OAAO,gBAAgB;AACpC,WAAQ,OAAO,SAAS;AACxB;;EAEF,MAAM,SAAS,OAAO,UAAU,OAAO;AACvC,MAAI,QAAQ;AACV,WAAQ,OAAO;AACf;;AAEF,SACG,KAAK,OAAO,CACZ,MAAM,SAAS;AACd,OAAI,CAAC,UAAW,SAAQ,KAAK;IAC7B,CACD,YAAY;AACX,OAAI,CAAC,UAAW,SAAQ,OAAO,SAAS;IACxC;AACJ,eAAa;AACX,eAAY;;IAEb,CAAC,QAAQ,OAAO,CAAC;AAEpB,QAAO;;;;AC5BT,SAAgB,yBAEd,QAIwB;CACxB,MAAM,iBAAiB,OAAO,kBAAkB;CAChD,MAAM,wBAAQ,IAAI,KAAgB;AAClC,QAAO;EACL,UAAU,OAAO;EACjB;EACA,UAAU,QAAQ;AAChB,OAAI,WAAW,eAAgB,QAAO,OAAO;AAC7C,UAAO,MAAM,IAAI,OAAO,IAAI;;EAE9B,MAAM,KAAK,QAAQ;AACjB,OAAI,WAAW,eAAgB,QAAO,OAAO;GAC7C,MAAM,SAAS,MAAM,IAAI,OAAO;AAChC,OAAI,OAAQ,QAAO;GACnB,MAAM,SAAS,OAAO,UAAU;AAChC,OAAI,CAAC,OAAQ,QAAO,OAAO;GAC3B,MAAM,SAAS,MAAM,QAAQ;GAC7B,MAAM,SAAS;IAAE,GAAG,OAAO;IAAU,GAAG;IAAQ;AAChD,SAAM,IAAI,QAAQ,OAAO;AACzB,UAAO;;EAEV;;;;AC/BH,SAAgB,wBACd,QACA,MACmB;AACnB,QAAO;EACL;EACA,EACE,KACA,GAAG,MACK;GACR,MAAM,WAAW,KAAK,QAAQ;GAC9B,MAAM,SAAS,KAAK;AACpB,OAAI,CAAC,OAAQ,QAAO;AAEpB,UAAO,SAAS,QAAQ,mBAAmB,OAAO,SAChD,QAAQ,SAAS,OAAO,OAAO,MAAM,GAAG,MACzC;;EAEJ"}