PageSourceSearch

https://ritter-insight-hub.lovable.app/assets/performance._clientId-BpWpmPNR.js

js ritter-insight-hub.lovable.app collected 2026-10-03 03:43:55 UTC 86,230 bytes, 4 lines download raw bytes

vendor: 12,928 bytes, lines 1-2
1import{e as N,W as wt,r as P,c as He,j as n,Y as Yt,L as Xt}from"./index-CXVPV-Qw.js";import{u as ne}from"./useQuery-Bxn6yJeb.js";import{B as et}from"./button-DlNXRAby.js";import{P as Jt,a as Qt,b as er}from"./popover-BgQC_0YK.js";import{S as tr}from"./switch-DSC3kGwb.js";import{c as Ge,r as qe,u as Q}from"./security-C9_IKw8I.js";import{P as rr}from"./page-header-BjXjDSpF.js";import{E as nr}from"./empty-state-DxZ1lhNs.js";import{C as z}from"./card-CmtYAq_o.js";import{B as ar}from"./badge-BxDlV7L6.js";import{T as sr,a as ir,b as or,c as lr}from"./tabs-bq9XHttd.js";import{u as cr,D as dr,p as ur}from"./use-persisted-range-A2h9W6vj.js";import{S as pr}from"./sync-all-button-CikYUZi8.js";import{a as mr,b as fr,L as gr,c as hr,u as br,g as xr}from"./use-chart-theme-C-mbWn3y.js";import{c as D,a as C}from"./format-xYVrn9lc.js";import{a as W,c as S}from"./utils-BQHNewu7.js";import{f as I,N as Pt,O as vr,P as Ot,Q as _r,l as X,U as We,V,b as K,W as Ct,q as Ue,Z as Tt,D as yr,c as kr,e as oe,n as re,S as jr,A as Ar,_ as Nr,d as tt,h as Sr,i as ae,k as wr,u as Pr,G as Or,$ as _e,r as Cr,C as Et,a0 as Tr,a1 as he,H as rt,t as Er,a2 as Rr,R as Rt,T as It,X as Ir,Y as nt}from"./generateCategoricalChart-y4pNOU5W.js";import{T as Mr,a as $r,b as Lr,c as Fr}from"./tooltip-CpYokpg5.js";import{S as Dr,a as Kr,b as Br,c as zr,d as Ee}from"./select-BGH10zAc.js";import{c as ge}from"./createLucideIcon-D_OdtACI.js";import{a as Vr,A as Hr}from"./arrow-up-Ca7w7r0N.js";import{d as Gr}from"./calendar-DNUlwrnf.js";import{E as qr}from"./eye-CQ6mobHK.js";import{A as Ze,a as Ye}from"./arrow-up-right-Cv7YC6KC.js";import{C as Wr}from"./chevron-down-BjnKufB1.js";import{T as Ur}from"./trending-up-BDWtCnK0.js";import{T as Zr}from"./triangle-alert-CcgAHDXB.js";import{g as Yr}from"./client-context.functions-BU6ukXiw.js";import{C as Xr}from"./chart-line-CFb55CG7.js";import{C as Jr}from"./CartesianGrid-DbE-vpcR.js";import{L as at}from"./Line-C90PQxmJ.js";import{M as Qr}from"./minus-Cubi41ql.js";import"./index-m6HzYBoO.js";import"./index-DiY1aCz2.js";import"./index-CljcGeZs.js";import"./index-D1yCoXcv.js";import"./index-Cxa4Db51.js";import"./index-TdiNB5Vd.js";import"./index-Doe_PX5Y.js";import"./index-DOrwszCh.js";import"./icon-tile-DEfRAo52.js";import"./index-CBxDb4je.js";import"./index-CmQ9uJxc.js";import"./label-Bu0tkaH_.js";import"./da-Clga_FgH.js";import"./format-DIoFwAh_.js";import"./dialog-CYPMk9Nj.js";import"./index-D49dcSzo.js";import"./x-MOAemxhZ.js";import"./use-sync-job-CgoNMFGK.js";import"./sync-utils-DmGYKeDi.js";import"./refresh-cw-DugW_u5-.js";import"./circle-check-BQ-5p9NH.js";import"./circle-alert-DZ2uL00z.js";import"./index-C7yKKq-w.js";import"./index-CtSyV8l-.js";import"./check--g2Gnk6l.js";const en=[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]],tn=ge("arrow-left",en);const rn=[["path",{d:"m21 16-4 4-4-4",key:"f6ql7i"}],["path",{d:"M17 20V4",key:"1ejh1v"}],["path",{d:"m3 8 4-4 4 4",key:"11wl7u"}],["path",{d:"M7 4v16",key:"1glfcx"}]],nn=ge("arrow-up-down",rn);const an=[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]],sn=ge("eye-off",an);const on=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]],ln=ge("rotate-ccw",on);const cn=[["path",{d:"M10 5H3",key:"1qgfaw"}],["path",{d:"M12 19H3",key:"yhmn1j"}],["path",{d:"M14 3v4",key:"1sua03"}],["path",{d:"M16 17v4",key:"1q0r14"}],["path",{d:"M21 12h-9",key:"1o4lsq"}],["path",{d:"M21 19h-5",key:"1rlt1p"}],["path",{d:"M21 5h-7",key:"1oszz2"}],["path",{d:"M8 10v4",key:"tgpxqk"}],["path",{d:"M8 12H3",key:"a7s4jb"}]],dn=ge("sliders-horizontal",cn);var un=["points","className","baseLinePoints","connectNulls"];function se(){return se=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var r in a)Object.prototype.hasOwnProperty.call(a,r)&&(e[r]=a[r])}return e},se.apply(this,arguments)}function pn(e,t){if(e==null)return{};var a=mn(e,t),r,s;if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(s=0;s<i.length;s++)r=i[s],!(t.indexOf(r)>=0)&&Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}function mn(e,t){if(e==null)return{};var a={};for(var r in e)if(Object.prototype.hasOwnProperty.call(e,r)){if(t.indexOf(r)>=0)continue;a[r]=e[r]}return a}function st(e){return bn(e)||hn(e)||gn(e)||fn()}function fn(){throw new TypeError(`Invalid attempt to spread non-iterable instance.
2In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function gn(e,t){if(e){if(typeof e=="string")return Le(e,t);var a=Object.prototype.toString.call(e).slice(8,-1);if(a==="Object"&&e.constructor&&(a=e.constructor.name),a==="Map"||a==="Set")return Array.from(e);if(a==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a))return Le(e,t)}}function hn(e){if(typeof Symbol<"u"&&e[Symbol.iterator]!=null||e["@@iterator"]!=null)return Array.from(e)}function bn(e){if(Array.isArray(e))return Le(e)}function Le(e,t){(t==null||t>e.length)&&(t=e.length);for(var a=0,r=new Array(t);a<t;a++)r[a]=e[a];return r}var it=function(t){return t&&t.x===+t.x&&t.y===+t.y},xn=function(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],a=[[]];return t.forEach(function(r){it(r)?a[a.length-1].push(r):a[a.length-1].length>0&&a.push([])}),it(t[0])&&a[a.length-1].push(t[0]),a[a.length-1].length<=0&&(a=a.slice(0,-1)),a},me=function(t,a){var r=xn(t);a&&(r=[r.reduce(function(i,o){return[].concat(st(i),st(o))},[])]);var s=r.map(function(i){return i.reduce(function(o,m,c){return"".concat(o).concat(c===0?"M":"L").concat(m.x,",").concat(m.y)},"")}).join("");return r.length===1?"".concat(s,"Z"):s},vn=function(t,a,r){var s=me(t,r);return"".concat(s.slice(-1)==="Z"?s.slice(0,-1):s,"L").concat(me(a.reverse(),r).slice(1))},_n=function(t){var a=t.points,r=t.className,s=t.baseLinePoints,i=t.connectNulls,o=pn(t,un);if(!a||!a.length)return null;var m=W("recharts-polygon",r);if(s&&s.length){var c=o.stroke&&o.stroke!=="none",u=vn(a,s,i);return N.createElement("g",{className:m},N.createElement("path",se({},I(o,!0),{fill:u.slice(-1)==="Z"?o.fill:"none",stroke:"none",d:u})),c?N.createElement("path",se({},I(o,!0),{fill:"none",d:me(a,i)})):null,c?N.createElement("path",se({},I(o,!0),{fill:"none",d:me(s,i)})):null)}var p=me(a,i);return N.createElement("path",se({},I(o,!0),{fill:p.slice(-1)==="Z"?o.fill:"none",className:m,d:p}))},Re,ot;function yn(){if(ot)return Re;ot=1;var e=Pt(),t=vr(),a=Ot();function r(s,i){return s&&s.length?e(s,a(i,2),t):void 0}return Re=r,Re}var kn=yn();const jn=wt(kn);var Ie,lt;function An(){if(lt)return Ie;lt=1;var e=Pt(),t=Ot(),a=_r();function r(s,i){return s&&s.length?e(s,t(i,2),a):void 0}return Ie=r,Ie}var Nn=An();const Sn=wt(Nn);var wn=["cx","cy","angle","ticks","axisLine"],Pn=["ticks","tick","angle","tickFormatter","stroke"];function le(e){"@babel/helpers - typeof";return le=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},le(e)}function fe(){return fe=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var r in a)Object.prototype.hasOwnProperty.call(a,r)&&(e[r]=a[r])}return e},fe.apply(this,arguments)}function ct(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(s){return Object.getOwnPropertyDescriptor(e,s).enumerable})),a.push.apply(a,r)}return a}function Z(e){for(var t=1;t<arguments.length;t++){var a=arguments[t]!=null?arguments[t]:{};t%2?ct(Object(a),!0).forEach(function(r){we(e,r,a[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):ct(Object(a)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(a,r))})}return e}function dt(e,t){if(e==null)return{};var a=On(e,t),r,s;if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(s=0;s<i.length;s++)r=i[s],!(t.indexOf(r)>=0)&&Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}function On(e,t){if(e==null)return{};var a={};for(var r in e)if(Object.prototype.hasOwnProperty.call(e,r)){if(t.indexOf(r)>=0)continue;a[r]=e[r]}return a}function Cn(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function ut(e,t){for(var a=0;a<t.length;a++){var r=t[a];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,$t(r.key),r)}}function Tn(e,t,a){return t&&ut(e.prototype,t),a&&ut(e,a),Object.defineProperty(e,"prototype",{writable:!1}),e}function En(e,t,a){return t=Ae(t),Rn(e,Mt()?Reflect.construct(t,a||[],Ae(e).constructor):t.apply(e,a))}function Rn(e,t){if(t&&(le(t)==="object"||typeof t=="function"))return t;if(t!==void 0)throw new TypeError("Derived constructors may only return object or undefined");return In(e)}function In(e){if(e===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function Mt(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch{}return(Mt=function(){return!!e})()}function Ae(e){return Ae=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(a){return a.__proto__||Object.getPrototypeOf(a)},Ae(e)}function Mn(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&Fe(e,t)}function Fe(e,t){return Fe=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(r,s){return r.__proto__=s,r},Fe(e,t)}function we(e,t,a){return t=$t(t),t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function $t(e){var t=$n(e,"string");return le(t)=="symbol"?t:t+""}function $n(e,t){if(le(e)!="object"||!e)return e;var a=e[Symbol.toPrimitive];if(a!==void 0){var r=a.call(e,t);if(le(r)!="object")return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}var Pe=(function(e){function t(){return Cn(this,t),En(this,t,arguments)}return Mn(t,e),Tn(t,[{key:"getTickValueCoord",value:function(r){var s=r.coordinate,i=this.props,o=i.angle,m=i.cx,c=i.cy;return V(m,c,s,o)}},{key:"getTickTextAnchor",value:function(){var r=this.props.orientation,s;switch(r){case"left":s="end";break;case"right":s="start";break;default:s="middle";break}return s}},{key:"getViewBox",value:function(){var r=this.props,s=r.cx,i=r.cy,o=r.angle,m=r.ticks,c=jn(m,function(p){return p.coordinate||0}),u=Sn(m,function(p){return p.coordinate||0});return{cx:s,cy:i,startAngle:o,endAngle:o,innerRadius:u.coordinate||0,outerRadius:c.coordinate||0}}},{key:"renderAxisLine",value:function(){var r=this.props,s=r.cx,i=r.cy,o=r.angle,m=r.ticks,c=r.axisLine,u=dt(r,wn),p=m.reduce(function(d,l){return[Math.min(d[0],l.coordinate),Math.max(d[1],l.coordinate)]},[1/0,-1/0]),b=V(s,i,p[0],o),x=V(s,i,p[1],o),g=Z(Z(Z({},I(u,!1)),{},{fill:"none"},I(c,!1)),{},{x1:b.x,y1:b.y,x2:x.x,y2:x.y});return N.createElement("line",fe({className:"recharts-polar-radius-axis-line"},g))}},{key:"renderTicks",value:function(){var r=this,s=this.props,i=s.ticks,o=s.tick,m=s.angle,c=s.tickFormatter,u=s.stroke,p=dt(s,Pn),b=this.getTickTextAnchor(),x=I(p,!1),g=I(o,!1),d=i.map(function(l,y){var v=r.getTickValueCoord(l),f=Z(Z(Z(Z({textAnchor:b,transform:"rotate(".concat(90-m,", ").concat(v.x,", ").concat(v.y,")")},x),{},{stroke:"none",fill:u},g),{},{index:y},v),{},{payload:l});return N.createElement(K,fe({className:W("recharts-polar-radius-axis-tick",Ct(o)),key:"tick-".concat(l.coordinate)},Ue(r.props,l,y)),t.renderTickItem(o,f,c?c(l.value,y):l.value))});return N.createElement(K,{className:"recharts-polar-radius-axis-ticks"},d)}},{key:"render",value:function(){var r=this.props,s=r.ticks,i=r.axisLine,o=r.tick;return!s||!s.length?null:N.createElement(K,{className:W("recharts-polar-radius-axis",this.props.className)},i&&this.renderAxisLine(),o&&this.renderTicks(),Tt.renderCallByParent(this.props,this.getViewBox()))}}],[{key:"renderTickItem",value:function(r,s,i){var o;return N.isValidElement(r)?o=N.cloneElement(r,s):X(r)?o=r(s):o=N.createElement(We,fe({},s,{className:"recharts-polar-radius-axis-tick-value"}),i),o}}])})(P.PureComponent);we(Pe,"displayName","PolarRadiusAxis");we(Pe,"axisType","radiusAxis");we(Pe,"defaultProps",{type:"number",radiusAxisId:0,cx:0,cy:0,angle:0,orientation:"right",stroke:"#ccc",axisLine
2:!0,tick:!0,tickCount:5,allowDataOverflow:!1,scale:"auto",allowDuplicatedCategory:!0});function ce(e){"@babel/helpers - typeof";return ce=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},ce(e)}function J(){return J=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var r in a)Object.prototype.hasOwnProperty.call(a,r)&&(e[r]=a[r])}return e},J.apply(this,arguments)}function pt(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(s){return Object.getOwnPropertyDescriptor(e,s).enumerable})),a.push.apply(a,r)}return a}function Y(e){for(var t=1;t<arguments.length;t++){var a=arguments[t]!=null?arguments[t]:{};t%2?pt(Object(a),!0).forEach(function(r){Oe(e,r,a[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):pt(Object(a)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(a,r))})}return e}function Ln(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function mt(e,t){for(var a=0;a<t.length;a++){var r=t[a];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,Ft(r.key),r)}}function Fn(e,t,a){return t&&mt(e.prototype,t),a&&mt(e,a),Object.defineProperty(e,"prototype",{writable:!1}),e}function Dn(e,t,a){return t=Ne(t),Kn(e,Lt()?Reflect.construct(t,a||[],Ne(e).
vendor: 13,899 bytes, line 2
2constructor):t.apply(e,a))}function Kn(e,t){if(t&&(ce(t)==="object"||typeof t=="function"))return t;if(t!==void 0)throw new TypeError("Derived constructors may only return object or undefined");return Bn(e)}function Bn(e){if(e===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function Lt(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch{}return(Lt=function(){return!!e})()}function Ne(e){return Ne=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(a){return a.__proto__||Object.getPrototypeOf(a)},Ne(e)}function zn(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&De(e,t)}function De(e,t){return De=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(r,s){return r.__proto__=s,r},De(e,t)}function Oe(e,t,a){return t=Ft(t),t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function Ft(e){var t=Vn(e,"string");return ce(t)=="symbol"?t:t+""}function Vn(e,t){if(ce(e)!="object"||!e)return e;var a=e[Symbol.toPrimitive];if(a!==void 0){var r=a.call(e,t);if(ce(r)!="object")return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}var Hn=Math.PI/180,ft=1e-5,Ce=(function(e){function t(){return Ln(this,t),Dn(this,t,arguments)}return zn(t,e),Fn(t,[{key:"getTickLineCoord",value:function(r){var s=this.props,i=s.cx,o=s.cy,m=s.radius,c=s.orientation,u=s.tickSize,p=u||8,b=V(i,o,m,r.coordinate),x=V(i,o,m+(c==="inner"?-1:1)*p,r.coordinate);return{x1:b.x,y1:b.y,x2:x.x,y2:x.y}}},{key:"getTickTextAnchor",value:function(r){var s=this.props.orientation,i=Math.cos(-r.coordinate*Hn),o;return i>ft?o=s==="outer"?"start":"end":i<-ft?o=s==="outer"?"end":"start":o="middle",o}},{key:"renderAxisLine",value:function(){var r=this.props,s=r.cx,i=r.cy,o=r.radius,m=r.axisLine,c=r.axisLineType,u=Y(Y({},I(this.props,!1)),{},{fill:"none"},I(m,!1));if(c==="circle")return N.createElement(yr,J({className:"recharts-polar-angle-axis-line"},u,{cx:s,cy:i,r:o}));var p=this.props.ticks,b=p.map(function(x){return V(s,i,o,x.coordinate)});return N.createElement(_n,J({className:"recharts-polar-angle-axis-line"},u,{points:b}))}},{key:"renderTicks",value:function(){var r=this,s=this.props,i=s.ticks,o=s.tick,m=s.tickLine,c=s.tickFormatter,u=s.stroke,p=I(this.props,!1),b=I(o,!1),x=Y(Y({},p),{},{fill:"none"},I(m,!1)),g=i.map(function(d,l){var y=r.getTickLineCoord(d),v=r.getTickTextAnchor(d),f=Y(Y(Y({textAnchor:v},p),{},{stroke:"none",fill:u},b),{},{index:l,payload:d,x:y.x2,y:y.y2});return N.createElement(K,J({className:W("recharts-polar-angle-axis-tick",Ct(o)),key:"tick-".concat(d.coordinate)},Ue(r.props,d,l)),m&&N.createElement("line",J({className:"recharts-polar-angle-axis-tick-line"},x,y)),o&&t.renderTickItem(o,f,c?c(d.value,l):d.value))});return N.createElement(K,{className:"recharts-polar-angle-axis-ticks"},g)}},{key:"render",value:function(){var r=this.props,s=r.ticks,i=r.radius,o=r.axisLine;return i<=0||!s||!s.length?null:N.createElement(K,{className:W("recharts-polar-angle-axis",this.props.className)},o&&this.renderAxisLine(),this.renderTicks())}}],[{key:"renderTickItem",value:function(r,s,i){var o;return N.isValidElement(r)?o=N.cloneElement(r,s):X(r)?o=r(s):o=N.createElement(We,J({},s,{className:"recharts-polar-angle-axis-tick-value"}),i),o}}])})(P.PureComponent);Oe(Ce,"displayName","PolarAngleAxis");Oe(Ce,"axisType","angleAxis");Oe(Ce,"defaultProps",{type:"category",angleAxisId:0,scale:"auto",cx:0,cy:0,orientation:"outer",axisLine:!0,tickLine:!0,tickSize:8,tick:!0,hide:!1,allowDuplicatedCategory:!0});var ye;function de(e){"@babel/helpers - typeof";return de=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},de(e)}function ie(){return ie=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var r in a)Object.prototype.hasOwnProperty.call(a,r)&&(e[r]=a[r])}return e},ie.apply(this,arguments)}function gt(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(s){return Object.getOwnPropertyDescriptor(e,s).enumerable})),a.push.apply(a,r)}return a}function O(e){for(var t=1;t<arguments.length;t++){var a=arguments[t]!=null?arguments[t]:{};t%2?gt(Object(a),!0).forEach(function(r){F(e,r,a[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):gt(Object(a)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(a,r))})}return e}function Gn(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function ht(e,t){for(var a=0;a<t.length;a++){var r=t[a];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,Kt(r.key),r)}}function qn(e,t,a){return t&&ht(e.prototype,t),a&&ht(e,a),Object.defineProperty(e,"prototype",{writable:!1}),e}function Wn(e,t,a){return t=Se(t),Un(e,Dt()?Reflect.construct(t,a||[],Se(e).constructor):t.apply(e,a))}function Un(e,t){if(t&&(de(t)==="object"||typeof t=="function"))return t;if(t!==void 0)throw new TypeError("Derived constructors may only return object or undefined");return Zn(e)}function Zn(e){if(e===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function Dt(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch{}return(Dt=function(){return!!e})()}function Se(e){return Se=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(a){return a.__proto__||Object.getPrototypeOf(a)},Se(e)}function Yn(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&Ke(e,t)}function Ke(e,t){return Ke=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(r,s){return r.__proto__=s,r},Ke(e,t)}function F(e,t,a){return t=Kt(t),t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function Kt(e){var t=Xn(e,"string");return de(t)=="symbol"?t:t+""}function Xn(e,t){if(de(e)!="object"||!e)return e;var a=e[Symbol.toPrimitive];if(a!==void 0){var r=a.call(e,t);if(de(r)!="object")return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}var H=(function(e){function t(a){var r;return Gn(this,t),r=Wn(this,t,[a]),F(r,"pieRef",null),F(r,"sectorRefs",[]),F(r,"id",Pr("recharts-pie-")),F(r,"handleAnimationEnd",function(){var s=r.props.onAnimationEnd;r.setState({isAnimationFinished:!0}),X(s)&&s()}),F(r,"handleAnimationStart",function(){var s=r.props.onAnimationStart;r.setState({isAnimationFinished:!1}),X(s)&&s()}),r.state={isAnimationFinished:!a.isAnimationActive,prevIsAnimationActive:a.isAnimationActive,prevAnimationId:a.animationId,sectorToFocus:0},r}return Yn(t,e),qn(t,[{key:"isActiveIndex",value:function(r){var s=this.props.activeIndex;return Array.isArray(s)?s.indexOf(r)!==-1:r===s}},{key:"hasActiveIndex",value:function(){var r=this.props.activeIndex;return Array.isArray(r)?r.length!==0:r||r===0}},{key:"renderLabels",value:function(r){var s=this.props.isAnimationActive;if(s&&!this.state.isAnimationFinished)return null;var i=this.props,o=i.label,m=i.labelLine,c=i.dataKey,u=i.valueKey,p=I(this.props,!1),b=I(o,!1),x=I(m,!1),g=o&&o.offsetRadius||20,d=r.map(function(l,y){var v=(l.startAngle+l.endAngle)/2,f=V(l.cx,l.cy,l.outerRadius+g,v),j=O(O(O(O({},p),l),{},{stroke:"none"},b),{},{index:y,textAnchor:t.getTextAnchor(f.x,l.cx)},f),k=O(O(O(O({},p),l),{},{fill:"none",stroke:l.fill},x),{},{index:y,points:[V(l.cx,l.cy,l.outerRadius,v),f]}),A=c;return oe(c)&&oe(u)?A="value":oe(c)&&(A=u),N.createElement(K,{key:"label-".concat(l.startAngle,"-").concat(l.endAngle,"-").concat(l.midAngle,"-").concat(y)},m&&t.renderLabelLineItem(m,k,"line"),t.renderLabelItem(o,j,re(l,A)))});return N.createElement(K,{className:"recharts-pie-labels"},d)}},{key:"renderSectorsStatically",value:function(r){var s=this,i=this.props,o=i.activeShape,m=i.blendStroke,c=i.inactiveShape;return r.map(function(u,p){if(u?.startAngle===0&&u?.endAngle===0&&r.length!==1)return null;var b=s.isActiveIndex(p),x=c&&s.hasActiveIndex()?c:null,g=b?o:x,d=O(O({},u),{},{stroke:m?u.fill:u.stroke,tabIndex:-1});return N.createElement(K,ie({ref:function(y){y&&!s.sectorRefs.includes(y)&&s.sectorRefs.push(y)},tabIndex:-1,className:"recharts-pie-sector"},Ue(s.props,u,p),{key:"sector-".concat(u?.startAngle,"-").concat(u?.endAngle,"-").concat(u.midAngle,"-").concat(p)}),N.createElement(jr,ie({option:g,isActive:b,shapeType:"sector"},d)))})}},{key:"renderSectorsWithAnimation",value:function(){var r=this,s=this.props,i=s.sectors,o=s.isAnimationActive,m=s.animationBegin,c=s.animationDuration,u=s.animationEasing,p=s.animationId,b=this.state,x=b.prevSectors,g=b.prevIsAnimationActive;return N.createElement(Ar,{begin:m,duration:c,isActive:o,easing:u,from:{t:0},to:{t:1},key:"pie-".concat(p,"-").concat(g),onAnimationStart:this.handleAnimationStart,onAnimationEnd:this.handleAnimationEnd},function(d){var l=d.t,y=[],v=i&&i[0],f=v.startAngle;return i.forEach(function(j,k){var A=x&&x[k],T=k>0?Nr(j,"paddingAngle",0):0;if(A){var _=tt(A.endAngle-A.startAngle,j.endAngle-j.startAngle),w=O(O({},j),{},{startAngle:f+T,endAngle:f+_(l)+T});y.push(w),f=w.endAngle}else{var B=j.endAngle,L=j.startAngle,ee=tt(0,B-L),G=ee(l),h=O(O({},j),{},{startAngle:f+T,endAngle:f+G+T});y.push(h),f=h.endAngle}}),N.createElement(K,null,r.renderSectorsStatically(y))})}},{key:"attachKeyboardHandlers",value:function(r){var s=this;r.onkeydown=function(i){if(!i.altKey)switch(i.key){case"ArrowLeft":{var o=++s.state.sectorToFocus%s.sectorRefs.length;s.sectorRefs[o].focus(),s.setState({sectorToFocus:o});break}case"ArrowRight":{var m=--s.state.sectorToFocus<0?s.sectorRefs.length-1:s.state.sectorToFocus%s.sectorRefs.length;s.sectorRefs[m].focus(),s.setState({sectorToFocus:m});break}case"Escape":{s.sectorRefs[s.state.sectorToFocus].blur(),s.setState({sectorToFocus:0});break}}}}},{key:"renderSectors",value:function(){var r=this.props,s=r.sectors,i=r.isAnimationActive,o=this.state.prevSectors;return i&&s&&s.length&&(!o||!Sr(o,s))?this.renderSectorsWithAnimation():this.renderSectorsStatically(s)}},{key:"componentDidMount",value:function(){this.pieRef&&this.attachKeyboardHandlers(this.pieRef)}},{key:"render",value:function(){var r=this,s=this.props,i=s.hide,o=s.sectors,m=s.className,c=s.label,u=s.cx,p=s.cy,b=s.innerRadius,x=s.outerRadius,g=s.isAnimationActive,d=this.state.isAnimationFinished;if(i||!o||!o.length||!ae(u)||!ae(p)||!ae(b)||!ae(x))return null;var l=W("recharts-pie",m);return N.createElement(K,{tabIndex:this.props.rootTabIndex,className:l,ref:function(v){r.pieRef=v}},this.renderSectors(),c&&this.renderLabels(o),Tt.renderCallByParent(this.props,null,!1),(!g||d)&&wr.renderCallByParent(this.props,o,!1))}}],[{key:"getDerivedStateFromProps",value:function(r,s){return s.prevIsAnimationActive!==r.isAnimationActive?{prevIsAnimationActive:r.isAnimationActive,prevAnimationId:r.animationId,curSectors:r.sectors,prevSectors:[],isAnimationFinished:!0}:r.isAnimationActive&&r.animationId!==s.prevAnimationId?{prevAnimationId:r.animationId,curSectors:r.sectors,prevSectors:s.curSectors,isAnimationFinished:!0}:r.sectors!==s.curSectors?{curSectors:r.sectors,isAnimationFinished:!0}:null}},{key:"getTextAnchor",value:function(r,s){return r>s?"start":r<s?"end":"middle"}},{key:"renderLabelLineItem",value:function(r,s,i){if(N.isValidElement(r))return N.cloneElement(r,s);if(X(r))return r(s);var o=W("recharts-pie-label-line",typeof r!="boolean"?r.className:"");return N.createElement(kr,ie({},s,{key:i,type:"linear",className:o}))}},{key:"renderLabelItem",value:function(r,s,i){if(N.isValidElement(r))return N.cloneElement(r,s);var o=i;if(X(r)&&(o=r(s),N.isValidElement(o)))return o;var m=W("recharts-pie-label-text",typeof r!="boolean"&&!X(r)?r.className:"");return N.createElement(We,ie({},s,{alignmentBaseline:"middle",className:m}),o)}}])})(P.PureComponent);ye=H;F(H,"displayName","Pie");F(H,"defaultProps",{stroke:"#fff",fill:"#808080",legendType:"rect",cx:"50%",cy:"50%",startAngle:0,endAngle:360,innerRadius:0,outerRadius:"80%",paddingAngle:0,labelLine:!0,hide:!1,minAngle:0,isAnimationActive:!Or.isSsr,animationBegin:400,animationDuration:1500,animationEasing:"ease",nameKey:"name",blendStroke:!1,rootTabIndex:0});F(H,"parseDeltaAngle",function(e,t){var a=_e(t-e),r=Math.min(Math.abs(t-e),360);return a*r});F(H,"getRealPieData",function(e){var t=e.data,a=e.children,r=I(e,!1),s=Cr(a,Et);return t&&t.length?t.map(function(i,o){return O(O(O({payload:i},r),i),s&&s[o]&&s[o].props)}):s&&s.length?s.map(function(i){return O(O({},r),i.props)}):[]});F(H,"parseCoordinateOfPie",function(e,t){var a=t.top,r=t.left,s=t.width,i=t.height,o=Tr(s,i),m=r+he(e.cx,s,s/2),c=a+he(e.cy,i,i/2),u=he(e.innerRadius,o,0),p=he(e.outerRadius,o,o*.8),b=e.maxRadius||Math.sqrt(s*s+i*i)/2;return{cx:m,cy:c,innerRadius:u,outerRadius:p,maxRadius:b}});F(H,"getComposedData",function(e){var t=e.item,a=e.offset,r=t.type.defaultProps!==void 0?O(O({},t.type.defaultProps),t.props):t.props,s=ye.getRealPieData(r);if(!s||!s.length)return null;var i=r.cornerRadius,o=r.startAngle,m=r.endAngle,c=r.paddingAngle,u=r.dataKey,p=r.nameKey,b=r.valueKey,x=r.tooltipType,g=Math.abs(r.minAngle),d=ye.parseCoordinateOfPie(r,a),l=ye.parseDeltaAngle(o,m),y=Math.abs(l),v=u;oe(u)&&oe(b)?(rt(!1,`Use "dataKey" to specify the value of pie,
3      the props "valueKey" will be deprecated in 1.1.0`),v="value"):oe(u)&&(rt(!1,`Use "dataKey" to specify the value of pie,
4      the props "valueKey" will be deprecated in 1.1.0`),v=b);var f=s.filter(function(w){return re(w,v,0)!==0}).length,j=(y>=360?f:f-1)*c,k=y-f*g-j,A=s.reduce(function(w,B){var L=re(B,v,0);return w+(ae(L)?L:0)},0),T;if(A>0){var _;T=s.map(function(w,B){var L=re(w,v,0),ee=re(w,p,B),G=(ae(L)?L:0)/A,h;B?h=_.endAngle+_e(l)*c*(L!==0?1:0):h=o;var E=h+_e(l)*((L!==0?g:0)+G*k),R=(h+E)/2,$=(d.innerRadius+d.outerRadius)/2,U=[{name:ee,value:L,payload:w,dataKey:v,type:x}],Zt=V(d.cx,d.cy,$,R);return _=O(O(O({percent:G,cornerRadius:i,name:ee,tooltipPayload:U,midAngle:R,middleRadius:$,tooltipPosition:Zt},w),d),{},{value:re(w,v),startAngle:h,endAngle:E,payload:w,paddingAngle:_e(l)*c}),_})}return O(O({},d),{},{sectors:T,data:s})});var Jn=Er({chartName:"PieChart",GraphicalChild:H,validateTooltipEventTypes:["item"],defaultTooltipEventType:"item",legendContent:"children",axisComponents:[{axisType:"angleAxis",AxisComp:Ce},{axisType:"radiusAxis",AxisComp:Pe}],formatAxisMap:Rr,defaultProps:{layout:"centric",startAngle:0,endAngle:360,cx:"50%",cy:"50%",innerRadius:0,outerRadius:"80%"}});const Qn=Ge({method:"POST"}).middleware([qe]).handler(He("c16e0116fbad3f1077129f595a66b03fa1cb5b86ceb1fc1d4a2a2fe59417fea8"));function Bt({value:e,onChange:t,purchaserLabel:a="Købere"}){const r=[{key:"new_users",label:"Nye brugere"},{key:"purchasers",label:a}];return n.jsx("div",{className:"flex overflow-hidden rounded-md border border-border",children:r.map(s=>n.jsx("button",{type:"button",onClick:()=>t(s.key),"aria-pressed":e===s.key,className:S("px-2.5 py-1 text-xs transition-colors",e===s.key?"bg-primary text-primary-foreground":"text-muted-foreground hover:text-foreground"),children:s.label},s.key))})}const be=["var(--chart-1)","var(--chart-2)","var(--chart-3)","var(--chart-4)","var(--chart-5)","color-mix(in oklab, var(--muted-foreground) 60%, transparent)","color-mix(in oklab, var(--muted-foreground) 35%, transparent)"];function ea({rows:e}){const[t,a]=P.useState("new_users"),r=[...e].map(c=>({label:c.label,value:t==="new_users"?c.new_users:c.purchasers})).filter(c=>c.value>0).sort((c,u)=>u.value-c.value),s=r.slice(0,6),i=r.slice(6).reduce((c,u)=>c+u.value,0),o=i>0?[...s,{label:"Øvrige",value:i}]:s,m=o.reduce((c,u)=>c+u.value,0);return n.jsxs(z,{className:"p-5",children:[n.jsxs("div",{className:"mb-4 flex flex-wrap items-center justify-between gap-2",children:[n.jsxs("div",{children:[n.jsx("h3",{className:"font-display text-lg",children:"Kanaler"}),n.jsx("p",{className:"text-xs text-muted-foreground",children:"Fordeling fra GA4"})]}),n.jsx(Bt,{value:t,onChange:a})]}),m===0?n.jsx("div",{className:"h-40 flex items-center justify-center text-sm text-muted-foreground",children:"Ingen GA4-data i perioden"}):n.jsxs("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-center",children:[n.jsxs("div",{className:"relative h-44 w-full sm:w-44 shrink-0",children:[n.jsx(Rt,{width:"100%",height:"100%",children:n.jsxs(Jn,{children:[n.jsx(H,{data:o,dataKey:"value",nameKey:"label",innerRadius:"62%",outerRadius:"92%",paddingAngle:2,stroke:"none",isAnimationActive:!1,children:o.map((c,u)=>n.jsx(Et,{fill:be[u%be.length]},u))}),n.jsx(It,{contentStyle:{background:"var(--popover)",border:"1px solid var(--border)",borderRadius:6,boxShadow:"0 8px 24px -12px oklch(0 0 0 / 0.50)"},itemStyle:{color:"var(--popover-foreground)",fontSize:11},labelStyle:{color:"var(--popover-foreground)",fontSize:11,fontWeight:600},formatter:(c,u)=>[`${D(c)} (${(c/m*100).toFixed(1)}%)`,u]})]})}),n.jsxs("div",{className:"pointer-events-none absolute inset-0 flex flex-col items-center justify-center",children:[n.jsx("div",{className:"font-display text-xl tabular-nums leading-none",children:D(m)}),n.jsx("div",{className:"eyebrow text-[9px] text-muted-foreground",children:t==="new_users"?"nye brugere":"købere"})]})]}),n.jsx("ul",{className:"min-w-0 flex-1 space-y-1.5",children:o.map((c,u)=>n.jsxs("li",{className:"flex items-center gap-2 text-xs text-foreground",children:[n.jsx("span",{"aria-hidden":!0,
4className:"size-2 shrink-0 rounded-full",style:{background:be[u%be.length]}}),n.jsx("span",{className:"min-w-0 flex-1 truncate",children:c.label}),n.jsx("span",{className:"tabular-nums",children:D(c.value)}),n.jsxs("span",{className:"w-12 text-right tabular-nums text-muted-foreground",children:[(c.value/m*100).toFixed(1),"%"]})]},c.label))})]})]})}function ta(e){return/^[A-Za-z]{2}$/.test(e)?String.fromCodePoint(...e.toUpperCase().split("").map(t=>127397+t.charCodeAt(0))):"🌍"}function ra({rows:e,cityRows:t=[]}){const[a,r]=P.useState("new_users"),[s,i]=P.useState("cities"),m=[...s==="cities"?t:e].map(d=>({key:d.key,label:d.label,value:a==="new_users"?d.new_users:d.purchasers})).filter(d=>d.value>0).sort((d,l)=>l.value-d.value),c=m.slice(0,8),u=m.slice(8).reduce((d,l)=>d+l.value,0),p=u>0?[...c,{key:"other",label:s==="cities"?"Øvrige byer":"Øvrige lande",value:u}]:c,b=m.reduce((d,l)=>d+l.value,0),x=p[0]?.value??0,g=d=>d==="other"?"🌍":ta(s==="cities"?d.split("|")[0]??"":d);return n.jsxs(z,{className:"p-5",children:[n.jsxs("div",{className:"mb-4 flex flex-wrap items-center justify-between gap-2",children:[n.jsxs("div",{children:[n.jsx("h3",{className:"font-display text-lg",children:s==="cities"?"Byer":"Lande"}),n.jsx("p",{className:"text-xs text-muted-foreground",children:"Hvor de besøgende kommer fra"})]}),n.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[n.jsx("div",{className:"inline-flex rounded-md border border-border p-0.5",children:["cities","countries"].map(d=>n.jsx("button",{type:"button",onClick:()=>i(d),className:`rounded px-2.5 py-1 text-xs transition-colors ${s===d?"bg-primary text-primary-foreground":"text-muted-foreground hover:text-foreground"}`,children:d==="cities"?"Byer":"Lande"},d))}),n.jsx(Bt,{value:a,onChange:r,purchaserLabel:"Kunder"})]})]}),b===0?n.jsx("div",{className:"h-40 flex items-center justify-center text-sm text-muted-foreground",children:"Ingen GA4-data i perioden"}):n.jsx("ul",{className:"space-y-2.5",children:p.map(d=>n.jsxs("li",{children:[n.jsxs("div",{className:"flex items-center gap-2 text-xs text-foreground",children:[n.jsx("span",{"aria-hidden":!0,className:"shrink-0",children:g(d.key)}),n.jsx("span",{className:"min-w-0 flex-1 truncate",children:d.label}),n.jsx("span",{className:"tabular-nums",children:D(d.value)}),n.jsxs("span",{className:"w-12 text-right tabular-nums text-muted-foreground",children:[(d.value/b*100).toFixed(1),"%"]})]}),n.jsx("div",{className:"mt-1 h-1.5 rounded-full bg-muted",children:n.jsx("div",{className:"h-1.5 rounded-full bg-primary",style:{width:`${x>0?d.value/x*100:0}%`}})})]},d.key))})]})}const na=Ge({method:"POST"}).middleware([qe]).handler(He("f61ab6951200323d5972ea6d464b0f400554a761b00f3fb5669ed91f812e5ee5"));Ge({method:"POST"}).middleware([qe]).handler(He("74cbb4d31aef7a6289b6ad8ca41853d62a6caa5365532f9166a284c12e61632d"));const aa=[{id:"value",label:"Konvertering & værdi",tone:"text-primary border-primary/60"},{id:"visibility",label:"Synlighed & konkurrence",tone:"text-accent border-accent/60"},{id:"traffic",label:"Trafik",tone:"text-foreground/80 border-border"},{id:"budget",label:"Budget & metadata",tone:"text-muted-foreground border-border"}],sa={MAXIMIZE_CONVERSIONS:"Maks. konverteringer",MAXIMIZE_CONVERSION_VALUE:"Maks. konverteringsværdi",TARGET_CPA:"Mål-CPA",TARGET_ROAS:"Mål-ROAS",TARGET_SPEND:"Maks. kliks",MANUAL_CPC:"Manuel CPC",ENHANCED_CPC:"Forbedret CPC",TARGET_IMPRESSION_SHARE:"Mål-eksponeringsandel",MANUAL_CPM:"Manuel CPM",MANUAL_CPV:"Manuel CPV",TARGET_CPM:"Mål-CPM",COMMISSION:"Kommission",LOWEST_COST_WITHOUT_CAP:"Laveste omkostning",LOWEST_COST_WITH_BID_CAP:"Budloft",COST_CAP:"Omkostningsloft",LOWEST_COST_WITH_MIN_ROAS:"Minimum-ROAS"},ia={ENABLED:"Aktiv",PAUSED:"Pauset",REMOVED:"Fjernet",ACTIVE:"Aktiv",CAMPAIGN_PAUSED:"Pauset",ARCHIVED:"Arkiveret",DELETED:"Slettet",IN_PROCESS:"Behandles",WITH_ISSUES:"Med fejl"},bt=e=>e==="ENABLED"||e==="ACTIVE",xt=e=>e==="Flere"?e:e?sa[e]??e.replaceAll("_"," ").toLowerCase():null,Be=(e,t=1)=>e===null?"—":`${e.toFixed(t).replace(".",",")} %`,xe=e=>e===null?"—":`${(e*100).toFixed(1).replace(".",",")} %`,ve=e=>e===null?"—":e.toFixed(2).replace(".",","),ke=e=>
4Math.round(e).toLocaleString("da-DK"),oa=e=>e.toLocaleString("da-DK",{maximumFractionDigits:1}),q=e=>e==null?"—":C(e),ue=e=>e==null?"—":ke(e),Me=(e,t=1)=>e==null?"—":Be(e,t),la=e=>e==null?"—":`${e.toFixed(1).replace(".",",")} s`,M=["meta_ads"],zt=[{key:"spend",label:"Spend",group:"value",sort:e=>e.spend,render:e=>C(e.spend),delta:e=>e.delta_spend_pct,formula:"Sum af omkostninger i perioden"},{key:"revenue",label:"Konv.værdi",group:"value",sort:e=>e.revenue,render:e=>C(e.revenue),delta:e=>e.delta_revenue_pct,available:e=>!e.some(t=>t.pm_revenue!=null),formula:"Sum af konverteringsværdi i perioden"},{key:"roas",label:"ROAS",group:"value",sort:e=>e.roas,render:e=>ve(e.roas),delta:e=>e.delta_roas_pct,available:e=>!e.some(t=>t.pm_roas!=null),formula:"Samlet konv.værdi / Samlet spend",note:"Beregnet på periodens totaler, ikke et gennemsnit af daglige tal."},{key:"pm_revenue",label:"Omsætning",group:"value",sort:e=>e.pm_revenue??null,render:e=>q(e.pm_revenue),delta:e=>e.delta_pm_revenue_pct??null,available:e=>e.some(t=>t.pm_revenue!=null),formula:"Sum af ProfitMetrics-omsætning i perioden",note:"Målt af ProfitMetrics, ikke af annonceplatformen."},{key:"pm_roas",label:"ROAS",group:"value",sort:e=>e.pm_roas??null,render:e=>ve(e.pm_roas??null),delta:e=>e.delta_pm_roas_pct??null,available:e=>e.some(t=>t.pm_roas!=null),formula:"Samlet PM-omsætning / Samlet spend",note:"Beregnet på periodens totaler, ikke et gennemsnit af daglige tal."},{key:"poas",label:"POAS",group:"value",sort:e=>e.poas??null,render:e=>ve(e.poas??null),delta:e=>e.delta_poas_pct??null,available:e=>e.some(t=>t.poas!=null),formula:"Samlet bruttoprofit (DB) / Samlet spend",note:"Bruttoprofit kommer fra ProfitMetrics. Beregnet på periodens totaler."},{key:"pm_gross_profit",label:"Bruttoprofit",group:"value",sort:e=>e.pm_gross_profit??null,render:e=>q(e.pm_gross_profit),delta:e=>e.delta_pm_gross_profit_pct??null,available:e=>e.some(t=>t.pm_gross_profit!=null),formula:"Sum af ProfitMetrics-bruttoprofit (DB) i perioden"},{key:"purchases",label:"Konv.",group:"value",sort:e=>e.purchases,render:e=>oa(e.purchases),delta:e=>e.delta_purchases_pct,formula:"Sum af konverteringer i perioden"},{key:"cpa",label:"CPA",group:"value",sort:e=>e.cpa,render:e=>q(e.cpa),delta:e=>e.delta_cpa_pct,invertDelta:!0,formula:"Samlet spend / Samlede konverteringer",note:"Vises som — når der ikke er konverteringer."},{key:"cvr",label:"CvR",group:"value",sort:e=>e.cvr,render:e=>Be(e.cvr,2),delta:e=>e.delta_cvr_pct,formula:"(Samlede konverteringer / Samlede kliks) × 100",note:"Vægtet total for hele perioden, ikke et gennemsnit af dagsprocenter."},{channels:M,key:"atc",label:"ATC",group:"value",sort:e=>e.add_to_cart??null,render:e=>ue(e.add_to_cart),delta:e=>e.delta_add_to_cart_pct??null,formula:"Sum af Add to Cart-events i perioden",note:"Fra Meta-pixlen (læg i kurv)."},{channels:M,key:"ic",label:"IC",group:"value",sort:e=>e.initiate_checkout??null,render:e=>ue(e.initiate_checkout),delta:e=>e.delta_initiate_checkout_pct??null,formula:"Sum af Initiate Checkout-events i perioden",note:"Fra Meta-pixlen (påbegyndt checkout)."},{channels:M,key:"reach",label:"Rækkevidde",group:"visibility",sort:e=>e.reach??null,render:(e,t)=>t&&e.reach!=null?`≤ ${ke(e.reach)}`:ue(e.reach),delta:e=>e.delta_reach_pct??null,formula:"Unikke personer der så kampagnen i perioden",note:"Hentes direkte fra Meta for hele perioden, da rækkevidde ikke kan lægges sammen dag for dag. Total er en sum og kan indeholde overlap mellem kampagner."},{channels:M,key:"frequency",label:"Frekvens",group:"visibility",sort:e=>e.frequency??null,render:e=>e.frequency==null?"—":ve(e.frequency),delta:e=>e.delta_frequency_pct??null,formula:"Eksponeringer / Rækkevidde",note:"Gennemsnitligt antal gange hver person så annoncerne."},{channels:M,key:"cpm_meta",label:"CPM",group:"visibility",sort:e=>e.cpm,render:e=>q(e.cpm),delta:e=>e.delta_cpm_pct??null,invertDelta:!0,formula:"(Samlet spend / Samlede eksponeringer) × 1.000"},{channels:["google_ads"],key:"sis",label:"Search IS",group:"visibility",sort:e=>e.search_impression_share,render:e=>xe(e.search_impression_share),delta:e=>e.delta_search_impression_share_pct,formula:"Σ(IS × eksponeringer) / Σ eksponeringer",note:"Andel af de mulige søgeeksponeringer du fik. Kun Search og Shopping — PMax og Display vises som —."},{channels:["google_ads"],key:"click_share",label:"Click Share",group:"visibility",sort:e=>e.search_click_share,render:e=>xe(e.search_click_share),delta:e=>
4e.delta_search_click_share_pct,formula:"Σ(Click Share × kliks) / Σ kliks",note:"Andel af de mulige kliks du fik. Vægtet med kliks over perioden."},{channels:["google_ads"],key:"lost_budget",label:"Tabt IS (budget)",group:"visibility",sort:e=>e.search_budget_lost_is,render:e=>xe(e.search_budget_lost_is),delta:e=>e.delta_search_budget_lost_is_pct,invertDelta:!0,formula:"Σ(Tabt IS budget × eksponeringer) / Σ eksponeringer",note:"Eksponeringer tabt fordi budgettet slap op."},{channels:["google_ads"],key:"lost_rank",label:"Tabt IS (rang)",group:"visibility",sort:e=>e.search_rank_lost_is,render:e=>xe(e.search_rank_lost_is),delta:e=>e.delta_search_rank_lost_is_pct,invertDelta:!0,formula:"Σ(Tabt IS rang × eksponeringer) / Σ eksponeringer",note:"Eksponeringer tabt pga. lav annoncerangering (bud eller kvalitet)."},{channels:M,key:"outbound",label:"Link-klik",group:"traffic",sort:e=>e.outbound_clicks??null,render:e=>ue(e.outbound_clicks),delta:e=>e.delta_outbound_clicks_pct??null,formula:"Sum af udgående klik (outbound) i perioden",note:"Klik der fører væk fra Meta til dit website."},{channels:M,key:"outbound_ctr",label:"Outbound CTR",group:"traffic",sort:e=>e.outbound_ctr??null,render:e=>Me(e.outbound_ctr,2),delta:e=>e.delta_outbound_ctr_pct??null,formula:"(Link-klik / Eksponeringer) × 100"},{channels:M,key:"cpc_outbound",label:"CPC (link)",group:"traffic",sort:e=>e.cpc_outbound??null,render:e=>q(e.cpc_outbound),delta:e=>e.delta_cpc_outbound_pct??null,invertDelta:!0,formula:"Samlet spend / Link-klik"},{key:"clicks",label:"Kliks",group:"traffic",sort:e=>e.clicks,render:e=>ke(e.clicks),delta:e=>e.delta_clicks_pct},{key:"impressions",label:"Eksp.",group:"traffic",sort:e=>e.impressions,render:e=>ke(e.impressions),delta:e=>e.delta_impressions_pct},{key:"ctr",label:"CTR",group:"traffic",sort:e=>e.ctr,render:e=>Be(e.ctr,2),delta:e=>e.delta_ctr_pct,formula:"(Samlede kliks / Samlede eksponeringer) × 100",note:"Vægtet total for hele perioden, ikke et gennemsnit af dagsprocenter."},{key:"cpc",label:"Gns. CPC",group:"traffic",sort:e=>e.cpc,render:e=>q(e.cpc),delta:e=>e.delta_cpc_pct,invertDelta:!0,formula:"Samlet spend / Samlede kliks"},{channels:M,key:"hook",label:"Hook Rate",group:"traffic",sort:e=>e.hook_rate??null,render:e=>Me(e.hook_rate),delta:e=>e.delta_hook_rate_pct??null,formula:"(3-sek. videovisninger / Eksponeringer) × 100",note:"Hvor mange der stopper op ved videoen. Kun video — billeder vises som —."},{channels:M,key:"hold",label:"Hold Rate",group:"traffic",sort:e=>e.hold_rate??null,render:e=>Me(e.hold_rate),delta:e=>e.delta_hold_rate_pct??null,formula:"(ThruPlays / 3-sek. videovisninger) × 100",note:"Hvor mange af dem, der stoppede op, der så videoen færdig (eller 15 sek.)."},{channels:M,key:"thruplays",label:"ThruPlays",group:"traffic",sort:e=>e.thruplays??null,render:e=>e.video_3s?ue(e.thruplays):"—",delta:e=>e.delta_thruplays_pct??null,formula:"Sum af visninger til ende eller mindst 15 sek."},{channels:M,key:"watch",label:"Gns. afspilning",group:"traffic",sort:e=>e.avg_watch_time??null,render:e=>la(e.avg_watch_time),delta:e=>e.delta_avg_watch_time_pct??null,formula:"Σ(gns. afspilningstid × 3-sek. visninger) / Σ 3-sek. visninger",note:"Vægtet med videovisninger over perioden."},{channels:["google_ads","meta_ads"],key:"daily_budget",label:"Dagsbudget",group:"budget",sort:e=>e.daily_budget,render:e=>q(e.daily_budget),delta:e=>e.delta_daily_budget_pct,formula:"Kampagnens budget pr. dag (seneste dag i perioden)",note:"Total = sum af aktive kampagners dagsbudget. Delte budgetter kan tælle flere gange."},{channels:["google_ads","meta_ads"],key:"bidding",label:"Budstrategi",group:"budget",sort:e=>xt(e.bidding_strategy),render:e=>xt(e.bidding_strategy)??"—",align:"left"},{channels:["google_ads","meta_ads"],key:"status",label:"Status",group:"budget",sort:e=>e.status,render:(e,t)=>t?`${e.activeCount??0} af ${e.totalCount??0} aktive`:e.status?ia[e.status]??e.status:"—",align:"left"},{channels:M,key:"lifetime_budget",label:"Livstidsbudget",group:"budget",sort:e=>e.lifetime_budget??null,render:e=>q(e.lifetime_budget),formula:"Kampagnens samlede budget for hele løbetiden",note:"Ved ABO er det summen af annoncesættenes budgetter."},{channels:M,key:"cbo",label:"CBO/ABO",group:"budget",sort:e=>e.is_cbo==null?null:e.is_cbo?"CBO":"ABO",render:(e,t)=>t?"":e.is_cbo==null?"—":e.is_cbo?"CBO":"ABO",align:"left",formula:"CBO = budget på kampagnen. ABO = budget på annoncesættene"},{channels:M,key:"attribution",label:"Attribution",group:"budget",sort:e=>e.attribution_window??null,render:(e,t)=>t?"":e.attribution_window??"—",align:"left",formula:"Annoncesættenes attributionsvindue",note:'Fx 7d klik · 1d visning. "Flere" når annoncesættene er sat forskelligt op.'}];function Xe(e,t){return zt.filter(a=>(!a.channels||a.channels.includes(e))&&(!a.available||!t||a.available(t)))}function ca(e){const t=Xe(e);return aa.filter(a=>t.some(r=>r.group===a.id)).map(a=>e==="meta_ads"&&a.id==="visibility"?{...a,label:"Rækkevidde & frekvens"}:e==="meta_ads"&&a.id==="traffic"?{...a,label:"Trafik & video"}:a)}function da(e){const t=f=>e.reduce((j,k)=>j+f(k),0),a=t(f=>f.spend),r=t(f=>f.revenue),s=t(f=>f.purchases),i=t(f=>f.clicks),o=t(f=>f.impressions),m=t(f=>f.search_weight_impressions),c=t(f=>f.click_share_weight_clicks),u=(f,j,k)=>{const A=e.filter(_=>f(_)!==null&&j(_)>0),T=A.reduce((_,w)=>_+j(w),0);return T>0&&k>0?A.reduce((_,w)=>_+f(w)*j(w),0)/T:null},p=e.filter(f=>bt(f.status)),b=e.some(f=>f.outbound_clicks!=null),x=f=>{const j=e.map(f).filter(k=>k!=null);return j.length?j.reduce((k,A)=>k+A,0):null},g=b?(()=>{const f=x(_=>_.reach),j=x(_=>_.outbound_clicks)??0,k=x(_=>_.video_3s)??0,A=x(_=>_.thruplays)??0,T=e.reduce((_,w)=>_+(w.avg_watch_time??0)*(w.watch_weight??0),0);return{reach:f,frequency:f&&f>0?o/f:null,outbound_clicks:j,outbound_ctr:o>0?j/o*100:null,cpc_outbound:j>0?a/j:null,add_to_cart:x(_=>_.add_to_cart),initiate_checkout:x(_=>_.initiate_checkout),thruplays:A,video_3s:k,hook_rate:o>0&&k>0?k/o*100:null,hold_rate:k>
40?A/k*100:null,avg_watch_time:k>0?T/k:null,lifetime_budget:x(_=>bt(_.status)?_.lifetime_budget:null)}})():{},d=p.map(f=>f.daily_budget).filter(f=>f!==null),l=new Set(e.map(f=>f.bidding_strategy).filter(Boolean)),y=x(f=>f.pm_revenue),v=x(f=>f.pm_gross_profit);return{campaign_id:"__total__",campaign_name:"Total",spend:a,revenue:r,purchases:s,clicks:i,impressions:o,roas:a>0?r/a:null,pm_revenue:y,pm_gross_profit:v,pm_roas:y!=null&&a>0?y/a:null,poas:v!=null&&a>0?v/a:null,delta_pm_revenue_pct:null,delta_pm_gross_profit_pct:null,delta_pm_roas_pct:null,delta_poas_pct:null,cpc:i>0?a/i:null,cpm:o>0?a*1e3/o:null,cpa:s>0?a/s:null,cvr:i>0?s/i*100:null,ctr:o>0?i/o*100:null,search_impression_share:u(f=>f.search_impression_share,f=>f.search_weight_impressions,m),search_weight_impressions:m,search_click_share:u(f=>f.search_click_share,f=>f.click_share_weight_clicks,c),click_share_weight_clicks:c,search_budget_lost_is:u(f=>f.search_budget_lost_is,f=>f.search_weight_impressions,m),search_rank_lost_is:u(f=>f.search_rank_lost_is,f=>f.search_weight_impressions,m),daily_budget:d.length?d.reduce((f,j)=>f+j,0):null,bidding_strategy:l.size===1?[...l][0]:l.size>1?"Flere":null,status:null,channel_type:null,activeCount:p.length,totalCount:e.length,delta_spend_pct:null,delta_revenue_pct:null,delta_purchases_pct:null,delta_roas_pct:null,delta_clicks_pct:null,delta_impressions_pct:null,delta_cpa_pct:null,delta_cvr_pct:null,delta_ctr_pct:null,delta_cpc_pct:null,delta_search_impression_share_pct:null,delta_search_click_share_pct:null,delta_search_budget_lost_is_pct:null,delta_search_rank_lost_is_pct:null,delta_daily_budget_pct:null,...g}}function vt(e){return e==null?!0:typeof e=="number"?!Number.isFinite(e):e.trim()===""}function Je(e,t,a){const r=zt.find(s=>s.key===t);return r?[...e].sort((s,i)=>{const o=r.sort(s),m=r.sort(i),c=vt(o),u=vt(m);if(c&&u)return i.spend-s.spend;if(c)return 1;if(u)return-1;const p=typeof o=="string"?o.localeCompare(m,"da"):o-m;return a==="asc"?p:-p}):[...e].sort((s,i)=>i.spend-s.spend)}function ze({pct:e,invert:t}){if(e===null||!Number.isFinite(e))return null;const a=e>=0,r=t?!a:a;return n.jsxs("span",{className:S("inline-flex items-center gap-0.5 text-[11px] tabular-nums",r?"text-success":"text-destructive"),children:[a?n.jsx(Ze,{className:"size-3"}):n.jsx(Ye,{className:"size-3"}),Math.abs(e).toFixed(1),"%"]})}function ua({col:e}){return e.formula?n.jsxs($r,{delayDuration:150,children:[n.jsx(Lr,{asChild:!0,children:n.jsx("span",{className:"cursor-help underline decoration-dotted decoration-muted-foreground/60 underline-offset-4",children:e.label})}),n.jsxs(Fr,{side:"top",className:"max-w-xs border border-accent/40 bg-popover p-3 text-popover-foreground",children:[n.jsx("div",{className:"font-display text-sm tracking-wide text-primary",children:e.label}),n.jsx("code",{className:"mt-1.5 block rounded bg-secondary px-2 py-1 font-mono text-[11px] leading-snug text-foreground",children:e.formula}),e.note&&n.jsx("p",{className:"mt-1.5 text-xs leading-snug text-muted-foreground",children:e.note})]})]}):n.jsx("span",{children:e.label})}function Vt({hidden:e,name:t,onToggle:a}){return n.jsx("button",{type:"button",onClick:a,"aria-pressed":!e,"aria-label":e?`Medtag ${t} i total`:`Udelad ${t} fra total`,title:e?"Medtag i total":"Udelad fra total",className:S("shrink-0 rounded p-1 transition-colors hover:bg-secondary hover:text-foreground",e?"text-muted-foreground":"text-accent"),children:e?n.jsx(sn,{className:"size-3.5"}):n.jsx(qr,{className:"size-3.5"})})}function pa(e){const[t,a]=P.useState(()=>new Set);P.useEffect(()=>{if(e)try{const i=window.localStorage.getItem(e);a(new Set(i?JSON.parse(i):[]))}catch{a(new Set)}},[e]);const r=i=>{if(a(i),!!e)try{i.size?window.localStorage.setItem(e,JSON.stringify([...i])):window.localStorage.removeItem(e)}catch{}};return{hidden:t,toggle:i=>{const o=new Set(t);o.has(i)?o.delete(i):o.add(i),r(o)},reset:()=>r(new Set)}}function ma({rows:e,channel:t,isLoading:a,storageKey:r,drill:s}){const i=(t==="meta_ads"||t==="google_ads")&&!!s,o=t==="google_ads"?"adgroup":"adset",[m,c]=P.useState(()=>new Set),u=h=>c(E=>{const R=new Set(E);return R.has(h)?R.delete(h):R.add(h),R}),[p,b]=P.useState(null),[x,g]=P.useState("desc"),[d,l]=P.useState("all"),{hidden:y,toggle:v,reset:f}=pa(r),j=ca(t),k=Xe(t,e??[]).filter(h=>j.some(E=>E.id===h.group)&&(d==="all"||h.group===d)),A=P.useMemo(()=>new Set((e??[]).filter(h=>y.has(h.campaign_id)).map(h=>h.campaign_id)),[e,y]),T=P.useMemo(()=>Je(e??[],p,x),[e,p,x]),_=P.useMemo(()=>(e??[]).filter(h=>!A.has(h.campaign_id)),[e,A]),w=P.useMemo(()=>da(_),[_]),B=h=>{p!==h?(b(h),g("desc")):x==="desc"?g("asc"):b(null)};if(a)return n.jsx("div",{className:"rounded-lg border border-border py-10 text-center text-sm text-muted-foreground",children:"Indlæser kampagner…"});if(!e||e.length===0)return n.jsx("div",{className:"rounded-lg border border-border py-10 text-center text-sm text-muted-foreground",children:"Ingen kampagne-data i perioden"});const L=A.size?`${_.length} af ${e.length} kampagner · ${A.size} udeladt`:`${e.length} kampagner`,ee=j.map(h=>({...h,span:k.filter(E=>E.group===h.id).length})).filter(h=>h.span>0),G=(h,E,R,$)=>{const U=!R&&h.delta?h.delta(E):null;return n.jsxs("td",{className:S("whitespace-nowrap px-3 py-2.5 tabular-nums",h.align==="left"?"text-left":"text-right",h.key===p&&!R&&"bg-secondary/40",$),children:[n.jsx("div",{children:h.render(E,R)}),U!==null&&n.jsx(ze,{pct:U,invert:h.invertDelta})]},h.key)};return n.jsxs(Mr,{children:[n.jsxs("div",{className:"mb-3 flex flex-wrap items-center gap-1.5",children:[[{id:"all",label:"Alle"},...j].map(h=>n.jsx("button",{type:"button",onClick:()=>
4l(h.id),className:S("rounded-full border px-3 py-1 text-xs transition-colors",d===h.id?"border-primary bg-primary text-primary-foreground":"border-border text-muted-foreground hover:border-accent hover:text-foreground"),children:h.label},h.id)),A.size>0&&n.jsxs("button",{type:"button",onClick:f,className:"ml-auto inline-flex items-center gap-1 rounded-full border border-border px-3 py-1 text-xs text-muted-foreground transition-colors hover:border-accent hover:text-foreground",children:[n.jsx(ln,{className:"size-3"}),"Nulstil visning (",A.size," udeladt)"]})]}),n.jsx("div",{className:"hidden max-h-[70vh] overflow-auto rounded-lg border border-border md:block",children:n.jsxs("table",{className:"w-full border-separate border-spacing-0 text-sm",children:[n.jsxs("thead",{className:"sticky top-0 z-20 bg-card",children:[n.jsxs("tr",{children:[n.jsx("th",{rowSpan:2,className:"sticky left-0 z-30 min-w-56 border-b border-r border-border bg-card px-3 py-2 text-left align-bottom",children:n.jsx("span",{className:"font-display text-base tracking-wide",children:"Kampagne"})}),ee.map(h=>n.jsx("th",{colSpan:h.span,className:S("border-b-2 border-l border-l-border px-3 pb-1 pt-2 text-left font-display text-sm font-normal tracking-wider",h.tone),children:h.label},h.id))]}),n.jsx("tr",{children:k.map((h,E)=>{const R=E===0||k[E-1].group!==h.group,$=p===h.key;return n.jsx("th",{"aria-sort":$?x==="asc"?"ascending":"descending":"none",className:S("whitespace-nowrap border-b border-border px-3 py-2 text-xs font-semibold text-muted-foreground",h.align==="left"?"text-left":"text-right",R&&"border-l"),children:n.jsxs("div",{className:S("inline-flex items-center gap-1",h.align!=="left"&&"flex-row-reverse"),children:[n.jsx("button",{type:"button",onClick:()=>B(h.key),"aria-label":`Sortér efter ${h.label}`,className:S("rounded p-0.5 hover:text-foreground",$&&"text-primary"),children:$?x==="desc"?n.jsx(Vr,{className:"size-3.5"}):n.jsx(Hr,{className:"size-3.5"}):n.jsx(nn,{className:"size-3.5 opacity-50"})}),n.jsx(ua,{col:h})]})},h.key)})})]}),n.jsx("tbody",{children:T.map(h=>{const E=A.has(h.campaign_id);return n.jsxs(P.Fragment,{children:[n.jsxs("tr",{className:S("group transition-opacity",E&&"opacity-40"),children:[n.jsx("td",{className:"sticky left-0 z-10 max-w-72 border-b border-r border-border bg-card px-3 py-2.5 group-hover:bg-secondary",children:n.jsxs("div",{className:"flex items-start gap-1.5",children:[i&&n.jsx(Qe,{open:m.has(h.campaign_id),name:h.campaign_name,onToggle:()=>u(h.campaign_id)}),n.jsx(Vt,{hidden:E,name:h.campaign_name,onToggle:()=>v(h.campaign_id)}),n.jsxs("div",{className:"min-w-0",children:[n.jsx("div",{className:S("truncate font-medium",E&&"line-through decoration-muted-foreground/60"),title:h.campaign_name,children:h.campaign_name}),h.channel_type&&n.jsx("div",{className:"text-[11px] uppercase tracking-wide text-muted-foreground",children:h.channel_type.replaceAll("_"," ").toLowerCase()})]})]})}),k.map((R,$)=>G(R,h,!1,S("border-b border-border",($===0||k[$-1].group!==R.group)&&"border-l")))]}),i&&m.has(h.campaign_id)&&n.jsx(qt,{drill:s,level:o,parentId:h.campaign_id,sortKey:p,sortDir:x,colCount:k.length+1,renderCells:R=>k.map(($,U)=>G($,R,!1,S("border-b border-border/60 bg-secondary/20 py-2 text-[13px]",(U===0||k[U-1].group!==$.group)&&"border-l")))})]},h.campaign_id)})}),n.jsx("tfoot",{className:"sticky bottom-0 z-20",children:n.jsxs("tr",{className:"font-semibold",children:[n.jsxs("td",{className:"sticky left-0 z-30 border-r border-t-2 border-t-primary/40 border-r-border bg-secondary px-3 py-3",children:[n.jsx("div",{className:"font-display text-base tracking-wide",children:"Total"}),n.jsx("div",{className:"text-[11px] font-normal text-muted-foreground",children:L})]}),k.map(h=>G(h,w,!0,"border-t-2 border-t-primary/40 bg-secondary py-3"))]})})]})}),n.jsx(ga,{rows:T,total:w,channel:t,sortKey:p,sortDir:x,hidden:A,onToggle:v,totalSub:L,drill:i?s:void 0,onSort:(h,E)=>{b(h),g(E)}})]})}const fa=["spend","revenue","roas","pm_revenue","pm_roas"];function ga({rows:e,total:t,channel:a,sortKey:r,sortDir:s,onSort:i,hidden:o,onToggle:m,totalSub:c,drill:u}){const p=Xe(a,e),b=fa.map(l=>p.find(y=>y.key===l)).filter(l=>l!=null).slice(0,3),x=new Set(b.map(l=>l.key)),g=p.filter(l=>!x.has(l.key)),d=r?`${r}:${s}`:"default";return n.jsxs("div",{className:"space-y-2 md:hidden",children:[n.jsxs(Dr,{value:d,onValueChange:l=>{if(l==="default")i(null,"desc");else{const[y,v]=l.split(":");i(y,v)}},children:[n.jsx(Kr,{className:"h-9 text-xs",children:n.jsx(Br,{placeholder:"Sortering"})}),n.jsxs(zr,{children:[n.jsx(Ee,{value:"default",children:"Standard (højeste spend)"}),p.flatMap(l=>[n.jsxs(Ee,{value:`${l.key}:desc`,children:[l.label," — højeste først"]},`${l.key}:desc`),n.jsxs(Ee,{value:`${l.key}:asc`,children:[l.label," — laveste først"]},`${l.key}:asc`)])]})]}),n.jsx(Ve,{row:t,top:b,details:g,isTotal:!0,subtitle:c}),e.map(l=>
4n.jsx(Ve,{row:l,top:b,details:g,off:o.has(l.campaign_id),onToggle:()=>m(l.campaign_id),drill:u?{ctx:u,level:a==="google_ads"?"adgroup":"adset",sortKey:r,sortDir:s}:void 0},l.campaign_id))]})}function Ve({row:e,top:t,details:a,isTotal:r=!1,subtitle:s,off:i=!1,onToggle:o,drill:m,nested:c}){const[u,p]=P.useState(!1),[b,x]=P.useState(!1);return n.jsxs("div",{children:[n.jsxs("div",{className:S("rounded-lg border p-3 transition-opacity",r?"border-primary/40 bg-secondary":c?"border-border/70 bg-secondary/30":"border-border bg-card",i&&"opacity-40"),children:[n.jsxs("div",{className:"flex items-center justify-between gap-2",children:[n.jsxs("div",{className:"flex min-w-0 items-center gap-1",children:[m&&n.jsx(Qe,{open:b,name:e.campaign_name,onToggle:()=>x(g=>!g)}),o&&n.jsx(Vt,{hidden:i,name:e.campaign_name,onToggle:o}),e.thumbnail_url&&n.jsx(Ht,{url:e.thumbnail_url}),n.jsxs("div",{className:"min-w-0",children:[c&&n.jsx("div",{className:"text-[10px] uppercase tracking-wide text-accent",children:c==="adset"?"Annoncesæt":c==="adgroup"?"Annoncegruppe":"Annonce"}),n.jsx("div",{className:S("min-w-0 truncate",r?"font-display text-lg tracking-wide":"text-sm font-medium",i&&"line-through"),children:r?"Total":e.campaign_name})]})]}),r&&n.jsx("span",{className:"shrink-0 text-[11px] text-muted-foreground",children:s})]}),n.jsx("div",{className:"mt-2 grid grid-cols-3 gap-2",children:t.map(g=>n.jsxs("div",{children:[n.jsx("div",{className:"text-[10px] uppercase tracking-wide text-muted-foreground",children:g.label}),n.jsx("div",{className:S("tabular-nums font-semibold",r?"text-base":"text-sm"),children:g.render(e,r)}),!r&&g.delta&&n.jsx(ze,{pct:g.delta(e)})]},g.key))}),n.jsxs("button",{type:"button",onClick:()=>p(g=>!g),className:"mt-2 inline-flex items-center gap-1 text-xs text-accent",children:[u?"Skjul detaljer":"Vis detaljer",n.jsx(Wr,{className:S("size-3.5 transition-transform",u&&"rotate-180")})]}),u&&n.jsx("dl",{className:"mt-2 grid grid-cols-2 gap-x-3 gap-y-1.5 border-t border-border pt-2 text-xs",children:a.map(g=>n.jsxs("div",{className:"flex justify-between gap-2",children:[n.jsx("dt",{className:"text-muted-foreground",children:g.label}),n.jsxs("dd",{className:"text-right tabular-nums",children:[n.jsx("div",{children:g.render(e,r)}),!r&&g.delta&&n.jsx(ze,{pct:g.delta(e),invert:g.invertDelta})]})]},g.key))})]}),m&&b&&n.jsx(ha,{drill:m,parentId:e.campaign_id,top:t,details:a})]})}function Qe({open:e,name:t,onToggle:a}){return n.jsx("button",{type:"button",onClick:a,"aria-expanded":e,"aria-label":e?`Fold ${t} ind`:`Fold ${t} ud`,className:"shrink-0 rounded p-1 text-muted-foreground transition-colors hover:bg-secondary hover:text-foreground",children:n.jsx(Gr,{className:S("size-3.5 transition-transform",e&&"rotate-90 text-accent")})})}function Ht({url:e}){return n.jsx("img",{src:e,alt:"",loading:"lazy",className:"size-8 shrink-0 rounded border border-border object-cover"})}function Gt(e,t,a){const r=Q(mr),s=Q(fr);return ne({queryKey:["campaign-children",e.clientId,t,a,e.from,e.to],queryFn:()=>t==="adgroup"?s({data:{clientId:e.clientId,from:e.from,to:e.to,parentId:a}}):r({data:{...e,level:t,parentId:a}}),staleTime:5*6e4})}const je={adset:"annoncesæt",ad:"annoncer",adgroup:"annoncegrupper"};function qt({drill:e,level:t,parentId:a,sortKey:r,sortDir:s,colCount:i,renderCells:o}){const{data:m,isLoading:c,error:u}=Gt(e,t,a),[p,b]=P.useState(()=>new Set),x=P.useMemo(()=>Je(m??[],r,s),[m,r,s]),g=t==="ad"?"pl-14":"pl-8",d=c?`Henter ${je[t]}…`:u?`Kunne ikke hente ${je[t]}`:x.length===0?`Ingen ${je[t]} med data i perioden`:null;return d?n.jsx("tr",{children:n.jsx("td",{colSpan:i,className:S("border-b border-border/60 bg-secondary/20 py-2 text-xs text-muted-foreground",g),children:d})}):n.jsx(n.Fragment,{children:x.map(l=>{const y=p.has(l.campaign_id);return n.jsxs(P.Fragment,{children:[n.jsxs("tr",{className:"group",children:[n.jsx("td",{className:S("sticky left-0 z-10 max-w-72 border-b border-r border-border/60 bg-card py-2 pr-3 group-hover:bg-secondary",g),children:n.jsxs("div",{className:"flex items-center gap-1.5 border-l-2 border-accent/40 pl-2",children:[t==="adset"&&n.jsx(Qe,{open:y,name:l.campaign_name,onToggle:()=>b(v=>{const f=new Set(v);return f.has(l.campaign_id)?f.delete(l.campaign_id):f.add(l.campaign_id),f})}),l.thumbnail_url&&n.jsx(Ht,{url:l.thumbnail_url}),n.jsxs("div",{className:"min-w-0",children:[n.jsx("div",{className:"truncate text-[13px]",title:l.campaign_name,children:l.campaign_name}),n.jsx("div",{className:"text-[10px] uppercase tracking-wide text-muted-foreground",children:t==="adset"?`Annoncesæt${l.child_count?` · ${l.child_count} annoncer`:""}`:t==="adgroup"?"Annoncegruppe":"Annonce"})]})]})}),o(l)]}),t==="adset"&&y&&n.jsx(qt,{drill:e,level:"ad",parentId:l.campaign_id,sortKey:r,sortDir:s,colCount:i,renderCells:o})]},l.campaign_id)})})}function ha({drill:e,parentId:t,top:a,details:r}){const{data:s,isLoading:i,error:o}=Gt(e.ctx,e.level,t),m=P.useMemo(()=>Je(s??[],e.sortKey,e.sortDir),[s,e.sortKey,e.sortDir]),c=je[e.level];return n.jsxs("div",{className:"ml-3 mt-2 space-y-2 border-l-2 border-accent/40 pl-3",children:[i&&n.jsxs("div",{className:"py-1 text-xs text-muted-foreground",children:["Henter ",c,"…"]}),o&&n.jsxs("div",{className:"py-1 text-xs text-muted-foreground",children:["Kunne ikke hente ",c]}),!i&&!o&&m.length===0&&n.jsxs("div",{className:"py-1 text-xs text-muted-foreground",children:["Ingen ",c," med data i perioden"]}),m.map(u=>n.jsx(Ve,{row:u,top:a,details:r,nested:e.level,drill:e.level==="adset"?{...e,level:"ad"}:void 0},u.campaign_id))]})}function _t(e){return e===null?"—":e.toFixed(2)}function ba(e){return`${e>=0?"+":"−"}${C(Math.abs(e))}`}function xa({current:e,previous:t,targetPoas:a,compareLabel:r}){const s=e.spend-t.spend,i=e.revenue-t.revenue,m=e.gross_profit!==null&&t.gross_profit!==null?e.gross_profit-t.gross_profit:null,c=s>0,u=c?i/s:null,p=c&&m!==null?m/s:null,b=a&&a>0?a:null,x=(()=>
4{if(t.spend===0&&e.spend===0)return{tone:"neutral",headline:"Ingen annoncering i nogen af perioderne",detail:`Der er ikke brugt annoncekroner i perioden eller i ${r}`};if(t.spend===0&&t.revenue===0)return{tone:"neutral",headline:"Intet at sammenligne med",detail:`Der findes ingen tal for ${r}, så tallene herover svarer til almindelig ROAS og POAS`};if(s<0){const l=m;return{tone:"neutral",headline:"Annonceforbruget er sænket",detail:l===null?`Forbruget er ${C(Math.abs(s))} lavere end ${r}, så der er intet merforbrug at måle på`:`Forbruget er ${C(Math.abs(s))} lavere end ${r}, og dækningsbidraget ${l>=0?"steg":"faldt"} ${C(Math.abs(l))}`}}return c?p===null?{tone:"neutral",headline:"Kun omsætning kan måles",detail:"Kunden har ikke dækningsbidrag i systemet, så merforbrugets effekt på bundlinjen er ukendt"}:p<1?{tone:"bad",headline:"Merforbruget koster på bundlinjen",detail:`Hver ekstra annoncekrone gav kun ${p.toFixed(2)} i dækningsbidrag. Sænk forbruget, eller forbedr priser, kurvstørrelse og annoncer først`}:b!==null&&p<b?{tone:"warn",headline:"Vækst under kundens mål",detail:`Merforbruget gav ${p.toFixed(2)} mod målet ${b.toFixed(2)}. Det tilføjer til bundlinjen, men svagere end aftalt`}:{tone:"good",headline:"Skaleringen er rentabel",detail:b!==null?`Merforbruget gav ${p.toFixed(2)} mod målet ${b.toFixed(2)}. Der er plads til mere forbrug`:`Merforbruget gav ${p.toFixed(2)} i dækningsbidrag pr. ekstra annoncekrone`}:{tone:"neutral",headline:"Uændret annonceforbrug",detail:`Forbruget ligger på niveau med ${r}, så der er intet merforbrug at måle på`}})(),g=p===null?"text-muted-foreground":p<1?"text-destructive":b!==null&&p<b?"text-warning":"text-accent",d=x.tone==="good"?Ur:Zr;return n.jsxs(z,{className:"relative overflow-hidden p-0",children:[n.jsx("div",{className:"brand-rule h-0.5 w-full","aria-hidden":"true"}),n.jsxs("div",{className:"space-y-6 p-4 md:p-6",children:[n.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[n.jsxs("div",{className:"space-y-2",children:[n.jsx("span",{className:"inline-flex items-center rounded-pill border border-border bg-secondary px-4 py-1.5 text-[10px] font-medium uppercase tracking-[0.2em] text-muted-foreground",children:"Væksteffektivitet"}),n.jsx("h2",{className:"font-display text-xl leading-none tracking-wide md:text-2xl",children:"Marginalafkast"}),n.jsxs("p",{className:"max-w-[60ch] text-xs text-muted-foreground",children:["Hvad gav den ekstra annoncekrone sammenlignet med ",r,"?"]})]}),b!==null&&n.jsxs("div",{className:"text-right",children:[n.jsx("div",{className:"text-[10px] uppercase tracking-[0.2em] text-muted-foreground",children:"Mål POAS"}),n.jsx("div",{className:"font-display text-2xl tabular-nums",children:b.toFixed(2)})]})]}),n.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[n.jsx(yt,{label:"Marginal ROAS",help:"Δ omsætning ÷ Δ spend",value:_t(u),className:"text-primary"}),n.jsx(yt,{label:"Marginal POAS",help:"Δ dækningsbidrag ÷ Δ spend",value:_t(p),className:g})]}),n.jsxs("div",{className:"grid grid-cols-1 gap-px overflow-hidden rounded-lg border border-border bg-border sm:grid-cols-3",children:[n.jsx($e,{label:"Merforbrug",value:s,invert:!0}),n.jsx($e,{label:"Meromsætning",value:i}),n.jsx($e,{label:"Merdækningsbidrag",value:m})]}),n.jsxs("div",{className:S("flex items-start gap-3 rounded-lg border p-3",x.tone==="good"&&"border-accent/40 bg-accent/10",x.tone==="warn"&&"border-warning/40 bg-warning/10",x.tone==="bad"&&"border-destructive/40 bg-destructive/10",x.tone==="neutral"&&"border-border bg-secondary"),children:[n.jsx(d,{className:S("mt-0.5 size-4 shrink-0",x.tone==="good"&&"text-accent",x.tone==="warn"&&"text-warning",x.tone==="bad"&&"text-destructive",x.tone==="neutral"&&"text-muted-foreground")}),n.jsxs("div",{className:"min-w-0 space-y-1",children:[n.jsx("p",{className:"text-sm font-medium",children:x.headline}),n.jsx("p",{className:"text-xs leading-relaxed text-muted-foreground",children:x.detail})]})]}),b===null&&n.jsx("p",{className:"text-xs text-muted-foreground",children:"Sæt et mål for blended POAS på kunden i CRM, så vurderingen kan holdes op mod kundens eget mål."})]})]})}function yt({label:e,help:t,value:a,className:r}){return n.jsxs("div",{className:"rounded-lg border border-border bg-secondary p-4",children:[n.jsx("div",{className:"text-[10px] uppercase tracking-[0.2em] text-muted-foreground",children:e}),n.jsx("div",{className:S("font-display text-4xl leading-none tabular-nums md:text-5xl",r),children:a}),n.jsx("div",{className:"mt-2 text-xs text-muted-foreground",children:t})]})}function $e({label:e,value:t,invert:a}){const r=(t??0)>=0;return n.jsxs("div",{className:"bg-card p-3",children:[n.jsx("div",{className:"text-[10px] uppercase tracking-[0.2em] text-muted-foreground",children:e}),n.jsxs("div",{className:"mt-1 flex items-center gap-1.5",children:[t!==null&&(r?n.jsx(Ze,{className:S("size-3.5",a?"text-muted-foreground":"text-accent")}):n.jsx(Ye,{className:S("size-3.5",a?"text-muted-foreground":"text-destructive")}
4)),n.jsx("span",{className:"text-base tabular-nums",children:t===null?"—":ba(t)})]})]})}const kt={profitmetrics:"PM",google_ads:"Google Ads",meta_ads:"Meta",bing_ads:"Microsoft Ads",ga4:"GA4"},Wt={revenue:"Revenue",spend:"Spend",orders:"Ordrer",roas:"ROAS",contribution_margin:"Contribution Margin",net_profit:"Net Profit",new_users:"New users",poas:"POAS",new_customers:"Nye kunder",returning_customers:"Eksisterende kunder"},Te={revenue:"oklch(0.8932 0.1462 92.2)",spend:"oklch(0.7104 0.1049 190.3)",orders:"oklch(0.62 0.13 262)",roas:"oklch(0.94 0.09 95)",contribution_margin:"oklch(0.84 0.07 190)",net_profit:"oklch(0.74 0.14 165)",new_users:"oklch(0.74 0.10 250)",poas:"oklch(0.80 0.14 78)",new_customers:"oklch(0.8932 0.1462 92.2)",returning_customers:"oklch(0.7104 0.1049 190.3)"},pe={revenue:"currency",spend:"currency",orders:"count",roas:"count",contribution_margin:"currency",net_profit:"currency",new_users:"count",poas:"count",new_customers:"count",returning_customers:"count"};function va(e){const[,t="",a=""]=e.split("-");return`${Number(a)}/${Number(t)}`}function _a(e){const[t="",a="",r=""]=e.split("-");return`${Number(r)}.${Number(a)}.${t}`}function jt(e){return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`}function Ut({pct:e,invert:t=!1}){if(e==null)return n.jsxs("span",{className:"inline-flex items-center gap-0.5 text-xs text-muted-foreground",children:[n.jsx(Qr,{className:"size-3"}),"—"]});const a=e>=0,r=t?!a:a;return n.jsxs("span",{className:S("inline-flex items-center gap-0.5 text-xs tabular-nums",r?"text-success":"text-destructive"),children:[a?n.jsx(Ze,{className:"size-3"}):n.jsx(Ye,{className:"size-3"}),Math.abs(e).toFixed(1),"%"]})}function At(e,t){return e===null||t===null||!Number.isFinite(e)||!Number.isFinite(t)?null:t===0?e===0?0:null:+((e-t)/Math.abs(t)*100).toFixed(1)}function ya({label:e,value:t,delta:a,invertDelta:r,metricKey:s,selected:i,onToggle:o}){const m=!!s&&!!o,c=s?Te[s]:void 0,u=n.jsxs(n.Fragment,{children:[n.jsxs("div",{className:"flex items-center justify-between gap-2 mb-2",children:[n.jsx("div",{className:"eyebrow text-xs leading-none text-muted-foreground",children:e}),m&&n.jsx("span",{"aria-hidden":!0,className:S("size-2 rounded-full transition-opacity",i?"opacity-100":"opacity-30"),style:{background:c}})]}),n.jsx("div",{className:"font-display text-3xl tabular-nums leading-none",children:t}),a!==void 0&&n.jsx("div",{className:"mt-2",children:n.jsx(Ut,{pct:a,invert:r})})]});return m?n.jsx(z,{role:"button",tabIndex:0,"aria-pressed":i,onClick:()=>o(s),onKeyDown:p=>{(p.key==="Enter"||p.key===" ")&&(p.preventDefault(),o(s))},className:S("p-4 cursor-pointer transition-all hover:border-primary/40",i&&"shadow-brand"),style:i?{borderColor:c}:void 0,children:u}):n.jsx(z,{className:"p-4",children:u})}function Ts(){const{clientId:e}=Yt.useParams(),{range:t,setRange:a,compare:r,setCompare:s}=cr("range:performance",()=>ur("yesterday"),"previous_period"),i=jt(t.from),o=jt(t.to),m=Q(xr),{data:c,isLoading:u}=ne({queryKey:["performance-overview",i,o,r],queryFn:()=>m({data:{from:i,to:o,compare:r}})}),p=c?.clients.find(_=>_.client_id===e),[b,x]=P.useState(["revenue"]),g=_=>{x(w=>
4w.includes(_)?w.length===1?w:w.filter(B=>B!==_):[...w,_])},d=Q(na),{data:l}=ne({queryKey:["client-trend",e,i,o,r],queryFn:()=>d({data:{clientId:e,from:i,to:o,compare:r}}),enabled:!!e}),y=Q(Qn),{data:v}=ne({queryKey:["client-ga4-insights",e,i,o,r],queryFn:()=>y({data:{clientId:e,from:i,to:o,compare:r}}),enabled:!!e,staleTime:5*6e4}),f=Q(Yr),{data:j}=ne({queryKey:["client_context","client",e],queryFn:()=>f({data:{client_id:e}}),enabled:!!e,staleTime:5*6e4}),k=j?.target_poas??null,A=r==="previous_month"?"forrige måned":r==="same_period_last_year"?"samme periode sidste år":"forrige periode",T=(p?.active_channels??[]).filter(_=>_==="google_ads"||_==="meta_ads"||_==="bing_ads");return n.jsxs("div",{className:"space-y-6",children:[n.jsxs("div",{children:[n.jsxs(Xt,{to:"/performance",className:"inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground mb-2",children:[n.jsx(tn,{className:"size-3"})," Tilbage til agency overview"]}),n.jsx(rr,{title:p?.client_name??"Kunde",description:p?`${p.client_type==="ecom"?p.channels.profitmetrics?"Ecom + PM":"Ecom":"Lead gen"} · ${p.active_channels.length} aktive kilder`:"Indlæser…",actions:n.jsxs(n.Fragment,{children:[n.jsxs("div",{className:"flex overflow-hidden rounded-md border border-border",children:[n.jsx("button",{type:"button",onClick:()=>s("previous_period"),className:S("px-3 py-1.5 text-xs transition-colors",r==="previous_period"?"bg-primary text-primary-foreground":"text-muted-foreground hover:text-foreground"),children:"Forr. periode"}),n.jsx("button",{type:"button",onClick:()=>s("previous_month"),className:S("px-3 py-1.5 text-xs transition-colors",r==="previous_month"?"bg-primary text-primary-foreground":"text-muted-foreground hover:text-foreground"),children:"Forr. måned"}),n.jsx("button",{type:"button",onClick:()=>s("same_period_last_year"),className:S("whitespace-nowrap px-3 py-1.5 text-xs transition-colors",r==="same_period_last_year"?"bg-primary text-primary-foreground":"text-muted-foreground hover:text-foreground"),children:"Sidste år"})]}),n.jsx(dr,{value:t,onChange:a}),n.jsx(pr,{invalidateKeys:["performance-overview","client-trend","client-campaigns"]})]})})]}),u&&!p?n.jsx(z,{className:"p-8 text-center text-sm text-muted-foreground",children:"Indlæser…"}):p?n.jsxs(n.Fragment,{children:[n.jsx("div",{className:"flex flex-wrap gap-2",children:p.active_channels.map(_=>n.jsx(ar,{variant:"outline",className:"text-xs",children:kt[_]},_))}),n.jsx(ka,{row:p,ga4:v??null,selected:b,onToggle:g}),n.jsxs(z,{className:"overflow-hidden",children:[n.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3 p-5 pb-0 mb-4",children:[n.jsxs("div",{children:[n.jsx("h3",{className:"font-display text-lg",children:"Trend"}),n.jsx("p",{className:"text-xs text-muted-foreground",children:"Klik KPI-fliserne for at vise/skjule dem i grafen"})]}),n.jsx("div",{className:"flex flex-wrap gap-1.5",children:b.map(_=>n.jsxs("span",{className:"inline-flex items-center gap-1.5 rounded-md border border-border/60 px-2 py-1 text-xs",children:[n.jsx("span",{"aria-hidden":!0,className:"size-2 rounded-full",style:{background:Te[_]}}),Wt[_]]},_))})]}),n.jsx("div",{className:"pb-5",children:n.jsx(Sa,{trend:l,metrics:b,ga4Daily:v?.daily??[],ga4DailyPrev:v?.daily_prev??[]})})]}),n.jsx(xa,{current:{spend:p.total_spend,revenue:p.total_revenue,gross_profit:p.total_gross_profit},previous:{spend:p.previous.spend,revenue:p.previous.revenue,gross_profit:p.previous.gross_profit},targetPoas:k,compareLabel:A}),v&&n.jsxs(n.Fragment,{children:[v.error&&n.jsx(z,{className:"p-3 text-xs text-warning",children:v.error}),(v.channels.length>0||v.countries.length>0||(v.cities?.length??0)>0)&&n.jsxs("section",{className:"grid gap-3 lg:grid-cols-2",children:[n.jsx(ea,{rows:v.channels}),n.jsx(ra,{rows:v.countries,cityRows:v.cities??[]})]})]}),T.length>0&&n.jsxs(z,{className:"p-5",children:[n.jsx("h3",{className:"font-display text-lg mb-4",children:"Kanaler & kampagner"}),n.jsxs(sr,{defaultValue:T[0],children:[n.jsx(ir,{className:"mb-4",children:T.map(_=>n.jsx(or,{value:_,children:kt[_]},_))}),T.map(_=>n.jsx(lr,{value:_,children:n.jsx(wa,{clientId:e,channel:_,from:i,to:o,summary:p.channels[_]})},_))]})]})]}):n.jsx(nr,{decorative:!0,icon:Xr,title:"Ingen data for kunden",description:"Prøv et bredere datointerval, eller kobl datakilder på under Integrationer."})]})}function ka({row:e,ga4:t,selected:a,onToggle:r}){const s=e.client_type==="ecom",i=e.channels.profitmetrics,o=e.total_revenue,m=e.total_spend,c=[];if(s&&i){c.push({label:"Ordrer",value:D(e.total_purchases),delta:e.delta_purchases_pct,metricKey:"orders"}),c.push({label:"Revenue",value:C(o),delta:e.delta_revenue_pct,metricKey:"revenue"}),c.push({label:"Contribution Margin",value:i.contribution_margin>0?C(i.contribution_margin):"—",delta:i.delta_cm_pct,metricKey:"contribution_margin"}),c.push({label:"Net Profit",value:C(i.net_profit),delta:i.delta_net_profit_pct,metricKey:"net_profit"}),c.push({label:"POAS",value:e.blended_poas!==null?e.blended_poas.toFixed(2):"—",delta:e.delta_poas_pct,metricKey:"poas"}),c.push({label:"Spend",value:C(m),delta:e.delta_spend_pct,metricKey:"spend"}),c.push({label:"Nye kunder",value:D(i.new_customers),delta:i.delta_new_customers_pct,metricKey:"new_customers"}),c.push({label:"Eksisterende kunder",value:D(i.returning_customers),delta:i.delta_returning_customers_pct,metricKey:"returning_customers"});const d=i.new_customers>0?m/i.new_customers:null,l=e.previous.new_customers&&e.previous.new_customers>0?e.previous.spend/e.previous.new_customers:null;c.push({label:"nCAC",value:d!==null?C(d):"—",delta:At(d,l),invertDelta:!0});const y=e.total_purchases>0?i.new_customers/e.total_purchases*100:null,v=e.previous.purchases>0&&e.previous.new_customers!==null?e.previous.new_customers/e.previous.purchases*100:null;c.push({label:"Ny-kundeandel",value:y!==null?`${y.toFixed(0)}%`:"—",delta:At(y,v)}),c.push({label:"Gennemsnitlig ny kundes bruttoprofit",value:i.avg_new_customer_gp!==null?C(i.avg_new_customer_gp):"—",delta:i.delta_avg_new_customer_gp_pct}),c.push({label:"Ny-kunde POAS",value:i.new_customers_poas!==null?i.new_customers_poas.toFixed(2):"—",delta:i.delta_new_customers_poas_pct})}else s?(c.push({label:"Ordrer",value:D(e.total_purchases),delta:e.delta_purchases_pct,metricKey:"orders"}),c.push({label:"Revenue",value:C(o),delta:e.delta_revenue_pct,metricKey:"revenue"}),c.push({label:"ROAS",value:m>0&&o>0?(o/m).toFixed(2):"—",metricKey:"roas"}),c.push({label:"Spend",value:C(m),delta:e.delta_spend_pct,metricKey:"spend"})):(c.push({label:"Leads",value:D(e.total_purchases),delta:e.delta_purchases_pct,metricKey:"orders"}),c.push({label:"CPA",value:e.total_purchases>0?C(m/e.total_purchases):"—"}),c.push({label:"Spend",value:C(m),delta:e.delta_spend_pct,metricKey:"spend"}));t&&!t.error&&(c.push({label:"New users",value:D(t.new_users),delta:t.delta_new_users_pct,metricKey:"new_users"}),c.push({label:"Session key event rate",value:t.session_key_event_rate!==null?`${t.session_key_event_rate.toFixed(1)}%`:"—",delta:t.delta_key_event_rate_pct}));const[u,p]=Na(),b=c.filter(d=>!u.includes(d.label)),x=(d,l)=>{const y=!u.includes(d);p(y?[...u,d]:u.filter(v=>v!==d)),y&&l&&a.includes(l)&&a.length>1&&r(l)},g=ja.map(d=>({...d,items:c.filter(l=>Aa(l.label)===d.id)})).filter(d=>d.items.length>0);return n.jsxs("div",{className:"space-y-3",children:[n.jsxs("div",{className:"flex items-center justify-between gap-3",children:[n.jsxs("span",{className:"text-xs text-muted-foreground tabular-nums",children:[b.length," af ",c.length," KPI'er vist"]}),n.jsxs(Jt,{children:[n.jsx(Qt,{asChild:!0,children:n.jsxs(et,{variant:"outline",size:"sm",className:"min-h-11 md:min-
4h-9",children:[n.jsx(dn,{className:"size-4"}),"Tilpas KPI'er"]})}),n.jsxs(er,{align:"end",className:"w-72 p-0",children:[n.jsxs("div",{className:"border-b border-border p-4",children:[n.jsx("div",{className:"font-display text-lg leading-none",children:"Tilpas KPI'er"}),n.jsx("p",{className:"mt-1 text-xs text-muted-foreground",children:"Vælg hvilke fliser der vises. Gælder alle kunder."})]}),n.jsx("div",{className:"max-h-[60vh] space-y-4 overflow-y-auto p-4",children:g.map(d=>n.jsxs("div",{className:"space-y-1",children:[n.jsx("div",{className:"eyebrow text-xs text-muted-foreground",children:d.label}),d.items.map(l=>{const y=!u.includes(l.label);return n.jsxs("label",{className:"flex min-h-11 cursor-pointer items-center justify-between gap-3 rounded-md px-2 text-sm hover:bg-muted md:min-h-9",children:[n.jsxs("span",{className:"flex items-center gap-2",children:[l.metricKey&&n.jsx("span",{"aria-hidden":!0,className:"size-2 rounded-full",style:{background:Te[l.metricKey]}}),l.label]}),n.jsx(tr,{checked:y,onCheckedChange:()=>x(l.label,l.metricKey)})]},l.label)})]},d.id))}),u.length>0&&n.jsx("div",{className:"border-t border-border p-2",children:n.jsx(et,{variant:"ghost",size:"sm",className:"w-full",onClick:()=>p([]),children:"Vis alle"})})]})]})]}),b.length===0?n.jsx(z,{className:"p-5 text-sm text-muted-foreground",children:"Alle KPI-fliser er skjult. Brug Tilpas KPI'er for at vise dem igen."}):n.jsx("section",{className:S("grid gap-3 grid-cols-2",b.length>=9?"md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5":b.length>=7?"md:grid-cols-4":b.length>=5?"md:grid-cols-3 lg:grid-cols-5":"md:grid-cols-4"),children:b.map(d=>n.jsx(ya,{...d,selected:d.metricKey?a.includes(d.metricKey):void 0,onToggle:d.metricKey?r:void 0},d.label))})]})}const ja=[{id:"result",label:"Resultat"},{id:"efficiency",label:"Spend og effektivitet"},{id:"customers",label:"Kunder"},{id:"customer_value",label:"Kundeværdi"},{id:"website",label:"Website"}];function Aa(e){return["Nye kunder","Eksisterende kunder","nCAC","Ny-kundeandel"].includes(e)?"customers":["Gennemsnitlig ny kundes bruttoprofit","Ny-kunde POAS"].includes(e)?"customer_value":["Spend","POAS","ROAS","CPA"].includes(e)?"efficiency":["New users","Session key event rate"].includes(e)?"website":"result"}const Nt="performance:hidden-kpis";function Na(){const[e,t]=P.useState([]);return P.useEffect(()=>{try{const r=window.localStorage.getItem(Nt);r&&t(JSON.parse(r))}catch{}},[]),[e,r=>{t(r);try{window.localStorage.setItem(Nt,JSON.stringify(r))}catch{}}]}function Sa({trend:e,metrics:t,ga4Daily:a=[],ga4DailyPrev:r=[]}){const s=br(),i=P.useMemo(()=>{if(!e)return[];const g=new Map(a.map(v=>[v.date,v.new_users])),d=new Map(r.map(v=>[v.date,v.new_users])),l=Math.max(e.current.length,e.previous.length),y=[];for(let v=0;v<l;v++){const f=e.current[v],j=e.previous[v],k={date:f?.date??j?.date??String(v)};for(const A of t){if(A==="new_users"){k[A]=f?g.get(f.date)??0:null,t.length===1&&(k[`${A}__prev`]=j?d.get(j.date)??0:null);continue}k[A]=f?St(f,A):null,t.length===1&&(k[`${A}__prev`]=j?St(j,A):null)}y.push(k)}return y},[e,t,a,r]),o=P.useMemo(()=>{if(i.length<=14)return i.map(y=>y.date);const g=i[0]?.date,d=i[Math.floor(i.length/2)]?.date,l=i[i.length-1]?.date;return[g,d,l].filter(Boolean)},[i]);if(!e||i.length===0||t.length===0)return n.jsx("div",{className:"h-64 flex items-center justify-center text-sm text-muted-foreground",children:t.length===0?"Vælg mindst én KPI":"Ingen data"});const m=t.some(g=>pe[g]==="currency"),c=t.some(g=>pe[g]==="count"),u=g=>new Intl.NumberFormat("da-DK",{notation:"compact",maximumFractionDigits:1}).format(g),p=t.includes("roas")||t.includes("poas"),b=g=>g.toFixed(p?2:0),x=(g,d)=>{const l=d.replace(/__prev$/,""),y=Wt[l]+(d.endsWith("__prev")?" (forrige)":"");return[pe[l]==="currency"?C(g):l==="roas"||l==="poas"?g.toFixed(2):g.toFixed(0),y]};return n.jsx("div",{className:"h-72",children:n.jsx(Rt,{width:"100%",height:"100%",children:n.jsxs(gr,{data:i,margin:{top:8,right:12,bottom:4,left:4},children:[n.jsx(Jr,{stroke:s.grid,strokeOpacity:.3,vertical:!1}),n.jsx(Ir,{dataKey:"date",tick:{fontSize:12,fill:"var(--foreground)",fontWeight:500}
4,axisLine:{stroke:s.axisLine},tickLine:!1,tickFormatter:va,ticks:o,interval:0,minTickGap:20}),m&&n.jsx(nt,{yAxisId:"currency",orientation:"left",tick:{fontSize:12,fill:"var(--foreground)",fontWeight:500},axisLine:!1,tickLine:!1,tickFormatter:u,width:54}),c&&n.jsx(nt,{yAxisId:"count",orientation:"right",tick:{fontSize:12,fill:"var(--foreground)",fontWeight:500},axisLine:!1,tickLine:!1,tickFormatter:b,width:44}),n.jsx(It,{contentStyle:{background:s.tooltipBg,border:`1px solid ${s.tooltipBorder}`,borderRadius:8,color:s.tooltipText,fontSize:12},formatter:x,labelFormatter:g=>_a(String(g))}),t.length===1&&t.map(g=>n.jsx(at,{name:`${g}__prev`,yAxisId:pe[g],type:"monotone",dataKey:`${g}__prev`,stroke:"var(--muted-foreground)",strokeDasharray:"6 4",strokeWidth:2,dot:!1,isAnimationActive:!1},`${g}__prev`)),t.map(g=>n.jsx(at,{name:g,yAxisId:pe[g],type:"monotone",dataKey:g,stroke:Te[g],strokeWidth:2,dot:!1,isAnimationActive:!1},g))]})})})}function St(e,t){return t==="roas"?e.roas:t==="poas"?e.poas:t==="new_users"?null:e[t]}function wa({clientId:e,channel:t,from:a,to:r,summary:s}){const i=Q(hr),{data:o,isLoading:m}=ne({queryKey:["client-campaigns",e,t,a,r],queryFn:()=>i({data:{clientId:e,channel:t,from:a,to:r}})});return n.jsxs("div",{className:"space-y-4",children:[s&&n.jsxs("div",{className:"grid grid-cols-2 gap-2 md:grid-cols-6",children:[n.jsx(te,{label:"Spend",value:C(s.spend),delta:s.delta_spend_pct}),n.jsx(te,{label:"Revenue",value:C(s.revenue),delta:s.delta_revenue_pct}),n.jsx(te,{label:"ROAS",value:s.roas!==null?s.roas.toFixed(2):"—",delta:s.delta_roas_pct}),n.jsx(te,{label:"POAS",value:s.poas!==null?s.poas.toFixed(2):"—",delta:s.delta_poas_pct}),n.jsx(te,{label:"CPC",value:s.cpc!==null?C(s.cpc):"—",delta:s.delta_cpc_pct}),n.jsx(te,{label:"Køb",value:D(s.purchases),delta:s.delta_purchases_pct})]}),n.jsx(ma,{rows:o,channel:t,isLoading:m,storageKey:`hidden-campaigns:${e}:${t}`,drill:{clientId:e,from:a,to:r}})]})}function te({label:e,value:t,delta:a}){return n.jsxs("div",{className:"rounded-md border border-border/60 bg-card/50 px-3 py-2",children:[n.jsx("div",{className:"eyebrow text-xs leading-none text-muted-foreground mb-1",children:e}),n.jsx("div",{className:"tabular-nums text-sm font-medium",children:t}),a!=null&&n.jsx("div",{className:"mt-0.5",children:n.jsx(Ut,{pct:a})})]})}export{Ts as component};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.