diff --git a/src/content/docs/features/window-customization.mdx b/src/content/docs/features/window-customization.mdx
index c8454f1786..2775a9098b 100644
--- a/src/content/docs/features/window-customization.mdx
+++ b/src/content/docs/features/window-customization.mdx
@@ -1,14 +1,220 @@
---
title: Window Customization
+tableOfContents:
+ maxHeadingLevel: 4
---
-import Stub from '@components/Stub.astro';
+import { Icon } from '@astrojs/starlight/components';
-
+Tauri provides lots of options for customizing the look and feel of your app's window. You can create custom titlebars, have transparent windows, enforce size constraints, and more.
- - Based on https://tauri.app/v1/guides/features/window-customization
- - Take
- into account feedback in
- https://github.com/tauri-apps/tauri-docs/issues/1344#issuecomment-1701912344
+## Configuration
-
+There are three ways to change the window configuration:
+
+- [Through tauri.conf.json](/references/v2/config/#windowconfig)
+- [Through the JavaScript API](/references/v2/js/core/namespacewindow/#window)
+- [Through the Window in Rust](https://docs.rs/tauri/2.0.0-beta/tauri/window/struct.Window.html)
+
+## Usage
+
+- [Creating a Custom Titlebar](#creating-a-custom-titlebar)
+- [(macOS) Transparent Titlebar with Custom Window Background Color](#macos-transparent-titlebar-with-custom-window-background-color)
+
+### Creating a Custom Titlebar
+
+A common use of these window features is creating a custom titlebar. This short tutorial will guide you through that process.
+
+:::note
+For macOS, using a custom titlebar will also lose some features provided by the system, such as [moving or aligning the window](https://support.apple.com/guide/mac-help/work-with-app-windows-mchlp2469/mac). Another approach to customizing the titlebar but keeping native functions could be making the titlebar transparent and setting the window background color. See the usage [(macOS) Transparent Titlebar with Custom Window Background Color](#macos-transparent-titlebar-with-custom-window-background-color).
+:::
+
+#### tauri.conf.json
+
+Set `decorations` to `false` in your `tauri.conf.json`:
+
+```json title="tauri.conf.json" {4}
+"tauri": {
+ "windows": [
+ {
+ "decorations": false
+ }
+ ]
+}
+```
+
+#### Permissions
+
+Add window permissions in capability file.
+
+By default, all plugin commands are blocked and cannot be accessed. You must define a list of permissions in your `capabilities` configuration.
+
+See [Access Control List](/references/v2/acl) for more information.
+
+```json title="src-tauri/capabilities/main.json" ins={7-8}
+{
+ "$schema": "../gen/schemas/desktop-schema.json",
+ "identifier": "main-capability",
+ "description": "Capability for the main window",
+ "windows": ["main"],
+ "permissions": [
+ "window:default",
+ "window:allow-start-dragging",
+ ]
+}
+```
+
+| Permission | Description |
+|-----------------------------------------|--------------------------------------------------------------------------------|
+| `window:default` | Default permissions for the plugin. Except `window:allow-start-dragging`. |
+| `window:allow-close` | Enables the close command without any pre-configured scope. |
+| `window:allow-minimize` | Enables the minimize command without any pre-configured scope. |
+| `window:allow-start-dragging` | Enables the start_dragging command without any pre-configured scope. |
+| `window:allow-toggle-maximize` | Enables the toggle_maximize command without any pre-configured scope. |
+| `window:allow-internal-toggle-maximize` | Enables the internal_toggle_maximize command without any pre-configured scope. |
+
+#### CSS
+
+Add this CSS sample to keep it at the top of the screen and style the buttons:
+
+```css
+.titlebar {
+ height: 30px;
+ background: #329ea3;
+ user-select: none;
+ display: flex;
+ justify-content: flex-end;
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+}
+.titlebar-button {
+ display: inline-flex;
+ justify-content: center;
+ align-items: center;
+ width: 30px;
+ height: 30px;
+ user-select: none;
+ -webkit-user-select: none;
+}
+.titlebar-button:hover {
+ background: #5bbec3;
+}
+```
+
+#### HTML
+
+Put this at the top of your `
` tag:
+
+```html
+
+```
+
+Note that you may need to move the rest of your content down so that the titlebar doesn't cover it.
+
+#### JavaScript
+
+Use this code snippet to make the buttons work:
+
+```js
+import { Window } from '@tauri-apps/api/window';
+
+const appWindow = new Window('main');
+
+document
+ .getElementById('titlebar-minimize')
+ ?.addEventListener('click', () => appWindow.minimize());
+document
+ .getElementById('titlebar-maximize')
+ ?.addEventListener('click', () => appWindow.toggleMaximize());
+document
+ .getElementById('titlebar-close')
+ ?.addEventListener('click', () => appWindow.close());
+```
+
+### (macOS) Transparent Titlebar with Custom Window Background Color
+
+We are going to create the main window and change its background color from the Rust side.
+
+Remove the main window from the `tauri.conf.json` file:
+
+ ```json title="tauri.conf.json" del={3-7}
+ "tauri": {
+ "windows": [
+ {
+ "title": "Transparent Titlebar Window",
+ "width": 800,
+ "height": 600
+ }
+ ],
+ }
+ ```
+
+Add `cocoa` crate to dependencies so that we can use it to call the macOS native API:
+
+ ```toml title="src-tauri/Cargo.toml"
+ [target."cfg(target_os = \"macos\")".dependencies]
+ cocoa = "0.25"
+ ```
+
+Create the main window and change its background color:
+
+ ```rust title="src-tauri/src/lib.rs"
+ use tauri::{TitleBarStyle, WebviewUrl, WebviewWindowBuilder};
+
+ fn run() {
+ tauri::Builder::default()
+ .setup(|app| {
+ let win_builder =
+ WebviewWindowBuilder::new(app, "main", WebviewUrl::default())
+ .title("Transparent Titlebar Window")
+ .inner_size(800.0, 600.0);
+
+ // set transparent title bar only when building for macOS
+ #[cfg(target_os = "macos")]
+ let win_builder = win_builder.title_bar_style(TitleBarStyle::Transparent);
+
+ let window = win_builder.build().unwrap();
+
+ // set background color only when building for macOS
+ #[cfg(target_os = "macos")]
+ {
+ use cocoa::appkit::{NSColor, NSWindow};
+ use cocoa::base::{id, nil};
+
+ let ns_window = window.ns_window().unwrap() as id;
+ unsafe {
+ let bg_color = NSColor::colorWithRed_green_blue_alpha_(
+ nil,
+ 50.0 / 255.0,
+ 158.0 / 255.0,
+ 163.5 / 255.0,
+ 1.0,
+ );
+ ns_window.setBackgroundColor_(bg_color);
+ }
+ }
+
+ Ok(())
+ })
+ .run(tauri::generate_context!())
+ .expect("error while running tauri application");
+ }
+ ```
diff --git a/src/styles/custom.css b/src/styles/custom.css
index ada76f4808..bc69499ee9 100644
--- a/src/styles/custom.css
+++ b/src/styles/custom.css
@@ -123,6 +123,10 @@
opacity: 0.4;
}
+.sl-markdown-content .inline-icon {
+ display: inline-block;
+}
+
html[data-theme='light'] .hero > img {
filter: invert(1);
}