fix(platform): 工作区体验 - 避免页面切换全屏加载并优化启动状态与积分摘要

This commit is contained in:
ddCat
2026-08-15 13:51:15 +08:00
parent b2a7eef35d
commit d3dda8998c
8 changed files with 397 additions and 133 deletions

View File

@@ -1559,6 +1559,168 @@
border-radius: 4px;
}
/* 全屏仅用于应用启动;骨架延续真实工作区结构,路由加载只占内容舞台。 */
.full-screen-loader {
position: fixed;
inset: 0;
z-index: var(--loader-z);
min-height: 100dvh;
overflow: hidden;
background: var(--workspace-page);
color: var(--foreground);
animation: loader-surface-enter var(--motion-panel) var(--motion-ease-out) both;
}
.full-screen-loader-shell {
display: flex;
width: 100%;
height: 100dvh;
flex-direction: column;
}
.full-screen-loader-topbar {
display: flex;
height: var(--page-topbar-h);
flex: 0 0 var(--page-topbar-h);
align-items: center;
justify-content: space-between;
padding-inline: var(--space-5);
background: var(--workspace-navigation);
}
.full-screen-loader-topbar-group {
display: flex;
align-items: center;
gap: var(--space-2);
}
.loader-placeholder {
display: block;
background: color-mix(in srgb, var(--foreground) 6%, transparent);
}
.loader-placeholder-control,
.loader-placeholder-mark,
.loader-placeholder-rail-item {
border-radius: var(--r-md);
}
.loader-placeholder-control { width: 36px; height: 36px; }
.loader-placeholder-mark { width: 28px; height: 28px; }
.loader-placeholder-wordmark { width: 40px; height: 10px; border-radius: var(--r-full); }
.loader-placeholder-action { width: 88px; height: 32px; border-radius: var(--r-md); }
.full-screen-loader-main {
display: flex;
min-height: 0;
flex: 1 1 auto;
}
.full-screen-loader-rail {
display: flex;
width: 64px;
flex: 0 0 64px;
flex-direction: column;
align-items: center;
gap: var(--space-2);
padding-top: calc(var(--space-12) + var(--space-3));
background: var(--workspace-navigation);
}
.loader-placeholder-rail-item { width: 40px; height: 40px; }
.full-screen-loader-stage {
min-width: 0;
flex: 1 1 auto;
overflow: hidden;
padding: var(--space-8);
background: var(--workspace-content);
}
.full-screen-loader-stage-header {
display: flex;
min-height: var(--space-10);
align-items: center;
justify-content: space-between;
gap: var(--space-4);
}
.full-screen-loader-status,
.workspace-route-loader-content {
display: flex;
align-items: center;
gap: var(--space-3);
color: color-mix(in srgb, var(--foreground) 54%, transparent);
font-size: var(--fs-caption);
}
.loading-signal {
width: 20px;
height: 20px;
flex: 0 0 20px;
border: 2px solid color-mix(in srgb, var(--foreground) 12%, transparent);
border-top-color: color-mix(in srgb, var(--foreground) 72%, transparent);
border-radius: var(--r-full);
animation: loading-signal-spin 900ms linear infinite;
}
.full-screen-loader-stage-grid {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: var(--space-4);
margin-top: var(--space-6);
}
.full-screen-loader-surface { min-width: 0; }
.loader-placeholder-media { aspect-ratio: 16 / 10; border-radius: var(--r-lg); }
.loader-placeholder-title { width: 58%; height: 10px; margin-top: var(--space-3); border-radius: var(--r-full); }
.loader-placeholder-meta { width: 34%; height: 8px; margin-top: var(--space-2); border-radius: var(--r-full); opacity: 0.72; }
.workspace-route-loader {
position: absolute;
inset: 0;
display: grid;
min-height: 100%;
place-items: center;
background: var(--workspace-page);
color: var(--foreground);
opacity: 0;
transition: opacity var(--motion-instant) ease-out;
}
.workspace-route-loader.is-visible { opacity: 1; }
.workspace-route-loader-content { justify-content: center; }
@keyframes loader-surface-enter {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes loading-signal-spin {
to { transform: rotate(360deg); }
}
@media (max-width: 1023px) {
.full-screen-loader-rail { display: none; }
.full-screen-loader-stage { padding: var(--space-6); }
.full-screen-loader-stage-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 639px) {
.full-screen-loader-topbar { padding-inline: var(--space-4); }
.full-screen-loader-topbar-group:last-child .loader-placeholder-control:not(:last-child) { display: none; }
.full-screen-loader-stage { padding: var(--space-5) var(--space-4); }
.full-screen-loader-stage-grid { grid-template-columns: 1fr; }
.full-screen-loader-stage-grid .full-screen-loader-surface:nth-child(n + 3) { display: none; }
.loader-placeholder-action { width: var(--space-10); }
}
@media (prefers-reduced-motion: reduce) {
.full-screen-loader { animation: none; }
.loading-signal { animation: none; }
.workspace-route-loader { transition: none; }
}
:where(.ant-btn) {
letter-spacing: 0;
transition:
@@ -3405,13 +3567,6 @@
box-shadow: 0 18px 54px color-mix(in srgb, var(--workspace-canvas) 62%, transparent), inset 0 1px 0 color-mix(in srgb, white 7%, transparent);
}
.credit-balance-card {
border: 0;
background: var(--btn-solid-bg);
color: var(--btn-solid-fg);
box-shadow: none;
}
.app-collection-card {
position: relative;
overflow: hidden;
@@ -4200,10 +4355,50 @@
.skill-card-added-count { flex: 0 0 auto; color: color-mix(in srgb, var(--foreground) 36%, transparent); font-size: var(--fs-label); font-variant-numeric: tabular-nums; }
.skill-card-owner-flag { flex: 1 1 auto; color: color-mix(in srgb, var(--foreground) 46%, transparent); font-size: var(--fs-caption); }
/* 积分页使用同一工作台表面,通过排版而非反色卡片表达资产层级。 */
.wallet-library-page .app-page-header { padding-bottom: 0; }
.wallet-library-page .app-workspace-surface { border: 0; background: color-mix(in srgb, var(--workspace-surface-strong) 76%, transparent); box-shadow: none; }
.wallet-library-page .wallet-credit-meta { gap: 6px; }
.wallet-library-page .wallet-credit-meta svg { color: currentColor; }
.credit-balance-card { overflow: hidden; border: 0; border-radius: var(--r-lg); background: var(--library-surface); color: var(--foreground); box-shadow: none; }
.wallet-balance-inner { display: grid; min-height: 210px; grid-template-columns: minmax(0, 1.15fr) minmax(280px, .85fr); gap: 32px; padding: 24px; }
.wallet-balance-primary { display: flex; min-width: 0; flex-direction: column; justify-content: space-between; }
.wallet-balance-heading { display: flex; min-width: 0; align-items: center; gap: 12px; }
.wallet-balance-heading > div { display: flex; min-width: 0; flex-direction: column; gap: 3px; }
.wallet-balance-heading strong { font-size: var(--fs-caption); font-weight: 600; }
.wallet-balance-heading div > span { overflow: hidden; color: color-mix(in srgb, var(--foreground) 44%, transparent); font-size: var(--fs-label); text-overflow: ellipsis; white-space: nowrap; }
.wallet-balance-icon { display: grid; width: 36px; height: 36px; flex: 0 0 auto; place-items: center; border-radius: var(--r-md); background: var(--library-icon-surface); color: color-mix(in srgb, var(--foreground) 68%, transparent); }
.wallet-balance-icon svg { width: 17px; height: 17px; }
.wallet-balance-number { display: flex; min-width: 0; align-items: baseline; gap: 8px; margin-top: 28px; }
.wallet-balance-number strong { min-width: 0; overflow-wrap: anywhere; font-size: var(--fs-display); font-variant-numeric: tabular-nums; font-weight: 620; line-height: 1; }
.wallet-balance-number > span { flex: 0 0 auto; color: color-mix(in srgb, var(--foreground) 48%, transparent); font-size: var(--fs-caption); }
.wallet-balance-details { display: grid; min-width: 0; grid-template-columns: repeat(2, minmax(0, 1fr)); align-content: end; gap: 20px; }
.wallet-account-status { display: inline-flex; grid-column: 1 / -1; align-items: center; justify-self: end; gap: 6px; color: color-mix(in srgb, var(--foreground) 58%, transparent); font-size: var(--fs-label); font-weight: 560; }
.wallet-account-status svg { width: 15px; height: 15px; }
.wallet-balance-metric { display: grid; min-width: 0; grid-template-columns: 28px minmax(0, 1fr); align-items: start; gap: 9px; }
.wallet-balance-metric-icon { display: grid; width: 28px; height: 28px; place-items: center; border-radius: var(--r-sm); background: color-mix(in srgb, var(--foreground) 5%, transparent); color: color-mix(in srgb, var(--foreground) 42%, transparent); }
.wallet-balance-metric-icon svg { width: 14px; height: 14px; }
.wallet-balance-metric > div { display: flex; min-width: 0; flex-direction: column; }
.wallet-balance-metric span { color: color-mix(in srgb, var(--foreground) 50%, transparent); font-size: var(--fs-tiny); }
.wallet-balance-metric strong { margin-top: 3px; overflow: hidden; font-size: var(--fs-heading); font-variant-numeric: tabular-nums; font-weight: 620; text-overflow: ellipsis; white-space: nowrap; }
.wallet-balance-metric small { margin-top: 2px; overflow: hidden; color: color-mix(in srgb, var(--foreground) 35%, transparent); font-size: var(--fs-tiny); text-overflow: ellipsis; white-space: nowrap; }
.wallet-library-page .wallet-redeem-icon { background: color-mix(in srgb, var(--foreground) 6%, transparent); color: color-mix(in srgb, var(--foreground) 72%, transparent); }
.wallet-library-page .wallet-ledger-panel { margin-top: 28px; }
.wallet-library-page .wallet-ledger-panel .app-table-surface { border: 0; box-shadow: none; }
.wallet-library-page .wallet-ledger-table .ant-table-thead > tr > th { height: 38px; padding: 8px 12px !important; background: color-mix(in srgb, var(--foreground) 4%, var(--background)) !important; color: color-mix(in srgb, var(--foreground) 52%, transparent) !important; font-size: var(--fs-label); font-weight: 500; }
.wallet-library-page .wallet-ledger-table .ant-table-tbody > tr > td { padding: 10px 12px !important; transition: background-color var(--motion-instant) ease-out; }
.wallet-library-page .wallet-ledger-table .ant-table-tbody > tr:hover > td { background: color-mix(in srgb, var(--foreground) 2.5%, var(--background)) !important; }
@media (max-width: 1120px) {
.wallet-balance-inner { grid-template-columns: minmax(0, 1fr); gap: 24px; }
.wallet-balance-details { align-content: start; }
.wallet-account-status { grid-row: 2; grid-column: 1 / -1; justify-self: start; }
}
@media (max-width: 520px) {
.wallet-balance-inner { min-height: 0; gap: 22px; padding: 20px; }
.wallet-balance-number { margin-top: 32px; }
.wallet-balance-details { grid-template-columns: minmax(0, 1fr); gap: 16px; }
.wallet-account-status { grid-row: auto; grid-column: auto; }
}
.library-loading-grid { display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); gap: 26px 18px; margin-top: 20px; }
/* 画布骨架屏 - 使用新token */
@@ -10068,39 +10263,6 @@ html:not(.dark) .creation-home .storyboard-workbench-bar-action:hover { backgrou
.assets-cover.is-light .assets-cover-more:hover { background: color-mix(in srgb, var(--foreground) 9%, transparent); color: var(--foreground); }
.assets-cover.is-light .assets-cover-play::before { border-color: color-mix(in srgb, var(--foreground) 30%, transparent); background: color-mix(in srgb, var(--surface-card) 78%, transparent); }
/* ===== 积分中心页重构 ===== */
/* 1. 页头 · 统一 studio band(全局 .studio-band 提供) */
.wallet-library-page .wallet-credit-meta { gap: 6px; }
.wallet-library-page .wallet-credit-meta svg { color: currentColor; }
/* 2. 余额卡与其他工作台卡片一样不使用装饰边线和侧条。 */
.wallet-library-page .wallet-balance-inner { padding-left: 0; }
.wallet-library-page .wallet-balance-number { letter-spacing: 0; }
/* 3. 兑换面板 · 去琥珀图标块 */
.wallet-library-page .wallet-redeem-icon {
background: color-mix(in srgb, var(--foreground) 6%, transparent);
color: color-mix(in srgb, var(--foreground) 72%, transparent);
}
/* 4. 流水表 · 表头收敛 + 行 hover 节奏 */
.wallet-library-page .wallet-ledger-table .ant-table-thead > tr > th {
height: 38px;
padding: 8px 12px !important;
background: color-mix(in srgb, var(--foreground) 4%, var(--background)) !important;
color: color-mix(in srgb, var(--foreground) 52%, transparent) !important;
font-size: 11px;
font-weight: 500;
}
.wallet-library-page .wallet-ledger-table .ant-table-tbody > tr > td {
padding: 10px 12px !important;
transition: background-color var(--motion-instant) ease-out;
}
.wallet-library-page .wallet-ledger-table .ant-table-tbody > tr:hover > td {
background: color-mix(in srgb, var(--foreground) 2.5%, var(--background)) !important;
}
/* ===== AI Markdown ===== */
.ai-message-markdown {