UNPKG

sussudio

Version:

An unofficial VS Code Internal API

65 lines (64 loc) 2.69 kB
/*--------------------------------------------------------------------------------------------- * 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 "../../../base/browser/dom.mjs"; import { RunOnceScheduler } from "../../../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); }