Files
Genarrative/src/components/game-distribution/gameDistribution.css
T
suzmii 96309c895c
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
新增「原版与二创对比」页与路由登记(含 nginx×3 + Pingora allowlist)
- 新增路由 /games/compare(stage game-compare):STAGE_ROUTE_ENTRIES + SelectionStage 类型 + 壳层 lazy 引入/导航回调/渲染分支 + 页面标题,四处同批登记
- 三份 nginx SPA allowlist(deploy/nginx/genarrative.conf、deploy/nginx/genarrative-dev-http.conf、deploy/container/nginx.conf)与 Pingora MAIN_SPA_PATHS 同步放行 /games/compare(保持既有排序):check:nginx-spa-routes 18 SPA routes、check:pingora-route-parity 均绿
- 对比页左右两侧各自取数与降级:任一侧不可读(不存在/未公开/已软删除)或没有可玩版本时只降级那一侧,另一侧照常;显示标题、作者与代际;桌面左右并排、窄屏上下堆叠
- iframe 复用游玩页同一份嵌入:抽出 GamePlayFrame(sandbox=allow-scripts、allow=fullscreen、referrerPolicy=no-referrer、.game-player-frame),游玩页改为渲染它,不再存在第二套嵌入逻辑
- 入口:二创作品详情页在存在父作品时给出「与原版对比」;族谱节点仅在其父作品可见时给出同一入口
- 测试:对比页两侧渲染与 iframe 复用属性、单侧降级后另一侧照常;详情页入口(有/无父作品);族谱节点入口(父可见才出现);路由与标题登记;壳层「族谱节点→对比页」导航与对比 stage 渲染
- 顺手:按 eslint 自动修复两个文件的 import 排序
2026-10-06 00:56:31 +08:00

1487 lines
34 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-detail-info-card .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-detail-info-card .game-fork-lineage-link:hover {
background: rgba(199, 101, 61, 0.12);
}
/*
* 「改造这个作品」:入口 + 展开后的获取方式面板。都在共创信息卡内,
* 窄屏靠网格换行与 `overflow-wrap: anywhere` 收在侧栏里,不产生横向溢出。
*/
.game-detail-info-card .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-detail-info-card .game-fork-remix-link:hover {
background: rgba(199, 101, 61, 0.2);
}
.game-detail-info-card .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-detail-info-card .game-fork-remix-steps {
color: var(--platform-text-base);
overflow-wrap: anywhere;
}
.game-detail-info-card .game-fork-remix-value {
min-width: 0;
color: var(--platform-text-soft);
overflow-wrap: anywhere;
}
.game-detail-info-card .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-detail-info-card .game-fork-remix-actions {
display: flex;
flex-wrap: wrap;
gap: 0.35rem;
}
.game-detail-info-card .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-detail-info-card .game-fork-remix-note {
color: var(--platform-text-soft);
overflow-wrap: anywhere;
}
.game-detail-info-card .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-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-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-tree {
display: flex;
flex-direction: column;
gap: 1rem;
}
.game-lineage-generation {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.game-lineage-generation__label {
display: inline-flex;
align-items: center;
gap: 0.4rem;
margin: 0;
color: var(--platform-text-strong);
font-size: 0.9rem;
font-weight: 700;
}
.game-lineage-generation__count {
border-radius: 999px;
padding: 0.05rem 0.5rem;
background: var(--platform-surface-border);
color: var(--platform-text-soft);
font-size: 0.72rem;
font-weight: 600;
}
.game-lineage-generation__nodes {
display: grid;
/* `min(13rem, 100%)`:桌面端列宽不变,视口窄于 13rem 时下限跟着收缩,
避免固定下限把内容撑出容器产生横向溢出。 */
grid-template-columns: repeat(auto-fill, minmax(min(13rem, 100%), 1fr));
gap: 0.6rem;
}
.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 {
background: rgba(199, 101, 61, 0.16);
color: var(--platform-accent-strong);
}
.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;
}