style: align UI palette with Taonier visuals

This commit is contained in:
kdletters
2026-05-21 13:54:35 +08:00
parent 0eed942ce5
commit da3badb802
24 changed files with 400 additions and 381 deletions

View File

@@ -678,3 +678,11 @@
- 影响范围:平台入口、推荐流、公开详情、试玩启动、跳一跳运行态、`api-server` / SpacetimeDB 公开投影和 shared contracts。 - 影响范围:平台入口、推荐流、公开详情、试玩启动、跳一跳运行态、`api-server` / SpacetimeDB 公开投影和 shared contracts。
- 验证方式:从平台推荐或公开详情进入跳一跳作品时,路由 source type 为 `jump-hop`、public code 为 `JH-*`,运行态启动消费后端返回的完整 profile / run 数据;后端 smoke 统一使用 `npm run dev:api-server` 启动并检查 `/healthz` - 验证方式:从平台推荐或公开详情进入跳一跳作品时,路由 source type 为 `jump-hop`、public code 为 `JH-*`,运行态启动消费后端返回的完整 profile / run 数据;后端 smoke 统一使用 `npm run dev:api-server` 启动并检查 `/healthz`
- 关联文档:`docs/prd/【玩法创作】跳一跳俯视角玩法模板PRD-2026-05-19.md``docs/【玩法创作】平台入口与玩法链路-2026-05-15.md``docs/【开发运维】本地开发验证与生产运维-2026-05-15.md` - 关联文档:`docs/prd/【玩法创作】跳一跳俯视角玩法模板PRD-2026-05-19.md``docs/【玩法创作】平台入口与玩法链路-2026-05-15.md``docs/【开发运维】本地开发验证与生产运维-2026-05-15.md`
# 2026-05-20 陶泥儿主视觉配色回收为暖白/陶土橙
- 背景:用户要求只替换产品各界面的 UI 颜色,不改布局,并以两张陶泥儿主视觉图作为配色依据。
- 决策:平台亮色主题的主色回收到暖白 / 米杏底、陶土橙主按钮、深棕正文与浅杏边框;后台管理也同步切换到同一暖橙体系。主题变量优先通过 `src/index.css``--platform-*` token 统一控制,零散组件只做必要的局部替换。
- 影响范围:主站平台壳层、常用表单 / 按钮 / 卡片 / 背景、后台管理 UI、业务进度条和小游戏结果条的通用强调色。
- 验证方式:优先检查 `src/index.css``apps/admin-web/src/styles/admin.css` 是否还存在旧粉色主色;再用编码检查和可执行的本地 typecheck / build 验证。
- 关联文档:`docs/【项目基线】当前产品与工程约束-2026-05-15.md`

View File

@@ -1,6 +1,6 @@
:root { :root {
color: #17212b; color: #3d1f10;
background: #eef3f6; background: #f8efe7;
font-family: font-family:
Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont,
"Segoe UI", sans-serif; "Segoe UI", sans-serif;
@@ -16,7 +16,7 @@ body {
min-width: 320px; min-width: 320px;
min-height: 100vh; min-height: 100vh;
margin: 0; margin: 0;
background: #eef3f6; background: #f8efe7;
} }
button, button,
@@ -49,31 +49,31 @@ button:disabled {
.admin-loading-screen { .admin-loading-screen {
gap: 12px; gap: 12px;
color: #5c6b77; color: #7b6150;
} }
.admin-loading-mark { .admin-loading-mark {
width: 24px; width: 24px;
height: 24px; height: 24px;
border: 3px solid #d1dde6; border: 3px solid #e1ccbb;
border-top-color: #126e82; border-top-color: #b6623f;
border-radius: 50%; border-radius: 50%;
animation: admin-spin 0.8s linear infinite; animation: admin-spin 0.8s linear infinite;
} }
.admin-login-screen { .admin-login-screen {
background: background:
linear-gradient(145deg, rgba(18, 110, 130, 0.12), transparent 36%), linear-gradient(145deg, rgba(204, 117, 76, 0.14), transparent 36%),
linear-gradient(315deg, rgba(165, 94, 54, 0.12), transparent 34%), linear-gradient(315deg, rgba(226, 171, 134, 0.16), transparent 34%),
#eef3f6; #f8efe7;
} }
.admin-login-panel, .admin-login-panel,
.admin-panel { .admin-panel {
border: 1px solid #d8e2e8; border: 1px solid #e1ccbb;
border-radius: 8px; border-radius: 8px;
background: #ffffff; background: #ffffff;
box-shadow: 0 12px 36px rgba(23, 33, 43, 0.08); box-shadow: 0 12px 36px rgba(112, 57, 30, 0.08);
} }
.admin-login-panel { .admin-login-panel {
@@ -92,14 +92,14 @@ button:disabled {
.admin-login-brand h1 { .admin-login-brand h1 {
margin: 0; margin: 0;
color: #17212b; color: #3d1f10;
font-size: 26px; font-size: 26px;
line-height: 1.16; line-height: 1.16;
} }
.admin-login-brand span, .admin-login-brand span,
.admin-brand span { .admin-brand span {
color: #667682; color: #8f7868;
font-size: 12px; font-size: 12px;
} }
@@ -108,10 +108,10 @@ button:disabled {
width: 38px; width: 38px;
height: 38px; height: 38px;
place-items: center; place-items: center;
border: 1px solid #bcd2db; border: 1px solid #dfc8b7;
border-radius: 8px; border-radius: 8px;
color: #126e82; color: #b6623f;
background: #e7f3f5; background: #f4e5d7;
} }
.admin-brand-icon-large { .admin-brand-icon-large {
@@ -129,7 +129,7 @@ button:disabled {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 24px; gap: 24px;
border-right: 1px solid #d8e2e8; border-right: 1px solid #e1ccbb;
background: #ffffff; background: #ffffff;
padding: 22px 18px; padding: 22px 18px;
} }
@@ -164,13 +164,13 @@ button:disabled {
gap: 10px; gap: 10px;
min-height: 42px; min-height: 42px;
padding: 0 12px; padding: 0 12px;
color: #52616d; color: #755a49;
background: transparent; background: transparent;
} }
.admin-nav-button[data-active="true"] { .admin-nav-button[data-active="true"] {
color: #0f5666; color: #8f3f27;
background: #e7f3f5; background: #f4e5d7;
} }
.admin-main { .admin-main {
@@ -184,7 +184,7 @@ button:disabled {
align-items: center; align-items: center;
justify-content: flex-end; justify-content: flex-end;
gap: 12px; gap: 12px;
border-bottom: 1px solid #d8e2e8; border-bottom: 1px solid #e1ccbb;
background: rgba(255, 255, 255, 0.86); background: rgba(255, 255, 255, 0.86);
padding: 0 24px; padding: 0 24px;
} }
@@ -200,7 +200,7 @@ button:disabled {
} }
.admin-user small { .admin-user small {
color: #667682; color: #8f7868;
} }
.admin-content { .admin-content {
@@ -232,7 +232,7 @@ button:disabled {
.admin-page-heading h2, .admin-page-heading h2,
.admin-panel-heading h3 { .admin-panel-heading h3 {
margin: 0; margin: 0;
color: #17212b; color: #3d1f10;
} }
.admin-page-heading h2 { .admin-page-heading h2 {
@@ -241,7 +241,7 @@ button:disabled {
.admin-page-heading p { .admin-page-heading p {
margin: 3px 0 0; margin: 3px 0 0;
color: #667682; color: #8f7868;
} }
.admin-panel { .admin-panel {
@@ -256,7 +256,7 @@ button:disabled {
} }
.admin-panel-heading span { .admin-panel-heading span {
color: #667682; color: #8f7868;
font-size: 13px; font-size: 13px;
} }
@@ -314,12 +314,12 @@ button:disabled {
} }
.admin-table tbody tr[data-clickable="true"]:hover { .admin-table tbody tr[data-clickable="true"]:hover {
background: #f5fafb; background: #fff7f0;
} }
.admin-text-button:hover, .admin-text-button:hover,
.admin-text-button:focus-visible { .admin-text-button:focus-visible {
color: #126e82; color: #b6623f;
text-decoration: underline; text-decoration: underline;
outline: none; outline: none;
} }
@@ -345,7 +345,7 @@ button:disabled {
} }
.admin-query-summary { .admin-query-summary {
color: #667682; color: #8f7868;
font-size: 12px; font-size: 12px;
font-weight: 650; font-weight: 650;
} }
@@ -354,7 +354,7 @@ button:disabled {
display: grid; display: grid;
min-width: 0; min-width: 0;
gap: 7px; gap: 7px;
color: #4c5c68; color: #6f5848;
font-size: 13px; font-size: 13px;
font-weight: 650; font-weight: 650;
} }
@@ -372,16 +372,16 @@ button:disabled {
.admin-field textarea { .admin-field textarea {
width: 100%; width: 100%;
min-height: 42px; min-height: 42px;
border: 1px solid #cbd8e0; border: 1px solid #dfc8b7;
border-radius: 8px; border-radius: 8px;
color: #17212b; color: #3d1f10;
background: #fbfdfe; background: #fffdf9;
padding: 9px 11px; padding: 9px 11px;
outline: none; outline: none;
} }
.admin-field-note { .admin-field-note {
color: #667682; color: #8f7868;
font-size: 12px; font-size: 12px;
font-weight: 500; font-weight: 500;
line-height: 1.45; line-height: 1.45;
@@ -395,8 +395,8 @@ button:disabled {
.admin-field input:focus, .admin-field input:focus,
.admin-field select:focus, .admin-field select:focus,
.admin-field textarea:focus { .admin-field textarea:focus {
border-color: #126e82; border-color: #b6623f;
box-shadow: 0 0 0 3px rgba(18, 110, 130, 0.16); box-shadow: 0 0 0 3px rgba(204, 117, 76, 0.16);
} }
.admin-combobox { .admin-combobox {
@@ -419,16 +419,16 @@ button:disabled {
align-items: center; align-items: center;
justify-content: center; justify-content: center;
min-height: 42px; min-height: 42px;
border: 1px solid #cbd8e0; border: 1px solid #dfc8b7;
border-left: 0; border-left: 0;
border-radius: 0 8px 8px 0; border-radius: 0 8px 8px 0;
color: #52616d; color: #755a49;
background: #fbfdfe; background: #fffdf9;
} }
.admin-combobox:focus-within .admin-combobox-toggle { .admin-combobox:focus-within .admin-combobox-toggle {
border-color: #126e82; border-color: #b6623f;
box-shadow: 0 0 0 3px rgba(18, 110, 130, 0.16); box-shadow: 0 0 0 3px rgba(204, 117, 76, 0.16);
} }
.admin-combobox-menu { .admin-combobox-menu {
@@ -440,10 +440,10 @@ button:disabled {
display: grid; display: grid;
max-height: 260px; max-height: 260px;
overflow: auto; overflow: auto;
border: 1px solid #cbd8e0; border: 1px solid #dfc8b7;
border-radius: 8px; border-radius: 8px;
background: #ffffff; background: #ffffff;
box-shadow: 0 16px 40px rgba(23, 33, 43, 0.14); box-shadow: 0 16px 40px rgba(112, 57, 30, 0.14);
padding: 6px; padding: 6px;
} }
@@ -453,7 +453,7 @@ button:disabled {
width: 100%; width: 100%;
border: 0; border: 0;
border-radius: 7px; border-radius: 7px;
color: #17212b; color: #3d1f10;
background: transparent; background: transparent;
padding: 9px 10px; padding: 9px 10px;
text-align: left; text-align: left;
@@ -461,12 +461,12 @@ button:disabled {
.admin-combobox-option:hover, .admin-combobox-option:hover,
.admin-combobox-option:focus-visible { .admin-combobox-option:focus-visible {
background: #e7f3f5; background: #f4e5d7;
outline: none; outline: none;
} }
.admin-combobox-option span { .admin-combobox-option span {
color: #0f5666; color: #8f3f27;
font-family: font-family:
"SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace; "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
font-size: 12px; font-size: 12px;
@@ -475,7 +475,7 @@ button:disabled {
.admin-combobox-option small, .admin-combobox-option small,
.admin-combobox-empty { .admin-combobox-empty {
color: #667682; color: #8f7868;
font-size: 12px; font-size: 12px;
font-weight: 500; font-weight: 500;
line-height: 1.45; line-height: 1.45;
@@ -495,7 +495,7 @@ button:disabled {
justify-content: flex-end; justify-content: flex-end;
gap: 8px; gap: 8px;
min-height: 42px; min-height: 42px;
color: #4c5c68; color: #6f5848;
font-size: 13px; font-size: 13px;
font-weight: 650; font-weight: 650;
} }
@@ -503,7 +503,7 @@ button:disabled {
.admin-switch-field input { .admin-switch-field input {
width: 18px; width: 18px;
height: 18px; height: 18px;
accent-color: #126e82; accent-color: #b6623f;
} }
.admin-primary-button, .admin-primary-button,
@@ -522,7 +522,7 @@ button:disabled {
z-index: 80; z-index: 80;
display: grid; display: grid;
place-items: center; place-items: center;
background: rgba(23, 33, 43, 0.42); background: rgba(61, 31, 16, 0.34);
padding: 16px; padding: 16px;
} }
@@ -530,10 +530,10 @@ button:disabled {
display: grid; display: grid;
width: min(100%, 420px); width: min(100%, 420px);
gap: 16px; gap: 16px;
border: 1px solid #d8e2e8; border: 1px solid #e1ccbb;
border-radius: 10px; border-radius: 10px;
background: #ffffff; background: #ffffff;
box-shadow: 0 22px 60px rgba(23, 33, 43, 0.24); box-shadow: 0 22px 60px rgba(112, 57, 30, 0.24);
padding: 18px; padding: 18px;
} }
@@ -543,10 +543,10 @@ button:disabled {
max-height: min(90dvh, 760px); max-height: min(90dvh, 760px);
gap: 16px; gap: 16px;
overflow: auto; overflow: auto;
border: 1px solid #d8e2e8; border: 1px solid #e1ccbb;
border-radius: 10px; border-radius: 10px;
background: #ffffff; background: #ffffff;
box-shadow: 0 22px 60px rgba(23, 33, 43, 0.24); box-shadow: 0 22px 60px rgba(112, 57, 30, 0.24);
padding: 18px; padding: 18px;
} }
@@ -557,7 +557,7 @@ button:disabled {
.admin-confirm-warning { .admin-confirm-warning {
border: 1px solid #efc894; border: 1px solid #efc894;
border-radius: 8px; border-radius: 8px;
color: #8a5a1b; color: #8f4b26;
background: #fffaf3; background: #fffaf3;
padding: 10px 12px; padding: 10px 12px;
font-size: 13px; font-size: 13px;
@@ -576,26 +576,26 @@ button:disabled {
.admin-primary-button { .admin-primary-button {
color: #ffffff; color: #ffffff;
background: #126e82; background: #b6623f;
} }
.admin-secondary-button, .admin-secondary-button,
.admin-icon-button { .admin-icon-button {
border: 1px solid #cbd8e0; border: 1px solid #dfc8b7;
color: #2f4550; color: #4b2412;
background: #ffffff; background: #ffffff;
} }
.admin-danger-button { .admin-danger-button {
color: #ffffff; color: #ffffff;
background: #a44242; background: #a6402f;
} }
.admin-ghost-button { .admin-ghost-button {
width: 34px; width: 34px;
height: 34px; height: 34px;
color: #52616d; color: #755a49;
background: #eef3f6; background: #f8efe7;
} }
.admin-ghost-button.admin-query-reset-button { .admin-ghost-button.admin-query-reset-button {
@@ -608,7 +608,7 @@ button:disabled {
.admin-text-button { .admin-text-button {
display: inline; display: inline;
border: 0; border: 0;
color: #0f5666; color: #8f3f27;
background: transparent; background: transparent;
padding: 0; padding: 0;
text-align: left; text-align: left;
@@ -616,9 +616,9 @@ button:disabled {
} }
.admin-alert { .admin-alert {
border: 1px solid #efc0bd; border: 1px solid #e2b9a4;
border-radius: 8px; border-radius: 8px;
color: #8a2f2f; color: #8f3f27;
background: #fff4f3; background: #fff4f3;
padding: 10px 12px; padding: 10px 12px;
font-size: 13px; font-size: 13px;
@@ -638,7 +638,7 @@ button:disabled {
} }
.admin-info-list dt { .admin-info-list dt {
color: #667682; color: #8f7868;
font-size: 12px; font-size: 12px;
} }
@@ -646,7 +646,7 @@ button:disabled {
min-width: 0; min-width: 0;
margin: 0; margin: 0;
overflow-wrap: anywhere; overflow-wrap: anywhere;
color: #17212b; color: #3d1f10;
font-size: 13px; font-size: 13px;
font-weight: 650; font-weight: 650;
} }
@@ -666,26 +666,26 @@ button:disabled {
.admin-table th, .admin-table th,
.admin-table td { .admin-table td {
border-bottom: 1px solid #e4edf2; border-bottom: 1px solid #eaded2;
padding: 10px; padding: 10px;
text-align: left; text-align: left;
vertical-align: top; vertical-align: top;
} }
.admin-table th { .admin-table th {
color: #667682; color: #8f7868;
font-size: 12px; font-size: 12px;
} }
.admin-table td small { .admin-table td small {
display: block; display: block;
margin-top: 3px; margin-top: 3px;
color: #667682; color: #8f7868;
font-size: 12px; font-size: 12px;
} }
.admin-muted-text { .admin-muted-text {
color: #86939c; color: #a38f80;
} }
.admin-tag-list { .admin-tag-list {
@@ -699,10 +699,10 @@ button:disabled {
display: inline-flex; display: inline-flex;
max-width: 100%; max-width: 100%;
align-items: center; align-items: center;
border: 1px solid #cbdfe6; border: 1px solid #dfc8b7;
border-radius: 999px; border-radius: 999px;
background: #eef7f8; background: #f7eadf;
color: #0f5666; color: #8f3f27;
padding: 3px 8px; padding: 3px 8px;
font-size: 12px; font-size: 12px;
font-weight: 750; font-weight: 750;
@@ -744,7 +744,7 @@ button:disabled {
gap: 6px; gap: 6px;
max-width: 100%; max-width: 100%;
border: 0; border: 0;
color: #667682; color: #8f7868;
background: transparent; background: transparent;
padding: 0; padding: 0;
text-align: left; text-align: left;
@@ -773,7 +773,7 @@ button:disabled {
.admin-table-sort-button:hover, .admin-table-sort-button:hover,
.admin-table-sort-button:focus-visible, .admin-table-sort-button:focus-visible,
.admin-table-sort-button[data-active="true"] { .admin-table-sort-button[data-active="true"] {
color: #0f5666; color: #8f3f27;
outline: none; outline: none;
} }
@@ -782,7 +782,7 @@ button:disabled {
max-height: 160px; max-height: 160px;
margin: 0; margin: 0;
overflow: auto; overflow: auto;
color: #2f4550; color: #4b2412;
font-family: font-family:
"SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace; "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
font-size: 12px; font-size: 12px;
@@ -801,18 +801,18 @@ button:disabled {
} }
.admin-status-ok { .admin-status-ok {
color: #17623c; color: #2f7b46;
background: #e6f5ed; background: #edf8ef;
} }
.admin-status-pending { .admin-status-pending {
color: #8a5a1b; color: #8f4b26;
background: #fff4df; background: #fdf1e5;
} }
.admin-status-error { .admin-status-error {
color: #8a2f2f; color: #8f3f27;
background: #fff1ef; background: #fff0e9;
} }
.admin-error-list { .admin-error-list {
@@ -820,7 +820,7 @@ button:disabled {
gap: 8px; gap: 8px;
margin: 0; margin: 0;
padding-left: 18px; padding-left: 18px;
color: #8a5a1b; color: #8f4b26;
overflow-wrap: anywhere; overflow-wrap: anywhere;
} }
@@ -830,7 +830,7 @@ button:disabled {
} }
.admin-subsection-heading { .admin-subsection-heading {
color: #4c5c68; color: #6f5848;
font-size: 13px; font-size: 13px;
font-weight: 650; font-weight: 650;
} }
@@ -850,7 +850,7 @@ button:disabled {
.admin-header-row input { .admin-header-row input {
min-width: 0; min-width: 0;
min-height: 38px; min-height: 38px;
border: 1px solid #cbd8e0; border: 1px solid #dfc8b7;
border-radius: 8px; border-radius: 8px;
padding: 8px 10px; padding: 8px 10px;
} }
@@ -863,10 +863,10 @@ button:disabled {
max-height: 520px; max-height: 520px;
margin: 0; margin: 0;
overflow: auto; overflow: auto;
border: 1px solid #dce6ec; border: 1px solid #eaded2;
border-radius: 8px; border-radius: 8px;
background: #17212b; background: #3d1f10;
color: #e9f2f4; color: #fdf9f5;
padding: 14px; padding: 14px;
font-family: font-family:
"SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace; "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
@@ -880,19 +880,19 @@ button:disabled {
display: grid; display: grid;
min-height: 140px; min-height: 140px;
place-items: center; place-items: center;
border: 1px dashed #cbd8e0; border: 1px dashed #dfc8b7;
border-radius: 8px; border-radius: 8px;
color: #667682; color: #8f7868;
background: #fbfdfe; background: #fffdf9;
} }
.admin-segmented-control { .admin-segmented-control {
display: grid; display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr)); grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 6px; gap: 6px;
border: 1px solid #d8e2e8; border: 1px solid #e1ccbb;
border-radius: 8px; border-radius: 8px;
background: #eef3f6; background: #f8efe7;
padding: 4px; padding: 4px;
} }
@@ -900,15 +900,15 @@ button:disabled {
min-height: 36px; min-height: 36px;
border: 0; border: 0;
border-radius: 6px; border-radius: 6px;
color: #52616d; color: #755a49;
background: transparent; background: transparent;
font-weight: 700; font-weight: 700;
} }
.admin-segmented-control button[data-active="true"] { .admin-segmented-control button[data-active="true"] {
color: #0f5666; color: #8f3f27;
background: #ffffff; background: #ffffff;
box-shadow: 0 2px 8px rgba(23, 33, 43, 0.08); box-shadow: 0 2px 8px rgba(112, 57, 30, 0.08);
} }
.admin-bottom-nav { .admin-bottom-nav {
@@ -964,7 +964,7 @@ button:disabled {
z-index: 20; z-index: 20;
display: grid; display: grid;
grid-template-columns: repeat(auto-fit, minmax(64px, 1fr)); grid-template-columns: repeat(auto-fit, minmax(64px, 1fr));
border-top: 1px solid #d8e2e8; border-top: 1px solid #e1ccbb;
background: rgba(255, 255, 255, 0.94); background: rgba(255, 255, 255, 0.94);
padding: 8px 10px calc(8px + env(safe-area-inset-bottom)); padding: 8px 10px calc(8px + env(safe-area-inset-bottom));
backdrop-filter: blur(10px); backdrop-filter: blur(10px);
@@ -974,15 +974,15 @@ button:disabled {
display: grid; display: grid;
gap: 4px; gap: 4px;
min-height: 48px; min-height: 48px;
color: #667682; color: #8f7868;
background: transparent; background: transparent;
font-size: 11px; font-size: 11px;
font-weight: 700; font-weight: 700;
} }
.admin-bottom-nav-button[data-active="true"] { .admin-bottom-nav-button[data-active="true"] {
color: #0f5666; color: #8f3f27;
background: #e7f3f5; background: #f4e5d7;
} }
} }

View File

@@ -94,6 +94,7 @@ server-rs + Axum + SpacetimeDB
8. 图像输入通用 UI 统一走 `src/components/common/CreativeImageInputPanel.tsx`。外层页面持有业务状态组件只承担上传卡、预览、参考图缩略图、AI 重绘开关、错误展示和提交按钮。 8. 图像输入通用 UI 统一走 `src/components/common/CreativeImageInputPanel.tsx`。外层页面持有业务状态组件只承担上传卡、预览、参考图缩略图、AI 重绘开关、错误展示和提交按钮。
9. 发现页 `分类` 子频道的筛选必须打开独立 dialog / drawer / modal至少支持玩法类型过滤与排序切换筛选结果为空时显示空状态不把筛选内容展开在当前列表下方。 9. 发现页 `分类` 子频道的筛选必须打开独立 dialog / drawer / modal至少支持玩法类型过滤与排序切换筛选结果为空时显示空状态不把筛选内容展开在当前列表下方。
10. “我的”页泥点、游戏时长、玩过三张统计卡只展示各自标签和值,内容居中且不换行,不在统计区底部展示“更新于”时间。 10. “我的”页泥点、游戏时长、玩过三张统计卡只展示各自标签和值,内容居中且不换行,不在统计区底部展示“更新于”时间。
11. 平台亮色 UI 配色以陶泥儿主视觉为准:暖白 / 米杏底、陶土橙主按钮、深棕正文与浅杏边框;新增界面优先复用 `src/index.css``--platform-*` 主题变量和 `apps/admin-web/src/styles/admin.css` 的同系色值,不再引入粉红、蓝绿等独立主色方案。
## 文案与编码 ## 文案与编码

View File

@@ -22,7 +22,7 @@ const PLACEHOLDER_PUZZLE_IMAGE =
<defs> <defs>
<linearGradient id="sky" x1="0" y1="0" x2="1" y2="1"> <linearGradient id="sky" x1="0" y1="0" x2="1" y2="1">
<stop offset="0" stop-color="#fef3c7" /> <stop offset="0" stop-color="#fef3c7" />
<stop offset="0.45" stop-color="#fb7185" /> <stop offset="0.45" stop-color="#c7653d" />
<stop offset="1" stop-color="#312e81" /> <stop offset="1" stop-color="#312e81" />
</linearGradient> </linearGradient>
<radialGradient id="glow" cx="42%" cy="34%" r="46%"> <radialGradient id="glow" cx="42%" cy="34%" r="46%">

View File

@@ -173,7 +173,7 @@ function ImageFrame({
}) { }) {
return ( return (
<div <div
className={`overflow-hidden rounded-2xl border border-[var(--platform-subpanel-border)] bg-[radial-gradient(circle_at_top,rgba(255,255,255,0.22),transparent_42%),linear-gradient(180deg,rgba(255,96,147,0.92),rgba(255,146,109,0.84))] ${tone === 'landscape' ? 'aspect-[16/9]' : 'aspect-square'}`} className={`overflow-hidden rounded-2xl border border-[var(--platform-subpanel-border)] bg-[radial-gradient(circle_at_top,rgba(255,255,255,0.22),transparent_42%),linear-gradient(180deg,rgba(204,117,76,0.9),rgba(223,127,64,0.82))] ${tone === 'landscape' ? 'aspect-[16/9]' : 'aspect-square'}`}
> >
{src ? ( {src ? (
<ResolvedAssetImage <ResolvedAssetImage
@@ -238,7 +238,7 @@ function PendingEntityCard({
</div> </div>
<div className="platform-progress-track mt-3 h-2.5 overflow-hidden rounded-full"> <div className="platform-progress-track mt-3 h-2.5 overflow-hidden rounded-full">
<div <div
className="h-full bg-[linear-gradient(90deg,#ff4f8b_0%,#ff8a73_100%)] transition-[width] duration-300" className="h-full bg-[var(--platform-button-primary-solid)] transition-[width] duration-300"
style={{ width: `${Math.max(6, Math.min(100, progress))}%` }} style={{ width: `${Math.max(6, Math.min(100, progress))}%` }}
/> />
</div> </div>
@@ -313,7 +313,7 @@ function OpeningCgPreview({
</div> </div>
{isGenerating ? ( {isGenerating ? (
<div className="platform-progress-track h-2 overflow-hidden rounded-full"> <div className="platform-progress-track h-2 overflow-hidden rounded-full">
<div className="h-full w-2/3 animate-pulse bg-[linear-gradient(90deg,#ff4f8b_0%,#ff8a73_52%,#ffd2a6_100%)]" /> <div className="h-full w-2/3 animate-pulse bg-[linear-gradient(90deg,#df7f40_0%,#cc754c_52%,#eaccb3_100%)]" />
</div> </div>
) : null} ) : null}
{openingCg?.status === 'failed' && openingCg.errorMessage ? ( {openingCg?.status === 'failed' && openingCg.errorMessage ? (
@@ -437,7 +437,7 @@ function CatalogCard({
<div <div
className={`shrink-0 rounded-full border px-2.5 py-1 text-[10px] ${ className={`shrink-0 rounded-full border px-2.5 py-1 text-[10px] ${
isSelected isSelected
? 'border-rose-300/25 bg-rose-500/14 text-rose-50' ? 'border-[var(--platform-button-danger-border)] bg-[var(--platform-button-danger-fill)] text-[var(--platform-button-danger-text)]'
: 'platform-subpanel text-[var(--platform-text-soft)]' : 'platform-subpanel text-[var(--platform-text-soft)]'
}`} }`}
> >
@@ -453,7 +453,7 @@ function CatalogCard({
onClick={disabled ? undefined : onClick} onClick={disabled ? undefined : onClick}
aria-disabled={disabled} aria-disabled={disabled}
className={`w-full rounded-[1.3rem] border p-2.5 text-left transition-colors xl:p-3 ${ className={`w-full rounded-[1.3rem] border p-2.5 text-left transition-colors xl:p-3 ${
isSelected ? 'border-rose-300/35 bg-rose-500/10' : 'platform-subpanel' isSelected ? 'border-[var(--platform-button-danger-border)] bg-[var(--platform-button-danger-fill)]' : 'platform-subpanel'
}`} }`}
> >
<div className="flex items-start gap-3 xl:gap-3.5"> <div className="flex items-start gap-3 xl:gap-3.5">
@@ -491,7 +491,7 @@ function CatalogCard({
onClick={disabled ? undefined : onClick} onClick={disabled ? undefined : onClick}
aria-disabled={disabled} aria-disabled={disabled}
className={`w-full rounded-[1.4rem] border p-3 text-left transition-colors ${ className={`w-full rounded-[1.4rem] border p-3 text-left transition-colors ${
isSelected ? 'border-rose-300/35 bg-rose-500/10' : 'platform-subpanel' isSelected ? 'border-[var(--platform-button-danger-border)] bg-[var(--platform-button-danger-fill)]' : 'platform-subpanel'
}`} }`}
> >
<div className="space-y-3"> <div className="space-y-3">
@@ -899,7 +899,7 @@ export function CustomWorldEntityCatalog({
ref={scrollContainerRef} ref={scrollContainerRef}
className="h-full min-h-0 space-y-3 overflow-y-auto overscroll-contain pr-1 scrollbar-hide xl:space-y-4 xl:pr-2 2xl:space-y-5 2xl:pr-3" className="h-full min-h-0 space-y-3 overflow-y-auto overscroll-contain pr-1 scrollbar-hide xl:space-y-4 xl:pr-2 2xl:space-y-5 2xl:pr-3"
> >
<div className="px-1 pb-1 text-center xl:flex xl:items-end xl:justify-between xl:gap-6 xl:rounded-[2rem] xl:border xl:border-[var(--platform-subpanel-border)] xl:bg-white/55 xl:px-6 xl:py-3 xl:text-left xl:shadow-[0_18px_70px_rgba(255,79,139,0.08)] xl:backdrop-blur-sm 2xl:px-7"> <div className="px-1 pb-1 text-center xl:flex xl:items-end xl:justify-between xl:gap-6 xl:rounded-[2rem] xl:border xl:border-[var(--platform-subpanel-border)] xl:bg-white/55 xl:px-6 xl:py-3 xl:text-left xl:shadow-[0_18px_70px_rgba(112,57,30,0.08)] xl:backdrop-blur-sm 2xl:px-7">
<div className="text-[11px] font-bold tracking-[0.28em] text-zinc-500"> <div className="text-[11px] font-bold tracking-[0.28em] text-zinc-500">
</div> </div>
@@ -913,7 +913,7 @@ export function CustomWorldEntityCatalog({
</div> </div>
</div> </div>
<div className="platform-sticky-fade sticky top-0 z-10 -mx-1 space-y-3 px-1 pb-3 pt-1 backdrop-blur-sm xl:rounded-[1.75rem] xl:border xl:border-[var(--platform-subpanel-border)] xl:bg-white/70 xl:px-4 xl:py-3 xl:shadow-[0_16px_48px_rgba(255,79,139,0.08)]"> <div className="platform-sticky-fade sticky top-0 z-10 -mx-1 space-y-3 px-1 pb-3 pt-1 backdrop-blur-sm xl:rounded-[1.75rem] xl:border xl:border-[var(--platform-subpanel-border)] xl:bg-white/70 xl:px-4 xl:py-3 xl:shadow-[0_16px_48px_rgba(112,57,30,0.08)]">
<div className="flex gap-2 overflow-x-auto pb-1 scrollbar-hide xl:pb-0"> <div className="flex gap-2 overflow-x-auto pb-1 scrollbar-hide xl:pb-0">
{RESULT_TABS.map((tab) => ( {RESULT_TABS.map((tab) => (
<div key={tab.id}> <div key={tab.id}>

View File

@@ -225,7 +225,7 @@ export function CustomWorldGenerationView({
<div className="platform-progress-track mt-4 h-4 overflow-hidden rounded-full xl:mt-5 xl:h-5"> <div className="platform-progress-track mt-4 h-4 overflow-hidden rounded-full xl:mt-5 xl:h-5">
<motion.div <motion.div
className="h-full bg-[linear-gradient(90deg,#ff4f8b_0%,#ff8a73_52%,#ffd2a6_100%)]" className="h-full bg-[linear-gradient(90deg,#df7f40_0%,#cc754c_52%,#eaccb3_100%)]"
animate={{ width: `${progressValue}%` }} animate={{ width: `${progressValue}%` }}
transition={{ duration: 0.35, ease: 'easeOut' }} transition={{ duration: 0.35, ease: 'easeOut' }}
/> />
@@ -283,9 +283,9 @@ export function CustomWorldGenerationView({
)} )}
className={`rounded-2xl border px-4 py-3 transition-colors ${ className={`rounded-2xl border px-4 py-3 transition-colors ${
step.status === 'completed' step.status === 'completed'
? 'border-emerald-400/16 bg-emerald-500/8' ? 'border-[var(--platform-success-border)] bg-[var(--platform-success-bg)]'
: step.status === 'active' : step.status === 'active'
? 'border-sky-300/22 bg-sky-500/10' ? 'border-[var(--platform-cool-border)] bg-[var(--platform-cool-bg)]'
: 'platform-subpanel' : 'platform-subpanel'
} custom-world-generation-step`} } custom-world-generation-step`}
initial={ initial={
@@ -317,9 +317,9 @@ export function CustomWorldGenerationView({
<motion.div <motion.div
className={`h-full rounded-full ${ className={`h-full rounded-full ${
step.status === 'completed' step.status === 'completed'
? 'bg-emerald-300' ? 'bg-[var(--platform-success-text)]'
: step.status === 'active' : step.status === 'active'
? 'bg-[linear-gradient(90deg,#7dd3fc_0%,#fcd34d_100%)]' ? 'bg-[linear-gradient(90deg,#df7f40_0%,#cc754c_56%,#eaccb3_100%)]'
: 'bg-white/18' : 'bg-white/18'
}`} }`}
animate={{ width: `${stepProgress}%` }} animate={{ width: `${stepProgress}%` }}
@@ -335,7 +335,7 @@ export function CustomWorldGenerationView({
</div> </div>
{error ? ( {error ? (
<div className="mt-4 rounded-2xl border border-rose-400/18 bg-rose-500/10 px-4 py-3 text-sm leading-6 text-rose-100"> <div className="mt-4 rounded-2xl border border-[var(--platform-button-danger-border)] bg-[var(--platform-button-danger-fill)] px-4 py-3 text-sm leading-6 text-[var(--platform-button-danger-text)]">
{error} {error}
</div> </div>
) : null} ) : null}
@@ -364,7 +364,7 @@ export function CustomWorldGenerationView({
<button <button
type="button" type="button"
onClick={onInterrupt} onClick={onInterrupt}
className="rounded-full border border-rose-300/18 bg-rose-500/10 px-4 py-2 text-sm text-rose-100 transition-colors hover:text-white" className="rounded-full border border-[var(--platform-button-danger-border)] bg-[var(--platform-button-danger-fill)] px-4 py-2 text-sm text-[var(--platform-button-danger-text)] transition-colors hover:text-[var(--platform-text-strong)]"
> >
{interruptLabel} {interruptLabel}
</button> </button>

View File

@@ -260,7 +260,7 @@ function ThemeOptionCard({
onClick={onClick} onClick={onClick}
className={`platform-subpanel w-full rounded-[1.5rem] p-4 text-left transition ${ className={`platform-subpanel w-full rounded-[1.5rem] p-4 text-left transition ${
active active
? 'border-[var(--platform-surface-hover-border)] shadow-[0_18px_44px_rgba(255,91,132,0.14)]' ? 'border-[var(--platform-surface-hover-border)] shadow-[0_18px_44px_rgba(112,57,30,0.14)]'
: 'hover:border-[var(--platform-surface-hover-border)]' : 'hover:border-[var(--platform-surface-hover-border)]'
}`} }`}
> >
@@ -534,8 +534,8 @@ export function AccountModal({
<ThemeOptionCard <ThemeOptionCard
active={platformTheme === 'light'} active={platformTheme === 'light'}
title="亮色主题" title="亮色主题"
detail="暖白底面板,粉橘强调。" detail="暖白底面板,陶土橙强调。"
previewClassName="bg-[radial-gradient(circle_at_top,rgba(255,255,255,0.28),transparent_30%),linear-gradient(135deg,#fff8fb_0%,#ffe9ee_52%,#ffd8cb_100%)] border border-white/70" previewClassName="bg-[radial-gradient(circle_at_top,rgba(255,255,255,0.32),transparent_30%),linear-gradient(135deg,#fffdf9_0%,#f4e5d7_52%,#eaccb3_100%)] border border-white/70"
onClick={() => onPlatformThemeChange('light')} onClick={() => onPlatformThemeChange('light')}
/> />
<ThemeOptionCard <ThemeOptionCard

View File

@@ -60,7 +60,7 @@ export function BindPhoneScreen({
<div className={`platform-theme platform-theme--${platformTheme} min-h-screen bg-[var(--platform-body-fill)] px-4 py-6 text-[var(--platform-text-strong)] sm:py-8`}> <div className={`platform-theme platform-theme--${platformTheme} min-h-screen bg-[var(--platform-body-fill)] px-4 py-6 text-[var(--platform-text-strong)] sm:py-8`}>
<div className="mx-auto flex min-h-[calc(100vh-3rem)] w-full max-w-5xl items-center justify-center sm:min-h-[calc(100vh-4rem)]"> <div className="mx-auto flex min-h-[calc(100vh-3rem)] w-full max-w-5xl items-center justify-center sm:min-h-[calc(100vh-4rem)]">
<div className="platform-auth-card grid w-full max-w-4xl overflow-hidden rounded-[28px] md:grid-cols-[1.05fr_0.95fr]"> <div className="platform-auth-card grid w-full max-w-4xl overflow-hidden rounded-[28px] md:grid-cols-[1.05fr_0.95fr]">
<div className="border-b border-[var(--platform-subpanel-border)] bg-[linear-gradient(135deg,rgba(255,79,139,0.18),rgba(255,155,120,0.14))] px-6 py-8 md:border-b-0 md:border-r md:px-10 md:py-12"> <div className="border-b border-[var(--platform-subpanel-border)] bg-[linear-gradient(135deg,rgba(204,117,76,0.18),rgba(240,203,169,0.16))] px-6 py-8 md:border-b-0 md:border-r md:px-10 md:py-12">
<div className="selection-hero-brand selection-hero-brand--left"> <div className="selection-hero-brand selection-hero-brand--left">
<div className="selection-hero-brand__title"></div> <div className="selection-hero-brand__title"></div>
<div className="selection-hero-brand__subtitle"> RPG</div> <div className="selection-hero-brand__subtitle"> RPG</div>

View File

@@ -127,7 +127,7 @@ export function BarkBattleConfigEditor({
value={title} value={title}
disabled={isBusy} disabled={isBusy}
onChange={(event) => setTitle(event.target.value)} onChange={(event) => setTitle(event.target.value)}
className="h-11 w-full rounded-[1.05rem] border border-[var(--platform-subpanel-border)] bg-white/90 px-4 text-base font-semibold text-[var(--platform-text-strong)] outline-none transition focus:border-rose-200 focus:bg-white focus:ring-2 focus:ring-rose-100" className="h-11 w-full rounded-[1.05rem] border border-[var(--platform-subpanel-border)] bg-white/90 px-4 text-base font-semibold text-[var(--platform-text-strong)] outline-none transition focus:border-[var(--platform-surface-hover-border)] focus:bg-white focus:ring-2 focus:ring-[var(--platform-warm-border)]"
maxLength={40} maxLength={40}
aria-label="作品标题" aria-label="作品标题"
/> />
@@ -141,7 +141,7 @@ export function BarkBattleConfigEditor({
value={description} value={description}
disabled={isBusy} disabled={isBusy}
onChange={(event) => setDescription(event.target.value)} onChange={(event) => setDescription(event.target.value)}
className="h-[5.5rem] min-h-[5.5rem] w-full resize-none rounded-[1.05rem] border border-[var(--platform-subpanel-border)] bg-white/90 px-4 py-3 text-base leading-6 text-[var(--platform-text-strong)] outline-none transition focus:border-rose-200 focus:bg-white focus:ring-2 focus:ring-rose-100" className="h-[5.5rem] min-h-[5.5rem] w-full resize-none rounded-[1.05rem] border border-[var(--platform-subpanel-border)] bg-white/90 px-4 py-3 text-base leading-6 text-[var(--platform-text-strong)] outline-none transition focus:border-[var(--platform-surface-hover-border)] focus:bg-white focus:ring-2 focus:ring-[var(--platform-warm-border)]"
maxLength={160} maxLength={160}
placeholder="" placeholder=""
aria-label="简介" aria-label="简介"
@@ -157,7 +157,7 @@ export function BarkBattleConfigEditor({
value={themePreset} value={themePreset}
disabled={isBusy} disabled={isBusy}
onChange={(event) => setThemePreset(event.target.value)} onChange={(event) => setThemePreset(event.target.value)}
className="h-11 w-full rounded-[1.05rem] border border-[var(--platform-subpanel-border)] bg-white/90 px-4 text-sm font-black text-[var(--platform-text-strong)] outline-none transition focus:border-rose-200 focus:bg-white focus:ring-2 focus:ring-rose-100" className="h-11 w-full rounded-[1.05rem] border border-[var(--platform-subpanel-border)] bg-white/90 px-4 text-sm font-black text-[var(--platform-text-strong)] outline-none transition focus:border-[var(--platform-surface-hover-border)] focus:bg-white focus:ring-2 focus:ring-[var(--platform-warm-border)]"
aria-label="主题背景" aria-label="主题背景"
> >
{THEME_OPTIONS.map((option) => ( {THEME_OPTIONS.map((option) => (
@@ -180,7 +180,7 @@ export function BarkBattleConfigEditor({
event.target.value as BarkBattleDifficultyPreset, event.target.value as BarkBattleDifficultyPreset,
) )
} }
className="h-11 w-full rounded-[1.05rem] border border-[var(--platform-subpanel-border)] bg-white/90 px-4 text-sm font-black text-[var(--platform-text-strong)] outline-none transition focus:border-rose-200 focus:bg-white focus:ring-2 focus:ring-rose-100" className="h-11 w-full rounded-[1.05rem] border border-[var(--platform-subpanel-border)] bg-white/90 px-4 text-sm font-black text-[var(--platform-text-strong)] outline-none transition focus:border-[var(--platform-surface-hover-border)] focus:bg-white focus:ring-2 focus:ring-[var(--platform-warm-border)]"
aria-label="难度预设" aria-label="难度预设"
> >
{DIFFICULTY_OPTIONS.map((option) => ( {DIFFICULTY_OPTIONS.map((option) => (
@@ -201,7 +201,7 @@ export function BarkBattleConfigEditor({
onChange={(event) => onChange={(event) =>
setPlayerDogSkinPreset(event.target.value) setPlayerDogSkinPreset(event.target.value)
} }
className="h-11 w-full rounded-[1.05rem] border border-[var(--platform-subpanel-border)] bg-white/90 px-4 text-sm font-black text-[var(--platform-text-strong)] outline-none transition focus:border-rose-200 focus:bg-white focus:ring-2 focus:ring-rose-100" className="h-11 w-full rounded-[1.05rem] border border-[var(--platform-subpanel-border)] bg-white/90 px-4 text-sm font-black text-[var(--platform-text-strong)] outline-none transition focus:border-[var(--platform-surface-hover-border)] focus:bg-white focus:ring-2 focus:ring-[var(--platform-warm-border)]"
aria-label="玩家狗狗" aria-label="玩家狗狗"
> >
{DOG_SKIN_OPTIONS.map((option) => ( {DOG_SKIN_OPTIONS.map((option) => (
@@ -222,7 +222,7 @@ export function BarkBattleConfigEditor({
onChange={(event) => onChange={(event) =>
setOpponentDogSkinPreset(event.target.value) setOpponentDogSkinPreset(event.target.value)
} }
className="h-11 w-full rounded-[1.05rem] border border-[var(--platform-subpanel-border)] bg-white/90 px-4 text-sm font-black text-[var(--platform-text-strong)] outline-none transition focus:border-rose-200 focus:bg-white focus:ring-2 focus:ring-rose-100" className="h-11 w-full rounded-[1.05rem] border border-[var(--platform-subpanel-border)] bg-white/90 px-4 text-sm font-black text-[var(--platform-text-strong)] outline-none transition focus:border-[var(--platform-surface-hover-border)] focus:bg-white focus:ring-2 focus:ring-[var(--platform-warm-border)]"
aria-label="对手狗狗" aria-label="对手狗狗"
> >
{DOG_SKIN_OPTIONS.map((option) => ( {DOG_SKIN_OPTIONS.map((option) => (

View File

@@ -207,7 +207,7 @@ export function CreativeImageInputPanel({
type="button" type="button"
disabled={disabled} disabled={disabled}
onClick={onHistoryClick} onClick={onHistoryClick}
className={`absolute right-3 top-3 z-10 inline-flex items-center gap-1.5 rounded-full border border-white/80 bg-white/94 px-3 py-2 text-[11px] font-black text-[var(--platform-text-strong)] shadow-sm backdrop-blur transition hover:text-[#ff4056] ${ className={`absolute right-3 top-3 z-10 inline-flex items-center gap-1.5 rounded-full border border-white/80 bg-white/94 px-3 py-2 text-[11px] font-black text-[var(--platform-text-strong)] shadow-sm backdrop-blur transition hover:text-[var(--platform-accent)] ${
disabled ? 'cursor-not-allowed opacity-55' : '' disabled ? 'cursor-not-allowed opacity-55' : ''
}`} }`}
aria-label={labels.history ?? '选择历史图片'} aria-label={labels.history ?? '选择历史图片'}
@@ -232,7 +232,7 @@ export function CreativeImageInputPanel({
<span <span
aria-hidden="true" aria-hidden="true"
className={`relative h-5 w-9 rounded-full transition ${ className={`relative h-5 w-9 rounded-full transition ${
aiRedraw ? 'bg-[#ff4056]' : 'bg-zinc-300' aiRedraw ? 'bg-[var(--platform-accent)]' : 'bg-zinc-300'
}`} }`}
> >
<span <span
@@ -248,7 +248,7 @@ export function CreativeImageInputPanel({
type="button" type="button"
disabled={disabled} disabled={disabled}
onClick={() => setIsRemoveImageConfirmOpen(true)} onClick={() => setIsRemoveImageConfirmOpen(true)}
className="absolute left-3 top-3 z-10 inline-flex h-10 w-10 items-center justify-center rounded-full border border-white/80 bg-white/94 text-[var(--platform-text-strong)] shadow-sm backdrop-blur transition hover:text-[#ff4056] disabled:cursor-not-allowed disabled:opacity-55" className="absolute left-3 top-3 z-10 inline-flex h-10 w-10 items-center justify-center rounded-full border border-white/80 bg-white/94 text-[var(--platform-text-strong)] shadow-sm backdrop-blur transition hover:text-[var(--platform-accent)] disabled:cursor-not-allowed disabled:opacity-55"
aria-label={labels.removeImage} aria-label={labels.removeImage}
title={labels.removeImage} title={labels.removeImage}
> >
@@ -257,7 +257,7 @@ export function CreativeImageInputPanel({
) : canEditMainImage && !uploadedImageSrc ? ( ) : canEditMainImage && !uploadedImageSrc ? (
<label <label
htmlFor={mainImageInputId} htmlFor={mainImageInputId}
className={`absolute bottom-9 left-1/2 z-10 -translate-x-1/2 whitespace-nowrap text-center text-sm font-black text-[var(--platform-text-strong)] drop-shadow-[0_1px_0_rgba(255,255,255,0.82)] transition hover:text-[#ff4056] sm:bottom-10 ${ className={`absolute bottom-9 left-1/2 z-10 -translate-x-1/2 whitespace-nowrap text-center text-sm font-black text-[var(--platform-text-strong)] drop-shadow-[0_1px_0_rgba(255,255,255,0.82)] transition hover:text-[var(--platform-accent)] sm:bottom-10 ${
disabled disabled
? 'cursor-not-allowed opacity-55' ? 'cursor-not-allowed opacity-55'
: 'cursor-pointer' : 'cursor-pointer'
@@ -293,7 +293,7 @@ export function CreativeImageInputPanel({
{imageModelPicker} {imageModelPicker}
{!uploadedImageSrc && onPromptReferenceFilesSelect ? ( {!uploadedImageSrc && onPromptReferenceFilesSelect ? (
<label <label
className={`absolute bottom-3 right-3 z-10 inline-flex h-8 w-8 items-center justify-center rounded-full border border-[var(--platform-subpanel-border)] bg-white/96 text-[var(--platform-text-strong)] shadow-sm transition hover:bg-[var(--platform-subpanel-fill)] hover:text-[#ff4056] ${ className={`absolute bottom-3 right-3 z-10 inline-flex h-8 w-8 items-center justify-center rounded-full border border-[var(--platform-subpanel-border)] bg-white/96 text-[var(--platform-text-strong)] shadow-sm transition hover:bg-[var(--platform-subpanel-fill)] hover:text-[var(--platform-accent)] ${
promptReferenceUploadDisabled promptReferenceUploadDisabled
? 'cursor-not-allowed opacity-55' ? 'cursor-not-allowed opacity-55'
: 'cursor-pointer' : 'cursor-pointer'
@@ -347,7 +347,7 @@ export function CreativeImageInputPanel({
type="button" type="button"
disabled={disabled} disabled={disabled}
onClick={() => onPromptReferenceRemove(reference.id)} onClick={() => onPromptReferenceRemove(reference.id)}
className="absolute right-0.5 top-0.5 inline-flex h-5 w-5 items-center justify-center rounded-full bg-white/94 text-[var(--platform-text-strong)] shadow-sm transition hover:text-[#ff4056] disabled:opacity-55" className="absolute right-0.5 top-0.5 inline-flex h-5 w-5 items-center justify-center rounded-full bg-white/94 text-[var(--platform-text-strong)] shadow-sm transition hover:text-[var(--platform-accent)] disabled:opacity-55"
aria-label={`移除参考图 ${reference.label}`} aria-label={`移除参考图 ${reference.label}`}
title="移除参考图" title="移除参考图"
> >

View File

@@ -377,7 +377,7 @@ export function SquareImageCropModal({
className="h-full w-full object-fill" className="h-full w-full object-fill"
/> />
<div <div
className={`absolute border-2 border-sky-200/95 shadow-[0_0_0_9999px_rgba(0,0,0,0.38)] outline outline-1 outline-black/35 ${ className={`absolute border-2 border-[var(--platform-accent)] shadow-[0_0_0_9999px_rgba(61,31,16,0.34)] outline outline-1 outline-[rgba(74,34,15,0.35)] ${
activeDragHandle === 'move' ? 'cursor-grabbing' : 'cursor-grab' activeDragHandle === 'move' ? 'cursor-grabbing' : 'cursor-grab'
}`} }`}
style={previewStyle} style={previewStyle}
@@ -410,13 +410,13 @@ export function SquareImageCropModal({
onPointerUp={stopCropDrag} onPointerUp={stopCropDrag}
onPointerCancel={stopCropDrag} onPointerCancel={stopCropDrag}
> >
<span className="absolute left-1/2 top-1/2 h-3 w-3 -translate-x-1/2 -translate-y-1/2 rounded-full border border-white bg-sky-300 shadow-[0_0_0_3px_rgba(2,132,199,0.32)]" /> <span className="absolute left-1/2 top-1/2 h-3 w-3 -translate-x-1/2 -translate-y-1/2 rounded-full border border-white bg-[var(--platform-accent)] shadow-[0_0_0_3px_rgba(204,117,76,0.32)]" />
</button> </button>
))} ))}
</div> </div>
</div> </div>
{error ? ( {error ? (
<div className="mt-4 rounded-2xl border border-rose-400/25 bg-rose-500/10 px-3 py-2 text-sm text-rose-600"> <div className="mt-4 rounded-2xl border border-[var(--platform-button-danger-border)] bg-[var(--platform-button-danger-fill)] px-3 py-2 text-sm text-[var(--platform-button-danger-text)]">
{error} {error}
</div> </div>
) : null} ) : null}

View File

@@ -136,7 +136,7 @@ function CreationAgentOperationBanner({
: 'platform-banner--success'; : 'platform-banner--success';
const progress = normalizeCreationAgentProgress(visibleOperation.progress); const progress = normalizeCreationAgentProgress(visibleOperation.progress);
const progressFillStyle = isFailed const progressFillStyle = isFailed
? { background: 'linear-gradient(90deg, #fb7185 0%, #f43f5e 100%)' } ? { background: 'linear-gradient(90deg, #c7653d 0%, #a6402f 100%)' }
: isRunning : isRunning
? { background: 'var(--platform-button-primary-fill)' } ? { background: 'var(--platform-button-primary-fill)' }
: { background: 'linear-gradient(90deg, #86efac 0%, #34d399 100%)' }; : { background: 'linear-gradient(90deg, #86efac 0%, #34d399 100%)' };

View File

@@ -171,7 +171,7 @@ export function CreativeAgentWorkspace({
{targetBinding ? ( {targetBinding ? (
<section className="platform-subpanel flex flex-col gap-3 rounded-[1.35rem] p-4 sm:flex-row sm:items-center sm:justify-between"> <section className="platform-subpanel flex flex-col gap-3 rounded-[1.35rem] p-4 sm:flex-row sm:items-center sm:justify-between">
<div className="flex items-center gap-3"> <div className="flex items-center gap-3">
<span className="inline-flex h-10 w-10 items-center justify-center rounded-full bg-emerald-100 text-emerald-700"> <span className="inline-flex h-10 w-10 items-center justify-center rounded-full bg-[var(--platform-success-bg)] text-[var(--platform-success-text)]">
<CheckCircle2 className="h-5 w-5" /> <CheckCircle2 className="h-5 w-5" />
</span> </span>
<div> <div>
@@ -203,7 +203,7 @@ export function CreativeAgentWorkspace({
key={message.id} key={message.id}
className={`max-w-[86%] rounded-[1.15rem] px-4 py-3 text-sm leading-6 ${ className={`max-w-[86%] rounded-[1.15rem] px-4 py-3 text-sm leading-6 ${
message.role === 'user' message.role === 'user'
? 'ml-auto bg-[var(--platform-button-primary-fill)] text-[var(--platform-button-primary-text)]' ? 'ml-auto bg-[var(--platform-button-primary-solid)] text-[var(--platform-button-primary-text)]'
: 'platform-subpanel text-[var(--platform-text-base)]' : 'platform-subpanel text-[var(--platform-text-base)]'
}`} }`}
> >

View File

@@ -60,13 +60,13 @@ const difficultyToneByValue: Record<
{ accent: string; soft: string; label: string } { accent: string; soft: string; label: string }
> = { > = {
advanced: { advanced: {
accent: '#f97316', accent: '#df7f40',
soft: 'rgba(249, 115, 22, 0.16)', soft: 'rgba(249, 115, 22, 0.16)',
label: '进阶', label: '进阶',
}, },
challenge: { challenge: {
accent: '#e11d48', accent: '#b64a35',
soft: 'rgba(225, 29, 72, 0.16)', soft: 'rgba(182, 98, 63, 0.16)',
label: '挑战', label: '挑战',
}, },
easy: { easy: {

View File

@@ -290,9 +290,9 @@ export function JumpHopRuntimeShell({
}; };
return ( return (
<div className="platform-remap-surface jump-hop-runtime relative flex h-full min-h-0 w-full flex-col overflow-hidden bg-[#eef8ff] text-slate-950"> <div className="platform-remap-surface jump-hop-runtime relative flex h-full min-h-0 w-full flex-col overflow-hidden bg-[#fffdf9] text-slate-950">
<div className="jump-hop-runtime__sky" /> <div className="jump-hop-runtime__sky" />
<div className="pointer-events-none absolute inset-0 bg-[radial-gradient(circle_at_50%_18%,rgba(255,255,255,0.82),transparent_30%),linear-gradient(180deg,rgba(255,255,255,0.18),rgba(148,210,255,0.2))]" /> <div className="pointer-events-none absolute inset-0 bg-[radial-gradient(circle_at_50%_18%,rgba(255,255,255,0.82),transparent_30%),linear-gradient(180deg,rgba(255,255,255,0.18),rgba(234,204,179,0.24))]" />
<header className="relative z-20 flex items-center justify-between gap-2 px-3 pb-2 pt-[max(0.75rem,env(safe-area-inset-top))] sm:px-4"> <header className="relative z-20 flex items-center justify-between gap-2 px-3 pb-2 pt-[max(0.75rem,env(safe-area-inset-top))] sm:px-4">
<button <button
@@ -456,7 +456,9 @@ export function JumpHopRuntimeShell({
<footer className="relative z-20 mt-3 flex items-center justify-between gap-3"> <footer className="relative z-20 mt-3 flex items-center justify-between gap-3">
<div className="min-w-0 text-sm font-bold text-slate-700"> <div className="min-w-0 text-sm font-bold text-slate-700">
{error ? ( {error ? (
<span className="text-rose-600">{error}</span> <span className="text-[var(--platform-button-danger-text)]">
{error}
</span>
) : ( ) : (
<span>{getStatusLabel(activeRun?.status)}</span> <span>{getStatusLabel(activeRun?.status)}</span>
)} )}
@@ -467,7 +469,7 @@ export function JumpHopRuntimeShell({
onPointerDown={beginCharge} onPointerDown={beginCharge}
onPointerUp={() => void finishCharge()} onPointerUp={() => void finishCharge()}
onPointerCancel={cancelCharge} onPointerCancel={cancelCharge}
className="platform-button platform-button--primary min-h-12 shrink-0 gap-2 rounded-full px-5 py-3 text-sm shadow-[0_12px_28px_rgba(14,165,233,0.28)]" className="platform-button platform-button--primary min-h-12 shrink-0 gap-2 rounded-full px-5 py-3 text-sm shadow-[0_12px_28px_rgba(182,98,63,0.22)]"
> >
{isBusy ? ( {isBusy ? (
<Loader2 className="h-4 w-4 animate-spin" /> <Loader2 className="h-4 w-4 animate-spin" />
@@ -485,8 +487,8 @@ export function JumpHopRuntimeShell({
inset: 0; inset: 0;
background: background:
radial-gradient(circle at 18% 18%, rgba(253, 230, 138, 0.36), transparent 24%), radial-gradient(circle at 18% 18%, rgba(253, 230, 138, 0.36), transparent 24%),
radial-gradient(circle at 82% 22%, rgba(125, 211, 252, 0.34), transparent 28%), radial-gradient(circle at 82% 22%, rgba(226, 171, 134, 0.34), transparent 28%),
linear-gradient(180deg, #f7fdff 0%, #e8f6ff 52%, #d9eefc 100%); linear-gradient(180deg, #fffdf9 0%, #f8efe7 52%, #f4e5d7 100%);
} }
.jump-hop-runtime__stage { .jump-hop-runtime__stage {
@@ -645,7 +647,7 @@ export function JumpHopRuntimeShell({
border-radius: 999px 999px 0.9rem 0.9rem; border-radius: 999px 999px 0.9rem 0.9rem;
background: background:
radial-gradient(circle at 50% 22%, #fff 0 17%, transparent 18%), radial-gradient(circle at 50% 22%, #fff 0 17%, transparent 18%),
linear-gradient(180deg, #fb7185 0%, #f97316 100%); linear-gradient(180deg, #c7653d 0%, #df7f40 100%);
box-shadow: inset 0 0 0 2px rgba(255,255,255,0.72), 0 12px 18px rgba(190, 80, 40, 0.24); box-shadow: inset 0 0 0 2px rgba(255,255,255,0.72), 0 12px 18px rgba(190, 80, 40, 0.24);
} }
@@ -683,7 +685,7 @@ export function JumpHopRuntimeShell({
height: 100%; height: 100%;
transform-origin: left center; transform-origin: left center;
border-radius: inherit; border-radius: inherit;
background: linear-gradient(90deg, #38bdf8, #facc15, #fb7185); background: linear-gradient(90deg, #6e8d42, #f0cba9, #c7653d);
} }
@keyframes jump-hop-feedback { @keyframes jump-hop-feedback {

View File

@@ -330,7 +330,7 @@ export function Match3DAgentWorkspace({
<h1 className="m-0 text-3xl font-black leading-none tracking-normal text-[var(--platform-text-strong)] sm:text-7xl"> <h1 className="m-0 text-3xl font-black leading-none tracking-normal text-[var(--platform-text-strong)] sm:text-7xl">
{title} {title}
</h1> </h1>
<span className="rounded-full border border-emerald-200 bg-emerald-50 px-3 py-1 text-[11px] font-black text-emerald-700"> <span className="rounded-full border border-[var(--platform-warm-border)] bg-[var(--platform-warm-bg)] px-3 py-1 text-[11px] font-black text-[var(--platform-warm-text)]">
BETA BETA
</span> </span>
</div> </div>
@@ -356,7 +356,7 @@ export function Match3DAgentWorkspace({
themeText: event.target.value, themeText: event.target.value,
})) }))
} }
className="h-full min-h-[7.75rem] w-full resize-none rounded-[1.15rem] border border-[var(--platform-subpanel-border)] bg-white/90 px-4 py-3 text-base leading-6 text-[var(--platform-text-strong)] outline-none transition focus:border-rose-200 focus:bg-white focus:ring-2 focus:ring-rose-100 sm:min-h-[9rem] lg:min-h-[14rem]" className="h-full min-h-[7.75rem] w-full resize-none rounded-[1.15rem] border border-[var(--platform-subpanel-border)] bg-white/90 px-4 py-3 text-base leading-6 text-[var(--platform-text-strong)] outline-none transition focus:border-[var(--platform-surface-hover-border)] focus:bg-white focus:ring-2 focus:ring-[var(--platform-warm-border)] sm:min-h-[9rem] lg:min-h-[14rem]"
aria-label="想做一个什么题材的抓大鹅?" aria-label="想做一个什么题材的抓大鹅?"
/> />
</label> </label>
@@ -388,10 +388,10 @@ export function Match3DAgentWorkspace({
assetStyleId: option.id, assetStyleId: option.id,
})); }));
}} }}
className={`group relative h-[4.9rem] w-[5.85rem] shrink-0 snap-start overflow-hidden rounded-[0.95rem] border p-0 text-left transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-rose-200 sm:h-[5.45rem] sm:w-[6.4rem] ${ className={`group relative h-[4.9rem] w-[5.85rem] shrink-0 snap-start overflow-hidden rounded-[0.95rem] border p-0 text-left transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--platform-warm-border)] sm:h-[5.45rem] sm:w-[6.4rem] ${
selected selected
? 'border-rose-300 bg-white shadow-[0_8px_18px_rgba(190,18,60,0.10)] ring-2 ring-rose-100' ? 'border-[var(--platform-surface-hover-border)] bg-white shadow-[0_8px_18px_rgba(112,57,30,0.10)] ring-2 ring-[var(--platform-warm-border)]'
: 'border-[var(--platform-subpanel-border)] bg-white/70 hover:border-rose-200 hover:bg-white/95' : 'border-[var(--platform-subpanel-border)] bg-white/70 hover:border-[var(--platform-surface-hover-border)] hover:bg-white/95'
} ${isBusy ? 'cursor-not-allowed opacity-55' : ''}`} } ${isBusy ? 'cursor-not-allowed opacity-55' : ''}`}
aria-pressed={selected} aria-pressed={selected}
aria-label={option.label} aria-label={option.label}
@@ -408,11 +408,11 @@ export function Match3DAgentWorkspace({
)} )}
<span className="absolute inset-0 bg-[linear-gradient(180deg,rgba(255,255,255,0.02)_0%,rgba(255,255,255,0.18)_44%,rgba(255,255,255,0.82)_100%)]" /> <span className="absolute inset-0 bg-[linear-gradient(180deg,rgba(255,255,255,0.02)_0%,rgba(255,255,255,0.18)_44%,rgba(255,255,255,0.82)_100%)]" />
{selected ? ( {selected ? (
<span className="absolute right-1.5 top-1.5 h-2.5 w-2.5 rounded-full bg-rose-400 shadow-[0_0_0_3px_rgba(255,255,255,0.84)]" /> <span className="absolute right-1.5 top-1.5 h-2.5 w-2.5 rounded-full bg-[var(--platform-accent)] shadow-[0_0_0_3px_rgba(255,255,255,0.84)]" />
) : null} ) : null}
{isCustom ? ( {isCustom ? (
<span className="absolute inset-0 flex items-center justify-center text-rose-500"> <span className="absolute inset-0 flex items-center justify-center text-[var(--platform-accent)]">
<span className="grid h-8 w-8 place-items-center rounded-full bg-white/82 shadow-[0_6px_18px_rgba(190,18,60,0.12)]"> <span className="grid h-8 w-8 place-items-center rounded-full bg-white/82 shadow-[0_6px_18px_rgba(112,57,30,0.12)]">
<Plus className="h-5 w-5" /> <Plus className="h-5 w-5" />
</span> </span>
</span> </span>
@@ -420,7 +420,7 @@ export function Match3DAgentWorkspace({
<span <span
className={`absolute inset-x-2 bottom-1.5 truncate rounded-full px-1.5 py-0.5 text-center text-[11px] font-black shadow-[0_3px_10px_rgba(15,23,42,0.10)] ${ className={`absolute inset-x-2 bottom-1.5 truncate rounded-full px-1.5 py-0.5 text-center text-[11px] font-black shadow-[0_3px_10px_rgba(15,23,42,0.10)] ${
selected selected
? 'bg-rose-50/95 text-rose-700' ? 'bg-[var(--platform-warm-bg)] text-[var(--platform-warm-text)]'
: 'bg-white/88 text-[var(--platform-text-strong)]' : 'bg-white/88 text-[var(--platform-text-strong)]'
}`} }`}
> >
@@ -450,10 +450,10 @@ export function Match3DAgentWorkspace({
difficultyOptionId: option.id, difficultyOptionId: option.id,
})) }))
} }
className={`min-h-10 rounded-[0.85rem] border px-2 text-sm font-black transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-rose-200 sm:min-h-11 ${ className={`min-h-10 rounded-[0.85rem] border px-2 text-sm font-black transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--platform-warm-border)] sm:min-h-11 ${
selected selected
? 'border-[#ff7890] bg-[linear-gradient(180deg,#ff7890_0%,#ff4f6a_100%)] text-white shadow-[0_8px_18px_rgba(244,63,94,0.16)]' ? 'border-[#ff7890] bg-[linear-gradient(180deg,#ff7890_0%,#ff4f6a_100%)] text-white shadow-[0_8px_18px_rgba(244,63,94,0.16)]'
: 'border-[var(--platform-subpanel-border)] bg-white/76 text-[var(--platform-text-strong)] hover:border-rose-200 hover:bg-white' : 'border-[var(--platform-subpanel-border)] bg-white/76 text-[var(--platform-text-strong)] hover:border-[var(--platform-surface-hover-border)] hover:bg-white'
} ${isBusy ? 'cursor-not-allowed opacity-55' : ''}`} } ${isBusy ? 'cursor-not-allowed opacity-55' : ''}`}
aria-pressed={selected} aria-pressed={selected}
> >
@@ -528,7 +528,7 @@ export function Match3DAgentWorkspace({
setDraftCustomStylePrompt(event.target.value) setDraftCustomStylePrompt(event.target.value)
} }
rows={4} rows={4}
className="mt-4 h-[7.5rem] w-full resize-none rounded-[1rem] border border-[var(--platform-subpanel-border)] bg-white/90 px-4 py-3 text-base leading-6 text-[var(--platform-text-strong)] outline-none transition focus:border-rose-200 focus:bg-white focus:ring-2 focus:ring-rose-100" className="mt-4 h-[7.5rem] w-full resize-none rounded-[1rem] border border-[var(--platform-subpanel-border)] bg-white/90 px-4 py-3 text-base leading-6 text-[var(--platform-text-strong)] outline-none transition focus:border-[var(--platform-surface-hover-border)] focus:bg-white focus:ring-2 focus:ring-[var(--platform-warm-border)]"
aria-label="自定义2D素材风格描述" aria-label="自定义2D素材风格描述"
/> />
<div className="mt-5 grid grid-cols-2 gap-3"> <div className="mt-5 grid grid-cols-2 gap-3">

View File

@@ -1003,7 +1003,7 @@ function Match3DBatchGenerationProgress({
</div> </div>
) : null} ) : null}
{generationState.error ? ( {generationState.error ? (
<div className="mt-2 text-sm font-semibold text-rose-600"> <div className="mt-2 text-sm font-semibold text-[var(--platform-button-danger-text)]">
{generationState.error} {generationState.error}
</div> </div>
) : null} ) : null}
@@ -1478,14 +1478,14 @@ function Match3DWorkInfoTab({
{tags.map((tag) => ( {tags.map((tag) => (
<span <span
key={tag} key={tag}
className="inline-flex items-center gap-1.5 rounded-full border border-emerald-300/35 bg-emerald-100/68 px-3 py-1.5 text-xs font-semibold text-emerald-700" className="inline-flex items-center gap-1.5 rounded-full border border-[var(--platform-warm-border)] bg-[var(--platform-warm-bg)] px-3 py-1.5 text-xs font-semibold text-[var(--platform-warm-text)]"
> >
{tag} {tag}
<button <button
type="button" type="button"
disabled={isBusy} disabled={isBusy}
onClick={() => updateTags(tags.filter((item) => item !== tag))} onClick={() => updateTags(tags.filter((item) => item !== tag))}
className="rounded-full text-emerald-800/70 transition hover:text-emerald-950 disabled:opacity-45" className="rounded-full text-[var(--platform-warm-text)] opacity-70 transition hover:text-[var(--platform-text-strong)] hover:opacity-100 disabled:opacity-45"
aria-label={`删除标签 ${tag}`} aria-label={`删除标签 ${tag}`}
title="删除标签" title="删除标签"
> >
@@ -1691,7 +1691,7 @@ function Match3DCoverImageEditor({
<span <span
aria-hidden="true" aria-hidden="true"
className={`relative h-5 w-9 rounded-full transition ${ className={`relative h-5 w-9 rounded-full transition ${
aiRedraw ? 'bg-[#ff4056]' : 'bg-zinc-300' aiRedraw ? 'bg-[var(--platform-accent)]' : 'bg-zinc-300'
}`} }`}
> >
<span <span
@@ -1705,7 +1705,7 @@ function Match3DCoverImageEditor({
type="button" type="button"
disabled={isGenerating} disabled={isGenerating}
onClick={onUploadedImageRemove} onClick={onUploadedImageRemove}
className="absolute left-3 top-3 z-10 inline-flex h-10 w-10 items-center justify-center rounded-full border border-white/80 bg-white/94 text-[var(--platform-text-strong)] shadow-sm backdrop-blur transition hover:text-[#ff4056] disabled:cursor-not-allowed disabled:opacity-55" className="absolute left-3 top-3 z-10 inline-flex h-10 w-10 items-center justify-center rounded-full border border-white/80 bg-white/94 text-[var(--platform-text-strong)] shadow-sm backdrop-blur transition hover:text-[var(--platform-accent)] disabled:cursor-not-allowed disabled:opacity-55"
aria-label="移除封面图" aria-label="移除封面图"
title="移除封面图" title="移除封面图"
> >
@@ -1715,7 +1715,7 @@ function Match3DCoverImageEditor({
) : ( ) : (
<label <label
htmlFor="match3d-cover-upload-input" htmlFor="match3d-cover-upload-input"
className={`absolute bottom-9 left-1/2 z-10 -translate-x-1/2 whitespace-nowrap text-center text-sm font-black text-[var(--platform-text-strong)] drop-shadow-[0_1px_0_rgba(255,255,255,0.82)] transition hover:text-[#ff4056] ${isGenerating ? 'cursor-not-allowed opacity-55' : 'cursor-pointer'}`} className={`absolute bottom-9 left-1/2 z-10 -translate-x-1/2 whitespace-nowrap text-center text-sm font-black text-[var(--platform-text-strong)] drop-shadow-[0_1px_0_rgba(255,255,255,0.82)] transition hover:text-[var(--platform-accent)] ${isGenerating ? 'cursor-not-allowed opacity-55' : 'cursor-pointer'}`}
> >
/ /
</label> </label>
@@ -1764,7 +1764,7 @@ function Match3DCoverImageEditor({
{referenceImages.map((reference) => ( {referenceImages.map((reference) => (
<div <div
key={reference.id} key={reference.id}
className="relative overflow-hidden rounded-[1rem] border border-emerald-300 bg-white/74" className="relative overflow-hidden rounded-[1rem] border border-[var(--platform-warm-border)] bg-white/74"
> >
<div className="aspect-square overflow-hidden"> <div className="aspect-square overflow-hidden">
<ResolvedAssetImage <ResolvedAssetImage
@@ -1781,7 +1781,7 @@ function Match3DCoverImageEditor({
type="button" type="button"
disabled={isGenerating} disabled={isGenerating}
onClick={() => onReferenceRemove(reference.id)} onClick={() => onReferenceRemove(reference.id)}
className="absolute bottom-1.5 right-1.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-white/92 text-[var(--platform-text-strong)] shadow-sm transition hover:text-[#ff4056] disabled:opacity-55" className="absolute bottom-1.5 right-1.5 inline-flex h-6 w-6 items-center justify-center rounded-full bg-white/92 text-[var(--platform-text-strong)] shadow-sm transition hover:text-[var(--platform-accent)] disabled:opacity-55"
aria-label={`移除参考图 ${reference.label}`} aria-label={`移除参考图 ${reference.label}`}
title="移除参考图" title="移除参考图"
> >
@@ -1803,8 +1803,8 @@ function Match3DCoverImageEditor({
referenceImages.some( referenceImages.some(
(reference) => reference.imageSrc === asset.imageSrc, (reference) => reference.imageSrc === asset.imageSrc,
) )
? 'border-emerald-300 ring-2 ring-emerald-100' ? 'border-[var(--platform-warm-border)] ring-2 ring-[var(--platform-warm-bg)]'
: 'border-[var(--platform-subpanel-border)] hover:border-emerald-200' : 'border-[var(--platform-subpanel-border)] hover:border-[var(--platform-surface-hover-border)]'
}`} }`}
aria-label={`引用${asset.label}`} aria-label={`引用${asset.label}`}
> >
@@ -2058,9 +2058,9 @@ function Match3DConfigTab({
<section className="platform-subpanel rounded-[1.35rem] p-4 sm:p-5"> <section className="platform-subpanel rounded-[1.35rem] p-4 sm:p-5">
<div className="relative px-1 pb-1 pt-2"> <div className="relative px-1 pb-1 pt-2">
<div className="relative mx-[1.35rem] h-10"> <div className="relative mx-[1.35rem] h-10">
<div className="absolute left-0 right-0 top-1/2 h-2 -translate-y-1/2 rounded-full bg-white/75 shadow-[inset_0_0_0_1px_rgba(244,114,182,0.16)]" /> <div className="absolute left-0 right-0 top-1/2 h-2 -translate-y-1/2 rounded-full bg-white/75 shadow-[inset_0_0_0_1px_rgba(204,117,76,0.16)]" />
<div <div
className="absolute left-0 top-1/2 h-2 -translate-y-1/2 rounded-full bg-[linear-gradient(90deg,#ff8aac_0%,#ff5f7e_54%,#ff9b88_100%)] transition-[width] duration-200" className="absolute left-0 top-1/2 h-2 -translate-y-1/2 rounded-full bg-[linear-gradient(90deg,#df7f40_0%,#c7653d_54%,#e2ab86_100%)] transition-[width] duration-200"
style={{ width: `${trackProgress * 100}%` }} style={{ width: `${trackProgress * 100}%` }}
/> />
{MATCH3D_DIFFICULTY_OPTIONS.map((option, index) => { {MATCH3D_DIFFICULTY_OPTIONS.map((option, index) => {
@@ -2069,10 +2069,10 @@ function Match3DConfigTab({
<div <div
key={option.id} key={option.id}
aria-hidden="true" aria-hidden="true"
className={`absolute top-1/2 flex h-8 w-8 -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-full border transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-rose-200 ${ className={`absolute top-1/2 flex h-8 w-8 -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-full border transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--platform-warm-border)] ${
selected selected
? 'border-[#ff5f7e] bg-white shadow-[0_8px_18px_rgba(244,63,94,0.2)]' ? 'border-[var(--platform-surface-hover-border)] bg-white shadow-[0_8px_18px_rgba(112,57,30,0.16)]'
: 'border-rose-100 bg-white/90 hover:border-rose-200' : 'border-[var(--platform-subpanel-border)] bg-white/90 hover:border-[var(--platform-surface-hover-border)]'
} ${isBusy ? 'cursor-not-allowed opacity-55' : ''}`} } ${isBusy ? 'cursor-not-allowed opacity-55' : ''}`}
style={{ style={{
left: `${(index / (MATCH3D_DIFFICULTY_OPTIONS.length - 1)) * 100}%`, left: `${(index / (MATCH3D_DIFFICULTY_OPTIONS.length - 1)) * 100}%`,
@@ -2080,7 +2080,7 @@ function Match3DConfigTab({
> >
<span <span
className={`h-3.5 w-3.5 rounded-full ${ className={`h-3.5 w-3.5 rounded-full ${
selected ? 'bg-[var(--platform-accent)]' : 'bg-rose-100' selected ? 'bg-[var(--platform-accent)]' : 'bg-[var(--platform-warm-bg)]'
}`} }`}
/> />
</div> </div>
@@ -2108,9 +2108,9 @@ function Match3DConfigTab({
type="button" type="button"
disabled={isBusy} disabled={isBusy}
onClick={() => applyDifficultyOption(option)} onClick={() => applyDifficultyOption(option)}
className={`rounded-[0.9rem] px-1.5 py-2 text-center transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-rose-200 ${ className={`rounded-[0.9rem] px-1.5 py-2 text-center transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--platform-warm-border)] ${
selected selected
? 'bg-[#fff1f5] text-[var(--platform-text-strong)] shadow-[inset_0_0_0_1px_rgba(244,63,94,0.18)]' ? 'bg-[var(--platform-warm-bg)] text-[var(--platform-text-strong)] shadow-[inset_0_0_0_1px_rgba(204,117,76,0.18)]'
: 'text-[var(--platform-text-base)] hover:bg-white/58' : 'text-[var(--platform-text-base)] hover:bg-white/58'
} ${isBusy ? 'cursor-not-allowed opacity-55' : ''}`} } ${isBusy ? 'cursor-not-allowed opacity-55' : ''}`}
aria-pressed={selected} aria-pressed={selected}
@@ -2124,7 +2124,7 @@ function Match3DConfigTab({
})} })}
</div> </div>
</div> </div>
<div className="mt-3 rounded-[1rem] border border-rose-100/80 bg-white/62 px-3 py-3"> <div className="mt-3 rounded-[1rem] border border-[var(--platform-subpanel-border)] bg-white/62 px-3 py-3">
<div className="flex items-center justify-between gap-3"> <div className="flex items-center justify-between gap-3">
<div> <div>
<div className="text-lg font-black text-[var(--platform-text-strong)]"> <div className="text-lg font-black text-[var(--platform-text-strong)]">
@@ -2135,7 +2135,7 @@ function Match3DConfigTab({
</div> </div>
</div> </div>
<div className="rounded-full bg-[var(--platform-accent)] px-3 py-1 text-xs font-black text-white shadow-[0_8px_18px_rgba(244,63,94,0.16)]"> <div className="rounded-full bg-[var(--platform-accent)] px-3 py-1 text-xs font-black text-white shadow-[0_8px_18px_rgba(112,57,30,0.16)]">
{selectedOption.difficulty} {selectedOption.difficulty}
</div> </div>
</div> </div>
@@ -2189,15 +2189,15 @@ function Match3DItemAssetListCard({
<div <div
className={`group min-w-0 rounded-[1.15rem] border p-2 text-left transition-colors ${ className={`group min-w-0 rounded-[1.15rem] border p-2 text-left transition-colors ${
active active
? 'border-rose-300/70 bg-rose-50/80' ? 'border-[var(--platform-surface-hover-border)] bg-[var(--platform-warm-bg)]'
: 'border-[var(--platform-subpanel-border)] bg-white/76 hover:border-rose-200 hover:bg-white' : 'border-[var(--platform-subpanel-border)] bg-white/76 hover:border-[var(--platform-surface-hover-border)] hover:bg-white'
}`} }`}
> >
<div className="grid min-h-full grid-rows-[minmax(0,1fr)_auto] gap-2"> <div className="grid min-h-full grid-rows-[minmax(0,1fr)_auto] gap-2">
<button <button
type="button" type="button"
onClick={onClick} onClick={onClick}
className="grid min-h-0 gap-2 text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-rose-200" className="grid min-h-0 gap-2 text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--platform-warm-border)]"
aria-label={`打开${asset.name}物品素材`} aria-label={`打开${asset.name}物品素材`}
> >
<div className="grid aspect-square min-h-0 place-items-center overflow-hidden rounded-[0.95rem] border border-[var(--platform-subpanel-border)] bg-white/82"> <div className="grid aspect-square min-h-0 place-items-center overflow-hidden rounded-[0.95rem] border border-[var(--platform-subpanel-border)] bg-white/82">
@@ -2220,7 +2220,7 @@ function Match3DItemAssetListCard({
<button <button
type="button" type="button"
onClick={onDelete} onClick={onDelete}
className="platform-icon-button h-8 w-8 shrink-0 text-rose-500" className="platform-icon-button h-8 w-8 shrink-0 text-[var(--platform-button-danger-text)]"
aria-label="删除物品素材" aria-label="删除物品素材"
title="删除" title="删除"
> >
@@ -2307,9 +2307,9 @@ function Match3DItemAssetDetail({
aria-pressed={isActive} aria-pressed={isActive}
className={`grid aspect-square place-items-center overflow-hidden rounded-[0.65rem] border bg-white/82 transition ${ className={`grid aspect-square place-items-center overflow-hidden rounded-[0.65rem] border bg-white/82 transition ${
isActive isActive
? 'border-rose-300 ring-2 ring-rose-200' ? 'border-[var(--platform-surface-hover-border)] ring-2 ring-[var(--platform-warm-border)]'
: 'border-[var(--platform-subpanel-border)]' : 'border-[var(--platform-subpanel-border)]'
} ${!hasSource || busy ? 'cursor-not-allowed opacity-58' : 'hover:border-rose-200'}`} } ${!hasSource || busy ? 'cursor-not-allowed opacity-58' : 'hover:border-[var(--platform-surface-hover-border)]'}`}
> >
{source ? ( {source ? (
<ResolvedAssetImage <ResolvedAssetImage

View File

@@ -55,7 +55,7 @@ const MATCH3D_GEOMETRY_ASSETS: Record<string, Match3DGeometryAsset> = {
}; };
const MATCH3D_UNKNOWN_GEOMETRY_ASSETS: Match3DGeometryAsset[] = [ const MATCH3D_UNKNOWN_GEOMETRY_ASSETS: Match3DGeometryAsset[] = [
blockAsset('brick', '#e11d48', '#9f1239', 2, 2, 0.68), blockAsset('brick', '#b64a35', '#7a2f22', 2, 2, 0.68),
blockAsset('tile', '#f59e0b', '#92400e', 3, 1, 0.28), blockAsset('tile', '#f59e0b', '#92400e', 3, 1, 0.28),
blockAsset('slope', '#8b5cf6', '#5b21b6', 2, 1, 0.86), blockAsset('slope', '#8b5cf6', '#5b21b6', 2, 1, 0.86),
blockAsset('cylinder', '#10b981', '#065f46', 1, 1, 1.0), blockAsset('cylinder', '#10b981', '#065f46', 1, 1, 1.0),

View File

@@ -241,7 +241,7 @@ export function RpgCreationResultView({
</div> </div>
<div className="platform-progress-track mt-3 h-3 overflow-hidden rounded-full"> <div className="platform-progress-track mt-3 h-3 overflow-hidden rounded-full">
<div <div
className="h-full bg-[linear-gradient(90deg,#ff4f8b_0%,#ff8a73_48%,#ffd2a6_100%)] transition-[width] duration-300" className="h-full bg-[linear-gradient(90deg,#df7f40_0%,#cc754c_48%,#eaccb3_100%)] transition-[width] duration-300"
style={{ width: `${Math.max(0, Math.min(100, progress))}%` }} style={{ width: `${Math.max(0, Math.min(100, progress))}%` }}
/> />
</div> </div>

View File

@@ -142,10 +142,10 @@ function VisualNovelStyleButton({
aria-pressed={active} aria-pressed={active}
aria-label={label} aria-label={label}
onClick={onClick} onClick={onClick}
className={`group relative h-[4.9rem] w-[5.85rem] shrink-0 snap-start overflow-hidden rounded-[0.95rem] border p-0 text-left transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-rose-200 sm:h-[5.45rem] sm:w-[6.4rem] ${ className={`group relative h-[4.9rem] w-[5.85rem] shrink-0 snap-start overflow-hidden rounded-[0.95rem] border p-0 text-left transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--platform-warm-border)] sm:h-[5.45rem] sm:w-[6.4rem] ${
active active
? 'border-rose-300 bg-white shadow-[0_8px_18px_rgba(190,18,60,0.10)] ring-2 ring-rose-100' ? 'border-[var(--platform-surface-hover-border)] bg-white shadow-[0_8px_18px_rgba(112,57,30,0.10)] ring-2 ring-[var(--platform-warm-border)]'
: 'border-[var(--platform-subpanel-border)] bg-white/70 hover:border-rose-200 hover:bg-white/95' : 'border-[var(--platform-subpanel-border)] bg-white/70 hover:border-[var(--platform-surface-hover-border)] hover:bg-white/95'
} ${disabled ? 'cursor-not-allowed opacity-55' : ''}`} } ${disabled ? 'cursor-not-allowed opacity-55' : ''}`}
> >
{imageSrc ? ( {imageSrc ? (
@@ -160,12 +160,12 @@ function VisualNovelStyleButton({
)} )}
<span className="absolute inset-0 bg-[linear-gradient(180deg,rgba(255,255,255,0.02)_0%,rgba(255,255,255,0.18)_44%,rgba(255,255,255,0.82)_100%)]" /> <span className="absolute inset-0 bg-[linear-gradient(180deg,rgba(255,255,255,0.02)_0%,rgba(255,255,255,0.18)_44%,rgba(255,255,255,0.82)_100%)]" />
{active ? ( {active ? (
<span className="absolute right-1.5 top-1.5 h-2.5 w-2.5 rounded-full bg-rose-400 shadow-[0_0_0_3px_rgba(255,255,255,0.84)]" /> <span className="absolute right-1.5 top-1.5 h-2.5 w-2.5 rounded-full bg-[var(--platform-accent)] shadow-[0_0_0_3px_rgba(255,255,255,0.84)]" />
) : null} ) : null}
<span <span
className={`absolute inset-x-2 bottom-1.5 truncate rounded-full px-1.5 py-0.5 text-center text-[11px] font-black shadow-[0_3px_10px_rgba(15,23,42,0.10)] ${ className={`absolute inset-x-2 bottom-1.5 truncate rounded-full px-1.5 py-0.5 text-center text-[11px] font-black shadow-[0_3px_10px_rgba(15,23,42,0.10)] ${
active active
? 'bg-rose-50/95 text-rose-700' ? 'bg-[var(--platform-warm-bg)] text-[var(--platform-warm-text)]'
: 'bg-white/88 text-[var(--platform-text-strong)]' : 'bg-white/88 text-[var(--platform-text-strong)]'
}`} }`}
> >
@@ -254,7 +254,7 @@ export function VisualNovelAgentWorkspace({
<h1 className="m-0 text-3xl font-black leading-none tracking-normal text-[var(--platform-text-strong)] sm:text-7xl"> <h1 className="m-0 text-3xl font-black leading-none tracking-normal text-[var(--platform-text-strong)] sm:text-7xl">
{title} {title}
</h1> </h1>
<span className="rounded-full border border-rose-200 bg-rose-50 px-3 py-1 text-[11px] font-black text-rose-700"> <span className="rounded-full border border-[var(--platform-warm-border)] bg-[var(--platform-warm-bg)] px-3 py-1 text-[11px] font-black text-[var(--platform-warm-text)]">
BETA BETA
</span> </span>
</div> </div>
@@ -280,7 +280,7 @@ export function VisualNovelAgentWorkspace({
ideaText: event.target.value, ideaText: event.target.value,
})) }))
} }
className="h-full min-h-[7.75rem] w-full resize-none rounded-[1.15rem] border border-[var(--platform-subpanel-border)] bg-white/90 px-4 py-3 text-base leading-6 text-[var(--platform-text-strong)] outline-none transition focus:border-rose-200 focus:bg-white focus:ring-2 focus:ring-rose-100 sm:min-h-[9rem] lg:min-h-[14rem]" className="h-full min-h-[7.75rem] w-full resize-none rounded-[1.15rem] border border-[var(--platform-subpanel-border)] bg-white/90 px-4 py-3 text-base leading-6 text-[var(--platform-text-strong)] outline-none transition focus:border-[var(--platform-surface-hover-border)] focus:bg-white focus:ring-2 focus:ring-[var(--platform-warm-border)] sm:min-h-[9rem] lg:min-h-[14rem]"
aria-label="一句话创作" aria-label="一句话创作"
/> />
</label> </label>

View File

@@ -25,7 +25,7 @@ export function VisualNovelAttributePanel({ run }: VisualNovelAttributePanelProp
</div> </div>
<div className="h-2 overflow-hidden rounded-full bg-[var(--platform-track-fill)]"> <div className="h-2 overflow-hidden rounded-full bg-[var(--platform-track-fill)]">
<div <div
className="h-full rounded-full bg-[var(--platform-button-primary-fill)]" className="h-full rounded-full bg-[var(--platform-button-primary-solid)]"
style={{ width: `${Math.min(100, Math.max(0, value))}%` }} style={{ width: `${Math.min(100, Math.max(0, value))}%` }}
/> />
</div> </div>

View File

@@ -42,7 +42,7 @@ export function VisualNovelSavePanel({
type="button" type="button"
disabled={!onSaveRun || isSaving} disabled={!onSaveRun || isSaving}
onClick={onSaveRun} onClick={onSaveRun}
className="flex min-h-12 w-full items-center justify-center gap-2 rounded-full border border-[var(--platform-subpanel-border)] bg-[var(--platform-button-primary-fill)] px-4 text-sm font-black text-white transition hover:brightness-105 disabled:cursor-not-allowed disabled:opacity-55" className="flex min-h-12 w-full items-center justify-center gap-2 rounded-full border border-[var(--platform-subpanel-border)] bg-[var(--platform-button-primary-solid)] px-4 text-sm font-black text-white transition hover:brightness-105 disabled:cursor-not-allowed disabled:opacity-55"
> >
{isSaving ? ( {isSaving ? (
<Loader2 className="h-4 w-4 animate-spin" /> <Loader2 className="h-4 w-4 animate-spin" />

View File

@@ -111,7 +111,7 @@
} }
.bark-battle-primary-button { .bark-battle-primary-button {
background: linear-gradient(135deg, #facc15, #fb7185); background: linear-gradient(135deg, #facc15, #c7653d);
} }
.bark-battle-status-card, .bark-battle-status-card,

View File

@@ -35,7 +35,7 @@
--platform-bottom-nav-label-tracking: 0.18em; --platform-bottom-nav-label-tracking: 0.18em;
--platform-bottom-nav-content-gap: 0.22rem; --platform-bottom-nav-content-gap: 0.22rem;
--platform-bottom-nav-active-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.08), --platform-bottom-nav-active-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.08),
0 8px 18px rgba(255, 91, 132, 0.1); 0 8px 18px rgba(182, 98, 63, 0.1);
} }
html, html,
@@ -485,272 +485,277 @@ body {
.platform-theme--light { .platform-theme--light {
color-scheme: light; color-scheme: light;
--platform-accent: #c7653d;
--platform-body-fill: radial-gradient( --platform-body-fill: radial-gradient(
circle at top left, circle at 8% 0%,
rgba(255, 196, 214, 0.14), rgba(240, 203, 169, 0.24),
transparent 24%
),
radial-gradient(
circle at 88% 4%,
rgba(255, 222, 196, 0.12),
transparent 20%
),
radial-gradient(
circle at bottom,
rgba(255, 214, 225, 0.08),
transparent 26% transparent 26%
), ),
linear-gradient(180deg, #fffdfd 0%, #fffefe 50%, #fff8fa 100%); radial-gradient(
--platform-panel-shadow: 0 22px 60px rgba(215, 87, 134, 0.12), circle at 92% 8%,
0 8px 20px rgba(255, 255, 255, 0.82); rgba(226, 171, 134, 0.2),
transparent 22%
),
radial-gradient(
circle at 54% 100%,
rgba(204, 117, 76, 0.08),
transparent 30%
),
linear-gradient(180deg, #fffdf9 0%, #fdf9f5 54%, #f8efe7 100%);
--platform-panel-shadow: 0 22px 60px rgba(112, 57, 30, 0.1),
0 8px 22px rgba(255, 255, 255, 0.82);
--platform-panel-fill: linear-gradient( --platform-panel-fill: linear-gradient(
180deg, 180deg,
rgba(255, 255, 255, 0.985), rgba(255, 255, 255, 0.985),
rgba(255, 250, 251, 0.96) rgba(253, 248, 243, 0.96)
); );
--platform-panel-fill-soft: linear-gradient( --platform-panel-fill-soft: linear-gradient(
180deg, 180deg,
rgba(255, 255, 255, 0.95), rgba(255, 254, 252, 0.96),
rgba(255, 248, 250, 0.88) rgba(250, 243, 236, 0.9)
); );
--platform-hero-fill: linear-gradient( --platform-hero-fill: linear-gradient(
135deg, 135deg,
rgba(255, 139, 162, 0.9), rgba(244, 226, 211, 0.96),
rgba(255, 184, 153, 0.88) rgba(238, 208, 183, 0.9)
); );
--platform-hero-glow-a: rgba(255, 255, 255, 0.22); --platform-hero-glow-a: rgba(255, 255, 255, 0.42);
--platform-hero-glow-b: rgba(255, 228, 211, 0.2); --platform-hero-glow-b: rgba(228, 149, 91, 0.18);
--platform-hero-overlay-strong: linear-gradient( --platform-hero-overlay-strong: linear-gradient(
135deg, 135deg,
rgba(255, 146, 170, 0.78), rgba(238, 208, 183, 0.66),
rgba(255, 201, 171, 0.72) rgba(204, 117, 76, 0.18)
); );
--platform-hero-overlay-soft: linear-gradient( --platform-hero-overlay-soft: linear-gradient(
180deg, 180deg,
rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.34),
rgba(255, 246, 249, 0.26) rgba(248, 233, 219, 0.22)
); );
--platform-surface-border: rgba(239, 221, 228, 0.9); --platform-surface-border: rgba(226, 203, 184, 0.88);
--platform-surface-hover-border: rgba(255, 154, 188, 0.58); --platform-surface-hover-border: rgba(204, 117, 76, 0.42);
--platform-shell-glow-1: rgba(255, 255, 255, 0.2); --platform-shell-glow-1: rgba(255, 255, 255, 0.34);
--platform-shell-glow-2: rgba(255, 220, 229, 0.18); --platform-shell-glow-2: rgba(238, 208, 183, 0.22);
--platform-shell-glow-3: rgba(255, 221, 194, 0.14); --platform-shell-glow-3: rgba(210, 132, 93, 0.12);
--platform-surface-glow-a: rgba(255, 213, 225, 0.14); --platform-surface-glow-a: rgba(240, 203, 169, 0.18);
--platform-surface-glow-b: rgba(255, 224, 201, 0.12); --platform-surface-glow-b: rgba(204, 117, 76, 0.1);
--platform-text-strong: #28151d; --platform-text-strong: #3d1f10;
--platform-text-base: #5c4650; --platform-text-base: #6f5848;
--platform-text-soft: #886f79; --platform-text-soft: #988476;
--platform-brand-logo-title: #3b1a24; --platform-text-muted: #a38f80;
--platform-brand-logo-subtitle: #d93570; --platform-brand-logo-title: #4a220f;
--platform-brand-logo-shadow: #8f5870; --platform-brand-logo-subtitle: #c7653d;
--platform-line-soft: rgba(236, 214, 221, 0.72); --platform-brand-logo-shadow: #caa48b;
--platform-line-soft: rgba(226, 203, 184, 0.72);
--platform-subpanel-fill: linear-gradient( --platform-subpanel-fill: linear-gradient(
180deg, 180deg,
rgba(255, 255, 255, 0.94), rgba(255, 254, 252, 0.94),
rgba(255, 250, 251, 0.9) rgba(250, 243, 236, 0.9)
); );
--platform-subpanel-border: rgba(233, 217, 223, 0.82); --platform-subpanel-border: rgba(225, 204, 187, 0.82);
--platform-warm-border: rgba(255, 140, 116, 0.28); --platform-warm-border: rgba(204, 117, 76, 0.28);
--platform-warm-bg: rgba(255, 140, 116, 0.14); --platform-warm-bg: rgba(234, 204, 179, 0.32);
--platform-warm-text: #cf4f4e; --platform-warm-text: #b6623f;
--platform-cool-border: rgba(255, 83, 142, 0.24); --platform-cool-border: rgba(199, 117, 76, 0.24);
--platform-cool-bg: rgba(255, 83, 142, 0.14); --platform-cool-bg: rgba(238, 208, 183, 0.26);
--platform-cool-text: #d93570; --platform-cool-text: #b76038;
--platform-neutral-border: rgba(232, 191, 205, 0.44); --platform-neutral-border: rgba(226, 203, 184, 0.44);
--platform-neutral-bg: rgba(255, 255, 255, 0.68); --platform-neutral-bg: rgba(255, 253, 250, 0.7);
--platform-neutral-text: #715662; --platform-neutral-text: #7b6150;
--platform-button-primary-border: rgba(255, 101, 147, 0.3); --platform-button-primary-border: rgba(182, 98, 63, 0.32);
--platform-button-primary-fill: linear-gradient(135deg, #ff4f8b, #ff8a73); --platform-button-primary-solid: #c7653d;
--platform-button-primary-text: #fff7fb; --platform-button-primary-fill: linear-gradient(135deg, #df7f40, #b95d3a);
--platform-button-secondary-fill: rgba(255, 255, 255, 0.72); --platform-button-primary-text: #fffaf5;
--platform-button-secondary-text: #4b3340; --platform-button-secondary-fill: rgba(255, 253, 250, 0.78);
--platform-button-ghost-fill: rgba(255, 255, 255, 0.52); --platform-button-secondary-text: #4b2412;
--platform-button-ghost-text: #6e5460; --platform-button-ghost-fill: rgba(255, 253, 250, 0.56);
--platform-button-danger-border: rgba(251, 113, 133, 0.22); --platform-button-ghost-text: #755a49;
--platform-button-danger-fill: rgba(255, 228, 233, 0.94); --platform-button-danger-border: rgba(185, 75, 58, 0.22);
--platform-button-danger-text: #c2415d; --platform-button-danger-fill: rgba(255, 237, 229, 0.94);
--platform-success-border: rgba(52, 211, 153, 0.24); --platform-button-danger-text: #a6402f;
--platform-success-bg: rgba(236, 253, 245, 0.92); --platform-success-border: rgba(73, 144, 96, 0.24);
--platform-success-text: #0f8a61; --platform-success-bg: rgba(237, 248, 239, 0.92);
--platform-icon-fill: rgba(255, 255, 255, 0.62); --platform-success-text: #2f7b46;
--platform-icon-border: rgba(232, 191, 205, 0.46); --platform-icon-fill: rgba(255, 253, 250, 0.68);
--platform-icon-text: #7a5d67; --platform-icon-border: rgba(226, 203, 184, 0.5);
--platform-icon-text: #7b5c49;
--platform-nav-fill: linear-gradient( --platform-nav-fill: linear-gradient(
180deg, 180deg,
rgba(255, 255, 255, 0.96), rgba(255, 254, 252, 0.96),
rgba(255, 249, 250, 0.92) rgba(250, 243, 236, 0.92)
); );
--platform-nav-active-fill: linear-gradient( --platform-nav-active-fill: linear-gradient(
180deg, 180deg,
rgba(255, 91, 132, 0.16), rgba(238, 208, 183, 0.48),
rgba(255, 151, 116, 0.16) rgba(204, 117, 76, 0.16)
); );
--platform-nav-active-border: rgba(255, 126, 154, 0.32); --platform-nav-active-border: rgba(204, 117, 76, 0.34);
--platform-nav-active-shadow: 0 10px 22px rgba(255, 91, 132, 0.12); --platform-nav-active-shadow: 0 10px 24px rgba(182, 98, 63, 0.12);
--platform-modal-fill: linear-gradient( --platform-modal-fill: linear-gradient(
180deg, 180deg,
rgba(255, 255, 255, 0.96), rgba(255, 254, 252, 0.97),
rgba(255, 245, 248, 0.95) rgba(250, 243, 236, 0.95)
); );
--platform-modal-border: rgba(255, 255, 255, 0.52); --platform-modal-border: rgba(255, 255, 255, 0.58);
--platform-desktop-shell-fill: linear-gradient( --platform-desktop-shell-fill: linear-gradient(
180deg, 180deg,
rgba(255, 255, 255, 0.99), rgba(255, 255, 255, 0.99),
rgba(255, 251, 252, 0.985) rgba(253, 249, 245, 0.985)
); );
--platform-desktop-shell-border: rgba(240, 228, 232, 0.94); --platform-desktop-shell-border: rgba(230, 213, 199, 0.94);
--platform-desktop-shell-inner-border: rgba(241, 230, 234, 0.92); --platform-desktop-shell-inner-border: rgba(233, 218, 205, 0.92);
--platform-desktop-topbar-fill: linear-gradient( --platform-desktop-topbar-fill: linear-gradient(
180deg, 180deg,
rgba(255, 255, 255, 0.95), rgba(255, 255, 255, 0.95),
rgba(255, 251, 252, 0.92) rgba(253, 249, 245, 0.92)
); );
--platform-desktop-panel-fill: linear-gradient( --platform-desktop-panel-fill: linear-gradient(
180deg, 180deg,
rgba(255, 255, 255, 0.95), rgba(255, 254, 252, 0.95),
rgba(255, 250, 251, 0.91) rgba(250, 243, 236, 0.91)
); );
--platform-desktop-panel-border: rgba(238, 223, 228, 0.88); --platform-desktop-panel-border: rgba(226, 203, 184, 0.88);
--platform-desktop-hover-shadow: 0 16px 28px rgba(222, 82, 124, 0.12); --platform-desktop-hover-shadow: 0 16px 30px rgba(112, 57, 30, 0.12);
--platform-overlay-fill: linear-gradient( --platform-overlay-fill: linear-gradient(
180deg, 180deg,
rgba(255, 184, 204, 0.14), rgba(240, 203, 169, 0.14),
rgba(255, 255, 255, 0.56) rgba(255, 255, 255, 0.58)
); );
--platform-track-border: rgba(234, 193, 208, 0.46); --platform-track-border: rgba(226, 203, 184, 0.48);
--platform-track-fill: rgba(255, 255, 255, 0.88); --platform-track-fill: rgba(255, 253, 250, 0.9);
--platform-page-fill: linear-gradient( --platform-page-fill: linear-gradient(
180deg, 180deg,
rgba(255, 255, 255, 0.9), rgba(255, 255, 255, 0.9),
rgba(255, 250, 251, 0.8) rgba(250, 243, 236, 0.8)
); );
--platform-page-border: rgba(241, 230, 234, 0.88); --platform-page-border: rgba(233, 218, 205, 0.88);
--platform-input-fill: rgba(255, 255, 255, 0.94); --platform-input-fill: rgba(255, 253, 250, 0.94);
--platform-input-fill-focus: rgba(255, 255, 255, 0.96); --platform-input-fill-focus: rgba(255, 254, 252, 0.96);
--platform-input-highlight: rgba(255, 255, 255, 0.9); --platform-input-highlight: rgba(255, 255, 255, 0.9);
--platform-input-focus-ring: rgba(255, 91, 132, 0.14); --platform-input-focus-ring: rgba(204, 117, 76, 0.15);
--platform-nav-item-text: #7c6770; --platform-nav-item-text: #80695a;
--platform-nav-item-text-active: #2d1820; --platform-nav-item-text-active: #3d1f10;
--platform-nav-item-hover-fill: rgba(255, 244, 247, 0.92); --platform-nav-item-hover-fill: rgba(253, 248, 243, 0.94);
--platform-nav-item-icon-fill: rgba(248, 244, 246, 1); --platform-nav-item-icon-fill: rgba(250, 243, 236, 1);
--platform-nav-item-icon-text: #7a5d67; --platform-nav-item-icon-text: #7b5c49;
--platform-nav-item-icon-active-fill: rgba(255, 255, 255, 0.98); --platform-nav-item-icon-active-fill: rgba(255, 254, 252, 0.98);
--platform-nav-item-icon-active-text: #d93570; --platform-nav-item-icon-active-text: #c7653d;
--platform-nav-icon-active-shadow: 0 12px 24px rgba(255, 91, 132, 0.16); --platform-nav-icon-active-shadow: 0 12px 24px rgba(182, 98, 63, 0.16);
--platform-profile-hero-fill: linear-gradient( --platform-profile-hero-fill: linear-gradient(
180deg, 180deg,
rgba(255, 255, 255, 0.96), rgba(255, 254, 252, 0.96),
rgba(255, 245, 248, 0.9) rgba(250, 239, 229, 0.9)
); );
--platform-profile-hero-border: rgba(255, 255, 255, 0.52); --platform-profile-hero-border: rgba(255, 255, 255, 0.56);
--platform-profile-hero-shadow: 0 20px 56px rgba(216, 74, 124, 0.18); --platform-profile-hero-shadow: 0 20px 56px rgba(112, 57, 30, 0.16);
--platform-profile-avatar-fill: linear-gradient( --platform-profile-avatar-fill: linear-gradient(
135deg, 135deg,
rgba(255, 79, 139, 0.96), rgba(223, 127, 64, 0.96),
rgba(255, 140, 110, 0.9) rgba(181, 91, 56, 0.92)
); );
--platform-profile-avatar-shadow: 0 14px 30px rgba(255, 79, 139, 0.24); --platform-profile-avatar-shadow: 0 14px 30px rgba(182, 98, 63, 0.22);
--platform-profile-chip-fill: rgba(255, 255, 255, 0.88); --platform-profile-chip-fill: rgba(255, 253, 250, 0.88);
--platform-profile-chip-hover-fill: rgba(255, 255, 255, 0.96); --platform-profile-chip-hover-fill: rgba(255, 254, 252, 0.96);
--platform-profile-chip-text: #6a505b; --platform-profile-chip-text: #755a49;
--platform-profile-action-fill: linear-gradient(135deg, #ff4f8b, #ff8a73); --platform-profile-action-fill: linear-gradient(135deg, #df7f40, #b95d3a);
--platform-profile-action-text: #fff7fb; --platform-profile-action-solid: #c7653d;
--platform-profile-action-shadow: 0 14px 30px rgba(255, 79, 139, 0.24); --platform-profile-action-text: #fffaf5;
--platform-profile-action-shadow: 0 14px 30px rgba(182, 98, 63, 0.22);
--platform-card-overlay-soft: linear-gradient( --platform-card-overlay-soft: linear-gradient(
180deg, 180deg,
rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.08),
rgba(255, 247, 249, 0.82) rgba(250, 243, 236, 0.82)
); );
--platform-card-overlay-strong: linear-gradient( --platform-card-overlay-strong: linear-gradient(
180deg, 180deg,
rgba(255, 255, 255, 0.16), rgba(255, 255, 255, 0.16),
rgba(255, 243, 247, 0.92) rgba(248, 239, 231, 0.92)
); );
--platform-card-overlay-deep: radial-gradient( --platform-card-overlay-deep: radial-gradient(
circle at top left, circle at top left,
rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.2),
transparent 30% transparent 30%
), ),
radial-gradient(circle at right, rgba(255, 205, 178, 0.14), transparent 28%), radial-gradient(circle at right, rgba(228, 149, 91, 0.14), transparent 28%),
linear-gradient(180deg, rgba(255, 255, 255, 0.2), rgba(255, 241, 246, 0.9)); linear-gradient(180deg, rgba(255, 255, 255, 0.2), rgba(248, 239, 231, 0.9));
--platform-recommend-runtime-fill: var(--platform-panel-fill); --platform-recommend-runtime-fill: var(--platform-panel-fill);
--platform-recommend-runtime-border: rgba(232, 191, 205, 0.42); --platform-recommend-runtime-border: rgba(226, 203, 184, 0.42);
--platform-recommend-runtime-shadow: 0 18px 44px rgba(215, 87, 134, 0.13), --platform-recommend-runtime-shadow: 0 18px 44px rgba(112, 57, 30, 0.12),
inset 0 0 0 1px rgba(255, 255, 255, 0.58); inset 0 0 0 1px rgba(255, 255, 255, 0.58);
--platform-recommend-runtime-state-fill: radial-gradient( --platform-recommend-runtime-state-fill: radial-gradient(
circle at 50% 18%, circle at 50% 18%,
rgba(255, 91, 132, 0.12), rgba(204, 117, 76, 0.12),
transparent 34% transparent 34%
), ),
linear-gradient( linear-gradient(
180deg, 180deg,
rgba(255, 255, 255, 0.98), rgba(255, 255, 255, 0.98),
rgba(255, 246, 249, 0.94) rgba(250, 243, 236, 0.94)
); );
--platform-recommend-runtime-state-text: var(--platform-text-strong); --platform-recommend-runtime-state-text: var(--platform-text-strong);
--puzzle-runtime-shell-fill: var(--platform-body-fill); --puzzle-runtime-shell-fill: var(--platform-body-fill);
--puzzle-runtime-stage-fill: radial-gradient( --puzzle-runtime-stage-fill: radial-gradient(
circle at 50% 18%, circle at 50% 18%,
rgba(255, 91, 132, 0.13), rgba(204, 117, 76, 0.13),
transparent 30% transparent 30%
), ),
radial-gradient( radial-gradient(
circle at 18% 82%, circle at 18% 82%,
rgba(255, 138, 115, 0.13), rgba(240, 203, 169, 0.18),
transparent 28% transparent 28%
), ),
linear-gradient(180deg, #fffefe 0%, #fff7fa 58%, #fff1f5 100%); linear-gradient(180deg, #fffdf9 0%, #fbf5ed 58%, #f4e5d7 100%);
--puzzle-runtime-grid-line: rgba(130, 75, 95, 0.06); --puzzle-runtime-grid-line: rgba(112, 57, 30, 0.06);
--puzzle-runtime-text-strong: var(--platform-text-strong); --puzzle-runtime-text-strong: var(--platform-text-strong);
--puzzle-runtime-text-base: var(--platform-text-base); --puzzle-runtime-text-base: var(--platform-text-base);
--puzzle-runtime-text-soft: var(--platform-text-soft); --puzzle-runtime-text-soft: var(--platform-text-soft);
--puzzle-runtime-surface-fill: rgba(255, 255, 255, 0.76); --puzzle-runtime-surface-fill: rgba(255, 253, 250, 0.76);
--puzzle-runtime-surface-fill-strong: rgba(255, 255, 255, 0.9); --puzzle-runtime-surface-fill-strong: rgba(255, 253, 250, 0.9);
--puzzle-runtime-surface-border: rgba(232, 191, 205, 0.48); --puzzle-runtime-surface-border: rgba(226, 203, 184, 0.48);
--puzzle-runtime-board-fill: rgba(255, 255, 255, 0.68); --puzzle-runtime-board-fill: rgba(255, 253, 250, 0.68);
--puzzle-runtime-board-border: rgba(255, 126, 154, 0.28); --puzzle-runtime-board-border: rgba(204, 117, 76, 0.28);
--puzzle-runtime-board-shadow: 0 30px 80px rgba(215, 87, 134, 0.14); --puzzle-runtime-board-shadow: 0 30px 80px rgba(112, 57, 30, 0.14);
--puzzle-runtime-piece-fill: rgba(255, 255, 255, 0.74); --puzzle-runtime-piece-fill: rgba(255, 253, 250, 0.74);
--puzzle-runtime-piece-border: transparent; --puzzle-runtime-piece-border: transparent;
--puzzle-runtime-piece-empty-fill: rgba(255, 228, 236, 0.34); --puzzle-runtime-piece-empty-fill: rgba(238, 208, 183, 0.34);
--puzzle-runtime-piece-empty-text: rgba(92, 70, 80, 0.38); --puzzle-runtime-piece-empty-text: rgba(111, 88, 72, 0.4);
--puzzle-runtime-piece-selected-fill: linear-gradient( --puzzle-runtime-piece-selected-fill: linear-gradient(
135deg, 135deg,
#ff4f8b, #df7f40,
#ff8a73 #b95d3a
); );
--puzzle-runtime-piece-selected-text: #fff7fb; --puzzle-runtime-piece-selected-text: #fffaf5;
--puzzle-runtime-piece-selected-border: transparent; --puzzle-runtime-piece-selected-border: transparent;
--puzzle-runtime-next-card-overlay: rgba(61, 24, 38, 0.06); --puzzle-runtime-next-card-overlay: rgba(74, 34, 15, 0.06);
--puzzle-runtime-control-fill: rgba(255, 255, 255, 0.72); --puzzle-runtime-control-fill: rgba(255, 253, 250, 0.72);
--puzzle-runtime-control-hover-fill: rgba(255, 91, 132, 0.1); --puzzle-runtime-control-hover-fill: rgba(204, 117, 76, 0.1);
--puzzle-runtime-primary-fill: var(--platform-button-primary-fill); --puzzle-runtime-primary-fill: var(--platform-button-primary-fill);
--puzzle-runtime-primary-text: var(--platform-button-primary-text); --puzzle-runtime-primary-text: var(--platform-button-primary-text);
--puzzle-runtime-primary-shadow: var(--platform-profile-action-shadow); --puzzle-runtime-primary-shadow: var(--platform-profile-action-shadow);
--puzzle-runtime-accent-text: var(--platform-cool-text); --puzzle-runtime-accent-text: var(--platform-cool-text);
--puzzle-runtime-cool-text: #0f8fa9; --puzzle-runtime-cool-text: #6e8d42;
--puzzle-runtime-danger-fill: rgba(255, 228, 233, 0.9); --puzzle-runtime-danger-fill: rgba(255, 237, 229, 0.9);
--puzzle-runtime-danger-text: #c2415d; --puzzle-runtime-danger-text: #a6402f;
--puzzle-runtime-backdrop-fill: rgba(43, 20, 32, 0.34); --puzzle-runtime-backdrop-fill: rgba(61, 31, 16, 0.34);
--puzzle-runtime-dialog-fill: radial-gradient( --puzzle-runtime-dialog-fill: radial-gradient(
circle at 12% 0%, circle at 12% 0%,
rgba(255, 91, 132, 0.18), rgba(204, 117, 76, 0.18),
transparent 36% transparent 36%
), ),
linear-gradient( linear-gradient(
180deg, 180deg,
rgba(255, 255, 255, 0.98), rgba(255, 254, 252, 0.98),
rgba(255, 246, 249, 0.95) rgba(250, 243, 236, 0.95)
); );
--puzzle-runtime-dialog-border: rgba(255, 126, 154, 0.3); --puzzle-runtime-dialog-border: rgba(204, 117, 76, 0.3);
--puzzle-runtime-table-fill: rgba(255, 255, 255, 0.62); --puzzle-runtime-table-fill: rgba(255, 253, 250, 0.62);
--puzzle-runtime-table-row-fill: rgba(255, 91, 132, 0.12); --puzzle-runtime-table-row-fill: rgba(204, 117, 76, 0.12);
--puzzle-runtime-next-card-fill: rgba(255, 255, 255, 0.66); --puzzle-runtime-next-card-fill: rgba(255, 253, 250, 0.66);
--puzzle-runtime-next-card-hover-fill: rgba(255, 91, 132, 0.1); --puzzle-runtime-next-card-hover-fill: rgba(204, 117, 76, 0.1);
} }
.platform-theme--dark { .platform-theme--dark {
color-scheme: dark; color-scheme: dark;
--platform-accent: #5b6cff;
--platform-body-fill: radial-gradient( --platform-body-fill: radial-gradient(
circle at top, circle at top,
rgba(129, 140, 248, 0.2), rgba(129, 140, 248, 0.2),
@@ -797,6 +802,7 @@ body {
--platform-text-strong: #ffffff; --platform-text-strong: #ffffff;
--platform-text-base: rgb(228 228 231); --platform-text-base: rgb(228 228 231);
--platform-text-soft: rgb(161 161 170); --platform-text-soft: rgb(161 161 170);
--platform-text-muted: rgb(161 161 170);
--platform-brand-logo-title: #fff7dc; --platform-brand-logo-title: #fff7dc;
--platform-brand-logo-subtitle: #9fe7ff; --platform-brand-logo-subtitle: #9fe7ff;
--platform-brand-logo-shadow: #040814; --platform-brand-logo-shadow: #040814;
@@ -813,6 +819,7 @@ body {
--platform-neutral-bg: rgba(255, 255, 255, 0.05); --platform-neutral-bg: rgba(255, 255, 255, 0.05);
--platform-neutral-text: rgb(228 228 231); --platform-neutral-text: rgb(228 228 231);
--platform-button-primary-border: rgba(129, 140, 248, 0.3); --platform-button-primary-border: rgba(129, 140, 248, 0.3);
--platform-button-primary-solid: #5b6cff;
--platform-button-primary-fill: linear-gradient(135deg, #5b6cff, #3dd9ff); --platform-button-primary-fill: linear-gradient(135deg, #5b6cff, #3dd9ff);
--platform-button-primary-text: rgb(238 248 255); --platform-button-primary-text: rgb(238 248 255);
--platform-button-secondary-fill: rgba(255, 255, 255, 0.05); --platform-button-secondary-fill: rgba(255, 255, 255, 0.05);
@@ -907,6 +914,7 @@ body {
--platform-profile-chip-hover-fill: rgba(255, 255, 255, 0.14); --platform-profile-chip-hover-fill: rgba(255, 255, 255, 0.14);
--platform-profile-chip-text: rgb(228 228 231); --platform-profile-chip-text: rgb(228 228 231);
--platform-profile-action-fill: linear-gradient(135deg, #5b6cff, #3dd9ff); --platform-profile-action-fill: linear-gradient(135deg, #5b6cff, #3dd9ff);
--platform-profile-action-solid: #5b6cff;
--platform-profile-action-text: rgb(238 248 255); --platform-profile-action-text: rgb(238 248 255);
--platform-profile-action-shadow: 0 14px 32px rgba(91, 108, 255, 0.22); --platform-profile-action-shadow: 0 14px 32px rgba(91, 108, 255, 0.22);
--platform-card-overlay-soft: linear-gradient( --platform-card-overlay-soft: linear-gradient(
@@ -1748,9 +1756,9 @@ html[data-mobile-keyboard-open='true'] .platform-mobile-bottom-dock {
} }
.platform-pill--rose { .platform-pill--rose {
border-color: rgba(251, 113, 133, 0.2); border-color: var(--platform-button-danger-border);
background: rgba(244, 63, 94, 0.1); background: var(--platform-button-danger-fill);
color: rgb(255 228 230); color: var(--platform-button-danger-text);
} }
.platform-pill--success { .platform-pill--success {
@@ -1872,7 +1880,7 @@ html[data-mobile-keyboard-open='true'] .platform-mobile-bottom-dock {
} }
.creation-work-card__swipe-button--danger { .creation-work-card__swipe-button--danger {
background: linear-gradient(180deg, #fb7185, #e11d48); background: linear-gradient(180deg, #c7653d, #8f3f27);
} }
.creation-work-card__swipe-button:disabled { .creation-work-card__swipe-button:disabled {
@@ -2087,7 +2095,7 @@ html[data-mobile-keyboard-open='true'] .platform-mobile-bottom-dock {
width: 0.6rem; width: 0.6rem;
height: 0.6rem; height: 0.6rem;
border-radius: 9999px; border-radius: 9999px;
background: #ef4444; background: #b64a35;
box-shadow: box-shadow:
0 0 0 3px rgba(255, 255, 255, 0.26), 0 0 0 3px rgba(255, 255, 255, 0.26),
0 0 12px rgba(239, 68, 68, 0.68); 0 0 12px rgba(239, 68, 68, 0.68);
@@ -2129,7 +2137,7 @@ html[data-mobile-keyboard-open='true'] .platform-mobile-bottom-dock {
} }
.creation-work-card-stat--like { .creation-work-card-stat--like {
--creation-work-stat-accent: #ff6b6b; --creation-work-stat-accent: #b64a35;
} }
.creation-work-card-stat__label { .creation-work-card-stat__label {
@@ -2177,7 +2185,7 @@ html[data-mobile-keyboard-open='true'] .platform-mobile-bottom-dock {
display: inline-flex; display: inline-flex;
align-items: center; align-items: center;
gap: 0.08rem; gap: 0.08rem;
color: #ef233c; color: #b64a35;
font-size: 0.54rem; font-size: 0.54rem;
font-weight: 900; font-weight: 900;
line-height: 1; line-height: 1;
@@ -2334,7 +2342,7 @@ html[data-mobile-keyboard-open='true'] .platform-mobile-bottom-dock {
border-color: var(--platform-button-primary-border); border-color: var(--platform-button-primary-border);
background: var(--platform-button-primary-fill); background: var(--platform-button-primary-fill);
color: var(--platform-button-primary-text); color: var(--platform-button-primary-text);
box-shadow: 0 16px 34px rgba(255, 91, 132, 0.18); box-shadow: 0 16px 34px rgba(182, 98, 63, 0.18);
} }
.platform-button--secondary { .platform-button--secondary {
@@ -2409,7 +2417,7 @@ html[data-mobile-keyboard-open='true'] .platform-mobile-bottom-dock {
border-color: var(--platform-button-primary-border); border-color: var(--platform-button-primary-border);
background: var(--platform-button-primary-fill); background: var(--platform-button-primary-fill);
color: var(--platform-button-primary-text); color: var(--platform-button-primary-text);
box-shadow: 0 12px 26px rgba(255, 91, 132, 0.16); box-shadow: 0 12px 26px rgba(182, 98, 63, 0.16);
} }
.platform-close-confirm-dialog__button--secondary { .platform-close-confirm-dialog__button--secondary {
@@ -2567,7 +2575,7 @@ html[data-mobile-keyboard-open='true'] .platform-mobile-bottom-dock {
width: 0.48rem; width: 0.48rem;
height: 0.48rem; height: 0.48rem;
border-radius: 9999px; border-radius: 9999px;
background: #ef4444; background: #b64a35;
box-shadow: box-shadow:
0 0 0 2px rgba(255, 255, 255, 0.28), 0 0 0 2px rgba(255, 255, 255, 0.28),
0 0 12px rgba(239, 68, 68, 0.72); 0 0 12px rgba(239, 68, 68, 0.72);
@@ -5440,9 +5448,9 @@ html[data-mobile-keyboard-open='true'] .platform-mobile-bottom-dock {
} }
.platform-banner--danger { .platform-banner--danger {
border-color: rgba(251, 113, 133, 0.2); border-color: var(--platform-button-danger-border);
background: rgba(244, 63, 94, 0.1); background: var(--platform-button-danger-fill);
color: #c2415d; color: #a6402f;
} }
.platform-progress-track { .platform-progress-track {
@@ -5492,7 +5500,7 @@ html[data-mobile-keyboard-open='true'] .platform-mobile-bottom-dock {
rgba(255, 138, 115, 0.22), rgba(255, 138, 115, 0.22),
transparent 34% transparent 34%
), ),
linear-gradient(135deg, #fff9fb 0%, #ffe8f0 48%, #ffdacf 100%); linear-gradient(135deg, #fffdf9 0%, #f4e5d7 48%, #eaccb3 100%);
} }
.platform-theme--light .platform-theme--light
@@ -6060,14 +6068,14 @@ html[data-mobile-keyboard-open='true'] .platform-mobile-bottom-dock {
border-color: var(--platform-surface-border) !important; border-color: var(--platform-surface-border) !important;
background: radial-gradient( background: radial-gradient(
circle at top left, circle at top left,
rgba(255, 204, 219, 0.34), rgba(240, 203, 169, 0.34),
transparent 34% transparent 34%
), ),
linear-gradient(135deg, rgba(255, 255, 255, 0.96), rgba(255, 248, 250, 0.9)) !important; linear-gradient(135deg, rgba(255, 255, 255, 0.96), rgba(250, 243, 236, 0.9)) !important;
color: var(--platform-text-strong) !important; color: var(--platform-text-strong) !important;
box-shadow: box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.84), inset 0 1px 0 rgba(255, 255, 255, 0.84),
0 18px 42px rgba(222, 82, 124, 0.1); 0 18px 42px rgba(112, 57, 30, 0.1);
} }
.platform-theme--light .platform-theme--light
@@ -6106,18 +6114,18 @@ html[data-mobile-keyboard-open='true'] .platform-mobile-bottom-dock {
border-color: var(--platform-button-primary-border) !important; border-color: var(--platform-button-primary-border) !important;
background: var(--platform-button-primary-fill) !important; background: var(--platform-button-primary-fill) !important;
color: var(--platform-button-primary-text) !important; color: var(--platform-button-primary-text) !important;
box-shadow: 0 12px 26px rgba(255, 91, 132, 0.16); box-shadow: 0 12px 26px rgba(182, 98, 63, 0.16);
} }
.platform-theme--light .map-modal-overlay { .platform-theme--light .map-modal-overlay {
background: rgba(73, 45, 56, 0.24) !important; background: rgba(74, 34, 15, 0.24) !important;
} }
.platform-theme--light .map-modal-shell { .platform-theme--light .map-modal-shell {
background: var(--platform-modal-fill); background: var(--platform-modal-fill);
box-shadow: box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.78), inset 0 1px 0 rgba(255, 255, 255, 0.78),
0 24px 70px rgba(131, 77, 98, 0.2) !important; 0 24px 70px rgba(112, 57, 30, 0.2) !important;
} }
.platform-theme--light .map-modal-backdrop { .platform-theme--light .map-modal-backdrop {
@@ -6129,7 +6137,7 @@ html[data-mobile-keyboard-open='true'] .platform-mobile-bottom-dock {
background: linear-gradient( background: linear-gradient(
180deg, 180deg,
rgba(255, 255, 255, 0.7), rgba(255, 255, 255, 0.7),
rgba(255, 247, 250, 0.88) rgba(250, 243, 236, 0.88)
) !important; ) !important;
} }
@@ -6146,7 +6154,7 @@ html[data-mobile-keyboard-open='true'] .platform-mobile-bottom-dock {
} }
.platform-theme--light .map-modal-shell svg line { .platform-theme--light .map-modal-shell svg line {
stroke: rgba(217, 53, 112, 0.32); stroke: rgba(199, 101, 61, 0.32);
} }
button { button {
@@ -7045,23 +7053,23 @@ button {
border: 1px solid border: 1px solid
color-mix( color-mix(
in srgb, in srgb,
var(--platform-work-like-accent, #ff6b6b) 24%, var(--platform-work-like-accent, #c7653d) 24%,
transparent transparent
); );
border-radius: 1rem; border-radius: 1rem;
background: color-mix( background: color-mix(
in srgb, in srgb,
var(--platform-work-like-accent, #ff6b6b) 10%, var(--platform-work-like-accent, #c7653d) 10%,
var(--platform-panel-fill) 90% var(--platform-panel-fill) 90%
); );
color: var(--platform-work-like-accent, #ff6b6b); color: var(--platform-work-like-accent, #c7653d);
padding: 0.6rem 0.75rem; padding: 0.6rem 0.75rem;
font-size: 0.8125rem; font-size: 0.8125rem;
font-weight: 900; font-weight: 900;
box-shadow: 0 0.55rem 1.2rem box-shadow: 0 0.55rem 1.2rem
color-mix( color-mix(
in srgb, in srgb,
var(--platform-work-like-accent, #ff6b6b) 10%, var(--platform-work-like-accent, #c7653d) 10%,
transparent transparent
); );
} }
@@ -7080,7 +7088,7 @@ button {
} }
.platform-work-detail__stat { .platform-work-detail__stat {
--platform-work-stat-accent: #ff4f8b; --platform-work-stat-accent: #c7653d;
position: relative; position: relative;
min-width: 0; min-width: 0;
overflow: hidden; overflow: hidden;
@@ -7103,7 +7111,7 @@ button {
} }
.platform-work-detail__stat--like { .platform-work-detail__stat--like {
--platform-work-stat-accent: #ff6b6b; --platform-work-stat-accent: #b64a35;
} }
.platform-work-detail__stat--time { .platform-work-detail__stat--time {