[...slug].astro (3235B)
1 --- 2 import FuzzField from '../../components/FuzzField.astro'; 3 import { render } from 'astro:content'; 4 import Base from '../../layouts/Base.astro'; 5 import PayloadCredit from '../../components/PayloadCredit.astro'; 6 import { payloadsByTopic, topicOrder, prevNext, payloadHref, type Payload } from '../../lib/payloads'; 7 import { url } from '../../lib/url'; 8 9 export async function getStaticPaths() { 10 const groups = await payloadsByTopic(); 11 const paths: any[] = []; 12 for (const g of groups) { 13 const order = topicOrder(g); 14 for (const entry of order) { 15 const { prev, next } = prevNext(order, entry); 16 const slug = payloadHref(entry).replace(/^payloads\//, ''); 17 paths.push({ params: { slug }, props: { entry, prev, next, topicSlug: g.slug, topicTitle: g.title } }); 18 } 19 } 20 return paths; 21 } 22 23 interface Props { entry: Payload; prev?: Payload; next?: Payload; topicSlug: string; topicTitle: string } 24 const { entry, prev, next, topicTitle } = Astro.props; 25 const d = entry.data; 26 const { Content, headings } = await render(entry); 27 const toc = headings.filter((h) => h.depth === 2 || h.depth === 3); 28 const leaf = entry.id.split('/').pop()!.replace(/^index$/, d.topic); 29 --- 30 <Base title={`${d.title} — Payloads — DÆMON//SEC`} description={`${d.topic} — payloads & techniques, mirrored from PayloadsAllTheThings.`}> 31 <div class="wrap"> 32 <nav class="breadcrumb" style="margin-top:1.5rem;"> 33 <a href={url('')}>~</a><span class="sep">/</span> 34 <a href={url('payloads')} style="color: var(--iris)">payloads</a><span class="sep">/</span> 35 {d.isReadme 36 ? <span class="muted">{d.topicSlug}</span> 37 : <><a href={url(`payloads/${d.topicSlug}`)} style="color: var(--iris)">{d.topicSlug}</a><span class="sep">/</span><span class="muted">{leaf}</span></>} 38 </nav> 39 40 <header class="sheet-head plate signal-hero" data-pagefind-meta="category:Payloads"> 41 <FuzzField /> 42 <span class="grain grain--local" aria-hidden="true"></span> 43 <span class="scanlines" aria-hidden="true"></span> 44 <p class="eyebrow" style="color: var(--iris)">// Payloads · {topicTitle}</p> 45 <h1 class="sheet-title" data-pagefind-meta="title">{d.title}</h1> 46 </header> 47 48 <PayloadCredit topic={d.topic} sourceUrl={d.sourceUrl} sha={d.sha} /> 49 50 <div class="sheet-layout"> 51 <article class="prose" data-pagefind-body> 52 <Content /> 53 </article> 54 55 {toc.length > 1 && ( 56 <aside class="toc plate-dawn corners" aria-label="On this page"> 57 <h4>On this page</h4> 58 <nav> 59 {toc.map((h) => ( 60 <a href={`#${h.slug}`} class={h.depth === 3 ? 'lvl-3' : ''}>{h.text}</a> 61 ))} 62 </nav> 63 </aside> 64 )} 65 </div> 66 67 <nav class="prevnext" aria-label="Pagination"> 68 {prev ? ( 69 <a href={url(payloadHref(prev))} style="--acc: var(--iris)"> 70 <span class="dir">← Prev</span><strong>{prev.data.title}</strong> 71 </a> 72 ) : <span></span>} 73 {next ? ( 74 <a class="nx" href={url(payloadHref(next))} style="--acc: var(--iris)"> 75 <span class="dir">Next →</span><strong>{next.data.title}</strong> 76 </a> 77 ) : <span></span>} 78 </nav> 79 </div> 80 </Base>