@sussudio/platform
Version:
Internal APIs for VS Code's service injection the base services.
68 lines (67 loc) • 2.49 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 { clearNode, createCSSRule, createStyleSheet } from '@sussudio/base/browser/dom.mjs';
import { RunOnceScheduler } from '@sussudio/base/common/async.mjs';
export var ZIndex;
(function (ZIndex) {
ZIndex[(ZIndex['Base'] = 0)] = 'Base';
ZIndex[(ZIndex['Sash'] = 35)] = 'Sash';
ZIndex[(ZIndex['SuggestWidget'] = 40)] = 'SuggestWidget';
ZIndex[(ZIndex['Hover'] = 50)] = 'Hover';
ZIndex[(ZIndex['DragImage'] = 1000)] = 'DragImage';
ZIndex[(ZIndex['MenubarMenuItemsHolder'] = 2000)] = 'MenubarMenuItemsHolder';
ZIndex[(ZIndex['ContextView'] = 2500)] = 'ContextView';
ZIndex[(ZIndex['ModalDialog'] = 2600)] = 'ModalDialog';
ZIndex[(ZIndex['PaneDropOverlay'] = 10000)] = 'PaneDropOverlay';
})(ZIndex || (ZIndex = {}));
const ZIndexValues = Object.keys(ZIndex)
.filter((key) => !isNaN(Number(key)))
.map((key) => Number(key))
.sort((a, b) => b - a);
function findBase(z) {
for (const zi of ZIndexValues) {
if (z >= zi) {
return zi;
}
}
return -1;
}
class ZIndexRegistry {
styleSheet;
zIndexMap;
scheduler;
constructor() {
this.styleSheet = createStyleSheet();
this.zIndexMap = new Map();
this.scheduler = new RunOnceScheduler(() => this.updateStyleElement(), 200);
}
registerZIndex(relativeLayer, z, name) {
if (this.zIndexMap.get(name)) {
throw new Error(`z-index with name ${name} has already been registered.`);
}
const proposedZValue = relativeLayer + z;
if (findBase(proposedZValue) !== relativeLayer) {
throw new Error(`Relative layer: ${relativeLayer} + z-index: ${z} exceeds next layer ${proposedZValue}.`);
}
this.zIndexMap.set(name, proposedZValue);
this.scheduler.schedule();
return this.getVarName(name);
}
getVarName(name) {
return `--z-index-${name}`;
}
updateStyleElement() {
clearNode(this.styleSheet);
let ruleBuilder = '';
this.zIndexMap.forEach((zIndex, name) => {
ruleBuilder += `${this.getVarName(name)}: ${zIndex};\n`;
});
createCSSRule(':root', ruleBuilder, this.styleSheet);
}
}
const zIndexRegistry = new ZIndexRegistry();
export function registerZIndex(relativeLayer, z, name) {
return zIndexRegistry.registerZIndex(relativeLayer, z, name);
}