@sussudio/platform
Version:
Internal APIs for VS Code's service injection the base services.
70 lines (69 loc) • 2.75 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 { asCSSPropertyValue, asCSSUrl } from '@sussudio/base/browser/dom.mjs';
import { Emitter } from '@sussudio/base/common/event.mjs';
import { getIconRegistry } from '../common/iconRegistry.mjs';
import { ThemeIcon } from '../common/themeService.mjs';
export function getIconsStyleSheet(themeService) {
const onDidChangeEmmiter = new Emitter();
const iconRegistry = getIconRegistry();
iconRegistry.onDidChange(() => onDidChangeEmmiter.fire());
themeService?.onDidProductIconThemeChange(() => onDidChangeEmmiter.fire());
return {
onDidChange: onDidChangeEmmiter.event,
getCSS() {
const productIconTheme = themeService ? themeService.getProductIconTheme() : new UnthemedProductIconTheme();
const usedFontIds = {};
const formatIconRule = (contribution) => {
const definition = productIconTheme.getIcon(contribution);
if (!definition) {
return undefined;
}
const fontContribution = definition.font;
if (fontContribution) {
usedFontIds[fontContribution.id] = fontContribution.definition;
return `.codicon-${contribution.id}:before { content: '${
definition.fontCharacter
}'; font-family: ${asCSSPropertyValue(fontContribution.id)}; }`;
}
// default font (codicon)
return `.codicon-${contribution.id}:before { content: '${definition.fontCharacter}'; }`;
};
const rules = [];
for (const contribution of iconRegistry.getIcons()) {
const rule = formatIconRule(contribution);
if (rule) {
rules.push(rule);
}
}
for (const id in usedFontIds) {
const definition = usedFontIds[id];
const fontWeight = definition.weight ? `font-weight: ${definition.weight};` : '';
const fontStyle = definition.style ? `font-style: ${definition.style};` : '';
const src = definition.src.map((l) => `${asCSSUrl(l.location)} format('${l.format}')`).join(', ');
rules.push(
`@font-face { src: ${src}; font-family: ${asCSSPropertyValue(
id,
)};${fontWeight}${fontStyle} font-display: block; }`,
);
}
return rules.join('\n');
},
};
}
export class UnthemedProductIconTheme {
getIcon(contribution) {
const iconRegistry = getIconRegistry();
let definition = contribution.defaults;
while (ThemeIcon.isThemeIcon(definition)) {
const c = iconRegistry.getIcon(definition.id);
if (!c) {
return undefined;
}
definition = c.defaults;
}
return definition;
}
}