{"version":3,"file":"content.es.mjs","names":[],"sources":["../src/content/detectEditorLanguage.ts","../src/content/detectPreviewLanguage.ts","../src/content/resolveActiveLanguage.ts","../src/content/resolveLocalizedContent.ts"],"sourcesContent":["/**\n * Reads the active language from the Staffbase editor's selected language tab\n * (`[aria-selected=\"true\"]` with a `data-testid` suffixed by the language code).\n * Returns null when no tab is active or there is no DOM, so callers can fall back.\n * @returns {string | null} The detected editor language, or null.\n */\nexport const detectEditorLanguage = (): string | null => {\n  if (typeof document === 'undefined') return null\n\n  const activeTab = document.querySelector('[aria-selected=\"true\"]')\n  const testId = activeTab?.getAttribute('data-testid')\n\n  return testId?.split('-').pop() ?? null\n}\n","/**\n * Reads the `language` URL parameter the Staffbase preview shell exposes on\n * `window.App._urlParameters`. Returns null when the shell or parameter is\n * absent (or there is no DOM), so callers can fall back.\n * @returns {string | null} The preview language, or null.\n */\nexport const detectPreviewLanguage = (): string | null => {\n  if (typeof window === 'undefined') return null\n\n  const appConfig = (window as { App?: { _urlParameters?: string } }).App\n    ?._urlParameters\n  if (!appConfig) return null\n\n  return new URLSearchParams(appConfig).get('language')\n}\n","import type { ResolveLocalizedContentOptions } from '../types/content/ResolveLocalizedContentOptions'\nimport { detectEditorLanguage } from './detectEditorLanguage'\nimport { detectPreviewLanguage } from './detectPreviewLanguage'\n\n/**\n * Resolves the language to render content in.\n *\n * Editor path: the selected language tab wins. Runtime path: the explicit\n * `contentLanguage` is trusted first so the article language matches the rest of\n * the UI, with preview-URL sniffing only as a fallback. Both paths fall back to\n * `contentLanguage ?? defaultLanguage`.\n * @param {ResolveLocalizedContentOptions} options - The resolution options.\n * @returns {string} The resolved active language code.\n */\nexport const resolveActiveLanguage = (\n  options: ResolveLocalizedContentOptions,\n): string => {\n  const { contentLanguage, defaultLanguage, isEditor } = options\n  const fallback = contentLanguage ?? defaultLanguage\n\n  if (isEditor) return detectEditorLanguage() ?? fallback\n\n  return contentLanguage ?? detectPreviewLanguage() ?? fallback\n}\n","import type { LocalizedContent } from '../types/content/LocalizedContent'\nimport type { ResolveLocalizedContentOptions } from '../types/content/ResolveLocalizedContentOptions'\nimport { resolveActiveLanguage } from './resolveActiveLanguage'\n\n/**\n * Selects and field-merges the localized article content for the active language.\n *\n * Resolves the active language (see resolveActiveLanguage), picks that language's\n * content (falling back to the default language), then fills each field from the\n * default-language entry when the active one is empty. Returns null and reports\n * via `onError` when contents are missing or unavailable in both languages.\n * @param {Record<string, LocalizedContent> | undefined} contents - The article's per-language contents.\n * @param {ResolveLocalizedContentOptions} options - Language and diagnostics options.\n * @returns {LocalizedContent | null} The merged localized content, or null.\n */\nexport const resolveLocalizedContent = (\n  contents: Record<string, LocalizedContent> | undefined,\n  options: ResolveLocalizedContentOptions,\n): LocalizedContent | null => {\n  const { defaultLanguage, onError } = options\n\n  if (!contents) {\n    onError?.('Invalid article data or missing contents')\n    return null\n  }\n\n  const language = resolveActiveLanguage(options)\n  const localized = contents[language] || contents[defaultLanguage] || null\n\n  if (!localized) {\n    onError?.(\n      `Content unavailable for language: ${language} or fallback: ${defaultLanguage}`,\n    )\n    return null\n  }\n\n  const fallback = contents[defaultLanguage]\n\n  return {\n    title: localized.title || fallback?.title || '',\n    teaser: localized.teaser || fallback?.teaser || '',\n    content: localized.content || fallback?.content || '',\n    image: localized.image || fallback?.image || '',\n    feedImage: localized.feedImage || fallback?.feedImage || '',\n  }\n}\n"],"mappings":";AAMA,IAAa,UACP,OAAO,WAAa,MAAoB,QAE1B,SAAS,cAAc,0BAC1B,GAAW,aAAa,aAAa,IAErC,MAAM,GAAG,EAAE,IAAI,KAAK,MCNxB,UAA6C;CACxD,IAAI,OAAO,SAAW,KAAa,OAAO;CAE1C,IAAM,IAAa,OAAiD,KAChE;CAGJ,OAFK,IAEE,IAAI,gBAAgB,CAAS,EAAE,IAAI,UAAU,IAF7B;AAGzB,GCAa,KACX,MACW;CACX,IAAM,EAAE,oBAAiB,oBAAiB,gBAAa,GACjD,IAAW,KAAmB;CAIpC,OAFI,IAAiB,EAAqB,KAAK,IAExC,KAAmB,EAAsB,KAAK;AACvD,GCRa,KACX,GACA,MAC4B;CAC5B,IAAM,EAAE,oBAAiB,eAAY;CAErC,IAAI,CAAC,GAEH,OADA,IAAU,0CAA0C,GAC7C;CAGT,IAAM,IAAW,EAAsB,CAAO,GACxC,IAAY,EAAS,MAAa,EAAS,MAAoB;CAErE,IAAI,CAAC,GAIH,OAHA,IACE,qCAAqC,EAAS,gBAAgB,GAChE,GACO;CAGT,IAAM,IAAW,EAAS;CAE1B,OAAO;EACL,OAAO,EAAU,SAAS,GAAU,SAAS;EAC7C,QAAQ,EAAU,UAAU,GAAU,UAAU;EAChD,SAAS,EAAU,WAAW,GAAU,WAAW;EACnD,OAAO,EAAU,SAAS,GAAU,SAAS;EAC7C,WAAW,EAAU,aAAa,GAAU,aAAa;CAC3D;AACF"}