custom-electron-titlebar 4.2.5 → 4.2.7
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.
- package/README.md +11 -3
- package/consts.d.ts +4 -3
- package/consts.js +10 -4
- package/main/attach-titlebar-to-window.d.ts +1 -1
- package/main/attach-titlebar-to-window.js +4 -1
- package/main/setup-titlebar.d.ts +1 -1
- package/main/setup-titlebar.js +25 -12
- package/menubar/index.js +2 -2
- package/menubar/menu/index.js +1 -5
- package/menubar/menubar-options.d.ts +0 -8
- package/package.json +14 -14
- package/titlebar/index.js +38 -22
- package/titlebar/themebar.js +1 -1
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@ This project is a typescript library for electron that allows you to configure a
|
|
|
7
7
|
[](https://npmjs.org/package/custom-electron-titlebar)
|
|
8
8
|
[](https://packagephobia.com/result?p=custom-electron-titlebar)
|
|
9
9
|
|
|
10
|
-
[📄
|
|
10
|
+
[📄 Documentation](https://github.com/AlexTorresDev/custom-electron-titlebar/wiki)
|
|
11
11
|
|
|
12
12
|
Standard Title Bar
|
|
13
13
|
|
|
@@ -26,10 +26,16 @@ Custom color
|
|
|
26
26
|

|
|
27
27
|
|
|
28
28
|
# 📦 Installing
|
|
29
|
-
You can install this package with `npm`.
|
|
29
|
+
You can install this package with `npm`, `pnpm` or `yarn`.
|
|
30
30
|
```sh
|
|
31
31
|
npm install custom-electron-titlebar
|
|
32
32
|
```
|
|
33
|
+
```sh
|
|
34
|
+
pnpm add custom-electron-titlebar
|
|
35
|
+
```
|
|
36
|
+
```sh
|
|
37
|
+
yarn add custom-electron-titlebar
|
|
38
|
+
```
|
|
33
39
|
|
|
34
40
|
# 🛠️ Usage
|
|
35
41
|
The implementation is done as follows:
|
|
@@ -46,8 +52,10 @@ function createWindow() {
|
|
|
46
52
|
const mainWindow = new BrowserWindow({
|
|
47
53
|
width: 800,
|
|
48
54
|
height: 600,
|
|
49
|
-
titleBarStyle: 'hidden',
|
|
50
55
|
//frame: false, // needed if process.versions.electron < 14
|
|
56
|
+
titleBarStyle: 'hidden',
|
|
57
|
+
/* You can use *titleBarOverlay: true* to use the original Windows controls */
|
|
58
|
+
titleBarOverlay: true,
|
|
51
59
|
webPreferences: {
|
|
52
60
|
sandbox: false,
|
|
53
61
|
preload: path.join(__dirname, 'preload.js')
|
package/consts.d.ts
CHANGED
|
@@ -6,9 +6,9 @@ export declare const INACTIVE_FOREGROUND: Color;
|
|
|
6
6
|
export declare const ACTIVE_FOREGROUND: Color;
|
|
7
7
|
export declare const DEFAULT_ITEM_SELECTOR: Color;
|
|
8
8
|
export declare const IS_MAC_BIGSUR_OR_LATER: boolean;
|
|
9
|
-
export declare const BOTTOM_TITLEBAR_HEIGHT =
|
|
10
|
-
export declare const TOP_TITLEBAR_HEIGHT_MAC:
|
|
11
|
-
export declare const TOP_TITLEBAR_HEIGHT_WIN =
|
|
9
|
+
export declare const BOTTOM_TITLEBAR_HEIGHT = 60;
|
|
10
|
+
export declare const TOP_TITLEBAR_HEIGHT_MAC: number;
|
|
11
|
+
export declare const TOP_TITLEBAR_HEIGHT_WIN = 30;
|
|
12
12
|
export declare const WINDOW_MIN_WIDTH = 400;
|
|
13
13
|
export declare const WINDOW_MIN_HEIGHT = 270;
|
|
14
14
|
export declare const MENU_MNEMONIC_REGEX: RegExp;
|
|
@@ -34,6 +34,7 @@ interface ITitlebarIcons extends IMenuIcons {
|
|
|
34
34
|
};
|
|
35
35
|
}
|
|
36
36
|
export declare const menuIcons: ITitlebarIcons;
|
|
37
|
+
export declare function getPx(value: number): string;
|
|
37
38
|
/**
|
|
38
39
|
* Handles mnemonics for menu items. Depending on OS:
|
|
39
40
|
* - Windows: Supported via & character (replace && with &)
|
package/consts.js
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
Object.defineProperty(exports, "__esModule", {
|
|
8
8
|
value: true
|
|
9
9
|
});
|
|
10
|
-
exports.loadWindowIcons = exports.applyFill = exports.parseAccelerator = exports.cleanMnemonic = exports.mnemonicButtonLabel = exports.mnemonicMenuLabel = exports.menuIcons = exports.MENU_ESCAPED_MNEMONIC_REGEX = exports.MENU_MNEMONIC_REGEX = exports.WINDOW_MIN_HEIGHT = exports.WINDOW_MIN_WIDTH = exports.TOP_TITLEBAR_HEIGHT_WIN = exports.TOP_TITLEBAR_HEIGHT_MAC = exports.BOTTOM_TITLEBAR_HEIGHT = exports.IS_MAC_BIGSUR_OR_LATER = exports.DEFAULT_ITEM_SELECTOR = exports.ACTIVE_FOREGROUND = exports.INACTIVE_FOREGROUND = exports.ACTIVE_FOREGROUND_DARK = exports.INACTIVE_FOREGROUND_DARK = void 0;
|
|
10
|
+
exports.loadWindowIcons = exports.applyFill = exports.parseAccelerator = exports.cleanMnemonic = exports.mnemonicButtonLabel = exports.mnemonicMenuLabel = exports.getPx = exports.menuIcons = exports.MENU_ESCAPED_MNEMONIC_REGEX = exports.MENU_MNEMONIC_REGEX = exports.WINDOW_MIN_HEIGHT = exports.WINDOW_MIN_WIDTH = exports.TOP_TITLEBAR_HEIGHT_WIN = exports.TOP_TITLEBAR_HEIGHT_MAC = exports.BOTTOM_TITLEBAR_HEIGHT = exports.IS_MAC_BIGSUR_OR_LATER = exports.DEFAULT_ITEM_SELECTOR = exports.ACTIVE_FOREGROUND = exports.INACTIVE_FOREGROUND = exports.ACTIVE_FOREGROUND_DARK = exports.INACTIVE_FOREGROUND_DARK = void 0;
|
|
11
11
|
const color_1 = require("./base/common/color");
|
|
12
12
|
const platform_1 = require("./base/common/platform");
|
|
13
13
|
exports.INACTIVE_FOREGROUND_DARK = _get__("color_1").Color.fromHex('#222222');
|
|
@@ -16,9 +16,9 @@ exports.INACTIVE_FOREGROUND = _get__("color_1").Color.fromHex('#EEEEEE');
|
|
|
16
16
|
exports.ACTIVE_FOREGROUND = _get__("color_1").Color.fromHex('#FFFFFF');
|
|
17
17
|
exports.DEFAULT_ITEM_SELECTOR = _get__("color_1").Color.fromHex('#0000001F');
|
|
18
18
|
exports.IS_MAC_BIGSUR_OR_LATER = _get__("platform_1").isMacintosh && parseInt(process.getSystemVersion().split('.')[0]) >= 11;
|
|
19
|
-
exports.BOTTOM_TITLEBAR_HEIGHT =
|
|
20
|
-
exports.TOP_TITLEBAR_HEIGHT_MAC = exports.IS_MAC_BIGSUR_OR_LATER ?
|
|
21
|
-
exports.TOP_TITLEBAR_HEIGHT_WIN =
|
|
19
|
+
exports.BOTTOM_TITLEBAR_HEIGHT = 60;
|
|
20
|
+
exports.TOP_TITLEBAR_HEIGHT_MAC = exports.IS_MAC_BIGSUR_OR_LATER ? 28 : 22;
|
|
21
|
+
exports.TOP_TITLEBAR_HEIGHT_WIN = 30;
|
|
22
22
|
exports.WINDOW_MIN_WIDTH = 400;
|
|
23
23
|
exports.WINDOW_MIN_HEIGHT = 270;
|
|
24
24
|
exports.MENU_MNEMONIC_REGEX = /\(&([^\s&])\)|(^|[^&])&([^\s&])/;
|
|
@@ -47,6 +47,10 @@ exports.menuIcons = {
|
|
|
47
47
|
close: '<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>'
|
|
48
48
|
}
|
|
49
49
|
};
|
|
50
|
+
function getPx(value) {
|
|
51
|
+
return `${value}px`;
|
|
52
|
+
}
|
|
53
|
+
exports.getPx = _get__("getPx");
|
|
50
54
|
/**
|
|
51
55
|
* Handles mnemonics for menu items. Depending on OS:
|
|
52
56
|
* - Windows: Supported via & character (replace && with &)
|
|
@@ -205,6 +209,8 @@ function _get_original__(variableName) {
|
|
|
205
209
|
return color_1;
|
|
206
210
|
case "platform_1":
|
|
207
211
|
return platform_1;
|
|
212
|
+
case "getPx":
|
|
213
|
+
return getPx;
|
|
208
214
|
case "mnemonicMenuLabel":
|
|
209
215
|
return mnemonicMenuLabel;
|
|
210
216
|
case "mnemonicButtonLabel":
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
3
6
|
/* ---------------------------------------------------------------------------------------------
|
|
4
7
|
* Copyright (c) AlexTorresDev. All rights reserved.
|
|
5
8
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
6
9
|
*-------------------------------------------------------------------------------------------- */
|
|
7
10
|
const consts_1 = require("../consts");
|
|
8
|
-
|
|
11
|
+
exports.default = browserWindow => {
|
|
9
12
|
browserWindow.setMinimumSize(_get__("consts_1").WINDOW_MIN_WIDTH, _get__("consts_1").WINDOW_MIN_HEIGHT);
|
|
10
13
|
browserWindow.on('enter-full-screen', () => {
|
|
11
14
|
browserWindow.webContents.send('window-fullscreen', true);
|
package/main/setup-titlebar.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
declare const _default: () => void;
|
|
2
|
-
export
|
|
2
|
+
export default _default;
|
package/main/setup-titlebar.js
CHANGED
|
@@ -4,22 +4,15 @@
|
|
|
4
4
|
* Copyright (c) AlexTorresDev. All rights reserved.
|
|
5
5
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
6
6
|
*-------------------------------------------------------------------------------------------- */
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const submenuItem = _get__("getMenuItemByCommandId")(commandId, item.submenu);
|
|
12
|
-
if (submenuItem) return submenuItem;
|
|
13
|
-
} else if (item.commandId === commandId) return item;
|
|
14
|
-
}
|
|
15
|
-
return undefined;
|
|
16
|
-
}
|
|
17
|
-
module.exports = () => {
|
|
7
|
+
Object.defineProperty(exports, "__esModule", {
|
|
8
|
+
value: true
|
|
9
|
+
});
|
|
10
|
+
exports.default = () => {
|
|
18
11
|
if (process.type !== 'browser') return;
|
|
19
12
|
const {
|
|
20
13
|
BrowserWindow,
|
|
21
|
-
nativeImage,
|
|
22
14
|
Menu,
|
|
15
|
+
MenuItem,
|
|
23
16
|
ipcMain
|
|
24
17
|
} = require('electron');
|
|
25
18
|
// Send menu to renderer title bar process
|
|
@@ -27,6 +20,7 @@ module.exports = () => {
|
|
|
27
20
|
// Handle window events
|
|
28
21
|
ipcMain.on('window-event', (event, eventName) => {
|
|
29
22
|
const window = BrowserWindow.fromWebContents(event.sender);
|
|
23
|
+
/* eslint-disable indent */
|
|
30
24
|
if (window) {
|
|
31
25
|
switch (eventName) {
|
|
32
26
|
case 'window-minimize':
|
|
@@ -60,7 +54,26 @@ module.exports = () => {
|
|
|
60
54
|
event.returnValue = null;
|
|
61
55
|
}
|
|
62
56
|
});
|
|
57
|
+
ipcMain.on('update-window-controls', (event, args) => {
|
|
58
|
+
const window = BrowserWindow.fromWebContents(event.sender);
|
|
59
|
+
try {
|
|
60
|
+
if (window) window.setTitleBarOverlay(args);
|
|
61
|
+
event.returnValue = true;
|
|
62
|
+
} catch (_) {
|
|
63
|
+
event.returnValue = false;
|
|
64
|
+
}
|
|
65
|
+
});
|
|
63
66
|
};
|
|
67
|
+
function getMenuItemByCommandId(commandId, menu) {
|
|
68
|
+
if (!menu) return undefined;
|
|
69
|
+
for (const item of menu.items) {
|
|
70
|
+
if (item.submenu) {
|
|
71
|
+
const submenuItem = _get__("getMenuItemByCommandId")(commandId, item.submenu);
|
|
72
|
+
if (submenuItem) return submenuItem;
|
|
73
|
+
} else if (item.commandId === commandId) return item;
|
|
74
|
+
}
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
64
77
|
function _getGlobalObject() {
|
|
65
78
|
try {
|
|
66
79
|
if (!!global) {
|
package/menubar/index.js
CHANGED
|
@@ -510,9 +510,9 @@ class MenuBar extends _get__("lifecycle_1").Disposable {
|
|
|
510
510
|
const replaceDoubleEscapes = str => str.replace(/&&/g, '&');
|
|
511
511
|
if (escMatch) {
|
|
512
512
|
titleElement.innerText = '';
|
|
513
|
-
titleElement.append(_get__("strings").ltrim(replaceDoubleEscapes(cleanLabel.
|
|
513
|
+
titleElement.append(_get__("strings").ltrim(replaceDoubleEscapes(cleanLabel.substring(0, escMatch.index)), ' '), _get__("$")('mnemonic', {
|
|
514
514
|
'aria-hidden': 'true'
|
|
515
|
-
}, escMatch[3]), _get__("strings").rtrim(replaceDoubleEscapes(cleanLabel.
|
|
515
|
+
}, escMatch[3]), _get__("strings").rtrim(replaceDoubleEscapes(cleanLabel.substring(escMatch.index + escMatch[0].length)), ' '));
|
|
516
516
|
} else {
|
|
517
517
|
titleElement.innerText = replaceDoubleEscapes(cleanLabel).trim();
|
|
518
518
|
}
|
package/menubar/menu/index.js
CHANGED
|
@@ -13,7 +13,6 @@ const lifecycle_1 = require("../../base/common/lifecycle");
|
|
|
13
13
|
const item_1 = require("./item");
|
|
14
14
|
const keyCodes_1 = require("../../base/common/keyCodes");
|
|
15
15
|
const keyboardEvent_1 = require("../../base/browser/keyboardEvent");
|
|
16
|
-
const color_1 = require("../../base/common/color");
|
|
17
16
|
const event_1 = require("../../base/common/event");
|
|
18
17
|
const separator_1 = require("./separator");
|
|
19
18
|
const submenu_1 = require("./submenu");
|
|
@@ -339,8 +338,7 @@ class CETMenu extends _get__("lifecycle_1").Disposable {
|
|
|
339
338
|
if (transparency < 0) transparency = 0;
|
|
340
339
|
if (transparency > 1) transparency = 1;
|
|
341
340
|
const rgba = style.backgroundColor?.rgba;
|
|
342
|
-
|
|
343
|
-
container.style.backgroundColor = color.toString();
|
|
341
|
+
container.style.backgroundColor = `rgb(${rgba.r} ${rgba.g} ${rgba.b} / ${1 - transparency})`;
|
|
344
342
|
}
|
|
345
343
|
if (this.items) {
|
|
346
344
|
this.items.forEach(item => {
|
|
@@ -467,8 +465,6 @@ function _get_original__(variableName) {
|
|
|
467
465
|
return separator_1;
|
|
468
466
|
case "item_1":
|
|
469
467
|
return item_1;
|
|
470
|
-
case "color_1":
|
|
471
|
-
return color_1;
|
|
472
468
|
case "lifecycle_1":
|
|
473
469
|
return lifecycle_1;
|
|
474
470
|
case "CETMenu":
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Menu } from 'electron';
|
|
2
1
|
import { Color } from '../base/common/color';
|
|
3
2
|
export interface MenuBarOptions {
|
|
4
3
|
/**
|
|
@@ -15,13 +14,6 @@ export interface MenuBarOptions {
|
|
|
15
14
|
* **The default is undefined**
|
|
16
15
|
*/
|
|
17
16
|
itemBackgroundColor?: Color;
|
|
18
|
-
/**
|
|
19
|
-
* @deprecated Use `setupTitlebar` method instead.
|
|
20
|
-
* The menu to show in the title bar.
|
|
21
|
-
* You can use `Menu` or not add this option and the menu created in the main process will be taken.
|
|
22
|
-
* **The default menu is undefined**
|
|
23
|
-
*/
|
|
24
|
-
menu?: Menu;
|
|
25
17
|
/**
|
|
26
18
|
* The background color of the menu.
|
|
27
19
|
* **The default is automatic**
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "custom-electron-titlebar",
|
|
3
|
-
"version": "4.2.
|
|
3
|
+
"version": "4.2.7",
|
|
4
4
|
"description": "Library for electron that allows you to configure a fully customizable title bar.",
|
|
5
5
|
"types": "./index.d.ts",
|
|
6
6
|
"main": "./index.ts",
|
|
@@ -16,9 +16,9 @@
|
|
|
16
16
|
"./main": "./main/index.js"
|
|
17
17
|
},
|
|
18
18
|
"scripts": {
|
|
19
|
-
"clean": "rimraf
|
|
19
|
+
"clean": "rimraf dist",
|
|
20
20
|
"build:package": "tsc && tsc-alias",
|
|
21
|
-
"build:babel": "babel
|
|
21
|
+
"build:babel": "babel dist --out-dir dist --extensions \".js\"",
|
|
22
22
|
"start": "electron example/main.js",
|
|
23
23
|
"dev": "npm run build && npm run start",
|
|
24
24
|
"build": "npm run clean && npm run build:package && npm run build:babel",
|
|
@@ -47,23 +47,23 @@
|
|
|
47
47
|
"electron": ">20.0.0"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
|
-
"@babel/cli": "7.22.
|
|
51
|
-
"@babel/core": "7.22.
|
|
52
|
-
"@jest/globals": "29.6.
|
|
53
|
-
"@typescript-eslint/eslint-plugin": "6.
|
|
54
|
-
"@typescript-eslint/parser": "6.
|
|
50
|
+
"@babel/cli": "7.22.10",
|
|
51
|
+
"@babel/core": "7.22.10",
|
|
52
|
+
"@jest/globals": "29.6.2",
|
|
53
|
+
"@typescript-eslint/eslint-plugin": "6.3.0",
|
|
54
|
+
"@typescript-eslint/parser": "6.3.0",
|
|
55
55
|
"babel-plugin-import-require-as-string": "1.0.2",
|
|
56
56
|
"babel-plugin-module-resolver": "5.0.0",
|
|
57
57
|
"babel-plugin-rewire": "1.2.0",
|
|
58
|
-
"electron": "25.
|
|
59
|
-
"eslint": "8.
|
|
60
|
-
"eslint-config-prettier": "
|
|
58
|
+
"electron": "25.5.0",
|
|
59
|
+
"eslint": "8.47.0",
|
|
60
|
+
"eslint-config-prettier": "9.0.0",
|
|
61
61
|
"eslint-config-standard": "17.1.0",
|
|
62
|
-
"eslint-plugin-import": "2.
|
|
62
|
+
"eslint-plugin-import": "2.28.0",
|
|
63
63
|
"eslint-plugin-n": "16.0.1",
|
|
64
64
|
"eslint-plugin-promise": "6.1.1",
|
|
65
|
-
"jest": "^29.6.
|
|
66
|
-
"jest-environment-jsdom": "29.6.
|
|
65
|
+
"jest": "^29.6.2",
|
|
66
|
+
"jest-environment-jsdom": "29.6.2",
|
|
67
67
|
"rimraf": "5.0.1",
|
|
68
68
|
"standard": "17.1.0",
|
|
69
69
|
"ts-jest": "29.1.1",
|
package/titlebar/index.js
CHANGED
|
@@ -208,6 +208,7 @@ class CustomTitlebar extends _get__("themebar_1").ThemeBar {
|
|
|
208
208
|
const minimizable = this.currentOptions.minimizable;
|
|
209
209
|
const maximizable = this.currentOptions.maximizable;
|
|
210
210
|
const closeable = this.currentOptions.closeable;
|
|
211
|
+
this.onDidChangeMaximized(_get__("electron_1").ipcRenderer.sendSync('window-event', 'window-is-maximized'));
|
|
211
212
|
_get__("electron_1").ipcRenderer.on('window-maximize', (_, isMaximized) => this.onDidChangeMaximized(isMaximized));
|
|
212
213
|
_get__("electron_1").ipcRenderer.on('window-fullscreen', (_, isFullScreen) => this.onWindowFullScreen(isFullScreen));
|
|
213
214
|
_get__("electron_1").ipcRenderer.on('window-focus', (_, isFocused) => this.onWindowFocus(isFocused));
|
|
@@ -258,7 +259,7 @@ class CustomTitlebar extends _get__("themebar_1").ThemeBar {
|
|
|
258
259
|
const maximize = this.controls.maximize;
|
|
259
260
|
if (maximize) {
|
|
260
261
|
maximize.title = isMaximized ? this.currentOptions.tooltips?.restoreDown : this.currentOptions.tooltips?.maximize;
|
|
261
|
-
maximize.innerHTML = isMaximized ? this.platformIcons
|
|
262
|
+
maximize.innerHTML = isMaximized ? this.platformIcons?.restore : this.platformIcons?.maximize;
|
|
262
263
|
}
|
|
263
264
|
if (this.resizer) {
|
|
264
265
|
if (isMaximized) (0, _get__("dom_1").hide)(this.resizer.top, this.resizer.left);else (0, _get__("dom_1").show)(this.resizer.top, this.resizer.left);
|
|
@@ -284,7 +285,7 @@ class CustomTitlebar extends _get__("themebar_1").ThemeBar {
|
|
|
284
285
|
}
|
|
285
286
|
const backgroundColor = this.isInactive ? this.currentOptions.backgroundColor?.lighten(0.12) : this.currentOptions.backgroundColor;
|
|
286
287
|
if (backgroundColor) {
|
|
287
|
-
this.titlebar.style.backgroundColor = backgroundColor
|
|
288
|
+
this.titlebar.style.backgroundColor = backgroundColor?.toString();
|
|
288
289
|
}
|
|
289
290
|
let foregroundColor;
|
|
290
291
|
if (backgroundColor?.isLighter()) {
|
|
@@ -294,16 +295,26 @@ class CustomTitlebar extends _get__("themebar_1").ThemeBar {
|
|
|
294
295
|
(0, _get__("dom_1").removeClass)(this.titlebar, 'light');
|
|
295
296
|
foregroundColor = this.isInactive ? _get__("consts_1").INACTIVE_FOREGROUND : _get__("consts_1").ACTIVE_FOREGROUND;
|
|
296
297
|
}
|
|
297
|
-
this.titlebar.style.color = foregroundColor
|
|
298
|
+
this.titlebar.style.color = foregroundColor?.toString();
|
|
299
|
+
const updatedWindowControls = _get__("electron_1").ipcRenderer.sendSync('update-window-controls', {
|
|
300
|
+
color: backgroundColor?.toString(),
|
|
301
|
+
symbolColor: foregroundColor?.toString(),
|
|
302
|
+
height: _get__("consts_1").TOP_TITLEBAR_HEIGHT_WIN
|
|
303
|
+
});
|
|
304
|
+
if (updatedWindowControls) {
|
|
305
|
+
(0, _get__("dom_1").hide)(this.controlsContainer);
|
|
306
|
+
} else {
|
|
307
|
+
(0, _get__("dom_1").show)(this.controlsContainer);
|
|
308
|
+
}
|
|
298
309
|
if (this.menuBar) {
|
|
299
310
|
let fgColor;
|
|
300
|
-
const backgroundColor = this.currentOptions.menuBarBackgroundColor
|
|
311
|
+
const backgroundColor = this.currentOptions.menuBarBackgroundColor || this.currentOptions.backgroundColor.darken(0.12);
|
|
301
312
|
const foregroundColor = backgroundColor?.isLighter() ? _get__("consts_1").INACTIVE_FOREGROUND_DARK : _get__("consts_1").INACTIVE_FOREGROUND;
|
|
302
|
-
const bgColor =
|
|
303
|
-
if (bgColor
|
|
313
|
+
const bgColor = this.currentOptions.itemBackgroundColor && !this.currentOptions.itemBackgroundColor.equals(backgroundColor) ? this.currentOptions.itemBackgroundColor : _get__("consts_1").DEFAULT_ITEM_SELECTOR;
|
|
314
|
+
if (bgColor?.equals(_get__("consts_1").DEFAULT_ITEM_SELECTOR)) {
|
|
304
315
|
fgColor = backgroundColor?.isLighter() ? _get__("consts_1").ACTIVE_FOREGROUND_DARK : _get__("consts_1").ACTIVE_FOREGROUND;
|
|
305
316
|
} else {
|
|
306
|
-
fgColor = bgColor
|
|
317
|
+
fgColor = bgColor?.isLighter() ? _get__("consts_1").ACTIVE_FOREGROUND_DARK : _get__("consts_1").ACTIVE_FOREGROUND;
|
|
307
318
|
}
|
|
308
319
|
this.menuBar.setStyles({
|
|
309
320
|
backgroundColor,
|
|
@@ -337,6 +348,8 @@ class CustomTitlebar extends _get__("themebar_1").ThemeBar {
|
|
|
337
348
|
* @param fullscreen Fullscreen state of the window
|
|
338
349
|
*/
|
|
339
350
|
onWindowFullScreen(fullscreen) {
|
|
351
|
+
const height = _get__("platform_1").isMacintosh ? _get__("consts_1").TOP_TITLEBAR_HEIGHT_MAC : _get__("consts_1").TOP_TITLEBAR_HEIGHT_WIN;
|
|
352
|
+
const hasShadow = this.currentOptions.shadow;
|
|
340
353
|
if (!_get__("platform_1").isMacintosh) {
|
|
341
354
|
if (fullscreen) {
|
|
342
355
|
(0, _get__("dom_1").hide)(this.titlebar);
|
|
@@ -344,10 +357,10 @@ class CustomTitlebar extends _get__("themebar_1").ThemeBar {
|
|
|
344
357
|
} else {
|
|
345
358
|
(0, _get__("dom_1").show)(this.titlebar);
|
|
346
359
|
if (this.currentOptions.menuPosition === 'bottom') {
|
|
347
|
-
this.container.style.top = _get__("consts_1").BOTTOM_TITLEBAR_HEIGHT;
|
|
348
|
-
this.controlsContainer.style.height = _get__("consts_1").TOP_TITLEBAR_HEIGHT_WIN;
|
|
360
|
+
this.container.style.top = (0, _get__("consts_1").getPx)(_get__("consts_1").BOTTOM_TITLEBAR_HEIGHT);
|
|
361
|
+
this.controlsContainer.style.height = (0, _get__("consts_1").getPx)(_get__("consts_1").TOP_TITLEBAR_HEIGHT_WIN);
|
|
349
362
|
} else {
|
|
350
|
-
this.container.style.top =
|
|
363
|
+
this.container.style.top = (0, _get__("consts_1").getPx)(height + (hasShadow ? 1 : 0));
|
|
351
364
|
}
|
|
352
365
|
}
|
|
353
366
|
}
|
|
@@ -399,13 +412,13 @@ class CustomTitlebar extends _get__("themebar_1").ThemeBar {
|
|
|
399
412
|
(0, _get__("dom_1").removeClass)(this.title, 'cet-title-right');
|
|
400
413
|
(0, _get__("dom_1").removeClass)(this.title, 'cet-title-center');
|
|
401
414
|
if (menuPosition !== 'bottom') {
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
})
|
|
415
|
+
(0, _get__("dom_1").addDisposableListener)(window, 'resize', () => {
|
|
416
|
+
if (window.innerWidth >= 1188) {
|
|
417
|
+
(0, _get__("dom_1").addClass)(this.title, 'cet-title-center');
|
|
418
|
+
} else {
|
|
419
|
+
(0, _get__("dom_1").removeClass)(this.title, 'cet-title-center');
|
|
420
|
+
}
|
|
421
|
+
});
|
|
409
422
|
(0, _get__("dom_1").addClass)(this.title, 'cet-title-center');
|
|
410
423
|
}
|
|
411
424
|
if (!_get__("platform_1").isMacintosh && order === 'first-buttons') {
|
|
@@ -420,6 +433,7 @@ class CustomTitlebar extends _get__("themebar_1").ThemeBar {
|
|
|
420
433
|
* @param backgroundColor The color for the background
|
|
421
434
|
*/
|
|
422
435
|
updateBackground(backgroundColor) {
|
|
436
|
+
if (typeof backgroundColor === 'string') backgroundColor = _get__("color_1").Color.fromHex(backgroundColor);
|
|
423
437
|
this.currentOptions.backgroundColor = backgroundColor;
|
|
424
438
|
this.updateStyles();
|
|
425
439
|
return this;
|
|
@@ -429,6 +443,7 @@ class CustomTitlebar extends _get__("themebar_1").ThemeBar {
|
|
|
429
443
|
* @param itemBGColor The color for the item background
|
|
430
444
|
*/
|
|
431
445
|
updateItemBGColor(itemBGColor) {
|
|
446
|
+
if (typeof itemBGColor === 'string') itemBGColor = _get__("color_1").Color.fromHex(itemBGColor);
|
|
432
447
|
this.currentOptions.itemBackgroundColor = itemBGColor;
|
|
433
448
|
this.updateStyles();
|
|
434
449
|
return this;
|
|
@@ -449,15 +464,16 @@ class CustomTitlebar extends _get__("themebar_1").ThemeBar {
|
|
|
449
464
|
updateMenuPosition(menuPosition) {
|
|
450
465
|
const height = _get__("platform_1").isMacintosh ? _get__("consts_1").TOP_TITLEBAR_HEIGHT_MAC : _get__("consts_1").TOP_TITLEBAR_HEIGHT_WIN;
|
|
451
466
|
const onlyRendererMenuBar = this.currentOptions.onlyShowMenuBar;
|
|
467
|
+
const hasShadow = this.currentOptions.shadow;
|
|
452
468
|
this.currentOptions.menuPosition = menuPosition;
|
|
453
469
|
if (menuPosition === 'left' || onlyRendererMenuBar) {
|
|
454
|
-
this.titlebar.style.height = height;
|
|
455
|
-
this.container.style.top = height;
|
|
470
|
+
this.titlebar.style.height = (0, _get__("consts_1").getPx)(height + (hasShadow ? 1 : 0));
|
|
471
|
+
this.container.style.top = (0, _get__("consts_1").getPx)(height + (hasShadow ? 1 : 0));
|
|
456
472
|
(0, _get__("dom_1").removeClass)(this.menuBarContainer, 'bottom');
|
|
457
473
|
} else {
|
|
458
|
-
this.titlebar.style.height = _get__("consts_1").BOTTOM_TITLEBAR_HEIGHT;
|
|
459
|
-
this.container.style.top = _get__("consts_1").BOTTOM_TITLEBAR_HEIGHT;
|
|
460
|
-
this.controlsContainer.style.height = height;
|
|
474
|
+
this.titlebar.style.height = (0, _get__("consts_1").getPx)(_get__("consts_1").BOTTOM_TITLEBAR_HEIGHT);
|
|
475
|
+
this.container.style.top = (0, _get__("consts_1").getPx)(_get__("consts_1").BOTTOM_TITLEBAR_HEIGHT);
|
|
476
|
+
this.controlsContainer.style.height = (0, _get__("consts_1").getPx)(height);
|
|
461
477
|
(0, _get__("dom_1").addClass)(this.menuBarContainer, 'bottom');
|
|
462
478
|
}
|
|
463
479
|
return this;
|
package/titlebar/themebar.js
CHANGED
|
@@ -9,7 +9,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
9
9
|
});
|
|
10
10
|
exports.ThemeBar = void 0;
|
|
11
11
|
const lifecycle_1 = require("../base/common/lifecycle");
|
|
12
|
-
const baseTheme = "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: 13px;\n 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: 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:
|
|
12
|
+
const baseTheme = "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: 13px;\n 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: 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 display: flex;\n flex-shrink: 1;\n box-sizing: border-box;\n overflow: hidden;\n flex-wrap: wrap;\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: 12px;\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}";
|
|
13
13
|
const macTheme = "";
|
|
14
14
|
const winTheme = "";
|
|
15
15
|
class ThemingRegistry extends _get__("lifecycle_1").Disposable {
|