Files
Genarrative/src/components/game-distribution/gameDistribution.css
T
suzmii 832c1787f9
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
主操作行不再内联状态文本:状态/警告改走平台 toast(复用 PlatformRuntimeStatusToast + portal 宿主),手动面板改 portal 浮层,行内子项不收缩不换行
2026-10-07 16:28:34 +08:00

2936 lines
75 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.
.game-page,
.game-detail-page,
.game-play-page {
width: 100%;
min-height: 100%;
box-sizing: border-box;
padding: clamp(1rem, 2.4vw, 2.75rem);
color: var(--platform-text-strong);
}
.game-page {
max-width: 92rem;
margin: 0 auto;
}
.game-page-actions {
display: flex;
justify-content: flex-end;
gap: 0.6rem;
/* 站点级动作放在 hero 上方的右上角,与 hero 之间留出间距。 */
margin-bottom: 1.1rem;
}
.game-hero {
position: relative;
display: flex;
min-height: 17rem;
align-items: center;
justify-content: space-between;
overflow: hidden;
border: 1px solid rgba(199, 101, 61, 0.25);
border-radius: 2rem;
padding: clamp(1.5rem, 4vw, 3.5rem);
background: radial-gradient(
circle at 75% 15%,
rgba(241, 159, 95, 0.28),
transparent 30%
),
linear-gradient(120deg, rgba(91, 49, 42, 0.98), rgba(43, 29, 34, 0.96));
box-shadow: 0 1.25rem 3rem rgba(72, 35, 26, 0.18);
color: #fff8f0;
}
.game-hero__copy {
position: relative;
z-index: 1;
max-width: 36rem;
}
.game-eyebrow {
display: inline-flex;
align-items: center;
gap: 0.38rem;
color: var(--platform-accent-strong);
font-size: 0.72rem;
font-weight: 800;
letter-spacing: 0.12em;
text-transform: uppercase;
}
.game-hero .game-eyebrow {
color: #ffd3b0;
}
.game-eyebrow svg {
width: 0.9rem;
height: 0.9rem;
}
.game-hero h1 {
margin: 0.8rem 0 0;
font-size: clamp(2rem, 4.1vw, 3.4rem);
line-height: 1.08;
letter-spacing: -0.05em;
}
.game-hero h1 em {
color: #ffb77c;
font-style: normal;
}
.game-hero p {
max-width: 31rem;
margin: 1rem 0 0;
color: rgba(255, 241, 227, 0.74);
font-size: 0.95rem;
line-height: 1.75;
}
.game-hero__actions {
display: flex;
align-items: center;
gap: 1rem;
margin-top: 1.4rem;
}
.game-hero__hint {
color: rgba(255, 241, 227, 0.66);
font-size: 0.75rem;
}
.game-hero__orb {
display: grid;
width: clamp(9rem, 19vw, 16rem);
aspect-ratio: 1;
place-items: center;
margin-right: 4%;
border: 1px solid rgba(255, 208, 171, 0.3);
border-radius: 50%;
background: radial-gradient(
circle at 40% 35%,
#ef9b68,
#7e3b44 46%,
rgba(37, 25, 35, 0.25) 70%
);
box-shadow:
0 0 0 1.5rem rgba(245, 141, 90, 0.05),
0 0 5rem rgba(245, 141, 90, 0.26);
color: #fff4df;
font-size: clamp(3rem, 6vw, 5rem);
}
.game-hero__orb::after {
position: absolute;
width: 8rem;
height: 1px;
content: '';
background: rgba(255, 203, 161, 0.35);
transform: rotate(-24deg) translate(6rem, -3rem);
}
.game-toolbar {
display: flex;
align-items: end;
justify-content: space-between;
gap: 1.25rem;
margin: 2.3rem 0 1.15rem;
}
.game-toolbar h2 {
margin: 0.2rem 0 0;
font-size: clamp(1.55rem, 3vw, 2.15rem);
letter-spacing: -0.04em;
}
.game-search {
display: flex;
min-width: min(100%, 19rem);
align-items: center;
gap: 0.55rem;
border: 1px solid var(--platform-surface-border);
border-radius: 999px;
padding: 0.68rem 0.95rem;
background: var(--platform-panel-fill);
color: var(--platform-text-soft);
}
.game-search svg {
width: 1rem;
flex: none;
}
.game-search input {
width: 100%;
border: 0;
outline: 0;
background: transparent;
color: var(--platform-text-strong);
font: inherit;
font-size: 0.82rem;
}
.game-category-tabs {
display: flex;
gap: 0.45rem;
overflow-x: auto;
padding: 0.15rem 0 1.45rem;
scrollbar-width: none;
}
.game-category-tab {
flex: none;
min-height: 2.75rem;
border: 1px solid transparent;
border-radius: 999px;
padding: 0.52rem 0.95rem;
background: transparent;
color: var(--platform-text-soft);
cursor: pointer;
font: inherit;
font-size: 0.8rem;
font-weight: 700;
transition: 160ms ease;
}
.game-category-tab:hover {
color: var(--platform-text-strong);
background: var(--platform-surface-fill);
}
.game-category-tab--active {
border-color: rgba(199, 101, 61, 0.25);
background: rgba(199, 101, 61, 0.12);
color: var(--platform-accent-strong);
}
.game-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 1.1rem;
}
.game-cover {
position: relative;
display: flex;
min-height: 12rem;
align-items: center;
justify-content: center;
overflow: hidden;
isolation: isolate;
}
.game-cover--compact {
min-height: 7rem;
}
.game-cover__grid {
position: absolute;
inset: 0;
opacity: 0.22;
background-image: linear-gradient(
rgba(255, 255, 255, 0.2) 1px,
transparent 1px
),
linear-gradient(90deg, rgba(255, 255, 255, 0.2) 1px, transparent 1px);
background-size: 2rem 2rem;
transform: perspective(12rem) rotateX(58deg) scale(1.7) translateY(25%);
}
.game-cover__glow {
position: absolute;
width: 70%;
aspect-ratio: 1;
border-radius: 50%;
background: radial-gradient(
circle,
rgba(255, 236, 204, 0.5),
transparent 66%
);
filter: blur(0.6rem);
}
.game-cover__icon {
position: relative;
z-index: 1;
display: grid;
width: 5.4rem;
aspect-ratio: 1;
place-items: center;
border: 1px solid rgba(255, 255, 255, 0.4);
border-radius: 1.5rem;
background: rgba(255, 255, 255, 0.13);
box-shadow: 0 1rem 2rem rgba(0, 0, 0, 0.2);
color: #fff5dc;
font-size: 3rem;
backdrop-filter: blur(8px);
}
.game-loading-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 1.1rem;
}
.game-loading-grid span {
height: 17rem;
border-radius: 1.45rem;
background: linear-gradient(
100deg,
var(--platform-panel-fill),
var(--platform-surface-fill),
var(--platform-panel-fill)
);
background-size: 220% 100%;
animation: game-shimmer 1.2s ease-in-out infinite;
}
@keyframes game-shimmer {
from {
background-position: 100% 0;
}
to {
background-position: -100% 0;
}
}
.game-detail-page {
max-width: 70rem;
margin: 0 auto;
}
.game-back-button {
display: inline-flex;
min-height: 2.75rem;
align-items: center;
gap: 0.4rem;
border: 0;
padding: 0.25rem 0;
background: transparent;
color: var(--platform-text-soft);
cursor: pointer;
font: inherit;
font-size: 0.82rem;
font-weight: 700;
}
.game-back-button svg {
width: 1rem;
}
.game-avatar {
display: grid;
width: 1.8rem;
height: 1.8rem;
place-items: center;
border-radius: 50%;
background: rgba(199, 101, 61, 0.18);
color: var(--platform-accent-strong);
font-weight: 900;
}
.game-device-warning {
color: var(--platform-accent-strong);
font-size: 0.75rem;
font-weight: 800;
}
/*
* 非公开作品的封面占位文案:封面素材不可换签时,封面位改为状态说明
* (审核中 / 审核未通过 / 未公开 / 已被封禁),压在渐变占位之上。
*/
.game-detail-cover__pending {
position: absolute;
inset: 0;
z-index: 3;
display: grid;
place-items: center;
background: rgba(22, 21, 28, 0.55);
color: #fff5dc;
font-size: 0.95rem;
font-weight: 800;
letter-spacing: 0.16em;
}
/*
* 共创资料卡:详情页通过共享展示组件的 `infoCards` 槽位渲染,卡片外壳
* (`.game-detail-info-card`)与内联 flex 的 value 包裹层都由共享组件提供。
* 这里把卡内布局改成纵向栅格,免得授权徽章、代际与改编次数挤在一行里被侧栏裁掉;
* 选择器前缀沿用共享组件的类名,保证优先级高于共享样式的 `.game-detail-info-card span`。
*/
.game-detail-info-card .game-fork-card {
display: grid;
justify-items: start;
gap: 0.3rem;
white-space: normal;
}
.game-detail-info-card .game-fork-badge {
border: 1px solid var(--platform-surface-border);
border-radius: 999px;
padding: 0.2rem 0.6rem;
background: var(--platform-surface-fill);
color: var(--platform-text-soft);
font-size: 0.7rem;
font-weight: 800;
}
.game-detail-info-card .game-fork-badge--nonCommercial {
background: var(--platform-success-bg);
color: var(--platform-success-text);
}
.game-detail-info-card .game-fork-badge--full {
background: rgba(199, 101, 61, 0.14);
color: var(--platform-accent-strong);
}
.game-detail-info-card .game-fork-lineage {
color: var(--platform-text-base);
font-weight: 700;
}
.game-detail-info-card .game-fork-lineage__author,
.game-detail-info-card .game-fork-derived {
color: var(--platform-text-soft);
}
/* 族谱入口:与卡内文字同节奏的次级按钮,窄屏也靠网格换行收在侧栏里。 */
.game-fork-lineage-link {
justify-self: start;
border: 1px solid var(--platform-surface-border);
border-radius: 999px;
padding: 0.22rem 0.7rem;
background: transparent;
color: var(--platform-accent-strong);
font: inherit;
font-size: 0.76rem;
font-weight: 700;
cursor: pointer;
}
.game-fork-lineage-link:hover {
background: rgba(199, 101, 61, 0.12);
}
/*
* 「改造这个作品」:入口 + 展开后的获取方式面板。都在共创信息卡内,
* 窄屏靠网格换行与 `overflow-wrap: anywhere` 收在侧栏里,不产生横向溢出。
*/
.game-fork-remix-link {
justify-self: start;
border: 1px solid var(--platform-accent-strong);
border-radius: 999px;
padding: 0.22rem 0.75rem;
background: rgba(199, 101, 61, 0.12);
color: var(--platform-accent-strong);
font: inherit;
font-size: 0.76rem;
font-weight: 700;
cursor: pointer;
}
.game-fork-remix-link:hover {
background: rgba(199, 101, 61, 0.2);
}
.game-fork-remix-panel {
display: grid;
justify-items: start;
gap: 0.35rem;
width: 100%;
max-width: 100%;
box-sizing: border-box;
border: 1px solid var(--platform-surface-border);
border-radius: 0.6rem;
padding: 0.55rem 0.65rem;
background: var(--platform-surface-muted, rgba(0, 0, 0, 0.02));
font-size: 0.76rem;
line-height: 1.6;
}
.game-fork-remix-steps {
color: var(--platform-text-base);
overflow-wrap: anywhere;
}
.game-fork-remix-value {
min-width: 0;
color: var(--platform-text-soft);
overflow-wrap: anywhere;
}
.game-fork-remix-value code {
color: var(--platform-text-strong);
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
font-size: 0.72rem;
overflow-wrap: anywhere;
}
.game-fork-remix-actions {
display: flex;
flex-wrap: wrap;
gap: 0.35rem;
}
.game-fork-remix-copy {
border: 1px solid var(--platform-surface-border);
border-radius: 999px;
padding: 0.2rem 0.7rem;
background: var(--platform-surface, #fff);
color: var(--platform-text-base);
font: inherit;
font-size: 0.74rem;
font-weight: 600;
cursor: pointer;
}
.game-fork-remix-note {
color: var(--platform-text-soft);
overflow-wrap: anywhere;
}
.game-fork-remix-status {
color: var(--platform-text-soft);
font-size: 0.74rem;
overflow-wrap: anywhere;
}
/*
* 「原版与二创对比」:桌面端左右并排,窄屏改上下堆叠(不出现横向溢出)。
* iframe 复用游玩页的 `.game-player-frame`,这里只给两侧容器定尺寸与堆叠规则。
*/
.game-compare-page {
max-width: 90rem;
margin: 0 auto;
display: flex;
flex-direction: column;
gap: 0.9rem;
}
.game-compare-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 0.9rem;
align-items: start;
}
.game-compare-side {
display: flex;
flex-direction: column;
gap: 0.5rem;
min-width: 0;
}
.game-compare-side__head {
display: flex;
flex-direction: column;
gap: 0.15rem;
min-width: 0;
}
.game-compare-side__role {
align-self: flex-start;
border-radius: 999px;
padding: 0.1rem 0.5rem;
background: var(--platform-surface-border);
color: var(--platform-text-soft);
font-size: 0.7rem;
font-weight: 700;
}
.game-compare-side__title {
margin: 0;
color: var(--platform-text-strong);
font-size: 0.95rem;
overflow-wrap: anywhere;
}
.game-compare-side__meta {
display: flex;
flex-wrap: wrap;
gap: 0.3rem;
margin: 0;
color: var(--platform-text-soft);
font-size: 0.78rem;
overflow-wrap: anywhere;
}
.game-compare-side__frame {
position: relative;
aspect-ratio: 4 / 3;
min-height: 18rem;
border: 1px solid var(--platform-surface-border);
border-radius: 0.75rem;
overflow: hidden;
}
@media (max-width: 900px) {
.game-compare-grid {
grid-template-columns: minmax(0, 1fr);
}
.game-compare-side__frame {
min-height: 15rem;
}
}
.game-detail-info-card .game-fork-compare-link {
justify-self: start;
border: 1px solid var(--platform-surface-border);
border-radius: 999px;
padding: 0.22rem 0.7rem;
background: transparent;
color: var(--platform-text-base);
font: inherit;
font-size: 0.76rem;
font-weight: 600;
cursor: pointer;
}
.game-detail-info-card .game-fork-compare-link:hover {
color: var(--platform-text-strong);
}
/* 收藏失败/状态提示:与动作行同一行内换行,不撑破容器。 */
.game-collection-notice {
color: var(--platform-text-soft);
font-size: 0.78rem;
overflow-wrap: anywhere;
}
/* 我的作品 / 我的收藏页签。 */
.game-tabs {
display: flex;
flex-wrap: wrap;
gap: 0.4rem;
}
.game-tabs__button {
border: 1px solid var(--platform-surface-border);
border-radius: 999px;
padding: 0.25rem 0.9rem;
background: transparent;
color: var(--platform-text-base);
font: inherit;
font-size: 0.8rem;
font-weight: 700;
cursor: pointer;
}
.game-tabs__button[aria-selected='true'] {
border-color: var(--platform-accent-strong);
background: rgba(199, 101, 61, 0.12);
color: var(--platform-accent-strong);
}
.game-lineage-node__compare {
align-self: flex-start;
border: 1px solid var(--platform-surface-border);
border-radius: 999px;
padding: 0.18rem 0.65rem;
background: transparent;
color: var(--platform-text-base);
font: inherit;
font-size: 0.74rem;
font-weight: 600;
cursor: pointer;
}
/* 共创主题:列表卡片与主题页(成员根 + 内嵌作品树)。 */
.game-theme-list {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(min(18rem, 100%), 1fr));
gap: 0.7rem;
margin: 0;
padding: 0;
list-style: none;
}
.game-theme-card {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 0.25rem;
width: 100%;
box-sizing: border-box;
border: 1px solid var(--platform-surface-border);
border-radius: 0.75rem;
padding: 0.8rem 0.9rem;
background: var(--platform-surface, #fff);
color: var(--platform-text-base);
font: inherit;
text-align: left;
cursor: pointer;
}
.game-theme-card:hover {
border-color: var(--platform-accent-strong);
}
.game-theme-card__badge {
border-radius: 999px;
padding: 0.1rem 0.5rem;
background: rgba(199, 101, 61, 0.14);
color: var(--platform-accent-strong);
font-size: 0.7rem;
font-weight: 700;
}
.game-theme-card__name {
color: var(--platform-text-strong);
font-size: 0.95rem;
font-weight: 700;
overflow-wrap: anywhere;
}
.game-theme-card__summary,
.game-theme-card__meta {
color: var(--platform-text-soft);
font-size: 0.78rem;
overflow-wrap: anywhere;
}
.game-theme-summary {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.4rem;
}
.game-theme-summary__badge {
border-radius: 999px;
padding: 0.12rem 0.6rem;
background: rgba(199, 101, 61, 0.14);
color: var(--platform-accent-strong);
font-size: 0.74rem;
font-weight: 700;
}
.game-theme-summary__text {
margin: 0;
color: var(--platform-text-soft);
font-size: 0.8rem;
line-height: 1.6;
overflow-wrap: anywhere;
}
.game-theme-summary__meta {
margin: 0;
color: var(--platform-text-soft);
font-size: 0.8rem;
overflow-wrap: anywhere;
}
.game-theme-trees {
display: flex;
flex-direction: column;
gap: 1.1rem;
}
.game-theme-root {
display: flex;
flex-direction: column;
gap: 0.55rem;
min-width: 0;
border: 1px solid var(--platform-surface-border);
border-radius: 0.85rem;
padding: 0.8rem 0.9rem;
}
.game-theme-root__head {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.4rem;
}
.game-theme-root__generation {
border-radius: 999px;
padding: 0.1rem 0.5rem;
background: var(--platform-surface-border);
color: var(--platform-text-soft);
font-size: 0.7rem;
font-weight: 700;
}
.game-theme-root__title {
margin: 0;
color: var(--platform-text-strong);
font-size: 0.95rem;
overflow-wrap: anywhere;
}
.game-theme-root__meta {
display: flex;
flex-wrap: wrap;
gap: 0.3rem;
margin: 0;
color: var(--platform-text-soft);
font-size: 0.78rem;
overflow-wrap: anywhere;
}
.game-theme-root__actions {
display: flex;
flex-wrap: wrap;
gap: 0.35rem;
}
/* 内嵌的族谱页:去掉页面级留白,避免主题页里出现两层「页面」盒。 */
.game-lineage-page--embedded {
max-width: none;
margin: 0;
}
/*
* 空态/列表底部的操作区(广场「加载更多」、主题页「加载更多」、我的收藏「加载更多」共用)。
* 之前只有类名没有样式,窄屏上按钮与提示可能横向挤成一排 —— 这里统一成可换行、居中、不溢出的行。
*/
.game-empty-actions {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: center;
gap: 0.5rem;
margin-top: 1rem;
min-width: 0;
}
.game-gallery-more__error {
color: var(--platform-text-soft);
font-size: 0.8rem;
overflow-wrap: anywhere;
}
/*
* 详情页**正文之后**的整宽血缘图区块(需求 2026-10-06:图可能很大,~230px 的侧栏塞不下)。
* 区块内嵌族谱页组件(embedded),所以这里只需要管「区块自己的标题 + 全屏入口」这一段。
*/
.game-lineage-block {
display: flex;
flex-direction: column;
gap: 0.6rem;
margin-top: 1.4rem;
min-width: 0;
}
.game-lineage-block__heading {
display: flex;
flex-wrap: wrap;
align-items: flex-end;
justify-content: space-between;
gap: 0.5rem;
}
.game-lineage-block__title {
display: flex;
flex-direction: column;
gap: 0.15rem;
min-width: 0;
}
.game-lineage-block__title h2 {
margin: 0;
font-size: 1.05rem;
}
.game-detail-info-card .game-fork-theme-list {
display: flex;
flex-wrap: wrap;
gap: 0.3rem;
justify-items: start;
}
.game-detail-info-card .game-fork-theme-link {
display: inline-flex;
align-items: center;
gap: 0.25rem;
border: 1px solid var(--platform-surface-border);
border-radius: 999px;
padding: 0.18rem 0.6rem;
background: transparent;
color: var(--platform-text-base);
font: inherit;
font-size: 0.74rem;
font-weight: 600;
cursor: pointer;
overflow-wrap: anywhere;
}
.game-detail-info-card .game-fork-theme-link:hover {
color: var(--platform-text-strong);
}
.game-detail-info-card .game-fork-theme-badge {
color: var(--platform-accent-strong);
font-weight: 700;
}
/* 共创模块(详情页):世代/授权标签、数据概览、血缘溯源条、热门衍生栏。 */
.game-detail-info-card .co-creation-tags {
display: flex;
flex-wrap: wrap;
gap: 0.3rem;
justify-items: start;
}
.game-detail-info-card .co-creation-tag {
border-radius: 999px;
padding: 0.12rem 0.6rem;
font-size: 0.72rem;
font-weight: 700;
}
.game-detail-info-card .co-creation-tag--generation {
background: rgba(199, 101, 61, 0.14);
color: var(--platform-accent-strong);
}
.game-detail-info-card .co-creation-stats {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
font-variant-numeric: tabular-nums;
}
.game-detail-info-card .co-creation-stat {
color: var(--platform-text-soft);
font-size: 0.76rem;
}
.co-creation-fork-primary {
align-self: stretch;
justify-content: center;
padding: 0.45rem 0.9rem;
border-color: var(--platform-accent-strong);
background: rgba(199, 101, 61, 0.14);
font-size: 0.86rem;
}
.co-creation-fork-primary--blocked {
border-color: var(--platform-surface-border);
background: var(--platform-surface-muted, rgba(0, 0, 0, 0.04));
color: var(--platform-text-soft);
cursor: not-allowed;
}
/* 画布内悬浮控件(右下角):圆角胶囊、浅色底 + 毛玻璃、内边距统一、轻阴影。 */
.game-lineage-controls {
position: absolute;
z-index: 3;
right: 0.6rem;
bottom: 0.6rem;
display: flex;
align-items: center;
gap: 0.25rem;
padding: 0.3rem 0.4rem;
border: 1px solid var(--platform-surface-border);
border-radius: 999px;
background: var(--platform-surface, #fff);
box-shadow: 0 8px 22px rgba(76, 41, 27, 0.16);
backdrop-filter: blur(10px);
}
.game-lineage-controls__button {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 0.25rem;
width: 2rem;
height: 2rem;
border: 0;
border-radius: 999px;
background: transparent;
color: var(--platform-text-strong);
font: inherit;
cursor: pointer;
}
.game-lineage-controls__button:hover:not(:disabled) {
background: rgba(199, 101, 61, 0.14);
}
.game-lineage-controls__button:disabled {
opacity: 0.38;
cursor: not-allowed;
}
.game-lineage-controls__button--wide {
width: auto;
padding: 0 0.65rem;
}
.game-lineage-controls__label {
font-size: 0.76rem;
font-weight: 600;
}
.game-lineage-controls__divider {
width: 1px;
height: 1.2rem;
background: var(--platform-surface-border);
}
/* 缩放读数:与 ± 按钮视觉等重、等宽对齐(数字不跳动)。 */
.game-lineage-zoom {
min-width: 3.1rem;
text-align: center;
color: var(--platform-text-strong);
font-size: 0.86rem;
font-weight: 700;
font-variant-numeric: tabular-nums;
}
.game-lineage-summary {
color: var(--platform-text-soft);
font-size: 0.78rem;
font-variant-numeric: tabular-nums;
}
@media (max-width: 820px) {
.game-lineage-controls__label {
display: none;
}
.game-lineage-controls__button--wide {
width: 2rem;
padding: 0;
}
}
/*
* 族谱树可视化:一个可平移/缩放的画布 + 内容层(CSS transform)。
* 连线在 SVG 里(坐标就是内容层坐标,随内容层一起缩放),节点是绝对定位的真实 HTML 卡片
* —— 因为节点要真的可点击 / 可聚焦 / 可读屏,不能画成 SVG 矩形。
*/
.game-lineage-viewport-controls {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.5rem;
}
.game-lineage-toggle {
display: inline-flex;
align-items: center;
gap: 0.35rem;
color: var(--platform-text-soft);
font-size: 0.78rem;
}
.game-lineage-fork-notice {
color: var(--platform-text-soft);
font-size: 0.78rem;
overflow-wrap: anywhere;
}
.game-lineage-fork-copy {
border: 1px solid var(--platform-surface-border);
border-radius: 999px;
padding: 0.2rem 0.7rem;
background: transparent;
color: var(--platform-text-base);
font: inherit;
font-size: 0.74rem;
font-weight: 600;
cursor: pointer;
}
.game-lineage-canvas {
position: relative;
height: clamp(22rem, 62vh, 46rem);
max-width: 100%;
overflow: hidden;
/* 默认态分支色板:同一顶级分支的节点与连线共用一种色系。 */
--lineage-branch-0: #8a6cb4;
--lineage-branch-1: #4e8f8a;
--lineage-branch-2: #b4763a;
--lineage-branch-3: #5d7fb0;
--lineage-branch-4: #a8556f;
--lineage-branch-5: #6b8f4e;
border: 1px solid var(--platform-surface-border);
border-radius: 0.85rem;
background: radial-gradient(
circle at 1px 1px,
var(--platform-surface-border) 1px,
transparent 0
)
0 0 / 22px 22px;
cursor: grab;
/* 拖动平移的交互硬化(2026-10-07):
* - `touch-action: none`:拖拽不触发浏览器自身的滚动/缩放,触屏同手势也不打架;
* - `user-select: none`:按住拖动不选中文本(否则再拖会把文字拖走);
* - `overscroll-behavior: contain`:滚轮到边界也不把滚动链交给外部页面。 */
touch-action: none;
user-select: none;
-webkit-user-select: none;
overscroll-behavior: contain;
}
.game-lineage-canvas--panning {
cursor: grabbing;
}
/* 画布里的图片不参与原生拖拽(否则会出现「把封面图拖走」)。 */
.game-lineage-canvas img,
.game-lineage-canvas .game-cover__image {
-webkit-user-drag: none;
user-drag: none;
pointer-events: none;
}
.game-lineage-canvas:active {
cursor: grabbing;
}
.game-lineage-canvas__content {
position: absolute;
top: 0;
left: 0;
transform-origin: 0 0;
transition: transform 180ms ease-out;
will-change: transform;
}
/* 顶部筛选器(文档「顶部操作栏」):世代 / 热度排序 / 改动类型(待字段,禁用)。 */
.game-lineage-filters {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.5rem;
}
.game-lineage-filter {
display: inline-flex;
align-items: center;
gap: 0.3rem;
color: var(--platform-text-soft);
font-size: 0.78rem;
}
.game-lineage-filter select {
border: 1px solid var(--platform-surface-border);
border-radius: 0.5rem;
padding: 0.15rem 0.35rem;
background: var(--platform-surface, #fff);
color: var(--platform-text-base);
font: inherit;
font-size: 0.78rem;
}
.game-lineage-filter--disabled {
opacity: 0.55;
}
.game-lineage-filter__note {
color: var(--platform-text-soft);
font-size: 0.7rem;
}
/* 主干线:文档要求「每代热度最高的版本用粗实线连接」。 */
.game-lineage-edge--trunk {
stroke-width: 6;
}
/* 「主干」角标 = 暖色(强调)。定位/尺寸由角标组统一管。 */
.game-lineage-node__trunk {
border: 1px solid var(--platform-warm-border);
background: var(--platform-warm-bg);
color: var(--platform-warm-text);
font-weight: 700;
}
/* 右侧信息面板:浮动叠加在画布右上(控件在右下,避免互相遮挡)。 */
.game-lineage-panel {
position: absolute;
z-index: 4;
top: 0.6rem;
right: 0.6rem;
display: flex;
flex-direction: column;
gap: 0.3rem;
width: min(18rem, calc(100% - 1.2rem));
max-height: calc(100% - 4.5rem);
overflow-y: auto;
padding: 0.7rem 0.8rem;
border: 1px solid var(--platform-surface-border);
border-radius: 0.8rem;
background: var(--platform-surface, #fff);
box-shadow: 0 10px 26px rgba(76, 41, 27, 0.18);
}
.game-lineage-panel__title {
margin: 0;
color: var(--platform-text-strong);
font-size: 0.9rem;
overflow-wrap: anywhere;
}
.game-lineage-panel__meta,
.game-lineage-panel__note,
.game-lineage-panel__summary {
margin: 0;
color: var(--platform-text-soft);
font-size: 0.76rem;
line-height: 1.5;
overflow-wrap: anywhere;
}
.game-lineage-panel__summary {
color: var(--platform-text-base);
}
.game-lineage-panel__actions {
display: flex;
flex-wrap: wrap;
gap: 0.35rem;
margin-top: 0.15rem;
}
.game-lineage-panel__button {
border: 1px solid var(--platform-surface-border);
border-radius: 999px;
padding: 0.2rem 0.7rem;
background: transparent;
color: var(--platform-text-base);
font: inherit;
font-size: 0.76rem;
font-weight: 600;
cursor: pointer;
}
.game-lineage-panel__button--primary {
border-color: var(--platform-accent-strong);
background: rgba(199, 101, 61, 0.14);
color: var(--platform-accent-strong);
}
.game-lineage-canvas__edges {
position: absolute;
top: 0;
left: 0;
overflow: visible;
pointer-events: none;
}
.game-lineage-edge {
fill: none;
/* 默认态就按顶级分支着色(同一分支同色系),不必等 hover 也能读出「共创路径」。 */
stroke: var(--lineage-branch, var(--platform-text-base));
opacity: 0.9;
/* 缩到 35% 时线不能细到看不见:non-scaling-stroke 让线宽与屏幕像素绑定,不随缩放变化。 */
vector-effect: non-scaling-stroke;
stroke-width: 3;
transition:
stroke 160ms ease,
opacity 160ms ease;
}
.game-lineage-edge--active {
stroke: var(--platform-accent-strong);
stroke-width: 5.5;
opacity: 1;
filter: drop-shadow(0 0 4px rgba(199, 101, 61, 0.45));
}
.game-lineage-edge--dimmed {
opacity: 0.08;
}
/* 代际轴:画布左侧的固定层(在内容层的 transform 之外),放大/平移后仍然可读、不被裁。
背景用平台 surface 淡色调(**不是白色条**),每个代际行只画一条分隔线,
因此整体看起来是一条连续的轴,而不是一条条白条。 */
.game-lineage-canvas__axis {
position: absolute;
top: 0;
bottom: 0;
left: 0;
width: 96px;
pointer-events: none;
border-right: 1px solid var(--platform-surface-border);
background: var(--platform-surface-muted, rgba(104, 54, 36, 0.055));
}
.game-lineage-axis {
position: absolute;
left: 0;
right: 0;
box-sizing: border-box;
display: flex;
align-items: center;
gap: 0.3rem;
padding-left: 0.55rem;
border-top: 1px solid var(--platform-surface-border);
color: var(--platform-text-strong);
font-size: 0.76rem;
font-weight: 700;
font-variant-numeric: tabular-nums;
white-space: nowrap;
}
.game-lineage-axis__count {
border-radius: 999px;
padding: 0.05rem 0.45rem;
background: var(--platform-surface, #fff);
color: var(--platform-text-soft);
font-size: 0.68rem;
font-weight: 600;
}
.game-lineage-node {
position: absolute;
box-sizing: border-box;
cursor: pointer;
transition:
opacity 160ms ease,
box-shadow 160ms ease;
}
.game-lineage-node--dimmed {
opacity: 0.34;
}
/* 高亮分三档,差异要肉眼可见:路径节点(强调边框 + 淡底)、仅子树节点(淡底 + 中等边框)、
目标节点(外发光 + 强调边框)。全都比「只把别人变淡」更容易看出结构。 */
.game-lineage-node--path {
border-color: var(--platform-accent-strong);
background: rgba(199, 101, 61, 0.08);
}
.game-lineage-node--subtree {
border-color: var(--platform-accent-strong);
border-style: dashed;
background: rgba(199, 101, 61, 0.04);
}
.game-lineage-node--pinned {
border-style: solid;
border-width: 2px;
box-shadow: 0 0 0 3px rgba(199, 101, 61, 0.22);
}
.game-lineage-breadcrumb {
position: absolute;
z-index: 2;
top: 0.4rem;
left: 0.5rem;
right: 0.5rem;
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.25rem;
padding: 0.25rem 0.4rem;
border-radius: 999px;
background: var(--platform-surface, #fff);
box-shadow: 0 1px 6px rgba(0, 0, 0, 0.12);
font-size: 0.72rem;
}
.game-lineage-breadcrumb__item {
display: inline-flex;
align-items: center;
gap: 0.25rem;
color: var(--platform-text-soft);
}
.game-lineage-breadcrumb__crumb,
.game-lineage-breadcrumb__clear {
border: none;
padding: 0.1rem 0.3rem;
border-radius: 999px;
background: transparent;
color: var(--platform-text-base);
font: inherit;
font-size: 0.72rem;
cursor: pointer;
overflow-wrap: anywhere;
}
.game-lineage-breadcrumb__crumb:hover,
.game-lineage-breadcrumb__clear:hover {
color: var(--platform-text-strong);
background: rgba(199, 101, 61, 0.12);
}
/* 窄屏紧凑卡:卡片更小、标题字号相对更大、字段更少(作者行不渲染);封面仍是 16:9。 */
.game-lineage-node--compact .game-lineage-node__title {
font-size: 0.88rem;
}
.game-lineage-node--compact .game-lineage-node__badge {
font-size: 0.72rem;
}
.game-lineage-node__pin {
border: 1px solid var(--platform-surface-border);
border-radius: 999px;
padding: 0.14rem 0.6rem;
background: transparent;
color: var(--platform-text-base);
font: inherit;
font-size: 0.72rem;
font-weight: 600;
cursor: pointer;
}
.game-lineage-node__pin[aria-pressed='true'] {
border-color: var(--platform-accent-strong);
color: var(--platform-accent-strong);
}
.game-lineage-node--stub {
border-style: dashed;
cursor: default;
}
.game-lineage-node:focus-visible {
outline: 2px solid var(--platform-accent-strong);
outline-offset: 2px;
}
.game-lineage-node__title {
color: var(--platform-text-strong);
font-size: 0.9rem;
font-weight: 700;
overflow-wrap: anywhere;
}
/* 链节点与画布卡片共用的内容布局(LineageNodeContent)。 */
.game-lineage-node__content {
display: flex;
min-width: 0;
}
.game-lineage-node__content--stacked {
flex-direction: column;
gap: 0;
width: 100%;
}
.game-lineage-node__content--inline {
flex-direction: row;
align-items: center;
gap: 0.5rem;
width: 100%;
min-width: 0;
padding: 0.15rem 0;
}
/*
* 角标组:代际 / 主干 / 当前作品 / 父代-子代 的**唯一排版容器**(flex + gap + 可换行)。
*
* 为什么必须成组:这几枚角标以前各自 position: absolute(代际左上、主干右上、「当前作品」在流内),
* 在窄容器里会叠印成乱码字形(大纲行的「第 1 代」与「主干」就是这个问题)。
* 现在它们同组排布 —— 重叠在结构上不可能发生,画布与大纲共用同一组角标。
*/
.game-lineage-node__badges {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.25rem;
min-width: 0;
}
/*
* 角标配色表(每类语义一色,**全部取自平台既有 `--platform-*` 变量,不新增色值**):
* 代际 = 中性 | 主干 = 暖色(强调) | 当前作品 = 主色实心
* 父代 = cool | 子代 = success | ▶游玩数 = 中性
* 全部带 1px 边框(浅色卡片上也有边界);组内静态定位 + flex + gap(永不重叠)。
*/
/* 组内角标一律静态定位(颜色 / 圆角仍由各自规则给)。 */
.game-lineage-node__badges .game-lineage-node__badge,
.game-lineage-node__badges .game-lineage-node__trunk,
.game-lineage-node__badges .game-lineage-node__anchor,
.game-lineage-node__badges .game-lineage-node__play-count,
.game-lineage-node__badges .game-lineage-node__relation {
position: static;
top: auto;
right: auto;
bottom: auto;
left: auto;
margin: 0;
border-radius: 999px;
padding: 0.05rem 0.4rem;
font-size: 0.6rem;
line-height: 1.6;
white-space: nowrap;
}
/* 画布卡片:角标组在**封面下方**的信息区第一行(不再压封面、不再用深色药丸浮在图上)。 */
.game-lineage-node__content--stacked .game-lineage-node__badges {
justify-content: flex-start;
padding: 0.35rem 0.5rem 0;
}
/* 大纲行:角标组在封面右侧、操作左侧,靠右对齐,标题占满剩余空间。 */
.game-lineage-node__content--inline .game-lineage-node__badges {
flex: 0 1 auto;
justify-content: flex-end;
}
.game-lineage-node__text {
display: flex;
flex-direction: column;
gap: 0.15rem;
min-width: 0;
flex: 1 1 auto;
}
/* 防逐字换行:min-width:0 让 flex 子项可收缩,标题 2 行截断(line-clamp)+ 省略号。 */
.game-lineage-node__title {
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
overflow-wrap: anywhere;
word-break: normal;
}
/*
* 画布卡片:标题按真实行数占高(1 行 = 1 行)。
* 「同层等高」现在由**布局**负责:`buildLineageTreeLayout` 给同层每个节点同一个 `height`
* (= 该层最高卡片的估算高度),卡片按 `min-height` 撑到它 —— 所以不再需要用
* `min-height` 把每一行标题都硬撑成 2 行(那会让所有卡片白高一行)。
*/
/* 作者行:独立一行、更小更淡(与标题拉开层级)。 */
.game-lineage-node__meta {
display: flex;
min-width: 0;
gap: 0.3rem;
overflow: hidden;
color: var(--platform-text-muted);
font-size: 0.7rem;
font-weight: 500;
}
.game-lineage-node__author {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* 链节点:横版小缩略图(64×36),矮而宽,触控目标 ≥44px。 */
.game-lineage-node__content--inline .game-lineage-node__cover {
flex: 0 0 auto;
width: 4.5rem;
height: auto;
/* 与画布统一的 16:9 横版缩略图(曾在大纲行里被角标撑成窄竖条)。 */
aspect-ratio: 16 / 9;
border-radius: 0.35rem;
}
.game-lineage-node__content--inline .game-lineage-node__badge,
.game-lineage-node__content--inline .game-lineage-node__anchor {
font-size: 0.6rem;
padding: 0.05rem 0.35rem;
}
/* 卡片主体 = 选中;标题/封面 = 打开详情。封面做主视觉(大图 + 圆角 + 轻阴影)。 */
.game-lineage-node {
padding: 0;
overflow: hidden;
border-color: var(--lineage-branch, var(--platform-surface-border));
box-shadow: 0 6px 18px rgba(0, 0, 0, 0.08);
}
.game-lineage-node__open {
display: flex;
flex-direction: column;
gap: 0;
width: 100%;
padding: 0;
border: 0;
background: transparent;
color: inherit;
font: inherit;
text-align: left;
cursor: pointer;
}
/*
* 游玩次数角标:**该节点的子树合计**(`collectLineagePlayCountTotals().total`,口径见 §3.6.3)。
* 紧凑 pill(▶ N)+ `title` 说明「含衍生作品」,与其它角标同行所以**不撑高卡片**;全 0 也显示。
* 注意:主干线 / 热度排序的判据是**自身** playCount,与这个显示口径不同。
*/
.game-lineage-node__play-count {
border: 1px solid var(--platform-neutral-border);
background: var(--platform-neutral-bg);
color: var(--platform-text-base);
font-weight: 700;
font-variant-numeric: tabular-nums;
}
.game-lineage-node__cover {
position: relative;
display: block;
width: 100%;
/* 横版封面:比例由 LINEAGE_COVER_ASPECT 内联给出(16:9,与发布面板封面预览一致)。 */
overflow: hidden;
background: var(--platform-surface-border);
}
.game-lineage-node__cover img,
.game-lineage-node__cover .game-cover__image {
width: 100%;
height: 100%;
object-fit: cover;
}
.game-lineage-node__cover .game-cover {
width: 100%;
height: 100%;
border-radius: 0;
}
/* 代际角标 = 中性。定位/尺寸由角标组统一管。 */
.game-lineage-node__badge {
border: 1px solid var(--platform-neutral-border);
background: var(--platform-neutral-bg);
color: var(--platform-neutral-text);
font-weight: 700;
}
.game-lineage-node__strip {
display: flex;
flex-direction: column;
gap: 0.1rem;
min-width: 0;
padding: 0.4rem 0.55rem 0.45rem;
}
.game-lineage-node__stub-body {
display: flex;
flex-direction: column;
gap: 0.25rem;
padding: 0.7rem 0.8rem;
min-width: 0;
}
/* 卡片底部操作行:两个**等权重**按钮并排(等宽、同高、同圆角),窄卡允许换行但不裁切。 */
.game-lineage-node__actions {
display: flex;
flex-wrap: wrap;
gap: 0.35rem;
padding: 0.45rem 0.5rem 0.55rem;
}
.game-lineage-node__actions > button {
flex: 1 1 0;
min-width: 6.4rem;
min-height: 2rem;
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 999px;
padding: 0 0.6rem;
font: inherit;
font-size: 0.74rem;
font-weight: 600;
cursor: pointer;
}
/* 次要动作(描边)。 */
.game-lineage-node__actions > .game-lineage-node__open-action {
border: 1px solid var(--platform-surface-border);
background: var(--platform-button-secondary-fill);
color: var(--platform-button-secondary-text);
}
/* 主要动作 = 开始共创(填充/着色)。 */
.game-lineage-node__fork {
border: 1px solid var(--platform-button-primary-border);
background: var(--platform-button-primary-solid);
color: var(--platform-button-primary-text);
font: inherit;
cursor: pointer;
}
.game-lineage-node__fork:hover {
color: var(--platform-text-strong);
}
.game-lineage-zoom {
color: var(--platform-text-soft);
font-size: 0.76rem;
font-variant-numeric: tabular-nums;
}
/* 尊重「减少动效」偏好:只保留状态变化,不做过渡动画。 */
@media (prefers-reduced-motion: reduce) {
.game-lineage-canvas__content,
.game-lineage-node,
.game-lineage-edge {
transition: none;
}
}
/* 窄屏:节点尺寸适合触摸,画布可横向平移(内容层平移而不是页面溢出)。 */
@media (max-width: 820px) {
.game-lineage-canvas {
height: clamp(20rem, 56vh, 34rem);
}
}
.game-loading-panel {
display: grid;
min-height: 18rem;
place-items: center;
color: var(--platform-text-soft);
font-weight: 700;
}
.game-status-message {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
margin-top: 1.2rem;
}
.game-status-message button {
border: 0;
border-radius: 999px;
min-height: 2.75rem;
padding: 0.38rem 0.7rem;
background: rgba(199, 101, 61, 0.14);
color: inherit;
cursor: pointer;
font: inherit;
font-size: 0.72rem;
font-weight: 800;
}
.game-play-page {
display: flex;
flex-direction: column;
gap: 0.9rem;
/* 游玩页是固定画布:撑满面板而不是撑高面板,页面本身永不滚动。 */
height: 100%;
min-height: 0;
padding: clamp(0.7rem, 1.8vw, 1.5rem);
}
.game-play-toolbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
}
.game-play-toolbar__actions {
display: flex;
align-items: center;
gap: 0.55rem;
}
.game-play-device-hint {
display: inline-flex;
align-items: center;
gap: 0.25rem;
color: var(--platform-text-soft);
font-size: 0.7rem;
}
.game-play-device-hint svg {
width: 0.85rem;
}
.game-icon-button {
display: grid;
width: 2.1rem;
height: 2.1rem;
min-width: 2.75rem;
min-height: 2.75rem;
place-items: center;
border: 1px solid var(--platform-surface-border);
border-radius: 50%;
background: var(--platform-panel-fill);
color: var(--platform-text-base);
cursor: pointer;
}
.game-icon-button svg {
width: 0.9rem;
}
.game-player-shell {
position: relative;
flex: 1 1 auto;
min-height: 0;
overflow: hidden;
border: 1px solid rgba(199, 101, 61, 0.24);
border-radius: 1.5rem;
background: #17131b;
box-shadow: 0 1.4rem 3rem rgba(34, 21, 20, 0.2);
}
.game-player-launch {
position: absolute;
inset: 0;
display: grid;
grid-template-columns: minmax(8rem, 15rem) minmax(0, 1fr);
/*
* safe:内容比容器高时退回 start,配合下面的兜底滚动,顶部标题与「开始游戏」
* 都不会像居中溢出那样被裁到滚不到的位置。
* 启动卡片是唯一允许内部滚动的兜底,页面与面板本身始终不滚动。
*/
align-items: center;
align-items: safe center;
overflow-y: auto;
gap: clamp(1.1rem, 4vw, 2.8rem);
padding: clamp(1rem, 4vw, 2.5rem);
background: linear-gradient(135deg, #1e1820, #302329);
color: #fff8f0;
}
.game-player-launch .game-cover {
border-radius: 1.1rem;
}
.game-player-launch__copy {
min-width: 0;
}
.game-player-launch__copy h1 {
margin: 0;
overflow: hidden;
font-size: clamp(1.4rem, 3vw, 2.2rem);
text-overflow: ellipsis;
white-space: nowrap;
}
.game-player-launch__copy p {
margin: 0.6rem 0 1.1rem;
color: rgba(255, 241, 227, 0.7);
font-size: 0.82rem;
line-height: 1.65;
}
.game-player-launch__copy .game-device-warning {
margin-top: -0.4rem;
}
.game-player-frame {
display: block;
width: 100%;
height: 100%;
min-height: 0;
border: 0;
opacity: 0;
transition: opacity 220ms ease;
}
.game-player-frame--ready {
opacity: 1;
}
.game-play-safety-note {
margin: 0;
color: var(--platform-text-soft);
font-size: 0.7rem;
text-align: center;
}
@media (max-width: 820px) {
.game-hero {
min-height: 19rem;
}
.game-hero__orb {
position: absolute;
right: -2.5rem;
bottom: -3rem;
width: 11rem;
opacity: 0.62;
}
.game-hero__copy {
max-width: 80%;
}
.game-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.game-cover__icon {
width: 3.7rem;
border-radius: 1rem;
font-size: 2rem;
}
}
@media (max-width: 560px) {
.game-page,
.game-detail-page {
padding: 1rem;
}
.game-hero {
border-radius: 1.5rem;
padding: 1.35rem;
}
.game-hero h1 {
font-size: 2rem;
}
.game-hero p {
font-size: 0.82rem;
}
.game-hero__copy {
max-width: 100%;
}
.game-hero__orb {
opacity: 0.3;
}
.game-hero__hint {
display: none;
}
.game-toolbar {
display: block;
margin-top: 1.7rem;
}
.game-search {
margin-top: 0.9rem;
}
.game-grid {
grid-template-columns: 1fr;
}
.game-cover {
min-height: 10.5rem;
}
.game-play-page {
padding: 0.7rem;
}
.game-player-launch {
grid-template-columns: 1fr;
/* safe:内容比容器高时退回 start,避免居中把顶部标题裁到滚不到的地方。 */
align-content: center;
align-content: safe center;
gap: 1rem;
text-align: center;
}
.game-player-launch .game-cover {
width: min(12rem, 65vw);
min-height: 8rem;
margin: 0 auto;
}
.game-player-launch__copy p {
margin-bottom: 0.8rem;
}
.game-player-launch__copy .platform-button {
min-height: 2.75rem;
}
.game-play-toolbar__actions .game-play-device-hint {
display: none;
}
}
/*
* 矮视口(横屏手机)里播放器只剩很小的高度,压扁启动面板保证
* 「开始游戏」可达;页面依旧不滚动,只有这一块在极端情况下内部兜底。
*/
@media (max-height: 26rem) {
.game-player-launch {
grid-template-columns: minmax(0, 1fr);
/* 单行布局下由 align-content 决定纵向位置,同样必须用 safe。 */
align-content: center;
align-content: safe center;
gap: 0.5rem;
padding: 0.75rem 1rem;
text-align: center;
}
.game-player-launch .game-cover {
display: none;
}
.game-player-launch__copy p {
display: -webkit-box;
margin: 0.25rem 0 0.6rem;
overflow: hidden;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
}
.game-player-timeout {
font-size: 0.8rem;
}
}
.my-game-list {
display: grid;
/* 与画廊 .game-grid 同口径:轨道可以被压到内容最小宽度以下,否则长标题/长简介
会把单列轨道撑到视口之外,移动端面板出现横向滚动。 */
grid-template-columns: minmax(0, 1fr);
gap: 0.9rem;
}
.my-game-card {
display: flex;
/* 与 .game-card 同口径:卡片自身可被压缩并裁掉溢出,保证卡片永不宽于所在轨道。 */
min-width: 0;
overflow: hidden;
gap: 1rem;
align-items: stretch;
border: 1px solid var(--platform-surface-border);
border-radius: 1.2rem;
padding: 0.85rem;
background: var(--platform-panel-fill);
box-shadow: var(--platform-panel-shadow);
}
.my-game-card .game-cover {
flex: none;
width: 8.5rem;
min-height: 6rem;
border-radius: 0.9rem;
}
.my-game-card__body {
display: flex;
min-width: 0;
flex: 1;
flex-direction: column;
gap: 0.35rem;
}
.my-game-card__heading {
display: flex;
align-items: center;
justify-content: space-between;
gap: 0.6rem;
}
.my-game-card__title {
min-width: 0;
overflow-wrap: anywhere;
border: 0;
padding: 0;
background: transparent;
color: inherit;
cursor: pointer;
font: inherit;
font-size: 1rem;
font-weight: 800;
text-align: left;
}
.my-game-card__summary {
margin: 0;
overflow: hidden;
color: var(--platform-text-base);
font-size: 0.78rem;
line-height: 1.5;
text-overflow: ellipsis;
white-space: nowrap;
}
.my-game-card__meta {
display: flex;
flex-wrap: wrap;
gap: 0.35rem;
color: var(--platform-text-soft);
font-size: 0.7rem;
}
.my-game-card__reason {
margin: 0;
color: var(--platform-button-danger-text);
font-size: 0.72rem;
}
.my-game-card__actions {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.5rem;
margin-top: auto;
padding-top: 0.35rem;
}
.my-game-status {
flex: none;
border-radius: 999px;
padding: 0.25rem 0.6rem;
font-size: 0.68rem;
font-weight: 800;
background: var(--platform-surface-fill);
color: var(--platform-text-soft);
}
.my-game-status--published {
background: var(--platform-success-bg);
color: var(--platform-success-text);
}
.my-game-status--suspended {
background: var(--platform-button-danger-fill);
color: var(--platform-button-danger-text);
}
.my-game-status--fork-full {
background: rgba(199, 101, 61, 0.14);
color: var(--platform-accent-strong);
}
.my-game-card__fork-confirm {
flex: 1 1 100%;
color: var(--platform-text-soft);
font-size: 0.72rem;
line-height: 1.5;
}
@media (max-width: 560px) {
.my-game-card {
flex-direction: column;
}
.my-game-card .game-cover {
width: 100%;
}
}
/* 作品管理:筛选、版本历史、下一步提示与作者状态面板。 */
.my-game-filters {
display: flex;
flex-wrap: wrap;
align-items: end;
gap: 0.75rem;
margin-bottom: 0.9rem;
}
.my-game-filters .game-publish-field {
flex: 1 1 9rem;
max-width: 15rem;
}
.my-game-card__next-step {
margin: 0;
color: var(--platform-text-soft);
font-size: 0.72rem;
font-weight: 700;
}
.my-game-card__history-toggle {
align-self: flex-start;
border: 0;
padding: 0;
background: transparent;
color: var(--platform-accent-strong);
font: inherit;
font-size: 0.72rem;
font-weight: 700;
cursor: pointer;
}
.my-game-card__history-toggle:hover {
text-decoration: underline;
}
.game-version-list {
display: grid;
gap: 0.4rem;
margin: 0.2rem 0 0;
padding: 0;
list-style: none;
}
.game-version-list__item {
display: grid;
gap: 0.2rem;
border: 1px solid var(--platform-surface-border);
border-radius: 0.8rem;
padding: 0.5rem 0.7rem;
background: var(--platform-surface-fill);
min-width: 0;
}
.game-version-list__heading {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.45rem;
font-size: 0.78rem;
}
.game-version-list__meta {
display: flex;
flex-wrap: wrap;
gap: 0.35rem;
color: var(--platform-text-soft);
font-size: 0.68rem;
}
.game-version-list__reason {
margin: 0;
color: var(--platform-button-danger-text);
font-size: 0.7rem;
}
.game-version-list__action {
margin: 0;
color: var(--platform-text-soft);
font-size: 0.7rem;
font-weight: 600;
}
.game-version-status {
border-radius: 999px;
padding: 0.15rem 0.5rem;
background: var(--platform-surface-fill);
color: var(--platform-text-soft);
font-size: 0.64rem;
font-weight: 800;
}
.game-version-status--published {
background: var(--platform-success-bg);
color: var(--platform-success-text);
}
.game-version-status--rejected,
.game-version-status--upload_failed,
.game-version-status--validation_failed {
background: var(--platform-button-danger-fill);
color: var(--platform-button-danger-text);
}
.game-owner-panel {
display: grid;
gap: 0.5rem;
margin-top: 1rem;
border: 1px solid var(--platform-surface-border);
border-radius: 1.2rem;
padding: 0.9rem 1rem;
background: var(--platform-panel-fill);
}
.game-owner-panel__heading {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
gap: 0.6rem;
}
.game-owner-panel__heading h2 {
margin: 0;
font-size: 1rem;
letter-spacing: -0.02em;
}
.game-owner-panel__meta {
display: flex;
flex-wrap: wrap;
gap: 0.35rem;
color: var(--platform-text-soft);
font-size: 0.72rem;
}
.game-owner-panel__reason {
margin: 0;
color: var(--platform-button-danger-text);
font-size: 0.72rem;
}
.game-work-editor {
display: grid;
gap: 0.85rem;
}
.game-publish-page {
max-width: 54rem;
}
.game-publish-form {
display: grid;
gap: 0.85rem;
margin-top: 0.4rem;
}
.game-publish-field {
display: grid;
gap: 0.3rem;
font-size: 0.76rem;
font-weight: 700;
color: var(--platform-text-base);
}
.game-publish-field input,
.game-publish-field select,
.game-publish-field textarea {
width: 100%;
box-sizing: border-box;
border: 1px solid var(--platform-surface-border);
border-radius: 0.7rem;
padding: 0.55rem 0.7rem;
background: var(--platform-panel-fill);
color: var(--platform-text-strong);
font: inherit;
font-weight: 500;
}
.game-publish-field textarea {
resize: vertical;
}
.game-publish-row {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 0.7rem;
}
.game-publish-fieldset {
display: flex;
flex-wrap: wrap;
gap: 0.9rem;
margin: 0;
border: 1px solid var(--platform-surface-border);
border-radius: 0.7rem;
padding: 0.6rem 0.8rem;
}
.game-publish-fieldset legend {
padding: 0 0.3rem;
font-size: 0.72rem;
font-weight: 700;
}
.game-publish-checkbox {
display: inline-flex;
align-items: center;
gap: 0.35rem;
font-size: 0.76rem;
}
.game-publish-hint {
color: var(--platform-text-soft);
font-size: 0.7rem;
font-weight: 500;
}
.game-publish-media {
display: grid;
gap: 0.9rem;
}
.game-publish-media__cover {
display: flex;
flex-wrap: wrap;
gap: 0.9rem;
align-items: flex-start;
}
.game-publish-media__copy {
display: grid;
flex: 1 1 16rem;
gap: 0.45rem;
min-width: 0;
}
.game-publish-media__preview {
display: flex;
align-items: center;
justify-content: center;
width: min(15rem, 100%);
aspect-ratio: 16 / 9;
overflow: hidden;
border: 1px solid var(--platform-surface-border);
border-radius: 0.7rem;
background: linear-gradient(
135deg,
rgba(241, 159, 95, 0.22),
rgba(91, 49, 42, 0.14)
);
}
.game-publish-media__preview img {
width: 100%;
height: 100%;
object-fit: cover;
}
.game-publish-media__placeholder {
display: flex;
align-items: center;
justify-content: center;
color: var(--platform-text-soft);
font-size: 0.72rem;
font-weight: 600;
}
.game-publish-media__picker {
position: relative;
display: inline-flex;
align-items: center;
}
/* 透明 input 覆盖在触发按钮上:真实点击永远命中原生控件,自定义文案只负责显示。 */
.game-publish-media__picker input[type='file'] {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
margin: 0;
padding: 0;
border: 0;
opacity: 0;
cursor: pointer;
}
.game-publish-media__pick {
display: inline-flex;
pointer-events: none;
align-items: center;
padding: 0.35rem 0.85rem;
border: 1px solid var(--platform-surface-border);
border-radius: 999px;
background: var(--platform-panel-fill);
color: var(--platform-text-strong);
font-size: 0.74rem;
font-weight: 600;
cursor: pointer;
transition: 160ms ease;
}
.game-publish-media__picker:hover .game-publish-media__pick {
border-color: rgba(199, 101, 61, 0.45);
}
.game-publish-media__picker
input[type='file']:focus-visible
+ .game-publish-media__pick {
outline: 2px solid rgba(199, 101, 61, 0.35);
outline-offset: 2px;
}
.game-publish-media__picker
input[type='file']:disabled
+ .game-publish-media__pick {
opacity: 0.55;
cursor: not-allowed;
}
.game-publish-media__screenshots {
display: grid;
gap: 0.6rem;
}
.game-publish-media__strip {
display: flex;
flex-wrap: wrap;
gap: 0.6rem;
margin: 0;
padding: 0;
list-style: none;
}
.game-publish-media__shot {
display: grid;
gap: 0.3rem;
width: 8.5rem;
}
.game-publish-media__shot img {
width: 100%;
aspect-ratio: 16 / 9;
object-fit: cover;
border: 1px solid var(--platform-surface-border);
border-radius: 0.55rem;
}
.game-publish-media__shot .game-publish-media__placeholder {
width: 100%;
aspect-ratio: 16 / 9;
border: 1px dashed var(--platform-surface-border);
border-radius: 0.55rem;
}
.game-publish-media__remove {
justify-self: start;
border: 1px solid var(--platform-surface-border);
border-radius: 999px;
padding: 0.25rem 0.6rem;
background: transparent;
color: var(--platform-text-soft);
font: inherit;
font-size: 0.7rem;
cursor: pointer;
}
.game-publish-media__remove:hover:not(:disabled) {
color: var(--platform-text-strong);
}
.game-publish-media__remove:disabled {
opacity: 0.55;
cursor: not-allowed;
}
.game-publish-actions {
display: flex;
justify-content: flex-end;
}
@media (max-width: 560px) {
.game-publish-row {
grid-template-columns: 1fr;
}
.my-game-filters .game-publish-field {
max-width: none;
}
.game-publish-media__preview {
width: 100%;
}
.game-publish-media__shot {
width: calc(50% - 0.3rem);
}
}
/* 桌面端首屏:压缩 hero 高度,让第一排游戏卡片在 900px 视口内就能看到。 */
@media (min-width: 1024px) {
.game-hero {
min-height: 13rem;
padding: clamp(1.5rem, 3vw, 2.5rem) clamp(1.5rem, 3.5vw, 3rem);
}
.game-hero h1 {
margin-top: 0.6rem;
font-size: clamp(1.8rem, 3.2vw, 2.6rem);
}
.game-hero p {
margin-top: 0.7rem;
max-width: 30rem;
font-size: 0.9rem;
line-height: 1.6;
}
.game-hero__actions {
margin-top: 1rem;
}
.game-hero__orb {
width: clamp(7rem, 14vw, 12rem);
}
}
/*
* 创作族谱页。树按代际分段,每段用自适应网格排节点卡片:窄屏单列、宽屏多列,
* 长标题与较大的游玩数都靠 `overflow-wrap: anywhere` + 网格换行收在容器内,
* 不产生横向溢出,也不需要桌面端才有的交互。
*/
.game-lineage-page {
max-width: 70rem;
margin: 0 auto;
display: flex;
flex-direction: column;
gap: 0.9rem;
}
.game-lineage-notice {
margin: 0;
padding: 0.6rem 0.8rem;
border: 1px solid var(--platform-surface-border);
border-radius: 0.6rem;
background: var(--platform-surface-muted, rgba(0, 0, 0, 0.02));
color: var(--platform-text-base);
font-size: 0.82rem;
line-height: 1.6;
overflow-wrap: anywhere;
}
.game-lineage-notice--muted {
color: var(--platform-text-soft);
}
.game-lineage-retry {
margin-left: 0.6rem;
border: 1px solid currentColor;
border-radius: 999px;
padding: 0.2rem 0.7rem;
background: transparent;
color: inherit;
font: inherit;
font-size: 0.78rem;
cursor: pointer;
}
.game-lineage-node {
display: flex;
flex-direction: column;
gap: 0.35rem;
min-width: 0;
border: 1px solid var(--platform-surface-border);
border-radius: 0.75rem;
padding: 0.7rem 0.8rem;
background: var(--platform-surface, #fff);
}
.game-lineage-node--anchor {
border-color: var(--platform-accent-strong);
box-shadow: 0 0 0 2px rgba(199, 101, 61, 0.18);
}
.game-lineage-node__head {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.4rem;
}
.game-lineage-node__generation,
.game-lineage-node__anchor {
border-radius: 999px;
padding: 0.1rem 0.5rem;
font-size: 0.7rem;
font-weight: 700;
}
.game-lineage-node__generation {
background: var(--platform-surface-border);
color: var(--platform-text-soft);
}
/* 「当前作品」= 主色实心(最强的一枚)。 */
.game-lineage-node__anchor {
border: 1px solid var(--platform-accent);
background: var(--platform-accent);
color: var(--platform-button-primary-text);
font-weight: 700;
}
.game-lineage-node__title {
border: none;
padding: 0;
background: transparent;
color: var(--platform-text-strong);
font: inherit;
font-size: 0.95rem;
font-weight: 700;
text-align: left;
overflow-wrap: anywhere;
cursor: pointer;
}
.game-lineage-node__title:hover {
text-decoration: underline;
}
.game-lineage-node__meta {
display: flex;
flex-wrap: wrap;
gap: 0.3rem;
margin: 0;
color: var(--platform-text-soft);
font-size: 0.78rem;
overflow-wrap: anywhere;
}
.game-lineage-node__parent-unavailable {
margin: 0;
color: var(--platform-text-soft);
font-size: 0.74rem;
}
/*
* 我的作品页「被改编 N」行内展开:与版本历史同一节奏,不挤占动作行的位置。
*/
.my-game-card__derived-toggle {
align-self: flex-start;
border: 1px solid var(--platform-surface-border);
border-radius: 999px;
padding: 0.2rem 0.7rem;
background: transparent;
color: var(--platform-text-base);
font: inherit;
font-size: 0.76rem;
font-weight: 600;
cursor: pointer;
}
.my-game-card__derived-toggle:hover:not(:disabled) {
color: var(--platform-text-strong);
}
.my-game-card__derived {
display: flex;
flex-direction: column;
gap: 0.4rem;
border: 1px solid var(--platform-surface-border);
border-radius: 0.6rem;
padding: 0.6rem 0.7rem;
background: var(--platform-surface-muted, rgba(0, 0, 0, 0.02));
}
.my-game-card__derived-empty,
.my-game-card__derived-error,
.my-game-card__derived-truncated {
margin: 0;
color: var(--platform-text-soft);
font-size: 0.78rem;
overflow-wrap: anywhere;
}
.my-game-card__derived-item {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.4rem;
min-width: 0;
}
.my-game-card__derived-title {
border: none;
padding: 0;
background: transparent;
color: var(--platform-text-strong);
font: inherit;
font-size: 0.85rem;
font-weight: 700;
text-align: left;
overflow-wrap: anywhere;
cursor: pointer;
}
.my-game-card__derived-title:hover {
text-decoration: underline;
}
.my-game-card__derived-meta {
color: var(--platform-text-soft);
font-size: 0.76rem;
overflow-wrap: anywhere;
}
/* 个人创作数据概览(我的作品页):与详情页共创模块同一视觉语言。 */
.co-creation-overview {
display: flex;
flex-wrap: wrap;
gap: 0.8rem;
padding: 0.55rem 0.7rem;
border: 1px solid var(--platform-surface-border);
border-radius: 0.7rem;
background: var(--platform-surface-muted, rgba(104, 54, 36, 0.04));
}
.co-creation-overview .co-creation-stat {
color: var(--platform-text-soft);
font-size: 0.78rem;
font-variant-numeric: tabular-nums;
}
/*
* 移动端「大纲式缩进树」(默认形态):全宽行 + 左缩进 + 肘形导线,**无横向滚动**。
* 每行 ≥44px 触控目标;点击行=选中,行内「打开 / 开始共创」是次要动作。
*/
.lineage-outline {
display: flex;
flex-direction: column;
gap: 0.15rem;
/* 内容列限宽 + 居中:大纲不再整屏出血(宽屏上曾是 1300px+ 横条,中间大片空白)。
操作按钮固定在行右端 = 内容列右端,不会飘到屏幕最右侧。 */
margin: 0 auto;
padding: 0;
list-style: none;
width: 100%;
max-width: 54rem;
overflow-x: hidden;
}
.lineage-outline__row {
display: flex;
align-items: center;
gap: 0.2rem;
min-width: 0;
max-width: 100%;
/* 统一基线:所有行同高(缩略图 16:9 + 标题最多 2 行),卡片高度不再参差。 */
min-height: 3.5rem;
box-sizing: border-box;
}
.lineage-outline__guide {
flex: 0 0 auto;
width: 1.1rem;
color: var(--platform-surface-border);
font-size: 0.8rem;
line-height: 1;
text-align: center;
}
/* 主干链的导线加粗并用主题色(与桌面「主干线粗实线」同语义)。 */
.lineage-outline__guide--trunk {
color: var(--platform-accent-strong);
font-weight: 700;
}
.lineage-outline__main {
display: block;
flex: 1 1 auto;
min-width: 0;
min-height: 2.75rem;
border: 1px solid transparent;
border-radius: 0.6rem;
padding: 0.3rem 0.4rem;
background: transparent;
color: inherit;
font: inherit;
text-align: left;
cursor: pointer;
}
.lineage-outline__row--selected .lineage-outline__main,
.lineage-outline__main--current {
border-color: var(--platform-accent-strong);
background: rgba(199, 101, 61, 0.12);
}
.lineage-outline__action {
flex: 0 0 auto;
min-height: 2.4rem;
border: 1px solid var(--platform-surface-border);
border-radius: 999px;
padding: 0 0.7rem;
background: var(--platform-surface, #fff);
color: var(--platform-text-base);
font: inherit;
font-size: 0.76rem;
font-weight: 600;
cursor: pointer;
}
/* 大纲行的两个动作与画布卡片同一套主次:打开作品 = 描边(次要),开始共创 = 填充(主要)。 */
.lineage-outline__action--co-create {
border-color: var(--platform-button-primary-border);
background: var(--platform-button-primary-solid);
color: var(--platform-button-primary-text);
}
.lineage-outline__actions {
display: flex;
flex: 0 0 auto;
gap: 0.25rem;
/* 与标题同一视觉组:贴文字右侧、行内右端,不跨出限宽内容列。 */
margin-left: 0.25rem;
}
/* 大纲行里的标题:单行省略(不逐字换行)。 */
.lineage-outline .game-lineage-node__title {
-webkit-line-clamp: 1;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.lineage-outline .game-lineage-node__meta {
font-size: 0.72rem;
color: var(--platform-text-soft);
}
.lineage-filter__switch,
.game-lineage-filter__switch {
border: 1px solid var(--platform-surface-border);
border-radius: 999px;
padding: 0.25rem 0.8rem;
background: var(--platform-surface, #fff);
color: var(--platform-text-base);
font: inherit;
font-size: 0.78rem;
font-weight: 600;
cursor: pointer;
}
/* 开关按下态:明确的可视反馈(不是只靠 aria-pressed 属性)。 */
.game-lineage-filter__switch[aria-pressed='true'] {
border-color: var(--platform-accent-strong);
background: rgba(199, 101, 61, 0.12);
color: var(--platform-accent-strong);
}
/*
* 「父代 / 子代」角标:**可读文本**(不是只靠颜色深浅),所以可断言、读屏也能读到;
* 自己是「当前作品」角标、旁支不标注。颜色只是辅助表达。
*/
.game-lineage-node__relation {
align-self: flex-start;
padding: 0 0.35rem;
border: 1px solid currentColor;
border-radius: 999px;
font-size: 0.62rem;
line-height: 1.6;
white-space: nowrap;
}
/* 父代 = cool 色系。 */
.game-lineage-node__relation--ancestor {
border: 1px solid var(--platform-cool-border);
background: var(--platform-cool-bg);
color: var(--platform-cool-text);
font-weight: 700;
}
/* 子代 = success 色系。 */
.game-lineage-node__relation--descendant {
border: 1px solid var(--platform-success-border);
background: var(--platform-success-bg);
color: var(--platform-success-text);
font-weight: 700;
}
/* 画布卡片按角色加描边(辅助:主表达仍是上面的角标与 data-relation)。 */
.game-lineage-node[data-relation='ancestor'] {
border-color: var(--platform-accent-strong);
}
.lineage-outline__row[data-relation='ancestor'] .lineage-outline__main {
border-left: 3px solid var(--platform-accent-strong);
}
.lineage-outline__row[data-relation='descendant'] .lineage-outline__main {
border-left: 3px solid var(--platform-surface-border);
}
.game-lineage-filter__switch[aria-pressed='true'] {
border-color: var(--platform-accent-strong);
color: var(--platform-accent-strong);
}
/* 移动端信息面板 = bottom sheet:底部升起、可下拉关闭(遮罩点击关闭)。 */
.game-lineage-sheet-backdrop {
position: absolute;
inset: 0;
z-index: 3;
border: 0;
padding: 0;
background: rgba(0, 0, 0, 0.32);
cursor: pointer;
}
.game-lineage-panel--sheet {
/* bottom sheet 用 fixed:不依赖页面里有没有定位祖先。 */
position: fixed;
top: auto;
left: 0;
right: 0;
bottom: 0;
width: 100%;
max-height: 70%;
border-radius: 1rem 1rem 0 0;
/* 底部安全区:iPhone 手势条不被内容压住。 */
padding-bottom: calc(0.9rem + env(safe-area-inset-bottom, 0px));
box-shadow: 0 -8px 24px rgba(0, 0, 0, 0.22);
}
.game-lineage-panel__close {
align-self: flex-end;
border: 1px solid var(--platform-surface-border);
border-radius: 999px;
padding: 0.15rem 0.7rem;
background: transparent;
color: var(--platform-text-base);
font: inherit;
font-size: 0.76rem;
cursor: pointer;
}
/* 面包屑:移动端横向可滚动,当前项常驻可见(组件里用 scrollIntoView 保证)。 */
.game-lineage-breadcrumb {
overflow-x: auto;
overflow-y: hidden;
flex-wrap: nowrap;
}
.game-lineage-breadcrumb__item {
flex: 0 0 auto;
}
/* 移动端:画布高度更紧凑,悬浮控件只留图标(已有规则),并给底部安全区留白。 */
@media (max-width: 820px) {
.game-lineage-canvas {
height: clamp(18rem, 52vh, 30rem);
}
.game-lineage-page {
padding-bottom: env(safe-area-inset-bottom, 0px);
}
}
/*
* 图谱下方的「父代 / 子代」两块清单(2026-10-07):与大纲同一套行样式(复用 LineageNodeContent),
* 只把列表收窄到内容列宽并居中,避免又变成整屏出血的横条。
*/
.lineage-relations {
display: flex;
flex-direction: column;
gap: 1rem;
margin-top: 1.25rem;
}
.lineage-relation {
display: flex;
flex-direction: column;
gap: 0.4rem;
}
.lineage-relation__title {
display: flex;
align-items: baseline;
gap: 0.4rem;
margin: 0;
font-size: 0.95rem;
font-weight: 700;
}
.lineage-relation__count {
border: 1px solid var(--platform-neutral-border);
border-radius: 999px;
padding: 0 0.4rem;
background: var(--platform-neutral-bg);
color: var(--platform-neutral-text);
font-size: 0.7rem;
font-weight: 600;
}
.lineage-relation__hint {
color: var(--platform-text-muted);
font-size: 0.72rem;
font-weight: 500;
}
.lineage-relation__empty {
margin: 0;
color: var(--platform-text-soft);
font-size: 0.8rem;
}
.lineage-relation__list {
display: flex;
flex-direction: column;
gap: 0.3rem;
margin: 0;
padding: 0;
list-style: none;
max-width: 54rem;
}
.lineage-relation__row {
display: flex;
min-width: 0;
}
.lineage-relation__main {
display: block;
flex: 1 1 auto;
min-width: 0;
min-height: 2.75rem;
border: 1px solid var(--platform-surface-border);
border-radius: 0.6rem;
padding: 0.3rem 0.5rem;
background: var(--platform-surface, #fff);
color: inherit;
font: inherit;
text-align: left;
cursor: pointer;
}
.lineage-relation__main:hover {
border-color: var(--platform-surface-hover-border);
}
/*
* 「一键开始共创」在主操作行里:**必须与「立即玩」同一套视觉权重**。
*
* 为什么需要这段:按钮原先住在 `.game-detail-info-card` 里,样式被卡内作用域套着
* (`.game-detail-info-card .game-fork-remix-link` / `.co-creation-fork-primary`);
* 搬到 `actions` 主操作行后**选择器不再命中**,按钮退回浏览器默认样式(细边框 + 无内边距),
* 于是与「立即玩」不是一个量级。这里把它按平台主操作按钮的度量固定下来(实心强调、lg 高度)。
*/
.game-fork-remix-link.co-creation-fork-primary {
display: inline-flex;
align-items: center;
justify-content: center;
align-self: center;
gap: 0.35rem;
/* 与主操作行里的「立即玩」逐项对齐(实测:高 48 / 圆角 16 / 内边距 0 16 / 字号 15)。 */
min-height: 3rem;
padding: 0 1rem;
border: 1px solid var(--platform-button-primary-border);
border-radius: 1rem;
background: var(--platform-button-primary-solid);
color: var(--platform-button-primary-text);
font: inherit;
font-size: 0.94rem;
font-weight: 600;
cursor: pointer;
}
.game-fork-remix-link.co-creation-fork-primary:hover {
background: var(--platform-accent-strong, var(--platform-accent));
}
/* 禁止共创:置灰但可点(点了给原因),与平台 disabled 观感一致。 */
.co-creation-fork-primary--blocked,
.game-fork-remix-link.co-creation-fork-primary--blocked {
border-color: var(--platform-surface-border);
background: var(--platform-surface-muted, rgba(0, 0, 0, 0.04));
color: var(--platform-text-soft);
cursor: not-allowed;
}
/* 「全屏查看族谱」= 次级动作(描边),别和主操作抢焦点。 */
.game-fork-lineage-link {
display: inline-flex;
align-items: center;
justify-content: center;
align-self: center;
min-height: 2rem;
padding: 0 0.85rem;
border: 1px solid var(--platform-surface-border);
border-radius: 999px;
background: var(--platform-button-secondary-fill);
color: var(--platform-button-secondary-text);
font: inherit;
font-size: 0.82rem;
font-weight: 600;
cursor: pointer;
white-space: nowrap;
}
.game-fork-lineage-link:hover {
border-color: var(--platform-surface-hover-border);
}
/*
* 「全屏查看族谱」的真·全屏 overlay:portal 到 body + position:fixed inset:0,
* 因此不受详情页/平台 tab 面板的宽度、max-width、overflow 约束(之前是路由跳转,名不副实)。
* 移动端同样整屏,并给刘海/底部条留安全区。
*/
.lineage-fullscreen {
position: fixed;
inset: 0;
z-index: 90;
display: flex;
flex-direction: column;
background: var(--platform-body-fill, #fff);
padding-top: env(safe-area-inset-top);
padding-right: env(safe-area-inset-right);
padding-bottom: env(safe-area-inset-bottom);
padding-left: env(safe-area-inset-left);
}
.lineage-fullscreen__bar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 0.75rem;
padding: 0.55rem 1rem;
border-bottom: 1px solid var(--platform-surface-border);
background: var(--platform-surface, #fff);
}
.lineage-fullscreen__title {
margin: 0;
font-size: 1rem;
font-weight: 700;
}
.lineage-fullscreen__close {
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 2.25rem;
padding: 0 1rem;
border: 1px solid var(--platform-surface-border);
border-radius: 999px;
background: var(--platform-button-secondary-fill);
color: var(--platform-button-secondary-text);
font: inherit;
font-size: 0.85rem;
font-weight: 600;
cursor: pointer;
}
.lineage-fullscreen__body {
flex: 1 1 auto;
min-height: 0;
/* overlay 自己滚:画布先占满一屏,父代/子代清单接在下面(不挤压画布)。
两条滚动条(overlay + 画布)都保留,各自负责各的内容。 */
overflow: auto;
padding: 0.5rem 1rem 1rem;
}
/*
* 全屏模式下画布**吃满一屏**:高度 = 视口 − 头部栏 − 筛选/控件两行(`--lineage-overlay-chrome`)。
* 内嵌在详情页时仍走 `.game-lineage-canvas` 的可读高度上限(clamp(22rem, 62vh, 46rem)),
* 两种模式分开取值、互不影响。
*/
.lineage-fullscreen {
--lineage-overlay-chrome: 6.5rem;
}
.lineage-fullscreen__body .game-lineage-canvas {
height: calc(100dvh - var(--lineage-overlay-chrome));
max-height: calc(100dvh - var(--lineage-overlay-chrome));
min-height: 18rem;
}
/*
* 封面固定 **16:9 且必须铺满**(2026-10-07 用户口径:「封面固定 16:9,并且图片一定要铺满,不要留空白」)。
* 之前画布卡片的封面 `aspect-ratio` 是 `auto`、且作为纵向 flex 子项被拉伸,图片只占上半截 → 下半截是空白;
* 大纲/关系行的封面虽然 16:9,但内部图片被撑到 192px 高、只露出一条 → 也不是「铺满」。
* 这里把三处统一:容器强制 16:9(`flex: 0 0 auto` 防止被 flex 拉伸)、
* 内层 wrapper 与 img 100%×100% + `object-fit: cover`。无封面时的占位仍由 `GameCover` 自己给(保留兜底)。
*/
.game-lineage-node__cover {
position: relative;
display: block;
width: 100%;
aspect-ratio: 16 / 9;
flex: 0 0 auto;
overflow: hidden;
}
.game-lineage-node__cover .game-cover,
.game-lineage-node__cover .game-cover__image,
.game-lineage-node__cover img {
display: block;
width: 100%;
height: 100%;
}
/*
* 收敛共享样式:`.game-cover` 自带 `min-height: 12rem`(紧凑态 7rem),在族谱封面里会把内层盒子
* 撑到 192px —— `height: 100%` 因此永远不生效,img 盒虚高到 192px、只靠 `overflow: hidden` 裁。
* 这里把 min-height 归零,让内层盒真正等于封面盒(16:9),不需要任何裁切兜底。
*/
.game-lineage-node__cover .game-cover {
min-height: 0;
}
.game-lineage-node__cover img {
object-fit: cover;
object-position: center;
}
/*
* 主操作行「任何状态都不换行、不被挤扁」(2026-10-07 用户口径:提示显示成 toast,别挤占元素空间)。
* 行内状态文本已经全部改走 toast / portal 浮层;这里再钉一层样式保险:
* 子项不收缩、文字不折行 —— 无论旁边以后再加什么,都不会把「立即玩 / 收藏 / 一键开始共创」压成两行。
*/
.game-detail-hero__actions > * {
flex: 0 0 auto;
white-space: nowrap;
}
/* 读屏专用:保留 id(`aria-describedby` 还指着它)但不占布局空间。 */
.game-device-warning--sr {
position: absolute;
width: 1px;
height: 1px;
margin: -1px;
padding: 0;
overflow: hidden;
clip-path: inset(50%);
white-space: nowrap;
border: 0;
}
/*
* 「手动开始共创」面板:portal 到 `body` 的浮层(底部居中),
* 不再作为主操作行的子项参与布局 —— 打开面板不会把同行按钮挤走。
*/
.game-fork-remix-panel--portal {
position: fixed;
left: 50%;
bottom: calc(1rem + env(safe-area-inset-bottom));
transform: translateX(-50%);
z-index: 110;
max-width: min(34rem, calc(100vw - 2rem));
box-shadow: 0 18px 48px rgba(48, 32, 22, 0.22);
}
/* 轻提示宿主:固定右下角堆叠,`pointer-events: none` 让空白区域不挡点击。 */
.platform-toast-host {
position: fixed;
right: 1rem;
bottom: calc(1rem + env(safe-area-inset-bottom));
z-index: 130;
display: flex;
flex-direction: column;
gap: 0.5rem;
max-width: min(26rem, calc(100vw - 2rem));
pointer-events: none;
}
.platform-toast-host__item {
pointer-events: auto;
display: inline-flex;
align-items: center;
gap: 0.5rem;
box-shadow: 0 12px 32px rgba(48, 32, 22, 0.18);
}
.platform-toast-host__text {
white-space: normal;
line-height: 1.5;
}
.platform-toast-host__close {
flex: 0 0 auto;
border: 0;
padding: 0;
background: transparent;
color: inherit;
font: inherit;
font-size: 0.78rem;
text-decoration: underline;
cursor: pointer;
}