custom-electron-titlebar 4.2.8 → 4.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/README.md +32 -12
  2. package/index.d.mts +684 -0
  3. package/index.d.ts +684 -3
  4. package/index.js +5207 -175
  5. package/index.js.map +1 -0
  6. package/index.mjs +5219 -0
  7. package/index.mjs.map +1 -0
  8. package/main/index.d.mts +21 -0
  9. package/main/index.d.ts +21 -3
  10. package/main/index.js +793 -175
  11. package/main/index.js.map +1 -0
  12. package/main/index.mjs +785 -0
  13. package/main/index.mjs.map +1 -0
  14. package/package.json +40 -32
  15. package/base/browser/browser.d.ts +0 -26
  16. package/base/browser/browser.js +0 -317
  17. package/base/browser/event.d.ts +0 -12
  18. package/base/browser/event.js +0 -215
  19. package/base/browser/keyboardEvent.d.ts +0 -38
  20. package/base/browser/keyboardEvent.js +0 -462
  21. package/base/browser/mouseEvent.d.ts +0 -61
  22. package/base/browser/mouseEvent.js +0 -327
  23. package/base/browser/touch.d.ts +0 -39
  24. package/base/browser/touch.js +0 -454
  25. package/base/common/arrays.d.ts +0 -10
  26. package/base/common/arrays.js +0 -210
  27. package/base/common/async.d.ts +0 -35
  28. package/base/common/async.js +0 -280
  29. package/base/common/charCode.d.ts +0 -405
  30. package/base/common/charCode.js +0 -9
  31. package/base/common/color.d.ts +0 -159
  32. package/base/common/color.js +0 -708
  33. package/base/common/decorators.d.ts +0 -6
  34. package/base/common/decorators.js +0 -300
  35. package/base/common/dom.d.ts +0 -221
  36. package/base/common/dom.js +0 -1476
  37. package/base/common/event.d.ts +0 -213
  38. package/base/common/event.js +0 -804
  39. package/base/common/iterator.d.ts +0 -69
  40. package/base/common/iterator.js +0 -380
  41. package/base/common/keyCodes.d.ts +0 -478
  42. package/base/common/keyCodes.js +0 -477
  43. package/base/common/lifecycle.d.ts +0 -17
  44. package/base/common/lifecycle.js +0 -258
  45. package/base/common/linkedList.d.ts +0 -17
  46. package/base/common/linkedList.js +0 -319
  47. package/base/common/platform.d.ts +0 -36
  48. package/base/common/platform.js +0 -314
  49. package/base/common/strings.d.ts +0 -23
  50. package/base/common/strings.js +0 -273
  51. package/consts.d.ts +0 -58
  52. package/consts.js +0 -317
  53. package/main/attach-titlebar-to-window.d.ts +0 -3
  54. package/main/attach-titlebar-to-window.js +0 -210
  55. package/main/setup-titlebar.d.ts +0 -2
  56. package/main/setup-titlebar.js +0 -255
  57. package/menubar/index.d.ts +0 -86
  58. package/menubar/index.js +0 -1119
  59. package/menubar/menu/index.d.ts +0 -46
  60. package/menubar/menu/index.js +0 -565
  61. package/menubar/menu/item.d.ts +0 -67
  62. package/menubar/menu/item.js +0 -575
  63. package/menubar/menu/separator.d.ts +0 -11
  64. package/menubar/menu/separator.js +0 -213
  65. package/menubar/menu/submenu.d.ts +0 -32
  66. package/menubar/menu/submenu.js +0 -372
  67. package/menubar/menubar-options.d.ts +0 -47
  68. package/menubar/menubar-options.js +0 -9
  69. package/titlebar/index.d.ts +0 -105
  70. package/titlebar/index.js +0 -703
  71. package/titlebar/options.d.ts +0 -89
  72. package/titlebar/options.js +0 -9
  73. package/titlebar/themebar.d.ts +0 -20
  74. package/titlebar/themebar.js +0 -267
package/index.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/titlebar/index.ts","../src/base/common/color.ts","../src/base/common/lifecycle.ts","../src/base/common/iterator.ts","../src/base/common/linkedList.ts","../src/base/common/event.ts","../src/base/browser/browser.ts","../src/base/common/platform.ts","../src/base/common/keyCodes.ts","../src/base/browser/keyboardEvent.ts","../src/base/browser/mouseEvent.ts","../src/base/common/async.ts","../src/base/common/arrays.ts","../src/base/common/dom.ts","../src/menubar/index.ts","../src/consts.ts","../src/menubar/menu/item.ts","../src/base/common/strings.ts","../src/types/ipc-contract.ts","../src/menubar/menu/separator.ts","../src/menubar/menu/submenu.ts","../src/menubar/menu/index.ts","../src/base/browser/touch.ts","raw-loader:/home/runner/work/custom-electron-titlebar/custom-electron-titlebar/static/theme/base.css?raw","raw-loader:/home/runner/work/custom-electron-titlebar/custom-electron-titlebar/static/theme/mac.css?raw","raw-loader:/home/runner/work/custom-electron-titlebar/custom-electron-titlebar/static/theme/win.css?raw","../src/titlebar/themebar.ts","../src/titlebar/theme-config.ts"],"sourcesContent":["/* ---------------------------------------------------------------------------------------------\n * Copyright (c) AlexTorresDev. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\nimport { CustomTitlebar } from './titlebar'\nimport { Color } from 'base/common/color'\nimport type { TitleBarOptions, TitlebarThemeConfig } from './titlebar/options'\n\nexport const createTitlebar = (options: TitleBarOptions = {}) => new CustomTitlebar(options)\n\nexport const createTitlebarOnDOMContentLoaded = (options: TitleBarOptions = {}) => {\n\tif (document.readyState === 'loading') {\n\t\treturn new Promise<CustomTitlebar>((resolve) => {\n\t\t\twindow.addEventListener('DOMContentLoaded', () => resolve(new CustomTitlebar(options)), { once: true })\n\t\t})\n\t}\n\n\treturn Promise.resolve(new CustomTitlebar(options))\n}\n\nexport {\n\tCustomTitlebar,\n\tCustomTitlebar as Titlebar,\n\tColor as TitlebarColor\n}\n\nexport type {\n\tTitleBarOptions,\n\tTitlebarThemeConfig\n}\n","/* ---------------------------------------------------------------------------------------------\n * Copyright (c) AlexTorresDev. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\nimport { ipcRenderer, Menu } from 'electron'\nimport { Color } from 'base/common/color'\nimport {\n $,\n addClass,\n addDisposableListener,\n append,\n EventType,\n hide,\n prepend,\n removeClass,\n show\n} from 'base/common/dom'\nimport { IDisposable } from 'base/common/lifecycle'\nimport {\n isLinux,\n isFreeBSD,\n isMacintosh,\n isWindows,\n platform,\n PlatformToString\n} from 'base/common/platform'\nimport { MenuBar } from 'menubar'\nimport { TitleBarOptions, TitlebarThemeConfig } from './options'\nimport { ThemeBar } from './themebar'\nimport { normalizeThemeConfig } from './theme-config'\nimport {\n ACTIVE_FOREGROUND,\n ACTIVE_FOREGROUND_DARK,\n BOTTOM_TITLEBAR_HEIGHT,\n DEFAULT_ITEM_SELECTOR,\n getPx,\n INACTIVE_FOREGROUND,\n INACTIVE_FOREGROUND_DARK,\n loadWindowIcons,\n menuIcons,\n TOP_TITLEBAR_HEIGHT_MAC,\n TOP_TITLEBAR_HEIGHT_WIN\n} from 'consts'\nimport { IpcChannels } from 'types/ipc-contract'\n\nexport class CustomTitlebar extends ThemeBar {\n private titlebar: HTMLElement\n private dragRegion: HTMLElement\n private icon: HTMLElement\n private menuBarContainer: HTMLElement\n private title: HTMLElement\n private controlsContainer: HTMLElement\n private container: HTMLElement\n\n private menuBar?: MenuBar\n private titleResizeListener?: IDisposable\n private forcedForegroundColor?: Color\n\n private isInactive: boolean = false\n\n private controls: {\n minimize: HTMLElement\n maximize: HTMLElement\n close: HTMLElement\n }\n\n private resizer: {\n top: HTMLElement\n left: HTMLElement\n }\n\n private currentOptions: TitleBarOptions = {\n closeable: true,\n enableMnemonics: true,\n // hideWhenClickingClose: false,\n iconSize: 16,\n itemBackgroundColor: undefined,\n maximizable: true,\n menuPosition: 'left',\n menuTransparency: 0,\n minimizable: true,\n onlyShowMenuBar: false,\n removeMenuBar: false,\n shadow: false,\n titleHorizontalAlignment: 'center',\n tooltips: {\n close: 'Close',\n maximize: 'Maximize',\n minimize: 'Minimize',\n restoreDown: 'Restore Down'\n },\n unfocusEffect: true,\n minWidth: 400,\n minHeight: 270\n }\n\n private platformIcons: { [key: string]: string }\n\n private readonly onWindowMaximizeEvent = (_: unknown, isMaximized: boolean) =>\n this.onDidChangeMaximized(isMaximized)\n private readonly onWindowFullscreenEvent = (\n _: unknown,\n isFullScreen: boolean\n ) => this.onWindowFullScreen(isFullScreen)\n private readonly onWindowFocusEvent = (_: unknown, isFocused: boolean) =>\n this.onWindowFocus(isFocused)\n\n /**\n * Create a new TitleBar instance\n * @param options The options for the title bar\n */\n constructor(options: TitleBarOptions = {}) {\n super()\n\n this.currentOptions = { ...this.currentOptions, ...options }\n\n const jWindowIcons = (menuIcons as any)[\n PlatformToString(platform)?.toLocaleLowerCase()\n ]\n this.platformIcons = jWindowIcons\n\n this.titlebar = $('.cet-titlebar')\n this.dragRegion = $('.cet-drag-region')\n this.icon = $('.cet-icon')\n this.menuBarContainer = $('.cet-menubar')\n this.title = $('.cet-title')\n this.controlsContainer = $('.cet-window-controls')\n this.container = $('.cet-container')\n\n this.controls = {\n minimize: $('.cet-control-minimize'),\n maximize: $('.cet-control-maximize'),\n close: $('.cet-control-close')\n }\n\n this.resizer = {\n top: $('.cet-resizer.top'),\n left: $('.cet-resizer.left')\n }\n\n append(this.titlebar, this.dragRegion)\n append(this.titlebar, this.resizer.left)\n append(this.titlebar, this.resizer.top)\n\n this.loadIcons()\n this.setupBackgroundColor()\n this.createIcon()\n this.setupMenubar()\n this.setupTitle()\n this.setupWindowControls()\n this.setupContainer()\n this.setupTitleBar()\n\n this.loadEvents()\n this.applyThemeConfigFromSource()\n\n // this.registerTheme(ThemeBar.win)\n }\n\n private loadIcons() {\n const icons = this.currentOptions.icons\n\n if (icons) {\n const { platformIcons } = loadWindowIcons(icons)\n this.platformIcons = platformIcons\n }\n }\n\n /**\n * Setup the background color of the title bar\n * By default, it will use the meta theme-color or msapplication-TileColor and if it doesn't exist, it will use white\n */\n private setupBackgroundColor() {\n let color = this.currentOptions.backgroundColor\n\n if (!color) {\n const metaColor = document.querySelector(\n 'meta[name=\"theme-color\"], meta[name=\"msapplication-TileColor\"]'\n )\n const metaContent = metaColor?.getAttribute('content')\n if (metaContent) {\n color = Color.fromHex(metaContent)\n }\n\n if (!color) color = Color.WHITE\n\n this.currentOptions.backgroundColor = color\n }\n\n this.titlebar.style.backgroundColor = color.toString()\n }\n\n /**\n * Render the icon of the title bar, if is mac, it will not render\n * By default, it will use the first icon found in the head of the document\n */\n private createIcon() {\n // const onlyRendererMenuBar = this.currentOptions.onlyShowMenuBar\n\n if (isMacintosh) return\n\n let icon = this.currentOptions.icon\n\n if (!icon) {\n const linkIcon = document.querySelector(\n 'link[rel=\"icon\"], link[rel=\"shortcut icon\"]'\n )\n const href = linkIcon?.getAttribute('href')\n if (href) {\n icon = href\n this.currentOptions.icon = href\n }\n }\n\n if (icon) {\n const windowIcon = append(this.icon, $('img'))\n\n if (typeof icon === 'string') {\n windowIcon.setAttribute('src', icon)\n } else {\n windowIcon.setAttribute('src', icon.toDataURL())\n }\n\n this.setIconSize(this.currentOptions.iconSize!)\n append(this.titlebar, this.icon)\n }\n }\n\n private setIconSize(size: number) {\n if (!this.icon.firstElementChild) return\n\n if (size < 16) size = 16\n if (size > 24) size = 24\n\n this.icon.firstElementChild.setAttribute('style', `height: ${size}px`)\n }\n\n private setupMenubar() {\n ipcRenderer\n .invoke(IpcChannels.REQUEST_APPLICATION_MENU)\n ?.then((menu?: Menu) => this.updateMenu(menu))\n\n const menuPosition = this.currentOptions.menuPosition\n const removeMenuBar = this.currentOptions.removeMenuBar\n\n if (menuPosition) {\n this.updateMenuPosition(menuPosition)\n }\n\n if (removeMenuBar) {\n if (this.menuBarContainer.parentElement) {\n this.menuBarContainer.parentElement.removeChild(this.menuBarContainer)\n }\n return\n }\n\n append(this.titlebar, this.menuBarContainer)\n\n ipcRenderer.send(\n IpcChannels.SET_MINIMUM_SIZE,\n this.currentOptions.minWidth,\n this.currentOptions.minHeight\n )\n }\n\n private setupTitle() {\n const onlyRendererMenuBar = this.currentOptions.onlyShowMenuBar\n\n if (onlyRendererMenuBar) return\n\n this.updateTitle(document.title)\n this.updateTitleAlignment(this.currentOptions.titleHorizontalAlignment!)\n append(this.titlebar, this.title)\n }\n\n private createControlButton(\n element: HTMLElement,\n icon: string,\n title: string,\n active: boolean = true\n ) {\n addClass(element, 'cet-control-icon')\n element.innerHTML = icon\n element.title = title\n\n if (!active) {\n addClass(element, 'inactive')\n }\n\n append(this.controlsContainer, element)\n }\n\n private setupWindowControls() {\n const onlyRendererMenuBar = this.currentOptions.onlyShowMenuBar\n const tooltips = this.currentOptions.tooltips!\n\n if (isMacintosh || onlyRendererMenuBar) return\n\n this.createControlButton(\n this.controls.minimize,\n this.platformIcons?.minimize,\n tooltips.minimize!,\n this.currentOptions.minimizable\n )\n this.createControlButton(\n this.controls.maximize,\n this.platformIcons?.maximize,\n tooltips.maximize!,\n this.currentOptions.maximizable\n )\n this.createControlButton(\n this.controls.close,\n this.platformIcons?.close,\n tooltips.close!,\n this.currentOptions.closeable\n )\n\n append(this.titlebar, this.controlsContainer)\n }\n\n private setupContainer() {\n const containerOverflow = this.currentOptions.containerOverflow\n\n if (containerOverflow) {\n this.container.style.overflow = containerOverflow\n }\n\n while (document.body.firstChild) {\n append(this.container, document.body.firstChild)\n }\n\n append(document.body, this.container)\n }\n\n private setupTitleBar() {\n const order = this.currentOptions.order\n const hasShadow = this.currentOptions.shadow\n\n addClass(\n this.titlebar,\n `cet-${PlatformToString(platform)?.toLocaleLowerCase()}`\n )\n\n if (order) {\n addClass(this.titlebar, `cet-${order}`)\n }\n\n if (hasShadow) {\n addClass(this.titlebar, 'cet-shadow')\n }\n\n if (!isMacintosh) {\n this.title.style.cursor = 'default'\n }\n\n prepend(document.body, this.titlebar)\n }\n\n private loadEvents() {\n const onlyRendererMenuBar = this.currentOptions.onlyShowMenuBar\n\n if (onlyRendererMenuBar) return\n\n const minimizable = this.currentOptions.minimizable\n const maximizable = this.currentOptions.maximizable\n const closeable = this.currentOptions.closeable\n\n void ipcRenderer\n .invoke(IpcChannels.GET_WINDOW_MAXIMIZED)\n .then((isMaximized: boolean) => {\n this.onDidChangeMaximized(isMaximized)\n })\n\n ipcRenderer.on('window-maximize', this.onWindowMaximizeEvent)\n ipcRenderer.on('window-fullscreen', this.onWindowFullscreenEvent)\n ipcRenderer.on('window-focus', this.onWindowFocusEvent)\n\n if (minimizable) {\n this._register(\n addDisposableListener(this.controls.minimize, EventType.CLICK, () => {\n ipcRenderer.send(IpcChannels.WINDOW_EVENT, 'window-minimize')\n })\n )\n }\n\n if (isMacintosh) {\n this._register(\n addDisposableListener(this.titlebar, EventType.DBLCLICK, () => {\n ipcRenderer.send(IpcChannels.WINDOW_EVENT, 'window-maximize')\n })\n )\n }\n\n if (maximizable) {\n this._register(\n addDisposableListener(this.controls.maximize, EventType.CLICK, () => {\n ipcRenderer.send(IpcChannels.WINDOW_EVENT, 'window-maximize')\n })\n )\n }\n\n if (closeable) {\n this._register(\n addDisposableListener(this.controls.close, EventType.CLICK, () => {\n ipcRenderer.send(IpcChannels.WINDOW_EVENT, 'window-close')\n })\n )\n }\n }\n\n private closeMenu = () => {\n if (this.menuBar) {\n this.menuBar.blur()\n }\n }\n\n private onBlur() {\n this.isInactive = true\n this.updateStyles()\n }\n\n private onFocus() {\n this.isInactive = false\n this.updateStyles()\n }\n\n private onMenuBarVisibilityChanged(visible: boolean) {\n if (isWindows || isLinux || isFreeBSD) {\n if (visible) {\n // Hack to fix issue #52522 with layered webkit-app-region elements appearing under cursor\n hide(this.dragRegion)\n setTimeout(() => show(this.dragRegion), 50)\n }\n }\n }\n\n private onMenuBarFocusChanged(focused: boolean) {\n if (isWindows || isLinux || isFreeBSD) {\n if (focused) hide(this.dragRegion)\n else show(this.dragRegion)\n }\n }\n\n private onDidChangeMaximized(isMaximized: boolean) {\n const maximize = this.controls.maximize\n\n if (maximize) {\n maximize.title = isMaximized\n ? this.currentOptions.tooltips?.restoreDown || 'Restore Down'\n : this.currentOptions.tooltips?.maximize || 'Maximize'\n maximize.innerHTML = isMaximized\n ? this.platformIcons?.restore\n : this.platformIcons?.maximize\n }\n\n if (this.resizer) {\n if (isMaximized) hide(this.resizer.top, this.resizer.left)\n else show(this.resizer.top, this.resizer.left)\n }\n }\n\n private updateMenu(menu?: Menu) {\n if (isMacintosh || !menu || this.currentOptions.removeMenuBar) return\n\n if (this.menuBar) this.menuBar.dispose()\n\n this.menuBar = new MenuBar(\n this.menuBarContainer,\n menuIcons,\n this.currentOptions,\n { enableMnemonics: this.currentOptions.enableMnemonics ?? true },\n this.closeMenu\n )\n this.menuBar.push(menu)\n this.menuBar.update()\n this.menuBar.onVisibilityChange((e) => this.onMenuBarVisibilityChanged(e))\n this.menuBar.onFocusStateChange((e) => this.onMenuBarFocusChanged(e))\n\n this.updateStyles()\n }\n\n private async applyThemeConfigFromSource(): Promise<void> {\n // First, check for inline config (backward compatibility)\n const inlineConfig = this.currentOptions.themeConfig\n if (inlineConfig) {\n this.applyThemeConfig(inlineConfig, 'inline')\n return\n }\n\n // Load pre-configured theme delivered by main process\n try {\n const loaded = (await ipcRenderer.invoke(\n IpcChannels.GET_THEME_CONFIG\n )) as unknown\n if (loaded) {\n const normalized = normalizeThemeConfig(loaded)\n normalized.warnings.forEach((warning) => {\n console.warn(`[custom-electron-titlebar] ${warning}`)\n })\n if (normalized.config) {\n this.applyThemeConfig(normalized.config, 'main-process')\n }\n }\n } catch (_) {\n // Ignore theme loading errors and keep default style.\n }\n }\n\n private applyThemeConfig(\n themeConfig: TitlebarThemeConfig,\n source: string\n ): void {\n const normalized = normalizeThemeConfig(themeConfig)\n normalized.warnings.forEach((warning) => {\n console.warn(`[custom-electron-titlebar] ${warning} (source: ${source})`)\n })\n\n if (!normalized.config) {\n return\n }\n\n const cfg = normalized.config\n\n if (cfg.fontFamily) {\n this.titlebar.style.setProperty('--cet-font-family', cfg.fontFamily)\n }\n\n if (typeof cfg.fontSize === 'number' && Number.isFinite(cfg.fontSize)) {\n const baseSize = Math.max(10, Math.floor(cfg.fontSize))\n this.titlebar.style.setProperty('--cet-font-size', getPx(baseSize))\n this.titlebar.style.setProperty(\n '--cet-title-font-size',\n getPx(Math.max(10, baseSize - 1))\n )\n this.titlebar.style.setProperty(\n '--cet-menu-font-size',\n getPx(Math.max(10, baseSize - 1))\n )\n }\n\n const colors = cfg.colors\n if (colors) {\n const titlebarColor = this.parseThemeColor(colors.titlebar)\n if (titlebarColor) {\n this.currentOptions.backgroundColor = titlebarColor\n }\n\n const menuBarColor = this.parseThemeColor(colors.menuBar)\n if (menuBarColor) {\n this.currentOptions.menuBarBackgroundColor = menuBarColor\n }\n\n const menuSelectionColor = this.parseThemeColor(colors.menuItemSelection)\n if (menuSelectionColor) {\n this.currentOptions.itemBackgroundColor = menuSelectionColor\n }\n\n const menuSeparatorColor = this.parseThemeColor(colors.menuSeparator)\n if (menuSeparatorColor) {\n this.currentOptions.menuSeparatorColor = menuSeparatorColor\n }\n\n const svgColor = this.parseThemeColor(colors.svg)\n if (svgColor) {\n this.currentOptions.svgColor = svgColor\n }\n\n const titlebarForeground = this.parseThemeColor(colors.titlebarForeground)\n if (titlebarForeground) {\n this.forcedForegroundColor = titlebarForeground\n }\n }\n\n this.updateStyles()\n }\n\n private parseThemeColor(colorValue?: string): Color | undefined {\n if (!colorValue || typeof colorValue !== 'string') {\n return undefined\n }\n\n const normalized = colorValue.trim()\n if (!normalized.startsWith('#')) {\n return undefined\n }\n\n try {\n return Color.fromHex(normalized)\n } catch (_) {\n return undefined\n }\n }\n\n private updateStyles() {\n if (this.isInactive) {\n addClass(this.titlebar, 'inactive')\n } else {\n removeClass(this.titlebar, 'inactive')\n }\n\n const backgroundColor =\n this.isInactive && this.currentOptions.unfocusEffect\n ? this.currentOptions.backgroundColor?.lighten(0.12)\n : this.currentOptions.backgroundColor\n\n if (backgroundColor) {\n this.titlebar.style.backgroundColor = backgroundColor?.toString()\n }\n\n let foregroundColor: Color\n\n if (backgroundColor?.isLighter()) {\n addClass(this.titlebar, 'light')\n\n foregroundColor =\n this.isInactive && this.currentOptions.unfocusEffect\n ? INACTIVE_FOREGROUND_DARK\n : ACTIVE_FOREGROUND_DARK\n } else {\n removeClass(this.titlebar, 'light')\n\n foregroundColor =\n this.isInactive && this.currentOptions.unfocusEffect\n ? INACTIVE_FOREGROUND\n : ACTIVE_FOREGROUND\n }\n\n const effectiveForegroundColor =\n this.forcedForegroundColor || foregroundColor\n this.titlebar.style.color = effectiveForegroundColor?.toString()\n\n show(this.controlsContainer)\n\n void ipcRenderer\n .invoke(IpcChannels.UPDATE_WINDOW_CONTROLS, {\n color: backgroundColor?.toString(),\n symbolColor: effectiveForegroundColor?.toString(),\n height: TOP_TITLEBAR_HEIGHT_WIN\n })\n .then((updatedWindowControls: boolean) => {\n if (updatedWindowControls) {\n hide(this.controlsContainer)\n } else {\n show(this.controlsContainer)\n }\n })\n .catch(() => {\n show(this.controlsContainer)\n })\n\n if (this.menuBar) {\n let fgColor\n const backgroundColor =\n this.currentOptions.menuBarBackgroundColor ||\n this.currentOptions.backgroundColor?.darken(0.12) ||\n Color.WHITE\n\n const foregroundColor = backgroundColor?.isLighter()\n ? INACTIVE_FOREGROUND_DARK\n : INACTIVE_FOREGROUND\n\n const bgColor =\n this.currentOptions.itemBackgroundColor &&\n !this.currentOptions.itemBackgroundColor.equals(backgroundColor)\n ? this.currentOptions.itemBackgroundColor\n : DEFAULT_ITEM_SELECTOR\n\n if (bgColor?.equals(DEFAULT_ITEM_SELECTOR)) {\n fgColor = backgroundColor?.isLighter()\n ? ACTIVE_FOREGROUND_DARK\n : ACTIVE_FOREGROUND\n } else {\n fgColor = bgColor?.isLighter()\n ? ACTIVE_FOREGROUND_DARK\n : ACTIVE_FOREGROUND\n }\n\n this.menuBar.setStyles({\n backgroundColor,\n foregroundColor,\n selectionBackgroundColor: bgColor,\n selectionForegroundColor: fgColor,\n separatorColor:\n this.currentOptions.menuSeparatorColor ?? foregroundColor,\n svgColor: this.currentOptions.svgColor\n })\n }\n }\n\n private canCenterTitle() {\n const menuBarContainerMargin = 20\n const menuSpaceLimit =\n window.innerWidth / 2 -\n this.menuBarContainer.getBoundingClientRect().right -\n menuBarContainerMargin\n return this.title.getBoundingClientRect().width / 2 <= menuSpaceLimit\n }\n\n /// Public methods\n\n /**\n * Update title bar styles based on focus state.\n * @param hasFocus focus state of the window\n */\n public onWindowFocus(focus: boolean) {\n if (this.titlebar) {\n if (focus) {\n removeClass(this.titlebar, 'inactive')\n this.onFocus()\n } else {\n addClass(this.titlebar, 'inactive')\n this.menuBar?.blur()\n this.onBlur()\n }\n }\n }\n\n /**\n * Update the full screen state and hide or show the title bar.\n * @param fullscreen Fullscreen state of the window\n */\n public onWindowFullScreen(fullscreen: boolean) {\n const height = isMacintosh\n ? TOP_TITLEBAR_HEIGHT_MAC\n : TOP_TITLEBAR_HEIGHT_WIN\n const hasShadow = this.currentOptions.shadow\n\n if (!isMacintosh) {\n if (fullscreen) {\n hide(this.titlebar)\n this.container.style.top = '0px'\n } else {\n show(this.titlebar)\n if (this.currentOptions.menuPosition === 'bottom') {\n this.container.style.top = getPx(BOTTOM_TITLEBAR_HEIGHT)\n this.controlsContainer.style.height = getPx(TOP_TITLEBAR_HEIGHT_WIN)\n } else {\n this.container.style.top = getPx(height + (hasShadow ? 1 : 0))\n }\n }\n }\n }\n\n /**\n * Update the title of the title bar.\n * You can use this method if change the content of `<title>` tag on your html.\n * @param title The title of the title bar and document.\n */\n public updateTitle(title: string) {\n this.title.innerText = title\n document.title = title\n\n return this\n }\n\n /**\n * It method set new icon to title-bar-icon of title-bar.\n * @param path path to icon\n */\n public updateIcon(path: string) {\n if (this.icon && this.icon.firstElementChild) {\n this.icon.firstElementChild.setAttribute('src', path)\n }\n\n return this\n }\n\n /**\n * Horizontal alignment of the title.\n * @param side `left`, `center` or `right`.\n */\n public updateTitleAlignment(side: 'left' | 'center' | 'right') {\n const order = this.currentOptions.order\n const menuPosition = this.currentOptions.menuPosition\n\n if (this.titleResizeListener) {\n this.titleResizeListener.dispose()\n this.titleResizeListener = undefined\n }\n\n if (side === 'left' || (side === 'right' && order === 'inverted')) {\n removeClass(this.title, 'cet-title-left')\n removeClass(this.title, 'cet-title-right')\n removeClass(this.title, 'cet-title-center')\n addClass(this.title, 'cet-title-left')\n }\n\n if (side === 'right' || (side === 'left' && order === 'inverted')) {\n if (side !== 'left' && order !== 'inverted') {\n this.controlsContainer.style.marginLeft = '10px'\n }\n\n removeClass(this.title, 'cet-title-left')\n removeClass(this.title, 'cet-title-right')\n removeClass(this.title, 'cet-title-center')\n addClass(this.title, 'cet-title-right')\n }\n\n if (side === 'center') {\n removeClass(this.title, 'cet-title-left')\n removeClass(this.title, 'cet-title-right')\n removeClass(this.title, 'cet-title-center')\n\n if (menuPosition !== 'bottom') {\n this.titleResizeListener = this._register(\n addDisposableListener(window, 'resize', () => {\n if (this.canCenterTitle()) {\n addClass(this.title, 'cet-title-center')\n } else {\n removeClass(this.title, 'cet-title-center')\n }\n })\n )\n if (this.canCenterTitle()) {\n addClass(this.title, 'cet-title-center')\n }\n }\n\n if (!isMacintosh && order === 'first-buttons') {\n this.controlsContainer.style.marginLeft = 'auto'\n }\n\n this.title.style.maxWidth = 'calc(100% - 296px)'\n }\n\n return this\n }\n\n /**\n * Update the background color of the title bar\n * @param backgroundColor The color for the background\n */\n public updateBackground(backgroundColor: Color) {\n if (typeof backgroundColor === 'string')\n backgroundColor = Color.fromHex(backgroundColor)\n this.currentOptions.backgroundColor = backgroundColor\n this.updateStyles()\n\n return this\n }\n\n /**\n * Update the item background color of the menubar\n * @param itemBGColor The color for the item background\n */\n public updateItemBGColor(itemBGColor: Color) {\n if (typeof itemBGColor === 'string')\n itemBGColor = Color.fromHex(itemBGColor)\n this.currentOptions.itemBackgroundColor = itemBGColor\n this.updateStyles()\n\n return this\n }\n\n /**\n * Update the menu from Menu.getApplicationMenu()\n */\n public async refreshMenu() {\n if (!isMacintosh) {\n ipcRenderer\n .invoke(IpcChannels.REQUEST_APPLICATION_MENU)\n .then((menu: Menu) => this.updateMenu(menu))\n }\n\n return this\n }\n\n /**\n * Update the position of menubar.\n * @param menuPosition The position of the menu `left` or `bottom`.\n */\n public updateMenuPosition(menuPosition: 'left' | 'bottom') {\n const height = isMacintosh\n ? TOP_TITLEBAR_HEIGHT_MAC\n : TOP_TITLEBAR_HEIGHT_WIN\n const onlyRendererMenuBar = this.currentOptions.onlyShowMenuBar\n const hasShadow = this.currentOptions.shadow\n\n this.currentOptions.menuPosition = menuPosition\n\n if (menuPosition === 'left' || onlyRendererMenuBar) {\n this.titlebar.style.height = getPx(height + (hasShadow ? 1 : 0))\n this.container.style.top = getPx(height + (hasShadow ? 1 : 0))\n removeClass(this.menuBarContainer, 'bottom')\n } else {\n this.titlebar.style.height = getPx(BOTTOM_TITLEBAR_HEIGHT)\n this.container.style.top = getPx(BOTTOM_TITLEBAR_HEIGHT)\n this.controlsContainer.style.height = getPx(height)\n addClass(this.menuBarContainer, 'bottom')\n }\n\n return this\n }\n\n /**\n * Remove the titlebar, menubar and all methods.\n */\n public dispose() {\n if (this.titleResizeListener) {\n this.titleResizeListener.dispose()\n this.titleResizeListener = undefined\n }\n\n ipcRenderer.removeListener('window-maximize', this.onWindowMaximizeEvent)\n ipcRenderer.removeListener(\n 'window-fullscreen',\n this.onWindowFullscreenEvent\n )\n ipcRenderer.removeListener('window-focus', this.onWindowFocusEvent)\n\n if (this.menuBar) {\n this.menuBar.dispose()\n this.menuBar = undefined\n }\n\n super.dispose()\n\n this.titlebar.remove()\n while (this.container.firstChild)\n append(document.body, this.container.firstChild)\n this.container.remove()\n }\n\n public get titlebarElement() {\n return this.titlebar\n }\n\n public get menubarElement() {\n return this.menuBar\n }\n\n public get containerElement() {\n return this.container\n }\n\n public get titleElement() {\n return this.title\n }\n}\n","/* ---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\n/* eslint-disable no-inner-declarations */\n/* eslint-disable indent */\n\nimport { CharCode } from 'base/common/charCode'\n\nfunction roundFloat(number: number, decimalPoints: number): number {\n\tconst decimal = Math.pow(10, decimalPoints)\n\treturn Math.round(number * decimal) / decimal\n}\n\nexport class RGBA {\n\t/**\n\t * Red: integer in [0-255]\n\t */\n\treadonly r: number\n\n\t/**\n\t * Green: integer in [0-255]\n\t */\n\treadonly g: number\n\n\t/**\n\t * Blue: integer in [0-255]\n\t */\n\treadonly b: number\n\n\t/**\n\t * Alpha: float in [0-1]\n\t */\n\treadonly a: number\n\n\tconstructor(r: number, g: number, b: number, a = 1) {\n\t\tthis.r = Math.min(255, Math.max(0, r)) | 0\n\t\tthis.g = Math.min(255, Math.max(0, g)) | 0\n\t\tthis.b = Math.min(255, Math.max(0, b)) | 0\n\t\tthis.a = roundFloat(Math.max(Math.min(1, a), 0), 3)\n\t}\n\n\tstatic equals(a: RGBA, b: RGBA): boolean {\n\t\treturn a.r === b.r && a.g === b.g && a.b === b.b && a.a === b.a\n\t}\n}\n\nexport class HSLA {\n\t/**\n\t * Hue: integer in [0, 360]\n\t */\n\treadonly h: number\n\n\t/**\n\t * Saturation: float in [0, 1]\n\t */\n\treadonly s: number\n\n\t/**\n\t * Luminosity: float in [0, 1]\n\t */\n\treadonly l: number\n\n\t/**\n\t * Alpha: float in [0, 1]\n\t */\n\treadonly a: number\n\n\tconstructor(h: number, s: number, l: number, a: number) {\n\t\tthis.h = Math.max(Math.min(360, h), 0) | 0\n\t\tthis.s = roundFloat(Math.max(Math.min(1, s), 0), 3)\n\t\tthis.l = roundFloat(Math.max(Math.min(1, l), 0), 3)\n\t\tthis.a = roundFloat(Math.max(Math.min(1, a), 0), 3)\n\t}\n\n\tstatic equals(a: HSLA, b: HSLA): boolean {\n\t\treturn a.h === b.h && a.s === b.s && a.l === b.l && a.a === b.a\n\t}\n\n\t/**\n\t * Converts an RGB color value to HSL. Conversion formula\n\t * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\n\t * Assumes r, g, and b are contained in the set [0, 255] and\n\t * returns h in the set [0, 360], s, and l in the set [0, 1].\n\t */\n\tstatic fromRGBA(rgba: RGBA): HSLA {\n\t\tconst r = rgba.r / 255\n\t\tconst g = rgba.g / 255\n\t\tconst b = rgba.b / 255\n\t\tconst a = rgba.a\n\n\t\tconst max = Math.max(r, g, b)\n\t\tconst min = Math.min(r, g, b)\n\t\tlet h = 0\n\t\tlet s = 0\n\t\tconst l = (min + max) / 2\n\t\tconst chroma = max - min\n\n\t\tif (chroma > 0) {\n\t\t\ts = Math.min((l <= 0.5 ? chroma / (2 * l) : chroma / (2 - (2 * l))), 1)\n\n\t\t\tswitch (max) {\n\t\t\t\tcase r: h = (g - b) / chroma + (g < b ? 6 : 0); break\n\t\t\t\tcase g: h = (b - r) / chroma + 2; break\n\t\t\t\tcase b: h = (r - g) / chroma + 4; break\n\t\t\t}\n\n\t\t\th *= 60\n\t\t\th = Math.round(h)\n\t\t}\n\t\treturn new HSLA(h, s, l, a)\n\t}\n\n\tprivate static _hue2rgb(p: number, q: number, t: number): number {\n\t\tif (t < 0) {\n\t\t\tt += 1\n\t\t}\n\t\tif (t > 1) {\n\t\t\tt -= 1\n\t\t}\n\t\tif (t < 1 / 6) {\n\t\t\treturn p + (q - p) * 6 * t\n\t\t}\n\t\tif (t < 1 / 2) {\n\t\t\treturn q\n\t\t}\n\t\tif (t < 2 / 3) {\n\t\t\treturn p + (q - p) * (2 / 3 - t) * 6\n\t\t}\n\t\treturn p\n\t}\n\n\t/**\n\t * Converts an HSL color value to RGB. Conversion formula\n\t * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\n\t * Assumes h in the set [0, 360] s, and l are contained in the set [0, 1] and\n\t * returns r, g, and b in the set [0, 255].\n\t */\n\tstatic toRGBA(hsla: HSLA): RGBA {\n\t\tconst h = hsla.h / 360\n\t\tconst { s, l, a } = hsla\n\t\tlet r: number, g: number, b: number\n\n\t\tif (s === 0) {\n\t\t\tr = g = b = l // achromatic\n\t\t} else {\n\t\t\tconst q = l < 0.5 ? l * (1 + s) : l + s - l * s\n\t\t\tconst p = 2 * l - q\n\t\t\tr = HSLA._hue2rgb(p, q, h + 1 / 3)\n\t\t\tg = HSLA._hue2rgb(p, q, h)\n\t\t\tb = HSLA._hue2rgb(p, q, h - 1 / 3)\n\t\t}\n\n\t\treturn new RGBA(Math.round(r * 255), Math.round(g * 255), Math.round(b * 255), a)\n\t}\n}\n\nexport class HSVA {\n\t/**\n\t * Hue: integer in [0, 360]\n\t */\n\treadonly h: number\n\n\t/**\n\t * Saturation: float in [0, 1]\n\t */\n\treadonly s: number\n\n\t/**\n\t * Value: float in [0, 1]\n\t */\n\treadonly v: number\n\n\t/**\n\t * Alpha: float in [0, 1]\n\t */\n\treadonly a: number\n\n\tconstructor(h: number, s: number, v: number, a: number) {\n\t\tthis.h = Math.max(Math.min(360, h), 0) | 0\n\t\tthis.s = roundFloat(Math.max(Math.min(1, s), 0), 3)\n\t\tthis.v = roundFloat(Math.max(Math.min(1, v), 0), 3)\n\t\tthis.a = roundFloat(Math.max(Math.min(1, a), 0), 3)\n\t}\n\n\tstatic equals(a: HSVA, b: HSVA): boolean {\n\t\treturn a.h === b.h && a.s === b.s && a.v === b.v && a.a === b.a\n\t}\n\n\t// from http://www.rapidtables.com/convert/color/rgb-to-hsv.htm\n\tstatic fromRGBA(rgba: RGBA): HSVA {\n\t\tconst r = rgba.r / 255\n\t\tconst g = rgba.g / 255\n\t\tconst b = rgba.b / 255\n\t\tconst cmax = Math.max(r, g, b)\n\t\tconst cmin = Math.min(r, g, b)\n\t\tconst delta = cmax - cmin\n\t\tconst s = cmax === 0 ? 0 : (delta / cmax)\n\t\tlet m: number\n\n\t\tif (delta === 0) {\n\t\t\tm = 0\n\t\t} else if (cmax === r) {\n\t\t\tm = ((((g - b) / delta) % 6) + 6) % 6\n\t\t} else if (cmax === g) {\n\t\t\tm = ((b - r) / delta) + 2\n\t\t} else {\n\t\t\tm = ((r - g) / delta) + 4\n\t\t}\n\n\t\treturn new HSVA(Math.round(m * 60), s, cmax, rgba.a)\n\t}\n\n\t// from http://www.rapidtables.com/convert/color/hsv-to-rgb.htm\n\tstatic toRGBA(hsva: HSVA): RGBA {\n\t\tconst { h, s, v, a } = hsva\n\t\tconst c = v * s\n\t\tconst x = c * (1 - Math.abs((h / 60) % 2 - 1))\n\t\tconst m = v - c\n\t\tlet [r, g, b] = [0, 0, 0]\n\n\t\tif (h < 60) {\n\t\t\tr = c\n\t\t\tg = x\n\t\t} else if (h < 120) {\n\t\t\tr = x\n\t\t\tg = c\n\t\t} else if (h < 180) {\n\t\t\tg = c\n\t\t\tb = x\n\t\t} else if (h < 240) {\n\t\t\tg = x\n\t\t\tb = c\n\t\t} else if (h < 300) {\n\t\t\tr = x\n\t\t\tb = c\n\t\t} else if (h < 360) {\n\t\t\tr = c\n\t\t\tb = x\n\t\t}\n\n\t\tr = Math.round((r + m) * 255)\n\t\tg = Math.round((g + m) * 255)\n\t\tb = Math.round((b + m) * 255)\n\n\t\treturn new RGBA(r, g, b, a)\n\t}\n}\n\nexport class Color {\n\tstatic fromHex(hex: string): Color {\n\t\treturn Color.Format.CSS.parseHex(hex) || Color.RED\n\t}\n\n\treadonly rgba: RGBA\n\tprivate _hsla?: HSLA\n\tget hsla(): HSLA {\n\t\tif (this._hsla) {\n\t\t\treturn this._hsla\n\t\t} else {\n\t\t\treturn HSLA.fromRGBA(this.rgba)\n\t\t}\n\t}\n\n\tprivate _hsva?: HSVA\n\tget hsva(): HSVA {\n\t\tif (this._hsva) {\n\t\t\treturn this._hsva\n\t\t}\n\t\treturn HSVA.fromRGBA(this.rgba)\n\t}\n\n\tconstructor(arg: RGBA | HSLA | HSVA) {\n\t\tif (!arg) {\n\t\t\tthrow new Error('Color needs a value')\n\t\t} else if (arg instanceof RGBA) {\n\t\t\tthis.rgba = arg\n\t\t} else if (arg instanceof HSLA) {\n\t\t\tthis._hsla = arg\n\t\t\tthis.rgba = HSLA.toRGBA(arg)\n\t\t} else if (arg instanceof HSVA) {\n\t\t\tthis._hsva = arg\n\t\t\tthis.rgba = HSVA.toRGBA(arg)\n\t\t} else {\n\t\t\tthrow new Error('Invalid color ctor argument')\n\t\t}\n\t}\n\n\tequals(other: Color): boolean {\n\t\treturn !!other && RGBA.equals(this.rgba, other.rgba) && HSLA.equals(this.hsla, other.hsla) && HSVA.equals(this.hsva, other.hsva)\n\t}\n\n\t/**\n\t * http://www.w3.org/TR/WCAG20/#relativeluminancedef\n\t * Returns the number in the set [0, 1]. O => Darkest Black. 1 => Lightest white.\n\t */\n\tgetRelativeLuminance(): number {\n\t\tconst R = Color._relativeLuminanceForComponent(this.rgba.r)\n\t\tconst G = Color._relativeLuminanceForComponent(this.rgba.g)\n\t\tconst B = Color._relativeLuminanceForComponent(this.rgba.b)\n\t\tconst luminance = 0.2126 * R + 0.7152 * G + 0.0722 * B\n\n\t\treturn roundFloat(luminance, 4)\n\t}\n\n\tprivate static _relativeLuminanceForComponent(color: number): number {\n\t\tconst c = color / 255\n\t\treturn (c <= 0.03928) ? c / 12.92 : Math.pow(((c + 0.055) / 1.055), 2.4)\n\t}\n\n\t/**\n\t * http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n\t * Returns the contrast ration number in the set [1, 21].\n\t */\n\tgetContrastRatio(another: Color): number {\n\t\tconst lum1 = this.getRelativeLuminance()\n\t\tconst lum2 = another.getRelativeLuminance()\n\t\treturn lum1 > lum2 ? (lum1 + 0.05) / (lum2 + 0.05) : (lum2 + 0.05) / (lum1 + 0.05)\n\t}\n\n\t/**\n\t *\thttp://24ways.org/2010/calculating-color-contrast\n\t * Return 'true' if darker color otherwise 'false'\n\t */\n\tisDarker(): boolean {\n\t\tconst yiq = (this.rgba.r * 299 + this.rgba.g * 587 + this.rgba.b * 114) / 1000\n\t\treturn yiq < 128\n\t}\n\n\t/**\n\t *\thttp://24ways.org/2010/calculating-color-contrast\n\t * Return 'true' if lighter color otherwise 'false'\n\t */\n\tisLighter(): boolean {\n\t\tconst yiq = (this.rgba.r * 299 + this.rgba.g * 587 + this.rgba.b * 114) / 1000\n\t\treturn yiq >= 128\n\t}\n\n\tisLighterThan(another: Color): boolean {\n\t\tconst lum1 = this.getRelativeLuminance()\n\t\tconst lum2 = another.getRelativeLuminance()\n\t\treturn lum1 > lum2\n\t}\n\n\tisDarkerThan(another: Color): boolean {\n\t\tconst lum1 = this.getRelativeLuminance()\n\t\tconst lum2 = another.getRelativeLuminance()\n\t\treturn lum1 < lum2\n\t}\n\n\tlighten(factor: number): Color {\n\t\treturn new Color(new HSLA(this.hsla.h, this.hsla.s, this.hsla.l + this.hsla.l * factor, this.hsla.a))\n\t}\n\n\tdarken(factor: number): Color {\n\t\treturn new Color(new HSLA(this.hsla.h, this.hsla.s, this.hsla.l - this.hsla.l * factor, this.hsla.a))\n\t}\n\n\ttransparent(factor: number): Color {\n\t\tconst { r, g, b, a } = this.rgba\n\t\treturn new Color(new RGBA(r, g, b, a * factor))\n\t}\n\n\tisTransparent(): boolean {\n\t\treturn this.rgba.a === 0\n\t}\n\n\tisOpaque(): boolean {\n\t\treturn this.rgba.a === 1\n\t}\n\n\topposite(): Color {\n\t\treturn new Color(new RGBA(255 - this.rgba.r, 255 - this.rgba.g, 255 - this.rgba.b, this.rgba.a))\n\t}\n\n\tblend(c: Color): Color {\n\t\tconst rgba = c.rgba\n\n\t\t// Convert to 0..1 opacity\n\t\tconst thisA = this.rgba.a\n\t\tconst colorA = rgba.a\n\n\t\tconst a = thisA + colorA * (1 - thisA)\n\t\tif (a < 1e-6) {\n\t\t\treturn Color.TRANSPARENT\n\t\t}\n\n\t\tconst r = this.rgba.r * thisA / a + rgba.r * colorA * (1 - thisA) / a\n\t\tconst g = this.rgba.g * thisA / a + rgba.g * colorA * (1 - thisA) / a\n\t\tconst b = this.rgba.b * thisA / a + rgba.b * colorA * (1 - thisA) / a\n\n\t\treturn new Color(new RGBA(r, g, b, a))\n\t}\n\n\tflatten(...backgrounds: Color[]): Color {\n\t\tconst background = backgrounds.reduceRight((accumulator, color) => {\n\t\t\treturn Color._flatten(color, accumulator)\n\t\t})\n\t\treturn Color._flatten(this, background)\n\t}\n\n\tprivate static _flatten(foreground: Color, background: Color) {\n\t\tconst backgroundAlpha = 1 - foreground.rgba.a\n\t\treturn new Color(new RGBA(\n\t\t\tbackgroundAlpha * background.rgba.r + foreground.rgba.a * foreground.rgba.r,\n\t\t\tbackgroundAlpha * background.rgba.g + foreground.rgba.a * foreground.rgba.g,\n\t\t\tbackgroundAlpha * background.rgba.b + foreground.rgba.a * foreground.rgba.b\n\t\t))\n\t}\n\n\ttoString(): string {\n\t\treturn '' + Color.Format.CSS.format(this)\n\t}\n\n\tstatic getLighterColor(of: Color, relative: Color, factor?: number): Color {\n\t\tif (of.isLighterThan(relative)) {\n\t\t\treturn of\n\t\t}\n\t\tfactor = factor || 0.5\n\t\tconst lum1 = of.getRelativeLuminance()\n\t\tconst lum2 = relative.getRelativeLuminance()\n\t\tfactor = factor * (lum2 - lum1) / lum2\n\t\treturn of.lighten(factor)\n\t}\n\n\tstatic getDarkerColor(of: Color, relative: Color, factor?: number): Color {\n\t\tif (of.isDarkerThan(relative)) {\n\t\t\treturn of\n\t\t}\n\t\tfactor = factor || 0.5\n\t\tconst lum1 = of.getRelativeLuminance()\n\t\tconst lum2 = relative.getRelativeLuminance()\n\t\tfactor = factor * (lum1 - lum2) / lum1\n\t\treturn of.darken(factor)\n\t}\n\n\tstatic readonly WHITE = new Color(new RGBA(255, 255, 255, 1))\n\tstatic readonly BLACK = new Color(new RGBA(0, 0, 0, 1))\n\tstatic readonly RED = new Color(new RGBA(255, 0, 0, 1))\n\tstatic readonly BLUE = new Color(new RGBA(0, 0, 255, 1))\n\tstatic readonly GREEN = new Color(new RGBA(0, 255, 0, 1))\n\tstatic readonly CYAN = new Color(new RGBA(0, 255, 255, 1))\n\tstatic readonly LIGHTGREY = new Color(new RGBA(211, 211, 211, 1))\n\tstatic readonly TRANSPARENT = new Color(new RGBA(0, 0, 0, 0))\n}\n\nexport namespace Color {\n\texport namespace Format {\n\t\texport namespace CSS {\n\n\t\t\texport function formatRGB(color: Color): string {\n\t\t\t\tif (color.rgba.a === 1) {\n\t\t\t\t\treturn `rgb(${color.rgba.r}, ${color.rgba.g}, ${color.rgba.b})`\n\t\t\t\t}\n\n\t\t\t\treturn Color.Format.CSS.formatRGBA(color)\n\t\t\t}\n\n\t\t\texport function formatRGBA(color: Color): string {\n\t\t\t\treturn `rgba(${color.rgba.r}, ${color.rgba.g}, ${color.rgba.b}, ${+(color.rgba.a).toFixed(2)})`\n\t\t\t}\n\n\t\t\texport function formatHSL(color: Color): string {\n\t\t\t\tif (color.hsla.a === 1) {\n\t\t\t\t\treturn `hsl(${color.hsla.h}, ${(color.hsla.s * 100).toFixed(2)}%, ${(color.hsla.l * 100).toFixed(2)}%)`\n\t\t\t\t}\n\n\t\t\t\treturn Color.Format.CSS.formatHSLA(color)\n\t\t\t}\n\n\t\t\texport function formatHSLA(color: Color): string {\n\t\t\t\treturn `hsla(${color.hsla.h}, ${(color.hsla.s * 100).toFixed(2)}%, ${(color.hsla.l * 100).toFixed(2)}%, ${color.hsla.a.toFixed(2)})`\n\t\t\t}\n\n\t\t\tfunction _toTwoDigitHex(n: number): string {\n\t\t\t\tconst r = n.toString(16)\n\t\t\t\treturn r.length !== 2 ? '0' + r : r\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Formats the color as #RRGGBB\n\t\t\t */\n\t\t\texport function formatHex(color: Color): string {\n\t\t\t\treturn `#${_toTwoDigitHex(color.rgba.r)}${_toTwoDigitHex(color.rgba.g)}${_toTwoDigitHex(color.rgba.b)}`\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Formats the color as #RRGGBBAA\n\t\t\t * If 'compact' is set, colors without transparancy will be printed as #RRGGBB\n\t\t\t */\n\t\t\texport function formatHexA(color: Color, compact = false): string {\n\t\t\t\tif (compact && color.rgba.a === 1) {\n\t\t\t\t\treturn Color.Format.CSS.formatHex(color)\n\t\t\t\t}\n\n\t\t\t\treturn `#${_toTwoDigitHex(color.rgba.r)}${_toTwoDigitHex(color.rgba.g)}${_toTwoDigitHex(color.rgba.b)}${_toTwoDigitHex(Math.round(color.rgba.a * 255))}`\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * The default format will use HEX if opaque and RGBA otherwise.\n\t\t\t */\n\t\t\texport function format(color: Color): string | null {\n\t\t\t\tif (!color) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\n\t\t\t\tif (color.isOpaque()) {\n\t\t\t\t\treturn Color.Format.CSS.formatHex(color)\n\t\t\t\t}\n\n\t\t\t\treturn Color.Format.CSS.formatRGBA(color)\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Converts an Hex color value to a Color.\n\t\t\t * returns r, g, and b are contained in the set [0, 255]\n\t\t\t * @param hex string (#RGB, #RGBA, #RRGGBB or #RRGGBBAA).\n\t\t\t */\n\t\t\texport function parseHex(hex: string): Color | null {\n\t\t\t\tif (!hex) {\n\t\t\t\t\t// Invalid color\n\t\t\t\t\treturn null\n\t\t\t\t}\n\n\t\t\t\tconst length = hex.length\n\n\t\t\t\tif (length === 0) {\n\t\t\t\t\t// Invalid color\n\t\t\t\t\treturn null\n\t\t\t\t}\n\n\t\t\t\tif (hex.charCodeAt(0) !== CharCode.Hash) {\n\t\t\t\t\t// Does not begin with a #\n\t\t\t\t\treturn null\n\t\t\t\t}\n\n\t\t\t\tif (length === 7) {\n\t\t\t\t\t// #RRGGBB format\n\t\t\t\t\tconst r = 16 * _parseHexDigit(hex.charCodeAt(1)) + _parseHexDigit(hex.charCodeAt(2))\n\t\t\t\t\tconst g = 16 * _parseHexDigit(hex.charCodeAt(3)) + _parseHexDigit(hex.charCodeAt(4))\n\t\t\t\t\tconst b = 16 * _parseHexDigit(hex.charCodeAt(5)) + _parseHexDigit(hex.charCodeAt(6))\n\t\t\t\t\treturn new Color(new RGBA(r, g, b, 1))\n\t\t\t\t}\n\n\t\t\t\tif (length === 9) {\n\t\t\t\t\t// #RRGGBBAA format\n\t\t\t\t\tconst r = 16 * _parseHexDigit(hex.charCodeAt(1)) + _parseHexDigit(hex.charCodeAt(2))\n\t\t\t\t\tconst g = 16 * _parseHexDigit(hex.charCodeAt(3)) + _parseHexDigit(hex.charCodeAt(4))\n\t\t\t\t\tconst b = 16 * _parseHexDigit(hex.charCodeAt(5)) + _parseHexDigit(hex.charCodeAt(6))\n\t\t\t\t\tconst a = 16 * _parseHexDigit(hex.charCodeAt(7)) + _parseHexDigit(hex.charCodeAt(8))\n\t\t\t\t\treturn new Color(new RGBA(r, g, b, a / 255))\n\t\t\t\t}\n\n\t\t\t\tif (length === 4) {\n\t\t\t\t\t// #RGB format\n\t\t\t\t\tconst r = _parseHexDigit(hex.charCodeAt(1))\n\t\t\t\t\tconst g = _parseHexDigit(hex.charCodeAt(2))\n\t\t\t\t\tconst b = _parseHexDigit(hex.charCodeAt(3))\n\t\t\t\t\treturn new Color(new RGBA(16 * r + r, 16 * g + g, 16 * b + b))\n\t\t\t\t}\n\n\t\t\t\tif (length === 5) {\n\t\t\t\t\t// #RGBA format\n\t\t\t\t\tconst r = _parseHexDigit(hex.charCodeAt(1))\n\t\t\t\t\tconst g = _parseHexDigit(hex.charCodeAt(2))\n\t\t\t\t\tconst b = _parseHexDigit(hex.charCodeAt(3))\n\t\t\t\t\tconst a = _parseHexDigit(hex.charCodeAt(4))\n\t\t\t\t\treturn new Color(new RGBA(16 * r + r, 16 * g + g, 16 * b + b, (16 * a + a) / 255))\n\t\t\t\t}\n\n\t\t\t\t// Invalid color\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\tfunction _parseHexDigit(charCode: CharCode): number {\n\t\t\t\tswitch (charCode) {\n\t\t\t\t\tcase CharCode.Digit0: return 0\n\t\t\t\t\tcase CharCode.Digit1: return 1\n\t\t\t\t\tcase CharCode.Digit2: return 2\n\t\t\t\t\tcase CharCode.Digit3: return 3\n\t\t\t\t\tcase CharCode.Digit4: return 4\n\t\t\t\t\tcase CharCode.Digit5: return 5\n\t\t\t\t\tcase CharCode.Digit6: return 6\n\t\t\t\t\tcase CharCode.Digit7: return 7\n\t\t\t\t\tcase CharCode.Digit8: return 8\n\t\t\t\t\tcase CharCode.Digit9: return 9\n\t\t\t\t\tcase CharCode.a: return 10\n\t\t\t\t\tcase CharCode.A: return 10\n\t\t\t\t\tcase CharCode.b: return 11\n\t\t\t\t\tcase CharCode.B: return 11\n\t\t\t\t\tcase CharCode.c: return 12\n\t\t\t\t\tcase CharCode.C: return 12\n\t\t\t\t\tcase CharCode.d: return 13\n\t\t\t\t\tcase CharCode.D: return 13\n\t\t\t\t\tcase CharCode.e: return 14\n\t\t\t\t\tcase CharCode.E: return 14\n\t\t\t\t\tcase CharCode.f: return 15\n\t\t\t\t\tcase CharCode.F: return 15\n\t\t\t\t}\n\t\t\t\treturn 0\n\t\t\t}\n\t\t}\n\t}\n}","/* ---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\nexport interface IDisposable {\n\tdispose(): void;\n}\n\nexport function isDisposable<E extends object>(thing: E): thing is E & IDisposable {\n\treturn typeof (<IDisposable><any>thing).dispose === 'function' &&\n\t\t(<IDisposable><any>thing).dispose.length === 0\n}\n\nexport function dispose<T extends IDisposable>(disposable: T): T;\nexport function dispose<T extends IDisposable>(...disposables: Array<T | undefined>): T[];\nexport function dispose<T extends IDisposable>(disposables: T[]): T[];\nexport function dispose<T extends IDisposable>(first: T | T[], ...rest: T[]): T | T[] | undefined {\n\tif (Array.isArray(first)) {\n\t\tfirst.forEach(d => d && d.dispose())\n\t\treturn []\n\t} else if (rest.length === 0) {\n\t\tif (first) {\n\t\t\tfirst.dispose()\n\t\t\treturn first\n\t\t}\n\t\treturn undefined\n\t} else {\n\t\tdispose(first)\n\t\tdispose(rest)\n\t\treturn []\n\t}\n}\n\nexport function combinedDisposable(disposables: IDisposable[]): IDisposable {\n\treturn { dispose: () => dispose(disposables) }\n}\n\nexport function toDisposable(fn: () => void): IDisposable {\n\treturn { dispose() { fn() } }\n}\n\nexport abstract class Disposable implements IDisposable {\n\tstatic None = Object.freeze<IDisposable>({ dispose() { } })\n\n\tprotected _toDispose: IDisposable[] = []\n\tprotected get toDispose(): IDisposable[] { return this._toDispose }\n\n\tprivate _lifecycle_disposable_isDisposed = false\n\n\tpublic dispose(): void {\n\t\tthis._lifecycle_disposable_isDisposed = true\n\t\tthis._toDispose = dispose(this._toDispose)\n\t}\n\n\tprotected _register<T extends IDisposable>(t: T): T {\n\t\tif (this._lifecycle_disposable_isDisposed) {\n\t\t\tconsole.warn('Registering disposable on object that has already been disposed.')\n\t\t\tt.dispose()\n\t\t} else {\n\t\t\tthis._toDispose.push(t)\n\t\t}\n\n\t\treturn t\n\t}\n}","/* ---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\nexport interface IteratorDefinedResult<T> {\n\treadonly done: false;\n\treadonly value: T;\n}\nexport interface IteratorUndefinedResult {\n\treadonly done: true;\n\treadonly value: undefined;\n}\nexport const FIN: IteratorUndefinedResult = { done: true, value: undefined }\nexport type IteratorResult<T> = IteratorDefinedResult<T> | IteratorUndefinedResult;\n\nexport interface Iterator<T> {\n\tnext(): IteratorResult<T>;\n}\n\nexport namespace Iterator {\n\tconst _empty: Iterator<any> = {\n\t\tnext() {\n\t\t\treturn FIN\n\t\t}\n\t}\n\n\texport function empty<T>(): Iterator<T> {\n\t\treturn _empty\n\t}\n\n\texport function fromArray<T>(array: T[], index = 0, length = array.length): Iterator<T> {\n\t\treturn {\n\t\t\tnext(): IteratorResult<T> {\n\t\t\t\tif (index >= length) {\n\t\t\t\t\treturn FIN\n\t\t\t\t}\n\n\t\t\t\treturn { done: false, value: array[index++] }\n\t\t\t}\n\t\t}\n\t}\n\n\texport function from<T>(elements: Iterator<T> | T[] | undefined): Iterator<T> {\n\t\tif (!elements) {\n\t\t\treturn Iterator.empty()\n\t\t} else if (Array.isArray(elements)) {\n\t\t\treturn Iterator.fromArray(elements)\n\t\t} else {\n\t\t\treturn elements\n\t\t}\n\t}\n\n\texport function map<T, R>(iterator: Iterator<T>, fn: (t: T) => R): Iterator<R> {\n\t\treturn {\n\t\t\tnext() {\n\t\t\t\tconst element = iterator.next()\n\t\t\t\tif (element.done) {\n\t\t\t\t\treturn FIN\n\t\t\t\t} else {\n\t\t\t\t\treturn { done: false, value: fn(element.value) }\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\texport function filter<T>(iterator: Iterator<T>, fn: (t: T) => boolean): Iterator<T> {\n\t\treturn {\n\t\t\tnext() {\n\t\t\t\twhile (true) {\n\t\t\t\t\tconst element = iterator.next()\n\t\t\t\t\tif (element.done) {\n\t\t\t\t\t\treturn FIN\n\t\t\t\t\t}\n\t\t\t\t\tif (fn(element.value)) {\n\t\t\t\t\t\treturn { done: false, value: element.value }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\texport function forEach<T>(iterator: Iterator<T>, fn: (t: T) => void): void {\n\t\tfor (let next = iterator.next(); !next.done; next = iterator.next()) {\n\t\t\tfn(next.value)\n\t\t}\n\t}\n\n\texport function collect<T>(iterator: Iterator<T>): T[] {\n\t\tconst result: T[] = []\n\t\tforEach(iterator, value => result.push(value))\n\t\treturn result\n\t}\n}\n\nexport type ISequence<T> = Iterator<T> | T[];\n\nexport function getSequenceIterator<T>(arg: Iterator<T> | T[]): Iterator<T> {\n\tif (Array.isArray(arg)) {\n\t\treturn Iterator.fromArray(arg)\n\t} else {\n\t\treturn arg\n\t}\n}\n\nexport interface INextIterator<T> {\n\tnext(): T | null;\n}\n\nexport class ArrayIterator<T> implements INextIterator<T> {\n\tprivate items: T[]\n\tprotected start: number\n\tprotected end: number\n\tprotected index: number\n\n\tconstructor(items: T[], start: number = 0, end: number = items.length, index = start - 1) {\n\t\tthis.items = items\n\t\tthis.start = start\n\t\tthis.end = end\n\t\tthis.index = index\n\t}\n\n\tpublic first(): T | null {\n\t\tthis.index = this.start\n\t\treturn this.current()\n\t}\n\n\tpublic next(): T | null {\n\t\tthis.index = Math.min(this.index + 1, this.end)\n\t\treturn this.current()\n\t}\n\n\tprotected current(): T | null {\n\t\tif (this.index === this.start - 1 || this.index === this.end) {\n\t\t\treturn null\n\t\t}\n\n\t\treturn this.items[this.index]\n\t}\n}\n\nexport interface INavigator<T> extends INextIterator<T> {\n\tcurrent(): T | null;\n\tprevious(): T | null;\n\tparent(): T | null;\n\tfirst(): T | null;\n\tlast(): T | null;\n\tnext(): T | null;\n}\n\nexport class ArrayNavigator<T> extends ArrayIterator<T> implements INavigator<T> {\n\tconstructor(items: T[], start: number = 0, end: number = items.length, index = start - 1) {\n\t\tsuper(items, start, end, index)\n\t}\n\n\tpublic current(): T | null {\n\t\treturn super.current()\n\t}\n\n\tpublic previous(): T | null {\n\t\tthis.index = Math.max(this.index - 1, this.start - 1)\n\t\treturn this.current()\n\t}\n\n\tpublic first(): T | null {\n\t\tthis.index = this.start\n\t\treturn this.current()\n\t}\n\n\tpublic last(): T | null {\n\t\tthis.index = this.end - 1\n\t\treturn this.current()\n\t}\n\n\tpublic parent(): T | null {\n\t\treturn null\n\t}\n}\n\nexport class MappedIterator<T, R> implements INextIterator<R> {\n\tconstructor(protected iterator: INextIterator<T>, protected fn: (item: T | null) => R) {\n\t\t// noop\n\t}\n\n\tnext() { return this.fn(this.iterator.next()) }\n}\n\nexport class MappedNavigator<T, R> extends MappedIterator<T, R> implements INavigator<R> {\n\tconstructor(protected navigator: INavigator<T>, fn: (item: T | null) => R) {\n\t\tsuper(navigator, fn)\n\t}\n\n\tcurrent() { return this.fn(this.navigator.current()) }\n\tprevious() { return this.fn(this.navigator.previous()) }\n\tparent() { return this.fn(this.navigator.parent()) }\n\tfirst() { return this.fn(this.navigator.first()) }\n\tlast() { return this.fn(this.navigator.last()) }\n\tnext() { return this.fn(this.navigator.next()) }\n}","/* ---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\nimport { Iterator, IteratorResult, FIN } from 'base/common/iterator'\n\nclass Node<E> {\n\telement: E\n\t// eslint-disable-next-line no-use-before-define\n\tnext: Node<E> | undefined\n\t// eslint-disable-next-line no-use-before-define\n\tprev: Node<E> | undefined\n\n\tconstructor(element: E) {\n\t\tthis.element = element\n\t}\n}\n\nexport class LinkedList<E> {\n\tprivate _first: Node<E> | undefined\n\tprivate _last: Node<E> | undefined\n\tprivate _size: number = 0\n\n\tget size(): number {\n\t\treturn this._size\n\t}\n\n\tisEmpty(): boolean {\n\t\treturn !this._first\n\t}\n\n\tclear(): void {\n\t\tthis._first = undefined\n\t\tthis._last = undefined\n\t\tthis._size = 0\n\t}\n\n\tunshift(element: E): () => void {\n\t\treturn this._insert(element, false)\n\t}\n\n\tpush(element: E): () => void {\n\t\treturn this._insert(element, true)\n\t}\n\n\tprivate _insert(element: E, atTheEnd: boolean): () => void {\n\t\tconst newNode = new Node(element)\n\t\tif (!this._first) {\n\t\t\tthis._first = newNode\n\t\t\tthis._last = newNode\n\t\t} else if (atTheEnd) {\n\t\t\t// push\n\t\t\tconst oldLast = this._last!\n\t\t\tthis._last = newNode\n\t\t\tnewNode.prev = oldLast\n\t\t\toldLast.next = newNode\n\t\t} else {\n\t\t\t// unshift\n\t\t\tconst oldFirst = this._first\n\t\t\tthis._first = newNode\n\t\t\tnewNode.next = oldFirst\n\t\t\toldFirst.prev = newNode\n\t\t}\n\t\tthis._size += 1\n\t\treturn this._remove.bind(this, newNode)\n\t}\n\n\n\tshift(): E | undefined {\n\t\tif (!this._first) {\n\t\t\treturn undefined\n\t\t} else {\n\t\t\tconst res = this._first.element\n\t\t\tthis._remove(this._first)\n\t\t\treturn res\n\t\t}\n\t}\n\n\tpop(): E | undefined {\n\t\tif (!this._last) {\n\t\t\treturn undefined\n\t\t} else {\n\t\t\tconst res = this._last.element\n\t\t\tthis._remove(this._last)\n\t\t\treturn res\n\t\t}\n\t}\n\n\tprivate _remove(node: Node<E>): void {\n\t\tlet candidate: Node<E> | undefined = this._first\n\t\twhile (candidate instanceof Node) {\n\t\t\tif (candidate !== node) {\n\t\t\t\tcandidate = candidate.next\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (candidate.prev && candidate.next) {\n\t\t\t\t// middle\n\t\t\t\tconst anchor = candidate.prev\n\t\t\t\tanchor.next = candidate.next\n\t\t\t\tcandidate.next.prev = anchor\n\t\t\t} else if (!candidate.prev && !candidate.next) {\n\t\t\t\t// only node\n\t\t\t\tthis._first = undefined\n\t\t\t\tthis._last = undefined\n\t\t\t} else if (!candidate.next) {\n\t\t\t\t// last\n\t\t\t\tthis._last = this._last!.prev!\n\t\t\t\tthis._last.next = undefined\n\t\t\t} else if (!candidate.prev) {\n\t\t\t\t// first\n\t\t\t\tthis._first = this._first!.next!\n\t\t\t\tthis._first.prev = undefined\n\t\t\t}\n\n\t\t\t// done\n\t\t\tthis._size -= 1\n\t\t\tbreak\n\t\t}\n\t}\n\n\titerator(): Iterator<E> {\n\t\tlet element: { done: false; value: E; }\n\t\tlet node = this._first\n\t\treturn {\n\t\t\tnext(): IteratorResult<E> {\n\t\t\t\tif (!node) {\n\t\t\t\t\treturn FIN\n\t\t\t\t}\n\n\t\t\t\tif (!element) {\n\t\t\t\t\telement = { done: false, value: node.element }\n\t\t\t\t} else {\n\t\t\t\t\telement.value = node.element\n\t\t\t\t}\n\t\t\t\tnode = node.next\n\t\t\t\treturn element\n\t\t\t}\n\t\t}\n\t}\n\n\ttoArray(): E[] {\n\t\tconst result: E[] = []\n\t\tfor (let node = this._first; node instanceof Node; node = node.next) {\n\t\t\tresult.push(node.element)\n\t\t}\n\t\treturn result\n\t}\n}","/* ---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\nimport { combinedDisposable, Disposable, IDisposable } from 'base/common/lifecycle'\nimport { LinkedList } from 'base/common/linkedList'\n\n/**\n * To an event a function with one or zero parameters\n * can be subscribed. The event is the subscriber function itself.\n */\nexport interface Event<T> {\n\t(listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[]): IDisposable;\n}\n\nexport namespace Event {\n\tconst _disposable = { dispose() { } }\n\texport const None: Event<any> = function () { return _disposable }\n\n\t/**\n\t * Given an event, returns another event which only fires once.\n\t */\n\texport function once<T>(event: Event<T>): Event<T> {\n\t\treturn (listener, thisArgs = null, disposables?) => {\n\t\t\t// we need this, in case the event fires during the listener call\n\t\t\tlet didFire = false\n\n\t\t\tconst result = event(e => {\n\t\t\t\tif (didFire) {\n\t\t\t\t\treturn\n\t\t\t\t} else if (result) {\n\t\t\t\t\tresult.dispose()\n\t\t\t\t} else {\n\t\t\t\t\tdidFire = true\n\t\t\t\t}\n\n\t\t\t\treturn listener.call(thisArgs, e)\n\t\t\t}, null, disposables)\n\n\t\t\tif (didFire) {\n\t\t\t\tresult.dispose()\n\t\t\t}\n\n\t\t\treturn result\n\t\t}\n\t}\n\n\t/**\n\t * Given an event and a `map` function, returns another event which maps each element\n\t * throught the mapping function.\n\t */\n\texport function map<I, O>(event: Event<I>, map: (i: I) => O): Event<O> {\n\t\treturn (listener, thisArgs = null, disposables?) => event(i => listener.call(thisArgs, map(i)), null, disposables)\n\t}\n\n\t/**\n\t * Given an event and an `each` function, returns another identical event and calls\n\t * the `each` function per each element.\n\t */\n\texport function forEach<I>(event: Event<I>, each: (i: I) => void): Event<I> {\n\t\treturn (listener, thisArgs = null, disposables?) => event(i => { each(i); listener.call(thisArgs, i) }, null, disposables)\n\t}\n\n\t/**\n\t * Given an event and a `filter` function, returns another event which emits those\n\t * elements for which the `filter` function returns `true`.\n\t */\n\texport function filter<T>(event: Event<T>, filter: (e: T) => boolean): Event<T>;\n\texport function filter<T, R>(event: Event<T | R>, filter: (e: T | R) => e is R): Event<R>;\n\texport function filter<T>(event: Event<T>, filter: (e: T) => boolean): Event<T> {\n\t\treturn (listener, thisArgs = null, disposables?) => event(e => filter(e) && listener.call(thisArgs, e), null, disposables)\n\t}\n\n\t/**\n\t * Given an event, returns the same event but typed as `Event<void>`.\n\t */\n\texport function signal<T>(event: Event<T>): Event<void> {\n\t\treturn event as Event<any> as Event<void>\n\t}\n\n\t/**\n\t * Given a collection of events, returns a single event which emits\n\t * whenever any of the provided events emit.\n\t */\n\texport function any<T>(...events: Event<T>[]): Event<T> {\n\t\treturn (listener, thisArgs = null, disposables?) => combinedDisposable(events.map(event => event(e => listener.call(thisArgs, e), null, disposables)))\n\t}\n\n\t/**\n\t * Given an event and a `merge` function, returns another event which maps each element\n\t * and the cummulative result throught the `merge` function. Similar to `map`, but with memory.\n\t */\n\texport function reduce<I, O>(event: Event<I>, merge: (last: O | undefined, event: I) => O, initial?: O): Event<O> {\n\t\tlet output: O | undefined = initial\n\n\t\treturn map<I, O>(event, e => {\n\t\t\toutput = merge(output, e)\n\t\t\treturn output\n\t\t})\n\t}\n\n\t/**\n\t * Debounces the provided event, given a `merge` function.\n\t *\n\t * @param event The input event.\n\t * @param merge The reducing function.\n\t * @param delay The debouncing delay in millis.\n\t * @param leading Whether the event should fire in the leading phase of the timeout.\n\t * @param leakWarningThreshold The leak warning threshold override.\n\t */\n\texport function debounce<T>(event: Event<T>, merge: (last: T, event: T) => T, delay?: number, leading?: boolean, leakWarningThreshold?: number): Event<T>;\n\texport function debounce<I, O>(event: Event<I>, merge: (last: O | undefined, event: I) => O, delay?: number, leading?: boolean, leakWarningThreshold?: number): Event<O>;\n\texport function debounce<I, O>(event: Event<I>, merge: (last: O | undefined, event: I) => O, delay: number = 100, leading = false, leakWarningThreshold?: number): Event<O> {\n\t\tlet subscription: IDisposable\n\t\tlet output: O | undefined\n\t\tlet handle: any\n\t\tlet numDebouncedCalls = 0\n\n\t\tconst emitter = new Emitter<O>({\n\t\t\tleakWarningThreshold,\n\t\t\tonFirstListenerAdd() {\n\t\t\t\tsubscription = event(cur => {\n\t\t\t\t\tnumDebouncedCalls++\n\t\t\t\t\toutput = merge(output, cur)\n\n\t\t\t\t\tif (leading && !handle) {\n\t\t\t\t\t\temitter.fire(output)\n\t\t\t\t\t}\n\n\t\t\t\t\tclearTimeout(handle)\n\t\t\t\t\thandle = setTimeout(() => {\n\t\t\t\t\t\tconst _output = output\n\t\t\t\t\t\toutput = undefined\n\t\t\t\t\t\thandle = undefined\n\t\t\t\t\t\tif (!leading || numDebouncedCalls > 1) {\n\t\t\t\t\t\t\temitter.fire(_output!)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tnumDebouncedCalls = 0\n\t\t\t\t\t}, delay)\n\t\t\t\t})\n\t\t\t},\n\t\t\tonLastListenerRemove() {\n\t\t\t\tsubscription.dispose()\n\t\t\t}\n\t\t})\n\n\t\treturn emitter.event\n\t}\n\n\t/**\n\t * Given an event, it returns another event which fires only once and as soon as\n\t * the input event emits. The event data is the number of millis it took for the\n\t * event to fire.\n\t */\n\texport function stopwatch<T>(event: Event<T>): Event<number> {\n\t\tconst start = new Date().getTime()\n\t\treturn map(once(event), _ => new Date().getTime() - start)\n\t}\n\n\t/**\n\t * Given an event, it returns another event which fires only when the event\n\t * element changes.\n\t */\n\texport function latch<T>(event: Event<T>): Event<T> {\n\t\tlet firstCall = true\n\t\tlet cache: T\n\n\t\treturn filter(event, value => {\n\t\t\tconst shouldEmit = firstCall || value !== cache\n\t\t\tfirstCall = false\n\t\t\tcache = value\n\t\t\treturn shouldEmit\n\t\t})\n\t}\n\n\t/**\n\t * Buffers the provided event until a first listener comes\n\t * along, at which point fire all the events at once and\n\t * pipe the event from then on.\n\t *\n\t * ```typescript\n\t * const emitter = new Emitter<number>();\n\t * const event = emitter.event;\n\t * const bufferedEvent = buffer(event);\n\t *\n\t * emitter.fire(1);\n\t * emitter.fire(2);\n\t * emitter.fire(3);\n\t * // nothing...\n\t *\n\t * const listener = bufferedEvent(num => console.log(num));\n\t * // 1, 2, 3\n\t *\n\t * emitter.fire(4);\n\t * // 4\n\t * ```\n\t */\n\texport function buffer<T>(event: Event<T>, nextTick = false, _buffer: T[] = []): Event<T> {\n\t\tlet buffer: T[] | null = _buffer.slice()\n\n\t\tlet listener: IDisposable | null = event(e => {\n\t\t\tif (buffer) {\n\t\t\t\tbuffer.push(e)\n\t\t\t} else {\n\t\t\t\temitter.fire(e)\n\t\t\t}\n\t\t})\n\n\t\tconst flush = () => {\n\t\t\tif (buffer) {\n\t\t\t\tbuffer.forEach(e => emitter.fire(e))\n\t\t\t}\n\t\t\tbuffer = null\n\t\t}\n\n\t\tconst emitter = new Emitter<T>({\n\t\t\tonFirstListenerAdd() {\n\t\t\t\tif (!listener) {\n\t\t\t\t\tlistener = event(e => emitter.fire(e))\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tonFirstListenerDidAdd() {\n\t\t\t\tif (buffer) {\n\t\t\t\t\tif (nextTick) {\n\t\t\t\t\t\tsetTimeout(flush)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tflush()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tonLastListenerRemove() {\n\t\t\t\tif (listener) {\n\t\t\t\t\tlistener.dispose()\n\t\t\t\t}\n\t\t\t\tlistener = null\n\t\t\t}\n\t\t})\n\n\t\treturn emitter.event\n\t}\n\n\t/**\n\t * Similar to `buffer` but it buffers indefinitely and repeats\n\t * the buffered events to every new listener.\n\t */\n\texport function echo<T>(event: Event<T>, nextTick = false, buffer: T[] = []): Event<T> {\n\t\tbuffer = buffer.slice()\n\n\t\tevent(e => {\n\t\t\tbuffer.push(e)\n\t\t\temitter.fire(e)\n\t\t})\n\n\t\tconst flush = (listener: (e: T) => any, thisArgs?: any) => buffer.forEach(e => listener.call(thisArgs, e))\n\n\t\tconst emitter = new Emitter<T>({\n\t\t\tonListenerDidAdd(emitter: any, listener: (e: T) => any, thisArgs?: any) {\n\t\t\t\tif (nextTick) {\n\t\t\t\t\tsetTimeout(() => flush(listener, thisArgs))\n\t\t\t\t} else {\n\t\t\t\t\tflush(listener, thisArgs)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\n\t\treturn emitter.event\n\t}\n\n\texport interface IChainableEvent<T> {\n\t\tevent: Event<T>;\n\t\tmap<O>(fn: (i: T) => O): IChainableEvent<O>;\n\t\tforEach(fn: (i: T) => void): IChainableEvent<T>;\n\t\tfilter(fn: (e: T) => boolean): IChainableEvent<T>;\n\t\treduce<R>(merge: (last: R | undefined, event: T) => R, initial?: R): IChainableEvent<R>;\n\t\tlatch(): IChainableEvent<T>;\n\t\ton(listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[]): IDisposable;\n\t\tonce(listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[]): IDisposable;\n\t}\n\n\tclass ChainableEvent<T> implements IChainableEvent<T> {\n\t\tget event(): Event<T> { return this._event }\n\n\t\tconstructor(private _event: Event<T>) { }\n\n\t\tmap<O>(fn: (i: T) => O): IChainableEvent<O> {\n\t\t\treturn new ChainableEvent(map(this._event, fn))\n\t\t}\n\n\t\tforEach(fn: (i: T) => void): IChainableEvent<T> {\n\t\t\treturn new ChainableEvent(forEach(this._event, fn))\n\t\t}\n\n\t\tfilter(fn: (e: T) => boolean): IChainableEvent<T> {\n\t\t\treturn new ChainableEvent(filter(this._event, fn))\n\t\t}\n\n\t\treduce<R>(merge: (last: R | undefined, event: T) => R, initial?: R): IChainableEvent<R> {\n\t\t\treturn new ChainableEvent(reduce(this._event, merge, initial))\n\t\t}\n\n\t\tlatch(): IChainableEvent<T> {\n\t\t\treturn new ChainableEvent(latch(this._event))\n\t\t}\n\n\t\ton(listener: (e: T) => any, thisArgs: any, disposables: IDisposable[]) {\n\t\t\treturn this._event(listener, thisArgs, disposables)\n\t\t}\n\n\t\tonce(listener: (e: T) => any, thisArgs: any, disposables: IDisposable[]) {\n\t\t\treturn once(this._event)(listener, thisArgs, disposables)\n\t\t}\n\t}\n\n\texport function chain<T>(event: Event<T>): IChainableEvent<T> {\n\t\treturn new ChainableEvent(event)\n\t}\n\n\texport interface NodeEventEmitter {\n\t\ton(event: string | symbol, listener: Function): this;\n\t\tremoveListener(event: string | symbol, listener: Function): this;\n\t}\n\n\texport function fromNodeEventEmitter<T>(emitter: NodeEventEmitter, eventName: string, map: (...args: any[]) => T = id => id): Event<T> {\n\t\tconst fn = (...args: any[]) => result.fire(map(...args))\n\t\tconst onFirstListenerAdd = () => emitter.on(eventName, fn)\n\t\tconst onLastListenerRemove = () => emitter.removeListener(eventName, fn)\n\t\tconst result = new Emitter<T>({ onFirstListenerAdd, onLastListenerRemove })\n\n\t\treturn result.event\n\t}\n\n\texport function fromPromise<T = any>(promise: Promise<T>): Event<undefined> {\n\t\tconst emitter = new Emitter<undefined>()\n\t\tlet shouldEmit = false\n\n\t\tpromise\n\t\t\t.then(undefined, () => null)\n\t\t\t.then(() => {\n\t\t\t\tif (!shouldEmit) {\n\t\t\t\t\tsetTimeout(() => emitter.fire(undefined), 0)\n\t\t\t\t} else {\n\t\t\t\t\temitter.fire(undefined)\n\t\t\t\t}\n\t\t\t})\n\n\t\tshouldEmit = true\n\t\treturn emitter.event\n\t}\n\n\texport function toPromise<T>(event: Event<T>): Promise<T> {\n\t\t// eslint-disable-next-line promise/param-names\n\t\treturn new Promise(c => once(event)(c))\n\t}\n}\n\ntype Listener<T> = [(e: T) => void, any] | ((e: T) => void);\n\nexport interface EmitterOptions {\n\tonFirstListenerAdd?: Function;\n\tonFirstListenerDidAdd?: Function;\n\tonListenerDidAdd?: Function;\n\tonLastListenerRemove?: Function;\n\tleakWarningThreshold?: number;\n}\n\nlet _globalLeakWarningThreshold = -1\nexport function setGlobalLeakWarningThreshold(n: number): IDisposable {\n\tconst oldValue = _globalLeakWarningThreshold\n\t_globalLeakWarningThreshold = n\n\treturn {\n\t\tdispose() {\n\t\t\t_globalLeakWarningThreshold = oldValue\n\t\t}\n\t}\n}\n\nclass LeakageMonitor {\n\tprivate _stacks: Map<string, number> | undefined\n\tprivate _warnCountdown: number = 0\n\n\tconstructor(\n\t\treadonly customThreshold?: number,\n\t\treadonly name: string = Math.random().toString(18).slice(2, 5)\n\t) { }\n\n\tdispose(): void {\n\t\tif (this._stacks) {\n\t\t\tthis._stacks.clear()\n\t\t}\n\t}\n\n\tcheck(listenerCount: number): undefined | (() => void) {\n\t\tlet threshold = _globalLeakWarningThreshold\n\t\tif (typeof this.customThreshold === 'number') {\n\t\t\tthreshold = this.customThreshold\n\t\t}\n\n\t\tif (threshold <= 0 || listenerCount < threshold) {\n\t\t\treturn undefined\n\t\t}\n\n\t\tif (!this._stacks) {\n\t\t\tthis._stacks = new Map()\n\t\t}\n\t\tconst stack = new Error().stack!.split('\\n').slice(3).join('\\n')\n\t\tconst count = (this._stacks.get(stack) || 0)\n\t\tthis._stacks.set(stack, count + 1)\n\t\tthis._warnCountdown -= 1\n\n\t\tif (this._warnCountdown <= 0) {\n\t\t\t// only warn on first exceed and then every time the limit\n\t\t\t// is exceeded by 50% again\n\t\t\tthis._warnCountdown = threshold * 0.5\n\n\t\t\t// find most frequent listener and print warning\n\t\t\tlet topStack: string\n\t\t\tlet topCount: number = 0\n\t\t\tthis._stacks.forEach((count, stack) => {\n\t\t\t\tif (!topStack || topCount < count) {\n\t\t\t\t\ttopStack = stack\n\t\t\t\t\ttopCount = count\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tconsole.warn(`[${this.name}] potential listener LEAK detected, having ${listenerCount} listeners already. MOST frequent listener (${topCount}):`)\n\t\t\tconsole.warn(topStack!)\n\t\t}\n\n\t\treturn () => {\n\t\t\tconst count = (this._stacks!.get(stack) || 0)\n\t\t\tthis._stacks!.set(stack, count - 1)\n\t\t}\n\t}\n}\n\n/**\n * The Emitter can be used to expose an Event to the public\n * to fire it from the insides.\n * Sample:\n\tclass Document {\n\n\t\tprivate _onDidChange = new Emitter<(value:string)=>any>();\n\n\t\tpublic onDidChange = this._onDidChange.event;\n\n\t\t// getter-style\n\t\t// get onDidChange(): Event<(value:string)=>any> {\n\t\t// \treturn this._onDidChange.event;\n\t\t// }\n\n\t\tprivate _doIt() {\n\t\t\t//...\n\t\t\tthis._onDidChange.fire(value);\n\t\t}\n\t}\n */\nexport class Emitter<T> {\n\tprivate static readonly _noop = function () { }\n\n\tprivate readonly _options?: EmitterOptions\n\tprivate readonly _leakageMon?: LeakageMonitor\n\tprivate _disposed: boolean = false\n\tprivate _event?: Event<T>\n\tprivate _deliveryQueue?: [Listener<T>, T][]\n\tprotected _listeners?: LinkedList<Listener<T>>\n\n\tconstructor(options?: EmitterOptions) {\n\t\tthis._options = options\n\t\tthis._leakageMon = _globalLeakWarningThreshold > 0\n\t\t\t? new LeakageMonitor(this._options && this._options.leakWarningThreshold)\n\t\t\t: undefined\n\t}\n\n\t/**\n\t * For the public to allow to subscribe\n\t * to events from this Emitter\n\t */\n\tget event(): Event<T> {\n\t\tif (!this._event) {\n\t\t\tthis._event = (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[]) => {\n\t\t\t\tif (!this._listeners) {\n\t\t\t\t\tthis._listeners = new LinkedList()\n\t\t\t\t}\n\n\t\t\t\tconst firstListener = this._listeners.isEmpty()\n\n\t\t\t\tif (firstListener && this._options && this._options.onFirstListenerAdd) {\n\t\t\t\t\tthis._options.onFirstListenerAdd(this)\n\t\t\t\t}\n\n\t\t\t\tconst remove = this._listeners.push(!thisArgs ? listener : [listener, thisArgs])\n\n\t\t\t\tif (firstListener && this._options && this._options.onFirstListenerDidAdd) {\n\t\t\t\t\tthis._options.onFirstListenerDidAdd(this)\n\t\t\t\t}\n\n\t\t\t\tif (this._options && this._options.onListenerDidAdd) {\n\t\t\t\t\tthis._options.onListenerDidAdd(this, listener, thisArgs)\n\t\t\t\t}\n\n\t\t\t\t// check and record this emitter for potential leakage\n\t\t\t\tlet removeMonitor: (() => void) | undefined\n\t\t\t\tif (this._leakageMon) {\n\t\t\t\t\tremoveMonitor = this._leakageMon.check(this._listeners.size)\n\t\t\t\t}\n\n\t\t\t\tconst result: IDisposable = {\n\t\t\t\t\tdispose: () => {\n\t\t\t\t\t\tif (removeMonitor) {\n\t\t\t\t\t\t\tremoveMonitor()\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresult.dispose = Emitter._noop\n\t\t\t\t\t\tif (!this._disposed) {\n\t\t\t\t\t\t\tremove()\n\t\t\t\t\t\t\tif (this._options && this._options.onLastListenerRemove) {\n\t\t\t\t\t\t\t\tconst hasListeners = (this._listeners && !this._listeners.isEmpty())\n\t\t\t\t\t\t\t\tif (!hasListeners) {\n\t\t\t\t\t\t\t\t\tthis._options.onLastListenerRemove(this)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (Array.isArray(disposables)) {\n\t\t\t\t\tdisposables.push(result)\n\t\t\t\t}\n\n\t\t\t\treturn result\n\t\t\t}\n\t\t}\n\t\treturn this._event\n\t}\n\n\t/**\n\t * To be kept private to fire an event to\n\t * subscribers\n\t */\n\tfire(event: T): void {\n\t\tif (this._listeners) {\n\t\t\t// put all [listener,event]-pairs into delivery queue\n\t\t\t// then emit all event. an inner/nested event might be\n\t\t\t// the driver of this\n\n\t\t\tif (!this._deliveryQueue) {\n\t\t\t\tthis._deliveryQueue = []\n\t\t\t}\n\n\t\t\tfor (let iter = this._listeners.iterator(), e = iter.next(); !e.done; e = iter.next()) {\n\t\t\t\tthis._deliveryQueue.push([e.value, event])\n\t\t\t}\n\n\t\t\twhile (this._deliveryQueue.length > 0) {\n\t\t\t\tconst [listener, event] = this._deliveryQueue.shift()!\n\t\t\t\ttry {\n\t\t\t\t\tif (typeof listener === 'function') {\n\t\t\t\t\t\t// eslint-disable-next-line no-useless-call\n\t\t\t\t\t\tlistener.call(undefined, event)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlistener[0].call(listener[1], event)\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.error(e)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tdispose() {\n\t\tif (this._listeners) {\n\t\t\tthis._listeners = undefined\n\t\t}\n\t\tif (this._deliveryQueue) {\n\t\t\tthis._deliveryQueue.length = 0\n\t\t}\n\t\tif (this._leakageMon) {\n\t\t\tthis._leakageMon.dispose()\n\t\t}\n\t\tthis._disposed = true\n\t}\n}\n\nexport interface IWaitUntil {\n\twaitUntil(thenable: Promise<any>): void;\n}\n\nexport class AsyncEmitter<T extends IWaitUntil> extends Emitter<T> {\n\tprivate _asyncDeliveryQueue?: [Listener<T>, T, Promise<any>[]][]\n\n\tasync fireAsync(eventFn: (thenables: Promise<any>[], listener: Function) => T): Promise<void> {\n\t\tif (!this._listeners) {\n\t\t\treturn\n\t\t}\n\n\t\t// put all [listener,event]-pairs into delivery queue\n\t\t// then emit all event. an inner/nested event might be\n\t\t// the driver of this\n\t\tif (!this._asyncDeliveryQueue) {\n\t\t\tthis._asyncDeliveryQueue = []\n\t\t}\n\n\t\tfor (let iter = this._listeners.iterator(), e = iter.next(); !e.done; e = iter.next()) {\n\t\t\tconst thenables: Promise<void>[] = []\n\t\t\tthis._asyncDeliveryQueue.push([e.value, eventFn(thenables, typeof e.value === 'function' ? e.value : e.value[0]), thenables])\n\t\t}\n\n\t\twhile (this._asyncDeliveryQueue.length > 0) {\n\t\t\tconst [listener, event, thenables] = this._asyncDeliveryQueue.shift()!\n\t\t\ttry {\n\t\t\t\tif (typeof listener === 'function') {\n\t\t\t\t\t// eslint-disable-next-line no-useless-call\n\t\t\t\t\tlistener.call(undefined, event)\n\t\t\t\t} else {\n\t\t\t\t\tlistener[0].call(listener[1], event)\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// freeze thenables-collection to enforce sync-calls to\n\t\t\t// wait until and then wait for all thenables to resolve\n\t\t\tObject.freeze(thenables)\n\t\t\tawait Promise.all(thenables)\n\t\t}\n\t}\n}\n\n/**\n * The EventBufferer is useful in situations in which you want\n * to delay firing your events during some code.\n * You can wrap that code and be sure that the event will not\n * be fired during that wrap.\n *\n * ```\n * const emitter: Emitter;\n * const delayer = new EventDelayer();\n * const delayedEvent = delayer.wrapEvent(emitter.event);\n *\n * delayedEvent(console.log);\n *\n * delayer.bufferEvents(() => {\n * emitter.fire(); // event will not be fired yet\n * });\n *\n * // event will only be fired at this point\n * ```\n */\nexport class EventBufferer {\n\tprivate buffers: Function[][] = []\n\n\twrapEvent<T>(event: Event<T>): Event<T> {\n\t\treturn (listener, thisArgs?, disposables?) => {\n\t\t\treturn event(i => {\n\t\t\t\tconst buffer = this.buffers[this.buffers.length - 1]\n\n\t\t\t\tif (buffer) {\n\t\t\t\t\tbuffer.push(() => listener.call(thisArgs, i))\n\t\t\t\t} else {\n\t\t\t\t\tlistener.call(thisArgs, i)\n\t\t\t\t}\n\t\t\t}, undefined, disposables)\n\t\t}\n\t}\n\n\tbufferEvents<R = void>(fn: () => R): R {\n\t\tconst buffer: Array<() => R> = []\n\t\tthis.buffers.push(buffer)\n\t\tconst r = fn()\n\t\tthis.buffers.pop()\n\t\tbuffer.forEach(flush => flush())\n\t\treturn r\n\t}\n}\n\n/**\n * A Relay is an event forwarder which functions as a replugabble event pipe.\n * Once created, you can connect an input event to it and it will simply forward\n * events from that input event through its own `event` property. The `input`\n * can be changed at any point in time.\n */\nexport class Relay<T> implements IDisposable {\n\tprivate listening = false\n\tprivate inputEvent: Event<T> = Event.None\n\tprivate inputEventListener: IDisposable = Disposable.None\n\n\tprivate emitter = new Emitter<T>({\n\t\tonFirstListenerDidAdd: () => {\n\t\t\tthis.listening = true\n\t\t\tthis.inputEventListener = this.inputEvent(this.emitter.fire, this.emitter)\n\t\t},\n\t\tonLastListenerRemove: () => {\n\t\t\tthis.listening = false\n\t\t\tthis.inputEventListener.dispose()\n\t\t}\n\t})\n\n\treadonly event: Event<T> = this.emitter.event\n\n\t// eslint-disable-next-line accessor-pairs\n\tset input(event: Event<T>) {\n\t\tthis.inputEvent = event\n\n\t\tif (this.listening) {\n\t\t\tthis.inputEventListener.dispose()\n\t\t\tthis.inputEventListener = event(this.emitter.fire, this.emitter)\n\t\t}\n\t}\n\n\tdispose() {\n\t\tthis.inputEventListener.dispose()\n\t\tthis.emitter.dispose()\n\t}\n}","/* ---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\nimport { Emitter, Event } from 'base/common/event'\nimport { IDisposable } from 'base/common/lifecycle'\n\nclass WindowManager {\n\tpublic static readonly INSTANCE = new WindowManager()\n\n\tprivate _zoomLevel = 0\n\tprivate _lastZoomLevelChangeTime = 0\n\tprivate readonly _onDidChangeZoomLevel = new Emitter<number>()\n\n\tpublic readonly onDidChangeZoomLevel: Event<number> = this._onDidChangeZoomLevel.event\n\tpublic getZoomLevel(): number {\n\t\treturn this._zoomLevel\n\t}\n\n\tpublic getTimeSinceLastZoomLevelChanged(): number {\n\t\treturn Date.now() - this._lastZoomLevelChangeTime\n\t}\n\n\tpublic setZoomLevel(zoomLevel: number, isTrusted: boolean): void {\n\t\tif (this._zoomLevel === zoomLevel) {\n\t\t\treturn\n\t\t}\n\n\t\tthis._zoomLevel = zoomLevel\n\t\t// See https://github.com/Microsoft/vscode/issues/26151\n\t\tthis._lastZoomLevelChangeTime = isTrusted ? 0 : Date.now()\n\t\tthis._onDidChangeZoomLevel.fire(this._zoomLevel)\n\t}\n\n\t// --- Zoom Factor\n\tprivate _zoomFactor = 0\n\n\tpublic getZoomFactor(): number {\n\t\treturn this._zoomFactor\n\t}\n\n\tpublic setZoomFactor(zoomFactor: number): void {\n\t\tthis._zoomFactor = zoomFactor\n\t}\n\n\t// --- Pixel Ratio\n\tpublic getPixelRatio(): number {\n\t\tconst ctx = document.createElement('canvas').getContext('2d')\n\t\tconst dpr = window.devicePixelRatio || 1\n\t\tconst bsr = (<any>ctx).webkitBackingStorePixelRatio ||\n\t\t\t(<any>ctx).mozBackingStorePixelRatio ||\n\t\t\t(<any>ctx).msBackingStorePixelRatio ||\n\t\t\t(<any>ctx).oBackingStorePixelRatio ||\n\t\t\t(<any>ctx).backingStorePixelRatio || 1\n\t\treturn dpr / bsr\n\t}\n\n\t// --- Fullscreen\n\tprivate _fullscreen = false\n\tprivate readonly _onDidChangeFullscreen = new Emitter<void>()\n\n\tpublic readonly onDidChangeFullscreen: Event<void> = this._onDidChangeFullscreen.event\n\tpublic setFullscreen(fullscreen: boolean): void {\n\t\tif (this._fullscreen === fullscreen) {\n\t\t\treturn\n\t\t}\n\n\t\tthis._fullscreen = fullscreen\n\t\tthis._onDidChangeFullscreen.fire()\n\t}\n\n\tpublic isFullscreen(): boolean {\n\t\treturn this._fullscreen\n\t}\n}\n\n/** A zoom index, e.g. 1, 2, 3 */\nexport function setZoomLevel(zoomLevel: number, isTrusted: boolean): void {\n\tWindowManager.INSTANCE.setZoomLevel(zoomLevel, isTrusted)\n}\nexport function getZoomLevel(): number {\n\treturn WindowManager.INSTANCE.getZoomLevel()\n}\n/** Returns the time (in ms) since the zoom level was changed */\nexport function getTimeSinceLastZoomLevelChanged(): number {\n\treturn WindowManager.INSTANCE.getTimeSinceLastZoomLevelChanged()\n}\nexport function onDidChangeZoomLevel(callback: (zoomLevel: number) => void): IDisposable {\n\treturn WindowManager.INSTANCE.onDidChangeZoomLevel(callback)\n}\n\n/** The zoom scale for an index, e.g. 1, 1.2, 1.4 */\nexport function getZoomFactor(): number {\n\treturn WindowManager.INSTANCE.getZoomFactor()\n}\nexport function setZoomFactor(zoomFactor: number): void {\n\tWindowManager.INSTANCE.setZoomFactor(zoomFactor)\n}\n\nexport function getPixelRatio(): number {\n\treturn WindowManager.INSTANCE.getPixelRatio()\n}\n\nexport function setFullscreen(fullscreen: boolean): void {\n\tWindowManager.INSTANCE.setFullscreen(fullscreen)\n}\nexport function isFullscreen(): boolean {\n\treturn WindowManager.INSTANCE.isFullscreen()\n}\nexport const onDidChangeFullscreen = WindowManager.INSTANCE.onDidChangeFullscreen\n\nconst userAgent = navigator.userAgent\n\nexport const isIE = (userAgent.indexOf('Trident') >= 0)\nexport const isEdge = (userAgent.indexOf('Edge/') >= 0)\nexport const isEdgeOrIE = isIE || isEdge\n\nexport const isOpera = (userAgent.indexOf('Opera') >= 0)\nexport const isFirefox = (userAgent.indexOf('Firefox') >= 0)\nexport const isWebKit = (userAgent.indexOf('AppleWebKit') >= 0)\nexport const isChrome = (userAgent.indexOf('Chrome') >= 0)\nexport const isSafari = (!isChrome && (userAgent.indexOf('Safari') >= 0))\nexport const isWebkitWebView = (!isChrome && !isSafari && isWebKit)\nexport const isIPad = (userAgent.indexOf('iPad') >= 0)\nexport const isEdgeWebView = isEdge && (userAgent.indexOf('WebView/') >= 0)\n","/* eslint-disable indent */\n/* ---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\nlet _isWindows = false\nlet _isMacintosh = false\nlet _isLinux = false\nlet _isFreeBSD = false\nlet _isNative = false\nlet _isWeb = false\n\nexport interface IProcessEnvironment {\n\t[key: string]: string;\n}\n\ninterface INodeProcess {\n\tplatform: string;\n\tenv: IProcessEnvironment;\n\tgetuid(): number;\n\tnextTick: Function;\n\tversions?: {\n\t\telectron?: string;\n\t};\n\ttype?: string;\n\n}\ndeclare let process: INodeProcess\ndeclare let global: any\n\ninterface INavigator {\n\tuserAgent: string;\n\tlanguage: string;\n}\ndeclare let navigator: INavigator\ndeclare let self: any\n\nconst isElectronRenderer = (typeof process !== 'undefined' && typeof process.versions !== 'undefined' && typeof process.versions.electron !== 'undefined' && process.type === 'renderer')\n\n// OS detection\nif (typeof navigator === 'object' && !isElectronRenderer) {\n\tconst userAgent = navigator.userAgent\n\t_isWindows = userAgent.indexOf('Windows') >= 0\n\t_isMacintosh = userAgent.indexOf('Macintosh') >= 0\n\t_isLinux = userAgent.indexOf('Linux') >= 0\n\t_isFreeBSD = userAgent.indexOf('FreeBSD') >= 0\n\t_isWeb = true\n} else if (typeof process === 'object') {\n\t_isWindows = (process.platform === 'win32')\n\t_isMacintosh = (process.platform === 'darwin')\n\t_isLinux = (process.platform === 'linux')\n\t_isFreeBSD = (process.platform === 'freebsd')\n\t_isNative = true\n}\n\nexport const enum Platform {\n\tWeb,\n\tMac,\n\tLinux,\n\tFreeBSD,\n\tWindows\n}\nexport function PlatformToString(platform: Platform) {\n\tswitch (platform) {\n\t\tcase Platform.Web: return 'Web'\n\t\tcase Platform.Mac: return 'Mac'\n\t\tcase Platform.Linux: return 'Linux'\n\t\tcase Platform.FreeBSD: return 'FreeBSD'\n\t\tcase Platform.Windows: return 'Windows'\n\t}\n}\n\nlet _platform: Platform = Platform.Web\nif (_isNative) {\n\tif (_isMacintosh) {\n\t\t_platform = Platform.Mac\n\t} else if (_isWindows) {\n\t\t_platform = Platform.Windows\n\t} else if (_isLinux) {\n\t\t_platform = Platform.Linux\n\t} else if (_isFreeBSD) {\n\t\t_platform = Platform.FreeBSD\n\t}\n}\n\nexport const isWindows = _isWindows\nexport const isMacintosh = _isMacintosh\nexport const isLinux = _isLinux\nexport const isFreeBSD = _isFreeBSD\nexport const isNative = _isNative\nexport const isWeb = _isWeb\nexport const platform = _platform\n\nexport function isRootUser(): boolean {\n\treturn _isNative && !_isWindows && (process.getuid() === 0)\n}\n\nconst g = typeof global === 'object' ? global : {} as any\nconst _globals = (typeof self === 'object' ? self : g)\nexport const globals: any = _globals\n\nlet _setImmediate: ((callback: (...args: any[]) => void) => number) | null = null\nexport function setImmediate(callback: (...args: any[]) => void): number {\n\tif (_setImmediate === null) {\n\t\tif (globals.setImmediate) {\n\t\t\t_setImmediate = globals.setImmediate.bind(globals)\n\t\t} else if (typeof process !== 'undefined' && typeof process.nextTick === 'function') {\n\t\t\t_setImmediate = process.nextTick.bind(process)\n\t\t} else {\n\t\t\t_setImmediate = globals.setTimeout.bind(globals)\n\t\t}\n\t}\n\treturn _setImmediate!(callback)\n}\n\nexport const enum OperatingSystem {\n\tWindows = 1,\n\tMacintosh = 2,\n\tLinux = 3,\n\tFreeBSD = 4\n}\n\nconst _wl = _isWindows ? OperatingSystem.Windows : OperatingSystem.Linux | OperatingSystem.FreeBSD\nexport const OS = (_isMacintosh ? OperatingSystem.Macintosh : _wl)\n\nexport const enum AccessibilitySupport {\n\t/**\n\t * This should be the browser case where it is not known if a screen reader is attached or no.\n\t */\n\tUnknown = 0,\n\tDisabled = 1,\n\tEnabled = 2\n}","/* ---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\nimport { OperatingSystem } from 'base/common/platform'\n\n/**\n * Virtual Key Codes, the value does not hold any inherent meaning.\n * Inspired somewhat from https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx\n * But these are \"more general\", as they should work across browsers & OS`s.\n */\nexport const enum KeyCode {\n\t/**\n\t * Placed first to cover the 0 value of the enum.\n\t */\n\tUnknown = 0,\n\n\tBackspace = 1,\n\tTab = 2,\n\tEnter = 3,\n\tShift = 4,\n\tCtrl = 5,\n\tAlt = 6,\n\tPauseBreak = 7,\n\tCapsLock = 8,\n\tEscape = 9,\n\tSpace = 10,\n\tPageUp = 11,\n\tPageDown = 12,\n\tEnd = 13,\n\tHome = 14,\n\tLeftArrow = 15,\n\tUpArrow = 16,\n\tRightArrow = 17,\n\tDownArrow = 18,\n\tInsert = 19,\n\tDelete = 20,\n\n\tKEY_0 = 21,\n\tKEY_1 = 22,\n\tKEY_2 = 23,\n\tKEY_3 = 24,\n\tKEY_4 = 25,\n\tKEY_5 = 26,\n\tKEY_6 = 27,\n\tKEY_7 = 28,\n\tKEY_8 = 29,\n\tKEY_9 = 30,\n\n\tKEY_A = 31,\n\tKEY_B = 32,\n\tKEY_C = 33,\n\tKEY_D = 34,\n\tKEY_E = 35,\n\tKEY_F = 36,\n\tKEY_G = 37,\n\tKEY_H = 38,\n\tKEY_I = 39,\n\tKEY_J = 40,\n\tKEY_K = 41,\n\tKEY_L = 42,\n\tKEY_M = 43,\n\tKEY_N = 44,\n\tKEY_O = 45,\n\tKEY_P = 46,\n\tKEY_Q = 47,\n\tKEY_R = 48,\n\tKEY_S = 49,\n\tKEY_T = 50,\n\tKEY_U = 51,\n\tKEY_V = 52,\n\tKEY_W = 53,\n\tKEY_X = 54,\n\tKEY_Y = 55,\n\tKEY_Z = 56,\n\n\tMeta = 57,\n\tContextMenu = 58,\n\n\tF1 = 59,\n\tF2 = 60,\n\tF3 = 61,\n\tF4 = 62,\n\tF5 = 63,\n\tF6 = 64,\n\tF7 = 65,\n\tF8 = 66,\n\tF9 = 67,\n\tF10 = 68,\n\tF11 = 69,\n\tF12 = 70,\n\tF13 = 71,\n\tF14 = 72,\n\tF15 = 73,\n\tF16 = 74,\n\tF17 = 75,\n\tF18 = 76,\n\tF19 = 77,\n\n\tNumLock = 78,\n\tScrollLock = 79,\n\n\t/**\n\t * Used for miscellaneous characters; it can vary by keyboard.\n\t * For the US standard keyboard, the ';:' key\n\t */\n\tUS_SEMICOLON = 80,\n\t/**\n\t * For any country/region, the '+' key\n\t * For the US standard keyboard, the '=+' key\n\t */\n\tUS_EQUAL = 81,\n\t/**\n\t * For any country/region, the ',' key\n\t * For the US standard keyboard, the ',<' key\n\t */\n\tUS_COMMA = 82,\n\t/**\n\t * For any country/region, the '-' key\n\t * For the US standard keyboard, the '-_' key\n\t */\n\tUS_MINUS = 83,\n\t/**\n\t * For any country/region, the '.' key\n\t * For the US standard keyboard, the '.>' key\n\t */\n\tUS_DOT = 84,\n\t/**\n\t * Used for miscellaneous characters; it can vary by keyboard.\n\t * For the US standard keyboard, the '/?' key\n\t */\n\tUS_SLASH = 85,\n\t/**\n\t * Used for miscellaneous characters; it can vary by keyboard.\n\t * For the US standard keyboard, the '`~' key\n\t */\n\tUS_BACKTICK = 86,\n\t/**\n\t * Used for miscellaneous characters; it can vary by keyboard.\n\t * For the US standard keyboard, the '[{' key\n\t */\n\tUS_OPEN_SQUARE_BRACKET = 87,\n\t/**\n\t * Used for miscellaneous characters; it can vary by keyboard.\n\t * For the US standard keyboard, the '\\|' key\n\t */\n\tUS_BACKSLASH = 88,\n\t/**\n\t * Used for miscellaneous characters; it can vary by keyboard.\n\t * For the US standard keyboard, the ']}' key\n\t */\n\tUS_CLOSE_SQUARE_BRACKET = 89,\n\t/**\n\t * Used for miscellaneous characters; it can vary by keyboard.\n\t * For the US standard keyboard, the ''\"' key\n\t */\n\tUS_QUOTE = 90,\n\t/**\n\t * Used for miscellaneous characters; it can vary by keyboard.\n\t */\n\tOEM_8 = 91,\n\t/**\n\t * Either the angle bracket key or the backslash key on the RT 102-key keyboard.\n\t */\n\tOEM_102 = 92,\n\n\tNUMPAD_0 = 93, // VK_NUMPAD0, 0x60, Numeric keypad 0 key\n\tNUMPAD_1 = 94, // VK_NUMPAD1, 0x61, Numeric keypad 1 key\n\tNUMPAD_2 = 95, // VK_NUMPAD2, 0x62, Numeric keypad 2 key\n\tNUMPAD_3 = 96, // VK_NUMPAD3, 0x63, Numeric keypad 3 key\n\tNUMPAD_4 = 97, // VK_NUMPAD4, 0x64, Numeric keypad 4 key\n\tNUMPAD_5 = 98, // VK_NUMPAD5, 0x65, Numeric keypad 5 key\n\tNUMPAD_6 = 99, // VK_NUMPAD6, 0x66, Numeric keypad 6 key\n\tNUMPAD_7 = 100, // VK_NUMPAD7, 0x67, Numeric keypad 7 key\n\tNUMPAD_8 = 101, // VK_NUMPAD8, 0x68, Numeric keypad 8 key\n\tNUMPAD_9 = 102, // VK_NUMPAD9, 0x69, Numeric keypad 9 key\n\n\tNUMPAD_MULTIPLY = 103,\t// VK_MULTIPLY, 0x6A, Multiply key\n\tNUMPAD_ADD = 104,\t\t// VK_ADD, 0x6B, Add key\n\tNUMPAD_SEPARATOR = 105,\t// VK_SEPARATOR, 0x6C, Separator key\n\tNUMPAD_SUBTRACT = 106,\t// VK_SUBTRACT, 0x6D, Subtract key\n\tNUMPAD_DECIMAL = 107,\t// VK_DECIMAL, 0x6E, Decimal key\n\tNUMPAD_DIVIDE = 108,\t// VK_DIVIDE, 0x6F,\n\n\t/**\n\t * Cover all key codes when IME is processing input.\n\t */\n\tKEY_IN_COMPOSITION = 109,\n\n\tABNT_C1 = 110, // Brazilian (ABNT) Keyboard\n\tABNT_C2 = 111, // Brazilian (ABNT) Keyboard\n\n\t/**\n\t * Placed last to cover the length of the enum.\n\t * Please do not depend on this value!\n\t */\n\tMAX_VALUE\n}\n\n/**\n * keyboardEvent.code\n */\nexport const enum ScanCode {\n\tDependsOnKbLayout = -1,\n\tNone,\n\tHyper,\n\tSuper,\n\tFn,\n\tFnLock,\n\tSuspend,\n\tResume,\n\tTurbo,\n\tSleep,\n\tWakeUp,\n\tKeyA,\n\tKeyB,\n\tKeyC,\n\tKeyD,\n\tKeyE,\n\tKeyF,\n\tKeyG,\n\tKeyH,\n\tKeyI,\n\tKeyJ,\n\tKeyK,\n\tKeyL,\n\tKeyM,\n\tKeyN,\n\tKeyO,\n\tKeyP,\n\tKeyQ,\n\tKeyR,\n\tKeyS,\n\tKeyT,\n\tKeyU,\n\tKeyV,\n\tKeyW,\n\tKeyX,\n\tKeyY,\n\tKeyZ,\n\tDigit1,\n\tDigit2,\n\tDigit3,\n\tDigit4,\n\tDigit5,\n\tDigit6,\n\tDigit7,\n\tDigit8,\n\tDigit9,\n\tDigit0,\n\tEnter,\n\tEscape,\n\tBackspace,\n\tTab,\n\tSpace,\n\tMinus,\n\tEqual,\n\tBracketLeft,\n\tBracketRight,\n\tBackslash,\n\tIntlHash,\n\tSemicolon,\n\tQuote,\n\tBackquote,\n\tComma,\n\tPeriod,\n\tSlash,\n\tCapsLock,\n\tF1,\n\tF2,\n\tF3,\n\tF4,\n\tF5,\n\tF6,\n\tF7,\n\tF8,\n\tF9,\n\tF10,\n\tF11,\n\tF12,\n\tPrintScreen,\n\tScrollLock,\n\tPause,\n\tInsert,\n\tHome,\n\tPageUp,\n\tDelete,\n\tEnd,\n\tPageDown,\n\tArrowRight,\n\tArrowLeft,\n\tArrowDown,\n\tArrowUp,\n\tNumLock,\n\tNumpadDivide,\n\tNumpadMultiply,\n\tNumpadSubtract,\n\tNumpadAdd,\n\tNumpadEnter,\n\tNumpad1,\n\tNumpad2,\n\tNumpad3,\n\tNumpad4,\n\tNumpad5,\n\tNumpad6,\n\tNumpad7,\n\tNumpad8,\n\tNumpad9,\n\tNumpad0,\n\tNumpadDecimal,\n\tIntlBackslash,\n\tContextMenu,\n\tPower,\n\tNumpadEqual,\n\tF13,\n\tF14,\n\tF15,\n\tF16,\n\tF17,\n\tF18,\n\tF19,\n\tF20,\n\tF21,\n\tF22,\n\tF23,\n\tF24,\n\tOpen,\n\tHelp,\n\tSelect,\n\tAgain,\n\tUndo,\n\tCut,\n\tCopy,\n\tPaste,\n\tFind,\n\tAudioVolumeMute,\n\tAudioVolumeUp,\n\tAudioVolumeDown,\n\tNumpadComma,\n\tIntlRo,\n\tKanaMode,\n\tIntlYen,\n\tConvert,\n\tNonConvert,\n\tLang1,\n\tLang2,\n\tLang3,\n\tLang4,\n\tLang5,\n\tAbort,\n\tProps,\n\tNumpadParenLeft,\n\tNumpadParenRight,\n\tNumpadBackspace,\n\tNumpadMemoryStore,\n\tNumpadMemoryRecall,\n\tNumpadMemoryClear,\n\tNumpadMemoryAdd,\n\tNumpadMemorySubtract,\n\tNumpadClear,\n\tNumpadClearEntry,\n\tControlLeft,\n\tShiftLeft,\n\tAltLeft,\n\tMetaLeft,\n\tControlRight,\n\tShiftRight,\n\tAltRight,\n\tMetaRight,\n\tBrightnessUp,\n\tBrightnessDown,\n\tMediaPlay,\n\tMediaRecord,\n\tMediaFastForward,\n\tMediaRewind,\n\tMediaTrackNext,\n\tMediaTrackPrevious,\n\tMediaStop,\n\tEject,\n\tMediaPlayPause,\n\tMediaSelect,\n\tLaunchMail,\n\tLaunchApp2,\n\tLaunchApp1,\n\tSelectTask,\n\tLaunchScreenSaver,\n\tBrowserSearch,\n\tBrowserHome,\n\tBrowserBack,\n\tBrowserForward,\n\tBrowserStop,\n\tBrowserRefresh,\n\tBrowserFavorites,\n\tZoomToggle,\n\tMailReply,\n\tMailForward,\n\tMailSend,\n\n\tMAX_VALUE\n}\n\nclass KeyCodeStrMap {\n\tprivate _keyCodeToStr: string[]\n\tprivate _strToKeyCode: { [str: string]: KeyCode; }\n\n\tconstructor() {\n\t\tthis._keyCodeToStr = []\n\t\tthis._strToKeyCode = Object.create(null)\n\t}\n\n\tdefine(keyCode: KeyCode, str: string): void {\n\t\tthis._keyCodeToStr[keyCode] = str\n\t\tthis._strToKeyCode[str.toLowerCase()] = keyCode\n\t}\n\n\tkeyCodeToStr(keyCode: KeyCode): string {\n\t\treturn this._keyCodeToStr[keyCode]\n\t}\n\n\tstrToKeyCode(str: string): KeyCode {\n\t\treturn this._strToKeyCode[str.toLowerCase()] || KeyCode.Unknown\n\t}\n}\n\nconst scanCodeIntToStr: string[] = [];\nconst scanCodeStrToInt: { [code: string]: number } = Object.create(null);\nconst scanCodeLowerCaseStrToInt: { [code: string]: number } = Object.create(null);\n\nexport const ScanCodeUtils = {\n\tlowerCaseToEnum: (scanCode: string) => scanCodeLowerCaseStrToInt[scanCode] || ScanCode.None,\n\ttoEnum: (scanCode: string) => scanCodeStrToInt[scanCode] || ScanCode.None,\n\ttoString: (scanCode: ScanCode) => scanCodeIntToStr[scanCode] || 'None'\n};\n\nconst uiMap = new KeyCodeStrMap()\nconst userSettingsUSMap = new KeyCodeStrMap()\nconst userSettingsGeneralMap = new KeyCodeStrMap();\n\n(function () {\n\tfunction define(keyCode: KeyCode, uiLabel: string, usUserSettingsLabel: string = uiLabel, generalUserSettingsLabel: string = usUserSettingsLabel): void {\n\t\tuiMap.define(keyCode, uiLabel)\n\t\tuserSettingsUSMap.define(keyCode, usUserSettingsLabel)\n\t\tuserSettingsGeneralMap.define(keyCode, generalUserSettingsLabel)\n\t}\n\n\tdefine(KeyCode.Unknown, 'unknown')\n\n\tdefine(KeyCode.Backspace, 'Backspace')\n\tdefine(KeyCode.Tab, 'Tab')\n\tdefine(KeyCode.Enter, 'Enter')\n\tdefine(KeyCode.Shift, 'Shift')\n\tdefine(KeyCode.Ctrl, 'Ctrl')\n\tdefine(KeyCode.Alt, 'Alt')\n\tdefine(KeyCode.PauseBreak, 'PauseBreak')\n\tdefine(KeyCode.CapsLock, 'CapsLock')\n\tdefine(KeyCode.Escape, 'Escape')\n\tdefine(KeyCode.Space, 'Space')\n\tdefine(KeyCode.PageUp, 'PageUp')\n\tdefine(KeyCode.PageDown, 'PageDown')\n\tdefine(KeyCode.End, 'End')\n\tdefine(KeyCode.Home, 'Home')\n\n\tdefine(KeyCode.LeftArrow, 'LeftArrow', 'Left')\n\tdefine(KeyCode.UpArrow, 'UpArrow', 'Up')\n\tdefine(KeyCode.RightArrow, 'RightArrow', 'Right')\n\tdefine(KeyCode.DownArrow, 'DownArrow', 'Down')\n\tdefine(KeyCode.Insert, 'Insert')\n\tdefine(KeyCode.Delete, 'Delete')\n\n\tdefine(KeyCode.KEY_0, '0')\n\tdefine(KeyCode.KEY_1, '1')\n\tdefine(KeyCode.KEY_2, '2')\n\tdefine(KeyCode.KEY_3, '3')\n\tdefine(KeyCode.KEY_4, '4')\n\tdefine(KeyCode.KEY_5, '5')\n\tdefine(KeyCode.KEY_6, '6')\n\tdefine(KeyCode.KEY_7, '7')\n\tdefine(KeyCode.KEY_8, '8')\n\tdefine(KeyCode.KEY_9, '9')\n\n\tdefine(KeyCode.KEY_A, 'A')\n\tdefine(KeyCode.KEY_B, 'B')\n\tdefine(KeyCode.KEY_C, 'C')\n\tdefine(KeyCode.KEY_D, 'D')\n\tdefine(KeyCode.KEY_E, 'E')\n\tdefine(KeyCode.KEY_F, 'F')\n\tdefine(KeyCode.KEY_G, 'G')\n\tdefine(KeyCode.KEY_H, 'H')\n\tdefine(KeyCode.KEY_I, 'I')\n\tdefine(KeyCode.KEY_J, 'J')\n\tdefine(KeyCode.KEY_K, 'K')\n\tdefine(KeyCode.KEY_L, 'L')\n\tdefine(KeyCode.KEY_M, 'M')\n\tdefine(KeyCode.KEY_N, 'N')\n\tdefine(KeyCode.KEY_O, 'O')\n\tdefine(KeyCode.KEY_P, 'P')\n\tdefine(KeyCode.KEY_Q, 'Q')\n\tdefine(KeyCode.KEY_R, 'R')\n\tdefine(KeyCode.KEY_S, 'S')\n\tdefine(KeyCode.KEY_T, 'T')\n\tdefine(KeyCode.KEY_U, 'U')\n\tdefine(KeyCode.KEY_V, 'V')\n\tdefine(KeyCode.KEY_W, 'W')\n\tdefine(KeyCode.KEY_X, 'X')\n\tdefine(KeyCode.KEY_Y, 'Y')\n\tdefine(KeyCode.KEY_Z, 'Z')\n\n\tdefine(KeyCode.Meta, 'Meta')\n\tdefine(KeyCode.ContextMenu, 'ContextMenu')\n\n\tdefine(KeyCode.F1, 'F1')\n\tdefine(KeyCode.F2, 'F2')\n\tdefine(KeyCode.F3, 'F3')\n\tdefine(KeyCode.F4, 'F4')\n\tdefine(KeyCode.F5, 'F5')\n\tdefine(KeyCode.F6, 'F6')\n\tdefine(KeyCode.F7, 'F7')\n\tdefine(KeyCode.F8, 'F8')\n\tdefine(KeyCode.F9, 'F9')\n\tdefine(KeyCode.F10, 'F10')\n\tdefine(KeyCode.F11, 'F11')\n\tdefine(KeyCode.F12, 'F12')\n\tdefine(KeyCode.F13, 'F13')\n\tdefine(KeyCode.F14, 'F14')\n\tdefine(KeyCode.F15, 'F15')\n\tdefine(KeyCode.F16, 'F16')\n\tdefine(KeyCode.F17, 'F17')\n\tdefine(KeyCode.F18, 'F18')\n\tdefine(KeyCode.F19, 'F19')\n\n\tdefine(KeyCode.NumLock, 'NumLock')\n\tdefine(KeyCode.ScrollLock, 'ScrollLock')\n\n\tdefine(KeyCode.US_SEMICOLON, ';', ';', 'OEM_1')\n\tdefine(KeyCode.US_EQUAL, '=', '=', 'OEM_PLUS')\n\tdefine(KeyCode.US_COMMA, ',', ',', 'OEM_COMMA')\n\tdefine(KeyCode.US_MINUS, '-', '-', 'OEM_MINUS')\n\tdefine(KeyCode.US_DOT, '.', '.', 'OEM_PERIOD')\n\tdefine(KeyCode.US_SLASH, '/', '/', 'OEM_2')\n\tdefine(KeyCode.US_BACKTICK, '`', '`', 'OEM_3')\n\tdefine(KeyCode.ABNT_C1, 'ABNT_C1')\n\tdefine(KeyCode.ABNT_C2, 'ABNT_C2')\n\tdefine(KeyCode.US_OPEN_SQUARE_BRACKET, '[', '[', 'OEM_4')\n\tdefine(KeyCode.US_BACKSLASH, '\\\\', '\\\\', 'OEM_5')\n\tdefine(KeyCode.US_CLOSE_SQUARE_BRACKET, ']', ']', 'OEM_6')\n\tdefine(KeyCode.US_QUOTE, '\\'', '\\'', 'OEM_7')\n\tdefine(KeyCode.OEM_8, 'OEM_8')\n\tdefine(KeyCode.OEM_102, 'OEM_102')\n\n\tdefine(KeyCode.NUMPAD_0, 'NumPad0')\n\tdefine(KeyCode.NUMPAD_1, 'NumPad1')\n\tdefine(KeyCode.NUMPAD_2, 'NumPad2')\n\tdefine(KeyCode.NUMPAD_3, 'NumPad3')\n\tdefine(KeyCode.NUMPAD_4, 'NumPad4')\n\tdefine(KeyCode.NUMPAD_5, 'NumPad5')\n\tdefine(KeyCode.NUMPAD_6, 'NumPad6')\n\tdefine(KeyCode.NUMPAD_7, 'NumPad7')\n\tdefine(KeyCode.NUMPAD_8, 'NumPad8')\n\tdefine(KeyCode.NUMPAD_9, 'NumPad9')\n\n\tdefine(KeyCode.NUMPAD_MULTIPLY, 'NumPad_Multiply')\n\tdefine(KeyCode.NUMPAD_ADD, 'NumPad_Add')\n\tdefine(KeyCode.NUMPAD_SEPARATOR, 'NumPad_Separator')\n\tdefine(KeyCode.NUMPAD_SUBTRACT, 'NumPad_Subtract')\n\tdefine(KeyCode.NUMPAD_DECIMAL, 'NumPad_Decimal')\n\tdefine(KeyCode.NUMPAD_DIVIDE, 'NumPad_Divide')\n})()\n\nexport namespace KeyCodeUtils {\n\texport function toString(keyCode: KeyCode): string {\n\t\treturn uiMap.keyCodeToStr(keyCode)\n\t}\n\texport function fromString(key: string): KeyCode {\n\t\treturn uiMap.strToKeyCode(key)\n\t}\n\n\texport function toUserSettingsUS(keyCode: KeyCode): string {\n\t\treturn userSettingsUSMap.keyCodeToStr(keyCode)\n\t}\n\texport function toUserSettingsGeneral(keyCode: KeyCode): string {\n\t\treturn userSettingsGeneralMap.keyCodeToStr(keyCode)\n\t}\n\texport function fromUserSettings(key: string): KeyCode {\n\t\treturn userSettingsUSMap.strToKeyCode(key) || userSettingsGeneralMap.strToKeyCode(key)\n\t}\n}\n\n/**\n * Binary encoding strategy:\n * ```\n * 1111 11\n * 5432 1098 7654 3210\n * ---- CSAW KKKK KKKK\n * C = bit 11 = ctrlCmd flag\n * S = bit 10 = shift flag\n * A = bit 9 = alt flag\n * W = bit 8 = winCtrl flag\n * K = bits 0-7 = key code\n * ```\n */\nconst enum BinaryKeybindingsMask {\n\tCtrlCmd = (1 << 11) >>> 0,\n\tShift = (1 << 10) >>> 0,\n\tAlt = (1 << 9) >>> 0,\n\tWinCtrl = (1 << 8) >>> 0,\n\tKeyCode = 0x000000FF\n}\n\nexport const enum KeyMod {\n\tCtrlCmd = (1 << 11) >>> 0,\n\tShift = (1 << 10) >>> 0,\n\tAlt = (1 << 9) >>> 0,\n\tWinCtrl = (1 << 8) >>> 0,\n}\n\nexport function KeyChord(firstPart: number, secondPart: number): number {\n\tconst chordPart = ((secondPart & 0x0000FFFF) << 16) >>> 0\n\treturn (firstPart | chordPart) >>> 0\n}\n\nexport const enum KeybindingType {\n\tSimple = 1,\n\tChord = 2\n}\n\nexport class SimpleKeybinding {\n\tpublic readonly type = KeybindingType.Simple\n\n\tpublic readonly ctrlKey: boolean\n\tpublic readonly shiftKey: boolean\n\tpublic readonly altKey: boolean\n\tpublic readonly metaKey: boolean\n\tpublic readonly keyCode: KeyCode\n\n\tconstructor(ctrlKey: boolean, shiftKey: boolean, altKey: boolean, metaKey: boolean, keyCode: KeyCode) {\n\t\tthis.ctrlKey = ctrlKey\n\t\tthis.shiftKey = shiftKey\n\t\tthis.altKey = altKey\n\t\tthis.metaKey = metaKey\n\t\tthis.keyCode = keyCode\n\t}\n\n\t// eslint-disable-next-line no-use-before-define\n\tpublic equals(other: Keybinding): boolean {\n\t\tif (other.type !== KeybindingType.Simple) {\n\t\t\treturn false\n\t\t}\n\t\treturn (\n\t\t\tthis.ctrlKey === other.ctrlKey &&\n\t\t\tthis.shiftKey === other.shiftKey &&\n\t\t\tthis.altKey === other.altKey &&\n\t\t\tthis.metaKey === other.metaKey &&\n\t\t\tthis.keyCode === other.keyCode\n\t\t)\n\t}\n\n\tpublic getHashCode(): string {\n\t\tconst ctrl = this.ctrlKey ? '1' : '0'\n\t\tconst shift = this.shiftKey ? '1' : '0'\n\t\tconst alt = this.altKey ? '1' : '0'\n\t\tconst meta = this.metaKey ? '1' : '0'\n\t\treturn `${ctrl}${shift}${alt}${meta}${this.keyCode}`\n\t}\n\n\tpublic isModifierKey(): boolean {\n\t\treturn (\n\t\t\tthis.keyCode === KeyCode.Unknown ||\n\t\t\tthis.keyCode === KeyCode.Ctrl ||\n\t\t\tthis.keyCode === KeyCode.Meta ||\n\t\t\tthis.keyCode === KeyCode.Alt ||\n\t\t\tthis.keyCode === KeyCode.Shift\n\t\t)\n\t}\n\n\t/**\n\t * Does this keybinding refer to the key code of a modifier and it also has the modifier flag?\n\t */\n\tpublic isDuplicateModifierCase(): boolean {\n\t\treturn (\n\t\t\t(this.ctrlKey && this.keyCode === KeyCode.Ctrl) ||\n\t\t\t(this.shiftKey && this.keyCode === KeyCode.Shift) ||\n\t\t\t(this.altKey && this.keyCode === KeyCode.Alt) ||\n\t\t\t(this.metaKey && this.keyCode === KeyCode.Meta)\n\t\t)\n\t}\n}\n\nexport class ChordKeybinding {\n\tpublic readonly type = KeybindingType.Chord\n\n\tpublic readonly firstPart: SimpleKeybinding\n\tpublic readonly chordPart: SimpleKeybinding\n\n\tconstructor(firstPart: SimpleKeybinding, chordPart: SimpleKeybinding) {\n\t\tthis.firstPart = firstPart\n\t\tthis.chordPart = chordPart\n\t}\n\n\tpublic getHashCode(): string {\n\t\treturn `${this.firstPart.getHashCode()};${this.chordPart.getHashCode()}`\n\t}\n}\n\nexport type Keybinding = SimpleKeybinding | ChordKeybinding;\n\nexport function createKeybinding(keybinding: number, OS: OperatingSystem): Keybinding | null {\n\tif (keybinding === 0) {\n\t\treturn null\n\t}\n\tconst firstPart = (keybinding & 0x0000FFFF) >>> 0\n\tconst chordPart = (keybinding & 0xFFFF0000) >>> 16\n\tif (chordPart !== 0) {\n\t\treturn new ChordKeybinding(\n\t\t\tcreateSimpleKeybinding(firstPart, OS),\n\t\t\tcreateSimpleKeybinding(chordPart, OS)\n\t\t)\n\t}\n\treturn createSimpleKeybinding(firstPart, OS)\n}\n\nexport function createSimpleKeybinding(keybinding: number, OS: OperatingSystem): SimpleKeybinding {\n\tconst ctrlCmd = (!!(keybinding & BinaryKeybindingsMask.CtrlCmd))\n\tconst winCtrl = (!!(keybinding & BinaryKeybindingsMask.WinCtrl))\n\n\tconst ctrlKey = (OS === OperatingSystem.Macintosh ? winCtrl : ctrlCmd)\n\tconst shiftKey = (!!(keybinding & BinaryKeybindingsMask.Shift))\n\tconst altKey = (!!(keybinding & BinaryKeybindingsMask.Alt))\n\tconst metaKey = (OS === OperatingSystem.Macintosh ? ctrlCmd : winCtrl)\n\tconst keyCode = (keybinding & BinaryKeybindingsMask.KeyCode)\n\n\treturn new SimpleKeybinding(ctrlKey, shiftKey, altKey, metaKey, keyCode)\n}\n\nexport class ResolvedKeybindingPart {\n\treadonly ctrlKey: boolean\n\treadonly shiftKey: boolean\n\treadonly altKey: boolean\n\treadonly metaKey: boolean\n\n\treadonly keyLabel: string | null\n\treadonly keyAriaLabel: string | null\n\n\tconstructor(ctrlKey: boolean, shiftKey: boolean, altKey: boolean, metaKey: boolean, kbLabel: string | null, kbAriaLabel: string | null) {\n\t\tthis.ctrlKey = ctrlKey\n\t\tthis.shiftKey = shiftKey\n\t\tthis.altKey = altKey\n\t\tthis.metaKey = metaKey\n\t\tthis.keyLabel = kbLabel\n\t\tthis.keyAriaLabel = kbAriaLabel\n\t}\n}\n\n/**\n * A resolved keybinding. Can be a simple keybinding or a chord keybinding.\n */\nexport abstract class ResolvedKeybinding {\n\t/**\n\t * This prints the binding in a format suitable for displaying in the UI.\n\t */\n\tpublic abstract getLabel(): string | null;\n\t/**\n * This prints the binding in a format suitable for ARIA.\n */\n\tpublic abstract getAriaLabel(): string | null;\n\t/**\n * This prints the binding in a format suitable for electron's accelerators.\n * See https://github.com/electron/electron/blob/master/docs/api/accelerator.md\n */\n\tpublic abstract getElectronAccelerator(): string | null;\n\t/**\n * This prints the binding in a format suitable for user settings.\n */\n\tpublic abstract getUserSettingsLabel(): string | null;\n\t/**\n * Is the user settings label reflecting the label?\n */\n\tpublic abstract isWYSIWYG(): boolean;\n\n\t/**\n * Is the binding a chord?\n */\n\tpublic abstract isChord(): boolean;\n\n\t/**\n * Returns the firstPart, chordPart that should be used for dispatching.\n */\n\tpublic abstract getDispatchParts(): [string | null, string | null];\n\t/**\n * Returns the firstPart, chordPart of the keybinding.\n * For simple keybindings, the second element will be null.\n */\n\tpublic abstract getParts(): [ResolvedKeybindingPart, ResolvedKeybindingPart | null];\n}","/* ---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\nimport { KeyCode, KeyCodeUtils, KeyMod, SimpleKeybinding } from 'base/common/keyCodes'\nimport * as platform from 'base/common/platform'\n\nconst KEY_CODE_MAP: { [keyCode: number]: KeyCode } = new Array(230)\nconst INVERSE_KEY_CODE_MAP: KeyCode[] = new Array(KeyCode.MAX_VALUE);\n\n(function () {\n\tfor (let i = 0; i < INVERSE_KEY_CODE_MAP.length; i++) {\n\t\tINVERSE_KEY_CODE_MAP[i] = 0\n\t}\n\n\tfunction define(code: number, keyCode: KeyCode): void {\n\t\tKEY_CODE_MAP[code] = keyCode\n\t\tINVERSE_KEY_CODE_MAP[keyCode] = code\n\t}\n\n\tdefine(3, KeyCode.PauseBreak) // VK_CANCEL 0x03 Control-break processing\n\tdefine(8, KeyCode.Backspace)\n\tdefine(9, KeyCode.Tab)\n\tdefine(13, KeyCode.Enter)\n\tdefine(16, KeyCode.Shift)\n\tdefine(17, KeyCode.Ctrl)\n\tdefine(18, KeyCode.Alt)\n\tdefine(19, KeyCode.PauseBreak)\n\tdefine(20, KeyCode.CapsLock)\n\tdefine(27, KeyCode.Escape)\n\tdefine(32, KeyCode.Space)\n\tdefine(33, KeyCode.PageUp)\n\tdefine(34, KeyCode.PageDown)\n\tdefine(35, KeyCode.End)\n\tdefine(36, KeyCode.Home)\n\tdefine(37, KeyCode.LeftArrow)\n\tdefine(38, KeyCode.UpArrow)\n\tdefine(39, KeyCode.RightArrow)\n\tdefine(40, KeyCode.DownArrow)\n\tdefine(45, KeyCode.Insert)\n\tdefine(46, KeyCode.Delete)\n\n\tdefine(48, KeyCode.KEY_0)\n\tdefine(49, KeyCode.KEY_1)\n\tdefine(50, KeyCode.KEY_2)\n\tdefine(51, KeyCode.KEY_3)\n\tdefine(52, KeyCode.KEY_4)\n\tdefine(53, KeyCode.KEY_5)\n\tdefine(54, KeyCode.KEY_6)\n\tdefine(55, KeyCode.KEY_7)\n\tdefine(56, KeyCode.KEY_8)\n\tdefine(57, KeyCode.KEY_9)\n\n\tdefine(65, KeyCode.KEY_A)\n\tdefine(66, KeyCode.KEY_B)\n\tdefine(67, KeyCode.KEY_C)\n\tdefine(68, KeyCode.KEY_D)\n\tdefine(69, KeyCode.KEY_E)\n\tdefine(70, KeyCode.KEY_F)\n\tdefine(71, KeyCode.KEY_G)\n\tdefine(72, KeyCode.KEY_H)\n\tdefine(73, KeyCode.KEY_I)\n\tdefine(74, KeyCode.KEY_J)\n\tdefine(75, KeyCode.KEY_K)\n\tdefine(76, KeyCode.KEY_L)\n\tdefine(77, KeyCode.KEY_M)\n\tdefine(78, KeyCode.KEY_N)\n\tdefine(79, KeyCode.KEY_O)\n\tdefine(80, KeyCode.KEY_P)\n\tdefine(81, KeyCode.KEY_Q)\n\tdefine(82, KeyCode.KEY_R)\n\tdefine(83, KeyCode.KEY_S)\n\tdefine(84, KeyCode.KEY_T)\n\tdefine(85, KeyCode.KEY_U)\n\tdefine(86, KeyCode.KEY_V)\n\tdefine(87, KeyCode.KEY_W)\n\tdefine(88, KeyCode.KEY_X)\n\tdefine(89, KeyCode.KEY_Y)\n\tdefine(90, KeyCode.KEY_Z)\n\n\tdefine(93, KeyCode.ContextMenu)\n\n\tdefine(96, KeyCode.NUMPAD_0)\n\tdefine(97, KeyCode.NUMPAD_1)\n\tdefine(98, KeyCode.NUMPAD_2)\n\tdefine(99, KeyCode.NUMPAD_3)\n\tdefine(100, KeyCode.NUMPAD_4)\n\tdefine(101, KeyCode.NUMPAD_5)\n\tdefine(102, KeyCode.NUMPAD_6)\n\tdefine(103, KeyCode.NUMPAD_7)\n\tdefine(104, KeyCode.NUMPAD_8)\n\tdefine(105, KeyCode.NUMPAD_9)\n\tdefine(106, KeyCode.NUMPAD_MULTIPLY)\n\tdefine(107, KeyCode.NUMPAD_ADD)\n\tdefine(108, KeyCode.NUMPAD_SEPARATOR)\n\tdefine(109, KeyCode.NUMPAD_SUBTRACT)\n\tdefine(110, KeyCode.NUMPAD_DECIMAL)\n\tdefine(111, KeyCode.NUMPAD_DIVIDE)\n\n\tdefine(112, KeyCode.F1)\n\tdefine(113, KeyCode.F2)\n\tdefine(114, KeyCode.F3)\n\tdefine(115, KeyCode.F4)\n\tdefine(116, KeyCode.F5)\n\tdefine(117, KeyCode.F6)\n\tdefine(118, KeyCode.F7)\n\tdefine(119, KeyCode.F8)\n\tdefine(120, KeyCode.F9)\n\tdefine(121, KeyCode.F10)\n\tdefine(122, KeyCode.F11)\n\tdefine(123, KeyCode.F12)\n\tdefine(124, KeyCode.F13)\n\tdefine(125, KeyCode.F14)\n\tdefine(126, KeyCode.F15)\n\tdefine(127, KeyCode.F16)\n\tdefine(128, KeyCode.F17)\n\tdefine(129, KeyCode.F18)\n\tdefine(130, KeyCode.F19)\n\n\tdefine(144, KeyCode.NumLock)\n\tdefine(145, KeyCode.ScrollLock)\n\n\tdefine(186, KeyCode.US_SEMICOLON)\n\tdefine(187, KeyCode.US_EQUAL)\n\tdefine(188, KeyCode.US_COMMA)\n\tdefine(189, KeyCode.US_MINUS)\n\tdefine(190, KeyCode.US_DOT)\n\tdefine(191, KeyCode.US_SLASH)\n\tdefine(192, KeyCode.US_BACKTICK)\n\tdefine(193, KeyCode.ABNT_C1)\n\tdefine(194, KeyCode.ABNT_C2)\n\tdefine(219, KeyCode.US_OPEN_SQUARE_BRACKET)\n\tdefine(220, KeyCode.US_BACKSLASH)\n\tdefine(221, KeyCode.US_CLOSE_SQUARE_BRACKET)\n\tdefine(222, KeyCode.US_QUOTE)\n\tdefine(223, KeyCode.OEM_8)\n\n\tdefine(226, KeyCode.OEM_102)\n\n\t/**\n\t * https://lists.w3.org/Archives/Public/www-dom/2010JulSep/att-0182/keyCode-spec.html\n\t * If an Input Method Editor is processing key input and the event is keydown, return 229.\n\t */\n\tdefine(229, KeyCode.KEY_IN_COMPOSITION)\n\n\tdefine(91, KeyCode.Meta)\n\tif (platform.isMacintosh) {\n\t\t// the two meta keys in the Mac have different key codes (91 and 93)\n\t\tdefine(93, KeyCode.Meta)\n\t} else {\n\t\tdefine(92, KeyCode.Meta)\n\t}\n})()\n\nfunction extractKeyCode(e: KeyboardEvent): KeyCode {\n\tif (e.charCode) {\n\t\t// \"keypress\" events mostly\n\t\tconst char = String.fromCharCode(e.charCode).toUpperCase()\n\t\treturn KeyCodeUtils.fromString(char)\n\t}\n\treturn KEY_CODE_MAP[e.keyCode] || KeyCode.Unknown\n}\n\nexport function getCodeForKeyCode(keyCode: KeyCode): number {\n\treturn INVERSE_KEY_CODE_MAP[keyCode]\n}\n\nexport interface IKeyboardEvent {\n\treadonly browserEvent: KeyboardEvent;\n\treadonly target: HTMLElement;\n\n\treadonly ctrlKey: boolean;\n\treadonly shiftKey: boolean;\n\treadonly altKey: boolean;\n\treadonly metaKey: boolean;\n\treadonly keyCode: KeyCode;\n\treadonly code: string;\n\n\t/**\n\t * @internal\n\t */\n\ttoKeybinding(): SimpleKeybinding;\n\tequals(keybinding: number): boolean;\n\n\tpreventDefault(): void;\n\tstopPropagation(): void;\n}\n\nconst ctrlKeyMod = (platform.isMacintosh ? KeyMod.WinCtrl : KeyMod.CtrlCmd)\nconst altKeyMod = KeyMod.Alt\nconst shiftKeyMod = KeyMod.Shift\nconst metaKeyMod = (platform.isMacintosh ? KeyMod.CtrlCmd : KeyMod.WinCtrl)\n\nexport class StandardKeyboardEvent implements IKeyboardEvent {\n\tpublic readonly browserEvent: KeyboardEvent\n\tpublic readonly target: HTMLElement\n\n\tpublic readonly ctrlKey: boolean\n\tpublic readonly shiftKey: boolean\n\tpublic readonly altKey: boolean\n\tpublic readonly metaKey: boolean\n\tpublic readonly keyCode: KeyCode\n\tpublic readonly code: string\n\n\tprivate _asKeybinding: number\n\tprivate _asRuntimeKeybinding: SimpleKeybinding\n\n\tconstructor(source: KeyboardEvent) {\n\t\tconst e = source\n\n\t\tthis.browserEvent = e\n\t\tthis.target = <HTMLElement>e.target\n\n\t\tthis.ctrlKey = e.ctrlKey\n\t\tthis.shiftKey = e.shiftKey\n\t\tthis.altKey = e.altKey\n\t\tthis.metaKey = e.metaKey\n\t\tthis.keyCode = extractKeyCode(e)\n\t\tthis.code = e.code\n\n\t\t// console.info(e.type + \": keyCode: \" + e.keyCode + \", which: \" + e.which + \", charCode: \" + e.charCode + \", detail: \" + e.detail + \" ====> \" + this.keyCode + ' -- ' + KeyCode[this.keyCode]);\n\n\t\tthis.ctrlKey = this.ctrlKey || this.keyCode === KeyCode.Ctrl\n\t\tthis.altKey = this.altKey || this.keyCode === KeyCode.Alt\n\t\tthis.shiftKey = this.shiftKey || this.keyCode === KeyCode.Shift\n\t\tthis.metaKey = this.metaKey || this.keyCode === KeyCode.Meta\n\n\t\tthis._asKeybinding = this._computeKeybinding()\n\t\tthis._asRuntimeKeybinding = this._computeRuntimeKeybinding()\n\t}\n\n\tpublic preventDefault(): void {\n\t\tif (this.browserEvent && this.browserEvent.preventDefault) {\n\t\t\tthis.browserEvent.preventDefault()\n\t\t}\n\t}\n\n\tpublic stopPropagation(): void {\n\t\tif (this.browserEvent && this.browserEvent.stopPropagation) {\n\t\t\tthis.browserEvent.stopPropagation()\n\t\t}\n\t}\n\n\tpublic toKeybinding(): SimpleKeybinding {\n\t\treturn this._asRuntimeKeybinding\n\t}\n\n\tpublic equals(other: number): boolean {\n\t\treturn this._asKeybinding === other\n\t}\n\n\tprivate _computeKeybinding(): number {\n\t\tlet key = KeyCode.Unknown\n\t\tif (this.keyCode !== KeyCode.Ctrl && this.keyCode !== KeyCode.Shift && this.keyCode !== KeyCode.Alt && this.keyCode !== KeyCode.Meta) {\n\t\t\tkey = this.keyCode\n\t\t}\n\n\t\tlet result = 0\n\t\tif (this.ctrlKey) {\n\t\t\tresult |= ctrlKeyMod\n\t\t}\n\t\tif (this.altKey) {\n\t\t\tresult |= altKeyMod\n\t\t}\n\t\tif (this.shiftKey) {\n\t\t\tresult |= shiftKeyMod\n\t\t}\n\t\tif (this.metaKey) {\n\t\t\tresult |= metaKeyMod\n\t\t}\n\t\tresult |= key\n\n\t\treturn result\n\t}\n\n\tprivate _computeRuntimeKeybinding(): SimpleKeybinding {\n\t\tlet key = KeyCode.Unknown\n\t\tif (this.keyCode !== KeyCode.Ctrl && this.keyCode !== KeyCode.Shift && this.keyCode !== KeyCode.Alt && this.keyCode !== KeyCode.Meta) {\n\t\t\tkey = this.keyCode\n\t\t}\n\t\treturn new SimpleKeybinding(this.ctrlKey, this.shiftKey, this.altKey, this.metaKey, key)\n\t}\n}","/* ---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\nimport * as browser from 'base/browser/browser'\nimport * as platform from 'base/common/platform'\n\nexport interface IMouseEvent {\n\treadonly browserEvent: MouseEvent;\n\treadonly leftButton: boolean;\n\treadonly middleButton: boolean;\n\treadonly rightButton: boolean;\n\treadonly target: HTMLElement;\n\treadonly detail: number;\n\treadonly posx: number;\n\treadonly posy: number;\n\treadonly ctrlKey: boolean;\n\treadonly shiftKey: boolean;\n\treadonly altKey: boolean;\n\treadonly metaKey: boolean;\n\treadonly timestamp: number;\n\n\tpreventDefault(): void;\n\tstopPropagation(): void;\n}\n\nexport class StandardMouseEvent implements IMouseEvent {\n\tpublic readonly browserEvent: MouseEvent\n\n\tpublic readonly leftButton: boolean\n\tpublic readonly middleButton: boolean\n\tpublic readonly rightButton: boolean\n\tpublic readonly target: HTMLElement\n\tpublic detail: number\n\tpublic readonly posx: number\n\tpublic readonly posy: number\n\tpublic readonly ctrlKey: boolean\n\tpublic readonly shiftKey: boolean\n\tpublic readonly altKey: boolean\n\tpublic readonly metaKey: boolean\n\tpublic readonly timestamp: number\n\n\tconstructor(e: MouseEvent) {\n\t\tthis.timestamp = Date.now()\n\t\tthis.browserEvent = e\n\t\tthis.leftButton = e.button === 0\n\t\tthis.middleButton = e.button === 1\n\t\tthis.rightButton = e.button === 2\n\n\t\tthis.target = <HTMLElement>e.target\n\n\t\tthis.detail = e.detail || 1\n\t\tif (e.type === 'dblclick') {\n\t\t\tthis.detail = 2\n\t\t}\n\t\tthis.ctrlKey = e.ctrlKey\n\t\tthis.shiftKey = e.shiftKey\n\t\tthis.altKey = e.altKey\n\t\tthis.metaKey = e.metaKey\n\n\t\tif (typeof e.pageX === 'number') {\n\t\t\tthis.posx = e.pageX\n\t\t\tthis.posy = e.pageY\n\t\t} else {\n\t\t\t// Probably hit by MSGestureEvent\n\t\t\tthis.posx = e.clientX + document.body.scrollLeft + document.documentElement?.scrollLeft\n\t\t\tthis.posy = e.clientY + document.body.scrollTop + document.documentElement?.scrollTop\n\t\t}\n\t}\n\n\tpublic preventDefault(): void {\n\t\tif (this.browserEvent.preventDefault) {\n\t\t\tthis.browserEvent.preventDefault()\n\t\t}\n\t}\n\n\tpublic stopPropagation(): void {\n\t\tif (this.browserEvent.stopPropagation) {\n\t\t\tthis.browserEvent.stopPropagation()\n\t\t}\n\t}\n}\n\nexport interface IDataTransfer {\n\tdropEffect: string;\n\teffectAllowed: string;\n\ttypes: any[];\n\tfiles: any[];\n\n\tsetData(type: string, data: string): void;\n\tsetDragImage(image: any, x: number, y: number): void;\n\n\tgetData(type: string): string;\n\tclearData(types?: string[]): void;\n}\n\nexport class DragMouseEvent extends StandardMouseEvent {\n\tpublic readonly dataTransfer: IDataTransfer\n\n\tconstructor(e: MouseEvent) {\n\t\tsuper(e)\n\t\tthis.dataTransfer = (<any>e).dataTransfer\n\t}\n}\n\nexport interface IMouseWheelEvent extends MouseEvent {\n\treadonly wheelDelta: number;\n}\n\ninterface IWebKitMouseWheelEvent {\n\twheelDeltaY: number;\n\twheelDeltaX: number;\n}\n\ninterface IGeckoMouseWheelEvent {\n\tHORIZONTAL_AXIS: number;\n\tVERTICAL_AXIS: number;\n\taxis: number;\n\tdetail: number;\n}\n\nexport class StandardWheelEvent {\n\tpublic readonly browserEvent: IMouseWheelEvent | null\n\tpublic readonly deltaY: number\n\tpublic readonly deltaX: number\n\tpublic readonly target: Node\n\n\tconstructor(e: IMouseWheelEvent | null, deltaX = 0, deltaY = 0) {\n\t\tthis.browserEvent = e || null\n\t\tthis.target = e ? (e.target || (<any>e).targetNode || e.srcElement) : null\n\n\t\tthis.deltaY = deltaY\n\t\tthis.deltaX = deltaX\n\n\t\tif (e) {\n\t\t\tconst e1 = <IWebKitMouseWheelEvent><any>e\n\t\t\tconst e2 = <IGeckoMouseWheelEvent><any>e\n\n\t\t\t// vertical delta scroll\n\t\t\tif (typeof e1.wheelDeltaY !== 'undefined') {\n\t\t\t\tthis.deltaY = e1.wheelDeltaY / 120\n\t\t\t} else if (typeof e2.VERTICAL_AXIS !== 'undefined' && e2.axis === e2.VERTICAL_AXIS) {\n\t\t\t\tthis.deltaY = -e2.detail / 3\n\t\t\t}\n\n\t\t\t// horizontal delta scroll\n\t\t\tif (typeof e1.wheelDeltaX !== 'undefined') {\n\t\t\t\tif (browser.isSafari && platform.isWindows) {\n\t\t\t\t\tthis.deltaX = -(e1.wheelDeltaX / 120)\n\t\t\t\t} else {\n\t\t\t\t\tthis.deltaX = e1.wheelDeltaX / 120\n\t\t\t\t}\n\t\t\t} else if (typeof e2.HORIZONTAL_AXIS !== 'undefined' && e2.axis === e2.HORIZONTAL_AXIS) {\n\t\t\t\tthis.deltaX = -e.detail / 3\n\t\t\t}\n\n\t\t\t// Assume a vertical scroll if nothing else worked\n\t\t\tif (this.deltaY === 0 && this.deltaX === 0 && e.wheelDelta) {\n\t\t\t\tthis.deltaY = e.wheelDelta / 120\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic preventDefault(): void {\n\t\tif (this.browserEvent) {\n\t\t\tif (this.browserEvent.preventDefault) {\n\t\t\t\tthis.browserEvent.preventDefault()\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic stopPropagation(): void {\n\t\tif (this.browserEvent) {\n\t\t\tif (this.browserEvent.stopPropagation) {\n\t\t\t\tthis.browserEvent.stopPropagation()\n\t\t\t}\n\t\t}\n\t}\n}","/* ---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\nimport { Disposable } from 'base/common/lifecycle'\n\nexport class TimeoutTimer extends Disposable {\n\tprivate _token: any\n\n\tconstructor();\n\tconstructor(runner: () => void, timeout: number);\n\tconstructor(runner?: () => void, timeout?: number) {\n\t\tsuper()\n\t\tthis._token = -1\n\n\t\tif (typeof runner === 'function' && typeof timeout === 'number') {\n\t\t\tthis.setIfNotSet(runner, timeout)\n\t\t}\n\t}\n\n\tdispose(): void {\n\t\tthis.cancel()\n\t\tsuper.dispose()\n\t}\n\n\tcancel(): void {\n\t\tif (this._token !== -1) {\n\t\t\tclearTimeout(this._token)\n\t\t\tthis._token = -1\n\t\t}\n\t}\n\n\tcancelAndSet(runner: () => void, timeout: number): void {\n\t\tthis.cancel()\n\t\tthis._token = setTimeout(() => {\n\t\t\tthis._token = -1\n\t\t\trunner()\n\t\t}, timeout)\n\t}\n\n\tsetIfNotSet(runner: () => void, timeout: number): void {\n\t\tif (this._token !== -1) {\n\t\t\t// timer is already set\n\t\t\treturn\n\t\t}\n\t\tthis._token = setTimeout(() => {\n\t\t\tthis._token = -1\n\t\t\trunner()\n\t\t}, timeout)\n\t}\n}\n\nexport class RunOnceScheduler {\n\tprotected runner: ((...args: any[]) => void) | null\n\n\tprivate timeoutToken: any\n\tprivate timeout: number\n\tprivate timeoutHandler: () => void\n\n\tconstructor(runner: (...args: any[]) => void, timeout: number) {\n\t\tthis.timeoutToken = -1\n\t\tthis.runner = runner\n\t\tthis.timeout = timeout\n\t\tthis.timeoutHandler = this.onTimeout.bind(this)\n\t}\n\n\t/**\n\t * Dispose RunOnceScheduler\n\t */\n\tdispose(): void {\n\t\tthis.cancel()\n\t\tthis.runner = null\n\t}\n\n\t/**\n\t * Cancel current scheduled runner (if any).\n\t */\n\tcancel(): void {\n\t\tif (this.isScheduled()) {\n\t\t\tclearTimeout(this.timeoutToken)\n\t\t\tthis.timeoutToken = -1\n\t\t}\n\t}\n\n\t/**\n\t * Cancel previous runner (if any) & schedule a new runner.\n\t */\n\tschedule(delay = this.timeout): void {\n\t\tthis.cancel()\n\t\tthis.timeoutToken = setTimeout(this.timeoutHandler, delay)\n\t}\n\n\t/**\n\t * Returns true if scheduled.\n\t */\n\tisScheduled(): boolean {\n\t\treturn this.timeoutToken !== -1\n\t}\n\n\tprivate onTimeout() {\n\t\tthis.timeoutToken = -1\n\t\tif (this.runner) {\n\t\t\tthis.doRun()\n\t\t}\n\t}\n\n\tprotected doRun(): void {\n\t\tif (this.runner) {\n\t\t\tthis.runner()\n\t\t}\n\t}\n}","/* ---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\n/**\n * Returns the last element of an array.\n * @param array The array.\n * @param n Which element from the end (default is zero).\n */\nexport function tail<T>(array: ArrayLike<T>, n: number = 0): T {\n\treturn array[array.length - (1 + n)];\n}\n\n/**\n * @returns a new array with all falsy values removed. The original array IS NOT modified.\n */\nexport function coalesce<T>(array: Array<T | undefined | null>): T[] {\n\tif (!array) {\n\t\treturn array\n\t}\n\treturn <T[]>array.filter(e => !!e)\n}","/* ---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\nimport * as browser from 'base/browser/browser'\nimport { domEvent } from 'base/browser/event'\nimport { IKeyboardEvent, StandardKeyboardEvent } from 'base/browser/keyboardEvent'\nimport { IMouseEvent, StandardMouseEvent } from 'base/browser/mouseEvent'\nimport { TimeoutTimer } from 'base/common/async'\nimport { CharCode } from 'base/common/charCode'\nimport { Emitter, Event } from 'base/common/event'\nimport { Disposable, IDisposable, dispose, toDisposable } from 'base/common/lifecycle'\nimport * as platform from 'base/common/platform'\nimport { coalesce } from 'base/common/arrays'\nimport { KeyCode } from 'base/common/keyCodes'\n\nexport function clearNode(node: HTMLElement): void {\n\twhile (node.firstChild) {\n\t\tnode.removeChild(node.firstChild)\n\t}\n}\n\nexport function removeNode(node: HTMLElement): void {\n\tif (node.parentNode) {\n\t\tnode.parentNode.removeChild(node)\n\t}\n}\n\nexport function isInDOM(node: Node | null): boolean {\n\twhile (node) {\n\t\tif (node === document.body) {\n\t\t\treturn true\n\t\t}\n\t\tnode = node.parentNode\n\t}\n\treturn false\n}\n\ninterface IDomClassList {\n\thasClass(node: HTMLElement, className: string): boolean;\n\taddClass(node: HTMLElement, className: string): void;\n\taddClasses(node: HTMLElement, ...classNames: string[]): void;\n\tremoveClass(node: HTMLElement, className: string): void;\n\tremoveClasses(node: HTMLElement, ...classNames: string[]): void;\n\ttoggleClass(node: HTMLElement, className: string, shouldHaveIt?: boolean): void;\n}\n\ntype ModifierKey = 'alt' | 'ctrl' | 'shift' | 'meta';\n\nexport interface IModifierKeyStatus {\n\taltKey: boolean;\n\tshiftKey: boolean;\n\tctrlKey: boolean;\n\tmetaKey: boolean;\n\tlastKeyPressed?: ModifierKey;\n\tlastKeyReleased?: ModifierKey;\n\tevent?: KeyboardEvent;\n}\n\nexport class ModifierKeyEmitter extends Emitter<IModifierKeyStatus> {\n\n\tprivate _keyStatus: IModifierKeyStatus;\n\tprivate static instance: ModifierKeyEmitter;\n\n\tprivate constructor() {\n\t\tsuper();\n\n\t\tthis._keyStatus = {\n\t\t\taltKey: false,\n\t\t\tshiftKey: false,\n\t\t\tctrlKey: false,\n\t\t\tmetaKey: false\n\t\t};\n\n\t\taddDisposableListener(window, 'keydown', e => {\n\t\t\tif (e.defaultPrevented) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst event = new StandardKeyboardEvent(e);\n\t\t\t// If Alt-key keydown event is repeated, ignore it #112347\n\t\t\t// Only known to be necessary for Alt-Key at the moment #115810\n\t\t\tif (event.keyCode === KeyCode.Alt && e.repeat) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (e.altKey && !this._keyStatus.altKey) {\n\t\t\t\tthis._keyStatus.lastKeyPressed = 'alt';\n\t\t\t} else if (e.ctrlKey && !this._keyStatus.ctrlKey) {\n\t\t\t\tthis._keyStatus.lastKeyPressed = 'ctrl';\n\t\t\t} else if (e.metaKey && !this._keyStatus.metaKey) {\n\t\t\t\tthis._keyStatus.lastKeyPressed = 'meta';\n\t\t\t} else if (e.shiftKey && !this._keyStatus.shiftKey) {\n\t\t\t\tthis._keyStatus.lastKeyPressed = 'shift';\n\t\t\t} else if (event.keyCode !== KeyCode.Alt) {\n\t\t\t\tthis._keyStatus.lastKeyPressed = undefined;\n\t\t\t} else {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._keyStatus.altKey = e.altKey;\n\t\t\tthis._keyStatus.ctrlKey = e.ctrlKey;\n\t\t\tthis._keyStatus.metaKey = e.metaKey;\n\t\t\tthis._keyStatus.shiftKey = e.shiftKey;\n\n\t\t\tif (this._keyStatus.lastKeyPressed) {\n\t\t\t\tthis._keyStatus.event = e;\n\t\t\t\tthis.fire(this._keyStatus);\n\t\t\t}\n\t\t}, true);\n\n\t\taddDisposableListener(window, 'keyup', e => {\n\t\t\tif (e.defaultPrevented) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!e.altKey && this._keyStatus.altKey) {\n\t\t\t\tthis._keyStatus.lastKeyReleased = 'alt';\n\t\t\t} else if (!e.ctrlKey && this._keyStatus.ctrlKey) {\n\t\t\t\tthis._keyStatus.lastKeyReleased = 'ctrl';\n\t\t\t} else if (!e.metaKey && this._keyStatus.metaKey) {\n\t\t\t\tthis._keyStatus.lastKeyReleased = 'meta';\n\t\t\t} else if (!e.shiftKey && this._keyStatus.shiftKey) {\n\t\t\t\tthis._keyStatus.lastKeyReleased = 'shift';\n\t\t\t} else {\n\t\t\t\tthis._keyStatus.lastKeyReleased = undefined;\n\t\t\t}\n\n\t\t\tif (this._keyStatus.lastKeyPressed !== this._keyStatus.lastKeyReleased) {\n\t\t\t\tthis._keyStatus.lastKeyPressed = undefined;\n\t\t\t}\n\n\t\t\tthis._keyStatus.altKey = e.altKey;\n\t\t\tthis._keyStatus.ctrlKey = e.ctrlKey;\n\t\t\tthis._keyStatus.metaKey = e.metaKey;\n\t\t\tthis._keyStatus.shiftKey = e.shiftKey;\n\n\t\t\tif (this._keyStatus.lastKeyReleased) {\n\t\t\t\tthis._keyStatus.event = e;\n\t\t\t\tthis.fire(this._keyStatus);\n\t\t\t}\n\t\t}, true);\n\n\t\taddDisposableListener(document.body, 'mousedown', () => {\n\t\t\tthis._keyStatus.lastKeyPressed = undefined;\n\t\t}, true);\n\n\t\taddDisposableListener(document.body, 'mouseup', () => {\n\t\t\tthis._keyStatus.lastKeyPressed = undefined;\n\t\t}, true);\n\n\t\taddDisposableListener(document.body, 'mousemove', e => {\n\t\t\tif (e.buttons) {\n\t\t\t\tthis._keyStatus.lastKeyPressed = undefined;\n\t\t\t}\n\t\t}, true);\n\n\t\taddDisposableListener(window, 'blur', () => {\n\t\t\tthis.resetKeyStatus();\n\t\t});\n\t}\n\n\tget keyStatus(): IModifierKeyStatus {\n\t\treturn this._keyStatus;\n\t}\n\n\tget isModifierPressed(): boolean {\n\t\treturn this._keyStatus.altKey || this._keyStatus.ctrlKey || this._keyStatus.metaKey || this._keyStatus.shiftKey;\n\t}\n\n\t/**\n\t * Allows to explicitly reset the key status based on more knowledge (#109062)\n\t */\n\tresetKeyStatus(): void {\n\t\tthis.doResetKeyStatus();\n\t\tthis.fire(this._keyStatus);\n\t}\n\n\tprivate doResetKeyStatus(): void {\n\t\tthis._keyStatus = {\n\t\t\taltKey: false,\n\t\t\tshiftKey: false,\n\t\t\tctrlKey: false,\n\t\t\tmetaKey: false\n\t\t};\n\t}\n\n\tstatic getInstance() {\n\t\tif (!ModifierKeyEmitter.instance) {\n\t\t\tModifierKeyEmitter.instance = new ModifierKeyEmitter();\n\t\t}\n\n\t\treturn ModifierKeyEmitter.instance;\n\t}\n\n\toverride dispose() {\n\t\tsuper.dispose();\n\t}\n}\n\nconst _manualClassList = new class implements IDomClassList {\n\tprivate _lastStart?: number\n\tprivate _lastEnd?: number\n\n\tprivate _findClassName(node: HTMLElement, className: string): void {\n\t\tconst classes = node.className\n\t\tif (!classes) {\n\t\t\tthis._lastStart = -1\n\t\t\treturn\n\t\t}\n\n\t\tclassName = className.trim()\n\n\t\tconst classesLen = classes.length\n\t\tconst classLen = className.length\n\n\t\tif (classLen === 0) {\n\t\t\tthis._lastStart = -1\n\t\t\treturn\n\t\t}\n\n\t\tif (classesLen < classLen) {\n\t\t\tthis._lastStart = -1\n\t\t\treturn\n\t\t}\n\n\t\tif (classes === className) {\n\t\t\tthis._lastStart = 0\n\t\t\tthis._lastEnd = classesLen\n\t\t\treturn\n\t\t}\n\n\t\tlet idx = -1\n\t\tlet idxEnd: number\n\n\t\twhile ((idx = classes.indexOf(className, idx + 1)) >= 0) {\n\t\t\tidxEnd = idx + classLen\n\n\t\t\t// a class that is followed by another class\n\t\t\tif ((idx === 0 || classes.charCodeAt(idx - 1) === CharCode.Space) && classes.charCodeAt(idxEnd) === CharCode.Space) {\n\t\t\t\tthis._lastStart = idx\n\t\t\t\tthis._lastEnd = idxEnd + 1\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// last class\n\t\t\tif (idx > 0 && classes.charCodeAt(idx - 1) === CharCode.Space && idxEnd === classesLen) {\n\t\t\t\tthis._lastStart = idx - 1\n\t\t\t\tthis._lastEnd = idxEnd\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// equal - duplicate of cmp above\n\t\t\tif (idx === 0 && idxEnd === classesLen) {\n\t\t\t\tthis._lastStart = 0\n\t\t\t\tthis._lastEnd = idxEnd\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tthis._lastStart = -1\n\t}\n\n\thasClass(node: HTMLElement, className: string): boolean {\n\t\tthis._findClassName(node, className)\n\t\treturn this._lastStart !== -1\n\t}\n\n\taddClasses(node: HTMLElement, ...classNames: string[]): void {\n\t\tclassNames.forEach(nameValue => nameValue.split(' ').forEach(name => this.addClass(node, name)))\n\t}\n\n\taddClass(node: HTMLElement, className: string): void {\n\t\tif (!node.className) { // doesn't have it for sure\n\t\t\tnode.className = className\n\t\t} else {\n\t\t\tthis._findClassName(node, className) // see if it's already there\n\t\t\tif (this._lastStart === -1) {\n\t\t\t\tnode.className = node.className + ' ' + className\n\t\t\t}\n\t\t}\n\t}\n\n\tremoveClass(node: HTMLElement, className: string): void {\n\t\tthis._findClassName(node, className)\n\t\tif (this._lastStart === -1) {\n\t\t\t// Prevent styles invalidation if not necessary\n\t\t} else {\n\t\t\tnode.className = node.className.substring(0, this._lastStart) + node.className.substring(this._lastEnd || 0)\n\t\t}\n\t}\n\n\tremoveClasses(node: HTMLElement, ...classNames: string[]): void {\n\t\tclassNames.forEach(nameValue => nameValue.split(' ').forEach(name => this.removeClass(node, name)))\n\t}\n\n\ttoggleClass(node: HTMLElement, className: string, shouldHaveIt?: boolean): void {\n\t\tthis._findClassName(node, className)\n\t\tif (this._lastStart !== -1 && (shouldHaveIt === undefined || !shouldHaveIt)) {\n\t\t\tthis.removeClass(node, className)\n\t\t}\n\t\tif (this._lastStart === -1 && (shouldHaveIt === undefined || shouldHaveIt)) {\n\t\t\tthis.addClass(node, className)\n\t\t}\n\t}\n}()\n\nconst _nativeClassList = new class implements IDomClassList {\n\thasClass(node: HTMLElement, className: string): boolean {\n\t\treturn Boolean(className) && node.classList && node.classList.contains(className)\n\t}\n\n\taddClasses(node: HTMLElement, ...classNames: string[]): void {\n\t\tclassNames.forEach(nameValue => nameValue.split(' ').forEach(name => this.addClass(node, name)))\n\t}\n\n\taddClass(node: HTMLElement, className: string): void {\n\t\tif (className && node.classList) {\n\t\t\tnode.classList.add(className)\n\t\t}\n\t}\n\n\tremoveClass(node: HTMLElement, className: string): void {\n\t\tif (className && node.classList) {\n\t\t\tnode.classList.remove(className)\n\t\t}\n\t}\n\n\tremoveClasses(node: HTMLElement, ...classNames: string[]): void {\n\t\tclassNames.forEach(nameValue => nameValue.split(' ').forEach(name => this.removeClass(node, name)))\n\t}\n\n\ttoggleClass(node: HTMLElement, className: string, shouldHaveIt?: boolean): void {\n\t\tif (node.classList) {\n\t\t\tnode.classList.toggle(className, shouldHaveIt)\n\t\t}\n\t}\n}()\n\n// In IE11 there is only partial support for `classList` which makes us keep our\n// custom implementation. Otherwise use the native implementation, see: http://caniuse.com/#search=classlist\nconst _classList: IDomClassList = browser.isIE ? _manualClassList : _nativeClassList\nexport const hasClass: (node: HTMLElement, className: string) => boolean = _classList.hasClass.bind(_classList)\nexport const addClass: (node: HTMLElement, className: string) => void = _classList.addClass.bind(_classList)\nexport const addClasses: (node: HTMLElement, ...classNames: string[]) => void = _classList.addClasses.bind(_classList)\nexport const removeClass: (node: HTMLElement, className: string) => void = _classList.removeClass.bind(_classList)\nexport const removeClasses: (node: HTMLElement, ...classNames: string[]) => void = _classList.removeClasses.bind(_classList)\nexport const toggleClass: (node: HTMLElement, className: string, shouldHaveIt?: boolean) => void = _classList.toggleClass.bind(_classList)\n\nclass DomListener implements IDisposable {\n\n\tprivate _handler: (e: any) => void;\n\tprivate _node: EventTarget;\n\tprivate readonly _type: string;\n\tprivate readonly _options: boolean | AddEventListenerOptions;\n\n\tconstructor(node: EventTarget, type: string, handler: (e: any) => void, options?: boolean | AddEventListenerOptions) {\n\t\tthis._node = node;\n\t\tthis._type = type;\n\t\tthis._handler = handler;\n\t\tthis._options = (options || false);\n\t\tthis._node.addEventListener(this._type, this._handler, this._options);\n\t}\n\n\tpublic dispose(): void {\n\t\tif (!this._handler) {\n\t\t\t// Already disposed\n\t\t\treturn;\n\t\t}\n\n\t\tthis._node.removeEventListener(this._type, this._handler, this._options);\n\n\t\t// Prevent leakers from holding on to the dom or handler func\n\t\tthis._node = null!;\n\t\tthis._handler = null!;\n\t}\n}\n\nexport function addDisposableListener<K extends keyof GlobalEventHandlersEventMap>(node: EventTarget, type: K, handler: (event: GlobalEventHandlersEventMap[K]) => void, useCapture?: boolean): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, options: AddEventListenerOptions): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCaptureOrOptions?: boolean | AddEventListenerOptions): IDisposable {\n\treturn new DomListener(node, type, handler, useCaptureOrOptions);\n}\n\nexport interface IAddStandardDisposableListenerSignature {\n\t(node: HTMLElement, type: 'click', handler: (event: IMouseEvent) => void, useCapture?: boolean): IDisposable;\n\t(node: HTMLElement, type: 'mousedown', handler: (event: IMouseEvent) => void, useCapture?: boolean): IDisposable;\n\t(node: HTMLElement, type: 'keydown', handler: (event: IKeyboardEvent) => void, useCapture?: boolean): IDisposable;\n\t(node: HTMLElement, type: 'keypress', handler: (event: IKeyboardEvent) => void, useCapture?: boolean): IDisposable;\n\t(node: HTMLElement, type: 'keyup', handler: (event: IKeyboardEvent) => void, useCapture?: boolean): IDisposable;\n\t(node: HTMLElement, type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable;\n}\nfunction _wrapAsStandardMouseEvent(handler: (e: IMouseEvent) => void): (e: MouseEvent) => void {\n\treturn function (e: MouseEvent) {\n\t\treturn handler(new StandardMouseEvent(e))\n\t}\n}\nfunction _wrapAsStandardKeyboardEvent(handler: (e: IKeyboardEvent) => void): (e: KeyboardEvent) => void {\n\treturn function (e: KeyboardEvent) {\n\t\treturn handler(new StandardKeyboardEvent(e))\n\t}\n}\nexport const addStandardDisposableListener: IAddStandardDisposableListenerSignature = function addStandardDisposableListener(node: HTMLElement, type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable {\n\tlet wrapHandler = handler\n\n\tif (type === 'click' || type === 'mousedown') {\n\t\twrapHandler = _wrapAsStandardMouseEvent(handler)\n\t} else if (type === 'keydown' || type === 'keypress' || type === 'keyup') {\n\t\twrapHandler = _wrapAsStandardKeyboardEvent(handler)\n\t}\n\n\treturn addDisposableListener(node, type, wrapHandler, useCapture)\n}\n\nexport function addDisposableNonBubblingMouseOutListener(node: Element, handler: (event: MouseEvent) => void): IDisposable {\n\treturn addDisposableListener(node, 'mouseout', (e: MouseEvent) => {\n\t\t// Mouse out bubbles, so this is an attempt to ignore faux mouse outs coming from children elements\n\t\tlet toElement: Node | null = <Node>(e.relatedTarget || e.target)\n\t\twhile (toElement && toElement !== node) {\n\t\t\ttoElement = toElement.parentNode\n\t\t}\n\t\tif (toElement === node) {\n\t\t\treturn\n\t\t}\n\n\t\thandler(e)\n\t})\n}\n\ninterface IRequestAnimationFrame {\n\t(callback: (time: number) => void): number;\n}\nlet _animationFrame: IRequestAnimationFrame | null = null\nfunction doRequestAnimationFrame(callback: (time: number) => void): number {\n\tif (!_animationFrame) {\n\t\tconst emulatedRequestAnimationFrame = (callback: (time: number) => void): any => {\n\t\t\treturn setTimeout(() => callback(new Date().getTime()), 0)\n\t\t}\n\t\t_animationFrame = (\n\t\t\tself.requestAnimationFrame ||\n\t\t\t(<any>self).msRequestAnimationFrame ||\n\t\t\t(<any>self).webkitRequestAnimationFrame ||\n\t\t\t(<any>self).mozRequestAnimationFrame ||\n\t\t\t(<any>self).oRequestAnimationFrame ||\n\t\t\temulatedRequestAnimationFrame\n\t\t)\n\t}\n\treturn _animationFrame.call(self, callback)\n}\n\n/**\n * Schedule a callback to be run at the next animation frame.\n * This allows multiple parties to register callbacks that should run at the next animation frame.\n * If currently in an animation frame, `runner` will be executed immediately.\n * @return token that can be used to cancel the scheduled runner (only if `runner` was not executed immediately).\n */\nexport let runAtThisOrScheduleAtNextAnimationFrame: (runner: () => void, priority?: number) => IDisposable\n/**\n * Schedule a callback to be run at the next animation frame.\n * This allows multiple parties to register callbacks that should run at the next animation frame.\n * If currently in an animation frame, `runner` will be executed at the next animation frame.\n * @return token that can be used to cancel the scheduled runner.\n */\nexport let scheduleAtNextAnimationFrame: (runner: () => void, priority?: number) => IDisposable\n\nclass AnimationFrameQueueItem implements IDisposable {\n\tprivate _runner: () => void\n\tpublic priority: number\n\tprivate _canceled: boolean\n\n\tconstructor(runner: () => void, priority = 0) {\n\t\tthis._runner = runner\n\t\tthis.priority = priority\n\t\tthis._canceled = false\n\t}\n\n\tpublic dispose(): void {\n\t\tthis._canceled = true\n\t}\n\n\tpublic execute(): void {\n\t\tif (this._canceled) {\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tthis._runner()\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\t// Sort by priority (largest to lowest)\n\tpublic static sort(a: AnimationFrameQueueItem, b: AnimationFrameQueueItem): number {\n\t\treturn b.priority - a.priority\n\t}\n}\n\n(function () {\n\t/**\n\t * The runners scheduled at the next animation frame\n\t */\n\tlet NEXT_QUEUE: AnimationFrameQueueItem[] = []\n\t/**\n\t * The runners scheduled at the current animation frame\n\t */\n\tlet CURRENT_QUEUE: AnimationFrameQueueItem[] | null = null\n\t/**\n\t * A flag to keep track if the native requestAnimationFrame was already called\n\t */\n\tlet animFrameRequested = false\n\t/**\n\t * A flag to indicate if currently handling a native requestAnimationFrame callback\n\t */\n\tlet inAnimationFrameRunner = false\n\n\tconst animationFrameRunner = () => {\n\t\tanimFrameRequested = false\n\n\t\tCURRENT_QUEUE = NEXT_QUEUE\n\t\tNEXT_QUEUE = []\n\n\t\tinAnimationFrameRunner = true\n\t\twhile (CURRENT_QUEUE.length > 0) {\n\t\t\tCURRENT_QUEUE.sort(AnimationFrameQueueItem.sort)\n\t\t\tconst top = CURRENT_QUEUE.shift()!\n\t\t\ttop.execute()\n\t\t}\n\t\tinAnimationFrameRunner = false\n\t}\n\n\tscheduleAtNextAnimationFrame = (runner: () => void, priority = 0) => {\n\t\tconst item = new AnimationFrameQueueItem(runner, priority)\n\t\tNEXT_QUEUE.push(item)\n\n\t\tif (!animFrameRequested) {\n\t\t\tanimFrameRequested = true\n\t\t\tdoRequestAnimationFrame(animationFrameRunner)\n\t\t}\n\n\t\treturn item\n\t}\n\n\trunAtThisOrScheduleAtNextAnimationFrame = (runner: () => void, priority?: number) => {\n\t\tif (inAnimationFrameRunner) {\n\t\t\tconst item = new AnimationFrameQueueItem(runner, priority)\n\t\t\tCURRENT_QUEUE!.push(item)\n\t\t\treturn item\n\t\t} else {\n\t\t\treturn scheduleAtNextAnimationFrame(runner, priority)\n\t\t}\n\t}\n})()\n\nexport function measure(callback: () => void): IDisposable {\n\treturn scheduleAtNextAnimationFrame(callback, 10000 /* must be early */)\n}\n\nexport function modify(callback: () => void): IDisposable {\n\treturn scheduleAtNextAnimationFrame(callback, -10000 /* must be late */)\n}\n\n/**\n * Add a throttled listener. `handler` is fired at most every 16ms or with the next animation frame (if browser supports it).\n */\nexport interface IEventMerger<R, E> {\n\t(lastEvent: R | null, currentEvent: E): R;\n}\n\nexport interface DOMEvent {\n\tpreventDefault(): void;\n\tstopPropagation(): void;\n}\n\nconst MINIMUM_TIME_MS = 16\nconst DEFAULT_EVENT_MERGER: any = function (lastEvent: DOMEvent, currentEvent: DOMEvent) {\n\treturn currentEvent\n}\n\nclass TimeoutThrottledDomListener<R, E extends DOMEvent> extends Disposable {\n\tconstructor(node: any, type: string, handler: (event: R) => void, eventMerger: IEventMerger<R, E> = <any>DEFAULT_EVENT_MERGER, minimumTimeMs: number = MINIMUM_TIME_MS) {\n\t\tsuper()\n\n\t\tlet lastEvent: R | null = null\n\t\tlet lastHandlerTime = 0\n\t\tconst timeout = this._register(new TimeoutTimer())\n\n\t\tconst invokeHandler = () => {\n\t\t\tlastHandlerTime = (new Date()).getTime()\n\t\t\thandler(<R>lastEvent)\n\t\t\tlastEvent = null\n\t\t}\n\n\t\tthis._register(addDisposableListener(node, type, (e) => {\n\t\t\tlastEvent = eventMerger(lastEvent, e)\n\t\t\tconst elapsedTime = (new Date()).getTime() - lastHandlerTime\n\n\t\t\tif (elapsedTime >= minimumTimeMs) {\n\t\t\t\ttimeout.cancel()\n\t\t\t\tinvokeHandler()\n\t\t\t} else {\n\t\t\t\ttimeout.setIfNotSet(invokeHandler, minimumTimeMs - elapsedTime)\n\t\t\t}\n\t\t}))\n\t}\n}\n\nexport function addDisposableThrottledListener<R, E extends DOMEvent = DOMEvent>(node: any, type: string, handler: (event: R) => void, eventMerger?: IEventMerger<R, E>, minimumTimeMs?: number): IDisposable {\n\treturn new TimeoutThrottledDomListener<R, E>(node, type, handler, eventMerger, minimumTimeMs)\n}\n\nexport function getComputedStyle(el: HTMLElement): CSSStyleDeclaration {\n\treturn document.defaultView!.getComputedStyle(el, null)\n}\n\n// Adapted from WinJS\n// Converts a CSS positioning string for the specified element to pixels.\nconst convertToPixels: (element: HTMLElement, value: string) => number = (function () {\n\treturn function (element: HTMLElement, value: string): number {\n\t\treturn parseFloat(value) || 0\n\t}\n})()\n\nfunction getDimension(element: HTMLElement, cssPropertyName: string, jsPropertyName: string): number {\n\tconst computedStyle: CSSStyleDeclaration = getComputedStyle(element)\n\tlet value = '0'\n\tif (computedStyle) {\n\t\tif (computedStyle.getPropertyValue) {\n\t\t\tvalue = computedStyle.getPropertyValue(cssPropertyName)\n\t\t} else {\n\t\t\t// IE8\n\t\t\tvalue = (<any>computedStyle).getAttribute(jsPropertyName)\n\t\t}\n\t}\n\treturn convertToPixels(element, value)\n}\n\nexport function getClientArea(element: HTMLElement): Dimension {\n\t// Try with DOM clientWidth / clientHeight\n\tif (element !== document.body) {\n\t\treturn new Dimension(element.clientWidth, element.clientHeight)\n\t}\n\n\t// Try innerWidth / innerHeight\n\tif (window.innerWidth && window.innerHeight) {\n\t\treturn new Dimension(window.innerWidth, window.innerHeight)\n\t}\n\n\t// Try with document.body.clientWidth / document.body.clientHeight\n\tif (document.body && document.body.clientWidth && document.body.clientHeight) {\n\t\treturn new Dimension(document.body.clientWidth, document.body.clientHeight)\n\t}\n\n\t// Try with document.documentElement.clientWidth / document.documentElement.clientHeight\n\tif (document.documentElement && document.documentElement.clientWidth && document.documentElement.clientHeight) {\n\t\treturn new Dimension(document.documentElement.clientWidth, document.documentElement.clientHeight)\n\t}\n\n\tthrow new Error('Unable to figure out browser width and height')\n}\n\n/**\n * Returns the effective zoom on a given element before window zoom level is applied\n */\nexport function getDomNodeZoomLevel(domNode: HTMLElement): number {\n\tlet testElement: HTMLElement | null = domNode;\n\tlet zoom = 1.0;\n\tdo {\n\t\tconst elementZoomLevel = (getComputedStyle(testElement) as any).zoom;\n\t\tif (elementZoomLevel !== null && elementZoomLevel !== undefined && elementZoomLevel !== '1') {\n\t\t\tzoom *= elementZoomLevel;\n\t\t}\n\n\t\ttestElement = testElement.parentElement;\n\t} while (testElement !== null && testElement !== document.documentElement);\n\n\treturn zoom;\n}\n\nconst sizeUtils = {\n\n\tgetBorderLeftWidth: function (element: HTMLElement): number {\n\t\treturn getDimension(element, 'border-left-width', 'borderLeftWidth')\n\t},\n\tgetBorderRightWidth: function (element: HTMLElement): number {\n\t\treturn getDimension(element, 'border-right-width', 'borderRightWidth')\n\t},\n\tgetBorderTopWidth: function (element: HTMLElement): number {\n\t\treturn getDimension(element, 'border-top-width', 'borderTopWidth')\n\t},\n\tgetBorderBottomWidth: function (element: HTMLElement): number {\n\t\treturn getDimension(element, 'border-bottom-width', 'borderBottomWidth')\n\t},\n\n\tgetPaddingLeft: function (element: HTMLElement): number {\n\t\treturn getDimension(element, 'padding-left', 'paddingLeft')\n\t},\n\tgetPaddingRight: function (element: HTMLElement): number {\n\t\treturn getDimension(element, 'padding-right', 'paddingRight')\n\t},\n\tgetPaddingTop: function (element: HTMLElement): number {\n\t\treturn getDimension(element, 'padding-top', 'paddingTop')\n\t},\n\tgetPaddingBottom: function (element: HTMLElement): number {\n\t\treturn getDimension(element, 'padding-bottom', 'paddingBottom')\n\t},\n\n\tgetMarginLeft: function (element: HTMLElement): number {\n\t\treturn getDimension(element, 'margin-left', 'marginLeft')\n\t},\n\tgetMarginTop: function (element: HTMLElement): number {\n\t\treturn getDimension(element, 'margin-top', 'marginTop')\n\t},\n\tgetMarginRight: function (element: HTMLElement): number {\n\t\treturn getDimension(element, 'margin-right', 'marginRight')\n\t},\n\tgetMarginBottom: function (element: HTMLElement): number {\n\t\treturn getDimension(element, 'margin-bottom', 'marginBottom')\n\t},\n\t__commaSentinel: false\n}\n\n// ----------------------------------------------------------------------------------------\n// Position & Dimension\n\nexport class Dimension {\n\tpublic width: number\n\tpublic height: number\n\n\tconstructor(width: number, height: number) {\n\t\tthis.width = width\n\t\tthis.height = height\n\t}\n\n\tstatic equals(a: Dimension | undefined, b: Dimension | undefined): boolean {\n\t\tif (a === b) {\n\t\t\treturn true\n\t\t}\n\t\tif (!a || !b) {\n\t\t\treturn false\n\t\t}\n\t\treturn a.width === b.width && a.height === b.height\n\t}\n}\n\nexport function getTopLeftOffset(element: HTMLElement): { left: number; top: number; } {\n\t// Adapted from WinJS.Utilities.getPosition\n\t// and added borders to the mix\n\n\tlet offsetParent = element.offsetParent; let top = element.offsetTop; let left = element.offsetLeft\n\n\twhile ((element = <HTMLElement>element.parentNode) !== null && element !== document.body && element !== document.documentElement) {\n\t\ttop -= element.scrollTop\n\t\tconst c = getComputedStyle(element)\n\t\tif (c) {\n\t\t\tleft -= c.direction !== 'rtl' ? element.scrollLeft : -element.scrollLeft\n\t\t}\n\n\t\tif (element === offsetParent) {\n\t\t\tleft += sizeUtils.getBorderLeftWidth(element)\n\t\t\ttop += sizeUtils.getBorderTopWidth(element)\n\t\t\ttop += element.offsetTop\n\t\t\tleft += element.offsetLeft\n\t\t\toffsetParent = element.offsetParent\n\t\t}\n\t}\n\n\treturn {\n\t\tleft,\n\t\ttop\n\t}\n}\n\nexport interface IDomNodePagePosition {\n\tleft: number;\n\ttop: number;\n\twidth: number;\n\theight: number;\n}\n\nexport function size(element: HTMLElement, width: number, height: number): void {\n\tif (typeof width === 'number') {\n\t\telement.style.width = `${width}px`\n\t}\n\n\tif (typeof height === 'number') {\n\t\telement.style.height = `${height}px`\n\t}\n}\n\nexport function position(element: HTMLElement, top: number, right?: number, bottom?: number, left?: number, position = 'absolute'): void {\n\tif (typeof top === 'number') {\n\t\telement.style.top = `${top}px`\n\t}\n\n\tif (typeof right === 'number') {\n\t\telement.style.right = `${right}px`\n\t}\n\n\tif (typeof bottom === 'number') {\n\t\telement.style.bottom = `${bottom}px`\n\t}\n\n\tif (typeof left === 'number') {\n\t\telement.style.left = `${left}px`\n\t}\n\n\telement.style.position = position\n}\n\n/**\n * Returns the position of a dom node relative to the entire page.\n */\nexport function getDomNodePagePosition(domNode: HTMLElement): IDomNodePagePosition {\n\tconst bb = domNode.getBoundingClientRect()\n\treturn {\n\t\tleft: bb.left + StandardWindow.scrollX,\n\t\ttop: bb.top + StandardWindow.scrollY,\n\t\twidth: bb.width,\n\t\theight: bb.height\n\t}\n}\n\nexport interface IStandardWindow {\n\treadonly scrollX: number;\n\treadonly scrollY: number;\n}\n\nexport const StandardWindow: IStandardWindow = new class implements IStandardWindow {\n\tget scrollX(): number {\n\t\tif (typeof window.scrollX === 'number') {\n\t\t\t// modern browsers\n\t\t\treturn window.scrollX\n\t\t} else {\n\t\t\treturn document.body.scrollLeft + document.documentElement!.scrollLeft\n\t\t}\n\t}\n\n\tget scrollY(): number {\n\t\tif (typeof window.scrollY === 'number') {\n\t\t\t// modern browsers\n\t\t\treturn window.scrollY\n\t\t} else {\n\t\t\treturn document.body.scrollTop + document.documentElement!.scrollTop\n\t\t}\n\t}\n}()\n\n// Adapted from WinJS\n// Gets the width of the element, including margins.\nexport function getTotalWidth(element: HTMLElement): number {\n\tconst margin = sizeUtils.getMarginLeft(element) + sizeUtils.getMarginRight(element)\n\treturn element.offsetWidth + margin\n}\n\nexport function getContentWidth(element: HTMLElement): number {\n\tconst border = sizeUtils.getBorderLeftWidth(element) + sizeUtils.getBorderRightWidth(element)\n\tconst padding = sizeUtils.getPaddingLeft(element) + sizeUtils.getPaddingRight(element)\n\treturn element.offsetWidth - border - padding\n}\n\nexport function getTotalScrollWidth(element: HTMLElement): number {\n\tconst margin = sizeUtils.getMarginLeft(element) + sizeUtils.getMarginRight(element)\n\treturn element.scrollWidth + margin\n}\n\n// Adapted from WinJS\n// Gets the height of the content of the specified element. The content height does not include borders or padding.\nexport function getContentHeight(element: HTMLElement): number {\n\tconst border = sizeUtils.getBorderTopWidth(element) + sizeUtils.getBorderBottomWidth(element)\n\tconst padding = sizeUtils.getPaddingTop(element) + sizeUtils.getPaddingBottom(element)\n\treturn element.offsetHeight - border - padding\n}\n\n// Adapted from WinJS\n// Gets the height of the element, including its margins.\nexport function getTotalHeight(element: HTMLElement): number {\n\tconst margin = sizeUtils.getMarginTop(element) + sizeUtils.getMarginBottom(element)\n\treturn element.offsetHeight + margin\n}\n\n// Gets the left coordinate of the specified element relative to the specified parent.\nfunction getRelativeLeft(element: HTMLElement, parent: HTMLElement): number {\n\tif (element === null) {\n\t\treturn 0\n\t}\n\n\tconst elementPosition = getTopLeftOffset(element)\n\tconst parentPosition = getTopLeftOffset(parent)\n\treturn elementPosition.left - parentPosition.left\n}\n\nexport function getLargestChildWidth(parent: HTMLElement, children: HTMLElement[]): number {\n\tconst childWidths = children.map((child) => {\n\t\treturn Math.max(getTotalScrollWidth(child), getTotalWidth(child)) + getRelativeLeft(child, parent) || 0\n\t})\n\tconst maxWidth = Math.max(...childWidths)\n\treturn maxWidth\n}\n\n// ----------------------------------------------------------------------------------------\n\nexport function isAncestor(testChild: Node | null, testAncestor: Node | null): boolean {\n\twhile (testChild) {\n\t\tif (testChild === testAncestor) {\n\t\t\treturn true\n\t\t}\n\t\ttestChild = testChild.parentNode\n\t}\n\n\treturn false\n}\n\nexport function findParentWithClass(node: HTMLElement, clazz: string, stopAtClazzOrNode?: string | HTMLElement): HTMLElement | null {\n\twhile (node) {\n\t\tif (hasClass(node, clazz)) {\n\t\t\treturn node\n\t\t}\n\n\t\tif (stopAtClazzOrNode) {\n\t\t\tif (typeof stopAtClazzOrNode === 'string') {\n\t\t\t\tif (hasClass(node, stopAtClazzOrNode)) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (node === stopAtClazzOrNode) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tnode = <HTMLElement>node.parentNode\n\t}\n\n\treturn null\n}\n\nexport function createStyleSheet(container: HTMLElement = document.getElementsByTagName('head')[0]): HTMLStyleElement {\n\tconst style = document.createElement('style')\n\tstyle.type = 'text/css'\n\tstyle.media = 'screen'\n\tcontainer.appendChild(style)\n\treturn style\n}\n\nlet _sharedStyleSheet: HTMLStyleElement | null = null\nfunction getSharedStyleSheet(): HTMLStyleElement {\n\tif (!_sharedStyleSheet) {\n\t\t_sharedStyleSheet = createStyleSheet()\n\t}\n\treturn _sharedStyleSheet\n}\n\nfunction getDynamicStyleSheetRules(style: any) {\n\tif (style && style.sheet && style.sheet.rules) {\n\t\t// Chrome, IE\n\t\treturn style.sheet.rules\n\t}\n\tif (style && style.sheet && style.sheet.cssRules) {\n\t\t// FF\n\t\treturn style.sheet.cssRules\n\t}\n\treturn []\n}\n\nexport function createCSSRule(selector: string, cssText: string, style: HTMLStyleElement = getSharedStyleSheet()): void {\n\tif (!style || !cssText) {\n\t\treturn\n\t}\n\n\t(<CSSStyleSheet>style.sheet).insertRule(selector + '{' + cssText + '}', 0)\n}\n\nexport function removeCSSRulesContainingSelector(ruleName: string, style: HTMLStyleElement = getSharedStyleSheet()): void {\n\tif (!style) {\n\t\treturn\n\t}\n\n\tconst rules = getDynamicStyleSheetRules(style)\n\tconst toDelete: number[] = []\n\tfor (let i = 0; i < rules.length; i++) {\n\t\tconst rule = rules[i]\n\t\tif (rule.selectorText.indexOf(ruleName) !== -1) {\n\t\t\ttoDelete.push(i)\n\t\t}\n\t}\n\n\tfor (let i = toDelete.length - 1; i >= 0; i--) {\n\t\t(<any>style.sheet).deleteRule(toDelete[i])\n\t}\n}\n\nexport function isHTMLElement(o: any): o is HTMLElement {\n\tif (typeof HTMLElement === 'object') {\n\t\treturn o instanceof HTMLElement\n\t}\n\treturn o && typeof o === 'object' && o.nodeType === 1 && typeof o.nodeName === 'string'\n}\nexport const EventType = {\n\t// Mouse\n\tCLICK: 'click',\n\tAUXCLICK: 'auxclick',\n\tDBLCLICK: 'dblclick',\n\tMOUSE_UP: 'mouseup',\n\tMOUSE_DOWN: 'mousedown',\n\tMOUSE_OVER: 'mouseover',\n\tMOUSE_MOVE: 'mousemove',\n\tMOUSE_OUT: 'mouseout',\n\tMOUSE_ENTER: 'mouseenter',\n\tMOUSE_LEAVE: 'mouseleave',\n\tMOUSE_WHEEL: 'wheel',\n\tPOINTER_UP: 'pointerup',\n\tPOINTER_DOWN: 'pointerdown',\n\tPOINTER_MOVE: 'pointermove',\n\tPOINTER_LEAVE: 'pointerleave',\n\tCONTEXT_MENU: 'contextmenu',\n\tWHEEL: 'wheel',\n\t// Keyboard\n\tKEY_DOWN: 'keydown',\n\tKEY_PRESS: 'keypress',\n\tKEY_UP: 'keyup',\n\t// HTML Document\n\tLOAD: 'load',\n\tBEFORE_UNLOAD: 'beforeunload',\n\tUNLOAD: 'unload',\n\tPAGE_SHOW: 'pageshow',\n\tPAGE_HIDE: 'pagehide',\n\tABORT: 'abort',\n\tERROR: 'error',\n\tRESIZE: 'resize',\n\tSCROLL: 'scroll',\n\tFULLSCREEN_CHANGE: 'fullscreenchange',\n\tWK_FULLSCREEN_CHANGE: 'webkitfullscreenchange',\n\t// Form\n\tSELECT: 'select',\n\tCHANGE: 'change',\n\tSUBMIT: 'submit',\n\tRESET: 'reset',\n\tFOCUS: 'focus',\n\tFOCUS_IN: 'focusin',\n\tFOCUS_OUT: 'focusout',\n\tBLUR: 'blur',\n\tINPUT: 'input',\n\t// Local Storage\n\tSTORAGE: 'storage',\n\t// Drag\n\tDRAG_START: 'dragstart',\n\tDRAG: 'drag',\n\tDRAG_ENTER: 'dragenter',\n\tDRAG_LEAVE: 'dragleave',\n\tDRAG_OVER: 'dragover',\n\tDROP: 'drop',\n\tDRAG_END: 'dragend',\n\t// Animation\n\tANIMATION_START: browser.isWebKit ? 'webkitAnimationStart' : 'animationstart',\n\tANIMATION_END: browser.isWebKit ? 'webkitAnimationEnd' : 'animationend',\n\tANIMATION_ITERATION: browser.isWebKit ? 'webkitAnimationIteration' : 'animationiteration'\n} as const;\n\nexport interface EventLike {\n\tpreventDefault(): void;\n\tstopPropagation(): void;\n}\n\nexport const EventHelper = {\n\tstop: function (e: EventLike, cancelBubble?: boolean) {\n\t\tif (e.preventDefault) {\n\t\t\te.preventDefault()\n\t\t} else {\n\t\t\t// IE8\n\t\t\t(<any>e).returnValue = false\n\t\t}\n\n\t\tif (cancelBubble) {\n\t\t\tif (e.stopPropagation) {\n\t\t\t\te.stopPropagation()\n\t\t\t} else {\n\t\t\t\t// IE8\n\t\t\t\t(<any>e).cancelBubble = true\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport interface IFocusTracker {\n\tonDidFocus: Event<void>;\n\tonDidBlur: Event<void>;\n\tdispose(): void;\n}\n\nexport function saveParentsScrollTop(node: Element): number[] {\n\tconst r: number[] = []\n\tfor (let i = 0; node && node.nodeType === node.ELEMENT_NODE; i++) {\n\t\tr[i] = node.scrollTop\n\t\tnode = <Element>node.parentNode\n\t}\n\treturn r\n}\n\nexport function restoreParentsScrollTop(node: Element, state: number[]): void {\n\tfor (let i = 0; node && node.nodeType === node.ELEMENT_NODE; i++) {\n\t\tif (node.scrollTop !== state[i]) {\n\t\t\tnode.scrollTop = state[i]\n\t\t}\n\t\tnode = <Element>node.parentNode\n\t}\n}\n\nclass FocusTracker implements IFocusTracker {\n\tprivate _onDidFocus = new Emitter<void>()\n\treadonly onDidFocus: Event<void> = this._onDidFocus.event\n\n\tprivate _onDidBlur = new Emitter<void>()\n\treadonly onDidBlur: Event<void> = this._onDidBlur.event\n\n\tprivate disposables: IDisposable[] = []\n\n\tconstructor(element: HTMLElement | Window) {\n\t\tlet hasFocus = isAncestor(document.activeElement, <HTMLElement>element)\n\t\tlet loosingFocus = false\n\n\t\tconst onFocus = () => {\n\t\t\tloosingFocus = false\n\t\t\tif (!hasFocus) {\n\t\t\t\thasFocus = true\n\t\t\t\tthis._onDidFocus.fire()\n\t\t\t}\n\t\t}\n\n\t\tconst onBlur = () => {\n\t\t\tif (hasFocus) {\n\t\t\t\tloosingFocus = true\n\t\t\t\twindow.setTimeout(() => {\n\t\t\t\t\tif (loosingFocus) {\n\t\t\t\t\t\tloosingFocus = false\n\t\t\t\t\t\thasFocus = false\n\t\t\t\t\t\tthis._onDidBlur.fire()\n\t\t\t\t\t}\n\t\t\t\t}, 0)\n\t\t\t}\n\t\t}\n\n\t\tdomEvent(element, EventType.FOCUS, true)(onFocus, null, this.disposables)\n\t\tdomEvent(element, EventType.BLUR, true)(onBlur, null, this.disposables)\n\t}\n\n\tdispose(): void {\n\t\tthis.disposables = dispose(this.disposables)\n\t\tthis._onDidFocus.dispose()\n\t\tthis._onDidBlur.dispose()\n\t}\n}\n\nexport function trackFocus(element: HTMLElement | Window): IFocusTracker {\n\treturn new FocusTracker(element)\n}\n\nexport function append<T extends Node>(parent: HTMLElement, ...children: T[]): T {\n\tchildren.forEach(child => parent.appendChild(child))\n\treturn children[children.length - 1]\n}\n\nexport function prepend<T extends Node>(parent: HTMLElement, child: T): T {\n\tparent.insertBefore(child, parent.firstChild)\n\treturn child\n}\n\nconst SELECTOR_REGEX = /([\\w\\\\-]+)?(#([\\w\\\\-]+))?((.([\\w\\\\-]+))*)/\n\nexport function $<T extends HTMLElement>(description: string, attrs?: { [key: string]: any; }, ...children: Array<Node | string>): T {\n\tconst match = SELECTOR_REGEX.exec(description)\n\n\tif (!match) {\n\t\tthrow new Error('Bad use of emmet')\n\t}\n\n\tconst result = document.createElement(match[1] || 'div')\n\n\tif (match[3]) {\n\t\tresult.id = match[3]\n\t}\n\tif (match[4]) {\n\t\tresult.className = match[4].replace(/\\./g, ' ').trim()\n\t}\n\n\tattrs = attrs || {}\n\tObject.keys(attrs).forEach(name => {\n\t\tconst value = attrs![name]\n\t\tif (/^on\\w+$/.test(name)) {\n\t\t\t(<any>result)[name] = value\n\t\t} else if (name === 'selected') {\n\t\t\tif (value) {\n\t\t\t\tresult.setAttribute(name, 'true')\n\t\t\t}\n\t\t} else {\n\t\t\tresult.setAttribute(name, value)\n\t\t}\n\t})\n\n\tcoalesce(children)\n\t\t.forEach(child => {\n\t\t\tif (child instanceof Node) {\n\t\t\t\tresult.appendChild(child)\n\t\t\t} else {\n\t\t\t\tresult.appendChild(document.createTextNode(child as string))\n\t\t\t}\n\t\t})\n\n\treturn result as T\n}\n\nexport function join(nodes: Node[], separator: Node | string): Node[] {\n\tconst result: Node[] = []\n\n\tnodes.forEach((node, index) => {\n\t\tif (index > 0) {\n\t\t\tif (separator instanceof Node) {\n\t\t\t\tresult.push(separator.cloneNode())\n\t\t\t} else {\n\t\t\t\tresult.push(document.createTextNode(separator))\n\t\t\t}\n\t\t}\n\n\t\tresult.push(node)\n\t})\n\n\treturn result\n}\n\nexport function show(...elements: HTMLElement[]): void {\n\tfor (const element of elements) {\n\t\tif (element) {\n\t\t\telement.style.display = ''\n\t\t\telement.removeAttribute('aria-hidden')\n\t\t}\n\t}\n}\n\nexport function hide(...elements: HTMLElement[]): void {\n\tfor (const element of elements) {\n\t\tif (element) {\n\t\t\telement.style.display = 'none'\n\t\t\telement.setAttribute('aria-hidden', 'true')\n\t\t}\n\t}\n}\n\nfunction findParentWithAttribute(node: Node | null, attribute: string): HTMLElement | null {\n\twhile (node) {\n\t\tif (node instanceof HTMLElement && node.hasAttribute(attribute)) {\n\t\t\treturn node\n\t\t}\n\n\t\tnode = node.parentNode\n\t}\n\n\treturn null\n}\n\nexport function removeTabIndexAndUpdateFocus(node: HTMLElement): void {\n\tif (!node || !node.hasAttribute('tabIndex')) {\n\t\treturn\n\t}\n\n\t// If we are the currently focused element and tabIndex is removed,\n\t// standard DOM behavior is to move focus to the <body> element. We\n\t// typically never want that, rather put focus to the closest element\n\t// in the hierarchy of the parent DOM nodes.\n\tif (document.activeElement === node) {\n\t\tconst parentFocusable = findParentWithAttribute(node.parentElement, 'tabIndex')\n\t\tif (parentFocusable) {\n\t\t\tparentFocusable.focus()\n\t\t}\n\t}\n\n\tnode.removeAttribute('tabindex')\n}\n\nexport function getElementsByTagName(tag: string): HTMLElement[] {\n\treturn Array.prototype.slice.call(document.getElementsByTagName(tag), 0)\n}\n\nexport function finalHandler<T extends DOMEvent>(fn: (event: T) => any): (event: T) => any {\n\treturn e => {\n\t\te.preventDefault()\n\t\te.stopPropagation()\n\t\tfn(e)\n\t}\n}\n\nexport function domContentLoaded(): Promise<any> {\n\treturn new Promise<any>(resolve => {\n\t\tconst readyState = document.readyState\n\t\tif (readyState === 'complete' || (document && document.body !== null)) {\n\t\t\tplatform.setImmediate(resolve)\n\t\t} else {\n\t\t\twindow.addEventListener('DOMContentLoaded', resolve, false)\n\t\t}\n\t})\n}\n\n/**\n * Find a value usable for a dom node size such that the likelihood that it would be\n * displayed with constant screen pixels size is as high as possible.\n *\n * e.g. We would desire for the cursors to be 2px (CSS px) wide. Under a devicePixelRatio\n * of 1.25, the cursor will be 2.5 screen pixels wide. Depending on how the dom node aligns/\"snaps\"\n * with the screen pixels, it will sometimes be rendered with 2 screen pixels, and sometimes with 3 screen pixels.\n */\nexport function computeScreenAwareSize(cssPx: number): number {\n\tconst screenPx = window.devicePixelRatio * cssPx\n\treturn Math.max(1, Math.floor(screenPx)) / window.devicePixelRatio\n}\n\n/**\n * See https://github.com/Microsoft/monaco-editor/issues/601\n * To protect against malicious code in the linked site, particularly phishing attempts,\n * the window.opener should be set to null to prevent the linked site from having access\n * to change the location of the current page.\n * See https://mathiasbynens.github.io/rel-noopener/\n */\nexport function windowOpenNoOpener(url: string): void {\n\tif (platform.isNative || browser.isEdgeWebView) {\n\t\t// In VSCode, window.open() always returns null...\n\t\t// The same is true for a WebView (see https://github.com/Microsoft/monaco-editor/issues/628)\n\t\twindow.open(url)\n\t} else {\n\t\tconst newTab = window.open()\n\t\tif (newTab) {\n\t\t\t(newTab as any).opener = null\n\t\t\tnewTab.location.href = url\n\t\t}\n\t}\n}\n\nexport function animate(fn: () => void): IDisposable {\n\tconst step = () => {\n\t\tfn()\n\t\tstepDisposable = scheduleAtNextAnimationFrame(step)\n\t}\n\n\tlet stepDisposable = scheduleAtNextAnimationFrame(step)\n\treturn toDisposable(() => stepDisposable.dispose())\n}","/* ---------------------------------------------------------------------------------------------\n * Copyright (c) AlexTorresDev. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\nimport { Menu, MenuItem, ipcRenderer } from 'electron'\nimport * as DOM from 'base/common/dom'\nimport { Emitter, Event } from 'base/common/event'\nimport { Disposable, IDisposable, dispose } from 'base/common/lifecycle'\nimport { isMacintosh } from 'base/common/platform'\nimport { MenuBarOptions } from './menubar-options'\nimport { StandardKeyboardEvent } from 'base/browser/keyboardEvent'\nimport { KeyCode, KeyMod, ScanCode, ScanCodeUtils } from 'base/common/keyCodes'\nimport {\n MENU_ESCAPED_MNEMONIC_REGEX,\n MENU_MNEMONIC_REGEX,\n cleanMnemonic\n} from 'consts'\nimport { CETMenu, Direction, IMenuOptions } from './menu'\nimport { IMenuStyle } from './menu/item'\nimport { RunOnceScheduler } from 'base/common/async'\nimport { StandardMouseEvent } from 'base/browser/mouseEvent'\nimport { EventType, Gesture, GestureEvent } from 'base/browser/touch'\nimport * as strings from 'base/common/strings'\nimport { IpcChannels } from 'types/ipc-contract'\n\nconst $ = DOM.$\n\nexport interface IMenuIcons {\n readonly submenuIndicator: string\n readonly checkbox: string\n readonly radioChecked: string\n readonly radioUnchecked: string\n}\n\nexport interface IMenuBarOptions {\n enableMnemonics?: boolean\n disableAltFocus?: boolean\n visibility?: string\n // getKeybinding?: (action: IAction) => ResolvedKeybinding | undefined\n alwaysOnMnemonics?: boolean\n compactMode?: Direction\n // actionRunner?: IActionRunner\n // getCompactMenuActions?: () => IAction[]\n}\n\ninterface MenuBarMenuWithElements extends MenuItem {\n titleElement?: HTMLElement\n buttonElement?: HTMLElement\n}\n\nenum MenubarState {\n HIDDEN,\n VISIBLE,\n FOCUSED,\n OPEN\n}\nexport class MenuBar extends Disposable {\n static readonly OVERFLOW_INDEX: number = -1\n\n private menus: MenuBarMenuWithElements[]\n\n private overflowMenu!: MenuBarMenuWithElements & {\n titleElement: HTMLElement\n buttonElement: HTMLElement\n }\n\n private focusedMenu:\n | {\n index: number\n holder?: HTMLElement\n widget?: CETMenu\n }\n | undefined\n\n private focusToReturn: HTMLElement | undefined\n private menuUpdater: RunOnceScheduler\n\n // Input-related\n private _mnemonicsInUse: boolean = false\n private openedViaKeyboard: boolean = false\n private awaitingAltRelease: boolean = false\n private ignoreNextMouseUp: boolean = false\n private mnemonics: Map<string, number>\n\n private updatePending: boolean = false\n private _focusState: MenubarState\n // private actionRunner: IActionRunner\n\n private readonly _onVisibilityChange: Emitter<boolean>\n private readonly _onFocusStateChange: Emitter<boolean>\n\n private numMenusShown: number = 0\n private overflowLayoutScheduled: IDisposable | undefined = undefined\n private overflowLayoutPasses: number = 0\n\n private menuStyle: IMenuStyle = {}\n\n constructor(\n private container: HTMLElement,\n private menuIcons: IMenuIcons,\n private currentOptions: MenuBarOptions,\n private options: IMenuBarOptions,\n private closeMenu = () => {}\n ) {\n super()\n\n this.container.setAttribute('role', 'menubar')\n if (this.isCompact) {\n this.container.classList.add('compact')\n }\n\n this.menus = []\n this.mnemonics = new Map<string, number>()\n\n this._focusState = MenubarState.VISIBLE\n\n this._onVisibilityChange = this._register(new Emitter<boolean>())\n this._onFocusStateChange = this._register(new Emitter<boolean>())\n\n this.createOverflowMenu()\n\n this.menuUpdater = this._register(\n new RunOnceScheduler(() => this.update(), 200)\n )\n\n this.registerListeners()\n this.setUnfocusedState()\n }\n\n private registerListeners(): void {\n if (!isMacintosh) {\n this._register(\n DOM.addDisposableListener(window, DOM.EventType.RESIZE, () => {\n this.updateOverflowAction()\n this.blur()\n })\n )\n }\n\n this._register(\n DOM.ModifierKeyEmitter.getInstance().event(\n this.onModifierKeyToggled,\n this\n )\n )\n\n this._register(\n DOM.addDisposableListener(this.container, DOM.EventType.KEY_DOWN, (e) => {\n const event = new StandardKeyboardEvent(e as KeyboardEvent)\n let eventHandled = true\n const key = !!e.key ? e.key.toLocaleLowerCase() : ''\n\n const tabNav = isMacintosh && !this.isCompact\n\n if (\n event.equals(KeyCode.LeftArrow) ||\n (tabNav && event.equals(KeyCode.Tab | KeyMod.Shift))\n ) {\n this.focusPrevious()\n } else if (\n event.equals(KeyCode.RightArrow) ||\n (tabNav && event.equals(KeyCode.Tab))\n ) {\n this.focusNext()\n } else if (\n event.equals(KeyCode.Escape) &&\n this.isFocused &&\n !this.isOpen\n ) {\n this.setUnfocusedState()\n } else if (\n !this.isOpen &&\n !event.ctrlKey &&\n this.options.enableMnemonics &&\n this.mnemonicsInUse &&\n this.mnemonics.has(key)\n ) {\n const menuIndex = this.mnemonics.get(key)!\n this.onMenuTriggered(menuIndex, false)\n } else {\n eventHandled = false\n }\n\n // Never allow default tab behavior when not compact\n if (\n !this.isCompact &&\n (event.equals(KeyCode.Tab | KeyMod.Shift) ||\n event.equals(KeyCode.Tab))\n ) {\n event.preventDefault()\n }\n\n if (eventHandled) {\n event.preventDefault()\n event.stopPropagation()\n }\n })\n )\n\n this._register(\n DOM.addDisposableListener(window, DOM.EventType.MOUSE_DOWN, () => {\n // This mouse event is outside the menubar so it counts as a focus out\n if (this.isFocused) {\n this.setUnfocusedState()\n }\n })\n )\n\n this._register(\n DOM.addDisposableListener(this.container, DOM.EventType.FOCUS_IN, (e) => {\n const event = e as FocusEvent\n\n if (event.relatedTarget) {\n if (!this.container.contains(event.relatedTarget as HTMLElement)) {\n this.focusToReturn = event.relatedTarget as HTMLElement\n }\n }\n })\n )\n\n this._register(\n DOM.addDisposableListener(\n this.container,\n DOM.EventType.FOCUS_OUT,\n (e) => {\n const event = e as FocusEvent\n\n // We are losing focus and there is a target, reset focusToReturn value as not to redirect\n if (\n event.relatedTarget &&\n !this.container.contains(event.relatedTarget as HTMLElement)\n ) {\n this.focusToReturn = undefined\n this.setUnfocusedState()\n }\n }\n )\n )\n\n this._register(\n DOM.addDisposableListener(\n window,\n DOM.EventType.KEY_DOWN,\n (e: KeyboardEvent) => {\n if (\n !this.options.enableMnemonics ||\n !e.altKey ||\n e.ctrlKey ||\n e.defaultPrevented\n ) {\n return\n }\n\n const key = e.key.toLocaleLowerCase()\n if (!this.mnemonics.has(key)) {\n return\n }\n\n this.mnemonicsInUse = true\n this.updateMnemonicVisibility(true)\n\n const menuIndex = this.mnemonics.get(key)!\n this.onMenuTriggered(menuIndex, false)\n }\n )\n )\n }\n\n push(menu: Menu): void {\n const topLevelMenus = menu.items\n\n topLevelMenus.forEach((menuBarMenu) => {\n const menuIndex = this.menus.length\n const cleanMenuLabel = cleanMnemonic(menuBarMenu.label)\n\n const mnemonicMatches = MENU_MNEMONIC_REGEX.exec(menuBarMenu.label)\n\n // Register mnemonics\n if (mnemonicMatches) {\n const mnemonic = !!mnemonicMatches[1]\n ? mnemonicMatches[1]\n : mnemonicMatches[3]\n\n this.registerMnemonic(this.menus.length, mnemonic)\n }\n\n if (this.isCompact) {\n this.menus.push({\n ...menuBarMenu,\n label: ''\n })\n } else {\n const buttonElement = $('.cet-menubar-menu-button', {\n role: 'menuitem',\n tabindex: -1,\n 'aria-label': cleanMenuLabel,\n 'aria-haspopup': true\n })\n const titleElement = $('.cet-menubar-menu-title', {\n role: 'none',\n 'aria-hidden': true\n })\n\n buttonElement.appendChild(titleElement)\n this.container.insertBefore(\n buttonElement,\n this.overflowMenu.buttonElement\n )\n\n this.updateLabels(titleElement, buttonElement, menuBarMenu.label)\n\n this._register(\n DOM.addDisposableListener(\n buttonElement,\n DOM.EventType.KEY_UP,\n (e) => {\n const event = new StandardKeyboardEvent(e as KeyboardEvent)\n let eventHandled = true\n\n if (\n (event.equals(KeyCode.DownArrow) ||\n event.equals(KeyCode.Enter)) &&\n !this.isOpen\n ) {\n this.focusedMenu = { index: menuIndex }\n this.openedViaKeyboard = true\n this.focusState = MenubarState.OPEN\n } else {\n eventHandled = false\n }\n\n if (eventHandled) {\n event.preventDefault()\n event.stopPropagation()\n }\n }\n )\n )\n\n this._register(Gesture.addTarget(buttonElement))\n this._register(\n DOM.addDisposableListener(\n buttonElement,\n EventType.Tap,\n (e: GestureEvent) => {\n // Ignore this touch if the menu is touched\n if (\n this.isOpen &&\n this.focusedMenu &&\n this.focusedMenu.holder &&\n DOM.isAncestor(\n e.initialTarget as HTMLElement,\n this.focusedMenu.holder\n )\n ) {\n return\n }\n\n this.ignoreNextMouseUp = false\n this.onMenuTriggered(menuIndex, true)\n\n e.preventDefault()\n e.stopPropagation()\n }\n )\n )\n\n this._register(\n DOM.addDisposableListener(\n buttonElement,\n DOM.EventType.MOUSE_DOWN,\n (e: MouseEvent) => {\n // Ignore non-left-click\n const mouseEvent = new StandardMouseEvent(e)\n if (!mouseEvent.leftButton) {\n e.preventDefault()\n return\n }\n\n if (!this.isOpen) {\n // Open the menu with mouse down and ignore the following mouse up event\n this.ignoreNextMouseUp = true\n this.onMenuTriggered(menuIndex, true)\n } else {\n this.ignoreNextMouseUp = false\n }\n\n e.preventDefault()\n e.stopPropagation()\n }\n )\n )\n\n this._register(\n DOM.addDisposableListener(\n buttonElement,\n DOM.EventType.MOUSE_UP,\n (e) => {\n if (e.defaultPrevented) {\n return\n }\n\n if (!this.ignoreNextMouseUp) {\n if (this.isFocused) {\n this.onMenuTriggered(menuIndex, true)\n }\n } else {\n this.ignoreNextMouseUp = false\n }\n }\n )\n )\n\n this._register(\n DOM.addDisposableListener(\n buttonElement,\n DOM.EventType.MOUSE_ENTER,\n () => {\n if (this.isOpen && !this.isCurrentMenu(menuIndex)) {\n buttonElement.focus()\n this.cleanupMenu()\n this.showMenu(menuIndex, false)\n } else if (this.isFocused && !this.isOpen) {\n this.focusedMenu = { index: menuIndex }\n buttonElement.focus()\n }\n }\n )\n )\n\n this.menus.push({\n ...menuBarMenu,\n buttonElement,\n titleElement\n })\n }\n })\n\n // Recompute overflow after adding all top-level menus so initial render has the right state.\n this.updateOverflowAction()\n }\n\n createOverflowMenu(): void {\n const label = this.isCompact ? 'Compact' : 'More'\n const buttonElement = $('.cet-menubar-menu-button', {\n role: 'menuitem',\n tabindex: this.isCompact ? 0 : -1,\n 'aria-label': label,\n 'aria-haspopup': true\n })\n const titleElement = $('.cet-menubar-menu-title.cet-toggle-more', {\n role: 'none',\n 'aria-hidden': true\n })\n titleElement.textContent = '...'\n\n buttonElement.appendChild(titleElement)\n this.container.appendChild(buttonElement)\n buttonElement.style.display = 'none'\n\n this._register(\n DOM.addDisposableListener(buttonElement, DOM.EventType.KEY_UP, (e) => {\n const event = new StandardKeyboardEvent(e as KeyboardEvent)\n let eventHandled = true\n\n const triggerKeys = [KeyCode.Enter]\n if (!this.isCompact) {\n triggerKeys.push(KeyCode.DownArrow)\n } else {\n triggerKeys.push(KeyCode.Space)\n\n if (this.options.compactMode === Direction.Right) {\n triggerKeys.push(KeyCode.RightArrow)\n } else if (this.options.compactMode === Direction.Left) {\n triggerKeys.push(KeyCode.LeftArrow)\n }\n }\n\n if (triggerKeys.some((k) => event.equals(k)) && !this.isOpen) {\n this.focusedMenu = { index: MenuBar.OVERFLOW_INDEX }\n this.openedViaKeyboard = true\n this.focusState = MenubarState.OPEN\n } else {\n eventHandled = false\n }\n\n if (eventHandled) {\n event.preventDefault()\n event.stopPropagation()\n }\n })\n )\n\n this._register(Gesture.addTarget(buttonElement))\n this._register(\n DOM.addDisposableListener(\n buttonElement,\n EventType.Tap,\n (e: GestureEvent) => {\n // Ignore this touch if the menu is touched\n if (\n this.isOpen &&\n this.focusedMenu &&\n this.focusedMenu.holder &&\n DOM.isAncestor(\n e.initialTarget as HTMLElement,\n this.focusedMenu.holder\n )\n ) {\n return\n }\n\n this.ignoreNextMouseUp = false\n this.onMenuTriggered(MenuBar.OVERFLOW_INDEX, true)\n\n e.preventDefault()\n e.stopPropagation()\n }\n )\n )\n\n this._register(\n DOM.addDisposableListener(\n buttonElement,\n DOM.EventType.MOUSE_DOWN,\n (e) => {\n // Ignore non-left-click\n const mouseEvent = new StandardMouseEvent(e)\n if (!mouseEvent.leftButton) {\n e.preventDefault()\n return\n }\n\n if (!this.isOpen) {\n // Open the menu with mouse down and ignore the following mouse up event\n this.ignoreNextMouseUp = true\n this.onMenuTriggered(MenuBar.OVERFLOW_INDEX, true)\n } else {\n this.ignoreNextMouseUp = false\n }\n\n e.preventDefault()\n e.stopPropagation()\n }\n )\n )\n\n this._register(\n DOM.addDisposableListener(buttonElement, DOM.EventType.MOUSE_UP, (e) => {\n if (e.defaultPrevented) {\n return\n }\n\n if (!this.ignoreNextMouseUp) {\n if (this.isFocused) {\n this.onMenuTriggered(MenuBar.OVERFLOW_INDEX, true)\n }\n } else {\n this.ignoreNextMouseUp = false\n }\n })\n )\n\n this._register(\n DOM.addDisposableListener(\n buttonElement,\n DOM.EventType.MOUSE_ENTER,\n () => {\n if (this.isOpen && !this.isCurrentMenu(MenuBar.OVERFLOW_INDEX)) {\n this.overflowMenu.buttonElement.focus()\n this.cleanupMenu()\n this.showMenu(MenuBar.OVERFLOW_INDEX, false)\n } else if (this.isFocused && !this.isOpen) {\n this.focusedMenu = { index: MenuBar.OVERFLOW_INDEX }\n buttonElement.focus()\n }\n }\n )\n )\n\n this.overflowMenu = {\n type: 'submenu',\n toolTip: '',\n visible: true,\n sublabel: '',\n registerAccelerator: false,\n buttonElement,\n titleElement,\n label: 'More',\n submenu: undefined,\n checked: false,\n click: () => {},\n commandId: 0,\n enabled: true,\n id: '',\n menu: {} as any,\n sharingItem: {},\n accelerator: null,\n userAccelerator: null\n }\n }\n\n setStyles(style: IMenuStyle) {\n this.menuStyle = style\n }\n\n updateMenu(menu: MenuItem): void {\n const menuToUpdate = this.menus.filter(\n (menuBarMenu) => menuBarMenu.label === menu.label\n )\n if (menuToUpdate && menuToUpdate.length) {\n // menuToUpdate[0].actions = menu.actions;\n }\n }\n\n override dispose(): void {\n super.dispose()\n\n this.menus.forEach((menuBarMenu) => {\n menuBarMenu.titleElement?.remove()\n menuBarMenu.buttonElement?.remove()\n })\n\n this.overflowMenu.titleElement.remove()\n this.overflowMenu.buttonElement.remove()\n\n dispose(this.overflowLayoutScheduled)\n this.overflowLayoutScheduled = undefined\n }\n\n blur(): void {\n this.setUnfocusedState()\n }\n\n getWidth(): number {\n if (!this.isCompact && this.menus) {\n const left = this.menus[0].buttonElement!.getBoundingClientRect().left\n const right = this.hasOverflow\n ? this.overflowMenu.buttonElement.getBoundingClientRect().right\n : this.menus[\n this.menus.length - 1\n ].buttonElement!.getBoundingClientRect().right\n return right - left\n }\n\n return 0\n }\n\n getHeight(): number {\n return this.container.clientHeight\n }\n\n toggleFocus(): void {\n if (!this.isFocused && this.options.visibility !== 'hidden') {\n this.mnemonicsInUse = true\n this.focusedMenu = {\n index: this.numMenusShown > 0 ? 0 : MenuBar.OVERFLOW_INDEX\n }\n this.focusState = MenubarState.FOCUSED\n } else if (!this.isOpen) {\n this.setUnfocusedState()\n }\n }\n\n private updateOverflowAction(scheduleStabilizationPass = false): void {\n if (!this.menus || !this.menus.length) {\n return\n }\n\n const overflowMenuOnlyClass = 'overflow-menu-only'\n this.container.classList.toggle(overflowMenuOnlyClass, false)\n\n const containerRect = this.container.getBoundingClientRect()\n\n // The title is centered with position:absolute at 50% of the titlebar.\n // The menubar can use the space up to where the title starts, i.e. half\n // the titlebar width minus half the title width minus a small margin.\n const titleEl = this.container.parentElement?.querySelector(\n '.cet-title'\n ) as HTMLElement | null\n const titlebarWidth =\n this.container.parentElement?.offsetWidth ?? window.innerWidth\n const titleWidth = titleEl?.offsetWidth ?? 0\n const menuBarMargin = 20 // matches the CSS margin-right on .cet-menubar\n\n // Space from the start of the menubar container to just before the centered title\n const sizeAvailable =\n titlebarWidth / 2 - titleWidth / 2 - menuBarMargin - containerRect.left\n\n let currentSize = 0\n let full = this.isCompact\n const prevNumMenusShown = this.numMenusShown\n this.numMenusShown = 0\n\n const showableMenus = this.menus.filter(\n (menu) =>\n menu.buttonElement !== undefined && menu.titleElement !== undefined\n ) as (MenuBarMenuWithElements & {\n titleElement: HTMLElement\n buttonElement: HTMLElement\n })[]\n\n // Temporarily show overflow button to measure its width reliably\n const wasOverflowHidden =\n this.overflowMenu.buttonElement.style.display === 'none'\n if (wasOverflowHidden) {\n this.overflowMenu.buttonElement.style.display = ''\n }\n const overflowButtonWidth =\n this.overflowMenu.buttonElement.getBoundingClientRect().width ||\n this.overflowMenu.buttonElement.offsetWidth ||\n 28\n if (wasOverflowHidden) {\n this.overflowMenu.buttonElement.style.display = 'none'\n }\n\n // Reset: show all menus so getBoundingClientRect() returns real widths.\n // This also fixes menus not reappearing when the window grows back.\n for (const menuBarMenu of showableMenus) {\n menuBarMenu.buttonElement.style.display = ''\n }\n\n for (const menuBarMenu of showableMenus) {\n if (!full) {\n const size = menuBarMenu.buttonElement.getBoundingClientRect().width\n const reserveOverflowButton =\n !this.isCompact && this.numMenusShown < showableMenus.length - 1\n const requiredSize =\n currentSize + size + (reserveOverflowButton ? overflowButtonWidth : 0)\n\n if (requiredSize > sizeAvailable) {\n full = true\n } else {\n currentSize += size\n this.numMenusShown++\n }\n }\n\n if (full) {\n menuBarMenu.buttonElement.style.display = 'none'\n }\n }\n\n // Overflow\n if (this.isCompact) {\n this.rebuildOverflowMenu(showableMenus, this.numMenusShown)\n\n this.overflowMenu.buttonElement.remove()\n if (this.numMenusShown < showableMenus.length) {\n this.container.insertBefore(\n this.overflowMenu.buttonElement,\n showableMenus[this.numMenusShown].buttonElement\n )\n } else {\n this.container.appendChild(this.overflowMenu.buttonElement)\n }\n\n this.overflowMenu.buttonElement.style.display = ''\n } else if (full) {\n this.rebuildOverflowMenu(showableMenus, this.numMenusShown)\n this.overflowMenu.buttonElement.remove()\n if (this.numMenusShown < showableMenus.length) {\n this.container.insertBefore(\n this.overflowMenu.buttonElement,\n showableMenus[this.numMenusShown].buttonElement\n )\n } else {\n this.container.appendChild(this.overflowMenu.buttonElement)\n }\n\n this.overflowMenu.buttonElement.style.display = ''\n } else {\n this.overflowMenu.submenu = undefined\n this.overflowMenu.buttonElement.remove()\n this.container.appendChild(this.overflowMenu.buttonElement)\n this.overflowMenu.buttonElement.style.display = 'none'\n }\n\n this.container.classList.toggle(\n overflowMenuOnlyClass,\n this.numMenusShown === 0\n )\n }\n\n private updateLabels(\n titleElement: HTMLElement,\n buttonElement: HTMLElement,\n label: string\n ): void {\n const cleanMenuLabel = cleanMnemonic(label)\n\n // Update the button label to reflect mnemonics\n if (this.options.enableMnemonics) {\n const cleanLabel = strings.escape(label)\n\n // This is global so reset it\n MENU_ESCAPED_MNEMONIC_REGEX.lastIndex = 0\n let escMatch = MENU_ESCAPED_MNEMONIC_REGEX.exec(cleanLabel)\n\n // We can't use negative lookbehind so we match our negative and skip\n while (escMatch && escMatch[1]) {\n escMatch = MENU_ESCAPED_MNEMONIC_REGEX.exec(cleanLabel)\n }\n\n const replaceDoubleEscapes = (str: string) =>\n str.replace(/&amp;&amp;/g, '&amp;')\n\n if (escMatch) {\n titleElement.innerText = ''\n titleElement.append(\n strings.ltrim(\n replaceDoubleEscapes(cleanLabel.substring(0, escMatch.index)),\n ' '\n ),\n $('mnemonic', { 'aria-hidden': 'true' }, escMatch[3]),\n strings.rtrim(\n replaceDoubleEscapes(\n cleanLabel.substring(escMatch.index + escMatch[0].length)\n ),\n ' '\n )\n )\n } else {\n titleElement.innerText = replaceDoubleEscapes(cleanLabel).trim()\n }\n } else {\n titleElement.innerText = cleanMenuLabel.replace(/&&/g, '&')\n }\n\n const mnemonicMatches = MENU_MNEMONIC_REGEX.exec(label)\n\n // Register mnemonics\n if (mnemonicMatches) {\n const mnemonic = !!mnemonicMatches[1]\n ? mnemonicMatches[1]\n : mnemonicMatches[3]\n\n if (this.options.enableMnemonics) {\n buttonElement.setAttribute(\n 'aria-keyshortcuts',\n 'Alt+' + mnemonic.toLocaleLowerCase()\n )\n } else {\n buttonElement.removeAttribute('aria-keyshortcuts')\n }\n }\n }\n\n update(options?: IMenuBarOptions): void {\n if (options) {\n this.options = options\n }\n\n // Don't update while using the menu\n if (this.isFocused) {\n this.updatePending = true\n return\n }\n\n this.menus.forEach((menuBarMenu) => {\n if (!menuBarMenu.buttonElement || !menuBarMenu.titleElement) {\n return\n }\n\n this.updateLabels(\n menuBarMenu.titleElement,\n menuBarMenu.buttonElement,\n menuBarMenu.label\n )\n })\n\n if (!this.overflowLayoutScheduled) {\n this.overflowLayoutPasses = 0\n this.overflowLayoutScheduled = DOM.scheduleAtNextAnimationFrame(() => {\n this.updateOverflowAction(true)\n this.overflowLayoutScheduled = undefined\n })\n }\n\n this.setUnfocusedState()\n }\n\n private registerMnemonic(menuIndex: number, mnemonic: string): void {\n this.mnemonics.set(mnemonic.toLocaleLowerCase(), menuIndex)\n }\n\n private hideMenubar(): void {\n if (this.container.style.display !== 'none') {\n this.container.style.display = 'none'\n this._onVisibilityChange.fire(false)\n }\n }\n\n private showMenubar(): void {\n if (this.container.style.display !== 'flex') {\n this.container.style.display = 'flex'\n this._onVisibilityChange.fire(true)\n\n this.updateOverflowAction()\n }\n }\n\n private get focusState(): MenubarState {\n return this._focusState\n }\n\n private set focusState(value: MenubarState) {\n if (\n this._focusState >= MenubarState.FOCUSED &&\n value < MenubarState.FOCUSED\n ) {\n // Losing focus, update the menu if needed\n\n if (this.updatePending) {\n this.menuUpdater.schedule()\n this.updatePending = false\n }\n }\n\n if (value === this._focusState) {\n return\n }\n\n const isVisible = this.isVisible\n const isOpen = this.isOpen\n const isFocused = this.isFocused\n\n this._focusState = value\n\n switch (value) {\n case MenubarState.HIDDEN:\n if (isVisible) {\n this.hideMenubar()\n }\n\n if (isOpen) {\n this.cleanupMenu()\n }\n\n if (isFocused) {\n this.focusedMenu = undefined\n\n if (this.focusToReturn) {\n this.focusToReturn.focus()\n this.focusToReturn = undefined\n }\n }\n\n break\n case MenubarState.VISIBLE:\n if (!isVisible) {\n this.showMenubar()\n }\n\n if (isOpen) {\n this.cleanupMenu()\n }\n\n if (isFocused) {\n if (this.focusedMenu) {\n if (this.focusedMenu.index === MenuBar.OVERFLOW_INDEX) {\n this.overflowMenu.buttonElement.blur()\n } else {\n this.menus[this.focusedMenu.index].buttonElement?.blur()\n }\n }\n\n this.focusedMenu = undefined\n\n if (this.focusToReturn) {\n this.focusToReturn.focus()\n this.focusToReturn = undefined\n }\n }\n\n break\n case MenubarState.FOCUSED:\n if (!isVisible) {\n this.showMenubar()\n }\n\n if (isOpen) {\n this.cleanupMenu()\n }\n\n if (this.focusedMenu) {\n if (this.focusedMenu.index === MenuBar.OVERFLOW_INDEX) {\n this.overflowMenu.buttonElement.focus()\n } else {\n this.menus[this.focusedMenu.index].buttonElement?.focus()\n }\n }\n break\n case MenubarState.OPEN:\n if (!isVisible) {\n this.showMenubar()\n }\n\n if (this.focusedMenu) {\n this.showMenu(this.focusedMenu.index, this.openedViaKeyboard)\n }\n break\n }\n\n this._focusState = value\n this._onFocusStateChange.fire(this.focusState >= MenubarState.FOCUSED)\n }\n\n get isVisible(): boolean {\n return this.focusState >= MenubarState.VISIBLE\n }\n\n private get isFocused(): boolean {\n return this.focusState >= MenubarState.FOCUSED\n }\n\n private get isOpen(): boolean {\n return this.focusState >= MenubarState.OPEN\n }\n\n private get hasOverflow(): boolean {\n return this.isCompact || this.numMenusShown < this.menus.length\n }\n\n private get isCompact(): boolean {\n return this.options.compactMode !== undefined\n }\n\n private setUnfocusedState(): void {\n if (\n this.options.visibility === 'toggle' ||\n this.options.visibility === 'hidden'\n ) {\n this.focusState = MenubarState.HIDDEN\n } else if (this.options.visibility === 'classic') {\n this.focusState = MenubarState.HIDDEN\n } else {\n this.focusState = MenubarState.VISIBLE\n }\n\n this.ignoreNextMouseUp = false\n this.mnemonicsInUse = false\n this.updateMnemonicVisibility(false)\n }\n\n private focusPrevious(): void {\n if (!this.focusedMenu || this.numMenusShown === 0) {\n return\n }\n\n let newFocusedIndex =\n (this.focusedMenu.index - 1 + this.numMenusShown) % this.numMenusShown\n if (this.focusedMenu.index === MenuBar.OVERFLOW_INDEX) {\n newFocusedIndex = this.numMenusShown - 1\n } else if (this.focusedMenu.index === 0 && this.hasOverflow) {\n newFocusedIndex = MenuBar.OVERFLOW_INDEX\n }\n\n if (newFocusedIndex === this.focusedMenu.index) {\n return\n }\n\n if (this.isOpen) {\n this.cleanupMenu()\n this.showMenu(newFocusedIndex)\n } else if (this.isFocused) {\n this.focusedMenu.index = newFocusedIndex\n if (newFocusedIndex === MenuBar.OVERFLOW_INDEX) {\n this.overflowMenu.buttonElement.focus()\n } else {\n this.menus[newFocusedIndex].buttonElement?.focus()\n }\n }\n }\n\n private focusNext(): void {\n if (!this.focusedMenu || this.numMenusShown === 0) {\n return\n }\n\n let newFocusedIndex = (this.focusedMenu.index + 1) % this.numMenusShown\n if (this.focusedMenu.index === MenuBar.OVERFLOW_INDEX) {\n newFocusedIndex = 0\n } else if (this.focusedMenu.index === this.numMenusShown - 1) {\n newFocusedIndex = MenuBar.OVERFLOW_INDEX\n }\n\n if (newFocusedIndex === this.focusedMenu.index) {\n return\n }\n\n if (this.isOpen) {\n this.cleanupMenu()\n this.showMenu(newFocusedIndex)\n } else if (this.isFocused) {\n this.focusedMenu.index = newFocusedIndex\n if (newFocusedIndex === MenuBar.OVERFLOW_INDEX) {\n this.overflowMenu.buttonElement.focus()\n } else {\n this.menus[newFocusedIndex].buttonElement?.focus()\n }\n }\n }\n\n private updateMnemonicVisibility(visible: boolean): void {\n if (this.menus) {\n this.menus.forEach((menuBarMenu) => {\n if (\n menuBarMenu.titleElement &&\n menuBarMenu.titleElement.children.length\n ) {\n const child = menuBarMenu.titleElement.children.item(0) as HTMLElement\n if (child) {\n child.style.textDecoration =\n this.options.alwaysOnMnemonics || visible ? 'underline' : ''\n }\n }\n })\n }\n }\n\n private get mnemonicsInUse(): boolean {\n return this._mnemonicsInUse\n }\n\n private set mnemonicsInUse(value: boolean) {\n this._mnemonicsInUse = value\n }\n\n private get shouldAltKeyFocus(): boolean {\n if (isMacintosh) {\n return false\n }\n\n if (!this.options.disableAltFocus) {\n return true\n }\n\n if (this.options.visibility === 'toggle') {\n return true\n }\n\n return false\n }\n\n public get onVisibilityChange(): Event<boolean> {\n return this._onVisibilityChange.event\n }\n\n public get onFocusStateChange(): Event<boolean> {\n return this._onFocusStateChange.event\n }\n\n private onMenuTriggered(menuIndex: number, clicked: boolean) {\n const menu = this.menus[menuIndex]\n if (menuIndex !== MenuBar.OVERFLOW_INDEX && !menu?.submenu) {\n ipcRenderer.send(IpcChannels.MENU_EVENT, menu.commandId)\n return\n }\n\n if (this.isOpen) {\n if (this.isCurrentMenu(menuIndex)) {\n this.setUnfocusedState()\n } else {\n this.cleanupMenu()\n this.showMenu(menuIndex, this.openedViaKeyboard)\n }\n } else {\n this.focusedMenu = { index: menuIndex }\n this.openedViaKeyboard = !clicked\n this.focusState = MenubarState.OPEN\n }\n }\n\n private onModifierKeyToggled(\n modifierKeyStatus: DOM.IModifierKeyStatus\n ): void {\n const allModifiersReleased =\n !modifierKeyStatus.altKey &&\n !modifierKeyStatus.ctrlKey &&\n !modifierKeyStatus.shiftKey &&\n !modifierKeyStatus.metaKey\n\n if (this.options.visibility === 'hidden') {\n return\n }\n\n // Prevent alt-key default if the menu is not hidden and we use alt to focus\n if (modifierKeyStatus.event && this.shouldAltKeyFocus) {\n if (\n ScanCodeUtils.toEnum(modifierKeyStatus.event.code) === ScanCode.AltLeft\n ) {\n modifierKeyStatus.event.preventDefault()\n }\n }\n\n // Alt key pressed while menu is focused. This should return focus away from the menubar\n if (\n this.isFocused &&\n modifierKeyStatus.lastKeyPressed === 'alt' &&\n modifierKeyStatus.altKey\n ) {\n this.setUnfocusedState()\n this.mnemonicsInUse = false\n this.awaitingAltRelease = true\n }\n\n // Clean alt key press and release\n if (\n allModifiersReleased &&\n modifierKeyStatus.lastKeyPressed === 'alt' &&\n modifierKeyStatus.lastKeyReleased === 'alt'\n ) {\n if (!this.awaitingAltRelease) {\n if (!this.isFocused && this.shouldAltKeyFocus) {\n this.mnemonicsInUse = true\n this.focusedMenu = {\n index: this.numMenusShown > 0 ? 0 : MenuBar.OVERFLOW_INDEX\n }\n this.focusState = MenubarState.FOCUSED\n } else if (!this.isOpen) {\n this.setUnfocusedState()\n }\n }\n }\n\n // Alt key released\n if (\n !modifierKeyStatus.altKey &&\n modifierKeyStatus.lastKeyReleased === 'alt'\n ) {\n this.awaitingAltRelease = false\n }\n\n if (this.options.enableMnemonics && this.menus && !this.isOpen) {\n this.updateMnemonicVisibility(\n (!this.awaitingAltRelease && modifierKeyStatus.altKey) ||\n this.mnemonicsInUse\n )\n }\n }\n\n private isCurrentMenu(menuIndex: number): boolean {\n if (!this.focusedMenu) {\n return false\n }\n\n return this.focusedMenu.index === menuIndex\n }\n\n private cleanupMenu(): void {\n if (this.focusedMenu) {\n // Remove focus from the menus first\n if (this.focusedMenu.index === MenuBar.OVERFLOW_INDEX) {\n this.overflowMenu.buttonElement.focus()\n } else {\n this.menus[this.focusedMenu.index].buttonElement?.focus()\n }\n\n if (this.focusedMenu.holder) {\n this.focusedMenu.holder.parentElement?.classList.remove('open')\n\n this.focusedMenu.holder.remove()\n }\n\n this.focusedMenu.widget?.dispose()\n\n this.focusedMenu = { index: this.focusedMenu.index }\n }\n }\n\n private showMenu(menuIndex: number, selectFirst = true): void {\n const actualMenuIndex =\n menuIndex >= this.numMenusShown ? MenuBar.OVERFLOW_INDEX : menuIndex\n const customMenu =\n actualMenuIndex === MenuBar.OVERFLOW_INDEX\n ? this.overflowMenu\n : this.menus[actualMenuIndex]\n\n if (!customMenu.submenu || !customMenu.buttonElement) {\n return\n }\n\n const menuHolder = $('.cet-menubar-menu-container', { title: '' })\n customMenu.buttonElement.classList.add('open')\n\n const titleBoundingRect = customMenu.buttonElement.getBoundingClientRect()\n const titleBoundingRectZoom = DOM.getDomNodeZoomLevel(\n customMenu.buttonElement\n )\n\n if (this.options.compactMode === Direction.Right) {\n menuHolder.style.top = `${titleBoundingRect.top}px`\n menuHolder.style.left = `${titleBoundingRect.left + this.container.clientWidth}px`\n } else if (this.options.compactMode === Direction.Left) {\n menuHolder.style.top = `${titleBoundingRect.top}px`\n menuHolder.style.right = `${this.container.clientWidth}px`\n menuHolder.style.left = 'auto'\n } else {\n menuHolder.style.top = `${titleBoundingRect.bottom * titleBoundingRectZoom}px`\n menuHolder.style.left = `${titleBoundingRect.left * titleBoundingRectZoom}px`\n }\n\n customMenu.buttonElement.appendChild(menuHolder)\n\n const menuOptions: IMenuOptions = {\n // getKeyBinding: this.options.getKeybinding,\n // actionRunner: this.actionRunner,\n enableMnemonics:\n this.options.alwaysOnMnemonics ||\n (this.mnemonicsInUse && this.options.enableMnemonics),\n ariaLabel:\n customMenu.buttonElement.getAttribute('aria-label') ?? undefined\n // expandDirection: this.isCompact ? this.options.compactMode : Direction.Right,\n // useEventAsContext: true\n }\n\n const menuWidget = this._register(\n new CETMenu(\n menuHolder,\n this.menuIcons,\n this.currentOptions,\n menuOptions,\n this.closeMenu\n )\n )\n menuWidget.createMenu(customMenu.submenu?.items ?? [])\n menuWidget.applyStyle(this.menuStyle)\n\n this._register(\n menuWidget.onDidCancel(() => {\n this.focusState = MenubarState.FOCUSED\n })\n )\n\n if (actualMenuIndex !== menuIndex) {\n menuWidget.trigger(menuIndex - this.numMenusShown)\n } else {\n menuWidget.focus(selectFirst)\n }\n\n this.focusedMenu = {\n index: actualMenuIndex,\n holder: menuHolder,\n widget: menuWidget\n }\n }\n\n private rebuildOverflowMenu(\n showableMenus: Array<\n MenuBarMenuWithElements & {\n titleElement: HTMLElement\n buttonElement: HTMLElement\n }\n >,\n fromIndex: number\n ): void {\n const hiddenMenus = showableMenus.slice(fromIndex)\n\n if (!hiddenMenus.length) {\n this.overflowMenu.submenu = undefined\n return\n }\n\n this.overflowMenu.submenu = {\n items: hiddenMenus.map((menu) => {\n if (!menu.submenu) {\n return {\n ...menu,\n label: cleanMnemonic(menu.label),\n type: menu.type\n }\n }\n\n return {\n ...menu,\n label: cleanMnemonic(menu.label),\n submenu: menu.submenu,\n type: 'submenu'\n }\n })\n } as any\n }\n}\n","/* ---------------------------------------------------------------------------------------------\n * Copyright (c) AlexTorresDev. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\nimport { Color } from 'base/common/color'\nimport { PlatformToString, isMacintosh, isWindows, platform } from 'base/common/platform'\nimport { IMenuIcons } from 'menubar'\n\nexport const INACTIVE_FOREGROUND_DARK = Color.fromHex('#222222')\nexport const ACTIVE_FOREGROUND_DARK = Color.fromHex('#333333')\nexport const INACTIVE_FOREGROUND = Color.fromHex('#EEEEEE')\nexport const ACTIVE_FOREGROUND = Color.fromHex('#FFFFFF')\nexport const DEFAULT_ITEM_SELECTOR = Color.fromHex('#0000001F')\n\nexport const IS_MAC_BIGSUR_OR_LATER = isMacintosh && parseInt(process.getSystemVersion().split('.')[0]) >= 11\nexport const BOTTOM_TITLEBAR_HEIGHT = 60\nexport const TOP_TITLEBAR_HEIGHT_MAC = IS_MAC_BIGSUR_OR_LATER ? 28 : 22\nexport const TOP_TITLEBAR_HEIGHT_WIN = 30\n\nexport const WINDOW_MIN_WIDTH = 400\nexport const WINDOW_MIN_HEIGHT = 270\n\nexport const MENU_MNEMONIC_REGEX = /\\(&([^\\s&])\\)|(^|[^&])&([^\\s&])/\nexport const MENU_ESCAPED_MNEMONIC_REGEX = /(&amp;)?(&amp;)([^\\s&])/g\n\ninterface ITitlebarIcons extends IMenuIcons {\n\tlinux: {\n\t\tminimize: string\n\t\tmaximize: string\n\t\trestore: string\n\t\tclose: string\n\t},\n\tfreebsd: {\n\t\tminimize: string\n\t\tmaximize: string\n\t\trestore: string\n\t\tclose: string\n\t},\n\twindows: {\n\t\tminimize: string\n\t\tmaximize: string\n\t\trestore: string\n\t\tclose: string\n\t}\n}\n\nexport const menuIcons: ITitlebarIcons = {\n\tsubmenuIndicator: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" /><polyline points=\"9 6 15 12 9 18\" /></svg>',\n\tcheckbox: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M5 12l5 5l10 -10\" /></svg>',\n\tradioChecked: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\"><path fill=\"currentColor\" d=\"M10,5 C7.2,5 5,7.2 5,10 C5,12.8 7.2,15 10,15 C12.8,15 15,12.8 15,10 C15,7.2 12.8,5 10,5 L10,5 Z M10,0 C4.5,0 0,4.5 0,10 C0,15.5 4.5,20 10,20 C15.5,20 20,15.5 20,10 C20,4.5 15.5,0 10,0 L10,0 Z M10,18 C5.6,18 2,14.4 2,10 C2,5.6 5.6,2 10,2 C14.4,2 18,5.6 18,10 C18,14.4 14.4,18 10,18 L10,18 Z\" /></svg>',\n\tradioUnchecked: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\"><path fill=\"currentColor\" d=\"M10,0 C4.5,0 0,4.5 0,10 C0,15.5 4.5,20 10,20 C15.5,20 20,15.5 20,10 C20,4.5 15.5,0 10,0 L10,0 Z M10,18 C5.6,18 2,14.4 2,10 C2,5.6 5.6,2 10,2 C14.4,2 18,5.6 18,10 C18,14.4 14.4,18 10,18 L10,18 Z\" /></svg>',\n\tlinux: {\n\t\tminimize: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 11 11\"><path d=\"M11,4.9v1.1H0V4.399h11z\"/></svg>',\n\t\tmaximize: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 11 11\"><path d=\"M0,1.7v7.6C0,10.2,0.8,11,1.7,11h7.6c0.9,0,1.7-0.8,1.7-1.7V1.7C11,0.8,10.2,0,9.3,0H1.7C0.8,0,0,0.8,0,1.7z M8.8,9.9H2.2c-0.6,0-1.1-0.5-1.1-1.1V2.2c0-0.6,0.5-1.1,1.1-1.1h6.7c0.6,0,1.1,0.5,1.1,1.1v6.7C9.9,9.4,9.4,9.9,8.8,9.9z\"/></svg>',\n\t\trestore: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 11 11\"><path d=\"M7.9,2.2h-7C0.4,2.2,0,2.6,0,3.1v7C0,10.6,0.4,11,0.9,11h7c0.5,0,0.9-0.4,0.9-0.9v-7C8.8,2.6,8.4,2.2,7.9,2.2z M7.7,9.6 c0,0.2-0.1,0.3-0.3,0.3h-6c-0.2,0-0.3-0.1-0.3-0.3v-6c0-0.2,0.1-0.3,0.3-0.3h6c0.2,0,0.3,0.1,0.3,0.3V9.6z M10,0.9 c0,0.5-0.4,0.9-0.9,0.9h-2.1 c-0.5,0-0.9-0.4-0.9-0.9V0.9c0-0.5,0.4-0.9,0.9-0.9h2.1C9.6,0,10,0.4,10,0.9z\"/></svg>',\n\t\tclose: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 11 11\"><path d=\"M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z\"/></svg>'\n\t},\n\tfreebsd: {\n\t\tminimize: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 11 11\"><path d=\"M11,4.9v1.1H0V4.399h11z\"/></svg>',\n\t\tmaximize: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 11 11\"><path d=\"M0,1.7v7.6C0,10.2,0.8,11,1.7,11h7.6c0.9,0,1.7-0.8,1.7-1.7V1.7C11,0.8,10.2,0,9.3,0H1.7C0.8,0,0,0.8,0,1.7z M8.8,9.9H2.2c-0.6,0-1.1-0.5-1.1-1.1V2.2c0-0.6,0.5-1.1,1.1-1.1h6.7c0.6,0,1.1,0.5,1.1,1.1v6.7C9.9,9.4,9.4,9.9,8.8,9.9z\"/></svg>',\n\t\trestore: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 11 11\"><path d=\"M7.9,2.2h-7C0.4,2.2,0,2.6,0,3.1v7C0,10.6,0.4,11,0.9,11h7c0.5,0,0.9-0.4,0.9-0.9v-7C8.8,2.6,8.4,2.2,7.9,2.2z M7.7,9.6 c0,0.2-0.1,0.3-0.3,0.3h-6c-0.2,0-0.3-0.1-0.3-0.3v-6c0-0.2,0.1-0.3,0.3-0.3h6c0.2,0,0.3,0.1,0.3,0.3V9.6z M10,0.9 c0,0.5-0.4,0.9-0.9,0.9h-2.1 c-0.5,0-0.9-0.4-0.9-0.9V0.9c0-0.5,0.4-0.9,0.9-0.9h2.1C9.6,0,10,0.4,10,0.9z\"/></svg>',\n\t\tclose: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 11 11\"><path d=\"M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z\"/></svg>'\n\t},\n\twindows: {\n\t\tminimize: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 11 11\"><path d=\"M11,4.9v1.1H0V4.399h11z\"/></svg>',\n\t\tmaximize: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 11 11\"><path d=\"M0,1.7v7.6C0,10.2,0.8,11,1.7,11h7.6c0.9,0,1.7-0.8,1.7-1.7V1.7C11,0.8,10.2,0,9.3,0H1.7C0.8,0,0,0.8,0,1.7z M8.8,9.9H2.2c-0.6,0-1.1-0.5-1.1-1.1V2.2c0-0.6,0.5-1.1,1.1-1.1h6.7c0.6,0,1.1,0.5,1.1,1.1v6.7C9.9,9.4,9.4,9.9,8.8,9.9z\"/></svg>',\n\t\trestore: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 11 11\"><path d=\"M7.9,2.2h-7C0.4,2.2,0,2.6,0,3.1v7C0,10.6,0.4,11,0.9,11h7c0.5,0,0.9-0.4,0.9-0.9v-7C8.8,2.6,8.4,2.2,7.9,2.2z M7.7,9.6 c0,0.2-0.1,0.3-0.3,0.3h-6c-0.2,0-0.3-0.1-0.3-0.3v-6c0-0.2,0.1-0.3,0.3-0.3h6c0.2,0,0.3,0.1,0.3,0.3V9.6z\"/><path d=\"M10,0H3.5v1.1h6.1c0.2,0,0.3,0.1,0.3,0.3v6.1H11V1C11,0.4,10.6,0,10,0z\"/></svg>',\n\t\tclose: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 11 11\"><path d=\"M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z\"/></svg>'\n\t}\n}\n\nexport function getPx(value: number): string {\n\treturn `${value}px`\n}\n\n/**\n * Handles mnemonics for menu items. Depending on OS:\n * - Windows: Supported via & character (replace && with &)\n * - Linux: Supported via & character (replace && with &)\n * - FreeBSD: Supported via & character (replace && with &)\n * - macOS: Unsupported (replace && with empty string)\n */\nexport function mnemonicMenuLabel(label: string, forceDisableMnemonics?: boolean): string {\n\tif (isMacintosh || forceDisableMnemonics) {\n\t\treturn label.replace(/\\(&&\\w\\)|&&/g, '').replace(/&/g, isMacintosh ? '&' : '&&')\n\t}\n\n\treturn label.replace(/&&|&/g, m => m === '&' ? '&&' : '&')\n}\n\n/**\n * Handles mnemonics for buttons. Depending on OS:\n * - Windows: Supported via & character (replace && with & and & with && for escaping)\n * - Linux: Supported via _ character (replace && with _)\n * - FreeBSD: Supported via _ character (replace && with _)\n * - macOS: Unsupported (replace && with empty string)\n */\nexport function mnemonicButtonLabel(label: string, forceDisableMnemonics?: boolean): string {\n\tif (isMacintosh || forceDisableMnemonics) {\n\t\treturn label.replace(/\\(&&\\w\\)|&&/g, '')\n\t}\n\n\tif (isWindows) {\n\t\treturn label.replace(/&&|&/g, m => m === '&' ? '&&' : '&')\n\t}\n\n\treturn label.replace(/&&/g, '_')\n}\n\nexport function cleanMnemonic(label: string): string {\n\tconst regex = MENU_MNEMONIC_REGEX\n\n\tconst matches = regex.exec(label)\n\tif (!matches) {\n\t\treturn label\n\t}\n\n\tconst mnemonicInText = !matches[1]\n\n\treturn label.replace(regex, mnemonicInText ? '$2$3' : '').trim()\n}\n\nexport function parseAccelerator(accelerator: Electron.Accelerator | string): string {\n\tlet acc = accelerator.toString()\n\n\tif (!isMacintosh) {\n\t\tacc = acc.replace(/(Cmd)|(Command)/gi, '')\n\t} else {\n\t\tacc = acc.replace(/(Ctrl)|(Control)/gi, '')\n\t}\n\n\tacc = acc.replace(/(Or)/gi, '')\n\n\treturn acc\n}\n\nexport function applyFill(element: HTMLElement | undefined | null, svgColor: Color | undefined, fgColor: Color | undefined, color = true) {\n\tlet fillColor = ''\n\n\tif (svgColor) fillColor = svgColor.toString()\n\telse if (fgColor) fillColor = fgColor.toString()\n\n\tif (element && element !== null) {\n\t\tif (color) element.style.color = fillColor\n\t\telse element.style.backgroundColor = fillColor\n\t}\n}\n\nexport function loadWindowIcons(icons: string | undefined): any {\n\tif (!icons) return\n\n\tconst jWindowsIcons = require(icons)\n\n\treturn {\n\t\ticons: jWindowsIcons,\n\t\tplatformIcons: jWindowsIcons[PlatformToString(platform).toLocaleLowerCase()]\n\t}\n}\n","/* ---------------------------------------------------------------------------------------------\n * Copyright (c) AlexTorresDev. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\nimport { MenuItem, ipcRenderer, nativeImage } from 'electron'\nimport { Color } from 'base/common/color'\nimport { $, EventHelper, EventLike, EventType, addClass, addDisposableListener, append, hasClass, removeClass, removeNode } from 'base/common/dom'\nimport { KeyCode, KeyCodeUtils } from 'base/common/keyCodes'\nimport { Disposable } from 'base/common/lifecycle'\nimport { MENU_ESCAPED_MNEMONIC_REGEX, MENU_MNEMONIC_REGEX, applyFill, parseAccelerator, cleanMnemonic, loadWindowIcons } from 'consts'\nimport { MenuBarOptions } from '../menubar-options'\nimport { IMenuOptions } from './index'\nimport * as strings from 'base/common/strings'\nimport { IMenuIcons } from 'menubar'\nimport { IpcChannels } from 'types/ipc-contract'\n\nexport interface IMenuStyle {\n\tforegroundColor?: Color\n\tbackgroundColor?: Color\n\tselectionForegroundColor?: Color\n\tselectionBackgroundColor?: Color\n\tseparatorColor?: Color\n\tsvgColor?: Color\n}\n\nexport interface IMenuItem {\n\trender(element: HTMLElement): void\n\tupdateStyle(style: IMenuStyle): void\n\tonClick(event: EventLike): void\n\tdispose(): void\n\tisEnabled(): boolean\n\tisSeparator(): boolean\n\tfocus(): void\n\tblur(): void\n}\n\nexport class CETMenuItem extends Disposable implements IMenuItem {\n\tprivate _mnemonic?: KeyCode\n\tprivate _currentElement?: HTMLElement\n\n\tprivate labelElement?: HTMLElement\n\tprivate iconElement?: HTMLElement\n\n\tprotected itemElement?: HTMLElement\n\tprotected menuStyle?: IMenuStyle\n\n\tprivate radioGroup?: { start: number, end: number } // used only if item.type === \"radio\"\n\n\tconstructor(private _item: MenuItem, private menuIcons: IMenuIcons, private parentOptions: MenuBarOptions, private options: IMenuOptions, private menuItems?: IMenuItem[], private closeSubMenu = () => { }) {\n\t\tsuper()\n\n\t\t// Set mnemonic\n\t\tif (this._item.label && options.enableMnemonics) {\n\t\t\tconst label = this._item.label\n\t\t\tif (label) {\n\t\t\t\tconst matches = MENU_MNEMONIC_REGEX.exec(label)\n\t\t\t\tif (matches) {\n\t\t\t\t\tthis._mnemonic = KeyCodeUtils.fromString((!!matches[1] ? matches[1] : matches[2]).toLocaleUpperCase())\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\trender(el: HTMLElement): void {\n\t\tthis._currentElement = el\n\n\t\tthis._register(addDisposableListener(this.element!, EventType.MOUSE_DOWN, e => {\n\t\t\tif (this.item.enabled && e.button === 0 && this.element) {\n\t\t\t\taddClass(this.element, 'active')\n\t\t\t}\n\t\t}))\n\n\t\tthis._register(addDisposableListener(this.element!, EventType.CLICK, e => {\n\t\t\tif (this.item.enabled) {\n\t\t\t\tthis.onClick(e)\n\t\t\t}\n\t\t}))\n\n\t\tthis._register(addDisposableListener(this.element!, EventType.DBLCLICK, e => {\n\t\t\tEventHelper.stop(e, true)\n\t\t}));\n\n\n\t\t[EventType.MOUSE_UP, EventType.MOUSE_OUT].forEach(event => {\n\t\t\tthis._register(addDisposableListener(this.element!, event, e => {\n\t\t\t\tEventHelper.stop(e)\n\t\t\t\tremoveClass(this.element!, 'active')\n\t\t\t}))\n\t\t})\n\n\t\tthis.itemElement = append(this.element!, $('a.cet-action-menu-item'))\n\n\t\tif (this.mnemonic) {\n\t\t\tthis.itemElement.setAttribute('aria-keyshortcuts', `${this.mnemonic}`)\n\t\t}\n\n\t\tthis.iconElement = append(this.itemElement, $('span.cet-menu-item-icon'))\n\t\tthis.iconElement.setAttribute('role', 'none')\n\n\t\tthis.labelElement = append(this.itemElement, $('span.cet-action-label'))\n\n\t\tthis.updateLabel()\n\t\tthis.setAccelerator()\n\t\tthis.updateIcon()\n\t\tthis.updateTooltip()\n\t\tthis.updateEnabled()\n\t\tthis.updateChecked()\n\t\tthis.updateVisibility()\n\t}\n\n\tonClick(event: EventLike) {\n\t\tEventHelper.stop(event, true)\n\t\tipcRenderer.send(IpcChannels.MENU_EVENT, this.item.commandId)\n\n\t\tif (this.item.type === 'checkbox') {\n\t\t\tthis.item.checked = !this.item.checked\n\t\t\tthis.updateChecked()\n\t\t} else if (this.item.type === 'radio') {\n\t\t\tthis.updateRadioGroup()\n\t\t}\n\n\t\tthis.closeSubMenu()\n\t}\n\n\tprotected applyStyle(): void {\n\t\tif (!this.menuStyle) {\n\t\t\treturn\n\t\t}\n\n\t\tconst isSelected = this.element && hasClass(this.element, 'focused')\n\t\tconst fgColor = isSelected && this.menuStyle.selectionForegroundColor ? this.menuStyle.selectionForegroundColor : this.menuStyle.foregroundColor\n\t\tconst bgColor = isSelected && this.menuStyle.selectionBackgroundColor ? this.menuStyle.selectionBackgroundColor : null\n\n\t\tif (this.itemElement) {\n\t\t\tthis.itemElement.style.color = fgColor ? fgColor.toString() : ''\n\t\t\tthis.itemElement.style.backgroundColor = bgColor ? bgColor.toString() : ''\n\n\t\t\tif (this.iconElement) {\n\t\t\t\tif (this.iconElement.firstElementChild?.className === 'icon') {\n\t\t\t\t\tapplyFill(this.iconElement.firstElementChild as HTMLElement, this.parentOptions?.svgColor, fgColor, false)\n\t\t\t\t} else {\n\t\t\t\t\tapplyFill(this.iconElement, this.parentOptions?.svgColor, fgColor)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tupdateStyle(style: IMenuStyle): void {\n\t\tthis.menuStyle = style\n\t\tthis.applyStyle()\n\t}\n\n\tfocus(): void {\n\t\tif (this.element) {\n\t\t\tthis.element.focus()\n\t\t\taddClass(this.element, 'focused')\n\t\t}\n\n\t\tthis.applyStyle()\n\t}\n\n\tblur(): void {\n\t\tif (this.element) {\n\t\t\tthis.element.blur()\n\t\t\tremoveClass(this.element, 'focused')\n\t\t}\n\n\t\tthis.applyStyle()\n\t}\n\n\tsetAccelerator(): void {\n\t\tlet accelerator = null\n\n\t\tif (this.item.role) {\n\t\t\tswitch (this.item.role.toLocaleLowerCase()) {\n\t\t\t\tcase 'undo':\n\t\t\t\t\taccelerator = 'CtrlOrCmd+Z'\n\t\t\t\t\tbreak\n\t\t\t\tcase 'redo':\n\t\t\t\t\taccelerator = 'CtrlOrCmd+Y'\n\t\t\t\t\tbreak\n\t\t\t\tcase 'cut':\n\t\t\t\t\taccelerator = 'CtrlOrCmd+X'\n\t\t\t\t\tbreak\n\t\t\t\tcase 'copy':\n\t\t\t\t\taccelerator = 'CtrlOrCmd+C'\n\t\t\t\t\tbreak\n\t\t\t\tcase 'paste':\n\t\t\t\t\taccelerator = 'CtrlOrCmd+V'\n\t\t\t\t\tbreak\n\t\t\t\tcase 'selectall':\n\t\t\t\t\taccelerator = 'CtrlOrCmd+A'\n\t\t\t\t\tbreak\n\t\t\t\tcase 'minimize':\n\t\t\t\t\taccelerator = 'CtrlOrCmd+M'\n\t\t\t\t\tbreak\n\t\t\t\tcase 'close':\n\t\t\t\t\taccelerator = 'CtrlOrCmd+W'\n\t\t\t\t\tbreak\n\t\t\t\tcase 'reload':\n\t\t\t\t\taccelerator = 'CtrlOrCmd+R'\n\t\t\t\t\tbreak\n\t\t\t\tcase 'forcereload':\n\t\t\t\t\taccelerator = 'CtrlOrCmd+Shift+R'\n\t\t\t\t\tbreak\n\t\t\t\tcase 'toggledevtools':\n\t\t\t\t\taccelerator = 'CtrlOrCmd+Shift+I'\n\t\t\t\t\tbreak\n\t\t\t\tcase 'togglefullscreen':\n\t\t\t\t\taccelerator = 'F11'\n\t\t\t\t\tbreak\n\t\t\t\tcase 'resetzoom':\n\t\t\t\t\taccelerator = 'CtrlOrCmd+0'\n\t\t\t\t\tbreak\n\t\t\t\tcase 'zoomin':\n\t\t\t\t\taccelerator = 'CtrlOrCmd++'\n\t\t\t\t\tbreak\n\t\t\t\tcase 'zoomout':\n\t\t\t\t\taccelerator = 'CtrlOrCmd+-'\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tif (this.item.label && this.item.accelerator) {\n\t\t\taccelerator = this.item.accelerator\n\t\t}\n\n\t\tif (this.itemElement && accelerator !== null) {\n\t\t\tappend(this.itemElement, $('span.keybinding')).textContent = parseAccelerator(accelerator)\n\t\t}\n\t}\n\n\tupdateLabel(): void {\n\t\tconst label = this.item.label || ''\n\t\tconst cleanMenuLabel = cleanMnemonic(label)\n\n\t\t// Update the button label to reflect mnemonics\n\n\t\tif (this.options.enableMnemonics) {\n\t\t\tconst cleanLabel = strings.escape(label)\n\n\t\t\t// This is global so reset it\n\t\t\tMENU_ESCAPED_MNEMONIC_REGEX.lastIndex = 0\n\t\t\tlet escMatch = MENU_ESCAPED_MNEMONIC_REGEX.exec(cleanLabel)\n\n\t\t\t// We can't use negative lookbehind so we match our negative and skip\n\t\t\twhile (escMatch && escMatch[1]) {\n\t\t\t\tescMatch = MENU_ESCAPED_MNEMONIC_REGEX.exec(cleanLabel)\n\t\t\t}\n\n\t\t\tconst replaceDoubleEscapes = (str: string) => str.replace(/&amp;&amp;/g, '&amp;')\n\n\t\t\tif (escMatch) {\n\t\t\t\tthis.labelElement!.innerText = ''\n\t\t\t\tthis.labelElement!.append(\n\t\t\t\t\tstrings.ltrim(replaceDoubleEscapes(cleanLabel.substring(0, escMatch.index)), ' '),\n\t\t\t\t\t$('mnemonic', { 'aria-hidden': 'true' }, escMatch[3]),\n\t\t\t\t\tstrings.rtrim(replaceDoubleEscapes(cleanLabel.substring(escMatch.index + escMatch[0].length)), ' ')\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tthis.labelElement!.innerText = replaceDoubleEscapes(cleanLabel).trim()\n\t\t\t}\n\t\t} else {\n\t\t\tthis.labelElement!.innerText = cleanMenuLabel.replace(/&&/g, '&')\n\t\t}\n\n\t\tconst mnemonicMatches = MENU_MNEMONIC_REGEX.exec(label)\n\n\t\t// Register mnemonics\n\t\tif (mnemonicMatches) {\n\t\t\tconst mnemonic = !!mnemonicMatches[1] ? mnemonicMatches[1] : mnemonicMatches[3]\n\n\t\t\tif (this.options.enableMnemonics) {\n\t\t\t\tthis.itemElement?.setAttribute('aria-keyshortcuts', 'Alt+' + mnemonic.toLocaleLowerCase())\n\t\t\t} else {\n\t\t\t\tthis.itemElement?.removeAttribute('aria-keyshortcuts')\n\t\t\t}\n\t\t}\n\t}\n\n\tupdateIcon(): void {\n\t\tif (this.item.icon) {\n\t\t\tconst icon = this.item.icon\n\n\t\t\tif (this.iconElement && icon) {\n\t\t\t\tconst iconE = append(this.iconElement, $('.icon'))\n\n\t\t\t\tif (typeof this.item.icon !== 'string') {\n\t\t\t\t\t// Request icon data asynchronously from main process\n\t\t\t\t\tvoid ipcRenderer.invoke(IpcChannels.REQUEST_MENU_ICON, this.item.commandId).then((iconData: string | null) => {\n\t\t\t\t\t\tif (iconData) {\n\t\t\t\t\t\t\ticonE.style.maskImage = `url(${iconData})`\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\tconst iconPath = this.item.icon\n\t\t\t\t\tconst iconData = nativeImage.createFromPath(iconPath).toDataURL()\n\t\t\t\t\tif (iconData) iconE.style.maskImage = `url(${iconData})`\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (this.iconElement && this.item.type === 'checkbox') {\n\t\t\taddClass(this.iconElement, 'checkbox')\n\t\t\tthis.iconElement.innerHTML = this.menuIcons.checkbox\n\t\t} else if (this.item.type === 'radio') {\n\t\t\taddClass(this.iconElement!, 'radio')\n\t\t\tthis.iconElement!.innerHTML = this.item.checked ? this.menuIcons.radioChecked : this.menuIcons.radioUnchecked\n\t\t}\n\n\t\tapplyFill(this.iconElement, this.parentOptions?.svgColor, this.menuStyle?.foregroundColor)\n\t}\n\n\tupdateTooltip(): void {\n\t\tlet title: string | null = null\n\n\t\tif (this.item.sublabel) {\n\t\t\ttitle = this.item.sublabel\n\t\t} else if (!this.item.label && this.item.label && this.item.icon) {\n\t\t\ttitle = this.item.label\n\n\t\t\tif (this.item.accelerator) {\n\t\t\t\ttitle = parseAccelerator(this.item.accelerator)\n\t\t\t}\n\t\t}\n\n\t\tif (this.itemElement && title) {\n\t\t\tthis.itemElement.title = title\n\t\t}\n\t}\n\n\tupdateEnabled(): void {\n\t\tif (this.element) {\n\t\t\tif (this.item.enabled && this.item.type !== 'separator') {\n\t\t\t\tremoveClass(this.element, 'disabled')\n\t\t\t\tthis.element.tabIndex = 0\n\t\t\t} else {\n\t\t\t\taddClass(this.element, 'disabled')\n\t\t\t}\n\t\t}\n\t}\n\n\tupdateVisibility(): void {\n\t\tif (this.item.visible === false && this.itemElement) {\n\t\t\tthis.itemElement.remove()\n\t\t}\n\t}\n\n\tupdateChecked(): void {\n\t\tif (this.itemElement) {\n\t\t\tif (this.item.checked) {\n\t\t\t\taddClass(this.itemElement, 'checked')\n\t\t\t\tthis.itemElement.setAttribute('aria-checked', 'true')\n\t\t\t} else {\n\t\t\t\tremoveClass(this.itemElement, 'checked')\n\t\t\t\tthis.itemElement.setAttribute('aria-checked', 'false')\n\t\t\t}\n\t\t}\n\t}\n\n\tupdateRadioGroup(): void {\n\t\tif (this.radioGroup === undefined) {\n\t\t\tthis.radioGroup = this.getRadioGroup()\n\t\t}\n\n\t\tif (this.menuItems) {\n\t\t\tfor (let i = this.radioGroup.start; i < this.radioGroup.end; i++) {\n\t\t\t\tconst menuItem = this.menuItems[i]\n\t\t\t\tif (menuItem instanceof CETMenuItem && menuItem.item.type === 'radio') {\n\t\t\t\t\t// update item.checked for each radio button in group\n\t\t\t\t\tmenuItem.item.checked = menuItem === this\n\t\t\t\t\tmenuItem.updateIcon()\n\t\t\t\t\t// updateChecked() *all* radio buttons in group\n\t\t\t\t\tmenuItem.updateChecked()\n\t\t\t\t\t// set the radioGroup property of all the other radio buttons since it was already calculated\n\t\t\t\t\tif (menuItem !== this) {\n\t\t\t\t\t\tmenuItem.radioGroup = this.radioGroup\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/** radioGroup index's starts with (previous separator +1 OR menuItems[0]) and ends with (next separator OR menuItems[length]) */\n\tgetRadioGroup(): { start: number, end: number } {\n\t\tlet startIndex = 0\n\t\tlet endIndex = this.menuItems ? this.menuItems.length : 0\n\t\tlet found = false\n\n\t\tif (this.menuItems) {\n\t\t\tfor (const index in this.menuItems) {\n\t\t\t\tconst menuItem = this.menuItems[index]\n\t\t\t\tif (menuItem === this) {\n\t\t\t\t\tfound = true\n\t\t\t\t} else if (menuItem instanceof CETMenuItem && menuItem.isSeparator()) {\n\t\t\t\t\tif (found) {\n\t\t\t\t\t\tendIndex = Number.parseInt(index)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstartIndex = Number.parseInt(index) + 1\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn { start: startIndex, end: endIndex }\n\t}\n\n\tget element() {\n\t\treturn this._currentElement\n\t}\n\n\tget item(): MenuItem {\n\t\treturn this._item\n\t}\n\n\tisEnabled(): boolean {\n\t\treturn this.item.enabled\n\t}\n\n\tisSeparator(): boolean {\n\t\treturn this.item.type === 'separator'\n\t}\n\n\tget mnemonic(): KeyCode | undefined {\n\t\treturn this._mnemonic\n\t}\n\n\tdispose(): void {\n\t\tif (this.itemElement) {\n\t\t\tremoveNode(this.itemElement)\n\t\t\tthis.itemElement = undefined\n\t\t}\n\n\t\tsuper.dispose()\n\t}\n}","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n/**\n * Converts HTML characters inside the string to use entities instead. Makes the string safe from\n * being used e.g. in HTMLElement.innerHTML.\n */\nexport function escape(html: string): string {\n\treturn html.replace(/[<>&]/g, function (match) {\n\t\tswitch (match) {\n\t\t\tcase '<': return '&lt;';\n\t\t\tcase '>': return '&gt;';\n\t\t\tcase '&': return '&amp;';\n\t\t\tdefault: return match;\n\t\t}\n\t});\n}\n\n/**\n * Removes all occurrences of needle from the beginning and end of haystack.\n * @param haystack string to trim\n * @param needle the thing to trim (default is a blank)\n */\nexport function trim(haystack: string, needle: string = ' '): string {\n\tconst trimmed = ltrim(haystack, needle);\n\treturn rtrim(trimmed, needle);\n}\n\n/**\n * Removes all occurrences of needle from the beginning of haystack.\n * @param haystack string to trim\n * @param needle the thing to trim\n */\nexport function ltrim(haystack: string, needle: string): string {\n\tif (!haystack || !needle) {\n\t\treturn haystack;\n\t}\n\n\tconst needleLen = needle.length;\n\tif (needleLen === 0 || haystack.length === 0) {\n\t\treturn haystack;\n\t}\n\n\tlet offset = 0;\n\n\twhile (haystack.indexOf(needle, offset) === offset) {\n\t\toffset = offset + needleLen;\n\t}\n\treturn haystack.substring(offset);\n}\n\n/**\n * Removes all occurrences of needle from the end of haystack.\n * @param haystack string to trim\n * @param needle the thing to trim\n */\nexport function rtrim(haystack: string, needle: string): string {\n\tif (!haystack || !needle) {\n\t\treturn haystack;\n\t}\n\n\tconst needleLen = needle.length,\n\t\thaystackLen = haystack.length;\n\n\tif (needleLen === 0 || haystackLen === 0) {\n\t\treturn haystack;\n\t}\n\n\tlet offset = haystackLen,\n\t\tidx = -1;\n\n\twhile (true) {\n\t\tidx = haystack.lastIndexOf(needle, offset - 1);\n\t\tif (idx === -1 || idx + needleLen !== offset) {\n\t\t\tbreak;\n\t\t}\n\t\tif (idx === 0) {\n\t\t\treturn '';\n\t\t}\n\t\toffset = idx;\n\t}\n\n\treturn haystack.substring(0, offset);\n}\n","/* ---------------------------------------------------------------------------------------------\n * Copyright (c) AlexTorresDev. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\nimport { TitleBarOverlay } from 'electron'\n\n/**\n * Central IPC contract defining all channels and their payloads\n * Ensures type-safe communication between main and renderer processes\n */\n\n// Window event names\nexport type WindowEventName = 'window-minimize' | 'window-maximize' | 'window-close'\n\n// IPC Channel definitions with Request/Response types\nexport interface IpcContract {\n\t// Window state queries (async - use invoke)\n\t'window-event:is-maximized': {\n\t\trequest: void\n\t\tresponse: boolean\n\t}\n\n\t// Title bar overlay update (async - use invoke)\n\t'update-window-controls': {\n\t\trequest: TitleBarOverlay\n\t\tresponse: boolean\n\t}\n\n\t// Menu icon request (async - use invoke)\n\t'menu-icon:request': {\n\t\trequest: number // commandId\n\t\tresponse: string | null // dataURL or null\n\t}\n\n\t// Application menu request (async - use invoke)\n\t'request-application-menu': {\n\t\trequest: void\n\t\tresponse: Electron.Menu\n\t}\n\n\t// Theme configuration delivery (async - use invoke)\n\t'theme-config:get': {\n\t\trequest: void\n\t\tresponse: Record<string, unknown> | null // normalized theme config\n\t}\n}\n\n// Fire-and-forget channels (use send/on)\nexport interface IpcFireAndForgetContract {\n\t// Window control events\n\t'window-event': {\n\t\tpayload: WindowEventName\n\t}\n\t// Menu item click events\n\t'menu-event': {\n\t\tpayload: number // commandId\n\t}\n\t// Minimum size setter\n\t'window-set-minimumSize': {\n\t\tpayload: [number, number] // [width, height]\n\t}\n\t// Title bar overlay update (sync alternative)\n\t'update-window-controls': {\n\t\tpayload: TitleBarOverlay\n\t}\n}\n\n/**\n * Type-safe channel name extractors\n */\nexport const IpcChannels = {\n\t// Async (invoke/handle)\n\tGET_WINDOW_MAXIMIZED: 'window-event:is-maximized' as const,\n\tUPDATE_WINDOW_CONTROLS: 'update-window-controls' as const,\n\tREQUEST_MENU_ICON: 'menu-icon:request' as const,\n\tREQUEST_APPLICATION_MENU: 'request-application-menu' as const,\n\n\t// Fire-and-forget (send/on)\n\tWINDOW_EVENT: 'window-event' as const,\n\tMENU_EVENT: 'menu-event' as const,\n\tSET_MINIMUM_SIZE: 'window-set-minimumSize' as const,\n\tGET_THEME_CONFIG: 'theme-config:get' as const,\n} as const\n\n/**\n * Extract response type for a given channel\n */\nexport type IpcResponse<C extends keyof IpcContract> = IpcContract[C]['response']\nexport type IpcRequest<C extends keyof IpcContract> = IpcContract[C]['request']\n","/* ---------------------------------------------------------------------------------------------\n * Copyright (c) AlexTorresDev. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\nimport { MenuItem } from 'electron'\nimport { CETMenuItem, IMenuStyle } from './item'\nimport { IMenuOptions } from './index'\nimport { $, append } from 'base/common/dom'\nimport { MenuBarOptions } from 'menubar/menubar-options'\nimport { IMenuIcons } from 'menubar'\n\nexport class CETSeparator extends CETMenuItem {\n\tprivate separatorElement?: HTMLElement\n\n\tconstructor(item: MenuItem, submenuIcons: IMenuIcons, submenuParentOptions: MenuBarOptions, submenuOptions: IMenuOptions) {\n\t\tsuper(item, submenuIcons, submenuParentOptions, submenuOptions)\n\t}\n\n\trender(container: HTMLElement) {\n\t\tif (container) {\n\t\t\tthis.separatorElement = append(container, $('a.cet-action-label.separator', { role: 'presentation' }))\n\t\t}\n\t}\n\n\tupdateStyle(style: IMenuStyle) {\n\t\tif (this.separatorElement && style.separatorColor) {\n\t\t\tthis.separatorElement.style.borderBottomColor = style.separatorColor.toString()\n\t\t}\n\t}\n}\n","/* ---------------------------------------------------------------------------------------------\n * Copyright (c) AlexTorresDev. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\nimport { MenuItem } from 'electron'\nimport { applyFill } from 'consts'\nimport { CETMenuItem } from './item'\nimport { IDisposable, dispose } from 'base/common/lifecycle'\nimport { $, EventHelper, EventLike, EventType, addClass, addClasses, addDisposableListener, append, hasClass, isAncestor } from 'base/common/dom'\nimport { StandardKeyboardEvent } from 'base/browser/keyboardEvent'\nimport { CETMenu, IMenuOptions } from './index'\nimport { RunOnceScheduler } from 'base/common/async'\nimport { MenuBarOptions } from 'menubar/menubar-options'\nimport { KeyCode } from 'base/common/keyCodes'\nimport { IMenuIcons } from 'menubar'\n\nexport interface ISubMenuData {\n\tparent: CETMenu;\n\tsubmenu?: CETMenu;\n}\n\nexport class CETSubMenu extends CETMenuItem {\n\tprivate mySubmenu?: CETMenu | null\n\tprivate submenuContainer?: HTMLElement\n\tprivate submenuIndicator?: HTMLElement\n\tprivate submenuDisposables: IDisposable[] = []\n\tprivate mouseOver = false\n\tprivate showScheduler: RunOnceScheduler\n\tprivate hideScheduler: RunOnceScheduler\n\tprivate _closeSubMenu = () => { }\n\n\tconstructor(item: MenuItem, private submenuIcons: IMenuIcons, private submenuItems: MenuItem[], private parentData: ISubMenuData, private submenuParentOptions: MenuBarOptions, private submenuOptions: IMenuOptions, closeSubMenu = () => { }) {\n\t\tsuper(item, submenuIcons, submenuParentOptions, submenuOptions)\n\n\t\tthis._closeSubMenu = closeSubMenu\n\n\t\tthis.showScheduler = new RunOnceScheduler(() => {\n\t\t\tif (this.mouseOver) {\n\t\t\t\tthis.cleanupExistingSubmenu(false)\n\t\t\t\tthis.createSubmenu(false)\n\t\t\t}\n\t\t}, 250)\n\n\t\tthis.hideScheduler = new RunOnceScheduler(() => {\n\t\t\tif (this.element && (!isAncestor(document.activeElement, this.element) && this.parentData.submenu === this.mySubmenu)) {\n\t\t\t\tthis.parentData.parent.focus(false)\n\t\t\t\tthis.cleanupExistingSubmenu(true)\n\t\t\t}\n\t\t}, 750)\n\t}\n\n\trender(el: HTMLElement): void {\n\t\tsuper.render(el)\n\n\t\tif (!this.itemElement) {\n\t\t\treturn\n\t\t}\n\n\t\taddClass(this.itemElement, 'cet-submenu-item')\n\t\tthis.itemElement.setAttribute('aria-haspopup', 'true')\n\n\t\tthis.submenuIndicator = append(this.itemElement, $('span.cet-submenu-indicator'))\n\t\tthis.submenuIndicator.innerHTML = this.submenuIcons.submenuIndicator\n\t\tthis.submenuIndicator.setAttribute('aria-hidden', 'true')\n\n\t\tapplyFill(this.submenuIndicator, this.menuStyle?.svgColor, this.menuStyle?.foregroundColor)\n\n\t\tif (this.element) {\n\t\t\taddDisposableListener(this.element, EventType.KEY_UP, e => {\n\t\t\t\tconst event = new StandardKeyboardEvent(e)\n\t\t\t\tif (event.equals(KeyCode.RightArrow) || event.equals(KeyCode.Enter)) {\n\t\t\t\t\tEventHelper.stop(e, true)\n\n\t\t\t\t\tthis.createSubmenu(true)\n\t\t\t\t}\n\t\t\t})\n\n\t\t\taddDisposableListener(this.element, EventType.KEY_DOWN, e => {\n\t\t\t\tconst event = new StandardKeyboardEvent(e)\n\t\t\t\tif (event.equals(KeyCode.RightArrow) || event.equals(KeyCode.Enter)) {\n\t\t\t\t\tEventHelper.stop(e, true)\n\t\t\t\t}\n\t\t\t})\n\n\t\t\taddDisposableListener(this.element, EventType.MOUSE_OVER, e => {\n\t\t\t\tif (!this.mouseOver) {\n\t\t\t\t\tthis.mouseOver = true\n\n\t\t\t\t\tthis.showScheduler.schedule()\n\t\t\t\t}\n\t\t\t})\n\n\t\t\taddDisposableListener(this.element, EventType.MOUSE_LEAVE, e => {\n\t\t\t\tthis.mouseOver = false\n\t\t\t})\n\n\t\t\taddDisposableListener(this.element, EventType.FOCUS_OUT, e => {\n\t\t\t\tif (this.element && !isAncestor(document.activeElement, this.element)) {\n\t\t\t\t\tthis.hideScheduler.schedule()\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate cleanupExistingSubmenu(force: boolean): void {\n\t\tif (this.parentData.submenu && (force || (this.parentData.submenu !== this.mySubmenu))) {\n\t\t\tthis.parentData.submenu.dispose()\n\t\t\tthis.parentData.submenu = undefined\n\n\t\t\tif (this.submenuContainer) {\n\t\t\t\tthis.submenuContainer = undefined\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate createSubmenu(selectFirstItem = true): void {\n\t\tif (!this.itemElement) {\n\t\t\treturn\n\t\t}\n\n\t\tif (this.element) {\n\t\t\tif (!this.parentData.submenu) {\n\t\t\t\tthis.submenuContainer = append(this.element, $('.cet-submenu'))\n\t\t\t\taddClasses(this.submenuContainer, 'cet-menubar-menu-container')\n\n\t\t\t\tthis.parentData.submenu = new CETMenu(this.submenuContainer, this.submenuIcons, this.submenuParentOptions, this.submenuOptions, this._closeSubMenu)\n\t\t\t\tthis.parentData.submenu.createMenu(this.submenuItems)\n\n\t\t\t\tif (this.menuStyle) {\n\t\t\t\t\tthis.parentData.submenu.applyStyle(this.menuStyle)\n\t\t\t\t}\n\n\t\t\t\tconst boundingRect = this.element.getBoundingClientRect()\n\t\t\t\tconst childBoundingRect = this.submenuContainer.getBoundingClientRect()\n\t\t\t\tconst computedStyles = getComputedStyle(this.parentData.parent.container)\n\t\t\t\tconst paddingTop = parseFloat(computedStyles.paddingTop || '0') || 0\n\n\t\t\t\tif (window.innerWidth <= boundingRect.right + childBoundingRect.width) {\n\t\t\t\t\tthis.submenuContainer.style.left = '10px'\n\t\t\t\t\tthis.submenuContainer.style.top = `${this.element.offsetTop + boundingRect.height}px`\n\t\t\t\t} else {\n\t\t\t\t\tthis.submenuContainer.style.left = `${this.element.offsetWidth}px`\n\t\t\t\t\tthis.submenuContainer.style.top = `${this.element.offsetTop - paddingTop}px`\n\t\t\t\t}\n\n\t\t\t\tthis.submenuDisposables.push(addDisposableListener(this.submenuContainer, EventType.KEY_UP, e => {\n\t\t\t\t\tconst event = new StandardKeyboardEvent(e)\n\t\t\t\t\tif (event.equals(KeyCode.LeftArrow)) {\n\t\t\t\t\t\tEventHelper.stop(e, true)\n\n\t\t\t\t\t\tthis.parentData.parent.focus()\n\n\t\t\t\t\t\tif (this.parentData.submenu) {\n\t\t\t\t\t\t\tthis.parentData.submenu.dispose()\n\t\t\t\t\t\t\tthis.parentData.submenu = undefined\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis.submenuDisposables = dispose(this.submenuDisposables)\n\t\t\t\t\t\tthis.submenuContainer = undefined\n\t\t\t\t\t}\n\t\t\t\t}))\n\n\t\t\t\tthis.submenuDisposables.push(addDisposableListener(this.submenuContainer, EventType.KEY_DOWN, e => {\n\t\t\t\t\tconst event = new StandardKeyboardEvent(e)\n\t\t\t\t\tif (event.equals(KeyCode.LeftArrow)) {\n\t\t\t\t\t\tEventHelper.stop(e, true)\n\t\t\t\t\t}\n\t\t\t\t}))\n\n\t\t\t\tthis.submenuDisposables.push(this.parentData.submenu.onDidCancel(() => {\n\t\t\t\t\tthis.parentData.parent.focus()\n\n\t\t\t\t\tif (this.parentData.submenu) {\n\t\t\t\t\t\tthis.parentData.submenu.dispose()\n\t\t\t\t\t\tthis.parentData.submenu = undefined\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.submenuDisposables = dispose(this.submenuDisposables)\n\t\t\t\t\tthis.submenuContainer = undefined\n\t\t\t\t}))\n\n\t\t\t\tthis.parentData.submenu.focus(selectFirstItem)\n\n\t\t\t\tthis.mySubmenu = this.parentData.submenu\n\t\t\t} else {\n\t\t\t\tthis.parentData.submenu.focus(false)\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected applyStyle(): void {\n\t\tsuper.applyStyle()\n\n\t\tif (!this.menuStyle) return\n\n\t\tconst isSelected = this.element && hasClass(this.element, 'focused')\n\t\tconst fgColor = isSelected && this.menuStyle.selectionForegroundColor ? this.menuStyle.selectionForegroundColor : this.menuStyle.foregroundColor\n\t\tapplyFill(this.submenuIndicator, this.submenuParentOptions.svgColor, fgColor)\n\n\t\tif (this.parentData.submenu) this.parentData.submenu.applyStyle(this.menuStyle)\n\t}\n\n\tonClick(e: EventLike): void {\n\t\t// stop clicking from trying to run an action\n\t\tEventHelper.stop(e, true)\n\n\t\tthis.cleanupExistingSubmenu(false)\n\t\tthis.createSubmenu(false)\n\t}\n\n\tdispose(): void {\n\t\tsuper.dispose()\n\n\t\tthis.hideScheduler.dispose()\n\n\t\tif (this.mySubmenu) {\n\t\t\tthis.mySubmenu.dispose()\n\t\t\tthis.mySubmenu = null\n\t\t}\n\n\t\tif (this.submenuContainer) {\n\t\t\tthis.submenuDisposables = dispose(this.submenuDisposables)\n\t\t\tthis.submenuContainer = undefined\n\t\t}\n\t}\n}","/* ---------------------------------------------------------------------------------------------\n * Copyright (c) AlexTorresDev. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\nimport { Menu, MenuItem } from 'electron'\nimport { $, EventHelper, EventLike, EventType, addDisposableListener, append, hasClass, isAncestor, removeNode } from 'base/common/dom'\nimport { Disposable, dispose } from 'base/common/lifecycle'\nimport { CETMenuItem, IMenuItem, IMenuStyle } from './item'\nimport { KeyCode, KeyCodeUtils, KeyMod } from 'base/common/keyCodes'\nimport { StandardKeyboardEvent } from 'base/browser/keyboardEvent'\nimport { Color, RGBA } from 'base/common/color'\nimport { Emitter, Event } from 'base/common/event'\nimport { MenuBarOptions } from '../menubar-options'\nimport { CETSeparator } from './separator'\nimport { CETSubMenu, ISubMenuData } from './submenu'\nimport { isLinux, isFreeBSD } from 'base/common/platform'\nimport { IMenuIcons } from 'menubar'\n\nexport enum Direction {\n\tRight,\n\tLeft\n}\n\nexport interface IMenuOptions {\n\tariaLabel?: string\n\tenableMnemonics?: boolean\n}\n\ninterface ActionTrigger {\n\tkeys: KeyCode[]\n\tkeyDown: boolean\n}\n\nexport class CETMenu extends Disposable {\n\tprivate focusedItem?: number = undefined\n\tprivate items: IMenuItem[] = []\n\n\tprivate mnemonics: Map<KeyCode, Array<CETMenuItem>>\n\n\tprivate triggerKeys: ActionTrigger = {\n\t\tkeys: [KeyCode.Enter, KeyCode.Space],\n\t\tkeyDown: true\n\t}\n\n\tparentData: ISubMenuData = {\n\t\tparent: this\n\t}\n\n\tprivate _onDidCancel = this._register(new Emitter<void>())\n\n\tconstructor(private menuContainer: HTMLElement, private menuIcons: IMenuIcons, private parentOptions: MenuBarOptions, private currentOptions: IMenuOptions, private closeSubMenu = () => { }) {\n\t\tsuper()\n\n\t\tthis.mnemonics = new Map<KeyCode, Array<CETMenuItem>>()\n\n\t\tthis._register(addDisposableListener(this.menuContainer, EventType.KEY_DOWN, e => {\n\t\t\tconst event = new StandardKeyboardEvent(e)\n\t\t\tlet eventHandled = true\n\n\t\t\tif (event.equals(KeyCode.UpArrow)) {\n\t\t\t\tthis.focusPrevious()\n\t\t\t} else if (event.equals(KeyCode.DownArrow)) {\n\t\t\t\tthis.focusNext()\n\t\t\t} else if (event.equals(KeyCode.Escape)) {\n\t\t\t\tthis.cancel()\n\t\t\t} else if (this.isTriggerKeyEvent(event)) {\n\t\t\t\t// Staying out of the else branch even if not triggered\n\t\t\t\tif (this.triggerKeys && this.triggerKeys.keyDown) {\n\t\t\t\t\tthis.doTrigger(event)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\teventHandled = false\n\t\t\t}\n\n\t\t\tif (eventHandled) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tevent.stopPropagation()\n\t\t\t}\n\t\t}))\n\n\t\tthis._register(addDisposableListener(this.menuContainer, EventType.KEY_UP, e => {\n\t\t\tconst event = new StandardKeyboardEvent(e)\n\n\t\t\t// Run action on Enter/Space\n\t\t\tif (this.isTriggerKeyEvent(event)) {\n\t\t\t\tif (this.triggerKeys && !this.triggerKeys.keyDown) {\n\t\t\t\t\tthis.doTrigger(event)\n\t\t\t\t}\n\n\t\t\t\tevent.preventDefault()\n\t\t\t\tevent.stopPropagation()\n\t\t\t\t// Recompute focused item\n\t\t\t} else if (event.equals(KeyCode.Tab) || event.equals(KeyMod.Shift | KeyCode.Tab)) {\n\t\t\t\tthis.updateFocusedItem()\n\t\t\t}\n\t\t}))\n\n\t\tif (this.currentOptions.enableMnemonics) {\n\t\t\tthis._register(addDisposableListener(this.menuContainer, EventType.KEY_DOWN, (e) => {\n\t\t\t\tconst key = KeyCodeUtils.fromString(e.key)\n\t\t\t\tif (this.mnemonics.has(key)) {\n\t\t\t\t\tconst items = this.mnemonics.get(key)!\n\n\t\t\t\t\tif (items.length === 1) {\n\t\t\t\t\t\tif (items[0] instanceof CETSubMenu) {\n\t\t\t\t\t\t\tthis.focusItemByElement(items[0].element)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\titems[0].onClick(e)\n\t\t\t\t\t}\n\n\t\t\t\t\tif (items.length > 1) {\n\t\t\t\t\t\tconst item = items.shift()\n\t\t\t\t\t\tif (item) {\n\t\t\t\t\t\t\tthis.focusItemByElement(item.element)\n\t\t\t\t\t\t\titems.push(item)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis.mnemonics.set(key, items)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}))\n\t\t}\n\n\t\tif (isLinux) {\n\t\t\tthis._register(addDisposableListener(this.menuContainer, EventType.KEY_DOWN, e => {\n\t\t\t\tconst event = new StandardKeyboardEvent(e)\n\n\t\t\t\tif (event.equals(KeyCode.Home) || event.equals(KeyCode.PageUp)) {\n\t\t\t\t\tthis.focusedItem = this.items.length - 1\n\t\t\t\t\tthis.focusNext()\n\t\t\t\t\tEventHelper.stop(e, true)\n\t\t\t\t} else if (event.equals(KeyCode.End) || event.equals(KeyCode.PageDown)) {\n\t\t\t\t\tthis.focusedItem = 0\n\t\t\t\t\tthis.focusPrevious()\n\t\t\t\t\tEventHelper.stop(e, true)\n\t\t\t\t}\n\t\t\t}))\n\t\t}\n\n\t\tif (isFreeBSD) {\n\t\t\tthis._register(addDisposableListener(this.menuContainer, EventType.KEY_DOWN, e => {\n\t\t\t\tconst event = new StandardKeyboardEvent(e)\n\n\t\t\t\tif (event.equals(KeyCode.Home) || event.equals(KeyCode.PageUp)) {\n\t\t\t\t\tthis.focusedItem = this.items.length - 1\n\t\t\t\t\tthis.focusNext()\n\t\t\t\t\tEventHelper.stop(e, true)\n\t\t\t\t} else if (event.equals(KeyCode.End) || event.equals(KeyCode.PageDown)) {\n\t\t\t\t\tthis.focusedItem = 0\n\t\t\t\t\tthis.focusPrevious()\n\t\t\t\t\tEventHelper.stop(e, true)\n\t\t\t\t}\n\t\t\t}))\n\t\t}\n\n\t\tthis._register(addDisposableListener(this.menuContainer, EventType.MOUSE_OUT, e => {\n\t\t\tconst relatedTarget = e.relatedTarget as HTMLElement\n\t\t\tif (!isAncestor(relatedTarget, this.menuContainer)) {\n\t\t\t\tthis.focusedItem = undefined\n\t\t\t\tthis.updateFocus()\n\t\t\t\te.stopPropagation()\n\t\t\t}\n\t\t}))\n\n\t\tthis._register(addDisposableListener(this.menuContainer, EventType.MOUSE_UP, e => {\n\t\t\t// Absorb clicks in menu dead space https://github.com/Microsoft/vscode/issues/63575\n\t\t\tEventHelper.stop(e, true)\n\t\t}))\n\n\t\tthis._register(addDisposableListener(this.menuContainer, EventType.MOUSE_OVER, e => {\n\t\t\tlet target = e.target as HTMLElement\n\n\t\t\tif (!target || !isAncestor(target, this.menuContainer) || target === this.menuContainer) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\twhile (target.parentElement !== this.menuContainer && target.parentElement !== null) {\n\t\t\t\ttarget = target.parentElement\n\t\t\t}\n\n\t\t\tif (hasClass(target, 'cet-action-item')) {\n\t\t\t\tconst lastFocusedItem = this.focusedItem\n\t\t\t\tthis.setFocusedItem(target)\n\n\t\t\t\tif (lastFocusedItem !== this.focusedItem) {\n\t\t\t\t\tthis.updateFocus()\n\t\t\t\t}\n\t\t\t}\n\t\t}))\n\n\t\tif (this.currentOptions.ariaLabel) {\n\t\t\tthis.menuContainer.setAttribute('aria-label', this.currentOptions.ariaLabel)\n\t\t}\n\t}\n\n\ttrigger(index: number): void {\n\t\tif (index <= this.items.length && index >= 0) {\n\t\t\tconst item = this.items[index]\n\n\t\t\tif (item instanceof CETSubMenu) {\n\t\t\t\tthis.focus(index)\n\t\t\t}\n\t\t}\n\t}\n\n\tcreateMenu(menuItems: MenuItem[] | undefined) {\n\t\tif (!menuItems) return\n\n\t\tmenuItems.forEach((menuItem: MenuItem) => {\n\t\t\tif (!menuItem) return\n\n\t\t\tconst itemElement = $('li.cet-action-item', { role: 'presentation' })\n\n\t\t\t// Prevent native context menu on actions\n\t\t\tthis._register(addDisposableListener(itemElement, EventType.CONTEXT_MENU, (e: EventLike) => {\n\t\t\t\te.preventDefault()\n\t\t\t\te.stopPropagation()\n\t\t\t}))\n\n\t\t\tlet item: CETMenuItem\n\n\t\t\tif (menuItem.type === 'separator') {\n\t\t\t\titem = new CETSeparator(menuItem, this.menuIcons, this.parentOptions, this.currentOptions)\n\t\t\t} else if (menuItem.type === 'submenu' || menuItem.submenu) {\n\t\t\t\tconst submenuItems = (menuItem.submenu as Menu).items\n\t\t\t\titem = new CETSubMenu(menuItem, this.menuIcons, submenuItems, this.parentData, this.parentOptions, this.currentOptions, this.closeSubMenu)\n\n\t\t\t\tif (this.currentOptions.enableMnemonics) {\n\t\t\t\t\tconst mnemonic = item.mnemonic\n\n\t\t\t\t\tif (mnemonic && item.isEnabled()) {\n\t\t\t\t\t\tlet actionItems: CETMenuItem[] = []\n\t\t\t\t\t\tif (this.mnemonics.has(mnemonic)) {\n\t\t\t\t\t\t\tactionItems = this.mnemonics.get(mnemonic)!\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tactionItems.push(item)\n\n\t\t\t\t\t\tthis.mnemonics.set(mnemonic, actionItems)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\titem = new CETMenuItem(menuItem, this.menuIcons, this.parentOptions, this.currentOptions, this.items, this.closeSubMenu)\n\n\t\t\t\tif (this.currentOptions.enableMnemonics) {\n\t\t\t\t\tconst mnemonic = item.mnemonic\n\n\t\t\t\t\tif (mnemonic && item.isEnabled()) {\n\t\t\t\t\t\tlet actionItems: CETMenuItem[] = []\n\n\t\t\t\t\t\tif (this.mnemonics.has(mnemonic)) {\n\t\t\t\t\t\t\tactionItems = this.mnemonics.get(mnemonic)!\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tactionItems.push(item)\n\n\t\t\t\t\t\tthis.mnemonics.set(mnemonic, actionItems)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\titem.render(itemElement)\n\t\t\tthis.items.push(item)\n\t\t\tappend(this.menuContainer, itemElement)\n\t\t})\n\t}\n\n\tprivate isTriggerKeyEvent(event: StandardKeyboardEvent): boolean {\n\t\tlet ret = false\n\t\tif (this.triggerKeys) {\n\t\t\tthis.triggerKeys.keys.forEach(keyCode => {\n\t\t\t\tret = ret || event.equals(keyCode)\n\t\t\t})\n\t\t}\n\n\t\treturn ret\n\t}\n\n\tprivate updateFocusedItem(): void {\n\t\tfor (let i = 0; i < this.menuContainer.children.length; i++) {\n\t\t\tconst elem = this.menuContainer.children[i]\n\t\t\tif (isAncestor(document.activeElement, elem)) {\n\t\t\t\tthis.focusedItem = i\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\tfocus(index?: number): void\n\tfocus(selectFirst?: boolean): void\n\tfocus(arg?: any): void {\n\t\tlet selectFirst: boolean = false\n\t\tlet index: number | undefined\n\n\t\tif (arg === undefined) {\n\t\t\tselectFirst = true\n\t\t} else if (typeof arg === 'number') {\n\t\t\tindex = arg\n\t\t} else if (typeof arg === 'boolean') {\n\t\t\tselectFirst = arg\n\t\t}\n\n\t\tif (selectFirst && typeof this.focusedItem === 'undefined') {\n\t\t\t// Focus the first enabled item\n\t\t\tthis.focusedItem = this.items.length - 1\n\t\t\tthis.focusNext()\n\t\t} else {\n\t\t\tif (index !== undefined) {\n\t\t\t\tthis.focusedItem = index\n\t\t\t}\n\n\t\t\tthis.updateFocus()\n\t\t}\n\t}\n\n\tprivate focusNext(): void {\n\t\tif (typeof this.focusedItem === 'undefined') {\n\t\t\tthis.focusedItem = this.items.length - 1\n\t\t}\n\n\t\tconst startIndex = this.focusedItem\n\t\tlet item: IMenuItem\n\n\t\tdo {\n\t\t\tthis.focusedItem = (this.focusedItem + 1) % this.items.length\n\t\t\titem = this.items[this.focusedItem]\n\t\t} while ((this.focusedItem !== startIndex && !item.isEnabled()) || item.isSeparator())\n\n\t\tif ((this.focusedItem === startIndex && !item.isEnabled()) || item.isSeparator()) {\n\t\t\tthis.focusedItem = undefined\n\t\t}\n\n\t\tthis.updateFocus()\n\t}\n\n\tprivate focusPrevious(): void {\n\t\tif (typeof this.focusedItem === 'undefined') {\n\t\t\tthis.focusedItem = 0\n\t\t}\n\n\t\tconst startIndex = this.focusedItem\n\t\tlet item: IMenuItem\n\n\t\tdo {\n\t\t\tthis.focusedItem = this.focusedItem - 1\n\n\t\t\tif (this.focusedItem < 0) {\n\t\t\t\tthis.focusedItem = this.items.length - 1\n\t\t\t}\n\n\t\t\titem = this.items[this.focusedItem]\n\t\t} while ((this.focusedItem !== startIndex && !item.isEnabled()) || item.isSeparator())\n\n\t\tif ((this.focusedItem === startIndex && !item.isEnabled()) || item.isSeparator()) {\n\t\t\tthis.focusedItem = undefined\n\t\t}\n\n\t\tthis.updateFocus()\n\t}\n\n\tprivate updateFocus() {\n\t\tif (typeof this.focusedItem === 'undefined') {\n\t\t\tthis.menuContainer.focus()\n\t\t}\n\n\t\tfor (let i = 0; i < this.items.length; i++) {\n\t\t\tconst item = this.items[i]\n\n\t\t\tif (i === this.focusedItem) {\n\t\t\t\tif (item.isEnabled()) {\n\t\t\t\t\titem.focus()\n\t\t\t\t} else {\n\t\t\t\t\tthis.menuContainer.focus()\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\titem.blur()\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate doTrigger(event: StandardKeyboardEvent): void {\n\t\tif (typeof this.focusedItem === 'undefined') {\n\t\t\treturn // nothing to focus\n\t\t}\n\n\t\t// trigger action\n\t\tconst item = this.items[this.focusedItem]\n\t\tif (item instanceof CETMenuItem) {\n\t\t\titem.onClick(event)\n\t\t}\n\t}\n\n\tprivate cancel(): void {\n\t\tif (document.activeElement instanceof HTMLElement) {\n\t\t\t(<HTMLElement>document.activeElement).blur() // remove focus from focused action\n\t\t}\n\n\t\tthis._onDidCancel.fire()\n\t}\n\n\tprivate focusItemByElement(element: HTMLElement | undefined) {\n\t\tconst lastFocusedItem = this.focusedItem\n\t\tif (element) this.setFocusedItem(element)\n\n\t\tif (lastFocusedItem !== this.focusedItem) {\n\t\t\tthis.updateFocus()\n\t\t}\n\t}\n\n\tprivate setFocusedItem(element: HTMLElement) {\n\t\tthis.focusedItem = Array.prototype.findIndex.call(this.container.children, (elem) => elem === element)\n\t}\n\n\tapplyStyle(style: IMenuStyle) {\n\t\tconst container = this.menuContainer\n\n\t\tif (style?.backgroundColor) {\n\t\t\tlet transparency = this.parentOptions?.menuTransparency!\n\n\t\t\tif (transparency < 0) transparency = 0\n\t\t\tif (transparency > 1) transparency = 1\n\t\t\tconst rgba = style.backgroundColor?.rgba\n\t\t\tcontainer.style.backgroundColor = `rgb(${rgba.r} ${rgba.g} ${rgba.b} / ${1 - transparency})`\n\t\t}\n\n\t\tif (this.items) {\n\t\t\tthis.items.forEach(item => {\n\t\t\t\tif (item instanceof CETMenuItem || item instanceof CETSeparator) {\n\t\t\t\t\titem.updateStyle(style)\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n\n\tget container(): HTMLElement {\n\t\treturn this.menuContainer\n\t}\n\n\tget onDidCancel(): Event<void> {\n\t\treturn this._onDidCancel.event\n\t}\n\n\tdispose() {\n\t\tdispose(this.items)\n\t\tthis.items = []\n\n\t\tremoveNode(this.container)\n\n\t\tsuper.dispose()\n\t}\n}","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as DomUtils from 'base/common/dom';\nimport * as arrays from 'base/common/arrays';\nimport { memoize } from 'base/common/decorators';\nimport { Disposable, IDisposable, toDisposable } from 'base/common/lifecycle';\nimport { LinkedList } from 'base/common/linkedList';\n\nexport namespace EventType {\n\texport const Tap = '-monaco-gesturetap';\n\texport const Change = '-monaco-gesturechange';\n\texport const Start = '-monaco-gesturestart';\n\texport const End = '-monaco-gesturesend';\n\texport const Contextmenu = '-monaco-gesturecontextmenu';\n}\n\ninterface TouchData {\n\tid: number;\n\tinitialTarget: EventTarget;\n\tinitialTimeStamp: number;\n\tinitialPageX: number;\n\tinitialPageY: number;\n\trollingTimestamps: number[];\n\trollingPageX: number[];\n\trollingPageY: number[];\n}\n\nexport interface GestureEvent extends MouseEvent {\n\tinitialTarget: EventTarget | undefined;\n\ttranslationX: number;\n\ttranslationY: number;\n\tpageX: number;\n\tpageY: number;\n\ttapCount: number;\n}\n\ninterface Touch {\n\tidentifier: number;\n\tscreenX: number;\n\tscreenY: number;\n\tclientX: number;\n\tclientY: number;\n\tpageX: number;\n\tpageY: number;\n\tradiusX: number;\n\tradiusY: number;\n\trotationAngle: number;\n\tforce: number;\n\ttarget: Element;\n}\n\ninterface TouchList {\n\t[i: number]: Touch;\n\tlength: number;\n\titem(index: number): Touch;\n\tidentifiedTouch(id: number): Touch;\n}\n\ninterface TouchEvent extends Event {\n\ttouches: TouchList;\n\ttargetTouches: TouchList;\n\tchangedTouches: TouchList;\n}\n\nexport class Gesture extends Disposable {\n\n\tprivate static readonly SCROLL_FRICTION = -0.005;\n\tprivate static INSTANCE: Gesture;\n\tprivate static readonly HOLD_DELAY = 700;\n\n\tprivate dispatched = false;\n\tprivate readonly targets = new LinkedList<HTMLElement>();\n\tprivate readonly ignoreTargets = new LinkedList<HTMLElement>();\n\tprivate handle: IDisposable | null;\n\n\tprivate readonly activeTouches: { [id: number]: TouchData };\n\n\tprivate _lastSetTapCountTime: number;\n\n\tprivate static readonly CLEAR_TAP_COUNT_TIME = 400; // ms\n\n\n\tprivate constructor() {\n\t\tsuper();\n\n\t\tthis.activeTouches = {};\n\t\tthis.handle = null;\n\t\tthis._lastSetTapCountTime = 0;\n\t\tthis._register(DomUtils.addDisposableListener(document, 'touchstart', (e: TouchEvent) => this.onTouchStart(e), { passive: false }));\n\t\tthis._register(DomUtils.addDisposableListener(document, 'touchend', (e: TouchEvent) => this.onTouchEnd(e)));\n\t\tthis._register(DomUtils.addDisposableListener(document, 'touchmove', (e: TouchEvent) => this.onTouchMove(e), { passive: false }));\n\t}\n\n\tpublic static addTarget(element: HTMLElement): IDisposable {\n\t\tif (!Gesture.isTouchDevice()) {\n\t\t\treturn Disposable.None;\n\t\t}\n\t\tif (!Gesture.INSTANCE) {\n\t\t\tGesture.INSTANCE = new Gesture();\n\t\t}\n\n\t\tconst remove = Gesture.INSTANCE.targets.push(element);\n\t\treturn toDisposable(remove);\n\t}\n\n\tpublic static ignoreTarget(element: HTMLElement): IDisposable {\n\t\tif (!Gesture.isTouchDevice()) {\n\t\t\treturn Disposable.None;\n\t\t}\n\t\tif (!Gesture.INSTANCE) {\n\t\t\tGesture.INSTANCE = new Gesture();\n\t\t}\n\n\t\tconst remove = Gesture.INSTANCE.ignoreTargets.push(element);\n\t\treturn toDisposable(remove);\n\t}\n\n\tstatic isTouchDevice(): boolean {\n\t\t// `'ontouchstart' in window` always evaluates to true with typescript's modern typings. This causes `window` to be\n\t\t// `never` later in `window.navigator`. That's why we need the explicit `window as Window` cast\n\t\treturn 'ontouchstart' in window || navigator.maxTouchPoints > 0;\n\t}\n\n\tpublic override dispose(): void {\n\t\tif (this.handle) {\n\t\t\tthis.handle.dispose();\n\t\t\tthis.handle = null;\n\t\t}\n\n\t\tsuper.dispose();\n\t}\n\n\tprivate onTouchStart(e: TouchEvent): void {\n\t\tconst timestamp = Date.now(); // use Date.now() because on FF e.timeStamp is not epoch based.\n\n\t\tif (this.handle) {\n\t\t\tthis.handle.dispose();\n\t\t\tthis.handle = null;\n\t\t}\n\n\t\tfor (let i = 0, len = e.targetTouches.length; i < len; i++) {\n\t\t\tconst touch = e.targetTouches.item(i);\n\n\t\t\tthis.activeTouches[touch.identifier] = {\n\t\t\t\tid: touch.identifier,\n\t\t\t\tinitialTarget: touch.target,\n\t\t\t\tinitialTimeStamp: timestamp,\n\t\t\t\tinitialPageX: touch.pageX,\n\t\t\t\tinitialPageY: touch.pageY,\n\t\t\t\trollingTimestamps: [timestamp],\n\t\t\t\trollingPageX: [touch.pageX],\n\t\t\t\trollingPageY: [touch.pageY]\n\t\t\t};\n\n\t\t\tconst evt = this.newGestureEvent(EventType.Start, touch.target);\n\t\t\tevt.pageX = touch.pageX;\n\t\t\tevt.pageY = touch.pageY;\n\t\t\tthis.dispatchEvent(evt);\n\t\t}\n\n\t\tif (this.dispatched) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tthis.dispatched = false;\n\t\t}\n\t}\n\n\tprivate onTouchEnd(e: TouchEvent): void {\n\t\tconst timestamp = Date.now(); // use Date.now() because on FF e.timeStamp is not epoch based.\n\n\t\tconst activeTouchCount = Object.keys(this.activeTouches).length;\n\n\t\tfor (let i = 0, len = e.changedTouches.length; i < len; i++) {\n\n\t\t\tconst touch = e.changedTouches.item(i);\n\n\t\t\tif (!this.activeTouches.hasOwnProperty(String(touch.identifier))) {\n\t\t\t\tconsole.warn('move of an UNKNOWN touch', touch);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst data = this.activeTouches[touch.identifier],\n\t\t\t\tholdTime = Date.now() - data.initialTimeStamp;\n\n\t\t\tif (holdTime < Gesture.HOLD_DELAY\n\t\t\t\t&& Math.abs(data.initialPageX - arrays.tail(data.rollingPageX)) < 30\n\t\t\t\t&& Math.abs(data.initialPageY - arrays.tail(data.rollingPageY)) < 30) {\n\n\t\t\t\tconst evt = this.newGestureEvent(EventType.Tap, data.initialTarget);\n\t\t\t\tevt.pageX = arrays.tail(data.rollingPageX);\n\t\t\t\tevt.pageY = arrays.tail(data.rollingPageY);\n\t\t\t\tthis.dispatchEvent(evt);\n\n\t\t\t} else if (holdTime >= Gesture.HOLD_DELAY\n\t\t\t\t&& Math.abs(data.initialPageX - arrays.tail(data.rollingPageX)) < 30\n\t\t\t\t&& Math.abs(data.initialPageY - arrays.tail(data.rollingPageY)) < 30) {\n\n\t\t\t\tconst evt = this.newGestureEvent(EventType.Contextmenu, data.initialTarget);\n\t\t\t\tevt.pageX = arrays.tail(data.rollingPageX);\n\t\t\t\tevt.pageY = arrays.tail(data.rollingPageY);\n\t\t\t\tthis.dispatchEvent(evt);\n\n\t\t\t} else if (activeTouchCount === 1) {\n\t\t\t\tconst finalX = arrays.tail(data.rollingPageX);\n\t\t\t\tconst finalY = arrays.tail(data.rollingPageY);\n\n\t\t\t\tconst deltaT = arrays.tail(data.rollingTimestamps) - data.rollingTimestamps[0];\n\t\t\t\tconst deltaX = finalX - data.rollingPageX[0];\n\t\t\t\tconst deltaY = finalY - data.rollingPageY[0];\n\t\t\t}\n\n\n\t\t\tthis.dispatchEvent(this.newGestureEvent(EventType.End, data.initialTarget));\n\t\t\t// forget about this touch\n\t\t\tdelete this.activeTouches[touch.identifier];\n\t\t}\n\n\t\tif (this.dispatched) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tthis.dispatched = false;\n\t\t}\n\t}\n\n\tprivate newGestureEvent(type: string, initialTarget?: EventTarget): GestureEvent {\n\t\tconst event = document.createEvent('CustomEvent') as unknown as GestureEvent;\n\t\tevent.initEvent(type, false, true);\n\t\tevent.initialTarget = initialTarget;\n\t\tevent.tapCount = 0;\n\t\treturn event;\n\t}\n\n\tprivate dispatchEvent(event: GestureEvent): void {\n\t\tif (event.type === EventType.Tap) {\n\t\t\tconst currentTime = (new Date()).getTime();\n\t\t\tlet setTapCount = 0;\n\t\t\tif (currentTime - this._lastSetTapCountTime > Gesture.CLEAR_TAP_COUNT_TIME) {\n\t\t\t\tsetTapCount = 1;\n\t\t\t} else {\n\t\t\t\tsetTapCount = 2;\n\t\t\t}\n\n\t\t\tthis._lastSetTapCountTime = currentTime;\n\t\t\tevent.tapCount = setTapCount;\n\t\t} else if (event.type === EventType.Change || event.type === EventType.Contextmenu) {\n\t\t\t// tap is canceled by scrolling or context menu\n\t\t\tthis._lastSetTapCountTime = 0;\n\t\t}\n\t}\n\n\tprivate inertia(dispatchTo: readonly EventTarget[], t1: number, vX: number, dirX: number, x: number, vY: number, dirY: number, y: number): void {\n\t\tthis.handle = DomUtils.scheduleAtNextAnimationFrame(() => {\n\t\t\tconst now = Date.now();\n\n\t\t\t// velocity: old speed + accel_over_time\n\t\t\tconst deltaT = now - t1;\n\t\t\tlet delta_pos_x = 0, delta_pos_y = 0;\n\t\t\tlet stopped = true;\n\n\t\t\tvX += Gesture.SCROLL_FRICTION * deltaT;\n\t\t\tvY += Gesture.SCROLL_FRICTION * deltaT;\n\n\t\t\tif (vX > 0) {\n\t\t\t\tstopped = false;\n\t\t\t\tdelta_pos_x = dirX * vX * deltaT;\n\t\t\t}\n\n\t\t\tif (vY > 0) {\n\t\t\t\tstopped = false;\n\t\t\t\tdelta_pos_y = dirY * vY * deltaT;\n\t\t\t}\n\n\t\t\t// dispatch translation event\n\t\t\tconst evt = this.newGestureEvent(EventType.Change);\n\t\t\tevt.translationX = delta_pos_x;\n\t\t\tevt.translationY = delta_pos_y;\n\t\t\tdispatchTo.forEach(d => d.dispatchEvent(evt));\n\n\t\t\tif (!stopped) {\n\t\t\t\tthis.inertia(dispatchTo, now, vX, dirX, x + delta_pos_x, vY, dirY, y + delta_pos_y);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate onTouchMove(e: TouchEvent): void {\n\t\tconst timestamp = Date.now(); // use Date.now() because on FF e.timeStamp is not epoch based.\n\n\t\tfor (let i = 0, len = e.changedTouches.length; i < len; i++) {\n\n\t\t\tconst touch = e.changedTouches.item(i);\n\n\t\t\tif (!this.activeTouches.hasOwnProperty(String(touch.identifier))) {\n\t\t\t\tconsole.warn('end of an UNKNOWN touch', touch);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst data = this.activeTouches[touch.identifier];\n\n\t\t\tconst evt = this.newGestureEvent(EventType.Change, data.initialTarget);\n\t\t\tevt.translationX = touch.pageX - arrays.tail(data.rollingPageX);\n\t\t\tevt.translationY = touch.pageY - arrays.tail(data.rollingPageY);\n\t\t\tevt.pageX = touch.pageX;\n\t\t\tevt.pageY = touch.pageY;\n\t\t\tthis.dispatchEvent(evt);\n\n\t\t\t// only keep a few data points, to average the final speed\n\t\t\tif (data.rollingPageX.length > 3) {\n\t\t\t\tdata.rollingPageX.shift();\n\t\t\t\tdata.rollingPageY.shift();\n\t\t\t\tdata.rollingTimestamps.shift();\n\t\t\t}\n\n\t\t\tdata.rollingPageX.push(touch.pageX);\n\t\t\tdata.rollingPageY.push(touch.pageY);\n\t\t\tdata.rollingTimestamps.push(timestamp);\n\t\t}\n\n\t\tif (this.dispatched) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tthis.dispatched = false;\n\t\t}\n\t}\n}","body {\n margin: 0 !important;\n overflow: hidden !important;\n}\n\n/* Titlebar */\n.cet-titlebar {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n flex-wrap: wrap;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n font-size: var(--cet-font-size, 13px);\n font-family: var(--cet-font-family, Arial, Helvetica, sans-serif);\n box-sizing: border-box;\n padding: 0 16px;\n overflow: hidden;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n zoom: 1;\n width: 100%;\n height: 31px;\n line-height: 31px;\n z-index: 99999;\n}\n\n.cet-titlebar *,\n.cet-titlebar *:before,\n.cet-titlebar *:after {\n box-sizing: border-box;\n}\n\n.cet-titlebar.cet-windows,\n.cet-titlebar.cet-linux,\n.cet-titlebar.cet-freebsd {\n padding: 0;\n height: 30px;\n line-height: 30px;\n justify-content: left;\n overflow: visible;\n}\n\n/* Inverted */\n.cet-titlebar.cet-inverted {\n flex-direction: row-reverse;\n}\n\n.cet-titlebar.cet-inverted .cet-menubar,\n.cet-titlebar.cet-inverted .cet-window-controls {\n flex-direction: row-reverse;\n margin-left: 20px;\n margin-right: 0;\n}\n\n/* First buttons */\n.cet-titlebar.cet-first-buttons .cet-window-controls {\n order: -1;\n margin: 0 5px 0 0;\n}\n\n.cet-titlebar.cet-inverted .cet-window-controls {\n margin: 0 5px 0 0;\n}\n\n/* Shadow */\n.cet-titlebar.cet-shadow {\n box-shadow: 0 2px 1px -1px rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 3px 0 rgba(0, 0, 0, 0.12);\n}\n\n/* Drag region */\n.cet-drag-region {\n top: 0;\n left: 0;\n display: block;\n position: absolute;\n width: 100%;\n height: 100%;\n z-index: -1;\n -webkit-app-region: drag;\n}\n\n/* Icon */\n.cet-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 34px;\n height: 30px;\n z-index: 99;\n overflow: hidden;\n}\n\n/* Title */\n.cet-title {\n flex: 0 1 auto;\n font-size: var(--cet-title-font-size, 12px);\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n zoom: 1;\n}\n\n/* Title alignment */\n.cet-title.cet-title-left {\n margin-left: 8px;\n margin-right: auto;\n}\n\n.cet-title.cet-title-right {\n margin-left: auto;\n margin-right: 8px;\n}\n\n.cet-title.cet-title-center {\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n}\n\n.cet-title.cet-bigsur {\n font-size: 13px;\n font-weight: 600;\n}\n\n/* Window controls */\n.cet-window-controls {\n display: flex;\n flex-grow: 0;\n flex-shrink: 0;\n text-align: center;\n position: relative;\n z-index: 99;\n -webkit-app-region: no-drag;\n height: 30px;\n font-family: initial !important;\n margin-left: auto;\n}\n\n.cet-control-icon {\n width: 2.85rem;\n}\n\n.cet-control-icon:not(.inactive):hover {\n background-color: rgb(255 255 255 / 12%);\n}\n\n.light .cet-control-icon:not(.inactive):hover {\n background-color: rgb(0 0 0 / 12%);\n}\n\n.cet-control-icon.inactive svg {\n opacity: 0.4;\n}\n\n.cet-control-icon svg {\n width: 10px;\n height: -webkit-fill-available;\n fill: #fff;\n display: initial !important;\n vertical-align: unset !important;\n}\n\n.cet-titlebar.light .cet-control-icon svg {\n fill: #222222 !important;\n}\n\n.cet-control-close:not(.inactive):hover {\n background-color: rgb(232 17 35 / 90%) !important;\n}\n\n.cet-control-close:not(.inactive):hover svg {\n fill: #fff !important;\n}\n\n/* Resizer */\n.cet-resizer {\n -webkit-app-region: no-drag;\n position: absolute;\n}\n\n.cet-resizer.left {\n top: 0;\n left: 0;\n width: 6px;\n height: 100%;\n}\n\n.cet-resizer.top {\n top: 0;\n width: 100%;\n height: 6px;\n}\n\n/* Container */\n.cet-container {\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n overflow: auto;\n z-index: 1;\n}\n\n/* MenuBar */\n.cet-menubar {\n min-width: 0;\n display: flex;\n flex-shrink: 1;\n flex-grow: 0;\n box-sizing: border-box;\n overflow: hidden;\n flex-wrap: nowrap;\n margin-right: 20px;\n}\n\n.cet-menubar.bottom {\n order: 1;\n width: 100%;\n padding: 0 5px 5px;\n margin-right: 0;\n}\n\n.cet-menubar.bottom .cet-menubar-menu-button {\n border-radius: 4px;\n}\n\n.cet-menubar.bottom .cet-menubar-menu-button .cet-menubar-menu-title {\n line-height: 26px;\n}\n\n.cet-menubar .cet-menubar-menu-button {\n box-sizing: border-box;\n padding: 0px 8px;\n height: 100%;\n cursor: default;\n zoom: 1;\n white-space: nowrap;\n -webkit-app-region: no-drag;\n outline: 0;\n}\n\n.cet-menubar .cet-menubar-menu-button .cet-menubar-menu-title {\n font-size: var(--cet-menu-font-size, 12px);\n}\n\n.cet-menubar .cet-menubar-menu-title.cet-toggle-more {\n font-weight: 700;\n letter-spacing: 1px;\n}\n\n.cet-menubar .cet-menubar-menu-button.disabled {\n opacity: 0.4;\n}\n\n.cet-menubar .cet-menubar-menu-button:not(.disabled):hover,\n.cet-menubar .cet-menubar-menu-button:not(.disabled).open {\n background-color: rgb(255 255 255 / 12%);\n}\n\n.cet-titlebar.light .cet-menubar .cet-menubar-menu-button:not(.disabled):hover,\n.cet-titlebar.light .cet-menubar .cet-menubar-menu-button:not(.disabled).open {\n background-color: rgb(0 0 0 / 12%);\n}\n\n.cet-menubar-menu-container {\n position: absolute;\n display: block;\n left: 0px;\n opacity: 1;\n outline: 0;\n border: none;\n text-align: left;\n margin: 0 auto;\n margin-left: 0;\n font-size: inherit;\n overflow-x: visible;\n overflow-y: visible;\n -webkit-overflow-scrolling: touch;\n justify-content: flex-end;\n white-space: nowrap;\n border-radius: 7px;\n backdrop-filter: blur(10px);\n box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2), 0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12);\n z-index: 99999;\n}\n\n.cet-menubar-menu-container::-webkit-scrollbar {\n width: 8px;\n height: 4px;\n cursor: pointer;\n background-color: rgba(0, 0, 0, 0);\n}\n\n.cet-menubar-menu-container::-webkit-scrollbar-track {\n border: none;\n background-color: rgba(0, 0, 0, 0);\n}\n\n.cet-menubar-menu-container::-webkit-scrollbar-thumb {\n border-radius: 10px;\n background-color: rgba(110, 110, 110, 0.2);\n}\n\n.cet-menubar-menu-container:focus {\n outline: 0;\n}\n\n.cet-menubar-menu-container .cet-action-item {\n padding: 0;\n margin: 0;\n transform: none;\n display: -ms-flexbox;\n display: flex;\n outline: none;\n}\n\n.cet-menubar-menu-container .cet-action-item.active {\n transform: none;\n}\n\n.cet-menubar-menu-container .cet-action-item.disabled .cet-action-menu-item {\n opacity: 0.4;\n}\n\n.cet-menubar-menu-container .cet-action-item .cet-submenu {\n position: absolute;\n}\n\n.cet-menubar-menu-container .cet-action-menu-item {\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n display: -ms-flexbox;\n display: flex;\n height: 2.231em;\n margin: 4px 3px;\n align-items: center;\n position: relative;\n border-radius: 4px;\n text-decoration: none;\n}\n\n.cet-menubar-menu-container .cet-action-label {\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n text-decoration: none;\n padding: 0 1em;\n background: none;\n font-size: 12px;\n line-height: 1;\n}\n\n.cet-menubar-menu-container .cet-action-label:not(.separator) {\n display: inline-block;\n -webkit-box-sizing: border-box;\n -o-box-sizing: border-box;\n -moz-box-sizing: border-box;\n -ms-box-sizing: border-box;\n box-sizing: border-box;\n margin: 0;\n padding: 0 2em 0 0.8em;\n}\n\n.cet-menubar-menu-container .cet-action-label.separator {\n opacity: 0.1;\n font-size: inherit;\n width: 100%;\n border-bottom: 1px solid transparent;\n}\n\n.cet-menubar-menu-container .cet-action-label.separator.text {\n padding: 0.7em 1em 0.1em 1em;\n font-weight: bold;\n opacity: 1;\n}\n\n.cet-menubar-menu-container .cet-action-label:hover {\n color: inherit;\n}\n\n.cet-menubar-menu-container .keybinding,\n.cet-menubar-menu-container .cet-submenu-indicator {\n display: inline-block;\n -ms-flex: 2 1 auto;\n flex: 2 1 auto;\n padding: 0 2em 0 1em;\n text-align: right;\n font-size: 11px;\n line-height: 1;\n}\n\n.cet-menubar-menu-container .cet-submenu-indicator {\n position: absolute;\n right: 4px;\n height: 12px;\n width: 12px;\n padding: 0;\n}\n\n.cet-menubar-menu-container .cet-submenu-indicator img,\n.cet-menubar-menu-container .cet-menu-item-icon .icon,\n.cet-menubar-menu-container .cet-submenu-indicator svg,\n.cet-menubar-menu-container .cet-menu-item-icon svg {\n display: inherit;\n width: 100%;\n height: 100%;\n}\n\n.cet-menubar-menu-container .cet-action-menu-item.checked>.cet-menu-item-icon.checkbox {\n visibility: visible;\n}\n\n.cet-menubar-menu-container .cet-menu-item-icon {\n width: 14px;\n height: 14px;\n margin: 0 0 0 12px;\n}\n\n.cet-menubar-menu-container .cet-menu-item-icon.checkbox {\n visibility: hidden;\n}","","","/* ---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\nimport { toDisposable, IDisposable, Disposable } from 'base/common/lifecycle'\nimport baseTheme from '../../static/theme/base.css?raw'\nimport macTheme from '../../static/theme/mac.css?raw'\nimport winTheme from '../../static/theme/win.css?raw'\n\nexport interface CssStyle {\n addRule(rule: string): void\n}\n\nexport interface Theme {\n (collector: CssStyle): void\n}\n\nclass ThemingRegistry extends Disposable {\n private readonly theming: Theme[] = []\n\n constructor() {\n super()\n }\n\n protected onThemeChange(theme: Theme): IDisposable {\n this.theming.push(theme)\n return toDisposable(() => {\n const idx = this.theming.indexOf(theme)\n this.theming.splice(idx, 1)\n })\n }\n\n protected getTheming(): Theme[] {\n return this.theming\n }\n}\n\nexport class ThemeBar extends ThemingRegistry {\n constructor() {\n super()\n\t\t\n this.registerTheme((collector: CssStyle) => {\n collector.addRule(baseTheme)\n })\n }\n\n protected registerTheme(theme: Theme) {\n this.onThemeChange(theme)\n\n const cssRules: string[] = []\n const hasRule: { [rule: string]: boolean } = {}\n const ruleCollector = {\n addRule: (rule: string) => {\n if (!hasRule[rule]) {\n cssRules.push(rule)\n hasRule[rule] = true\n }\n }\n }\n\n this.getTheming().forEach((p) => p(ruleCollector))\n\n _applyRules(cssRules.join('\\n'), 'titlebar-style')\n }\n\n static get win(): Theme {\n return (collector: CssStyle) => {\n collector.addRule(winTheme)\n }\n }\n\n static get mac(): Theme {\n return (collector: CssStyle) => {\n collector.addRule(macTheme)\n }\n }\n}\n\nfunction _applyRules(styleSheetContent: string, rulesClassName: string) {\n const themeStyles = document.head.getElementsByClassName(rulesClassName)\n\n if (themeStyles.length === 0) {\n const styleElement = document.createElement('style')\n styleElement.className = rulesClassName\n styleElement.innerHTML = styleSheetContent\n document.head.appendChild(styleElement)\n } else {\n ;(<HTMLStyleElement>themeStyles[0]).innerHTML = styleSheetContent\n }\n}\n","/* ---------------------------------------------------------------------------------------------\n * Copyright (c) AlexTorresDev. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\nimport { TitlebarThemeConfig, TitlebarThemeColors } from './options'\n\nexport const TITLEBAR_THEME_CONFIG_VERSION = 1 as const\n\ntype UnknownRecord = Record<string, unknown>\n\nexport interface VersionedTitlebarThemeConfig extends TitlebarThemeConfig {\n\tversion?: number\n}\n\nexport interface ThemeConfigNormalizationResult {\n\tconfig: TitlebarThemeConfig | null\n\twarnings: string[]\n}\n\nfunction asRecord(input: unknown): UnknownRecord | null {\n\tif (!input || typeof input !== 'object' || Array.isArray(input)) {\n\t\treturn null\n\t}\n\n\treturn input as UnknownRecord\n}\n\nfunction asString(input: unknown): string | undefined {\n\tif (typeof input !== 'string') {\n\t\treturn undefined\n\t}\n\n\tconst value = input.trim()\n\treturn value.length ? value : undefined\n}\n\nfunction asFiniteNumber(input: unknown): number | undefined {\n\tif (typeof input !== 'number' || !Number.isFinite(input)) {\n\t\treturn undefined\n\t}\n\n\treturn input\n}\n\nfunction sanitizeColors(input: unknown): TitlebarThemeColors | undefined {\n\tconst source = asRecord(input)\n\tif (!source) {\n\t\treturn undefined\n\t}\n\n\tconst colors: TitlebarThemeColors = {\n\t\ttitlebar: asString(source.titlebar),\n\t\ttitlebarForeground: asString(source.titlebarForeground),\n\t\tmenuBar: asString(source.menuBar),\n\t\tmenuItemSelection: asString(source.menuItemSelection),\n\t\tmenuSeparator: asString(source.menuSeparator),\n\t\tsvg: asString(source.svg)\n\t}\n\n\tconst hasAnyColor = !!(\n\t\tcolors.titlebar ||\n\t\tcolors.titlebarForeground ||\n\t\tcolors.menuBar ||\n\t\tcolors.menuItemSelection ||\n\t\tcolors.menuSeparator ||\n\t\tcolors.svg\n\t)\n\n\treturn hasAnyColor ? colors : undefined\n}\n\nexport function normalizeThemeConfig(input: unknown): ThemeConfigNormalizationResult {\n\tconst warnings: string[] = []\n\tconst source = asRecord(input)\n\tif (!source) {\n\t\treturn { config: null, warnings: ['Theme config must be a JSON object.'] }\n\t}\n\n\tconst requestedVersion = asFiniteNumber(source.version)\n\tif (requestedVersion !== undefined && requestedVersion !== TITLEBAR_THEME_CONFIG_VERSION) {\n\t\twarnings.push(`Theme config version ${requestedVersion} is not fully supported. Falling back to v${TITLEBAR_THEME_CONFIG_VERSION} compatible fields.`)\n\t}\n\n\tconst config: VersionedTitlebarThemeConfig = {\n\t\tfontFamily: asString(source.fontFamily),\n\t\tfontSize: asFiniteNumber(source.fontSize),\n\t\tcolors: sanitizeColors(source.colors)\n\t}\n\n\tconst hasConfig = !!(config.fontFamily || config.fontSize !== undefined || config.colors)\n\tif (!hasConfig) {\n\t\treturn { config: null, warnings: warnings.concat('No supported theme fields found in config.') }\n\t}\n\n\treturn { config, warnings }\n}\n"],"mappings":"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","names":["import_electron","Color","Format","CSS","Iterator","Node","Event","map","filter","buffer","emitter","count","stack","event","userAgent","platform","KeyCodeUtils","callback","getComputedStyle","getComputedStyle","import_electron","menuIcons","menuIcons","EventType","$","menuIcons","$","EventType","backgroundColor","foregroundColor"]}