PageSourceSearch

https://boombam.app/assets/keyword-research--xSTgAf1.js

js boombam.app collected 2026-10-04 13:34:08 UTC 22,148 bytes, 5 lines download raw bytes

1import{N as Be,a5 as Ge,r as n,a as Je,a6 as G,j as e,aE as _,D as I,T as ee,y as se,p as be,C as c,b as L,d as F,l as Ye,o as V,e as h,ab as w,ap as We,aF as Xe,$ as te,a0 as re,a1 as ie,a2 as ae,a3 as m,bd as ne,B as f,a4 as Se,bM as O,bN as Q,bO as y,bQ as $,bR as a,s as K,bP as R,E as Ze,au as _e,c2 as x,a7 as J}from"./index-CuSEeJFb.js";import{T as es,a as ss,b as q,c as A}from"./tabs-CcPOXtvT.js";import{H as oe}from"./history-CN2Tjn9d.js";import{C as Y}from"./copy-Ctw93tQ7.js";import{A as ts}from"./arrow-up-Uui5xrmv.js";import{A as rs}from"./arrow-down-CLUMqGAm.js";import{A as is}from"./arrow-up-down-BYBJwSGI.js";function l({children:N,field:v,sortConfig:k,onSort:D,className:W=""}){const b=k.field===v;return e.jsx(R,{className:`cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-800 select-none ${W}`,onClick:()=>D(v),"data-testid":`sort-${v}`,children:e.jsxs("div",{className:"flex items-center gap-1",children:[N,b&&k.direction==="asc"&&e.jsx(ts,{className:"w-3 h-3"}),b&&k.direction==="desc"&&e.jsx(rs,{className:"w-3 h-3"}),!b&&e.jsx(is,{className:"w-3 h-3 opacity-40"})]})})}function xs(){const{activeCompanyId:N}=Be(),v=Ge(),[k,D]=n.useState(!1),[W,b]=n.useState("research"),[r,le]=n.useState(null),[X,Ce]=n.useState(""),[de,Ke]=n.useState("United States"),[ce,ke]=n.useState("English"),[he,Te]=n.useState(!0),[xe,Le]=n.useState(!0),[me,Fe]=n.useState(!0),[ue,Ve]=n.useState(10),[E,qe]=n.useState("any"),[d,T]=n.useState({field:"opportunityScore",direction:"desc"}),[u,M]=n.useState({field:"searchVolume",direction:"desc"}),[j,H]=n.useState({field:"searchVolume",direction:"desc"}),[p,P]=n.useState({field:"searchVolume",direction:"desc"}),o=(s,t)=>i=>{s.field===i?s.direction==="desc"?t({field:i,direction:"asc"}):s.direction==="asc"?t({field:i,direction:null}):t({field:i,direction:"desc"}):t({field:i,direction:"desc"})},U=(s,t)=>!t.direction||!t.field?s:[...s].sort((i,S)=>{const g=i[t.field],C=S[t.field];if(typeof g=="number"&&typeof C=="number")return t.direction==="asc"?g-C:C-g;if(t.field==="competition"){const Ne={low:1,medium:2,high:3,unknown:4},fe=Ne[g==null?void 0:g.toLowerCase()]||4,ve=Ne[C==null?void 0:C.toLowerCase()]||4;return t.direction==="asc"?fe-ve:ve-fe}const ge=String(g||"").toLowerCase(),we=String(C||"").toLowerCase();return t.direction==="asc"?ge.localeCompare(we):we.localeCompare(ge)}),Ae=n.useMemo(()=>U((r==null?void 0:r.opportunities)||[],d),[r==null?void 0:r.opportunities,d]),Re=n.useMemo(()=>U((r==null?void 0:r.relatedKeywords)||[],u),[r==null?void 0:r.relatedKeywords,u]),Ie=n.useMemo(()=>U((r==null?void 0:r.questionKeywords)||[],j),[r==null?void 0:r.questionKeywords,j]),Oe=n.useMemo(()=>U((r==null?void 0:r.longTailKeywords)||[],p),[r==null?void 0:r.longTailKeywords,p]),{data:Z,isLoading:Qe}=Je({queryKey:["/api/seo-history/keyword-research",{companyId:N}],enabled:!!N}),je=(Z==null?void 0:Z.data)||[],$e=G({mutationFn:async s=>(await J("/api/seo-history/keyword-research",{method:"POST",body:JSON.stringify(s)})).json(),onSuccess:()=>{v.invalidateQueries({queryKey:["/api/seo-history/keyword-research"]}),x({title:"Research Saved",description:"Your keyword research has been saved to history."})},onError:s=>{x({title:"Save Failed",description:s.message||"Failed to save research to history",variant:"destructive"})}}),pe=G({mutationFn:async({id:s,isStarred:t})=>(await J(`/api/seo-history/keyword-research/${s}`,{method:"PATCH",body:JSON.stringify({isStarred:t})})).json(),onSuccess:()=>{v.invalidateQueries({queryKey:["/api/seo-history/keyword-research"]}),x({title:"Updated",description:"Research has been updated."})},onError:s=>{x({title:"Update Failed",description:s.message||"Failed to update research",variant:"destructive"})}}),ye=G({mutationFn:async s=>(await J(`/api/seo-history/keyword-research/${s}`,{method:"DELETE"})).json(),onSuccess:()=>{v.invalidateQueries({queryKey:["/api/seo-history/keyword-research"]}),x({title:"Deleted",description:"Research has been deleted from history."})},onError:s=>{x({title:"Delete Failed",description:s.message||"Failed to delete research",variant:"destructive"})}}),De=G({mutationFn:async s=>(await J("/api/keyword-research/research",{method:"POST",body:JSON.stringify({...s,companyId:N})})).json(),onSuccess:(s,t)=>{const i=s.data;if(le(i),b("opportunities"),x({title:"Keyword Research Complete",description:`Found ${i.totalKeywords} keywords with ${i.opportunities.length} opportunities.`}),N){const S=t.seedKeywords,g=`${S.slice(0,3).join(", ")}${S.length>3?"...":""}`;$e.mutate({companyId:N,title:g,seedKeywords:S,location:t.location,language:t.language,includeRelated:t.includeRelated,includeQuestions:t.includeQuestions,includeLongTail:t.includeLongTail,minSearchVolume:t.minSearchVolume,maxCompet
1ition:t.maxCompetition,totalKeywords:i.totalKeywords,opportunitiesCount:i.opportunities.length,results:i})}},onError:s=>{x({title:"Research Failed",description:s.message||"Failed to perform keyword research",variant:"destructive"})},onSettled:()=>{D(!1)}}),Ee=async s=>{if(s.preventDefault(),!N){x({title:"Company Required",description:"Please select a company before performing keyword research",variant:"destructive"});return}if(!X.trim()){x({title:"Keywords Required",description:"Please enter at least one seed keyword",variant:"destructive"});return}const t=X.split(`
2`).map(i=>i.trim()).filter(i=>i.length>0);if(t.length===0){x({title:"No Valid Keywords",description:"Please enter valid keywords (one per line)",variant:"destructive"});return}if(t.length>10){x({title:"Too Many Keywords",description:"Maximum 10 seed keywords per research request",variant:"destructive"});return}D(!0),De.mutate({seedKeywords:t,location:de,language:ce,includeRelated:he,includeQuestions:xe,includeLongTail:me,minSearchVolume:ue||void 0,maxCompetition:E&&E!=="any"?E:void 0})},Me=s=>{var t,i;if(s.results){const S={seedKeywords:s.seedKeywords,totalKeywords:s.totalKeywords||0,opportunities:s.results.opportunities||[],relatedKeywords:s.results.relatedKeywords||[],questionKeywords:s.results.questionKeywords||[],longTailKeywords:s.results.longTailKeywords||[],location:s.location,language:s.language,researchedAt:((t=s.researchedAt)==null?void 0:t.toString())||((i=s.createdAt)==null?void 0:i.toString())||new Date().toISOString()};le(S),b("opportunities"),x({title:"Loaded from History",description:`Viewing results for "${s.title}"`})}},He=s=>{pe.mutate({id:s.id,isStarred:!s.isStarred})},Pe=s=>{ye.mutate(s)},z=s=>{switch(s.toLowerCase()){case"low":return"text-green-600 bg-green-100";case"medium":return"text-yellow-600 bg-yellow-100";case"high":return"text-red-600 bg-red-100";default:return"text-gray-600 bg-gray-100"}},Ue=s=>s>=80?"text-green-600 bg-green-100":s>=60?"text-blue-600 bg-blue-100":s>=40?"text-yellow-600 bg-yellow-100":"text-gray-600 bg-gray-100",B=s=>{const t=s.map(i=>i.keyword).join(`
3`);navigator.clipboard.writeText(t),x({title:"Keywords Copied",description:`Copied ${s.length} keywords to clipboard`})},ze=s=>s?new Date(s).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric",hour:"2-digit",minute:"2-digit"}):"N/A";return e.jsx("div",{className:"min-h-screen bg-gray-50 dark:bg-gray-900",children:e.jsxs("div",{className:"container mx-auto px-4 py-8",children:[e.jsxs("div",{className:"mb-8",children:[e.jsx("h1",{className:"text-3xl font-bold text-gray-900 dark:text-white mb-2",children:"🔍 Keyword Research"}),e.jsx("p",{className:"text-gray-600 dark:text-gray-300",children:"Discover profitable keywords using live DataForSEO API data"})]}),e.jsxs(es,{value:W,onValueChange:b,className:"space-y-6",children:[e.jsxs(ss,{className:"grid w-full grid-cols-6",children:[e.jsxs(q,{value:"research","data-testid":"tab-research",children:[e.jsx(_,{className:"w-4 h-4 mr-2"}),"Research"]}),e.jsxs(q,{value:"opportunities","data-testid":"tab-opportunities",children:[e.jsx(I,{className:"w-4 h-4 mr-2"}),"Opportunities"]}),e.jsxs(q,{value:"related","data-testid":"tab-related",children:[e.jsx(ee,{className:"w-4 h-4 mr-2"}),"Related"]}),e.jsxs(q,{value:"questions","data-testid":"tab-questions",children:[e.jsx(se,{className:"w-4 h-4 mr-2"}),"Questions"]}),e.jsxs(q,{value:"longtail","data-testid":"tab-longtail",children:[e.jsx(be,{className:"w-4 h-4 mr-2"}),"Long-tail"]}),e.jsxs(q,{value:"history","data-testid":"tab-history",children:[e.jsx(oe,{className:"w-4 h-4 mr-2"}),"History"]})]}),e.jsx(A,{value:"research",className:"space-y-6",children:e.jsxs(c,{children:[e.jsxs(L,{children:[e.jsxs(F,{className:"flex items-center gap-2",children:[e.jsx(Ye,{className:"w-5 h-5 text-orange-600"}),"Keyword Research Setup"]}),e.jsx(V,{children:"Enter seed keywords to discover related opportunities using live DataForSEO API"})]}),e.jsx(h,{children:e.jsxs("form",{onSubmit:Ee,className:"space-y-6",children:[e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-6",children:[e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx(w,{htmlFor:"keywords",children:"Seed Keywords (one per line)"}),e.jsx(We,{id:"keywords",placeholder:`marketing automation
4email marketing
5crm software`,value:X,onChange:s=>Ce(s.target.value),className:"min-h-[120px]","data-testid":"input-keywords"}),e.jsx("p",{className:"text-sm text-gray-500 mt-1",children:"Maximum 10 seed keywords"})]}),e.jsxs("div",{children:[e.jsx(w,{htmlFor:"minVolume",children:"Minimum Search Volume"}),e.jsx(Xe,{id:"minVolume",type:"number",placeholder:"10",value:ue,onChange:s=>Ve(parseInt(s.target.value)),"data-testid":"input-min-volume"})]})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx(w,{htmlFor:"location",children:"Location"}),e.jsxs(te,{value:de,onValueChange:Ke,children:[e.jsx(re,{"data-testid":"select-location",children:e.jsx(ie,{})}),e.jsxs(ae,{children:[e.jsx(m,{value:"United States",children:"United States"}),e.jsx(m,{value:"Canada",children:"Canada"}),e.jsx(m,{value:"United Kingdom",children:"United Kingdom"}),e.jsx(m,{value:"Australia",children:"Australia"}),e.jsx(m,{value:"Germany",children:"Germany"}),e.jsx(m,{value:"France",children:"France"})]})]})]}),e.jsxs("div",{children:[e.jsx(w,{htmlFor:"language",children:"Language"}),e.jsxs(te,{value:ce,onValueChange:ke,children:[e.jsx(re,{"data-testid":"select-language",children:e.jsx(ie,{})}),e.jsxs(ae,{children:[e.jsx(m,{value:"English",children:"English"}),e.jsx(m,{value:"Spanish",children:"Spanish"}),e.jsx(m,{value:"French",children:"French"}),e.jsx(m,{value:"German",children:"German"})]})]})]}
5),e.jsxs("div",{children:[e.jsx(w,{htmlFor:"maxCompetition",children:"Max Competition"}),e.jsxs(te,{value:E,onValueChange:qe,children:[e.jsx(re,{"data-testid":"select-competition",children:e.jsx(ie,{placeholder:"Any"})}),e.jsxs(ae,{children:[e.jsx(m,{value:"any",children:"Any"}),e.jsx(m,{value:"low",children:"Low"}),e.jsx(m,{value:"medium",children:"Medium"})]})]})]})]})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsx(w,{children:"Research Options"}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-4",children:[e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(ne,{id:"related",checked:he,onCheckedChange:Te,"data-testid":"checkbox-related"}),e.jsx(w,{htmlFor:"related",children:"Include Related Keywords"})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(ne,{id:"questions",checked:xe,onCheckedChange:Le,"data-testid":"checkbox-questions"}),e.jsx(w,{htmlFor:"questions",children:"Include Question Keywords"})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(ne,{id:"longtail",checked:me,onCheckedChange:Fe,"data-testid":"checkbox-longtail"}),e.jsx(w,{htmlFor:"longtail",children:"Include Long-tail Keywords"})]})]})]}),e.jsx(f,{type:"submit",disabled:k,className:"w-full bg-orange-600 hover:bg-orange-700","data-testid":"button-research",children:k?e.jsxs(e.Fragment,{children:[e.jsx(Se,{className:"w-4 h-4 mr-2 animate-spin"}),"Researching Keywords..."]}):e.jsxs(e.Fragment,{children:[e.jsx(_,{className:"w-4 h-4 mr-2"}),"Research Keywords"]})})]})})]})}),e.jsx(A,{value:"opportunities",className:"space-y-6",children:r?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-4 gap-4",children:[e.jsx(c,{children:e.jsx(h,{className:"p-4",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(_,{className:"w-5 h-5 text-orange-600"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-gray-600",children:"Total Keywords"}),e.jsx("p",{className:"text-2xl font-bold",children:r.totalKeywords})]})]})})}),e.jsx(c,{children:e.jsx(h,{className:"p-4",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(I,{className:"w-5 h-5 text-yellow-600"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-gray-600",children:"Opportunities"}),e.jsx("p",{className:"text-2xl font-bold text-yellow-600",children:r.opportunities.length})]})]})})}),e.jsx(c,{children:e.jsx(h,{className:"p-4",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(ee,{className:"w-5 h-5 text-blue-600"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-gray-600",children:"Related"}),e.jsx("p",{className:"text-2xl font-bold text-blue-600",children:r.relatedKeywords.length})]})]})})}),e.jsx(c,{children:e.jsx(h,{className:"p-4",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(se,{className:"w-5 h-5 text-green-600"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-gray-600",children:"Questions"}),e.jsx("p",{className:"text-2xl font-bold text-green-600",children:r.questionKeywords.length})]})]})})})]}),e.jsxs(c,{children:[e.jsx(L,{children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx(F,{children:"Top Keyword Opportunities"}),e.jsx(V,{children:"High-value keywords with the best potential ROI"})]}),e.jsxs(f,{variant:"outline",size:"sm",onClick:()=>B(r.opportunities),children:[e.jsx(Y,{className:"w-4 h-4 mr-2"}),"Copy Keywords"]})]})}),e.jsx(h,{children:e.jsxs(O,{children:[e.jsx(Q,{children:e.jsxs(y,{children:[e.jsx(l,{field:"keyword",sortConfig:d,onSort:o(d,T),children:"Keyword"}),e.jsx(l,{field:"opportunityScore",sortConfig:d,onSort:o(d,T),children:"Opportunity Score"}),e.jsx(l,{field:"searchVolume",sortConfig:d,onSort:o(d,T),children:"Search Volume"}),e.jsx(l,{field:"competition",sortConfig:d,onSort:o(d,T),children:"Competition"}),e.jsx(l,{field:"cpc",sortConfig:d,onSort:o(d,T),children:"CPC"}),e.jsx(l,{field:"reason",sortConfig:d,onSort:o(d,T),children:"Reason"})]})}),e.jsx($,{children:Ae.map((s,t)=>e.jsxs(y,{children:[e.jsx(a,{className:"font-medium",children:s.keyword}),e.jsx(a,{children:e.jsxs(K,{className:Ue(s.opportunityScore),children:[s.opportunityScore,"/100"]})}
5),e.jsx(a,{children:s.searchVolume.toLocaleString()}),e.jsx(a,{children:e.jsx(K,{className:z(s.competition),children:s.competition})}),e.jsxs(a,{children:["$",s.cpc.toFixed(2)]}),e.jsx(a,{className:"text-sm",children:s.reason})]},t))})]})})]})]}):e.jsx(c,{children:e.jsxs(h,{className:"p-8 text-center",children:[e.jsx(I,{className:"w-12 h-12 text-gray-400 mx-auto mb-4"}),e.jsx("h3",{className:"text-lg font-semibold text-gray-600 mb-2",children:"No Research Data"}),e.jsx("p",{className:"text-gray-500",children:"Start a keyword research to discover opportunities."})]})})}),e.jsx(A,{value:"related",className:"space-y-6",children:r!=null&&r.relatedKeywords?e.jsxs(c,{children:[e.jsx(L,{children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx(F,{children:"Related Keywords"}),e.jsx(V,{children:"Keywords semantically related to your seed keywords"})]}),e.jsxs(f,{variant:"outline",size:"sm",onClick:()=>B(r.relatedKeywords),children:[e.jsx(Y,{className:"w-4 h-4 mr-2"}),"Copy Keywords"]})]})}),e.jsx(h,{children:e.jsxs(O,{children:[e.jsx(Q,{children:e.jsxs(y,{children:[e.jsx(l,{field:"keyword",sortConfig:u,onSort:o(u,M),children:"Keyword"}),e.jsx(l,{field:"searchVolume",sortConfig:u,onSort:o(u,M),children:"Search Volume"}),e.jsx(l,{field:"competition",sortConfig:u,onSort:o(u,M),children:"Competition"}),e.jsx(l,{field:"cpc",sortConfig:u,onSort:o(u,M),children:"CPC"})]})}),e.jsx($,{children:Re.map((s,t)=>e.jsxs(y,{children:[e.jsx(a,{className:"font-medium",children:s.keyword}),e.jsx(a,{children:s.searchVolume.toLocaleString()}),e.jsx(a,{children:e.jsx(K,{className:z(s.competition),children:s.competition})}),e.jsxs(a,{children:["$",s.cpc.toFixed(2)]})]},t))})]})})]}):e.jsx(c,{children:e.jsxs(h,{className:"p-8 text-center",children:[e.jsx(ee,{className:"w-12 h-12 text-gray-400 mx-auto mb-4"}),e.jsx("h3",{className:"text-lg font-semibold text-gray-600 mb-2",children:"No Related Keywords"}),e.jsx("p",{className:"text-gray-500",children:'Run keyword research with "Include Related Keywords" enabled.'})]})})}),e.jsx(A,{value:"questions",className:"space-y-6",children:r!=null&&r.questionKeywords?e.jsxs(c,{children:[e.jsx(L,{children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx(F,{children:"Question Keywords"}),e.jsx(V,{children:"Question-based keywords for content marketing"})]}),e.jsxs(f,{variant:"outline",size:"sm",onClick:()=>B(r.questionKeywords),children:[e.jsx(Y,{className:"w-4 h-4 mr-2"}),"Copy Keywords"]})]})}),e.jsx(h,{children:e.jsxs(O,{children:[e.jsx(Q,{children:e.jsxs(y,{children:[e.jsx(l,{field:"keyword",sortConfig:j,onSort:o(j,H),children:"Question Keyword"}),e.jsx(l,{field:"searchVolume",sortConfig:j,onSort:o(j,H),children:"Search Volume"}),e.jsx(l,{field:"competition",sortConfig:j,onSort:o(j,H),children:"Competition"}),e.jsx(l,{field:"cpc",sortConfig:j,onSort:o(j,H),children:"CPC"})]})}),e.jsx($,{children:Ie.map((s,t)=>e.jsxs(y,{children:[e.jsx(a,{className:"font-medium",children:s.keyword}),e.jsx(a,{children:s.searchVolume.toLocaleString()}),e.jsx(a,{children:e.jsx(K,{className:z(s.competition),children:s.competition})}),e.jsxs(a,{children:["$",s.cpc.toFixed(2)]})]},t))})]})})]}):e.jsx(c,{children:e.jsxs(h,{className:"p-8 text-center",children:[e.jsx(se,{className:"w-12 h-12 text-gray-400 mx-auto mb-4"}),e.jsx("h3",{className:"text-lg font-semibold text-gray-600 mb-2",children:"No Question Keywords"}),e.jsx("p",{className:"text-gray-500",children:'Run keyword research with "Include Question Keywords" enabled.'})]})})}),e.jsx(A,{value:"longtail",className:"space-y-6",children:r!=null&&r.longTailKeywords?e.jsxs(c,{children:[e.jsx(L,{children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx(F,{children:"Long-tail Keywords"}),e.jsx(V,{children:"Longer, more specific keywords with lower competition"})]}),e.jsxs(f,{variant:"outline",size:"sm",onClick:()=>B(r.longTailKeywords),children:[e.jsx(Y,{className:"w-4 h-4 mr-2"}),"Copy Keywords"]})]})}),e.jsx(h,{children:e.jsxs(O,{children:[e.jsx(Q,{children:e.jsxs(y,{children:[e.jsx(l,{field:"
5keyword",sortConfig:p,onSort:o(p,P),children:"Long-tail Keyword"}),e.jsx(l,{field:"searchVolume",sortConfig:p,onSort:o(p,P),children:"Search Volume"}),e.jsx(l,{field:"competition",sortConfig:p,onSort:o(p,P),children:"Competition"}),e.jsx(l,{field:"cpc",sortConfig:p,onSort:o(p,P),children:"CPC"})]})}),e.jsx($,{children:Oe.map((s,t)=>e.jsxs(y,{children:[e.jsx(a,{className:"font-medium",children:s.keyword}),e.jsx(a,{children:s.searchVolume.toLocaleString()}),e.jsx(a,{children:e.jsx(K,{className:z(s.competition),children:s.competition})}),e.jsxs(a,{children:["$",s.cpc.toFixed(2)]})]},t))})]})})]}):e.jsx(c,{children:e.jsxs(h,{className:"p-8 text-center",children:[e.jsx(be,{className:"w-12 h-12 text-gray-400 mx-auto mb-4"}),e.jsx("h3",{className:"text-lg font-semibold text-gray-600 mb-2",children:"No Long-tail Keywords"}),e.jsx("p",{className:"text-gray-500",children:'Run keyword research with "Include Long-tail Keywords" enabled.'})]})})}),e.jsx(A,{value:"history",className:"space-y-6",children:e.jsxs(c,{children:[e.jsxs(L,{children:[e.jsxs(F,{className:"flex items-center gap-2",children:[e.jsx(oe,{className:"w-5 h-5 text-orange-600"}),"Research History"]}),e.jsx(V,{children:"View and manage your past keyword research sessions"})]}),e.jsx(h,{children:Qe?e.jsx("div",{className:"flex items-center justify-center py-8",children:e.jsx(Se,{className:"w-8 h-8 animate-spin text-orange-600"})}):je.length===0?e.jsxs("div",{className:"text-center py-8",children:[e.jsx(oe,{className:"w-12 h-12 text-gray-400 mx-auto mb-4"}),e.jsx("h3",{className:"text-lg font-semibold text-gray-600 mb-2",children:"No History Yet"}),e.jsx("p",{className:"text-gray-500",children:"Complete a keyword research to see it here."})]}):e.jsxs(O,{children:[e.jsx(Q,{children:e.jsxs(y,{children:[e.jsx(R,{children:"Title"}),e.jsx(R,{children:"Keywords"}),e.jsx(R,{children:"Total Keywords"}),e.jsx(R,{children:"Date"}),e.jsx(R,{children:"Actions"})]})}),e.jsx($,{children:je.map(s=>e.jsxs(y,{"data-testid":`history-row-${s.id}`,children:[e.jsx(a,{className:"font-medium",children:e.jsxs("div",{className:"flex items-center gap-2",children:[s.isStarred&&e.jsx(I,{className:"w-4 h-4 text-yellow-500 fill-yellow-500"}),s.title]})}),e.jsx(a,{children:e.jsxs("div",{className:"flex flex-wrap gap-1",children:[s.seedKeywords.slice(0,3).map((t,i)=>e.jsx(K,{variant:"secondary",className:"text-xs",children:t},i)),s.seedKeywords.length>3&&e.jsxs(K,{variant:"outline",className:"text-xs",children:["+",s.seedKeywords.length-3," more"]})]})}),e.jsx(a,{children:s.totalKeywords||0}),e.jsx(a,{children:ze(s.createdAt)}),e.jsx(a,{children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(f,{variant:"outline",size:"sm",onClick:()=>Me(s),"data-testid":`button-view-${s.id}`,children:e.jsx(Ze,{className:"w-4 h-4"})}),e.jsx(f,{variant:"outline",size:"sm",onClick:()=>He(s),disabled:pe.isPending,"data-testid":`button-star-${s.id}`,children:e.jsx(I,{className:`w-4 h-4 ${s.isStarred?"text-yellow-500 fill-yellow-500":""}`})}),e.jsx(f,{variant:"outline",size:"sm",onClick:()=>Pe(s.id),disabled:ye.isPending,className:"text-red-600 hover:text-red-700 hover:bg-red-50","data-testid":`button-delete-${s.id}`,children:e.jsx(_e,{className:"w-4 h-4"})})]})})]},s.id))})]})})]})})]})]})})}export{xs as default};

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