@roastcodes/ttdash 6.1.6 → 6.1.8
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.
- package/README.md +63 -1
- package/dist/assets/CustomTooltip-BxopDd3O.js +1 -0
- package/dist/assets/{DrillDownModal-BKuxN4GY.js → DrillDownModal-B7ZU15xQ.js} +1 -1
- package/dist/assets/index-DDw3UUhU.js +4 -0
- package/dist/assets/{index-TppJ6Iqj.css → index-g2F-z39N.css} +1 -1
- package/dist/index.html +3 -3
- package/package.json +3 -2
- package/src/locales/de/common.json +9 -1
- package/src/locales/en/common.json +9 -1
- package/dist/assets/CustomTooltip-DBPq6A_5.js +0 -1
- package/dist/assets/index-D8uaHhGW.js +0 -4
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./rolldown-runtime-COnpUsM8.js";import{w as t}from"./charts-vendor-CiBqdKXh.js";import{r as n}from"./motion-vendor-BXI2L__C.js";import{C as r,S as i,b as a,x as o}from"./ui-vendor-BGjRFQGY.js";import{l as s,o as c}from"./dialog-Cn1m7WhC.js";var l=e(t()),u=n(),d=o,f=i,p=r,m=l.forwardRef(({className:e,sideOffset:t=4,...n},r)=>(0,u.jsx)(a,{ref:r,sideOffset:t,className:s(`z-50 overflow-hidden rounded-lg bg-popover/90 backdrop-blur-xl px-3 py-1.5 text-xs text-popover-foreground border border-border/50 shadow-lg shadow-black/10 animate-in fade-in-0 zoom-in-95 duration-200`,e),...n}));m.displayName=`TooltipContent`;var h=e=>typeof e==`string`,g=()=>{let e,t,n=new Promise((n,r)=>{e=n,t=r});return n.resolve=e,n.reject=t,n},_=e=>e==null?``:String(e),v=(e,t,n)=>{e.forEach(e=>{t[e]&&(n[e]=t[e])})},y=/###/g,b=e=>e&&e.includes(`###`)?e.replace(y,`.`):e,x=e=>!e||h(e),S=(e,t,n)=>{let r=h(t)?t.split(`.`):t,i=0;for(;i<r.length-1;){if(x(e))return{};let t=b(r[i]);!e[t]&&n&&(e[t]=new n),e=Object.prototype.hasOwnProperty.call(e,t)?e[t]:{},++i}return x(e)?{}:{obj:e,k:b(r[i])}},C=(e,t,n)=>{let{obj:r,k:i}=S(e,t,Object);if(r!==void 0||t.length===1){r[i]=n;return}let a=t[t.length-1],o=t.slice(0,t.length-1),s=S(e,o,Object);for(;s.obj===void 0&&o.length;)a=`${o[o.length-1]}.${a}`,o=o.slice(0,o.length-1),s=S(e,o,Object),s?.obj&&s.obj[`${s.k}.${a}`]!==void 0&&(s.obj=void 0);s.obj[`${s.k}.${a}`]=n},w=(e,t,n,r)=>{let{obj:i,k:a}=S(e,t,Object);i[a]=i[a]||[],i[a].push(n)},T=(e,t)=>{let{obj:n,k:r}=S(e,t);if(n&&Object.prototype.hasOwnProperty.call(n,r))return n[r]},E=(e,t,n)=>{let r=T(e,n);return r===void 0?T(t,n):r},D=(e,t,n)=>{for(let r in t)r!==`__proto__`&&r!==`constructor`&&(r in e?h(e[r])||e[r]instanceof String||h(t[r])||t[r]instanceof String?n&&(e[r]=t[r]):D(e[r],t[r],n):e[r]=t[r]);return e},O=e=>e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,`\\$&`),k={"&":`&`,"<":`<`,">":`>`,'"':`"`,"'":`'`,"/":`/`},ee=e=>h(e)?e.replace(/[&<>"'\/]/g,e=>k[e]):e,te=class{constructor(e){this.capacity=e,this.regExpMap=new Map,this.regExpQueue=[]}getRegExp(e){let t=this.regExpMap.get(e);if(t!==void 0)return t;let n=new RegExp(e);return this.regExpQueue.length===this.capacity&&this.regExpMap.delete(this.regExpQueue.shift()),this.regExpMap.set(e,n),this.regExpQueue.push(e),n}},ne=[` `,`,`,`?`,`!`,`;`],re=new te(20),ie=(e,t,n)=>{t||=``,n||=``;let r=ne.filter(e=>!t.includes(e)&&!n.includes(e));if(r.length===0)return!0;let i=re.getRegExp(`(${r.map(e=>e===`?`?`\\?`:e).join(`|`)})`),a=!i.test(e);if(!a){let t=e.indexOf(n);t>0&&!i.test(e.substring(0,t))&&(a=!0)}return a},A=(e,t,n=`.`)=>{if(!e)return;if(e[t])return Object.prototype.hasOwnProperty.call(e,t)?e[t]:void 0;let r=t.split(n),i=e;for(let e=0;e<r.length;){if(!i||typeof i!=`object`)return;let t,a=``;for(let o=e;o<r.length;++o)if(o!==e&&(a+=n),a+=r[o],t=i[a],t!==void 0){if([`string`,`number`,`boolean`].includes(typeof t)&&o<r.length-1)continue;e+=o-e+1;break}i=t}return i},j=e=>e?.replace(/_/g,`-`),ae={type:`logger`,log(e){this.output(`log`,e)},warn(e){this.output(`warn`,e)},error(e){this.output(`error`,e)},output(e,t){console?.[e]?.apply?.(console,t)}},M=new class e{constructor(e,t={}){this.init(e,t)}init(e,t={}){this.prefix=t.prefix||`i18next:`,this.logger=e||ae,this.options=t,this.debug=t.debug}log(...e){return this.forward(e,`log`,``,!0)}warn(...e){return this.forward(e,`warn`,``,!0)}error(...e){return this.forward(e,`error`,``)}deprecate(...e){return this.forward(e,`warn`,`WARNING DEPRECATED: `,!0)}forward(e,t,n,r){return r&&!this.debug?null:(h(e[0])&&(e[0]=`${n}${this.prefix} ${e[0]}`),this.logger[t](e))}create(t){return new e(this.logger,{prefix:`${this.prefix}:${t}:`,...this.options})}clone(t){return t||=this.options,t.prefix=t.prefix||this.prefix,new e(this.logger,t)}},N=class{constructor(){this.observers={}}on(e,t){return e.split(` `).forEach(e=>{this.observers[e]||(this.observers[e]=new Map);let n=this.observers[e].get(t)||0;this.observers[e].set(t,n+1)}),this}off(e,t){if(this.observers[e]){if(!t){delete this.observers[e];return}this.observers[e].delete(t)}}once(e,t){let n=(...r)=>{t(...r),this.off(e,n)};return this.on(e,n),this}emit(e,...t){this.observers[e]&&Array.from(this.observers[e].entries()).forEach(([e,n])=>{for(let r=0;r<n;r++)e(...t)}),this.observers[`*`]&&Array.from(this.observers[`*`].entries()).forEach(([n,r])=>{for(let i=0;i<r;i++)n(e,...t)})}},oe=class extends N{constructor(e,t={ns:[`translation`],defaultNS:`translation`}){super(),this.data=e||{},this.options=t,this.options.keySeparator===void 0&&(this.options.keySeparator=`.`),this.options.ignoreJSONStructure===void 0&&(this.options.ignoreJSONStructure=!0)}addNamespaces(e){this.options.ns.includes(e)||this.options.ns.push(e)}removeNamespaces(e){let t=this.options.ns.indexOf(e);t>-1&&this.options.ns.splice(t,1)}getResource(e,t,n,r={}){let i=r.keySeparator===void 0?this.options.keySeparator:r.keySeparator,a=r.ignoreJSONStructure===void 0?this.options.ignoreJSONStructure:r.ignoreJSONStructure,o;e.includes(`.`)?o=e.split(`.`):(o=[e,t],n&&(Array.isArray(n)?o.push(...n):h(n)&&i?o.push(...n.split(i)):o.push(n)));let s=T(this.data,o);return!s&&!t&&!n&&e.includes(`.`)&&(e=o[0],t=o[1],n=o.slice(2).join(`.`)),s||!a||!h(n)?s:A(this.data?.[e]?.[t],n,i)}addResource(e,t,n,r,i={silent:!1}){let a=i.keySeparator===void 0?this.options.keySeparator:i.keySeparator,o=[e,t];n&&(o=o.concat(a?n.split(a):n)),e.includes(`.`)&&(o=e.split(`.`),r=t,t=o[1]),this.addNamespaces(t),C(this.data,o,r),i.silent||this.emit(`added`,e,t,n,r)}addResources(e,t,n,r={silent:!1}){for(let r in n)(h(n[r])||Array.isArray(n[r]))&&this.addResource(e,t,r,n[r],{silent:!0});r.silent||this.emit(`added`,e,t,n)}addResourceBundle(e,t,n,r,i,a={silent:!1,skipCopy:!1}){let o=[e,t];e.includes(`.`)&&(o=e.split(`.`),r=n,n=t,t=o[1]),this.addNamespaces(t);let s=T(this.data,o)||{};a.skipCopy||(n=JSON.parse(JSON.stringify(n))),r?D(s,n,i):s={...s,...n},C(this.data,o,s),a.silent||this.emit(`added`,e,t,n)}removeResourceBundle(e,t){this.hasResourceBundle(e,t)&&delete this.data[e][t],this.removeNamespaces(t),this.emit(`removed`,e,t)}hasResourceBundle(e,t){return this.getResource(e,t)!==void 0}getResourceBundle(e,t){return t||=this.options.defaultNS,this.getResource(e,t)}getDataByLanguage(e){return this.data[e]}hasLanguageSomeTranslations(e){let t=this.getDataByLanguage(e);return!!(t&&Object.keys(t)||[]).find(e=>t[e]&&Object.keys(t[e]).length>0)}toJSON(){return this.data}},se={processors:{},addPostProcessor(e){this.processors[e.name]=e},handle(e,t,n,r,i){return e.forEach(e=>{t=this.processors[e]?.process(t,n,r,i)??t}),t}},P=Symbol(`i18next/PATH_KEY`);function ce(){let e=[],t=Object.create(null),n;return t.get=(r,i)=>(n?.revoke?.(),i===P?e:(e.push(i),n=Proxy.revocable(r,t),n.proxy)),Proxy.revocable(Object.create(null),t).proxy}function F(e,t){let{[P]:n}=e(ce()),r=t?.keySeparator??`.`,i=t?.nsSeparator??`:`;if(n.length>1&&i){let e=t?.ns,a=Array.isArray(e)?e:null;if(a&&a.length>1&&a.slice(1).includes(n[0]))return`${n[0]}${i}${n.slice(1).join(r)}`}return n.join(r)}var I=e=>!h(e)&&typeof e!=`boolean`&&typeof e!=`number`,L=class e extends N{constructor(e,t={}){super(),v([`resourceStore`,`languageUtils`,`pluralResolver`,`interpolator`,`backendConnector`,`i18nFormat`,`utils`],e,this),this.options=t,this.options.keySeparator===void 0&&(this.options.keySeparator=`.`),this.logger=M.create(`translator`),this.checkedLoadedFor={}}changeLanguage(e){e&&(this.language=e)}exists(e,t={interpolation:{}}){let n={...t};if(e==null)return!1;let r=this.resolve(e,n);if(r?.res===void 0)return!1;let i=I(r.res);return!(n.returnObjects===!1&&i)}extractFromKey(e,t){let n=t.nsSeparator===void 0?this.options.nsSeparator:t.nsSeparator;n===void 0&&(n=`:`);let r=t.keySeparator===void 0?this.options.keySeparator:t.keySeparator,i=t.ns||this.options.defaultNS||[],a=n&&e.includes(n),o=!this.options.userDefinedKeySeparator&&!t.keySeparator&&!this.options.userDefinedNsSeparator&&!t.nsSeparator&&!ie(e,n,r);if(a&&!o){let t=e.match(this.interpolator.nestingRegexp);if(t&&t.length>0)return{key:e,namespaces:h(i)?[i]:i};let a=e.split(n);(n!==r||n===r&&this.options.ns.includes(a[0]))&&(i=a.shift()),e=a.join(r)}return{key:e,namespaces:h(i)?[i]:i}}translate(t,n,r){let i=typeof n==`object`?{...n}:n;if(typeof i!=`object`&&this.options.overloadTranslationOptionHandler&&(i=this.options.overloadTranslationOptionHandler(arguments)),typeof i==`object`&&(i={...i}),i||={},t==null)return``;typeof t==`function`&&(t=F(t,{...this.options,...i})),Array.isArray(t)||(t=[String(t)]),t=t.map(e=>typeof e==`function`?F(e,{...this.options,...i}):String(e));let a=i.returnDetails===void 0?this.options.returnDetails:i.returnDetails,o=i.keySeparator===void 0?this.options.keySeparator:i.keySeparator,{key:s,namespaces:c}=this.extractFromKey(t[t.length-1],i),l=c[c.length-1],u=i.nsSeparator===void 0?this.options.nsSeparator:i.nsSeparator;u===void 0&&(u=`:`);let d=i.lng||this.language,f=i.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(d?.toLowerCase()===`cimode`)return f?a?{res:`${l}${u}${s}`,usedKey:s,exactUsedKey:s,usedLng:d,usedNS:l,usedParams:this.getUsedParamsDetails(i)}:`${l}${u}${s}`:a?{res:s,usedKey:s,exactUsedKey:s,usedLng:d,usedNS:l,usedParams:this.getUsedParamsDetails(i)}:s;let p=this.resolve(t,i),m=p?.res,g=p?.usedKey||s,_=p?.exactUsedKey||s,v=[`[object Number]`,`[object Function]`,`[object RegExp]`],y=i.joinArrays===void 0?this.options.joinArrays:i.joinArrays,b=!this.i18nFormat||this.i18nFormat.handleAsObject,x=i.count!==void 0&&!h(i.count),S=e.hasDefaultValue(i),C=x?this.pluralResolver.getSuffix(d,i.count,i):``,w=i.ordinal&&x?this.pluralResolver.getSuffix(d,i.count,{ordinal:!1}):``,T=x&&!i.ordinal&&i.count===0,E=T&&i[`defaultValue${this.options.pluralSeparator}zero`]||i[`defaultValue${C}`]||i[`defaultValue${w}`]||i.defaultValue,D=m;b&&!m&&S&&(D=E);let O=I(D),k=Object.prototype.toString.apply(D);if(b&&D&&O&&!v.includes(k)&&!(h(y)&&Array.isArray(D))){if(!i.returnObjects&&!this.options.returnObjects){this.options.returnedObjectHandler||this.logger.warn(`accessing an object - but returnObjects options is not enabled!`);let e=this.options.returnedObjectHandler?this.options.returnedObjectHandler(g,D,{...i,ns:c}):`key '${s} (${this.language})' returned an object instead of string.`;return a?(p.res=e,p.usedParams=this.getUsedParamsDetails(i),p):e}if(o){let e=Array.isArray(D),t=e?[]:{},n=e?_:g;for(let e in D)if(Object.prototype.hasOwnProperty.call(D,e)){let r=`${n}${o}${e}`;S&&!m?t[e]=this.translate(r,{...i,defaultValue:I(E)?E[e]:void 0,joinArrays:!1,ns:c}):t[e]=this.translate(r,{...i,joinArrays:!1,ns:c}),t[e]===r&&(t[e]=D[e])}m=t}}else if(b&&h(y)&&Array.isArray(m))m=m.join(y),m&&=this.extendTranslation(m,t,i,r);else{let e=!1,n=!1;!this.isValidLookup(m)&&S&&(e=!0,m=E),this.isValidLookup(m)||(n=!0,m=s);let a=(i.missingKeyNoValueFallbackToKey||this.options.missingKeyNoValueFallbackToKey)&&n?void 0:m,c=S&&E!==m&&this.options.updateMissing;if(n||e||c){if(this.logger.log(c?`updateKey`:`missingKey`,d,l,s,c?E:m),o){let e=this.resolve(s,{...i,keySeparator:!1});e&&e.res&&this.logger.warn(`Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.`)}let e=[],t=this.languageUtils.getFallbackCodes(this.options.fallbackLng,i.lng||this.language);if(this.options.saveMissingTo===`fallback`&&t&&t[0])for(let n=0;n<t.length;n++)e.push(t[n]);else this.options.saveMissingTo===`all`?e=this.languageUtils.toResolveHierarchy(i.lng||this.language):e.push(i.lng||this.language);let n=(e,t,n)=>{let r=S&&n!==m?n:a;this.options.missingKeyHandler?this.options.missingKeyHandler(e,l,t,r,c,i):this.backendConnector?.saveMissing&&this.backendConnector.saveMissing(e,l,t,r,c,i),this.emit(`missingKey`,e,l,t,m)};this.options.saveMissing&&(this.options.saveMissingPlurals&&x?e.forEach(e=>{let t=this.pluralResolver.getSuffixes(e,i);T&&i[`defaultValue${this.options.pluralSeparator}zero`]&&!t.includes(`${this.options.pluralSeparator}zero`)&&t.push(`${this.options.pluralSeparator}zero`),t.forEach(t=>{n([e],s+t,i[`defaultValue${t}`]||E)})}):n(e,s,E))}m=this.extendTranslation(m,t,i,p,r),n&&m===s&&this.options.appendNamespaceToMissingKey&&(m=`${l}${u}${s}`),(n||e)&&this.options.parseMissingKeyHandler&&(m=this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey?`${l}${u}${s}`:s,e?m:void 0,i))}return a?(p.res=m,p.usedParams=this.getUsedParamsDetails(i),p):m}extendTranslation(e,t,n,r,i){if(this.i18nFormat?.parse)e=this.i18nFormat.parse(e,{...this.options.interpolation.defaultVariables,...n},n.lng||this.language||r.usedLng,r.usedNS,r.usedKey,{resolved:r});else if(!n.skipInterpolation){n.interpolation&&this.interpolator.init({...n,interpolation:{...this.options.interpolation,...n.interpolation}});let a=h(e)&&(n?.interpolation?.skipOnVariables===void 0?this.options.interpolation.skipOnVariables:n.interpolation.skipOnVariables),o;if(a){let t=e.match(this.interpolator.nestingRegexp);o=t&&t.length}let s=n.replace&&!h(n.replace)?n.replace:n;if(this.options.interpolation.defaultVariables&&(s={...this.options.interpolation.defaultVariables,...s}),e=this.interpolator.interpolate(e,s,n.lng||this.language||r.usedLng,n),a){let t=e.match(this.interpolator.nestingRegexp),r=t&&t.length;o<r&&(n.nest=!1)}!n.lng&&r&&r.res&&(n.lng=this.language||r.usedLng),n.nest!==!1&&(e=this.interpolator.nest(e,(...e)=>i?.[0]===e[0]&&!n.context?(this.logger.warn(`It seems you are nesting recursively key: ${e[0]} in key: ${t[0]}`),null):this.translate(...e,t),n)),n.interpolation&&this.interpolator.reset()}let a=n.postProcess||this.options.postProcess,o=h(a)?[a]:a;return e!=null&&o?.length&&n.applyPostProcessor!==!1&&(e=se.handle(o,e,t,this.options&&this.options.postProcessPassResolved?{i18nResolved:{...r,usedParams:this.getUsedParamsDetails(n)},...n}:n,this)),e}resolve(e,t={}){let n,r,i,a,o;return h(e)&&(e=[e]),Array.isArray(e)&&(e=e.map(e=>typeof e==`function`?F(e,{...this.options,...t}):e)),e.forEach(e=>{if(this.isValidLookup(n))return;let s=this.extractFromKey(e,t),c=s.key;r=c;let l=s.namespaces;this.options.fallbackNS&&(l=l.concat(this.options.fallbackNS));let u=t.count!==void 0&&!h(t.count),d=u&&!t.ordinal&&t.count===0,f=t.context!==void 0&&(h(t.context)||typeof t.context==`number`)&&t.context!==``,p=t.lngs?t.lngs:this.languageUtils.toResolveHierarchy(t.lng||this.language,t.fallbackLng);l.forEach(e=>{this.isValidLookup(n)||(o=e,!this.checkedLoadedFor[`${p[0]}-${e}`]&&this.utils?.hasLoadedNamespace&&!this.utils?.hasLoadedNamespace(o)&&(this.checkedLoadedFor[`${p[0]}-${e}`]=!0,this.logger.warn(`key "${r}" for languages "${p.join(`, `)}" won't get resolved as namespace "${o}" was not yet loaded`,`This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!`)),p.forEach(r=>{if(this.isValidLookup(n))return;a=r;let o=[c];if(this.i18nFormat?.addLookupKeys)this.i18nFormat.addLookupKeys(o,c,r,e,t);else{let e;u&&(e=this.pluralResolver.getSuffix(r,t.count,t));let n=`${this.options.pluralSeparator}zero`,i=`${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`;if(u&&(t.ordinal&&e.startsWith(i)&&o.push(c+e.replace(i,this.options.pluralSeparator)),o.push(c+e),d&&o.push(c+n)),f){let r=`${c}${this.options.contextSeparator||`_`}${t.context}`;o.push(r),u&&(t.ordinal&&e.startsWith(i)&&o.push(r+e.replace(i,this.options.pluralSeparator)),o.push(r+e),d&&o.push(r+n))}}let s;for(;s=o.pop();)this.isValidLookup(n)||(i=s,n=this.getResource(r,e,s,t))}))})}),{res:n,usedKey:r,exactUsedKey:i,usedLng:a,usedNS:o}}isValidLookup(e){return e!==void 0&&!(!this.options.returnNull&&e===null)&&!(!this.options.returnEmptyString&&e===``)}getResource(e,t,n,r={}){return this.i18nFormat?.getResource?this.i18nFormat.getResource(e,t,n,r):this.resourceStore.getResource(e,t,n,r)}getUsedParamsDetails(e={}){let t=[`defaultValue`,`ordinal`,`context`,`replace`,`lng`,`lngs`,`fallbackLng`,`ns`,`keySeparator`,`nsSeparator`,`returnObjects`,`returnDetails`,`joinArrays`,`postProcess`,`interpolation`],n=e.replace&&!h(e.replace),r=n?e.replace:e;if(n&&e.count!==void 0&&(r.count=e.count),this.options.interpolation.defaultVariables&&(r={...this.options.interpolation.defaultVariables,...r}),!n){r={...r};for(let e of t)delete r[e]}return r}static hasDefaultValue(e){for(let t in e)if(Object.prototype.hasOwnProperty.call(e,t)&&t.startsWith(`defaultValue`)&&e[t]!==void 0)return!0;return!1}},R=class{constructor(e){this.options=e,this.supportedLngs=this.options.supportedLngs||!1,this.logger=M.create(`languageUtils`)}getScriptPartFromCode(e){if(e=j(e),!e||!e.includes(`-`))return null;let t=e.split(`-`);return t.length===2||(t.pop(),t[t.length-1].toLowerCase()===`x`)?null:this.formatLanguageCode(t.join(`-`))}getLanguagePartFromCode(e){if(e=j(e),!e||!e.includes(`-`))return e;let t=e.split(`-`);return this.formatLanguageCode(t[0])}formatLanguageCode(e){if(h(e)&&e.includes(`-`)){let t;try{t=Intl.getCanonicalLocales(e)[0]}catch{}return t&&this.options.lowerCaseLng&&(t=t.toLowerCase()),t||(this.options.lowerCaseLng?e.toLowerCase():e)}return this.options.cleanCode||this.options.lowerCaseLng?e.toLowerCase():e}isSupportedCode(e){return(this.options.load===`languageOnly`||this.options.nonExplicitSupportedLngs)&&(e=this.getLanguagePartFromCode(e)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.includes(e)}getBestMatchFromCodes(e){if(!e)return null;let t;return e.forEach(e=>{if(t)return;let n=this.formatLanguageCode(e);(!this.options.supportedLngs||this.isSupportedCode(n))&&(t=n)}),!t&&this.options.supportedLngs&&e.forEach(e=>{if(t)return;let n=this.getScriptPartFromCode(e);if(this.isSupportedCode(n))return t=n;let r=this.getLanguagePartFromCode(e);if(this.isSupportedCode(r))return t=r;t=this.options.supportedLngs.find(e=>e===r?!0:!e.includes(`-`)&&!r.includes(`-`)?!1:!!(e.includes(`-`)&&!r.includes(`-`)&&e.slice(0,e.indexOf(`-`))===r||e.startsWith(r)&&r.length>1))}),t||=this.getFallbackCodes(this.options.fallbackLng)[0],t}getFallbackCodes(e,t){if(!e)return[];if(typeof e==`function`&&(e=e(t)),h(e)&&(e=[e]),Array.isArray(e))return e;if(!t)return e.default||[];let n=e[t];return n||=e[this.getScriptPartFromCode(t)],n||=e[this.formatLanguageCode(t)],n||=e[this.getLanguagePartFromCode(t)],n||=e.default,n||[]}toResolveHierarchy(e,t){let n=this.getFallbackCodes((t===!1?[]:t)||this.options.fallbackLng||[],e),r=[],i=e=>{e&&(this.isSupportedCode(e)?r.push(e):this.logger.warn(`rejecting language code not found in supportedLngs: ${e}`))};return h(e)&&(e.includes(`-`)||e.includes(`_`))?(this.options.load!==`languageOnly`&&i(this.formatLanguageCode(e)),this.options.load!==`languageOnly`&&this.options.load!==`currentOnly`&&i(this.getScriptPartFromCode(e)),this.options.load!==`currentOnly`&&i(this.getLanguagePartFromCode(e))):h(e)&&i(this.formatLanguageCode(e)),n.forEach(e=>{r.includes(e)||i(this.formatLanguageCode(e))}),r}},le={zero:0,one:1,two:2,few:3,many:4,other:5},z={select:e=>e===1?`one`:`other`,resolvedOptions:()=>({pluralCategories:[`one`,`other`]})},ue=class{constructor(e,t={}){this.languageUtils=e,this.options=t,this.logger=M.create(`pluralResolver`),this.pluralRulesCache={}}clearCache(){this.pluralRulesCache={}}getRule(e,t={}){let n=j(e===`dev`?`en`:e),r=t.ordinal?`ordinal`:`cardinal`,i=JSON.stringify({cleanedCode:n,type:r});if(i in this.pluralRulesCache)return this.pluralRulesCache[i];let a;try{a=new Intl.PluralRules(n,{type:r})}catch{if(typeof Intl>`u`)return this.logger.error(`No Intl support, please use an Intl polyfill!`),z;if(!e.match(/-|_/))return z;let n=this.languageUtils.getLanguagePartFromCode(e);a=this.getRule(n,t)}return this.pluralRulesCache[i]=a,a}needsPlural(e,t={}){let n=this.getRule(e,t);return n||=this.getRule(`dev`,t),n?.resolvedOptions().pluralCategories.length>1}getPluralFormsOfKey(e,t,n={}){return this.getSuffixes(e,n).map(e=>`${t}${e}`)}getSuffixes(e,t={}){let n=this.getRule(e,t);return n||=this.getRule(`dev`,t),n?n.resolvedOptions().pluralCategories.sort((e,t)=>le[e]-le[t]).map(e=>`${this.options.prepend}${t.ordinal?`ordinal${this.options.prepend}`:``}${e}`):[]}getSuffix(e,t,n={}){let r=this.getRule(e,n);return r?`${this.options.prepend}${n.ordinal?`ordinal${this.options.prepend}`:``}${r.select(t)}`:(this.logger.warn(`no plural rule found for: ${e}`),this.getSuffix(`dev`,t,n))}},B=(e,t,n,r=`.`,i=!0)=>{let a=E(e,t,n);return!a&&i&&h(n)&&(a=A(e,n,r),a===void 0&&(a=A(t,n,r))),a},V=e=>e.replace(/\$/g,`$$$$`),H=class{constructor(e={}){this.logger=M.create(`interpolator`),this.options=e,this.format=e?.interpolation?.format||(e=>e),this.init(e)}init(e={}){e.interpolation||={escapeValue:!0};let{escape:t,escapeValue:n,useRawValueToEscape:r,prefix:i,prefixEscaped:a,suffix:o,suffixEscaped:s,formatSeparator:c,unescapeSuffix:l,unescapePrefix:u,nestingPrefix:d,nestingPrefixEscaped:f,nestingSuffix:p,nestingSuffixEscaped:m,nestingOptionsSeparator:h,maxReplaces:g,alwaysFormat:_}=e.interpolation;this.escape=t===void 0?ee:t,this.escapeValue=n===void 0?!0:n,this.useRawValueToEscape=r===void 0?!1:r,this.prefix=i?O(i):a||`{{`,this.suffix=o?O(o):s||`}}`,this.formatSeparator=c||`,`,this.unescapePrefix=l?``:u||`-`,this.unescapeSuffix=this.unescapePrefix?``:l||``,this.nestingPrefix=d?O(d):f||O(`$t(`),this.nestingSuffix=p?O(p):m||O(`)`),this.nestingOptionsSeparator=h||`,`,this.maxReplaces=g||1e3,this.alwaysFormat=_===void 0?!1:_,this.resetRegExp()}reset(){this.options&&this.init(this.options)}resetRegExp(){let e=(e,t)=>e?.source===t?(e.lastIndex=0,e):new RegExp(t,`g`);this.regexp=e(this.regexp,`${this.prefix}(.+?)${this.suffix}`),this.regexpUnescape=e(this.regexpUnescape,`${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`),this.nestingRegexp=e(this.nestingRegexp,`${this.nestingPrefix}((?:[^()"']+|"[^"]*"|'[^']*'|\\((?:[^()]|"[^"]*"|'[^']*')*\\))*?)${this.nestingSuffix}`)}interpolate(e,t,n,r){let i,a,o,s=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{},c=e=>{if(!e.includes(this.formatSeparator)){let i=B(t,s,e,this.options.keySeparator,this.options.ignoreJSONStructure);return this.alwaysFormat?this.format(i,void 0,n,{...r,...t,interpolationkey:e}):i}let i=e.split(this.formatSeparator),a=i.shift().trim(),o=i.join(this.formatSeparator).trim();return this.format(B(t,s,a,this.options.keySeparator,this.options.ignoreJSONStructure),o,n,{...r,...t,interpolationkey:a})};this.resetRegExp();let l=r?.missingInterpolationHandler||this.options.missingInterpolationHandler,u=r?.interpolation?.skipOnVariables===void 0?this.options.interpolation.skipOnVariables:r.interpolation.skipOnVariables;return[{regex:this.regexpUnescape,safeValue:e=>V(e)},{regex:this.regexp,safeValue:e=>this.escapeValue?V(this.escape(e)):V(e)}].forEach(t=>{for(o=0;i=t.regex.exec(e);){let n=i[1].trim();if(a=c(n),a===void 0)if(typeof l==`function`){let t=l(e,i,r);a=h(t)?t:``}else if(r&&Object.prototype.hasOwnProperty.call(r,n))a=``;else if(u){a=i[0];continue}else this.logger.warn(`missed to pass in variable ${n} for interpolating ${e}`),a=``;else !h(a)&&!this.useRawValueToEscape&&(a=_(a));let s=t.safeValue(a);if(e=e.replace(i[0],s),u?(t.regex.lastIndex+=a.length,t.regex.lastIndex-=i[0].length):t.regex.lastIndex=0,o++,o>=this.maxReplaces)break}}),e}nest(e,t,n={}){let r,i,a,o=(e,t)=>{let n=this.nestingOptionsSeparator;if(!e.includes(n))return e;let r=e.split(RegExp(`${O(n)}[ ]*{`)),i=`{${r[1]}`;e=r[0],i=this.interpolate(i,a);let o=i.match(/'/g),s=i.match(/"/g);((o?.length??0)%2==0&&!s||(s?.length??0)%2!=0)&&(i=i.replace(/'/g,`"`));try{a=JSON.parse(i),t&&(a={...t,...a})}catch(t){return this.logger.warn(`failed parsing options string in nesting for key ${e}`,t),`${e}${n}${i}`}return a.defaultValue&&a.defaultValue.includes(this.prefix)&&delete a.defaultValue,e};for(;r=this.nestingRegexp.exec(e);){let s=[];a={...n},a=a.replace&&!h(a.replace)?a.replace:a,a.applyPostProcessor=!1,delete a.defaultValue;let c=/{.*}/.test(r[1])?r[1].lastIndexOf(`}`)+1:r[1].indexOf(this.formatSeparator);if(c!==-1&&(s=r[1].slice(c).split(this.formatSeparator).map(e=>e.trim()).filter(Boolean),r[1]=r[1].slice(0,c)),i=t(o.call(this,r[1].trim(),a),a),i&&r[0]===e&&!h(i))return i;h(i)||(i=_(i)),i||=(this.logger.warn(`missed to resolve ${r[1]} for nesting ${e}`),``),s.length&&(i=s.reduce((e,t)=>this.format(e,t,n.lng,{...n,interpolationkey:r[1].trim()}),i.trim())),e=e.replace(r[0],i),this.regexp.lastIndex=0}return e}},de=e=>{let t=e.toLowerCase().trim(),n={};if(e.includes(`(`)){let r=e.split(`(`);t=r[0].toLowerCase().trim();let i=r[1].slice(0,-1);t===`currency`&&!i.includes(`:`)?n.currency||=i.trim():t===`relativetime`&&!i.includes(`:`)?n.range||=i.trim():i.split(`;`).forEach(e=>{if(e){let[t,...r]=e.split(`:`),i=r.join(`:`).trim().replace(/^'+|'+$/g,``),a=t.trim();n[a]||(n[a]=i),i===`false`&&(n[a]=!1),i===`true`&&(n[a]=!0),isNaN(i)||(n[a]=parseInt(i,10))}})}return{formatName:t,formatOptions:n}},U=e=>{let t={};return(n,r,i)=>{let a=i;i&&i.interpolationkey&&i.formatParams&&i.formatParams[i.interpolationkey]&&i[i.interpolationkey]&&(a={...a,[i.interpolationkey]:void 0});let o=r+JSON.stringify(a),s=t[o];return s||(s=e(j(r),i),t[o]=s),s(n)}},fe=e=>(t,n,r)=>e(j(n),r)(t),pe=class{constructor(e={}){this.logger=M.create(`formatter`),this.options=e,this.init(e)}init(e,t={interpolation:{}}){this.formatSeparator=t.interpolation.formatSeparator||`,`;let n=t.cacheInBuiltFormats?U:fe;this.formats={number:n((e,t)=>{let n=new Intl.NumberFormat(e,{...t});return e=>n.format(e)}),currency:n((e,t)=>{let n=new Intl.NumberFormat(e,{...t,style:`currency`});return e=>n.format(e)}),datetime:n((e,t)=>{let n=new Intl.DateTimeFormat(e,{...t});return e=>n.format(e)}),relativetime:n((e,t)=>{let n=new Intl.RelativeTimeFormat(e,{...t});return e=>n.format(e,t.range||`day`)}),list:n((e,t)=>{let n=new Intl.ListFormat(e,{...t});return e=>n.format(e)})}}add(e,t){this.formats[e.toLowerCase().trim()]=t}addCached(e,t){this.formats[e.toLowerCase().trim()]=U(t)}format(e,t,n,r={}){if(!t||e==null)return e;let i=t.split(this.formatSeparator);if(i.length>1&&i[0].indexOf(`(`)>1&&!i[0].includes(`)`)&&i.find(e=>e.includes(`)`))){let e=i.findIndex(e=>e.includes(`)`));i[0]=[i[0],...i.splice(1,e)].join(this.formatSeparator)}return i.reduce((e,t)=>{let{formatName:i,formatOptions:a}=de(t);if(this.formats[i]){let t=e;try{let o=r?.formatParams?.[r.interpolationkey]||{},s=o.locale||o.lng||r.locale||r.lng||n;t=this.formats[i](e,s,{...a,...r,...o})}catch(e){this.logger.warn(e)}return t}else this.logger.warn(`there was no format function for ${i}`);return e},e)}},me=(e,t)=>{e.pending[t]!==void 0&&(delete e.pending[t],e.pendingCount--)},he=class extends N{constructor(e,t,n,r={}){super(),this.backend=e,this.store=t,this.services=n,this.languageUtils=n.languageUtils,this.options=r,this.logger=M.create(`backendConnector`),this.waitingReads=[],this.maxParallelReads=r.maxParallelReads||10,this.readingCalls=0,this.maxRetries=r.maxRetries>=0?r.maxRetries:5,this.retryTimeout=r.retryTimeout>=1?r.retryTimeout:350,this.state={},this.queue=[],this.backend?.init?.(n,r.backend,r)}queueLoad(e,t,n,r){let i={},a={},o={},s={};return e.forEach(e=>{let r=!0;t.forEach(t=>{let o=`${e}|${t}`;!n.reload&&this.store.hasResourceBundle(e,t)?this.state[o]=2:this.state[o]<0||(this.state[o]===1?a[o]===void 0&&(a[o]=!0):(this.state[o]=1,r=!1,a[o]===void 0&&(a[o]=!0),i[o]===void 0&&(i[o]=!0),s[t]===void 0&&(s[t]=!0)))}),r||(o[e]=!0)}),(Object.keys(i).length||Object.keys(a).length)&&this.queue.push({pending:a,pendingCount:Object.keys(a).length,loaded:{},errors:[],callback:r}),{toLoad:Object.keys(i),pending:Object.keys(a),toLoadLanguages:Object.keys(o),toLoadNamespaces:Object.keys(s)}}loaded(e,t,n){let r=e.split(`|`),i=r[0],a=r[1];t&&this.emit(`failedLoading`,i,a,t),!t&&n&&this.store.addResourceBundle(i,a,n,void 0,void 0,{skipCopy:!0}),this.state[e]=t?-1:2,t&&n&&(this.state[e]=0);let o={};this.queue.forEach(n=>{w(n.loaded,[i],a),me(n,e),t&&n.errors.push(t),n.pendingCount===0&&!n.done&&(Object.keys(n.loaded).forEach(e=>{o[e]||(o[e]={});let t=n.loaded[e];t.length&&t.forEach(t=>{o[e][t]===void 0&&(o[e][t]=!0)})}),n.done=!0,n.errors.length?n.callback(n.errors):n.callback())}),this.emit(`loaded`,o),this.queue=this.queue.filter(e=>!e.done)}read(e,t,n,r=0,i=this.retryTimeout,a){if(!e.length)return a(null,{});if(this.readingCalls>=this.maxParallelReads){this.waitingReads.push({lng:e,ns:t,fcName:n,tried:r,wait:i,callback:a});return}this.readingCalls++;let o=(o,s)=>{if(this.readingCalls--,this.waitingReads.length>0){let e=this.waitingReads.shift();this.read(e.lng,e.ns,e.fcName,e.tried,e.wait,e.callback)}if(o&&s&&r<this.maxRetries){setTimeout(()=>{this.read(e,t,n,r+1,i*2,a)},i);return}a(o,s)},s=this.backend[n].bind(this.backend);if(s.length===2){try{let n=s(e,t);n&&typeof n.then==`function`?n.then(e=>o(null,e)).catch(o):o(null,n)}catch(e){o(e)}return}return s(e,t,o)}prepareLoading(e,t,n={},r){if(!this.backend)return this.logger.warn(`No backend was added via i18next.use. Will not load resources.`),r&&r();h(e)&&(e=this.languageUtils.toResolveHierarchy(e)),h(t)&&(t=[t]);let i=this.queueLoad(e,t,n,r);if(!i.toLoad.length)return i.pending.length||r(),null;i.toLoad.forEach(e=>{this.loadOne(e)})}load(e,t,n){this.prepareLoading(e,t,{},n)}reload(e,t,n){this.prepareLoading(e,t,{reload:!0},n)}loadOne(e,t=``){let n=e.split(`|`),r=n[0],i=n[1];this.read(r,i,`read`,void 0,void 0,(n,a)=>{n&&this.logger.warn(`${t}loading namespace ${i} for language ${r} failed`,n),!n&&a&&this.logger.log(`${t}loaded namespace ${i} for language ${r}`,a),this.loaded(e,n,a)})}saveMissing(e,t,n,r,i,a={},o=()=>{}){if(this.services?.utils?.hasLoadedNamespace&&!this.services?.utils?.hasLoadedNamespace(t)){this.logger.warn(`did not save key "${n}" as the namespace "${t}" was not yet loaded`,`This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!`);return}if(!(n==null||n===``)){if(this.backend?.create){let s={...a,isUpdate:i},c=this.backend.create.bind(this.backend);if(c.length<6)try{let i;i=c.length===5?c(e,t,n,r,s):c(e,t,n,r),i&&typeof i.then==`function`?i.then(e=>o(null,e)).catch(o):o(null,i)}catch(e){o(e)}else c(e,t,n,r,o,s)}!e||!e[0]||this.store.addResource(e[0],t,n,r)}}},W=()=>({debug:!1,initAsync:!0,ns:[`translation`],defaultNS:[`translation`],fallbackLng:[`dev`],fallbackNS:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:`all`,preload:!1,keySeparator:`.`,nsSeparator:`:`,pluralSeparator:`_`,contextSeparator:`_`,partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:`fallback`,saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!1,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:e=>{let t={};if(typeof e[1]==`object`&&(t=e[1]),h(e[1])&&(t.defaultValue=e[1]),h(e[2])&&(t.tDescription=e[2]),typeof e[2]==`object`||typeof e[3]==`object`){let n=e[3]||e[2];Object.keys(n).forEach(e=>{t[e]=n[e]})}return t},interpolation:{escapeValue:!0,prefix:`{{`,suffix:`}}`,formatSeparator:`,`,unescapePrefix:`-`,nestingPrefix:`$t(`,nestingSuffix:`)`,nestingOptionsSeparator:`,`,maxReplaces:1e3,skipOnVariables:!0},cacheInBuiltFormats:!0}),G=e=>(h(e.ns)&&(e.ns=[e.ns]),h(e.fallbackLng)&&(e.fallbackLng=[e.fallbackLng]),h(e.fallbackNS)&&(e.fallbackNS=[e.fallbackNS]),e.supportedLngs&&!e.supportedLngs.includes(`cimode`)&&(e.supportedLngs=e.supportedLngs.concat([`cimode`])),e),K=()=>{},ge=e=>{Object.getOwnPropertyNames(Object.getPrototypeOf(e)).forEach(t=>{typeof e[t]==`function`&&(e[t]=e[t].bind(e))})},q=class e extends N{constructor(e={},t){if(super(),this.options=G(e),this.services={},this.logger=M,this.modules={external:[]},ge(this),t&&!this.isInitialized&&!e.isClone){if(!this.options.initAsync)return this.init(e,t),this;setTimeout(()=>{this.init(e,t)},0)}}init(e={},t){this.isInitializing=!0,typeof e==`function`&&(t=e,e={}),e.defaultNS==null&&e.ns&&(h(e.ns)?e.defaultNS=e.ns:e.ns.includes(`translation`)||(e.defaultNS=e.ns[0]));let n=W();this.options={...n,...this.options,...G(e)},this.options.interpolation={...n.interpolation,...this.options.interpolation},e.keySeparator!==void 0&&(this.options.userDefinedKeySeparator=e.keySeparator),e.nsSeparator!==void 0&&(this.options.userDefinedNsSeparator=e.nsSeparator),typeof this.options.overloadTranslationOptionHandler!=`function`&&(this.options.overloadTranslationOptionHandler=n.overloadTranslationOptionHandler);let r=e=>e?typeof e==`function`?new e:e:null;if(!this.options.isClone){this.modules.logger?M.init(r(this.modules.logger),this.options):M.init(null,this.options);let e;e=this.modules.formatter?this.modules.formatter:pe;let t=new R(this.options);this.store=new oe(this.options.resources,this.options);let n=this.services;n.logger=M,n.resourceStore=this.store,n.languageUtils=t,n.pluralResolver=new ue(t,{prepend:this.options.pluralSeparator}),e&&(n.formatter=r(e),n.formatter.init&&n.formatter.init(n,this.options),this.options.interpolation.format=n.formatter.format.bind(n.formatter)),n.interpolator=new H(this.options),n.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},n.backendConnector=new he(r(this.modules.backend),n.resourceStore,n,this.options),n.backendConnector.on(`*`,(e,...t)=>{this.emit(e,...t)}),this.modules.languageDetector&&(n.languageDetector=r(this.modules.languageDetector),n.languageDetector.init&&n.languageDetector.init(n,this.options.detection,this.options)),this.modules.i18nFormat&&(n.i18nFormat=r(this.modules.i18nFormat),n.i18nFormat.init&&n.i18nFormat.init(this)),this.translator=new L(this.services,this.options),this.translator.on(`*`,(e,...t)=>{this.emit(e,...t)}),this.modules.external.forEach(e=>{e.init&&e.init(this)})}if(this.format=this.options.interpolation.format,t||=K,this.options.fallbackLng&&!this.services.languageDetector&&!this.options.lng){let e=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);e.length>0&&e[0]!==`dev`&&(this.options.lng=e[0])}!this.services.languageDetector&&!this.options.lng&&this.logger.warn(`init: no languageDetector is used and no lng is defined`),[`getResource`,`hasResourceBundle`,`getResourceBundle`,`getDataByLanguage`].forEach(e=>{this[e]=(...t)=>this.store[e](...t)}),[`addResource`,`addResources`,`addResourceBundle`,`removeResourceBundle`].forEach(e=>{this[e]=(...t)=>(this.store[e](...t),this)});let i=g(),a=()=>{let e=(e,n)=>{this.isInitializing=!1,this.isInitialized&&!this.initializedStoreOnce&&this.logger.warn(`init: i18next is already initialized. You should call init just once!`),this.isInitialized=!0,this.options.isClone||this.logger.log(`initialized`,this.options),this.emit(`initialized`,this.options),i.resolve(n),t(e,n)};if(this.languages&&!this.isInitialized)return e(null,this.t.bind(this));this.changeLanguage(this.options.lng,e)};return this.options.resources||!this.options.initAsync?a():setTimeout(a,0),i}loadResources(e,t=K){let n=t,r=h(e)?e:this.language;if(typeof e==`function`&&(n=e),!this.options.resources||this.options.partialBundledLanguages){if(r?.toLowerCase()===`cimode`&&(!this.options.preload||this.options.preload.length===0))return n();let e=[],t=t=>{t&&t!==`cimode`&&this.services.languageUtils.toResolveHierarchy(t).forEach(t=>{t!==`cimode`&&(e.includes(t)||e.push(t))})};r?t(r):this.services.languageUtils.getFallbackCodes(this.options.fallbackLng).forEach(e=>t(e)),this.options.preload?.forEach?.(e=>t(e)),this.services.backendConnector.load(e,this.options.ns,e=>{!e&&!this.resolvedLanguage&&this.language&&this.setResolvedLanguage(this.language),n(e)})}else n(null)}reloadResources(e,t,n){let r=g();return typeof e==`function`&&(n=e,e=void 0),typeof t==`function`&&(n=t,t=void 0),e||=this.languages,t||=this.options.ns,n||=K,this.services.backendConnector.reload(e,t,e=>{r.resolve(),n(e)}),r}use(e){if(!e)throw Error(`You are passing an undefined module! Please check the object you are passing to i18next.use()`);if(!e.type)throw Error(`You are passing a wrong module! Please check the object you are passing to i18next.use()`);return e.type===`backend`&&(this.modules.backend=e),(e.type===`logger`||e.log&&e.warn&&e.error)&&(this.modules.logger=e),e.type===`languageDetector`&&(this.modules.languageDetector=e),e.type===`i18nFormat`&&(this.modules.i18nFormat=e),e.type===`postProcessor`&&se.addPostProcessor(e),e.type===`formatter`&&(this.modules.formatter=e),e.type===`3rdParty`&&this.modules.external.push(e),this}setResolvedLanguage(e){if(!(!e||!this.languages)&&![`cimode`,`dev`].includes(e)){for(let e=0;e<this.languages.length;e++){let t=this.languages[e];if(![`cimode`,`dev`].includes(t)&&this.store.hasLanguageSomeTranslations(t)){this.resolvedLanguage=t;break}}!this.resolvedLanguage&&!this.languages.includes(e)&&this.store.hasLanguageSomeTranslations(e)&&(this.resolvedLanguage=e,this.languages.unshift(e))}}changeLanguage(e,t){this.isLanguageChangingTo=e;let n=g();this.emit(`languageChanging`,e);let r=e=>{this.language=e,this.languages=this.services.languageUtils.toResolveHierarchy(e),this.resolvedLanguage=void 0,this.setResolvedLanguage(e)},i=(i,a)=>{a?this.isLanguageChangingTo===e&&(r(a),this.translator.changeLanguage(a),this.isLanguageChangingTo=void 0,this.emit(`languageChanged`,a),this.logger.log(`languageChanged`,a)):this.isLanguageChangingTo=void 0,n.resolve((...e)=>this.t(...e)),t&&t(i,(...e)=>this.t(...e))},a=t=>{!e&&!t&&this.services.languageDetector&&(t=[]);let n=h(t)?t:t&&t[0],a=this.store.hasLanguageSomeTranslations(n)?n:this.services.languageUtils.getBestMatchFromCodes(h(t)?[t]:t);a&&(this.language||r(a),this.translator.language||this.translator.changeLanguage(a),this.services.languageDetector?.cacheUserLanguage?.(a)),this.loadResources(a,e=>{i(e,a)})};return!e&&this.services.languageDetector&&!this.services.languageDetector.async?a(this.services.languageDetector.detect()):!e&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect.length===0?this.services.languageDetector.detect().then(a):this.services.languageDetector.detect(a):a(e),n}getFixedT(e,t,n){let r=(e,t,...i)=>{let a;a=typeof t==`object`?{...t}:this.options.overloadTranslationOptionHandler([e,t].concat(i)),a.lng=a.lng||r.lng,a.lngs=a.lngs||r.lngs,a.ns=a.ns||r.ns,a.keyPrefix!==``&&(a.keyPrefix=a.keyPrefix||n||r.keyPrefix);let o={...this.options,...a};typeof a.keyPrefix==`function`&&(a.keyPrefix=F(a.keyPrefix,o));let s=this.options.keySeparator||`.`,c;return a.keyPrefix&&Array.isArray(e)?c=e.map(e=>(typeof e==`function`&&(e=F(e,o)),`${a.keyPrefix}${s}${e}`)):(typeof e==`function`&&(e=F(e,o)),c=a.keyPrefix?`${a.keyPrefix}${s}${e}`:e),this.t(c,a)};return h(e)?r.lng=e:r.lngs=e,r.ns=t,r.keyPrefix=n,r}t(...e){return this.translator?.translate(...e)}exists(...e){return this.translator?.exists(...e)}setDefaultNamespace(e){this.options.defaultNS=e}hasLoadedNamespace(e,t={}){if(!this.isInitialized)return this.logger.warn(`hasLoadedNamespace: i18next was not initialized`,this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn(`hasLoadedNamespace: i18n.languages were undefined or empty`,this.languages),!1;let n=t.lng||this.resolvedLanguage||this.languages[0],r=this.options?this.options.fallbackLng:!1,i=this.languages[this.languages.length-1];if(n.toLowerCase()===`cimode`)return!0;let a=(e,t)=>{let n=this.services.backendConnector.state[`${e}|${t}`];return n===-1||n===0||n===2};if(t.precheck){let e=t.precheck(this,a);if(e!==void 0)return e}return!!(this.hasResourceBundle(n,e)||!this.services.backendConnector.backend||this.options.resources&&!this.options.partialBundledLanguages||a(n,e)&&(!r||a(i,e)))}loadNamespaces(e,t){let n=g();return this.options.ns?(h(e)&&(e=[e]),e.forEach(e=>{this.options.ns.includes(e)||this.options.ns.push(e)}),this.loadResources(e=>{n.resolve(),t&&t(e)}),n):(t&&t(),Promise.resolve())}loadLanguages(e,t){let n=g();h(e)&&(e=[e]);let r=this.options.preload||[],i=e.filter(e=>!r.includes(e)&&this.services.languageUtils.isSupportedCode(e));return i.length?(this.options.preload=r.concat(i),this.loadResources(e=>{n.resolve(),t&&t(e)}),n):(t&&t(),Promise.resolve())}dir(e){if(e||=this.resolvedLanguage||(this.languages?.length>0?this.languages[0]:this.language),!e)return`rtl`;try{let t=new Intl.Locale(e);if(t&&t.getTextInfo){let e=t.getTextInfo();if(e&&e.direction)return e.direction}}catch{}let t=`ar.shu.sqr.ssh.xaa.yhd.yud.aao.abh.abv.acm.acq.acw.acx.acy.adf.ads.aeb.aec.afb.ajp.apc.apd.arb.arq.ars.ary.arz.auz.avl.ayh.ayl.ayn.ayp.bbz.pga.he.iw.ps.pbt.pbu.pst.prp.prd.ug.ur.ydd.yds.yih.ji.yi.hbo.men.xmn.fa.jpr.peo.pes.prs.dv.sam.ckb`.split(`.`),n=this.services?.languageUtils||new R(W());return e.toLowerCase().indexOf(`-latn`)>1?`ltr`:t.includes(n.getLanguagePartFromCode(e))||e.toLowerCase().indexOf(`-arab`)>1?`rtl`:`ltr`}static createInstance(t={},n){let r=new e(t,n);return r.createInstance=e.createInstance,r}cloneInstance(t={},n=K){let r=t.forkResourceStore;r&&delete t.forkResourceStore;let i={...this.options,...t,isClone:!0},a=new e(i);if((t.debug!==void 0||t.prefix!==void 0)&&(a.logger=a.logger.clone(t)),[`store`,`services`,`language`].forEach(e=>{a[e]=this[e]}),a.services={...this.services},a.services.utils={hasLoadedNamespace:a.hasLoadedNamespace.bind(a)},r&&(a.store=new oe(Object.keys(this.store.data).reduce((e,t)=>(e[t]={...this.store.data[t]},e[t]=Object.keys(e[t]).reduce((n,r)=>(n[r]={...e[t][r]},n),e[t]),e),{}),i),a.services.resourceStore=a.store),t.interpolation){let e={...W().interpolation,...this.options.interpolation,...t.interpolation},n={...i,interpolation:e};a.services.interpolator=new H(n)}return a.translator=new L(a.services,i),a.translator.on(`*`,(e,...t)=>{a.emit(e,...t)}),a.init(i,n),a.translator.options=i,a.translator.backendConnector.services.utils={hasLoadedNamespace:a.hasLoadedNamespace.bind(a)},a}toJSON(){return{options:this.options,store:this.store,language:this.language,languages:this.languages,resolvedLanguage:this.resolvedLanguage}}}.createInstance();q.createInstance,q.dir,q.init,q.loadResources,q.reloadResources,q.use,q.changeLanguage,q.getFixedT,q.t,q.exists,q.setDefaultNamespace,q.hasLoadedNamespace,q.loadNamespaces,q.loadLanguages;var _e=`6.1.6`,ve={"Opus 4.6":`hsl(262, 60%, 55%)`,"Opus 4.5":`hsl(340, 55%, 52%)`,"Sonnet 4.6":`hsl(215, 70%, 55%)`,"Sonnet 4.5":`hsl(160, 50%, 42%)`,"Haiku 4.5":`hsl(35, 80%, 52%)`,"GPT-5.4":`hsl(12, 78%, 56%)`,"GPT-5":`hsl(12, 78%, 56%)`,"Gemini 3 Flash Preview":`hsl(48, 92%, 50%)`,Gemini:`hsl(48, 92%, 50%)`,OpenCode:`hsl(186, 58%, 48%)`},ye={"Opus 4.6":{input:15,output:75,cacheRead:1.5,cacheWrite:18.75},"Opus 4.5":{input:15,output:75,cacheRead:1.5,cacheWrite:18.75},"Sonnet 4.6":{input:3,output:15,cacheRead:.3,cacheWrite:3.75},"Sonnet 4.5":{input:3,output:15,cacheRead:.3,cacheWrite:3.75},"Haiku 4.5":{input:.8,output:4,cacheRead:.08,cacheWrite:1},"GPT-5.4":{input:0,output:0,cacheRead:0,cacheWrite:0},"GPT-5":{input:0,output:0,cacheRead:0,cacheWrite:0},"Gemini 3 Flash Preview":{input:0,output:0,cacheRead:0,cacheWrite:0},Gemini:{input:0,output:0,cacheRead:0,cacheWrite:0},OpenCode:{input:0,output:0,cacheRead:0,cacheWrite:0}},be={app:{name:`TTDash`,language:`Sprache`,languages:{de:`Deutsch`,en:`Englisch`}},header:{import:`Import`,upload:`Upload`,limits:`Limits`,settings:`Einstellungen`,report:`Report`,csv:`CSV`,delete:`Löschen`,help:`Hilfe & Tastenkürzel`,loaded:`Geladen`,loadedAt:`Zuletzt geladen: {{time}}`,autoLoadActive:`Auto-Load beim Start`,autoLoadAt:`Beim Start automatisch geladen: {{time}}`},emptyState:{description:"Lade ein `toktrack`- oder Legacy-JSON hoch oder starte den lokalen Auto-Import mit lokalem `toktrack`, `bunx toktrack daily --json` oder `npx --yes toktrack daily --json`.",autoImport:`Auto-Import`,uploadFile:`Datei hochladen`,openSettings:`Einstellungen & Backups`,or:`oder`},viewModes:{daily:`Tagesansicht`,monthly:`Monatsansicht`,yearly:`Jahresansicht`},periods:{day:`Tag`,days:`Tage`,month:`Monat`,months:`Monate`,year:`Jahr`,years:`Jahre`,unitDay:`Tag`,unitMonth:`Mt.`,unitYear:`Jahr`},common:{all:`Alle`,none:`Keine`,reset:`Reset`,notAvailable:`n/v`,noData:`Keine Daten`,generated:`Generiert`,view:`Ansicht`,dateRange:`Zeitraum`,month:`Monat`,provider:`Anbieter`,providers:`Anbieter`,model:`Modell`,models:`Modelle`,cost:`Kosten`,costs:`Kosten`,tokens:`Tokens`,requests:`Requests`,today:`Heute`,currentMonth:`Monat`,yes:`Ja`,no:`Nein`,enabled:`Aktiv`,disabled:`Inaktiv`,visible:`Sichtbar`,hidden:`Versteckt`,open:`Öffnen`,close:`Schliessen`,previousMonth:`Vorheriger Monat`,nextMonth:`Nächster Monat`,startDate:`Startdatum`,endDate:`Enddatum`,selectedProviders:`Ausgewählte Provider`,selectedModels:`Ausgewählte Modelle`,allProviders:`Alle Anbieter`,allModels:`Alle Modelle`,allMonths:`Alle Monate`,noFilter:`Kein Filter`,focusMonth:`Fokusmonat`,showInfo:`Info anzeigen`,expand:`Vergrössern`,input:`Input`,output:`Output`,cacheWrite:`Cache Write`,cacheRead:`Cache Read`,thinking:`Thinking`,requestsShort:`Req`,request:`Request`,share:`Anteil`,top:`Top`},filterBar:{status:`Filterstatus`,providersActive:`{{count}} Anbieter aktiv`,modelsActive:`{{count}} Modelle aktiv`,dateFilterActive:`Datumsfilter aktiv`,presets:{"7d":`7T`,"30d":`30T`,month:`Monat`,year:`Jahr`,all:`Alle`},until:`bis`,resetDateRange:`Zeitraum zurücksetzen`,resetAll:`Alles zurücksetzen`,providers:`Anbieter`,models:`Modelle`,resetModels:`Modelle zurücksetzen`},dashboard:{insights:{title:`Insights`,badge:`Verdichtete Signale`,description:`Konzentrierte Aussagen aus Kosten-, Modell- und Request-Daten`,quickRead:`Quick Read`},metrics:{title:`Metriken`,badge:`10 Kennzahlen`,description:`Wichtigste KPIs im Überblick`},activity:{title:`Aktivität`,dailyDescription:`Tägliche Nutzungsübersicht`,monthlyDescription:`Monatliche Nutzungsübersicht`,yearlyDescription:`Jährliche Nutzungsübersicht`},forecastCache:{title:`Prognose & Cache`,description:`Kostenprognose und Cache-Effizienz`},costAnalysis:{title:`Kostenanalyse`,description:`Detaillierte Kostenaufschlüsselung`},tokenAnalysis:{title:`Token-Analyse`,description:`Verbrauch nach Token-Typ`},requestAnalysis:{title:`Request-Analyse`,description:`Requests gesamt, pro Modell und im Verlauf`},advancedAnalysis:{title:`Verteilungen & Risiko`,description:`Zusätzliche Signale zu Streuung, Korrelation und Abhängigkeiten`},comparisons:{title:`Vergleiche & Anomalien`,description:`Periodenvergleich und Ausreisser`},tables:{title:`Tabellen`,description:`Detaillierte Aufschlüsselungen`},cards:{periodComparison:`Periodenvergleich`,anomalyDetection:`Anomalie-Erkennung`,costForecast:`Kostenprognose`,cacheRoi:`Cache ROI`},stats:{min:`Min`,max:`Max`,avg:`Ø`,cacheHitRate:`Cache-Hit-Rate`,totalTokens:`Gesamt-Tokens`,cacheRead:`Cache Read`,dataPoints:`Datenpunkte`,avgCostPerUnit:`Ø Kosten/{{unit}}`,total:`Gesamt`,avgPerUnit:`Ø / {{unit}}`}},metricCards:{primary:{totalCost:`Gesamtkosten`,totalTokens:`Gesamt-Tokens`,activeDays:`Aktive Tage`,topModel:`Top Modell`,cacheHitRate:`Cache-Hit-Rate`,costPerMillion:`$/1M Tokens`,requests:`Requests`,thinking:`Thinking`,avgPerPeriod:`{{value}}/{{unit}} im Mittel`,tokensPerRequestAvg:`{{value}} pro Request im Mittel`,coverageOfDays:`{{coverage}} Abdeckung von {{days}} Tagen`,providersActive:`{{count}} Anbieter aktiv`,share:`{{value}} Anteil`,requestLead:`Req-Lead: {{value}}`,allTokensViaCacheRead:`{{value}} aller Tokens via Cache Read`,requestCountersMissing:`Keine Request-Zähler im Datensatz`,thinkingShareOfVolume:`{{value}} des gesamten Tokenvolumens`,requestsSubtitle:`Ø {{requests}} / {{unit}} · {{cost}} / Req · σ {{volatility}}`,thinkingSubtitle:`{{share}} Anteil · {{tokens}} / Request`},secondary:{mostExpensiveDay:`Teuerster Tag`,mostExpensiveMonth:`Teuerster Monat`,mostExpensiveYear:`Teuerstes Jahr`,dominantProvider:`Dominanter Anbieter`,peak7Days:`Peak 7 Tage`,avgCostPerUnit:`Ø Kosten/{{unit}}`,spread:`Spanne: {{value}}`,medianPerUnit:`Median/{{unit}}`,vsAverage:`{{direction}}{{value}}% vs. Ø`,vsAverageWithVolatility:`{{direction}}{{value}}% vs. Ø · σ Req {{volatility}}`,medianInfo:`Der Median zeigt den typischen Wert und ist weniger anfällig für Ausreisser als der Durchschnitt.`,requestLeader:`{{model}} · {{requests}} Req`,dominantProviderSubtitle:`{{share}} Anteil · {{cost}}{{requestLeader}}`},today:{title:`Heute — {{date}}`,description:`KPIs des aktuellen Tages`,costToday:`Kosten heute`,tokensToday:`Tokens heute`,models:`Modelle`,costPerMillion:`$/1M Tokens`,cacheHitRate:`Cache-Hit-Rate`,requests:`Requests`,thinking:`Thinking`,vsAverageShort:`vs. Ø`,overallAverage:`Gesamt-Ø: {{value}}`,cacheShare:`{{value}} Cache-Anteil`,requestsToday:`Requests heute`,avgPerDay:`Ø {{value}}/Tag`,ioRatio:`I/O Ratio: {{value}}:1`,topModel:`Top: {{value}}`,requestsSubtitle:`{{value}} / Modell · {{cost}}/Req`,requestCountersMissing:`Keine Request-Zähler`,thinkingSubtitle:`{{value}} Anteil`},month:{title:`Monat — {{date}}`,badge:`{{count}} Tage`,description:`KPIs des laufenden Monats`,costMonth:`Kosten Monat`,tokensMonth:`Tokens Monat`,activeDays:`Aktive Tage`,models:`Modelle`,costPerMillion:`$/1M Tokens`,cacheHitRate:`Cache-Hit-Rate`,requests:`Requests`,thinking:`Thinking`,vsPreviousMonth:`vs. Vormonat`,coverage:`{{value}} Abdeckung`,requestsInMonth:`Requests im Monat`,avgPerDay:`Ø {{value}}/Tag`,ioRatio:`I/O Ratio: {{value}}:1`,topModel:`Top: {{value}}`,cacheMix:`In: {{input}} / Out: {{output}}`,costPerRequest:`{{value}} / Req`,requestsSubtitle:`Ø {{value}}/Tag · {{cost}}/Req`,requestCountersMissing:`Keine Request-Zähler`,thinkingSubtitle:`{{value}} Anteil`}},insights:{concentration:{title:`Kostenkonzentration`,summary:`{{provider}} ist aktuell der dominante Anbieter im gewählten Ausschnitt, während {{model}} den grössten Einzelhebel setzt.`,fallback:`Noch keine stabile Anbieter-Verteilung verfügbar.`,topProvider:`Top Anbieter`,topModel:`Top Modell`,topModelShare:`Top Modell Anteil`,topThreeModels:`Top 3 Modelle`},requestEconomy:{title:`Request-Ökonomie`,valueLabel:`Ø Kosten pro Request`,summary:`Jede Anfrage kostet im Mittel {{cost}} und verarbeitet {{tokens}}. {{leader}}`,leader:`{{model}} führt aktuell beim Request-Volumen.`,fallback:`Der geladene Datensatz enthält keine verlässlichen Request-Zähler. Request-Ökonomie ist deshalb nicht verfügbar.`,avgRequests:`Ø Req/{{unit}}`,avgTokensPerRequest:`Ø Tokens/Req`,costPerMillion:`$/1M Tokens`,totalRequests:`Gesamt Requests`},usagePatterns:{title:`Nutzungsmuster`,summaryWithCoverage:`{{activeDays}} von {{totalDays}} Kalendertagen enthalten Aktivität im gefilterten Zeitraum. Die Requests schwanken dabei um {{volatility}}.`,summaryWithoutCoverage:`{{activeDays}} aktive {{unit}} im gewählten Ausschnitt.`,avgModels:`Ø Modelle/Eintrag`,providersActive:`Anbieter aktiv`,weekendShare:`Wochenend-Anteil`,thinkingShare:`Thinking Anteil`},peakWindow:{title:`Peak-Fenster`,summary:`Stärkste 7-Tage-Phase von {{start}} bis {{end}}.`,fallback:`Kein 7-Tage-Fenster verfügbar, daher Fokus auf den teuersten Einzelwert.`,peakDay:`Peak Tag`,avgPerUnit:`Ø/{{unit}}`,peak7DayAverage:`Peak 7T Ø/Tag`,signal:`Signal`,signalStrong:`stark konzentriert`,signalModerate:`moderat konzentriert`,signalWide:`breit verteilt`},quickRead:{summary:`{{provider}} trägt {{providerShare}} der Kosten, während die Top-3-Modelle {{topThreeShare}} bündeln. {{requestLeader}}`,requestLeader:`{{requestModel}} führt bei den Requests, {{tokenModel}} beim Tokenvolumen.`,fallback:`Für den aktuellen Filterausschnitt sind noch nicht genug Daten für eine stabile Zusammenfassung vorhanden.`}},charts:{costOverTime:{title:`Kosten im Zeitverlauf + 7-Tage Ø`,subtitle:`Tageskosten mit 7-Tage gleitendem Durchschnitt`,summary:`Letzter Wert {{latest}} · Peak {{peak}} am {{date}}`,cost:`Kosten`,movingAverage:`7-Tage Ø`},costByModel:{title:`Kosten nach Modell`,subtitle:`Kostenverteilung nach Modell`,total:`Gesamt`},costByModelOverTime:{title:`Kosten nach Modell im Zeitverlauf`,subtitle:`Pro Modell über die Zeit`,topDriver:`Top Treiber: {{model}} · {{total}} kumuliert`,movingAverageHeading:`7-Tage Durchschnitt pro Modell`,movingAverageSuffix:`Ø`},cumulativeCost:{title:`Kumulative Kosten`,total:`Gesamt: {{value}}`,cumulative:`Kumulativ`,projection:`Projektion`},tokensOverTime:{title:`Tokens im Zeitverlauf`,subtitle:`Alle Token-Typen mit 7-Tage Ø`,allTypes:`Gesamt-Tokens (alle Typen)`,totalTokens:`Gesamt-Tokens`,movingAverage:`7-Tage Ø`,cacheTokens:`Cache Tokens`,inputOutputTokens:`Input / Output Tokens`,thinkingTokens:`Thinking Tokens`,averageSuffix:`Ø`},requestsOverTime:{title:`Requests im Zeitverlauf`,subtitle:`Requests gesamt, nach Modell und mit 7-Tage-Ø`,summary:`Gesamt {{total}} · Peak {{peak}} am {{date}}`,averagePerUnit:`Ø / {{unit}}`,trend:`Trend Ø`,movingAverage:`7-Tage Ø`,trendHeading:`Gleitender Durchschnitt pro Modell`,movingAverageHeading:`7-Tage Durchschnitt pro Modell`,totalMovingAverage:`Gesamt {{label}}`,requestsByModelTotal:`Requests nach Modell gesamt`,requestsInRange:`Requests im gewählten Zeitraum`,total:`Gesamt`,topModel:`Top Modell`,topShare:`Top Share`,totalRequestsSeries:`Gesamt-Requests`},requestCacheHitRate:{title:`Cache-Hit-Rate nach Modell`,subtitle:`Gesamt {{total}} · 7-Tage-Ø {{trailing}}`,totalRate:`Gesamt`,trailing7Rate:`7-Tage-Ø`,trendRate:`Trend-Ø`,topModel:`Top Modell`,models:`Modelle`,total:`Gesamt`,timelineHeading:`Cache-Hit-Rate im Zeitverlauf / {{unit}}`,modelBreakdownHeading:`Aktueller Modell-Snapshot`},heatmap:{costTitle:`Kosten-Heatmap`,requestsTitle:`Request-Heatmap`,tokensTitle:`Token-Heatmap`,costEmpty:`Kosten-Heatmap nur in der Tagesansicht verfügbar`,requestsEmpty:`Request-Heatmap nur in der Tagesansicht verfügbar`,tokensEmpty:`Token-Heatmap nur in der Tagesansicht verfügbar`,switchToDaily:`Wechsle zur Tagesansicht für die Kalender-Heatmap`,less:`Weniger`,more:`Mehr`},tokenTypes:{title:`Token-Typen`,subtitle:`Verteilung der Token-Typen`,total:`Gesamt`},modelMix:{title:`Modell-Mix`,subtitle:`Kostenanteil pro Modell über die Zeit`},distribution:{title:`Verteilungen`,requiresData:`Für Verteilungen werden mindestens 2 Datenpunkte im aktuellen Filter benötigt.`,costPerPeriod:`Kosten je {{period}}`,requestsPerPeriod:`Requests je {{period}}`,tokensPerRequest:`Tokens pro Request`,interval:`Intervall`,dataPoints:`Datenpunkte`,buckets:`Buckets`},correlation:{title:`Korrelationen`,requiresData:`Für Korrelationen werden mindestens 2 Datenpunkte im aktuellen Filter benötigt.`,points:`{{count}} Punkte`,requestsVsCost:`Requests vs. Kosten`,cacheVsCostPerRequest:`Cache-Rate vs. $/Req`,requestsAxis:`Requests`,requestsLabel:`Requests`,tokensLabel:`Tokens`,costPerRequestAxis:`$/Req`,cost:`Kosten`,costPerRequest:`Kosten / Req`,cacheRate:`Cache-Rate`,strongRequestCost:`Starker Zusammenhang: Mehr Requests treiben die Kosten sichtbar.`,mediumRequestCost:`Moderater Zusammenhang zwischen Last und Kosten.`,weakRequestCost:`Schwacher Zusammenhang: Kosten werden stärker von Modellmix und Tokenlast geprägt.`,negativeCache:`Negativer Zusammenhang: Höhere Cache-Rate senkt tendenziell die Kosten pro Request.`,neutralCache:`Kaum linearer Effekt: Cache wirkt, aber nicht allein entscheidend.`,positiveCache:`Positiver Zusammenhang: Hohe Cache-Raten fallen hier nicht automatisch mit niedrigen Kosten pro Request zusammen.`},costByWeekday:{title:`Kosten nach Wochentag`,subtitle:`Peak: {{peak}} · Low: {{low}} · Wochenende {{share}}`,averageCost:`Ø Kosten`},tokenEfficiency:{title:`Token-Effizienz ($/1M)`,subtitle:`Ø {{value}}/1M Tokens`,series:`$/1M Tokens`,movingAverage:`7T-Ø`}},risk:{title:`Konzentrationsrisiko`,modelDependency:`Modell-Abhängigkeit`,providerDependency:`Provider-Abhängigkeit`,high:`hoch`,medium:`mittel`,low:`niedrig`,modelHint:`HHI {{value}} · Hohe Werte sprechen für wenige dominante Modelle.`,providerHint:`HHI {{value}} · Zeigt die Abhängigkeit von einzelnen Anbietern.`},requestQuality:{title:`Request-Qualität`,tokensPerRequest:`Tokens / Request`,costPerRequest:`Kosten / Request`,cachePerRequest:`Cache / Request`,thinkingPerRequest:`Thinking / Request`,tokensHint:`Durchschnittliche Tokenlast pro Anfrage`,costHint:`Direkte Kosten pro Anfrage`,cacheHint:`Gelesene Cache-Tokens pro Anfrage`,thinkingHint:`Thinking-Tokens pro Anfrage`,requestDensity:`Request-Dichte`,averagePerActiveUnit:`Ø pro aktivem {{unit}}`,cacheHitRate:`Cache-Hit-Rate`,cacheHitHint:`Direkt aus Cache-Read relativ zu allen Tokens`,inputOutput:`Input / Output`,inputOutputHint:`Drift zwischen eingehenden und erzeugten Tokens`,topRequestModel:`Top Request-Modell`,noRequestLeader:`Kein Request-Leader`},forecast:{noData:`Keine Daten verfügbar`,noForecast:`Keine Prognose verfügbar`,requiresTwoDays:`Mindestens 2 Tage mit Daten benötigt`,avgMonthlyCost:`Ø Monatskosten`,avgYearlyCost:`Ø Jahreskosten`,totalOverPeriods:`Gesamt: {{total}} über {{count}} {{unit}}`,monthEndForecast:`Prognose Monatsende`,low:`niedrig`,medium:`mittel`,high:`hoch`,soFar:`Bisher: {{value}}`,remainingDays:`Resttage: {{count}}`,projectedPerDay:`Prognose {{value}}/Tag`,vsLastWeek:`vs. Vorwoche`,chartTitle:`Kostenprognose aktueller Monat`,chartSubtitle:`Monatsend-Prognose auf Basis geglätteter Kalender-Tageskosten`,lowerBound:`Untere Spanne`,uncertaintyBand:`Unsicherheitsband`,actualCost:`Ist-Kosten`,projection:`Prognose`},cacheRoi:{title:`Cache-Ersparnis (ROI)`,noData:`Keine Daten verfügbar`,heuristicFallback:`Für {{count}} {{modelsLabel}} ohne hinterlegte Preistabelle nutzt die ROI-Schätzung einen Heuristik-Fallback.`,model:`Modell`,models:`Modelle`,withoutCache:`Ohne Cache`,withCache:`Mit Cache`,withCacheActual:`Mit Cache (tatsächlich)`,savings:`Ersparnis`,avgCostPerUnit:`Ø Kosten/{{unit}}`,paid:`Bezahlt`,saved:`Gespart`},comparison:{title:`Perioden-Vergleich`,notEnoughData:`Nicht genügend Daten für einen Vergleich`,requiresDays:`Mindestens 7 Tage benötigt (aktuell: {{count}})`,thisWeek:`Diese Woche`,lastWeek:`Letzte Woche`,thisMonth:`Dieser Monat`,lastMonth:`Letzter Monat`,week:`Woche`,month:`Monat`,metric:`Metrik`,delta:`Delta`,cost:`Kosten`,tokens:`Tokens`,avgPerDay:`Ø/Tag`,cacheRate:`Cache-Rate`,days:`Tage`},anomaly:{title:`Auffällige {{period}}`,none:`Keine Anomalien erkannt`,withinStdDev:`Alle Kosten liegen innerhalb von 2 Standardabweichungen`,description:`{{period}} mit Kosten >2 Standardabweichungen vom Mittelwert ({{mean}} ± {{stdDev}})`,critical:`kritisch`},tables:{modelEfficiency:{title:`Modell-Effizienz`,count:`{{count}} Modelle`,topModel:`Top Modell`,mostEfficient:`Effizientestes Modell`,totalRequests:`Gesamt-Requests`,topModelTokens:`Top Modell Tokens`,share:`{{value}} Anteil`,perModel:`{{value}} / Modell`,more:`+{{count}} weitere`,model:`Modell`,cost:`Kosten`,tokens:`Tokens`,shareShort:`Anteil`,req:`Req`,reqShare:`Req %`,costPerReq:`$ / Req`,tokensPerReq:`Tokens / Req`,cacheShare:`Cache %`,thinkingShare:`Think %`,avgPerUnit:`Ø/{{unit}}`},providerEfficiency:{title:`Provider-Effizienz`,count:`{{count}} Anbieter`,leadProvider:`Lead Provider`,mostEfficient:`Effizientester Provider`,totalRequests:`Gesamt-Requests`,share:`{{value}} Anteil`,perProvider:`{{value}} / Anbieter`,avgPerUnit:`Ø/{{unit}}`,provider:`Provider`,cost:`Kosten`,shareShort:`Anteil`,req:`Req`,tokens:`Tokens`,costPerReq:`$ / Req`,costPerMillion:`$/1M`,cacheShare:`Cache %`},recentDays:{daysDetail:`Letzte Tage im Detail`,monthsDetail:`Monate im Detail`,yearsDetail:`Jahre im Detail`,showing:`Zeige {{shown}} von {{total}} {{unit}}`,showLess:`Weniger anzeigen`,showAll:`Alle anzeigen`,totalCost:`Gesamtkosten`,totalTokens:`Gesamt-Tokens`,requests:`Requests`,cacheReadShare:`Cache Read Anteil`,peak:`Peak`,previousDay:`Vortag`,avg7d:`7T-Ø`,reqAvg:`Req-Ø`,date:`Datum`,cost:`Kosten`,tokens:`Tokens`,models:`Modelle`}},helpPanel:{chartsAndFeatures:`Charts & Features`,metricLabels:{totalCost:`Gesamtkosten`,totalTokens:`Tokens gesamt`,activeDays:`Aktive Tage`,topModel:`Top-Modell`,cacheHitRate:`Cache-Hit-Rate`,costPerMillion:`Kosten / 1M Tokens`,mostExpensiveDay:`Teuerster Tag`,cheapestDay:`Günstigster Tag`,avgCostPerDay:`Ø Kosten / Tag`,outputTokens:`Output-Tokens`},chartLabels:{costOverTime:`Kosten über Zeit`,costByModel:`Kosten nach Modell`,costByModelOverTime:`Kosten/Modell über Zeit`,cumulativeCost:`Kumulative Kosten`,costByWeekday:`Kosten nach Wochentag`,tokensOverTime:`Tokens über Zeit`,requestsOverTime:`Requests im Zeitverlauf`,requestCacheHitRate:`Cache-Hit-Rate nach Modell`,tokenTypes:`Token-Typen`,tokenEfficiency:`Token-Effizienz`,modelMix:`Modell-Mix`,distributionAnalysis:`Verteilungen`,correlationAnalysis:`Korrelationen`,heatmap:`Kosten-Heatmap`,requestHeatmap:`Request-Heatmap`,tokenHeatmap:`Token-Heatmap`,forecast:`Prognose`,cacheROI:`Cache-ROI`,periodComparison:`Periodenvergleich`,anomalyDetection:`Anomalie-Erkennung`},sectionLabels:{insights:`Insights`,metrics:`Metriken`,today:`Heute`,currentMonth:`Monat`,activity:`Aktivität`,forecastCache:`Prognose & Cache`,costAnalysis:`Kostenanalyse`,tokenAnalysis:`Token-Analyse`,requestAnalysis:`Request-Analyse`,advancedAnalysis:`Verteilungen & Risiko`,comparisons:`Vergleiche & Anomalien`,tables:`Tabellen`,limits:`Limits & Subscriptions`},featureLabels:{requestQuality:`Request-Qualität`,providerLimits:`Limits & Subscriptions`,concentrationRisk:`Konzentrationsrisiko`,providerEfficiency:`Provider-Effizienz`,modelEfficiency:`Modell-Effizienz`,recentDays:`Zeiträume im Detail`}},autoImportModal:{title:`Toktrack Auto-Import`,description:"Importiert lokale Nutzungsdaten automatisch via lokalem `toktrack`, `bunx` oder `npm exec` und speichert sie nur auf diesem Gerät.",connecting:`Verbinde...`,checkingTool:`Prüfe {{tool}}...`,toolFound:`{{tool}} gefunden ({{method}}, v{{version}})`,toolNotFound:`{{tool}} nicht gefunden`,importedDays:`{{days}} Tage importiert ({{cost}} USD)`,checkingPrerequisites:`Prüfe Voraussetzungen...`,importingData:`Importiere Daten...`,startingLocalImport:`Starte lokalen toktrack-Import...`,loadingUsageData:`Lade Nutzungsdaten via {{command}}...`,processingUsageData:`Verarbeite Nutzungsdaten... ({{seconds}}s)`,serverConnectionLost:`Verbindung zum Server verloren.`,autoImportRunning:`Ein Auto-Import läuft bereits. Bitte warten.`,noRunnerFound:`Kein lokales toktrack, Bun oder npm exec gefunden.`,errorPrefix:`Fehler: {{message}}`,loadedDays:`{{days}} Tage geladen ({{cost}} USD)`,errorOccurred:`Fehler aufgetreten`,close:`Schliessen`},commandPalette:{title:`Command Palette`,description:`Tastaturgesteuerte Befehlsauswahl für Navigation und Aktionen im ttdash Dashboard.`,placeholder:`Befehl suchen...`,empty:`Kein Befehl gefunden.`,groups:{actions:`Aktionen`,filters:`Filter & Ansicht`,navigation:`Navigation`,view:`Ansicht`,language:`Sprache`,help:`Hilfe`,providers:`Anbieter`,models:`Modelle`},commands:{autoImport:{label:`Auto-Import starten`,description:`Lokalen toktrack Import ausführen`},openSettings:{label:`Einstellungen öffnen`,description:`Backups, App-Optionen und Provider Limits verwalten`},exportCsv:{label:`CSV exportieren`,description:`Aktuell gefilterte Daten exportieren`},generateReport:{label:`PDF-Report generieren`,labelLoading:`PDF-Report wird generiert`,description:`Aktuell gefilterte Daten als PDF exportieren`},upload:{label:`JSON hochladen`,description:`toktrack oder Legacy JSON importieren`},delete:{label:`Daten löschen`,description:`Lokalen Datensatz entfernen`},viewDaily:{label:`Zur Tagesansicht wechseln`,description:`Daten pro Tag anzeigen`},viewMonthly:{label:`Zur Monatsansicht wechseln`,description:`Daten pro Monat anzeigen`},viewYearly:{label:`Zur Jahresansicht wechseln`,description:`Daten pro Jahr anzeigen`},preset7d:{label:`Zeitraum: letzte 7 Tage`,description:`Setzt den Datumsfilter auf 7 Tage`},preset30d:{label:`Zeitraum: letzte 30 Tage`,description:`Setzt den Datumsfilter auf 30 Tage`},presetMonth:{label:`Zeitraum: aktueller Monat`,description:`Setzt den Datumsfilter auf den laufenden Monat`},presetYear:{label:`Zeitraum: aktuelles Jahr`,description:`Setzt den Datumsfilter auf das laufende Jahr`},presetAll:{label:`Zeitraum: alle Daten`,description:`Entfernt Preset-Zeitraumfilter`},clearProviders:{label:`Anbieterfilter zurücksetzen`,description:`Alle aktiven Anbieterfilter entfernen`},clearModels:{label:`Modellfilter zurücksetzen`,description:`Alle aktiven Modellfilter entfernen`},clearDates:{label:`Datumsfilter zurücksetzen`,description:`Start- und Enddatum entfernen`},resetAll:{label:`Alle Filter zurücksetzen`,description:`Den Standardzustand der Dashboard-Filter wiederherstellen`},scrollTop:{label:`Nach oben scrollen`,description:`Zum Seitenanfang springen`},scrollBottom:{label:`Nach unten scrollen`,description:`Zum Seitenende springen`},filters:{label:`Zu Filtern`,description:`Springt zur Filterleiste`},goToSection:{label:`Zu {{section}}`,description:`Springt zur Sektion {{section}}`},insights:{label:`Zu Insights`,description:`Springt zur Executive Summary`},metrics:{label:`Zu Metriken`,description:`Springt zu den KPI-Karten`},today:{label:`Zu Heute`,description:`Springt zu den KPIs des aktuellen Tages`},month:{label:`Zu Monat`,description:`Springt zu den KPIs des aktuellen Monats`},activity:{label:`Zu Aktivität`,description:`Springt zur Aktivitäts-Heatmap`},forecastCache:{label:`Zu Prognose & Cache`,description:`Springt zu Forecast und Cache ROI`},limits:{label:`Zu Limits & Subscriptions`,description:`Springt zur Limits-Sektion`},charts:{label:`Zu Kostenanalyse`,description:`Springt zu den Kostencharts`},tokenAnalysis:{label:`Zu Token-Analyse`,description:`Springt zu Token-Charts und Verteilungen`},requestAnalysis:{label:`Zu Request-Analyse`,description:`Springt zu Requests im Zeitverlauf und Request-Verteilung`},comparisons:{label:`Zu Vergleiche & Anomalien`,description:`Springt zu Periodenvergleich und Auffälligkeiten`},tables:{label:`Zu Tabellen`,description:`Springt zu den Detailtabellen`},themeLight:{label:`Light Mode aktivieren`,description:`Zwischen hellem und dunklem Theme wechseln`},themeDark:{label:`Dark Mode aktivieren`,description:`Zwischen hellem und dunklem Theme wechseln`},languageGerman:{label:`Auf Deutsch wechseln`,description:`Die Dashboard-Sprache auf Deutsch umstellen`},languageEnglish:{label:`Auf Englisch wechseln`,description:`Die Dashboard-Sprache auf Englisch umstellen`},help:{label:`Hilfe & Tastenkürzel öffnen`,description:`Öffnet die Hilfeübersicht`}}},settings:{modal:{title:`Einstellungen`,description:`Verwalte App-Backups, gespeicherte Daten und Provider Limits an einem Ort.`,dataStatus:`Datenstatus`,lastLoaded:`Zuletzt geladen`,loadedVia:`Geladen über`,cliAutoLoad:`CLI Auto-Load`,defaultFiltersTitle:`Standardfilter fürs Dashboard`,defaultFiltersDescription:`Lege den Filterzustand fest, der beim Öffnen des Dashboards und beim Zurücksetzen verwendet wird.`,defaultViewMode:`Standardansicht`,defaultDateRange:`Standardzeitraum`,filterProviders:`Standard-Anbieterfilter`,filterModels:`Standard-Modellfilter`,noModels:`Keine Modelle im geladenen Report gefunden.`,sectionVisibilityTitle:`Sichtbare Dashboard-Sektionen`,sectionVisibilityDescription:`Steuere, welche Sektionen im Dashboard gerendert werden und in welcher Reihenfolge sie erscheinen.`,sectionOrderHint:`Ziehe die Sektionen per Drag and Drop in die gewünschte Reihenfolge. Die aktuelle Reihenfolge ist das Standardlayout.`,positionLabel:`Position {{position}} von {{total}}`,moveSectionUp:`{{section}} nach oben verschieben`,moveSectionDown:`{{section}} nach unten verschieben`,settingsBackupTitle:`Einstellungen sichern`,settingsBackupDescription:`Exportiert und importiert Sprache, Theme, Limits und die gespeicherten Lade-Metadaten als versioniertes Backup.`,dataBackupTitle:`Daten sichern`,dataBackupDescription:`Exportiert den lokal gespeicherten Nutzungsstand als Backup und importiert Backups konservativ zurück.`,dataImportPolicy:`Beim Datenimport werden nur fehlende Tage ergänzt. Bestehende Tage mit abweichenden Werten bleiben lokal erhalten und werden als Konflikt gemeldet.`,dataImportReplaceHint:`Wenn du einen Datensatz vollständig ersetzen willst, nutze weiter den normalen JSON-Upload im Header.`,providerLimitsTitle:`Provider Limits`,providerLimitsDescription:`Definiere Subscription und Monatslimit pro Anbieter. Nur Anbieter aus dem aktuell geladenen Report sind editierbar.`,noProviders:`Keine Anbieter im geladenen Report gefunden.`,exportSettings:`Einstellungen exportieren`,importSettings:`Einstellungen importieren`,exportData:`Daten exportieren`,importData:`Daten importieren`,close:`Schliessen`,save:`Speichern`,viewModes:{daily:`Täglich`,monthly:`Monatlich`,yearly:`Jährlich`},datePresets:{all:`Alle Daten`,"7d":`Letzte 7 Tage`,"30d":`Letzte 30 Tage`,month:`Aktueller Monat`,year:`Aktuelles Jahr`},sources:{file:`Datei-Upload`,"auto-import":`Auto-Import`,"cli-auto-load":`CLI Auto-Load`,unknown:`Unbekannt`}}},limits:{sectionTitle:`Limits & Subscriptions`,sectionDescription:`Budget-Risiko getrennt von Subscription-Wirkung im aktuellen Filterkontext`,providersBadge:`{{count}} Anbieter`,warningBanner:`{{count}} Anbieter haben ihr Monatslimit im aktuellen Ausschnitt erreicht oder überschritten.`,cards:{atLimit:`Anbieter am Limit`,nearLimit:`Nahe am Limit`,subscriptionVolume:`Subscription-Volumen`,subscriptionValue:`Subscription-Mehrwert`,nearLimitHint:`ab 80% Auslastung`,subscriptionVolumeHint:`fixe Kosten / Monat`,subscriptionValueHint:`Usage über Subscription`,noMonth:`Kein Monat`},statuses:{limitExceeded:`Limit überschritten`,budgetTight:`Budget angespannt`,budgetStable:`Budget stabil`,noLimit:`Kein Limit gesetzt`,noSubscription:`Keine Subscription`,subscriptionPaysOff:`Subscription zahlt sich aus`,belowSubscription:`Noch unter Subscription`},badge:{limit:`{{value}}% Limit`,subscription:`{{value}}% Abo`,open:`Offen`},tracks:{budgetTitle:`Budget-Status je Anbieter`,budgetSubtitle:`Jeder Track zeigt pro Anbieter direkt den Abstand bis zum Limit oder den bereits eingetretenen Überzug`,budgetNoMonth:`Kein Monat im aktuellen Ausschnitt`,subscriptionTitle:`Subscription-Status je Anbieter`,subscriptionSubtitle:`Jeder Track zeigt pro Anbieter direkt den Abstand zum Break-even oder den bereits erreichten Mehrwert`,subscriptionNoMonth:`Kein Monat im aktuellen Ausschnitt`,portfolioTitle:`Portfolio-Entwicklung`,portfolioSubtitle:`Monatlicher Verlauf von Usage, konfigurierten Limits und Subscription-Wirkung`,usage:`Usage`,limit:`Limit`,limits:`Limits`,subscription:`Subscription`,subscriptions:`Subscriptions`,breakEven:`Break-even`,currentlyUsed:`Aktuell verbraucht`,remainingToLimit:`Bis Limit offen`,alreadyOverLimit:`Schon darüber`,remainingToBreakEven:`Bis Break-even offen`,alreadyAboveBreakEven:`Schon darüber`,usageFocusMonth:`Kosten Fokusmonat`,limitSubscription:`Limit / Subscription`,budgetRisk:`Budget-Risiko`,subscriptionEffect:`Subscription-Wirkung`,stillToLimit:`Noch {{value}} bis zum Limit`,alreadyAboveLimit:`Schon {{value}} über Limit`,stillToBreakEven:`Noch {{value}} bis Break-even`,alreadyAboveBreakEvenText:`Schon {{value}} über Break-even`,noSubscriptionSet:`Keine Subscription gesetzt`},modal:{title:`Provider Limits`,description:`Definiere pro Anbieter Subscription und Monatslimit. Nur Anbieter aus dem aktuell geladenen Report sind editierbar. Ein Limit von 0 bedeutet kein Limit.`,dataStatus:`Datenstatus`,lastLoaded:`Zuletzt geladen`,loadedVia:`Geladen über`,cliAutoLoad:`CLI Auto-Load`,noProviders:`Keine Anbieter im geladenen Report gefunden.`,hasSubscription:`Subscription vorhanden`,subscriptionPerMonth:`Subscription $/Monat`,monthlyLimit:`Monatslimit $`,close:`Schliessen`,save:`Speichern`,sources:{file:`Datei-Upload`,"auto-import":`Auto-Import`,"cli-auto-load":`CLI Auto-Load`,unknown:`Unbekannt`}}},report:{title:`TTDash Report`,common:{notAvailable:`n/v`},header:{eyebrow:`TTDash PDF-Bericht`},summary:{peakPeriod:`Spitzenzeitraum`},sections:{overview:`Überblick`,insights:`Wichtigste Erkenntnisse`,filters:`Filter`,modelsProviders:`Modelle & Provider`,recentPeriods:`Letzte Zeiträume`,interpretation:`Interpretation`},fields:{dateRange:`Zeitraum`,view:`Ansicht`,generated:`Generiert`,month:`Monat`,selectedProviders:`Ausgewählte Provider`,selectedModels:`Ausgewählte Modelle`,startDate:`Startdatum`,endDate:`Enddatum`},filters:{all:`Alle`,noFilter:`Kein Filter`,andMore:`+{{count}} weitere`},tables:{topModels:`Top-Modelle`,providers:`Provider`,columns:{model:`Modell`,provider:`Provider`,cost:`Kosten`,tokens:`Tokens`,requests:`Requests`,period:`Zeitraum`}},charts:{costTrend:`Kostenverlauf`,topModels:`Top-Modelle nach Kosten`,tokenTrend:`Token-Mix pro Zeitraum`},interpretation:{summary:`Dieser Report umfasst {{days}} Rohdaten-Tage und {{periods}} aggregierte Zeiträume. Spitzenzeitraum: {{peak}}. Top-Modell: {{topModel}}. Führender Provider: {{topProvider}}.`,footer:`Erstellt mit TTDash v{{version}} und serverseitiger Typst-Kompilierung.`},insights:{coverageTitle:`Datenbasis`,coverageBody:`Dieser Report basiert auf einer schmalen Datenbasis mit {{days}} Rohdaten-Tagen und {{periods}} aggregierten Zeiträumen. Trend-Aussagen sollten vorsichtig gelesen werden.`,providerTitle:`Provider-Konzentration`,providerBody:`{{provider}} steht für {{share}} der gesamten Report-Kosten.`,cacheTitle:`Cache-Beitrag`,cacheBody:`Cache-Reads machen im gewählten Zeitraum {{share}} der Token-Aktivität aus.`,peakWindowTitle:`Stärkstes 7-Tage-Fenster`,peakWindowBody:`Das stärkste rollierende 7-Tage-Fenster lag zwischen {{start}} und {{end}} mit insgesamt {{cost}} Kosten.`}},api:{fetchUsageFailed:`Fehler beim Laden der Daten`,uploadFailed:`Upload fehlgeschlagen`,deleteFailed:`Löschen fehlgeschlagen`,importUsageFailed:`Datenimport fehlgeschlagen`,importSettingsFailed:`Einstellungs-Import fehlgeschlagen`,pdfFailed:`PDF-Generierung fehlgeschlagen`},toasts:{fileLoaded:`Datei {{name}} erfolgreich geladen`,fileReadFailed:`Datei konnte nicht gelesen werden`,dataDeleted:`Daten gelöscht`,csvExported:`CSV exportiert`,dataImported:`Daten erfolgreich importiert`,settingsExported:`Einstellungs-Backup exportiert`,dataExported:`Daten-Backup exportiert`,noDataToExport:`Keine Daten zum Exportieren vorhanden`,settingsImported:`Einstellungen aus {{name}} importiert`,settingsSaved:`Einstellungen gespeichert`,dataBackupImported:`Backup importiert: {{added}} neue Tage ergänzt, {{unchanged}} identische Tage übersprungen`,dataBackupImportedWithConflicts:`Backup importiert: {{added}} neue Tage ergänzt, {{conflicts}} Konflikttage lokal beibehalten`}},xe={app:{name:`TTDash`,language:`Language`,languages:{de:`German`,en:`English`}},header:{import:`Import`,upload:`Upload`,limits:`Limits`,settings:`Settings`,report:`Report`,csv:`CSV`,delete:`Delete`,help:`Help & shortcuts`,loaded:`Loaded`,loadedAt:`Last loaded: {{time}}`,autoLoadActive:`Auto-load on start`,autoLoadAt:`Automatically loaded on start: {{time}}`},emptyState:{description:"Upload a `toktrack` or legacy JSON file, or start local auto-import with local `toktrack`, `bunx toktrack daily --json`, or `npx --yes toktrack daily --json`.",autoImport:`Auto import`,uploadFile:`Upload file`,openSettings:`Settings & backups`,or:`or`},viewModes:{daily:`Daily view`,monthly:`Monthly view`,yearly:`Yearly view`},periods:{day:`day`,days:`days`,month:`month`,months:`months`,year:`year`,years:`years`,unitDay:`day`,unitMonth:`mo.`,unitYear:`year`},common:{all:`All`,none:`None`,reset:`Reset`,notAvailable:`n/a`,noData:`No data`,generated:`Generated`,view:`View`,dateRange:`Date range`,month:`Month`,provider:`Provider`,providers:`Providers`,model:`Model`,models:`Models`,cost:`Cost`,costs:`Costs`,tokens:`Tokens`,requests:`Requests`,today:`Today`,currentMonth:`Month`,yes:`Yes`,no:`No`,enabled:`Enabled`,disabled:`Disabled`,visible:`Visible`,hidden:`Hidden`,open:`Open`,close:`Close`,previousMonth:`Previous month`,nextMonth:`Next month`,startDate:`Start date`,endDate:`End date`,selectedProviders:`Selected providers`,selectedModels:`Selected models`,allProviders:`All providers`,allModels:`All models`,allMonths:`All months`,noFilter:`No filter`,focusMonth:`Focus month`,showInfo:`Show info`,expand:`Expand`,input:`Input`,output:`Output`,cacheWrite:`Cache write`,cacheRead:`Cache read`,thinking:`Thinking`,requestsShort:`Req`,request:`Request`,share:`Share`,top:`Top`},filterBar:{status:`Filter status`,providersActive:`{{count}} providers active`,modelsActive:`{{count}} models active`,dateFilterActive:`Date filter active`,presets:{"7d":`7D`,"30d":`30D`,month:`Month`,year:`Year`,all:`All`},until:`to`,resetDateRange:`Reset date range`,resetAll:`Reset all`,providers:`Providers`,models:`Models`,resetModels:`Reset models`},dashboard:{insights:{title:`Insights`,badge:`Condensed signals`,description:`Focused signals from cost, model, and request data`,quickRead:`Quick read`},metrics:{title:`Metrics`,badge:`10 metrics`,description:`Core KPIs at a glance`},activity:{title:`Activity`,dailyDescription:`Daily usage overview`,monthlyDescription:`Monthly usage overview`,yearlyDescription:`Yearly usage overview`},forecastCache:{title:`Forecast & Cache`,description:`Cost forecast and cache efficiency`},costAnalysis:{title:`Cost analysis`,description:`Detailed cost breakdown`},tokenAnalysis:{title:`Token analysis`,description:`Usage by token type`},requestAnalysis:{title:`Request analysis`,description:`Requests overall, by model, and over time`},advancedAnalysis:{title:`Distributions & Risk`,description:`Additional signals for spread, correlation, and dependencies`},comparisons:{title:`Comparisons & Anomalies`,description:`Period comparison and outliers`},tables:{title:`Tables`,description:`Detailed breakdowns`},cards:{periodComparison:`Period comparison`,anomalyDetection:`Anomaly detection`,costForecast:`Cost forecast`,cacheRoi:`Cache ROI`},stats:{min:`Min`,max:`Max`,avg:`Avg`,cacheHitRate:`Cache hit rate`,totalTokens:`Total tokens`,cacheRead:`Cache read`,dataPoints:`Data points`,avgCostPerUnit:`Avg cost/{{unit}}`,total:`Total`,avgPerUnit:`Avg / {{unit}}`}},metricCards:{primary:{totalCost:`Total cost`,totalTokens:`Total tokens`,activeDays:`Active days`,topModel:`Top model`,cacheHitRate:`Cache hit rate`,costPerMillion:`$/1M tokens`,requests:`Requests`,thinking:`Thinking`,avgPerPeriod:`{{value}}/{{unit}} avg`,tokensPerRequestAvg:`{{value}} average per request`,coverageOfDays:`{{coverage}} coverage across {{days}} days`,providersActive:`{{count}} providers active`,share:`{{value}} share`,requestLead:`Req lead: {{value}}`,allTokensViaCacheRead:`{{value}} of all tokens via cache read`,requestCountersMissing:`No request counters in the dataset`,thinkingShareOfVolume:`{{value}} of total token volume`,requestsSubtitle:`Avg {{requests}} / {{unit}} · {{cost}} / req · σ {{volatility}}`,thinkingSubtitle:`{{share}} share · {{tokens}} / request`},secondary:{mostExpensiveDay:`Most expensive day`,mostExpensiveMonth:`Most expensive month`,mostExpensiveYear:`Most expensive year`,dominantProvider:`Dominant provider`,peak7Days:`Peak 7 days`,avgCostPerUnit:`Avg cost/{{unit}}`,spread:`Spread: {{value}}`,medianPerUnit:`Median/{{unit}}`,vsAverage:`{{direction}}{{value}}% vs avg`,vsAverageWithVolatility:`{{direction}}{{value}}% vs avg · σ Req {{volatility}}`,medianInfo:`The median shows the typical value and is less sensitive to outliers than the average.`,requestLeader:`{{model}} · {{requests}} req`,dominantProviderSubtitle:`{{share}} share · {{cost}}{{requestLeader}}`},today:{title:`Today — {{date}}`,description:`KPIs for the current day`,costToday:`Cost today`,tokensToday:`Tokens today`,models:`Models`,costPerMillion:`$/1M tokens`,cacheHitRate:`Cache hit rate`,requests:`Requests`,thinking:`Thinking`,vsAverageShort:`vs avg`,overallAverage:`Overall avg: {{value}}`,cacheShare:`{{value}} cache share`,requestsToday:`Requests today`,avgPerDay:`Avg {{value}}/day`,ioRatio:`I/O ratio: {{value}}:1`,topModel:`Top: {{value}}`,requestsSubtitle:`{{value}} / model · {{cost}}/req`,requestCountersMissing:`No request counters`,thinkingSubtitle:`{{value}} share`},month:{title:`Month — {{date}}`,badge:`{{count}} days`,description:`KPIs for the current month`,costMonth:`Month cost`,tokensMonth:`Month tokens`,activeDays:`Active days`,models:`Models`,costPerMillion:`$/1M tokens`,cacheHitRate:`Cache hit rate`,requests:`Requests`,thinking:`Thinking`,vsPreviousMonth:`vs previous month`,coverage:`{{value}} coverage`,requestsInMonth:`Requests this month`,avgPerDay:`Avg {{value}}/day`,ioRatio:`I/O ratio: {{value}}:1`,topModel:`Top: {{value}}`,cacheMix:`In: {{input}} / Out: {{output}}`,costPerRequest:`{{value}} / req`,requestsSubtitle:`Avg {{value}}/day · {{cost}}/req`,requestCountersMissing:`No request counters`,thinkingSubtitle:`{{value}} share`}},insights:{concentration:{title:`Cost concentration`,summary:`{{provider}} is currently the dominant provider in the selected slice, while {{model}} is the strongest single lever.`,fallback:`No stable provider distribution is available yet.`,topProvider:`Top provider`,topModel:`Top model`,topModelShare:`Top model share`,topThreeModels:`Top 3 models`},requestEconomy:{title:`Request economy`,valueLabel:`Avg cost per request`,summary:`Each request costs {{cost}} on average and processes {{tokens}}. {{leader}}`,leader:`{{model}} currently leads on request volume.`,fallback:`The loaded dataset does not contain reliable request counters. Request economy is therefore unavailable.`,avgRequests:`Avg req/{{unit}}`,avgTokensPerRequest:`Avg tokens/req`,costPerMillion:`$/1M tokens`,totalRequests:`Total requests`},usagePatterns:{title:`Usage patterns`,summaryWithCoverage:`{{activeDays}} of {{totalDays}} calendar days contain activity in the filtered range. Requests vary by {{volatility}}.`,summaryWithoutCoverage:`{{activeDays}} active {{unit}} in the selected slice.`,avgModels:`Avg models/entry`,providersActive:`Providers active`,weekendShare:`Weekend share`,thinkingShare:`Thinking share`},peakWindow:{title:`Peak window`,summary:`Strongest 7-day phase from {{start}} to {{end}}.`,fallback:`No 7-day window is available, so the focus falls back to the most expensive single point.`,peakDay:`Peak day`,avgPerUnit:`Avg/{{unit}}`,peak7DayAverage:`Peak 7D avg/day`,signal:`Signal`,signalStrong:`highly concentrated`,signalModerate:`moderately concentrated`,signalWide:`broadly distributed`},quickRead:{summary:`{{provider}} accounts for {{providerShare}} of cost, while the top 3 models concentrate {{topThreeShare}}. {{requestLeader}}`,requestLeader:`{{requestModel}} leads on requests, while {{tokenModel}} leads on token volume.`,fallback:`There is not enough data in the current filter slice for a stable summary yet.`}},charts:{costOverTime:{title:`Cost over time + 7-day avg`,subtitle:`Daily cost with 7-day moving average`,summary:`Latest {{latest}} · Peak {{peak}} on {{date}}`,cost:`Cost`,movingAverage:`7-day avg`},costByModel:{title:`Cost by model`,subtitle:`Cost distribution by model`,total:`Total`},costByModelOverTime:{title:`Cost by model over time`,subtitle:`Per model over time`,topDriver:`Top driver: {{model}} · {{total}} cumulative`,movingAverageHeading:`7-day average by model`,movingAverageSuffix:`avg`},cumulativeCost:{title:`Cumulative cost`,total:`Total: {{value}}`,cumulative:`Cumulative`,projection:`Projection`},tokensOverTime:{title:`Tokens over time`,subtitle:`All token types with 7-day avg`,allTypes:`Total tokens (all types)`,totalTokens:`Total tokens`,movingAverage:`7-day avg`,cacheTokens:`Cache tokens`,inputOutputTokens:`Input / Output tokens`,thinkingTokens:`Thinking tokens`,averageSuffix:`avg`},requestsOverTime:{title:`Requests over time`,subtitle:`Requests overall, by model, and with 7-day avg`,summary:`Total {{total}} · Peak {{peak}} on {{date}}`,averagePerUnit:`Avg / {{unit}}`,trend:`Trend avg`,movingAverage:`7-day avg`,trendHeading:`Moving average by model`,movingAverageHeading:`7-day average by model`,totalMovingAverage:`Total {{label}}`,requestsByModelTotal:`Requests by model total`,requestsInRange:`Requests in the selected range`,total:`Total`,topModel:`Top model`,topShare:`Top share`,totalRequestsSeries:`Total requests`},requestCacheHitRate:{title:`Cache hit rate by model`,subtitle:`Total {{total}} · 7-day avg {{trailing}}`,totalRate:`Total`,trailing7Rate:`7-day avg`,trendRate:`Trend avg`,topModel:`Top model`,models:`Models`,total:`Total`,timelineHeading:`Cache hit rate over time / {{unit}}`,modelBreakdownHeading:`Current model snapshot`},heatmap:{costTitle:`Cost heatmap`,requestsTitle:`Request heatmap`,tokensTitle:`Token heatmap`,costEmpty:`Cost heatmap is only available in daily view`,requestsEmpty:`Request heatmap is only available in daily view`,tokensEmpty:`Token heatmap is only available in daily view`,switchToDaily:`Switch to daily view for the calendar heatmap`,less:`Less`,more:`More`},tokenTypes:{title:`Token types`,subtitle:`Distribution of token types`,total:`Total`},modelMix:{title:`Model mix`,subtitle:`Cost share by model over time`},distribution:{title:`Distributions`,requiresData:`At least 2 data points are required in the current filter for distributions.`,costPerPeriod:`Cost per {{period}}`,requestsPerPeriod:`Requests per {{period}}`,tokensPerRequest:`Tokens per request`,interval:`Interval`,dataPoints:`Data points`,buckets:`Buckets`},correlation:{title:`Correlations`,requiresData:`At least 2 data points are required in the current filter for correlations.`,points:`{{count}} points`,requestsVsCost:`Requests vs. cost`,cacheVsCostPerRequest:`Cache rate vs. $/req`,requestsAxis:`Requests`,requestsLabel:`Requests`,tokensLabel:`Tokens`,costPerRequestAxis:`$/Req`,cost:`Cost`,costPerRequest:`Cost / req`,cacheRate:`Cache rate`,strongRequestCost:`Strong relationship: more requests visibly drive cost.`,mediumRequestCost:`Moderate relationship between load and cost.`,weakRequestCost:`Weak relationship: cost is driven more by model mix and token load.`,negativeCache:`Negative relationship: higher cache rate tends to reduce cost per request.`,neutralCache:`Little linear effect: cache helps, but is not the only driver.`,positiveCache:`Positive relationship: high cache rates do not automatically coincide with lower cost per request here.`},costByWeekday:{title:`Cost by weekday`,subtitle:`Peak: {{peak}} · Low: {{low}} · Weekend {{share}}`,averageCost:`Avg cost`},tokenEfficiency:{title:`Token efficiency ($/1M)`,subtitle:`Avg {{value}}/1M tokens`,series:`$/1M tokens`,movingAverage:`7D avg`}},risk:{title:`Concentration risk`,modelDependency:`Model dependency`,providerDependency:`Provider dependency`,high:`high`,medium:`medium`,low:`low`,modelHint:`HHI {{value}} · Higher values indicate a few dominant models.`,providerHint:`HHI {{value}} · Shows dependency on individual providers.`},requestQuality:{title:`Request quality`,tokensPerRequest:`Tokens / request`,costPerRequest:`Cost / request`,cachePerRequest:`Cache / request`,thinkingPerRequest:`Thinking / request`,tokensHint:`Average token load per request`,costHint:`Direct cost per request`,cacheHint:`Read cache tokens per request`,thinkingHint:`Thinking tokens per request`,requestDensity:`Request density`,averagePerActiveUnit:`Avg per active {{unit}}`,cacheHitRate:`Cache hit rate`,cacheHitHint:`Direct cache-read relative to all tokens`,inputOutput:`Input / Output`,inputOutputHint:`Drift between incoming and generated tokens`,topRequestModel:`Top request model`,noRequestLeader:`No request leader`},forecast:{noData:`No data available`,noForecast:`No forecast available`,requiresTwoDays:`At least 2 days with data are required`,avgMonthlyCost:`Avg monthly cost`,avgYearlyCost:`Avg yearly cost`,totalOverPeriods:`Total: {{total}} over {{count}} {{unit}}`,monthEndForecast:`Month-end forecast`,low:`low`,medium:`medium`,high:`high`,soFar:`So far: {{value}}`,remainingDays:`Days remaining: {{count}}`,projectedPerDay:`Forecast {{value}}/day`,vsLastWeek:`vs last week`,chartTitle:`Current month cost forecast`,chartSubtitle:`Month-end forecast based on smoothed calendar-day cost`,lowerBound:`Lower bound`,uncertaintyBand:`Uncertainty band`,actualCost:`Actual cost`,projection:`Forecast`},cacheRoi:{title:`Cache savings (ROI)`,noData:`No data available`,heuristicFallback:`For {{count}} {{modelsLabel}} without a configured price table, the ROI estimate uses a heuristic fallback.`,model:`model`,models:`models`,withoutCache:`Without cache`,withCache:`With cache`,withCacheActual:`With cache (actual)`,savings:`Savings`,avgCostPerUnit:`Avg cost/{{unit}}`,paid:`Paid`,saved:`Saved`},comparison:{title:`Period comparison`,notEnoughData:`Not enough data for a comparison`,requiresDays:`At least 7 days required (currently: {{count}})`,thisWeek:`This week`,lastWeek:`Last week`,thisMonth:`This month`,lastMonth:`Last month`,week:`Week`,month:`Month`,metric:`Metric`,delta:`Delta`,cost:`Cost`,tokens:`Tokens`,avgPerDay:`Avg/day`,cacheRate:`Cache rate`,days:`Days`},anomaly:{title:`Unusual {{period}}`,none:`No anomalies detected`,withinStdDev:`All costs are within 2 standard deviations`,description:`{{period}} with cost >2 standard deviations from the mean ({{mean}} +/- {{stdDev}})`,critical:`critical`},tables:{modelEfficiency:{title:`Model efficiency`,count:`{{count}} models`,topModel:`Top model`,mostEfficient:`Most efficient model`,totalRequests:`Total requests`,topModelTokens:`Top model tokens`,share:`{{value}} share`,perModel:`{{value}} / model`,more:`+{{count}} more`,model:`Model`,cost:`Cost`,tokens:`Tokens`,shareShort:`Share`,req:`Req`,reqShare:`Req %`,costPerReq:`$ / Req`,tokensPerReq:`Tokens / Req`,cacheShare:`Cache %`,thinkingShare:`Think %`,avgPerUnit:`Avg/{{unit}}`},providerEfficiency:{title:`Provider efficiency`,count:`{{count}} providers`,leadProvider:`Lead provider`,mostEfficient:`Most efficient provider`,totalRequests:`Total requests`,share:`{{value}} share`,perProvider:`{{value}} / provider`,avgPerUnit:`Avg/{{unit}}`,provider:`Provider`,cost:`Cost`,shareShort:`Share`,req:`Req`,tokens:`Tokens`,costPerReq:`$ / Req`,costPerMillion:`$/1M`,cacheShare:`Cache %`},recentDays:{daysDetail:`Recent days in detail`,monthsDetail:`Months in detail`,yearsDetail:`Years in detail`,showing:`Showing {{shown}} of {{total}} {{unit}}`,showLess:`Show less`,showAll:`Show all`,totalCost:`Total cost`,totalTokens:`Total tokens`,requests:`Requests`,cacheReadShare:`Cache read share`,peak:`Peak`,previousDay:`Previous day`,avg7d:`7D avg`,reqAvg:`Req avg`,date:`Date`,cost:`Cost`,tokens:`Tokens`,models:`Models`}},helpPanel:{chartsAndFeatures:`Charts & features`,metricLabels:{totalCost:`Total cost`,totalTokens:`Total tokens`,activeDays:`Active days`,topModel:`Top model`,cacheHitRate:`Cache hit rate`,costPerMillion:`Cost / 1M tokens`,mostExpensiveDay:`Most expensive day`,cheapestDay:`Cheapest day`,avgCostPerDay:`Avg cost / day`,outputTokens:`Output tokens`},chartLabels:{costOverTime:`Cost over time`,costByModel:`Cost by model`,costByModelOverTime:`Cost by model over time`,cumulativeCost:`Cumulative cost`,costByWeekday:`Cost by weekday`,tokensOverTime:`Tokens over time`,requestsOverTime:`Requests over time`,requestCacheHitRate:`Cache hit rate by model`,tokenTypes:`Token types`,tokenEfficiency:`Token efficiency`,modelMix:`Model mix`,distributionAnalysis:`Distributions`,correlationAnalysis:`Correlations`,heatmap:`Cost heatmap`,requestHeatmap:`Request heatmap`,tokenHeatmap:`Token heatmap`,forecast:`Forecast`,cacheROI:`Cache ROI`,periodComparison:`Period comparison`,anomalyDetection:`Anomaly detection`},sectionLabels:{insights:`Insights`,metrics:`Metrics`,today:`Today`,currentMonth:`Month`,activity:`Activity`,forecastCache:`Forecast & Cache`,costAnalysis:`Cost analysis`,tokenAnalysis:`Token analysis`,requestAnalysis:`Request analysis`,advancedAnalysis:`Distributions & Risk`,comparisons:`Comparisons & Anomalies`,tables:`Tables`,limits:`Limits & Subscriptions`},featureLabels:{requestQuality:`Request quality`,providerLimits:`Limits & Subscriptions`,concentrationRisk:`Concentration risk`,providerEfficiency:`Provider efficiency`,modelEfficiency:`Model efficiency`,recentDays:`Periods in detail`}},autoImportModal:{title:`Toktrack auto import`,description:"Automatically imports local usage data via local `toktrack`, `bunx`, or `npm exec` and stores it only on this device.",connecting:`Connecting...`,checkingTool:`Checking {{tool}}...`,toolFound:`{{tool}} found ({{method}}, v{{version}})`,toolNotFound:`{{tool}} not found`,importedDays:`{{days}} days imported ({{cost}} USD)`,checkingPrerequisites:`Checking prerequisites...`,importingData:`Importing data...`,startingLocalImport:`Starting local toktrack import...`,loadingUsageData:`Loading usage data via {{command}}...`,processingUsageData:`Processing usage data... ({{seconds}}s)`,serverConnectionLost:`Lost connection to server.`,autoImportRunning:`An auto import is already running. Please wait.`,noRunnerFound:`No local toktrack, Bun, or npm exec found.`,errorPrefix:`Error: {{message}}`,loadedDays:`{{days}} days loaded ({{cost}} USD)`,errorOccurred:`An error occurred`,close:`Close`},commandPalette:{title:`Command palette`,description:`Keyboard-driven command menu for navigation and actions in the ttdash dashboard.`,placeholder:`Search commands...`,empty:`No command found.`,groups:{actions:`Actions`,filters:`Filters & View`,navigation:`Navigation`,view:`View`,language:`Language`,help:`Help`,providers:`Providers`,models:`Models`},commands:{autoImport:{label:`Start auto import`,description:`Run local toktrack import`},openSettings:{label:`Open settings`,description:`Manage backups, app options, and provider limits`},exportCsv:{label:`Export CSV`,description:`Export currently filtered data`},generateReport:{label:`Generate PDF report`,labelLoading:`Generating PDF report`,description:`Export currently filtered data as PDF`},upload:{label:`Upload JSON`,description:`Import toktrack or legacy JSON`},delete:{label:`Delete data`,description:`Remove local dataset`},viewDaily:{label:`Switch to daily view`,description:`Show data per day`},viewMonthly:{label:`Switch to monthly view`,description:`Show data per month`},viewYearly:{label:`Switch to yearly view`,description:`Show data per year`},preset7d:{label:`Range: last 7 days`,description:`Sets the date filter to 7 days`},preset30d:{label:`Range: last 30 days`,description:`Sets the date filter to 30 days`},presetMonth:{label:`Range: current month`,description:`Sets the date filter to the current month`},presetYear:{label:`Range: current year`,description:`Sets the date filter to the current year`},presetAll:{label:`Range: all data`,description:`Clears preset date filters`},clearProviders:{label:`Reset provider filter`,description:`Remove all active provider filters`},clearModels:{label:`Reset model filter`,description:`Remove all active model filters`},clearDates:{label:`Reset date filter`,description:`Remove start and end date`},resetAll:{label:`Reset all filters`,description:`Restore the default dashboard filter state`},scrollTop:{label:`Scroll to top`,description:`Jump to the top of the page`},scrollBottom:{label:`Scroll to bottom`,description:`Jump to the bottom of the page`},filters:{label:`Go to filters`,description:`Jump to the filter bar`},goToSection:{label:`Go to {{section}}`,description:`Jump to the {{section}} section`},insights:{label:`Go to insights`,description:`Jump to the executive summary`},metrics:{label:`Go to metrics`,description:`Jump to KPI cards`},today:{label:`Go to today`,description:`Jump to the current day KPIs`},month:{label:`Go to month`,description:`Jump to the current month KPIs`},activity:{label:`Go to activity`,description:`Jump to the activity heatmap`},forecastCache:{label:`Go to forecast & cache`,description:`Jump to forecast and cache ROI`},limits:{label:`Go to Limits & Subscriptions`,description:`Jump to the limits section`},charts:{label:`Go to cost analysis`,description:`Jump to cost charts`},tokenAnalysis:{label:`Go to token analysis`,description:`Jump to token charts and distributions`},requestAnalysis:{label:`Go to request analysis`,description:`Jump to requests over time and request distribution`},comparisons:{label:`Go to comparisons & anomalies`,description:`Jump to period comparison and unusual activity`},tables:{label:`Go to tables`,description:`Jump to detailed tables`},themeLight:{label:`Enable light mode`,description:`Switch between light and dark theme`},themeDark:{label:`Enable dark mode`,description:`Switch between light and dark theme`},languageGerman:{label:`Switch to German`,description:`Change the dashboard language to German`},languageEnglish:{label:`Switch to English`,description:`Change the dashboard language to English`},help:{label:`Open help & shortcuts`,description:`Open the help overview`}}},settings:{modal:{title:`Settings`,description:`Manage app backups, stored data, and provider limits in one place.`,dataStatus:`Data status`,lastLoaded:`Last loaded`,loadedVia:`Loaded via`,cliAutoLoad:`CLI auto-load`,defaultFiltersTitle:`Default dashboard filters`,defaultFiltersDescription:`Choose the filter state that should be applied when the dashboard opens or when filters are reset.`,defaultViewMode:`Default view mode`,defaultDateRange:`Default date range`,filterProviders:`Default provider filter`,filterModels:`Default model filter`,noModels:`No models found in the loaded report.`,sectionVisibilityTitle:`Visible dashboard sections`,sectionVisibilityDescription:`Control which sections are rendered in the dashboard and adjust their order.`,sectionOrderHint:`Drag sections to reorder them. The current order is the default dashboard layout.`,positionLabel:`Position {{position}} of {{total}}`,moveSectionUp:`Move {{section}} up`,moveSectionDown:`Move {{section}} down`,settingsBackupTitle:`Back up settings`,settingsBackupDescription:`Export and import language, theme, limits, and stored load metadata as a versioned backup.`,dataBackupTitle:`Back up data`,dataBackupDescription:`Export the locally stored usage state as a backup and import backups conservatively.`,dataImportPolicy:`Data import only adds missing days. Existing days with different values stay local and are reported as conflicts.`,dataImportReplaceHint:`If you want to fully replace the dataset, keep using the regular JSON upload in the header.`,providerLimitsTitle:`Provider limits`,providerLimitsDescription:`Define subscription and monthly limit per provider. Only providers from the currently loaded report can be edited.`,noProviders:`No providers found in the loaded report.`,exportSettings:`Export settings`,importSettings:`Import settings`,exportData:`Export data`,importData:`Import data`,close:`Close`,save:`Save`,viewModes:{daily:`Daily`,monthly:`Monthly`,yearly:`Yearly`},datePresets:{all:`All data`,"7d":`Last 7 days`,"30d":`Last 30 days`,month:`Current month`,year:`Current year`},sources:{file:`File upload`,"auto-import":`Auto import`,"cli-auto-load":`CLI auto-load`,unknown:`Unknown`}}},limits:{sectionTitle:`Limits & Subscriptions`,sectionDescription:`Budget risk separated from subscription impact in the current filter context`,providersBadge:`{{count}} providers`,warningBanner:`{{count}} providers have reached or exceeded their monthly limit in the current slice.`,cards:{atLimit:`Providers at limit`,nearLimit:`Near limit`,subscriptionVolume:`Subscription volume`,subscriptionValue:`Subscription value`,nearLimitHint:`from 80% utilization`,subscriptionVolumeHint:`fixed cost / month`,subscriptionValueHint:`usage above subscription`,noMonth:`No month`},statuses:{limitExceeded:`Limit exceeded`,budgetTight:`Budget tight`,budgetStable:`Budget stable`,noLimit:`No limit set`,noSubscription:`No subscription`,subscriptionPaysOff:`Subscription pays off`,belowSubscription:`Still below subscription`},badge:{limit:`{{value}}% Limit`,subscription:`{{value}}% Sub`,open:`Open`},tracks:{budgetTitle:`Budget status by provider`,budgetSubtitle:`Each track shows the remaining distance to the limit or the already incurred overrun for each provider`,budgetNoMonth:`No month in the current slice`,subscriptionTitle:`Subscription status by provider`,subscriptionSubtitle:`Each track shows the remaining distance to break-even or the already realized value for each provider`,subscriptionNoMonth:`No month in the current slice`,portfolioTitle:`Portfolio trend`,portfolioSubtitle:`Monthly trend of usage, configured limits, and subscription impact`,usage:`Usage`,limit:`Limit`,limits:`Limits`,subscription:`Subscription`,subscriptions:`Subscriptions`,breakEven:`Break-even`,currentlyUsed:`Currently used`,remainingToLimit:`Remaining to limit`,alreadyOverLimit:`Already over`,remainingToBreakEven:`Remaining to break-even`,alreadyAboveBreakEven:`Already above`,usageFocusMonth:`Focus month cost`,limitSubscription:`Limit / Subscription`,budgetRisk:`Budget risk`,subscriptionEffect:`Subscription effect`,stillToLimit:`{{value}} remaining to limit`,alreadyAboveLimit:`{{value}} above limit`,stillToBreakEven:`{{value}} remaining to break-even`,alreadyAboveBreakEvenText:`{{value}} above break-even`,noSubscriptionSet:`No subscription set`},modal:{title:`Provider limits`,description:`Define subscription and monthly limit per provider. Only providers from the currently loaded report can be edited. A limit of 0 means no limit.`,dataStatus:`Data status`,lastLoaded:`Last loaded`,loadedVia:`Loaded via`,cliAutoLoad:`CLI auto-load`,noProviders:`No providers found in the loaded report.`,hasSubscription:`Subscription enabled`,subscriptionPerMonth:`Subscription $/month`,monthlyLimit:`Monthly limit $`,close:`Close`,save:`Save`,sources:{file:`File upload`,"auto-import":`Auto import`,"cli-auto-load":`CLI auto-load`,unknown:`Unknown`}}},report:{title:`TTDash Report`,common:{notAvailable:`n/a`},header:{eyebrow:`TTDash PDF Report`},summary:{peakPeriod:`Peak period`},sections:{overview:`Overview`,insights:`Key insights`,filters:`Filters`,modelsProviders:`Models & Providers`,recentPeriods:`Recent periods`,interpretation:`Interpretation`},fields:{dateRange:`Date range`,view:`View`,generated:`Generated`,month:`Month`,selectedProviders:`Selected providers`,selectedModels:`Selected models`,startDate:`Start date`,endDate:`End date`},filters:{all:`All`,noFilter:`No filter`,andMore:`+{{count}} more`},tables:{topModels:`Top models`,providers:`Providers`,columns:{model:`Model`,provider:`Provider`,cost:`Cost`,tokens:`Tokens`,requests:`Requests`,period:`Period`}},charts:{costTrend:`Cost trend`,topModels:`Top models by cost`,tokenTrend:`Token mix by period`},interpretation:{summary:`This report covers {{days}} raw days and {{periods}} aggregated periods. Peak period: {{peak}}. Top model: {{topModel}}. Leading provider: {{topProvider}}.`,footer:`Created with TTDash v{{version}} and server-side Typst compilation.`},insights:{coverageTitle:`Data coverage`,coverageBody:`This report is based on a narrow slice of data with {{days}} raw days and {{periods}} aggregated periods. Treat trend statements cautiously.`,providerTitle:`Provider concentration`,providerBody:`{{provider}} accounts for {{share}} of total report cost.`,cacheTitle:`Cache contribution`,cacheBody:`Cache reads contribute {{share}} of token activity in the selected period.`,peakWindowTitle:`Peak 7-day window`,peakWindowBody:`The strongest rolling 7-day window ran from {{start}} to {{end}} with {{cost}} total cost.`}},api:{fetchUsageFailed:`Failed to load data`,uploadFailed:`Upload failed`,deleteFailed:`Delete failed`,importUsageFailed:`Data import failed`,importSettingsFailed:`Settings import failed`,pdfFailed:`PDF generation failed`},toasts:{fileLoaded:`File {{name}} loaded successfully`,fileReadFailed:`Could not read file`,dataDeleted:`Data deleted`,csvExported:`CSV exported`,dataImported:`Data imported successfully`,settingsExported:`Settings backup exported`,dataExported:`Data backup exported`,noDataToExport:`No data available to export`,settingsImported:`Imported settings from {{name}}`,settingsSaved:`Settings saved`,dataBackupImported:`Backup imported: added {{added}} new days, skipped {{unchanged}} identical days`,dataBackupImportedWithConflicts:`Backup imported: added {{added}} new days, kept {{conflicts}} conflicting days local`}},Se={de:`de-CH`,en:`en-US`};function Ce(e){return e===`en`?`en`:`de`}async function we(e=`de`){let t=Ce(e);q.isInitialized?q.resolvedLanguage!==t&&await q.changeLanguage(t):await q.use(c).init({resources:{de:{common:be},en:{common:xe}},lng:t,fallbackLng:`de`,defaultNS:`common`,ns:[`common`],interpolation:{escapeValue:!1}}),typeof document<`u`&&(document.documentElement.lang=t)}q.on(`languageChanged`,e=>{typeof document<`u`&&(document.documentElement.lang=e)});function Te(){return Ce(q.language)}function J(){return Se[Te()]}var Y=q,Ee={displayAliases:[{pattern:`(^|-)gpt-5-4$`,name:`GPT-5.4`},{pattern:`(^|-)gpt-5$`,name:`GPT-5`},{pattern:`(^|-)opus-4-6$`,name:`Opus 4.6`},{pattern:`(^|-)opus-4-5$`,name:`Opus 4.5`},{pattern:`(^|-)sonnet-4-6$`,name:`Sonnet 4.6`},{pattern:`(^|-)sonnet-4-5$`,name:`Sonnet 4.5`},{pattern:`(^|-)haiku-4-5$`,name:`Haiku 4.5`},{pattern:`(^|-)gemini-3-flash-preview$`,name:`Gemini 3 Flash Preview`},{pattern:`(^|-)opencode$`,name:`OpenCode`}],providerMatchers:[{pattern:`(^|-)opencode($|-)`,provider:`OpenCode`},{pattern:`openai-codex|(^|-)codex($|-)|(^|-)gpt($|-)|(^|[^a-z0-9])o\\d(?:$|[^a-z0-9])|openai`,provider:`OpenAI`},{pattern:`claude|anthropic|opus|sonnet|haiku`,provider:`Anthropic`},{pattern:`gemini|google|vertex`,provider:`Google`},{pattern:`grok|xai`,provider:`xAI`},{pattern:`llama|meta-llama|meta/`,provider:`Meta`},{pattern:`command|cohere`,provider:`Cohere`},{pattern:`mistral`,provider:`Mistral`},{pattern:`deepseek`,provider:`DeepSeek`},{pattern:`qwen|alibaba`,provider:`Alibaba`}]},De=new Map,Oe=Ee.displayAliases.map(e=>({...e,matcher:new RegExp(e.pattern,`i`)})),ke=Ee.providerMatchers.map(e=>({...e,matcher:new RegExp(e.pattern,`i`)}));function Ae(e){return e&&(/^\d+([.-]\d+)*$/.test(e)?e.replace(/-/g,`.`):/^[a-z]{1,4}\d+$/i.test(e)?e.toUpperCase():e.charAt(0).toUpperCase()+e.slice(1))}function X(e){return e?e.charAt(0).toUpperCase()+e.slice(1):``}function je(e){return e.replace(/-/g,`.`)}function Me(e){let t=String(e||``).trim().toLowerCase().replace(/^model[:/ -]*/i,``).replace(/^(anthropic|openai|google|vertex|models)[/-]/i,``).replace(/\./g,`-`).replace(/[_/]+/g,`-`).replace(/\s+/g,`-`).replace(/-{2,}/g,`-`).replace(/^-|-$/g,``),n=t.lastIndexOf(`-`);if(n>0){let e=t.slice(n+1);if(e.length===8&&e.startsWith(`20`)&&/^\d+$/.test(e))return t.slice(0,n)}return t}function Ne(e){let t=e.split(`-`,2);return t.length<2?`Claude ${X(e)}`:`${X(t[0]??``)} ${je(t[1]??``)}`.trim()}function Pe(e){let t=e.split(`-`),n=t[0]??``,r=t[1]??``;if(r&&r.length<=2&&/^\d+$/.test(r)){let e=`${n}.${r}`;if(t.length>2){let n=t.slice(2).map(X).join(` `);return`GPT-${e}${n?` ${n}`:``}`}return`GPT-${e}`}if(t.length>1){let e=t.slice(1).map(X).join(` `);return`GPT-${n}${e?` ${e}`:``}`}return`GPT-${e}`}function Fe(e){let t=e.split(`-`);if(t.length<2)return`Gemini ${e}`;let n=[],r=[];for(let e of t)/^\d+$/.test(e)&&r.length===0?n.push(e):r.push(X(e));let i=n.join(`.`),a=r.join(` `);return a?`Gemini ${i} ${a}`:`Gemini ${i}`}function Ie(e){let t=e.replace(/-latest$/i,``);return t?`Codex ${t.split(`-`).map(X).join(` `)}`:`Codex`}function Le(e){let t=e.indexOf(`-`);return t===-1?e:`${e.slice(0,t)} ${X(e.slice(t+1))}`}function Re(e){let t=De.get(e);if(t)return t;let n=0;for(let t=0;t<e.length;t++)n=(n<<5)-n+e.charCodeAt(t)|0;let r=`hsl(${Math.abs(n)%360}, ${62+Math.abs(n)%12}%, ${54+Math.abs(n>>3)%8}%)`;return De.set(e,r),r}function ze(e){let t=Me(e);for(let e of Oe)if(e.matcher.test(t))return e.name;if(t.startsWith(`claude-`))return Ne(t.slice(7));if(t.startsWith(`gpt-`))return Pe(t.slice(4));if(t.startsWith(`gemini-`))return Fe(t.slice(7));if(t.startsWith(`codex-`))return Ie(t.slice(6));if(/^o\d/i.test(t))return Le(t);let n=t.match(/^(gpt|opus|sonnet|haiku|gemini|codex|o\d|oai|grok|llama|mistral|command|deepseek|qwen)(?:-([a-z0-9-]+))?$/i);if(n){let e=n[1];if(!e)return t;if(/^codex$/i.test(e))return Ie(n[2]??``);if(/^(o\d)$/i.test(e))return Le(t);let r=n[2]?je(n[2]):``;return/^gpt$/i.test(e)&&r?`GPT-${r.toUpperCase()}`:`${Ae(e)}${r?` ${r}`:``}`.trim()}return t.split(`-`).filter(Boolean).map(Ae).join(` `)||e}function Be(e){let t=Me(e);for(let e of ke)if(e.matcher.test(t))return e.provider;return`Other`}function Ve(e){switch(e){case`OpenAI`:return`bg-emerald-500/10 text-emerald-400 border-emerald-500/20`;case`Anthropic`:return`bg-orange-500/10 text-orange-400 border-orange-500/20`;case`Google`:return`bg-sky-500/10 text-sky-400 border-sky-500/20`;case`xAI`:return`bg-fuchsia-500/10 text-fuchsia-400 border-fuchsia-500/20`;case`Meta`:return`bg-blue-500/10 text-blue-400 border-blue-500/20`;case`Cohere`:return`bg-lime-500/10 text-lime-400 border-lime-500/20`;case`Mistral`:return`bg-amber-500/10 text-amber-300 border-amber-500/20`;case`DeepSeek`:return`bg-teal-500/10 text-teal-300 border-teal-500/20`;case`Alibaba`:return`bg-yellow-500/10 text-yellow-300 border-yellow-500/20`;case`OpenCode`:return`bg-cyan-500/10 text-cyan-400 border-cyan-500/20`;default:return`bg-muted text-muted-foreground border-border`}}function He(e){switch(e){case`OpenAI`:return{color:`rgb(52, 211, 153)`,backgroundColor:`rgba(16, 185, 129, 0.10)`,borderColor:`rgba(16, 185, 129, 0.20)`};case`Anthropic`:return{color:`rgb(251, 146, 60)`,backgroundColor:`rgba(249, 115, 22, 0.10)`,borderColor:`rgba(249, 115, 22, 0.20)`};case`Google`:return{color:`rgb(56, 189, 248)`,backgroundColor:`rgba(14, 165, 233, 0.10)`,borderColor:`rgba(14, 165, 233, 0.20)`};case`xAI`:return{color:`rgb(232, 121, 249)`,backgroundColor:`rgba(217, 70, 239, 0.10)`,borderColor:`rgba(217, 70, 239, 0.20)`};case`Meta`:return{color:`rgb(96, 165, 250)`,backgroundColor:`rgba(59, 130, 246, 0.10)`,borderColor:`rgba(59, 130, 246, 0.20)`};case`Cohere`:return{color:`rgb(163, 230, 53)`,backgroundColor:`rgba(132, 204, 22, 0.10)`,borderColor:`rgba(132, 204, 22, 0.20)`};case`Mistral`:return{color:`rgb(252, 211, 77)`,backgroundColor:`rgba(245, 158, 11, 0.10)`,borderColor:`rgba(245, 158, 11, 0.20)`};case`DeepSeek`:return{color:`rgb(45, 212, 191)`,backgroundColor:`rgba(20, 184, 166, 0.10)`,borderColor:`rgba(20, 184, 166, 0.20)`};case`Alibaba`:return{color:`rgb(250, 204, 21)`,backgroundColor:`rgba(234, 179, 8, 0.10)`,borderColor:`rgba(234, 179, 8, 0.20)`};case`OpenCode`:return{color:`rgb(34, 211, 238)`,backgroundColor:`rgba(6, 182, 212, 0.10)`,borderColor:`rgba(6, 182, 212, 0.20)`};default:return{color:`rgb(148, 163, 184)`,backgroundColor:`rgba(100, 116, 139, 0.10)`,borderColor:`rgba(100, 116, 139, 0.20)`}}}function Ue(e){return ve[e]??Re(e)??`hsl(220, 8%, 56%)`}function We(e){let t=new Set;for(let n of e)for(let e of n)t.add(ze(e));return Array.from(t).sort()}function Ge(e){let t=new Set;for(let n of e)for(let e of n)t.add(Be(e));return Array.from(t).sort()}function Ke(e){return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)}`}function Z(){return Ke(new Date)}function qe(){return Z().slice(0,7)}function Je(e){if(typeof e==`number`)return Number.isFinite(e)?e:null;if(typeof e==`string`){let t=Number(e);return Number.isFinite(t)?t:null}return null}function Ye(e){return e>=1e3?`$${(e/1e3).toFixed(1)}k`:e>=100?`$${Math.round(e)}`:e>=10?`$${e.toFixed(1)}`:`$${e.toFixed(2)}`}function Xe(e){return`$${e.toLocaleString(J(),{minimumFractionDigits:2,maximumFractionDigits:2})}`}function Ze(e){return Number.isFinite(e)?e>=1e9?`${(e/1e9).toFixed(1)}B`:e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}k`:e>=100?e.toFixed(0):e>=10?e.toFixed(1):e>=1?e.toFixed(2):e===0?`0`:e.toFixed(3):`0`}function Q(e){return e.toLocaleString(J())}function Qe(e){return`${e.toLocaleString(J())} ${Y.t(`common.tokens`)}`}function $(e,t=1){return`${e.toFixed(t)}%`}function $e(e,t=`short`){if(/^\d{4}$/.test(e))return e;if(/^\d{4}-\d{2}$/.test(e)){let[n=`0`,r=`1`]=e.split(`-`),i=new Date(parseInt(n,10),parseInt(r,10)-1);return t===`short`?i.toLocaleDateString(J(),{month:`short`,year:`2-digit`}):i.toLocaleDateString(J(),{month:`long`,year:`numeric`})}let n=new Date(e+`T00:00:00`);return t===`long`?n.toLocaleDateString(J(),{weekday:`short`,day:`2-digit`,month:`2-digit`,year:`numeric`}):t===`weekday`?n.toLocaleDateString(J(),{weekday:`short`}):n.toLocaleDateString(J(),{day:`2-digit`,month:`2-digit`})}function et(e){if(/^\d{4}$/.test(e))return e;if(/^\d{4}-\d{2}$/.test(e)){let[t=`0`,n=`1`]=e.split(`-`);return new Date(parseInt(t,10),parseInt(n,10)-1).toLocaleDateString(J(),{month:`short`,year:`2-digit`})}return new Date(e+`T00:00:00`).toLocaleDateString(J(),{day:`2-digit`,month:`2-digit`})}function tt(e,t=!1){return e===`monthly`?Y.t(t?`periods.months`:`periods.month`):e===`yearly`?Y.t(t?`periods.years`:`periods.year`):Y.t(t?`periods.days`:`periods.day`)}function nt(e){return e===`monthly`?Y.t(`periods.unitMonth`):e===`yearly`?Y.t(`periods.unitYear`):Y.t(`periods.unitDay`)}function rt(e){if(!/^\d{4}-\d{2}$/.test(e))return``;let[t=``,n=``]=e.split(`-`),r=Number.parseInt(t,10),i=Number.parseInt(n,10);return!Number.isInteger(r)||!Number.isInteger(i)||i<1||i>12?``:new Date(r,i-1).toLocaleDateString(J(),{month:`long`,year:`numeric`})}function it(e){let t=new Date(e);return Number.isNaN(t.getTime())?``:t.toLocaleString(J(),{day:`2-digit`,month:`2-digit`,hour:`2-digit`,minute:`2-digit`})}function at(e){let t=new Date(e);return Number.isNaN(t.getTime())?``:t.toLocaleString(J(),{day:`2-digit`,month:`2-digit`,year:`numeric`,hour:`2-digit`,minute:`2-digit`})}var ot={currency:e=>Ye(e),tokens:e=>Ze(e),number:e=>Q(e),percent:(e,t)=>$(e,t)},st={currency:e=>Xe(e),tokens:e=>Qe(e),number:e=>Q(e),percent:e=>$(e,4)};function ct({value:e,type:t,className:n,decimals:r,label:i,insight:a}){let o=ot[t](e,r),c=st[t](e);return o===c?(0,u.jsx)(`span`,{className:n,children:o}):(0,u.jsxs)(f,{children:[(0,u.jsx)(p,{asChild:!0,children:(0,u.jsx)(`span`,{className:s(`cursor-help decoration-dotted underline underline-offset-4 decoration-muted-foreground/40`,n),children:o})}),(0,u.jsx)(m,{className:`max-w-[260px]`,children:(0,u.jsxs)(`div`,{className:`space-y-1`,children:[i&&(0,u.jsx)(`div`,{className:`text-[10px] uppercase tracking-[0.14em] text-muted-foreground`,children:i}),(0,u.jsx)(`div`,{className:`font-mono text-xs`,children:c}),a&&(0,u.jsx)(`div`,{className:`text-[11px] text-muted-foreground leading-relaxed`,children:a})]})})]})}function lt({active:e,payload:t,label:n,formatter:r,pinnedEntryNames:i=[],showComputedTotal:a=!0,hideZeroValues:o=!1}){if(!e||!t?.length)return null;let s=e=>e.name.includes(`Ø`)||e.dataKey?.toString().includes(`MA7`)||e.dataKey?.toString().includes(`_ma7`),c=e=>i.includes(e.name),l=e=>!o||Math.abs(e.value??0)>1e-4,d=t.filter(e=>!s(e)&&!c(e)&&l(e)).sort((e,t)=>(t.value??0)-(e.value??0)),f=t.filter(e=>!s(e)&&c(e)&&l(e)),p=t.filter(e=>s(e)),m=d.reduce((e,t)=>e+(t.value??0),0),h=a&&d.length>=2,g=t[0]?.payload??{},_=d.length===1?d[0]:f.length===1?f[0]:null,v=_?g[`${_.dataKey}Prev`]:void 0,y=typeof v==`number`?v:null,b=_?p.find(e=>e.dataKey===`${_.dataKey}MA7`||e.dataKey===`${_.dataKey.toString().toLowerCase()}MA7`)??(p.length===1?p[0]:null):null,x=_&&y!==null?_.value-y:null,S=_&&b?_.value-b.value:null;return(0,u.jsxs)(`div`,{className:`max-w-[280px] bg-popover/90 backdrop-blur-xl border border-border/50 rounded-lg shadow-lg p-3 text-xs`,children:[(0,u.jsx)(`p`,{className:`font-medium text-muted-foreground mb-1.5`,children:n}),(0,u.jsxs)(`div`,{className:`space-y-1.5`,children:[d.map((e,t)=>{let n=h&&m>0?e.value/m*100:null;return(0,u.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,u.jsx)(`span`,{className:`w-2 h-2 rounded-full shrink-0`,style:{backgroundColor:e.color}}),(0,u.jsxs)(`span`,{className:`text-muted-foreground`,children:[e.name,`:`]}),(0,u.jsx)(`span`,{className:`font-mono font-medium text-foreground ml-auto`,children:r?r(e.value,e.name):e.value}),n!==null&&(0,u.jsxs)(`span`,{className:`text-muted-foreground/60 font-mono w-10 text-right`,children:[n.toFixed(0),`%`]})]},t)}),h&&(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(`div`,{className:`border-t border-border/40 my-1`}),(0,u.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,u.jsx)(`span`,{className:`w-2 h-2 shrink-0`}),(0,u.jsx)(`span`,{className:`text-muted-foreground font-medium`,children:`Gesamt:`}),(0,u.jsx)(`span`,{className:`font-mono font-medium text-foreground ml-auto`,children:r?r(m,`Gesamt`):m}),(0,u.jsx)(`span`,{className:`text-muted-foreground/60 font-mono w-10 text-right`,children:`100%`})]})]}),p.length>0&&(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(`div`,{className:`border-t border-border/40 my-1`}),p.map((e,t)=>(0,u.jsxs)(`div`,{className:`flex items-center gap-2 opacity-70`,children:[(0,u.jsx)(`span`,{className:`w-2 h-0.5 shrink-0 border-t border-dashed`,style:{borderColor:e.color}}),(0,u.jsxs)(`span`,{className:`text-muted-foreground`,children:[e.name,`:`]}),(0,u.jsx)(`span`,{className:`font-mono font-medium text-foreground ml-auto`,children:r?r(e.value,e.name):e.value})]},`ma-${t}`))]}),f.length>0&&(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(`div`,{className:`border-t border-border/40 my-1`}),f.map((e,t)=>(0,u.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,u.jsx)(`span`,{className:`w-2 h-2 rounded-full shrink-0`,style:{backgroundColor:e.color}}),(0,u.jsxs)(`span`,{className:`text-muted-foreground`,children:[e.name,`:`]}),(0,u.jsx)(`span`,{className:`font-mono font-medium text-foreground ml-auto`,children:r?r(e.value,e.name):e.value})]},`pinned-${t}`))]}),(x!==null||S!==null)&&(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(`div`,{className:`border-t border-border/40 my-1`}),x!==null&&(0,u.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,u.jsx)(`span`,{className:`w-2 h-2 shrink-0`}),(0,u.jsx)(`span`,{className:`text-muted-foreground`,children:`vs. vorher:`}),(0,u.jsxs)(`span`,{className:`font-mono font-medium text-foreground ml-auto`,children:[x>=0?`+`:``,r?r(x,`Delta`):x]})]}),S!==null&&(0,u.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,u.jsx)(`span`,{className:`w-2 h-2 shrink-0`}),(0,u.jsx)(`span`,{className:`text-muted-foreground`,children:`vs. Ø:`}),(0,u.jsxs)(`span`,{className:`font-mono font-medium text-foreground ml-auto`,children:[S>=0?`+`:``,r?r(S,`Delta`):S]})]})]})]})]})}export{ye as A,We as C,J as D,Te as E,p as F,f as M,m as N,Y as O,d as P,He as S,ze as T,nt as _,Xe as a,Be as b,it as c,Q as d,$ as f,tt as g,Z as h,Ye as i,_e as j,we as k,at as l,qe as m,ct as n,$e as o,Ze as p,Je as r,et as s,lt as t,rt as u,Ke as v,Ge as w,Ve as x,Ue as y};
|