Files
climperor/web/frontend/style.css
T
vosonandCursor 9c5aa5b610 Reorganize repository into pc web shared monorepo
Separate the local recognition, web publishing, and shared data paths while preserving direct script execution and existing site content.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-29 14:29:08 +08:00

3498 lines
70 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
: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,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%239fb4cc' stroke-width='1.8' stroke-linecap='round'><circle cx='7' cy='7' r='4.5'/><path d='M10.5 10.5 L14 14'/></svg>");
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 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-name {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-size: 14px;
}
.matchup-score {
font-variant-numeric: tabular-nums;
font-size: 14px;
color: #7eb6ff;
white-space: nowrap;
}
.matchup-games {
font-size: 12px;
min-width: 2.75rem;
text-align: right;
white-space: nowrap;
}
.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: 6px;
font-size: 13px;
color: var(--muted);
letter-spacing: 0.02em;
}
/* 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);
white-space: pre-wrap;
}
.skill-info-body {
display: flex;
flex-wrap: wrap;
gap: 18px 30px;
align-items: flex-start;
justify-content: center;
/* 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 340px;
min-width: 0;
/* Cap the detail column so it does not stretch edge-to-edge (leaving a big
empty band) when no demo video is cached beside it. */
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;
}
/* 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 500px;
max-width: 820px;
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;
grid-template-columns: repeat(auto-fill, minmax(178px, 1fr));
gap: 4px 20px;
margin-top: 8px;
padding-top: 8px;
border-top: 1px solid rgba(140, 170, 210, 0.14);
}
.skill-param {
display: flex;
align-items: baseline;
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 {
margin-left: 4px;
min-width: 0;
color: #fff;
font-weight: 600;
}
/* 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;
gap: 26px;
/* Sinks the cooldown/mana footer to the column bottom (aligning with the
stretched video); padding-top keeps the minimum gap when there is no
spare height to absorb. */
margin-top: auto;
padding-top: 10px;
}
.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-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-skills,
.match-backpack {
display: flex;
flex-wrap: wrap;
gap: 6px;
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,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23071018' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'><path d='M3.5 8.2 L6.5 11.2 L12.5 4.5'/></svg>");
}
@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 <html>) 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;
}
.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%);
}
.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 only: avatar | nickname | actions — meta/signature live below as siblings */
.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 search live: outer ring expands+fades; avatar shrinks (1s ease). */
.streamer-avatar-wrap.is-live {
padding-bottom: 10px;
margin-bottom: -10px;
}
.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, 26, 104);
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%;
bottom: 0;
transform: translateX(-50%);
z-index: 2;
padding: 1px 6px;
font-size: 10px;
font-weight: 700;
line-height: 1.3;
letter-spacing: 0.02em;
color: #fff;
background: rgb(254, 26, 104);
border-radius: 4px;
white-space: nowrap;
pointer-events: none;
}
.streamer-name {
flex: 1 1 auto;
min-width: 0;
margin: 0;
font-size: 20px;
font-weight: 700;
color: #fff;
line-height: 1.3;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.streamer-meta {
margin: 0;
font-size: 13px;
line-height: 20px;
letter-spacing: 0.6px;
color: var(--muted);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-variant-numeric: tabular-nums;
}
/* Douyin search card: 1×10px divider, 8px side margin */
.streamer-meta-sep {
display: inline-block;
width: 1px;
height: 10px;
margin: 0 8px;
vertical-align: baseline;
background: rgba(255, 255, 255, 0.16);
}
.streamer-meta-item {
display: inline;
}
.streamer-signature {
margin: 0;
font-size: 13px;
line-height: 20px;
letter-spacing: 0.4px;
color: var(--muted);
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.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: 6px;
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 {
/* Default 9:16; JS may set aspect-ratio from video metadata */
width: 100%;
aspect-ratio: 9 / 16;
overflow: hidden;
border-radius: 8px;
background: #0a0a0a;
box-sizing: border-box;
}
.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-name {
font-size: 18px;
}
.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%);
}
}