PageSourceSearch

https://lovegpt.com/assets/AdminSharePerformance-D1Y7hJc7.js

js lovegpt.com collected 2026-10-04 10:30:36 UTC 28,858 bytes, 2 lines download raw bytes

1const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/vue3-apexcharts-BguUQIR9.js","assets/index-Dq6lCjou.js","assets/index-B634mCDn.css"])))=>i.map(i=>d[i]);
2import{U as ye}from"./UserDetailModal-t6_2xoMp.js";import V from"./admin-DdLOcKrr.js";import{O as ve,H as j,bm as U,G as O,aA as K,by as be,o as t,c as l,v as s,t as n,F as f,b as w,a as e,r as A,e as C,n as T,f as ae,w as F,d as ee,x as me,b1 as fe,aX as $e,T as oe,q as re,Q as ge,aP as we,aQ as Ce}from"./index-Dq6lCjou.js";const B=[{key:"plot",label:"신롤 플롯",color:"#3987e5"},{key:"story",label:"스토리",color:"#d95926"},{key:"creator",label:"크리에이터",color:"#199e70"},{key:"invite",label:"초대 링크",color:"#c98500"}],Q=Object.fromEntries(B.map(a=>[a.key,a.label])),xe={lovemode:"러브모드",johnjal:"존잘"},Se=[{value:7,label:"7일"},{value:30,label:"30일"},{value:90,label:"90일"},{value:0,label:"전체"}],De=[{value:"",label:"전체 브랜드"},{value:"lovemode",label:"러브모드"},{value:"johnjal",label:"존잘"}],Le=[{key:"overview",label:"개요"},{key:"sharers",label:"공유자"},{key:"content",label:"콘텐츠"},{key:"quality",label:"품질"}
2],Ae=30,z="#1f1f28",ne="#e8e8ec",Z="#8a8a96",Ee={overview:a=>V.getShareOverview(a),sharers:a=>V.getShareSharers(a),content:a=>V.getShareContent(a),quality:a=>V.getShareQuality(a)};function y(a){return a==null?"—":Number(a).toLocaleString()}function se(a){return a==null?"—":`${a}%`}function W(a,r){return r?r<Ae?`${a}/${r}`:`${Math.round(a/r*1e3)/10}%`:"—"}function ue(a){return a?`≈₩${Math.round(a).toLocaleString()}`:"—"}function te(a){return a==null?"—":a<1?`${Math.round(a*60)}분`:a<48?`${Math.round(a*10)/10}시간`:`${Math.round(a/24)}일`}function G(a){return a?String(a).replace("T"," ").slice(0,16):"—"}function P(a){const r=a?(a.sheet_open||0)+(a.link_out||0)+(a.landing||0):0;return r?`관리자·운영 계정의 공유·착지 ${r}건(시트 ${a.sheet_open} · 전달 ${a.link_out} · 착지 ${a.landing})은 '내부 계정 제외'로 빠져 있습니다. 직접 테스트한 기록이면 체크를 끄면 보입니다.`:""}function Oe(a,r){if(a==null||r===null||r===void 0)return null;const p=a-r;if(p===0)return{dir:"flat",text:"± 0"};const $=r?` (${p>0?"+":""}${Math.round(p/r*100)}%)`:"";return{dir:p>0?"up":"down",text:`${p>0?"▲":"▼"} ${Math.abs(p).toLocaleString()}${$}`}}function le(){const a=j(null),r=j(null);function p(h){a.value!==h?(a.value=h,r.value="desc"):r.value==="desc"?r.value="asc":(a.value=null,r.value=null)}function $(h){return a.value!==h?"":r.value==="asc"?" ▲":" ▼"}function v(h){if(!a.value)return h;const g=a.value,d=r.value==="asc"?1:-1;return[...h].sort((o,x)=>{const S=o[g],m=x[g];return S==null?1:m==null?-1:typeof S=="number"&&typeof m=="number"?(S-m)*d:String(S).localeCompare(String(m))*d})}return{by:a,dir:r,toggle:p,mark:$,apply:v}}function Te(){const a=U({days:30,brand:"",excludeInternal:!0}),r=j("overview"),p=U({overview:null,sharers:null,content:null,quality:null}),$=U({overview:!1,sharers:!1,content:!1,quality:!1}),v=U({overview:"",sharers:"",content:"",quality:""}),h=U({overview:"",sharers:"",content:"",quality:""}),g=j("all"),d=j(!1),o=le(),x=le(),S=j(null),m=U({open:!1,title:"",loading:!1,error:"",items:[]}),i=O(()=>`${a.days}|${a.brand}|${a.excludeInternal?1:0}`);function u(k={}){return{days:a.days,brand:a.brand,exclude_internal:a.excludeInternal?1:0,...k}}async function b(k=r.value,{refresh:M=!1}={}){if(!M&&p[k]&&h[k]===i.value)return;const L=i.value;$[k]=!0,v[k]="";try{const N=await Ee[k](u(M?{refresh:1}:{}));if(L!==i.value)return;p[k]=N,h[k]=L}catch(N){L===i.value&&(v[k]=N?.message||"불러오기 실패")}finally{L===i.value&&($[k]=!1)}}function X(k){r.value=k,b(k)}function Y(){b(r.value,{refresh:!0})}function H(k){a.days=k}function E(k){a.brand=k}function _(){a.excludeInternal=!a.excludeInternal}function R(k){g.value=k}function c(){d.value=!d.value}ve(i,()=>b(r.value));const D=O(()=>p.overview?.funnels?.[g.value]||null),J=O(()=>Math.max(1,...(D.value?.steps||[]).map(k=>k.value||0))),I=O(()=>p.overview?.trend?.buckets||[]),ie=O(()=>[...B.map(k=>({name:k.label,type:"column",data:I.value.map(M=>M[k.key]||0)})),{name:"첫 결제",type:"line",data:I.value.map(k=>k.first_pay||0)}]),de=O(()=>{const k=I.value.map(L=>L.t.slice(5)),M=(p.overview?.trend?.milestones||[]).filter(L=>k.includes(L.t.slice(5)));return{chart:{type:"line",stacked:!0,stackOnlyBar:!0,background:"transparent",toolbar:{show:!1},zoom:{enabled:!1},animations:{enabled:!1},fontFamily:"inherit"},theme:{mode:"dark"},colors:[...B.map(L=>L.color),ne],plotOptions:{bar:{columnWidth:"62%",borderRadius:4,borderRadiusApplication:"end",borderRadiusWhenStacked:"last"}},stroke:{width:[2,2,2,2,2],colors:[z,z,z,z,ne],curve:"straight"},markers:{size:[0,0,0,0,4],strokeColors:z,strokeWidth:2,hover:{sizeOffset:2}},dataLabels:{enabled:!1},xaxis:{categories:k,labels:{style:{colors:Z},rotate:-45,hideOverlappingLabels:!0},axisBorder:{color:"#2e2e38"},axisTicks:{color:"#2e2e38"},tooltip:{enabled:!1}},yaxis:{min:0,forceNiceScale:!0,labels:{style:{colors:Z},formatter:L=>Math.round(L).toLocaleString()}},grid:{borderColor:"#2a2a34",strokeDashArray:0,xaxis:{lines:{show:!1}}},legend:{position:"top",horizontalAlign:"left",labels:{colors:"#c8c8d0"}},tooltip:{theme:"dark",shared:!0,intersect:!1,y:{formatter:L=>
2`${(L||0).toLocaleString()}명`}},annotations:{xaxis:M.map((L,N)=>{const q=k.indexOf(L.t.slice(5))/Math.max(1,k.length-1);return{x:L.t.slice(5),borderColor:"#5a5a66",strokeDashArray:0,label:{text:L.label,orientation:"horizontal",offsetY:N%2*20,borderColor:"#2e2e38",textAnchor:q>.66?"end":q<.33?"start":"middle",style:{background:"#23232c",color:"#c8c8d0",fontSize:"11px"}}}})},noData:{text:"데이터 없음",style:{color:Z}}}}),ce=O(()=>o.apply(p.sharers?.items||[])),_e=O(()=>x.apply(p.content?.items||[]));async function pe({by:k,key:M,channel:L="",title:N}){Object.assign(m,{open:!0,title:N,loading:!0,error:"",items:[]});try{const q=await V.getShareDrilldown(u({by:k,key:M,channel:L}));m.items=q.items||[]}catch(q){m.error=q?.message||"불러오기 실패"}finally{m.loading=!1}}function he(){m.open=!1}function ke(k){k&&(S.value=k)}return{filters:a,tab:r,data:p,loading:$,errors:v,funnelChannel:g,trendAsTable:d,sharersSort:o,contentSort:x,sharerRows:ce,contentRows:_e,funnel:D,funnelMax:J,trendBuckets:I,trendSeries:ie,trendOptions:de,drill:m,userDetailEmail:S,load:b,setTab:X,refresh:Y,setDays:H,setBrand:E,toggleInternal:_,setFunnelChannel:R,toggleTrendTable:c,openDrilldown:pe,closeDrilldown:he,openUser:ke}}const Me={key:0,class:"sp-state"},Ne={key:1,class:"sp-state sp-err"},Be={key:0,class:"sp-banner"},Re={key:1,class:"sp-banner sp-banner-info"},Ie={class:"sp-kpis"},qe={class:"sp-kpi-label"},Ue={class:"sp-kpi-value"},je={class:"sp-kpi-meta"},Pe={key:0,class:"sp-delta"},ze={class:"sp-grid-2"},Ve={class:"sp-card"},Fe={class:"sp-card-head"},Ke={class:"sp-chips sp-chips-sm",role:"group","aria-label":"채널"},He=["onClick"],Qe={key:0,class:"sp-funnel"},We={class:"sp-fstep-label"},Ge={class:"sp-fbar-track"},Xe={key:1,class:"sp-fbar-na"},Ye={class:"sp-fstep-value"},Je={class:"sp-fstep-conv"},Ze={key:1,class:"sp-warn"},es={key:1,class:"sp-surfaces"},ss={class:"sp-dl"},ts={class:"sp-muted"},ns={class:"sp-foot"},ls={class:"sp-card"},as={class:"sp-card-head"},os={key:1,class:"sp-table-wrap sp-table-scroll"},rs={class:"sp-table"},us={class:"sp-dt"},is={class:"num"},ds={class:"sp-grid-2"},cs={class:"sp-card"},_s={class:"sp-dl"},ps={class:"sp-total"},hs={class:"sp-foot"},ks={class:"sp-card"},ys={key:0,class:"sp-highlights"},vs={key:1,class:"sp-empty"},bs={key:2,class:"sp-foot"},ms={__name:"ShareOverviewTab",setup(a){const r=fe(()=>$e(()=>import("./vue3-apexcharts-BguUQIR9.js"),__vite__mapDeps([0,1,2]))),{data:p,loading:$,errors:v,funnel:h,funnelMax:g,funnelChannel:d,setFunnelChannel:o,trendBuckets:x,trendSeries:S,trendOptions:m,trendAsTable:i,toggleTrendTable:u}=K("share"),b=O(()=>p.overview),X=[{key:"all",label:"전체"},...B],Y=O(()=>{const E=b.value?.kpis;if(!E)return[];const _=(D,J,I)=>({key:D,label:J,sub:I,value:E[D].value,delta:Oe(E[D].value,E[D].prev)}),R=b.value.internal_events_excluded||{},c=D=>D?` · 내부 ${D}ê±´ 제외`:"";return[_("link_out","링크 전달",E.link_out.value===null?"계측 전":`복사 + OS 공유${c(R.link_out)}`),_("landings","착지",E.landings.value===null?"계측 전":`비회원 · 방문자×대상×일 유니크${c(R.landing)}`),_("signups","가입","공유 링크 + 초대 링크"),_("payers","결제자",`결제 전환 ${W(E.payers.value,E.signups.value)}`),_("sku_rose","결제 장미",`${ue(E.sku_rose.krw)} · KR 정가 환산 참고치`),_("reward_rose","보상 지급 장미",`지급률 ${se(E.reward_rose.payout_ratio)} · 보상 ÷ 결제 장미`)]}),H=O(()=>{const E=b.value;return E?E.instrumentation==="none"?"공유·착지 계측 데이터가 아직 없습니다. 링크 전달·착지와 깔때기 앞 3단계는 계측이 배포된 뒤부터 쌓입니다.":E.instrumentation==="partial"?`계측은 ${G(E.instrumented_since)}부터입니다. ê·¸ 전 기간의 시트·전달·착지는 0으로 보입니다.`:"":""});return(E,_)=>{const R=be("router-link");return t(),l("div",{class:T(["sp-tab-body",{"sp-stale":s($).overview&&b.value}])},[s($).overview&&!b.value?(t(),l("div",Me,"불러오는 중…")):s(v).overview&&!b.value?(t(),l("div",Ne,n(s(v).overview),1)):b.value?(t(),l(f,{key:2},[H.value?(t(),l("div",Be,n(H.value),1)):w("",!0),s(P)(b.value.internal_events_excluded)?(t(),l("div",Re,n(s(P)(b.value.internal_events_excluded)),1)):w("",!0),e("section",Ie,[(t(!0),l(f,null,A(Y.value,c=>(t(),l("div",{key:c.key,class:"sp-kpi"},[e("div",qe,n(c.label),1),e("div",Ue,n(s(y)(c.value)),1),e("div",je,[c.delta?(t(),l("span",Pe,[C(n(c.delta.text)+" ",1),_[1]||(_[1]=e("span",{class:"sp-muted"},"직전 기간 대비",-1))])):w("",!0),e("span",null,n(c.sub),1)])]))),128))]),e("section",ze,[e("div",Ve,[e("div",Fe,[_[2]||(_[2]=e("h3",null,"깔때기",-1)),e("div",Ke,[(t(),l(f,null,A(X,c=>e("button",{key:c.key,class:T(["sp-chip",{on:s(d)===c.key}]),onClick:D=>s(o)(c.key)},n(c.label),11,He)),64))])]),s(h)?(t(),l("ol",Qe,[(t(!0),l(f,null,A(s(h).steps,(c,D)=>(t(),l("li",{key:c.key,class:T(["sp-fstep",{worst:s(h).worst_step===D}])},[e("span",We,n(c.label),1),e("span",Ge,[c.value!==null?(t(),l("span",{key:0,class:"sp-fbar",style:ae({width:`${Math.max(1,c.value/s(g)*100)}%`})},null,4)):(t(),l("span",Xe,"계측 전"))]),e("span",Ye,n(s(y)(c.value)),1),e("span",Je,[D>0&&c.conv!==null?(t(),l(f,{key:0},[C("← "+n(c.conv)+"%",1)],64)):w("",!0),s(h).worst_step===D?(t(),l("span",Ze," ⚠ 최대 이탈")):w("",!0)])],2))),128))])):w("",!0),s(h)&&s(h).surfaces&&s(h).surfaces.length?(t(),l("div",es,[_[3]||(_[3]=e("div",{class:"sp-surfaces-head"},[C("링크 전달 위치 "),e("span",{class:"sp-muted"},"링크 전달 · 시트 열림")],-1)),e("dl",ss,[(t(!0),l(f,null,A(s(h).surfaces,c=>(t(),l(f,{key:c.surface||"_none"},[e("dt",{class:T({"sp-muted":!c.surface})},n(c.label),3),e("dd",null,[C(n(s(y)(c.link_out))+" ",1),e("span",ts,"· "+n(s(y)(c.sheet_open)),1)])],64))),128))])])):w("",!0),e("p",ns,[_[4]||(_[4]=C(" 전환율은 바로 앞 단계 대비입니다. 가입·결제는 가입일 기준 코í
2˜¸íŠ¸ë¼ 착지보다 많을 수 있습니다(앱 설치 후 가입, 계측 전 착지). ",-1)),s(h)&&s(h).member_landings?(t(),l(f,{key:0},[C("기존 회원 착지 "+n(s(y)(s(h).member_landings))+"건은 착지에서 뺐습니다(공유자 본인 포함).",1)],64)):w("",!0)])]),e("div",ls,[e("div",as,[e("h3",null,n(b.value.trend.granularity==="week"?"주별":"일별")+" 추이 · 채널별 가입과 첫 결제",1),e("button",{class:"sp-link",onClick:_[0]||(_[0]=(...c)=>s(u)&&s(u)(...c))},n(s(i)?"차트로 보기":"표로 보기"),1)]),s(i)?(t(),l("div",os,[e("table",rs,[e("thead",null,[e("tr",null,[e("th",null,n(b.value.trend.granularity==="week"?"주 시작":"날짜"),1),(t(!0),l(f,null,A(s(B),c=>(t(),l("th",{key:c.key,class:"num"},n(c.label),1))),128)),_[5]||(_[5]=e("th",{class:"num"},"첫 결제",-1))])]),e("tbody",null,[(t(!0),l(f,null,A(s(x),c=>(t(),l("tr",{key:c.t},[e("td",us,n(c.t),1),(t(!0),l(f,null,A(s(B),D=>(t(),l("td",{key:D.key,class:"num"},n(c[D.key]||""),1))),128)),e("td",is,n(c.first_pay||""),1)]))),128))])])])):(t(),F(s(r),{key:0,type:"line",height:"300",options:s(m),series:s(S)},null,8,["options","series"]))])]),e("section",ds,[e("div",cs,[_[13]||(_[13]=e("div",{class:"sp-card-head"},[e("h3",null,"보상 경제")],-1)),e("dl",_s,[_[6]||(_[6]=e("dt",null,"공유자 · 친구 가입 보상",-1)),e("dd",null,n(s(y)(b.value.rewards.sharer_signup)),1),_[7]||(_[7]=e("dt",null,"공유자 · 친구 첫 결제 보너스",-1)),e("dd",null,n(s(y)(b.value.rewards.sharer_first_payment)),1),_[8]||(_[8]=e("dt",null,"공유자 · 결제 환류 10%",-1)),e("dd",null,n(s(y)(b.value.rewards.sharer_revenue_share)),1),_[9]||(_[9]=e("dt",null,"피추천 · 추가 가입 보너스",-1)),e("dd",null,n(s(y)(b.value.rewards.referred_bonus)),1),_[10]||(_[10]=e("dt",{class:"sp-total"},"합계",-1)),e("dd",ps,n(s(y)(b.value.rewards.total)),1),_[11]||(_[11]=e("dt",null,"지급률 (보상 ÷ 피추천 결제 장미)",-1)),e("dd",null,n(s(se)(b.value.rewards.payout_ratio)),1)]),e("p",hs,[_[12]||(_[12]=C(' 보상 장미의 한계비용은 ≈0(GPU 자체 보유)이고, 실비용은 공유자 본인 구매 잠식입니다 — 공유자 탭 "본인 결제" 열. ',-1)),ee(R,{class:"sp-link",to:"/admin/abuse"},{default:me(()=>[C("기간 내 추천 차단 "+n(s(y)(b.value.rewards.blocked))+"ê±´(브랜드·내부 필터 무관) → 어뷰징 모니터링",1)]),_:1})])]),e("div",ks,[_[14]||(_[14]=e("div",{class:"sp-card-head"},[e("h3",null,"하이라이트")],-1)),b.value.highlights.length?(t(),l("ul",ys,[(t(!0),l(f,null,A(b.value.highlights,(c,D)=>(t(),l("li",{key:D,class:T(`hl-${c.kind}`)},n(c.text),3))),128))])):(t(),l("p",vs,"아직 짚을 만한 신호가 없습니다.")),b.value.internal_excluded?(t(),l("p",bs," 본인이나 공유자가 내부 계정(관리자·운영 계정)인 가입 "+n(s(y)(b.value.internal_excluded))+"명을 뺐습니다. ",1)):w("",!0)])])],64)):w("",!0)],2)}}},fs={key:0,class:"sp-state"},$s={key:1,class:"sp-state sp-err"},gs={key:0,class:"sp-banner sp-banner-info"},ws={key:1,class:"sp-empty"},Cs={key:2,class:"sp-table-wrap"},xs={class:"sp-table sp-sortable sp-clickable"},Ss=["onClick"],Ds=["onClick"],Ls={key:0,class:"sp-muted"},As=["onClick"],Es={class:"sp-sub-line"},Os={class:"num"},Ts={class:"num"},Ms={class:"num"},Ns={class:"num"},Bs={class:"sp-sub-line"},Rs={class:"num"},Is={class:"sp-sub-line"},qs={class:"num"},Us={class:"num"},js={class:"num"},Ps={key:0,class:"sp-badge-warn"},zs={key:1,class:"sp-muted"},Vs={class:"sp-dt"},Fs={__name:"ShareSharersTab",setup(a){const{data:r,loading:p,errors:$,sharerRows:v,sharersSort:h,openDrilldown:g,openUser:d}=K("share"),o=[{key:"sharer",label:"공유자"},{key:"link_out",label:"링크 전달",num:!0},{key:"landings",label:"착지",num:!0},{key:"signups",label:"가입",num:!0},{key:"payers",label:"결제자",num:!0},{key:"sku_rose",label:"결제 장미",num:!0},{key:"reward_rose",label:"받은 보상",num:!0},{key:"own_sku_rose",label:"본인 결제",num:!0},{key:"main_channel",label:"주 채널"},{key:"cluster_k",label:"동일망",num:!0},{key:"last_joined_at",label:"마지막 가입"}];function x(S){S.signups&&g({by:"sharer",key:S.unknown?"":S.sharer,title:S.unknown?"공유자 미상 가입 — 공유 링크로 왔지만 추천이 성립하지 않음":`${S.sharer} 이(가) 데려온 가입`})}return(S,m)=>(t(),l("div",{class:T(["sp-tab-body",{"sp-stale":s(p).sharers&&s(r).sharers}])},[s(p).sharers&&!s(r).sharers?(t(),l("div",fs,"불러오는 중…")):s($).sharers&&!s(r).sharers?(t(),l("div",$s,n(s($).sharers),1)):s(r).sharers?(t(),l(f,{key:2},[s(P)(s(r).sharers.internal_events_excluded)?(t(),l("div",gs,n(s(P)(s(r).sharers.internal_events_excluded)),1)):w("",!0),m[0]||(m[0]=e("p",{class:"sp-note"},[C(" 행을 누르면 데려온 가입자, 이메일을 누르면 유저 상세. "),e("b",null,"본인 결제"),C(" = 공유자 본인의 전 기간 결제 장미(보상 때문에 덜 사는지 보는 잠식 감시). "),e("b",null,"동일망"),C(" = 피추천끼리 IPv6 /64 · IPv4 · 기기 지문이 겹치는 인원 — 의심 표시일 뿐 판단은 운영자 몫입니다. 가입이 없어도 이 기간에 링크를 전달했거나 착지를 만든 공유자는 0으로 보입니다. ")],-1)),s(v).length?(t(),l("div",Cs,[e("table",xs,[e("thead",null,[e("tr",null,[(t(),l(f,null,A(o,i=>e("th",{key:i.key,class:T({num:i.num}),onClick:u=>s(h).toggle(i.key)},n(i.label)+n(s(h).mark(i.key)),11,Ss)),64))])]),e("tbody",null,[(t(!0),l(f,null,A(s(v),i=>(t(),l("tr",{key:i.unknown?"__unknown":i.sharer,onClick:u=>x(i)},[e("td",null,[i.unknown?(t(),l("span",Ls,"공유자 미상")):(t(),l(f,{key:1},[e("button",{class:"sp-email",onClick:oe(u=>s(d)(i.sharer),["stop"])},n(i.sharer),9,As),e("span",Es,n(i.handle?`@${i.handle} · `:"")+n(i.code||"코드 없음"),1)],64))]),e("td",Os,n(s(y)(i.link_out)),1),e("td",Ts,n(s(y)(i.landings)
2),1),e("td",Ms,n(s(y)(i.signups)),1),e("td",Ns,[C(n(s(y)(i.payers)),1),e("span",Bs,n(s(W)(i.payers,i.signups)),1)]),e("td",Rs,[C(n(s(y)(i.sku_rose)),1),e("span",Is,n(s(ue)(i.krw)),1)]),e("td",qs,n(s(y)(i.reward_rose)),1),e("td",Us,n(s(y)(i.own_sku_rose)),1),e("td",null,n(s(Q)[i.main_channel]||"—"),1),e("td",js,[i.cluster_k>=2?(t(),l("span",Ps,"⚠ "+n(i.cluster_k)+"/"+n(i.cluster_n),1)):(t(),l("span",zs,"—"))]),e("td",Vs,n(s(G)(i.last_joined_at)),1)],8,Ds))),128))])])])):(t(),l("div",ws,"이 기간에 공유·초대 활동이 없습니다."))],64)):w("",!0)],2))}},Ks={key:0,class:"sp-state"},Hs={key:1,class:"sp-state sp-err"},Qs={key:0,class:"sp-banner sp-banner-info"},Ws={key:1,class:"sp-empty"},Gs={key:2,class:"sp-table-wrap"},Xs={class:"sp-table sp-sortable sp-clickable"},Ys=["onClick"],Js=["onClick"],Zs={class:"sp-target"},et=["src"],st={key:1,class:"sp-thumb"},tt={class:"sp-target-title"},nt={class:"sp-sub-line"},lt={class:"num"},at={class:"num"},ot={class:"num"},rt={class:"num"},ut={class:"num"},it={class:"num"},dt={class:"num"},ct={class:"num"},_t={key:0,class:"sp-sub-line"},pt={__name:"ShareContentTab",setup(a){const{data:r,loading:p,errors:$,contentRows:v,contentSort:h,openDrilldown:g}=K("share"),d=Object.fromEntries(B.map(m=>[m.key,m.color])),o=[{key:"title",label:"대상"},{key:"sheet_open",label:"시트 열림",num:!0},{key:"link_out",label:"링크 전달",num:!0},{key:"landings",label:"착지",num:!0},{key:"signups",label:"가입",num:!0},{key:"payers",label:"결제자",num:!0},{key:"sku_rose",label:"결제 장미",num:!0},{key:"landing_to_signup",label:"착지→가입",num:!0},{key:"shares_per_100_plays",label:"플레이 100회당 공유",num:!0}];function x(m){m.signups&&g({by:"target",key:m.target_id,channel:m.channel,title:`${Q[m.channel]} · ${m.title||`#${m.target_id}`} 로 들어온 가입`})}function S(m){m.target.style.visibility="hidden"}return(m,i)=>(t(),l("div",{class:T(["sp-tab-body",{"sp-stale":s(p).content&&s(r).content}])},[s(p).content&&!s(r).content?(t(),l("div",Ks,"불러오는 중…")):s($).content&&!s(r).content?(t(),l("div",Hs,n(s($).content),1)):s(r).content?(t(),l(f,{key:2},[s(P)(s(r).content.internal_events_excluded)?(t(),l("div",Qs,n(s(P)(s(r).content.internal_events_excluded)),1)):w("",!0),i[0]||(i[0]=e("p",{class:"sp-note"},[C(" 플롯·스토리·크리에이터 공유 링크 기준입니다(초대 링크는 대상이 없어 공유자 탭에서 봅니다). "),e("b",null,"플레이 100회당 공유"),C(" = 기간 내 신규 플레이 세션 대비 링크 전달(플롯만). 행을 누르면 그 대상으로 들어온 가입자. ")],-1)),s(v).length?(t(),l("div",Gs,[e("table",Xs,[e("thead",null,[e("tr",null,[(t(),l(f,null,A(o,u=>e("th",{key:u.key,class:T({num:u.num}),onClick:b=>s(h).toggle(u.key)},n(u.label)+n(s(h).mark(u.key)),11,Ys)),64))])]),e("tbody",null,[(t(!0),l(f,null,A(s(v),u=>(t(),l("tr",{key:`${u.channel}:${u.target_id}`,onClick:b=>x(u)},[e("td",null,[e("div",Zs,[u.thumb?(t(),l("img",{key:0,class:"sp-thumb",src:u.thumb,alt:"",loading:"lazy",onError:S},null,40,et)):(t(),l("span",st)),e("span",null,[e("span",tt,n(u.title||"(삭제됨)"),1),e("span",nt,[e("span",{class:"sp-swatch",style:ae({background:s(d)[u.channel]})},null,4),C(n(s(Q)[u.channel])+" · #"+n(u.target_id),1),u.creator_handle&&u.channel!=="creator"?(t(),l(f,{key:0},[C(" · @"+n(u.creator_handle),1)],64)):w("",!0)])])])]),e("td",lt,n(s(y)(u.sheet_open)),1),e("td",at,n(s(y)(u.link_out)),1),e("td",ot,n(s(y)(u.landings)),1),e("td",rt,n(s(y)(u.signups)),1),e("td",ut,n(s(y)(u.payers)),1),e("td",it,n(s(y)(u.sku_rose)),1),e("td",dt,n(s(se)(u.landing_to_signup)),1),e("td",ct,[C(n(u.shares_per_100_plays===null?"—":u.shares_per_100_plays)+" ",1),u.plays!==null?(t(),l("span",_t,"플레이 "+n(s(y)(u.plays)),1)):w("",!0)])],8,Js))),128))])])])):(t(),l("div",Ws,"이 기간에 공유된 콘텐츠가 없습니다."))],64)):w("",!0)],2))}},ht={key:0,class:"sp-state"},kt={key:1,class:"sp-state sp-err"},yt={key:2,class:"sp-grid-2"},vt={class:"sp-card"},bt={class:"sp-table"},mt={key:0,class:"sp-sub-line"},ft={class:"num"}
2,$t={class:"num"},gt={class:"sp-foot"},wt={class:"sp-card"},Ct={key:0,class:"sp-empty"},xt={key:0,class:"sp-table"},St={class:"num"},Dt={class:"num"},Lt={class:"num"},At={key:1,class:"sp-empty"},Et={class:"sp-foot"},Ot={__name:"ShareQualityTab",setup(a){const{data:r,loading:p,errors:$}=K("share"),v=O(()=>r.quality),h=O(()=>{const g=v.value?.referred,d=v.value?.baseline;if(!g)return[];const o=x=>x?W(x.num,x.den):"—";return[{label:"가입 (n)",r:y(g.n),b:d?y(d.n):"—",note:""},{label:"7일 결제 전환",r:o(g.conv7),b:o(d?.conv7),note:"가입 후 7일 지난 유저만 분모"},{label:"24시간 결제 전환",r:o(g.conv24),b:o(d?.conv24),note:"가입 후 24시간 지난 유저만 분모"},{label:"첫 결제까지 (중앙값)",r:te(g.median_hours_to_pay),b:d?te(d.median_hours_to_pay):"—",note:"결제자 기준"},{label:"결제자당 결제 장미",r:y(g.sku_per_payer),b:d?y(d.sku_per_payer):"—",note:"SKU 기본 장미 (첫구매 보너스 제외)"},{label:"D1 재방문",r:o(g.d1),b:o(d?.d1),note:d?.d1?.sampled?`가입 24~48시간 사이 활동 · 일반은 ${y(d.d1.den)}명 표본`:"가입 24~48시간 사이 활동"}]});return(g,d)=>(t(),l("div",{class:T(["sp-tab-body",{"sp-stale":s(p).quality&&v.value}])},[s(p).quality&&!v.value?(t(),l("div",ht,"불러오는 중… (일반 가입 모집단을 읽느라 몇 초 걸립니다)")):s($).quality&&!v.value?(t(),l("div",kt,n(s($).quality),1)):v.value?(t(),l("section",yt,[e("div",vt,[d[1]||(d[1]=e("div",{class:"sp-card-head"},[e("h3",null,"추천 가입 vs 일반 가입")],-1)),e("table",bt,[d[0]||(d[0]=e("thead",null,[e("tr",null,[e("th",null,"지표"),e("th",{class:"num"},"추천 (공유·초대)"),e("th",{class:"num"},"일반")])],-1)),e("tbody",null,[(t(!0),l(f,null,A(h.value,o=>(t(),l("tr",{key:o.label},[e("td",null,[C(n(o.label),1),o.note?(t(),l("span",mt,n(o.note),1)):w("",!0)]),e("td",ft,n(o.r),1),e("td",$t,n(o.b),1)]))),128))])]),e("p",gt," 일반 = "+n(s(G)(v.value.window_start))+" 이후 같은 기간 가입자에서 추천 가입·내부 계정·게스트를 뺀 모집단 (브랜드 필터는 가입 직후 로그인 기록 기준). 표본이 30명 미만이면 비율 대신 분수로 보여줍니다. ",1)]),e("div",wt,[d[8]||(d[8]=e("div",{class:"sp-card-head"},[e("h3",null,"착지 환경 → 웹 가입")],-1)),v.value.instrumented?(t(),l(f,{key:1},[v.value.env.length?(t(),l("table",xt,[d[2]||(d[2]=e("thead",null,[e("tr",null,[e("th",null,"환경"),e("th",{class:"num"},"착지"),e("th",{class:"num"},"웹 가입"),e("th",{class:"num"},"전환")])],-1)),e("tbody",null,[(t(!0),l(f,null,A(v.value.env,o=>(t(),l("tr",{key:o.env},[e("td",null,n(o.label),1),e("td",St,n(s(y)(o.landings)),1),e("td",Dt,n(s(y)(o.signups)),1),e("td",Lt,n(s(W)(o.signups,o.landings)),1)]))),128))])])):(t(),l("p",At,"이 기간 착지가 없습니다.")),e("p",Et,[v.value.os.length?(t(),l(f,{key:0},[d[3]||(d[3]=C("OS — ",-1)),(t(!0),l(f,null,A(v.value.os,(o,x)=>(t(),l("span",{key:o.key},n(x?" · ":"")+n(o.key)+" "+n(o.count),1))),128)),d[4]||(d[4]=e("br",null,null,-1))],64)):w("",!0),v.value.lang.length?(t(),l(f,{key:1},[d[5]||(d[5]=C("언어 — ",-1)),(t(!0),l(f,null,A(v.value.lang,(o,x)=>(t(),l("span",{key:o.key},n(x?" · ":"")+n(o.key)+" "+n(o.count),1))),128)),d[6]||(d[6]=e("br",null,null,-1))],64)):w("",!0),d[7]||(d[7]=C(" 웹 가입만 셉니다. 앱을 설치해 앱에서 가입하면 착지와 이어지지 않습니다(알려진 유실 — 앱 작업 필요). ",-1))])],64)):(t(),l("p",Ct,"계측 데이터가 아직 없습니다."))])])):w("",!0)],2))}},Tt={class:"sp-modal",role:"dialog","aria-modal":"true"},Mt={class:"sp-modal-head"},Nt={class:"sp-muted"},Bt={class:"sp-modal-body"},Rt={key:0,class:"sp-state"},It={key:1,class:"sp-state sp-err"},qt={key:2,class:"sp-empty"},Ut={key:3,class:"sp-table"},jt=["onClick"],Pt={key:0,class:"sp-sub-line"},zt={class:"sp-dt"},Vt={key:0,class:"sp-muted"},Ft={class:"num"},Kt={key:0,class:"sp-sub-line"},Ht={class:"num"},Qt={key:0,class:"sp-badge-warn"},Wt={__name:"ShareDrilldownModal",setup(a){const{drill:r,closeDrilldown:p,openUser:$,userDetailEmail:v}=K("share");function h(g){g.key==="Escape"&&r.open&&!v.value&&p()}return re(()=>window.addEventListener("keydown",h)),ge(()=>window.removeEventListener("keydown",h)),(g,d)=>s(r).open?(t(),l("div",{key:0,class:"sp-overlay",onClick:d[1]||(d[1]=oe((...o)=>s(p)&&s(p)(...o),["self"]))},[e("div",Tt,[e("header",Mt,[e("h3",null,n(s(r).title),1),e("span",Nt,n(s(r).loading?"":`${s(r).items.length}명`),1),e("button",{class:"sp-close","aria-label":"닫기",onClick:d[0]||(d[0]=(...o)=>s(p)&&s(p)(...o))},"×")]),e("div",Bt,[s(r).loading?(t(),l("div",Rt,"불러오는 중…")):s(r).error?(t(),l("div",It,n(s(r).error),1)):s(r).items.length?(t(),l("table",Ut,[d[2]||(d[2]=e("thead",null,[e("tr",null,[e("th",
2null,"이메일"),e("th",null,"가입"),e("th",null,"채널 · 대상"),e("th",null,"브랜드"),e("th",{class:"num"},"결제 장미"),e("th",{class:"num"},"첫 결제까지"),e("th",null,"동일망")])],-1)),e("tbody",null,[(t(!0),l(f,null,A(s(r).items,o=>(t(),l("tr",{key:o.email},[e("td",null,[e("button",{class:"sp-email",onClick:x=>s($)(o.email)},n(o.email),9,jt),o.sharer?(t(),l("span",Pt,"← "+n(o.sharer),1)):w("",!0)]),e("td",zt,n(s(G)(o.joined_at)),1),e("td",null,[C(n(s(Q)[o.channel]),1),o.target_id?(t(),l("span",Vt," #"+n(o.target_id),1)):w("",!0)]),e("td",null,n(s(xe)[o.brand]||"—"),1),e("td",Ft,[C(n(s(y)(o.sku_rose)),1),o.sku_count>1?(t(),l("span",Kt,n(o.sku_count)+"회",1)):w("",!0)]),e("td",Ht,n(s(te)(o.hours_to_first_pay)),1),e("td",null,[o.clustered?(t(),l("span",Qt,"⚠ 동일망")):w("",!0)])]))),128))])])):(t(),l("p",qt,"이 조건의 가입자가 없습니다."))])])])):w("",!0)}},Gt={class:"sp-page"},Xt={class:"sp-header"},Yt={class:"sp-filters"},Jt={class:"sp-chips",role:"group","aria-label":"기간"},Zt=["onClick"],en={class:"sp-chips",role:"group","aria-label":"브랜드"},sn=["onClick"],tn={class:"sp-toggle"},nn=["checked"],ln=["disabled"],an={class:"sp-tabs",role:"tablist"},on=["aria-selected","onClick"],cn={__name:"AdminSharePerformance",setup(a){const r=Te();Ce("share",r);const{filters:p,tab:$,loading:v,userDetailEmail:h,setTab:g,setDays:d,setBrand:o,toggleInternal:x,refresh:S}=r;return re(()=>r.load("overview")),(m,i)=>(t(),l("div",Gt,[e("header",Xt,[i[4]||(i[4]=e("div",null,[e("h1",null,"공유·초대 성과"),e("p",{class:"sp-sub"},"공유 시트 → 링크 전달 → 착지 → 가입 → 결제 · 가입·결제는 가입일 기준 코호트, 공유·착지는 발생일 기준")],-1)),e("div",Yt,[e("div",Jt,[(t(!0),l(f,null,A(s(Se),u=>(t(),l("button",{key:u.value,class:T(["sp-chip",{on:s(p).days===u.value}]),onClick:b=>s(d)(u.value)},n(u.label),11,Zt))),128))]),e("div",en,[(t(!0),l(f,null,A(s(De),u=>(t(),l("button",{key:u.value||"all",class:T(["sp-chip",{on:s(p).brand===u.value}]),onClick:b=>s(o)(u.value)},n(u.label),11,sn))),128))]),e("label",tn,[e("input",{type:"checkbox",checked:s(p).excludeInternal,onChange:i[0]||(i[0]=(...u)=>s(x)&&s(x)(...u))},null,40,nn),i[3]||(i[3]=C(" 내부 계정 제외 ",-1))]),e("button",{class:"sp-btn",disabled:s(v)[s($)],onClick:i[1]||(i[1]=(...u)=>s(S)&&s(S)(...u))},"⟳ 새로고침",8,ln)])]),e("nav",an,[(t(!0),l(f,null,A(s(Le),u=>(t(),l("button",{key:u.key,role:"tab",class:T(["sp-tab",{on:s($)===u.key}]),"aria-selected":s($)===u.key,onClick:b=>s(g)(u.key)},n(u.label),11,on))),128))]),s($)==="overview"?(t(),F(ms,{key:0})):s($)==="sharers"?(t(),F(Fs,{key:1})):s($)==="content"?(t(),F(pt,{key:2})):(t(),F(Ot,{key:3})),ee(Wt),ee(ye,{modelValue:s(h),"onUpdate:modelValue":i[2]||(i[2]=u=>we(h)?h.value=u:null)},null,8,["modelValue"])]))}};export{cn as default};

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.