this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Include dist/ in repo for Tangled static site deployment

Tangled serves sites directly from git, so build output must be committed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

+540 -1
-1
.gitignore
··· 1 1 node_modules/ 2 - dist/ 3 2 .astro/
+1
dist/_astro/index.CKmBTNej.css
··· 1 + .profile-header[data-astro-cid-j77egsiz]{max-width:720px;margin:-60px auto 0;padding:0 24px;position:relative}.avatar-wrap[data-astro-cid-j77egsiz]{width:120px;height:120px;border-radius:50%;overflow:hidden;border:4px solid var(--warm-white);box-shadow:0 4px 20px #3d35351a;margin-bottom:16px}.avatar-wrap[data-astro-cid-j77egsiz] img[data-astro-cid-j77egsiz]{width:100%;height:100%;object-fit:cover}.display-name[data-astro-cid-j77egsiz]{font-family:Playfair Display,serif;font-size:2.4rem;font-weight:700;letter-spacing:-.02em;color:var(--text);margin-bottom:4px}.handle[data-astro-cid-j77egsiz]{font-size:.9rem;color:var(--text-muted);margin-bottom:12px}.handle[data-astro-cid-j77egsiz] a[data-astro-cid-j77egsiz]{color:var(--soft-blue);text-decoration:none}.bio[data-astro-cid-j77egsiz]{font-size:1.05rem;color:var(--text-light);margin-bottom:16px;white-space:pre-line}.stats[data-astro-cid-j77egsiz]{display:flex;gap:24px;margin-bottom:32px}.stat[data-astro-cid-j77egsiz]{font-size:.85rem;color:var(--text-muted)}.stat[data-astro-cid-j77egsiz] strong[data-astro-cid-j77egsiz]{font-weight:500;color:var(--text);margin-right:3px}@media(max-width:600px){.profile-header[data-astro-cid-j77egsiz]{margin-top:-40px}.avatar-wrap[data-astro-cid-j77egsiz]{width:88px;height:88px}.display-name[data-astro-cid-j77egsiz]{font-size:1.8rem}.stats[data-astro-cid-j77egsiz]{gap:16px;flex-wrap:wrap}}.tabs[data-astro-cid-3mumooez]{max-width:720px;margin:0 auto 24px;padding:0 24px;display:flex;gap:4px;border-bottom:1px solid var(--stroke);overflow-x:auto;-webkit-overflow-scrolling:touch}.tab[data-astro-cid-3mumooez]{padding:10px 16px;font-size:.82rem;font-weight:400;color:var(--text-muted);cursor:pointer;border:none;background:none;font-family:Inter,sans-serif;position:relative;transition:color .3s;white-space:nowrap}.tab[data-astro-cid-3mumooez]:hover{color:var(--text-light)}.tab[data-astro-cid-3mumooez].active{color:var(--text);font-weight:500}.tab[data-astro-cid-3mumooez].active:after{content:"";position:absolute;bottom:-1px;left:16px;right:16px;height:2px;background:linear-gradient(90deg,var(--lavender),var(--soft-blue));border-radius:1px}.post-card{padding:24px 0;border-bottom:1px solid var(--stroke);animation:fadeIn .4s ease}.post-card:last-child{border-bottom:none}.post-meta{display:flex;align-items:center;gap:8px;margin-bottom:8px}.post-meta-avatar{width:36px;height:36px;border-radius:50%;object-fit:cover}.post-meta-info{flex:1}.post-author{font-weight:500;font-size:.9rem;color:var(--text)}.post-time{font-size:.78rem;color:var(--text-muted)}.post-text{font-size:.95rem;line-height:1.7;color:var(--text);margin-bottom:12px;word-wrap:break-word}.post-text a{color:var(--soft-blue);text-decoration:none;border-bottom:1px solid rgba(137,164,199,.3)}.post-images{display:grid;gap:8px;margin-bottom:12px;border-radius:12px;overflow:hidden}.post-images.grid-1{grid-template-columns:1fr}.post-images.grid-2,.post-images.grid-3,.post-images.grid-4{grid-template-columns:1fr 1fr}.post-images img{width:100%;height:240px;object-fit:cover;border-radius:8px;cursor:pointer;transition:filter .3s}.post-images img:hover{filter:brightness(1.05) saturate(1.1)}.embed-external{border:1px solid var(--stroke);border-radius:12px;overflow:hidden;margin-bottom:12px;text-decoration:none;display:block;transition:box-shadow .3s}.embed-external:hover{box-shadow:0 2px 12px #3d35350f}.embed-external-thumb{width:100%;height:180px;object-fit:cover}.embed-external-info{padding:12px 16px}.embed-external-domain{font-size:.75rem;color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em;margin-bottom:4px}.embed-external-title{font-family:Playfair Display,serif;font-size:1rem;color:var(--text);margin-bottom:4px}.embed-external-desc{font-size:.82rem;color:var(--text-light);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.embed-quote{border:1px solid var(--stroke);border-radius:12px;padding:16px;margin-bottom:12px;background:#faf5ef80}.embed-quote .post-meta{margin-bottom:6px}.embed-quote .post-text{font-size:.88rem;margin-bottom:0}.post-engagement{display:flex;gap:20px;font-size:.78rem;color:var(--text-muted)}.post-engagement span{display:flex;align-items:center;gap:4px}.repost-indicator{font-size:.78rem;color:var(--text-muted);margin-bottom:8px;display:flex;align-items:center;gap:4px}.thread-toggle{display:inline-flex;align-items:center;gap:6px;margin-top:10px;padding:6px 14px;border:1px solid var(--stroke);border-radius:20px;background:transparent;font-family:Inter,sans-serif;font-size:.78rem;color:var(--soft-blue);cursor:pointer;transition:all .25s}.thread-toggle:hover{background:#89a4c714;border-color:#89a4c74d}.thread-toggle .arrow{display:inline-block;transition:transform .25s;font-size:.65rem}.thread-toggle.open .arrow{transform:rotate(90deg)}.thread-replies{display:none;margin-top:12px;padding-left:20px;border-left:2px solid var(--lavender)}.thread-replies.open{display:block}.thread-replies .thread-reply{padding:14px 0;border-bottom:1px solid var(--stroke);animation:fadeIn .3s ease}.thread-replies .thread-reply:last-child{border-bottom:none}.thread-replies .post-meta-avatar{width:28px;height:28px}.thread-replies .post-text{font-size:.9rem}.thread-replies .post-engagement{font-size:.75rem}.thread-loading{padding:16px 0;font-size:.8rem;color:var(--text-muted);display:flex;align-items:center;gap:8px}@media(max-width:600px){.post-images img{height:180px}}.writing-card[data-astro-cid-6arjpkwv]{display:block;text-decoration:none;color:var(--text)}.pub-badge[data-astro-cid-6arjpkwv]{color:var(--soft-blue)}.tags[data-astro-cid-6arjpkwv]{margin-bottom:6px}.track-card[data-astro-cid-cbe3opy5]{display:flex;align-items:center;gap:16px}.track-artwork[data-astro-cid-cbe3opy5]{width:64px;height:64px;border-radius:8px;object-fit:cover;flex-shrink:0}.track-info[data-astro-cid-cbe3opy5]{flex:1;min-width:0}.track-play[data-astro-cid-cbe3opy5]{width:40px;height:40px;border-radius:50%;border:1px solid var(--stroke);background:transparent;font-size:1rem;cursor:pointer;flex-shrink:0;color:var(--soft-blue);transition:all .2s;display:flex;align-items:center;justify-content:center}.track-play[data-astro-cid-cbe3opy5]:hover{background:#89a4c71a;border-color:var(--soft-blue)}.repo-card[data-astro-cid-kmjt4cc7],.annotation-card[data-astro-cid-l3ldzmym]{display:block;text-decoration:none;color:var(--text)}.annotation-quote[data-astro-cid-l3ldzmym]{font-style:italic;color:var(--text-light);border-left:3px solid var(--lavender);padding-left:12px;margin-bottom:8px;font-size:.88rem}.annotation-body[data-astro-cid-l3ldzmym]{font-size:.9rem;margin-bottom:8px}.note-body[data-astro-cid-fa3pki4p]{font-size:.88rem;white-space:pre-wrap}.follow-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px;max-width:720px;margin:0 auto;padding:0 24px}.follow-card{display:flex;align-items:center;gap:12px;padding:12px 16px;border:1px solid var(--stroke);border-radius:12px;text-decoration:none;color:var(--text);transition:all .25s;background:#fff6}.follow-card:hover{box-shadow:0 2px 12px #3d35350f;border-color:#89a4c74d}.follow-avatar{width:40px;height:40px;border-radius:50%;object-fit:cover;flex-shrink:0}.follow-info{display:flex;flex-direction:column;overflow:hidden}.follow-name{font-weight:500;font-size:.88rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.follow-handle{font-size:.75rem;color:var(--text-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@media(max-width:600px){.follow-grid{grid-template-columns:1fr}}.content{max-width:720px;margin:0 auto;padding:0 24px 64px}.tab-panel{display:none}.tab-panel.active{display:block}
+305
dist/index.html
··· 1 + <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Nate Spilman</title><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;1,400&family=Inter:wght@300;400;500&display=swap" rel="stylesheet"><style>:root{--lavender: #b8a9c9;--soft-blue: #89a4c7;--warm-peach: #e8c4a0;--sage: #a8b89c;--rose: #d4a0a0;--cream: #faf5ef;--warm-white: #fdfbf7;--text: #3d3535;--text-light: #6b5e5e;--text-muted: #9a8c8c;--stroke: rgba(61, 53, 53, .08)}*{margin:0;padding:0;box-sizing:border-box}body{font-family:Inter,sans-serif;font-weight:300;color:var(--text);background:var(--warm-white);line-height:1.7;min-height:100vh}body:before{content:"";position:fixed;inset:0;background:radial-gradient(ellipse at 20% 50%,rgba(184,169,201,.15) 0%,transparent 50%),radial-gradient(ellipse at 80% 20%,rgba(137,164,199,.12) 0%,transparent 50%),radial-gradient(ellipse at 60% 80%,rgba(232,196,160,.1) 0%,transparent 50%),radial-gradient(ellipse at 10% 90%,rgba(168,184,156,.08) 0%,transparent 40%);pointer-events:none;z-index:0}a{color:var(--soft-blue);text-decoration:none}a:hover{border-color:var(--soft-blue)}.page{position:relative;z-index:1}.banner{width:100%;height:280px;position:relative;overflow:hidden}.banner img{width:100%;height:100%;object-fit:cover;filter:saturate(.8) contrast(.9) brightness(1.05)}.banner:after{content:"";position:absolute;inset:0;background:linear-gradient(to bottom,transparent 40%,rgba(253,251,247,.3) 70%,var(--warm-white) 100%)}.section-content{max-width:720px;margin:0 auto;padding:0 24px}.card{padding:20px;border:1px solid var(--stroke);border-radius:12px;margin-bottom:12px;animation:fadeIn .4s ease;transition:box-shadow .3s,transform .2s}.card:hover{box-shadow:0 4px 16px #3d35350f;transform:translateY(-1px)}.card-title{font-family:Playfair Display,serif;font-size:1.1rem;color:var(--text);margin-bottom:4px}.card-meta{font-size:.78rem;color:var(--text-muted);margin-bottom:8px}.card-desc{font-size:.85rem;color:var(--text-light);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.tag{display:inline-block;font-size:.7rem;color:var(--soft-blue);background:#89a4c71a;padding:2px 8px;border-radius:10px;margin-right:4px;margin-bottom:4px}.loading{text-align:center;padding:40px 0;color:var(--text-muted);font-size:.9rem}.loading-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--lavender);margin:0 3px;animation:pulse 1.4s infinite ease-in-out}.loading-dot:nth-child(2){animation-delay:.2s}.loading-dot:nth-child(3){animation-delay:.4s}.empty-state{text-align:center;padding:60px 20px;color:var(--text-muted);font-style:italic}.error-state{text-align:center;padding:40px 20px;color:var(--rose)}.load-more{display:block;margin:24px auto;padding:10px 32px;border:1px solid var(--stroke);border-radius:24px;background:transparent;font-family:Inter,sans-serif;font-size:.85rem;color:var(--text-muted);cursor:pointer;transition:all .3s}.load-more:hover{border-color:var(--lavender);color:var(--text);box-shadow:0 2px 8px #b8a9c926}.load-more:disabled{opacity:.4;cursor:default}@keyframes fadeIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%,80%,to{transform:scale(.6);opacity:.4}40%{transform:scale(1);opacity:1}}.lightbox{position:fixed;inset:0;background:#000000d9;z-index:1000;display:none;align-items:center;justify-content:center;cursor:pointer}.lightbox.open{display:flex}.lightbox img{max-width:90vw;max-height:90vh;object-fit:contain;border-radius:4px}@media(max-width:600px){.banner{height:180px}} 2 + </style> 3 + <link rel="stylesheet" href="/_astro/index.CKmBTNej.css"></head> <body> <div class="page"> <div class="banner" data-astro-cid-j77egsiz><img src="https://cdn.bsky.app/img/banner/plain/did:plc:c7frv4rcitff3p2nh7of5bcv/bafkreies6omq36whvreselkdjj2xl4mf2iw4jkqfg7bpwshoesmila6eh4" alt="Banner" data-astro-cid-j77egsiz></div><div class="profile-header" data-astro-cid-j77egsiz> <div class="avatar-wrap" data-astro-cid-j77egsiz> <img src="https://cdn.bsky.app/img/avatar/plain/did:plc:c7frv4rcitff3p2nh7of5bcv/bafkreia2ueoja2p4k2mqcmjhphtqdh4nqa7wdhbmlc34fuqt7cnp3fmgga" alt="Nate Spilman" data-astro-cid-j77egsiz> </div> <h1 class="display-name" data-astro-cid-j77egsiz>Nate Spilman</h1> <p class="handle" data-astro-cid-j77egsiz> <a href="https://bsky.app/profile/natespilman.com" target="_blank" rel="noopener" data-astro-cid-j77egsiz>@natespilman.com</a> </p> <p class="bio" data-astro-cid-j77egsiz>Software - urban biking - music 4 + 5 + Happy to be here. </p> <div class="stats" data-astro-cid-j77egsiz> <span class="stat" data-astro-cid-j77egsiz><strong data-astro-cid-j77egsiz>2.6K</strong> posts</span> <span class="stat" data-astro-cid-j77egsiz><strong data-astro-cid-j77egsiz>5.8K</strong> following</span> <span class="stat" data-astro-cid-j77egsiz><strong data-astro-cid-j77egsiz>2.1K</strong> followers</span> </div> </div> <nav class="tabs" id="tabs" data-astro-cid-3mumooez> <button class="tab active" data-tab="posts" data-astro-cid-3mumooez> Posts </button><button class="tab " data-tab="writing" data-astro-cid-3mumooez> Writing </button><button class="tab " data-tab="music" data-astro-cid-3mumooez> Music </button><button class="tab " data-tab="repos" data-astro-cid-3mumooez> Repos </button><button class="tab " data-tab="annotations" data-astro-cid-3mumooez> Annotations </button><button class="tab " data-tab="notes" data-astro-cid-3mumooez> Notes </button><button class="tab " data-tab="follows" data-astro-cid-3mumooez> Follows </button><button class="tab " data-tab="feeds" data-astro-cid-3mumooez> Feeds </button> </nav> <script> 6 + document.getElementById('tabs')?.addEventListener('click', (e) => { 7 + const tab = e.target.closest('.tab'); 8 + if (!tab) return; 9 + const tabName = tab.dataset.tab; 10 + 11 + document.querySelectorAll('.tab').forEach(t => t.classList.remove('active')); 12 + tab.classList.add('active'); 13 + 14 + document.querySelectorAll('.tab-panel').forEach(p => p.classList.remove('active')); 15 + document.getElementById(tabName + 'Panel')?.classList.add('active'); 16 + 17 + // Dispatch custom event for lazy-loading 18 + window.dispatchEvent(new CustomEvent('tab-switch', { detail: tabName })); 19 + }); 20 + </script> <div class="content"> <div id="postsPanel" class="tab-panel active"> <div class="loading"> <span class="loading-dot"></span> <span class="loading-dot"></span> <span class="loading-dot"></span> </div> </div> <script>(function(){const HANDLE = "natespilman.com"; 21 + 22 + (function() { 23 + const API = 'https://public.api.bsky.app/xrpc'; 24 + let postsCursor = null; 25 + let profile = null; 26 + 27 + async function api(method, params) { 28 + const url = new URL(API + '/' + method); 29 + Object.entries(params || {}).forEach(([k,v]) => { if (v != null) url.searchParams.set(k,v); }); 30 + const res = await fetch(url); 31 + if (!res.ok) throw new Error('API error: ' + res.status); 32 + return res.json(); 33 + } 34 + 35 + function esc(s) { return s.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;'); } 36 + 37 + function timeAgo(d) { 38 + const diff = Date.now() - new Date(d).getTime(); 39 + const m = Math.floor(diff/60000), h = Math.floor(diff/3600000), dy = Math.floor(diff/86400000); 40 + if (m < 1) return 'just now'; if (m < 60) return m+'m'; if (h < 24) return h+'h'; 41 + if (dy < 7) return dy+'d'; 42 + return new Date(d).toLocaleDateString('en-US',{month:'short',day:'numeric',...(dy>365?{year:'numeric'}:{})}); 43 + } 44 + 45 + function renderFacets(text, facets) { 46 + if (!facets?.length) return esc(text); 47 + const enc = new TextEncoder(), dec = new TextDecoder(), bytes = enc.encode(text); 48 + const sorted = [...facets].sort((a,b) => a.index.byteStart - b.index.byteStart); 49 + let r = '', last = 0; 50 + for (const f of sorted) { 51 + const {byteStart:s, byteEnd:e} = f.index; 52 + r += esc(dec.decode(bytes.slice(last, s))); 53 + const t = esc(dec.decode(bytes.slice(s, e))), feat = f.features?.[0]; 54 + if (feat?.$type === 'app.bsky.richtext.facet#link') r += '<a href="'+esc(feat.uri)+'" target="_blank" rel="noopener">'+t+'</a>'; 55 + else if (feat?.$type === 'app.bsky.richtext.facet#mention') r += '<a href="https://bsky.app/profile/'+feat.did+'" target="_blank" rel="noopener">'+t+'</a>'; 56 + else if (feat?.$type === 'app.bsky.richtext.facet#tag') r += '<a href="https://bsky.app/hashtag/'+feat.tag+'" target="_blank" rel="noopener">'+t+'</a>'; 57 + else r += t; 58 + last = e; 59 + } 60 + r += esc(dec.decode(bytes.slice(last))); 61 + return r; 62 + } 63 + 64 + function renderEmbed(embed) { 65 + if (!embed) return ''; 66 + if (embed.$type === 'app.bsky.embed.images#view') { 67 + const c = embed.images.length, g = c<=4?'grid-'+c:'grid-4'; 68 + return '<div class="post-images '+g+'">'+embed.images.map(i => 69 + '<img src="'+i.thumb+'" alt="'+esc(i.alt||'')+'" onclick="openLightbox(\''+i.fullsize+'\')" />' 70 + ).join('')+'</div>'; 71 + } 72 + if (embed.$type === 'app.bsky.embed.external#view') { 73 + const x = embed.external, dom = (() => { try{return new URL(x.uri).hostname.replace('www.','')}catch{return x.uri}})(); 74 + return '<a class="embed-external" href="'+esc(x.uri)+'" target="_blank" rel="noopener">' 75 + +(x.thumb?'<img class="embed-external-thumb" src="'+x.thumb+'" alt="" />':'') 76 + +'<div class="embed-external-info"><div class="embed-external-domain">'+esc(dom)+'</div>' 77 + +'<div class="embed-external-title">'+esc(x.title||x.uri)+'</div>' 78 + +(x.description?'<div class="embed-external-desc">'+esc(x.description)+'</div>':'') 79 + +'</div></a>'; 80 + } 81 + if (embed.$type === 'app.bsky.embed.record#view' && embed.record?.$type === 'app.bsky.embed.record#viewRecord') { 82 + const r = embed.record; 83 + return '<div class="embed-quote"><div class="post-meta"><img class="post-meta-avatar" src="'+(r.author?.avatar||'')+'" alt="" style="width:28px;height:28px;" />' 84 + +'<div class="post-meta-info"><span class="post-author" style="font-size:0.84rem;">'+esc(r.author?.displayName||r.author?.handle||'')+'</span></div></div>' 85 + +(r.value?.text?'<div class="post-text">'+renderFacets(r.value.text, r.value.facets)+'</div>':'')+'</div>'; 86 + } 87 + if (embed.$type === 'app.bsky.embed.recordWithMedia#view') { 88 + return renderEmbed(embed.media) + renderEmbed(embed.record); 89 + } 90 + if (embed.$type === 'app.bsky.embed.video#view' && embed.thumbnail) { 91 + return '<div class="post-images grid-1"><img src="'+embed.thumbnail+'" alt="Video" style="cursor:default;" /></div>'; 92 + } 93 + return ''; 94 + } 95 + 96 + function renderPost(item) { 97 + const p = item.post, r = p.record, a = p.author, repost = item.reason?.$type === 'app.bsky.feed.defs#reasonRepost'; 98 + let h = ''; 99 + if (repost) h += '<div class="repost-indicator">\u21BB Reposted by '+esc(profile?.displayName||HANDLE)+'</div>'; 100 + h += '<div class="post-meta"><img class="post-meta-avatar" src="'+(a.avatar||'')+'" alt="" />' 101 + +'<div class="post-meta-info"><span class="post-author">'+esc(a.displayName||a.handle)+'</span>' 102 + +'<span class="post-time"> &middot; '+timeAgo(r.createdAt)+'</span></div></div>'; 103 + if (r.text) h += '<div class="post-text">'+renderFacets(r.text, r.facets)+'</div>'; 104 + h += renderEmbed(p.embed); 105 + h += '<div class="post-engagement"><span>\u2661 '+(p.likeCount||0)+'</span><span>\u21BB '+(p.repostCount||0)+'</span><span>\u2709 '+(p.replyCount||0)+'</span></div>'; 106 + if (p.replyCount > 0) { 107 + const tid = p.uri.split('/').pop(); 108 + h += '<button class="thread-toggle" data-uri="'+p.uri+'" data-did="'+a.did+'"><span class="arrow">\u25B6</span> Show thread</button>'; 109 + h += '<div class="thread-replies" id="thread-'+tid+'"></div>'; 110 + } 111 + const el = document.createElement('div'); 112 + el.className = 'post-card'; 113 + el.innerHTML = h; 114 + // Wire up thread toggle 115 + const btn = el.querySelector('.thread-toggle'); 116 + if (btn) btn.addEventListener('click', () => toggleThread(btn)); 117 + return el; 118 + } 119 + 120 + async function toggleThread(btn) { 121 + const uri = btn.dataset.uri, did = btn.dataset.did; 122 + const container = btn.nextElementSibling; 123 + if (container.classList.contains('open')) { 124 + container.classList.remove('open'); btn.classList.remove('open'); 125 + const c = parseInt(container.dataset.count||'0'); 126 + btn.lastChild.textContent = c > 0 ? ' Thread ('+c+')' : ' Show thread'; 127 + return; 128 + } 129 + if (container.dataset.loaded) { 130 + const c = parseInt(container.dataset.count||'0'); 131 + if (c === 0) return; 132 + container.classList.add('open'); btn.classList.add('open'); 133 + btn.lastChild.textContent = ' Hide thread ('+c+')'; 134 + return; 135 + } 136 + btn.disabled = true; 137 + container.innerHTML = '<div class="thread-loading"><span class="loading-dot"></span><span class="loading-dot"></span><span class="loading-dot"></span> Loading\u2026</div>'; 138 + container.classList.add('open'); 139 + try { 140 + const data = await api('app.bsky.feed.getPostThread',{uri,depth:'10',parentHeight:'0'}); 141 + const replies = collectThread(data.thread, did); 142 + container.innerHTML = ''; 143 + if (!replies.length) { 144 + container.classList.remove('open'); btn.disabled = true; 145 + btn.style.opacity = '0.4'; btn.style.cursor = 'default'; 146 + btn.lastChild.textContent = ' No thread'; 147 + container.dataset.loaded = 'true'; container.dataset.count = '0'; 148 + return; 149 + } 150 + for (const rp of replies) { 151 + const el = document.createElement('div'); el.className = 'thread-reply'; 152 + const rc = rp.record; 153 + el.innerHTML = '<div class="post-meta"><img class="post-meta-avatar" src="'+(rp.author.avatar||'')+'" alt="" />' 154 + +'<div class="post-meta-info"><span class="post-author">'+esc(rp.author.displayName||rp.author.handle)+'</span>' 155 + +'<span class="post-time"> &middot; '+timeAgo(rc.createdAt)+'</span></div></div>' 156 + +(rc.text?'<div class="post-text">'+renderFacets(rc.text, rc.facets)+'</div>':'') 157 + +renderEmbed(rp.embed) 158 + +'<div class="post-engagement"><span>\u2661 '+(rp.likeCount||0)+'</span><span>\u21BB '+(rp.repostCount||0)+'</span><span>\u2709 '+(rp.replyCount||0)+'</span></div>'; 159 + container.appendChild(el); 160 + } 161 + container.dataset.loaded = 'true'; container.dataset.count = String(replies.length); 162 + btn.classList.add('open'); btn.disabled = false; 163 + btn.lastChild.textContent = ' Hide thread ('+replies.length+')'; 164 + } catch(e) { 165 + container.innerHTML = '<div class="thread-loading" style="color:var(--rose);">Could not load thread</div>'; 166 + btn.disabled = false; 167 + } 168 + } 169 + 170 + function collectThread(thread, did) { 171 + const r = []; 172 + if (!thread.replies) return r; 173 + for (const reply of thread.replies) { 174 + if (reply.$type === 'app.bsky.feed.defs#threadViewPost' && reply.post?.author?.did === did) { 175 + r.push(reply.post); 176 + r.push(...collectThread(reply, did)); 177 + } 178 + } 179 + return r; 180 + } 181 + 182 + async function loadPosts(append) { 183 + const panel = document.getElementById('postsPanel'); 184 + if (!append) panel.innerHTML = '<div class="loading"><span class="loading-dot"></span><span class="loading-dot"></span><span class="loading-dot"></span></div>'; 185 + try { 186 + if (!profile) profile = await api('app.bsky.actor.getProfile',{actor:HANDLE}); 187 + const data = await api('app.bsky.feed.getAuthorFeed',{actor:HANDLE,limit:'25',cursor:postsCursor,filter:'posts_no_replies'}); 188 + postsCursor = data.cursor || null; 189 + if (!append) panel.innerHTML = ''; 190 + const old = panel.querySelector('.load-more'); if (old) old.remove(); 191 + if (!data.feed?.length && !append) { panel.innerHTML = '<div class="empty-state">No posts yet</div>'; return; } 192 + for (const item of data.feed) panel.appendChild(renderPost(item)); 193 + if (postsCursor) { 194 + const btn = document.createElement('button'); btn.className = 'load-more'; btn.textContent = 'Load more'; 195 + btn.onclick = () => { btn.disabled = true; btn.textContent = 'Loading...'; loadPosts(true); }; 196 + panel.appendChild(btn); 197 + } 198 + } catch(e) { if (!append) panel.innerHTML = '<div class="error-state">Could not load posts</div>'; } 199 + } 200 + 201 + loadPosts(false); 202 + })(); 203 + })();</script> <div id="writingPanel" class="tab-panel"> <a class="card writing-card" href="/writing/the-bluesky-ecosystem-has-the-juice-atproto-for-normies" data-astro-cid-6arjpkwv><div class="card-title" data-astro-cid-6arjpkwv>The Bluesky ecosystem has the juice (ATProto for normies)</div><div class="card-meta" data-astro-cid-6arjpkwv>March 13, 2026<span class="pub-badge" data-astro-cid-6arjpkwv> · Nate Spilman</span></div><div class="card-desc" data-astro-cid-6arjpkwv>An explanation for people who don&#39;t care about software protocols 204 + Bluesky is built on top of a new software protocol - https://atproto.com/ - for building distributed networks. If you&#39;re coming to Blu</div></a><a class="card writing-card" href="/writing/this-is-a-canvas-test" data-astro-cid-6arjpkwv><div class="card-title" data-astro-cid-6arjpkwv>This is a Canvas test</div><div class="card-meta" data-astro-cid-6arjpkwv>March 13, 2026<span class="pub-badge" data-astro-cid-6arjpkwv> · Nate Spilman</span></div><div class="card-desc" data-astro-cid-6arjpkwv>Can I really post a Leaflet canvas to my pckt blog?!</div></a><a class="card writing-card" href="/writing/this-is-lovely" data-astro-cid-6arjpkwv><div class="card-title" data-astro-cid-6arjpkwv>This is lovely</div><div class="card-meta" data-astro-cid-6arjpkwv>March 13, 2026<span class="pub-badge" data-astro-cid-6arjpkwv> · Nate Spilman</span></div><div class="tags" data-astro-cid-6arjpkwv><span class="tag" data-astro-cid-6arjpkwv>first-post</span></div><div class="card-desc" data-astro-cid-6arjpkwv>This is my first post on pckt.blog. My first impressions are positive. Things look nice. Everything seems to be put in an obvious place. Like, i click a dropdown and see my options and think &quot;Right - </div></a><a class="card writing-card" href="/writing/grind-75-problem-13-letter-combination-of-a-phone-number" data-astro-cid-6arjpkwv><div class="card-title" data-astro-cid-6arjpkwv>Grind 75 problem 13 - Letter Combination of a Phone Number</div><div class="card-meta" data-astro-cid-6arjpkwv>December 31, 2025<span class="pub-badge" data-astro-cid-6arjpkwv> · Nate learns Data Structures and Algorithms</span></div><div class="tags" data-astro-cid-6arjpkwv><span class="tag" data-astro-cid-6arjpkwv>ds&amp;a</span><span class="tag" data-astro-cid-6arjpkwv>learning</span><span class="tag" data-astro-cid-6arjpkwv>leetcode</span></div></a><a class="card writing-card" href="/writing/grind-75-problem-12-rotting-oranges" data-astro-cid-6arjpkwv><div class="card-title" data-astro-cid-6arjpkwv>Grind 75 problem 12 - Rotting Oranges</div><div class="card-meta" data-astro-cid-6arjpkwv>December 30, 2025<span class="pub-badge" data-astro-cid-6arjpkwv> · Nate learns Data Structures and Algorithms</span></div></a><a class="card writing-card" href="/writing/grind-75-problem-11-3-sum" data-astro-cid-6arjpkwv><div class="card-title" data-astro-cid-6arjpkwv>Grind 75 problem 11 - 3 Sum</div><div class="card-meta" data-astro-cid-6arjpkwv>December 30, 2025<span class="pub-badge" data-astro-cid-6arjpkwv> · Nate learns Data Structures and Algorithms</span></div><div class="tags" data-astro-cid-6arjpkwv><span class="tag" data-astro-cid-6arjpkwv>learning</span><span class="tag" data-astro-cid-6arjpkwv>ds&amp;a</span><span class="tag" data-astro-cid-6arjpkwv>leetcode</span></div></a><a class="card writing-card" href="/writing/grind-75-problem-10-middle-of-linked-list" data-astro-cid-6arjpkwv><div class="card-title" data-astro-cid-6arjpkwv>Grind 75 problem 10 - Middle of Linked List</div><div class="card-meta" data-astro-cid-6arjpkwv>December 10, 2025<span class="pub-badge" data-astro-cid-6arjpkwv> · Nate learns Data Structures and Algorithms</span></div></a><a class="card writing-card" href="/writing/grind-75-problem-9-linked-list-cycle" data-astro-cid-6arjpkwv><div class="card-title" data-astro-cid-6arjpkwv>Grind 75 problem 9 - Linked List Cycle</div><div class="card-meta" data-astro-cid-6arjpkwv>December 10, 2025<span class="pub-badge" data-astro-cid-6arjpkwv> · Nate learns Data Structures and Algorithms</span></div></a><a class="card writing-card" href="/writing/grind-75-problem-8-word-break-attempt-2" data-astro-cid-6arjpkwv><div class="card-title" data-astro-cid-6arjpkwv>Grind 75 problem 8 - Word Break (Attempt 2)</div><div class="card-meta" data-astro-cid-6arjpkwv>December 9, 2025<span class="pub-badge" data-astro-cid-6arjpkwv> · Nate learns Data Structures and Algorithms</span></div></a><a class="card writing-card" href="/writing/grind-75-problem-8-word-break-failed-attempt" data-astro-cid-6arjpkwv><div class="card-title" data-astro-cid-6arjpkwv>Grind 75 problem 8 - Word Break (Failed attempt)</div><div class="card-meta" data-astro-cid-6arjpkwv>November 29, 2025<span class="pub-badge" data-astro-cid-6arjpkwv> · Nate learns Data Structures and Algorithms</span></div></a><a class="card writing-card" href="/writing/grind-75-problem-7-container-with-most-water" data-astro-cid-6arjpkwv><div class="card-title" data-astro-cid-6arjpkwv>Grind 75 problem 7 - Container With Most Water</div><div class="card-meta" data-astro-cid-6arjpkwv>November 26, 2025<span class="pub-badge" data-astro-cid-6arjpkwv> · Nate learns Data Structures and Algorithms</span></div></a><a class="card writing-card" href="/writing/grind-75-problem-6-string-to-integer-atoi" data-astro-cid-6arjpkwv><div class="card-title" data-astro-cid-6arjpkwv>Grind 75 Problem 6 - String to Integer (atoi)</div><div class="card-meta" data-astro-cid-6arjpkwv>November 26, 2025<span class="pub-badge" data-astro-cid-6arjpkwv> · Nate learns Data Structures and Algorithms</span></div></a><a class="card writing-card" href="/writing/grind-75-problem-5-ransom-note" data-astro-cid-6arjpkwv><div class="card-title" data-astro-cid-6arjpkwv>Grind 75 problem 5 - Ransom Note</div><div class="card-meta" data-astro-cid-6arjpkwv>November 21, 2025<span class="pub-badge" data-astro-cid-6arjpkwv> · Nate learns Data Structures and Algorithms</span></div><div class="card-desc" data-astro-cid-6arjpkwv>https://leetcode.com/problems/ransom-note/</div></a><a class="card writing-card" href="/writing/grind-75-problem-4-clone-graph" data-astro-cid-6arjpkwv><div class="card-title" data-astro-cid-6arjpkwv>Grind 75 Problem 4 - Clone Graph</div><div class="card-meta" data-astro-cid-6arjpkwv>November 19, 2025<span class="pub-badge" data-astro-cid-6arjpkwv> · Nate learns Data Structures and Algorithms</span></div></a><a class="card writing-card" href="/writing/grind-75-problem-3-longest-palindromic-substring" data-astro-cid-6arjpkwv><div class="card-title" data-astro-cid-6arjpkwv>Grind 75 Problem 3 - Longest Palindromic Substring</div><div class="card-meta" data-astro-cid-6arjpkwv>November 15, 2025<span class="pub-badge" data-astro-cid-6arjpkwv> · Nate learns Data Structures and Algorithms</span></div></a><a class="card writing-card" href="/writing/grind-75-problem-2-longest-substring-without-repeating" data-astro-cid-6arjpkwv><div class="card-title" data-astro-cid-6arjpkwv>Grind 75 Problem 2 - Longest Substring Without Repeating</div><div class="card-meta" data-astro-cid-6arjpkwv>November 13, 2025<span class="pub-badge" data-astro-cid-6arjpkwv> · Nate learns Data Structures and Algorithms</span></div></a><a class="card writing-card" href="/writing/grind-75-problem-1-two-sum" data-astro-cid-6arjpkwv><div class="card-title" data-astro-cid-6arjpkwv>Grind 75 Problem 1 - Two Sum</div><div class="card-meta" data-astro-cid-6arjpkwv>November 11, 2025<span class="pub-badge" data-astro-cid-6arjpkwv> · Nate learns Data Structures and Algorithms</span></div><div class="tags" data-astro-cid-6arjpkwv><span class="tag" data-astro-cid-6arjpkwv>learning</span><span class="tag" data-astro-cid-6arjpkwv>ds&amp;a</span></div></a><a class="card writing-card" href="/writing/grind-75-study-plan" data-astro-cid-6arjpkwv><div class="card-title" data-astro-cid-6arjpkwv>Grind 75 study plan</div><div class="card-meta" data-astro-cid-6arjpkwv>November 11, 2025<span class="pub-badge" data-astro-cid-6arjpkwv> · Nate learns Data Structures and Algorithms</span></div><div class="tags" data-astro-cid-6arjpkwv><span class="tag" data-astro-cid-6arjpkwv>learning</span><span class="tag" data-astro-cid-6arjpkwv>ds&amp;a</span></div></a> </div> <div id="musicPanel" class="tab-panel"> <div class="card track-card" data-astro-cid-cbe3opy5><img class="track-artwork" src="https://pub-7ea7ea9a6f224f4f8c0321a2bb008c5a.r2.dev/images/696b1c5a7bfcca8b.jpeg" alt="" data-astro-cid-cbe3opy5><div class="track-info" data-astro-cid-cbe3opy5><div class="card-title" data-astro-cid-cbe3opy5>Pioneer</div><div class="card-meta" data-astro-cid-cbe3opy5>natespilman.com · 1:36 · March 14, 2026</div></div><button class="track-play" data-src="https://pub-d4ed8a1e39d44dac85263d86ad5676fd.r2.dev/audio/cbf2cd9804046946.wav" aria-label="Play" data-astro-cid-cbe3opy5>&#9654;</button></div><audio id="globalAudio" preload="none" data-astro-cid-cbe3opy5></audio><script> 205 + (function() { 206 + const audio = document.getElementById('globalAudio'); 207 + let currentBtn = null; 208 + document.querySelectorAll('.track-play').forEach(btn => { 209 + btn.addEventListener('click', () => { 210 + const src = btn.dataset.src; 211 + if (currentBtn === btn && !audio.paused) { 212 + audio.pause(); 213 + btn.textContent = '\u25B6'; 214 + currentBtn = null; 215 + return; 216 + } 217 + if (currentBtn) currentBtn.textContent = '\u25B6'; 218 + audio.src = src; 219 + audio.play(); 220 + btn.textContent = '\u23F8'; 221 + currentBtn = btn; 222 + }); 223 + }); 224 + audio?.addEventListener('ended', () => { 225 + if (currentBtn) currentBtn.textContent = '\u25B6'; 226 + currentBtn = null; 227 + }); 228 + })(); 229 + </script> </div> <div id="reposPanel" class="tab-panel"> <a class="card repo-card" href="https://tangled.org/natespilman.com/tangled-site" target="_blank" rel="noopener" data-astro-cid-kmjt4cc7><div class="card-title" data-astro-cid-kmjt4cc7>tangled-site</div><div class="card-meta" data-astro-cid-kmjt4cc7>March 15, 2026</div></a><a class="card repo-card" href="https://tangled.org/natespilman.com/atproto-audio-upload" target="_blank" rel="noopener" data-astro-cid-kmjt4cc7><div class="card-title" data-astro-cid-kmjt4cc7>atproto-audio-upload</div><div class="card-meta" data-astro-cid-kmjt4cc7>March 9, 2026</div></a><a class="card repo-card" href="https://tangled.org/natespilman.com/tangled-core" target="_blank" rel="noopener" data-astro-cid-kmjt4cc7><div class="card-title" data-astro-cid-kmjt4cc7>tangled-core</div><div class="card-meta" data-astro-cid-kmjt4cc7>March 3, 2026 · forked</div><div class="card-desc" data-astro-cid-kmjt4cc7>Monorepo for Tangled </div></a><a class="card repo-card" href="https://tangled.org/natespilman.com/skyline" target="_blank" rel="noopener" data-astro-cid-kmjt4cc7><div class="card-title" data-astro-cid-kmjt4cc7>skyline</div><div class="card-meta" data-astro-cid-kmjt4cc7>March 3, 2026</div><div class="card-desc" data-astro-cid-kmjt4cc7>A TypeScript toolkit for consuming the Bluesky network in real-time.</div></a> </div> <div id="annotationsPanel" class="tab-panel"> <a class="card annotation-card" href="https://sbgeoaiphd.github.io/rotating_the_space/posture" target="_blank" rel="noopener" data-astro-cid-l3ldzmym><blockquote class="annotation-quote" data-astro-cid-l3ldzmym>&ldquo;usually reduces to a binary&rdquo;</blockquote><div class="annotation-body" data-astro-cid-l3ldzmym>as so much often is</div><div class="card-meta" data-astro-cid-l3ldzmym>Amplifiers of Epistemic Posture | rotating_the_space · March 15, 2026</div></a><a class="card annotation-card" href="https://sbgeoaiphd.github.io/rotating_the_space/posture" target="_blank" rel="noopener" data-astro-cid-l3ldzmym><blockquote class="annotation-quote" data-astro-cid-l3ldzmym>&ldquo;usually reduces to a binary&rdquo;</blockquote><div class="annotation-body" data-astro-cid-l3ldzmym>So much often is</div><div class="card-meta" data-astro-cid-l3ldzmym>sbgeoaiphd.github.io · March 15, 2026</div></a> </div> <div id="notesPanel" class="tab-panel"> <div class="card note-card" data-astro-cid-fa3pki4p><div class="card-title" data-astro-cid-fa3pki4p>Creating my first node in Aestheros</div><div class="card-meta" data-astro-cid-fa3pki4p>March 14, 2026</div><div class="card-desc note-body" data-astro-cid-fa3pki4p>looking forward to see how and where this persists. Found it.&#x20;</div></div> </div> <div id="followsPanel" class="tab-panel"> <div class="loading"> <span class="loading-dot"></span> <span class="loading-dot"></span> <span class="loading-dot"></span> </div> </div> <script>(function(){const HANDLE = "natespilman.com"; 230 + 231 + (function() { 232 + const API = 'https://public.api.bsky.app/xrpc'; 233 + let followsCursor = null; 234 + let loaded = false; 235 + 236 + async function api(method, params) { 237 + const url = new URL(API + '/' + method); 238 + Object.entries(params || {}).forEach(([k,v]) => { if (v != null) url.searchParams.set(k,v); }); 239 + const res = await fetch(url); 240 + if (!res.ok) throw new Error('API error: ' + res.status); 241 + return res.json(); 242 + } 243 + 244 + function esc(s) { return s.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;'); } 245 + 246 + function renderFollow(f) { 247 + const el = document.createElement('a'); 248 + el.className = 'follow-card'; 249 + el.href = 'https://bsky.app/profile/' + f.handle; 250 + el.target = '_blank'; 251 + el.rel = 'noopener'; 252 + el.innerHTML = 253 + '<img class="follow-avatar" src="' + (f.avatar || '') + '" alt="" />' + 254 + '<div class="follow-info">' + 255 + '<span class="follow-name">' + esc(f.displayName || f.handle) + '</span>' + 256 + '<span class="follow-handle">@' + esc(f.handle) + '</span>' + 257 + '</div>'; 258 + return el; 259 + } 260 + 261 + async function loadFollows(append) { 262 + const panel = document.getElementById('followsPanel'); 263 + if (!append) panel.innerHTML = '<div class="loading"><span class="loading-dot"></span><span class="loading-dot"></span><span class="loading-dot"></span></div>'; 264 + try { 265 + const data = await api('app.bsky.graph.getFollows', { actor: HANDLE, limit: '50', cursor: followsCursor }); 266 + followsCursor = data.cursor || null; 267 + if (!append) panel.innerHTML = ''; 268 + const old = panel.querySelector('.load-more'); if (old) old.remove(); 269 + if (!data.follows?.length && !append) { panel.innerHTML = '<div class="empty-state">Not following anyone</div>'; return; } 270 + const grid = panel.querySelector('.follow-grid') || (() => { 271 + const g = document.createElement('div'); 272 + g.className = 'follow-grid'; 273 + panel.appendChild(g); 274 + return g; 275 + })(); 276 + for (const f of data.follows) grid.appendChild(renderFollow(f)); 277 + if (followsCursor) { 278 + const btn = document.createElement('button'); 279 + btn.className = 'load-more'; 280 + btn.textContent = 'Load more'; 281 + btn.onclick = () => { btn.disabled = true; btn.textContent = 'Loading...'; loadFollows(true); }; 282 + panel.appendChild(btn); 283 + } 284 + } catch(e) { 285 + if (!append) panel.innerHTML = '<div class="error-state">Could not load follows</div>'; 286 + } 287 + } 288 + 289 + // Lazy load on tab switch 290 + window.addEventListener('tab-switch', (e) => { 291 + if (e.detail === 'follows' && !loaded) { 292 + loaded = true; 293 + loadFollows(false); 294 + } 295 + }); 296 + })(); 297 + })();</script> <div id="feedsPanel" class="tab-panel"> <div class="card"><div class="card-title">4 - multiple dimensions</div><div class="card-meta" style="margin-top:8px;">&#9825; 0 likes</div></div><div class="card"><div class="card-title">3 - Logic Nodes</div><div class="card-meta" style="margin-top:8px;">&#9825; 0 likes</div></div><div class="card"><div class="card-title">2 - Excluding Keywords</div><div class="card-meta" style="margin-top:8px;">&#9825; 0 likes</div></div><div class="card"><div class="card-title">1 - Basic Apple feed</div><div class="card-meta" style="margin-top:8px;">&#9825; 0 likes</div></div><div class="card"><div class="card-title">Penn State Football</div><div class="card-desc">Follow along for Penn State Football talk</div><div class="card-meta" style="margin-top:8px;">&#9825; 0 likes</div></div><div class="card"><div class="card-title">NYGiants Feed</div><div class="card-desc">A feed for following the New York Football Giants</div><div class="card-meta" style="margin-top:8px;">&#9825; 1 likes</div></div> </div> </div> </div> <div class="lightbox" id="lightbox" onclick="this.classList.remove('open')"> <img id="lightboxImg" src="" alt=""> </div> <script> 298 + document.addEventListener('keydown', (e) => { 299 + if (e.key === 'Escape') document.getElementById('lightbox')?.classList.remove('open'); 300 + }); 301 + function openLightbox(src) { 302 + document.getElementById('lightboxImg').src = src; 303 + document.getElementById('lightbox').classList.add('open'); 304 + } 305 + </script> </body> </html>
+13
dist/writing/grind-75-problem-1-two-sum/index.html
··· 1 + <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Grind 75 Problem 1 - Two Sum — natespilman.com</title><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;1,400&family=Inter:wght@300;400;500&display=swap" rel="stylesheet"><style>:root{--lavender: #b8a9c9;--soft-blue: #89a4c7;--warm-peach: #e8c4a0;--sage: #a8b89c;--rose: #d4a0a0;--cream: #faf5ef;--warm-white: #fdfbf7;--text: #3d3535;--text-light: #6b5e5e;--text-muted: #9a8c8c;--stroke: rgba(61, 53, 53, .08)}*{margin:0;padding:0;box-sizing:border-box}body{font-family:Inter,sans-serif;font-weight:300;color:var(--text);background:var(--warm-white);line-height:1.7;min-height:100vh}body:before{content:"";position:fixed;inset:0;background:radial-gradient(ellipse at 20% 50%,rgba(184,169,201,.15) 0%,transparent 50%),radial-gradient(ellipse at 80% 20%,rgba(137,164,199,.12) 0%,transparent 50%),radial-gradient(ellipse at 60% 80%,rgba(232,196,160,.1) 0%,transparent 50%),radial-gradient(ellipse at 10% 90%,rgba(168,184,156,.08) 0%,transparent 40%);pointer-events:none;z-index:0}a{color:var(--soft-blue);text-decoration:none}a:hover{border-color:var(--soft-blue)}.page{position:relative;z-index:1}.banner{width:100%;height:280px;position:relative;overflow:hidden}.banner img{width:100%;height:100%;object-fit:cover;filter:saturate(.8) contrast(.9) brightness(1.05)}.banner:after{content:"";position:absolute;inset:0;background:linear-gradient(to bottom,transparent 40%,rgba(253,251,247,.3) 70%,var(--warm-white) 100%)}.section-content{max-width:720px;margin:0 auto;padding:0 24px}.card{padding:20px;border:1px solid var(--stroke);border-radius:12px;margin-bottom:12px;animation:fadeIn .4s ease;transition:box-shadow .3s,transform .2s}.card:hover{box-shadow:0 4px 16px #3d35350f;transform:translateY(-1px)}.card-title{font-family:Playfair Display,serif;font-size:1.1rem;color:var(--text);margin-bottom:4px}.card-meta{font-size:.78rem;color:var(--text-muted);margin-bottom:8px}.card-desc{font-size:.85rem;color:var(--text-light);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.tag{display:inline-block;font-size:.7rem;color:var(--soft-blue);background:#89a4c71a;padding:2px 8px;border-radius:10px;margin-right:4px;margin-bottom:4px}.loading{text-align:center;padding:40px 0;color:var(--text-muted);font-size:.9rem}.loading-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--lavender);margin:0 3px;animation:pulse 1.4s infinite ease-in-out}.loading-dot:nth-child(2){animation-delay:.2s}.loading-dot:nth-child(3){animation-delay:.4s}.empty-state{text-align:center;padding:60px 20px;color:var(--text-muted);font-style:italic}.error-state{text-align:center;padding:40px 20px;color:var(--rose)}.load-more{display:block;margin:24px auto;padding:10px 32px;border:1px solid var(--stroke);border-radius:24px;background:transparent;font-family:Inter,sans-serif;font-size:.85rem;color:var(--text-muted);cursor:pointer;transition:all .3s}.load-more:hover{border-color:var(--lavender);color:var(--text);box-shadow:0 2px 8px #b8a9c926}.load-more:disabled{opacity:.4;cursor:default}@keyframes fadeIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%,80%,to{transform:scale(.6);opacity:.4}40%{transform:scale(1);opacity:1}}.lightbox{position:fixed;inset:0;background:#000000d9;z-index:1000;display:none;align-items:center;justify-content:center;cursor:pointer}.lightbox.open{display:flex}.lightbox img{max-width:90vw;max-height:90vh;object-fit:contain;border-radius:4px}@media(max-width:600px){.banner{height:180px}} 2 + .article-content[data-astro-cid-zzqtqdyh]{font-size:.95rem;line-height:1.8}.article-content[data-astro-cid-zzqtqdyh] p{margin-bottom:1em}.article-content[data-astro-cid-zzqtqdyh] h2{font-family:Playfair Display,serif;font-size:1.4rem;margin:1.5em 0 .5em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] h3{font-family:Playfair Display,serif;font-size:1.15rem;margin:1.2em 0 .4em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] pre{background:#1e1e2e;color:#cdd6f4;padding:16px;border-radius:8px;overflow-x:auto;margin:1em 0;font-size:.82rem;line-height:1.5}.article-content[data-astro-cid-zzqtqdyh] code{font-family:SF Mono,Fira Code,monospace;font-size:.85em}.article-content[data-astro-cid-zzqtqdyh] p code{background:#89a4c71f;padding:2px 5px;border-radius:3px;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] ul{margin:.5em 0 1em 1.5em}.article-content[data-astro-cid-zzqtqdyh] li{margin-bottom:.3em}.article-content[data-astro-cid-zzqtqdyh] a{color:var(--soft-blue);border-bottom:1px solid rgba(137,164,199,.3)}.image-placeholder[data-astro-cid-zzqtqdyh]{color:var(--text-muted);font-style:italic}.article-page[data-astro-cid-zgcwdgoy]{max-width:680px;margin:0 auto;padding:48px 24px 80px}.back-link[data-astro-cid-zgcwdgoy]{display:inline-block;font-size:.85rem;color:var(--soft-blue);text-decoration:none;margin-bottom:32px;border-bottom:1px solid transparent;transition:border-color .2s}.back-link[data-astro-cid-zgcwdgoy]:hover{border-bottom-color:var(--soft-blue)}.article-title[data-astro-cid-zgcwdgoy]{font-family:Playfair Display,serif;font-size:2.2rem;font-weight:700;letter-spacing:-.02em;color:var(--text);margin-bottom:12px;line-height:1.2}.article-meta[data-astro-cid-zgcwdgoy]{font-size:.85rem;color:var(--text-muted);margin-bottom:16px}.pub-name[data-astro-cid-zgcwdgoy]{color:var(--soft-blue)}.article-tags[data-astro-cid-zgcwdgoy]{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:20px}.article-desc[data-astro-cid-zgcwdgoy]{font-size:1.05rem;color:var(--text-light);margin-bottom:32px;line-height:1.6;border-left:3px solid var(--lavender);padding-left:16px}.external-link[data-astro-cid-zgcwdgoy]{display:inline-block;margin-top:40px;padding:12px 24px;font-size:.9rem;color:var(--soft-blue);border:1px solid var(--soft-blue);border-radius:24px;text-decoration:none;transition:all .25s}.external-link[data-astro-cid-zgcwdgoy]:hover{background:var(--soft-blue);color:#fff}@media(max-width:600px){.article-page[data-astro-cid-zgcwdgoy]{padding:32px 16px 60px}.article-title[data-astro-cid-zgcwdgoy]{font-size:1.7rem}} 3 + </style></head> <body> <div class="page"> <article class="article-page" data-astro-cid-zgcwdgoy> <a class="back-link" href="/" data-astro-cid-zgcwdgoy>&larr; Back</a> <h1 class="article-title" data-astro-cid-zgcwdgoy>Grind 75 Problem 1 - Two Sum</h1> <div class="article-meta" data-astro-cid-zgcwdgoy> <time data-astro-cid-zgcwdgoy>November 11, 2025</time> <span class="pub-name" data-astro-cid-zgcwdgoy> · Nate learns Data Structures and Algorithms</span> </div> <div class="article-tags" data-astro-cid-zgcwdgoy> <span class="tag" data-astro-cid-zgcwdgoy>learning</span><span class="tag" data-astro-cid-zgcwdgoy>ds&amp;a</span> </div> <div class="article-content" data-astro-cid-zzqtqdyh> </div> <a class="external-link" href="https://nate-learns-dsa.leaflet.pub/3m5g2erfwyc2o" target="_blank" rel="noopener" data-astro-cid-zgcwdgoy> 4 + Read on Nate learns Data Structures and Algorithms &rarr; 5 + </a> </article> </div> <div class="lightbox" id="lightbox" onclick="this.classList.remove('open')"> <img id="lightboxImg" src="" alt=""> </div> <script> 6 + document.addEventListener('keydown', (e) => { 7 + if (e.key === 'Escape') document.getElementById('lightbox')?.classList.remove('open'); 8 + }); 9 + function openLightbox(src) { 10 + document.getElementById('lightboxImg').src = src; 11 + document.getElementById('lightbox').classList.add('open'); 12 + } 13 + </script> </body> </html>
+13
dist/writing/grind-75-problem-10-middle-of-linked-list/index.html
··· 1 + <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Grind 75 problem 10 - Middle of Linked List — natespilman.com</title><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;1,400&family=Inter:wght@300;400;500&display=swap" rel="stylesheet"><style>:root{--lavender: #b8a9c9;--soft-blue: #89a4c7;--warm-peach: #e8c4a0;--sage: #a8b89c;--rose: #d4a0a0;--cream: #faf5ef;--warm-white: #fdfbf7;--text: #3d3535;--text-light: #6b5e5e;--text-muted: #9a8c8c;--stroke: rgba(61, 53, 53, .08)}*{margin:0;padding:0;box-sizing:border-box}body{font-family:Inter,sans-serif;font-weight:300;color:var(--text);background:var(--warm-white);line-height:1.7;min-height:100vh}body:before{content:"";position:fixed;inset:0;background:radial-gradient(ellipse at 20% 50%,rgba(184,169,201,.15) 0%,transparent 50%),radial-gradient(ellipse at 80% 20%,rgba(137,164,199,.12) 0%,transparent 50%),radial-gradient(ellipse at 60% 80%,rgba(232,196,160,.1) 0%,transparent 50%),radial-gradient(ellipse at 10% 90%,rgba(168,184,156,.08) 0%,transparent 40%);pointer-events:none;z-index:0}a{color:var(--soft-blue);text-decoration:none}a:hover{border-color:var(--soft-blue)}.page{position:relative;z-index:1}.banner{width:100%;height:280px;position:relative;overflow:hidden}.banner img{width:100%;height:100%;object-fit:cover;filter:saturate(.8) contrast(.9) brightness(1.05)}.banner:after{content:"";position:absolute;inset:0;background:linear-gradient(to bottom,transparent 40%,rgba(253,251,247,.3) 70%,var(--warm-white) 100%)}.section-content{max-width:720px;margin:0 auto;padding:0 24px}.card{padding:20px;border:1px solid var(--stroke);border-radius:12px;margin-bottom:12px;animation:fadeIn .4s ease;transition:box-shadow .3s,transform .2s}.card:hover{box-shadow:0 4px 16px #3d35350f;transform:translateY(-1px)}.card-title{font-family:Playfair Display,serif;font-size:1.1rem;color:var(--text);margin-bottom:4px}.card-meta{font-size:.78rem;color:var(--text-muted);margin-bottom:8px}.card-desc{font-size:.85rem;color:var(--text-light);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.tag{display:inline-block;font-size:.7rem;color:var(--soft-blue);background:#89a4c71a;padding:2px 8px;border-radius:10px;margin-right:4px;margin-bottom:4px}.loading{text-align:center;padding:40px 0;color:var(--text-muted);font-size:.9rem}.loading-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--lavender);margin:0 3px;animation:pulse 1.4s infinite ease-in-out}.loading-dot:nth-child(2){animation-delay:.2s}.loading-dot:nth-child(3){animation-delay:.4s}.empty-state{text-align:center;padding:60px 20px;color:var(--text-muted);font-style:italic}.error-state{text-align:center;padding:40px 20px;color:var(--rose)}.load-more{display:block;margin:24px auto;padding:10px 32px;border:1px solid var(--stroke);border-radius:24px;background:transparent;font-family:Inter,sans-serif;font-size:.85rem;color:var(--text-muted);cursor:pointer;transition:all .3s}.load-more:hover{border-color:var(--lavender);color:var(--text);box-shadow:0 2px 8px #b8a9c926}.load-more:disabled{opacity:.4;cursor:default}@keyframes fadeIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%,80%,to{transform:scale(.6);opacity:.4}40%{transform:scale(1);opacity:1}}.lightbox{position:fixed;inset:0;background:#000000d9;z-index:1000;display:none;align-items:center;justify-content:center;cursor:pointer}.lightbox.open{display:flex}.lightbox img{max-width:90vw;max-height:90vh;object-fit:contain;border-radius:4px}@media(max-width:600px){.banner{height:180px}} 2 + .article-content[data-astro-cid-zzqtqdyh]{font-size:.95rem;line-height:1.8}.article-content[data-astro-cid-zzqtqdyh] p{margin-bottom:1em}.article-content[data-astro-cid-zzqtqdyh] h2{font-family:Playfair Display,serif;font-size:1.4rem;margin:1.5em 0 .5em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] h3{font-family:Playfair Display,serif;font-size:1.15rem;margin:1.2em 0 .4em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] pre{background:#1e1e2e;color:#cdd6f4;padding:16px;border-radius:8px;overflow-x:auto;margin:1em 0;font-size:.82rem;line-height:1.5}.article-content[data-astro-cid-zzqtqdyh] code{font-family:SF Mono,Fira Code,monospace;font-size:.85em}.article-content[data-astro-cid-zzqtqdyh] p code{background:#89a4c71f;padding:2px 5px;border-radius:3px;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] ul{margin:.5em 0 1em 1.5em}.article-content[data-astro-cid-zzqtqdyh] li{margin-bottom:.3em}.article-content[data-astro-cid-zzqtqdyh] a{color:var(--soft-blue);border-bottom:1px solid rgba(137,164,199,.3)}.image-placeholder[data-astro-cid-zzqtqdyh]{color:var(--text-muted);font-style:italic}.article-page[data-astro-cid-zgcwdgoy]{max-width:680px;margin:0 auto;padding:48px 24px 80px}.back-link[data-astro-cid-zgcwdgoy]{display:inline-block;font-size:.85rem;color:var(--soft-blue);text-decoration:none;margin-bottom:32px;border-bottom:1px solid transparent;transition:border-color .2s}.back-link[data-astro-cid-zgcwdgoy]:hover{border-bottom-color:var(--soft-blue)}.article-title[data-astro-cid-zgcwdgoy]{font-family:Playfair Display,serif;font-size:2.2rem;font-weight:700;letter-spacing:-.02em;color:var(--text);margin-bottom:12px;line-height:1.2}.article-meta[data-astro-cid-zgcwdgoy]{font-size:.85rem;color:var(--text-muted);margin-bottom:16px}.pub-name[data-astro-cid-zgcwdgoy]{color:var(--soft-blue)}.article-tags[data-astro-cid-zgcwdgoy]{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:20px}.article-desc[data-astro-cid-zgcwdgoy]{font-size:1.05rem;color:var(--text-light);margin-bottom:32px;line-height:1.6;border-left:3px solid var(--lavender);padding-left:16px}.external-link[data-astro-cid-zgcwdgoy]{display:inline-block;margin-top:40px;padding:12px 24px;font-size:.9rem;color:var(--soft-blue);border:1px solid var(--soft-blue);border-radius:24px;text-decoration:none;transition:all .25s}.external-link[data-astro-cid-zgcwdgoy]:hover{background:var(--soft-blue);color:#fff}@media(max-width:600px){.article-page[data-astro-cid-zgcwdgoy]{padding:32px 16px 60px}.article-title[data-astro-cid-zgcwdgoy]{font-size:1.7rem}} 3 + </style></head> <body> <div class="page"> <article class="article-page" data-astro-cid-zgcwdgoy> <a class="back-link" href="/" data-astro-cid-zgcwdgoy>&larr; Back</a> <h1 class="article-title" data-astro-cid-zgcwdgoy>Grind 75 problem 10 - Middle of Linked List</h1> <div class="article-meta" data-astro-cid-zgcwdgoy> <time data-astro-cid-zgcwdgoy>December 10, 2025</time> <span class="pub-name" data-astro-cid-zgcwdgoy> · Nate learns Data Structures and Algorithms</span> </div> <div class="article-content" data-astro-cid-zzqtqdyh> </div> <a class="external-link" href="https://nate-learns-dsa.leaflet.pub/3m7orqq6mkk2g" target="_blank" rel="noopener" data-astro-cid-zgcwdgoy> 4 + Read on Nate learns Data Structures and Algorithms &rarr; 5 + </a> </article> </div> <div class="lightbox" id="lightbox" onclick="this.classList.remove('open')"> <img id="lightboxImg" src="" alt=""> </div> <script> 6 + document.addEventListener('keydown', (e) => { 7 + if (e.key === 'Escape') document.getElementById('lightbox')?.classList.remove('open'); 8 + }); 9 + function openLightbox(src) { 10 + document.getElementById('lightboxImg').src = src; 11 + document.getElementById('lightbox').classList.add('open'); 12 + } 13 + </script> </body> </html>
+13
dist/writing/grind-75-problem-11-3-sum/index.html
··· 1 + <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Grind 75 problem 11 - 3 Sum — natespilman.com</title><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;1,400&family=Inter:wght@300;400;500&display=swap" rel="stylesheet"><style>:root{--lavender: #b8a9c9;--soft-blue: #89a4c7;--warm-peach: #e8c4a0;--sage: #a8b89c;--rose: #d4a0a0;--cream: #faf5ef;--warm-white: #fdfbf7;--text: #3d3535;--text-light: #6b5e5e;--text-muted: #9a8c8c;--stroke: rgba(61, 53, 53, .08)}*{margin:0;padding:0;box-sizing:border-box}body{font-family:Inter,sans-serif;font-weight:300;color:var(--text);background:var(--warm-white);line-height:1.7;min-height:100vh}body:before{content:"";position:fixed;inset:0;background:radial-gradient(ellipse at 20% 50%,rgba(184,169,201,.15) 0%,transparent 50%),radial-gradient(ellipse at 80% 20%,rgba(137,164,199,.12) 0%,transparent 50%),radial-gradient(ellipse at 60% 80%,rgba(232,196,160,.1) 0%,transparent 50%),radial-gradient(ellipse at 10% 90%,rgba(168,184,156,.08) 0%,transparent 40%);pointer-events:none;z-index:0}a{color:var(--soft-blue);text-decoration:none}a:hover{border-color:var(--soft-blue)}.page{position:relative;z-index:1}.banner{width:100%;height:280px;position:relative;overflow:hidden}.banner img{width:100%;height:100%;object-fit:cover;filter:saturate(.8) contrast(.9) brightness(1.05)}.banner:after{content:"";position:absolute;inset:0;background:linear-gradient(to bottom,transparent 40%,rgba(253,251,247,.3) 70%,var(--warm-white) 100%)}.section-content{max-width:720px;margin:0 auto;padding:0 24px}.card{padding:20px;border:1px solid var(--stroke);border-radius:12px;margin-bottom:12px;animation:fadeIn .4s ease;transition:box-shadow .3s,transform .2s}.card:hover{box-shadow:0 4px 16px #3d35350f;transform:translateY(-1px)}.card-title{font-family:Playfair Display,serif;font-size:1.1rem;color:var(--text);margin-bottom:4px}.card-meta{font-size:.78rem;color:var(--text-muted);margin-bottom:8px}.card-desc{font-size:.85rem;color:var(--text-light);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.tag{display:inline-block;font-size:.7rem;color:var(--soft-blue);background:#89a4c71a;padding:2px 8px;border-radius:10px;margin-right:4px;margin-bottom:4px}.loading{text-align:center;padding:40px 0;color:var(--text-muted);font-size:.9rem}.loading-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--lavender);margin:0 3px;animation:pulse 1.4s infinite ease-in-out}.loading-dot:nth-child(2){animation-delay:.2s}.loading-dot:nth-child(3){animation-delay:.4s}.empty-state{text-align:center;padding:60px 20px;color:var(--text-muted);font-style:italic}.error-state{text-align:center;padding:40px 20px;color:var(--rose)}.load-more{display:block;margin:24px auto;padding:10px 32px;border:1px solid var(--stroke);border-radius:24px;background:transparent;font-family:Inter,sans-serif;font-size:.85rem;color:var(--text-muted);cursor:pointer;transition:all .3s}.load-more:hover{border-color:var(--lavender);color:var(--text);box-shadow:0 2px 8px #b8a9c926}.load-more:disabled{opacity:.4;cursor:default}@keyframes fadeIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%,80%,to{transform:scale(.6);opacity:.4}40%{transform:scale(1);opacity:1}}.lightbox{position:fixed;inset:0;background:#000000d9;z-index:1000;display:none;align-items:center;justify-content:center;cursor:pointer}.lightbox.open{display:flex}.lightbox img{max-width:90vw;max-height:90vh;object-fit:contain;border-radius:4px}@media(max-width:600px){.banner{height:180px}} 2 + .article-content[data-astro-cid-zzqtqdyh]{font-size:.95rem;line-height:1.8}.article-content[data-astro-cid-zzqtqdyh] p{margin-bottom:1em}.article-content[data-astro-cid-zzqtqdyh] h2{font-family:Playfair Display,serif;font-size:1.4rem;margin:1.5em 0 .5em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] h3{font-family:Playfair Display,serif;font-size:1.15rem;margin:1.2em 0 .4em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] pre{background:#1e1e2e;color:#cdd6f4;padding:16px;border-radius:8px;overflow-x:auto;margin:1em 0;font-size:.82rem;line-height:1.5}.article-content[data-astro-cid-zzqtqdyh] code{font-family:SF Mono,Fira Code,monospace;font-size:.85em}.article-content[data-astro-cid-zzqtqdyh] p code{background:#89a4c71f;padding:2px 5px;border-radius:3px;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] ul{margin:.5em 0 1em 1.5em}.article-content[data-astro-cid-zzqtqdyh] li{margin-bottom:.3em}.article-content[data-astro-cid-zzqtqdyh] a{color:var(--soft-blue);border-bottom:1px solid rgba(137,164,199,.3)}.image-placeholder[data-astro-cid-zzqtqdyh]{color:var(--text-muted);font-style:italic}.article-page[data-astro-cid-zgcwdgoy]{max-width:680px;margin:0 auto;padding:48px 24px 80px}.back-link[data-astro-cid-zgcwdgoy]{display:inline-block;font-size:.85rem;color:var(--soft-blue);text-decoration:none;margin-bottom:32px;border-bottom:1px solid transparent;transition:border-color .2s}.back-link[data-astro-cid-zgcwdgoy]:hover{border-bottom-color:var(--soft-blue)}.article-title[data-astro-cid-zgcwdgoy]{font-family:Playfair Display,serif;font-size:2.2rem;font-weight:700;letter-spacing:-.02em;color:var(--text);margin-bottom:12px;line-height:1.2}.article-meta[data-astro-cid-zgcwdgoy]{font-size:.85rem;color:var(--text-muted);margin-bottom:16px}.pub-name[data-astro-cid-zgcwdgoy]{color:var(--soft-blue)}.article-tags[data-astro-cid-zgcwdgoy]{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:20px}.article-desc[data-astro-cid-zgcwdgoy]{font-size:1.05rem;color:var(--text-light);margin-bottom:32px;line-height:1.6;border-left:3px solid var(--lavender);padding-left:16px}.external-link[data-astro-cid-zgcwdgoy]{display:inline-block;margin-top:40px;padding:12px 24px;font-size:.9rem;color:var(--soft-blue);border:1px solid var(--soft-blue);border-radius:24px;text-decoration:none;transition:all .25s}.external-link[data-astro-cid-zgcwdgoy]:hover{background:var(--soft-blue);color:#fff}@media(max-width:600px){.article-page[data-astro-cid-zgcwdgoy]{padding:32px 16px 60px}.article-title[data-astro-cid-zgcwdgoy]{font-size:1.7rem}} 3 + </style></head> <body> <div class="page"> <article class="article-page" data-astro-cid-zgcwdgoy> <a class="back-link" href="/" data-astro-cid-zgcwdgoy>&larr; Back</a> <h1 class="article-title" data-astro-cid-zgcwdgoy>Grind 75 problem 11 - 3 Sum</h1> <div class="article-meta" data-astro-cid-zgcwdgoy> <time data-astro-cid-zgcwdgoy>December 30, 2025</time> <span class="pub-name" data-astro-cid-zgcwdgoy> · Nate learns Data Structures and Algorithms</span> </div> <div class="article-tags" data-astro-cid-zgcwdgoy> <span class="tag" data-astro-cid-zgcwdgoy>learning</span><span class="tag" data-astro-cid-zgcwdgoy>ds&amp;a</span><span class="tag" data-astro-cid-zgcwdgoy>leetcode</span> </div> <div class="article-content" data-astro-cid-zzqtqdyh> </div> <a class="external-link" href="https://nate-learns-dsa.leaflet.pub/3mb7suozcms2k" target="_blank" rel="noopener" data-astro-cid-zgcwdgoy> 4 + Read on Nate learns Data Structures and Algorithms &rarr; 5 + </a> </article> </div> <div class="lightbox" id="lightbox" onclick="this.classList.remove('open')"> <img id="lightboxImg" src="" alt=""> </div> <script> 6 + document.addEventListener('keydown', (e) => { 7 + if (e.key === 'Escape') document.getElementById('lightbox')?.classList.remove('open'); 8 + }); 9 + function openLightbox(src) { 10 + document.getElementById('lightboxImg').src = src; 11 + document.getElementById('lightbox').classList.add('open'); 12 + } 13 + </script> </body> </html>
+13
dist/writing/grind-75-problem-12-rotting-oranges/index.html
··· 1 + <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Grind 75 problem 12 - Rotting Oranges — natespilman.com</title><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;1,400&family=Inter:wght@300;400;500&display=swap" rel="stylesheet"><style>:root{--lavender: #b8a9c9;--soft-blue: #89a4c7;--warm-peach: #e8c4a0;--sage: #a8b89c;--rose: #d4a0a0;--cream: #faf5ef;--warm-white: #fdfbf7;--text: #3d3535;--text-light: #6b5e5e;--text-muted: #9a8c8c;--stroke: rgba(61, 53, 53, .08)}*{margin:0;padding:0;box-sizing:border-box}body{font-family:Inter,sans-serif;font-weight:300;color:var(--text);background:var(--warm-white);line-height:1.7;min-height:100vh}body:before{content:"";position:fixed;inset:0;background:radial-gradient(ellipse at 20% 50%,rgba(184,169,201,.15) 0%,transparent 50%),radial-gradient(ellipse at 80% 20%,rgba(137,164,199,.12) 0%,transparent 50%),radial-gradient(ellipse at 60% 80%,rgba(232,196,160,.1) 0%,transparent 50%),radial-gradient(ellipse at 10% 90%,rgba(168,184,156,.08) 0%,transparent 40%);pointer-events:none;z-index:0}a{color:var(--soft-blue);text-decoration:none}a:hover{border-color:var(--soft-blue)}.page{position:relative;z-index:1}.banner{width:100%;height:280px;position:relative;overflow:hidden}.banner img{width:100%;height:100%;object-fit:cover;filter:saturate(.8) contrast(.9) brightness(1.05)}.banner:after{content:"";position:absolute;inset:0;background:linear-gradient(to bottom,transparent 40%,rgba(253,251,247,.3) 70%,var(--warm-white) 100%)}.section-content{max-width:720px;margin:0 auto;padding:0 24px}.card{padding:20px;border:1px solid var(--stroke);border-radius:12px;margin-bottom:12px;animation:fadeIn .4s ease;transition:box-shadow .3s,transform .2s}.card:hover{box-shadow:0 4px 16px #3d35350f;transform:translateY(-1px)}.card-title{font-family:Playfair Display,serif;font-size:1.1rem;color:var(--text);margin-bottom:4px}.card-meta{font-size:.78rem;color:var(--text-muted);margin-bottom:8px}.card-desc{font-size:.85rem;color:var(--text-light);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.tag{display:inline-block;font-size:.7rem;color:var(--soft-blue);background:#89a4c71a;padding:2px 8px;border-radius:10px;margin-right:4px;margin-bottom:4px}.loading{text-align:center;padding:40px 0;color:var(--text-muted);font-size:.9rem}.loading-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--lavender);margin:0 3px;animation:pulse 1.4s infinite ease-in-out}.loading-dot:nth-child(2){animation-delay:.2s}.loading-dot:nth-child(3){animation-delay:.4s}.empty-state{text-align:center;padding:60px 20px;color:var(--text-muted);font-style:italic}.error-state{text-align:center;padding:40px 20px;color:var(--rose)}.load-more{display:block;margin:24px auto;padding:10px 32px;border:1px solid var(--stroke);border-radius:24px;background:transparent;font-family:Inter,sans-serif;font-size:.85rem;color:var(--text-muted);cursor:pointer;transition:all .3s}.load-more:hover{border-color:var(--lavender);color:var(--text);box-shadow:0 2px 8px #b8a9c926}.load-more:disabled{opacity:.4;cursor:default}@keyframes fadeIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%,80%,to{transform:scale(.6);opacity:.4}40%{transform:scale(1);opacity:1}}.lightbox{position:fixed;inset:0;background:#000000d9;z-index:1000;display:none;align-items:center;justify-content:center;cursor:pointer}.lightbox.open{display:flex}.lightbox img{max-width:90vw;max-height:90vh;object-fit:contain;border-radius:4px}@media(max-width:600px){.banner{height:180px}} 2 + .article-content[data-astro-cid-zzqtqdyh]{font-size:.95rem;line-height:1.8}.article-content[data-astro-cid-zzqtqdyh] p{margin-bottom:1em}.article-content[data-astro-cid-zzqtqdyh] h2{font-family:Playfair Display,serif;font-size:1.4rem;margin:1.5em 0 .5em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] h3{font-family:Playfair Display,serif;font-size:1.15rem;margin:1.2em 0 .4em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] pre{background:#1e1e2e;color:#cdd6f4;padding:16px;border-radius:8px;overflow-x:auto;margin:1em 0;font-size:.82rem;line-height:1.5}.article-content[data-astro-cid-zzqtqdyh] code{font-family:SF Mono,Fira Code,monospace;font-size:.85em}.article-content[data-astro-cid-zzqtqdyh] p code{background:#89a4c71f;padding:2px 5px;border-radius:3px;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] ul{margin:.5em 0 1em 1.5em}.article-content[data-astro-cid-zzqtqdyh] li{margin-bottom:.3em}.article-content[data-astro-cid-zzqtqdyh] a{color:var(--soft-blue);border-bottom:1px solid rgba(137,164,199,.3)}.image-placeholder[data-astro-cid-zzqtqdyh]{color:var(--text-muted);font-style:italic}.article-page[data-astro-cid-zgcwdgoy]{max-width:680px;margin:0 auto;padding:48px 24px 80px}.back-link[data-astro-cid-zgcwdgoy]{display:inline-block;font-size:.85rem;color:var(--soft-blue);text-decoration:none;margin-bottom:32px;border-bottom:1px solid transparent;transition:border-color .2s}.back-link[data-astro-cid-zgcwdgoy]:hover{border-bottom-color:var(--soft-blue)}.article-title[data-astro-cid-zgcwdgoy]{font-family:Playfair Display,serif;font-size:2.2rem;font-weight:700;letter-spacing:-.02em;color:var(--text);margin-bottom:12px;line-height:1.2}.article-meta[data-astro-cid-zgcwdgoy]{font-size:.85rem;color:var(--text-muted);margin-bottom:16px}.pub-name[data-astro-cid-zgcwdgoy]{color:var(--soft-blue)}.article-tags[data-astro-cid-zgcwdgoy]{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:20px}.article-desc[data-astro-cid-zgcwdgoy]{font-size:1.05rem;color:var(--text-light);margin-bottom:32px;line-height:1.6;border-left:3px solid var(--lavender);padding-left:16px}.external-link[data-astro-cid-zgcwdgoy]{display:inline-block;margin-top:40px;padding:12px 24px;font-size:.9rem;color:var(--soft-blue);border:1px solid var(--soft-blue);border-radius:24px;text-decoration:none;transition:all .25s}.external-link[data-astro-cid-zgcwdgoy]:hover{background:var(--soft-blue);color:#fff}@media(max-width:600px){.article-page[data-astro-cid-zgcwdgoy]{padding:32px 16px 60px}.article-title[data-astro-cid-zgcwdgoy]{font-size:1.7rem}} 3 + </style></head> <body> <div class="page"> <article class="article-page" data-astro-cid-zgcwdgoy> <a class="back-link" href="/" data-astro-cid-zgcwdgoy>&larr; Back</a> <h1 class="article-title" data-astro-cid-zgcwdgoy>Grind 75 problem 12 - Rotting Oranges</h1> <div class="article-meta" data-astro-cid-zgcwdgoy> <time data-astro-cid-zgcwdgoy>December 30, 2025</time> <span class="pub-name" data-astro-cid-zgcwdgoy> · Nate learns Data Structures and Algorithms</span> </div> <div class="article-content" data-astro-cid-zzqtqdyh> </div> <a class="external-link" href="https://nate-learns-dsa.leaflet.pub/3mb7wg3m4hc2p" target="_blank" rel="noopener" data-astro-cid-zgcwdgoy> 4 + Read on Nate learns Data Structures and Algorithms &rarr; 5 + </a> </article> </div> <div class="lightbox" id="lightbox" onclick="this.classList.remove('open')"> <img id="lightboxImg" src="" alt=""> </div> <script> 6 + document.addEventListener('keydown', (e) => { 7 + if (e.key === 'Escape') document.getElementById('lightbox')?.classList.remove('open'); 8 + }); 9 + function openLightbox(src) { 10 + document.getElementById('lightboxImg').src = src; 11 + document.getElementById('lightbox').classList.add('open'); 12 + } 13 + </script> </body> </html>
+13
dist/writing/grind-75-problem-13-letter-combination-of-a-phone-number/index.html
··· 1 + <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Grind 75 problem 13 - Letter Combination of a Phone Number — natespilman.com</title><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;1,400&family=Inter:wght@300;400;500&display=swap" rel="stylesheet"><style>:root{--lavender: #b8a9c9;--soft-blue: #89a4c7;--warm-peach: #e8c4a0;--sage: #a8b89c;--rose: #d4a0a0;--cream: #faf5ef;--warm-white: #fdfbf7;--text: #3d3535;--text-light: #6b5e5e;--text-muted: #9a8c8c;--stroke: rgba(61, 53, 53, .08)}*{margin:0;padding:0;box-sizing:border-box}body{font-family:Inter,sans-serif;font-weight:300;color:var(--text);background:var(--warm-white);line-height:1.7;min-height:100vh}body:before{content:"";position:fixed;inset:0;background:radial-gradient(ellipse at 20% 50%,rgba(184,169,201,.15) 0%,transparent 50%),radial-gradient(ellipse at 80% 20%,rgba(137,164,199,.12) 0%,transparent 50%),radial-gradient(ellipse at 60% 80%,rgba(232,196,160,.1) 0%,transparent 50%),radial-gradient(ellipse at 10% 90%,rgba(168,184,156,.08) 0%,transparent 40%);pointer-events:none;z-index:0}a{color:var(--soft-blue);text-decoration:none}a:hover{border-color:var(--soft-blue)}.page{position:relative;z-index:1}.banner{width:100%;height:280px;position:relative;overflow:hidden}.banner img{width:100%;height:100%;object-fit:cover;filter:saturate(.8) contrast(.9) brightness(1.05)}.banner:after{content:"";position:absolute;inset:0;background:linear-gradient(to bottom,transparent 40%,rgba(253,251,247,.3) 70%,var(--warm-white) 100%)}.section-content{max-width:720px;margin:0 auto;padding:0 24px}.card{padding:20px;border:1px solid var(--stroke);border-radius:12px;margin-bottom:12px;animation:fadeIn .4s ease;transition:box-shadow .3s,transform .2s}.card:hover{box-shadow:0 4px 16px #3d35350f;transform:translateY(-1px)}.card-title{font-family:Playfair Display,serif;font-size:1.1rem;color:var(--text);margin-bottom:4px}.card-meta{font-size:.78rem;color:var(--text-muted);margin-bottom:8px}.card-desc{font-size:.85rem;color:var(--text-light);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.tag{display:inline-block;font-size:.7rem;color:var(--soft-blue);background:#89a4c71a;padding:2px 8px;border-radius:10px;margin-right:4px;margin-bottom:4px}.loading{text-align:center;padding:40px 0;color:var(--text-muted);font-size:.9rem}.loading-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--lavender);margin:0 3px;animation:pulse 1.4s infinite ease-in-out}.loading-dot:nth-child(2){animation-delay:.2s}.loading-dot:nth-child(3){animation-delay:.4s}.empty-state{text-align:center;padding:60px 20px;color:var(--text-muted);font-style:italic}.error-state{text-align:center;padding:40px 20px;color:var(--rose)}.load-more{display:block;margin:24px auto;padding:10px 32px;border:1px solid var(--stroke);border-radius:24px;background:transparent;font-family:Inter,sans-serif;font-size:.85rem;color:var(--text-muted);cursor:pointer;transition:all .3s}.load-more:hover{border-color:var(--lavender);color:var(--text);box-shadow:0 2px 8px #b8a9c926}.load-more:disabled{opacity:.4;cursor:default}@keyframes fadeIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%,80%,to{transform:scale(.6);opacity:.4}40%{transform:scale(1);opacity:1}}.lightbox{position:fixed;inset:0;background:#000000d9;z-index:1000;display:none;align-items:center;justify-content:center;cursor:pointer}.lightbox.open{display:flex}.lightbox img{max-width:90vw;max-height:90vh;object-fit:contain;border-radius:4px}@media(max-width:600px){.banner{height:180px}} 2 + .article-content[data-astro-cid-zzqtqdyh]{font-size:.95rem;line-height:1.8}.article-content[data-astro-cid-zzqtqdyh] p{margin-bottom:1em}.article-content[data-astro-cid-zzqtqdyh] h2{font-family:Playfair Display,serif;font-size:1.4rem;margin:1.5em 0 .5em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] h3{font-family:Playfair Display,serif;font-size:1.15rem;margin:1.2em 0 .4em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] pre{background:#1e1e2e;color:#cdd6f4;padding:16px;border-radius:8px;overflow-x:auto;margin:1em 0;font-size:.82rem;line-height:1.5}.article-content[data-astro-cid-zzqtqdyh] code{font-family:SF Mono,Fira Code,monospace;font-size:.85em}.article-content[data-astro-cid-zzqtqdyh] p code{background:#89a4c71f;padding:2px 5px;border-radius:3px;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] ul{margin:.5em 0 1em 1.5em}.article-content[data-astro-cid-zzqtqdyh] li{margin-bottom:.3em}.article-content[data-astro-cid-zzqtqdyh] a{color:var(--soft-blue);border-bottom:1px solid rgba(137,164,199,.3)}.image-placeholder[data-astro-cid-zzqtqdyh]{color:var(--text-muted);font-style:italic}.article-page[data-astro-cid-zgcwdgoy]{max-width:680px;margin:0 auto;padding:48px 24px 80px}.back-link[data-astro-cid-zgcwdgoy]{display:inline-block;font-size:.85rem;color:var(--soft-blue);text-decoration:none;margin-bottom:32px;border-bottom:1px solid transparent;transition:border-color .2s}.back-link[data-astro-cid-zgcwdgoy]:hover{border-bottom-color:var(--soft-blue)}.article-title[data-astro-cid-zgcwdgoy]{font-family:Playfair Display,serif;font-size:2.2rem;font-weight:700;letter-spacing:-.02em;color:var(--text);margin-bottom:12px;line-height:1.2}.article-meta[data-astro-cid-zgcwdgoy]{font-size:.85rem;color:var(--text-muted);margin-bottom:16px}.pub-name[data-astro-cid-zgcwdgoy]{color:var(--soft-blue)}.article-tags[data-astro-cid-zgcwdgoy]{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:20px}.article-desc[data-astro-cid-zgcwdgoy]{font-size:1.05rem;color:var(--text-light);margin-bottom:32px;line-height:1.6;border-left:3px solid var(--lavender);padding-left:16px}.external-link[data-astro-cid-zgcwdgoy]{display:inline-block;margin-top:40px;padding:12px 24px;font-size:.9rem;color:var(--soft-blue);border:1px solid var(--soft-blue);border-radius:24px;text-decoration:none;transition:all .25s}.external-link[data-astro-cid-zgcwdgoy]:hover{background:var(--soft-blue);color:#fff}@media(max-width:600px){.article-page[data-astro-cid-zgcwdgoy]{padding:32px 16px 60px}.article-title[data-astro-cid-zgcwdgoy]{font-size:1.7rem}} 3 + </style></head> <body> <div class="page"> <article class="article-page" data-astro-cid-zgcwdgoy> <a class="back-link" href="/" data-astro-cid-zgcwdgoy>&larr; Back</a> <h1 class="article-title" data-astro-cid-zgcwdgoy>Grind 75 problem 13 - Letter Combination of a Phone Number</h1> <div class="article-meta" data-astro-cid-zgcwdgoy> <time data-astro-cid-zgcwdgoy>December 31, 2025</time> <span class="pub-name" data-astro-cid-zgcwdgoy> · Nate learns Data Structures and Algorithms</span> </div> <div class="article-tags" data-astro-cid-zgcwdgoy> <span class="tag" data-astro-cid-zgcwdgoy>ds&amp;a</span><span class="tag" data-astro-cid-zgcwdgoy>learning</span><span class="tag" data-astro-cid-zgcwdgoy>leetcode</span> </div> <div class="article-content" data-astro-cid-zzqtqdyh> </div> <a class="external-link" href="https://nate-learns-dsa.leaflet.pub/3mbcersy6vs2q" target="_blank" rel="noopener" data-astro-cid-zgcwdgoy> 4 + Read on Nate learns Data Structures and Algorithms &rarr; 5 + </a> </article> </div> <div class="lightbox" id="lightbox" onclick="this.classList.remove('open')"> <img id="lightboxImg" src="" alt=""> </div> <script> 6 + document.addEventListener('keydown', (e) => { 7 + if (e.key === 'Escape') document.getElementById('lightbox')?.classList.remove('open'); 8 + }); 9 + function openLightbox(src) { 10 + document.getElementById('lightboxImg').src = src; 11 + document.getElementById('lightbox').classList.add('open'); 12 + } 13 + </script> </body> </html>
+13
dist/writing/grind-75-problem-2-longest-substring-without-repeating/index.html
··· 1 + <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Grind 75 Problem 2 - Longest Substring Without Repeating — natespilman.com</title><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;1,400&family=Inter:wght@300;400;500&display=swap" rel="stylesheet"><style>:root{--lavender: #b8a9c9;--soft-blue: #89a4c7;--warm-peach: #e8c4a0;--sage: #a8b89c;--rose: #d4a0a0;--cream: #faf5ef;--warm-white: #fdfbf7;--text: #3d3535;--text-light: #6b5e5e;--text-muted: #9a8c8c;--stroke: rgba(61, 53, 53, .08)}*{margin:0;padding:0;box-sizing:border-box}body{font-family:Inter,sans-serif;font-weight:300;color:var(--text);background:var(--warm-white);line-height:1.7;min-height:100vh}body:before{content:"";position:fixed;inset:0;background:radial-gradient(ellipse at 20% 50%,rgba(184,169,201,.15) 0%,transparent 50%),radial-gradient(ellipse at 80% 20%,rgba(137,164,199,.12) 0%,transparent 50%),radial-gradient(ellipse at 60% 80%,rgba(232,196,160,.1) 0%,transparent 50%),radial-gradient(ellipse at 10% 90%,rgba(168,184,156,.08) 0%,transparent 40%);pointer-events:none;z-index:0}a{color:var(--soft-blue);text-decoration:none}a:hover{border-color:var(--soft-blue)}.page{position:relative;z-index:1}.banner{width:100%;height:280px;position:relative;overflow:hidden}.banner img{width:100%;height:100%;object-fit:cover;filter:saturate(.8) contrast(.9) brightness(1.05)}.banner:after{content:"";position:absolute;inset:0;background:linear-gradient(to bottom,transparent 40%,rgba(253,251,247,.3) 70%,var(--warm-white) 100%)}.section-content{max-width:720px;margin:0 auto;padding:0 24px}.card{padding:20px;border:1px solid var(--stroke);border-radius:12px;margin-bottom:12px;animation:fadeIn .4s ease;transition:box-shadow .3s,transform .2s}.card:hover{box-shadow:0 4px 16px #3d35350f;transform:translateY(-1px)}.card-title{font-family:Playfair Display,serif;font-size:1.1rem;color:var(--text);margin-bottom:4px}.card-meta{font-size:.78rem;color:var(--text-muted);margin-bottom:8px}.card-desc{font-size:.85rem;color:var(--text-light);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.tag{display:inline-block;font-size:.7rem;color:var(--soft-blue);background:#89a4c71a;padding:2px 8px;border-radius:10px;margin-right:4px;margin-bottom:4px}.loading{text-align:center;padding:40px 0;color:var(--text-muted);font-size:.9rem}.loading-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--lavender);margin:0 3px;animation:pulse 1.4s infinite ease-in-out}.loading-dot:nth-child(2){animation-delay:.2s}.loading-dot:nth-child(3){animation-delay:.4s}.empty-state{text-align:center;padding:60px 20px;color:var(--text-muted);font-style:italic}.error-state{text-align:center;padding:40px 20px;color:var(--rose)}.load-more{display:block;margin:24px auto;padding:10px 32px;border:1px solid var(--stroke);border-radius:24px;background:transparent;font-family:Inter,sans-serif;font-size:.85rem;color:var(--text-muted);cursor:pointer;transition:all .3s}.load-more:hover{border-color:var(--lavender);color:var(--text);box-shadow:0 2px 8px #b8a9c926}.load-more:disabled{opacity:.4;cursor:default}@keyframes fadeIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%,80%,to{transform:scale(.6);opacity:.4}40%{transform:scale(1);opacity:1}}.lightbox{position:fixed;inset:0;background:#000000d9;z-index:1000;display:none;align-items:center;justify-content:center;cursor:pointer}.lightbox.open{display:flex}.lightbox img{max-width:90vw;max-height:90vh;object-fit:contain;border-radius:4px}@media(max-width:600px){.banner{height:180px}} 2 + .article-content[data-astro-cid-zzqtqdyh]{font-size:.95rem;line-height:1.8}.article-content[data-astro-cid-zzqtqdyh] p{margin-bottom:1em}.article-content[data-astro-cid-zzqtqdyh] h2{font-family:Playfair Display,serif;font-size:1.4rem;margin:1.5em 0 .5em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] h3{font-family:Playfair Display,serif;font-size:1.15rem;margin:1.2em 0 .4em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] pre{background:#1e1e2e;color:#cdd6f4;padding:16px;border-radius:8px;overflow-x:auto;margin:1em 0;font-size:.82rem;line-height:1.5}.article-content[data-astro-cid-zzqtqdyh] code{font-family:SF Mono,Fira Code,monospace;font-size:.85em}.article-content[data-astro-cid-zzqtqdyh] p code{background:#89a4c71f;padding:2px 5px;border-radius:3px;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] ul{margin:.5em 0 1em 1.5em}.article-content[data-astro-cid-zzqtqdyh] li{margin-bottom:.3em}.article-content[data-astro-cid-zzqtqdyh] a{color:var(--soft-blue);border-bottom:1px solid rgba(137,164,199,.3)}.image-placeholder[data-astro-cid-zzqtqdyh]{color:var(--text-muted);font-style:italic}.article-page[data-astro-cid-zgcwdgoy]{max-width:680px;margin:0 auto;padding:48px 24px 80px}.back-link[data-astro-cid-zgcwdgoy]{display:inline-block;font-size:.85rem;color:var(--soft-blue);text-decoration:none;margin-bottom:32px;border-bottom:1px solid transparent;transition:border-color .2s}.back-link[data-astro-cid-zgcwdgoy]:hover{border-bottom-color:var(--soft-blue)}.article-title[data-astro-cid-zgcwdgoy]{font-family:Playfair Display,serif;font-size:2.2rem;font-weight:700;letter-spacing:-.02em;color:var(--text);margin-bottom:12px;line-height:1.2}.article-meta[data-astro-cid-zgcwdgoy]{font-size:.85rem;color:var(--text-muted);margin-bottom:16px}.pub-name[data-astro-cid-zgcwdgoy]{color:var(--soft-blue)}.article-tags[data-astro-cid-zgcwdgoy]{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:20px}.article-desc[data-astro-cid-zgcwdgoy]{font-size:1.05rem;color:var(--text-light);margin-bottom:32px;line-height:1.6;border-left:3px solid var(--lavender);padding-left:16px}.external-link[data-astro-cid-zgcwdgoy]{display:inline-block;margin-top:40px;padding:12px 24px;font-size:.9rem;color:var(--soft-blue);border:1px solid var(--soft-blue);border-radius:24px;text-decoration:none;transition:all .25s}.external-link[data-astro-cid-zgcwdgoy]:hover{background:var(--soft-blue);color:#fff}@media(max-width:600px){.article-page[data-astro-cid-zgcwdgoy]{padding:32px 16px 60px}.article-title[data-astro-cid-zgcwdgoy]{font-size:1.7rem}} 3 + </style></head> <body> <div class="page"> <article class="article-page" data-astro-cid-zgcwdgoy> <a class="back-link" href="/" data-astro-cid-zgcwdgoy>&larr; Back</a> <h1 class="article-title" data-astro-cid-zgcwdgoy>Grind 75 Problem 2 - Longest Substring Without Repeating</h1> <div class="article-meta" data-astro-cid-zgcwdgoy> <time data-astro-cid-zgcwdgoy>November 13, 2025</time> <span class="pub-name" data-astro-cid-zgcwdgoy> · Nate learns Data Structures and Algorithms</span> </div> <div class="article-content" data-astro-cid-zzqtqdyh> </div> <a class="external-link" href="https://nate-learns-dsa.leaflet.pub/3m5kw3yc4ak2b" target="_blank" rel="noopener" data-astro-cid-zgcwdgoy> 4 + Read on Nate learns Data Structures and Algorithms &rarr; 5 + </a> </article> </div> <div class="lightbox" id="lightbox" onclick="this.classList.remove('open')"> <img id="lightboxImg" src="" alt=""> </div> <script> 6 + document.addEventListener('keydown', (e) => { 7 + if (e.key === 'Escape') document.getElementById('lightbox')?.classList.remove('open'); 8 + }); 9 + function openLightbox(src) { 10 + document.getElementById('lightboxImg').src = src; 11 + document.getElementById('lightbox').classList.add('open'); 12 + } 13 + </script> </body> </html>
+13
dist/writing/grind-75-problem-3-longest-palindromic-substring/index.html
··· 1 + <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Grind 75 Problem 3 - Longest Palindromic Substring — natespilman.com</title><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;1,400&family=Inter:wght@300;400;500&display=swap" rel="stylesheet"><style>:root{--lavender: #b8a9c9;--soft-blue: #89a4c7;--warm-peach: #e8c4a0;--sage: #a8b89c;--rose: #d4a0a0;--cream: #faf5ef;--warm-white: #fdfbf7;--text: #3d3535;--text-light: #6b5e5e;--text-muted: #9a8c8c;--stroke: rgba(61, 53, 53, .08)}*{margin:0;padding:0;box-sizing:border-box}body{font-family:Inter,sans-serif;font-weight:300;color:var(--text);background:var(--warm-white);line-height:1.7;min-height:100vh}body:before{content:"";position:fixed;inset:0;background:radial-gradient(ellipse at 20% 50%,rgba(184,169,201,.15) 0%,transparent 50%),radial-gradient(ellipse at 80% 20%,rgba(137,164,199,.12) 0%,transparent 50%),radial-gradient(ellipse at 60% 80%,rgba(232,196,160,.1) 0%,transparent 50%),radial-gradient(ellipse at 10% 90%,rgba(168,184,156,.08) 0%,transparent 40%);pointer-events:none;z-index:0}a{color:var(--soft-blue);text-decoration:none}a:hover{border-color:var(--soft-blue)}.page{position:relative;z-index:1}.banner{width:100%;height:280px;position:relative;overflow:hidden}.banner img{width:100%;height:100%;object-fit:cover;filter:saturate(.8) contrast(.9) brightness(1.05)}.banner:after{content:"";position:absolute;inset:0;background:linear-gradient(to bottom,transparent 40%,rgba(253,251,247,.3) 70%,var(--warm-white) 100%)}.section-content{max-width:720px;margin:0 auto;padding:0 24px}.card{padding:20px;border:1px solid var(--stroke);border-radius:12px;margin-bottom:12px;animation:fadeIn .4s ease;transition:box-shadow .3s,transform .2s}.card:hover{box-shadow:0 4px 16px #3d35350f;transform:translateY(-1px)}.card-title{font-family:Playfair Display,serif;font-size:1.1rem;color:var(--text);margin-bottom:4px}.card-meta{font-size:.78rem;color:var(--text-muted);margin-bottom:8px}.card-desc{font-size:.85rem;color:var(--text-light);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.tag{display:inline-block;font-size:.7rem;color:var(--soft-blue);background:#89a4c71a;padding:2px 8px;border-radius:10px;margin-right:4px;margin-bottom:4px}.loading{text-align:center;padding:40px 0;color:var(--text-muted);font-size:.9rem}.loading-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--lavender);margin:0 3px;animation:pulse 1.4s infinite ease-in-out}.loading-dot:nth-child(2){animation-delay:.2s}.loading-dot:nth-child(3){animation-delay:.4s}.empty-state{text-align:center;padding:60px 20px;color:var(--text-muted);font-style:italic}.error-state{text-align:center;padding:40px 20px;color:var(--rose)}.load-more{display:block;margin:24px auto;padding:10px 32px;border:1px solid var(--stroke);border-radius:24px;background:transparent;font-family:Inter,sans-serif;font-size:.85rem;color:var(--text-muted);cursor:pointer;transition:all .3s}.load-more:hover{border-color:var(--lavender);color:var(--text);box-shadow:0 2px 8px #b8a9c926}.load-more:disabled{opacity:.4;cursor:default}@keyframes fadeIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%,80%,to{transform:scale(.6);opacity:.4}40%{transform:scale(1);opacity:1}}.lightbox{position:fixed;inset:0;background:#000000d9;z-index:1000;display:none;align-items:center;justify-content:center;cursor:pointer}.lightbox.open{display:flex}.lightbox img{max-width:90vw;max-height:90vh;object-fit:contain;border-radius:4px}@media(max-width:600px){.banner{height:180px}} 2 + .article-content[data-astro-cid-zzqtqdyh]{font-size:.95rem;line-height:1.8}.article-content[data-astro-cid-zzqtqdyh] p{margin-bottom:1em}.article-content[data-astro-cid-zzqtqdyh] h2{font-family:Playfair Display,serif;font-size:1.4rem;margin:1.5em 0 .5em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] h3{font-family:Playfair Display,serif;font-size:1.15rem;margin:1.2em 0 .4em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] pre{background:#1e1e2e;color:#cdd6f4;padding:16px;border-radius:8px;overflow-x:auto;margin:1em 0;font-size:.82rem;line-height:1.5}.article-content[data-astro-cid-zzqtqdyh] code{font-family:SF Mono,Fira Code,monospace;font-size:.85em}.article-content[data-astro-cid-zzqtqdyh] p code{background:#89a4c71f;padding:2px 5px;border-radius:3px;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] ul{margin:.5em 0 1em 1.5em}.article-content[data-astro-cid-zzqtqdyh] li{margin-bottom:.3em}.article-content[data-astro-cid-zzqtqdyh] a{color:var(--soft-blue);border-bottom:1px solid rgba(137,164,199,.3)}.image-placeholder[data-astro-cid-zzqtqdyh]{color:var(--text-muted);font-style:italic}.article-page[data-astro-cid-zgcwdgoy]{max-width:680px;margin:0 auto;padding:48px 24px 80px}.back-link[data-astro-cid-zgcwdgoy]{display:inline-block;font-size:.85rem;color:var(--soft-blue);text-decoration:none;margin-bottom:32px;border-bottom:1px solid transparent;transition:border-color .2s}.back-link[data-astro-cid-zgcwdgoy]:hover{border-bottom-color:var(--soft-blue)}.article-title[data-astro-cid-zgcwdgoy]{font-family:Playfair Display,serif;font-size:2.2rem;font-weight:700;letter-spacing:-.02em;color:var(--text);margin-bottom:12px;line-height:1.2}.article-meta[data-astro-cid-zgcwdgoy]{font-size:.85rem;color:var(--text-muted);margin-bottom:16px}.pub-name[data-astro-cid-zgcwdgoy]{color:var(--soft-blue)}.article-tags[data-astro-cid-zgcwdgoy]{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:20px}.article-desc[data-astro-cid-zgcwdgoy]{font-size:1.05rem;color:var(--text-light);margin-bottom:32px;line-height:1.6;border-left:3px solid var(--lavender);padding-left:16px}.external-link[data-astro-cid-zgcwdgoy]{display:inline-block;margin-top:40px;padding:12px 24px;font-size:.9rem;color:var(--soft-blue);border:1px solid var(--soft-blue);border-radius:24px;text-decoration:none;transition:all .25s}.external-link[data-astro-cid-zgcwdgoy]:hover{background:var(--soft-blue);color:#fff}@media(max-width:600px){.article-page[data-astro-cid-zgcwdgoy]{padding:32px 16px 60px}.article-title[data-astro-cid-zgcwdgoy]{font-size:1.7rem}} 3 + </style></head> <body> <div class="page"> <article class="article-page" data-astro-cid-zgcwdgoy> <a class="back-link" href="/" data-astro-cid-zgcwdgoy>&larr; Back</a> <h1 class="article-title" data-astro-cid-zgcwdgoy>Grind 75 Problem 3 - Longest Palindromic Substring</h1> <div class="article-meta" data-astro-cid-zgcwdgoy> <time data-astro-cid-zgcwdgoy>November 15, 2025</time> <span class="pub-name" data-astro-cid-zgcwdgoy> · Nate learns Data Structures and Algorithms</span> </div> <div class="article-content" data-astro-cid-zzqtqdyh> </div> <a class="external-link" href="https://nate-learns-dsa.leaflet.pub/3m5p4hj4br22j" target="_blank" rel="noopener" data-astro-cid-zgcwdgoy> 4 + Read on Nate learns Data Structures and Algorithms &rarr; 5 + </a> </article> </div> <div class="lightbox" id="lightbox" onclick="this.classList.remove('open')"> <img id="lightboxImg" src="" alt=""> </div> <script> 6 + document.addEventListener('keydown', (e) => { 7 + if (e.key === 'Escape') document.getElementById('lightbox')?.classList.remove('open'); 8 + }); 9 + function openLightbox(src) { 10 + document.getElementById('lightboxImg').src = src; 11 + document.getElementById('lightbox').classList.add('open'); 12 + } 13 + </script> </body> </html>
+13
dist/writing/grind-75-problem-4-clone-graph/index.html
··· 1 + <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Grind 75 Problem 4 - Clone Graph — natespilman.com</title><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;1,400&family=Inter:wght@300;400;500&display=swap" rel="stylesheet"><style>:root{--lavender: #b8a9c9;--soft-blue: #89a4c7;--warm-peach: #e8c4a0;--sage: #a8b89c;--rose: #d4a0a0;--cream: #faf5ef;--warm-white: #fdfbf7;--text: #3d3535;--text-light: #6b5e5e;--text-muted: #9a8c8c;--stroke: rgba(61, 53, 53, .08)}*{margin:0;padding:0;box-sizing:border-box}body{font-family:Inter,sans-serif;font-weight:300;color:var(--text);background:var(--warm-white);line-height:1.7;min-height:100vh}body:before{content:"";position:fixed;inset:0;background:radial-gradient(ellipse at 20% 50%,rgba(184,169,201,.15) 0%,transparent 50%),radial-gradient(ellipse at 80% 20%,rgba(137,164,199,.12) 0%,transparent 50%),radial-gradient(ellipse at 60% 80%,rgba(232,196,160,.1) 0%,transparent 50%),radial-gradient(ellipse at 10% 90%,rgba(168,184,156,.08) 0%,transparent 40%);pointer-events:none;z-index:0}a{color:var(--soft-blue);text-decoration:none}a:hover{border-color:var(--soft-blue)}.page{position:relative;z-index:1}.banner{width:100%;height:280px;position:relative;overflow:hidden}.banner img{width:100%;height:100%;object-fit:cover;filter:saturate(.8) contrast(.9) brightness(1.05)}.banner:after{content:"";position:absolute;inset:0;background:linear-gradient(to bottom,transparent 40%,rgba(253,251,247,.3) 70%,var(--warm-white) 100%)}.section-content{max-width:720px;margin:0 auto;padding:0 24px}.card{padding:20px;border:1px solid var(--stroke);border-radius:12px;margin-bottom:12px;animation:fadeIn .4s ease;transition:box-shadow .3s,transform .2s}.card:hover{box-shadow:0 4px 16px #3d35350f;transform:translateY(-1px)}.card-title{font-family:Playfair Display,serif;font-size:1.1rem;color:var(--text);margin-bottom:4px}.card-meta{font-size:.78rem;color:var(--text-muted);margin-bottom:8px}.card-desc{font-size:.85rem;color:var(--text-light);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.tag{display:inline-block;font-size:.7rem;color:var(--soft-blue);background:#89a4c71a;padding:2px 8px;border-radius:10px;margin-right:4px;margin-bottom:4px}.loading{text-align:center;padding:40px 0;color:var(--text-muted);font-size:.9rem}.loading-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--lavender);margin:0 3px;animation:pulse 1.4s infinite ease-in-out}.loading-dot:nth-child(2){animation-delay:.2s}.loading-dot:nth-child(3){animation-delay:.4s}.empty-state{text-align:center;padding:60px 20px;color:var(--text-muted);font-style:italic}.error-state{text-align:center;padding:40px 20px;color:var(--rose)}.load-more{display:block;margin:24px auto;padding:10px 32px;border:1px solid var(--stroke);border-radius:24px;background:transparent;font-family:Inter,sans-serif;font-size:.85rem;color:var(--text-muted);cursor:pointer;transition:all .3s}.load-more:hover{border-color:var(--lavender);color:var(--text);box-shadow:0 2px 8px #b8a9c926}.load-more:disabled{opacity:.4;cursor:default}@keyframes fadeIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%,80%,to{transform:scale(.6);opacity:.4}40%{transform:scale(1);opacity:1}}.lightbox{position:fixed;inset:0;background:#000000d9;z-index:1000;display:none;align-items:center;justify-content:center;cursor:pointer}.lightbox.open{display:flex}.lightbox img{max-width:90vw;max-height:90vh;object-fit:contain;border-radius:4px}@media(max-width:600px){.banner{height:180px}} 2 + .article-content[data-astro-cid-zzqtqdyh]{font-size:.95rem;line-height:1.8}.article-content[data-astro-cid-zzqtqdyh] p{margin-bottom:1em}.article-content[data-astro-cid-zzqtqdyh] h2{font-family:Playfair Display,serif;font-size:1.4rem;margin:1.5em 0 .5em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] h3{font-family:Playfair Display,serif;font-size:1.15rem;margin:1.2em 0 .4em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] pre{background:#1e1e2e;color:#cdd6f4;padding:16px;border-radius:8px;overflow-x:auto;margin:1em 0;font-size:.82rem;line-height:1.5}.article-content[data-astro-cid-zzqtqdyh] code{font-family:SF Mono,Fira Code,monospace;font-size:.85em}.article-content[data-astro-cid-zzqtqdyh] p code{background:#89a4c71f;padding:2px 5px;border-radius:3px;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] ul{margin:.5em 0 1em 1.5em}.article-content[data-astro-cid-zzqtqdyh] li{margin-bottom:.3em}.article-content[data-astro-cid-zzqtqdyh] a{color:var(--soft-blue);border-bottom:1px solid rgba(137,164,199,.3)}.image-placeholder[data-astro-cid-zzqtqdyh]{color:var(--text-muted);font-style:italic}.article-page[data-astro-cid-zgcwdgoy]{max-width:680px;margin:0 auto;padding:48px 24px 80px}.back-link[data-astro-cid-zgcwdgoy]{display:inline-block;font-size:.85rem;color:var(--soft-blue);text-decoration:none;margin-bottom:32px;border-bottom:1px solid transparent;transition:border-color .2s}.back-link[data-astro-cid-zgcwdgoy]:hover{border-bottom-color:var(--soft-blue)}.article-title[data-astro-cid-zgcwdgoy]{font-family:Playfair Display,serif;font-size:2.2rem;font-weight:700;letter-spacing:-.02em;color:var(--text);margin-bottom:12px;line-height:1.2}.article-meta[data-astro-cid-zgcwdgoy]{font-size:.85rem;color:var(--text-muted);margin-bottom:16px}.pub-name[data-astro-cid-zgcwdgoy]{color:var(--soft-blue)}.article-tags[data-astro-cid-zgcwdgoy]{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:20px}.article-desc[data-astro-cid-zgcwdgoy]{font-size:1.05rem;color:var(--text-light);margin-bottom:32px;line-height:1.6;border-left:3px solid var(--lavender);padding-left:16px}.external-link[data-astro-cid-zgcwdgoy]{display:inline-block;margin-top:40px;padding:12px 24px;font-size:.9rem;color:var(--soft-blue);border:1px solid var(--soft-blue);border-radius:24px;text-decoration:none;transition:all .25s}.external-link[data-astro-cid-zgcwdgoy]:hover{background:var(--soft-blue);color:#fff}@media(max-width:600px){.article-page[data-astro-cid-zgcwdgoy]{padding:32px 16px 60px}.article-title[data-astro-cid-zgcwdgoy]{font-size:1.7rem}} 3 + </style></head> <body> <div class="page"> <article class="article-page" data-astro-cid-zgcwdgoy> <a class="back-link" href="/" data-astro-cid-zgcwdgoy>&larr; Back</a> <h1 class="article-title" data-astro-cid-zgcwdgoy>Grind 75 Problem 4 - Clone Graph</h1> <div class="article-meta" data-astro-cid-zgcwdgoy> <time data-astro-cid-zgcwdgoy>November 19, 2025</time> <span class="pub-name" data-astro-cid-zgcwdgoy> · Nate learns Data Structures and Algorithms</span> </div> <div class="article-content" data-astro-cid-zzqtqdyh> </div> <a class="external-link" href="https://nate-learns-dsa.leaflet.pub/3m5yo2raoas2o" target="_blank" rel="noopener" data-astro-cid-zgcwdgoy> 4 + Read on Nate learns Data Structures and Algorithms &rarr; 5 + </a> </article> </div> <div class="lightbox" id="lightbox" onclick="this.classList.remove('open')"> <img id="lightboxImg" src="" alt=""> </div> <script> 6 + document.addEventListener('keydown', (e) => { 7 + if (e.key === 'Escape') document.getElementById('lightbox')?.classList.remove('open'); 8 + }); 9 + function openLightbox(src) { 10 + document.getElementById('lightboxImg').src = src; 11 + document.getElementById('lightbox').classList.add('open'); 12 + } 13 + </script> </body> </html>
+13
dist/writing/grind-75-problem-5-ransom-note/index.html
··· 1 + <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Grind 75 problem 5 - Ransom Note — natespilman.com</title><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;1,400&family=Inter:wght@300;400;500&display=swap" rel="stylesheet"><style>:root{--lavender: #b8a9c9;--soft-blue: #89a4c7;--warm-peach: #e8c4a0;--sage: #a8b89c;--rose: #d4a0a0;--cream: #faf5ef;--warm-white: #fdfbf7;--text: #3d3535;--text-light: #6b5e5e;--text-muted: #9a8c8c;--stroke: rgba(61, 53, 53, .08)}*{margin:0;padding:0;box-sizing:border-box}body{font-family:Inter,sans-serif;font-weight:300;color:var(--text);background:var(--warm-white);line-height:1.7;min-height:100vh}body:before{content:"";position:fixed;inset:0;background:radial-gradient(ellipse at 20% 50%,rgba(184,169,201,.15) 0%,transparent 50%),radial-gradient(ellipse at 80% 20%,rgba(137,164,199,.12) 0%,transparent 50%),radial-gradient(ellipse at 60% 80%,rgba(232,196,160,.1) 0%,transparent 50%),radial-gradient(ellipse at 10% 90%,rgba(168,184,156,.08) 0%,transparent 40%);pointer-events:none;z-index:0}a{color:var(--soft-blue);text-decoration:none}a:hover{border-color:var(--soft-blue)}.page{position:relative;z-index:1}.banner{width:100%;height:280px;position:relative;overflow:hidden}.banner img{width:100%;height:100%;object-fit:cover;filter:saturate(.8) contrast(.9) brightness(1.05)}.banner:after{content:"";position:absolute;inset:0;background:linear-gradient(to bottom,transparent 40%,rgba(253,251,247,.3) 70%,var(--warm-white) 100%)}.section-content{max-width:720px;margin:0 auto;padding:0 24px}.card{padding:20px;border:1px solid var(--stroke);border-radius:12px;margin-bottom:12px;animation:fadeIn .4s ease;transition:box-shadow .3s,transform .2s}.card:hover{box-shadow:0 4px 16px #3d35350f;transform:translateY(-1px)}.card-title{font-family:Playfair Display,serif;font-size:1.1rem;color:var(--text);margin-bottom:4px}.card-meta{font-size:.78rem;color:var(--text-muted);margin-bottom:8px}.card-desc{font-size:.85rem;color:var(--text-light);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.tag{display:inline-block;font-size:.7rem;color:var(--soft-blue);background:#89a4c71a;padding:2px 8px;border-radius:10px;margin-right:4px;margin-bottom:4px}.loading{text-align:center;padding:40px 0;color:var(--text-muted);font-size:.9rem}.loading-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--lavender);margin:0 3px;animation:pulse 1.4s infinite ease-in-out}.loading-dot:nth-child(2){animation-delay:.2s}.loading-dot:nth-child(3){animation-delay:.4s}.empty-state{text-align:center;padding:60px 20px;color:var(--text-muted);font-style:italic}.error-state{text-align:center;padding:40px 20px;color:var(--rose)}.load-more{display:block;margin:24px auto;padding:10px 32px;border:1px solid var(--stroke);border-radius:24px;background:transparent;font-family:Inter,sans-serif;font-size:.85rem;color:var(--text-muted);cursor:pointer;transition:all .3s}.load-more:hover{border-color:var(--lavender);color:var(--text);box-shadow:0 2px 8px #b8a9c926}.load-more:disabled{opacity:.4;cursor:default}@keyframes fadeIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%,80%,to{transform:scale(.6);opacity:.4}40%{transform:scale(1);opacity:1}}.lightbox{position:fixed;inset:0;background:#000000d9;z-index:1000;display:none;align-items:center;justify-content:center;cursor:pointer}.lightbox.open{display:flex}.lightbox img{max-width:90vw;max-height:90vh;object-fit:contain;border-radius:4px}@media(max-width:600px){.banner{height:180px}} 2 + .article-content[data-astro-cid-zzqtqdyh]{font-size:.95rem;line-height:1.8}.article-content[data-astro-cid-zzqtqdyh] p{margin-bottom:1em}.article-content[data-astro-cid-zzqtqdyh] h2{font-family:Playfair Display,serif;font-size:1.4rem;margin:1.5em 0 .5em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] h3{font-family:Playfair Display,serif;font-size:1.15rem;margin:1.2em 0 .4em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] pre{background:#1e1e2e;color:#cdd6f4;padding:16px;border-radius:8px;overflow-x:auto;margin:1em 0;font-size:.82rem;line-height:1.5}.article-content[data-astro-cid-zzqtqdyh] code{font-family:SF Mono,Fira Code,monospace;font-size:.85em}.article-content[data-astro-cid-zzqtqdyh] p code{background:#89a4c71f;padding:2px 5px;border-radius:3px;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] ul{margin:.5em 0 1em 1.5em}.article-content[data-astro-cid-zzqtqdyh] li{margin-bottom:.3em}.article-content[data-astro-cid-zzqtqdyh] a{color:var(--soft-blue);border-bottom:1px solid rgba(137,164,199,.3)}.image-placeholder[data-astro-cid-zzqtqdyh]{color:var(--text-muted);font-style:italic}.article-page[data-astro-cid-zgcwdgoy]{max-width:680px;margin:0 auto;padding:48px 24px 80px}.back-link[data-astro-cid-zgcwdgoy]{display:inline-block;font-size:.85rem;color:var(--soft-blue);text-decoration:none;margin-bottom:32px;border-bottom:1px solid transparent;transition:border-color .2s}.back-link[data-astro-cid-zgcwdgoy]:hover{border-bottom-color:var(--soft-blue)}.article-title[data-astro-cid-zgcwdgoy]{font-family:Playfair Display,serif;font-size:2.2rem;font-weight:700;letter-spacing:-.02em;color:var(--text);margin-bottom:12px;line-height:1.2}.article-meta[data-astro-cid-zgcwdgoy]{font-size:.85rem;color:var(--text-muted);margin-bottom:16px}.pub-name[data-astro-cid-zgcwdgoy]{color:var(--soft-blue)}.article-tags[data-astro-cid-zgcwdgoy]{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:20px}.article-desc[data-astro-cid-zgcwdgoy]{font-size:1.05rem;color:var(--text-light);margin-bottom:32px;line-height:1.6;border-left:3px solid var(--lavender);padding-left:16px}.external-link[data-astro-cid-zgcwdgoy]{display:inline-block;margin-top:40px;padding:12px 24px;font-size:.9rem;color:var(--soft-blue);border:1px solid var(--soft-blue);border-radius:24px;text-decoration:none;transition:all .25s}.external-link[data-astro-cid-zgcwdgoy]:hover{background:var(--soft-blue);color:#fff}@media(max-width:600px){.article-page[data-astro-cid-zgcwdgoy]{padding:32px 16px 60px}.article-title[data-astro-cid-zgcwdgoy]{font-size:1.7rem}} 3 + </style></head> <body> <div class="page"> <article class="article-page" data-astro-cid-zgcwdgoy> <a class="back-link" href="/" data-astro-cid-zgcwdgoy>&larr; Back</a> <h1 class="article-title" data-astro-cid-zgcwdgoy>Grind 75 problem 5 - Ransom Note</h1> <div class="article-meta" data-astro-cid-zgcwdgoy> <time data-astro-cid-zgcwdgoy>November 21, 2025</time> <span class="pub-name" data-astro-cid-zgcwdgoy> · Nate learns Data Structures and Algorithms</span> </div> <p class="article-desc" data-astro-cid-zgcwdgoy>https://leetcode.com/problems/ransom-note/</p> <div class="article-content" data-astro-cid-zzqtqdyh> </div> <a class="external-link" href="https://nate-learns-dsa.leaflet.pub/3m65yr6qous2n" target="_blank" rel="noopener" data-astro-cid-zgcwdgoy> 4 + Read on Nate learns Data Structures and Algorithms &rarr; 5 + </a> </article> </div> <div class="lightbox" id="lightbox" onclick="this.classList.remove('open')"> <img id="lightboxImg" src="" alt=""> </div> <script> 6 + document.addEventListener('keydown', (e) => { 7 + if (e.key === 'Escape') document.getElementById('lightbox')?.classList.remove('open'); 8 + }); 9 + function openLightbox(src) { 10 + document.getElementById('lightboxImg').src = src; 11 + document.getElementById('lightbox').classList.add('open'); 12 + } 13 + </script> </body> </html>
+13
dist/writing/grind-75-problem-6-string-to-integer-atoi/index.html
··· 1 + <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Grind 75 Problem 6 - String to Integer (atoi) — natespilman.com</title><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;1,400&family=Inter:wght@300;400;500&display=swap" rel="stylesheet"><style>:root{--lavender: #b8a9c9;--soft-blue: #89a4c7;--warm-peach: #e8c4a0;--sage: #a8b89c;--rose: #d4a0a0;--cream: #faf5ef;--warm-white: #fdfbf7;--text: #3d3535;--text-light: #6b5e5e;--text-muted: #9a8c8c;--stroke: rgba(61, 53, 53, .08)}*{margin:0;padding:0;box-sizing:border-box}body{font-family:Inter,sans-serif;font-weight:300;color:var(--text);background:var(--warm-white);line-height:1.7;min-height:100vh}body:before{content:"";position:fixed;inset:0;background:radial-gradient(ellipse at 20% 50%,rgba(184,169,201,.15) 0%,transparent 50%),radial-gradient(ellipse at 80% 20%,rgba(137,164,199,.12) 0%,transparent 50%),radial-gradient(ellipse at 60% 80%,rgba(232,196,160,.1) 0%,transparent 50%),radial-gradient(ellipse at 10% 90%,rgba(168,184,156,.08) 0%,transparent 40%);pointer-events:none;z-index:0}a{color:var(--soft-blue);text-decoration:none}a:hover{border-color:var(--soft-blue)}.page{position:relative;z-index:1}.banner{width:100%;height:280px;position:relative;overflow:hidden}.banner img{width:100%;height:100%;object-fit:cover;filter:saturate(.8) contrast(.9) brightness(1.05)}.banner:after{content:"";position:absolute;inset:0;background:linear-gradient(to bottom,transparent 40%,rgba(253,251,247,.3) 70%,var(--warm-white) 100%)}.section-content{max-width:720px;margin:0 auto;padding:0 24px}.card{padding:20px;border:1px solid var(--stroke);border-radius:12px;margin-bottom:12px;animation:fadeIn .4s ease;transition:box-shadow .3s,transform .2s}.card:hover{box-shadow:0 4px 16px #3d35350f;transform:translateY(-1px)}.card-title{font-family:Playfair Display,serif;font-size:1.1rem;color:var(--text);margin-bottom:4px}.card-meta{font-size:.78rem;color:var(--text-muted);margin-bottom:8px}.card-desc{font-size:.85rem;color:var(--text-light);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.tag{display:inline-block;font-size:.7rem;color:var(--soft-blue);background:#89a4c71a;padding:2px 8px;border-radius:10px;margin-right:4px;margin-bottom:4px}.loading{text-align:center;padding:40px 0;color:var(--text-muted);font-size:.9rem}.loading-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--lavender);margin:0 3px;animation:pulse 1.4s infinite ease-in-out}.loading-dot:nth-child(2){animation-delay:.2s}.loading-dot:nth-child(3){animation-delay:.4s}.empty-state{text-align:center;padding:60px 20px;color:var(--text-muted);font-style:italic}.error-state{text-align:center;padding:40px 20px;color:var(--rose)}.load-more{display:block;margin:24px auto;padding:10px 32px;border:1px solid var(--stroke);border-radius:24px;background:transparent;font-family:Inter,sans-serif;font-size:.85rem;color:var(--text-muted);cursor:pointer;transition:all .3s}.load-more:hover{border-color:var(--lavender);color:var(--text);box-shadow:0 2px 8px #b8a9c926}.load-more:disabled{opacity:.4;cursor:default}@keyframes fadeIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%,80%,to{transform:scale(.6);opacity:.4}40%{transform:scale(1);opacity:1}}.lightbox{position:fixed;inset:0;background:#000000d9;z-index:1000;display:none;align-items:center;justify-content:center;cursor:pointer}.lightbox.open{display:flex}.lightbox img{max-width:90vw;max-height:90vh;object-fit:contain;border-radius:4px}@media(max-width:600px){.banner{height:180px}} 2 + .article-content[data-astro-cid-zzqtqdyh]{font-size:.95rem;line-height:1.8}.article-content[data-astro-cid-zzqtqdyh] p{margin-bottom:1em}.article-content[data-astro-cid-zzqtqdyh] h2{font-family:Playfair Display,serif;font-size:1.4rem;margin:1.5em 0 .5em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] h3{font-family:Playfair Display,serif;font-size:1.15rem;margin:1.2em 0 .4em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] pre{background:#1e1e2e;color:#cdd6f4;padding:16px;border-radius:8px;overflow-x:auto;margin:1em 0;font-size:.82rem;line-height:1.5}.article-content[data-astro-cid-zzqtqdyh] code{font-family:SF Mono,Fira Code,monospace;font-size:.85em}.article-content[data-astro-cid-zzqtqdyh] p code{background:#89a4c71f;padding:2px 5px;border-radius:3px;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] ul{margin:.5em 0 1em 1.5em}.article-content[data-astro-cid-zzqtqdyh] li{margin-bottom:.3em}.article-content[data-astro-cid-zzqtqdyh] a{color:var(--soft-blue);border-bottom:1px solid rgba(137,164,199,.3)}.image-placeholder[data-astro-cid-zzqtqdyh]{color:var(--text-muted);font-style:italic}.article-page[data-astro-cid-zgcwdgoy]{max-width:680px;margin:0 auto;padding:48px 24px 80px}.back-link[data-astro-cid-zgcwdgoy]{display:inline-block;font-size:.85rem;color:var(--soft-blue);text-decoration:none;margin-bottom:32px;border-bottom:1px solid transparent;transition:border-color .2s}.back-link[data-astro-cid-zgcwdgoy]:hover{border-bottom-color:var(--soft-blue)}.article-title[data-astro-cid-zgcwdgoy]{font-family:Playfair Display,serif;font-size:2.2rem;font-weight:700;letter-spacing:-.02em;color:var(--text);margin-bottom:12px;line-height:1.2}.article-meta[data-astro-cid-zgcwdgoy]{font-size:.85rem;color:var(--text-muted);margin-bottom:16px}.pub-name[data-astro-cid-zgcwdgoy]{color:var(--soft-blue)}.article-tags[data-astro-cid-zgcwdgoy]{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:20px}.article-desc[data-astro-cid-zgcwdgoy]{font-size:1.05rem;color:var(--text-light);margin-bottom:32px;line-height:1.6;border-left:3px solid var(--lavender);padding-left:16px}.external-link[data-astro-cid-zgcwdgoy]{display:inline-block;margin-top:40px;padding:12px 24px;font-size:.9rem;color:var(--soft-blue);border:1px solid var(--soft-blue);border-radius:24px;text-decoration:none;transition:all .25s}.external-link[data-astro-cid-zgcwdgoy]:hover{background:var(--soft-blue);color:#fff}@media(max-width:600px){.article-page[data-astro-cid-zgcwdgoy]{padding:32px 16px 60px}.article-title[data-astro-cid-zgcwdgoy]{font-size:1.7rem}} 3 + </style></head> <body> <div class="page"> <article class="article-page" data-astro-cid-zgcwdgoy> <a class="back-link" href="/" data-astro-cid-zgcwdgoy>&larr; Back</a> <h1 class="article-title" data-astro-cid-zgcwdgoy>Grind 75 Problem 6 - String to Integer (atoi)</h1> <div class="article-meta" data-astro-cid-zgcwdgoy> <time data-astro-cid-zgcwdgoy>November 26, 2025</time> <span class="pub-name" data-astro-cid-zgcwdgoy> · Nate learns Data Structures and Algorithms</span> </div> <div class="article-content" data-astro-cid-zzqtqdyh> </div> <a class="external-link" href="https://nate-learns-dsa.leaflet.pub/3m6k7xkg6bc2b" target="_blank" rel="noopener" data-astro-cid-zgcwdgoy> 4 + Read on Nate learns Data Structures and Algorithms &rarr; 5 + </a> </article> </div> <div class="lightbox" id="lightbox" onclick="this.classList.remove('open')"> <img id="lightboxImg" src="" alt=""> </div> <script> 6 + document.addEventListener('keydown', (e) => { 7 + if (e.key === 'Escape') document.getElementById('lightbox')?.classList.remove('open'); 8 + }); 9 + function openLightbox(src) { 10 + document.getElementById('lightboxImg').src = src; 11 + document.getElementById('lightbox').classList.add('open'); 12 + } 13 + </script> </body> </html>
+13
dist/writing/grind-75-problem-7-container-with-most-water/index.html
··· 1 + <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Grind 75 problem 7 - Container With Most Water — natespilman.com</title><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;1,400&family=Inter:wght@300;400;500&display=swap" rel="stylesheet"><style>:root{--lavender: #b8a9c9;--soft-blue: #89a4c7;--warm-peach: #e8c4a0;--sage: #a8b89c;--rose: #d4a0a0;--cream: #faf5ef;--warm-white: #fdfbf7;--text: #3d3535;--text-light: #6b5e5e;--text-muted: #9a8c8c;--stroke: rgba(61, 53, 53, .08)}*{margin:0;padding:0;box-sizing:border-box}body{font-family:Inter,sans-serif;font-weight:300;color:var(--text);background:var(--warm-white);line-height:1.7;min-height:100vh}body:before{content:"";position:fixed;inset:0;background:radial-gradient(ellipse at 20% 50%,rgba(184,169,201,.15) 0%,transparent 50%),radial-gradient(ellipse at 80% 20%,rgba(137,164,199,.12) 0%,transparent 50%),radial-gradient(ellipse at 60% 80%,rgba(232,196,160,.1) 0%,transparent 50%),radial-gradient(ellipse at 10% 90%,rgba(168,184,156,.08) 0%,transparent 40%);pointer-events:none;z-index:0}a{color:var(--soft-blue);text-decoration:none}a:hover{border-color:var(--soft-blue)}.page{position:relative;z-index:1}.banner{width:100%;height:280px;position:relative;overflow:hidden}.banner img{width:100%;height:100%;object-fit:cover;filter:saturate(.8) contrast(.9) brightness(1.05)}.banner:after{content:"";position:absolute;inset:0;background:linear-gradient(to bottom,transparent 40%,rgba(253,251,247,.3) 70%,var(--warm-white) 100%)}.section-content{max-width:720px;margin:0 auto;padding:0 24px}.card{padding:20px;border:1px solid var(--stroke);border-radius:12px;margin-bottom:12px;animation:fadeIn .4s ease;transition:box-shadow .3s,transform .2s}.card:hover{box-shadow:0 4px 16px #3d35350f;transform:translateY(-1px)}.card-title{font-family:Playfair Display,serif;font-size:1.1rem;color:var(--text);margin-bottom:4px}.card-meta{font-size:.78rem;color:var(--text-muted);margin-bottom:8px}.card-desc{font-size:.85rem;color:var(--text-light);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.tag{display:inline-block;font-size:.7rem;color:var(--soft-blue);background:#89a4c71a;padding:2px 8px;border-radius:10px;margin-right:4px;margin-bottom:4px}.loading{text-align:center;padding:40px 0;color:var(--text-muted);font-size:.9rem}.loading-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--lavender);margin:0 3px;animation:pulse 1.4s infinite ease-in-out}.loading-dot:nth-child(2){animation-delay:.2s}.loading-dot:nth-child(3){animation-delay:.4s}.empty-state{text-align:center;padding:60px 20px;color:var(--text-muted);font-style:italic}.error-state{text-align:center;padding:40px 20px;color:var(--rose)}.load-more{display:block;margin:24px auto;padding:10px 32px;border:1px solid var(--stroke);border-radius:24px;background:transparent;font-family:Inter,sans-serif;font-size:.85rem;color:var(--text-muted);cursor:pointer;transition:all .3s}.load-more:hover{border-color:var(--lavender);color:var(--text);box-shadow:0 2px 8px #b8a9c926}.load-more:disabled{opacity:.4;cursor:default}@keyframes fadeIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%,80%,to{transform:scale(.6);opacity:.4}40%{transform:scale(1);opacity:1}}.lightbox{position:fixed;inset:0;background:#000000d9;z-index:1000;display:none;align-items:center;justify-content:center;cursor:pointer}.lightbox.open{display:flex}.lightbox img{max-width:90vw;max-height:90vh;object-fit:contain;border-radius:4px}@media(max-width:600px){.banner{height:180px}} 2 + .article-content[data-astro-cid-zzqtqdyh]{font-size:.95rem;line-height:1.8}.article-content[data-astro-cid-zzqtqdyh] p{margin-bottom:1em}.article-content[data-astro-cid-zzqtqdyh] h2{font-family:Playfair Display,serif;font-size:1.4rem;margin:1.5em 0 .5em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] h3{font-family:Playfair Display,serif;font-size:1.15rem;margin:1.2em 0 .4em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] pre{background:#1e1e2e;color:#cdd6f4;padding:16px;border-radius:8px;overflow-x:auto;margin:1em 0;font-size:.82rem;line-height:1.5}.article-content[data-astro-cid-zzqtqdyh] code{font-family:SF Mono,Fira Code,monospace;font-size:.85em}.article-content[data-astro-cid-zzqtqdyh] p code{background:#89a4c71f;padding:2px 5px;border-radius:3px;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] ul{margin:.5em 0 1em 1.5em}.article-content[data-astro-cid-zzqtqdyh] li{margin-bottom:.3em}.article-content[data-astro-cid-zzqtqdyh] a{color:var(--soft-blue);border-bottom:1px solid rgba(137,164,199,.3)}.image-placeholder[data-astro-cid-zzqtqdyh]{color:var(--text-muted);font-style:italic}.article-page[data-astro-cid-zgcwdgoy]{max-width:680px;margin:0 auto;padding:48px 24px 80px}.back-link[data-astro-cid-zgcwdgoy]{display:inline-block;font-size:.85rem;color:var(--soft-blue);text-decoration:none;margin-bottom:32px;border-bottom:1px solid transparent;transition:border-color .2s}.back-link[data-astro-cid-zgcwdgoy]:hover{border-bottom-color:var(--soft-blue)}.article-title[data-astro-cid-zgcwdgoy]{font-family:Playfair Display,serif;font-size:2.2rem;font-weight:700;letter-spacing:-.02em;color:var(--text);margin-bottom:12px;line-height:1.2}.article-meta[data-astro-cid-zgcwdgoy]{font-size:.85rem;color:var(--text-muted);margin-bottom:16px}.pub-name[data-astro-cid-zgcwdgoy]{color:var(--soft-blue)}.article-tags[data-astro-cid-zgcwdgoy]{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:20px}.article-desc[data-astro-cid-zgcwdgoy]{font-size:1.05rem;color:var(--text-light);margin-bottom:32px;line-height:1.6;border-left:3px solid var(--lavender);padding-left:16px}.external-link[data-astro-cid-zgcwdgoy]{display:inline-block;margin-top:40px;padding:12px 24px;font-size:.9rem;color:var(--soft-blue);border:1px solid var(--soft-blue);border-radius:24px;text-decoration:none;transition:all .25s}.external-link[data-astro-cid-zgcwdgoy]:hover{background:var(--soft-blue);color:#fff}@media(max-width:600px){.article-page[data-astro-cid-zgcwdgoy]{padding:32px 16px 60px}.article-title[data-astro-cid-zgcwdgoy]{font-size:1.7rem}} 3 + </style></head> <body> <div class="page"> <article class="article-page" data-astro-cid-zgcwdgoy> <a class="back-link" href="/" data-astro-cid-zgcwdgoy>&larr; Back</a> <h1 class="article-title" data-astro-cid-zgcwdgoy>Grind 75 problem 7 - Container With Most Water</h1> <div class="article-meta" data-astro-cid-zgcwdgoy> <time data-astro-cid-zgcwdgoy>November 26, 2025</time> <span class="pub-name" data-astro-cid-zgcwdgoy> · Nate learns Data Structures and Algorithms</span> </div> <div class="article-content" data-astro-cid-zzqtqdyh> </div> <a class="external-link" href="https://nate-learns-dsa.leaflet.pub/3m6kfiwtues2t" target="_blank" rel="noopener" data-astro-cid-zgcwdgoy> 4 + Read on Nate learns Data Structures and Algorithms &rarr; 5 + </a> </article> </div> <div class="lightbox" id="lightbox" onclick="this.classList.remove('open')"> <img id="lightboxImg" src="" alt=""> </div> <script> 6 + document.addEventListener('keydown', (e) => { 7 + if (e.key === 'Escape') document.getElementById('lightbox')?.classList.remove('open'); 8 + }); 9 + function openLightbox(src) { 10 + document.getElementById('lightboxImg').src = src; 11 + document.getElementById('lightbox').classList.add('open'); 12 + } 13 + </script> </body> </html>
+13
dist/writing/grind-75-problem-8-word-break-attempt-2/index.html
··· 1 + <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Grind 75 problem 8 - Word Break (Attempt 2) — natespilman.com</title><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;1,400&family=Inter:wght@300;400;500&display=swap" rel="stylesheet"><style>:root{--lavender: #b8a9c9;--soft-blue: #89a4c7;--warm-peach: #e8c4a0;--sage: #a8b89c;--rose: #d4a0a0;--cream: #faf5ef;--warm-white: #fdfbf7;--text: #3d3535;--text-light: #6b5e5e;--text-muted: #9a8c8c;--stroke: rgba(61, 53, 53, .08)}*{margin:0;padding:0;box-sizing:border-box}body{font-family:Inter,sans-serif;font-weight:300;color:var(--text);background:var(--warm-white);line-height:1.7;min-height:100vh}body:before{content:"";position:fixed;inset:0;background:radial-gradient(ellipse at 20% 50%,rgba(184,169,201,.15) 0%,transparent 50%),radial-gradient(ellipse at 80% 20%,rgba(137,164,199,.12) 0%,transparent 50%),radial-gradient(ellipse at 60% 80%,rgba(232,196,160,.1) 0%,transparent 50%),radial-gradient(ellipse at 10% 90%,rgba(168,184,156,.08) 0%,transparent 40%);pointer-events:none;z-index:0}a{color:var(--soft-blue);text-decoration:none}a:hover{border-color:var(--soft-blue)}.page{position:relative;z-index:1}.banner{width:100%;height:280px;position:relative;overflow:hidden}.banner img{width:100%;height:100%;object-fit:cover;filter:saturate(.8) contrast(.9) brightness(1.05)}.banner:after{content:"";position:absolute;inset:0;background:linear-gradient(to bottom,transparent 40%,rgba(253,251,247,.3) 70%,var(--warm-white) 100%)}.section-content{max-width:720px;margin:0 auto;padding:0 24px}.card{padding:20px;border:1px solid var(--stroke);border-radius:12px;margin-bottom:12px;animation:fadeIn .4s ease;transition:box-shadow .3s,transform .2s}.card:hover{box-shadow:0 4px 16px #3d35350f;transform:translateY(-1px)}.card-title{font-family:Playfair Display,serif;font-size:1.1rem;color:var(--text);margin-bottom:4px}.card-meta{font-size:.78rem;color:var(--text-muted);margin-bottom:8px}.card-desc{font-size:.85rem;color:var(--text-light);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.tag{display:inline-block;font-size:.7rem;color:var(--soft-blue);background:#89a4c71a;padding:2px 8px;border-radius:10px;margin-right:4px;margin-bottom:4px}.loading{text-align:center;padding:40px 0;color:var(--text-muted);font-size:.9rem}.loading-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--lavender);margin:0 3px;animation:pulse 1.4s infinite ease-in-out}.loading-dot:nth-child(2){animation-delay:.2s}.loading-dot:nth-child(3){animation-delay:.4s}.empty-state{text-align:center;padding:60px 20px;color:var(--text-muted);font-style:italic}.error-state{text-align:center;padding:40px 20px;color:var(--rose)}.load-more{display:block;margin:24px auto;padding:10px 32px;border:1px solid var(--stroke);border-radius:24px;background:transparent;font-family:Inter,sans-serif;font-size:.85rem;color:var(--text-muted);cursor:pointer;transition:all .3s}.load-more:hover{border-color:var(--lavender);color:var(--text);box-shadow:0 2px 8px #b8a9c926}.load-more:disabled{opacity:.4;cursor:default}@keyframes fadeIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%,80%,to{transform:scale(.6);opacity:.4}40%{transform:scale(1);opacity:1}}.lightbox{position:fixed;inset:0;background:#000000d9;z-index:1000;display:none;align-items:center;justify-content:center;cursor:pointer}.lightbox.open{display:flex}.lightbox img{max-width:90vw;max-height:90vh;object-fit:contain;border-radius:4px}@media(max-width:600px){.banner{height:180px}} 2 + .article-content[data-astro-cid-zzqtqdyh]{font-size:.95rem;line-height:1.8}.article-content[data-astro-cid-zzqtqdyh] p{margin-bottom:1em}.article-content[data-astro-cid-zzqtqdyh] h2{font-family:Playfair Display,serif;font-size:1.4rem;margin:1.5em 0 .5em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] h3{font-family:Playfair Display,serif;font-size:1.15rem;margin:1.2em 0 .4em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] pre{background:#1e1e2e;color:#cdd6f4;padding:16px;border-radius:8px;overflow-x:auto;margin:1em 0;font-size:.82rem;line-height:1.5}.article-content[data-astro-cid-zzqtqdyh] code{font-family:SF Mono,Fira Code,monospace;font-size:.85em}.article-content[data-astro-cid-zzqtqdyh] p code{background:#89a4c71f;padding:2px 5px;border-radius:3px;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] ul{margin:.5em 0 1em 1.5em}.article-content[data-astro-cid-zzqtqdyh] li{margin-bottom:.3em}.article-content[data-astro-cid-zzqtqdyh] a{color:var(--soft-blue);border-bottom:1px solid rgba(137,164,199,.3)}.image-placeholder[data-astro-cid-zzqtqdyh]{color:var(--text-muted);font-style:italic}.article-page[data-astro-cid-zgcwdgoy]{max-width:680px;margin:0 auto;padding:48px 24px 80px}.back-link[data-astro-cid-zgcwdgoy]{display:inline-block;font-size:.85rem;color:var(--soft-blue);text-decoration:none;margin-bottom:32px;border-bottom:1px solid transparent;transition:border-color .2s}.back-link[data-astro-cid-zgcwdgoy]:hover{border-bottom-color:var(--soft-blue)}.article-title[data-astro-cid-zgcwdgoy]{font-family:Playfair Display,serif;font-size:2.2rem;font-weight:700;letter-spacing:-.02em;color:var(--text);margin-bottom:12px;line-height:1.2}.article-meta[data-astro-cid-zgcwdgoy]{font-size:.85rem;color:var(--text-muted);margin-bottom:16px}.pub-name[data-astro-cid-zgcwdgoy]{color:var(--soft-blue)}.article-tags[data-astro-cid-zgcwdgoy]{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:20px}.article-desc[data-astro-cid-zgcwdgoy]{font-size:1.05rem;color:var(--text-light);margin-bottom:32px;line-height:1.6;border-left:3px solid var(--lavender);padding-left:16px}.external-link[data-astro-cid-zgcwdgoy]{display:inline-block;margin-top:40px;padding:12px 24px;font-size:.9rem;color:var(--soft-blue);border:1px solid var(--soft-blue);border-radius:24px;text-decoration:none;transition:all .25s}.external-link[data-astro-cid-zgcwdgoy]:hover{background:var(--soft-blue);color:#fff}@media(max-width:600px){.article-page[data-astro-cid-zgcwdgoy]{padding:32px 16px 60px}.article-title[data-astro-cid-zgcwdgoy]{font-size:1.7rem}} 3 + </style></head> <body> <div class="page"> <article class="article-page" data-astro-cid-zgcwdgoy> <a class="back-link" href="/" data-astro-cid-zgcwdgoy>&larr; Back</a> <h1 class="article-title" data-astro-cid-zgcwdgoy>Grind 75 problem 8 - Word Break (Attempt 2)</h1> <div class="article-meta" data-astro-cid-zgcwdgoy> <time data-astro-cid-zgcwdgoy>December 9, 2025</time> <span class="pub-name" data-astro-cid-zgcwdgoy> · Nate learns Data Structures and Algorithms</span> </div> <div class="article-content" data-astro-cid-zzqtqdyh> </div> <a class="external-link" href="https://nate-learns-dsa.leaflet.pub/3m7merpfops2m" target="_blank" rel="noopener" data-astro-cid-zgcwdgoy> 4 + Read on Nate learns Data Structures and Algorithms &rarr; 5 + </a> </article> </div> <div class="lightbox" id="lightbox" onclick="this.classList.remove('open')"> <img id="lightboxImg" src="" alt=""> </div> <script> 6 + document.addEventListener('keydown', (e) => { 7 + if (e.key === 'Escape') document.getElementById('lightbox')?.classList.remove('open'); 8 + }); 9 + function openLightbox(src) { 10 + document.getElementById('lightboxImg').src = src; 11 + document.getElementById('lightbox').classList.add('open'); 12 + } 13 + </script> </body> </html>
+13
dist/writing/grind-75-problem-8-word-break-failed-attempt/index.html
··· 1 + <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Grind 75 problem 8 - Word Break (Failed attempt) — natespilman.com</title><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;1,400&family=Inter:wght@300;400;500&display=swap" rel="stylesheet"><style>:root{--lavender: #b8a9c9;--soft-blue: #89a4c7;--warm-peach: #e8c4a0;--sage: #a8b89c;--rose: #d4a0a0;--cream: #faf5ef;--warm-white: #fdfbf7;--text: #3d3535;--text-light: #6b5e5e;--text-muted: #9a8c8c;--stroke: rgba(61, 53, 53, .08)}*{margin:0;padding:0;box-sizing:border-box}body{font-family:Inter,sans-serif;font-weight:300;color:var(--text);background:var(--warm-white);line-height:1.7;min-height:100vh}body:before{content:"";position:fixed;inset:0;background:radial-gradient(ellipse at 20% 50%,rgba(184,169,201,.15) 0%,transparent 50%),radial-gradient(ellipse at 80% 20%,rgba(137,164,199,.12) 0%,transparent 50%),radial-gradient(ellipse at 60% 80%,rgba(232,196,160,.1) 0%,transparent 50%),radial-gradient(ellipse at 10% 90%,rgba(168,184,156,.08) 0%,transparent 40%);pointer-events:none;z-index:0}a{color:var(--soft-blue);text-decoration:none}a:hover{border-color:var(--soft-blue)}.page{position:relative;z-index:1}.banner{width:100%;height:280px;position:relative;overflow:hidden}.banner img{width:100%;height:100%;object-fit:cover;filter:saturate(.8) contrast(.9) brightness(1.05)}.banner:after{content:"";position:absolute;inset:0;background:linear-gradient(to bottom,transparent 40%,rgba(253,251,247,.3) 70%,var(--warm-white) 100%)}.section-content{max-width:720px;margin:0 auto;padding:0 24px}.card{padding:20px;border:1px solid var(--stroke);border-radius:12px;margin-bottom:12px;animation:fadeIn .4s ease;transition:box-shadow .3s,transform .2s}.card:hover{box-shadow:0 4px 16px #3d35350f;transform:translateY(-1px)}.card-title{font-family:Playfair Display,serif;font-size:1.1rem;color:var(--text);margin-bottom:4px}.card-meta{font-size:.78rem;color:var(--text-muted);margin-bottom:8px}.card-desc{font-size:.85rem;color:var(--text-light);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.tag{display:inline-block;font-size:.7rem;color:var(--soft-blue);background:#89a4c71a;padding:2px 8px;border-radius:10px;margin-right:4px;margin-bottom:4px}.loading{text-align:center;padding:40px 0;color:var(--text-muted);font-size:.9rem}.loading-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--lavender);margin:0 3px;animation:pulse 1.4s infinite ease-in-out}.loading-dot:nth-child(2){animation-delay:.2s}.loading-dot:nth-child(3){animation-delay:.4s}.empty-state{text-align:center;padding:60px 20px;color:var(--text-muted);font-style:italic}.error-state{text-align:center;padding:40px 20px;color:var(--rose)}.load-more{display:block;margin:24px auto;padding:10px 32px;border:1px solid var(--stroke);border-radius:24px;background:transparent;font-family:Inter,sans-serif;font-size:.85rem;color:var(--text-muted);cursor:pointer;transition:all .3s}.load-more:hover{border-color:var(--lavender);color:var(--text);box-shadow:0 2px 8px #b8a9c926}.load-more:disabled{opacity:.4;cursor:default}@keyframes fadeIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%,80%,to{transform:scale(.6);opacity:.4}40%{transform:scale(1);opacity:1}}.lightbox{position:fixed;inset:0;background:#000000d9;z-index:1000;display:none;align-items:center;justify-content:center;cursor:pointer}.lightbox.open{display:flex}.lightbox img{max-width:90vw;max-height:90vh;object-fit:contain;border-radius:4px}@media(max-width:600px){.banner{height:180px}} 2 + .article-content[data-astro-cid-zzqtqdyh]{font-size:.95rem;line-height:1.8}.article-content[data-astro-cid-zzqtqdyh] p{margin-bottom:1em}.article-content[data-astro-cid-zzqtqdyh] h2{font-family:Playfair Display,serif;font-size:1.4rem;margin:1.5em 0 .5em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] h3{font-family:Playfair Display,serif;font-size:1.15rem;margin:1.2em 0 .4em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] pre{background:#1e1e2e;color:#cdd6f4;padding:16px;border-radius:8px;overflow-x:auto;margin:1em 0;font-size:.82rem;line-height:1.5}.article-content[data-astro-cid-zzqtqdyh] code{font-family:SF Mono,Fira Code,monospace;font-size:.85em}.article-content[data-astro-cid-zzqtqdyh] p code{background:#89a4c71f;padding:2px 5px;border-radius:3px;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] ul{margin:.5em 0 1em 1.5em}.article-content[data-astro-cid-zzqtqdyh] li{margin-bottom:.3em}.article-content[data-astro-cid-zzqtqdyh] a{color:var(--soft-blue);border-bottom:1px solid rgba(137,164,199,.3)}.image-placeholder[data-astro-cid-zzqtqdyh]{color:var(--text-muted);font-style:italic}.article-page[data-astro-cid-zgcwdgoy]{max-width:680px;margin:0 auto;padding:48px 24px 80px}.back-link[data-astro-cid-zgcwdgoy]{display:inline-block;font-size:.85rem;color:var(--soft-blue);text-decoration:none;margin-bottom:32px;border-bottom:1px solid transparent;transition:border-color .2s}.back-link[data-astro-cid-zgcwdgoy]:hover{border-bottom-color:var(--soft-blue)}.article-title[data-astro-cid-zgcwdgoy]{font-family:Playfair Display,serif;font-size:2.2rem;font-weight:700;letter-spacing:-.02em;color:var(--text);margin-bottom:12px;line-height:1.2}.article-meta[data-astro-cid-zgcwdgoy]{font-size:.85rem;color:var(--text-muted);margin-bottom:16px}.pub-name[data-astro-cid-zgcwdgoy]{color:var(--soft-blue)}.article-tags[data-astro-cid-zgcwdgoy]{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:20px}.article-desc[data-astro-cid-zgcwdgoy]{font-size:1.05rem;color:var(--text-light);margin-bottom:32px;line-height:1.6;border-left:3px solid var(--lavender);padding-left:16px}.external-link[data-astro-cid-zgcwdgoy]{display:inline-block;margin-top:40px;padding:12px 24px;font-size:.9rem;color:var(--soft-blue);border:1px solid var(--soft-blue);border-radius:24px;text-decoration:none;transition:all .25s}.external-link[data-astro-cid-zgcwdgoy]:hover{background:var(--soft-blue);color:#fff}@media(max-width:600px){.article-page[data-astro-cid-zgcwdgoy]{padding:32px 16px 60px}.article-title[data-astro-cid-zgcwdgoy]{font-size:1.7rem}} 3 + </style></head> <body> <div class="page"> <article class="article-page" data-astro-cid-zgcwdgoy> <a class="back-link" href="/" data-astro-cid-zgcwdgoy>&larr; Back</a> <h1 class="article-title" data-astro-cid-zgcwdgoy>Grind 75 problem 8 - Word Break (Failed attempt)</h1> <div class="article-meta" data-astro-cid-zgcwdgoy> <time data-astro-cid-zgcwdgoy>November 29, 2025</time> <span class="pub-name" data-astro-cid-zgcwdgoy> · Nate learns Data Structures and Algorithms</span> </div> <div class="article-content" data-astro-cid-zzqtqdyh> </div> <a class="external-link" href="https://nate-learns-dsa.leaflet.pub/3m6sjyjd4l22g" target="_blank" rel="noopener" data-astro-cid-zgcwdgoy> 4 + Read on Nate learns Data Structures and Algorithms &rarr; 5 + </a> </article> </div> <div class="lightbox" id="lightbox" onclick="this.classList.remove('open')"> <img id="lightboxImg" src="" alt=""> </div> <script> 6 + document.addEventListener('keydown', (e) => { 7 + if (e.key === 'Escape') document.getElementById('lightbox')?.classList.remove('open'); 8 + }); 9 + function openLightbox(src) { 10 + document.getElementById('lightboxImg').src = src; 11 + document.getElementById('lightbox').classList.add('open'); 12 + } 13 + </script> </body> </html>
+13
dist/writing/grind-75-problem-9-linked-list-cycle/index.html
··· 1 + <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Grind 75 problem 9 - Linked List Cycle — natespilman.com</title><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;1,400&family=Inter:wght@300;400;500&display=swap" rel="stylesheet"><style>:root{--lavender: #b8a9c9;--soft-blue: #89a4c7;--warm-peach: #e8c4a0;--sage: #a8b89c;--rose: #d4a0a0;--cream: #faf5ef;--warm-white: #fdfbf7;--text: #3d3535;--text-light: #6b5e5e;--text-muted: #9a8c8c;--stroke: rgba(61, 53, 53, .08)}*{margin:0;padding:0;box-sizing:border-box}body{font-family:Inter,sans-serif;font-weight:300;color:var(--text);background:var(--warm-white);line-height:1.7;min-height:100vh}body:before{content:"";position:fixed;inset:0;background:radial-gradient(ellipse at 20% 50%,rgba(184,169,201,.15) 0%,transparent 50%),radial-gradient(ellipse at 80% 20%,rgba(137,164,199,.12) 0%,transparent 50%),radial-gradient(ellipse at 60% 80%,rgba(232,196,160,.1) 0%,transparent 50%),radial-gradient(ellipse at 10% 90%,rgba(168,184,156,.08) 0%,transparent 40%);pointer-events:none;z-index:0}a{color:var(--soft-blue);text-decoration:none}a:hover{border-color:var(--soft-blue)}.page{position:relative;z-index:1}.banner{width:100%;height:280px;position:relative;overflow:hidden}.banner img{width:100%;height:100%;object-fit:cover;filter:saturate(.8) contrast(.9) brightness(1.05)}.banner:after{content:"";position:absolute;inset:0;background:linear-gradient(to bottom,transparent 40%,rgba(253,251,247,.3) 70%,var(--warm-white) 100%)}.section-content{max-width:720px;margin:0 auto;padding:0 24px}.card{padding:20px;border:1px solid var(--stroke);border-radius:12px;margin-bottom:12px;animation:fadeIn .4s ease;transition:box-shadow .3s,transform .2s}.card:hover{box-shadow:0 4px 16px #3d35350f;transform:translateY(-1px)}.card-title{font-family:Playfair Display,serif;font-size:1.1rem;color:var(--text);margin-bottom:4px}.card-meta{font-size:.78rem;color:var(--text-muted);margin-bottom:8px}.card-desc{font-size:.85rem;color:var(--text-light);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.tag{display:inline-block;font-size:.7rem;color:var(--soft-blue);background:#89a4c71a;padding:2px 8px;border-radius:10px;margin-right:4px;margin-bottom:4px}.loading{text-align:center;padding:40px 0;color:var(--text-muted);font-size:.9rem}.loading-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--lavender);margin:0 3px;animation:pulse 1.4s infinite ease-in-out}.loading-dot:nth-child(2){animation-delay:.2s}.loading-dot:nth-child(3){animation-delay:.4s}.empty-state{text-align:center;padding:60px 20px;color:var(--text-muted);font-style:italic}.error-state{text-align:center;padding:40px 20px;color:var(--rose)}.load-more{display:block;margin:24px auto;padding:10px 32px;border:1px solid var(--stroke);border-radius:24px;background:transparent;font-family:Inter,sans-serif;font-size:.85rem;color:var(--text-muted);cursor:pointer;transition:all .3s}.load-more:hover{border-color:var(--lavender);color:var(--text);box-shadow:0 2px 8px #b8a9c926}.load-more:disabled{opacity:.4;cursor:default}@keyframes fadeIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%,80%,to{transform:scale(.6);opacity:.4}40%{transform:scale(1);opacity:1}}.lightbox{position:fixed;inset:0;background:#000000d9;z-index:1000;display:none;align-items:center;justify-content:center;cursor:pointer}.lightbox.open{display:flex}.lightbox img{max-width:90vw;max-height:90vh;object-fit:contain;border-radius:4px}@media(max-width:600px){.banner{height:180px}} 2 + .article-content[data-astro-cid-zzqtqdyh]{font-size:.95rem;line-height:1.8}.article-content[data-astro-cid-zzqtqdyh] p{margin-bottom:1em}.article-content[data-astro-cid-zzqtqdyh] h2{font-family:Playfair Display,serif;font-size:1.4rem;margin:1.5em 0 .5em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] h3{font-family:Playfair Display,serif;font-size:1.15rem;margin:1.2em 0 .4em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] pre{background:#1e1e2e;color:#cdd6f4;padding:16px;border-radius:8px;overflow-x:auto;margin:1em 0;font-size:.82rem;line-height:1.5}.article-content[data-astro-cid-zzqtqdyh] code{font-family:SF Mono,Fira Code,monospace;font-size:.85em}.article-content[data-astro-cid-zzqtqdyh] p code{background:#89a4c71f;padding:2px 5px;border-radius:3px;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] ul{margin:.5em 0 1em 1.5em}.article-content[data-astro-cid-zzqtqdyh] li{margin-bottom:.3em}.article-content[data-astro-cid-zzqtqdyh] a{color:var(--soft-blue);border-bottom:1px solid rgba(137,164,199,.3)}.image-placeholder[data-astro-cid-zzqtqdyh]{color:var(--text-muted);font-style:italic}.article-page[data-astro-cid-zgcwdgoy]{max-width:680px;margin:0 auto;padding:48px 24px 80px}.back-link[data-astro-cid-zgcwdgoy]{display:inline-block;font-size:.85rem;color:var(--soft-blue);text-decoration:none;margin-bottom:32px;border-bottom:1px solid transparent;transition:border-color .2s}.back-link[data-astro-cid-zgcwdgoy]:hover{border-bottom-color:var(--soft-blue)}.article-title[data-astro-cid-zgcwdgoy]{font-family:Playfair Display,serif;font-size:2.2rem;font-weight:700;letter-spacing:-.02em;color:var(--text);margin-bottom:12px;line-height:1.2}.article-meta[data-astro-cid-zgcwdgoy]{font-size:.85rem;color:var(--text-muted);margin-bottom:16px}.pub-name[data-astro-cid-zgcwdgoy]{color:var(--soft-blue)}.article-tags[data-astro-cid-zgcwdgoy]{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:20px}.article-desc[data-astro-cid-zgcwdgoy]{font-size:1.05rem;color:var(--text-light);margin-bottom:32px;line-height:1.6;border-left:3px solid var(--lavender);padding-left:16px}.external-link[data-astro-cid-zgcwdgoy]{display:inline-block;margin-top:40px;padding:12px 24px;font-size:.9rem;color:var(--soft-blue);border:1px solid var(--soft-blue);border-radius:24px;text-decoration:none;transition:all .25s}.external-link[data-astro-cid-zgcwdgoy]:hover{background:var(--soft-blue);color:#fff}@media(max-width:600px){.article-page[data-astro-cid-zgcwdgoy]{padding:32px 16px 60px}.article-title[data-astro-cid-zgcwdgoy]{font-size:1.7rem}} 3 + </style></head> <body> <div class="page"> <article class="article-page" data-astro-cid-zgcwdgoy> <a class="back-link" href="/" data-astro-cid-zgcwdgoy>&larr; Back</a> <h1 class="article-title" data-astro-cid-zgcwdgoy>Grind 75 problem 9 - Linked List Cycle</h1> <div class="article-meta" data-astro-cid-zgcwdgoy> <time data-astro-cid-zgcwdgoy>December 10, 2025</time> <span class="pub-name" data-astro-cid-zgcwdgoy> · Nate learns Data Structures and Algorithms</span> </div> <div class="article-content" data-astro-cid-zzqtqdyh> </div> <a class="external-link" href="https://nate-learns-dsa.leaflet.pub/3m7nfixpszk2x" target="_blank" rel="noopener" data-astro-cid-zgcwdgoy> 4 + Read on Nate learns Data Structures and Algorithms &rarr; 5 + </a> </article> </div> <div class="lightbox" id="lightbox" onclick="this.classList.remove('open')"> <img id="lightboxImg" src="" alt=""> </div> <script> 6 + document.addEventListener('keydown', (e) => { 7 + if (e.key === 'Escape') document.getElementById('lightbox')?.classList.remove('open'); 8 + }); 9 + function openLightbox(src) { 10 + document.getElementById('lightboxImg').src = src; 11 + document.getElementById('lightbox').classList.add('open'); 12 + } 13 + </script> </body> </html>
+13
dist/writing/grind-75-study-plan/index.html
··· 1 + <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Grind 75 study plan — natespilman.com</title><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;1,400&family=Inter:wght@300;400;500&display=swap" rel="stylesheet"><style>:root{--lavender: #b8a9c9;--soft-blue: #89a4c7;--warm-peach: #e8c4a0;--sage: #a8b89c;--rose: #d4a0a0;--cream: #faf5ef;--warm-white: #fdfbf7;--text: #3d3535;--text-light: #6b5e5e;--text-muted: #9a8c8c;--stroke: rgba(61, 53, 53, .08)}*{margin:0;padding:0;box-sizing:border-box}body{font-family:Inter,sans-serif;font-weight:300;color:var(--text);background:var(--warm-white);line-height:1.7;min-height:100vh}body:before{content:"";position:fixed;inset:0;background:radial-gradient(ellipse at 20% 50%,rgba(184,169,201,.15) 0%,transparent 50%),radial-gradient(ellipse at 80% 20%,rgba(137,164,199,.12) 0%,transparent 50%),radial-gradient(ellipse at 60% 80%,rgba(232,196,160,.1) 0%,transparent 50%),radial-gradient(ellipse at 10% 90%,rgba(168,184,156,.08) 0%,transparent 40%);pointer-events:none;z-index:0}a{color:var(--soft-blue);text-decoration:none}a:hover{border-color:var(--soft-blue)}.page{position:relative;z-index:1}.banner{width:100%;height:280px;position:relative;overflow:hidden}.banner img{width:100%;height:100%;object-fit:cover;filter:saturate(.8) contrast(.9) brightness(1.05)}.banner:after{content:"";position:absolute;inset:0;background:linear-gradient(to bottom,transparent 40%,rgba(253,251,247,.3) 70%,var(--warm-white) 100%)}.section-content{max-width:720px;margin:0 auto;padding:0 24px}.card{padding:20px;border:1px solid var(--stroke);border-radius:12px;margin-bottom:12px;animation:fadeIn .4s ease;transition:box-shadow .3s,transform .2s}.card:hover{box-shadow:0 4px 16px #3d35350f;transform:translateY(-1px)}.card-title{font-family:Playfair Display,serif;font-size:1.1rem;color:var(--text);margin-bottom:4px}.card-meta{font-size:.78rem;color:var(--text-muted);margin-bottom:8px}.card-desc{font-size:.85rem;color:var(--text-light);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.tag{display:inline-block;font-size:.7rem;color:var(--soft-blue);background:#89a4c71a;padding:2px 8px;border-radius:10px;margin-right:4px;margin-bottom:4px}.loading{text-align:center;padding:40px 0;color:var(--text-muted);font-size:.9rem}.loading-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--lavender);margin:0 3px;animation:pulse 1.4s infinite ease-in-out}.loading-dot:nth-child(2){animation-delay:.2s}.loading-dot:nth-child(3){animation-delay:.4s}.empty-state{text-align:center;padding:60px 20px;color:var(--text-muted);font-style:italic}.error-state{text-align:center;padding:40px 20px;color:var(--rose)}.load-more{display:block;margin:24px auto;padding:10px 32px;border:1px solid var(--stroke);border-radius:24px;background:transparent;font-family:Inter,sans-serif;font-size:.85rem;color:var(--text-muted);cursor:pointer;transition:all .3s}.load-more:hover{border-color:var(--lavender);color:var(--text);box-shadow:0 2px 8px #b8a9c926}.load-more:disabled{opacity:.4;cursor:default}@keyframes fadeIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%,80%,to{transform:scale(.6);opacity:.4}40%{transform:scale(1);opacity:1}}.lightbox{position:fixed;inset:0;background:#000000d9;z-index:1000;display:none;align-items:center;justify-content:center;cursor:pointer}.lightbox.open{display:flex}.lightbox img{max-width:90vw;max-height:90vh;object-fit:contain;border-radius:4px}@media(max-width:600px){.banner{height:180px}} 2 + .article-content[data-astro-cid-zzqtqdyh]{font-size:.95rem;line-height:1.8}.article-content[data-astro-cid-zzqtqdyh] p{margin-bottom:1em}.article-content[data-astro-cid-zzqtqdyh] h2{font-family:Playfair Display,serif;font-size:1.4rem;margin:1.5em 0 .5em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] h3{font-family:Playfair Display,serif;font-size:1.15rem;margin:1.2em 0 .4em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] pre{background:#1e1e2e;color:#cdd6f4;padding:16px;border-radius:8px;overflow-x:auto;margin:1em 0;font-size:.82rem;line-height:1.5}.article-content[data-astro-cid-zzqtqdyh] code{font-family:SF Mono,Fira Code,monospace;font-size:.85em}.article-content[data-astro-cid-zzqtqdyh] p code{background:#89a4c71f;padding:2px 5px;border-radius:3px;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] ul{margin:.5em 0 1em 1.5em}.article-content[data-astro-cid-zzqtqdyh] li{margin-bottom:.3em}.article-content[data-astro-cid-zzqtqdyh] a{color:var(--soft-blue);border-bottom:1px solid rgba(137,164,199,.3)}.image-placeholder[data-astro-cid-zzqtqdyh]{color:var(--text-muted);font-style:italic}.article-page[data-astro-cid-zgcwdgoy]{max-width:680px;margin:0 auto;padding:48px 24px 80px}.back-link[data-astro-cid-zgcwdgoy]{display:inline-block;font-size:.85rem;color:var(--soft-blue);text-decoration:none;margin-bottom:32px;border-bottom:1px solid transparent;transition:border-color .2s}.back-link[data-astro-cid-zgcwdgoy]:hover{border-bottom-color:var(--soft-blue)}.article-title[data-astro-cid-zgcwdgoy]{font-family:Playfair Display,serif;font-size:2.2rem;font-weight:700;letter-spacing:-.02em;color:var(--text);margin-bottom:12px;line-height:1.2}.article-meta[data-astro-cid-zgcwdgoy]{font-size:.85rem;color:var(--text-muted);margin-bottom:16px}.pub-name[data-astro-cid-zgcwdgoy]{color:var(--soft-blue)}.article-tags[data-astro-cid-zgcwdgoy]{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:20px}.article-desc[data-astro-cid-zgcwdgoy]{font-size:1.05rem;color:var(--text-light);margin-bottom:32px;line-height:1.6;border-left:3px solid var(--lavender);padding-left:16px}.external-link[data-astro-cid-zgcwdgoy]{display:inline-block;margin-top:40px;padding:12px 24px;font-size:.9rem;color:var(--soft-blue);border:1px solid var(--soft-blue);border-radius:24px;text-decoration:none;transition:all .25s}.external-link[data-astro-cid-zgcwdgoy]:hover{background:var(--soft-blue);color:#fff}@media(max-width:600px){.article-page[data-astro-cid-zgcwdgoy]{padding:32px 16px 60px}.article-title[data-astro-cid-zgcwdgoy]{font-size:1.7rem}} 3 + </style></head> <body> <div class="page"> <article class="article-page" data-astro-cid-zgcwdgoy> <a class="back-link" href="/" data-astro-cid-zgcwdgoy>&larr; Back</a> <h1 class="article-title" data-astro-cid-zgcwdgoy>Grind 75 study plan</h1> <div class="article-meta" data-astro-cid-zgcwdgoy> <time data-astro-cid-zgcwdgoy>November 11, 2025</time> <span class="pub-name" data-astro-cid-zgcwdgoy> · Nate learns Data Structures and Algorithms</span> </div> <div class="article-tags" data-astro-cid-zgcwdgoy> <span class="tag" data-astro-cid-zgcwdgoy>learning</span><span class="tag" data-astro-cid-zgcwdgoy>ds&amp;a</span> </div> <div class="article-content" data-astro-cid-zzqtqdyh> </div> <a class="external-link" href="https://nate-learns-dsa.leaflet.pub/3m5fu64cl7c2h" target="_blank" rel="noopener" data-astro-cid-zgcwdgoy> 4 + Read on Nate learns Data Structures and Algorithms &rarr; 5 + </a> </article> </div> <div class="lightbox" id="lightbox" onclick="this.classList.remove('open')"> <img id="lightboxImg" src="" alt=""> </div> <script> 6 + document.addEventListener('keydown', (e) => { 7 + if (e.key === 'Escape') document.getElementById('lightbox')?.classList.remove('open'); 8 + }); 9 + function openLightbox(src) { 10 + document.getElementById('lightboxImg').src = src; 11 + document.getElementById('lightbox').classList.add('open'); 12 + } 13 + </script> </body> </html>
+13
dist/writing/the-bluesky-ecosystem-has-the-juice-atproto-for-normies/index.html
··· 1 + <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>The Bluesky ecosystem has the juice (ATProto for normies) — natespilman.com</title><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;1,400&family=Inter:wght@300;400;500&display=swap" rel="stylesheet"><style>:root{--lavender: #b8a9c9;--soft-blue: #89a4c7;--warm-peach: #e8c4a0;--sage: #a8b89c;--rose: #d4a0a0;--cream: #faf5ef;--warm-white: #fdfbf7;--text: #3d3535;--text-light: #6b5e5e;--text-muted: #9a8c8c;--stroke: rgba(61, 53, 53, .08)}*{margin:0;padding:0;box-sizing:border-box}body{font-family:Inter,sans-serif;font-weight:300;color:var(--text);background:var(--warm-white);line-height:1.7;min-height:100vh}body:before{content:"";position:fixed;inset:0;background:radial-gradient(ellipse at 20% 50%,rgba(184,169,201,.15) 0%,transparent 50%),radial-gradient(ellipse at 80% 20%,rgba(137,164,199,.12) 0%,transparent 50%),radial-gradient(ellipse at 60% 80%,rgba(232,196,160,.1) 0%,transparent 50%),radial-gradient(ellipse at 10% 90%,rgba(168,184,156,.08) 0%,transparent 40%);pointer-events:none;z-index:0}a{color:var(--soft-blue);text-decoration:none}a:hover{border-color:var(--soft-blue)}.page{position:relative;z-index:1}.banner{width:100%;height:280px;position:relative;overflow:hidden}.banner img{width:100%;height:100%;object-fit:cover;filter:saturate(.8) contrast(.9) brightness(1.05)}.banner:after{content:"";position:absolute;inset:0;background:linear-gradient(to bottom,transparent 40%,rgba(253,251,247,.3) 70%,var(--warm-white) 100%)}.section-content{max-width:720px;margin:0 auto;padding:0 24px}.card{padding:20px;border:1px solid var(--stroke);border-radius:12px;margin-bottom:12px;animation:fadeIn .4s ease;transition:box-shadow .3s,transform .2s}.card:hover{box-shadow:0 4px 16px #3d35350f;transform:translateY(-1px)}.card-title{font-family:Playfair Display,serif;font-size:1.1rem;color:var(--text);margin-bottom:4px}.card-meta{font-size:.78rem;color:var(--text-muted);margin-bottom:8px}.card-desc{font-size:.85rem;color:var(--text-light);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.tag{display:inline-block;font-size:.7rem;color:var(--soft-blue);background:#89a4c71a;padding:2px 8px;border-radius:10px;margin-right:4px;margin-bottom:4px}.loading{text-align:center;padding:40px 0;color:var(--text-muted);font-size:.9rem}.loading-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--lavender);margin:0 3px;animation:pulse 1.4s infinite ease-in-out}.loading-dot:nth-child(2){animation-delay:.2s}.loading-dot:nth-child(3){animation-delay:.4s}.empty-state{text-align:center;padding:60px 20px;color:var(--text-muted);font-style:italic}.error-state{text-align:center;padding:40px 20px;color:var(--rose)}.load-more{display:block;margin:24px auto;padding:10px 32px;border:1px solid var(--stroke);border-radius:24px;background:transparent;font-family:Inter,sans-serif;font-size:.85rem;color:var(--text-muted);cursor:pointer;transition:all .3s}.load-more:hover{border-color:var(--lavender);color:var(--text);box-shadow:0 2px 8px #b8a9c926}.load-more:disabled{opacity:.4;cursor:default}@keyframes fadeIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%,80%,to{transform:scale(.6);opacity:.4}40%{transform:scale(1);opacity:1}}.lightbox{position:fixed;inset:0;background:#000000d9;z-index:1000;display:none;align-items:center;justify-content:center;cursor:pointer}.lightbox.open{display:flex}.lightbox img{max-width:90vw;max-height:90vh;object-fit:contain;border-radius:4px}@media(max-width:600px){.banner{height:180px}} 2 + .article-content[data-astro-cid-zzqtqdyh]{font-size:.95rem;line-height:1.8}.article-content[data-astro-cid-zzqtqdyh] p{margin-bottom:1em}.article-content[data-astro-cid-zzqtqdyh] h2{font-family:Playfair Display,serif;font-size:1.4rem;margin:1.5em 0 .5em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] h3{font-family:Playfair Display,serif;font-size:1.15rem;margin:1.2em 0 .4em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] pre{background:#1e1e2e;color:#cdd6f4;padding:16px;border-radius:8px;overflow-x:auto;margin:1em 0;font-size:.82rem;line-height:1.5}.article-content[data-astro-cid-zzqtqdyh] code{font-family:SF Mono,Fira Code,monospace;font-size:.85em}.article-content[data-astro-cid-zzqtqdyh] p code{background:#89a4c71f;padding:2px 5px;border-radius:3px;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] ul{margin:.5em 0 1em 1.5em}.article-content[data-astro-cid-zzqtqdyh] li{margin-bottom:.3em}.article-content[data-astro-cid-zzqtqdyh] a{color:var(--soft-blue);border-bottom:1px solid rgba(137,164,199,.3)}.image-placeholder[data-astro-cid-zzqtqdyh]{color:var(--text-muted);font-style:italic}.article-page[data-astro-cid-zgcwdgoy]{max-width:680px;margin:0 auto;padding:48px 24px 80px}.back-link[data-astro-cid-zgcwdgoy]{display:inline-block;font-size:.85rem;color:var(--soft-blue);text-decoration:none;margin-bottom:32px;border-bottom:1px solid transparent;transition:border-color .2s}.back-link[data-astro-cid-zgcwdgoy]:hover{border-bottom-color:var(--soft-blue)}.article-title[data-astro-cid-zgcwdgoy]{font-family:Playfair Display,serif;font-size:2.2rem;font-weight:700;letter-spacing:-.02em;color:var(--text);margin-bottom:12px;line-height:1.2}.article-meta[data-astro-cid-zgcwdgoy]{font-size:.85rem;color:var(--text-muted);margin-bottom:16px}.pub-name[data-astro-cid-zgcwdgoy]{color:var(--soft-blue)}.article-tags[data-astro-cid-zgcwdgoy]{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:20px}.article-desc[data-astro-cid-zgcwdgoy]{font-size:1.05rem;color:var(--text-light);margin-bottom:32px;line-height:1.6;border-left:3px solid var(--lavender);padding-left:16px}.external-link[data-astro-cid-zgcwdgoy]{display:inline-block;margin-top:40px;padding:12px 24px;font-size:.9rem;color:var(--soft-blue);border:1px solid var(--soft-blue);border-radius:24px;text-decoration:none;transition:all .25s}.external-link[data-astro-cid-zgcwdgoy]:hover{background:var(--soft-blue);color:#fff}@media(max-width:600px){.article-page[data-astro-cid-zgcwdgoy]{padding:32px 16px 60px}.article-title[data-astro-cid-zgcwdgoy]{font-size:1.7rem}} 3 + </style></head> <body> <div class="page"> <article class="article-page" data-astro-cid-zgcwdgoy> <a class="back-link" href="/" data-astro-cid-zgcwdgoy>&larr; Back</a> <h1 class="article-title" data-astro-cid-zgcwdgoy>The Bluesky ecosystem has the juice (ATProto for normies)</h1> <div class="article-meta" data-astro-cid-zgcwdgoy> <time data-astro-cid-zgcwdgoy>March 13, 2026</time> <span class="pub-name" data-astro-cid-zgcwdgoy> · Nate Spilman</span> </div> <p class="article-desc" data-astro-cid-zgcwdgoy>An explanation for people who don&#39;t care about software protocols Bluesky is built on top of a new software protocol - https://atproto.com/ - for building distributed networks. If you&#39;re coming to Bluesky from X with zero care about the underlying tech, that&#39;s chill. Right now, your experience is basically the same. Under the hood, Bluesky is hosting your account information and everything. Just like X would. So, so far, same same. But here&#39;s where it starts getting cool.</p> <div class="article-content" data-astro-cid-zzqtqdyh> <p><em>An explanation for people who don&#39;t care about software protocols</em></p><p>Bluesky is built on top of a new software protocol - <a href="https://atproto.com/" target="_blank" rel="noopener">https://atproto.com/</a> - for building distributed networks. If you&#39;re coming to Bluesky from X with zero care about the underlying tech, that&#39;s chill. Right now, your experience is basically the same. Under the hood, Bluesky is hosting your account information and everything. Just like X would.</p><p>So, so far, same same. But here&#39;s where it starts getting cool.</p><p>You see a photo sharing app that&#39;s competing with Instagram. You take a look, and look - you can log directly into it using your Bluesky account. No new password. No new account creation. Then you find a blogging site. Your blog is already reserved at your Bluesky handle. When you want to add an image to your first post, your photo sharing app uploads show up as options. A podcast app, a Goodreads alternative, a neighborhood forum - each one recognizes you instantly. And none of these are made by Bluesky.</p><p>Think of it like email. You can have a Gmail account and send a message to someone on Outlook. Nobody owns &quot;email.&quot; The AT Protocol is trying to do that for social media. <strong>Your identity is yours, and every app knows it.</strong></p><p>It&#39;s already happening. AT Proto stuff that I actually use. And to be clear - these are all built by separate individuals of groups of people. It&#39;s the protocol that links it all together. </p><ul></ul><p>All of these apps recognize your single Bluesky identity. No new accounts. No new passwords. Your data moves with you.</p><p>If you want to try it, <a href="https://bsky.app/" target="_blank" rel="noopener">join Bluesky</a> - it&#39;s free and open. And if you want to nerd out about the protocol stuff, hit me up.</p> </div> <a class="external-link" href="https://pioneer.pckt.blog/the-bluesky-ecosystem-has-the-juice-atproto-for-normies-1w4f8wv" target="_blank" rel="noopener" data-astro-cid-zgcwdgoy> 4 + Read on Nate Spilman &rarr; 5 + </a> </article> </div> <div class="lightbox" id="lightbox" onclick="this.classList.remove('open')"> <img id="lightboxImg" src="" alt=""> </div> <script> 6 + document.addEventListener('keydown', (e) => { 7 + if (e.key === 'Escape') document.getElementById('lightbox')?.classList.remove('open'); 8 + }); 9 + function openLightbox(src) { 10 + document.getElementById('lightboxImg').src = src; 11 + document.getElementById('lightbox').classList.add('open'); 12 + } 13 + </script> </body> </html>
+13
dist/writing/this-is-a-canvas-test/index.html
··· 1 + <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>This is a Canvas test — natespilman.com</title><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;1,400&family=Inter:wght@300;400;500&display=swap" rel="stylesheet"><style>:root{--lavender: #b8a9c9;--soft-blue: #89a4c7;--warm-peach: #e8c4a0;--sage: #a8b89c;--rose: #d4a0a0;--cream: #faf5ef;--warm-white: #fdfbf7;--text: #3d3535;--text-light: #6b5e5e;--text-muted: #9a8c8c;--stroke: rgba(61, 53, 53, .08)}*{margin:0;padding:0;box-sizing:border-box}body{font-family:Inter,sans-serif;font-weight:300;color:var(--text);background:var(--warm-white);line-height:1.7;min-height:100vh}body:before{content:"";position:fixed;inset:0;background:radial-gradient(ellipse at 20% 50%,rgba(184,169,201,.15) 0%,transparent 50%),radial-gradient(ellipse at 80% 20%,rgba(137,164,199,.12) 0%,transparent 50%),radial-gradient(ellipse at 60% 80%,rgba(232,196,160,.1) 0%,transparent 50%),radial-gradient(ellipse at 10% 90%,rgba(168,184,156,.08) 0%,transparent 40%);pointer-events:none;z-index:0}a{color:var(--soft-blue);text-decoration:none}a:hover{border-color:var(--soft-blue)}.page{position:relative;z-index:1}.banner{width:100%;height:280px;position:relative;overflow:hidden}.banner img{width:100%;height:100%;object-fit:cover;filter:saturate(.8) contrast(.9) brightness(1.05)}.banner:after{content:"";position:absolute;inset:0;background:linear-gradient(to bottom,transparent 40%,rgba(253,251,247,.3) 70%,var(--warm-white) 100%)}.section-content{max-width:720px;margin:0 auto;padding:0 24px}.card{padding:20px;border:1px solid var(--stroke);border-radius:12px;margin-bottom:12px;animation:fadeIn .4s ease;transition:box-shadow .3s,transform .2s}.card:hover{box-shadow:0 4px 16px #3d35350f;transform:translateY(-1px)}.card-title{font-family:Playfair Display,serif;font-size:1.1rem;color:var(--text);margin-bottom:4px}.card-meta{font-size:.78rem;color:var(--text-muted);margin-bottom:8px}.card-desc{font-size:.85rem;color:var(--text-light);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.tag{display:inline-block;font-size:.7rem;color:var(--soft-blue);background:#89a4c71a;padding:2px 8px;border-radius:10px;margin-right:4px;margin-bottom:4px}.loading{text-align:center;padding:40px 0;color:var(--text-muted);font-size:.9rem}.loading-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--lavender);margin:0 3px;animation:pulse 1.4s infinite ease-in-out}.loading-dot:nth-child(2){animation-delay:.2s}.loading-dot:nth-child(3){animation-delay:.4s}.empty-state{text-align:center;padding:60px 20px;color:var(--text-muted);font-style:italic}.error-state{text-align:center;padding:40px 20px;color:var(--rose)}.load-more{display:block;margin:24px auto;padding:10px 32px;border:1px solid var(--stroke);border-radius:24px;background:transparent;font-family:Inter,sans-serif;font-size:.85rem;color:var(--text-muted);cursor:pointer;transition:all .3s}.load-more:hover{border-color:var(--lavender);color:var(--text);box-shadow:0 2px 8px #b8a9c926}.load-more:disabled{opacity:.4;cursor:default}@keyframes fadeIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%,80%,to{transform:scale(.6);opacity:.4}40%{transform:scale(1);opacity:1}}.lightbox{position:fixed;inset:0;background:#000000d9;z-index:1000;display:none;align-items:center;justify-content:center;cursor:pointer}.lightbox.open{display:flex}.lightbox img{max-width:90vw;max-height:90vh;object-fit:contain;border-radius:4px}@media(max-width:600px){.banner{height:180px}} 2 + .article-content[data-astro-cid-zzqtqdyh]{font-size:.95rem;line-height:1.8}.article-content[data-astro-cid-zzqtqdyh] p{margin-bottom:1em}.article-content[data-astro-cid-zzqtqdyh] h2{font-family:Playfair Display,serif;font-size:1.4rem;margin:1.5em 0 .5em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] h3{font-family:Playfair Display,serif;font-size:1.15rem;margin:1.2em 0 .4em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] pre{background:#1e1e2e;color:#cdd6f4;padding:16px;border-radius:8px;overflow-x:auto;margin:1em 0;font-size:.82rem;line-height:1.5}.article-content[data-astro-cid-zzqtqdyh] code{font-family:SF Mono,Fira Code,monospace;font-size:.85em}.article-content[data-astro-cid-zzqtqdyh] p code{background:#89a4c71f;padding:2px 5px;border-radius:3px;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] ul{margin:.5em 0 1em 1.5em}.article-content[data-astro-cid-zzqtqdyh] li{margin-bottom:.3em}.article-content[data-astro-cid-zzqtqdyh] a{color:var(--soft-blue);border-bottom:1px solid rgba(137,164,199,.3)}.image-placeholder[data-astro-cid-zzqtqdyh]{color:var(--text-muted);font-style:italic}.article-page[data-astro-cid-zgcwdgoy]{max-width:680px;margin:0 auto;padding:48px 24px 80px}.back-link[data-astro-cid-zgcwdgoy]{display:inline-block;font-size:.85rem;color:var(--soft-blue);text-decoration:none;margin-bottom:32px;border-bottom:1px solid transparent;transition:border-color .2s}.back-link[data-astro-cid-zgcwdgoy]:hover{border-bottom-color:var(--soft-blue)}.article-title[data-astro-cid-zgcwdgoy]{font-family:Playfair Display,serif;font-size:2.2rem;font-weight:700;letter-spacing:-.02em;color:var(--text);margin-bottom:12px;line-height:1.2}.article-meta[data-astro-cid-zgcwdgoy]{font-size:.85rem;color:var(--text-muted);margin-bottom:16px}.pub-name[data-astro-cid-zgcwdgoy]{color:var(--soft-blue)}.article-tags[data-astro-cid-zgcwdgoy]{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:20px}.article-desc[data-astro-cid-zgcwdgoy]{font-size:1.05rem;color:var(--text-light);margin-bottom:32px;line-height:1.6;border-left:3px solid var(--lavender);padding-left:16px}.external-link[data-astro-cid-zgcwdgoy]{display:inline-block;margin-top:40px;padding:12px 24px;font-size:.9rem;color:var(--soft-blue);border:1px solid var(--soft-blue);border-radius:24px;text-decoration:none;transition:all .25s}.external-link[data-astro-cid-zgcwdgoy]:hover{background:var(--soft-blue);color:#fff}@media(max-width:600px){.article-page[data-astro-cid-zgcwdgoy]{padding:32px 16px 60px}.article-title[data-astro-cid-zgcwdgoy]{font-size:1.7rem}} 3 + </style></head> <body> <div class="page"> <article class="article-page" data-astro-cid-zgcwdgoy> <a class="back-link" href="/" data-astro-cid-zgcwdgoy>&larr; Back</a> <h1 class="article-title" data-astro-cid-zgcwdgoy>This is a Canvas test</h1> <div class="article-meta" data-astro-cid-zgcwdgoy> <time data-astro-cid-zgcwdgoy>March 13, 2026</time> <span class="pub-name" data-astro-cid-zgcwdgoy> · Nate Spilman</span> </div> <p class="article-desc" data-astro-cid-zgcwdgoy>Can I really post a Leaflet canvas to my pckt blog?!</p> <div class="article-content" data-astro-cid-zzqtqdyh> </div> <a class="external-link" href="https://pioneer.pckt.blog/3mgxgn42ex224" target="_blank" rel="noopener" data-astro-cid-zgcwdgoy> 4 + Read on Nate Spilman &rarr; 5 + </a> </article> </div> <div class="lightbox" id="lightbox" onclick="this.classList.remove('open')"> <img id="lightboxImg" src="" alt=""> </div> <script> 6 + document.addEventListener('keydown', (e) => { 7 + if (e.key === 'Escape') document.getElementById('lightbox')?.classList.remove('open'); 8 + }); 9 + function openLightbox(src) { 10 + document.getElementById('lightboxImg').src = src; 11 + document.getElementById('lightbox').classList.add('open'); 12 + } 13 + </script> </body> </html>
+13
dist/writing/this-is-lovely/index.html
··· 1 + <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>This is lovely — natespilman.com</title><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;1,400&family=Inter:wght@300;400;500&display=swap" rel="stylesheet"><style>:root{--lavender: #b8a9c9;--soft-blue: #89a4c7;--warm-peach: #e8c4a0;--sage: #a8b89c;--rose: #d4a0a0;--cream: #faf5ef;--warm-white: #fdfbf7;--text: #3d3535;--text-light: #6b5e5e;--text-muted: #9a8c8c;--stroke: rgba(61, 53, 53, .08)}*{margin:0;padding:0;box-sizing:border-box}body{font-family:Inter,sans-serif;font-weight:300;color:var(--text);background:var(--warm-white);line-height:1.7;min-height:100vh}body:before{content:"";position:fixed;inset:0;background:radial-gradient(ellipse at 20% 50%,rgba(184,169,201,.15) 0%,transparent 50%),radial-gradient(ellipse at 80% 20%,rgba(137,164,199,.12) 0%,transparent 50%),radial-gradient(ellipse at 60% 80%,rgba(232,196,160,.1) 0%,transparent 50%),radial-gradient(ellipse at 10% 90%,rgba(168,184,156,.08) 0%,transparent 40%);pointer-events:none;z-index:0}a{color:var(--soft-blue);text-decoration:none}a:hover{border-color:var(--soft-blue)}.page{position:relative;z-index:1}.banner{width:100%;height:280px;position:relative;overflow:hidden}.banner img{width:100%;height:100%;object-fit:cover;filter:saturate(.8) contrast(.9) brightness(1.05)}.banner:after{content:"";position:absolute;inset:0;background:linear-gradient(to bottom,transparent 40%,rgba(253,251,247,.3) 70%,var(--warm-white) 100%)}.section-content{max-width:720px;margin:0 auto;padding:0 24px}.card{padding:20px;border:1px solid var(--stroke);border-radius:12px;margin-bottom:12px;animation:fadeIn .4s ease;transition:box-shadow .3s,transform .2s}.card:hover{box-shadow:0 4px 16px #3d35350f;transform:translateY(-1px)}.card-title{font-family:Playfair Display,serif;font-size:1.1rem;color:var(--text);margin-bottom:4px}.card-meta{font-size:.78rem;color:var(--text-muted);margin-bottom:8px}.card-desc{font-size:.85rem;color:var(--text-light);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.tag{display:inline-block;font-size:.7rem;color:var(--soft-blue);background:#89a4c71a;padding:2px 8px;border-radius:10px;margin-right:4px;margin-bottom:4px}.loading{text-align:center;padding:40px 0;color:var(--text-muted);font-size:.9rem}.loading-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--lavender);margin:0 3px;animation:pulse 1.4s infinite ease-in-out}.loading-dot:nth-child(2){animation-delay:.2s}.loading-dot:nth-child(3){animation-delay:.4s}.empty-state{text-align:center;padding:60px 20px;color:var(--text-muted);font-style:italic}.error-state{text-align:center;padding:40px 20px;color:var(--rose)}.load-more{display:block;margin:24px auto;padding:10px 32px;border:1px solid var(--stroke);border-radius:24px;background:transparent;font-family:Inter,sans-serif;font-size:.85rem;color:var(--text-muted);cursor:pointer;transition:all .3s}.load-more:hover{border-color:var(--lavender);color:var(--text);box-shadow:0 2px 8px #b8a9c926}.load-more:disabled{opacity:.4;cursor:default}@keyframes fadeIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%,80%,to{transform:scale(.6);opacity:.4}40%{transform:scale(1);opacity:1}}.lightbox{position:fixed;inset:0;background:#000000d9;z-index:1000;display:none;align-items:center;justify-content:center;cursor:pointer}.lightbox.open{display:flex}.lightbox img{max-width:90vw;max-height:90vh;object-fit:contain;border-radius:4px}@media(max-width:600px){.banner{height:180px}} 2 + .article-content[data-astro-cid-zzqtqdyh]{font-size:.95rem;line-height:1.8}.article-content[data-astro-cid-zzqtqdyh] p{margin-bottom:1em}.article-content[data-astro-cid-zzqtqdyh] h2{font-family:Playfair Display,serif;font-size:1.4rem;margin:1.5em 0 .5em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] h3{font-family:Playfair Display,serif;font-size:1.15rem;margin:1.2em 0 .4em;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] pre{background:#1e1e2e;color:#cdd6f4;padding:16px;border-radius:8px;overflow-x:auto;margin:1em 0;font-size:.82rem;line-height:1.5}.article-content[data-astro-cid-zzqtqdyh] code{font-family:SF Mono,Fira Code,monospace;font-size:.85em}.article-content[data-astro-cid-zzqtqdyh] p code{background:#89a4c71f;padding:2px 5px;border-radius:3px;color:var(--text)}.article-content[data-astro-cid-zzqtqdyh] ul{margin:.5em 0 1em 1.5em}.article-content[data-astro-cid-zzqtqdyh] li{margin-bottom:.3em}.article-content[data-astro-cid-zzqtqdyh] a{color:var(--soft-blue);border-bottom:1px solid rgba(137,164,199,.3)}.image-placeholder[data-astro-cid-zzqtqdyh]{color:var(--text-muted);font-style:italic}.article-page[data-astro-cid-zgcwdgoy]{max-width:680px;margin:0 auto;padding:48px 24px 80px}.back-link[data-astro-cid-zgcwdgoy]{display:inline-block;font-size:.85rem;color:var(--soft-blue);text-decoration:none;margin-bottom:32px;border-bottom:1px solid transparent;transition:border-color .2s}.back-link[data-astro-cid-zgcwdgoy]:hover{border-bottom-color:var(--soft-blue)}.article-title[data-astro-cid-zgcwdgoy]{font-family:Playfair Display,serif;font-size:2.2rem;font-weight:700;letter-spacing:-.02em;color:var(--text);margin-bottom:12px;line-height:1.2}.article-meta[data-astro-cid-zgcwdgoy]{font-size:.85rem;color:var(--text-muted);margin-bottom:16px}.pub-name[data-astro-cid-zgcwdgoy]{color:var(--soft-blue)}.article-tags[data-astro-cid-zgcwdgoy]{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:20px}.article-desc[data-astro-cid-zgcwdgoy]{font-size:1.05rem;color:var(--text-light);margin-bottom:32px;line-height:1.6;border-left:3px solid var(--lavender);padding-left:16px}.external-link[data-astro-cid-zgcwdgoy]{display:inline-block;margin-top:40px;padding:12px 24px;font-size:.9rem;color:var(--soft-blue);border:1px solid var(--soft-blue);border-radius:24px;text-decoration:none;transition:all .25s}.external-link[data-astro-cid-zgcwdgoy]:hover{background:var(--soft-blue);color:#fff}@media(max-width:600px){.article-page[data-astro-cid-zgcwdgoy]{padding:32px 16px 60px}.article-title[data-astro-cid-zgcwdgoy]{font-size:1.7rem}} 3 + </style></head> <body> <div class="page"> <article class="article-page" data-astro-cid-zgcwdgoy> <a class="back-link" href="/" data-astro-cid-zgcwdgoy>&larr; Back</a> <h1 class="article-title" data-astro-cid-zgcwdgoy>This is lovely</h1> <div class="article-meta" data-astro-cid-zgcwdgoy> <time data-astro-cid-zgcwdgoy>March 13, 2026</time> <span class="pub-name" data-astro-cid-zgcwdgoy> · Nate Spilman</span> </div> <div class="article-tags" data-astro-cid-zgcwdgoy> <span class="tag" data-astro-cid-zgcwdgoy>first-post</span> </div> <p class="article-desc" data-astro-cid-zgcwdgoy>This is my first post on pckt.blog. My first impressions are positive. Things look nice. Everything seems to be put in an obvious place. Like, i click a dropdown and see my options and think &quot;Right - that makes sense to be there.&quot; Here&#39;s an image. It&#39;s only here to demonstrate image add. It IS missing alt text adding, though, which feels like an oddly large accessibility miss.</p> <div class="article-content" data-astro-cid-zzqtqdyh> <p>This is my first post on pckt.blog. My first impressions are positive. Things look nice. Everything seems to be put in an obvious place. Like, i click a dropdown and see my options and think &quot;Right - that makes sense to be there.&quot; </p><p>Here&#39;s an image. It&#39;s only here to demonstrate image add. </p><p>It IS missing alt text adding, though, which feels like an oddly large accessibility miss. </p><p><strong>This is bold.</strong></p><h2>Nice. I can use markdown syntax to make section headers and etc.</h2><p>Nice to see the out of the box support for markdown. I intentionally set a different thumbnail from the image I added above. I can&#39;t see the thumbnail I uploaded anywhere though, so that also feels like a missing nice to have. </p><h2>update - customization</h2><p>They also give you full freedom to make a bunch of bad design decisions while something keeping it looking good. </p> </div> <a class="external-link" href="https://pioneer.pckt.blog/this-is-lovely-h9wvt4e" target="_blank" rel="noopener" data-astro-cid-zgcwdgoy> 4 + Read on Nate Spilman &rarr; 5 + </a> </article> </div> <div class="lightbox" id="lightbox" onclick="this.classList.remove('open')"> <img id="lightboxImg" src="" alt=""> </div> <script> 6 + document.addEventListener('keydown', (e) => { 7 + if (e.key === 'Escape') document.getElementById('lightbox')?.classList.remove('open'); 8 + }); 9 + function openLightbox(src) { 10 + document.getElementById('lightboxImg').src = src; 11 + document.getElementById('lightbox').classList.add('open'); 12 + } 13 + </script> </body> </html>