PageSourceSearch

https://roots-officiel.com/assets/SeoDemandMatrix-CIS6PT8t.js

js roots-officiel.com collected 2026-10-09 05:10:17 UTC 8,598 bytes, 1 lines download raw bytes

1import{r as o,s as u,j as s,q as K,a9 as A,ap as k,dP as L,hi as V}from"./index-BTrKqWIn.js";import{B as O}from"./badge-BICT-3y_.js";import{M as j}from"./MetricOptimizeButton-BkOdfY4D.js";import"./AdminPage-B9agA_Uv.js";import"./use-mobile-YeBZeD60.js";import"./Layout-DWnUI2Xw.js";import"./TabBar-CeFlKNWM.js";import"./PageTransition-CCfQQFKo.js";import"./separator-EaSJ3wR4.js";import"./skeleton-C4ETrcps.js";import"./collapsible-CwWBKP0h.js";import"./index-B_plQHJ4.js";import"./tabs-Dl7mwtDU.js";import"./card-vCGE_HIz.js";import"./checkbox-Dp7PAa3g.js";import"./index-CXDJVP3B.js";import"./logbook-agents-CopWL80M.js";import"./alert-dialog-D9Qc8TP5.js";const R=i=>i.normalize("NFD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^a-z0-9]+/g," ").trim(),G=new Set(["le","la","les","de","des","du","un","une","en","et","a","au","aux","pour","que","qui","ce","est","il","elle","on","the","of"]),N=i=>i<=1?.28:i<=3?.15:i<=5?.08:i<=10?.04:.015,C=i=>{const c=i.match(/\/article\/([^/?#]+)/);return c?decodeURIComponent(c[1]):""},me=()=>{const[i,c]=o.useState(!0),[m,F]=o.useState([]),[g,P]=o.useState([]),[b,M]=o.useState("");o.useEffect(()=>{(async()=>{var e,r;c(!0);try{const[{data:a},{data:l}]=await Promise.all([u.from("seo_keyword_snapshots").select("captured_at").order("captured_at",{ascending:!1}).limit(1),u.from("seo_top_pages").select("captured_at").order("captured_at",{ascending:!1}).limit(1)]),f=(e=a==null?void 0:a[0])!=null&&e.captured_at?new Date(new Date(a[0].captured_at).getTime()-36e5).toISOString():new Date(0).toISOString(),E=(r=l==null?void 0:l[0])!=null&&r.captured_at?new Date(new Date(l[0].captured_at).getTime()-36e5).toISOString():new Date(0).toISOString(),[{data:p},{data:$}]=await Promise.all([u.from("seo_keyword_snapshots").select("keyword, clicks, impressions, ctr, position, period_start, period_end").gte("captured_at",f).order("impressions",{ascending:!1}).limit(300),u.from("seo_top_pages").select("url, clicks, impressions, ctr, position").gte("captured_at",E).order("impressions",{ascending:!1}).limit(200)]),d=p==null?void 0:p[0];d!=null&&d.period_start&&M(`${d.period_start} → ${d.period_end}`);const S=Array.from(new Set(($??[]).map(t=>C(t.url)).filter(Boolean))),{data:T}=S.length?await u.from("articles").select("slug, title").in("slug",S):{data:[]},q=new Map((T??[]).map(t=>[t.slug,t.title])),_=($??[]).map(t=>{const n=C(t.url);return{url:t.url,slug:n,title:q.get(n)??n??t.url,clicks:Number(t.clicks),impressions:Number(t.impressions),ctr:Number(t.ctr),position:Number(t.position)}}),D=_.map(t=>R(`${t.title} ${t.slug}`)),z=(p??[]).map(t=>{const n=R(t.keyword).split(" ").filter(x=>x.length>2&&!G.has(x)),B=Number(t.position)<=10||n.length>0&&D.some(x=>n.filter(I=>x.includes(I)).length/n.length>=.5);return{keyword:t.keyword,clicks:Number(t.clicks),impressions:Number(t.impressions),ctr:Number(t.ctr),position:Number(t.position),covered:B}});F(_),P(z)}finally{c(!1)}})()},[]);const w=o.useMemo(()=>m.filter(e=>e.position<=5&&e.clicks>0).sort((e,r)=>r.clicks-e.clicks).slice(0,12),[m]),y=o.useMemo(()=>m.filter(e=>e.impressions>=30&&(e.position>3||e.ctr<N(e.position)*.6)).map(e=>({...e,gain:Math.round(e.impressions*Math.max(0,N(3)-e.ctr))})).sort((e,r)=>r.gain-e.gain).slice(0,15),[m]),v=o.useMemo(()=>g.filter(e=>!e.covered&&e.impressions>=15).map(e=>({...e,gain:Math.round(e.impressions*N(3))})).sort((e,r)=>r.gain-e.gain).slice(0,15),[g]);if(i)return s.jsx("div",{className:"py-12 flex justify-center",children:s.jsx(K,{className:"h-5 w-5 animate-spin text-muted-foreground"})});if(!m.length&&!g.length)return s.jsx("div",{className:"rounded-xl border border-border p-6 text-sm text-muted-foreground",children:"Aucune donnée Search Console encore synchronisée. Lance la synchronisation dans Recherche & SEO."});const h=({icon:e,tone:r,title:a,subtitle:l,children:f})=>s.jsxs("div",{className:"rounded-2xl border border-border bg-card/40 overflow-hidden",children:[s.jsxs("div",{className:"px-4 py-3 border-b border-border flex items-center gap-2",children:[s.jsx(e,{className:`h-4 w-4 ${r}`}),s.jsxs("div",{className:"min-w-0",children:[s.jsx("h4",{className:"text-sm font-semibold",children:a}),s.jsx("p",{className:"text-[11px] text-muted-foreground",children:l})]})]}),s.jsx("div",{className:"divide-y divide-border/60",children:f})]});return s.jsxs("div",{className:"space-y-4",children:[s.jsxs("p",{className:"text-xs text-muted-foreground",children:["Volumes de recherche réels ",b&&s.jsxs(s.Fragment,{children:["· période ",b]})," — Search Console."]}),s.jsxs(h,{icon:A,tone:"text-green-600",title:"Ça marche — à défendre et monétiser",subtitle:"Pages en top 5 qui ramènent des clics : y placer dons, newsletter, maillage.",children:[w.map(e=>s.jsxs("div",{className:"px-4 py-2.5 flex items-center gap-3 text-sm",children:[s.jsxs("div",{className:"min-w-0 flex-1",children:[s.jsxs("a",{href:e.url,target:"_blank",rel:"noreferrer",className:"font-medium hover:underline inline-flex items-center gap-1",children:[s.jsx("span",{className:"truncate",children:e.title}),s.jsx(k,{className:"h-3 w-3 shrink-0 opacity-50"})]}),s.jsxs("p",{className:"text-[11px] text-muted-foreground tabular-nums",children:[e.clicks," 
1clics · ",e.impressions," impressions · pos. ",e.position.toFixed(1)]})]}),s.jsx(j,{scope:"seo",metricKey:`page:${e.slug}`,label:`Monétiser « ${e.title} »`,value:`${e.clicks} clics`,context:`Page ${e.url} — ${e.clicks} clics, ${e.impressions} impressions, position ${e.position.toFixed(1)}, CTR ${(e.ctr*100).toFixed(1)}%. Elle fonctionne déjà : propose comment en tirer plus d'abonnés newsletter, de dons et de maillage vers le fonds.`})]},e.url)),!w.length&&s.jsx("p",{className:"px-4 py-3 text-xs text-muted-foreground",children:"Aucune page en top 5 pour l'instant."})]}),s.jsxs(h,{icon:L,tone:"text-amber-500",title:"À optimiser — la demande est là, la place non",subtitle:"Fortes impressions mais position ou CTR insuffisants : réécrire titre, chapô, structure.",children:[y.map(e=>s.jsxs("div",{className:"px-4 py-2.5 flex items-center gap-3 text-sm",children:[s.jsxs("div",{className:"min-w-0 flex-1",children:[s.jsxs("a",{href:e.url,target:"_blank",rel:"noreferrer",className:"font-medium hover:underline inline-flex items-center gap-1",children:[s.jsx("span",{className:"truncate",children:e.title}),s.jsx(k,{className:"h-3 w-3 shrink-0 opacity-50"})]}),s.jsxs("p",{className:"text-[11px] text-muted-foreground tabular-nums",children:[e.impressions," impressions · pos. ",e.position.toFixed(1)," · CTR ",(e.ctr*100).toFixed(1),"%"]})]}),s.jsxs(O,{variant:"outline",className:"text-[10px] shrink-0 bg-amber-500/10 text-amber-600 border-amber-500/30",children:["+",e.gain," clics/mois"]}),s.jsx(j,{scope:"seo",metricKey:`optimize:${e.slug}`,label:`Optimiser « ${e.title} »`,value:`pos. ${e.position.toFixed(1)}`,context:`Page ${e.url} — ${e.impressions} impressions, ${e.clicks} clics, position moyenne ${e.position.toFixed(1)}, CTR ${(e.ctr*100).toFixed(1)}%. Potentiel estimé +${e.gain} clics/mois si elle passe en top 3. Donne les actions concrètes : titre SEO, H1 façon Vice, chapô, intertitres, fiche Q/R GEO, maillage interne.`})]},e.url)),!y.length&&s.jsx("p",{className:"px-4 py-3 text-xs text-muted-foreground",children:"Rien à retravailler sur cette période."})]}),s.jsxs(h,{icon:V,tone:"text-primary",title:"À créer — demande non couverte",subtitle:"Requêtes qui rapportent des impressions sans page dédiée : sujets à écrire.",children:[v.map(e=>s.jsxs("div",{className:"px-4 py-2.5 flex items-center gap-3 text-sm",children:[s.jsxs("div",{className:"min-w-0 flex-1",children:[s.jsx("p",{className:"font-medium truncate",children:e.keyword}),s.jsxs("p",{className:"text-[11px] text-muted-foreground tabular-nums",children:[e.impressions," impressions · ",e.clicks," clics · pos. ",e.position.toFixed(1)]})]}),s.jsxs(O,{variant:"outline",className:"text-[10px] shrink-0",children:["+",e.gain," clics/mois"]}),s.jsx(j,{scope:"seo",metricKey:`create:${e.keyword}`,label:`Créer une page pour « ${e.keyword} »`,value:`${e.impressions} impressions`,context:`Requête « ${e.keyword} » : ${e.impressions} impressions, ${e.clicks} clics, position ${e.position.toFixed(1)}, aucune page ROOTS dédiée. Propose l'angle, le format (article pilier, lexique ou fiche Q/R GEO), un titre SEO factuel et un H1 façon Vice, plus le maillage vers le fonds.`})]},e.keyword)),!v.length&&s.jsx("p",{className:"px-4 py-3 text-xs text-muted-foreground",children:"Toutes les requêtes mesurées sont couvertes."})]})]})};export{me as SeoDemandMatrix,me 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.