1<!DOCTYPE html> 2<html lang="zh-CN"> 3<head> 4 <meta charset="UTF-8"> 5
5<script> 6 /* ===== è·¨åååç»å½æåæ¥ï¼github. / cloudflare. / pythonanywhere. ä¹é´äºéï¼===== 7 localStorage æ¯æ origin é离çï¼ä¸¤ä¸ªååååååçï¼æä»¥è¦å Cookie ä¸è½¬ã 8 Cookie 设 Domain=.nb-channel.topï¼ææåååé½è½è¯»å°ã 9 10 è¿é䏿¹é¡µé¢åæ¬çä»»ä½ä»£ç ââ èæ¯å«æ localStorage ç读åï¼ 11 · 页é¢ç»å½æ¶ setItem('nb_session', ...) â 顺æåä¸ä»½å° Cookie 12 · 页é¢ç»åºæ¶ removeItem('nb_session') â é¡ºææ Cookie æ¸ æ 13 · 页é¢å è½½æ¶ Cookie æãæ¬å°æ²¡æ â èªå¨æ³¨å ¥è¿ localStorage 14 æä»¥é£ 57 å¤ç»å½/ç»åºä»£ç ä¸è¡é½ä¸ç¨å¨ã 15 16 â ï¸ è¿æå³ç *.nb-channel.top ä¸ä»»ä½ä¸ä¸ªåååé½è½è¯»å°è¿ä¸ªä»¤çï¼ 17 å æ¬ product-storage é£ä¸ª Workersãå°æ¥æ°å¢ååååå æ³æ¸ æ¥è¿ä»¶äºã */ 18 (function () { 19 try { 20 var KEY_S = 'nb_session', KEY_U = 'nb_user'; 21 var DOMAIN = '.nb-channel.top'; 22 var MAXAGE = 30 * 86400; 23 24 // åªå¨ .nb-channel.top å䏿å¯ç¨ï¼æ¬å°å¼æä»¶ãæå«çååè®¿é®æ¶ä¿æåæ ·ï¼ 25 if (location.hostname.indexOf('nb-channel.top') < 0) return; 26 27 function readCookie(n) { 28 var m = document.cookie.match(new RegExp('(?:^|;\\s*)' + n + '=([^;]*)')); 29 return m ? decodeURIComponent(m[1]) : null; 30 } 31 function writeCookie(n, v) { 32 document.cookie = n + '=' + encodeURIComponent(v) + ';path=/;domain=' + DOMAIN + 33 ';max-age=' + MAXAGE + ';SameSite=Lax' + 34 (location.protocol === 'https:' ? ';Secure' : ''); 35 } 36 function dropCookie(n) { 37 document.cookie = n + '=;path=/;domain=' + DOMAIN + ';max-age=0;SameSite=Lax' + 38 (location.protocol === 'https:' ? ';Secure' : ''); 39 } 40 41 // ---- â 页é¢å è½½æ¶ååå¯¹é½ ---- 42 [KEY_S, KEY_U].forEach(function (k) { 43 var c = readCookie(k), l = null; 44 try { l = localStorage.getItem(k); } catch (e) {} 45 if (l) { 46 if (l !== c) writeCookie(k, l); // æ¬å°æ â 忥åºå» 47 } else if (c) { 48 try { localStorage.setItem(k, c); } catch (e) {} // æ¬å°æ²¡æ â éç¨ Cookie 49 } 50 }); 51 52 // ---- â¡ å«æåå ¥ï¼ç»å½æ¶åæ¥å° Cookie ---- 53 var _set = localStorage.setItem; 54 localStorage.setItem = function (k, v) { 55 try { if ((k === KEY_S || k === KEY_U) && v) writeCookie(k, v); } catch (e) {} 56 return _set.call(localStorage, k, v); 57 }; 58 59 // ---- â¢ å«æå é¤ï¼ç»åºæ¶åæ¥æ¸ Cookie ---- 60 var _rm = localStorage.removeItem; 61 localStorage.removeItem = function (k) { 62 try { if (k === KEY_S || k === KEY_U) dropCookie(k); } catch (e) {}
63 return _rm.call(localStorage, k); 64 }; 65 66 // ---- ⣠ä¸ä¸æäººç¨ clear() ---- 67 var _cl = localStorage.clear; 68 localStorage.clear = function () { 69 try { dropCookie(KEY_S); dropCookie(KEY_U); } catch (e) {} 70 return _cl.call(localStorage); 71 }; 72 } catch (e) {} 73 })(); 74 </script>
74 75 <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover"> 76 <!-- ä¸åé referer:Bç«å¾åº(hdslb)é²çé¾,带å¤é¨ç« referer ä¼ 403 导è´è§é¢å°é¢ä¸æ¾ç¤º --> 77 <meta name="referrer" content="no-referrer"> 78 <meta name="description" content="NBé¢éï¼NoBooké¢éï¼ââçç±çç§ï¼å使»ï¼çUP主NBæäºå±å»ºç«çèæå ¬å¸å®ç½ãåå¦ç©çå®éªãNBå¸èæç»æµï¼è¡ç¥¨/é¶è¡/ååºï¼ãè¯è®ºåºä¸ååçæã"> 79 <meta property="og:title" content="NBé¢éå®ç½"> 80 <meta property="og:description" content="çç±çç§ï¼å使»ï¼çèæå ¬å¸å®ç½ââNBå¸ç»æµãåå¦ç©çãååçæã"> 81 <meta property="og:type" content="website"> 82 <meta name="theme-color" content="#0f172a"> 83 <link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Cdefs%3E%3ClinearGradient id='g' x1='0' y1='0' x2='1' y2='1'%3E%3Cstop offset='0' stop-color='%233b82f6'/%3E%3Cstop offset='1' stop-color='%238b5cf6'/%3E%3C/linearGradient%3E%3C/defs%3E%3Crect width='64' height='64' rx='14' fill='url(%23g)'/%3E%3Ctext x='32' y='43' font-family='Arial,sans-serif' font-size='26' font-weight='800' fill='%23fff' text-anchor='middle'%3ENB%3C/text%3E%3C/svg%3E"> 84 <title>NBé¢éå®ç½ - Beta æ°çé¦é¡µ</title> 85
85<script> 86 // å¤é´æ¨¡å¼:第ä¸å¸§åçæ(æ æ¾å¼éæ©æ¶è·éç³»ç») 87 (function () { 88 try { 89 var t = localStorage.getItem('theme'); 90 if (t === 'dark' || (!t && window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches)) { 91 document.documentElement.classList.add('dark'); 92 } 93 } catch (e) {} 94 })(); 95 </script>
95 96 <style> 97 /* ============ åºç¡ ============ */ 98 * { margin: 0; padding: 0; box-sizing: border-box; } 99 :root { 100 --bg: #f7f8fa; 101 --ink: #1a1d23; 102 --ink-soft: #5a6270; 103 --ink-faint: #8b93a3; 104 --line: #e8eaee; 105 --brand: #3b82f6; 106 --brand-deep: #2563eb; 107 --card: #ffffff; 108 --radius-lg: 20px; 109 --radius-md: 14px; 110 --radius-sm: 8px; 111 --shadow-1: 0 1px 2px rgba(16,24,40,.04), 0 4px 12px rgba(16,24,40,.06); 112 --shadow-2: 0 2px 4px rgba(16,24,40,.05), 0 24px 48px -20px rgba(16,24,40,.18); 113 } 114 /* ============ å¤é´æ¨¡å¼(html.dark åéè¦ç) ============ */ 115 html.dark { color-scheme: dark; } 116 html.dark { 117 --bg: #0a101f; 118 --ink: #e5eaf3; 119 --ink-soft: #9aa7bd; 120 --ink-faint: #64748b; 121 --line: rgba(148,163,184,.16); 122 --card: #101a2e; 123 --shadow-1: 0 1px 2px rgba(0,0,0,.3), 0 6px 18px rgba(0,0,0,.28); 124 --shadow-2: 0 2px 6px rgba(0,0,0,.35), 0 28px 60px -24px rgba(0,0,0,.6); 125 } 126 html.dark body { 127 background: 128 radial-gradient(900px 520px at 85% -10%, rgba(59,130,246,.06), transparent 60%), 129 var(--bg); 130 /* ä¸ç¨ background-attachment:fixed:ä¸å¸é¡¶å¯¼èª backdrop-filter å å æ¶å·æ°é¦å¸§åæå¡é¡¿ */ 131 } 132 html.dark .nav { background: rgba(10,16,31,.72); border-bottom-color: rgba(148,163,184,.12); } 133 html.dark .nav.scrolled { background: rgba(10,16,31,.9); } 134 html.dark .nav-auth { background: rgba(255,255,255,.05); color: var(--ink); border-color: rgba(148,163,184,.25); } 135 html.dark .nav-auth:hover { background: rgba(255,255,255,.1); border-color: rgba(59,130,246,.5); } 136 html.dark .nav-burger { background: rgba(255,255,255,.06); border-color: rgba(148,163,184,.25); color: var(--ink); } 137 html.dark .nav-scan { background: rgba(255,255,255,.06); border-color: rgba(148,163,184,.25); color: var(--ink); } 138 html.dark .theme-btn { background: rgba(255,255,255,.06); border-color: rgba(148,163,184,.25); color: var(--ink); } 139 html.dark .beta-announce { background: var(--card); } 140 html.dark .beta-announce .ba-icon { background: rgba(59,130,246,.15); } 141 html.dark .beta-announce .ba-item { color: var(--ink-soft); } 142 html.dark .friends-section { background: transparent; } 143 html.dark .vcard .thumb, html.dark .card .thumb { background: #0d1526; } 144 html.dark .drawer { background: #0f1a30; } 145 html.dark .drawer .d-close { background: rgba(255,255,255,.06); color: var(--ink); } 146 html.dark .drawer a.d-item { color: var(--ink-soft); } 147 html.dark .drawer a.d-item:hover, html.dark .drawer a.d-item.active { background: rgba(59,130,246,.14); color: #fff; } 148 html.dark .drawer .d-brand { color: var(--ink); } 149 html.dark .backtop { background: rgba(15,23,42,.85); color: #cbd5e1; border-color: rgba(148,163,184,.25); } 150 html.dark .backtop:hover { background: var(--brand); color: #fff; } 151 html.dark .hero-scroll { color: rgba(255,255,255,.35); } 152 html.dark .about-tags .tag { background: var(--card); } 153 html.dark .friend { background: rgba(255,255,255,.03); } 154 html.dark .friend:hover { background: rgba(255,255,255,.06); } 155 html.dark .footer-bottom { border-color: rgba(255,255,255,.06); } 156 157 html { scroll-behavior: smooth; } 158 body { 159 font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif; 160 background: 161 radial-gradient(1100px 620px at 82% -14%, rgba(59,130,246,.05), transparent 62%), 162 var(--bg); 163 /* åä¸:ä¸ä½¿ç¨ background-attachment:fixed,é¿å é¦å¸§/æ»å¨ééæ ·å¼é */ 164 color: var(--ink); 165 line-height: 1.6; 166 -webkit-font-smoothing: antialiased; 167 } 168 a { text-decoration: none; color: inherit; } 169 170 /* ============ å¯¼èª ============ */ 171 .nav { 172 position: sticky; top: 0; z-index: 100; 173 display: flex; align-items: center; justify-content: space-between; 174 padding: 0 48px; height: 64px; 175 background: rgba(255,255,255,.72); 176 -webkit-backdrop-filter: blur(20px) saturate(1.5); 177 backdrop-filter: blur(20px) saturate(1.5); 178 border-bottom: 1px solid var(--line); 179 } 180 .nav-logo { 181 display: flex; align-items: center; gap: 10px; 182 font-size: 1.15rem; font-weight: 800; letter-spacing: .3px; 183 margin-left: 12px; 184 } 185 /* LOGO å¾ç */ 186 .logo-img { display: block; height: 32px; width: auto; } 187 .nav-logo .logo-img { height: 32px; } 188 .footer .brand .logo-img { height: 38px; margin-bottom: 4px; } 189 .drawer .d-brand .logo-img { height: 34px; } 190 html.dark .logo-img { filter: brightness(1.4) saturate(1.15); } 191 .nav-logo .dot { 192 width: 10px; height: 10px; border-radius: 3px; 193 background: linear-gradient(135deg, var(--brand), #8b5cf6); 194 } 195 .nav-menu { display: flex; gap: 2px; } 196 .nav-menu a { 197 position: relative; padding: 10px 14px; 198 font-size: .92rem; font-weight: 500; letter-spacing: .4px; 199 color: var(--ink-soft); white-space: nowrap; 200 transition: color .3s ease; 201 } 202 .nav-menu a::after { 203 content: ''; position: absolute; left: 14px; right: 14px; bottom: 2px; 204 height: 1px; background: var(--brand); 205 transform: scaleX(0); transform-origin: left; 206 transition: transform .35s cubic-bezier(.16,1,.3,1); 207 } 208 .nav-menu a:hover { color: var(--ink); } 209 .nav-menu a:hover::after { transform: scaleX(1); } 210 .nav-menu a.active { color: var(--brand); font-weight: 600; } 211 .nav-menu a.active::after { transform: scaleX(1); } 212 /* API å ¥å£ */ 213 .nav-menu a i { font-style: normal; font-size: .66em; margin-left: 2px; vertical-align: 5px; letter-spacing: 0; opacity: .75; }
214 .nav-menu a.nav-api { color: var(--brand); font-weight: 600; font-size: .86rem; } 215 .nav-menu a.nav-api:hover { color: var(--brand-deep); } 216 .nav-menu a.nav-api::after { background: var(--brand-deep); } 217 .d-item i { font-style: normal; } 218 .nav-cta { 219 padding: 9px 20px; border-radius: 999px; 220 background: var(--brand); color: #fff; font-size: .9rem; font-weight: 600; 221 box-shadow: 0 8px 20px -8px rgba(59,130,246,.5); 222 transition: all .25s ease; 223 } 224 .nav-cta:hover { background: var(--brand-deep); transform: translateY(-1px); box-shadow: 0 12px 24px -8px rgba(59,130,246,.6); } 225 226 /* ============ Hero(æç®æç:ç»çè¡ + ç²ç»åéå¯¹æ¯ + å·¦æå³ç») ============ */ 227 .hero { 228 position: relative; overflow: hidden; 229 padding: 140px 48px 170px; 230 background: 231 radial-gradient(860px 460px at 16% 6%, rgba(59,130,246,.15), transparent 62%), 232 radial-gradient(700px 460px at 92% 30%, rgba(139,92,246,.10), transparent 60%), 233 linear-gradient(168deg, #0b1220 0%, #101c33 58%, #1c1745 100%); 234 } 235 .hero::before { 236 content: ''; position: absolute; inset: 0; pointer-events: none; opacity: .6; 237 background: radial-gradient(600px 300px at 15% 10%, rgba(96,165,250,.20), transparent 60%); 238 animation: heroDrift 26s ease-in-out infinite alternate; 239 } 240 .hero::after { 241 content: ''; position: absolute; inset: 0; pointer-events: none; opacity: .5; 242 background-image: radial-gradient(rgba(255,255,255,.05) 1px, transparent 1px); 243 background-size: 36px 36px; 244 mask-image: linear-gradient(to bottom, rgba(0,0,0,.55), transparent 75%); 245 -webkit-mask-image: linear-gradient(to bottom, rgba(0,0,0,.55), transparent 75%); 246 } 247 @keyframes heroDrift { 248 from { transform: translate3d(-18px, -10px, 0) scale(1); } 249 to { transform: translate3d(24px, 16px, 0) scale(1.06); } 250 } 251 /* Hero â èæ¯è²çæåè¿æ¸¡ */ 252 .hero-fade { 253 position: absolute; left: 0; right: 0; bottom: 0; height: 120px; z-index: 1; 254 background: linear-gradient(to bottom, transparent, var(--bg)); 255 pointer-events: none; 256 } 257 .hero-inner { 258 position: relative; z-index: 2; max-width: 1180px; margin: 0 auto; 259 display: grid; grid-template-columns: 1.05fr .95fr; gap: 80px; align-items: center; 260 } 261 .hero-copy { text-align: left; min-width: 0; } 262 .hero-eyebrow { 263 display: block; font-size: 11px; font-weight: 400; 264 letter-spacing: 8px; color: rgba(255,255,255,.42); 265 margin-bottom: 44px; 266 } 267 .hero h1 { 268 font-size: clamp(2.5rem, 4.9vw, 4.4rem); 269 font-weight: 800; letter-spacing: 2px; 270 color: #fff; line-height: 1.16; text-wrap: balance; 271 } 272 .hero h1 .light { 273 font-weight: 200; letter-spacing: 6px; color: #9cc0ff; 274 } 275 .hero-sub { 276 margin: 36px 0 0; max-width: 440px; 277 font-size: .98rem; font-weight: 300; line-height: 2.15; 278 letter-spacing: .6px; color: rgba(255,255,255,.6); 279 } 280 .hero-actions { margin-top: 52px; display: flex; gap: 44px; align-items: center; flex-wrap: wrap; } 281 .hero-link { 282 font-size: .9rem; letter-spacing: 3px; font-weight: 600; color: #fff; 283 padding: 12px 2px; border-bottom: 1px solid rgba(255,255,255,.32); 284 transition: border-color .35s ease, color .35s ease; 285 } 286 .hero-link:hover { border-color: #7cb4ff; color: #7cb4ff; } 287 .hero-media { min-width: 0; } 288 /* LOGO è§é¢:æ è¾¹æ¡,åé åè§ä¸æ·±å½±(å» chrome) */ 289 .hero-video { 290 border-radius: 22px; overflow: hidden; 291 box-shadow: 0 70px 140px -60px rgba(0,0,0,.9), 0 0 0 1px rgba(255,255,255,.06); 292 background: #0b1220; 293 } 294 .hero-video video { display: block; width: 100%; opacity: 0; transition: opacity .8s ease .1s; } 295 .hero-video video.ready { opacity: 1; } 296 /* 微尿¢ç´¢æå¼(ç«çº¿èå²) */ 297 .hero-scroll { 298 position: absolute; left: 50%; bottom: 24px; transform: translateX(-50%); 299 z-index: 2;
299 color: rgba(255,255,255,.34); 300 font-size: 9px; letter-spacing: 4px; 301 } 302 .hero-scroll::after { 303 content: ''; display: block; width: 1px; height: 36px; margin: 10px auto 0; 304 background: linear-gradient(180deg, rgba(255,255,255,.55), transparent); 305 animation: scrollPulse 2.8s cubic-bezier(.16,1,.3,1) infinite; 306 } 307 @keyframes scrollPulse { 308 0% { transform: scaleY(0); transform-origin: top; } 309 45% { transform: scaleY(1); transform-origin: top; } 310 55% { transform: scaleY(1); transform-origin: bottom; } 311 100% { transform: scaleY(0); transform-origin: bottom; } 312 } 313 /* é¦å±å ¥åºç¼æ:便¬¡æ·¡å ¥ä¸ç§»(ç©çç¼å¨) */ 314 @keyframes heroIn { 315 from { opacity: 0; transform: translateY(28px); } 316 to { opacity: 1; transform: none; } 317 } 318 @keyframes heroFade { 319 from { opacity: 0; } 320 to { opacity: 1; } 321 } 322 .hero-eyebrow, .hero h1, .hero-sub, .hero-actions, .hero-media { 323 animation: heroIn 1s cubic-bezier(.16,1,.3,1) both; 324 } 325 .hero-eyebrow { animation-delay: .06s; } 326 .hero h1 { animation-delay: .2s; } 327 .hero-sub { animation-delay: .36s; } 328 .hero-actions { animation-delay: .52s; } 329 .hero-media { animation-delay: .68s; } 330 .hero-scroll { animation: heroFade 1.6s ease 1.1s both; } 331 332 /* ============ æ°æ®æ¡ ============ */ 333 .stats { 334 display: flex; justify-content: center; gap: 20px; 335 padding: 0 24px; margin-top: -58px; position: relative; z-index: 3; 336 flex-wrap: wrap; 337 } 338 .stat { 339 background: var(--card); 340 border-radius: var(--radius-md); padding: 18px 34px; 341 text-align: center; min-width: 140px; 342 box-shadow: var(--shadow-1); 343 transition: transform .3s ease, box-shadow .3s ease; 344 } 345 .stat:hover { transform: translateY(-3px); box-shadow: var(--shadow-2); } 346 .stat .num { font-size: 1.7rem; font-weight: 800; color: var(--ink); letter-spacing: .5px; } 347 .stat .num small { font-size: 1rem; font-weight: 700; color: var(--brand); } 348 /* ç²ä¸å:ç²¾ç¡®å®æ¶æ°å(6使°+ååä½),åå·ç¥æ¶ä»¥ä¸é»å¡åè° */ 349 .stat-fans .num { font-size: 1.28rem; letter-spacing: .2px; } 350 /* é¢è®¾ 7 å符宽度:å ¥åº 0â112,363 å ¨ç¨å¡çä¸åå 使°å¢é¿èè·³å®½éæ */ 351 .stat-fans .cn { display: inline-block; min-width: 7.2ch; text-align: center; } 352 .stat .label .live { 353 display: inline-block; width: 6px; height: 6px; border-radius: 50%; 354 background: var(--brand); margin-left: 7px; vertical-align: 1px; 355 box-shadow: 0 0 0 0 rgba(59,130,246,.45); 356 animation: livePulse 1.8s ease-out infinite; 357 } 358 @keyframes livePulse { 359 0% { box-shadow: 0 0 0 0 rgba(59,130,246,.45); } 360 70% { box-shadow: 0 0 0 7px rgba(59,130,246,0); } 361 100% { box-shadow: 0 0 0 0 rgba(59,130,246,0); } 362 } 363 .stat .label { font-size: .82rem; color: var(--ink-faint); margin-top: 2px; } 364 365 /* ============ åºåéç¨ ============ */ 366 .section { max-width: 1080px; margin: 0 auto; padding: 100px 24px; } 367 .section-head { text-align: center; margin-bottom: 52px; } 368 .section-eyebrow { 369 display: inline-flex; align-items: center; gap: 12px; 370 font-size: .78rem; font-weight: 700; letter-spacing: 3px; 371 color: var(--brand); text-transform: uppercase; margin-bottom: 14px; 372 } 373 .section-head .section-eyebrow::before, .section-head .section-eyebrow::after { 374 content: ''; width: 26px; height: 1px; 375 background: linear-gradient(90deg, transparent, var(--brand)); 376 opacity: .55; 377 } 378 .section-head .section-eyebrow::after { background: linear-gradient(90deg, var(--brand), transparent); } 379 .section-head h2 { font-size: 2rem; font-weight: 800; letter-spacing: .3px; } 380 .section-head p { color: var(--ink-soft); margin-top: 12px; font-size: 1rem; } 381 382 /* ============ æ ¸å¿åè½ ============ */ 383 .grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 20px; } 384 .card { 385 background: var(--card); border-radius: var(--radius-lg); 386 padding: 30px 26px; 387 box-shadow: var(--shadow-1); 388 transition: transform .35s cubic-bezier(.16,1,.3,1), box-shadow .35s ease; 389 } 390 .card:hover { 391 transform: translateY(-5px); 392 box-shadow: var(--shadow-2); 393 } 394 .card .ico { 395 width: 48px; height: 48px; border-radius: 14px; 396 display: flex; align-items: center; justify-content: center; 397 font-size: 1.5rem; margin-bottom: 18px; 398 } 399 /* 徿 åº:ç»ä¸åä¸åçè²ç³»(ä½é¥±å) */ 400 .card .ico { background: linear-gradient(135deg, rgba(59,130,246,.14), rgba(59,130,246,.04)); } 401 .card h3 { font-size: 1.05rem; font-weight: 700; margin-bottom: 8px; } 402 .card p { font-size: .88rem; color: var(--ink-soft); line-height: 1.7; } 403 .card .go { 404 display: inline-block; margin-top: 16px; font-size: .85rem; font-weight: 600; 405 color: var(--brand); transition: color .25s ease; 406 } 407 .card:hover .go { color: var(--brand-deep); } 408 409 /* ============ è§é¢åº ============ */ 410 .video-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 20px; } 411 .vcard { 412 background: var(--card); border-radius: var(--radius-lg); overflow: hidden; 413 box-shadow: var(--shadow-1); 414 transition: transform .35s cubic-bezier(.16,1,.3,1), box-shadow .35s ease; 415 } 416 .vcard:hover { transform: translateY(-5px); box-shadow: var(--shadow-2); } 417 .vcard .thumb { 418 position: relative; height: 140px; 419 display: flex; align-items: center; justify-content: center; 420 font-size: 2.6rem; background: #eef1f6; 421 } 422 .vcard .thumb img { 423 position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; 424 transition: transform .9s cubic-bezier(.16,1,.3,1); 425 } 426 .vcard:hover .thumb img { transform: scale(1.06); } 427 .vcard .thumb .dur { 428 position: absolute; right: 8px; bottom: 8px; z-index: 1; 429 background: rgba(0,0,0,.72); color: #fff; 430 font-size: .72rem; padding: 2px 8px; border-radius: 999px; 431 } 432 .vcard:nth-child(1) .thumb { background: linear-gradient(135deg, rgba(59,130,246,.14), rgba(139,92,246,.14)); } 433 .vcard:nth-child(2) .thumb { background: linear-gradient(135deg, rgba(245,158,11,.14), rgba(239,68,68,.14)); } 434 .vcard:nth-child(3) .thumb { background: linear-gradient(135deg, rgba(16,185,129,.14), rgba(59,130,246,.14)); } 435 .vcard:nth-child(4) .thumb { background: linear-gradient(135deg, rgba(139,92,246,.14), rgba(236,72,153,.14)); } 436 /* ææ¾æé® */ 437 .vcard .thumb .play { 438 position: absolute; width: 44px; height: 44px; border-radius: 50%; 439 background: rgba(255,255,255,.9); color: var(--brand); 440 display: flex; align-items: center; justify-content: center; 441 font-size: .95rem; box-shadow: 0 8px 20px -6px rgba(0,0,0,.25); 442 opacity: 0; transform: scale(.8); 443 transition: all .3s ease; 444 } 445 .vcard:hover .thumb .play { opacity: 1; transform: scale(1); } 446 .vcard .body { padding: 18px; } 447 .vcard h4 { font-size: .98rem; font-weight: 700; margin-bottom: 6px; line-height: 1.4; } 448 .vcard .meta { font-size: .8rem; color: var(--ink-faint); } 449 /* æ¥çæ´å¤æé® */ 450 .more-wrap { text-align: center; margin-top: 40px; } 451 .more-btn { 452 display: inline-block; padding: 12px 36px; 453 border: 1px solid var(--line); border-radius: 999px; 454 background: var(--card); color: var(--ink-soft); 455 font-size: .9rem; font-weight: 600; letter-spacing: 2px; 456 box-shadow: var(--shadow-1); 457 transition: all .35s ease; 458 } 459 .more-btn:hover { 460 border-color: var(--brand); color: var(--brand); 461 transform: translateY(-2px); box-shadow: var(--shadow-2); 462 } 463 464 /* ============ å ¬å¸ç念 ============ */ 465 .about-grid { 466 display: grid; grid-template-columns: 1.05fr 1fr; gap: 56px; align-items: start; 467 } 468 .about-text .section-eyebrow { margin-bottom: 12px; } 469 .about-text h2 { font-size: 1.9rem; font-weight: 800; line-height: 1.35; margin-bottom: 18px; } 470 .about-text h2 .grad { 471 color: var(--brand); 472 -webkit-background-clip: initial; background-clip: initial; 473 } 474 .about-text p { color: var(--ink-soft); font-size: .95rem; line-height: 1.9; margin-bottom: 14px; } 475 .about-text p b { color: var(--ink); font-weight: 700; } 476 .about-sign { font-size: .95rem; font-weight: 700; color: var(--ink); margin-top: 20px; } 477 .about-sign span { color: var(--ink-faint); font-weight: 500; font-size: .82rem; margin-left: 8px; } 478 .about-tags { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 24px; } 479 .about-tags .tag { 480 font-size: .8rem; color: var(--ink-soft); 481 background: var(--card); 482 padding: 7px 16px; border-radius: 999px; 483 } 484 .about-tags .tag b { color: var(--brand); font-weight: 700; } 485 .about-cards { display: flex; flex-direction: column; gap: 16px; } 486 .about-card { 487 display: flex; gap: 18px; align-items: flex-start; 488 background: var(--card); 489 border-radius: var(--radius-md); padding: 22px 24px; 490 box-shadow: var(--shadow-1); 491 transition: transform .35s cubic-bezier(.16,1,.3,1), box-shadow .35s ease; 492 } 493 .about-card:hover { transform: translateY(-3px); box-shadow: var(--shadow-2); } 494 .about-card .ico { 495 width: 44px; height: 44px; border-radius: 12px; flex-shrink: 0; 496 display: flex; align-items: center; justify-content: center; 497 font-size: .85rem; font-weight: 800; letter-spacing: 1px; 498 color: var(--brand); 499 background: linear-gradient(135deg, rgba(59,130,246,.14), rgba(59,130,246,.04)); 500 } 501 .about-card .ico { background: linear-gradient(135deg, rgba(59,130,246,.14), rgba(59,130,246,.04)); } 502 .about-card h4 { font-size: 1rem; font-weight: 700; margin-bottom: 6px; } 503 .about-card h4 em { font-style: normal;
503 color: var(--ink-faint); font-weight: 500; font-size: .85rem; margin-left: 8px; } 504 .about-card p { font-size: .85rem; color: var(--ink-soft); line-height: 1.75; } 505 506 /* ============ åå(å»è¾¹æ¡,ç½åºé é´å½±æ¬æµ®) ============ */ 507 .friends-section { background: transparent; } 508 .friends-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 16px; } 509 .friend { 510 display: flex; align-items: center; gap: 14px; 511 background: var(--card); 512 border-radius: var(--radius-md); padding: 16px 18px; 513 box-shadow: var(--shadow-1); 514 transition: all .35s ease; 515 } 516 .friend:hover { 517 transform: translateY(-3px); 518 background: var(--card); 519 box-shadow: var(--shadow-2); 520 } 521 .friend .logo { 522 width: 44px; height: 44px; border-radius: 12px; flex-shrink: 0; 523 display: flex; align-items: center; justify-content: center; 524 font-size: 1.15rem; font-weight: 800; color: #fff; 525 } 526 .friend:nth-child(1) .logo { background: linear-gradient(160deg, #33415e, #232c42); } 527 .friend:nth-child(2) .logo { background: linear-gradient(160deg, #33415e, #232c42); } 528 .friend:nth-child(3) .logo { background: linear-gradient(160deg, #33415e, #232c42); } 529 .friend:nth-child(4) .logo { background: linear-gradient(160deg, #33415e, #232c42); } 530 .friend:nth-child(5) .logo { background: linear-gradient(160deg, #33415e, #232c42); } 531 .friend:nth-child(6) .logo { background: linear-gradient(160deg, #33415e, #232c42); } 532 .friend:nth-child(7) .logo { background: linear-gradient(160deg, #33415e, #232c42); } 533 .friend:nth-child(8) .logo { background: linear-gradient(160deg, #33415e, #232c42); } 534 .friend:nth-child(9) .logo { background: linear-gradient(160deg, #33415e, #232c42); } 535 .friend:nth-child(10) .logo { background: linear-gradient(160deg, #33415e, #232c42); } 536 .friend:nth-child(11) .logo { background: linear-gradient(160deg, #33415e, #232c42); } 537 .friend .info { flex: 1; min-width: 0; } 538 .friend .name { font-size: .98rem; font-weight: 700; display: flex; align-items: center; gap: 6px; } 539 .friend .name .arrow { color: var(--ink-faint); font-size: .8rem; transition: all .25s ease; } 540 .friend:hover .name .arrow { color: var(--brand); transform: translateX(3px); } 541 .friend .desc { 542 font-size: .8rem; color: var(--ink-faint); 543 white-space: nowrap; overflow: hidden; text-overflow: ellipsis; margin-top: 2px; 544 } 545 546 /* ============ CTA(æç®æ¶æ:大å + ææ¬é¾æ¥ + 大çç½) ============ */ 547 .cta { text-align: center; padding: 120px 24px; background: linear-gradient(170deg, #101c33 0%, #1c1745 100%); color: #fff; } 548 .cta h2 { font-size: clamp(1.9rem, 3.6vw, 2.8rem); font-weight: 800; letter-spacing: 2px; margin-bottom: 18px; } 549 .cta p { color: rgba(255,255,255,.62); margin-bottom: 44px; font-weight: 300; letter-spacing: .6px; } 550 .cta-actions { display: flex; gap: 48px; justify-content: center; flex-wrap: wrap; } 551 .cta .hero-link { border-bottom-color: rgba(255,255,255,.3); } 552 553 /* ============ 页è ============ */ 554 .footer { 555 position: relative; 556 background: linear-gradient(180deg, #0f172a 0%, #0a0f1e 100%); 557 color: #94a3b8; padding: 64px 48px 32px; 558 } 559 .footer::before { 560 content: ''; position: absolute; top: 0; left: 0; right: 0; height: 1px; 561 background: linear-gradient(90deg, transparent, rgba(59,130,246,.55), rgba(139,92,246,.4), transparent); 562 } 563 .footer h5 { color: #e2e8f0; font-size: .88rem; font-weight: 700; margin-bottom: 18px; letter-spacing: 2px; } 564 .footer-grid { 565 display: grid; grid-template-columns: 2fr 1fr 1fr 1fr; gap: 40px; 566 max-width: 1080px; margin: 0 auto; 567 } 568 .footer a { display: block; color: #8fa0b8; font-size: .86rem; margin-bottom: 12px; transition: color .3s ease; } 569 .footer a:hover { color: #fff; } 570 .footer .brand { font-size: 1.1rem; font-weight: 800; color: #fff; margin-bottom: 14px; letter-spacing: .5px; } 571 .footer .brand .dot { 572 width: 10px; height: 10px; border-radius: 3px; display: inline-block; 573 background: linear-gradient(135deg, var(--brand), #8b5cf6); margin-right: 8px; 574 } 575 .footer .desc { font-size: .85rem; font-weight: 300; line-height: 2; margin-bottom: 20px; color: #7c8ba5; } 576 .footer-bottom { 577 max-width: 1080px; margin: 48px auto 0; padding-top: 26px; 578 border-top: 1px solid rgba(255,255,255,.07); 579 font-size: .76rem; letter-spacing: 1px;
579 color: #5b6a85; text-align: center; 580 } 581 582 /* ============ 卿 ============ */ 583 .reveal { opacity: 0; transform: translateY(30px); transition: opacity .9s cubic-bezier(.16,1,.3,1), transform .9s cubic-bezier(.16,1,.3,1); } 584 .reveal.in { opacity: 1; transform: none; } 585 /* æ¬æµ®ä¸æµ®(ç½®äº .reveal.in ä¹å,è¦çå ¶ transform:none,ä¿è¯æ¸æ¾å®æåæ¬åä»çæ) */ 586 .stat:hover, .card:hover, .vcard:hover, .friend:hover, .about-card:hover { 587 transform: translateY(-4px); 588 transition: transform .3s cubic-bezier(.16,1,.3,1), box-shadow .3s ease, border-color .3s ease, background .3s ease; 589 } 590 591 /* ============ 导èªç»å½åº ============ */ 592 .nav-auth-group { display: flex; gap: 8px; align-items: center; } 593 /* å京æ¶é´æ¶é(ä¸è¡æ¶é´ / ä¸è¡æ¥æ+æ ç¾) */ 594 .nav-clock { 595 display: flex; flex-direction: column; align-items: flex-end; 596 margin-right: 8px; flex-shrink: 0; user-select: none; line-height: 1.35; 597 } 598 .nav-clock .nc-time { 599 font-size: 15.5px; font-weight: 800; letter-spacing: 1.5px; 600 color: var(--ink); 601 font-variant-numeric: tabular-nums; 602 } 603 .nav-clock .nc-row { 604 display: flex; align-items: baseline; gap: 6px; 605 font-style: normal; 606 } 607 .nav-clock .nc-date { 608 font-size: 10.5px; font-weight: 600; letter-spacing: .4px; 609 color: var(--ink-soft); 610 font-variant-numeric: tabular-nums; 611 } 612 .nav-clock .nc-label { 613 font-size: 8.5px; font-weight: 600; letter-spacing: 2px; 614 color: var(--ink-faint); 615 } 616 .nav-auth { 617 padding: 8px 18px; border-radius: 999px; 618 background: rgba(255,255,255,.6); color: var(--ink); 619 border: 1px solid var(--line); 620 font-size: .88rem; font-weight: 600; cursor: pointer; 621 transition: all .25s ease; white-space: nowrap; 622 } 623 .nav-auth:hover { background: #fff; border-color: rgba(59,130,246,.4); } 624 .nav-auth.primary { 625 background: linear-gradient(135deg, var(--brand), #6366f1); 626 border-color: transparent; color: #fff; 627 box-shadow: 0 8px 20px -8px rgba(59,130,246,.5); 628 } 629 .nav-auth.primary:hover { background: linear-gradient(135deg, #2563eb, #4f46e5); color: #fff; } 630 /* 主é¢åæ¢æé® */ 631 .nav-right-group { display: flex; align-items: center; gap: 10px; } 632 .theme-btn { 633 display: flex; width: 42px; height: 42px; border-radius: 12px; cursor: pointer; 634 background: rgba(255,255,255,.7); border: 1px solid var(--line); 635 font-size: 1.1rem; color: var(--ink); align-items: center; justify-content: center; 636 transition: all .25s ease; flex-shrink: 0; 637 } 638 .theme-btn:hover { background: #fff; border-color: rgba(59,130,246,.4); } 639 640 /* ============ å ¬ååº(å» chrome:æ è¾¹æ¡ç½åº + èè²accentæ¡) ============ */ 641 .beta-announce { 642 display: flex; align-items: center; gap: 14px; 643 max-width: 1080px; margin: 30px auto 0; padding: 15px 24px; 644 background: var(--card); 645 border-radius: var(--radius-md); 646 box-shadow: var(--shadow-1); 647 position: relative; 648 } 649 .beta-announce::before { 650 content: ''; position: absolute; left: 0; top: 18px; bottom: 18px; width: 3px; 651 border-radius: 3px; background: var(--brand); 652 } 653 .beta-announce .ba-icon { 654 width: 40px; height: 40px; border-radius: 12px; flex-shrink: 0; 655 display: flex; align-items: center; justify-content: center; font-size: 1.2rem; 656 background: linear-gradient(135deg, #dbeafe, #eff6ff); 657 } 658 .beta-announce .ba-title { 659 flex-shrink: 0; font-size: .82rem; font-weight: 700; color: var(--brand); 660 background: rgba(59,130,246,.08); border-radius: 999px; padding: 4px 12px; 661 } 662 .beta-announce .ba-track-wrap { flex: 1; overflow: hidden; min-width: 0; } 663 .beta-announce .ba-track { display: inline-block; white-space: nowrap; will-change: transform; } 664 .beta-announce .ba-item { 665 display: inline-block; white-space: nowrap; padding-right: 80px; 666 font-size: .92rem; color: var(--ink-soft); 667 } 668 .beta-announce a { color: var(--brand); text-decoration: underline; } 669 .beta-announce a:hover { color: var(--brand-deep); } 670 @media (max-width: 760px) { .beta-announce { align-items: flex-start; flex-wrap: wrap; } } 671 672 /* ============ é¼ æ ç¹æ ============ */ 673 .ui-fx-glow { 674 position: fixed; left: -999px; top: -999px; width: 240px; height: 240px; 675 border-radius: 50%; pointer-events: none; z-index: 9997; 676 transform: translate(-50%, -50%); 677 background: radial-gradient(circle, rgba(59,130,246,.18), rgba(139,92,246,.10) 45%, transparent 65%); 678 opacity: 0; 679 } 680 681 /* ============ ç»èå«ç ============ */ 682 ::selection { background: rgba(59,130,246,.2); } 683 ::-webkit-scrollbar { width: 9px; } 684 ::-webkit-scrollbar-thumb { background: rgba(59,130,246,.3); border-radius: 9px; } 685 ::-webkit-scrollbar-thumb:hover { background: rgba(59,130,246,.5); } 686 ::-webkit-scrollbar-track { background: transparent; } 687 a:focus-visible { outline: 2px solid var(--brand); outline-offset: 3px; border-radius: 6px; } 688 .num, .cn, #siteDays { font-variant-numeric: tabular-nums; } 689 @media (prefers-reduced-motion: reduce) { 690 *, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; } 691 html { scroll-behavior: auto; } 692 } 693 694 /* ============ å¯¼èªæ»å¨æ + æ±å ¡/æ½å± ============ */ 695 .nav { transition: background .3s ease, box-shadow .3s ease; } 696 .nav.scrolled { background: rgba(255,255,255,.94); box-shadow: 0 10px 30px -20px rgba(15,23,42,.3); } 697 .nav-burger { 698 display: none; width: 42px; height: 42px; border-radius: 12px; cursor: pointer; 699 background: rgba(255,255,255,.7); border: 1px solid var(--line); 700 font-size: 1.2rem; color: var(--ink); align-items: center; justify-content: center; 701 } 702 /* æ«ç :ææºç«¯å³ä¸è§,ä½ç½®å¨æ±å ¡æé®å³è¾¹ã 703 é»è®¤éè ââ â æ¡é¢ç«¯æ¬æ¥å°±è¯¥éè â¡ ç½é¡µç«¯è°ä¸å¨æå头,åªæ APP éææ¾ç¤º 704 (JS æ UA 夿,䏿¯ APP 就设æ display:none)ã */ 705 .nav-scan { 706 display: none; width: 42px; height: 42px; border-radius: 12px; cursor: pointer; 707 background: rgba(255,255,255,.7); border: 1px solid var(--line); 708 color: var(--ink); align-items: center; justify-content: center; 709 text-decoration: none; -webkit-tap-highlight-color: transparent; 710 } 711 .nav-scan:hover { border-color: rgba(59,130,246,.5); color: var(--brand); } 712 .nav-scan:active { transform: scale(.94); } 713 .nav-scan svg { width: 21px; height: 21px; display: block; } 714 .drawer-mask { display: none; position: fixed; inset: 0; z-index: 9000; background: rgba(15,23,42,.4); -webkit-backdrop-filter: blur(2px); backdrop-filter: blur(2px); } 715 .drawer { 716 position: fixed; top: 0; right: -320px; width: 300px; max-width: 85vw; height: 100vh; 717 z-index: 9001; background: #fff; box-shadow: -20px 0 60px -30px rgba(0,0,0,.4); 718 transition: right .35s cubic-bezier(.16,1,.3,1); 719 padding: 22px 20px; overflow-y: auto; 720 display: flex; flex-direction: column; gap: 4px; 721 } 722 .drawer.open { right: 0; } 723 .drawer .d-head { display: flex; justify-content: space-between; align-items: center; margin-bottom: 14px; } 724 .drawer .d-brand { font-weight: 800; font-size: 1.05rem; display: flex; align-items: center; gap: 8px; color: var(--ink); } 725 .drawer .d-brand .dot { width: 10px; height: 10px; border-radius: 3px; display: inline-block; background: linear-gradient(135deg, var(--brand), #8b5cf6); } 726 .drawer .d-close { width: 36px; height: 36px; border-radius: 10px; border: none; background: var(--bg); font-size: .95rem; cursor: pointer; color: var(--ink); } 727 .drawer .d-close:hover { background: rgba(59,130,246,.1); } 728 .drawer a.d-item { padding: 12px 16px; border-radius: 12px; color: var(--ink-soft); font-size: .98rem; font-weight: 600; } 729 .drawer a.d-item:hover, .drawer a.d-item.active { background: rgba(59,130,246,.1); color: var(--brand); } 730 .drawer .d-auth { margin-top: 14px; padding-top: 16px; border-top: 1px solid var(--line); display: flex; gap: 10px; } 731 .drawer .d-auth a { flex: 1; text-align: center; padding: 11px; border-radius: 999px; font-size: .9rem; font-weight: 600; } 732 .drawer .d-auth .ga { background: var(--bg); color: var(--ink); border: 1px solid var(--line); } 733 .drawer .d-auth .gab { background: linear-gradient(135deg, var(--brand), #6366f1); color: #fff; } 734 @media (max-width: 900px) { 735 .nav-menu { display: none; } 736 .nav-auth-group { display: none; } 737 .nav-clock { display: none; } 738 .nav-burger { display: flex; } 739 .nav-scan { display: flex; } 740 } 741 742 /* ===== Hero è§é¢è´¨æå£³ ===== */ 743 .hero-video { position: relative; } 744 .hero-video .hv-tag { 745 position: absolute; top: 20px; left: 50%; transform: translateX(-50%); z-index: 3; 746 display: inline-flex; align-items: center; gap: 6px; 747 padding: 6px 16px; border-radius: 999px; white-space: nowrap; 748 background: rgba(15,23,42,.55); color: rgba(255,255,255,.92); 749 -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px); 750 border: 1px solid rgba(255,255,255,.16); font-size: .78rem; letter-spacing: .5px; 751 } 752 753 /* ===== 大äºè®°:sticky ä¹åæ ç¨(åè nanfu.global å½é ç:æ»å¨åäºåºå®èå° + ä¹å年份 + è½éæ ¸å¿è¡é©¶) ===== */ 754 .jny-section { padding-bottom: 0; } 755 .jny-spacer { position: relative; height: 200vh; } /* JS 伿éè¦ç为 run+stageH,ä¿è¯ sticky å ¨ç¨åºå® */ 756 .jny-stage { 757 position: sticky; top: 70px; 758 height: calc(100vh - 130px); 759 min-height: 540px; max-height: 720px; 760 border-radius: 26px; overflow: hidden; 761 background: 762 radial-gradient(760px 420px at 18% 16%, rgba(59,130,246,.16), transparent 60%), 763 radial-gradient(700px 460px at 90% 85%, rgba(139,92,246,.12), transparent 60%), 764 linear-gradient(168deg, #0b1220 0%, #101c33 60%, #161340 100%); 765 color: #fff; 766 box-shadow: 0 60px 120px -50px rgba(8,12,28,.7); 767 } 768 .jny-bg { 769 position: absolute; inset: -20%; 770 background: radial-gradient(320px 320px at 50% 50%, rgba(96,165,250,.16), transparent 65%); 771 opacity: .7; will-change: transform; 772 } 773 /* 年份èç¹(ä¹å两æ) */ 774 .jny-node { 775 position: absolute; text-align: center; transform: translate(-50%, -50%); 776 color: rgba(255,255,255,.85); white-space: nowrap; z-index: 3; 777 transition: color .6s ease, opacity .6s ease, text-shadow .6s ease; 778 } 779 .jny-node .jy { display: block; font-size: 1.55rem; font-weight: 800; letter-spacing: 1px; line-height: 1.05; font-variant-numeric: tabular-nums; } 780 .jny-node .jm { display: block; font-size: .62rem; font-weight: 600; letter-spacing: 2.5px; opacity: .85; margin-top: 6px; text-transform: uppercase; } 781 .jny-node.dim { opacity: .3; } 782 .jny-node.lit { color: #fff; text-shadow: 0 0 26px rgba(96,165,250,.65); } 783 .jny-node.lit .jy { color: #9cc0ff; } 784 /* 轨迹 SVG */ 785 .jny-svg { position: absolute; inset: 0; width: 100%; height: 100%; z-index: 1; pointer-events: none; } 786 .jny-svg .base { fill: none; stroke: rgba(255,255,255,.10); stroke-width: 1.5; } 787 .jny-svg .go { 788 fill: none; stroke: rgba(96,165,250,.9); stroke-width: 2; 789 filter: drop-shadow(0 0 6px rgba(96,165,250,.65)); 790 } 791 /* è½éæ ¸å¿(坿æ½) */ 792 .jny-batt { 793 position: absolute; left: 0; top: 0; width: 30px; height: 30px; margin: -15px 0 0 -15px; 794 z-index: 5; pointer-events: none; 795 will-change: transform; 796 } 797 .jny-batt i, .jny-batt b { position: absolute; border-radius: 50%; } 798 .jny-batt i { inset: 0; background: #fff; box-shadow: 0 0 22px rgba(96,165,250,.9), 0 0 46px rgba(59,130,246,.5); } 799 .jny-batt b { 800 inset: -9px; border: 1px solid rgba(96,165,250,.55); 801 animation: jnyPulse 2.4s cubic-bezier(.16,1,.3,1) infinite; 802 } 803 /* å½ä¸çåº(éå½¢æ¾å¤§,ä¾¿äºæå) */ 804 .jny-batt .hit { 805 position: absolute; inset: -34px; border-radius: 50%; 806 pointer-events: auto; cursor: grab; 807 touch-action: none; 808 } 809 .jny-batt:hover .hit { cursor: grab; } 810 .jny-batt.dragging .hit { cursor: grabbing; } 811 .jny-batt.dragging i { 812 box-shadow: 0 0 30px rgba(96,165,250,1), 0 0 70px rgba(59,130,246,.75); 813 } 814 .jny-batt.dragging b { animation-duration: 1s; } 815 @keyframes jnyPulse { 816 0% { transform: scale(.55); opacity: .85; } 817 70% { transform: scale(1.25); opacity: 0; } 818 100% { opacity: 0; } 819 } 820 /* 说æå¡ */ 821 .jny-cardwrap { 822 position: absolute; left: 50%; bottom: 3%; transform: translateX(-50%); 823 width: min(620px, 84%); height: 176px; z-index: 4; 824 } 825 .jny-card { 826 position: absolute; inset: 0; display: flex; flex-direction: column; 827 justify-content: center; align-items: center; text-align: center; 828 padding: 18px 32px; border-radius: 20px; 829 background: rgba(15,23,42,.55); 830 -webkit-backdrop-filter: blur(14px); backdrop-filter: blur(14px); 831 border: 1px solid rgba(255,255,255,.1); 832 opacity: 0; transform: translateY(18px); pointer-events: none; 833 transition: opacity .6s cubic-bezier(.16,1,.3,1), transform .6s cubic-bezier(.16,1,.3,1); 834 } 835 .jny-card.on { opacity: 1; transform: none; pointer-events: auto; } 836 .jny-tag { font-size: 11px; font-weight: 700; letter-spacing: 3px; color: #9cc0ff; margin-bottom: 8px; } 837 .jny-h { font-size: 1.32rem; font-weight: 800; letter-spacing: .6px; margin-bottom: 8px; color: #fff; } 838 .jny-d { font-size: .9rem; font-weight: 300; line-height: 1.8; color: rgba(255,255,255,.74); max-width: 540px; } 839 /* è¿åº¦æç¤º(å³ä¸è§) */ 840 .jny-progress { 841 position: absolute;
841 right: 26px; top: 22px; z-index: 6; 842 display: flex; align-items: center; gap: 10px; 843 font-size: 10px; letter-spacing: 3px; color: rgba(255,255,255,.5); 844 } 845 .jny-progress .bar { width: 120px; height: 2px; background: rgba(255,255,255,.14); border-radius: 2px; overflow: hidden; } 846 .jny-progress .bar i { display: block; height: 100%; width: 0; background: linear-gradient(90deg, #60a5fa, #a78bfa); border-radius: 2px; } 847 /* SVG 轨迹 */ 848 .jny-svg .base { fill: none; stroke: rgba(255,255,255,.09); stroke-width: 1.5; } 849 .jny-svg .go { 850 fill: none; stroke: rgba(110,170,255,.95); stroke-width: 2.4; stroke-linecap: round; 851 filter: drop-shadow(0 0 6px rgba(96,165,250,.7)); 852 } 853 /* èç¹(ç´§åéé 11 个) */ 854 .jny-node { transform: translate(-50%, -50%); } 855 .jny-node .jy { font-size: 1.35rem; } 856 .jny-node .jm { font-size: .58rem; letter-spacing: 2px; } 857 @media (max-width: 760px) { 858 .jny-spacer { height: 180vh; } 859 .jny-stage { border-radius: 20px; } 860 .jny-cardwrap { bottom: 2%; height: 190px; width: 90%; } 861 .jny-card { padding: 12px 14px; } 862 .jny-h { font-size: 1.02rem; } 863 .jny-d { font-size: .78rem; line-height: 1.65; } 864 .jny-progress { display: none; } 865 /* â¡ ææºä¸æè¦å½ç䏿¡ï¼åæ¥æ¯å¼ å¡ç齿 backdrop-filter: blur(14px)ï¼ 866 11 å¼ å å¨ä¸èµ·ï¼GPU æ¯å¸§è¦åæ 11 个模ç³å± ââ æå¸§ç主å ã 867 æ¢æä¸éæåº¦æ´é«ç纯è²èæ¯ï¼è§æå 乿²¡å·®ï¼å¼é天差å°å«ã */ 868 .jny-card { 869 -webkit-backdrop-filter: none; backdrop-filter: none; 870 background: rgba(15,23,42,.9); 871 } 872 /* 没轮å°çå¡çç¨ visibility éèï¼opacity:0 ä»ä¼è¢«åæï¼visibility ä¸ä¼ */ 873 .jny-card { visibility: hidden; transition: opacity .35s ease, transform .35s ease, visibility 0s linear .35s; } 874 .jny-card.on { visibility: visible; transition: opacity .35s ease, transform .35s ease, visibility 0s; } 875 /* 轨迹ä¸çåå æ»¤é卿æºä¸ä¹å¾è´µï¼å»æ */ 876 .jny-svg .go { filter: none; } 877 /* çªå±ä¸æä¹å:èç¹æ´ä½ç¼©å°,年份åç´§,é¿å "2025"们å å¨ä¸èµ· */ 878 .jny-node .jy { font-size: 1.08rem; letter-spacing: .5px; } 879 .jny-node .jm { font-size: .5rem; letter-spacing: 1.4px; margin-top: 4px; } 880 .jny-node.lit { text-shadow: 0 0 14px rgba(96,165,250,.6); } 881 } 882 /* ===== åå°é¡¶é¨ ===== */ 883 .backtop { 884 position: fixed; right: 26px; bottom: 26px; z-index: 5000; 885 width: 46px; height: 46px; border-radius: 50%; 886 background: rgba(255,255,255,.92); color: var(--brand); 887 border: 1px solid var(--line); box-shadow: 0 12px 30px -12px rgba(15,23,42,.4); 888 font-size: 1.15rem; cursor: pointer; 889 opacity: 0; transform: translateY(12px); transition: all .3s ease; 890 } 891 .backtop.show { opacity: 1; transform: none; } 892 .backtop:hover { background: var(--brand); color: #fff; } 893 894 /* ============ ååºå¼ ============ */ 895 @media (max-width: 760px) { 896 .nav { padding: 0 20px; } 897 .nav-menu { display: none; } 898 .hero { padding: 96px 24px 130px; } 899 .hero h1 { font-size: 2.3rem; } 900 .hero-inner { grid-template-columns: 1fr; gap: 44px; } 901 .hero-eyebrow { margin-bottom: 30px; letter-spacing: 5px; } 902 .hero-sub { max-width: none; } 903 .hero-video { max-width: 380px; margin: 0 auto; } 904 .stats { gap: 12px; } 905 .stat { min-width: 120px; padding: 14px 18px; } 906 .section { padding: 84px 20px; } 907 .section-head { margin-bottom: 40px; } 908 .section-head h2 { font-size: 1.72rem; } 909 .about-grid { grid-template-columns: 1fr; gap: 36px; } 910 .friends-grid { grid-template-columns: 1fr; } 911 .footer { padding: 44px 20px 24px; } 912 .footer-grid { grid-template-columns: 1fr; gap: 28px; } 913 .backtop { right: 18px; bottom: 18px; width: 42px; height: 42px; } 914 } 915 [id] { scroll-margin-top: 86px; } 916 917 918/* ===== ãæ´å¤åè½ã䏿(å¨ç»ä¸åèå项å®å ¨ä¸è´) ===== */ 919.nav-more { position: relative; display: flex; align-items: center; } 920.nav-more-btn { 921 position: relative; padding: 10px 14px; 922 font-size: .92rem; font-weight: 500; letter-spacing: .4px; 923 color: var(--ink-soft); background: none; border: none; cursor: pointer; 924 font-family: inherit; white-space: nowrap; 925 transition: color .3s ease; 926} 927.nav-more-btn::after { 928 content: ''; position: absolute; left: 14px; right: 14px; bottom: 2px; 929 height: 1px; background: var(--brand); 930 transform: scaleX(0); transform-origin: left; 931 transition: transform .35s cubic-bezier(.16,1,.3,1); 932} 933.nav-more-btn:hover { color: var(--ink); } 934.nav-more-btn:hover::after { transform: scaleX(1); } 935.nav-more.open .nav-more-btn { color: var(--ink); } 936.nav-more.open .nav-more-btn::after { transform: scaleX(1); } 937.nav-more-btn.active { color: var(--brand); font-weight: 600; } 938.nav-more-btn.active::after { transform: scaleX(1); } 939.nav-more-panel { 940 display: none; position: absolute; top: calc(100% + 12px); right: 0; 941 min-width: 178px; padding: 8px; 942 background: var(--card); border: 1px solid var(--line); 943 border-radius: 14px; box-shadow: 0 18px 44px -20px rgba(15,23,42,.42); 944 z-index: 300; 945} 946.nav-more.open .nav-more-panel { display: block; } 947.nav-more-panel a { 948 display: block; padding: 9px 12px; border-radius: 9px; 949 font-size: .88rem; color: var(--ink-soft); text-decoration: none; white-space: nowrap; 950 transition: background .18s ease, color .18s ease; 951} 952.nav-more-panel a:hover { background: rgba(59,130,246,.1); color: var(--brand); } 953html.dark .nav-more-panel { background: #0f1a30; border-color: rgba(148,163,184,.22); } 954html.dark .nav-more-panel a:hover { background: rgba(59,130,246,.2); color: #fff; } 955 956/* ===== ç§»å¨ç«¯:乿¾ç¤ºè¿æ¡èåæ (左峿»å¨çå ¨é¨),ä¸ååªé æ±å ¡ ===== */ 957@media (max-width: 900px) { 958 .nav { padding: 0 12px; gap: 6px; } 959 .nav-logo { flex: 0 0 auto; margin-left: 0; } 960 .nav-menu { 961 display: flex; 962 flex: 1 1 auto; 963 min-width: 0; 964 justify-content: flex-start; 965 gap: 0; 966 overflow-x: auto; 967 overflow-y: hidden; 968 scrollbar-width: none; 969 -ms-overflow-style: none; 970 -webkit-overflow-scrolling: touch; 971 /* å³ä¾§æ¸é,æç¤ºè¿è½å¾å³æ» */ 972 -webkit-mask-image: linear-gradient(90deg, #000 0, #000 88%, transparent 100%); 973 mask-image: linear-gradient(90deg, #000 0, #000 88%, transparent 100%); 974 } 975 .nav-menu::-webkit-scrollbar { display: none; } 976 .nav-menu > a, .nav-menu .nav-more-btn { padding: 9px 11px; font-size: .86rem; letter-spacing: .2px; } 977 .nav-menu > a::after, .nav-menu .nav-more-btn::after { left: 11px; right: 11px; } 978 .nav-right-group { flex: 0 0 auto; gap: 6px; } 979 .theme-btn { width: 38px; height: 38px; border-radius: 11px; font-size: 1rem; } 980 .nav-burger { flex: 0 0 auto; } 981 /* 䏿颿¿å¨ææºä¸å± ä¸ä¸ç¹,é¿å è´´è¾¹è¢«è£ */ 982 .nav-more-panel { right: auto; left: 0; } 983} 984@media (max-width: 420px) { 985 .nav-menu > a, .nav-menu .nav-more-btn { padding: 9px 9px; font-size: .82rem; } 986 .nav-logo .logo-img { height: 28px; } 987} 988 989/* ===== ç§»å¨ç«¯ / APP éé å¢å¼º ===== */ 990/* 1) å®å ¨åº:APP å ¨å±è¿è¡æ¶,åæµ·å±/åºé¨æ¨ªæ¡ä¸ååä½å 容 */ 991body { 992 padding-left: env(safe-area-inset-left, 0); 993 padding-right: env(safe-area-inset-right, 0); 994} 995.nav { padding-top: env(safe-area-inset-top, 0); } 996.footer { padding-bottom: calc(24px + env(safe-area-inset-bottom, 0px)); } 997.backtop { bottom: calc(18px + env(safe-area-inset-bottom, 0px)); } 998.drawer { padding-top: calc(18px + env(safe-area-inset-top, 0px)); padding-bottom: calc(18px + env(safe-area-inset-bottom, 0px)); } 999.nav-more-panel { max-height: 70vh; overflow-y: auto; } 1000.d-modal, .modal-content, .cam-modal > div, .custom-modal > div { 1001 max-height: 86vh; overflow-y: auto; 1002} 1003 1004/* 2) 触æ¸ä½éª */ 1005a, button, [onclick], .sort-btn, .d-item { 1006 -webkit-tap-highlight-color: transparent; 1007 touch-action: manipulation; 1008} 1009html { -webkit-text-size-adjust: 100%; } 1010 1011/* 3) ææºä¸è¾å ¥æ¡åå·ç»ä¸ 16px: 1012 å°äº 16px æ¶ iOS/é¨åå®å WebView èç¦ä¼èªå¨æ¾å¤§æ´é¡µ(æå¸¸è§çä¸éé ææ¥æº) */ 1013@media (max-width: 900px) { 1014 input:not([type=checkbox]):not([type=radio]), textarea, select { 1015 font-size: 16px !important; 1016 } 1017 /* å ³é®æä½æé®çæå°å¯ç¹åºå(ä¸å½±åå°å¾æ æé®) */ 1018 button:not(.d-close):not(.nav-burger):not(.nav-scan):not(.theme-btn):not(.backtop):not(.react-btn):not(.reply-btn):not(.edit-btn):not(.delete-btn):not(.report-btn):not(.sort-btn), 1019 .btn, .hero-btn, .vhero-actions a { 1020 min-height: 38px; 1021 } 1022 /* è¡¨æ ¼:å·²ææ¨ªåæ»å¨å®¹å¨çä¿æ,没æçèªå¨å åº */ 1023 .table-wrap, .scroll-x, .stock-table-wrap { -webkit-overflow-scrolling: touch; } 1024 /* é¿ææ¬é²æº¢åº */ 1025 .comment-content, .bn-reason, .d-item, .pd-tip { word-break: break-word;
1025 overflow-wrap: anywhere; } 1026} 1027 1028/* 4) APP(ç¬ç«çªå£)ä¸:廿éä¸é«äº®ä¸é¿æèåçå¹²æ°,æ£ææ´æ¥è¿åç */ 1029@media (display-mode: standalone) { 1030 a, button { -webkit-user-select: none; user-select: none; } 1031 .comment-content { -webkit-user-select: text; user-select: text; } 1032 .backtop { display: none; } /* APP éç¨ç³»ç»è¿å鮿´èªç¶ */ 1033} 1034 1035/* ===== ææºä¸ãæ´å¤åè½ã䏿çå¤ç ===== 1036 åå :çªå±å¯¼èªèåæ¯æ¨ªåæ»å¨ç,èãæ´å¤åè½ãæå¨èåæå³ç«¯, 1037 åå§ä½ç½®å¨å±å¹å¤;ä¸èåç overflow 伿弹åºé¢æ¿è£æã 1038 å¤ç:ææºä¸éèè¿ä¸ªä¸æ(æ ¸å¿åè½å¨ â° æ½å±é齿),å¹³æ¿/æ¡é¢ä¿æå¯ç¨ã */ 1039@media (max-width: 900px) { 1040 .nav-more { display: none !important; } 1041 .nav-more-panel { display: none !important; } 1042} 1043/* å¹³æ¿/æ¡é¢:颿¿é å³å¼¹åºæ¶çåºè¾¹è·,é¿å è´´è¾¹ */ 1044@media (min-width: 901px) { 1045 .nav-more-panel { max-width: calc(100vw - 24px); } 1046} 1047 1048 1049/* ===== è¯è®ºå¯ææ¬:ç²ä½ / æä½ / è¡å 代ç (ä¸å¨é¾æ¥é¢è²) ===== */ 1050.comment-content b, .comment-content strong { font-weight: 800; } 1051.comment-content i, .comment-content em { font-style: italic; opacity: .95; } 1052.comment-content code { 1053 padding: 1px 6px; border-radius: 6px; 1054 background: rgba(120,120,120,.14); 1055 font-family: ui-monospace, Consolas, monospace; font-size: .92em; 1056} 1057.md-tip { font-size: .74rem; color: var(--ink-soft, #5a6270); opacity: .7; margin-top: 6px; } 1058.md-tip code { padding: 1px 4px; border-radius: 4px; background: rgba(120,120,120,.14); font-size: .95em; } 1059</style> 1060<link rel="manifest" href="/manifest.json"> 1061<link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32.png"> 1062<link rel="apple-touch-icon" sizes="180x180" href="/images/app-icon-180.png"> 1063<meta name="apple-mobile-web-app-capable" content="yes"> 1064<meta name="mobile-web-app-capable" content="yes"> 1065<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> 1066<meta name="apple-mobile-web-app-title" content="NBé¢é"> 1067<meta name="application-name" content="NBé¢é"> 1068<!-- nb-theme: 主é¢å ï¼å½åº / ç§æï¼ââ å¿ é¡»å¨é¡µé¢æ ·å¼ä¹åå è½½ --> 1069<link rel="stylesheet" href="../css/themes.css?v=35">
1070<script src="../js/theme.js?v=9"></script>
vendor: 1 bytes, line 1070
1070
1071<script src="../js/turtle-flag.js?v=31" defer></script>
vendor: 1 bytes, line 1071
1071
1072<script src="../js/fourier.js?v=34" defer></script>
vendor: 1 bytes, line 1072
1072
1073<script src="../js/tech-showcase.js?v=29" defer></script>
vendor: 1 bytes, line 1073
1073
1074<script src="../js/theme-extra.js?v=22" defer></script>
1074 1075</head> 1076<body> 1077<!-- NB-LOAN-ALERT --> 1078<div id="nbLoanAlert" style="display:none"></div>
1079<script> 1080(function () { 1081 'use strict'; 1082 1083 var BANK_URL = 'bank-Beta.html'; 1084 1085 function getSupa() { 1086 if (window.supabaseClient && typeof window.supabaseClient.rpc === 'function') 1087 return window.supabaseClient; 1088 if (window.sb && typeof window.sb.rpc === 'function') return window.sb; 1089 if (window.supabase && typeof window.supabase.rpc === 'function') return window.supabase; 1090 for (var k in window) { 1091 try { 1092 var v = window[k]; 1093 if (v && typeof v.rpc === 'function' && typeof v.from === 'function') return v; 1094 } catch (e) {} 1095 } 1096 return null; 1097 } 1098 1099 function myId() { 1100 try { 1101 var u = JSON.parse(localStorage.getItem('nb_user') || 'null'); 1102 return (u && (u.id || u.user_id)) || null; 1103 } catch (e) { return null; } 1104 } 1105 1106 function esc(s) { 1107 return String(s == null ? '' : s) 1108 .replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>') 1109 .replace(/"/g, '"'); 1110 } 1111 1112 function fmt(n) { 1113 n = Number(n) || 0; 1114 if (n >= 1e8) return (n / 1e8).toFixed(2) + ' 亿'; 1115 if (n >= 1e4) return (n / 1e4).toFixed(2) + ' ä¸'; 1116 return String(Math.round(n)); 1117 } 1118 1119 /* ä¸ç§ç¶æï¼å³å°å°æï¼èï¼ / 宽éæå ï¼æ©ï¼ / å·²è¶ æï¼çº¢ï¼ */ 1120 var STYLE = { 1121 upcoming: { bg: 'linear-gradient(90deg,#1d4ed8,#2563eb)', icon: '\uD83D\uDCE2', // ð¢ 1122 title: '贷款å³å°å°æ' }, 1123 grace: { bg: 'linear-gradient(90deg,#b45309,#d97706)', icon: '\u26A0\uFE0F', // â ï¸ 1124 title: 'è´·æ¬¾é¾ææé' }, 1125 overdue: { bg: 'linear-gradient(90deg,#b91c1c,#dc2626)', icon: '\U0001F6A8', // ð¨ 1126 title: 'è´·æ¬¾é¾ææé' } 1127 }; 1128 1129 function render(items) { 1130 var box = document.getElementById('nbLoanAlert'); 1131 if (!box || !items || !items.length) return; 1132 1133 /* åæä¸¥éçé£ä¸æ¡å³å®æ´ä½é è² */ 1134 var worst = 'upcoming'; 1135 items.forEach(function (it) { 1136 var s = it.status || (Number(it.days_left) <= 0 ? 'overdue' : 'grace'); 1137 if (s === 'overdue') worst = 'overdue'; 1138 else if (s === 'grace' && worst !== 'overdue') worst = 'grace'; 1139 }); 1140 var st = STYLE[worst] || STYLE.grace; 1141 1142 var rows = items.map(function (it) { 1143 var status = it.status || (Number(it.days_left) <= 0 ? 'overdue' : 'grace'); 1144 var tail; 1145 if (status === 'upcoming') { 1146 tail = 'å°æä½é¢ä¸è¶³ä¼èªå¨ä»<b>æ´»æå款</b>æ£é¤ï¼å款ä¸å¤æä¼æ£ä½é¢ã'; 1147 } else if (status === 'grace') { 1148 tail = 'è¿æ <b>' + (it.days_left != null ? it.days_left : 0) + '</b> 天宽éï¼' 1149 + 'é¾ææ»¡ 3 天å°èªå¨ä»<b>æ´»æå款</b>å<b>ä½é¢</b>䏿£é¤ï¼å®æå款ä¸å¨ï¼ã'; 1150 } else { 1151 tail = '<b>宽éæå·²è¿ï¼éæ¶ä¼è¢«å¼ºå¶æ£æ¬¾ã</b>'; 1152 } 1153 var head = status === 'upcoming' 1154 ? 'è¿æ <b>' + esc(it.due_in_days != null ? it.due_in_days : 0) + '</b> 天尿' 1155 : '已龿 <b>' + esc(it.overdue_days) + '</b> 天'; 1156 1157 return '<div style="margin-top:4px">' 1158 + '<b>' + esc(it.kind) + '</b> ' + head + 'ï¼' 1159 + 'åºè¿ <b>' + fmt(it.owed) + '</b> NBå¸ï¼æ¬é ' + fmt(it.principal) 1160 + ' + 婿¯ ' + fmt(it.interest) + 'ï¼ã' 1161 + tail 1162 + '</div>'; 1163 }).join(''); 1164 1165 box.setAttribute('style', 1166 'position:relative;z-index:9999;padding:13px 46px 13px 20px;' 1167 + 'background:' + st.bg + ';color:#fff;font-size:.9rem;line-height:1.75;' 1168 + 'box-shadow:0 3px 14px rgba(0,0,0,.22);' 1169 + 'font-family:system-ui,-apple-system,"Microsoft YaHei",sans-serif;'); 1170 box.innerHTML = 1171 '<div style="font-weight:800;font-size:.98rem;letter-spacing:1px">' 1172 + st.icon + ' ' + st.title 1173 + '</div>' 1174 + rows 1175 + '<a href="' + BANK_URL + '" style="display:inline-block;margin-top:9px;' 1176 + 'padding:5px 16px;border-radius:999px;background:rgba(255,255,255,.22);' 1177 + 'color:#fff;text-decoration:none;font-size:.84rem;font-weight:700;' 1178 + 'border:1px solid rgba(255,255,255,.4)">å»é¶è¡è¿æ¬¾ \u2192</a>' 1179 + '<span id="nbLoanAlertX" style="position:absolute;top:9px;right:14px;' 1180 + 'cursor:pointer;font-size:1.1rem;opacity:.75;line-height:1">\u00D7</span>'; 1181 1182 var x = document.getElementById('nbLoanAlertX'); 1183 if (x) x.onclick = function () { box.style.display = 'none'; }; 1184 } 1185 1186 function check() { 1187 var sb = getSupa(); 1188 var uid = myId(); 1189 if (!sb || !uid) return; 1190 sb.rpc('get_my_loan_alert', { p_user_id: uid }).then(function (r) { 1191 var d = r && r.data; 1192 if (d && d.has_alert && d.items && d.items.length) render(d.items); 1193 }).catch(function (e) { 1194 console.warn('[loan-alert] æ¥è¯¢å¤±è´¥', e); 1195 }); 1196 } 1197 1198 if (document.readyState === 'loading') { 1199 document.addEventListener('DOMContentLoaded', function () { setTimeout(check, 900); }); 1200 } else { 1201 setTimeout(check, 900); 1202 } 1203})(); 1204</script>
1204 1205 1206 1207 1208<!-- å¯¼èª --> 1209<nav class="nav"> 1210 <a class="nav-logo" href="index-Beta.html"><img class="logo-img" src="/images/NBé¢éLOGO.png" alt="NBé¢é"></a> 1211 <div class="nav-menu"> 1212 <a href="index-Beta.html" class="active">é¦é¡µ</a> 1213 <a href="videos-Beta.html">è§é¢</a> 1214 <a href="about-Beta.html">å ³äº</a> 1215 <a href="rules-Beta.html">ç¨æ·å®å</a> 1216 <a href="changelog-Beta.html">æ´æ°æ¥å¿</a> 1217 <a href="product-Beta.html">æç产å</a> 1218 <a href="APP-Beta.html">软件/APP</a> 1219 <a href="#friends">åå</a> 1220 <a class="nav-api" href="/api-sdk/" target="_blank" rel="noopener noreferrer" title="NBé¢é API ææ¡£">API<i>â</i></a> 1221 <div class="nav-more"> 1222 <button class="nav-more-btn" type="button">æ´å¤åè½ â¾</button> 1223 <div class="nav-more-panel"> 1224 <a href="stock-Beta.html">ð èæè¡ç¥¨</a> 1225 <a href="messages-Beta.html">ð æ¶æ¯ä¸å¿</a> 1226 <a href="chat-Beta.html">ð¥ 好å / ç§ä¿¡</a> 1227 <a href="bank-Beta.html">ð¦ NBé¶è¡</a> 1228 <a href="shop-Beta.html">ðï¸ NBååº</a> 1229 <a href="backpack-Beta.html">ð æçèå </a> 1230 <a href="titles-Beta.html">ð ç§°å·å¤§å ¨</a> 1231 <a href="achievements-Beta.html">ð æå°±å¢</a> 1232 <a href="lottery-Beta.html">ð ç¾å° · 转ç</a> 1233 <a href="lottery_records-Beta.html">ð° æ½å¥è®°å½</a> 1234 <a href="tools-Beta.html">ð§ å·¥å ·</a> 1235 <a href="product_share-Beta.html">ð¦ ä½åå享</a> 1236 <a href="comments-Beta.html">ð¬ è¯è®ºåº</a> 1237 <a href="ban-Beta.html">ð« å°é»å±</a> 1238 <a href="feedback-Beta.html">ð æ¼æ´/建议åé¦</a> 1239 <a href="vote-Beta.html">ð³ï¸ æç¥¨ä¸å¿</a> 1240 </div> 1241 </div> 1242 </div> 1243 <div class="nav-right-group"> 1244 <div class="nav-clock" id="navClock" title="å京æ¶é´ï¼UTC+8ï¼"> 1245 <span class="nc-time" id="bjTime">--:--:--</span> 1246 <span class="nc-row"><i class="nc-date" id="bjDate">----.--.--</i><em class="nc-label">å京æ¶é´</em></span> 1247 </div> 1248 <button class="theme-btn" id="themeBtn" aria-label="忢å¤é´æ¨¡å¼">ð</button> 1249 <div class="nav-auth-group" id="betaAuthGroup"> 1250 <a class="nav-auth" id="betaProfileBtn" href="#">ð¤ 个人ä¸å¿</a> 1251 <a class="nav-auth primary" id="betaAuthBtn" href="#">ç»å½ / 注å</a> 1252 </div> 1253 </div> 1254 <button class="nav-burger" id="navBurger" aria-label="æå¼èå">â°</button> 1255 <!-- æ«ç :ææºç«¯å³ä¸è§ãæ±å ¡æé®çå³è¾¹ãåªå¨ APP éæ¾ç¤º(ç½é¡µç«¯æ²¡ææ«ç è½å)ã 1256 徿 = å个 L å½¢è§ + ä¸é´ä¸æ¡æ«æçº¿,è·å¾®ä¿¡ãæ«ä¸æ«ãä¸ä¸ªè·¯åã --> 1257 <a class="nav-scan" id="navScanBtn" href="scan-Beta.html" aria-label="æ«ä¸æ«" title="æ«ä¸æ«"> 1258 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" 1259 stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> 1260 <path d="M3 8.5V6a3 3 0 0 1 3-3h2.5"/> 1261 <path d="M15.5 3H18a3 3 0 0 1 3 3v2.5"/> 1262 <path d="M21 15.5V18a3 3 0 0 1-3 3h-2.5"/> 1263 <path d="M8.5 21H6a3 3 0 0 1-3-3v-2.5"/> 1264 <path d="M3.2 12h17.6"/> 1265 </svg> 1266 </a> 1267</nav>
1268<script> 1269// ===== 导èªãæ´å¤åè½ã䏿 ===== 1270(function () { 1271 var box = document.querySelector('.nav-more'); 1272 if (!box) return; 1273 var btn = box.querySelector('.nav-more-btn'); 1274 btn.addEventListener('click', function (e) { e.stopPropagation(); box.classList.toggle('open'); }); 1275 document.addEventListener('click', function () { box.classList.remove('open'); }); 1276 document.addEventListener('keydown', function (e) { if (e.key === 'Escape') box.classList.remove('open'); }); 1277 var here = (location.pathname.split('/').pop() || '').toLowerCase(); 1278 if (here && box.querySelector('.nav-more-panel a[href="' + here + '"]')) btn.classList.add('active'); 1279})(); 1280 1281// ===== ãæ«ä¸æ«ãå ¥å£åªå¨ APP éæ¾ç¤º ===== 1282// ä½ç½®:å¯¼èªæ å³ä¸è§ãæ±å ¡æé®(â°)çå³è¾¹é£ä¸ªå¾æ ã 1283// ç½é¡µç«¯ï¼ææºæµè§å¨ï¼è°ä¸å¨æå头 ââ å®å/iOS 齿²¡ç»ç½é¡µå¼æ¾ç¨³å®ç 1284// æ«ç æ¥å£ï¼æä»¥è¿ä¸ªåè½åªè½é APP éçåçå®ç°ï¼window.NBQrï¼ã 1285// 1286// â ï¸ å¤æ"å¨ä¸å¨ APP é"è¦ç¨ãUAãï¼ä¸è½ç¨ window.NBQrï¼ 1287// æ§ç APP éæ²¡æè¿ä¸ªæ¡¥ï¼ç¨ NBQr 夿伿æ§ç APP ç¨æ·è¯¯å¤ææµè§å¨ï¼ 1288// äºæ¯å ¥å£è¢«èèµ·æ¥ ââ ä»å°±æ°¸è¿ä¸ç¥éæè¿ä¸ªåè½ï¼ä¹å°±ä¸ä¼å»æ´æ° APPã 1289// æä»¥ï¼UA éæ NBChannelApp å°±æ¾ç¤ºï¼åªæä»çæ¯æ§çï¼ï¼ç¹è¿å»ä¼æç¤ºæ´æ°ã 1290(function () { 1291 var isApp = false; 1292 try { isApp = /NBChannelApp/i.test(navigator.userAgent || ''); } catch (e) {} 1293 if (isApp) return; // å¨ APP é ââ å³ä¸è§çæ«ç 徿 ä¿ææ¾ç¤º 1294 1295 // ç½é¡µç«¯/æ¡é¢ç«¯:èæãï¼æ¡é¢ç«¯æ¬æ¥å°±è¢« CSS çåªä½æ¥è¯¢èäº,è¿é主è¦ç®¡ææºæµè§å¨ï¼ 1296 var scanBtn = document.getElementById('navScanBtn'); 1297 if (scanBtn) scanBtn.style.display = 'none'; 1298})(); 1299 1300// ===== å¨ APP ééè导èªèåç emoji ===== 1301// ç«é¿è¦æ±ï¼APP çãæ´å¤åè½ã䏿èåä¸è¦ emojiï¼ç½é¡µç«¯ä¿çåæ ·ã 1302// 1303// APP æ¯ Capacitor å¥å£³ï¼å è½½çå°±æ¯æ¬ç« ââ æ¹ HTML ä¼ä¸¤è¾¹ä¸èµ·æ¹ï¼ 1304// æä»¥åªè½æ UA åºåï¼APP å¨ UA éæ³¨å ¥äº NBChannelAppï¼ã 1305// 夿忳ä¸ä¸é¢ãæ«ä¸æ«ã飿®µä¿æä¸è´ã 1306(function () { 1307 var isApp = false; 1308 try { isApp = /NBChannelApp/i.test(navigator.userAgent || ''); } catch (e) {} 1309 if (!isApp) return; // æµè§å¨é ââ emoji ä¿æåæ · 1310 1311 // 代ç对ï¼U+1F000 以ä¸ï¼+ BMP 符å·åº + åä½éæ©ç¬¦ + é¶å®½è¿æ¥ç¬¦ï¼è¿ååé¢çç©ºæ ¼ä¸èµ·å¥æ 1312 var LEAD = /^(?:[\u2190-\u21FF\u2300-\u23FF\u2600-\u27BF\u2B00-\u2BFF\uFE0F\u200D]|[\uD83C-\uDBFF][\uDC00-\uDFFF])+\s*/; 1313 1314 function strip() { 1315 try { 1316 var as = document.querySelectorAll('.nav-more-panel a, .drawer a'); 1317 // â ï¸ æ¡é¢ä¸æ(.nav-more-panel)卿æºä¸è¢« CSS èäºï¼ææºèµ°çæ¯ 1318 // æ±å ¡æ½å±(.drawer)ã两个é½è¦å¤çï¼å¦å APP é伿¼ã 1319 for (var i = 0; i < as.length; i++) { 1320 var t = as[i].textContent || ''; 1321 var n = t.replace(LEAD, ''); 1322 if (n !== t) as[i].textContent = n; 1323 } 1324 } catch (e) {} 1325 } 1326 strip(); 1327 // 导èªå¦ææ¯å渲æçï¼è¡¥ä¸¤æ¬¡ 1328 setTimeout(strip, 400); 1329 setTimeout(strip, 1500); 1330})(); 1331 1332</script>
1332 1333 1334 1335<!-- Hero --> 1336<header class="hero"> 1337 <div class="hero-inner"> 1338 <div class="hero-copy"> 1339 <span class="hero-eyebrow">NOBOOK CHANNEL · EST. 2026</span> 1340 <h1>çç±çç§,<br>ä¸<span class="light">使»</span>åè¡</h1> 1341 <p class="hero-sub">ä¸ä¸ªç± UP主ãNBæäºå±ã建ç«çèæå ¬å¸ãåå¦ä¸ç©çå®éªãæ¥å¸¸ä½æ»ãNBå¸èæç»æµä¸ååçæââé½å¨è¿éåç</p> 1342 <div class="hero-actions"> 1343 <a class="hero-link" href="#about">å¼å§æ¢ç´¢ â</a> 1344 <a class="hero-link" href="https://space.bilibili.com/3493259582114264" target="_blank" rel="noopener noreferrer">å¨ Bç«å ³æ³¨ â</a> 1345 </div> 1346 </div> 1347 <div class="hero-media"> 1348 <div class="hero-video"> 1349 <!-- LOGO å¨ç»:èªæç®¡å¨ä»åº videos/ ä¸,ä¸åä¾èµå¤é¨å¾åº --> 1350 <video autoplay muted loop playsinline disablePictureInPicture preload="auto" poster="../videos/nb-logo-poster.jpg"><source src="../videos/nb-logo.mp4" type="video/mp4"></video> 1351 </div> 1352 </div> 1353 </div> 1354 <div class="hero-scroll">SCROLL</div> 1355 <div class="hero-fade"></div> 1356</header> 1357 1358<!-- æ°æ®æ¡ --> 1359<div class="stats"> 1360 <div class="stat stat-fans"><div class="num"><span class="cn" id="biliFans" data-to="112363">0</span></div><div class="label">Bç«ç²ä¸<i class="live" title="宿¶åæ¥,æ¯30ç§èªå¨æ´æ°"></i></div></div> 1361 <div class="stat"><div class="num"><span class="cn" data-to="11">0</span></div><div class="label">ååå®ç½</div></div> 1362 <div class="stat"><div class="num"><span class="cn" data-to="0" id="siteDays">0</span></div><div class="label">建ç«å¤©æ°</div></div> 1363 <div class="stat"><div class="num"><span class="cn" data-to="11">0</span></div><div class="label">æ ¸å¿åè½</div></div> 1364</div> 1365 1366<!-- å ¬ååº(æ°æ®ä» admin_config æå,æå ¬åææ¾ç¤º) --> 1367<div class="beta-announce" id="betaAnnounce" style="display:none;"> 1368 <div class="ba-title">å ¬å</div> 1369 <div class="ba-track-wrap"><div class="ba-track" id="baTrack"></div></div> 1370</div> 1371 1372<!-- å ¬å¸ç念 --> 1373<section class="section" id="about"> 1374 <div class="about-grid"> 1375 <div class="about-text reveal"> 1376 <span class="section-eyebrow">About Us</span> 1377 <h2>ä¸å®¶è®¤çæç¬ç<br><span class="grad">èæå ¬å¸</span></h2> 1378 <p>NBé¢éï¼å ¨å <b>NoBook é¢é</b>ï¼æ¯ UP主ãNBæäºå±ãåç«çèæå ¬å¸ãæä»¬ä¸è¾¹ååå¦ç©çå®éªãä¸è¾¹ç»è¥çå±äºææäººçæ°åä¸çââæè¡ç¥¨ãæé¶è¡ãæååºï¼è¿ææ°ä¸æ¸ çå¿«ä¹</p> 1379 <p>æä»¬æãæäºãå½ä½ä¸é¨ä¸¥èçäºä¸ï¼æ¯ä¸ä¸ªå®éªé½è®¤ç讲åçï¼æ¯ä¸ç¬èæäº¤æé½è®¤çæ¸ ç®ï¼æ¯ä¸ä½ç¨æ·ï¼é½æ¯å ¬å¸çè¡ä¸ä¸ä¼ä¼´</p> 1380 <div class="about-sign">ââ NBæäºå±<span>åå§äºº & å¯ä¸çæ£å¼åå·¥</span></div> 1381 <div class="about-tags"> 1382 <span class="tag">æç« <b>2026.02</b></span> 1383 <span class="tag">åå§äºº <b>NBæäºå±</b></span> 1384 <span class="tag">æ§è´¨ <b>èæå ¬å¸ · ç²ä¸å ¨èµæè¡</b></span> 1385 <span class="tag">æ»é¨ <b>å°ç · ç½ç»</b></span> 1386 </div> 1387 </div> 1388 <div class="about-cards"> 1389 <div class="about-card reveal"> 1390 <div class="ico">01</div> 1391 <div> 1392 <h4>使å½<em>Mission</em></h4> 1393 <p>让çç§åå¾å¥½ç©ââææ¯ç¥çå ¬å¼åææè¶£çå®éªï¼æå±é©çæä½åææå寸çç§æ®</p> 1394 </div> 1395 </div> 1396 <div class="about-card reveal"> 1397 <div class="ico">02</div> 1398 <div> 1399 <h4>æ¿æ¯<em>Vision</em></h4> 1400 <p>æä¸ºä¸æäºèç½ä¸æå¿«ä¹ççç§ç¤¾åºââèæä½è®¤çï¼çå®ä¸æè¶£ï¼æã使»ãç©æç§å¦ä¸èºæ¯</p> 1401 </div> 1402 </div> 1403 <div class="about-card reveal"> 1404 <div class="ico">03</div> 1405 <div> 1406 <h4>ä»·å¼è§<em>Values</em></h4> 1407 <p>å¥½å¥ Â· å®å ¨ · 认ç · 好ç©ââ好å¥å¿é©±å¨æ¢ç´¢ï¼å®å ¨æ°¸è¿æ¯åºçº¿ï¼èæç»æµç»ä¸å«ç³ï¼å¿«ä¹æ¯æç»ç®ç</p> 1408 </div> 1409 </div> 1410 </div> 1411 </div> 1412</section> 1413 1414<!-- æ ¸å¿åè½ --> 1415<section class="section"> 1416 <div class="section-head reveal">
1417 <span class="section-eyebrow">Features</span> 1418 <h2>æ ¸å¿åè½</h2> 1419 <p>ä»èæçè¡å°åå¦å·¥å ·ï¼NBé¢éçæ°åä¸çåºæå°½æ</p> 1420 </div> 1421 <div class="grid"> 1422 <a class="card reveal" href="videos-Beta.html"> 1423 <div class="ico">ð¬</div><h3>è§é¢</h3> 1424 <p>åå¦å®éªãç©çè¶£å³ä¸æ¥å¸¸ä½æ»ï¼ææ°è§é¢é½å¨è¿é</p><span class="go">å»çç â</span> 1425 </a> 1426 <a class="card reveal" href="comments-Beta.html"> 1427 <div class="ico">ð¬</div><h3>è¯è®ºåº</h3> 1428 <p>ååå交æµï¼æ¯æå¾çã@æåä¸ç§°å·å±ç¤º</p><span class="go">å»éé â</span> 1429 </a> 1430 <a class="card reveal" href="stock-Beta.html"> 1431 <div class="ico">ð</div><h3>NBèæè¡ç¥¨</h3> 1432 <p>NBå¸çè¡ï¼å¸åº 8:00-20:00 èªä¸»è¿è½¬</p><span class="go">å»çè¡ â</span> 1433 </a> 1434 <a class="card reveal" href="chat-Beta.html"> 1435 <div class="ico">ð¥</div><h3>好åç§ä¿¡</h3> 1436 <p>宿¶èå¤©ï¼æ¯æåéå¾çä¸çº¢å 转账</p><span class="go">å»è天 â</span> 1437 </a> 1438 <a class="card reveal" href="product_share-Beta.html"> 1439 <div class="ico">ð¨</div><h3>ä½åå享</h3> 1440 <p>ä¸ä¼ ä½ çä½åï¼æè´ä¹°ä»äººçä¼ç§ä½å</p><span class="go">å»çç â</span> 1441 </a> 1442 <a class="card reveal" href="messages-Beta.html"> 1443 <div class="ico">ð</div><h3>æ¶æ¯ä¸å¿</h3> 1444 <p>è¯è®ºåå¤ãç¹èµä¸ç§ä¿¡éç¥ï¼ä¸éæ¼ä»»ä½äºå¨</p><span class="go">å»çç â</span> 1445 </a> 1446 <a class="card reveal" href="titles-Beta.html"> 1447 <div class="ico">ð </div><h3>ç§°å·</h3> 1448 <p>12 ç§ç§°å·ï¼è¾¾ææ¡ä»¶èªå¨è§£éåçº§ï¼æé« 5 æ</p><span class="go">å»çç â</span> 1449 </a> 1450 <a class="card reveal" href="tools-Beta.html"><div class="ico">ð§</div><h3>å·¥å ·</h3><p>å ç´ å¨æè¡¨ãæ¹ç¨å¼é å¹³ã彿°å¾åä¸å è§£å¯</p><span class="go">å»ä½¿ç¨ â</span></a> 1451 <a class="card reveal" href="bank-Beta.html"> 1452 <div class="ico">ð¦</div><h3>NBé¶è¡</h3> 1453 <p>å鱿婿¯ï¼è´·æ¬¾å¯ææ¥ï¼ä¿¡èªåå®é¢åº¦</p><span class="go">å»åé± â</span> 1454 </a> 1455 <a class="card reveal" href="shop-Beta.html"> 1456 <div class="ico">ðï¸</div><h3>NBååº</h3> 1457 <p>ç¨ NBå¸ä¹°éå ·ï¼è¯è®ºé¢è²ãç¹æãç§°å·ä½</p><span class="go">å»éé â</span> 1458 </a> 1459 <a class="card reveal" href="backpack-Beta.html"> 1460 <div class="ico">ð</div><h3>æçèå </h3> 1461 <p>管çéå ·ï¼ä½¿ç¨ãæ¹è²ãåºå®ãç»æ</p><span class="go">å»çç â</span> 1462 </a> 1463 <a class="card reveal" href="achievements-Beta.html"> 1464 <div class="ico">ð</div><h3>æçæå°±</h3> 1465 <p>宿ææè§£éå¾½ç« ï¼å¥å± NBå¸ï¼åªå䏿¬¡</p><span class="go">å»çç â</span> 1466 </a> 1467 <a class="card reveal" href="lottery-Beta.html"> 1468 <div class="ico">ð°</div><h3>ç¾å°æ½å¥</h3> 1469 <p>æ¯æ¥ç¾å°é¢ NBå¸ï¼å¹¸è¿è½¬çæé«èµ¢ 2000</p><span class="go">å»è¯è¯ â</span> 1470 </a> 1471 </div> 1472</section> 1473 1474<!-- 大äºè®°:sticky æ»å¨åäºæ ç¨(11 èç¹å ¨åç¨,è½éæ ¸å¿æ²¿è´å¡å° S æ²çº¿è¡é©¶) --> 1475<section class="section jny-section" id="milestone"> 1476 <div class="section-head reveal"> 1477 <span class="section-eyebrow">Milestones</span> 1478 <h2>大äºè®°</h2> 1479 <p>æ»å¨é¡µé¢ï¼æç´æ¥æå¨è½éæ ¸å¿ââæ²¿è¿æ¡ S 形轨迹ï¼ç©¿è¶ NB é¢éçæé¿å²</p> 1480 </div> 1481 <div class="jny-spacer" id="jnySpacer"> 1482 <div class="jny-stage" id="jnyStage"> 1483 <div class="jny-bg" id="jnyBg"></div> 1484 <svg class="jny-svg" id="jnySvg" aria-hidden="true"></svg> 1485 <div class="jny-batt" id="jnyBatt"><i></i><b></b><span class="hit" title="æå¨æ"></span></div> 1486 1487 <div class="jny-node" style="left:4%;top:24%;"><span class="jy">2025</span><span class="jm">02.07 · é¦å</span></div> 1488 <div class="jny-node" style="left:11.7%;
1488top:58%;"><span class="jy">2025</span><span class="jm">06 · èè½</span></div> 1489 <div class="jny-node" style="left:19.3%;top:24%;"><span class="jy">2025</span><span class="jm">09 · æ´å</span></div> 1490 <div class="jny-node" style="left:27%;top:58%;"><span class="jy">2025</span><span class="jm">12 · å ¥å</span></div> 1491 <div class="jny-node" style="left:34.7%;top:24%;"><span class="jy">2026</span><span class="jm">02 · 建ç«</span></div> 1492 <div class="jny-node" style="left:42.3%;top:58%;"><span class="jy">2026</span><span class="jm">03 · æç«</span></div> 1493 <div class="jny-node" style="left:50%;top:24%;"><span class="jy">2026</span><span class="jm">03.13 · åä¸</span></div> 1494 <div class="jny-node" style="left:57.7%;top:58%;"><span class="jy">2026</span><span class="jm">03.23 · æ¹å</span></div> 1495 <div class="jny-node" style="left:65.3%;top:24%;"><span class="jy">2026</span><span class="jm">03.23 · åå</span></div> 1496 <div class="jny-node" style="left:73%;top:58%;"><span class="jy">2026</span><span class="jm">05 · 社åº</span></div> 1497 <div class="jny-node" style="left:80.7%;top:24%;"><span class="jy">2026</span><span class="jm">07 · å¼å¸</span></div> 1498 <div class="jny-node" style="left:88.3%;top:58%;"><span class="jy">2026</span><span class="jm">08 · çæ</span></div> 1499 <div class="jny-node" style="left:96%;top:24%;"><span class="jy">2026</span><span class="jm">08.27 · çæ°</span></div> 1500 1501 <div class="jny-cardwrap"> 1502 <div class="jny-card"> 1503 <div class="jny-tag">2025.02.07 · é¦å</div> 1504 <h3 class="jny-h">ç¬¬ä¸æ¡è§é¢ç¹äº®é¢é</h3> 1505 <p class="jny-d">2025å¹´2æ7æ¥ï¼ç¬¬ä¸æ¡è§é¢åå¸ââæ²¡æåªè¾æå·§ï¼æ²¡ææ¼äº®å°é¢ï¼åªæä¸çé ç²¾ç¯åä¸é¢ä½æ»çå¿ã忥æä»¬æç¥éï¼é£å¤©ç¹çç«ï¼å乿²¡çè¿</p> 1506 </div> 1507 <div class="jny-card"> 1508 <div class="jny-tag">2025.06 · èè½</div> 1509 <h3 class="jny-h">ç¬¬ä¸æ¯è¯ç®¡ç¹çäºé¢é</h3> 1510 <p class="jny-d">ãNBå®éªå®¤-使»ãåå¸äºç¬¬ä¸æåå¦å®éªã没æåªè¾æå·§ï¼æ²¡ææ¼äº®å°é¢ï¼åªæä¸æ¯è¯ç®¡ãä¸çé ç²¾ç¯åä¸é¢ä½æ»çå¿ââä½è¯è®ºåºï¼æäººè®¤ççå®äº</p> 1511 </div> 1512 <div class="jny-card"> 1513 <div class="jny-tag">2025.09 · æ´å</div> 1514 <h3 class="jny-h">ãNBæäºå±ãæ£å¼æç</h3> 1515 <p class="jny-d">é¢éæ´å为 NBæäºå±ï¼æ£å¼ç¡®ç«"åå¦ Â· ç©ç · 使»"䏿¡å 容线ãç¬¬ä¸æåå¦å·¥å ·è§é¢åå¸ï¼ç²ä¸çªç ´ä¸åââæä»¬å¼å§åä¸å®¶å ¬å¸é£æ ·æ³é®é¢</p> 1516 </div> 1517 <div class="jny-card"> 1518 <div class="jny-tag">2025.12 · å ¥å</div> 1519 <h3 class="jny-h">NB åæå½¢ï¼ååç»åº</h3> 1520 <p class="jny-d">éç»ç»è¯ AWMãUtw çç¬¬ä¸æ¹ååãç¬¬ä¸æ¬¡èå¨è§é¢ååºï¼è¯è®ºåºç¬¬ä¸æ¬¡ç ´ç¾ââ忥"åå"䏿¯åä¸è¯ï¼æ¯æå</p> 1521 </div> 1522 <div class="jny-card"> 1523 <div class="jny-tag">2026.02 · 建ç«</div> 1524 <h3 class="jny-h">å®ç½ v1 ä¸çº¿</h3> 1525 <p class="jny-d">2026.02.17ï¼å®ç½æ£å¼å»ºç«ãèæå ¬å¸ç»äºæäºèªå·±ç"注åå°å"ââ页é¢å¾æ´ç´ ï¼æ´æ°å¾å¤å¿«ï¼å»ºç«å¤©æ°ï¼ä»è¿ä¸å¤©å¼å§è®¡ç®</p> 1526 </div> 1527 <div class="jny-card"> 1528 <div class="jny-tag">2026.03 · æç«</div> 1529 <h3 class="jny-h">èæå ¬å¸å®£å¸æç«</h3> 1530 <p class="jny-d">NBæäºå±å®£å¸æç«èæå ¬å¸ï¼å¹¶éé宣å¸ï¼å ¨ä½ç²ä¸ä¸ºè£èªè¡ä¸ãä¸åè¡è¡ä»½ï¼åªåè¡å¿«ä¹ï¼ä¸è®¾è£äºä¼ï¼åªè®¾è¯è®ºåº</p> 1531 </div> 1532 <div class="jny-card"> 1533 <div class="jny-tag">2026.03.13 · åä¸</div> 1534 <h3 class="jny-h">åä¸ç²ä¸è¾¾æ</h3> 1535 <p class="jny-d">2026å¹´3æ13æ¥ï¼ç²ä¸çªç ´åä¸ââ使»ç尽头æ¯ç§å¦ï¼ç§å¦çå°½å¤´æ¯ NBã被åä¸äººçè§ä¹åï¼è¿å¥è¯æ´åççäº</p> 1536 </div> 1537 <div class="jny-card"> 1538 <div class="jny-tag">2026.03.23 · æ¹å</div> 1539 <h3 class="jny-h">é¢éæ¹å</h3> 1540 <p class="jny-d">2026å¹´3æ23æ¥ï¼é¢é宿æ¹åââæ°çååï¼æ°çå¼å§</p> 1541 </div> 1542 <div class="jny-card"> 1543 <div class="jny-tag">2026.03.23 · åå</div> 1544 <h3 class="jny-h">æ¥æ nb-channel.top</h3> 1545 <p class="jny-d">åä¸å¤©ï¼èæå ¬å¸æ¿å°å±äºèªå·±ç"é¨çå·"âânb-channel.topãååå¾å°ï¼æ¢¦æ³ä¸å°</p> 1546 </div> 1547 <div class="jny-card"> 1548 <div class="jny-tag">2026.05 · 社åº</div> 1549 <h3 class="jny-h">è¯è®ºåºä¸å¥½åç³»ç»æé</h3> 1550 <p class="jny-d">è¯è®ºåºæ¯æå¾çä¸ @ æåï¼å¥½åç§ä¿¡ä¸çº¿ï¼NBå¸ç¬¬ä¸æ¬¡æµéãä»"çè§é¢"å°"认è¯äºº"ï¼ç¤¾åºæ´»äºèµ·æ¥</p> 1551 </div> 1552 <div class="jny-card"> 1553 <div class="jny-tag">2026.07 · å¼å¸</div> 1554 <h3 class="jny-h">NBå¸ç»æµæ£å¼å¼å¸</h3> 1555 <p class="jny-d">NBèæè¡ç¥¨å¼å¸ãNBé¶è¡å¼ä¸ï¼åé±ã贷款ãçè¡ã转账ã红å ãæ¯å¤© 8:00-20:00 å¸åºèªä¸»è¿è½¬ââèæï¼ä½ç»ä¸å¿æ</p> 1556 </div> 1557 <div class="jny-card"> 1558 <div class="jny-tag">2026.08 · çæ</div> 1559 <h3 class="jny-h">åä¸å¤§åè½åå°±åä½</h3> 1560 <p class="jny-d">NBååºãèå ãç§°å·ç³»ç»ãç¨æ·ä¸»é¡µãæå°±ç³»ç»ç¸ç»§ä¸çº¿ãä»çè§é¢å°ç»è¥å ¬å¸ï¼ä»è¯è®ºåºå°ç¨æ·ä¸»é¡µââNBé¢éæäºä¸ä¸ªå°ä¸ç</p> 1561 </div> 1562 <div class="jny-card"> 1563 <div class="jny-tag">2026.08.27 · çæ°</div> 1564 <h3 class="jny-h">å®ç½ Beta å ¨æ°ä¸çº¿</h3> 1565 <p class="jny-d">ä»å¤©ï¼æä»¬æ"å®ç½"å徿´åå®ç½ï¼çç½ãå å¶ã大æ é¢ãæ ¢å¨ç»ã䏿¡ä¼åå çæé¿è½¨è¿¹ââè¿ä¸ªæ äºï¼ä»è¿ä¸é¡µéæ°è®²èµ·</p> 1566 </div> 1567 </div> 1568</section> 1569<!-- çé¨è§é¢(æææ¾é Top6) --> 1570<section class="section" style="padding-top:0;"> 1571 <div class="section-head reveal">
1572 <span class="section-eyebrow">Videos</span> 1573 <h2>çé¨è§é¢</h2> 1574 <p>ææ¾éæé«çåå¦å®éªãç©çè¶£å³ä¸æ¥å¸¸ä½æ»</p> 1575 </div> 1576 <div class="video-grid"> 1577 <a class="vcard reveal" href="https://www.bilibili.com/video/BV1BbRYYeEVG" target="_blank" rel="noopener noreferrer"> 1578 <div class="thumb"><img src="https://i0.hdslb.com/bfs/archive/fed19300b4e6f86953319ec59cbd6365b8bba08e.jpg" alt="ã å é · é é é ä¸ ã"><span class="dur">2:26</span><span class="play">â¶</span></div> 1579 <div class="body"><h4>ã å é · é é é ä¸ ã</h4><div class="meta">ãééªå®¤Â·åå¦ã · 58.4䏿æ¾</div></div> 1580 </a> 1581 <a class="vcard reveal" href="https://www.bilibili.com/video/BV11gNbe4ExW" target="_blank" rel="noopener noreferrer"> 1582 <div class="thumb"><img src="https://i2.hdslb.com/bfs/archive/7504c36d5c933726a7ecdcfbb0d6f98085a8dc2f.jpg" alt="ã ä¸ è¦ è®© å å¦ è å¸ ç å° ã"><span class="dur">6:01</span><span class="play">â¶</span></div> 1583 <div class="body"><h4>ã ä¸ è¦ è®© å å¦ è å¸ ç å° ã</h4><div class="meta">ãééªå®¤Â·åå¦ã · 54.8䏿æ¾</div></div> 1584 </a> 1585 <a class="vcard reveal" href="https://www.bilibili.com/video/BV1E9AgetEYe" target="_blank" rel="noopener noreferrer"> 1586 <div class="thumb"><img src="https://i1.hdslb.com/bfs/archive/dc83cea0f23b847785bf0caa2306cd86be333bf2.jpg" alt="ã æ 人 3 . 0 ã"><span class="dur">3:46</span><span class="play">â¶</span></div> 1587 <div class="body"><h4>ã æ 人 3 . 0 ã</h4><div class="meta">ãâæâ人ã · 44.9䏿æ¾</div></div> 1588 </a> 1589 <a class="vcard reveal" href="https://www.bilibili.com/video/BV17fNoetELN" target="_blank" rel="noopener noreferrer"> 1590 <div class="thumb"><img src="https://i2.hdslb.com/bfs/archive/b80837f9fdb33f8210616ebe996ebb94bf5bc5de.jpg" alt="ã æ 人 ã"><span class="dur">3:18</span><span class="play">â¶</span></div> 1591 <div class="body"><h4>ã æ 人 ã</h4><div class="meta">ãâæâ人ã · 33.2䏿æ¾</div></div> 1592 </a> 1593 <a class="vcard reveal" href="https://www.bilibili.com/video/BV1D5zXBcECp" target="_blank" rel="noopener noreferrer"> 1594 <div class="thumb"><img src="https://i0.hdslb.com/bfs/archive/2e0b55ba1f902deed1b1706f2ef7cd00490d6354.jpg" alt="ã 3 0 0 V çµ æ± ã"><span class="dur">7:04</span><span class="play">â¶</span></div> 1595 <div class="body"><h4>ã 3 0 0 V çµ æ± ã</h4><div class="meta">ãééªå®¤Â·ç©çã · 15.9䏿æ¾</div></div> 1596 </a> 1597 <a class="vcard reveal" href="https://www.bilibili.com/video/BV1e6XpYbEzm" target="_blank" rel="noopener noreferrer"> 1598 <div class="thumb"><img src="https://i1.hdslb.com/bfs/archive/f7e73d7e98698b82ad7d1e587371088275e02b42.jpg" alt="ã å é å° é éª ã"><span class="dur">3:34</span><span class="play">â¶</span></div> 1599 <div class="body"><h4>ã å é å° é éª ã</h4><div class="meta">ãééªå®¤Â·åå¦ã · 11.6䏿æ¾</div></div> 1600 </a> 1601 </div> 1602 <div class="more-wrap reveal"> 1603 <a class="more-btn" href="videos-Beta.html">æ¥çå ¨é¨è§é¢ â</a> 1604 </div> 1605</section> 1606 1607<!-- ååï¼åç¬åºåï¼ --> 1608<section class="section friends-section" id="friends"> 1609 <div class="section-head reveal"> 1610 <span class="section-eyebrow">Partners</span> 1611 <h2>åå</h2> 1612 <p>ä¸èµ·æäºçä¼ä¼´ä»¬ââç¹å»å¡ç访é®ä»ä»¬çå®ç½</p> 1613 </div> 1614 <div class="friends-grid"> 1615 <a class="friend reveal" href="https://orgent.pythonanywhere.com/" target="_blank" rel="noopener noreferrer"> 1616 <div class="logo">O</div> 1617 <div class="info"> 1618 <div class="name">Orgent <span class="arrow">â</span></div> 1619 <div class="desc">Bç«å·²æ³¨é · ä» ç念</div> 1620 </div> 1621 </a> 1622 <a class="friend reveal" href="https://45d.cn/AWM/" target="_blank" rel="noopener noreferrer"> 1623 <div class="logo">A</div> 1624 <div class="info"> 1625 <div class="name">AWM <span class="arrow">â</span></div> 1626 <div class="desc">ååå®ç½</div> 1627 </div> 1628 </a> 1629 <a class="friend reveal" href="https://fafat.uuk.pp.ua/" target="_blank" rel="noopener noreferrer"> 1630 <div class="logo">F</div> 1631 <div class="info"> 1632 <div class="name">Fafat <span class="arrow">â</span></div> 1633 <div class="desc">ååå®ç½</div> 1634 </div> 1635 </a> 1636 <a class="friend reveal" href="https://nb-qx.top/" target="_blank" rel="noopener noreferrer"> 1637 <div class="logo">L</div> 1638 <div class="info"> 1639 <div class="name">Lemonï¼é½åï¼ <span class="arrow">â</span></div> 1640 <div class="desc">ååå®ç½</div> 1641 </div> 1642 </a> 1643 <a class="friend reveal" href="https://gaohantu.cn/" target="_blank" rel="noopener noreferrer"> 1644 <div class="logo">G</div> 1645 <div class="info"> 1646 <div class="name">GaoHanTu <span class="arrow">â</span></div> 1647 <div class="desc">ååå®ç½</div> 1648 </div> 1649 </a> 1650 <a class="friend reveal" href="https://utw.pages.dev" target="_blank" rel="noopener noreferrer"> 1651 <div class="logo">U</div> 1652 <div class="info"> 1653 <div class="name">Utw <span class="arrow">â</span></div> 1654 <div class="desc">ååå®ç½</div> 1655 </div> 1656 </a> 1657 <a class="friend reveal" href="https://pipetrainingcamp.github.io/" target="_blank" rel="noopener noreferrer"> 1658 <div class="logo">P</div> 1659 <div class="info"> 1660 <div class="name">PTCï¼GoodPTCï¼ <span class="arrow">â</span></div> 1661 <div class="desc">ååå®ç½</div> 1662 </div> 1663 </a> 1664 <a class="friend reveal" href="https://yoyo-user-awa.github.io/UVS/" target="_blank" rel="noopener noreferrer"> 1665 <div class="logo">V</div> 1666 <div class="info"> 1667 <div class="name">UVS <span class="arrow">â</span></div> 1668 <div class="desc">ååå®ç½</div> 1669 </div> 1670 </a> 1671 <a class="friend reveal" href="https://3f7ceb4e.pinit.eth.limo/" target="_blank" rel="noopener noreferrer"> 1672 <div class="logo">
1672W</div> 1673 <div class="info"> 1674 <div class="name">UwLS <span class="arrow">â</span></div> 1675 <div class="desc">ååå®ç½</div> 1676 </div> 1677 </a> 1678 <a class="friend reveal" href="https://45d.cn/nb-og.top/" target="_blank" rel="noopener noreferrer"> 1679 <div class="logo">Og</div> 1680 <div class="info"> 1681 <div class="name">Oganesson <span class="arrow">â</span></div> 1682 <div class="desc">ååå®ç½</div> 1683 </div> 1684 </a> 1685 <a class="friend reveal" href="https://78439049.pinit.eth.limo/" target="_blank" rel="noopener noreferrer"> 1686 <div class="logo">S</div> 1687 <div class="info"> 1688 <div class="name">SOT <span class="arrow">â</span></div> 1689 <div class="desc">ååå®ç½</div> 1690 </div> 1691 </a> 1692 </div> 1693</section> 1694 1695<!-- CTA --> 1696<div class="cta"> 1697 <h2>å å ¥ NB é¢éçæ°åä¸ç</h2> 1698 <p>å ³æ³¨ Bç«ãåä¸è®¨è®ºãæèµå ¬å¸ãè´ä¹°éå ·ââæ»æä¸æ¬¾éåä½ </p> 1699 <div class="cta-actions"> 1700 <a class="hero-link" href="https://space.bilibili.com/3493259582114264" target="_blank" rel="noopener noreferrer">å¨ Bç«å ³æ³¨ â</a> 1701 <a class="hero-link" href="comments-Beta.html">è¿å ¥è¯è®ºåº â</a> 1702 </div> 1703</div> 1704<!-- 页è --> 1705<footer class="footer"> 1706 <div class="footer-grid"> 1707 <div> 1708 <div class="brand"><img class="logo-img" src="/images/NBé¢éLOGO.png" alt="NBé¢é"><span class="logo-text">NBé¢é</span></div> 1709 <p class="desc">NBé¢éï¼NoBooké¢éï¼ââçç±çç§ï¼å使»ï¼ç UP主建ç«çèæå ¬å¸ãåå¦ç©çå®éªãæ¥å¸¸ä½æ»ãèæç»æµï¼ä¸ä¸ªæè¶£çæ°åä¸ç</p> 1710 </div> 1711 <div> 1712 <h5>åè½</h5> 1713 <a href="stock-Beta.html">èæè¡ç¥¨</a><a href="bank-Beta.html">NBé¶è¡</a><a href="comments-Beta.html">è¯è®ºåº</a><a href="shop-Beta.html">NBååº</a><a href="tools-Beta.html">å·¥å ·</a><a href="titles-Beta.html">ç§°å·ç³»ç»</a><a href="feedback-Beta.html">æ¼æ´/建议åé¦</a> 1714 </div> 1715 <div> 1716 <h5>åå</h5> 1717 <a href="https://orgent.pythonanywhere.com/" target="_blank" rel="noopener noreferrer">Orgentï¼å·²æ³¨éï¼</a> 1718 <a href="https://45d.cn/AWM/" target="_blank" rel="noopener noreferrer">AWM</a> 1719 <a href="https://fafat.uuk.pp.ua/" target="_blank" rel="noopener noreferrer">Fafat</a> 1720 <a href="https://nb-qx.top/" target="_blank" rel="noopener noreferrer">Lemonï¼é½åï¼</a> 1721 <a href="https://gaohantu.cn/" target="_blank" rel="noopener noreferrer">GaoHanTu</a> 1722 <a href="https://utw.pages.dev" target="_blank" rel="noopener noreferrer">Utw</a> 1723 <a href="https://pipetrainingcamp.github.io/" target="_blank" rel="noopener noreferrer">PTCï¼GoodPTCï¼</a> 1724 <a href="https://yoyo-user-awa.github.io/UVS/" target="_blank" rel="noopener noreferrer">UVS</a> 1725 <a href="https://3f7ceb4e.pinit.eth.limo/" target="_blank" rel="noopener noreferrer">UwLS</a> 1726 <a href="https://45d.cn/nb-og.top/" target="_blank" rel="noopener noreferrer">Oganesson</a> 1727 <a href="https://78439049.pinit.eth.limo/" target="_blank" rel="noopener noreferrer">SOT</a> 1728 </div> 1729 <div> 1730 <h5>èç³»</h5> 1731 <a href="/cdn-cgi/l/email-protection#b2dcd0d1dad3dcdcd7def28384819cd1dddf"><span class="__cf_email__" data-cfemail="c1afa3a2a9a0afafa4ad81f0f7f2efa2aeac">[email protected]</span></a><a href="https://space.bilibili.com/3493259582114264" target="_blank" rel="noopener noreferrer">Bç«ï¼NBæäºå±</a><a href="https://nb-channel.top" target="_blank" rel="noopener noreferrer">nb-channel.top</a> 1732 </div> 1733 </div> 1734 <div class="footer-bottom">© 2026 NBé¢é · èæå ¬å¸ · å¶ä½ï¼NBæäºå± · ç± GitHub Pages / Cloudflare / PythonAnywhere æä¾æ¯æ</div><div style="margin-top:8px;font-size:0.78rem;opacity:.72;line-height:1.9;">
1734æ¬ç«ææå 容ï¼é¡µé¢ä»£ç · 徿 · æ°æ®ï¼çæå½ <b>NBé¢é</b> ææï¼æªç»ä¹¦é¢ææç¦æ¢å¤å¶ãéåæé¨ç½²å°å ¶ä»åå</div> 1735</footer> 1736 1737<!-- ç§»å¨ç«¯æ½å±å¯¼èª --> 1738<div class="drawer-mask" id="drawerMask"></div> 1739<aside class="drawer" id="drawer"> 1740 <div class="d-head"> 1741 <span class="d-brand"><img class="logo-img" src="/images/NBé¢éLOGO.png" alt="NBé¢é"><span class="logo-text">NBé¢é</span></span> 1742 <button class="d-close" id="drawerClose" aria-label="å ³éèå">â</button> 1743 </div> 1744 <a class="d-item" href="vote-Beta.html">æç¥¨ä¸å¿</a> 1745 <a class="d-item" href="stock-Beta.html">èæè¡ç¥¨</a> 1746 <a class="d-item" href="messages-Beta.html">æ¶æ¯ä¸å¿</a> 1747 <a class="d-item" href="chat-Beta.html">好å / ç§ä¿¡</a> 1748 <a class="d-item" href="bank-Beta.html">NBé¶è¡</a> 1749 <a class="d-item" href="shop-Beta.html">NBååº</a> 1750 <a class="d-item" href="backpack-Beta.html">æçèå </a> 1751 <a class="d-item" href="titles-Beta.html">ç§°å·å¤§å ¨</a> 1752 <a class="d-item" href="achievements-Beta.html">æå°±å¢</a> 1753 <a class="d-item" href="lottery-Beta.html">ç¾å° · 转ç</a> 1754 <a class="d-item" href="lottery_records-Beta.html">æ½å¥è®°å½</a> 1755 <a class="d-item" href="tools-Beta.html">å·¥å ·</a> 1756 <a class="d-item" href="product_share-Beta.html">ä½åå享</a> 1757 <a class="d-item" href="comments-Beta.html">è¯è®ºåº</a> 1758 <a class="d-item" href="ban-Beta.html">å°é»å±</a> 1759 <a class="d-item" href="feedback-Beta.html">æ¼æ´/建议åé¦</a> 1760 <div class="d-auth"> 1761 <a class="ga" id="dProfileBtn" href="#">个人ä¸å¿</a> 1762 <a class="gab" id="dAuthBtn" href="#">ç»å½ / 注å</a> 1763 </div> 1764</aside> 1765 1766<!-- åå°é¡¶é¨ --> 1767<button class="backtop" id="backTop" aria-label="åå°é¡¶é¨">â</button>
vendor: 110 bytes, lines 1767-1769
1767 1768 1769<script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
1769<script> 1770 // 建ç«å¤©æ°:ä» 2026-02-17(æ¬å°æ¶åº)èµ·ç®æ¥åæ¥å·®,åå ¥ data-to ç± count-up å¨ç»å¡«å 1771 (function () { 1772 var start = new Date(2026, 1, 17); 1773 var now = new Date(); 1774 start.setHours(0, 0, 0, 0); 1775 now.setHours(0, 0, 0, 0); 1776 var days = Math.round((now - start) / 86400000); 1777 var el = document.getElementById('siteDays'); 1778 if (el && days > 0) el.setAttribute('data-to', days); 1779 })(); 1780 // æ»å¨æ¸æ¾ï¼å¸¦è½»å¾®éå¼ï¼æ´æå±æ¬¡ï¼ 1781 var io = new IntersectionObserver(function (es) { 1782 es.forEach(function (e) { 1783 if (e.isIntersecting) { 1784 var i = Array.prototype.indexOf.call(e.target.parentNode.children, e.target); 1785 e.target.style.transitionDelay = Math.min(i * 50, 250) + 'ms'; 1786 e.target.classList.add('in'); 1787 io.unobserve(e.target); 1788 } 1789 }); 1790 }, { threshold: 0.1 }); 1791 document.querySelectorAll('.reveal').forEach(function (el) { io.observe(el); }); 1792 1793 // ===== ç»å½åºç»å®(å¯¼èª + ç§»å¨ç«¯æ½å±ä¸¤å¤å ±ç¨) ===== 1794 function bindAuthPair(pbEl, abEl) { 1795 if (!pbEl && !abEl) return; 1796 var storedU = null; 1797 try { storedU = JSON.parse(localStorage.getItem('nb_user')); } catch (e) {} 1798 if (storedU && storedU.id) { 1799 if (abEl) { 1800 abEl.textContent = 'ç»åºè´¦å·'; 1801 abEl.onclick = function () { localStorage.removeItem('nb_user'); localStorage.removeItem('nb_session'); location.reload(); }; 1802 } 1803 if (pbEl) { 1804 pbEl.textContent = 'ð¤ ' + (storedU.username || storedU.name || '个人ä¸å¿'); 1805 pbEl.href = 'profile-Beta.html'; 1806 } 1807 } else { 1808 var loginHref = 'login-Beta.html?redirect=' + encodeURIComponent(location.href); 1809 if (abEl) { abEl.href = loginHref; abEl.textContent = 'ç»å½ / 注å'; } 1810 if (pbEl) { pbEl.href = loginHref; pbEl.textContent = 'ð¤ 个人ä¸å¿'; } 1811 } 1812 } 1813 bindAuthPair(document.getElementById('betaProfileBtn'), document.getElementById('betaAuthBtn')); 1814 bindAuthPair(document.getElementById('dProfileBtn'), document.getElementById('dAuthBtn')); 1815 1816 // ===== å ¬ååº:ä» admin_config æå,åè¡æ ç¼æ»å¨,龿¥å¯ç¹å»,æ å ¬åéè ===== 1817 // 注å为åè°:supabase-js ç±æ¬æ®µæ«å°¾å¼æ¥å è½½,å°±ç»ªåææ§è¡ââç»ä¸é»å¡é¦å±æ¸²æ
1817 1818 function initAnnounce() { 1819 var bar = document.getElementById('betaAnnounce'); 1820 if (!bar || !window.supabase) return; 1821 function esc(s) { 1822 return String(s).replace(/[&<>"']/g, function (m) { 1823 return { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[m]; 1824 }); 1825 } 1826 function linkify(s) { 1827 return s.replace(/(https?:\/\/[^\s<>"']+)/g, '<a href="$1" target="_blank" rel="noopener noreferrer" style="color:var(--brand); text-decoration:underline;">$1</a>'); 1828 } 1829 var client = window.__nbSupabase || supabase.createClient('https://pbaafgjkwdbwcmsikcmg.supabase.co', 'sb_publishable_tv7YVJEisnvs3hvU8ImYUw_b0p6bmRg'); 1830 window.__nbSupabase = client; 1831 client.from('admin_config').select('value').eq('key', 'announcement').maybeSingle() 1832 .then(function (res) { 1833 var raw = (res && res.data && res.data.value) ? String(res.data.value).trim() : ''; 1834 if (!raw) return; 1835 var track = document.getElementById('baTrack'); 1836 if (!track) return; 1837 bar.style.display = 'flex'; // å æ¾ç¤ºåæµé(éèæ¶ offsetWidth æä¸º 0) 1838 var one = '<span class="ba-item">' + linkify(esc(raw)) + '</span>'; 1839 track.innerHTML = one; 1840 var item = track.querySelector('.ba-item'); 1841 var itemW = item ? item.offsetWidth : 0; 1842 if (itemW > 0) { 1843 var wrapEl = bar.querySelector('.ba-track-wrap'); 1844 var barW = wrapEl ? wrapEl.clientWidth : 0; 1845 var copies = Math.max(2, Math.ceil(barW / itemW) + 1); 1846 var all = ''; 1847 for (var ci = 0; ci < copies; ci++) all += '<span class="ba-item">' + linkify(esc(raw)) + '</span>'; 1848 track.innerHTML = all; 1849 var dur = Math.max(8, itemW / 45); 1850 if (track.animate) { 1851 track.animate( 1852 [{ transform: 'translateX(0)' }, { transform: 'translateX(-' + itemW + 'px)' }], 1853 { duration: dur * 1000, iterations: Infinity, easing: 'linear' } 1854 ); 1855 } 1856 } 1857 }) 1858 .catch(function () {}); 1859 } 1860 (window.__supaCallbacks = window.__supaCallbacks || []).push(initAnnounce); 1861 1862 // ===== supabase-js 弿¥å è½½å¨:åæºå®¹é(jsDelivr â unpkg),å ¨å¤±è´¥åé黿¾å¼ ===== 1863 (function () { 1864 var cbs = window.__supaCallbacks || []; 1865 if (!cbs.length) return; 1866 var srcs = [ 1867 'https://cdn.jsdelivr.net/npm/@supabase/supabase-js@2', 1868 'https://unpkg.com/@supabase/supabase-js@2' 1869 ]; 1870 var i = 0; 1871 function fire() { 1872 cbs.forEach(function (f) { try { f(); } catch (e) {} }); 1873 } 1874 function load() { 1875 if (i >= srcs.length) return; 1876 var s = document.createElement('script'); 1877 s.async = true; 1878 s.src = srcs[i++]; 1879 s.onload = fire; 1880 s.onerror = load; // å½åæºå¤±è´¥/è¢«å¢ â èªå¨æ¢ä¸ä¸ä¸ª 1881 document.head.appendChild(s); 1882 } 1883 load(); 1884 })(); 1885 1886 // ===== é¼ æ /触æ¸ç¹æ:è·éå æ + ç¹å»æ³¢çº¹ä¸å½©è²ç²å(é¼ æ + 触å±é½å¯ç¨) ===== 1887 (function () { 1888 var mqFine = window.matchMedia ? window.matchMedia('(pointer: fine)') : null; 1889 var isFine = !!(mqFine && mqFine.matches); 1890 var canTouch = ('ontouchstart' in window) || 1891 !!(window.matchMedia && window.matchMedia('(pointer: coarse)').matches); 1892 var glow = document.createElement('div'); 1893 glow.className = 'ui-fx-glow'; 1894 document.body.appendChild(glow); 1895 var gx = -999, gy = -999, tx = -999, ty = -999; 1896 var colors = ['#3b82f6', '#8b5cf6', '#6366f1', '#06b6d4', '#f59e0b']; 1897 var lastTouch = 0, glowTimer = null; 1898 1899 // å æè·æ:æç²¾ç¡®æé(é¼ æ )å°±è·é¼ æ ,å¦åè·ææ 1900 if (isFine) { 1901 document.addEventListener('mousemove', function (e) { tx = e.clientX; ty = e.clientY; }); 1902 document.addEventListener('mouseenter', function () { glow.style.opacity = '1'; }); 1903 document.addEventListener('mouseleave', function () { glow.style.opacity = '0'; }); 1904 } 1905 if (canTouch) { 1906 document.addEventListener('touchstart', function (e) { 1907 var t = e.touches[0]; if (!t) return; 1908 tx = t.clientX; ty = t.clientY; 1909 if (gx < -100) { gx = tx; gy = ty; } // 馿¬¡å«ä»å±å¹è§è½æ»è¿æ¥ 1910 glow.style.opacity = '1';
1911 if (glowTimer) { clearTimeout(glowTimer); glowTimer = null; } 1912 lastTouch = Date.now(); 1913 burst(t.clientX, t.clientY, 6, 0.75); 1914 }, { passive: true }); 1915 document.addEventListener('touchmove', function (e) { 1916 var t = e.touches[0]; if (!t) return; 1917 tx = t.clientX; ty = t.clientY; 1918 glow.style.opacity = '1'; 1919 }, { passive: true }); 1920 document.addEventListener('touchend', function () { 1921 if (glowTimer) clearTimeout(glowTimer); 1922 glowTimer = setTimeout(function () { glow.style.opacity = '0'; }, 380); 1923 }, { passive: true }); 1924 document.addEventListener('touchcancel', function () { glow.style.opacity = '0'; }, { passive: true }); 1925 } 1926 1927 var lx = -1e9, ly = -1e9; 1928 (function loop() { 1929 var k = isFine ? 0.14 : 0.32; // ææè·å¾ç´§ä¸äº 1930 gx += (tx - gx) * k; 1931 gy += (ty - gy) * k; 1932 // 鿢æ¶è·³è¿åå ¥:é¿å æ¯å¸§é夿¹ style ç½ç½è§¦åæ ·å¼è®¡ç® 1933 if (Math.abs(gx - lx) > 0.2 || Math.abs(gy - ly) > 0.2) { 1934 glow.style.left = gx + 'px'; 1935 glow.style.top = gy + 'px'; 1936 lx = gx; ly = gy; 1937 } 1938 requestAnimationFrame(loop); 1939 })(); 1940 1941 // ===== ç¹å»æ³¢çº¹ + 彩è²ç²å ===== 1942 function burst(x, y, count, scale) { 1943 var ring = document.createElement('div'); 1944 ring.style.cssText = 'position:fixed; left:' + x + 'px; top:' + y + 'px; width:12px; height:12px; border:2px solid rgba(59,130,246,.75); border-radius:50%; pointer-events:none; z-index:9999; transform:translate(-50%,-50%);'; 1945 document.body.appendChild(ring); 1946 setTimeout(function () { if (ring.parentNode) ring.remove(); }, 900); 1947 try { 1948 ring.animate([ 1949 { transform: 'translate(-50%,-50%) scale(1)', opacity: 0.9 }, 1950 { transform: 'translate(-50%,-50%) scale(' + (5.5 * scale) + ')', opacity: 0 } 1951 ], { duration: 600, easing: 'ease-out', fill: 'forwards' }); 1952 } catch (err) { ring.remove(); } 1953 for (var i = 0; i < count; i++) { 1954 var p = document.createElement('div'); 1955 var size = 4 + Math.random() * 6; 1956 var ang = Math.random() * Math.PI * 2; 1957 var dist = (28 + Math.random() * 52) * scale; 1958 p.style.cssText = 'position:fixed; left:' + x + 'px; top:' + y + 'px; width:' + size + 'px; height:' + size + 'px; border-radius:50%; background:' + colors[i % colors.length] + '; pointer-events:none; z-index:9999;'; 1959 document.body.appendChild(p); 1960 var dx = Math.cos(ang) * dist, dy = Math.sin(ang) * dist; 1961 var dur = 500 + Math.random() * 250; 1962 setTimeout(function (el) { 1963 return function () { if (el.parentNode) el.remove(); }; 1964 }(p), dur + 250); 1965 try { 1966 p.animate([ 1967 { transform: 'translate(0,0) scale(1)', opacity: 1 }, 1968 { transform: 'translate(' + dx + 'px,' + dy + 'px) scale(0.1)', opacity: 0 } 1969 ], { duration: dur, easing: 'cubic-bezier(0.15,0.8,0.25,1)', fill: 'forwards' }); 1970 } catch (err) { p.remove(); } 1971 } 1972 } 1973 // é¼ æ ç¹å» 1974 document.addEventListener('click', function (e) { 1975 if (Date.now() - lastTouch < 800) return; // 触æ¸åæµè§å¨ä¼è¡¥å click,å»é 1976 burst(e.clientX, e.clientY, 8, 1); 1977 }); 1978 })(); 1979 1980 // ===== 大äºè®°:sticky æ ç¨é©±å¨ v3(è´å¡å° S æ²çº¿ + è½éæ ¸å¿å¯ææ½:æå¨åå驱å¨èç¹/å¡ç/å 带/æ»å¨æ¡) ===== 1981 (function () { 1982 var stage = document.getElementById('jnyStage'); 1983 var spacer = document.getElementById('jnySpacer'); 1984 var batt = document.getElementById('jnyBatt'); 1985 var svg = document.getElementById('jnySvg'); 1986 if (!stage || !spacer || !batt || !svg) return; 1987 var nodes = Array.prototype.slice.call(stage.querySelectorAll('.jny-node')); 1988 var cards = Array.prototype.slice.call(stage.querySelectorAll('.jny-card')); 1989 var bgEl = document.getElementById('jnyBg'); 1990 var n = nodes.length; 1991 var pts = []; 1992 var basePath = null, goPathEl = null, totalLen = 1; 1993 var vh = 0, spacerTopAbs = 0, runLen = 1; 1994 var ticking = false, dragging = false, suppressScroll = false;
1995 var stageRect = null; 1996 var NS = 'http://www.w3.org/2000/svg'; 1997 1998 function smoothD(p) { 1999 var d = 'M' + p[0].x.toFixed(1) + ',' + p[0].y.toFixed(1); 2000 for (var i = 1; i < p.length; i++) { 2001 var a = p[i - 1], b = p[i]; 2002 var pm = p[i - 2] || a, pn = p[i + 1] || b; 2003 var c1x = a.x + (b.x - pm.x) / 6, c1y = a.y + (b.y - pm.y) / 6; 2004 var c2x = b.x - (pn.x - a.x) / 6, c2y = b.y - (pn.y - a.y) / 6; 2005 d += ' C ' + c1x.toFixed(1) + ',' + c1y.toFixed(1) + ' ' + c2x.toFixed(1) + ',' + c2y.toFixed(1) + ' ' + b.x.toFixed(1) + ',' + b.y.toFixed(1); 2006 } 2007 return d; 2008 } 2009 // â¡ æ§è½å ³é®ï¼è·¯å¾ç¹ä¸æ¬¡æ§éæ ·ææ°ç»ï¼ä¹åä¸å¾æ¥è¡¨æå¼ã 2010 // 忥æ¯å¸§é½è° basePath.getPointAtLength() ââ 飿¯è¦äºåæ¥æ¾ç®å¼§é¿çéæ´»ï¼ 2011 // ææºä¸æ¯æ»å¨ä¸å¸§è°ä¸æ¬¡ï¼ç´æ¥æå¸§çæå®ã 2012 // éæ ·æ¯æå»ºæ¶å䏿¬¡çåºå®å¼éï¼ä¹åæ¯å¸§åªå©å 次æ°ç»åå¼å乿³ã 2013 var SAMPLE_N = 200; 2014 var sx = null, sy = null; 2015 function buildSamples() { 2016 sx = new Float32Array(SAMPLE_N + 1); 2017 sy = new Float32Array(SAMPLE_N + 1); 2018 for (var i = 0; i <= SAMPLE_N; i++) { 2019 var q = basePath.getPointAtLength(totalLen * i / SAMPLE_N); 2020 sx[i] = q.x; 2021 sy[i] = q.y; 2022 } 2023 } 2024 // æå¼§é¿åç¹(çº¿æ§æå¼ï¼è¯¯å·®è¿å°äºä¸ä¸ªåç´ ï¼èç¼æ æ) 2025 function pointAt(dist) { 2026 if (!sx) return { x: 0, y: 0 }; 2027 var t = dist / totalLen * SAMPLE_N; 2028 if (!(t > 0)) return { x: sx[0], y: sy[0] }; 2029 if (t >= SAMPLE_N) return { x: sx[SAMPLE_N], y: sy[SAMPLE_N] }; 2030 var i = t | 0, fr = t - i; 2031 return { x: sx[i] + (sx[i + 1] - sx[i]) * fr, 2032 y: sy[i] + (sy[i + 1] - sy[i]) * fr }; 2033 } 2034 2035 var nodesLen = []; // åèç¹å¨æ²çº¿ä¸çå¼§é¿ä½ç½®(ç¨äº"å°å¼¯éé¡¶ç¹æåæ¢") 2036 function nearestLen(pt) { 2037 if (!sx) return 0; 2038 var best = 0, bestD2 = 1e18; 2039 for (var i = 0; i <= SAMPLE_N; i++) { 2040 var dx = sx[i] - pt.x, dy = sy[i] - pt.y; 2041 var d2 = dx * dx + dy * dy; 2042 if (d2 < bestD2) { bestD2 = d2; best = i / SAMPLE_N; } 2043 } 2044 return best * totalLen; 2045 } 2046 function buildSvg() { 2047 var r = stage.getBoundingClientRect(); 2048 var W = r.width, H = r.height; 2049 svg.setAttribute('viewBox', '0 0 ' + W + ' ' + H); 2050 svg.setAttribute('preserveAspectRatio', 'none'); 2051 pts = nodes.map(function (nd) { 2052 var nr = nd.getBoundingClientRect(); 2053 return { x: nr.left - r.left + nr.width / 2, y: nr.top - r.top + nr.height / 2 }; 2054 }); 2055 var d = smoothD(pts); 2056 svg.innerHTML = ''; 2057 basePath = document.createElementNS(NS, 'path'); 2058 basePath.setAttribute('class', 'base'); 2059 basePath.setAttribute('d', d); 2060 svg.appendChild(basePath); 2061 goPathEl = document.createElementNS(NS, 'path'); 2062 goPathEl.setAttribute('class', 'go'); 2063 goPathEl.setAttribute('d', d); 2064 svg.appendChild(goPathEl); 2065 totalLen = basePath.getTotalLength ? basePath.getTotalLength() : 1; 2066 if (goPathEl) { 2067 goPathEl.style.strokeDasharray = totalLen; 2068 goPathEl.style.strokeDashoffset = totalLen; 2069 } 2070 // è®°å½æ¯ä¸ªèç¹å¨æ²çº¿ä¸çå¼§é¿ä½ç½®(æ ¸å¿é©¶è¿è¯¥ä½ç½®å³"å°é¡¶ç¹") 2071 buildSamples(); // â¡ å¿ é¡»æå¨ nodesLen ä¹å ââ nearestLen è¦ç¨éæ ·è¡¨ 2072 nodesLen = pts.map(function (pt) { return nearestLen(pt); }); 2073 nodesLen[0] = 0; 2074 nodesLen[nodesLen.length - 1] = totalLen; 2075 } 2076 // 渲æä¸ä¸ªæ»å¨è¿åº¦ p(æ»å¨ä¸ææ½å ±ç¨) 2077 var progressBar = stage.querySelector('.jny-progress .bar i'); // åªæ¥ä¸æ¬¡,嫿¯å¸§æ¥ 2078 var lastActive = -1;
2078 // èç¹/å¡ç class åªå¨"é©¶è¿èç¹"é£ä¸å¸§æ´æ°,æ¥å¸¸æ»å¨ä¸ååå¤åæ¢ 2079 function renderP(p) { 2080 var dist = totalLen * p; 2081 // æ ¸å¿çæ£é©¶è¿çèç¹æ°(ç²¾ç¡®å°æ²çº¿å¼§é¿ â å° S 弯顶ç¹ç¬é´åæ¢) 2082 var k = 0; 2083 while (k < n && nodesLen[k] <= dist) k++; 2084 var active = Math.min(k - 1, n - 1); 2085 if (active < 0) active = 0; 2086 if (sx && totalLen > 1) { 2087 var pt = pointAt(Math.min(dist, totalLen)); 2088 // ç¨ transform ç§»å¨(åæå±),ä¸ç¨ left/top(é¿å æ¯å¸§å¸å±)ââç§»å¨ç«¯æµç çå ³é® 2089 batt.style.transform = 'translate(' + pt.x + 'px,' + pt.y + 'px)'; 2090 goPathEl.style.strokeDashoffset = totalLen - Math.min(dist, totalLen); 2091 } 2092 if (active !== lastActive) { 2093 lastActive = active; 2094 nodes.forEach(function (nd, kk) { 2095 nd.classList.toggle('lit', kk <= active); 2096 nd.classList.toggle('dim', kk > active); 2097 }); 2098 cards.forEach(function (c, kk) { c.classList.toggle('on', kk === active); }); 2099 var ap = pts[Math.min(active, pts.length - 1)]; 2100 if (bgEl && ap) bgEl.style.transform = 'translate(' + (ap.x - 400) * -0.22 + 'px,' + (ap.y - 220) * -0.22 + 'px)'; 2101 } 2102 if (progressBar) progressBar.style.width = (p * 100).toFixed(1) + '%'; 2103 } 2104 function update() { 2105 var sy = window.scrollY || document.documentElement.scrollTop; 2106 var p = (sy - (spacerTopAbs - 70)) / runLen; 2107 p = p < 0 ? 0 : (p > 1 ? 1 : p); 2108 renderP(p); 2109 } 2110 function onScroll() { 2111 if (suppressScroll) { suppressScroll = false; return; } 2112 if (dragging) return; 2113 if (!ticking) { ticking = true; requestAnimationFrame(function () { ticking = false; update(); }); } 2114 } 2115 // ---- ææ½:æä½è½éæ ¸å¿æ²¿æ²çº¿æ»å¨,åå驱卿 ç¨ ---- 2116 function nearestDist(px, py) { 2117 if (!sx) return -1; 2118 var best = -1, bestD2 = 1e12; 2119 for (var i = 0; i <= SAMPLE_N; i++) { 2120 var dx = sx[i] - px, dy = sy[i] - py; 2121 var d2 = dx * dx + dy * dy; 2122 if (d2 < bestD2) { bestD2 = d2; best = i / SAMPLE_N; } 2123 } 2124 return best; 2125 } 2126 batt.addEventListener('pointerdown', function (e) { 2127 if (e.button !== undefined && e.button !== 0 && e.pointerType === 'mouse') return; 2128 if (!stageRect) return; 2129 dragging = true; 2130 try { batt.setPointerCapture(e.pointerId); } catch (err) {} 2131 batt.classList.add('dragging'); 2132 e.preventDefault(); 2133 }); 2134 var dragLastX = -1e9, dragLastY = -1e9; 2135 batt.addEventListener('pointermove', function (e) { 2136 if (!dragging || !stageRect) return; 2137 var px = e.clientX - stageRect.left; 2138 var py = e.clientY - stageRect.top; 2139 // ä½ç§»è¿å°å忽ç¥:æå¨éæ ·(260 ç¹å ¨æ²çº¿æç´¢)è¾è´µ,å«è®©æ¯ä¸ªåç´ é½ç®ä¸é 2140 if (Math.abs(px - dragLastX) + Math.abs(py - dragLastY) < 4) return; 2141 dragLastX = px; dragLastY = py; 2142 var k = nearestDist(px, py); 2143 if (k < 0) return; 2144 renderP(k); 2145 // æ»å¨æ¡è·éå°ç(ææ½æé´ä¸è§¦å scroll 渲æ) 2146 suppressScroll = true; 2147 var target = spacerTopAbs - 70 + k * runLen; 2148 window.scrollTo(0, target); 2149 }); 2150 function endDrag() { 2151 if (!dragging) return; 2152 dragging = false; 2153 batt.classList.remove('dragging'); 2154 } 2155 batt.addEventListener('pointerup', endDrag); 2156 batt.addEventListener('pointercancel', endDrag); 2157 // ---- çªå±ä¸æä¹åå¸å±:13 èç¹ä¸¤æ(4%~96%)å¨çªå±å¿ ç¶éå ,æ¹ä¸º 5/4/4 䏿 ---- 2158 // 第2æä»å³å¾å·¦æå¸,S æ²çº¿è¿ç»è½¬æ;第1ã3æä»å·¦å¾å³ã 2159 // 横åè¾¹çå 9%~91%:èç¹å¸¦ -50% åç§»,è¦çè¶³å个èç¹å®½,é¿å 被 stage è£è¾¹ã
2160 nodes.forEach(function (nd) { 2161 nd._ol = nd.style.left; nd._ot = nd.style.top; // è®°ä½æ¡é¢åä½ç½®,宽屿¶è¿å 2162 }); 2163 var ROW_TOPS = ['12.5%', '33.5%', '54.5%']; 2164 var ROW_IDX = [[0, 1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]; 2165 function layoutNodes() { 2166 if (stage.clientWidth > 700) { 2167 nodes.forEach(function (nd) { nd.style.left = nd._ol; nd.style.top = nd._ot; }); 2168 return; 2169 } 2170 ROW_IDX.forEach(function (row, ri) { 2171 var span = row.length - 1; 2172 var step = 82 / span; 2173 row.forEach(function (idx, j) { 2174 var x = ri === 1 ? 91 - j * step : 9 + j * step; 2175 nodes[idx].style.left = x.toFixed(2) + '%'; 2176 nodes[idx].style.top = ROW_TOPS[ri]; 2177 }); 2178 }); 2179 } 2180 function measure() { 2181 layoutNodes(); 2182 vh = window.innerHeight || document.documentElement.clientHeight; 2183 var run = Math.max(vh * 2.1, 1500); 2184 var stageH = stage.offsetHeight || Math.min(vh * 0.72, 720); 2185 spacer.style.height = Math.ceil(run + stageH + 60) + 'px'; 2186 var sr = spacer.getBoundingClientRect(); 2187 spacerTopAbs = sr.top + window.scrollY; 2188 runLen = run; 2189 buildSvg(); 2190 update(); 2191 } 2192 var progEl = document.createElement('div'); 2193 progEl.className = 'jny-progress'; 2194 progEl.innerHTML = 'JOURNEY <span class="bar"><i></i></span>'; 2195 stage.appendChild(progEl); 2196 // ææ½æ¶åºäº stage å½åè§å£ä½ç½®æ¢ç® 2197 function refreshStageRect() { stageRect = stage.getBoundingClientRect(); } 2198 window.addEventListener('scroll', function () { refreshStageRect(); }, { passive: true }); 2199 window.addEventListener('scroll', onScroll, { passive: true }); 2200 // resize 鲿:ææºå°åæ æ¶èµ·/æè½¬ä¼è¿å resize,æ¯æ¬¡é½é建 SVG æ¯ç§»å¨ç«¯å¡é¡¿æºä¹ä¸ 2201 var rt = null; 2202 function onResize() { 2203 if (rt) clearTimeout(rt); 2204 rt = setTimeout(function () { rt = null; measure(); refreshStageRect(); }, 160); 2205 } 2206 window.addEventListener('resize', onResize); 2207 if (window.matchMedia) { 2208 try { 2209 var mq = window.matchMedia('(max-width: 700px)'); 2210 if (mq.addEventListener) mq.addEventListener('change', onResize); 2211 else if (mq.addListener) mq.addListener(onResize); 2212 } catch (e) {} 2213 } 2214 refreshStageRect(); 2215 measure(); 2216 window.addEventListener('load', function () { measure(); refreshStageRect(); }); 2217 })(); 2218 2219 // ===== æ°æ®æ¡ count-up + Bç«ç²ä¸å®æ¶åæ¥ ===== 2220 // å ¥åº:0 â data-to(4.2s easeInOutQuart å¹³æ»æ»å¨); 2221 // ä¹åæ¯ 30s éé»è½®è¯¢å端 /api/bili-fans(PythonAnywhere è¿ç¨å 30s ç¼å + ç´è¿ Bç«å®æ¹æ¥å£, 2222 // 平忰é²åº¦çº¦ 30 ç§),ç²ä¸æ°æååæ¶æ°åå°±å°å¹³æ»æ»å¨å°æ°å¼,æ éå·æ°; 2223 // å端失败åéé»ä¿çå½åå¼(é¦å±å¦æ localStorage ç¼åå åº)ã 2224 (function () { 2225 var boxes = document.querySelectorAll('.stats .cn'); 2226 if (!boxes.length) return; 2227 var fansEl = document.getElementById('biliFans'); 2228 function fmt(v, comma) { 2229 return comma ? String(v).replace(/\B(?=(\d{3})+(?!\d))/g, ',') : String(v); 2230 } 2231 function anim(el, from, to, dur, done) { 2232 var comma = el.id === 'biliFans'; 2233 var t0 = null, last = 0, skip = false; 2234 function step(ts) { 2235 if (!t0) t0 = ts; 2236 skip = !skip; 2237 if (skip) { requestAnimationFrame(step); return; } // é帧渲æâ30fps:èç¼è¶³å¤é¡ºæ»,主线ç¨å¼éåå 2238 var p = Math.min((ts - t0) / dur, 1); 2239 // easeInOutQuart:èµ·æ¥æ¶å°¾é½ç¼ã䏿®µåé,æ°åä»å®¹"è·"å°ç®æ 2240 var e = p < 0.5 ? 8 * p * p * p * p : 1 - Math.pow(-2 * p + 2, 4) / 2; 2241 var v = Math.round(from + (to - from) * e); 2242 if (v <= last && p < 1) v = Math.min(last + 1, to); // åè°æ¨è¿ 2243 last = v; 2244 el.textContent = fmt(v, comma); 2245 if (p < 1) requestAnimationFrame(step); 2246 else if (done) done(); 2247 } 2248 requestAnimationFrame(step); 2249 } 2250 // ç²ä¸ç¼ååå¡«:以æè¿ä¸æ¬¡åæ¥å¼ä¸ºé¦å±ç®æ (æ¯éæé»è®¤æ´è´´è¿å½å) 2251 try { 2252 var cached = parseInt(localStorage.getItem('nb_bili_fans') || '',
225210); 2253 if (cached > 0 && fansEl) fansEl.setAttribute('data-to', cached); 2254 } catch (e) {} 2255 var entryDone = false; // å ¥åºå¨ç»æ¯å¦å ¨é¨å®æ 2256 var fanPending = null; // å ¥åºæé´ååçæ´æ°å¼:宿åè¡¥ä¸æ¬¡çå¨ç» 2257 var remain = boxes.length; 2258 function fanDone() { 2259 remain--; 2260 if (remain > 0) return; 2261 entryDone = true; 2262 if (fanPending != null && fansEl) { 2263 var cur = parseInt(String(fansEl.textContent).replace(/[^\d]/g, ''), 10) || 0; 2264 var v = fanPending; 2265 fanPending = null; 2266 if (v !== cur) anim(fansEl, cur, v, 900, null); 2267 } 2268 } 2269 function run() { 2270 Array.prototype.forEach.call(boxes, function (el) { 2271 var to = parseInt(el.getAttribute('data-to') || '0', 10); 2272 if (isNaN(to) || to <= 0) { el.textContent = '0'; fanDone(); return; } 2273 anim(el, 0, to, 4200, fanDone); 2274 }); 2275 } 2276 // 轮询é´éé»è®¤ 30s;?fansPoll=ms å¯è°(æµè¯ç¨) 2277 var pollMs = 30000; 2278 try { 2279 var pm = /[?&]fansPoll=(\d+)/.exec(location.search); 2280 if (pm) pollMs = Math.max(2000, parseInt(pm[1], 10)); 2281 } catch (e) {} 2282 function curFans() { 2283 return parseInt(String(fansEl.textContent).replace(/[^\d]/g, ''), 10) || 0; 2284 } 2285 function applyFans(n) { 2286 if (!fansEl || !(n > 0)) return; 2287 try { localStorage.setItem('nb_bili_fans', String(n)); } catch (e) {} 2288 if (!entryDone) { fanPending = n; return; } // å ¥åºå¨ç»æªç»æ:è®°ä¸,ç»ææ¶è¡¥å¨ 2289 var cur = curFans(); 2290 if (n === cur) return; 2291 var dur = Math.min(600 + Math.abs(n - cur) * 6, 2600); 2292 anim(fansEl, cur, n, dur, null); 2293 } 2294 // ===== ç²ä¸æ°:ä¼å è¯»éææä»¶,失败æè¿ææåéå°æ¥å£ ===== 2295 // 为ä»ä¹æ¹: 2296 // åå ç´æ¥è¯·æ± PythonAnywhere ç /api/bili-fans ââ é£ä¸ªç«¯ç¹ä¸è½å Key 2297 // (é¦é¡µè¦è°å®,å Key 就徿 Key åè¿å ¬å¼ HTML),æä»¥è°é½è½å·, 2298 // è PythonAnywhere å è´¹çæ¯ä¸ªè¯·æ±çº¦ 1.1 ç§ worker å¼é,å·å¤äºä¼æå®å端ã 2299 // ç°å¨æ¹è¯» data/fans.json(ç± .github/workflows/update-fans.yml æ¯å°æ¶ 2300 // æ´æ°),è¯·æ±æå° GitHub Pages ç CDN,被å·ä¸æ¶èä»»ä½åç«¯èµæºã 2301 // æ¥å£ä¿ç为å åº:æä»¶ç¼ºå¤±ãææä»¶è¶ è¿ 6 å°æ¶æ²¡æ´æ°æ¶æåéã 2302 var FANS_STATIC = '/data/fans.json'; 2303 var FANS_API = 'https://nbchannel.pythonanywhere.com/api/bili-fans'; 2304 var FANS_STALE_MS = 6 * 60 * 60 * 1000; // éææä»¶è¶ è¿ 6 å°æ¶è§ä¸ºè¿æ 2305 2306 function fallbackFans() { 2307 fetch(FANS_API, { cache: 'no-store' }) 2308 .then(function (r) { return r.ok ? r.json() : null; }) 2309 .then(function (j) { if (j) applyFans(parseInt(j.follower, 10)); }) 2310 .catch(function () {}); 2311 } 2312 function pollFans() { 2313 if (document.hidden) return; // æ ç¾é¡µå¨åå°æ¶ä¸ææ° 2314 // ä¸å cache-busting åæ°:GitHub Pages èªå¸¦ max-age ç¼å, 2315 // 让æµè§å¨/CDN å¤ç¨å³å¯,轮询æ¬èº«å ä¹ä¸äº§ç请æ±ã 2316 fetch(FANS_STATIC) 2317 .then(function (r) { return r.ok ? r.json() : null; }) 2318 .then(function (j) { 2319 var n = j && parseInt(j.follower, 10); 2320 if (!(n > 0)) { fallbackFans(); return; } 2321 // æä»¶å¤ªæ§(宿¶ä»»å¡å¯è½æäº)â ç¨æ¥å£æ¿å®æ¶å¼ 2322 var t = j.updated_at_iso ? Date.parse(j.updated_at_iso) : 0; 2323 if (t && (Date.now() - t) > FANS_STALE_MS) { fallbackFans(); return; } 2324 applyFans(n); 2325 }) 2326 .catch(function () { fallbackFans(); }); 2327 } 2328 if ('IntersectionObserver' in window) { 2329 var statsBox = document.querySelector('.stats'); 2330 if (statsBox) { 2331 var io2 = new IntersectionObserver(function (es) {
2332 es.forEach(function (en) { 2333 if (en.isIntersecting) { run(); io2.disconnect(); } 2334 }); 2335 }, { threshold: 0.4 }); 2336 io2.observe(statsBox); 2337 } 2338 } else run(); 2339 document.addEventListener('visibilitychange', function () { 2340 if (!document.hidden) pollFans(); 2341 }); 2342 pollFans(); 2343 setInterval(pollFans, pollMs); 2344 })(); 2345 2346 // ===== Hero LOGO è§é¢:å°±ç»ªåæ·¡å ¥(é¿å å·æ°æ¶è§é¢åºå é»ã就绪ç¬é´"çªç¶è·³åº") ===== 2347 (function () { 2348 var box = document.querySelector('.hero-video'); 2349 var vid = box && box.querySelector('video'); 2350 if (!vid) return; 2351 function show() { vid.classList.add('ready'); } 2352 if (vid.readyState >= 2) { show(); return; } 2353 vid.addEventListener('loadeddata', show); 2354 vid.addEventListener('error', show); 2355 // ç¨ <source> æ¶,æä¸ªæºå 载失败ä¼å¨ <source> 䏿´¾å error,è䏿¯ <video> ââ 2356 // 䏿è¿ä¸ªçå¬,è§é¢æäºè¦ç 6 ç§å åºææ¾å½¢(æ¾åºæ¥çæ¯ poster éæå¾) 2357 var srcs = vid.querySelectorAll('source'); 2358 for (var i = 0; i < srcs.length; i++) { srcs[i].addEventListener('error', show); } 2359 setTimeout(show, 6000); // å åº:ç½ç»ææ ¢/èªå¨ææ¾è¢«æ¦æ¶ä¸è³äºä¸ç´éæ 2360 })(); 2361 2362 // ===== å¯¼èªæ»å¨æ(å¸é¡¶å æ·±) + åå°é¡¶é¨æé® ===== 2363 (function () { 2364 var nav = document.querySelector('.nav'); 2365 var backTop = document.getElementById('backTop'); 2366 function onScroll() { 2367 var y = window.scrollY || document.documentElement.scrollTop; 2368 if (nav) nav.classList.toggle('scrolled', y > 10); 2369 if (backTop) backTop.classList.toggle('show', y > 600); 2370 } 2371 window.addEventListener('scroll', onScroll, { passive: true }); 2372 onScroll(); 2373 if (backTop) backTop.addEventListener('click', function () { 2374 window.scrollTo({ top: 0, behavior: 'smooth' }); 2375 }); 2376 })(); 2377 2378 // ===== å¯¼èªæ å京æ¶é´(UTC+8,æ¥æ+精确å°ç§;Intl æ¶åºæ ¼å¼å,ä¸åæ¬å°æ¶åºå½±å) ===== 2379 (function () { 2380 var tEl = document.getElementById('bjTime'); 2381 var dEl = document.getElementById('bjDate'); 2382 if (!tEl) return; 2383 var fmtT = new Intl.DateTimeFormat('zh-CN', { 2384 timeZone: 'Asia/Shanghai', hour: '2-digit', minute: '2-digit', 2385 second: '2-digit', hour12: false, hourCycle: 'h23' 2386 }); 2387 var fmtD = new Intl.DateTimeFormat('zh-CN', { 2388 timeZone: 'Asia/Shanghai', year: 'numeric', month: '2-digit', 2389 day: '2-digit', weekday: 'short' 2390 }); 2391 function tick() { 2392 var now = new Date(); 2393 tEl.textContent = fmtT.format(now); 2394 if (dEl) dEl.textContent = fmtD.format(now).replace(/\//g, '.'); 2395 } 2396 tick(); 2397 setInterval(tick, 1000); 2398 })(); 2399 2400 // ===== å¤é´æ¨¡å¼åæ¢(å ¼å®¹æ§é® theme) ===== 2401 (function () { 2402 var btn = document.getElementById('themeBtn'); 2403 var root = document.documentElement; 2404 function isDark() { return root.classList.contains('dark'); } 2405 function render() { 2406 if (btn) { btn.textContent = isDark() ? 'âï¸' : 'ð'; btn.title = isDark() ? '忢尿¥é´æ¨¡å¼' : '忢å°å¤é´æ¨¡å¼'; } 2407 } 2408 function apply(dark) { 2409 root.classList.toggle('dark', dark); 2410 try { localStorage.setItem('theme', dark ? 'dark' : 'light'); } catch (e) {} 2411 render(); 2412 } 2413 if (btn) btn.addEventListener('click', function () { 2414 var dark = !isDark(); 2415 if (document.startViewTransition) { 2416 try { document.startViewTransition(function () { apply(dark); }); } catch (e) { apply(dark); } 2417 } else apply(dark); 2418 }); 2419 render(); 2420 })(); 2421 2422 // ===== ç§»å¨ç«¯æ½å±å¯¼èª ===== 2423 (function () { 2424 var burger = document.getElementById('navBurger'); 2425 var drawer = document.getElementById('drawer'); 2426 var mask = document.getElementById('drawerMask'); 2427 var closeBtn = document.getElementById('drawerClose'); 2428 if (!burger || !drawer || !mask) return; 2429 function open() { drawer.classList.add('open'); mask.style.display = 'block'; document.body.style.overflow = 'hidden'; } 2430 function close() { drawer.classList.remove('open'); mask.style.display = 'none'; document.body.style.overflow = ''; } 2431 burger.addEventListener('click', open); 2432 closeBtn.addEventListener('click', close); 2433 mask.addEventListener('click', close); 2434 drawer.querySelectorAll('a').forEach(function (a) { 2435 a.addEventListener('click', close); 2436 }); 2437 })(); 2438 2439 // ===== 鲿¥ç代ç (åè°è¯,é黿 æç¤º):å±è½ F12 / Ctrl+Shift+I·J·C / Ctrl+U / å³é®;debugger é·é± ===== 2440 // éçé¨:URL å« ?dev=1 æ #dev å®å ¨æ¾è¡(F12/å³é®/debugger é·é±å ¨è·³è¿),廿å³èªå¨æ¢å¤å±è½; 2441 // 妿¯æ window.__allowDevTools = true(å½å页å å,å·æ°å¤±æ) 2442 (function () { 2443 var DEV = window.__allowDevTools || 2444 /(?:^|[?&#])dev=1(?=&|#|$)/.test(location.href) || 2445 /#dev\b/.test(location.hash); 2446 if (DEV) return; 2447 // 1) éé»å±è½å¼åè å·¥å ·å¿«æ·é®(F12 / Ctrl+Shift+I·J·C / Ctrl+U) 2448 document.addEventListener('keydown', function (e) { 2449 var k = e.keyCode || e.which; 2450 var ctrl = e.ctrlKey || e.metaKey; 2451 if (k === 123 || e.key === 'F12' || 2452 (ctrl && e.shiftKey && (k === 73 || k === 74 || k === 67)) ||
2453 (ctrl && k === 85)) { 2454 e.preventDefault(); 2455 e.stopPropagation(); 2456 return false; 2457 } 2458 }); 2459 // 2) éé»å±è½å³é®èå 2460 document.addEventListener('contextmenu', function (e) { 2461 e.preventDefault(); 2462 return false; 2463 }); 2464 // 3) debugger é·é±:å¼å¯æ§å¶å°æ¶ä¼åå¤ä¸æ(ä¸å¼æ§å¶å°åé¶å¼é);éè°è¯æ¶è®¿é® ?dev=1 2465 setInterval(function () { debugger; }, 600); 2466 })(); 2467</script>
2467 2468
2469<script> 2470 // ===== ä¼è¯ä»¤çèªå¨æ³¨å ¥(å®å ¨ä¿®å¤):é«å± RPC èªå¨é带 nb_session ===== 2471 (function () { 2472 function patch(sb) { 2473 if (!sb || sb.__secPatched) return; 2474 sb.__secPatched = true; 2475 var names = ['update_bio', 'bankrupt_company', 'transfer_nb', 'claim_redpacket', 'do_check_in', 'do_lottery', 'buy_shop_item', 'sell_shop_item', 'use_shop_item', 'set_item_settings', 'get_bank_account', 'get_bank_logs', 'get_my_items', 'get_my_titles', 'sync_my_titles', 'get_my_achievements', 'check_achievements', 'get_my_lottery_records', 'get_my_transfers', 'get_checkin_status']; 2476 var orig = sb.rpc.bind(sb); 2477 sb.rpc = function (fn, args) { 2478 if (names.indexOf(fn) !== -1) { 2479 args = Object.assign({}, args || {}); 2480 var t = null; 2481 try { t = localStorage.getItem('nb_session'); } catch (e) {} 2482 args.p_session = t; 2483 } 2484 return orig(fn, args); 2485 }; 2486 } 2487 var cands = []; 2488 try { if (window.supabaseClient) cands.push(window.supabaseClient); } catch (e) {} 2489 try { if (window.__nbSupabase) cands.push(window.__nbSupabase); } catch (e) {} 2490 try { if (typeof supabaseClient !== 'undefined') cands.push(supabaseClient); } catch (e) {} 2491 cands.forEach(patch); 2492 })(); 2493</script>
2493 2494 2495
2496<script> 2497 // ===== å®å ¨å¼ºå¶éç»:æ¬å°æç¨æ·ä¿¡æ¯ä½æ ä¼è¯ä»¤ç => è§ä¸ºæªç»å½ ===== 2498 (function () { 2499 try { 2500 var u = localStorage.getItem('nb_user'); 2501 var s = localStorage.getItem('nb_session'); 2502 if (u && !s) { 2503 localStorage.removeItem('nb_user'); 2504 location.reload(); 2505 } 2506 } catch (e) {} 2507 })(); 2508</script>
2508 2509 2510
2511<script> 2512 // ===== ä½é¢èªå¨å·æ°è¡¥ä¸(v3 åæ¹ç¨ get_my_balance RPC) ===== 2513 (function () { 2514 function applyBal() { 2515 var u = null, t = null; 2516 try { u = JSON.parse(localStorage.getItem('nb_user') || 'null'); t = localStorage.getItem('nb_session'); } catch (e) {} 2517 if (!u || !u.id || !t) return; 2518 var el = document.getElementById('balanceDisplay') || 2519 document.getElementById('balanceSpan') || 2520 document.getElementById('tradeBalance'); 2521 if (!el) return; 2522 var sb = null; 2523 try { if (window.supabaseClient) sb = window.supabaseClient; } catch (e) {} 2524 try { if (!sb && typeof supabaseClient !== 'undefined') sb = supabaseClient; } catch (e) {} 2525 if (!sb) return; 2526 sb.rpc('get_my_balance', { p_user_id: u.id, p_session: t }).then(function (r) { 2527 if (r && r.data && r.data.ok && el) el.textContent = Number(r.data.balance).toLocaleString('zh-CN'); 2528 }).catch(function () {}); 2529 } 2530 var tries = 0; 2531 (function loop() { applyBal(); if (++tries < 6) setTimeout(loop, 1300); })(); 2532 })(); 2533</script>
2533 2534 2535
2536<script> 2537// ===== APP èªæ´æ°(ä» APP å çæ) ===== 2538(function () { 2539 var ua = navigator.userAgent || ''; 2540 var m = /NBChannelApp\/([0-9.]+)/i.exec(ua); 2541 if (!m) return; // 䏿¯ APP ç¯å¢,䏿æ°ç½é¡µç¨æ· 2542 var localVer = m[1]; 2543 var APK = '/download/NBChannel.apk'; 2544 2545 function cmp(a, b) { 2546 var x = String(a).split('.').map(Number), y = String(b).split('.').map(Number); 2547 for (var i = 0; i < 3; i++) { var p = x[i] || 0, q = y[i] || 0; if (p !== q) return p - q; } 2548 return 0; 2549 } 2550 2551 var checking = false; 2552 function check(manual) { 2553 if (checking) return; 2554 checking = true; 2555 fetch('/download/version.json?t=' + Date.now(), { cache: 'no-store' }) 2556 .then(function (r) { if (!r.ok) throw new Error('HTTP ' + r.status); return r.json(); }) 2557 .then(function (info) { 2558 checking = false; 2559 if (!info || !info.versionName) throw new Error('çæ¬ä¿¡æ¯ä¸å®æ´'); 2560 if (cmp(info.versionName, localVer) > 0) showBar(info, manual); 2561 else if (manual) toast('â å·²æ¯ææ°ç v' + localVer); 2562 }) 2563 .catch(function (e) { 2564 checking = false; 2565 if (manual) toast('æ£æ¥æ´æ°å¤±è´¥:' + e.message + '\nè¯·æ£æ¥ç½ç»åéè¯'); 2566 }); 2567 } 2568 2569 // ---- åºé¨æ´æ°æ¡ ---- 2570 function showBar(info, manual) { 2571 if (document.getElementById('nbUpdateBar')) return; 2572 var bar = document.createElement('div'); 2573 bar.id = 'nbUpdateBar'; 2574 bar.style.cssText = 'position:fixed;left:0;right:0;bottom:0;z-index:99999;' + 2575 'padding:14px 16px calc(14px + env(safe-area-inset-bottom,0px));' + 2576 'background:linear-gradient(135deg,#3b82f6,#6366f1);color:#fff;' + 2577 'display:flex;align-items:center;gap:10px;font-size:.86rem;' + 2578 'box-shadow:0 -8px 28px rgba(0,0,0,.3);'; 2579 bar.innerHTML = 2580 '<div style="flex:1;line-height:1.6;min-width:0;">
2580' + 2581 '<b>åç°æ°çæ¬ v' + info.versionName + '</b><br>' + 2582 '<span style="opacity:.9;font-size:.78rem;">å½å v' + localVer + ' · ' + 2583 (info.note || 'ä¿®å¤ä¸ä¼å') + '</span>' + 2584 '</div>' + 2585 '<button id="nbUpdGo" style="background:#fff;color:#3b82f6;border:none;border-radius:999px;' + 2586 'padding:9px 18px;font-weight:800;font-family:inherit;font-size:.86rem;cursor:pointer;white-space:nowrap;">ç«å³æ´æ°</button>' + 2587 '<button id="nbUpdNo" style="background:transparent;border:none;color:#fff;opacity:.75;' + 2588 'font-size:1.05rem;cursor:pointer;padding:4px 6px;">â</button>'; 2589 document.body.appendChild(bar); 2590 document.getElementById('nbUpdNo').onclick = function () { bar.remove(); }; 2591 document.getElementById('nbUpdGo').onclick = function () { 2592 var b = this; 2593 b.textContent = 'ä¸è½½ä¸â¦'; b.disabled = true; b.style.opacity = '.8'; 2594 location.href = info.url || APK; 2595 setTimeout(function () { b.textContent = 'ç«å³æ´æ°'; b.disabled = false; b.style.opacity = '1'; }, 12000); 2596 }; 2597 } 2598 2599 // ---- è½»æç¤º ---- 2600 function toast(msg) { 2601 var t = document.createElement('div'); 2602 t.style.cssText = 'position:fixed;left:50%;top:50%;transform:translate(-50%,-50%);z-index:99999;' + 2603 'background:rgba(15,23,42,.94);color:#fff;padding:14px 20px;border-radius:14px;' + 2604 'font-size:.86rem;line-height:1.7;max-width:80vw;text-align:center;white-space:pre-line;' + 2605 'box-shadow:0 12px 36px rgba(0,0,0,.4);'; 2606 t.textContent = msg; 2607 document.body.appendChild(t); 2608 setTimeout(function () { t.remove(); }, 2600); 2609 } 2610 2611 // ---- å¨å¯¼èªãæ´å¤åè½ã䏿 + ææºæ½å±éæ³¨å ¥å ¥å£ ---- 2612 function inject() { 2613 var panel = document.querySelector('.nav-more-panel'); 2614 if (panel && !panel.querySelector('[data-nb-upd]')) { 2615 var a = document.createElement('a'); 2616 a.href = 'javascript:void(0)'; 2617 a.setAttribute('data-nb-upd', '1'); 2618 a.textContent = 'ð æ£æ¥æ´æ°'; 2619 a.addEventListener('click', function (e) { 2620 e.preventDefault(); 2621 var more = document.querySelector('.nav-more'); 2622 if (more) more.classList.remove('open'); 2623 check(true); 2624 }); 2625 panel.insertBefore(a, panel.firstChild); 2626 } 2627 var authBox = document.querySelector('.drawer .d-auth'); 2628 if (authBox && !document.querySelector('[data-nb-upd-d]')) { 2629 var d = document.createElement('a'); 2630 d.className = 'd-item'; 2631 d.href = 'javascript:void(0)'; 2632 d.setAttribute('data-nb-upd-d', '1'); 2633 d.textContent = 'ð æ£æ¥æ´æ°(v' + localVer + ')'; 2634 d.addEventListener('click', function (e) { e.preventDefault(); check(true); }); 2635 authBox.parentNode.insertBefore(d, authBox); 2636 } 2637 } 2638 2639 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', inject); 2640 else inject(); 2641 setTimeout(inject, 1200); // å åº:å¯¼èªæ¯èæ¬æ¸²ææ¶åè¯ä¸æ¬¡ 2642 2643 // å¯å¨èªå¨æ¥ä¸æ¬¡,ä¹åæ¯ 30 åé 2644 setTimeout(function () { check(false); }, 2000); 2645 setInterval(function () { check(false); }, 30 * 60 * 1000); 2646})(); 2647</script>
2647 2648
2649<script> 2650/* ===== Android ä¸è®© Bç«é¾æ¥ä¼å æå¼ Bç« APP ===== */ 2651(function () { 2652 try { 2653 if (!/Android/i.test(navigator.userAgent)) return; // åªå¨å®å䏿¹,æ¡é¢/iPhone ä¿æåæ · 2654 function toIntent(href) { 2655 var m = href.match(/space\.bilibili\.com\/(\d+)/); 2656 if (!m) return null; 2657 // intent:// æ¯å®åä¸å±åè®®:è½æå¼ APP å°±æå¼,æä¸å¼å°±åéå° browser_fallback_url 2658 return 'intent://space/' + m[1] + '#Intent;scheme=bilibili;package=tv.danmaku.bili' + 2659 ';S.browser_fallback_url=' + encodeURIComponent(href) + ';end'; 2660 } 2661 function patch() { 2662 var links = document.querySelectorAll('a[href*="space.bilibili.com"]'); 2663 for (var i = 0; i < links.length; i++) { 2664 var a = links[i]; 2665 if (a.dataset.nbIntent) continue; 2666 var it = toIntent(a.getAttribute('href') || a.href); 2667 if (it) { a.setAttribute('href', it); a.dataset.nbIntent = '1'; } 2668 } 2669 } 2670 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', patch); 2671 else patch(); 2672 setTimeout(patch, 1500); 2673 } catch (e) {} 2674})(); 2675 2676/* ===== åå»è§é¢éºæ»¡å±å¹ ===== */ 2677(function () { 2678 try { 2679 var style = document.createElement('style'); 2680 style.textContent = 2681 'video.nb-fs{position:fixed!important;left:0!important;top:0!important;' + 2682 'width:100vw!important;height:100vh!important;max-width:100vw!important;' + 2683 'max-height:100vh!important;margin:0!important;border-radius:0!important;' + 2684 'z-index:99999!important;background:#000!important;object-fit:contain!important;}' + 2685 'body.nb-fs-lock{overflow:hidden!important;}'; 2686 document.head.appendChild(style); 2687 2688 var current = null; 2689 function exit() { 2690 if (!current) return; 2691 current.classList.remove('nb-fs'); 2692 document.body.classList.remove('nb-fs-lock'); 2693 current = null; 2694 } 2695 function enter(v) { 2696 exit(); 2697 v.classList.add('nb-fs'); 2698 document.body.classList.add('nb-fs-lock'); 2699 current = v; 2700 try { v.play(); } catch (e) {} 2701 } 2702 // åå»:è¿/åºå ¨å± 2703 document.addEventListener('dblclick', function (e) { 2704 var v = e.target && e.target.closest ? e.target.closest('video') : null; 2705 if (!v) return; 2706 e.preventDefault(); 2707 if (current === v) exit(); else enter(v); 2708 }, true); 2709 // å ¨å±ç¶æä¸ç¹ç©ºç½å¤/æ Esc éåº 2710 document.addEventListener('click', function (e) { 2711 if (current && !(e.target.closest && e.target.closest('video'))) exit(); 2712 }, true); 2713 document.addEventListener('keydown', function (e) { if (e.key === 'Escape') exit(); }); 2714 // 页é¢åæ¢/尺寸ååæ¶å åº 2715 window.addEventListener('resize', function () { if (current) exit(); }); 2716 } catch (e) {} 2717})(); 2718</script>
2718 2719 2720<!-- 2721 ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ 2722 NB-CHANNEL ORIGINAL · æ¬é¡µé¢ç± NBé¢é ååå¶ä½ 2723 æå»ºæçº¹ NBC-20261001-1E6D2EC11C21 2724 宿¹åå nb-channel.top ï¼github. / cloudflare. / edgeone. / pythonanywhere.ï¼ 2725 å¦æä½ å¨å ¶ä»ååçå°æ¬é¡µï¼è¯´æè¯¥ç«ç¹æªç»ææå¤å¶äº NBé¢é çå å®¹ï¼ 2726 欢è¿ä¸¾æ¥ï¼[email protected] 2727 ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ 2728--> 2729
2730<script>/* æå»ºå ä¿¡æ¯ï¼è¯·å¿å é¤ï¼ä¾µæåè¯ç¨ï¼ */ 2731(function () { 2732 try { 2733 var _nb = "TkJDLTIwMjYxMDAxLTFFNkQyRUMxMUMyMQ"; 2734 if (typeof window !== "undefined") window.__nbBuild = _nb; 2735 } catch (e) {} 2736})(); 2737</script>
vendor: 1 bytes, line 2737
2737
2738<script defer src="../js/science-tips.js?v=26"></script>
vendor: 1 bytes, line 2738
2738
2739<script src="../js/pomodoro.js?v=7" defer></script>
vendor: 1 bytes, line 2739
2739
2740<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"2694d6c1b70c42ee8414dc6303584599","r":1,"spa":2}' crossorigin="anonymous"></script>
2740 2741</body> 2742</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.