PageSourceSearch

https://3dprintgeek.com/assets/LinkAudit-CxMctITy.js

js 3dprintgeek.com collected 2026-10-08 03:22:21 UTC 6,398 bytes, 1 lines download raw bytes

1import{r as j,j as e}from"./index-B0HpYIvB.js";import{S as N}from"./SEOHead-MnNN2hae.js";import{H as k,F as T}from"./Footer-Bttt7o-q.js";import{c as v,d as w}from"./internalLinks-Bsx9_Ofy.js";import{B as h}from"./badge-D5T9HtqF.js";import{T as g,a as u,b as x,c as t,d as f,e as n}from"./table-CGdd-6bz.js";import{C as l,a as i,b as o,d}from"./card-Di-nGQnc.js";import"./Helmet-1d68xLIM.js";import"./affiliates-CjtnAi_D.js";const m={pillar:"Pillar / Money Page",printer:"Printers",problem:"Troubleshooting",comparison:"Comparisons",filament:"Filaments",accessory:"Accessories",deals:"Deals",tool:"Tools"},c=["pillar","printer","problem","comparison","filament","accessory","deals","tool"];function C({status:r}){return r==="pass"?e.jsx(h,{className:"bg-primary text-primary-foreground",children:"Pass"}):r==="warning"?e.jsx(h,{className:"bg-accent text-accent-foreground",children:"Warning"}):e.jsx(h,{variant:"destructive",children:"Fail"})}const H=()=>{const r=j.useMemo(()=>v(),[]),b=j.useMemo(()=>{const s={};for(const a of c)s[a]=new Set,s[a].add("pillar"),s[a].add(a);return s.printer.add("filament").add("problem").add("accessory").add("comparison"),s.problem.add("filament").add("printer").add("accessory"),s.comparison.add("printer").add("filament"),s.filament.add("printer").add("comparison").add("deals").add("accessory"),s.accessory.add("filament").add("printer").add("problem"),s.deals.add("filament").add("printer"),s.tool.add("filament").add("printer").add("problem"),s},[]),y=j.useMemo(()=>w.filter(s=>s.category==="pillar").map(s=>s.path),[]);return e.jsxs(e.Fragment,{children:[e.jsx(N,{title:"Internal Link Audit — Admin",description:"Internal linking coverage dashboard",canonical:"https://3dprintgeek.com/admin/link-audit",noindex:!0}),e.jsx(k,{}),e.jsxs("main",{className:"container max-w-7xl mx-auto px-4 py-8",children:[e.jsx("h1",{className:"text-3xl font-bold text-foreground mb-6",children:"Internal Link Audit Dashboard"}),e.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4 mb-8",children:[e.jsxs(l,{children:[e.jsx(i,{className:"pb-2",children:e.jsx(o,{className:"text-sm text-muted-foreground",children:"Total Pages"})}),e.jsx(d,{children:e.jsx("p",{className:"text-3xl font-bold text-foreground",children:r.totalPosts})})]}),e.jsxs(l,{children:[e.jsx(i,{className:"pb-2",children:e.jsx(o,{className:"text-sm text-muted-foreground",children:"Pillar Pages"})}),e.jsx(d,{children:e.jsx("p",{className:"text-3xl font-bold text-foreground",children:r.byCategory.pillar||0})})]}),e.jsxs(l,{children:[e.jsx(i,{className:"pb-2",children:e.jsx(o,{className:"text-sm text-muted-foreground",children:"Categories"})}),e.jsx(d,{children:e.jsx("p",{className:"text-3xl font-bold text-foreground",children:Object.keys(r.byCategory).length})})]}),e.jsxs(l,{children:[e.jsx(i,{className:"pb-2",children:e.jsx(o,{className:"text-sm text-muted-foreground",children:"Avg / Category"})}),e.jsx(d,{children:e.jsx("p",{className:"text-3xl font-bold text-foreground",children:Math.round(r.totalPosts/Object.keys(r.byCategory).length)})})]})]}),e.jsx("h2",{className:"text-xl font-semibold text-foreground mb-4",children:"Posts by Category"}),e.jsx("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-3 mb-8",children:c.map(s=>e.jsx(l,{children:e.jsxs(d,{className:"pt-4",children:[e.jsx("p",{className:"text-sm text-muted-foreground",children:m[s]}),e.jsx("p",{className:"text-2xl font-bold text-foreground",children:r.byCategory[s]||0})]})},s))}),e.jsx("h2",{className:"text-xl font-semibold text-foreground mb-4",children:"Coverage Table"}),e.jsxs("p",{className:"text-sm text-muted-foreground mb-4",children:['Status is based on registry presence. Posts in the registry are marked "Pass". Use ',e.jsx("code",{children:"AutoInternalLinks"})," component to enforce 3-out linking in each post."]}),e.jsx("div",{className:"border rounded-lg overflow-x-auto mb-8",children:e.jsxs(g,{children:[e.jsx(u,{children:e.jsxs(x,{children:[e.jsx(t,{className:"min-w-[250px]",children:"Title"}),e.jsx(t,{children:"Category"}),e.jsx(t,{children:"Keywords"}),e.jsx(t,{children:"Is Pillar?"}),e.jsx(t,{children:"Status"})]})}),e.jsx(f,{children:r.posts.map(s=>e.jsxs(x,{children:[e.jsx(n,{className:"font-medium",children:e.jsx("a",{href:s.path,className:"text-primary hover:underline",children:s.title})}),e.jsx(n,{children:e.jsx(h,{variant:"outline",children:m[s.category]})}),e.jsx(n,{className:"text-xs text-muted-foreground max-w-[200px] truncate",children:s.keywords.join(", ")}),e.jsx(n,{children:y.includes(s.path)?"✅":"—"}),e.jsx(n,{children:e.jsx(C,{status:"pass"})})]},s.path))})]})}),e.jsx("h2",{className:"text-xl font-semibold text-foreground mb-4",children:"Category Link Matrix"}),e.jsx("p",{className:"text-sm text-muted-foreground mb-4",children:"Shows which categories should link to each other. ✅ = linked, — = not applicable."}),e.jsx("div",{className:"border rounded-lg overflow-x-auto mb-8",children:e.jsxs(g,{children:[e.jsx(u,{children:e.jsxs(x,{children:[e.jsx(t,{className:"min-w-[120px]",children:"From ↓ / To →"}),c.map(s=>e.jsx(t,{className:"text-center text-xs",children:m[s]},s))]})}),e.jsx(f,{children:c.map(s=>e.jsxs(x,{children:[e.jsx(n,{className:"font-medium text-sm",children:m[s]}),c.map(a=>{var p;return e.jsx(n,{className:"text-center",children:(p=b[s])!=null&&p.has(a)?"✅":"—"},a)})]},s))})]})}),e.jsxs(l,{className:"mb-8",children:[e.jsx(i,{children:e.jsx(o,{children:"How to Use This System"})}),e.jsx(d,{className:"prose prose-sm max-w-none text-muted-foreground",children:e.jsxs("ol",{className:"space-y-2",children:[e.jsxs("li",{children:[e.jsx("strong",{children:"Register every new post"})," in ",e.jsx("code",{children:"src/data/internalLinks.ts"}
1)," with correct category and keywords."]}),e.jsxs("li",{children:[e.jsxs("strong",{children:["Add ",e.jsx("code",{children:"<AutoInternalLinks>"})]})," to each blog post at intro, mid, and conclusion placements."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Check this dashboard"})," after publishing to verify coverage."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Rule: 3 out, 2 in"})," — every post links OUT to 3+ pages and is linked FROM 2+ pages."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Every post must link to a pillar page"})," (Best 3D Printer for Beginners or Filament Types Guide)."]})]})})]})]}),e.jsx(T,{})]})};export{H 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.