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:
@@ -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;
|
||||||
|
filter: brightness(1.18) contrast(1.08) saturate(1.08);
|
||||||
.dark & {
|
|
||||||
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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user