:root { --bg0: #0b1018; --panel: rgba(14, 22, 34, 0.96); --line: rgba(140, 170, 210, 0.18); --text: #e8eef7; --muted: #8fa3bc; --good: #3dce7a; --bad: #e07a2f; --syn: #7ec8ff; --sel: #5ec8ff; --font: "Segoe UI", "Microsoft YaHei UI", "PingFang SC", sans-serif; } * { box-sizing: border-box; } html, body { margin: 0; min-height: 100%; color: var(--text); font-family: var(--font); background: radial-gradient(1200px 600px at 20% -10%, rgba(50, 80, 120, 0.35), transparent 60%), radial-gradient(900px 500px at 90% 10%, rgba(30, 60, 90, 0.28), transparent 55%), linear-gradient(180deg, #152033 0%, var(--bg0) 45%, #070a10 100%); } body { display: flex; flex-direction: column; height: 100dvh; max-height: 100dvh; overflow: hidden; } .topbar { position: relative; display: flex; flex-direction: column; align-items: stretch; gap: 12px; padding: 12px 20px 14px; border-bottom: 1px solid var(--line); background: rgba(8, 12, 20, 0.45); flex: 0 0 auto; } /* Brand mark: Dota 2 full logo + 上分帝 title, pinned to the top-left corner of the topbar. Absolutely positioned so the centered tab row and toolbar layout are left untouched. */ .brand { position: absolute; left: 20px; top: 12px; height: 40px; display: flex; align-items: center; gap: 12px; pointer-events: none; z-index: 2; } .brand-logo { height: 28px; width: auto; display: block; } .brand-title { font-size: 18px; font-weight: 700; letter-spacing: 0.16em; color: var(--text); white-space: nowrap; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); } @media (max-width: 880px) { .brand-title { display: none; } } @media (max-width: 620px) { .brand { display: none; } } .contact-mail { position: absolute; right: 20px; top: 12px; z-index: 2; display: flex; align-items: center; justify-content: center; width: 40px; height: 40px; border-radius: 8px; border: none; background: transparent; color: var(--muted); text-decoration: none; transition: color 0.15s, background 0.15s; } .contact-mail:hover { color: var(--text); background: rgba(255, 255, 255, 0.06); } .contact-mail:focus-visible { outline: 2px solid var(--sel); outline-offset: 2px; } .contact-mail-icon { display: block; } .main-tabs { display: flex; justify-content: center; gap: 0; } .main-tab { min-width: 120px; padding: 10px 28px; border: 1px solid var(--line); background: rgba(255, 255, 255, 0.03); color: var(--muted); font: inherit; font-size: 15px; letter-spacing: 0.08em; cursor: pointer; } .main-tab:first-child { border-radius: 6px 0 0 6px; } .main-tab:last-child { border-radius: 0 6px 6px 0; } .main-tab + .main-tab { border-left: none; } .main-tab.active { color: var(--text); background: rgba(255, 255, 255, 0.08); box-shadow: inset 0 -2px 0 var(--sel); } .toolbar { position: relative; display: flex; align-items: center; justify-content: center; min-height: 40px; gap: 12px; } .toolbar.hidden, .board.hidden, .hidden { display: none !important; } .tagbar { display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; max-width: calc(100% - 220px); } .tagbar button { border: 1px solid var(--line); background: rgba(255,255,255,0.04); color: var(--muted); border-radius: 999px; padding: 8px 18px; cursor: pointer; font: inherit; font-size: 14px; } .tagbar button.active { color: var(--text); border-color: rgba(94, 200, 255, 0.55); background: rgba(94, 200, 255, 0.14); } .search { position: absolute; right: 0; top: 50%; transform: translateY(-50%); width: 200px; padding: 9px 12px 9px 34px; border: 1px solid rgba(140, 170, 210, 0.38); border-radius: 8px; background-color: rgba(0, 0, 0, 0.45); background-image: url("data:image/svg+xml;utf8,"); background-repeat: no-repeat; background-position: 10px center; background-size: 15px 15px; color: var(--text); font: inherit; font-size: 14px; outline: none; } .search::placeholder { color: var(--muted); } .search:focus { border-color: rgba(94, 200, 255, 0.65); background-color: rgba(0, 0, 0, 0.55); box-shadow: 0 0 0 2px rgba(94, 200, 255, 0.18); } .search::-webkit-search-cancel-button { cursor: pointer; } .board { padding: 8px 14px 12px; width: 100%; flex: 1 1 auto; min-height: 0; overflow: auto; } /* Hero picker fills all space above the bottom-pinned detail; scrolls inside when the grid is taller than the region (small windows). */ #heroes-view { flex: 1 1 auto; min-height: 0; margin-bottom: 16px; overflow: auto; } /* Heroes-only (#detail hidden on items page): pin to bottom with a gap above the hero grid. Selected state uses one taller fixed height for all tabs so 技能 ↔ 核心装备 ↔ 被克装备 does not jump; long edge cases still scroll. */ .detail { --detail-fixed-h: min(620px, calc(100dvh - clamp(260px, 40vh, 400px) - 8.5rem)); display: flex; flex-direction: column; align-items: center; flex: 0 0 auto; margin: auto 14px 12px; padding: 12px 16px; border: 1px solid var(--line); border-radius: 10px; background: rgba(8, 12, 20, 0.55); min-height: 0; overflow: hidden; box-sizing: border-box; } .detail:not(.empty) { height: var(--detail-fixed-h); min-height: var(--detail-fixed-h); max-height: var(--detail-fixed-h); } .detail:not(.empty) > * { width: 100%; max-width: none; } .detail.empty { height: auto; min-height: 64px; max-height: none; justify-content: center; color: var(--muted); font-size: 14px; letter-spacing: 0.04em; } .detail-head { display: flex; flex-direction: column; flex-wrap: nowrap; align-items: center; justify-content: center; flex: 0 0 auto; gap: 8px; margin-bottom: 12px; text-align: center; } .detail-stats-strip { display: none; } .detail-stats-layout { flex: 1 1 auto; min-height: 0; width: 100%; overflow: hidden; display: flex; flex-direction: column; align-items: stretch; justify-content: flex-start; } .detail-stats-layout .detail-tab-body { flex: 1 1 auto; min-height: 0; overflow-y: auto; overflow-x: hidden; overscroll-behavior: contain; scrollbar-width: thin; padding-right: 6px; width: 100%; } .detail-stats-panel, .trends-panel { width: min(920px, 100%); margin: 8px auto 0; padding: 8px 12px 20px; display: flex; flex-direction: column; align-items: center; text-align: center; overflow: visible; box-sizing: border-box; } .trends-rank-bar { width: 100%; box-sizing: border-box; display: flex; justify-content: center; align-items: center; padding: 8px 10px; margin-bottom: 6px; border-radius: 8px; overflow: visible; background: linear-gradient( 180deg, rgba(92, 72, 48, 0.55) 0%, rgba(48, 38, 28, 0.72) 100% ); border: 1px solid rgba(180, 140, 80, 0.22); } .trends-window-hint { width: 100%; text-align: center; font-size: 12px; margin-bottom: 10px; opacity: 0.82; } .bracket-icon-picker { display: flex; flex-wrap: nowrap; align-items: center; justify-content: center; gap: 8px; width: 100%; max-width: 100%; overflow: visible; scrollbar-width: none; } .bracket-icon-picker::-webkit-scrollbar { display: none; width: 0; height: 0; } .bracket-icon-wrap { position: relative; display: inline-flex; align-items: center; justify-content: center; flex: 1 1 0; min-width: 0; max-width: calc((100% - 56px) / 8); } .bracket-icon-btn { display: inline-flex; align-items: center; justify-content: center; width: 96px; height: 96px; max-width: 100%; padding: 2px; border-radius: 10px; border: 1px solid transparent; background: transparent; cursor: pointer; opacity: 0.55; flex: 1 1 auto; min-width: 0; box-sizing: border-box; transition: opacity 0.12s ease, border-color 0.12s ease, background 0.12s ease; } .bracket-icon-btn img { width: min(90px, 100%); height: min(90px, 100%); object-fit: contain; pointer-events: none; filter: grayscale(0.15); } .bracket-icon-btn:hover { opacity: 0.9; } .bracket-icon-btn.active { opacity: 1; border-color: rgba(232, 200, 120, 0.75); background: rgba(0, 0, 0, 0.25); } .bracket-icon-btn.active img { filter: none; } .bracket-info-btn { position: absolute; right: 2px; bottom: 6px; z-index: 2; width: 18px; height: 18px; padding: 0; border-radius: 50%; border: 1px solid rgba(180, 190, 210, 0.55); background: rgba(48, 54, 66, 0.95); color: #c8d0dc; font-size: 11px; font-weight: 700; font-style: italic; font-family: Georgia, "Times New Roman", serif; line-height: 16px; cursor: help; opacity: 0.95; } .bracket-info-btn:hover, .bracket-info-btn.open { border-color: rgba(232, 200, 120, 0.8); color: #f0e6c8; } .bracket-info-bubble { display: none; position: absolute; right: 0; bottom: calc(100% + 10px); width: max(220px, 28vw); max-width: 280px; padding: 10px 12px; border-radius: 6px; background: rgba(36, 40, 48, 0.96); border: 1px solid rgba(140, 150, 170, 0.35); color: #e8eef8; font-size: 12px; font-style: normal; font-weight: 450; font-family: inherit; line-height: 1.45; text-align: left; white-space: normal; box-shadow: 0 8px 24px rgba(0, 0, 0, 0.45); pointer-events: none; } .bracket-info-bubble::after { content: ""; position: absolute; right: 6px; top: 100%; border: 6px solid transparent; border-top-color: rgba(36, 40, 48, 0.96); } .bracket-info-btn:hover .bracket-info-bubble, .bracket-info-btn.open .bracket-info-bubble, .bracket-info-btn:focus-visible .bracket-info-bubble { display: block; } .trends-metric-cards { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; width: 100%; margin: 0 0 12px; } .trends-metric-card { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px; padding: 16px 10px 18px; border-radius: 6px; background: rgba(0, 0, 0, 0.32); border: 1px solid rgba(140, 170, 210, 0.14); text-align: center; min-height: 96px; } .trends-metric-label { font-size: 13px; color: #9aa8c4; letter-spacing: 0.08em; } .trends-metric-value { font-size: 28px; font-weight: 650; font-variant-numeric: tabular-nums; letter-spacing: 0.02em; color: #f2f5fa; } .trends-metric-card.tone-wr .trends-metric-value { color: #f2f5fa; } .trends-metric-card.tone-pr .trends-metric-value { color: #f2f5fa; } .trends-metric-card.tone-games .trends-metric-value { color: #f2f5fa; } .trends-section-label { margin: 16px 0 10px; font-size: 13px; letter-spacing: 0.08em; color: #9aa8c4; text-align: center; width: 100%; } .trends-week-chart { margin-top: 16px; width: 100%; text-align: left; } .trends-week-head { margin-top: 8px; margin-bottom: 8px; text-align: center; } .trends-week-list { display: flex; flex-direction: column; gap: 5px; width: 100%; } .trends-week-row { display: grid; grid-template-columns: 40px 48px 36px minmax(0, 1fr) 48px; align-items: center; gap: 6px 8px; padding: 7px 10px; border-radius: 6px; background: rgba(0, 0, 0, 0.2); border: 1px solid rgba(140, 170, 210, 0.08); } .trends-week-row.is-latest { border-color: rgba(180, 140, 80, 0.32); background: rgba(92, 72, 48, 0.2); } .trends-week-row.is-best:not(.is-latest) { border-color: rgba(61, 154, 106, 0.22); } .trends-week-label { font-size: 12px; color: #9aa8c4; letter-spacing: 0.02em; white-space: nowrap; } .trends-week-row.is-latest .trends-week-label { color: #d6c4a0; font-weight: 600; } .trends-week-wr { font-size: 13px; font-weight: 650; font-variant-numeric: tabular-nums; color: #f2f5fa; text-align: right; } .trends-week-wr.is-up { color: #6ecf9a; } .trends-week-wr.is-down { color: #e88888; } .trends-week-delta { font-size: 11px; font-variant-numeric: tabular-nums; text-align: right; white-space: nowrap; color: #7a8494; min-height: 1em; } .trends-week-delta.is-up { color: #6ecf9a; } .trends-week-delta.is-down { color: #e88888; } .trends-week-delta.is-flat, .trends-week-delta.is-empty { color: #5c6674; } .trends-week-track { position: relative; height: 8px; border-radius: 4px; background: rgba(255, 255, 255, 0.06); overflow: hidden; } .trends-week-fill { position: absolute; left: 0; top: 0; bottom: 0; border-radius: 4px; min-width: 3px; transition: width 0.15s ease; } .trends-week-fill.is-up { background: linear-gradient(90deg, rgba(61, 154, 106, 0.35), #3d9a6a); } .trends-week-fill.is-down { background: linear-gradient(90deg, rgba(196, 92, 92, 0.35), #c45c5c); } .trends-week-pick { font-size: 11px; text-align: right; white-space: nowrap; font-variant-numeric: tabular-nums; } @media (max-width: 560px) { .trends-week-row { grid-template-columns: 36px 44px 32px minmax(0, 1fr); grid-template-rows: auto auto; } .trends-week-pick { grid-column: 4; grid-row: 2; text-align: left; } } .trends-positions { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 10px; width: 100%; max-width: min(920px, 100%); margin: 4px auto 0; } @media (max-width: 720px) { .trends-positions { grid-template-columns: repeat(3, minmax(0, 1fr)); } } @media (max-width: 480px) { .trends-positions { grid-template-columns: repeat(2, minmax(0, 1fr)); } } .trends-pos-chip { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px; padding: 14px 10px 16px; min-height: 84px; border-radius: 6px; border: 1px solid rgba(140, 170, 210, 0.14); background: rgba(0, 0, 0, 0.32); text-align: center; } .trends-pos-label { font-size: 13px; color: #9aa8c4; letter-spacing: 0.06em; } .trends-pos-value { font-size: 22px; font-weight: 650; font-variant-numeric: tabular-nums; color: #f2f5fa; } .detail-matchups-layout { flex: 1 1 auto; min-height: 0; width: 100%; overflow: hidden; display: flex; flex-direction: column; } .detail-matchups-layout .detail-tab-body { flex: 1 1 auto; min-height: 0; overflow-y: auto; overflow-x: hidden; overscroll-behavior: contain; scrollbar-width: thin; padding-right: 6px; } .detail-matchups-panel { display: flex; flex-direction: column; gap: 8px; width: 100%; padding: 4px 4px 12px; box-sizing: border-box; } .matchup-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; align-items: start; } @media (max-width: 900px) { .matchup-grid { grid-template-columns: 1fr; } } .matchup-col { display: flex; flex-direction: column; min-width: 0; } .matchup-col-title { margin: 0 0 8px; font-size: 13px; font-weight: 600; } .matchup-list { display: flex; flex-direction: column; gap: 6px; } .matchup-row { display: grid; grid-template-columns: 64px 1fr auto; align-items: center; gap: 10px; width: 100%; padding: 6px 8px; border: 0; border-radius: 4px; background: transparent; color: inherit; text-align: left; cursor: pointer; } .matchup-row:hover:not(:disabled) { background: rgba(255, 255, 255, 0.06); } .matchup-row:disabled { cursor: default; opacity: 0.7; } .matchup-portrait { width: 64px; height: 36px; object-fit: cover; border-radius: 3px; flex-shrink: 0; } .matchup-mid { display: flex; flex-direction: column; gap: 2px; min-width: 0; } .matchup-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 14px; } .matchup-meta { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 11px; } .matchup-score { font-variant-numeric: tabular-nums; font-size: 14px; color: #7eb6ff; white-space: nowrap; } .matchup-score.is-agree { color: #7ecf9a; } .matchup-score.is-conflict { color: #e0a06a; } .matchup-games { font-size: 12px; min-width: 2.75rem; text-align: right; white-space: nowrap; } .matchup-scope-hint, .matchup-freshness, .matchup-notes { font-size: 12px; line-height: 1.45; } .matchup-notes { display: flex; flex-direction: column; align-items: center; gap: 4px; margin-top: 10px; padding-top: 8px; border-top: 1px solid rgba(255, 255, 255, 0.08); text-align: center; } .matchup-note-line, .matchup-note-time { margin: 0; } .matchup-note-line { white-space: nowrap; } .matchup-note-time { margin-top: 2px; opacity: 0.85; } .matchup-note-line.is-stale, .matchup-freshness.is-stale { color: #e0a06a; } .meta-hero { display: flex; align-items: center; gap: 8px; } .meta-portrait { width: 48px; height: 27px; object-fit: cover; border-radius: 2px; } .detail-stats-note { margin-top: 4px; font-size: 12px; line-height: 1.45; text-align: center; max-width: 36em; } .detail-items-note { margin-top: 12px; font-size: 12px; line-height: 1.45; text-align: center; } .item-usage-badge { position: absolute; right: 2px; bottom: 2px; z-index: 2; padding: 1px 4px; border-radius: 3px; background: rgba(0, 0, 0, 0.72); color: #d7e6ff; font-size: 10px; font-weight: 650; font-variant-numeric: tabular-nums; line-height: 1.2; pointer-events: none; } .detail-name { font-size: 18px; font-weight: 650; letter-spacing: 0.04em; } .detail-tags { display: flex; flex-wrap: wrap; justify-content: center; gap: 6px; flex: 0 0 auto; margin-bottom: 4px; } /* Skills / items tab bodies fill remaining #detail height under head+tabs. */ .detail-skills-layout, .detail-items-layout { flex: 1 1 auto; min-height: 0; width: 100%; overflow: hidden; } /* Skills tab: 血/蓝+三维 | 技能 | 攻击/防御/机动 */ .detail-skills-layout { display: flex; flex-direction: row; align-items: stretch; gap: 14px 16px; } .detail-items-layout { display: flex; flex-direction: column; } .detail-skills-stats { flex: 0 0 260px; width: 260px; min-width: 240px; max-width: 280px; min-height: 0; overflow: auto; scrollbar-width: thin; } .detail-skills-stats .hero-stats, .detail-skills-combat .hero-stats { margin: 0; height: 100%; box-sizing: border-box; } .detail-skills-main { flex: 1 1 auto; min-width: 0; min-height: 0; display: flex; flex-direction: column; overflow: hidden; } .detail-skills-main .hero-inspect { flex: 1 1 auto; height: auto; min-height: 0; max-height: none; /* Flex column so the skill panel fills the available height (set by .detail's fixed height) instead of growing past it and scrolling. */ display: flex; flex-direction: column; } .detail-skills-combat { flex: 0 0 340px; width: 340px; min-width: 280px; max-width: 380px; min-height: 0; overflow: auto; scrollbar-width: thin; } .detail-items-layout .detail-tab-body { flex: 0 0 auto; } .detail-items-layout .hero-inspect { flex: 1 1 auto; height: auto; min-height: 0; max-height: none; } /* Patches tab: scrollable per-version list of hero changes (past year). */ .detail-patches-layout { flex: 1 1 auto; min-height: 0; width: 100%; overflow: hidden; display: flex; flex-direction: column; } .detail-patches-layout .detail-tab-body { flex: 1 1 auto; min-height: 0; overflow: auto; scrollbar-width: thin; padding-right: 6px; } .patch-changes { display: flex; flex-direction: column; gap: 14px; padding: 2px 0 8px; width: 100%; max-width: 880px; margin: 0 auto; } .patch-change-version { border-left: 3px solid var(--line); padding: 0 0 4px 12px; } .patch-change-ver { font-size: 15px; font-weight: 700; color: var(--sel); margin-bottom: 4px; } .patch-change-date { font-size: 12px; font-weight: 400; color: var(--muted); margin-left: 8px; } @media (max-width: 900px) { .detail-skills-layout { flex-wrap: wrap; } .detail-skills-stats { flex: 1 1 240px; width: auto; max-width: none; } .detail-skills-main { flex: 1 1 100%; order: 3; } .detail-skills-combat { flex: 1 1 300px; width: auto; max-width: none; } } @media (max-width: 640px) { .detail-skills-layout { flex-direction: column; } .detail-skills-stats, .detail-skills-combat { flex: 0 0 auto; width: 100%; max-width: none; } .detail-skills-main { order: 0; } } .hero-stats { display: flex; flex-direction: column; align-items: stretch; gap: 14px; margin: 0 0 12px; padding: 14px; border: 1px solid var(--line); border-radius: 8px; background: rgba(6, 10, 16, 0.55); } .hero-stats-vitals { display: flex; flex-direction: column; gap: 8px; width: 100%; } .hero-stat-bar { position: relative; min-height: 28px; border-radius: 5px; font-size: 13px; font-variant-numeric: tabular-nums; line-height: 1.25; overflow: hidden; background: rgba(12, 18, 28, 0.72); box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.06); } .hero-stat-bar-track { position: absolute; inset: 0; overflow: hidden; border-radius: inherit; pointer-events: none; } .hero-stat-bar-fill { height: 100%; border-radius: inherit; transition: width 0.15s ease-out; } .hero-stat-bar.hp .hero-stat-bar-fill { background: linear-gradient(90deg, rgba(46, 140, 70, 0.92), rgba(28, 90, 48, 0.62)); box-shadow: inset 0 0 0 1px rgba(90, 200, 120, 0.28); } .hero-stat-bar.mana .hero-stat-bar-fill { background: linear-gradient(90deg, rgba(50, 100, 180, 0.95), rgba(30, 60, 120, 0.62)); box-shadow: inset 0 0 0 1px rgba(120, 170, 240, 0.3); } .hero-stat-bar-text { position: relative; z-index: 1; display: flex; align-items: center; justify-content: space-between; gap: 10px; min-height: 28px; padding: 5px 10px; } .hero-stat-bar-label { color: rgba(255, 255, 255, 0.78); letter-spacing: 0.06em; } .hero-stat-bar-val { font-weight: 650; color: #fff; } .hero-stat-bar-val small { margin-left: 8px; font-weight: 500; font-size: 12px; opacity: 0.88; } /* Vertical STR / AGI / INT stack (official bottom-bar spacing). */ .hero-stats-attrs { display: flex; flex-direction: column; align-items: stretch; gap: 10px; width: 100%; padding: 4px 2px 2px; } .hero-stat-attr { display: flex; align-items: center; gap: 12px; min-height: 36px; padding: 6px 10px; border-radius: 6px; border: 1px solid transparent; opacity: 0.78; font-variant-numeric: tabular-nums; } .hero-stat-attr.primary { opacity: 1; border-color: rgba(94, 200, 255, 0.45); background: rgba(94, 200, 255, 0.1); box-shadow: 0 0 10px rgba(94, 200, 255, 0.18); } .hero-stat-attr .attr-icon { width: 26px; height: 26px; flex: 0 0 auto; } .hero-stat-attr-base { font-size: 20px; font-weight: 700; line-height: 1; color: var(--text); min-width: 1.4em; } .hero-stat-attr-gain { margin-left: auto; font-size: 13px; color: var(--muted); letter-spacing: 0.02em; text-align: right; } /* Right-rail combat panel: Attack | Defense | Mobility side by side. */ .hero-stats-combat-panel { display: flex; flex-direction: column; justify-content: flex-start; gap: 0; padding: 12px 10px 10px; overflow: auto; scrollbar-width: thin; } .hero-stats-combat { display: grid; grid-template-columns: repeat(var(--combat-cols, 3), minmax(0, 1fr)); gap: 0 10px; width: 100%; flex: 1 1 auto; min-height: 0; margin: 0; padding: 0; border: none; } .hero-stats-combat-section { display: flex; flex-direction: column; min-width: 0; min-height: 0; padding: 0 6px; } .hero-stats-combat-section + .hero-stats-combat-section { border-left: 1px solid rgba(140, 170, 210, 0.14); } .hero-stats-combat-title { margin: 0 0 8px; padding: 0 0 5px; border-bottom: 1px solid rgba(140, 170, 210, 0.16); font-size: 11px; font-weight: 600; letter-spacing: 0.14em; color: var(--muted); text-align: center; } .hero-stats-combat-list { display: grid; grid-template-rows: repeat(var(--combat-rows, 3), minmax(0, 1fr)); flex: 1 1 auto; gap: 8px; margin: 0; } .hero-stat-row { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px; min-height: 0; padding: 0; font-variant-numeric: tabular-nums; line-height: 1.2; text-align: center; } .hero-stat-row dt { margin: 0; font-size: 11px; color: var(--muted); letter-spacing: 0.04em; } .hero-stat-row dd { margin: 0; font-size: 13px; font-weight: 650; color: var(--text); text-align: center; word-break: break-word; white-space: pre-line; } .hero-stat-row-sub { font-weight: 400; } .tag-chip { border: 1px solid rgba(94, 200, 255, 0.35); background: rgba(94, 200, 255, 0.1); color: var(--text); border-radius: 999px; padding: 3px 10px; font-size: 12px; } .detail-muted { color: var(--muted); font-size: 13px; } .detail-tabs { display: flex; justify-content: center; flex: 0 0 auto; gap: 0; margin: 0 0 12px; border-bottom: 1px solid var(--line); } .detail-tab { min-width: 96px; padding: 8px 16px; border: none; border-bottom: 2px solid transparent; margin-bottom: -1px; background: transparent; color: var(--muted); font: inherit; font-size: 14px; letter-spacing: 0.04em; cursor: pointer; } .detail-tab:hover { color: var(--text); } .detail-tab.active { color: var(--text); border-bottom-color: var(--sel); } .detail-tab-body { min-height: 48px; } .detail-tab-panel { padding-top: 2px; } .detail-abilities { display: flex; flex-direction: column; gap: 10px; } /* Inspect region under icon rows: fills leftover space inside the fixed #detail height. Tall recipe / skill text scrolls inside; empty state same box. */ .hero-inspect { margin-top: 12px; padding: 12px 4px 4px; border-top: 1px solid var(--line); box-sizing: border-box; overflow-x: hidden; overflow-y: auto; overscroll-behavior: contain; scrollbar-width: thin; } .hero-inspect.empty { display: flex; align-items: center; justify-content: center; color: var(--muted); font-size: 14px; letter-spacing: 0.04em; } /* Keep long Chinese inspect prose readable while icon rows use full width. */ .hero-inspect .item-detail-top { max-width: 720px; margin-left: auto; margin-right: auto; } /* Skill detail: official-page split — demo clip left, name/desc right. */ .hero-inspect .skill-info-body { max-width: 1320px; margin-left: auto; margin-right: auto; } .hero-inspect .item-detail-large-icon { width: 96px; height: 72px; } .hero-inspect .skill-info-head { margin-bottom: 8px; text-align: left; } .hero-inspect .skill-info-desc { text-align: left; } .hero-inspect .item-detail-name-row { justify-content: center; } .hero-inspect .item-detail-head { justify-content: center; } .hero-inspect .item-detail-recipe .craft-label, .hero-inspect .item-detail-upgrades .craft-label { text-align: center; } .hero-inspect .craft-row { justify-content: center; } .skill-icons { display: flex; flex-wrap: nowrap; gap: 10px; align-items: center; justify-content: center; width: 100%; min-width: 0; overflow-x: auto; overscroll-behavior-x: contain; scrollbar-width: thin; /* Headroom so the scaled-up selected icon is not clipped. */ padding: 7px; } .skill-icon { position: relative; width: 68px; height: 68px; padding: 0; border: 1px solid rgba(140, 170, 210, 0.28); border-radius: 6px; background: rgba(0, 0, 0, 0.35); cursor: pointer; overflow: hidden; flex: 0 0 auto; transition: transform 0.15s ease; } .skill-icon img { width: 100%; height: 100%; object-fit: cover; display: block; } .skill-icon img.missing { visibility: hidden; } /* Circular triggers: talent tree + innate (official dota2.com order). */ .skill-icon.talent-trigger, .skill-icon.innate { border-radius: 50%; border-color: rgba(180, 160, 100, 0.35); background: rgba(0, 0, 0, 0.5); overflow: hidden; } .skill-icon.talent-trigger img, .skill-icon.innate img { object-fit: contain; padding: 4px; } .skill-icon.talent-trigger[aria-expanded="true"], .skill-icon.innate.active { border-color: rgba(231, 210, 146, 0.85); box-shadow: 0 0 0 1px rgba(231, 210, 146, 0.45); } /* Selected = enlarged icon (dota2.com style), no outline. */ .skill-icon.active, .skill-icon.selected { transform: scale(1.14); z-index: 1; } .skill-icon.kind-shard { border-color: rgba(80, 160, 255, 0.55); } .skill-icon.kind-scepter { border-color: rgba(120, 200, 255, 0.55); } .skill-aghs-mark { position: absolute; right: 2px; bottom: 2px; font-size: 13px; line-height: 1; padding: 3px 4px; border-radius: 3px; background: rgba(60, 140, 230, 0.95); color: #fff; pointer-events: none; } .skill-icon.kind-scepter .skill-aghs-mark { background: rgba(90, 180, 230, 0.95); color: #0b1520; font-weight: 700; min-width: 1.1em; text-align: center; } .skill-info { min-width: 0; padding: 10px 12px; border: 1px solid var(--line); border-radius: 8px; background: rgba(0, 0, 0, 0.28); } .skill-info-head { margin-bottom: 8px; } .skill-info-titles { min-width: 0; } .skill-info-name { font-size: 17px; font-weight: 700; letter-spacing: 0.04em; } .skill-info-label { margin-top: 3px; font-size: 13px; color: var(--syn); } .skill-info-label.shard { color: #6eb6ff; } .skill-info-label.scepter { color: #9fd4ff; } .skill-info-dispel { margin-top: 3px; font-size: 12px; color: var(--bad); } .skill-info-desc { font-size: 13px; line-height: 1.4; color: rgba(232, 238, 247, 0.88); /* Keep Valve paragraph breaks; collapse runs of spaces. Prefer one line when the detail column is wide enough (see video/main flex share below). */ white-space: pre-line; } .skill-info-body { display: flex; flex-wrap: wrap; gap: 18px 24px; align-items: flex-start; /* Spare width goes into the text column instead of centering a squeezed pair. */ justify-content: flex-start; /* Fill the hero-inspect column so the video's 16:9 intrinsic height can no longer push the row past the viewport and trigger a scrollbar. */ flex: 1 1 auto; min-height: 0; } .skill-info-main { flex: 1 1 420px; min-width: 0; /* Cap when alone (no demo clip). With a video sibling, allow a wider column so ability blurbs stay on one line when the panel has room. */ max-width: 760px; /* height:100% pins this column to the body's definite height (same trick as the video) — align-self:stretch alone fails to shrink a column whose content is taller than the row. overflow-y:auto then keeps any overflow inside the detail column so the video beside it never scrolls. */ height: 100%; min-height: 0; display: flex; flex-direction: column; overflow-x: hidden; overflow-y: auto; scrollbar-width: thin; } .skill-info-body:has(> .skill-info-video) .skill-info-main { max-width: 920px; flex: 1 1 480px; } /* height:100% resolves against the definite body height (set by the flex chain from .detail's fixed height), so the 16:9 intrinsic ratio can no longer push the player past the viewport — align-self:stretch alone can't shrink a replaced element below its intrinsic size. cover crops to fill. */ .skill-info-video { flex: 1 1 380px; max-width: 560px; min-width: 0; min-height: 0; height: 100%; max-height: 100%; object-fit: cover; border-radius: 6px; border: 1px solid rgba(255, 255, 255, 0.08); background: #000; } /* Params panel, dota2.com.cn style: a two-column "generic" grid of meta attributes + a flowing grid of special values. Filling the column with several short columns avoids the wide empty band a single stretched label/value list leaves on the right. */ .skill-params { margin-top: 10px; } .skill-generic { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: 20px; row-gap: 4px; } .skill-specific { display: grid; /* Wider tracks so multi-level values ("0.7 / 0.9 / 1.1 / 1.3") stay on one line beside the label instead of leaving an empty band to the right. */ grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 4px 20px; margin-top: 8px; padding-top: 8px; border-top: 1px solid rgba(140, 170, 210, 0.14); } .skill-param { display: flex; flex-wrap: wrap; align-items: baseline; column-gap: 4px; min-width: 0; font-size: 13px; line-height: 1.45; } .skill-param-label { flex: 0 0 auto; letter-spacing: 0.04em; color: var(--muted); } .skill-param-value { flex: 1 1 auto; min-width: 0; color: #fff; font-weight: 600; /* Keep "0.7 / 0.9 / 1.1 / 1.3" on one line; grid adds columns instead of stacking each tier vertically in a squeezed value span. */ white-space: nowrap; } /* Cooldown / mana + lore sink together so lore cannot overflow past the column after margin-top:auto on costs alone. */ .skill-info-foot { margin-top: auto; padding-top: 10px; flex: 0 0 auto; } /* Cooldown / mana footer. Mana glyph is the official CSS gradient square; cooldown uses the downloaded dota2.com.cn cooldown.png. */ .skill-bottom { display: flex; align-items: center; justify-content: space-between; gap: 26px; width: 100%; } .skill-stat { display: inline-flex; align-items: center; gap: 8px; } .skill-stat-icon { width: 18px; height: 18px; border-radius: 3px; object-fit: cover; display: inline-block; } .skill-stat-icon.mana { background: linear-gradient(#00a4db, #007196); box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.18); } .skill-stat-text { color: #fff; font-size: 14px; font-weight: 600; letter-spacing: 0.02em; } .skill-stat.cooldown .skill-stat-text { color: rgba(232, 238, 247, 0.92); } .skill-info-lore { margin-top: 8px; padding-top: 6px; border-top: 1px solid rgba(140, 170, 210, 0.12); font-size: 12px; font-style: italic; color: rgba(232, 238, 247, 0.45); } /* Floating talent popover (fixed to viewport; anchored above tree icon). */ .talent-popover { position: fixed; z-index: 80; width: min(520px, calc(100vw - 24px)); padding: 14px 14px 18px; pointer-events: auto; border-radius: 8px; border: 1px solid rgba(140, 170, 210, 0.14); background: linear-gradient(150deg, rgba(88, 98, 110, 0.97), rgba(14, 18, 24, 0.99)); box-shadow: 0 12px 32px rgba(0, 0, 0, 0.5); } .talent-popover .talent-tree { display: flex; flex-direction: column; gap: 8px; } .talent-tree-label { margin: 0; color: #fff; font-size: 15px; font-weight: 600; letter-spacing: 0.2em; text-align: center; } .talent-rows { display: flex; flex-direction: column; gap: 7px; } .talent-row { display: flex; align-items: center; justify-content: center; gap: 10px; min-height: 40px; padding: 0 12px; background: linear-gradient(150deg, rgb(52, 58, 64), rgb(10, 12, 14)); } .talent-cell { flex: 1 1 0; min-width: 0; min-height: 0; display: flex; align-items: center; justify-content: center; padding: 6px 4px; border: none; border-radius: 0; background: transparent; color: rgba(255, 255, 255, 0.78); font-size: 12px; line-height: 1.3; text-align: center; } .talent-level { flex: 0 0 auto; width: 40px; height: 40px; padding: 3px; border-radius: 50%; display: flex; align-items: center; justify-content: center; background: linear-gradient(325deg, rgb(60, 66, 71), rgb(10, 12, 14)); } .talent-level-num { width: 100%; height: 100%; border-radius: 50%; display: flex; align-items: center; justify-content: center; background: #222; color: #e7d292; font-size: 14px; font-weight: 700; text-shadow: 0 0 8px rgb(255, 83, 28); } /* Downward caret: outer triangle = panel border; ::after fill = panel charcoal (not #000). */ .talent-popover .talent-tree-beak { --talent-beak-fill: rgb(36, 42, 50); --talent-beak-line: rgba(140, 170, 210, 0.22); position: absolute; left: 50%; bottom: -9px; width: 0; height: 0; transform: translateX(-50%); border: 0; border-left: 9px solid transparent; border-right: 9px solid transparent; border-top: 9px solid var(--talent-beak-line); background: transparent; border-radius: 0; pointer-events: none; } .talent-popover .talent-tree-beak::after { content: ""; position: absolute; left: -8px; top: -9px; width: 0; height: 0; border-left: 8px solid transparent; border-right: 8px solid transparent; border-top: 8px solid var(--talent-beak-fill); } .talent-popover.below .talent-tree-beak { --talent-beak-fill: rgb(56, 64, 74); top: -9px; bottom: auto; border-top: 0; border-bottom: 9px solid var(--talent-beak-line); } .talent-popover.below .talent-tree-beak::after { top: auto; bottom: -9px; border-top: 0; border-bottom: 8px solid var(--talent-beak-fill); } .detail-items { display: flex; flex-direction: column; align-items: center; gap: 8px; width: 100%; min-width: 0; } .item-list { display: flex; flex-wrap: nowrap; gap: 8px; align-items: center; justify-content: center; width: 100%; min-width: 0; overflow-x: auto; overscroll-behavior-x: contain; scrollbar-width: thin; /* Headroom so the scaled-up selected item is not clipped. */ padding: 6px; } .fear-item { display: block; flex: 0 0 88px; min-width: 0; } .fear-item .item { width: 88px; height: 66px; } /* Matches tab: scrollable recent-match list within fixed detail height. */ .detail-matches-layout { flex: 1 1 auto; min-height: 0; width: 100%; overflow: hidden; display: flex; flex-direction: column; } .detail-matches-layout .detail-tab-body { flex: 1 1 auto; min-height: 0; overflow: auto; scrollbar-width: thin; padding-right: 6px; } .detail-matches-panel { display: flex; flex-direction: column; gap: 14px; width: 100%; min-width: 0; max-width: none; margin: 0; padding: 4px 4px 12px; box-sizing: border-box; } .match-list { display: flex; flex-direction: column; gap: 14px; width: 100%; } .match-card { display: flex; flex-direction: column; gap: 12px; padding: 14px 16px 16px; border-radius: 8px; background: rgba(0, 0, 0, 0.28); border: 1px solid rgba(140, 170, 210, 0.18); border-left: 4px solid rgba(160, 170, 190, 0.55); } .match-card.is-win { border-left-color: rgba(90, 190, 120, 0.9); } .match-card.is-loss { border-left-color: rgba(210, 90, 90, 0.9); } .match-card-head { display: flex; flex-wrap: wrap; align-items: center; gap: 10px 14px; font-size: 15px; color: rgba(220, 230, 245, 0.88); } .match-result { font-weight: 700; font-size: 16px; min-width: 1.6em; } .match-card.is-win .match-result { color: rgba(120, 220, 150, 0.95); } .match-card.is-loss .match-result { color: rgba(230, 130, 130, 0.95); } .match-hero { display: inline-flex; align-items: center; gap: 8px; padding: 0; margin: 0; border: 0; background: transparent; color: inherit; cursor: pointer; font: inherit; max-width: 9.5em; } .match-hero:hover .match-hero-name { color: rgba(255, 220, 160, 0.95); } .match-hero-icon { width: 36px; height: 20px; object-fit: cover; border-radius: 3px; flex: 0 0 auto; background: rgba(0, 0, 0, 0.25); } .match-hero-name { font-size: 14px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .match-kda { font-variant-numeric: tabular-nums; letter-spacing: 0.02em; font-weight: 600; } .match-duration, .match-time { color: rgba(180, 195, 215, 0.75); font-variant-numeric: tabular-nums; } .match-origin { padding: 2px 8px; border-radius: 4px; font-size: 12px; background: rgba(100, 130, 180, 0.25); color: rgba(200, 215, 235, 0.9); } .match-origin-china { background: rgba(180, 90, 70, 0.28); color: rgba(255, 210, 190, 0.95); } .match-origin-pro { background: rgba(180, 130, 40, 0.28); color: rgba(255, 220, 160, 0.95); } .match-league { max-width: min(360px, 40vw); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: rgba(190, 205, 225, 0.8); } .match-opendota { color: rgba(140, 180, 230, 0.95); text-decoration: none; font-size: 14px; } .match-opendota:hover { text-decoration: underline; } .match-links { margin-left: auto; display: inline-flex; gap: 12px; align-items: center; } .match-player { display: inline-flex; align-items: center; gap: 8px; min-width: 0; max-width: min(360px, 45vw); } .match-rank-icon { width: 28px; height: 28px; object-fit: contain; flex: 0 0 auto; } .match-player-name { color: rgba(230, 235, 245, 0.95); font-weight: 650; font-size: 15px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-decoration: none; } a.match-player-name:hover { color: rgba(160, 200, 255, 0.98); text-decoration: underline; } .match-rank-label { flex: 0 0 auto; font-size: 13px; color: rgba(180, 195, 215, 0.8); } .match-items, .match-backpack { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; } .match-skills { display: flex; flex-wrap: nowrap; gap: 5px; align-items: center; } .match-inv { display: flex; flex-direction: column; gap: 8px; align-items: flex-start; } .match-items { gap: 8px; } .match-backpack { gap: 8px; padding-left: 2px; } .match-backpack-glyph { display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 42px; color: rgba(200, 210, 225, 0.82); flex: 0 0 auto; opacity: 0.92; } .match-backpack-glyph svg { display: block; width: 20px; height: 36px; } .match-neutral-slot { display: inline-flex; margin-left: 12px; } .match-icon { position: relative; display: inline-flex; width: 56px; height: 42px; border-radius: 4px; overflow: hidden; background: rgba(0, 0, 0, 0.35); border: 1px solid rgba(140, 170, 210, 0.22); flex: 0 0 auto; align-items: center; justify-content: center; font-size: 11px; color: rgba(200, 210, 230, 0.7); } .match-icon-time { position: absolute; left: 0; right: 0; bottom: 0; padding: 6px 1px 1px; background: linear-gradient( to top, rgba(0, 0, 0, 0.88) 35%, rgba(0, 0, 0, 0) ); color: rgba(245, 248, 255, 0.96); font-size: 10px; line-height: 1.15; text-align: center; font-variant-numeric: tabular-nums; pointer-events: none; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.85); } .match-icon img { width: 100%; height: 100%; object-fit: cover; display: block; } .match-icon.missing { opacity: 0.55; } .match-ability { width: 40px; height: 40px; border-radius: 5px; } .match-ability-lv { position: absolute; right: 0; bottom: 0; min-width: 14px; padding: 0 3px; font-size: 10px; line-height: 1.25; text-align: center; background: rgba(0, 0, 0, 0.75); color: rgba(240, 245, 255, 0.95); font-variant-numeric: tabular-nums; } .item { position: relative; display: inline-flex; width: 72px; height: 54px; padding: 0; border-radius: 4px; overflow: hidden; background: rgba(0, 0, 0, 0.35); border: 1px solid rgba(140, 170, 210, 0.22); flex: 0 0 auto; cursor: pointer; transition: transform 0.15s ease; } .item:hover:not(:disabled) { border-color: rgba(232, 200, 120, 0.95); } /* Selected = enlarged icon (dota2.com style), no outline. */ .item.selected { transform: scale(1.12); z-index: 1; } .item:disabled { cursor: default; } .item img { width: 100%; height: 100%; object-fit: contain; display: block; } /* In-client draft: str/agi/int 6 cols, universal 4 cols. */ .columns { display: grid; grid-template-columns: 6fr 6fr 6fr 4fr; gap: 22px; align-items: start; width: 100%; } .col { min-width: 0; } .col-head { display: flex; align-items: center; gap: 8px; margin: 0 0 8px 2px; font-size: 15px; font-weight: 600; letter-spacing: 0.08em; } .attr-icon { width: 22px; height: 22px; object-fit: contain; display: block; flex: 0 0 auto; } .grid { display: grid; gap: 2px; align-content: start; } .hero { position: relative; width: 100%; aspect-ratio: 16 / 9; border: none; border-radius: 0; overflow: hidden; cursor: pointer; background: #0a0e14; padding: 0; } .hero img { width: 100%; height: 100%; object-fit: contain; object-position: center center; display: block; filter: saturate(1.02) contrast(1.04); transition: transform 0.15s ease, filter 0.15s ease, opacity 0.15s ease; } .hero:hover img { transform: scale(1.06); } .hero.selected { outline: 2px solid var(--sel); outline-offset: 1px; z-index: 3; } .hero.dim img { filter: grayscale(0.55) brightness(0.38); opacity: 0.72; } .hero.related { z-index: 2; } .hero.related.is-counter { box-shadow: inset 0 0 0 2px rgba(61, 206, 122, 0.85); } .hero.related.is-countered { box-shadow: inset 0 0 0 2px rgba(224, 122, 47, 0.9); } .hero.related.is-synergy { box-shadow: inset 0 0 0 2px rgba(126, 200, 255, 0.9); } .hero.related.is-counter.is-countered, .hero.related.is-counter.is-synergy, .hero.related.is-countered.is-synergy { box-shadow: inset 0 0 0 2px rgba(61, 206, 122, 0.75), 0 0 0 2px rgba(224, 122, 47, 0.55); } .marks { position: absolute; left: 3px; top: 3px; display: flex; gap: 3px; pointer-events: none; z-index: 2; } .marks span { display: inline-flex; align-items: center; justify-content: center; font-size: 14px; font-weight: 700; line-height: 1; text-shadow: 0 0 2px rgba(0, 0, 0, 0.9), 0 1px 1px rgba(0, 0, 0, 0.7); } /* 克制 */ .marks .m-counter { color: var(--good); } /* 被克制 */ .marks .m-countered { color: var(--bad); } /* 搭档 */ .marks .m-synergy { color: var(--syn); } /* 选中:青色勾选徽标 */ .marks .m-sel { width: 18px; height: 18px; border-radius: 4px; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.55); background-color: rgba(94, 200, 255, 0.95); background-repeat: no-repeat; background-position: center; background-size: 12px 12px; background-image: url("data:image/svg+xml;utf8,"); } @media (max-width: 1200px) { .columns { gap: 14px; } } @media (max-width: 900px) { .columns { grid-template-columns: 1fr 1fr; gap: 14px; } } /* —— Items shop page —— */ .item-tools { display: flex; align-items: center; justify-content: flex-end; width: 100%; gap: 10px; } .search-inline { position: static; transform: none; width: 220px; } /* Items page: pin body to the viewport so #items-view (not ) scrolls. Otherwise sticky detail sticks to the window and paints over shop columns. */ body:has(#items-view:not(.hidden)) { height: 100dvh; max-height: 100dvh; overflow: hidden; } /* Shop + detail as a centered cluster; detail sticks while shop scrolls. */ .items-board { display: block; position: relative; flex: 1 1 auto; min-height: 0; padding: 12px 16px 24px; overflow: auto; } .items-cluster { display: grid; grid-template-columns: max-content 320px; align-items: start; column-gap: 16px; width: max-content; margin: 0 auto; } .items-main { width: max-content; display: flex; flex-direction: column; gap: 10px; min-width: 0; grid-column: 1; } .item-detail-box { grid-column: 2; position: sticky; top: 12px; align-self: start; z-index: 1; width: 320px; height: fit-content; /* Cap to the items-board scrollport while sticky. */ max-height: calc(100dvh - 9rem); overflow: auto; padding: 14px 14px 16px; border: 1px solid var(--line); border-radius: 10px; background: rgba(8, 12, 20, 0.92); } .item-detail-box.empty { display: flex; align-items: center; justify-content: center; min-height: 0; padding: 16px 14px; color: var(--muted); font-size: 14px; letter-spacing: 0.04em; text-align: center; } .item-detail-top { display: flex; flex-direction: column; gap: 12px; } .item-detail-name-row { display: flex; flex-wrap: wrap; align-items: baseline; gap: 8px 12px; } .item-detail-name { font-size: 18px; font-weight: 650; letter-spacing: 0.04em; } .item-detail-head { display: flex; gap: 12px; align-items: flex-start; } .item-detail-large-icon { width: 88px; height: 66px; object-fit: contain; border: 1px solid rgba(200, 160, 70, 0.55); border-radius: 4px; background: rgba(0, 0, 0, 0.35); flex: 0 0 auto; } .item-detail-info { min-width: 0; flex: 1 1 auto; } .item-detail-recipe, .item-detail-upgrades { margin-top: 4px; padding-top: 12px; border-top: 1px solid var(--line); } .item-detail-recipe .craft-label, .item-detail-upgrades .craft-label { display: block; margin: 0 0 8px; } .shop-col-headers { width: 100%; display: grid; grid-template-columns: 5fr 6fr; gap: 12px; padding: 0 4px; color: #d9d9d9; font-size: 15px; letter-spacing: 0.08em; } .shop-col-header.upgraded { padding-left: 8px; } .item-shop { width: 100%; } .item-shop.empty { color: var(--muted); text-align: center; padding: 40px 12px; } .item-shop.layout-cn { display: flex; justify-content: center; align-items: flex-start; gap: 18px; overflow-x: auto; /* Headroom so scaled-up selected items are not clipped. */ padding: 6px 6px 8px; } .shop-group { display: flex; align-items: flex-start; gap: 4px; } .shop-column { width: 70px; flex: 0 0 70px; display: flex; flex-direction: column; align-items: center; gap: 0; } .shop-column-cat { width: 49px; height: 49px; object-fit: contain; margin-bottom: 6px; } .shop-column-label { margin: 0 0 8px; min-height: 28px; color: #c0c0c0; font-size: 13px; font-weight: 500; text-align: center; line-height: 1.2; } .shop-item { position: relative; width: 70px; height: 53px; margin: 0 0 5px; padding: 0; border: 1px solid rgba(200, 160, 70, 0.45); border-radius: 2px; background: #000; cursor: pointer; overflow: hidden; transition: transform 0.15s ease; } .shop-item img { width: 100%; height: 100%; object-fit: contain; display: block; } .shop-item:hover { border-color: rgba(232, 200, 120, 0.95); } /* Selected = enlarged icon (dota2.com style), no outline. */ .shop-item.selected { transform: scale(1.1); z-index: 1; } .shop-charges { position: absolute; right: 2px; bottom: 1px; font-size: 11px; font-weight: 700; color: #fff; text-shadow: 0 0 2px #000, 0 1px 2px #000; pointer-events: none; } .detail-item-cost { color: #e8c878; font-size: 15px; font-weight: 650; letter-spacing: 0.04em; } .craft-label { color: var(--muted); font-size: 12px; letter-spacing: 0.1em; } .craft-row { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; } .craft-chip { position: relative; width: 52px; height: 39px; padding: 0; border: 1px solid rgba(200, 160, 70, 0.55); border-radius: 3px; background: rgba(0, 0, 0, 0.4); cursor: pointer; overflow: hidden; } .craft-chip:hover:not(:disabled) { border-color: rgba(232, 200, 120, 0.95); } .craft-chip:disabled { cursor: default; opacity: 1; } .craft-chip.is-recipe { border-color: rgba(160, 170, 190, 0.55); } .craft-chip img { width: 100%; height: 100%; object-fit: contain; display: block; } .craft-recipe-cost { position: absolute; left: 0; right: 0; bottom: 0; font-size: 10px; font-weight: 700; color: #e8c878; text-align: center; background: rgba(0, 0, 0, 0.65); text-shadow: 0 0 2px #000; pointer-events: none; } .craft-upgrades .craft-chip { width: 48px; height: 36px; } @media (max-width: 1100px) { .items-cluster { grid-template-columns: 1fr; width: min(920px, 100%); row-gap: 12px; } .items-main { width: min(920px, 100%); grid-column: 1; grid-row: 2; } .item-detail-box { grid-column: 1; grid-row: 1; top: 8px; width: min(920px, 100%); max-height: min(42vh, 360px); margin: 0 auto; z-index: 1; } } @media (max-width: 720px) { .item-tools { justify-content: center; } .shop-col-headers { grid-template-columns: 1fr; } } .patches-board { display: flex; flex-direction: column; align-items: center; overflow-y: auto; } .patches-header { display: flex; align-items: center; justify-content: space-between; gap: 16px; width: min(820px, 92%); padding: 26px 0 10px; } .patches-title { margin: 0; display: flex; flex-direction: column; align-items: flex-start; gap: 4px; } .patches-kicker { font-size: 15px; font-weight: 600; color: var(--muted); letter-spacing: 0.14em; } .patches-ver { font-size: 40px; font-weight: 800; color: var(--text); letter-spacing: 0.02em; line-height: 1; } #patch-select { flex: 0 1 auto; max-width: 360px; padding: 9px 14px; border-radius: 6px; border: 1px solid var(--line); background: var(--panel); color: var(--text); font-size: 14px; font-family: var(--font); cursor: pointer; } #patch-select:focus-visible { outline: 2px solid var(--sel); outline-offset: 1px; } .patches-detail { width: min(820px, 92%); padding: 6px 0 64px; } .patches-empty { padding: 48px 0; text-align: center; color: var(--muted); font-size: 14px; } .patches-site-version { width: min(820px, 92%); padding: 4px 0 28px; text-align: center; font-size: 11px; font-weight: 500; color: var(--muted); letter-spacing: 0.08em; opacity: 0.55; user-select: none; } .rankings-board { overflow-x: hidden; overflow-y: auto; } .rankings-cluster { display: flex; justify-content: center; width: 100%; box-sizing: border-box; padding: 28px 0 64px; } .rankings-center-wrap { position: relative; width: min(640px, calc(100% - 48px)); flex: 0 0 auto; } .rankings-body { width: 100%; min-width: 0; } .rankings-aside { position: absolute; left: calc(100% + 20px); top: 4px; width: max-content; min-width: 200px; display: flex; flex-direction: column; align-items: flex-start; gap: 14px; } .rankings-title { margin: 0; width: max-content; } .rankings-title-row { display: inline-flex; align-items: center; gap: 8px; position: relative; flex-wrap: nowrap; white-space: nowrap; } .rankings-kicker { font-size: 22px; font-weight: 800; color: var(--text); letter-spacing: 0.02em; line-height: 1.1; white-space: nowrap; } .rankings-info-btn { position: relative; right: auto; bottom: auto; flex-shrink: 0; } .rankings-sub { margin: 0; font-size: 13px; font-weight: 500; color: var(--muted); line-height: 1.4; } .rankings-regions { display: flex; flex-direction: column; flex-wrap: nowrap; gap: 8px; width: 100%; } .rankings-region-btn { padding: 7px 14px; border-radius: 6px; border: 1px solid var(--line); background: var(--panel); color: var(--text); font-size: 13px; font-family: var(--font); font-weight: 600; cursor: pointer; text-align: left; } .rankings-region-btn:hover { border-color: var(--sel); } .rankings-region-btn.active { background: var(--sel); border-color: var(--sel); color: #0b0d10; } .rankings-region-btn:focus-visible { outline: 2px solid var(--sel); outline-offset: 1px; } .matches-board .matches-body { min-height: 0; width: 100%; min-width: 0; } .matches-board .rankings-center-wrap.matches-center-wrap { align-items: stretch; /* Fixed column width so cards align; ~lv30 skill row + a little slack. */ width: min(1680px, 100%, calc(100vw - 280px)); } .matches-board .match-list, .matches-board .match-card { width: 100%; max-width: 100%; box-sizing: border-box; } .matches-board .match-skills { max-width: 100%; } @media (max-width: 1460px) { .match-skills { flex-wrap: wrap; } } .matches-board .rankings-aside { align-items: stretch; } .matches-origins, .matches-players { display: flex; flex-direction: column; gap: 6px; width: 100%; } .matches-board .rankings-aside .rankings-region-btn { width: 100%; box-sizing: border-box; } .matches-board .match-list { gap: 12px; } .matches-page-wrap { display: flex; flex-direction: column; gap: 16px; width: 100%; } .matches-foot { display: flex; flex-direction: column; align-items: center; gap: 10px; padding: 4px 0 8px; } .matches-foot-summary { margin: 0; font-size: 13px; font-weight: 500; color: var(--muted); line-height: 1.4; text-align: center; } .matches-pager { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 6px; padding: 0; } .matches-pager-btn { min-width: 36px; height: 34px; padding: 0 10px; border-radius: 6px; border: 1px solid rgba(140, 170, 210, 0.28); background: rgba(0, 0, 0, 0.28); color: rgba(220, 230, 245, 0.9); font: inherit; font-size: 13px; cursor: pointer; } .matches-pager-btn:hover:not(:disabled):not(.active) { border-color: rgba(180, 200, 230, 0.55); color: #fff; } .matches-pager-btn.active { border-color: rgba(232, 200, 120, 0.75); background: rgba(180, 130, 40, 0.28); color: rgba(255, 220, 160, 0.98); cursor: default; } .matches-pager-btn:disabled { opacity: 0.4; cursor: default; } .matches-pager-ell { color: rgba(160, 175, 195, 0.7); padding: 0 2px; user-select: none; } .rankings-empty { padding: 48px 0; text-align: center; color: var(--muted); font-size: 14px; } .rankings-table { width: 100%; border-collapse: collapse; border-spacing: 0; font-size: 14px; } .rankings-table th, .rankings-table td { padding: 9px 10px; border-bottom: 1px solid var(--line); text-align: left; vertical-align: middle; line-height: 1.4; } .rankings-table th { font-size: 12px; font-weight: 600; color: var(--muted); letter-spacing: 0.06em; } .rankings-table tbody tr:hover td { background: rgba(255, 255, 255, 0.03); } .rankings-rank { width: 64px; text-align: right; font-variant-numeric: tabular-nums; font-weight: 700; color: var(--muted); } .rankings-table td.rankings-rank { color: var(--text); } .rankings-name { font-weight: 600; color: var(--text); } .rankings-table th.rankings-team, .rankings-table td.rankings-team { width: 88px; text-align: center; font-size: 12px; font-weight: 600; color: var(--sel); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .rankings-table th.rankings-team { color: var(--muted); } .rankings-table th.rankings-country, .rankings-table td.rankings-country { width: 96px; text-align: center; font-size: 12px; font-weight: 600; color: var(--muted); letter-spacing: 0; white-space: nowrap; } @media (max-width: 900px) { .rankings-cluster { padding: 20px 0 64px; } .rankings-center-wrap { display: flex; flex-direction: column-reverse; gap: 18px; width: min(640px, 94%); } .matches-board .rankings-center-wrap.matches-center-wrap { width: min(1680px, 94%); } .rankings-aside { position: static; width: 100%; } .rankings-regions { flex-direction: row; flex-wrap: wrap; } .rankings-region-btn { text-align: center; } } /* Top-level 走势 board (8-week win/pick trends) */ .trends-board .trends-center-wrap { width: min(1080px, calc(100% - 48px)); } .trends-brackets { width: 100%; } .trends-brackets .bracket-icon-picker { flex-wrap: wrap; justify-content: flex-start; gap: 8px; max-width: 340px; } .trends-brackets .bracket-icon-wrap { flex: 0 0 auto; max-width: none; } .trends-brackets .bracket-icon-btn { width: 72px; height: 72px; border-radius: 8px; padding: 3px; } .trends-brackets .bracket-icon-btn img { width: 64px; height: 64px; } .trends-sort { display: flex; flex-wrap: wrap; gap: 6px; margin: 10px 0 0; } .trends-sort-btn { border: 1px solid rgba(255, 255, 255, 0.12); background: transparent; color: inherit; padding: 4px 10px; font-size: 12px; cursor: pointer; } .trends-sort-btn:hover { border-color: rgba(255, 255, 255, 0.28); } .trends-sort-btn.active { border-color: #7eb6ff; color: #7eb6ff; } .trends-table { font-size: 13px; } .trends-table thead th { text-align: center; white-space: nowrap; } .trends-table thead th.rankings-rank, .trends-table tbody td.rankings-rank { text-align: right; } .trends-table thead th:nth-child(2), .trends-table tbody td.meta-hero { text-align: left; } .trends-group { letter-spacing: 0.08em; border-bottom: 1px solid var(--line); } .trends-group.trends-sort-th { cursor: pointer; user-select: none; } .trends-group-wr { color: #7dcea0; } .trends-group-pr { color: #7ec8ff; } .trends-table tbody tr.trends-row { cursor: pointer; } .trends-num, .trends-delta { font-variant-numeric: tabular-nums; text-align: center; white-space: nowrap; } .trends-end { font-weight: 700; color: var(--sel); } .trends-delta.is-up { color: var(--good); } .trends-delta.is-down { color: #e86a6a; } .trends-delta.is-flat { color: var(--muted); } .trends-sort-th { cursor: pointer; user-select: none; } .trends-sort-th:hover { color: var(--text); } .trends-sort-th.is-active { color: var(--sel); } .trends-spark-cell { text-align: center; padding-left: 4px; padding-right: 4px; vertical-align: middle; } .trends-spark { display: inline-block; vertical-align: middle; overflow: visible; } .trends-spark .trends-spark-line { stroke-width: 1.2; stroke-linejoin: round; stroke-linecap: round; } .trends-spark.is-wr .trends-spark-line, .trends-spark.is-wr .trends-spark-dot { stroke: #3dce7a; fill: #3dce7a; } .trends-spark.is-pr .trends-spark-line, .trends-spark.is-pr .trends-spark-dot { stroke: #7ec8ff; fill: #7ec8ff; } .trends-spark-empty { color: var(--muted); font-size: 12px; } @media (max-width: 1100px) { .trends-board .trends-center-wrap { width: min(1080px, 96%); } } @media (max-width: 900px) { .trends-board .rankings-body { overflow-x: auto; } .trends-table { min-width: 860px; } .trends-brackets .bracket-icon-picker { max-width: 100%; } } .patch-section { margin-top: 26px; } .patch-section-title { margin: 0 0 14px; padding-bottom: 7px; font-size: 18px; font-weight: 700; color: var(--sel); border-bottom: 1px solid var(--line); letter-spacing: 0.03em; } .patch-sub-title { margin: 16px 0 8px; font-size: 15px; font-weight: 600; color: var(--syn); } .patch-general { margin-bottom: 8px; } .patch-entry-row, .patch-ability { display: flex; align-items: flex-start; gap: 14px; padding: 10px 4px; } .patch-entry-body { flex: 1 1 auto; min-width: 0; } .patch-item-icon, .patch-ability-icon { flex: 0 0 auto; border-radius: 6px; object-fit: contain; border: 1px solid var(--line); } .patch-item-icon { /* Match Steam CDN item icon aspect (88x64) so contain fills with no bands. */ width: 66px; height: 48px; } .patch-ability-icon { width: 48px; height: 48px; margin-top: 2px; } .patch-name { display: block; margin-bottom: 4px; font-size: 15px; font-weight: 600; color: var(--text); } .patch-ability .patch-name { font-weight: 500; } .patch-hero { padding: 14px 16px; margin-bottom: 12px; border-radius: 8px; background: rgba(94, 200, 255, 0.04); border: 1px solid var(--line); } .patch-hero-head { display: flex; align-items: center; gap: 14px; margin-bottom: 8px; } .patch-hero-icon { width: 112px; aspect-ratio: 16 / 9; flex: 0 0 auto; border-radius: 6px; object-fit: contain; object-position: center center; background: #0a0e14; border: 1px solid var(--line); filter: saturate(1.02) contrast(1.04); } .patch-hero-head .patch-name { margin-bottom: 0; font-size: 17px; } .patch-notes { list-style: none; margin: 4px 0; padding: 0; } .patch-notes li { position: relative; padding-left: 18px; font-size: 14px; line-height: 1.6; color: var(--text); } .patch-notes li::before { content: "•"; position: absolute; left: 2px; color: var(--muted); } .patch-notes li.hide-dot, .patch-notes li.patch-spacer { padding-left: 0; } .patch-notes li.hide-dot::before, .patch-notes li.patch-spacer::before { content: ""; } .patch-notes li.patch-spacer { height: 6px; } .patch-hero-notes { margin: 2px 0 8px; } .stat-chip { display: inline-block; margin-right: 6px; padding: 1px 7px; border-radius: 3px; font-size: 11.5px; background: rgba(126, 200, 255, 0.14); color: var(--syn); vertical-align: 1px; } .stat-icon { width: 18px; height: 18px; margin-right: 6px; vertical-align: -4px; object-fit: contain; } /* Top-level 机制 query (applies-effect skills + items) */ .mechanics-board .mechanics-center-wrap { width: min(860px, calc(100% - 48px)); } .mechanics-effects { display: flex; flex-direction: column; gap: 14px; width: 100%; } .mechanics-group { display: flex; flex-direction: column; gap: 8px; width: 100%; } .mechanics-group-label { font-size: 12px; font-weight: 700; color: var(--muted); letter-spacing: 0.04em; } .mechanics-body { display: flex; flex-direction: column; gap: 22px; } .mechanics-blurb { margin: 0; padding: 14px 16px; border: 1px solid var(--line); border-radius: 8px; background: rgba(255, 255, 255, 0.03); } .mechanics-blurb-title { margin: 0 0 8px; font-size: 18px; font-weight: 800; color: var(--text); letter-spacing: 0.02em; } .mechanics-blurb-text { margin: 0; font-size: 13.5px; line-height: 1.55; color: var(--muted); font-weight: 500; } .mechanics-section-title { margin: 0 0 10px; font-size: 16px; font-weight: 800; color: var(--text); } .mechanics-count { font-size: 13px; font-weight: 600; color: var(--muted); } .mechanics-list { display: flex; flex-direction: column; gap: 6px; } .mechanics-skill-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(148px, 1fr)); gap: 10px; } .mechanics-skill-card { display: flex; flex-direction: column; align-items: stretch; gap: 0; width: 100%; padding: 0; overflow: hidden; border-radius: 8px; border: 1px solid var(--line); background: var(--panel); color: var(--text); font-family: var(--font); cursor: pointer; text-align: left; } .mechanics-skill-card:hover { border-color: var(--sel); } .mechanics-skill-card:hover .mechanics-hero-wide { transform: scale(1.05); } .mechanics-skill-portrait { display: block; width: 100%; aspect-ratio: 16 / 9; background: #0a0e14; overflow: hidden; } .mechanics-hero-wide { width: 100%; height: 100%; object-fit: contain; object-position: center center; display: block; filter: saturate(1.02) contrast(1.04); transition: transform 0.15s ease; } .mechanics-skill-foot { display: flex; align-items: center; gap: 8px; padding: 8px 9px; border-top: 1px solid var(--line); min-width: 0; } .mechanics-row { display: flex; align-items: center; gap: 10px; width: 100%; padding: 8px 10px; border-radius: 8px; border: 1px solid var(--line); background: var(--panel); color: var(--text); font-family: var(--font); cursor: pointer; text-align: left; } .mechanics-row:hover { border-color: var(--sel); } .mechanics-ability, .mechanics-item { width: 36px; height: 36px; border-radius: 4px; object-fit: contain; flex-shrink: 0; background: rgba(0, 0, 0, 0.25); } .mechanics-text { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1; } .mechanics-primary { font-size: 13px; font-weight: 700; line-height: 1.2; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .mechanics-secondary { font-size: 11.5px; color: var(--muted); line-height: 1.2; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .mechanics-cost { font-size: 13px; font-weight: 700; color: #e7c56a; flex-shrink: 0; } .mechanics-empty { margin: 0; padding: 10px 4px; color: var(--muted); font-size: 13px; } @media (max-width: 900px) { .mechanics-board .mechanics-center-wrap { width: min(640px, 94%); } .mechanics-effects { flex-direction: row; flex-wrap: wrap; align-items: flex-start; } .mechanics-group { flex: 1 1 160px; } .mechanics-skill-grid { grid-template-columns: repeat(auto-fill, minmax(132px, 1fr)); } } /* Streamers directory (top-level + hero detail tab). */ .streamers-center-wrap { width: min(880px, calc(100% - 48px)); } .streamers-foot { width: 100%; padding: 12px 0 24px; text-align: center; font-size: 11px; font-weight: 500; color: var(--muted); letter-spacing: 0.08em; opacity: 0.55; user-select: none; } .streamers-grid { display: flex; flex-direction: column; gap: 14px; width: 100%; } .streamers-empty { padding: 28px 12px; text-align: center; color: var(--muted); font-size: 14px; } .streamer-card { display: flex; flex-direction: column; gap: 14px; padding: 24px 22px 22px; border: 1px solid rgba(255, 255, 255, 0.06); border-radius: 16px; background: rgba(16, 24, 36, 0.92); box-sizing: border-box; } /* Row 1: avatar | info (name/meta/signature) | follow */ .streamer-card-head { display: flex; align-items: center; gap: 16px; min-width: 0; } .streamer-avatar-wrap { position: relative; flex: 0 0 auto; overflow: visible; display: block; width: 88px; height: 88px; text-decoration: none; color: inherit; } /* Linked wraps: live rooms and offline rooms alike (offline keeps click-through). */ a.streamer-avatar-wrap { cursor: pointer; } a.streamer-avatar-wrap:hover .streamer-avatar { filter: brightness(1.06); } .streamer-avatar-inner { position: relative; z-index: 1; display: block; width: 88px; height: 88px; border-radius: 50%; overflow: hidden; } .streamer-avatar { width: 88px; height: 88px; object-fit: cover; border-radius: 50%; border: 1px solid rgba(255, 255, 255, 0.08); background: rgba(255, 255, 255, 0.06); display: block; box-sizing: border-box; } .streamer-avatar-fallback { display: flex; align-items: center; justify-content: center; width: 88px; height: 88px; font-size: 28px; font-weight: 700; color: var(--muted); } /* Douyin live avatar: ring pulse + badge overlaps ring (no gap). Measured on live.douyin.com: badge bottom:-6px on 54px wrap, ~10px overlap, gradient pill, no border/shadow. */ .streamer-avatar-wrap.is-live .streamer-avatar { border-color: rgb(69, 71, 79); } .streamer-avatar-wrap.is-live .streamer-avatar-inner { animation: streamer-live-avatar 1s ease infinite; } .streamer-live-ring { position: absolute; top: -5.5px; left: -5.5px; width: 99px; height: 99px; border-radius: 50%; border: 1px solid rgb(254, 44, 85); box-sizing: border-box; pointer-events: none; z-index: 0; } .streamer-live-ring-pulse { animation: streamer-live-ring 1s ease infinite; } @keyframes streamer-live-ring { 0%, 10% { opacity: 1; transform: scale(1); } 70%, 100% { opacity: 0; transform: scale(1.15); } } @keyframes streamer-live-avatar { 0%, 100% { transform: scale(1); } 50% { transform: scale(0.9); } } .streamer-live-badge { position: absolute; left: 50%; /* Douyin: bottom:-6px → badge overlaps ring/avatar bottom, no air gap. */ bottom: -6px; transform: translateX(-50%); z-index: 2; display: inline-flex; align-items: center; justify-content: center; min-width: 38px; height: 16px; padding: 0 6px; font-size: 10px; font-weight: 600; line-height: 1; letter-spacing: 0.02em; color: #fff; background: linear-gradient(131.17deg, rgb(255, 23, 100) 0%, rgb(237, 52, 149) 94.15%); border: 0; border-radius: 4px; box-shadow: none; white-space: nowrap; pointer-events: none; } .streamer-card-info { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; justify-content: center; gap: 5px; } .streamer-name { margin: 0; font-size: 20px; font-weight: 700; color: #fff; line-height: 1.3; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .streamer-meta { display: flex; align-items: center; width: fit-content; max-width: 100%; margin: 0; font-size: 13px; line-height: 18px; letter-spacing: 0.2px; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-variant-numeric: tabular-nums; } .streamer-meta-sep { flex: 0 0 auto; width: 1px; height: 11px; margin: 0 10px; background: rgba(255, 255, 255, 0.13); } .streamer-meta-item { flex: 0 0 auto; } .streamer-meta-value { color: #dce5f2; font-weight: 600; } .streamer-meta-item.is-account .streamer-meta-value { color: #aab8cd; font-weight: 500; } .streamer-meta-item.is-stat .streamer-meta-label { margin-left: 3px; } .streamer-signature { margin: 0; font-size: 13px; line-height: 20px; letter-spacing: 0.3px; color: #8e9bb0; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; word-break: break-word; } .streamer-actions { flex: 0 0 auto; display: flex; flex-direction: column; align-items: stretch; justify-content: center; gap: 8px; min-width: 88px; margin-left: 4px; align-self: center; } .streamer-btn { display: inline-flex; align-items: center; justify-content: center; padding: 8px 20px; font-size: 14px; font-weight: 700; line-height: 1.2; text-decoration: none; text-align: center; white-space: nowrap; border-radius: 999px; box-sizing: border-box; transition: filter 0.15s ease; } .streamer-btn:hover { filter: brightness(1.08); } .streamer-btn-follow { background: #fe2c55; border: 1px solid #fe2c55; color: #fff; } .streamer-heroes { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 12px 14px; margin-top: 4px; padding-top: 4px; } .streamer-hero-chip { display: inline-flex; flex-direction: column; align-items: center; gap: 0; padding: 0; border: none; background: transparent; color: var(--muted); cursor: pointer; font-size: 12px; line-height: 1.25; font-family: inherit; max-width: 112px; } .streamer-hero-chip:hover { color: var(--text); } .streamer-hero-chip img { width: 112px; height: 63px; object-fit: cover; object-position: center top; display: block; border-radius: 4px; flex-shrink: 0; opacity: 0.95; } .streamer-hero-chip:hover img { opacity: 1; } .streamer-hero-chip span { display: block; width: 100%; text-align: center; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 12px; font-weight: 500; } .streamer-video-wrap { display: flex; flex-direction: column; align-items: center; gap: 8px; width: 100%; min-width: 0; padding-top: 2px; } .streamer-video-frame { /* Real ratio set by JS after metadata; pending uses compact skeleton. */ width: 100%; overflow: hidden; border-radius: 8px; background: #0a0a0a; box-sizing: border-box; } .streamer-video-frame.is-pending { aspect-ratio: 16 / 9; height: auto; max-height: none; position: relative; background: linear-gradient(90deg, #121212 0%, #1a1a1a 45%, #121212 100%); background-size: 200% 100%; animation: streamer-video-skeleton 1.15s ease-in-out infinite; } .streamer-video-frame.is-pending.has-poster { background-color: #0a0a0a; background-size: cover; background-position: center center; background-repeat: no-repeat; animation: none; } .streamer-video-frame.is-pending::after { content: "视频加载中"; position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; font-size: 12px; letter-spacing: 0.04em; color: rgba(255, 255, 255, 0.38); pointer-events: none; } .streamer-video-frame.is-pending.has-poster::after { content: ""; background: linear-gradient( to top, rgba(0, 0, 0, 0.35) 0%, rgba(0, 0, 0, 0.08) 45%, transparent 100% ); } .streamer-video-frame.is-pending .streamer-video { opacity: 0; pointer-events: none; } @keyframes streamer-video-skeleton { 0% { background-position: 100% 0; } 100% { background-position: -100% 0; } } .streamer-video-frame.is-landscape { width: 100%; } .streamer-video-frame.is-letterbox-crop .streamer-video { object-fit: cover; } .streamer-video { width: 100%; height: 100%; object-fit: contain; object-position: center center; display: block; vertical-align: top; background: #000; } @media (max-width: 480px) { .streamers-grid { gap: 12px; } .streamer-card { padding: 18px 14px 16px; gap: 10px; border-radius: 12px; } .streamer-card-head { gap: 12px; } .streamer-avatar-wrap, .streamer-avatar-inner { width: 76px; height: 76px; } .streamer-avatar, .streamer-avatar-fallback { width: 76px; height: 76px; } .streamer-live-ring { top: -4.75px; left: -4.75px; width: 85.5px; height: 85.5px; } .streamer-avatar-fallback { font-size: 24px; } .streamer-live-badge { bottom: -5px; min-width: 34px; height: 15px; font-size: 9px; } .streamer-name { font-size: 18px; } .streamer-meta { font-size: 12px; } .streamer-meta-sep { margin: 0 6px; } .streamer-actions { min-width: 76px; gap: 8px; margin-left: 0; } .streamer-btn { padding: 7px 14px; font-size: 13px; } .streamer-heroes { gap: 10px 12px; } .streamer-hero-chip { max-width: 96px; } .streamer-hero-chip img { width: 96px; height: 54px; } } .detail-streamers-layout { flex: 1 1 auto; min-height: 0; width: 100%; overflow: hidden; display: flex; flex-direction: column; } .detail-streamers-layout .detail-tab-body { flex: 1 1 auto; min-height: 0; overflow: auto; scrollbar-width: thin; padding-right: 6px; } .detail-streamers-panel { min-width: 0; margin-inline: auto; padding: 4px 0 12px; box-sizing: border-box; } @media (max-width: 900px) { .streamers-center-wrap { width: min(880px, 94%); } } /* —— Mobile gate (phones / tablets; set by mobile-gate.js) —— */ #mobile-gate { display: none; } html.mobile-client, html.mobile-client body { height: 100%; max-height: none; overflow: auto; } html.mobile-client body > :not(#mobile-gate) { display: none !important; } html.mobile-client #mobile-gate { display: flex; flex: 1 1 auto; min-height: 100dvh; align-items: center; justify-content: center; padding: 32px 20px; } .mobile-gate-card { width: min(360px, 100%); text-align: center; } .mobile-gate-brand { display: flex; align-items: center; justify-content: center; gap: 10px; margin-bottom: 28px; } .mobile-gate-logo { height: 28px; width: auto; display: block; } .mobile-gate-brand-title { font-size: 18px; font-weight: 700; letter-spacing: 0.16em; color: var(--text); text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); } .mobile-gate-title { margin: 0 0 10px; font-size: 22px; font-weight: 700; letter-spacing: 0.04em; color: var(--text); } .mobile-gate-desc { margin: 0 0 28px; font-size: 15px; line-height: 1.55; color: var(--muted); } .mobile-demand-btn { appearance: none; border: 1px solid rgba(94, 200, 255, 0.45); background: rgba(94, 200, 255, 0.12); color: var(--sel); font: inherit; font-size: 15px; font-weight: 600; letter-spacing: 0.06em; padding: 12px 22px; border-radius: 8px; cursor: pointer; transition: background 0.15s, border-color 0.15s, color 0.15s; } .mobile-demand-btn:hover:not(:disabled) { background: rgba(94, 200, 255, 0.2); border-color: rgba(94, 200, 255, 0.7); } .mobile-demand-btn:focus-visible { outline: 2px solid var(--sel); outline-offset: 2px; } .mobile-demand-btn:disabled { cursor: default; opacity: 0.75; border-color: rgba(140, 170, 210, 0.28); background: rgba(140, 170, 210, 0.1); color: var(--muted); } .mobile-demand-count { margin: 16px 0 0; font-size: 13px; color: var(--muted); } .mobile-demand-count span { color: var(--text); font-weight: 600; }