[v3] Add starlight website (#3917)
* init docs * add few categories * add more * update home * add blog * update favicon * fix few links and * untouch * untouch more * add some icons * add icons * move ggetting started at the top and collapse the rest * actually collapse * format * remove includes * more format * remove includes * move assets * add i18n * fix i18n * formatting * order * Prevent sidebar from making the page shake during load * Prevent sidebar from making the page shake during load * organize docs * fix link * expand a bit * add credits page * update all contributors file * remove underlines * add alternative * use html * lets get the first success build * add latest entry * remove example file * fix examples * more fixes * fix grammar * grammar * remove dupes * fix link * grammar * typo * typo * typo * Logo update. Minor changes. * update changelog * update changelog * rabbit is right --------- Co-authored-by: Lea Anthony <lea.anthony@gmail.com>
@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"files": [
|
"files": [
|
||||||
"website/src/pages/credits.mdx"
|
"website/src/pages/credits.mdx",
|
||||||
|
"docs/src/assets/contributors.html"
|
||||||
],
|
],
|
||||||
"imageSize": 75,
|
"imageSize": 75,
|
||||||
"commit": false,
|
"commit": false,
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
overrides:
|
overrides:
|
||||||
- files:
|
- files:
|
||||||
- "**/*.md"
|
- "**/*.md"
|
||||||
|
- "**/*.mdx"
|
||||||
options:
|
options:
|
||||||
printWidth: 80
|
printWidth: 80
|
||||||
proseWrap: always
|
proseWrap: always
|
||||||
|
21
docs/.gitignore
vendored
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
# build output
|
||||||
|
dist/
|
||||||
|
# generated types
|
||||||
|
.astro/
|
||||||
|
|
||||||
|
# dependencies
|
||||||
|
node_modules/
|
||||||
|
|
||||||
|
# logs
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
pnpm-debug.log*
|
||||||
|
|
||||||
|
|
||||||
|
# environment variables
|
||||||
|
.env
|
||||||
|
.env.production
|
||||||
|
|
||||||
|
# macOS-specific files
|
||||||
|
.DS_Store
|
4
docs/.vscode/extensions.json
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"recommendations": ["astro-build.astro-vscode"],
|
||||||
|
"unwantedRecommendations": []
|
||||||
|
}
|
11
docs/.vscode/launch.json
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"command": "./node_modules/.bin/astro dev",
|
||||||
|
"name": "Development server",
|
||||||
|
"request": "launch",
|
||||||
|
"type": "node-terminal"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
60
docs/README.md
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
# Starlight Starter Kit: Basics
|
||||||
|
|
||||||
|
[](https://starlight.astro.build)
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm create astro@latest -- --template starlight
|
||||||
|
```
|
||||||
|
|
||||||
|
[](https://stackblitz.com/github/withastro/starlight/tree/main/examples/basics)
|
||||||
|
[](https://codesandbox.io/p/sandbox/github/withastro/starlight/tree/main/examples/basics)
|
||||||
|
[](https://app.netlify.com/start/deploy?repository=https://github.com/withastro/starlight&create_from_path=examples/basics)
|
||||||
|
[](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fwithastro%2Fstarlight%2Ftree%2Fmain%2Fexamples%2Fbasics&project-name=my-starlight-docs&repository-name=my-starlight-docs)
|
||||||
|
|
||||||
|
> 🧑🚀 **Seasoned astronaut?** Delete this file. Have fun!
|
||||||
|
|
||||||
|
## 🚀 Project Structure
|
||||||
|
|
||||||
|
Inside of your Astro + Starlight project, you'll see the following folders and
|
||||||
|
files:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
.
|
||||||
|
├── public/
|
||||||
|
├── src/
|
||||||
|
│ ├── assets/
|
||||||
|
│ ├── content/
|
||||||
|
│ │ ├── docs/
|
||||||
|
│ │ └── config.ts
|
||||||
|
│ └── env.d.ts
|
||||||
|
├── astro.config.mjs
|
||||||
|
├── package.json
|
||||||
|
└── tsconfig.json
|
||||||
|
```
|
||||||
|
|
||||||
|
Starlight looks for `.md` or `.mdx` files in the `src/content/docs/` directory.
|
||||||
|
Each file is exposed as a route based on its file name.
|
||||||
|
|
||||||
|
Images can be added to `src/assets/` and embedded in Markdown with a relative
|
||||||
|
link.
|
||||||
|
|
||||||
|
Static assets, like favicons, can be placed in the `public/` directory.
|
||||||
|
|
||||||
|
## 🧞 Commands
|
||||||
|
|
||||||
|
All commands are run from the root of the project, from a terminal:
|
||||||
|
|
||||||
|
| Command | Action |
|
||||||
|
| :------------------------ | :----------------------------------------------- |
|
||||||
|
| `npm install` | Installs dependencies |
|
||||||
|
| `npm run dev` | Starts local dev server at `localhost:4321` |
|
||||||
|
| `npm run build` | Build your production site to `./dist/` |
|
||||||
|
| `npm run preview` | Preview your build locally, before deploying |
|
||||||
|
| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` |
|
||||||
|
| `npm run astro -- --help` | Get help using the Astro CLI |
|
||||||
|
|
||||||
|
## 👀 Want to learn more?
|
||||||
|
|
||||||
|
Check out [Starlight’s docs](https://starlight.astro.build/), read
|
||||||
|
[the Astro documentation](https://docs.astro.build), or jump into the
|
||||||
|
[Astro Discord server](https://astro.build/chat).
|
123
docs/astro.config.mjs
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
// @ts-check
|
||||||
|
import { defineConfig } from "astro/config";
|
||||||
|
import starlight from "@astrojs/starlight";
|
||||||
|
import sitemap from "@astrojs/sitemap";
|
||||||
|
import starlightLinksValidator from "starlight-links-validator";
|
||||||
|
import starlightImageZoom from "starlight-image-zoom";
|
||||||
|
import starlightBlog from "starlight-blog";
|
||||||
|
import { authors } from "./src/content/authors";
|
||||||
|
|
||||||
|
// https://astro.build/config
|
||||||
|
export default defineConfig({
|
||||||
|
// TODO: update this
|
||||||
|
site: "https://wails.io",
|
||||||
|
trailingSlash: "ignore",
|
||||||
|
compressHTML: true,
|
||||||
|
output: "static",
|
||||||
|
build: { format: "directory" },
|
||||||
|
devToolbar: { enabled: true },
|
||||||
|
integrations: [
|
||||||
|
sitemap(),
|
||||||
|
starlight({
|
||||||
|
title: "",
|
||||||
|
logo: {
|
||||||
|
dark: "./src/assets/wails-logo-horizontal-dark.svg",
|
||||||
|
light: "./src/assets/wails-logo-horizontal-light.svg",
|
||||||
|
},
|
||||||
|
favicon: "./public/favicon.svg",
|
||||||
|
description: "Build desktop applications using Go & Web Technologies.",
|
||||||
|
pagefind: true,
|
||||||
|
customCss: ["./src/stylesheets/extra.css"],
|
||||||
|
lastUpdated: true, // Note, this needs git clone with fetch depth 0 to work
|
||||||
|
pagination: true,
|
||||||
|
editLink: {
|
||||||
|
// TODO: update this
|
||||||
|
baseUrl: "https://github.com/wailsapp/wails/edit/v3-alpha/docs",
|
||||||
|
},
|
||||||
|
social: {
|
||||||
|
github: "https://github.com/wailsapp/wails",
|
||||||
|
discord: "https://discord.gg/JDdSxwjhGf",
|
||||||
|
"x.com": "https://x.com/wailsapp",
|
||||||
|
},
|
||||||
|
defaultLocale: "root",
|
||||||
|
locales: {
|
||||||
|
root: { label: "English", lang: "en", dir: "ltr" },
|
||||||
|
// Example of how a new language is added.
|
||||||
|
// After this, you create a directory named after the language inside content/docs/
|
||||||
|
// with the same structure as the root language
|
||||||
|
// eg content/docs/gr/changelog.md or content/docs/gr/api/application.mdx
|
||||||
|
// gr: { label: "Greek", lang: "el", dir: "ltr" },
|
||||||
|
},
|
||||||
|
plugins: [
|
||||||
|
// https://starlight-links-validator.vercel.app/configuration/
|
||||||
|
starlightLinksValidator({
|
||||||
|
exclude: [
|
||||||
|
// TODO: Fix these links in the blog/wails-v2-released file
|
||||||
|
// "/docs/reference/options#theme",
|
||||||
|
// "/docs/reference/options#customtheme",
|
||||||
|
// "/docs/guides/application-development#application-menu",
|
||||||
|
// "/docs/reference/runtime/dialog",
|
||||||
|
// "/docs/reference/options#windowistranslucent",
|
||||||
|
// "/docs/reference/options#windowistranslucent-1",
|
||||||
|
// "/docs/guides/windows-installer",
|
||||||
|
// "/docs/reference/runtime/intro",
|
||||||
|
// "/docs/guides/obfuscated",
|
||||||
|
// "/docs/howdoesitwork#calling-bound-go-methods",
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
// https://starlight-image-zoom.vercel.app/configuration/
|
||||||
|
starlightImageZoom(),
|
||||||
|
// https://starlight-blog-docs.vercel.app/configuration
|
||||||
|
starlightBlog({
|
||||||
|
title: "Wails Blog",
|
||||||
|
authors: authors,
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
sidebar: [
|
||||||
|
{ label: "Home", link: "/" },
|
||||||
|
{
|
||||||
|
label: "Getting Started",
|
||||||
|
autogenerate: { directory: "getting-started", collapsed: false },
|
||||||
|
},
|
||||||
|
{ label: "Feedback", link: "/getting-started/feedback" },
|
||||||
|
{
|
||||||
|
label: "Learn",
|
||||||
|
collapsed: true,
|
||||||
|
autogenerate: { directory: "learn", collapsed: true },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Guides",
|
||||||
|
collapsed: true,
|
||||||
|
autogenerate: { directory: "guides", collapsed: true },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "What's New",
|
||||||
|
link: "/whats-new",
|
||||||
|
badge: { text: "New", variant: "tip" },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "API",
|
||||||
|
collapsed: true,
|
||||||
|
autogenerate: { directory: "api", collapsed: true },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Development",
|
||||||
|
collapsed: true,
|
||||||
|
autogenerate: { directory: "development", collapsed: true },
|
||||||
|
},
|
||||||
|
{ label: "Status", link: "/status" },
|
||||||
|
{ label: "Changelog", link: "/changelog" },
|
||||||
|
{
|
||||||
|
label: "Sponsor",
|
||||||
|
link: "https://github.com/sponsors/leaanthony",
|
||||||
|
badge: { text: "❤️" },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Credits",
|
||||||
|
link: "/credits",
|
||||||
|
badge: { text: "👑" },
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
});
|
8383
docs/package-lock.json
generated
Normal file
22
docs/package.json
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"name": "wails-docs",
|
||||||
|
"type": "module",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "astro dev",
|
||||||
|
"start": "astro dev",
|
||||||
|
"build": "astro check && astro build",
|
||||||
|
"preview": "astro preview",
|
||||||
|
"astro": "astro"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@astrojs/check": "^0.9.4",
|
||||||
|
"@astrojs/starlight": "^0.29.2",
|
||||||
|
"astro": "^4.16.10",
|
||||||
|
"sharp": "^0.32.5",
|
||||||
|
"starlight-blog": "0.15.0",
|
||||||
|
"starlight-image-zoom": "0.9.0",
|
||||||
|
"starlight-links-validator": "0.13.2",
|
||||||
|
"typescript": "^5.7.2"
|
||||||
|
}
|
||||||
|
}
|
1
docs/public/favicon.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" version="1.1" viewBox="0 0 550 310" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"><g><path d="M0.883,-0.081L0.121,0.081L0.256,-0.063L0.883,-0.081Z" transform="matrix(-166.599,4.57132,4.57132,166.599,147.403,167.648)" style="fill:url(#_Linear1);fill-rule:nonzero"/></g><g><path d="M0.878,-0.285L-0.073,0.71L-1.186,0.542L0.015,0.207L-0.846,0.077L0.355,-0.258L-0.505,-0.388L0.649,-0.71L0.878,-0.285Z" transform="matrix(-106.443,-16.0669,-16.0669,106.443,428.19,188.033)" style="fill:url(#_Linear2);fill-rule:nonzero"/></g><g><path d="M0.44,-0.04L0.265,-0.056L0.177,0.437L-0.311,-0.255L0.262,-0.437L0.568,-0.437L0.44,-0.04Z" transform="matrix(-114.484,-162.408,-162.408,114.484,333.291,285.804)" style="fill:url(#_Linear3);fill-rule:nonzero"/></g><g><path d="M0.622,-0.115L0.761,-0.115L0.806,-0.013L0.826,0.182L0.622,-0.115Z" transform="matrix(238.126,298.893,298.893,-238.126,113.516,-150.536)" style="fill:url(#_Linear4);fill-rule:nonzero"/></g><g><path d="M0.467,0.005L0.49,0.062L0.271,-0.062L0.467,0.005Z" transform="matrix(-369.529,-97.4118,-97.4118,369.529,582.38,94.027)" style="fill:url(#_Linear5);fill-rule:nonzero"/></g><g><path d="M0.2,0.001L0.219,-0.018L0.614,0.012L0.519,0.089L0.282,0.068L0.2,0.135L0.463,0.194L0.374,0.266L0.138,0.186L0.047,0.033L-0.131,-0.266L0.2,0.001Z" transform="matrix(-496.156,-53.9751,-53.9751,496.156,367.888,125.085)" style="fill:url(#_Linear6);fill-rule:nonzero"/></g><g><path d="M269.095,104.527L287.764,111.419L263.632,106.75L269.095,104.527Z" transform="matrix(0.436503,-1.22916,4.88651,1.73532,-368.043,253.619)" style="fill:#fff"/></g><defs><linearGradient id="_Linear1" x1="0" x2="1" y1="0" y2="0" gradientTransform="matrix(1,-3.46945e-18,3.46945e-18,1,0,-3.05761e-06)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#e33232;stop-opacity:1"/><stop offset="1" style="stop-color:#6b000d;stop-opacity:1"/></linearGradient><linearGradient id="_Linear2" x1="0" x2="1" y1="0" y2="0" gradientTransform="matrix(1,0,0,1,0,-2.75467e-06)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#e33232;stop-opacity:1"/><stop offset="1" style="stop-color:#6b000d;stop-opacity:1"/></linearGradient><linearGradient id="_Linear3" x1="0" x2="1" y1="0" y2="0" gradientTransform="matrix(1,-1.11022e-16,1.11022e-16,1,0,-2.61861e-06)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#e33232;stop-opacity:1"/><stop offset="1" style="stop-color:#6b000d;stop-opacity:1"/></linearGradient><linearGradient id="_Linear4" x1="0" x2="1" y1="0" y2="0" gradientTransform="matrix(-0.801899,-0.59746,0.59746,-0.801899,1.3495,0.447457)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#e33232;stop-opacity:1"/><stop offset="1" style="stop-color:#6b000d;stop-opacity:1"/></linearGradient><linearGradient id="_Linear5" x1="0" x2="1" y1="0" y2="0" gradientTransform="matrix(1,-2.77556e-17,2.77556e-17,1,0,-1.92826e-06)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#e33232;stop-opacity:1"/><stop offset="1" style="stop-color:#6b000d;stop-opacity:1"/></linearGradient><linearGradient id="_Linear6" x1="0" x2="1" y1="0" y2="0" gradientTransform="matrix(1,0,0,1,0,9.68429e-07)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#e33232;stop-opacity:1"/><stop offset="1" style="stop-color:#6b000d;stop-opacity:1"/></linearGradient></defs></svg>
|
After Width: | Height: | Size: 3.4 KiB |
BIN
docs/public/sponsors/jetbrains-grayscale.webp
Normal file
After Width: | Height: | Size: 5.6 KiB |
197
docs/public/sponsors/sponsors.svg
Normal file
After Width: | Height: | Size: 235 KiB |
BIN
docs/src/assets/blog-images/browser.webp
Normal file
After Width: | Height: | Size: 76 KiB |
BIN
docs/src/assets/blog-images/build-cross-windows.webp
Normal file
After Width: | Height: | Size: 37 KiB |
BIN
docs/src/assets/blog-images/build-darwin-amd.webp
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
docs/src/assets/blog-images/build-darwin-arm.webp
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
docs/src/assets/blog-images/build-darwin-universal.webp
Normal file
After Width: | Height: | Size: 37 KiB |
BIN
docs/src/assets/blog-images/devtools.png
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
docs/src/assets/blog-images/linux-build-cross-windows.webp
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
docs/src/assets/blog-images/montage.png
Normal file
After Width: | Height: | Size: 177 KiB |
BIN
docs/src/assets/blog-images/multiwindow.webp
Normal file
After Width: | Height: | Size: 269 KiB |
BIN
docs/src/assets/blog-images/remote-linux.webp
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
docs/src/assets/blog-images/remote-mac.webp
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
docs/src/assets/blog-images/remote.webp
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
docs/src/assets/blog-images/vscode.webp
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
docs/src/assets/blog-images/wails-linux.webp
Normal file
After Width: | Height: | Size: 8.2 KiB |
BIN
docs/src/assets/blog-images/wails-mac.webp
Normal file
After Width: | Height: | Size: 43 KiB |
BIN
docs/src/assets/blog-images/wails-menus-linux.webp
Normal file
After Width: | Height: | Size: 8.9 KiB |
BIN
docs/src/assets/blog-images/wails-menus-mac.webp
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
docs/src/assets/blog-images/wails-menus.webp
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
docs/src/assets/blog-images/wails.webp
Normal file
After Width: | Height: | Size: 18 KiB |
246
docs/src/assets/contributors.html
Normal file
@ -0,0 +1,246 @@
|
|||||||
|
<div class="container">
|
||||||
|
|
||||||
|
<!--GAMFC_DELIMITER-->
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/leaanthony"><img src="https://avatars.githubusercontent.com/u/1943904?v=4?s=75" width="75px;" alt="Lea Anthony"/><br /><sub><b>Lea Anthony</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=leaanthony" title="Code">💻</a> <a href="#ideas-leaanthony" title="Ideas, Planning, & Feedback">🤔</a> <a href="#design-leaanthony" title="Design">🎨</a> <a href="#content-leaanthony" title="Content">🖋</a> <a href="#example-leaanthony" title="Examples">💡</a> <a href="#mentoring-leaanthony" title="Mentoring">🧑🏫</a> <a href="#projectManagement-leaanthony" title="Project Management">📆</a> <a href="#tool-leaanthony" title="Tools">🔧</a> <a href="https://github.com/wailsapp/wails/yssues?q=author%3Aleaanthony" title="Bug reports">🐛</a> <a href="#blog-leaanthony" title="Blogposts">📝</a> <a href="#maintenance-leaanthony" title="Maintenance">🚧</a> <a href="#platform-leaanthony" title="Packaging/porting to new platform">📦</a> <a href="https://github.com/wailsapp/wails/pulls?q=is%3Apr+reviewed-by%3Aleaanthony" title="Reviewed Pull Requests">👀</a> <a href="#question-leaanthony" title="Answering Questions">💬</a> <a href="#research-leaanthony" title="Research">🔬</a> <a href="https://github.com/wailsapp/wails/commits?author=leaanthony" title="Tests">⚠️</a> <a href="#tutorial-leaanthony" title="Tutorials">✅</a> <a href="#talk-leaanthony" title="Talks">📢</a> <a href="https://github.com/wailsapp/wails/pulls?q=is%3Apr+reviewed-by%3Aleaanthony" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/wailsapp/wails/commits?author=leaanthony" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/stffabi"><img src="https://avatars.githubusercontent.com/u/9464631?v=4?s=75" width="75px;" alt="stffabi"/><br /><sub><b>stffabi</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=stffabi" title="Code">💻</a> <a href="#ideas-stffabi" title="Ideas, Planning, & Feedback">🤔</a> <a href="#design-stffabi" title="Design">🎨</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Astffabi" title="Bug reports">🐛</a> <a href="#maintenance-stffabi" title="Maintenance">🚧</a> <a href="#platform-stffabi" title="Packaging/porting to new platform">📦</a> <a href="https://github.com/wailsapp/wails/pulls?q=is%3Apr+reviewed-by%3Astffabi" title="Reviewed Pull Requests">👀</a> <a href="#question-stffabi" title="Answering Questions">💬</a> <a href="#research-stffabi" title="Research">🔬</a> <a href="https://github.com/wailsapp/wails/pulls?q=is%3Apr+reviewed-by%3Astffabi" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/wailsapp/wails/commits?author=stffabi" title="Documentation">📖</a> <a href="https://github.com/wailsapp/wails/commits?author=stffabi" title="Tests">⚠️</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/tmclane"><img src="https://avatars.githubusercontent.com/u/511975?v=4?s=75" width="75px;" alt="Travis McLane"/><br /><sub><b>Travis McLane</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=tmclane" title="Code">💻</a> <a href="#research-tmclane" title="Research">🔬</a> <a href="#platform-tmclane" title="Packaging/porting to new platform">📦</a> <a href="#ideas-tmclane" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Atmclane" title="Bug reports">🐛</a> <a href="https://github.com/wailsapp/wails/pulls?q=is%3Apr+reviewed-by%3Atmclane" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/wailsapp/wails/commits?author=tmclane" title="Tests">⚠️</a> <a href="#question-tmclane" title="Answering Questions">💬</a> <a href="https://github.com/wailsapp/wails/commits?author=tmclane" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://misitebao.com/"><img src="https://avatars.githubusercontent.com/u/28185258?v=4?s=75" width="75px;" alt="Misite Bao"/><br /><sub><b>Misite Bao</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=misitebao" title="Documentation">📖</a> <a href="#translation-misitebao" title="Translation">🌍</a> <a href="#research-misitebao" title="Research">🔬</a> <a href="#maintenance-misitebao" title="Maintenance">🚧</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/bh90210"><img src="https://avatars.githubusercontent.com/u/22690219?v=4?s=75" width="75px;" alt="Byron Chris"/><br /><sub><b>Byron Chris</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=bh90210" title="Code">💻</a> <a href="#research-bh90210" title="Research">🔬</a> <a href="#maintenance-bh90210" title="Maintenance">🚧</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Abh90210" title="Bug reports">🐛</a> <a href="https://github.com/wailsapp/wails/pulls?q=is%3Apr+reviewed-by%3Abh90210" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/wailsapp/wails/commits?author=bh90210" title="Tests">⚠️</a> <a href="#question-bh90210" title="Answering Questions">💬</a> <a href="#ideas-bh90210" title="Ideas, Planning, & Feedback">🤔</a> <a href="#design-bh90210" title="Design">🎨</a> <a href="#platform-bh90210" title="Packaging/porting to new platform">📦</a> <a href="#infra-bh90210" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/konez2k"><img src="https://avatars.githubusercontent.com/u/32417933?v=4?s=75" width="75px;" alt="konez2k"/><br /><sub><b>konez2k</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=konez2k" title="Code">💻</a> <a href="#platform-konez2k" title="Packaging/porting to new platform">📦</a> <a href="#ideas-konez2k" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/dedo1911"><img src="https://avatars.githubusercontent.com/u/1364496?v=4?s=75" width="75px;" alt="Dario Emerson"/><br /><sub><b>Dario Emerson</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=dedo1911" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Adedo1911" title="Bug reports">🐛</a> <a href="#ideas-dedo1911" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/wailsapp/wails/commits?author=dedo1911" title="Tests">⚠️</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://ianmjones.com/"><img src="https://avatars.githubusercontent.com/u/4710?v=4?s=75" width="75px;" alt="Ian M. Jones"/><br /><sub><b>Ian M. Jones</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=ianmjones" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Aianmjones" title="Bug reports">🐛</a> <a href="#ideas-ianmjones" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/wailsapp/wails/commits?author=ianmjones" title="Tests">⚠️</a> <a href="https://github.com/wailsapp/wails/pulls?q=is%3Apr+reviewed-by%3Aianmjones" title="Reviewed Pull Requests">👀</a> <a href="#platform-ianmjones" title="Packaging/porting to new platform">📦</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/marktohark"><img src="https://avatars.githubusercontent.com/u/19359934?v=4?s=75" width="75px;" alt="marktohark"/><br /><sub><b>marktohark</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=marktohark" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/rh12503"><img src="https://avatars.githubusercontent.com/u/48951973?v=4?s=75" width="75px;" alt="Ryan H"/><br /><sub><b>Ryan H</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=rh12503" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://codybentley.dev/"><img src="https://avatars.githubusercontent.com/u/6968902?v=4?s=75" width="75px;" alt="Cody Bentley"/><br /><sub><b>Cody Bentley</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=codydbentley" title="Code">💻</a> <a href="#platform-codydbentley" title="Packaging/porting to new platform">📦</a> <a href="#ideas-codydbentley" title="Ideas, Planning, & Feedback">🤔</a> <a href="#financial-codydbentley" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/napalu"><img src="https://avatars.githubusercontent.com/u/6690378?v=4?s=75" width="75px;" alt="Florent"/><br /><sub><b>Florent</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=napalu" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Anapalu" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/akhudek"><img src="https://avatars.githubusercontent.com/u/147633?v=4?s=75" width="75px;" alt="Alexander Hudek"/><br /><sub><b>Alexander Hudek</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=akhudek" title="Code">💻</a> <a href="#financial-akhudek" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://twitter.com/timkippdev"><img src="https://avatars.githubusercontent.com/u/37030721?v=4?s=75" width="75px;" alt="Tim Kipp"/><br /><sub><b>Tim Kipp</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=timkippdev" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/gelleson"><img src="https://avatars.githubusercontent.com/u/44272887?v=4?s=75" width="75px;" alt="Altynbek Kaliakbarov"/><br /><sub><b>Altynbek Kaliakbarov</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=gelleson" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Chronophylos"><img src="https://avatars.githubusercontent.com/u/14890588?v=4?s=75" width="75px;" alt="Nikolai Zimmermann"/><br /><sub><b>Nikolai Zimmermann</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Chronophylos" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/k-muchmore"><img src="https://avatars.githubusercontent.com/u/16393095?v=4?s=75" width="75px;" alt="k-muchmore"/><br /><sub><b>k-muchmore</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=k-muchmore" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://peakd.com/@snider"><img src="https://avatars.githubusercontent.com/u/631881?v=4?s=75" width="75px;" alt="Snider"/><br /><sub><b>Snider</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Snider" title="Code">💻</a> <a href="#ideas-Snider" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/wailsapp/wails/commits?author=Snider" title="Documentation">📖</a> <a href="#financial-Snider" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/albert-sun"><img src="https://avatars.githubusercontent.com/u/54585592?v=4?s=75" width="75px;" alt="Albert Sun"/><br /><sub><b>Albert Sun</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=albert-sun" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/commits?author=albert-sun" title="Tests">⚠️</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/adalessa"><img src="https://avatars.githubusercontent.com/u/7914601?v=4?s=75" width="75px;" alt="Ariel"/><br /><sub><b>Ariel</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=adalessa" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Aadalessa" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://triplebits.com/"><img src="https://avatars.githubusercontent.com/u/4365245?v=4?s=75" width="75px;" alt="Ilgıt Yıldırım"/><br /><sub><b>Ilgıt Yıldırım</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=ilgityildirim" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Ailgityildirim" title="Bug reports">🐛</a> <a href="#financial-ilgityildirim" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Vaelatern"><img src="https://avatars.githubusercontent.com/u/7906072?v=4?s=75" width="75px;" alt="Toyam Cox"/><br /><sub><b>Toyam Cox</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Vaelatern" title="Code">💻</a> <a href="#platform-Vaelatern" title="Packaging/porting to new platform">📦</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3AVaelatern" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/hi019"><img src="https://avatars.githubusercontent.com/u/65871571?v=4?s=75" width="75px;" alt="hi019"/><br /><sub><b>hi019</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=hi019" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Ahi019" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://artooro.com/"><img src="https://avatars.githubusercontent.com/u/393395?v=4?s=75" width="75px;" alt="Arthur Wiebe"/><br /><sub><b>Arthur Wiebe</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=artooro" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Aartooro" title="Bug reports">🐛</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://sectcs.com/"><img src="https://avatars.githubusercontent.com/u/16898783?v=4?s=75" width="75px;" alt="Balakrishna Prasad Ganne"/><br /><sub><b>Balakrishna Prasad Ganne</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=aayush420" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/BillBuilt"><img src="https://avatars.githubusercontent.com/u/28831382?v=4?s=75" width="75px;" alt="BillBuilt"/><br /><sub><b>BillBuilt</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=BillBuilt" title="Code">💻</a> <a href="#platform-BillBuilt" title="Packaging/porting to new platform">📦</a> <a href="#ideas-BillBuilt" title="Ideas, Planning, & Feedback">🤔</a> <a href="#question-BillBuilt" title="Answering Questions">💬</a> <a href="#financial-BillBuilt" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Juneezee"><img src="https://avatars.githubusercontent.com/u/20135478?v=4?s=75" width="75px;" alt="Eng Zer Jun"/><br /><sub><b>Eng Zer Jun</b></sub></a><br /><a href="#maintenance-Juneezee" title="Maintenance">🚧</a> <a href="https://github.com/wailsapp/wails/commits?author=Juneezee" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://lgiki.net/"><img src="https://avatars.githubusercontent.com/u/20807713?v=4?s=75" width="75px;" alt="LGiki"/><br /><sub><b>LGiki</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=LGiki" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/lontten"><img src="https://avatars.githubusercontent.com/u/30745595?v=4?s=75" width="75px;" alt="Lontten"/><br /><sub><b>Lontten</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=lontten" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/phoenix147"><img src="https://avatars.githubusercontent.com/u/809358?v=4?s=75" width="75px;" alt="Lukas Crepaz"/><br /><sub><b>Lukas Crepaz</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=phoenix147" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Aphoenix147" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://utf9k.net/"><img src="https://avatars.githubusercontent.com/u/14816406?v=4?s=75" width="75px;" alt="Marcus Crane"/><br /><sub><b>Marcus Crane</b></sub></a><br /><a href="https://github.com/wailsapp/wails/issues?q=author%3Amarcus-crane" title="Bug reports">🐛</a> <a href="https://github.com/wailsapp/wails/commits?author=marcus-crane" title="Documentation">📖</a> <a href="#financial-marcus-crane" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://qaisjp.com/"><img src="https://avatars.githubusercontent.com/u/923242?v=4?s=75" width="75px;" alt="Qais Patankar"/><br /><sub><b>Qais Patankar</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=qaisjp" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://wakefulcloud.dev/"><img src="https://avatars.githubusercontent.com/u/38930607?v=4?s=75" width="75px;" alt="Wakeful-Cloud"/><br /><sub><b>Wakeful-Cloud</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Wakeful-Cloud" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3AWakeful-Cloud" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Lyimmi"><img src="https://avatars.githubusercontent.com/u/8627125?v=4?s=75" width="75px;" alt="Zámbó, Levente"/><br /><sub><b>Zámbó, Levente</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Lyimmi" title="Code">💻</a> <a href="#platform-Lyimmi" title="Packaging/porting to new platform">📦</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3ALyimmi" title="Bug reports">🐛</a> <a href="https://github.com/wailsapp/wails/commits?author=Lyimmi" title="Tests">⚠️</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Ironpark"><img src="https://avatars.githubusercontent.com/u/4973597?v=4?s=75" width="75px;" alt="Ironpark"/><br /><sub><b>Ironpark</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Ironpark" title="Code">💻</a> <a href="#ideas-Ironpark" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/mondy"><img src="https://avatars.githubusercontent.com/u/3961824?v=4?s=75" width="75px;" alt="mondy"/><br /><sub><b>mondy</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=mondy" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/commits?author=mondy" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://ryben.dev/"><img src="https://avatars.githubusercontent.com/u/6241454?v=4?s=75" width="75px;" alt="Benjamin Ryan"/><br /><sub><b>Benjamin Ryan</b></sub></a><br /><a href="https://github.com/wailsapp/wails/issues?q=author%3Aredraskal" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/fallendusk"><img src="https://avatars.githubusercontent.com/u/565631?v=4?s=75" width="75px;" alt="fallendusk"/><br /><sub><b>fallendusk</b></sub></a><br /><a href="#platform-fallendusk" title="Packaging/porting to new platform">📦</a> <a href="https://github.com/wailsapp/wails/commits?author=fallendusk" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://twitter.com/matryer"><img src="https://avatars.githubusercontent.com/u/101659?v=4?s=75" width="75px;" alt="Mat Ryer"/><br /><sub><b>Mat Ryer</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=matryer" title="Code">💻</a> <a href="#ideas-matryer" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Amatryer" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/abtin"><img src="https://avatars.githubusercontent.com/u/441372?v=4?s=75" width="75px;" alt="Abtin"/><br /><sub><b>Abtin</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=abtin" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Aabtin" title="Bug reports">🐛</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/lanzafame"><img src="https://avatars.githubusercontent.com/u/5924712?v=4?s=75" width="75px;" alt="Adrian Lanzafame"/><br /><sub><b>Adrian Lanzafame</b></sub></a><br /><a href="#platform-lanzafame" title="Packaging/porting to new platform">📦</a> <a href="https://github.com/wailsapp/wails/commits?author=lanzafame" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/polikow"><img src="https://avatars.githubusercontent.com/u/58259700?v=4?s=75" width="75px;" alt="Aleksey Polyakov"/><br /><sub><b>Aleksey Polyakov</b></sub></a><br /><a href="https://github.com/wailsapp/wails/issues?q=author%3Apolikow" title="Bug reports">🐛</a> <a href="https://github.com/wailsapp/wails/commits?author=polikow" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/alexmat"><img src="https://avatars.githubusercontent.com/u/745421?v=4?s=75" width="75px;" alt="Alexander Matviychuk"/><br /><sub><b>Alexander Matviychuk</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=alexmat" title="Code">💻</a> <a href="#platform-alexmat" title="Packaging/porting to new platform">📦</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/AlienRecall"><img src="https://avatars.githubusercontent.com/u/68950287?v=4?s=75" width="75px;" alt="AlienRecall"/><br /><sub><b>AlienRecall</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=AlienRecall" title="Code">💻</a> <a href="#platform-AlienRecall" title="Packaging/porting to new platform">📦</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://blog.checkyo.tech/"><img src="https://avatars.githubusercontent.com/u/17457975?v=4?s=75" width="75px;" alt="Aman"/><br /><sub><b>Aman</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=achhabra2" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/amaury-tobias"><img src="https://avatars.githubusercontent.com/u/37311888?v=4?s=75" width="75px;" alt="Amaury Tobias Quiroz"/><br /><sub><b>Amaury Tobias Quiroz</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=amaury-tobias" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Aamaury-tobias" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://blog.nms.de/"><img src="https://avatars.githubusercontent.com/u/51517?v=4?s=75" width="75px;" alt="Andreas Wenk"/><br /><sub><b>Andreas Wenk</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=andywenk" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/stankovic98"><img src="https://avatars.githubusercontent.com/u/29852655?v=4?s=75" width="75px;" alt="Antonio Stanković"/><br /><sub><b>Antonio Stanković</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=stankovic98" title="Code">💻</a> <a href="#platform-stankovic98" title="Packaging/porting to new platform">📦</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/antimatter96"><img src="https://avatars.githubusercontent.com/u/12068176?v=4?s=75" width="75px;" alt="Arpit Jain"/><br /><sub><b>Arpit Jain</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=antimatter96" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/aschey"><img src="https://avatars.githubusercontent.com/u/5882266?v=4?s=75" width="75px;" alt="Austin Schey"/><br /><sub><b>Austin Schey</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=aschey" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Aaschey" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/benjamin-thomas"><img src="https://avatars.githubusercontent.com/u/1557738?v=4?s=75" width="75px;" alt="Benjamin Thomas"/><br /><sub><b>Benjamin Thomas</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=benjamin-thomas" title="Code">💻</a> <a href="#platform-benjamin-thomas" title="Packaging/porting to new platform">📦</a> <a href="#ideas-benjamin-thomas" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://www.bertramtruong.com/"><img src="https://avatars.githubusercontent.com/u/1100843?v=4?s=75" width="75px;" alt="Bertram Truong"/><br /><sub><b>Bertram Truong</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=bt" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Abt" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://techwizworld.net/"><img src="https://avatars.githubusercontent.com/u/175873?v=4?s=75" width="75px;" alt="Blake Bourque"/><br /><sub><b>Blake Bourque</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=TechplexEngineer" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://vk.com/raitonoberu"><img src="https://avatars.githubusercontent.com/u/64320078?v=4?s=75" width="75px;" alt="Denis"/><br /><sub><b>Denis</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=raitonoberu" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/diogox"><img src="https://avatars.githubusercontent.com/u/13244408?v=4?s=75" width="75px;" alt="diogox"/><br /><sub><b>diogox</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=diogox" title="Code">💻</a> <a href="#platform-diogox" title="Packaging/porting to new platform">📦</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/kyoto44"><img src="https://avatars.githubusercontent.com/u/17720761?v=4?s=75" width="75px;" alt="Dmitry Gomzyakov"/><br /><sub><b>Dmitry Gomzyakov</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=kyoto44" title="Code">💻</a> <a href="#platform-kyoto44" title="Packaging/porting to new platform">📦</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/edwardbrowncross"><img src="https://avatars.githubusercontent.com/u/35063432?v=4?s=75" width="75px;" alt="Edward Browncross"/><br /><sub><b>Edward Browncross</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=edwardbrowncross" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://pr0gramming.ca/"><img src="https://avatars.githubusercontent.com/u/14944216?v=4?s=75" width="75px;" alt="Elie Grenon"/><br /><sub><b>Elie Grenon</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=elie-g" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/fdidron"><img src="https://avatars.githubusercontent.com/u/1848786?v=4?s=75" width="75px;" alt="Florian Didron"/><br /><sub><b>Florian Didron</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=fdidron" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Afdidron" title="Bug reports">🐛</a> <a href="#ideas-fdidron" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/wailsapp/wails/commits?author=fdidron" title="Tests">⚠️</a> <a href="https://github.com/wailsapp/wails/pulls?q=is%3Apr+reviewed-by%3Afdidron" title="Reviewed Pull Requests">👀</a> <a href="#platform-fdidron" title="Packaging/porting to new platform">📦</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/GargantuaX"><img src="https://avatars.githubusercontent.com/u/14013111?v=4?s=75" width="75px;" alt="GargantuaX"/><br /><sub><b>GargantuaX</b></sub></a><br /><a href="#financial-GargantuaX" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://bednya.ga/"><img src="https://avatars.githubusercontent.com/u/12101721?v=4?s=75" width="75px;" alt="Igor Minin"/><br /><sub><b>Igor Minin</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Igogrek" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3AIgogrek" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://www.jae-sung.com/"><img src="https://avatars.githubusercontent.com/u/39658806?v=4?s=75" width="75px;" alt="Jae-Sung Lee"/><br /><sub><b>Jae-Sung Lee</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=jaesung9507" title="Code">💻</a> <a href="#ideas-jaesung9507" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Jarek-SRT"><img src="https://avatars.githubusercontent.com/u/3391365?v=4?s=75" width="75px;" alt="Jarek"/><br /><sub><b>Jarek</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Jarek-SRT" title="Code">💻</a> <a href="#platform-Jarek-SRT" title="Packaging/porting to new platform">📦</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Junkher"><img src="https://avatars.githubusercontent.com/u/85776620?v=4?s=75" width="75px;" alt="Junker"/><br /><sub><b>Junker</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Junkher" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/kraney"><img src="https://avatars.githubusercontent.com/u/5760081?v=4?s=75" width="75px;" alt="Kris Raney"/><br /><sub><b>Kris Raney</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=kraney" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Akraney" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/LukenSkyne"><img src="https://avatars.githubusercontent.com/u/29918069?v=4?s=75" width="75px;" alt="Luken"/><br /><sub><b>Luken</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=LukenSkyne" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://markstenglein.com/"><img src="https://avatars.githubusercontent.com/u/9255772?v=4?s=75" width="75px;" alt="Mark Stenglein"/><br /><sub><b>Mark Stenglein</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=ocelotsloth" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Aocelotsloth" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/buddyabaddon"><img src="https://avatars.githubusercontent.com/u/33861511?v=4?s=75" width="75px;" alt="buddyabaddon"/><br /><sub><b>buddyabaddon</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=buddyabaddon" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/MikeSchaap"><img src="https://avatars.githubusercontent.com/u/35368821?v=4?s=75" width="75px;" alt="MikeSchaap"/><br /><sub><b>MikeSchaap</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=MikeSchaap" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3AMikeSchaap" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Orijhins"><img src="https://avatars.githubusercontent.com/u/47521598?v=4?s=75" width="75px;" alt="NYSSEN Michaël"/><br /><sub><b>NYSSEN Michaël</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Orijhins" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3AOrijhins" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/NanoNik"><img src="https://avatars.githubusercontent.com/u/11991329?v=4?s=75" width="75px;" alt="Nan0"/><br /><sub><b>Nan0</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=NanoNik" title="Code">💻</a> <a href="#ideas-NanoNik" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/wailsapp/wails/commits?author=NanoNik" title="Tests">⚠️</a> <a href="https://github.com/wailsapp/wails/pulls?q=is%3Apr+reviewed-by%3ANanoNik" title="Reviewed Pull Requests">👀</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/marcio199226"><img src="https://avatars.githubusercontent.com/u/10244404?v=4?s=75" width="75px;" alt="oskar"/><br /><sub><b>oskar</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=marcio199226" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/pierrejoye"><img src="https://avatars.githubusercontent.com/u/282408?v=4?s=75" width="75px;" alt="Pierre Joye"/><br /><sub><b>Pierre Joye</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=pierrejoye" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Apierrejoye" title="Bug reports">🐛</a> <a href="#ideas-pierrejoye" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/wailsapp/wails/commits?author=pierrejoye" title="Tests">⚠️</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Rested"><img src="https://avatars.githubusercontent.com/u/2003608?v=4?s=75" width="75px;" alt="Reuben Thomas-Davis"/><br /><sub><b>Reuben Thomas-Davis</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Rested" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3ARested" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/mewmew"><img src="https://avatars.githubusercontent.com/u/1414531?v=4?s=75" width="75px;" alt="Robin"/><br /><sub><b>Robin</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=mewmew" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Amewmew" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://threema.id/YSB3TVF7"><img src="https://avatars.githubusercontent.com/u/70367451?v=4?s=75" width="75px;" alt="Sebastian Bauer"/><br /><sub><b>Sebastian Bauer</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=sebastian0x62" title="Code">💻</a> <a href="#ideas-sebastian0x62" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/wailsapp/wails/commits?author=sebastian0x62" title="Tests">⚠️</a> <a href="https://github.com/wailsapp/wails/pulls?q=is%3Apr+reviewed-by%3Asebastian0x62" title="Reviewed Pull Requests">👀</a> <a href="#question-sebastian0x62" title="Answering Questions">💬</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/sidwebworks"><img src="https://avatars.githubusercontent.com/u/58144379?v=4?s=75" width="75px;" alt="Sidharth Rathi"/><br /><sub><b>Sidharth Rathi</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=sidwebworks" title="Documentation">📖</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Asidwebworks" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/sithembiso"><img src="https://avatars.githubusercontent.com/u/6559905?v=4?s=75" width="75px;" alt="Sithembiso Khumalo"/><br /><sub><b>Sithembiso Khumalo</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=sithembiso" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Asithembiso" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/LanguageAgnostic"><img src="https://avatars.githubusercontent.com/u/19310562?v=4?s=75" width="75px;" alt="Soheib El-Harrache"/><br /><sub><b>Soheib El-Harrache</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=LanguageAgnostic" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3ALanguageAgnostic" title="Bug reports">🐛</a> <a href="#financial-LanguageAgnostic" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://www.sophieau.com/"><img src="https://avatars.githubusercontent.com/u/11145039?v=4?s=75" width="75px;" alt="Sophie Au"/><br /><sub><b>Sophie Au</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=SophieAu" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3ASophieAu" title="Bug reports">🐛</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/stefpap"><img src="https://avatars.githubusercontent.com/u/22637722?v=4?s=75" width="75px;" alt="Stefanos Papadakis"/><br /><sub><b>Stefanos Papadakis</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=stefpap" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Astefpap" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/s12chung"><img src="https://avatars.githubusercontent.com/u/263394?v=4?s=75" width="75px;" alt="Steve Chung"/><br /><sub><b>Steve Chung</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=s12chung" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3As12chung" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://tortloff.de/"><img src="https://avatars.githubusercontent.com/u/41272726?v=4?s=75" width="75px;" alt="Timm Ortloff"/><br /><sub><b>Timm Ortloff</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=TAINCER" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/tomanagle"><img src="https://avatars.githubusercontent.com/u/8683577?v=4?s=75" width="75px;" alt="Tom"/><br /><sub><b>Tom</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=tomanagle" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://www.linkedin.com/in/valentintrinque"><img src="https://avatars.githubusercontent.com/u/4662842?v=4?s=75" width="75px;" alt="Valentin Trinqué"/><br /><sub><b>Valentin Trinqué</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=ValentinTrinque" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3AValentinTrinque" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://mattn.kaoriya.net/"><img src="https://avatars.githubusercontent.com/u/10111?v=4?s=75" width="75px;" alt="mattn"/><br /><sub><b>mattn</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=mattn" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Amattn" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/bearsh"><img src="https://avatars.githubusercontent.com/u/1089356?v=4?s=75" width="75px;" alt="bearsh"/><br /><sub><b>bearsh</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=bearsh" title="Code">💻</a> <a href="#ideas-bearsh" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/wailsapp/wails/commits?author=bearsh" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/chenxiao1990"><img src="https://avatars.githubusercontent.com/u/16933565?v=4?s=75" width="75px;" alt="chenxiao"/><br /><sub><b>chenxiao</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=chenxiao1990" title="Code">💻</a> <a href="#ideas-chenxiao1990" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/wailsapp/wails/commits?author=chenxiao1990" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/fengweiqiang"><img src="https://avatars.githubusercontent.com/u/22905300?v=4?s=75" width="75px;" alt="fengweiqiang"/><br /><sub><b>fengweiqiang</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=fengweiqiang" title="Code">💻</a> <a href="#platform-fengweiqiang" title="Packaging/porting to new platform">📦</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/flin7"><img src="https://avatars.githubusercontent.com/u/58138185?v=4?s=75" width="75px;" alt="flin7"/><br /><sub><b>flin7</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=flin7" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/fred21O4"><img src="https://avatars.githubusercontent.com/u/67189813?v=4?s=75" width="75px;" alt="fred21O4"/><br /><sub><b>fred21O4</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=fred21O4" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/gardc"><img src="https://avatars.githubusercontent.com/u/41453409?v=4?s=75" width="75px;" alt="gardc"/><br /><sub><b>gardc</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=gardc" title="Documentation">📖</a> <a href="#tutorial-gardc" title="Tutorials">✅</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/rayshoo"><img src="https://avatars.githubusercontent.com/u/52561899?v=4?s=75" width="75px;" alt="rayshoo"/><br /><sub><b>rayshoo</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=rayshoo" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Yz4230"><img src="https://avatars.githubusercontent.com/u/38999742?v=4?s=75" width="75px;" alt="Ishiyama Yuzuki"/><br /><sub><b>Ishiyama Yuzuki</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Yz4230" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3AYz4230" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://baiyue.one/"><img src="https://avatars.githubusercontent.com/u/43716063?v=4?s=75" width="75px;" alt="佰阅"/><br /><sub><b>佰阅</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Baiyuetribe" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/daodao97"><img src="https://avatars.githubusercontent.com/u/15009280?v=4?s=75" width="75px;" alt="刀刀"/><br /><sub><b>刀刀</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=daodao97" title="Documentation">📖</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Adaodao97" title="Bug reports">🐛</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/jicg"><img src="https://avatars.githubusercontent.com/u/6479672?v=4?s=75" width="75px;" alt="归位"/><br /><sub><b>归位</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=jicg" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Ajicg" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/skamensky"><img src="https://avatars.githubusercontent.com/u/19151369?v=4?s=75" width="75px;" alt="skamensky"/><br /><sub><b>skamensky</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=skamensky" title="Code">💻</a> <a href="#ideas-skamensky" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/wailsapp/wails/commits?author=skamensky" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/apps/dependabot"><img src="https://avatars.githubusercontent.com/in/29110?v=4?s=75" width="75px;" alt="dependabot[bot]"/><br /><sub><b>dependabot[bot]</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=dependabot[bot]" title="Code">💻</a> <a href="#maintenance-dependabot[bot]" title="Maintenance">🚧</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://www.linkedin.com/in/dsieradzki/"><img src="https://avatars.githubusercontent.com/u/10297559?v=4?s=75" width="75px;" alt="Damian Sieradzki"/><br /><sub><b>Damian Sieradzki</b></sub></a><br /><a href="#financial-dsieradzki" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/boostchicken"><img src="https://avatars.githubusercontent.com/u/427295?v=4?s=75" width="75px;" alt="John Dorman"/><br /><sub><b>John Dorman</b></sub></a><br /><a href="#financial-boostchicken" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://blog.iansinnott.com/"><img src="https://avatars.githubusercontent.com/u/3154865?v=4?s=75" width="75px;" alt="Ian Sinnott"/><br /><sub><b>Ian Sinnott</b></sub></a><br /><a href="#financial-iansinnott" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Shackelford-Arden"><img src="https://avatars.githubusercontent.com/u/7362263?v=4?s=75" width="75px;" alt="Arden Shackelford"/><br /><sub><b>Arden Shackelford</b></sub></a><br /><a href="#financial-Shackelford-Arden" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Bironou"><img src="https://avatars.githubusercontent.com/u/107761511?v=4?s=75" width="75px;" alt="Bironou"/><br /><sub><b>Bironou</b></sub></a><br /><a href="#financial-Bironou" title="Financial">💵</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/CharlieGo19"><img src="https://avatars.githubusercontent.com/u/62405980?v=4?s=75" width="75px;" alt="CharlieGo_"/><br /><sub><b>CharlieGo_</b></sub></a><br /><a href="#financial-CharlieGo19" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/overnet"><img src="https://avatars.githubusercontent.com/u/6376126?v=4?s=75" width="75px;" alt="overnet"/><br /><sub><b>overnet</b></sub></a><br /><a href="#financial-overnet" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://jugglingjsons.dev/"><img src="https://avatars.githubusercontent.com/u/20739064?v=4?s=75" width="75px;" alt="jugglingjsons"/><br /><sub><b>jugglingjsons</b></sub></a><br /><a href="#financial-jugglingjsons" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://selvin.dev/"><img src="https://avatars.githubusercontent.com/u/1922523?v=4?s=75" width="75px;" alt="Selvin Ortiz"/><br /><sub><b>Selvin Ortiz</b></sub></a><br /><a href="#financial-selvindev" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/zandercodes"><img src="https://avatars.githubusercontent.com/u/46308805?v=4?s=75" width="75px;" alt="ZanderCodes"/><br /><sub><b>ZanderCodes</b></sub></a><br /><a href="#financial-zandercodes" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/DonTomato"><img src="https://avatars.githubusercontent.com/u/1098084?v=4?s=75" width="75px;" alt="Michael Voronov"/><br /><sub><b>Michael Voronov</b></sub></a><br /><a href="#financial-DonTomato" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://lt.hn/"><img src="https://avatars.githubusercontent.com/u/83868036?v=4?s=75" width="75px;" alt="letheanVPN"/><br /><sub><b>letheanVPN</b></sub></a><br /><a href="#financial-letheanVPN" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://taigrr.com/"><img src="https://avatars.githubusercontent.com/u/8261498?v=4?s=75" width="75px;" alt="Tai Groot"/><br /><sub><b>Tai Groot</b></sub></a><br /><a href="#financial-taigrr" title="Financial">💵</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/easy-web-it"><img src="https://avatars.githubusercontent.com/u/95484991?v=4?s=75" width="75px;" alt="easy-web-it"/><br /><sub><b>easy-web-it</b></sub></a><br /><a href="#financial-easy-web-it" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://michaelolson1996.github.io/portfolio"><img src="https://avatars.githubusercontent.com/u/45323107?v=4?s=75" width="75px;" alt="Michael Olson"/><br /><sub><b>Michael Olson</b></sub></a><br /><a href="#financial-michaelolson1996" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://eden.network/"><img src="https://avatars.githubusercontent.com/u/4912777?v=4?s=75" width="75px;" alt="EdenNetwork Italia"/><br /><sub><b>EdenNetwork Italia</b></sub></a><br /><a href="#financial-EdenNetworkItalia" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/ondoki"><img src="https://avatars.githubusercontent.com/u/88536792?v=4?s=75" width="75px;" alt="ondoki"/><br /><sub><b>ondoki</b></sub></a><br /><a href="#financial-ondoki" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/questrail"><img src="https://avatars.githubusercontent.com/u/3536569?v=4?s=75" width="75px;" alt="QuEST Rail LLC"/><br /><sub><b>QuEST Rail LLC</b></sub></a><br /><a href="#financial-questrail" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Gilgames000"><img src="https://avatars.githubusercontent.com/u/22778436?v=4?s=75" width="75px;" alt="Gilgameš"/><br /><sub><b>Gilgameš</b></sub></a><br /><a href="#financial-Gilgames000" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/bbergshaven"><img src="https://avatars.githubusercontent.com/u/4091634?v=4?s=75" width="75px;" alt="Bernt-Johan Bergshaven"/><br /><sub><b>Bernt-Johan Bergshaven</b></sub></a><br /><a href="#financial-bbergshaven" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/bglw"><img src="https://avatars.githubusercontent.com/u/40188355?v=4?s=75" width="75px;" alt="Liam Bigelow"/><br /><sub><b>Liam Bigelow</b></sub></a><br /><a href="#financial-bglw" title="Financial">💵</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/nickarellano"><img src="https://avatars.githubusercontent.com/u/13930605?v=4?s=75" width="75px;" alt="Nick Arellano"/><br /><sub><b>Nick Arellano</b></sub></a><br /><a href="#financial-nickarellano" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/fcjr"><img src="https://avatars.githubusercontent.com/u/2053002?v=4?s=75" width="75px;" alt="Frank Chiarulli Jr."/><br /><sub><b>Frank Chiarulli Jr.</b></sub></a><br /><a href="#financial-fcjr" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/tylertravisty"><img src="https://avatars.githubusercontent.com/u/8620352?v=4?s=75" width="75px;" alt="Tyler"/><br /><sub><b>Tyler</b></sub></a><br /><a href="#financial-tylertravisty" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/trea"><img src="https://avatars.githubusercontent.com/u/1181448?v=4?s=75" width="75px;" alt="Trea Hauet"/><br /><sub><b>Trea Hauet</b></sub></a><br /><a href="#financial-trea" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://picatz.github.io/"><img src="https://avatars.githubusercontent.com/u/14850816?v=4?s=75" width="75px;" alt="Kent 'picat' Gruber"/><br /><sub><b>Kent 'picat' Gruber</b></sub></a><br /><a href="#financial-picatz" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/tc-hib"><img src="https://avatars.githubusercontent.com/u/55949036?v=4?s=75" width="75px;" alt="tc-hib"/><br /><sub><b>tc-hib</b></sub></a><br /><a href="#financial-tc-hib" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/acheong08"><img src="https://avatars.githubusercontent.com/u/36258159?v=4?s=75" width="75px;" alt="Antonio"/><br /><sub><b>Antonio</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=acheong08" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/MyNameIsAres"><img src="https://avatars.githubusercontent.com/u/32432637?v=4?s=75" width="75px;" alt="MyNameIsAres"/><br /><sub><b>MyNameIsAres</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=MyNameIsAres" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://mai.car.ons"><img src="https://avatars.githubusercontent.com/u/101958587?v=4?s=75" width="75px;" alt="Maicarons J"/><br /><sub><b>Maicarons J</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Maicarons2022" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/KiddoV"><img src="https://avatars.githubusercontent.com/u/28552977?v=4?s=75" width="75px;" alt="kiddov"/><br /><sub><b>kiddov</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=KiddoV" title="Documentation">📖</a> <a href="#financial-KiddoV" title="Financial">💵</a> <a href="https://github.com/wailsapp/wails/commits?author=KiddoV" title="Tests">⚠️</a> <a href="#ideas-KiddoV" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://nicolas-coutin.com/"><img src="https://avatars.githubusercontent.com/u/6564012?v=4?s=75" width="75px;" alt="Nicolas Coutin"/><br /><sub><b>Nicolas Coutin</b></sub></a><br /><a href="#financial-Ilshidur" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/ParvinEyvazov"><img src="https://avatars.githubusercontent.com/u/32189770?v=4?s=75" width="75px;" alt="Parvin Eyvazov"/><br /><sub><b>Parvin Eyvazov</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=ParvinEyvazov" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/apps/github-actions"><img src="https://avatars.githubusercontent.com/in/15368?v=4?s=75" width="75px;" alt="github-actions[bot]"/><br /><sub><b>github-actions[bot]</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=github-actions[bot]" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/OlegGulevskyy"><img src="https://avatars.githubusercontent.com/u/43781031?v=4?s=75" width="75px;" alt="Oleg Gulevskyy"/><br /><sub><b>Oleg Gulevskyy</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=OlegGulevskyy" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/commits?author=OlegGulevskyy" title="Documentation">📖</a> <a href="#maintenance-OlegGulevskyy" title="Maintenance">🚧</a> <a href="#platform-OlegGulevskyy" title="Packaging/porting to new platform">📦</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://www.customct.com/"><img src="https://avatars.githubusercontent.com/u/2487495?v=4?s=75" width="75px;" alt="Richard Guay"/><br /><sub><b>Richard Guay</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=raguay" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/ATenderholt"><img src="https://avatars.githubusercontent.com/u/740623?v=4?s=75" width="75px;" alt="Adam Tenderholt"/><br /><sub><b>Adam Tenderholt</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=ATenderholt" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/JulioDRF"><img src="https://avatars.githubusercontent.com/u/15677708?v=4?s=75" width="75px;" alt="JulioDRF"/><br /><sub><b>JulioDRF</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=JulioDRF" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://scottopell.com/"><img src="https://avatars.githubusercontent.com/u/996472?v=4?s=75" width="75px;" alt="Scott Opell"/><br /><sub><b>Scott Opell</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=scottopell" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://aven.dev/"><img src="https://avatars.githubusercontent.com/u/2055581?v=4?s=75" width="75px;" alt="Vadim Shchepotev"/><br /><sub><b>Vadim Shchepotev</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=avengerweb" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://willdot.net/"><img src="https://avatars.githubusercontent.com/u/4906530?v=4?s=75" width="75px;" alt="Will Andrews"/><br /><sub><b>Will Andrews</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=willdot" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/gwynforthewyn"><img src="https://avatars.githubusercontent.com/u/434656?v=4?s=75" width="75px;" alt="Gwyn"/><br /><sub><b>Gwyn</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=gwynforthewyn" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/pulls?q=is%3Apr+reviewed-by%3Agwynforthewyn" title="Reviewed Pull Requests">👀</a> <a href="#question-gwynforthewyn" title="Answering Questions">💬</a> <a href="#research-gwynforthewyn" title="Research">🔬</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/xijaja"><img src="https://avatars.githubusercontent.com/u/47017666?v=4?s=75" width="75px;" alt="希嘉嘉"/><br /><sub><b>希嘉嘉</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=xijaja" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://www.almas.cc/"><img src="https://avatars.githubusercontent.com/u/9382335?v=4?s=75" width="75px;" alt="ALMAS"/><br /><sub><b>ALMAS</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=almas1992" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://stdout.com.cn/"><img src="https://avatars.githubusercontent.com/u/20666153?v=4?s=75" width="75px;" alt="Alex"/><br /><sub><b>Alex</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=o8x" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/arifali123"><img src="https://avatars.githubusercontent.com/u/51419655?v=4?s=75" width="75px;" alt="Arif Ali"/><br /><sub><b>Arif Ali</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=arifali123" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/hotafrika"><img src="https://avatars.githubusercontent.com/u/18332839?v=4?s=75" width="75px;" alt="Artur Siarohau"/><br /><sub><b>Artur Siarohau</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=hotafrika" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://binyam.in/"><img src="https://avatars.githubusercontent.com/u/39805353?v=4?s=75" width="75px;" alt="Binyamin Aron Green"/><br /><sub><b>Binyamin Aron Green</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=binyamin" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://bdwyertech.net/"><img src="https://avatars.githubusercontent.com/u/2973273?v=4?s=75" width="75px;" alt="Brian Dwyer"/><br /><sub><b>Brian Dwyer</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=bdwyertech" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://www.cilb.de/"><img src="https://avatars.githubusercontent.com/u/7283097?v=4?s=75" width="75px;" alt="Christian Kilb"/><br /><sub><b>Christian Kilb</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=ckilb" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/edwargix"><img src="https://avatars.githubusercontent.com/u/22877007?v=4?s=75" width="75px;" alt="David Florness"/><br /><sub><b>David Florness</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=edwargix" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/BuckeyeCoder"><img src="https://avatars.githubusercontent.com/u/95933880?v=4?s=75" width="75px;" alt="David Walton"/><br /><sub><b>David Walton</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=BuckeyeCoder" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Debdut"><img src="https://avatars.githubusercontent.com/u/7561070?v=4?s=75" width="75px;" alt="Debdut Karmakar"/><br /><sub><b>Debdut Karmakar</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Debdut" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/gotid"><img src="https://avatars.githubusercontent.com/u/4010854?v=4?s=75" width="75px;" alt="Dieter Zhu"/><br /><sub><b>Dieter Zhu</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=gotid" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://fredrikholmqvist.com/"><img src="https://avatars.githubusercontent.com/u/22743750?v=4?s=75" width="75px;" alt="Fredrik Holmqvist"/><br /><sub><b>Fredrik Holmqvist</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Holmqvist1990" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/giopalma"><img src="https://avatars.githubusercontent.com/u/33783684?v=4?s=75" width="75px;" alt="Giovanni Palma"/><br /><sub><b>Giovanni Palma</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=giopalma" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Nexus26404"><img src="https://avatars.githubusercontent.com/u/83110373?v=4?s=75" width="75px;" alt="Hao"/><br /><sub><b>Hao</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Nexus26404" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/i7tsov"><img src="https://avatars.githubusercontent.com/u/44977153?v=4?s=75" width="75px;" alt="Igor Sementsov"/><br /><sub><b>Igor Sementsov</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=i7tsov" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/derhasi"><img src="https://avatars.githubusercontent.com/u/118502?v=4?s=75" width="75px;" alt="Johannes Haseitl"/><br /><sub><b>Johannes Haseitl</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=derhasi" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/joshbuddy"><img src="https://avatars.githubusercontent.com/u/8898?v=4?s=75" width="75px;" alt="Joshua Hull"/><br /><sub><b>Joshua Hull</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=joshbuddy" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/joshm998"><img src="https://avatars.githubusercontent.com/u/1779737?v=4?s=75" width="75px;" alt="Joshua Mangiola"/><br /><sub><b>Joshua Mangiola</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=joshm998" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/prurigro"><img src="https://avatars.githubusercontent.com/u/1149238?v=4?s=75" width="75px;" alt="Kevin MacMartin"/><br /><sub><b>Kevin MacMartin</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=prurigro" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/liang-li-dev"><img src="https://avatars.githubusercontent.com/u/112530363?v=4?s=75" width="75px;" alt="Liang Li"/><br /><sub><b>Liang Li</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=liang-li-dev" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://appslab.co.ke/"><img src="https://avatars.githubusercontent.com/u/7722584?v=4?s=75" width="75px;" alt="Marvin Collins Hosea"/><br /><sub><b>Marvin Collins Hosea</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=marvinhosea" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://matt.life/"><img src="https://avatars.githubusercontent.com/u/1128849?v=4?s=75" width="75px;" alt="Matt Holt"/><br /><sub><b>Matt Holt</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=mholt" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Gurkengewuerz"><img src="https://avatars.githubusercontent.com/u/10966337?v=4?s=75" width="75px;" alt="Niklas"/><br /><sub><b>Niklas</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Gurkengewuerz" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Xhofe"><img src="https://avatars.githubusercontent.com/u/36558727?v=4?s=75" width="75px;" alt="Andy Hsu"/><br /><sub><b>Andy Hsu</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Xhofe" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/NullCode1337"><img src="https://avatars.githubusercontent.com/u/70959549?v=4?s=75" width="75px;" alt="NullCode"/><br /><sub><b>NullCode</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=NullCode1337" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/oSethoum"><img src="https://avatars.githubusercontent.com/u/88779394?v=4?s=75" width="75px;" alt="Oussama Sethoum"/><br /><sub><b>Oussama Sethoum</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=oSethoum" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/ParkourLiu"><img src="https://avatars.githubusercontent.com/u/33681340?v=4?s=75" width="75px;" alt="ParkourLiu"/><br /><sub><b>ParkourLiu</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=ParkourLiu" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/zllovesuki"><img src="https://avatars.githubusercontent.com/u/298453?v=4?s=75" width="75px;" alt="Rachel Chen"/><br /><sub><b>Rachel Chen</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=zllovesuki" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/rnice01"><img src="https://avatars.githubusercontent.com/u/11394384?v=4?s=75" width="75px;" alt="Rob Nice"/><br /><sub><b>Rob Nice</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=rnice01" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/RyoTagami"><img src="https://avatars.githubusercontent.com/u/9672589?v=4?s=75" width="75px;" alt="Ryo TAGAMI"/><br /><sub><b>Ryo TAGAMI</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=RyoTagami" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/SamHennessy"><img src="https://avatars.githubusercontent.com/u/119867?v=4?s=75" width="75px;" alt="Sam Hennessy"/><br /><sub><b>Sam Hennessy</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=SamHennessy" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://albinodrought.com/"><img src="https://avatars.githubusercontent.com/u/852873?v=4?s=75" width="75px;" alt="Sean"/><br /><sub><b>Sean</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=AlbinoDrought" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/sgosiaco"><img src="https://avatars.githubusercontent.com/u/212341?v=4?s=75" width="75px;" alt="Sean Gosiaco"/><br /><sub><b>Sean Gosiaco</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=sgosiaco" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://sheetjs.com/"><img src="https://avatars.githubusercontent.com/u/6070939?v=4?s=75" width="75px;" alt="Eric P Sheets"/><br /><sub><b>Eric P Sheets</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=SheetJSDev" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://www.octopy.dev/"><img src="https://avatars.githubusercontent.com/u/37969970?v=4?s=75" width="75px;" alt="Supian M"/><br /><sub><b>Supian M</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=SupianIDz" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Watson-Sei"><img src="https://avatars.githubusercontent.com/u/55475145?v=4?s=75" width="75px;" alt="Watson-Sei"/><br /><sub><b>Watson-Sei</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Watson-Sei" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/commits?author=Watson-Sei" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://shinshin86.com/"><img src="https://avatars.githubusercontent.com/u/8216064?v=4?s=75" width="75px;" alt="Yuki Shindo"/><br /><sub><b>Yuki Shindo</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=shinshin86" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/cuigege"><img src="https://avatars.githubusercontent.com/u/26080122?v=4?s=75" width="75px;" alt="cuigege"/><br /><sub><b>cuigege</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=cuigege" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://cybertramp.net/"><img src="https://avatars.githubusercontent.com/u/30935096?v=4?s=75" width="75px;" alt="cybertramp"/><br /><sub><b>cybertramp</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=cybertramp" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/h8gi"><img src="https://avatars.githubusercontent.com/u/10811057?v=4?s=75" width="75px;" alt="hiroki yagi"/><br /><sub><b>hiroki yagi</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=h8gi" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/apps/imgbot"><img src="https://avatars.githubusercontent.com/in/4706?v=4?s=75" width="75px;" alt="imgbot[bot]"/><br /><sub><b>imgbot[bot]</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=imgbot[bot]" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/tong3jie"><img src="https://avatars.githubusercontent.com/u/14191774?v=4?s=75" width="75px;" alt="juju"/><br /><sub><b>juju</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=tong3jie" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://meatherly.github.io/"><img src="https://avatars.githubusercontent.com/u/1327960?v=4?s=75" width="75px;" alt="Michael Eatherly"/><br /><sub><b>Michael Eatherly</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=meatherly" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/tk103331"><img src="https://avatars.githubusercontent.com/u/4404609?v=4?s=75" width="75px;" alt="tk"/><br /><sub><b>tk</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=tk103331" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/apps/allcontributors"><img src="https://avatars.githubusercontent.com/in/23186?v=4?s=75" width="75px;" alt="allcontributors[bot]"/><br /><sub><b>allcontributors[bot]</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=allcontributors[bot]" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://www.ffactory.org/"><img src="https://avatars.githubusercontent.com/u/77320953?v=4?s=75" width="75px;" alt="wander"/><br /><sub><b>wander</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=wandercn" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<!--GAMFC_DELIMITER-END-->
|
||||||
|
|
||||||
|
</div>
|
54
docs/src/assets/wails-logo-dark.svg
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<svg width="100%" height="100%" viewBox="0 0 551 436" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||||
|
<path d="M260.266,104.287L301.929,93.442L268.858,115.754L260.266,104.287Z" style="fill:rgb(235,235,235);"/>
|
||||||
|
<g transform="matrix(1,0,0,1,116.615,393.181)">
|
||||||
|
<path d="M0,-51.891L14.429,-51.891L13.043,-21.183L22.568,-51.891L34.226,-51.891L34.084,-21.183L42.365,-51.891L56.794,-51.891L38.526,0L25.198,0L25.34,-32.45L15.211,0L1.919,0L0,-51.891Z" style="fill:white;fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(1,0,0,1,226.834,359.416)">
|
||||||
|
<path d="M0,15.639L5.793,15.639L5.971,-3.589L0,15.639ZM-20.187,33.765L-0.675,-18.126L16.42,-18.126L20.08,33.765L5.437,33.765L5.509,26.123L-3.057,26.123L-5.332,33.765L-20.187,33.765Z" style="fill:white;fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(0.156272,-0.987714,-0.987714,-0.156272,327.042,382.506)">
|
||||||
|
<path d="M-16.046,33.107L36.491,33.107L38.757,18.784L-13.785,18.82L-16.046,33.107Z" style="fill:white;fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(1,0,0,1,360.484,341.289)">
|
||||||
|
<path d="M0,51.891L8.246,0L22.781,0L16.597,39.024L27.224,39.024L25.199,51.891L0,51.891Z" style="fill:white;fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(1,0,0,1,432.623,357.391)">
|
||||||
|
<path d="M0,19.83C1.611,21.181 3.305,22.224 5.083,22.959C6.859,23.693 8.565,24.06 10.2,24.06C11.645,24.06 12.794,23.663 13.647,22.87C14.5,22.076 14.927,20.992 14.927,19.617C14.927,18.434 14.571,17.254 13.861,16.081C13.15,14.908 11.775,13.351 9.738,11.408C7.273,9.015 5.58,6.906 4.655,5.081C3.731,3.257 3.27,1.243 3.27,-0.96C3.27,-5.912 4.839,-9.846 7.979,-12.76C11.118,-15.674 15.377,-17.132 20.756,-17.132C22.936,-17.132 25.008,-16.889 26.975,-16.403C28.941,-15.917 30.943,-15.165 32.982,-14.146L30.92,-1.493C29.356,-2.583 27.834,-3.412 26.354,-3.981C24.872,-4.551 23.457,-4.835 22.106,-4.835C20.898,-4.835 19.943,-4.521 19.245,-3.894C18.546,-3.265 18.196,-2.406 18.196,-1.316C18.196,0.154 19.535,2.215 22.213,4.868C22.544,5.2 22.805,5.46 22.995,5.649C25.696,8.304 27.473,10.578 28.326,12.475C29.179,14.37 29.605,16.56 29.605,19.049C29.605,24.594 27.893,28.965 24.469,32.163C21.046,35.361 16.36,36.962 10.413,36.962C7.877,36.962 5.479,36.66 3.216,36.056C0.953,35.45 -0.948,34.615 -2.488,33.549L0,19.83Z" style="fill:white;fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(-166.599,4.57132,4.57132,166.599,147.403,167.648)">
|
||||||
|
<path d="M0.883,-0.081L0.121,0.081L0.256,-0.063L0.883,-0.081Z" style="fill:url(#_Linear1);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(-106.443,-16.0669,-16.0669,106.443,428.19,188.033)">
|
||||||
|
<path d="M0.878,-0.285L-0.073,0.71L-1.186,0.542L0.015,0.207L-0.846,0.077L0.355,-0.258L-0.505,-0.388L0.649,-0.71L0.878,-0.285Z" style="fill:url(#_Linear2);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(-114.484,-162.408,-162.408,114.484,333.291,285.804)">
|
||||||
|
<path d="M0.44,-0.04L0.44,-0.04L0.44,-0.04L0.265,-0.056L0.177,0.437L-0.311,-0.255L0.262,-0.437L0.568,-0.437L0.44,-0.04Z" style="fill:url(#_Linear3);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(61.6919,58.8091,58.8091,-61.6919,258.631,180.413)">
|
||||||
|
<path d="M0.5,0L0.5,-0L0.5,0L0.5,0Z" style="fill:url(#_Linear4);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(238.126,298.893,298.893,-238.126,113.516,-150.536)">
|
||||||
|
<path d="M0.622,-0.115L0.761,-0.115L0.806,-0.013L0.826,0.182L0.622,-0.115Z" style="fill:url(#_Linear5);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(-369.529,-97.4118,-97.4118,369.529,582.38,94.027)">
|
||||||
|
<path d="M0.467,0.005L0.49,0.062L0.271,-0.062L0.467,0.005Z" style="fill:url(#_Linear6);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(-496.156,-53.9751,-53.9751,496.156,367.888,125.085)">
|
||||||
|
<path d="M0.2,0.001L0.219,-0.018L0.614,0.012L0.519,0.089L0.282,0.068L0.2,0.135L0.463,0.194L0.374,0.266L0.138,0.186L0.138,0.186L0.138,0.186L0.047,0.033L-0.131,-0.266L0.2,0.001Z" style="fill:url(#_Linear7);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(185.076,176.427,176.427,-185.076,153.446,80.1488)">
|
||||||
|
<path d="M0.735,-0L0.735,-0L0.735,0L0.735,-0Z" style="fill:url(#_Linear8);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="_Linear1" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,-3.46945e-18,-3.46945e-18,-1,0,-3.05761e-06)"><stop offset="0" style="stop-color:rgb(227,50,50);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(107,0,13);stop-opacity:1"/></linearGradient>
|
||||||
|
<linearGradient id="_Linear2" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,-1,0,-2.75467e-06)"><stop offset="0" style="stop-color:rgb(227,50,50);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(107,0,13);stop-opacity:1"/></linearGradient>
|
||||||
|
<linearGradient id="_Linear3" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,-1.11022e-16,-1.11022e-16,-1,0,-2.61861e-06)"><stop offset="0" style="stop-color:rgb(227,50,50);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(107,0,13);stop-opacity:1"/></linearGradient>
|
||||||
|
<linearGradient id="_Linear4" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,-5.55112e-17,-5.55112e-17,-1,0,-1.57562e-06)"><stop offset="0" style="stop-color:rgb(227,50,50);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(107,0,13);stop-opacity:1"/></linearGradient>
|
||||||
|
<linearGradient id="_Linear5" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-0.801899,-0.59746,-0.59746,0.801899,1.3495,0.447457)"><stop offset="0" style="stop-color:rgb(227,50,50);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(107,0,13);stop-opacity:1"/></linearGradient>
|
||||||
|
<linearGradient id="_Linear6" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,-2.77556e-17,-2.77556e-17,-1,0,-1.92826e-06)"><stop offset="0" style="stop-color:rgb(227,50,50);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(107,0,13);stop-opacity:1"/></linearGradient>
|
||||||
|
<linearGradient id="_Linear7" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,-1,0,9.68429e-07)"><stop offset="0" style="stop-color:rgb(227,50,50);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(107,0,13);stop-opacity:1"/></linearGradient>
|
||||||
|
<linearGradient id="_Linear8" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,-1,0,1.43665e-07)"><stop offset="0" style="stop-color:rgb(227,50,50);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(107,0,13);stop-opacity:1"/></linearGradient>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 6.9 KiB |
1
docs/src/assets/wails-logo-horizontal-dark.svg
Normal file
After Width: | Height: | Size: 5.4 KiB |
1
docs/src/assets/wails-logo-horizontal-light.svg
Normal file
After Width: | Height: | Size: 5.4 KiB |
54
docs/src/assets/wails-logo-light.svg
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<svg width="100%" height="100%" viewBox="0 0 551 436" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||||
|
<path d="M260.266,104.287L301.929,93.442L268.858,115.754L260.266,104.287Z" style="fill:rgb(235,235,235);"/>
|
||||||
|
<g transform="matrix(1,0,0,1,116.615,393.181)">
|
||||||
|
<path d="M0,-51.891L14.429,-51.891L13.043,-21.183L22.568,-51.891L34.226,-51.891L34.084,-21.183L42.365,-51.891L56.794,-51.891L38.526,0L25.198,0L25.34,-32.45L15.211,0L1.919,0L0,-51.891Z" style="fill:rgb(14,0,0);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(1,0,0,1,226.834,359.416)">
|
||||||
|
<path d="M0,15.639L5.793,15.639L5.971,-3.589L0,15.639ZM-20.187,33.765L-0.675,-18.126L16.42,-18.126L20.08,33.765L5.437,33.765L5.509,26.123L-3.057,26.123L-5.332,33.765L-20.187,33.765Z" style="fill:rgb(14,0,0);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(0.156272,-0.987714,-0.987714,-0.156272,327.042,382.506)">
|
||||||
|
<path d="M-16.046,33.107L36.491,33.107L38.757,18.784L-13.785,18.82L-16.046,33.107Z" style="fill:rgb(14,0,0);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(1,0,0,1,360.484,341.289)">
|
||||||
|
<path d="M0,51.891L8.246,0L22.781,0L16.597,39.024L27.224,39.024L25.199,51.891L0,51.891Z" style="fill:rgb(14,0,0);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(1,0,0,1,432.623,357.391)">
|
||||||
|
<path d="M0,19.83C1.611,21.181 3.305,22.224 5.083,22.959C6.859,23.693 8.565,24.06 10.2,24.06C11.645,24.06 12.794,23.663 13.647,22.87C14.5,22.076 14.927,20.992 14.927,19.617C14.927,18.434 14.571,17.254 13.861,16.081C13.15,14.908 11.775,13.351 9.738,11.408C7.273,9.015 5.58,6.906 4.655,5.081C3.731,3.257 3.27,1.243 3.27,-0.96C3.27,-5.912 4.839,-9.846 7.979,-12.76C11.118,-15.674 15.377,-17.132 20.756,-17.132C22.936,-17.132 25.008,-16.889 26.975,-16.403C28.941,-15.917 30.943,-15.165 32.982,-14.146L30.92,-1.493C29.356,-2.583 27.834,-3.412 26.354,-3.981C24.872,-4.551 23.457,-4.835 22.106,-4.835C20.898,-4.835 19.943,-4.521 19.245,-3.894C18.546,-3.265 18.196,-2.406 18.196,-1.316C18.196,0.154 19.535,2.215 22.213,4.868C22.544,5.2 22.805,5.46 22.995,5.649C25.696,8.304 27.473,10.578 28.326,12.475C29.179,14.37 29.605,16.56 29.605,19.049C29.605,24.594 27.893,28.965 24.469,32.163C21.046,35.361 16.36,36.962 10.413,36.962C7.877,36.962 5.479,36.66 3.216,36.056C0.953,35.45 -0.948,34.615 -2.488,33.549L0,19.83Z" style="fill:rgb(14,0,0);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(-166.599,4.57132,4.57132,166.599,147.403,167.648)">
|
||||||
|
<path d="M0.883,-0.081L0.121,0.081L0.256,-0.063L0.883,-0.081Z" style="fill:url(#_Linear1);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(-106.443,-16.0669,-16.0669,106.443,428.19,188.033)">
|
||||||
|
<path d="M0.878,-0.285L-0.073,0.71L-1.186,0.542L0.015,0.207L-0.846,0.077L0.355,-0.258L-0.505,-0.388L0.649,-0.71L0.878,-0.285Z" style="fill:url(#_Linear2);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(-114.484,-162.408,-162.408,114.484,333.291,285.804)">
|
||||||
|
<path d="M0.44,-0.04L0.44,-0.04L0.44,-0.04L0.265,-0.056L0.177,0.437L-0.311,-0.255L0.262,-0.437L0.568,-0.437L0.44,-0.04Z" style="fill:url(#_Linear3);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(61.6919,58.8091,58.8091,-61.6919,258.631,180.413)">
|
||||||
|
<path d="M0.5,0L0.5,-0L0.5,0L0.5,0Z" style="fill:url(#_Linear4);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(238.126,298.893,298.893,-238.126,113.516,-150.536)">
|
||||||
|
<path d="M0.622,-0.115L0.761,-0.115L0.806,-0.013L0.826,0.182L0.622,-0.115Z" style="fill:url(#_Linear5);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(-369.529,-97.4118,-97.4118,369.529,582.38,94.027)">
|
||||||
|
<path d="M0.467,0.005L0.49,0.062L0.271,-0.062L0.467,0.005Z" style="fill:url(#_Linear6);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(-496.156,-53.9751,-53.9751,496.156,367.888,125.085)">
|
||||||
|
<path d="M0.2,0.001L0.219,-0.018L0.614,0.012L0.519,0.089L0.282,0.068L0.2,0.135L0.463,0.194L0.374,0.266L0.138,0.186L0.138,0.186L0.138,0.186L0.047,0.033L-0.131,-0.266L0.2,0.001Z" style="fill:url(#_Linear7);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(185.076,176.427,176.427,-185.076,153.446,80.1488)">
|
||||||
|
<path d="M0.735,-0L0.735,-0L0.735,0L0.735,-0Z" style="fill:url(#_Linear8);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="_Linear1" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,-3.46945e-18,-3.46945e-18,-1,0,-3.05761e-06)"><stop offset="0" style="stop-color:rgb(227,50,50);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(107,0,13);stop-opacity:1"/></linearGradient>
|
||||||
|
<linearGradient id="_Linear2" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,-1,0,-2.75467e-06)"><stop offset="0" style="stop-color:rgb(227,50,50);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(107,0,13);stop-opacity:1"/></linearGradient>
|
||||||
|
<linearGradient id="_Linear3" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,-1.11022e-16,-1.11022e-16,-1,0,-2.61861e-06)"><stop offset="0" style="stop-color:rgb(227,50,50);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(107,0,13);stop-opacity:1"/></linearGradient>
|
||||||
|
<linearGradient id="_Linear4" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,-5.55112e-17,-5.55112e-17,-1,0,-1.57562e-06)"><stop offset="0" style="stop-color:rgb(227,50,50);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(107,0,13);stop-opacity:1"/></linearGradient>
|
||||||
|
<linearGradient id="_Linear5" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-0.801899,-0.59746,-0.59746,0.801899,1.3495,0.447457)"><stop offset="0" style="stop-color:rgb(227,50,50);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(107,0,13);stop-opacity:1"/></linearGradient>
|
||||||
|
<linearGradient id="_Linear6" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,-2.77556e-17,-2.77556e-17,-1,0,-1.92826e-06)"><stop offset="0" style="stop-color:rgb(227,50,50);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(107,0,13);stop-opacity:1"/></linearGradient>
|
||||||
|
<linearGradient id="_Linear7" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,-1,0,9.68429e-07)"><stop offset="0" style="stop-color:rgb(227,50,50);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(107,0,13);stop-opacity:1"/></linearGradient>
|
||||||
|
<linearGradient id="_Linear8" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,-1,0,1.43665e-07)"><stop offset="0" style="stop-color:rgb(227,50,50);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(107,0,13);stop-opacity:1"/></linearGradient>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 6.9 KiB |
11
docs/src/content/authors.ts
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import type { StarlightBlogUserConfig } from "starlight-blog";
|
||||||
|
|
||||||
|
type Authors = NonNullable<StarlightBlogUserConfig>["authors"];
|
||||||
|
export const authors: Authors = {
|
||||||
|
leaanthony: {
|
||||||
|
name: "Lea Anthony",
|
||||||
|
title: "Maintainer of Wails",
|
||||||
|
url: "https://github.com/leaanthony",
|
||||||
|
picture: "https://github.com/leaanthony.png",
|
||||||
|
},
|
||||||
|
};
|
10
docs/src/content/config.ts
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import { defineCollection } from "astro:content";
|
||||||
|
import { docsSchema, i18nSchema } from "@astrojs/starlight/schema";
|
||||||
|
import { blogSchema } from "starlight-blog/schema";
|
||||||
|
|
||||||
|
export const collections = {
|
||||||
|
i18n: defineCollection({ type: "data", schema: i18nSchema() }),
|
||||||
|
docs: defineCollection({
|
||||||
|
schema: docsSchema({ extend: (context) => blogSchema(context) }),
|
||||||
|
}),
|
||||||
|
};
|
193
docs/src/content/docs/api/application.mdx
Normal file
@ -0,0 +1,193 @@
|
|||||||
|
---
|
||||||
|
title: Application
|
||||||
|
sidebar:
|
||||||
|
order: 10
|
||||||
|
---
|
||||||
|
|
||||||
|
The application API assists in creating an application using the Wails
|
||||||
|
framework.
|
||||||
|
|
||||||
|
### New
|
||||||
|
|
||||||
|
API: `New(appOptions Options) *App`
|
||||||
|
|
||||||
|
`New(appOptions Options)` creates a new application using the given application
|
||||||
|
options . It applies default values for unspecified options, merges them with
|
||||||
|
the provided ones, initializes and returns an instance of the application.
|
||||||
|
|
||||||
|
In case of an error during initialization, the application is stopped with the
|
||||||
|
error message provided.
|
||||||
|
|
||||||
|
It should be noted that if a global application instance already exists, that
|
||||||
|
instance will be returned instead of creating a new one.
|
||||||
|
|
||||||
|
```go "main.go" {6-9}
|
||||||
|
package main
|
||||||
|
|
||||||
|
import "github.com/wailsapp/wails/v3/pkg/application"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
app := application.New(application.Options{
|
||||||
|
Name: "WebviewWindow Demo",
|
||||||
|
// Other options
|
||||||
|
})
|
||||||
|
|
||||||
|
// Rest of application
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Get
|
||||||
|
|
||||||
|
`Get()` returns the global application instance. It's useful when you need to
|
||||||
|
access the application from different parts of your code.
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Get the application instance
|
||||||
|
app := application.Get()
|
||||||
|
```
|
||||||
|
|
||||||
|
### Capabilities
|
||||||
|
|
||||||
|
API: `Capabilities() capabilities.Capabilities`
|
||||||
|
|
||||||
|
`Capabilities()` retrieves a map of capabilities that the application currently
|
||||||
|
has. Capabilities can be about different features the operating system provides,
|
||||||
|
like webview features.
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Get the application capabilities
|
||||||
|
capabilities := app.Capabilities()
|
||||||
|
if capabilities.HasNativeDrag {
|
||||||
|
// Do something
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### GetPID
|
||||||
|
|
||||||
|
API: `GetPID() int`
|
||||||
|
|
||||||
|
`GetPID()` returns the Process ID of the application.
|
||||||
|
|
||||||
|
```go
|
||||||
|
pid := app.GetPID()
|
||||||
|
```
|
||||||
|
|
||||||
|
### Run
|
||||||
|
|
||||||
|
API: `Run() error`
|
||||||
|
|
||||||
|
`Run()` starts the execution of the application and its components.
|
||||||
|
|
||||||
|
```go
|
||||||
|
app := application.New(application.Options{
|
||||||
|
//options
|
||||||
|
})
|
||||||
|
// Run the application
|
||||||
|
err := app.Run()
|
||||||
|
if err != nil {
|
||||||
|
// Handle error
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Quit
|
||||||
|
|
||||||
|
API: `Quit()`
|
||||||
|
|
||||||
|
`Quit()` quits the application by destroying windows and potentially other
|
||||||
|
components.
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Quit the application
|
||||||
|
app.Quit()
|
||||||
|
```
|
||||||
|
|
||||||
|
### IsDarkMode
|
||||||
|
|
||||||
|
API: `IsDarkMode() bool`
|
||||||
|
|
||||||
|
`IsDarkMode()` checks if the application is running in dark mode. It returns a
|
||||||
|
boolean indicating whether dark mode is enabled.
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Check if dark mode is enabled
|
||||||
|
if app.IsDarkMode() {
|
||||||
|
// Do something
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Hide
|
||||||
|
|
||||||
|
API: `Hide()`
|
||||||
|
|
||||||
|
`Hide()` hides the application window.
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Hide the application window
|
||||||
|
app.Hide()
|
||||||
|
```
|
||||||
|
|
||||||
|
### Show
|
||||||
|
|
||||||
|
API: `Show()`
|
||||||
|
|
||||||
|
`Show()` shows the application window.
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Show the application window
|
||||||
|
app.Show()
|
||||||
|
```
|
||||||
|
|
||||||
|
### Path
|
||||||
|
|
||||||
|
API: `Path(selector Path) string`
|
||||||
|
|
||||||
|
`Path(selector Path)` returns the full path for the given path type. It provides
|
||||||
|
a cross-platform way to query common application directories.
|
||||||
|
|
||||||
|
The `Path` type is an enum with the following values:
|
||||||
|
|
||||||
|
- `PathHome`: Returns the user's home directory
|
||||||
|
- `PathDataHome`: Returns the path to the user's data directory
|
||||||
|
- `PathConfigHome`: Returns the path to the user's configuration directory
|
||||||
|
- `PathStateHome`: Returns the path to the user's state directory
|
||||||
|
- `PathCacheHome`: Returns the path to the user's cache directory
|
||||||
|
- `PathRuntimeDir`: Returns the path to the user's runtime directory
|
||||||
|
- `PathDesktop`: Returns the path to the user's desktop directory
|
||||||
|
- `PathDownload`: Returns the path to the user's download directory
|
||||||
|
- `PathDocuments`: Returns the path to the user's documents directory
|
||||||
|
- `PathMusic`: Returns the path to the user's music directory
|
||||||
|
- `PathPictures`: Returns the path to the user's pictures directory
|
||||||
|
- `PathVideos`: Returns the path to the user's videos directory
|
||||||
|
- `PathTemplates`: Returns the path to the user's templates directory
|
||||||
|
- `PathPublicShare`: Returns the path to the user's public share directory
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Get the data home directory path
|
||||||
|
dataHomePath := app.Path(application.PathDataHome)
|
||||||
|
fmt.Println("DataHome path:", dataHomePath)
|
||||||
|
|
||||||
|
// Output: DataHome path: /home/username/.local/share // Linux
|
||||||
|
// Output: DataHome path: /Users/username/Library/Application Support // macOS
|
||||||
|
// Output: DataHome path: C:\Users\Username\AppData\Roaming // Windows
|
||||||
|
|
||||||
|
// Get the CacheHome directory path
|
||||||
|
cacheHomePath := app.Path(application.PathCacheHome)
|
||||||
|
fmt.Println("CacheHome path:", cacheHomePath)
|
||||||
|
|
||||||
|
// Output: CacheHome path: /home/username/.cache // Linux
|
||||||
|
// Output: CacheHome path: /Users/username/Library/Caches // macOS
|
||||||
|
// Output: CacheHome path: C:\Users\Username\AppData\Local\Temp // Windows
|
||||||
|
```
|
||||||
|
|
||||||
|
## Paths
|
||||||
|
|
||||||
|
API: `Paths(selector Paths) []string` `Paths(selector Path)` returns a list of
|
||||||
|
paths for the given path type. It provides a cross-platform way to query common
|
||||||
|
directory paths.
|
||||||
|
|
||||||
|
The `Paths` type is an enum with the following values:
|
||||||
|
|
||||||
|
- `PathsDataDirs`: Returns the list of data directories
|
||||||
|
- `PathsConfigDirs`: Returns the list of configuration directories
|
||||||
|
- `PathsCacheDirs`: Returns the list of cache directories
|
||||||
|
- `PathsRuntimeDirs`: Returns the list of runtime directories
|
107
docs/src/content/docs/api/application_dialogs.md
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
---
|
||||||
|
title: Application Dialogs
|
||||||
|
sidebar:
|
||||||
|
order: 40
|
||||||
|
---
|
||||||
|
|
||||||
|
:::caution[MacOS Dialogs and Application Lifecycle]
|
||||||
|
|
||||||
|
If you show dialogs during application startup or file open events, you should
|
||||||
|
set `ApplicationShouldTerminateAfterLastWindowClosed` to `false` to prevent the
|
||||||
|
application from terminating when those dialogs close. Otherwise, the
|
||||||
|
application may quit before your main window appears.
|
||||||
|
|
||||||
|
```go
|
||||||
|
app := application.New(application.Options{
|
||||||
|
Mac: application.MacOptions{
|
||||||
|
ApplicationShouldTerminateAfterLastWindowClosed: false,
|
||||||
|
},
|
||||||
|
// ... rest of options
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
Alternatively, you can show startup dialogs after the main window has been
|
||||||
|
displayed:
|
||||||
|
|
||||||
|
```go
|
||||||
|
var filename string
|
||||||
|
app.OnApplicationEvent(events.Common.ApplicationOpenedWithFile, func(event *application.ApplicationEvent) {
|
||||||
|
filename = event.Context().Filename()
|
||||||
|
})
|
||||||
|
|
||||||
|
window.OnWindowEvent(events.Common.WindowShow, func(event *application.WindowEvent) {
|
||||||
|
application.InfoDialog().
|
||||||
|
SetTitle("File Opened").
|
||||||
|
SetMessage("Application opened with file: " + filename).
|
||||||
|
Show()
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
### ShowAboutDialog
|
||||||
|
|
||||||
|
API: `ShowAboutDialog()`
|
||||||
|
|
||||||
|
`ShowAboutDialog()` shows an "About" dialog box. It can show the application's
|
||||||
|
name, description and icon.
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Show the about dialog
|
||||||
|
app.ShowAboutDialog()
|
||||||
|
```
|
||||||
|
|
||||||
|
### Info
|
||||||
|
|
||||||
|
API: `InfoDialog()`
|
||||||
|
|
||||||
|
`InfoDialog()` creates and returns a new instance of `MessageDialog` with an
|
||||||
|
`InfoDialogType`. This dialog is typically used to display informational
|
||||||
|
messages to the user.
|
||||||
|
|
||||||
|
### Question
|
||||||
|
|
||||||
|
API: `QuestionDialog()`
|
||||||
|
|
||||||
|
`QuestionDialog()` creates and returns a new instance of `MessageDialog` with a
|
||||||
|
`QuestionDialogType`. This dialog is often used to ask a question to the user
|
||||||
|
and expect a response.
|
||||||
|
|
||||||
|
### Warning
|
||||||
|
|
||||||
|
API: `WarningDialog()`
|
||||||
|
|
||||||
|
`WarningDialog()` creates and returns a new instance of `MessageDialog` with a
|
||||||
|
`WarningDialogType`. As the name suggests, this dialog is primarily used to
|
||||||
|
display warning messages to the user.
|
||||||
|
|
||||||
|
### Error
|
||||||
|
|
||||||
|
API: `ErrorDialog()`
|
||||||
|
|
||||||
|
`ErrorDialog()` creates and returns a new instance of `MessageDialog` with an
|
||||||
|
`ErrorDialogType`. This dialog is designed to be used when you need to display
|
||||||
|
an error message to the user.
|
||||||
|
|
||||||
|
### OpenFile
|
||||||
|
|
||||||
|
API: `OpenFileDialog()`
|
||||||
|
|
||||||
|
`OpenFileDialog()` creates and returns a new `OpenFileDialogStruct`. This dialog
|
||||||
|
prompts the user to select one or more files from their file system.
|
||||||
|
|
||||||
|
### SaveFile
|
||||||
|
|
||||||
|
API: `SaveFileDialog()`
|
||||||
|
|
||||||
|
`SaveFileDialog()` creates and returns a new `SaveFileDialogStruct`. This dialog
|
||||||
|
prompts the user to choose a location on their file system where a file should
|
||||||
|
be saved.
|
||||||
|
|
||||||
|
### OpenDirectory
|
||||||
|
|
||||||
|
API: `OpenDirectoryDialog()`
|
||||||
|
|
||||||
|
`OpenDirectoryDialog()` creates and returns a new instance of `MessageDialog`
|
||||||
|
with an `OpenDirectoryDialogType`. This dialog enables the user to choose a
|
||||||
|
directory from their file system.
|
60
docs/src/content/docs/api/application_events.md
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
---
|
||||||
|
title: Application Events
|
||||||
|
sidebar:
|
||||||
|
order: 50
|
||||||
|
---
|
||||||
|
|
||||||
|
### OnEvent
|
||||||
|
|
||||||
|
API: `OnEvent(name string, callback func(event *CustomEvent)) func()`
|
||||||
|
|
||||||
|
`OnEvent()` registers an event listener for specific application events. The
|
||||||
|
callback function provided will be triggered when the corresponding event
|
||||||
|
occurs.
|
||||||
|
|
||||||
|
### OffEvent
|
||||||
|
|
||||||
|
API: `OffEvent(name string)`
|
||||||
|
|
||||||
|
`OffEvent()` removes an event listener for a specific named event specified.
|
||||||
|
|
||||||
|
### OnMultipleEvent
|
||||||
|
|
||||||
|
API:
|
||||||
|
`OnMultipleEvent(name string, callback func(event *CustomEvent), counter int) func()`
|
||||||
|
|
||||||
|
`OnMultipleEvent()` registers an event listener for X number of Events. The
|
||||||
|
callback function provided will be triggered `counter` times when the
|
||||||
|
corresponding event occurs.
|
||||||
|
|
||||||
|
### ResetEvents
|
||||||
|
|
||||||
|
API: `ResetEvents()`
|
||||||
|
|
||||||
|
`ResetEvents()` removes all event listeners for all application events.
|
||||||
|
|
||||||
|
### OnApplicationEvent
|
||||||
|
|
||||||
|
API:
|
||||||
|
`OnApplicationEvent(eventType events.ApplicationEventType, callback func(event *ApplicationEvent)) func()`
|
||||||
|
|
||||||
|
`OnApplicationEvent()` registers an event listener for specific application
|
||||||
|
events. The `eventType` is based on events.ApplicationEventType. See
|
||||||
|
[ApplicationEventType](/api/event_types/#applicationevent)
|
||||||
|
|
||||||
|
### RegisterApplicationHook
|
||||||
|
|
||||||
|
API:
|
||||||
|
`RegisterApplicationEventHook(eventType events.ApplicationEventType, callback func(event *ApplicationEvent)) func()`
|
||||||
|
|
||||||
|
`RegisterApplicationEventHook()` registers a callback to be triggered based on
|
||||||
|
specific application events.
|
||||||
|
|
||||||
|
### RegisterHook
|
||||||
|
|
||||||
|
API:
|
||||||
|
`RegisterHook(eventType events.ApplicationEventType, callback func(event *Event)) func()`
|
||||||
|
|
||||||
|
`RegisterHook()` registers a callback to be run as a hook during specific
|
||||||
|
events. These hooks are run before listeners attached with `On()`. The function
|
||||||
|
returns a function that can be called to remove the hook.
|
36
docs/src/content/docs/api/application_menu.md
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
---
|
||||||
|
title: Application Menu
|
||||||
|
sidebar:
|
||||||
|
order: 30
|
||||||
|
---
|
||||||
|
|
||||||
|
### RegisterContextMenu
|
||||||
|
|
||||||
|
API: `RegisterContextMenu(name string, menu *Menu)`
|
||||||
|
|
||||||
|
`RegisterContextMenu()` registers a context menu with a given name. This menu
|
||||||
|
can be used later in the application.
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Create a new menu
|
||||||
|
ctxmenu := app.NewMenu()
|
||||||
|
|
||||||
|
// Register the menu as a context menu
|
||||||
|
app.RegisterContextMenu("MyContextMenu", ctxmenu)
|
||||||
|
```
|
||||||
|
|
||||||
|
### SetMenu
|
||||||
|
|
||||||
|
API: `SetMenu(menu *Menu)`
|
||||||
|
|
||||||
|
`SetMenu()` sets the menu for the application. On Mac, this will be the global
|
||||||
|
menu. For Windows and Linux, this will be the default menu for any new window
|
||||||
|
created.
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Create a new menu
|
||||||
|
menu := app.NewMenu()
|
||||||
|
|
||||||
|
// Set the menu for the application
|
||||||
|
app.SetMenu(menu)
|
||||||
|
```
|
14
docs/src/content/docs/api/application_options.mdx
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
---
|
||||||
|
title: Application Options
|
||||||
|
sidebar:
|
||||||
|
order: 70
|
||||||
|
---
|
||||||
|
|
||||||
|
import { Code } from "@astrojs/starlight/components";
|
||||||
|
import application_options from "../../../../../v3/pkg/application/application_options.go?raw";
|
||||||
|
|
||||||
|
<Code
|
||||||
|
code={application_options}
|
||||||
|
lang="go"
|
||||||
|
title="pkg/application/application_options.go"
|
||||||
|
/>
|
21
docs/src/content/docs/api/application_screens.md
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
title: Application Screens
|
||||||
|
sidebar:
|
||||||
|
order: 60
|
||||||
|
---
|
||||||
|
|
||||||
|
### GetPrimaryScreen
|
||||||
|
|
||||||
|
API: `GetPrimaryScreen() (*Screen, error)`
|
||||||
|
|
||||||
|
`GetPrimaryScreen()` returns the primary screen of the system.
|
||||||
|
|
||||||
|
### GetScreens
|
||||||
|
|
||||||
|
API: `GetScreens() ([]*Screen, error)`
|
||||||
|
|
||||||
|
`GetScreens()` returns information about all screens attached to the system.
|
||||||
|
|
||||||
|
This is a brief summary of the exported methods in the provided `App` struct. Do
|
||||||
|
note that for more detailed functionality or considerations, refer to the actual
|
||||||
|
Go code or further internal documentation.
|
73
docs/src/content/docs/api/application_window.md
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
---
|
||||||
|
title: Application Window
|
||||||
|
sidebar:
|
||||||
|
order: 20
|
||||||
|
---
|
||||||
|
|
||||||
|
### NewWebviewWindow
|
||||||
|
|
||||||
|
API: `NewWebviewWindow() *WebviewWindow`
|
||||||
|
|
||||||
|
`NewWebviewWindow()` creates a new Webview window with default options, and
|
||||||
|
returns it.
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Create a new webview window
|
||||||
|
window := app.NewWebviewWindow()
|
||||||
|
```
|
||||||
|
|
||||||
|
### NewWebviewWindowWithOptions
|
||||||
|
|
||||||
|
API:
|
||||||
|
`NewWebviewWindowWithOptions(windowOptions WebviewWindowOptions) *WebviewWindow`
|
||||||
|
|
||||||
|
`NewWebviewWindowWithOptions()` creates a new webview window with custom
|
||||||
|
options. The newly created window is added to a map of windows managed by the
|
||||||
|
application.
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Create a new webview window with custom options
|
||||||
|
window := app.NewWebviewWindowWithOptions(WebviewWindowOptions{
|
||||||
|
Name: "Main",
|
||||||
|
Title: "My Window",
|
||||||
|
Width: 800,
|
||||||
|
Height: 600,
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
### OnWindowCreation
|
||||||
|
|
||||||
|
API: `OnWindowCreation(callback func(window *WebviewWindow))`
|
||||||
|
|
||||||
|
`OnWindowCreation()` registers a callback function to be called when a window is
|
||||||
|
created.
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Register a callback to be called when a window is created
|
||||||
|
app.OnWindowCreation(func(window *WebviewWindow) {
|
||||||
|
// Do something
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
### GetWindowByName
|
||||||
|
|
||||||
|
API: `GetWindowByName(name string) *WebviewWindow`
|
||||||
|
|
||||||
|
`GetWindowByName()` fetches and returns a window with a specific name.
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Get a window by name
|
||||||
|
window := app.GetWindowByName("Main")
|
||||||
|
```
|
||||||
|
|
||||||
|
### CurrentWindow
|
||||||
|
|
||||||
|
API: `CurrentWindow() *WebviewWindow`
|
||||||
|
|
||||||
|
`CurrentWindow()` fetches and returns a pointer to the currently active window
|
||||||
|
in the application. If there is no window, it returns nil.
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Get the current window
|
||||||
|
window := app.CurrentWindow()
|
||||||
|
```
|
152
docs/src/content/docs/api/event_hooks.md
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
---
|
||||||
|
title: Event Hooks
|
||||||
|
tableOfContents:
|
||||||
|
maxHeadingLevel: 4
|
||||||
|
sidebar:
|
||||||
|
order: 90
|
||||||
|
---
|
||||||
|
|
||||||
|
wails3 provides an event system that allows for hooking into application and
|
||||||
|
window events
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Notification of application start
|
||||||
|
application.RegisterApplicationEventHook(events.Common.ApplicationStarted, func(event *application.ApplicationEvent) {
|
||||||
|
app.Logger.Info("Application started!")
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Notification of system theme change
|
||||||
|
application.OnApplicationEvent(events.Common.ThemeChanged, func(event *application.ApplicationEvent) {
|
||||||
|
app.Logger.Info("System theme changed!")
|
||||||
|
if event.Context().IsDarkMode() {
|
||||||
|
app.Logger.Info("System is now using dark mode!")
|
||||||
|
} else {
|
||||||
|
app.Logger.Info("System is now using light mode!")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Disable window closing by canceling the event
|
||||||
|
window.RegisterHook(events.Common.WindowClosing, func(e *application.WindowEvent) {
|
||||||
|
app.Logger.Info("Window 1 Closing? Nope! Not closing!")
|
||||||
|
e.Cancel()
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Notification of window focus
|
||||||
|
window.OnWindowEvent(events.Common.WindowFocus, func(e *application.WindowEvent) {
|
||||||
|
app.Logger.Info("[ApplicationEvent] Window focus!")
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
### Application Events
|
||||||
|
|
||||||
|
Application events are hookable events that can be registered with
|
||||||
|
`application.RegisterApplicationEventHook()` and
|
||||||
|
`application.OnApplicationEvent()`.
|
||||||
|
|
||||||
|
These events are based on `events.ApplicationEventType`.
|
||||||
|
|
||||||
|
#### `events.Common.ApplicationStarted`
|
||||||
|
|
||||||
|
Triggered when the application starts
|
||||||
|
|
||||||
|
#### `events.Common.ThemeChanged`
|
||||||
|
|
||||||
|
Triggered when the application theme changes
|
||||||
|
|
||||||
|
### Window Events
|
||||||
|
|
||||||
|
#### `events.Common.WindowMaximised`
|
||||||
|
|
||||||
|
Triggered when the window is maximised
|
||||||
|
|
||||||
|
#### `events.Common.WindowUnmaximised`
|
||||||
|
|
||||||
|
Triggered when the window is unmaximised
|
||||||
|
|
||||||
|
#### `events.Common.WindowMinimised`
|
||||||
|
|
||||||
|
Triggered when the window is minimised
|
||||||
|
|
||||||
|
#### `events.Common.WindowUnminimised`
|
||||||
|
|
||||||
|
Triggered when the window is unminimised
|
||||||
|
|
||||||
|
#### `events.Common.WindowFullscreen`
|
||||||
|
|
||||||
|
Triggered when the window is set to fullscreen
|
||||||
|
|
||||||
|
#### `events.Common.WindowUnfullscreen`
|
||||||
|
|
||||||
|
Triggered when the window is unfullscreened
|
||||||
|
|
||||||
|
#### `events.Common.WindowRestored`
|
||||||
|
|
||||||
|
Triggered when the window is restored
|
||||||
|
|
||||||
|
#### `events.Common.WindowClosing`
|
||||||
|
|
||||||
|
Triggered before the window closes
|
||||||
|
|
||||||
|
#### `events.Common.WindowZoom`
|
||||||
|
|
||||||
|
Triggered when the window is zoomed
|
||||||
|
|
||||||
|
#### `events.Common.WindowZoomOut`
|
||||||
|
|
||||||
|
Triggered when the window is zoomed out
|
||||||
|
|
||||||
|
#### `events.Common.WindowZoomIn`
|
||||||
|
|
||||||
|
Triggered when the window is zoomed in
|
||||||
|
|
||||||
|
#### `events.Common.WindowZoomReset`
|
||||||
|
|
||||||
|
Triggered when the window zoom is reset
|
||||||
|
|
||||||
|
#### `events.Common.WindowFocus`
|
||||||
|
|
||||||
|
Triggered when the window gains focus
|
||||||
|
|
||||||
|
#### `events.Common.WindowLostFocus`
|
||||||
|
|
||||||
|
Triggered when the window loses focus
|
||||||
|
|
||||||
|
#### `events.Common.WindowShow`
|
||||||
|
|
||||||
|
Triggered when the window is shown
|
||||||
|
|
||||||
|
#### `events.Common.WindowHide`
|
||||||
|
|
||||||
|
Triggered when the window is hidden
|
||||||
|
|
||||||
|
#### `events.Common.WindowDPIChanged`
|
||||||
|
|
||||||
|
Triggered when the window DPI changes
|
||||||
|
|
||||||
|
#### `events.Common.WindowFilesDropped`
|
||||||
|
|
||||||
|
Triggered when files are dropped on the window
|
||||||
|
|
||||||
|
#### `events.Common.WindowRuntimeReady`
|
||||||
|
|
||||||
|
Triggered when the window runtime is ready
|
||||||
|
|
||||||
|
#### `events.Common.WindowDidMove`
|
||||||
|
|
||||||
|
Triggered when the window is moved
|
||||||
|
|
||||||
|
#### `events.Common.WindowDidResize`
|
||||||
|
|
||||||
|
Triggered when the window is resized
|
||||||
|
|
||||||
|
### OS Specific Events
|
||||||
|
|
||||||
|
- [Mac Events](/api/events_mac)
|
||||||
|
- [Windows Events](/api/events_windows)
|
||||||
|
- [Linux Events](/api/events_linux)
|
55
docs/src/content/docs/api/event_types.md
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
---
|
||||||
|
title: Event Types
|
||||||
|
sidebar:
|
||||||
|
order: 140
|
||||||
|
---
|
||||||
|
|
||||||
|
### ApplicationEvent
|
||||||
|
|
||||||
|
Returned when an application hook event is triggered. The event can be cancelled
|
||||||
|
by calling the `Cancel()` method on the event.
|
||||||
|
|
||||||
|
```go
|
||||||
|
type ApplicationEvent struct {
|
||||||
|
Id uint
|
||||||
|
ctx *ApplicationEventContext
|
||||||
|
Cancelled bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cancel the event
|
||||||
|
func (a *ApplicationEvent) Cancel() {}
|
||||||
|
```
|
||||||
|
|
||||||
|
### WindowEvent
|
||||||
|
|
||||||
|
Returned when a window hook event is triggered. The event can be cancelled by
|
||||||
|
calling the `Cancel()` method on the event.
|
||||||
|
|
||||||
|
```go
|
||||||
|
type WindowEvent struct {
|
||||||
|
ctx *WindowEventContext
|
||||||
|
Cancelled bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cancel the event
|
||||||
|
func (w *WindowEvent) Cancel() {}
|
||||||
|
```
|
||||||
|
|
||||||
|
### CustomEvent
|
||||||
|
|
||||||
|
CustomEvent is returned when an event is being received it includes the name of
|
||||||
|
the event, the data that was sent with the event, the sender of the event,
|
||||||
|
application or a specific window. The event can be cancelled by calling the
|
||||||
|
`Cancel()` method on the event.
|
||||||
|
|
||||||
|
```go
|
||||||
|
type CustomEvent struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Data any `json:"data"`
|
||||||
|
Sender string `json:"sender"`
|
||||||
|
Cancelled bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cancel the event
|
||||||
|
func (c *CustomEvent) Cancel() {}
|
||||||
|
```
|
147
docs/src/content/docs/api/events_custom.mdx
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
---
|
||||||
|
title: Events (Custom)
|
||||||
|
tableOfContents:
|
||||||
|
maxHeadingLevel: 4
|
||||||
|
sidebar:
|
||||||
|
order: 130
|
||||||
|
---
|
||||||
|
|
||||||
|
import { Tabs, TabItem } from "@astrojs/starlight/components";
|
||||||
|
|
||||||
|
## Custom Events
|
||||||
|
|
||||||
|
You can create your own custom events that can be emitted and received on both
|
||||||
|
the frontend and backend. Events are able to emitted at both the application and
|
||||||
|
the window level. The receiver of the event gets data of where the event was
|
||||||
|
emitted from along with the data that was sent with the event. Events can be
|
||||||
|
cancelled by the receiver.
|
||||||
|
|
||||||
|
<Tabs syncKey="language">
|
||||||
|
<TabItem label="Go" icon="seti:go">
|
||||||
|
|
||||||
|
```go
|
||||||
|
app.OnEvent("event1", func(e \*application.CustomEvent) {
|
||||||
|
app.Logger.Info("[Go] CustomEvent received", "name", e.Name, "data", e.Data,
|
||||||
|
"sender", e.Sender, "cancelled", e.Cancelled) app.Logger.Info("[Go]",
|
||||||
|
e.Data[0].(string)) // Logs "Hello from JS" to the terminal })
|
||||||
|
|
||||||
|
window.EmitEvent("event2", "Hello from Go")
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
</TabItem>
|
||||||
|
<TabItem label="JS" icon="seti:javascript">
|
||||||
|
|
||||||
|
```js
|
||||||
|
wails.Events.Emit("event1", "Hello from JS");
|
||||||
|
|
||||||
|
wails.Events.On("event2", function (event) {
|
||||||
|
console.log("[JS] CustomEvent received", event);
|
||||||
|
console.log(event.data); // prints "Hello from Go" to the webview console
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
</TabItem>
|
||||||
|
|
||||||
|
</Tabs>
|
||||||
|
|
||||||
|
### Emitting Events
|
||||||
|
|
||||||
|
<Tabs syncKey="language">
|
||||||
|
<TabItem label="Go" icon="seti:go">
|
||||||
|
|
||||||
|
#### `application.EmitEvent(name string, data ...any)`
|
||||||
|
|
||||||
|
Emits an event from the application instance
|
||||||
|
|
||||||
|
</TabItem>
|
||||||
|
<TabItem label="JS" icon="seti:javascript">
|
||||||
|
|
||||||
|
#### `window.EmitEvent(name string, data ...any)`
|
||||||
|
|
||||||
|
Emits an event from the window instance
|
||||||
|
|
||||||
|
#### `wails.Events.Emit(event:wails.Events.EventData)`
|
||||||
|
|
||||||
|
Emits an event from the frontend sending an object with `name` and `data`
|
||||||
|
properties or the typescript type WailsEvent
|
||||||
|
|
||||||
|
</TabItem>
|
||||||
|
|
||||||
|
</Tabs>
|
||||||
|
|
||||||
|
### Receiving Events
|
||||||
|
|
||||||
|
Events can be received on the application instance and the frontend with a
|
||||||
|
couple options of how you chose to receive them. You can register a single event
|
||||||
|
listener that will trigger every time the event is emitted or you can register
|
||||||
|
an event listener that will only trigger a specific number of times.
|
||||||
|
|
||||||
|
<Tabs syncKey="language">
|
||||||
|
<TabItem label="Go" icon="seti:go">
|
||||||
|
|
||||||
|
#### `application.OnEvent(name string, handler func(data ...any))`
|
||||||
|
|
||||||
|
Registers an event on the application instance this will trigger every time the
|
||||||
|
event is emitted
|
||||||
|
|
||||||
|
#### `application.OnMultipleEvent(name string, handler func(data ...any), count int)`
|
||||||
|
|
||||||
|
Registers an event on the application instance this will trigger every time the
|
||||||
|
event is emitted up to the count specified
|
||||||
|
|
||||||
|
</TabItem>
|
||||||
|
<TabItem label="JS" icon="seti:javascript">
|
||||||
|
|
||||||
|
#### `wails.Events.On(name: string, callback: ()=>void)`,
|
||||||
|
|
||||||
|
Registers an event on the frontend, this function returns a function that can be
|
||||||
|
called to remove the event listener
|
||||||
|
|
||||||
|
#### `wails.Events.Once(name: string, callback: ()=>void)`,
|
||||||
|
|
||||||
|
Registers an event on the frontend that will only be called once, this function
|
||||||
|
returns a function that can be called to remove the event listener
|
||||||
|
|
||||||
|
#### `wails.Events.OnMultiple(name: string, callback: ()=>void, count: number)`,
|
||||||
|
|
||||||
|
Registers an event on the frontend that will only be called `count` times, this
|
||||||
|
function returns a function that can be called to remove the event listener
|
||||||
|
|
||||||
|
</TabItem>
|
||||||
|
|
||||||
|
</Tabs>
|
||||||
|
|
||||||
|
### Removing Events
|
||||||
|
|
||||||
|
There are a few ways to remove events that are registered. All of the
|
||||||
|
registration functions return a function that can be called to remove the event
|
||||||
|
listener in the frontend. There are additional functions provided to help remove
|
||||||
|
events as well.
|
||||||
|
|
||||||
|
<Tabs syncKey="language">
|
||||||
|
<TabItem label="Go" icon="seti:go">
|
||||||
|
|
||||||
|
#### `application.OffEvent(name string, ...additionalNames string)`
|
||||||
|
|
||||||
|
Removes an event listener with the specified name
|
||||||
|
|
||||||
|
#### `application.ResetEvents()`
|
||||||
|
|
||||||
|
Removes all registered events and hooks
|
||||||
|
|
||||||
|
</TabItem>
|
||||||
|
<TabItem label="JS" icon="seti:javascript">
|
||||||
|
|
||||||
|
#### `wails.Events.OffAll()`
|
||||||
|
|
||||||
|
Removes all registered events
|
||||||
|
|
||||||
|
#### `wails.Events.Off(name: string)`
|
||||||
|
|
||||||
|
Removes an event listener with the specified name
|
||||||
|
|
||||||
|
</TabItem>
|
||||||
|
|
||||||
|
</Tabs>
|
43
docs/src/content/docs/api/events_linux.md
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
---
|
||||||
|
title: Events (Linux)
|
||||||
|
tableOfContents:
|
||||||
|
maxHeadingLevel: 4
|
||||||
|
sidebar:
|
||||||
|
order: 120
|
||||||
|
---
|
||||||
|
|
||||||
|
## Application Events
|
||||||
|
|
||||||
|
#### `events.Linux.ApplicationStartup`
|
||||||
|
|
||||||
|
Triggered when the application starts
|
||||||
|
|
||||||
|
#### `events.Linux.SystemThemeChanged`
|
||||||
|
|
||||||
|
Triggered when the system theme changes
|
||||||
|
|
||||||
|
### Window Events
|
||||||
|
|
||||||
|
#### `events.Linux.WindowLoadChanged`
|
||||||
|
|
||||||
|
Triggered when the window load changes
|
||||||
|
|
||||||
|
#### `events.Linux.WindowDeleteEvent`
|
||||||
|
|
||||||
|
Triggered when the window is deleted
|
||||||
|
|
||||||
|
#### `events.Linux.WindowDidMove`
|
||||||
|
|
||||||
|
Triggered when the window is moved
|
||||||
|
|
||||||
|
#### `events.Linux.WindowDidResize`
|
||||||
|
|
||||||
|
Triggered when the window is resized
|
||||||
|
|
||||||
|
#### `events.Linux.WindowFocusIn`
|
||||||
|
|
||||||
|
Triggered when the window gains focus
|
||||||
|
|
||||||
|
#### `events.Linux.WindowFocusOut`
|
||||||
|
|
||||||
|
Triggered when the window loses focus
|
500
docs/src/content/docs/api/events_mac.md
Normal file
@ -0,0 +1,500 @@
|
|||||||
|
---
|
||||||
|
title: Events (macOS)
|
||||||
|
tableOfContents:
|
||||||
|
maxHeadingLevel: 4
|
||||||
|
sidebar:
|
||||||
|
order: 100
|
||||||
|
---
|
||||||
|
|
||||||
|
## Application Events
|
||||||
|
|
||||||
|
#### `events.Mac.ApplicationDidBecomeActive`
|
||||||
|
|
||||||
|
Triggered when the application becomes active
|
||||||
|
|
||||||
|
#### `events.Mac.ApplicationDidChangeBackingProperties`
|
||||||
|
|
||||||
|
Triggered when the application changes backing properties
|
||||||
|
|
||||||
|
#### `events.Mac.ApplicationDidChangeEffectiveAppearance`
|
||||||
|
|
||||||
|
Triggered when the application changes effective appearance
|
||||||
|
|
||||||
|
#### `events.Mac.ApplicationDidChangeIcon`
|
||||||
|
|
||||||
|
Triggered when the application changes icon
|
||||||
|
|
||||||
|
#### `events.Mac.ApplicationDidChangeOcclusionState`
|
||||||
|
|
||||||
|
Triggered when the application changes occlusion state
|
||||||
|
|
||||||
|
#### `events.Mac.ApplicationDidChangeScreenParameters`
|
||||||
|
|
||||||
|
Triggered when the application changes screen parameters
|
||||||
|
|
||||||
|
#### `events.Mac.ApplicationDidChangeStatusBarFrame`
|
||||||
|
|
||||||
|
Triggered when the application changes status bar frame
|
||||||
|
|
||||||
|
#### `events.Mac.ApplicationDidChangeStatusBarOrientation`
|
||||||
|
|
||||||
|
Triggered when the application changes status bar orientation
|
||||||
|
|
||||||
|
#### `events.Mac.ApplicationDidFinishLaunching`
|
||||||
|
|
||||||
|
Triggered when the application finishes launching
|
||||||
|
|
||||||
|
#### `events.Mac.ApplicationDidResignActiveNotification`
|
||||||
|
|
||||||
|
Triggered when the application is no longer active
|
||||||
|
|
||||||
|
#### `events.Mac.ApplicationDidHide`
|
||||||
|
|
||||||
|
Triggered when the application is hidden
|
||||||
|
|
||||||
|
#### `events.Mac.ApplicationDidUpdate`
|
||||||
|
|
||||||
|
Triggered when the application updates
|
||||||
|
|
||||||
|
#### `events.Mac.ApplicationWillBecomeActive`
|
||||||
|
|
||||||
|
Triggered when the application is about to become active
|
||||||
|
|
||||||
|
#### `events.Mac.ApplicationWillFinishLaunching`
|
||||||
|
|
||||||
|
Triggered when the application is about to finish launching
|
||||||
|
|
||||||
|
#### `events.Mac.ApplicationWillHide`
|
||||||
|
|
||||||
|
Triggered when the application is about to hide
|
||||||
|
|
||||||
|
#### `events.Mac.ApplicationWillResignActive`
|
||||||
|
|
||||||
|
Triggered when the application is about to lose focus
|
||||||
|
|
||||||
|
#### `events.Mac.ApplicationWillTerminate`
|
||||||
|
|
||||||
|
Triggered when the application is about to terminate
|
||||||
|
|
||||||
|
#### `events.Mac.ApplicationWillUnhide`
|
||||||
|
|
||||||
|
Triggered when the application is about to unhide
|
||||||
|
|
||||||
|
#### `events.Mac.ApplicationWillUpdate`
|
||||||
|
|
||||||
|
Triggered when the application is about to update
|
||||||
|
|
||||||
|
#### `events.Mac.ApplicationDidChangeTheme`
|
||||||
|
|
||||||
|
Triggered when the application changes theme
|
||||||
|
|
||||||
|
#### `events.Mac.MenuWillOpen`
|
||||||
|
|
||||||
|
Triggered when the menu is about to open
|
||||||
|
|
||||||
|
#### `events.Mac.MenuDidOpen`
|
||||||
|
|
||||||
|
Triggered when the menu opens
|
||||||
|
|
||||||
|
#### `events.Mac.MenuDidClose`
|
||||||
|
|
||||||
|
Triggered when the menu closes
|
||||||
|
|
||||||
|
#### `events.Mac.MenuWillSendAction`
|
||||||
|
|
||||||
|
Triggered when the menu is about to send an action
|
||||||
|
|
||||||
|
#### `events.Mac.MenuDidSendAction`
|
||||||
|
|
||||||
|
Triggered when the menu sends an action
|
||||||
|
|
||||||
|
#### `events.Mac.MenuWillHighlightItem`
|
||||||
|
|
||||||
|
Triggered when the menu is about to highlight an item
|
||||||
|
|
||||||
|
#### `events.Mac.MenuDidHighlightItem`
|
||||||
|
|
||||||
|
Triggered when the menu highlights an item
|
||||||
|
|
||||||
|
#### `events.Mac.MenuWillDisplayItem`
|
||||||
|
|
||||||
|
Triggered when the menu is about to display an item
|
||||||
|
|
||||||
|
#### `events.Mac.MenuDidDisplayItem`
|
||||||
|
|
||||||
|
Triggered when the menu displays an item
|
||||||
|
|
||||||
|
#### `events.Mac.MenuWillAddItem`
|
||||||
|
|
||||||
|
Triggered when the menu is about to add an item
|
||||||
|
|
||||||
|
#### `events.Mac.MenuDidAddItem`
|
||||||
|
|
||||||
|
Triggered when the menu adds an item
|
||||||
|
|
||||||
|
#### `events.Mac.MenuWillRemoveItem`
|
||||||
|
|
||||||
|
Triggered when the menu is about to remove an item
|
||||||
|
|
||||||
|
#### `events.Mac.MenuDidRemoveItem`
|
||||||
|
|
||||||
|
Triggered when the menu removes an item
|
||||||
|
|
||||||
|
#### `events.Mac.MenuWillBeginTracking`
|
||||||
|
|
||||||
|
Triggered when the menu is about to begin tracking
|
||||||
|
|
||||||
|
#### `events.Mac.MenuDidBeginTracking`
|
||||||
|
|
||||||
|
Triggered when the menu begins tracking
|
||||||
|
|
||||||
|
#### `events.Mac.MenuWillEndTracking`
|
||||||
|
|
||||||
|
Triggered when the menu is about to end tracking
|
||||||
|
|
||||||
|
#### `events.Mac.MenuDidEndTracking`
|
||||||
|
|
||||||
|
Triggered when the menu ends tracking
|
||||||
|
|
||||||
|
#### `events.Mac.MenuWillUpdate`
|
||||||
|
|
||||||
|
Triggered when the menu is about to update
|
||||||
|
|
||||||
|
#### `events.Mac.MenuDidUpdate`
|
||||||
|
|
||||||
|
Triggered when the menu updates
|
||||||
|
|
||||||
|
#### `events.Mac.MenuWillPopUp`
|
||||||
|
|
||||||
|
Triggered when the menu is about to pop up
|
||||||
|
|
||||||
|
#### `events.Mac.MenuDidPopUp`
|
||||||
|
|
||||||
|
Triggered when the menu pops up
|
||||||
|
|
||||||
|
#### `events.Mac.MenuWillSendActionToItem`
|
||||||
|
|
||||||
|
Triggered when the menu is about to send an action to an item
|
||||||
|
|
||||||
|
#### `events.Mac.MenuDidSendActionToItem`
|
||||||
|
|
||||||
|
Triggered when the menu sends an action to an item
|
||||||
|
|
||||||
|
##### Window Events
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidBecomeKey`
|
||||||
|
|
||||||
|
Triggered when the window becomes key
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidBecomeMain`
|
||||||
|
|
||||||
|
Triggered when the window becomes main
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidBeginSheet`
|
||||||
|
|
||||||
|
Triggered when the window begins a sheet
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidChangeAlpha`
|
||||||
|
|
||||||
|
Triggered when the window alpha changes
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidChangeBackingLocation`
|
||||||
|
|
||||||
|
Triggered when the window backing location changes
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidChangeBackingProperties`
|
||||||
|
|
||||||
|
Triggered when the window backing properties change
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidChangeCollectionBehavior`
|
||||||
|
|
||||||
|
Triggered when the window collection behavior changes
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidChangeEffectiveAppearance`
|
||||||
|
|
||||||
|
Triggered when the window effective appearance changes
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidChangeOcclusionState`
|
||||||
|
|
||||||
|
Triggered when the window occlusion state changes
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidChangeOrderingMode`
|
||||||
|
|
||||||
|
Triggered when the window ordering mode changes
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidChangeScreen`
|
||||||
|
|
||||||
|
Triggered when the window screen changes
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidChangeScreenParameters`
|
||||||
|
|
||||||
|
Triggered when the window screen parameters change
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidChangeScreenProfile`
|
||||||
|
|
||||||
|
Triggered when the window screen profile changes
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidChangeScreenSpace`
|
||||||
|
|
||||||
|
Triggered when the window screen space changes
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidChangeScreenSpaceProperties`
|
||||||
|
|
||||||
|
Triggered when the window screen space properties change
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidChangeSharingType`
|
||||||
|
|
||||||
|
Triggered when the window sharing type changes
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidChangeSpace`
|
||||||
|
|
||||||
|
Triggered when the window space changes
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidChangeSpaceOrderingMode`
|
||||||
|
|
||||||
|
Triggered when the window space ordering mode changes
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidChangeTitle`
|
||||||
|
|
||||||
|
Triggered when the window title changes
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidChangeToolbar`
|
||||||
|
|
||||||
|
Triggered when the window toolbar changes
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidChangeVisibility`
|
||||||
|
|
||||||
|
Triggered when the window visibility changes
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidDeminiaturize`
|
||||||
|
|
||||||
|
Triggered when the window is deminiaturized
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidEndSheet`
|
||||||
|
|
||||||
|
Triggered when the window ends a sheet
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidEnterFullScreen`
|
||||||
|
|
||||||
|
Triggered when the window enters fullscreen
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidEnterVersionBrowser`
|
||||||
|
|
||||||
|
Triggered when the window enters version browser
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidExitFullScreen`
|
||||||
|
|
||||||
|
Triggered when the window exits fullscreen
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidExitVersionBrowser`
|
||||||
|
|
||||||
|
Triggered when the window exits version browser
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidExpose`
|
||||||
|
|
||||||
|
Triggered when the window is exposed
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidFocus`
|
||||||
|
|
||||||
|
Triggered when the window is focused
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidMiniaturize`
|
||||||
|
|
||||||
|
Triggered when the window is miniaturized
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidMove`
|
||||||
|
|
||||||
|
Triggered when the window is moved
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidOrderOffScreen`
|
||||||
|
|
||||||
|
Triggered when the window is ordered off-screen
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidOrderOnScreen`
|
||||||
|
|
||||||
|
Triggered when the window is ordered on screen
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidResignKey`
|
||||||
|
|
||||||
|
Triggered when the window resigns key
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidResignMain`
|
||||||
|
|
||||||
|
Triggered when the window resigns main
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidResize`
|
||||||
|
|
||||||
|
Triggered when the window is resized
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidUpdate`
|
||||||
|
|
||||||
|
Triggered when the window updates
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidUpdateAlpha`
|
||||||
|
|
||||||
|
Triggered when the window alpha updates
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidUpdateCollectionBehavior`
|
||||||
|
|
||||||
|
Triggered when the window collection behavior updates
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidUpdateCollectionProperties`
|
||||||
|
|
||||||
|
Triggered when the window collection properties update
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidUpdateShadow`
|
||||||
|
|
||||||
|
Triggered when the window shadow updates
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidUpdateTitle`
|
||||||
|
|
||||||
|
Triggered when the window title updates
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidUpdateToolbar`
|
||||||
|
|
||||||
|
Triggered when the window toolbar updates
|
||||||
|
|
||||||
|
#### `events.Mac.WindowDidUpdateVisibility`
|
||||||
|
|
||||||
|
Triggered when the window visibility updates
|
||||||
|
|
||||||
|
#### `events.Mac.WindowShouldClose`
|
||||||
|
|
||||||
|
Triggered when the window should close
|
||||||
|
|
||||||
|
#### `events.Mac.WindowWillBecomeKey`
|
||||||
|
|
||||||
|
Triggered when the window will become key
|
||||||
|
|
||||||
|
#### `events.Mac.WindowWillBecomeMain`
|
||||||
|
|
||||||
|
Triggered when the window will become main
|
||||||
|
|
||||||
|
#### `events.Mac.WindowWillBeginSheet`
|
||||||
|
|
||||||
|
Triggered when the window will begin a sheet
|
||||||
|
|
||||||
|
#### `events.Mac.WindowWillChangeOrderingMode`
|
||||||
|
|
||||||
|
Triggered when the window will change ordering mode
|
||||||
|
|
||||||
|
#### `events.Mac.WindowWillClose`
|
||||||
|
|
||||||
|
Triggered when the window will close
|
||||||
|
|
||||||
|
#### `events.Mac.WindowWillDeminiaturize`
|
||||||
|
|
||||||
|
Triggered when the window will deminiaturize
|
||||||
|
|
||||||
|
#### `events.Mac.WindowWillEnterFullScreen`
|
||||||
|
|
||||||
|
Triggered when the window will enter fullscreen
|
||||||
|
|
||||||
|
#### `events.Mac.WindowWillEnterVersionBrowser`
|
||||||
|
|
||||||
|
Triggered when the window will enter version browser
|
||||||
|
|
||||||
|
#### `events.Mac.WindowWillExitFullScreen`
|
||||||
|
|
||||||
|
Triggered when the window will exit fullscreen
|
||||||
|
|
||||||
|
#### `events.Mac.WindowWillExitVersionBrowser`
|
||||||
|
|
||||||
|
Triggered when the window will exit version browser
|
||||||
|
|
||||||
|
#### `events.Mac.WindowWillFocus`
|
||||||
|
|
||||||
|
Triggered when the window will focus
|
||||||
|
|
||||||
|
#### `events.Mac.WindowWillMiniaturize`
|
||||||
|
|
||||||
|
Triggered when the window will miniaturize
|
||||||
|
|
||||||
|
#### `events.Mac.WindowWillMove`
|
||||||
|
|
||||||
|
Triggered when the window will move
|
||||||
|
|
||||||
|
#### `events.Mac.WindowWillOrderOffScreen`
|
||||||
|
|
||||||
|
Triggered when the window will order off-screen
|
||||||
|
|
||||||
|
#### `events.Mac.WindowWillOrderOnScreen`
|
||||||
|
|
||||||
|
Triggered when the window will order on screen
|
||||||
|
|
||||||
|
#### `events.Mac.WindowWillResignMain`
|
||||||
|
|
||||||
|
Triggered when the window will resign main
|
||||||
|
|
||||||
|
#### `events.Mac.WindowWillResize`
|
||||||
|
|
||||||
|
Triggered when the window will resize
|
||||||
|
|
||||||
|
#### `events.Mac.WindowWillUnfocus`
|
||||||
|
|
||||||
|
Triggered when the window will unfocus
|
||||||
|
|
||||||
|
#### `events.Mac.WindowWillUpdate`
|
||||||
|
|
||||||
|
Triggered when the window will update
|
||||||
|
|
||||||
|
#### `events.Mac.WindowWillUpdateAlpha`
|
||||||
|
|
||||||
|
Triggered when the window will update alpha
|
||||||
|
|
||||||
|
#### `events.Mac.WindowWillUpdateCollectionBehavior`
|
||||||
|
|
||||||
|
Triggered when the window will update collection behavior
|
||||||
|
|
||||||
|
#### `events.Mac.WindowWillUpdateCollectionProperties`
|
||||||
|
|
||||||
|
Triggered when the window will update collection properties
|
||||||
|
|
||||||
|
#### `events.Mac.WindowWillUpdateShadow`
|
||||||
|
|
||||||
|
Triggered when the window will update shadow
|
||||||
|
|
||||||
|
#### `events.Mac.WindowWillUpdateTitle`
|
||||||
|
|
||||||
|
Triggered when the window will update title
|
||||||
|
|
||||||
|
#### `events.Mac.WindowWillUpdateToolbar`
|
||||||
|
|
||||||
|
Triggered when the window will update toolbar
|
||||||
|
|
||||||
|
#### `events.Mac.WindowWillUpdateVisibility`
|
||||||
|
|
||||||
|
Triggered when the window will update visibility
|
||||||
|
|
||||||
|
#### `events.Mac.WindowWillUseStandardFrame`
|
||||||
|
|
||||||
|
Triggered when the window will use standard frame
|
||||||
|
|
||||||
|
#### `events.Mac.WebviewDidStartProvisionalNavigation`
|
||||||
|
|
||||||
|
Triggered when the webview starts a provisional navigation
|
||||||
|
|
||||||
|
#### `events.Mac.WebviewDidReceiveServerRedirectForProvisionalNavigation`
|
||||||
|
|
||||||
|
Triggered when the webview receives a server redirect for a provisional
|
||||||
|
navigation
|
||||||
|
|
||||||
|
#### `events.Mac.WebviewDidFinishNavigation`
|
||||||
|
|
||||||
|
Triggered when the webview finishes navigation
|
||||||
|
|
||||||
|
#### `events.Mac.WebviewDidCommitNavigation`
|
||||||
|
|
||||||
|
Triggered when the webview commits navigation
|
||||||
|
|
||||||
|
#### `events.Mac.WindowFileDraggingEntered`
|
||||||
|
|
||||||
|
Triggered when files are dragged into the window
|
||||||
|
|
||||||
|
#### `events.Mac.WindowFileDraggingPerformed`
|
||||||
|
|
||||||
|
Triggered when files are dragged in the window
|
||||||
|
|
||||||
|
#### `events.Mac.WindowFileDraggingExited`
|
||||||
|
|
||||||
|
Triggered when files are dragged out of the window
|
112
docs/src/content/docs/api/events_windows.md
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
---
|
||||||
|
title: Events (Windows)
|
||||||
|
tableOfContents:
|
||||||
|
maxHeadingLevel: 4
|
||||||
|
sidebar:
|
||||||
|
order: 110
|
||||||
|
---
|
||||||
|
|
||||||
|
## Application Events
|
||||||
|
|
||||||
|
#### `events.Windows.ApplicationStarted`
|
||||||
|
|
||||||
|
Triggered when the application starts
|
||||||
|
|
||||||
|
#### `events.Windows.SystemThemeChanged`
|
||||||
|
|
||||||
|
Triggered when the system theme changes
|
||||||
|
|
||||||
|
#### `events.Windows.APMPowerStatusChange`
|
||||||
|
|
||||||
|
Triggered when the system power status changes
|
||||||
|
|
||||||
|
#### `events.Windows.APMSuspend`
|
||||||
|
|
||||||
|
Triggered when the system suspends
|
||||||
|
|
||||||
|
#### `events.Windows.APMResumeAutomatic`
|
||||||
|
|
||||||
|
Triggered when the system resumes after a sleep
|
||||||
|
|
||||||
|
#### `events.Windows.APMResumeSuspend`
|
||||||
|
|
||||||
|
Triggered when the system resumes after a suspend and resume was triggered by
|
||||||
|
the user
|
||||||
|
|
||||||
|
## Window Events
|
||||||
|
|
||||||
|
#### `events.Windows.WebviewNavigationCompleted`
|
||||||
|
|
||||||
|
Triggered when the webview navigation is completed
|
||||||
|
|
||||||
|
#### `events.Windows.WindowInactive`
|
||||||
|
|
||||||
|
Triggered when the window is inactive
|
||||||
|
|
||||||
|
#### `events.Windows.WindowActive`
|
||||||
|
|
||||||
|
Triggered when the window is active
|
||||||
|
|
||||||
|
#### `events.Windows.ClickActive`
|
||||||
|
|
||||||
|
Triggered when the window is activated via a click
|
||||||
|
|
||||||
|
#### `events.Windows.MaximiseActive`
|
||||||
|
|
||||||
|
Triggered when the window is maximised
|
||||||
|
|
||||||
|
#### `events.Windows.UnMaximise`
|
||||||
|
|
||||||
|
Triggered when the window is unmaximised
|
||||||
|
|
||||||
|
#### `events.Windows.Fullscreen`
|
||||||
|
|
||||||
|
Triggered when the window is set to fullscreen
|
||||||
|
|
||||||
|
#### `events.Windows.UnFullscreen`
|
||||||
|
|
||||||
|
Triggered when the window exits fullscreen mode
|
||||||
|
|
||||||
|
#### `events.Windows.WindowRestore`
|
||||||
|
|
||||||
|
Triggered when the window is restored
|
||||||
|
|
||||||
|
#### `events.Windows.WindowMinimise`
|
||||||
|
|
||||||
|
Triggered when the window is minimised
|
||||||
|
|
||||||
|
#### `events.Windows.WindowUnminimise`
|
||||||
|
|
||||||
|
Triggered when the window is minimised
|
||||||
|
|
||||||
|
#### `events.Windows.WindowClose`
|
||||||
|
|
||||||
|
Triggered before the window closes
|
||||||
|
|
||||||
|
#### `events.Windows.WindowSetFocus`
|
||||||
|
|
||||||
|
Triggered when the window gains keyboard focus
|
||||||
|
|
||||||
|
#### `events.Windows.WindowKillFocus`
|
||||||
|
|
||||||
|
Triggered when the window loses keyboard focus
|
||||||
|
|
||||||
|
#### `events.Windows.WindowDragDrop`
|
||||||
|
|
||||||
|
Triggered when files are dropped on the window
|
||||||
|
|
||||||
|
#### `events.Windows.WindowDragEnter`
|
||||||
|
|
||||||
|
Triggered when a drag enters the window
|
||||||
|
|
||||||
|
#### `events.Windows.WindowDragLeave`
|
||||||
|
|
||||||
|
Triggered when a drag leaves the window
|
||||||
|
|
||||||
|
#### `events.Windows.WindowDragOver`
|
||||||
|
|
||||||
|
Triggered when a drag is over the window
|
||||||
|
|
||||||
|
#### `events.Windows.WindowDidMove`
|
||||||
|
|
||||||
|
Triggered after a window has moved
|
58
docs/src/content/docs/api/mainthread.md
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
---
|
||||||
|
title: Main Thread Functions
|
||||||
|
sidebar:
|
||||||
|
order: 170
|
||||||
|
---
|
||||||
|
|
||||||
|
These methods are utility functions to run code on the main thread. This is
|
||||||
|
required when you want to run custom code on the UI thread.
|
||||||
|
|
||||||
|
### InvokeSync
|
||||||
|
|
||||||
|
API: `InvokeSync(fn func())`
|
||||||
|
|
||||||
|
This function runs the passed function (`fn`) synchronously. It uses a WaitGroup
|
||||||
|
(`wg`) to ensure that the main thread waits for the `fn` function to finish
|
||||||
|
before it continues. If a panic occurs inside `fn`, it will be passed to the
|
||||||
|
handler function `PanicHandler`, defined in the application options.
|
||||||
|
|
||||||
|
### InvokeSyncWithResult
|
||||||
|
|
||||||
|
API: `InvokeSyncWithResult[T any](fn func() T) (res T)`
|
||||||
|
|
||||||
|
This function works similarly to `InvokeSync(fn func())`, however, it yields a
|
||||||
|
result. Use this for calling any function with a single return.
|
||||||
|
|
||||||
|
### InvokeSyncWithError
|
||||||
|
|
||||||
|
API: `InvokeSyncWithError(fn func() error) (err error)`
|
||||||
|
|
||||||
|
This function runs `fn` synchronously and returns any error that `fn` produces.
|
||||||
|
Note that this function will recover from a panic if one occurs during `fn`'s
|
||||||
|
execution.
|
||||||
|
|
||||||
|
### InvokeSyncWithResultAndError
|
||||||
|
|
||||||
|
API:
|
||||||
|
`InvokeSyncWithResultAndError[T any](fn func() (T, error)) (res T, err error)`
|
||||||
|
|
||||||
|
This function runs `fn` synchronously and returns both a result of type `T` and
|
||||||
|
an error.
|
||||||
|
|
||||||
|
### InvokeAsync
|
||||||
|
|
||||||
|
API: `InvokeAsync(fn func())`
|
||||||
|
|
||||||
|
This function runs `fn` asynchronously. It runs the given function on the main
|
||||||
|
thread. If a panic occurs inside `fn`, it will be passed to the handler function
|
||||||
|
`PanicHandler`, defined in the application options.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
:::tip
|
||||||
|
|
||||||
|
These functions will block execution until `fn` has finished. It's critical to
|
||||||
|
ensure that `fn` doesn't block. If you need to run a function that blocks, use
|
||||||
|
`InvokeAsync` instead.
|
||||||
|
|
||||||
|
:::
|
73
docs/src/content/docs/api/menu.md
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
---
|
||||||
|
title: Menu
|
||||||
|
sidebar:
|
||||||
|
order: 160
|
||||||
|
---
|
||||||
|
|
||||||
|
Menus can be created and added to the application. They can be used to create
|
||||||
|
context menus, system tray menus and application menus.
|
||||||
|
|
||||||
|
To create a new menu, call:
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Create a new menu
|
||||||
|
menu := app.NewMenu()
|
||||||
|
```
|
||||||
|
|
||||||
|
The following operations are then available on the `Menu` type:
|
||||||
|
|
||||||
|
### Add
|
||||||
|
|
||||||
|
API: `Add(label string) *MenuItem`
|
||||||
|
|
||||||
|
This method takes a `label` of type `string` as an input and adds a new
|
||||||
|
`MenuItem` with the given label to the menu. It returns the `MenuItem` added.
|
||||||
|
|
||||||
|
### AddSeparator
|
||||||
|
|
||||||
|
API: `AddSeparator()`
|
||||||
|
|
||||||
|
This method adds a new separator `MenuItem` to the menu.
|
||||||
|
|
||||||
|
### AddCheckbox
|
||||||
|
|
||||||
|
API: `AddCheckbox(label string, enabled bool) *MenuItem`
|
||||||
|
|
||||||
|
This method takes a `label` of type `string` and `enabled` of type `bool` as
|
||||||
|
inputs and adds a new checkbox `MenuItem` with the given label and enabled state
|
||||||
|
to the menu. It returns the `MenuItem` added.
|
||||||
|
|
||||||
|
### AddRadio
|
||||||
|
|
||||||
|
API: `AddRadio(label string, enabled bool) *MenuItem`
|
||||||
|
|
||||||
|
This method takes a `label` of type `string` and `enabled` of type `bool` as
|
||||||
|
inputs and adds a new radio `MenuItem` with the given label and enabled state to
|
||||||
|
the menu. It returns the `MenuItem` added.
|
||||||
|
|
||||||
|
### Update
|
||||||
|
|
||||||
|
API: `Update()`
|
||||||
|
|
||||||
|
This method processes any radio groups and updates the menu if a menu
|
||||||
|
implementation is not initialized.
|
||||||
|
|
||||||
|
### AddSubmenu
|
||||||
|
|
||||||
|
API: `AddSubmenu(s string) *Menu`
|
||||||
|
|
||||||
|
This method takes a `s` of type `string` as input and adds a new submenu
|
||||||
|
`MenuItem` with the given label to the menu. It returns the submenu added.
|
||||||
|
|
||||||
|
### AddRole
|
||||||
|
|
||||||
|
API: `AddRole(role Role) *Menu`
|
||||||
|
|
||||||
|
This method takes `role` of type `Role` as input, adds it to the menu if it is
|
||||||
|
not `nil` and returns the `Menu`.
|
||||||
|
|
||||||
|
### SetLabel
|
||||||
|
|
||||||
|
API: `SetLabel(label string)`
|
||||||
|
|
||||||
|
This method sets the `label` of the `Menu`.
|
116
docs/src/content/docs/api/systray.md
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
---
|
||||||
|
title: System Tray
|
||||||
|
sidebar:
|
||||||
|
order: 150
|
||||||
|
---
|
||||||
|
|
||||||
|
The system tray houses notification area on a desktop environment, which can
|
||||||
|
contain both icons of currently-running applications and specific system
|
||||||
|
notifications.
|
||||||
|
|
||||||
|
You create a system tray by calling `app.NewSystemTray()`:
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Create a new system tray
|
||||||
|
tray := app.NewSystemTray()
|
||||||
|
```
|
||||||
|
|
||||||
|
The following methods are available on the `SystemTray` type:
|
||||||
|
|
||||||
|
### SetLabel
|
||||||
|
|
||||||
|
API: `SetLabel(label string)`
|
||||||
|
|
||||||
|
The `SetLabel` method sets the tray's label.
|
||||||
|
|
||||||
|
### Label
|
||||||
|
|
||||||
|
API: `Label() string`
|
||||||
|
|
||||||
|
The `Label` method retrieves the tray's label.
|
||||||
|
|
||||||
|
### PositionWindow
|
||||||
|
|
||||||
|
API: `PositionWindow(*WebviewWindow, offset int) error`
|
||||||
|
|
||||||
|
The `PositionWindow` method calls both `AttachWindow` and `WindowOffset`
|
||||||
|
methods.
|
||||||
|
|
||||||
|
### SetIcon
|
||||||
|
|
||||||
|
API: `SetIcon(icon []byte) *SystemTray`
|
||||||
|
|
||||||
|
The `SetIcon` method sets the system tray's icon.
|
||||||
|
|
||||||
|
### SetDarkModeIcon
|
||||||
|
|
||||||
|
API: `SetDarkModeIcon(icon []byte) *SystemTray`
|
||||||
|
|
||||||
|
The `SetDarkModeIcon` method sets the system tray's icon when in dark mode.
|
||||||
|
|
||||||
|
### SetMenu
|
||||||
|
|
||||||
|
API: `SetMenu(menu *Menu) *SystemTray`
|
||||||
|
|
||||||
|
The `SetMenu` method sets the system tray's menu.
|
||||||
|
|
||||||
|
### Destroy
|
||||||
|
|
||||||
|
API: `Destroy()`
|
||||||
|
|
||||||
|
The `Destroy` method destroys the system tray instance.
|
||||||
|
|
||||||
|
### OnClick
|
||||||
|
|
||||||
|
API: `OnClick(handler func()) *SystemTray`
|
||||||
|
|
||||||
|
The `OnClick` method sets the function to execute when the tray icon is clicked.
|
||||||
|
|
||||||
|
### OnRightClick
|
||||||
|
|
||||||
|
API: `OnRightClick(handler func()) *SystemTray`
|
||||||
|
|
||||||
|
The `OnRightClick` method sets the function to execute when right-clicking the
|
||||||
|
tray icon.
|
||||||
|
|
||||||
|
### OnDoubleClick
|
||||||
|
|
||||||
|
API: `OnDoubleClick(handler func()) *SystemTray`
|
||||||
|
|
||||||
|
The `OnDoubleClick` method sets the function to execute when double-clicking the
|
||||||
|
tray icon.
|
||||||
|
|
||||||
|
### OnRightDoubleClick
|
||||||
|
|
||||||
|
API: `OnRightDoubleClick(handler func()) *SystemTray`
|
||||||
|
|
||||||
|
The `OnRightDoubleClick` method sets the function to execute when right
|
||||||
|
double-clicking the tray icon.
|
||||||
|
|
||||||
|
### AttachWindow
|
||||||
|
|
||||||
|
API: `AttachWindow(window *WebviewWindow) *SystemTray`
|
||||||
|
|
||||||
|
The `AttachWindow` method attaches a window to the system tray. The window will
|
||||||
|
be shown when the system tray icon is clicked.
|
||||||
|
|
||||||
|
### WindowOffset
|
||||||
|
|
||||||
|
API: `WindowOffset(offset int) *SystemTray`
|
||||||
|
|
||||||
|
The `WindowOffset` method sets the gap in pixels between the system tray and the
|
||||||
|
window.
|
||||||
|
|
||||||
|
### WindowDebounce
|
||||||
|
|
||||||
|
API: `WindowDebounce(debounce time.Duration) *SystemTray`
|
||||||
|
|
||||||
|
The `WindowDebounce` method sets a debounce time. In the context of Windows,
|
||||||
|
this is used to specify how long to wait before responding to a mouse up event
|
||||||
|
on the notification icon.
|
||||||
|
|
||||||
|
### OpenMenu
|
||||||
|
|
||||||
|
API: `OpenMenu()`
|
||||||
|
|
||||||
|
The `OpenMenu` method opens the menu associated with the system tray.
|
118
docs/src/content/docs/api/window.md
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
---
|
||||||
|
title: Window
|
||||||
|
sidebar:
|
||||||
|
order: 80
|
||||||
|
---
|
||||||
|
|
||||||
|
To create a window, use
|
||||||
|
[Application.NewWebviewWindow](/api/application_window#newwebviewwindow) or
|
||||||
|
[Application.NewWebviewWindowWithOptions](/api/application_window#newwebviewwindowwithoptions).
|
||||||
|
The former creates a window with default options, while the latter allows you to
|
||||||
|
specify custom options.
|
||||||
|
|
||||||
|
These methods are callable on the returned WebviewWindow object:
|
||||||
|
|
||||||
|
### SetTitle
|
||||||
|
|
||||||
|
API: `SetTitle(title string) *WebviewWindow`
|
||||||
|
|
||||||
|
This method updates the window title to the provided string. It returns the
|
||||||
|
WebviewWindow object, allowing for method chaining.
|
||||||
|
|
||||||
|
### Name
|
||||||
|
|
||||||
|
API: `Name() string`
|
||||||
|
|
||||||
|
This function returns the name of the WebviewWindow.
|
||||||
|
|
||||||
|
### SetSize
|
||||||
|
|
||||||
|
API: `SetSize(width, height int) *WebviewWindow`
|
||||||
|
|
||||||
|
This method sets the size of the WebviewWindow to the provided width and height
|
||||||
|
parameters. If the dimensions provided exceed the constraints, they are adjusted
|
||||||
|
appropriately.
|
||||||
|
|
||||||
|
### SetAlwaysOnTop
|
||||||
|
|
||||||
|
API: `SetAlwaysOnTop(b bool) *WebviewWindow`
|
||||||
|
|
||||||
|
This function sets the window to stay on top based on the boolean flag provided.
|
||||||
|
|
||||||
|
### Show
|
||||||
|
|
||||||
|
API: `Show() *WebviewWindow`
|
||||||
|
|
||||||
|
`Show` method is used to make the window visible. If the window is not running,
|
||||||
|
it first invokes the `run` method to start the window and then makes it visible.
|
||||||
|
|
||||||
|
### Hide
|
||||||
|
|
||||||
|
API: `Hide() *WebviewWindow`
|
||||||
|
|
||||||
|
`Hide` method is used to hide the window. It sets the hidden status of the
|
||||||
|
window to true and emits the window hide event.
|
||||||
|
|
||||||
|
### SetURL
|
||||||
|
|
||||||
|
API: `SetURL(s string) *WebviewWindow`
|
||||||
|
|
||||||
|
`SetURL` method is used to set the URL of the window to the given URL string.
|
||||||
|
|
||||||
|
### SetZoom
|
||||||
|
|
||||||
|
API: `SetZoom(magnification float64) *WebviewWindow`
|
||||||
|
|
||||||
|
`SetZoom` method sets the zoom level of the window content to the provided
|
||||||
|
magnification level.
|
||||||
|
|
||||||
|
### GetZoom
|
||||||
|
|
||||||
|
API: `GetZoom() float64`
|
||||||
|
|
||||||
|
`GetZoom` function returns the current zoom level of the window content.
|
||||||
|
|
||||||
|
### GetScreen
|
||||||
|
|
||||||
|
API: `GetScreen() (*Screen, error)`
|
||||||
|
|
||||||
|
`GetScreen` method returns the screen on which the window is displayed.
|
||||||
|
|
||||||
|
### SetFrameless
|
||||||
|
|
||||||
|
API: `SetFrameless(frameless bool) *WebviewWindow`
|
||||||
|
|
||||||
|
This function is used to remove the window frame and title bar. It toggles the
|
||||||
|
framelessness of the window according to the boolean value provided (true for
|
||||||
|
frameless, false for framed).
|
||||||
|
|
||||||
|
### RegisterContextMenu
|
||||||
|
|
||||||
|
API: `RegisterContextMenu(name string, menu *Menu)`
|
||||||
|
|
||||||
|
This function is used to register a context menu and assigns it the given name.
|
||||||
|
|
||||||
|
### NativeWindowHandle
|
||||||
|
|
||||||
|
API: `NativeWindowHandle() (uintptr, error)`
|
||||||
|
|
||||||
|
This function is used to fetch the platform native window handle for the window.
|
||||||
|
|
||||||
|
### Focus
|
||||||
|
|
||||||
|
API: `Focus()`
|
||||||
|
|
||||||
|
This function is used to focus the window.
|
||||||
|
|
||||||
|
### SetEnabled
|
||||||
|
|
||||||
|
API: `SetEnabled(enabled bool)`
|
||||||
|
|
||||||
|
This function is used to enable/disable the window based on the provided boolean
|
||||||
|
value.
|
||||||
|
|
||||||
|
### SetPosition
|
||||||
|
|
||||||
|
API: `SetPosition(x int, y int)`
|
||||||
|
|
||||||
|
This function sets the absolute position of the window in the screen.
|
206
docs/src/content/docs/blog/2021-09-27-v2-beta1-release-notes.md
Normal file
@ -0,0 +1,206 @@
|
|||||||
|
---
|
||||||
|
slug: blog/wails-v2-beta-for-windows
|
||||||
|
title: Wails v2 Beta for Windows
|
||||||
|
authors: [leaanthony]
|
||||||
|
tags: [wails, v2]
|
||||||
|
date: 2021-09-27
|
||||||
|
---
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
When I first announced Wails on Reddit, just over 2 years ago from a train in
|
||||||
|
Sydney, I did not expect it to get much attention. A few days later, a prolific
|
||||||
|
tech vlogger released a tutorial video, gave it a positive review and from that
|
||||||
|
point on, interest in the project has skyrocketed.
|
||||||
|
|
||||||
|
It was clear that people were excited about adding web frontends to their Go
|
||||||
|
projects, and almost immediately pushed the project beyond the proof of concept
|
||||||
|
that I had created. At the time, Wails used the
|
||||||
|
[webview](https://github.com/webview/webview) project to handle the frontend,
|
||||||
|
and the only option for Windows was the IE11 renderer. Many bug reports were
|
||||||
|
rooted in this limitation: poor JavaScript/CSS support and no dev tools to debug
|
||||||
|
it. This was a frustrating development experience but there wasn't much that
|
||||||
|
could have been done to rectify it.
|
||||||
|
|
||||||
|
For a long time, I'd firmly believed that Microsoft would eventually have to
|
||||||
|
sort out their browser situation. The world was moving on, frontend development
|
||||||
|
was booming and IE wasn't cutting it. When Microsoft announced the move to using
|
||||||
|
Chromium as the basis for their new browser direction, I knew it was only a
|
||||||
|
matter of time until Wails could use it, and move the Windows developer
|
||||||
|
experience to the next level.
|
||||||
|
|
||||||
|
Today, I am pleased to announce: **Wails v2 Beta for Windows**! There's a huge
|
||||||
|
amount to unpack in this release, so grab a drink, take a seat and we'll
|
||||||
|
begin...
|
||||||
|
|
||||||
|
### No CGO Dependency!
|
||||||
|
|
||||||
|
No, I'm not joking: _No_ _CGO_ _dependency_ 🤯! The thing about Windows is that,
|
||||||
|
unlike MacOS and Linux, it doesn't come with a default compiler. In addition,
|
||||||
|
CGO requires a mingw compiler and there's a ton of different installation
|
||||||
|
options. Removing the CGO requirement has massively simplified setup, as well as
|
||||||
|
making debugging an awful lot easier. Whilst I have put a fair bit of effort in
|
||||||
|
getting this working, the majority of the credit should go to
|
||||||
|
[John Chadwick](https://github.com/jchv) for not only starting a couple of
|
||||||
|
projects to make this possible, but also being open to someone taking those
|
||||||
|
projects and building on them. Credit also to
|
||||||
|
[Tad Vizbaras](https://github.com/tadvi) whose
|
||||||
|
[winc](https://github.com/tadvi/winc) project started me down this path.
|
||||||
|
|
||||||
|
### WebView2 Chromium Renderer
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Finally, Windows developers get a first class rendering engine for their
|
||||||
|
applications! Gone are the days of contorting your frontend code to work on
|
||||||
|
Windows. On top of that, you get a first-class developer tools experience!
|
||||||
|
|
||||||
|
The WebView2 component does, however, have a requirement to have the
|
||||||
|
`WebView2Loader.dll` sitting alongside the binary. This makes distribution just
|
||||||
|
that little bit more painful than we gophers are used to. All solutions and
|
||||||
|
libraries (that I know of) that use WebView2 have this dependency.
|
||||||
|
|
||||||
|
However, I'm really excited to announce that Wails applications _have no such
|
||||||
|
requirement_! Thanks to the wizardry of
|
||||||
|
[John Chadwick](https://github.com/jchv), we are able to bundle this dll inside
|
||||||
|
the binary and get Windows to load it as if it were present on disk.
|
||||||
|
|
||||||
|
Gophers rejoice! The single binary dream lives on!
|
||||||
|
|
||||||
|
### New Features
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
There were a lot of requests for native menu support. Wails has finally got you
|
||||||
|
covered. Application menus are now available and include support for most native
|
||||||
|
menu features. This includes standard menu items, checkboxes, radio groups,
|
||||||
|
submenus and separators.
|
||||||
|
|
||||||
|
There were a huge number of requests in v1 for the ability to have greater
|
||||||
|
control of the window itself. I'm happy to announce that there's new runtime
|
||||||
|
APIs specifically for this. It's feature-rich and supports multi-monitor
|
||||||
|
configurations. There is also an improved dialogs API: Now, you can have modern,
|
||||||
|
native dialogs with rich configuration to cater for all your dialog needs.
|
||||||
|
|
||||||
|
There is now the option to generate IDE configuration along with your project.
|
||||||
|
This means that if you open your project in a supported IDE, it will already be
|
||||||
|
configured for building and debugging your application. Currently VSCode is
|
||||||
|
supported but we hope to support other IDEs such as Goland soon.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### No requirement to bundle assets
|
||||||
|
|
||||||
|
A huge pain-point of v1 was the need to condense your entire application down to
|
||||||
|
single JS & CSS files. I'm happy to announce that for v2, there is no
|
||||||
|
requirement to bundle assets, in any way, shape or form. Want to load a local
|
||||||
|
image? Use an `<img>` tag with a local src path. Want to use a cool font? Copy
|
||||||
|
it in and add the path to it in your CSS.
|
||||||
|
|
||||||
|
> Wow, that sounds like a webserver...
|
||||||
|
|
||||||
|
Yes, it works just like a webserver, except it isn't.
|
||||||
|
|
||||||
|
> So how do I include my assets?
|
||||||
|
|
||||||
|
You just pass a single `embed.FS` that contains all your assets into your
|
||||||
|
application configuration. They don't even need to be in the top directory -
|
||||||
|
Wails will just work it out for you.
|
||||||
|
|
||||||
|
### New Development Experience
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Now that assets don't need to be bundled, it's enabled a whole new development
|
||||||
|
experience. The new `wails dev` command will build and run your application, but
|
||||||
|
instead of using the assets in the `embed.FS`, it loads them directly from disk.
|
||||||
|
|
||||||
|
It also provides the additional features:
|
||||||
|
|
||||||
|
- Hot reload - Any changes to frontend assets will trigger and auto reload of
|
||||||
|
the application frontend
|
||||||
|
- Auto rebuild - Any changes to your Go code will rebuild and relaunch your
|
||||||
|
application
|
||||||
|
|
||||||
|
In addition to this, a webserver will start on port 34115. This will serve your
|
||||||
|
application to any browser that connects to it. All connected web browsers will
|
||||||
|
respond to system events like hot reload on asset change.
|
||||||
|
|
||||||
|
In Go, we are used to dealing with structs in our applications. It's often
|
||||||
|
useful to send structs to our frontend and use them as state in our application.
|
||||||
|
In v1, this was a very manual process and a bit of a burden on the developer.
|
||||||
|
I'm happy to announce that in v2, any application run in dev mode will
|
||||||
|
automatically generate TypeScript models for all structs that are input or
|
||||||
|
output parameters to bound methods. This enables seamless interchange of data
|
||||||
|
models between the two worlds.
|
||||||
|
|
||||||
|
In addition to this, another JS module is dynamically generated wrapping all
|
||||||
|
your bound methods. This provides JSDoc for your methods, providing code
|
||||||
|
completion and hinting in your IDE. It's really cool when you get data models
|
||||||
|
auto-imported when hitting tab in an auto-generated module wrapping your Go
|
||||||
|
code!
|
||||||
|
|
||||||
|
### Remote Templates
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Getting an application up and running quickly was always a key goal for the
|
||||||
|
Wails project. When we launched, we tried to cover a lot of the modern
|
||||||
|
frameworks at the time: react, vue and angular. The world of frontend
|
||||||
|
development is very opinionated, fast moving and hard to keep on top of! As a
|
||||||
|
result, we found our base templates getting out of date pretty quickly and this
|
||||||
|
caused a maintenance headache. It also meant that we didn't have cool modern
|
||||||
|
templates for the latest and greatest tech stacks.
|
||||||
|
|
||||||
|
With v2, I wanted to empower the community by giving you the ability to create
|
||||||
|
and host templates yourselves, rather than rely on the Wails project. So now you
|
||||||
|
can create projects using community supported templates! I hope this will
|
||||||
|
inspire developers to create a vibrant ecosystem of project templates. I'm
|
||||||
|
really quite excited about what our developer community can create!
|
||||||
|
|
||||||
|
### In Conclusion
|
||||||
|
|
||||||
|
Wails v2 represents a new foundation for the project. The aim of this release is
|
||||||
|
to get feedback on the new approach, and to iron out any bugs before a full
|
||||||
|
release. Your input would be most welcome. Please direct any feedback to the
|
||||||
|
[v2 Beta](https://github.com/wailsapp/wails/discussions/828) discussion board.
|
||||||
|
|
||||||
|
There were many twists and turns, pivots and u-turns to get to this point. This
|
||||||
|
was due partly to early technical decisions that needed changing, and partly
|
||||||
|
because some core problems we had spent time building workarounds for were fixed
|
||||||
|
upstream: Go’s embed feature is a good example. Fortunately, everything came
|
||||||
|
together at the right time, and today we have the very best solution that we can
|
||||||
|
have. I believe the wait has been worth it - this would not have been possible
|
||||||
|
even 2 months ago.
|
||||||
|
|
||||||
|
I also need to give a huge thank you :pray: to the following people because
|
||||||
|
without them, this release just wouldn't exist:
|
||||||
|
|
||||||
|
- [Misite Bao](https://github.com/misitebao) - An absolute workhorse on the
|
||||||
|
Chinese translations and an incredible bug finder.
|
||||||
|
- [John Chadwick](https://github.com/jchv) - His amazing work on
|
||||||
|
[go-webview2](https://github.com/jchv/go-webview2) and
|
||||||
|
[go-winloader](https://github.com/jchv/go-winloader) have made the Windows
|
||||||
|
version we have today possible.
|
||||||
|
- [Tad Vizbaras](https://github.com/tadvi) - Experimenting with his
|
||||||
|
[winc](https://github.com/tadvi/winc) project was the first step down the path
|
||||||
|
to a pure Go Wails.
|
||||||
|
- [Mat Ryer](https://github.com/matryer) - His support, encouragement and
|
||||||
|
feedback has really helped drive the project forward.
|
||||||
|
|
||||||
|
And finally, I'd like to give a special thank you to all the
|
||||||
|
[project sponsors](/credits#sponsors), including
|
||||||
|
[JetBrains](https://www.jetbrains.com?from=Wails), whose support drives the
|
||||||
|
project in many ways behind the scenes.
|
||||||
|
|
||||||
|
I look forward to seeing what people build with Wails in this next exciting
|
||||||
|
phase of the project!
|
||||||
|
|
||||||
|
Lea.
|
||||||
|
|
||||||
|
PS: MacOS and Linux users need not feel left out - porting to this new
|
||||||
|
foundation is actively under way and most of the hard work has already been
|
||||||
|
done. Hang in there!
|
||||||
|
|
||||||
|
PPS: If you or your company find Wails useful, please consider
|
||||||
|
[sponsoring the project](https://github.com/sponsors/leaanthony). Thanks!
|
166
docs/src/content/docs/blog/2021-11-08-v2-beta2-release-notes.md
Normal file
@ -0,0 +1,166 @@
|
|||||||
|
---
|
||||||
|
slug: blog/wails-v2-beta-for-mac
|
||||||
|
title: Wails v2 Beta for MacOS
|
||||||
|
authors: [leaanthony]
|
||||||
|
tags: [wails, v2]
|
||||||
|
date: 2021-11-08
|
||||||
|
---
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Today marks the first beta release of Wails v2 for Mac! It's taken quite a while
|
||||||
|
to get to this point and I'm hoping that today's release will give you something
|
||||||
|
that's reasonably useful. There have been a number of twists and turns to get to
|
||||||
|
this point and I'm hoping, with your help, to iron out the crinkles and get the
|
||||||
|
Mac port polished for the final v2 release.
|
||||||
|
|
||||||
|
You mean this isn't ready for production? For your use case, it may well be
|
||||||
|
ready, but there are still a number of known issues so keep your eye on
|
||||||
|
[this project board](https://github.com/wailsapp/wails/projects/7) and if you
|
||||||
|
would like to contribute, you'd be very welcome!
|
||||||
|
|
||||||
|
So what's new for Wails v2 for Mac vs v1? Hint: It's pretty similar to the
|
||||||
|
Windows Beta :wink:
|
||||||
|
|
||||||
|
### New Features
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
There were a lot of requests for native menu support. Wails has finally got you
|
||||||
|
covered. Application menus are now available and include support for most native
|
||||||
|
menu features. This includes standard menu items, checkboxes, radio groups,
|
||||||
|
submenus and separators.
|
||||||
|
|
||||||
|
There were a huge number of requests in v1 for the ability to have greater
|
||||||
|
control of the window itself. I'm happy to announce that there's new runtime
|
||||||
|
APIs specifically for this. It's feature-rich and supports multi-monitor
|
||||||
|
configurations. There is also an improved dialogs API: Now, you can have modern,
|
||||||
|
native dialogs with rich configuration to cater for all your dialog needs.
|
||||||
|
|
||||||
|
### Mac Specific Options
|
||||||
|
|
||||||
|
In addition to the normal application options, Wails v2 for Mac also brings some
|
||||||
|
Mac extras:
|
||||||
|
|
||||||
|
- Make your window all funky and translucent, like all the pretty swift apps!
|
||||||
|
- Highly customisable titlebar
|
||||||
|
- We support the NSAppearance options for the application
|
||||||
|
- Simple config to auto-create an "About" menu
|
||||||
|
|
||||||
|
### No requirement to bundle assets
|
||||||
|
|
||||||
|
A huge pain-point of v1 was the need to condense your entire application down to
|
||||||
|
single JS & CSS files. I'm happy to announce that for v2, there is no
|
||||||
|
requirement to bundle assets, in any way, shape or form. Want to load a local
|
||||||
|
image? Use an `<img>` tag with a local src path. Want to use a cool font? Copy
|
||||||
|
it in and add the path to it in your CSS.
|
||||||
|
|
||||||
|
> Wow, that sounds like a webserver...
|
||||||
|
|
||||||
|
Yes, it works just like a webserver, except it isn't.
|
||||||
|
|
||||||
|
> So how do I include my assets?
|
||||||
|
|
||||||
|
You just pass a single `embed.FS` that contains all your assets into your
|
||||||
|
application configuration. They don't even need to be in the top directory -
|
||||||
|
Wails will just work it out for you.
|
||||||
|
|
||||||
|
### New Development Experience
|
||||||
|
|
||||||
|
Now that assets don't need to be bundled, it's enabled a whole new development
|
||||||
|
experience. The new `wails dev` command will build and run your application, but
|
||||||
|
instead of using the assets in the `embed.FS`, it loads them directly from disk.
|
||||||
|
|
||||||
|
It also provides the additional features:
|
||||||
|
|
||||||
|
- Hot reload - Any changes to frontend assets will trigger and auto reload of
|
||||||
|
the application frontend
|
||||||
|
- Auto rebuild - Any changes to your Go code will rebuild and relaunch your
|
||||||
|
application
|
||||||
|
|
||||||
|
In addition to this, a webserver will start on port 34115. This will serve your
|
||||||
|
application to any browser that connects to it. All connected web browsers will
|
||||||
|
respond to system events like hot reload on asset change.
|
||||||
|
|
||||||
|
In Go, we are used to dealing with structs in our applications. It's often
|
||||||
|
useful to send structs to our frontend and use them as state in our application.
|
||||||
|
In v1, this was a very manual process and a bit of a burden on the developer.
|
||||||
|
I'm happy to announce that in v2, any application run in dev mode will
|
||||||
|
automatically generate TypeScript models for all structs that are input or
|
||||||
|
output parameters to bound methods. This enables seamless interchange of data
|
||||||
|
models between the two worlds.
|
||||||
|
|
||||||
|
In addition to this, another JS module is dynamically generated wrapping all
|
||||||
|
your bound methods. This provides JSDoc for your methods, providing code
|
||||||
|
completion and hinting in your IDE. It's really cool when you get data models
|
||||||
|
auto-imported when hitting tab in an auto-generated module wrapping your Go
|
||||||
|
code!
|
||||||
|
|
||||||
|
### Remote Templates
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Getting an application up and running quickly was always a key goal for the
|
||||||
|
Wails project. When we launched, we tried to cover a lot of the modern
|
||||||
|
frameworks at the time: react, vue and angular. The world of frontend
|
||||||
|
development is very opinionated, fast moving and hard to keep on top of! As a
|
||||||
|
result, we found our base templates getting out of date pretty quickly and this
|
||||||
|
caused a maintenance headache. It also meant that we didn't have cool modern
|
||||||
|
templates for the latest and greatest tech stacks.
|
||||||
|
|
||||||
|
With v2, I wanted to empower the community by giving you the ability to create
|
||||||
|
and host templates yourselves, rather than rely on the Wails project. So now you
|
||||||
|
can create projects using community supported templates! I hope this will
|
||||||
|
inspire developers to create a vibrant ecosystem of project templates. I'm
|
||||||
|
really quite excited about what our developer community can create!
|
||||||
|
|
||||||
|
### Native M1 Support
|
||||||
|
|
||||||
|
Thanks to the amazing support of [Mat Ryer](https://github.com/matryer/), the
|
||||||
|
Wails project now supports M1 native builds:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
You can also specify `darwin/amd64` as a target too:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Oh, I almost forgot.... you can also do `darwin/universal`.... :wink:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Cross Compilation to Windows
|
||||||
|
|
||||||
|
Because Wails v2 for Windows is pure Go, you can target Windows builds without
|
||||||
|
docker.
|
||||||
|
|
||||||
|

|
||||||
|
bu
|
||||||
|
|
||||||
|
### WKWebView Renderer
|
||||||
|
|
||||||
|
V1 relied on a (now deprecated) WebView component. V2 uses the most recent
|
||||||
|
WKWebKit component so expect the latest and greatest from Apple.
|
||||||
|
|
||||||
|
### In Conclusion
|
||||||
|
|
||||||
|
As I'd said in the Windows release notes, Wails v2 represents a new foundation
|
||||||
|
for the project. The aim of this release is to get feedback on the new approach,
|
||||||
|
and to iron out any bugs before a full release. Your input would be most
|
||||||
|
welcome! Please direct any feedback to the
|
||||||
|
[v2 Beta](https://github.com/wailsapp/wails/discussions/828) discussion board.
|
||||||
|
|
||||||
|
And finally, I'd like to give a special thank you to all the
|
||||||
|
[project sponsors](/credits#sponsors), including
|
||||||
|
[JetBrains](https://www.jetbrains.com?from=Wails), whose support drive the
|
||||||
|
project in many ways behind the scenes.
|
||||||
|
|
||||||
|
I look forward to seeing what people build with Wails in this next exciting
|
||||||
|
phase of the project!
|
||||||
|
|
||||||
|
Lea.
|
||||||
|
|
||||||
|
PS: Linux users, you're next!
|
||||||
|
|
||||||
|
PPS: If you or your company find Wails useful, please consider
|
||||||
|
[sponsoring the project](https://github.com/sponsors/leaanthony). Thanks!
|
129
docs/src/content/docs/blog/2022-02-22-v2-beta3-release-notes.md
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
---
|
||||||
|
slug: blog/wails-v2-beta-for-linux
|
||||||
|
title: Wails v2 Beta for Linux
|
||||||
|
authors: [leaanthony]
|
||||||
|
tags: [wails, v2]
|
||||||
|
date: 2022-02-22
|
||||||
|
---
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
I'm pleased to finally announce that Wails v2 is now in beta for Linux! It is
|
||||||
|
somewhat ironic that the very first experiments with v2 was on Linux and yet it
|
||||||
|
has ended up as the last release. That being said, the v2 we have today is very
|
||||||
|
different from those first experiments. So without further ado, let's go over
|
||||||
|
the new features:
|
||||||
|
|
||||||
|
### New Features
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
There were a lot of requests for native menu support. Wails has finally got you
|
||||||
|
covered. Application menus are now available and include support for most native
|
||||||
|
menu features. This includes standard menu items, checkboxes, radio groups,
|
||||||
|
submenus and separators.
|
||||||
|
|
||||||
|
There were a huge number of requests in v1 for the ability to have greater
|
||||||
|
control of the window itself. I'm happy to announce that there's new runtime
|
||||||
|
APIs specifically for this. It's feature-rich and supports multi-monitor
|
||||||
|
configurations. There is also an improved dialogs API: Now, you can have modern,
|
||||||
|
native dialogs with rich configuration to cater for all your dialog needs.
|
||||||
|
|
||||||
|
### No requirement to bundle assets
|
||||||
|
|
||||||
|
A huge pain-point of v1 was the need to condense your entire application down to
|
||||||
|
single JS & CSS files. I'm happy to announce that for v2, there is no
|
||||||
|
requirement to bundle assets, in any way, shape or form. Want to load a local
|
||||||
|
image? Use an `<../../../assets/blog-images>` tag with a local src path. Want to
|
||||||
|
use a cool font? Copy it in and add the path to it in your CSS.
|
||||||
|
|
||||||
|
> Wow, that sounds like a webserver...
|
||||||
|
|
||||||
|
Yes, it works just like a webserver, except it isn't.
|
||||||
|
|
||||||
|
> So how do I include my assets?
|
||||||
|
|
||||||
|
You just pass a single `embed.FS` that contains all your assets into your
|
||||||
|
application configuration. They don't even need to be in the top directory -
|
||||||
|
Wails will just work it out for you.
|
||||||
|
|
||||||
|
### New Development Experience
|
||||||
|
|
||||||
|
Now that assets don't need to be bundled, it's enabled a whole new development
|
||||||
|
experience. The new `wails dev` command will build and run your application, but
|
||||||
|
instead of using the assets in the `embed.FS`, it loads them directly from disk.
|
||||||
|
|
||||||
|
It also provides the additional features:
|
||||||
|
|
||||||
|
- Hot reload - Any changes to frontend assets will trigger an auto reload of the
|
||||||
|
application frontend
|
||||||
|
- Auto rebuild - Any changes to your Go code will rebuild and relaunch your
|
||||||
|
application
|
||||||
|
|
||||||
|
In addition to this, a webserver will start on port 34115. This will serve your
|
||||||
|
application to any browser that connects to it. All connected web browsers will
|
||||||
|
respond to system events like hot reload on asset change.
|
||||||
|
|
||||||
|
In Go, we are used to dealing with structs in our applications. It's often
|
||||||
|
useful to send structs to our frontend and use them as state in our application.
|
||||||
|
In v1, this was a very manual process and a bit of a burden on the developer.
|
||||||
|
I'm happy to announce that in v2, any application run in dev mode will
|
||||||
|
automatically generate TypeScript models for all structs that are input or
|
||||||
|
output parameters to bound methods. This enables seamless interchange of data
|
||||||
|
models between the two worlds.
|
||||||
|
|
||||||
|
In addition to this, another JS module is dynamically generated wrapping all
|
||||||
|
your bound methods. This provides JSDoc for your methods, providing code
|
||||||
|
completion and hinting in your IDE. It's really cool when you get data models
|
||||||
|
auto-imported when hitting tab in an auto-generated module wrapping your Go
|
||||||
|
code!
|
||||||
|
|
||||||
|
### Remote Templates
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Getting an application up and running quickly was always a key goal for the
|
||||||
|
Wails project. When we launched, we tried to cover a lot of the modern
|
||||||
|
frameworks at the time: react, vue and angular. The world of frontend
|
||||||
|
development is very opinionated, fast moving and hard to keep on top of! As a
|
||||||
|
result, we found our base templates getting out of date pretty quickly and this
|
||||||
|
caused a maintenance headache. It also meant that we didn't have cool modern
|
||||||
|
templates for the latest and greatest tech stacks.
|
||||||
|
|
||||||
|
With v2, I wanted to empower the community by giving you the ability to create
|
||||||
|
and host templates yourselves, rather than rely on the Wails project. So now you
|
||||||
|
can create projects using community supported templates! I hope this will
|
||||||
|
inspire developers to create a vibrant ecosystem of project templates. I'm
|
||||||
|
really quite excited about what our developer community can create!
|
||||||
|
|
||||||
|
### Cross Compilation to Windows
|
||||||
|
|
||||||
|
Because Wails v2 for Windows is pure Go, you can target Windows builds without
|
||||||
|
docker.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### In Conclusion
|
||||||
|
|
||||||
|
As I'd said in the Windows release notes, Wails v2 represents a new foundation
|
||||||
|
for the project. The aim of this release is to get feedback on the new approach,
|
||||||
|
and to iron out any bugs before a full release. Your input would be most
|
||||||
|
welcome! Please direct any feedback to the
|
||||||
|
[v2 Beta](https://github.com/wailsapp/wails/discussions/828) discussion board.
|
||||||
|
|
||||||
|
Linux is **hard** to support. We expect there to be a number of quirks with the
|
||||||
|
beta. Please help us to help you by filing detailed bug reports!
|
||||||
|
|
||||||
|
Finally, I'd like to give a special thank you to all the
|
||||||
|
[project sponsors](/credits#sponsors) whose support drives the project in many
|
||||||
|
ways behind the scenes.
|
||||||
|
|
||||||
|
I look forward to seeing what people build with Wails in this next exciting
|
||||||
|
phase of the project!
|
||||||
|
|
||||||
|
Lea.
|
||||||
|
|
||||||
|
PS: The v2 release isn't far off now!
|
||||||
|
|
||||||
|
PPS: If you or your company find Wails useful, please consider
|
||||||
|
[sponsoring the project](https://github.com/sponsors/leaanthony). Thanks!
|
198
docs/src/content/docs/blog/2022-09-22-v2-release-notes.md
Normal file
@ -0,0 +1,198 @@
|
|||||||
|
---
|
||||||
|
slug: blog/wails-v2-released
|
||||||
|
title: Wails v2 Released
|
||||||
|
authors: [leaanthony]
|
||||||
|
tags: [wails, v2]
|
||||||
|
date: 2022-09-22
|
||||||
|
---
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
# It's here!
|
||||||
|
|
||||||
|
Today marks the release of [Wails](https://wails.io) v2. It's been about 18
|
||||||
|
months since the first v2 alpha and about a year from the first beta release.
|
||||||
|
I'm truly grateful to everyone involved in the evolution of the project.
|
||||||
|
|
||||||
|
Part of the reason it took that long was due to wanting to get to some
|
||||||
|
definition of completeness before officially calling it v2. The truth is,
|
||||||
|
there's never a perfect time to tag a release - there's always outstanding
|
||||||
|
issues or "just one more" feature to squeeze in. What tagging an imperfect major
|
||||||
|
release does do, however, is to provide a bit of stability for users of the
|
||||||
|
project, as well as a bit of a reset for the developers.
|
||||||
|
|
||||||
|
This release is more than I'd ever expected it to be. I hope it gives you as
|
||||||
|
much pleasure as it has given us to develop it.
|
||||||
|
|
||||||
|
# What _is_ Wails?
|
||||||
|
|
||||||
|
If you are unfamiliar with Wails, it is a project that enables Go programmers to
|
||||||
|
provide rich frontends for their Go programs using familiar web technologies.
|
||||||
|
It's a lightweight, Go alternative to Electron. Much more information can be
|
||||||
|
found on the [official site](https://wails.io/docs/introduction).
|
||||||
|
|
||||||
|
# What's new?
|
||||||
|
|
||||||
|
The v2 release is a huge leap forward for the project, addressing many of the
|
||||||
|
pain points of v1. If you have not read any of the blog posts on the Beta
|
||||||
|
releases for [macOS](/blog/wails-v2-beta-for-mac),
|
||||||
|
[Windows](/blog/wails-v2-beta-for-windows) or
|
||||||
|
[Linux](/blog/wails-v2-beta-for-linux), then I encourage you to do so as it
|
||||||
|
covers all the major changes in more detail. In summary:
|
||||||
|
|
||||||
|
- Webview2 component for Windows that supports modern web standards and
|
||||||
|
debugging capabilities.
|
||||||
|
- [Dark / Light theme](https://wails.io/docs/reference/options#theme) +
|
||||||
|
[custom theming](https://wails.io/docs/reference/options#customtheme) on Windows.
|
||||||
|
- Windows now has no CGO requirements.
|
||||||
|
- Out-of-the-box support for Svelte, Vue, React, Preact, Lit & Vanilla project
|
||||||
|
templates.
|
||||||
|
- [Vite](https://vitejs.dev/) integration providing a hot-reload development
|
||||||
|
environment for your application.
|
||||||
|
- Native application
|
||||||
|
[menus](https://wails.io/docs/guides/application-development#application-menu) and
|
||||||
|
[dialogs](https://wails.io/docs/reference/runtime/dialog).
|
||||||
|
- Native window translucency effects for
|
||||||
|
[Windows](https://wails.io/docs/reference/options#windowistranslucent) and
|
||||||
|
[macOS](https://wails.io/docs/reference/options#windowistranslucent-1). Support for Mica &
|
||||||
|
Acrylic backdrops.
|
||||||
|
- Easily generate an [NSIS installer](https://wails.io/docs/guides/windows-installer) for
|
||||||
|
Windows deployments.
|
||||||
|
- A rich [runtime library](https://wails.io/docs/reference/runtime/intro) providing utility
|
||||||
|
methods for window manipulation, eventing, dialogs, menus and logging.
|
||||||
|
- Support for [obfuscating](https://wails.io/docs/guides/obfuscated) your application using
|
||||||
|
[garble](https://github.com/burrowers/garble).
|
||||||
|
- Support for compressing your application using [UPX](https://upx.github.io/).
|
||||||
|
- Automatic TypeScript generation of Go structs. More info
|
||||||
|
[here](https://wails.io/docs/howdoesitwork#calling-bound-go-methods).
|
||||||
|
- No extra libraries or DLLs are required to be shipped with your application.
|
||||||
|
For any platform.
|
||||||
|
- No requirement to bundle frontend assets. Just develop your application like
|
||||||
|
any other web application.
|
||||||
|
|
||||||
|
# Credit & Thanks
|
||||||
|
|
||||||
|
Getting to v2 has been a huge effort. There have been ~2.2K commits by 89
|
||||||
|
contributors between the initial alpha and the release today, and many, many
|
||||||
|
more that have provided translations, testing, feedback and help on the
|
||||||
|
discussion forums as well as the issue tracker. I'm so unbelievably grateful to
|
||||||
|
each one of you. I'd also like to give an extra special thank you to all the
|
||||||
|
project sponsors who have provided guidance, advice and feedback. Everything you
|
||||||
|
do is hugely appreciated.
|
||||||
|
|
||||||
|
There are a few people I'd like to give special mention to:
|
||||||
|
|
||||||
|
Firstly, a **huge** thank you to [@stffabi](https://github.com/stffabi) who has
|
||||||
|
provided so many contributions which we all benefit from, as well as providing a
|
||||||
|
lot of support on many issues. He has provided some key features such as the
|
||||||
|
external dev server support which transformed our dev mode offering by allowing
|
||||||
|
us to hook into [Vite](https://vitejs.dev/)'s superpowers. It's fair to say that
|
||||||
|
Wails v2 would be a far less exciting release without his
|
||||||
|
[incredible contributions](https://github.com/wailsapp/wails/commits?author=stffabi&since=2020-01-04).
|
||||||
|
Thank you so much @stffabi!
|
||||||
|
|
||||||
|
I'd also like to give a huge shout-out to
|
||||||
|
[@misitebao](https://github.com/misitebao) who has tirelessly been maintaining
|
||||||
|
the website, as well as providing Chinese translations, managing Crowdin and
|
||||||
|
helping new translators get up to speed. This is a hugely important task, and
|
||||||
|
I'm extremely grateful for all the time and effort put into this! You rock!
|
||||||
|
|
||||||
|
Last, but not least, a huge thank you to Mat Ryer who has provided advice and
|
||||||
|
support during the development of v2. Writing xBar together using an early Alpha
|
||||||
|
of v2 was helpful in shaping the direction of v2, as well as give me an
|
||||||
|
understanding of some design flaws in the early releases. I'm happy to announce
|
||||||
|
that as of today, we will start to port xBar to Wails v2, and it will become the
|
||||||
|
flagship application for the project. Cheers Mat!
|
||||||
|
|
||||||
|
# Lessons Learnt
|
||||||
|
|
||||||
|
There are a number of lessons learnt in getting to v2 that will shape
|
||||||
|
development moving forward.
|
||||||
|
|
||||||
|
## Smaller, Quicker, Focused Releases
|
||||||
|
|
||||||
|
In the course of developing v2, there were many features and bug fixes that were
|
||||||
|
developed on an ad-hoc basis. This led to longer release cycles and were harder
|
||||||
|
to debug. Moving forward, we are going to create releases more often that will
|
||||||
|
include a reduced number of features. A release will involve updates to
|
||||||
|
documentation as well as thorough testing. Hopefully, these smaller, quicker,
|
||||||
|
focussed releases will lead to fewer regressions and better quality
|
||||||
|
documentation.
|
||||||
|
|
||||||
|
## Encourage Engagement
|
||||||
|
|
||||||
|
When starting this project, I wanted to immediately help everyone who had a
|
||||||
|
problem. Issues were "personal" and I wanted them resolved as quickly as
|
||||||
|
possible. This is unsustainable and ultimately works against the longevity of
|
||||||
|
the project. Moving forward, I will be giving more space for people to get
|
||||||
|
involved in answering questions and triaging issues. It would be good to get
|
||||||
|
some tooling to help with this so if you have any suggestions, please join in
|
||||||
|
the discussion [here](https://github.com/wailsapp/wails/discussions/1855).
|
||||||
|
|
||||||
|
## Learning to say No
|
||||||
|
|
||||||
|
The more people that engage with an Open Source project, the more requests there
|
||||||
|
will be for additional features that may or may not be useful to the majority of
|
||||||
|
people. These features will take an initial amount of time to develop and debug,
|
||||||
|
and incur an ongoing maintenance cost from that point on. I myself am the most
|
||||||
|
guilty of this, often wanting to "boil the sea" rather than provide the minimum
|
||||||
|
viable feature. Moving forward, we will need to say "No" a bit more to adding
|
||||||
|
core features and focus our energies on a way to empower developers to provide
|
||||||
|
that functionality themselves. We are looking seriously into plugins for this
|
||||||
|
scenario. This will allow anyone to extend the project as they see fit, as well
|
||||||
|
as providing an easy way to contribute towards the project.
|
||||||
|
|
||||||
|
# Looking to the Future
|
||||||
|
|
||||||
|
There are so many core features we are looking at to add to Wails in the next
|
||||||
|
major development cycle already. The
|
||||||
|
[roadmap](https://github.com/wailsapp/wails/discussions/1484) is full of
|
||||||
|
interesting ideas, and I'm keen to start work on them. One of the big asks has
|
||||||
|
been for multiple window support. It's a tricky one and to do it right, and we
|
||||||
|
may need to look at providing an alternative API, as the current one was not
|
||||||
|
designed with this in mind. Based on some preliminary ideas and feedback, I
|
||||||
|
think you'll like where we're looking to go with it.
|
||||||
|
|
||||||
|
I'm personally very excited at the prospect of getting Wails apps running on
|
||||||
|
mobile. We already have a demo project showing that it is possible to run a
|
||||||
|
Wails app on Android, so I'm really keen to explore where we can go with this!
|
||||||
|
|
||||||
|
A final point I'd like to raise is that of feature parity. It has long been a
|
||||||
|
core principle that we wouldn't add anything to the project without there being
|
||||||
|
full cross-platform support for it. Whilst this has proven to be (mainly)
|
||||||
|
achievable so far, it has really held the project back in releasing new
|
||||||
|
features. Moving forward, we will be adopting a slightly different approach: any
|
||||||
|
new feature that cannot be immediately released for all platforms will be
|
||||||
|
released under an experimental configuration or API. This allows early adopters
|
||||||
|
on certain platforms to try the feature and provide feedback that will feed into
|
||||||
|
the final design of the feature. This, of course, means that there are no
|
||||||
|
guarantees of API stability until it is fully supported by all the platforms it
|
||||||
|
can be supported on, but at least it will unblock development.
|
||||||
|
|
||||||
|
# Final Words
|
||||||
|
|
||||||
|
I'm really proud of what we've been able to achieve with the V2 release. It's
|
||||||
|
amazing to see what people have already been able to build using the beta
|
||||||
|
releases so far. Quality applications like [Varly](https://varly.app/),
|
||||||
|
[Surge](https://getsurge.io/) and [October](https://october.utf9k.net/). I
|
||||||
|
encourage you to check them out.
|
||||||
|
|
||||||
|
This release was achieved through the hard work of many contributors. Whilst it
|
||||||
|
is free to download and use, it has not come about through zero cost. Make no
|
||||||
|
mistakes, this project has come at considerable cost. It has not only been my
|
||||||
|
time and the time of each and every contributor, but also the cost of absence
|
||||||
|
from friends and families of each of those people too. That's why I'm extremely
|
||||||
|
grateful for every second that has been dedicated to making this project happen.
|
||||||
|
The more contributors we have, the more this effort can be spread out and the
|
||||||
|
more we can achieve together. I'd like to encourage you all to pick one thing
|
||||||
|
that you can contribute, whether it is confirming someone's bug, suggesting a
|
||||||
|
fix, making a documentation change or helping out someone who needs it. All of
|
||||||
|
these small things have such a huge impact! It would be so awesome if you too
|
||||||
|
were part of the story in getting to v3.
|
||||||
|
|
||||||
|
Enjoy!
|
||||||
|
|
||||||
|
‐ Lea
|
||||||
|
|
||||||
|
PS: If you or your company find Wails useful, please consider
|
||||||
|
[sponsoring the project](https://github.com/sponsors/leaanthony). Thanks!
|
256
docs/src/content/docs/blog/2023-01-17-v3-roadmap.md
Normal file
@ -0,0 +1,256 @@
|
|||||||
|
---
|
||||||
|
slug: blog/the-road-to-wails-v3
|
||||||
|
title: The Road to Wails v3
|
||||||
|
authors: [leaanthony]
|
||||||
|
tags: [wails, v3]
|
||||||
|
date: 2023-01-17
|
||||||
|
---
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
# Introduction
|
||||||
|
|
||||||
|
Wails is a project that simplifies the ability to write cross-platform desktop
|
||||||
|
applications using Go. It uses native webview components for the frontend (not
|
||||||
|
embedded browsers), bringing the power of the world's most popular UI system to
|
||||||
|
Go, whilst remaining lightweight.
|
||||||
|
|
||||||
|
Version 2 was released on the 22nd of September 2022 and brought with it a lot
|
||||||
|
of enhancements including:
|
||||||
|
|
||||||
|
- Live development, leveraging the popular Vite project
|
||||||
|
- Rich functionality for managing windows and creating menus
|
||||||
|
- Microsoft's WebView2 component
|
||||||
|
- Generation of Typescript models that mirror your Go structs
|
||||||
|
- Creating of NSIS Installer
|
||||||
|
- Obfuscated builds
|
||||||
|
|
||||||
|
Right now, Wails v2 provides powerful tooling for creating rich, cross-platform
|
||||||
|
desktop applications.
|
||||||
|
|
||||||
|
This blog post aims to look at where the project is at right now and what we can
|
||||||
|
improve on moving forward.
|
||||||
|
|
||||||
|
# Where are we now?
|
||||||
|
|
||||||
|
It's been incredible to see the popularity of Wails rising since the v2 release.
|
||||||
|
I'm constantly amazed by the creativity of the community and the wonderful
|
||||||
|
things that are being built with it. With more popularity, comes more eyes on
|
||||||
|
the project. And with that, more feature requests and bug reports.
|
||||||
|
|
||||||
|
Over time, I've been able to identify some of the most pressing issues facing
|
||||||
|
the project. I've also been able to identify some of the things that are holding
|
||||||
|
the project back.
|
||||||
|
|
||||||
|
## Current issues
|
||||||
|
|
||||||
|
I've identified the following areas that I feel are holding the project back:
|
||||||
|
|
||||||
|
- The API
|
||||||
|
- Bindings generation
|
||||||
|
- The Build System
|
||||||
|
|
||||||
|
### The API
|
||||||
|
|
||||||
|
The API to build a Wails application currently consists of 2 parts:
|
||||||
|
|
||||||
|
- The Application API
|
||||||
|
- The Runtime API
|
||||||
|
|
||||||
|
The Application API famously has only 1 function: `Run()` which takes a heap of
|
||||||
|
options which govern how the application will work. Whilst this is very simple
|
||||||
|
to use, it is also very limiting. It is a "declarative" approach which hides a
|
||||||
|
lot of the underlying complexity. For instance, there is no handle to the main
|
||||||
|
window, so you can't interact with it directly. For that, you need to use the
|
||||||
|
Runtime API. This is a problem when you start to want to do more complex things
|
||||||
|
like create multiple windows.
|
||||||
|
|
||||||
|
The Runtime API provides a lot of utility functions for the developer. This
|
||||||
|
includes:
|
||||||
|
|
||||||
|
- Window management
|
||||||
|
- Dialogs
|
||||||
|
- Menus
|
||||||
|
- Events
|
||||||
|
- Logs
|
||||||
|
|
||||||
|
There are a number of things I am not happy with the Runtime API. The first is
|
||||||
|
that it requires a "context" to be passed around. This is both frustrating and
|
||||||
|
confusing for new developers who pass in a context and then get a runtime error.
|
||||||
|
|
||||||
|
The biggest issue with the Runtime API is that it was designed for applications
|
||||||
|
that only use a single window. Over time, the demand for multiple windows has
|
||||||
|
grown and the API is not well suited to this.
|
||||||
|
|
||||||
|
### Thoughts on the v3 API
|
||||||
|
|
||||||
|
Wouldn't it be great if we could do something like this?
|
||||||
|
|
||||||
|
```go
|
||||||
|
func main() {
|
||||||
|
app := wails.NewApplication(options.App{})
|
||||||
|
myWindow := app.NewWindow(options.Window{})
|
||||||
|
myWindow.SetTitle("My Window")
|
||||||
|
myWindow.On(events.Window.Close, func() {
|
||||||
|
app.Quit()
|
||||||
|
})
|
||||||
|
app.Run()
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
This programmatic approach is far more intuitive and allows the developer to
|
||||||
|
interact with the application elements directly. All current runtime methods for
|
||||||
|
windows would simply be methods on the window object. For the other runtime
|
||||||
|
methods, we could move them to the application object like so:
|
||||||
|
|
||||||
|
```go
|
||||||
|
app := wails.NewApplication(options.App{})
|
||||||
|
app.NewInfoDialog(options.InfoDialog{})
|
||||||
|
app.Log.Info("Hello World")
|
||||||
|
```
|
||||||
|
|
||||||
|
This is a much more powerful API which will allow for more complex applications
|
||||||
|
to be built. It also allows for the creation of multiple windows,
|
||||||
|
[the most up-voted feature on GitHub](https://github.com/wailsapp/wails/issues/1480):
|
||||||
|
|
||||||
|
```go
|
||||||
|
func main() {
|
||||||
|
app := wails.NewApplication(options.App{})
|
||||||
|
myWindow := app.NewWindow(options.Window{})
|
||||||
|
myWindow.SetTitle("My Window")
|
||||||
|
myWindow.On(events.Window.Close, func() {
|
||||||
|
app.Quit()
|
||||||
|
})
|
||||||
|
myWindow2 := app.NewWindow(options.Window{})
|
||||||
|
myWindow2.SetTitle("My Window 2")
|
||||||
|
myWindow2.On(events.Window.Close, func() {
|
||||||
|
app.Quit()
|
||||||
|
})
|
||||||
|
app.Run()
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Bindings generation
|
||||||
|
|
||||||
|
One of the key features of Wails is generating bindings for your Go methods so
|
||||||
|
they may be called from Javascript. The current method for doing this is a bit
|
||||||
|
of a hack. It involves building the application with a special flag and then
|
||||||
|
running the resultant binary which uses reflection to determine what has been
|
||||||
|
bound. This leads to a bit of a chicken and egg situation: You can't build the
|
||||||
|
application without the bindings and you can't generate the bindings without
|
||||||
|
building the application. There are many ways around this but the best one would
|
||||||
|
be not to use this approach at all.
|
||||||
|
|
||||||
|
There were a number of attempts at writing a static analyser for Wails projects
|
||||||
|
but they didn't get very far. In more recent times, it has become slightly
|
||||||
|
easier to do this with more material available on the subject.
|
||||||
|
|
||||||
|
Compared to reflection, the AST approach is much faster however it is
|
||||||
|
significantly more complicated. To start with, we may need to impose certain
|
||||||
|
constraints on how to specify bindings in the code. The goal is to support the
|
||||||
|
most common use cases and then expand it later on.
|
||||||
|
|
||||||
|
### The Build System
|
||||||
|
|
||||||
|
Like the declarative approach to the API, the build system was created to hide
|
||||||
|
the complexities of building a desktop application. When you run `wails build`,
|
||||||
|
it does a lot of things behind the scenes:
|
||||||
|
|
||||||
|
- Builds the backend binary for bindings and generates the bindings
|
||||||
|
- Installs the frontend dependencies
|
||||||
|
- Builds the frontend assets
|
||||||
|
- Determines if the application icon is present and if so, embeds it
|
||||||
|
- Builds the final binary
|
||||||
|
- If the build is for `darwin/universal` it builds 2 binaries, one for
|
||||||
|
`darwin/amd64` and one for `darwin/arm64` and then creates a fat binary using
|
||||||
|
`lipo`
|
||||||
|
- If compression is required, it compresses the binary with UPX
|
||||||
|
- Determines if this binary is to be packaged and if so:
|
||||||
|
- Ensures the icon and application manifest are compiled into the binary
|
||||||
|
(Windows)
|
||||||
|
- Builds out the application bundle, generates the icon bundle and copies it,
|
||||||
|
the binary and Info.plist to the application bundle (Mac)
|
||||||
|
- If an NSIS installer is required, it builds it
|
||||||
|
|
||||||
|
This entire process, whilst very powerful, is also very opaque. It is very
|
||||||
|
difficult to customise it and it is very difficult to debug.
|
||||||
|
|
||||||
|
To address this in v3, I would like to move to a build system that exists
|
||||||
|
outside of Wails. After using [Task](https://taskfile.dev/) for a while, I am a
|
||||||
|
big fan of it. It is a great tool for configuring build systems and should be
|
||||||
|
reasonably familiar to anyone who has used Makefiles.
|
||||||
|
|
||||||
|
The build system would be configured using a `Taskfile.yml` file which would be
|
||||||
|
generated by default with any of the supported templates. This would have all of
|
||||||
|
the steps required to do all the current tasks, such as building or packaging
|
||||||
|
the application, allowing for easy customisation.
|
||||||
|
|
||||||
|
There will be no external requirement for this tooling as it would form part of
|
||||||
|
the Wails CLI. This means that you can still use `wails build` and it will do
|
||||||
|
all the things it does today. However, if you want to customise the build
|
||||||
|
process, you can do so by editing the `Taskfile.yml` file. It also means you can
|
||||||
|
easily understand the build steps and use your own build system if you wish.
|
||||||
|
|
||||||
|
The missing piece in the build puzzle is the atomic operations in the build
|
||||||
|
process, such as icon generation, compression and packaging. To require a bunch
|
||||||
|
of external tooling would not be a great experience for the developer. To
|
||||||
|
address this, the Wails CLI will provide all these capabilities as part of the
|
||||||
|
CLI. This means that the builds still work as expected, with no extra external
|
||||||
|
tooling, however you can replace any step of the build with any tool you like.
|
||||||
|
|
||||||
|
This will be a much more transparent build system which will allow for easier
|
||||||
|
customisation and address a lot of the issues that have been raised around it.
|
||||||
|
|
||||||
|
## The Payoff
|
||||||
|
|
||||||
|
These positive changes will be a huge benefit to the project:
|
||||||
|
|
||||||
|
- The new API will be much more intuitive and will allow for more complex
|
||||||
|
applications to be built.
|
||||||
|
- Using static analysis for bindings generation will be much faster and reduce a
|
||||||
|
lot of the complexity around the current process.
|
||||||
|
- Using an established, external build system will make the build process
|
||||||
|
completely transparent, allowing for powerful customisation.
|
||||||
|
|
||||||
|
Benefits to the project maintainers are:
|
||||||
|
|
||||||
|
- The new API will be much easier to maintain and adapt to new features and
|
||||||
|
platforms.
|
||||||
|
- The new build system will be much easier to maintain and extend. I hope this
|
||||||
|
will lead to a new ecosystem of community driven build pipelines.
|
||||||
|
- Better separation of concerns within the project. This will make it easier to
|
||||||
|
add new features and platforms.
|
||||||
|
|
||||||
|
## The Plan
|
||||||
|
|
||||||
|
A lot of the experimentation for this has already been done and it's looking
|
||||||
|
good. There is no current timeline for this work but I'm hoping by the end of Q1
|
||||||
|
2023, there will be an alpha release for Mac to allow the community to test,
|
||||||
|
experiment with and provide feedback.
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
- The v2 API is declarative, hides a lot from the developer and not suitable for
|
||||||
|
features such as multiple windows. A new API will be created which will be
|
||||||
|
simpler, intuitive and more powerful.
|
||||||
|
- The build system is opaque and difficult to customise so we will move to an
|
||||||
|
external build system which will open it all up.
|
||||||
|
- The bindings generation is slow and complex so we will move to static analysis
|
||||||
|
which will remove a lot of the complexity the current method has.
|
||||||
|
|
||||||
|
There has been a lot of work put into the guts of v2 and it's solid. It's now
|
||||||
|
time to address the layer on top of it and make it a much better experience for
|
||||||
|
the developer.
|
||||||
|
|
||||||
|
I hope you are as excited about this as I am. I'm looking forward to hearing
|
||||||
|
your thoughts and feedback.
|
||||||
|
|
||||||
|
Regards,
|
||||||
|
|
||||||
|
‐ Lea
|
||||||
|
|
||||||
|
PS: If you or your company find Wails useful, please consider
|
||||||
|
[sponsoring the project](https://github.com/sponsors/leaanthony). Thanks!
|
||||||
|
|
||||||
|
PPS: Yes, that's a genuine screenshot of a multi-window application built with
|
||||||
|
Wails. It's not a mockup. It's real. It's awesome. It's coming soon.
|
432
docs/src/content/docs/changelog.md
Normal file
@ -0,0 +1,432 @@
|
|||||||
|
---
|
||||||
|
title: Changelog
|
||||||
|
---
|
||||||
|
|
||||||
|
<!--
|
||||||
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||||
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
- `Added` for new features.
|
||||||
|
- `Changed` for changes in existing functionality.
|
||||||
|
- `Deprecated` for soon-to-be removed features.
|
||||||
|
- `Removed` for now removed features.
|
||||||
|
- `Fixed` for any bug fixes.
|
||||||
|
- `Security` in case of vulnerabilities.
|
||||||
|
|
||||||
|
-->
|
||||||
|
|
||||||
|
## [Unreleased]
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- `app.OpenDirectory(dir string)` to open the system file explorer to the
|
||||||
|
directory `dir` by [@leaanthony](https://github.com/leaanthony)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- [darwin] Ensure `windowDidBecomeKey` callback is running on main thread by
|
||||||
|
[@leaanthony](https://github.com/leaanthony)
|
||||||
|
- Ensure key callbacks in window run() are called on the main thread by
|
||||||
|
[@leaanthony](https://github.com/leaanthony)
|
||||||
|
- [darwin] Support fullscreen for frameless windows by
|
||||||
|
[@leaanthony](https://github.com/leaanthony)
|
||||||
|
|
||||||
|
## v3.0.0-alpha.8.3 - 2024-12-07
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Ensure for of taskfile is used by @leaanthony
|
||||||
|
|
||||||
|
## v3.0.0-alpha.8.2 - 2024-12-07
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Update fork of Taskfile to fix version issues when installing using
|
||||||
|
`go install` by @leaanthony
|
||||||
|
|
||||||
|
## v3.0.0-alpha.8.1 - 2024-12-07
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Using fork of Taskfile to fix version issues when installing using
|
||||||
|
`go install` by @leaanthony
|
||||||
|
|
||||||
|
## v3.0.0-alpha.8 - 2024-12-06
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Support of linux packaging of deb,rpm, and arch linux packager builds by
|
||||||
|
@atterpac in [#3909](https://github.com/wailsapp/wails/3909)
|
||||||
|
- Added Support for darwin universal builds and packages by
|
||||||
|
[ansxuman](https://github.com/ansxuman) in
|
||||||
|
[#3902](https://github.com/wailsapp/wails/pull/3902)
|
||||||
|
- Events documentation to the mkdocs webite by
|
||||||
|
[atterpac](https://github.com/atterpac) in
|
||||||
|
[#3867](https://github.com/wailsapp/wails/pull/3867)
|
||||||
|
- Templates for sveltekit and sveltekit-ts that are set for non-SSR development
|
||||||
|
by [atterpac](https://github.com/atterpac) in
|
||||||
|
[#3829](https://github.com/wailsapp/wails/pull/3829)
|
||||||
|
- Update build assets using new `wails3 update build-assets` command by
|
||||||
|
[leaanthony](https://github.com/leaanthony)
|
||||||
|
- Example to test the HTML Drag and Drop API by
|
||||||
|
[FerroO2000](https://github.com/FerroO2000) in
|
||||||
|
[#3856](https://github.com/wailsapp/wails/pull/3856)
|
||||||
|
- File Association support by [leaanthony](https://github.com/leaanthony) in
|
||||||
|
[#3873](https://github.com/wailsapp/wails/pull/3873)
|
||||||
|
- New `wails3 generate runtime` command by
|
||||||
|
[leaanthony](https://github.com/leaanthony)
|
||||||
|
- New `InitialPosition` option to specify if the window should be centered or
|
||||||
|
positioned at the given X/Y location by
|
||||||
|
[leaanthony](https://github.com/leaanthony) in
|
||||||
|
[#3885](https://github.com/wailsapp/wails/pull/3885)
|
||||||
|
- Add `Path` & `Paths` methods to `application` package by
|
||||||
|
[ansxuman](https://github.com/ansxuman) and
|
||||||
|
[leaanthony](https://github.com/leaanthony) in
|
||||||
|
[#3823](https://github.com/wailsapp/wails/pull/3823)
|
||||||
|
- Added `GeneralAutofillEnabled` and `PasswordAutosaveEnabled` Windows options
|
||||||
|
by [leaanthony](https://github.com/leaanthony) in
|
||||||
|
[#3766](https://github.com/wailsapp/wails/pull/3766)
|
||||||
|
- Added the ability to retrieve the window calling a service method by
|
||||||
|
[leaanthony](https://github.com/leaanthony) in
|
||||||
|
[#3888](https://github.com/wailsapp/wails/pull/3888)
|
||||||
|
- Added `EnabledFeatures` and `DisabledFeatures` options for Webview2 by
|
||||||
|
[leaanthony](https://github.com/leaanthony).
|
||||||
|
-
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- `service.OnStartup` now shutdowns the application on error and runs
|
||||||
|
`service.OnShutdown`for any prior services that started by @atterpac in
|
||||||
|
[#3920](https://github.com/wailsapp/wails/pull/3920)
|
||||||
|
- Refactored systray click messaging to better align with user interactions by
|
||||||
|
@atterpac in [#3907](https://github.com/wailsapp/wails/pull/3907)
|
||||||
|
- Asset embed to include `all:frontend/dist` to support frameworks that generate
|
||||||
|
subfolders by @atterpac in
|
||||||
|
[#3887](https://github.com/wailsapp/wails/pull/3887)
|
||||||
|
- Taskfile refactor by [leaanthony](https://github.com/leaanthony) in
|
||||||
|
[#3748](https://github.com/wailsapp/wails/pull/3748)
|
||||||
|
- Upgrade to `go-webview2` v1.0.16 by
|
||||||
|
[leaanthony](https://github.com/leaanthony)
|
||||||
|
- Fixed `Screen` type to include `ID` not `Id` by
|
||||||
|
[etesam913](https://github.com/etesam913) in
|
||||||
|
[#3778](https://github.com/wailsapp/wails/pull/3778)
|
||||||
|
- Update `go.mod.tmpl` wails version to support `application.ServiceOptions` by
|
||||||
|
[northes](https://github.com/northes) in
|
||||||
|
[#3836](https://github.com/wailsapp/wails/pull/3836)
|
||||||
|
- Fixed service name determination by [windom](https://github.com/windom/) in
|
||||||
|
[#3827](https://github.com/wailsapp/wails/pull/3827)
|
||||||
|
- mkdocs serve now uses docker by [leaanthony](https://github.com/leaanthony)
|
||||||
|
- Consolidated dev config into `config.yml` by
|
||||||
|
[leaanthony](https://github.com/leaanthony)
|
||||||
|
- Systray dialog now defaults to the application icon if available (Windows) by
|
||||||
|
[@leaanthony](https://github.com/leaanthony)
|
||||||
|
- Better reporting of GPU + Memory for macOS by
|
||||||
|
[@leaanthony](https://github.com/leaanthony)
|
||||||
|
- Removed `WebviewGpuIsDisabled` and `EnableFraudulentWebsiteWarnings`
|
||||||
|
(superseded by `EnabledFeatures` and `DisabledFeatures` options) by
|
||||||
|
[leaanthony](https://github.com/leaanthony)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fixed deadlock in Linux dialog for multiple selections caused by unclosed
|
||||||
|
channel variable by @michael-freling in
|
||||||
|
[#3925](https://github.com/wailsapp/wails/pull/3925)
|
||||||
|
- Fixed cross-platform cleanup for .syso files during Windows build by
|
||||||
|
[ansxuman](https://github.com/ansxuman) in
|
||||||
|
[#3924](https://github.com/wailsapp/wails/pull/3924)
|
||||||
|
- Fixed amd64 appimage compile by @atterpac in
|
||||||
|
[#3898](https://github.com/wailsapp/wails/pull/3898)
|
||||||
|
- Fixed build assets update by @ansxuman in
|
||||||
|
[#3901](https://github.com/wailsapp/wails/pull/3901)
|
||||||
|
- Fixed Linux systray `OnClick` and `OnRightClick` implementation by @atterpac
|
||||||
|
in [#3886](https://github.com/wailsapp/wails/pull/3886)
|
||||||
|
- Fixed `AlwaysOnTop` not working on Mac by
|
||||||
|
[leaanthony](https://github.com/leaanthony) in
|
||||||
|
[#3841](https://github.com/wailsapp/wails/pull/3841)
|
||||||
|
- [darwin] Fixed `application.NewEditMenu` including a duplicate
|
||||||
|
`PasteAndMatchStyle` role in the edit menu on Darwin by
|
||||||
|
[johnmccabe](https://github.com/johnmccabe) in
|
||||||
|
[#3839](https://github.com/wailsapp/wails/pull/3839)
|
||||||
|
- [linux] Fixed aarch64 compilation
|
||||||
|
[#3840](https://github.com/wailsapp/wails/issues/3840) in
|
||||||
|
[#3854](https://github.com/wailsapp/wails/pull/3854) by
|
||||||
|
[kodflow](https://github.com/kodflow)
|
||||||
|
- [windows] Fixed radio group menu items by
|
||||||
|
[@leaanthony](https://github.com/leaanthony)
|
||||||
|
- Fix error on building runnable .app on MacOS when 'name' and 'outputfilename'
|
||||||
|
are different. by @nickisworking in
|
||||||
|
[#3789](https://github.com/wailsapp/wails/pull/3789)
|
||||||
|
|
||||||
|
## v3.0.0-alpha.7 - 2024-09-18
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- [windows] New DIP system for Enhanced High DPI Monitor Support by
|
||||||
|
[mmghv](https://github.com/mmghv) in
|
||||||
|
[#3665](https://github.com/wailsapp/wails/pull/3665)
|
||||||
|
- [windows] Window class name option by [windom](https://github.com/windom/) in
|
||||||
|
[#3682](https://github.com/wailsapp/wails/pull/3682)
|
||||||
|
- Services have been expanded to provide plugin functionality. By
|
||||||
|
[atterpac](https://github.com/atterpac) and
|
||||||
|
[leaanthony](https://github.com/leaanthony) in
|
||||||
|
[#3570](https://github.com/wailsapp/wails/pull/3570)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Events API change: `On`/`Emit` -> user events, `OnApplicationEvent` ->
|
||||||
|
Application Events `OnWindowEvent` -> Window Events, by
|
||||||
|
[leaanthony](https://github.com/leaanthony)
|
||||||
|
- Fix for Events API on Linux by [TheGB0077](https://github.com/TheGB0077) in
|
||||||
|
[#3734](https://github.com/wailsapp/wails/pull/3734)
|
||||||
|
- [CI] improvements to actions & enable to run actions also in forks and
|
||||||
|
branches prefixed with `v3/` or `v3-` by
|
||||||
|
[stendler](https://github.com/stendler) in
|
||||||
|
[#3747](https://github.com/wailsapp/wails/pull/3747)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fixed bug with usage of customEventProcessor in drag-n-drop example by
|
||||||
|
[etesam913](https://github.com/etesam913) in
|
||||||
|
[#3742](https://github.com/wailsapp/wails/pull/3742)
|
||||||
|
- [linux] Fixed linux compile error introduced by IgnoreMouseEvents addition by
|
||||||
|
[atterpac](https://github.com/atterpac) in
|
||||||
|
[#3721](https://github.com/wailsapp/wails/pull/3721)
|
||||||
|
- [windows] Fixed syso icon file generation bug by
|
||||||
|
[atterpac](https://github.com/atterpac) in
|
||||||
|
[#3675](https://github.com/wailsapp/wails/pull/3675)
|
||||||
|
- [linux] Fix to run natively in wayland incorporated from
|
||||||
|
[#1811](https://github.com/wailsapp/wails/pull/1811) in
|
||||||
|
[#3614](https://github.com/wailsapp/wails/pull/3614) by
|
||||||
|
[@stendler](https://github.com/stendler)
|
||||||
|
- Do not bind internal service methods in
|
||||||
|
[#3720](https://github.com/wailsapp/wails/pull/3720) by
|
||||||
|
[leaanthony](https://github.com/leaanthony)
|
||||||
|
- [windows] Fixed system tray startup panic in
|
||||||
|
[#3693](https://github.com/wailsapp/wails/issues/3693) by
|
||||||
|
[@DeltaLaboratory](https://github.com/DeltaLaboratory)
|
||||||
|
- Do not bind internal service methods in
|
||||||
|
[#3720](https://github.com/wailsapp/wails/pull/3720) by
|
||||||
|
[leaanthony](https://github.com/leaanthony)
|
||||||
|
- [windows] Fixed system tray startup panic in
|
||||||
|
[#3693](https://github.com/wailsapp/wails/issues/3693) by
|
||||||
|
[@DeltaLaboratory](https://github.com/DeltaLaboratory)
|
||||||
|
- Major menu item refactor and event handling. Mainly improves macOS for now. By
|
||||||
|
[leaanthony](https://github.com/leaanthony)
|
||||||
|
- Fix tests after plugins and event refactor in
|
||||||
|
[#3746](https://github.com/wailsapp/wails/pull/3746) by
|
||||||
|
[@stendler](https://github.com/stendler)
|
||||||
|
- [windows] Fixed `Failed to unregister class Chrome_WidgetWin_0` warning. By
|
||||||
|
[leaanthony](https://github.com/leaanthony)
|
||||||
|
|
||||||
|
## v3.0.0-alpha.6 - 2024-07-30
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Module issues
|
||||||
|
|
||||||
|
## v3.0.0-alpha.5 - 2024-07-30
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- [linux] WindowDidMove / WindowDidResize events in
|
||||||
|
[#3580](https://github.com/wailsapp/wails/pull/3580)
|
||||||
|
- [windows] WindowDidResize event in
|
||||||
|
[#3580](https://github.com/wailsapp/wails/pull/3580)
|
||||||
|
- [darwin] add Event ApplicationShouldHandleReopen to be able to handle dock
|
||||||
|
icon click by @5aaee9 in [#2991](https://github.com/wailsapp/wails/pull/2991)
|
||||||
|
- [darwin] add getPrimaryScreen/getScreens to impl by @tmclane in
|
||||||
|
[#2618](https://github.com/wailsapp/wails/pull/2618)
|
||||||
|
- [darwin] add option for showing the toolbar in fullscreen mode on macOS by
|
||||||
|
[@fbbdev](https://github.com/fbbdev) in
|
||||||
|
[#3282](https://github.com/wailsapp/wails/pull/3282)
|
||||||
|
- [linux] add onKeyPress logic to convert linux keypress into an accelerator
|
||||||
|
@[Atterpac](https://github.com/Atterpac)
|
||||||
|
in[#3022](https://github.com/wailsapp/wails/pull/3022])
|
||||||
|
- [linux] add task `run:linux` by
|
||||||
|
[@marcus-crane](https://github.com/marcus-crane) in
|
||||||
|
[#3146](https://github.com/wailsapp/wails/pull/3146)
|
||||||
|
- Export `SetIcon` method by @almas1992 in
|
||||||
|
[PR](https://github.com/wailsapp/wails/pull/3147)
|
||||||
|
- Improve `OnShutdown` by @almas1992 in
|
||||||
|
[PR](https://github.com/wailsapp/wails/pull/3189)
|
||||||
|
- Restore `ToggleMaximise` method in `Window` interface by
|
||||||
|
[@fbbdev](https://github.com/fbbdev) in
|
||||||
|
[#3281](https://github.com/wailsapp/wails/pull/3281)
|
||||||
|
- Added more information to `Environment()`. By @leaanthony in
|
||||||
|
[aba82cc](https://github.com/wailsapp/wails/commit/aba82cc52787c97fb99afa58b8b63a0004b7ff6c)
|
||||||
|
based on [PR](https://github.com/wailsapp/wails/pull/2044) by @Mai-Lapyst
|
||||||
|
- Expose the `WebviewWindow.IsFocused` method on the `Window` interface by
|
||||||
|
[@fbbdev](https://github.com/fbbdev) in
|
||||||
|
[#3295](https://github.com/wailsapp/wails/pull/3295)
|
||||||
|
- Support multiple space-separated trigger events in the WML system by
|
||||||
|
[@fbbdev](https://github.com/fbbdev) in
|
||||||
|
[#3295](https://github.com/wailsapp/wails/pull/3295)
|
||||||
|
- Add ESM exports from the bundled JS runtime script by
|
||||||
|
[@fbbdev](https://github.com/fbbdev) in
|
||||||
|
[#3295](https://github.com/wailsapp/wails/pull/3295)
|
||||||
|
- Add binding generator flag for using the bundled JS runtime script instead of
|
||||||
|
the npm package by [@fbbdev](https://github.com/fbbdev) in
|
||||||
|
[#3334](https://github.com/wailsapp/wails/pull/3334)
|
||||||
|
- Implement `setIcon` on linux by [@abichinger](https://github.com/abichinger)
|
||||||
|
in [#3354](https://github.com/wailsapp/wails/pull/3354)
|
||||||
|
- Add flag `-port` to dev command and support environment variable
|
||||||
|
`WAILS_VITE_PORT` by [@abichinger](https://github.com/abichinger) in
|
||||||
|
[#3429](https://github.com/wailsapp/wails/pull/3429)
|
||||||
|
- Add tests for bound method calls by
|
||||||
|
[@abichinger](https://github.com/abichinger) in
|
||||||
|
[#3431](https://github.com/wailsapp/wails/pull/3431)
|
||||||
|
- [windows] add `SetIgnoreMouseEvents` for already created window by
|
||||||
|
[@bruxaodev](https://github.com/bruxaodev) in
|
||||||
|
[#3667](https://github.com/wailsapp/wails/pull/3667)
|
||||||
|
- [darwin] Add ability to set a window's stacking level (order) by
|
||||||
|
[@OlegGulevskyy](https://github.com/OlegGulevskyy) in
|
||||||
|
[#3674](https://github.com/wailsapp/wails/pull/3674)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fixed resize event messaging by [atterpac](https://github.com/atterpac) in
|
||||||
|
[#3606](https://github.com/wailsapp/wails/pull/3606)
|
||||||
|
- [linux] Fixed theme handling error on NixOS by
|
||||||
|
[tmclane](https://github.com/tmclane) in
|
||||||
|
[#3515](https://github.com/wailsapp/wails/pull/3515)
|
||||||
|
- Fixed cross volume project install for windows by
|
||||||
|
[atterpac](https://github.com/atterac) in
|
||||||
|
[#3512](https://github.com/wailsapp/wails/pull/3512)
|
||||||
|
- Fixed react template css to show footer by
|
||||||
|
[atterpac](https://github.com/atterpac) in
|
||||||
|
[#3477](https://github.com/wailsapp/wails/pull/3477)
|
||||||
|
- Fixed zombie processes when working in devmode by updating to latest refresh
|
||||||
|
by [Atterpac](https://github.com/atterpac) in
|
||||||
|
[#3320](https://github.com/wailsapp/wails/pull/3320).
|
||||||
|
- Fixed appimage webkit file sourcing by [Atterpac](https://github.com/atterpac)
|
||||||
|
in [#3306](https://github.com/wailsapp/wails/pull/3306).
|
||||||
|
- Fixed Doctor apt package verify by [Atterpac](https://github.com/Atterpac) in
|
||||||
|
[#2972](https://github.com/wailsapp/wails/pull/2972).
|
||||||
|
- Fixed application frozen when quit (Darwin) by @5aaee9 in
|
||||||
|
[#2982](https://github.com/wailsapp/wails/pull/2982)
|
||||||
|
- Fixed background colours of examples on Windows by
|
||||||
|
[mmghv](https://github.com/mmghv) in
|
||||||
|
[#2750](https://github.com/wailsapp/wails/pull/2750).
|
||||||
|
- Fixed default context menus by [mmghv](https://github.com/mmghv) in
|
||||||
|
[#2753](https://github.com/wailsapp/wails/pull/2753).
|
||||||
|
- Fixed hex values for arrow keys on Darwin by
|
||||||
|
[jaybeecave](https://github.com/jaybeecave) in
|
||||||
|
[#3052](https://github.com/wailsapp/wails/pull/3052).
|
||||||
|
- Set drag-n-drop for windows to working. Added by
|
||||||
|
[@pylotlight](https://github.com/pylotlight) in
|
||||||
|
[PR](https://github.com/wailsapp/wails/pull/3039)
|
||||||
|
- Fixed bug for linux in doctor in the event user doesn't have proper drivers
|
||||||
|
installed. Added by [@pylotlight](https://github.com/pylotlight) in
|
||||||
|
[PR](https://github.com/wailsapp/wails/pull/3032)
|
||||||
|
- Fix dpi scaling on start up (windows). Changed by @almas1992 in
|
||||||
|
[PR](https://github.com/wailsapp/wails/pull/3145)
|
||||||
|
- Fix replace line in `go.mod` to use relative paths. Fixes Windows paths with
|
||||||
|
spaces - @leaanthony.
|
||||||
|
- Fix MacOS systray click handling when no attached window by
|
||||||
|
[thomas-senechal](https://github.com/thomas-senechal) in PR
|
||||||
|
[#3207](https://github.com/wailsapp/wails/pull/3207)
|
||||||
|
- Fix failing Windows build due to unknown option by
|
||||||
|
[thomas-senechal](https://github.com/thomas-senechal) in PR
|
||||||
|
[#3208](https://github.com/wailsapp/wails/pull/3208)
|
||||||
|
- Fix crash on windows left clicking the systray icon when not having an
|
||||||
|
attached window [tw1nk](https://github.com/tw1nk) in PR
|
||||||
|
[#3271](https://github.com/wailsapp/wails/pull/3271)
|
||||||
|
- Fix wrong baseURL when open window twice by @5aaee9 in PR
|
||||||
|
[#3273](https://github.com/wailsapp/wails/pull/3273)
|
||||||
|
- Fix ordering of if branches in `WebviewWindow.Restore` method by
|
||||||
|
[@fbbdev](https://github.com/fbbdev) in
|
||||||
|
[#3279](https://github.com/wailsapp/wails/pull/3279)
|
||||||
|
- Correctly compute `startURL` across multiple `GetStartURL` invocations when
|
||||||
|
`FRONTEND_DEVSERVER_URL` is present.
|
||||||
|
[#3299](https://github.com/wailsapp/wails/pull/3299)
|
||||||
|
- Fix the JS type of the `Screen` struct to match its Go counterpart by
|
||||||
|
[@fbbdev](https://github.com/fbbdev) in
|
||||||
|
[#3295](https://github.com/wailsapp/wails/pull/3295)
|
||||||
|
- Fix the `WML.Reload` method to ensure proper cleanup of registered event
|
||||||
|
listeners by [@fbbdev](https://github.com/fbbdev) in
|
||||||
|
[#3295](https://github.com/wailsapp/wails/pull/3295)
|
||||||
|
- Fix custom context menu closing immediately on linux by
|
||||||
|
[@abichinger](https://github.com/abichinger) in
|
||||||
|
[#3330](https://github.com/wailsapp/wails/pull/3330)
|
||||||
|
- Fix the output path and extension of model files produced by the binding
|
||||||
|
generator by [@fbbdev](https://github.com/fbbdev) in
|
||||||
|
[#3334](https://github.com/wailsapp/wails/pull/3334)
|
||||||
|
- Fix the import paths of model files in JS code produced by the binding
|
||||||
|
generator by [@fbbdev](https://github.com/fbbdev) in
|
||||||
|
[#3334](https://github.com/wailsapp/wails/pull/3334)
|
||||||
|
- Fix drag-n-drop on some linux distros by
|
||||||
|
[@abichinger](https://github.com/abichinger) in
|
||||||
|
[#3346](https://github.com/wailsapp/wails/pull/3346)
|
||||||
|
- Fix missing task for macOS when using `wails3 task dev` by
|
||||||
|
[@hfoxy](https://github.com/hfoxy) in
|
||||||
|
[#3417](https://github.com/wailsapp/wails/pull/3417)
|
||||||
|
- Fix registering events causing a nil map assignment by
|
||||||
|
[@hfoxy](https://github.com/hfoxy) in
|
||||||
|
[#3426](https://github.com/wailsapp/wails/pull/3426)
|
||||||
|
- Fix unmarshaling of bound method parameters by
|
||||||
|
[@fbbdev](https://github.com/fbbdev) in
|
||||||
|
[#3431](https://github.com/wailsapp/wails/pull/3431)
|
||||||
|
- Fix handling of multiple return values from bound methods by
|
||||||
|
[@fbbdev](https://github.com/fbbdev) in
|
||||||
|
[#3431](https://github.com/wailsapp/wails/pull/3431)
|
||||||
|
- Fix doctor detection of npm that is not installed with system package manager
|
||||||
|
by [@pekim](https://github.com/pekim) in
|
||||||
|
[#3458](https://github.com/wailsapp/wails/pull/3458)
|
||||||
|
- Fix missing MicrosoftEdgeWebview2Setup.exe. Thanks to
|
||||||
|
[@robin-samuel](https://github.com/robin-samuel).
|
||||||
|
- Fix random crash on linux due to window ID handling by @leaanthony. Based on
|
||||||
|
PR [#3466](https://github.com/wailsapp/wails/pull/3622) by
|
||||||
|
[@5aaee9](https://github.com/5aaee9).
|
||||||
|
- Fix systemTray.setIcon crashing on Linux by
|
||||||
|
[@windom](https://github.com/windom/) in
|
||||||
|
[#3636](https://github.com/wailsapp/wails/pull/3636).
|
||||||
|
- Fix Ensure Window Frame is Applied on First Call in `setFrameless` Function on
|
||||||
|
Windows by [@bruxaodev](https://github.com/bruxaodev/) in
|
||||||
|
[#3691](https://github.com/wailsapp/wails/pull/3691).
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Renamed `AbsolutePosition()` to `Position()` by
|
||||||
|
[mmghv](https://github.com/mmghv) in
|
||||||
|
[#3611](https://github.com/wailsapp/wails/pull/3611)
|
||||||
|
- Update linux webkit dependency to webkit2gtk-4.1 over webkitgtk2-4.0 to
|
||||||
|
support Ubuntu 24.04 LTS by [atterpac](https://github.com/atterpac) in
|
||||||
|
[#3461](https://github.com/wailsapp/wails/pull/3461)
|
||||||
|
- The bundled JS runtime script is now an ESM module: script tags importing it
|
||||||
|
must have the `type="module"` attribute. By
|
||||||
|
[@fbbdev](https://github.com/fbbdev) in
|
||||||
|
[#3295](https://github.com/wailsapp/wails/pull/3295)
|
||||||
|
- The `@wailsio/runtime` package does not publish its API on the `window.wails`
|
||||||
|
object, and does not start the WML system. This has been done to improve
|
||||||
|
encapsulation. The WML system can be started manually if desired by calling
|
||||||
|
the new `WML.Enable` method. The bundled JS runtime script still performs both
|
||||||
|
operations automatically. By [@fbbdev](https://github.com/fbbdev) in
|
||||||
|
[#3295](https://github.com/wailsapp/wails/pull/3295)
|
||||||
|
- The Window API module `@wailsio/runtime/src/window` now exposes the containing
|
||||||
|
window object as a default export. It is not possible anymore to import
|
||||||
|
individual methods through ESM named or namespace import syntax.
|
||||||
|
- The JS window API has been updated to match the current Go `WebviewWindow`
|
||||||
|
API. Some methods have changed name or prototype, specifically: `Screen`
|
||||||
|
becomes `GetScreen`; `GetZoomLevel`/`SetZoomLevel` become `GetZoom`/`SetZoom`;
|
||||||
|
`GetZoom`, `Width` and `Height` now return values directly instead of wrapping
|
||||||
|
them within objects. By [@fbbdev](https://github.com/fbbdev) in
|
||||||
|
[#3295](https://github.com/wailsapp/wails/pull/3295)
|
||||||
|
- The binding generator now uses calls by ID by default. The `-id` CLI option
|
||||||
|
has been removed. Use the `-names` CLI option to switch back to calls by name.
|
||||||
|
By [@fbbdev](https://github.com/fbbdev) in
|
||||||
|
[#3468](https://github.com/wailsapp/wails/pull/3468)
|
||||||
|
- New binding code layout: output files were previously organised in folders
|
||||||
|
named after their containing package; now full Go import paths are used,
|
||||||
|
including the module path. By [@fbbdev](https://github.com/fbbdev) in
|
||||||
|
[#3468](https://github.com/wailsapp/wails/pull/3468)
|
||||||
|
- The struct field `application.Options.Bind` has been renamed to
|
||||||
|
`application.Options.Services`. By [@fbbdev](https://github.com/fbbdev) in
|
||||||
|
[#3468](https://github.com/wailsapp/wails/pull/3468)
|
||||||
|
- New syntax for binding services: service instances must now be wrapped in a
|
||||||
|
call to `application.NewService`. By [@fbbdev](https://github.com/fbbdev) in
|
||||||
|
[#3468](https://github.com/wailsapp/wails/pull/3468)
|
||||||
|
- Disable spinner on Non-Terminal or CI Environment by
|
||||||
|
[@DeltaLaboratory](https://github.com/DeltaLaboratory) in
|
||||||
|
[#3574](https://github.com/wailsapp/wails/pull/3574)
|
53
docs/src/content/docs/credits.mdx
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
---
|
||||||
|
title: Credits
|
||||||
|
---
|
||||||
|
|
||||||
|
{/* Import the auto-generated contributors file */}
|
||||||
|
|
||||||
|
import Contributors from "../../assets/contributors.html";
|
||||||
|
|
||||||
|
- [Lea Anthony](https://github.com/leaanthony) - Project owner, lead developer
|
||||||
|
- [Stffabi](https://github.com/stffabi) - Technical lead, developer and
|
||||||
|
maintainer
|
||||||
|
- [Travis McLane](https://github.com/tmclane) - Cross-compilation work, MacOS
|
||||||
|
testing
|
||||||
|
- [Atterpac](https://github.com/atterpac) - Developer, support guru, powerhouse
|
||||||
|
- [Simon Thomas](mailto:enquiries@wails.io) - Growth Hacker
|
||||||
|
- [Lyimmi](https://github.com/Lyimmi) - All things Linux
|
||||||
|
|
||||||
|
## Sponsors
|
||||||
|
|
||||||
|
<img
|
||||||
|
src="/sponsors/sponsors.svg"
|
||||||
|
style={{ width: "85%", "max-width": "800px;" }}
|
||||||
|
alt="Sponsors"
|
||||||
|
/>
|
||||||
|
<img
|
||||||
|
src="/sponsors/jetbrains-grayscale.webp"
|
||||||
|
style={{ width: "100px" }}
|
||||||
|
alt="JetBrains"
|
||||||
|
/>
|
||||||
|
|
||||||
|
## Contributors
|
||||||
|
|
||||||
|
<Contributors />
|
||||||
|
|
||||||
|
## Special Mentions
|
||||||
|
|
||||||
|
- [John Chadwick](https://github.com/jchv) - His amazing work on
|
||||||
|
[go-webview2](https://github.com/jchv/go-webview2) and
|
||||||
|
[go-winloader](https://github.com/jchv/go-winloader) have made the Windows
|
||||||
|
version possible.
|
||||||
|
- [Tad Vizbaras](https://github.com/tadvi) - His winc project was the first step
|
||||||
|
down the path to a pure Go Wails.
|
||||||
|
- [Mat Ryer](https://github.com/matryer) - For advice, support and bants.
|
||||||
|
- [Byron Chris](https://github.com/bh90210) - For his long term contributions to
|
||||||
|
this project.
|
||||||
|
- [Dustin Krysak](https://wiki.ubuntu.com/bashfulrobot) - His support and
|
||||||
|
feedback has been invaluable.
|
||||||
|
- [Justen Walker](https://github.com/justenwalker/) - For helping wrangle COM
|
||||||
|
issues which got v2 over the line.
|
||||||
|
- [Wang, Chi](https://github.com/patr0nus/) - The DeskGap project was a huge
|
||||||
|
influence on the direction of Wails v2.
|
||||||
|
- [Serge Zaitsev](https://github.com/zserge) - Whilst Wails does not use the
|
||||||
|
Webview project, it is still a source of inspiration.
|
38
docs/src/content/docs/development/changes.md
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
---
|
||||||
|
title: Changes for v3
|
||||||
|
sidebar:
|
||||||
|
order: 30
|
||||||
|
---
|
||||||
|
|
||||||
|
:::note
|
||||||
|
|
||||||
|
This is currently an unsorted brain dump of changes. It will be organized into a
|
||||||
|
more readable format soon.
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
### [Events](/development/changes_events)
|
||||||
|
|
||||||
|
### [Window](/development/changes_window)
|
||||||
|
|
||||||
|
### [Systray](/development/changes_systray)
|
||||||
|
|
||||||
|
### [Bindings](/development/changes_bindings)
|
||||||
|
|
||||||
|
### [Drag and Drop](/development/changes_dragndrop)
|
||||||
|
|
||||||
|
### [Context Menus](/development/changes_context_menus)
|
||||||
|
|
||||||
|
### [Dialogs](/development/changes_dialogs)
|
||||||
|
|
||||||
|
### [Clipboard](/development/changes_clipboard)
|
||||||
|
|
||||||
|
### [WML](/development/changes_wml)
|
||||||
|
|
||||||
|
### [Plugins](/development/changes_plugins)
|
||||||
|
|
||||||
|
### [Logging](/development/changes_logging)
|
||||||
|
|
||||||
|
### [Misc](/development/changes_misc)
|
||||||
|
|
||||||
|
### [Enums](/development/changes_enums)
|
94
docs/src/content/docs/development/changes_bindings.md
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
---
|
||||||
|
title: Changes (Bindings)
|
||||||
|
sidebar:
|
||||||
|
order: 70
|
||||||
|
---
|
||||||
|
|
||||||
|
Bindings work in a similar way to v2, by providing a means to bind struct
|
||||||
|
methods to the frontend. These can be called in the frontend using the binding
|
||||||
|
wrappers generated by the `wails3 generate bindings` command:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// @ts-check
|
||||||
|
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
|
||||||
|
// This file is automatically generated. DO NOT EDIT
|
||||||
|
|
||||||
|
import { main } from "./models";
|
||||||
|
|
||||||
|
window.go = window.go || {};
|
||||||
|
window.go.main = {
|
||||||
|
GreetService: {
|
||||||
|
/**
|
||||||
|
* GreetService.Greet
|
||||||
|
* Greet greets a person
|
||||||
|
* @param name {string}
|
||||||
|
* @returns {Promise<string>}
|
||||||
|
**/
|
||||||
|
Greet: function (name) {
|
||||||
|
wails.CallByID(1411160069, ...Array.prototype.slice.call(arguments, 0));
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GreetService.GreetPerson
|
||||||
|
* GreetPerson greets a person
|
||||||
|
* @param person {main.Person}
|
||||||
|
* @returns {Promise<string>}
|
||||||
|
**/
|
||||||
|
GreetPerson: function (person) {
|
||||||
|
wails.CallByID(4021313248, ...Array.prototype.slice.call(arguments, 0));
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
Bound methods are obfuscated by default, and are identified using uint32 IDs,
|
||||||
|
calculated using the
|
||||||
|
[FNV hashing algorithm](https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function).
|
||||||
|
This is to prevent the method name from being exposed in production builds. In
|
||||||
|
debug mode, the method IDs are logged along with the calculated ID of the method
|
||||||
|
to aid in debugging. If you wish to add an extra layer of obfuscation, you can
|
||||||
|
use the `BindAliases` option. This allows you to specify a map of alias IDs to
|
||||||
|
method IDs. When the frontend calls a method using an ID, the method ID will be
|
||||||
|
looked up in the alias map first for a match. If it does not find it, it assumes
|
||||||
|
it's a standard method ID and tries to find the method in the usual way.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```go
|
||||||
|
app := application.New(application.Options{
|
||||||
|
Bind: []any{
|
||||||
|
&GreetService{},
|
||||||
|
},
|
||||||
|
BindAliases: map[uint32]uint32{
|
||||||
|
1: 1411160069,
|
||||||
|
2: 4021313248,
|
||||||
|
},
|
||||||
|
Assets: application.AssetOptions{
|
||||||
|
Handler: application.AssetFileServerFS(assets),
|
||||||
|
},
|
||||||
|
Mac: application.MacOptions{
|
||||||
|
ApplicationShouldTerminateAfterLastWindowClosed: true,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
We can now call using this alias in the frontend: `wails.Call(1, "world!")`.
|
||||||
|
|
||||||
|
### Insecure calls
|
||||||
|
|
||||||
|
If you don't mind your calls being available in plain text in your binary and
|
||||||
|
have no intention of using [garble](https://github.com/burrowers/garble), then
|
||||||
|
you can use the insecure `wails.CallByName()` method. This method takes the
|
||||||
|
fully qualified name of the method to call and the arguments to pass to it.
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```go
|
||||||
|
wails.CallByName("main.GreetService.Greet", "world!")
|
||||||
|
```
|
||||||
|
|
||||||
|
:::danger
|
||||||
|
|
||||||
|
This is only provided as a convenience method for development. It is not
|
||||||
|
recommended to use this in production.
|
||||||
|
|
||||||
|
:::
|
10
docs/src/content/docs/development/changes_clipboard.md
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
title: Changes (Clipboard)
|
||||||
|
sidebar:
|
||||||
|
order: 110
|
||||||
|
---
|
||||||
|
|
||||||
|
The clipboard API has been simplified. There is now a single `Clipboard` object
|
||||||
|
that can be used to read and write to the clipboard. The `Clipboard` object is
|
||||||
|
available in both Go and JS. `SetText()` to set the text and `Text()` to get the
|
||||||
|
text.
|
21
docs/src/content/docs/development/changes_context_menus.md
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
title: Changes (Context Menus)
|
||||||
|
sidebar:
|
||||||
|
order: 90
|
||||||
|
---
|
||||||
|
|
||||||
|
Context menus are contextual menus that are shown when the user right-clicks on
|
||||||
|
an element. Creating a context menu is the same as creating a standard menu , by
|
||||||
|
using `app.NewMenu()`. To make the context menu available to a window, call
|
||||||
|
`window.RegisterContextMenu(name, menu)`. The name will be the id of the context
|
||||||
|
menu and used by the frontend.
|
||||||
|
|
||||||
|
To indicate that an element has a context menu, add the `data-contextmenu`
|
||||||
|
attribute to the element. The value of this attribute should be the name of a
|
||||||
|
context menu previously registered with the window.
|
||||||
|
|
||||||
|
It is possible to register a context menu at the application level, making it
|
||||||
|
available to all windows. This can be done using
|
||||||
|
`app.RegisterContextMenu(name, menu)`. If a context menu cannot be found at the
|
||||||
|
window level, the application context menus will be checked. A demo of this can
|
||||||
|
be found in `v3/examples/contextmenus`.
|
43
docs/src/content/docs/development/changes_dialogs.md
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
---
|
||||||
|
title: Changes (Dialogs)
|
||||||
|
sidebar:
|
||||||
|
order: 100
|
||||||
|
---
|
||||||
|
|
||||||
|
Dialogs are now available in JavaScript!
|
||||||
|
|
||||||
|
### Windows
|
||||||
|
|
||||||
|
Dialog buttons in Windows are not configurable and are constant depending on the
|
||||||
|
type of dialog. To trigger a callback when a button is pressed, create a button
|
||||||
|
with the same name as the button you wish to have the callback attached to.
|
||||||
|
Example: Create a button with the label `Ok` and use `OnClick()` to set the
|
||||||
|
callback method:
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Create a question dialog
|
||||||
|
dialog := app.QuestionDialog().
|
||||||
|
|
||||||
|
// Configure dialog title and message
|
||||||
|
SetTitle("Update").
|
||||||
|
SetMessage("The cancel button is selected when pressing escape")
|
||||||
|
|
||||||
|
// Add "Ok" button with callback
|
||||||
|
ok := dialog.AddButton("Ok")
|
||||||
|
ok.OnClick(func() {
|
||||||
|
// Handle successful confirmation (Or do something else)
|
||||||
|
if err := handleConfirmation(); err != nil {
|
||||||
|
log.Printf("Error handling confirmation: %v", err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// Add "Cancel" button and configure dialog behavior
|
||||||
|
no := dialog.AddButton("Cancel")
|
||||||
|
dialog.SetDefaultButton(ok)
|
||||||
|
dialog.SetCancelButton(no)
|
||||||
|
|
||||||
|
// Show dialog and handle potential errors
|
||||||
|
if err := dialog.Show(); err != nil {
|
||||||
|
log.Printf("Error showing dialog: %v", err)
|
||||||
|
}
|
||||||
|
```
|
12
docs/src/content/docs/development/changes_dragndrop.md
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
title: Changes (Drag and Drop)
|
||||||
|
sidebar:
|
||||||
|
order: 80
|
||||||
|
---
|
||||||
|
|
||||||
|
Native drag and drop can be enabled per-window. Simply set the
|
||||||
|
`EnableDragAndDrop` window config option to `true` and the window will allow
|
||||||
|
files to be dragged onto it. When this happens, the `events.FilesDropped` event
|
||||||
|
will be emitted. The filenames can then be retrieved from the
|
||||||
|
`WindowEvent.Context()` using the `DroppedFiles()` method. This returns a slice
|
||||||
|
of strings containing the filenames.
|
46
docs/src/content/docs/development/changes_enums.md
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
---
|
||||||
|
title: Changes (Enums)
|
||||||
|
sidebar:
|
||||||
|
order: 160
|
||||||
|
---
|
||||||
|
|
||||||
|
In Go, enums are often defined as a type and a set of constants. For example:
|
||||||
|
|
||||||
|
```go
|
||||||
|
type MyEnum int
|
||||||
|
|
||||||
|
const (
|
||||||
|
MyEnumOne MyEnum = iota
|
||||||
|
MyEnumTwo
|
||||||
|
MyEnumThree
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
Due to incompatibility between Go and JavaScript, custom types cannot be used in
|
||||||
|
this way. The best strategy is to use a type alias for float64:
|
||||||
|
|
||||||
|
```go
|
||||||
|
type MyEnum = float64
|
||||||
|
|
||||||
|
const (
|
||||||
|
MyEnumOne MyEnum = iota
|
||||||
|
MyEnumTwo
|
||||||
|
MyEnumThree
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
In Javascript, you can then use the following:
|
||||||
|
|
||||||
|
```js
|
||||||
|
const MyEnum = {
|
||||||
|
MyEnumOne: 0,
|
||||||
|
MyEnumTwo: 1,
|
||||||
|
MyEnumThree: 2,
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
- Why use `float64`? Can't we use `int`?
|
||||||
|
- Because JavaScript doesn't have a concept of `int`. Everything is a
|
||||||
|
`number`, which translates to `float64` in Go. There are also restrictions
|
||||||
|
on casting types in Go's reflection package, which means using `int` doesn't
|
||||||
|
work.
|
66
docs/src/content/docs/development/changes_events.md
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
---
|
||||||
|
title: Changes (Events)
|
||||||
|
sidebar:
|
||||||
|
order: 40
|
||||||
|
---
|
||||||
|
|
||||||
|
In v3, there are 3 types of events:
|
||||||
|
|
||||||
|
- Application Events
|
||||||
|
- Window Events
|
||||||
|
- Custom Events
|
||||||
|
|
||||||
|
### Application Events
|
||||||
|
|
||||||
|
Application events are events that are emitted by the application. These events
|
||||||
|
include native events such as `ApplicationDidFinishLaunching` on macOS.
|
||||||
|
|
||||||
|
### Window Events
|
||||||
|
|
||||||
|
Window events are events that are emitted by a window. These events include
|
||||||
|
native events such as `WindowDidBecomeMain` on macOS. Common events are also
|
||||||
|
defined, so they work cross-platform, e.g. `WindowClosing`.
|
||||||
|
|
||||||
|
### Custom Events
|
||||||
|
|
||||||
|
Events that the user defines are called `WailsEvents`. This is to differentiate
|
||||||
|
them from the `Event` object that is used to communicate with the browser.
|
||||||
|
WailsEvents are now objects that encapsulate all the details of an event. This
|
||||||
|
includes the event name, the data, and the source of the event.
|
||||||
|
|
||||||
|
The data associated with a WailsEvent is now a single value. If multiple values
|
||||||
|
are required, then a struct can be used.
|
||||||
|
|
||||||
|
### Event callbacks and `Emit` function signature
|
||||||
|
|
||||||
|
The signatures events callbacks (as used by `On`, `Once` & `OnMultiple`) have
|
||||||
|
changed. In v2, the callback function received optional data. In v3, the
|
||||||
|
callback function receives a `WailsEvent` object that contains all data related
|
||||||
|
to the event.
|
||||||
|
|
||||||
|
Similarly, the `Emit` function has changed. Instead of taking a name and
|
||||||
|
optional data, it now takes a single `WailsEvent` object that it will emit.
|
||||||
|
|
||||||
|
### `Off` and `OffAll`
|
||||||
|
|
||||||
|
In v2, `Off` and `OffAll` calls would remove events in both JS and Go. Due to
|
||||||
|
the multi-window nature of v3, this has been changed so that these methods only
|
||||||
|
apply to the context they are called in. For example, if you call `Off` in a
|
||||||
|
window, it will only remove events for that window. If you use `Off` in Go, it
|
||||||
|
will only remove events for Go.
|
||||||
|
|
||||||
|
### Hooks
|
||||||
|
|
||||||
|
Event Hooks are a new feature in v3. They allow you to hook into the event
|
||||||
|
system and perform actions when certain events are emitted. For example, you can
|
||||||
|
hook into the `WindowClosing` event and perform some cleanup before the window
|
||||||
|
closes. Hooks can be registered at the application level or at the window level
|
||||||
|
using `RegisterHook`. Application level are for application events. Window level
|
||||||
|
hooks will only be called for the window they are registered with.
|
||||||
|
|
||||||
|
### Developer notes
|
||||||
|
|
||||||
|
When emitting an event in Go, it will dispatch the event to local Go listeners
|
||||||
|
and also each window in the application. When emitting an event in JS, it now
|
||||||
|
sends the event to the application. This will be processed as if it was emitted
|
||||||
|
in Go, however the sender ID will be that of the window.
|
15
docs/src/content/docs/development/changes_logging.md
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
title: Changes (Logging)
|
||||||
|
sidebar:
|
||||||
|
order: 140
|
||||||
|
---
|
||||||
|
|
||||||
|
Logging in v2 was confusing as both application logs and system (internal) logs
|
||||||
|
were using the same logger. We have simplified this as follows:
|
||||||
|
|
||||||
|
- Internal logs are now handled using the standard Go `slog` logger. This is
|
||||||
|
configured using the `logger` option in the application options. By default,
|
||||||
|
this uses the [tint](https://github.com/lmittmann/tint) logger.
|
||||||
|
- Application logs can now be achieved through the new `log` plugin which
|
||||||
|
utilises `slog` under the hood. This plugin provides a simple API for logging
|
||||||
|
to the console. It is available in both Go and JS.
|
46
docs/src/content/docs/development/changes_misc.md
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
---
|
||||||
|
title: Changes (Misc)
|
||||||
|
sidebar:
|
||||||
|
order: 150
|
||||||
|
---
|
||||||
|
|
||||||
|
## Windows Application Options
|
||||||
|
|
||||||
|
### WndProcInterceptor
|
||||||
|
|
||||||
|
If this is set, the WndProc will be intercepted and the function will be called.
|
||||||
|
This allows you to handle Windows messages directly. The function should have
|
||||||
|
the following signature:
|
||||||
|
|
||||||
|
```go
|
||||||
|
func(hwnd uintptr, msg uint32, wParam, lParam uintptr) (returnValue uintptr, shouldReturn)
|
||||||
|
```
|
||||||
|
|
||||||
|
The `shouldReturn` value should be set to `true` if the returnValue should be
|
||||||
|
returned by the main wndProc method. If it is set to `false`, the return value
|
||||||
|
will be ignored and the message will continue to be processed by the main
|
||||||
|
wndProc method.
|
||||||
|
|
||||||
|
## Hide Window on Close + OnBeforeClose
|
||||||
|
|
||||||
|
In v2, there was the `HideWindowOnClose` flag to hide the window when it closed.
|
||||||
|
There was a logical overlap between this flag and the `OnBeforeClose` callback.
|
||||||
|
In v3, the `HideWindowOnClose` flag has been removed and the `OnBeforeClose`
|
||||||
|
callback has been renamed to `ShouldClose`. The `ShouldClose` callback is called
|
||||||
|
when the user attempts to close a window. If the callback returns `true`, the
|
||||||
|
window will close. If it returns `false`, the window will not close. This can be
|
||||||
|
used to hide the window instead of closing it.
|
||||||
|
|
||||||
|
## Window Drag
|
||||||
|
|
||||||
|
In v2, the `--wails-drag` attribute was used to indicate that an element could
|
||||||
|
be used to drag the window. In v3, this has been replaced with
|
||||||
|
`--webkit-app-region` to be more in line with the way other frameworks handle
|
||||||
|
this. The `--webkit-app-region` attribute can be set to any of the following
|
||||||
|
values:
|
||||||
|
|
||||||
|
- `drag` - The element can be used to drag the window
|
||||||
|
- `no-drag` - The element cannot be used to drag the window
|
||||||
|
|
||||||
|
We would have ideally liked to use `app-region`, however this is not supported
|
||||||
|
by the `getComputedStyle` call on webkit on macOS.
|
38
docs/src/content/docs/development/changes_plugins.md
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
---
|
||||||
|
title: Changes (Plugins)
|
||||||
|
sidebar:
|
||||||
|
order: 130
|
||||||
|
---
|
||||||
|
|
||||||
|
Plugins are a way to extend the functionality of your Wails application.
|
||||||
|
|
||||||
|
### Creating a plugin
|
||||||
|
|
||||||
|
Plugins are standard Go structure that adhere to the following interface:
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Plugin interface {
|
||||||
|
Name() string
|
||||||
|
Init(*application.App) error
|
||||||
|
Shutdown()
|
||||||
|
CallableByJS() []string
|
||||||
|
InjectJS() string
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The `Name()` method returns the name of the plugin. This is used for logging
|
||||||
|
purposes.
|
||||||
|
|
||||||
|
The `Init(*application.App) error` method is called when the plugin is loaded.
|
||||||
|
The `*application.App` parameter is the application that the plugin is being
|
||||||
|
loaded into. Any errors will prevent the application from starting.
|
||||||
|
|
||||||
|
The `Shutdown()` method is called when the application is shutting down.
|
||||||
|
|
||||||
|
The `CallableByJS()` method returns a list of exported functions that can be
|
||||||
|
called from the frontend. These method names must exactly match the names of the
|
||||||
|
methods exported by the plugin.
|
||||||
|
|
||||||
|
The `InjectJS()` method returns JavaScript that should be injected into all
|
||||||
|
windows as they are created. This is useful for adding custom JavaScript
|
||||||
|
functions that complement the plugin.
|
17
docs/src/content/docs/development/changes_systray.md
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
title: Changes (Systray)
|
||||||
|
sidebar:
|
||||||
|
order: 60
|
||||||
|
---
|
||||||
|
|
||||||
|
Wails 3 comes with a built-in systray. This is a fully featured systray that has
|
||||||
|
been designed to be as simple as possible to use. It is possible to set the
|
||||||
|
icon, tooltip and menu of the systray. It is possible to also "attach" a window
|
||||||
|
to the systray. Doing this will provide the following functionality:
|
||||||
|
|
||||||
|
- Clicking the systray icon with toggle the window visibility
|
||||||
|
- Right-clicking the systray will open the menu, if there is one
|
||||||
|
|
||||||
|
On macOS, if there is no attached window, the systray will use the default
|
||||||
|
method of displaying the menu (any button). If there is an attached window but
|
||||||
|
no menu, the systray will toggle the window regardless of the button pressed.
|
40
docs/src/content/docs/development/changes_window.md
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
---
|
||||||
|
title: Changes (Window)
|
||||||
|
sidebar:
|
||||||
|
order: 50
|
||||||
|
---
|
||||||
|
|
||||||
|
The Window API has largely remained the same, however the methods are now on an
|
||||||
|
instance of a window rather than the runtime. Some notable differences are:
|
||||||
|
|
||||||
|
- Windows now have a Name that identifies them. This is used to identify the
|
||||||
|
window when emitting events.
|
||||||
|
- Windows have even more methods that were previously unavailable, such as
|
||||||
|
`SetFrameless` and `ToggleDevTools`.
|
||||||
|
- Windows can now accept files via native drag and drop. See the Drag and Drop
|
||||||
|
section for more details.
|
||||||
|
|
||||||
|
### BackgroundColour
|
||||||
|
|
||||||
|
In v2, this was a pointer to an `RGBA` struct. In v3, this is an `RGBA` struct
|
||||||
|
value.
|
||||||
|
|
||||||
|
### WindowIsTranslucent
|
||||||
|
|
||||||
|
This flag has been removed. Now there is a `BackgroundType` flag that can be
|
||||||
|
used to set the type of background the window should have. This flag can be set
|
||||||
|
to any of the following values:
|
||||||
|
|
||||||
|
- `BackgroundTypeSolid` - The window will have a solid background
|
||||||
|
- `BackgroundTypeTransparent` - The window will have a transparent background
|
||||||
|
- `BackgroundTypeTranslucent` - The window will have a translucent background
|
||||||
|
|
||||||
|
On Windows, if the `BackgroundType` is set to `BackgroundTypeTranslucent`, the
|
||||||
|
type of translucency can be set using the `BackdropType` flag in the
|
||||||
|
`WindowsWindow` options. This can be set to any of the following values:
|
||||||
|
|
||||||
|
- `Auto` - The window will use an effect determined by the system
|
||||||
|
- `None` - The window will have no background
|
||||||
|
- `Mica` - The window will use the Mica effect
|
||||||
|
- `Acrylic` - The window will use the acrylic effect
|
||||||
|
- `Tabbed` - The window will use the tabbed effect
|
54
docs/src/content/docs/development/changes_wml.md
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
---
|
||||||
|
title: Changes (WML)
|
||||||
|
sidebar:
|
||||||
|
order: 120
|
||||||
|
---
|
||||||
|
|
||||||
|
The Wails Markup Language (**WML**) is a simple markup language that allows you
|
||||||
|
to add functionality to standard HTML elements without the use of Javascript.
|
||||||
|
|
||||||
|
The following tags are currently supported:
|
||||||
|
|
||||||
|
### `data-wml-event`
|
||||||
|
|
||||||
|
This specifies that a Wails event will be emitted when the element is clicked.
|
||||||
|
The value of the attribute should be the name of the event to emit.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<button data-wml-event="myevent">Click Me</button>
|
||||||
|
```
|
||||||
|
|
||||||
|
Sometimes you need the user to confirm an action. This can be done by adding the
|
||||||
|
`data-wml-confirm` attribute to the element. The value of this attribute will be
|
||||||
|
the message to display to the user.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<button data-wml-event="delete-all-items" data-wml-confirm="Are you sure?">
|
||||||
|
Delete All Items
|
||||||
|
</button>
|
||||||
|
```
|
||||||
|
|
||||||
|
### `data-wml-window`
|
||||||
|
|
||||||
|
Any `wails.window` method can be called by adding the `data-wml-window`
|
||||||
|
attribute to an element. The value of the attribute should be the name of the
|
||||||
|
method to call. The method name should be in the same case as the method.
|
||||||
|
|
||||||
|
```html
|
||||||
|
<button data-wml-window="Close">Close Window</button>
|
||||||
|
```
|
||||||
|
|
||||||
|
### `data-wml-trigger`
|
||||||
|
|
||||||
|
This attribute specifies which javascript event should trigger the action. The
|
||||||
|
default is `click`.
|
||||||
|
|
||||||
|
```html
|
||||||
|
<button data-wml-event="hover-box" data-wml-trigger="mouseover">
|
||||||
|
Hover over me!
|
||||||
|
</button>
|
||||||
|
```
|
228
docs/src/content/docs/development/introduction.mdx
Normal file
@ -0,0 +1,228 @@
|
|||||||
|
---
|
||||||
|
title: Introduction
|
||||||
|
sidebar:
|
||||||
|
order: 10
|
||||||
|
---
|
||||||
|
|
||||||
|
import { FileTree } from "@astrojs/starlight/components";
|
||||||
|
|
||||||
|
:::note
|
||||||
|
|
||||||
|
This guide is a work in progress.
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
Thanks for wanting to help out with development of Wails! This guide will help
|
||||||
|
you get started.
|
||||||
|
|
||||||
|
## Getting Started
|
||||||
|
|
||||||
|
- Git clone this repository. Checkout the `v3-alpha` branch.
|
||||||
|
- Install the CLI: `cd v3/cmd/wails3 && go install`
|
||||||
|
|
||||||
|
- Optional: If you want to use the build system to build frontend code, you will
|
||||||
|
need to install [npm](https://nodejs.org/en/download).
|
||||||
|
|
||||||
|
## Building
|
||||||
|
|
||||||
|
For simple programs, you can use the standard `go build` command. It's also
|
||||||
|
possible to use `go run`.
|
||||||
|
|
||||||
|
Wails also comes with a build system that can be used to build more complex
|
||||||
|
projects. It utilises the awesome [Task](https://taskfile.dev) build system. For
|
||||||
|
more information, check out the task homepage or run `wails task --help`.
|
||||||
|
|
||||||
|
## Project layout
|
||||||
|
|
||||||
|
The project has the following structure:
|
||||||
|
|
||||||
|
<FileTree>
|
||||||
|
|
||||||
|
- v3
|
||||||
|
- cmd/wails3 CLI
|
||||||
|
- examples Examples of Wails apps
|
||||||
|
- internal Internal packages
|
||||||
|
- runtime The Wails JS runtime
|
||||||
|
- templates The supported project templates
|
||||||
|
- pkg
|
||||||
|
- application The core Wails library
|
||||||
|
- events The event definitions
|
||||||
|
- mac macOS specific code used by plugins
|
||||||
|
- w32 Windows specific code
|
||||||
|
- plugins Supported plugins
|
||||||
|
- tasks General tasks
|
||||||
|
- Taskfile.yaml Development tasks configuration
|
||||||
|
|
||||||
|
</FileTree>
|
||||||
|
|
||||||
|
## Development
|
||||||
|
|
||||||
|
### Alpha To-Do List
|
||||||
|
|
||||||
|
We are currently tracking known issues and tasks in the
|
||||||
|
[Alpha Todo List](https://github.com/orgs/wailsapp/projects/6). If you want to
|
||||||
|
help out, please check this list and follow the instructions in the
|
||||||
|
[Feedback](/getting-started/feedback) page.
|
||||||
|
|
||||||
|
### Adding window functionality
|
||||||
|
|
||||||
|
The preferred way to add window functionality is to add a new function to the
|
||||||
|
`pkg/application/webview_window.go` file. This should implement all the
|
||||||
|
functionality required for all platforms. Any platform specific code should be
|
||||||
|
called via a `webviewWindowImpl` interface method. This interface is implemented
|
||||||
|
by each of the target platforms to provide the platform specific functionality.
|
||||||
|
In some cases, this may do nothing. Once you've added the interface method,
|
||||||
|
ensure each platform implements it. A good example of this is the `SetMinSize`
|
||||||
|
method.
|
||||||
|
|
||||||
|
- Mac: `webview_window_darwin.go`
|
||||||
|
- Windows: `webview_window_windows.go`
|
||||||
|
- Linux: `webview_window_linux.go`
|
||||||
|
|
||||||
|
Most, if not all, of the platform specific code should be run on the main
|
||||||
|
thread. To simplify this, there are a number of `invokeSync` methods defined in
|
||||||
|
`application.go`.
|
||||||
|
|
||||||
|
### Updating the runtime
|
||||||
|
|
||||||
|
The runtime is located in `v3/internal/runtime`. When the runtime is updated,
|
||||||
|
the following steps need to be taken:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
wails3 task runtime:build
|
||||||
|
```
|
||||||
|
|
||||||
|
### Events
|
||||||
|
|
||||||
|
Events are defined in `v3/pkg/events`. When adding a new event, the following
|
||||||
|
steps need to be taken:
|
||||||
|
|
||||||
|
- Add the event to the `events.txt` file
|
||||||
|
- Run `wails3 task events:generate`
|
||||||
|
|
||||||
|
There are a number of types of events: platform specific application and window
|
||||||
|
events + common events. The common events are useful for cross-platform event
|
||||||
|
handling, but you aren't limited to the "lowest common denominator". You can use
|
||||||
|
the platform specific events if you need to.
|
||||||
|
|
||||||
|
When adding a common event, ensure that the platform specific events are mapped.
|
||||||
|
An example of this is in `window_webview_darwin.go`:
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Translate ShouldClose to common WindowClosing event
|
||||||
|
w.parent.On(events.Mac.WindowShouldClose, func(_ *WindowEventContext) {
|
||||||
|
w.parent.emit(events.Common.WindowClosing)
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
NOTE: We may try to automate this in the future by adding the mapping to the
|
||||||
|
event definition.
|
||||||
|
|
||||||
|
### Plugins
|
||||||
|
|
||||||
|
Plugins are a way to extend the functionality of your Wails application.
|
||||||
|
|
||||||
|
#### Creating a plugin
|
||||||
|
|
||||||
|
Plugins are standard Go structure that adhere to the following interface:
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Plugin interface {
|
||||||
|
Name() string
|
||||||
|
Init(*application.App) error
|
||||||
|
Shutdown()
|
||||||
|
CallableByJS() []string
|
||||||
|
InjectJS() string
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The `Name()` method returns the name of the plugin. This is used for logging
|
||||||
|
purposes.
|
||||||
|
|
||||||
|
The `Init(*application.App) error` method is called when the plugin is loaded.
|
||||||
|
The `*application.App` parameter is the application that the plugin is being
|
||||||
|
loaded into. Any errors will prevent the application from starting.
|
||||||
|
|
||||||
|
The `Shutdown()` method is called when the application is shutting down.
|
||||||
|
|
||||||
|
The `CallableByJS()` method returns a list of exported functions that can be
|
||||||
|
called from the frontend. These method names must exactly match the names of the
|
||||||
|
methods exported by the plugin.
|
||||||
|
|
||||||
|
The `InjectJS()` method returns JavaScript that should be injected into all
|
||||||
|
windows as they are created. This is useful for adding custom JavaScript
|
||||||
|
functions that complement the plugin.
|
||||||
|
|
||||||
|
The built-in plugins can be found in the `v3/plugins` directory. Check them out
|
||||||
|
for inspiration.
|
||||||
|
|
||||||
|
## Tasks
|
||||||
|
|
||||||
|
The Wails CLI uses the [Task](https://taskfile.dev) build system. It is imported
|
||||||
|
as a library and used to run the tasks defined in `Taskfile.yaml`. The main
|
||||||
|
interfacing with Task happens in `v3/internal/commands/task.go`.
|
||||||
|
|
||||||
|
### Upgrading Taskfile
|
||||||
|
|
||||||
|
To check if there's an upgrade for Taskfile, run `wails3 task -version` and
|
||||||
|
check against the Task website.
|
||||||
|
|
||||||
|
To upgrade the version of Taskfile used, run:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
wails3 task taskfile:upgrade
|
||||||
|
```
|
||||||
|
|
||||||
|
If there are incompatibilities then they should appear in the
|
||||||
|
`v3/internal/commands/task.go` file.
|
||||||
|
|
||||||
|
Usually the best way to fix incompatibilities is to clone the task repo at
|
||||||
|
`https://github.com/go-task/task` and look at the git history to determine what
|
||||||
|
has changed and why.
|
||||||
|
|
||||||
|
To check all changes have worked correctly, re-install the CLI and check the
|
||||||
|
version again:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
wails3 task cli:install
|
||||||
|
wails3 task -version
|
||||||
|
```
|
||||||
|
|
||||||
|
## Opening a PR
|
||||||
|
|
||||||
|
Make sure that all PRs have a ticket associated with them providing context for
|
||||||
|
the change. If there is no ticket, please create one first. Ensure that all PRs
|
||||||
|
have updated the CHANGELOG.md file with the changes made. The CHANGELOG.md file
|
||||||
|
is located in the `mkdocs-website/docs` directory.
|
||||||
|
|
||||||
|
## Misc Tasks
|
||||||
|
|
||||||
|
### Upgrading Taskfile
|
||||||
|
|
||||||
|
The Wails CLI uses the [Task](https://taskfile.dev) build system. It is imported
|
||||||
|
as a library and used to run the tasks defined in `Taskfile.yaml`. The main
|
||||||
|
interfacing with Task happens in `v3/internal/commands/task.go`.
|
||||||
|
|
||||||
|
To check if there's an upgrade for Taskfile, run `wails3 task -version` and
|
||||||
|
check against the Task website.
|
||||||
|
|
||||||
|
To upgrade the version of Taskfile used, run:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
wails3 task taskfile:upgrade
|
||||||
|
```
|
||||||
|
|
||||||
|
If there are incompatibilities then they should appear in the
|
||||||
|
`v3/internal/commands/task.go` file.
|
||||||
|
|
||||||
|
Usually the best way to fix incompatibilities is to clone the task repo at
|
||||||
|
`https://github.com/go-task/task` and look at the git history to determine what
|
||||||
|
has changed and why.
|
||||||
|
|
||||||
|
To check all changes have worked correctly, re-install the CLI and check the
|
||||||
|
version again:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
wails3 task cli:install
|
||||||
|
wails3 task -version
|
||||||
|
```
|
403
docs/src/content/docs/development/status.md
Normal file
@ -0,0 +1,403 @@
|
|||||||
|
---
|
||||||
|
title: Status
|
||||||
|
sidebar:
|
||||||
|
order: 20
|
||||||
|
---
|
||||||
|
|
||||||
|
Status of features in v3.
|
||||||
|
|
||||||
|
:::note
|
||||||
|
|
||||||
|
This list is a mixture of public and internal API support.
|
||||||
|
|
||||||
|
It is not complete and probably not up to date.
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
### Legend
|
||||||
|
|
||||||
|
- ✅ = Supported
|
||||||
|
- 🚧 = Under Development
|
||||||
|
- ❔ = Untested
|
||||||
|
- ❌ = Not available on the platform
|
||||||
|
|
||||||
|
## Known Issues
|
||||||
|
|
||||||
|
- Linux is not yet up to feature parity with Windows/Mac
|
||||||
|
|
||||||
|
## Application
|
||||||
|
|
||||||
|
Application interface methods
|
||||||
|
|
||||||
|
| Method | Windows | Linux | Mac | Notes |
|
||||||
|
| ------------------------------------------------------------- | ------- | ----- | --- | ----- |
|
||||||
|
| run() error | ✅ | ✅ | ✅ | |
|
||||||
|
| destroy() | | ✅ | ✅ | |
|
||||||
|
| setApplicationMenu(menu \*Menu) | ✅ | ✅ | ✅ | |
|
||||||
|
| name() string | | ✅ | ✅ | |
|
||||||
|
| getCurrentWindowID() uint | ✅ | ✅ | ✅ | |
|
||||||
|
| showAboutDialog(name string, description string, icon []byte) | | ✅ | ✅ | |
|
||||||
|
| setIcon(icon []byte) | ❌ | ✅ | ✅ | |
|
||||||
|
| on(id uint) | | | ✅ | |
|
||||||
|
| dispatchOnMainThread(fn func()) | ✅ | ✅ | ✅ | |
|
||||||
|
| hide() | ✅ | ✅ | ✅ | |
|
||||||
|
| show() | ✅ | ✅ | ✅ | |
|
||||||
|
| getPrimaryScreen() (\*Screen, error) | | ✅ | ✅ | |
|
||||||
|
| getScreens() ([]\*Screen, error) | | ✅ | ✅ | |
|
||||||
|
|
||||||
|
## Webview Window
|
||||||
|
|
||||||
|
Webview Window Interface Methods
|
||||||
|
|
||||||
|
| Method | Windows | Linux | Mac | Notes |
|
||||||
|
| -------------------------------------------------- | ------- | ----- | --- | ---------------------------------------- |
|
||||||
|
| center() | ✅ | ✅ | ✅ | |
|
||||||
|
| close() | ✅ | ✅ | ✅ | |
|
||||||
|
| destroy() | | ✅ | ✅ | |
|
||||||
|
| execJS(js string) | ✅ | ✅ | ✅ | |
|
||||||
|
| focus() | ✅ | ✅ | | |
|
||||||
|
| forceReload() | | ✅ | ✅ | |
|
||||||
|
| fullscreen() | ✅ | ✅ | ✅ | |
|
||||||
|
| getScreen() (\*Screen, error) | ✅ | ✅ | ✅ | |
|
||||||
|
| getZoom() float64 | | ✅ | ✅ | |
|
||||||
|
| height() int | ✅ | ✅ | ✅ | |
|
||||||
|
| hide() | ✅ | ✅ | ✅ | |
|
||||||
|
| isFullscreen() bool | ✅ | ✅ | ✅ | |
|
||||||
|
| isMaximised() bool | ✅ | ✅ | ✅ | |
|
||||||
|
| isMinimised() bool | ✅ | ✅ | ✅ | |
|
||||||
|
| maximise() | ✅ | ✅ | ✅ | |
|
||||||
|
| minimise() | ✅ | ✅ | ✅ | |
|
||||||
|
| nativeWindowHandle() (uintptr, error) | ✅ | ✅ | ✅ | |
|
||||||
|
| on(eventID uint) | ✅ | | ✅ | |
|
||||||
|
| openContextMenu(menu *Menu, data *ContextMenuData) | ✅ | ✅ | ✅ | |
|
||||||
|
| relativePosition() (int, int) | ✅ | ✅ | ✅ | |
|
||||||
|
| reload() | ✅ | ✅ | ✅ | |
|
||||||
|
| run() | ✅ | ✅ | ✅ | |
|
||||||
|
| setAlwaysOnTop(alwaysOnTop bool) | ✅ | ✅ | ✅ | |
|
||||||
|
| setBackgroundColour(color RGBA) | ✅ | ✅ | ✅ | |
|
||||||
|
| setEnabled(bool) | | ✅ | ✅ | |
|
||||||
|
| setFrameless(bool) | | ✅ | ✅ | |
|
||||||
|
| setFullscreenButtonEnabled(enabled bool) | ❌ | ✅ | ✅ | There is no fullscreen button in Windows |
|
||||||
|
| setHTML(html string) | ✅ | ✅ | ✅ | |
|
||||||
|
| setMaxSize(width, height int) | ✅ | ✅ | ✅ | |
|
||||||
|
| setMinSize(width, height int) | ✅ | ✅ | ✅ | |
|
||||||
|
| setRelativePosition(x int, y int) | ✅ | ✅ | ✅ | |
|
||||||
|
| setResizable(resizable bool) | ✅ | ✅ | ✅ | |
|
||||||
|
| setSize(width, height int) | ✅ | ✅ | ✅ | |
|
||||||
|
| setTitle(title string) | ✅ | ✅ | ✅ | |
|
||||||
|
| setURL(url string) | ✅ | ✅ | ✅ | |
|
||||||
|
| setZoom(zoom float64) | ✅ | ✅ | ✅ | |
|
||||||
|
| show() | ✅ | ✅ | ✅ | |
|
||||||
|
| size() (int, int) | ✅ | ✅ | ✅ | |
|
||||||
|
| toggleDevTools() | ✅ | ✅ | ✅ | |
|
||||||
|
| unfullscreen() | ✅ | ✅ | ✅ | |
|
||||||
|
| unmaximise() | ✅ | ✅ | ✅ | |
|
||||||
|
| unminimise() | ✅ | ✅ | ✅ | |
|
||||||
|
| width() int | ✅ | ✅ | ✅ | |
|
||||||
|
| zoom() | | ✅ | ✅ | |
|
||||||
|
| zoomIn() | ✅ | ✅ | ✅ | |
|
||||||
|
| zoomOut() | ✅ | ✅ | ✅ | |
|
||||||
|
| zoomReset() | ✅ | ✅ | ✅ | |
|
||||||
|
|
||||||
|
## Runtime
|
||||||
|
|
||||||
|
### Application
|
||||||
|
|
||||||
|
| Feature | Windows | Linux | Mac | Notes |
|
||||||
|
| ------- | ------- | ----- | --- | ----- |
|
||||||
|
| Quit | ✅ | ✅ | ✅ | |
|
||||||
|
| Hide | ✅ | ✅ | ✅ | |
|
||||||
|
| Show | ✅ | | ✅ | |
|
||||||
|
|
||||||
|
### Dialogs
|
||||||
|
|
||||||
|
| Feature | Windows | Linux | Mac | Notes |
|
||||||
|
| -------- | ------- | ----- | --- | ----- |
|
||||||
|
| Info | ✅ | ✅ | ✅ | |
|
||||||
|
| Warning | ✅ | ✅ | ✅ | |
|
||||||
|
| Error | ✅ | ✅ | ✅ | |
|
||||||
|
| Question | ✅ | ✅ | ✅ | |
|
||||||
|
| OpenFile | ✅ | ✅ | ✅ | |
|
||||||
|
| SaveFile | ✅ | ✅ | ✅ | |
|
||||||
|
|
||||||
|
### Clipboard
|
||||||
|
|
||||||
|
| Feature | Windows | Linux | Mac | Notes |
|
||||||
|
| ------- | ------- | ----- | --- | ----- |
|
||||||
|
| SetText | ✅ | ✅ | ✅ | |
|
||||||
|
| Text | ✅ | ✅ | ✅ | |
|
||||||
|
|
||||||
|
### ContextMenu
|
||||||
|
|
||||||
|
| Feature | Windows | Linux | Mac | Notes |
|
||||||
|
| ---------------- | ------- | ----- | --- | ----- |
|
||||||
|
| OpenContextMenu | ✅ | ✅ | ✅ | |
|
||||||
|
| On By Default | | | | |
|
||||||
|
| Control via HTML | ✅ | | | |
|
||||||
|
|
||||||
|
The default context menu is enabled by default for all elements that are
|
||||||
|
`contentEditable: true`, `<input>` or `<textarea>` tags or have the
|
||||||
|
`--default-contextmenu: true` style set. The `--default-contextmenu: show` style
|
||||||
|
will always show the context menu The `--default-contextmenu: hide` style will
|
||||||
|
always hide the context menu
|
||||||
|
|
||||||
|
Anything nested under a tag with `--default-contextmenu: hide` style will not
|
||||||
|
show the context menu unless it is explicitly set with
|
||||||
|
`--default-contextmenu: show`.
|
||||||
|
|
||||||
|
### Screens
|
||||||
|
|
||||||
|
| Feature | Windows | Linux | Mac | Notes |
|
||||||
|
| ---------- | ------- | ----- | --- | ----- |
|
||||||
|
| GetAll | ✅ | ✅ | ✅ | |
|
||||||
|
| GetPrimary | ✅ | ✅ | ✅ | |
|
||||||
|
| GetCurrent | ✅ | ✅ | ✅ | |
|
||||||
|
|
||||||
|
### System
|
||||||
|
|
||||||
|
| Feature | Windows | Linux | Mac | Notes |
|
||||||
|
| ---------- | ------- | ----- | --- | ----- |
|
||||||
|
| IsDarkMode | | | ✅ | |
|
||||||
|
|
||||||
|
### Window
|
||||||
|
|
||||||
|
| Feature | Windows | Linux | Mac | Notes |
|
||||||
|
| ------------------- | ------- | ----- | --- | ------------------------------------------------------------------------------------ |
|
||||||
|
| Center | ✅ | ✅ | ✅ | |
|
||||||
|
| Focus | ✅ | ✅ | | |
|
||||||
|
| FullScreen | ✅ | ✅ | ✅ | |
|
||||||
|
| GetZoom | ✅ | ✅ | ✅ | Get current view scale |
|
||||||
|
| Height | ✅ | ✅ | ✅ | |
|
||||||
|
| Hide | ✅ | ✅ | ✅ | |
|
||||||
|
| Maximise | ✅ | ✅ | ✅ | |
|
||||||
|
| Minimise | ✅ | ✅ | ✅ | |
|
||||||
|
| RelativePosition | ✅ | ✅ | ✅ | |
|
||||||
|
| Screen | ✅ | ✅ | ✅ | Get screen for window |
|
||||||
|
| SetAlwaysOnTop | ✅ | ✅ | ✅ | |
|
||||||
|
| SetBackgroundColour | ✅ | ✅ | ✅ | https://github.com/MicrosoftEdge/WebView2Feedback/issues/1621#issuecomment-938234294 |
|
||||||
|
| SetEnabled | ✅ | ❔ | ❌ | Set the window to be enabled/disabled |
|
||||||
|
| SetMaxSize | ✅ | ✅ | ✅ | |
|
||||||
|
| SetMinSize | ✅ | ✅ | ✅ | |
|
||||||
|
| SetRelativePosition | ✅ | ✅ | ✅ | |
|
||||||
|
| SetResizable | ✅ | ✅ | ✅ | |
|
||||||
|
| SetSize | ✅ | ✅ | ✅ | |
|
||||||
|
| SetTitle | ✅ | ✅ | ✅ | |
|
||||||
|
| SetZoom | ✅ | ✅ | ✅ | Set view scale |
|
||||||
|
| Show | ✅ | ✅ | ✅ | |
|
||||||
|
| Size | ✅ | ✅ | ✅ | |
|
||||||
|
| UnFullscreen | ✅ | ✅ | ✅ | |
|
||||||
|
| UnMaximise | ✅ | ✅ | ✅ | |
|
||||||
|
| UnMinimise | ✅ | ✅ | ✅ | |
|
||||||
|
| Width | ✅ | ✅ | ✅ | |
|
||||||
|
| ZoomIn | ✅ | ✅ | ✅ | Increase view scale |
|
||||||
|
| ZoomOut | ✅ | ✅ | ✅ | Decrease view scale |
|
||||||
|
| ZoomReset | ✅ | ✅ | ✅ | Reset view scale |
|
||||||
|
|
||||||
|
### Window Options
|
||||||
|
|
||||||
|
| Feature | Windows | Linux | Mac | Notes |
|
||||||
|
| ------------------------------- | ------- | ----- | --- | ------------------------------------------ |
|
||||||
|
| AlwaysOnTop | ✅ | ✅ | | |
|
||||||
|
| BackgroundColour | ✅ | ✅ | | |
|
||||||
|
| BackgroundType | | | | Acrylic seems to work but the others don't |
|
||||||
|
| CSS | ✅ | ✅ | | |
|
||||||
|
| DevToolsEnabled | ✅ | ✅ | ✅ | |
|
||||||
|
| DisableResize | ✅ | ✅ | | |
|
||||||
|
| EnableDragAndDrop | | ✅ | | |
|
||||||
|
| EnableFraudulentWebsiteWarnings | | | | |
|
||||||
|
| Focused | ✅ | ✅ | | |
|
||||||
|
| Frameless | ✅ | ✅ | | |
|
||||||
|
| FullscreenButtonEnabled | ✅ | | | |
|
||||||
|
| Height | ✅ | ✅ | | |
|
||||||
|
| Hidden | ✅ | ✅ | | |
|
||||||
|
| HTML | ✅ | ✅ | | |
|
||||||
|
| JS | ✅ | ✅ | | |
|
||||||
|
| Mac | ❌ | ❌ | | |
|
||||||
|
| MaxHeight | ✅ | ✅ | | |
|
||||||
|
| MaxWidth | ✅ | ✅ | | |
|
||||||
|
| MinHeight | ✅ | ✅ | | |
|
||||||
|
| MinWidth | ✅ | ✅ | | |
|
||||||
|
| Name | ✅ | ✅ | | |
|
||||||
|
| OpenInspectorOnStartup | | | | |
|
||||||
|
| StartState | ✅ | | | |
|
||||||
|
| Title | ✅ | ✅ | | |
|
||||||
|
| URL | ✅ | ✅ | | |
|
||||||
|
| Width | ✅ | ✅ | | |
|
||||||
|
| Windows | ✅ | ❌ | ❌ | |
|
||||||
|
| X | ✅ | ✅ | | |
|
||||||
|
| Y | ✅ | ✅ | | |
|
||||||
|
| Zoom | | | | |
|
||||||
|
| ZoomControlEnabled | | | | |
|
||||||
|
|
||||||
|
### Log
|
||||||
|
|
||||||
|
To log or not to log? System logger vs custom logger.
|
||||||
|
|
||||||
|
## Menu
|
||||||
|
|
||||||
|
| Event | Windows | Linux | Mac | Notes |
|
||||||
|
| ------------------------ | ------- | ----- | --- | ----- |
|
||||||
|
| Default Application Menu | ✅ | ✅ | ✅ | |
|
||||||
|
|
||||||
|
## Tray Menus
|
||||||
|
|
||||||
|
| Feature | Windows | Linux | Mac | Notes |
|
||||||
|
| ------------------ | ------- | ----- | --- | -------------------------------------------------------------------- |
|
||||||
|
| Icon | ✅ | ✅ | ✅ | Windows has default icons for light/dark mode & supports PNG or ICO. |
|
||||||
|
| Label | ❌ | ✅ | ✅ | |
|
||||||
|
| Label (ANSI Codes) | ❌ | | | |
|
||||||
|
| Menu | ✅ | ✅ | ✅ | |
|
||||||
|
|
||||||
|
### Methods
|
||||||
|
|
||||||
|
| Method | Windows | Linux | Mac | Notes |
|
||||||
|
| ----------------------------- | ------- | ----- | --- | ---------------------------------- |
|
||||||
|
| setLabel(label string) | ❌ | ✅ | ✅ | |
|
||||||
|
| run() | ✅ | ✅ | ✅ | |
|
||||||
|
| setIcon(icon []byte) | ✅ | ✅ | ✅ | |
|
||||||
|
| setMenu(menu \*Menu) | ✅ | ✅ | ✅ | |
|
||||||
|
| setIconPosition(position int) | ❌ | ✅ | ✅ | |
|
||||||
|
| setTemplateIcon(icon []byte) | ❌ | ✅ | ✅ | |
|
||||||
|
| destroy() | ✅ | ✅ | ✅ | |
|
||||||
|
| setDarkModeIcon(icon []byte) | ✅ | ✅ | ✅ | Darkmode isn't handled yet (linux) |
|
||||||
|
|
||||||
|
## Cross Platform Events
|
||||||
|
|
||||||
|
Mapping native events to cross-platform events.
|
||||||
|
|
||||||
|
| Event | Windows | Linux | Mac | Notes |
|
||||||
|
| ------------------------ | ------- | ----- | --------------- | ----- |
|
||||||
|
| WindowWillClose | | | WindowWillClose | |
|
||||||
|
| WindowDidClose | | | | |
|
||||||
|
| WindowDidResize | | | | |
|
||||||
|
| WindowDidHide | | | | |
|
||||||
|
| ApplicationWillTerminate | | | | |
|
||||||
|
|
||||||
|
... Add more
|
||||||
|
|
||||||
|
## Bindings Generation
|
||||||
|
|
||||||
|
Working well.
|
||||||
|
|
||||||
|
## Models Generation
|
||||||
|
|
||||||
|
Working well.
|
||||||
|
|
||||||
|
## Task file
|
||||||
|
|
||||||
|
Contains a lot needed for development.
|
||||||
|
|
||||||
|
## Theme
|
||||||
|
|
||||||
|
| Mode | Windows | Linux | Mac | Notes |
|
||||||
|
| ------ | ------- | ----- | --- | ----- |
|
||||||
|
| Dark | ✅ | | | |
|
||||||
|
| Light | ✅ | | | |
|
||||||
|
| System | ✅ | | | |
|
||||||
|
|
||||||
|
## NSIS Installer
|
||||||
|
|
||||||
|
TBD
|
||||||
|
|
||||||
|
## Templates
|
||||||
|
|
||||||
|
All templates are working.
|
||||||
|
|
||||||
|
## Plugins
|
||||||
|
|
||||||
|
Built-in plugin support:
|
||||||
|
|
||||||
|
| Plugin | Windows | Linux | Mac | Notes |
|
||||||
|
| --------------- | ------- | ----- | --- | ----- |
|
||||||
|
| Browser | ✅ | | ✅ | |
|
||||||
|
| KV Store | ✅ | ✅ | ✅ | |
|
||||||
|
| Log | ✅ | ✅ | ✅ | |
|
||||||
|
| Single Instance | ✅ | | ✅ | |
|
||||||
|
| SQLite | ✅ | ✅ | ✅ | |
|
||||||
|
| Start at login | ✅ | | ✅ | |
|
||||||
|
| Server | | | | |
|
||||||
|
|
||||||
|
TODO:
|
||||||
|
|
||||||
|
- Ensure each plugin has a JS wrapper that can be injected into the window.
|
||||||
|
|
||||||
|
## Packaging
|
||||||
|
|
||||||
|
| | Windows | Linux | Mac | Notes |
|
||||||
|
| --------------- | ------- | ----- | --- | ----- |
|
||||||
|
| Icon Generation | ✅ | | ✅ | |
|
||||||
|
| Icon Embedding | ✅ | | ✅ | |
|
||||||
|
| Info.plist | ❌ | | ✅ | |
|
||||||
|
| NSIS Installer | | | ❌ | |
|
||||||
|
| Mac bundle | ❌ | | ✅ | |
|
||||||
|
| Windows exe | ✅ | | ❌ | |
|
||||||
|
|
||||||
|
## Frameless Windows
|
||||||
|
|
||||||
|
| Feature | Windows | Linux | Mac | Notes |
|
||||||
|
| ------- | ------- | ----- | --- | ---------------------------------------------- |
|
||||||
|
| Resize | ✅ | | ✅ | |
|
||||||
|
| Drag | ✅ | ✅ | ✅ | Linux - can always drag with `Meta`+left mouse |
|
||||||
|
|
||||||
|
## Mac Specific
|
||||||
|
|
||||||
|
| Feature | Mac | Notes |
|
||||||
|
| ------------ | --- | ----- |
|
||||||
|
| Translucency | ✅ | |
|
||||||
|
|
||||||
|
### Mac Options
|
||||||
|
|
||||||
|
| Feature | Default | Notes |
|
||||||
|
| ----------------------- | ----------------- | ---------------------------------------------------- |
|
||||||
|
| Backdrop | MacBackdropNormal | Standard solid window |
|
||||||
|
| DisableShadow | false | |
|
||||||
|
| TitleBar | | Standard window decorations by default |
|
||||||
|
| Appearance | DefaultAppearance | |
|
||||||
|
| InvisibleTitleBarHeight | 0 | Creates an invisible title bar for frameless windows |
|
||||||
|
| DisableShadow | false | Disables the window drop shadow |
|
||||||
|
|
||||||
|
## Windows Specific
|
||||||
|
|
||||||
|
| Feature | Windows | Notes |
|
||||||
|
| ------------- | ------- | ----- |
|
||||||
|
| Translucency | ✅ | |
|
||||||
|
| Custom Themes | ✅ | |
|
||||||
|
|
||||||
|
### Windows Options
|
||||||
|
|
||||||
|
| Feature | Default | Notes |
|
||||||
|
| --------------------------------- | ------------- | ------------------------------------------- |
|
||||||
|
| BackdropType | Solid | |
|
||||||
|
| DisableIcon | false | |
|
||||||
|
| Theme | SystemDefault | |
|
||||||
|
| CustomTheme | nil | |
|
||||||
|
| DisableFramelessWindowDecorations | false | |
|
||||||
|
| WindowMask | nil | Makes the window the contents of the bitmap |
|
||||||
|
|
||||||
|
## Linux Specific
|
||||||
|
|
||||||
|
Implementation details for the functions utilized by the `*_linux.go` files are
|
||||||
|
located in the following files:
|
||||||
|
|
||||||
|
- `linux_cgo.go`: CGo implementation
|
||||||
|
- `linux_purego.go`: PureGo implementation
|
||||||
|
|
||||||
|
### CGO
|
||||||
|
|
||||||
|
By default CGO is utilized to compile the Linux port. This prevents easy
|
||||||
|
cross-compilation and so the PureGo implementation is also being simultaneously
|
||||||
|
developed.
|
||||||
|
|
||||||
|
### Purego
|
||||||
|
|
||||||
|
The examples can be compiled using the following command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
CGO_ENABLED=0 go build -tags purego
|
||||||
|
```
|
||||||
|
|
||||||
|
:::note
|
||||||
|
|
||||||
|
Things are currently not working after the refactor
|
||||||
|
|
||||||
|
:::
|
86
docs/src/content/docs/getting-started/feedback.mdx
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
---
|
||||||
|
title: Feedback
|
||||||
|
sidebar:
|
||||||
|
order: 40
|
||||||
|
---
|
||||||
|
|
||||||
|
import { Tabs, TabItem } from "@astrojs/starlight/components";
|
||||||
|
|
||||||
|
We welcome (and encourage) your feedback! Please search for existing tickets or
|
||||||
|
posts before creating new ones. Here are the different ways to provide feedback:
|
||||||
|
|
||||||
|
<Tabs>
|
||||||
|
<TabItem label="Bugs" icon="error">
|
||||||
|
|
||||||
|
If you find a bug, please let us know by posting into the [v3 Alpha Feedback](https://discord.gg/Vgff2p8gsy) channel on Discord.
|
||||||
|
|
||||||
|
- The post should clearly state what the bug is and have a simple reproducible example. If the docs are unclear what *should* happen, please include that in the post.
|
||||||
|
- The post should be given the `Bug` tag.
|
||||||
|
- Please include the output of `wails doctor` in your post.
|
||||||
|
- If the bug is behavior that does not align with current documentation, e.g. a window does not resize properly, please do the following:
|
||||||
|
- Update an existing example in the `v3/example` directory or create a new example in the `v3/examples` folder that clearly shows the issue.
|
||||||
|
- Open a [PR](https://github.com/wailsapp/wails/pulls) with the title `[v3 alpha test] <description of bug>`.
|
||||||
|
- Please include a link to the PR in your post.
|
||||||
|
|
||||||
|
:::caution
|
||||||
|
|
||||||
|
_Remember_, unexpected behavior isn't necessarily a bug - it might just not do
|
||||||
|
what you expect it to do. Use `Suggestions` for this.
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
</TabItem>
|
||||||
|
|
||||||
|
<TabItem label="Fixes" icon="approve-check">
|
||||||
|
|
||||||
|
If you have a fix for a bug or an update for documentation, please do the following:
|
||||||
|
|
||||||
|
- Open a pull request on the [Wails repository](https://github.com/wailsapp/wails). The title of the PR should start with `[v3 alpha]`.
|
||||||
|
- Create a post in the [v3 Alpha Feedback](https://discord.gg/Vgff2p8gsy) channel.
|
||||||
|
- The post should be given the `PR` tag.
|
||||||
|
- Please include a link to the PR in your post.
|
||||||
|
|
||||||
|
</TabItem>
|
||||||
|
|
||||||
|
<TabItem label="Suggestions" icon="puzzle" id="abc">
|
||||||
|
|
||||||
|
If you have a suggestion, please let us know by posting into the [v3 Alpha Feedback](https://discord.gg/Vgff2p8gsy) channel on Discord:
|
||||||
|
|
||||||
|
- The post should be given the `Suggestion` tag.
|
||||||
|
|
||||||
|
Please feel free to reach out to us on [Discord](https://discord.gg/Vgff2p8gsy) if you have any questions.
|
||||||
|
|
||||||
|
</TabItem>
|
||||||
|
|
||||||
|
<TabItem label="Upvoting" icon="star">
|
||||||
|
|
||||||
|
- Posts can be "upvoted" by using the :thumbsup: emoji. Please apply to any posts that are a priority for you.
|
||||||
|
- Please *don't* just add comments like "+1" or "me too".
|
||||||
|
- Please feel free to comment if there is more to add to the post, such as "this bug also affect ARM builds" or "Another option would be to ....."
|
||||||
|
|
||||||
|
</TabItem>
|
||||||
|
|
||||||
|
</Tabs>
|
||||||
|
|
||||||
|
There is a list of known issues & work in progress can be found
|
||||||
|
[here](https://github.com/orgs/wailsapp/projects/6).
|
||||||
|
|
||||||
|
## Things we are looking for feedback on
|
||||||
|
|
||||||
|
- The API
|
||||||
|
- Is it easy to use?
|
||||||
|
- Does it do what you expect?
|
||||||
|
- Is it missing anything?
|
||||||
|
- Is there anything that should be removed?
|
||||||
|
- Is it consistent between Go and JS?
|
||||||
|
- The build system
|
||||||
|
- Is it easy to use?
|
||||||
|
- Can we improve it?
|
||||||
|
- The examples
|
||||||
|
- Are they clear?
|
||||||
|
- Do they cover the basics?
|
||||||
|
- Features
|
||||||
|
- What features are missing?
|
||||||
|
- What features are not needed?
|
||||||
|
- Documentation
|
||||||
|
- What could be clearer?
|
120
docs/src/content/docs/getting-started/installation.mdx
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
---
|
||||||
|
title: Installation
|
||||||
|
sidebar:
|
||||||
|
order: 10
|
||||||
|
---
|
||||||
|
|
||||||
|
import { Tabs, TabItem } from "@astrojs/starlight/components";
|
||||||
|
|
||||||
|
To install the Wails CLI, first ensure you have the correct dependencies
|
||||||
|
installed:
|
||||||
|
|
||||||
|
## Supported Platforms
|
||||||
|
|
||||||
|
- Windows 10/11 AMD64/ARM64
|
||||||
|
- macOS 10.15+ AMD64 (Can deploy to macOS 10.13+)
|
||||||
|
- macOS 11.0+ ARM64
|
||||||
|
- Ubuntu 24.04 AMD64/ARM64 (other Linux may work too!)
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
Wails has a number of common dependencies that are required before installation:
|
||||||
|
|
||||||
|
<Tabs>
|
||||||
|
<TabItem label="Go (At least 1.22.4)" icon="seti:go">
|
||||||
|
|
||||||
|
Download Go from the [Go Downloads Page](https://go.dev/dl/).
|
||||||
|
|
||||||
|
Ensure that you follow the official [Go installation instructions](https://go.dev/doc/install). You will also need to ensure that your `PATH` environment variable also includes the path to your `~/go/bin` directory. Restart your terminal and do the following checks:
|
||||||
|
|
||||||
|
- Check Go is installed correctly: `go version`
|
||||||
|
- Check `~/go/bin` is in your PATH variable
|
||||||
|
- Mac / Linux: `echo $PATH | grep go/bin`
|
||||||
|
- Windows: `$env:PATH -split ';' | Where-Object { $_ -like '*\go\bin' }`
|
||||||
|
|
||||||
|
</TabItem>
|
||||||
|
|
||||||
|
<TabItem label="npm (Optional)" icon="seti:npm">
|
||||||
|
|
||||||
|
Although Wails doesn't require npm to be installed, it is needed by most of the bundled templates.
|
||||||
|
|
||||||
|
Download the latest node installer from the [Node Downloads Page](https://nodejs.org/en/download/). It is best to use the latest release as that is what we generally test against.
|
||||||
|
|
||||||
|
Run `npm --version` to verify.
|
||||||
|
|
||||||
|
</TabItem>
|
||||||
|
|
||||||
|
<TabItem label="Task (Optional)">
|
||||||
|
|
||||||
|
The Wails CLI embeds a task runner called [Task](https://taskfile.dev/#/installation). It is optional, but recommended. If you do not wish to install Task, you can use the `wails3 task` command instead of `task`.
|
||||||
|
Installing Task will give you the greatest flexibility.
|
||||||
|
|
||||||
|
</TabItem>
|
||||||
|
|
||||||
|
</Tabs>
|
||||||
|
|
||||||
|
## Platform Specific Dependencies
|
||||||
|
|
||||||
|
You will also need to install platform specific dependencies:
|
||||||
|
|
||||||
|
<Tabs syncKey="platform">
|
||||||
|
<TabItem label="Mac" icon="apple">
|
||||||
|
|
||||||
|
Wails requires that the xcode command line tools are installed. This can be
|
||||||
|
done by running:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
xcode-select --install
|
||||||
|
```
|
||||||
|
|
||||||
|
</TabItem>
|
||||||
|
<TabItem label="Windows" icon="seti:windows">
|
||||||
|
|
||||||
|
Wails requires that the [WebView2 Runtime](https://developer.microsoft.com/en-us/microsoft-edge/webview2/) is installed. Almost all Windows installations will already have this installed. You can check using the `wails doctor` command.
|
||||||
|
|
||||||
|
</TabItem>
|
||||||
|
<TabItem label="Linux" icon="linux">
|
||||||
|
|
||||||
|
Linux requires the standard `gcc` build tools plus `gtk3` and `webkit2gtk`. Run <code>wails doctor</code> after installation to be shown how to install the dependencies. If your distro/package manager is not supported, please let us know on discord.
|
||||||
|
|
||||||
|
</TabItem>
|
||||||
|
|
||||||
|
</Tabs>
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
To install the Wails CLI using Go Modules, run the following commands:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
go install -v github.com/wailsapp/wails/v3/cmd/wails3@latest
|
||||||
|
```
|
||||||
|
|
||||||
|
If you would like to install the latest development version, run the following
|
||||||
|
commands:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
git clone https://github.com/wailsapp/wails.git
|
||||||
|
cd wails
|
||||||
|
git checkout v3-alpha
|
||||||
|
cd v3/cmd/wails3
|
||||||
|
go install
|
||||||
|
```
|
||||||
|
|
||||||
|
When using the development version, all generated projects will use Go's
|
||||||
|
[replace](https://go.dev/ref/mod#go-mod-file-replace) directive to ensure
|
||||||
|
projects use the development version of Wails.
|
||||||
|
|
||||||
|
## System Check
|
||||||
|
|
||||||
|
Running `wails3 doctor` will check if you have the correct dependencies
|
||||||
|
installed. If not, it will advise on what is missing and help on how to rectify
|
||||||
|
any problems.
|
||||||
|
|
||||||
|
## The `wails3` command appears to be missing?
|
||||||
|
|
||||||
|
If your system is reporting that the `wails3` command is missing, check the
|
||||||
|
following:
|
||||||
|
|
||||||
|
- Make sure you have followed the above `Go installation guide` correctly and
|
||||||
|
that the `go/bin` directory is in the `PATH` environment variable.
|
||||||
|
- Close/Reopen current terminals to pick up the new `PATH` variable.
|
27
docs/src/content/docs/getting-started/next-steps.md
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
---
|
||||||
|
title: Next Steps
|
||||||
|
sidebar:
|
||||||
|
order: 30
|
||||||
|
---
|
||||||
|
|
||||||
|
Now that you have created your first application, you can start exploring the
|
||||||
|
other features that v3 alpha provides.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
The best place to start is the `examples` directory in the Wails repository.
|
||||||
|
This contains a number of examples that you can run and play with.
|
||||||
|
|
||||||
|
To run an example, you can simply use:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
go run .
|
||||||
|
```
|
||||||
|
|
||||||
|
in the example directory.
|
||||||
|
|
||||||
|
:::note
|
||||||
|
|
||||||
|
Some examples may not work during alpha development.
|
||||||
|
|
||||||
|
:::
|
195
docs/src/content/docs/getting-started/your-first-app.mdx
Normal file
@ -0,0 +1,195 @@
|
|||||||
|
---
|
||||||
|
title: Your First Application
|
||||||
|
sidebar:
|
||||||
|
order: 20
|
||||||
|
---
|
||||||
|
|
||||||
|
import { Tabs, TabItem } from "@astrojs/starlight/components";
|
||||||
|
import { Steps } from "@astrojs/starlight/components";
|
||||||
|
|
||||||
|
Creating your first application with Wails v3 Alpha is an exciting journey into
|
||||||
|
the world of modern desktop app development. This guide will walk you through
|
||||||
|
the process of creating a basic application, showcasing the power and simplicity
|
||||||
|
of Wails.
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
Before you begin, ensure you have the following installed:
|
||||||
|
|
||||||
|
- Go (version 1.21 or later)
|
||||||
|
- Node.js (LTS version)
|
||||||
|
- Wails v3 Alpha (see the [installation guide](/getting-started/installation)
|
||||||
|
for instructions)
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
<Steps>
|
||||||
|
|
||||||
|
1. ## Creating a New Project
|
||||||
|
|
||||||
|
Open your terminal and run the following command to create a new Wails
|
||||||
|
project:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
wails3 init -n myfirstapp
|
||||||
|
```
|
||||||
|
|
||||||
|
This command creates a new directory called `myfirstapp` with all the
|
||||||
|
necessary files.
|
||||||
|
|
||||||
|
2. ## Exploring the Project Structure
|
||||||
|
|
||||||
|
Navigate to the `myfirstapp` directory. You'll find several files and
|
||||||
|
folders:
|
||||||
|
|
||||||
|
- `build`: Contains files used by the build process.
|
||||||
|
- `frontend`: Contains your web frontend code.
|
||||||
|
- `go.mod` & `go.sum`: Go module files.
|
||||||
|
- `main.go`: The entry point for your Wails application.
|
||||||
|
- `Taskfile.yml`: Defines all the tasks used by the build system. Learn more
|
||||||
|
at the [Task](https://taskfile.dev/) website.
|
||||||
|
|
||||||
|
Take a moment to explore these files and familiarize yourself with the
|
||||||
|
structure.
|
||||||
|
|
||||||
|
:::note [Although Wails v3 uses [Task](https://taskfile.dev/) as its
|
||||||
|
default]
|
||||||
|
|
||||||
|
build system, there is nothing stopping you from using `make` or any other
|
||||||
|
alternative build system.
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
3. ## Building Your Application
|
||||||
|
|
||||||
|
To build your application, execute:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
wails3 build
|
||||||
|
```
|
||||||
|
|
||||||
|
This command compiles a debug version of your application and saves it in a
|
||||||
|
new `bin` directory. You can run this like you would any normal application:
|
||||||
|
|
||||||
|
<Tabs syncKey="platform">
|
||||||
|
|
||||||
|
<TabItem label="Mac" icon="apple">
|
||||||
|
|
||||||
|
```sh
|
||||||
|
./bin/myfirstapp
|
||||||
|
```
|
||||||
|
|
||||||
|
</TabItem>
|
||||||
|
|
||||||
|
<TabItem label="Windows" icon="seti:windows">
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bin\myfirstapp.exe
|
||||||
|
```
|
||||||
|
|
||||||
|
</TabItem>
|
||||||
|
|
||||||
|
<TabItem label="Linux" icon="linux">
|
||||||
|
|
||||||
|
```sh
|
||||||
|
./bin/myfirstapp
|
||||||
|
```
|
||||||
|
|
||||||
|
</TabItem>
|
||||||
|
|
||||||
|
</Tabs>
|
||||||
|
|
||||||
|
You'll see a simple UI, the starting point for your application. As it is
|
||||||
|
the debug version, you'll also see logs in the console window. This is
|
||||||
|
useful for debugging purposes.
|
||||||
|
|
||||||
|
4. ## Dev Mode
|
||||||
|
|
||||||
|
We can also run the application in development mode. This mode allows you to
|
||||||
|
make changes to your frontend code and see the changes reflected in the
|
||||||
|
running application without having to rebuild the entire application.
|
||||||
|
|
||||||
|
1. Open a new terminal window.
|
||||||
|
2. Run `wails3 dev`.
|
||||||
|
3. Open `frontend/main.js`.
|
||||||
|
4. Change the line that has `<h1>Hello Wails!</h1>` to
|
||||||
|
`<h1>Hello World!</h1>`.
|
||||||
|
5. Save the file.
|
||||||
|
|
||||||
|
The application will update automatically, and you'll see the changes
|
||||||
|
reflected in the running application.
|
||||||
|
|
||||||
|
5. ## Building the Application Again
|
||||||
|
|
||||||
|
Once you're happy with your changes, build your application again:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
wails3 build
|
||||||
|
```
|
||||||
|
|
||||||
|
You'll notice that the build time was faster this time. That's because the
|
||||||
|
new build system only builds the parts of your application that have
|
||||||
|
changed.
|
||||||
|
|
||||||
|
You should see a new executable in the `build` directory.
|
||||||
|
|
||||||
|
6. ## Packaging Your Application
|
||||||
|
|
||||||
|
Once your application is ready for distribution, you can create
|
||||||
|
platform-specific packages:
|
||||||
|
|
||||||
|
<Tabs syncKey="platform">
|
||||||
|
|
||||||
|
<TabItem label="Mac" icon="apple">
|
||||||
|
|
||||||
|
To create a `.app` bundle:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
wails3 package
|
||||||
|
```
|
||||||
|
|
||||||
|
This will create a production build and package it into a `.app` bundle in the `bin` directory.
|
||||||
|
|
||||||
|
</TabItem>
|
||||||
|
<TabItem label="Windows" icon="seti:windows">
|
||||||
|
|
||||||
|
To create an NSIS installer:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
wails3 package
|
||||||
|
```
|
||||||
|
|
||||||
|
This will create a production build and package it into an NSIS installer in the `bin` directory.
|
||||||
|
|
||||||
|
</TabItem>
|
||||||
|
<TabItem label="Linux" icon="linux">
|
||||||
|
|
||||||
|
Wails supports multiple package formats for Linux distribution:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create all package types (AppImage, deb, rpm, and Arch Linux)
|
||||||
|
wails3 package
|
||||||
|
|
||||||
|
# Or create specific package types
|
||||||
|
wails3 task linux:create:appimage # AppImage format
|
||||||
|
wails3 task linux:create:deb # Debian package
|
||||||
|
wails3 task linux:create:rpm # Red Hat package
|
||||||
|
wails3 task linux:create:aur # Arch Linux package
|
||||||
|
```
|
||||||
|
|
||||||
|
</TabItem>
|
||||||
|
|
||||||
|
</Tabs>
|
||||||
|
|
||||||
|
For more detailed information about packaging options and configuration,
|
||||||
|
check out our [Packaging Guide](/guides/packaging).
|
||||||
|
|
||||||
|
</Steps>
|
||||||
|
|
||||||
|
## Conclusion
|
||||||
|
|
||||||
|
Congratulations! You've just created, developed and packaged your first Wails
|
||||||
|
application. This is just the beginning of what you can achieve with Wails v3.
|
||||||
|
Explore the documentation, experiment with different features, and start
|
||||||
|
building amazing applications!
|
124
docs/src/content/docs/guides/customizing-windows.md
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
---
|
||||||
|
title: Customizing Window Controls in Wails
|
||||||
|
sidebar:
|
||||||
|
order: 10
|
||||||
|
---
|
||||||
|
|
||||||
|
Wails provides an API to control the appearance and functionality of the
|
||||||
|
controls of a window. This functionality is available on Windows and macOS, but
|
||||||
|
not on Linux.
|
||||||
|
|
||||||
|
## Setting the Window Button States
|
||||||
|
|
||||||
|
The button states are defined by the `ButtonState` enum:
|
||||||
|
|
||||||
|
```go
|
||||||
|
type ButtonState int
|
||||||
|
|
||||||
|
const (
|
||||||
|
ButtonEnabled ButtonState = 0
|
||||||
|
ButtonDisabled ButtonState = 1
|
||||||
|
ButtonHidden ButtonState = 2
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
- `ButtonEnabled`: The button is enabled and visible.
|
||||||
|
- `ButtonDisabled`: The button is visible but disabled (grayed out).
|
||||||
|
- `ButtonHidden`: The button is hidden from the titlebar.
|
||||||
|
|
||||||
|
The button states can be set during window creation or at runtime.
|
||||||
|
|
||||||
|
### Setting Button States During Window Creation
|
||||||
|
|
||||||
|
When creating a new window, you can set the initial state of the buttons using
|
||||||
|
the `WebviewWindowOptions` struct:
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/wailsapp/wails/v3/pkg/application"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
app := application.New(application.Options{
|
||||||
|
Name: "My Application",
|
||||||
|
})
|
||||||
|
|
||||||
|
app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{
|
||||||
|
MinimiseButtonState: application.ButtonHidden,
|
||||||
|
MaximiseButtonState: application.ButtonDisabled,
|
||||||
|
CloseButtonState: application.ButtonEnabled,
|
||||||
|
})
|
||||||
|
|
||||||
|
app.Run()
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
In the example above, the minimise button is hidden, the maximise button is
|
||||||
|
inactive (grayed out), and the close button is active.
|
||||||
|
|
||||||
|
### Setting Button States at Runtime
|
||||||
|
|
||||||
|
You can also change the button states at runtime using the following methods on
|
||||||
|
the `Window` interface:
|
||||||
|
|
||||||
|
```go
|
||||||
|
window.SetMinimiseButtonState(wails.ButtonHidden)
|
||||||
|
window.SetMaximiseButtonState(wails.ButtonEnabled)
|
||||||
|
window.SetCloseButtonState(wails.ButtonDisabled)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Platform Differences
|
||||||
|
|
||||||
|
The button state functionality behaves slightly differently on Windows and
|
||||||
|
macOS:
|
||||||
|
|
||||||
|
| | Windows | Mac |
|
||||||
|
| --------------------- | ---------------------- | ---------------------- |
|
||||||
|
| Disable Min/Max/Close | Disables Min/Max/Close | Disables Min/Max/Close |
|
||||||
|
| Hide Min | Disables Min | Hides Min button |
|
||||||
|
| Hide Max | Disables Max | Hides Max button |
|
||||||
|
| Hide Close | Hides all controls | Hides Close |
|
||||||
|
|
||||||
|
Note: On Windows, it is not possible to hide the Min/Max buttons individually.
|
||||||
|
However, disabling both will hide both of the controls and only show the close
|
||||||
|
button.
|
||||||
|
|
||||||
|
### Controlling Window Style (Windows)
|
||||||
|
|
||||||
|
To control the style of the titlebar on Windows, you can use the `ExStyle` field
|
||||||
|
in the `WebviewWindowOptions` struct:
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/wailsapp/wails/v3/pkg/application"
|
||||||
|
"github.com/wailsapp/wails/v3/pkg/w32"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
app := application.New(application.Options{
|
||||||
|
Name: "My Application",
|
||||||
|
})
|
||||||
|
|
||||||
|
app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{
|
||||||
|
Windows: application.WindowsWindow{
|
||||||
|
ExStyle: w32.WS_EX_TOOLWINDOW | w32.WS_EX_NOREDIRECTIONBITMAP | w32.WS_EX_TOPMOST,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
app.Run()
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Other options that affect the Extended Style of a window will be overridden by
|
||||||
|
this setting:
|
||||||
|
|
||||||
|
- HiddenOnTaskbar
|
||||||
|
- AlwaysOnTop
|
||||||
|
- IgnoreMouseEvents
|
||||||
|
- BackgroundType
|
157
docs/src/content/docs/guides/file-associations.md
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
---
|
||||||
|
title: File Associations
|
||||||
|
sidebar:
|
||||||
|
order: 20
|
||||||
|
---
|
||||||
|
|
||||||
|
File associations allow your application to handle specific file types when
|
||||||
|
users open them. This is particularly useful for text editors, image viewers, or
|
||||||
|
any application that works with specific file formats. This guide explains how
|
||||||
|
to implement file associations in your Wails v3 application.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
File association support in Wails v3 is currently available for:
|
||||||
|
|
||||||
|
- Windows (NSIS installer packages)
|
||||||
|
- macOS (application bundles)
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
File associations are configured in the `config.yml` file located in your
|
||||||
|
project's `build` directory.
|
||||||
|
|
||||||
|
### Basic Configuration
|
||||||
|
|
||||||
|
To set up file associations:
|
||||||
|
|
||||||
|
1. Open `build/config.yml`
|
||||||
|
2. Add your file associations under the `fileAssociations` section
|
||||||
|
3. Run `wails3 update build-assets` to update the build assets
|
||||||
|
4. Set the `FileAssociations` field in the application options
|
||||||
|
5. Package your application using `wails3 package`
|
||||||
|
|
||||||
|
Here's an example configuration:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
fileAssociations:
|
||||||
|
- ext: myapp
|
||||||
|
name: MyApp Document
|
||||||
|
description: MyApp Document File
|
||||||
|
iconName: myappFileIcon
|
||||||
|
role: Editor
|
||||||
|
- ext: custom
|
||||||
|
name: Custom Format
|
||||||
|
description: Custom File Format
|
||||||
|
iconName: customFileIcon
|
||||||
|
role: Editor
|
||||||
|
```
|
||||||
|
|
||||||
|
### Configuration Properties
|
||||||
|
|
||||||
|
| Property | Description | Platform |
|
||||||
|
| ----------- | ---------------------------------------------------------------- | -------- |
|
||||||
|
| ext | File extension without the leading period (e.g., `txt`) | All |
|
||||||
|
| name | Display name for the file type | All |
|
||||||
|
| description | Description shown in file properties | Windows |
|
||||||
|
| iconName | Name of the icon file (without extension) in the build folder | All |
|
||||||
|
| role | Application's role for this file type (e.g., `Editor`, `Viewer`) | macOS |
|
||||||
|
|
||||||
|
## Listening for File Open Events
|
||||||
|
|
||||||
|
To handle file open events in your application, you can listen for the
|
||||||
|
`events.Common.ApplicationOpenedWithFile` event:
|
||||||
|
|
||||||
|
```go
|
||||||
|
func main() {
|
||||||
|
app := application.New(application.Options{
|
||||||
|
Name: "MyApp",
|
||||||
|
FileAssociations: []string{".txt", ".md"}, // Specify supported extensions
|
||||||
|
})
|
||||||
|
|
||||||
|
// Listen for files being used to open the application
|
||||||
|
app.OnApplicationEvent(events.Common.ApplicationOpenedWithFile, func(event *application.ApplicationEvent) {
|
||||||
|
associatedFile := event.Context().Filename()
|
||||||
|
application.InfoDialog().SetMessage("Application opened with file: " + associatedFile).Show()
|
||||||
|
})
|
||||||
|
|
||||||
|
// Create your window and run the app...
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step-by-Step Tutorial
|
||||||
|
|
||||||
|
Let's walk through setting up file associations for a simple text editor:
|
||||||
|
|
||||||
|
### 1. Create Icons
|
||||||
|
|
||||||
|
- Create icons for your file type (recommended sizes: 16x16, 32x32, 48x48,
|
||||||
|
256x256)
|
||||||
|
- Save the icons in your project's `build` folder
|
||||||
|
- Name them according to your `iconName` configuration (e.g.,
|
||||||
|
`textFileIcon.png`)
|
||||||
|
|
||||||
|
!!! tip You can use `wails3 generate icons` to generate the required icons for
|
||||||
|
you. Run `wails3 generate icons --help` for more information.
|
||||||
|
|
||||||
|
### 2. Configure File Associations
|
||||||
|
|
||||||
|
Edit the `build/config.yml` file to add your file associations:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# build/config.yml
|
||||||
|
fileAssociations:
|
||||||
|
- ext: txt
|
||||||
|
name: Text Document
|
||||||
|
description: Plain Text Document
|
||||||
|
iconName: textFileIcon
|
||||||
|
role: Editor
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Update Build Assets
|
||||||
|
|
||||||
|
Run the following command to update the build assets:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
wails3 update build-assets
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Set File Associations in the Application Options
|
||||||
|
|
||||||
|
In your `main.go` file, set the `FileAssociations` field in the application
|
||||||
|
options:
|
||||||
|
|
||||||
|
```go
|
||||||
|
app := application.New(application.Options{
|
||||||
|
Name: "MyApp",
|
||||||
|
FileAssociations: []string{".txt", ".md"}, // Specify supported extensions
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
:::tip[Why do the file extensions need to be set in the application config when
|
||||||
|
it's set in config.yml?]
|
||||||
|
|
||||||
|
On Windows, when a file is opened with a file association, the application is
|
||||||
|
launched with the filename as the first argument to the application. The
|
||||||
|
application has no way of knowing if the first argument is a file or a command
|
||||||
|
line argument, so it uses the `FileAssociations` field in the application
|
||||||
|
options to determine if the first argument is an associated file or not.
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
### 5. Package Your Application
|
||||||
|
|
||||||
|
Package your application using the following command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
wails3 package
|
||||||
|
```
|
||||||
|
|
||||||
|
The packaged application will be created in the `bin` directory. You can then
|
||||||
|
install and test the application.
|
||||||
|
|
||||||
|
## Additional Notes
|
||||||
|
|
||||||
|
- Icons should be provided in PNG format in the build folder
|
||||||
|
- Testing file associations requires installing the packaged application
|
89
docs/src/content/docs/guides/packaging.md
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
---
|
||||||
|
title: Packaging Your Application
|
||||||
|
sidebar:
|
||||||
|
order: 30
|
||||||
|
---
|
||||||
|
|
||||||
|
This guide explains how to package your Wails application for different
|
||||||
|
platforms.
|
||||||
|
|
||||||
|
## Windows
|
||||||
|
|
||||||
|
Windows applications are packaged as `.exe` files. Wails automatically handles
|
||||||
|
this during the build process, creating a standalone executable that includes
|
||||||
|
all necessary resources.
|
||||||
|
|
||||||
|
## macOS
|
||||||
|
|
||||||
|
macOS applications are packaged as `.app` bundles. Wails creates these bundles
|
||||||
|
automatically during the build process, including proper code signing and
|
||||||
|
notarization if configured.
|
||||||
|
|
||||||
|
## Linux
|
||||||
|
|
||||||
|
Linux applications can be packaged in various formats. Wails v3 uses
|
||||||
|
[nfpm](https://github.com/goreleaser/nfpm), an excellent packaging tool that
|
||||||
|
makes it easy to create `.deb`, `.rpm`, and Arch Linux packages. nfpm is a
|
||||||
|
powerful tool that handles the complexities of Linux packaging, making it easy
|
||||||
|
to create professional-grade packages.
|
||||||
|
|
||||||
|
### Package Types
|
||||||
|
|
||||||
|
Wails supports creating the following types of Linux packages:
|
||||||
|
|
||||||
|
- Debian packages (`.deb`) - for Debian, Ubuntu, and related distributions
|
||||||
|
- Red Hat packages (`.rpm`) - for Red Hat, Fedora, CentOS, and related
|
||||||
|
distributions
|
||||||
|
- Arch Linux packages - for Arch Linux and related distributions
|
||||||
|
- AppImage - a distribution-independent package format
|
||||||
|
|
||||||
|
### Building Packages
|
||||||
|
|
||||||
|
Wails provides several task commands for building Linux packages. These are
|
||||||
|
defined in `Taskfile.linux.yml` and can be invoked using the `wails3 task`
|
||||||
|
command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Build all package types (AppImage, deb, rpm, and Arch Linux)
|
||||||
|
wails3 task linux:package
|
||||||
|
|
||||||
|
# Build specific package types
|
||||||
|
wails3 task linux:create:appimage # Create an AppImage
|
||||||
|
wails3 task linux:create:deb # Create a Debian package
|
||||||
|
wails3 task linux:create:rpm # Create a Red Hat package
|
||||||
|
wails3 task linux:create:aur # Create an Arch Linux package
|
||||||
|
```
|
||||||
|
|
||||||
|
Each of these tasks will:
|
||||||
|
|
||||||
|
1. Build your application in production mode
|
||||||
|
2. Generate necessary desktop integration files
|
||||||
|
3. Create the appropriate package using nfpm
|
||||||
|
|
||||||
|
### Configuration
|
||||||
|
|
||||||
|
The package configuration file should follow the nfpm configuration format and
|
||||||
|
is typically located at `build/nfpm/nfpm.yaml`. Here's an example:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
name: "myapp"
|
||||||
|
arch: "amd64"
|
||||||
|
version: "v1.0.0"
|
||||||
|
maintainer: "Your Name <your.email@example.com>"
|
||||||
|
description: |
|
||||||
|
A short description of your application
|
||||||
|
vendor: "Your Company"
|
||||||
|
homepage: "https://yourcompany.com"
|
||||||
|
license: "MIT"
|
||||||
|
contents:
|
||||||
|
- src: ./build/bin/myapp
|
||||||
|
dst: /usr/bin/myapp
|
||||||
|
- src: ./assets/icon.png
|
||||||
|
dst: /usr/share/icons/myapp.png
|
||||||
|
- src: ./assets/myapp.desktop
|
||||||
|
dst: /usr/share/applications/myapp.desktop
|
||||||
|
```
|
||||||
|
|
||||||
|
For detailed information about all available configuration options, please refer
|
||||||
|
to the
|
||||||
|
[nfpm configuration documentation](https://nfpm.goreleaser.com/configuration/).
|
90
docs/src/content/docs/index.mdx
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
---
|
||||||
|
title: Welcome to Wails
|
||||||
|
description: "Create beautiful applications using Go"
|
||||||
|
template: splash
|
||||||
|
hero:
|
||||||
|
tagline:
|
||||||
|
This is your starting point for exploring the latest version of Wails, a
|
||||||
|
powerful framework for building desktop applications using Go and modern web
|
||||||
|
technologies.
|
||||||
|
image:
|
||||||
|
dark: ../../assets/wails-logo-dark.svg
|
||||||
|
light: ../../assets/wails-logo-light.svg
|
||||||
|
alt: Wails Logo
|
||||||
|
|
||||||
|
actions:
|
||||||
|
- text: Getting Started
|
||||||
|
link: /getting-started/installation
|
||||||
|
icon: right-arrow
|
||||||
|
- text: Learn More
|
||||||
|
link: /learn/services
|
||||||
|
icon: right-arrow
|
||||||
|
- text: Sponsor
|
||||||
|
link: https://github.com/sponsors/leaanthony
|
||||||
|
icon: heart
|
||||||
|
class:
|
||||||
|
- is-sponsor
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
import { Card, CardGrid } from "@astrojs/starlight/components";
|
||||||
|
|
||||||
|
<CardGrid stagger>
|
||||||
|
<Card title="Introduction" icon="pencil">
|
||||||
|
|
||||||
|
Wails v3 Alpha is the latest iteration of the Wails project, bringing new
|
||||||
|
features and improvements to make desktop application development more efficient
|
||||||
|
and enjoyable. This version is still in alpha, so some features might change
|
||||||
|
before the final release.
|
||||||
|
|
||||||
|
</Card>
|
||||||
|
<Card title="Status" icon="add-document">
|
||||||
|
|
||||||
|
Please consult our [Status Page](/status) for up-to-date status.
|
||||||
|
|
||||||
|
</Card>
|
||||||
|
<Card title="What's New" icon="add-document">
|
||||||
|
|
||||||
|
Here are some of the exciting new features and improvements in Wails v3 Alpha:
|
||||||
|
|
||||||
|
- Multiple Windows
|
||||||
|
- System Trays
|
||||||
|
- Improved bindings generation
|
||||||
|
- Improved build system
|
||||||
|
- Improved events system
|
||||||
|
|
||||||
|
More information about these features and other changes can be found in the
|
||||||
|
[What's new](/whats-new) section.
|
||||||
|
|
||||||
|
</Card>
|
||||||
|
<Card title="Getting Started" icon="open-book">
|
||||||
|
|
||||||
|
To get started with Wails v3 Alpha:
|
||||||
|
|
||||||
|
1. [Installation](/getting-started/installation): Follow our simple guide to
|
||||||
|
install Wails on your system.
|
||||||
|
2. [Create Your First Application](/getting-started/your-first-app): Learn how
|
||||||
|
to create your first Wails application with our step-by-step tutorial.
|
||||||
|
3. [Explore the API Reference](/api/application): Dive deeper into the API
|
||||||
|
documentation.
|
||||||
|
|
||||||
|
</Card>
|
||||||
|
|
||||||
|
<Card title="Feedback and Contributions" icon="open-book">
|
||||||
|
|
||||||
|
Your feedback is vital to making Wails better. If you encounter any issues or
|
||||||
|
have suggestions, please use our [Feedback process](/getting-started/feedback).
|
||||||
|
Contributions to the project are also welcome!
|
||||||
|
|
||||||
|
Thank you for trying out Wails v3 Alpha!
|
||||||
|
|
||||||
|
</Card>
|
||||||
|
<Card title="Alpha Version Notice" icon="add-document">
|
||||||
|
|
||||||
|
Please note that this is an alpha version of Wails v3. Features may be added,
|
||||||
|
removed, or changed in future updates. This version is intended for early
|
||||||
|
adopters and those who wish to contribute to the development of Wails.
|
||||||
|
|
||||||
|
</Card>
|
||||||
|
|
||||||
|
</CardGrid>
|
423
docs/src/content/docs/learn/bindings.mdx
Normal file
@ -0,0 +1,423 @@
|
|||||||
|
---
|
||||||
|
title: Bindings Generator Guide
|
||||||
|
sidebar:
|
||||||
|
order: 20
|
||||||
|
---
|
||||||
|
|
||||||
|
import { FileTree } from "@astrojs/starlight/components";
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
One of the key features of Wails is the ability to seamlessly integrate backend
|
||||||
|
Go code with the frontend, enabling efficient communication between the two.
|
||||||
|
This can be done manually by sending messages between the frontend and backend,
|
||||||
|
but this can be cumbersome and error-prone, especially when dealing with complex
|
||||||
|
data types.
|
||||||
|
|
||||||
|
The bindings generator in Wails v3 simplifies this process by automatically
|
||||||
|
generating JavaScript or TypeScript functions and models that reflect the
|
||||||
|
methods and data structures defined in your Go code. This means you can write
|
||||||
|
your backend logic in Go and easily expose it to the frontend without the need
|
||||||
|
for manual binding or complex integration.
|
||||||
|
|
||||||
|
This guide is designed to help you understand and utilize this powerful binding
|
||||||
|
tool.
|
||||||
|
|
||||||
|
## Core Concepts
|
||||||
|
|
||||||
|
In Wails v3, services can be added to your application. These services act as a
|
||||||
|
bridge between the backend and frontend, allowing you to define methods and
|
||||||
|
state that can be accessed and manipulated from the frontend.
|
||||||
|
|
||||||
|
### Services
|
||||||
|
|
||||||
|
1. Services can hold state and expose methods that operate on that state.
|
||||||
|
2. Services can be used similar to controllers in HTTP web applications or as
|
||||||
|
services.
|
||||||
|
3. Only public methods on the service are bound, following Go's convention.
|
||||||
|
|
||||||
|
Here's a simple example of how you can define a service and add it to your Wails
|
||||||
|
application:
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"github.com/wailsapp/wails/v3/pkg/application"
|
||||||
|
)
|
||||||
|
|
||||||
|
type GreetService struct {}
|
||||||
|
|
||||||
|
func (g *GreetService) Greet(name string) string {
|
||||||
|
return "Hello " + name
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
app := application.New(application.Options{
|
||||||
|
Services: []application.Service{
|
||||||
|
application.NewService(&GreetService{}),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
// ....
|
||||||
|
err := app.Run()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
In this example, we define a `GreetService` services with a public `Greet`
|
||||||
|
method. The `Greet` method takes a `name` parameter and returns a greeting
|
||||||
|
string.
|
||||||
|
|
||||||
|
We then create a new Wails application using `application.New` and add the
|
||||||
|
`GreetService` service to the application using the `Services` option in the
|
||||||
|
`application.Options`. The `application.NewService` method must always be given
|
||||||
|
an _instance_ of the service struct, not the service struct type itself.
|
||||||
|
|
||||||
|
### Generating the Bindings
|
||||||
|
|
||||||
|
By binding the struct, Wails is able to generate the necessary JavaScript or
|
||||||
|
TypeScript code by running the following command in the project directory:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
wails3 generate bindings
|
||||||
|
```
|
||||||
|
|
||||||
|
The bindings generator will scan the project and dependencies for anything that
|
||||||
|
needs generating. Note: It will take longer the very first time you run the
|
||||||
|
bindings generator, as it will be building up a cache of packages to scan. You
|
||||||
|
should see output similar to the following:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
% wails3 generate bindings
|
||||||
|
INFO 347 Packages, 1 Service, 1 Method, 0 Enums, 0 Models in 1.981036s.
|
||||||
|
INFO Output directory: /Users/me/myproject/frontend/bindings
|
||||||
|
```
|
||||||
|
|
||||||
|
If we look in the `frontend/bindings` directory, we should see the following
|
||||||
|
files:
|
||||||
|
|
||||||
|
<FileTree>
|
||||||
|
|
||||||
|
- frontend/bindings
|
||||||
|
- changeme
|
||||||
|
- greetservice.js
|
||||||
|
- index.js
|
||||||
|
|
||||||
|
</FileTree>
|
||||||
|
|
||||||
|
NOTE: The `changeme` directory is the name of the module defined in `go.mod` and
|
||||||
|
is used to namespace the generated files.
|
||||||
|
|
||||||
|
The generated `greetservice.js` file contains the JavaScript code that mirrors
|
||||||
|
the Go struct and its methods:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// @ts-check
|
||||||
|
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
|
||||||
|
// This file is automatically generated. DO NOT EDIT
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||||
|
// @ts-ignore: Unused imports
|
||||||
|
import { Call as $Call, Create as $Create } from "@wailsio/runtime";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} name
|
||||||
|
* @returns {Promise<string> & { cancel(): void }}
|
||||||
|
*/
|
||||||
|
export function Greet(name) {
|
||||||
|
let $resultPromise = /** @type {any} */ ($Call.ByID(1411160069, name));
|
||||||
|
return $resultPromise;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
As you can see, it also generates all the necessary JSDoc type information to
|
||||||
|
ensure type safety in your frontend code.
|
||||||
|
|
||||||
|
### Using the Bindings
|
||||||
|
|
||||||
|
You can import and use this file in your frontend code to interact with the
|
||||||
|
backend.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
import { Greet } from "./bindings/changeme/greetservice.js";
|
||||||
|
|
||||||
|
console.log(Greet("Alice")); // Output: Hello Alice
|
||||||
|
```
|
||||||
|
|
||||||
|
### Binding Models
|
||||||
|
|
||||||
|
In addition to binding methods, you can also use structs as input or output
|
||||||
|
parameters in your bound methods. When structs are used as parameters, Wails
|
||||||
|
generates corresponding JavaScript versions of those types.
|
||||||
|
|
||||||
|
Let's extend the previous example to use a `Person` type that has a `Name`
|
||||||
|
field:
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/wailsapp/wails/v3/pkg/application"
|
||||||
|
"log"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Person defines a person
|
||||||
|
type Person struct {
|
||||||
|
// Name of the person
|
||||||
|
Name string
|
||||||
|
}
|
||||||
|
|
||||||
|
type GreetService struct{}
|
||||||
|
|
||||||
|
func (g *GreetService) Greet(person Person) string {
|
||||||
|
return "Hello " + person.Name
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
app := application.New(application.Options{
|
||||||
|
Services: []application.Service{
|
||||||
|
application.NewService(&GreetService{}),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
// ....
|
||||||
|
app.NewWebviewWindow()
|
||||||
|
err := app.Run()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
In this updated example, we define a `Person` struct with a `Name` field. The
|
||||||
|
`Greet` method in the `GreetService` service now takes a `Person` as an input
|
||||||
|
parameter.
|
||||||
|
|
||||||
|
When you run the bindings generator, Wails will generate a corresponding
|
||||||
|
JavaScript `Person` type that mirrors the Go struct. This allows you to create
|
||||||
|
instances of the `Person` type in your frontend code and pass them to the bound
|
||||||
|
`Greet` method.
|
||||||
|
|
||||||
|
If we run the bindings generator again, we should see the following output:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
% wails3 generate bindings
|
||||||
|
INFO Processed: 347 Packages, 1 Service, 1 Method, 0 Enums, 1 Model in 1.9943997s.
|
||||||
|
INFO Output directory: /Users/me/myproject/frontend/bindings
|
||||||
|
```
|
||||||
|
|
||||||
|
In the `frontend/bindings/changeme` directory, you should see a new `models.js`
|
||||||
|
file containing the following code:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// @ts-check
|
||||||
|
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
|
||||||
|
// This file is automatically generated. DO NOT EDIT
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||||
|
// @ts-ignore: Unused imports
|
||||||
|
import { Create as $Create } from "@wailsio/runtime";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Person defines a person
|
||||||
|
*/
|
||||||
|
export class Person {
|
||||||
|
/**
|
||||||
|
* Creates a new Person instance.
|
||||||
|
* @param {Partial<Person>} [$$source = {}] - The source object to create the Person.
|
||||||
|
*/
|
||||||
|
constructor($$source = {}) {
|
||||||
|
if (!("Name" in $$source)) {
|
||||||
|
/**
|
||||||
|
* Name of the person
|
||||||
|
* @member
|
||||||
|
* @type {string}
|
||||||
|
*/
|
||||||
|
this["Name"] = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
Object.assign(this, $$source);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new Person instance from a string or object.
|
||||||
|
* @param {any} [$$source = {}]
|
||||||
|
* @returns {Person}
|
||||||
|
*/
|
||||||
|
static createFrom($$source = {}) {
|
||||||
|
let $$parsedSource =
|
||||||
|
typeof $$source === "string" ? JSON.parse($$source) : $$source;
|
||||||
|
return new Person(/** @type {Partial<Person>} */ ($$parsedSource));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The `Person` class is generated with a constructor that takes an optional
|
||||||
|
`source` parameter, which allows you to create a new `Person` instance from an
|
||||||
|
object. It also has a static `createFrom` method that can create a `Person`
|
||||||
|
instance from a string or object.
|
||||||
|
|
||||||
|
You may also notice that comments in the Go struct are kept in the generated
|
||||||
|
JavaScript code! This can be helpful for understanding the purpose of the fields
|
||||||
|
and methods in the generated models and should be picked up by your IDE.
|
||||||
|
|
||||||
|
### Using Bound Models
|
||||||
|
|
||||||
|
Here's an example of how you can use the generated JavaScript `Person` type in
|
||||||
|
your frontend code:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
import { Greet } from "./bindings/changeme/GreetService.js";
|
||||||
|
import { Person } from "./bindings/changeme/models.js";
|
||||||
|
|
||||||
|
const resultElement = document.getElementById("result");
|
||||||
|
|
||||||
|
async function doGreet() {
|
||||||
|
let person = new Person({ Name: document.getElementById("name").value });
|
||||||
|
if (!person.Name) {
|
||||||
|
person.Name = "anonymous";
|
||||||
|
}
|
||||||
|
resultElement.innerText = await Greet(person);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
In this example, we import the generated `Person` type from the `models` module.
|
||||||
|
We create a new instance of `Person`, set its `Name` property, and pass it to
|
||||||
|
the `Greet` method.
|
||||||
|
|
||||||
|
Using bound models allows you to work with complex data structures and
|
||||||
|
seamlessly pass them between the frontend and backend of your Wails application.
|
||||||
|
|
||||||
|
### Using Typescript
|
||||||
|
|
||||||
|
To generate TypeScript bindings instead of JavaScript, you can use the `-ts`
|
||||||
|
flag:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
% wails3 generate bindings -ts
|
||||||
|
```
|
||||||
|
|
||||||
|
This will generate TypeScript files in the `frontend/bindings` directory:
|
||||||
|
|
||||||
|
<FileTree>
|
||||||
|
|
||||||
|
- frontend/bindings
|
||||||
|
- main
|
||||||
|
- greetservice.ts
|
||||||
|
- index.ts
|
||||||
|
- models.ts
|
||||||
|
|
||||||
|
</FileTree>
|
||||||
|
|
||||||
|
The generated files include `greetservice.ts`, which contains the TypeScript
|
||||||
|
code for the bound struct and its methods, and `models.ts`, which contains the
|
||||||
|
TypeScript types for the bound models:
|
||||||
|
|
||||||
|
```typescript title="GreetService.ts"
|
||||||
|
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
|
||||||
|
// This file is automatically generated. DO NOT EDIT
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||||
|
// @ts-ignore: Unused imports
|
||||||
|
import { Call as $Call, Create as $Create } from "@wailsio/runtime";
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||||
|
// @ts-ignore: Unused imports
|
||||||
|
import * as $models from "./models.js";
|
||||||
|
|
||||||
|
export function Greet(
|
||||||
|
person: $models.Person,
|
||||||
|
): Promise<string> & { cancel(): void } {
|
||||||
|
let $resultPromise = $Call.ByID(1411160069, person) as any;
|
||||||
|
return $resultPromise;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```typescript title="models.ts"
|
||||||
|
// @ts-check
|
||||||
|
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
|
||||||
|
// This file is automatically generated. DO NOT EDIT
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Person defines a person
|
||||||
|
*/
|
||||||
|
export class Person {
|
||||||
|
/**
|
||||||
|
* Name of the person
|
||||||
|
*/
|
||||||
|
"Name": string;
|
||||||
|
|
||||||
|
/** Creates a new Person instance. */
|
||||||
|
constructor(source: Partial<Person> = {}) {
|
||||||
|
if (!("Name" in source)) {
|
||||||
|
this["Name"] = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
Object.assign(this, source);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Creates a new Person instance from a string or object. */
|
||||||
|
static createFrom(source: string | object = {}): Person {
|
||||||
|
let parsedSource = typeof source === "string" ? JSON.parse(source) : source;
|
||||||
|
return new Person(parsedSource as Partial<Person>);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Using TypeScript bindings provides type safety and improved IDE support when
|
||||||
|
working with the generated code in your frontend.
|
||||||
|
|
||||||
|
### Using `context.Context`
|
||||||
|
|
||||||
|
When defining service methods in Go, you can include `context.Context` as the
|
||||||
|
first parameter. The runtime will automatically provide a context when the
|
||||||
|
method is called from the frontend.
|
||||||
|
|
||||||
|
The context provides several powerful features:
|
||||||
|
|
||||||
|
1. **Cancellation Support**: Long-running operations can be cancelled from the
|
||||||
|
frontend, which will raise an error through the Promise chain.
|
||||||
|
|
||||||
|
2. **Window Information**: You can determine which window made the call using
|
||||||
|
these context keys:
|
||||||
|
- `application.WindowNameKey` - Returns the name of the calling window
|
||||||
|
- `application.WindowIDKey` - Returns the ID of the calling window
|
||||||
|
|
||||||
|
Here are some examples:
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Basic context usage with cancellation
|
||||||
|
func (s *MyService) LongRunningTask(ctx context.Context, input string) (string, error) {
|
||||||
|
select {
|
||||||
|
// Check if the context has been cancelled from the frontend
|
||||||
|
case <-ctx.Done():
|
||||||
|
return "", ctx.Err()
|
||||||
|
default:
|
||||||
|
// Process task
|
||||||
|
return "completed", nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Getting caller window information
|
||||||
|
func (s *MyService) WindowAwareMethod(ctx context.Context) (string, error) {
|
||||||
|
windowName := ctx.Value(application.WindowNameKey).(string)
|
||||||
|
windowID := ctx.Value(application.WindowIDKey).(string)
|
||||||
|
return fmt.Sprintf("Called from window: %s (ID: %s)", windowName, windowID), nil
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
From the frontend, these methods can be called normally. If you need to cancel a
|
||||||
|
long-running operation, the Promise will be rejected with the cancellation
|
||||||
|
error:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// Call the method
|
||||||
|
const promise = MyService.LongRunningTask("input");
|
||||||
|
|
||||||
|
// Cancel it later if needed
|
||||||
|
// This will cause the context to be cancelled in the Go method
|
||||||
|
promise.cancel();
|
||||||
|
```
|
262
docs/src/content/docs/learn/build.mdx
Normal file
@ -0,0 +1,262 @@
|
|||||||
|
---
|
||||||
|
title: Wails v3 Build System
|
||||||
|
sidebar:
|
||||||
|
order: 40
|
||||||
|
---
|
||||||
|
|
||||||
|
import { FileTree } from "@astrojs/starlight/components";
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
The Wails v3 build system is a flexible and powerful tool designed to streamline
|
||||||
|
the build process for your Wails applications. It leverages
|
||||||
|
[Task](https://taskfile.dev), a task runner that allows you to define and run
|
||||||
|
tasks easily. While the v3 build system is the default, Wails encourages a
|
||||||
|
"bring your own tooling" approach, allowing developers to customize their build
|
||||||
|
process as needed.
|
||||||
|
|
||||||
|
Learn more about how to use Task in the
|
||||||
|
[official documentation](https://taskfile.dev/usage/).
|
||||||
|
|
||||||
|
## Task: The Heart of the Build System
|
||||||
|
|
||||||
|
[Task](https://taskfile.dev) is a modern alternative to Make, written in Go. It
|
||||||
|
uses a YAML file to define tasks and their dependencies. In the Wails v3 build
|
||||||
|
system, [Task](https://taskfile.dev) plays a central role in orchestrating the
|
||||||
|
build process.
|
||||||
|
|
||||||
|
The main `Taskfile.yml` is located in the project root, while platform-specific
|
||||||
|
tasks are defined in `build/Taskfile.<platform>.yml` files.
|
||||||
|
|
||||||
|
<FileTree>
|
||||||
|
|
||||||
|
- Project Root
|
||||||
|
- Taskfile.yml
|
||||||
|
- build
|
||||||
|
- Taskfile.windows.yml
|
||||||
|
- Taskfile.darwin.yml
|
||||||
|
- Taskfile.linux.yml
|
||||||
|
- Taskfile.common.yml
|
||||||
|
|
||||||
|
</FileTree>
|
||||||
|
|
||||||
|
The `Taskfile.common.yml` file contains common tasks that are shared across
|
||||||
|
platforms.
|
||||||
|
|
||||||
|
## Taskfile.yml
|
||||||
|
|
||||||
|
The `Taskfile.yml` file is the main entry point for the build system. It defines
|
||||||
|
the tasks and their dependencies. Here's the default `Taskfile.yml` file:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
version: "3"
|
||||||
|
|
||||||
|
includes:
|
||||||
|
common: ./build/Taskfile.common.yml
|
||||||
|
windows: ./build/Taskfile.windows.yml
|
||||||
|
darwin: ./build/Taskfile.darwin.yml
|
||||||
|
linux: ./build/Taskfile.linux.yml
|
||||||
|
|
||||||
|
vars:
|
||||||
|
APP_NAME: "{{.ProjectName}}"
|
||||||
|
BIN_DIR: "bin"
|
||||||
|
VITE_PORT: "{{.WAILS_VITE_PORT | default 9245}}"
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
build:
|
||||||
|
summary: Builds the application
|
||||||
|
cmds:
|
||||||
|
- task: "{{OS}}:build"
|
||||||
|
|
||||||
|
package:
|
||||||
|
summary: Packages a production build of the application
|
||||||
|
cmds:
|
||||||
|
- task: "{{OS}}:package"
|
||||||
|
|
||||||
|
run:
|
||||||
|
summary: Runs the application
|
||||||
|
cmds:
|
||||||
|
- task: "{{OS}}:run"
|
||||||
|
|
||||||
|
dev:
|
||||||
|
summary: Runs the application in development mode
|
||||||
|
cmds:
|
||||||
|
- wails3 dev -config ./build/devmode.config.yaml -port {{.VITE_PORT}}
|
||||||
|
|
||||||
|
dev:reload:
|
||||||
|
summary: Reloads the application
|
||||||
|
cmds:
|
||||||
|
- task: run
|
||||||
|
```
|
||||||
|
|
||||||
|
## Platform-Specific Taskfiles
|
||||||
|
|
||||||
|
Each platform has its own Taskfile, located in the `build` directory. These
|
||||||
|
files define the core tasks for that platform. Each taskfile includes common
|
||||||
|
tasks from the `Taskfile.common.yml` file.
|
||||||
|
|
||||||
|
### Windows
|
||||||
|
|
||||||
|
Location: `build/Taskfile.windows.yml`
|
||||||
|
|
||||||
|
The Windows-specific Taskfile includes tasks for building, packaging, and
|
||||||
|
running the application on Windows. Key features include:
|
||||||
|
|
||||||
|
- Building with optional production flags
|
||||||
|
- Generating Windows `.syso` file
|
||||||
|
- Creating an NSIS installer for packaging
|
||||||
|
|
||||||
|
### Linux
|
||||||
|
|
||||||
|
Location: `build/Taskfile.linux.yml`
|
||||||
|
|
||||||
|
The Linux-specific Taskfile includes tasks for building, packaging, and running
|
||||||
|
the application on Linux. Key features include:
|
||||||
|
|
||||||
|
- Building with optional production flags
|
||||||
|
- Creating an AppImage for packaging
|
||||||
|
- Generating `.desktop` file for Linux applications
|
||||||
|
|
||||||
|
### macOS
|
||||||
|
|
||||||
|
Location: `build/Taskfile.darwin.yml`
|
||||||
|
|
||||||
|
The macOS-specific Taskfile includes tasks for building, packaging, and running
|
||||||
|
the application on macOS. Key features include:
|
||||||
|
|
||||||
|
- Building with optional production flags
|
||||||
|
- Creating an `.app` bundle for packaging
|
||||||
|
- Setting macOS-specific build flags and environment variables
|
||||||
|
|
||||||
|
## Wails3 Commands and Task Execution
|
||||||
|
|
||||||
|
The `wails3 task` command is an embedded version of taskfile.dev, which executes
|
||||||
|
the tasks defined in your Taskfile.yml.
|
||||||
|
|
||||||
|
The `wails3 build` and `wails3 package` commands are aliases for
|
||||||
|
`wails3 task build` and `wails3 task package` respectively. When you run these
|
||||||
|
commands, Wails internally translates them to the appropriate task execution:
|
||||||
|
|
||||||
|
- `wails3 build` → `wails3 task build`
|
||||||
|
- `wails3 package` → `wails3 task package`
|
||||||
|
|
||||||
|
## Common Build Process
|
||||||
|
|
||||||
|
Across all platforms, the build process typically includes the following steps:
|
||||||
|
|
||||||
|
1. Tidying Go modules
|
||||||
|
2. Building the frontend
|
||||||
|
3. Generating icons
|
||||||
|
4. Compiling the Go code with platform-specific flags
|
||||||
|
5. Packaging the application (platform-specific)
|
||||||
|
|
||||||
|
## Customising the Build Process
|
||||||
|
|
||||||
|
While the v3 build system provides a solid default configuration, you can easily
|
||||||
|
customise it to fit your project's needs. By modifying the `Taskfile.yml` and
|
||||||
|
platform-specific Taskfiles, you can:
|
||||||
|
|
||||||
|
- Add new tasks
|
||||||
|
- Modify existing tasks
|
||||||
|
- Change the order of task execution
|
||||||
|
- Integrate with other tools and scripts
|
||||||
|
|
||||||
|
This flexibility allows you to tailor the build process to your specific
|
||||||
|
requirements while still benefiting from the structure provided by the Wails v3
|
||||||
|
build system.
|
||||||
|
|
||||||
|
## Development Mode
|
||||||
|
|
||||||
|
The Wails v3 build system includes a powerful development mode that enhances the
|
||||||
|
developer experience by providing live reloading and hot module replacement.
|
||||||
|
This mode is activated using the `wails3 dev` command.
|
||||||
|
|
||||||
|
### How It Works
|
||||||
|
|
||||||
|
When you run `wails3 dev`, the following process occurs:
|
||||||
|
|
||||||
|
1. The command checks for an available port, defaulting to 9245 if not
|
||||||
|
specified.
|
||||||
|
2. It sets up the environment variables for the frontend dev server (Vite).
|
||||||
|
3. It starts the file watcher using the `refresh` library.
|
||||||
|
|
||||||
|
The [refresh](https://github.com/atterpac/refresh) library is responsible for
|
||||||
|
monitoring file changes and triggering rebuilds. It uses a configuration file,
|
||||||
|
typically located at `./build/devmode.config.yaml`, to determine which files to
|
||||||
|
watch and what actions to take when changes are detected.
|
||||||
|
|
||||||
|
### Configuration
|
||||||
|
|
||||||
|
The development mode can be configured using the `devmode.config.yaml` file.
|
||||||
|
Here's an example of its structure:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
config:
|
||||||
|
root_path: .
|
||||||
|
log_level: warn
|
||||||
|
debounce: 1000
|
||||||
|
ignore:
|
||||||
|
dir:
|
||||||
|
- .git
|
||||||
|
- node_modules
|
||||||
|
- frontend
|
||||||
|
- bin
|
||||||
|
file:
|
||||||
|
- .DS_Store
|
||||||
|
- .gitignore
|
||||||
|
- .gitkeep
|
||||||
|
watched_extension:
|
||||||
|
- "*.go"
|
||||||
|
git_ignore: true
|
||||||
|
executes:
|
||||||
|
- cmd: wails3 task common:install:frontend:deps
|
||||||
|
type: once
|
||||||
|
- cmd: wails3 task common:dev:frontend
|
||||||
|
type: background
|
||||||
|
- cmd: go mod tidy
|
||||||
|
type: blocking
|
||||||
|
- cmd: wails3 task build
|
||||||
|
type: blocking
|
||||||
|
- cmd: wails3 task run
|
||||||
|
type: primary
|
||||||
|
```
|
||||||
|
|
||||||
|
This configuration file allows you to:
|
||||||
|
|
||||||
|
- Set the root path for file watching
|
||||||
|
- Configure logging level
|
||||||
|
- Set a debounce time for file change events
|
||||||
|
- Ignore specific directories, files, or file extensions
|
||||||
|
- Define commands to execute on file changes
|
||||||
|
|
||||||
|
### Customising Development Mode
|
||||||
|
|
||||||
|
You can customise the development mode experience by modifying the
|
||||||
|
`devmode.config.yaml` file.
|
||||||
|
|
||||||
|
Some ways to customise include:
|
||||||
|
|
||||||
|
1. Changing the watched directories or files
|
||||||
|
2. Adjusting the debounce time to control how quickly the system responds to
|
||||||
|
changes
|
||||||
|
3. Adding or modifying the execute commands to fit your project's needs
|
||||||
|
|
||||||
|
You can also specify a custom configuration file and port:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
wails3 dev -config ./path/to/custom/config.yaml -port 8080
|
||||||
|
```
|
||||||
|
|
||||||
|
### Using a browser for development
|
||||||
|
|
||||||
|
Whilst v2 fully supported the use of a browser for development, it caused a lot
|
||||||
|
of confusion. Applications that would work in the browser would not necessarily
|
||||||
|
work in the desktop application, as not all browser APIs are available in
|
||||||
|
webviews.
|
||||||
|
|
||||||
|
For UI-focused development work, you still have the flexibility to use a browser
|
||||||
|
in v3, by accessing the Vite URL at `http://localhost:9245` in dev mode. This
|
||||||
|
gives you access to powerful browser dev tools while working on styling and
|
||||||
|
layout. When you're ready to test functionality like bindings and events, simply
|
||||||
|
switch to the desktop view to ensure everything works perfectly in the
|
||||||
|
production environment.
|
65
docs/src/content/docs/learn/runtime.md
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
---
|
||||||
|
title: Runtime
|
||||||
|
sidebar:
|
||||||
|
order: 30
|
||||||
|
---
|
||||||
|
|
||||||
|
The Wails runtime is the standard library for Wails applications. It provides a
|
||||||
|
number of features that may be used in your applications, including:
|
||||||
|
|
||||||
|
- Window management
|
||||||
|
- Dialogs
|
||||||
|
- Browser integration
|
||||||
|
- Clipboard
|
||||||
|
- Frameless dragging
|
||||||
|
- Tray icons
|
||||||
|
- Menu management
|
||||||
|
- System information
|
||||||
|
- Events
|
||||||
|
- Calling Go code
|
||||||
|
- Context Menus
|
||||||
|
- Screens
|
||||||
|
- WML (Wails Markup Language)
|
||||||
|
|
||||||
|
The runtime is required for integration between Go and the frontend. There are 2
|
||||||
|
ways to integrate the runtime:
|
||||||
|
|
||||||
|
- Using the `@wailsio/runtime` package
|
||||||
|
- Using a pre-built version of the runtime
|
||||||
|
|
||||||
|
## Using the `@wailsio/runtime` package
|
||||||
|
|
||||||
|
The `@wailsio/runtime` package is a JavaScript package that provides access to
|
||||||
|
the Wails runtime. It is used in by all the standard templates and is the
|
||||||
|
recommended way to integrate the runtime into your application. By using the
|
||||||
|
package, you will only include the parts of the runtime that you use.
|
||||||
|
|
||||||
|
The package is available on npm and can be installed using:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
npm install --save @wailsio/runtime
|
||||||
|
```
|
||||||
|
|
||||||
|
## Using a pre-built version of the runtime
|
||||||
|
|
||||||
|
Some projects will not use a Javascript bundler and may prefer to use a
|
||||||
|
pre-built version of the runtime. This is the default for the examples in
|
||||||
|
`v3/examples`. The pre-built version of the runtime can be generated using the
|
||||||
|
following command:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
wails3 generate runtime
|
||||||
|
```
|
||||||
|
|
||||||
|
This will generate a `runtime.js` (and `runtime.debug.js`) file in the current
|
||||||
|
directory. This file can be used by your application by adding it to your assets
|
||||||
|
directory (normally `frontend/dist`) and then including it in your HTML:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<script src="/runtime.js"></script>
|
||||||
|
</head>
|
||||||
|
<!--- ... -->
|
||||||
|
</>
|
||||||
|
```
|
164
docs/src/content/docs/learn/services.md
Normal file
@ -0,0 +1,164 @@
|
|||||||
|
---
|
||||||
|
title: Services
|
||||||
|
sidebar:
|
||||||
|
order: 10
|
||||||
|
---
|
||||||
|
|
||||||
|
Services in Wails v3 provide a powerful way to extend the functionality of your
|
||||||
|
application. They allow you to create modular, reusable components that can be
|
||||||
|
easily integrated into your Wails application.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Services are designed to encapsulate specific functionality and can be
|
||||||
|
registered with the application at startup. They can handle various tasks such
|
||||||
|
as file serving, database operations, logging, and more. Services can also
|
||||||
|
interact with the application lifecycle and respond to HTTP requests.
|
||||||
|
|
||||||
|
## Creating a Service
|
||||||
|
|
||||||
|
To create a service, you simply define a struct. Here's a basic structure of a
|
||||||
|
service:
|
||||||
|
|
||||||
|
```go
|
||||||
|
type MyService struct {
|
||||||
|
// Your service fields
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewMyService() *MyService {
|
||||||
|
// Initialize and return your service
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *MyService) Greet(name string) string {
|
||||||
|
return fmt.Sprintf("Hello, %s!", name)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
This service has a single method, `Greet`, which accepts a name and returns a
|
||||||
|
greeting.
|
||||||
|
|
||||||
|
## Registering a Service
|
||||||
|
|
||||||
|
To register a service with the application, you need to provide an instance of
|
||||||
|
the service to the `Services` field of the `application.Options` struct (All
|
||||||
|
services need to be wrapped by an `application.NewService` call. Here's an
|
||||||
|
example:
|
||||||
|
|
||||||
|
```go
|
||||||
|
app := application.New(application.Options{
|
||||||
|
Services: []application.Service{
|
||||||
|
application.NewService(NewMyService()),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
## Optional Methods
|
||||||
|
|
||||||
|
Services can implement optional methods to hook into the application lifecycle:
|
||||||
|
|
||||||
|
### Name
|
||||||
|
|
||||||
|
```go
|
||||||
|
func (s *Service) Name() string
|
||||||
|
```
|
||||||
|
|
||||||
|
This method returns the name of the service. It is used for logging purposes
|
||||||
|
only.
|
||||||
|
|
||||||
|
### OnStartup
|
||||||
|
|
||||||
|
```go
|
||||||
|
func (s *Service) OnStartup(ctx context.Context, options application.ServiceOptions) error
|
||||||
|
```
|
||||||
|
|
||||||
|
This method is called when the application is starting up. You can use it to
|
||||||
|
initialize resources, set up connections, or perform any necessary setup tasks.
|
||||||
|
The context is the application context, and the `options` parameter provides
|
||||||
|
additional information about the service.
|
||||||
|
|
||||||
|
### OnShutdown
|
||||||
|
|
||||||
|
```go
|
||||||
|
func (s *Service) OnShutdown() error
|
||||||
|
```
|
||||||
|
|
||||||
|
This method is called when the application is shutting down. Use it to clean up
|
||||||
|
resources, close connections, or perform any necessary cleanup tasks.
|
||||||
|
|
||||||
|
### ServeHTTP
|
||||||
|
|
||||||
|
```go
|
||||||
|
func (s *Service) ServeHTTP(w http.ResponseWriter, r *http.Request)
|
||||||
|
```
|
||||||
|
|
||||||
|
If your service needs to handle HTTP requests, implement this method. It allows
|
||||||
|
your service to act as an HTTP handler. The route of the handler is defined in
|
||||||
|
the service options:
|
||||||
|
|
||||||
|
```go
|
||||||
|
application.NewService(fileserver.New(&fileserver.Config{
|
||||||
|
RootPath: rootPath,
|
||||||
|
}), application.ServiceOptions{
|
||||||
|
Route: "/files",
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
## Example: File Server Service
|
||||||
|
|
||||||
|
Let's look at a simplified version of the `fileserver` service as an example:
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Service struct {
|
||||||
|
config *Config
|
||||||
|
fs http.Handler
|
||||||
|
}
|
||||||
|
|
||||||
|
func New(config *Config) *Service {
|
||||||
|
return &Service{
|
||||||
|
config: config,
|
||||||
|
fs: http.FileServer(http.Dir(config.RootPath)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Service) Name() string {
|
||||||
|
return "github.com/wailsapp/wails/v3/services/fileserver"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Service) OnStartup(ctx context.Context, options application.ServiceOptions) error {
|
||||||
|
// Any initialization code here
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Service) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||||
|
s.fs.ServeHTTP(w, r)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
We can now use this service in our application:
|
||||||
|
|
||||||
|
```go
|
||||||
|
app := application.New(application.Options{
|
||||||
|
Services: []application.Service{
|
||||||
|
application.NewService(fileserver.New(&fileserver.Config{
|
||||||
|
RootPath: rootPath,
|
||||||
|
}), application.ServiceOptions{
|
||||||
|
Route: "/files",
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
All requests to `/files` will be handled by the `fileserver` service.
|
||||||
|
|
||||||
|
## Application Lifecycle and Services
|
||||||
|
|
||||||
|
1. During application initialization, services are registered with the
|
||||||
|
application.
|
||||||
|
2. When the application starts (`app.Run()`), the `OnStartup` method of each
|
||||||
|
service is called with the application context and service options.
|
||||||
|
3. Throughout the application's lifetime, services can perform their specific
|
||||||
|
tasks.
|
||||||
|
4. If a service implements `ServeHTTP`, it can handle HTTP requests at the
|
||||||
|
specified path.
|
||||||
|
5. When the application is shutting down, the `OnShutdown` method of each
|
||||||
|
service is called as well as the context being cancelled.
|
35
docs/src/content/docs/status.md
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
---
|
||||||
|
title: Roadmap
|
||||||
|
---
|
||||||
|
|
||||||
|
## Current Status: Alpha 7
|
||||||
|
|
||||||
|
Our goal is to reach Beta status. This roadmap outlines the key features and
|
||||||
|
improvements we need to implement before transitioning to Beta. Please note that
|
||||||
|
this is a living document and may be updated as priorities shift or new insights
|
||||||
|
emerge.
|
||||||
|
|
||||||
|
## How You Can Contribute
|
||||||
|
|
||||||
|
- Test the latest alpha release and report any issues
|
||||||
|
- Contribute to documentation and examples
|
||||||
|
- Participate in discussions and provide feedback on proposed features
|
||||||
|
- Submit pull requests for bug fixes or new features
|
||||||
|
|
||||||
|
We welcome contributions from the community. If you'd like to help with any of
|
||||||
|
these objectives or have suggestions for the roadmap, please open an issue or
|
||||||
|
join our community discussions.
|
||||||
|
|
||||||
|
## Feedback and Updates
|
||||||
|
|
||||||
|
This roadmap is subject to change based on community feedback and project
|
||||||
|
priorities. We'll update it regularly to reflect our progress and any changes in
|
||||||
|
direction. Your input is valuable in shaping the future of Wails! The roadmap is
|
||||||
|
a living document and is subject to change. If you have any suggestions, please
|
||||||
|
open an issue. Each milestone will have a set of goals that we are aiming to
|
||||||
|
achieve. These are subject to change.
|
||||||
|
|
||||||
|
## Alpha 8 Status
|
||||||
|
|
||||||
|
- In Progress: Add support for File Associations
|
||||||
|
- In Progress: Drag and Drop support for Linux
|
388
docs/src/content/docs/whats-new.md
Normal file
@ -0,0 +1,388 @@
|
|||||||
|
---
|
||||||
|
title: What's New in Wails v3 Alpha
|
||||||
|
---
|
||||||
|
|
||||||
|
Wails v3 Alpha introduces significant changes from v2. It replaces the
|
||||||
|
single-window, declarative API with a more flexible procedural approach. This
|
||||||
|
new API design improves code readability and simplifies development, especially
|
||||||
|
for complex multi-window applications.
|
||||||
|
|
||||||
|
Wails v3 Alpha represents a substantial evolution in how desktop applications
|
||||||
|
can be built using Go and web technologies.
|
||||||
|
|
||||||
|
## Multiple Windows
|
||||||
|
|
||||||
|
Wails v3 introduces the ability to create and manage multiple windows within a
|
||||||
|
single application. This feature allows developers to design more complex and
|
||||||
|
versatile user interfaces, moving beyond the limitations of single-window
|
||||||
|
applications.
|
||||||
|
|
||||||
|
Each window can be independently configured, providing flexibility in terms of
|
||||||
|
size, position, content, and behavior. This enables the creation of applications
|
||||||
|
with separate windows for different functionalities, such as main interfaces,
|
||||||
|
settings panels, or auxiliary views.
|
||||||
|
|
||||||
|
Developers can create, manipulate, and manage these windows programmatically,
|
||||||
|
allowing for dynamic user interfaces that adapt to user needs and application
|
||||||
|
states.
|
||||||
|
|
||||||
|
:::tip[Multiple Windows]
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
_ "embed"
|
||||||
|
"log"
|
||||||
|
|
||||||
|
"github.com/wailsapp/wails/v3/pkg/application"
|
||||||
|
)
|
||||||
|
|
||||||
|
//go:embed assets/*
|
||||||
|
var assets embed.FS
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
|
||||||
|
app := application.New(application.Options{
|
||||||
|
Name: "Multi Window Demo",
|
||||||
|
Assets: application.AssetOptions{
|
||||||
|
Handler: application.AssetFileServerFS(assets),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
window1 := app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{
|
||||||
|
Title: "Window 1",
|
||||||
|
})
|
||||||
|
|
||||||
|
window2 := app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{
|
||||||
|
Title: "Window 2",
|
||||||
|
})
|
||||||
|
|
||||||
|
// load the embedded html from the embed.FS
|
||||||
|
window1.SetURL("/")
|
||||||
|
window1.Center()
|
||||||
|
|
||||||
|
// Load an external URL
|
||||||
|
window2.SetURL("https://wails.app")
|
||||||
|
|
||||||
|
err := app.Run()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
## System Tray Integration
|
||||||
|
|
||||||
|
Wails v3 introduces robust support for system tray functionality, allowing your
|
||||||
|
application to maintain a persistent presence on the user's desktop. This
|
||||||
|
feature is particularly useful for applications that need to run in the
|
||||||
|
background or provide quick access to key functions.
|
||||||
|
|
||||||
|
Key features of the Wails v3 system tray integration include:
|
||||||
|
|
||||||
|
1. Window Attachment: You can associate a window with the system tray icon. When
|
||||||
|
activated, this window will be centered relative to the icon's position,
|
||||||
|
providing a seamless user experience.
|
||||||
|
|
||||||
|
2. Comprehensive Menu Support: Create rich, interactive menus that users can
|
||||||
|
access directly from the system tray icon. This allows for quick actions
|
||||||
|
without needing to open the full application window.
|
||||||
|
|
||||||
|
3. Adaptive Icon Display: Support for both light and dark mode icons ensures
|
||||||
|
your application's system tray icon remains visible and aesthetically
|
||||||
|
pleasing across different system themes.
|
||||||
|
|
||||||
|
:::tip[Systray]
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
_ "embed"
|
||||||
|
"log"
|
||||||
|
"runtime"
|
||||||
|
|
||||||
|
"github.com/wailsapp/wails/v3/pkg/application"
|
||||||
|
"github.com/wailsapp/wails/v3/pkg/icons"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
app := application.New(application.Options{
|
||||||
|
Name: "Systray Demo",
|
||||||
|
Mac: application.MacOptions{
|
||||||
|
ActivationPolicy: application.ActivationPolicyAccessory,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
window := app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{
|
||||||
|
Width: 500,
|
||||||
|
Height: 800,
|
||||||
|
Frameless: true,
|
||||||
|
AlwaysOnTop: true,
|
||||||
|
Hidden: true,
|
||||||
|
Windows: application.WindowsWindow{
|
||||||
|
HiddenOnTaskbar: true,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
systemTray := app.NewSystemTray()
|
||||||
|
|
||||||
|
// Support for template icons on macOS
|
||||||
|
if runtime.GOOS == "darwin" {
|
||||||
|
systemTray.SetTemplateIcon(icons.SystrayMacTemplate)
|
||||||
|
} else {
|
||||||
|
// Support for light/dark mode icons
|
||||||
|
systemTray.SetDarkModeIcon(icons.SystrayDark)
|
||||||
|
systemTray.SetIcon(icons.SystrayLight)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Support for menu
|
||||||
|
myMenu := app.NewMenu()
|
||||||
|
myMenu.Add("Hello World!").OnClick(func(_ *application.Context) {
|
||||||
|
println("Hello World!")
|
||||||
|
})
|
||||||
|
systemTray.SetMenu(myMenu)
|
||||||
|
|
||||||
|
// This will center the window to the systray icon with a 5px offset
|
||||||
|
// It will automatically be shown when the systray icon is clicked
|
||||||
|
// and hidden when the window loses focus
|
||||||
|
systemTray.AttachWindow(window).WindowOffset(5)
|
||||||
|
|
||||||
|
err := app.Run()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
## Improved bindings generation
|
||||||
|
|
||||||
|
Wails v3 introduces a significant improvement in how bindings are generated for
|
||||||
|
your project. Bindings are the glue that connects your Go backend to your
|
||||||
|
frontend, allowing seamless communication between the two.
|
||||||
|
|
||||||
|
Binding generation is now done using a sophisticated static analyzer that
|
||||||
|
radically improves the binding generation process. It offers enhanced speed and
|
||||||
|
preserves code quality by maintaining comments and parameter names.
|
||||||
|
|
||||||
|
The binding generation process has been simplified, requiring only a single
|
||||||
|
command: `wails3 generate bindings`.
|
||||||
|
|
||||||
|
:::tip[Bindings]
|
||||||
|
|
||||||
|
```js
|
||||||
|
// @ts-check
|
||||||
|
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
|
||||||
|
// This file is automatically generated. DO NOT EDIT
|
||||||
|
|
||||||
|
import { main } from "./models";
|
||||||
|
|
||||||
|
window.go = window.go || {};
|
||||||
|
window.go.main = {
|
||||||
|
GreetService: {
|
||||||
|
/**
|
||||||
|
* GreetService.Greet
|
||||||
|
* Greet greets a person
|
||||||
|
* @param name {string}
|
||||||
|
* @returns {Promise<string>}
|
||||||
|
**/
|
||||||
|
Greet: function (name) {
|
||||||
|
wails.CallByID(1411160069, ...Array.prototype.slice.call(arguments, 0));
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GreetService.GreetPerson
|
||||||
|
* GreetPerson greets a person
|
||||||
|
* @param person {main.Person}
|
||||||
|
* @returns {Promise<string>}
|
||||||
|
**/
|
||||||
|
GreetPerson: function (person) {
|
||||||
|
wails.CallByID(4021313248, ...Array.prototype.slice.call(arguments, 0));
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
## Improved build system
|
||||||
|
|
||||||
|
Wails v3 introduces a more flexible and transparent build system, addressing the
|
||||||
|
limitations of its predecessor. In v2, the build process was largely opaque and
|
||||||
|
difficult to customise, which could be frustrating for developers seeking more
|
||||||
|
control over their project's build process.
|
||||||
|
|
||||||
|
All the heavy lifting that the v2 build system did, such as icon generation and
|
||||||
|
manifest creation, have been added as tool commands in the CLI. We have
|
||||||
|
incorporated [Taskfile](https://taskfile.dev) into the CLI to orchestrate these
|
||||||
|
calls to bring the same developer experience as v2. However, this approach
|
||||||
|
brings the ultimate balance of flexibility and ease of use as you can now
|
||||||
|
customise the build process to your needs.
|
||||||
|
|
||||||
|
You can even use make if that's your thing!
|
||||||
|
|
||||||
|
:::tip[Taskfile.yml]
|
||||||
|
|
||||||
|
```yaml "Snippet from Taskfile.yml"
|
||||||
|
build:darwin:
|
||||||
|
summary: Builds the application
|
||||||
|
platforms:
|
||||||
|
- darwin
|
||||||
|
cmds:
|
||||||
|
- task: pre-build
|
||||||
|
- task: build-frontend
|
||||||
|
- go build -gcflags=all="-N -l" -o bin/{{.APP_NAME}}
|
||||||
|
- task: post-build
|
||||||
|
env:
|
||||||
|
CGO_CFLAGS: "-mmacosx-version-min=10.13"
|
||||||
|
CGO_LDFLAGS: "-mmacosx-version-min=10.13"
|
||||||
|
MACOSX_DEPLOYMENT_TARGET: "10.13"
|
||||||
|
```
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
## Improved events
|
||||||
|
|
||||||
|
Wails now emits events for various runtime operations and system activities.
|
||||||
|
This allows your application to respond to these events in real-time.
|
||||||
|
Additionally, cross-platform (common) events are available, enabling you to
|
||||||
|
write consistent event handling methods that work across different operating
|
||||||
|
systems.
|
||||||
|
|
||||||
|
Event hooks can be registered to handle specific events synchronously. Unlike
|
||||||
|
the `On` method, these hooks allow you to cancel the event if needed. A common
|
||||||
|
use case is displaying a confirmation dialog before closing a window. This gives
|
||||||
|
you more control over the event flow and user experience.
|
||||||
|
|
||||||
|
:::tip[Example of event handling]
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
_ "embed"
|
||||||
|
"log"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/wailsapp/wails/v3/pkg/application"
|
||||||
|
"github.com/wailsapp/wails/v3/pkg/events"
|
||||||
|
)
|
||||||
|
|
||||||
|
//go:embed assets
|
||||||
|
var assets embed.FS
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
|
||||||
|
app := application.New(application.Options{
|
||||||
|
Name: "Events Demo",
|
||||||
|
Description: "A demo of the Events API",
|
||||||
|
Assets: application.AssetOptions{
|
||||||
|
Handler: application.AssetFileServerFS(assets),
|
||||||
|
},
|
||||||
|
Mac: application.MacOptions{
|
||||||
|
ApplicationShouldTerminateAfterLastWindowClosed: true,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
// Custom event handling
|
||||||
|
app.Events.On("myevent", func(e *application.WailsEvent) {
|
||||||
|
log.Printf("[Go] WailsEvent received: %+v\n", e)
|
||||||
|
})
|
||||||
|
|
||||||
|
// OS specific application events
|
||||||
|
app.On(events.Mac.ApplicationDidFinishLaunching, func(event *application.Event) {
|
||||||
|
println("events.Mac.ApplicationDidFinishLaunching fired!")
|
||||||
|
})
|
||||||
|
|
||||||
|
// Platform agnostic events
|
||||||
|
app.On(events.Common.ApplicationStarted, func(event *application.Event) {
|
||||||
|
println("events.Common.ApplicationStarted fired!")
|
||||||
|
})
|
||||||
|
|
||||||
|
win1 := app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{
|
||||||
|
Title: "Takes 3 attempts to close me!",
|
||||||
|
})
|
||||||
|
|
||||||
|
var countdown = 3
|
||||||
|
|
||||||
|
// Register a hook to cancel the window closing
|
||||||
|
win1.RegisterHook(events.Common.WindowClosing, func(e *application.WindowEvent) {
|
||||||
|
countdown--
|
||||||
|
if countdown == 0 {
|
||||||
|
println("Closing!")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
println("Nope! Not closing!")
|
||||||
|
e.Cancel()
|
||||||
|
})
|
||||||
|
|
||||||
|
win1.On(events.Common.WindowFocus, func(e *application.WindowEvent) {
|
||||||
|
println("[Event] Window focus!")
|
||||||
|
})
|
||||||
|
|
||||||
|
err := app.Run()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
## Wails Markup Language (wml)
|
||||||
|
|
||||||
|
An experimental feature to call runtime methods using plain html, similar to
|
||||||
|
[htmx](https://htmx.org).
|
||||||
|
|
||||||
|
:::tip[Example of wml]
|
||||||
|
|
||||||
|
```html
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<title>Wails ML Demo</title>
|
||||||
|
</head>
|
||||||
|
<body style="margin-top:50px; color: white; background-color: #191919">
|
||||||
|
<h2>Wails ML Demo</h2>
|
||||||
|
<p>This application contains no Javascript!</p>
|
||||||
|
<button wml-event="button-pressed">Press me!</button>
|
||||||
|
<button wml-event="delete-things" wml-confirm="Are you sure?">
|
||||||
|
Delete all the things!
|
||||||
|
</button>
|
||||||
|
<button wml-window="Close" wml-confirm="Are you sure?">
|
||||||
|
Close the Window?
|
||||||
|
</button>
|
||||||
|
<button wml-window="Center">Center</button>
|
||||||
|
<button wml-window="Minimise">Minimise</button>
|
||||||
|
<button wml-window="Maximise">Maximise</button>
|
||||||
|
<button wml-window="UnMaximise">UnMaximise</button>
|
||||||
|
<button wml-window="Fullscreen">Fullscreen</button>
|
||||||
|
<button wml-window="UnFullscreen">UnFullscreen</button>
|
||||||
|
<button wml-window="Restore">Restore</button>
|
||||||
|
<div
|
||||||
|
style="width: 200px; height: 200px; border: 2px solid white;"
|
||||||
|
wml-event="hover"
|
||||||
|
wml-trigger="mouseover"
|
||||||
|
>
|
||||||
|
Hover over me
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
```
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
There are more examples available in the
|
||||||
|
[examples](https://github.com/wailsapp/wails/tree/v3-alpha/v3/examples)
|
||||||
|
directory. Check them out!
|
2
docs/src/env.d.ts
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
/// <reference path="../.astro/types.d.ts" />
|
||||||
|
/// <reference types="astro/client" />
|
4
docs/src/stylesheets/extra.css
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
html {
|
||||||
|
scrollbar-gutter: stable;
|
||||||
|
overflow-y: scroll; /* Show vertical scrollbar */
|
||||||
|
}
|
3
docs/tsconfig.json
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"extends": "astro/tsconfigs/strict"
|
||||||
|
}
|