1<!DOCTYPE html> 2<html lang="zh-CN"> 3<head> 4 <meta charset="UTF-8"> 5<meta name="viewport" content="width=device-width, initial-scale=1.0"> 6<meta http-equiv="X-UA-Compatible" content="ie=edge"> 7<link rel="stylesheet" href="/styles/main.min.css"> 8 9 10<link rel="icon" href="/favicon.ico" type="image/x-icon"> 11 12
13<script> 14(function() { 15 // Check for saved theme preference 16 var savedTheme = localStorage.getItem('theme'); 17 18 if (savedTheme) { 19 // Use saved preference 20 document.documentElement.setAttribute('data-theme', savedTheme); 21 } else { 22 // Check system preference 23 var prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches; 24 var theme = prefersDark ? 'dark' : 'light'; 25 document.documentElement.setAttribute('data-theme', theme); 26 } 27})(); 28</script>
28 29 30 31<meta name="description" content="æ¯ä¸æ®µæ è¡ï¼é½æç»ç¹ã"> 32<meta property="og:site_name" content="嵿´é"> 33<meta property="og:title" content="嵿´é"> 34<meta property="og:description" content="æ¯ä¸æ®µæ è¡ï¼é½æç»ç¹ã"> 35 36<meta property="og:image" content="/images/avatar.png"> 37 38<meta property="og:url" content="https://kemeow0815.github.io"> 39<meta property="og:type" content="website"> 40<meta name="twitter:card" content="summary_large_image"> 41<meta name="twitter:title" content="嵿´é"> 42<meta name="twitter:description" content="æ¯ä¸æ®µæ è¡ï¼é½æç»ç¹ã"> 43 44<meta name="twitter:image" content="/images/avatar.png"> 45 46 47 <meta name="generator" content="Gridea Pro 1.1.1"> 48 <title>彿¡£ | 嵿´é</title> 49 50<meta name="description" content="æ¯ä¸æ®µæ è¡ï¼é½æç»ç¹ã"> 51<link rel="canonical" href="https://kemeow0815.github.io/archives/">
52<script type="application/ld+json">{"@context":"https://schema.org","@type":"WebSite","name":"嵿´é","url":"https://kemeow0815.github.io","description":"æ¯ä¸æ®µæ
è¡ï¼é½æç»ç¹ã","potentialAction":{"@type":"SearchAction","query-input":"required name=search_term_string","target":"https://kemeow0815.github.io/search?q={search_term_string}"}}</script>
52 53<meta property="og:title" content="嵿´é"> 54<meta property="og:description" content="æ¯ä¸æ®µæ è¡ï¼é½æç»ç¹ã"> 55<meta property="og:url" content="https://kemeow0815.github.io/archives/"> 56<meta property="og:type" content="website"> 57<meta property="og:site_name" content="嵿´é"> 58<meta property="og:image" content="/images/avatar.png"> 59<meta name="twitter:card" content="summary_large_image"> 60<meta name="twitter:url" content="https://kemeow0815.github.io/archives/"> 61<meta name="twitter:title" content="嵿´é"> 62<meta name="twitter:description" content="æ¯ä¸æ®µæ è¡ï¼é½æç»ç¹ã"> 63<meta name="twitter:image" content="/images/avatar.png"> 64</head> 65<body class="flavor-theme"> 66 67 <!-- å è½½é¡µé¢ --> 68 69 <div id="loading-overlay" class="loading-overlay"> 70 <div class="loading-content"> 71 72 <div class="loading-spinner"></div> 73 74 <div class="loading-title">å è½½ä¸...</div> 75 </div> 76 </div> 77 78 79 <!-- æµæèæ¯ --> 80 <div class="bg-container"> 81 <div class="bg-stars" id="bg-stars"></div> 82 </div> 83 84 <header class="site-header" id="siteHeader"> 85 <div class="header-inner"> 86 <div class="top-bar"> 87 88 89 <div class="top-bar__left"> 90 91 <a href="https://kemeow0815.github.io" class="site-avatar-link" aria-label="è¿åé¦é¡µ"> 92 <img class="site-avatar" src="https://jsd.268682.xyz/gh/Kemeow0815/img@main/img/kemeow0815.webp" alt="嵿´é" /> 93 </a> 94 95 <a href="https://kemeow0815.github.io" class="site-name-link">嵿´é</a> 96 </div> 97 98 99 <nav class="top-bar__nav" id="sectionBar"> 100 101 102 103 104 <a class="nav-item" href="https://kemeow0815.github.io/">ð é¦é¡µ</a> 105 106 107 108 109 <div class="nav-item-wrapper"> 110 <div class="nav-item nav-item--has-children" data-menu-id="menu-2"> 111 <a class="nav-item__link" href="javascript:void(0);">ðæç« </a> 112 <svg class="nav-item__arrow" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> 113 <polyline points="6 9 12 15 18 9"></polyline> 114 </svg> 115 </div> 116 <div class="nav-submenu" id="submenu-menu-2"> 117 118 <a class="nav-submenu__item" href="/post">ðå ¨é¨æç« </a> 119 120 <a class="nav-submenu__item" href="/archives">ð¦å½æ¡£</a> 121 122 <a class="nav-submenu__item" href="/tags">ðæ ç¾</a> 123 124 </div> 125 </div> 126 127 128 129 130 <a class="nav-item" href="/memos">ðéªå¿µ</a> 131 132 133 134 135 <div class="nav-item-wrapper"> 136 <div class="nav-item nav-item--has-children" data-menu-id="menu-4"> 137 <a class="nav-item__link" href="javascript:void(0);">ð龿¥</a> 138 <svg class="nav-item__arrow" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> 139 <polyline points="6 9 12 15 18 9"></polyline> 140 </svg> 141 </div> 142 <div class="nav-submenu" id="submenu-menu-4"> 143 144 <a class="nav-submenu__item" href="/links">ð§âð¤âð§åé¾</a> 145 146 <a class="nav-submenu__item" href="/post/fcircle">ð¬æåå</a> 147 148 </div> 149 </div> 150 151 152 153 154 <div class="nav-item-wrapper"> 155 <div class="nav-item nav-item--has-children" data-menu-id="menu-5"> 156 <a class="nav-item__link" href="javascript:void(0);">ð页é¢</a> 157 <svg class="nav-item__arrow" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> 158 <polyline points="6 9 12 15 18 9"></polyline> 159 </svg> 160 </div> 161 <div class="nav-submenu" id="submenu-menu-5"> 162 163 <a class="nav-submenu__item" href="/post/sponsor">ðèµå©</a> 164 165 <a class="nav-submenu__item" href="/post/timetable">ðï¸è¯¾ç¨è¡¨</a> 166 167 </div> 168 </div> 169 170 171 172 173 <a class="nav-item" href="/post/about">ð« å ³äº</a> 174 175 176 177 </nav> 178 179 180 <div class="top-bar__right">
181 <button class="btn-icon btn-theme" id="btnTheme" type="button" aria-label="忢䏻é¢"> 182 183 <svg class="theme-icon-moon" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> 184 <path d="M20.742 13.045a8 8 0 0 1-2.077.271c-2.135 0-4.14-.83-5.646-2.336a8.03 8.03 0 0 1-2.064-7.723A1 1 0 0 0 9.73 2.034a10 10 0 0 0-4.489 2.582c-3.898 3.898-3.898 10.243 0 14.143a9.94 9.94 0 0 0 7.072 2.93a9.93 9.93 0 0 0 7.07-2.929a10 10 0 0 0 2.583-4.491a1 1 0 0 0-1.224-1.224m-2.772 4.301a7.95 7.95 0 0 1-5.656 2.343a7.95 7.95 0 0 1-5.658-2.344c-3.118-3.119-3.118-8.195 0-11.314a8 8 0 0 1 2.06-1.483a10.03 10.03 0 0 0 2.89 7.848a9.97 9.97 0 0 0 7.848 2.891a8 8 0 0 1-1.484 2.059"/> 185 </svg> 186 187 <svg class="theme-icon-sun" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> 188 <circle cx="12" cy="12" r="4"/> 189 <path d="M12 2v2"/> 190 <path d="M12 20v2"/> 191 <path d="m4.93 4.93 1.41 1.41"/> 192 <path d="m17.66 17.66 1.41 1.41"/> 193 <path d="M2 12h2"/> 194 <path d="M20 12h2"/> 195 <path d="m6.34 17.66-1.41 1.41"/> 196 <path d="m19.07 4.93-1.41 1.41"/> 197 </svg> 198 </button> 199 <button class="btn-icon btn-search search-btn" id="btnSearch" type="button" aria-label="æç´¢"> 200 <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" 201 stroke-linecap="round" stroke-linejoin="round"> 202 <circle cx="11" cy="11" r="8"></circle> 203 <line x1="21" y1="21" x2="16.65" y2="16.65"></line> 204 </svg> 205 </button> 206 <button class="btn-icon btn-nav-toggle mobile-only" id="btnNavToggle" type="button" aria-label="忢坼èª"> 207 <div class="hamburger" id="hamburger"> 208 <span class="hamburger__line hamburger__line--top"></span> 209 <span class="hamburger__line hamburger__line--bottom"></span> 210 </div> 211 </button> 212 </div> 213 214 </div> 215 </div> 216</header> 217 218 219<div class="header-spacer"></div> 220
221<script> 222(function(){ 223 // Mobile nav toggle 224 var btn = document.getElementById('btnNavToggle'); 225 var nav = document.getElementById('sectionBar'); 226 var hamburger = document.getElementById('hamburger'); 227 if (!btn || !nav) return; 228 btn.addEventListener('click', function(){ 229 nav.classList.toggle('top-bar__nav--open'); 230 if (hamburger) hamburger.classList.toggle('is-active'); 231 }); 232 233 // Submenu toggle for mobile 234 var navItemsWithChildren = document.querySelectorAll('.nav-item--has-children'); 235 navItemsWithChildren.forEach(function(item) { 236 item.addEventListener('click', function(e) { 237 // Only handle click on mobile 238 if (window.innerWidth > 768) return; 239 240 e.preventDefault(); 241 e.stopPropagation(); 242 243 var menuId = this.getAttribute('data-menu-id'); 244 var submenu = document.getElementById('submenu-' + menuId); 245 246 // Close other open submenus 247 navItemsWithChildren.forEach(function(otherItem) { 248 if (otherItem !== item) { 249 var otherMenuId = otherItem.getAttribute('data-menu-id'); 250 var otherSubmenu = document.getElementById('submenu-' + otherMenuId); 251 if (otherSubmenu && otherSubmenu.classList.contains('nav-submenu--open')) { 252 otherSubmenu.classList.remove('nav-submenu--open'); 253 otherItem.classList.remove('nav-item--expanded'); 254 } 255 } 256 }); 257 258 // Toggle current submenu 259 if (submenu) { 260 submenu.classList.toggle('nav-submenu--open'); 261 this.classList.toggle('nav-item--expanded'); 262 } 263 }); 264 }); 265 266 // Close mobile nav when clicking on simple nav items 267 nav.querySelectorAll('.nav-item:not(.nav-item--has-children)').forEach(function(item){ 268 item.addEventListener('click', function(){ 269 nav.classList.remove('top-bar__nav--open'); 270 if (hamburger) hamburger.classList.remove('is-active'); 271 }); 272 }); 273 274 // Theme toggle with performance optimization 275 var themeBtn = document.getElementById('btnTheme'); 276 if (themeBtn) { 277 themeBtn.addEventListener('click', function() { 278 var currentTheme = document.documentElement.getAttribute('data-theme') || 'dark'; 279 var newTheme = currentTheme === 'dark' ? 'light' : 'dark'; 280 281 // Add class to disable transitions during theme change 282 document.body.classList.add('theme-changing'); 283 284 // Use requestAnimationFrame for smooth theme switch 285 requestAnimationFrame(function() { 286 document.documentElement.setAttribute('data-theme', newTheme); 287 localStorage.setItem('theme', newTheme); 288 289 // Remove the class after theme change is complete 290 requestAnimationFrame(function() { 291 document.body.classList.remove('theme-changing'); 292 }); 293 }); 294 }); 295 } 296})(); 297</script>
297 298 299 300 <main class="site-main" role="main"> 301 302<div class="container"> 303 <div class="page-header"> 304 <h1 class="page-title">彿¡£</h1> 305 306 <p class="page-subtitle meta-text">å ± 3 ç¯æç« </p> 307 308 </div> 309 310 311 <div class="archive-list"> 312 313 <h2 class="archive-year">2026</h2> 314 315 <a href="/post/timetable-guide/" class="archive-item"> 316 <time class="archive-item__date" datetime="2026-04-13T10:28:51+08:00">2026-04-13</time> 317 <span class="archive-item__title">Astro å客课ç¨è¡¨é¡µé¢å®ç°æç¨</span> 318 319 </a> 320 321 <a href="/post/use-neon-database-with-waline-on-vercel/" class="archive-item"> 322 <time class="archive-item__date" datetime="2026-04-11T17:09:31+08:00">2026-04-11</time> 323 <span class="archive-item__title">waline使ç¨neonæ°æ®åºåå¨vercelé¨ç½²</span> 324 325 </a> 326 327 <a href="/post/post-diff-guide/" class="archive-item"> 328 <time class="archive-item__date" datetime="2026-04-11T17:07:00+08:00">2026-04-11</time> 329 <span class="archive-item__title">æ°æç« éç¥è®°å½</span> 330 331 </a> 332 333 334 </div> 335 336</div> 337 338 </main> 339 340 <footer class="site-footer"> 341 <div class="footer-inner"> 342 343 344 345 346 <nav class="footer-nav" aria-label="页è导èª" id="footer-nav-custom"> 347 </nav> 348
348<script> 349 (function() { 350 var navData = [ 351 {"name": "主页", "link": "https://www.kemiaosw.top"}, 352 {"name": "BLog", "link": "https://kemeow0815.github.io/blog"}, 353 {"name": "åé¾å±", "link": "https://www.268682.xyz"}, {"name": "Gwitter", "link": "https://gwitter.268682.xyz"} 354]; 355 if (Array.isArray(navData)) { 356 var navHtml = ''; 357 navData.forEach(function(item) { 358 navHtml += '<a class="footer-nav__link" href="' + item.link + '">' + item.name + '</a>'; 359 }); 360 document.getElementById('footer-nav-custom').innerHTML = navHtml; 361 } 362 })(); 363 </script>
363 364 365 366 367 <div class="footer-social"> 368 369 <a class="footer-social__link" href="https://github.com/Kemeow0815" target="_blank" rel="noopener noreferrer" 370 aria-label="GitHub"> 371 <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor"> 372 <path 373 d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z" /> 374 </svg> 375 </a> 376 377 378 379 380 <a class="footer-social__link" href="https://t.me/Kemeow0815" target="_blank" rel="noopener noreferrer" 381 aria-label="Telegram"> 382 <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor"> 383 <path d="M12 0C5.37 0 0 5.37 0 12s5.37 12 12 12 12-5.37 12-12S18.63 0 12 0zm5.95 8.24l-2.17 10.24c-.16.73-.6.9-1.22.56l-3.37-2.48-1.63 1.56c-.18.18-.33.33-.68.33l.24-3.44 6.25-5.65c.27-.24-.06-.37-.42-.13l-7.72 4.86-3.33-1.04c-.72-.23-.74-.72.15-1.06l13.02-5.02c.6-.22 1.12.14.93 1.03z"/> 384 </svg> 385 </a> 386 387 388 <a class="footer-social__link" href="https://qm.qq.com/q/kz5EuEimk0" target="_blank" rel="noopener noreferrer" 389 aria-label="QQ"> 390 <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor"> 391 <path d="M12.003 2c-2.265 0-6.29 1.364-6.29 7.325v1.195S3.55 14.96 3.55 17.474c0 .665.17 1.025.281 1.025.114 0 .902-.484 1.748-2.072 0 0-.18 2.197 1.904 3.967 0 0-1.77.495-1.77 1.182 0 .686 4.078.43 6.29.43 2.21 0 6.288.256 6.288-.43 0-.687-1.768-1.182-1.768-1.182 2.085-1.77 1.905-3.967 1.905-3.967.845 1.588 1.634 2.072 1.746 2.072.111 0 .283-.36.283-1.025 0-2.514-2.166-6.954-2.166-6.954V9.325C18.29 3.364 14.268 2 12.003 2z"/> 392 </svg> 393 </a> 394 395 396 <a class="footer-social__link" href="https://space.bilibili.com/3546643173477234" target="_blank" rel="noopener noreferrer" 397 aria-label="Bilibili"> 398 <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor"> 399 <path d="M17.813 4.653h.854c1.51.054 2.769.578 3.773 1.574 1.004.995 1.524 2.249 1.56 3.76v7.36c-.036 1.51-.556 2.769-1.56 3.773s-2.262 1.524-3.773 1.56H5.333c-1.51-.036-2.769-.556-3.773-1.56S.036 18.858 0 17.347v-7.36c.036-1.511.556-2.765 1.56-3.76 1.004-.996 2.262-1.52 3.773-1.574h.774l-1.174-1.12a1.234 1.234 0 0 1-.373-.906c0-.356.124-.658.373-.907l.027-.027c.267-.249.573-.373.92-.373.347 0 .653.124.92.373L9.653 4.44c.071.071.134.142.187.213h4.267a.836.836 0 0 1 .16-.213l2.853-2.747c.267-.249.573-.373.92-.373.347 0 .662.151.929.4.267.249.391.551.391.907 0 .355-.124.657-.373.906zM5.333 7.24c-.746.018-1.373.276-1.88.773-.506.498-.769 1.13-.786 1.894v7.52c.017.764.28 1.395.786 1.893.507.498 1.134.756 1.88.773h13.334c.746-.017 1.373-.275 1.88-.773.506-.498.769-1.129.786-1.893v-7.52c-.017-.765-.28-1.396-.786-1.894-.507-.497-1.134-.755-1.88-.773zM8 11.107c.373 0 .684.124.933.373.25.249.383.569.4.96v1.173c-.017.391-.15.711-.4.96-.249.25-.56.374-.933.374s-.684-.125-.933-.374c-.25-.249-.383-.569-.4-.96V12.44c0-.373.129-.689.386-.947.258-.257.574-.386.947-.386zm8 0c.373 0 .684.124.933.373.25.249.383.569.4.96v1.173c-.017.391-.15.711-.4.96-.249.25-.56.374-.933.374s-.684-.125-.933-.374c-.25-.249-.383-.569-.4-.96V12.44c.017-.391.15-.711.4-.96.249-.249.56-.373.933-.373z"/> 400 </svg> 401 </a> 402 403 404 <a class="footer-social__link" href="https://web.okjike.com/u/07152f0c-0f65-4501-855b-031f3e20e4a5" target="_blank" rel="noopener noreferrer" 405 aria-label="å³å»"> 406 <svg width="20" height="20" viewBox="0 0 1024 1024" fill="currentColor"> 407 <path d="M660.39 123.63v463.59S645.04 726.4 558.98 771.43c-53.12 31.21-128.85 67.54-228.63 70.61l58.33 58.33s175-15.35 254.82-87.5 82.89-159.9 82.89-194.31V172.75l-66-49.12z" fill="#62B2E4"/> 408 <path d="M660.39 123.63v463.58s-15.36 139.17-101.41 184.21c-53.12 31.22-128.85 67.54-228.62 70.62L297.6 702.85s70.62-13.31 117.71-28.64c47.07-15.36 72-95.19 72-95.19V123.63h173.08z" fill="#F3DB2B"/> 409 </svg> 410 </a> 411 412 413 <a class="footer-social__link" href="mailto:[email protected]" aria-label="é®ç®±"> 414 <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor"> 415 <path d="M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z"/> 416 </svg> 417 </a> 418 419 <a class="footer-social__link" href="/feed.xml" aria-label="RSS"> 420 <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor"> 421 <path d="M6.18 15.64a2.18 2.18 0 110 4.36 2.18 2.18 0 010-4.36zM4 4.44A15.56 15.56 0 0119.56 20h-2.83A12.73 12.73 0 004 7.27V4.44zm0 5.66a9.9 9.9 0 019.9 9.9h-2.83A7.07 7.07 0 004 12.93V10.1z"/> 422 </svg> 423 </a> 424 </div> 425 426 427 <div class="footer-copyright"> 428 <p>© 2026 嵿´é. All rights reserved.</p> 429 </div> 430 431 432 433 <div class="footer-custom">
434 <span id="runtime_span" style="text-align: center;"></span> 435<br>
436<script defer src="https://busuanzi.9420.ltd/js"></script>
436 437<div style="text-align: center;"> 438 æ¬ç«æ»è®¿é®é <span id="busuanzi_site_pv"></span> 次 439 æ¬ç«æ»è®¿å®¢æ° <span id="busuanzi_site_uv"></span> 人 440</div> 441<!-- å¼å ¥ CSS (HEADæ ç¾å ) --> 442<link rel="stylesheet" href="https://cdn.268682.xyz/music/netease-mini-player-v2.css"> 443 444<!-- å¼å ¥ JS (BODYæ ç¾åºé¨) -->
445<script src="https://cdn.268682.xyz/music/netease-mini-player-v2.js"></script>
445 446<div class="netease-mini-player" 447 data-playlist-id="13681647281" 448 data-embed="false" 449 data-position="bottom-left" 450 data-lyric="true" 451 data-theme="auto" 452 data-default-minimized="true" 453></div> 454 </div> 455 456 457 458 <div class="footer-powered"> 459 <span>Powered by <a href="https://gridea.pro" target="_blank" rel="noopener noreferrer">Gridea Pro</a></span> 460 </div> 461 462 </div> 463</footer> 464 465 466 <div class="search-overlay" id="searchOverlay" style="display:none;"> 467 <div class="search-modal"> 468 <div class="search-header"> 469 <svg class="search-icon" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" 470 stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> 471 <circle cx="11" cy="11" r="8"></circle> 472 <line x1="21" y1="21" x2="16.65" y2="16.65"></line> 473 </svg> 474 <input type="text" class="search-input" id="searchInput" placeholder="æç´¢æç« ..." autocomplete="off" /> 475 <span class="search-kbd">⌘K</span> 476 <button class="search-close" id="searchClose" type="button" aria-label="å ³éæç´¢"> 477 <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" 478 stroke-linecap="round" stroke-linejoin="round"> 479 <line x1="18" y1="6" x2="6" y2="18"></line> 480 <line x1="6" y1="6" x2="18" y2="18"></line> 481 </svg> 482 </button> 483 </div> 484 <div class="search-results" id="searchResults"></div> 485 </div> 486</div> 487
488<script src="/scripts/search.js"></script>
488 489 490 491 492 493 494 495 496
496<script>function show_runtime() { 497 var X = new Date("2024/11/1 12:00:00"); 498 var Y = new Date(); 499 var T = Y.getTime() - X.getTime(); 500 var M = 24 * 60 * 60 * 1000; 501 var a = T / M; 502 var A = Math.floor(a); 503 var b = (a - A) * 24; 504 var B = Math.floor(b); 505 var c = (b - B) * 60; 506 var C = Math.floor((b - B) * 60); 507 var D = Math.floor((c - C) * 60); 508 document.getElementById("runtime_span").innerHTML = "â±ï¸æ¬ç«å·²è¿è¡ " + A + "天" + B + "å°æ¶" + C + "å" + D + "ç§"; 509 setTimeout(show_runtime, 1000); 510} 511show_runtime();</script>
511 512 513 514 <!-- å 载页é¢èæ¬ --> 515 516
516<script> 517 (function() { 518 // 页é¢å è½½å®æåéèå è½½å¨ç» 519 function hideLoadingOverlay() { 520 const overlay = document.getElementById('loading-overlay'); 521 if (overlay) { 522 overlay.classList.add('fade-out'); 523 setTimeout(function() { 524 overlay.style.display = 'none'; 525 }, 600); 526 } 527 } 528 529 // çå¾ é¡µé¢å®å ¨å è½½ 530 if (document.readyState === 'complete') { 531 hideLoadingOverlay(); 532 } else { 533 window.addEventListener('load', hideLoadingOverlay); 534 } 535 })(); 536 </script>
536 537 538 539 <!-- æµæèæ¯èæ¬ - æ§è½ä¼å --> 540
540<script> 541 (function() { 542 const starsContainer = document.getElementById('bg-stars'); 543 if (!starsContainer) return; 544 545 // æ£æµç§»å¨ç«¯åæ§è½æ¨¡å¼ 546 const isMobile = window.matchMedia('(max-width: 750px)').matches; 547 const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; 548 549 // æ ¹æ®è®¾å¤è°æ´æµææ°é 550 const starCount = isMobile ? 15 : (prefersReducedMotion ? 0 : 25); 551 552 // ä½¿ç¨ DocumentFragment æ¹éæ·»å 553 const fragment = document.createDocumentFragment(); 554 555 for (let i = 0; i < starCount; i++) { 556 const star = document.createElement('div'); 557 star.className = 'bg-star'; 558 559 // éæºåæ° - ä½¿ç¨æ´æ°é¿å è¿å¤éç» 560 const topOffset = Math.floor(Math.random() * 130) + 'vh'; 561 const fallDuration = (Math.floor(Math.random() * 8) + 6) + 's'; 562 const fallDelay = (Math.floor(Math.random() * 15)) + 's'; 563 564 star.style.setProperty('--top-offset', topOffset); 565 star.style.setProperty('--fall-duration', fallDuration); 566 star.style.setProperty('--fall-delay', fallDelay); 567 568 fragment.appendChild(star); 569 } 570 571 starsContainer.appendChild(fragment); 572 })(); 573 </script>
573 574
575<script>console.log("\n%c ⦠Gridea Pro v1.1.1 %c · Theme: flavor-theme v1.0.0 · https://gridea.pro %c\n","color:#fadfa3;background:#111111;padding:9px 14px;border-radius:4px 0 0 4px;font-weight:500;font-size:12px","color:#e05c00;background:#fff3ec;padding:9px 14px;border-radius:0 4px 4px 0;font-size:11px","")</script>
575 576</body> 577</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.