retire the last light-theme branches and fix three latent color bugs

Dark is now the only theme, so every `.dark` selector matched
unconditionally while each non-dark branch was unreachable. That left
fourteen `.dark &` blocks sitting on top of token-based base rules and
silently overriding them with hardcoded grays from the previous palette
(#333333, #999999, #cccccc, #f2f2f2, #1f1f1f, #2a2a2a). Merged each value
down into its base rule and deleted the wrapper, then replaced fifteen
more legacy grays with the CYBER tokens.

Three bugs surfaced along the way:

- FileEditor read `documentElement.classList.contains('dark')`, but the
  `dark` class is bound on `.app-root`, so Monaco always loaded the
  light `vs` theme inside the dark editor surface.
- CodexLoginModal, CopilotLoginModal and NousLoginModal wrote
  `border-color: var(--arcoblue-6, #165dff)` and VoiceApiFormModal wrote
  `color: var(--primary-6, #18a058)`. Those Arco variables hold bare
  RGB triplets, not colors, so each declaration was invalid and
  discarded — the hover border and link color stayed stock Arco
  blue/green instead of the cyan accent.
- JourneyView drew the pinned-node ring in amber, a leftover from the
  old palette.

Rendering-layer only: no store logic, no /chat-run payload, no message
rendering path.
This commit is contained in:
2026-10-19 14:56:23 +08:00
parent f4f45304a6
commit 3debe903f7
26 changed files with 136 additions and 216 deletions
@@ -0,0 +1,61 @@
---
date: 2026-10-19
pr: pending
feature: CYBER theme - chat chain restyled onto the single dark token set
impact: Rendering-layer only. Every chat-chain style block is moved onto the CYBER dark tokens, all `.dark` override branches are deleted because dark is now the only theme, and two latent bugs are fixed as a side effect (Monaco loaded the light `vs` theme; four Arco RGB-triplet variables were used as colors and silently fell back). No chat store logic, no `/chat-run` payload, and no message rendering path is touched.
---
# CYBER theme — chat chain
The chat chain was restyled onto the token set in `packages/client/src/styles/variables.scss`.
The theme is a single dark palette: `useTheme()` pins `isDark` to `true` and the brightness
switcher was removed, so any `.dark` selector now always matches and any non-`.dark` branch
is unreachable.
## Why chat-chain files changed
Fifteen files under the chat chain were caught by the restyle. None of the changes touch logic.
### Deleting `.dark` branches
Because `.dark` is unconditionally present, every `.dark &` block was an unconditional
override sitting on top of a token-based base rule — and each one carried a hardcoded gray
from the previous theme. The value was merged down into the base rule and the wrapper
deleted. Fourteen blocks across ten files were affected, including three that pinned
`background-color: #333333` (a neutral gray that fought the blue-black CYBER palette) and
one that set the thinking-shimmer sweep band to white.
### `#999999` / `#cccccc` / `#f2f2f2` / `#1f1f1f` / `#2a2a2a`
Fifteen hardcoded legacy grays in `MessageItem.vue`, `MessageList.vue`, `ChatInput.vue`,
`GroupMessageItem.vue` and `VirtualMessageList.vue` were rewritten to `--text-faint`,
`--text-secondary`, `--bg-card` and `rgba(var(--text-primary-rgb), …)`.
### Latent bugs fixed
- **`files/FileEditor.vue`** picked the Monaco theme with
`document.documentElement.classList.contains('dark')`. The `dark` class is bound on
`.app-root` in `App.vue`, not on `<html>`, so the check was always false and Monaco
always loaded the **light** `vs` theme inside the dark editor surface. Pinned to
`vs-dark`.
- **Arco RGB triplets used as colors.** `CodexLoginModal.vue`, `CopilotLoginModal.vue` and
`NousLoginModal.vue` wrote `border-color: var(--arcoblue-6, #165dff)` and
`VoiceApiFormModal.vue` wrote `color: var(--primary-6, #18a058)`. Those variables hold
bare triplets (`22,93,255`), not colors, so each declaration was invalid and silently
discarded — the hover border and link color fell back to the stock Arco blue/green rather
than the CYBER accent. Rewritten to `--accent-primary`.
- **`JourneyView.vue`** drew the pinned-node ring in `rgba(255, 190, 90, 0.85)`, an amber
left over from the previous palette. Now uses the cyan edge palette like every other
stroke in that canvas.
## Verification
`grep -rn "\.dark" packages/client/src` returns no style-block matches. A token-reference
scan comparing every `var(--x)` against the definitions in `variables.scss`, `global.scss`
and `arco.css` reports only locally-defined per-component variables.
## Behavior impact
Rendering-layer only. No chat store logic, no `/chat-run` payload, and no message rendering
path was touched. The voice overlay, transcript controls, and the thinking indicator keep
their existing markup and event wiring; only their colors and shadows changed.
@@ -1355,10 +1355,6 @@ function isImage(type: string): boolean {
border-top: 0; border-top: 0;
background-color: $bg-card; background-color: $bg-card;
flex-shrink: 0; flex-shrink: 0;
.dark & {
background-color: #333333;
}
} }
.input-top-bar { .input-top-bar {
@@ -1383,7 +1379,7 @@ function isImage(type: string): boolean {
justify-content: center; justify-content: center;
width: 16px; width: 16px;
height: 16px; height: 16px;
color: #999999; color: $text-faint;
font-size: 12px; font-size: 12px;
svg { svg {
@@ -1401,7 +1397,7 @@ function isImage(type: string): boolean {
display: inline-flex; display: inline-flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
color: #999999; color: $text-faint;
width: 24px; width: 24px;
min-width: 24px; min-width: 24px;
height: 22px; height: 22px;
@@ -1418,12 +1414,12 @@ function isImage(type: string): boolean {
} }
&.active { &.active {
color: #999999; color: $text-faint;
opacity: 1; opacity: 1;
} }
&:hover { &:hover {
color: #999999; color: $text-faint;
opacity: 1; opacity: 1;
} }
} }
@@ -1497,24 +1493,25 @@ function isImage(type: string): boolean {
.context-info { .context-info {
font-size: 11px; font-size: 11px;
color: $text-muted; color: $text-secondary;
min-width: 0; min-width: 0;
white-space: nowrap; white-space: nowrap;
&.context-warning { &.context-warning {
color: #e8a735; color: var(--warning);
} }
} }
.context-limit-editable { .context-limit-editable {
cursor: pointer; cursor: pointer;
color: $text-secondary;
border-bottom: 1px dashed transparent; border-bottom: 1px dashed transparent;
transition: all 0.2s ease; transition: all 0.2s ease;
padding: 0 2px; padding: 0 2px;
&:hover { &:hover {
border-bottom-color: $text-muted; border-bottom-color: rgba(var(--text-primary-rgb), 0.58);
background: rgba(128, 128, 128, 0.1); background: rgba(var(--text-primary-rgb), 0.08);
border-radius: 2px; border-radius: 2px;
} }
} }
@@ -1523,56 +1520,23 @@ function isImage(type: string): boolean {
width: 60px; width: 60px;
height: 4px; height: 4px;
margin-left: -4px; margin-left: -4px;
background: rgba(128, 128, 128, 0.2); background: rgba(var(--text-primary-rgb), 0.18);
border-radius: 2px; border-radius: 2px;
overflow: hidden; overflow: hidden;
} }
.context-bar-fill { .context-bar-fill {
height: 100%; height: 100%;
background: linear-gradient(90deg, rgba(128, 128, 128, 0.3), rgba(128, 128, 128, 0.6)); background: linear-gradient(90deg, rgba(var(--text-primary-rgb), 0.42), rgba(var(--text-primary-rgb), 0.72));
border-radius: 2px; border-radius: 2px;
transition: width 0.3s ease; transition: width 0.3s ease;
&.context-bar-warn { &.context-bar-warn {
background: linear-gradient(90deg, #c98a1a, #e8a735); background: linear-gradient(90deg, rgba(var(--warning-rgb), 0.55), var(--warning));
} }
&.context-bar-danger { &.context-bar-danger {
background: linear-gradient(90deg, #c43a2a, #e85d4a); background: linear-gradient(90deg, rgba(var(--error-rgb), 0.55), var(--error));
}
}
.dark .context-info {
color: rgba(255, 255, 255, 0.68);
&.context-warning {
color: #f0bc58;
}
}
.dark .context-limit-editable {
color: rgba(255, 255, 255, 0.8);
&:hover {
border-bottom-color: rgba(255, 255, 255, 0.58);
background: rgba(255, 255, 255, 0.08);
}
}
.dark .context-bar {
background: rgba(255, 255, 255, 0.18);
}
.dark .context-bar-fill {
background: linear-gradient(90deg, rgba(255, 255, 255, 0.42), rgba(255, 255, 255, 0.72));
&.context-bar-warn {
background: linear-gradient(90deg, #d99d35, #f0bc58);
}
&.context-bar-danger {
background: linear-gradient(90deg, #d95445, #ff7a68);
} }
} }
@@ -1715,7 +1679,7 @@ function isImage(type: string): boolean {
padding: 22px 12px 9px; padding: 22px 12px 9px;
position: relative; position: relative;
cursor: text; cursor: text;
box-shadow: 0 8px 28px rgba(0, 0, 0, 0.08); box-shadow: 0 8px 28px rgba(0, 0, 0, 0.32);
transition: border-color $transition-fast, box-shadow $transition-fast; transition: border-color $transition-fast, box-shadow $transition-fast;
&:focus-within { &:focus-within {
@@ -1727,11 +1691,6 @@ function isImage(type: string): boolean {
border-color: $accent-primary; border-color: $accent-primary;
background-color: rgba(var(--accent-primary-rgb), 0.04); background-color: rgba(var(--accent-primary-rgb), 0.04);
} }
.dark & {
background-color: #333333;
box-shadow: 0 8px 28px rgba(0, 0, 0, 0.32);
}
} }
.resize-handle { .resize-handle {
@@ -1838,16 +1797,12 @@ function isImage(type: string): boolean {
bottom: calc(100% + 8px); bottom: calc(100% + 8px);
max-height: 240px; max-height: 240px;
overflow-y: auto; overflow-y: auto;
background: $bg-primary; background: $bg-card;
border: 1px solid $border-color; border: 1px solid $border-color;
border-radius: $radius-sm; border-radius: $radius-sm;
box-shadow: 0 10px 28px rgba(0, 0, 0, 0.16); box-shadow: 0 10px 28px rgba(0, 0, 0, 0.16);
z-index: 20; z-index: 20;
padding: 4px; padding: 4px;
.dark & {
background: #2a2a2a;
}
} }
.slash-command-item { .slash-command-item {
@@ -278,15 +278,10 @@ defineExpose({
.history-loader-spinner { .history-loader-spinner {
width: 14px; width: 14px;
height: 14px; height: 14px;
border: 2px solid rgba(0, 0, 0, 0.16); border: 2px solid rgba(var(--text-primary-rgb), 0.18);
border-top-color: $accent-primary; border-top-color: $accent-primary;
border-radius: 50%; border-radius: 50%;
animation: spin 0.7s linear infinite; animation: spin 0.7s linear infinite;
.dark & {
border-color: rgba(255, 255, 255, 0.18);
border-top-color: $accent-primary;
}
} }
.scroll-bottom-button { .scroll-bottom-button {
@@ -606,8 +606,8 @@ async function previewTextFile(path: string, fileName: string): Promise<void> {
align-items: center; align-items: center;
gap: 8px; gap: 8px;
padding: 8px 12px; padding: 8px 12px;
background: rgba(0, 0, 0, 0.85); background: rgba(var(--bg-card-rgb), 0.92);
color: #fff; color: var(--text-primary);
font-size: 12px; font-size: 12px;
.att-name { .att-name {
@@ -1698,20 +1698,12 @@ onBeforeUnmount(() => {
cursor: pointer; cursor: pointer;
border-radius: $radius-sm; border-radius: $radius-sm;
padding: 0; padding: 0;
color: var(--text-faint);
transition: color 0.15s ease, background 0.15s ease; transition: color 0.15s ease, background 0.15s ease;
&:hover { &:hover {
color: $text-secondary; color: $text-secondary;
background: rgba(0, 0, 0, 0.06); background: rgba(var(--text-primary-rgb), 0.1);
}
.dark & {
color: #999999;
&:hover {
color: #cccccc;
background: rgba(255, 255, 255, 0.1);
}
} }
} }
@@ -1738,12 +1730,8 @@ onBeforeUnmount(() => {
.message-time { .message-time {
font-size: 11px; font-size: 11px;
color: $text-muted; color: var(--text-faint);
user-select: none; user-select: none;
.dark & {
color: #999999;
}
} }
.tool-line { .tool-line {
@@ -1876,12 +1864,6 @@ onBeforeUnmount(() => {
gap: 10px; gap: 10px;
padding: 12px 14px; padding: 12px 14px;
width: 100%; width: 100%;
.dark & {
background: #1f1f1f;
border-color: rgba(255, 255, 255, 0.14);
color: #f2f2f2;
}
} }
.tool-change-card-header { .tool-change-card-header {
@@ -1952,22 +1934,11 @@ onBeforeUnmount(() => {
&:hover, &:hover,
&.selected { &.selected {
.tool-change-file-name { .tool-change-file-name {
color: $text-primary; color: var(--accent-primary);
text-decoration: underline; text-decoration: underline;
text-underline-offset: 3px; text-underline-offset: 3px;
} }
} }
.dark & {
color: #f2f2f2;
&:hover,
&.selected {
.tool-change-file-name {
color: #ffffff;
}
}
}
} }
.tool-change-file-main { .tool-change-file-main {
@@ -986,10 +986,6 @@ defineExpose({
border: 1px solid $border-color; border: 1px solid $border-color;
border-radius: 11px; border-radius: 11px;
padding: 8px 10px; padding: 8px 10px;
.dark & {
background: rgba(255, 255, 255, 0.08);
}
} }
.approval-float-actions { .approval-float-actions {
@@ -1078,10 +1074,6 @@ defineExpose({
border-radius: 11px; border-radius: 11px;
background: rgba(var(--bg-card-rgb), 0.68); background: rgba(var(--bg-card-rgb), 0.68);
color: $text-primary; color: $text-primary;
.dark & {
background: rgba(255, 255, 255, 0.08);
}
} }
.queue-index { .queue-index {
@@ -1258,15 +1250,10 @@ defineExpose({
.history-loader-spinner { .history-loader-spinner {
width: 14px; width: 14px;
height: 14px; height: 14px;
border: 2px solid rgba(0, 0, 0, 0.16); border: 2px solid rgba(var(--text-primary-rgb), 0.18);
border-top-color: $accent-primary; border-top-color: $accent-primary;
border-radius: 50%; border-radius: 50%;
animation: spin 0.7s linear infinite; animation: spin 0.7s linear infinite;
.dark & {
border-color: rgba(255, 255, 255, 0.18);
border-top-color: $accent-primary;
}
} }
.history-archive-link-wrap { .history-archive-link-wrap {
@@ -1418,10 +1405,7 @@ defineExpose({
border-radius: $radius-md; border-radius: $radius-md;
object-fit: cover; object-fit: cover;
flex-shrink: 0; flex-shrink: 0;
.dark & {
filter: brightness(1.18) contrast(1.08) saturate(1.08); filter: brightness(1.18) contrast(1.08) saturate(1.08);
}
} }
.thinking-status-copy { .thinking-status-copy {
@@ -1438,7 +1422,8 @@ defineExpose({
display: inline-flex; display: inline-flex;
align-items: center; align-items: center;
color: transparent; color: transparent;
background: linear-gradient(105deg, $text-secondary 0%, $text-secondary 39%, #ffffff 48%, #ffffff 52%, $text-secondary 61%, $text-secondary 100%); // 扫光带用霓虹青,底色用正文灰——CYBER 的高光是青色而不是白色。
background: linear-gradient(105deg, $text-secondary 0%, $text-secondary 37%, var(--accent-primary) 47%, var(--accent-primary) 53%, $text-secondary 63%, $text-secondary 100%);
background-size: 300% 100%; background-size: 300% 100%;
background-position: 0% 0; background-position: 0% 0;
-webkit-background-clip: text; -webkit-background-clip: text;
@@ -1451,15 +1436,7 @@ defineExpose({
contain: paint; contain: paint;
transform: translateZ(0); transform: translateZ(0);
will-change: background-position; will-change: background-position;
filter: drop-shadow(0 0 5px rgba(var(--accent-primary-rgb), 0.2));
.dark & {
background: linear-gradient(105deg, #f0f0f0 0%, #f0f0f0 37%, #2f3540 47%, #2f3540 53%, #f0f0f0 63%, #f0f0f0 100%);
background-size: 300% 100%;
background-position: 0% 0;
-webkit-background-clip: text;
background-clip: text;
filter: drop-shadow(0 0 5px rgba(255, 255, 255, 0.16));
}
} }
.thinking-status-time { .thinking-status-time {
@@ -1510,13 +1487,9 @@ defineExpose({
font-size: 11px; font-size: 11px;
color: $text-secondary; color: $text-secondary;
padding: 3px 8px; padding: 3px 8px;
background: rgba(0, 0, 0, 0.03); background: rgba(var(--text-primary-rgb), 0.06);
border-radius: $radius-sm; border-radius: $radius-sm;
.dark & {
background: rgba(255, 255, 255, 0.06);
}
&.compression-item { &.compression-item {
color: $text-muted; color: $text-muted;
font-size: 10px; font-size: 10px;
@@ -209,7 +209,7 @@ function scrollToTarget(item: OutlineItem) {
} }
.user-question { .user-question {
background-color: $bg-secondary; background-color: $bg-input;
color: $text-primary; color: $text-primary;
padding: 8px 12px; padding: 8px 12px;
border-radius: 8px; border-radius: 8px;
@@ -217,10 +217,6 @@ function scrollToTarget(item: OutlineItem) {
align-items: flex-start; align-items: flex-start;
gap: 6px; gap: 6px;
.dark & {
background-color: $bg-input;
}
.q-label { .q-label {
font-weight: 600; font-weight: 600;
flex-shrink: 0; flex-shrink: 0;
@@ -258,11 +254,7 @@ function scrollToTarget(item: OutlineItem) {
transition: background-color 0.15s ease; transition: background-color 0.15s ease;
&:hover { &:hover {
background-color: rgba(0, 0, 0, 0.04); background-color: rgba(var(--text-primary-rgb), 0.06);
.dark & {
background-color: rgba(255, 255, 255, 0.06);
}
} }
.level-1 & { .level-1 & {
@@ -189,12 +189,12 @@ onUnmounted(() => {
padding: 8px 10px; padding: 8px 10px;
border: none; border: none;
background: none; background: none;
border-radius: var(--radius-sm); border-radius: $radius-sm;
cursor: pointer; cursor: pointer;
text-align: left; text-align: left;
text-decoration: none; text-decoration: none;
color: var(--text-secondary); color: var(--text-secondary);
transition: all var(--transition-fast); transition: all $transition-fast;
margin-bottom: 2px; margin-bottom: 2px;
} }
@@ -312,7 +312,7 @@ onUnmounted(() => {
color: var(--text-muted); color: var(--text-muted);
cursor: pointer; cursor: pointer;
border-radius: 3px; border-radius: 3px;
transition: all var(--transition-fast); transition: all $transition-fast;
} }
.session-item-delete:hover { .session-item-delete:hover {
@@ -535,10 +535,6 @@ defineExpose({
padding: var(--virtual-list-padding); padding: var(--virtual-list-padding);
box-sizing: border-box; box-sizing: border-box;
background-color: $bg-card; background-color: $bg-card;
.dark & {
background-color: #333333;
}
} }
.virtual-row { .virtual-row {
@@ -143,7 +143,7 @@ function cancel() {
appearance: none; appearance: none;
border: 0; border: 0;
font: inherit; font: inherit;
color: var(--text-color-3, #999999); color: var(--text-faint);
background: transparent; background: transparent;
cursor: pointer; cursor: pointer;
transition: background-color 0.15s ease, color 0.15s ease, opacity 0.15s ease; transition: background-color 0.15s ease, color 0.15s ease, opacity 0.15s ease;
@@ -161,22 +161,22 @@ function cancel() {
} }
.voice-dialogue-controls__toggle:hover { .voice-dialogue-controls__toggle:hover {
color: var(--text-color-2, currentColor); color: var(--text-secondary);
background: rgba(128, 128, 128, 0.12); background: rgba(var(--text-muted-rgb), 0.12);
} }
.voice-dialogue-controls__toggle:focus-visible { .voice-dialogue-controls__toggle:focus-visible {
outline: 2px solid var(--primary-color, #18a058); outline: 2px solid var(--accent-primary);
outline-offset: 2px; outline-offset: 2px;
} }
.voice-dialogue-controls__toggle.active { .voice-dialogue-controls__toggle.active {
color: var(--error-color, #d03050); color: var(--error);
background: rgba(208, 48, 80, 0.12); background: rgba(var(--error-rgb), 0.12);
} }
.voice-dialogue-controls__toggle.active:hover { .voice-dialogue-controls__toggle.active:hover {
background: rgba(208, 48, 80, 0.18); background: rgba(var(--error-rgb), 0.18);
} }
.voice-dialogue-controls__icon { .voice-dialogue-controls__icon {
@@ -204,7 +204,7 @@ function cancel() {
} }
.voice-dialogue-controls__cancel:hover { .voice-dialogue-controls__cancel:hover {
color: var(--text-color-2, currentColor); color: var(--text-secondary);
background: rgba(128, 128, 128, 0.12); background: rgba(var(--text-muted-rgb), 0.12);
} }
</style> </style>
@@ -73,10 +73,10 @@ const recentEventTypes = computed(() => props.events.slice(-5).map(event => even
min-width: 12rem; min-width: 12rem;
padding: 0.5rem 0.75rem; padding: 0.5rem 0.75rem;
color: var(--text-primary); color: var(--text-primary);
border: 1px solid rgba(var(--text-primary-rgb), 0.12); border: 1px solid var(--border-light);
border-radius: 0.75rem; border-radius: 0.75rem;
background: var(--bg-card, var(--bg-input, #ffffff)); background: var(--bg-card);
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.14); box-shadow: 0 12px 34px oklch(0 0 0 / 0.42);
} }
.voice-transcript-overlay--floating { .voice-transcript-overlay--floating {
@@ -90,12 +90,6 @@ const recentEventTypes = computed(() => props.events.slice(-5).map(event => even
box-sizing: border-box; box-sizing: border-box;
} }
.dark .voice-transcript-overlay {
border-color: rgba(255, 255, 255, 0.14);
background: var(--bg-card, #333333);
box-shadow: 0 12px 34px rgba(0, 0, 0, 0.42);
}
.voice-transcript-overlay__status, .voice-transcript-overlay__status,
.voice-transcript-overlay__transcript, .voice-transcript-overlay__transcript,
.voice-transcript-overlay__error, .voice-transcript-overlay__error,
@@ -109,7 +103,7 @@ const recentEventTypes = computed(() => props.events.slice(-5).map(event => even
} }
.voice-transcript-overlay__error { .voice-transcript-overlay__error {
color: var(--error-color, #d03050); color: var(--error);
} }
.voice-transcript-overlay__debug { .voice-transcript-overlay__debug {
@@ -32,7 +32,7 @@ onMounted(() => {
editor = monaco.editor.create(editorContainer.value, { editor = monaco.editor.create(editorContainer.value, {
value: filesStore.editingFile.content, value: filesStore.editingFile.content,
language: filesStore.editingFile.language, language: filesStore.editingFile.language,
theme: document.documentElement.classList.contains('dark') ? 'vs-dark' : 'vs', theme: 'vs-dark',
minimap: { enabled: false }, minimap: { enabled: false },
fontSize: 13, fontSize: 13,
lineNumbers: 'on', lineNumbers: 'on',
@@ -763,7 +763,7 @@ function isImage(type: string): boolean {
border-radius: 18px; border-radius: 18px;
padding: 14px 12px 9px; padding: 14px 12px 9px;
position: relative; position: relative;
box-shadow: 0 8px 28px rgba(0, 0, 0, 0.08); box-shadow: 0 8px 28px rgba(0, 0, 0, 0.32);
transition: border-color $transition-fast, box-shadow $transition-fast; transition: border-color $transition-fast, box-shadow $transition-fast;
&:focus-within { &:focus-within {
@@ -775,11 +775,6 @@ function isImage(type: string): boolean {
border-color: $accent-primary; border-color: $accent-primary;
background-color: rgba(var(--accent-primary-rgb), 0.04); background-color: rgba(var(--accent-primary-rgb), 0.04);
} }
.dark & {
background-color: $bg-card;
box-shadow: 0 8px 28px rgba(0, 0, 0, 0.32);
}
} }
.resize-handle { .resize-handle {
@@ -949,7 +949,7 @@ export default defineComponent({ components: { CreateRoomForm } })
transition: color 0.15s ease, background 0.15s ease, border-color 0.15s ease; transition: color 0.15s ease, background 0.15s ease, border-color 0.15s ease;
&:hover { &:hover {
color: #ffffff; color: var(--text-on-accent);
background: $error; background: $error;
border-color: $error; border-color: $error;
} }
@@ -1028,19 +1028,11 @@ onBeforeUnmount(() => {
border-radius: $radius-sm; border-radius: $radius-sm;
padding: 0; padding: 0;
transition: color 0.15s ease, background 0.15s ease; transition: color 0.15s ease, background 0.15s ease;
color: var(--text-faint);
&:hover { &:hover {
color: $text-secondary; color: $text-secondary;
background: rgba(0, 0, 0, 0.06); background: rgba(var(--text-primary-rgb), 0.1);
}
.dark & {
color: #999999;
&:hover {
color: #cccccc;
background: rgba(255, 255, 255, 0.1);
}
} }
} }
@@ -232,15 +232,10 @@ defineExpose({ scrollToBottom })
.history-loader-spinner { .history-loader-spinner {
width: 14px; width: 14px;
height: 14px; height: 14px;
border: 2px solid rgba(0, 0, 0, 0.16); border: 2px solid rgba(var(--text-primary-rgb), 0.18);
border-top-color: $accent-primary; border-top-color: $accent-primary;
border-radius: 50%; border-radius: 50%;
animation: spin 0.7s linear infinite; animation: spin 0.7s linear infinite;
.dark & {
border-color: rgba(255, 255, 255, 0.18);
border-top-color: $accent-primary;
}
} }
.history-limit-notice { .history-limit-notice {
@@ -199,14 +199,14 @@ startLogin()
align-items: center; align-items: center;
gap: 12px; gap: 12px;
padding: 12px 20px; padding: 12px 20px;
border: 1px solid var(--color-border-2, #e0e0e6); border: 1px solid var(--border-color);
border-radius: 8px; border-radius: 8px;
cursor: pointer; cursor: pointer;
transition: border-color 0.2s; transition: border-color 0.2s;
background: var(--color-fill-2, #fafafa); background: var(--bg-card);
&:hover { &:hover {
border-color: var(--arcoblue-6, #165dff); border-color: var(--accent-primary);
} }
} }
@@ -201,14 +201,14 @@ startLogin()
align-items: center; align-items: center;
gap: 12px; gap: 12px;
padding: 12px 20px; padding: 12px 20px;
border: 1px solid var(--color-border-2, #e0e0e6); border: 1px solid var(--border-color);
border-radius: 8px; border-radius: 8px;
cursor: pointer; cursor: pointer;
transition: border-color 0.2s; transition: border-color 0.2s;
background: var(--color-fill-2, #fafafa); background: var(--bg-card);
&:hover { &:hover {
border-color: var(--arcoblue-6, #165dff); border-color: var(--accent-primary);
} }
} }
@@ -201,14 +201,14 @@ startLogin()
align-items: center; align-items: center;
gap: 12px; gap: 12px;
padding: 12px 20px; padding: 12px 20px;
border: 1px solid var(--color-border-2, #e0e0e6); border: 1px solid var(--border-color);
border-radius: 8px; border-radius: 8px;
cursor: pointer; cursor: pointer;
transition: border-color 0.2s; transition: border-color 0.2s;
background: var(--color-fill-2, #fafafa); background: var(--bg-card);
&:hover { &:hover {
border-color: var(--arcoblue-6, #165dff); border-color: var(--accent-primary);
} }
} }
@@ -150,12 +150,12 @@ function saveExclude(value: string[]) {
margin: 0 0 6px; margin: 0 0 6px;
font-size: 15px; font-size: 15px;
font-weight: 600; font-weight: 600;
color: var(--text-color); color: var(--text-primary);
} }
.section-hint { .section-hint {
margin: 0 0 12px; margin: 0 0 12px;
color: var(--text-color-secondary); color: var(--text-secondary);
font-size: 13px; font-size: 13px;
} }
@@ -520,7 +520,7 @@ async function handleSave() {
.form-section + .form-section { .form-section + .form-section {
padding-top: 12px; padding-top: 12px;
border-top: 1px solid var(--border-color, rgba(0, 0, 0, 0.08)); border-top: 1px solid var(--border-color);
} }
.section-heading { .section-heading {
@@ -545,7 +545,7 @@ async function handleSave() {
.inline-error { .inline-error {
display: grid; display: grid;
gap: 6px; gap: 6px;
color: var(--danger-6, #d03050); color: var(--error);
font-size: 12px; font-size: 12px;
line-height: 1.4; line-height: 1.4;
} }
@@ -557,13 +557,13 @@ async function handleSave() {
overflow: auto; overflow: auto;
white-space: pre-wrap; white-space: pre-wrap;
color: inherit; color: inherit;
background: rgba(208, 48, 80, 0.06); background: rgba(var(--error-rgb), 0.06);
border-radius: 6px; border-radius: 6px;
} }
.link-button { .link-button {
padding: 0; padding: 0;
color: var(--primary-6, #18a058); color: var(--accent-primary);
background: transparent; background: transparent;
border: 0; border: 0;
cursor: pointer; cursor: pointer;
+4 -4
View File
@@ -449,21 +449,21 @@ $neon-hv: var(--accent-hover);
box-shadow: 0 0 8px rgba(var(--accent-primary-rgb), 0.5); box-shadow: 0 0 8px rgba(var(--accent-primary-rgb), 0.5);
} }
// 下拉 / 弹层的浮层背景 // 下拉 / 弹层的浮层背景。浮层要浮在内容之上,用最亮的一层底。
.arco-trigger-popup, .arco-trigger-popup,
.arco-select-popup, .arco-select-popup,
.arco-picker-dropdown, .arco-picker-dropdown,
.arco-dropdown, .arco-dropdown,
.arco-modal, .arco-modal,
.arco-drawer { .arco-drawer {
background-color: var(--surface-2); background-color: var(--bg-card);
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
box-shadow: var(--shadow, 0 18px 48px oklch(0 0 0 / 0.55)); box-shadow: 0 18px 48px oklch(0 0 0 / 0.55);
} }
// 表格:去掉亮色分隔线的突兀感,表头沉下去 // 表格:去掉亮色分隔线的突兀感,表头沉下去
.arco-table-th { .arco-table-th {
background-color: var(--surface-2); background-color: var(--bg-secondary);
color: $text-muted; color: $text-muted;
border-color: $border-color; border-color: $border-color;
font-family: $font-code; font-family: $font-code;
@@ -86,6 +86,7 @@ $accent-muted: var(--accent-muted);
$text-primary: var(--text-primary); $text-primary: var(--text-primary);
$text-secondary: var(--text-secondary); $text-secondary: var(--text-secondary);
$text-muted: var(--text-muted); $text-muted: var(--text-muted);
$text-faint: var(--text-faint);
// Status // Status
$success: var(--success); $success: var(--success);
@@ -402,7 +402,7 @@ function drawNode(node: ProjectedNode, activeId: string, activeNeighbors: Set<st
if (node.pinned || active) { if (node.pinned || active) {
ctx.shadowBlur = 0 ctx.shadowBlur = 0
ctx.strokeStyle = active ? 'rgba(255,255,255,0.9)' : 'rgba(255, 190, 90, 0.85)' ctx.strokeStyle = active ? 'rgba(235, 255, 252, 0.92)' : 'rgba(45, 212, 191, 0.7)'
ctx.lineWidth = active ? 2 : 1.4 ctx.lineWidth = active ? 2 : 1.4
ctx.beginPath() ctx.beginPath()
ctx.arc(node.sx, node.sy, node.size + 5, 0, Math.PI * 2) ctx.arc(node.sx, node.sy, node.size + 5, 0, Math.PI * 2)
@@ -326,7 +326,7 @@ onMounted(() => {
margin-top: 10px; margin-top: 10px;
a { a {
color: var(--primary-color); color: var(--accent-primary);
font-size: 12px; font-size: 12px;
text-decoration: none; text-decoration: none;
@@ -2399,7 +2399,7 @@ function nodeColor(node: { data: WorkflowAgentNodeData }) {
color: var(--text-muted); color: var(--text-muted);
cursor: pointer; cursor: pointer;
border-radius: 3px; border-radius: 3px;
transition: all var(--transition-fast); transition: all $transition-fast;
&:hover { &:hover {
color: var(--error); color: var(--error);