1import{j as e,L as t,d as r,r as a,w as o}from"./chunk-EPOLDU6W-DV8-P3iu.js";import{N as n,F as s}from"./navbar-DdJDZVAr.js";import{S as i}from"./search-CHJVgyPN.js";import{X as l}from"./x-CpWWvQNu.js";import{c}from"./utils-Gh3qGYQG.js";import{C as m}from"./chevron-left-Cc9E2IWa.js";import{C as d}from"./chevron-right-gsfGtVd4.js";import{b as p}from"./og-image-h-bVPpX3.js";import"./createReactComponent-C2YNP2eJ.js";import"./IconBrandGithub-DpImgg2k.js";import"./button-CfJZk55I.js";import"./index-C5OgJT-g.js";import"./theme-toggle-SWUJkwDG.js";import"./index-8ZeopN34.js";import"./createLucideIcon-7Bbfrkb-.js";import"./index-Ddk6MS7s.js";import"./chunk-OT5FTIRN-CfJDWyjw.js";import"./index-QQafb9ve.js";function u({post:r}){return e.jsxs(t,{to:`/blog/${r.slug}`,prefetch:"intent",className:"terminal-card rounded-lg overflow-hidden group hover:border-primary/30 transition-all duration-300 hover:glow-primary-card hover:-translate-y-1 flex flex-col",children:[r.coverImage&&e.jsx("div",{className:"aspect-[1200/630] overflow-hidden",children:e.jsx("img",{src:r.coverImage,alt:r.title,className:"w-full h-full object-cover transition-transform duration-300 group-hover:scale-105",loading:"lazy"})}),e.jsxs("div",{className:"p-5 flex flex-col flex-1",children:[e.jsxs("div",{className:"flex items-center gap-3 text-xs text-muted-foreground font-mono mb-3",children:[e.jsx("time",{dateTime:r.date,children:new Date(r.date).toLocaleDateString("en-US",{year:"numeric",month:"short",day:"numeric"})}),e.jsx("span",{className:"text-border",children:"|"}),e.jsx("span",{children:r.author})]}),e.jsx("h3",{className:"text-lg font-semibold text-foreground line-clamp-2 mb-2 group-hover:text-primary transition-colors",children:r.title}),e.jsx("p",{className:"text-sm text-muted-foreground line-clamp-3 mb-4 flex-1",children:r.excerpt}),r.tags.length>0&&e.jsx("div",{className:"flex flex-wrap gap-2",children:r.tags.slice(0,3).map(t=>e.jsx("span",{className:"text-xs font-mono px-2 py-0.5 rounded-full bg-primary/10 text-primary border border-primary/20",children:t},t))})]})]})}function g({query:t,activeTag:o}){const n=r(),[s,c]=a.useState(t??"");function m(e){const t=new URLSearchParams;o&&t.set("tag",o),e.trim()&&t.set("q",e.trim());const r=t.toString();n("/blog"+(r?`?${r}`:""))}return e.jsxs("form",{onSubmit:function(e){e.preventDefault(),m(s)},className:"relative max-w-md mx-auto",children:[e.jsx(i,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground pointer-events-none"}),e.jsx("input",{type:"text",value:s,onChange:e=>c(e.target.value),placeholder:"Search posts...",className:"w-full pl-10 pr-10 py-2 rounded-lg border border-border bg-background font-mono text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:border-primary/50 focus:ring-1 focus:ring-primary/30 transition-all duration-200"}),s&&e.jsx("button",{type:"button",onClick:function(){c(""),m("")},className:"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-primary transition-colors","aria-label":"Clear search",children:e.jsx(l,{className:"w-4 h-4"})})]})}function x(e,t){const r=new URLSearchParams;e&&r.set("tag",e),t&&r.set("q",t);const a=r.toString();return"/blog"+(a?`?${a}`:"")}function h({tags:r,activeTag:a,search:o}){return e.jsxs("div",{className:"flex flex-wrap justify-center gap-2",children:[e.jsx(t,{to:x(void 0,o),prefetch:"intent",className:c("text-sm font-mono px-4 py-1.5 rounded-full border transition-all duration-200",a?"bg-transparent text-muted-foreground border-border hover:text-primary hover:border-primary/50":"bg-primary text-primary-foreground border-primary glow-primary-sm"),children:"All"}),r.map(r=>e.jsx(t,{to:x(r,o),prefetch:"intent",className:c("text-sm font-mono px-4 py-1.5 rounded-full border transition-all duration-200",a===r?"bg-primary text-primary-foreground border-primary glow-primary-sm":"bg-transparent text-muted-foreground border-border hover:text-primary hover:border-primary/50"),children:r},r))]})}function f(e,t,r){const a=new URLSearchParams;t&&a.set("tag",t),r&&a.set("q",r),e>1&&a.set("page",String(e));const o=a.toString();return"/blog"+(o?`?${o}`:"")}function b({currentPage:r,totalPages:a,activeTag:o,search:n}){if(a<=1)return null;const s=[];for(let e=1;e<=a;e++)s.push(e);return e.jsxs("nav",{"aria-label":"Blog pagination",className:"flex items-center justify-center gap-2",children:[r>1?e.jsx(t,{to:f(r-1,o,n),prefetch:"intent",className:"flex items-center justify-center w-9 h-9 rounded-lg border border-border text-muted-foreground hover:text-primary hover:border-primary/50 transition-all duration-200","aria-label":"Previous page",children:e.jsx(m,{className:"w-4 h-4"})}):e.jsx("span",{className:"flex items-center justify-center w-9 h-9 rounded-lg border border-border text-muted-foreground
1/30 cursor-not-allowed",children:e.jsx(m,{className:"w-4 h-4"})}),s.map(a=>e.jsx(t,{to:f(a,o,n),prefetch:"intent",className:c("flex items-center justify-center w-9 h-9 rounded-lg border text-sm font-mono transition-all duration-200",a===r?"bg-primary text-primary-foreground border-primary glow-primary-sm":"border-border text-muted-foreground hover:text-primary hover:border-primary/50"),"aria-current":a===r?"page":void 0,children:a},a)),r<a?e.jsx(t,{to:f(r+1,o,n),prefetch:"intent",className:"flex items-center justify-center w-9 h-9 rounded-lg border border-border text-muted-foreground hover:text-primary hover:border-primary/50 transition-all duration-200","aria-label":"Next page",children:e.jsx(d,{className:"w-4 h-4"})}):e.jsx("span",{className:"flex items-center justify-center w-9 h-9 rounded-lg border border-border text-muted-foreground/30 cursor-not-allowed",children:e.jsx(d,{className:"w-4 h-4"})})]})}function y({data:e}){const t=null==e?void 0:e.activeTag,r=t?`Blog â ${t} | Odin Scan`:"Blog | Odin Scan",a="Security research, vulnerability analysis, and product updates from the Odin Scan team.",o="https://odinscan.ai/blog";return[{title:r},{name:"description",content:a},{tagName:"link",rel:"canonical",href:o},{name:"robots",content:"index, follow"},{name:"keywords",content:"smart contract security blog, blockchain security research, vulnerability analysis, web3 security, odin scan"},{property:"og:type",content:"website"},{property:"og:title",content:r},{property:"og:description",content:a},{property:"og:url",content:o},...p({alt:"Odin Scan Blog"}),{property:"og:site_name",content:"Odin Scan"},{property:"og:locale",content:"en_US"},{name:"twitter:card",content:"summary_large_image"},{name:"twitter:site",content:"@odin_scan"},{name:"twitter:creator",content:"@odin_scan"},{name:"twitter:title",content:r},{name:"twitter:description",content:a},{name:"twitter:image",content:"https://odinscan.ai/og-image.png"},{name:"twitter:image:alt",content:"Odin Scan Blog"},{"script:ld+json":{"@context":"https://schema.org","@type":"CollectionPage",name:r,description:a,url:o,publisher:{"@type":"Organization",name:"Odin Scan",url:"https://odinscan.ai",logo:"https://odinscan.ai/odinscan-logo.png"}}},{"script:ld+json":{"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:[{"@type":"ListItem",position:1,name:"Home",item:"https://odinscan.ai"},{"@type":"ListItem",position:2,name:"Blog",item:"https://odinscan.ai/blog"}]}}]}const j=o(function({loaderData:t}){const{posts:r,totalPages:a,currentPage:o,allTags:i,activeTag:l,search:c}=t;return e.jsxs("main",{children:[e.jsx(n,{}),e.jsxs("section",{className:"relative pt-28 pb-16",children:[e.jsx("div",{className:"absolute inset-0 cyber-grid opacity-30"}),e.jsxs("div",{className:"relative mx-auto max-w-6xl px-6",children:[e.jsxs("div",{className:"text-center mb-12",children:[e.jsx("h1",{className:"text-4xl md:text-5xl font-bold mb-4",children:e.jsx("span",{className:"text-primary",children:"Blog"})}),e.jsx("p",{className:"text-muted-foreground font-mono max-w-xl mx-auto",children:"Security research, vulnerability analysis, and product updates."})]}),e.jsx("div",{className:"mb-6",children:e.jsx(g,{query:c,activeTag:l})}),i.length>0&&e.jsx("div",{className:"mb-10",children:e.jsx(h,{tags:i,activeTag:l,search:c})}),r.length>0?e.jsx("div",{className:"grid gap-6 sm:grid-cols-2 lg:grid-cols-3 mb-12",children:r.map(t=>e.jsx(u,{post:t},t.slug))}):e.jsx("div",{className:"text-center py-20",children:e.jsxs("p",{className:"text-muted-foreground font-mono",children:["No posts found",c?` matching "${c}"`:"",l?` for tag "${l}"`:"","."]})}),e.jsx(b,{currentPage:o,totalPages:a,activeTag:l,search:c})]})]}),e.jsx(s,{})]})});export{j as default,y as meta};
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.