monaco-editor-core
Version:
A browser based code editor
73 lines • 4.2 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 * as css from '../../../base/browser/cssValue.js';
import { Emitter } from '../../../base/common/event.js';
import { DisposableStore } from '../../../base/common/lifecycle.js';
import { ThemeIcon } from '../../../base/common/themables.js';
import { getIconRegistry } from '../common/iconRegistry.js';
export function getIconsStyleSheet(themeService) {
const disposable = new DisposableStore();
const onDidChangeEmmiter = disposable.add(new Emitter());
const iconRegistry = getIconRegistry();
disposable.add(iconRegistry.onDidChange(() => onDidChangeEmmiter.fire()));
if (themeService) {
disposable.add(themeService.onDidProductIconThemeChange(() => onDidChangeEmmiter.fire()));
}
return {
dispose: () => disposable.dispose(),
onDidChange: onDidChangeEmmiter.event,
getCSS() {
const productIconTheme = themeService ? themeService.getProductIconTheme() : new UnthemedProductIconTheme();
const usedFontIds = {};
const rules = new css.Builder();
const rootAttribs = new css.Builder();
for (const contribution of iconRegistry.getIcons()) {
const definition = productIconTheme.getIcon(contribution);
if (!definition) {
continue;
}
const fontContribution = definition.font;
const fontFamilyVar = css.inline `--vscode-icon-${css.className(contribution.id)}-font-family`;
const contentVar = css.inline `--vscode-icon-${css.className(contribution.id)}-content`;
if (fontContribution) {
usedFontIds[fontContribution.id] = fontContribution.definition;
rootAttribs.push(css.inline `${fontFamilyVar}: ${css.stringValue(fontContribution.id)};`, css.inline `${contentVar}: ${css.stringValue(definition.fontCharacter)};`);
rules.push(css.inline `.codicon-${css.className(contribution.id)}:before { content: ${css.stringValue(definition.fontCharacter)}; font-family: ${css.stringValue(fontContribution.id)}; }`);
}
else {
rootAttribs.push(css.inline `${contentVar}: ${css.stringValue(definition.fontCharacter)}; ${fontFamilyVar}: 'codicon';`);
rules.push(css.inline `.codicon-${css.className(contribution.id)}:before { content: ${css.stringValue(definition.fontCharacter)}; }`);
}
}
for (const id in usedFontIds) {
const definition = usedFontIds[id];
const fontWeight = definition.weight ? css.inline `font-weight: ${css.identValue(definition.weight)};` : css.inline ``;
const fontStyle = definition.style ? css.inline `font-style: ${css.identValue(definition.style)};` : css.inline ``;
const src = new css.Builder();
for (const l of definition.src) {
src.push(css.inline `${css.asCSSUrl(l.location)} format(${css.stringValue(l.format)})`);
}
rules.push(css.inline `@font-face { src: ${src.join(', ')}; font-family: ${css.stringValue(id)};${fontWeight}${fontStyle} font-display: block; }`);
}
rules.push(css.inline `:root { ${rootAttribs.join(' ')} }`);
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;
}
}
//# sourceMappingURL=iconsStyleSheet.js.map