<!doctype html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>{{ if .IsHome }}{{ .Site.Title }}{{ else }}{{ .Title }}{{ end }}</title>
<meta name="description" content="{{ with .Description }}{{ . }}{{ else }}{{ .Site.Params.description }}{{ end }}">
<link rel="canonical" href="{{ .Permalink }}">
<meta name="keywords" content="{{ .Site.Params.keywords }}">
<meta property="og:title" content="{{ .Title }}">
<meta property="og:description" content="{{ with .Description }}{{ . }}{{ else }}{{ .Site.Params.description }}{{ end }}">
<meta property="og:type" content="{{ if .IsPage }}article{{ else }}website{{ end }}">
<meta property="og:url" content="{{ .Permalink }}">
<meta property="og:site_name" content="{{ .Site.Title }}">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="{{ .Title }}">
<meta name="twitter:description" content="{{ with .Description }}{{ . }}{{ else }}{{ .Site.Params.description }}{{ end }}">
<link rel="alternate" type="application/rss+xml" title="{{ .Site.Title }}" href="{{ "atom.xml" | absURL }}">
<link rel="icon" type="image/x-icon" href="{{ "favicon.ico" | absURL }}">
<link rel="preconnect" href="https://cravatar.cn">
<link rel="dns-prefetch" href="https://bsz.dusays.com:9001">
<script>(function(){try{var e=localStorage.getItem("theme");e||(window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?e="dark":e="light"),document.documentElement.setAttribute("data-theme",e),window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",function(e){if(!localStorage.getItem("theme")){var t=e.matches?"dark":"light";document.documentElement.setAttribute("data-theme",t)}})}catch{}})()</script>
<link rel="preload" href="{{ "font/zql-v2-subset.woff2" | absURL }}" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="{{ "font/remixicon.woff2" | absURL }}" as="font" type="font/woff2" crossorigin>
<script>
window.optionalAssetUrls={echarts:"{{ "js/libs/echarts.min.js" | absURL }}",artalk:"{{ "js/libs/Artalk.min.js" | absURL }}"};
window.loadScriptOnce=window.loadScriptOnce||function(e,t,n){if(t&&window[t]){n();return}var s,o=document.querySelector('script[data-dynamic-src="'+e+'"]');if(o){o.addEventListener("load",n,{once:!0});return}s=document.createElement("script"),s.src=e,s.defer=!0,s.dataset.dynamicSrc=e,s.onload=n,document.head.appendChild(s)};
window.siteConfig={artalk:{server:"{{ .Site.Params.artalkServer }}",site:"{{ .Site.Title }}",emoticons:"{{ "emotion/OwO.json" | absURL }}",gravatar:"https://cravatar.cn/avatar/"},author:{avatar:"{{ .Site.Params.avatar }}",description:"{{ .Site.Params.bio }}"},barrage:{enableHitokoto:!0,hitokotoUrl:"https://v1.hitokoto.cn?c=a&c=b&c=c&c=d&c=i"}};
function _initTwikoo(){var el=document.getElementById("tcomment");if(!el||!window.twikoo)return;el.innerHTML="";twikoo.init({envId:"{{ .Site.Params.twikooEnvId }}",el:"#tcomment",onCommentLoaded:function(){if(typeof _refreshBusuanzi==="function")_refreshBusuanzi();_twkAnimate()}})}
function _twkAnimate(){var S=window._twkObs;if(!S){S=new IntersectionObserver(function(es){for(var i=0;i<es.length;i++){if(es[i].isIntersecting){es[i].target.classList.add("tk-inview");S.unobserve(es[i].target)}}},{threshold:0.05,rootMargin:"0px 0px -30px 0px"});window._twkObs=S}var mc=document.querySelector(".twikoo .tk-comments-container");if(!mc)return;var mo=new MutationObserver(function(){var cs=mc.querySelectorAll(".tk-comment:not(.tk-inview)");for(var i=0;i<cs.length;i++)S.observe(cs[i])});mo.observe(mc,{childList:true,subtree:true});var cs=mc.querySelectorAll(".tk-comment:not(.tk-inview)");for(var i=0;i<cs.length;i++)S.observe(cs[i])}
function _reinitTwikoo(){if(!document.getElementById("tcomment"))return;_initTwikoo()}
</script>
<link rel="stylesheet" href="{{ "css/style.min.css" | absURL }}">
<link rel="stylesheet" href="{{ "css/custom.css" | absURL }}">
<style>html{-webkit-tap-highlight-color:transparent!important}*,:before,:after{outline:0!important;-webkit-tap-highlight-color:transparent!important;-webkit-focus-ring-color:transparent!important}body{background-image:url({{ "image/background/deno.webp" | absURL }})!important;background-size:contain!important;background-repeat:round!important;background-position:50%!important;background-attachment:fixed!important}[data-theme=dark] body{background-image:url({{ "image/background/deno.webp" | absURL }})!important}[data-theme=dark] body::before{content:''!important;position:fixed!important;top:0!important;left:0!important;width:100%!important;height:100%!important;background-color:rgba(0,0,0,.4)!important;pointer-events:none!important;z-index:-1!important}@media(max-width:768px){body{background-attachment:scroll!important}}.code-expand-btn:hover span{color:#24292e!important}[data-theme=dark] .code-expand-btn:hover span{color:#f8f8f2!important}.highlight pre code,.highlight pre{color:#24292e!important}[data-theme=dark] .highlight pre code,[data-theme=dark] .highlight pre{color:#f8f8f2!important}blockquote::before{display:none!important}blockquote{border-left:4px solid rgba(0,0,0,.2)!important;font-style:normal!important}[data-theme=dark] blockquote{border-left-color:rgba(255,255,255,.2)!important}.post-content img{cursor:zoom-in}.toc-overlay{position:fixed;inset:0;z-index:999;background:rgba(0,0,0,.28);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);opacity:0;visibility:hidden;pointer-events:none;transition:opacity .3s,visibility .3s;display:flex;align-items:center;justify-content:center}.toc-overlay.show{opacity:1;visibility:visible;pointer-events:auto}.toc-overlay-content{background:rgba(255,255,255,.92);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:1px solid rgba(0,0,0,.06);border-radius:16px;box-shadow:0 20px 60px rgba(0,0,0,.15);width:86%;max-width:420px;max-height:70vh;display:flex;flex-direction:column;transform:translateY(20px) scale(.96);transition:transform .3s cubic-bezier(.22,.61,.36,1)}.toc-overlay.show .toc-overlay-content{transform:translateY(0) scale(1)}[data-theme=dark] .toc-overlay-content{background:rgba(30,33,40,.94);border-color:rgba(255,255,255,.08);box-shadow:0 20px 60px rgba(0,0,0,.4)}.toc-overlay-header{display:flex;justify-content:space-between;align-items:center;padding:18px 20px 12px;border-bottom:1px solid rgba(0,0,0,.06)}[data-theme=dark] .toc-overlay-header{border-bottom-color:rgba(255,255,255,.06)}.toc-overlay-header h3{margin:0;font-size:1.1rem;color:#333}[data-theme=dark] .toc-overlay-header h3{color:#e5e7eb}.toc-close{font-size:24px;cursor:pointer;color:#999;font-weight:700}.toc-close:hover{color:#333}[data-theme=dark] .toc-close:hover{color:#fff}.toc-overlay-body{padding:12px 8px 18px;overflow-y:auto;max-height:calc(70vh - 60px);scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.15) transparent}.toc-overlay-body::-webkit-scrollbar{width:6px}.toc-overlay-body::-webkit-scrollbar-track{background:transparent}.toc-overlay-body::-webkit-scrollbar-thumb{background:rgba(0,0,0,.15);border-radius:3px}.toc-overlay-body::-webkit-scrollbar-thumb:hover{background:rgba(0,0,0,.25)}[data-theme=dark] .toc-overlay-body::-webkit-scrollbar-thumb{background:rgba(255,255,255,.15)}[data-theme=dark] .toc-overlay-body::-webkit-scrollbar-thumb:hover{background:rgba(255,255,255,.25)}.toc-overlay-body a:hover{background:rgba(0,0,0,.05)!important}[data-theme=dark] .toc-overlay-body a:hover{background:rgba(255,255,255,.08)!important}</style>
<script src="{{ "js/instantpage.min.js" | absURL }}" type="module" defer></script>
<script src="{{ "js/pjax.min.js" | absURL }}" defer></script>
{{ if .Site.Params.twikoo }}<script src="https://cdn.jsdelivr.net/npm/twikoo@1.7.14/dist/twikoo.all.min.js" defer></script>{{ end }}
<meta name="template" content="Amigo">
<link rel="preconnect" href="https://npm.elemecdn.com" crossorigin>
<link rel="stylesheet" href="https://npm.elemecdn.com/lxgw-wenkai-screen-webfont/style.css">
{{ block "head" . }}{{ end }}
</head>
<body>
<script>window.barrageConfig={enableHitokoto:!0,hitokotoUrl:"https://v1.hitokoto.cn?c=a&c=b&c=c&c=d&c=i",hitokotoAvatar:"{{ .Site.Params.avatar }}"}</script>
<div class=barrager></div>
<script defer src="{{ "js/modules/barrage.min.js" | absURL }}"></script>
<div class="main"><div class="container">
<div class="header"><div class="header-top"><div class="header-avatar load-memos-editor" id="theme-toggle-avatar"><img src="{{ .Site.Params.avatar }}" class="blog-img" width="80" height="80" alt="{{ .Site.Title }}" decoding="async" fetchpriority="high"><div class="avatar-theme-tip">点击头像切换昼夜</div></div><div class="header-info"><div class="header-social">
{{- range .Site.Menus.social -}}
<a href="{{ .URL }}" title="{{ .Name }}" target="_blank"><i class="{{ .Identifier }}"></i></a>
{{- end -}}
</div><div class="header-bio">{{ .Site.Params.bio }}</div></div></div>
<nav class="header-menu"><ul class="flat">
{{- range .Site.Menus.main -}}
<li class="active"><a href="{{ .URL }}">{{ .Name }}</a></li>
{{- end -}}
</ul></nav></div>
<div id="pjax-wrapper" style="position:relative;min-height:50vh"><div id="pjax-container">
{{ block "main" . }}{{ end }}
</div></div>
<div class="footer"><div class="nav" style="clear:both">&copy; {{ .Site.Params.startYear }} - 2026<br><a href="https://beian.miit.gov.cn/" target="_blank"><span style="color:#999">{{ .Site.Params.icp }}</span></a><br>{{ .Site.Params.cdn | safeHTML }}</div></div>
</div></div>
<div class="floating-tools">
<a href="javascript:;" id="search-btn" title="搜索文章"><i class="ri-search-line"></i></a>
<a href="javascript:;" id="theme-toggle" title="切换主题"><i class="ri-sun-line"></i></a>
<a href="javascript:;" id="toc-btn" title="文章目录"><i class="ri-list-check"></i></a>
<a href="#Comments" id="to-comments" title="跳转评论"><i class="ri-chat-2-line"></i></a>
<a href="#" id="back-to-top" title="返回顶部"><i class="ri-arrow-up-line"></i></a>
</div>
<div id="toc-overlay" class="toc-overlay">
<div class="toc-overlay-content">
<div class="toc-overlay-header">
<h3>文章目录</h3>
<span class="toc-close" onclick="document.getElementById('toc-overlay').classList.remove('show')">&times;</span>
</div>
<div class="toc-overlay-body" id="toc-body"></div>
</div>
</div>
<div id="search-modal" class="search-modal"><div class="search-modal-content"><div class="search-header"><h3>搜索文章</h3><span class="close-search">&#215;</span></div><div class="search-body"><div class="search-input-wrapper"><input type="text" id="search-input" placeholder="输入关键词搜索..." autocomplete="off"><button id="search-submit"><i class="ri-search-line"></i></button></div><div id="search-results" class="search-results"><p class="search-tip">输入关键词并回车进行搜索</p></div></div></div></div>
<script defer src="{{ "js/core.min.js" | absURL }}"></script>
<script>
document.addEventListener("click",function(e){var n=e.target.closest(".search-result-item");if(!n)return;var h=n.getAttribute("data-href");if(!h)return;e.preventDefault();e.stopPropagation();var sm=document.getElementById("search-modal");if(sm)sm.classList.remove("show");try{window.pjax&&window.pjax.abortRequest&&window.pjax.abortRequest()}catch(x){}window.pjax?pjax.loadUrl(h):window.location.href=h},{capture:true});
document.addEventListener("click",function(e){var tocBtn=e.target.closest("#toc-btn");if(!tocBtn)return;var o=document.getElementById("toc-overlay"),b=document.getElementById("toc-body");if(!o||!b)return;var hs=document.querySelectorAll(".post-content h2,.post-content h3,.post-content h4");if(!hs.length){b.innerHTML="<p style='color:#999;text-align:center'>本文没有目录</p>";o.classList.add("show");return}var h="";hs.forEach(function(el){var lv=parseInt(el.tagName.charAt(1)),ind=(lv-2)*20,id=el.id||el.textContent.trim().replace(/\s+/g,"-");if(!el.id)el.id=id;h+='<a href="#'+id+'" data-toc-link="1" style="display:block;padding:8px 14px;margin-left:'+ind+'px;font-size:'+(16-lv)+'px;color:inherit;text-decoration:none;border-radius:6px;line-height:1.6;cursor:pointer">'+el.textContent+"</a>"});b.innerHTML=h;o.classList.add("show")});
document.addEventListener("click",function(e){var a=e.target.closest('[data-toc-link]');if(!a)return;e.preventDefault();e.stopPropagation();var id=a.getAttribute('href').slice(1);var target=document.getElementById(id);var o=document.getElementById('toc-overlay');if(o)o.classList.remove('show');if(target){setTimeout(function(){target.scrollIntoView({behavior:'smooth',block:'start'})},100)}});
document.addEventListener("click",function(e){if(e.target.id==="toc-overlay")e.target.classList.remove("show")});
document.addEventListener("mouseup",function(e){if(!e.target.closest(".amigo-music-card__seek"))return;var a=AudioManager&&AudioManager._getAudio&&AudioManager._getAudio();if(a&&a.paused&&a.currentTime>0)setTimeout(function(){a.play().catch(function(){})},50)});
/* bfcache: intercept popstate for back/forward to prevent pjax re-fetch & animation replay */
(function(){
  function isBackForward(){var p=performance.getEntriesByType&&performance.getEntriesByType("navigation");if(p&&p.length)return p[0].type==="back_forward";return performance.navigation&&performance.navigation.type===2}
  window.addEventListener("popstate",function(e){if(isBackForward()){e.stopImmediatePropagation()}},true);
})();
/* bsz.js (busuanzi) — loaded globally so it survives PJAX navigation */
window._bszLoaded=false;
(function(){var s=document.createElement('script');s.src='{{ "js/bsz.js" | absURL }}';s.defer=true;s.onload=function(){window._bszLoaded=true};document.head.appendChild(s)})();
function _refreshBusuanzi(){if(window.bsz_fetch)bsz_fetch()}
/* Word count + reading time — called on load and after PJAX navigation */
function _updateWordCount(){
  var el=document.getElementById('post-writing');
  if(!el)return;
  var text=(el.textContent||'').replace(/\s+/g,' ').trim();
  var cjk=(text.match(/[\u4e00-\u9fff\u3400-\u4dbf\uf900-\ufaff]/g)||[]).length;
  var en=(text.match(/[a-zA-Z0-9]+/g)||[]).length;
  var wc=document.getElementById('word-count');
  if(wc)wc.textContent=cjk+en;
  var rt=document.getElementById('reading-time');
  if(rt)rt.textContent=Math.max(1,Math.ceil(cjk/400+en/200));
}
_updateWordCount();_refreshBusuanzi();
/* Search config (global so it survives PJAX navigation) */
window.searchHintText="点击随笔 开始搜索";
window.searchGreetings={afternoon:["下午好！喝杯茶吧","下午茶时间到了","下午适合发呆"],evening:["晚上好！放松一下","今晚月色不错","夜深了，读篇好文"],morning:["早安！元气满满","新的一天，加油","早起的鸟儿有虫吃"],night:["早点睡对皮肤好","夜猫子你好","明天再看吧"],noon:["中午好！记得干饭","午饭吃好了吗，来读篇博客","午后适合摸鱼"]};
window.searchHolidays={"01-01":"元旦快乐！新年新气象","02-14":"情人节快乐！愿有人陪","02-16":"除夕快乐！记得吃饺子","02-17":"春节快乐！恭喜发财","03-03":"元宵快乐！吃汤圆啦","03-08":"女神节快乐！做自己","04-01":"愚人节快乐！别被骗哦","04-05":"清明安康","05-01":"劳动节快乐！放假啦","05-04":"青年节快乐！永远年轻","06-01":"儿童节快乐！童心未泯","06-19":"端午安康！记得吃粽子","08-19":"七夕快乐！今晚月色美","09-25":"中秋快乐！记得吃月饼","10-01":"国庆节快乐！享受假期","10-19":"重阳安康！登高望远","12-25":"圣诞快乐！Merry Xmas"};
document.addEventListener("pjax:send",function(){var c=document.getElementById("pjax-container");if(c){c.classList.add("is-pjax-enter")}});
/* Heatmap: global render + ensure functions (data baked via Hugo template) */
var _heatmapData=[{{ range .Site.RegularPages }}{{ if eq .Section "posts" }}{date:"{{ .Date.Format "2006-01-02" }}",link:"{{ .RelPermalink }}",title:"{{ .Title }}"},{{ end }}{{ end }}];
function renderHeatmap(){
  var u=document.getElementById("heatmap");
  if(!u||!u.offsetWidth||!u.offsetHeight)return false;
  if(!window.echarts)return false;
  var inst=echarts.getInstanceByDom(u);if(inst)inst.dispose();
  var c=echarts.init(u,null,{renderer:"svg"});
  var data=_heatmapData;var t=new Map;
  for(var i=0;i<data.length;i++){var item=data[i];if(!t.has(item.date))t.set(item.date,[]);t.get(item.date).push(item)}
  var d=[];for(var kv of t.entries())d.push([kv[0],kv[1].length]);
  var now=new Date,rs=new Date;rs.setMonth(rs.getMonth()-5);
  var f=echarts.format.formatTime("yyyy-MM-dd",rs),m=echarts.format.formatTime("yyyy-MM-dd",now);
  var isDark=document.documentElement.getAttribute("data-theme")==="dark";
  var lp=["#f0f0f0","#d9d9d9","#a6a6a6","#737373","#000000"],dp=["#1f1f1f","#404040","#737373","#a6a6a6","#ffffff"];
  var pal=isDark?dp:lp,lc=isDark?"#a6a6a6":"#737373";
  c.setOption({tooltip:{padding:10,backgroundColor:isDark?"#2d2d2d":"#fff",borderColor:isDark?"#444":"#eee",borderWidth:1,textStyle:{color:isDark?"#eee":"#333",fontSize:12},formatter:function(e){var dt=e.data[0],items=t.get(dt);if(!items)return;var h='<div style="font-weight:bold;margin-bottom:5px">'+dt+'</div><div style="max-height:150px;overflow-y:auto">';for(var i=0;i<items.length;i++)h+='<div style="margin-bottom:2px"><a href="'+items[i].link+'" target="_blank" style="color:'+(isDark?"#fff":"#000")+';text-decoration:none">'+items[i].title+'</a></div>';return h+'</div>'}},visualMap:{min:0,max:4,type:"piecewise",orient:"horizontal",left:"center",top:0,show:false,inRange:{color:pal.slice(1)}},calendar:{top:30,left:"center",range:[f,m],cellSize:["auto",13],splitLine:{show:false},itemStyle:{color:isDark?"#1f1f1f":"#f0f0f0",borderWidth:2,borderColor:isDark?"#121212":"#fff"},yearLabel:{show:false},monthLabel:{nameMap:"CN",color:lc,fontSize:12},dayLabel:{show:true,firstDay:1,nameMap:["日","一","二","三","四","五","六"],color:lc,fontSize:10}},series:{type:"heatmap",coordinateSystem:"calendar",data:d,itemStyle:{borderRadius:2}}});
  return true;
}
function _ensureHeatmap(){
  if(renderHeatmap())return;
  if(!document.getElementById("heatmap"))return;
  var timer=null;
  var obs=new MutationObserver(function(){
    var u=document.getElementById("heatmap");
    if(!u||!u.offsetWidth||!u.offsetHeight)return;
    obs.disconnect();if(timer)clearTimeout(timer);
    requestAnimationFrame(function(){if(window.echarts)renderHeatmap()});
  });
  obs.observe(document.getElementById("pjax-container")||document.body,{childList:true,subtree:true});
  timer=setTimeout(function(){obs.disconnect()},10000);
}
/* Theme toggle */
new MutationObserver(function(ms){for(var i=0;i<ms.length;i++){if(ms[i].type==="attributes"&&ms[i].attributeName==="data-theme"&&document.getElementById("heatmap"))renderHeatmap()}}).observe(document.documentElement,{attributes:true});
/* Bootstrap: load echarts if needed, then try render */
if(window.echarts){requestAnimationFrame(_ensureHeatmap)}
else if(window.optionalAssetUrls&&window.optionalAssetUrls.echarts&&window.loadScriptOnce){window.loadScriptOnce(window.optionalAssetUrls.echarts,"echarts",function(){_ensureHeatmap()})}
/* PJAX navigation */
document.addEventListener("pjax:complete",function(){var c=document.getElementById("pjax-container");if(c){c.style.opacity='1';c.style.transform='none';c.style.transition='none';c.offsetHeight;c.classList.remove("is-pjax-enter","is-pjax-enter-active")}if(typeof initVoiceBubbles==="function")initVoiceBubbles();if(typeof initMusicCards==="function")initMusicCards();lazyLoadImages();if(window.ViewImage)ViewImage.init("[view-image] img");setTimeout(function(){if(window.initImgReveal)initImgReveal();if(window.initH2)initH2()},60);requestAnimationFrame(_ensureHeatmap);_updateWordCount();_refreshBusuanzi();_reinitTwikoo()});
function lazyLoadImages(){document.querySelectorAll(".post-content img:not([loading])").forEach(function(img){img.loading="lazy"})}

/* Image fade-in + h2 scroll animation (post card animations handled by UIkit scrollspy) */
(function(){
  function isInViewport(el){var r=el.getBoundingClientRect();return r.top<window.innerHeight+30&&r.bottom>-30}
  var obs=new IntersectionObserver(function(entries){
    for(var i=0;i<entries.length;i++){
      if(!entries[i].isIntersecting)continue;
      var t=entries[i].target;
      obs.unobserve(t);
      if(t.tagName==='IMG'){
        if(t.complete&&t.naturalWidth>0){
          t.classList.add('img-cached');
        } else {
          t.addEventListener('load',function(){this.classList.add('img-revealed');},{once:true});
          t.addEventListener('error',function(){this.classList.add('img-revealed');},{once:true});
        }
      } else if(t.tagName==='H2'){
        t.classList.add('h2-revealed');
      }
    }
  },{threshold:0.06,rootMargin:'0px 0px -30px 0px'});
  function initImgReveal(){
    var imgs=document.querySelectorAll('.post-content img,.entry-content img');
    for(var i=0;i<imgs.length;i++){
      if(imgs[i].classList.contains('img-revealed')||imgs[i].classList.contains('img-cached'))continue;
      if(isInViewport(imgs[i])&&imgs[i].complete&&imgs[i].naturalWidth>0){
        imgs[i].classList.add('img-cached');
      } else {
        obs.observe(imgs[i]);
      }
    }
  }
  function initH2(){
    var hs=document.querySelectorAll('.post-content h2');
    for(var i=0;i<hs.length;i++){
      if(hs[i].classList.contains('h2-revealed'))continue;
      if(isInViewport(hs[i])){
        hs[i].classList.add('h2-revealed');
      } else {
        obs.observe(hs[i]);
      }
    }
  }
  function init(){initImgReveal();initH2()}
  if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',init);else init();
  window.initImgReveal=initImgReveal;
  window.initH2=initH2;
})();

if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",lazyLoadImages);else lazyLoadImages();
</script>
<script>window.enableInfiniteScroll=false</script>
<script>window.friendLinks={hosts:[],names:[]}</script>
<script>window.friendFeeds={hosts:[],names:[]}</script>
<script>window._pageOnlyScriptUrl="{{ "js/page-only.min.js" | absURL }}"</script>
<script>"requestIdleCallback"in window?requestIdleCallback(function(){var e=document.createElement("script");e.src="{{ "js/deferred.min.js" | absURL }}",e.defer=!0,document.body.appendChild(e)}):setTimeout(function(){var e=document.createElement("script");e.src="{{ "js/deferred.min.js" | absURL }}",e.defer=!0,document.body.appendChild(e)},1e3)</script>
<script>
/* Override: typewriter on all screen sizes (was mobile-only) */
window.initTypewriter=function(){var e=document.querySelector(".header-bio");if(!e)return;var t=e.innerText.trim();if(!t)return;e.innerText="";e.classList.add("typing");var n=0;function s(){n<t.length&&(e.innerText+=t.charAt(n),n++,setTimeout(s,100))}setTimeout(s,500)};

/* Fix: sync lazy images with sen-image-frame reveal */
document.addEventListener("DOMContentLoaded",function(){document.querySelectorAll(".sen-image-frame img").forEach(function(img){if(img.complete)return;img.addEventListener("load",function(){var frame=img.closest(".sen-image-frame");if(frame){frame.classList.add("is-visible")}},{once:true})})});
</script>
{{ block "scripts" . }}{{ end }}
</body></html>
