diff --git a/.gitattributes b/.gitattributes index ac5be2e6b9f..8820385cca2 100644 --- a/.gitattributes +++ b/.gitattributes @@ -39,3 +39,12 @@ packages/browser-control-runtime/src/_generated/** linguist-generated=true apps/mobile/scripts/release-*.mjs export-ignore apps/mobile/scripts/release-*.sh export-ignore apps/mobile/scripts/promote-*.mjs export-ignore + +# DTCG generated whole files / marked regions: stable bytes on Windows as well. +apps/desktop/src/renderer/themes/colors.ts text eol=lf +apps/desktop/src/renderer/themes/builtin/*.ts text eol=lf +apps/desktop/src/renderer/styles/generated/* text eol=lf +apps/desktop/src/shared/generated/appearance-tokens.ts text eol=lf +apps/desktop/src/shared/windowBackdrop.ts text eol=lf +apps/desktop/tailwind.config.ts text eol=lf +docs/design-rules/DESIGN.md text eol=lf diff --git a/apps/desktop/src/renderer/__tests__/foundationDefaultsFreeze.test.ts b/apps/desktop/src/renderer/__tests__/foundationDefaultsFreeze.test.ts new file mode 100644 index 00000000000..89e00523fb1 --- /dev/null +++ b/apps/desktop/src/renderer/__tests__/foundationDefaultsFreeze.test.ts @@ -0,0 +1,86 @@ +import { readFileSync } from 'node:fs'; +import { describe, expect, it } from 'vitest'; +import config from '../../../tailwind.config'; + +// Independent pre-DS-8 expectations (4f03ea9a7b): Tailwind 3 defaults, +// globals.css motion values, and Input's approved 40px / 12px geometry. +// Never generate these expectations from DTCG. Approved style changes must +// explicitly update this ledger under design-governance §1.1 and §6. +const SPACING = { + '0': '0px', '1': '0.25rem', '2': '0.5rem', '3': '0.75rem', + '4': '1rem', '5': '1.25rem', '6': '1.5rem', '7': '1.75rem', + '8': '2rem', '9': '2.25rem', '10': '2.5rem', '11': '2.75rem', + '12': '3rem', '14': '3.5rem', '16': '4rem', '20': '5rem', + '24': '6rem', '28': '7rem', '32': '8rem', '36': '9rem', + '40': '10rem', '44': '11rem', '48': '12rem', '52': '13rem', + '56': '14rem', '60': '15rem', '64': '16rem', '72': '18rem', + '80': '20rem', '96': '24rem', px: '1px', + '0.5': '0.125rem', '1.5': '0.375rem', '2.5': '0.625rem', '3.5': '0.875rem', +}; +const RADIUS = { + none: '0px', DEFAULT: '0.25rem', xl: '0.75rem', + '2xl': '1rem', '3xl': '1.5rem', full: '9999px', + lg: 'var(--radius)', + md: 'calc(var(--radius) - 2px)', + sm: 'calc(var(--radius) - 4px)', +}; +const MOTION = { + instant: '80ms', fast: '150ms', base: '200ms', enter: '250ms', exit: '150ms', + 'spinner-cycle': '1000ms', 'sidebar-title-marquee-per-viewport': '2400ms', + 'ease-out': 'cubic-bezier(0.16, 1, 0.3, 1)', + 'ease-in': 'cubic-bezier(0.4, 0, 1, 1)', + 'ease-move': 'cubic-bezier(0.4, 0, 0.2, 1)', +}; +const css = readFileSync(new URL('../styles/generated/tokens.css', import.meta.url), 'utf8'); +const variables = Object.fromEntries( + [...css.matchAll(/--([\w-]+):\s*([^;]+);/g)].map((match) => [match[1], match[2]]), +); +const theme = config.theme!.extend!; + +function resolveVariables(value: string): string { + return value.replace(/var\(--([\w-]+)(?:,\s*[^)]+)?\)/g, (expression, name: string) => { + // The user radius must stay symbolic; its default/null fallback is covered + // by registry freezes and theme compatibility tests, not a fixed CSS value. + if (name === 'radius') return expression; + expect(variables[name], `Missing CSS variable --${name}`).toBeDefined(); + return variables[name]; + }); +} + +function resolveMap(map: unknown) { + return Object.fromEntries( + Object.entries(map as Record).map(([key, value]) => [key, resolveVariables(value)]), + ); +} + +describe('DS-8 foundation defaults freeze', () => { + it('keeps all 35 spacing classes, six fixed radii and three UI weights at approved values', () => { + expect(resolveMap(theme.spacing)).toEqual(SPACING); + expect(resolveMap(theme.borderRadius)).toEqual(RADIUS); + expect(resolveMap(theme.fontWeight)).toEqual({ normal: '400', medium: '500', semibold: '600' }); + }); + + it('keeps user radius derivation and standard Input geometry', () => { + expect(theme.borderRadius).toMatchObject({ + lg: 'var(--radius)', + md: 'calc(var(--radius) - var(--radius-offset-md))', + sm: 'calc(var(--radius) - var(--radius-offset-sm))', + }); + expect(variables).toMatchObject({ + 'radius-offset-md': '2px', 'radius-offset-sm': '4px', + 'size-input-lg': '40px', 'space-input-lg': '12px', + }); + }); + + it('keeps all motion durations/curves and the real Tailwind transition defaults', () => { + expect(Object.fromEntries( + Object.entries(variables) + .filter(([key]) => key.startsWith('motion-')) + .map(([key, value]) => [key.slice('motion-'.length), value]), + )).toEqual(MOTION); + expect(theme.transitionDuration).toEqual({ DEFAULT: 'var(--motion-fast, 150ms)' }); + expect(theme.transitionTimingFunction).toEqual({ + DEFAULT: 'var(--motion-ease-move, cubic-bezier(0.4, 0, 0.2, 1))', + }); + }); +}); diff --git a/apps/desktop/src/renderer/__tests__/markdownDiffBlock.test.ts b/apps/desktop/src/renderer/__tests__/markdownDiffBlock.test.ts index 3716408a522..1a56d70ee5a 100644 --- a/apps/desktop/src/renderer/__tests__/markdownDiffBlock.test.ts +++ b/apps/desktop/src/renderer/__tests__/markdownDiffBlock.test.ts @@ -1,3 +1,5 @@ +import { colorRegistry } from '../themes/color-registry'; +import '../themes/colors'; /** * markdownDiffBlock.test.ts * --------------------------------------------------------------------------- @@ -53,39 +55,37 @@ const diffBlockSrc = readFileSync(diffBlockPath, 'utf8'); const colorsSrc = readFileSync(colorsPath, 'utf8'); const globalsSrc = readFileSync(globalsPath, 'utf8'); -function registeredColorBlock(name: string): string { - const escaped = name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - const match = colorsSrc.match(new RegExp(`registerColor\\('${escaped}'[\\s\\S]*?\\n\\}, '[^']+'\\);`)); - expect(match, `registerColor('${name}') not found`).toBeTruthy(); - if (!match) throw new Error(`registerColor('${name}') not found`); - return match[0]; +function registeredColorBlock(name: string) { + const entry = colorRegistry.getColors().find(color => color.id === name); + expect(entry, `registerColor('${name}') not found`).toBeTruthy(); + return entry!.defaults; } describe('F1 — theme tokens use GitHub-standard diff foregrounds', () => { it(':root light --diff-add-fg = #22863a', () => { - expect(registeredColorBlock('diff-add-fg')).toMatch(/light:\s*'#22863a'/); + expect(registeredColorBlock('diff-add-fg')).toMatchObject({ light: '#22863a' }); }); it(':root light --diff-del-fg = #b31d28', () => { - expect(registeredColorBlock('diff-del-fg')).toMatch(/light:\s*'#b31d28'/); + expect(registeredColorBlock('diff-del-fg')).toMatchObject({ light: '#b31d28' }); }); it('.dark --diff-add-fg = #7ee787', () => { - expect(registeredColorBlock('diff-add-fg')).toMatch(/dark:\s*'#7ee787'/); + expect(registeredColorBlock('diff-add-fg')).toMatchObject({ dark: '#7ee787' }); }); it('.dark --diff-del-fg = #ff7b72', () => { - expect(registeredColorBlock('diff-del-fg')).toMatch(/dark:\s*'#ff7b72'/); + expect(registeredColorBlock('diff-del-fg')).toMatchObject({ dark: '#ff7b72' }); }); it('backgrounds use GitHub-standard red/green for full-row fill', () => { // diff 颜色现在由主题 token 注册,组件只消费 var(--diff-*)。 - expect(registeredColorBlock('diff-add-bg')).toMatch(/light:\s*'#f0fff4'/); - expect(registeredColorBlock('diff-del-bg')).toMatch(/light:\s*'#ffeef0'/); - expect(registeredColorBlock('diff-add-bg')).toMatch(/dark:\s*'#033a16'/); - expect(registeredColorBlock('diff-del-bg')).toMatch(/dark:\s*'#67060c'/); - expect(registeredColorBlock('diff-line-num')).toMatch(/light:\s*'var\(--text-tertiary-stone\)'/); - expect(registeredColorBlock('diff-line-num')).toMatch(/dark:\s*'var\(--text-tertiary-stone\)'/); + expect(registeredColorBlock('diff-add-bg')).toMatchObject({ light: '#f0fff4' }); + expect(registeredColorBlock('diff-del-bg')).toMatchObject({ light: '#ffeef0' }); + expect(registeredColorBlock('diff-add-bg')).toMatchObject({ dark: '#033a16' }); + expect(registeredColorBlock('diff-del-bg')).toMatchObject({ dark: '#67060c' }); + expect(registeredColorBlock('diff-line-num')).toMatchObject({ light: 'var(--text-tertiary-stone)' }); + expect(registeredColorBlock('diff-line-num')).toMatchObject({ dark: 'var(--text-tertiary-stone)' }); }); it('hljs-addition / hljs-deletion are display:block so backgrounds reach the right edge', () => { @@ -103,10 +103,10 @@ describe('F1 — theme tokens use GitHub-standard diff foregrounds', () => { // The old light-mode add was #262626 (Near Black) and dark-mode add was // #d4d4d4 (Soft Gray). Those must no longer be tied to --diff-add-fg. - expect(addFgBlock).not.toMatch(/#262626/); - expect(addFgBlock).not.toMatch(/#d4d4d4/); + expect(Object.values(addFgBlock)).not.toContain('#262626'); + expect(Object.values(addFgBlock)).not.toContain('#d4d4d4'); // Old del was Stone #737373 in both modes. - expect(delFgBlock).not.toMatch(/#737373/); + expect(Object.values(delFgBlock)).not.toContain('#737373'); }); }); diff --git a/apps/desktop/src/renderer/__tests__/newMakerCreateAgentVisualContract.test.ts b/apps/desktop/src/renderer/__tests__/newMakerCreateAgentVisualContract.test.ts index 9b0df0b9229..432eb5dc9fd 100644 --- a/apps/desktop/src/renderer/__tests__/newMakerCreateAgentVisualContract.test.ts +++ b/apps/desktop/src/renderer/__tests__/newMakerCreateAgentVisualContract.test.ts @@ -1,3 +1,5 @@ +import { colorRegistry } from '../themes/color-registry'; +import '../themes/colors'; import { readFileSync } from 'node:fs'; import { resolve } from 'node:path'; @@ -289,29 +291,29 @@ describe('NewMakerDraftRoute CREATE AGENT visual contract', () => { expect(modelSelectorSource).not.toContain('max-w-[180px] truncate'); expect(colorsSource).toContain("'create-agent-send-bg'"); - expect(colorsSource).toContain("light: '#3C3F43'"); - expect(colorsSource).toContain("dark: '#EEEEEE'"); + expect(colorRegistry.resolveDefault('create-agent-send-bg', 'light')).toBe('#3C3F43'); + expect(colorRegistry.resolveDefault('create-agent-send-bg', 'dark')).toBe('#EEEEEE'); expect(colorsSource).toContain("'create-agent-send-icon'"); - expect(colorsSource).toContain("light: '#FCFCFC'"); + expect(colorRegistry.resolveDefault('create-agent-send-icon', 'light')).toBe('#FCFCFC'); expect(colorsSource).not.toContain("'create-agent-send-border'"); expect(colorsSource).toContain("'create-agent-send-bg-hover'"); - expect(colorsSource).toContain("light: '#2E3237'"); - expect(colorsSource).toContain("dark: '#E2E2E2'"); + expect(colorRegistry.resolveDefault('create-agent-send-bg-hover', 'light')).toBe('#2E3237'); + expect(colorRegistry.resolveDefault('create-agent-send-bg-hover', 'dark')).toBe('#E2E2E2'); expect(colorsSource).toContain("'create-agent-send-bg-pressed'"); - expect(colorsSource).toContain("light: '#25282C'"); - expect(colorsSource).toContain("dark: '#D4D4D4'"); + expect(colorRegistry.resolveDefault('create-agent-send-bg-pressed', 'light')).toBe('#25282C'); + expect(colorRegistry.resolveDefault('create-agent-send-bg-pressed', 'dark')).toBe('#D4D4D4'); expect(colorsSource).toContain("'create-agent-send-disabled-bg'"); - expect(colorsSource).toContain("dark: '#444242'"); + expect(colorRegistry.resolveDefault('create-agent-send-disabled-bg', 'dark')).toBe('#444242'); expect(colorsSource).toContain("'create-agent-send-disabled-icon'"); - expect(colorsSource).toContain("dark: '#585555'"); + expect(colorRegistry.resolveDefault('create-agent-send-disabled-icon', 'dark')).toBe('#585555'); expect(colorsSource).toContain("'create-agent-segment-inactive-text'"); - expect(colorsSource).toContain("light: '#9A9DA3'"); - expect(colorsSource).toContain("dark: '#6F6F6F'"); + expect(colorRegistry.resolveDefault('create-agent-segment-inactive-text', 'light')).toBe('#9A9DA3'); + expect(colorRegistry.resolveDefault('create-agent-segment-inactive-text', 'dark')).toBe('#6F6F6F'); expect(colorsSource).toContain("'create-agent-control-border'"); - expect(colorsSource).toContain("light: '#DCDFE3'"); - expect(colorsSource).toContain("dark: '#434343'"); + expect(colorRegistry.resolveDefault('create-agent-control-border', 'light')).toBe('#DCDFE3'); + expect(colorRegistry.resolveDefault('create-agent-control-border', 'dark')).toBe('#434343'); expect(colorsSource).toContain("'create-agent-control-icon'"); - expect(colorsSource).toContain("light: '#3C3F43'"); + expect(colorRegistry.resolveDefault('create-agent-control-icon', 'light')).toBe('#3C3F43'); expect(chatInputSource).toContain( "'min-w-0 flex-nowrap justify-between gap-2 overflow-hidden'", @@ -443,11 +445,11 @@ describe('NewMakerDraftRoute CREATE AGENT visual contract', () => { ); expect(colorsSource).toContain("'send-btn-bg'"); - expect(colorsSource).toContain("light: '#3C3F43'"); - expect(colorsSource).toContain("dark: '#EEEEEE'"); + expect(colorRegistry.resolveDefault('send-btn-bg', 'light')).toBe('var(--accent-cta-bg)'); + expect(colorRegistry.resolveDefault('send-btn-bg', 'dark')).toBe('var(--accent-cta-bg)'); expect(colorsSource).toContain("'send-btn-icon'"); - expect(colorsSource).toContain("light: '#FCFCFC'"); - expect(colorsSource).toContain("dark: '#252222'"); + expect(colorRegistry.resolveDefault('send-btn-icon', 'light')).toBe('var(--surface-on-card)'); + expect(colorRegistry.resolveDefault('send-btn-icon', 'dark')).toBe('var(--surface-on-card)'); expect(colorsSource).not.toContain("'stop-btn-bg'"); expect(colorsSource).not.toContain("'stop-btn-icon'"); }); diff --git a/apps/desktop/src/renderer/__tests__/textLightbox.test.ts b/apps/desktop/src/renderer/__tests__/textLightbox.test.ts index a1b88481894..5be32866b22 100644 --- a/apps/desktop/src/renderer/__tests__/textLightbox.test.ts +++ b/apps/desktop/src/renderer/__tests__/textLightbox.test.ts @@ -1,3 +1,5 @@ +import { colorRegistry } from '../themes/color-registry'; +import '../themes/colors'; /** * textLightbox.test.ts * --------------------------------------------------------------------------- @@ -82,9 +84,7 @@ describe('TextLightbox — F3 overlay style', () => { it('overlay background uses the lightbox overlay theme token', () => { // overlay 已迁到主题 token,避免组件内写死 rgba 颜色。 expect(source).toContain("background: 'var(--overlay-lightbox)'"); - expect(colorsSource).toMatch( - /registerColor\('overlay-lightbox'[\s\S]*light:\s*'rgba\(0, 0, 0, 0\.85\)'[\s\S]*dark:\s*'rgba\(0, 0, 0, 0\.85\)'/, - ); + for (const mode of ['light', 'dark'] as const) expect(colorRegistry.resolveDefault('overlay-lightbox', mode)).toBe('rgba(0, 0, 0, 0.85)'); }); it('overlay is rendered via createPortal to document.body', () => { diff --git a/apps/desktop/src/renderer/__tests__/typographyDiscipline.test.ts b/apps/desktop/src/renderer/__tests__/typographyDiscipline.test.ts index b51e6a6dda6..49e48c40a83 100644 --- a/apps/desktop/src/renderer/__tests__/typographyDiscipline.test.ts +++ b/apps/desktop/src/renderer/__tests__/typographyDiscipline.test.ts @@ -1,3 +1,6 @@ +import config from '../../../tailwind.config'; +import { UI_TEXT_TOKEN_SIZES, SCALED_TAILWIND_TOKENS, NUMERIC_TEXT_CLASSES } from '../styles/generated/token-mappings'; +import { cn } from '../lib/utils'; import { readdirSync, readFileSync, statSync } from 'node:fs'; import { join, relative, sep } from 'node:path'; import { describe, expect, it } from 'vitest'; @@ -720,75 +723,21 @@ describe('typography discipline (DESIGN.md §3, #1505)', () => { expect(exemptionDrift).toEqual([]); }); - it('mirrors the size ladder across DESIGN.md and the three authoritative code sources', () => { + it('mirrors the independent size ladder across generated values and actual consumers', () => { const expected = [...SIZE_WHITELIST].sort((a, b) => a - b); - const expectedSemantic = { xs: 12, sm: 14, base: 16, lg: 18 }; - - const config = readFileSync(join(ROOT, 'tailwind.config.ts'), 'utf8'); - const fontSizeBlock = - /fontSize:\s*\{([\s\S]*?)^\s*\},\s*borderRadius:/m.exec(config)?.[1] ?? ''; - const configNumeric = parseNumericConfigMappings(config); - expect(configNumeric).toEqual(expected.map((n) => [n, n])); - const configSemantic = Object.fromEntries( - [...fontSizeBlock.matchAll(/^\s*(xs|sm|base|lg):\s*\[['"]var\(--text-\1\)['"]/gm)].map( - (m) => [m[1], expectedSemantic[m[1] as keyof typeof expectedSemantic]], - ), - ); - expect(configSemantic).toEqual(expectedSemantic); - const preservedConfigSemantic = Object.fromEntries( - [ - ...fontSizeBlock.matchAll( - /^\s*['"]?(xl|2xl|3xl|4xl|5xl)['"]?:\s*\[['"]var\(--text-\1\)['"]/gm, - ), - ].map((m) => [m[1], SEMANTIC_TOKEN_VALUES[m[1] as keyof typeof SEMANTIC_TOKEN_VALUES]]), - ); - expect(preservedConfigSemantic).toEqual({ xl: 20, '2xl': 24, '3xl': 30, '4xl': 36, '5xl': 48 }); - - const css = readFileSync(join(ROOT, 'src/renderer/styles/globals.css'), 'utf8'); - const cssNumeric = parseNumericCssMappings(css); - expect(cssNumeric).toEqual(expected.map((n) => [n, n])); - const cssSemantic = Object.fromEntries( - [...css.matchAll(/--text-(xs|sm|base|lg):\s*(\d+)px;/g)].map((m) => [m[1], Number(m[2])]), - ); - expect(cssSemantic).toEqual(expectedSemantic); - const preservedCssSemantic = Object.fromEntries( - [...css.matchAll(/--text-(xl|2xl|3xl|4xl|5xl):\s*(\d+)px;/g)].map((m) => [ - m[1], - Number(m[2]), - ]), - ); - expect(preservedCssSemantic).toEqual({ xl: 20, '2xl': 24, '3xl': 30, '4xl': 36, '5xl': 48 }); - + expect(Object.entries(UI_TEXT_TOKEN_SIZES).map(([key, value]) => [Number(key), value])).toEqual(expected.map(n => [n, n])); + expect(SCALED_TAILWIND_TOKENS).toEqual({ xs: 12, sm: 14, base: 16, lg: 18, xl: 20, '2xl': 24, '3xl': 30, '4xl': 36, '5xl': 48 }); + const TAILWIND_FONT_SIZE = config.theme?.extend?.fontSize as Record; + for (const n of expected) expect(TAILWIND_FONT_SIZE[n]).toBe(`var(--text-${n})`); + for (const key of Object.keys(SCALED_TAILWIND_TOKENS)) expect(TAILWIND_FONT_SIZE[key]).toEqual([`var(--text-${key})`, { lineHeight: `var(--text-${key}-line-height)` }]); + const css = readFileSync(join(ROOT, 'src/renderer/styles/generated/tokens.css'), 'utf8'); + expect(parseNumericCssMappings(css)).toEqual(expected.map(n => [n, n])); + const globals = readFileSync(join(ROOT, 'src/renderer/styles/globals.css'), 'utf8'); + expect(globals).toContain("@import './generated/tokens.css'"); + expect(parseNumericCssMappings(globals)).toEqual([]); const hook = readFileSync(join(ROOT, 'src/renderer/hooks/useFontSettings.ts'), 'utf8'); - const runtimeBlock = /UI_TEXT_TOKEN_SIZES\s*=\s*\[([^\]]+)\]/s.exec(hook)?.[1] ?? ''; - const runtimeNumeric = [...runtimeBlock.matchAll(/\b\d+\b/g)] - .map((m) => Number(m[0])) - .sort((a, b) => a - b); - expect(runtimeNumeric).toEqual(expected); - expect(hook).toMatch( - /for \(const tokenSize of UI_TEXT_TOKEN_SIZES\)[\s\S]*?set\(`--text-\$\{tokenSize\}`, `\$\{Math\.round\(tokenSize \* scale\)\}px`\)/, - ); - const semanticBlock = /SCALED_TAILWIND_TOKENS\s*=\s*\{([^}]+)\}/s.exec(hook)?.[1] ?? ''; - const runtimeSemantic = Object.fromEntries( - [...semanticBlock.matchAll(/^\s*(xs|sm|base|lg):\s*(\d+),/gm)].map((m) => [ - m[1], - Number(m[2]), - ]), - ); - expect(runtimeSemantic).toEqual(expectedSemantic); - const preservedRuntimeSemantic = Object.fromEntries( - [...semanticBlock.matchAll(/^\s*['"]?(xl|2xl|3xl|4xl|5xl)['"]?:\s*(\d+),/gm)].map((m) => [ - m[1], - Number(m[2]), - ]), - ); - expect(preservedRuntimeSemantic).toEqual({ - xl: 20, - '2xl': 24, - '3xl': 30, - '4xl': 36, - '5xl': 48, - }); + expect(hook).toContain("from '../styles/generated/token-mappings'"); + expect(hook).not.toMatch(/UI_TEXT_TOKEN_SIZES\s*=/); // DESIGN.md §3「桌面 UI 字号白名单」小节的两个 {…} 集合。 const design = readFileSync(DESIGN_MD, 'utf8'); @@ -805,14 +754,12 @@ describe('typography discipline (DESIGN.md §3, #1505)', () => { expect(docTiers).toEqual(expected); }); - it('keeps the tailwind-merge font-size consumer in sync', () => { - const expected = [...SIZE_WHITELIST].sort((a, b) => a - b); - const mergeUtils = readFileSync(join(ROOT, 'src/renderer/lib/utils.ts'), 'utf8'); - const mergeBlock = /font-size'[\s\S]*?text:\s*\[([^\]]+)\]/.exec(mergeUtils)?.[1] ?? ''; - const mergeNumeric = [...mergeBlock.matchAll(/['"](\d+)['"]/g)] - .map((m) => Number(m[1])) - .sort((a, b) => a - b); - expect(mergeNumeric).toEqual(expected); + it('keeps the actual tailwind-merge font-size consumer in sync', () => { + const expected = [...SIZE_WHITELIST]; + expect(NUMERIC_TEXT_CLASSES.map(Number)).toEqual(expected); + for (const a of expected) for (const b of expected) { + expect(cn(`text-${a}`, `text-${b}`)).toBe(`text-${b}`); + } }); // ── 红绿 fixture:检查器本身的行为锚定(防误报/漏报同时回归) ── diff --git a/apps/desktop/src/renderer/components/status/__tests__/QuotaBar.test.tsx b/apps/desktop/src/renderer/components/status/__tests__/QuotaBar.test.tsx index ee890885174..9db84dd3dd3 100644 --- a/apps/desktop/src/renderer/components/status/__tests__/QuotaBar.test.tsx +++ b/apps/desktop/src/renderer/components/status/__tests__/QuotaBar.test.tsx @@ -1,3 +1,5 @@ +import { colorRegistry } from '../../../themes/color-registry'; +import '../../../themes/colors'; // @vitest-environment jsdom import { render } from '@testing-library/react'; @@ -7,12 +9,8 @@ import { resolve } from 'node:path'; import { QuotaBar, quotaSeverity } from '../QuotaBar'; -const colorsSource = readFileSync( - resolve(__dirname, '..', '..', '..', 'themes', 'colors.ts'), - 'utf8', -).replace(/\r\n/g, '\n'); -const globalsSource = readFileSync( - resolve(__dirname, '..', '..', '..', 'styles', 'globals.css'), +const bootstrapSource = readFileSync( + resolve(__dirname, '..', '..', '..', 'styles', 'generated', 'tokens.css'), 'utf8', ).replace(/\r\n/g, '\n'); @@ -100,14 +98,9 @@ describe('QuotaBar', () => { } as const; for (const [quotaToken, semanticToken] of Object.entries(aliases)) { - expect(colorsSource).toContain( - `registerColor('${quotaToken}', {\n` - + ` light: 'var(--${semanticToken})',\n` - + ` dark: 'var(--${semanticToken})',\n` - + '}', - ); + for (const mode of ['light', 'dark'] as const) expect(colorRegistry.resolveDefault(quotaToken, mode)).toBe(`var(--${semanticToken})`); expect( - globalsSource.match( + bootstrapSource.match( new RegExp(`--${quotaToken}: var\\(--${semanticToken}\\);`, 'g'), ), ).toHaveLength(2); diff --git a/apps/desktop/src/renderer/components/ui/__tests__/input.test.tsx b/apps/desktop/src/renderer/components/ui/__tests__/input.test.tsx index 21e72a715e1..61b28a8d597 100644 --- a/apps/desktop/src/renderer/components/ui/__tests__/input.test.tsx +++ b/apps/desktop/src/renderer/components/ui/__tests__/input.test.tsx @@ -1,4 +1,6 @@ // @vitest-environment jsdom +import { readFileSync } from 'node:fs'; +import { resolve } from 'node:path'; import { cleanup, render, screen } from '@testing-library/react'; import { createRef } from 'react'; @@ -35,7 +37,8 @@ describe('Input', () => { rerender( {}} size="md" />); expect(inputClass()).toContain('h-9'); rerender( {}} size="lg" />); - expect(inputClass()).toContain('h-[40px]'); + expect(inputClass()).toContain('h-[var(--size-input-lg)]'); + expect(readFileSync(resolve(__dirname, '../../../styles/generated/tokens.css'), 'utf8')).toContain('--size-input-lg: 40px;'); }); it('keeps ivory as an explicit white-panel variant', () => { diff --git a/apps/desktop/src/renderer/components/ui/input.tsx b/apps/desktop/src/renderer/components/ui/input.tsx index 7fb3b64bd80..197c9e73190 100644 --- a/apps/desktop/src/renderer/components/ui/input.tsx +++ b/apps/desktop/src/renderer/components/ui/input.tsx @@ -58,9 +58,9 @@ const SIZE_STYLES: Record< trailingPaddingRight: 'pr-9', }, lg: { - box: 'h-[40px] text-14', - paddingLeft: 'pl-[12px]', - paddingRight: 'pr-[12px]', + box: 'h-[var(--size-input-lg)] text-14', + paddingLeft: 'pl-[var(--space-input-lg)]', + paddingRight: 'pr-[var(--space-input-lg)]', trailingPaddingRight: 'pr-9', }, }; diff --git a/apps/desktop/src/renderer/hooks/useFontSettings.ts b/apps/desktop/src/renderer/hooks/useFontSettings.ts index 542297e3187..6ce6914d071 100644 --- a/apps/desktop/src/renderer/hooks/useFontSettings.ts +++ b/apps/desktop/src/renderer/hooks/useFontSettings.ts @@ -9,6 +9,11 @@ import { useRef, useState, } from 'react'; +import { + UI_TEXT_TOKEN_SIZES, + SCALED_TAILWIND_TOKENS, + TAILWIND_LINE_HEIGHTS, +} from '../styles/generated/token-mappings'; import { APPEARANCE_LIMITS, @@ -43,34 +48,6 @@ const MIN_UI_FONT_SIZE = APPEARANCE_LIMITS.uiSize.min; const MIN_FONT_SIZE = APPEARANCE_LIMITS.codeSize.min; const MAX_FONT_SIZE = APPEARANCE_LIMITS.codeSize.max; -// DESIGN.md §3 numeric 字号白名单的运行时镜像;applyFontSettings 会按 -// 用户 UI 字号缩放覆写 globals.css 的静态默认值。 -const UI_TEXT_TOKEN_SIZES = [10, 11, 12, 13, 14, 15, 16, 18, 20, 24, 28] as const; - -const SCALED_TAILWIND_TOKENS = { - xs: 12, - sm: 14, - base: 16, - lg: 18, - xl: 20, - '2xl': 24, - '3xl': 30, - '4xl': 36, - '5xl': 48, -} as const; - -const TAILWIND_LINE_HEIGHTS = { - xs: 16, - sm: 20, - base: 24, - lg: 28, - xl: 28, - '2xl': 32, - '3xl': 36, - '4xl': 40, - '5xl': 48, -} as const; - const FontSettingsContext = createContext(undefined); export function clampFontSize(value: number, fallback = DEFAULT_CODE_FONT_SIZE): number { @@ -134,8 +111,8 @@ export function applyFontSettings(settings: FontSettings): void { set('--app-code-font-size', `${codeSize}px`); set('--app-ui-font-size', `${uiSize}px`); - for (const tokenSize of UI_TEXT_TOKEN_SIZES) { - set(`--text-${tokenSize}`, `${Math.round(tokenSize * scale)}px`); + for (const [tokenSize, base] of Object.entries(UI_TEXT_TOKEN_SIZES)) { + set(`--text-${tokenSize}`, `${Math.round(base * scale)}px`); } for (const [token, base] of Object.entries(SCALED_TAILWIND_TOKENS)) { set(`--text-${token}`, `${Math.round(base * scale)}px`); diff --git a/apps/desktop/src/renderer/lib/utils.ts b/apps/desktop/src/renderer/lib/utils.ts index 842ffac36d2..07cf0255b97 100644 --- a/apps/desktop/src/renderer/lib/utils.ts +++ b/apps/desktop/src/renderer/lib/utils.ts @@ -1,3 +1,4 @@ +import { NUMERIC_TEXT_CLASSES } from '../styles/generated/token-mappings'; import { type ClassValue, clsx } from 'clsx'; import { extendTailwindMerge } from 'tailwind-merge'; @@ -6,19 +7,7 @@ const customTwMerge = extendTailwindMerge({ classGroups: { 'font-size': [ { - text: [ - '10', - '11', - '12', - '13', - '14', - '15', - '16', - '18', - '20', - '24', - '28', - ], + text: NUMERIC_TEXT_CLASSES, }, ], }, diff --git a/apps/desktop/src/renderer/styles/generated/token-mappings.ts b/apps/desktop/src/renderer/styles/generated/token-mappings.ts new file mode 100644 index 00000000000..7e58c6226f6 --- /dev/null +++ b/apps/desktop/src/renderer/styles/generated/token-mappings.ts @@ -0,0 +1,49 @@ +// GENERATED by Terrazzo 2.7.1 — edit packages/design-tokens/src only. +export const UI_TEXT_TOKEN_SIZES = { + "10": 10, + "11": 11, + "12": 12, + "13": 13, + "14": 14, + "15": 15, + "16": 16, + "18": 18, + "20": 20, + "24": 24, + "28": 28 +}; +export const SCALED_TAILWIND_TOKENS = { + "xs": 12, + "sm": 14, + "base": 16, + "lg": 18, + "xl": 20, + "2xl": 24, + "3xl": 30, + "4xl": 36, + "5xl": 48 +}; +export const TAILWIND_LINE_HEIGHTS = { + "xs": 16, + "sm": 20, + "base": 24, + "lg": 28, + "xl": 28, + "2xl": 32, + "3xl": 36, + "4xl": 40, + "5xl": 48 +}; +export const NUMERIC_TEXT_CLASSES = [ + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "18", + "20", + "24", + "28" +]; diff --git a/apps/desktop/src/renderer/styles/generated/tokens.css b/apps/desktop/src/renderer/styles/generated/tokens.css new file mode 100644 index 00000000000..9f74dddc2e3 --- /dev/null +++ b/apps/desktop/src/renderer/styles/generated/tokens.css @@ -0,0 +1,106 @@ +/* GENERATED by Terrazzo 2.7.1 — edit packages/design-tokens/src only. */ +@layer base { + :root { + --app-font-ui-default: 'Inter Variable', Inter, -apple-system, BlinkMacSystemFont, 'PingFang SC', 'Hiragino Sans GB', 'HarmonyOS Sans SC', 'Microsoft YaHei UI', 'Microsoft YaHei', 'Noto Sans CJK SC', 'Source Han Sans SC', 'Segoe UI', Roboto, sans-serif; + --app-font-code-default: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei UI', 'Microsoft YaHei', 'Noto Sans CJK SC', 'Source Han Sans SC', monospace; + --app-code-font-size: 14px; + --app-ui-font-size: 14px; + --text-xs: 12px; + --text-sm: 14px; + --text-base: 16px; + --text-lg: 18px; + --text-xl: 20px; + --text-2xl: 24px; + --text-3xl: 30px; + --text-4xl: 36px; + --text-5xl: 48px; + --text-xs-line-height: 16px; + --text-sm-line-height: 20px; + --text-base-line-height: 24px; + --text-lg-line-height: 28px; + --text-xl-line-height: 28px; + --text-2xl-line-height: 32px; + --text-3xl-line-height: 36px; + --text-4xl-line-height: 40px; + --text-5xl-line-height: 48px; + --text-10: 10px; + --text-11: 11px; + --text-12: 12px; + --text-13: 13px; + --text-14: 14px; + --text-15: 15px; + --text-16: 16px; + --text-18: 18px; + --text-20: 20px; + --text-24: 24px; + --text-28: 28px; + --motion-instant: 80ms; + --motion-fast: 150ms; + --motion-base: 200ms; + --motion-enter: 250ms; + --motion-exit: 150ms; + --motion-spinner-cycle: 1000ms; + --motion-sidebar-title-marquee-per-viewport: 2400ms; + --motion-ease-out: cubic-bezier(0.16, 1, 0.3, 1); + --motion-ease-in: cubic-bezier(0.4, 0, 1, 1); + --motion-ease-move: cubic-bezier(0.4, 0, 0.2, 1); + --space-0: 0px; + --space-1: 0.25rem; + --space-2: 0.5rem; + --space-3: 0.75rem; + --space-4: 1rem; + --space-5: 1.25rem; + --space-6: 1.5rem; + --space-7: 1.75rem; + --space-8: 2rem; + --space-9: 2.25rem; + --space-10: 2.5rem; + --space-11: 2.75rem; + --space-12: 3rem; + --space-14: 3.5rem; + --space-16: 4rem; + --space-20: 5rem; + --space-24: 6rem; + --space-28: 7rem; + --space-32: 8rem; + --space-36: 9rem; + --space-40: 10rem; + --space-44: 11rem; + --space-48: 12rem; + --space-52: 13rem; + --space-56: 14rem; + --space-60: 15rem; + --space-64: 16rem; + --space-72: 18rem; + --space-80: 20rem; + --space-96: 24rem; + --space-px: 1px; + --space-0_5: 0.125rem; + --space-1_5: 0.375rem; + --space-2_5: 0.625rem; + --space-3_5: 0.875rem; + --radius-none: 0px; + --radius-default: 0.25rem; + --radius-xl: 0.75rem; + --radius-2xl: 1rem; + --radius-3xl: 1.5rem; + --radius-full: 9999px; + --size-input-lg: 40px; + --space-input-lg: 12px; + --radius-offset-md: 2px; + --radius-offset-sm: 4px; + --font-weight-normal: 400; + --font-weight-medium: 500; + --font-weight-semibold: 600; + --quota-bar-fill: var(--text-secondary); + --quota-bar-warn: var(--warning-fg); + --quota-bar-crit: var(--error-flat); + --quota-bar-track: var(--surface-chip); + } + .dark { + --quota-bar-fill: var(--text-secondary); + --quota-bar-warn: var(--warning-fg); + --quota-bar-crit: var(--error-flat); + --quota-bar-track: var(--surface-chip); + } +} diff --git a/apps/desktop/src/renderer/styles/globals.css b/apps/desktop/src/renderer/styles/globals.css index 071995ebfbf..9caede20eac 100644 --- a/apps/desktop/src/renderer/styles/globals.css +++ b/apps/desktop/src/renderer/styles/globals.css @@ -1,3 +1,4 @@ +@import './generated/tokens.css'; @import 'highlight.js/styles/github.css' layer(hljs-light); /* biome-ignore lint/suspicious/noUnknownAtRules: Tailwind directives are expanded by PostCSS. */ @@ -8,84 +9,7 @@ @tailwind utilities; @layer base { - :root { - --app-font-ui-default: - 'Inter Variable', Inter, -apple-system, BlinkMacSystemFont, 'PingFang SC', 'Hiragino Sans GB', - 'HarmonyOS Sans SC', 'Microsoft YaHei UI', 'Microsoft YaHei', 'Noto Sans CJK SC', - 'Source Han Sans SC', 'Segoe UI', Roboto, sans-serif; - /* 默认代码字体使用系统等宽字体(mac 上 SF Mono 不对网页暴露字体名, - 实际命中 Menlo;Win 命中 Consolas)。JetBrains Mono 已降级为可选预设、不再是 - 默认。CJK 显式回退 PingFang/雅黑,保证代码块中英混排统一等宽。 */ - --app-font-code-default: - ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Monaco, Consolas, 'Liberation Mono', - 'Courier New', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei UI', 'Microsoft YaHei', - 'Noto Sans CJK SC', 'Source Han Sans SC', monospace; - /* 代码字号体系基础:本期已接入块级代码缩放、内联不缩放、紧凑栏 -1px 补偿。 - Phase 2 会接 UI 字号(uiSize 已预留),并把下面手写转义的 compact 规则 - 收敛成统一 compact-delta 机制。 */ - --app-code-font-size: 14px; - --app-ui-font-size: 14px; - --text-xs: 12px; - --text-sm: 14px; - --text-base: 16px; - --text-lg: 18px; - --text-xl: 20px; - --text-2xl: 24px; - --text-3xl: 30px; - --text-4xl: 36px; - --text-5xl: 48px; - --text-xs-line-height: 16px; - --text-sm-line-height: 20px; - --text-base-line-height: 24px; - --text-lg-line-height: 28px; - --text-xl-line-height: 28px; - --text-2xl-line-height: 32px; - --text-3xl-line-height: 36px; - --text-4xl-line-height: 40px; - --text-5xl-line-height: 48px; - /* DESIGN.md §3 的 numeric 字号白名单默认值。运行时会由 - useFontSettings 按用户 UI 缩放覆写;档位须与 tailwind.config.ts、 - UI_TEXT_TOKEN_SIZES、tailwind-merge 字号组保持权威来源与消费端一致。 */ - --text-10: 10px; - --text-11: 11px; - --text-12: 12px; - --text-13: 13px; - --text-14: 14px; - --text-15: 15px; - --text-16: 16px; - --text-18: 18px; - --text-20: 20px; - --text-24: 24px; - --text-28: 28px; - - /* Motion token(全局动效档位,规范见 DESIGN.md §14.4):新增过渡/动画一律 - 引用这些 token,不要再各处硬编码时长和 cubic-bezier。5 档交互时长 + - spinner 语义循环例外、侧栏标题阅读例外 + 3 条曲线,与三档圆角同一哲学。 */ - --motion-instant: 80ms; /* hover 即时反馈、轻浮层退场 */ - --motion-fast: 150ms; /* 颜色/透明度状态切换、轻浮层入场(§14.4 功能性过渡上限) */ - --motion-base: 200ms; /* 尺寸变化:展开折叠、面板收展 */ - --motion-enter: 250ms; /* 重浮层(弹窗)入场 */ - --motion-exit: 150ms; /* 重浮层(弹窗)退场 */ - --motion-spinner-cycle: 1000ms; /* 功能性 loading spinner 完整一圈(§14.4 窄例外) */ - --motion-sidebar-title-marquee-per-viewport: 2400ms; /* 溢出标题每个可视宽度的阅读时长(§14.4 窄例外) */ - --motion-ease-out: cubic-bezier(0.16, 1, 0.3, 1); /* 入场/展开 */ - --motion-ease-in: cubic-bezier(0.4, 0, 1, 1); /* 退场 */ - --motion-ease-move: cubic-bezier(0.4, 0, 0.2, 1); /* 位置/尺寸插值 */ - - /* Claude 额度条的首帧 alias 与 ColorRegistry 一致:只复用已批准语义槽。 */ - --quota-bar-fill: var(--text-secondary); - --quota-bar-warn: var(--warning-fg); - --quota-bar-crit: var(--error-flat); - --quota-bar-track: var(--surface-chip); - } - - .dark { - --quota-bar-fill: var(--text-secondary); - --quota-bar-warn: var(--warning-fg); - --quota-bar-crit: var(--error-flat); - --quota-bar-track: var(--surface-chip); - } - + /* Static defaults and quota bootstrap aliases: generated/tokens.css. */ body { -webkit-user-select: text; user-select: text; diff --git a/apps/desktop/src/renderer/themes/__tests__/generatedEffortInitialization.test.ts b/apps/desktop/src/renderer/themes/__tests__/generatedEffortInitialization.test.ts new file mode 100644 index 00000000000..a31e2dea232 --- /dev/null +++ b/apps/desktop/src/renderer/themes/__tests__/generatedEffortInitialization.test.ts @@ -0,0 +1,30 @@ +import { describe, expect, it, vi } from 'vitest'; + +describe('generated effort inputs initialize without DOM or circular imports', () => { + it.each(['effort-first', 'registry-first'])( + '%s preserves registration order, caching and interpolation', + async (order) => { + vi.resetModules(); + expect(typeof document).toBe('undefined'); + if (order === 'registry-first') await import('../colors'); + const effort = await import('../effortTierColors'); + const { colorRegistry } = await import('../color-registry'); + const first = colorRegistry.getColors(); + await import('../colors'); + await import('../effortTierColors'); + expect(colorRegistry.getColors()).toEqual(first); + expect(first.length).toBe(541); + expect(first[0].id).toBe('surface'); + expect(effort.effortTierColor('high')).toBe('#3B82F6'); + expect(effort.effortTierColor('unknown')).toBe('#14B8A6'); + for (const [key, value] of Object.entries(effort.EFFORT_TIER_COLORS)) { + for (const mode of ['light', 'dark'] as const) + expect(colorRegistry.resolveDefault(`effort-tier-${key}`, mode)).toBe(value); + } + for (const [key, value] of Object.entries(effort.PRICE_TIER_COLORS)) { + for (const mode of ['light', 'dark'] as const) + expect(colorRegistry.resolveDefault(`price-tier-${key}`, mode)).toBe(value); + } + }, + ); +}); diff --git a/apps/desktop/src/renderer/themes/builtin/atom-one-light.ts b/apps/desktop/src/renderer/themes/builtin/atom-one-light.ts index 31f77a778ca..ed711e538f1 100644 --- a/apps/desktop/src/renderer/themes/builtin/atom-one-light.ts +++ b/apps/desktop/src/renderer/themes/builtin/atom-one-light.ts @@ -9,153 +9,126 @@ import type { Theme } from '../types'; * 主要差异在 accent (默认是近黑灰,这里换成蓝色) 和 surface (默认 #f8f8f6 * 偏暖,这里换成 #FAFAFA 偏中性)。 */ -const BLUE_PRIMARY = '#4078F2'; -const BLUE_DEEP = '#2050c0'; - -const SURFACE_BG = '#FAFAFA'; -const ELEVATED_BG = '#FFFFFF'; -const ELEVATED_SOFT_BG = '#EAEAEB'; -const HOVER_BG = '#E4E4E5'; -const CHIP_BG = '#EAEAEB'; -const BORDER_BG = '#D4D4D5'; -const SURFACE_BG_HSL = '0 0% 98%'; -const ELEVATED_BG_HSL = '0 0% 100%'; -const HOVER_BG_HSL = '240 2% 89%'; -const CHIP_BG_HSL = '240 2% 92%'; -const BORDER_BG_HSL = '240 2% 83%'; - -const TEXT_PRIMARY = '#383A42'; -const TEXT_SECONDARY = '#696c77'; -const TEXT_TERTIARY = '#A0A1A7'; -const TEXT_DISABLED = '#C8C8C9'; -const TEXT_PRIMARY_HSL = '224 8% 24%'; -const TEXT_SECONDARY_HSL = '220 6% 44%'; -const TEXT_TERTIARY_HSL = '228 4% 64%'; - -const slotOverrides = { - surface: SURFACE_BG, - 'surface-hsl': SURFACE_BG_HSL, - 'surface-elevated': ELEVATED_BG, - 'surface-elevated-soft': ELEVATED_SOFT_BG, - 'surface-card-ivory': ELEVATED_BG, - 'surface-chip': CHIP_BG, - 'surface-chip-alt': ELEVATED_SOFT_BG, - 'surface-hover': HOVER_BG, - 'surface-hover-soft': SURFACE_BG, - 'surface-hover-hsl': HOVER_BG_HSL, - 'surface-on-card': ELEVATED_BG, - 'border-default': BORDER_BG, - 'border-default-hsl': BORDER_BG_HSL, - 'border-shadcn-hsl': BORDER_BG_HSL, - 'border-transparent-mixed': 'transparent', - 'text-primary': TEXT_PRIMARY, - 'text-primary-on-dark': TEXT_PRIMARY, - 'text-primary-emphasis': TEXT_PRIMARY, - 'text-primary-inv': TEXT_PRIMARY, - 'text-primary-body-strong': TEXT_PRIMARY, - 'text-primary-hsl': TEXT_PRIMARY_HSL, - 'text-secondary': TEXT_SECONDARY, - 'text-secondary-cross': TEXT_SECONDARY, - 'text-secondary-mid': TEXT_SECONDARY, - 'text-tertiary': TEXT_TERTIARY, - 'text-tertiary-stone': TEXT_TERTIARY, - 'text-tertiary-mid': TEXT_TERTIARY, - 'text-tertiary-hsl': TEXT_TERTIARY_HSL, - 'text-disabled': TEXT_DISABLED, - 'text-disabled-tertiary': TEXT_DISABLED, - 'accent-cta-bg': BLUE_PRIMARY, - 'accent-cta-bg-pure': BLUE_PRIMARY, - 'accent-emphasis': BLUE_PRIMARY, - 'accent-soft': BLUE_DEEP, - 'accent-hover': BLUE_DEEP, - 'accent-pure-cta-fg': '#FFFFFF', - 'switch-track-on': BLUE_PRIMARY, +// 既有分组/对比度/否决依据:docs/design-rules/design-decision-log.md +// 「2026-09-11 DS-8 内置主题依据迁移」→ atom-one-light(生成区外保留)。 +// BEGIN GENERATED DS-8: theme +const GENERATED_OVERRIDES = { + "surface": "#FAFAFA", + "surface-hsl": "0 0% 98%", + "surface-elevated": "#FFFFFF", + "surface-elevated-soft": "#EAEAEB", + "surface-card-ivory": "#FFFFFF", + "surface-chip": "#EAEAEB", + "surface-chip-alt": "#EAEAEB", + "surface-hover": "#E4E4E5", + "surface-hover-soft": "#FAFAFA", + "surface-hover-hsl": "240 2% 89%", + "surface-on-card": "#FFFFFF", + "border-default": "#D4D4D5", + "border-default-hsl": "240 2% 83%", + "border-shadcn-hsl": "240 2% 83%", + "border-transparent-mixed": "transparent", + "text-primary": "#383A42", + "text-primary-on-dark": "#383A42", + "text-primary-emphasis": "#383A42", + "text-primary-inv": "#383A42", + "text-primary-body-strong": "#383A42", + "text-primary-hsl": "224 8% 24%", + "text-secondary": "#696c77", + "text-secondary-cross": "#696c77", + "text-secondary-mid": "#696c77", + "text-tertiary": "#A0A1A7", + "text-tertiary-stone": "#A0A1A7", + "text-tertiary-mid": "#A0A1A7", + "text-tertiary-hsl": "228 4% 64%", + "text-disabled": "#C8C8C9", + "text-disabled-tertiary": "#C8C8C9", + "accent-cta-bg": "#4078F2", + "accent-cta-bg-pure": "#4078F2", + "accent-emphasis": "#4078F2", + "accent-soft": "#2050c0", + "accent-hover": "#2050c0", + "accent-pure-cta-fg": "#FFFFFF", + "switch-track-on": "#4078F2", + "accent": "240 2% 89%", + "agent-actions-rail": "#D4D4D5", + "ask-checkbox-border": "#A0A1A7", + "background": "0 0% 98%", + "create-agent-control-bg": "#FAFAFA", + "create-agent-control-bg-hover": "#E4E4E5", + "create-agent-control-bg-pressed": "#E4E4E5", + "create-agent-control-border": "#D4D4D5", + "create-agent-control-icon": "#383A42", + "create-agent-control-text": "#383A42", + "create-agent-quick-card-bg": "#FAFAFA", + "create-agent-quick-card-bg-hover": "#E4E4E5", + "create-agent-quick-card-border": "#D4D4D5", + "create-agent-quick-card-icon": "#383A42", + "create-agent-quick-card-icon-bg": "#EAEAEB", + "create-agent-quick-card-text": "#383A42", + "create-agent-segment-inactive-text": "#696c77", + "create-agent-segment-track-bg": "#FAFAFA", + "send-btn-bg": "#FAFAFA", + "send-btn-icon": "#383A42", + "chat-input-chip-border": "#D4D4D5", + "chat-input-text": "#383A42", + "color-primary": "#383A42", + "confirm-bg": "#FFFFFF", + "confirm-btn-primary-bg": "#4078F2", + "confirm-btn-primary-text": "#FFFFFF", + "confirm-btn-secondary-border": "#D4D4D5", + "confirm-btn-secondary-hover": "rgba(0, 0, 0, 0.06)", + "confirm-btn-secondary-text": "#383A42", + "confirm-title": "#383A42", + "drop-overlay-bg": "rgba(64, 120, 242, 0.1)", + "file-chip-bg": "#EAEAEB", + "file-remove-bg": "#A0A1A7", + "info-700": "#2050c0", + "model-trigger-hover": "#E4E4E5", + "msg-link": "#4078F2", + "msg-scrollbar-hover": "#A0A1A7", + "muted": "240 2% 92%", + "muted-foreground": "220 6% 44%", + "perm-allow-btn-bg": "#4078F2", + "perm-allow-btn-text": "#FFFFFF", + "perm-allow-kbd-bg": "#EAEAEB", + "perm-allow-kbd-border": "#D4D4D5", + "perm-code-bg": "#EAEAEB", + "perm-item-selected-bg": "#EAEAEB", + "plan-outline-active-bg": "#EAEAEB", + "plan-toolbar-btn-hover-bg": "#E4E4E5", + "popover": "0 0% 100%", + "primary-foreground": "0 0% 100%", + "search-match-fg": "224 8% 24%", + "secondary": "240 2% 92%", + "settings-btn-primary-text": "#FFFFFF", + "settings-btn-secondary-hover-bg": "#E4E4E5", + "text-placeholder": "#C8C8C9", + "settings-integration-avatar-bg": "#EAEAEB", + "settings-logout-bg": "#EAEAEB", + "settings-menu-bg-hover": "#E4E4E5", + "settings-menu-bg-selected": "#EAEAEB", + "settings-source-link": "#4078F2", + "settings-theme-auto-dark": "#FAFAFA", + "sidebar-action-icon": "228 4% 64%", + "sidebar-item-active": "240 2% 92%", + "splash-bg": "0 0% 98%", + "splash-text": "220 6% 44%", + "splash-text-destructive": "224 8% 24%", + "splash-text-muted": "228 4% 64%", + "titlebar-icon": "220 6% 44%", + "tooltip-bg": "#383A42", + "tooltip-text": "#FAFAFA", + "update-btn-border": "#4078F2", + "update-btn-text": "#4078F2", } as const; +// END GENERATED DS-8: theme + -const singletonOverrides = { - accent: HOVER_BG_HSL, - 'agent-actions-rail': BORDER_BG, - 'ask-checkbox-border': TEXT_TERTIARY, - background: SURFACE_BG_HSL, - // CREATE AGENT 卡片 / 顶部 pill / 分段开关 + composer pill(#607): - // 卡片底与 surface 同值收敛(模板惯例),icon 圆底用 CHIP,send 走 tier1 反相 CTA。 - 'create-agent-control-bg': SURFACE_BG, - 'create-agent-control-bg-hover': HOVER_BG, - 'create-agent-control-bg-pressed': HOVER_BG, - 'create-agent-control-border': BORDER_BG, - 'create-agent-control-icon': TEXT_PRIMARY, - 'create-agent-control-text': TEXT_PRIMARY, - 'create-agent-quick-card-bg': SURFACE_BG, - 'create-agent-quick-card-bg-hover': HOVER_BG, - 'create-agent-quick-card-border': BORDER_BG, - 'create-agent-quick-card-icon': TEXT_PRIMARY, - 'create-agent-quick-card-icon-bg': CHIP_BG, - 'create-agent-quick-card-text': TEXT_PRIMARY, - 'create-agent-segment-inactive-text': TEXT_SECONDARY, - 'create-agent-segment-track-bg': SURFACE_BG, - 'send-btn-bg': SURFACE_BG, - 'send-btn-icon': TEXT_PRIMARY, - 'chat-input-chip-border': BORDER_BG, - 'chat-input-text': TEXT_PRIMARY, - 'color-primary': TEXT_PRIMARY, - 'confirm-bg': ELEVATED_BG, - 'confirm-btn-primary-bg': BLUE_PRIMARY, - 'confirm-btn-primary-text': '#FFFFFF', - 'confirm-btn-secondary-border': BORDER_BG, - 'confirm-btn-secondary-hover': 'rgba(0, 0, 0, 0.06)', - 'confirm-btn-secondary-text': TEXT_PRIMARY, - 'confirm-title': TEXT_PRIMARY, - 'drop-overlay-bg': 'rgba(64, 120, 242, 0.1)', - 'file-chip-bg': CHIP_BG, - 'file-remove-bg': TEXT_TERTIARY, - 'info-700': BLUE_DEEP, - 'model-trigger-hover': HOVER_BG, - 'msg-link': BLUE_PRIMARY, - 'msg-scrollbar-hover': TEXT_TERTIARY, - muted: CHIP_BG_HSL, - 'muted-foreground': TEXT_SECONDARY_HSL, - 'perm-allow-btn-bg': BLUE_PRIMARY, - 'perm-allow-btn-text': '#FFFFFF', - 'perm-allow-kbd-bg': CHIP_BG, - 'perm-allow-kbd-border': BORDER_BG, - 'perm-code-bg': ELEVATED_SOFT_BG, - 'perm-item-selected-bg': CHIP_BG, - 'plan-outline-active-bg': CHIP_BG, - 'plan-toolbar-btn-hover-bg': HOVER_BG, - popover: ELEVATED_BG_HSL, - 'primary-foreground': '0 0% 100%', - 'search-match-fg': TEXT_PRIMARY_HSL, - secondary: CHIP_BG_HSL, - 'settings-btn-primary-text': '#FFFFFF', - 'settings-btn-secondary-hover-bg': HOVER_BG, - // 用 disabled(比 tertiary 更淡)而非 tertiary:亮色背景下 tertiary≈2.6:1, - // 命中 docs/design-rules/cindy-design-system.md §4 禁用 Silver 的对比度,placeholder 需更淡才"读着像空"。 - 'text-placeholder': TEXT_DISABLED, - 'settings-integration-avatar-bg': CHIP_BG, - 'settings-logout-bg': CHIP_BG, - 'settings-menu-bg-hover': HOVER_BG, - 'settings-menu-bg-selected': CHIP_BG, - 'settings-source-link': BLUE_PRIMARY, - 'settings-theme-auto-dark': SURFACE_BG, - 'sidebar-action-icon': TEXT_TERTIARY_HSL, - 'sidebar-item-active': CHIP_BG_HSL, - 'splash-bg': SURFACE_BG_HSL, - 'splash-text': TEXT_SECONDARY_HSL, - 'splash-text-destructive': TEXT_PRIMARY_HSL, - 'splash-text-muted': TEXT_TERTIARY_HSL, - 'titlebar-icon': TEXT_SECONDARY_HSL, - 'tooltip-bg': TEXT_PRIMARY, - 'tooltip-text': SURFACE_BG, - 'update-btn-border': BLUE_PRIMARY, - 'update-btn-text': BLUE_PRIMARY, -} as const; export const atomOneLight: Theme = { id: 'atom-one-light', name: 'Atom One Light', type: 'light', - colors: { - ...slotOverrides, - ...singletonOverrides, - }, + colors: GENERATED_OVERRIDES, }; diff --git a/apps/desktop/src/renderer/themes/builtin/cindy-dark.ts b/apps/desktop/src/renderer/themes/builtin/cindy-dark.ts index 4f0581d899b..84ffeec21f3 100644 --- a/apps/desktop/src/renderer/themes/builtin/cindy-dark.ts +++ b/apps/desktop/src/renderer/themes/builtin/cindy-dark.ts @@ -9,185 +9,188 @@ import { CINDY_ACRYLIC_WINDOW_BACKING } from '../../../shared/windowBackdrop'; * 每个 override 注释来源;零自由裁量。 */ -const overrides = { - surface: '#181818', // 直映: 页底(纯中性) - 'surface-hsl': '0 0% 9.4%', // 页底 -> HSL - 'surface-elevated': '#1F1F1F', // 卡片/输入框 - 'surface-elevated-soft': '#1D1D1D', // hover/chip - 'surface-card-ivory': '#1F1F1F', // 卡片/输入框 - 'surface-chip': '#1D1D1D', // hover/chip - 'surface-chip-alt': '#1D1D1D', // hover/chip - 'surface-hover': '#1D1D1D', // hover/chip - 'surface-hover-soft': '#191919', // 柔和 hover/代码块底 - 'surface-hover-hsl': '0 0% 11.4%', // hover -> HSL - 'surface-on-card': '#181818', // 直映: 页底(纯中性) - 'switch-track-off': '#787878', // 关闭态轨道:值与依据见决策表(用户调参 2026-08-05) - 'switch-track-on': '#EEEEEE', // 开启态轨道:值与依据见决策表(用户调参 2026-08-05) - 'status-badge-fg': '#121212', // 反相深字: 平移 - 'border-default': '#313131', // 边框 - 'border-default-hsl': '0 0% 19.2%', // 边框 -> HSL - 'border-shadcn-hsl': '0 0% 19.2%', // 边框 -> HSL - 'border-transparent-mixed': '#313131', // 边框 - 'text-primary': '#D4D4D4', // 直映: 正文 - 'text-primary-on-dark': '#FFFFFF', // 深底/红底前景白 - 'text-primary-emphasis': '#FFFFFF', // 强调正文 - 'text-primary-inv': '#181818', // 直映: 页底(纯中性) - 'text-primary-body-strong': '#D4D4D4', // 直映: 正文 - 'text-primary-hsl': '0.0 0.0% 83.1%', // 正文 -> HSL - 'text-secondary': '#6F6F6F', // 直映: 二级信息; U2 例外 - 'text-secondary-cross': '#6F6F6F', // 直映: 二级信息; U2 例外 - 'text-secondary-mid': '#C1C1C1', // 三级转中性(等亮度,2026-08-13) - 'text-tertiary': '#C1C1C1', // 三级转中性(等亮度,2026-08-13) - 'text-tertiary-stone': '#C1C1C1', // 三级转中性(等亮度,2026-08-13) - 'text-tertiary-mid': '#C1C1C1', // 三级转中性(等亮度,2026-08-13) - 'text-tertiary-hsl': '0.0 0.0% 75.7%', // 三级 -> HSL - 'text-disabled': '#C1C1C1', // 三级转中性(等亮度,2026-08-13) - 'text-disabled-tertiary': '#C1C1C1', // 三级转中性(等亮度,2026-08-13) - 'accent-cta-bg': '#EEEEEE', // E1D 反相中性底 - 'accent-cta-bg-pure': '#EEEEEE', // E1D 反相中性底 - 'accent-emphasis': '#EEEEEE', // E1D 反相中性底 - 'accent-soft': '#D4D4D4', // E1D pressed 中性 - 'accent-hover': '#E2E2E2', // E1D hover 中性 - 'accent-pure-cta-fg': '#151515', // 反相深字(浅钮上) - accent: '0 0% 11.4%', // hover -> HSL - 'agent-actions-rail': '#313131', // 边框 - 'ask-checkbox-border': '#C1C1C1', // 三级转中性(等亮度,2026-08-13) - 'ask-header-chip-bg': '#282828', // 菜单 hover/提问卡纸片档 - 'ask-send-disabled-bg': '#282828', // 菜单 hover/提问卡纸片档 - 'ask-option-list-bg': '#282828', // 菜单 hover/提问卡纸片档 - 'ask-option-hover': '#323232', // 禁用底/option hover 档 - background: '0 0% 9.4%', // 页底 -> HSL - 'chat-input-bg': '#1F1F1F', // 卡片/输入框 - 'chat-input-border-focus': 'rgba(193, 193, 193, 0.30)', // 聚焦描边: 三级色 30% 派生 - 'chat-input-chip-border': '#313131', // 边框 - 'chat-input-text': '#D4D4D4', // 正文 - 'color-primary': '#D4D4D4', // 正文 - 'caret-accent': '#417CDD', // 用户改稿 2026-07-18:光标撤红改回蓝(对齐 focus 蓝 #417CDD) - 'confirm-bg': '#1F1F1F', // 卡片/输入框 - 'confirm-btn-primary-bg': '#EEEEEE', // E1D C 类裁决 1:反相中性 - 'confirm-btn-primary-text': '#151515', // 反相深字(浅钮上) - 'confirm-btn-secondary-border': '#313131', // 边框 - 'confirm-btn-secondary-hover': 'rgba(255, 255, 255, 0.08)', // 中性 alpha hover - 'confirm-btn-secondary-text': '#D4D4D4', // 正文 - 'confirm-title': '#D4D4D4', // 正文 - 'file-chip-bg': '#292929', // 文件纸片 - 'file-remove-bg': '#C1C1C1', // 三级转中性(等亮度,2026-08-13) - 'info-700': '#93C5FD', // 信息/链接蓝 - 'model-trigger-hover': '#1D1D1D', // hover/chip - // 下拉行 hover/选中底:必须比弹层面板(surface-elevated #312F2F)更亮才可见。 - // surface-hover(#2F2D2D)是为"压在页面底 #2A2828 上"调的,比抬起的面板还暗→行高亮隐形。 - // 故菜单行专用 token 单独抬亮一档(+12/通道),模型/权限/+ 三个菜单共用它,hover 统一可见。 - 'model-item-hover': '#2B2B2B', // 下拉行 hover: 抬亮到面板之上(沿革见 2026-07 注) - 'msg-link': '#93C5FD', // 链接蓝 - 'msg-scrollbar-hover': '#3E3E3E', // 弱档 - 'msg-user-bg': '#1F1F1F', // 卡片/输入框 - muted: '0 0% 11.4%', // hover -> HSL - 'muted-foreground': '0.0 0.0% 75.7%', // 三级 -> HSL - 'perm-auto-selected-text': '#417CDD', // auto approval 功能色(E5D 定稿 2026-07-17,light/dark 同值) - 'perm-allow-btn-bg': '#EEEEEE', // E1D C 类裁决 2:反相中性 - 'perm-allow-btn-text': '#151515', // 反相深字(浅钮上) - 'perm-allow-kbd-bg': 'rgba(0, 0, 0, 0.08)', // kbd bg:随反相浅钮的深翻译层(修复 2026-07-19:原页面级深灰在浅钮上吞掉近黑字) - 'perm-allow-kbd-border': 'rgba(0, 0, 0, 0.20)', // 边框:同上 - 'perm-code-bg': '#191919', // 柔和 hover/代码块底 - 'perm-item-selected-bg': '#1D1D1D', // hover/chip - 'plan-outline-active-bg': '#1D1D1D', // hover/chip - 'plan-toolbar-btn-hover-bg': '#323232', // 禁用底/option hover 档 - popover: '0 0% 12.2%', // 卡片 -> HSL - 'primary-foreground': '0.0 0.0% 100.0%', // 白前景 - 'search-match-fg': '0.0 0.0% 83.1%', // search fg - secondary: '0 0% 11.4%', // hover -> HSL - 'settings-btn-primary-text': '#151515', // 反相深字(浅钮上) - 'settings-btn-secondary-hover-bg': '#1D1D1D', // hover/chip - 'text-placeholder': '#C1C1C1', // 三级转中性(等亮度,2026-08-13) - 'settings-integration-avatar-bg': '#1D1D1D', // hover/chip - 'settings-logout-bg': '#1F1F1F', // 卡片/输入框 - 'settings-menu-bg-hover': '#282828', // 菜单 hover/提问卡纸片档 - 'settings-menu-bg-selected': '#282828', // 卡片锚定: 比卡片 #1F1F1F 亮一档(压在设置卡上的选中态) - 'settings-source-link': '#93C5FD', // 可访问链接蓝 - 'settings-theme-auto-dark': '#181818', // Auto 预览: 新暗色底 - 'sidebar-action-icon': '0 0% 43.5%', // E1D 侧栏层级:二级暗灰 #6F6F6F(时间戳/RemoteProjectIcon) - 'cmd-palette-item-meta': '#6F6F6F', // E1D 侧栏层级:二级暗灰(分组标签/meta) - 'sidebar-item-active-foreground': '#151515', // 反相深字(浅钮上) - 'sidebar-item-active-border': 'transparent', // 用户三次改稿 2026-07-20:选中胶囊彻底去描边 - 'sidebar-item-active': '0.0 0.0% 93.3%', // 用户二次改稿 2026-07-20:反相胶囊 #EEEEEE 浅底(同 accent-cta-bg) - 'splash-bg': '0 0% 9.4%', // 页底 -> HSL - 'splash-text': '0.0 0.0% 75.7%', // 三级 -> HSL - 'splash-text-destructive': '0.0 0.0% 100.0%', // destructive splash text - 'splash-text-muted': '0.0 0.0% 75.7%', // 三级 -> HSL - 'titlebar-icon': '0.0 0.0% 75.7%', // 三级 -> HSL - 'tooltip-bg': '#181818', // 直映: 页底(纯中性) - 'tooltip-text': '#FFFFFF', // tooltip 白字 - 'update-btn-border': '#EEEEEE', // E1D 中性底(实心胶囊,与 bg 同色) - 'update-btn-bg': '#EEEEEE', // E1D §15.10 反相中性:dark 浅底,承载深字 - 'update-btn-text': '#151515', // 反相深字(浅钮上) - 'update-btn-hover': '#E2E2E2', // E1D §15.10 四态 hover(实心,非 alpha 叠加) - 'accent-foreground': '0.0 0.0% 83.1%', // 裁决: accent 成对中性前景 - 'panel-bg': '#181818', // 直映: 页底(纯中性) - primary: '0.0 0.0% 93.3%', // E1D C 类裁决 3:反相中性 HSL - ring: '217.3 69.7% 56.1%', // 固定蓝(E5D 定稿 2026-07-17 #417CDD HSL,取代 #3b82f6) - 'settings-theme-auto-light': '#F2F2ED', // Auto 预览: 新页底(暖象牙) - foreground: '0.0 0.0% 83.1%', // alias closure 直接值 - border: '0 0% 19.2%', // 边框 -> HSL - input: '0 0% 19.2%', // 边框 -> HSL - 'secondary-foreground': '0.0 0.0% 83.1%', // alias closure - 'popover-foreground': '0.0 0.0% 83.1%', // alias closure - titlebar: '0 0% 9.4%', // 页底 -> HSL - 'titlebar-border': '0 0% 19.2%', // 边框 -> HSL - 'titlebar-button-hover': '0 0% 11.4%', // hover -> HSL - 'titlebar-control-hover': '0 0% 11.4%', // hover -> HSL - sidebar: '0 0% 9.4%', // 页底 -> HSL - 'sidebar-border': '0 0% 19.2%', // 边框 -> HSL - 'sidebar-item-hover': '0.0 0.0% 100.0% / 0.09', // 玻璃面 hover 半透明化 2026-07-21:白 9% 叠加(原实色 hsl(0 2.2% 18%) 在暗玻璃底上的等价叠加量),壁纸可继续透过 - 'sidebar-search-bg': '0 0% 9.4%', // 页底 -> HSL - 'sidebar-search-input-bg': 'rgba(0, 0, 0, 0.25)', // 玻璃面搜索输入框 2026-07-21:黑 25% 下陷字段感(与 hover 白 9% 方向相反,可区分"可输入") - 'sidebar-muted': '0 0% 43.5%', // E1D 侧栏层级:二级暗灰 #6F6F6F(行首图标普通态) - 'surface-translucent-sidebar': CINDY_ACRYLIC_WINDOW_BACKING.dark, // 侧栏玻璃: 用户调参 2026-08-11(黑 5 度 85%) - 'surface-translucent-main': '#181818', // 直映: 页底(纯中性) - 'surface-translucent-overlay': 'rgba(21, 21, 21, 0.80)', // 浮层玻璃: 平移 - 'composer-pill-bg': '#272727', // composer pill - 'composer-pill-icon': '#D9D9D9', // E2 composer pill 图标(dark) - 'send-btn-bg': '#EEEEEE', // R4 D1/D2 反相中性可用底 - 'send-btn-icon': '#151515', // 反相深字(浅钮上) - 'send-btn-disabled-bg': '#323232', // 禁用底/option hover 档 - 'send-btn-disabled-icon': '#464646', // 禁用图标 - 'send-btn-hover-bg': '#E2E2E2', // E1D 反相中性 hover(lead 四态) - 'send-btn-pressed-bg': '#D4D4D4', // E1D 反相中性 pressed(lead 四态) - // ── 2026-08 色阶改版新增 override(原走注册表默认值,现按新阶梯定值;决策表 §9)── - 'completion-badge-fg': '#121212', // 反相深字: 平移 - 'create-agent-control-bg': '#272727', // composer pill - 'create-agent-control-bg-hover': '#323232', // 禁用底/option hover 档 - 'create-agent-control-bg-pressed': '#3E3E3E', // 弱档 - 'create-agent-control-border': '#313131', // 边框 - 'create-agent-quick-card-bg': '#1F1F1F', // 卡片/输入框 - 'create-agent-quick-card-bg-hover': '#292929', // 文件纸片 - 'create-agent-quick-card-border': '#313131', // 边框 - 'create-agent-quick-card-icon-bg': '#181818', // 直映: 页底(纯中性) - 'create-agent-segment-track-bg': '#181818', // 直映: 页底(纯中性) - 'create-agent-send-disabled-bg': '#323232', // 禁用底/option hover 档 - 'create-agent-send-disabled-icon': '#464646', // 禁用图标 - 'create-agent-send-icon': '#151515', // 反相深字(浅钮上) - 'md-table-bg': 'rgba(26, 26, 26, 0.55)', // 表格条纹: 平移 - // ── 对侧入表锚定: 值 = 本侧此前的注册表解析原值(解析结果不变, 仅为决策表双边冻结)── - 'ask-badge-bg': 'var(--surface-chip)', - 'cmd-palette-item-hover': 'var(--surface-hover)', - 'create-agent-control-icon': '#D9D9D9', - 'create-agent-control-text': '#D4D4D4', - 'create-agent-quick-card-icon': '#D4D4D4', - 'create-agent-quick-card-text': '#D4D4D4', - 'create-agent-segment-inactive-text': '#6F6F6F', - 'settings-integration-avatar-border': 'rgba(255, 255, 255, 0.08)', - 'sidebar-list-muted': '#6F6F6F', - 'sidebar-nav-text': '#D4D4D4', - 'sidebar-user-card-bg-hover': 'rgba(255, 255, 255, 0.10)', - 'sidebar-user-card-border': 'rgba(255, 255, 255, 0.13)', - 'sidebar-user-card-text': '#D4D4D4', +// 既有分组/对比度/否决依据:docs/design-rules/design-decision-log.md +// 「2026-09-11 DS-8 内置主题依据迁移」→ cindy-dark(生成区外保留)。 +// BEGIN GENERATED DS-8: theme +const GENERATED_OVERRIDES = { + "surface": "#181818", // 直映: 页底(纯中性) + "surface-hsl": "0 0% 9.4%", // 页底 -> HSL + "surface-elevated": "#1F1F1F", // 卡片/输入框 + "surface-elevated-soft": "#1D1D1D", // hover/chip + "surface-card-ivory": "#1F1F1F", // 卡片/输入框 + "surface-chip": "#1D1D1D", // hover/chip + "surface-chip-alt": "#1D1D1D", // hover/chip + "surface-hover": "#1D1D1D", // hover/chip + "surface-hover-soft": "#191919", // 柔和 hover/代码块底 + "surface-hover-hsl": "0 0% 11.4%", // hover -> HSL + "surface-on-card": "#181818", // 直映: 页底(纯中性) + "switch-track-off": "#787878", // 关闭态轨道:值与依据见决策表(用户调参 2026-08-05) + "switch-track-on": "#EEEEEE", // 开启态轨道:值与依据见决策表(用户调参 2026-08-05) + "status-badge-fg": "#121212", // 反相深字: 平移 + "border-default": "#313131", // 边框 + "border-default-hsl": "0 0% 19.2%", // 边框 -> HSL + "border-shadcn-hsl": "0 0% 19.2%", // 边框 -> HSL + "border-transparent-mixed": "#313131", // 边框 + "text-primary": "#D4D4D4", // 直映: 正文 + "text-primary-on-dark": "#FFFFFF", // 深底/红底前景白 + "text-primary-emphasis": "#FFFFFF", // 强调正文 + "text-primary-inv": "#181818", // 直映: 页底(纯中性) + "text-primary-body-strong": "#D4D4D4", // 直映: 正文 + "text-primary-hsl": "0.0 0.0% 83.1%", // 正文 -> HSL + "text-secondary": "#6F6F6F", // 直映: 二级信息; U2 例外 + "text-secondary-cross": "#6F6F6F", // 直映: 二级信息; U2 例外 + "text-secondary-mid": "#C1C1C1", // 三级转中性(等亮度,2026-08-13) + "text-tertiary": "#C1C1C1", // 三级转中性(等亮度,2026-08-13) + "text-tertiary-stone": "#C1C1C1", // 三级转中性(等亮度,2026-08-13) + "text-tertiary-mid": "#C1C1C1", // 三级转中性(等亮度,2026-08-13) + "text-tertiary-hsl": "0.0 0.0% 75.7%", // 三级 -> HSL + "text-disabled": "#C1C1C1", // 三级转中性(等亮度,2026-08-13) + "text-disabled-tertiary": "#C1C1C1", // 三级转中性(等亮度,2026-08-13) + "accent-cta-bg": "#EEEEEE", // E1D 反相中性底 + "accent-cta-bg-pure": "#EEEEEE", // E1D 反相中性底 + "accent-emphasis": "#EEEEEE", // E1D 反相中性底 + "accent-soft": "#D4D4D4", // E1D pressed 中性 + "accent-hover": "#E2E2E2", // E1D hover 中性 + "accent-pure-cta-fg": "#151515", // 反相深字(浅钮上) + "accent": "0 0% 11.4%", // hover -> HSL + "agent-actions-rail": "#313131", // 边框 + "ask-checkbox-border": "#C1C1C1", // 三级转中性(等亮度,2026-08-13) + "ask-header-chip-bg": "#282828", // 菜单 hover/提问卡纸片档 + "ask-send-disabled-bg": "#282828", // 菜单 hover/提问卡纸片档 + "ask-option-list-bg": "#282828", // 菜单 hover/提问卡纸片档 + "ask-option-hover": "#323232", // 禁用底/option hover 档 + "background": "0 0% 9.4%", // 页底 -> HSL + "chat-input-bg": "#1F1F1F", // 卡片/输入框 + "chat-input-border-focus": "rgba(193, 193, 193, 0.30)", // 聚焦描边: 三级色 30% 派生 + "chat-input-chip-border": "#313131", // 边框 + "chat-input-text": "#D4D4D4", // 正文 + "color-primary": "#D4D4D4", // 正文 + "caret-accent": "#417CDD", // 用户改稿 2026-07-18:光标撤红改回蓝(对齐 focus 蓝 #417CDD) + "confirm-bg": "#1F1F1F", // 卡片/输入框 + "confirm-btn-primary-bg": "#EEEEEE", // E1D C 类裁决 1:反相中性 + "confirm-btn-primary-text": "#151515", // 反相深字(浅钮上) + "confirm-btn-secondary-border": "#313131", // 边框 + "confirm-btn-secondary-hover": "rgba(255, 255, 255, 0.08)", // 中性 alpha hover + "confirm-btn-secondary-text": "#D4D4D4", // 正文 + "confirm-title": "#D4D4D4", // 正文 + "file-chip-bg": "#292929", // 文件纸片 + "file-remove-bg": "#C1C1C1", // 三级转中性(等亮度,2026-08-13) + "info-700": "#93C5FD", // 信息/链接蓝 + "model-trigger-hover": "#1D1D1D", // hover/chip + "model-item-hover": "#2B2B2B", // 下拉行 hover: 抬亮到面板之上(沿革见 2026-07 注) + "msg-link": "#93C5FD", // 链接蓝 + "msg-scrollbar-hover": "#3E3E3E", // 弱档 + "msg-user-bg": "#1F1F1F", // 卡片/输入框 + "muted": "0 0% 11.4%", // hover -> HSL + "muted-foreground": "0.0 0.0% 75.7%", // 三级 -> HSL + "perm-auto-selected-text": "#417CDD", // auto approval 功能色(E5D 定稿 2026-07-17,light/dark 同值) + "perm-allow-btn-bg": "#EEEEEE", // E1D C 类裁决 2:反相中性 + "perm-allow-btn-text": "#151515", // 反相深字(浅钮上) + "perm-allow-kbd-bg": "rgba(0, 0, 0, 0.08)", // kbd bg:随反相浅钮的深翻译层(修复 2026-07-19:原页面级深灰在浅钮上吞掉近黑字) + "perm-allow-kbd-border": "rgba(0, 0, 0, 0.20)", // 边框:同上 + "perm-code-bg": "#191919", // 柔和 hover/代码块底 + "perm-item-selected-bg": "#1D1D1D", // hover/chip + "plan-outline-active-bg": "#1D1D1D", // hover/chip + "plan-toolbar-btn-hover-bg": "#323232", // 禁用底/option hover 档 + "popover": "0 0% 12.2%", // 卡片 -> HSL + "primary-foreground": "0.0 0.0% 100.0%", // 白前景 + "search-match-fg": "0.0 0.0% 83.1%", // search fg + "secondary": "0 0% 11.4%", // hover -> HSL + "settings-btn-primary-text": "#151515", // 反相深字(浅钮上) + "settings-btn-secondary-hover-bg": "#1D1D1D", // hover/chip + "text-placeholder": "#C1C1C1", // 三级转中性(等亮度,2026-08-13) + "settings-integration-avatar-bg": "#1D1D1D", // hover/chip + "settings-logout-bg": "#1F1F1F", // 卡片/输入框 + "settings-menu-bg-hover": "#282828", // 菜单 hover/提问卡纸片档 + "settings-menu-bg-selected": "#282828", // 卡片锚定: 比卡片 #1F1F1F 亮一档(压在设置卡上的选中态) + "settings-source-link": "#93C5FD", // 可访问链接蓝 + "settings-theme-auto-dark": "#181818", // Auto 预览: 新暗色底 + "sidebar-action-icon": "0 0% 43.5%", // E1D 侧栏层级:二级暗灰 #6F6F6F(时间戳/RemoteProjectIcon) + "cmd-palette-item-meta": "#6F6F6F", // E1D 侧栏层级:二级暗灰(分组标签/meta) + "sidebar-item-active-foreground": "#151515", // 反相深字(浅钮上) + "sidebar-item-active-border": "transparent", // 用户三次改稿 2026-07-20:选中胶囊彻底去描边 + "sidebar-item-active": "0.0 0.0% 93.3%", // 用户二次改稿 2026-07-20:反相胶囊 #EEEEEE 浅底(同 accent-cta-bg) + "splash-bg": "0 0% 9.4%", // 页底 -> HSL + "splash-text": "0.0 0.0% 75.7%", // 三级 -> HSL + "splash-text-destructive": "0.0 0.0% 100.0%", // destructive splash text + "splash-text-muted": "0.0 0.0% 75.7%", // 三级 -> HSL + "titlebar-icon": "0.0 0.0% 75.7%", // 三级 -> HSL + "tooltip-bg": "#181818", // 直映: 页底(纯中性) + "tooltip-text": "#FFFFFF", // tooltip 白字 + "update-btn-border": "#EEEEEE", // E1D 中性底(实心胶囊,与 bg 同色) + "update-btn-bg": "#EEEEEE", // E1D §15.10 反相中性:dark 浅底,承载深字 + "update-btn-text": "#151515", // 反相深字(浅钮上) + "update-btn-hover": "#E2E2E2", // E1D §15.10 四态 hover(实心,非 alpha 叠加) + "accent-foreground": "0.0 0.0% 83.1%", // 裁决: accent 成对中性前景 + "panel-bg": "#181818", // 直映: 页底(纯中性) + "primary": "0.0 0.0% 93.3%", // E1D C 类裁决 3:反相中性 HSL + "ring": "217.3 69.7% 56.1%", // 固定蓝(E5D 定稿 2026-07-17 #417CDD HSL,取代 #3b82f6) + "settings-theme-auto-light": "#F2F2ED", // Auto 预览: 新页底(暖象牙) + "foreground": "0.0 0.0% 83.1%", // alias closure 直接值 + "border": "0 0% 19.2%", // 边框 -> HSL + "input": "0 0% 19.2%", // 边框 -> HSL + "secondary-foreground": "0.0 0.0% 83.1%", // alias closure + "popover-foreground": "0.0 0.0% 83.1%", // alias closure + "titlebar": "0 0% 9.4%", // 页底 -> HSL + "titlebar-border": "0 0% 19.2%", // 边框 -> HSL + "titlebar-button-hover": "0 0% 11.4%", // hover -> HSL + "titlebar-control-hover": "0 0% 11.4%", // hover -> HSL + "sidebar": "0 0% 9.4%", // 页底 -> HSL + "sidebar-border": "0 0% 19.2%", // 边框 -> HSL + "sidebar-item-hover": "0.0 0.0% 100.0% / 0.09", // 玻璃面 hover 半透明化 2026-07-21:白 9% 叠加(原实色 hsl(0 2.2% 18%) 在暗玻璃底上的等价叠加量),壁纸可继续透过 + "sidebar-search-bg": "0 0% 9.4%", // 页底 -> HSL + "sidebar-search-input-bg": "rgba(0, 0, 0, 0.25)", // 玻璃面搜索输入框 2026-07-21:黑 25% 下陷字段感(与 hover 白 9% 方向相反,可区分"可输入") + "sidebar-muted": "0 0% 43.5%", // E1D 侧栏层级:二级暗灰 #6F6F6F(行首图标普通态) + "surface-translucent-main": "#181818", // 直映: 页底(纯中性) + "surface-translucent-overlay": "rgba(21, 21, 21, 0.80)", // 浮层玻璃: 平移 + "composer-pill-bg": "#272727", // composer pill + "composer-pill-icon": "#D9D9D9", // E2 composer pill 图标(dark) + "send-btn-bg": "#EEEEEE", // R4 D1/D2 反相中性可用底 + "send-btn-icon": "#151515", // 反相深字(浅钮上) + "send-btn-disabled-bg": "#323232", // 禁用底/option hover 档 + "send-btn-disabled-icon": "#464646", // 禁用图标 + "send-btn-hover-bg": "#E2E2E2", // E1D 反相中性 hover(lead 四态) + "send-btn-pressed-bg": "#D4D4D4", // E1D 反相中性 pressed(lead 四态) + "completion-badge-fg": "#121212", // 反相深字: 平移 + "create-agent-control-bg": "#272727", // composer pill + "create-agent-control-bg-hover": "#323232", // 禁用底/option hover 档 + "create-agent-control-bg-pressed": "#3E3E3E", // 弱档 + "create-agent-control-border": "#313131", // 边框 + "create-agent-quick-card-bg": "#1F1F1F", // 卡片/输入框 + "create-agent-quick-card-bg-hover": "#292929", // 文件纸片 + "create-agent-quick-card-border": "#313131", // 边框 + "create-agent-quick-card-icon-bg": "#181818", // 直映: 页底(纯中性) + "create-agent-segment-track-bg": "#181818", // 直映: 页底(纯中性) + "create-agent-send-disabled-bg": "#323232", // 禁用底/option hover 档 + "create-agent-send-disabled-icon": "#464646", // 禁用图标 + "create-agent-send-icon": "#151515", // 反相深字(浅钮上) + "md-table-bg": "rgba(26, 26, 26, 0.55)", // 表格条纹: 平移 + "ask-badge-bg": "var(--surface-chip)", + "cmd-palette-item-hover": "var(--surface-hover)", + "create-agent-control-icon": "#D9D9D9", + "create-agent-control-text": "#D4D4D4", + "create-agent-quick-card-icon": "#D4D4D4", + "create-agent-quick-card-text": "#D4D4D4", + "create-agent-segment-inactive-text": "#6F6F6F", + "settings-integration-avatar-border": "rgba(255, 255, 255, 0.08)", + "sidebar-list-muted": "#6F6F6F", + "sidebar-nav-text": "#D4D4D4", + "sidebar-user-card-bg-hover": "rgba(255, 255, 255, 0.10)", + "sidebar-user-card-border": "rgba(255, 255, 255, 0.13)", + "sidebar-user-card-text": "#D4D4D4", } as const; +// END GENERATED DS-8: theme + + export const cindyDark: Theme = { id: 'cindy-dark', name: 'CINDY Dark', type: 'dark', - colors: overrides, + colors: { + ...GENERATED_OVERRIDES, + "surface-translucent-sidebar": CINDY_ACRYLIC_WINDOW_BACKING.dark, + }, // U5 品牌版横向 logo:白字+红箭头,深底可见。 brand: { logo: { src: cindyLogoDark } }, }; diff --git a/apps/desktop/src/renderer/themes/builtin/cindy-light.ts b/apps/desktop/src/renderer/themes/builtin/cindy-light.ts index 43dce127a66..a17c1a52898 100644 --- a/apps/desktop/src/renderer/themes/builtin/cindy-light.ts +++ b/apps/desktop/src/renderer/themes/builtin/cindy-light.ts @@ -9,184 +9,188 @@ import { CINDY_ACRYLIC_WINDOW_BACKING } from '../../../shared/windowBackdrop'; * 交互态分页面/卡片双锚定。每个 override 注释来源;零自由裁量。 */ -const overrides = { - surface: '#F2F2ED', // 直映: 页底(暖象牙) - 'surface-hsl': '60.0 16.1% 93.9%', // 页底 -> HSL - 'surface-elevated': '#FDFDF8', // 直映: 卡片/输入框(留暖近白) - 'surface-elevated-soft': '#FAFAF5', // 阶梯: 次级卡片 - 'surface-card-ivory': '#FDFDF8', // 直映: 卡片/输入框(留暖近白) - 'surface-chip': '#EEEEE9', // 阶梯: hover/chip(压暗于页底) - 'surface-chip-alt': '#FAFAF5', // 阶梯: 次级卡片 - 'surface-hover': '#EEEEE9', // 阶梯: hover/chip(压暗于页底) - 'surface-hover-soft': '#F0F0EB', // 阶梯: 柔和 hover - 'surface-hover-hsl': '60.0 12.8% 92.4%', // hover -> HSL - 'surface-on-card': '#FFFFFF', // 裁决: 中性反相前景,不作红 CTA 专用 - 'switch-track-off': '#888888', // 关闭态轨道:值与依据见决策表(用户调参 2026-08-05) - 'switch-track-on': '#4A4D51', // 开启态轨道:值与依据见决策表(用户调参 2026-08-05) - 'status-badge-fg': '#1F1F1F', // §7 必炸点:值经队列震荡后按 HEAD 冻结(#1F1F1F,5.61:1 × #FF6600 ≥4.5),批准依据:用户亲批方案 2026-07-17 - 'border-default': '#E4E4DF', // 直映: 边框(冷转暖) - 'border-default-hsl': '60.0 8.5% 88.4%', // 边框 -> HSL - 'border-shadcn-hsl': '60.0 8.5% 88.4%', // 边框 -> HSL - 'border-transparent-mixed': 'transparent', // light transparent / dark 边框 - 'text-primary': '#1A1A1A', // 正文: 近黑中性(2026-08 文字阶梯) - 'text-primary-on-dark': '#FFFFFF', // 深底/红底前景白 - 'text-primary-emphasis': '#0C0C0C', // 强调正文: 最深档(用户定 #0C0C0C,2026-08-12) - 'text-primary-inv': '#FFFFFF', // 反相文字 - 'text-primary-body-strong': '#1A1A1A', // 正文: 近黑中性(2026-08 文字阶梯) - 'text-primary-hsl': '0.0 0.0% 10.2%', // 正文 -> HSL - 'text-secondary': '#888883', // 二级: 暖灰,>=3.0 下限(2026-08 改版,取代 U2 原值) - 'text-secondary-cross': '#888883', // 二级同档(原更淡档并入 3.0 地板) - 'text-secondary-mid': '#6B6B67', // 三级: 等亮度暖化 - 'text-tertiary': '#6B6B67', // 三级: 等亮度暖化 - 'text-tertiary-stone': '#6B6B67', // 三级: 等亮度暖化 - 'text-tertiary-mid': '#6B6B67', // 三级: 等亮度暖化 - 'text-tertiary-hsl': '60.0 1.9% 41.2%', // 三级 -> HSL - 'text-disabled': '#6B6B67', // 三级: 等亮度暖化 - 'text-disabled-tertiary': '#6B6B67', // 三级: 等亮度暖化 - 'accent-cta-bg': '#3C3F43', // E1D 反相中性底(用户批准 2026-07-17,不用红) - 'accent-cta-bg-pure': '#3C3F43', // E1D 反相中性底 - 'accent-emphasis': '#3C3F43', // E1D 反相中性底 - 'accent-soft': '#25282C', // E1D pressed 中性(soft→pressed) - 'accent-hover': '#2E3237', // E1D hover 中性 - 'accent-pure-cta-fg': '#FCFCFC', // E1D 中性字(非白) - accent: '60.0 12.8% 92.4%', // hover -> HSL - 'agent-actions-rail': '#E4E4DF', // 直映: 边框(冷转暖) - 'ask-checkbox-border': '#6B6B67', // 三级: 等亮度暖化 - 'ask-option-list-bg': '#FFFFFF', // ask 卡选项列表面: 纯白浮在 #F8F8F8 卡底上(2026-07-23 ask 卡整改) - background: '60.0 16.1% 93.9%', // 页底 -> HSL - 'chat-input-bg': '#FDFDF8', // 直映: 卡片/输入框(留暖近白) - 'chat-input-border-focus': 'rgba(107, 107, 103, 0.30)', // 聚焦描边: 三级色 30% 派生 - 'chat-input-chip-border': '#E4E4DF', // 直映: 边框(冷转暖) - 'chat-input-text': '#1A1A1A', // 正文: 近黑中性(2026-08 文字阶梯) - 'color-primary': '#1A1A1A', // 正文: 近黑中性(2026-08 文字阶梯) - 'caret-accent': '#417CDD', // 用户改稿 2026-07-18:光标撤红改回蓝(对齐 focus 蓝 #417CDD) - 'confirm-bg': '#FDFDF8', // 直映: 卡片/输入框(留暖近白) - 'confirm-btn-primary-bg': '#3C3F43', // E1D C 类裁决 1:普通确认反相中性(danger 确认另设) - 'confirm-btn-primary-text': '#FCFCFC', // E1D 反相中性字 - 'confirm-btn-secondary-border': '#E4E4DF', // 直映: 边框(冷转暖) - 'confirm-btn-secondary-hover': 'rgba(0, 0, 0, 0.06)', // 中性 alpha hover - 'confirm-btn-secondary-text': '#1A1A1A', // 正文: 近黑中性(2026-08 文字阶梯) - 'confirm-title': '#1A1A1A', // 正文: 近黑中性(2026-08 文字阶梯) - 'file-chip-bg': '#DFDFDA', // 阶梯: 弱档 - 'file-remove-bg': '#6B6B67', // 三级: 等亮度暖化 - 'info-700': '#1D4ED8', // 信息/链接蓝 - 'model-trigger-hover': '#EEEEE9', // 阶梯: hover/chip(压暗于页底) - // 下拉行 hover/选中底:surface-hover(#F1F1F1)相对面板(#F8F8F8)只差 7,行高亮几乎看不清。 - // 菜单行专用 token 压深一档(-14/通道)使 hover 在面板上清晰,模型/权限/+ 三菜单共用。 - 'model-item-hover': '#EFEFEA', // 下拉行 hover: 锚定弹层面板(比面板暗 ~12%),勿改回页底锚定 - 'msg-link': '#1D4ED8', // 链接蓝 - 'msg-scrollbar-hover': '#DFDFDA', // 阶梯: 弱档 - 'msg-user-bg': '#FDFDF8', // 直映: 卡片/输入框(留暖近白) - muted: '60.0 12.8% 92.4%', // hover -> HSL - 'muted-foreground': '60.0 1.9% 41.2%', // 三级 -> HSL - 'perm-auto-selected-text': '#417CDD', // auto approval 功能色(E5D 定稿 2026-07-17,light/dark 同值) - 'perm-allow-btn-bg': '#3C3F43', // E1D C 类裁决 2:反相中性(警示由橙 chip 承担) - 'perm-allow-btn-text': '#FCFCFC', // E1D 反相中性字 - 'perm-allow-kbd-bg': 'rgba(255, 255, 255, 0.16)', // kbd bg:随反相深钮的浅翻译层(修复 2026-07-19:原页面级浅灰在深钮上字底同亮) - 'perm-allow-kbd-border': 'rgba(255, 255, 255, 0.30)', // 边框:同上 - 'perm-code-bg': '#FAFAF5', // 代码块底: 卡片锚定(比卡片暗 ~2.6%) - 'perm-item-selected-bg': '#F6F6F1', // 卡片锚定: 权限弹层选中行(2026-08-14) - 'plan-outline-active-bg': '#F6F6F1', // 卡片锚定: 计划大纲激活行(2026-08-14) - 'plan-toolbar-btn-hover-bg': '#E8E8E3', // 阶梯: 菜单 hover - popover: '60.0 55.6% 98.2%', // 卡片 -> HSL - 'primary-foreground': '0.0 0.0% 100.0%', // 白前景 - 'search-match-fg': '0.0 0.0% 10.2%', // 正文 -> HSL - secondary: '60.0 12.8% 92.4%', // hover -> HSL - 'settings-btn-primary-text': '#FCFCFC', // E1D 中性字 - 'settings-btn-secondary-hover-bg': '#F6F6F1', // 卡片锚定: 设置卡上的次级按钮 hover(2026-08-14) - 'text-placeholder': '#6B6B67', // 三级: 等亮度暖化 - 'settings-integration-avatar-bg': '#FDFDF8', // 直映: 卡片/输入框(留暖近白) - 'settings-logout-bg': '#FDFDF8', // 直映: 卡片/输入框(留暖近白) - 'settings-menu-bg-hover': '#E8E8E3', // 阶梯: 菜单 hover - 'settings-menu-bg-selected': '#F6F6F1', // 卡片锚定: 比卡片暗 ~6%(压在弹层上的选中态,2026-08-14) - 'settings-source-link': '#1D4ED8', // 可访问链接蓝 - 'settings-theme-auto-dark': '#181818', // Auto 预览: 新暗色底 - 'sidebar-action-icon': '60.0 2.1% 52.4%', // 侧栏灰字: 同上 - 'cmd-palette-item-meta': '#888883', // 二级同档(同上) - 'sidebar-item-active-foreground': '#FCFCFC', // 用户二次改稿 2026-07-20:反相胶囊,light 深底浅字(同 accent-pure-cta-fg) - 'sidebar-item-active-border': 'transparent', // 用户三次改稿 2026-07-20:选中胶囊彻底去描边 - 'sidebar-item-active': '214.3 5.5% 24.9%', // 用户二次改稿 2026-07-20:反相胶囊 #3C3F43 深底(同 accent-cta-bg) - 'splash-bg': '60.0 16.1% 93.9%', // 页底 -> HSL - 'splash-text': '60.0 1.9% 41.2%', // 三级 -> HSL - 'splash-text-destructive': '0.0 0.0% 10.2%', // 正文 -> HSL - 'splash-text-muted': '60.0 1.9% 41.2%', // 三级 -> HSL - 'titlebar-icon': '60.0 1.9% 41.2%', // 三级 -> HSL - 'tooltip-bg': '#3C3F43', // tooltip 深底 - 'tooltip-text': '#FFFFFF', // tooltip 白字 - 'update-btn-border': '#3C3F43', // E1D 中性底(实心胶囊,与 bg 同色) - 'update-btn-bg': '#3C3F43', // E1D §15.10 反相中性:light 深底,承载浅字 - 'update-btn-text': '#FCFCFC', // E1D 中性字(#FCFCFC on #3C3F43 = 10.32:1) - 'update-btn-hover': '#2E3237', // E1D §15.10 四态 hover(实心,非 alpha 叠加) - 'accent-foreground': '0.0 0.0% 10.2%', // 正文 -> HSL - 'panel-bg': '#F2F2ED', // 直映: 页底(暖象牙) - primary: '214.3 5.5% 24.9%', // E1D C 类裁决 3:反相中性 HSL - ring: '217.3 69.7% 56.1%', // 固定蓝(E5D 定稿 2026-07-17 #417CDD HSL,取代 #3b82f6) - 'settings-theme-auto-light': '#F2F2ED', // Auto 预览: 新页底 - foreground: '0.0 0.0% 10.2%', // 正文 -> HSL - border: '60.0 8.5% 88.4%', // 边框 -> HSL - input: '60.0 8.5% 88.4%', // 边框 -> HSL - 'secondary-foreground': '0.0 0.0% 10.2%', // 正文 -> HSL - 'popover-foreground': '0.0 0.0% 10.2%', // 正文 -> HSL - titlebar: '60.0 16.1% 93.9%', // 页底 -> HSL - 'titlebar-border': '60.0 8.5% 88.4%', // 边框 -> HSL - 'titlebar-button-hover': '60.0 12.8% 92.4%', // hover -> HSL - 'titlebar-control-hover': '60.0 12.8% 92.4%', // hover -> HSL - sidebar: '60.0 12.8% 92.4%', // 侧栏兜底: 与侧栏玻璃同色(无玻璃平台回落用) - 'sidebar-border': '60.0 8.5% 88.4%', // 边框 -> HSL - 'sidebar-item-hover': '0.0 0.0% 0.0% / 0.05', // 玻璃面 hover 半透明化 2026-07-21:黑 5% 叠加(原实色 #F1F1F1 在白底上的等价叠加量),毛玻璃侧栏上壁纸可继续透过 - 'sidebar-search-bg': '60.0 12.8% 92.4%', // 侧栏搜索区: 同侧栏面 - 'sidebar-search-input-bg': 'rgba(255, 255, 250, 0.55)', // 暖化 - 'sidebar-muted': '60.0 2.1% 52.4%', // 侧栏灰字: 同上 - 'surface-translucent-sidebar': CINDY_ACRYLIC_WINDOW_BACKING.light, // 侧栏面: 独立压暗一档+85% 遮盖(用户调参 2026-08-17, 与深色对齐) - 'surface-translucent-main': '#F2F2ED', // 直映: 页底(暖象牙) - 'surface-translucent-overlay': 'rgba(251, 251, 246, 0.90)', // 浮层玻璃: 暖化 - 'composer-pill-bg': '#FFFFFA', // 近白档 - 'composer-pill-icon': '#1A1A1A', // 正文: 近黑中性(2026-08 文字阶梯) - 'send-btn-bg': '#3C3F43', // R4 D1/D2 反相中性可用底(不用红,用户裁决) - 'send-btn-icon': '#FCFCFC', // R4 反相中性字 - 'send-btn-disabled-bg': '#444242', // R4 唤醒态禁用灰底(§2.6) - 'send-btn-disabled-icon': '#585555', // R4 禁用灰字(§2.6 send 图标) - 'send-btn-hover-bg': '#2E3237', // E1D 反相中性 hover(lead 四态) - 'send-btn-pressed-bg': '#25282C', // E1D 反相中性 pressed(lead 四态) - // ── 2026-08 色阶改版新增 override(原走注册表默认值,现按新阶梯定值;决策表 §9)── - 'ask-badge-bg': '#F6F6F1', // 卡片锚定: 提问卡序号角标(2026-08-14) - 'ask-header-chip-bg': '#F6F6F1', // 卡片锚定: 压在提问卡上(2026-08-14) - 'cmd-palette-item-hover': '#F6F6F1', // 卡片锚定: 命令面板行 hover(2026-08-14) - 'create-agent-control-bg': '#FFFFFA', // 近白档 - 'create-agent-control-border': '#E4E4DF', // 直映: 边框(冷转暖) - 'create-agent-control-icon': '#1A1A1A', // 正文: 近黑中性(2026-08 文字阶梯) - 'create-agent-control-text': '#1A1A1A', // 正文: 近黑中性(2026-08 文字阶梯) - 'create-agent-quick-card-bg': '#FDFDF8', // 直映: 卡片/输入框(留暖近白) - 'create-agent-quick-card-bg-hover': '#F6F6F1', // 卡片锚定: 快捷卡 hover(2026-08-14) - 'create-agent-quick-card-border': '#E4E4DF', // 直映: 边框(冷转暖) - 'create-agent-quick-card-icon': '#1A1A1A', // 正文: 近黑中性(2026-08 文字阶梯) - 'create-agent-quick-card-icon-bg': '#F2F2ED', // 直映: 页底(暖象牙) - 'create-agent-quick-card-text': '#1A1A1A', // 正文: 近黑中性(2026-08 文字阶梯) - 'create-agent-segment-inactive-text': '#9D9D98', // 未激活态: WCAG 豁免档,勿并入二级 - 'create-agent-segment-track-bg': '#F2F2ED', // 直映: 页底(暖象牙) - 'create-agent-send-disabled-bg': '#F2F2ED', // 直映: 页底(暖象牙) - 'create-agent-send-disabled-icon': '#9D9D98', // 禁用态: WCAG 豁免档 - 'md-table-bg': 'rgba(241, 241, 236, 0.55)', // 表格条纹: 跟页底暖化 - 'settings-integration-avatar-border': '#EDEDE8', // 阶梯: 头像描边 - 'sidebar-list-muted': '#888883', // 侧栏灰字: 暖化+压深至 >=3.0(2026-08-13) - 'sidebar-nav-text': '#1A1A1A', // 正文: 近黑中性(2026-08 文字阶梯) - 'sidebar-user-card-bg-hover': 'rgba(26, 26, 26, 0.06)', // 正文色 6% 派生 - 'sidebar-user-card-border': 'rgba(26, 26, 26, 0.10)', // 正文色 10% 派生 - 'sidebar-user-card-text': '#1A1A1A', // 正文: 近黑中性(2026-08 文字阶梯) - // ── 对侧入表锚定: 值 = 本侧此前的注册表解析原值(解析结果不变, 仅为决策表双边冻结)── - 'ask-option-hover': 'var(--surface-hover-soft)', - 'ask-send-disabled-bg': 'var(--surface-elevated-soft)', - 'completion-badge-fg': '#1f1f1e', - 'create-agent-control-bg-hover': 'var(--surface-hover)', - 'create-agent-control-bg-pressed': 'var(--surface-hover-soft)', - 'create-agent-send-icon': '#FCFCFC', +// 既有分组/对比度/否决依据:docs/design-rules/design-decision-log.md +// 「2026-09-11 DS-8 内置主题依据迁移」→ cindy-light(生成区外保留)。 +// BEGIN GENERATED DS-8: theme +const GENERATED_OVERRIDES = { + "surface": "#F2F2ED", // 直映: 页底(暖象牙) + "surface-hsl": "60.0 16.1% 93.9%", // 页底 -> HSL + "surface-elevated": "#FDFDF8", // 直映: 卡片/输入框(留暖近白) + "surface-elevated-soft": "#FAFAF5", // 阶梯: 次级卡片 + "surface-card-ivory": "#FDFDF8", // 直映: 卡片/输入框(留暖近白) + "surface-chip": "#EEEEE9", // 阶梯: hover/chip(压暗于页底) + "surface-chip-alt": "#FAFAF5", // 阶梯: 次级卡片 + "surface-hover": "#EEEEE9", // 阶梯: hover/chip(压暗于页底) + "surface-hover-soft": "#F0F0EB", // 阶梯: 柔和 hover + "surface-hover-hsl": "60.0 12.8% 92.4%", // hover -> HSL + "surface-on-card": "#FFFFFF", // 裁决: 中性反相前景,不作红 CTA 专用 + "switch-track-off": "#888888", // 关闭态轨道:值与依据见决策表(用户调参 2026-08-05) + "switch-track-on": "#4A4D51", // 开启态轨道:值与依据见决策表(用户调参 2026-08-05) + "status-badge-fg": "#1F1F1F", // §7 必炸点:值经队列震荡后按 HEAD 冻结(#1F1F1F,5.61:1 × #FF6600 ≥4.5),批准依据:用户亲批方案 2026-07-17 + "border-default": "#E4E4DF", // 直映: 边框(冷转暖) + "border-default-hsl": "60.0 8.5% 88.4%", // 边框 -> HSL + "border-shadcn-hsl": "60.0 8.5% 88.4%", // 边框 -> HSL + "border-transparent-mixed": "transparent", // light transparent / dark 边框 + "text-primary": "#1A1A1A", // 正文: 近黑中性(2026-08 文字阶梯) + "text-primary-on-dark": "#FFFFFF", // 深底/红底前景白 + "text-primary-emphasis": "#0C0C0C", // 强调正文: 最深档(用户定 #0C0C0C,2026-08-12) + "text-primary-inv": "#FFFFFF", // 反相文字 + "text-primary-body-strong": "#1A1A1A", // 正文: 近黑中性(2026-08 文字阶梯) + "text-primary-hsl": "0.0 0.0% 10.2%", // 正文 -> HSL + "text-secondary": "#888883", // 二级: 暖灰,>=3.0 下限(2026-08 改版,取代 U2 原值) + "text-secondary-cross": "#888883", // 二级同档(原更淡档并入 3.0 地板) + "text-secondary-mid": "#6B6B67", // 三级: 等亮度暖化 + "text-tertiary": "#6B6B67", // 三级: 等亮度暖化 + "text-tertiary-stone": "#6B6B67", // 三级: 等亮度暖化 + "text-tertiary-mid": "#6B6B67", // 三级: 等亮度暖化 + "text-tertiary-hsl": "60.0 1.9% 41.2%", // 三级 -> HSL + "text-disabled": "#6B6B67", // 三级: 等亮度暖化 + "text-disabled-tertiary": "#6B6B67", // 三级: 等亮度暖化 + "accent-cta-bg": "#3C3F43", // E1D 反相中性底(用户批准 2026-07-17,不用红) + "accent-cta-bg-pure": "#3C3F43", // E1D 反相中性底 + "accent-emphasis": "#3C3F43", // E1D 反相中性底 + "accent-soft": "#25282C", // E1D pressed 中性(soft→pressed) + "accent-hover": "#2E3237", // E1D hover 中性 + "accent-pure-cta-fg": "#FCFCFC", // E1D 中性字(非白) + "accent": "60.0 12.8% 92.4%", // hover -> HSL + "agent-actions-rail": "#E4E4DF", // 直映: 边框(冷转暖) + "ask-checkbox-border": "#6B6B67", // 三级: 等亮度暖化 + "ask-option-list-bg": "#FFFFFF", // ask 卡选项列表面: 纯白浮在 #F8F8F8 卡底上(2026-07-23 ask 卡整改) + "background": "60.0 16.1% 93.9%", // 页底 -> HSL + "chat-input-bg": "#FDFDF8", // 直映: 卡片/输入框(留暖近白) + "chat-input-border-focus": "rgba(107, 107, 103, 0.30)", // 聚焦描边: 三级色 30% 派生 + "chat-input-chip-border": "#E4E4DF", // 直映: 边框(冷转暖) + "chat-input-text": "#1A1A1A", // 正文: 近黑中性(2026-08 文字阶梯) + "color-primary": "#1A1A1A", // 正文: 近黑中性(2026-08 文字阶梯) + "caret-accent": "#417CDD", // 用户改稿 2026-07-18:光标撤红改回蓝(对齐 focus 蓝 #417CDD) + "confirm-bg": "#FDFDF8", // 直映: 卡片/输入框(留暖近白) + "confirm-btn-primary-bg": "#3C3F43", // E1D C 类裁决 1:普通确认反相中性(danger 确认另设) + "confirm-btn-primary-text": "#FCFCFC", // E1D 反相中性字 + "confirm-btn-secondary-border": "#E4E4DF", // 直映: 边框(冷转暖) + "confirm-btn-secondary-hover": "rgba(0, 0, 0, 0.06)", // 中性 alpha hover + "confirm-btn-secondary-text": "#1A1A1A", // 正文: 近黑中性(2026-08 文字阶梯) + "confirm-title": "#1A1A1A", // 正文: 近黑中性(2026-08 文字阶梯) + "file-chip-bg": "#DFDFDA", // 阶梯: 弱档 + "file-remove-bg": "#6B6B67", // 三级: 等亮度暖化 + "info-700": "#1D4ED8", // 信息/链接蓝 + "model-trigger-hover": "#EEEEE9", // 阶梯: hover/chip(压暗于页底) + "model-item-hover": "#EFEFEA", // 下拉行 hover: 锚定弹层面板(比面板暗 ~12%),勿改回页底锚定 + "msg-link": "#1D4ED8", // 链接蓝 + "msg-scrollbar-hover": "#DFDFDA", // 阶梯: 弱档 + "msg-user-bg": "#FDFDF8", // 直映: 卡片/输入框(留暖近白) + "muted": "60.0 12.8% 92.4%", // hover -> HSL + "muted-foreground": "60.0 1.9% 41.2%", // 三级 -> HSL + "perm-auto-selected-text": "#417CDD", // auto approval 功能色(E5D 定稿 2026-07-17,light/dark 同值) + "perm-allow-btn-bg": "#3C3F43", // E1D C 类裁决 2:反相中性(警示由橙 chip 承担) + "perm-allow-btn-text": "#FCFCFC", // E1D 反相中性字 + "perm-allow-kbd-bg": "rgba(255, 255, 255, 0.16)", // kbd bg:随反相深钮的浅翻译层(修复 2026-07-19:原页面级浅灰在深钮上字底同亮) + "perm-allow-kbd-border": "rgba(255, 255, 255, 0.30)", // 边框:同上 + "perm-code-bg": "#FAFAF5", // 代码块底: 卡片锚定(比卡片暗 ~2.6%) + "perm-item-selected-bg": "#F6F6F1", // 卡片锚定: 权限弹层选中行(2026-08-14) + "plan-outline-active-bg": "#F6F6F1", // 卡片锚定: 计划大纲激活行(2026-08-14) + "plan-toolbar-btn-hover-bg": "#E8E8E3", // 阶梯: 菜单 hover + "popover": "60.0 55.6% 98.2%", // 卡片 -> HSL + "primary-foreground": "0.0 0.0% 100.0%", // 白前景 + "search-match-fg": "0.0 0.0% 10.2%", // 正文 -> HSL + "secondary": "60.0 12.8% 92.4%", // hover -> HSL + "settings-btn-primary-text": "#FCFCFC", // E1D 中性字 + "settings-btn-secondary-hover-bg": "#F6F6F1", // 卡片锚定: 设置卡上的次级按钮 hover(2026-08-14) + "text-placeholder": "#6B6B67", // 三级: 等亮度暖化 + "settings-integration-avatar-bg": "#FDFDF8", // 直映: 卡片/输入框(留暖近白) + "settings-logout-bg": "#FDFDF8", // 直映: 卡片/输入框(留暖近白) + "settings-menu-bg-hover": "#E8E8E3", // 阶梯: 菜单 hover + "settings-menu-bg-selected": "#F6F6F1", // 卡片锚定: 比卡片暗 ~6%(压在弹层上的选中态,2026-08-14) + "settings-source-link": "#1D4ED8", // 可访问链接蓝 + "settings-theme-auto-dark": "#181818", // Auto 预览: 新暗色底 + "sidebar-action-icon": "60.0 2.1% 52.4%", // 侧栏灰字: 同上 + "cmd-palette-item-meta": "#888883", // 二级同档(同上) + "sidebar-item-active-foreground": "#FCFCFC", // 用户二次改稿 2026-07-20:反相胶囊,light 深底浅字(同 accent-pure-cta-fg) + "sidebar-item-active-border": "transparent", // 用户三次改稿 2026-07-20:选中胶囊彻底去描边 + "sidebar-item-active": "214.3 5.5% 24.9%", // 用户二次改稿 2026-07-20:反相胶囊 #3C3F43 深底(同 accent-cta-bg) + "splash-bg": "60.0 16.1% 93.9%", // 页底 -> HSL + "splash-text": "60.0 1.9% 41.2%", // 三级 -> HSL + "splash-text-destructive": "0.0 0.0% 10.2%", // 正文 -> HSL + "splash-text-muted": "60.0 1.9% 41.2%", // 三级 -> HSL + "titlebar-icon": "60.0 1.9% 41.2%", // 三级 -> HSL + "tooltip-bg": "#3C3F43", // tooltip 深底 + "tooltip-text": "#FFFFFF", // tooltip 白字 + "update-btn-border": "#3C3F43", // E1D 中性底(实心胶囊,与 bg 同色) + "update-btn-bg": "#3C3F43", // E1D §15.10 反相中性:light 深底,承载浅字 + "update-btn-text": "#FCFCFC", // E1D 中性字(#FCFCFC on #3C3F43 = 10.32:1) + "update-btn-hover": "#2E3237", // E1D §15.10 四态 hover(实心,非 alpha 叠加) + "accent-foreground": "0.0 0.0% 10.2%", // 正文 -> HSL + "panel-bg": "#F2F2ED", // 直映: 页底(暖象牙) + "primary": "214.3 5.5% 24.9%", // E1D C 类裁决 3:反相中性 HSL + "ring": "217.3 69.7% 56.1%", // 固定蓝(E5D 定稿 2026-07-17 #417CDD HSL,取代 #3b82f6) + "settings-theme-auto-light": "#F2F2ED", // Auto 预览: 新页底 + "foreground": "0.0 0.0% 10.2%", // 正文 -> HSL + "border": "60.0 8.5% 88.4%", // 边框 -> HSL + "input": "60.0 8.5% 88.4%", // 边框 -> HSL + "secondary-foreground": "0.0 0.0% 10.2%", // 正文 -> HSL + "popover-foreground": "0.0 0.0% 10.2%", // 正文 -> HSL + "titlebar": "60.0 16.1% 93.9%", // 页底 -> HSL + "titlebar-border": "60.0 8.5% 88.4%", // 边框 -> HSL + "titlebar-button-hover": "60.0 12.8% 92.4%", // hover -> HSL + "titlebar-control-hover": "60.0 12.8% 92.4%", // hover -> HSL + "sidebar": "60.0 12.8% 92.4%", // 侧栏兜底: 与侧栏玻璃同色(无玻璃平台回落用) + "sidebar-border": "60.0 8.5% 88.4%", // 边框 -> HSL + "sidebar-item-hover": "0.0 0.0% 0.0% / 0.05", // 玻璃面 hover 半透明化 2026-07-21:黑 5% 叠加(原实色 #F1F1F1 在白底上的等价叠加量),毛玻璃侧栏上壁纸可继续透过 + "sidebar-search-bg": "60.0 12.8% 92.4%", // 侧栏搜索区: 同侧栏面 + "sidebar-search-input-bg": "rgba(255, 255, 250, 0.55)", // 暖化 + "sidebar-muted": "60.0 2.1% 52.4%", // 侧栏灰字: 同上 + "surface-translucent-main": "#F2F2ED", // 直映: 页底(暖象牙) + "surface-translucent-overlay": "rgba(251, 251, 246, 0.90)", // 浮层玻璃: 暖化 + "composer-pill-bg": "#FFFFFA", // 近白档 + "composer-pill-icon": "#1A1A1A", // 正文: 近黑中性(2026-08 文字阶梯) + "send-btn-bg": "#3C3F43", // R4 D1/D2 反相中性可用底(不用红,用户裁决) + "send-btn-icon": "#FCFCFC", // R4 反相中性字 + "send-btn-disabled-bg": "#444242", // R4 唤醒态禁用灰底(§2.6) + "send-btn-disabled-icon": "#585555", // R4 禁用灰字(§2.6 send 图标) + "send-btn-hover-bg": "#2E3237", // E1D 反相中性 hover(lead 四态) + "send-btn-pressed-bg": "#25282C", // E1D 反相中性 pressed(lead 四态) + "ask-badge-bg": "#F6F6F1", // 卡片锚定: 提问卡序号角标(2026-08-14) + "ask-header-chip-bg": "#F6F6F1", // 卡片锚定: 压在提问卡上(2026-08-14) + "cmd-palette-item-hover": "#F6F6F1", // 卡片锚定: 命令面板行 hover(2026-08-14) + "create-agent-control-bg": "#FFFFFA", // 近白档 + "create-agent-control-border": "#E4E4DF", // 直映: 边框(冷转暖) + "create-agent-control-icon": "#1A1A1A", // 正文: 近黑中性(2026-08 文字阶梯) + "create-agent-control-text": "#1A1A1A", // 正文: 近黑中性(2026-08 文字阶梯) + "create-agent-quick-card-bg": "#FDFDF8", // 直映: 卡片/输入框(留暖近白) + "create-agent-quick-card-bg-hover": "#F6F6F1", // 卡片锚定: 快捷卡 hover(2026-08-14) + "create-agent-quick-card-border": "#E4E4DF", // 直映: 边框(冷转暖) + "create-agent-quick-card-icon": "#1A1A1A", // 正文: 近黑中性(2026-08 文字阶梯) + "create-agent-quick-card-icon-bg": "#F2F2ED", // 直映: 页底(暖象牙) + "create-agent-quick-card-text": "#1A1A1A", // 正文: 近黑中性(2026-08 文字阶梯) + "create-agent-segment-inactive-text": "#9D9D98", // 未激活态: WCAG 豁免档,勿并入二级 + "create-agent-segment-track-bg": "#F2F2ED", // 直映: 页底(暖象牙) + "create-agent-send-disabled-bg": "#F2F2ED", // 直映: 页底(暖象牙) + "create-agent-send-disabled-icon": "#9D9D98", // 禁用态: WCAG 豁免档 + "md-table-bg": "rgba(241, 241, 236, 0.55)", // 表格条纹: 跟页底暖化 + "settings-integration-avatar-border": "#EDEDE8", // 阶梯: 头像描边 + "sidebar-list-muted": "#888883", // 侧栏灰字: 暖化+压深至 >=3.0(2026-08-13) + "sidebar-nav-text": "#1A1A1A", // 正文: 近黑中性(2026-08 文字阶梯) + "sidebar-user-card-bg-hover": "rgba(26, 26, 26, 0.06)", // 正文色 6% 派生 + "sidebar-user-card-border": "rgba(26, 26, 26, 0.10)", // 正文色 10% 派生 + "sidebar-user-card-text": "#1A1A1A", // 正文: 近黑中性(2026-08 文字阶梯) + "ask-option-hover": "var(--surface-hover-soft)", + "ask-send-disabled-bg": "var(--surface-elevated-soft)", + "completion-badge-fg": "#1f1f1e", + "create-agent-control-bg-hover": "var(--surface-hover)", + "create-agent-control-bg-pressed": "var(--surface-hover-soft)", + "create-agent-send-icon": "#FCFCFC", } as const; +// END GENERATED DS-8: theme + + export const cindyLight: Theme = { id: 'cindy-light', name: 'CINDY Light', type: 'light', - colors: overrides, + colors: { + ...GENERATED_OVERRIDES, + "surface-translucent-sidebar": CINDY_ACRYLIC_WINDOW_BACKING.light, + }, // U5 品牌版横向 logo:黑字+红箭头,浅底可见。 brand: { logo: { src: cindyLogoLight } }, }; diff --git a/apps/desktop/src/renderer/themes/builtin/default-dark.ts b/apps/desktop/src/renderer/themes/builtin/default-dark.ts index 586e24ac737..e2571f75d07 100644 --- a/apps/desktop/src/renderer/themes/builtin/default-dark.ts +++ b/apps/desktop/src/renderer/themes/builtin/default-dark.ts @@ -1,10 +1,14 @@ import type { Theme } from '../types'; +// BEGIN GENERATED DS-8: theme +const GENERATED_OVERRIDES = { + "perm-auto-selected-text": "#417CDD", // E5D 定稿 2026-07-17 +} as const; +// END GENERATED DS-8: theme + export const defaultDark: Theme = { id: 'default-dark', name: 'Default Dark', type: 'dark', - colors: { - 'perm-auto-selected-text': '#417CDD', // E5D 定稿 2026-07-17 - }, + colors: GENERATED_OVERRIDES, }; diff --git a/apps/desktop/src/renderer/themes/builtin/default-light.ts b/apps/desktop/src/renderer/themes/builtin/default-light.ts index dce1f1814e8..791353acd07 100644 --- a/apps/desktop/src/renderer/themes/builtin/default-light.ts +++ b/apps/desktop/src/renderer/themes/builtin/default-light.ts @@ -1,10 +1,14 @@ import type { Theme } from '../types'; +// BEGIN GENERATED DS-8: theme +const GENERATED_OVERRIDES = { + "perm-auto-selected-text": "#417CDD", // E5D 定稿 2026-07-17 +} as const; +// END GENERATED DS-8: theme + export const defaultLight: Theme = { id: 'default-light', name: 'Default Light', type: 'light', - colors: { - 'perm-auto-selected-text': '#417CDD', // E5D 定稿 2026-07-17 - }, + colors: GENERATED_OVERRIDES, }; diff --git a/apps/desktop/src/renderer/themes/builtin/eclipse.ts b/apps/desktop/src/renderer/themes/builtin/eclipse.ts index e79fce4f372..147c1bb1a9a 100644 --- a/apps/desktop/src/renderer/themes/builtin/eclipse.ts +++ b/apps/desktop/src/renderer/themes/builtin/eclipse.ts @@ -8,151 +8,126 @@ import type { Theme } from '../types'; * "charcoal 三层",保留名字避免大面积 rename;值已经迁过(2026-05-28 从 * 冷紫 navy 切到中性炭灰)。 */ -const TEAL_PRIMARY = '#0CD2A5'; -const TEAL_SOFT = '#5eead4'; -const TEAL_DEEP = '#0f8a73'; - -const SURFACE_NAVY = '#0d1117'; -const CARD_NAVY = '#161b22'; -const BOARD_NAVY = '#30363d'; -const HOVER_NAVY = '#1c2128'; -const CHIP_NAVY = '#262c36'; -const SURFACE_NAVY_HSL = '220 12% 7%'; -const CARD_NAVY_HSL = '213 16% 11%'; -const BOARD_NAVY_HSL = '215 12% 21%'; -const HOVER_NAVY_HSL = '213 16% 14%'; -const CHIP_NAVY_HSL = '215 16% 18%'; - -const TEXT_PRIMARY = '#e6e6e6'; -const TEXT_SECONDARY = '#9ca3af'; -const TEXT_TERTIARY = '#6b7280'; -const TEXT_DISABLED = '#4b5563'; -const TEXT_PRIMARY_HSL = '0 0% 90%'; -const TEXT_SECONDARY_HSL = '220 9% 65%'; -const TEXT_TERTIARY_HSL = '220 9% 46%'; - -const slotOverrides = { - surface: SURFACE_NAVY, - 'surface-hsl': SURFACE_NAVY_HSL, - 'surface-elevated': CARD_NAVY, - 'surface-elevated-soft': CARD_NAVY, - 'surface-card-ivory': CARD_NAVY, - 'surface-chip': CHIP_NAVY, - 'surface-chip-alt': CHIP_NAVY, - 'surface-hover': HOVER_NAVY, - 'surface-hover-soft': HOVER_NAVY, - 'surface-hover-hsl': HOVER_NAVY_HSL, - 'surface-on-card': SURFACE_NAVY, - 'border-default': BOARD_NAVY, - 'border-default-hsl': BOARD_NAVY_HSL, - 'border-shadcn-hsl': BOARD_NAVY_HSL, - 'border-transparent-mixed': BOARD_NAVY, - 'text-primary': TEXT_PRIMARY, - 'text-primary-on-dark': TEXT_PRIMARY, - 'text-primary-emphasis': TEXT_PRIMARY, - 'text-primary-inv': TEXT_PRIMARY, - 'text-primary-body-strong': TEXT_PRIMARY, - 'text-primary-hsl': TEXT_PRIMARY_HSL, - 'text-secondary': TEXT_SECONDARY, - 'text-secondary-cross': TEXT_SECONDARY, - 'text-secondary-mid': TEXT_SECONDARY, - 'text-tertiary': TEXT_TERTIARY, - 'text-tertiary-stone': TEXT_TERTIARY, - 'text-tertiary-mid': TEXT_TERTIARY, - 'text-tertiary-hsl': TEXT_TERTIARY_HSL, - 'text-disabled': TEXT_DISABLED, - 'text-disabled-tertiary': TEXT_DISABLED, - 'accent-cta-bg': TEAL_PRIMARY, - 'accent-cta-bg-pure': TEAL_PRIMARY, - 'accent-emphasis': TEAL_PRIMARY, - 'accent-soft': TEAL_SOFT, - 'accent-hover': TEAL_DEEP, - 'accent-pure-cta-fg': SURFACE_NAVY, - 'switch-track-on': TEAL_PRIMARY, +// 既有分组/对比度/否决依据:docs/design-rules/design-decision-log.md +// 「2026-09-11 DS-8 内置主题依据迁移」→ eclipse(生成区外保留)。 +// BEGIN GENERATED DS-8: theme +const GENERATED_OVERRIDES = { + "surface": "#0d1117", + "surface-hsl": "220 12% 7%", + "surface-elevated": "#161b22", + "surface-elevated-soft": "#161b22", + "surface-card-ivory": "#161b22", + "surface-chip": "#262c36", + "surface-chip-alt": "#262c36", + "surface-hover": "#1c2128", + "surface-hover-soft": "#1c2128", + "surface-hover-hsl": "213 16% 14%", + "surface-on-card": "#0d1117", + "border-default": "#30363d", + "border-default-hsl": "215 12% 21%", + "border-shadcn-hsl": "215 12% 21%", + "border-transparent-mixed": "#30363d", + "text-primary": "#e6e6e6", + "text-primary-on-dark": "#e6e6e6", + "text-primary-emphasis": "#e6e6e6", + "text-primary-inv": "#e6e6e6", + "text-primary-body-strong": "#e6e6e6", + "text-primary-hsl": "0 0% 90%", + "text-secondary": "#9ca3af", + "text-secondary-cross": "#9ca3af", + "text-secondary-mid": "#9ca3af", + "text-tertiary": "#6b7280", + "text-tertiary-stone": "#6b7280", + "text-tertiary-mid": "#6b7280", + "text-tertiary-hsl": "220 9% 46%", + "text-disabled": "#4b5563", + "text-disabled-tertiary": "#4b5563", + "accent-cta-bg": "#0CD2A5", + "accent-cta-bg-pure": "#0CD2A5", + "accent-emphasis": "#0CD2A5", + "accent-soft": "#5eead4", + "accent-hover": "#0f8a73", + "accent-pure-cta-fg": "#0d1117", + "switch-track-on": "#0CD2A5", + "accent": "213 16% 14%", + "agent-actions-rail": "#30363d", + "ask-checkbox-border": "#4b5563", + "background": "220 12% 7%", + "create-agent-control-bg": "#0d1117", + "create-agent-control-bg-hover": "#1c2128", + "create-agent-control-bg-pressed": "#262c36", + "create-agent-control-border": "#30363d", + "create-agent-control-icon": "#e6e6e6", + "create-agent-control-text": "#e6e6e6", + "create-agent-quick-card-bg": "#0d1117", + "create-agent-quick-card-bg-hover": "#1c2128", + "create-agent-quick-card-border": "#30363d", + "create-agent-quick-card-icon": "#e6e6e6", + "create-agent-quick-card-icon-bg": "#30363d", + "create-agent-quick-card-text": "#e6e6e6", + "create-agent-segment-inactive-text": "#6b7280", + "create-agent-segment-track-bg": "#0d1117", + "send-btn-bg": "#e6e6e6", + "send-btn-icon": "#0d1117", + "chat-input-chip-border": "#30363d", + "chat-input-text": "#e6e6e6", + "color-primary": "#e6e6e6", + "confirm-bg": "#161b22", + "confirm-btn-primary-bg": "#0CD2A5", + "confirm-btn-primary-text": "#0d1117", + "confirm-btn-secondary-border": "#30363d", + "confirm-btn-secondary-hover": "rgba(255, 255, 255, 0.06)", + "confirm-btn-secondary-text": "#e6e6e6", + "confirm-title": "#e6e6e6", + "drop-overlay-bg": "rgba(12, 210, 165, 0.1)", + "file-chip-bg": "#30363d", + "file-remove-bg": "#4b5563", + "info-700": "#5eead4", + "model-trigger-hover": "#1c2128", + "msg-link": "#5eead4", + "msg-scrollbar-hover": "#4b5563", + "muted": "215 16% 18%", + "muted-foreground": "220 9% 65%", + "perm-allow-btn-bg": "#0CD2A5", + "perm-allow-btn-text": "#0d1117", + "perm-allow-kbd-bg": "#262c36", + "perm-allow-kbd-border": "#30363d", + "perm-code-bg": "#0d1117", + "perm-item-selected-bg": "#262c36", + "plan-outline-active-bg": "#262c36", + "plan-toolbar-btn-hover-bg": "#1c2128", + "popover": "213 16% 11%", + "primary-foreground": "220 12% 7%", + "search-match-fg": "0 0% 90%", + "secondary": "213 16% 11%", + "settings-btn-primary-text": "#0d1117", + "settings-btn-secondary-hover-bg": "#1c2128", + "text-placeholder": "#4b5563", + "settings-integration-avatar-bg": "#262c36", + "settings-logout-bg": "#262c36", + "settings-menu-bg-hover": "#1c2128", + "settings-menu-bg-selected": "#262c36", + "settings-source-link": "#5eead4", + "settings-theme-auto-dark": "#0d1117", + "sidebar-action-icon": "220 9% 46%", + "sidebar-item-active": "215 16% 18%", + "splash-bg": "220 12% 7%", + "splash-text": "220 9% 65%", + "splash-text-destructive": "0 0% 90%", + "splash-text-muted": "220 9% 46%", + "titlebar-icon": "220 9% 65%", + "tooltip-bg": "#0d1117", + "tooltip-text": "#e6e6e6", + "update-btn-border": "#0CD2A5", + "update-btn-text": "#0CD2A5", } as const; +// END GENERATED DS-8: theme + -const singletonOverrides = { - accent: HOVER_NAVY_HSL, - 'agent-actions-rail': BOARD_NAVY, - 'ask-checkbox-border': TEXT_DISABLED, - background: SURFACE_NAVY_HSL, - // CREATE AGENT 卡片 / 顶部 pill / 分段开关 + composer pill(#607): - // 卡片底与 surface 同值收敛(模板惯例),icon 圆底用 CHIP,send 走 tier1 反相 CTA。 - 'create-agent-control-bg': SURFACE_NAVY, - 'create-agent-control-bg-hover': HOVER_NAVY, - 'create-agent-control-bg-pressed': CHIP_NAVY, - 'create-agent-control-border': BOARD_NAVY, - 'create-agent-control-icon': TEXT_PRIMARY, - 'create-agent-control-text': TEXT_PRIMARY, - 'create-agent-quick-card-bg': SURFACE_NAVY, - 'create-agent-quick-card-bg-hover': HOVER_NAVY, - 'create-agent-quick-card-border': BOARD_NAVY, - 'create-agent-quick-card-icon': TEXT_PRIMARY, - 'create-agent-quick-card-icon-bg': BOARD_NAVY, - 'create-agent-quick-card-text': TEXT_PRIMARY, - 'create-agent-segment-inactive-text': TEXT_TERTIARY, - 'create-agent-segment-track-bg': SURFACE_NAVY, - 'send-btn-bg': TEXT_PRIMARY, - 'send-btn-icon': SURFACE_NAVY, - 'chat-input-chip-border': BOARD_NAVY, - 'chat-input-text': TEXT_PRIMARY, - 'color-primary': TEXT_PRIMARY, - 'confirm-bg': CARD_NAVY, - 'confirm-btn-primary-bg': TEAL_PRIMARY, - 'confirm-btn-primary-text': SURFACE_NAVY, - 'confirm-btn-secondary-border': BOARD_NAVY, - 'confirm-btn-secondary-hover': 'rgba(255, 255, 255, 0.06)', - 'confirm-btn-secondary-text': TEXT_PRIMARY, - 'confirm-title': TEXT_PRIMARY, - 'drop-overlay-bg': 'rgba(12, 210, 165, 0.1)', - 'file-chip-bg': BOARD_NAVY, - 'file-remove-bg': TEXT_DISABLED, - 'info-700': TEAL_SOFT, - 'model-trigger-hover': HOVER_NAVY, - 'msg-link': TEAL_SOFT, - 'msg-scrollbar-hover': TEXT_DISABLED, - muted: CHIP_NAVY_HSL, - 'muted-foreground': TEXT_SECONDARY_HSL, - 'perm-allow-btn-bg': TEAL_PRIMARY, - 'perm-allow-btn-text': SURFACE_NAVY, - 'perm-allow-kbd-bg': CHIP_NAVY, - 'perm-allow-kbd-border': BOARD_NAVY, - 'perm-code-bg': SURFACE_NAVY, - 'perm-item-selected-bg': CHIP_NAVY, - 'plan-outline-active-bg': CHIP_NAVY, - 'plan-toolbar-btn-hover-bg': HOVER_NAVY, - popover: CARD_NAVY_HSL, - 'primary-foreground': SURFACE_NAVY_HSL, - 'search-match-fg': TEXT_PRIMARY_HSL, - secondary: CARD_NAVY_HSL, - 'settings-btn-primary-text': SURFACE_NAVY, - 'settings-btn-secondary-hover-bg': HOVER_NAVY, - 'text-placeholder': TEXT_DISABLED, - 'settings-integration-avatar-bg': CHIP_NAVY, - 'settings-logout-bg': CHIP_NAVY, - 'settings-menu-bg-hover': HOVER_NAVY, - 'settings-menu-bg-selected': CHIP_NAVY, - 'settings-source-link': TEAL_SOFT, - 'settings-theme-auto-dark': SURFACE_NAVY, - 'sidebar-action-icon': TEXT_TERTIARY_HSL, - 'sidebar-item-active': CHIP_NAVY_HSL, - 'splash-bg': SURFACE_NAVY_HSL, - 'splash-text': TEXT_SECONDARY_HSL, - 'splash-text-destructive': TEXT_PRIMARY_HSL, - 'splash-text-muted': TEXT_TERTIARY_HSL, - 'titlebar-icon': TEXT_SECONDARY_HSL, - 'tooltip-bg': SURFACE_NAVY, - 'tooltip-text': TEXT_PRIMARY, - 'update-btn-border': TEAL_PRIMARY, - 'update-btn-text': TEAL_PRIMARY, -} as const; export const eclipse: Theme = { id: 'eclipse', name: 'Eclipse', type: 'dark', - colors: { - ...slotOverrides, - ...singletonOverrides, - }, + colors: GENERATED_OVERRIDES, }; diff --git a/apps/desktop/src/renderer/themes/builtin/github-dark.ts b/apps/desktop/src/renderer/themes/builtin/github-dark.ts index 7c8aa0ce4a6..cb3351e9db0 100644 --- a/apps/desktop/src/renderer/themes/builtin/github-dark.ts +++ b/apps/desktop/src/renderer/themes/builtin/github-dark.ts @@ -10,152 +10,127 @@ import type { Theme } from '../types'; * 色板取自 https://github.com/primer/github-vscode-theme + @primer/primitives * 的 dark scale。 */ -const BLUE_PRIMARY = '#2f81f7'; -const BLUE_SOFT = '#79c0ff'; -const BLUE_DEEP = '#1f6feb'; - -const SURFACE_BG = '#0d1117'; -const ELEVATED_BG = '#161b22'; -const HOVER_BG = '#1c2128'; -const CHIP_BG = '#21262d'; -const BORDER_BG = '#30363d'; -const SURFACE_BG_HSL = '220 13% 7%'; -const ELEVATED_BG_HSL = '215 21% 11%'; -const HOVER_BG_HSL = '215 16% 13%'; -const CHIP_BG_HSL = '213 14% 15%'; -const BORDER_BG_HSL = '213 12% 21%'; - -const TEXT_PRIMARY = '#e6edf3'; -const TEXT_SECONDARY = '#7d8590'; -const TEXT_TERTIARY = '#6e7681'; -const TEXT_DISABLED = '#484f58'; -const TEXT_PRIMARY_HSL = '213 31% 93%'; -const TEXT_SECONDARY_HSL = '215 9% 53%'; -const TEXT_TERTIARY_HSL = '215 8% 47%'; - -const slotOverrides = { - surface: SURFACE_BG, - 'surface-hsl': SURFACE_BG_HSL, - 'surface-elevated': ELEVATED_BG, - 'surface-elevated-soft': ELEVATED_BG, - 'surface-card-ivory': ELEVATED_BG, - 'surface-chip': CHIP_BG, - 'surface-chip-alt': CHIP_BG, - 'surface-hover': HOVER_BG, - 'surface-hover-soft': HOVER_BG, - 'surface-hover-hsl': HOVER_BG_HSL, - 'surface-on-card': SURFACE_BG, - 'border-default': BORDER_BG, - 'border-default-hsl': BORDER_BG_HSL, - 'border-shadcn-hsl': BORDER_BG_HSL, - 'border-transparent-mixed': BORDER_BG, - 'text-primary': TEXT_PRIMARY, - 'text-primary-on-dark': TEXT_PRIMARY, - 'text-primary-emphasis': TEXT_PRIMARY, - 'text-primary-inv': TEXT_PRIMARY, - 'text-primary-body-strong': TEXT_PRIMARY, - 'text-primary-hsl': TEXT_PRIMARY_HSL, - 'text-secondary': TEXT_SECONDARY, - 'text-secondary-cross': TEXT_SECONDARY, - 'text-secondary-mid': TEXT_SECONDARY, - 'text-tertiary': TEXT_TERTIARY, - 'text-tertiary-stone': TEXT_TERTIARY, - 'text-tertiary-mid': TEXT_TERTIARY, - 'text-tertiary-hsl': TEXT_TERTIARY_HSL, - 'text-disabled': TEXT_DISABLED, - 'text-disabled-tertiary': TEXT_DISABLED, - 'accent-cta-bg': BLUE_PRIMARY, - 'accent-cta-bg-pure': BLUE_PRIMARY, - 'accent-emphasis': BLUE_PRIMARY, - 'accent-soft': BLUE_SOFT, - 'accent-hover': BLUE_DEEP, - 'accent-pure-cta-fg': '#ffffff', - 'switch-track-on': BLUE_PRIMARY, - 'status-badge-fg': '#1F1F1F', +// 既有分组/对比度/否决依据:docs/design-rules/design-decision-log.md +// 「2026-09-11 DS-8 内置主题依据迁移」→ github-dark(生成区外保留)。 +// BEGIN GENERATED DS-8: theme +const GENERATED_OVERRIDES = { + "surface": "#0d1117", + "surface-hsl": "220 13% 7%", + "surface-elevated": "#161b22", + "surface-elevated-soft": "#161b22", + "surface-card-ivory": "#161b22", + "surface-chip": "#21262d", + "surface-chip-alt": "#21262d", + "surface-hover": "#1c2128", + "surface-hover-soft": "#1c2128", + "surface-hover-hsl": "215 16% 13%", + "surface-on-card": "#0d1117", + "border-default": "#30363d", + "border-default-hsl": "213 12% 21%", + "border-shadcn-hsl": "213 12% 21%", + "border-transparent-mixed": "#30363d", + "text-primary": "#e6edf3", + "text-primary-on-dark": "#e6edf3", + "text-primary-emphasis": "#e6edf3", + "text-primary-inv": "#e6edf3", + "text-primary-body-strong": "#e6edf3", + "text-primary-hsl": "213 31% 93%", + "text-secondary": "#7d8590", + "text-secondary-cross": "#7d8590", + "text-secondary-mid": "#7d8590", + "text-tertiary": "#6e7681", + "text-tertiary-stone": "#6e7681", + "text-tertiary-mid": "#6e7681", + "text-tertiary-hsl": "215 8% 47%", + "text-disabled": "#484f58", + "text-disabled-tertiary": "#484f58", + "accent-cta-bg": "#2f81f7", + "accent-cta-bg-pure": "#2f81f7", + "accent-emphasis": "#2f81f7", + "accent-soft": "#79c0ff", + "accent-hover": "#1f6feb", + "accent-pure-cta-fg": "#ffffff", + "switch-track-on": "#2f81f7", + "status-badge-fg": "#1F1F1F", + "accent": "215 16% 13%", + "agent-actions-rail": "#30363d", + "ask-checkbox-border": "#484f58", + "background": "220 13% 7%", + "create-agent-control-bg": "#0d1117", + "create-agent-control-bg-hover": "#1c2128", + "create-agent-control-bg-pressed": "#21262d", + "create-agent-control-border": "#30363d", + "create-agent-control-icon": "#e6edf3", + "create-agent-control-text": "#e6edf3", + "create-agent-quick-card-bg": "#0d1117", + "create-agent-quick-card-bg-hover": "#1c2128", + "create-agent-quick-card-border": "#30363d", + "create-agent-quick-card-icon": "#e6edf3", + "create-agent-quick-card-icon-bg": "#30363d", + "create-agent-quick-card-text": "#e6edf3", + "create-agent-segment-inactive-text": "#6e7681", + "create-agent-segment-track-bg": "#0d1117", + "send-btn-bg": "#e6edf3", + "send-btn-icon": "#0d1117", + "chat-input-chip-border": "#30363d", + "chat-input-text": "#e6edf3", + "color-primary": "#e6edf3", + "confirm-bg": "#161b22", + "confirm-btn-primary-bg": "#2f81f7", + "confirm-btn-primary-text": "#ffffff", + "confirm-btn-secondary-border": "#30363d", + "confirm-btn-secondary-hover": "rgba(255, 255, 255, 0.06)", + "confirm-btn-secondary-text": "#e6edf3", + "confirm-title": "#e6edf3", + "drop-overlay-bg": "rgba(47, 129, 247, 0.1)", + "file-chip-bg": "#30363d", + "file-remove-bg": "#484f58", + "info-700": "#79c0ff", + "model-trigger-hover": "#1c2128", + "msg-link": "#79c0ff", + "msg-scrollbar-hover": "#484f58", + "muted": "213 14% 15%", + "muted-foreground": "215 9% 53%", + "perm-allow-btn-bg": "#2f81f7", + "perm-allow-btn-text": "#ffffff", + "perm-allow-kbd-bg": "#21262d", + "perm-allow-kbd-border": "#30363d", + "perm-code-bg": "#0d1117", + "perm-item-selected-bg": "#21262d", + "plan-outline-active-bg": "#21262d", + "plan-toolbar-btn-hover-bg": "#1c2128", + "popover": "215 21% 11%", + "primary-foreground": "220 13% 7%", + "search-match-fg": "213 31% 93%", + "secondary": "215 21% 11%", + "settings-btn-primary-text": "#ffffff", + "settings-btn-secondary-hover-bg": "#1c2128", + "text-placeholder": "#484f58", + "settings-integration-avatar-bg": "#21262d", + "settings-logout-bg": "#21262d", + "settings-menu-bg-hover": "#1c2128", + "settings-menu-bg-selected": "#21262d", + "settings-source-link": "#79c0ff", + "settings-theme-auto-dark": "#0d1117", + "sidebar-action-icon": "215 8% 47%", + "sidebar-item-active": "213 14% 15%", + "splash-bg": "220 13% 7%", + "splash-text": "215 9% 53%", + "splash-text-destructive": "213 31% 93%", + "splash-text-muted": "215 8% 47%", + "titlebar-icon": "215 9% 53%", + "tooltip-bg": "#0d1117", + "tooltip-text": "#e6edf3", + "update-btn-border": "#2f81f7", + "update-btn-text": "#2f81f7", } as const; +// END GENERATED DS-8: theme + -const singletonOverrides = { - accent: HOVER_BG_HSL, - 'agent-actions-rail': BORDER_BG, - 'ask-checkbox-border': TEXT_DISABLED, - background: SURFACE_BG_HSL, - // CREATE AGENT 卡片 / 顶部 pill / 分段开关 + composer pill(#607): - // 卡片底与 surface 同值收敛(模板惯例),icon 圆底用 CHIP,send 走 tier1 反相 CTA。 - 'create-agent-control-bg': SURFACE_BG, - 'create-agent-control-bg-hover': HOVER_BG, - 'create-agent-control-bg-pressed': CHIP_BG, - 'create-agent-control-border': BORDER_BG, - 'create-agent-control-icon': TEXT_PRIMARY, - 'create-agent-control-text': TEXT_PRIMARY, - 'create-agent-quick-card-bg': SURFACE_BG, - 'create-agent-quick-card-bg-hover': HOVER_BG, - 'create-agent-quick-card-border': BORDER_BG, - 'create-agent-quick-card-icon': TEXT_PRIMARY, - 'create-agent-quick-card-icon-bg': BORDER_BG, - 'create-agent-quick-card-text': TEXT_PRIMARY, - 'create-agent-segment-inactive-text': TEXT_TERTIARY, - 'create-agent-segment-track-bg': SURFACE_BG, - 'send-btn-bg': TEXT_PRIMARY, - 'send-btn-icon': SURFACE_BG, - 'chat-input-chip-border': BORDER_BG, - 'chat-input-text': TEXT_PRIMARY, - 'color-primary': TEXT_PRIMARY, - 'confirm-bg': ELEVATED_BG, - 'confirm-btn-primary-bg': BLUE_PRIMARY, - 'confirm-btn-primary-text': '#ffffff', - 'confirm-btn-secondary-border': BORDER_BG, - 'confirm-btn-secondary-hover': 'rgba(255, 255, 255, 0.06)', - 'confirm-btn-secondary-text': TEXT_PRIMARY, - 'confirm-title': TEXT_PRIMARY, - 'drop-overlay-bg': 'rgba(47, 129, 247, 0.1)', - 'file-chip-bg': BORDER_BG, - 'file-remove-bg': TEXT_DISABLED, - 'info-700': BLUE_SOFT, - 'model-trigger-hover': HOVER_BG, - 'msg-link': BLUE_SOFT, - 'msg-scrollbar-hover': TEXT_DISABLED, - muted: CHIP_BG_HSL, - 'muted-foreground': TEXT_SECONDARY_HSL, - 'perm-allow-btn-bg': BLUE_PRIMARY, - 'perm-allow-btn-text': '#ffffff', - 'perm-allow-kbd-bg': CHIP_BG, - 'perm-allow-kbd-border': BORDER_BG, - 'perm-code-bg': SURFACE_BG, - 'perm-item-selected-bg': CHIP_BG, - 'plan-outline-active-bg': CHIP_BG, - 'plan-toolbar-btn-hover-bg': HOVER_BG, - popover: ELEVATED_BG_HSL, - 'primary-foreground': SURFACE_BG_HSL, - 'search-match-fg': TEXT_PRIMARY_HSL, - secondary: ELEVATED_BG_HSL, - 'settings-btn-primary-text': '#ffffff', - 'settings-btn-secondary-hover-bg': HOVER_BG, - 'text-placeholder': TEXT_DISABLED, - 'settings-integration-avatar-bg': CHIP_BG, - 'settings-logout-bg': CHIP_BG, - 'settings-menu-bg-hover': HOVER_BG, - 'settings-menu-bg-selected': CHIP_BG, - 'settings-source-link': BLUE_SOFT, - 'settings-theme-auto-dark': SURFACE_BG, - 'sidebar-action-icon': TEXT_TERTIARY_HSL, - 'sidebar-item-active': CHIP_BG_HSL, - 'splash-bg': SURFACE_BG_HSL, - 'splash-text': TEXT_SECONDARY_HSL, - 'splash-text-destructive': TEXT_PRIMARY_HSL, - 'splash-text-muted': TEXT_TERTIARY_HSL, - 'titlebar-icon': TEXT_SECONDARY_HSL, - 'tooltip-bg': SURFACE_BG, - 'tooltip-text': TEXT_PRIMARY, - 'update-btn-border': BLUE_PRIMARY, - 'update-btn-text': BLUE_PRIMARY, -} as const; export const githubDark: Theme = { id: 'github-dark', name: 'GitHub Dark', type: 'dark', - colors: { - ...slotOverrides, - ...singletonOverrides, - }, + colors: GENERATED_OVERRIDES, }; diff --git a/apps/desktop/src/renderer/themes/builtin/material-ocean-hc.ts b/apps/desktop/src/renderer/themes/builtin/material-ocean-hc.ts index 7d164d4de1e..0a6627cd0c3 100644 --- a/apps/desktop/src/renderer/themes/builtin/material-ocean-hc.ts +++ b/apps/desktop/src/renderer/themes/builtin/material-ocean-hc.ts @@ -6,151 +6,126 @@ import type { Theme } from '../types'; * 色板取自 https://material-theme.com/docs/reference/color-palette/ 的 * Oceanic 主调,按 high-contrast 规则把 surface 压更深、文本提更亮。 */ -const TEAL_PRIMARY = '#80CBC4'; -const TEAL_SOFT = '#B2DFDB'; -const TEAL_DEEP = '#26A69A'; - -const SURFACE_BG = '#0F111A'; -const ELEVATED_BG = '#090B10'; -const HOVER_BG = '#1A1C25'; -const CHIP_BG = '#1F2233'; -const BORDER_BG = '#2A2F45'; -const SURFACE_BG_HSL = '231 26% 8%'; -const ELEVATED_BG_HSL = '226 28% 5%'; -const HOVER_BG_HSL = '228 19% 12%'; -const CHIP_BG_HSL = '229 25% 16%'; -const BORDER_BG_HSL = '229 25% 22%'; - -const TEXT_PRIMARY = '#EEFFFF'; -const TEXT_SECONDARY = '#A6ACCD'; -const TEXT_TERTIARY = '#717CB4'; -const TEXT_DISABLED = '#464B5D'; -const TEXT_PRIMARY_HSL = '180 100% 97%'; -const TEXT_SECONDARY_HSL = '228 33% 73%'; -const TEXT_TERTIARY_HSL = '226 31% 57%'; - -const slotOverrides = { - surface: SURFACE_BG, - 'surface-hsl': SURFACE_BG_HSL, - 'surface-elevated': ELEVATED_BG, - 'surface-elevated-soft': ELEVATED_BG, - 'surface-card-ivory': ELEVATED_BG, - 'surface-chip': CHIP_BG, - 'surface-chip-alt': CHIP_BG, - 'surface-hover': HOVER_BG, - 'surface-hover-soft': HOVER_BG, - 'surface-hover-hsl': HOVER_BG_HSL, - 'surface-on-card': SURFACE_BG, - 'border-default': BORDER_BG, - 'border-default-hsl': BORDER_BG_HSL, - 'border-shadcn-hsl': BORDER_BG_HSL, - 'border-transparent-mixed': BORDER_BG, - 'text-primary': TEXT_PRIMARY, - 'text-primary-on-dark': TEXT_PRIMARY, - 'text-primary-emphasis': TEXT_PRIMARY, - 'text-primary-inv': TEXT_PRIMARY, - 'text-primary-body-strong': TEXT_PRIMARY, - 'text-primary-hsl': TEXT_PRIMARY_HSL, - 'text-secondary': TEXT_SECONDARY, - 'text-secondary-cross': TEXT_SECONDARY, - 'text-secondary-mid': TEXT_SECONDARY, - 'text-tertiary': TEXT_TERTIARY, - 'text-tertiary-stone': TEXT_TERTIARY, - 'text-tertiary-mid': TEXT_TERTIARY, - 'text-tertiary-hsl': TEXT_TERTIARY_HSL, - 'text-disabled': TEXT_DISABLED, - 'text-disabled-tertiary': TEXT_DISABLED, - 'accent-cta-bg': TEAL_PRIMARY, - 'accent-cta-bg-pure': TEAL_PRIMARY, - 'accent-emphasis': TEAL_PRIMARY, - 'accent-soft': TEAL_SOFT, - 'accent-hover': TEAL_DEEP, - 'accent-pure-cta-fg': SURFACE_BG, - 'switch-track-on': TEAL_PRIMARY, +// 既有分组/对比度/否决依据:docs/design-rules/design-decision-log.md +// 「2026-09-11 DS-8 内置主题依据迁移」→ material-ocean-hc(生成区外保留)。 +// BEGIN GENERATED DS-8: theme +const GENERATED_OVERRIDES = { + "surface": "#0F111A", + "surface-hsl": "231 26% 8%", + "surface-elevated": "#090B10", + "surface-elevated-soft": "#090B10", + "surface-card-ivory": "#090B10", + "surface-chip": "#1F2233", + "surface-chip-alt": "#1F2233", + "surface-hover": "#1A1C25", + "surface-hover-soft": "#1A1C25", + "surface-hover-hsl": "228 19% 12%", + "surface-on-card": "#0F111A", + "border-default": "#2A2F45", + "border-default-hsl": "229 25% 22%", + "border-shadcn-hsl": "229 25% 22%", + "border-transparent-mixed": "#2A2F45", + "text-primary": "#EEFFFF", + "text-primary-on-dark": "#EEFFFF", + "text-primary-emphasis": "#EEFFFF", + "text-primary-inv": "#EEFFFF", + "text-primary-body-strong": "#EEFFFF", + "text-primary-hsl": "180 100% 97%", + "text-secondary": "#A6ACCD", + "text-secondary-cross": "#A6ACCD", + "text-secondary-mid": "#A6ACCD", + "text-tertiary": "#717CB4", + "text-tertiary-stone": "#717CB4", + "text-tertiary-mid": "#717CB4", + "text-tertiary-hsl": "226 31% 57%", + "text-disabled": "#464B5D", + "text-disabled-tertiary": "#464B5D", + "accent-cta-bg": "#80CBC4", + "accent-cta-bg-pure": "#80CBC4", + "accent-emphasis": "#80CBC4", + "accent-soft": "#B2DFDB", + "accent-hover": "#26A69A", + "accent-pure-cta-fg": "#0F111A", + "switch-track-on": "#80CBC4", + "accent": "228 19% 12%", + "agent-actions-rail": "#2A2F45", + "ask-checkbox-border": "#464B5D", + "background": "231 26% 8%", + "create-agent-control-bg": "#0F111A", + "create-agent-control-bg-hover": "#1A1C25", + "create-agent-control-bg-pressed": "#1F2233", + "create-agent-control-border": "#2A2F45", + "create-agent-control-icon": "#EEFFFF", + "create-agent-control-text": "#EEFFFF", + "create-agent-quick-card-bg": "#0F111A", + "create-agent-quick-card-bg-hover": "#1A1C25", + "create-agent-quick-card-border": "#2A2F45", + "create-agent-quick-card-icon": "#EEFFFF", + "create-agent-quick-card-icon-bg": "#2A2F45", + "create-agent-quick-card-text": "#EEFFFF", + "create-agent-segment-inactive-text": "#717CB4", + "create-agent-segment-track-bg": "#0F111A", + "send-btn-bg": "#EEFFFF", + "send-btn-icon": "#0F111A", + "chat-input-chip-border": "#2A2F45", + "chat-input-text": "#EEFFFF", + "color-primary": "#EEFFFF", + "confirm-bg": "#090B10", + "confirm-btn-primary-bg": "#80CBC4", + "confirm-btn-primary-text": "#0F111A", + "confirm-btn-secondary-border": "#2A2F45", + "confirm-btn-secondary-hover": "rgba(255, 255, 255, 0.06)", + "confirm-btn-secondary-text": "#EEFFFF", + "confirm-title": "#EEFFFF", + "drop-overlay-bg": "rgba(128, 203, 196, 0.1)", + "file-chip-bg": "#2A2F45", + "file-remove-bg": "#464B5D", + "info-700": "#B2DFDB", + "model-trigger-hover": "#1A1C25", + "msg-link": "#B2DFDB", + "msg-scrollbar-hover": "#464B5D", + "muted": "229 25% 16%", + "muted-foreground": "228 33% 73%", + "perm-allow-btn-bg": "#80CBC4", + "perm-allow-btn-text": "#0F111A", + "perm-allow-kbd-bg": "#1F2233", + "perm-allow-kbd-border": "#2A2F45", + "perm-code-bg": "#0F111A", + "perm-item-selected-bg": "#1F2233", + "plan-outline-active-bg": "#1F2233", + "plan-toolbar-btn-hover-bg": "#1A1C25", + "popover": "226 28% 5%", + "primary-foreground": "231 26% 8%", + "search-match-fg": "180 100% 97%", + "secondary": "226 28% 5%", + "settings-btn-primary-text": "#0F111A", + "settings-btn-secondary-hover-bg": "#1A1C25", + "text-placeholder": "#464B5D", + "settings-integration-avatar-bg": "#1F2233", + "settings-logout-bg": "#1F2233", + "settings-menu-bg-hover": "#1A1C25", + "settings-menu-bg-selected": "#1F2233", + "settings-source-link": "#B2DFDB", + "settings-theme-auto-dark": "#0F111A", + "sidebar-action-icon": "226 31% 57%", + "sidebar-item-active": "229 25% 16%", + "splash-bg": "231 26% 8%", + "splash-text": "228 33% 73%", + "splash-text-destructive": "180 100% 97%", + "splash-text-muted": "226 31% 57%", + "titlebar-icon": "228 33% 73%", + "tooltip-bg": "#0F111A", + "tooltip-text": "#EEFFFF", + "update-btn-border": "#80CBC4", + "update-btn-text": "#80CBC4", } as const; +// END GENERATED DS-8: theme + -const singletonOverrides = { - accent: HOVER_BG_HSL, - 'agent-actions-rail': BORDER_BG, - 'ask-checkbox-border': TEXT_DISABLED, - background: SURFACE_BG_HSL, - // CREATE AGENT 卡片 / 顶部 pill / 分段开关 + composer pill(#607): - // 卡片底与 surface 同值收敛(模板惯例),icon 圆底用 CHIP,send 走 tier1 反相 CTA。 - 'create-agent-control-bg': SURFACE_BG, - 'create-agent-control-bg-hover': HOVER_BG, - 'create-agent-control-bg-pressed': CHIP_BG, - 'create-agent-control-border': BORDER_BG, - 'create-agent-control-icon': TEXT_PRIMARY, - 'create-agent-control-text': TEXT_PRIMARY, - 'create-agent-quick-card-bg': SURFACE_BG, - 'create-agent-quick-card-bg-hover': HOVER_BG, - 'create-agent-quick-card-border': BORDER_BG, - 'create-agent-quick-card-icon': TEXT_PRIMARY, - 'create-agent-quick-card-icon-bg': BORDER_BG, - 'create-agent-quick-card-text': TEXT_PRIMARY, - 'create-agent-segment-inactive-text': TEXT_TERTIARY, - 'create-agent-segment-track-bg': SURFACE_BG, - 'send-btn-bg': TEXT_PRIMARY, - 'send-btn-icon': SURFACE_BG, - 'chat-input-chip-border': BORDER_BG, - 'chat-input-text': TEXT_PRIMARY, - 'color-primary': TEXT_PRIMARY, - 'confirm-bg': ELEVATED_BG, - 'confirm-btn-primary-bg': TEAL_PRIMARY, - 'confirm-btn-primary-text': SURFACE_BG, - 'confirm-btn-secondary-border': BORDER_BG, - 'confirm-btn-secondary-hover': 'rgba(255, 255, 255, 0.06)', - 'confirm-btn-secondary-text': TEXT_PRIMARY, - 'confirm-title': TEXT_PRIMARY, - 'drop-overlay-bg': 'rgba(128, 203, 196, 0.1)', - 'file-chip-bg': BORDER_BG, - 'file-remove-bg': TEXT_DISABLED, - 'info-700': TEAL_SOFT, - 'model-trigger-hover': HOVER_BG, - 'msg-link': TEAL_SOFT, - 'msg-scrollbar-hover': TEXT_DISABLED, - muted: CHIP_BG_HSL, - 'muted-foreground': TEXT_SECONDARY_HSL, - 'perm-allow-btn-bg': TEAL_PRIMARY, - 'perm-allow-btn-text': SURFACE_BG, - 'perm-allow-kbd-bg': CHIP_BG, - 'perm-allow-kbd-border': BORDER_BG, - 'perm-code-bg': SURFACE_BG, - 'perm-item-selected-bg': CHIP_BG, - 'plan-outline-active-bg': CHIP_BG, - 'plan-toolbar-btn-hover-bg': HOVER_BG, - popover: ELEVATED_BG_HSL, - 'primary-foreground': SURFACE_BG_HSL, - 'search-match-fg': TEXT_PRIMARY_HSL, - secondary: ELEVATED_BG_HSL, - 'settings-btn-primary-text': SURFACE_BG, - 'settings-btn-secondary-hover-bg': HOVER_BG, - 'text-placeholder': TEXT_DISABLED, - 'settings-integration-avatar-bg': CHIP_BG, - 'settings-logout-bg': CHIP_BG, - 'settings-menu-bg-hover': HOVER_BG, - 'settings-menu-bg-selected': CHIP_BG, - 'settings-source-link': TEAL_SOFT, - 'settings-theme-auto-dark': SURFACE_BG, - 'sidebar-action-icon': TEXT_TERTIARY_HSL, - 'sidebar-item-active': CHIP_BG_HSL, - 'splash-bg': SURFACE_BG_HSL, - 'splash-text': TEXT_SECONDARY_HSL, - 'splash-text-destructive': TEXT_PRIMARY_HSL, - 'splash-text-muted': TEXT_TERTIARY_HSL, - 'titlebar-icon': TEXT_SECONDARY_HSL, - 'tooltip-bg': SURFACE_BG, - 'tooltip-text': TEXT_PRIMARY, - 'update-btn-border': TEAL_PRIMARY, - 'update-btn-text': TEAL_PRIMARY, -} as const; export const materialOceanHC: Theme = { id: 'material-ocean-hc', name: 'Material Ocean High Contrast', type: 'dark', - colors: { - ...slotOverrides, - ...singletonOverrides, - }, + colors: GENERATED_OVERRIDES, }; diff --git a/apps/desktop/src/renderer/themes/builtin/monokai-pro.ts b/apps/desktop/src/renderer/themes/builtin/monokai-pro.ts index d482d7b9ae1..6dcb90b8744 100644 --- a/apps/desktop/src/renderer/themes/builtin/monokai-pro.ts +++ b/apps/desktop/src/renderer/themes/builtin/monokai-pro.ts @@ -5,151 +5,126 @@ import type { Theme } from '../types'; * 暖黄 accent (#FFD866,Monokai Pro 的 string 色)。色板取自官方 Monokai Pro * VSCode 扩展 Classic filter (monokai.theme-monokai-pro-vscode)。 */ -const YELLOW_PRIMARY = '#FFD866'; -const YELLOW_SOFT = '#FFE89A'; -const YELLOW_DEEP = '#C9A832'; - -const SURFACE_BG = '#2D2A2E'; -const ELEVATED_BG = '#221F22'; -const HOVER_BG = '#403E41'; -const CHIP_BG = '#403E41'; -const BORDER_BG = '#5b595c'; -const SURFACE_BG_HSL = '285 4% 17%'; -const ELEVATED_BG_HSL = '300 5% 13%'; -const HOVER_BG_HSL = '285 3% 25%'; -const CHIP_BG_HSL = '285 3% 25%'; -const BORDER_BG_HSL = '280 2% 36%'; - -const TEXT_PRIMARY = '#FCFCFA'; -const TEXT_SECONDARY = '#C1C0C0'; -const TEXT_TERTIARY = '#939293'; -const TEXT_DISABLED = '#727072'; -const TEXT_PRIMARY_HSL = '60 25% 98%'; -const TEXT_SECONDARY_HSL = '0 0% 75%'; -const TEXT_TERTIARY_HSL = '300 1% 57%'; - -const slotOverrides = { - surface: SURFACE_BG, - 'surface-hsl': SURFACE_BG_HSL, - 'surface-elevated': ELEVATED_BG, - 'surface-elevated-soft': ELEVATED_BG, - 'surface-card-ivory': ELEVATED_BG, - 'surface-chip': CHIP_BG, - 'surface-chip-alt': CHIP_BG, - 'surface-hover': HOVER_BG, - 'surface-hover-soft': HOVER_BG, - 'surface-hover-hsl': HOVER_BG_HSL, - 'surface-on-card': SURFACE_BG, - 'border-default': BORDER_BG, - 'border-default-hsl': BORDER_BG_HSL, - 'border-shadcn-hsl': BORDER_BG_HSL, - 'border-transparent-mixed': BORDER_BG, - 'text-primary': TEXT_PRIMARY, - 'text-primary-on-dark': TEXT_PRIMARY, - 'text-primary-emphasis': TEXT_PRIMARY, - 'text-primary-inv': TEXT_PRIMARY, - 'text-primary-body-strong': TEXT_PRIMARY, - 'text-primary-hsl': TEXT_PRIMARY_HSL, - 'text-secondary': TEXT_SECONDARY, - 'text-secondary-cross': TEXT_SECONDARY, - 'text-secondary-mid': TEXT_SECONDARY, - 'text-tertiary': TEXT_TERTIARY, - 'text-tertiary-stone': TEXT_TERTIARY, - 'text-tertiary-mid': TEXT_TERTIARY, - 'text-tertiary-hsl': TEXT_TERTIARY_HSL, - 'text-disabled': TEXT_DISABLED, - 'text-disabled-tertiary': TEXT_DISABLED, - 'accent-cta-bg': YELLOW_PRIMARY, - 'accent-cta-bg-pure': YELLOW_PRIMARY, - 'accent-emphasis': YELLOW_PRIMARY, - 'accent-soft': YELLOW_SOFT, - 'accent-hover': YELLOW_DEEP, - 'accent-pure-cta-fg': SURFACE_BG, - 'switch-track-on': YELLOW_PRIMARY, +// 既有分组/对比度/否决依据:docs/design-rules/design-decision-log.md +// 「2026-09-11 DS-8 内置主题依据迁移」→ monokai-pro(生成区外保留)。 +// BEGIN GENERATED DS-8: theme +const GENERATED_OVERRIDES = { + "surface": "#2D2A2E", + "surface-hsl": "285 4% 17%", + "surface-elevated": "#221F22", + "surface-elevated-soft": "#221F22", + "surface-card-ivory": "#221F22", + "surface-chip": "#403E41", + "surface-chip-alt": "#403E41", + "surface-hover": "#403E41", + "surface-hover-soft": "#403E41", + "surface-hover-hsl": "285 3% 25%", + "surface-on-card": "#2D2A2E", + "border-default": "#5b595c", + "border-default-hsl": "280 2% 36%", + "border-shadcn-hsl": "280 2% 36%", + "border-transparent-mixed": "#5b595c", + "text-primary": "#FCFCFA", + "text-primary-on-dark": "#FCFCFA", + "text-primary-emphasis": "#FCFCFA", + "text-primary-inv": "#FCFCFA", + "text-primary-body-strong": "#FCFCFA", + "text-primary-hsl": "60 25% 98%", + "text-secondary": "#C1C0C0", + "text-secondary-cross": "#C1C0C0", + "text-secondary-mid": "#C1C0C0", + "text-tertiary": "#939293", + "text-tertiary-stone": "#939293", + "text-tertiary-mid": "#939293", + "text-tertiary-hsl": "300 1% 57%", + "text-disabled": "#727072", + "text-disabled-tertiary": "#727072", + "accent-cta-bg": "#FFD866", + "accent-cta-bg-pure": "#FFD866", + "accent-emphasis": "#FFD866", + "accent-soft": "#FFE89A", + "accent-hover": "#C9A832", + "accent-pure-cta-fg": "#2D2A2E", + "switch-track-on": "#FFD866", + "accent": "285 3% 25%", + "agent-actions-rail": "#5b595c", + "ask-checkbox-border": "#727072", + "background": "285 4% 17%", + "create-agent-control-bg": "#2D2A2E", + "create-agent-control-bg-hover": "#403E41", + "create-agent-control-bg-pressed": "#403E41", + "create-agent-control-border": "#5b595c", + "create-agent-control-icon": "#FCFCFA", + "create-agent-control-text": "#FCFCFA", + "create-agent-quick-card-bg": "#2D2A2E", + "create-agent-quick-card-bg-hover": "#403E41", + "create-agent-quick-card-border": "#5b595c", + "create-agent-quick-card-icon": "#FCFCFA", + "create-agent-quick-card-icon-bg": "#5b595c", + "create-agent-quick-card-text": "#FCFCFA", + "create-agent-segment-inactive-text": "#939293", + "create-agent-segment-track-bg": "#2D2A2E", + "send-btn-bg": "#FCFCFA", + "send-btn-icon": "#2D2A2E", + "chat-input-chip-border": "#5b595c", + "chat-input-text": "#FCFCFA", + "color-primary": "#FCFCFA", + "confirm-bg": "#221F22", + "confirm-btn-primary-bg": "#FFD866", + "confirm-btn-primary-text": "#2D2A2E", + "confirm-btn-secondary-border": "#5b595c", + "confirm-btn-secondary-hover": "rgba(255, 255, 255, 0.06)", + "confirm-btn-secondary-text": "#FCFCFA", + "confirm-title": "#FCFCFA", + "drop-overlay-bg": "rgba(255, 216, 102, 0.1)", + "file-chip-bg": "#5b595c", + "file-remove-bg": "#727072", + "info-700": "#FFE89A", + "model-trigger-hover": "#403E41", + "msg-link": "#FFE89A", + "msg-scrollbar-hover": "#727072", + "muted": "285 3% 25%", + "muted-foreground": "0 0% 75%", + "perm-allow-btn-bg": "#FFD866", + "perm-allow-btn-text": "#2D2A2E", + "perm-allow-kbd-bg": "#403E41", + "perm-allow-kbd-border": "#5b595c", + "perm-code-bg": "#2D2A2E", + "perm-item-selected-bg": "#403E41", + "plan-outline-active-bg": "#403E41", + "plan-toolbar-btn-hover-bg": "#403E41", + "popover": "300 5% 13%", + "primary-foreground": "285 4% 17%", + "search-match-fg": "60 25% 98%", + "secondary": "300 5% 13%", + "settings-btn-primary-text": "#2D2A2E", + "settings-btn-secondary-hover-bg": "#403E41", + "text-placeholder": "#727072", + "settings-integration-avatar-bg": "#403E41", + "settings-logout-bg": "#403E41", + "settings-menu-bg-hover": "#403E41", + "settings-menu-bg-selected": "#403E41", + "settings-source-link": "#FFE89A", + "settings-theme-auto-dark": "#2D2A2E", + "sidebar-action-icon": "300 1% 57%", + "sidebar-item-active": "285 3% 25%", + "splash-bg": "285 4% 17%", + "splash-text": "0 0% 75%", + "splash-text-destructive": "60 25% 98%", + "splash-text-muted": "300 1% 57%", + "titlebar-icon": "0 0% 75%", + "tooltip-bg": "#2D2A2E", + "tooltip-text": "#FCFCFA", + "update-btn-border": "#FFD866", + "update-btn-text": "#FFD866", } as const; +// END GENERATED DS-8: theme + -const singletonOverrides = { - accent: HOVER_BG_HSL, - 'agent-actions-rail': BORDER_BG, - 'ask-checkbox-border': TEXT_DISABLED, - background: SURFACE_BG_HSL, - // CREATE AGENT 卡片 / 顶部 pill / 分段开关 + composer pill(#607): - // 卡片底与 surface 同值收敛(模板惯例),icon 圆底用 CHIP,send 走 tier1 反相 CTA。 - 'create-agent-control-bg': SURFACE_BG, - 'create-agent-control-bg-hover': HOVER_BG, - 'create-agent-control-bg-pressed': CHIP_BG, - 'create-agent-control-border': BORDER_BG, - 'create-agent-control-icon': TEXT_PRIMARY, - 'create-agent-control-text': TEXT_PRIMARY, - 'create-agent-quick-card-bg': SURFACE_BG, - 'create-agent-quick-card-bg-hover': HOVER_BG, - 'create-agent-quick-card-border': BORDER_BG, - 'create-agent-quick-card-icon': TEXT_PRIMARY, - 'create-agent-quick-card-icon-bg': BORDER_BG, - 'create-agent-quick-card-text': TEXT_PRIMARY, - 'create-agent-segment-inactive-text': TEXT_TERTIARY, - 'create-agent-segment-track-bg': SURFACE_BG, - 'send-btn-bg': TEXT_PRIMARY, - 'send-btn-icon': SURFACE_BG, - 'chat-input-chip-border': BORDER_BG, - 'chat-input-text': TEXT_PRIMARY, - 'color-primary': TEXT_PRIMARY, - 'confirm-bg': ELEVATED_BG, - 'confirm-btn-primary-bg': YELLOW_PRIMARY, - 'confirm-btn-primary-text': SURFACE_BG, - 'confirm-btn-secondary-border': BORDER_BG, - 'confirm-btn-secondary-hover': 'rgba(255, 255, 255, 0.06)', - 'confirm-btn-secondary-text': TEXT_PRIMARY, - 'confirm-title': TEXT_PRIMARY, - 'drop-overlay-bg': 'rgba(255, 216, 102, 0.1)', - 'file-chip-bg': BORDER_BG, - 'file-remove-bg': TEXT_DISABLED, - 'info-700': YELLOW_SOFT, - 'model-trigger-hover': HOVER_BG, - 'msg-link': YELLOW_SOFT, - 'msg-scrollbar-hover': TEXT_DISABLED, - muted: CHIP_BG_HSL, - 'muted-foreground': TEXT_SECONDARY_HSL, - 'perm-allow-btn-bg': YELLOW_PRIMARY, - 'perm-allow-btn-text': SURFACE_BG, - 'perm-allow-kbd-bg': CHIP_BG, - 'perm-allow-kbd-border': BORDER_BG, - 'perm-code-bg': SURFACE_BG, - 'perm-item-selected-bg': CHIP_BG, - 'plan-outline-active-bg': CHIP_BG, - 'plan-toolbar-btn-hover-bg': HOVER_BG, - popover: ELEVATED_BG_HSL, - 'primary-foreground': SURFACE_BG_HSL, - 'search-match-fg': TEXT_PRIMARY_HSL, - secondary: ELEVATED_BG_HSL, - 'settings-btn-primary-text': SURFACE_BG, - 'settings-btn-secondary-hover-bg': HOVER_BG, - 'text-placeholder': TEXT_DISABLED, - 'settings-integration-avatar-bg': CHIP_BG, - 'settings-logout-bg': CHIP_BG, - 'settings-menu-bg-hover': HOVER_BG, - 'settings-menu-bg-selected': CHIP_BG, - 'settings-source-link': YELLOW_SOFT, - 'settings-theme-auto-dark': SURFACE_BG, - 'sidebar-action-icon': TEXT_TERTIARY_HSL, - 'sidebar-item-active': CHIP_BG_HSL, - 'splash-bg': SURFACE_BG_HSL, - 'splash-text': TEXT_SECONDARY_HSL, - 'splash-text-destructive': TEXT_PRIMARY_HSL, - 'splash-text-muted': TEXT_TERTIARY_HSL, - 'titlebar-icon': TEXT_SECONDARY_HSL, - 'tooltip-bg': SURFACE_BG, - 'tooltip-text': TEXT_PRIMARY, - 'update-btn-border': YELLOW_PRIMARY, - 'update-btn-text': YELLOW_PRIMARY, -} as const; export const monokaiPro: Theme = { id: 'monokai-pro', name: 'Monokai Pro', type: 'dark', - colors: { - ...slotOverrides, - ...singletonOverrides, - }, + colors: GENERATED_OVERRIDES, }; diff --git a/apps/desktop/src/renderer/themes/builtin/one-dark-pro.ts b/apps/desktop/src/renderer/themes/builtin/one-dark-pro.ts index 53a8502df94..76160b959b9 100644 --- a/apps/desktop/src/renderer/themes/builtin/one-dark-pro.ts +++ b/apps/desktop/src/renderer/themes/builtin/one-dark-pro.ts @@ -18,151 +18,126 @@ import type { Theme } from '../types'; * TERTIARY #5c6370 mid * DISABLED #495162 lineNumber.foreground */ -const BLUE_PRIMARY = '#61afef'; -const BLUE_SOFT = '#82c0ff'; -const BLUE_DEEP = '#3d7ec8'; - -const SURFACE_BG = '#282c34'; -const ELEVATED_BG = '#21252b'; -const HOVER_BG = '#2c313a'; -const CHIP_BG = '#2c313a'; -const BORDER_BG = '#3e4452'; -const SURFACE_BG_HSL = '220 13% 18%'; -const ELEVATED_BG_HSL = '220 13% 15%'; -const HOVER_BG_HSL = '220 14% 20%'; -const CHIP_BG_HSL = '220 14% 20%'; -const BORDER_BG_HSL = '220 14% 28%'; - -const TEXT_PRIMARY = '#abb2bf'; -const TEXT_SECONDARY = '#7f848e'; -const TEXT_TERTIARY = '#5c6370'; -const TEXT_DISABLED = '#495162'; -const TEXT_PRIMARY_HSL = '219 14% 71%'; -const TEXT_SECONDARY_HSL = '220 6% 53%'; -const TEXT_TERTIARY_HSL = '220 9% 40%'; - -const slotOverrides = { - surface: SURFACE_BG, - 'surface-hsl': SURFACE_BG_HSL, - 'surface-elevated': ELEVATED_BG, - 'surface-elevated-soft': ELEVATED_BG, - 'surface-card-ivory': ELEVATED_BG, - 'surface-chip': CHIP_BG, - 'surface-chip-alt': CHIP_BG, - 'surface-hover': HOVER_BG, - 'surface-hover-soft': HOVER_BG, - 'surface-hover-hsl': HOVER_BG_HSL, - 'surface-on-card': SURFACE_BG, - 'border-default': BORDER_BG, - 'border-default-hsl': BORDER_BG_HSL, - 'border-shadcn-hsl': BORDER_BG_HSL, - 'border-transparent-mixed': BORDER_BG, - 'text-primary': TEXT_PRIMARY, - 'text-primary-on-dark': TEXT_PRIMARY, - 'text-primary-emphasis': TEXT_PRIMARY, - 'text-primary-inv': TEXT_PRIMARY, - 'text-primary-body-strong': TEXT_PRIMARY, - 'text-primary-hsl': TEXT_PRIMARY_HSL, - 'text-secondary': TEXT_SECONDARY, - 'text-secondary-cross': TEXT_SECONDARY, - 'text-secondary-mid': TEXT_SECONDARY, - 'text-tertiary': TEXT_TERTIARY, - 'text-tertiary-stone': TEXT_TERTIARY, - 'text-tertiary-mid': TEXT_TERTIARY, - 'text-tertiary-hsl': TEXT_TERTIARY_HSL, - 'text-disabled': TEXT_DISABLED, - 'text-disabled-tertiary': TEXT_DISABLED, - 'accent-cta-bg': BLUE_PRIMARY, - 'accent-cta-bg-pure': BLUE_PRIMARY, - 'accent-emphasis': BLUE_PRIMARY, - 'accent-soft': BLUE_SOFT, - 'accent-hover': BLUE_DEEP, - 'accent-pure-cta-fg': SURFACE_BG, - 'switch-track-on': BLUE_PRIMARY, +// 既有分组/对比度/否决依据:docs/design-rules/design-decision-log.md +// 「2026-09-11 DS-8 内置主题依据迁移」→ one-dark-pro(生成区外保留)。 +// BEGIN GENERATED DS-8: theme +const GENERATED_OVERRIDES = { + "surface": "#282c34", + "surface-hsl": "220 13% 18%", + "surface-elevated": "#21252b", + "surface-elevated-soft": "#21252b", + "surface-card-ivory": "#21252b", + "surface-chip": "#2c313a", + "surface-chip-alt": "#2c313a", + "surface-hover": "#2c313a", + "surface-hover-soft": "#2c313a", + "surface-hover-hsl": "220 14% 20%", + "surface-on-card": "#282c34", + "border-default": "#3e4452", + "border-default-hsl": "220 14% 28%", + "border-shadcn-hsl": "220 14% 28%", + "border-transparent-mixed": "#3e4452", + "text-primary": "#abb2bf", + "text-primary-on-dark": "#abb2bf", + "text-primary-emphasis": "#abb2bf", + "text-primary-inv": "#abb2bf", + "text-primary-body-strong": "#abb2bf", + "text-primary-hsl": "219 14% 71%", + "text-secondary": "#7f848e", + "text-secondary-cross": "#7f848e", + "text-secondary-mid": "#7f848e", + "text-tertiary": "#5c6370", + "text-tertiary-stone": "#5c6370", + "text-tertiary-mid": "#5c6370", + "text-tertiary-hsl": "220 9% 40%", + "text-disabled": "#495162", + "text-disabled-tertiary": "#495162", + "accent-cta-bg": "#61afef", + "accent-cta-bg-pure": "#61afef", + "accent-emphasis": "#61afef", + "accent-soft": "#82c0ff", + "accent-hover": "#3d7ec8", + "accent-pure-cta-fg": "#282c34", + "switch-track-on": "#61afef", + "accent": "220 14% 20%", + "agent-actions-rail": "#3e4452", + "ask-checkbox-border": "#495162", + "background": "220 13% 18%", + "create-agent-control-bg": "#282c34", + "create-agent-control-bg-hover": "#2c313a", + "create-agent-control-bg-pressed": "#2c313a", + "create-agent-control-border": "#3e4452", + "create-agent-control-icon": "#abb2bf", + "create-agent-control-text": "#abb2bf", + "create-agent-quick-card-bg": "#282c34", + "create-agent-quick-card-bg-hover": "#2c313a", + "create-agent-quick-card-border": "#3e4452", + "create-agent-quick-card-icon": "#abb2bf", + "create-agent-quick-card-icon-bg": "#3e4452", + "create-agent-quick-card-text": "#abb2bf", + "create-agent-segment-inactive-text": "#5c6370", + "create-agent-segment-track-bg": "#282c34", + "send-btn-bg": "#abb2bf", + "send-btn-icon": "#282c34", + "chat-input-chip-border": "#3e4452", + "chat-input-text": "#abb2bf", + "color-primary": "#abb2bf", + "confirm-bg": "#21252b", + "confirm-btn-primary-bg": "#61afef", + "confirm-btn-primary-text": "#282c34", + "confirm-btn-secondary-border": "#3e4452", + "confirm-btn-secondary-hover": "rgba(255, 255, 255, 0.06)", + "confirm-btn-secondary-text": "#abb2bf", + "confirm-title": "#abb2bf", + "drop-overlay-bg": "rgba(97, 175, 239, 0.1)", + "file-chip-bg": "#3e4452", + "file-remove-bg": "#495162", + "info-700": "#82c0ff", + "model-trigger-hover": "#2c313a", + "msg-link": "#82c0ff", + "msg-scrollbar-hover": "#495162", + "muted": "220 14% 20%", + "muted-foreground": "220 6% 53%", + "perm-allow-btn-bg": "#61afef", + "perm-allow-btn-text": "#282c34", + "perm-allow-kbd-bg": "#2c313a", + "perm-allow-kbd-border": "#3e4452", + "perm-code-bg": "#282c34", + "perm-item-selected-bg": "#2c313a", + "plan-outline-active-bg": "#2c313a", + "plan-toolbar-btn-hover-bg": "#2c313a", + "popover": "220 13% 15%", + "primary-foreground": "220 13% 18%", + "search-match-fg": "219 14% 71%", + "secondary": "220 13% 15%", + "settings-btn-primary-text": "#282c34", + "settings-btn-secondary-hover-bg": "#2c313a", + "text-placeholder": "#495162", + "settings-integration-avatar-bg": "#2c313a", + "settings-logout-bg": "#2c313a", + "settings-menu-bg-hover": "#2c313a", + "settings-menu-bg-selected": "#2c313a", + "settings-source-link": "#82c0ff", + "settings-theme-auto-dark": "#282c34", + "sidebar-action-icon": "220 9% 40%", + "sidebar-item-active": "220 14% 20%", + "splash-bg": "220 13% 18%", + "splash-text": "220 6% 53%", + "splash-text-destructive": "219 14% 71%", + "splash-text-muted": "220 9% 40%", + "titlebar-icon": "220 6% 53%", + "tooltip-bg": "#282c34", + "tooltip-text": "#abb2bf", + "update-btn-border": "#61afef", + "update-btn-text": "#61afef", } as const; +// END GENERATED DS-8: theme + -const singletonOverrides = { - accent: HOVER_BG_HSL, - 'agent-actions-rail': BORDER_BG, - 'ask-checkbox-border': TEXT_DISABLED, - background: SURFACE_BG_HSL, - // CREATE AGENT 卡片 / 顶部 pill / 分段开关 + composer pill(#607): - // 卡片底与 surface 同值收敛(模板惯例),icon 圆底用 CHIP,send 走 tier1 反相 CTA。 - 'create-agent-control-bg': SURFACE_BG, - 'create-agent-control-bg-hover': HOVER_BG, - 'create-agent-control-bg-pressed': CHIP_BG, - 'create-agent-control-border': BORDER_BG, - 'create-agent-control-icon': TEXT_PRIMARY, - 'create-agent-control-text': TEXT_PRIMARY, - 'create-agent-quick-card-bg': SURFACE_BG, - 'create-agent-quick-card-bg-hover': HOVER_BG, - 'create-agent-quick-card-border': BORDER_BG, - 'create-agent-quick-card-icon': TEXT_PRIMARY, - 'create-agent-quick-card-icon-bg': BORDER_BG, - 'create-agent-quick-card-text': TEXT_PRIMARY, - 'create-agent-segment-inactive-text': TEXT_TERTIARY, - 'create-agent-segment-track-bg': SURFACE_BG, - 'send-btn-bg': TEXT_PRIMARY, - 'send-btn-icon': SURFACE_BG, - 'chat-input-chip-border': BORDER_BG, - 'chat-input-text': TEXT_PRIMARY, - 'color-primary': TEXT_PRIMARY, - 'confirm-bg': ELEVATED_BG, - 'confirm-btn-primary-bg': BLUE_PRIMARY, - 'confirm-btn-primary-text': SURFACE_BG, - 'confirm-btn-secondary-border': BORDER_BG, - 'confirm-btn-secondary-hover': 'rgba(255, 255, 255, 0.06)', - 'confirm-btn-secondary-text': TEXT_PRIMARY, - 'confirm-title': TEXT_PRIMARY, - 'drop-overlay-bg': 'rgba(97, 175, 239, 0.1)', - 'file-chip-bg': BORDER_BG, - 'file-remove-bg': TEXT_DISABLED, - 'info-700': BLUE_SOFT, - 'model-trigger-hover': HOVER_BG, - 'msg-link': BLUE_SOFT, - 'msg-scrollbar-hover': TEXT_DISABLED, - muted: CHIP_BG_HSL, - 'muted-foreground': TEXT_SECONDARY_HSL, - 'perm-allow-btn-bg': BLUE_PRIMARY, - 'perm-allow-btn-text': SURFACE_BG, - 'perm-allow-kbd-bg': CHIP_BG, - 'perm-allow-kbd-border': BORDER_BG, - 'perm-code-bg': SURFACE_BG, - 'perm-item-selected-bg': CHIP_BG, - 'plan-outline-active-bg': CHIP_BG, - 'plan-toolbar-btn-hover-bg': HOVER_BG, - popover: ELEVATED_BG_HSL, - 'primary-foreground': SURFACE_BG_HSL, - 'search-match-fg': TEXT_PRIMARY_HSL, - secondary: ELEVATED_BG_HSL, - 'settings-btn-primary-text': SURFACE_BG, - 'settings-btn-secondary-hover-bg': HOVER_BG, - 'text-placeholder': TEXT_DISABLED, - 'settings-integration-avatar-bg': CHIP_BG, - 'settings-logout-bg': CHIP_BG, - 'settings-menu-bg-hover': HOVER_BG, - 'settings-menu-bg-selected': CHIP_BG, - 'settings-source-link': BLUE_SOFT, - 'settings-theme-auto-dark': SURFACE_BG, - 'sidebar-action-icon': TEXT_TERTIARY_HSL, - 'sidebar-item-active': CHIP_BG_HSL, - 'splash-bg': SURFACE_BG_HSL, - 'splash-text': TEXT_SECONDARY_HSL, - 'splash-text-destructive': TEXT_PRIMARY_HSL, - 'splash-text-muted': TEXT_TERTIARY_HSL, - 'titlebar-icon': TEXT_SECONDARY_HSL, - 'tooltip-bg': SURFACE_BG, - 'tooltip-text': TEXT_PRIMARY, - 'update-btn-border': BLUE_PRIMARY, - 'update-btn-text': BLUE_PRIMARY, -} as const; export const oneDarkPro: Theme = { id: 'one-dark-pro', name: 'One Dark Pro', type: 'dark', - colors: { - ...slotOverrides, - ...singletonOverrides, - }, + colors: GENERATED_OVERRIDES, }; diff --git a/apps/desktop/src/renderer/themes/builtin/solarized-light.ts b/apps/desktop/src/renderer/themes/builtin/solarized-light.ts index 418beaf7b91..1d30d57c7ff 100644 --- a/apps/desktop/src/renderer/themes/builtin/solarized-light.ts +++ b/apps/desktop/src/renderer/themes/builtin/solarized-light.ts @@ -12,167 +12,127 @@ import type { Theme } from '../types'; // 保留官方鲜活感优先于 WCAG AA 数字合规:#859900 vs base3/white 对比度 ~3, // 但 H=68 与中性灰 H=0 色相对比强,视觉区分度反而高于加深版。要强制合规改 #5e6a00。 -const GREEN_PRIMARY = '#859900'; -const GREEN_DEEP = '#5e6a00'; - -const SURFACE_BG = '#fdf6e3'; // base3 -// ELEVATED (Card 层) 与 Chip 同色 = base2。Solarized 官方只有两档色板, -// docs/design-rules/cindy-design-system.md §2.54 也明文承认 Dark Mode 里 "Card layer color and chip color -// collapse to the same value — both represent one step lifted off Surface" -// 这里把同一惯例搬到 light 模式:Card 比 Surface 略深一档 (94% → 88% L, -// 差 6%) 产生"下沉式抬起"视觉,与 macOS 浅色模式 input 类似。 -const CHIP_BG = '#eee8d5'; // base2 — Card / Chip / Hover / sidebar-active 同源 -const ELEVATED_BG = CHIP_BG; -const ELEVATED_SOFT_BG = CHIP_BG; -const HOVER_BG = CHIP_BG; -const BORDER_BG = '#e1dcc4'; // base2 加深,1px 分界 -const SURFACE_BG_HSL = '44 86% 94%'; -const CHIP_BG_HSL = '46 42% 88%'; -const ELEVATED_BG_HSL = CHIP_BG_HSL; -const HOVER_BG_HSL = CHIP_BG_HSL; -const BORDER_BG_HSL = '50 33% 82%'; - -const TEXT_PRIMARY = '#757575'; // 中性灰,正文,刻意比 default-light 淡 -const TEXT_SECONDARY = '#828282'; // label / desc -const TEXT_TERTIARY = '#999999'; // meta / 弱化 -const TEXT_DISABLED = '#bdbdbd'; -const TEXT_PRIMARY_HSL = '0 0% 46%'; -const TEXT_SECONDARY_HSL = '0 0% 51%'; -const TEXT_TERTIARY_HSL = '0 0% 60%'; - -const slotOverrides = { - surface: SURFACE_BG, - 'surface-hsl': SURFACE_BG_HSL, - 'surface-elevated': ELEVATED_BG, - 'surface-elevated-soft': ELEVATED_SOFT_BG, - 'surface-card-ivory': ELEVATED_BG, - 'surface-chip': CHIP_BG, - 'surface-chip-alt': ELEVATED_SOFT_BG, - 'surface-hover': HOVER_BG, - 'surface-hover-soft': SURFACE_BG, - 'surface-hover-hsl': HOVER_BG_HSL, - 'surface-on-card': ELEVATED_BG, - 'border-default': BORDER_BG, - 'border-default-hsl': BORDER_BG_HSL, - 'border-shadcn-hsl': BORDER_BG_HSL, - 'border-transparent-mixed': 'transparent', - 'text-primary': TEXT_PRIMARY, - 'text-primary-on-dark': TEXT_PRIMARY, - 'text-primary-emphasis': TEXT_PRIMARY, - 'text-primary-inv': TEXT_PRIMARY, - 'text-primary-body-strong': TEXT_PRIMARY, - 'text-primary-hsl': TEXT_PRIMARY_HSL, - 'text-secondary': TEXT_SECONDARY, - 'text-secondary-cross': TEXT_SECONDARY, - 'text-secondary-mid': TEXT_SECONDARY, - 'text-tertiary': TEXT_TERTIARY, - 'text-tertiary-stone': TEXT_TERTIARY, - 'text-tertiary-mid': TEXT_TERTIARY, - 'text-tertiary-hsl': TEXT_TERTIARY_HSL, - 'text-disabled': TEXT_DISABLED, - 'text-disabled-tertiary': TEXT_DISABLED, - 'accent-cta-bg': GREEN_PRIMARY, - 'accent-cta-bg-pure': GREEN_PRIMARY, - 'accent-emphasis': GREEN_PRIMARY, - 'accent-soft': GREEN_DEEP, - 'accent-hover': GREEN_DEEP, - 'accent-pure-cta-fg': '#FFFFFF', - 'switch-track-on': GREEN_DEEP, // 官方绿 #859900 对 thumb 2.97/对 surface 2.62 低于 3:1,取深绿变体(用户裁决 2026-08-05) +// 既有分组/对比度/否决依据:docs/design-rules/design-decision-log.md +// 「2026-09-11 DS-8 内置主题依据迁移」→ solarized-light(生成区外保留)。 +// BEGIN GENERATED DS-8: theme +const GENERATED_OVERRIDES = { + "surface": "#fdf6e3", + "surface-hsl": "44 86% 94%", + "surface-elevated": "#eee8d5", + "surface-elevated-soft": "#eee8d5", + "surface-card-ivory": "#eee8d5", + "surface-chip": "#eee8d5", + "surface-chip-alt": "#eee8d5", + "surface-hover": "#eee8d5", + "surface-hover-soft": "#fdf6e3", + "surface-hover-hsl": "46 42% 88%", + "surface-on-card": "#eee8d5", + "border-default": "#e1dcc4", + "border-default-hsl": "50 33% 82%", + "border-shadcn-hsl": "50 33% 82%", + "border-transparent-mixed": "transparent", + "text-primary": "#757575", + "text-primary-on-dark": "#757575", + "text-primary-emphasis": "#757575", + "text-primary-inv": "#757575", + "text-primary-body-strong": "#757575", + "text-primary-hsl": "0 0% 46%", + "text-secondary": "#828282", + "text-secondary-cross": "#828282", + "text-secondary-mid": "#828282", + "text-tertiary": "#999999", + "text-tertiary-stone": "#999999", + "text-tertiary-mid": "#999999", + "text-tertiary-hsl": "0 0% 60%", + "text-disabled": "#bdbdbd", + "text-disabled-tertiary": "#bdbdbd", + "accent-cta-bg": "#859900", + "accent-cta-bg-pure": "#859900", + "accent-emphasis": "#859900", + "accent-soft": "#5e6a00", + "accent-hover": "#5e6a00", + "accent-pure-cta-fg": "#FFFFFF", + "switch-track-on": "#5e6a00", // 官方绿 #859900 对 thumb 2.97/对 surface 2.62 低于 3:1,取深绿变体(用户裁决 2026-08-05) + "accent": "46 42% 88%", + "agent-actions-rail": "#e1dcc4", + "ask-checkbox-border": "#999999", + "background": "44 86% 94%", + "chat-input-bg": "#eee8d5", + "create-agent-control-bg": "#eee8d5", + "create-agent-control-bg-hover": "#fdf6e3", + "create-agent-control-bg-pressed": "#eee8d5", + "create-agent-control-border": "#e1dcc4", + "create-agent-control-icon": "#757575", + "create-agent-control-text": "#757575", + "create-agent-quick-card-bg": "#eee8d5", + "create-agent-quick-card-bg-hover": "#fdf6e3", + "create-agent-quick-card-border": "#e1dcc4", + "create-agent-quick-card-icon": "#757575", + "create-agent-quick-card-icon-bg": "#fdf6e3", + "create-agent-quick-card-text": "#757575", + "create-agent-segment-inactive-text": "#828282", + "create-agent-segment-track-bg": "#eee8d5", + "chat-input-chip-border": "#e1dcc4", + "chat-input-text": "#757575", + "color-primary": "#757575", + "confirm-bg": "#eee8d5", + "confirm-btn-primary-bg": "#859900", + "confirm-btn-primary-text": "#FFFFFF", + "confirm-btn-secondary-border": "#e1dcc4", + "confirm-btn-secondary-hover": "rgba(0, 0, 0, 0.06)", + "confirm-btn-secondary-text": "#757575", + "confirm-title": "#757575", + "drop-overlay-bg": "rgba(133, 153, 0, 0.1)", + "file-chip-bg": "#eee8d5", + "file-remove-bg": "#999999", + "info-700": "#5e6a00", + "model-trigger-hover": "#eee8d5", + "msg-link": "#859900", + "msg-scrollbar-hover": "#999999", + "msg-user-bg": "#eee8d5", + "muted": "46 42% 88%", + "muted-foreground": "0 0% 51%", + "perm-auto-selected-text": "#859900", // 自动审批的色相标识,与 bypass 橙拉开 + "perm-allow-btn-bg": "#859900", + "perm-allow-btn-text": "#FFFFFF", + "perm-allow-kbd-bg": "#eee8d5", + "perm-allow-kbd-border": "#e1dcc4", + "perm-code-bg": "#eee8d5", + "perm-item-selected-bg": "#eee8d5", + "plan-outline-active-bg": "#eee8d5", + "plan-toolbar-btn-hover-bg": "#eee8d5", + "popover": "46 42% 88%", + "primary-foreground": "0 0% 100%", + "search-match-fg": "0 0% 46%", + "secondary": "46 42% 88%", + "settings-btn-primary-text": "#FFFFFF", + "settings-btn-secondary-hover-bg": "#eee8d5", + "text-placeholder": "#bdbdbd", + "settings-integration-avatar-bg": "#eee8d5", + "settings-logout-bg": "#eee8d5", + "settings-menu-bg-hover": "#eee8d5", + "settings-menu-bg-selected": "#eee8d5", + "settings-source-link": "#859900", + "settings-theme-auto-dark": "#fdf6e3", + "sidebar-action-icon": "0 0% 60%", + "sidebar-item-active": "46 42% 88%", + "splash-bg": "44 86% 94%", + "splash-text": "0 0% 51%", + "splash-text-destructive": "0 0% 46%", + "splash-text-muted": "0 0% 60%", + "titlebar-icon": "0 0% 51%", + "tooltip-bg": "#757575", + "tooltip-text": "#fdf6e3", + "update-btn-border": "#859900", + "update-btn-text": "#859900", } as const; +// END GENERATED DS-8: theme + -const singletonOverrides = { - accent: HOVER_BG_HSL, - 'agent-actions-rail': BORDER_BG, - 'ask-checkbox-border': TEXT_TERTIARY, - background: SURFACE_BG_HSL, - 'chat-input-bg': CHIP_BG, - // CREATE AGENT 快速开始卡片 / 顶部 pill / 分段开关(#607): - // 卡片用 base2(CHIP)下沉式抬起,与 chat-input 同层;边框/文字走 tier1 同源常量。 - // hover 必须提亮到 base3(SURFACE):CHIP 与 HOVER 在本主题同值,沿用 HOVER 会让 - // 卡片 default/hover 同色、icon 圆底与卡片同色(codex P1 3671116833)。 - 'create-agent-control-bg': CHIP_BG, - 'create-agent-control-bg-hover': SURFACE_BG, - 'create-agent-control-bg-pressed': HOVER_BG, - 'create-agent-control-border': BORDER_BG, - 'create-agent-control-icon': TEXT_PRIMARY, - 'create-agent-control-text': TEXT_PRIMARY, - 'create-agent-quick-card-bg': CHIP_BG, - 'create-agent-quick-card-bg-hover': SURFACE_BG, - 'create-agent-quick-card-border': BORDER_BG, - 'create-agent-quick-card-icon': TEXT_PRIMARY, - // icon 圆底 resting 提到 base3(SURFACE) 与 base2 卡片区分;hover 时卡片升到 - // base3、圆底由模板规则落回 base2(CHIP),两态均可分(codex P1 3671457570)。 - 'create-agent-quick-card-icon-bg': SURFACE_BG, - // send 不用 accent(green) 底:共享 send token 还渲染 10-12px 文本 - // (VoiceInputOverlay / SessionHandoffCard),白字仅 - // 3.20:1,不达 DESIGN.md §10 小字 4.5:1;回退 registry 反相中性(codex P1 - // 3671457561),故本主题不覆盖 send-btn-*。 - 'create-agent-quick-card-text': TEXT_PRIMARY, - 'create-agent-segment-inactive-text': TEXT_SECONDARY, - 'create-agent-segment-track-bg': CHIP_BG, - 'chat-input-chip-border': BORDER_BG, - 'chat-input-text': TEXT_PRIMARY, - 'color-primary': TEXT_PRIMARY, - 'confirm-bg': ELEVATED_BG, - 'confirm-btn-primary-bg': GREEN_PRIMARY, - 'confirm-btn-primary-text': '#FFFFFF', - 'confirm-btn-secondary-border': BORDER_BG, - 'confirm-btn-secondary-hover': 'rgba(0, 0, 0, 0.06)', - 'confirm-btn-secondary-text': TEXT_PRIMARY, - 'confirm-title': TEXT_PRIMARY, - 'drop-overlay-bg': 'rgba(133, 153, 0, 0.1)', - 'file-chip-bg': CHIP_BG, - 'file-remove-bg': TEXT_TERTIARY, - 'info-700': GREEN_DEEP, - 'model-trigger-hover': HOVER_BG, - 'msg-link': GREEN_PRIMARY, - 'msg-scrollbar-hover': TEXT_TERTIARY, - 'msg-user-bg': CHIP_BG, - muted: CHIP_BG_HSL, - 'muted-foreground': TEXT_SECONDARY_HSL, - 'perm-auto-selected-text': GREEN_PRIMARY, // 自动审批的色相标识,与 bypass 橙拉开 - 'perm-allow-btn-bg': GREEN_PRIMARY, - 'perm-allow-btn-text': '#FFFFFF', - 'perm-allow-kbd-bg': CHIP_BG, - 'perm-allow-kbd-border': BORDER_BG, - 'perm-code-bg': ELEVATED_SOFT_BG, - 'perm-item-selected-bg': CHIP_BG, - 'plan-outline-active-bg': CHIP_BG, - 'plan-toolbar-btn-hover-bg': HOVER_BG, - popover: ELEVATED_BG_HSL, - 'primary-foreground': '0 0% 100%', - 'search-match-fg': TEXT_PRIMARY_HSL, - secondary: CHIP_BG_HSL, - 'settings-btn-primary-text': '#FFFFFF', - 'settings-btn-secondary-hover-bg': HOVER_BG, - // 用 disabled(比 tertiary 更淡)而非 tertiary:亮色背景下 tertiary 偏深, - // 命中 docs/design-rules/cindy-design-system.md §4 禁用 Silver 的对比度,placeholder 需更淡才"读着像空"。 - 'text-placeholder': TEXT_DISABLED, - 'settings-integration-avatar-bg': CHIP_BG, - 'settings-logout-bg': CHIP_BG, - 'settings-menu-bg-hover': HOVER_BG, - 'settings-menu-bg-selected': CHIP_BG, - 'settings-source-link': GREEN_PRIMARY, - 'settings-theme-auto-dark': SURFACE_BG, - 'sidebar-action-icon': TEXT_TERTIARY_HSL, - 'sidebar-item-active': CHIP_BG_HSL, - 'splash-bg': SURFACE_BG_HSL, - 'splash-text': TEXT_SECONDARY_HSL, - 'splash-text-destructive': TEXT_PRIMARY_HSL, - 'splash-text-muted': TEXT_TERTIARY_HSL, - 'titlebar-icon': TEXT_SECONDARY_HSL, - 'tooltip-bg': TEXT_PRIMARY, - 'tooltip-text': SURFACE_BG, - 'update-btn-border': GREEN_PRIMARY, - 'update-btn-text': GREEN_PRIMARY, -} as const; export const solarizedLight: Theme = { id: 'solarized-light', name: 'Solarized Light', type: 'light', - colors: { - ...slotOverrides, - ...singletonOverrides, - }, + colors: GENERATED_OVERRIDES, }; diff --git a/apps/desktop/src/renderer/themes/colors.ts b/apps/desktop/src/renderer/themes/colors.ts index 7f65f1714b2..eb63c340b6a 100644 --- a/apps/desktop/src/renderer/themes/colors.ts +++ b/apps/desktop/src/renderer/themes/colors.ts @@ -1,65 +1,2133 @@ import { registerColor } from './color-registry'; -import { EFFORT_TIER_COLORS, PRICE_TIER_COLORS } from './effortTierColors'; +// BEGIN GENERATED DS-8: defaults +const GENERATED_DEFAULTS = { + "surface": { + "light": "#f8f8f6", + "dark": "#1f1f1e" + }, + "surface-hsl": { + "light": "60 12.5% 97%", + "dark": "60 2% 12%" + }, + "surface-elevated": { + "light": "#ffffff", + "dark": "#2c2c2a" + }, + "surface-elevated-soft": { + "light": "#e5e5e5", + "dark": "#2c2c2a" + }, + "surface-card-ivory": { + "light": "#faf9f5", + "dark": "#2c2c2a" + }, + "surface-chip": { + "light": "#e5e5e5", + "dark": "#3c3c3a" + }, + "surface-chip-alt": { + "light": "#e5e5e5", + "dark": "#2c2c2a" + }, + "surface-hover": { + "light": "#e5e5e5", + "dark": "#3c3c3a" + }, + "surface-hover-soft": { + "light": "#f8f8f6", + "dark": "#3c3c3a" + }, + "surface-hover-hsl": { + "light": "0 0% 90%", + "dark": "60 2% 17%" + }, + "surface-on-card": { + "light": "#ffffff", + "dark": "#1f1f1e" + }, + "panel-bg": { + "light": "var(--surface)", + "dark": "var(--surface)" + }, + "md-table-bg": { + "light": "rgba(236, 236, 234, 0.55)", + "dark": "rgba(44, 44, 42, 0.55)" + }, + "border-default": { + "light": "#d7d7d4", + "dark": "#3c3c3a" + }, + "border-default-hsl": { + "light": "60 3% 84%", + "dark": "60 2% 23%" + }, + "border-shadcn-hsl": { + "light": "0 0% 90%", + "dark": "30 4% 28%" + }, + "border-transparent-mixed": { + "light": "transparent", + "dark": "#3c3c3a" + }, + "board": { + "light": "var(--border-default)", + "dark": "var(--border-default)" + }, + "text-primary": { + "light": "#262626", + "dark": "#d4d4d4" + }, + "text-primary-on-dark": { + "light": "#262626", + "dark": "#ffffff" + }, + "text-primary-emphasis": { + "light": "#1a1a1a", + "dark": "#d4d4d4" + }, + "text-primary-inv": { + "light": "#1a1a1a", + "dark": "#ffffff" + }, + "text-primary-body-strong": { + "light": "#525252", + "dark": "#d4d4d4" + }, + "text-primary-hsl": { + "light": "0 0% 9%", + "dark": "0 0% 83%" + }, + "text-secondary": { + "light": "#737373", + "dark": "#a3a3a3" + }, + "text-secondary-cross": { + "light": "#a3a3a3", + "dark": "#a3a3a3" + }, + "text-secondary-mid": { + "light": "#525252", + "dark": "#a3a3a3" + }, + "text-tertiary": { + "light": "#a3a3a3", + "dark": "#737373" + }, + "text-tertiary-stone": { + "light": "#737373", + "dark": "#737373" + }, + "text-tertiary-mid": { + "light": "#525252", + "dark": "#737373" + }, + "text-tertiary-hsl": { + "light": "0 0% 45%", + "dark": "0 0% 45%" + }, + "text-disabled": { + "light": "#d4d4d4", + "dark": "#525252" + }, + "text-disabled-tertiary": { + "light": "#a3a3a3", + "dark": "#737373" + }, + "text-placeholder": { + "light": "#c4c4c4", + "dark": "#525252" + }, + "accent-cta-bg": { + "light": "#262626", + "dark": "#ffffff" + }, + "accent-cta-bg-pure": { + "light": "#000000", + "dark": "#ffffff" + }, + "accent-emphasis": { + "light": "#262626", + "dark": "#d4d4d4" + }, + "accent-soft": { + "light": "#262626", + "dark": "#ffffff" + }, + "accent-hover": { + "light": "#262626", + "dark": "#e5e5e5" + }, + "accent-pure-cta-fg": { + "light": "#ffffff", + "dark": "#000000" + }, + "error-flat": { + "light": "#ef4444", + "dark": "#ef4444" + }, + "warning-accent": { + "light": "#EA6B17", + "dark": "#EA6B17" + }, + "process-agent-task-icon": { + "light": "#2563EB", + "dark": "#60A5FA" + }, + "process-agent-service-icon": { + "light": "#7C3AED", + "dark": "#A78BFA" + }, + "process-main-icon": { + "light": "#DB2777", + "dark": "#F472B6" + }, + "process-renderer-icon": { + "light": "#0891B2", + "dark": "#22D3EE" + }, + "process-gpu-icon": { + "light": "#D97706", + "dark": "#F59E0B" + }, + "process-utility-icon": { + "light": "#059669", + "dark": "#34D399" + }, + "usage-heatmap-high": { + "light": "var(--process-agent-task-icon)", + "dark": "var(--process-agent-task-icon)" + }, + "usage-model-1": { + "light": "#14B8A6", + "dark": "#2DD4BF" + }, + "usage-model-2": { + "light": "#F43F5E", + "dark": "#FB7185" + }, + "usage-model-3": { + "light": "#8B5CF6", + "dark": "#A78BFA" + }, + "usage-model-4": { + "light": "#6366F1", + "dark": "#818CF8" + }, + "usage-model-5": { + "light": "#F59E0B", + "dark": "#FBBF24" + }, + "background": { + "light": "0 0% 100%", + "dark": "60 3% 14%" + }, + "foreground": { + "light": "var(--text-primary-hsl)", + "dark": "var(--text-primary-hsl)" + }, + "muted": { + "light": "0 0% 96%", + "dark": "30 6% 20%" + }, + "muted-foreground": { + "light": "0 0% 45%", + "dark": "24 5% 64%" + }, + "border": { + "light": "var(--border-shadcn-hsl)", + "dark": "var(--border-shadcn-hsl)" + }, + "input": { + "light": "var(--border-shadcn-hsl)", + "dark": "var(--border-shadcn-hsl)" + }, + "switch-track-off": { + "light": "var(--text-secondary)", + "dark": "var(--text-secondary)" + }, + "switch-thumb-off": { + "light": "var(--surface-on-card)", + "dark": "var(--surface-on-card)" + }, + "switch-disabled-opacity": { + "light": "0.3", + "dark": "0.3" + }, + "switch-disabled-thumb-opacity": { + "light": "0.5", + "dark": "0.5" + }, + "switch-track-on": { + "light": "hsl(var(--primary))", + "dark": "hsl(var(--primary))" + }, + "ring": { + "light": "var(--text-primary-hsl)", + "dark": "var(--text-primary-hsl)" + }, + "primary": { + "light": "var(--text-primary-hsl)", + "dark": "var(--text-primary-hsl)" + }, + "primary-foreground": { + "light": "0 0% 98%", + "dark": "60 3% 14%" + }, + "secondary": { + "light": "0 0% 96%", + "dark": "30 6% 20%" + }, + "secondary-foreground": { + "light": "var(--text-primary-hsl)", + "dark": "var(--text-primary-hsl)" + }, + "accent": { + "light": "0 0% 96%", + "dark": "30 6% 20%" + }, + "accent-foreground": { + "light": "var(--text-primary-hsl)", + "dark": "var(--text-primary-hsl)" + }, + "popover": { + "light": "0 0% 100%", + "dark": "60 3% 15%" + }, + "popover-foreground": { + "light": "var(--text-primary-hsl)", + "dark": "var(--text-primary-hsl)" + }, + "radius": { + "light": "0.5rem", + "dark": null + }, + "titlebar": { + "light": "var(--surface-hsl)", + "dark": "var(--surface-hsl)" + }, + "titlebar-border": { + "light": "var(--border-default-hsl)", + "dark": "var(--border-default-hsl)" + }, + "titlebar-icon": { + "light": "0 0% 45%", + "dark": "0 0% 63.92%" + }, + "titlebar-button-hover": { + "light": "var(--surface-hover-hsl)", + "dark": "var(--surface-hover-hsl)" + }, + "titlebar-control-hover": { + "light": "var(--surface-hover-hsl)", + "dark": "var(--surface-hover-hsl)" + }, + "splash-bg": { + "light": "60 12.45% 96.86%", + "dark": "60 1.64% 11.96%" + }, + "splash-text": { + "light": "0 0% 45.1%", + "dark": "0 0% 63.92%" + }, + "splash-text-muted": { + "light": "30 3.6% 62.55%", + "dark": "30 2.78% 43.73%" + }, + "splash-text-destructive": { + "light": "0 0% 14.9%", + "dark": "0 0% 100%" + }, + "splash-fade-duration": { + "light": "400ms", + "dark": null + }, + "splash-fade-easing": { + "light": "cubic-bezier(0.4, 0, 1, 1)", + "dark": null + }, + "destructive": { + "light": "0 84% 60%", + "dark": "0 72% 63%" + }, + "confirm-bg": { + "light": "#fafafa", + "dark": "#2c2c2a" + }, + "confirm-title": { + "light": "#171717", + "dark": "#fafafa" + }, + "confirm-desc": { + "light": "var(--text-tertiary-stone)", + "dark": "var(--text-tertiary-stone)" + }, + "confirm-btn-primary-bg": { + "light": "#171717", + "dark": "#fafafa" + }, + "confirm-btn-primary-text": { + "light": "#fafafa", + "dark": "#171717" + }, + "confirm-btn-primary-hover": { + "light": "var(--accent-hover)", + "dark": "var(--accent-hover)" + }, + "confirm-btn-secondary-text": { + "light": "#262626", + "dark": "#fafafa" + }, + "confirm-btn-secondary-border": { + "light": "#d4d4d4", + "dark": "#3c3c3a" + }, + "confirm-btn-secondary-hover": { + "light": "rgba(0, 0, 0, 0.04)", + "dark": "rgba(255, 255, 255, 0.06)" + }, + "sidebar": { + "light": "var(--surface-hsl)", + "dark": "var(--surface-hsl)" + }, + "sidebar-border": { + "light": "var(--border-default-hsl)", + "dark": "var(--border-default-hsl)" + }, + "sidebar-item-hover": { + "light": "var(--surface-hover-hsl)", + "dark": "var(--surface-hover-hsl)" + }, + "sidebar-item-active": { + "light": "0 0% 90%", + "dark": "60 2% 17%" + }, + "sidebar-item-active-foreground": { + "light": "var(--foreground)", + "dark": "var(--foreground)" + }, + "sidebar-item-active-border": { + "light": "var(--sidebar-item-active)", + "dark": "var(--sidebar-item-active)" + }, + "sidebar-search-bg": { + "light": "var(--surface-hsl)", + "dark": "var(--surface-hsl)" + }, + "sidebar-muted": { + "light": "var(--text-tertiary-hsl)", + "dark": "var(--text-tertiary-hsl)" + }, + "sidebar-action-icon": { + "light": "0 0% 64%", + "dark": "0 0% 45%" + }, + "search-match-bg": { + "light": "53 100% 89%", + "dark": "40 33% 16%" + }, + "search-match-fg": { + "light": "0 0% 15%", + "dark": "0 0% 90%" + }, + "update-btn-border": { + "light": "#d4d4d4", + "dark": "#3c3c3a" + }, + "update-btn-text": { + "light": "#404040", + "dark": "#ffffff" + }, + "update-btn-hover": { + "light": "rgba(0, 0, 0, 0.04)", + "dark": "rgba(255, 255, 255, 0.06)" + }, + "update-btn-bg": { + "light": "transparent", + "dark": "transparent" + }, + "content-area": { + "light": "var(--surface-hsl)", + "dark": "var(--surface-hsl)" + }, + "welcome-text": { + "light": "var(--text-tertiary-hsl)", + "dark": "var(--text-tertiary-hsl)" + }, + "login-bg-base": { + "light": "#EDEDED", + "dark": "#1F1F1E" + }, + "login-panel-border": { + "light": "#D4D4D4", + "dark": "#434343" + }, + "login-link-pressed": { + "light": "#1A1818", + "dark": "#C0BEBE" + }, + "login-callback-card-bg": { + "light": "#FBFBFB", + "dark": "#312F2F" + }, + "login-callback-card-border": { + "light": "#D4D4D4", + "dark": "#434343" + }, + "login-callback-title": { + "light": "#252222", + "dark": "#D4D4D4" + }, + "login-callback-body": { + "light": "#6F6F6F", + "dark": "#6F6F6F" + }, + "login-callback-cta-bg": { + "light": "#2A2828", + "dark": "#EEEEEE" + }, + "login-callback-cta-border": { + "light": "#434343", + "dark": "#FFFFFF" + }, + "login-callback-cta-text": { + "light": "#D4D4D4", + "dark": "#2A2828" + }, + "login-panel-bg": { + "light": "#FBFBFB", + "dark": "#312F2F" + }, + "login-control-bg": { + "light": "#EEEEEE", + "dark": "#2C2A2A" + }, + "login-action-control-bg": { + "light": "#EEEEEE", + "dark": "#2A2828" + }, + "login-back-border": { + "light": "#FFFFFF", + "dark": "#434343" + }, + "login-control-border": { + "light": "#D4D4D4", + "dark": "#434343" + }, + "login-control-border-active": { + "light": "#2A2828", + "dark": "#EEEEEE" + }, + "login-control-border-disabled": { + "light": "#B4B4B4", + "dark": "#B4B4B4" + }, + "login-control-text": { + "light": "#252222", + "dark": "#EEEEEE" + }, + "login-control-placeholder": { + "light": "#D4D4D4", + "dark": "#6F6F6F" + }, + "login-title-text": { + "light": "#252222", + "dark": "#D4D4D4" + }, + "login-secondary-text": { + "light": "#6F6F6F", + "dark": "#6F6F6F" + }, + "login-primary-button-bg": { + "light": "#2A2828", + "dark": "#EEEEEE" + }, + "login-primary-button-border": { + "light": "#434343", + "dark": "#FFFFFF" + }, + "login-primary-button-text": { + "light": "#D4D4D4", + "dark": "#2A2828" + }, + "login-disabled-button-overlay": { + "light": "rgba(255, 255, 255, 0.7)", + "dark": "rgba(255, 255, 255, 0.7)" + }, + "login-disabled-button-bg": { + "light": "#2A2828", + "dark": "#2A2828" + }, + "login-disabled-button-text": { + "light": "#D4D4D4", + "dark": "#D4D4D4" + }, + "login-inverted-button-border": { + "light": "#FFFFFF", + "dark": "#FFFFFF" + }, + "login-link-text": { + "light": "#2A2828", + "dark": "#EEEEEE" + }, + "login-link-hover": { + "light": "#4A4848", + "dark": "#A8A8A8" + }, + "login-error-fg": { + "light": "#D91F37", + "dark": "#D91F37" + }, + "login-deletion-bubble-bg": { + "light": "#FFFFFF", + "dark": "#1F1F1E" + }, + "login-deletion-bubble-border": { + "light": "#D7D7D4", + "dark": "#3C3C3A" + }, + "login-splash-progress-track": { + "light": "#D9D9D9", + "dark": "#434343" + }, + "login-splash-progress-fill": { + "light": "#252222", + "dark": "#D4D4D4" + }, + "login-overlay-button-hover": { + "light": "rgba(255, 255, 255, 0.08)", + "dark": "rgba(0, 0, 0, 0.05)" + }, + "login-overlay-button-pressed": { + "light": "rgba(0, 0, 0, 0.5)", + "dark": "rgba(0, 0, 0, 0.1)" + }, + "login-overlay-back-hover": { + "light": "rgba(255, 255, 255, 0.7)", + "dark": "rgba(255, 255, 255, 0.08)" + }, + "login-overlay-back-pressed": { + "light": "rgba(0, 0, 0, 0.08)", + "dark": "rgba(0, 0, 0, 0.08)" + }, + "login-overlay-row-hover": { + "light": "rgba(255, 255, 255, 0.08)", + "dark": "rgba(255, 255, 255, 0.08)" + }, + "login-overlay-row-pressed": { + "light": "rgba(0, 0, 0, 0.08)", + "dark": "rgba(0, 0, 0, 0.08)" + }, + "login-overlay-input-hover": { + "light": "rgba(0, 0, 0, 0.05)", + "dark": "rgba(255, 255, 255, 0.05)" + }, + "login-loading-ring-track": { + "light": "rgba(42, 40, 40, 0.18)", + "dark": "rgba(212, 212, 212, 0.18)" + }, + "login-consent-radio-bg": { + "light": "#F1F0F1", + "dark": "#2A2828" + }, + "login-consent-radio-border": { + "light": "#434343", + "dark": "#F1F0F1" + }, + "login-consent-radio-checked-bg": { + "light": "#2A2828", + "dark": "#F1F0F1" + }, + "login-consent-radio-check": { + "light": "#FFFFFF", + "dark": "#2A2828" + }, + "login-consent-overlay": { + "light": "rgba(0, 0, 0, 0.85)", + "dark": "rgba(0, 0, 0, 0.85)" + }, + "login-secondary-button-bg": { + "light": "#EEEEEE", + "dark": "#434141" + }, + "login-secondary-button-border": { + "light": "#FFFFFF", + "dark": "#565454" + }, + "login-secondary-button-text": { + "light": "#2A2828", + "dark": "#EEEEEE" + }, + "login-overlay-secondary-hover": { + "light": "rgba(255, 255, 255, 0.1)", + "dark": "rgba(255, 255, 255, 0.08)" + }, + "login-overlay-secondary-pressed": { + "light": "rgba(0, 0, 0, 0.1)", + "dark": "rgba(0, 0, 0, 0.2)" + }, + "login-apple-circle-bg": { + "light": "#000000", + "dark": "#FFFFFF" + }, + "lightbox-cta-bg": { + "light": "var(--accent-cta-bg-pure)", + "dark": "var(--accent-cta-bg-pure)" + }, + "lightbox-cta-fg": { + "light": "var(--accent-pure-cta-fg)", + "dark": "var(--accent-pure-cta-fg)" + }, + "lightbox-cta-hover": { + "light": "var(--accent-hover)", + "dark": "var(--accent-hover)" + }, + "chat-input-bg": { + "light": "var(--surface-elevated)", + "dark": "var(--surface-elevated)" + }, + "chat-input-border": { + "light": "var(--border-default)", + "dark": "var(--border-default)" + }, + "chat-input-border-focus": { + "light": "var(--text-tertiary)", + "dark": "var(--text-tertiary)" + }, + "chat-input-text": { + "light": "#000000", + "dark": "#d4d4d4" + }, + "chat-input-placeholder": { + "light": "var(--text-placeholder)", + "dark": "var(--text-placeholder)" + }, + "file-chip-bg": { + "light": "#a3a3a3", + "dark": "#525252" + }, + "drop-overlay-bg": { + "light": "rgba(163, 163, 163, 0.08)", + "dark": "rgba(115, 115, 115, 0.1)" + }, + "drop-overlay-border": { + "light": "var(--text-tertiary)", + "dark": "var(--text-tertiary)" + }, + "tooltip-bg": { + "light": "#262626", + "dark": "#1f1f1e" + }, + "tooltip-text": { + "light": "#ffffff", + "dark": "#ffffff" + }, + "file-remove-bg": { + "light": "#525252", + "dark": "#737373" + }, + "file-badge-pdf": { + "light": "#B23A26", + "dark": "#B23A26" + }, + "file-badge-doc": { + "light": "#2C5CA8", + "dark": "#2C5CA8" + }, + "file-badge-sheet": { + "light": "#2E7D4F", + "dark": "#2E7D4F" + }, + "file-badge-slide": { + "light": "#A25A12", + "dark": "#A25A12" + }, + "file-badge-code": { + "light": "#5B49A8", + "dark": "#5B49A8" + }, + "file-badge-fg": { + "light": "#FFFFFF", + "dark": "#FFFFFF" + }, + "bot-avatar-red-bg": { + "light": "#f7ded9", + "dark": "#4a2e2a" + }, + "bot-avatar-orange-bg": { + "light": "#f9e3d2", + "dark": "#4a3527" + }, + "bot-avatar-amber-bg": { + "light": "#f6ebcd", + "dark": "#473a22" + }, + "bot-avatar-green-bg": { + "light": "#dceedd", + "dark": "#26402a" + }, + "bot-avatar-teal-bg": { + "light": "#d6ebea", + "dark": "#21403e" + }, + "bot-avatar-blue-bg": { + "light": "#dce6f5", + "dark": "#263449" + }, + "bot-avatar-violet-bg": { + "light": "#e3ddf3", + "dark": "#322b48" + }, + "bot-avatar-pink-bg": { + "light": "#f6deea", + "dark": "#452b39" + }, + "bot-avatar-graphite-bg": { + "light": "#e5e5e5", + "dark": "#3c3c3a" + }, + "bot-unread-bg": { + "light": "#417CDD", + "dark": "#417CDD" + }, + "bot-unread-fg": { + "light": "#FFFFFF", + "dark": "#FFFFFF" + }, + "chat-input-chip-bg": { + "light": "var(--surface-chip)", + "dark": "var(--surface-chip)" + }, + "chat-input-chip-border": { + "light": "#d7d7d4", + "dark": "#525250" + }, + "chat-input-chip-text": { + "light": "var(--text-primary)", + "dark": "var(--text-primary)" + }, + "chat-input-chip-icon": { + "light": "var(--text-primary)", + "dark": "var(--text-primary)" + }, + "cmd-palette-bg": { + "light": "var(--surface-elevated)", + "dark": "var(--surface-elevated)" + }, + "cmd-palette-border": { + "light": "var(--border-default)", + "dark": "var(--border-default)" + }, + "cmd-palette-item-hover": { + "light": "var(--surface-hover)", + "dark": "var(--surface-hover)" + }, + "cmd-palette-item-text": { + "light": "var(--text-primary)", + "dark": "var(--text-primary)" + }, + "cmd-palette-item-meta": { + "light": "var(--text-secondary)", + "dark": "var(--text-secondary)" + }, + "cmd-palette-item-icon": { + "light": "var(--text-secondary)", + "dark": "var(--text-secondary)" + }, + "cmd-palette-empty": { + "light": "var(--text-secondary)", + "dark": "var(--text-secondary)" + }, + "cmd-palette-tooltip-body": { + "light": "var(--text-secondary)", + "dark": "var(--text-secondary)" + }, + "send-btn-bg": { + "light": "var(--accent-cta-bg)", + "dark": "var(--accent-cta-bg)" + }, + "send-btn-icon": { + "light": "var(--surface-on-card)", + "dark": "var(--surface-on-card)" + }, + "send-btn-disabled-bg": { + "light": "var(--surface-elevated-soft)", + "dark": "var(--surface-elevated-soft)" + }, + "send-btn-disabled-icon": { + "light": "var(--text-disabled-tertiary)", + "dark": "var(--text-disabled-tertiary)" + }, + "send-btn-hover-bg": { + "light": "var(--send-btn-bg)", + "dark": "var(--send-btn-bg)" + }, + "send-btn-pressed-bg": { + "light": "var(--send-btn-bg)", + "dark": "var(--send-btn-bg)" + }, + "perm-code-bg": { + "light": "#f5f5f5", + "dark": "#1f1f1e" + }, + "perm-code-border": { + "light": "var(--border-default)", + "dark": "var(--border-default)" + }, + "perm-allow-btn-bg": { + "light": "#ffffff", + "dark": "#ffffff" + }, + "perm-allow-btn-text": { + "light": "#262626", + "dark": "#262626" + }, + "perm-allow-kbd-bg": { + "light": "#f5f5f5", + "dark": "#e5e5e5" + }, + "perm-allow-kbd-border": { + "light": "#d7d7d4", + "dark": "#d7d7d4" + }, + "model-trigger-hover": { + "light": "#e5e5e5", + "dark": "#2c2c2a" + }, + "model-trigger-text": { + "light": "var(--text-secondary)", + "dark": "var(--text-secondary)" + }, + "model-trigger-meta": { + "light": "var(--text-tertiary)", + "dark": "var(--text-tertiary)" + }, + "model-trigger-arrow": { + "light": "var(--text-secondary-cross)", + "dark": "var(--text-secondary-cross)" + }, + "thinking-body-text": { + "light": "var(--text-tertiary)", + "dark": "var(--text-tertiary)" + }, + "model-dropdown-bg": { + "light": "var(--surface-elevated)", + "dark": "var(--surface-elevated)" + }, + "model-dropdown-border": { + "light": "var(--border-default)", + "dark": "var(--border-default)" + }, + "model-item-hover": { + "light": "var(--surface-hover)", + "dark": "var(--surface-hover)" + }, + "model-item-text": { + "light": "var(--text-primary)", + "dark": "var(--text-primary)" + }, + "model-item-check": { + "light": "var(--accent-cta-bg-pure)", + "dark": "var(--accent-cta-bg-pure)" + }, + "model-item-desc": { + "light": "var(--text-secondary)", + "dark": "var(--text-secondary)" + }, + "model-section-label": { + "light": "var(--text-secondary)", + "dark": "var(--text-secondary)" + }, + "favorite-star": { + "light": "#d99a06", + "dark": "#e8b425" + }, + "effort-tier-minimal": { + "light": "#2AAE5B", + "dark": "#2AAE5B" + }, + "effort-tier-low": { + "light": "#2AAE5B", + "dark": "#2AAE5B" + }, + "effort-tier-medium": { + "light": "#14B8A6", + "dark": "#14B8A6" + }, + "effort-tier-high": { + "light": "#3B82F6", + "dark": "#3B82F6" + }, + "effort-tier-xhigh": { + "light": "#4F46E5", + "dark": "#4F46E5" + }, + "effort-tier-max": { + "light": "#8B5CF6", + "dark": "#8B5CF6" + }, + "effort-tier-ultra": { + "light": "#8B5CF6", + "dark": "#8B5CF6" + }, + "price-tier-t1": { + "light": "#2AAE5B", + "dark": "#2AAE5B" + }, + "price-tier-t2": { + "light": "#B58A1F", + "dark": "#B58A1F" + }, + "price-tier-t3": { + "light": "#C05353", + "dark": "#C05353" + }, + "fast-accent": { + "light": "#3B9EFF", + "dark": "#3B9EFF" + }, + "engine-badge-cc": { + "light": "#d97757", + "dark": "#d97757" + }, + "engine-badge-codex": { + "light": "#7a9dff", + "dark": "#7a9dff" + }, + "engine-badge-pi": { + "light": "#a78bfa", + "dark": "#a78bfa" + }, + "perm-item-selected-bg": { + "light": "#f8f8f6", + "dark": "#3c3c3a" + }, + "perm-auto-selected-text": { + "light": "#417CDD", + "dark": "#417CDD" + }, + "perm-bypass-selected-text": { + "light": "var(--warning-accent)", + "dark": "var(--warning-accent)" + }, + "folder-picker-bg": { + "light": "var(--surface-elevated)", + "dark": "var(--surface-elevated)" + }, + "folder-picker-border": { + "light": "var(--border-default)", + "dark": "var(--border-default)" + }, + "folder-item-hover": { + "light": "var(--surface-hover)", + "dark": "var(--surface-hover)" + }, + "folder-item-name": { + "light": "var(--text-primary)", + "dark": "var(--text-primary)" + }, + "folder-item-path": { + "light": "var(--text-secondary)", + "dark": "var(--text-secondary)" + }, + "folder-item-icon": { + "light": "var(--text-secondary)", + "dark": "var(--text-secondary)" + }, + "folder-label": { + "light": "var(--text-secondary)", + "dark": "var(--text-secondary)" + }, + "folder-btn-bg": { + "light": "var(--chat-input-bg)", + "dark": "var(--chat-input-bg)" + }, + "folder-btn-border": { + "light": "var(--border-default)", + "dark": "var(--border-default)" + }, + "folder-btn-text": { + "light": "var(--accent-soft)", + "dark": "var(--accent-soft)" + }, + "folder-btn-icon": { + "light": "var(--accent-soft)", + "dark": "var(--accent-soft)" + }, + "workingdir-text": { + "light": "var(--text-secondary)", + "dark": "var(--text-secondary)" + }, + "workingdir-icon": { + "light": "var(--text-secondary)", + "dark": "var(--text-secondary)" + }, + "fast-toggle-off": { + "light": "var(--text-secondary)", + "dark": "var(--text-secondary)" + }, + "fast-toggle-track": { + "light": "var(--text-disabled)", + "dark": "var(--text-disabled)" + }, + "chat-placeholder-text": { + "light": "var(--text-tertiary)", + "dark": "var(--text-tertiary)" + }, + "msg-user-bg": { + "light": "var(--surface-elevated)", + "dark": "var(--surface-elevated)" + }, + "msg-user-border": { + "light": "var(--border-default)", + "dark": "var(--border-default)" + }, + "msg-user-text": { + "light": "var(--text-primary)", + "dark": "var(--text-primary)" + }, + "msg-assistant-text": { + "light": "var(--text-primary)", + "dark": "var(--text-primary)" + }, + "msg-tool-text": { + "light": "var(--text-secondary-mid)", + "dark": "var(--text-secondary-mid)" + }, + "msg-code-block-bg": { + "light": "var(--surface-elevated)", + "dark": "var(--surface-elevated)" + }, + "msg-code-block-border": { + "light": "var(--border-default)", + "dark": "var(--border-default)" + }, + "msg-code-inline-bg": { + "light": "var(--surface-chip)", + "dark": "var(--surface-chip)" + }, + "msg-md-inline-code-bg": { + "light": "rgba(175, 184, 193, 0.2)", + "dark": "rgba(110, 118, 129, 0.22)" + }, + "msg-table-border": { + "light": "var(--border-default)", + "dark": "var(--border-default)" + }, + "msg-table-header-bg": { + "light": "var(--surface)", + "dark": "var(--surface)" + }, + "msg-blockquote-border": { + "light": "var(--agent-actions-rail)", + "dark": "var(--agent-actions-rail)" + }, + "msg-blockquote-text": { + "light": "var(--text-primary)", + "dark": "var(--text-primary)" + }, + "msg-hr-border": { + "light": "var(--border-default)", + "dark": "var(--border-default)" + }, + "msg-scrollbar": { + "light": "var(--border-default)", + "dark": "var(--border-default)" + }, + "msg-scrollbar-hover": { + "light": "#b0b0ae", + "dark": "#555553" + }, + "msg-cursor": { + "light": "var(--text-primary)", + "dark": "var(--text-primary)" + }, + "msg-link": { + "light": "#2563eb", + "dark": "#60a5fa" + }, + "msg-tool-card-bg": { + "light": "var(--surface-elevated)", + "dark": "var(--surface-elevated)" + }, + "msg-tool-card-border": { + "light": "var(--border-default)", + "dark": "var(--border-default)" + }, + "msg-tool-card-chevron": { + "light": "var(--text-secondary-mid)", + "dark": "var(--text-secondary-mid)" + }, + "msg-tool-card-text": { + "light": "var(--text-primary)", + "dark": "var(--text-primary)" + }, + "todo-bar-track": { + "light": "var(--surface-chip)", + "dark": "var(--surface-chip)" + }, + "diff-del-fg": { + "light": "#b31d28", + "dark": "#ff7b72" + }, + "diff-del-bg": { + "light": "#ffeef0", + "dark": "#67060c" + }, + "diff-del-emphasis": { + "light": "#ffd7d5", + "dark": "rgba(248, 81, 73, 0.42)" + }, + "diff-add-fg": { + "light": "#22863a", + "dark": "#7ee787" + }, + "pr-open-on-light": { + "light": "#2EA043", + "dark": "#2EA043" + }, + "pr-open-on-dark": { + "light": "#3FB950", + "dark": "#3FB950" + }, + "diff-add-bg": { + "light": "#f0fff4", + "dark": "#033a16" + }, + "diff-add-emphasis": { + "light": "#acf2bd", + "dark": "rgba(46, 160, 67, 0.42)" + }, + "diff-line-num": { + "light": "var(--text-tertiary-stone)", + "dark": "var(--text-tertiary-stone)" + }, + "info-700": { + "light": "#1D4ED8", + "dark": "#60a5fa" + }, + "agent-actions-rail": { + "light": "#DDD6CB", + "dark": "#404040" + }, + "quota-bar-fill": { + "light": "var(--text-secondary)", + "dark": "var(--text-secondary)" + }, + "quota-bar-warn": { + "light": "var(--warning-fg)", + "dark": "var(--warning-fg)" + }, + "quota-bar-crit": { + "light": "var(--error-flat)", + "dark": "var(--error-flat)" + }, + "quota-bar-track": { + "light": "var(--surface-chip)", + "dark": "var(--surface-chip)" + }, + "status-bar-accent": { + "light": "var(--warning-accent)", + "dark": "var(--warning-accent)" + }, + "status-badge-fg": { + "light": "var(--accent-pure-cta-fg)", + "dark": "var(--accent-pure-cta-fg)" + }, + "surface-translucent-sidebar": { + "light": "var(--surface)", + "dark": "var(--surface)" + }, + "surface-translucent-main": { + "light": "var(--surface-elevated)", + "dark": "var(--surface-elevated)" + }, + "surface-translucent-overlay": { + "light": "var(--surface-elevated)", + "dark": "var(--surface-elevated)" + }, + "sidebar-search-input-bg": { + "light": "var(--surface-elevated)", + "dark": "var(--surface-elevated)" + }, + "composer-pill-bg": { + "light": "#FCFCFC", + "dark": "#393838" + }, + "composer-pill-icon": { + "light": "#3C3F43", + "dark": "#D9D9D9" + }, + "status-bar-meta": { + "light": "var(--text-secondary)", + "dark": "var(--text-secondary)" + }, + "settings-bg": { + "light": "var(--surface)", + "dark": "var(--surface)" + }, + "settings-divider": { + "light": "var(--border-default)", + "dark": "var(--border-default)" + }, + "settings-back-icon": { + "light": "var(--text-tertiary-mid)", + "dark": "var(--text-tertiary-mid)" + }, + "settings-back-text": { + "light": "var(--text-primary)", + "dark": "var(--text-primary)" + }, + "settings-back-hover": { + "light": "var(--text-primary)", + "dark": "var(--text-primary)" + }, + "settings-menu-text": { + "light": "var(--text-primary)", + "dark": "var(--text-primary)" + }, + "settings-menu-text-selected": { + "light": "var(--text-primary)", + "dark": "var(--text-primary)" + }, + "settings-menu-bg-selected": { + "light": "#e8e8e6", + "dark": "#2c2c2a" + }, + "settings-menu-border-selected": { + "light": "var(--border-transparent-mixed)", + "dark": "var(--border-transparent-mixed)" + }, + "settings-menu-bg-hover": { + "light": "#ececea", + "dark": "#2c2c2a" + }, + "settings-section-title": { + "light": "var(--text-primary)", + "dark": "var(--text-primary)" + }, + "settings-section-desc": { + "light": "var(--text-tertiary-mid)", + "dark": "var(--text-tertiary-mid)" + }, + "settings-section-sublabel": { + "light": "var(--text-tertiary-mid)", + "dark": "var(--text-tertiary-mid)" + }, + "settings-profile-card-bg": { + "light": "var(--surface-card-ivory)", + "dark": "var(--surface-card-ivory)" + }, + "settings-profile-card-border": { + "light": "var(--border-default)", + "dark": "var(--border-default)" + }, + "settings-profile-avatar-bg": { + "light": "var(--surface-chip-alt)", + "dark": "var(--surface-chip-alt)" + }, + "settings-profile-avatar-text": { + "light": "var(--text-primary)", + "dark": "var(--text-primary)" + }, + "settings-profile-name": { + "light": "var(--text-primary)", + "dark": "var(--text-primary)" + }, + "settings-input-bg": { + "light": "var(--surface-card-ivory)", + "dark": "var(--surface-card-ivory)" + }, + "settings-input-border": { + "light": "var(--border-default)", + "dark": "var(--border-default)" + }, + "settings-input-border-focus": { + "light": "var(--text-tertiary-stone)", + "dark": "var(--text-tertiary-stone)" + }, + "settings-input-text": { + "light": "var(--text-primary)", + "dark": "var(--text-primary)" + }, + "settings-input-placeholder": { + "light": "var(--text-placeholder)", + "dark": "var(--text-placeholder)" + }, + "settings-eye-icon": { + "light": "var(--text-tertiary-stone)", + "dark": "var(--text-tertiary-stone)" + }, + "settings-eye-icon-hover": { + "light": "var(--text-primary)", + "dark": "var(--text-primary)" + }, + "settings-trash-icon": { + "light": "var(--text-secondary)", + "dark": "var(--text-secondary)" + }, + "settings-trash-icon-hover": { + "light": "var(--text-primary)", + "dark": "var(--text-primary)" + }, + "settings-source-meta": { + "light": "var(--text-secondary-cross)", + "dark": "var(--text-secondary-cross)" + }, + "settings-source-link": { + "light": "#262626", + "dark": "#d4d4d4" + }, + "settings-error-text": { + "light": "var(--error-flat)", + "dark": "var(--error-flat)" + }, + "settings-badge-bg": { + "light": "var(--surface-card-ivory)", + "dark": "var(--surface-card-ivory)" + }, + "settings-badge-border": { + "light": "var(--border-default)", + "dark": "var(--border-default)" + }, + "settings-badge-needs-config": { + "light": "var(--text-tertiary)", + "dark": "var(--text-tertiary)" + }, + "settings-badge-saved": { + "light": "var(--text-secondary)", + "dark": "var(--text-secondary)" + }, + "settings-badge-connected": { + "light": "var(--card-status-done)", + "dark": "var(--card-status-done)" + }, + "settings-badge-connected-text": { + "light": "var(--text-primary)", + "dark": "var(--text-primary)" + }, + "settings-badge-error": { + "light": "var(--error-flat)", + "dark": "var(--error-flat)" + }, + "settings-btn-primary-bg": { + "light": "var(--accent-emphasis)", + "dark": "var(--accent-emphasis)" + }, + "settings-btn-primary-text": { + "light": "#faf9f5", + "dark": "#262626" + }, + "settings-btn-primary-border": { + "light": "var(--accent-emphasis)", + "dark": "var(--accent-emphasis)" + }, + "settings-btn-primary-hover-bg": { + "light": "var(--accent-hover)", + "dark": "var(--accent-hover)" + }, + "settings-btn-secondary-bg": { + "light": "var(--surface-chip-alt)", + "dark": "var(--surface-chip-alt)" + }, + "settings-btn-secondary-text": { + "light": "var(--text-primary)", + "dark": "var(--text-primary)" + }, + "settings-btn-secondary-border": { + "light": "var(--border-default)", + "dark": "var(--border-default)" + }, + "settings-btn-secondary-hover-bg": { + "light": "#d7d7d4", + "dark": "#3c3c3a" + }, + "settings-theme-card-bg": { + "light": "var(--surface-card-ivory)", + "dark": "var(--surface-card-ivory)" + }, + "settings-theme-card-border": { + "light": "var(--border-default)", + "dark": "var(--border-default)" + }, + "settings-theme-preview-bg": { + "light": "var(--surface)", + "dark": "var(--surface)" + }, + "settings-theme-preview-border": { + "light": "var(--border-default)", + "dark": "var(--border-default)" + }, + "settings-theme-preview-border-active": { + "light": "var(--accent-emphasis)", + "dark": "var(--accent-emphasis)" + }, + "settings-theme-icon": { + "light": "var(--text-tertiary-stone)", + "dark": "var(--text-tertiary-stone)" + }, + "settings-theme-icon-active": { + "light": "var(--accent-emphasis)", + "dark": "var(--accent-emphasis)" + }, + "settings-theme-label": { + "light": "var(--text-tertiary-stone)", + "dark": "var(--text-tertiary-stone)" + }, + "settings-theme-label-active": { + "light": "var(--accent-emphasis)", + "dark": "var(--accent-emphasis)" + }, + "settings-theme-auto-light": { + "light": "#f8f8f6", + "dark": "#f8f8f6" + }, + "settings-theme-auto-dark": { + "light": "#1f1f1e", + "dark": "#1f1f1e" + }, + "settings-logout-bg": { + "light": "#faf9f5", + "dark": "#2c2c2a" + }, + "settings-logout-border": { + "light": "var(--border-default)", + "dark": "var(--border-default)" + }, + "settings-logout-text": { + "light": "var(--text-primary)", + "dark": "var(--text-primary)" + }, + "settings-logout-icon": { + "light": "var(--text-primary)", + "dark": "var(--text-primary)" + }, + "settings-logout-hover-bg": { + "light": "var(--surface-hover-soft)", + "dark": "var(--surface-hover-soft)" + }, + "settings-integration-avatar-bg": { + "light": "#faf9f5", + "dark": "#3c3c3a" + }, + "settings-integration-avatar-border": { + "light": "#e8e8e6", + "dark": "rgba(255, 255, 255, 0.08)" + }, + "settings-integration-avatar-icon": { + "light": "var(--text-primary)", + "dark": "var(--text-primary)" + }, + "settings-integration-subtitle": { + "light": "var(--text-secondary)", + "dark": "var(--text-secondary)" + }, + "settings-integration-warning": { + "light": "var(--warning-accent)", + "dark": "var(--warning-accent)" + }, + "remote-status-ready": { + "light": "#2AAE5B", + "dark": "#2AAE5B" + }, + "remote-status-progress": { + "light": "#f59e0b", + "dark": "#f59e0b" + }, + "remote-status-failed": { + "light": "#D91F37", + "dark": "#D91F37" + }, + "card-status-awaiting": { + "light": "#19D2C1", + "dark": "#19D2C1" + }, + "sidebar-draft-indicator": { + "light": "#0B726B", + "dark": "var(--card-status-awaiting)" + }, + "card-status-error": { + "light": "#D91F37", + "dark": "#D91F37" + }, + "card-status-done": { + "light": "#2AAE5B", + "dark": "#2AAE5B" + }, + "completion-badge-fg": { + "light": "#1f1f1e", + "dark": "#1f1f1e" + }, + "remote-status-disconnected": { + "light": "var(--text-tertiary)", + "dark": "var(--text-tertiary)" + }, + "ask-card-bg": { + "light": "var(--surface-elevated)", + "dark": "var(--surface-elevated)" + }, + "ask-card-border": { + "light": "var(--border-default)", + "dark": "var(--border-default)" + }, + "ask-header-text": { + "light": "var(--text-primary)", + "dark": "var(--text-primary)" + }, + "ask-page-text": { + "light": "var(--text-tertiary)", + "dark": "var(--text-tertiary)" + }, + "ask-option-label": { + "light": "var(--text-primary)", + "dark": "var(--text-primary)" + }, + "ask-option-desc": { + "light": "var(--text-tertiary-stone)", + "dark": "var(--text-tertiary-stone)" + }, + "ask-option-custom": { + "light": "var(--text-tertiary)", + "dark": "var(--text-tertiary)" + }, + "ask-option-divider": { + "light": "var(--border-default)", + "dark": "var(--border-default)" + }, + "ask-option-border": { + "light": "var(--border-default)", + "dark": "var(--border-default)" + }, + "ask-badge-bg": { + "light": "var(--surface-chip)", + "dark": "var(--surface-chip)" + }, + "ask-badge-text": { + "light": "var(--text-primary)", + "dark": "var(--text-primary)" + }, + "ask-header-chip-bg": { + "light": "var(--surface-chip)", + "dark": "var(--surface-chip)" + }, + "ask-option-list-bg": { + "light": "var(--surface-elevated)", + "dark": "var(--surface-elevated)" + }, + "ask-input-bg": { + "light": "var(--surface-elevated)", + "dark": "var(--surface-elevated)" + }, + "ask-input-border": { + "light": "var(--border-default)", + "dark": "var(--border-default)" + }, + "ask-input-text": { + "light": "var(--text-primary)", + "dark": "var(--text-primary)" + }, + "ask-input-placeholder": { + "light": "var(--text-placeholder)", + "dark": "var(--text-placeholder)" + }, + "ask-send-bg": { + "light": "var(--accent-cta-bg)", + "dark": "var(--accent-cta-bg)" + }, + "ask-send-text": { + "light": "var(--surface-on-card)", + "dark": "var(--surface-on-card)" + }, + "ask-send-disabled-bg": { + "light": "var(--surface-elevated-soft)", + "dark": "var(--surface-elevated-soft)" + }, + "ask-send-disabled-text": { + "light": "var(--text-disabled-tertiary)", + "dark": "var(--text-disabled-tertiary)" + }, + "ask-answered-text": { + "light": "var(--text-secondary)", + "dark": "var(--text-secondary)" + }, + "ask-expired-text": { + "light": "var(--text-tertiary)", + "dark": "var(--text-tertiary)" + }, + "ask-option-hover": { + "light": "var(--surface-hover-soft)", + "dark": "var(--surface-hover-soft)" + }, + "ask-checkbox-border": { + "light": "#525250", + "dark": "#525250" + }, + "ask-checkbox-checked-bg": { + "light": "var(--accent-cta-bg)", + "dark": "var(--accent-cta-bg)" + }, + "ask-checkbox-checked-icon": { + "light": "var(--surface-on-card)", + "dark": "var(--surface-on-card)" + }, + "plan-card-bg": { + "light": "var(--surface-elevated)", + "dark": "var(--surface-elevated)" + }, + "plan-card-border": { + "light": "var(--border-default)", + "dark": "var(--border-default)" + }, + "plan-header-title": { + "light": "var(--text-primary-emphasis)", + "dark": "var(--text-primary-emphasis)" + }, + "plan-header-hint": { + "light": "var(--text-tertiary)", + "dark": "var(--text-tertiary)" + }, + "plan-header-divider": { + "light": "var(--border-default)", + "dark": "var(--border-default)" + }, + "plan-toolbar-btn-icon": { + "light": "var(--text-tertiary-stone)", + "dark": "var(--text-tertiary-stone)" + }, + "plan-toolbar-btn-hover-bg": { + "light": "#e8e8e5", + "dark": "#3c3c3a" + }, + "plan-outline-bg": { + "light": "var(--surface-elevated)", + "dark": "var(--surface-elevated)" + }, + "plan-outline-border": { + "light": "var(--border-default)", + "dark": "var(--border-default)" + }, + "plan-outline-label": { + "light": "var(--text-tertiary-stone)", + "dark": "var(--text-tertiary-stone)" + }, + "plan-outline-item-text": { + "light": "var(--text-tertiary-stone)", + "dark": "var(--text-tertiary-stone)" + }, + "plan-outline-active-bg": { + "light": "#e8e8e5", + "dark": "#3c3c3a" + }, + "plan-outline-active-text": { + "light": "var(--text-primary-emphasis)", + "dark": "var(--text-primary-emphasis)" + }, + "plan-content-bg": { + "light": "var(--surface-elevated)", + "dark": "var(--surface-elevated)" + }, + "plan-content-section": { + "light": "var(--text-primary-emphasis)", + "dark": "var(--text-primary-emphasis)" + }, + "plan-content-body": { + "light": "var(--text-primary-body-strong)", + "dark": "var(--text-primary-body-strong)" + }, + "plan-content-divider": { + "light": "var(--border-default)", + "dark": "var(--border-default)" + }, + "plan-edit-body": { + "light": "var(--text-primary-body-strong)", + "dark": "var(--text-primary-body-strong)" + }, + "plan-action-approve-text": { + "light": "var(--text-primary-emphasis)", + "dark": "var(--text-primary-emphasis)" + }, + "plan-action-approve-enter": { + "light": "var(--text-secondary-cross)", + "dark": "var(--text-secondary-cross)" + }, + "plan-action-row-divider": { + "light": "var(--border-default)", + "dark": "var(--border-default)" + }, + "plan-action-fb-icon": { + "light": "var(--text-secondary-cross)", + "dark": "var(--text-secondary-cross)" + }, + "plan-action-fb-placeholder": { + "light": "var(--text-placeholder)", + "dark": "var(--text-placeholder)" + }, + "plan-action-fb-text": { + "light": "var(--text-primary-emphasis)", + "dark": "var(--text-primary-emphasis)" + }, + "plan-action-row-hover-bg": { + "light": "var(--surface-hover-soft)", + "dark": "var(--surface-hover-soft)" + }, + "plan-action-approve-icon-bg": { + "light": "var(--warning-accent)", + "dark": "var(--warning-accent)" + }, + "plan-action-approve-icon-fg": { + "light": "#ffffff", + "dark": "#ffffff" + }, + "plan-min-title": { + "light": "var(--text-primary-emphasis)", + "dark": "var(--text-primary-emphasis)" + }, + "plan-min-icon": { + "light": "var(--text-secondary-cross)", + "dark": "var(--text-secondary-cross)" + }, + "plan-bubble-badge-bg": { + "light": "var(--surface-chip)", + "dark": "var(--surface-chip)" + }, + "plan-bubble-badge-text": { + "light": "var(--text-primary)", + "dark": "var(--text-primary)" + }, + "plan-bubble-body-text": { + "light": "var(--text-primary-body-strong)", + "dark": "var(--text-primary-body-strong)" + }, + "plan-bubble-summary-text": { + "light": "var(--text-secondary)", + "dark": "var(--text-secondary)" + }, + "color-primary": { + "light": "#171717", + "dark": "#d4d4d4" + }, + "color-neutral-300": { + "light": "var(--text-disabled)", + "dark": "var(--text-disabled)" + }, + "color-neutral-400": { + "light": "var(--text-tertiary)", + "dark": "var(--text-tertiary)" + }, + "color-error-600": { + "light": "var(--error-flat)", + "dark": "var(--error-flat)" + }, + "color-error-700": { + "light": "#dc2626", + "dark": "#dc2626" + }, + "focus-ring": { + "light": "#417CDD", + "dark": "#417CDD" + }, + "focus-ring-soft": { + "light": "rgba(65, 124, 221, 0.5)", + "dark": "rgba(65, 124, 221, 0.5)" + }, + "text-selection-bg": { + "light": "var(--focus-ring-soft)", + "dark": "var(--focus-ring-soft)" + }, + "overlay-modal": { + "light": "rgba(0, 0, 0, 0.5)", + "dark": "rgba(0, 0, 0, 0.7)" + }, + "overlay-lightbox": { + "light": "rgba(0, 0, 0, 0.85)", + "dark": "rgba(0, 0, 0, 0.85)" + }, + "lightbox-toolbar-bg": { + "light": "rgba(0, 0, 0, 0.6)", + "dark": "rgba(0, 0, 0, 0.6)" + }, + "lightbox-toolbar-border": { + "light": "rgba(255, 255, 255, 0.2)", + "dark": "rgba(255, 255, 255, 0.2)" + }, + "lightbox-toolbar-fg": { + "light": "rgba(255, 255, 255, 0.8)", + "dark": "rgba(255, 255, 255, 0.8)" + }, + "lightbox-toolbar-fg-hover": { + "light": "#ffffff", + "dark": "#ffffff" + }, + "lightbox-toolbar-hover-bg": { + "light": "rgba(255, 255, 255, 0.1)", + "dark": "rgba(255, 255, 255, 0.1)" + }, + "error-bg": { + "light": "#fef2f2", + "dark": "#3a2222" + }, + "error-border": { + "light": "rgba(220, 38, 38, 0.4)", + "dark": "#7f1d1d" + }, + "error-fg": { + "light": "#dc2626", + "dark": "#f87171" + }, + "error-fg-strong": { + "light": "#991b1b", + "dark": "#fca5a5" + }, + "warning-bg-soft": { + "light": "rgba(234, 107, 23, 0.12)", + "dark": "rgba(234, 107, 23, 0.18)" + }, + "warning-fg": { + "light": "#F3A115", + "dark": "#F3A115" + }, + "text-danger": { + "light": "var(--error-fg)", + "dark": "var(--error-fg)" + }, + "danger-bg-soft": { + "light": "var(--error-bg)", + "dark": "var(--error-bg)" + }, + "status-info": { + "light": "var(--info-700)", + "dark": "var(--info-700)" + }, + "status-success": { + "light": "#177C3C", + "dark": "#2AAE5B" + }, + "upgrade-banner-bg": { + "light": "rgba(255, 102, 0, 0.10)", + "dark": "rgba(255, 102, 0, 0.16)" + }, + "upgrade-banner-border": { + "light": "rgba(245, 158, 11, 0.45)", + "dark": "rgba(245, 158, 11, 0.55)" + }, + "upgrade-banner-fg": { + "light": "#92400e", + "dark": "#FBBF24" + }, + "skillhub-review-pending-bg": { + "light": "#fff7ed", + "dark": "rgba(251, 146, 60, 0.14)" + }, + "skillhub-review-pending-border": { + "light": "#fed7aa", + "dark": "rgba(251, 146, 60, 0.35)" + }, + "skillhub-review-pending-fg": { + "light": "#ea580c", + "dark": "#fb923c" + }, + "skillhub-review-quarantine-bg": { + "light": "#fefce8", + "dark": "rgba(250, 204, 21, 0.12)" + }, + "skillhub-review-quarantine-border": { + "light": "#fef08a", + "dark": "rgba(250, 204, 21, 0.35)" + }, + "skillhub-review-quarantine-fg": { + "light": "#a16207", + "dark": "#facc15" + }, + "create-agent-control-bg": { + "light": "#FCFCFC", + "dark": "#393838" + }, + "create-agent-control-bg-hover": { + "light": "var(--surface-hover)", + "dark": "#444242" + }, + "create-agent-control-bg-pressed": { + "light": "var(--surface-hover-soft)", + "dark": "#504F4F" + }, + "create-agent-control-border": { + "light": "#DCDFE3", + "dark": "#434343" + }, + "create-agent-control-text": { + "light": "#3C3F43", + "dark": "#D4D4D4" + }, + "create-agent-control-icon": { + "light": "#3C3F43", + "dark": "#D9D9D9" + }, + "create-agent-segment-track-bg": { + "light": "#EDEDED", + "dark": "#2A2828" + }, + "create-agent-segment-inactive-text": { + "light": "#9A9DA3", + "dark": "#6F6F6F" + }, + "create-agent-send-bg": { + "light": "#3C3F43", + "dark": "#EEEEEE" + }, + "create-agent-send-icon": { + "light": "#FCFCFC", + "dark": "#252222" + }, + "create-agent-send-bg-hover": { + "light": "#2E3237", + "dark": "#E2E2E2" + }, + "create-agent-send-bg-pressed": { + "light": "#25282C", + "dark": "#D4D4D4" + }, + "create-agent-send-disabled-bg": { + "light": "#EDEDED", + "dark": "#444242" + }, + "create-agent-send-disabled-icon": { + "light": "#9A9DA3", + "dark": "#585555" + }, + "create-agent-focus-ring": { + "light": "var(--text-tertiary)", + "dark": "var(--text-tertiary)" + }, + "create-agent-quick-card-bg": { + "light": "#F8F8F8", + "dark": "#312F2F" + }, + "create-agent-quick-card-border": { + "light": "#DCDFE3", + "dark": "#434343" + }, + "create-agent-quick-card-text": { + "light": "#3C3F43", + "dark": "#D4D4D4" + }, + "create-agent-quick-card-icon-bg": { + "light": "#EDEDED", + "dark": "#2A2828" + }, + "create-agent-quick-card-icon": { + "light": "#3C3F43", + "dark": "#D4D4D4" + }, + "create-agent-quick-card-bg-hover": { + "light": "#FCFCFC", + "dark": "#3B3A3A" + }, + "create-agent-avatar-ring": { + "light": "rgba(255, 255, 255, 0.08)", + "dark": "rgba(255, 255, 255, 0.08)" + }, + "create-agent-avatar-glass-bg": { + "light": "rgba(0, 0, 0, 0.004)", + "dark": "rgba(0, 0, 0, 0.004)" + }, + "create-agent-avatar-inner-ring-start": { + "light": "rgba(255, 255, 255, 0.29)", + "dark": "rgba(255, 255, 255, 0.29)" + }, + "create-agent-avatar-inner-ring-end": { + "light": "rgba(255, 255, 255, 0.24)", + "dark": "rgba(255, 255, 255, 0.24)" + }, + "sidebar-nav-text": { + "light": "#3C3F43", + "dark": "#D4D4D4" + }, + "sidebar-list-muted": { + "light": "#9A9DA3", + "dark": "#6F6F6F" + }, + "sidebar-user-card-bg": { + "light": "rgba(255, 255, 255, 0.20)", + "dark": "rgba(255, 255, 255, 0.05)" + }, + "sidebar-user-card-bg-hover": { + "light": "rgba(60, 63, 67, 0.06)", + "dark": "rgba(255, 255, 255, 0.10)" + }, + "sidebar-user-card-border": { + "light": "rgba(60, 63, 67, 0.10)", + "dark": "rgba(255, 255, 255, 0.13)" + }, + "sidebar-user-card-text": { + "light": "#3C3F43", + "dark": "#D4D4D4" + }, + "caret-accent": { + "light": "var(--accent-cta-bg)", + "dark": "var(--accent-cta-bg)" + }, + "button-cta-hover": { + "light": "var(--accent-hover)", + "dark": "var(--accent-hover)" + }, + "shadow-soft-panel": { + "light": "0 4px 12px rgb(0 0 0 / 0.08)", + "dark": "0 4px 12px rgb(0 0 0 / 0.3)" + }, + "shadow-chip-raised": { + "light": "0 1px 2px rgba(0, 0, 0, 0.12)", + "dark": "0 1px 2px rgba(0, 0, 0, 0.4)" + }, + "shadow-menu": { + "light": "0 4px 16px rgba(0, 0, 0, 0.15)", + "dark": "0 4px 16px rgba(0, 0, 0, 0.5)" + }, + "confirm-shadow": { + "light": "var(--shadow-soft-panel)", + "dark": "var(--shadow-soft-panel)" + }, + "cmd-palette-shadow": { + "light": "var(--shadow-soft-panel)", + "dark": "var(--shadow-soft-panel)" + } +} as const; + +export const EFFORT_TIER_COLORS = { + minimal: GENERATED_DEFAULTS['effort-tier-minimal'].light, + low: GENERATED_DEFAULTS['effort-tier-low'].light, + medium: GENERATED_DEFAULTS['effort-tier-medium'].light, + high: GENERATED_DEFAULTS['effort-tier-high'].light, + xhigh: GENERATED_DEFAULTS['effort-tier-xhigh'].light, + max: GENERATED_DEFAULTS['effort-tier-max'].light, + ultra: GENERATED_DEFAULTS['effort-tier-ultra'].light, +} as const; + +export const PRICE_TIER_COLORS = { + t1: EFFORT_TIER_COLORS.low, + t2: GENERATED_DEFAULTS['price-tier-t2'].light, + t3: GENERATED_DEFAULTS['price-tier-t3'].light, +} as const; +// END GENERATED DS-8: defaults /* === P3.2: Semantic slot tokens === */ -registerColor('surface', { - light: '#f8f8f6', - dark: '#1f1f1e', -}, 'Surface 页面背景 (hex 形式)'); -registerColor('surface-hsl', { - light: '60 12.5% 97%', - dark: '60 2% 12%', -}, 'Surface 页面背景 (HSL 形式)'); -registerColor('surface-elevated', { - light: '#ffffff', - dark: '#2c2c2a', -}, 'Card 抬一层 / 弹窗 / popover 背景'); -registerColor('surface-elevated-soft', { - light: '#e5e5e5', - dark: '#2c2c2a', -}, 'Disabled / dimmed 卡片背景'); -registerColor('surface-card-ivory', { - light: '#faf9f5', - dark: '#2c2c2a', -}, 'Settings 微暖 ivory Card'); -registerColor('surface-chip', { - light: '#e5e5e5', - dark: '#3c3c3a', -}, 'Chip / pill / 选中行背景'); -registerColor('surface-chip-alt', { - light: '#e5e5e5', - dark: '#2c2c2a', -}, 'Chip 暗态塌缩到 Card 的变体'); -registerColor('surface-hover', { - light: '#e5e5e5', - dark: '#3c3c3a', -}, '通用 hover 背景'); -registerColor('surface-hover-soft', { - light: '#f8f8f6', - dark: '#3c3c3a', -}, '柔和 hover 背景'); -registerColor('surface-hover-hsl', { - light: '0 0% 90%', - dark: '60 2% 17%', -}, 'Hover 背景 HSL 形式'); -registerColor('surface-on-card', { - light: '#ffffff', - dark: '#1f1f1e', -}, 'CTA/checked icon 的深色前景'); +registerColor('surface', GENERATED_DEFAULTS["surface"], 'Surface 页面背景 (hex 形式)'); +registerColor('surface-hsl', GENERATED_DEFAULTS["surface-hsl"], 'Surface 页面背景 (HSL 形式)'); +registerColor('surface-elevated', GENERATED_DEFAULTS["surface-elevated"], 'Card 抬一层 / 弹窗 / popover 背景'); +registerColor('surface-elevated-soft', GENERATED_DEFAULTS["surface-elevated-soft"], 'Disabled / dimmed 卡片背景'); +registerColor('surface-card-ivory', GENERATED_DEFAULTS["surface-card-ivory"], 'Settings 微暖 ivory Card'); +registerColor('surface-chip', GENERATED_DEFAULTS["surface-chip"], 'Chip / pill / 选中行背景'); +registerColor('surface-chip-alt', GENERATED_DEFAULTS["surface-chip-alt"], 'Chip 暗态塌缩到 Card 的变体'); +registerColor('surface-hover', GENERATED_DEFAULTS["surface-hover"], '通用 hover 背景'); +registerColor('surface-hover-soft', GENERATED_DEFAULTS["surface-hover-soft"], '柔和 hover 背景'); +registerColor('surface-hover-hsl', GENERATED_DEFAULTS["surface-hover-hsl"], 'Hover 背景 HSL 形式'); +registerColor('surface-on-card', GENERATED_DEFAULTS["surface-on-card"], 'CTA/checked icon 的深色前景'); // 历史幽灵 token 补注册:--panel-bg 被 9 处宿主组件裸引用(PanelChrome / TabBar // / RightSidebarShell / ReviewTabBody / ghostPanels / RightSidebar / SidebarWindowLayout, // 均 bg-[var(--panel-bg)] 无 fallback)但 colors.ts 从未注册,:root 读不到值 → 面板/ // 侧边栏头部背景失效。语义 = 面板背景 = surface(与 ghostPanelTheme.ts 沙箱 body // fallback var(--panel-bg, var(--surface)) 兜底一致),故 alias 到 --surface, // 注册后宿主消费点显式取到 surface 值。 -registerColor('panel-bg', { - light: 'var(--surface)', - dark: 'var(--surface)', -}, '面板 / 侧边栏 / 工具面板头部背景(历史幽灵 token 补注册,alias 到 surface)'); -registerColor('md-table-bg', { - light: 'rgba(236, 236, 234, 0.55)', - dark: 'rgba(44, 44, 42, 0.55)', -}, 'Markdown 编辑器表格行 / 表头半透明背景'); +registerColor('panel-bg', GENERATED_DEFAULTS["panel-bg"], '面板 / 侧边栏 / 工具面板头部背景(历史幽灵 token 补注册,alias 到 surface)'); +registerColor('md-table-bg', GENERATED_DEFAULTS["md-table-bg"], 'Markdown 编辑器表格行 / 表头半透明背景'); // ── Markdown 正文语义色(标题 h1-h6 + 加粗)── // 默认值刻意是 `inherit` 而不是 var(--text-primary):这些元素在引入 token 之前 // 的颜色就是从容器继承来的(baseComponents 只给字号字重,不给 color)。若默认改成 @@ -96,440 +2164,134 @@ registerColor('md-strong-fg', { light: 'inherit', dark: 'inherit', }, 'Markdown 加粗文字色(默认继承容器文字色)'); -registerColor('border-default', { - light: '#d7d7d4', - dark: '#3c3c3a', -}, 'docs/design-rules/cindy-design-system.md Board 1px 边框'); -registerColor('border-default-hsl', { - light: '60 3% 84%', - dark: '60 2% 23%', -}, 'Board HSL 形式'); -registerColor('border-shadcn-hsl', { - light: '0 0% 90%', - dark: '30 4% 28%', -}, 'shadcn input/border HSL'); -registerColor('border-transparent-mixed', { - light: 'transparent', - dark: '#3c3c3a', -}, 'Light transparent / dark board border'); +registerColor('border-default', GENERATED_DEFAULTS["border-default"], 'docs/design-rules/cindy-design-system.md Board 1px 边框'); +registerColor('border-default-hsl', GENERATED_DEFAULTS["border-default-hsl"], 'Board HSL 形式'); +registerColor('border-shadcn-hsl', GENERATED_DEFAULTS["border-shadcn-hsl"], 'shadcn input/border HSL'); +registerColor('border-transparent-mixed', GENERATED_DEFAULTS["border-transparent-mixed"], 'Light transparent / dark board border'); // 历史幽灵 token 补注册:--board 被 RewindPreviewDialog 4 处 border-[var(--board)] // 裸引用(无 fallback)但从未注册,边框读不到值。名字泛但消费点全是边框,语义 = // 边框,alias 到 --border-default。 -registerColor('board', { - light: 'var(--border-default)', - dark: 'var(--border-default)', -}, '通用边框(历史幽灵 token --board 补注册,alias 到 border-default)'); -registerColor('text-primary', { - light: '#262626', - dark: '#d4d4d4', -}, '主标题 / 主正文'); -registerColor('text-primary-on-dark', { - light: '#262626', - dark: '#ffffff', -}, '深色按钮上的主前景'); -registerColor('text-primary-emphasis', { - light: '#1a1a1a', - dark: '#d4d4d4', -}, '强调主文字'); -registerColor('text-primary-inv', { - light: '#1a1a1a', - dark: '#ffffff', -}, '反相强调文字'); -registerColor('text-primary-body-strong', { - light: '#525252', - dark: '#d4d4d4', -}, '加重正文'); -registerColor('text-primary-hsl', { - light: '0 0% 9%', - dark: '0 0% 83%', -}, 'Primary text HSL 形式'); -registerColor('text-secondary', { - light: '#737373', - dark: '#a3a3a3', -}, 'Secondary 文字 / meta / icon'); -registerColor('text-secondary-cross', { - light: '#a3a3a3', - dark: '#a3a3a3', -}, '跨主题 secondary 文字'); -registerColor('text-secondary-mid', { - light: '#525252', - dark: '#a3a3a3', -}, '偏深 secondary 文字'); -registerColor('text-tertiary', { - light: '#a3a3a3', - dark: '#737373', -}, 'Tertiary / placeholder 文字'); -registerColor('text-tertiary-stone', { - light: '#737373', - dark: '#737373', -}, 'Stone 跨主题三级文字'); -registerColor('text-tertiary-mid', { - light: '#525252', - dark: '#737373', -}, 'Mid Gray 三级文字'); -registerColor('text-tertiary-hsl', { - light: '0 0% 45%', - dark: '0 0% 45%', -}, 'Sidebar / welcome muted HSL'); -registerColor('text-disabled', { - light: '#d4d4d4', - dark: '#525252', -}, 'Disabled 文字 / failed dimmed'); -registerColor('text-disabled-tertiary', { - light: '#a3a3a3', - dark: '#737373', -}, 'Disabled tertiary 文字'); -registerColor('text-placeholder', { - light: '#c4c4c4', - dark: '#525252', -}, 'Placeholder 文字 — 必须读着像空(比 tertiary 更淡);统一 slot,各输入面 placeholder alias 均收口于此'); -registerColor('accent-cta-bg', { - light: '#262626', - dark: '#ffffff', -}, '反相 CTA 背景'); -registerColor('accent-cta-bg-pure', { - light: '#000000', - dark: '#ffffff', -}, 'Pure CTA 背景'); -registerColor('accent-emphasis', { - light: '#262626', - dark: '#d4d4d4', -}, '强调品牌前景 / ring'); -registerColor('accent-soft', { - light: '#262626', - dark: '#ffffff', -}, 'Soft accent 前景'); -registerColor('accent-hover', { - light: '#262626', - dark: '#e5e5e5', -}, 'CTA pressed / hover'); -registerColor('accent-pure-cta-fg', { - light: '#ffffff', - dark: '#000000', -}, 'Pure CTA 文字'); -registerColor('error-flat', { - light: '#ef4444', - dark: '#ef4444', -}, '扁平 danger 前景'); -registerColor('warning-accent', { - light: '#EA6B17', - dark: '#EA6B17', -}, 'Thinking orange / warning accent — running 状态色,设计定稿 2026-07-17(取代 #FF6600 冻结红线);全局同值,9 主题无 override 自动跟随'); +registerColor('board', GENERATED_DEFAULTS["board"], '通用边框(历史幽灵 token --board 补注册,alias 到 border-default)'); +registerColor('text-primary', GENERATED_DEFAULTS["text-primary"], '主标题 / 主正文'); +registerColor('text-primary-on-dark', GENERATED_DEFAULTS["text-primary-on-dark"], '深色按钮上的主前景'); +registerColor('text-primary-emphasis', GENERATED_DEFAULTS["text-primary-emphasis"], '强调主文字'); +registerColor('text-primary-inv', GENERATED_DEFAULTS["text-primary-inv"], '反相强调文字'); +registerColor('text-primary-body-strong', GENERATED_DEFAULTS["text-primary-body-strong"], '加重正文'); +registerColor('text-primary-hsl', GENERATED_DEFAULTS["text-primary-hsl"], 'Primary text HSL 形式'); +registerColor('text-secondary', GENERATED_DEFAULTS["text-secondary"], 'Secondary 文字 / meta / icon'); +registerColor('text-secondary-cross', GENERATED_DEFAULTS["text-secondary-cross"], '跨主题 secondary 文字'); +registerColor('text-secondary-mid', GENERATED_DEFAULTS["text-secondary-mid"], '偏深 secondary 文字'); +registerColor('text-tertiary', GENERATED_DEFAULTS["text-tertiary"], 'Tertiary / placeholder 文字'); +registerColor('text-tertiary-stone', GENERATED_DEFAULTS["text-tertiary-stone"], 'Stone 跨主题三级文字'); +registerColor('text-tertiary-mid', GENERATED_DEFAULTS["text-tertiary-mid"], 'Mid Gray 三级文字'); +registerColor('text-tertiary-hsl', GENERATED_DEFAULTS["text-tertiary-hsl"], 'Sidebar / welcome muted HSL'); +registerColor('text-disabled', GENERATED_DEFAULTS["text-disabled"], 'Disabled 文字 / failed dimmed'); +registerColor('text-disabled-tertiary', GENERATED_DEFAULTS["text-disabled-tertiary"], 'Disabled tertiary 文字'); +registerColor('text-placeholder', GENERATED_DEFAULTS["text-placeholder"], 'Placeholder 文字 — 必须读着像空(比 tertiary 更淡);统一 slot,各输入面 placeholder alias 均收口于此'); +registerColor('accent-cta-bg', GENERATED_DEFAULTS["accent-cta-bg"], '反相 CTA 背景'); +registerColor('accent-cta-bg-pure', GENERATED_DEFAULTS["accent-cta-bg-pure"], 'Pure CTA 背景'); +registerColor('accent-emphasis', GENERATED_DEFAULTS["accent-emphasis"], '强调品牌前景 / ring'); +registerColor('accent-soft', GENERATED_DEFAULTS["accent-soft"], 'Soft accent 前景'); +registerColor('accent-hover', GENERATED_DEFAULTS["accent-hover"], 'CTA pressed / hover'); +registerColor('accent-pure-cta-fg', GENERATED_DEFAULTS["accent-pure-cta-fg"], 'Pure CTA 文字'); +registerColor('error-flat', GENERATED_DEFAULTS["error-flat"], '扁平 danger 前景'); +registerColor('warning-accent', GENERATED_DEFAULTS["warning-accent"], 'Thinking orange / warning accent — running 状态色,设计定稿 2026-07-17(取代 #FF6600 冻结红线);全局同值,9 主题无 override 自动跟随'); // DESIGN.md §2 / §10 窄范围例外:仅资源用量表的 14px 进程类别 glyph 使用, // 不表示健康/状态,也不得扩散到行背景、文字或其它进程 UI。 -registerColor('process-agent-task-icon', { - light: '#2563EB', - dark: '#60A5FA', -}, '资源用量表:任务 Agent 进程图标'); -registerColor('process-agent-service-icon', { - light: '#7C3AED', - dark: '#A78BFA', -}, '资源用量表:Agent 控制面服务图标'); -registerColor('process-main-icon', { - light: '#DB2777', - dark: '#F472B6', -}, '资源用量表:主进程图标'); -registerColor('process-renderer-icon', { - light: '#0891B2', - dark: '#22D3EE', -}, '资源用量表:界面进程图标'); -registerColor('process-gpu-icon', { - light: '#D97706', - dark: '#F59E0B', -}, '资源用量表:GPU 进程图标'); -registerColor('process-utility-icon', { - light: '#059669', - dark: '#34D399', -}, '资源用量表:Utility 服务进程图标'); +registerColor('process-agent-task-icon', GENERATED_DEFAULTS["process-agent-task-icon"], '资源用量表:任务 Agent 进程图标'); +registerColor('process-agent-service-icon', GENERATED_DEFAULTS["process-agent-service-icon"], '资源用量表:Agent 控制面服务图标'); +registerColor('process-main-icon', GENERATED_DEFAULTS["process-main-icon"], '资源用量表:主进程图标'); +registerColor('process-renderer-icon', GENERATED_DEFAULTS["process-renderer-icon"], '资源用量表:界面进程图标'); +registerColor('process-gpu-icon', GENERATED_DEFAULTS["process-gpu-icon"], '资源用量表:GPU 进程图标'); +registerColor('process-utility-icon', GENERATED_DEFAULTS["process-utility-icon"], '资源用量表:Utility 服务进程图标'); // Usage History colors: owner-approved 2026-09-08 reference refinement. // Chart-specific category hues; process/status colors and heatmap blue stay unchanged. -registerColor('usage-heatmap-high', { - light: 'var(--process-agent-task-icon)', - dark: 'var(--process-agent-task-icon)', -}, '用量历史图表:usage-heatmap-high(09-08 登记的配色引用)'); -registerColor('usage-model-1', { - light: '#14B8A6', - dark: '#2DD4BF', -}, '用量历史图表:模型类别 1(09-08 参考图配色裁决)'); -registerColor('usage-model-2', { - light: '#F43F5E', - dark: '#FB7185', -}, '用量历史图表:模型类别 2(09-08 参考图配色裁决)'); -registerColor('usage-model-3', { - light: '#8B5CF6', - dark: '#A78BFA', -}, '用量历史图表:模型类别 3(09-08 参考图配色裁决)'); -registerColor('usage-model-4', { - light: '#6366F1', - dark: '#818CF8', -}, '用量历史图表:模型类别 4(09-08 参考图配色裁决)'); -registerColor('usage-model-5', { - light: '#F59E0B', - dark: '#FBBF24', -}, '用量历史图表:模型类别 5(09-08 参考图配色裁决)'); +registerColor('usage-heatmap-high', GENERATED_DEFAULTS["usage-heatmap-high"], '用量历史图表:usage-heatmap-high(09-08 登记的配色引用)'); +registerColor('usage-model-1', GENERATED_DEFAULTS["usage-model-1"], '用量历史图表:模型类别 1(09-08 参考图配色裁决)'); +registerColor('usage-model-2', GENERATED_DEFAULTS["usage-model-2"], '用量历史图表:模型类别 2(09-08 参考图配色裁决)'); +registerColor('usage-model-3', GENERATED_DEFAULTS["usage-model-3"], '用量历史图表:模型类别 3(09-08 参考图配色裁决)'); +registerColor('usage-model-4', GENERATED_DEFAULTS["usage-model-4"], '用量历史图表:模型类别 4(09-08 参考图配色裁决)'); +registerColor('usage-model-5', GENERATED_DEFAULTS["usage-model-5"], '用量历史图表:模型类别 5(09-08 参考图配色裁决)'); -registerColor('shadow-soft-panel', { - light: '0 4px 12px rgb(0 0 0 / 0.08)', - dark: '0 4px 12px rgb(0 0 0 / 0.3)', -}, '中型弹层 shadow'); +registerColor('shadow-soft-panel', GENERATED_DEFAULTS["shadow-soft-panel"], '中型弹层 shadow'); // Base -registerColor('background', { - light: '0 0% 100%', - dark: '60 3% 14%', -}, 'background'); -registerColor('foreground', { - light: 'var(--text-primary-hsl)', - dark: 'var(--text-primary-hsl)', -}, 'foreground'); -registerColor('muted', { - light: '0 0% 96%', - dark: '30 6% 20%', -}, 'muted'); -registerColor('muted-foreground', { - light: '0 0% 45%', - dark: '24 5% 64%', -}, 'muted-foreground'); -registerColor('border', { - light: 'var(--border-shadcn-hsl)', - dark: 'var(--border-shadcn-hsl)', -}, 'border'); -registerColor('input', { - light: 'var(--border-shadcn-hsl)', - dark: 'var(--border-shadcn-hsl)', -}, 'input'); -registerColor('switch-track-off', { - light: 'var(--text-secondary)', - dark: 'var(--text-secondary)', -}, '共享 Switch 未选中轨道;跟随主题次要前景,与默认/悬停表面及滑块保持至少 3:1 非文字组件对比度,同时弱于开启态'); -registerColor('switch-thumb-off', { - light: 'var(--surface-on-card)', - dark: 'var(--surface-on-card)', -}, '共享 Switch 未选中滑块;跟随主题反相前景,与未选中轨道保持至少 3:1 非文字组件对比度'); -registerColor('switch-disabled-opacity', { - light: '0.3', - dark: '0.3', -}, '共享 Switch 禁用态整体不透明度(纯数值 token,非颜色);全局 0.3(用户裁决 2026-08-05,自出货值 0.5 调深),各皮肤仍可覆盖'); -registerColor('switch-disabled-thumb-opacity', { - light: '0.5', - dark: '0.5', -}, '共享 Switch 禁用态滑块自身不透明度(纯数值 token,叠加在整体不透明度之上);全局 0.5(用户裁决 2026-08-05)——禁用态滑块与轨道趋近、削掉立体感,「不可用」区别于「关」的关键'); -registerColor('switch-track-on', { - light: 'hsl(var(--primary))', - dark: 'hsl(var(--primary))', -}, '共享 Switch 开启态轨道;默认沿用 primary(不覆盖的主题外观不变),移植主题覆盖为各自主题色、CINDY 冻结于决策表;每个覆盖值须过 switchThemeContrast 的 ≥3:1 守卫(用户裁决 2026-08-05)'); -registerColor('ring', { - light: 'var(--text-primary-hsl)', - dark: 'var(--text-primary-hsl)', -}, 'ring'); -registerColor('primary', { - light: 'var(--text-primary-hsl)', - dark: 'var(--text-primary-hsl)', -}, 'primary'); -registerColor('primary-foreground', { - light: '0 0% 98%', - dark: '60 3% 14%', -}, 'primary-foreground'); -registerColor('secondary', { - light: '0 0% 96%', - dark: '30 6% 20%', -}, 'secondary'); -registerColor('secondary-foreground', { - light: 'var(--text-primary-hsl)', - dark: 'var(--text-primary-hsl)', -}, 'secondary-foreground'); -registerColor('accent', { - light: '0 0% 96%', - dark: '30 6% 20%', -}, 'accent'); -registerColor('accent-foreground', { - light: 'var(--text-primary-hsl)', - dark: 'var(--text-primary-hsl)', -}, 'accent-foreground'); -registerColor('popover', { - light: '0 0% 100%', - dark: '60 3% 15%', -}, 'popover'); -registerColor('popover-foreground', { - light: 'var(--text-primary-hsl)', - dark: 'var(--text-primary-hsl)', -}, 'popover-foreground'); -registerColor('radius', { - light: '0.5rem', - dark: null, -}, 'radius Light only in source CSS; dark mode inherits the root value.'); +registerColor('background', GENERATED_DEFAULTS["background"], 'background'); +registerColor('foreground', GENERATED_DEFAULTS["foreground"], 'foreground'); +registerColor('muted', GENERATED_DEFAULTS["muted"], 'muted'); +registerColor('muted-foreground', GENERATED_DEFAULTS["muted-foreground"], 'muted-foreground'); +registerColor('border', GENERATED_DEFAULTS["border"], 'border'); +registerColor('input', GENERATED_DEFAULTS["input"], 'input'); +registerColor('switch-track-off', GENERATED_DEFAULTS["switch-track-off"], '共享 Switch 未选中轨道;跟随主题次要前景,与默认/悬停表面及滑块保持至少 3:1 非文字组件对比度,同时弱于开启态'); +registerColor('switch-thumb-off', GENERATED_DEFAULTS["switch-thumb-off"], '共享 Switch 未选中滑块;跟随主题反相前景,与未选中轨道保持至少 3:1 非文字组件对比度'); +registerColor('switch-disabled-opacity', GENERATED_DEFAULTS["switch-disabled-opacity"], '共享 Switch 禁用态整体不透明度(纯数值 token,非颜色);全局 0.3(用户裁决 2026-08-05,自出货值 0.5 调深),各皮肤仍可覆盖'); +registerColor('switch-disabled-thumb-opacity', GENERATED_DEFAULTS["switch-disabled-thumb-opacity"], '共享 Switch 禁用态滑块自身不透明度(纯数值 token,叠加在整体不透明度之上);全局 0.5(用户裁决 2026-08-05)——禁用态滑块与轨道趋近、削掉立体感,「不可用」区别于「关」的关键'); +registerColor('switch-track-on', GENERATED_DEFAULTS["switch-track-on"], '共享 Switch 开启态轨道;默认沿用 primary(不覆盖的主题外观不变),移植主题覆盖为各自主题色、CINDY 冻结于决策表;每个覆盖值须过 switchThemeContrast 的 ≥3:1 守卫(用户裁决 2026-08-05)'); +registerColor('ring', GENERATED_DEFAULTS["ring"], 'ring'); +registerColor('primary', GENERATED_DEFAULTS["primary"], 'primary'); +registerColor('primary-foreground', GENERATED_DEFAULTS["primary-foreground"], 'primary-foreground'); +registerColor('secondary', GENERATED_DEFAULTS["secondary"], 'secondary'); +registerColor('secondary-foreground', GENERATED_DEFAULTS["secondary-foreground"], 'secondary-foreground'); +registerColor('accent', GENERATED_DEFAULTS["accent"], 'accent'); +registerColor('accent-foreground', GENERATED_DEFAULTS["accent-foreground"], 'accent-foreground'); +registerColor('popover', GENERATED_DEFAULTS["popover"], 'popover'); +registerColor('popover-foreground', GENERATED_DEFAULTS["popover-foreground"], 'popover-foreground'); +registerColor('radius', GENERATED_DEFAULTS["radius"], 'radius Light only in source CSS; dark mode inherits the root value.'); // Titlebar — Ollama layer system (Light) -registerColor('titlebar', { - light: 'var(--surface-hsl)', - dark: 'var(--surface-hsl)', -}, 'Light Surface #f8f8f6'); -registerColor('titlebar-border', { - light: 'var(--border-default-hsl)', - dark: 'var(--border-default-hsl)', -}, 'Light Board #d7d7d4'); -registerColor('titlebar-icon', { - light: '0 0% 45%', - dark: '0 0% 63.92%', -}, 'Stone #737373'); -registerColor('titlebar-button-hover', { - light: 'var(--surface-hover-hsl)', - dark: 'var(--surface-hover-hsl)', -}, 'Light Gray #e5e5e5'); -registerColor('titlebar-control-hover', { - light: 'var(--surface-hover-hsl)', - dark: 'var(--surface-hover-hsl)', -}, 'Light Gray #e5e5e5'); -registerColor('splash-bg', { - light: '60 12.45% 96.86%', - dark: '60 1.64% 11.96%', -}, 'Light Surface #f8f8f6 — docs/design-rules/cindy-design-system.md layer system (high-precision HSL for exact hex match)'); -registerColor('splash-text', { - light: '0 0% 45.1%', - dark: '0 0% 63.92%', -}, 'Stone #737373 — docs/design-rules/cindy-design-system.md secondary text'); -registerColor('splash-text-muted', { - light: '30 3.6% 62.55%', - dark: '30 2.78% 43.73%', -}, 'Warm Gray #a39e98 — docs/design-rules/cindy-design-system.md muted text'); -registerColor('splash-text-destructive', { - light: '0 0% 14.9%', - dark: '0 0% 100%', -}, 'Near Black #262626 — docs/design-rules/cindy-design-system.md max emphasis (grayscale)'); -registerColor('splash-fade-duration', { - light: '400ms', - dark: null, -}, 'Titlebar — Ollama layer system (Light) Light only in source CSS; dark mode inherits the root value.'); -registerColor('splash-fade-easing', { - light: 'cubic-bezier(0.4, 0, 1, 1)', - dark: null, -}, 'Titlebar — Ollama layer system (Light) Light only in source CSS; dark mode inherits the root value.'); -registerColor('destructive', { - light: '0 84% 60%', - dark: '0 72% 63%', -}, 'Titlebar — Ollama layer system (Light)'); +registerColor('titlebar', GENERATED_DEFAULTS["titlebar"], 'Light Surface #f8f8f6'); +registerColor('titlebar-border', GENERATED_DEFAULTS["titlebar-border"], 'Light Board #d7d7d4'); +registerColor('titlebar-icon', GENERATED_DEFAULTS["titlebar-icon"], 'Stone #737373'); +registerColor('titlebar-button-hover', GENERATED_DEFAULTS["titlebar-button-hover"], 'Light Gray #e5e5e5'); +registerColor('titlebar-control-hover', GENERATED_DEFAULTS["titlebar-control-hover"], 'Light Gray #e5e5e5'); +registerColor('splash-bg', GENERATED_DEFAULTS["splash-bg"], 'Light Surface #f8f8f6 — docs/design-rules/cindy-design-system.md layer system (high-precision HSL for exact hex match)'); +registerColor('splash-text', GENERATED_DEFAULTS["splash-text"], 'Stone #737373 — docs/design-rules/cindy-design-system.md secondary text'); +registerColor('splash-text-muted', GENERATED_DEFAULTS["splash-text-muted"], 'Warm Gray #a39e98 — docs/design-rules/cindy-design-system.md muted text'); +registerColor('splash-text-destructive', GENERATED_DEFAULTS["splash-text-destructive"], 'Near Black #262626 — docs/design-rules/cindy-design-system.md max emphasis (grayscale)'); +registerColor('splash-fade-duration', GENERATED_DEFAULTS["splash-fade-duration"], 'Titlebar — Ollama layer system (Light) Light only in source CSS; dark mode inherits the root value.'); +registerColor('splash-fade-easing', GENERATED_DEFAULTS["splash-fade-easing"], 'Titlebar — Ollama layer system (Light) Light only in source CSS; dark mode inherits the root value.'); +registerColor('destructive', GENERATED_DEFAULTS["destructive"], 'Titlebar — Ollama layer system (Light)'); // confirm-dialog -registerColor('confirm-bg', { - light: '#fafafa', - dark: '#2c2c2a', -}, 'confirm-dialog'); -registerColor('confirm-shadow', { - light: 'var(--shadow-soft-panel)', - dark: 'var(--shadow-soft-panel)', -}, 'confirm-dialog'); -registerColor('confirm-title', { - light: '#171717', - dark: '#fafafa', -}, 'confirm-dialog'); -registerColor('confirm-desc', { - light: 'var(--text-tertiary-stone)', - dark: 'var(--text-tertiary-stone)', -}, 'confirm-dialog'); -registerColor('confirm-btn-primary-bg', { - light: '#171717', - dark: '#fafafa', -}, 'confirm-dialog'); -registerColor('confirm-btn-primary-text', { - light: '#fafafa', - dark: '#171717', -}, 'confirm-dialog'); -registerColor('confirm-btn-primary-hover', { - light: 'var(--accent-hover)', - dark: 'var(--accent-hover)', -}, 'confirm-dialog'); -registerColor('confirm-btn-secondary-text', { - light: '#262626', - dark: '#fafafa', -}, 'confirm-dialog'); -registerColor('confirm-btn-secondary-border', { - light: '#d4d4d4', - dark: '#3c3c3a', -}, 'confirm-dialog'); -registerColor('confirm-btn-secondary-hover', { - light: 'rgba(0, 0, 0, 0.04)', - dark: 'rgba(255, 255, 255, 0.06)', -}, 'confirm-dialog'); +registerColor('confirm-bg', GENERATED_DEFAULTS["confirm-bg"], 'confirm-dialog'); +registerColor('confirm-shadow', GENERATED_DEFAULTS["confirm-shadow"], 'confirm-dialog'); +registerColor('confirm-title', GENERATED_DEFAULTS["confirm-title"], 'confirm-dialog'); +registerColor('confirm-desc', GENERATED_DEFAULTS["confirm-desc"], 'confirm-dialog'); +registerColor('confirm-btn-primary-bg', GENERATED_DEFAULTS["confirm-btn-primary-bg"], 'confirm-dialog'); +registerColor('confirm-btn-primary-text', GENERATED_DEFAULTS["confirm-btn-primary-text"], 'confirm-dialog'); +registerColor('confirm-btn-primary-hover', GENERATED_DEFAULTS["confirm-btn-primary-hover"], 'confirm-dialog'); +registerColor('confirm-btn-secondary-text', GENERATED_DEFAULTS["confirm-btn-secondary-text"], 'confirm-dialog'); +registerColor('confirm-btn-secondary-border', GENERATED_DEFAULTS["confirm-btn-secondary-border"], 'confirm-dialog'); +registerColor('confirm-btn-secondary-hover', GENERATED_DEFAULTS["confirm-btn-secondary-hover"], 'confirm-dialog'); // Sidebar — Ollama layer system (Light) -registerColor('sidebar', { - light: 'var(--surface-hsl)', - dark: 'var(--surface-hsl)', -}, 'Light Surface #f8f8f6'); -registerColor('sidebar-border', { - light: 'var(--border-default-hsl)', - dark: 'var(--border-default-hsl)', -}, 'Light Board #d7d7d4'); -registerColor('sidebar-item-hover', { - light: 'var(--surface-hover-hsl)', - dark: 'var(--surface-hover-hsl)', -}, 'Light Gray #e5e5e5'); -registerColor('sidebar-item-active', { - light: '0 0% 90%', - dark: '60 2% 17%', -}, 'Light Gray #e5e5e5 — selected pill'); -registerColor('sidebar-item-active-foreground', { - light: 'var(--foreground)', - dark: 'var(--foreground)', -}, 'Selected pill 文字/图标前景(default=foreground 正文;CINDY 2026-07-20 撤红后跟正文色)'); -registerColor('sidebar-item-active-border', { - light: 'var(--sidebar-item-active)', - dark: 'var(--sidebar-item-active)', -}, 'Selected pill 1px 描边(default=invisible 同 pill bg;CINDY 2026-07-20 撤红后跟中性边框)'); -registerColor('sidebar-search-bg', { - light: 'var(--surface-hsl)', - dark: 'var(--surface-hsl)', -}, 'Light Surface'); -registerColor('sidebar-muted', { - light: 'var(--text-tertiary-hsl)', - dark: 'var(--text-tertiary-hsl)', -}, 'Stone #737373'); -registerColor('sidebar-action-icon', { - light: '0 0% 64%', - dark: '0 0% 45%', -}, 'Silver #a3a3a3 — hover action icons'); -registerColor('search-match-bg', { - light: '53 100% 89%', - dark: '40 33% 16%', -}, '#fff8c5 — Primer attention-muted'); -registerColor('search-match-fg', { - light: '0 0% 15%', - dark: '0 0% 90%', -}, 'Near-black #262626 — text inherit'); +registerColor('sidebar', GENERATED_DEFAULTS["sidebar"], 'Light Surface #f8f8f6'); +registerColor('sidebar-border', GENERATED_DEFAULTS["sidebar-border"], 'Light Board #d7d7d4'); +registerColor('sidebar-item-hover', GENERATED_DEFAULTS["sidebar-item-hover"], 'Light Gray #e5e5e5'); +registerColor('sidebar-item-active', GENERATED_DEFAULTS["sidebar-item-active"], 'Light Gray #e5e5e5 — selected pill'); +registerColor('sidebar-item-active-foreground', GENERATED_DEFAULTS["sidebar-item-active-foreground"], 'Selected pill 文字/图标前景(default=foreground 正文;CINDY 2026-07-20 撤红后跟正文色)'); +registerColor('sidebar-item-active-border', GENERATED_DEFAULTS["sidebar-item-active-border"], 'Selected pill 1px 描边(default=invisible 同 pill bg;CINDY 2026-07-20 撤红后跟中性边框)'); +registerColor('sidebar-search-bg', GENERATED_DEFAULTS["sidebar-search-bg"], 'Light Surface'); +registerColor('sidebar-muted', GENERATED_DEFAULTS["sidebar-muted"], 'Stone #737373'); +registerColor('sidebar-action-icon', GENERATED_DEFAULTS["sidebar-action-icon"], 'Silver #a3a3a3 — hover action icons'); +registerColor('search-match-bg', GENERATED_DEFAULTS["search-match-bg"], '#fff8c5 — Primer attention-muted'); +registerColor('search-match-fg', GENERATED_DEFAULTS["search-match-fg"], 'Near-black #262626 — text inherit'); // UpdateBanner — Relaunch button (White Pill variant) -registerColor('update-btn-border', { - light: '#d4d4d4', - dark: '#3c3c3a', -}, 'Border Light — per docs/design-rules/cindy-design-system.md White Pill'); -registerColor('update-btn-text', { - light: '#404040', - dark: '#ffffff', -}, 'Button Text Dark — per docs/design-rules/cindy-design-system.md White Pill'); -registerColor('update-btn-hover', { - light: 'rgba(0, 0, 0, 0.04)', - dark: 'rgba(255, 255, 255, 0.06)', -}, 'Alpha-blended overlay — intentionally not an HSL token; needs transparency over variable backgrounds'); +registerColor('update-btn-border', GENERATED_DEFAULTS["update-btn-border"], 'Border Light — per docs/design-rules/cindy-design-system.md White Pill'); +registerColor('update-btn-text', GENERATED_DEFAULTS["update-btn-text"], 'Button Text Dark — per docs/design-rules/cindy-design-system.md White Pill'); +registerColor('update-btn-hover', GENERATED_DEFAULTS["update-btn-hover"], 'Alpha-blended overlay — intentionally not an HSL token; needs transparency over variable backgrounds'); // Fill background for the relaunch pill. Default themes keep the classic // transparent-outline White Pill (transparent → border+text define the shape); // E1D neutral themes (cindy) override this to a solid fill so the on-fill text // color (update-btn-text) has the intended contrast surface behind it. Non-HSL // raw value on purpose (needs a real `transparent`, not an HSL triple). -registerColor('update-btn-bg', { - light: 'transparent', - dark: 'transparent', -}, 'Relaunch pill fill — transparent (outline) by default, solid in E1D neutral themes'); +registerColor('update-btn-bg', GENERATED_DEFAULTS["update-btn-bg"], 'Relaunch pill fill — transparent (outline) by default, solid in E1D neutral themes'); // Content area — Surface single-flat background per full-window rule -registerColor('content-area', { - light: 'var(--surface-hsl)', - dark: 'var(--surface-hsl)', -}, 'Light Surface #f8f8f6'); +registerColor('content-area', GENERATED_DEFAULTS["content-area"], 'Light Surface #f8f8f6'); // Welcome text -registerColor('welcome-text', { - light: 'var(--text-tertiary-hsl)', - dark: 'var(--text-tertiary-hsl)', -}, 'Stone #737373'); +registerColor('welcome-text', GENERATED_DEFAULTS["welcome-text"], 'Stone #737373'); // ── 旧 `login-*` 9 token 全族退役(PR5,SC-8,implementation-plan Step 6)── // 原 login-bg/card-bg/card-border/divider/btn-bg/btn-text/btn-hover/help-text/ @@ -549,10 +2311,7 @@ registerColor('welcome-text', { // (= PR #104 白底机制在 cindy-light 下的实际渲染值)。2026-07-20 的 // 「消费 var(--surface)」改判作废——var(--surface) 随主题,cindy-dark 下取 // #2A2828,登录页背景变深且与 slogan #2A2828 同色隐形(沙盒手测 MT-1/2/5)。 -registerColor('login-bg-base', { - light: '#EDEDED', - dark: '#1F1F1E', -}, 'Login — 画布底(亮色 #EDEDED / 暗色 #1F1F1E,figma 532:585 暗色帧实测;纯平,红渐变两层随 PR#104 拍板撤除,暗色沿用纯平口径)'); +registerColor('login-bg-base', GENERATED_DEFAULTS["login-bg-base"], 'Login — 画布底(亮色 #EDEDED / 暗色 #1F1F1E,figma 532:585 暗色帧实测;纯平,红渐变两层随 PR#104 拍板撤除,暗色沿用纯平口径)'); // 两层品牌红渐变(379:518 径向 / 379:520 线性,代码复现非资产)。图层 opacity // 已合入色标 alpha(6%/5%)。CSS 取值为 figma 参数的最近似翻译;PR1 落码时以 // wave4 帧(368:1375)截图对照为准,允许微调本 token 值,名称与语义冻结。 @@ -568,10 +2327,7 @@ registerColor('login-bg-gradient-linear', { }, 'Login — 红线性渐变层(撤 wave4 双红渐变→none,对齐 PR #104;token 保留作 override 锚)'); // login-window-border-outer/inner 已随撤销登录窗口双描边(LoginWindowChrome, // 对齐 PR #104:PR104 无窗框描边)删除,不再注册。 -registerColor('login-panel-border', { - light: '#D4D4D4', - dark: '#434343', -}, 'Login — 面板 1px inside 描边(亮色 #D4D4D4 / 暗色 #434343;DESIGN.md §16.1)'); +registerColor('login-panel-border', GENERATED_DEFAULTS["login-panel-border"], 'Login — 面板 1px inside 描边(亮色 #D4D4D4 / 暗色 #434343;DESIGN.md §16.1)'); // 品牌红 accent 族:wave4 改判后 #DF0C27 语义限定为 accent(区域徽标/字标 // 红元素等品牌点缀),禁止表达页面/画板背景——命名刻意不含 bg/background // (token-decision-table.md 原案名 login-brand-bg 已随改判弃用)。 @@ -585,10 +2341,7 @@ registerColor('login-brand-accent-pressed', { }, 'Login — 品牌红 accent pressed/hover 深红(figma §1 Color System)'); // Text_link pressed(U-9 裁决 2026-07-20:default #2A2828 加深至 #1A1818, // lead 受托定值;wave3 实测节点落地后以实测替换 token 值)。 -registerColor('login-link-pressed', { - light: '#1A1818', - dark: '#C0BEBE', -}, 'Login — Text_link pressed 态(亮色 U-9 #1A1818 / 暗色 #C0BEBE 推导,待 Figma 精确)'); +registerColor('login-link-pressed', GENERATED_DEFAULTS["login-link-pressed"], 'Login — Text_link pressed 态(亮色 U-9 #1A1818 / 暗色 #C0BEBE 推导,待 Figma 精确)'); // ── 回调卡 component alias(PR3,LegacyMigrationDialog 消费——design §7.4 唯一 // App 内表情包例外,弹窗用回调卡形式)。参数权威:callback-pages-classification.md // 「卡片共用参数」(figma §6.1:White #FBFBFB/#D4D4D4/#252222/#2A2828 CTA; @@ -597,557 +2350,198 @@ registerColor('login-link-pressed', { // 浏览器回调页本体不消费 renderer token(独立 HTML,同表决策用内联常量,见 // oauthResultPage.ts renderBrandLoginCallbackPage);本组仅供 App 内例外消费。 // 品牌豁免族:非默认主题不 override(与 wave4 组同口径)。 -registerColor('login-callback-card-bg', { - light: '#FBFBFB', - dark: '#312F2F', -}, 'Login callback card — 卡底(White/Dark 卡,figma §6.1)'); -registerColor('login-callback-card-border', { - light: '#D4D4D4', - dark: '#434343', -}, 'Login callback card — 1px 卡描边'); -registerColor('login-callback-title', { - light: '#252222', - dark: '#D4D4D4', -}, 'Login callback card — 标题'); -registerColor('login-callback-body', { - light: '#6F6F6F', - dark: '#6F6F6F', -}, 'Login callback card — 副文案(两模式同值)'); -registerColor('login-callback-cta-bg', { - light: '#2A2828', - dark: '#EEEEEE', -}, 'Login callback card — CTA 底(反相)'); -registerColor('login-callback-cta-border', { - light: '#434343', - dark: '#FFFFFF', -}, 'Login callback card — CTA 1px 描边'); -registerColor('login-callback-cta-text', { - light: '#D4D4D4', - dark: '#2A2828', -}, 'Login callback card — CTA 文字(反相)'); +registerColor('login-callback-card-bg', GENERATED_DEFAULTS["login-callback-card-bg"], 'Login callback card — 卡底(White/Dark 卡,figma §6.1)'); +registerColor('login-callback-card-border', GENERATED_DEFAULTS["login-callback-card-border"], 'Login callback card — 1px 卡描边'); +registerColor('login-callback-title', GENERATED_DEFAULTS["login-callback-title"], 'Login callback card — 标题'); +registerColor('login-callback-body', GENERATED_DEFAULTS["login-callback-body"], 'Login callback card — 副文案(两模式同值)'); +registerColor('login-callback-cta-bg', GENERATED_DEFAULTS["login-callback-cta-bg"], 'Login callback card — CTA 底(反相)'); +registerColor('login-callback-cta-border', GENERATED_DEFAULTS["login-callback-cta-border"], 'Login callback card — CTA 1px 描边'); +registerColor('login-callback-cta-text', GENERATED_DEFAULTS["login-callback-cta-text"], 'Login callback card — CTA 文字(反相)'); // ── Login 组件色 alias(暗色实现 PR:light/dark 二态,DESIGN.md §16.1)── // 语义 = 登录入口 100% 还原设计稿;随基础 light/dark 二态切换,不跟具体扩展主题 // (规则 16 豁免族:扩展主题不 override)。色值经 Figma 组件库 Dark symbol 核验。 // disabled 态两模式同构(深底#2A2828+白70%叠层+边#B4B4B4+字#D4D4D4 opacity0.8,不反相,§16.5)。 -registerColor('login-panel-bg', { - light: '#FBFBFB', - dark: '#312F2F', -}, 'Login — 面板底(亮色 #FBFBFB / 暗色 #312F2F;DESIGN.md §16.1)'); -registerColor('login-control-bg', { - light: '#EEEEEE', - dark: '#2C2A2A', -}, 'Login — 输入框底(亮色 #EEEEEE / 暗色 #2C2A2A,figma Dark_normal 输入 symbol。暗色下与方式行/返回钮底分化,后者走 login-action-control-bg)'); -registerColor('login-action-control-bg', { - light: '#EEEEEE', - dark: '#2A2828', -}, 'Login — 方式行/返回钮底(亮色与输入框同 #EEEEEE;暗色 #2A2828 与输入框分化;figma 549:850/549:897,组件库更新 2026-07-23)'); -registerColor('login-back-border', { - light: '#FFFFFF', - dark: '#434343', -}, 'Login — 返回钮描边(亮色白 / 暗色 #434343;figma 549:897。区域徽标白字仍走 login-inverted-button-border)'); -registerColor('login-control-border', { - light: '#D4D4D4', - dark: '#434343', -}, 'Login — 控件 default 描边(亮色 #D4D4D4 / 暗色 #434343)'); -registerColor('login-control-border-active', { - light: '#2A2828', - dark: '#EEEEEE', -}, 'Login — 控件 focus/filled 描边(亮色 #2A2828 / 暗色 #EEEEEE 反相)'); -registerColor('login-control-border-disabled', { - light: '#B4B4B4', - dark: '#B4B4B4', -}, 'Login — disabled 控件描边(两模式同构,§16.5 disabled 特例)'); -registerColor('login-control-text', { - light: '#252222', - dark: '#EEEEEE', -}, 'Login — 控件已填文本/标题(亮色 #252222 / 暗色 #EEEEEE)'); -registerColor('login-control-placeholder', { - light: '#D4D4D4', - dark: '#6F6F6F', -}, 'Login — 控件 placeholder/countdown(亮色 #D4D4D4 / 暗色 #6F6F6F;figma 539:754 dark_倒计时重发)'); -registerColor('login-title-text', { - light: '#252222', - dark: '#D4D4D4', -}, 'Login — 面板标题 32 Bold(亮色 #252222 / 暗色 #D4D4D4)'); -registerColor('login-secondary-text', { - light: '#6F6F6F', - dark: '#6F6F6F', -}, 'Login — 副标题/说明文字(两模式同值 #6F6F6F)'); -registerColor('login-primary-button-bg', { - light: '#2A2828', - dark: '#EEEEEE', -}, 'Login — 主按钮/第三方圆钮底(亮色深 #2A2828 / 暗色白 #EEEEEE 反相;社交圆图标保品牌色)'); -registerColor('login-primary-button-border', { - light: '#434343', - dark: '#FFFFFF', -}, 'Login — 主按钮/圆钮描边(亮色 #434343 / 暗色 #FFFFFF)'); -registerColor('login-primary-button-text', { - light: '#D4D4D4', - dark: '#2A2828', -}, 'Login — 主按钮文字(亮色 #D4D4D4 / 暗色 #2A2828 反相)'); -registerColor('login-disabled-button-overlay', { - light: 'rgba(255, 255, 255, 0.7)', - dark: 'rgba(255, 255, 255, 0.7)', -}, 'Login — disabled 按钮白 70% 叠层(两模式同构,§16.5 disabled 特例)'); -registerColor('login-disabled-button-bg', { - light: '#2A2828', - dark: '#2A2828', -}, 'Login — disabled 主按钮底(两模式同构深底;暗色不随 primary-button-bg 反相为白,figma white_button Disable)'); -registerColor('login-disabled-button-text', { - light: '#D4D4D4', - dark: '#D4D4D4', -}, 'Login — disabled 主按钮文字(两模式同构,配合 opacity 0.8;figma white_button Disable)'); -registerColor('login-inverted-button-border', { - light: '#FFFFFF', - dark: '#FFFFFF', -}, 'Login — 浅底钮白描边/区域徽标白字(两模式同值 #FFFFFF;推导,待 Figma 精确)'); -registerColor('login-link-text', { - light: '#2A2828', - dark: '#EEEEEE', -}, 'Login — Text_link default 重发链接(亮色墨黑 #2A2828 / 暗色浅色 #EEEEEE 下划线;figma 539:752 dark_重新发送)'); -registerColor('login-link-hover', { - light: '#4A4848', - dark: '#A8A8A8', -}, 'Login — Text_link hover(亮色 #4A4848 / 暗色 #A8A8A8 推导,待 Figma;仅桌面 hover)'); -registerColor('login-error-fg', { - light: '#D91F37', - dark: '#D91F37', -}, 'Login — 错误文本/error 描边(语义豁免,跨模式不变 #D91F37)'); +registerColor('login-panel-bg', GENERATED_DEFAULTS["login-panel-bg"], 'Login — 面板底(亮色 #FBFBFB / 暗色 #312F2F;DESIGN.md §16.1)'); +registerColor('login-control-bg', GENERATED_DEFAULTS["login-control-bg"], 'Login — 输入框底(亮色 #EEEEEE / 暗色 #2C2A2A,figma Dark_normal 输入 symbol。暗色下与方式行/返回钮底分化,后者走 login-action-control-bg)'); +registerColor('login-action-control-bg', GENERATED_DEFAULTS["login-action-control-bg"], 'Login — 方式行/返回钮底(亮色与输入框同 #EEEEEE;暗色 #2A2828 与输入框分化;figma 549:850/549:897,组件库更新 2026-07-23)'); +registerColor('login-back-border', GENERATED_DEFAULTS["login-back-border"], 'Login — 返回钮描边(亮色白 / 暗色 #434343;figma 549:897。区域徽标白字仍走 login-inverted-button-border)'); +registerColor('login-control-border', GENERATED_DEFAULTS["login-control-border"], 'Login — 控件 default 描边(亮色 #D4D4D4 / 暗色 #434343)'); +registerColor('login-control-border-active', GENERATED_DEFAULTS["login-control-border-active"], 'Login — 控件 focus/filled 描边(亮色 #2A2828 / 暗色 #EEEEEE 反相)'); +registerColor('login-control-border-disabled', GENERATED_DEFAULTS["login-control-border-disabled"], 'Login — disabled 控件描边(两模式同构,§16.5 disabled 特例)'); +registerColor('login-control-text', GENERATED_DEFAULTS["login-control-text"], 'Login — 控件已填文本/标题(亮色 #252222 / 暗色 #EEEEEE)'); +registerColor('login-control-placeholder', GENERATED_DEFAULTS["login-control-placeholder"], 'Login — 控件 placeholder/countdown(亮色 #D4D4D4 / 暗色 #6F6F6F;figma 539:754 dark_倒计时重发)'); +registerColor('login-title-text', GENERATED_DEFAULTS["login-title-text"], 'Login — 面板标题 32 Bold(亮色 #252222 / 暗色 #D4D4D4)'); +registerColor('login-secondary-text', GENERATED_DEFAULTS["login-secondary-text"], 'Login — 副标题/说明文字(两模式同值 #6F6F6F)'); +registerColor('login-primary-button-bg', GENERATED_DEFAULTS["login-primary-button-bg"], 'Login — 主按钮/第三方圆钮底(亮色深 #2A2828 / 暗色白 #EEEEEE 反相;社交圆图标保品牌色)'); +registerColor('login-primary-button-border', GENERATED_DEFAULTS["login-primary-button-border"], 'Login — 主按钮/圆钮描边(亮色 #434343 / 暗色 #FFFFFF)'); +registerColor('login-primary-button-text', GENERATED_DEFAULTS["login-primary-button-text"], 'Login — 主按钮文字(亮色 #D4D4D4 / 暗色 #2A2828 反相)'); +registerColor('login-disabled-button-overlay', GENERATED_DEFAULTS["login-disabled-button-overlay"], 'Login — disabled 按钮白 70% 叠层(两模式同构,§16.5 disabled 特例)'); +registerColor('login-disabled-button-bg', GENERATED_DEFAULTS["login-disabled-button-bg"], 'Login — disabled 主按钮底(两模式同构深底;暗色不随 primary-button-bg 反相为白,figma white_button Disable)'); +registerColor('login-disabled-button-text', GENERATED_DEFAULTS["login-disabled-button-text"], 'Login — disabled 主按钮文字(两模式同构,配合 opacity 0.8;figma white_button Disable)'); +registerColor('login-inverted-button-border', GENERATED_DEFAULTS["login-inverted-button-border"], 'Login — 浅底钮白描边/区域徽标白字(两模式同值 #FFFFFF;推导,待 Figma 精确)'); +registerColor('login-link-text', GENERATED_DEFAULTS["login-link-text"], 'Login — Text_link default 重发链接(亮色墨黑 #2A2828 / 暗色浅色 #EEEEEE 下划线;figma 539:752 dark_重新发送)'); +registerColor('login-link-hover', GENERATED_DEFAULTS["login-link-hover"], 'Login — Text_link hover(亮色 #4A4848 / 暗色 #A8A8A8 推导,待 Figma;仅桌面 hover)'); +registerColor('login-error-fg', GENERATED_DEFAULTS["login-error-fg"], 'Login — 错误文本/error 描边(语义豁免,跨模式不变 #D91F37)'); // 注销提示气泡底 + 描边(figma 678:1075「注销状态」组件集;用户拍板 2026-07-25 取 // 「agent 输入框底/描边、main 最深深色底」的**值**:#FFFFFF / #D7D7D4 / #1F1F1E)。 // 不用 alias(var(--chat-input-bg)/var(--chat-input-border)/var(--surface)):login skin // 只分亮/暗、不随扩展主题——alias 会被扩展主题 override(cindy-dark 下 --surface 取 // #2A2828,气泡变浅且与 mobile 色板不一致),同 login-bg-base 上方注释的改判先例。 // 与 mobile loginPalettes.deletionBubbleBg/deletionBubbleBorder 逐值一致。 -registerColor('login-deletion-bubble-bg', { - light: '#FFFFFF', - dark: '#1F1F1E', -}, 'Login — 注销提示气泡底(figma 678:1075;固定值 #FFFFFF / #1F1F1E,取 agent 输入框底与最深深色底的值,不用 alias——login skin 不随扩展主题,与 mobile 逐值一致)'); -registerColor('login-deletion-bubble-border', { - light: '#D7D7D4', - dark: '#3C3C3A', -}, 'Login — 注销提示气泡 1px 描边(figma 678:1075;固定值 #D7D7D4 / #3C3C3A,取 agent 输入框描边的值,不用 alias——同 bubble-bg 口径,与 mobile 逐值一致)'); +registerColor('login-deletion-bubble-bg', GENERATED_DEFAULTS["login-deletion-bubble-bg"], 'Login — 注销提示气泡底(figma 678:1075;固定值 #FFFFFF / #1F1F1E,取 agent 输入框底与最深深色底的值,不用 alias——login skin 不随扩展主题,与 mobile 逐值一致)'); +registerColor('login-deletion-bubble-border', GENERATED_DEFAULTS["login-deletion-bubble-border"], 'Login — 注销提示气泡 1px 描边(figma 678:1075;固定值 #D7D7D4 / #3C3C3A,取 agent 输入框描边的值,不用 alias——同 bubble-bg 口径,与 mobile 逐值一致)'); // Splash 统一面板进度条(亮色 track #D9D9D9/fill #252222;暗色推导 track #434343/fill #D4D4D4,待 Figma 精确)。 -registerColor('login-splash-progress-track', { - light: '#D9D9D9', - dark: '#434343', -}, 'Login splash — 进度条轨(亮色 #D9D9D9 / 暗色 #434343 推导,待 Figma)'); -registerColor('login-splash-progress-fill', { - light: '#252222', - dark: '#D4D4D4', -}, 'Login splash — 进度条填充(亮色 #252222 / 暗色 #D4D4D4 推导,待 Figma)'); +registerColor('login-splash-progress-track', GENERATED_DEFAULTS["login-splash-progress-track"], 'Login splash — 进度条轨(亮色 #D9D9D9 / 暗色 #434343 推导,待 Figma)'); +registerColor('login-splash-progress-fill', GENERATED_DEFAULTS["login-splash-progress-fill"], 'Login splash — 进度条填充(亮色 #252222 / 暗色 #D4D4D4 推导,待 Figma)'); // ── Login overlay 叠层 token(暗色实现 PR;hover/pressed 叠层 light/dark 二态, // 组件 hardcode rgba → var(--login-overlay-*);DESIGN.md §16.5)── // 暗色叠层方向反转(亮色深底叠白 / 暗色白底叠黑),无法用单一 token 值切换,故二态。 -registerColor('login-overlay-button-hover', { - light: 'rgba(255, 255, 255, 0.08)', - dark: 'rgba(0, 0, 0, 0.05)', -}, 'Login — 主按钮/圆钮 hover 叠层(亮色白8% / 暗色黑5%;figma §1.4)'); -registerColor('login-overlay-button-pressed', { - light: 'rgba(0, 0, 0, 0.5)', - dark: 'rgba(0, 0, 0, 0.1)', -}, 'Login — 主按钮/圆钮 pressed 叠层(亮色黑50% / 暗色黑10%;figma §1.4;暗色 pressed 边 #E5E5E5 待组件层裁决)'); -registerColor('login-overlay-back-hover', { - light: 'rgba(255, 255, 255, 0.7)', - dark: 'rgba(255, 255, 255, 0.08)', -}, 'Login — 返回钮 hover 叠层(亮色白70% / 暗色白8% 变浅;figma 549:904)'); -registerColor('login-overlay-back-pressed', { - light: 'rgba(0, 0, 0, 0.08)', - dark: 'rgba(0, 0, 0, 0.08)', -}, 'Login — 返回钮 pressed 叠层(两模式黑8%)'); -registerColor('login-overlay-row-hover', { - light: 'rgba(255, 255, 255, 0.08)', - dark: 'rgba(255, 255, 255, 0.08)', -}, 'Login — 方式行 hover 叠层(两模式白8% 变浅;figma 549:865)'); -registerColor('login-overlay-row-pressed', { - light: 'rgba(0, 0, 0, 0.08)', - dark: 'rgba(0, 0, 0, 0.08)', -}, 'Login — 方式行 pressed 叠层(两模式黑8%)'); -registerColor('login-overlay-input-hover', { - light: 'rgba(0, 0, 0, 0.05)', - dark: 'rgba(255, 255, 255, 0.05)', -}, 'Login — 输入框 hover 叠层(亮色黑5% / 暗色白5% 推导,待 Figma)'); -registerColor('login-loading-ring-track', { - light: 'rgba(42, 40, 40, 0.18)', - dark: 'rgba(212, 212, 212, 0.18)', -}, 'Login — loading 环轨(亮色深半透 / 暗色浅半透 推导,待 Figma)'); +registerColor('login-overlay-button-hover', GENERATED_DEFAULTS["login-overlay-button-hover"], 'Login — 主按钮/圆钮 hover 叠层(亮色白8% / 暗色黑5%;figma §1.4)'); +registerColor('login-overlay-button-pressed', GENERATED_DEFAULTS["login-overlay-button-pressed"], 'Login — 主按钮/圆钮 pressed 叠层(亮色黑50% / 暗色黑10%;figma §1.4;暗色 pressed 边 #E5E5E5 待组件层裁决)'); +registerColor('login-overlay-back-hover', GENERATED_DEFAULTS["login-overlay-back-hover"], 'Login — 返回钮 hover 叠层(亮色白70% / 暗色白8% 变浅;figma 549:904)'); +registerColor('login-overlay-back-pressed', GENERATED_DEFAULTS["login-overlay-back-pressed"], 'Login — 返回钮 pressed 叠层(两模式黑8%)'); +registerColor('login-overlay-row-hover', GENERATED_DEFAULTS["login-overlay-row-hover"], 'Login — 方式行 hover 叠层(两模式白8% 变浅;figma 549:865)'); +registerColor('login-overlay-row-pressed', GENERATED_DEFAULTS["login-overlay-row-pressed"], 'Login — 方式行 pressed 叠层(两模式黑8%)'); +registerColor('login-overlay-input-hover', GENERATED_DEFAULTS["login-overlay-input-hover"], 'Login — 输入框 hover 叠层(亮色黑5% / 暗色白5% 推导,待 Figma)'); +registerColor('login-loading-ring-track', GENERATED_DEFAULTS["login-loading-ring-track"], 'Login — loading 环轨(亮色深半透 / 暗色浅半透 推导,待 Figma)'); // ── Login 协议同意族(consent PR;figma wave5 radiobutton 600:627 四态 + // 服务条款弹窗 602:822/602:1249 + 双色小按钮四母版 602:846/863/1297/1311)── // 与 login-* 族同口径:随基础 light/dark 二态切换,扩展主题不 override。 // radio 选中态为对勾(非圆点),四态双模式反色,色值经 figma SVG 源码直读核对。 -registerColor('login-consent-radio-bg', { - light: '#F1F0F1', - dark: '#2A2828', -}, 'Login — 协议 radio 未选中圈底(figma white_normal 600:626 / Dark_normal 602:1091)'); -registerColor('login-consent-radio-border', { - light: '#434343', - dark: '#F1F0F1', -}, 'Login — 协议 radio 未选中 2px 描边(双模式反色)'); -registerColor('login-consent-radio-checked-bg', { - light: '#2A2828', - dark: '#F1F0F1', -}, 'Login — 协议 radio 选中圈底(figma white_highlight 600:628 / Dark_highlight 602:1093)'); -registerColor('login-consent-radio-check', { - light: '#FFFFFF', - dark: '#2A2828', -}, 'Login — 协议 radio 选中对勾(亮色白勾 / 暗色墨勾)'); -registerColor('login-consent-overlay', { - light: 'rgba(0, 0, 0, 0.85)', - dark: 'rgba(0, 0, 0, 0.85)', -}, 'Login — 协议弹窗全屏遮罩(两模式同值黑 85%;figma 602:820/602:1248 实测)'); +registerColor('login-consent-radio-bg', GENERATED_DEFAULTS["login-consent-radio-bg"], 'Login — 协议 radio 未选中圈底(figma white_normal 600:626 / Dark_normal 602:1091)'); +registerColor('login-consent-radio-border', GENERATED_DEFAULTS["login-consent-radio-border"], 'Login — 协议 radio 未选中 2px 描边(双模式反色)'); +registerColor('login-consent-radio-checked-bg', GENERATED_DEFAULTS["login-consent-radio-checked-bg"], 'Login — 协议 radio 选中圈底(figma white_highlight 600:628 / Dark_highlight 602:1093)'); +registerColor('login-consent-radio-check', GENERATED_DEFAULTS["login-consent-radio-check"], 'Login — 协议 radio 选中对勾(亮色白勾 / 暗色墨勾)'); +registerColor('login-consent-overlay', GENERATED_DEFAULTS["login-consent-overlay"], 'Login — 协议弹窗全屏遮罩(两模式同值黑 85%;figma 602:820/602:1248 实测)'); // 弹窗次级钮(「不同意」):亮模式浅底 light_button_Normal(602:863),暗模式 // Dark_button_Normal(602:1311,#434141 与面板 #312F2F/描边 #434343 均不同值)。 // 「同意」钮 = 强调钮,双模式恰与 login-primary-button-* 同值,直接复用不新增。 -registerColor('login-secondary-button-bg', { - light: '#EEEEEE', - dark: '#434141', -}, 'Login — 弹窗次级钮底(亮 #EEEEEE / 暗 #434141;figma 双色小按钮 wave5)'); -registerColor('login-secondary-button-border', { - light: '#FFFFFF', - dark: '#565454', -}, 'Login — 弹窗次级钮 1px 描边(亮白 / 暗 #565454)'); -registerColor('login-secondary-button-text', { - light: '#2A2828', - dark: '#EEEEEE', -}, 'Login — 弹窗次级钮文字(亮墨 / 暗浅,双模式反色)'); +registerColor('login-secondary-button-bg', GENERATED_DEFAULTS["login-secondary-button-bg"], 'Login — 弹窗次级钮底(亮 #EEEEEE / 暗 #434141;figma 双色小按钮 wave5)'); +registerColor('login-secondary-button-border', GENERATED_DEFAULTS["login-secondary-button-border"], 'Login — 弹窗次级钮 1px 描边(亮白 / 暗 #565454)'); +registerColor('login-secondary-button-text', GENERATED_DEFAULTS["login-secondary-button-text"], 'Login — 弹窗次级钮文字(亮墨 / 暗浅,双模式反色)'); // wave5 hover/pressed 统一口径:hover = 底叠白(深底 8% / 浅底 10%); // pressed = 叠黑(浅底钮 10% / Dark_button_Normal 20%)。次级钮亮浅暗深, // 两模式叠层参数不同故二态注册(与 login-overlay-* 族同理)。 -registerColor('login-overlay-secondary-hover', { - light: 'rgba(255, 255, 255, 0.1)', - dark: 'rgba(255, 255, 255, 0.08)', -}, 'Login — 弹窗次级钮 hover 叠层(亮浅底白10% / 暗深底白8%;wave5 §11.1)'); -registerColor('login-overlay-secondary-pressed', { - light: 'rgba(0, 0, 0, 0.1)', - dark: 'rgba(0, 0, 0, 0.2)', -}, 'Login — 弹窗次级钮 pressed 叠层(亮浅底黑10% / 暗 Dark_button_Normal 黑20%;wave5 §11.1)'); +registerColor('login-overlay-secondary-hover', GENERATED_DEFAULTS["login-overlay-secondary-hover"], 'Login — 弹窗次级钮 hover 叠层(亮浅底白10% / 暗深底白8%;wave5 §11.1)'); +registerColor('login-overlay-secondary-pressed', GENERATED_DEFAULTS["login-overlay-secondary-pressed"], 'Login — 弹窗次级钮 pressed 叠层(亮浅底黑10% / 暗 Dark_button_Normal 黑20%;wave5 §11.1)'); // Apple 登录圆钮(App Store Guideline 4 对齐,用户标准图 2026-07-24):亮色模式 = // ADR Black button 配色(纯黑圆 + 白标),暗色模式 = ADR White button 配色 // (纯白圆 + 黑标),无描边。语义豁免:官方按钮配色,扩展主题不 override。 -registerColor('login-apple-circle-bg', { - light: '#000000', - dark: '#FFFFFF', -}, 'Login — Apple 圆钮底(ADR Black/White 官方按钮底色;亮黑圆白标/暗白圆黑标,无描边)'); +registerColor('login-apple-circle-bg', GENERATED_DEFAULTS["login-apple-circle-bg"], 'Login — Apple 圆钮底(ADR Black/White 官方按钮底色;亮黑圆白标/暗白圆黑标,无描边)'); -registerColor('lightbox-cta-bg', { - light: 'var(--accent-cta-bg-pure)', - dark: 'var(--accent-cta-bg-pure)', -}, 'Black Pill — Light'); -registerColor('lightbox-cta-fg', { - light: 'var(--accent-pure-cta-fg)', - dark: 'var(--accent-pure-cta-fg)', -}, 'Black Pill CTA foreground'); -registerColor('lightbox-cta-hover', { - light: 'var(--accent-hover)', - dark: 'var(--accent-hover)', -}, 'Near Black — pressed/hover'); +registerColor('lightbox-cta-bg', GENERATED_DEFAULTS["lightbox-cta-bg"], 'Black Pill — Light'); +registerColor('lightbox-cta-fg', GENERATED_DEFAULTS["lightbox-cta-fg"], 'Black Pill CTA foreground'); +registerColor('lightbox-cta-hover', GENERATED_DEFAULTS["lightbox-cta-hover"], 'Near Black — pressed/hover'); // Chat input — Ollama layer system (Light) -registerColor('chat-input-bg', { - light: 'var(--surface-elevated)', - dark: 'var(--surface-elevated)', -}, 'Card — elevated input box on Surface'); -registerColor('chat-input-border', { - light: 'var(--border-default)', - dark: 'var(--border-default)', -}, 'Board — 1px outline'); -registerColor('chat-input-border-focus', { - light: 'var(--text-tertiary)', - dark: 'var(--text-tertiary)', -}, 'Silver — focus hint, still grayscale'); +registerColor('chat-input-bg', GENERATED_DEFAULTS["chat-input-bg"], 'Card — elevated input box on Surface'); +registerColor('chat-input-border', GENERATED_DEFAULTS["chat-input-border"], 'Board — 1px outline'); +registerColor('chat-input-border-focus', GENERATED_DEFAULTS["chat-input-border-focus"], 'Silver — focus hint, still grayscale'); registerColor('chat-input-placeholder-subtle', { light: 'color-mix(in srgb, var(--chat-input-placeholder) 40%, transparent)', dark: 'color-mix(in srgb, var(--chat-input-placeholder) 40%, transparent)', }, 'Chat input placeholder at 40% opacity'); -registerColor('chat-input-text', { - light: '#000000', - dark: '#d4d4d4', -}, 'Pure Black — primary text'); -registerColor('chat-input-placeholder', { - light: 'var(--text-placeholder)', - dark: 'var(--text-placeholder)', -}, 'Placeholder — 收口至 --text-placeholder slot'); +registerColor('chat-input-text', GENERATED_DEFAULTS["chat-input-text"], 'Pure Black — primary text'); +registerColor('chat-input-placeholder', GENERATED_DEFAULTS["chat-input-placeholder"], 'Placeholder — 收口至 --text-placeholder slot'); // File attachment tokens (F-FI-3/4) — Light -registerColor('file-chip-bg', { - light: '#a3a3a3', - dark: '#525252', -}, 'Silver — non-image thumbnail bg'); -registerColor('drop-overlay-bg', { - light: 'rgba(163, 163, 163, 0.08)', - dark: 'rgba(115, 115, 115, 0.1)', -}, 'chat-input-border-focus @ 8%'); -registerColor('drop-overlay-border', { - light: 'var(--text-tertiary)', - dark: 'var(--text-tertiary)', -}, 'chat-input-border-focus'); -registerColor('tooltip-bg', { - light: '#262626', - dark: '#1f1f1e', -}, 'Near Black'); -registerColor('tooltip-text', { - light: '#ffffff', - dark: '#ffffff', -}, 'Pure White'); -registerColor('file-remove-bg', { - light: '#525252', - dark: '#737373', -}, 'Mid Gray'); +registerColor('file-chip-bg', GENERATED_DEFAULTS["file-chip-bg"], 'Silver — non-image thumbnail bg'); +registerColor('drop-overlay-bg', GENERATED_DEFAULTS["drop-overlay-bg"], 'chat-input-border-focus @ 8%'); +registerColor('drop-overlay-border', GENERATED_DEFAULTS["drop-overlay-border"], 'chat-input-border-focus'); +registerColor('tooltip-bg', GENERATED_DEFAULTS["tooltip-bg"], 'Near Black'); +registerColor('tooltip-text', GENERATED_DEFAULTS["tooltip-text"], 'Pure White'); +registerColor('file-remove-bg', GENERATED_DEFAULTS["file-remove-bg"], 'Mid Gray'); // 附件卡自绘文件图标的类型角标(§10 theme-invariant 例外族):颜色跟「这份文件是 // 什么」绑定,不随明暗翻转,两模式同值。取值都按白字 ≥4.5:1 选过(pdf 5.96 / // doc 6.56 / sheet 5.05 / slide 5.24 / code 7.09),角标文字恒用 file-badge-fg。 -registerColor('file-badge-pdf', { - light: '#B23A26', - dark: '#B23A26', -}, '文件类型角标 — PDF(theme-invariant;× file-badge-fg = 5.96:1)'); -registerColor('file-badge-doc', { - light: '#2C5CA8', - dark: '#2C5CA8', -}, '文件类型角标 — 文档(theme-invariant;× file-badge-fg = 6.56:1)'); -registerColor('file-badge-sheet', { - light: '#2E7D4F', - dark: '#2E7D4F', -}, '文件类型角标 — 表格(theme-invariant;× file-badge-fg = 5.05:1)'); -registerColor('file-badge-slide', { - light: '#A25A12', - dark: '#A25A12', -}, '文件类型角标 — 幻灯片(theme-invariant;× file-badge-fg = 5.24:1)'); -registerColor('file-badge-code', { - light: '#5B49A8', - dark: '#5B49A8', -}, '文件类型角标 — 代码(theme-invariant;× file-badge-fg = 7.09:1)'); -registerColor('file-badge-fg', { - light: '#FFFFFF', - dark: '#FFFFFF', -}, '文件类型角标前景 — 恒白(不能借 accent-pure-cta-fg:那个会在 Dark 翻成黑)'); +registerColor('file-badge-pdf', GENERATED_DEFAULTS["file-badge-pdf"], '文件类型角标 — PDF(theme-invariant;× file-badge-fg = 5.96:1)'); +registerColor('file-badge-doc', GENERATED_DEFAULTS["file-badge-doc"], '文件类型角标 — 文档(theme-invariant;× file-badge-fg = 6.56:1)'); +registerColor('file-badge-sheet', GENERATED_DEFAULTS["file-badge-sheet"], '文件类型角标 — 表格(theme-invariant;× file-badge-fg = 5.05:1)'); +registerColor('file-badge-slide', GENERATED_DEFAULTS["file-badge-slide"], '文件类型角标 — 幻灯片(theme-invariant;× file-badge-fg = 5.24:1)'); +registerColor('file-badge-code', GENERATED_DEFAULTS["file-badge-code"], '文件类型角标 — 代码(theme-invariant;× file-badge-fg = 7.09:1)'); +registerColor('file-badge-fg', GENERATED_DEFAULTS["file-badge-fg"], '文件类型角标前景 — 恒白(不能借 accent-pure-cta-fg:那个会在 Dark 翻成黑)'); // Bot 头像底色族(DESIGN.md §2 / §10 登记的窄作用域彩色例外,双模式各一档): // 颜色跟「这是哪个 Bot」绑定,是身份识别线索而不是状态/健康信号 —— 与文件类型角标 // 同性质。Light 用柔和浅 tint、Dark 用同色相深 tint,两侧都保证 emoji 与首字母兜底 // (恒用 --text-primary)清晰可读:浅 tint × #262626 ≥ 10:1,深 tint × #d4d4d4 ≥ 7:1。 // 作用域严格限定为 Bot 头像填充,不得外溢到状态点、徽标、行背景或任何其它表面。 -registerColor('bot-avatar-red-bg', { - light: '#f7ded9', - dark: '#4a2e2a', -}, 'Bot 头像底色 — red(登记例外族)'); -registerColor('bot-avatar-orange-bg', { - light: '#f9e3d2', - dark: '#4a3527', -}, 'Bot 头像底色 — orange(登记例外族)'); -registerColor('bot-avatar-amber-bg', { - light: '#f6ebcd', - dark: '#473a22', -}, 'Bot 头像底色 — amber(登记例外族)'); -registerColor('bot-avatar-green-bg', { - light: '#dceedd', - dark: '#26402a', -}, 'Bot 头像底色 — green(登记例外族)'); -registerColor('bot-avatar-teal-bg', { - light: '#d6ebea', - dark: '#21403e', -}, 'Bot 头像底色 — teal(登记例外族)'); -registerColor('bot-avatar-blue-bg', { - light: '#dce6f5', - dark: '#263449', -}, 'Bot 头像底色 — blue(登记例外族)'); -registerColor('bot-avatar-violet-bg', { - light: '#e3ddf3', - dark: '#322b48', -}, 'Bot 头像底色 — violet(登记例外族)'); -registerColor('bot-avatar-pink-bg', { - light: '#f6deea', - dark: '#452b39', -}, 'Bot 头像底色 — pink(登记例外族)'); -registerColor('bot-avatar-graphite-bg', { - light: '#e5e5e5', - dark: '#3c3c3a', -}, 'Bot 头像底色 — graphite 中性档(旧 graphite 数据映射到这里)'); +registerColor('bot-avatar-red-bg', GENERATED_DEFAULTS["bot-avatar-red-bg"], 'Bot 头像底色 — red(登记例外族)'); +registerColor('bot-avatar-orange-bg', GENERATED_DEFAULTS["bot-avatar-orange-bg"], 'Bot 头像底色 — orange(登记例外族)'); +registerColor('bot-avatar-amber-bg', GENERATED_DEFAULTS["bot-avatar-amber-bg"], 'Bot 头像底色 — amber(登记例外族)'); +registerColor('bot-avatar-green-bg', GENERATED_DEFAULTS["bot-avatar-green-bg"], 'Bot 头像底色 — green(登记例外族)'); +registerColor('bot-avatar-teal-bg', GENERATED_DEFAULTS["bot-avatar-teal-bg"], 'Bot 头像底色 — teal(登记例外族)'); +registerColor('bot-avatar-blue-bg', GENERATED_DEFAULTS["bot-avatar-blue-bg"], 'Bot 头像底色 — blue(登记例外族)'); +registerColor('bot-avatar-violet-bg', GENERATED_DEFAULTS["bot-avatar-violet-bg"], 'Bot 头像底色 — violet(登记例外族)'); +registerColor('bot-avatar-pink-bg', GENERATED_DEFAULTS["bot-avatar-pink-bg"], 'Bot 头像底色 — pink(登记例外族)'); +registerColor('bot-avatar-graphite-bg', GENERATED_DEFAULTS["bot-avatar-graphite-bg"], 'Bot 头像底色 — graphite 中性档(旧 graphite 数据映射到这里)'); // 伙伴列表未读徽标(DESIGN.md §10 登记的窄作用域例外,双模式同值): // 「有新消息」在 IM 里是一个所有人都认得的蓝色药丸,不是一个反相的 CTA。反相白底 // 药丸落在浅灰选中态上会和选中态互相抢焦点 —— 一行里最亮的东西应该是「有几条没看」, // 不是「你现在站在这一行」。值与 focus-ring / Auto Approval / Toast info 同族 #417CDD, // 前景恒白(--accent-pure-cta-fg 在 Dark 会翻成黑,不能借)。 // 作用域严格限定为伙伴列表的未读徽标与待办点,不得外溢到别的徽标、状态点或表面。 -registerColor('bot-unread-bg', { - light: '#417CDD', - dark: '#417CDD', -}, '伙伴列表未读徽标底色 — IM 未读语义(登记例外,theme-invariant;× bot-unread-fg = 4.53:1)'); -registerColor('bot-unread-fg', { - light: '#FFFFFF', - dark: '#FFFFFF', -}, '伙伴列表未读徽标前景 — 恒白(不能借 accent-pure-cta-fg:那个会在 Dark 翻成黑)'); -registerColor('chat-input-chip-bg', { - light: 'var(--surface-chip)', - dark: 'var(--surface-chip)', -}, 'Light Gray — docs/design-rules/cindy-design-system.md Chip'); -registerColor('chat-input-chip-border', { - light: '#d7d7d4', - dark: '#525250', -}, 'Board — 1px outline'); -registerColor('chat-input-chip-text', { - light: 'var(--text-primary)', - dark: 'var(--text-primary)', -}, 'Near Black'); -registerColor('chat-input-chip-icon', { - light: 'var(--text-primary)', - dark: 'var(--text-primary)', -}, 'Near Black'); +registerColor('bot-unread-bg', GENERATED_DEFAULTS["bot-unread-bg"], '伙伴列表未读徽标底色 — IM 未读语义(登记例外,theme-invariant;× bot-unread-fg = 4.53:1)'); +registerColor('bot-unread-fg', GENERATED_DEFAULTS["bot-unread-fg"], '伙伴列表未读徽标前景 — 恒白(不能借 accent-pure-cta-fg:那个会在 Dark 翻成黑)'); +registerColor('chat-input-chip-bg', GENERATED_DEFAULTS["chat-input-chip-bg"], 'Light Gray — docs/design-rules/cindy-design-system.md Chip'); +registerColor('chat-input-chip-border', GENERATED_DEFAULTS["chat-input-chip-border"], 'Board — 1px outline'); +registerColor('chat-input-chip-text', GENERATED_DEFAULTS["chat-input-chip-text"], 'Near Black'); +registerColor('chat-input-chip-icon', GENERATED_DEFAULTS["chat-input-chip-icon"], 'Near Black'); // Command Palette shared tokens — panel + tooltip (light) -registerColor('cmd-palette-bg', { - light: 'var(--surface-elevated)', - dark: 'var(--surface-elevated)', -}, 'Card'); -registerColor('cmd-palette-border', { - light: 'var(--border-default)', - dark: 'var(--border-default)', -}, 'Board'); -registerColor('cmd-palette-shadow', { - light: 'var(--shadow-soft-panel)', - dark: 'var(--shadow-soft-panel)', -}, 'Command Palette shared tokens — panel + tooltip (light)'); -registerColor('cmd-palette-item-hover', { - light: 'var(--surface-hover)', - dark: 'var(--surface-hover)', -}, 'Light Gray'); -registerColor('cmd-palette-item-text', { - light: 'var(--text-primary)', - dark: 'var(--text-primary)', -}, 'Near Black'); -registerColor('cmd-palette-item-meta', { - light: 'var(--text-secondary)', - dark: 'var(--text-secondary)', -}, 'Stone — source tag / path / Agent'); -registerColor('cmd-palette-item-icon', { - light: 'var(--text-secondary)', - dark: 'var(--text-secondary)', -}, 'Stone'); -registerColor('cmd-palette-empty', { - light: 'var(--text-secondary)', - dark: 'var(--text-secondary)', -}, 'Stone — "No matching commands"'); -registerColor('cmd-palette-tooltip-body', { - light: 'var(--text-secondary)', - dark: 'var(--text-secondary)', -}, 'Stone — description body'); +registerColor('cmd-palette-bg', GENERATED_DEFAULTS["cmd-palette-bg"], 'Card'); +registerColor('cmd-palette-border', GENERATED_DEFAULTS["cmd-palette-border"], 'Board'); +registerColor('cmd-palette-shadow', GENERATED_DEFAULTS["cmd-palette-shadow"], 'Command Palette shared tokens — panel + tooltip (light)'); +registerColor('cmd-palette-item-hover', GENERATED_DEFAULTS["cmd-palette-item-hover"], 'Light Gray'); +registerColor('cmd-palette-item-text', GENERATED_DEFAULTS["cmd-palette-item-text"], 'Near Black'); +registerColor('cmd-palette-item-meta', GENERATED_DEFAULTS["cmd-palette-item-meta"], 'Stone — source tag / path / Agent'); +registerColor('cmd-palette-item-icon', GENERATED_DEFAULTS["cmd-palette-item-icon"], 'Stone'); +registerColor('cmd-palette-empty', GENERATED_DEFAULTS["cmd-palette-empty"], 'Stone — "No matching commands"'); +registerColor('cmd-palette-tooltip-body', GENERATED_DEFAULTS["cmd-palette-tooltip-body"], 'Stone — description body'); // Send button — grayscale pill -registerColor('send-btn-bg', { - light: 'var(--accent-cta-bg)', - dark: 'var(--accent-cta-bg)', -}, 'Near Black — per cc-agent-view spec'); -registerColor('send-btn-icon', { - light: 'var(--surface-on-card)', - dark: 'var(--surface-on-card)', -}, 'Send button — grayscale pill'); -registerColor('send-btn-disabled-bg', { - light: 'var(--surface-elevated-soft)', - dark: 'var(--surface-elevated-soft)', -}, 'Light Gray'); -registerColor('send-btn-disabled-icon', { - light: 'var(--text-disabled-tertiary)', - dark: 'var(--text-disabled-tertiary)', -}, 'Silver'); -registerColor('send-btn-hover-bg', { - light: 'var(--send-btn-bg)', - dark: 'var(--send-btn-bg)', -}, 'Send button hover bg(default 同 bg,默认皮肤维持 opacity-85 hover;CINDY override 反相中性 hover #2E3237/#E2E2E2,E1D 纳入值表)'); -registerColor('send-btn-pressed-bg', { - light: 'var(--send-btn-bg)', - dark: 'var(--send-btn-bg)', -}, 'Send button pressed bg(default 同 bg;CINDY override 反相中性 pressed #25282C/#D4D4D4,E1D 纳入值表)'); +registerColor('send-btn-bg', GENERATED_DEFAULTS["send-btn-bg"], 'Near Black — per cc-agent-view spec'); +registerColor('send-btn-icon', GENERATED_DEFAULTS["send-btn-icon"], 'Send button — grayscale pill'); +registerColor('send-btn-disabled-bg', GENERATED_DEFAULTS["send-btn-disabled-bg"], 'Light Gray'); +registerColor('send-btn-disabled-icon', GENERATED_DEFAULTS["send-btn-disabled-icon"], 'Silver'); +registerColor('send-btn-hover-bg', GENERATED_DEFAULTS["send-btn-hover-bg"], 'Send button hover bg(default 同 bg,默认皮肤维持 opacity-85 hover;CINDY override 反相中性 hover #2E3237/#E2E2E2,E1D 纳入值表)'); +registerColor('send-btn-pressed-bg', GENERATED_DEFAULTS["send-btn-pressed-bg"], 'Send button pressed bg(default 同 bg;CINDY override 反相中性 pressed #25282C/#D4D4D4,E1D 纳入值表)'); // Permission prompt (F-PERM-2) -registerColor('perm-code-bg', { - light: '#f5f5f5', - dark: '#1f1f1e', -}, 'Light code block bg'); -registerColor('perm-code-border', { - light: 'var(--border-default)', - dark: 'var(--border-default)', -}, 'Board — code block outline'); -registerColor('perm-allow-btn-bg', { - light: '#ffffff', - dark: '#ffffff', -}, 'Allow once — white bg per ref'); -registerColor('perm-allow-btn-text', { - light: '#262626', - dark: '#262626', -}, 'Allow once — dark text'); -registerColor('perm-allow-kbd-bg', { - light: '#f5f5f5', - dark: '#e5e5e5', -}, 'Allow once kbd bg'); -registerColor('perm-allow-kbd-border', { - light: '#d7d7d4', - dark: '#d7d7d4', -}, 'Allow once kbd border'); +registerColor('perm-code-bg', GENERATED_DEFAULTS["perm-code-bg"], 'Light code block bg'); +registerColor('perm-code-border', GENERATED_DEFAULTS["perm-code-border"], 'Board — code block outline'); +registerColor('perm-allow-btn-bg', GENERATED_DEFAULTS["perm-allow-btn-bg"], 'Allow once — white bg per ref'); +registerColor('perm-allow-btn-text', GENERATED_DEFAULTS["perm-allow-btn-text"], 'Allow once — dark text'); +registerColor('perm-allow-kbd-bg', GENERATED_DEFAULTS["perm-allow-kbd-bg"], 'Allow once kbd bg'); +registerColor('perm-allow-kbd-border', GENERATED_DEFAULTS["perm-allow-kbd-border"], 'Allow once kbd border'); // Model selector -registerColor('model-trigger-hover', { - light: '#e5e5e5', - dark: '#2c2c2a', -}, 'Light Gray — pill hover'); -registerColor('model-trigger-text', { - light: 'var(--text-secondary)', - dark: 'var(--text-secondary)', -}, 'Stone — model name + effort name'); -registerColor('model-trigger-meta', { - light: 'var(--text-tertiary)', - dark: 'var(--text-tertiary)', -}, 'Silver — middle dot separator (·)'); -registerColor('model-trigger-arrow', { - light: 'var(--text-secondary-cross)', - dark: 'var(--text-secondary-cross)', -}, 'Silver'); -registerColor('thinking-body-text', { - light: 'var(--text-tertiary)', - dark: 'var(--text-tertiary)', -}, 'Silver — one tier below title'); -registerColor('model-dropdown-bg', { - light: 'var(--surface-elevated)', - dark: 'var(--surface-elevated)', -}, 'Card'); -registerColor('model-dropdown-border', { - light: 'var(--border-default)', - dark: 'var(--border-default)', -}, 'Board'); -registerColor('model-item-hover', { - light: 'var(--surface-hover)', - dark: 'var(--surface-hover)', -}, 'Light Gray'); -registerColor('model-item-text', { - light: 'var(--text-primary)', - dark: 'var(--text-primary)', -}, 'Near Black'); -registerColor('model-item-check', { - light: 'var(--accent-cta-bg-pure)', - dark: 'var(--accent-cta-bg-pure)', -}, 'Pure Black'); -registerColor('model-item-desc', { - light: 'var(--text-secondary)', - dark: 'var(--text-secondary)', -}, 'Stone — model description'); -registerColor('model-section-label', { - light: 'var(--text-secondary)', - dark: 'var(--text-secondary)', -}, 'Stone — "Effort" header'); +registerColor('model-trigger-hover', GENERATED_DEFAULTS["model-trigger-hover"], 'Light Gray — pill hover'); +registerColor('model-trigger-text', GENERATED_DEFAULTS["model-trigger-text"], 'Stone — model name + effort name'); +registerColor('model-trigger-meta', GENERATED_DEFAULTS["model-trigger-meta"], 'Silver — middle dot separator (·)'); +registerColor('model-trigger-arrow', GENERATED_DEFAULTS["model-trigger-arrow"], 'Silver'); +registerColor('thinking-body-text', GENERATED_DEFAULTS["thinking-body-text"], 'Silver — one tier below title'); +registerColor('model-dropdown-bg', GENERATED_DEFAULTS["model-dropdown-bg"], 'Card'); +registerColor('model-dropdown-border', GENERATED_DEFAULTS["model-dropdown-border"], 'Board'); +registerColor('model-item-hover', GENERATED_DEFAULTS["model-item-hover"], 'Light Gray'); +registerColor('model-item-text', GENERATED_DEFAULTS["model-item-text"], 'Near Black'); +registerColor('model-item-check', GENERATED_DEFAULTS["model-item-check"], 'Pure Black'); +registerColor('model-item-desc', GENERATED_DEFAULTS["model-item-desc"], 'Stone — model description'); +registerColor('model-section-label', GENERATED_DEFAULTS["model-section-label"], 'Stone — "Effort" header'); // 统一模型选择器(model-selector-unified §1.3 / §1.5) -registerColor('favorite-star', { - light: '#d99a06', - dark: '#e8b425', -}, 'Gold — 收藏 ☆ 点亮态'); +registerColor('favorite-star', GENERATED_DEFAULTS["favorite-star"], 'Gold — 收藏 ☆ 点亮态'); // 推理强度档位绝对色:同一档在 Light / Dark 下必须是同一个颜色(档色表达「这一档有多强」, -// 不表达界面明暗层次),故 light === dark。数值正本在 themes/effortTierColors.ts —— 滑杆拖动 -// 要在相邻档色之间逐帧插值,必须拿到数值 hex,故那份表是源、这里从它注册,两处不可能漂移。 +// 不表达界面明暗层次),故 light === dark。唯一编辑源是 packages/design-tokens/src/reference/color.json, +// 静态表生成到本文件 GENERATED 区;滑杆逐帧插值需要数值 hex,故以 TS 常量导出。 +// effortTierColors.ts 只负责档位适配、插值与回退。 for (const [tier, hex] of Object.entries(EFFORT_TIER_COLORS)) { registerColor(`effort-tier-${tier}`, { light: hex, dark: hex }, `推理强度档位色 — ${tier}`); } // 价格档($ 串)三档色:同为跨主题固定功能色(价格档表达「贵不贵」,不随明暗主题变), -// 数值正本同在 themes/effortTierColors.ts。 +// 与 effort 同由 DTCG reference/color.json 生成到本文件 GENERATED 区。 for (const [tier, hex] of Object.entries(PRICE_TIER_COLORS)) { registerColor(`price-tier-${tier}`, { light: hex, dark: hex }, `价格档位色 — ${tier}`); } @@ -1155,10 +2549,7 @@ for (const [tier, hex] of Object.entries(PRICE_TIER_COLORS)) { // (DESIGN.md §10 语义豁免):它表达的是「这一格开着 Fast」这个功能态,不表达界面明暗层次, // 两种模式给同一个值是**有意决策**,不是漏配 dark。配置浮层里的按钮底色由组件用 color-mix // 从同一个 var 派生,不另存第二份数值。只在浮层内部用(外侧闪电保持中性色,规格 §1.3)。 -registerColor('fast-accent', { - light: '#3B9EFF', - dark: '#3B9EFF', -}, 'Fast 开启态强调蓝(light/dark 同值,跨主题固定功能色)'); +registerColor('fast-accent', GENERATED_DEFAULTS["fast-accent"], 'Fast 开启态强调蓝(light/dark 同值,跨主题固定功能色)'); // 引擎徽标(badge 列表样式的行首 22px 标识)的品牌标识色 —— 与档位色 / 价格档色 / // Fast 强调蓝同一类**跨主题固定功能色**(DESIGN.md §10 语义豁免):它表达的是「这一行 // 现在挂在哪个引擎上」这个身份,不表达界面明暗层次,**light / dark 同值是有意决策**, @@ -1170,144 +2561,54 @@ registerColor('fast-accent', { // 徽标底色(14%)与描边(30%)由组件用 color-mix 从**同一个 var** 派生,PiMark 的 // currentColor 也接同一个 var —— TS 侧不再持有这三个 hex,不会出现「组件拿常量、 // 主题拿 token」两条路各画各的。 -registerColor('engine-badge-cc', { - light: '#d97757', - dark: '#d97757', -}, 'Claude Code 引擎徽标色 — Anthropic 陶土橙(light/dark 同值)'); -registerColor('engine-badge-codex', { - light: '#7a9dff', - dark: '#7a9dff', -}, 'Codex 引擎徽标色 — 官方渐变中段蓝(light/dark 同值)'); -registerColor('engine-badge-pi', { - light: '#a78bfa', - dark: '#a78bfa', -}, 'Pi 引擎徽标色 — 自选紫,上游无官方品牌色(light/dark 同值)'); +registerColor('engine-badge-cc', GENERATED_DEFAULTS["engine-badge-cc"], 'Claude Code 引擎徽标色 — Anthropic 陶土橙(light/dark 同值)'); +registerColor('engine-badge-codex', GENERATED_DEFAULTS["engine-badge-codex"], 'Codex 引擎徽标色 — 官方渐变中段蓝(light/dark 同值)'); +registerColor('engine-badge-pi', GENERATED_DEFAULTS["engine-badge-pi"], 'Pi 引擎徽标色 — 自选紫,上游无官方品牌色(light/dark 同值)'); // Permission selector -registerColor('perm-item-selected-bg', { - light: '#f8f8f6', - dark: '#3c3c3a', -}, 'Warm White — selected item bg'); +registerColor('perm-item-selected-bg', GENERATED_DEFAULTS["perm-item-selected-bg"], 'Warm White — selected item bg'); // Narrow scoped text hints: only selected risky permission modes use color. -registerColor('perm-auto-selected-text', { - light: '#417CDD', - dark: '#417CDD', -}, 'Auto Approval accent(设计定稿 2026-07-17 #417CDD,light/dark 同值;原 light #000050/dark #00D9C5)'); -registerColor('perm-bypass-selected-text', { - light: 'var(--warning-accent)', - dark: 'var(--warning-accent)', -}, 'Heart Orange'); +registerColor('perm-auto-selected-text', GENERATED_DEFAULTS["perm-auto-selected-text"], 'Auto Approval accent(设计定稿 2026-07-17 #417CDD,light/dark 同值;原 light #000050/dark #00D9C5)'); +registerColor('perm-bypass-selected-text', GENERATED_DEFAULTS["perm-bypass-selected-text"], 'Heart Orange'); // Folder picker -registerColor('folder-picker-bg', { - light: 'var(--surface-elevated)', - dark: 'var(--surface-elevated)', -}, 'Card'); -registerColor('folder-picker-border', { - light: 'var(--border-default)', - dark: 'var(--border-default)', -}, 'Board'); -registerColor('folder-item-hover', { - light: 'var(--surface-hover)', - dark: 'var(--surface-hover)', -}, 'Light Gray — docs/design-rules/cindy-design-system.md Chip'); -registerColor('folder-item-name', { - light: 'var(--text-primary)', - dark: 'var(--text-primary)', -}, 'Near Black'); -registerColor('folder-item-path', { - light: 'var(--text-secondary)', - dark: 'var(--text-secondary)', -}, 'Stone'); -registerColor('folder-item-icon', { - light: 'var(--text-secondary)', - dark: 'var(--text-secondary)', -}, 'Stone'); -registerColor('folder-label', { - light: 'var(--text-secondary)', - dark: 'var(--text-secondary)', -}, 'Stone — "Recent" label'); -registerColor('folder-btn-bg', { - light: 'var(--chat-input-bg)', - dark: 'var(--chat-input-bg)', -}, 'Match input box'); -registerColor('folder-btn-border', { - light: 'var(--border-default)', - dark: 'var(--border-default)', -}, 'Board'); -registerColor('folder-btn-text', { - light: 'var(--accent-soft)', - dark: 'var(--accent-soft)', -}, 'Near Black'); -registerColor('folder-btn-icon', { - light: 'var(--accent-soft)', - dark: 'var(--accent-soft)', -}, 'Near Black — per cc-agent-view spec'); +registerColor('folder-picker-bg', GENERATED_DEFAULTS["folder-picker-bg"], 'Card'); +registerColor('folder-picker-border', GENERATED_DEFAULTS["folder-picker-border"], 'Board'); +registerColor('folder-item-hover', GENERATED_DEFAULTS["folder-item-hover"], 'Light Gray — docs/design-rules/cindy-design-system.md Chip'); +registerColor('folder-item-name', GENERATED_DEFAULTS["folder-item-name"], 'Near Black'); +registerColor('folder-item-path', GENERATED_DEFAULTS["folder-item-path"], 'Stone'); +registerColor('folder-item-icon', GENERATED_DEFAULTS["folder-item-icon"], 'Stone'); +registerColor('folder-label', GENERATED_DEFAULTS["folder-label"], 'Stone — "Recent" label'); +registerColor('folder-btn-bg', GENERATED_DEFAULTS["folder-btn-bg"], 'Match input box'); +registerColor('folder-btn-border', GENERATED_DEFAULTS["folder-btn-border"], 'Board'); +registerColor('folder-btn-text', GENERATED_DEFAULTS["folder-btn-text"], 'Near Black'); +registerColor('folder-btn-icon', GENERATED_DEFAULTS["folder-btn-icon"], 'Near Black — per cc-agent-view spec'); // WorkingDir bar -registerColor('workingdir-text', { - light: 'var(--text-secondary)', - dark: 'var(--text-secondary)', -}, 'Stone'); -registerColor('workingdir-icon', { - light: 'var(--text-secondary)', - dark: 'var(--text-secondary)', -}, 'Stone'); +registerColor('workingdir-text', GENERATED_DEFAULTS["workingdir-text"], 'Stone'); +registerColor('workingdir-icon', GENERATED_DEFAULTS["workingdir-icon"], 'Stone'); // FastToggle (F1) -registerColor('fast-toggle-off', { - light: 'var(--text-secondary)', - dark: 'var(--text-secondary)', -}, 'Stone — OFF icon/text'); -registerColor('fast-toggle-track', { - light: 'var(--text-disabled)', - dark: 'var(--text-disabled)', -}, 'Border Light — OFF switch track'); +registerColor('fast-toggle-off', GENERATED_DEFAULTS["fast-toggle-off"], 'Stone — OFF icon/text'); +registerColor('fast-toggle-track', GENERATED_DEFAULTS["fast-toggle-track"], 'Border Light — OFF switch track'); // Chat placeholder -registerColor('chat-placeholder-text', { - light: 'var(--text-tertiary)', - dark: 'var(--text-tertiary)', -}, 'Silver'); +registerColor('chat-placeholder-text', GENERATED_DEFAULTS["chat-placeholder-text"], 'Silver'); // Message stream (F-MSG-1/2/4) -registerColor('msg-user-bg', { - light: 'var(--surface-elevated)', - dark: 'var(--surface-elevated)', -}, 'Card'); -registerColor('msg-user-border', { - light: 'var(--border-default)', - dark: 'var(--border-default)', -}, 'Board'); -registerColor('msg-user-text', { - light: 'var(--text-primary)', - dark: 'var(--text-primary)', -}, 'Near Black'); -registerColor('msg-assistant-text', { - light: 'var(--text-primary)', - dark: 'var(--text-primary)', -}, 'Near Black'); -registerColor('msg-tool-text', { - light: 'var(--text-secondary-mid)', - dark: 'var(--text-secondary-mid)', -}, 'Dark Gray — secondary'); -registerColor('msg-code-block-bg', { - light: 'var(--surface-elevated)', - dark: 'var(--surface-elevated)', -}, 'Card'); -registerColor('msg-code-block-border', { - light: 'var(--border-default)', - dark: 'var(--border-default)', -}, 'Board'); +registerColor('msg-user-bg', GENERATED_DEFAULTS["msg-user-bg"], 'Card'); +registerColor('msg-user-border', GENERATED_DEFAULTS["msg-user-border"], 'Board'); +registerColor('msg-user-text', GENERATED_DEFAULTS["msg-user-text"], 'Near Black'); +registerColor('msg-assistant-text', GENERATED_DEFAULTS["msg-assistant-text"], 'Near Black'); +registerColor('msg-tool-text', GENERATED_DEFAULTS["msg-tool-text"], 'Dark Gray — secondary'); +registerColor('msg-code-block-bg', GENERATED_DEFAULTS["msg-code-block-bg"], 'Card'); +registerColor('msg-code-block-border', GENERATED_DEFAULTS["msg-code-block-border"], 'Board'); // ⚠️ 名字叫 inline-code,实际语义已经是「chip / subtle hover 底」:除了可点的 // FileTargetChip,还有 13 处把它用作 hover:bg-(TextLightbox / AgentActionRow / // ToolPayloadLightbox / ToolCallCard / ChatAudioCard)。**不要**为了调 markdown // 行内 code 而改这里 —— 那会把那些交互反馈一起变淡。markdown 行内 code 用下面 // 单开的 msg-md-inline-code-bg。 -registerColor('msg-code-inline-bg', { - light: 'var(--surface-chip)', - dark: 'var(--surface-chip)', -}, 'Light Gray — chip / subtle hover 底(非 markdown 行内 code)'); +registerColor('msg-code-inline-bg', GENERATED_DEFAULTS["msg-code-inline-bg"], 'Light Gray — chip / subtle hover 底(非 markdown 行内 code)'); // markdown 行内 code 底 —— 对齐 GitHub Primer 的 bgColor-neutral-muted。 // 半透明而非实色的两个理由:① 实色必然在某个容器底色上撞色隐形(移动端就撞过: // 行内 code 底与消息卡片底逐字节相同 → 1.00:1,只剩圆角脏边),半透明的相对对比 @@ -1325,18 +2626,9 @@ registerColor('msg-code-inline-bg', { // 与移动端刻意**不**同形态:移动端聊天流走 RN 嵌套 Text,只认 backgroundColor 不认 // borderRadius,淡底在那边只能是直角方块,所以它改用「零底色 + 文字压暗」 // (chatInlineCodeText)。本路径是 CSS,圆角淡底能真正实现,按 GitHub 原样保留。 -registerColor('msg-md-inline-code-bg', { - light: 'rgba(175, 184, 193, 0.2)', - dark: 'rgba(110, 118, 129, 0.22)', -}, 'GitHub Primer neutral-muted — markdown 行内 code 底(半透明,不随容器撞色;dark alpha 下调至 0.22)'); -registerColor('msg-table-border', { - light: 'var(--border-default)', - dark: 'var(--border-default)', -}, 'Board'); -registerColor('msg-table-header-bg', { - light: 'var(--surface)', - dark: 'var(--surface)', -}, 'Surface'); +registerColor('msg-md-inline-code-bg', GENERATED_DEFAULTS["msg-md-inline-code-bg"], 'GitHub Primer neutral-muted — markdown 行内 code 底(半透明,不随容器撞色;dark alpha 下调至 0.22)'); +registerColor('msg-table-border', GENERATED_DEFAULTS["msg-table-border"], 'Board'); +registerColor('msg-table-header-bg', GENERATED_DEFAULTS["msg-table-header-bg"], 'Surface'); // ── 引用块:正文主色 + 与全局 left rail 统一的竖线 ── // 模型常用 `>` 承载本轮最该看的内容(引述的原始需求、报错原文、待确认结论), // 弱化色让它在扫读时反而最先被跳过 —— 这是引用块唯一要修的问题,故正文改主色。 @@ -1347,102 +2639,33 @@ registerColor('msg-table-header-bg', { // 注:该 rail 对 surface 约 1.36:1(light)/ 1.64:1(dark),低于 WCAG 非文本 // 3:1 —— 这是全局既有设计语言的既定取舍,引用块与之统一优先;要调就整套 rail // 一起调,不在引用块这里单独加深(否则引用块会比工具块更抢眼)。 -registerColor('msg-blockquote-border', { - light: 'var(--agent-actions-rail)', - dark: 'var(--agent-actions-rail)', -}, 'Left rail — 与 agent actions / thinking 卡片竖线统一'); -registerColor('msg-blockquote-text', { - light: 'var(--text-primary)', - dark: 'var(--text-primary)', -}, 'Near Black — 引用正文与正文同权重'); -registerColor('msg-hr-border', { - light: 'var(--border-default)', - dark: 'var(--border-default)', -}, 'Board'); -registerColor('msg-scrollbar', { - light: 'var(--border-default)', - dark: 'var(--border-default)', -}, 'Board'); -registerColor('msg-scrollbar-hover', { - light: '#b0b0ae', - dark: '#555553', -}, 'Board darker — scrollbar hover'); -registerColor('msg-cursor', { - light: 'var(--text-primary)', - dark: 'var(--text-primary)', -}, 'Near Black'); -registerColor('msg-link', { - light: '#2563eb', - dark: '#60a5fa', -}, 'Blue 600 — clickable link'); +registerColor('msg-blockquote-border', GENERATED_DEFAULTS["msg-blockquote-border"], 'Left rail — 与 agent actions / thinking 卡片竖线统一'); +registerColor('msg-blockquote-text', GENERATED_DEFAULTS["msg-blockquote-text"], 'Near Black — 引用正文与正文同权重'); +registerColor('msg-hr-border', GENERATED_DEFAULTS["msg-hr-border"], 'Board'); +registerColor('msg-scrollbar', GENERATED_DEFAULTS["msg-scrollbar"], 'Board'); +registerColor('msg-scrollbar-hover', GENERATED_DEFAULTS["msg-scrollbar-hover"], 'Board darker — scrollbar hover'); +registerColor('msg-cursor', GENERATED_DEFAULTS["msg-cursor"], 'Near Black'); +registerColor('msg-link', GENERATED_DEFAULTS["msg-link"], 'Blue 600 — clickable link'); // Tool Call Card (F-MSG-3) -registerColor('msg-tool-card-bg', { - light: 'var(--surface-elevated)', - dark: 'var(--surface-elevated)', -}, 'Card'); -registerColor('msg-tool-card-border', { - light: 'var(--border-default)', - dark: 'var(--border-default)', -}, 'Board'); -registerColor('msg-tool-card-chevron', { - light: 'var(--text-secondary-mid)', - dark: 'var(--text-secondary-mid)', -}, 'Dark Gray — secondary'); -registerColor('msg-tool-card-text', { - light: 'var(--text-primary)', - dark: 'var(--text-primary)', -}, 'Near Black'); +registerColor('msg-tool-card-bg', GENERATED_DEFAULTS["msg-tool-card-bg"], 'Card'); +registerColor('msg-tool-card-border', GENERATED_DEFAULTS["msg-tool-card-border"], 'Board'); +registerColor('msg-tool-card-chevron', GENERATED_DEFAULTS["msg-tool-card-chevron"], 'Dark Gray — secondary'); +registerColor('msg-tool-card-text', GENERATED_DEFAULTS["msg-tool-card-text"], 'Near Black'); // Todo Checklist Card -registerColor('todo-bar-track', { - light: 'var(--surface-chip)', - dark: 'var(--surface-chip)', -}, 'Progress bar track'); -registerColor('diff-del-fg', { - light: '#b31d28', - dark: '#ff7b72', -}, 'GitHub Diff Red (Light)'); -registerColor('diff-del-bg', { - light: '#ffeef0', - dark: '#67060c', -}, 'GitHub Diff Red BG (Light)'); -registerColor('diff-del-emphasis', { - light: '#ffd7d5', - dark: 'rgba(248, 81, 73, 0.42)', -}, 'GitHub Diff Red inline emphasis'); -registerColor('diff-add-fg', { - light: '#22863a', - dark: '#7ee787', -}, 'GitHub Diff Green (Light)'); -registerColor('pr-open-on-light', { - light: '#2EA043', - dark: '#2EA043', -}, 'Sidebar PR open green on light surfaces (unselected Light / selected Dark pill)'); -registerColor('pr-open-on-dark', { - light: '#3FB950', - dark: '#3FB950', -}, 'Sidebar PR open green on dark surfaces (unselected Dark / selected Light pill)'); -registerColor('diff-add-bg', { - light: '#f0fff4', - dark: '#033a16', -}, 'GitHub Diff Green BG (Light)'); -registerColor('diff-add-emphasis', { - light: '#acf2bd', - dark: 'rgba(46, 160, 67, 0.42)', -}, 'GitHub Diff Green inline emphasis'); -registerColor('diff-line-num', { - light: 'var(--text-tertiary-stone)', - dark: 'var(--text-tertiary-stone)', -}, 'Stone'); -registerColor('info-700', { - light: '#1D4ED8', - dark: '#60a5fa', -}, 'blue-700 — file/param highlight (Light)'); -registerColor('agent-actions-rail', { - light: '#DDD6CB', - dark: '#404040', -}, 'warm neutral — left rail (Light)'); +registerColor('todo-bar-track', GENERATED_DEFAULTS["todo-bar-track"], 'Progress bar track'); +registerColor('diff-del-fg', GENERATED_DEFAULTS["diff-del-fg"], 'GitHub Diff Red (Light)'); +registerColor('diff-del-bg', GENERATED_DEFAULTS["diff-del-bg"], 'GitHub Diff Red BG (Light)'); +registerColor('diff-del-emphasis', GENERATED_DEFAULTS["diff-del-emphasis"], 'GitHub Diff Red inline emphasis'); +registerColor('diff-add-fg', GENERATED_DEFAULTS["diff-add-fg"], 'GitHub Diff Green (Light)'); +registerColor('pr-open-on-light', GENERATED_DEFAULTS["pr-open-on-light"], 'Sidebar PR open green on light surfaces (unselected Light / selected Dark pill)'); +registerColor('pr-open-on-dark', GENERATED_DEFAULTS["pr-open-on-dark"], 'Sidebar PR open green on dark surfaces (unselected Dark / selected Light pill)'); +registerColor('diff-add-bg', GENERATED_DEFAULTS["diff-add-bg"], 'GitHub Diff Green BG (Light)'); +registerColor('diff-add-emphasis', GENERATED_DEFAULTS["diff-add-emphasis"], 'GitHub Diff Green inline emphasis'); +registerColor('diff-line-num', GENERATED_DEFAULTS["diff-line-num"], 'Stone'); +registerColor('info-700', GENERATED_DEFAULTS["info-700"], 'blue-700 — file/param highlight (Light)'); +registerColor('agent-actions-rail', GENERATED_DEFAULTS["agent-actions-rail"], 'warm neutral — left rail (Light)'); // 图片标注(image-annotation):托盘缩略图"带标注"角标底色。语义豁免色—— // 必须与烧进图片位图的笔迹红(lightboxAnnotations.ANNOTATION_STROKE_COLOR @@ -1455,362 +2678,123 @@ registerColor('annotation-accent', { // Claude 额度条只保留组件 alias;色值收敛到已批准的中性 / 告警语义槽, // 让内置与导入主题都跟随同一语义,不再冻结一组独立暖色。 -registerColor('quota-bar-fill', { - light: 'var(--text-secondary)', - dark: 'var(--text-secondary)', -}, 'Claude 额度条正常填充(alias 到中性次要文字色)'); -registerColor('quota-bar-warn', { - light: 'var(--warning-fg)', - dark: 'var(--warning-fg)', -}, 'Claude 额度条警告填充(alias 到已批准 warning 前景)'); -registerColor('quota-bar-crit', { - light: 'var(--error-flat)', - dark: 'var(--error-flat)', -}, 'Claude 额度条临界填充(alias 到已批准 error 前景)'); -registerColor('quota-bar-track', { - light: 'var(--surface-chip)', - dark: 'var(--surface-chip)', -}, 'Claude 额度条轨道(alias 到中性 chip 表面)'); +registerColor('quota-bar-fill', GENERATED_DEFAULTS["quota-bar-fill"], 'Claude 额度条正常填充(alias 到中性次要文字色)'); +registerColor('quota-bar-warn', GENERATED_DEFAULTS["quota-bar-warn"], 'Claude 额度条警告填充(alias 到已批准 warning 前景)'); +registerColor('quota-bar-crit', GENERATED_DEFAULTS["quota-bar-crit"], 'Claude 额度条临界填充(alias 到已批准 error 前景)'); +registerColor('quota-bar-track', GENERATED_DEFAULTS["quota-bar-track"], 'Claude 额度条轨道(alias 到中性 chip 表面)'); // Running Status Bar (F-SDK-3) -registerColor('status-bar-accent', { - light: 'var(--warning-accent)', - dark: 'var(--warning-accent)', -}, 'Thinking Orange — docs/design-rules/cindy-design-system.md'); +registerColor('status-bar-accent', GENERATED_DEFAULTS["status-bar-accent"], 'Thinking Orange — docs/design-rules/cindy-design-system.md'); // 状态徽章前景(§7 必炸点):橙底(status-bar-accent #FF6600)深字。 // 此前橙徽章借用 accent-pure-cta-fg(白字)→ #FFFFFF×#FF6600=2.94:1 不达标; // 拆独立 token 走深字(=text-primary/text-primary-inv),× status-bar-accent ≥4.5:1。 -registerColor('status-badge-fg', { - light: 'var(--accent-pure-cta-fg)', - dark: 'var(--accent-pure-cta-fg)', -}, '状态徽章前景(§7 必炸点;default 镜像 accent-pure-cta-fg 保证既有 9 主题零变化,CINDY override #1F1F1F)'); +registerColor('status-badge-fg', GENERATED_DEFAULTS["status-badge-fg"], '状态徽章前景(§7 必炸点;default 镜像 accent-pure-cta-fg 保证既有 9 主题零变化,CINDY override #1F1F1F)'); // E4D 毛玻璃(R1 audit,用户裁决透壁纸 2026-07-17):半透明底色,仅 CINDY override 生效; // default 不透明等价色(其他 family 行为零变化)。blur 在 CSS backdrop-filter(50px/6px)。 -registerColor('surface-translucent-sidebar', { - light: 'var(--surface)', - dark: 'var(--surface)', -}, 'E4D 侧栏半透明底(default 等价 surface;CINDY override rgba #F6F6F6@90%/#120F0F@85% R1 模式1)'); -registerColor('surface-translucent-main', { - light: 'var(--surface-elevated)', - dark: 'var(--surface-elevated)', -}, 'E4D 主面板半透明底(default surface-elevated;CINDY override rgba #FFFFFF@93%/#120F0F@85% R1 模式2)'); -registerColor('surface-translucent-overlay', { - light: 'var(--surface-elevated)', - dark: 'var(--surface-elevated)', -}, 'E4D 浮层半透明底(default surface-elevated;CINDY override rgba #F6F6F6@90%/#252323@80% R1 模式3)'); +registerColor('surface-translucent-sidebar', GENERATED_DEFAULTS["surface-translucent-sidebar"], 'E4D 侧栏半透明底(default 等价 surface;CINDY override rgba #F6F6F6@90%/#120F0F@85% R1 模式1)'); +registerColor('surface-translucent-main', GENERATED_DEFAULTS["surface-translucent-main"], 'E4D 主面板半透明底(default surface-elevated;CINDY override rgba #FFFFFF@93%/#120F0F@85% R1 模式2)'); +registerColor('surface-translucent-overlay', GENERATED_DEFAULTS["surface-translucent-overlay"], 'E4D 浮层半透明底(default surface-elevated;CINDY override rgba #F6F6F6@90%/#252323@80% R1 模式3)'); // 玻璃侧栏上的搜索输入框底(2026-07-21 玻璃面 hover 半透明化配套):default 透传 surface-elevated // 保证其余 9 主题零变化;CINDY override 半透明(light 白 55% 提亮成"可输入"字段感,dark 黑 25% // 下陷字段感),方向与 sidebar-item-hover 的叠加方向相反,保证 hover 与输入框视觉可区分。 -registerColor('sidebar-search-input-bg', { - light: 'var(--surface-elevated)', - dark: 'var(--surface-elevated)', -}, '玻璃侧栏搜索输入框底(default 等价 surface-elevated;CINDY override rgba 白@55%/黑@25%)'); -registerColor('composer-pill-bg', { - light: '#FCFCFC', - dark: '#393838', -}, 'E2 composer pill/圆钮底(输入条 pill/圆钮,比卡面浅一档刻意对比;lead Figma 实测 spec §2-3;取代错稿 glass-pill-bg)'); -registerColor('composer-pill-icon', { - light: '#3C3F43', - dark: '#D9D9D9', -}, 'E2 composer pill 图标(light=text-primary #3C3F43;dark #D9D9D9;spec §2-3)'); -registerColor('status-bar-meta', { - light: 'var(--text-secondary)', - dark: 'var(--text-secondary)', -}, 'Stone'); +registerColor('sidebar-search-input-bg', GENERATED_DEFAULTS["sidebar-search-input-bg"], '玻璃侧栏搜索输入框底(default 等价 surface-elevated;CINDY override rgba 白@55%/黑@25%)'); +registerColor('composer-pill-bg', GENERATED_DEFAULTS["composer-pill-bg"], 'E2 composer pill/圆钮底(输入条 pill/圆钮,比卡面浅一档刻意对比;lead Figma 实测 spec §2-3;取代错稿 glass-pill-bg)'); +registerColor('composer-pill-icon', GENERATED_DEFAULTS["composer-pill-icon"], 'E2 composer pill 图标(light=text-primary #3C3F43;dark #D9D9D9;spec §2-3)'); +registerColor('status-bar-meta', GENERATED_DEFAULTS["status-bar-meta"], 'Stone'); // Settings page — Ollama layer system (Light) -registerColor('settings-bg', { - light: 'var(--surface)', - dark: 'var(--surface)', -}, 'Surface'); -registerColor('settings-divider', { - light: 'var(--border-default)', - dark: 'var(--border-default)', -}, 'Board — hairline'); -registerColor('settings-back-icon', { - light: 'var(--text-tertiary-mid)', - dark: 'var(--text-tertiary-mid)', -}, 'Mid Gray — arrow glyph'); -registerColor('settings-back-text', { - light: 'var(--text-primary)', - dark: 'var(--text-primary)', -}, 'Near Black — "Settings" title'); -registerColor('settings-back-hover', { - light: 'var(--text-primary)', - dark: 'var(--text-primary)', -}, 'Near Black — subtle hover'); +registerColor('settings-bg', GENERATED_DEFAULTS["settings-bg"], 'Surface'); +registerColor('settings-divider', GENERATED_DEFAULTS["settings-divider"], 'Board — hairline'); +registerColor('settings-back-icon', GENERATED_DEFAULTS["settings-back-icon"], 'Mid Gray — arrow glyph'); +registerColor('settings-back-text', GENERATED_DEFAULTS["settings-back-text"], 'Near Black — "Settings" title'); +registerColor('settings-back-hover', GENERATED_DEFAULTS["settings-back-hover"], 'Near Black — subtle hover'); // Settings - inner sidebar menu items -registerColor('settings-menu-text', { - light: 'var(--text-primary)', - dark: 'var(--text-primary)', -}, 'Near Black — unselected label (用户改稿 2026-07-21:与设置标题同色,不再用二级灰)'); -registerColor('settings-menu-text-selected', { - light: 'var(--text-primary)', - dark: 'var(--text-primary)', -}, 'Near Black — selected label'); -registerColor('settings-menu-bg-selected', { - light: '#e8e8e6', - dark: '#2c2c2a', -}, 'Soft tint — selected pill'); -registerColor('settings-menu-border-selected', { - light: 'var(--border-transparent-mixed)', - dark: 'var(--border-transparent-mixed)', -}, 'Settings - inner sidebar menu items'); -registerColor('settings-menu-bg-hover', { - light: '#ececea', - dark: '#2c2c2a', -}, 'Subtle hover'); -registerColor('settings-section-title', { - light: 'var(--text-primary)', - dark: 'var(--text-primary)', -}, 'Near Black — section heading'); -registerColor('settings-section-desc', { - light: 'var(--text-tertiary-mid)', - dark: 'var(--text-tertiary-mid)', -}, 'Mid Gray — description body'); -registerColor('settings-section-sublabel', { - light: 'var(--text-tertiary-mid)', - dark: 'var(--text-tertiary-mid)', -}, 'Mid Gray — "Theme" sublabel'); +registerColor('settings-menu-text', GENERATED_DEFAULTS["settings-menu-text"], 'Near Black — unselected label (用户改稿 2026-07-21:与设置标题同色,不再用二级灰)'); +registerColor('settings-menu-text-selected', GENERATED_DEFAULTS["settings-menu-text-selected"], 'Near Black — selected label'); +registerColor('settings-menu-bg-selected', GENERATED_DEFAULTS["settings-menu-bg-selected"], 'Soft tint — selected pill'); +registerColor('settings-menu-border-selected', GENERATED_DEFAULTS["settings-menu-border-selected"], 'Settings - inner sidebar menu items'); +registerColor('settings-menu-bg-hover', GENERATED_DEFAULTS["settings-menu-bg-hover"], 'Subtle hover'); +registerColor('settings-section-title', GENERATED_DEFAULTS["settings-section-title"], 'Near Black — section heading'); +registerColor('settings-section-desc', GENERATED_DEFAULTS["settings-section-desc"], 'Mid Gray — description body'); +registerColor('settings-section-sublabel', GENERATED_DEFAULTS["settings-section-sublabel"], 'Mid Gray — "Theme" sublabel'); // Settings - User card (elevated on Surface) -registerColor('settings-profile-card-bg', { - light: 'var(--surface-card-ivory)', - dark: 'var(--surface-card-ivory)', -}, 'Card'); -registerColor('settings-profile-card-border', { - light: 'var(--border-default)', - dark: 'var(--border-default)', -}, 'Board'); -registerColor('settings-profile-avatar-bg', { - light: 'var(--surface-chip-alt)', - dark: 'var(--surface-chip-alt)', -}, 'Light Gray chip'); -registerColor('settings-profile-avatar-text', { - light: 'var(--text-primary)', - dark: 'var(--text-primary)', -}, 'Near Black'); -registerColor('settings-profile-name', { - light: 'var(--text-primary)', - dark: 'var(--text-primary)', -}, 'Near Black'); +registerColor('settings-profile-card-bg', GENERATED_DEFAULTS["settings-profile-card-bg"], 'Card'); +registerColor('settings-profile-card-border', GENERATED_DEFAULTS["settings-profile-card-border"], 'Board'); +registerColor('settings-profile-avatar-bg', GENERATED_DEFAULTS["settings-profile-avatar-bg"], 'Light Gray chip'); +registerColor('settings-profile-avatar-text', GENERATED_DEFAULTS["settings-profile-avatar-text"], 'Near Black'); +registerColor('settings-profile-name', GENERATED_DEFAULTS["settings-profile-name"], 'Near Black'); // Settings - API Key input (pill input on Card) -registerColor('settings-input-bg', { - light: 'var(--surface-card-ivory)', - dark: 'var(--surface-card-ivory)', -}, 'Card'); -registerColor('settings-input-border', { - light: 'var(--border-default)', - dark: 'var(--border-default)', -}, 'Board'); -registerColor('settings-input-border-focus', { - light: 'var(--text-tertiary-stone)', - dark: 'var(--text-tertiary-stone)', -}, 'Stone — focus hint'); -registerColor('settings-input-text', { - light: 'var(--text-primary)', - dark: 'var(--text-primary)', -}, 'Near Black'); -registerColor('settings-input-placeholder', { - light: 'var(--text-placeholder)', - dark: 'var(--text-placeholder)', -}, 'Placeholder — 收口至 --text-placeholder slot'); -registerColor('settings-eye-icon', { - light: 'var(--text-tertiary-stone)', - dark: 'var(--text-tertiary-stone)', -}, 'Stone'); -registerColor('settings-eye-icon-hover', { - light: 'var(--text-primary)', - dark: 'var(--text-primary)', -}, 'Near Black'); -registerColor('settings-trash-icon', { - light: 'var(--text-secondary)', - dark: 'var(--text-secondary)', -}, 'Stone — API Key clear button'); -registerColor('settings-trash-icon-hover', { - light: 'var(--text-primary)', - dark: 'var(--text-primary)', -}, 'Near Black'); -registerColor('settings-source-meta', { - light: 'var(--text-secondary-cross)', - dark: 'var(--text-secondary-cross)', -}, 'Silver — "Source: ..." meta'); -registerColor('settings-source-link', { - light: '#262626', - dark: '#d4d4d4', -}, 'Near Black — "Open Console" link'); -registerColor('settings-error-text', { - light: 'var(--error-flat)', - dark: 'var(--error-flat)', -}, 'Functional only'); +registerColor('settings-input-bg', GENERATED_DEFAULTS["settings-input-bg"], 'Card'); +registerColor('settings-input-border', GENERATED_DEFAULTS["settings-input-border"], 'Board'); +registerColor('settings-input-border-focus', GENERATED_DEFAULTS["settings-input-border-focus"], 'Stone — focus hint'); +registerColor('settings-input-text', GENERATED_DEFAULTS["settings-input-text"], 'Near Black'); +registerColor('settings-input-placeholder', GENERATED_DEFAULTS["settings-input-placeholder"], 'Placeholder — 收口至 --text-placeholder slot'); +registerColor('settings-eye-icon', GENERATED_DEFAULTS["settings-eye-icon"], 'Stone'); +registerColor('settings-eye-icon-hover', GENERATED_DEFAULTS["settings-eye-icon-hover"], 'Near Black'); +registerColor('settings-trash-icon', GENERATED_DEFAULTS["settings-trash-icon"], 'Stone — API Key clear button'); +registerColor('settings-trash-icon-hover', GENERATED_DEFAULTS["settings-trash-icon-hover"], 'Near Black'); +registerColor('settings-source-meta', GENERATED_DEFAULTS["settings-source-meta"], 'Silver — "Source: ..." meta'); +registerColor('settings-source-link', GENERATED_DEFAULTS["settings-source-link"], 'Near Black — "Open Console" link'); +registerColor('settings-error-text', GENERATED_DEFAULTS["settings-error-text"], 'Functional only'); // Settings - StatusBadge (pill on Card) — grayscale per-status ladder -registerColor('settings-badge-bg', { - light: 'var(--surface-card-ivory)', - dark: 'var(--surface-card-ivory)', -}, 'Card'); -registerColor('settings-badge-border', { - light: 'var(--border-default)', - dark: 'var(--border-default)', -}, 'Board'); +registerColor('settings-badge-bg', GENERATED_DEFAULTS["settings-badge-bg"], 'Card'); +registerColor('settings-badge-border', GENERATED_DEFAULTS["settings-badge-border"], 'Board'); // Per-status text/dot — Light ladder: Silver (weakest) → Stone → Pure Black (strongest) -registerColor('settings-badge-needs-config', { - light: 'var(--text-tertiary)', - dark: 'var(--text-tertiary)', -}, 'Silver — de-emphasized "empty" state'); -registerColor('settings-badge-saved', { - light: 'var(--text-secondary)', - dark: 'var(--text-secondary)', -}, 'Stone — neutral default once persisted'); -registerColor('settings-badge-connected', { - light: 'var(--card-status-done)', - dark: 'var(--card-status-done)', -}, 'Done green — connected status indicator'); -registerColor('settings-badge-connected-text', { - light: 'var(--text-primary)', - dark: 'var(--text-primary)', -}, 'Near Black — connected badge text remains neutral'); -registerColor('settings-badge-error', { - light: 'var(--error-flat)', - dark: 'var(--error-flat)', -}, 'Functional error only — grayscale exception'); +registerColor('settings-badge-needs-config', GENERATED_DEFAULTS["settings-badge-needs-config"], 'Silver — de-emphasized "empty" state'); +registerColor('settings-badge-saved', GENERATED_DEFAULTS["settings-badge-saved"], 'Stone — neutral default once persisted'); +registerColor('settings-badge-connected', GENERATED_DEFAULTS["settings-badge-connected"], 'Done green — connected status indicator'); +registerColor('settings-badge-connected-text', GENERATED_DEFAULTS["settings-badge-connected-text"], 'Near Black — connected badge text remains neutral'); +registerColor('settings-badge-error', GENERATED_DEFAULTS["settings-badge-error"], 'Functional error only — grayscale exception'); // Settings - Primary button (Save) = Black Pill CTA -registerColor('settings-btn-primary-bg', { - light: 'var(--accent-emphasis)', - dark: 'var(--accent-emphasis)', -}, 'Near Black'); -registerColor('settings-btn-primary-text', { - light: '#faf9f5', - dark: '#262626', -}, 'Surface ivory'); -registerColor('settings-btn-primary-border', { - light: 'var(--accent-emphasis)', - dark: 'var(--accent-emphasis)', -}, 'Settings - Primary button (Save) = Black Pill CTA'); -registerColor('settings-btn-primary-hover-bg', { - light: 'var(--accent-hover)', - dark: 'var(--accent-hover)', -}, 'Near Black'); +registerColor('settings-btn-primary-bg', GENERATED_DEFAULTS["settings-btn-primary-bg"], 'Near Black'); +registerColor('settings-btn-primary-text', GENERATED_DEFAULTS["settings-btn-primary-text"], 'Surface ivory'); +registerColor('settings-btn-primary-border', GENERATED_DEFAULTS["settings-btn-primary-border"], 'Settings - Primary button (Save) = Black Pill CTA'); +registerColor('settings-btn-primary-hover-bg', GENERATED_DEFAULTS["settings-btn-primary-hover-bg"], 'Near Black'); // Settings - Secondary button (Test / Logout) = Gray Pill -registerColor('settings-btn-secondary-bg', { - light: 'var(--surface-chip-alt)', - dark: 'var(--surface-chip-alt)', -}, 'Light Gray'); -registerColor('settings-btn-secondary-text', { - light: 'var(--text-primary)', - dark: 'var(--text-primary)', -}, 'Near Black'); -registerColor('settings-btn-secondary-border', { - light: 'var(--border-default)', - dark: 'var(--border-default)', -}, 'Board'); -registerColor('settings-btn-secondary-hover-bg', { - light: '#d7d7d4', - dark: '#3c3c3a', -}, 'Board'); +registerColor('settings-btn-secondary-bg', GENERATED_DEFAULTS["settings-btn-secondary-bg"], 'Light Gray'); +registerColor('settings-btn-secondary-text', GENERATED_DEFAULTS["settings-btn-secondary-text"], 'Near Black'); +registerColor('settings-btn-secondary-border', GENERATED_DEFAULTS["settings-btn-secondary-border"], 'Board'); +registerColor('settings-btn-secondary-hover-bg', GENERATED_DEFAULTS["settings-btn-secondary-hover-bg"], 'Board'); // Settings - Theme cards -registerColor('settings-theme-card-bg', { - light: 'var(--surface-card-ivory)', - dark: 'var(--surface-card-ivory)', -}, 'Card'); -registerColor('settings-theme-card-border', { - light: 'var(--border-default)', - dark: 'var(--border-default)', -}, 'Board'); +registerColor('settings-theme-card-bg', GENERATED_DEFAULTS["settings-theme-card-bg"], 'Card'); +registerColor('settings-theme-card-border', GENERATED_DEFAULTS["settings-theme-card-border"], 'Board'); registerColor('settings-social-card-pressed-bg', { light: 'color-mix(in srgb, var(--surface-hover) 88%, var(--text-primary) 12%)', dark: 'color-mix(in srgb, var(--surface-hover) 88%, var(--text-primary) 12%)', }, 'Settings social card pressed background — visibly distinct from hover in every theme'); -registerColor('settings-theme-preview-bg', { - light: 'var(--surface)', - dark: 'var(--surface)', -}, 'Surface — inside preview'); -registerColor('settings-theme-preview-border', { - light: 'var(--border-default)', - dark: 'var(--border-default)', -}, 'Board — unselected border'); -registerColor('settings-theme-preview-border-active', { - light: 'var(--accent-emphasis)', - dark: 'var(--accent-emphasis)', -}, 'Near Black — selected 2px ring'); -registerColor('settings-theme-icon', { - light: 'var(--text-tertiary-stone)', - dark: 'var(--text-tertiary-stone)', -}, 'Stone — unselected'); -registerColor('settings-theme-icon-active', { - light: 'var(--accent-emphasis)', - dark: 'var(--accent-emphasis)', -}, 'Near Black — selected'); -registerColor('settings-theme-label', { - light: 'var(--text-tertiary-stone)', - dark: 'var(--text-tertiary-stone)', -}, 'Stone — unselected'); -registerColor('settings-theme-label-active', { - light: 'var(--accent-emphasis)', - dark: 'var(--accent-emphasis)', -}, 'Near Black — selected'); +registerColor('settings-theme-preview-bg', GENERATED_DEFAULTS["settings-theme-preview-bg"], 'Surface — inside preview'); +registerColor('settings-theme-preview-border', GENERATED_DEFAULTS["settings-theme-preview-border"], 'Board — unselected border'); +registerColor('settings-theme-preview-border-active', GENERATED_DEFAULTS["settings-theme-preview-border-active"], 'Near Black — selected 2px ring'); +registerColor('settings-theme-icon', GENERATED_DEFAULTS["settings-theme-icon"], 'Stone — unselected'); +registerColor('settings-theme-icon-active', GENERATED_DEFAULTS["settings-theme-icon-active"], 'Near Black — selected'); +registerColor('settings-theme-label', GENERATED_DEFAULTS["settings-theme-label"], 'Stone — unselected'); +registerColor('settings-theme-label-active', GENERATED_DEFAULTS["settings-theme-label-active"], 'Near Black — selected'); // Auto preview gradient halves -registerColor('settings-theme-auto-light', { - light: '#f8f8f6', - dark: '#f8f8f6', -}, 'Auto preview gradient halves'); -registerColor('settings-theme-auto-dark', { - light: '#1f1f1e', - dark: '#1f1f1e', -}, 'Auto preview gradient halves'); +registerColor('settings-theme-auto-light', GENERATED_DEFAULTS["settings-theme-auto-light"], 'Auto preview gradient halves'); +registerColor('settings-theme-auto-dark', GENERATED_DEFAULTS["settings-theme-auto-dark"], 'Auto preview gradient halves'); // Settings - Logout button (Card surface pill) -registerColor('settings-logout-bg', { - light: '#faf9f5', - dark: '#2c2c2a', -}, 'Card'); -registerColor('settings-logout-border', { - light: 'var(--border-default)', - dark: 'var(--border-default)', -}, 'Board'); -registerColor('settings-logout-text', { - light: 'var(--text-primary)', - dark: 'var(--text-primary)', -}, 'Near Black'); -registerColor('settings-logout-icon', { - light: 'var(--text-primary)', - dark: 'var(--text-primary)', -}, 'Near Black'); -registerColor('settings-logout-hover-bg', { - light: 'var(--surface-hover-soft)', - dark: 'var(--surface-hover-soft)', -}, 'Surface — gentle hover'); +registerColor('settings-logout-bg', GENERATED_DEFAULTS["settings-logout-bg"], 'Card'); +registerColor('settings-logout-border', GENERATED_DEFAULTS["settings-logout-border"], 'Board'); +registerColor('settings-logout-text', GENERATED_DEFAULTS["settings-logout-text"], 'Near Black'); +registerColor('settings-logout-icon', GENERATED_DEFAULTS["settings-logout-icon"], 'Near Black'); +registerColor('settings-logout-hover-bg', GENERATED_DEFAULTS["settings-logout-hover-bg"], 'Surface — gentle hover'); // Settings - Integrations row (Google + future providers) -registerColor('settings-integration-avatar-bg', { - light: '#faf9f5', - dark: '#3c3c3a', -}, 'Card on Card — neutral chip'); -registerColor('settings-integration-avatar-border', { - light: '#e8e8e6', - // dark 不能用 transparent / border-default(#3c3c3a 与默认 chip bg 同色都不可见); - // 白色低透明度 hairline 叠在任意暗色主题的 chip 底上都能读出细边,无需各主题 override。 - dark: 'rgba(255, 255, 255, 0.08)', -}, 'Hairline'); -registerColor('settings-integration-avatar-icon', { - light: 'var(--text-primary)', - dark: 'var(--text-primary)', -}, 'Mono Google G'); -registerColor('settings-integration-subtitle', { - light: 'var(--text-secondary)', - dark: 'var(--text-secondary)', -}, 'Stone — email / "Not connected"'); -registerColor('settings-integration-warning', { - light: 'var(--warning-accent)', - dark: 'var(--warning-accent)', -}, 'Thinking Orange — "Reconnect required" (docs/design-rules/cindy-design-system.md §2 sanctioned brand orange)'); +registerColor('settings-integration-avatar-bg', GENERATED_DEFAULTS["settings-integration-avatar-bg"], 'Card on Card — neutral chip'); +registerColor('settings-integration-avatar-border', GENERATED_DEFAULTS["settings-integration-avatar-border"], 'Hairline'); +registerColor('settings-integration-avatar-icon', GENERATED_DEFAULTS["settings-integration-avatar-icon"], 'Mono Google G'); +registerColor('settings-integration-subtitle', GENERATED_DEFAULTS["settings-integration-subtitle"], 'Stone — email / "Not connected"'); +registerColor('settings-integration-warning', GENERATED_DEFAULTS["settings-integration-warning"], 'Thinking Orange — "Reconnect required" (docs/design-rules/cindy-design-system.md §2 sanctioned brand orange)'); // Remote SSH host status dot — semantic colors (sanctioned exception to the // "no hue" rule for this widget specifically: user explicitly asked for @@ -1818,397 +2802,121 @@ registerColor('settings-integration-warning', { // docs/design-rules/cindy-design-system.md §2). Hues are kept identical across light/dark — the dot is // small enough that saturation issues don't arise; legibility comes from // the dot's high-contrast position against surface, not from luminance. -registerColor('remote-status-ready', { - light: '#2AAE5B', - dark: '#2AAE5B', -}, 'Status — connected / ready (green)'); -registerColor('remote-status-progress', { - light: '#f59e0b', - dark: '#f59e0b', -}, 'Status — connecting/authenticating/reconnecting (amber-500, 偏黄不容易在小圆点上被误读为红)'); -registerColor('remote-status-failed', { - light: '#D91F37', - dark: '#D91F37', -}, 'Status — connect failed (red)'); +registerColor('remote-status-ready', GENERATED_DEFAULTS["remote-status-ready"], 'Status — connected / ready (green)'); +registerColor('remote-status-progress', GENERATED_DEFAULTS["remote-status-progress"], 'Status — connecting/authenticating/reconnecting (amber-500, 偏黄不容易在小圆点上被误读为红)'); +registerColor('remote-status-failed', GENERATED_DEFAULTS["remote-status-failed"], 'Status — connect failed (red)'); // 会话状态点(AttentionDot / 列表行右槽 / 灵动岛)三态语义色 —— 同 remote-status 走 // docs/design-rules/cindy-design-system.md §2 "小状态点 hue 豁免":跨主题同色,靠位置高对比区分。 // 全端统一色表(与灵动岛 native 对齐):running=Thinking Orange(status-bar-accent)、 // awaiting=TapTap 蓝、error=红、完成未读=绿。 -registerColor('card-status-awaiting', { - light: '#19D2C1', - dark: '#19D2C1', -}, '状态点 — 待用户回复/选择 (设计定稿 2026-07-17 #19D2C1,取代 #00D9C5 冻结红线;light/dark 同值)'); -registerColor('sidebar-draft-indicator', { - light: '#0B726B', - dark: 'var(--card-status-awaiting)', -}, '侧边栏草稿/暂停队列铅笔 — light 深青保证透明侧栏上的小图形对比度,dark 复用 awaiting 青色'); -registerColor('card-status-error', { - light: '#D91F37', - dark: '#D91F37', -}, '状态点 — 任务出错 (设计定稿 2026-07-17 #D91F37,取代 #ef4444;状态族 error,非 error-flat 正文文案)'); -registerColor('card-status-done', { - light: '#2AAE5B', - dark: '#2AAE5B', -}, '状态点 — 完成未读 (设计定稿 2026-07-17 #2AAE5B,取代 #22c55e;普通/定时任务完成统一,橙专职 running)'); -registerColor('completion-badge-fg', { - light: '#1f1f1e', - dark: '#1f1f1e', -}, '完成徽标(✓)前景 — 深墨前景压在 card-status-done 绿上,对比 5.29:1(白前景只有 2.88:1,不达 WCAG 1.4.11 非文字 3:1 门槛);light/dark 同值,与 surface-on-card 暗态的 checked icon 深前景惯例一致'); -registerColor('remote-status-disconnected', { - light: 'var(--text-tertiary)', - dark: 'var(--text-tertiary)', -}, 'Status — never connected / manually disconnected (grey, neutral)'); +registerColor('card-status-awaiting', GENERATED_DEFAULTS["card-status-awaiting"], '状态点 — 待用户回复/选择 (设计定稿 2026-07-17 #19D2C1,取代 #00D9C5 冻结红线;light/dark 同值)'); +registerColor('sidebar-draft-indicator', GENERATED_DEFAULTS["sidebar-draft-indicator"], '侧边栏草稿/暂停队列铅笔 — light 深青保证透明侧栏上的小图形对比度,dark 复用 awaiting 青色'); +registerColor('card-status-error', GENERATED_DEFAULTS["card-status-error"], '状态点 — 任务出错 (设计定稿 2026-07-17 #D91F37,取代 #ef4444;状态族 error,非 error-flat 正文文案)'); +registerColor('card-status-done', GENERATED_DEFAULTS["card-status-done"], '状态点 — 完成未读 (设计定稿 2026-07-17 #2AAE5B,取代 #22c55e;普通/定时任务完成统一,橙专职 running)'); +registerColor('completion-badge-fg', GENERATED_DEFAULTS["completion-badge-fg"], '完成徽标(✓)前景 — 深墨前景压在 card-status-done 绿上,对比 5.29:1(白前景只有 2.88:1,不达 WCAG 1.4.11 非文字 3:1 门槛);light/dark 同值,与 surface-on-card 暗态的 checked icon 深前景惯例一致'); +registerColor('remote-status-disconnected', GENERATED_DEFAULTS["remote-status-disconnected"], 'Status — never connected / manually disconnected (grey, neutral)'); // AskUserQuestion card (F7.3) — Light -registerColor('ask-card-bg', { - light: 'var(--surface-elevated)', - dark: 'var(--surface-elevated)', -}, 'Card'); -registerColor('ask-card-border', { - light: 'var(--border-default)', - dark: 'var(--border-default)', -}, 'Board'); -registerColor('ask-header-text', { - light: 'var(--text-primary)', - dark: 'var(--text-primary)', -}, 'Near Black'); -registerColor('ask-page-text', { - light: 'var(--text-tertiary)', - dark: 'var(--text-tertiary)', -}, 'Silver'); -registerColor('ask-option-label', { - light: 'var(--text-primary)', - dark: 'var(--text-primary)', -}, 'Near Black'); -registerColor('ask-option-desc', { - light: 'var(--text-tertiary-stone)', - dark: 'var(--text-tertiary-stone)', -}, 'Stone'); -registerColor('ask-option-custom', { - light: 'var(--text-tertiary)', - dark: 'var(--text-tertiary)', -}, 'Silver — "Type something else..."'); -registerColor('ask-option-divider', { - light: 'var(--border-default)', - dark: 'var(--border-default)', -}, 'Board'); -registerColor('ask-option-border', { - light: 'var(--border-default)', - dark: 'var(--border-default)', -}, 'Board — options container outline'); -registerColor('ask-badge-bg', { - light: 'var(--surface-chip)', - dark: 'var(--surface-chip)', -}, 'Light Gray'); -registerColor('ask-badge-text', { - light: 'var(--text-primary)', - dark: 'var(--text-primary)', -}, '主文字 — chip/角标文字随主题(勿接 on-dark 槽位,light 会白字压浅底)'); -registerColor('ask-header-chip-bg', { - light: 'var(--surface-chip)', - dark: 'var(--surface-chip)', -}, 'header chip 底 — 落在卡底上,与选项行上的序号角标(ask-badge-bg)分家,皮肤可各自调档'); -registerColor('ask-option-list-bg', { - light: 'var(--surface-elevated)', - dark: 'var(--surface-elevated)', -}, '选项列表面 — 原透明露卡底在 dark 下成一坨深色(2026-07-23 用户实测),给独立列表面'); -registerColor('ask-input-bg', { - light: 'var(--surface-elevated)', - dark: 'var(--surface-elevated)', -}, 'Card'); -registerColor('ask-input-border', { - light: 'var(--border-default)', - dark: 'var(--border-default)', -}, 'Board'); -registerColor('ask-input-text', { - light: 'var(--text-primary)', - dark: 'var(--text-primary)', -}, 'Near Black'); -registerColor('ask-input-placeholder', { - light: 'var(--text-placeholder)', - dark: 'var(--text-placeholder)', -}, 'Placeholder — 收口至 --text-placeholder slot'); -registerColor('ask-send-bg', { - light: 'var(--accent-cta-bg)', - dark: 'var(--accent-cta-bg)', -}, 'Near Black'); -registerColor('ask-send-text', { - light: 'var(--surface-on-card)', - dark: 'var(--surface-on-card)', -}, 'Pure White'); -registerColor('ask-send-disabled-bg', { - light: 'var(--surface-elevated-soft)', - dark: 'var(--surface-elevated-soft)', -}, 'Light Gray'); -registerColor('ask-send-disabled-text', { - light: 'var(--text-disabled-tertiary)', - dark: 'var(--text-disabled-tertiary)', -}, 'Silver'); -registerColor('ask-answered-text', { - light: 'var(--text-secondary)', - dark: 'var(--text-secondary)', -}, 'Stone'); -registerColor('ask-expired-text', { - light: 'var(--text-tertiary)', - dark: 'var(--text-tertiary)', -}, 'Silver'); -registerColor('ask-option-hover', { - light: 'var(--surface-hover-soft)', - dark: 'var(--surface-hover-soft)', -}, 'Surface — option hover'); +registerColor('ask-card-bg', GENERATED_DEFAULTS["ask-card-bg"], 'Card'); +registerColor('ask-card-border', GENERATED_DEFAULTS["ask-card-border"], 'Board'); +registerColor('ask-header-text', GENERATED_DEFAULTS["ask-header-text"], 'Near Black'); +registerColor('ask-page-text', GENERATED_DEFAULTS["ask-page-text"], 'Silver'); +registerColor('ask-option-label', GENERATED_DEFAULTS["ask-option-label"], 'Near Black'); +registerColor('ask-option-desc', GENERATED_DEFAULTS["ask-option-desc"], 'Stone'); +registerColor('ask-option-custom', GENERATED_DEFAULTS["ask-option-custom"], 'Silver — "Type something else..."'); +registerColor('ask-option-divider', GENERATED_DEFAULTS["ask-option-divider"], 'Board'); +registerColor('ask-option-border', GENERATED_DEFAULTS["ask-option-border"], 'Board — options container outline'); +registerColor('ask-badge-bg', GENERATED_DEFAULTS["ask-badge-bg"], 'Light Gray'); +registerColor('ask-badge-text', GENERATED_DEFAULTS["ask-badge-text"], '主文字 — chip/角标文字随主题(勿接 on-dark 槽位,light 会白字压浅底)'); +registerColor('ask-header-chip-bg', GENERATED_DEFAULTS["ask-header-chip-bg"], 'header chip 底 — 落在卡底上,与选项行上的序号角标(ask-badge-bg)分家,皮肤可各自调档'); +registerColor('ask-option-list-bg', GENERATED_DEFAULTS["ask-option-list-bg"], '选项列表面 — 原透明露卡底在 dark 下成一坨深色(2026-07-23 用户实测),给独立列表面'); +registerColor('ask-input-bg', GENERATED_DEFAULTS["ask-input-bg"], 'Card'); +registerColor('ask-input-border', GENERATED_DEFAULTS["ask-input-border"], 'Board'); +registerColor('ask-input-text', GENERATED_DEFAULTS["ask-input-text"], 'Near Black'); +registerColor('ask-input-placeholder', GENERATED_DEFAULTS["ask-input-placeholder"], 'Placeholder — 收口至 --text-placeholder slot'); +registerColor('ask-send-bg', GENERATED_DEFAULTS["ask-send-bg"], 'Near Black'); +registerColor('ask-send-text', GENERATED_DEFAULTS["ask-send-text"], 'Pure White'); +registerColor('ask-send-disabled-bg', GENERATED_DEFAULTS["ask-send-disabled-bg"], 'Light Gray'); +registerColor('ask-send-disabled-text', GENERATED_DEFAULTS["ask-send-disabled-text"], 'Silver'); +registerColor('ask-answered-text', GENERATED_DEFAULTS["ask-answered-text"], 'Stone'); +registerColor('ask-expired-text', GENERATED_DEFAULTS["ask-expired-text"], 'Silver'); +registerColor('ask-option-hover', GENERATED_DEFAULTS["ask-option-hover"], 'Surface — option hover'); // Checkbox — inverted/反色: Light mode = dark border unchecked, dark bg checked -registerColor('ask-checkbox-border', { - light: '#525250', - dark: '#525250', -}, 'Mid Gray — unchecked border'); -registerColor('ask-checkbox-checked-bg', { - light: 'var(--accent-cta-bg)', - dark: 'var(--accent-cta-bg)', -}, 'Near Black — checked fill'); -registerColor('ask-checkbox-checked-icon', { - light: 'var(--surface-on-card)', - dark: 'var(--surface-on-card)', -}, 'Pure White — checkmark'); +registerColor('ask-checkbox-border', GENERATED_DEFAULTS["ask-checkbox-border"], 'Mid Gray — unchecked border'); +registerColor('ask-checkbox-checked-bg', GENERATED_DEFAULTS["ask-checkbox-checked-bg"], 'Near Black — checked fill'); +registerColor('ask-checkbox-checked-icon', GENERATED_DEFAULTS["ask-checkbox-checked-icon"], 'Pure White — checkmark'); // Plan Viewer / Plan Action cards (FP-5/FP-6) — Light -registerColor('plan-card-bg', { - light: 'var(--surface-elevated)', - dark: 'var(--surface-elevated)', -}, 'Card'); -registerColor('plan-card-border', { - light: 'var(--border-default)', - dark: 'var(--border-default)', -}, 'Board'); -registerColor('plan-header-title', { - light: 'var(--text-primary-emphasis)', - dark: 'var(--text-primary-emphasis)', -}, 'pen: title color'); -registerColor('plan-header-hint', { - light: 'var(--text-tertiary)', - dark: 'var(--text-tertiary)', -}, 'Silver'); -registerColor('plan-header-divider', { - light: 'var(--border-default)', - dark: 'var(--border-default)', -}, 'Board'); -registerColor('plan-toolbar-btn-icon', { - light: 'var(--text-tertiary-stone)', - dark: 'var(--text-tertiary-stone)', -}, 'Stone'); -registerColor('plan-toolbar-btn-hover-bg', { - light: '#e8e8e5', - dark: '#3c3c3a', -}, 'Light Chip hover'); -registerColor('plan-outline-bg', { - light: 'var(--surface-elevated)', - dark: 'var(--surface-elevated)', -}, 'Card'); -registerColor('plan-outline-border', { - light: 'var(--border-default)', - dark: 'var(--border-default)', -}, 'Board right divider'); -registerColor('plan-outline-label', { - light: 'var(--text-tertiary-stone)', - dark: 'var(--text-tertiary-stone)', -}, 'Stone'); -registerColor('plan-outline-item-text', { - light: 'var(--text-tertiary-stone)', - dark: 'var(--text-tertiary-stone)', -}, 'Stone'); -registerColor('plan-outline-active-bg', { - light: '#e8e8e5', - dark: '#3c3c3a', -}, 'pen: Light Chip'); -registerColor('plan-outline-active-text', { - light: 'var(--text-primary-emphasis)', - dark: 'var(--text-primary-emphasis)', -}, 'Near Black'); -registerColor('plan-content-bg', { - light: 'var(--surface-elevated)', - dark: 'var(--surface-elevated)', -}, 'Card'); -registerColor('plan-content-section', { - light: 'var(--text-primary-emphasis)', - dark: 'var(--text-primary-emphasis)', -}, 'Near Black heading'); -registerColor('plan-content-body', { - light: 'var(--text-primary-body-strong)', - dark: 'var(--text-primary-body-strong)', -}, 'Mid Gray body'); -registerColor('plan-content-divider', { - light: 'var(--border-default)', - dark: 'var(--border-default)', -}, 'Board'); -registerColor('plan-edit-body', { - light: 'var(--text-primary-body-strong)', - dark: 'var(--text-primary-body-strong)', -}, 'Mid Gray JetBrains Mono'); +registerColor('plan-card-bg', GENERATED_DEFAULTS["plan-card-bg"], 'Card'); +registerColor('plan-card-border', GENERATED_DEFAULTS["plan-card-border"], 'Board'); +registerColor('plan-header-title', GENERATED_DEFAULTS["plan-header-title"], 'pen: title color'); +registerColor('plan-header-hint', GENERATED_DEFAULTS["plan-header-hint"], 'Silver'); +registerColor('plan-header-divider', GENERATED_DEFAULTS["plan-header-divider"], 'Board'); +registerColor('plan-toolbar-btn-icon', GENERATED_DEFAULTS["plan-toolbar-btn-icon"], 'Stone'); +registerColor('plan-toolbar-btn-hover-bg', GENERATED_DEFAULTS["plan-toolbar-btn-hover-bg"], 'Light Chip hover'); +registerColor('plan-outline-bg', GENERATED_DEFAULTS["plan-outline-bg"], 'Card'); +registerColor('plan-outline-border', GENERATED_DEFAULTS["plan-outline-border"], 'Board right divider'); +registerColor('plan-outline-label', GENERATED_DEFAULTS["plan-outline-label"], 'Stone'); +registerColor('plan-outline-item-text', GENERATED_DEFAULTS["plan-outline-item-text"], 'Stone'); +registerColor('plan-outline-active-bg', GENERATED_DEFAULTS["plan-outline-active-bg"], 'pen: Light Chip'); +registerColor('plan-outline-active-text', GENERATED_DEFAULTS["plan-outline-active-text"], 'Near Black'); +registerColor('plan-content-bg', GENERATED_DEFAULTS["plan-content-bg"], 'Card'); +registerColor('plan-content-section', GENERATED_DEFAULTS["plan-content-section"], 'Near Black heading'); +registerColor('plan-content-body', GENERATED_DEFAULTS["plan-content-body"], 'Mid Gray body'); +registerColor('plan-content-divider', GENERATED_DEFAULTS["plan-content-divider"], 'Board'); +registerColor('plan-edit-body', GENERATED_DEFAULTS["plan-edit-body"], 'Mid Gray JetBrains Mono'); // Action card -registerColor('plan-action-approve-text', { - light: 'var(--text-primary-emphasis)', - dark: 'var(--text-primary-emphasis)', -}, 'Plan 操作卡强调主文字'); -registerColor('plan-action-approve-enter', { - light: 'var(--text-secondary-cross)', - dark: 'var(--text-secondary-cross)', -}, 'Silver'); -registerColor('plan-action-row-divider', { - light: 'var(--border-default)', - dark: 'var(--border-default)', -}, 'Board'); -registerColor('plan-action-fb-icon', { - light: 'var(--text-secondary-cross)', - dark: 'var(--text-secondary-cross)', -}, 'Silver'); -registerColor('plan-action-fb-placeholder', { - light: 'var(--text-placeholder)', - dark: 'var(--text-placeholder)', -}, 'Placeholder — 收口至 --text-placeholder slot'); -registerColor('plan-action-fb-text', { - light: 'var(--text-primary-emphasis)', - dark: 'var(--text-primary-emphasis)', -}, 'Plan 反馈输入强调主文字'); -registerColor('plan-action-row-hover-bg', { - light: 'var(--surface-hover-soft)', - dark: 'var(--surface-hover-soft)', -}, 'Surface hover'); -registerColor('plan-action-approve-icon-bg', { - light: 'var(--warning-accent)', - dark: 'var(--warning-accent)', -}, 'Action card'); -registerColor('plan-action-approve-icon-fg', { - light: '#ffffff', - dark: '#ffffff', -}, 'Action card'); +registerColor('plan-action-approve-text', GENERATED_DEFAULTS["plan-action-approve-text"], 'Plan 操作卡强调主文字'); +registerColor('plan-action-approve-enter', GENERATED_DEFAULTS["plan-action-approve-enter"], 'Silver'); +registerColor('plan-action-row-divider', GENERATED_DEFAULTS["plan-action-row-divider"], 'Board'); +registerColor('plan-action-fb-icon', GENERATED_DEFAULTS["plan-action-fb-icon"], 'Silver'); +registerColor('plan-action-fb-placeholder', GENERATED_DEFAULTS["plan-action-fb-placeholder"], 'Placeholder — 收口至 --text-placeholder slot'); +registerColor('plan-action-fb-text', GENERATED_DEFAULTS["plan-action-fb-text"], 'Plan 反馈输入强调主文字'); +registerColor('plan-action-row-hover-bg', GENERATED_DEFAULTS["plan-action-row-hover-bg"], 'Surface hover'); +registerColor('plan-action-approve-icon-bg', GENERATED_DEFAULTS["plan-action-approve-icon-bg"], 'Action card'); +registerColor('plan-action-approve-icon-fg', GENERATED_DEFAULTS["plan-action-approve-icon-fg"], 'Action card'); // Minimized bar -registerColor('plan-min-title', { - light: 'var(--text-primary-emphasis)', - dark: 'var(--text-primary-emphasis)', -}, 'Minimized bar'); -registerColor('plan-min-icon', { - light: 'var(--text-secondary-cross)', - dark: 'var(--text-secondary-cross)', -}, 'Minimized bar'); +registerColor('plan-min-title', GENERATED_DEFAULTS["plan-min-title"], 'Minimized bar'); +registerColor('plan-min-icon', GENERATED_DEFAULTS["plan-min-icon"], 'Minimized bar'); // History bubbles (FP-8) — grayscale per docs/design-rules/cindy-design-system.md -registerColor('plan-bubble-badge-bg', { - light: 'var(--surface-chip)', - dark: 'var(--surface-chip)', -}, 'Light Gray chip'); -registerColor('plan-bubble-badge-text', { - light: 'var(--text-primary)', - dark: 'var(--text-primary)', -}, '主文字 — badge 文字随主题(勿接 on-dark 槽位)'); -registerColor('plan-bubble-body-text', { - light: 'var(--text-primary-body-strong)', - dark: 'var(--text-primary-body-strong)', -}, 'Mid Gray'); -registerColor('plan-bubble-summary-text', { - light: 'var(--text-secondary)', - dark: 'var(--text-secondary)', -}, 'Stone'); -registerColor('color-primary', { - light: '#171717', - dark: '#d4d4d4', -}, '= foreground'); -registerColor('color-neutral-300', { - light: 'var(--text-disabled)', - dark: 'var(--text-disabled)', -}, 'History bubbles (FP-8) — grayscale per docs/design-rules/cindy-design-system.md'); -registerColor('color-neutral-400', { - light: 'var(--text-tertiary)', - dark: 'var(--text-tertiary)', -}, 'Silver'); -registerColor('color-error-600', { - light: 'var(--error-flat)', - dark: 'var(--error-flat)', -}, 'Danger'); -registerColor('color-error-700', { - light: '#dc2626', - dark: '#dc2626', -}, 'Danger hover'); +registerColor('plan-bubble-badge-bg', GENERATED_DEFAULTS["plan-bubble-badge-bg"], 'Light Gray chip'); +registerColor('plan-bubble-badge-text', GENERATED_DEFAULTS["plan-bubble-badge-text"], '主文字 — badge 文字随主题(勿接 on-dark 槽位)'); +registerColor('plan-bubble-body-text', GENERATED_DEFAULTS["plan-bubble-body-text"], 'Mid Gray'); +registerColor('plan-bubble-summary-text', GENERATED_DEFAULTS["plan-bubble-summary-text"], 'Stone'); +registerColor('color-primary', GENERATED_DEFAULTS["color-primary"], '= foreground'); +registerColor('color-neutral-300', GENERATED_DEFAULTS["color-neutral-300"], 'History bubbles (FP-8) — grayscale per docs/design-rules/cindy-design-system.md'); +registerColor('color-neutral-400', GENERATED_DEFAULTS["color-neutral-400"], 'Silver'); +registerColor('color-error-600', GENERATED_DEFAULTS["color-error-600"], 'Danger'); +registerColor('color-error-700', GENERATED_DEFAULTS["color-error-700"], 'Danger hover'); /* === P3.1: focus / shadow / overlay / error / warning 语义槽 === */ -registerColor('focus-ring', { - light: '#417CDD', - dark: '#417CDD', -}, 'Opaque a11y focus border(设计定稿 2026-07-17 #417CDD,取代 blue-500 #3b82f6)'); -registerColor('focus-ring-soft', { - light: 'rgba(65, 124, 221, 0.5)', - dark: 'rgba(65, 124, 221, 0.5)', -}, '50% alpha focus ring(随 focus-ring #417CDD,定稿 2026-07-17)— 替代 ring-[#xxx]/50 写法'); -registerColor('text-selection-bg', { - light: 'var(--focus-ring-soft)', - dark: 'var(--focus-ring-soft)', -}, '文字选中背景(焦点离开宿主窗口时仍保持清晰可见)'); +registerColor('focus-ring', GENERATED_DEFAULTS["focus-ring"], 'Opaque a11y focus border(设计定稿 2026-07-17 #417CDD,取代 blue-500 #3b82f6)'); +registerColor('focus-ring-soft', GENERATED_DEFAULTS["focus-ring-soft"], '50% alpha focus ring(随 focus-ring #417CDD,定稿 2026-07-17)— 替代 ring-[#xxx]/50 写法'); +registerColor('text-selection-bg', GENERATED_DEFAULTS["text-selection-bg"], '文字选中背景(焦点离开宿主窗口时仍保持清晰可见)'); // 小胶囊(引擎选择、rail 格)的选中「浮起」阴影 —— 比 shadow-menu 轻一个量级: // 26px 高的 chip 套 4px/16px 的菜单阴影会糊成一团灰。Dark 下加深,否则在深底上看不见。 -registerColor('shadow-chip-raised', { - light: '0 1px 2px rgba(0, 0, 0, 0.12)', - dark: '0 1px 2px rgba(0, 0, 0, 0.4)', -}, '小胶囊选中态的浮起 shadow'); -registerColor('shadow-menu', { - light: '0 4px 16px rgba(0, 0, 0, 0.15)', - dark: '0 4px 16px rgba(0, 0, 0, 0.5)', -}, 'Dropdown / context menu / 中型悬浮卡 shadow'); -registerColor('overlay-modal', { - light: 'rgba(0, 0, 0, 0.5)', - dark: 'rgba(0, 0, 0, 0.7)', -}, '常规模态 backdrop'); -registerColor('overlay-lightbox', { - light: 'rgba(0, 0, 0, 0.85)', - dark: 'rgba(0, 0, 0, 0.85)', -}, '图片/视频/mermaid lightbox 深 backdrop'); +registerColor('shadow-chip-raised', GENERATED_DEFAULTS["shadow-chip-raised"], '小胶囊选中态的浮起 shadow'); +registerColor('shadow-menu', GENERATED_DEFAULTS["shadow-menu"], 'Dropdown / context menu / 中型悬浮卡 shadow'); +registerColor('overlay-modal', GENERATED_DEFAULTS["overlay-modal"], '常规模态 backdrop'); +registerColor('overlay-lightbox', GENERATED_DEFAULTS["overlay-lightbox"], '图片/视频/mermaid lightbox 深 backdrop'); // lightbox chrome(胶囊工具栏):浮在恒黑 backdrop 上,跨主题恒定,语义豁免类 // (同 overlay-lightbox);仍注册为 token 保留主题 override 能力(规则 16)。 -registerColor('lightbox-toolbar-bg', { - light: 'rgba(0, 0, 0, 0.6)', - dark: 'rgba(0, 0, 0, 0.6)', -}, 'lightbox 胶囊工具栏底色(恒黑 backdrop 上)'); -registerColor('lightbox-toolbar-border', { - light: 'rgba(255, 255, 255, 0.2)', - dark: 'rgba(255, 255, 255, 0.2)', -}, 'lightbox 胶囊工具栏描边/分隔线'); -registerColor('lightbox-toolbar-fg', { - light: 'rgba(255, 255, 255, 0.8)', - dark: 'rgba(255, 255, 255, 0.8)', -}, 'lightbox 胶囊工具栏图标默认色(语义豁免,理由同 lightbox-toolbar-bg)'); -registerColor('lightbox-toolbar-fg-hover', { - light: '#ffffff', - dark: '#ffffff', -}, 'lightbox 胶囊工具栏图标 hover 色(语义豁免,理由同上)'); -registerColor('lightbox-toolbar-hover-bg', { - light: 'rgba(255, 255, 255, 0.1)', - dark: 'rgba(255, 255, 255, 0.1)', -}, 'lightbox 胶囊工具栏按钮 hover 背景(语义豁免,理由同上)'); -registerColor('error-bg', { - light: '#fef2f2', - dark: '#3a2222', -}, '错误警告卡片背景'); -registerColor('error-border', { - light: 'rgba(220, 38, 38, 0.4)', - dark: '#7f1d1d', -}, '错误卡片边框'); -registerColor('error-fg', { - light: '#dc2626', - dark: '#f87171', -}, '错误卡片正文/图标'); -registerColor('error-fg-strong', { - light: '#991b1b', - dark: '#fca5a5', -}, '错误卡片强调文字'); -registerColor('warning-bg-soft', { - light: 'rgba(234, 107, 23, 0.12)', - dark: 'rgba(234, 107, 23, 0.18)', -}, 'Warning alpha surface (FeishuConflictDialog 类警告 badge;alpha 随 warning-accent #EA6B17 同步重算 2026-07-17)'); -registerColor('warning-fg', { - light: '#F3A115', - dark: '#F3A115', -}, '警示强调文字/图标(设计定稿 2026-07-17 #F3A115;与 Toast amber #F59E0B 解耦——Toast 维持 B 组现状,本 token 走定稿前景)'); +registerColor('lightbox-toolbar-bg', GENERATED_DEFAULTS["lightbox-toolbar-bg"], 'lightbox 胶囊工具栏底色(恒黑 backdrop 上)'); +registerColor('lightbox-toolbar-border', GENERATED_DEFAULTS["lightbox-toolbar-border"], 'lightbox 胶囊工具栏描边/分隔线'); +registerColor('lightbox-toolbar-fg', GENERATED_DEFAULTS["lightbox-toolbar-fg"], 'lightbox 胶囊工具栏图标默认色(语义豁免,理由同 lightbox-toolbar-bg)'); +registerColor('lightbox-toolbar-fg-hover', GENERATED_DEFAULTS["lightbox-toolbar-fg-hover"], 'lightbox 胶囊工具栏图标 hover 色(语义豁免,理由同上)'); +registerColor('lightbox-toolbar-hover-bg', GENERATED_DEFAULTS["lightbox-toolbar-hover-bg"], 'lightbox 胶囊工具栏按钮 hover 背景(语义豁免,理由同上)'); +registerColor('error-bg', GENERATED_DEFAULTS["error-bg"], '错误警告卡片背景'); +registerColor('error-border', GENERATED_DEFAULTS["error-border"], '错误卡片边框'); +registerColor('error-fg', GENERATED_DEFAULTS["error-fg"], '错误卡片正文/图标'); +registerColor('error-fg-strong', GENERATED_DEFAULTS["error-fg-strong"], '错误卡片强调文字'); +registerColor('warning-bg-soft', GENERATED_DEFAULTS["warning-bg-soft"], 'Warning alpha surface (FeishuConflictDialog 类警告 badge;alpha 随 warning-accent #EA6B17 同步重算 2026-07-17)'); +registerColor('warning-fg', GENERATED_DEFAULTS["warning-fg"], '警示强调文字/图标(设计定稿 2026-07-17 #F3A115;与 Toast amber #F59E0B 解耦——Toast 维持 B 组现状,本 token 走定稿前景)'); // 伙伴(Bot)界面的状态语义四件套。 // // 这四个 token 此前被 Bot 各面(设置页错误文案、自动化状态点、健康态勾、 @@ -2220,199 +2928,64 @@ registerColor('warning-fg', { // 三个走 alias:错误族直接复用既有 error-* 语义槽,info 复用 info-700 // 与任务状态的既有 fallback 同源,这样非默认 // 主题对 error-* / info-700 的 override 能自动流下来,不会有一族颜色脱队。 -registerColor('text-danger', { - light: 'var(--error-fg)', - dark: 'var(--error-fg)', -}, '伙伴界面 danger 前景 — alias 到 error-fg(错误文案 / 删除类动作 hover)'); -registerColor('danger-bg-soft', { - light: 'var(--error-bg)', - dark: 'var(--error-bg)', -}, '伙伴界面 danger 软背景 — alias 到 error-bg(危险区块底 / destructive 按钮 hover)'); -registerColor('status-info', { - light: 'var(--info-700)', - dark: 'var(--info-700)', -}, '伙伴界面「进行中」状态色 — alias 到 info-700'); +registerColor('text-danger', GENERATED_DEFAULTS["text-danger"], '伙伴界面 danger 前景 — alias 到 error-fg(错误文案 / 删除类动作 hover)'); +registerColor('danger-bg-soft', GENERATED_DEFAULTS["danger-bg-soft"], '伙伴界面 danger 软背景 — alias 到 error-bg(危险区块底 / destructive 按钮 hover)'); +registerColor('status-info', GENERATED_DEFAULTS["status-info"], '伙伴界面「进行中」状态色 — alias 到 info-700'); // success 不 alias 到状态点 card-status-done:那颗绿(#2AAE5B)是按**非文字** 3:1 // 选的,而本 token 同时被当正文色用(健康态标签、自动化「已启用」),压在 Light 的 // surface 上只有 2.56:1。故 Light 取同色相压深的 #177C3C(surface 4.69 / // elevated 5.17 / chip 4.53,三种底都过 4.5),Dark 维持定稿 #2AAE5B(5.73~6.18)。 // 深浅两侧一深一浅的走法与 error-fg(#dc2626 / #f87171)一致。 -registerColor('status-success', { - light: '#177C3C', - dark: '#2AAE5B', -}, '伙伴界面「成功 / 健康 / 已启用」状态色(Light 压深至文字可读档,Dark 用状态族定稿绿)'); +registerColor('status-success', GENERATED_DEFAULTS["status-success"], '伙伴界面「成功 / 健康 / 已启用」状态色(Light 压深至文字可读档,Dark 用状态族定稿绿)'); // cc-mgr 远端升级 banner (UpgradeBanner.tsx) — amber warning 语义,跨主题统一、语义豁免 // (规则 15:warning/amber 在豁免范围,不被非默认主题 override,但仍走 token)。 -registerColor('upgrade-banner-bg', { - light: 'rgba(255, 102, 0, 0.10)', - dark: 'rgba(255, 102, 0, 0.16)', -}, 'cc-mgr 升级 banner 背景 (amber warning, 语义豁免)'); -registerColor('upgrade-banner-border', { - light: 'rgba(245, 158, 11, 0.45)', - dark: 'rgba(245, 158, 11, 0.55)', -}, 'cc-mgr 升级 banner 边框 (amber warning, 语义豁免)'); -registerColor('upgrade-banner-fg', { - light: '#92400e', - dark: '#FBBF24', -}, 'cc-mgr 升级 banner 正文/图标/按钮 (amber warning, 语义豁免)'); +registerColor('upgrade-banner-bg', GENERATED_DEFAULTS["upgrade-banner-bg"], 'cc-mgr 升级 banner 背景 (amber warning, 语义豁免)'); +registerColor('upgrade-banner-border', GENERATED_DEFAULTS["upgrade-banner-border"], 'cc-mgr 升级 banner 边框 (amber warning, 语义豁免)'); +registerColor('upgrade-banner-fg', GENERATED_DEFAULTS["upgrade-banner-fg"], 'cc-mgr 升级 banner 正文/图标/按钮 (amber warning, 语义豁免)'); // Skill Hub 审核状态 badge (publishedStatus.ts) — warning 语义豁免,跨主题统一。 // 机审中 (pending/scanning) 橙色 / 人工复核中 (quarantine) 黄色;审核未通过 (rejected) 复用 error-* token。 -registerColor('skillhub-review-pending-bg', { - light: '#fff7ed', - dark: 'rgba(251, 146, 60, 0.14)', -}, 'Skill Hub 机审中 badge 背景 (orange warning, 语义豁免)'); -registerColor('skillhub-review-pending-border', { - light: '#fed7aa', - dark: 'rgba(251, 146, 60, 0.35)', -}, 'Skill Hub 机审中 badge 边框 (orange warning, 语义豁免)'); -registerColor('skillhub-review-pending-fg', { - light: '#ea580c', - dark: '#fb923c', -}, 'Skill Hub 机审中 badge 文字 (orange warning, 语义豁免)'); -registerColor('skillhub-review-quarantine-bg', { - light: '#fefce8', - dark: 'rgba(250, 204, 21, 0.12)', -}, 'Skill Hub 人工复核中 badge 背景 (yellow warning, 语义豁免)'); -registerColor('skillhub-review-quarantine-border', { - light: '#fef08a', - dark: 'rgba(250, 204, 21, 0.35)', -}, 'Skill Hub 人工复核中 badge 边框 (yellow warning, 语义豁免)'); -registerColor('skillhub-review-quarantine-fg', { - light: '#a16207', - dark: '#facc15', -}, 'Skill Hub 人工复核中 badge 文字 (yellow warning, 语义豁免)'); +registerColor('skillhub-review-pending-bg', GENERATED_DEFAULTS["skillhub-review-pending-bg"], 'Skill Hub 机审中 badge 背景 (orange warning, 语义豁免)'); +registerColor('skillhub-review-pending-border', GENERATED_DEFAULTS["skillhub-review-pending-border"], 'Skill Hub 机审中 badge 边框 (orange warning, 语义豁免)'); +registerColor('skillhub-review-pending-fg', GENERATED_DEFAULTS["skillhub-review-pending-fg"], 'Skill Hub 机审中 badge 文字 (orange warning, 语义豁免)'); +registerColor('skillhub-review-quarantine-bg', GENERATED_DEFAULTS["skillhub-review-quarantine-bg"], 'Skill Hub 人工复核中 badge 背景 (yellow warning, 语义豁免)'); +registerColor('skillhub-review-quarantine-border', GENERATED_DEFAULTS["skillhub-review-quarantine-border"], 'Skill Hub 人工复核中 badge 边框 (yellow warning, 语义豁免)'); +registerColor('skillhub-review-quarantine-fg', GENERATED_DEFAULTS["skillhub-review-quarantine-fg"], 'Skill Hub 人工复核中 badge 文字 (yellow warning, 语义豁免)'); // CREATE AGENT composer controls — Figma 185:1495 / 185:2724, E2-S 2026-07-17. // These private tokens are exact light/dark values for the new-page solid // composer controls. Do not reuse for the session-view glass composer pills. -registerColor('create-agent-control-bg', { - light: '#FCFCFC', - dark: '#393838', -}, 'CREATE AGENT pill / icon button background'); -registerColor('create-agent-control-bg-hover', { - light: 'var(--surface-hover)', - dark: '#444242', -}, 'CREATE AGENT neutral hover background'); -registerColor('create-agent-control-bg-pressed', { - light: 'var(--surface-hover-soft)', - dark: '#504F4F', -}, 'CREATE AGENT neutral pressed background'); -registerColor('create-agent-control-border', { - light: '#DCDFE3', - dark: '#434343', -}, 'CREATE AGENT pill / icon button border'); -registerColor('create-agent-control-text', { - light: '#3C3F43', - dark: '#D4D4D4', -}, 'CREATE AGENT pill text'); -registerColor('create-agent-control-icon', { - light: '#3C3F43', - dark: '#D9D9D9', -}, 'CREATE AGENT icon / chevron'); -registerColor('create-agent-segment-track-bg', { - light: '#EDEDED', - dark: '#2A2828', -}, 'CREATE AGENT Claude/Codex segmented track'); -registerColor('create-agent-segment-inactive-text', { - light: '#9A9DA3', - dark: '#6F6F6F', -}, 'CREATE AGENT segmented inactive text'); -registerColor('create-agent-send-bg', { - light: '#3C3F43', - dark: '#EEEEEE', -}, 'CREATE AGENT send button inverse neutral bg'); -registerColor('create-agent-send-icon', { - light: '#FCFCFC', - dark: '#252222', -}, 'CREATE AGENT send button inverse neutral icon'); -registerColor('create-agent-send-bg-hover', { - light: '#2E3237', - dark: '#E2E2E2', -}, 'CREATE AGENT send button neutral hover bg'); -registerColor('create-agent-send-bg-pressed', { - light: '#25282C', - dark: '#D4D4D4', -}, 'CREATE AGENT send button neutral pressed bg'); -registerColor('create-agent-send-disabled-bg', { - light: '#EDEDED', - dark: '#444242', -}, 'CREATE AGENT send button disabled bg'); -registerColor('create-agent-send-disabled-icon', { - light: '#9A9DA3', - dark: '#585555', -}, 'CREATE AGENT send button disabled icon'); -registerColor('create-agent-focus-ring', { - light: 'var(--text-tertiary)', - dark: 'var(--text-tertiary)', -}, 'CREATE AGENT neutral focus border'); -registerColor('create-agent-quick-card-bg', { - light: '#F8F8F8', - dark: '#312F2F', -}, 'CREATE AGENT quick-start card background'); -registerColor('create-agent-quick-card-border', { - light: '#DCDFE3', - dark: '#434343', -}, 'CREATE AGENT quick-start card border'); -registerColor('create-agent-quick-card-text', { - light: '#3C3F43', - dark: '#D4D4D4', -}, 'CREATE AGENT quick-start card text'); -registerColor('create-agent-quick-card-icon-bg', { - light: '#EDEDED', - dark: '#2A2828', -}, 'CREATE AGENT quick-start icon circle background'); -registerColor('create-agent-quick-card-icon', { - light: '#3C3F43', - dark: '#D4D4D4', -}, 'CREATE AGENT quick-start icon'); -registerColor('create-agent-quick-card-bg-hover', { - light: '#FCFCFC', - dark: '#3B3A3A', -}, 'CREATE AGENT quick-start card neutral hover background'); -registerColor('create-agent-avatar-ring', { - light: 'rgba(255, 255, 255, 0.08)', - dark: 'rgba(255, 255, 255, 0.08)', -}, 'CREATE AGENT lockup avatar outer ring'); -registerColor('create-agent-avatar-glass-bg', { - light: 'rgba(0, 0, 0, 0.004)', - dark: 'rgba(0, 0, 0, 0.004)', -}, 'CREATE AGENT lockup avatar GLASS fill'); -registerColor('create-agent-avatar-inner-ring-start', { - light: 'rgba(255, 255, 255, 0.29)', - dark: 'rgba(255, 255, 255, 0.29)', -}, 'CREATE AGENT lockup avatar inner gradient ring start'); -registerColor('create-agent-avatar-inner-ring-end', { - light: 'rgba(255, 255, 255, 0.24)', - dark: 'rgba(255, 255, 255, 0.24)', -}, 'CREATE AGENT lockup avatar inner gradient ring end'); -registerColor('sidebar-nav-text', { - light: '#3C3F43', - dark: '#D4D4D4', -}, 'CINDY sidebar top nav icon / text'); -registerColor('sidebar-list-muted', { - light: '#9A9DA3', - dark: '#6F6F6F', -}, 'CINDY sidebar section and project list muted text'); -registerColor('sidebar-user-card-bg', { - light: 'rgba(255, 255, 255, 0.20)', - dark: 'rgba(255, 255, 255, 0.05)', -}, 'CINDY sidebar user capsule background'); -registerColor('sidebar-user-card-bg-hover', { - light: 'rgba(60, 63, 67, 0.06)', - dark: 'rgba(255, 255, 255, 0.10)', -}, 'CINDY sidebar user capsule hover background (light darkens on near-white sidebar, dark lightens)'); -registerColor('sidebar-user-card-border', { - light: 'rgba(60, 63, 67, 0.10)', - dark: 'rgba(255, 255, 255, 0.13)', -}, 'CINDY sidebar user capsule border'); -registerColor('sidebar-user-card-text', { - light: '#3C3F43', - dark: '#D4D4D4', -}, 'CINDY sidebar user capsule text and icon'); -registerColor('caret-accent', { - light: 'var(--accent-cta-bg)', - dark: 'var(--accent-cta-bg)', -}, 'Editable caret accent; CINDY overrides to focus blue #417CDD per user decision 2026-07-18(撤红改蓝)'); +registerColor('create-agent-control-bg', GENERATED_DEFAULTS["create-agent-control-bg"], 'CREATE AGENT pill / icon button background'); +registerColor('create-agent-control-bg-hover', GENERATED_DEFAULTS["create-agent-control-bg-hover"], 'CREATE AGENT neutral hover background'); +registerColor('create-agent-control-bg-pressed', GENERATED_DEFAULTS["create-agent-control-bg-pressed"], 'CREATE AGENT neutral pressed background'); +registerColor('create-agent-control-border', GENERATED_DEFAULTS["create-agent-control-border"], 'CREATE AGENT pill / icon button border'); +registerColor('create-agent-control-text', GENERATED_DEFAULTS["create-agent-control-text"], 'CREATE AGENT pill text'); +registerColor('create-agent-control-icon', GENERATED_DEFAULTS["create-agent-control-icon"], 'CREATE AGENT icon / chevron'); +registerColor('create-agent-segment-track-bg', GENERATED_DEFAULTS["create-agent-segment-track-bg"], 'CREATE AGENT Claude/Codex segmented track'); +registerColor('create-agent-segment-inactive-text', GENERATED_DEFAULTS["create-agent-segment-inactive-text"], 'CREATE AGENT segmented inactive text'); +registerColor('create-agent-send-bg', GENERATED_DEFAULTS["create-agent-send-bg"], 'CREATE AGENT send button inverse neutral bg'); +registerColor('create-agent-send-icon', GENERATED_DEFAULTS["create-agent-send-icon"], 'CREATE AGENT send button inverse neutral icon'); +registerColor('create-agent-send-bg-hover', GENERATED_DEFAULTS["create-agent-send-bg-hover"], 'CREATE AGENT send button neutral hover bg'); +registerColor('create-agent-send-bg-pressed', GENERATED_DEFAULTS["create-agent-send-bg-pressed"], 'CREATE AGENT send button neutral pressed bg'); +registerColor('create-agent-send-disabled-bg', GENERATED_DEFAULTS["create-agent-send-disabled-bg"], 'CREATE AGENT send button disabled bg'); +registerColor('create-agent-send-disabled-icon', GENERATED_DEFAULTS["create-agent-send-disabled-icon"], 'CREATE AGENT send button disabled icon'); +registerColor('create-agent-focus-ring', GENERATED_DEFAULTS["create-agent-focus-ring"], 'CREATE AGENT neutral focus border'); +registerColor('create-agent-quick-card-bg', GENERATED_DEFAULTS["create-agent-quick-card-bg"], 'CREATE AGENT quick-start card background'); +registerColor('create-agent-quick-card-border', GENERATED_DEFAULTS["create-agent-quick-card-border"], 'CREATE AGENT quick-start card border'); +registerColor('create-agent-quick-card-text', GENERATED_DEFAULTS["create-agent-quick-card-text"], 'CREATE AGENT quick-start card text'); +registerColor('create-agent-quick-card-icon-bg', GENERATED_DEFAULTS["create-agent-quick-card-icon-bg"], 'CREATE AGENT quick-start icon circle background'); +registerColor('create-agent-quick-card-icon', GENERATED_DEFAULTS["create-agent-quick-card-icon"], 'CREATE AGENT quick-start icon'); +registerColor('create-agent-quick-card-bg-hover', GENERATED_DEFAULTS["create-agent-quick-card-bg-hover"], 'CREATE AGENT quick-start card neutral hover background'); +registerColor('create-agent-avatar-ring', GENERATED_DEFAULTS["create-agent-avatar-ring"], 'CREATE AGENT lockup avatar outer ring'); +registerColor('create-agent-avatar-glass-bg', GENERATED_DEFAULTS["create-agent-avatar-glass-bg"], 'CREATE AGENT lockup avatar GLASS fill'); +registerColor('create-agent-avatar-inner-ring-start', GENERATED_DEFAULTS["create-agent-avatar-inner-ring-start"], 'CREATE AGENT lockup avatar inner gradient ring start'); +registerColor('create-agent-avatar-inner-ring-end', GENERATED_DEFAULTS["create-agent-avatar-inner-ring-end"], 'CREATE AGENT lockup avatar inner gradient ring end'); +registerColor('sidebar-nav-text', GENERATED_DEFAULTS["sidebar-nav-text"], 'CINDY sidebar top nav icon / text'); +registerColor('sidebar-list-muted', GENERATED_DEFAULTS["sidebar-list-muted"], 'CINDY sidebar section and project list muted text'); +registerColor('sidebar-user-card-bg', GENERATED_DEFAULTS["sidebar-user-card-bg"], 'CINDY sidebar user capsule background'); +registerColor('sidebar-user-card-bg-hover', GENERATED_DEFAULTS["sidebar-user-card-bg-hover"], 'CINDY sidebar user capsule hover background (light darkens on near-white sidebar, dark lightens)'); +registerColor('sidebar-user-card-border', GENERATED_DEFAULTS["sidebar-user-card-border"], 'CINDY sidebar user capsule border'); +registerColor('sidebar-user-card-text', GENERATED_DEFAULTS["sidebar-user-card-text"], 'CINDY sidebar user capsule text and icon'); +registerColor('caret-accent', GENERATED_DEFAULTS["caret-accent"], 'Editable caret accent; CINDY overrides to focus blue #417CDD per user decision 2026-07-18(撤红改蓝)'); // DS-4 Button 状态矩阵(G2 hover 换色 / G3 pressed)。拍板人 = 用户/设计师,2026-09-03。 // @@ -2445,10 +3018,7 @@ registerColor('button-secondary-pressed', { }, 'DS-4 button/secondary pressed — 自 hover 再推 10%'); // cta hover 沿用 §4 既有规定的 --accent-hover(其注释本写明 "CTA pressed/hover"), // 只给 Button 一个组件级名字,便于 DS-8 生成 component 层时落回 semantic。 -registerColor('button-cta-hover', { - light: 'var(--accent-hover)', - dark: 'var(--accent-hover)', -}, 'DS-4 button/cta hover — 沿用 --accent-hover(DESIGN.md §4)'); +registerColor('button-cta-hover', GENERATED_DEFAULTS["button-cta-hover"], 'DS-4 button/cta hover — 沿用 --accent-hover(DESIGN.md §4)'); registerColor('button-cta-pressed', { light: 'color-mix(in srgb, var(--button-cta-hover) 90%, var(--accent-pure-cta-fg))', dark: 'color-mix(in srgb, var(--button-cta-hover) 90%, var(--accent-pure-cta-fg))', diff --git a/apps/desktop/src/renderer/themes/effortTierColors.ts b/apps/desktop/src/renderer/themes/effortTierColors.ts index 34477e86ee0..08454701e7a 100644 --- a/apps/desktop/src/renderer/themes/effortTierColors.ts +++ b/apps/desktop/src/renderer/themes/effortTierColors.ts @@ -1,38 +1,24 @@ /** - * effortTierColors —— 推理强度**档位绝对色**的单一事实源(统一模型选择器 - * model-selector-unified §1.3)。 + * effortTierColors —— 推理强度档位的运行时适配器(统一模型选择器 + * model-selector-unified §1.3)。静态值的唯一编辑源是 + * packages/design-tokens/src/reference/color.json;生成器把表写入 colors.ts。 * * 为什么是「跨主题固定」的功能色而不是普通语义 token: * 档色表达的是**这一档有多强**,不是界面的明暗层次 —— 同一个 `high` 在 Light / Dark 下 * 必须是同一个蓝,否则用户在两种主题间切换时会以为自己换了档。这与 DESIGN.md §10 - * 「语义豁免色(theme-invariant)」是同一类:值绑在事物本身、不绑主题。故下表的每个 - * hex 都以同值注册进 colors.ts(`effort-tier-*`),light / dark 一致。 + * 「语义豁免色(theme-invariant)」是同一类:值绑在事物本身、不绑主题。生成到 + * colors.ts 的 EFFORT_TIER_COLORS 每项都以同值注册进 `effort-tier-*`,light / dark 一致。 * - * 为什么表放在这里、而不是只写在 colors.ts 里: - * 滑杆拖动时条色要在**相邻档色之间逐像素插值**(§1.3「拖动中滑块连续跟手、条色按位置 - * 在相邻档色值间连续过渡」),插值必须拿到数值 hex —— CSS 变量在拖动帧里读 computed - * style 既贵又会被主题层间接引用打断。所以数值表在 TS 里定义一次,colors.ts 从这里 - * `import` 去注册 token,组件从这里取值做插值:**两处同源,不可能漂移**。 + * 静态表由 DTCG 经 Terrazzo 原位生成到 colors.ts;本模块只适配档位和插值。 + * 导入本模块会初始化同一 ColorRegistry(无 DOM / 磁盘访问),模块缓存保证只注册一次。 + * 插值仍直接拿 hex,不在拖动帧读取 computed style。 * * 紫色只属于真正的顶档:色映射按**档位 key 绝对取值**,不按「该模型的第几档」相对取值 —— * 封顶 `high` 的模型拉满也是蓝,只有真的支持 `max` / `ultra` 的模型才出现紫(§1.3)。 */ -/** - * 档位 key → 绝对色。键集覆盖 `EFFORT_VALUES` 全部七档: - * - `minimal` 与 `low` 同绿:两者都在「更高效」那一端,产品文案上也常合并表达; - * 给 minimal 单独造一个色只会在同一段色带里塞进第二个难分辨的绿。 - * - `ultra` 与 `max` 同紫:规格 §1.3 明写 `max·ultra` 共用顶档紫。 - */ -export const EFFORT_TIER_COLORS = { - minimal: '#2AAE5B', - low: '#2AAE5B', - medium: '#14B8A6', - high: '#3B82F6', - xhigh: '#4F46E5', - max: '#8B5CF6', - ultra: '#8B5CF6', -} as const satisfies Record; +import { EFFORT_TIER_COLORS, PRICE_TIER_COLORS } from './colors'; +export { EFFORT_TIER_COLORS, PRICE_TIER_COLORS }; /** 未知档位(服务端新下发、客户端还没认识)的兜底色 —— 落中间档,不谎报成顶档。 */ export const EFFORT_TIER_FALLBACK_COLOR = EFFORT_TIER_COLORS.medium; @@ -41,18 +27,6 @@ export const EFFORT_TIER_FALLBACK_COLOR = EFFORT_TIER_COLORS.medium; // `--fast-accent`(colors.ts),组件一律 `var(--fast-accent)` 消费 —— TS 侧不再持有它的 // hex,也就不会出现「组件拿常量、主题拿 token」两条路各画各的。 -/** - * 价格档($ 串)的档位色 —— 设计稿 v4 定稿(saveStyle F)的三档:便宜绿 / 中档琥珀 / - * 高价红。与档位色同理是跨主题固定的功能色(价格档表达「这个模型贵不贵」,不随明暗 - * 主题变),同值注册进 colors.ts(`price-tier-*`)。t1 与推理强度 low 共用同一支绿 —— - * 折扣填充亮段也是它,同一支绿在面板里统一表达「省」。 - */ -export const PRICE_TIER_COLORS = { - t1: EFFORT_TIER_COLORS.low, - t2: '#B58A1F', - t3: '#C05353', -} as const satisfies Record; - /** 取某档位的绝对色;未知档回落中间档色。 */ export function effortTierColor(effort: string | null | undefined): string { if (!effort) return EFFORT_TIER_FALLBACK_COLOR; diff --git a/apps/desktop/src/shared/appearanceSettings.ts b/apps/desktop/src/shared/appearanceSettings.ts index 3c0a30f91f3..40850607295 100644 --- a/apps/desktop/src/shared/appearanceSettings.ts +++ b/apps/desktop/src/shared/appearanceSettings.ts @@ -1,3 +1,5 @@ +import { DEFAULT_FONT_SIZES } from './generated/appearance-tokens'; + /** * Desktop appearance preferences shared by main, preload and renderer. * @@ -24,8 +26,8 @@ export interface AppearanceSettings { export const DEFAULT_APPEARANCE_SETTINGS: AppearanceSettings = { uiFamily: '', codeFamily: '', - uiSize: 14, - codeSize: 14, + uiSize: DEFAULT_FONT_SIZES.uiSize, + codeSize: DEFAULT_FONT_SIZES.codeSize, windowZoom: 1, }; diff --git a/apps/desktop/src/shared/generated/appearance-tokens.ts b/apps/desktop/src/shared/generated/appearance-tokens.ts new file mode 100644 index 00000000000..9a37e65c78c --- /dev/null +++ b/apps/desktop/src/shared/generated/appearance-tokens.ts @@ -0,0 +1,5 @@ +// GENERATED by Terrazzo 2.7.1 — edit packages/design-tokens/src only. +export const DEFAULT_FONT_SIZES = { + "codeSize": 14, + "uiSize": 14 +}; diff --git a/apps/desktop/src/shared/windowBackdrop.ts b/apps/desktop/src/shared/windowBackdrop.ts index 52c62de0627..e5df81e9355 100644 --- a/apps/desktop/src/shared/windowBackdrop.ts +++ b/apps/desktop/src/shared/windowBackdrop.ts @@ -2,10 +2,12 @@ export const WINDOWS_BACKDROP_MATERIALS = ['acrylic', 'mica', 'tabbed', 'none'] export type WindowsBackdropMaterial = (typeof WINDOWS_BACKDROP_MATERIALS)[number]; +// BEGIN GENERATED DS-8: window-backing export const CINDY_ACRYLIC_WINDOW_BACKING = { light: 'rgba(238, 238, 233, 0.85)', dark: 'rgba(5, 5, 5, 0.85)', } as const; +// END GENERATED DS-8: window-backing export const WINDOW_BACKDROP_MATERIAL_CHANGED_CHANNEL = 'window-backdrop-material:changed'; diff --git a/apps/desktop/tailwind.config.ts b/apps/desktop/tailwind.config.ts index c903107976d..ff25cdb658b 100644 --- a/apps/desktop/tailwind.config.ts +++ b/apps/desktop/tailwind.config.ts @@ -1,5 +1,140 @@ import type { Config } from 'tailwindcss'; +// BEGIN GENERATED DS-8: tailwind +const TAILWIND_FONT_SIZE: Record = { + "10": "var(--text-10)", + "11": "var(--text-11)", + "12": "var(--text-12)", + "13": "var(--text-13)", + "14": "var(--text-14)", + "15": "var(--text-15)", + "16": "var(--text-16)", + "18": "var(--text-18)", + "20": "var(--text-20)", + "24": "var(--text-24)", + "28": "var(--text-28)", + "xs": [ + "var(--text-xs)", + { + "lineHeight": "var(--text-xs-line-height)" + } + ], + "sm": [ + "var(--text-sm)", + { + "lineHeight": "var(--text-sm-line-height)" + } + ], + "base": [ + "var(--text-base)", + { + "lineHeight": "var(--text-base-line-height)" + } + ], + "lg": [ + "var(--text-lg)", + { + "lineHeight": "var(--text-lg-line-height)" + } + ], + "xl": [ + "var(--text-xl)", + { + "lineHeight": "var(--text-xl-line-height)" + } + ], + "2xl": [ + "var(--text-2xl)", + { + "lineHeight": "var(--text-2xl-line-height)" + } + ], + "3xl": [ + "var(--text-3xl)", + { + "lineHeight": "var(--text-3xl-line-height)" + } + ], + "4xl": [ + "var(--text-4xl)", + { + "lineHeight": "var(--text-4xl-line-height)" + } + ], + "5xl": [ + "var(--text-5xl)", + { + "lineHeight": "var(--text-5xl-line-height)" + } + ] +}; +const TAILWIND_SPACING = { + "0": "var(--space-0)", + "1": "var(--space-1)", + "2": "var(--space-2)", + "3": "var(--space-3)", + "4": "var(--space-4)", + "5": "var(--space-5)", + "6": "var(--space-6)", + "7": "var(--space-7)", + "8": "var(--space-8)", + "9": "var(--space-9)", + "10": "var(--space-10)", + "11": "var(--space-11)", + "12": "var(--space-12)", + "14": "var(--space-14)", + "16": "var(--space-16)", + "20": "var(--space-20)", + "24": "var(--space-24)", + "28": "var(--space-28)", + "32": "var(--space-32)", + "36": "var(--space-36)", + "40": "var(--space-40)", + "44": "var(--space-44)", + "48": "var(--space-48)", + "52": "var(--space-52)", + "56": "var(--space-56)", + "60": "var(--space-60)", + "64": "var(--space-64)", + "72": "var(--space-72)", + "80": "var(--space-80)", + "96": "var(--space-96)", + "px": "var(--space-px)", + "0.5": "var(--space-0_5)", + "1.5": "var(--space-1_5)", + "2.5": "var(--space-2_5)", + "3.5": "var(--space-3_5)" +}; +const TAILWIND_RADIUS = { + "none": "var(--radius-none)", + "DEFAULT": "var(--radius-default)", + "xl": "var(--radius-xl)", + "2xl": "var(--radius-2xl)", + "3xl": "var(--radius-3xl)", + "full": "var(--radius-full)", + "lg": "var(--radius)", + "md": "calc(var(--radius) - var(--radius-offset-md))", + "sm": "calc(var(--radius) - var(--radius-offset-sm))" +}; +const TAILWIND_FONT_WEIGHT = { + "normal": "var(--font-weight-normal)", + "medium": "var(--font-weight-medium)", + "semibold": "var(--font-weight-semibold)" +}; +const MOTION_CSS = { + "instant": "var(--motion-instant, 80ms)", + "fast": "var(--motion-fast, 150ms)", + "base": "var(--motion-base, 200ms)", + "enter": "var(--motion-enter, 250ms)", + "exit": "var(--motion-exit, 150ms)", + "spinner-cycle": "var(--motion-spinner-cycle, 1000ms)", + "sidebar-title-marquee-per-viewport": "var(--motion-sidebar-title-marquee-per-viewport, 2400ms)", + "ease-out": "var(--motion-ease-out, cubic-bezier(0.16, 1, 0.3, 1))", + "ease-in": "var(--motion-ease-in, cubic-bezier(0.4, 0, 1, 1))", + "ease-move": "var(--motion-ease-move, cubic-bezier(0.4, 0, 0.2, 1))" +}; +// END GENERATED DS-8: tailwind + const config: Config = { darkMode: 'class', content: ['./src/renderer/**/*.{ts,tsx,html}'], @@ -57,35 +192,13 @@ const config: Config = { fontFamily: { mono: ['var(--app-font-code, var(--app-font-code-default))'], }, - // DESIGN.md §3 numeric 字号白名单的 Tailwind 权威来源之一。规范正本 - // 与三处权威来源代码由守卫互验;lib/utils.ts 是单独校验的消费端去重列表。 - fontSize: { - xs: ['var(--text-xs)', { lineHeight: 'var(--text-xs-line-height)' }], - sm: ['var(--text-sm)', { lineHeight: 'var(--text-sm-line-height)' }], - base: ['var(--text-base)', { lineHeight: 'var(--text-base-line-height)' }], - lg: ['var(--text-lg)', { lineHeight: 'var(--text-lg-line-height)' }], - xl: ['var(--text-xl)', { lineHeight: 'var(--text-xl-line-height)' }], - '2xl': ['var(--text-2xl)', { lineHeight: 'var(--text-2xl-line-height)' }], - '3xl': ['var(--text-3xl)', { lineHeight: 'var(--text-3xl-line-height)' }], - '4xl': ['var(--text-4xl)', { lineHeight: 'var(--text-4xl-line-height)' }], - '5xl': ['var(--text-5xl)', { lineHeight: 'var(--text-5xl-line-height)' }], - 10: 'var(--text-10)', - 11: 'var(--text-11)', - 12: 'var(--text-12)', - 13: 'var(--text-13)', - 14: 'var(--text-14)', - 15: 'var(--text-15)', - 16: 'var(--text-16)', - 18: 'var(--text-18)', - 20: 'var(--text-20)', - 24: 'var(--text-24)', - 28: 'var(--text-28)', - }, - borderRadius: { - lg: 'var(--radius)', - md: 'calc(var(--radius) - 2px)', - sm: 'calc(var(--radius) - 4px)', - }, + // Generated static values; font scaling and user radius remain runtime adapters. + fontSize: TAILWIND_FONT_SIZE, + spacing: TAILWIND_SPACING, + borderRadius: TAILWIND_RADIUS, + fontWeight: TAILWIND_FONT_WEIGHT, + transitionDuration: { DEFAULT: MOTION_CSS.fast }, + transitionTimingFunction: { DEFAULT: MOTION_CSS['ease-move'] }, lineClamp: { 10: '10', }, @@ -142,29 +255,29 @@ const config: Config = { animation: { // 功能性 loading spinner 使用 DESIGN.md §14.4 明确登记的语义循环 token; // 不复用 Tailwind animate-spin 的硬编码 1s,也不耦合 enter/exit 交互档位。 - spinner: 'spin var(--motion-spinner-cycle, 1000ms) linear infinite', + spinner: `spin ${MOTION_CSS['spinner-cycle']} linear infinite`, // float-out 需要 forwards:Radix 等 animationend 才卸载,fill 不驻留 // 会在动画结束到卸载之间闪回原状。 'float-in': - 'float-in var(--motion-fast, 150ms) var(--motion-ease-out, cubic-bezier(0.16, 1, 0.3, 1))', + `float-in ${MOTION_CSS['fast']} ${MOTION_CSS['ease-out']}`, 'float-out': - 'float-out var(--motion-instant, 80ms) var(--motion-ease-in, cubic-bezier(0.4, 0, 1, 1)) forwards', + `float-out ${MOTION_CSS['instant']} ${MOTION_CSS['ease-in']} forwards`, 'fade-in': - 'fade-in var(--motion-fast, 150ms) var(--motion-ease-out, cubic-bezier(0.16, 1, 0.3, 1))', + `fade-in ${MOTION_CSS['fast']} ${MOTION_CSS['ease-out']}`, // 时长接 motion token(值与原 250/150ms 一致,曲线不变):reduced-motion // 经 token 归零即可覆盖 data-[state=*]: 变体形态的用法。 'confirm-overlay-in': - 'confirm-overlay-in var(--motion-enter, 250ms) cubic-bezier(0, 0, 0.2, 1)', + `confirm-overlay-in ${MOTION_CSS['enter']} cubic-bezier(0, 0, 0.2, 1)`, 'confirm-overlay-out': - 'confirm-overlay-out var(--motion-exit, 150ms) cubic-bezier(0.4, 0, 1, 1)', + `confirm-overlay-out ${MOTION_CSS['exit']} cubic-bezier(0.4, 0, 1, 1)`, 'confirm-content-in': - 'confirm-content-in var(--motion-enter, 250ms) cubic-bezier(0, 0, 0.2, 1)', + `confirm-content-in ${MOTION_CSS['enter']} cubic-bezier(0, 0, 0.2, 1)`, 'confirm-content-out': - 'confirm-content-out var(--motion-exit, 150ms) cubic-bezier(0.4, 0, 1, 1)', + `confirm-content-out ${MOTION_CSS['exit']} cubic-bezier(0.4, 0, 1, 1)`, 'confirm-content-layout-in': - 'confirm-content-layout-in var(--motion-enter, 250ms) cubic-bezier(0, 0, 0.2, 1)', + `confirm-content-layout-in ${MOTION_CSS['enter']} cubic-bezier(0, 0, 0.2, 1)`, 'confirm-content-layout-out': - 'confirm-content-layout-out var(--motion-exit, 150ms) cubic-bezier(0.4, 0, 1, 1)', + `confirm-content-layout-out ${MOTION_CSS['exit']} cubic-bezier(0.4, 0, 1, 1)`, }, }, }, diff --git a/docs/design-rules/DESIGN.md b/docs/design-rules/DESIGN.md index d06afb61790..8159de8ae12 100644 --- a/docs/design-rules/DESIGN.md +++ b/docs/design-rules/DESIGN.md @@ -113,6 +113,8 @@ _Dark Mode text uses softened neutrals to reduce eye strain: **Soft Gray** (`#d4 - **Display / Body / UI**: `Inter`, with fallbacks: `system-ui, -apple-system, "Segoe UI", sans-serif` - **Monospace**: `JetBrains Mono`, with fallbacks: `ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace` +> Desktop default clarification: JetBrains Mono below is an optional preset and a historical typography sample. The shipped default uses the system monospace stack from `reference/foundations.json` → `app-font-code-default`, with the existing CJK fallbacks. DS-8 preserves that stack and user font selection; see [the recorded decision](./design-decision-log.md#2026-09-11-ds-8-默认代码字体依据迁移). + _Note: The entire interface uses a single sans font — Inter — for both display headlines and body text. Inter is chosen for (a) its neutral, geometric character that stays out of the way, (b) its excellent legibility at small sizes, and (c) its wide availability in both web and design tooling. A single font keeps the hierarchy clean — separation comes from size and weight, not typeface contrast._ ### Hierarchy @@ -158,10 +160,12 @@ _Positioning note: the Display / Section Heading / Sub-heading rows are conceptu ### 桌面 UI 字号白名单(2026-08,issue #1505) + - **UI 段:{10, 11, 12, 13, 14, 15, 16}px;标题 / 内容段:{18, 20, 24, 28}px。** 下限 10px —— 9px 及以下禁止(再小就不是文字是纹理)。 + - **下限约束的是「开发者写死的档位」,不约束运行期缩放结果。** 用户可把 UI 字号设到 `appearanceSettings.uiSize` 允许的最小值 12(默认 14),`useFontSettings` 按 `uiSize / 14` 缩放并 `Math.round`,此时 `--text-10` 与 `--text-11` 都会算成 9px(两档在该设置下失去区分)。这是用户主动选择的整体缩小,不是违反下限;守卫也只检查源码里写的档位,不检查运行期计算值。**若要保住 10px 视觉下限,应在字号设置侧(提高 `uiSize` 下限或改缩放曲线)解决,而不是往白名单里加更小的档位。** - **写法**:一律用 `tailwind.config.ts` 的 `text-` token 类(映射 `--text-` 变量;doc 紧凑模式与后续字号缩放能力都挂在这层变量上,任意值类会静默漏掉这些机制)。语义类 `text-xs / text-sm / text-base / text-lg` 只收编存量(等值 12 / 14 / 16 / 18);源码侧禁止使用 `text-xl` 及以上语义档位(由守卫拦截),配置侧 `theme.extend.fontSize` 的 `xl..5xl` 遗留项不在本轮删除范围,避免删除后静默回退到 Tailwind 内置固定值、失去用户字号缩放;其清理另行处理。**禁止新增任意值 `text-[Npx]`(含一切小数)与白名单外档位**;需要新档先改本表与权威来源,再进组件。 -- **镜像约定(已成立,由 #1553 完成)**:四个权威来源必须同步:本表(规范正本)与以下三处代码——`apps/desktop/tailwind.config.ts` 的 `fontSize`(类名可用性与变量映射;漏掉则 `text-` 类根本不存在)、`apps/desktop/src/renderer/styles/globals.css` 的静态 `--text-` 默认值(漏掉则变量未定义并回退到继承值)、`apps/desktop/src/renderer/hooks/useFontSettings.ts` 的 `UI_TEXT_TOKEN_SIZES` 运行时生效值(含用户字号缩放;漏掉则该档位不随用户设置缩放,反向漏则会写出已删档位的陈旧变量)。另有一个消费端需保持一致:`apps/desktop/src/renderer/lib/utils.ts` 的 tailwind-merge `classGroups['font-size']` 负责类名去重,不产生字号值;漏登记会让 `cn()` 合并两个字号类失效,两个类会同时留在 DOM 上。该消费端单独做一致性校验,不计入四个权威来源镜像。同一 hook 的 `SCALED_TAILWIND_TOKENS` 负责语义类运行时缩放,需与 Tailwind 语义类映射保持同步,但不改变本白名单的具体档位。PR4 的守卫按四个权威来源做镜像断言,并单独校验消费端一致性。 +- **单源约定(DS-8)**:DTCG 为已接管族的唯一编辑源;同一 Terrazzo 流程生成本节摘要、CSS 默认值及 Tailwind/字号 hook/class merge 的映射。`useFontSettings` 保留原缩放计算,shared 默认字号只引用无 DOM 的生成子集。生成新鲜度与独立白名单、实际缩放测试共同保护此链,不再手动同步多份数值。 - 品牌画布域(登录 / Splash 家族等设计 px 坐标系表面)不映射本白名单:字面量只允许进画布常量文件(`loginDesignTokens.ts` 的地位,对齐手机端 `loginSkinLayout.ts`)**或下表登记的自包含品牌页生成器**(`oauthResultPage.ts` 整页由 main 侧生成,其内嵌 raw CSS 即该页的常量载体),组件消费端照常受守卫扫描。 ### 排版豁免登记表(2026-08,issue #1505) @@ -546,7 +550,7 @@ Cindy Desktop manages color with a **VSCode-style ColorRegistry + theme-override Source: `apps/desktop/src/renderer/themes/` - `color-registry.ts` — the `ColorRegistry` singleton and the `registerColor(id, defaults, description)` API -- `colors.ts` — registers every token, organized "semantic slots first, aliases and singletons after" (counts drift constantly — **`colors.ts` itself is the only authoritative inventory**; this document does not track totals) +- `colors.ts` — registers every token, organized "semantic slots first, aliases and singletons after" (counts drift constantly — **the registration API in `colors.ts` is the live inventory; generated defaults are edited in `packages/design-tokens/src`**; this document does not track totals) - `theme-service.ts` — `applyTheme(theme)` serializes all tokens into `:root{}` and injects `