2024-12-04 20:05:56 -05:00
> ![NOTE]
> Fork of Electron Tabs by Brrd
2024-01-08 11:56:10 -05:00
2024-12-04 20:05:56 -05:00
# Electron Tabs
2016-10-31 10:10:14 -05:00
2024-12-07 19:49:40 -05:00
![Electron Tab Demo ](image.png )
2016-11-02 11:04:19 -05:00
2022-05-25 10:20:17 -05:00
## Features
2016-10-31 10:10:14 -05:00
2022-05-25 10:20:17 -05:00
* :electron: Compatible with Electron ≥ 17.
* :lock: Compliant with [Electron security recommendations ](https://www.electronjs.org/docs/latest/tutorial/security ) (works without `nodeIntegration: true` ).
* :toolbox: Written with TypeScript and Web Components.
* :hand: Supports drag and drop out of the box.
* :art: Easily customizable.
2016-11-01 10:28:30 -05:00
2022-05-25 10:20:17 -05:00
## Installation
2017-07-02 06:32:27 -05:00
2022-05-25 10:20:17 -05:00
```bash
npm install --save electron-tabs
2017-07-02 06:32:27 -05:00
```
2022-05-25 10:20:17 -05:00
## Getting started
2016-11-01 10:28:30 -05:00
2022-05-25 10:20:17 -05:00
Define the following `webPreferences` options in the main process:
2020-02-04 06:14:55 -05:00
```js
const mainWindow = new electron.BrowserWindow({
webPreferences: {
webviewTag: true
}
});
```
2022-05-25 10:20:17 -05:00
Then add the following markup where you want the tabs to display:
2016-10-31 10:10:14 -05:00
```html
2022-05-25 10:20:17 -05:00
< tab-group > < / tab-group >
2016-10-31 10:10:14 -05:00
2022-05-25 10:20:17 -05:00
< script src = "node_modules/electron-tabs/dist/electron-tabs.js" > < / script >
2016-11-01 10:28:30 -05:00
```
2016-10-31 10:10:14 -05:00
2022-05-25 10:20:17 -05:00
## Options
2016-10-31 10:10:14 -05:00
2022-05-25 10:20:17 -05:00
You can add options by setting `<tab-group>` element attributes:
2016-11-02 11:13:41 -05:00
```html
2022-05-25 10:20:17 -05:00
< tab-group new-tab-button = "true" sortable = "true" > < / tab-group >
2016-11-02 11:13:41 -05:00
```
2022-05-25 10:20:17 -05:00
The following attributes are supported:
2020-02-04 06:14:55 -05:00
2022-05-25 10:20:17 -05:00
* `close-button-text` (string): text of the tabs "Close" button.
* `new-tab-button` (boolean): set it to true to display the "New Tab" button.
* `new-tab-button-text` (string): text of the "New Tab" button.
* `sortable` (boolean): set it to true to make the tabs sortable by drag and drop.
* `visibility-threshold` (number): the minimum number of tabs necessary for the tab bar to be displayed. 0 (default) means that it will always remain visible.
2018-08-05 02:12:59 -05:00
2022-05-25 10:20:17 -05:00
## Methods
2016-11-01 10:28:30 -05:00
2022-05-25 10:20:17 -05:00
Use `TabGroup` methods and manipulate tabs in a script after calling `electron-tabs.js` .
2016-11-01 10:28:30 -05:00
2022-05-25 10:20:17 -05:00
```html
< tab-group new-tab-button = "true" > < / tab-group >
< script src = "path/to/electron-tabs.js" > < / script >
< script >
// Select tab-group
const tabGroup = document.querySelector("tab-group");
// Setup the default tab which is created when the "New Tab" button is clicked
tabGroup.setDefaultTab({
title: "New Page",
src: "path/to/new-page.html",
active: true
});
// Do stuff
const tab = tabGroup.addTab({
2024-12-05 18:29:20 -05:00
title: "electron-tabs | SudoVanilla Registry",
src: "https://npm.sudovanilla.org/-/web/detail/@sudovanilla/electron-tabs"
2022-05-25 10:20:17 -05:00
});
const pos = tab.getPosition();
console.log("Tab position is " + pos);
< / script >
```
2016-11-01 10:28:30 -05:00
2022-05-25 10:20:17 -05:00
### TabGroup
2016-11-01 10:28:30 -05:00
#### `tabGroup.addTab(options)`
2022-05-25 10:20:17 -05:00
Add a new tab and returns the related `Tab` instance.
2016-11-01 10:28:30 -05:00
* `title` : tab title.
* `src` : URL to the page which will be loaded into the view. This is actually the same than `options.webview.src` .
* `closable` (default: `true` ): if set to `true` the close button won't be displayed and the user won't be able to close the tab. See also `tab.close()` .
2016-11-02 10:37:05 -05:00
* `visible` (default: `true` ): set this to `false` if you don't want to display the tab once it is loaded. If set to `false` then you will need to call `tab.show()` to display the tab.
2016-11-02 10:37:23 -05:00
* `active` (default: `false` ): set this to `true` if you want to activate the tab once it is loaded. Otherwise you will need to call `tab.activate()` .
2016-11-01 10:28:30 -05:00
* `ready` : a callback function to call once the tab is ready. The `Tab` instance is passed as the only parameter.
2024-12-05 18:29:20 -05:00
* `webviewAttributes` : attributes to add to the webview tag. See [webview documentation ](https://www.electronjs.org/docs/latest/api/webview-tag#tag-attributes ).
2022-05-25 10:20:17 -05:00
2022-05-25 11:05:11 -05:00
#### `tabGroup.setDefaultTab(options)`
2022-05-25 10:20:17 -05:00
Define default options to use for creating the tab when the "New Tab" button is clicked or when calling `tabGroup.addTab()` with no parameter.
```javascript
tabGroup.setDefaultTab({
title: "New Page",
src: "path/to/new-page.html",
active: true
});
```
2016-11-01 10:28:30 -05:00
2017-11-19 10:31:26 -05:00
#### `tabGroup.getTab(id)`
2017-10-27 20:11:46 -05:00
Retrieve an instance of `Tab` from this `id` (return `null` if not found).
#### `tabGroup.getTabByPosition(position)`
2017-11-05 22:38:01 -05:00
Retrieve an instance of `Tab` from this `position` (return `null` if not found). A negative value is an offset from the right.
To get the tab in the leftmost position:
```javascript
tabGroup.getTabByPosition(1);
```
To get the tab in the rightmost position:
```javascript
tabGroup.getTabByPosition(-1);
```
#### `tabGroup.getTabByRelPosition(position)`
Retrieve an instance of `Tab` from this `position` relative to the active tab (return `null` if not found).
2022-05-25 10:20:17 -05:00
2017-11-05 22:38:01 -05:00
`tabGroup.getNextTab()` is an alias to `tabGroup.getTabByRelPosition(1)` .
2022-05-25 10:20:17 -05:00
2017-11-05 22:38:01 -05:00
`tabGroup.getPreviousTab()` is an alias to `tabGroup.getTabByRelPosition(-1)` .
2016-11-01 10:28:30 -05:00
#### `tabGroup.getActiveTab()`
2022-05-25 10:20:17 -05:00
Return the active tab (return `null` if none).
2016-11-01 10:28:30 -05:00
2017-09-14 10:23:49 -05:00
#### `tabGroup.getTabs()`
Return all registered tabs.
#### `tabGroup.eachTab(fn, thisArg)`
Loop through the list of tabs in `tabGroup` and execute the `fn` function for each tab. `fn` is called with the following parameters:
* `currentTab` : the current tab object.
* `index` : the index of the current tab being processed.
* `tabs` : the full array of tabs (similar to `tabGroup.getTabs()` ).
`thisArg` (optional) is the value to use as `this` when executing `fn` .
2016-11-01 10:28:30 -05:00
### Tab
Instances of `Tab` are returned by the `tabGroup.addTab()` method.
#### `tab.setTitle(title)`
Set tab title.
#### `tab.getTitle()`
Get current tab title.
2017-10-26 19:03:37 -05:00
#### `tab.setPosition(newPosition)`
2022-05-25 10:20:17 -05:00
Move tab to the specified position. See [`tabGroup.getTabByPosition` ](#tabgroupgettabbypositionposition ) for information about positions.
2017-10-26 20:55:12 -05:00
#### `tab.getPosition(fromRight)`
2017-10-26 21:13:19 -05:00
Get the tab position. If `fromRight` is true the index returned is negative and is the offset from the right.
2017-10-26 19:03:37 -05:00
2016-11-01 10:28:30 -05:00
#### `tab.activate()`
Activate this tab. The class "active" is added to the active tab.
#### `tab.show(flag)`
Toggle the "visible" class on the tab. `tab.hide()` is an alias to `tab.show(false)` .
2020-03-12 15:56:23 -05:00
#### `tab.hasClass(classname)`
2022-05-25 10:20:17 -05:00
Return `true` if the tab element has the specified classname. Useful for checking if a tab is "active" or "visible".
2020-03-12 15:56:23 -05:00
2016-11-01 10:28:30 -05:00
#### `tab.close(force)`
Close the tab (and activate another tab if relevant). When `force` is set to `true` the tab will be closed even if it is not `closable` .
2022-05-25 10:20:17 -05:00
## Events
2016-11-01 10:28:30 -05:00
2022-05-25 10:20:17 -05:00
The following events are emitted:
2016-11-01 10:28:30 -05:00
* `tabGroup.on("tab-added", (tab, tabGroup) => { ... });`
* `tabGroup.on("tab-removed", (tab, tabGroup) => { ... });`
* `tabGroup.on("tab-active", (tab, tabGroup) => { ... });`
2017-02-16 10:13:07 -05:00
* `tab.on("webview-ready", (tab) => { ... });`
2020-02-28 04:33:20 -05:00
* `tab.on("webview-dom-ready", (tab) => { ... });`
2016-11-01 10:28:30 -05:00
* `tab.on("title-changed", (title, tab) => { ... });`
* `tab.on("active", (tab) => { ... });`
2019-09-24 01:09:53 -05:00
* `tab.on("inactive", (tab) => { ... });`
2016-11-01 10:28:30 -05:00
* `tab.on("visible", (tab) => { ... });`
* `tab.on("hidden", (tab) => { ... });`
* `tab.on("close", (tab) => { ... });`
2020-03-10 16:38:20 -05:00
* `tab.on("closing", (tab, abort) => { ... });` (Use `abort()` function to cancel closing)
2016-11-01 10:28:30 -05:00
2022-03-23 14:26:24 -05:00
You can also use `tab.once` to automatically remove the listener when invoked:
* `tab.once("webview-ready", (tab) => { ... });`
* `tab.once("webview-dom-ready", (tab) => { ... });`
2022-05-25 10:20:17 -05:00
## Access Electron webview element
2016-11-02 12:19:56 -05:00
2022-05-25 10:20:17 -05:00
You can access the webview element and use its methods with through the `Tab.webview` attribute. See [webview documentation ](https://electronjs.org/docs/api/webview-tag#methods ).
2016-11-02 12:19:56 -05:00
2022-05-25 10:20:17 -05:00
```javascript
let webview = tab.webview;
webview.loadURL("file://path/to/new/page.html");
2016-11-02 12:19:56 -05:00
```
2022-05-25 10:20:17 -05:00
## Custom styles
2024-12-05 18:29:20 -05:00
To customize tab-group styles, set new values to [electron-tabs CSS variables ](https://ark.sudovanilla.org/Korbs/electron-tabs/blob/master/src/style.css ) in your application stylesheet.
2022-05-25 10:20:17 -05:00
Since `TabGroup` is a Web Component you won't be able to change its styles directly from your app stylesheet. If you need more control over it then you can add a `<style>` tag inside the `<tab-group >` element:
```html
< tab-group new-tab-button = "true" sortable = "true" >
< style >
/* Write your own CSS rules here... */
< / style >
< / tab-group >
2016-11-02 12:19:56 -05:00
```
2024-12-07 19:49:40 -05:00
This method is particularly useful when you need to define tab styles:
2016-11-02 12:19:56 -05:00
```html
2022-05-25 10:20:17 -05:00
< tab-group new-tab-button = "true" sortable = "true" >
< style >
/* Add custom styles */
.my-custom-tab {
color: red;
font-weight: bold;
}
< / style >
< / tab-group >
< script src = "path/to/electron-tabs.js" > < / script >
< script >
const tabGroup = document.querySelector("tab-group");
tabGroup.addTab({
title: "Tab with custom style",
src: "page.html",
ready: function(tab) {
tab.element.classList.add("my-custom-tab");
}
});
< / script >
2016-11-02 12:19:56 -05:00
```
2022-05-25 10:20:17 -05:00
## Development
2016-11-02 12:19:56 -05:00
2022-05-25 10:20:17 -05:00
`electron-tabs` uses TypeScript and Parcel under the hood.
### Requirements
Git and Node 12+.
### Build
```bash
# Clone this repo
2024-12-05 18:29:20 -05:00
git clone git@ark.sudovanilla.org:korbs/electron-tabs.git
2022-05-25 10:20:17 -05:00
cd electron-tabs
# Install dependencies
npm install
# Build
npm run build
# ...or watch
npm run watch
```
### Demo
```bash
npm run demo
2016-11-02 12:19:56 -05:00
```
2016-10-31 10:10:14 -05:00
## License
2024-12-05 18:29:20 -05:00
The MIT License (MIT NON-AI License) - Copyright (c) 2022 Thomas Brouard, Copyright (c) 2025 SudoVanilla