/* ==========================================================
   Y5neKO 个人主页 · 赛博故障风(Cyberpunk Glitch)
   配色:近黑蓝底 / 霓虹青 #00f0ff 主色 / 品红 #ff2a6d 色散副色
   语言:硬边平面面板、RGB 色散、扫描线噪点、切角残留
   ========================================================== */

:root {
  --bg: #050508;
  --bg-soft: #0a0a12;
  --accent: #00f0ff;        /* 霓虹青 */
  --accent-2: #ff2a6d;      /* 品红,RGB 色散副色 */
  --alert: #ff2a6d;         /* 报错与失效状态 */
  --text: #e8f0f2;          /* 冷白 */
  --text-dim: #61707f;      /* 冷蓝灰 */
  --line: #1b2733;          /* 冷蓝灰分割线 */
  --neon-green: #05ffa1;    /* 荧光薄荷,代码字符串用 */

  /* 硬边平面面板:深色实底 + 霓虹描边,无毛玻璃 */
  --glass: rgba(8, 12, 20, 0.55);
  --glass-strong: rgba(5, 8, 14, 0.85);
  --glass-border: rgba(0, 240, 255, 0.22);
  --glass-highlight: inset 0 1px 0 rgba(0, 240, 255, 0.1);
  --blur: none;

  /* 切角:右上角削一刀,工业面板语言 */
  --notch: polygon(0 0, calc(100% - 14px) 0, 100% 14px, 100% 100%, 0 100%);

  /* 分层字体:界面/中文用系统黑体,等宽只给终端、代码与工业标注 */
  --sans: "HarmonyOS Sans SC", "MiSans", "PingFang SC", "Microsoft YaHei",
          "Noto Sans SC", system-ui, -apple-system, sans-serif;
  --mono: "Cascadia Code", "JetBrains Mono", Consolas, ui-monospace, monospace;
}

* { margin: 0; padding: 0; box-sizing: border-box; }

html {
  /* 整页翻页:JS 监控切台式硬切换(无平滑动画),吸附仅兜底对齐 */
  scroll-snap-type: y mandatory;
}

/* monitorCut 关闭时回退平滑滚动翻页 */
html.fx-off-monitor-cut { scroll-behavior: smooth; }

body {
  background: var(--bg);
  color: var(--text);
  font-family: var(--sans);
  overflow-x: hidden;
  line-height: 1.6;
}

/* 等宽字体白名单:终端 / 代码 / 标注类元素 */
.nav-logo,
.nav-links a,
.hero-title,
.terminal,
#term-input,
.code-block,
.tag,
.stat-num,
.footer-code,
.easter-face,
.terminal-title,
#syslog,
body::after {
  font-family: var(--mono);
}

/* ---------- 自定义光标:青色十字准星,可点击处变品红锁定框 ---------- */
/* 准星带一丝品红色散伪影,与标题双通道错位同源;关闭开关回退系统光标。
   用 PNG 而非 SVG:Safari 不支持 SVG cursor;image-set 提供 2x 供 Retina。
   .nav-logo 显式声明过 cursor,单独拉回准星,保持全页一致 */
html:not(.fx-off-custom-cursor) body,
html:not(.fx-off-custom-cursor) .nav-logo {
  cursor: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAB0UlEQVR42tWVz2oTURTGf+fOTDuTKRVLVSqCaEFw7cZdH8BQn0A3BbtSF4K6G1zZjZsgtYrQpT6E6BO48g/UB1CsMqRi0qaZzOcisaZxDEnJLDxwNvfe73z3nHu+c+EIJjBKsS+KSXVsHIgb7cryAYioOfK3OpuEvQ2bDAG9mkwTnmxokWh+pRvZNDGCnmUuy4RUmWyJ+hMxMyAvi2BsK53AH/FcJydx1uHextrrdwQWa2yqN/JRodthkVUruvR0flSc/dWKBe2ZD1G0AxWsD8SUYnaoUWGKnBxhWO9kyC3M6gDU9cyUL+TH3bJhQvJo8RiPmKwv4j4BLe5wwj5336BO4MTSqa97iy6zrj7NMMH6w1fvl+eSDUsf/DCxgNwZMMSN4OPVF9eqa1dWWrNhYG0d4LZn/DTLXeW3FM1AIvG5MLeKuQgjP6h94MXs++v2afW79aWvpc2Q9OdtWh3hvOzQW201nxv3dzQ4SqzAC+rr6fKjaBjunzpQgf/ZSxxS/KH68jqN8OYw3BE+APkG0NSTc1uNpi7W7lopSjZmd+PpCFlW1qjIXDvToPjKmKb8f9NUAHtMbc/4KV57UyN+maN2UTfQt8ZpdnW+7KzRGDf/BeY0x63LmLXPAAAAAElFTkSuQmCC") 12 12, crosshair;
  cursor: -webkit-image-set(url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAB0UlEQVR42tWVz2oTURTGf+fOTDuTKRVLVSqCaEFw7cZdH8BQn0A3BbtSF4K6G1zZjZsgtYrQpT6E6BO48g/UB1CsMqRi0qaZzOcisaZxDEnJLDxwNvfe73z3nHu+c+EIJjBKsS+KSXVsHIgb7cryAYioOfK3OpuEvQ2bDAG9mkwTnmxokWh+pRvZNDGCnmUuy4RUmWyJ+hMxMyAvi2BsK53AH/FcJydx1uHextrrdwQWa2yqN/JRodthkVUruvR0flSc/dWKBe2ZD1G0AxWsD8SUYnaoUWGKnBxhWO9kyC3M6gDU9cyUL+TH3bJhQvJo8RiPmKwv4j4BLe5wwj5336BO4MTSqa97iy6zrj7NMMH6w1fvl+eSDUsf/DCxgNwZMMSN4OPVF9eqa1dWWrNhYG0d4LZn/DTLXeW3FM1AIvG5MLeKuQgjP6h94MXs++v2afW79aWvpc2Q9OdtWh3hvOzQW201nxv3dzQ4SqzAC+rr6fKjaBjunzpQgf/ZSxxS/KH68jqN8OYw3BE+APkG0NSTc1uNpi7W7lopSjZmd+PpCFlW1qjIXDvToPjKmKb8f9NUAHtMbc/4KV57UyN+maN2UTfQt8ZpdnW+7KzRGDf/BeY0x63LmLXPAAAAAElFTkSuQmCC") 1x, url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEA0lEQVR42u2ZzWtcZRTGf+edO8nMJOarjYu0RltEEEFJA61SlLR2kb0k6B9gKYoo4lKZZKEWJCrWjW5EN2Jm5UoRIVVQ0DZqoYsQpMU2GJA0M/mYdJKZ+z4uJh8Tm0wbnAmZMC+8q3s55z73nPfc53ku1PiyqkaXNuKbifrazQpIAXPcB0AreZllV5Pt8UpIEQDm9TQ5zZLXLGl9DYCr/PtyVaxtlIB2AtpdSIcOj8R/fu6reO0AALk8YhkdnZ7rwvFm7/X0C8UeUsVKEVT5hBkGkdAHQJN51VQFNkphJrAQM1+TANZgVCPqLgKozqoDqAPYw2NUCF98S1ItAgiIFSuciwZBLQHwAC3pud+ysdbT/T/8deil0av9JKIuWvB+7wNY5f2L3W2zHsa+4fkuHjp+wrfE4k6+oWZayBfFjLs4mJo/Np250LIYCtnSKsOoi5vyfH5n27aJ45ACLit69pPLUZF0W7LQSuXbH5JSCkjzFHECcnc5IQWgGVqm567MdX+QMQ0JMyE5zDxp9dFGHytAlut02OdItnbIRdINjg4EqTOPndhJPrL8QZulS2NtuAcZdZDWEgXJ3ZZcrsxekpwkpGc2xZCC1VjnKV4Xs/p1va0235uwtG67e8jH0mqsBT1bKl23ohIRIuDtHjZw+uJUtzrfeXjs5VQTQO/4ePHhQsKSOudLE4ymUk6PfHRk9I3vHlVA6N3dc5U8qW0/RvPkCfjWzfvWozcWHoh4RVRsC7uTRHn5uLPXvrzST6Lx+LFLmY+Byd5xGC+mmQTGWAbE7wADgylLASe/SDdivNj3y1TH4xMzf+fiQYPzkpfdeUBNcjJ3szMxlT3YsEyBW5S4G/bfAyEgAWQPv/c2Zs2YK2wrRjzQEnU+COJuJRyxiVcmRdIZw35rcoQZSE+OxFmMD4FvYn55BV+WVgosxo3r7xoXptzap36rCngwk+z711ONubFb13CKRSwIy6kply8o4i0gDLIAQ5tdOSOVsuTAgIZKnbmZwBPTRGgW9weaPM6s3Fz3oTXMPNhj/Cj31tAQw8PDfp+O0c1c2HYWaAt6INnoYMqdvJZu7Iq2i5lpb3++ulyx+OUm7//lKwIzMw3Ezh/iSOKcj8xEXFMwAXwmZJXiQ1VTZIOjV6Nk1J4629P5z8HmAw414Ynv/aYs8UZdTrNuKZx74tLMpLpH3i/0fnqudpy5VW/UmyMbCzLFKVd5IlZdTZxHGLgwrElNvO6NYtUzP+q+UB1AHcAufiGogkO3KwCcMMw1gtWOLwRIwmNw8/7EFKH/cL45kdv7vtAalVjQmXVNnNFP5bnv3gKwZhC0k9cp8jpFWj0i6ZLJZM0Pjd0TNBWqhFufQFX4Q7kv1r/LhzxnXn01jAAAAABJRU5ErkJggg==") 2x) 12 12, crosshair;
  cursor: image-set(url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAB0UlEQVR42tWVz2oTURTGf+fOTDuTKRVLVSqCaEFw7cZdH8BQn0A3BbtSF4K6G1zZjZsgtYrQpT6E6BO48g/UB1CsMqRi0qaZzOcisaZxDEnJLDxwNvfe73z3nHu+c+EIJjBKsS+KSXVsHIgb7cryAYioOfK3OpuEvQ2bDAG9mkwTnmxokWh+pRvZNDGCnmUuy4RUmWyJ+hMxMyAvi2BsK53AH/FcJydx1uHextrrdwQWa2yqN/JRodthkVUruvR0flSc/dWKBe2ZD1G0AxWsD8SUYnaoUWGKnBxhWO9kyC3M6gDU9cyUL+TH3bJhQvJo8RiPmKwv4j4BLe5wwj5336BO4MTSqa97iy6zrj7NMMH6w1fvl+eSDUsf/DCxgNwZMMSN4OPVF9eqa1dWWrNhYG0d4LZn/DTLXeW3FM1AIvG5MLeKuQgjP6h94MXs++v2afW79aWvpc2Q9OdtWh3hvOzQW201nxv3dzQ4SqzAC+rr6fKjaBjunzpQgf/ZSxxS/KH68jqN8OYw3BE+APkG0NSTc1uNpi7W7lopSjZmd+PpCFlW1qjIXDvToPjKmKb8f9NUAHtMbc/4KV57UyN+maN2UTfQt8ZpdnW+7KzRGDf/BeY0x63LmLXPAAAAAElFTkSuQmCC") 1x, url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEA0lEQVR42u2ZzWtcZRTGf+edO8nMJOarjYu0RltEEEFJA61SlLR2kb0k6B9gKYoo4lKZZKEWJCrWjW5EN2Jm5UoRIVVQ0DZqoYsQpMU2GJA0M/mYdJKZ+z4uJh8Tm0wbnAmZMC+8q3s55z73nPfc53ku1PiyqkaXNuKbifrazQpIAXPcB0AreZllV5Pt8UpIEQDm9TQ5zZLXLGl9DYCr/PtyVaxtlIB2AtpdSIcOj8R/fu6reO0AALk8YhkdnZ7rwvFm7/X0C8UeUsVKEVT5hBkGkdAHQJN51VQFNkphJrAQM1+TANZgVCPqLgKozqoDqAPYw2NUCF98S1ItAgiIFSuciwZBLQHwAC3pud+ysdbT/T/8deil0av9JKIuWvB+7wNY5f2L3W2zHsa+4fkuHjp+wrfE4k6+oWZayBfFjLs4mJo/Np250LIYCtnSKsOoi5vyfH5n27aJ45ACLit69pPLUZF0W7LQSuXbH5JSCkjzFHECcnc5IQWgGVqm567MdX+QMQ0JMyE5zDxp9dFGHytAlut02OdItnbIRdINjg4EqTOPndhJPrL8QZulS2NtuAcZdZDWEgXJ3ZZcrsxekpwkpGc2xZCC1VjnKV4Xs/p1va0235uwtG67e8jH0mqsBT1bKl23ohIRIuDtHjZw+uJUtzrfeXjs5VQTQO/4ePHhQsKSOudLE4ymUk6PfHRk9I3vHlVA6N3dc5U8qW0/RvPkCfjWzfvWozcWHoh4RVRsC7uTRHn5uLPXvrzST6Lx+LFLmY+Byd5xGC+mmQTGWAbE7wADgylLASe/SDdivNj3y1TH4xMzf+fiQYPzkpfdeUBNcjJ3szMxlT3YsEyBW5S4G/bfAyEgAWQPv/c2Zs2YK2wrRjzQEnU+COJuJRyxiVcmRdIZw35rcoQZSE+OxFmMD4FvYn55BV+WVgosxo3r7xoXptzap36rCngwk+z711ONubFb13CKRSwIy6kply8o4i0gDLIAQ5tdOSOVsuTAgIZKnbmZwBPTRGgW9weaPM6s3Fz3oTXMPNhj/Cj31tAQw8PDfp+O0c1c2HYWaAt6INnoYMqdvJZu7Iq2i5lpb3++ulyx+OUm7//lKwIzMw3Ezh/iSOKcj8xEXFMwAXwmZJXiQ1VTZIOjV6Nk1J4629P5z8HmAw414Ynv/aYs8UZdTrNuKZx74tLMpLpH3i/0fnqudpy5VW/UmyMbCzLFKVd5IlZdTZxHGLgwrElNvO6NYtUzP+q+UB1AHcAufiGogkO3KwCcMMw1gtWOLwRIwmNw8/7EFKH/cL45kdv7vtAalVjQmXVNnNFP5bnv3gKwZhC0k9cp8jpFWj0i6ZLJZM0Pjd0TNBWqhFufQFX4Q7kv1r/LhzxnXn01jAAAAABJRU5ErkJggg==") 2x) 12 12, crosshair;
}

html:not(.fx-off-custom-cursor) :is(a, button, .btn, .fold-arrow, .fold-dots, .proj-item) {
  cursor: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAACtUlEQVR42r2WzWsUWRTFf+fV6yExEuO3s1OQWYwTtyIKEXTtxph/QmdEl27aXs8qOn7sAuIqgrpyJWJciSAiiCtRRFREnI66kJiuOrOo6urqdKWNi/FCwePVu+fee+rcd0sUZuYTprYK7tFnC61UYFYxTzVj/84h2PbBuj6T8jNMbjaDWq3Mk5eOEkamSb82kAQWADE7rcd/vjWWkPNq87X3Xh3Dny9AHIOOsUwY7ZB9vaunJ+ZMM0RaZbFnCXEfqd8BARcBlrQuf39OrKRKHxtkjYOIDRgQGSHbQcZhYE60sgp/Dix/eaCnJ/fXlkor663zSvTk9CLwW14VEtiTF68hjnTPhgqEkJIuBT9M9vH5LlaCUU0AC7JgEMwEg/J1VTJOsOOAkkC8uFP4ZoGKX1z5zQU2v7tWmlJaTx/2+l8LX/X5xZLbyLEuZpXvIvOAlNH2NLCLjfq7V3UBuNDKg0efYYl1a+fWDtgj2JG2b9P2N+yIHZl3snYcmsE0w9BD/3qORb8ejmNVcTQk8wQppe1pJphhkQ7iAGY7cIMJAp9YYEKXy7M1Fod1eaGzncAUooPZDDQQU4Xv++8m2l/aKvrvdnXb12j7zXAc+nBCtTu1QmIVS4pDG4At/b0zKNkqTkmRd8+OA+j5qc/1iQFwG3hZVlVTr/deHUMfG8U1Qk85o8ktRuPNrqJqG2xCl9mov4o9U8m0nAv+dJ70l4c1VwWbimd1m3eCv6N9hXHkLXUqWq5kH0xzsKtnBqVYVvuhYMNOcY61MoDBnQIwW/PE6ibwjG85yD9LOX2DAQJhZL//uPgA0aMhelqPT74yzdAFKyfa7tlxRuJNQhjHKaAMxUmy5S890OPPCi34CoT7vaaxWMtckFX6GFDyCDFbK5b/Zej3f6xz5E/9qFztkhzc3SOR/7b8BypvJhG7HeyZAAAAAElFTkSuQmCC") 12 12, pointer;
  cursor: -webkit-image-set(url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAACtUlEQVR42r2WzWsUWRTFf+fV6yExEuO3s1OQWYwTtyIKEXTtxph/QmdEl27aXs8qOn7sAuIqgrpyJWJciSAiiCtRRFREnI66kJiuOrOo6urqdKWNi/FCwePVu+fee+rcd0sUZuYTprYK7tFnC61UYFYxTzVj/84h2PbBuj6T8jNMbjaDWq3Mk5eOEkamSb82kAQWADE7rcd/vjWWkPNq87X3Xh3Dny9AHIOOsUwY7ZB9vaunJ+ZMM0RaZbFnCXEfqd8BARcBlrQuf39OrKRKHxtkjYOIDRgQGSHbQcZhYE60sgp/Dix/eaCnJ/fXlkor663zSvTk9CLwW14VEtiTF68hjnTPhgqEkJIuBT9M9vH5LlaCUU0AC7JgEMwEg/J1VTJOsOOAkkC8uFP4ZoGKX1z5zQU2v7tWmlJaTx/2+l8LX/X5xZLbyLEuZpXvIvOAlNH2NLCLjfq7V3UBuNDKg0efYYl1a+fWDtgj2JG2b9P2N+yIHZl3snYcmsE0w9BD/3qORb8ejmNVcTQk8wQppe1pJphhkQ7iAGY7cIMJAp9YYEKXy7M1Fod1eaGzncAUooPZDDQQU4Xv++8m2l/aKvrvdnXb12j7zXAc+nBCtTu1QmIVS4pDG4At/b0zKNkqTkmRd8+OA+j5qc/1iQFwG3hZVlVTr/deHUMfG8U1Qk85o8ktRuPNrqJqG2xCl9mov4o9U8m0nAv+dJ70l4c1VwWbimd1m3eCv6N9hXHkLXUqWq5kH0xzsKtnBqVYVvuhYMNOcY61MoDBnQIwW/PE6ibwjG85yD9LOX2DAQJhZL//uPgA0aMhelqPT74yzdAFKyfa7tlxRuJNQhjHKaAMxUmy5S890OPPCi34CoT7vaaxWMtckFX6GFDyCDFbK5b/Zej3f6xz5E/9qFztkhzc3SOR/7b8BypvJhG7HeyZAAAAAElFTkSuQmCC") 1x, url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAFS0lEQVR42u2ZPWxbVRTHf+e+69humi+qUokFygYRRS1LO6CkVRcmBpTCyoREqtKNgcHyABsLUrqAhFiQiDemolLcCCGmQNWQVkhELRJioG3SNE7txO/dw/BeHH88J7Zf0qRSjmT56t377jvf9/zPhQPaW5K4h0rOMDEqHe1QuOAEtFcGdGLa6+w7BYRCsP2GqOxXbSs5s6UFFBVBVE98cRwOHydYdVizhUBpcOs3Ze7DpY13u2JorGhZvHMG41nw4xf5gJcStLwscx/NNk/b2ma5nCGP6ujUK2B/xsgRSG/hHApeClzlPHCdiYKhQNCZJiNh7/82iMn8gNgsro1HWwADchg9MfWe3Jr8TiemPSlcCKKZiG6MG0EUw7t4h47gl9bAgRgQif6bfhjwTDKXE/VCBtv8FAgq6yDgdDKMh3ltsUCjinxFPIsL7oJ/DxFBtckW4lAM4h4A8Op894Ec+FVM+ipBZQANtMEEEhoZYRgxr4NTkGpbF2qSQPCyHkH5K5mb/KwjRebzrvPUF8aK/PnxCvD2lu526sppfPtrja/OBIh8HNJKzvDqqOX2fJsoy2uiNBqTWQB44wWP2X8Dqq6fLZzUbrO9CnmnR4tO6FzD3R1E8fvqy9Misx84NVNuK/WYZ/0kPhBgr8nG5GWF8FiJxgnO/rqsIdLjXmaTH8RtL4CSxqRDywRP0skiVDR5lKtF0gYx4Ff62wswMx5EQn5JUL0Wje81zHWnfcsyAwAMUUWk1NX7hYlQ2wGzmMo51AMXPNpI3btYMmpYHj/WN6noIlVd5KF+H82ZXY+BBixQmNee87+QwjKCBxiGej/oECamTWJ+urbAip6lrI51dSzq9admgURMh+ShCiUMgkRlgInWmIbMBC5poO+MACL1QR6Ol7VUqyqFarQm2H8WULUscYYslgogeHgEOE7iIkSlHGVFz+JjsDh84DCwyk2GZQlV6dUSkoDx8KOP9DmUfxggS7VuRwes1533fQ2OA1mgxHkG5DqqXpMVn7ILgYcXMSZt1OTFqk323oWqVLFcZYUBXIShHGAYxnASAQKWWOEmJhLS4BAMwoN68LG/aFVPU1GlqsqiXnt6xVxv8WAa3AkCSvTXuY2N1pjNwizS/D5Jo64puB0r2syoQ7Vx7e6UEtRBXCEB3lWUDTiYiOnNbmErPzYmYegOJIdw70wNMPUnw83t3azVAi9+nWGwnA0rymxZ/n6/0uX3Nstgn3MRB496zTY6lrMsHgvL8sBV5fbFUiyk1LFiKMzQ6mW8zAJeZoGh1csNc92AmGFZIiVFUlJkRH7vFuDUutaLx84gdgHTt4Dh2+ZWTAwik0OIN1IbJ4OTpiGIey3LxRsJW5ky1AEmlgD1NaZI6wVOJi/eRDXkx0BMC9vGa06kBZTvKYlEzVI56Avt/75Qc1NmrGjhntWxYvyKmfGg25uZljTJeOvEStnTsaKwfMfbKvnabaBCSWbO+rS9/9kB757J+5CPm/IB9NSVJZx025kTcOsOeEtfmzoUU4SF6yQtaPkbuXXpruZyptM7gtpd3OnPs6xmL4FkkSB83BC4qqy7lxBfkZR03plDFLe+hkmNY/rGN65KWqomkwFX+QW4y+3R7jPW48EsZu1TUgMe6sfjGw0gWKugqRRotn0QP38/8jTzEzghNZjF9O0UcErgYx7Y/gy23wOuAtTfYdcsIIULoQ3n5EcdnXoHmzlB8MQhxrQ/YJyg+hfQ2x3Z4OMyq9lP8J/EuFDtXFJMH/iVh/wxOQUX2bih3KZ0fTZI2hZS/x3tTJDdSqMtdCPKWAe0v+h/G749vSWhS0wAAAAASUVORK5CYII=") 2x) 12 12, pointer;
  cursor: image-set(url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAACtUlEQVR42r2WzWsUWRTFf+fV6yExEuO3s1OQWYwTtyIKEXTtxph/QmdEl27aXs8qOn7sAuIqgrpyJWJciSAiiCtRRFREnI66kJiuOrOo6urqdKWNi/FCwePVu+fee+rcd0sUZuYTprYK7tFnC61UYFYxTzVj/84h2PbBuj6T8jNMbjaDWq3Mk5eOEkamSb82kAQWADE7rcd/vjWWkPNq87X3Xh3Dny9AHIOOsUwY7ZB9vaunJ+ZMM0RaZbFnCXEfqd8BARcBlrQuf39OrKRKHxtkjYOIDRgQGSHbQcZhYE60sgp/Dix/eaCnJ/fXlkor663zSvTk9CLwW14VEtiTF68hjnTPhgqEkJIuBT9M9vH5LlaCUU0AC7JgEMwEg/J1VTJOsOOAkkC8uFP4ZoGKX1z5zQU2v7tWmlJaTx/2+l8LX/X5xZLbyLEuZpXvIvOAlNH2NLCLjfq7V3UBuNDKg0efYYl1a+fWDtgj2JG2b9P2N+yIHZl3snYcmsE0w9BD/3qORb8ejmNVcTQk8wQppe1pJphhkQ7iAGY7cIMJAp9YYEKXy7M1Fod1eaGzncAUooPZDDQQU4Xv++8m2l/aKvrvdnXb12j7zXAc+nBCtTu1QmIVS4pDG4At/b0zKNkqTkmRd8+OA+j5qc/1iQFwG3hZVlVTr/deHUMfG8U1Qk85o8ktRuPNrqJqG2xCl9mov4o9U8m0nAv+dJ70l4c1VwWbimd1m3eCv6N9hXHkLXUqWq5kH0xzsKtnBqVYVvuhYMNOcY61MoDBnQIwW/PE6ibwjG85yD9LOX2DAQJhZL//uPgA0aMhelqPT74yzdAFKyfa7tlxRuJNQhjHKaAMxUmy5S890OPPCi34CoT7vaaxWMtckFX6GFDyCDFbK5b/Zej3f6xz5E/9qFztkhzc3SOR/7b8BypvJhG7HeyZAAAAAElFTkSuQmCC") 1x, url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAFS0lEQVR42u2ZPWxbVRTHf+e+69humi+qUokFygYRRS1LO6CkVRcmBpTCyoREqtKNgcHyABsLUrqAhFiQiDemolLcCCGmQNWQVkhELRJioG3SNE7txO/dw/BeHH88J7Zf0qRSjmT56t377jvf9/zPhQPaW5K4h0rOMDEqHe1QuOAEtFcGdGLa6+w7BYRCsP2GqOxXbSs5s6UFFBVBVE98cRwOHydYdVizhUBpcOs3Ze7DpY13u2JorGhZvHMG41nw4xf5gJcStLwscx/NNk/b2ma5nCGP6ujUK2B/xsgRSG/hHApeClzlPHCdiYKhQNCZJiNh7/82iMn8gNgsro1HWwADchg9MfWe3Jr8TiemPSlcCKKZiG6MG0EUw7t4h47gl9bAgRgQif6bfhjwTDKXE/VCBtv8FAgq6yDgdDKMh3ltsUCjinxFPIsL7oJ/DxFBtckW4lAM4h4A8Op894Ec+FVM+ipBZQANtMEEEhoZYRgxr4NTkGpbF2qSQPCyHkH5K5mb/KwjRebzrvPUF8aK/PnxCvD2lu526sppfPtrja/OBIh8HNJKzvDqqOX2fJsoy2uiNBqTWQB44wWP2X8Dqq6fLZzUbrO9CnmnR4tO6FzD3R1E8fvqy9Misx84NVNuK/WYZ/0kPhBgr8nG5GWF8FiJxgnO/rqsIdLjXmaTH8RtL4CSxqRDywRP0skiVDR5lKtF0gYx4Ff62wswMx5EQn5JUL0Wje81zHWnfcsyAwAMUUWk1NX7hYlQ2wGzmMo51AMXPNpI3btYMmpYHj/WN6noIlVd5KF+H82ZXY+BBixQmNee87+QwjKCBxiGej/oECamTWJ+urbAip6lrI51dSzq9admgURMh+ShCiUMgkRlgInWmIbMBC5poO+MACL1QR6Ol7VUqyqFarQm2H8WULUscYYslgogeHgEOE7iIkSlHGVFz+JjsDh84DCwyk2GZQlV6dUSkoDx8KOP9DmUfxggS7VuRwes1533fQ2OA1mgxHkG5DqqXpMVn7ILgYcXMSZt1OTFqk323oWqVLFcZYUBXIShHGAYxnASAQKWWOEmJhLS4BAMwoN68LG/aFVPU1GlqsqiXnt6xVxv8WAa3AkCSvTXuY2N1pjNwizS/D5Jo64puB0r2syoQ7Vx7e6UEtRBXCEB3lWUDTiYiOnNbmErPzYmYegOJIdw70wNMPUnw83t3azVAi9+nWGwnA0rymxZ/n6/0uX3Nstgn3MRB496zTY6lrMsHgvL8sBV5fbFUiyk1LFiKMzQ6mW8zAJeZoGh1csNc92AmGFZIiVFUlJkRH7vFuDUutaLx84gdgHTt4Dh2+ZWTAwik0OIN1IbJ4OTpiGIey3LxRsJW5ky1AEmlgD1NaZI6wVOJi/eRDXkx0BMC9vGa06kBZTvKYlEzVI56Avt/75Qc1NmrGjhntWxYvyKmfGg25uZljTJeOvEStnTsaKwfMfbKvnabaBCSWbO+rS9/9kB757J+5CPm/IB9NSVJZx025kTcOsOeEtfmzoUU4SF6yQtaPkbuXXpruZyptM7gtpd3OnPs6xmL4FkkSB83BC4qqy7lxBfkZR03plDFLe+hkmNY/rGN65KWqomkwFX+QW4y+3R7jPW48EsZu1TUgMe6sfjGw0gWKugqRRotn0QP38/8jTzEzghNZjF9O0UcErgYx7Y/gy23wOuAtTfYdcsIIULoQ3n5EcdnXoHmzlB8MQhxrQ/YJyg+hfQ2x3Z4OMyq9lP8J/EuFDtXFJMH/iVh/wxOQUX2bih3KZ0fTZI2hZS/x3tTJDdSqMtdCPKWAe0v+h/G749vSWhS0wAAAAASUVORK5CYII=") 2x) 12 12, pointer;
}

/* 文本输入区:同风格青色工字梁光标(覆盖 .terminal-body 的系统 text 光标) */
html:not(.fx-off-custom-cursor) :is(.terminal-body, input, textarea) {
  cursor: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABKUlEQVR42u2VvUpDQRCFv9kbk4AEwcI0gkIkhQ9h6VuIpPUhIvga6fMcksY3sFQs7AJe86Mx2eyxuCakMHFNrthkYGFn2OWbOcUcIyYk923dLPDfYVHdpxxhJBgOsMoHoS/EAU+YTdZDSxk81T4vmiKJgUTv6y6Jrk5XSgi45bOZANhjgOOSIQ0Cd5U3r0b7vkWPBo7nWTv5aDlS6/BhJJWuryzyn4t69ajymVRAlIMzpvXqbpbL8gEc4ztmfiZFMvahY+bnMm4M2CC2gC1gC4gHuGa2MbPVUEisuWKD/h5gNr4xCwhvArr9LM8FIDlSnRTfVQMqkwR/e16vFlPVkHbWF2/RcNIFk1k8EYZTiDKcVy4YUmKC5jMHLFfD+TvTzyRYNun0J0/4BFzTlXhu7pipAAAAAElFTkSuQmCC") 12 12, text;
  cursor: -webkit-image-set(url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABKUlEQVR42u2VvUpDQRCFv9kbk4AEwcI0gkIkhQ9h6VuIpPUhIvga6fMcksY3sFQs7AJe86Mx2eyxuCakMHFNrthkYGFn2OWbOcUcIyYk923dLPDfYVHdpxxhJBgOsMoHoS/EAU+YTdZDSxk81T4vmiKJgUTv6y6Jrk5XSgi45bOZANhjgOOSIQ0Cd5U3r0b7vkWPBo7nWTv5aDlS6/BhJJWuryzyn4t69ajymVRAlIMzpvXqbpbL8gEc4ztmfiZFMvahY+bnMm4M2CC2gC1gC4gHuGa2MbPVUEisuWKD/h5gNr4xCwhvArr9LM8FIDlSnRTfVQMqkwR/e16vFlPVkHbWF2/RcNIFk1k8EYZTiDKcVy4YUmKC5jMHLFfD+TvTzyRYNun0J0/4BFzTlXhu7pipAAAAAElFTkSuQmCC") 1x, url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAB2ElEQVR42u2Zv4oUQRCHv+qZXffWOz0MRE4wER/gAkEzxVcQfAJ9B1Njn+TwAcwEX0AxMRAMTRTGdW//zkz/DLZ3VzkQTtu7OagfNDN0zzT9VVVXUAUu1z/Jsu0kFaf8I2Im90Am65dU3GeHkjlQ/uHbBtgFJrxn3yokOz9PSCsDfNc1Kk1pJGYSc4mFRJ3GUrJ5mp9KSGKsR38Zer+pzIhTUAAtEJKlJ8S0ErRzwudZvJ8HoKam5DVj9mjSXGCfkkMMQs1o+HX5sS1CnA3KGUbA+Lb2Yzdv10T3wnwVPnc+VJ80fPFcBy+f5E19K2fnug8hjR5SIHJ5bd8g+tzYO5jeunIdKTw+UrG5P50IIQCzuLnYZpGxItsYEY2WvVoNZvEImZEn84QzTFn2P3YNXHA5gAM4gAM4gAM4gAM4gAM4gAM4gAM4gAM4wDkDSEUqla+f273NoFfYom8BqXjwhk6WFtv0tnqOdLxeKtoY+TJe7B7XU8zatxk9UGay/q8dmkBJJHKoCBj8GPaHr57evf355tVLPNPDMMDaBe+63aGZSFRqqNQwUsssrXW+Q5OsTgEMWB1ObGrR25p1Vzs0ERFPHk7btBEvRofmjJSz0X3alCxvdLs6oJ9jLvOj4PaAUAAAAABJRU5ErkJggg==") 2x) 12 12, text;
  cursor: image-set(url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABKUlEQVR42u2VvUpDQRCFv9kbk4AEwcI0gkIkhQ9h6VuIpPUhIvga6fMcksY3sFQs7AJe86Mx2eyxuCakMHFNrthkYGFn2OWbOcUcIyYk923dLPDfYVHdpxxhJBgOsMoHoS/EAU+YTdZDSxk81T4vmiKJgUTv6y6Jrk5XSgi45bOZANhjgOOSIQ0Cd5U3r0b7vkWPBo7nWTv5aDlS6/BhJJWuryzyn4t69ajymVRAlIMzpvXqbpbL8gEc4ztmfiZFMvahY+bnMm4M2CC2gC1gC4gHuGa2MbPVUEisuWKD/h5gNr4xCwhvArr9LM8FIDlSnRTfVQMqkwR/e16vFlPVkHbWF2/RcNIFk1k8EYZTiDKcVy4YUmKC5jMHLFfD+TvTzyRYNun0J0/4BFzTlXhu7pipAAAAAElFTkSuQmCC") 1x, url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAB2ElEQVR42u2Zv4oUQRCHv+qZXffWOz0MRE4wER/gAkEzxVcQfAJ9B1Njn+TwAcwEX0AxMRAMTRTGdW//zkz/DLZ3VzkQTtu7OagfNDN0zzT9VVVXUAUu1z/Jsu0kFaf8I2Im90Am65dU3GeHkjlQ/uHbBtgFJrxn3yokOz9PSCsDfNc1Kk1pJGYSc4mFRJ3GUrJ5mp9KSGKsR38Zer+pzIhTUAAtEJKlJ8S0ErRzwudZvJ8HoKam5DVj9mjSXGCfkkMMQs1o+HX5sS1CnA3KGUbA+Lb2Yzdv10T3wnwVPnc+VJ80fPFcBy+f5E19K2fnug8hjR5SIHJ5bd8g+tzYO5jeunIdKTw+UrG5P50IIQCzuLnYZpGxItsYEY2WvVoNZvEImZEn84QzTFn2P3YNXHA5gAM4gAM4gAM4gAM4gAM4gAM4gAM4gAM4wDkDSEUqla+f273NoFfYom8BqXjwhk6WFtv0tnqOdLxeKtoY+TJe7B7XU8zatxk9UGay/q8dmkBJJHKoCBj8GPaHr57evf355tVLPNPDMMDaBe+63aGZSFRqqNQwUsssrXW+Q5OsTgEMWB1ObGrR25p1Vzs0ERFPHk7btBEvRofmjJSz0X3alCxvdLs6oJ9jLvOj4PaAUAAAAABJRU5ErkJggg==") 2x) 12 12, text;
}

/* 霓虹雾:青/电蓝/品红极淡光晕,缓慢漂移 */
body::before {
  content: '';
  position: fixed;
  inset: -30%;
  z-index: -3;
  background:
    radial-gradient(40% 40% at 30% 25%, rgba(0, 240, 255, 0.07), transparent 70%),
    radial-gradient(44% 44% at 72% 40%, rgba(64, 100, 255, 0.08), transparent 70%),
    radial-gradient(36% 36% at 45% 68%, rgba(255, 42, 109, 0.05), transparent 70%),
    radial-gradient(42% 42% at 60% 88%, rgba(0, 240, 255, 0.05), transparent 70%);
  animation: smog 30s ease-in-out infinite alternate;
}

@keyframes smog {
  from { transform: translate(-3%, -2%) scale(1); }
  to   { transform: translate(4%, 3%) scale(1.07); }
}

/* 右下角竖排工业标注 */
body::after {
  content: 'LAT 39.9042 / LON 116.4074 // SIGNAL LOST // Y5NEKO_TERMINAL v3.0';
  position: fixed;
  right: 10px;
  bottom: 24px;
  z-index: -1;
  writing-mode: vertical-rl;
  font-size: 10px;
  letter-spacing: 5px;
  color: var(--text-dim);
  opacity: 0.4;
  pointer-events: none;
}

::selection { background: var(--accent); color: #050508; }

::-webkit-scrollbar { width: 8px; }
::-webkit-scrollbar-track { background: var(--bg); }
::-webkit-scrollbar-thumb { background: #223140; border: 1px solid var(--line); }
::-webkit-scrollbar-thumb:hover { background: var(--accent); }

/* ---------- 背景层 ---------- */
/* 工程蓝图网格:细格 + 粗格双层,缓慢平移产生视差 */
.bg-grid {
  position: fixed;
  inset: -160px;
  z-index: -2;
  background-image:
    linear-gradient(rgba(0, 240, 255, 0.03) 1px, transparent 1px),
    linear-gradient(90deg, rgba(0, 240, 255, 0.03) 1px, transparent 1px),
    linear-gradient(rgba(0, 240, 255, 0.06) 1px, transparent 1px),
    linear-gradient(90deg, rgba(0, 240, 255, 0.06) 1px, transparent 1px);
  background-size: 28px 28px, 28px 28px, 140px 140px, 140px 140px;
  animation: grid-pan 60s linear infinite;
}

@keyframes grid-pan {
  to { transform: translate(140px, 140px); }
}

/* 网格上的基准十字标记 */
.bg-grid::before,
.bg-grid::after {
  content: '+';
  position: absolute;
  color: rgba(0, 240, 255, 0.3);
  font: 18px var(--mono);
}

.bg-grid::before { top: 30%; left: 22%; }
.bg-grid::after { top: 64%; left: 74%; }

/* 漂浮尘埃 */
#dust-canvas {
  position: fixed;
  inset: 0;
  z-index: -2;
  opacity: 0.6;
}

/* 滚动系统日志流 */
#syslog {
  position: fixed;
  left: 18px;
  bottom: 16px;
  z-index: -1;
  width: 320px;
  max-height: 38vh;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  font-size: 10px;
  line-height: 1.8;
  letter-spacing: 0.5px;
  color: var(--text-dim);
  opacity: 0.55;
  pointer-events: none;
  mask-image: linear-gradient(to top, #000 55%, transparent);
  -webkit-mask-image: linear-gradient(to top, #000 55%, transparent);
}

#syslog .syslog-warn { color: rgba(255, 42, 109, 0.75); }
#syslog .syslog-err { color: rgba(255, 42, 60, 0.95); font-weight: 600; }

/* "她"的话:凝视时浮出的特殊日志,品红发光 + 青色散错位 */
#syslog .syslog-gaze {
  color: #ff5c97;
  font-weight: 600;
  text-shadow:
    1px 0 rgba(0, 240, 255, 0.55),
    -1px 0 rgba(255, 42, 109, 0.45),
    0 0 8px rgba(255, 42, 109, 0.35);
}

/* 摄像机 REC 录制标识:左上角(顶栏下方)红点 + 时间码,取景器式布局;
   故障爆发期间 JS 挂 .rec-lost,变为失联/乱码,结束后恢复 */
#rec-osd {
  position: fixed;
  left: 20px;
  top: 72px;
  /* 取景器 OSD 浮在"画面"最上层:高于切台雪花遮罩(998),翻页时不被盖住;
     仍低于其后的 #glitch-fx(999),扫描线/噪点照常罩在字上 */
  z-index: 999;
  display: flex;
  align-items: center;
  gap: 0.5em;
  /* 取景器比例:REC 约占画面高 3%,跟随视口缩放 */
  font-size: clamp(20px, 3.2vh, 36px);
  font-weight: 600;
  letter-spacing: 0.12em;
  color: rgba(230, 238, 245, 0.82);
  opacity: 0.85;
  pointer-events: none;
}

.rec-dot {
  width: 0.72em;
  height: 0.72em;
  border-radius: 50%;
  background: #ff2a3c;
  box-shadow: 0 0 0.5em rgba(255, 42, 60, 0.8);
  animation: rec-blink 1.3s steps(1) infinite;
}

@keyframes rec-blink { 50% { opacity: 0.12; } }

.rec-time { color: var(--text-dim); letter-spacing: 1px; }

/* 失联状态:红点熄灭,文字带品红/青色散 */
#rec-osd.rec-lost {
  color: rgba(255, 42, 109, 0.9);
  text-shadow: 1px 0 0 rgba(0, 240, 255, 0.5), -1px 0 0 rgba(255, 42, 109, 0.45);
}

#rec-osd.rec-lost .rec-dot {
  background: #61707f;
  box-shadow: none;
  animation: none;
}

#rec-osd.rec-lost .rec-time { color: inherit; }

@media (prefers-reduced-motion: reduce) {
  .rec-dot { animation: none; }
}

/* ---------- 导航:贴顶工业横条 ---------- */
.navbar {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 100;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 2rem;
  padding: 0.85rem 5vw;
  background: var(--glass-strong);
  backdrop-filter: var(--blur);
  -webkit-backdrop-filter: var(--blur);
  border-bottom: 1px solid var(--line);
}

/* 导航底部一条霓虹青细线 */
.navbar::after {
  content: '';
  position: absolute;
  left: 0;
  bottom: -1px;
  width: 120px;
  height: 1px;
  background: var(--accent);
}

.nav-logo {
  font-size: 1.05rem;
  font-weight: bold;
  color: var(--text);
  letter-spacing: 1px;
  cursor: default;
  text-shadow:
    1px 0 rgba(255, 42, 109, 0.5),
    -1px 0 rgba(0, 240, 255, 0.5);
}

.nav-links {
  display: flex;
  gap: 0.4rem;
  list-style: none;
}

.nav-links a {
  color: var(--text-dim);
  text-decoration: none;
  font-size: 0.82rem;
  letter-spacing: 1px;
  padding: 0.35rem 0.9rem;
  border: 1px solid transparent;
  transition: color 0.2s, border-color 0.2s, background 0.2s;
}

.nav-links a:hover {
  color: var(--accent);
  border-color: var(--line);
  background: rgba(0, 240, 255, 0.06);
}

/* 当前模块对应的导航按钮(scrollspy 点亮) */
.nav-links a.is-active {
  color: var(--accent);
  border-color: rgba(0, 240, 255, 0.45);
  background: rgba(0, 240, 255, 0.09);
}

.nav-toggle {
  display: none;
  background: transparent;
  border: 1px solid var(--line);
  color: var(--text);
  font-size: 1.1rem;
  padding: 0.2rem 0.7rem;
  cursor: pointer;
}

/* ---------- Hero ---------- */
.hero {
  min-height: 100vh;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
  padding: 7rem 5vw 3rem;
  position: relative;
  scroll-snap-align: start;
  scroll-snap-stop: always;
}

/* 头像:方形档案照 + 四角瞄准框 */
.avatar-ring {
  position: relative;
  width: 156px;
  height: 156px;
  padding: 8px;
  margin-bottom: 1.8rem;
  border: 1px solid var(--line);
  background: var(--glass);
  backdrop-filter: var(--blur);
  -webkit-backdrop-filter: var(--blur);
}

.avatar-ring::before,
.avatar-ring::after {
  content: '';
  position: absolute;
  width: 18px;
  height: 18px;
  border: 2px solid var(--accent);
}

.avatar-ring::before { top: -2px; left: -2px; border-right: none; border-bottom: none; }
.avatar-ring::after { bottom: -2px; right: -2px; border-left: none; border-top: none; border-color: var(--accent-2); }

.avatar {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  filter: grayscale(35%) contrast(1.05);
}

/* 头像故障切片:品红/青幽灵层由 JS 克隆注入,平时隐形 */
.avatar-ghost {
  position: absolute;
  top: 8px;
  left: 8px;
  width: calc(100% - 16px);
  height: calc(100% - 16px);
  object-fit: cover;
  opacity: 0;
  pointer-events: none;
  mix-blend-mode: screen;
}

/* 借 sepia 上色再转色相:品红 / 青 两个通道 */
.avatar-ghost-r { filter: grayscale(1) brightness(0.8) sepia(1) saturate(12) hue-rotate(290deg); }
.avatar-ghost-c { filter: grayscale(1) brightness(0.8) sepia(1) saturate(12) hue-rotate(145deg); }

.avatar-ring.is-glitching .avatar { animation: avatar-jitter 0.45s steps(3) both; }
.avatar-ring.is-glitching .avatar-ghost-r { animation: ghost-slice-r 0.45s steps(3) both; }
.avatar-ring.is-glitching .avatar-ghost-c { animation: ghost-slice-c 0.45s steps(3) both; }

@keyframes avatar-jitter {
  0%   { transform: translateX(2px); }
  50%  { transform: translateX(-2px); }
  100% { transform: none; }
}

@keyframes ghost-slice-r {
  0%   { opacity: 0.65; clip-path: inset(8% 0 62% 0); transform: translateX(-6px); }
  50%  { opacity: 0.5;  clip-path: inset(46% 0 24% 0); transform: translateX(5px); }
  100% { opacity: 0;    clip-path: inset(0 0 0 0); transform: none; }
}

@keyframes ghost-slice-c {
  0%   { opacity: 0.65; clip-path: inset(58% 0 12% 0); transform: translateX(6px); }
  50%  { opacity: 0.5;  clip-path: inset(20% 0 55% 0); transform: translateX(-5px); }
  100% { opacity: 0;    clip-path: inset(0 0 0 0); transform: none; }
}

.hero-title {
  font-size: clamp(2.2rem, 6vw, 4rem);
  color: var(--text);
  letter-spacing: 3px;
  text-transform: uppercase;
  /* 常驻轻微色散,故障爆发时叠加 .glitch 双通道错位 */
  text-shadow:
    2px 0 rgba(255, 42, 109, 0.35),
    -2px 0 rgba(0, 240, 255, 0.35);
}

.hero-subtitle {
  margin-top: 0.7rem;
  color: var(--text-dim);
  font-size: 1rem;
  letter-spacing: 1px;
}

.accent { color: var(--accent); }

/* 故障风文字:冷白文字 + 品红/霓虹青双通道错位(RGB 色散) */
.glitch { position: relative; }

.glitch::before,
.glitch::after {
  content: attr(data-text);
  position: absolute;
  inset: 0;
  opacity: 0.8;
  pointer-events: none;
}

.glitch::before {
  color: var(--accent-2);
  animation: glitch-shift 2.8s infinite steps(2);
  clip-path: inset(0 0 55% 0);
}

.glitch::after {
  color: var(--accent);
  animation: glitch-shift 2.8s infinite steps(2) reverse;
  clip-path: inset(55% 0 0 0);
}

@keyframes glitch-shift {
  0%, 92%, 100% { transform: translate(0); opacity: 0; }
  93% { transform: translate(-3px, 2px); opacity: 0.8; }
  95% { transform: translate(3px, -2px); opacity: 0.8; }
  97% { transform: translate(-2px, -1px); opacity: 0.6; }
}

/* ---------- 终端:军用信息面板 ---------- */
.terminal {
  width: min(680px, 92vw);
  margin: 2.4rem auto 0;
  border: 1px solid var(--glass-border);
  clip-path: var(--notch);
  background: var(--glass-strong);
  backdrop-filter: var(--blur);
  -webkit-backdrop-filter: var(--blur);
  box-shadow: var(--glass-highlight), 0 20px 60px rgba(0, 0, 0, 0.5);
  text-align: left;
  transition: border-color 0.3s;
}

.terminal:focus-within {
  border-color: rgba(0, 240, 255, 0.45);
}

.terminal-header {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 0.7rem 1.1rem;
  background: rgba(255, 255, 255, 0.035);
  border-bottom: 1px solid var(--line);
}

/* 指示灯:品红/霓虹青双灯亮起 + 一盏熄灭,信号灯语言 */
.dot { width: 9px; height: 9px; }
.dot.red { background: var(--accent-2); }
.dot.yellow { background: var(--accent); }
.dot.green { background: #26303c; }

.terminal-title {
  margin-left: auto;
  font-size: 0.72rem;
  color: var(--text-dim);
  letter-spacing: 1.5px;
  text-transform: uppercase;
}

.terminal-body {
  padding: 1.1rem 1.3rem 1.2rem;
  height: 320px;
  overflow-y: auto;
  overscroll-behavior: contain; /* 滚到头不把滚动链传给页面 */
  font-size: 0.88rem;
  line-height: 1.75;
  cursor: text;
  scrollbar-width: thin;
  scrollbar-color: rgba(0, 240, 255, 0.3) transparent;
}

.terminal-body::-webkit-scrollbar { width: 4px; }
.terminal-body::-webkit-scrollbar-thumb { background: rgba(0, 240, 255, 0.3); }

.prompt { color: var(--accent); margin-right: 6px; white-space: nowrap; }

#term-output { white-space: pre-wrap; word-break: break-word; }

#term-output .line { min-height: 1.5em; }

#term-output .line-cmd { color: var(--text); margin-top: 0.35em; }
/* 终端输出色:青/品红/薄荷绿霓虹,类名语义回归 */
#term-output .out-cyan { color: var(--accent); }
#term-output .out-pink { color: var(--accent-2); }
#term-output .out-purple { color: #8fa5b8; }
#term-output .out-gold { color: var(--accent-2); }
#term-output .out-green { color: var(--neon-green); }
#term-output .out-dim { color: var(--text-dim); }
#term-output .out-err { color: var(--alert); }

.term-input-line {
  display: flex;
  align-items: center;
  margin-top: 0.35em;
}

#term-input {
  flex: 1;
  background: transparent;
  border: none;
  outline: none;
  color: var(--text);
  font-size: inherit;
  caret-color: var(--accent);
  padding: 0;
}

/* ---------- 按钮:切角工业按键 ---------- */
.hero-btns { margin-top: 2.2rem; display: flex; gap: 1rem; flex-wrap: wrap; justify-content: center; }

.btn {
  display: inline-block;
  padding: 0.7rem 1.8rem;
  clip-path: polygon(0 0, calc(100% - 10px) 0, 100% 10px, 100% 100%, 0 100%);
  text-decoration: none;
  font-family: var(--sans);
  font-weight: 500;
  font-size: 0.88rem;
  letter-spacing: 2px;
  border: none;
  cursor: pointer;
  transition: transform 0.15s, background 0.2s, color 0.2s;
}

.btn:hover { transform: translateY(-2px); }

.btn-primary {
  background: var(--accent);
  color: #050508;
  font-weight: bold;
}

.btn-primary:hover { background: #7df6ff; }

.btn-ghost {
  background: var(--glass);
  color: var(--text);
  box-shadow: inset 0 0 0 1px var(--glass-border);
  backdrop-filter: var(--blur);
  -webkit-backdrop-filter: var(--blur);
}

.btn-ghost:hover { color: var(--accent); box-shadow: inset 0 0 0 1px rgba(0, 240, 255, 0.5); }

.btn-outline {
  background: var(--glass);
  color: var(--text-dim);
  box-shadow: inset 0 0 0 1px var(--line);
  backdrop-filter: var(--blur);
  -webkit-backdrop-filter: var(--blur);
}

.btn-outline:hover {
  color: var(--accent);
  box-shadow: inset 0 0 0 1px rgba(0, 240, 255, 0.5);
  background: rgba(0, 240, 255, 0.05);
}

/* ---------- 通用 section:每个区块占满一屏并吸附 ---------- */
.section {
  min-height: 100vh;
  display: flex;
  flex-direction: column;
  justify-content: center;
  max-width: 1080px;
  margin: 0 auto;
  padding: 6rem 5vw 2rem;
  scroll-snap-align: start;
  scroll-snap-stop: always;
}

/* 标题:左侧霓虹青短竖条 + 大写字距 */
.section-title {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.8rem;
  font-size: clamp(1.4rem, 3.5vw, 1.9rem);
  letter-spacing: 3px;
  margin-bottom: 2.8rem;
}

.section-title::before {
  content: '';
  width: 6px;
  height: 1.2em;
  background: var(--accent);
}

/* 标题右侧的色散斜纹小段:品红/青双层错位 */
.section-title::after {
  content: '';
  width: 46px;
  height: 8px;
  background-image:
    repeating-linear-gradient(-45deg, var(--accent-2) 0 5px, transparent 5px 10px),
    repeating-linear-gradient(-45deg, var(--accent) 0 5px, transparent 5px 10px);
  background-position: 2px 2px, 0 0;
  opacity: 0.8;
}

.tag {
  color: var(--text-dim);
  font-size: 0.65em;
  opacity: 0.9;
}

/* 硬边平面面板:直角 + 右上切角,霓虹描边 */
.card {
  position: relative;
  background: var(--glass);
  border: 1px solid var(--glass-border);
  clip-path: var(--notch);
  padding: 1.7rem;
  backdrop-filter: var(--blur);
  -webkit-backdrop-filter: var(--blur);
  box-shadow: var(--glass-highlight);
  transition: transform 0.25s, border-color 0.25s, background 0.25s;
}

/* 面板左上角的档案编号刻度线 */
.card::after {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  width: 28px;
  height: 3px;
  background: var(--accent);
  opacity: 0.85;
}

.card:hover {
  transform: translateY(-4px);
  border-color: rgba(0, 240, 255, 0.55);
  background: rgba(0, 240, 255, 0.05);
}

/* 滚动渐入
   动画挂在面板元素自身而非容器:祖先带 opacity/transform 会成为
   backdrop root,影响特效层的 backdrop-filter(撕裂条带/宏块)。 */
.reveal { opacity: 0; }

.reveal.visible {
  opacity: 1;
  animation: rise 0.6s ease backwards;
}

/* 同一网格内的兄弟错峰入场 */
.reveal.visible:nth-child(2) { animation-delay: 0.08s; }
.reveal.visible:nth-child(3) { animation-delay: 0.16s; }
.reveal.visible:nth-child(4) { animation-delay: 0.24s; }
.reveal.visible:nth-child(5) { animation-delay: 0.32s; }
.reveal.visible:nth-child(6) { animation-delay: 0.4s; }

@keyframes rise {
  from {
    opacity: 0;
    transform: translateY(36px);
  }
}

/* ---------- 关于 ---------- */
.about-grid {
  display: grid;
  grid-template-columns: 1.4fr 1fr;
  gap: 1.4rem;
}

/* 代码卡固定高度,内容溢出时代码块内部滚动(编辑器窗格式) */
.about-card {
  height: clamp(300px, 44vh, 400px);
  display: flex;
  padding: 1.2rem 1.4rem;
}

.code-block {
  flex: 1;
  min-height: 0;
  font-size: 0.88rem;
  overflow: auto;
  overscroll-behavior: contain;
  line-height: 1.75;
  scrollbar-width: thin;
  scrollbar-color: rgba(0, 240, 255, 0.3) transparent;
}

.code-block::-webkit-scrollbar { width: 5px; height: 5px; }
.code-block::-webkit-scrollbar-thumb { background: rgba(0, 240, 255, 0.3); }
.code-block::-webkit-scrollbar-track { background: transparent; }

.kw { color: var(--accent); }
.var { color: var(--text); }
.prop { color: #8fa5b8; }
.str { color: var(--neon-green); }
.fn { color: var(--accent-2); }

/* VSCode 风代码折叠:漏洞编号数组可展开/折叠 */
.fold-arrow {
  display: inline-block;
  width: 1.1em;
  margin-left: -1.1em; /* 悬挂到行首缩进处,像编辑器折叠槽 */
  color: var(--text-dim);
  cursor: pointer;
  user-select: none;
  transition: color 0.15s;
}

.fold-arrow::before { content: '▾'; }
.fold.folded .fold-arrow::before { content: '▸'; }
.fold-arrow:hover { color: var(--accent); }

/* 折叠时的 [⋯] 徽章 */
.fold-dots {
  display: none;
  padding: 0 0.45rem;
  margin: 0 0.1rem;
  color: var(--text-dim);
  background: rgba(255, 255, 255, 0.09);
  border-radius: 3px;
  cursor: pointer;
}

.fold.folded .fold-dots { display: inline; }
.fold.folded .fold-content { display: none; }

.stat-card {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 1.2rem;
  align-content: center;
  text-align: center;
}

.stat-num {
  display: block;
  font-size: 2rem;
  font-weight: bold;
  color: var(--accent);
  text-shadow: 0 0 14px rgba(0, 240, 255, 0.45);
}

.stat-label { font-size: 0.78rem; color: var(--text-dim); letter-spacing: 1px; }

/* ---------- 项目:左索引 + 右详情 ---------- */
.proj {
  display: grid;
  grid-template-columns: 300px 1fr;
  gap: 1.6rem;
  align-items: stretch;
}

/* 左侧项目索引 */
.proj-list {
  list-style: none;
  display: flex;
  flex-direction: column;
  gap: 0.6rem;
  max-height: clamp(420px, 62vh, 560px);
  overflow-y: auto;
  overscroll-behavior: contain; /* 滚到头不把滚动链传给页面 */
  padding-right: 4px;
}

.proj-item {
  position: relative;
  display: grid;
  grid-template-columns: auto 1fr;
  grid-template-areas: 'idx name' 'idx lang';
  column-gap: 0.8rem;
  padding: 1rem 1.1rem;
  border: 1px solid var(--line);
  background: var(--glass);
  cursor: pointer;
  clip-path: polygon(0 0, calc(100% - 10px) 0, 100% 10px, 100% 100%, 0 100%);
  transition: border-color 0.2s, background 0.2s, transform 0.15s;
}

.proj-item:hover { border-color: rgba(0, 240, 255, 0.4); transform: translateX(3px); }
.proj-item:focus-visible { outline: 1px solid var(--accent); outline-offset: 2px; }

/* 选中态:左侧霓虹青竖条 + 提亮 */
.proj-item.is-active {
  border-color: rgba(0, 240, 255, 0.55);
  background: rgba(0, 240, 255, 0.07);
}

.proj-item.is-active::before {
  content: '';
  position: absolute;
  left: 0;
  top: 0;
  bottom: 0;
  width: 3px;
  background: var(--accent);
}

.proj-idx {
  grid-area: idx;
  align-self: center;
  font-family: var(--mono);
  font-size: 1.1rem;
  color: var(--accent);
  opacity: 0.8;
}

.proj-name {
  grid-area: name;
  font-weight: 600;
  letter-spacing: 0.5px;
}

.proj-lang {
  grid-area: lang;
  font-family: var(--mono);
  font-size: 0.72rem;
  color: var(--text-dim);
  letter-spacing: 1px;
}

/* 右侧详情面板:固定高度,不随内容变化 */
.proj-detail {
  padding: 0;
  overflow: hidden;
  height: clamp(420px, 62vh, 560px);
}

.proj-panel { display: none; height: 100%; }
/* 预览区固定占比,信息区吃剩余高度 */
.proj-panel.is-active { display: grid; grid-template-rows: 46% 54%; }

/* 项目切换撕裂过渡:横带错位 + 亮度闪烁,JS 重挂 .switching 触发 */
.proj-detail.switching .proj-panel.is-active {
  animation: panel-tear 0.28s steps(1, end) both;
}

@keyframes panel-tear {
  0%   { clip-path: inset(0 0 62% 0); transform: translateX(-10px); filter: brightness(1.7) saturate(0.3); }
  25%  { clip-path: inset(34% 0 22% 0); transform: translateX(8px); filter: brightness(0.75); }
  50%  { clip-path: inset(58% 0 6% 0); transform: translateX(-5px); filter: brightness(1.4) saturate(0.2); }
  75%  { clip-path: inset(12% 0 40% 0); transform: translateX(4px); filter: none; }
  100% { clip-path: none; transform: none; filter: none; }
}

/* 预览图 */
.proj-preview {
  position: relative;
  background: #08080a;
  border-bottom: 1px solid var(--line);
  overflow: hidden;
}

.proj-preview img {
  width: 100%;
  height: 100%;
  object-fit: contain;
  display: block;
  filter: saturate(0.95);
}

/* 预览图上覆一层扫描线,与全站故障风统一 */
.proj-preview::after {
  content: '';
  position: absolute;
  inset: 0;
  background: repeating-linear-gradient(to bottom, transparent 0 2px, rgba(0, 0, 0, 0.12) 2px 4px);
  pointer-events: none;
}

/* hover 时预览图 RGB 通道短暂分离,抖两轮后落定 */
.proj-preview:hover img { animation: img-rgb-split 0.32s steps(3) 2; }

/* 无预览图时的占位:字符雪花 + 缩写字符 */
.proj-preview-noimg {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100%;
  background:
    repeating-linear-gradient(45deg, #0d1016 0 2px, transparent 2px 14px),
    var(--bg);
}

.proj-noimg-text {
  font-family: var(--mono);
  font-size: 2.6rem;
  font-weight: 700;
  letter-spacing: 0.4em;
  color: var(--line);
  text-shadow: 2px 0 var(--accent-2), -2px 0 var(--accent);
  opacity: 0.6;
  user-select: none;
}

.proj-preview:hover .proj-noimg-text { animation: img-rgb-split 0.32s steps(3) 2; }

@keyframes img-rgb-split {
  0%   { filter: saturate(0.95) drop-shadow(3px 0 rgba(255, 42, 109, 0.5)) drop-shadow(-3px 0 rgba(0, 240, 255, 0.5)); transform: translateX(1px); }
  50%  { filter: saturate(0.95) drop-shadow(-2px 0 rgba(255, 42, 109, 0.5)) drop-shadow(2px 0 rgba(0, 240, 255, 0.5)); transform: translateX(-1px); }
  100% { filter: saturate(0.95); transform: none; }
}

/* 信息区:固定高度内部三段式,head/actions 固定,body 可截断 */
.proj-info {
  padding: 1.3rem 1.7rem 1.4rem;
  display: flex;
  flex-direction: column;
  min-height: 0;
}

.proj-head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 1rem;
  margin-bottom: 0.8rem;
  flex-shrink: 0;
}

/* 内容主体:超出固定高度即截断,底部渐隐提示还有更多 */
.proj-body {
  position: relative;
  flex: 1;
  min-height: 0;
  overflow: hidden;
  -webkit-mask-image: linear-gradient(to bottom, #000 72%, transparent);
  mask-image: linear-gradient(to bottom, #000 72%, transparent);
}

.proj-actions {
  display: flex;
  gap: 0.8rem;
  margin-top: 1rem;
  flex-shrink: 0;
}

.proj-actions .btn { font-size: 0.8rem; padding: 0.5rem 1.3rem; }

.proj-head h3 {
  font-family: var(--mono);
  font-size: 1.15rem;
  letter-spacing: 0.5px;
  color: var(--text);
}

.proj-star {
  font-family: var(--mono);
  font-size: 0.85rem;
  color: var(--accent);
  white-space: nowrap;
}

.proj-star.star-fail { color: var(--alert); }

.proj-desc {
  font-size: 0.92rem;
  color: var(--text);
  line-height: 1.7;
  margin-bottom: 1rem;
}

/* 特性/更新条目:README 原文,霓虹青短横引导 */
.proj-features {
  list-style: none;
  margin-bottom: 1.2rem;
}

.proj-features li {
  position: relative;
  padding-left: 1.1rem;
  font-size: 0.84rem;
  color: var(--text-dim);
  line-height: 1.7;
  margin-bottom: 0.3rem;
}

.proj-features li::before {
  content: '-';
  position: absolute;
  left: 0;
  color: var(--accent);
}

.proj-tags { display: flex; flex-wrap: wrap; gap: 0.5rem; }

.proj-tags span {
  font-family: var(--mono);
  font-size: 0.7rem;
  letter-spacing: 0.5px;
  padding: 0.2rem 0.7rem;
  border: 1px solid var(--line);
  background: rgba(255, 255, 255, 0.03);
  color: var(--text-dim);
}

/* 项目完整介绍悬浮窗 */
.proj-modal {
  position: fixed;
  inset: 0;
  z-index: 210;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 5vh 5vw;
  background: rgba(4, 5, 9, 0.8);
}

.proj-modal.hidden { display: none; }

.proj-modal-inner {
  width: min(680px, 100%);
  max-height: 88vh;
  display: flex;
  flex-direction: column;
  background: var(--glass-strong);
  backdrop-filter: var(--blur);
  -webkit-backdrop-filter: var(--blur);
  border: 1px solid rgba(0, 240, 255, 0.4);
  clip-path: var(--notch);
  animation: crt-on 0.34s cubic-bezier(0.22, 1, 0.36, 1);
}

.proj-modal-bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0.8rem 1.3rem;
  border-bottom: 1px solid var(--line);
  background: rgba(255, 255, 255, 0.035);
  flex-shrink: 0;
}

.proj-modal-title {
  font-family: var(--mono);
  font-size: 0.72rem;
  letter-spacing: 2px;
  color: var(--accent);
}

.proj-modal-close {
  background: none;
  border: none;
  color: var(--text-dim);
  font-size: 1.5rem;
  line-height: 1;
  cursor: pointer;
  transition: color 0.2s;
}

.proj-modal-close:hover { color: var(--accent); }

.proj-modal-body {
  padding: 1.6rem 1.8rem;
  overflow-y: auto;
  overscroll-behavior: contain;
  scrollbar-width: thin;
  scrollbar-color: rgba(0, 240, 255, 0.3) transparent;
}

.proj-modal-body::-webkit-scrollbar { width: 5px; }
.proj-modal-body::-webkit-scrollbar-thumb { background: rgba(0, 240, 255, 0.3); }

/* 悬浮窗内的内容用完整展开样式(克隆自面板,去掉截断) */
.proj-modal-body .proj-head { margin-bottom: 1.1rem; }
.proj-modal-body .proj-body {
  overflow: visible;
  -webkit-mask-image: none;
  mask-image: none;
}
.proj-modal-body .proj-actions { display: none; }
.proj-modal-body .proj-tags { margin-top: 1.2rem; }

/* ---------- 联系 ---------- */
.contact-box { text-align: center; }

.contact-line { font-size: 1.02rem; margin-bottom: 1.4rem; }

.contact-links { display: flex; justify-content: center; gap: 1rem; flex-wrap: wrap; }


/* ---------- 页脚(位于联系页底部) ---------- */
#contact .section-title { margin-top: auto; }

.footer {
  width: 100%;
  margin-top: auto;
  text-align: center;
  padding: 2rem 5vw 1.6rem;
  color: var(--text-dim);
  font-size: 0.82rem;
  border-top: 1px solid var(--line);
  position: relative;
}

/* 页脚顶部的色散斜纹条:品红/青双层错位 */
.footer::before {
  content: '';
  position: absolute;
  top: -1px;
  left: 50%;
  transform: translateX(-50%);
  width: 180px;
  height: 5px;
  background-image:
    repeating-linear-gradient(-45deg, var(--accent-2) 0 6px, transparent 6px 12px),
    repeating-linear-gradient(-45deg, var(--accent) 0 6px, transparent 6px 12px);
  background-position: 2px 1px, 0 0;
  opacity: 0.8;
}

.footer-code { margin-top: 0.4rem; color: var(--text-dim); opacity: 0.7; }

/* ---------- 兴趣:游戏卡片 ---------- */
.hobby-label {
  margin-bottom: 1.2rem;
  font-size: 0.92rem;
  font-weight: 600;
  letter-spacing: 0.2em;
  color: var(--text-dim);
}

.game-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 1.1rem;
}

.game-card {
  display: flex;
  align-items: center;
  gap: 1.15rem;
  padding: 1.15rem 1.35rem;
}

.game-icon {
  width: 64px;
  height: 64px;
  flex: none;
  object-fit: cover;
  clip-path: var(--notch);
  border: 1px solid rgba(0, 240, 255, 0.35);
}

.game-name { font-size: 1.02rem; font-weight: 600; letter-spacing: 0.04em; }

.game-en {
  margin-top: 0.15rem;
  font-size: 0.7rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--text-dim);
}

.game-meta {
  display: flex;
  flex-wrap: wrap;
  gap: 0.25rem 1.4rem;
  margin-top: 0.55rem;
  font-size: 0.76rem;
  letter-spacing: 0.06em;
  color: var(--text-dim);
}

.game-val { color: var(--accent); }

/* 未录入的 server / uid:暗色虚位,等 data.js 填上后自动点亮 */
.game-val.is-empty { color: var(--text-dim); opacity: 0.55; letter-spacing: 0.18em; }

/* ---------- 全屏故障艺术特效 ----------
   常驻:CRT 扫描线 / 电视噪点 / 慢速扫光
   爆发:html.glitching 期间 RGB 色散 + 撕裂条带 + 页面抖动(JS 随机触发) */
#glitch-fx {
  position: fixed;
  inset: 0;
  z-index: 999; /* 最顶层,悬浮窗也在其下;pointer-events:none 不挡交互 */
  pointer-events: none;
  overflow: hidden;
}

/* CRT 扫描线 */
.gfx-scanlines {
  position: absolute;
  inset: 0;
  background: repeating-linear-gradient(
    to bottom,
    transparent 0 2px,
    rgba(0, 0, 0, 0.16) 2px 4px
  );
  opacity: 0.55;
}

/* 缓慢下移的扫光带 */
.gfx-scanbeam {
  position: absolute;
  left: 0;
  right: 0;
  height: 140px;
  background: linear-gradient(
    to bottom,
    transparent,
    rgba(0, 240, 255, 0.03) 45%,
    rgba(255, 255, 255, 0.05) 50%,
    rgba(0, 240, 255, 0.03) 55%,
    transparent
  );
  animation: beam-sweep 8s linear infinite;
}

@keyframes beam-sweep {
  from { top: -20%; }
  to   { top: 110%; }
}

/* 电视噪点(纹理由 JS 生成) */
.gfx-noise {
  position: absolute;
  inset: -50%;
  background-repeat: repeat;
  opacity: 0.05;
  animation: noise-jiggle 0.4s steps(4) infinite;
}

@keyframes noise-jiggle {
  0%   { transform: translate(0, 0); }
  25%  { transform: translate(-18%, 6%); }
  50%  { transform: translate(9%, -12%); }
  75%  { transform: translate(-6%, 14%); }
  100% { transform: translate(12%, 3%); }
}

/* RGB 色散层:平时隐藏,爆发时闪烁 */
.gfx-rgb {
  position: absolute;
  inset: 0;
  opacity: 0;
  mix-blend-mode: screen;
}

.gfx-rgb-r { background: rgba(255, 42, 109, 0.12); }
.gfx-rgb-c { background: rgba(0, 240, 255, 0.12); }

html.glitching .gfx-rgb-r { animation: rgb-split-r 0.5s steps(5) both; }
html.glitching .gfx-rgb-c { animation: rgb-split-c 0.5s steps(5) both; }

@keyframes rgb-split-r {
  0%   { opacity: 1; transform: translateX(7px); }
  50%  { opacity: 0.5; transform: translateX(-4px); }
  100% { opacity: 0; transform: none; }
}

@keyframes rgb-split-c {
  0%   { opacity: 1; transform: translateX(-7px); }
  50%  { opacity: 0.5; transform: translateX(5px); }
  100% { opacity: 0; transform: none; }
}

/* 撕裂条带:单色页面上 hue-rotate 不明显,改用反相 + 提对比 */
.gfx-band {
  position: absolute;
  left: 0;
  right: 0;
  opacity: 0;
}

html.glitching .gfx-band {
  opacity: 1;
  backdrop-filter: invert(0.85) contrast(1.3);
  -webkit-backdrop-filter: invert(0.85) contrast(1.3);
  animation: band-tear 0.5s steps(4) both;
}

@keyframes band-tear {
  0%   { transform: translateX(var(--shift, 8px)); }
  60%  { transform: translateX(calc(var(--shift, 8px) * -0.6)); }
  100% { transform: none; opacity: 0; }
}

/* 爆发时页面内容抖动(短促 keyframe,播完即恢复) */
html.glitching .hero,
html.glitching main,
html.glitching .footer {
  animation: page-jitter 0.5s steps(5) both;
}

@keyframes page-jitter {
  0%   { transform: translate(3px, 0) skewX(0.5deg); }
  33%  { transform: translate(-4px, 2px); }
  66%  { transform: translate(2px, -1px) skewX(-0.7deg); }
  100% { transform: none; }
}

/* 导航现在是全宽贴顶,普通抖动即可 */
html.glitching .navbar {
  animation: nav-jitter 0.5s steps(4) both;
}

@keyframes nav-jitter {
  0%   { transform: translateX(4px); }
  50%  { transform: translateX(-3px); }
  100% { transform: none; }
}

/* ===== 花屏变体 2:信号失同步(垂直滚屏 + 雪花涌动 + 去色过曝 + 同步条) ===== */

/* 满屏雪花在变体2期间涌动到高浓度 */
html.glitching-2 .gfx-noise {
  opacity: 0.4;
  animation: noise-jiggle 0.12s steps(4) infinite;
}

/* 内容垂直失同步滚动 + 去色过曝闪白 */
html.glitching-2 .hero,
html.glitching-2 main,
html.glitching-2 .footer {
  animation: sync-loss 0.65s steps(6) both;
}

@keyframes sync-loss {
  0%   { transform: translateY(-14px); filter: brightness(1.6) saturate(0.1) contrast(1.2); }
  40%  { transform: translateY(10px);  filter: brightness(0.7) saturate(1.8); }
  70%  { transform: translateY(-5px);  filter: brightness(1.3) saturate(0); }
  100% { transform: none; filter: none; }
}

html.glitching-2 .navbar {
  animation: sync-loss-nav 0.65s steps(5) both;
}

@keyframes sync-loss-nav {
  0%   { transform: translateY(-8px); filter: brightness(1.6) saturate(0); }
  50%  { transform: translateY(6px); }
  100% { transform: none; filter: none; }
}

/* 快速下扫的亮同步条(仅变体2显形) */
.gfx-rollbar {
  position: absolute;
  left: 0;
  right: 0;
  height: 26px;
  top: -30px;
  background: linear-gradient(
    to bottom,
    transparent,
    rgba(255, 255, 255, 0.5) 45%,
    rgba(0, 240, 255, 0.35) 55%,
    transparent
  );
  opacity: 0;
  mix-blend-mode: screen;
}

html.glitching-2 .gfx-rollbar {
  animation: rollbar-sweep 0.65s steps(10) both;
}

@keyframes rollbar-sweep {
  0%   { opacity: 0.9; top: -6%; }
  100% { opacity: 0.7; top: 104%; }
}

/* ===== 花屏变体 3:数据块崩坏(corrupted data blocks) =====
   随机迸出的实心纯色小块:硬边、高饱和、无纹理,约半数横向分成
   2~3 段纯色——复刻图像数据段损坏时解码出的 flat color 伪影
   (颜色与分段由 JS 每次爆发随机生成) */
.gfx-block {
  position: absolute;
  opacity: 0;
}

html.glitching-3 .gfx-block {
  animation: block-corrupt 0.28s steps(3) both;
}

@keyframes block-corrupt {
  0%   { transform: translateX(var(--bx, 6px)); opacity: 0.72; }
  40%  { transform: translateX(calc(var(--bx, 6px) * -0.7)) translateY(2px); opacity: 0.6; }
  70%  { transform: translateX(calc(var(--bx, 6px) * 0.4)); opacity: 0.5; }
  100% { transform: none; opacity: 0; }
}

/* ===== 数据块里的"她"(ghostGlimpse) =====
   崩坏块从同一张虚拟贴图对位采样,碎片能拼出人影局部——像屏幕后面有人。
   html.ghosting 短闪残影;html.ghosting-gaze 凝视:碎片更密、停留更久。
   只出碎片,不动全屏(不加暗角/压暗/噪点涌动,避免整页亮度跳变) */
.gfx-ghost {
  position: absolute;
  inset: 0;
}

/* 人影碎片:内容由 JS 对位采样,这里只管质感——宏块边缘的品红/青色散镶边 */
.gfx-shard {
  position: absolute;
  opacity: 0;
  background-repeat: no-repeat;
  box-shadow:
    2px 0 0 rgba(255, 42, 109, 0.22),
    -2px 0 0 rgba(0, 240, 255, 0.22),
    inset 0 0 0 1px rgba(0, 240, 255, 0.1);
  filter: saturate(0.78) contrast(1.08) brightness(1.04);
}

/* 混在人影里的坏块:反相冷调,和宏块崩坏同一质感 */
.gfx-shard.shard-broken {
  filter: invert(0.85) hue-rotate(150deg) saturate(0.6) contrast(1.2);
}

html.ghosting .gfx-shard { animation: shard-glimpse 0.65s steps(5) both; }
html.ghosting-gaze .gfx-shard { animation: shard-gaze 2.2s steps(16) both; }

/* 惊鸿一瞥:闪两下就散 */
@keyframes shard-glimpse {
  0%   { opacity: 0.95; transform: translateX(var(--gx, 4px)); }
  55%  { opacity: 0.6; transform: translateX(calc(var(--gx, 4px) * -0.6)); }
  100% { opacity: 0; transform: none; }
}

/* 凝视:闪烁着显形,停住,再碎开 */
@keyframes shard-gaze {
  0%   { opacity: 0; transform: translateX(var(--gx, 4px)); }
  8%   { opacity: 1; transform: translateX(calc(var(--gx, 4px) * -0.5)); }
  16%  { opacity: 0.5; }
  26%  { opacity: 1; transform: translateX(var(--gx, 4px)); }
  72%  { opacity: 0.92; transform: none; }
  86%  { opacity: 0.4; transform: translateX(calc(var(--gx, 4px) * 0.8)); }
  100% { opacity: 0; transform: none; }
}


/* ---------- 调试面板(config.json 顶层 "debug": true 或 URL ?debug) ---------- */
#fx-debug {
  position: fixed;
  right: 16px;
  bottom: 16px;
  z-index: 1200; /* 盖过特效层,保证按钮可点 */
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 6px;
  width: 220px;
  padding: 10px 12px;
  background: rgba(6, 8, 14, 0.92);
  border: 1px solid rgba(0, 240, 255, 0.4);
  clip-path: var(--notch);
}

.fxdbg-head {
  grid-column: 1 / -1;
  margin-bottom: 2px;
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.25em;
  color: var(--accent);
}

.fxdbg-btn {
  padding: 6px 4px;
  font-size: 12px;
  letter-spacing: 0.08em;
  color: var(--text-dim);
  background: rgba(0, 240, 255, 0.07);
  border: 1px solid rgba(0, 240, 255, 0.25);
  cursor: pointer;
  transition: background 0.15s, color 0.15s, border-color 0.15s;
}

.fxdbg-btn:hover {
  color: var(--accent);
  background: rgba(0, 240, 255, 0.18);
  border-color: var(--accent);
}

/* ---------- 彩蛋 ---------- */
.easter-egg {
  position: fixed;
  inset: 0;
  z-index: 200;
  background: rgba(4, 5, 9, 0.78);
  display: flex;
  align-items: center;
  justify-content: center;
}

.easter-egg.hidden { display: none; }

.easter-inner {
  background: var(--glass-strong);
  backdrop-filter: var(--blur);
  -webkit-backdrop-filter: var(--blur);
  border: 1px solid rgba(0, 240, 255, 0.5);
  clip-path: var(--notch);
  padding: 2.4rem 3rem;
  text-align: center;
  animation: crt-on 0.34s cubic-bezier(0.22, 1, 0.36, 1);
}

/* pop 保留给 fx-off-crt-modal 时回退用 */
@keyframes pop { from { transform: scale(0.6); opacity: 0; } }

/* CRT 开机:先压成一条水平亮线再纵向展开 */
@keyframes crt-on {
  0%   { transform: scaleY(0.006) scaleX(0.65); filter: brightness(4); }
  45%  { transform: scaleY(0.012) scaleX(1.02); filter: brightness(2.8); }
  100% { transform: none; filter: none; }
}

/* CRT 关机:关闭时压回一条亮线、过曝、熄灭;由 JS 挂 .closing 播完再真正隐藏 */
.proj-modal.closing .proj-modal-inner,
.easter-egg.closing .easter-inner {
  animation: crt-off 0.26s cubic-bezier(0.6, 0, 0.85, 1) both;
}

/* 遮罩在亮线熄灭后跟着淡出,期间不再响应点击 */
.proj-modal.closing,
.easter-egg.closing {
  pointer-events: none;
  animation: overlay-out 0.3s linear both;
}

@keyframes crt-off {
  0%   { transform: none; filter: none; opacity: 1; }
  55%  { transform: scaleY(0.012) scaleX(1.02); filter: brightness(2.8); opacity: 1; }
  80%  { transform: scaleY(0.006) scaleX(0.55); filter: brightness(4); opacity: 1; }
  100% { transform: scaleY(0.004) scaleX(0.02); filter: brightness(5); opacity: 0; }
}

@keyframes overlay-out {
  0%   { opacity: 1; }
  70%  { opacity: 1; }
  100% { opacity: 0; }
}

.easter-face { font-size: 1.6rem; color: var(--accent); margin-bottom: 1rem; }

.easter-inner button { margin-top: 1.4rem; }

/* ---------- 切台过渡:雪花噪点遮罩 + OSD 频道标签 ----------
   翻页硬切的瞬间由 JS 点亮 #channel-cut 约 200ms,底下完成切换;
   放在扫描线层(z-index 999)之下,雪花看起来仍"在显示器里" */
#channel-cut {
  position: fixed;
  inset: 0;
  z-index: 998;
  pointer-events: none;
  display: none;
  overflow: hidden;
  background: #050508;
}

#channel-cut.on { display: block; }

/* 纹理由 JS 复用电视噪点 canvas 注入 */
.cut-noise {
  position: absolute;
  inset: -50%;
  background-repeat: repeat;
  opacity: 0.55;
  animation: noise-jiggle 0.1s steps(3) infinite;
}

/* 横向撕裂条:品红/青错位扫过雪花,位置每次由 JS 随机 */
.cut-tear {
  position: absolute;
  left: -5%;
  right: -5%;
  height: 14px;
  background: linear-gradient(90deg, rgba(255, 42, 109, 0.55), rgba(0, 240, 255, 0.55));
  mix-blend-mode: screen;
  animation: cut-tear-shift 0.08s steps(2) infinite;
}

@keyframes cut-tear-shift {
  0%   { transform: translateX(-16px) scaleY(1); }
  50%  { transform: translateX(12px) scaleY(2.2); }
  100% { transform: translateX(-6px) scaleY(0.8); }
}

#channel-osd {
  position: fixed;
  top: 86px;
  right: 5vw;
  z-index: 998;
  pointer-events: none;
  font-family: var(--mono);
  font-size: 0.78rem;
  letter-spacing: 0.14em;
  color: var(--accent);
  background: rgba(5, 5, 8, 0.75);
  border: 1px solid rgba(0, 240, 255, 0.4);
  padding: 0.3rem 0.7rem;
  opacity: 0;
  transition: opacity 0.25s;
}

/* 锁台后 OSD 闪两下再常亮,由 JS 定时移除类后淡出 */
#channel-osd.on { animation: osd-blink 0.5s steps(1, end) both; opacity: 1; }

@keyframes osd-blink {
  0%   { opacity: 1; }
  20%  { opacity: 0; }
  35%  { opacity: 1; }
  55%  { opacity: 0; }
  70%  { opacity: 1; }
}

/* ---------- 自定义右键菜单:监控站控制面板 ---------- */
#ctx-menu {
  position: fixed;
  z-index: 500; /* 弹窗(200/210)之上,装饰性故障层(999,不挡交互)之下 */
  min-width: 200px;
  padding: 6px;
  background: var(--glass-strong);
  border: 1px solid var(--glass-border);
  clip-path: var(--notch);
  font-family: var(--mono);
  box-shadow: 0 10px 34px rgba(0, 0, 0, 0.65), 0 0 18px rgba(0, 240, 255, 0.07);
  transform-origin: top left;
  user-select: none;
}

#ctx-menu.hidden { display: none; }

/* CRT 竖向展开入场,steps 制造硬切帧感 */
#ctx-menu.opening { animation: ctx-in 0.16s steps(3, end); }

@keyframes ctx-in {
  0%   { transform: scaleY(0.35); filter: brightness(2.2); }
  60%  { transform: scaleY(1.04); }
  100% { transform: none; filter: none; }
}

.ctx-head {
  padding: 6px 10px 7px;
  font-size: 0.6rem;
  letter-spacing: 2px;
  color: var(--text-dim);
}

.ctx-item {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1.6rem;
  width: 100%;
  padding: 7px 10px;
  border: 0;
  background: none;
  color: var(--text);
  font: inherit;
  font-size: 0.8rem;
  text-align: left;
}

.ctx-item:hover {
  background: rgba(255, 42, 109, 0.14);
  box-shadow: inset 2px 0 0 var(--accent-2);
  color: #fff;
}

.ctx-item.is-disabled { opacity: 0.35; pointer-events: none; }

.ctx-hint {
  font-size: 0.6rem;
  letter-spacing: 1px;
  color: var(--text-dim);
}

.ctx-item:hover .ctx-hint { color: var(--accent); }

.ctx-sep {
  height: 1px;
  margin: 5px 8px;
  background: var(--line);
}

/* ---------- config.json 特效开关 ----------
   JS 读取 config.json,把关闭项映射为 <html> 上的 fx-off-* 类,
   纯 CSS 特效由以下规则关断;JS 型特效在各自触发点检查开关 */
html.fx-off-scanlines .gfx-scanlines,
html.fx-off-noise .gfx-noise,
html.fx-off-scanbeam .gfx-scanbeam,
html.fx-off-dust #dust-canvas,
html.fx-off-syslog #syslog,
html.fx-off-rec-badge #rec-osd { display: none; }

html.fx-off-glitch-title .glitch::before,
html.fx-off-glitch-title .glitch::after { content: none; }
html.fx-off-glitch-title .hero-title,
html.fx-off-glitch-title .nav-logo { text-shadow: none; }

html.fx-off-preview-rgb-split .proj-preview:hover img { animation: none; }
html.fx-off-proj-switch-glitch .proj-detail.switching .proj-panel.is-active { animation: none; }

html.fx-off-crt-modal .proj-modal-inner,
html.fx-off-crt-modal .easter-inner {
  animation: pop 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
}

/* ---------- 响应式 ---------- */
@media (max-width: 760px) {
  .nav-links {
    position: absolute;
    top: 100%;
    right: 0;
    flex-direction: column;
    gap: 0;
    background: rgba(4, 6, 10, 0.94);
    border: 1px solid var(--line);
    width: 200px;
    max-height: 0;
    overflow: hidden;
    transition: max-height 0.3s ease;
  }

  .nav-links.open { max-height: 320px; }

  .nav-links li { padding: 0.55rem 1rem; }

  .nav-toggle { display: block; }

  .about-grid { grid-template-columns: 1fr; }

  /* 项目版块:上下堆叠 */
  .proj { grid-template-columns: 1fr; gap: 1rem; }
  .proj-list { flex-direction: row; overflow-x: auto; gap: 0.5rem; }
  .proj-item { flex: 0 0 auto; min-width: 160px; }

  .terminal-body { height: 280px; }

  .game-grid { grid-template-columns: 1fr; }

  /* 小屏内容可能超过一屏,翻页吸附易卡顿,退回自由滚动 */
  html { scroll-snap-type: none; }

  body::after,
  #syslog { display: none; }

  /* REC 标识保留但收小,避免压到内容 */
  #rec-osd { left: 14px; top: 64px; font-size: 16px; }
}

@media (prefers-reduced-motion: reduce) {
  #ctx-menu.opening { animation: none; }
  *, *::before, *::after { animation-duration: 0.01ms !important; transition-duration: 0.01ms !important; }
}
