ux-theming

作者: microsoft

VS Code 主题化、颜色令牌、小部件样式、焦点指示器以及高对比度主题支持。用于注册颜色、使用主题样式化小部件…

npx skills add https://github.com/microsoft/vscode --skill ux-theming

This skill covers color registration, CSS variable usage, widget style patterns, focus indicators, and high-contrast theme requirements.


1. Registering Colors

File: src/vs/platform/theme/common/colorUtils.ts

export const myWidgetBackground = registerColor('myWidget.background',
    { light: '#ffffff', dark: '#252526', hcDark: Color.black, hcLight: Color.white },
    nls.localize('myWidgetBackground', "Background color of My Widget."));

Rules:

  • Provide defaults for all four theme types: light, dark, hcDark, hcLight.
  • HC themes must use solid colors (avoid transparency) and set explicit borders via contrastBorder.
  • Use color transforms for derived colors: transparent(), darken(), lighten(), oneOf().
  • Reference existing colors when possible instead of hardcoding hex values.

2. Color Categories

FileColors
src/vs/platform/theme/common/colors/baseColors.tsforeground, focusBorder, contrastBorder, text links
src/vs/platform/theme/common/colors/editorColors.tsEditor widgets, find match, errors/warnings
src/vs/platform/theme/common/colors/inputColors.tsInput, toggle, validation
src/vs/platform/theme/common/colors/listColors.tsList/tree selection, focus, hover, drop
src/vs/platform/theme/common/colors/miscColors.tsBadge, scrollbar, progress bar, sash
src/vs/workbench/common/theme.tsTabs, sidebar, status bar, panels, editor groups, banner

3. Using Colors in CSS

Colors are injected as CSS custom properties on .monaco-workbench:

Color ID: editor.background
CSS variable: --vscode-editor-background
Usage: var(--vscode-editor-background)

Conversion functions in colorUtils.ts:

  • asCssVariable(colorId) → 'var(--vscode-editor-background)'
  • asCssVariableName(colorId) → '--vscode-editor-background'

In CSS files, reference directly:

.my-widget {
    background-color: var(--vscode-editor-background);
    color: var(--vscode-foreground);
    border: 1px solid var(--vscode-contrastBorder);
}

4. Widget Styles Pattern

File: src/vs/platform/theme/browser/defaultStyles.ts

Every widget type has a default style object and an override factory:

// Use defaults:
const button = new Button(container, defaultButtonStyles);

// Override specific colors:
const button = new Button(container, getButtonStyles({
    buttonBackground: myCustomBackgroundColor
}));

Available defaults: defaultButtonStyles, defaultInputBoxStyles, defaultCheckboxStyles, defaultToggleStyles, defaultDialogStyles, defaultListStyles, defaultSelectBoxStyles, defaultMenuStyles, defaultProgressBarStyles, defaultCountBadgeStyles, defaultBreadcrumbsWidgetStyles, defaultKeybindingLabelStyles, defaultFindWidgetStyles.

5. Focus Indicators

Defined in src/vs/workbench/browser/media/style.css:

.my-widget:focus {
    outline-width: 1px;
    outline-style: solid;
    outline-offset: -1px;
    outline-color: var(--vscode-focusBorder);
}

Rules:

  • Use var(--vscode-focusBorder) — never hardcode a focus color.
  • Default outline-offset: -1px (inset). Exception: checkboxes use 2px.
  • Active elements suppress focus ring: .my-widget:active { outline: 0 !important; }
  • Use .synthetic-focus class for programmatic focus indication.
  • Toggle buttons use border: 1px dashed var(--vscode-focusBorder) instead of outline.

Focus Trapping

Modal dialogs must trap focus within the dialog until dismissed. Use dom.trackFocus() and handle Tab/Shift+Tab cycling.

6. High Contrast Theme Rules

  • Always provide hcDark and hcLight defaults when registering colors.
  • HC backgrounds: Color.black (hcDark), Color.white (hcLight).
  • HC borders: reference contrastBorder — it is null in normal themes, visible in HC.
  • HC focus: use activeContrastBorder (derived from focusBorder).
  • In CSS, use .hc-black / .hc-light class selectors for HC-specific overrides:
    .hc-black .my-widget { border: 1px solid var(--vscode-contrastBorder); }
    
  • In TypeScript, check isHighContrast(theme.type) for runtime behavior changes.
  • Box shadows must be removed or replaced in HC mode (shadows are invisible/distracting with high contrast borders):
    .my-widget {
        box-shadow: 0 1px 3px var(--vscode-widget-shadow);
    }
    .vscode-high-contrast .my-widget {
        box-shadow: none;
        border: 1px solid var(--vscode-contrastBorder);
    }
    

7. No Hardcoded Visual Values

Reviewers will always flag hardcoded colors, shadows, sizes that should use theme tokens or CSS variables.

Hardcoded (flagged)Correct
rgba(0, 0, 0, 0.12)var(--vscode-widget-shadow) or theme-aware variable
#252526var(--vscode-editor-background)
color: whitevar(--vscode-button-foreground)
border: 1px solid #cccvar(--vscode-editorWidget-border)
border: 1px solid … (width)var(--vscode-strokeThickness) for the 1px width
border-radius: 6pxvar(--vscode-cornerRadius-medium) (radius ramp)
padding: 8px 12px (off-scale)spacing ramp (--vscode-spacing-size*)
font-size: 14px (arbitrary)size ramp (--vscode-fontSize-*)
font-weight: 500--vscode-fontWeight-semiBold (no 500)
codicon font-size: 14px--vscode-codiconFontSize (16) / -compact (12)

Rule: If a value relates to color, shadow, or border — it must come from a CSS variable or registered color token. The only exception is 0 (zero) values and purely structural measurements like 100%.

Size, spacing, radius, font and stroke values have their own design-system size tokens (and decision logic — snap maps, the pill→circle rule, and the compact-glyph convention). Those live in the ux-css-layout skill (§10 Design-System Size Tokens) and the auto-injected .github/instructions/design-tokens.instructions.md. Reach for those when a flag is about how big / how round / how bold something is rather than what color.


Key Files

AreaFile
Color registrationsrc/vs/platform/theme/common/colorUtils.ts
Color registry (barrel)src/vs/platform/theme/common/colorRegistry.ts
Base colorssrc/vs/platform/theme/common/colors/baseColors.ts
Workbench colorssrc/vs/workbench/common/theme.ts
Default widget stylessrc/vs/platform/theme/browser/defaultStyles.ts
Global workbench stylessrc/vs/workbench/browser/media/style.css

来自 microsoft 的更多技能

oss-growth
microsoft
OSS增长黑客角色
agent-framework-azure-ai-py
microsoft
使用Microsoft Agent Framework Python SDK(agent-framework-azure-ai)构建Azure AI Foundry代理。在创建使用AzureAIAgentsProvider的持久化代理、使用托管工具(代码解释器、文件搜索、网络搜索)、集成MCP服务器、管理对话线程或实现流式响应时使用。涵盖函数工具、结构化输出和多工具代理。
development
airunway-aks-setup
microsoft
在AKS上设置AI Runway——从裸集群到运行模型。涵盖集群验证、控制器安装、GPU评估、提供商设置和首次部署。适用场景:“设置AI Runway”、“接入AKS集群”、“安装AI Runway”、“airunway设置”、“将模型部署到AKS”、“在AKS上进行GPU推理”、“在AKS上配置KAITO”、“在AKS上运行LLM”、“在AKS上使用vLLM”、“在AKS上设置模型服务”、“AI Runway控制器”。
devops
appinsights-instrumentation
microsoft
使用Azure Application Insights对Web应用进行插桩的指南。提供遥测模式、SDK设置和配置参考。适用场景:如何对应用进行插桩、App Insights SDK、遥测模式、什么是App Insights、Application Insights指南、插桩示例、APM最佳实践。
devops
applicationinsights-web-ts
microsoft
使用Application Insights JavaScript SDK(@microsoft/applicationinsights-web)为浏览器/Web应用添加检测。用于真实用户监控(RUM)——页面视图、点击、AJAX/fetch依赖项、异常、自定义事件,以及与后端OpenTelemetry追踪关联的浏览器端GenAI代理追踪。涵盖SDK加载器脚本和npm设置、框架扩展(React、React Native、Angular)、点击分析、遥测初始化器,以及从浏览器发出的代理/工具/模型跨度所遵循的OTel GenAI语义约定。
devops
azure-ai-anomalydetector-java
microsoft
使用适用于 Java 的 Azure AI 异常检测器 SDK 构建异常检测应用程序。在实现单变量/多变量异常检测、时间序列分析或 AI 驱动的监控时使用。
development
azure-ai-language-conversations-py
microsoft
使用azure-ai-language-conversations Python SDK实现对话语言理解(CLU)。当使用ConversationAnalysisClient分析对话意图和实体、构建NLP功能或将语言理解集成到应用程序中时使用。
development
azure-ai-ml-py
microsoft
Azure Machine Learning SDK v2 for Python。用于机器学习工作区、作业、模型、数据集、计算资源和管道。 触发词:“azure-ai-ml”、“MLClient”、“工作区”、“模型注册表”、“训练作业”、“数据集”。
development