&React.createElement("div",{className:"token-usage-card"},React.createElement("span",{className:"tu-label"},"Cost"),React.createElement("span",{className:"tu-value"},"$","number"==typeof $.total_cost?$.total_cost.toFixed(4):"0.00")),React.createElement("div",{className:"batch-dropdown"},React.createElement("button",{className:"btn-ai btn-sm",disabled:N,onClick:()=>z(!C)},N?React.createElement(React.Fragment,null,React.createElement("span",{className:"spinner-inline"}),"Analyzing..."):"Run Batch Analysis"),C&&React.createElement("div",{className:"bd-menu"},React.createElement("button",{onClick:()=>ge("7d")},"Last 7 days"),React.createElement("button",{onClick:()=>ge("14d")},"Last 14 days"),React.createElement("button",{onClick:()=>ge("30d")},"Last 30 days"))))),_&&React.createElement("div",{style:{color:"var(--danger)",fontSize:13,marginBottom:12}},"Error: ",_),S&&React.createElement(BatchAnalysisResult,{result:S}),0===I.length?React.createElement("div",{className:"empty"},"No analyses yet."):I.map((e,t)=>React.createElement(React.Fragment,{key:e.id||t},React.createElement(AnalysisListItem,{analysis:e,onClick:()=>B(T===(e.id||t)?null:e.id||t)}),T===(e.id||t)&&e.result&&("batch"===e.type?React.createElement(BatchAnalysisResult,{result:e.result}):"visitor"===e.type?React.createElement(VisitorAnalysisResult,{result:e.result}):React.createElement(SessionAnalysisResult,{result:e.result}))))),React.createElement(SiteChat,{siteId:e}))),"sessions"===s&&React.createElement(React.Fragment,null,React.createElement(DateRangeSelector,{from:l,to:i,onChange:ve}),b?React.createElement("div",{className:"loading"},"Loading..."):React.createElement("div",{className:"section"},0===R.length?React.createElement("div",{className:"empty"},"No sessions found for this period."):React.createElement(React.Fragment,null,React.createElement("div",{className:"card table-wrap"},React.createElement("table",null,React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Visitor"),React.createElement("th",null,"Started"),React.createElement("th",null,"Duration"),React.createElement("th",null,"Events"),React.createElement("th",null,"Dead"),React.createElement("th",null,"Rage"),React.createElement("th",null,"Entry Page"))),React.createElement("tbody",null,R.map(n=>React.createElement("tr",{key:n.id,className:"clickable",onClick:()=>a("session",{siteId:e,siteName:t,sessionId:n.id,visitorId:n.visitor_id})},React.createElement("td",{className:"mono",style:{fontSize:11}},(n.visitor_id||"").substring(0,12),"..."),React.createElement("td",{title:fullDate(n.started_at)},relativeTime(n.started_at)),React.createElement("td",{className:"mono"},fmtMs(n.duration_ms)),React.createElement("td",{className:"mono"},n.event_count),React.createElement("td",{className:"mono",style:{color:n.dead_clicks>0?"var(--danger)":void 0}},n.dead_clicks||0),React.createElement("td",{className:"mono",style:{color:n.rage_clicks>0?"var(--danger)":void 0}},n.rage_clicks||0),React.createElement("td",{className:"mono",style:{fontSize:11}},n.entry_page||"โ€”")))))),React.createElement("div",{className:"pagination"},React.createElement("button",{className:"btn-secondary btn-sm",disabled:v<=1,onClick:()=>E(e=>e-1)},"Previous"),React.createElement("span",{className:"page-info"},"Page ",v,y.pages?" of "+y.pages:""),React.createElement("button",{className:"btn-secondary btn-sm",disabled:R.length<20,onClick:()=>E(e=>e+1)},"Next"))))),"reports"===s&&React.createElement("div",{style:{maxWidth:700}},React.createElement("div",{className:"flex-between mb-16"},React.createElement("h3",null,"Reports"),React.createElement("div",{style:{display:"flex",gap:8,alignItems:"center"}},React.createElement("select",{value:ae,onChange:e=>ne(Number(e.target.value)),style:{padding:"6px 10px",background:"var(--surface)",border:"1px solid var(--border)",borderRadius:6,color:"var(--text)",fontSize:13}},React.createElement("option",{value:7},"7 days"),React.createElement("option",{value:14},"14 days"),React.createElement("option",{value:30},"30 days")),React.createElement("button",{className:"btn-primary btn-sm",onClick:async()=>{ce(!0);try{const t=await api.post(`/api/sites/${e}/reports`,{days:ae});t.error?n("Report error: "+t.error):(n("Report generated!"),Re())}catch(e){n("Report failed: "+e.message)}ce(!1)},disabled:se},se?"Generating...":"Generate Report"))),ee?React.createElement("div",{className:"loading"},"Loading reports..."):0===X.length?React.createElement("div",{className:"empty",style:{padding:20}},"No reports yet. Generate one to create a shareable summary."):React.createElement("div",{style:{display:"flex",flexDirection:"column",gap:8}},X.map(e=>{const t=`${window.location.origin}/reports/${e.id}`;return React.createElement("div",{key:e.id,className:"card",style:{padding:14,display:"flex",justifyContent:"space-between",alignItems:"center"}},React.createElement("div",null,React.createElement("div",{style:{fontSize:13,fontWeight:600}},e.period_start," to ",e.period_end),React.createElement("div",{style:{fontSize:11,color:"var(--text-muted)",marginTop:2}},"Created ",relativeTime(e.created_at))),React.createElement("div",{style:{display:"flex",gap:6}},React.createElement("button",{className:"btn-secondary btn-sm",onClick:()=>{navigator.clipboard.writeText(t),n("Link copied!")}},"Copy Link"),React.createElement("a",{href:`/reports/${e.id}`,target:"_blank",rel:"noopener noreferrer",className:"btn-secondary btn-sm",style:{textDecoration:"none",display:"inline-flex",alignItems:"center"}},"Open")))}))),"settings"===s&&F&&React.createElement("div",{style:{maxWidth:600}},React.createElement("h3",{style:{marginBottom:16}},"Site Settings"),React.createElement("div",{style:{display:"flex",gap:16,marginBottom:20}},React.createElement("div",{className:"card",style:{padding:12,flex:1,display:"flex",alignItems:"center",gap:8}},React.createElement(HealthDot,{status:F.health_status}),React.createElement("div",null,React.createElement("div",{style:{fontSize:11,textTransform:"uppercase",letterSpacing:"0.5px",color:"var(--text-muted)"}},"Health Status"),React.createElement("div",{style:{fontSize:14,fontWeight:600}},F.health_status||"unknown"))),React.createElement("div",{className:"card",style:{padding:12,flex:1}},React.createElement("div",{style:{fontSize:11,textTransform:"uppercase",letterSpacing:"0.5px",color:"var(--text-muted)"}},"Last Event"),React.createElement("div",{style:{fontSize:14,fontWeight:600}},F.last_event_at?relativeTime(F.last_event_at):"Never"))),React.createElement("div",{style:{marginBottom:16}},React.createElement("label",{style:{display:"block",fontSize:11,textTransform:"uppercase",letterSpacing:"0.5px",color:"var(--text-muted)",marginBottom:4}},"Report Email"),React.createElement("input",{type:"email",value:F.report_email||"",onChange:e=>L({...F,report_email:e.target.value}),placeholder:"reports@example.com",style:{width:"100%",padding:"8px 12px",background:"var(--surface)",border:"1px solid var(--border)",borderRadius:6,color:"var(--text)",fontSize:13}})),React.createElement("div",{style:{marginBottom:16}},React.createElement("label",{style:{display:"flex",alignItems:"center",gap:8,fontSize:13,cursor:"pointer"}},React.createElement("input",{type:"checkbox",checked:!!F.report_auto_weekly,onChange:e=>L({...F,report_auto_weekly:e.target.checked})}),"Send automated weekly report")),React.createElement("div",{style:{marginBottom:16}},React.createElement("label",{style:{display:"block",fontSize:11,textTransform:"uppercase",letterSpacing:"0.5px",color:"var(--text-muted)",marginBottom:4}},"Agency"),React.createElement("select",{value:F.agency_id||"",onChange:e=>L({...F,agency_id:e.target.value||null}),style:{width:"100%",padding:"8px 12px",background:"var(--surface)",border:"1px solid var(--border)",borderRadius:6,color:"var(--text)",fontSize:13}},React.createElement("option",{value:""},"No agency"),le.map(e=>React.createElement("option",{key:e.id,value:e.id},e.name)))),React.createElement("div",{style:{marginBottom:16}},React.createElement("label",{style:{display:"block",fontSize:11,textTransform:"uppercase",letterSpacing:"0.5px",color:"var(--text-muted)",marginBottom:4}},"Conversion URL Pattern ",React.createElement("span",{style:{textTransform:"none",fontWeight:400}},"(regex)")),React.createElement("input",{type:"text",value:F.conversion_pattern||"",onChange:e=>L({...F,conversion_pattern:e.target.value}),placeholder:"thank_you|order|checkout/complete",style:{width:"100%",padding:"8px 12px",background:"var(--surface)",border:"1px solid var(--border)",borderRadius:6,color:"var(--text)",fontSize:12,fontFamily:"var(--mono)"}})),React.createElement("div",{style:{display:"flex",gap:12,alignItems:"center"}},React.createElement("button",{className:"btn-primary",onClick:async()=>{oe(!0),de("");try{const t=await api.put(`/api/sites/${e}`,F);L(t),de("Saved!"),setTimeout(()=>de(""),2e3)}catch(e){de("Error: "+e.message)}oe(!1)},disabled:ie},ie?"Saving...":"Save Settings"),me&&React.createElement("span",{style:{fontSize:13,color:me.startsWith("Error")?"var(--danger)":"var(--success)"}},me))),"customers"===s&&React.createElement(CustomersList,{siteId:e}),"profile"===s&&F&&React.createElement("div",{style:{maxWidth:600}},React.createElement("div",{className:"flex-between",style:{marginBottom:16}},React.createElement("h3",null,"Site Profile"),React.createElement("button",{className:"btn-ai btn-sm",onClick:async()=>{try{const t=await api.post(`/api/sites/${e}/profile/auto`,{});t.platform&&!F?.platform&&L(e=>({...e,platform:t.platform})),t.business_type&&!F?.business_type&&L(e=>({...e,business_type:t.business_type})),!t.context_notes||F?.context_notes&&""!==F.context_notes||L(e=>({...e,context_notes:t.context_notes})),t.conversion_pattern&&L(e=>({...e,conversion_pattern:t.conversion_pattern})),n(`Auto-detected: ${t.business_type}/${t.platform} โ€” ${t.stats?.sessions||0} sessions analyzed`)}catch(e){n("Auto-detect failed: "+e.message)}}},"๐Ÿ” Auto-Detect Profile")),React.createElement("p",{style:{color:"var(--text-muted)",fontSize:13,marginBottom:20}},"Business context helps AI give accurate insights. Elements in the exclusion list won't be flagged as friction points."),React.createElement("div",{style:{marginBottom:16}},React.createElement("label",{style:{display:"block",fontSize:11,textTransform:"uppercase",letterSpacing:"0.5px",color:"var(--text-muted)",marginBottom:4}},"Business Type"),React.createElement("select",{value:F.business_type||"",onChange:e=>L({...F,business_type:e.target.value}),style:{width:"100%",padding:"8px 12px",background:"var(--surface)",border:"1px solid var(--border)",borderRadius:6,color:"var(--text)",fontSize:13}},React.createElement("option",{value:""},"Select..."),React.createElement("option",{value:"ecommerce"},"E-commerce / DTC"),React.createElement("option",{value:"saas"},"SaaS"),React.createElement("option",{value:"marketplace"},"Marketplace"),React.createElement("option",{value:"media"},"Media / Content"),React.createElement("option",{value:"agency"},"Agency (client site)"),React.createElement("option",{value:"internal"},"Internal Tool"),React.createElement("option",{value:"other"},"Other"))),React.createElement("div",{style:{marginBottom:16}},React.createElement("label",{style:{display:"block",fontSize:11,textTransform:"uppercase",letterSpacing:"0.5px",color:"var(--text-muted)",marginBottom:4}},"Platform"),React.createElement("select",{value:F.platform||"",onChange:e=>L({...F,platform:e.target.value}),style:{width:"100%",padding:"8px 12px",background:"var(--surface)",border:"1px solid var(--border)",borderRadius:6,color:"var(--text)",fontSize:13}},React.createElement("option",{value:""},"Select..."),React.createElement("option",{value:"shopify"},"Shopify"),React.createElement("option",{value:"wordpress"},"WordPress / WooCommerce"),React.createElement("option",{value:"webflow"},"Webflow"),React.createElement("option",{value:"squarespace"},"Squarespace"),React.createElement("option",{value:"nextjs"},"Next.js"),React.createElement("option",{value:"custom"},"Custom"),React.createElement("option",{value:"other"},"Other"))),React.createElement("div",{style:{marginBottom:16}},React.createElement("label",{style:{display:"block",fontSize:11,textTransform:"uppercase",letterSpacing:"0.5px",color:"var(--text-muted)",marginBottom:4}},"Context Notes"),React.createElement("textarea",{value:F.context_notes||"",onChange:e=>L({...F,context_notes:e.target.value}),placeholder:"Describe how the site works. E.g. 'Color swatches switch the product image but are not buttons โ€” they use JS click handlers on span elements. Variant selection is handled by radio inputs below.'",style:{width:"100%",minHeight:100,padding:"8px 12px",background:"var(--surface)",border:"1px solid var(--border)",borderRadius:6,color:"var(--text)",fontSize:13,resize:"vertical",fontFamily:"inherit",lineHeight:1.6}})),React.createElement("div",{style:{marginBottom:16}},React.createElement("label",{style:{display:"block",fontSize:11,textTransform:"uppercase",letterSpacing:"0.5px",color:"var(--text-muted)",marginBottom:4}},"Excluded Elements ",React.createElement("span",{style:{textTransform:"none",fontWeight:400}},"(one per line โ€” won't be flagged as friction)")),React.createElement("textarea",{value:(F.excluded_elements||[]).join("\n"),onChange:e=>L({...F,excluded_elements:e.target.value.split("\n").map(e=>e.trim()).filter(Boolean)}),placeholder:'span.swatch-color\ndiv.product__thumbs-container\nlabel.:"Racy Black Matte"',style:{width:"100%",minHeight:80,padding:"8px 12px",background:"var(--surface)",border:"1px solid var(--border)",borderRadius:6,color:"var(--text)",fontSize:12,resize:"vertical",fontFamily:"var(--mono)",lineHeight:1.8}})),React.createElement("div",{style:{marginBottom:16}},React.createElement("label",{style:{display:"block",fontSize:11,textTransform:"uppercase",letterSpacing:"0.5px",color:"var(--text-muted)",marginBottom:4}},"Conversion URL Pattern ",React.createElement("span",{style:{textTransform:"none",fontWeight:400}},"(regex โ€” matches against page URL)")),React.createElement("input",{type:"text",value:F.conversion_pattern||"",onChange:e=>L({...F,conversion_pattern:e.target.value}),placeholder:"thank_you|order|checkout/complete",style:{width:"100%",padding:"8px 12px",background:"var(--surface)",border:"1px solid var(--border)",borderRadius:6,color:"var(--text)",fontSize:12,fontFamily:"var(--mono)"}})),React.createElement("div",{style:{display:"flex",gap:12,alignItems:"center"}},React.createElement("button",{className:"btn-primary",onClick:async()=>{M(!0),H("");try{const t=await api.put(`/api/sites/${e}`,F);L(t),H("Saved!"),setTimeout(()=>H(""),2e3)}catch(e){H("Error: "+e.message)}M(!1)},disabled:W},W?"Saving...":"Save Profile"),P&&React.createElement("span",{style:{fontSize:13,color:P.startsWith("Error")?"var(--danger)":"var(--success)"}},P))))}function CustomersList({siteId:e}){const[t,a]=useState([]),[n,s]=useState(!0);return useEffect(()=>{api.get(`/api/sites/${e}/customers`).then(a).catch(()=>a([])).finally(()=>s(!1))},[e]),n?React.createElement("div",{style:{padding:20,textAlign:"center"}},React.createElement("span",{className:"spinner"})):t.length?React.createElement("div",null,React.createElement("h3",{style:{marginBottom:12}},"Customers (",t.length,")"),React.createElement("table",{style:{width:"100%",borderCollapse:"collapse",fontSize:13}},React.createElement("thead",null,React.createElement("tr",{style:{borderBottom:"1px solid var(--border)",textAlign:"left"}},React.createElement("th",{style:{padding:"8px 12px"}},"Email"),React.createElement("th",{style:{padding:"8px 12px"}},"Name"),React.createElement("th",{style:{padding:"8px 12px"}},"Company"),React.createElement("th",{style:{padding:"8px 12px"}},"Role"),React.createElement("th",{style:{padding:"8px 12px"}},"Joined"))),React.createElement("tbody",null,t.map(e=>React.createElement("tr",{key:e.id,style:{borderBottom:"1px solid var(--border)"}},React.createElement("td",{style:{padding:"8px 12px",fontFamily:"var(--mono)",fontSize:12}},e.email),React.createElement("td",{style:{padding:"8px 12px"}},e.name||"โ€”"),React.createElement("td",{style:{padding:"8px 12px"}},e.company||"โ€”"),React.createElement("td",{style:{padding:"8px 12px"}},React.createElement("span",{style:{background:"owner"===e.role?"rgba(99,102,241,0.2)":"var(--surface2)",padding:"2px 8px",borderRadius:4,fontSize:11}},e.role)),React.createElement("td",{style:{padding:"8px 12px",color:"var(--text-muted)",fontSize:12}},new Date(e.created_at).toLocaleDateString())))))):React.createElement("div",{style:{padding:20,color:"var(--text-muted)",fontSize:13}},"No customer accounts linked to this site.")}function SiteChat({siteId:e}){const[t,a]=useState([]),[n,s]=useState(""),[c,l]=useState(!1),r=async()=>{const t=n.trim();if(t&&!c){s(""),a(e=>[...e,{role:"user",text:t}]),l(!0);try{const n=await api.post(`/api/sites/${e}/chat`,{question:t,days:30});a(e=>[...e,{role:"assistant",text:n.answer,meta:`${n.input_tokens+n.output_tokens} tokens ยท ${n.cost_estimate.toFixed(4)} ยท queried: ${n.topics_queried.join(", ")}`}])}catch(e){a(e=>[...e,{role:"assistant",text:"Failed to get response. Check that ANTHROPIC_API_KEY is set."}])}l(!1)}};return React.createElement("div",{className:"chat-container"},React.createElement("div",{className:"chat-header"},React.createElement("span",null,"๐Ÿ’ฌ")," Ask about your data"),React.createElement("div",{className:"chat-messages"},0===t.length&&React.createElement("div",{className:"chat-empty"},"Ask questions about your site's behavioral data. Examples:",React.createElement("br",null),'"What are the top frustration points?"',React.createElement("br",null),'"Which pages have the longest engagement?"',React.createElement("br",null),'"Where are my visitors coming from?"'),t.map((e,t)=>{return React.createElement("div",{key:t,className:`chat-msg ${e.role}`},(a=e.text)?a.split("\n").map((e,t)=>{let a=e.replace(/\*\*(.+?)\*\*/g,"$1").replace(/\*(.+?)\*/g,"$1").replace(/`(.+?)`/g,"$1");return e.match(/^[-โ€ข]\s/)&&(a="
  • "+a.slice(2)+"
  • "),React.createElement("div",{key:t,dangerouslySetInnerHTML:{__html:a}})}):null,e.meta&&React.createElement("div",{className:"chat-meta"},e.meta));var a}),c&&React.createElement("div",{className:"chat-msg assistant"},React.createElement("em",null,"Thinking..."))),React.createElement("div",{className:"chat-input-row"},React.createElement("input",{value:n,onChange:e=>s(e.target.value),onKeyDown:e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),r())},placeholder:"Ask a question about your site data...",disabled:c}),React.createElement("button",{className:"btn-ai",onClick:r,disabled:c||!n.trim()},c?"Thinking...":"Ask")))}function SessionDetail({siteId:e,siteName:t,sessionId:a,visitorId:n,onNavigate:s}){const[c,l]=useState(a),[r,i]=useState(null),[o,m]=useState(!0),[d,u]=useState(null),[p,R]=useState(""),[g,v]=useState(!1),[E,y]=useState(!1),[f,b]=useState(null),[h,N]=useState(!1),[x,S]=useState(!1),k=useCallback(async()=>{m(!0);const t=await api.get(`/api/sites/${e}/sessions/${c}`);i(t),m(!1)},[e,c]);if(useEffect(()=>{k()},[k]),o)return React.createElement("div",{className:"container"},React.createElement("div",{className:"loading"},"Loading session..."));if(!r||!r.session)return React.createElement("div",{className:"container"},React.createElement("div",{className:"empty"},"Session not found."));const _=r.session,w=r.events||[],C=r.visitor_sessions||[],z=_.started_at?new Date(_.started_at).getTime():w.length>0&&w[0].ts||0;return React.createElement("div",{className:"container"},React.createElement("div",{className:"breadcrumb"},React.createElement("button",{onClick:()=>s("home")},"Sites"),React.createElement("span",{className:"sep"},"/"),React.createElement("button",{onClick:()=>s("site",{siteId:e,siteName:t})},t||"Site"),React.createElement("span",{className:"sep"},"/"),React.createElement("span",null,"Session")),React.createElement("div",{className:"stat-cards",style:{marginBottom:20}},React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"Visitor"),React.createElement("div",{className:"value",style:{fontSize:12,cursor:"pointer",color:"var(--accent)"},onClick:()=>s("visitor",{siteId:e,siteName:t,visitorId:_.visitor_id||n})},(_.visitor_id||n||"").substring(0,16),"...")),React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"Started"),React.createElement("div",{className:"value",style:{fontSize:14},title:fullDate(_.started_at)},relativeTime(_.started_at))),React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"Duration"),React.createElement("div",{className:"value"},fmtMs(_.duration_ms))),React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"Events"),React.createElement("div",{className:"value"},_.event_count||w.length)),React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"Dead Clicks"),React.createElement("div",{className:"value danger"},_.dead_clicks||0)),React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"Rage Clicks"),React.createElement("div",{className:"value danger"},_.rage_clicks||0))),React.createElement("div",{className:"session-layout"},React.createElement("div",{className:"section"},React.createElement("div",{className:"flex-between mb-8"},React.createElement("h3",null,"Event Timeline"),React.createElement("button",{className:"btn-ai btn-sm",disabled:g,onClick:async()=>{v(!0),R(""),u(null);try{const t=await api.post(`/api/sites/${e}/analyze/session/${c}`,{});if(t.error)return R(t.error),void v(!1);if("complete"===t.status&&t.result)return u(t.result),void v(!1);const a=t.job_id;if(!a)return R("No job ID returned"),void v(!1);pollAnalysis(e,a,(e,t)=>{v(!1),t?R(t):e&&e.result?u(e.result):R("Analysis returned no result")})}catch(e){R("Failed to start analysis"),v(!1)}}},g?React.createElement(React.Fragment,null,React.createElement("span",{className:"spinner-inline"}),"Analyzing..."):"Analyze with Claude")),React.createElement("div",{className:"card",style:{padding:12}},0===w.length?React.createElement("div",{className:"empty"},"No events recorded."):React.createElement("div",{className:"timeline"},w.map((e,t)=>{const a=((e,t)=>{const a=e.ts?e.ts-t:e.timestamp?new Date(e.timestamp).getTime()-t:0,n=fmtMsTimestamp(Math.max(0,a)),s=e.el||e.element||"";switch(e.t||e.type){case"ss":return{ts:n,desc:React.createElement("span",null,"Session started โ€” ",React.createElement("span",{className:"el-name"},e.pg||e.page||"/")," ",e.rf||e.referrer?React.createElement("span",null,"(via ",e.rf||e.referrer,")"):""),cls:""};case"hi":return{ts:n,desc:React.createElement("span",null,"Hovered on ",React.createElement("span",{className:"el-name"},s)),cls:""};case"ix":return{ts:n,desc:React.createElement("span",null,"Clicked ",React.createElement("span",{className:"el-name"},s),null!=e.dt?React.createElement("span",null," (",(e.dt/1e3).toFixed(1),"s since last)"):""),cls:""};case"dc":return{ts:n,desc:React.createElement("span",null,"Dead click on ",React.createElement("span",{className:"el-name"},s)),cls:"danger"};case"rc":return{ts:n,desc:React.createElement("span",null,"Rage click on ",React.createElement("span",{className:"el-name"},s),e.n?React.createElement("span",null," (",e.n," clicks)"):""),cls:"danger-bold"};case"sd":return{ts:n,desc:React.createElement("span",null,"Scrolled to ",null!=e.p?e.p:"?","%"),cls:""};case"vs":return{ts:n,desc:React.createElement("span",null,"Viewport: [",Array.isArray(e.el)?e.el.join(", "):s,"]"),cls:"muted"};case"vc":return{ts:n,desc:React.createElement("span",null,"Tab ",e.h?"hidden":"visible"),cls:"muted"};case"ul":return{ts:n,desc:React.createElement("span",null,"Left page",null!=e.eg?React.createElement("span",null," (",(e.eg/1e3).toFixed(1),"s engaged)"):""),cls:""};default:return{ts:n,desc:React.createElement("span",null,e.t||e.type||"unknown",": ",JSON.stringify(e)),cls:"muted"}}})(e,z);return React.createElement("div",{key:t,className:`timeline-event ${a.cls}`},React.createElement("span",{className:"ts"},a.ts),React.createElement("span",{className:"desc"},a.desc))}))),p&&React.createElement("div",{style:{color:"var(--danger)",fontSize:13,marginTop:12}},"Error: ",p),d&&React.createElement(SessionAnalysisResult,{result:d}),React.createElement("div",{style:{marginTop:16}},React.createElement("button",{className:"btn-secondary btn-sm",onClick:async()=>{if(E)y(!1);else if(y(!0),!f){N(!0);try{const t=await api.get(`/api/sites/${e}/raw/session/${c}`);b(t)}catch{b([])}N(!1)}},style:{marginRight:8}},E?"Hide Raw JSON":"Show Raw JSON"),E&&f&&React.createElement("button",{className:"btn-secondary btn-sm",onClick:()=>{const e=JSON.stringify(f,null,2);navigator.clipboard.writeText(e).then(()=>{S(!0),setTimeout(()=>S(!1),2e3)})}},x?"โœ“ Copied!":"Copy JSON")),E&&React.createElement("div",{className:"card",style:{marginTop:12,padding:12}},h?React.createElement("div",{className:"loading"},"Loading raw events..."):f&&f.length>0?React.createElement("pre",{style:{fontFamily:"var(--mono)",fontSize:11,lineHeight:1.6,maxHeight:500,overflow:"auto",whiteSpace:"pre-wrap",wordBreak:"break-all",color:"var(--text-muted)",margin:0}},JSON.stringify(f,null,2)):React.createElement("div",{style:{color:"var(--text-muted)",fontSize:12}},"No raw events."))),React.createElement("div",{className:"session-sidebar"},React.createElement("h3",{style:{fontSize:12,textTransform:"uppercase",letterSpacing:"0.5px",color:"var(--text-muted)",marginBottom:12}},"Visitor Sessions"),0===C.length?React.createElement("div",{style:{color:"var(--text-muted)",fontSize:12}},"No other sessions."):C.map(e=>React.createElement("div",{key:e.id,className:"sidebar-session "+(e.id===c?"active":""),onClick:()=>{e.id!==c&&l(e.id)}},React.createElement("div",{title:fullDate(e.started_at),style:{fontWeight:500,marginBottom:2}},relativeTime(e.started_at)),React.createElement("div",{style:{color:"var(--text-muted)"}},e.event_count||0," events ยท ",fmtMs(e.duration_ms),(e.dead_clicks>0||e.rage_clicks>0)&&React.createElement("span",{style:{color:"var(--danger)"}}," ยท ",e.dead_clicks||0,"dc ",e.rage_clicks||0,"rc")))))))}function VisitorDetail({siteId:e,siteName:t,visitorId:a,onNavigate:n}){const[s,c]=useState(null),[l,r]=useState(!0),[i,o]=useState(null),[m,d]=useState(""),[u,p]=useState(!1),[R,g]=useState(!1),[v,E]=useState(null),[y,f]=useState(!1),[b,h]=useState(!1);if(useEffect(()=>{(async()=>{r(!0);const t=await api.get(`/api/sites/${e}/visitors/${a}`);c(t),r(!1)})()},[e,a]),l)return React.createElement("div",{className:"container"},React.createElement("div",{className:"loading"},"Loading visitor..."));if(!s||!s.visitor)return React.createElement("div",{className:"container"},React.createElement("div",{className:"empty"},"Visitor not found."));const N=s.visitor,x=s.sessions||[];return React.createElement("div",{className:"container"},React.createElement("div",{className:"breadcrumb"},React.createElement("button",{onClick:()=>n("home")},"Sites"),React.createElement("span",{className:"sep"},"/"),React.createElement("button",{onClick:()=>n("site",{siteId:e,siteName:t})},t||"Site"),React.createElement("span",{className:"sep"},"/"),React.createElement("span",null,"Visitor")),React.createElement("div",{className:"flex-between mb-8"},React.createElement("div",null),React.createElement("button",{className:"btn-ai btn-sm",disabled:u,onClick:async()=>{p(!0),d(""),o(null);try{const t=await api.post(`/api/sites/${e}/analyze/visitor/${a}`,{});if(t.error)return d(t.error),void p(!1);if("complete"===t.status&&t.result)return o(t.result),void p(!1);const n=t.job_id;if(!n)return d("No job ID returned"),void p(!1);pollAnalysis(e,n,(e,t)=>{p(!1),t?d(t):e&&e.result?o(e.result):d("Analysis returned no result")})}catch{d("Failed to start analysis"),p(!1)}}},u?React.createElement(React.Fragment,null,React.createElement("span",{className:"spinner-inline"}),"Analyzing..."):"Analyze Journey")),React.createElement("div",{className:"stat-cards"},React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"Visitor ID"),React.createElement("div",{className:"value",style:{fontSize:11}},a)),React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"First Seen"),React.createElement("div",{className:"value",style:{fontSize:14},title:fullDate(N.first_seen)},relativeTime(N.first_seen))),React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"Last Seen"),React.createElement("div",{className:"value",style:{fontSize:14},title:fullDate(N.last_seen)},relativeTime(N.last_seen))),React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"Total Sessions"),React.createElement("div",{className:"value"},fmtNumber(N.total_sessions))),React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"Total Events"),React.createElement("div",{className:"value"},fmtNumber(N.total_events)))),React.createElement("div",{className:"section"},React.createElement("h3",null,"Sessions"),0===x.length?React.createElement("div",{className:"empty"},"No sessions recorded."):React.createElement("div",{className:"card table-wrap"},React.createElement("table",null,React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Started"),React.createElement("th",null,"Duration"),React.createElement("th",null,"Events"),React.createElement("th",null,"Dead Clicks"),React.createElement("th",null,"Rage Clicks"),React.createElement("th",null,"Entry Page"))),React.createElement("tbody",null,x.map(s=>React.createElement("tr",{key:s.id,className:"clickable",onClick:()=>n("session",{siteId:e,siteName:t,sessionId:s.id,visitorId:a})},React.createElement("td",{title:fullDate(s.started_at)},relativeTime(s.started_at)),React.createElement("td",{className:"mono"},fmtMs(s.duration_ms)),React.createElement("td",{className:"mono"},s.event_count||0),React.createElement("td",{className:"mono",style:{color:s.dead_clicks>0?"var(--danger)":void 0}},s.dead_clicks||0),React.createElement("td",{className:"mono",style:{color:s.rage_clicks>0?"var(--danger)":void 0}},s.rage_clicks||0),React.createElement("td",{className:"mono",style:{fontSize:11}},s.entry_page||"โ€”"))))))),m&&React.createElement("div",{style:{color:"var(--danger)",fontSize:13,marginTop:12}},"Error: ",m),i&&React.createElement(VisitorAnalysisResult,{result:i}),React.createElement("div",{style:{marginTop:16}},React.createElement("button",{className:"btn-secondary btn-sm",onClick:async()=>{if(R)g(!1);else if(g(!0),!v){f(!0);try{E(await api.get(`/api/sites/${e}/raw/visitor/${a}`))}catch{E([])}f(!1)}},style:{marginRight:8}},R?"Hide Raw JSON":"Show Raw JSON"),R&&v&&React.createElement("button",{className:"btn-secondary btn-sm",onClick:()=>{navigator.clipboard.writeText(JSON.stringify(v,null,2)).then(()=>{h(!0),setTimeout(()=>h(!1),2e3)})}},b?"โœ“ Copied!":"Copy JSON")),R&&React.createElement("div",{className:"card",style:{marginTop:12,padding:12}},y?React.createElement("div",{className:"loading"},"Loading raw events..."):v&&v.length>0?React.createElement("pre",{style:{fontFamily:"var(--mono)",fontSize:11,lineHeight:1.6,maxHeight:500,overflow:"auto",whiteSpace:"pre-wrap",wordBreak:"break-all",color:"var(--text-muted)",margin:0}},JSON.stringify(v,null,2)):React.createElement("div",{style:{color:"var(--text-muted)",fontSize:12}},"No raw events.")))}function IssueDetail({siteId:e,siteName:t,issueId:a,onNavigate:n,showToast:s}){const[c,l]=useState(null),[r,i]=useState(!0),[o,m]=useState(""),[d,u]=useState(!1),p=useCallback(async()=>{i(!0);try{l(await api.get(`/api/sites/${e}/issues/${a}`))}catch(e){l(null)}i(!1)},[e,a]);useEffect(()=>{p()},[p]);const R=async t=>{await api.put(`/api/sites/${e}/issues/${a}`,{status:t,author:"admin"}),p(),s(`Status โ†’ ${t}`)},g=e=>({open:"var(--danger)",fixing:"#f59e0b",in_qa:"var(--accent)",approved:"var(--success)",dismissed:"var(--text-muted)"}[e]||"var(--border)");if(r)return React.createElement("div",{className:"container"},React.createElement("div",{className:"loading"},"Loading case..."));if(!c?.issue)return React.createElement("div",{className:"container"},React.createElement("div",{className:"empty"},"Issue not found."));const v=c.issue,E=c.activity||[],y=c.affected_sessions||[],f=parseInt(v.dead_clicks_7d||0)-parseInt(v.dead_clicks_prev_7d||0);return React.createElement("div",{className:"container"},React.createElement("div",{className:"breadcrumb"},React.createElement("button",{onClick:()=>n("home")},"Sites"),React.createElement("span",{className:"sep"},"/"),React.createElement("button",{onClick:()=>n("site",{siteId:e,siteName:t})},t),React.createElement("span",{className:"sep"},"/"),React.createElement("span",null,"Case #",v.id)),React.createElement("div",{className:"card",style:{padding:24,borderLeft:`4px solid ${g(v.status)}`,marginBottom:20}},React.createElement("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start",marginBottom:16}},React.createElement("div",null,React.createElement("h2",{style:{fontSize:16,fontWeight:700,marginBottom:4,fontFamily:"var(--mono)"}},v.element),React.createElement("span",{style:{fontSize:11,padding:"2px 8px",borderRadius:4,background:g(v.status),color:"#fff",fontWeight:600}},{open:"Open",fixing:"Fixing",in_qa:"In QA",approved:"โœ“ Approved",dismissed:"Dismissed"}[b=v.status]||b),React.createElement("span",{style:{fontSize:11,color:"var(--text-muted)",marginLeft:12}},"Detected ",relativeTime(v.detected_at))),React.createElement("div",{style:{display:"flex",gap:6}},"open"===v.status&&React.createElement(React.Fragment,null,React.createElement("button",{className:"btn-secondary btn-sm",onClick:()=>R("fixing")},"Mark Fixing"),React.createElement("button",{className:"btn-secondary btn-sm",onClick:()=>R("dismissed")},"Dismiss")),"fixing"===v.status&&React.createElement("button",{className:"btn-secondary btn-sm",onClick:()=>R("in_qa")},"Send to QA"),"in_qa"===v.status&&React.createElement("button",{className:"btn-secondary btn-sm",style:{background:"var(--success)",color:"#fff",border:"none"},onClick:()=>R("approved")},"Approve"),("approved"===v.status||"dismissed"===v.status)&&React.createElement("button",{className:"btn-secondary btn-sm",onClick:()=>R("open")},"Reopen"))),React.createElement("p",{style:{fontSize:13,color:"var(--text-muted)",lineHeight:1.7,marginBottom:12}},v.description),v.diagnosis&&React.createElement("div",{style:{background:"var(--bg)",border:"1px solid var(--border)",borderLeft:"3px solid var(--danger)",borderRadius:6,padding:14,marginBottom:12}},React.createElement("div",{style:{fontSize:11,textTransform:"uppercase",letterSpacing:"0.5px",color:"var(--danger)",fontWeight:600,marginBottom:4}},"Why this is a problem"),React.createElement("div",{style:{fontSize:13,lineHeight:1.7}},v.diagnosis)),v.fix_suggestion&&React.createElement("div",{style:{background:"var(--bg)",border:"1px solid var(--border)",borderLeft:"3px solid var(--success)",borderRadius:6,padding:14,marginBottom:16}},React.createElement("div",{style:{fontSize:11,textTransform:"uppercase",letterSpacing:"0.5px",color:"var(--success)",fontWeight:600,marginBottom:4}},"Recommended Fix"),React.createElement("div",{style:{fontSize:13,lineHeight:1.7}},v.fix_suggestion)),React.createElement("div",{className:"stat-cards",style:{marginBottom:0}},React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"At Detection"),React.createElement("div",{className:"value danger"},v.dead_clicks_at_detection)),React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"Last 24h Dead"),React.createElement("div",{className:"value",style:{color:0===parseInt(v.dead_clicks_last_24h)?"var(--success)":"var(--danger)"}},v.dead_clicks_last_24h||0)),React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"Last 24h Real"),React.createElement("div",{className:"value",style:{color:"var(--success)"}},v.real_clicks_last_24h||0)),React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"This Week"),React.createElement("div",{className:"value"},v.dead_clicks_7d||0)),React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"Prior Week"),React.createElement("div",{className:"value"},v.dead_clicks_prev_7d||0)),React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"Trend"),React.createElement("div",{className:"value",style:{color:f<0?"var(--success)":f>0?"var(--danger)":"var(--text-muted)"}},f>0?"โ†‘":f<0?"โ†“":"โ†’"," ",Math.abs(f))))),React.createElement(IssueImpactCard,{issue:v}),React.createElement("div",{style:{display:"grid",gridTemplateColumns:"1.5fr 1fr",gap:20}},React.createElement("div",null,React.createElement("h3",{style:{fontSize:14,marginBottom:12}},"Activity Timeline"),React.createElement("div",{className:"card",style:{padding:16}},React.createElement("div",{style:{borderLeft:"2px solid var(--border)",paddingLeft:16,display:"flex",flexDirection:"column",gap:12}},React.createElement("div",{style:{position:"relative"}},React.createElement("div",{style:{width:8,height:8,borderRadius:"50%",background:"var(--danger)",position:"absolute",left:-21,top:4}}),React.createElement("div",{style:{fontSize:11,color:"var(--text-muted)"}},fullDate(v.detected_at)),React.createElement("div",{style:{fontSize:13}},"Issue detected โ€” ",React.createElement("strong",null,v.dead_clicks_at_detection)," dead clicks on ",React.createElement("span",{className:"mono",style:{fontSize:11}},v.element))),E.map((e,t)=>React.createElement("div",{key:e.id,style:{position:"relative"}},React.createElement("div",{style:{width:8,height:8,borderRadius:"50%",background:"comment"===e.action?"var(--accent)":"#f59e0b",position:"absolute",left:-21,top:4}}),React.createElement("div",{style:{fontSize:11,color:"var(--text-muted)"}},fullDate(e.created_at)," ยท ",e.author||"system"),React.createElement("div",{style:{fontSize:13}},e.detail))),v.resolved_at&&React.createElement("div",{style:{position:"relative"}},React.createElement("div",{style:{width:8,height:8,borderRadius:"50%",background:"var(--accent)",position:"absolute",left:-21,top:4}}),React.createElement("div",{style:{fontSize:11,color:"var(--text-muted)"}},fullDate(v.resolved_at)),React.createElement("div",{style:{fontSize:13}},"Sent to QA")),v.verified_at&&React.createElement("div",{style:{position:"relative"}},React.createElement("div",{style:{width:8,height:8,borderRadius:"50%",background:"var(--success)",position:"absolute",left:-21,top:4}}),React.createElement("div",{style:{fontSize:11,color:"var(--text-muted)"}},fullDate(v.verified_at)),React.createElement("div",{style:{fontSize:13,color:"var(--success)"}},"Approved โœ“"))),React.createElement("form",{onSubmit:async t=>{t.preventDefault(),o.trim()&&(u(!0),await api.put(`/api/sites/${e}/issues/${a}`,{comment:o.trim(),author:"admin"}),m(""),p(),u(!1))},style:{marginTop:16,display:"flex",gap:8}},React.createElement("input",{type:"text",value:o,onChange:e=>m(e.target.value),placeholder:"Add a note...",style:{flex:1,padding:"8px 12px",fontSize:13}}),React.createElement("button",{type:"submit",className:"btn-primary btn-sm",disabled:d||!o.trim()},"Add Note")))),React.createElement("div",null,React.createElement("h3",{style:{fontSize:14,marginBottom:12}},"User Behavior Logs (",y.length," sessions)"),0===y.length?React.createElement("div",{className:"card",style:{padding:12}},React.createElement("div",{style:{color:"var(--text-muted)",fontSize:13}},"No recent sessions with this issue.")):y.map(a=>{const s={ss:"Started",ix:"Clicked",dc:"Dead click",rc:"Rage click",hi:"Hovered",sd:"Scrolled",vs:"Viewport",vc:"Tab change",ul:"Left page",et:"Engaged"},c={dc:"var(--danger)",rc:"var(--danger)",hi:"var(--success)",ix:"var(--text)",ss:"var(--text-muted)",ul:"var(--text-muted)",sd:"var(--text-muted)",vs:"var(--text-muted)",vc:"var(--text-muted)"};return React.createElement("div",{key:a.session_id,className:"card",style:{padding:14,marginBottom:8}},React.createElement("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:8,cursor:"pointer"},onClick:()=>n("session",{siteId:e,siteName:t,sessionId:a.session_id,visitorId:a.visitor_id})},React.createElement("div",null,React.createElement("span",{className:"mono",style:{fontSize:11,fontWeight:600}},a.visitor_id?.slice(0,10)),React.createElement("span",{style:{color:"var(--text-muted)",fontSize:11,marginLeft:8}},relativeTime(a.started_at)),a.entry_page&&React.createElement("span",{className:"mono",style:{color:"var(--text-muted)",fontSize:11,marginLeft:8}},a.entry_page)),React.createElement("span",{style:{fontSize:11,color:"var(--accent)"}},"View full session โ†’")),React.createElement("div",{style:{background:"var(--bg)",borderRadius:6,padding:10,fontFamily:"var(--mono)",fontSize:11,lineHeight:2}},(a.events||[]).map((e,t)=>{const a="dc"===e.event_type&&e.el===v.element,n=null!=e.session_ts?Math.floor(e.session_ts/1e3):0,l=`${Math.floor(n/60)}:${String(n%60).padStart(2,"0")}`;return React.createElement("div",{key:t,style:{color:c[e.event_type]||"var(--text-muted)",fontWeight:a?700:400,background:a?"rgba(239,68,68,0.1)":"transparent",padding:a?"0 4px":0,borderRadius:3}},React.createElement("span",{style:{color:"var(--text-muted)",fontWeight:400}},l)," ",s[e.event_type]||e.event_type,e.el&&React.createElement(React.Fragment,null," on ",React.createElement("span",{style:{fontWeight:500}},e.el)),e.page&&React.createElement(React.Fragment,null," โ€” ",e.page),e.dt&&parseInt(e.dt)>3e3&&React.createElement("span",{style:{color:"var(--text-muted)"}}," (",(parseInt(e.dt)/1e3).toFixed(1),"s gap)"))})))}))));var b}function CreateAgencyModal({onClose:e,onCreated:t}){const[a,n]=useState({name:"",logo_url:"",primary_color:"#6366f1",secondary_color:"#818cf8",contact_email:""}),[s,c]=useState(""),[l,r]=useState(!1),i=(e,t,s,c="text")=>React.createElement("div",{className:"field"},React.createElement("label",null,e),React.createElement("input",{type:c,value:a[t]||"",onChange:e=>n({...a,[t]:e.target.value}),placeholder:s}));return React.createElement("div",{className:"modal-overlay",onClick:t=>{t.target===t.currentTarget&&e()}},React.createElement("form",{className:"modal",onSubmit:async e=>{if(e.preventDefault(),!a.name)return c("Name is required");r(!0),c("");try{const e=await api.post("/api/agencies",a);if(e.error)return c(e.error),void r(!1);t(e)}catch{c("Failed to create agency"),r(!1)}}},React.createElement("h3",null,"Create Agency"),i("Agency Name","name","Acme Digital"),i("Logo URL","logo_url","https://..."),i("Primary Color","primary_color","#6366f1"),i("Secondary Color","secondary_color","#818cf8"),i("Contact Email","contact_email","hello@agency.com","email"),s&&React.createElement("div",{className:"error",style:{marginBottom:8}},s),React.createElement("div",{className:"actions"},React.createElement("button",{type:"button",className:"btn-secondary",onClick:e},"Cancel"),React.createElement("button",{type:"submit",className:"btn-primary",disabled:l},l?"Creating...":"Create Agency"))))}function AgencyDetail({agencyId:e,onNavigate:t,showToast:a}){const[n,s]=useState(null),[c,l]=useState([]),[r,i]=useState(!0),[o,m]=useState(!1),[d,u]=useState({}),[p,R]=useState(!1);if(useEffect(()=>{(async()=>{i(!0);try{const[t,a]=await Promise.all([api.get(`/api/agencies/${e}`),api.get(`/api/agencies/${e}/reports`).catch(()=>[])]);s(t),u({name:t.name,logo_url:t.logo_url,primary_color:t.primary_color,secondary_color:t.secondary_color,contact_email:t.contact_email}),l(Array.isArray(a)?a:[])}catch{}i(!1)})()},[e]),r)return React.createElement("div",{className:"container"},React.createElement("div",{className:"loading"},"Loading agency..."));if(!n)return React.createElement("div",{className:"container"},React.createElement("div",{className:"empty"},"Agency not found."));const g=(e,t)=>o?React.createElement("input",{type:"text",value:d[t]||"",onChange:e=>u({...d,[t]:e.target.value}),style:{padding:"4px 8px",background:"var(--surface)",border:"1px solid var(--border)",borderRadius:4,color:"var(--text)",fontSize:13,width:"100%"}}):React.createElement("span",{style:{fontSize:13}},n[t]||"โ€”");return React.createElement("div",{className:"container"},React.createElement("div",{className:"breadcrumb"},React.createElement("button",{onClick:()=>t("home")},"Sites"),React.createElement("span",{className:"sep"},"/"),React.createElement("button",{onClick:()=>t("agencies")},"Agencies"),React.createElement("span",{className:"sep"},"/"),React.createElement("span",null,n.name)),React.createElement("div",{className:"card",style:{padding:24,marginBottom:20}},React.createElement("div",{className:"flex-between",style:{marginBottom:16}},React.createElement("div",{style:{display:"flex",alignItems:"center",gap:12}},n.logo_url&&React.createElement("img",{src:n.logo_url,alt:"",style:{height:32,borderRadius:4}}),React.createElement("div",null,o?React.createElement("input",{type:"text",value:d.name,onChange:e=>u({...d,name:e.target.value}),style:{fontSize:18,fontWeight:700,padding:"4px 8px",background:"var(--surface)",border:"1px solid var(--border)",borderRadius:4,color:"var(--text)"}}):React.createElement("h2",{style:{fontSize:18,fontWeight:700}},n.name))),React.createElement("div",{style:{display:"flex",gap:6}},o?React.createElement(React.Fragment,null,React.createElement("button",{className:"btn-secondary btn-sm",onClick:()=>m(!1)},"Cancel"),React.createElement("button",{className:"btn-primary btn-sm",onClick:async()=>{R(!0);try{const t=await api.put(`/api/agencies/${e}`,d);s(t),m(!1),a("Agency updated!")}catch(e){a("Update failed: "+e.message)}R(!1)},disabled:p},p?"Saving...":"Save")):React.createElement("button",{className:"btn-secondary btn-sm",onClick:()=>m(!0)},"Edit"))),React.createElement("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:12,fontSize:13}},React.createElement("div",null,React.createElement("span",{style:{color:"var(--text-muted)",fontSize:11,textTransform:"uppercase",letterSpacing:"0.5px"}},"Primary Color"),React.createElement("br",null),React.createElement("div",{style:{display:"flex",alignItems:"center",gap:6,marginTop:2}},React.createElement("span",{style:{display:"inline-block",width:16,height:16,borderRadius:3,background:o?d.primary_color:n.primary_color,border:"1px solid var(--border)"}}),g(0,"primary_color"))),React.createElement("div",null,React.createElement("span",{style:{color:"var(--text-muted)",fontSize:11,textTransform:"uppercase",letterSpacing:"0.5px"}},"Secondary Color"),React.createElement("br",null),React.createElement("div",{style:{display:"flex",alignItems:"center",gap:6,marginTop:2}},React.createElement("span",{style:{display:"inline-block",width:16,height:16,borderRadius:3,background:o?d.secondary_color:n.secondary_color,border:"1px solid var(--border)"}}),g(0,"secondary_color"))),React.createElement("div",null,React.createElement("span",{style:{color:"var(--text-muted)",fontSize:11,textTransform:"uppercase",letterSpacing:"0.5px"}},"Contact Email"),React.createElement("br",null),React.createElement("div",{style:{marginTop:2}},g(0,"contact_email"))),React.createElement("div",null,React.createElement("span",{style:{color:"var(--text-muted)",fontSize:11,textTransform:"uppercase",letterSpacing:"0.5px"}},"Logo URL"),React.createElement("br",null),React.createElement("div",{style:{marginTop:2}},g(0,"logo_url"))))),React.createElement("div",{className:"section",style:{marginBottom:20}},React.createElement("h3",{style:{marginBottom:12}},"Assigned Sites (",(n.sites||[]).length,")"),0===(n.sites||[]).length?React.createElement("div",{className:"empty",style:{padding:16}},"No sites assigned to this agency."):React.createElement("div",{className:"card-grid"},n.sites.map(e=>React.createElement("div",{key:e.id,className:"card site-card",style:{cursor:"pointer"},onClick:()=>t("site",{siteId:e.id,siteName:e.name})},React.createElement("h3",{style:{display:"flex",alignItems:"center"}},React.createElement(HealthDot,{status:e.health_status}),e.name),React.createElement("div",{className:"domain"},e.domain))))),React.createElement("div",{className:"section"},React.createElement("h3",{style:{marginBottom:12}},"Reports (",c.length,")"),0===c.length?React.createElement("div",{className:"empty",style:{padding:16}},"No reports for this agency yet."):React.createElement("div",{style:{display:"flex",flexDirection:"column",gap:8}},c.map(e=>React.createElement("div",{key:e.id,className:"card",style:{padding:14,display:"flex",justifyContent:"space-between",alignItems:"center"}},React.createElement("div",null,React.createElement("div",{style:{fontSize:13,fontWeight:600}},e.site_name," โ€” ",e.period_start," to ",e.period_end),React.createElement("div",{style:{fontSize:11,color:"var(--text-muted)",marginTop:2}},"Created ",relativeTime(e.created_at))),React.createElement("a",{href:`/reports/${e.id}`,target:"_blank",rel:"noopener noreferrer",className:"btn-secondary btn-sm",style:{textDecoration:"none"}},"Open"))))))}function AgenciesPage({onNavigate:e,showToast:t}){const[a,n]=useState([]),[s,c]=useState(!0),[l,r]=useState(!1),i=useCallback(async()=>{c(!0);try{const e=await api.get("/api/agencies");n(Array.isArray(e)?e:[])}catch{n([])}c(!1)},[]);return useEffect(()=>{i()},[i]),s?React.createElement("div",{className:"container"},React.createElement("div",{className:"loading"},"Loading agencies...")):React.createElement("div",{className:"container"},React.createElement("div",{className:"flex-between mb-16"},React.createElement("h2",null,"Agencies"),React.createElement("button",{className:"btn-primary",onClick:()=>r(!0)},"+ Create Agency")),0===a.length?React.createElement("div",{className:"empty"},"No agencies yet. Create one to organize client sites."):React.createElement("div",{className:"card-grid"},a.map(t=>React.createElement("div",{key:t.id,className:"card site-card",style:{cursor:"pointer"},onClick:()=>e("agency",{agencyId:t.id})},React.createElement("div",{style:{display:"flex",alignItems:"center",gap:10,marginBottom:8}},React.createElement("span",{style:{display:"inline-block",width:24,height:24,borderRadius:4,background:t.primary_color||"var(--accent)",flexShrink:0}}),React.createElement("h3",{style:{margin:0}},t.name)),React.createElement("div",{style:{fontSize:12,color:"var(--text-muted)",marginBottom:4}},t.contact_email||"No email"),React.createElement("div",{style:{fontSize:13,fontWeight:600}},t.site_count||0," site",1!==(t.site_count||0)?"s":"")))),l&&React.createElement(CreateAgencyModal,{onClose:()=>r(!1),onCreated:()=>{r(!1),i()}}))}function IssueImpactCard({issue:e}){const t=e.metric_before,a=e.metric_after;if(!t&&!a)return null;if(t&&a){const e=["dead_clicks","rage_clicks","sessions_with_frustration"],n={dead_clicks:"Dead Clicks",rage_clicks:"Rage Clicks",sessions_with_frustration:"Frustrated Sessions"};return React.createElement("div",{className:"card",style:{padding:16,marginBottom:16,borderLeft:"3px solid var(--accent)"}},React.createElement("div",{style:{fontSize:12,textTransform:"uppercase",letterSpacing:"0.5px",color:"var(--accent)",fontWeight:600,marginBottom:12}},"Impact Measurement"),React.createElement("table",{style:{width:"100%",fontSize:13}},React.createElement("thead",null,React.createElement("tr",{style:{borderBottom:"1px solid var(--border)"}},React.createElement("th",{style:{textAlign:"left",padding:"4px 0",fontWeight:600}},"Metric"),React.createElement("th",{style:{textAlign:"right",padding:"4px 8px",fontWeight:600}},"Before"),React.createElement("th",{style:{textAlign:"right",padding:"4px 8px",fontWeight:600}},"After"),React.createElement("th",{style:{textAlign:"right",padding:"4px 0",fontWeight:600}},"Change"))),React.createElement("tbody",null,e.map(e=>{return React.createElement("tr",{key:e,style:{borderBottom:"1px solid var(--border)"}},React.createElement("td",{style:{padding:"6px 0"}},n[e]),React.createElement("td",{className:"mono",style:{textAlign:"right",padding:"6px 8px"}},null!=t[e]?t[e]:"โ€”"),React.createElement("td",{className:"mono",style:{textAlign:"right",padding:"6px 8px"}},null!=a[e]?a[e]:"โ€”"),React.createElement("td",{style:{textAlign:"right",padding:"6px 0"}},(e=>{if(null==e)return"โ€”";const t=e>0?"+":"",a=e<0?"var(--success)":e>0?"var(--danger)":"var(--text-muted)";return React.createElement("span",{style:{color:a,fontWeight:600}},t,e.toFixed(1),"%")})((s=t[e],c=a[e],s&&0!==s?(c-s)/s*100:null))));var s,c}))))}if(t&&!a){let a="?";if(e.fixed_at){const t=new Date(e.fixed_at),n=new Date(t.getTime()+6048e5),s=Math.ceil((n.getTime()-Date.now())/864e5);a=Math.max(0,s)}return React.createElement("div",{className:"card",style:{padding:16,marginBottom:16,borderLeft:"3px solid #f59e0b"}},React.createElement("div",{style:{fontSize:13}},"Impact measurement in progress โ€” results in ",a," day",1!==a?"s":""),React.createElement("div",{style:{fontSize:11,color:"var(--text-muted)",marginTop:4}},"Baseline captured: ",t.dead_clicks||0," dead clicks, ",t.rage_clicks||0," rage clicks, ",t.sessions_with_frustration||0," frustrated sessions"))}return null}function CustomerEmulateView({siteId:e,siteName:t,pixelKey:a,onNavigate:n}){const[s,c]=useState(null),[l,r]=useState(!0);return useEffect(()=>{(async()=>{try{const t=await api.post(`/api/sites/${e}/emulate`,{});c(`/?token=${t.token}#/app/site/${e}`)}catch{c(null)}r(!1)})()},[e]),React.createElement("div",{style:{height:"100vh",display:"flex",flexDirection:"column"}},React.createElement("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",padding:"8px 16px",background:"var(--accent)",flexShrink:0}},React.createElement("button",{onClick:()=>n("home"),style:{background:"rgba(255,255,255,0.2)",color:"#fff",border:"none",padding:"4px 12px",borderRadius:4,fontSize:12,cursor:"pointer"}},"โ† Back to Admin"),React.createElement("span",{style:{color:"#fff",fontSize:12,fontWeight:600}},"EMULATING: ",t),React.createElement("span",{style:{fontSize:11,color:"rgba(255,255,255,0.7)"}},"This is exactly what the customer sees")),l?React.createElement("div",{style:{flex:1,display:"flex",alignItems:"center",justifyContent:"center"}},React.createElement("span",{className:"spinner"})):s?React.createElement("iframe",{src:s,style:{flex:1,border:"none",width:"100%"}}):React.createElement("div",{style:{flex:1,display:"flex",alignItems:"center",justifyContent:"center",color:"var(--text-muted)"}},"Failed to load customer view"))}function CasesToReview({onNavigate:e}){const[t,a]=useState([]),[n,s]=useState(!0);return useEffect(()=>{api.get("/api/cases-to-review").then(a).catch(()=>a([])).finally(()=>s(!1))},[]),React.createElement("div",{className:"container"},React.createElement("h2",{style:{marginBottom:8}},"โš ๏ธ Cases to Review"),React.createElement("p",{style:{color:"var(--text-muted)",fontSize:13,marginBottom:20}},"Cases flagged by the system that need your attention โ€” fixes that didn't work, dismissed issues that are still active, and AI accuracy checks."),n&&React.createElement("div",{style:{color:"var(--text-muted)"}},"Loading..."),!n&&0===t.length&&React.createElement("div",{style:{padding:40,textAlign:"center",color:"var(--text-muted)",background:"var(--surface)",borderRadius:8}},"No cases flagged for review. System is running clean."),!n&&t.map(t=>{const a=t.metric_before?("string"==typeof t.metric_before?JSON.parse(t.metric_before):t.metric_before).element_dead_clicks:null,n=t.metric_after?("string"==typeof t.metric_after?JSON.parse(t.metric_after):t.metric_after).element_dead_clicks:null;return React.createElement("div",{key:t.id,style:{background:"var(--surface)",border:"1px solid var(--border)",borderLeft:"3px solid #f59e0b",borderRadius:8,padding:16,marginBottom:12,cursor:"pointer"},onClick:()=>e("issue",{siteId:t.site_id,siteName:t.site_name,issueId:t.id})},React.createElement("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:8}},React.createElement("div",null,React.createElement("span",{style:{color:(s=t.status,{open:"var(--red)",fixing:"#f59e0b",in_qa:"var(--accent)",approved:"var(--green)",dismissed:"var(--text-muted)"}[s]||"var(--border)"),fontWeight:600,fontSize:11,textTransform:"uppercase"}},t.status),React.createElement("span",{style:{color:"var(--text-muted)",fontSize:12,marginLeft:8}},t.site_name)),React.createElement("span",{style:{fontSize:11,color:"var(--text-muted)"}},new Date(t.updated_at).toLocaleDateString())),React.createElement("div",{style:{fontSize:13,marginBottom:6,fontFamily:"var(--mono)",color:"var(--text)"}},(t.element||"").slice(0,80)),React.createElement("div",{style:{fontSize:12,color:"var(--text-muted)",marginBottom:8}},(t.description||"").slice(0,150)),t.review_reason&&React.createElement("div",{style:{background:"rgba(245,158,11,0.1)",border:"1px solid rgba(245,158,11,0.3)",borderRadius:6,padding:"8px 12px",fontSize:12,color:"#f59e0b"}},React.createElement("strong",null,"Review reason:")," ",t.review_reason),null!=a&&null!=n&&React.createElement("div",{style:{display:"flex",gap:16,marginTop:8,fontSize:12}},React.createElement("span",null,"Before: ",React.createElement("strong",null,a)," dead clicks"),React.createElement("span",null,"After: ",React.createElement("strong",{style:{color:n0?`${Math.round(100*(1-n/a))}%`:"โ€”")));var s}))}function DiscoveriesView({onNavigate:e}){const[t,a]=useState([]),[n,s]=useState(null),[c,l]=useState("aggregate"),[r,i]=useState(null),[o,m]=useState(!1),[d,u]=useState({page_pattern:"",deviation:""});useEffect(()=>{api.get("/api/sites").then(a).catch(()=>{})},[]);const p=async e=>{m(!0),l("aggregate"),s(e);try{const t=await api.get(`/api/sites/${e}/anomalies`);i(t)}catch(e){i([])}m(!1)},R=e=>t.find(t=>t.id===e)?.name||e;return React.createElement("div",{className:"container"},React.createElement("div",{className:"flex-between",style:{marginBottom:20}},React.createElement("h2",{style:{margin:0}},"๐Ÿ”ฌ Discoveries ",React.createElement("span",{style:{fontSize:12,color:"var(--text-muted)",fontWeight:400}},"ADMIN LABS")),React.createElement("button",{className:"btn-outline btn-sm",onClick:async()=>{m(!0),l("crosssite"),s(null);try{const e=await api.get("/api/anomalies/cross-site");i(e)}catch{i([])}m(!1)}},"Cross-Site View")),React.createElement("div",{style:{display:"flex",gap:8,flexWrap:"wrap",marginBottom:20}},t.map(e=>React.createElement("div",{key:e.id,style:{display:"flex",gap:4}},React.createElement("button",{className:n===e.id&&"aggregate"===c?"btn-accent btn-sm":"btn-outline btn-sm",onClick:()=>p(e.id)},e.name),React.createElement("button",{className:"btn-outline btn-sm",style:{fontSize:10,padding:"2px 6px"},onClick:()=>(async e=>{m(!0),l("baselines"),s(e);try{const t=await api.get(`/api/sites/${e}/baselines`);i(t)}catch{i({error:"No baseline computed yet"})}m(!1)})(e.id),title:"View raw baselines"},"๐Ÿ“Š"),React.createElement("button",{className:"btn-outline btn-sm",style:{fontSize:10,padding:"2px 6px"},onClick:()=>(async e=>{m(!0);try{await api.post(`/api/sites/${e}/baselines/recompute`,{}),alert("Baseline recomputed")}catch(e){alert("Failed: "+e.message)}m(!1)})(e.id),title:"Recompute baseline"},"๐Ÿ”„")))),o&&React.createElement("div",{style:{color:"var(--text-muted)"}},"Loading..."),!o&&"aggregate"===c&&Array.isArray(r)&&React.createElement(React.Fragment,null,React.createElement("div",{className:"flex-between",style:{marginBottom:12}},React.createElement("span",{style:{fontSize:13,color:"var(--text-muted)"}},r.length," patterns found for ",R(n)),React.createElement("button",{className:"btn-outline btn-sm",onClick:()=>{n&&window.open(`/api/sites/${n}/anomalies/csv`,"_blank")}},"Export CSV")),React.createElement("table",{className:"data-table",style:{width:"100%",fontSize:12}},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Page"),React.createElement("th",null,"Deviation"),React.createElement("th",null,"Class"),React.createElement("th",null,"Sessions"),React.createElement("th",null,"Avg Score"),React.createElement("th",null,"First"),React.createElement("th",null,"Last"))),React.createElement("tbody",null,r.map((e,t)=>React.createElement("tr",{key:t,style:{cursor:"pointer"},onClick:()=>(async(e,t)=>{m(!0),l("sessions"),u({page_pattern:e,deviation:t});try{const a=await api.get(`/api/sites/${n}/anomalies/sessions?page_pattern=${encodeURIComponent(e)}&deviation=${encodeURIComponent(t)}`);i(a)}catch{i([])}m(!1)})(e.page_pattern,e.primary_deviation)},React.createElement("td",{className:"mono"},e.page_pattern),React.createElement("td",null,e.primary_deviation),React.createElement("td",null,React.createElement("span",{style:{color:"highly_anomalous"===e.classification?"var(--red)":"anomalous"===e.classification?"#f59e0b":"var(--text-muted)",fontWeight:600,fontSize:11}},e.classification)),React.createElement("td",null,e.session_count),React.createElement("td",null,e.avg_score),React.createElement("td",{style:{fontSize:11,color:"var(--text-muted)"}},e.first_seen?.slice(0,10)),React.createElement("td",{style:{fontSize:11,color:"var(--text-muted)"}},e.last_seen?.slice(0,10))))))),!o&&"sessions"===c&&Array.isArray(r)&&React.createElement(React.Fragment,null,React.createElement("button",{className:"btn-outline btn-sm",onClick:()=>p(n),style:{marginBottom:12}},"โ† Back to aggregate"),React.createElement("p",{style:{fontSize:12,color:"var(--text-muted)",marginBottom:12}},"Sessions: ",d.page_pattern," / ",d.deviation),React.createElement("table",{className:"data-table",style:{width:"100%",fontSize:12}},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Session"),React.createElement("th",null,"Score"),React.createElement("th",null,"Class"),React.createElement("th",null,"Top Deviations"),React.createElement("th",null,"Date"))),React.createElement("tbody",null,r.map((t,a)=>{const s=(t.deviations||[]).slice(0,3).map(e=>e.desc||e.metric).join("; ");return React.createElement("tr",{key:a,style:{cursor:"pointer"},onClick:()=>e("session",{siteId:n,sessionId:t.session_id,siteName:R(n)})},React.createElement("td",{className:"mono"},t.session_id),React.createElement("td",{style:{fontWeight:600,color:t.score>=10?"var(--red)":t.score>=6?"#f59e0b":"var(--text)"}},t.score),React.createElement("td",null,t.classification),React.createElement("td",{style:{maxWidth:400,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",fontSize:11}},s),React.createElement("td",{style:{fontSize:11,color:"var(--text-muted)"}},t.created_at?.slice(0,16)))})))),!o&&"crosssite"===c&&Array.isArray(r)&&React.createElement(React.Fragment,null,React.createElement("h3",{style:{marginBottom:12}},"Cross-Site Anomaly Patterns"),React.createElement("table",{className:"data-table",style:{width:"100%",fontSize:12}},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Site"),React.createElement("th",null,"Page"),React.createElement("th",null,"Deviation"),React.createElement("th",null,"Sessions"),React.createElement("th",null,"Avg Score"))),React.createElement("tbody",null,r.map((e,t)=>React.createElement("tr",{key:t},React.createElement("td",null,e.site_name),React.createElement("td",{className:"mono"},e.page_pattern),React.createElement("td",null,e.primary_deviation),React.createElement("td",null,e.session_count),React.createElement("td",null,e.avg_score)))))),!o&&"baselines"===c&&r&&React.createElement(React.Fragment,null,React.createElement("h3",{style:{marginBottom:12}},"Raw Baselines โ€” ",R(n)),r.error?React.createElement("p",{style:{color:"var(--text-muted)"}},r.error):React.createElement(React.Fragment,null,React.createElement("p",{style:{fontSize:11,color:"var(--text-muted)",marginBottom:12}},"Computed: ",r.computed_at," | Sample: ",r.baseline?.sample_size," sessions"),React.createElement("pre",{style:{background:"var(--bg)",border:"1px solid var(--border)",borderRadius:8,padding:16,fontSize:11,fontFamily:"var(--mono)",overflow:"auto",maxHeight:600,whiteSpace:"pre-wrap"}},JSON.stringify(r.baseline,null,2)))))}function App(){const[e,t]=useState("loading"),[a,n]=useState({name:"home",params:{}}),[s,c]=useState("");useEffect(()=>{(async()=>{try{const e=await api.get("/auth/status");e.exists?e.authenticated?t("authenticated"):t("login"):t("setup")}catch{t("login")}})()},[]);const l=e=>{c(e),setTimeout(()=>c(""),1500)},r=(e,t={})=>n({name:e,params:t});if("loading"===e)return React.createElement("div",{className:"auth-wrapper"},React.createElement("div",{className:"loading"},"Loading..."));if("setup"===e)return React.createElement(SetupScreen,{onDone:()=>t("authenticated")});if("login"===e)return React.createElement(LoginScreen,{onDone:()=>t("authenticated")});let i;switch(a.name){case"site":i=React.createElement(SiteDetail,{siteId:a.params.siteId,siteName:a.params.siteName,onNavigate:r,showToast:l});break;case"session":i=React.createElement(SessionDetail,{siteId:a.params.siteId,siteName:a.params.siteName,sessionId:a.params.sessionId,visitorId:a.params.visitorId,onNavigate:r});break;case"visitor":i=React.createElement(VisitorDetail,{siteId:a.params.siteId,siteName:a.params.siteName,visitorId:a.params.visitorId,onNavigate:r});break;case"issue":i=React.createElement(IssueDetail,{siteId:a.params.siteId,siteName:a.params.siteName,issueId:a.params.issueId,onNavigate:r,showToast:l});break;case"emulate":i=React.createElement(CustomerEmulateView,{siteId:a.params.siteId,siteName:a.params.siteName,pixelKey:a.params.pixelKey,onNavigate:r});break;case"agencies":i=React.createElement(AgenciesPage,{onNavigate:r,showToast:l});break;case"agency":i=React.createElement(AgencyDetail,{agencyId:a.params.agencyId,onNavigate:r,showToast:l});break;case"review":i=React.createElement(CasesToReview,{onNavigate:r});break;case"discoveries":i=React.createElement(DiscoveriesView,{onNavigate:r});break;default:i=React.createElement(SitesOverview,{onNavigate:r,showToast:l})}return React.createElement(React.Fragment,null,React.createElement(Header,{onLogout:()=>{api.setToken(null),t("login")},onNavigate:r,currentView:a.name}),i,React.createElement(Toast,{message:s}))}const root=ReactDOM.createRoot(document.getElementById("root"));root.render(React.createElement(App,null));&React.createElement("div",{className:"token-usage-card"},React.createElement("span",{className:"tu-label"},"Cost"),React.createElement("span",{className:"tu-value"},"$","number"==typeof $.total_cost?$.total_cost.toFixed(4):"0.00")),React.createElement("div",{className:"batch-dropdown"},React.createElement("button",{className:"btn-ai btn-sm",disabled:N,onClick:()=>z(!C)},N?React.createElement(React.Fragment,null,React.createElement("span",{className:"spinner-inline"}),"Analyzing..."):"Run Batch Analysis"),C&&React.createElement("div",{className:"bd-menu"},React.createElement("button",{onClick:()=>ge("7d")},"Last 7 days"),React.createElement("button",{onClick:()=>ge("14d")},"Last 14 days"),React.createElement("button",{onClick:()=>ge("30d")},"Last 30 days"))))),_&&React.createElement("div",{style:{color:"var(--danger)",fontSize:13,marginBottom:12}},"Error: ",_),S&&React.createElement(BatchAnalysisResult,{result:S}),0===I.length?React.createElement("div",{className:"empty"},"No analyses yet."):I.map((e,t)=>React.createElement(React.Fragment,{key:e.id||t},React.createElement(AnalysisListItem,{analysis:e,onClick:()=>B(T===(e.id||t)?null:e.id||t)}),T===(e.id||t)&&e.result&&("batch"===e.type?React.createElement(BatchAnalysisResult,{result:e.result}):"visitor"===e.type?React.createElement(VisitorAnalysisResult,{result:e.result}):React.createElement(SessionAnalysisResult,{result:e.result}))))),React.createElement(SiteChat,{siteId:e}))),"sessions"===s&&React.createElement(React.Fragment,null,React.createElement(DateRangeSelector,{from:l,to:i,onChange:ve}),b?React.createElement("div",{className:"loading"},"Loading..."):React.createElement("div",{className:"section"},0===R.length?React.createElement("div",{className:"empty"},"No sessions found for this period."):React.createElement(React.Fragment,null,React.createElement("div",{className:"card table-wrap"},React.createElement("table",null,React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Visitor"),React.createElement("th",null,"Started"),React.createElement("th",null,"Duration"),React.createElement("th",null,"Events"),React.createElement("th",null,"Dead"),React.createElement("th",null,"Rage"),React.createElement("th",null,"Entry Page"))),React.createElement("tbody",null,R.map(n=>React.createElement("tr",{key:n.id,className:"clickable",onClick:()=>a("session",{siteId:e,siteName:t,sessionId:n.id,visitorId:n.visitor_id})},React.createElement("td",{className:"mono",style:{fontSize:11}},(n.visitor_id||"").substring(0,12),"..."),React.createElement("td",{title:fullDate(n.started_at)},relativeTime(n.started_at)),React.createElement("td",{className:"mono"},fmtMs(n.duration_ms)),React.createElement("td",{className:"mono"},n.event_count),React.createElement("td",{className:"mono",style:{color:n.dead_clicks>0?"var(--danger)":void 0}},n.dead_clicks||0),React.createElement("td",{className:"mono",style:{color:n.rage_clicks>0?"var(--danger)":void 0}},n.rage_clicks||0),React.createElement("td",{className:"mono",style:{fontSize:11}},n.entry_page||"โ€”")))))),React.createElement("div",{className:"pagination"},React.createElement("button",{className:"btn-secondary btn-sm",disabled:v<=1,onClick:()=>E(e=>e-1)},"Previous"),React.createElement("span",{className:"page-info"},"Page ",v,y.pages?" of "+y.pages:""),React.createElement("button",{className:"btn-secondary btn-sm",disabled:R.length<20,onClick:()=>E(e=>e+1)},"Next"))))),"reports"===s&&React.createElement("div",{style:{maxWidth:700}},React.createElement("div",{className:"flex-between mb-16"},React.createElement("h3",null,"Reports"),React.createElement("div",{style:{display:"flex",gap:8,alignItems:"center"}},React.createElement("select",{value:ae,onChange:e=>ne(Number(e.target.value)),style:{padding:"6px 10px",background:"var(--surface)",border:"1px solid var(--border)",borderRadius:6,color:"var(--text)",fontSize:13}},React.createElement("option",{value:7},"7 days"),React.createElement("option",{value:14},"14 days"),React.createElement("option",{value:30},"30 days")),React.createElement("button",{className:"btn-primary btn-sm",onClick:async()=>{ce(!0);try{const t=await api.post(`/api/sites/${e}/reports`,{days:ae});t.error?n("Report error: "+t.error):(n("Report generated!"),Re())}catch(e){n("Report failed: "+e.message)}ce(!1)},disabled:se},se?"Generating...":"Generate Report"))),ee?React.createElement("div",{className:"loading"},"Loading reports..."):0===X.length?React.createElement("div",{className:"empty",style:{padding:20}},"No reports yet. Generate one to create a shareable summary."):React.createElement("div",{style:{display:"flex",flexDirection:"column",gap:8}},X.map(e=>{const t=`${window.location.origin}/reports/${e.id}`;return React.createElement("div",{key:e.id,className:"card",style:{padding:14,display:"flex",justifyContent:"space-between",alignItems:"center"}},React.createElement("div",null,React.createElement("div",{style:{fontSize:13,fontWeight:600}},e.period_start," to ",e.period_end),React.createElement("div",{style:{fontSize:11,color:"var(--text-muted)",marginTop:2}},"Created ",relativeTime(e.created_at))),React.createElement("div",{style:{display:"flex",gap:6}},React.createElement("button",{className:"btn-secondary btn-sm",onClick:()=>{navigator.clipboard.writeText(t),n("Link copied!")}},"Copy Link"),React.createElement("a",{href:`/reports/${e.id}`,target:"_blank",rel:"noopener noreferrer",className:"btn-secondary btn-sm",style:{textDecoration:"none",display:"inline-flex",alignItems:"center"}},"Open")))}))),"settings"===s&&F&&React.createElement("div",{style:{maxWidth:600}},React.createElement("h3",{style:{marginBottom:16}},"Site Settings"),React.createElement("div",{style:{display:"flex",gap:16,marginBottom:20}},React.createElement("div",{className:"card",style:{padding:12,flex:1,display:"flex",alignItems:"center",gap:8}},React.createElement(HealthDot,{status:F.health_status}),React.createElement("div",null,React.createElement("div",{style:{fontSize:11,textTransform:"uppercase",letterSpacing:"0.5px",color:"var(--text-muted)"}},"Health Status"),React.createElement("div",{style:{fontSize:14,fontWeight:600}},F.health_status||"unknown"))),React.createElement("div",{className:"card",style:{padding:12,flex:1}},React.createElement("div",{style:{fontSize:11,textTransform:"uppercase",letterSpacing:"0.5px",color:"var(--text-muted)"}},"Last Event"),React.createElement("div",{style:{fontSize:14,fontWeight:600}},F.last_event_at?relativeTime(F.last_event_at):"Never"))),React.createElement("div",{style:{marginBottom:16}},React.createElement("label",{style:{display:"block",fontSize:11,textTransform:"uppercase",letterSpacing:"0.5px",color:"var(--text-muted)",marginBottom:4}},"Report Email"),React.createElement("input",{type:"email",value:F.report_email||"",onChange:e=>L({...F,report_email:e.target.value}),placeholder:"reports@example.com",style:{width:"100%",padding:"8px 12px",background:"var(--surface)",border:"1px solid var(--border)",borderRadius:6,color:"var(--text)",fontSize:13}})),React.createElement("div",{style:{marginBottom:16}},React.createElement("label",{style:{display:"flex",alignItems:"center",gap:8,fontSize:13,cursor:"pointer"}},React.createElement("input",{type:"checkbox",checked:!!F.report_auto_weekly,onChange:e=>L({...F,report_auto_weekly:e.target.checked})}),"Send automated weekly report")),React.createElement("div",{style:{marginBottom:16}},React.createElement("label",{style:{display:"block",fontSize:11,textTransform:"uppercase",letterSpacing:"0.5px",color:"var(--text-muted)",marginBottom:4}},"Agency"),React.createElement("select",{value:F.agency_id||"",onChange:e=>L({...F,agency_id:e.target.value||null}),style:{width:"100%",padding:"8px 12px",background:"var(--surface)",border:"1px solid var(--border)",borderRadius:6,color:"var(--text)",fontSize:13}},React.createElement("option",{value:""},"No agency"),le.map(e=>React.createElement("option",{key:e.id,value:e.id},e.name)))),React.createElement("div",{style:{marginBottom:16}},React.createElement("label",{style:{display:"block",fontSize:11,textTransform:"uppercase",letterSpacing:"0.5px",color:"var(--text-muted)",marginBottom:4}},"Conversion URL Pattern ",React.createElement("span",{style:{textTransform:"none",fontWeight:400}},"(regex)")),React.createElement("input",{type:"text",value:F.conversion_pattern||"",onChange:e=>L({...F,conversion_pattern:e.target.value}),placeholder:"thank_you|order|checkout/complete",style:{width:"100%",padding:"8px 12px",background:"var(--surface)",border:"1px solid var(--border)",borderRadius:6,color:"var(--text)",fontSize:12,fontFamily:"var(--mono)"}})),React.createElement("div",{style:{display:"flex",gap:12,alignItems:"center"}},React.createElement("button",{className:"btn-primary",onClick:async()=>{oe(!0),de("");try{const t=await api.put(`/api/sites/${e}`,F);L(t),de("Saved!"),setTimeout(()=>de(""),2e3)}catch(e){de("Error: "+e.message)}oe(!1)},disabled:ie},ie?"Saving...":"Save Settings"),me&&React.createElement("span",{style:{fontSize:13,color:me.startsWith("Error")?"var(--danger)":"var(--success)"}},me))),"customers"===s&&React.createElement(CustomersList,{siteId:e}),"profile"===s&&F&&React.createElement("div",{style:{maxWidth:600}},React.createElement("div",{className:"flex-between",style:{marginBottom:16}},React.createElement("h3",null,"Site Profile"),React.createElement("button",{className:"btn-ai btn-sm",onClick:async()=>{try{const t=await api.post(`/api/sites/${e}/profile/auto`,{});t.platform&&!F?.platform&&L(e=>({...e,platform:t.platform})),t.business_type&&!F?.business_type&&L(e=>({...e,business_type:t.business_type})),!t.context_notes||F?.context_notes&&""!==F.context_notes||L(e=>({...e,context_notes:t.context_notes})),t.conversion_pattern&&L(e=>({...e,conversion_pattern:t.conversion_pattern})),n(`Auto-detected: ${t.business_type}/${t.platform} โ€” ${t.stats?.sessions||0} sessions analyzed`)}catch(e){n("Auto-detect failed: "+e.message)}}},"๐Ÿ” Auto-Detect Profile")),React.createElement("p",{style:{color:"var(--text-muted)",fontSize:13,marginBottom:20}},"Business context helps AI give accurate insights. Elements in the exclusion list won't be flagged as friction points."),React.createElement("div",{style:{marginBottom:16}},React.createElement("label",{style:{display:"block",fontSize:11,textTransform:"uppercase",letterSpacing:"0.5px",color:"var(--text-muted)",marginBottom:4}},"Business Type"),React.createElement("select",{value:F.business_type||"",onChange:e=>L({...F,business_type:e.target.value}),style:{width:"100%",padding:"8px 12px",background:"var(--surface)",border:"1px solid var(--border)",borderRadius:6,color:"var(--text)",fontSize:13}},React.createElement("option",{value:""},"Select..."),React.createElement("option",{value:"ecommerce"},"E-commerce / DTC"),React.createElement("option",{value:"saas"},"SaaS"),React.createElement("option",{value:"marketplace"},"Marketplace"),React.createElement("option",{value:"media"},"Media / Content"),React.createElement("option",{value:"agency"},"Agency (client site)"),React.createElement("option",{value:"internal"},"Internal Tool"),React.createElement("option",{value:"other"},"Other"))),React.createElement("div",{style:{marginBottom:16}},React.createElement("label",{style:{display:"block",fontSize:11,textTransform:"uppercase",letterSpacing:"0.5px",color:"var(--text-muted)",marginBottom:4}},"Platform"),React.createElement("select",{value:F.platform||"",onChange:e=>L({...F,platform:e.target.value}),style:{width:"100%",padding:"8px 12px",background:"var(--surface)",border:"1px solid var(--border)",borderRadius:6,color:"var(--text)",fontSize:13}},React.createElement("option",{value:""},"Select..."),React.createElement("option",{value:"shopify"},"Shopify"),React.createElement("option",{value:"wordpress"},"WordPress / WooCommerce"),React.createElement("option",{value:"webflow"},"Webflow"),React.createElement("option",{value:"squarespace"},"Squarespace"),React.createElement("option",{value:"nextjs"},"Next.js"),React.createElement("option",{value:"custom"},"Custom"),React.createElement("option",{value:"other"},"Other"))),React.createElement("div",{style:{marginBottom:16}},React.createElement("label",{style:{display:"block",fontSize:11,textTransform:"uppercase",letterSpacing:"0.5px",color:"var(--text-muted)",marginBottom:4}},"Context Notes"),React.createElement("textarea",{value:F.context_notes||"",onChange:e=>L({...F,context_notes:e.target.value}),placeholder:"Describe how the site works. E.g. 'Color swatches switch the product image but are not buttons โ€” they use JS click handlers on span elements. Variant selection is handled by radio inputs below.'",style:{width:"100%",minHeight:100,padding:"8px 12px",background:"var(--surface)",border:"1px solid var(--border)",borderRadius:6,color:"var(--text)",fontSize:13,resize:"vertical",fontFamily:"inherit",lineHeight:1.6}})),React.createElement("div",{style:{marginBottom:16}},React.createElement("label",{style:{display:"block",fontSize:11,textTransform:"uppercase",letterSpacing:"0.5px",color:"var(--text-muted)",marginBottom:4}},"Excluded Elements ",React.createElement("span",{style:{textTransform:"none",fontWeight:400}},"(one per line โ€” won't be flagged as friction)")),React.createElement("textarea",{value:(F.excluded_elements||[]).join("\n"),onChange:e=>L({...F,excluded_elements:e.target.value.split("\n").map(e=>e.trim()).filter(Boolean)}),placeholder:'span.swatch-color\ndiv.product__thumbs-container\nlabel.:"Racy Black Matte"',style:{width:"100%",minHeight:80,padding:"8px 12px",background:"var(--surface)",border:"1px solid var(--border)",borderRadius:6,color:"var(--text)",fontSize:12,resize:"vertical",fontFamily:"var(--mono)",lineHeight:1.8}})),React.createElement("div",{style:{marginBottom:16}},React.createElement("label",{style:{display:"block",fontSize:11,textTransform:"uppercase",letterSpacing:"0.5px",color:"var(--text-muted)",marginBottom:4}},"Conversion URL Pattern ",React.createElement("span",{style:{textTransform:"none",fontWeight:400}},"(regex โ€” matches against page URL)")),React.createElement("input",{type:"text",value:F.conversion_pattern||"",onChange:e=>L({...F,conversion_pattern:e.target.value}),placeholder:"thank_you|order|checkout/complete",style:{width:"100%",padding:"8px 12px",background:"var(--surface)",border:"1px solid var(--border)",borderRadius:6,color:"var(--text)",fontSize:12,fontFamily:"var(--mono)"}})),React.createElement("div",{style:{display:"flex",gap:12,alignItems:"center"}},React.createElement("button",{className:"btn-primary",onClick:async()=>{M(!0),H("");try{const t=await api.put(`/api/sites/${e}`,F);L(t),H("Saved!"),setTimeout(()=>H(""),2e3)}catch(e){H("Error: "+e.message)}M(!1)},disabled:W},W?"Saving...":"Save Profile"),P&&React.createElement("span",{style:{fontSize:13,color:P.startsWith("Error")?"var(--danger)":"var(--success)"}},P))))}function CustomersList({siteId:e}){const[t,a]=useState([]),[n,s]=useState(!0);return useEffect(()=>{api.get(`/api/sites/${e}/customers`).then(a).catch(()=>a([])).finally(()=>s(!1))},[e]),n?React.createElement("div",{style:{padding:20,textAlign:"center"}},React.createElement("span",{className:"spinner"})):t.length?React.createElement("div",null,React.createElement("h3",{style:{marginBottom:12}},"Customers (",t.length,")"),React.createElement("table",{style:{width:"100%",borderCollapse:"collapse",fontSize:13}},React.createElement("thead",null,React.createElement("tr",{style:{borderBottom:"1px solid var(--border)",textAlign:"left"}},React.createElement("th",{style:{padding:"8px 12px"}},"Email"),React.createElement("th",{style:{padding:"8px 12px"}},"Name"),React.createElement("th",{style:{padding:"8px 12px"}},"Company"),React.createElement("th",{style:{padding:"8px 12px"}},"Role"),React.createElement("th",{style:{padding:"8px 12px"}},"Joined"))),React.createElement("tbody",null,t.map(e=>React.createElement("tr",{key:e.id,style:{borderBottom:"1px solid var(--border)"}},React.createElement("td",{style:{padding:"8px 12px",fontFamily:"var(--mono)",fontSize:12}},e.email),React.createElement("td",{style:{padding:"8px 12px"}},e.name||"โ€”"),React.createElement("td",{style:{padding:"8px 12px"}},e.company||"โ€”"),React.createElement("td",{style:{padding:"8px 12px"}},React.createElement("span",{style:{background:"owner"===e.role?"rgba(99,102,241,0.2)":"var(--surface2)",padding:"2px 8px",borderRadius:4,fontSize:11}},e.role)),React.createElement("td",{style:{padding:"8px 12px",color:"var(--text-muted)",fontSize:12}},new Date(e.created_at).toLocaleDateString())))))):React.createElement("div",{style:{padding:20,color:"var(--text-muted)",fontSize:13}},"No customer accounts linked to this site.")}function SiteChat({siteId:e}){const[t,a]=useState([]),[n,s]=useState(""),[c,l]=useState(!1),r=async()=>{const t=n.trim();if(t&&!c){s(""),a(e=>[...e,{role:"user",text:t}]),l(!0);try{const n=await api.post(`/api/sites/${e}/chat`,{question:t,days:30});a(e=>[...e,{role:"assistant",text:n.answer,meta:`${n.input_tokens+n.output_tokens} tokens ยท ${n.cost_estimate.toFixed(4)} ยท queried: ${n.topics_queried.join(", ")}`}])}catch(e){a(e=>[...e,{role:"assistant",text:"Failed to get response. Check that ANTHROPIC_API_KEY is set."}])}l(!1)}};return React.createElement("div",{className:"chat-container"},React.createElement("div",{className:"chat-header"},React.createElement("span",null,"๐Ÿ’ฌ")," Ask about your data"),React.createElement("div",{className:"chat-messages"},0===t.length&&React.createElement("div",{className:"chat-empty"},"Ask questions about your site's behavioral data. Examples:",React.createElement("br",null),'"What are the top frustration points?"',React.createElement("br",null),'"Which pages have the longest engagement?"',React.createElement("br",null),'"Where are my visitors coming from?"'),t.map((e,t)=>{return React.createElement("div",{key:t,className:`chat-msg ${e.role}`},(a=e.text)?a.split("\n").map((e,t)=>{let a=e.replace(/\*\*(.+?)\*\*/g,"$1").replace(/\*(.+?)\*/g,"$1").replace(/`(.+?)`/g,"$1");return e.match(/^[-โ€ข]\s/)&&(a="
  • "+a.slice(2)+"
  • "),React.createElement("div",{key:t,dangerouslySetInnerHTML:{__html:a}})}):null,e.meta&&React.createElement("div",{className:"chat-meta"},e.meta));var a}),c&&React.createElement("div",{className:"chat-msg assistant"},React.createElement("em",null,"Thinking..."))),React.createElement("div",{className:"chat-input-row"},React.createElement("input",{value:n,onChange:e=>s(e.target.value),onKeyDown:e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),r())},placeholder:"Ask a question about your site data...",disabled:c}),React.createElement("button",{className:"btn-ai",onClick:r,disabled:c||!n.trim()},c?"Thinking...":"Ask")))}function SessionDetail({siteId:e,siteName:t,sessionId:a,visitorId:n,onNavigate:s}){const[c,l]=useState(a),[r,i]=useState(null),[o,m]=useState(!0),[d,u]=useState(null),[p,R]=useState(""),[g,v]=useState(!1),[E,y]=useState(!1),[f,b]=useState(null),[h,N]=useState(!1),[x,S]=useState(!1),k=useCallback(async()=>{m(!0);const t=await api.get(`/api/sites/${e}/sessions/${c}`);i(t),m(!1)},[e,c]);if(useEffect(()=>{k()},[k]),o)return React.createElement("div",{className:"container"},React.createElement("div",{className:"loading"},"Loading session..."));if(!r||!r.session)return React.createElement("div",{className:"container"},React.createElement("div",{className:"empty"},"Session not found."));const _=r.session,w=r.events||[],C=r.visitor_sessions||[],z=_.started_at?new Date(_.started_at).getTime():w.length>0&&w[0].ts||0;return React.createElement("div",{className:"container"},React.createElement("div",{className:"breadcrumb"},React.createElement("button",{onClick:()=>s("home")},"Sites"),React.createElement("span",{className:"sep"},"/"),React.createElement("button",{onClick:()=>s("site",{siteId:e,siteName:t})},t||"Site"),React.createElement("span",{className:"sep"},"/"),React.createElement("span",null,"Session")),React.createElement("div",{className:"stat-cards",style:{marginBottom:20}},React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"Visitor"),React.createElement("div",{className:"value",style:{fontSize:12,cursor:"pointer",color:"var(--accent)"},onClick:()=>s("visitor",{siteId:e,siteName:t,visitorId:_.visitor_id||n})},(_.visitor_id||n||"").substring(0,16),"...")),React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"Started"),React.createElement("div",{className:"value",style:{fontSize:14},title:fullDate(_.started_at)},relativeTime(_.started_at))),React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"Duration"),React.createElement("div",{className:"value"},fmtMs(_.duration_ms))),React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"Events"),React.createElement("div",{className:"value"},_.event_count||w.length)),React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"Dead Clicks"),React.createElement("div",{className:"value danger"},_.dead_clicks||0)),React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"Rage Clicks"),React.createElement("div",{className:"value danger"},_.rage_clicks||0))),React.createElement("div",{className:"session-layout"},React.createElement("div",{className:"section"},React.createElement("div",{className:"flex-between mb-8"},React.createElement("h3",null,"Event Timeline"),React.createElement("button",{className:"btn-ai btn-sm",disabled:g,onClick:async()=>{v(!0),R(""),u(null);try{const t=await api.post(`/api/sites/${e}/analyze/session/${c}`,{});if(t.error)return R(t.error),void v(!1);if("complete"===t.status&&t.result)return u(t.result),void v(!1);const a=t.job_id;if(!a)return R("No job ID returned"),void v(!1);pollAnalysis(e,a,(e,t)=>{v(!1),t?R(t):e&&e.result?u(e.result):R("Analysis returned no result")})}catch(e){R("Failed to start analysis"),v(!1)}}},g?React.createElement(React.Fragment,null,React.createElement("span",{className:"spinner-inline"}),"Analyzing..."):"Analyze with Claude")),React.createElement("div",{className:"card",style:{padding:12}},0===w.length?React.createElement("div",{className:"empty"},"No events recorded."):React.createElement("div",{className:"timeline"},w.map((e,t)=>{const a=((e,t)=>{const a=e.ts?e.ts-t:e.timestamp?new Date(e.timestamp).getTime()-t:0,n=fmtMsTimestamp(Math.max(0,a)),s=e.el||e.element||"";switch(e.t||e.type){case"ss":return{ts:n,desc:React.createElement("span",null,"Session started โ€” ",React.createElement("span",{className:"el-name"},e.pg||e.page||"/")," ",e.rf||e.referrer?React.createElement("span",null,"(via ",e.rf||e.referrer,")"):""),cls:""};case"hi":return{ts:n,desc:React.createElement("span",null,"Hovered on ",React.createElement("span",{className:"el-name"},s)),cls:""};case"ix":return{ts:n,desc:React.createElement("span",null,"Clicked ",React.createElement("span",{className:"el-name"},s),null!=e.dt?React.createElement("span",null," (",(e.dt/1e3).toFixed(1),"s since last)"):""),cls:""};case"dc":return{ts:n,desc:React.createElement("span",null,"Dead click on ",React.createElement("span",{className:"el-name"},s)),cls:"danger"};case"rc":return{ts:n,desc:React.createElement("span",null,"Rage click on ",React.createElement("span",{className:"el-name"},s),e.n?React.createElement("span",null," (",e.n," clicks)"):""),cls:"danger-bold"};case"sd":return{ts:n,desc:React.createElement("span",null,"Scrolled to ",null!=e.p?e.p:"?","%"),cls:""};case"vs":return{ts:n,desc:React.createElement("span",null,"Viewport: [",Array.isArray(e.el)?e.el.join(", "):s,"]"),cls:"muted"};case"vc":return{ts:n,desc:React.createElement("span",null,"Tab ",e.h?"hidden":"visible"),cls:"muted"};case"ul":return{ts:n,desc:React.createElement("span",null,"Left page",null!=e.eg?React.createElement("span",null," (",(e.eg/1e3).toFixed(1),"s engaged)"):""),cls:""};default:return{ts:n,desc:React.createElement("span",null,e.t||e.type||"unknown",": ",JSON.stringify(e)),cls:"muted"}}})(e,z);return React.createElement("div",{key:t,className:`timeline-event ${a.cls}`},React.createElement("span",{className:"ts"},a.ts),React.createElement("span",{className:"desc"},a.desc))}))),p&&React.createElement("div",{style:{color:"var(--danger)",fontSize:13,marginTop:12}},"Error: ",p),d&&React.createElement(SessionAnalysisResult,{result:d}),React.createElement("div",{style:{marginTop:16}},React.createElement("button",{className:"btn-secondary btn-sm",onClick:async()=>{if(E)y(!1);else if(y(!0),!f){N(!0);try{const t=await api.get(`/api/sites/${e}/raw/session/${c}`);b(t)}catch{b([])}N(!1)}},style:{marginRight:8}},E?"Hide Raw JSON":"Show Raw JSON"),E&&f&&React.createElement("button",{className:"btn-secondary btn-sm",onClick:()=>{const e=JSON.stringify(f,null,2);navigator.clipboard.writeText(e).then(()=>{S(!0),setTimeout(()=>S(!1),2e3)})}},x?"โœ“ Copied!":"Copy JSON")),E&&React.createElement("div",{className:"card",style:{marginTop:12,padding:12}},h?React.createElement("div",{className:"loading"},"Loading raw events..."):f&&f.length>0?React.createElement("pre",{style:{fontFamily:"var(--mono)",fontSize:11,lineHeight:1.6,maxHeight:500,overflow:"auto",whiteSpace:"pre-wrap",wordBreak:"break-all",color:"var(--text-muted)",margin:0}},JSON.stringify(f,null,2)):React.createElement("div",{style:{color:"var(--text-muted)",fontSize:12}},"No raw events."))),React.createElement("div",{className:"session-sidebar"},React.createElement("h3",{style:{fontSize:12,textTransform:"uppercase",letterSpacing:"0.5px",color:"var(--text-muted)",marginBottom:12}},"Visitor Sessions"),0===C.length?React.createElement("div",{style:{color:"var(--text-muted)",fontSize:12}},"No other sessions."):C.map(e=>React.createElement("div",{key:e.id,className:"sidebar-session "+(e.id===c?"active":""),onClick:()=>{e.id!==c&&l(e.id)}},React.createElement("div",{title:fullDate(e.started_at),style:{fontWeight:500,marginBottom:2}},relativeTime(e.started_at)),React.createElement("div",{style:{color:"var(--text-muted)"}},e.event_count||0," events ยท ",fmtMs(e.duration_ms),(e.dead_clicks>0||e.rage_clicks>0)&&React.createElement("span",{style:{color:"var(--danger)"}}," ยท ",e.dead_clicks||0,"dc ",e.rage_clicks||0,"rc")))))))}function VisitorDetail({siteId:e,siteName:t,visitorId:a,onNavigate:n}){const[s,c]=useState(null),[l,r]=useState(!0),[i,o]=useState(null),[m,d]=useState(""),[u,p]=useState(!1),[R,g]=useState(!1),[v,E]=useState(null),[y,f]=useState(!1),[b,h]=useState(!1);if(useEffect(()=>{(async()=>{r(!0);const t=await api.get(`/api/sites/${e}/visitors/${a}`);c(t),r(!1)})()},[e,a]),l)return React.createElement("div",{className:"container"},React.createElement("div",{className:"loading"},"Loading visitor..."));if(!s||!s.visitor)return React.createElement("div",{className:"container"},React.createElement("div",{className:"empty"},"Visitor not found."));const N=s.visitor,x=s.sessions||[];return React.createElement("div",{className:"container"},React.createElement("div",{className:"breadcrumb"},React.createElement("button",{onClick:()=>n("home")},"Sites"),React.createElement("span",{className:"sep"},"/"),React.createElement("button",{onClick:()=>n("site",{siteId:e,siteName:t})},t||"Site"),React.createElement("span",{className:"sep"},"/"),React.createElement("span",null,"Visitor")),React.createElement("div",{className:"flex-between mb-8"},React.createElement("div",null),React.createElement("button",{className:"btn-ai btn-sm",disabled:u,onClick:async()=>{p(!0),d(""),o(null);try{const t=await api.post(`/api/sites/${e}/analyze/visitor/${a}`,{});if(t.error)return d(t.error),void p(!1);if("complete"===t.status&&t.result)return o(t.result),void p(!1);const n=t.job_id;if(!n)return d("No job ID returned"),void p(!1);pollAnalysis(e,n,(e,t)=>{p(!1),t?d(t):e&&e.result?o(e.result):d("Analysis returned no result")})}catch{d("Failed to start analysis"),p(!1)}}},u?React.createElement(React.Fragment,null,React.createElement("span",{className:"spinner-inline"}),"Analyzing..."):"Analyze Journey")),React.createElement("div",{className:"stat-cards"},React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"Visitor ID"),React.createElement("div",{className:"value",style:{fontSize:11}},a)),React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"First Seen"),React.createElement("div",{className:"value",style:{fontSize:14},title:fullDate(N.first_seen)},relativeTime(N.first_seen))),React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"Last Seen"),React.createElement("div",{className:"value",style:{fontSize:14},title:fullDate(N.last_seen)},relativeTime(N.last_seen))),React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"Total Sessions"),React.createElement("div",{className:"value"},fmtNumber(N.total_sessions))),React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"Total Events"),React.createElement("div",{className:"value"},fmtNumber(N.total_events)))),React.createElement("div",{className:"section"},React.createElement("h3",null,"Sessions"),0===x.length?React.createElement("div",{className:"empty"},"No sessions recorded."):React.createElement("div",{className:"card table-wrap"},React.createElement("table",null,React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Started"),React.createElement("th",null,"Duration"),React.createElement("th",null,"Events"),React.createElement("th",null,"Dead Clicks"),React.createElement("th",null,"Rage Clicks"),React.createElement("th",null,"Entry Page"))),React.createElement("tbody",null,x.map(s=>React.createElement("tr",{key:s.id,className:"clickable",onClick:()=>n("session",{siteId:e,siteName:t,sessionId:s.id,visitorId:a})},React.createElement("td",{title:fullDate(s.started_at)},relativeTime(s.started_at)),React.createElement("td",{className:"mono"},fmtMs(s.duration_ms)),React.createElement("td",{className:"mono"},s.event_count||0),React.createElement("td",{className:"mono",style:{color:s.dead_clicks>0?"var(--danger)":void 0}},s.dead_clicks||0),React.createElement("td",{className:"mono",style:{color:s.rage_clicks>0?"var(--danger)":void 0}},s.rage_clicks||0),React.createElement("td",{className:"mono",style:{fontSize:11}},s.entry_page||"โ€”"))))))),m&&React.createElement("div",{style:{color:"var(--danger)",fontSize:13,marginTop:12}},"Error: ",m),i&&React.createElement(VisitorAnalysisResult,{result:i}),React.createElement("div",{style:{marginTop:16}},React.createElement("button",{className:"btn-secondary btn-sm",onClick:async()=>{if(R)g(!1);else if(g(!0),!v){f(!0);try{E(await api.get(`/api/sites/${e}/raw/visitor/${a}`))}catch{E([])}f(!1)}},style:{marginRight:8}},R?"Hide Raw JSON":"Show Raw JSON"),R&&v&&React.createElement("button",{className:"btn-secondary btn-sm",onClick:()=>{navigator.clipboard.writeText(JSON.stringify(v,null,2)).then(()=>{h(!0),setTimeout(()=>h(!1),2e3)})}},b?"โœ“ Copied!":"Copy JSON")),R&&React.createElement("div",{className:"card",style:{marginTop:12,padding:12}},y?React.createElement("div",{className:"loading"},"Loading raw events..."):v&&v.length>0?React.createElement("pre",{style:{fontFamily:"var(--mono)",fontSize:11,lineHeight:1.6,maxHeight:500,overflow:"auto",whiteSpace:"pre-wrap",wordBreak:"break-all",color:"var(--text-muted)",margin:0}},JSON.stringify(v,null,2)):React.createElement("div",{style:{color:"var(--text-muted)",fontSize:12}},"No raw events.")))}function IssueDetail({siteId:e,siteName:t,issueId:a,onNavigate:n,showToast:s}){const[c,l]=useState(null),[r,i]=useState(!0),[o,m]=useState(""),[d,u]=useState(!1),p=useCallback(async()=>{i(!0);try{l(await api.get(`/api/sites/${e}/issues/${a}`))}catch(e){l(null)}i(!1)},[e,a]);useEffect(()=>{p()},[p]);const R=async t=>{await api.put(`/api/sites/${e}/issues/${a}`,{status:t,author:"admin"}),p(),s(`Status โ†’ ${t}`)},g=e=>({open:"var(--danger)",fixing:"#f59e0b",in_qa:"var(--accent)",approved:"var(--success)",dismissed:"var(--text-muted)"}[e]||"var(--border)");if(r)return React.createElement("div",{className:"container"},React.createElement("div",{className:"loading"},"Loading case..."));if(!c?.issue)return React.createElement("div",{className:"container"},React.createElement("div",{className:"empty"},"Issue not found."));const v=c.issue,E=c.activity||[],y=c.affected_sessions||[],f=parseInt(v.dead_clicks_7d||0)-parseInt(v.dead_clicks_prev_7d||0);return React.createElement("div",{className:"container"},React.createElement("div",{className:"breadcrumb"},React.createElement("button",{onClick:()=>n("home")},"Sites"),React.createElement("span",{className:"sep"},"/"),React.createElement("button",{onClick:()=>n("site",{siteId:e,siteName:t})},t),React.createElement("span",{className:"sep"},"/"),React.createElement("span",null,"Case #",v.id)),React.createElement("div",{className:"card",style:{padding:24,borderLeft:`4px solid ${g(v.status)}`,marginBottom:20}},React.createElement("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start",marginBottom:16}},React.createElement("div",null,React.createElement("h2",{style:{fontSize:16,fontWeight:700,marginBottom:4,fontFamily:"var(--mono)"}},v.element),React.createElement("span",{style:{fontSize:11,padding:"2px 8px",borderRadius:4,background:g(v.status),color:"#fff",fontWeight:600}},{open:"Open",fixing:"Fixing",in_qa:"In QA",approved:"โœ“ Approved",dismissed:"Dismissed"}[b=v.status]||b),React.createElement("span",{style:{fontSize:11,color:"var(--text-muted)",marginLeft:12}},"Detected ",relativeTime(v.detected_at))),React.createElement("div",{style:{display:"flex",gap:6}},"open"===v.status&&React.createElement(React.Fragment,null,React.createElement("button",{className:"btn-secondary btn-sm",onClick:()=>R("fixing")},"Mark Fixing"),React.createElement("button",{className:"btn-secondary btn-sm",onClick:()=>R("dismissed")},"Dismiss")),"fixing"===v.status&&React.createElement("button",{className:"btn-secondary btn-sm",onClick:()=>R("in_qa")},"Send to QA"),"in_qa"===v.status&&React.createElement("button",{className:"btn-secondary btn-sm",style:{background:"var(--success)",color:"#fff",border:"none"},onClick:()=>R("approved")},"Approve"),("approved"===v.status||"dismissed"===v.status)&&React.createElement("button",{className:"btn-secondary btn-sm",onClick:()=>R("open")},"Reopen"))),React.createElement("p",{style:{fontSize:13,color:"var(--text-muted)",lineHeight:1.7,marginBottom:12}},v.description),v.diagnosis&&React.createElement("div",{style:{background:"var(--bg)",border:"1px solid var(--border)",borderLeft:"3px solid var(--danger)",borderRadius:6,padding:14,marginBottom:12}},React.createElement("div",{style:{fontSize:11,textTransform:"uppercase",letterSpacing:"0.5px",color:"var(--danger)",fontWeight:600,marginBottom:4}},"Why this is a problem"),React.createElement("div",{style:{fontSize:13,lineHeight:1.7}},v.diagnosis)),v.fix_suggestion&&React.createElement("div",{style:{background:"var(--bg)",border:"1px solid var(--border)",borderLeft:"3px solid var(--success)",borderRadius:6,padding:14,marginBottom:16}},React.createElement("div",{style:{fontSize:11,textTransform:"uppercase",letterSpacing:"0.5px",color:"var(--success)",fontWeight:600,marginBottom:4}},"Recommended Fix"),React.createElement("div",{style:{fontSize:13,lineHeight:1.7}},v.fix_suggestion)),React.createElement("div",{className:"stat-cards",style:{marginBottom:0}},React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"At Detection"),React.createElement("div",{className:"value danger"},v.dead_clicks_at_detection)),React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"Last 24h Dead"),React.createElement("div",{className:"value",style:{color:0===parseInt(v.dead_clicks_last_24h)?"var(--success)":"var(--danger)"}},v.dead_clicks_last_24h||0)),React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"Last 24h Real"),React.createElement("div",{className:"value",style:{color:"var(--success)"}},v.real_clicks_last_24h||0)),React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"This Week"),React.createElement("div",{className:"value"},v.dead_clicks_7d||0)),React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"Prior Week"),React.createElement("div",{className:"value"},v.dead_clicks_prev_7d||0)),React.createElement("div",{className:"stat-card"},React.createElement("div",{className:"label"},"Trend"),React.createElement("div",{className:"value",style:{color:f<0?"var(--success)":f>0?"var(--danger)":"var(--text-muted)"}},f>0?"โ†‘":f<0?"โ†“":"โ†’"," ",Math.abs(f))))),React.createElement(IssueImpactCard,{issue:v}),React.createElement("div",{style:{display:"grid",gridTemplateColumns:"1.5fr 1fr",gap:20}},React.createElement("div",null,React.createElement("h3",{style:{fontSize:14,marginBottom:12}},"Activity Timeline"),React.createElement("div",{className:"card",style:{padding:16}},React.createElement("div",{style:{borderLeft:"2px solid var(--border)",paddingLeft:16,display:"flex",flexDirection:"column",gap:12}},React.createElement("div",{style:{position:"relative"}},React.createElement("div",{style:{width:8,height:8,borderRadius:"50%",background:"var(--danger)",position:"absolute",left:-21,top:4}}),React.createElement("div",{style:{fontSize:11,color:"var(--text-muted)"}},fullDate(v.detected_at)),React.createElement("div",{style:{fontSize:13}},"Issue detected โ€” ",React.createElement("strong",null,v.dead_clicks_at_detection)," dead clicks on ",React.createElement("span",{className:"mono",style:{fontSize:11}},v.element))),E.map((e,t)=>React.createElement("div",{key:e.id,style:{position:"relative"}},React.createElement("div",{style:{width:8,height:8,borderRadius:"50%",background:"comment"===e.action?"var(--accent)":"#f59e0b",position:"absolute",left:-21,top:4}}),React.createElement("div",{style:{fontSize:11,color:"var(--text-muted)"}},fullDate(e.created_at)," ยท ",e.author||"system"),React.createElement("div",{style:{fontSize:13}},e.detail))),v.resolved_at&&React.createElement("div",{style:{position:"relative"}},React.createElement("div",{style:{width:8,height:8,borderRadius:"50%",background:"var(--accent)",position:"absolute",left:-21,top:4}}),React.createElement("div",{style:{fontSize:11,color:"var(--text-muted)"}},fullDate(v.resolved_at)),React.createElement("div",{style:{fontSize:13}},"Sent to QA")),v.verified_at&&React.createElement("div",{style:{position:"relative"}},React.createElement("div",{style:{width:8,height:8,borderRadius:"50%",background:"var(--success)",position:"absolute",left:-21,top:4}}),React.createElement("div",{style:{fontSize:11,color:"var(--text-muted)"}},fullDate(v.verified_at)),React.createElement("div",{style:{fontSize:13,color:"var(--success)"}},"Approved โœ“"))),React.createElement("form",{onSubmit:async t=>{t.preventDefault(),o.trim()&&(u(!0),await api.put(`/api/sites/${e}/issues/${a}`,{comment:o.trim(),author:"admin"}),m(""),p(),u(!1))},style:{marginTop:16,display:"flex",gap:8}},React.createElement("input",{type:"text",value:o,onChange:e=>m(e.target.value),placeholder:"Add a note...",style:{flex:1,padding:"8px 12px",fontSize:13}}),React.createElement("button",{type:"submit",className:"btn-primary btn-sm",disabled:d||!o.trim()},"Add Note")))),React.createElement("div",null,React.createElement("h3",{style:{fontSize:14,marginBottom:12}},"User Behavior Logs (",y.length," sessions)"),0===y.length?React.createElement("div",{className:"card",style:{padding:12}},React.createElement("div",{style:{color:"var(--text-muted)",fontSize:13}},"No recent sessions with this issue.")):y.map(a=>{const s={ss:"Started",ix:"Clicked",dc:"Dead click",rc:"Rage click",hi:"Hovered",sd:"Scrolled",vs:"Viewport",vc:"Tab change",ul:"Left page",et:"Engaged"},c={dc:"var(--danger)",rc:"var(--danger)",hi:"var(--success)",ix:"var(--text)",ss:"var(--text-muted)",ul:"var(--text-muted)",sd:"var(--text-muted)",vs:"var(--text-muted)",vc:"var(--text-muted)"};return React.createElement("div",{key:a.session_id,className:"card",style:{padding:14,marginBottom:8}},React.createElement("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:8,cursor:"pointer"},onClick:()=>n("session",{siteId:e,siteName:t,sessionId:a.session_id,visitorId:a.visitor_id})},React.createElement("div",null,React.createElement("span",{className:"mono",style:{fontSize:11,fontWeight:600}},a.visitor_id?.slice(0,10)),React.createElement("span",{style:{color:"var(--text-muted)",fontSize:11,marginLeft:8}},relativeTime(a.started_at)),a.entry_page&&React.createElement("span",{className:"mono",style:{color:"var(--text-muted)",fontSize:11,marginLeft:8}},a.entry_page)),React.createElement("span",{style:{fontSize:11,color:"var(--accent)"}},"View full session โ†’")),React.createElement("div",{style:{background:"var(--bg)",borderRadius:6,padding:10,fontFamily:"var(--mono)",fontSize:11,lineHeight:2}},(a.events||[]).map((e,t)=>{const a="dc"===e.event_type&&e.el===v.element,n=null!=e.session_ts?Math.floor(e.session_ts/1e3):0,l=`${Math.floor(n/60)}:${String(n%60).padStart(2,"0")}`;return React.createElement("div",{key:t,style:{color:c[e.event_type]||"var(--text-muted)",fontWeight:a?700:400,background:a?"rgba(239,68,68,0.1)":"transparent",padding:a?"0 4px":0,borderRadius:3}},React.createElement("span",{style:{color:"var(--text-muted)",fontWeight:400}},l)," ",s[e.event_type]||e.event_type,e.el&&React.createElement(React.Fragment,null," on ",React.createElement("span",{style:{fontWeight:500}},e.el)),e.page&&React.createElement(React.Fragment,null," โ€” ",e.page),e.dt&&parseInt(e.dt)>3e3&&React.createElement("span",{style:{color:"var(--text-muted)"}}," (",(parseInt(e.dt)/1e3).toFixed(1),"s gap)"))})))}))));var b}function CreateAgencyModal({onClose:e,onCreated:t}){const[a,n]=useState({name:"",logo_url:"",primary_color:"#6366f1",secondary_color:"#818cf8",contact_email:""}),[s,c]=useState(""),[l,r]=useState(!1),i=(e,t,s,c="text")=>React.createElement("div",{className:"field"},React.createElement("label",null,e),React.createElement("input",{type:c,value:a[t]||"",onChange:e=>n({...a,[t]:e.target.value}),placeholder:s}));return React.createElement("div",{className:"modal-overlay",onClick:t=>{t.target===t.currentTarget&&e()}},React.createElement("form",{className:"modal",onSubmit:async e=>{if(e.preventDefault(),!a.name)return c("Name is required");r(!0),c("");try{const e=await api.post("/api/agencies",a);if(e.error)return c(e.error),void r(!1);t(e)}catch{c("Failed to create agency"),r(!1)}}},React.createElement("h3",null,"Create Agency"),i("Agency Name","name","Acme Digital"),i("Logo URL","logo_url","https://..."),i("Primary Color","primary_color","#6366f1"),i("Secondary Color","secondary_color","#818cf8"),i("Contact Email","contact_email","hello@agency.com","email"),s&&React.createElement("div",{className:"error",style:{marginBottom:8}},s),React.createElement("div",{className:"actions"},React.createElement("button",{type:"button",className:"btn-secondary",onClick:e},"Cancel"),React.createElement("button",{type:"submit",className:"btn-primary",disabled:l},l?"Creating...":"Create Agency"))))}function AgencyDetail({agencyId:e,onNavigate:t,showToast:a}){const[n,s]=useState(null),[c,l]=useState([]),[r,i]=useState(!0),[o,m]=useState(!1),[d,u]=useState({}),[p,R]=useState(!1);if(useEffect(()=>{(async()=>{i(!0);try{const[t,a]=await Promise.all([api.get(`/api/agencies/${e}`),api.get(`/api/agencies/${e}/reports`).catch(()=>[])]);s(t),u({name:t.name,logo_url:t.logo_url,primary_color:t.primary_color,secondary_color:t.secondary_color,contact_email:t.contact_email}),l(Array.isArray(a)?a:[])}catch{}i(!1)})()},[e]),r)return React.createElement("div",{className:"container"},React.createElement("div",{className:"loading"},"Loading agency..."));if(!n)return React.createElement("div",{className:"container"},React.createElement("div",{className:"empty"},"Agency not found."));const g=(e,t)=>o?React.createElement("input",{type:"text",value:d[t]||"",onChange:e=>u({...d,[t]:e.target.value}),style:{padding:"4px 8px",background:"var(--surface)",border:"1px solid var(--border)",borderRadius:4,color:"var(--text)",fontSize:13,width:"100%"}}):React.createElement("span",{style:{fontSize:13}},n[t]||"โ€”");return React.createElement("div",{className:"container"},React.createElement("div",{className:"breadcrumb"},React.createElement("button",{onClick:()=>t("home")},"Sites"),React.createElement("span",{className:"sep"},"/"),React.createElement("button",{onClick:()=>t("agencies")},"Agencies"),React.createElement("span",{className:"sep"},"/"),React.createElement("span",null,n.name)),React.createElement("div",{className:"card",style:{padding:24,marginBottom:20}},React.createElement("div",{className:"flex-between",style:{marginBottom:16}},React.createElement("div",{style:{display:"flex",alignItems:"center",gap:12}},n.logo_url&&React.createElement("img",{src:n.logo_url,alt:"",style:{height:32,borderRadius:4}}),React.createElement("div",null,o?React.createElement("input",{type:"text",value:d.name,onChange:e=>u({...d,name:e.target.value}),style:{fontSize:18,fontWeight:700,padding:"4px 8px",background:"var(--surface)",border:"1px solid var(--border)",borderRadius:4,color:"var(--text)"}}):React.createElement("h2",{style:{fontSize:18,fontWeight:700}},n.name))),React.createElement("div",{style:{display:"flex",gap:6}},o?React.createElement(React.Fragment,null,React.createElement("button",{className:"btn-secondary btn-sm",onClick:()=>m(!1)},"Cancel"),React.createElement("button",{className:"btn-primary btn-sm",onClick:async()=>{R(!0);try{const t=await api.put(`/api/agencies/${e}`,d);s(t),m(!1),a("Agency updated!")}catch(e){a("Update failed: "+e.message)}R(!1)},disabled:p},p?"Saving...":"Save")):React.createElement("button",{className:"btn-secondary btn-sm",onClick:()=>m(!0)},"Edit"))),React.createElement("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:12,fontSize:13}},React.createElement("div",null,React.createElement("span",{style:{color:"var(--text-muted)",fontSize:11,textTransform:"uppercase",letterSpacing:"0.5px"}},"Primary Color"),React.createElement("br",null),React.createElement("div",{style:{display:"flex",alignItems:"center",gap:6,marginTop:2}},React.createElement("span",{style:{display:"inline-block",width:16,height:16,borderRadius:3,background:o?d.primary_color:n.primary_color,border:"1px solid var(--border)"}}),g(0,"primary_color"))),React.createElement("div",null,React.createElement("span",{style:{color:"var(--text-muted)",fontSize:11,textTransform:"uppercase",letterSpacing:"0.5px"}},"Secondary Color"),React.createElement("br",null),React.createElement("div",{style:{display:"flex",alignItems:"center",gap:6,marginTop:2}},React.createElement("span",{style:{display:"inline-block",width:16,height:16,borderRadius:3,background:o?d.secondary_color:n.secondary_color,border:"1px solid var(--border)"}}),g(0,"secondary_color"))),React.createElement("div",null,React.createElement("span",{style:{color:"var(--text-muted)",fontSize:11,textTransform:"uppercase",letterSpacing:"0.5px"}},"Contact Email"),React.createElement("br",null),React.createElement("div",{style:{marginTop:2}},g(0,"contact_email"))),React.createElement("div",null,React.createElement("span",{style:{color:"var(--text-muted)",fontSize:11,textTransform:"uppercase",letterSpacing:"0.5px"}},"Logo URL"),React.createElement("br",null),React.createElement("div",{style:{marginTop:2}},g(0,"logo_url"))))),React.createElement("div",{className:"section",style:{marginBottom:20}},React.createElement("h3",{style:{marginBottom:12}},"Assigned Sites (",(n.sites||[]).length,")"),0===(n.sites||[]).length?React.createElement("div",{className:"empty",style:{padding:16}},"No sites assigned to this agency."):React.createElement("div",{className:"card-grid"},n.sites.map(e=>React.createElement("div",{key:e.id,className:"card site-card",style:{cursor:"pointer"},onClick:()=>t("site",{siteId:e.id,siteName:e.name})},React.createElement("h3",{style:{display:"flex",alignItems:"center"}},React.createElement(HealthDot,{status:e.health_status}),e.name),React.createElement("div",{className:"domain"},e.domain))))),React.createElement("div",{className:"section"},React.createElement("h3",{style:{marginBottom:12}},"Reports (",c.length,")"),0===c.length?React.createElement("div",{className:"empty",style:{padding:16}},"No reports for this agency yet."):React.createElement("div",{style:{display:"flex",flexDirection:"column",gap:8}},c.map(e=>React.createElement("div",{key:e.id,className:"card",style:{padding:14,display:"flex",justifyContent:"space-between",alignItems:"center"}},React.createElement("div",null,React.createElement("div",{style:{fontSize:13,fontWeight:600}},e.site_name," โ€” ",e.period_start," to ",e.period_end),React.createElement("div",{style:{fontSize:11,color:"var(--text-muted)",marginTop:2}},"Created ",relativeTime(e.created_at))),React.createElement("a",{href:`/reports/${e.id}`,target:"_blank",rel:"noopener noreferrer",className:"btn-secondary btn-sm",style:{textDecoration:"none"}},"Open"))))))}function AgenciesPage({onNavigate:e,showToast:t}){const[a,n]=useState([]),[s,c]=useState(!0),[l,r]=useState(!1),i=useCallback(async()=>{c(!0);try{const e=await api.get("/api/agencies");n(Array.isArray(e)?e:[])}catch{n([])}c(!1)},[]);return useEffect(()=>{i()},[i]),s?React.createElement("div",{className:"container"},React.createElement("div",{className:"loading"},"Loading agencies...")):React.createElement("div",{className:"container"},React.createElement("div",{className:"flex-between mb-16"},React.createElement("h2",null,"Agencies"),React.createElement("button",{className:"btn-primary",onClick:()=>r(!0)},"+ Create Agency")),0===a.length?React.createElement("div",{className:"empty"},"No agencies yet. Create one to organize client sites."):React.createElement("div",{className:"card-grid"},a.map(t=>React.createElement("div",{key:t.id,className:"card site-card",style:{cursor:"pointer"},onClick:()=>e("agency",{agencyId:t.id})},React.createElement("div",{style:{display:"flex",alignItems:"center",gap:10,marginBottom:8}},React.createElement("span",{style:{display:"inline-block",width:24,height:24,borderRadius:4,background:t.primary_color||"var(--accent)",flexShrink:0}}),React.createElement("h3",{style:{margin:0}},t.name)),React.createElement("div",{style:{fontSize:12,color:"var(--text-muted)",marginBottom:4}},t.contact_email||"No email"),React.createElement("div",{style:{fontSize:13,fontWeight:600}},t.site_count||0," site",1!==(t.site_count||0)?"s":"")))),l&&React.createElement(CreateAgencyModal,{onClose:()=>r(!1),onCreated:()=>{r(!1),i()}}))}function IssueImpactCard({issue:e}){const t=e.metric_before,a=e.metric_after;if(!t&&!a)return null;if(t&&a){const e=["dead_clicks","rage_clicks","sessions_with_frustration"],n={dead_clicks:"Dead Clicks",rage_clicks:"Rage Clicks",sessions_with_frustration:"Frustrated Sessions"};return React.createElement("div",{className:"card",style:{padding:16,marginBottom:16,borderLeft:"3px solid var(--accent)"}},React.createElement("div",{style:{fontSize:12,textTransform:"uppercase",letterSpacing:"0.5px",color:"var(--accent)",fontWeight:600,marginBottom:12}},"Impact Measurement"),React.createElement("table",{style:{width:"100%",fontSize:13}},React.createElement("thead",null,React.createElement("tr",{style:{borderBottom:"1px solid var(--border)"}},React.createElement("th",{style:{textAlign:"left",padding:"4px 0",fontWeight:600}},"Metric"),React.createElement("th",{style:{textAlign:"right",padding:"4px 8px",fontWeight:600}},"Before"),React.createElement("th",{style:{textAlign:"right",padding:"4px 8px",fontWeight:600}},"After"),React.createElement("th",{style:{textAlign:"right",padding:"4px 0",fontWeight:600}},"Change"))),React.createElement("tbody",null,e.map(e=>{return React.createElement("tr",{key:e,style:{borderBottom:"1px solid var(--border)"}},React.createElement("td",{style:{padding:"6px 0"}},n[e]),React.createElement("td",{className:"mono",style:{textAlign:"right",padding:"6px 8px"}},null!=t[e]?t[e]:"โ€”"),React.createElement("td",{className:"mono",style:{textAlign:"right",padding:"6px 8px"}},null!=a[e]?a[e]:"โ€”"),React.createElement("td",{style:{textAlign:"right",padding:"6px 0"}},(e=>{if(null==e)return"โ€”";const t=e>0?"+":"",a=e<0?"var(--success)":e>0?"var(--danger)":"var(--text-muted)";return React.createElement("span",{style:{color:a,fontWeight:600}},t,e.toFixed(1),"%")})((s=t[e],c=a[e],s&&0!==s?(c-s)/s*100:null))));var s,c}))))}if(t&&!a){let a="?";if(e.fixed_at){const t=new Date(e.fixed_at),n=new Date(t.getTime()+6048e5),s=Math.ceil((n.getTime()-Date.now())/864e5);a=Math.max(0,s)}return React.createElement("div",{className:"card",style:{padding:16,marginBottom:16,borderLeft:"3px solid #f59e0b"}},React.createElement("div",{style:{fontSize:13}},"Impact measurement in progress โ€” results in ",a," day",1!==a?"s":""),React.createElement("div",{style:{fontSize:11,color:"var(--text-muted)",marginTop:4}},"Baseline captured: ",t.dead_clicks||0," dead clicks, ",t.rage_clicks||0," rage clicks, ",t.sessions_with_frustration||0," frustrated sessions"))}return null}function CustomerEmulateView({siteId:e,siteName:t,pixelKey:a,onNavigate:n}){const[s,c]=useState(null),[l,r]=useState(!0);return useEffect(()=>{(async()=>{try{const t=await api.post(`/api/sites/${e}/emulate`,{});c(`/?token=${t.token}#/app/site/${e}`)}catch{c(null)}r(!1)})()},[e]),React.createElement("div",{style:{height:"100vh",display:"flex",flexDirection:"column"}},React.createElement("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",padding:"8px 16px",background:"var(--accent)",flexShrink:0}},React.createElement("button",{onClick:()=>n("home"),style:{background:"rgba(255,255,255,0.2)",color:"#fff",border:"none",padding:"4px 12px",borderRadius:4,fontSize:12,cursor:"pointer"}},"โ† Back to Admin"),React.createElement("span",{style:{color:"#fff",fontSize:12,fontWeight:600}},"EMULATING: ",t),React.createElement("span",{style:{fontSize:11,color:"rgba(255,255,255,0.7)"}},"This is exactly what the customer sees")),l?React.createElement("div",{style:{flex:1,display:"flex",alignItems:"center",justifyContent:"center"}},React.createElement("span",{className:"spinner"})):s?React.createElement("iframe",{src:s,style:{flex:1,border:"none",width:"100%"}}):React.createElement("div",{style:{flex:1,display:"flex",alignItems:"center",justifyContent:"center",color:"var(--text-muted)"}},"Failed to load customer view"))}function CasesToReview({onNavigate:e}){const[t,a]=useState([]),[n,s]=useState(!0);return useEffect(()=>{api.get("/api/cases-to-review").then(a).catch(()=>a([])).finally(()=>s(!1))},[]),React.createElement("div",{className:"container"},React.createElement("h2",{style:{marginBottom:8}},"โš ๏ธ Cases to Review"),React.createElement("p",{style:{color:"var(--text-muted)",fontSize:13,marginBottom:20}},"Cases flagged by the system that need your attention โ€” fixes that didn't work, dismissed issues that are still active, and AI accuracy checks."),n&&React.createElement("div",{style:{color:"var(--text-muted)"}},"Loading..."),!n&&0===t.length&&React.createElement("div",{style:{padding:40,textAlign:"center",color:"var(--text-muted)",background:"var(--surface)",borderRadius:8}},"No cases flagged for review. System is running clean."),!n&&t.map(t=>{const a=t.metric_before?("string"==typeof t.metric_before?JSON.parse(t.metric_before):t.metric_before).element_dead_clicks:null,n=t.metric_after?("string"==typeof t.metric_after?JSON.parse(t.metric_after):t.metric_after).element_dead_clicks:null;return React.createElement("div",{key:t.id,style:{background:"var(--surface)",border:"1px solid var(--border)",borderLeft:"3px solid #f59e0b",borderRadius:8,padding:16,marginBottom:12,cursor:"pointer"},onClick:()=>e("issue",{siteId:t.site_id,siteName:t.site_name,issueId:t.id})},React.createElement("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:8}},React.createElement("div",null,React.createElement("span",{style:{color:(s=t.status,{open:"var(--red)",fixing:"#f59e0b",in_qa:"var(--accent)",approved:"var(--green)",dismissed:"var(--text-muted)"}[s]||"var(--border)"),fontWeight:600,fontSize:11,textTransform:"uppercase"}},t.status),React.createElement("span",{style:{color:"var(--text-muted)",fontSize:12,marginLeft:8}},t.site_name)),React.createElement("span",{style:{fontSize:11,color:"var(--text-muted)"}},new Date(t.updated_at).toLocaleDateString())),React.createElement("div",{style:{fontSize:13,marginBottom:6,fontFamily:"var(--mono)",color:"var(--text)"}},(t.element||"").slice(0,80)),React.createElement("div",{style:{fontSize:12,color:"var(--text-muted)",marginBottom:8}},(t.description||"").slice(0,150)),t.review_reason&&React.createElement("div",{style:{background:"rgba(245,158,11,0.1)",border:"1px solid rgba(245,158,11,0.3)",borderRadius:6,padding:"8px 12px",fontSize:12,color:"#f59e0b"}},React.createElement("strong",null,"Review reason:")," ",t.review_reason),null!=a&&null!=n&&React.createElement("div",{style:{display:"flex",gap:16,marginTop:8,fontSize:12}},React.createElement("span",null,"Before: ",React.createElement("strong",null,a)," dead clicks"),React.createElement("span",null,"After: ",React.createElement("strong",{style:{color:n0?`${Math.round(100*(1-n/a))}%`:"โ€”")));var s}))}function DiscoveriesView({onNavigate:e}){const[t,a]=useState([]),[n,s]=useState(null),[c,l]=useState("aggregate"),[r,i]=useState(null),[o,m]=useState(!1),[d,u]=useState({page_pattern:"",deviation:""});useEffect(()=>{api.get("/api/sites").then(a).catch(()=>{})},[]);const p=async e=>{m(!0),l("aggregate"),s(e);try{const t=await api.get(`/api/sites/${e}/anomalies`);i(t)}catch(e){i([])}m(!1)},R=e=>t.find(t=>t.id===e)?.name||e;return React.createElement("div",{className:"container"},React.createElement("div",{className:"flex-between",style:{marginBottom:20}},React.createElement("h2",{style:{margin:0}},"๐Ÿ”ฌ Discoveries ",React.createElement("span",{style:{fontSize:12,color:"var(--text-muted)",fontWeight:400}},"ADMIN LABS")),React.createElement("button",{className:"btn-outline btn-sm",onClick:async()=>{m(!0),l("crosssite"),s(null);try{const e=await api.get("/api/anomalies/cross-site");i(e)}catch{i([])}m(!1)}},"Cross-Site View")),React.createElement("div",{style:{display:"flex",gap:8,flexWrap:"wrap",marginBottom:20}},t.map(e=>React.createElement("div",{key:e.id,style:{display:"flex",gap:4}},React.createElement("button",{className:n===e.id&&"aggregate"===c?"btn-accent btn-sm":"btn-outline btn-sm",onClick:()=>p(e.id)},e.name),React.createElement("button",{className:"btn-outline btn-sm",style:{fontSize:10,padding:"2px 6px"},onClick:()=>(async e=>{m(!0),l("baselines"),s(e);try{const t=await api.get(`/api/sites/${e}/baselines`);i(t)}catch{i({error:"No baseline computed yet"})}m(!1)})(e.id),title:"View raw baselines"},"๐Ÿ“Š"),React.createElement("button",{className:"btn-outline btn-sm",style:{fontSize:10,padding:"2px 6px"},onClick:()=>(async e=>{m(!0);try{await api.post(`/api/sites/${e}/baselines/recompute`,{}),alert("Baseline recomputed")}catch(e){alert("Failed: "+e.message)}m(!1)})(e.id),title:"Recompute baseline"},"๐Ÿ”„")))),o&&React.createElement("div",{style:{color:"var(--text-muted)"}},"Loading..."),!o&&"aggregate"===c&&Array.isArray(r)&&React.createElement(React.Fragment,null,React.createElement("div",{className:"flex-between",style:{marginBottom:12}},React.createElement("span",{style:{fontSize:13,color:"var(--text-muted)"}},r.length," patterns found for ",R(n)),React.createElement("button",{className:"btn-outline btn-sm",onClick:()=>{n&&window.open(`/api/sites/${n}/anomalies/csv`,"_blank")}},"Export CSV")),React.createElement("table",{className:"data-table",style:{width:"100%",fontSize:12}},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Page"),React.createElement("th",null,"Deviation"),React.createElement("th",null,"Class"),React.createElement("th",null,"Sessions"),React.createElement("th",null,"Avg Score"),React.createElement("th",null,"First"),React.createElement("th",null,"Last"))),React.createElement("tbody",null,r.map((e,t)=>React.createElement("tr",{key:t,style:{cursor:"pointer"},onClick:()=>(async(e,t)=>{m(!0),l("sessions"),u({page_pattern:e,deviation:t});try{const a=await api.get(`/api/sites/${n}/anomalies/sessions?page_pattern=${encodeURIComponent(e)}&deviation=${encodeURIComponent(t)}`);i(a)}catch{i([])}m(!1)})(e.page_pattern,e.primary_deviation)},React.createElement("td",{className:"mono"},e.page_pattern),React.createElement("td",null,e.primary_deviation),React.createElement("td",null,React.createElement("span",{style:{color:"highly_anomalous"===e.classification?"var(--red)":"anomalous"===e.classification?"#f59e0b":"var(--text-muted)",fontWeight:600,fontSize:11}},e.classification)),React.createElement("td",null,e.session_count),React.createElement("td",null,e.avg_score),React.createElement("td",{style:{fontSize:11,color:"var(--text-muted)"}},e.first_seen?.slice(0,10)),React.createElement("td",{style:{fontSize:11,color:"var(--text-muted)"}},e.last_seen?.slice(0,10))))))),!o&&"sessions"===c&&Array.isArray(r)&&React.createElement(React.Fragment,null,React.createElement("button",{className:"btn-outline btn-sm",onClick:()=>p(n),style:{marginBottom:12}},"โ† Back to aggregate"),React.createElement("p",{style:{fontSize:12,color:"var(--text-muted)",marginBottom:12}},"Sessions: ",d.page_pattern," / ",d.deviation),React.createElement("table",{className:"data-table",style:{width:"100%",fontSize:12}},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Session"),React.createElement("th",null,"Score"),React.createElement("th",null,"Class"),React.createElement("th",null,"Top Deviations"),React.createElement("th",null,"Date"))),React.createElement("tbody",null,r.map((t,a)=>{const s=(t.deviations||[]).slice(0,3).map(e=>e.desc||e.metric).join("; ");return React.createElement("tr",{key:a,style:{cursor:"pointer"},onClick:()=>e("session",{siteId:n,sessionId:t.session_id,siteName:R(n)})},React.createElement("td",{className:"mono"},t.session_id),React.createElement("td",{style:{fontWeight:600,color:t.score>=10?"var(--red)":t.score>=6?"#f59e0b":"var(--text)"}},t.score),React.createElement("td",null,t.classification),React.createElement("td",{style:{maxWidth:400,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",fontSize:11}},s),React.createElement("td",{style:{fontSize:11,color:"var(--text-muted)"}},t.created_at?.slice(0,16)))})))),!o&&"crosssite"===c&&Array.isArray(r)&&React.createElement(React.Fragment,null,React.createElement("h3",{style:{marginBottom:12}},"Cross-Site Anomaly Patterns"),React.createElement("table",{className:"data-table",style:{width:"100%",fontSize:12}},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Site"),React.createElement("th",null,"Page"),React.createElement("th",null,"Deviation"),React.createElement("th",null,"Sessions"),React.createElement("th",null,"Avg Score"))),React.createElement("tbody",null,r.map((e,t)=>React.createElement("tr",{key:t},React.createElement("td",null,e.site_name),React.createElement("td",{className:"mono"},e.page_pattern),React.createElement("td",null,e.primary_deviation),React.createElement("td",null,e.session_count),React.createElement("td",null,e.avg_score)))))),!o&&"baselines"===c&&r&&React.createElement(React.Fragment,null,React.createElement("h3",{style:{marginBottom:12}},"Raw Baselines โ€” ",R(n)),r.error?React.createElement("p",{style:{color:"var(--text-muted)"}},r.error):React.createElement(React.Fragment,null,React.createElement("p",{style:{fontSize:11,color:"var(--text-muted)",marginBottom:12}},"Computed: ",r.computed_at," | Sample: ",r.baseline?.sample_size," sessions"),React.createElement("pre",{style:{background:"var(--bg)",border:"1px solid var(--border)",borderRadius:8,padding:16,fontSize:11,fontFamily:"var(--mono)",overflow:"auto",maxHeight:600,whiteSpace:"pre-wrap"}},JSON.stringify(r.baseline,null,2)))))}function App(){const[e,t]=useState("loading"),[a,n]=useState({name:"home",params:{}}),[s,c]=useState("");useEffect(()=>{(async()=>{try{const e=await api.get("/auth/status");e.exists?e.authenticated?t("authenticated"):t("login"):t("setup")}catch{t("login")}})()},[]);const l=e=>{c(e),setTimeout(()=>c(""),1500)},r=(e,t={})=>n({name:e,params:t});if("loading"===e)return React.createElement("div",{className:"auth-wrapper"},React.createElement("div",{className:"loading"},"Loading..."));if("setup"===e)return React.createElement(SetupScreen,{onDone:()=>t("authenticated")});if("login"===e)return React.createElement(LoginScreen,{onDone:()=>t("authenticated")});let i;switch(a.name){case"site":i=React.createElement(SiteDetail,{siteId:a.params.siteId,siteName:a.params.siteName,onNavigate:r,showToast:l});break;case"session":i=React.createElement(SessionDetail,{siteId:a.params.siteId,siteName:a.params.siteName,sessionId:a.params.sessionId,visitorId:a.params.visitorId,onNavigate:r});break;case"visitor":i=React.createElement(VisitorDetail,{siteId:a.params.siteId,siteName:a.params.siteName,visitorId:a.params.visitorId,onNavigate:r});break;case"issue":i=React.createElement(IssueDetail,{siteId:a.params.siteId,siteName:a.params.siteName,issueId:a.params.issueId,onNavigate:r,showToast:l});break;case"emulate":i=React.createElement(CustomerEmulateView,{siteId:a.params.siteId,siteName:a.params.siteName,pixelKey:a.params.pixelKey,onNavigate:r});break;case"agencies":i=React.createElement(AgenciesPage,{onNavigate:r,showToast:l});break;case"agency":i=React.createElement(AgencyDetail,{agencyId:a.params.agencyId,onNavigate:r,showToast:l});break;case"review":i=React.createElement(CasesToReview,{onNavigate:r});break;case"discoveries":i=React.createElement(DiscoveriesView,{onNavigate:r});break;default:i=React.createElement(SitesOverview,{onNavigate:r,showToast:l})}return React.createElement(React.Fragment,null,React.createElement(Header,{onLogout:()=>{api.setToken(null),t("login")},onNavigate:r,currentView:a.name}),i,React.createElement(Toast,{message:s}))}const root=ReactDOM.createRoot(document.getElementById("root"));root.render(React.createElement(App,null));