sussudio
Version:
An unofficial VS Code Internal API
111 lines (110 loc) • 6.27 kB
JavaScript
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { Color } from "../../../base/common/color.mjs";
import { activeContrastBorder, editorWidgetBorder, focusBorder, inputActiveOptionBackground, inputActiveOptionBorder, inputActiveOptionForeground, inputBackground, inputBorder, inputForeground, inputValidationErrorBackground, inputValidationErrorBorder, inputValidationErrorForeground, inputValidationInfoBackground, inputValidationInfoBorder, inputValidationInfoForeground, inputValidationWarningBackground, inputValidationWarningBorder, inputValidationWarningForeground, listActiveSelectionBackground, listActiveSelectionForeground, listActiveSelectionIconForeground, listDropBackground, listFocusBackground, listFocusForeground, listFocusOutline, listHoverBackground, listHoverForeground, listInactiveFocusBackground, listInactiveFocusOutline, listInactiveSelectionBackground, listInactiveSelectionForeground, listInactiveSelectionIconForeground, menuBackground, menuBorder, menuForeground, menuSelectionBackground, menuSelectionBorder, menuSelectionForeground, menuSeparatorBackground, pickerGroupForeground, quickInputListFocusBackground, quickInputListFocusForeground, quickInputListFocusIconForeground, resolveColorValue, scrollbarShadow, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground, selectBackground, selectBorder, selectForeground, selectListBackground, tableColumnsBorder, tableOddRowsBackgroundColor, treeIndentGuidesStroke, widgetShadow, listFocusAndSelectionOutline } from "./colorRegistry.mjs";
import { isHighContrast } from "./theme.mjs";
export function computeStyles(theme, styleMap) {
const styles = Object.create(null);
for (const key in styleMap) {
const value = styleMap[key];
if (value) {
styles[key] = resolveColorValue(value, theme);
}
}
return styles;
}
export function attachStyler(themeService, styleMap, widgetOrCallback) {
function applyStyles() {
const styles = computeStyles(themeService.getColorTheme(), styleMap);
if (typeof widgetOrCallback === 'function') {
widgetOrCallback(styles);
}
else {
widgetOrCallback.style(styles);
}
}
applyStyles();
return themeService.onDidColorThemeChange(applyStyles);
}
export function attachSelectBoxStyler(widget, themeService, style) {
return attachStyler(themeService, {
selectBackground: style?.selectBackground || selectBackground,
selectListBackground: style?.selectListBackground || selectListBackground,
selectForeground: style?.selectForeground || selectForeground,
decoratorRightForeground: style?.pickerGroupForeground || pickerGroupForeground,
selectBorder: style?.selectBorder || selectBorder,
focusBorder: style?.focusBorder || focusBorder,
listFocusBackground: style?.listFocusBackground || quickInputListFocusBackground,
listInactiveSelectionIconForeground: style?.listInactiveSelectionIconForeground || quickInputListFocusIconForeground,
listFocusForeground: style?.listFocusForeground || quickInputListFocusForeground,
listFocusOutline: style?.listFocusOutline || ((theme) => isHighContrast(theme.type) ? activeContrastBorder : Color.transparent),
listHoverBackground: style?.listHoverBackground || listHoverBackground,
listHoverForeground: style?.listHoverForeground || listHoverForeground,
listHoverOutline: style?.listFocusOutline || activeContrastBorder,
selectListBorder: style?.selectListBorder || editorWidgetBorder
}, widget);
}
export function attachListStyler(widget, themeService, overrides) {
return attachStyler(themeService, { ...defaultListStyles, ...(overrides || {}) }, widget);
}
export const defaultListStyles = {
listFocusBackground,
listFocusForeground,
listFocusOutline,
listActiveSelectionBackground,
listActiveSelectionForeground,
listActiveSelectionIconForeground,
listFocusAndSelectionOutline,
listFocusAndSelectionBackground: listActiveSelectionBackground,
listFocusAndSelectionForeground: listActiveSelectionForeground,
listInactiveSelectionBackground,
listInactiveSelectionIconForeground,
listInactiveSelectionForeground,
listInactiveFocusBackground,
listInactiveFocusOutline,
listHoverBackground,
listHoverForeground,
listDropBackground,
listSelectionOutline: activeContrastBorder,
listHoverOutline: activeContrastBorder,
treeIndentGuidesStroke,
tableColumnsBorder,
tableOddRowsBackgroundColor,
inputActiveOptionBorder,
inputActiveOptionForeground,
inputActiveOptionBackground,
inputBackground,
inputForeground,
inputBorder,
inputValidationInfoBackground,
inputValidationInfoForeground,
inputValidationInfoBorder,
inputValidationWarningBackground,
inputValidationWarningForeground,
inputValidationWarningBorder,
inputValidationErrorBackground,
inputValidationErrorForeground,
inputValidationErrorBorder,
};
export function attachStylerCallback(themeService, colors, callback) {
return attachStyler(themeService, colors, callback);
}
export const defaultMenuStyles = {
shadowColor: widgetShadow,
borderColor: menuBorder,
foregroundColor: menuForeground,
backgroundColor: menuBackground,
selectionForegroundColor: menuSelectionForeground,
selectionBackgroundColor: menuSelectionBackground,
selectionBorderColor: menuSelectionBorder,
separatorColor: menuSeparatorBackground,
scrollbarShadow: scrollbarShadow,
scrollbarSliderBackground: scrollbarSliderBackground,
scrollbarSliderHoverBackground: scrollbarSliderHoverBackground,
scrollbarSliderActiveBackground: scrollbarSliderActiveBackground
};
export function attachMenuStyler(widget, themeService, style) {
return attachStyler(themeService, { ...defaultMenuStyles, ...style }, widget);
}