// ==UserScript== // @name Steam Social Center // @namespace https://github.com/SmallRob/steam-userscripts // @version 2.3.0 // @description 社交中心界面。对照宿主 steam-activity-modern 4.13.0。深度大盘右侧自上而下为热门游戏、好友数排行、热力图贴底,内容撑满视口。游戏比对三栏铺满到底,头部图标撑满图标章。样式前缀 .ssc-,不改主脚本 .sf- 样式。 // @author SmallFork & SmallRob // @license MIT // ==/UserScript== /** * window.SteamSocialCenter.init(host) → boolean * 四个页:深度大盘(默认)、好友数据、好友排行、游戏比对。 * 打开时只读 steam_social_db,不自动跑等级和游戏库索引。 */ (function (root) { 'use strict'; const VERSION = '2.3.0'; const API_VERSION = 1; const ROW = 72; const REDUCED = typeof root.matchMedia === 'function' && root.matchMedia('(prefers-reduced-motion: reduce)').matches; const DONUT_COLORS = ['#22d3ee', '#3b82f6', '#a78bfa', '#34d399', '#fbbf24', '#fb7185', '#f472b6', '#60a5fa']; const OTHER_COLOR = '#475569'; const I = { chart: '', users: '', user: '', venn: '', activity: '', gamepad: '', clock: '', shield: '', trophy: '', flame: '', pie: '', lock: '', }; const CSS = ` #ssc-root{position:fixed;inset:0;z-index:100000;display:flex;flex-direction:column;background:#0b0f16;color:#dbe4ee;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"PingFang SC","Microsoft YaHei",sans-serif;opacity:0;visibility:hidden;transition:opacity .25s ease} #ssc-root.ssc-open{opacity:1;visibility:visible} #ssc-root::before,#ssc-root::after{content:"";position:fixed;border-radius:50%;filter:blur(90px);pointer-events:none;z-index:0} #ssc-root::before{width:560px;height:560px;left:-180px;top:-200px;background:radial-gradient(circle,rgba(34,211,238,.14),transparent 65%);animation:ssc-drift 26s ease-in-out infinite alternate} #ssc-root::after{width:680px;height:680px;right:-220px;bottom:-260px;background:radial-gradient(circle,rgba(59,130,246,.12),transparent 65%);animation:ssc-drift 32s ease-in-out infinite alternate-reverse} @keyframes ssc-drift{from{transform:translate3d(0,0,0) scale(1)}to{transform:translate3d(70px,44px,0) scale(1.18)}} #ssc-root>*{position:relative;z-index:1} #ssc-root>.ssc-boot{position:absolute;z-index:10} /* ---- 顶栏 ---- */ .ssc-top{display:flex;align-items:center;gap:14px;padding:0 22px;height:58px;background:rgba(12,17,26,.85);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border-bottom:1px solid rgba(148,163,184,.12);flex-shrink:0} .ssc-brand{display:flex;align-items:center;gap:10px;font-size:15px;font-weight:800;color:#fff;letter-spacing:.5px;white-space:nowrap} .ssc-brand-ico{width:30px;height:30px;border-radius:9px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#22d3ee,#3b82f6);box-shadow:0 0 18px rgba(34,211,238,.35);flex-shrink:0} .ssc-brand-ico svg{width:16px;height:16px;stroke:#fff;stroke-width:2;fill:none;stroke-linecap:round;stroke-linejoin:round} .ssc-tabs{display:flex;gap:4px;flex:1;min-width:0;overflow-x:auto;scrollbar-width:none} .ssc-tabs::-webkit-scrollbar{display:none} .ssc-tab{border:none;background:transparent;color:#93a4ba;border-radius:9px;padding:8px 14px;font-size:13px;font-weight:600;cursor:pointer;transition:all .18s ease;white-space:nowrap;flex-shrink:0} .ssc-tab:hover{color:#e2e8f0;background:rgba(148,163,184,.09)} .ssc-tab.ssc-on{color:#fff;background:linear-gradient(135deg,rgba(34,211,238,.22),rgba(59,130,246,.22));box-shadow:inset 0 0 0 1px rgba(34,211,238,.35),0 0 16px rgba(34,211,238,.12)} .ssc-x{width:34px;height:34px;border-radius:9px;border:1px solid rgba(148,163,184,.18);background:rgba(148,163,184,.08);color:#e2e8f0;cursor:pointer;font-size:16px;line-height:1;flex-shrink:0;transition:all .18s ease} .ssc-x:hover{background:rgba(244,63,94,.22);border-color:rgba(244,63,94,.4);color:#fff} /* ---- 页面容器 ---- */ .ssc-body{flex:1;min-height:0;display:flex;flex-direction:column;padding:16px 22px 10px} .ssc-page{flex:1;min-height:0;display:none;flex-direction:column;gap:14px} .ssc-page.ssc-on{display:flex} .ssc-scroll{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;scrollbar-width:thin;scrollbar-color:rgba(34,211,238,.3) transparent;padding:2px 6px 6px 2px} .ssc-scroll::-webkit-scrollbar{width:6px} .ssc-scroll::-webkit-scrollbar-thumb{background:rgba(34,211,238,.28);border-radius:3px} .ssc-scroll::-webkit-scrollbar-track{background:transparent} /* ---- 大盘:铺满可视高度。右侧自上而下:热门游戏 / 好友数 / 热力图贴底 ---- */ .ssc-page[data-page=dash] .ssc-scroll{display:flex;flex-direction:column} .ssc-dash-inner{flex:1 0 auto;width:100%;min-height:100%;margin:0;display:flex;flex-direction:column;gap:14px;box-sizing:border-box} .ssc-dash-stage{flex:1 1 auto;display:grid;grid-template-columns:minmax(0,1.22fr) minmax(380px,.86fr);gap:14px;align-items:stretch;min-height:0} .ssc-dash-main,.ssc-dash-side{display:flex;flex-direction:column;gap:14px;min-width:0;min-height:100%} .ssc-dash-main>.ssc-card{flex:1 1 auto;min-height:0} .ssc-dash-side>.ssc-card[data-card=hot]{flex:0 0 auto} .ssc-dash-side>.ssc-card[data-card=fcount]{flex:1 1 auto;min-height:0} .ssc-dash-side>.ssc-card[data-card=heat]{flex:0 0 auto;margin-top:auto} .ssc-side-card{display:flex;flex-direction:column;min-height:0} .ssc-side-body{flex:1;min-height:0;display:flex;flex-direction:column} .ssc-page[data-page=dash] .ssc-tools{background:linear-gradient(160deg,rgba(148,163,184,.07),rgba(148,163,184,.02));border:1px solid rgba(148,163,184,.12);border-radius:12px;padding:10px 14px} /* ---- 通用卡片 / 工具 ---- */ .ssc-card{position:relative;background:linear-gradient(160deg,rgba(148,163,184,.07),rgba(148,163,184,.02));border:1px solid rgba(148,163,184,.12);border-radius:14px;padding:14px 16px;min-width:0;overflow:hidden} .ssc-card-hd{display:flex;align-items:center;gap:8px;margin-bottom:12px} .ssc-card-hd svg{width:15px;height:15px;stroke:#22d3ee;stroke-width:2;fill:none;stroke-linecap:round;stroke-linejoin:round;flex-shrink:0} .ssc-card-hd b{font-size:13.5px;font-weight:700;color:#f1f5f9;white-space:nowrap} .ssc-card-hd .ssc-sub{margin-left:auto;font-size:11px;color:#7d8aa0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .ssc-tools{display:flex;gap:8px;align-items:center;flex-wrap:wrap;flex-shrink:0} .ssc-tools input,.ssc-tools select,.ssc-field input,.ssc-field select{background:#131b27;color:#e2e8f0;border:1px solid rgba(148,163,184,.22);border-radius:9px;padding:7px 10px;font-size:13px;outline:none;transition:border-color .18s ease} .ssc-tools input:focus,.ssc-field input:focus{border-color:rgba(34,211,238,.55)} .ssc-tools input{min-width:220px;flex:1} .ssc-btn{border:none;border-radius:9px;padding:7px 13px;font-size:12px;font-weight:700;cursor:pointer;color:#e2e8f0;background:rgba(148,163,184,.1);border:1px solid rgba(148,163,184,.16);transition:all .18s ease} .ssc-btn:hover{background:rgba(148,163,184,.18)} .ssc-btn.ssc-primary{background:linear-gradient(135deg,#22d3ee,#3b82f6);color:#fff;border-color:transparent;box-shadow:0 4px 14px rgba(34,211,238,.28)} .ssc-btn.ssc-primary:hover{filter:brightness(1.12)} .ssc-btn:disabled{opacity:.45;cursor:default} .ssc-note{font-size:12px;color:#8fa1b8} .ssc-banner{background:rgba(245,158,11,.1);border:1px solid rgba(245,158,11,.32);color:#fbbf24;border-radius:10px;padding:9px 12px;font-size:12px;flex-shrink:0} .ssc-empty{margin:6px 0;text-align:center;color:#7d8aa0;padding:26px 14px;font-size:12.5px;line-height:1.7;border:1px dashed rgba(148,163,184,.16);border-radius:12px} /* ---- 入场动画 ---- */ .ssc-anim{animation:ssc-up .55s cubic-bezier(.22,1,.36,1) backwards} @keyframes ssc-up{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}} /* ---- 启动加载动画 ---- */ .ssc-boot{position:absolute;inset:0;z-index:10;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:24px;background:radial-gradient(ellipse at center,rgba(14,20,32,.98),rgba(8,11,17,.995));transition:opacity .5s ease,visibility .5s} .ssc-boot.ssc-boot-hide{opacity:0;visibility:hidden} .ssc-boot-orbit{position:relative;width:112px;height:112px} .ssc-boot-orbit i{position:absolute;inset:0;border-radius:50%;border:2px solid transparent} .ssc-boot-orbit i:nth-child(1){border-top-color:#22d3ee;border-right-color:rgba(34,211,238,.22);animation:ssc-rot 1.1s linear infinite} .ssc-boot-orbit i:nth-child(2){inset:13px;border-bottom-color:#3b82f6;border-left-color:rgba(59,130,246,.22);animation:ssc-rot 1.6s linear infinite reverse} .ssc-boot-orbit i:nth-child(3){inset:26px;border-top-color:#a78bfa;border-bottom-color:rgba(167,139,250,.25);animation:ssc-rot .9s linear infinite} @keyframes ssc-rot{to{transform:rotate(360deg)}} .ssc-boot-core{position:absolute;inset:40px;border-radius:50%;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#22d3ee,#3b82f6);box-shadow:0 0 26px rgba(34,211,238,.55);animation:ssc-pulse 1.6s ease-in-out infinite} .ssc-boot-core svg{width:20px;height:20px;stroke:#fff;stroke-width:2;fill:none;stroke-linecap:round} @keyframes ssc-pulse{0%,100%{transform:scale(.84);opacity:.7}50%{transform:scale(1);opacity:1}} .ssc-boot-text{font-size:15px;font-weight:800;letter-spacing:8px;text-indent:8px;color:#e2e8f0;animation:ssc-glow 1.6s ease-in-out infinite} @keyframes ssc-glow{0%,100%{opacity:.5;text-shadow:none}50%{opacity:1;text-shadow:0 0 20px rgba(34,211,238,.6)}} .ssc-boot-bar{width:220px;height:3px;border-radius:2px;background:rgba(148,163,184,.12);overflow:hidden} .ssc-boot-bar i{display:block;height:100%;width:40%;border-radius:2px;background:linear-gradient(90deg,transparent,#22d3ee,#3b82f6,transparent);animation:ssc-scan 1.15s ease-in-out infinite} @keyframes ssc-scan{0%{transform:translateX(-110%)}100%{transform:translateX(320%)}} /* ---- Hero 汇总 ---- */ .ssc-hero{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:14px} .ssc-hero-card{display:flex;align-items:center;gap:13px;padding:16px 17px;transition:transform .18s ease,border-color .18s ease,box-shadow .18s ease} .ssc-hero-card:hover{transform:translateY(-2px);border-color:rgba(34,211,238,.3);box-shadow:0 8px 24px rgba(0,0,0,.28)} .ssc-hero-card::after{content:"";position:absolute;right:-34px;top:-34px;width:120px;height:120px;border-radius:50%;background:radial-gradient(circle,var(--g1),transparent 70%);opacity:.12;pointer-events:none} .ssc-hero-ico{width:42px;height:42px;border-radius:12px;display:flex;align-items:center;justify-content:center;flex-shrink:0} .ssc-hero-ico svg{width:20px;height:20px;stroke:#fff;stroke-width:2;fill:none;stroke-linecap:round;stroke-linejoin:round} .ssc-hero-mid{flex:1;min-width:0} .ssc-hero-val{font-size:23px;font-weight:800;color:#fff;line-height:1.08;font-variant-numeric:tabular-nums;letter-spacing:.3px;white-space:nowrap} .ssc-hero-val small{font-size:12px;font-weight:700;color:#8fa1b8;margin-left:2px} .ssc-hero-lbl{font-size:11.5px;color:#c0cdde;margin-top:3px;font-weight:600} .ssc-hero-sub{font-size:10px;color:#7d8aa0;margin-top:1px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .ssc-hero-bar{height:3px;border-radius:2px;background:rgba(148,163,184,.14);margin-top:7px;overflow:hidden} .ssc-hero-bar i{display:block;height:100%;border-radius:2px;background:linear-gradient(90deg,var(--g1),var(--g2));width:0;transition:width .9s cubic-bezier(.22,1,.36,1)} /* ---- 仪表 ---- */ .ssc-gauges{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px} .ssc-gauge{display:flex;flex-direction:column;align-items:center;padding:14px 12px 16px;transition:transform .18s ease,border-color .18s ease,box-shadow .18s ease} .ssc-gauge:hover{transform:translateY(-2px);border-color:rgba(34,211,238,.28);box-shadow:0 8px 24px rgba(0,0,0,.22)} .ssc-gauge-wrap{position:relative;width:118px;height:100px} .ssc-gauge-wrap svg{width:118px;height:118px;margin-top:-9px} .ssc-g-track{fill:none;stroke:rgba(148,163,184,.13);stroke-width:9;stroke-linecap:round;stroke-dasharray:75 25} .ssc-g-val{fill:none;stroke-width:9;stroke-linecap:round;stroke-dasharray:0 100;transition:stroke-dasharray 1s cubic-bezier(.22,1,.36,1);filter:drop-shadow(0 0 5px currentColor)} .ssc-gauge-center{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;padding-bottom:12px} .ssc-gauge-center b{font-size:19px;font-weight:800;color:#fff;font-variant-numeric:tabular-nums;line-height:1} .ssc-gauge-center i{font-style:normal;font-size:10px;color:#7d8aa0;margin-top:2px} .ssc-gauge-lbl{font-size:12px;font-weight:700;color:#dbe4ee;margin-top:2px} .ssc-gauge-note{font-size:10px;color:#7d8aa0;margin-top:2px;text-align:center} /* ---- 大盘网格 ---- */ .ssc-grid2{display:grid;grid-template-columns:minmax(0,7fr) minmax(0,5fr);gap:14px;align-items:start} .ssc-grid2b{display:grid;grid-template-columns:minmax(0,6fr) minmax(0,6fr);gap:14px;align-items:start} /* ---- 最近好友游戏时长排行 ---- */ .ssc-rr-row{display:flex;gap:10px;padding:10px 11px;border-radius:12px;background:rgba(148,163,184,.045);border:1px solid rgba(148,163,184,.09);margin-bottom:8px;cursor:pointer;transition:all .18s ease} .ssc-rr-row:last-child{margin-bottom:0} .ssc-rr-row:hover{border-color:rgba(34,211,238,.4);background:rgba(34,211,238,.06);transform:translateY(-1px)} .ssc-medal{width:26px;height:26px;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;font-size:12px;font-weight:800;flex-shrink:0;align-self:flex-start;background:rgba(148,163,184,.13);color:#94a3b8} .ssc-medal.m1{background:linear-gradient(135deg,#fbbf24,#d97706);color:#fff;box-shadow:0 0 12px rgba(251,191,36,.4)} .ssc-medal.m2{background:linear-gradient(135deg,#cbd5e1,#64748b);color:#fff} .ssc-medal.m3{background:linear-gradient(135deg,#d97706,#92400e);color:#fff} .ssc-rr-av{width:38px;height:38px;border-radius:50%;object-fit:cover;border:2px solid rgba(34,211,238,.35);flex-shrink:0;align-self:flex-start;background:#1e293b} .ssc-rr-main{flex:1;min-width:0} .ssc-rr-top{display:flex;align-items:baseline;gap:6px;min-width:0} .ssc-rr-name{font-size:13.5px;font-weight:700;color:#f1f5f9;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} .ssc-rr-hours{margin-left:auto;font-size:14px;font-weight:800;color:#fbbf24;font-variant-numeric:tabular-nums;flex-shrink:0} .ssc-rr-unit{font-size:10px;color:#a16207;font-weight:700;flex-shrink:0} .ssc-rr-game{display:flex;align-items:center;gap:8px;font-size:11px;color:#9fb0c5;margin-top:4px;min-width:0} .ssc-rr-game img{width:16px;height:16px;border-radius:4px;flex-shrink:0;background:rgba(148,163,184,.1)} .ssc-rr-game .n{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex-shrink:1;min-width:0} .ssc-rr-game .gb{flex:1;height:3px;border-radius:2px;background:rgba(148,163,184,.12);overflow:hidden;min-width:26px} .ssc-rr-game .gb i{display:block;height:100%;background:linear-gradient(90deg,#22d3ee,#3b82f6);border-radius:2px;width:0;transition:width .9s cubic-bezier(.22,1,.36,1)} .ssc-rr-game b{color:#7dd3fc;font-weight:700;flex-shrink:0;font-variant-numeric:tabular-nums} .ssc-rr-bar{height:3px;border-radius:2px;background:rgba(148,163,184,.1);margin-top:7px;overflow:hidden} .ssc-rr-bar i{display:block;height:100%;border-radius:2px;background:linear-gradient(90deg,#fbbf24,#f59e0b);width:0;transition:width .9s cubic-bezier(.22,1,.36,1)} /* ---- 热门游戏环图 ---- */ .ssc-donut-wrap{display:flex;gap:14px;align-items:center;flex-wrap:wrap} .ssc-donut{position:relative;width:186px;height:186px;flex-shrink:0;margin:0 auto} .ssc-donut svg{width:100%;height:100%;display:block} .ssc-donut .ssc-seg{fill:none;stroke-width:14;cursor:pointer;transition:stroke-dasharray 1s cubic-bezier(.22,1,.36,1),stroke-dashoffset 1s cubic-bezier(.22,1,.36,1),opacity .18s ease,stroke-width .18s ease} .ssc-donut .ssc-seg.ssc-dim{opacity:.25} .ssc-donut .ssc-seg.ssc-hot{stroke-width:17} .ssc-donut-center{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;pointer-events:none;padding:0 26px} .ssc-donut-center b{font-size:22px;font-weight:800;color:#fff;font-variant-numeric:tabular-nums;line-height:1.1} .ssc-donut-center span{font-size:10px;color:#8fa1b8;margin-top:3px;line-height:1.4} .ssc-legend{flex:1;min-width:210px;display:flex;flex-direction:column;gap:5px} .ssc-lg-row{display:flex;align-items:center;gap:8px;font-size:12px;padding:5px 8px;border-radius:8px;cursor:pointer;transition:background .15s ease} .ssc-lg-row:hover,.ssc-lg-row.ssc-hot{background:rgba(148,163,184,.09)} .ssc-lg-dot{width:9px;height:9px;border-radius:3px;flex-shrink:0} .ssc-lg-ico{width:18px;height:18px;border-radius:4px;flex-shrink:0;object-fit:cover;background:rgba(148,163,184,.12)} .ssc-lg-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#dbe4ee} .ssc-lg-meta{color:#7d8aa0;font-size:10.5px;flex-shrink:0;font-variant-numeric:tabular-nums;white-space:nowrap} .ssc-lg-pct{width:44px;text-align:right;font-weight:700;color:#e2e8f0;flex-shrink:0;font-variant-numeric:tabular-nums} /* ---- 热力图 ---- */ .ssc-heat{display:flex;flex-direction:column;gap:3px;min-width:0} .ssc-heat-scroll{overflow-x:auto;scrollbar-width:thin} .ssc-heat-days{display:grid;grid-template-columns:104px repeat(14,minmax(10px,1fr));gap:3px;font-size:9.5px;color:#64748b;padding-bottom:2px} .ssc-heat-days span{text-align:center;white-space:nowrap} .ssc-heat-row{display:grid;grid-template-columns:104px repeat(14,minmax(10px,1fr));gap:3px;align-items:center;border-radius:6px;cursor:pointer} .ssc-heat-row:hover{background:rgba(148,163,184,.05)} .ssc-heat-name{display:flex;align-items:center;gap:6px;font-size:11px;color:#c9d5e3;min-width:0;padding-right:4px} .ssc-heat-name img{width:18px;height:18px;border-radius:50%;flex-shrink:0;background:#1e293b} .ssc-heat-name span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap} .ssc-cell{aspect-ratio:1;max-height:16px;width:100%;border-radius:3px;background:rgba(148,163,184,.08)} .ssc-cell.v1{background:#155e75}.ssc-cell.v2{background:#0e7490}.ssc-cell.v3{background:#06b6d4}.ssc-cell.v4{background:#22d3ee;box-shadow:0 0 5px rgba(34,211,238,.35)}.ssc-cell.v5{background:#a5f3fc;box-shadow:0 0 8px rgba(34,211,238,.55)} .ssc-heat-legend{display:flex;align-items:center;gap:4px;justify-content:flex-end;font-size:10px;color:#64748b;margin-top:10px} .ssc-heat-legend i{width:10px;height:10px;border-radius:3px;display:inline-block;background:rgba(148,163,184,.08)} .ssc-heat-legend i.v1{background:#155e75}.ssc-heat-legend i.v2{background:#0e7490}.ssc-heat-legend i.v3{background:#06b6d4}.ssc-heat-legend i.v4{background:#22d3ee}.ssc-heat-legend i.v5{background:#a5f3fc} /* ---- 好友数排行条形 ---- */ .ssc-fr-row{display:flex;align-items:center;gap:9px;padding:6px 8px;border-radius:9px;font-size:12px;cursor:pointer;transition:background .15s ease} .ssc-fr-row:hover{background:rgba(148,163,184,.08)} .ssc-fr-no{width:22px;color:#7d8aa0;font-weight:700;text-align:center;flex-shrink:0;font-variant-numeric:tabular-nums} .ssc-fr-av{width:26px;height:26px;border-radius:50%;object-fit:cover;flex-shrink:0;background:#1e293b} .ssc-fr-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#dbe4ee} .ssc-fr-bar{width:34%;height:7px;border-radius:4px;background:rgba(148,163,184,.1);overflow:hidden;flex-shrink:0} .ssc-fr-bar i{display:block;height:100%;border-radius:4px;background:linear-gradient(90deg,#22d3ee,#3b82f6);box-shadow:0 0 8px rgba(34,211,238,.35);width:0;transition:width .9s cubic-bezier(.22,1,.36,1)} .ssc-fr-val{width:56px;text-align:right;font-weight:700;color:#67e8f9;flex-shrink:0;font-variant-numeric:tabular-nums} .ssc-fr-skel{display:flex;align-items:center;gap:9px;padding:7px 8px} .ssc-fr-skel i{display:block;height:10px;border-radius:6px;background:linear-gradient(90deg,rgba(148,163,184,.08),rgba(148,163,184,.2),rgba(148,163,184,.08));background-size:220% 100%;animation:ssc-shimmer 1.15s ease-in-out infinite} @keyframes ssc-shimmer{0%{background-position:120% 0}100%{background-position:-120% 0}} .ssc-fr-wait{padding:8px 4px 2px;font-size:11.5px;color:#8fa1b8;line-height:1.5} /* ---- 好友数据页 ---- */ .ssc-kpis{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:8px} .ssc-kpi{background:linear-gradient(160deg,rgba(148,163,184,.07),rgba(148,163,184,.02));border:1px solid rgba(148,163,184,.12);border-radius:10px;padding:8px 10px} .ssc-kpi b{display:block;font-size:17px;color:#fff;font-weight:800;font-variant-numeric:tabular-nums} .ssc-kpi span{font-size:10.5px;color:#8fa1b8} .ssc-list{position:relative;flex:1;min-height:0;overflow:auto;border:1px solid rgba(148,163,184,.1);border-radius:12px;background:rgba(0,0,0,.18);scrollbar-width:thin;scrollbar-color:rgba(34,211,238,.3) transparent} .ssc-list::-webkit-scrollbar{width:6px} .ssc-list::-webkit-scrollbar-thumb{background:rgba(34,211,238,.28);border-radius:3px} .ssc-spacer{width:1px} .ssc-win{position:absolute;left:0;right:0;top:0} .ssc-row{display:flex;align-items:center;gap:10px;height:64px;margin:0 8px 8px;padding:0 10px;box-sizing:border-box;background:rgba(148,163,184,.045);border:1px solid rgba(148,163,184,.08);border-radius:11px;color:inherit;width:calc(100% - 16px);text-align:left;cursor:pointer;transition:all .18s ease} .ssc-row:hover{border-color:rgba(34,211,238,.45);background:rgba(34,211,238,.07)} .ssc-av{width:40px;height:40px;border-radius:50%;object-fit:cover;background:#1e293b;flex-shrink:0} .ssc-mid{flex:1;min-width:0} .ssc-name{font-size:14px;font-weight:700;color:#f8fafc;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .ssc-sub{font-size:12px;color:#8fa1b8;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .ssc-meta{display:flex;gap:6px;flex-shrink:0;font-size:11px;color:#cbd5e1;flex-wrap:wrap;justify-content:flex-end} .ssc-pill{background:rgba(148,163,184,.1);border-radius:999px;padding:3px 7px;white-space:nowrap} .ssc-pill.ssc-new{background:rgba(251,113,133,.16);color:#fda4af} .ssc-pill.ssc-vac{background:rgba(244,63,94,.2);color:#fecaca} .ssc-pill.ssc-game{background:rgba(139,92,246,.2);color:#ddd6fe} .ssc-pill.ssc-lv{color:#fbbf24;background:rgba(251,191,36,.1)} .ssc-empty{margin:auto;text-align:center;color:#8fa1b8;padding:48px 16px;font-size:14px;line-height:1.6} /* ---- 排行页 ---- */ .ssc-rank-list,.ssc-cmp{flex:1;min-height:0;overflow:auto;display:flex;flex-direction:column;gap:6px;scrollbar-width:thin;scrollbar-color:rgba(34,211,238,.3) transparent} .ssc-rank-row{display:flex;align-items:center;gap:10px;padding:7px 10px;border-radius:10px;background:rgba(148,163,184,.045);border:1px solid rgba(148,163,184,.08)} .ssc-rank-row .ssc-rk-name{font-size:13px;font-weight:600;color:#e2e8f0;width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex-shrink:0} .ssc-rank-row .ssc-fr-bar{flex:1;width:auto} .ssc-rank-row .ssc-rk-val{font-size:12px;font-weight:700;color:#7dd3fc;width:88px;text-align:right;flex-shrink:0;font-variant-numeric:tabular-nums;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .ssc-rank-row button{margin-left:auto;flex-shrink:0} /* ---- 比对页 ---- */ .ssc-page[data-page=compare]{min-height:0;overflow:hidden} .ssc-split{display:grid;grid-template-columns:minmax(0,10fr) minmax(0,11fr) minmax(0,9fr);grid-template-rows:minmax(0,1fr);gap:14px;min-height:0;flex:1;align-items:stretch} .ssc-cmp-card{display:flex;flex-direction:column;gap:10px;padding:14px 16px;min-height:0;height:100%;overflow:hidden} .ssc-cmp-card .ssc-field select,.ssc-cmp-card .ssc-field input{width:100%;box-sizing:border-box} .ssc-cmp-hd{display:flex;align-items:center;gap:10px;margin:0;flex-shrink:0} .ssc-cmp-ico{width:40px;height:40px;border-radius:12px;display:flex;align-items:center;justify-content:center;flex-shrink:0;overflow:hidden} .ssc-cmp-ico svg{width:34px;height:34px;stroke:#fff;stroke-width:2;fill:none;stroke-linecap:round;stroke-linejoin:round} .ssc-cmp-hd .t{flex:1;min-width:0} .ssc-cmp-hd b{display:block;font-size:14px;font-weight:800;color:#f1f5f9} .ssc-cmp-hd span{display:block;font-size:10.5px;color:#7d8aa0;margin-top:1px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .ssc-cmp-kpis{display:flex;flex-wrap:wrap;gap:6px} .ssc-cmp-kpi{display:inline-flex;align-items:center;gap:6px;padding:5px 9px;border-radius:9px;border:1px solid rgba(148,163,184,.14);background:rgba(148,163,184,.05);font-size:11px;color:#c9d5e3;white-space:nowrap} .ssc-cmp-kpi b{font-size:13px;font-weight:800;color:#fff;font-variant-numeric:tabular-nums} .ssc-cmp-kpi svg{width:12px;height:12px;stroke:currentColor;stroke-width:2;fill:none;flex-shrink:0} .ssc-cmp-kpi.blue{color:#7dd3fc} .ssc-cmp-kpi.green{color:#6ee7b7} .ssc-cmp-kpi.rose{color:#fda4af} .ssc-cmp-kpi.amber{color:#fcd34d} .ssc-cmp-overlap{display:flex;height:10px;border-radius:6px;overflow:hidden;background:rgba(148,163,184,.1)} .ssc-cmp-overlap i{display:block;height:100%;transition:width .9s cubic-bezier(.22,1,.36,1)} .ssc-cmp-overlap i.mine{background:linear-gradient(90deg,#3b82f6,#60a5fa)} .ssc-cmp-overlap i.shared{background:linear-gradient(90deg,#10b981,#34d399)} .ssc-cmp-overlap i.theirs{background:linear-gradient(90deg,#f43f5e,#fb7185)} .ssc-cmp-legend{display:flex;gap:12px;flex-wrap:wrap;font-size:10.5px;color:#94a3b8} .ssc-cmp-legend i{display:inline-block;width:8px;height:8px;border-radius:3px;margin-right:4px;vertical-align:-1px} .ssc-cmp-legend b{color:#e2e8f0;font-weight:700} .ssc-cmp-people{display:flex;gap:6px;flex-wrap:wrap} .ssc-cmp-person{display:flex;align-items:center;gap:6px;padding:4px 9px 4px 4px;border-radius:999px;border:1px solid rgba(148,163,184,.14);background:rgba(148,163,184,.06);font-size:11px;color:#e2e8f0;max-width:100%} .ssc-cmp-person img{width:20px;height:20px;border-radius:50%;object-fit:cover;background:#1e293b;flex-shrink:0} .ssc-cmp-person span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap} .ssc-cmp-list{flex:1;min-height:0;overflow:auto;display:flex;flex-direction:column;gap:6px;scrollbar-width:thin;scrollbar-color:rgba(34,211,238,.3) transparent;padding-right:2px} .ssc-cmp-row{display:flex;align-items:center;gap:9px;padding:7px 9px;border-radius:10px;background:rgba(148,163,184,.045);border:1px solid rgba(148,163,184,.08);transition:all .18s ease;text-decoration:none!important;color:inherit!important;cursor:pointer} .ssc-cmp-row:hover{border-color:rgba(34,211,238,.4);background:rgba(34,211,238,.06);transform:translateX(2px)} .ssc-cmp-gico,.ssc-cmp-gico-big,.ssc-cmp-sug img{display:block;object-fit:cover;object-position:center;flex-shrink:0;background:#16202e} .ssc-cmp-gico{width:68px;height:26px;border-radius:4px} .ssc-cmp-gico-big{width:128px;height:48px;border-radius:6px} .ssc-cmp-main{flex:1;min-width:0} .ssc-cmp-name{font-size:12px;font-weight:600;color:#f1f5f9;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-bottom:4px} .ssc-cmp-bars{display:flex;flex-direction:column;gap:2px} .ssc-cmp-bar{display:flex;align-items:center;gap:6px;font-size:10px;color:#8fa1b8} .ssc-cmp-bar .k{width:34px;flex-shrink:0;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .ssc-cmp-bar .b{flex:1;height:5px;border-radius:3px;background:rgba(148,163,184,.12);overflow:hidden;min-width:20px} .ssc-cmp-bar .b i{display:block;height:100%;border-radius:3px;width:0;transition:width .7s cubic-bezier(.22,1,.36,1)} .ssc-cmp-bar .h{width:46px;text-align:right;font-variant-numeric:tabular-nums;color:#cbd5e1;flex-shrink:0} .ssc-cmp-bar .b i.c1{background:linear-gradient(90deg,#22d3ee,#3b82f6)} .ssc-cmp-bar .b i.c2{background:linear-gradient(90deg,#a78bfa,#f472b6)} .ssc-cmp-bar .b i.c3{background:linear-gradient(90deg,#34d399,#22d3ee)} .ssc-cmp-bar .b i.c4{background:linear-gradient(90deg,#fbbf24,#fb7185)} .ssc-cmp-rank-no{width:22px;height:22px;border-radius:7px;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:800;background:rgba(148,163,184,.13);color:#94a3b8;flex-shrink:0;font-variant-numeric:tabular-nums} .ssc-cmp-rank-no.m1{background:linear-gradient(135deg,#fbbf24,#d97706);color:#fff;box-shadow:0 0 10px rgba(251,191,36,.35)} .ssc-cmp-rank-no.m2{background:linear-gradient(135deg,#cbd5e1,#64748b);color:#fff} .ssc-cmp-rank-no.m3{background:linear-gradient(135deg,#d97706,#92400e);color:#fff} .ssc-cmp-av{width:24px;height:24px;border-radius:50%;object-fit:cover;background:#1e293b;flex-shrink:0} .ssc-cmp-ghead{display:flex;align-items:center;gap:9px;padding:8px;border-radius:10px;background:rgba(148,163,184,.05);border:1px solid rgba(148,163,184,.1)} .ssc-cmp-ghead .t{flex:1;min-width:0} .ssc-cmp-ghead b{font-size:13px;font-weight:800;color:#f1f5f9;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} .ssc-cmp-ghead span{font-size:10.5px;color:#7d8aa0;margin-top:2px;display:block} .ssc-cmp-checks{overflow:auto;flex:0 1 auto;min-height:0;max-height:46%;display:flex;flex-direction:column;gap:3px;font-size:12px;padding-right:2px;scrollbar-width:thin} .ssc-cmp-checks label{display:flex;align-items:center;gap:7px;padding:4px 7px;border-radius:8px;cursor:pointer;transition:background .15s ease;color:#c9d5e3;min-width:0} .ssc-cmp-checks label:hover{background:rgba(148,163,184,.08)} .ssc-cmp-checks label span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap} .ssc-cmp-checks input{accent-color:#22d3ee;flex-shrink:0} .ssc-cmp-checks img{width:18px;height:18px;border-radius:50%;object-fit:cover;background:#1e293b;flex-shrink:0} .ssc-cmp-sug{display:flex;flex-direction:column;gap:5px;max-height:150px;overflow:auto;scrollbar-width:thin;padding-right:2px} .ssc-cmp-sug .ssc-btn{display:flex;align-items:center;gap:7px;justify-content:flex-start;padding:5px 8px;font-weight:600;text-align:left;min-width:0} .ssc-cmp-sug .ssc-btn span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap} .ssc-cmp-sug .ssc-btn b{margin-left:auto;color:#7d8aa0;font-size:10px;flex-shrink:0} .ssc-cmp-sug img{width:68px;height:26px;border-radius:4px} .ssc-cmp-note{font-size:11.5px;color:#8fa1b8;line-height:1.6} /* ---- 响应式 ---- */ @media(max-width:1100px){.ssc-hero{grid-template-columns:repeat(3,minmax(0,1fr))}.ssc-gauges{grid-template-columns:repeat(2,minmax(0,1fr))}.ssc-dash-stage{grid-template-columns:1fr}.ssc-split{grid-template-columns:1fr 1fr}.ssc-split>div:last-child{grid-column:1/-1}} @media(max-width:900px){.ssc-grid2,.ssc-grid2b,.ssc-dash-stage{grid-template-columns:1fr}.ssc-split{grid-template-columns:1fr}.ssc-body{padding:12px 14px 10px}.ssc-top{padding:0 12px}.ssc-kpis{grid-template-columns:repeat(3,minmax(0,1fr))}.ssc-rank-row .ssc-rk-name{width:96px}.ssc-rank-row .ssc-fr-bar{display:none}.ssc-page{gap:12px}.ssc-dash-inner,.ssc-dash-stage,.ssc-dash-main,.ssc-dash-side{gap:12px}} @media(max-width:640px){.ssc-hero{grid-template-columns:repeat(2,minmax(0,1fr))}} @media (prefers-reduced-motion:reduce){#ssc-root *,#ssc-root *::before,#ssc-root *::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}} `; let host = null; let core = null; let inited = false; let styled = false; let opened = false; let page = 'dash'; let query = ''; let sortKey = 'days'; let view = []; let rootEl = null; let searchTimer = null; let gameTimer = null; let comparePick = []; let dashTickAt = 0; let fcountTickAt = 0; function $(sel, base) { return (base || rootEl).querySelector(sel); } function text(sel, value) { const node = $(sel); if (node) node.textContent = value; } function esc(value) { return String(value == null ? '' : value).replace(/[&<>"']/g, (c) => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''', }[c])); } function hours(minutes) { return (Math.round((minutes || 0) / 6) / 10) + 'h'; } function animateBars(container) { requestAnimationFrame(() => { container.querySelectorAll('[data-w]').forEach((bar) => { bar.style.width = (Math.max(0, Math.min(100, Number(bar.dataset.w) || 0))) + '%'; }); }); } function countUp(node, target) { const fmtPct = node.dataset.fmt === 'pct'; const format = (v) => (fmtPct ? (Math.round(v * 10) / 10).toString() : Math.round(v).toLocaleString('en-US')); if (REDUCED) { node.textContent = format(target); return; } const t0 = performance.now(); const dur = 950; const step = (t) => { const p = Math.min(1, (t - t0) / dur); const e = 1 - Math.pow(1 - p, 3); node.textContent = format(target * e); if (p < 1 && opened) requestAnimationFrame(step); }; requestAnimationFrame(step); } function init(nextHost) { try { if (!nextHost || nextHost.apiVersion !== API_VERSION) return false; const required = ['getApiKey', 'getMySteamId', 'openFriend', 'showToast']; for (let i = 0; i < required.length; i++) { if (typeof nextHost[required[i]] !== 'function') return false; } core = root.SteamSocialCore; if (!core || core.apiVersion !== API_VERSION || typeof core.attach !== 'function') return false; if (!core.attach(nextHost)) return false; host = nextHost; injectStyle(); inited = true; return true; } catch (e) { return false; } } function injectStyle() { if (styled) return; styled = true; if (typeof GM_addStyle === 'function') GM_addStyle(CSS); else if (root.document) { const style = root.document.createElement('style'); style.textContent = CSS; root.document.head.appendChild(style); } } function isOpen() { return opened; } function toast(message, type) { try { host.showToast(message, type || 'info'); } catch (e) { /* 宿主提示失败时忽略 */ } } function ensureDom() { if (rootEl) return; const doc = root.document; rootEl = doc.createElement('div'); rootEl.id = 'ssc-root'; rootEl.innerHTML = `