From c4f9a43ff682145d34a07d5e1b0755387a6bcdd0 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Sun, 18 Sep 2022 11:00:39 +1000 Subject: [PATCH 01/62] Blog post --- website/blog/2022-09-18-v2-release-notes.mdx | 92 +++++++++++++++++++ website/static/img/montage.png | Bin 0 -> 181442 bytes 2 files changed, 92 insertions(+) create mode 100644 website/blog/2022-09-18-v2-release-notes.mdx create mode 100644 website/static/img/montage.png diff --git a/website/blog/2022-09-18-v2-release-notes.mdx b/website/blog/2022-09-18-v2-release-notes.mdx new file mode 100644 index 000000000..b7f3ea926 --- /dev/null +++ b/website/blog/2022-09-18-v2-release-notes.mdx @@ -0,0 +1,92 @@ +--- +slug: wails-v2-released +title: Wails v2 Released +authors: [leaanthony] +tags: [wails, v2] +--- + +
+ +
+
+ +# 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 to this point. 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 read any of the blog posts on the Beta releases, then you should be across most of the changes but to summarise: + + - 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 menus and dialogs. + - Native window translucency effects. + - 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 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. + - 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 88 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. 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! + +PS: If you or your company find Wails useful, please consider [sponsoring the project](https://github.com/sponsors/leaanthony). Thanks! diff --git a/website/static/img/montage.png b/website/static/img/montage.png new file mode 100644 index 0000000000000000000000000000000000000000..ddd771851bb0462d851191f974a60569c35f781c GIT binary patch literal 181442 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 &(jAQVA3K)?_{*nW(~u&#Z&RG$U- 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

?6cAfuZ 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 WT5%9HlJ0K+0000 Date: Sun, 18 Sep 2022 11:15:01 +1000 Subject: [PATCH 02/62] Updated README.md --- README.ja.md | 9 --- README.md | 69 +++---------------- README.zh-Hans.md | 9 --- .../credits.mdx | 7 +- .../credits.mdx | 3 - .../credits.mdx | 7 +- .../credits.mdx | 7 +- website/src/pages/credits.mdx | 3 - 8 files changed, 11 insertions(+), 103 deletions(-) diff --git a/README.ja.md b/README.ja.md index ed8757f4b..8f0bb704d 100644 --- a/README.ja.md +++ b/README.ja.md @@ -153,9 +153,6 @@ Wails v2 が 3 つのプラットフォームでベータ版としてリリー - - - @@ -171,9 +168,6 @@ Wails v2 が 3 つのプラットフォームでベータ版としてリリー - - - @@ -198,9 +192,6 @@ Wails v2 が 3 つのプラットフォームでベータ版としてリリー - - - diff --git a/README.md b/README.md index 7367bca6a..0c1ed6bbb 100644 --- a/README.md +++ b/README.md @@ -48,14 +48,6 @@ -


-

- -PLEASE NOTE: As we are approaching the v2 release, we are not accepting any new feature requests or bug reports for v1. If you have a critical issue, please open a ticket and state why it is critical. - -

-
- ## Table of Contents
@@ -63,15 +55,12 @@ PLEASE NOTE: As we are approaching the v2 release, we are not accepting any new - [Table of Contents](#table-of-contents) - [Introduction](#introduction) - - [Official Website](#official-website) - [Roadmap](#roadmap) - [Features](#features) - [Sponsors](#sponsors) - [Getting Started](#getting-started) - [FAQ](#faq) - [Contributors](#contributors) -- [Special Mentions](#special-mentions) -- [Special Thanks](#special-thanks) - [License](#license)
@@ -90,23 +79,13 @@ make this easy for you by handling project creation, compilation and bundling. A - Easily call Go methods from Javascript - Auto-generated Typescript definitions for your Go structs and methods - Native Dialogs & Menus +- Native Dark / Light mode support - Supports modern translucency and "frosted window" effects - Unified eventing system between Go and Javascript - Powerful cli tool to quickly generate and build your projects - Multiplatform - Uses native rendering engines - _no embedded browser_! -### Official Website - -Version 2: - -Wails v2 has been released in Beta for all 3 platforms. Check out the [new website](https://wails.io) if you are -interested in trying it out. - -Legacy v1 Website: - -The legacy v1 docs can be found at [https://wails.app](https://wails.app). - ### Roadmap The project roadmap may be found [here](https://github.com/wailsapp/wails/discussions/1484). Please consult @@ -117,7 +96,7 @@ this before open up an enhancement request. This project is supported by these kind people / companies: - + @@ -125,7 +104,7 @@ This project is supported by these kind people / companies:

- + @@ -154,9 +133,6 @@ This project is supported by these kind people / companies: - - - @@ -172,9 +148,6 @@ This project is supported by these kind people / companies: - - - @@ -199,9 +172,6 @@ This project is supported by these kind people / companies: - - - @@ -227,8 +197,8 @@ The installation instructions are on the [official website](https://wails.io/doc - Is this an alternative to Electron? Depends on your requirements. It's designed to make it easy for Go programmers to make lightweight desktop - applications or add a frontend to their existing applications. Wails v2 does offer native elements such as menus - and dialogs, so it is becoming a lightweight electron alternative. + applications or add a frontend to their existing applications. Wails does offer native elements such as menus + and dialogs, so it could be considered a lightweight electron alternative. - Who is this project aimed at? @@ -250,16 +220,11 @@ The installation instructions are on the [official website](https://wails.io/doc The contributors list is getting too big for the readme! All the amazing people who have contributed to this project have their own page [here](https://wails.io/credits#contributors). -## Special Mentions +## License -Without the following people, this project would never have existed: +[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fwailsapp%2Fwails.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fwailsapp%2Fwails?ref=badge_large) -- [Dustin Krysak](https://wiki.ubuntu.com/bashfulrobot) - His support and feedback has been immense. More patience than - you can throw a stick at (Not long now Dustin!). -- [Serge Zaitsev](https://github.com/zserge) - Creator of [Webview](https://github.com/zserge/webview) which Wails uses - for the windowing. -- [Byron](https://github.com/bh90210) - At times, Byron has single handedly kept this project alive. Without his - incredible input, we never would have got to v1. +## Inspiration This project was mainly coded to the following albums: @@ -276,21 +241,3 @@ This project was mainly coded to the following albums: - [Bloc Party - Silent Alarm](https://open.spotify.com/album/6SsIdN05HQg2GwYLfXuzLB) - [Maxthor - Another World](https://open.spotify.com/album/3tklE2Fgw1hCIUstIwPBJF) - [Alun Tan Lan - Y Distawrwydd](https://open.spotify.com/album/0c32OywcLpdJCWWMC6vB8v) - -## Special Thanks - -

-
- A huge thanks to Pace for sponsoring the project and helping the efforts to get Wails ported to Apple Silicon!

- If you are looking for a Project Management tool that's powerful but quick and easy to use, check them out!

-

- -

- A special thank you to JetBrains for donating licenses to us!

- Please click the logo to let them know your appreciation!

- -

- -## License - -[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fwailsapp%2Fwails.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fwailsapp%2Fwails?ref=badge_large) diff --git a/README.zh-Hans.md b/README.zh-Hans.md index 6f1185db2..f5c68d395 100644 --- a/README.zh-Hans.md +++ b/README.zh-Hans.md @@ -151,9 +151,6 @@ Wails v2 已针对所有 3 个平台发布了 Beta 版。如果您有兴趣尝 - - - @@ -169,9 +166,6 @@ Wails v2 已针对所有 3 个平台发布了 Beta 版。如果您有兴趣尝 - - - @@ -196,9 +190,6 @@ Wails v2 已针对所有 3 个平台发布了 Beta 版。如果您有兴趣尝 - - - diff --git a/website/i18n/ja/docusaurus-plugin-content-pages/credits.mdx b/website/i18n/ja/docusaurus-plugin-content-pages/credits.mdx index 4654df4d8..ba9295abe 100644 --- a/website/i18n/ja/docusaurus-plugin-content-pages/credits.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-pages/credits.mdx @@ -53,9 +53,6 @@ - - - @@ -99,9 +96,7 @@ directory - - - + diff --git a/website/i18n/ko/docusaurus-plugin-content-pages/credits.mdx b/website/i18n/ko/docusaurus-plugin-content-pages/credits.mdx index 7826b8ca6..0e4e76c52 100644 --- a/website/i18n/ko/docusaurus-plugin-content-pages/credits.mdx +++ b/website/i18n/ko/docusaurus-plugin-content-pages/credits.mdx @@ -53,9 +53,6 @@ - - - diff --git a/website/i18n/ru/docusaurus-plugin-content-pages/credits.mdx b/website/i18n/ru/docusaurus-plugin-content-pages/credits.mdx index d018c2079..de5ec7896 100644 --- a/website/i18n/ru/docusaurus-plugin-content-pages/credits.mdx +++ b/website/i18n/ru/docusaurus-plugin-content-pages/credits.mdx @@ -53,9 +53,6 @@ - - - @@ -99,9 +96,7 @@ directory - - - + diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-pages/credits.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-pages/credits.mdx index 11696bc48..a6042b151 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-pages/credits.mdx +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-pages/credits.mdx @@ -53,9 +53,6 @@ - - - @@ -99,9 +96,7 @@ directory - - - + diff --git a/website/src/pages/credits.mdx b/website/src/pages/credits.mdx index 310014986..e09725906 100644 --- a/website/src/pages/credits.mdx +++ b/website/src/pages/credits.mdx @@ -52,9 +52,6 @@ - - - From 21b4f643dd63d89d8b2e6fc9dd8a9e6d5acbca44 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Sun, 18 Sep 2022 11:18:17 +1000 Subject: [PATCH 03/62] Updated README.md + copy to v2 directory --- README.md | 3 - v2/NOTES.md | 40 --------- v2/README.md | 240 ++++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 237 insertions(+), 46 deletions(-) delete mode 100644 v2/NOTES.md diff --git a/README.md b/README.md index 0c1ed6bbb..8d8451ee0 100644 --- a/README.md +++ b/README.md @@ -17,9 +17,6 @@ Go Reference - - CodeFactor - CodeFactor diff --git a/v2/NOTES.md b/v2/NOTES.md deleted file mode 100644 index 16bac7122..000000000 --- a/v2/NOTES.md +++ /dev/null @@ -1,40 +0,0 @@ - -# Packing linux - - * create app, app.desktop, app.png (512x512) - * chmod +x app! - * ./linuxdeploy-x86_64.AppImage --appdir AppDir -i react.png -d react.desktop -e react --output appimage - - -# Wails Doctor - -Tested on: - - * Debian 8 - * Ubuntu 20.04 - * Ubuntu 19.10 - * Solus 4.1 - * Centos 8 - * Gentoo - * OpenSUSE/leap - * Fedora 31 - -### Development - -Add a new package manager processor here: `v2/internal/system/packagemanager/`. IsAvailable should work even if the package is installed. -Add your new package manager to the list of package managers in `v2/internal/system/packagemanager/packagemanager.go`: - -``` -var db = map[string]PackageManager{ - "eopkg": NewEopkg(), - "apt": NewApt(), - "yum": NewYum(), - "pacman": NewPacman(), - "emerge": NewEmerge(), - "zypper": NewZypper(), -} -``` - -## Gentoo - - * Setup docker image using: emerge-webrsync -x -v diff --git a/v2/README.md b/v2/README.md index 20ebb18b7..1b472b8eb 100644 --- a/v2/README.md +++ b/v2/README.md @@ -1,6 +1,240 @@ -# Wails v2 ALPHA +

Wails

-This branch contains WORK IN PROGRESS! There are no guarantees. Use at your peril! +

+
+

-This document will be updated as progress is made. +

+ Build desktop applications using Go & Web Technologies. +
+
+ + GitHub + + + + + + Go Reference + + + CodeFactor + + + + + + Awesome + +
+ + Build + + + GitHub tag (latest SemVer pre-release) + +

+
+ + + +[English](README.md) · [简体中文](README.zh-Hans.md) · [日本語](README.ja.md) + + + +
+ +## Table of Contents + +
+ Click me to Open/Close the directory listing + +- [Table of Contents](#table-of-contents) +- [Introduction](#introduction) + - [Roadmap](#roadmap) +- [Features](#features) +- [Sponsors](#sponsors) +- [Getting Started](#getting-started) +- [FAQ](#faq) +- [Contributors](#contributors) +- [License](#license) + +
+ +## Introduction + +The traditional method of providing web interfaces to Go programs is via a built-in web server. Wails offers a different +approach: it provides the ability to wrap both Go code and a web frontend into a single binary. Tools are provided to +make this easy for you by handling project creation, compilation and bundling. All you have to do is get creative! + +## Features + +- Use standard Go for the backend +- Use any frontend technology you are already familiar with to build your UI +- Quickly create rich frontends for your Go programs using pre-built templates +- Easily call Go methods from Javascript +- Auto-generated Typescript definitions for your Go structs and methods +- Native Dialogs & Menus +- Native Dark / Light mode support +- Supports modern translucency and "frosted window" effects +- Unified eventing system between Go and Javascript +- Powerful cli tool to quickly generate and build your projects +- Multiplatform +- Uses native rendering engines - _no embedded browser_! + +### Roadmap + +The project roadmap may be found [here](https://github.com/wailsapp/wails/discussions/1484). Please consult +this before open up an enhancement request. + +## Sponsors + +This project is supported by these kind people / companies: + + + + + + + +
+
+ + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +## Getting Started + +The installation instructions are on the [official website](https://wails.io/docs/gettingstarted/installation). + +## FAQ + +- Is this an alternative to Electron? + + Depends on your requirements. It's designed to make it easy for Go programmers to make lightweight desktop + applications or add a frontend to their existing applications. Wails does offer native elements such as menus + and dialogs, so it could be considered a lightweight electron alternative. + +- Who is this project aimed at? + + Go programmers who want to bundle an HTML/JS/CSS frontend with their applications, without resorting to creating a + server and opening a browser to view it. + +- What's with the name? + + When I saw WebView, I thought "What I really want is tooling around building a WebView app, a bit like Rails is to + Ruby". So initially it was a play on words (Webview on Rails). It just so happened to also be a homophone of the + English name for the [Country](https://en.wikipedia.org/wiki/Wales) I am from. So it stuck. + +## Stargazers over time + +[![Stargazers over time](https://starchart.cc/wailsapp/wails.svg)](https://starchart.cc/wailsapp/wails) + +## Contributors + +The contributors list is getting too big for the readme! All the amazing people who have contributed to this +project have their own page [here](https://wails.io/credits#contributors). + +## License + +[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fwailsapp%2Fwails.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fwailsapp%2Fwails?ref=badge_large) + +## Inspiration + +This project was mainly coded to the following albums: + +- [Manic Street Preachers - Resistance Is Futile](https://open.spotify.com/album/1R2rsEUqXjIvAbzM0yHrxA) +- [Manic Street Preachers - This Is My Truth, Tell Me Yours](https://open.spotify.com/album/4VzCL9kjhgGQeKCiojK1YN) +- [The Midnight - Endless Summer](https://open.spotify.com/album/4Krg8zvprquh7TVn9OxZn8) +- [Gary Newman - Savage (Songs from a Broken World)](https://open.spotify.com/album/3kMfsD07Q32HRWKRrpcexr) +- [Steve Vai - Passion & Warfare](https://open.spotify.com/album/0oL0OhrE2rYVns4IGj8h2m) +- [Ben Howard - Every Kingdom](https://open.spotify.com/album/1nJsbWm3Yy2DW1KIc1OKle) +- [Ben Howard - Noonday Dream](https://open.spotify.com/album/6astw05cTiXEc2OvyByaPs) +- [Adwaith - Melyn](https://open.spotify.com/album/2vBE40Rp60tl7rNqIZjaXM) +- [Gwidaith Hen Fran - Cedors Hen Wrach](https://open.spotify.com/album/3v2hrfNGINPLuDP0YDTOjm) +- [Metallica - Metallica](https://open.spotify.com/album/2Kh43m04B1UkVcpcRa1Zug) +- [Bloc Party - Silent Alarm](https://open.spotify.com/album/6SsIdN05HQg2GwYLfXuzLB) +- [Maxthor - Another World](https://open.spotify.com/album/3tklE2Fgw1hCIUstIwPBJF) +- [Alun Tan Lan - Y Distawrwydd](https://open.spotify.com/album/0c32OywcLpdJCWWMC6vB8v) From 1a6f3084943a0e0725cfd5801446f3f8ca3e5e70 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Sun, 18 Sep 2022 11:45:21 +1000 Subject: [PATCH 04/62] Updated README.md + copy to v2 directory --- README.md | 2 -- v2/README.md | 2 -- 2 files changed, 4 deletions(-) diff --git a/README.md b/README.md index 8d8451ee0..a6ec6c37a 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,3 @@ -

Wails

-


diff --git a/v2/README.md b/v2/README.md index 1b472b8eb..c69808f58 100644 --- a/v2/README.md +++ b/v2/README.md @@ -1,5 +1,3 @@ -

Wails

-


From 7ab969195c695dc7e5483e93dc8f4e821605d38f Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Sun, 18 Sep 2022 20:51:01 +1000 Subject: [PATCH 05/62] Updated blog --- website/blog/2022-09-18-v2-release-notes.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/blog/2022-09-18-v2-release-notes.mdx b/website/blog/2022-09-18-v2-release-notes.mdx index b7f3ea926..2a521a87d 100644 --- a/website/blog/2022-09-18-v2-release-notes.mdx +++ b/website/blog/2022-09-18-v2-release-notes.mdx @@ -16,7 +16,7 @@ tags: [wails, v2] # 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 to this point. I'm truly grateful to everyone involved in the evolution of the project. +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. From 428f839c84f09d5b7997b01ffdce3f4ef0bac6b8 Mon Sep 17 00:00:00 2001 From: Misite Bao Date: Sun, 18 Sep 2022 20:24:09 +0800 Subject: [PATCH 06/62] feat: move blog images to a separate directory --- website/blog/2022-09-18-v2-release-notes.mdx | 2 +- website/static/img/{ => blog}/montage.png | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename website/static/img/{ => blog}/montage.png (100%) diff --git a/website/blog/2022-09-18-v2-release-notes.mdx b/website/blog/2022-09-18-v2-release-notes.mdx index 2a521a87d..5850ce38e 100644 --- a/website/blog/2022-09-18-v2-release-notes.mdx +++ b/website/blog/2022-09-18-v2-release-notes.mdx @@ -7,7 +7,7 @@ tags: [wails, v2]
diff --git a/website/static/img/montage.png b/website/static/img/blog/montage.png similarity index 100% rename from website/static/img/montage.png rename to website/static/img/blog/montage.png From a17aeee7124211c7b0a78b1323960a9ac665782a Mon Sep 17 00:00:00 2001 From: Misite Bao Date: Mon, 19 Sep 2022 00:52:00 +0800 Subject: [PATCH 07/62] feat: add translation --- website/blog/2022-09-18-v2-release-notes.mdx | 40 ++++---- .../2022-09-18-v2-release-notes.mdx | 97 +++++++++++++++++++ .../current/guides/bleeding-edge.mdx | 2 +- .../docusaurus-plugin-content-pages/coc.mdx | 2 +- 4 files changed, 120 insertions(+), 21 deletions(-) create mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-blog/2022-09-18-v2-release-notes.mdx diff --git a/website/blog/2022-09-18-v2-release-notes.mdx b/website/blog/2022-09-18-v2-release-notes.mdx index 5850ce38e..0f7f71ff8 100644 --- a/website/blog/2022-09-18-v2-release-notes.mdx +++ b/website/blog/2022-09-18-v2-release-notes.mdx @@ -5,6 +5,7 @@ authors: [leaanthony] tags: [wails, v2] --- +```mdx-code-block

+``` # 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. +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? +# 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). @@ -30,20 +32,20 @@ If you are unfamiliar with Wails, it is a project that enables Go programmers to The v2 release is a huge leap forward for the project, addressing many of the pain points of v1. If you have read any of the blog posts on the Beta releases, then you should be across most of the changes but to summarise: - - 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 menus and dialogs. - - Native window translucency effects. - - 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 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. - - 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. +- 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 menus and dialogs. +- Native window translucency effects. +- 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 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. +- 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 @@ -55,15 +57,15 @@ Firstly, a **huge** thank you to [@stffabi](https://github.com/stffabi) who has 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! +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. +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. +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 diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-blog/2022-09-18-v2-release-notes.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-blog/2022-09-18-v2-release-notes.mdx new file mode 100644 index 000000000..61de8b5f6 --- /dev/null +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-blog/2022-09-18-v2-release-notes.mdx @@ -0,0 +1,97 @@ +--- +slug: wails-v2-released +title: Wails v2 Released +authors: + - leaanthony +tags: + - wails + - v2 +--- + +```mdx-code-block +
+ +
+
+``` + +# 终于发布了! + +今天标志着 [Wails](https://wails.io) v2的发布。 距离发布第一个 v2 alpha 版本大约 18 个月,距离发布第一个 beta 版本大约一年。 我非常感谢参与项目发展的每一个人。 + +花了这么长时间的部分原因是想要在正式将其称为 v2 之前对其进行一些完整性的定义。 事实是,从来没有一个完美的时间来标记一个版本 - 总是有突出的问题或 “只是一个” 功能要加进去。 然而,标记一个不完美的主要版本的确是为项目的用户提供一些稳定性,并为开发人员提供了一些重置。 + +这此发布超出了我的预期。 我希望它给您带来的乐趣与开发它给我们带来的乐趣一样多。 + +# 什么 _是_ Wails? + +如果你对 Wails 不熟悉,它是一个让 Go 程序员能够使用熟悉的 Web 技术为其 Go 程序提供丰富的前端的项目。 它是 Electron 的轻量级 Go 替代品。 更多信息可以在 [官方网站 ](https://wails.io/docs/introduction)上找到。 + +# 有哪些新东西? + +V2 版本是该项目的巨大飞跃,解决了 v1 的许多痛点。 如果您已阅读有关 Beta 版本的任何博客文章,那么您应该了解大部分变更,但总结一下: + +- 适用于 Windows 的 Webview2 组件,支持现代 Web 标准和调试功能。 +- Windows 上的 [深色/浅色主题](https://wails.io/docs/reference/options#theme) 和 [自定义主题](https://wails.io/docs/reference/options#customtheme)。 +- Windows 现在没有 CGO 要求。 +- 支持对 Svelte、Vue、React、Preact、Lit 和 Vanilla 项目模板的开箱即用。 +- 集成 [Vite](https://vitejs.dev/) 为您的应用程序提供热重载开发环境。 +- 原生菜单和对话框。 +- 原生窗口半透明 +- 为 Windows 部署轻松生成 [NSIS](https://wails.io/docs/guides/windows-installer) 安装程序。 +- 一个为窗口操作、事件、对话框、菜单和日志记录提供实用方法的丰富的 [运行时库](https://wails.io/docs/reference/runtime/intro)。 +- 支持使用 [garble](https://github.com/burrowers/garble) 混淆您的应用程序。 +- 支持使用 [UPX](https://upx.github.io/) 压缩您的应用程序。 +- 自动为 Go 结构体的生成 Typescript。 +- 您的应用程序不需要附带额外的库或 DLL。 适用于任何平台。 +- 无需打包前端资产。 只需像开发任何其他 Web 应用程序一样开发您的应用程序。 + +# 致敬和感谢 + +到达 v2 是一项巨大的努力。 从最初的 alpha 版本到今天的发布,已经有 88 位贡献者提交了大约 2200 次提交,还有很多很多的贡献者在讨论论坛和 Issue 跟踪器上提供了翻译、测试、反馈和帮助。 我非常感谢你们每一个人。 我还要特别感谢所有提供指导、建议和反馈的项目赞助商。 非常感谢您所做的一切。 + +我想特别提及以下几个人: + +首先,** 非常** 感谢 [@stffabi](https://github.com/stffabi),他提供了许多我们都从中受益的贡献,并在许多 Issue 上提供了很多支持。 他提供了一些关键功能,例如外部开发服务器的支持,这改变了我们的开发模式,允许我们与 [Vite](https://vitejs.dev/) 的超级能力挂钩。 客观地说,如果没有他令人 [难以置信的贡献](https://github.com/wailsapp/wails/commits?author=stffabi&since=2020-01-04),Wails v2 将是一个不那么令人兴奋的版本。 非常感谢 @stffabi! + +我还想对 [@misitebao](https://github.com/misitebao) 表示热烈的祝贺,他一直不懈地维护网站、提供中文翻译、管理 Crowdin 并帮助新的翻译人员跟上进度。 这是一项非常重要的任务,我非常感谢为此付出的所有时间和精力! 你太棒了! + +最后但同样重要的是,非常感谢 Mat Ryer,他在 v2 的开发过程中提供了建议和支持。 使用 v2 的早期 Alpha 一起编写 xBar 有助于塑造 v2 的方向,并让我了解早期版本中的一些设计缺陷。 我很高兴地宣布,从今天开始,我们将开始将 xBar 移植到 Wails v2,它将成为该项目的旗舰应用。 干杯! + +# 吸取的教训 + +在到达 v2 的过程中吸取了许多经验教训,这些经验教训将影响未来的发展。 + +## 更小、更快、更聚焦的发布 + +在开发 v2 的过程中,有许多特性和错误修复是在临时基础上开发的。 这导致了更长的发布周期并且更难调试。 未来,我们将更频繁地创建包含较少数量功能的发布。 发布一个版本将包括文档的更新和完全的测试。 希望这些更小、更快、更集中的发布将导致更少的回归和更好的文档质量。 + +## 鼓励参与 + +在开始这个项目时,我想立即帮助每个有问题的人。 问题是“个人的”,我希望它们尽快得到解决。 这是不可持续的,最终会影响项目的寿命。 未来,我将为人们提供更多空间来参与回答问题和对问题进行分类。 如果能得到一些工具来帮助实现这一点就更好了,因此如果您有任何建议,请加入这里的讨论:https://github.com/wailsapp/wails/discussions/1855 + +## 学会说不 + +参与开源项目的人越多,对大多数人可能有用也可能没用的附加功能的请求就越多。 这些特性的开发和调试需要一段初始的时间,并从那时起产生持续的维护成本。 我本人对此负有最大责任,往往想要 “好高骛远”,而不是提供最小的可行功能。 未来,我们需要对添加核心功能多说一些 “不”,并将我们的精力集中在授权开发人员自己提供该功能的方式上。 我们正在认真研究这种情景的插件。 这将使任何人都能够按照他们认为合适的方式扩展该项目,并提供一种为项目做出贡献的简单方法。 + +# 展望未来 + +在下一个主要开发周期中,我们正在考虑将许多核心功能添加到 Wails 中。 [路线图](https://github.com/wailsapp/wails/discussions/1484) 充满了令人感兴趣的想法,我非常希望着手处理这些想法。 最多的要求之一是多窗口支持。 这是一个棘手的问题,并且要正确执行,我们可能需要考虑提供替代 API,因为当前的 API 在设计时并未考虑到这一点。 根据一些初步的想法和反馈,我想你会喜欢我们的预期。 + +我个人对在移动设备上运行 Wails 应用程序的前景非常感兴趣。 我们已经有一个演示项目表明可以在 Android 上运行 Wails 应用程序,所以我真的很想探索我们可以用它做到什么地步! + +我想提出的最后一点是功能均等性。 长期以来,我们不会在项目中添加任何东西,除非有完整的跨平台支持,这一直是一个核心原则。 虽然到目前为止这已被证明(主要)是可以实现的,但它确实阻碍了项目发布新功能。 未来,我们将采用稍微不同的方法:任何无法立即为所有平台发布的新功能都将在实验配置或 API 下发布。 这允许某些平台上的早期采用者尝试该功能并提供反馈,这些反馈将反馈到该功能的最终设计中。 当然,这意味着在所有可以支持它的平台完全支持之前,不能保证 API 的稳定性,但至少它会解除对开发的阻碍。 + +# 最后想说的 + +我真的为我们在 V2 版本中所取得的成就感到自豪。 看到人们已经能够使用 beta 版本构建的东西真是太神奇了。 像 [Varly](https://varly.app/)、[Surge](https://getsurge.io/) 和 [October](https://october.utf9k.net/) 等优质的应用程序。 我鼓励你们去看看。 + +这个版本是通过许多贡献者的辛勤工作实现的。 虽然它可以免费下载和使用,但它并不是通过零成本实现的。 毫无疑问,这个项目的成本很大。 这不仅是我的时间和每一个贡献者的时间,也是这些人的朋友和家人缺席的代价。 这就是为什么我非常感谢为实现这个项目而付出的每一秒。 我们拥有的贡献者越多,这种努力就可以分散得越多,我们可以共同实现的目标就越多。 我想鼓励大家选择一件可以贡献的东西,无论是确认某人的错误、提出修复建议、更改文档还是帮助需要它的人。 所有这些小事都有如此巨大的影响! 如果你也能成为 v3 故事的一部分那就太棒了。 + +请尽情享用! + +PPS:如果您或您的公司发现 Wails 有用,可以考虑 [赞助该项目](https://github.com/sponsors/leaanthony)。 谢谢! 谢谢! diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/bleeding-edge.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/bleeding-edge.mdx index 088c00175..91753a014 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/bleeding-edge.mdx +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/bleeding-edge.mdx @@ -52,4 +52,4 @@ Wails 一直在开发中,新版本会定期“标记”。 这通常发生在 - `cd v2/cmd/wails` - `go install` -确保如上所述 [ 更新您的项目](#updating-your-project)。 +确保如上所述 [更新您的项目](#updating-your-project)。 diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-pages/coc.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-pages/coc.mdx index 3d7077140..82bb714e9 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-pages/coc.mdx +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-pages/coc.mdx @@ -36,7 +36,7 @@ ## 监督 -辱骂、骚扰或其他不可接受的行为可通过 [插入联系方式] 向负责监督的社区领袖报告。 所有投诉都将得到及时和公平的审查和调查。 +辱骂、骚扰或其他不可接受的行为可通过 coc@wails.io 向负责监督的社区领袖报告。 所有投诉都将得到及时和公平的审查和调查。 所有社区领袖都有义务尊重任何事件报告者的隐私和安全。 From 7bd13556630624b3d5622c89dd39c9115006e948 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Mon, 19 Sep 2022 10:50:20 +1000 Subject: [PATCH 08/62] Add quote --- website/src/css/carousel.css | 1 + website/src/css/custom.css | 81 ++++++++++++++++++ website/src/pages/index.js | 156 +++++++++++++++++++---------------- 3 files changed, 165 insertions(+), 73 deletions(-) diff --git a/website/src/css/carousel.css b/website/src/css/carousel.css index f57a752fc..4233dcd3f 100644 --- a/website/src/css/carousel.css +++ b/website/src/css/carousel.css @@ -288,6 +288,7 @@ /* Below is the custom css */ .carousel .slider-wrapper { width: 100%; + max-width: 2000px; } .slide-item-box { diff --git a/website/src/css/custom.css b/website/src/css/custom.css index 8e15c93f0..369ca7705 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -91,4 +91,85 @@ html[data-theme="light"] .button--secondary { .screenshot { box-shadow: rgb(255 255 255 / 20%) 0 4px 8px 0, rgb(104 104 104) 0 6px 20px 0; +} + +/* Blockquote inspired by https://codepen.io/jupago/pen/GPxqLX. +Copyright (c) 2022 by Juan Pablo (https://codepen.io/jupago/pen/GPxqLX) +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +.blockquote-wrapper { + display: flex; + padding: 0 20px; +} + +.blockquote { + position: relative; + max-width: 95%; + margin: 4rem auto; + align-self: center; +} + +.blockquote h1 { + position: relative; + font-size: 1.5rem; + font-weight: normal; + line-height: 1; + margin: 0; + border: solid 2px; + border-radius: 10px; + padding: 25px; +} + +.blockquote h1:after { + content: ""; + color: var(--ifm-heading-color); + position: absolute; + border: 2px solid var(--ifm-hero-text-color); + border-radius: 0 50px 0 0; + width: 60px; + height: 60px; + bottom: -62px; + left: 50px; + border-bottom: none; + border-left: none; + z-index: 3; +} + +.blockquote h1:before { + content: ""; + position: absolute; + width: 80px; + border: 6px solid var(--ifm-hero-background-color); + bottom: -3px; + left: 50px; + z-index: 2; +} + +@media all and (min-width: 600px) { + .blockquote h1 { + font-size: 1.45rem; + line-height: 1.2; + } + + .blockquote { + max-width: 75%; + } +} + +.blockquote h4 { + position: relative; + font-size: 1.3rem; + font-weight: 400; + line-height: 1.2; + padding-top: 15px; + z-index: 1; + margin: 0 0 0 150px; + padding-left: 12px; +} + + +.blockquote h4:first-letter { + margin-left: -12px; } \ No newline at end of file diff --git a/website/src/pages/index.js b/website/src/pages/index.js index 0ed8efa74..3cec4e8f9 100644 --- a/website/src/pages/index.js +++ b/website/src/pages/index.js @@ -11,81 +11,91 @@ import useBaseUrl from "@docusaurus/useBaseUrl"; var Carousel = require("react-responsive-carousel").Carousel; function HomepageHeader() { - const {siteConfig} = useDocusaurusContext(); - return ( -
-
- -
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
+ const {siteConfig} = useDocusaurusContext(); + return ( +
+
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
-

- {translate({id: "homepage.Tagline"})} -

-
- - {translate({id: "homepage.LearnMoreButtonText"})} - - - {translate({id: "homepage.ButtonText"})} - -
-
-
- ); +

+ {translate({id: "homepage.Tagline"})} +

+
+ + {translate({id: "homepage.LearnMoreButtonText"})} + + + {translate({id: "homepage.ButtonText"})} + +
+
+
+

+ Wails v2 turns what used to be tedious and painful into a delightfully simple process. + Use the tools you know to create cross platform desktop apps. Everyone wins! +

+

— Brian Ketelsen
Co-author + of "Go In Action"

+
+
+
+
+ ); } export default function Home() { - const { siteConfig } = useDocusaurusContext(); - return ( - - -
- -
-
- ); + const {siteConfig} = useDocusaurusContext(); + return ( + + +
+ +
+
+ ); } From 3c17905155ee9cfdb6bdfd46b3d6dc48660c4264 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Mon, 19 Sep 2022 12:02:41 +1000 Subject: [PATCH 09/62] Fix slider images. Resize varly image and limit max width. Remove announcement. --- website/docs/introduction.mdx | 2 +- website/docusaurus.config.js | 7 ------- .../current/introduction.mdx | 2 +- .../version-v2.0.0-rc.1/introduction.mdx | 2 +- .../current/introduction.mdx | 2 +- .../version-v2.0.0-rc.1/introduction.mdx | 2 +- .../current/introduction.mdx | 2 +- .../version-v2.0.0-rc.1/introduction.mdx | 2 +- .../current/introduction.mdx | 2 +- .../version-v2.0.0-rc.1/introduction.mdx | 2 +- website/src/css/carousel.css | 7 +++++++ website/src/pages/index.js | 11 +++++------ website/static/img/showcase/varly2.webp | Bin 0 -> 17594 bytes website/static/img/showcase/wally.webp | Bin 11194 -> 19100 bytes website/static/img/varly.webp | Bin 135184 -> 0 bytes .../version-v2.0.0-beta.44/introduction.mdx | 2 +- .../version-v2.0.0-rc.1/introduction.mdx | 2 +- 17 files changed, 23 insertions(+), 24 deletions(-) create mode 100644 website/static/img/showcase/varly2.webp delete mode 100644 website/static/img/varly.webp diff --git a/website/docs/introduction.mdx b/website/docs/introduction.mdx index 5e463f876..d890aba9a 100644 --- a/website/docs/introduction.mdx +++ b/website/docs/introduction.mdx @@ -29,7 +29,7 @@ you'd expect from a modern native app. ```mdx-code-block

- +

``` diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index e86c3550b..3030e0bcb 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -232,13 +232,6 @@ const config = { disableSwitch: false, respectPrefersColorScheme: true, }, - announcementBar: { - id: "announcement-bar", - content: "Wails v2 is currently in Beta", - backgroundColor: "#b00", - textColor: "#FFF", - isCloseable: false, - }, algolia: { appId: "AWTCNFZ4FF", apiKey: "a6c0adbe611ee2535f3da5e8fd7b2200", diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/introduction.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/introduction.mdx index 13b9ee566..ab616d0a6 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/introduction.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/introduction.mdx @@ -26,7 +26,7 @@ This is [varly](https://varly.app) - a desktop application for MacOS & Windows w

- +

diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/introduction.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/introduction.mdx index 13b9ee566..ab616d0a6 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/introduction.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/introduction.mdx @@ -26,7 +26,7 @@ This is [varly](https://varly.app) - a desktop application for MacOS & Windows w

- +

diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/introduction.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/introduction.mdx index 9bc150451..4e65f932e 100644 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/introduction.mdx +++ b/website/i18n/ko/docusaurus-plugin-content-docs/current/introduction.mdx @@ -26,7 +26,7 @@ Consider it a lightweight and fast Electron alternative for Go. You can easily b

- +

diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/introduction.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/introduction.mdx index 9bc150451..4e65f932e 100644 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/introduction.mdx +++ b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/introduction.mdx @@ -26,7 +26,7 @@ Consider it a lightweight and fast Electron alternative for Go. You can easily b

- +

diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/current/introduction.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/current/introduction.mdx index d8c730730..5a832a69e 100644 --- a/website/i18n/ru/docusaurus-plugin-content-docs/current/introduction.mdx +++ b/website/i18n/ru/docusaurus-plugin-content-docs/current/introduction.mdx @@ -26,7 +26,7 @@ Wails - это проект, позволяющий писать настоль

- +

diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/introduction.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/introduction.mdx index d8c730730..5a832a69e 100644 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/introduction.mdx +++ b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/introduction.mdx @@ -26,7 +26,7 @@ Wails - это проект, позволяющий писать настоль

- +

diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/introduction.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/introduction.mdx index bfc83897d..9d12e8dd4 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/introduction.mdx +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/introduction.mdx @@ -26,7 +26,7 @@ Wails 是一个可让您使用 Go 和 Web 技术编写桌面应用的项目。 ```mdx-code-block

- +

``` diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/introduction.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/introduction.mdx index 68bdd5ed6..8c191a7aa 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/introduction.mdx +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/introduction.mdx @@ -26,7 +26,7 @@ Wails 是一个可让您使用 Go 和 Web 技术编写桌面应用的项目。

- +

diff --git a/website/src/css/carousel.css b/website/src/css/carousel.css index 4233dcd3f..b1caf7d6e 100644 --- a/website/src/css/carousel.css +++ b/website/src/css/carousel.css @@ -310,3 +310,10 @@ width: 75%; } } + +@media screen and (max-width: 966px) { + .carousel-root { + padding-left: 0; + width: 100%; + } +} \ No newline at end of file diff --git a/website/src/pages/index.js b/website/src/pages/index.js index 3cec4e8f9..b17fad1cd 100644 --- a/website/src/pages/index.js +++ b/website/src/pages/index.js @@ -26,6 +26,8 @@ function HomepageHeader() { infiniteLoop={true} interval={4000} transitionTime={1000} + centerMode={true} + >
@@ -34,10 +36,10 @@ function HomepageHeader() {
- +
- +
@@ -46,10 +48,7 @@ function HomepageHeader() {
- +
diff --git a/website/static/img/showcase/varly2.webp b/website/static/img/showcase/varly2.webp new file mode 100644 index 0000000000000000000000000000000000000000..6dbe0c9bf6db27cb15fbfc232e0b6f348477eaea GIT binary patch literal 17594 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 literal 0 HcmV?d00001 diff --git a/website/static/img/showcase/wally.webp b/website/static/img/showcase/wally.webp index 93258eea84f8606d580906610bfb3388332f8f77..150c98c744e3ce3d887795728b23805b1001762d 100644 GIT binary patch literal 19100 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 YO~D+Zjr#0M;)8f{J_Q7w3FiO+0Gc_s+W-In diff --git a/website/static/img/varly.webp b/website/static/img/varly.webp deleted file mode 100644 index 0c2d4663e5ef0f7438e86a08920dd472a699bf94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135184 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∨wdXqnCMxJ&U#WN)n1ufxA5#ht=OpUWan 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 diff --git a/website/versioned_docs/version-v2.0.0-beta.44/introduction.mdx b/website/versioned_docs/version-v2.0.0-beta.44/introduction.mdx index 791728a36..a62caa78c 100644 --- a/website/versioned_docs/version-v2.0.0-beta.44/introduction.mdx +++ b/website/versioned_docs/version-v2.0.0-beta.44/introduction.mdx @@ -17,7 +17,7 @@ you'd expect from a modern native app. diff --git a/website/versioned_docs/version-v2.0.0-rc.1/introduction.mdx b/website/versioned_docs/version-v2.0.0-rc.1/introduction.mdx index dddca11f4..6ef1e7523 100644 --- a/website/versioned_docs/version-v2.0.0-rc.1/introduction.mdx +++ b/website/versioned_docs/version-v2.0.0-rc.1/introduction.mdx @@ -29,7 +29,7 @@ you'd expect from a modern native app.

- +

From 08ed902b7af2328e7bd93180c1f32eb555891b70 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Mon, 19 Sep 2022 12:18:05 +1000 Subject: [PATCH 10/62] Improved CSS --- website/src/css/custom.css | 33 +++++++++++++++++++++++++++++++++ website/src/pages/index.js | 2 +- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/website/src/css/custom.css b/website/src/css/custom.css index 369ca7705..f9ee04cd0 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -93,6 +93,27 @@ html[data-theme="light"] .button--secondary { box-shadow: rgb(255 255 255 / 20%) 0 4px 8px 0, rgb(104 104 104) 0 6px 20px 0; } +.hero__subtitle { + margin-top: 2rem; + font-size: 1.5rem; +} + +@media all and (min-width: 600px) { + .hero__subtitle { + margin-top: 2rem; + font-size: 1.65rem; + } +} + + +@media all and (min-width: 1024px) { + .hero__subtitle { + margin-top: 2rem; + font-size: 1.75rem; + } +} + + /* Blockquote inspired by https://codepen.io/jupago/pen/GPxqLX. Copyright (c) 2022 by Juan Pablo (https://codepen.io/jupago/pen/GPxqLX) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: @@ -158,6 +179,18 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI } } + +@media all and (min-width: 1024px) { + .blockquote h1 { + font-size: 1.45rem; + line-height: 1.2; + } + + .blockquote { + max-width: 50%; + } +} + .blockquote h4 { position: relative; font-size: 1.3rem; diff --git a/website/src/pages/index.js b/website/src/pages/index.js index b17fad1cd..832b7d64e 100644 --- a/website/src/pages/index.js +++ b/website/src/pages/index.js @@ -73,7 +73,7 @@ function HomepageHeader() {

Wails v2 turns what used to be tedious and painful into a delightfully simple process. - Use the tools you know to create cross platform desktop apps. Everyone wins! + Use the tools you know to create cross-platform desktop apps. Everyone wins!

— Brian Ketelsen
Co-author of "Go In Action"

From 2de06a068436ae60a042d5b83dedfb9e45bd9caa Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Mon, 19 Sep 2022 12:24:30 +1000 Subject: [PATCH 11/62] Tidy CSS --- website/src/css/custom.css | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/website/src/css/custom.css b/website/src/css/custom.css index f9ee04cd0..134e1a800 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -98,22 +98,6 @@ html[data-theme="light"] .button--secondary { font-size: 1.5rem; } -@media all and (min-width: 600px) { - .hero__subtitle { - margin-top: 2rem; - font-size: 1.65rem; - } -} - - -@media all and (min-width: 1024px) { - .hero__subtitle { - margin-top: 2rem; - font-size: 1.75rem; - } -} - - /* Blockquote inspired by https://codepen.io/jupago/pen/GPxqLX. Copyright (c) 2022 by Juan Pablo (https://codepen.io/jupago/pen/GPxqLX) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: @@ -177,8 +161,12 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI .blockquote { max-width: 75%; } -} + .hero__subtitle { + margin-top: 2rem; + font-size: 1.65rem; + } +} @media all and (min-width: 1024px) { .blockquote h1 { @@ -189,6 +177,11 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI .blockquote { max-width: 50%; } + + .hero__subtitle { + margin-top: 2rem; + font-size: 1.75rem; + } } .blockquote h4 { From 840d3f1e85e4eb130fb0fc01820be5097a874bd2 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Mon, 19 Sep 2022 19:03:16 +1000 Subject: [PATCH 12/62] Set maximum carousel width --- website/src/css/carousel.css | 1 + 1 file changed, 1 insertion(+) diff --git a/website/src/css/carousel.css b/website/src/css/carousel.css index b1caf7d6e..a38286316 100644 --- a/website/src/css/carousel.css +++ b/website/src/css/carousel.css @@ -58,6 +58,7 @@ .carousel-root { outline: none; + max-width: 1024px; } .carousel { From 07a3973f9ac9bec258ca4575e0c93375c0975d4e Mon Sep 17 00:00:00 2001 From: Misite Bao Date: Mon, 19 Sep 2022 20:02:11 +0800 Subject: [PATCH 13/62] feat(website): optimize and improve documentation --- .../2021-09-27-v2-beta1-release-notes.mdx | 2 +- website/docs/gettingstarted/development.mdx | 2 +- website/docs/gettingstarted/installation.mdx | 2 +- website/docs/introduction.mdx | 5 ++++- website/docs/reference/options.mdx | 6 +++--- website/src/pages/credits.mdx | 20 ++++++++---------- .../bronze-sponsor.webp} | Bin website/static/img/{ => sponsor}/easyweb.webp | Bin .../{ => sponsor}/jetbrains-grayscale.webp | Bin .../silver-sponsor.webp} | Bin 10 files changed, 19 insertions(+), 18 deletions(-) rename website/static/img/{bronze sponsor.webp => sponsor/bronze-sponsor.webp} (100%) rename website/static/img/{ => sponsor}/easyweb.webp (100%) rename website/static/img/{ => sponsor}/jetbrains-grayscale.webp (100%) rename website/static/img/{silver sponsor.webp => sponsor/silver-sponsor.webp} (100%) diff --git a/website/blog/2021-09-27-v2-beta1-release-notes.mdx b/website/blog/2021-09-27-v2-beta1-release-notes.mdx index 413a3be01..989ac2c2c 100644 --- a/website/blog/2021-09-27-v2-beta1-release-notes.mdx +++ b/website/blog/2021-09-27-v2-beta1-release-notes.mdx @@ -197,7 +197,7 @@ 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: -- [Misitebao](https://github.com/misitebao) - An absolute workhorse on the Chinese translations and an incredible bug finder. +- [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. diff --git a/website/docs/gettingstarted/development.mdx b/website/docs/gettingstarted/development.mdx index 54dda5faa..a0075ef69 100644 --- a/website/docs/gettingstarted/development.mdx +++ b/website/docs/gettingstarted/development.mdx @@ -8,7 +8,7 @@ You can run your application in development mode by running `wails dev` from you - Build your application and run it - Bind your Go code to the frontend so it can be called from Javascript -- Using the power of [vite](https://vitejs.dev/), will watch for modifications in your Go files and rebuild/re-run on change +- Using the power of [Vite](https://vitejs.dev/), will watch for modifications in your Go files and rebuild/re-run on change - Sets up a [webserver](http://localhost:34115) that will serve your application over a browser. This allows you to use your favourite browser extensions. You can even call your Go code from the console To get started, run `wails dev` in the project directory. More information on this can be found [here](../reference/cli.mdx#dev). diff --git a/website/docs/gettingstarted/installation.mdx b/website/docs/gettingstarted/installation.mdx index 70ef0ded5..2bd3c8f9c 100644 --- a/website/docs/gettingstarted/installation.mdx +++ b/website/docs/gettingstarted/installation.mdx @@ -20,7 +20,7 @@ Wails has a number of common dependencies that are required before installation: ### Go -Download Go from the [Go Downloads Page](https://go.dev/doc/install). +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: diff --git a/website/docs/introduction.mdx b/website/docs/introduction.mdx index d890aba9a..0c4e87cb6 100644 --- a/website/docs/introduction.mdx +++ b/website/docs/introduction.mdx @@ -29,7 +29,10 @@ you'd expect from a modern native app. ```mdx-code-block

- +

``` diff --git a/website/docs/reference/options.mdx b/website/docs/reference/options.mdx index 039f6a92c..0470aaf8d 100644 --- a/website/docs/reference/options.mdx +++ b/website/docs/reference/options.mdx @@ -364,7 +364,7 @@ Type: `[]interface{}` ### Windows -This defines [Windows specific options](#windows-specific-options). +This defines [Windows specific options](#windows). Name: Windows
Type: `*windows.Options` @@ -529,7 +529,7 @@ Type: `func()` ### Mac -This defines [Mac specific options](#mac-specific-options). +This defines [Mac specific options](#mac). Name: Mac
Type: `*mac.Options` @@ -695,7 +695,7 @@ When clicked, that will open an about message box: ### Linux -This defines [Linux specific options](#linux-specific-options). +This defines [Linux specific options](#linux). Name: Linux
Type: `*linux.Options` diff --git a/website/src/pages/credits.mdx b/website/src/pages/credits.mdx index e09725906..2a7b20fd2 100644 --- a/website/src/pages/credits.mdx +++ b/website/src/pages/credits.mdx @@ -2,7 +2,7 @@ - [Lea Anthony](https://github.com/leaanthony) - Project owner, lead developer - [Stffabi](https://github.com/stffabi) - Technical lead, developer and maintainer -- [Misitebao](https://github.com/misitebao) - Documentation wizard, Chinese translation, Windows testing, Bug finder general +- [Misite Bao](https://github.com/misitebao) - Documentation wizard, Chinese translation, Windows testing, Bug finder general - [Travis McLane](https://github.com/tmclane) - Cross-compilation work, MacOS testing - [Byron Chris](https://github.com/bh90210) - Linux distro wizard, Linux testing @@ -12,30 +12,29 @@ dangerouslySetInnerHTML={{ __html: ` - + - +
-
- - - + + + - +
-
+ - + @@ -85,7 +84,6 @@ -directory diff --git a/website/static/img/bronze sponsor.webp b/website/static/img/sponsor/bronze-sponsor.webp similarity index 100% rename from website/static/img/bronze sponsor.webp rename to website/static/img/sponsor/bronze-sponsor.webp diff --git a/website/static/img/easyweb.webp b/website/static/img/sponsor/easyweb.webp similarity index 100% rename from website/static/img/easyweb.webp rename to website/static/img/sponsor/easyweb.webp diff --git a/website/static/img/jetbrains-grayscale.webp b/website/static/img/sponsor/jetbrains-grayscale.webp similarity index 100% rename from website/static/img/jetbrains-grayscale.webp rename to website/static/img/sponsor/jetbrains-grayscale.webp diff --git a/website/static/img/silver sponsor.webp b/website/static/img/sponsor/silver-sponsor.webp similarity index 100% rename from website/static/img/silver sponsor.webp rename to website/static/img/sponsor/silver-sponsor.webp From b2a79e656fd4c507f1a6a6dd2251e85c4f2c31b0 Mon Sep 17 00:00:00 2001 From: Misite Bao Date: Mon, 19 Sep 2022 20:03:30 +0800 Subject: [PATCH 14/62] feat(website): add Chinese translation --- website/docs/guides/obfuscated.mdx | 2 +- .../2021-09-27-v2-beta1-release-notes.mdx | 2 +- .../2022-09-18-v2-release-notes.mdx | 2 +- .../current/community/templates.mdx | 2 +- .../current/gettingstarted/development.mdx | 2 +- .../current/gettingstarted/installation.mdx | 2 +- .../guides/application-development.mdx | 2 +- .../current/guides/bleeding-edge.mdx | 4 +- .../current/guides/dynamic-assets.mdx | 2 +- .../current/guides/obfuscated.mdx | 4 +- .../current/howdoesitwork.mdx | 4 +- .../current/introduction.mdx | 5 +- .../current/reference/cli.mdx | 4 +- .../current/reference/menus.mdx | 8 ++-- .../current/reference/options.mdx | 48 +++++++++---------- .../current/reference/project-config.mdx | 2 +- .../changelog.mdx | 2 +- .../credits.mdx | 36 +++++++------- .../docusaurus-plugin-content-pages/faq.mdx | 6 +-- .../docusaurus-theme-classic/footer.json | 2 +- 20 files changed, 72 insertions(+), 69 deletions(-) diff --git a/website/docs/guides/obfuscated.mdx b/website/docs/guides/obfuscated.mdx index 142a3203d..c062d0f46 100644 --- a/website/docs/guides/obfuscated.mdx +++ b/website/docs/guides/obfuscated.mdx @@ -14,7 +14,7 @@ To customise the obfuscation settings, you can use the `-garbleargs` flag: wails build -obfuscate -garbleargs "-literals -tiny -seed=myrandomseed" ``` -These settings may be persisted in your [project config](/guides/reference/project-config). +These settings may be persisted in your [project config](../reference/project-config). ## How it works diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-blog/2021-09-27-v2-beta1-release-notes.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-blog/2021-09-27-v2-beta1-release-notes.mdx index dc86462b9..1eacc3171 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-blog/2021-09-27-v2-beta1-release-notes.mdx +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-blog/2021-09-27-v2-beta1-release-notes.mdx @@ -145,7 +145,7 @@ Wails v2 代表了该项目的新起点。 此版本的目的是获得有关新 我还需要特别感谢 :pray: 以下人员,因为没有他们,这个版本就不会存在: -- [Misitebao](https://github.com/misitebao) - 中文翻译的主要人员和和令人难以置信的漏洞发现者。 +- [Misite Bao](https://github.com/misitebao) - 中文翻译的主要人员和和令人难以置信的漏洞发现者。 - [John Chadwick](https://github.com/jchv) - 他在 [go-webview2](https://github.com/jchv/go-webview2) 和 [go-winloader](https://github.com/jchv/go-winloader) 方面的出色工作使 Windows 版本成为可能。 - [Tad Vizbaras](https://github.com/tadvi) - 他的[winc](https://github.com/tadvi/winc)项目是走向纯粹的 Go Wails 的第一步。 - [Mat Ryer](https://github.com/matryer) - 他的支持、鼓励和反馈确实推动了项目向前发展。 diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-blog/2022-09-18-v2-release-notes.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-blog/2022-09-18-v2-release-notes.mdx index 61de8b5f6..0129f71aa 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-blog/2022-09-18-v2-release-notes.mdx +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-blog/2022-09-18-v2-release-notes.mdx @@ -21,7 +21,7 @@ tags: # 终于发布了! -今天标志着 [Wails](https://wails.io) v2的发布。 距离发布第一个 v2 alpha 版本大约 18 个月,距离发布第一个 beta 版本大约一年。 我非常感谢参与项目发展的每一个人。 +今天标志着 [Wails](https://wails.io) v2 的发布。 距离发布第一个 v2 alpha 版本大约 18 个月,距离发布第一个 beta 版本大约一年。 我非常感谢参与项目发展的每一个人。 花了这么长时间的部分原因是想要在正式将其称为 v2 之前对其进行一些完整性的定义。 事实是,从来没有一个完美的时间来标记一个版本 - 总是有突出的问题或 “只是一个” 功能要加进去。 然而,标记一个不完美的主要版本的确是为项目的用户提供一些稳定性,并为开发人员提供了一些重置。 diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/community/templates.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/community/templates.mdx index 08126dcea..133fc48b9 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/community/templates.mdx +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/community/templates.mdx @@ -17,7 +17,7 @@ sidebar_position: 1 **Wails 项目不维护也不对第 3 方模板负责** -如果您不确定某个模板,请检查 `package.json`和`wails.json` 中安装的模块和运行的脚本。 +如果您不确定某个模板,请检查 `package.json` 和 `wails.json` 中安装的模块和运行的脚本。 ::: diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/gettingstarted/development.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/gettingstarted/development.mdx index f64a342bd..1343a8a89 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/gettingstarted/development.mdx +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/gettingstarted/development.mdx @@ -8,7 +8,7 @@ sidebar_position: 5 - 构建您的应用程序并运行它 - 将您的 Go 代码绑定到前端,以便可以从 Javascript 调用它 -- 使用 [vite](https://vitejs.dev/) 的强大功能,将监视您的 Go 文件中的修改并在更改时重新构建/重新运行 +- 使用 [Vite](https://vitejs.dev/) 的强大功能,将监视您的 Go 文件中的修改并在更改时重新构建/重新运行 - 启动一个 [网络服务器](http://localhost:34115) 通过浏览器为您的应用程序提供服务。 这使您可以使用自己喜欢的浏览器扩展。你甚至可以从控制台调用你的 Go 代码。 您甚至可以从控制台调用 Go 代码。 首先,在项目目录中运行 `wails dev`。 可以在 [此处](../reference/cli#开发) 找到有关这方面的更多信息。 diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/gettingstarted/installation.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/gettingstarted/installation.mdx index 31702ad32..73cd8bb61 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/gettingstarted/installation.mdx +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/gettingstarted/installation.mdx @@ -20,7 +20,7 @@ Wails 有许多安装前需要的常见依赖项: ### Go -从 [Go 下载页面](https://golang.org/dl/) 下载 Go。 +从 [Go 下载页面](https://go.dev/dl/) 下载 Go。 确保您遵守官方的 [Go 安装说明](https://golang.org/doc/install#install)。 您还需要确保您的 `PATH` 环境变量包含您的 `~/go/bin` 目录路径。 重启终端并执行以下命令检查: diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/application-development.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/application-development.mdx index d8d340cdf..df6ef37db 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/application-development.mdx +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/application-development.mdx @@ -137,7 +137,7 @@ func main() { ## 应用程序菜单 -Wails 支持向您的应用程序添加菜单。 这是通过将 [菜单](../reference/menus#菜单) 结构体传递给应用程序配置来完成的。 常见做法是使用一个返回菜单的方法,更常见的是用作生命周期回调的 `App` 结构体上的方法。 +Wails 支持向您的应用程序添加菜单。 这是通过将 [菜单结构体](../reference/menus#菜单结构体) 传递给应用程序配置来完成的。 常见做法是使用一个返回菜单的方法,更常见的是用作生命周期回调的 `App` 结构体上的方法。 ```go {11} title="main.go" func main() { diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/bleeding-edge.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/bleeding-edge.mdx index 91753a014..2030d04f2 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/bleeding-edge.mdx +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/bleeding-edge.mdx @@ -38,7 +38,7 @@ Wails 一直在开发中,新版本会定期“标记”。 这通常发生在 - `cd v2/cmd/wails` - `go install` -确保如上所述 [更新您的项目](#updating-your-project)。 +确保如上所述 [更新您的项目](#更新您的项目)。 ## 测试 PR @@ -52,4 +52,4 @@ Wails 一直在开发中,新版本会定期“标记”。 这通常发生在 - `cd v2/cmd/wails` - `go install` -确保如上所述 [更新您的项目](#updating-your-project)。 +确保如上所述 [更新您的项目](#更新您的项目)。 diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/dynamic-assets.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/dynamic-assets.mdx index 7233ffaa9..98833d772 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/dynamic-assets.mdx +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/dynamic-assets.mdx @@ -1,6 +1,6 @@ # 动态资产 -如果你想为你的前端动态加载或生成资产,你可以使用 [AssetsHandler](../reference/options#assetshandler) 选项来实现。 AssetsHandler 是一个通用的 `http.Handler`,对于资产服务器上的任何非 GET 请求以及由于找不到文件而无法从捆绑资产提供服务的 GET 请求,都会调用它。 +如果你想为你的前端动态加载或生成资产,你可以使用 [AssetsHandler 选项](../reference/options#资产处理程序) 来实现。 AssetsHandler 是一个通用的 `http.Handler`,对于资产服务器上的任何非 GET 请求以及由于找不到文件而无法从捆绑资产提供服务的 GET 请求,都会调用它。 通过安装自定义 AssetsHandler,您可以使用自定义资产服务器提供您自己的资产。 diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/obfuscated.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/obfuscated.mdx index 39ca036ef..5fc20ca15 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/obfuscated.mdx +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/obfuscated.mdx @@ -14,7 +14,7 @@ wails build -obfuscate wails build -obfuscate -garbleargs "-literals -tiny -seed=myrandomseed" ``` -这些设置可能会保留在您的 [项目配置](/guides/reference/project-config) 中。 +这些设置可能会保留在您的 [项目配置](../reference/project-config) 中。 ## 工作原理 @@ -30,7 +30,7 @@ wails build -obfuscate -garbleargs "-literals -tiny -seed=myrandomseed" ## 示例 -Importing the "Greet" method from the bindings like this: +从绑定中导入“Greet” 方法,如下所示: ```js import { Greet } from "../../wailsjs/go/main/App"; diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/howdoesitwork.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/howdoesitwork.mdx index 1874960e6..b8379e3b6 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/howdoesitwork.mdx +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/howdoesitwork.mdx @@ -96,11 +96,11 @@ var assets embed.FS 在开发模式下使用 `wails dev` 命令,资产从磁盘加载,任何更改都会导致“实时重新加载”。 资产的位置将从 `embed.FS` 推断。 -更多细节可以在 [应用程序开发指南](./guides/application-development) 中找到。 +更多细节可以在 [应用开发指南](./guides/application-development) 中找到。 #### 应用程序生命周期回调 -在即将加载前端 `index.html` 之前,会对 [应用启动回调](./reference/options#应用启动回调) 中提供的函数进行调用。 一个标准的 Go context 被传递给这个方法。 调用运行时需要此 context ,因此标准模式是在此方法中保存对它的引用。 在应用程序关闭之前,以同样的方式调用 [应用退出回调](./reference/options#应用退出回调),并再次使用上下文 当前端加载完 `index.html` 中所有资源时,还有一个 [前端 Dom 加载完成回调](./reference/options#前端-dom-加载完成回调) ,相当于 Javascript 中的 [`body onload`](https://www.w3schools.com/jsref/event_onload.asp) 事件。 还可以通过设置 [关闭应用程序之前回调](./reference/options#关闭应用程序之前回调) 选项来控制窗口关闭(或应用程序退出)事件。 +在即将加载前端 `index.html` 之前,会对 [应用启动回调](./reference/options#应用启动回调) 中提供的函数进行调用。 一个标准的 Go context 被传递给这个方法。 调用运行时需要此 context ,因此标准模式是在此方法中保存对它的引用。 在应用程序关闭之前,以同样的方式调用 [应用退出回调](./reference/options#应用退出回调),并再次使用上下文 当前端加载完 `index.html` 中所有资源时,还有一个 [前端 Dom 加载完成回调](./reference/options#前端-dom-加载完成回调) ,相当于 Javascript 中的 [`body onload`](https://www.w3schools.com/jsref/event_onload.asp) 事件。 还可以通过设置 [应用关闭前回调](./reference/options#应用关闭前回调) 选项来控制窗口关闭(或应用程序退出)事件。 #### 方法绑定 diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/introduction.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/introduction.mdx index 9d12e8dd4..2739372fc 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/introduction.mdx +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/introduction.mdx @@ -26,7 +26,10 @@ Wails 是一个可让您使用 Go 和 Web 技术编写桌面应用的项目。 ```mdx-code-block

- +

``` diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/cli.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/cli.mdx index ef2e5027d..13e69c1a4 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/cli.mdx +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/cli.mdx @@ -72,9 +72,9 @@ Wails CLI 有许多用于管理项目的命令。 所有命令都以此方式运 | -race | 使用 Go 的竞态检测器构建 | false | | -windowsconsole | 保留Windows构建控制台窗口 | false | -有关 `webview2` 标志的详细描述,请参阅 [Windows 系统](../guides/windows) 指南。 +有关 `webview2` 标志的详细描述,请参阅 [Windows 系统指南](../guides/windows)。 -如果您更喜欢使用标准 Go 工具进行构建,请参阅 [手动构建](../guides/manual-builds) 指南。 +如果您更喜欢使用标准 Go 工具进行构建,请参阅 [手动构建指南](../guides/manual-builds)。 示例: diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/menus.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/menus.mdx index 0d1e6c446..17233e8c6 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/menus.mdx +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/menus.mdx @@ -2,9 +2,9 @@ sidebar_position: 4 --- -# 应用菜单 +# 菜单 -可以将应用程序菜单添加到 Wails 项目。 可以通过定义一个 [菜单](#菜单) 结构体并设置 [`Menu`](../reference/options#菜单) 选项或者通过调用运行时方法 [设置应用程序菜单](../reference/runtime/menu#设置应用程序菜单) 来将应用程序菜单添加到 Wails 项目。 +可以将应用程序菜单添加到 Wails 项目。 可以通过定义一个 [菜单结构体](#菜单结构体) 并设置 [`菜单选项`](../reference/options#菜单) 或者通过调用运行时方法 [设置应用程序菜单](../reference/runtime/menu#设置应用程序菜单) 来将应用程序菜单添加到 Wails 项目。 如何创建菜单的示例: @@ -37,7 +37,7 @@ sidebar_position: 4 上面的示例使用辅助方法,但是可以手动构建菜单结构。 -## 菜单 +## 菜单结构体 Menu 是 MenuItem 的集合: @@ -57,7 +57,7 @@ func NewMenuFromItems(first *MenuItem, rest ...*MenuItem) *Menu 这使得代码的布局更像菜单的布局,而无需在创建菜单项后手动添加它们。 或者,您可以只创建菜单项并将它们手动添加到菜单中。 -## 菜单项 +## 菜单项结构体 MenuItem 表示菜单中的一个项目。 diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/options.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/options.mdx index 9222980ca..0f78f89e8 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/options.mdx +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/options.mdx @@ -261,7 +261,7 @@ func main() { 名称:OnShutdown
类型:`func(ctx context.Context)` -### 关闭应用前 +### 应用关闭前回调 如果设置了此回调,它将在通过单击窗口关闭按钮或调用`runtime.Quit`即将退出应用程序时被调用. 返回 `true` 将导致应用程序继续,`false` 将继续正常关闭。 返回 true 将导致应用程序继续,false 将继续正常关闭。 这有助于与用户确认他们希望退出程序。 @@ -288,11 +288,11 @@ func (b *App) beforeClose(ctx context.Context) (prevent bool) { 定义窗口在启动时应如何呈现。 -| 值 | Win | Mac | Lin | -| --------- | --- | --- | --- | -| 全屏 | ✅ | ✅ | ✅ | -| Maximised | ✅ | ✅ | ✅ | -| Minimised | ✅ | ❌ | ✅ | +| 值 | Win | Mac | Lin | +| ---------- | --- | --- | --- | +| Fullscreen | ✅ | ✅ | ✅ | +| Maximised | ✅ | ✅ | ✅ | +| Minimised | ✅ | ❌ | ✅ | 名称:WindowStartState
类型:`options.WindowStartState` @@ -316,7 +316,7 @@ func (b *App) beforeClose(ctx context.Context) (prevent bool) { ### Windows -这定义了 [Windows 特定的选项](#windows-特定选项)。 +这定义了 [Windows 特定的选项](#windows)。 名称:Windows
类型:`*windows.Options` @@ -462,7 +462,7 @@ ResizeDebounceMS 是调整窗口大小时去抖动 webview2 重绘的时间量 ### Mac -这定义了 [Mac 特定的选项](#mac-特定选项)。 +这定义了 [Mac 特定的选项](#mac)。 名称:Mac
类型:`*mac.Options` @@ -470,9 +470,9 @@ ResizeDebounceMS 是调整窗口大小时去抖动 webview2 重绘的时间量 TitleBar 结构提供了配置标题栏外观的能力。 -名称:TitleBar
类型:[`*mac.TitleBar`](#标题栏结构) +名称:TitleBar
类型:[`*mac.TitleBar`](#标题栏结构体) -##### 标题栏结构 +##### 标题栏结构体 可以使用 TitleBar 选项自定义应用程序的标题栏: @@ -487,14 +487,14 @@ type TitleBar struct { } ``` -| 设置 | 描述 | -| -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | -| TitlebarAppearsTransparent | 使标题栏透明。 这具有隐藏标题栏和内容填充窗口的效果。 [苹果文档](https://developer.apple.com/documentation/appkit/nswindow/1419167-titlebarappearstransparent?language=objc) | -| HideTitle | 隐藏窗口的标题。 [苹果文档](https://developer.apple.com/documentation/appkit/nswindowtitlevisibility?language=objc) | -| HideTitleBar | Removes [NSWindowStyleMaskTitled](https://developer.apple.com/documentation/appkit/nswindowstylemask/nswindowstylemasktitled/) from the style mask | -| FullSizeContent | 使 webview 填满整个窗口。 [苹果文档](https://developer.apple.com/documentation/appkit/nswindowstylemask/nswindowstylemaskfullsizecontentview) | -| UseToolbar | 向窗口添加默认工具栏。 [苹果文档](https://developer.apple.com/documentation/appkit/nstoolbar?language=objc) | -| HideToolbarSeparator | 删除工具栏下方的线条。 [苹果文档](https://developer.apple.com/documentation/appkit/nstoolbar/1516954-showsbaselineseparator?language=objc) | +| 设置 | 描述 | +| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | +| TitlebarAppearsTransparent | 使标题栏透明。 这具有隐藏标题栏和内容填充窗口的效果。 [苹果文档](https://developer.apple.com/documentation/appkit/nswindow/1419167-titlebarappearstransparent?language=objc) | +| HideTitle | 隐藏窗口的标题。 [苹果文档](https://developer.apple.com/documentation/appkit/nswindowtitlevisibility?language=objc) | +| HideTitleBar | 从 style mask 中删除 [NSWindowStyleMaskTitled](https://developer.apple.com/documentation/appkit/nswindowstylemask/nswindowstylemasktitled/) | +| FullSizeContent | 使 webview 填满整个窗口。 [苹果文档](https://developer.apple.com/documentation/appkit/nswindowstylemask/nswindowstylemaskfullsizecontentview) | +| UseToolbar | 向窗口添加默认工具栏。 [苹果文档](https://developer.apple.com/documentation/appkit/nstoolbar?language=objc) | +| HideToolbarSeparator | 删除工具栏下方的线条。 [苹果文档](https://developer.apple.com/documentation/appkit/nstoolbar/1516954-showsbaselineseparator?language=objc) | 预配置的标题栏设置可用: @@ -518,7 +518,7 @@ Mac: &mac.Options{ Appearance 用于根据 Apple 的 [NSAppearance](https://developer.apple.com/documentation/appkit/nsappearancename?language=objc) 名称设置您的应用程序的样式。 -名称:Appearance
类型:[`mac.AppearanceType`](#appearance-type) +名称:Appearance
类型:[`mac.AppearanceType`](#外观类型) ##### 外观类型 @@ -545,13 +545,13 @@ Mac: &mac.Options{ #### Webview 透明 -当使用 `alpha` 值 `0` 时,将此设置为 true 将使 webview 背景透明。 这意味着如果您在 CSS 中使用 `rgba(0,0,0,0)` 作为 `background-color`,则主机窗口将显示出来。 通常与 [窗口半透明](#窗口半透明) 结合使用以制作看起来冷冰冰的应用程序。 +当使用 `alpha` 值 `0` 时,将此设置为 true 将使 webview 背景透明。 这意味着如果您在 CSS 中使用 `rgba(0,0,0,0)` 作为 `background-color`,则主机窗口将显示出来。 通常与 [窗口半透明](#窗口半透明-1) 结合使用以制作看起来冷冰冰的应用程序。 名称:WebviewIsTransparent
类型:`bool` #### 窗口半透明 -将此设置为 `true` 将使窗口半透明。 通常与[Webview 透明](#webview-透明) 结合使用以制作冰霜效果的应用程序。 +将此设置为 `true` 将使窗口半透明。 通常与[Webview 透明](#webview-透明-1) 结合使用以制作冰霜效果的应用程序。 名称:WindowIsTranslucent
类型:`bool` @@ -559,9 +559,9 @@ Mac: &mac.Options{ 此配置允许您在“AppMenu”角色创建的应用程序菜单中设置“关于”菜单项的标题、消息和图标。 -名称:About
类型:[`*mac.AboutInfo`](#about-struct) +名称:About
类型:[`*mac.AboutInfo`](#关于结构体) -##### 关于结构 +##### 关于结构体 ```go @@ -634,7 +634,7 @@ func main() { ### Linux -这定义了 [Linux 特定的选项](#linux-特定选项)。 +这定义了 [Linux 特定的选项](#linux)。 名称:Linux
类型:`*linux.Options` diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/project-config.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/project-config.mdx index c7f38d680..a21d26b5d 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/project-config.mdx +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/project-config.mdx @@ -50,4 +50,4 @@ sidebar_position: 5 该文件将在运行 `wails build` 或 `wails dev` 时,由 Wails CLI 读取。 -`wails build/dev` 命令中的 `assetdir`、`reloaddirs`、`wailsjsdir`、`debounceMS`、`devserver`和`frontenddevserverurl`标志将覆盖项目配置并作为后续运行的默认值。 +`wails build/dev` 命令中的 `assetdir`、`reloaddirs`、`wailsjsdir`、`debounceMS`、`devserver` 和 `frontenddevserverurl` 标志将覆盖项目配置并作为后续运行的默认值。 diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-pages/changelog.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-pages/changelog.mdx index b9c60c6fc..0a9c4aab7 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-pages/changelog.mdx +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-pages/changelog.mdx @@ -2,7 +2,7 @@ 此项目的所有重要变更都将记录在此文件中。 -格式基于 [维护更新日志](https://keepachangelog.com/en/1.0.0/), 并且该项目遵循 [语义化版本](https://semver.org/spec/v2.0.0.html)。 +格式基于 [维护更新日志](https://keepachangelog.com/en/1.0.0/),并且该项目遵循 [语义化版本](https://semver.org/spec/v2.0.0.html)。 ## 即将发布 diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-pages/credits.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-pages/credits.mdx index a6042b151..5acb98609 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-pages/credits.mdx +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-pages/credits.mdx @@ -2,7 +2,7 @@ - [Lea Anthony](https://github.com/leaanthony) - 项目所有者,首席开发人员 - [Stffabi](https://github.com/stffabi) - 技术领导、 开发者和维护者 -- [Misitebao](https://github.com/misitebao) - 文档向导,中文翻译,Windows 测试,常规 Bug 发现 +- [Misite Bao](https://github.com/misitebao) - 文档向导,中文翻译,Windows 测试,常规 Bug 发现 - [Travis McLane](https://github.com/tmclane) - 处理交叉编译相关工作, MacOS 平台的测试 - [Byron Chris](https://github.com/bh90210) - Linux 发行版指导,Linux 平台的测试 @@ -11,32 +11,31 @@ dangerouslySetInnerHTML={{ __html: ` - + - +
-
+ - + - - +
-
+ - + @@ -86,28 +85,29 @@ -directory - + - + - + + + + - - + - + - + - + `, }} /> diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-pages/faq.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-pages/faq.mdx index 87b92269e..45661595b 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-pages/faq.mdx +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-pages/faq.mdx @@ -2,8 +2,8 @@ ## 名字是什么意思? -当我看到WebView时,我想“我真正想要的是构建一个WebView 应用,有点像 Rails 对于 Ruby”。 所以它最初是在单词(**W**ebview on R**ails**) 上演变的。 正好这种情况恰巧也是我所来自的 [国家(威尔士)](https://en.wikipedia.org/wiki/Wales) 的英语同音词。 所以它被定下来了。 +当我看到 WebView 时,我想“我真正想要的是构建一个 WebView 应用,有点像 Rails 对于 Ruby”。 所以它最初是在单词 (**W**ebview on R**ails**) 上演变的。 正好这种情况恰巧也是我所来自的 [国家(威尔士)](https://en.wikipedia.org/wiki/Wales) 的英语同音词。 所以它被定下来了。 -## 这是Electron的替代品吗? +## 这是 Electron 的替代品吗? -取决于您的需求。 它的设计是为了使 Go 程序员可以轻松制作轻量级桌面应用程序或在其现有应用程序中添加前端界面。 Wails v2确实提供了诸如菜单和对话框等原生元素,因此它正在成为轻量的Electron替代品。 +取决于您的需求。 它的设计是为了使 Go 程序员可以轻松制作轻量级桌面应用程序或在其现有应用程序中添加前端界面。 Wails v2 确实提供了诸如菜单和对话框等原生元素,因此它正在成为轻量的 Electron 替代品。 diff --git a/website/i18n/zh-Hans/docusaurus-theme-classic/footer.json b/website/i18n/zh-Hans/docusaurus-theme-classic/footer.json index ebe9a7ad0..7898b8c6a 100644 --- a/website/i18n/zh-Hans/docusaurus-theme-classic/footer.json +++ b/website/i18n/zh-Hans/docusaurus-theme-classic/footer.json @@ -28,7 +28,7 @@ "description": "The label of footer link with label=Github linking to https://github.com/wailsapp/wails" }, "link.item.label.Twitter": { - "message": "Twitter(推特)", + "message": "Twitter", "description": "The label of footer link with label=Twitter linking to https://twitter.com/wailsapp" }, "link.item.label.Slack": { From 662a406e85e522a1939e47f283173380c4240f29 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Mon, 19 Sep 2022 20:44:36 +1000 Subject: [PATCH 15/62] 2 column --- website/src/css/carousel.css | 12 ++- website/src/css/custom.css | 32 ++++++- website/src/pages/index.js | 129 +++++++++++++++-------------- website/src/pages/index.module.css | 3 +- 4 files changed, 106 insertions(+), 70 deletions(-) diff --git a/website/src/css/carousel.css b/website/src/css/carousel.css index a38286316..007d08aa8 100644 --- a/website/src/css/carousel.css +++ b/website/src/css/carousel.css @@ -58,7 +58,7 @@ .carousel-root { outline: none; - max-width: 1024px; + max-width: 800px; } .carousel { @@ -307,8 +307,16 @@ .carousel-root { padding-bottom: 5px; } + .carousel .slider-wrapper { - width: 75%; + width: 90%; + } +} + +@media screen and (max-width: 1920px) { + .carousel-root { + padding-left: 0; + max-width: 800px; } } diff --git a/website/src/css/custom.css b/website/src/css/custom.css index 134e1a800..f0a628d6d 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -45,16 +45,40 @@ html[data-theme="light"] .button--secondary { counter-reset: line-number; } +.container { + display: flex; + flex-direction: row; + flex-wrap: wrap; + align-items: center; + max-width: none; + padding: 2rem; +} + +.col { + display: inline-flex; + width: 50%; + align-content: flex-end; + flex-direction: column; + justify-content: space-evenly; +} + +.hero { + height: 500px; +} + .carousel-root { padding-left: 2%; - max-width: 1400px; - width: 85%; + max-width: 600px; + width: 100%; margin: 0 auto; } +.heroBanner_src-pages-index-module { + padding-top: 3rem; +} + @media screen and (max-width: 576px) { .carousel-root { - padding-left: 2%; width: 100%; } } @@ -63,7 +87,7 @@ html[data-theme="light"] .button--secondary { @media screen and (max-width: 966px) { .carousel-root { padding-left: 2%; - width: 90%; + max-width: 50%; } } diff --git a/website/src/pages/index.js b/website/src/pages/index.js index 832b7d64e..cfc798dd1 100644 --- a/website/src/pages/index.js +++ b/website/src/pages/index.js @@ -13,74 +13,79 @@ var Carousel = require("react-responsive-carousel").Carousel; function HomepageHeader() { const {siteConfig} = useDocusaurusContext(); return ( -
-
- +
+
+
+ -
- + > +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
-
- +
+

+ {translate({id: "homepage.Tagline"})} +

+
+ + {translate({id: "homepage.LearnMoreButtonText"})} + + + {translate({id: "homepage.ButtonText"})} + +
-
- -
-
- -
-
- -
-
- -
-
- -
- - -

- {translate({id: "homepage.Tagline"})} -

-
- - {translate({id: "homepage.LearnMoreButtonText"})} - - - {translate({id: "homepage.ButtonText"})} -
-
-
-

- Wails v2 turns what used to be tedious and painful into a delightfully simple process. - Use the tools you know to create cross-platform desktop apps. Everyone wins! -

-

— Brian Ketelsen
Co-author - of "Go In Action"

-
+
+
+
+

+ Wails v2 turns what used to be tedious and painful into a delightfully simple process. + Use the tools you know to create cross-platform desktop apps. Everyone wins! +

+

— Brian Ketelsen
Co-author + of "Go In Action"

-
+
); } diff --git a/website/src/pages/index.module.css b/website/src/pages/index.module.css index 089b78d12..24de49da7 100644 --- a/website/src/pages/index.module.css +++ b/website/src/pages/index.module.css @@ -4,11 +4,10 @@ */ .heroBanner { - padding: 1rem 0; text-align: center; position: relative; overflow: hidden; - padding-bottom: 35px; + padding: 1rem 0 35px; } @media screen and (max-width: 966px) { From 2a3cd47d0c3b8878e650cb3d19c33d5ddba067b9 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Tue, 20 Sep 2022 07:11:39 +1000 Subject: [PATCH 16/62] Fix 2 column layout, quote and footer --- .../components/HomepageFeatures.module.css | 1 + website/src/css/custom.css | 146 ++++++++---------- website/src/pages/index.js | 18 +-- website/src/pages/index.module.css | 2 +- 4 files changed, 71 insertions(+), 96 deletions(-) diff --git a/website/src/components/HomepageFeatures.module.css b/website/src/components/HomepageFeatures.module.css index 509d8c757..18db58f06 100644 --- a/website/src/components/HomepageFeatures.module.css +++ b/website/src/components/HomepageFeatures.module.css @@ -9,3 +9,4 @@ height: 200px; width: 200px; } + diff --git a/website/src/css/custom.css b/website/src/css/custom.css index f0a628d6d..2c62e3099 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -45,15 +45,38 @@ html[data-theme="light"] .button--secondary { counter-reset: line-number; } + .container { display: flex; - flex-direction: row; + flex-direction: row-reverse; flex-wrap: wrap; align-items: center; - max-width: none; padding: 2rem; + max-width: 100rem; } +.footer .container { + display: flex; + margin: 0 auto; + text-align: center; + max-width: var(--ifm-container-width); + padding: 0 var(--ifm-spacing-horizontal); + width: 100%; + justify-content: center; + flex-direction: row; +} + + +.footer .container .row { + display: flex; + justify-content: space-evenly; + flex-direction: row; + width: 100%; + align-content: stretch; + align-items: flex-start; +} + + .col { display: inline-flex; width: 50%; @@ -63,7 +86,7 @@ html[data-theme="light"] .button--secondary { } .hero { - height: 500px; + background-color: var(--ifm-background-color); } .carousel-root { @@ -122,70 +145,7 @@ html[data-theme="light"] .button--secondary { font-size: 1.5rem; } -/* Blockquote inspired by https://codepen.io/jupago/pen/GPxqLX. -Copyright (c) 2022 by Juan Pablo (https://codepen.io/jupago/pen/GPxqLX) -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ -.blockquote-wrapper { - display: flex; - padding: 0 20px; -} - -.blockquote { - position: relative; - max-width: 95%; - margin: 4rem auto; - align-self: center; -} - -.blockquote h1 { - position: relative; - font-size: 1.5rem; - font-weight: normal; - line-height: 1; - margin: 0; - border: solid 2px; - border-radius: 10px; - padding: 25px; -} - -.blockquote h1:after { - content: ""; - color: var(--ifm-heading-color); - position: absolute; - border: 2px solid var(--ifm-hero-text-color); - border-radius: 0 50px 0 0; - width: 60px; - height: 60px; - bottom: -62px; - left: 50px; - border-bottom: none; - border-left: none; - z-index: 3; -} - -.blockquote h1:before { - content: ""; - position: absolute; - width: 80px; - border: 6px solid var(--ifm-hero-background-color); - bottom: -3px; - left: 50px; - z-index: 2; -} - @media all and (min-width: 600px) { - .blockquote h1 { - font-size: 1.45rem; - line-height: 1.2; - } - - .blockquote { - max-width: 75%; - } - .hero__subtitle { margin-top: 2rem; font-size: 1.65rem; @@ -193,33 +153,49 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI } @media all and (min-width: 1024px) { - .blockquote h1 { - font-size: 1.45rem; - line-height: 1.2; - } - - .blockquote { - max-width: 50%; - } - .hero__subtitle { margin-top: 2rem; font-size: 1.75rem; } } -.blockquote h4 { +blockquote { + display: block; + width: 80%; + max-width: 75rem; position: relative; - font-size: 1.3rem; - font-weight: 400; - line-height: 1.2; - padding-top: 15px; - z-index: 1; - margin: 0 0 0 150px; - padding-left: 12px; + padding: 0 5px; + margin: 0 auto 4rem; +} + +blockquote:before, blockquote:after { + content: "“"; + font-size: 70px; + font-family: "Georgia", Serif; + color: var(--ifm-link-color);; + position: absolute; + left: -30px; + top: 5px; +} + +blockquote:after { + content: "”"; + right: -30px; + left: auto; +} + +blockquote h4 { + position: absolute; + right: -30px; + padding-right: 1rem; + left: auto; } -.blockquote h4:first-letter { - margin-left: -12px; +cite { + float: right; + color: black; + font-size: 12px; + margin: 0; + padding: 0; } \ No newline at end of file diff --git a/website/src/pages/index.js b/website/src/pages/index.js index cfc798dd1..0695d04a0 100644 --- a/website/src/pages/index.js +++ b/website/src/pages/index.js @@ -75,16 +75,14 @@ function HomepageHeader() {

- +

-
-
-

- Wails v2 turns what used to be tedious and painful into a delightfully simple process. - Use the tools you know to create cross-platform desktop apps. Everyone wins! -

-

— Brian Ketelsen
Co-author - of "Go In Action"

-
-
+
+

+ Wails v2 turns what used to be tedious and painful into a delightfully simple process. + Use the tools you know to create cross-platform desktop apps. Everyone wins! +

+

— Brian Ketelsen
Co-author + of "Go In Action"

+
); } diff --git a/website/src/pages/index.module.css b/website/src/pages/index.module.css index 24de49da7..ba3a6755c 100644 --- a/website/src/pages/index.module.css +++ b/website/src/pages/index.module.css @@ -7,7 +7,7 @@ text-align: center; position: relative; overflow: hidden; - padding: 1rem 0 35px; + padding: 1rem 0 5px; } @media screen and (max-width: 966px) { From c4964d6f46c0d41de6e41ee1840127969599c91c Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Tue, 20 Sep 2022 07:32:48 +1000 Subject: [PATCH 17/62] Fix features spacing + blockqoute spacing --- website/src/css/custom.css | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/website/src/css/custom.css b/website/src/css/custom.css index 2c62e3099..52982a9d8 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -107,6 +107,26 @@ html[data-theme="light"] .button--secondary { } +.features_src-components-HomepageFeatures-module { + display: flex; + align-items: center; + padding: 1rem 0; + width: 100%; + background-color: var(--ifm-card-background-color); +} + + +.features_src-components-HomepageFeatures-module .container { + padding: 1rem 3rem 0; +} + + +.features_src-components-HomepageFeatures-module .container .row { + display: flex; + align-items: baseline; +} + + @media screen and (max-width: 966px) { .carousel-root { padding-left: 2%; @@ -165,14 +185,14 @@ blockquote { max-width: 75rem; position: relative; padding: 0 5px; - margin: 0 auto 4rem; + margin: 0 auto 7rem; } blockquote:before, blockquote:after { content: "“"; font-size: 70px; - font-family: "Georgia", Serif; - color: var(--ifm-link-color);; + font-family: "Georgia", serif; + color: var(--ifm-link-color); position: absolute; left: -30px; top: 5px; From 32af38875f4bc2437db2670e74d461aa23c927d6 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Tue, 20 Sep 2022 07:36:25 +1000 Subject: [PATCH 18/62] Remove "Built with docusaurus" text --- website/docusaurus.config.js | 2 +- website/i18n/en/docusaurus-theme-classic/footer.json | 2 +- website/i18n/ja/docusaurus-theme-classic/footer.json | 2 +- website/i18n/ko/docusaurus-theme-classic/footer.json | 2 +- website/i18n/ru/docusaurus-theme-classic/footer.json | 2 +- website/i18n/zh-Hans/docusaurus-theme-classic/footer.json | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index 3030e0bcb..ee98cc8d8 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -217,7 +217,7 @@ const config = { ], }, ], - copyright: `Copyright © ${new Date().getFullYear()} Lea Anthony. Built with Docusaurus.`, + copyright: `Copyright © ${new Date().getFullYear()} Lea Anthony`, }, tableOfContents: { minHeadingLevel: 2, diff --git a/website/i18n/en/docusaurus-theme-classic/footer.json b/website/i18n/en/docusaurus-theme-classic/footer.json index bc52f458e..e29b42373 100644 --- a/website/i18n/en/docusaurus-theme-classic/footer.json +++ b/website/i18n/en/docusaurus-theme-classic/footer.json @@ -44,7 +44,7 @@ "description": "The label of footer link with label=Blog linking to /blog" }, "copyright": { - "message": "Copyright © 2022 Lea Anthony. Built with Docusaurus.", + "message": "Copyright © 2022 Lea Anthony", "description": "The footer copyright" }, "link.item.label.Awesome": { diff --git a/website/i18n/ja/docusaurus-theme-classic/footer.json b/website/i18n/ja/docusaurus-theme-classic/footer.json index 284c95e8d..22c9a2f88 100644 --- a/website/i18n/ja/docusaurus-theme-classic/footer.json +++ b/website/i18n/ja/docusaurus-theme-classic/footer.json @@ -44,7 +44,7 @@ "description": "The label of footer link with label=Blog linking to /blog" }, "copyright": { - "message": "Copyright © 2022 Lea Anthony. このサイトはDocusaurusで生成されました。", + "message": "Copyright © 2022 Lea Anthony", "description": "The footer copyright" }, "link.item.label.Awesome": { diff --git a/website/i18n/ko/docusaurus-theme-classic/footer.json b/website/i18n/ko/docusaurus-theme-classic/footer.json index 922a0531a..5fca1ae99 100644 --- a/website/i18n/ko/docusaurus-theme-classic/footer.json +++ b/website/i18n/ko/docusaurus-theme-classic/footer.json @@ -44,7 +44,7 @@ "description": "The label of footer link with label=Blog linking to /blog" }, "copyright": { - "message": "Copyright © 2022 Lea Anthony. Built with Docusaurus.", + "message": "Copyright © 2022 Lea Anthony", "description": "The footer copyright" }, "link.item.label.Awesome": { diff --git a/website/i18n/ru/docusaurus-theme-classic/footer.json b/website/i18n/ru/docusaurus-theme-classic/footer.json index bc52f458e..e29b42373 100644 --- a/website/i18n/ru/docusaurus-theme-classic/footer.json +++ b/website/i18n/ru/docusaurus-theme-classic/footer.json @@ -44,7 +44,7 @@ "description": "The label of footer link with label=Blog linking to /blog" }, "copyright": { - "message": "Copyright © 2022 Lea Anthony. Built with Docusaurus.", + "message": "Copyright © 2022 Lea Anthony", "description": "The footer copyright" }, "link.item.label.Awesome": { diff --git a/website/i18n/zh-Hans/docusaurus-theme-classic/footer.json b/website/i18n/zh-Hans/docusaurus-theme-classic/footer.json index 7898b8c6a..c13664373 100644 --- a/website/i18n/zh-Hans/docusaurus-theme-classic/footer.json +++ b/website/i18n/zh-Hans/docusaurus-theme-classic/footer.json @@ -44,7 +44,7 @@ "description": "The label of footer link with label=Blog linking to /blog" }, "copyright": { - "message": "Copyright © 2022 Lea Anthony. Built with Docusaurus.", + "message": "Copyright © 2022 Lea Anthony", "description": "The footer copyright" }, "link.item.label.Awesome": { From e323b04bb21fe312de9758092a7a02f00ac985f6 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Tue, 20 Sep 2022 07:44:04 +1000 Subject: [PATCH 19/62] Make frontpage container rules more specific --- website/src/css/custom.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/src/css/custom.css b/website/src/css/custom.css index 52982a9d8..a0d87d212 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -46,7 +46,7 @@ html[data-theme="light"] .button--secondary { } -.container { +.hero .container { display: flex; flex-direction: row-reverse; flex-wrap: wrap; From 23593b3c4d7017831a1b6c68686bfe1c14699f3c Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Tue, 20 Sep 2022 07:48:02 +1000 Subject: [PATCH 20/62] Fix bullet-points of community guide --- website/src/pages/community-guide.mdx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/website/src/pages/community-guide.mdx b/website/src/pages/community-guide.mdx index 62e18c71c..9f8e3b3a8 100644 --- a/website/src/pages/community-guide.mdx +++ b/website/src/pages/community-guide.mdx @@ -49,12 +49,12 @@ The process for adding new features are as follows: - Pick an enhancement ticket with the "TODO" label. It's preferable to select one from the current [Backlog](https://github.com/orgs/wailsapp/projects/1/views/1) but the choice is yours. - Before developing, check that the ticket includes the following information: -- The purpose of the enhancement -- What is out of scope for the enhancement -- What platforms the enhancement targets (most features should be cross-platform unless there's a very specific reason) + - The purpose of the enhancement + - What is out of scope for the enhancement + - What platforms the enhancement targets (most features should be cross-platform unless there's a very specific reason) - If the ticket does not include this information, feel free to request the information from the person who opened the ticket. Sometimes placeholder tickets are created and require more details -- Comment on the ticket stating you wish to develop the feature +- Comment on the ticket stating if you wish to develop the feature - Clone the repository and create a branch with the format `feature/_` - New features often require documentation so please ensure you have also added or updated the documentation as part of the changes @@ -64,8 +64,8 @@ The process for adding new features are as follows: :::note There is nothing stopping you from opening a ticket and working on it yourself, but please be aware that all -enhancement requests are reviewed for good fit. Not all ideas will be selected so it's best to have discussion -on the ticket first. +enhancement requests are reviewed for good fit. Not all ideas will be selected, so it's best to have discussion +about the enhancement first. ::: :::warning From 2661eca2cc25b887ac0b04c19be5a4b582ab10de Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Tue, 20 Sep 2022 09:49:13 +1000 Subject: [PATCH 21/62] Rename TranslucencyType -> BackdropType. Rename BackdropType consts. Add documentation for this option. --- .../frontend/desktop/windows/win32/theme.go | 23 ++++++++------ .../frontend/desktop/windows/window.go | 5 ++- v2/pkg/options/windows/windows.go | 14 ++++----- website/docs/reference/options.mdx | 31 ++++++++++++++++++- 4 files changed, 52 insertions(+), 21 deletions(-) diff --git a/v2/internal/frontend/desktop/windows/win32/theme.go b/v2/internal/frontend/desktop/windows/win32/theme.go index 89aa9fc74..2effae5ad 100644 --- a/v2/internal/frontend/desktop/windows/win32/theme.go +++ b/v2/internal/frontend/desktop/windows/win32/theme.go @@ -17,14 +17,9 @@ const DwmwaSystemBackdropType DWMWINDOWATTRIBUTE = 38 const SPI_GETHIGHCONTRAST = 0x0042 const HCF_HIGHCONTRASTON = 0x00000001 +// BackdropType defines the type of translucency we wish to use type BackdropType int32 -const DwmsbtAuto BackdropType = 0 -const DwmsbtDisable = 1 // None -const DwmsbtMainWindow = 2 // Mica -const DwmsbtTransientWindow = 3 // Acrylic -const DwmsbtTabbedWindow = 4 // Tabbed - func dwmSetWindowAttribute(hwnd uintptr, dwAttribute DWMWINDOWATTRIBUTE, pvAttribute unsafe.Pointer, cbAttribute uintptr) { ret, _, err := procDwmSetWindowAttribute.Call( hwnd, @@ -46,10 +41,18 @@ func SupportsCustomThemes() bool { return IsWindowsVersionAtLeast(10, 0, 17763) } +func SupportsBackdropTypes() bool { + return IsWindowsVersionAtLeast(10, 0, 22621) +} + +func SupportsImmersiveDarkMode() bool { + return IsWindowsVersionAtLeast(10, 0, 18985) +} + func SetTheme(hwnd uintptr, useDarkMode bool) { - if IsWindowsVersionAtLeast(10, 0, 17763) { + if SupportsThemes() { attr := DwmwaUseImmersiveDarkModeBefore20h1 - if IsWindowsVersionAtLeast(10, 0, 18985) { + if SupportsImmersiveDarkMode() { attr = DwmwaUseImmersiveDarkMode } var winDark int32 @@ -61,10 +64,10 @@ func SetTheme(hwnd uintptr, useDarkMode bool) { } func EnableTranslucency(hwnd uintptr, backdrop BackdropType) { - if IsWindowsVersionAtLeast(10, 0, 22579) { + if SupportsBackdropTypes() { dwmSetWindowAttribute(hwnd, DwmwaSystemBackdropType, unsafe.Pointer(&backdrop), unsafe.Sizeof(backdrop)) } else { - println("Warning: Translucency unavailable on Windows < 22579") + println("Warning: Translucency type unavailable on Windows < 22621") } } diff --git a/v2/internal/frontend/desktop/windows/window.go b/v2/internal/frontend/desktop/windows/window.go index 0d12df60c..1b511d34f 100644 --- a/v2/internal/frontend/desktop/windows/window.go +++ b/v2/internal/frontend/desktop/windows/window.go @@ -105,11 +105,10 @@ func NewWindow(parent winc.Controller, appoptions *options.App, versionInfo *ope result.OnSuspend = appoptions.Windows.OnSuspend result.OnResume = appoptions.Windows.OnResume if appoptions.Windows.WindowIsTranslucent { - // TODO: Migrate to win32 package - if !win32.IsWindowsVersionAtLeast(10, 0, 22579) { + if !win32.SupportsBackdropTypes() { result.SetTranslucentBackground() } else { - win32.EnableTranslucency(result.Handle(), win32.BackdropType(appoptions.Windows.TranslucencyType)) + win32.EnableTranslucency(result.Handle(), win32.BackdropType(appoptions.Windows.BackdropType)) } } diff --git a/v2/pkg/options/windows/windows.go b/v2/pkg/options/windows/windows.go index 5c18d1737..95c446fd9 100644 --- a/v2/pkg/options/windows/windows.go +++ b/v2/pkg/options/windows/windows.go @@ -27,11 +27,11 @@ const ( type BackdropType int32 const ( - Auto BackdropType = 0 - Disable BackdropType = 1 // None - MainWindow BackdropType = 2 // Mica - TransientWindow BackdropType = 3 // Acrylic - TabbedWindow BackdropType = 4 // Tabbed + Auto BackdropType = 0 + None BackdropType = 1 + Mica BackdropType = 2 + Acrylic BackdropType = 3 + Tabbed BackdropType = 4 ) func RGB(r, g, b uint8) int32 { @@ -81,8 +81,8 @@ type Options struct { // Custom settings for dark/light mode CustomTheme *ThemeSettings - // Windows 11 22579 minimum - TranslucencyType BackdropType + // Select the type of translucent backdrop. Requires Windows 11 22621 or later. + BackdropType BackdropType // User messages that can be customised Messages *Messages diff --git a/website/docs/reference/options.mdx b/website/docs/reference/options.mdx index 0470aaf8d..d2d018c28 100644 --- a/website/docs/reference/options.mdx +++ b/website/docs/reference/options.mdx @@ -48,6 +48,7 @@ func main() { Windows: &windows.Options{ WebviewIsTransparent: false, WindowIsTranslucent: false, + BackdropType: windows.Mica, DisableWindowIcon: false, DisableFramelessWindowDecorations: false, WebviewUserDataPath: "", @@ -381,11 +382,39 @@ Type: `bool` #### WindowIsTranslucent Setting this to `true` will make the window background translucent. Often combined -with [WebviewIsTransparent](#WebviewIsTransparent) to make frosty-looking applications. +with [WebviewIsTransparent](#WebviewIsTransparent). + +For Windows 11 versions before build 22621, this will use the [BlurBehind](https://learn.microsoft.com/en-us/windows/win32/dwm/blur-ovw) +method for translucency, which can be slow. For Windows 11 versions after build 22621, this will enable the +newer translucency types that are much faster. By default, the type of translucency used will be determined +by Windows. To configure this, use the [BackdropType](#BackdropType) option. Name: WindowIsTranslucent
Type: `bool` +#### BackdropType + +:::note + +Requires Windows 11 build 22621 or later. + +::: + +Sets the translucency type of the window. This is only applicable if [WindowIsTranslucent](#WindowIsTranslucent) is set to `true`. + +Name: BackdropType +Type `windows.BackdropType` + +The Type can be one of the following: + +| Value | Description | +|---------|-------------------------------------------------------------------------------------------| +| Auto | Let Windows decide which backdrop to use | +| None | Do not use translucency | +| Acrylic | Use [Acrylic](https://learn.microsoft.com/en-us/windows/apps/design/style/acrylic) effect | +| Mica | Use [Mica](https://learn.microsoft.com/en-us/windows/apps/design/style/mica) effect | +| Tabbed | Use Tabbed. This is a backdrop that is similar to Mica. | + #### DisableWindowIcon Setting this to `true` will remove the icon in the top left corner of the title bar. From 01ea9496e723bebe0f61feb07ba1834ff97e8c6c Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Tue, 20 Sep 2022 09:57:24 +1000 Subject: [PATCH 22/62] Fix RHS page navigation. Add OnSuspend and OnResume to options example. --- website/docs/reference/options.mdx | 12 ++++++++---- website/src/css/custom.css | 8 ++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/website/docs/reference/options.mdx b/website/docs/reference/options.mdx index d2d018c28..72cc5f358 100644 --- a/website/docs/reference/options.mdx +++ b/website/docs/reference/options.mdx @@ -64,6 +64,10 @@ func main() { }, // User messages that can be customised Messages *windows.Messages + // OnSuspend is called when Windows enters low power mode + OnSuspend func() + // OnResume is called when Windows resumes from low power mode + OnResume func() }, Mac: &mac.Options{ TitleBar: &mac.TitleBar{ @@ -402,10 +406,10 @@ Requires Windows 11 build 22621 or later. Sets the translucency type of the window. This is only applicable if [WindowIsTranslucent](#WindowIsTranslucent) is set to `true`. -Name: BackdropType +Name: BackdropType
Type `windows.BackdropType` -The Type can be one of the following: +The value can be one of the following: | Value | Description | |---------|-------------------------------------------------------------------------------------------| @@ -544,14 +548,14 @@ Type: `uint16` #### OnSuspend -If set, this function will be called when windows initiates a switch to low power mode (suspend/hibernate) +If set, this function will be called when Windows initiates a switch to low power mode (suspend/hibernate) Name: OnSuspend
Type: `func()` #### OnResume -If set, this function will be called when windows resumes from low power mode (suspend/hibernate) +If set, this function will be called when Windows resumes from low power mode (suspend/hibernate) Name: OnResume
Type: `func()` diff --git a/website/src/css/custom.css b/website/src/css/custom.css index a0d87d212..968bd8324 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -218,4 +218,12 @@ cite { font-size: 12px; margin: 0; padding: 0; +} + +.docMainContainer_node_modules-\@docusaurus-theme-classic-lib-theme-DocPage-Layout-Main-styles-module .container .row .col { + display: inline-flex; + width: 50%; + align-content: flex-end; + flex-direction: column; + justify-content: flex-start; } \ No newline at end of file From 6805b5a3e9871d502e3c07f1315b75168e54cd85 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Tue, 20 Sep 2022 10:29:27 +1000 Subject: [PATCH 23/62] Fix LHS blog navigation. Updated blog. Add missing garble flags in CLI doc --- website/blog/2022-09-18-v2-release-notes.mdx | 17 ++++++++++------- website/docs/reference/cli.mdx | 6 ++++-- website/src/css/custom.css | 9 +++++++++ 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/website/blog/2022-09-18-v2-release-notes.mdx b/website/blog/2022-09-18-v2-release-notes.mdx index 0f7f71ff8..c961a66ab 100644 --- a/website/blog/2022-09-18-v2-release-notes.mdx +++ b/website/blog/2022-09-18-v2-release-notes.mdx @@ -30,20 +30,21 @@ If you are unfamiliar with Wails, it is a project that enables Go programmers to # 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 read any of the blog posts on the Beta releases, then you should be across most of the changes but to summarise: +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 menus and dialogs. -- Native window translucency effects. +- Native application [menus](/docs/guides/application-development#application-menu) and [dialogs](/docs/reference/runtime/dialog). +- Native window translucency effects for [Windows](/docs/reference/options#windowistranslucent) and [macOS](/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 your application using [garble](https://github.com/burrowers/garble). +- Support for [obfuscating](/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. +- Automatic Typescript generation of Go structs. More info [here](/docs/next/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. @@ -69,7 +70,7 @@ In the course of developing v2, there were many features and bug fixes that were ## 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 +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 @@ -85,10 +86,12 @@ A final point I'd like to raise is that of feature parity. It has long been a co # 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. Quality applications like [Varly](https://varly.app/), [Surge](https://getsurge.io/) and [October](https://october.utf9k.net/). I encourage you to check them out. +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! diff --git a/website/docs/reference/cli.mdx b/website/docs/reference/cli.mdx index 0e0687c53..7f5b33514 100644 --- a/website/docs/reference/cli.mdx +++ b/website/docs/reference/cli.mdx @@ -53,7 +53,7 @@ If you are unsure about a template, inspect `package.json` and `wails.json` for `wails build` is used for compiling your project to a production-ready binary. | Flag | Description | Default | -| :------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------- | +|:---------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------| | -platform | Build for the given (comma delimited) [platforms](../reference/cli.mdx#platforms) eg. `windows/arm64`. Note, if you do not give the architecture, `runtime.GOARCH` is used. | platform = `GOOS` environment variable if given else `runtime.GOOS`.
arch = `GOARCH` envrionment variable if given else `runtime.GOARCH`. | | -clean | Cleans the `build/bin` directory | | | -compiler "compiler" | Use a different go compiler to build, eg go1.15beta1 | go | @@ -71,7 +71,9 @@ If you are unsure about a template, inspect `package.json` and `wails.json` for | -debug | Retains debug information in the application. Allows the use of the devtools in the application window | false | | -trimpath | Remove all file system paths from the resulting executable. | false | | -race | Build with Go's race detector | false | -| -windowsconsole | Keep the console window for Windows builds | false | +| -windowsconsole | Keep the console window for Windows builds | | +| -obfuscate | Obfuscate the application using [garble](https://github.com/burrowers/garble) | false | +| -garbleargs | Arguments to pass to garble | `-literals -tiny -seed=random` | For a detailed description of the `webview2` flag, please refer to the [Windows](../guides/windows.mdx) Guide. diff --git a/website/src/css/custom.css b/website/src/css/custom.css index 968bd8324..5e45fb88c 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -226,4 +226,13 @@ cite { align-content: flex-end; flex-direction: column; justify-content: flex-start; +} + + +.main-wrapper .container .row .col { + display: inline-flex; + width: 50%; + align-content: flex-end; + flex-direction: column; + justify-content: flex-start; } \ No newline at end of file From b370e0e7f0f6aa3b275814e425d847b719087401 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Tue, 20 Sep 2022 17:05:23 +1000 Subject: [PATCH 24/62] Better mobile experience --- website/src/css/custom.css | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/website/src/css/custom.css b/website/src/css/custom.css index 5e45fb88c..ec4e18f73 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -128,9 +128,16 @@ html[data-theme="light"] .button--secondary { @media screen and (max-width: 966px) { + .hero .container { + padding: .5rem; + } + + .hero .container .col .hero__subtitle { + font-size: 1.2rem; + } + .carousel-root { - padding-left: 2%; - max-width: 50%; + max-width: 75%; } } From ba3e697a00f2fa321acc7a6835949be95d22e6e0 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Tue, 20 Sep 2022 17:25:55 +1000 Subject: [PATCH 25/62] Better mobile experience 2 --- website/src/css/custom.css | 11 ++++++++++- website/src/pages/index.module.css | 6 ++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/website/src/css/custom.css b/website/src/css/custom.css index ec4e18f73..81971876b 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -64,6 +64,7 @@ html[data-theme="light"] .button--secondary { width: 100%; justify-content: center; flex-direction: row; + flex-wrap: wrap; } @@ -76,6 +77,15 @@ html[data-theme="light"] .button--secondary { align-items: flex-start; } +.footer .container .footer__bottom { + display: flex; + justify-content: center; + flex-direction: column; + width: 100%; + align-content: center; + flex-wrap: wrap; +} + .col { display: inline-flex; @@ -126,7 +136,6 @@ html[data-theme="light"] .button--secondary { align-items: baseline; } - @media screen and (max-width: 966px) { .hero .container { padding: .5rem; diff --git a/website/src/pages/index.module.css b/website/src/pages/index.module.css index ba3a6755c..2609cd4a9 100644 --- a/website/src/pages/index.module.css +++ b/website/src/pages/index.module.css @@ -16,6 +16,12 @@ } } +@media screen and (max-width: 433px) { + .heroBanner { + padding: 1rem 0 1rem; + } +} + .buttons { column-gap: 2rem; display: flex; From 7a59bdd09bdabf6fe24ee777d9058b2754e81425 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Tue, 20 Sep 2022 17:41:11 +1000 Subject: [PATCH 26/62] More CSS changes --- website/src/css/carousel.css | 3 ++- website/src/css/custom.css | 7 ------- website/src/pages/index.module.css | 16 ++++------------ 3 files changed, 6 insertions(+), 20 deletions(-) diff --git a/website/src/css/carousel.css b/website/src/css/carousel.css index 007d08aa8..dc8b26ca1 100644 --- a/website/src/css/carousel.css +++ b/website/src/css/carousel.css @@ -323,6 +323,7 @@ @media screen and (max-width: 966px) { .carousel-root { padding-left: 0; - width: 100%; + max-width: 65%; + min-width: 200px; } } \ No newline at end of file diff --git a/website/src/css/custom.css b/website/src/css/custom.css index 81971876b..3a24beb71 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -110,13 +110,6 @@ html[data-theme="light"] .button--secondary { padding-top: 3rem; } -@media screen and (max-width: 576px) { - .carousel-root { - width: 100%; - } -} - - .features_src-components-HomepageFeatures-module { display: flex; align-items: center; diff --git a/website/src/pages/index.module.css b/website/src/pages/index.module.css index 2609cd4a9..9312008c8 100644 --- a/website/src/pages/index.module.css +++ b/website/src/pages/index.module.css @@ -10,18 +10,6 @@ padding: 1rem 0 5px; } -@media screen and (max-width: 966px) { - .heroBanner { - padding: 2rem; - } -} - -@media screen and (max-width: 433px) { - .heroBanner { - padding: 1rem 0 1rem; - } -} - .buttons { column-gap: 2rem; display: flex; @@ -37,4 +25,8 @@ flex-direction: column; row-gap: 1rem; } + + .heroBanner { + padding: 1rem 0 1rem; + } } \ No newline at end of file From 7254c575d67bed3c75caa570231d5084a25dee07 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Tue, 20 Sep 2022 18:20:53 +1000 Subject: [PATCH 27/62] More CSS changes --- website/src/css/carousel.css | 31 ++++++++++++++++++++++++++++++ website/src/css/custom.css | 19 +++--------------- website/src/pages/index.module.css | 1 + 3 files changed, 35 insertions(+), 16 deletions(-) diff --git a/website/src/css/carousel.css b/website/src/css/carousel.css index dc8b26ca1..91a93cd7f 100644 --- a/website/src/css/carousel.css +++ b/website/src/css/carousel.css @@ -318,6 +318,11 @@ padding-left: 0; max-width: 800px; } + + .hero__subtitle { + margin-top: 2rem; + font-size: 1.75rem; + } } @media screen and (max-width: 966px) { @@ -326,4 +331,30 @@ max-width: 65%; min-width: 200px; } + + .hero__subtitle { + font-size: 1.5rem; + } +} + + +@media screen and (max-width: 400px) { + .carousel-root { + padding-left: 0; + max-width: 95%; + min-width: 200px; + } + + blockquote { + margin: 0rem auto 3rem; + } + + blockquote h3 { + font-size: 1.1rem; + } + + blockquote h4 { + font-size: 1rem; + } + } \ No newline at end of file diff --git a/website/src/css/custom.css b/website/src/css/custom.css index 3a24beb71..1cb8267b3 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -135,7 +135,7 @@ html[data-theme="light"] .button--secondary { } .hero .container .col .hero__subtitle { - font-size: 1.2rem; + font-size: 1.3rem; } .carousel-root { @@ -174,27 +174,14 @@ html[data-theme="light"] .button--secondary { font-size: 1.5rem; } -@media all and (min-width: 600px) { - .hero__subtitle { - margin-top: 2rem; - font-size: 1.65rem; - } -} - -@media all and (min-width: 1024px) { - .hero__subtitle { - margin-top: 2rem; - font-size: 1.75rem; - } -} blockquote { display: block; width: 80%; max-width: 75rem; position: relative; - padding: 0 5px; - margin: 0 auto 7rem; + padding: 0 1rem; + margin: 1rem auto 7rem; } blockquote:before, blockquote:after { diff --git a/website/src/pages/index.module.css b/website/src/pages/index.module.css index 9312008c8..bc63dc45c 100644 --- a/website/src/pages/index.module.css +++ b/website/src/pages/index.module.css @@ -29,4 +29,5 @@ .heroBanner { padding: 1rem 0 1rem; } + } \ No newline at end of file From 449764943fdff7b4a186bb95ec9d4c31d163db45 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Tue, 20 Sep 2022 19:52:00 +1000 Subject: [PATCH 28/62] Slight text change --- website/i18n/en/code.json | 2 +- website/i18n/ru/code.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/website/i18n/en/code.json b/website/i18n/en/code.json index 213608c31..2d8a7ac6c 100644 --- a/website/i18n/en/code.json +++ b/website/i18n/en/code.json @@ -3,7 +3,7 @@ "message": "Feature Rich" }, "homepage.Features.Description1": { - "message": "Build comprehensive cross-platform applications using native UI elements such as menus, dialogs, etc." + "message": "Build comprehensive cross-platform applications using native UI elements such as menus and dialogs." }, "homepage.Features.Title2": { "message": "Familiar" diff --git a/website/i18n/ru/code.json b/website/i18n/ru/code.json index 213608c31..2d8a7ac6c 100644 --- a/website/i18n/ru/code.json +++ b/website/i18n/ru/code.json @@ -3,7 +3,7 @@ "message": "Feature Rich" }, "homepage.Features.Description1": { - "message": "Build comprehensive cross-platform applications using native UI elements such as menus, dialogs, etc." + "message": "Build comprehensive cross-platform applications using native UI elements such as menus and dialogs." }, "homepage.Features.Title2": { "message": "Familiar" From 15759b38bff488885f57da316aaec31863977c1d Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Tue, 20 Sep 2022 21:52:20 +1000 Subject: [PATCH 29/62] Add sponsor label workflow. Generate sponsor svg. --- .github/workflows/label-sponsors.yml | 14 ++ .github/workflows/sponsorimage.yml | 33 +++ .gitignore | 2 + README.ja.md | 94 +------- README.md | 94 +------- README.zh-Hans.md | 93 +------- sponsorkit.config.js | 206 ++++++++++++++++++ v2/tools/release/release.go | 2 + .../credits.mdx | 107 +-------- .../credits.mdx | 106 +-------- .../credits.mdx | 107 +-------- .../credits.mdx | 104 +-------- website/src/pages/credits.mdx | 103 +-------- website/static/img/sponsors.svg | 146 +++++++++++++ 14 files changed, 411 insertions(+), 800 deletions(-) create mode 100644 .github/workflows/label-sponsors.yml create mode 100644 .github/workflows/sponsorimage.yml create mode 100644 sponsorkit.config.js create mode 100644 website/static/img/sponsors.svg diff --git a/.github/workflows/label-sponsors.yml b/.github/workflows/label-sponsors.yml new file mode 100644 index 000000000..fdaacb3cc --- /dev/null +++ b/.github/workflows/label-sponsors.yml @@ -0,0 +1,14 @@ +name: Label sponsors +on: + pull_request: + types: [ opened ] + issues: + types: [ opened ] +jobs: + build: + name: is-sponsor-label + runs-on: ubuntu-latest + steps: + - uses: JasonEtco/is-sponsor-label-action@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/sponsorimage.yml b/.github/workflows/sponsorimage.yml new file mode 100644 index 000000000..d44ab8782 --- /dev/null +++ b/.github/workflows/sponsorimage.yml @@ -0,0 +1,33 @@ +name: Scheduler + +on: + workflow_dispatch: + schedule: + - cron: '0 0 * * *' + push: + branches: [ test1 ] + +jobs: + update-sponsors: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Set node + uses: actions/setup-node@v2 + with: + node-version: 16.x + + - name: Update sponsors + run: npx sponsorkit -o website/static/img/ + env: + SPONSORKIT_GITHUB_TOKEN: ${{ secrets.SPONSORS_TOKEN }} + SPONSORKIT_GITHUB_LOGIN: leaanthony + + - name: Commit + uses: EndBug/add-and-commit@v4 + with: + message: "chore: update sponsors.svg" + add: "sponsors.*" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 1b4152462..7da685641 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,5 @@ v2/test/kitchensink/build/darwin/desktop/kitchensink v2/test/kitchensink/frontend/package.json.md5 .idea/ v2/cmd/wails/internal/commands/initialise/templates/testtemplates/ +.env +/website/static/img/.cache.json diff --git a/README.ja.md b/README.ja.md index 8f0bb704d..b15a163cc 100644 --- a/README.ja.md +++ b/README.ja.md @@ -114,99 +114,7 @@ Wails v2 が 3 つのプラットフォームでベータ版としてリリー ## スポンサー このプロジェクトは、以下の方々・企業によって支えられています。 - - - - - - - -
-
- - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + ## 始め方 diff --git a/README.md b/README.md index a6ec6c37a..531eb9dd5 100644 --- a/README.md +++ b/README.md @@ -89,99 +89,7 @@ this before open up an enhancement request. ## Sponsors This project is supported by these kind people / companies: - - - - - - - -
-
- - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + ## Getting Started diff --git a/README.zh-Hans.md b/README.zh-Hans.md index f5c68d395..b710b6aa4 100644 --- a/README.zh-Hans.md +++ b/README.zh-Hans.md @@ -113,98 +113,7 @@ Wails v2 已针对所有 3 个平台发布了 Beta 版。如果您有兴趣尝 这个项目由以下这些人或者公司支持: - - - - - - -
-
- - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + ## 快速入门 diff --git a/sponsorkit.config.js b/sponsorkit.config.js new file mode 100644 index 000000000..6596348d1 --- /dev/null +++ b/sponsorkit.config.js @@ -0,0 +1,206 @@ +import {defineConfig} from 'sponsorkit'; + +const helpers = { + avatar: { + size: 45 + }, + boxWidth: 55, + boxHeight: 55, + container: { + sidePadding: 30 + }, +}; + +const coffee = { + avatar: { + size: 50 + }, + boxWidth: 65, + boxHeight: 65, + container: { + sidePadding: 30 + }, +}; + +const breakfast = { + avatar: { + size: 55 + }, + boxWidth: 75, + boxHeight: 75, + container: { + sidePadding: 20 + }, + name: { + maxLength: 10 + } +}; + +const costs = { + avatar: { + size: 65 + }, + boxWidth: 90, + boxHeight: 80, + container: { + sidePadding: 30 + }, + name: { + maxLength: 10 + } +}; + +const bronze = { + avatar: { + size: 85 + }, + boxWidth: 110, + boxHeight: 100, + container: { + sidePadding: 30 + }, + name: { + maxLength: 20 + } +}; + +const silver = { + avatar: { + size: 100 + }, + boxWidth: 110, + boxHeight: 110, + container: { + sidePadding: 20 + }, + name: { + maxLength: 20 + } +}; + +const gold = { + avatar: { + size: 150 + }, + boxWidth: 175, + boxHeight: 175, + container: { + sidePadding: 25 + }, + name: { + maxLength: 25 + } +}; + +const champion = { + avatar: { + size: 175 + }, + boxWidth: 200, + boxHeight: 200, + container: { + sidePadding: 30 + }, + name: { + maxLength: 30 + } +}; + +const partner = { + avatar: { + size: 200 + }, + boxWidth: 225, + boxHeight: 225, + container: { + sidePadding: 40 + }, + name: { + maxLength: 40 + }, + +}; + +export default defineConfig({ + github: { + login: 'leaanthony', + type: 'user', + }, + + // Rendering configs + width: 800, + formats: ['svg'], + tiers: [ + { + title: 'Helpers', + preset: helpers, + composeAfter: function (composer, tierSponsors, config) { + composer.addSpan(20); + } + }, + { + title: 'Buying Coffee', + monthlyDollars: 5, + preset: coffee, + composeAfter: function (composer, tierSponsors, config) { + composer.addSpan(20); + } + }, + { + title: 'Buying Breakfast', + monthlyDollars: 10, + preset: breakfast, + composeAfter: function (composer, tierSponsors, config) { + composer.addSpan(20); + } + }, + { + title: 'Covering Costs', + monthlyDollars: 20, + preset: costs, + composeAfter: function (composer, tierSponsors, config) { + composer.addSpan(20); + } + }, + { + title: 'Bronze Sponsors', + monthlyDollars: 50, + preset: bronze, + composeAfter: function (composer, tierSponsors, config) { + composer.addSpan(20); + } + }, + { + title: 'Silver Sponsors', + monthlyDollars: 100, + preset: silver, + composeAfter: function (composer, tierSponsors, config) { + composer.addSpan(20); + } + }, + { + title: 'Gold Sponsors', + monthlyDollars: 200, + preset: gold, + composeAfter: function (composer, tierSponsors, config) { + composer.addSpan(20); + } + }, + { + title: 'Champion', + monthlyDollars: 500, + preset: champion, + composeAfter: function (composer, tierSponsors, config) { + composer.addSpan(20); + } + }, + { + title: 'Partner', + monthlyDollars: 1000, + preset: partner, + composeAfter: function (composer, tierSponsors, config) { + composer.addSpan(20); + } + }, + ], +}); \ No newline at end of file diff --git a/v2/tools/release/release.go b/v2/tools/release/release.go index e372ec36b..bf558130f 100644 --- a/v2/tools/release/release.go +++ b/v2/tools/release/release.go @@ -47,6 +47,8 @@ func main() { var newVersion string if len(os.Args) > 1 { newVersion = os.Args[1] + err := os.WriteFile(versionFile, []byte(newVersion), 0755) + checkError(err) } else { newVersion = updateVersion() } diff --git a/website/i18n/ja/docusaurus-plugin-content-pages/credits.mdx b/website/i18n/ja/docusaurus-plugin-content-pages/credits.mdx index ba9295abe..2970d3704 100644 --- a/website/i18n/ja/docusaurus-plugin-content-pages/credits.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-pages/credits.mdx @@ -7,112 +7,7 @@ - [Byron Chris](https://github.com/bh90210) - Linux distro wizard, Linux testing ## Sponsors -
- - - - - - -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -directory - - - - - - - - - - - - - - - - - - - - - - - - - -`, }} /> + ## Contributors diff --git a/website/i18n/ko/docusaurus-plugin-content-pages/credits.mdx b/website/i18n/ko/docusaurus-plugin-content-pages/credits.mdx index 0e4e76c52..2970d3704 100644 --- a/website/i18n/ko/docusaurus-plugin-content-pages/credits.mdx +++ b/website/i18n/ko/docusaurus-plugin-content-pages/credits.mdx @@ -7,111 +7,7 @@ - [Byron Chris](https://github.com/bh90210) - Linux distro wizard, Linux testing ## Sponsors -
- - - - - - -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -directory - - - - - - - - - - - - - - - - - - - - - - - - -`, }} /> + ## Contributors diff --git a/website/i18n/ru/docusaurus-plugin-content-pages/credits.mdx b/website/i18n/ru/docusaurus-plugin-content-pages/credits.mdx index de5ec7896..8c98451f6 100644 --- a/website/i18n/ru/docusaurus-plugin-content-pages/credits.mdx +++ b/website/i18n/ru/docusaurus-plugin-content-pages/credits.mdx @@ -7,112 +7,7 @@ - [Byron Chris](https://github.com/bh90210) - Мастер дистрибутивов Linux, тестирование на Linux ## Спонсоры -
- - - - - - -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -directory - - - - - - - - - - - - - - - - - - - - - - - - - -`, }} /> + ## Соавторы diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-pages/credits.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-pages/credits.mdx index 5acb98609..3de3d5086 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-pages/credits.mdx +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-pages/credits.mdx @@ -7,109 +7,7 @@ - [Byron Chris](https://github.com/bh90210) - Linux 发行版指导,Linux 平台的测试 ## 赞助商 -
- - - - - - -
- - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -`, }} /> + ## 贡献者 diff --git a/website/src/pages/credits.mdx b/website/src/pages/credits.mdx index 2a7b20fd2..ba319d8bd 100644 --- a/website/src/pages/credits.mdx +++ b/website/src/pages/credits.mdx @@ -7,108 +7,7 @@ - [Byron Chris](https://github.com/bh90210) - Linux distro wizard, Linux testing ## Sponsors - -
- - - - - -
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -`, }} /> + ## Contributors diff --git a/website/static/img/sponsors.svg b/website/static/img/sponsors.svg new file mode 100644 index 000000000..b1e2de9e4 --- /dev/null +++ b/website/static/img/sponsors.svg @@ -0,0 +1,146 @@ + + + + Silver Sponsors + + Selvin Ortiz + + + Bronze Sponsors + + Cody Bentley + + + + easy-web-it + + + + Sean + + + Covering Costs + + Nick + + + + Liam + + + + Marcus + + + + John + + + Buying Breakfast + + tc-hib + + + + Frank + + + + Tai Groot + + + + Michael + + + + Arden + + + Buying Coffee + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Helpers + + + + + + + + + + + + + + + + + From db70a0de5805ba0ed8929a084d1168a16cf28612 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Tue, 20 Sep 2022 21:55:42 +1000 Subject: [PATCH 30/62] Update scheduler workflow --- .github/workflows/sponsorimage.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/sponsorimage.yml b/.github/workflows/sponsorimage.yml index d44ab8782..1fafc7a84 100644 --- a/.github/workflows/sponsorimage.yml +++ b/.github/workflows/sponsorimage.yml @@ -18,8 +18,10 @@ jobs: with: node-version: 16.x + - run: npx pnpm i + - name: Update sponsors - run: npx sponsorkit -o website/static/img/ + run: npm run build -- -o website/static/img/ env: SPONSORKIT_GITHUB_TOKEN: ${{ secrets.SPONSORS_TOKEN }} SPONSORKIT_GITHUB_LOGIN: leaanthony From d3b8a7e4af152ad78aa9851eb0e4a67ca51740e3 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Tue, 20 Sep 2022 21:57:58 +1000 Subject: [PATCH 31/62] Add package.json --- package-lock.json | 3606 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 15 + 2 files changed, 3621 insertions(+) create mode 100644 package-lock.json create mode 100644 package.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..12461dd93 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3606 @@ +{ + "name": "release", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "release", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "sponsorkit": "^0.5.2" + } + }, + "node_modules/@antfu/utils": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.5.2.tgz", + "integrity": "sha512-CQkeV+oJxUazwjlHD0/3ZD08QWKuGQkhnrKo3e6ly5pd48VUpXbb77q0xMU4+vc2CkJnDS02Eq/M9ugyX20XZA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escape-sequences": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-4.1.0.tgz", + "integrity": "sha512-dzW9kHxH011uBsidTXd14JXgzye/YLb2LzeKZ4bsgl/Knwx8AtbSFkkGxagdNOoh0DlqHCmfiEjWKBaqjOanVw==", + "dev": true, + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/ansi-escape-sequences/node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/array-back": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", + "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", + "dev": true, + "dependencies": { + "typical": "^2.6.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/cliss": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/cliss/-/cliss-0.0.2.tgz", + "integrity": "sha512-6rj9pgdukjT994Md13JCUAgTk91abAKrygL9sAvmHY4F6AKMOV8ccGaxhUUfcBuyg3sundWnn3JE0Mc9W6ZYqw==", + "dev": true, + "dependencies": { + "command-line-usage": "^4.0.1", + "deepmerge": "^2.0.0", + "get-stdin": "^5.0.1", + "inspect-parameters-declaration": "0.0.9", + "object-to-arguments": "0.0.8", + "pipe-functions": "^1.3.0", + "strip-ansi": "^4.0.0", + "yargs-parser": "^7.0.0" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dev": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/command-line-usage": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-4.1.0.tgz", + "integrity": "sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g==", + "dev": true, + "dependencies": { + "ansi-escape-sequences": "^4.0.0", + "array-back": "^2.0.0", + "table-layout": "^0.4.2", + "typical": "^2.6.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", + "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defu": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.0.tgz", + "integrity": "sha512-pOFYRTIhoKujrmbTRhcW5lYQLBXw/dlTwfI8IguF1QCDJOcJzNH1w+YFjxqy6BAuJrClTy6MUE8q+oKJ2FLsIw==", + "dev": true + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/destr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/destr/-/destr-1.1.1.tgz", + "integrity": "sha512-QqkneF8LrYmwATMdnuD2MLI3GHQIcBnG6qFC2q9bSH430VTCDAVjcspPmUaKhPGtAtPAftIUFqY1obQYQuwmbg==", + "dev": true + }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.2.tgz", + "integrity": "sha512-JvpYKUmzQhYoIFgK2MOnF3bciIZoItIIoryihy0rIA+H4Jy0FmgyKYAHCTN98P5ybGSJcIFbh6QKeJdtZd1qhA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/for-each-property": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/for-each-property/-/for-each-property-0.0.4.tgz", + "integrity": "sha512-xYs28PM0CKXETFzuGC6ZooH0voZlsSDZwidJcy92flQJi3PK7i3gZx23xHXCPOaD4zmet3bDo+wS7E7SujrlCw==", + "dev": true, + "dependencies": { + "get-prototype-chain": "^1.0.1" + } + }, + "node_modules/for-each-property-deep": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/for-each-property-deep/-/for-each-property-deep-0.0.3.tgz", + "integrity": "sha512-qzP8QkODWVVRPpWiBZacSbBl67cTTWoBfxMG0wE46AsS1yl7qv05sGN+dHvD4s4tnvl/goe6Sp4qBI+rlVBgNg==", + "dev": true, + "dependencies": { + "for-each-property": "0.0.4" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-prototype-chain": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-prototype-chain/-/get-prototype-chain-1.0.1.tgz", + "integrity": "sha512-2m7WZ0jveIg/dAbCbpUxEToaJ8Dmti5EkgDP8YM3UpHUT6SAORjE2odP8XQGNVGXMHi8q8cCCoy3HTByTaTVTw==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/get-stdin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", + "integrity": "sha512-jZV7n6jGE3Gt7fgSTJoz91Ak5MuTLwMwkoYdjxuJ/AmjIsE1UC03y/IWkZCQGEvVNS9qoRNwy5BCqxImv0FVeA==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dev": true, + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/image-data-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/image-data-uri/-/image-data-uri-2.0.1.tgz", + "integrity": "sha512-BZh721F2Q5TwBdwpiqrBrHEdj8daj8KuMZK/DOCyqQlz1CqFhhuZWbK5ZCUnAvFJr8LaKHTaWl9ja3/a3DC2Ew==", + "dev": true, + "dependencies": { + "fs-extra": "^0.26.7", + "magicli": "0.0.8", + "mime-types": "^2.1.18", + "request": "^2.88.0" + }, + "bin": { + "image-data-uri": "bin/magicli.js" + } + }, + "node_modules/image-data-uri/node_modules/fs-extra": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz", + "integrity": "sha512-waKu+1KumRhYv8D8gMRCKJGAMI9pRnPuEb1mvgYD0f7wBscg+h6bW4FDTmEZhB9VKxvoTtxW+Y7bnIlB7zja6Q==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "node_modules/image-data-uri/node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/inspect-function": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/inspect-function/-/inspect-function-0.3.4.tgz", + "integrity": "sha512-s0RsbJqK/sNZ+U1mykGoTickog3ea1A9Qk4mXniogOBu4PgkkZ56elScO7QC/r8D94lhGmJ2NyDI1ipOA/uq/g==", + "dev": true, + "dependencies": { + "inspect-parameters-declaration": "0.0.8", + "magicli": "0.0.8", + "split-skip": "0.0.1", + "stringify-parameters": "0.0.4", + "unpack-string": "0.0.2" + }, + "bin": { + "inspect-function": "bin/magicli.js" + } + }, + "node_modules/inspect-function/node_modules/inspect-function": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/inspect-function/-/inspect-function-0.2.2.tgz", + "integrity": "sha512-becs5gzcHwPrlHawscYkyQ/ShiOiosrXPhA5RVZ3qyWH4aWdD52RnMfXq/dwQXciHwiieD8aIPwdIWYv6eL+sQ==", + "dev": true, + "dependencies": { + "split-skip": "0.0.1", + "unpack-string": "0.0.2" + } + }, + "node_modules/inspect-function/node_modules/inspect-parameters-declaration": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/inspect-parameters-declaration/-/inspect-parameters-declaration-0.0.8.tgz", + "integrity": "sha512-W4QzN1LgFmasKOM+NoLlDd2OAZM3enNZlVUOXoGQKmYBDFgxoPDOyebF55ALaf8avyM9TavNwibXxg347RrzCg==", + "dev": true, + "dependencies": { + "magicli": "0.0.5", + "split-skip": "0.0.2", + "stringify-parameters": "0.0.4", + "unpack-string": "0.0.2" + }, + "bin": { + "inspect-parameters-declaration": "bin/cli.js" + } + }, + "node_modules/inspect-function/node_modules/inspect-parameters-declaration/node_modules/magicli": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/magicli/-/magicli-0.0.5.tgz", + "integrity": "sha512-wZbMtnl2v1b+Jp3xlqA9FU/O4I6YhGXR8xSY/eU2+gDAvut/F+W3gl4qs61iL4LELC7jqSAE6aAD5668EbmQHA==", + "dev": true, + "dependencies": { + "commander": "^2.9.0", + "get-stdin": "^5.0.1", + "inspect-function": "^0.2.1", + "pipe-functions": "^1.2.0" + } + }, + "node_modules/inspect-function/node_modules/inspect-parameters-declaration/node_modules/split-skip": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/split-skip/-/split-skip-0.0.2.tgz", + "integrity": "sha512-weHOi8BolsDnGIwhhWHbA+wKSuSpvWwjRrdj8SdbIIis2vSwOE37CQP8x3EleuzxanUr3AK8BdUy4MkiOULPZg==", + "dev": true + }, + "node_modules/inspect-function/node_modules/split-skip": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/split-skip/-/split-skip-0.0.1.tgz", + "integrity": "sha512-7dkvq+gofI4M8zx4iZnEZ3O1s7FP4Y/iaIDHJh5RyWrs8idcPauFi2OZe3TBi36fLvR2j5z3kSzVtz6IhPdncQ==", + "dev": true + }, + "node_modules/inspect-parameters-declaration": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/inspect-parameters-declaration/-/inspect-parameters-declaration-0.0.9.tgz", + "integrity": "sha512-c3jrKKA1rwwrsjdGMAo2hFWV0vNe3/RKHxpE/OBt41LP3ynOVI1qmgxpZYK5SQu3jtWCyaho8L7AZzCjJ4mEUw==", + "dev": true, + "dependencies": { + "magicli": "0.0.5", + "split-skip": "0.0.2", + "stringify-parameters": "0.0.4", + "unpack-string": "0.0.2" + }, + "bin": { + "inspect-parameters-declaration": "bin/cli.js" + } + }, + "node_modules/inspect-parameters-declaration/node_modules/inspect-function": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/inspect-function/-/inspect-function-0.2.2.tgz", + "integrity": "sha512-becs5gzcHwPrlHawscYkyQ/ShiOiosrXPhA5RVZ3qyWH4aWdD52RnMfXq/dwQXciHwiieD8aIPwdIWYv6eL+sQ==", + "dev": true, + "dependencies": { + "split-skip": "0.0.1", + "unpack-string": "0.0.2" + } + }, + "node_modules/inspect-parameters-declaration/node_modules/inspect-function/node_modules/split-skip": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/split-skip/-/split-skip-0.0.1.tgz", + "integrity": "sha512-7dkvq+gofI4M8zx4iZnEZ3O1s7FP4Y/iaIDHJh5RyWrs8idcPauFi2OZe3TBi36fLvR2j5z3kSzVtz6IhPdncQ==", + "dev": true + }, + "node_modules/inspect-parameters-declaration/node_modules/magicli": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/magicli/-/magicli-0.0.5.tgz", + "integrity": "sha512-wZbMtnl2v1b+Jp3xlqA9FU/O4I6YhGXR8xSY/eU2+gDAvut/F+W3gl4qs61iL4LELC7jqSAE6aAD5668EbmQHA==", + "dev": true, + "dependencies": { + "commander": "^2.9.0", + "get-stdin": "^5.0.1", + "inspect-function": "^0.2.1", + "pipe-functions": "^1.2.0" + } + }, + "node_modules/inspect-property": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/inspect-property/-/inspect-property-0.0.6.tgz", + "integrity": "sha512-LgjHkRl9W6bj2n+kWrAOgvCYPTYt+LanE4rtd/vKNq6yEb+SvVV7UTLzoSPpDX6/U1cAz7VfqPr+lPAIz7wHaQ==", + "dev": true, + "dependencies": { + "for-each-property": "0.0.4", + "for-each-property-deep": "0.0.3", + "inspect-function": "^0.3.1" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, + "node_modules/jiti": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.16.0.tgz", + "integrity": "sha512-L3BJStEf5NAqNuzrpfbN71dp43mYIcBUlCRea/vdyv5dW/AYa1d4bpelko4SHdY3I6eN9Wzyasxirj1/vv5kmg==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.9" + } + }, + "node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lodash.padend": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", + "integrity": "sha512-sOQs2aqGpbl27tmCS1QNZA09Uqp01ZzWfDUoD+xzTii0E7dSQfRKcRetFwa+uXaxaqL+TKm7CgD2JdKP7aZBSw==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/magicli": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/magicli/-/magicli-0.0.8.tgz", + "integrity": "sha512-x/eBenweAHF+DsYy172sK4doRxZl0yrJnfxhLJiN7H6hPM3Ya0PfI6uBZshZ3ScFFSQD7HXgBqMdbnXKEZsO1g==", + "dev": true, + "dependencies": { + "cliss": "0.0.2", + "find-up": "^2.1.0", + "for-each-property": "0.0.4", + "inspect-property": "0.0.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, + "node_modules/node-abi": { + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.24.0.tgz", + "integrity": "sha512-YPG3Co0luSu6GwOBsmIdGW6Wx0NyNDLg/hriIyDllVsNwnI6UeqaWShxC3lbH4LtEQUgoLP3XR1ndXiDAWvmRw==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz", + "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==", + "dev": true + }, + "node_modules/node-fetch-native": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-0.1.5.tgz", + "integrity": "sha512-4NYY0JOTYFsahDjKy4gId6uuf7TPzkIDSDMuvtmlFd2Jf25tj9fQsDD5+kLdzM7sm6BbG8lL/154tdrsgN25Zw==", + "dev": true + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/object-to-arguments": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/object-to-arguments/-/object-to-arguments-0.0.8.tgz", + "integrity": "sha512-BfWfuAwuhdH1bhMG5EG90WE/eckkBhBvnke8eSEkCDXoLE9Jk5JwYGTbCx1ehGwV48HvBkn62VukPBdlMUOY9w==", + "dev": true, + "dependencies": { + "inspect-parameters-declaration": "0.0.10", + "magicli": "0.0.5", + "split-skip": "0.0.2", + "stringify-parameters": "0.0.4", + "unpack-string": "0.0.2" + }, + "bin": { + "object-to-arguments": "bin/cli.js" + } + }, + "node_modules/object-to-arguments/node_modules/inspect-function": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/inspect-function/-/inspect-function-0.2.2.tgz", + "integrity": "sha512-becs5gzcHwPrlHawscYkyQ/ShiOiosrXPhA5RVZ3qyWH4aWdD52RnMfXq/dwQXciHwiieD8aIPwdIWYv6eL+sQ==", + "dev": true, + "dependencies": { + "split-skip": "0.0.1", + "unpack-string": "0.0.2" + } + }, + "node_modules/object-to-arguments/node_modules/inspect-function/node_modules/split-skip": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/split-skip/-/split-skip-0.0.1.tgz", + "integrity": "sha512-7dkvq+gofI4M8zx4iZnEZ3O1s7FP4Y/iaIDHJh5RyWrs8idcPauFi2OZe3TBi36fLvR2j5z3kSzVtz6IhPdncQ==", + "dev": true + }, + "node_modules/object-to-arguments/node_modules/inspect-parameters-declaration": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/inspect-parameters-declaration/-/inspect-parameters-declaration-0.0.10.tgz", + "integrity": "sha512-L8/Bvt9iDXQTZ63xY5/MAyvzz+FagR/qGh1kIXvUpsno3AAE0Z95d6QO51zrcMGaEGpwh/57idfMxTxbvRmytg==", + "dev": true, + "dependencies": { + "magicli": "0.0.5", + "split-skip": "0.0.2", + "stringify-parameters": "0.0.4", + "unpack-string": "0.0.2" + }, + "bin": { + "inspect-parameters-declaration": "bin/cli.js" + } + }, + "node_modules/object-to-arguments/node_modules/magicli": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/magicli/-/magicli-0.0.5.tgz", + "integrity": "sha512-wZbMtnl2v1b+Jp3xlqA9FU/O4I6YhGXR8xSY/eU2+gDAvut/F+W3gl4qs61iL4LELC7jqSAE6aAD5668EbmQHA==", + "dev": true, + "dependencies": { + "commander": "^2.9.0", + "get-stdin": "^5.0.1", + "inspect-function": "^0.2.1", + "pipe-functions": "^1.2.0" + } + }, + "node_modules/ohmyfetch": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/ohmyfetch/-/ohmyfetch-0.4.19.tgz", + "integrity": "sha512-OH2xVeRPNsHkx+JFdq1ewe9EwVDfTrv6lsBHpIx8wIWXowP5FyLhhYVaXIVlPsW542rt7gmwK14FwIDWUXEO+Q==", + "dev": true, + "dependencies": { + "destr": "^1.1.1", + "node-fetch-native": "^0.1.5", + "ufo": "^0.8.5", + "undici": "^5.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/pipe-functions": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pipe-functions/-/pipe-functions-1.3.0.tgz", + "integrity": "sha512-6Rtbp7criZRwedlvWbUYxqlqJoAlMvYHo2UcRWq79xZ54vZcaNHpVBOcWkX3ErT2aUA69tv+uiv4zKJbhD/Wgg==", + "dev": true + }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/reduce-flatten": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz", + "integrity": "sha512-j5WfFJfc9CoXv/WbwVLHq74i/hdTUpy+iNC534LxczMRP67vJeK3V9JOdnL0N1cIRbn9mYhE2yVjvvKXDxvNXQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.30.7", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.30.7.tgz", + "integrity": "sha512-G+MY2YW33jgflKPTXXptVO28HvNOo9G3j0MybYAHeEmby+QuD2U98dT6ueht9cv/XDqZspSpIhoSW+BAKJ7Hig==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.1", + "node-addon-api": "^5.0.0", + "prebuild-install": "^7.1.1", + "semver": "^7.3.7", + "simple-get": "^4.0.1", + "tar-fs": "^2.1.1", + "tunnel-agent": "^0.6.0" + }, + "engines": { + "node": ">=12.13.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/split-skip": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/split-skip/-/split-skip-0.0.2.tgz", + "integrity": "sha512-weHOi8BolsDnGIwhhWHbA+wKSuSpvWwjRrdj8SdbIIis2vSwOE37CQP8x3EleuzxanUr3AK8BdUy4MkiOULPZg==", + "dev": true + }, + "node_modules/sponsorkit": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/sponsorkit/-/sponsorkit-0.5.2.tgz", + "integrity": "sha512-pCNUdiO5BF1OBvJdiuN+Z9wlxVuqZMOO9wsegUwfkS7wqOMZ18XbH6SG7sr+cRiyi6h7JE4iyThFEBb9dm4Jnw==", + "dev": true, + "dependencies": { + "consola": "^2.15.3", + "dotenv": "^16.0.1", + "fs-extra": "^10.1.0", + "image-data-uri": "^2.0.1", + "ohmyfetch": "^0.4.18", + "picocolors": "^1.0.0", + "sharp": "^0.30.7", + "unconfig": "^0.3.5", + "yargs": "^17.5.1" + }, + "bin": { + "sponsorkit": "bin/sponsorkit.js" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stringify-parameters": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stringify-parameters/-/stringify-parameters-0.0.4.tgz", + "integrity": "sha512-H3L90ERn5UPtkpO8eugnKcLgpIVlvTyUTrcLGm607AV5JDH6z0GymtNLr3gjGlP6I6NB/mxNX9QpY6jEQGLPdQ==", + "dev": true, + "dependencies": { + "magicli": "0.0.5", + "unpack-string": "0.0.2" + }, + "bin": { + "stringify-parameters": "bin/cli.js" + } + }, + "node_modules/stringify-parameters/node_modules/inspect-function": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/inspect-function/-/inspect-function-0.2.2.tgz", + "integrity": "sha512-becs5gzcHwPrlHawscYkyQ/ShiOiosrXPhA5RVZ3qyWH4aWdD52RnMfXq/dwQXciHwiieD8aIPwdIWYv6eL+sQ==", + "dev": true, + "dependencies": { + "split-skip": "0.0.1", + "unpack-string": "0.0.2" + } + }, + "node_modules/stringify-parameters/node_modules/magicli": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/magicli/-/magicli-0.0.5.tgz", + "integrity": "sha512-wZbMtnl2v1b+Jp3xlqA9FU/O4I6YhGXR8xSY/eU2+gDAvut/F+W3gl4qs61iL4LELC7jqSAE6aAD5668EbmQHA==", + "dev": true, + "dependencies": { + "commander": "^2.9.0", + "get-stdin": "^5.0.1", + "inspect-function": "^0.2.1", + "pipe-functions": "^1.2.0" + } + }, + "node_modules/stringify-parameters/node_modules/split-skip": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/split-skip/-/split-skip-0.0.1.tgz", + "integrity": "sha512-7dkvq+gofI4M8zx4iZnEZ3O1s7FP4Y/iaIDHJh5RyWrs8idcPauFi2OZe3TBi36fLvR2j5z3kSzVtz6IhPdncQ==", + "dev": true + }, + "node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/table-layout": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.5.tgz", + "integrity": "sha512-zTvf0mcggrGeTe/2jJ6ECkJHAQPIYEwDoqsiqBjI24mvRmQbInK5jq33fyypaCBxX08hMkfmdOqj6haT33EqWw==", + "dev": true, + "dependencies": { + "array-back": "^2.0.0", + "deep-extend": "~0.6.0", + "lodash.padend": "^4.6.1", + "typical": "^2.6.1", + "wordwrapjs": "^3.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, + "node_modules/typical": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", + "integrity": "sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==", + "dev": true + }, + "node_modules/ufo": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-0.8.5.tgz", + "integrity": "sha512-e4+UtA5IRO+ha6hYklwj6r7BjiGMxS0O+UaSg9HbaTefg4kMkzj4tXzEBajRR+wkxf+golgAWKzLbytCUDMJAA==", + "dev": true + }, + "node_modules/unconfig": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/unconfig/-/unconfig-0.3.6.tgz", + "integrity": "sha512-JWefWyjLrDAbzs30sFkzcE9YpvAhN9+UPMZBwnNUmaY9X7QhI+wCGP4hoEWfZDzvkP+WIaZDPcMUJjarpxFvKg==", + "dev": true, + "dependencies": { + "@antfu/utils": "^0.5.2", + "defu": "^6.1.0", + "jiti": "^1.14.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/undici": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.10.0.tgz", + "integrity": "sha512-c8HsD3IbwmjjbLvoZuRI26TZic+TSEe8FPMLLOkN1AfYRhdjnKBU6yL+IwcSCbdZiX4e5t0lfMDLDCqj4Sq70g==", + "dev": true, + "engines": { + "node": ">=12.18" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpack-string": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/unpack-string/-/unpack-string-0.0.2.tgz", + "integrity": "sha512-2ZFjp5aY7QwHE6HAp47RnKYfvgAQ5+NwbKq/ZVtty85RDb3/UaTeCfizo5L/fXzM7UkMP/zDtbV+kGW/iJiK6w==", + "dev": true + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/wordwrapjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz", + "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==", + "dev": true, + "dependencies": { + "reduce-flatten": "^1.0.1", + "typical": "^2.6.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha512-WhzC+xgstid9MbVUktco/bf+KJG+Uu6vMX0LN1sLJvwmbCQVxb4D8LzogobonKycNasCZLdOzTAk1SK7+K7swg==", + "dev": true, + "dependencies": { + "camelcase": "^4.1.0" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + } + }, + "dependencies": { + "@antfu/utils": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.5.2.tgz", + "integrity": "sha512-CQkeV+oJxUazwjlHD0/3ZD08QWKuGQkhnrKo3e6ly5pd48VUpXbb77q0xMU4+vc2CkJnDS02Eq/M9ugyX20XZA==", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-escape-sequences": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-4.1.0.tgz", + "integrity": "sha512-dzW9kHxH011uBsidTXd14JXgzye/YLb2LzeKZ4bsgl/Knwx8AtbSFkkGxagdNOoh0DlqHCmfiEjWKBaqjOanVw==", + "dev": true, + "requires": { + "array-back": "^3.0.1" + }, + "dependencies": { + "array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "dev": true + } + } + }, + "ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "array-back": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", + "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", + "dev": true, + "requires": { + "typical": "^2.6.1" + } + }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "cliss": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/cliss/-/cliss-0.0.2.tgz", + "integrity": "sha512-6rj9pgdukjT994Md13JCUAgTk91abAKrygL9sAvmHY4F6AKMOV8ccGaxhUUfcBuyg3sundWnn3JE0Mc9W6ZYqw==", + "dev": true, + "requires": { + "command-line-usage": "^4.0.1", + "deepmerge": "^2.0.0", + "get-stdin": "^5.0.1", + "inspect-parameters-declaration": "0.0.9", + "object-to-arguments": "0.0.8", + "pipe-functions": "^1.3.0", + "strip-ansi": "^4.0.0", + "yargs-parser": "^7.0.0" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dev": true, + "requires": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "command-line-usage": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-4.1.0.tgz", + "integrity": "sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g==", + "dev": true, + "requires": { + "ansi-escape-sequences": "^4.0.0", + "array-back": "^2.0.0", + "table-layout": "^0.4.2", + "typical": "^2.6.1" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "requires": { + "mimic-response": "^3.1.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "deepmerge": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", + "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", + "dev": true + }, + "defu": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.0.tgz", + "integrity": "sha512-pOFYRTIhoKujrmbTRhcW5lYQLBXw/dlTwfI8IguF1QCDJOcJzNH1w+YFjxqy6BAuJrClTy6MUE8q+oKJ2FLsIw==", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, + "destr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/destr/-/destr-1.1.1.tgz", + "integrity": "sha512-QqkneF8LrYmwATMdnuD2MLI3GHQIcBnG6qFC2q9bSH430VTCDAVjcspPmUaKhPGtAtPAftIUFqY1obQYQuwmbg==", + "dev": true + }, + "detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "dev": true + }, + "dotenv": { + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.2.tgz", + "integrity": "sha512-JvpYKUmzQhYoIFgK2MOnF3bciIZoItIIoryihy0rIA+H4Jy0FmgyKYAHCTN98P5ybGSJcIFbh6QKeJdtZd1qhA==", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "for-each-property": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/for-each-property/-/for-each-property-0.0.4.tgz", + "integrity": "sha512-xYs28PM0CKXETFzuGC6ZooH0voZlsSDZwidJcy92flQJi3PK7i3gZx23xHXCPOaD4zmet3bDo+wS7E7SujrlCw==", + "dev": true, + "requires": { + "get-prototype-chain": "^1.0.1" + } + }, + "for-each-property-deep": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/for-each-property-deep/-/for-each-property-deep-0.0.3.tgz", + "integrity": "sha512-qzP8QkODWVVRPpWiBZacSbBl67cTTWoBfxMG0wE46AsS1yl7qv05sGN+dHvD4s4tnvl/goe6Sp4qBI+rlVBgNg==", + "dev": true, + "requires": { + "for-each-property": "0.0.4" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-prototype-chain": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-prototype-chain/-/get-prototype-chain-1.0.1.tgz", + "integrity": "sha512-2m7WZ0jveIg/dAbCbpUxEToaJ8Dmti5EkgDP8YM3UpHUT6SAORjE2odP8XQGNVGXMHi8q8cCCoy3HTByTaTVTw==", + "dev": true + }, + "get-stdin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", + "integrity": "sha512-jZV7n6jGE3Gt7fgSTJoz91Ak5MuTLwMwkoYdjxuJ/AmjIsE1UC03y/IWkZCQGEvVNS9qoRNwy5BCqxImv0FVeA==", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "image-data-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/image-data-uri/-/image-data-uri-2.0.1.tgz", + "integrity": "sha512-BZh721F2Q5TwBdwpiqrBrHEdj8daj8KuMZK/DOCyqQlz1CqFhhuZWbK5ZCUnAvFJr8LaKHTaWl9ja3/a3DC2Ew==", + "dev": true, + "requires": { + "fs-extra": "^0.26.7", + "magicli": "0.0.8", + "mime-types": "^2.1.18", + "request": "^2.88.0" + }, + "dependencies": { + "fs-extra": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz", + "integrity": "sha512-waKu+1KumRhYv8D8gMRCKJGAMI9pRnPuEb1mvgYD0f7wBscg+h6bW4FDTmEZhB9VKxvoTtxW+Y7bnIlB7zja6Q==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "inspect-function": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/inspect-function/-/inspect-function-0.3.4.tgz", + "integrity": "sha512-s0RsbJqK/sNZ+U1mykGoTickog3ea1A9Qk4mXniogOBu4PgkkZ56elScO7QC/r8D94lhGmJ2NyDI1ipOA/uq/g==", + "dev": true, + "requires": { + "inspect-parameters-declaration": "0.0.8", + "magicli": "0.0.8", + "split-skip": "0.0.1", + "stringify-parameters": "0.0.4", + "unpack-string": "0.0.2" + }, + "dependencies": { + "inspect-function": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/inspect-function/-/inspect-function-0.2.2.tgz", + "integrity": "sha512-becs5gzcHwPrlHawscYkyQ/ShiOiosrXPhA5RVZ3qyWH4aWdD52RnMfXq/dwQXciHwiieD8aIPwdIWYv6eL+sQ==", + "dev": true, + "requires": { + "split-skip": "0.0.1", + "unpack-string": "0.0.2" + } + }, + "inspect-parameters-declaration": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/inspect-parameters-declaration/-/inspect-parameters-declaration-0.0.8.tgz", + "integrity": "sha512-W4QzN1LgFmasKOM+NoLlDd2OAZM3enNZlVUOXoGQKmYBDFgxoPDOyebF55ALaf8avyM9TavNwibXxg347RrzCg==", + "dev": true, + "requires": { + "magicli": "0.0.5", + "split-skip": "0.0.2", + "stringify-parameters": "0.0.4", + "unpack-string": "0.0.2" + }, + "dependencies": { + "magicli": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/magicli/-/magicli-0.0.5.tgz", + "integrity": "sha512-wZbMtnl2v1b+Jp3xlqA9FU/O4I6YhGXR8xSY/eU2+gDAvut/F+W3gl4qs61iL4LELC7jqSAE6aAD5668EbmQHA==", + "dev": true, + "requires": { + "commander": "^2.9.0", + "get-stdin": "^5.0.1", + "inspect-function": "^0.2.1", + "pipe-functions": "^1.2.0" + } + }, + "split-skip": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/split-skip/-/split-skip-0.0.2.tgz", + "integrity": "sha512-weHOi8BolsDnGIwhhWHbA+wKSuSpvWwjRrdj8SdbIIis2vSwOE37CQP8x3EleuzxanUr3AK8BdUy4MkiOULPZg==", + "dev": true + } + } + }, + "split-skip": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/split-skip/-/split-skip-0.0.1.tgz", + "integrity": "sha512-7dkvq+gofI4M8zx4iZnEZ3O1s7FP4Y/iaIDHJh5RyWrs8idcPauFi2OZe3TBi36fLvR2j5z3kSzVtz6IhPdncQ==", + "dev": true + } + } + }, + "inspect-parameters-declaration": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/inspect-parameters-declaration/-/inspect-parameters-declaration-0.0.9.tgz", + "integrity": "sha512-c3jrKKA1rwwrsjdGMAo2hFWV0vNe3/RKHxpE/OBt41LP3ynOVI1qmgxpZYK5SQu3jtWCyaho8L7AZzCjJ4mEUw==", + "dev": true, + "requires": { + "magicli": "0.0.5", + "split-skip": "0.0.2", + "stringify-parameters": "0.0.4", + "unpack-string": "0.0.2" + }, + "dependencies": { + "inspect-function": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/inspect-function/-/inspect-function-0.2.2.tgz", + "integrity": "sha512-becs5gzcHwPrlHawscYkyQ/ShiOiosrXPhA5RVZ3qyWH4aWdD52RnMfXq/dwQXciHwiieD8aIPwdIWYv6eL+sQ==", + "dev": true, + "requires": { + "split-skip": "0.0.1", + "unpack-string": "0.0.2" + }, + "dependencies": { + "split-skip": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/split-skip/-/split-skip-0.0.1.tgz", + "integrity": "sha512-7dkvq+gofI4M8zx4iZnEZ3O1s7FP4Y/iaIDHJh5RyWrs8idcPauFi2OZe3TBi36fLvR2j5z3kSzVtz6IhPdncQ==", + "dev": true + } + } + }, + "magicli": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/magicli/-/magicli-0.0.5.tgz", + "integrity": "sha512-wZbMtnl2v1b+Jp3xlqA9FU/O4I6YhGXR8xSY/eU2+gDAvut/F+W3gl4qs61iL4LELC7jqSAE6aAD5668EbmQHA==", + "dev": true, + "requires": { + "commander": "^2.9.0", + "get-stdin": "^5.0.1", + "inspect-function": "^0.2.1", + "pipe-functions": "^1.2.0" + } + } + } + }, + "inspect-property": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/inspect-property/-/inspect-property-0.0.6.tgz", + "integrity": "sha512-LgjHkRl9W6bj2n+kWrAOgvCYPTYt+LanE4rtd/vKNq6yEb+SvVV7UTLzoSPpDX6/U1cAz7VfqPr+lPAIz7wHaQ==", + "dev": true, + "requires": { + "for-each-property": "0.0.4", + "for-each-property-deep": "0.0.3", + "inspect-function": "^0.3.1" + } + }, + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, + "jiti": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.16.0.tgz", + "integrity": "sha512-L3BJStEf5NAqNuzrpfbN71dp43mYIcBUlCRea/vdyv5dW/AYa1d4bpelko4SHdY3I6eN9Wzyasxirj1/vv5kmg==", + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.9" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash.padend": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", + "integrity": "sha512-sOQs2aqGpbl27tmCS1QNZA09Uqp01ZzWfDUoD+xzTii0E7dSQfRKcRetFwa+uXaxaqL+TKm7CgD2JdKP7aZBSw==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "magicli": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/magicli/-/magicli-0.0.8.tgz", + "integrity": "sha512-x/eBenweAHF+DsYy172sK4doRxZl0yrJnfxhLJiN7H6hPM3Ya0PfI6uBZshZ3ScFFSQD7HXgBqMdbnXKEZsO1g==", + "dev": true, + "requires": { + "cliss": "0.0.2", + "find-up": "^2.1.0", + "for-each-property": "0.0.4", + "inspect-property": "0.0.6" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, + "node-abi": { + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.24.0.tgz", + "integrity": "sha512-YPG3Co0luSu6GwOBsmIdGW6Wx0NyNDLg/hriIyDllVsNwnI6UeqaWShxC3lbH4LtEQUgoLP3XR1ndXiDAWvmRw==", + "dev": true, + "requires": { + "semver": "^7.3.5" + } + }, + "node-addon-api": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz", + "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==", + "dev": true + }, + "node-fetch-native": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-0.1.5.tgz", + "integrity": "sha512-4NYY0JOTYFsahDjKy4gId6uuf7TPzkIDSDMuvtmlFd2Jf25tj9fQsDD5+kLdzM7sm6BbG8lL/154tdrsgN25Zw==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-to-arguments": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/object-to-arguments/-/object-to-arguments-0.0.8.tgz", + "integrity": "sha512-BfWfuAwuhdH1bhMG5EG90WE/eckkBhBvnke8eSEkCDXoLE9Jk5JwYGTbCx1ehGwV48HvBkn62VukPBdlMUOY9w==", + "dev": true, + "requires": { + "inspect-parameters-declaration": "0.0.10", + "magicli": "0.0.5", + "split-skip": "0.0.2", + "stringify-parameters": "0.0.4", + "unpack-string": "0.0.2" + }, + "dependencies": { + "inspect-function": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/inspect-function/-/inspect-function-0.2.2.tgz", + "integrity": "sha512-becs5gzcHwPrlHawscYkyQ/ShiOiosrXPhA5RVZ3qyWH4aWdD52RnMfXq/dwQXciHwiieD8aIPwdIWYv6eL+sQ==", + "dev": true, + "requires": { + "split-skip": "0.0.1", + "unpack-string": "0.0.2" + }, + "dependencies": { + "split-skip": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/split-skip/-/split-skip-0.0.1.tgz", + "integrity": "sha512-7dkvq+gofI4M8zx4iZnEZ3O1s7FP4Y/iaIDHJh5RyWrs8idcPauFi2OZe3TBi36fLvR2j5z3kSzVtz6IhPdncQ==", + "dev": true + } + } + }, + "inspect-parameters-declaration": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/inspect-parameters-declaration/-/inspect-parameters-declaration-0.0.10.tgz", + "integrity": "sha512-L8/Bvt9iDXQTZ63xY5/MAyvzz+FagR/qGh1kIXvUpsno3AAE0Z95d6QO51zrcMGaEGpwh/57idfMxTxbvRmytg==", + "dev": true, + "requires": { + "magicli": "0.0.5", + "split-skip": "0.0.2", + "stringify-parameters": "0.0.4", + "unpack-string": "0.0.2" + } + }, + "magicli": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/magicli/-/magicli-0.0.5.tgz", + "integrity": "sha512-wZbMtnl2v1b+Jp3xlqA9FU/O4I6YhGXR8xSY/eU2+gDAvut/F+W3gl4qs61iL4LELC7jqSAE6aAD5668EbmQHA==", + "dev": true, + "requires": { + "commander": "^2.9.0", + "get-stdin": "^5.0.1", + "inspect-function": "^0.2.1", + "pipe-functions": "^1.2.0" + } + } + } + }, + "ohmyfetch": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/ohmyfetch/-/ohmyfetch-0.4.19.tgz", + "integrity": "sha512-OH2xVeRPNsHkx+JFdq1ewe9EwVDfTrv6lsBHpIx8wIWXowP5FyLhhYVaXIVlPsW542rt7gmwK14FwIDWUXEO+Q==", + "dev": true, + "requires": { + "destr": "^1.1.1", + "node-fetch-native": "^0.1.5", + "ufo": "^0.8.5", + "undici": "^5.10.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "pipe-functions": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pipe-functions/-/pipe-functions-1.3.0.tgz", + "integrity": "sha512-6Rtbp7criZRwedlvWbUYxqlqJoAlMvYHo2UcRWq79xZ54vZcaNHpVBOcWkX3ErT2aUA69tv+uiv4zKJbhD/Wgg==", + "dev": true + }, + "prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dev": true, + "requires": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + } + }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "reduce-flatten": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz", + "integrity": "sha512-j5WfFJfc9CoXv/WbwVLHq74i/hdTUpy+iNC534LxczMRP67vJeK3V9JOdnL0N1cIRbn9mYhE2yVjvvKXDxvNXQ==", + "dev": true + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "sharp": { + "version": "0.30.7", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.30.7.tgz", + "integrity": "sha512-G+MY2YW33jgflKPTXXptVO28HvNOo9G3j0MybYAHeEmby+QuD2U98dT6ueht9cv/XDqZspSpIhoSW+BAKJ7Hig==", + "dev": true, + "requires": { + "color": "^4.2.3", + "detect-libc": "^2.0.1", + "node-addon-api": "^5.0.0", + "prebuild-install": "^7.1.1", + "semver": "^7.3.7", + "simple-get": "^4.0.1", + "tar-fs": "^2.1.1", + "tunnel-agent": "^0.6.0" + } + }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true + }, + "simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "requires": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + } + }, + "split-skip": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/split-skip/-/split-skip-0.0.2.tgz", + "integrity": "sha512-weHOi8BolsDnGIwhhWHbA+wKSuSpvWwjRrdj8SdbIIis2vSwOE37CQP8x3EleuzxanUr3AK8BdUy4MkiOULPZg==", + "dev": true + }, + "sponsorkit": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/sponsorkit/-/sponsorkit-0.5.2.tgz", + "integrity": "sha512-pCNUdiO5BF1OBvJdiuN+Z9wlxVuqZMOO9wsegUwfkS7wqOMZ18XbH6SG7sr+cRiyi6h7JE4iyThFEBb9dm4Jnw==", + "dev": true, + "requires": { + "consola": "^2.15.3", + "dotenv": "^16.0.1", + "fs-extra": "^10.1.0", + "image-data-uri": "^2.0.1", + "ohmyfetch": "^0.4.18", + "picocolors": "^1.0.0", + "sharp": "^0.30.7", + "unconfig": "^0.3.5", + "yargs": "^17.5.1" + } + }, + "sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "stringify-parameters": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stringify-parameters/-/stringify-parameters-0.0.4.tgz", + "integrity": "sha512-H3L90ERn5UPtkpO8eugnKcLgpIVlvTyUTrcLGm607AV5JDH6z0GymtNLr3gjGlP6I6NB/mxNX9QpY6jEQGLPdQ==", + "dev": true, + "requires": { + "magicli": "0.0.5", + "unpack-string": "0.0.2" + }, + "dependencies": { + "inspect-function": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/inspect-function/-/inspect-function-0.2.2.tgz", + "integrity": "sha512-becs5gzcHwPrlHawscYkyQ/ShiOiosrXPhA5RVZ3qyWH4aWdD52RnMfXq/dwQXciHwiieD8aIPwdIWYv6eL+sQ==", + "dev": true, + "requires": { + "split-skip": "0.0.1", + "unpack-string": "0.0.2" + } + }, + "magicli": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/magicli/-/magicli-0.0.5.tgz", + "integrity": "sha512-wZbMtnl2v1b+Jp3xlqA9FU/O4I6YhGXR8xSY/eU2+gDAvut/F+W3gl4qs61iL4LELC7jqSAE6aAD5668EbmQHA==", + "dev": true, + "requires": { + "commander": "^2.9.0", + "get-stdin": "^5.0.1", + "inspect-function": "^0.2.1", + "pipe-functions": "^1.2.0" + } + }, + "split-skip": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/split-skip/-/split-skip-0.0.1.tgz", + "integrity": "sha512-7dkvq+gofI4M8zx4iZnEZ3O1s7FP4Y/iaIDHJh5RyWrs8idcPauFi2OZe3TBi36fLvR2j5z3kSzVtz6IhPdncQ==", + "dev": true + } + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true + }, + "table-layout": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.5.tgz", + "integrity": "sha512-zTvf0mcggrGeTe/2jJ6ECkJHAQPIYEwDoqsiqBjI24mvRmQbInK5jq33fyypaCBxX08hMkfmdOqj6haT33EqWw==", + "dev": true, + "requires": { + "array-back": "^2.0.0", + "deep-extend": "~0.6.0", + "lodash.padend": "^4.6.1", + "typical": "^2.6.1", + "wordwrapjs": "^3.0.0" + } + }, + "tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, + "typical": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", + "integrity": "sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==", + "dev": true + }, + "ufo": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-0.8.5.tgz", + "integrity": "sha512-e4+UtA5IRO+ha6hYklwj6r7BjiGMxS0O+UaSg9HbaTefg4kMkzj4tXzEBajRR+wkxf+golgAWKzLbytCUDMJAA==", + "dev": true + }, + "unconfig": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/unconfig/-/unconfig-0.3.6.tgz", + "integrity": "sha512-JWefWyjLrDAbzs30sFkzcE9YpvAhN9+UPMZBwnNUmaY9X7QhI+wCGP4hoEWfZDzvkP+WIaZDPcMUJjarpxFvKg==", + "dev": true, + "requires": { + "@antfu/utils": "^0.5.2", + "defu": "^6.1.0", + "jiti": "^1.14.0" + } + }, + "undici": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.10.0.tgz", + "integrity": "sha512-c8HsD3IbwmjjbLvoZuRI26TZic+TSEe8FPMLLOkN1AfYRhdjnKBU6yL+IwcSCbdZiX4e5t0lfMDLDCqj4Sq70g==", + "dev": true + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "unpack-string": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/unpack-string/-/unpack-string-0.0.2.tgz", + "integrity": "sha512-2ZFjp5aY7QwHE6HAp47RnKYfvgAQ5+NwbKq/ZVtty85RDb3/UaTeCfizo5L/fXzM7UkMP/zDtbV+kGW/iJiK6w==", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "wordwrapjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz", + "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==", + "dev": true, + "requires": { + "reduce-flatten": "^1.0.1", + "typical": "^2.6.1" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yargs": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "dependencies": { + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + } + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha512-WhzC+xgstid9MbVUktco/bf+KJG+Uu6vMX0LN1sLJvwmbCQVxb4D8LzogobonKycNasCZLdOzTAk1SK7+K7swg==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..5af660375 --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "name": "release", + "version": "1.0.0", + "description": "", + "main": "sponsorkit.config.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "sponsorkit": "^0.5.2" + } +} From 3dee8a931a63935010f6c8077596db2242f48cee Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Tue, 20 Sep 2022 21:59:28 +1000 Subject: [PATCH 32/62] update sponsorkit generation --- .github/workflows/sponsorimage.yml | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/sponsorimage.yml b/.github/workflows/sponsorimage.yml index 1fafc7a84..a30a5fbfc 100644 --- a/.github/workflows/sponsorimage.yml +++ b/.github/workflows/sponsorimage.yml @@ -21,7 +21,7 @@ jobs: - run: npx pnpm i - name: Update sponsors - run: npm run build -- -o website/static/img/ + run: npm run build env: SPONSORKIT_GITHUB_TOKEN: ${{ secrets.SPONSORS_TOKEN }} SPONSORKIT_GITHUB_LOGIN: leaanthony diff --git a/package.json b/package.json index 5af660375..df4354e14 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "", "main": "sponsorkit.config.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "build": "npx sponsorkit -o website/static/img/" }, "keywords": [], "author": "", From f587457e7e69ce37a601ca3c47a22e805a2b312b Mon Sep 17 00:00:00 2001 From: Misite Bao Date: Tue, 20 Sep 2022 23:01:44 +0800 Subject: [PATCH 33/62] feat: remove documentation for "beta" and "rc" versions --- website/.prettierrc | 22 - .../version-v2.0.0-beta.44.json | 38 - .../version-v2.0.0-rc.1.json | 38 - .../version-v2.0.0-beta.44.json | 38 - .../version-v2.0.0-rc.1.json | 38 - .../appendix/_category_.json | 4 - .../community/_category_.json | 4 - .../version-v2.0.0-rc.1/community/links.mdx | 23 - .../community/showcase/_category_.json | 4 - .../community/showcase/emailit.mdx | 8 - .../community/showcase/encrypteasy.mdx | 10 - .../community/showcase/filehound.mdx | 14 - .../community/showcase/minecraftupdater.mdx | 10 - .../community/showcase/modalfilemanager.mdx | 12 - .../community/showcase/mollywallet.mdx | 8 - .../community/showcase/october.mdx | 12 - .../community/showcase/optimus.mdx | 8 - .../community/showcase/portfall.mdx | 8 - .../community/showcase/restic-browser.mdx | 10 - .../community/showcase/riftshare.mdx | 19 - .../community/showcase/scriptbar.mdx | 8 - .../community/showcase/surge.mdx | 8 - .../community/showcase/wally.mdx | 8 - .../community/showcase/wombat.mdx | 8 - .../community/showcase/ytd.mdx | 8 - .../community/templates.mdx | 52 -- .../gettingstarted/_category_.json | 4 - .../gettingstarted/building.mdx | 21 - .../gettingstarted/development.mdx | 16 - .../gettingstarted/firstproject.mdx | 130 ---- .../gettingstarted/installation.mdx | 90 --- .../guides/_category_.json | 4 - .../guides/application-development.mdx | 194 ----- .../guides/bleeding-edge.mdx | 55 -- .../guides/dynamic-assets.mdx | 126 --- .../version-v2.0.0-rc.1/guides/frameless.mdx | 84 -- .../version-v2.0.0-rc.1/guides/frontend.mdx | 75 -- .../version-v2.0.0-rc.1/guides/ides.mdx | 113 --- .../guides/linux-distro-support.mdx | 101 --- .../version-v2.0.0-rc.1/guides/linux.mdx | 18 - .../guides/manual-builds.mdx | 95 --- .../version-v2.0.0-rc.1/guides/migrating.mdx | 187 ----- .../guides/mouse-buttons.mdx | 25 - .../version-v2.0.0-rc.1/guides/overscroll.mdx | 10 - .../version-v2.0.0-rc.1/guides/routing.mdx | 47 -- .../version-v2.0.0-rc.1/guides/signing.mdx | 375 --------- .../version-v2.0.0-rc.1/guides/templates.mdx | 95 --- .../guides/troubleshooting.mdx | 137 ---- .../version-v2.0.0-rc.1/guides/vscode.mdx | 82 -- .../guides/windows-installer.mdx | 56 -- .../version-v2.0.0-rc.1/guides/windows.mdx | 61 -- .../version-v2.0.0-rc.1/howdoesitwork.mdx | 356 --------- .../version-v2.0.0-rc.1/introduction.mdx | 71 -- .../reference/_category_.json | 4 - .../version-v2.0.0-rc.1/reference/cli.mdx | 221 ------ .../version-v2.0.0-rc.1/reference/menus.mdx | 266 ------- .../version-v2.0.0-rc.1/reference/options.mdx | 627 --------------- .../reference/project-config.mdx | 51 -- .../reference/runtime/_category_.json | 4 - .../reference/runtime/browser.mdx | 14 - .../reference/runtime/dialog.mdx | 283 ------- .../reference/runtime/events.mdx | 38 - .../reference/runtime/intro.mdx | 73 -- .../reference/runtime/log.mdx | 130 ---- .../reference/runtime/menu.mdx | 23 - .../reference/runtime/window.mdx | 209 ----- .../tutorials/_category_.json | 4 - .../version-v2.0.0-rc.1/tutorials/dogsapi.mdx | 243 ------ .../tutorials/helloworld.mdx | 118 --- .../version-v2.0.0-beta.44.json | 38 - .../version-v2.0.0-rc.1.json | 38 - .../appendix/_category_.json | 4 - .../community/_category_.json | 4 - .../version-v2.0.0-rc.1/community/links.mdx | 23 - .../community/showcase/_category_.json | 4 - .../community/showcase/emailit.mdx | 8 - .../community/showcase/encrypteasy.mdx | 10 - .../community/showcase/filehound.mdx | 14 - .../community/showcase/minecraftupdater.mdx | 10 - .../community/showcase/modalfilemanager.mdx | 12 - .../community/showcase/mollywallet.mdx | 8 - .../community/showcase/october.mdx | 12 - .../community/showcase/optimus.mdx | 8 - .../community/showcase/portfall.mdx | 8 - .../community/showcase/restic-browser.mdx | 10 - .../community/showcase/riftshare.mdx | 19 - .../community/showcase/scriptbar.mdx | 8 - .../community/showcase/surge.mdx | 8 - .../community/showcase/wally.mdx | 8 - .../community/showcase/wombat.mdx | 8 - .../community/showcase/ytd.mdx | 8 - .../community/templates.mdx | 52 -- .../contributing/_category_.json | 4 - .../contributing/developing-new-features.mdx | 29 - .../contributing/documenting.mdx | 34 - .../contributing/fixing-bugs.mdx | 27 - .../contributing/helping-others.mdx | 13 - .../setting-up-a-dev-environment.mdx | 30 - .../contributing/testing.mdx | 16 - .../contributing/ways-of-contributing.mdx | 18 - .../gettingstarted/_category_.json | 4 - .../gettingstarted/building.mdx | 21 - .../gettingstarted/development.mdx | 16 - .../gettingstarted/firstproject.mdx | 132 ---- .../gettingstarted/installation.mdx | 95 --- .../guides/_category_.json | 4 - .../guides/application-development.mdx | 194 ----- .../guides/bleeding-edge.mdx | 55 -- .../guides/dynamic-assets.mdx | 126 --- .../version-v2.0.0-rc.1/guides/frameless.mdx | 84 -- .../version-v2.0.0-rc.1/guides/frontend.mdx | 72 -- .../version-v2.0.0-rc.1/guides/ides.mdx | 125 --- .../guides/linux-distro-support.mdx | 101 --- .../version-v2.0.0-rc.1/guides/linux.mdx | 18 - .../guides/manual-builds.mdx | 95 --- .../version-v2.0.0-rc.1/guides/migrating.mdx | 187 ----- .../guides/mouse-buttons.mdx | 25 - .../version-v2.0.0-rc.1/guides/overscroll.mdx | 10 - .../version-v2.0.0-rc.1/guides/routing.mdx | 47 -- .../version-v2.0.0-rc.1/guides/signing.mdx | 379 --------- .../version-v2.0.0-rc.1/guides/templates.mdx | 95 --- .../guides/troubleshooting.mdx | 142 ---- .../version-v2.0.0-rc.1/guides/vscode.mdx | 82 -- .../guides/windows-installer.mdx | 56 -- .../version-v2.0.0-rc.1/guides/windows.mdx | 61 -- .../version-v2.0.0-rc.1/howdoesitwork.mdx | 355 --------- .../version-v2.0.0-rc.1/introduction.mdx | 71 -- .../reference/_category_.json | 4 - .../version-v2.0.0-rc.1/reference/cli.mdx | 221 ------ .../version-v2.0.0-rc.1/reference/menus.mdx | 261 ------- .../version-v2.0.0-rc.1/reference/options.mdx | 633 --------------- .../reference/project-config.mdx | 51 -- .../reference/runtime/_category_.json | 4 - .../reference/runtime/browser.mdx | 14 - .../reference/runtime/dialog.mdx | 283 ------- .../reference/runtime/events.mdx | 38 - .../reference/runtime/intro.mdx | 73 -- .../reference/runtime/log.mdx | 130 ---- .../reference/runtime/menu.mdx | 23 - .../reference/runtime/window.mdx | 211 ----- .../tutorials/_category_.json | 4 - .../version-v2.0.0-rc.1/tutorials/dogsapi.mdx | 243 ------ .../tutorials/helloworld.mdx | 118 --- .../version-v2.0.0-beta.44.json | 38 - .../version-v2.0.0-rc.1.json | 38 - .../appendix/_category_.json | 4 - .../community/_category_.json | 4 - .../version-v2.0.0-rc.1/community/links.mdx | 23 - .../community/showcase/_category_.json | 4 - .../community/showcase/emailit.mdx | 8 - .../community/showcase/encrypteasy.mdx | 10 - .../community/showcase/filehound.mdx | 14 - .../community/showcase/minecraftupdater.mdx | 10 - .../community/showcase/modalfilemanager.mdx | 12 - .../community/showcase/mollywallet.mdx | 8 - .../community/showcase/october.mdx | 12 - .../community/showcase/optimus.mdx | 8 - .../community/showcase/portfall.mdx | 8 - .../community/showcase/restic-browser.mdx | 10 - .../community/showcase/riftshare.mdx | 19 - .../community/showcase/scriptbar.mdx | 8 - .../community/showcase/surge.mdx | 8 - .../community/showcase/wally.mdx | 8 - .../community/showcase/wombat.mdx | 8 - .../community/showcase/ytd.mdx | 8 - .../community/templates.mdx | 52 -- .../gettingstarted/_category_.json | 4 - .../gettingstarted/building.mdx | 21 - .../gettingstarted/development.mdx | 16 - .../gettingstarted/firstproject.mdx | 130 ---- .../gettingstarted/installation.mdx | 90 --- .../guides/_category_.json | 4 - .../guides/application-development.mdx | 194 ----- .../guides/bleeding-edge.mdx | 55 -- .../guides/dynamic-assets.mdx | 126 --- .../version-v2.0.0-rc.1/guides/frameless.mdx | 84 -- .../version-v2.0.0-rc.1/guides/frontend.mdx | 75 -- .../version-v2.0.0-rc.1/guides/ides.mdx | 113 --- .../guides/linux-distro-support.mdx | 101 --- .../version-v2.0.0-rc.1/guides/linux.mdx | 18 - .../guides/manual-builds.mdx | 95 --- .../version-v2.0.0-rc.1/guides/migrating.mdx | 189 ----- .../guides/mouse-buttons.mdx | 25 - .../version-v2.0.0-rc.1/guides/overscroll.mdx | 10 - .../version-v2.0.0-rc.1/guides/routing.mdx | 47 -- .../version-v2.0.0-rc.1/guides/signing.mdx | 377 --------- .../version-v2.0.0-rc.1/guides/templates.mdx | 95 --- .../guides/troubleshooting.mdx | 137 ---- .../version-v2.0.0-rc.1/guides/vscode.mdx | 82 -- .../guides/windows-installer.mdx | 56 -- .../version-v2.0.0-rc.1/guides/windows.mdx | 61 -- .../version-v2.0.0-rc.1/howdoesitwork.mdx | 356 --------- .../version-v2.0.0-rc.1/introduction.mdx | 71 -- .../reference/_category_.json | 4 - .../version-v2.0.0-rc.1/reference/cli.mdx | 221 ------ .../version-v2.0.0-rc.1/reference/menus.mdx | 266 ------- .../version-v2.0.0-rc.1/reference/options.mdx | 627 --------------- .../reference/project-config.mdx | 51 -- .../reference/runtime/_category_.json | 4 - .../reference/runtime/browser.mdx | 14 - .../reference/runtime/dialog.mdx | 283 ------- .../reference/runtime/events.mdx | 38 - .../reference/runtime/intro.mdx | 73 -- .../reference/runtime/log.mdx | 130 ---- .../reference/runtime/menu.mdx | 23 - .../reference/runtime/window.mdx | 211 ----- .../tutorials/_category_.json | 4 - .../version-v2.0.0-rc.1/tutorials/dogsapi.mdx | 243 ------ .../tutorials/helloworld.mdx | 118 --- .../version-v2.0.0-beta.44.json | 38 - .../version-v2.0.0-rc.1.json | 38 - .../appendix/_category_.json | 4 - .../community/_category_.json | 4 - .../version-v2.0.0-rc.1/community/links.mdx | 23 - .../community/showcase/_category_.json | 4 - .../community/showcase/emailit.mdx | 8 - .../community/showcase/encrypteasy.mdx | 10 - .../community/showcase/filehound.mdx | 14 - .../community/showcase/minecraftupdater.mdx | 10 - .../community/showcase/modalfilemanager.mdx | 12 - .../community/showcase/mollywallet.mdx | 8 - .../community/showcase/october.mdx | 12 - .../community/showcase/optimus.mdx | 8 - .../community/showcase/portfall.mdx | 8 - .../community/showcase/restic-browser.mdx | 10 - .../community/showcase/riftshare.mdx | 19 - .../community/showcase/scriptbar.mdx | 8 - .../community/showcase/surge.mdx | 8 - .../community/showcase/wally.mdx | 8 - .../community/showcase/wombat.mdx | 8 - .../community/showcase/ytd.mdx | 8 - .../community/templates.mdx | 52 -- .../contributing/developing-new-features.mdx | 34 - .../contributing/documenting.mdx | 34 - .../contributing/fixing-bugs.mdx | 29 - .../setting-up-a-dev-environment.mdx | 30 - .../contributing/ways-of-contributing.mdx | 18 - .../gettingstarted/_category_.json | 4 - .../gettingstarted/building.mdx | 21 - .../gettingstarted/development.mdx | 16 - .../gettingstarted/firstproject.mdx | 132 ---- .../gettingstarted/installation.mdx | 109 --- .../guides/_category_.json | 4 - .../guides/application-development.mdx | 194 ----- .../guides/bleeding-edge.mdx | 55 -- .../guides/dynamic-assets.mdx | 130 ---- .../version-v2.0.0-rc.1/guides/frameless.mdx | 84 -- .../version-v2.0.0-rc.1/guides/frontend.mdx | 72 -- .../version-v2.0.0-rc.1/guides/ides.mdx | 110 --- .../guides/linux-distro-support.mdx | 101 --- .../version-v2.0.0-rc.1/guides/linux.mdx | 18 - .../guides/manual-builds.mdx | 95 --- .../version-v2.0.0-rc.1/guides/migrating.mdx | 205 ----- .../guides/mouse-buttons.mdx | 25 - .../version-v2.0.0-rc.1/guides/overscroll.mdx | 10 - .../version-v2.0.0-rc.1/guides/routing.mdx | 49 -- .../version-v2.0.0-rc.1/guides/signing.mdx | 575 -------------- .../version-v2.0.0-rc.1/guides/templates.mdx | 102 --- .../guides/troubleshooting.mdx | 142 ---- .../version-v2.0.0-rc.1/guides/vscode.mdx | 118 --- .../guides/windows-installer.mdx | 56 -- .../version-v2.0.0-rc.1/guides/windows.mdx | 61 -- .../version-v2.0.0-rc.1/howdoesitwork.mdx | 435 ----------- .../version-v2.0.0-rc.1/introduction.mdx | 71 -- .../reference/_category_.json | 4 - .../version-v2.0.0-rc.1/reference/cli.mdx | 252 ------ .../version-v2.0.0-rc.1/reference/menus.mdx | 277 ------- .../version-v2.0.0-rc.1/reference/options.mdx | 644 --------------- .../reference/project-config.mdx | 63 -- .../reference/runtime/_category_.json | 4 - .../reference/runtime/browser.mdx | 14 - .../reference/runtime/dialog.mdx | 283 ------- .../reference/runtime/events.mdx | 38 - .../reference/runtime/intro.mdx | 73 -- .../reference/runtime/log.mdx | 130 ---- .../reference/runtime/menu.mdx | 24 - .../reference/runtime/window.mdx | 213 ----- .../tutorials/_category_.json | 4 - .../version-v2.0.0-rc.1/tutorials/dogsapi.mdx | 243 ------ .../tutorials/helloworld.mdx | 117 --- .../appendix/_category_.json | 4 - .../community/_category_.json | 4 - .../community/links.mdx | 24 - .../community/showcase/_category_.json | 4 - .../community/showcase/emailit.mdx | 8 - .../community/showcase/encrypteasy.mdx | 10 - .../community/showcase/filehound.mdx | 23 - .../community/showcase/modalfilemanager.mdx | 10 - .../community/showcase/mollywallet.mdx | 9 - .../community/showcase/october.mdx | 11 - .../community/showcase/optimus.mdx | 9 - .../community/showcase/portfall.mdx | 9 - .../community/showcase/restic-browser.mdx | 11 - .../community/showcase/riftshare.mdx | 19 - .../community/showcase/scriptbar.mdx | 7 - .../community/showcase/surge.mdx | 9 - .../community/showcase/wally.mdx | 9 - .../community/showcase/wombat.mdx | 10 - .../community/showcase/ytd.mdx | 10 - .../community/templates.mdx | 49 -- .../contributing/_category_.json | 4 - .../contributing/developing-new-features.mdx | 35 - .../contributing/documenting.mdx | 39 - .../contributing/fixing-bugs.mdx | 30 - .../contributing/helping-others.mdx | 17 - .../setting-up-a-dev-environment.mdx | 34 - .../contributing/testing.mdx | 21 - .../contributing/ways-of-contributing.mdx | 22 - .../gettingstarted/_category_.json | 4 - .../gettingstarted/building.mdx | 19 - .../gettingstarted/development.mdx | 16 - .../gettingstarted/firstproject.mdx | 125 --- .../gettingstarted/installation.mdx | 95 --- .../guides/_category_.json | 4 - .../guides/application-development.mdx | 231 ------ .../guides/bleeding-edge.mdx | 54 -- .../guides/dynamic-assets.mdx | 123 --- .../guides/frameless.mdx | 47 -- .../guides/frontend.mdx | 77 -- .../version-v2.0.0-beta.44/guides/ides.mdx | 114 --- .../guides/linux-distro-support.mdx | 108 --- .../version-v2.0.0-beta.44/guides/linux.mdx | 20 - .../guides/manual-builds.mdx | 99 --- .../guides/migrating.mdx | 206 ----- .../guides/mouse-buttons.mdx | 28 - .../guides/overscroll.mdx | 11 - .../version-v2.0.0-beta.44/guides/routing.mdx | 47 -- .../version-v2.0.0-beta.44/guides/signing.mdx | 386 --------- .../guides/templates.mdx | 95 --- .../guides/troubleshooting.mdx | 111 --- .../guides/windows-installer.mdx | 51 -- .../version-v2.0.0-beta.44/guides/windows.mdx | 71 -- .../version-v2.0.0-beta.44/howdoesitwork.mdx | 403 ---------- .../version-v2.0.0-beta.44/introduction.mdx | 78 -- .../reference/_category_.json | 4 - .../version-v2.0.0-beta.44/reference/cli.mdx | 227 ------ .../reference/menus.mdx | 271 ------- .../reference/options.mdx | 732 ------------------ .../reference/project-config.mdx | 52 -- .../reference/runtime/_category_.json | 4 - .../reference/runtime/browser.mdx | 20 - .../reference/runtime/dialog.mdx | 263 ------- .../reference/runtime/events.mdx | 51 -- .../reference/runtime/intro.mdx | 70 -- .../reference/runtime/log.mdx | 153 ---- .../reference/runtime/menu.mdx | 25 - .../reference/runtime/window.mdx | 224 ------ .../tutorials/_category_.json | 4 - .../tutorials/helloworld.mdx | 113 --- .../appendix/_category_.json | 4 - .../community/_category_.json | 4 - .../version-v2.0.0-rc.1/community/links.mdx | 24 - .../community/showcase/_category_.json | 4 - .../community/showcase/emailit.mdx | 8 - .../community/showcase/encrypteasy.mdx | 10 - .../community/showcase/filehound.mdx | 22 - .../community/showcase/minecraftupdater.mdx | 10 - .../community/showcase/modalfilemanager.mdx | 12 - .../community/showcase/mollywallet.mdx | 8 - .../community/showcase/october.mdx | 12 - .../community/showcase/optimus.mdx | 8 - .../community/showcase/portfall.mdx | 8 - .../community/showcase/restic-browser.mdx | 10 - .../community/showcase/riftshare.mdx | 19 - .../community/showcase/scriptbar.mdx | 8 - .../community/showcase/surge.mdx | 8 - .../community/showcase/wally.mdx | 8 - .../community/showcase/wombat.mdx | 8 - .../community/showcase/ytd.mdx | 8 - .../community/templates.mdx | 53 -- .../gettingstarted/_category_.json | 4 - .../gettingstarted/building.mdx | 21 - .../gettingstarted/development.mdx | 16 - .../gettingstarted/firstproject.mdx | 134 ---- .../gettingstarted/installation.mdx | 98 --- .../guides/_category_.json | 4 - .../guides/application-development.mdx | 228 ------ .../guides/bleeding-edge.mdx | 61 -- .../guides/dynamic-assets.mdx | 133 ---- .../version-v2.0.0-rc.1/guides/frameless.mdx | 89 --- .../version-v2.0.0-rc.1/guides/frontend.mdx | 73 -- .../version-v2.0.0-rc.1/guides/ides.mdx | 129 --- .../guides/linux-distro-support.mdx | 108 --- .../version-v2.0.0-rc.1/guides/linux.mdx | 20 - .../guides/manual-builds.mdx | 98 --- .../version-v2.0.0-rc.1/guides/migrating.mdx | 204 ----- .../guides/mouse-buttons.mdx | 27 - .../version-v2.0.0-rc.1/guides/obfuscated.mdx | 43 - .../version-v2.0.0-rc.1/guides/overscroll.mdx | 11 - .../version-v2.0.0-rc.1/guides/routing.mdx | 47 -- .../version-v2.0.0-rc.1/guides/signing.mdx | 411 ---------- .../version-v2.0.0-rc.1/guides/templates.mdx | 97 --- .../guides/troubleshooting.mdx | 159 ---- .../version-v2.0.0-rc.1/guides/vscode.mdx | 85 -- .../guides/windows-installer.mdx | 58 -- .../version-v2.0.0-rc.1/guides/windows.mdx | 71 -- .../version-v2.0.0-rc.1/howdoesitwork.mdx | 405 ---------- .../version-v2.0.0-rc.1/introduction.mdx | 90 --- .../reference/_category_.json | 4 - .../version-v2.0.0-rc.1/reference/cli.mdx | 226 ------ .../version-v2.0.0-rc.1/reference/menus.mdx | 271 ------- .../version-v2.0.0-rc.1/reference/options.mdx | 668 ---------------- .../reference/project-config.mdx | 54 -- .../reference/runtime/_category_.json | 4 - .../reference/runtime/browser.mdx | 15 - .../reference/runtime/dialog.mdx | 284 ------- .../reference/runtime/events.mdx | 45 -- .../reference/runtime/intro.mdx | 92 --- .../reference/runtime/log.mdx | 142 ---- .../reference/runtime/menu.mdx | 23 - .../reference/runtime/window.mdx | 243 ------ .../tutorials/_category_.json | 4 - .../version-v2.0.0-rc.1/tutorials/dogsapi.mdx | 248 ------ .../tutorials/helloworld.mdx | 120 --- .../version-v2.0.0-beta.44-sidebars.json | 8 - .../version-v2.0.0-rc.1-sidebars.json | 13 - website/versions.json | 5 +- 417 files changed, 1 insertion(+), 32855 deletions(-) delete mode 100644 website/.prettierrc delete mode 100644 website/i18n/en/docusaurus-plugin-content-docs/version-v2.0.0-beta.44.json delete mode 100644 website/i18n/en/docusaurus-plugin-content-docs/version-v2.0.0-rc.1.json delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-beta.44.json delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1.json delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/appendix/_category_.json delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/_category_.json delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/links.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/_category_.json delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/emailit.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/encrypteasy.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/filehound.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/minecraftupdater.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/modalfilemanager.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/mollywallet.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/october.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/optimus.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/portfall.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/restic-browser.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/riftshare.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/scriptbar.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/surge.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/wally.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/wombat.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/ytd.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/templates.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/_category_.json delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/building.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/development.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/firstproject.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/installation.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/_category_.json delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/application-development.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/bleeding-edge.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/dynamic-assets.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/frameless.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/frontend.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/ides.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/linux-distro-support.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/linux.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/manual-builds.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/migrating.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/mouse-buttons.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/overscroll.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/routing.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/signing.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/templates.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/troubleshooting.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/vscode.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/windows-installer.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/windows.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/howdoesitwork.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/introduction.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/_category_.json delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/cli.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/menus.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/options.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/project-config.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/_category_.json delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/browser.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/dialog.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/events.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/intro.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/log.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/menu.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/window.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/_category_.json delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/dogsapi.mdx delete mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/helloworld.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-beta.44.json delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1.json delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/appendix/_category_.json delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/_category_.json delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/links.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/_category_.json delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/emailit.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/encrypteasy.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/filehound.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/minecraftupdater.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/modalfilemanager.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/mollywallet.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/october.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/optimus.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/portfall.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/restic-browser.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/riftshare.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/scriptbar.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/surge.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/wally.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/wombat.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/ytd.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/templates.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/_category_.json delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/developing-new-features.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/documenting.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/fixing-bugs.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/helping-others.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/setting-up-a-dev-environment.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/testing.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/ways-of-contributing.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/_category_.json delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/building.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/development.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/firstproject.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/installation.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/_category_.json delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/application-development.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/bleeding-edge.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/dynamic-assets.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/frameless.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/frontend.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/ides.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/linux-distro-support.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/linux.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/manual-builds.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/migrating.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/mouse-buttons.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/overscroll.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/routing.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/signing.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/templates.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/troubleshooting.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/vscode.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/windows-installer.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/windows.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/howdoesitwork.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/introduction.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/_category_.json delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/cli.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/menus.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/options.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/project-config.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/_category_.json delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/browser.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/dialog.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/events.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/intro.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/log.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/menu.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/window.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/_category_.json delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/dogsapi.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/helloworld.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-beta.44.json delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1.json delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/appendix/_category_.json delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/_category_.json delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/links.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/_category_.json delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/emailit.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/encrypteasy.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/filehound.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/minecraftupdater.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/modalfilemanager.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/mollywallet.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/october.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/optimus.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/portfall.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/restic-browser.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/riftshare.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/scriptbar.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/surge.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/wally.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/wombat.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/ytd.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/templates.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/_category_.json delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/building.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/development.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/firstproject.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/installation.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/_category_.json delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/application-development.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/bleeding-edge.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/dynamic-assets.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/frameless.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/frontend.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/ides.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/linux-distro-support.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/linux.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/manual-builds.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/migrating.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/mouse-buttons.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/overscroll.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/routing.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/signing.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/templates.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/troubleshooting.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/vscode.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/windows-installer.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/windows.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/howdoesitwork.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/introduction.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/_category_.json delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/cli.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/menus.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/options.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/project-config.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/_category_.json delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/browser.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/dialog.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/events.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/intro.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/log.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/menu.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/window.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/_category_.json delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/dogsapi.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/helloworld.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-beta.44.json delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1.json delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/appendix/_category_.json delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/_category_.json delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/links.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/_category_.json delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/emailit.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/encrypteasy.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/filehound.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/minecraftupdater.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/modalfilemanager.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/mollywallet.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/october.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/optimus.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/portfall.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/restic-browser.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/riftshare.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/scriptbar.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/surge.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/wally.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/wombat.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/ytd.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/templates.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/developing-new-features.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/documenting.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/fixing-bugs.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/setting-up-a-dev-environment.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/ways-of-contributing.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/_category_.json delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/building.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/development.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/firstproject.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/installation.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/_category_.json delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/application-development.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/bleeding-edge.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/dynamic-assets.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/frameless.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/frontend.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/ides.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/linux-distro-support.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/linux.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/manual-builds.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/migrating.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/mouse-buttons.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/overscroll.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/routing.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/signing.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/templates.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/troubleshooting.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/vscode.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/windows-installer.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/windows.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/howdoesitwork.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/introduction.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/_category_.json delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/cli.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/menus.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/options.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/project-config.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/_category_.json delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/browser.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/dialog.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/events.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/intro.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/log.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/menu.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/window.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/_category_.json delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/dogsapi.mdx delete mode 100644 website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/helloworld.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/appendix/_category_.json delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/community/_category_.json delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/community/links.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/community/showcase/_category_.json delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/community/showcase/emailit.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/community/showcase/encrypteasy.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/community/showcase/filehound.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/community/showcase/modalfilemanager.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/community/showcase/mollywallet.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/community/showcase/october.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/community/showcase/optimus.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/community/showcase/portfall.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/community/showcase/restic-browser.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/community/showcase/riftshare.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/community/showcase/scriptbar.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/community/showcase/surge.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/community/showcase/wally.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/community/showcase/wombat.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/community/showcase/ytd.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/community/templates.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/contributing/_category_.json delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/contributing/developing-new-features.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/contributing/documenting.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/contributing/fixing-bugs.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/contributing/helping-others.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/contributing/setting-up-a-dev-environment.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/contributing/testing.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/contributing/ways-of-contributing.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/gettingstarted/_category_.json delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/gettingstarted/building.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/gettingstarted/development.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/gettingstarted/firstproject.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/gettingstarted/installation.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/guides/_category_.json delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/guides/application-development.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/guides/bleeding-edge.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/guides/dynamic-assets.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/guides/frameless.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/guides/frontend.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/guides/ides.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/guides/linux-distro-support.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/guides/linux.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/guides/manual-builds.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/guides/migrating.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/guides/mouse-buttons.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/guides/overscroll.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/guides/routing.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/guides/signing.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/guides/templates.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/guides/troubleshooting.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/guides/windows-installer.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/guides/windows.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/howdoesitwork.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/introduction.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/reference/_category_.json delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/reference/cli.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/reference/menus.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/reference/options.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/reference/project-config.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/reference/runtime/_category_.json delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/reference/runtime/browser.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/reference/runtime/dialog.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/reference/runtime/events.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/reference/runtime/intro.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/reference/runtime/log.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/reference/runtime/menu.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/reference/runtime/window.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/tutorials/_category_.json delete mode 100644 website/versioned_docs/version-v2.0.0-beta.44/tutorials/helloworld.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/appendix/_category_.json delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/community/_category_.json delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/community/links.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/community/showcase/_category_.json delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/community/showcase/emailit.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/community/showcase/encrypteasy.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/community/showcase/filehound.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/community/showcase/minecraftupdater.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/community/showcase/modalfilemanager.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/community/showcase/mollywallet.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/community/showcase/october.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/community/showcase/optimus.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/community/showcase/portfall.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/community/showcase/restic-browser.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/community/showcase/riftshare.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/community/showcase/scriptbar.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/community/showcase/surge.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/community/showcase/wally.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/community/showcase/wombat.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/community/showcase/ytd.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/community/templates.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/gettingstarted/_category_.json delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/gettingstarted/building.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/gettingstarted/development.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/gettingstarted/firstproject.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/gettingstarted/installation.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/guides/_category_.json delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/guides/application-development.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/guides/bleeding-edge.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/guides/dynamic-assets.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/guides/frameless.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/guides/frontend.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/guides/ides.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/guides/linux-distro-support.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/guides/linux.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/guides/manual-builds.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/guides/migrating.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/guides/mouse-buttons.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/guides/obfuscated.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/guides/overscroll.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/guides/routing.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/guides/signing.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/guides/templates.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/guides/troubleshooting.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/guides/vscode.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/guides/windows-installer.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/guides/windows.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/howdoesitwork.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/introduction.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/reference/_category_.json delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/reference/cli.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/reference/menus.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/reference/options.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/reference/project-config.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/reference/runtime/_category_.json delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/reference/runtime/browser.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/reference/runtime/dialog.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/reference/runtime/events.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/reference/runtime/intro.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/reference/runtime/log.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/reference/runtime/menu.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/reference/runtime/window.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/tutorials/_category_.json delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/tutorials/dogsapi.mdx delete mode 100644 website/versioned_docs/version-v2.0.0-rc.1/tutorials/helloworld.mdx delete mode 100644 website/versioned_sidebars/version-v2.0.0-beta.44-sidebars.json delete mode 100644 website/versioned_sidebars/version-v2.0.0-rc.1-sidebars.json diff --git a/website/.prettierrc b/website/.prettierrc deleted file mode 100644 index 9c1c6d2d4..000000000 --- a/website/.prettierrc +++ /dev/null @@ -1,22 +0,0 @@ -{ - "arrowParens": "always", - "bracketSpacing": true, - "endOfLine": "lf", - "htmlWhitespaceSensitivity": "css", - "insertPragma": false, - "singleAttributePerLine": false, - "bracketSameLine": false, - "jsxBracketSameLine": false, - "jsxSingleQuote": false, - "printWidth": 80, - "proseWrap": "preserve", - "quoteProps": "as-needed", - "requirePragma": false, - "semi": true, - "singleQuote": false, - "tabWidth": 2, - "trailingComma": "es5", - "useTabs": false, - "vueIndentScriptAndStyle": false, - "parser": "mdx" -} diff --git a/website/i18n/en/docusaurus-plugin-content-docs/version-v2.0.0-beta.44.json b/website/i18n/en/docusaurus-plugin-content-docs/version-v2.0.0-beta.44.json deleted file mode 100644 index b6f38500b..000000000 --- a/website/i18n/en/docusaurus-plugin-content-docs/version-v2.0.0-beta.44.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "version.label": { - "message": "v2.0.0-beta.44", - "description": "The label for version v2.0.0-beta.44" - }, - "sidebar.tutorialSidebar.category.Getting Started": { - "message": "Getting Started", - "description": "The label for category Getting Started in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Reference": { - "message": "Reference", - "description": "The label for category Reference in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Runtime": { - "message": "Runtime", - "description": "The label for category Runtime in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Community": { - "message": "Community", - "description": "The label for category Community in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Showcase": { - "message": "Showcase", - "description": "The label for category Showcase in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Guides": { - "message": "Guides", - "description": "The label for category Guides in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Tutorials": { - "message": "Tutorials", - "description": "The label for category Tutorials in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Contributing": { - "message": "Contributing", - "description": "The label for category Contributing in sidebar tutorialSidebar" - } -} diff --git a/website/i18n/en/docusaurus-plugin-content-docs/version-v2.0.0-rc.1.json b/website/i18n/en/docusaurus-plugin-content-docs/version-v2.0.0-rc.1.json deleted file mode 100644 index 49cf4687e..000000000 --- a/website/i18n/en/docusaurus-plugin-content-docs/version-v2.0.0-rc.1.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "version.label": { - "message": "v2.0.0-rc.1", - "description": "The label for version v2.0.0-rc.1" - }, - "sidebar.docs.category.Getting Started": { - "message": "Getting Started", - "description": "The label for category Getting Started in sidebar docs" - }, - "sidebar.docs.category.Reference": { - "message": "Reference", - "description": "The label for category Reference in sidebar docs" - }, - "sidebar.docs.category.Runtime": { - "message": "Runtime", - "description": "The label for category Runtime in sidebar docs" - }, - "sidebar.docs.category.Community": { - "message": "Community", - "description": "The label for category Community in sidebar docs" - }, - "sidebar.docs.category.Showcase": { - "message": "Showcase", - "description": "The label for category Showcase in sidebar docs" - }, - "sidebar.docs.category.Guides": { - "message": "Guides", - "description": "The label for category Guides in sidebar docs" - }, - "sidebar.docs.category.Tutorials": { - "message": "Tutorials", - "description": "The label for category Tutorials in sidebar docs" - }, - "sidebar.docs.link.Contributing": { - "message": "Contributing", - "description": "The label for link Contributing in sidebar docs, linking to /community-guide#ways-of-contributing" - } -} diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-beta.44.json b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-beta.44.json deleted file mode 100644 index b6f38500b..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-beta.44.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "version.label": { - "message": "v2.0.0-beta.44", - "description": "The label for version v2.0.0-beta.44" - }, - "sidebar.tutorialSidebar.category.Getting Started": { - "message": "Getting Started", - "description": "The label for category Getting Started in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Reference": { - "message": "Reference", - "description": "The label for category Reference in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Runtime": { - "message": "Runtime", - "description": "The label for category Runtime in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Community": { - "message": "Community", - "description": "The label for category Community in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Showcase": { - "message": "Showcase", - "description": "The label for category Showcase in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Guides": { - "message": "Guides", - "description": "The label for category Guides in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Tutorials": { - "message": "Tutorials", - "description": "The label for category Tutorials in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Contributing": { - "message": "Contributing", - "description": "The label for category Contributing in sidebar tutorialSidebar" - } -} diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1.json b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1.json deleted file mode 100644 index 49cf4687e..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "version.label": { - "message": "v2.0.0-rc.1", - "description": "The label for version v2.0.0-rc.1" - }, - "sidebar.docs.category.Getting Started": { - "message": "Getting Started", - "description": "The label for category Getting Started in sidebar docs" - }, - "sidebar.docs.category.Reference": { - "message": "Reference", - "description": "The label for category Reference in sidebar docs" - }, - "sidebar.docs.category.Runtime": { - "message": "Runtime", - "description": "The label for category Runtime in sidebar docs" - }, - "sidebar.docs.category.Community": { - "message": "Community", - "description": "The label for category Community in sidebar docs" - }, - "sidebar.docs.category.Showcase": { - "message": "Showcase", - "description": "The label for category Showcase in sidebar docs" - }, - "sidebar.docs.category.Guides": { - "message": "Guides", - "description": "The label for category Guides in sidebar docs" - }, - "sidebar.docs.category.Tutorials": { - "message": "Tutorials", - "description": "The label for category Tutorials in sidebar docs" - }, - "sidebar.docs.link.Contributing": { - "message": "Contributing", - "description": "The label for link Contributing in sidebar docs, linking to /community-guide#ways-of-contributing" - } -} diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/appendix/_category_.json b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/appendix/_category_.json deleted file mode 100644 index 83af4ca28..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/appendix/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Appendix", - "position": 70 -} diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/_category_.json b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/_category_.json deleted file mode 100644 index 524986e1e..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Community", - "position": 50 -} diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/links.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/links.mdx deleted file mode 100644 index 4a3a89e87..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/links.mdx +++ /dev/null @@ -1,23 +0,0 @@ ---- -sidebar_position: 2 ---- - -# Links - -This page serves as a list for community related links. Please submit a PR (click `Edit this page` at the bottom) to submit links. - -## Awesome Wails - -The [definitive list](https://github.com/wailsapp/awesome-wails) of links related to Wails. - -## Support Channels - -- [Gophers Slack Channel](https://gophers.slack.com/messages/CJ4P9F7MZ/) -- [Gophers Slack Channel Invite](https://invite.slack.golangbridge.org/) -- [Github Issues](https://github.com/wailsapp/wails/issues) -- [v2 Beta Discussion Board](https://github.com/wailsapp/wails/discussions/828) - -## Social Media - -- [Twitter](https://twitter.com/wailsapp) -- [Wails Chinese Community QQ Group](https://qm.qq.com/cgi-bin/qm/qr?k=PmIURne5hFGNd7QWzW5qd6FV-INEjNJv&jump_from=webapi) - Group number: 1067173054 diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/_category_.json b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/_category_.json deleted file mode 100644 index 276e283b7..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Showcase", - "position": 1 -} diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/emailit.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/emailit.mdx deleted file mode 100644 index 4a1ebe835..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/emailit.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# EmailIt - -

- -
-

- -[EmailIt](https://github.com/raguay/EmailIt/) is a Wails 2 program that is a markdown based email sender only with nine notepads, scripts to manipulate the text, and templates. It also has a builtin [Node-Red](https://nodered.org/) server, scripts terminal, and the [ScriptBar](https://github.com/raguay/ScriptBarApp) program for displaying results from Node-Red or a script on your system. Documentation is very scarce, but the programs works. It’s built using Wails2 and Svelte, and the download is a universal macOS application. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/encrypteasy.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/encrypteasy.mdx deleted file mode 100644 index 13c2d8345..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/encrypteasy.mdx +++ /dev/null @@ -1,10 +0,0 @@ -# EncryptEasy - -

- -
-

- -**[EncryptEasy](https://www.encrypteasy.app) is a simple and easy to use PGP encryption tool, managing all your and your contacts keys. Encryption should be simple. Developed with Wails.** - -Encrypting messages using PGP is the industry standard. Everyone has a private and a public key. Your private key, well, needs to be kept private so only you can read messages. Your public key is distributed to anyone who wants to send you secret, encrypted messages. Managing keys, encrypting messages and decrypting messages should be a smooth experience. EncryptEasy is all about making it easy. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/filehound.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/filehound.mdx deleted file mode 100644 index 78cbfca86..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/filehound.mdx +++ /dev/null @@ -1,14 +0,0 @@ -# FileHound Export Utility - -

- -
-

- -[FileHound Export Utility](https://www.filehound.co.uk/) FileHound is a cloud document management platform made for secure file retention, business process automation and SmartCapture capabilities. - -The FileHound Export Utility allows FileHound Administrators the ability to run a secure document and data extraction tasks for alternative back-up and recovery purposes. This application will download all documents and/or meta data saved in FileHound based on the filters you choose. The metadata will be exported in both JSON and XML formats. - -Backend built with: Go 1.15 Wails 1.11.0 go-sqlite3 1.14.6 go-linq 3.2 - -Frontend with: Vue 2.6.11 Vuex 3.4.0 Typescript Tailwind 1.9.6 diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/minecraftupdater.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/minecraftupdater.mdx deleted file mode 100644 index 11247339d..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/minecraftupdater.mdx +++ /dev/null @@ -1,10 +0,0 @@ -# Minecraft Updater - -

- -
-

- -[Minecraft Updater](https://github.com/Gurkengewuerz/MinecraftModUpdater) is a utility tool to update and synchronize Minecraft mods for your userbase. It’s built using Wails2 and React with [antd](https://ant.design/) as frontend framework. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/modalfilemanager.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/modalfilemanager.mdx deleted file mode 100644 index a7ae8c492..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/modalfilemanager.mdx +++ /dev/null @@ -1,12 +0,0 @@ -# Modal File Manager - -

- -
-

- -[Modal File Manager](https://github.com/raguay/ModalFileManager) is a dual pane file manager using web technologies. My original design was based on NW.js and can be found [here](https://github.com/raguay/ModalFileManager-NWjs). This version uses the same Svelte based frontend code (but it has be greatly modified since the departure from NW.js), but the backend is a [Wails 2](https://wails.io/) implementation. By using this implementation, I no longer use command line `rm`, `cp`, etc. commands. It is fully coded using Go and runs much faster than the previous versions. - -This file manager is designed around the same principle as Vim: a state controlled keyboard actions. The number of states isn't fixed, but very programmable. Therefore, an infinite number of keyboard configurations can be created and used. This is the main difference from other file managers. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/mollywallet.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/mollywallet.mdx deleted file mode 100644 index 534b097ca..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/mollywallet.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Molley Wallet - -

- -
-

- -[Molly Wallet](https://github.com/grvlle/constellation_wallet/) the official $DAG wallet of the Constellation Network. It'll let users interact with the Hypergraph Network in various ways, not limited to producing $DAG transactions. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/october.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/october.mdx deleted file mode 100644 index 889d2dd9e..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/october.mdx +++ /dev/null @@ -1,12 +0,0 @@ -# October - -

- -
-

- -[October](https://october.utf9k.net) is a small Wails application that makes it really easy to extract highlights from [Kobo eReaders](https://en.wikipedia.org/wiki/Kobo_eReader) and then forward them to [Readwise](https://readwise.io). - -It has a relatively small scope with all platform versions weighing in under 10MB, and that's without enabling [UPX compression](https://upx.github.io/)! - -In contrast, the author's previous attempts with Electron quickly bloated to several hundred megabytes. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/optimus.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/optimus.mdx deleted file mode 100644 index c3eb79507..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/optimus.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Optimus - -

- -
-

- -[Optimus](https://github.com/splode/optimus) is a desktop image optimization application. It supports conversion and compression between WebP, JPEG, and PNG image formats. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/portfall.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/portfall.mdx deleted file mode 100644 index 4cc2c63c9..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/portfall.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Portfall - -

- -
-

- -[Portfall](https://github.com/rekon-oss/portfall) - A desktop k8s port-forwarding portal for easy access to all your cluster UIs diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/restic-browser.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/restic-browser.mdx deleted file mode 100644 index 1505ce07a..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/restic-browser.mdx +++ /dev/null @@ -1,10 +0,0 @@ -# Restic Browser - -

- -
-

- -[Restic-Browser](https://github.com/emuell/restic-browser) - A simple, cross-platform [restic](https://github.com/restic/restic) backup GUI for browsing and restoring restic repositories. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/riftshare.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/riftshare.mdx deleted file mode 100644 index 5223e88cf..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/riftshare.mdx +++ /dev/null @@ -1,19 +0,0 @@ -# RiftShare - -

- -
-

- -Easy, Secure, and Free file sharing for everyone. Learn more at [Riftshare.app](https://riftshare.app) - -## Features - -- Easy secure file sharing between computers both in the local network and through the internet -- Supports sending files or directories securely through the [magic wormhole protocol](https://magic-wormhole.readthedocs.io/en/latest/) -- Compatible with all other apps using magic wormhole (magic-wormhole or wormhole-william CLI, wormhole-gui, etc.) -- Automatic zipping of multiple selected files to send at once -- Full animations, progress bar, and cancellation support for sending and receiving -- Native OS File Selection -- Open files in one click once received -- Auto Update - don't worry about having the latest release! diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/scriptbar.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/scriptbar.mdx deleted file mode 100644 index aaa556f92..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/scriptbar.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# ScriptBar - -

- -
-

- -[ScriptBar](https://GitHub.com/raguay/ScriptBarApp) is a program to show the output of the embedded [Node-Red](https://nodered.org) server in the [EmailIt](https://GitHub.com/raguay/EmailIt) application. It also displays the output of scripts on your system. ScriptBar doesn't put them in the menubar, but has them all in a convient window for easy viewing. You can have multiple tabs to have many different things show. You can also keep the links to your most visited web sites. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/surge.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/surge.mdx deleted file mode 100644 index 2d895dc29..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/surge.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Surge - -

- -
-

- -[Surge](https://getsurge.io/) is a p2p filesharing app designed to utilize blockchain technologies to enable 100% anonymous file transfers. Surge is end-to-end encrypted, decentralized and open source. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/wally.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/wally.mdx deleted file mode 100644 index 2a2498f40..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/wally.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Wally - -

- -
-

- -[Wally](https://ergodox-ez.com/pages/wally) is the official firmware flasher for [Ergodox](https://ergodox-ez.com/) keyboards. It looks great and is a fantastic example of what you can achieve with Wails: the ability to combine the power of Go and the rich graphical tools of the web development world. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/wombat.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/wombat.mdx deleted file mode 100644 index 54cedacea..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/wombat.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Wombat - -

- -
-

- -[Wombat](https://github.com/rogchap/wombat) is a cross platform gRPC client. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/ytd.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/ytd.mdx deleted file mode 100644 index 178ff0529..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/ytd.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Ytd - -

- -
-

- -[Ytd](https://github.com/marcio199226/ytd/tree/v2-wails) is an app for downloading tracks from youtube, creating offline playlists and share them with your friends, your friends will be able to playback your playlists or download them for offline listening, has an built-in player. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/templates.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/templates.mdx deleted file mode 100644 index d9a29a6fa..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/templates.mdx +++ /dev/null @@ -1,52 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Templates - -This page serves as a list for community supported templates. Please submit a PR (click `Edit this page` at the bottom) to include your templates. To build your own template, please see the [Templates](../guides/templates.mdx) guide. - -To use these templates, run `wails init -n "Your Project Name" -t [the link below[@version]]` - -If there is no version suffix, the main branch code template is used by default. If there is a version suffix, the code template corresponding to the tag of this version is used. - -Example: `wails init -n "Your Project Name" -t https://github.com/misitebao/wails-template-vue` - -:::warning Attention - -**The Wails project does not maintain, is not responsible nor liable for 3rd party templates!** - -If you are unsure about a template, inspect `package.json` and `wails.json` for what scripts are run and what packages are installed. - -::: - -## Vue - -- [wails-template-vue](https://github.com/misitebao/wails-template-vue) - A template using Vite,Vue and Vue-Router(Support both JavaScript and TypeScript) -- [wails-vite-vue-ts](https://github.com/codydbentley/wails-vite-vue-ts) - Vue 3 TypeScript with Vite (and instructions to add features) -- [wails-vite-vue-the-works](https://github.com/codydbentley/wails-vite-vue-the-works) - Vue 3 TypeScript with Vite, Vuex, Vue Router, Sass, and ESLint + Prettier - -## Angular - -- [wails-angular-template](https://github.com/TAINCER/wails-angular-template) - Angular with TypeScript, Sass, Hot-Reload, Code-Splitting and i18n - -## React - -- [wails-react-template](https://github.com/AlienRecall/wails-react-template) - A template using reactjs -- [wails-react-template](https://github.com/flin7/wails-react-template) - A minimal template for React that supports live development -- [wails-template-nextjs](https://github.com/LGiki/wails-template-nextjs) - A template using Next.js and TypeScript - -## Svelte - -- [wails-svelte-template](https://github.com/raitonoberu/wails-svelte-template) - A template using Svelte -- [wails-vite-svelte-template](https://github.com/BillBuilt/wails-vite-svelte-template) - A template using Svelte and Vite -- [wails-vite-svelte-tailwind-template](https://github.com/BillBuilt/wails-vite-svelte-tailwind-template) - A template using Svelte and Vite with TailwindCSS v3 -- [wails-sveltekit-template](https://github.com/h8gi/wails-sveltekit-template) - A template using SvelteKit - -## Elm - -- [wails-elm-template](https://github.com/benjamin-thomas/wails-elm-template) - Develop your GUI app with functional programming and a **snappy** hot-reload setup :tada: :rocket: - -## Pure JavaScript (Vanilla) - -- [wails-pure-js-template](https://github.com/KiddoV/wails-pure-js-template) - A template with nothing but just basic JavaScript, HTML, and CSS \ No newline at end of file diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/_category_.json b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/_category_.json deleted file mode 100644 index 597b920df..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Getting Started", - "position": 10 -} diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/building.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/building.mdx deleted file mode 100644 index 3e0df3b68..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/building.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -sidebar_position: 6 ---- - -# Compiling your Project - -From the project directory, run `wails build`. This will compile your project and save the production-ready binary in the `build/bin` directory. - -If you run the binary, you should see the default application: - -
- -
- -
- -For more details on compilation options, please refer to the [CLI Reference](../reference/cli.mdx#build). diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/development.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/development.mdx deleted file mode 100644 index 54dda5faa..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/development.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -sidebar_position: 5 ---- - -# Developing your Application - -You can run your application in development mode by running `wails dev` from your project directory. This will do the following things: - -- Build your application and run it -- Bind your Go code to the frontend so it can be called from Javascript -- Using the power of [vite](https://vitejs.dev/), will watch for modifications in your Go files and rebuild/re-run on change -- Sets up a [webserver](http://localhost:34115) that will serve your application over a browser. This allows you to use your favourite browser extensions. You can even call your Go code from the console - -To get started, run `wails dev` in the project directory. More information on this can be found [here](../reference/cli.mdx#dev). - -Coming soon: Tutorial diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/firstproject.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/firstproject.mdx deleted file mode 100644 index 86036d24b..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/firstproject.mdx +++ /dev/null @@ -1,130 +0,0 @@ ---- -sidebar_position: 2 ---- - -# Creating a Project - -## Project Generation - -Now that the CLI is installed, you can generate a new project by using the `wails init` command. - -Pick your favourite framework: - - - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - - - - Generate a Svelte project using Javascript with:

- - wails init -n myproject -t svelte -If you would rather use Typescript:
- - wails init -n myproject -t svelte-ts - -
- - Generate a React project using Javascript with:

- - wails init -n myproject -t react -If you would rather use Typescript:
- - wails init -n myproject -t react-ts - -
- - Vue用のJavascriptプロジェクトを生成する場合:

- - wails init -n myproject -t vue - -Typescriptプロジェクトを生成する場合:
- - wails init -n myproject -t vue-ts - -
- - Preact用のJavascriptプロジェクトを生成する場合:

- - wails init -n myproject -t preact - -Typescriptプロジェクトを生成する場合:
- - wails init -n myproject -t preact-ts - -
- - Lit用のJavascriptプロジェクトを生成する場合:

- - wails init -n myproject -t lit - -Typescriptプロジェクトを生成する場合:
- - wails init -n myproject -t lit-ts - -
- - Vanilla用のJavascriptプロジェクトを生成する場合:

- - wails init -n myproject -t vanilla - -Typescriptプロジェクトを生成する場合:
- - wails init -n myproject -t vanilla-ts - -
-
- - - -
- -There are also [community templates](../community/templates.mdx) available that offer different capabilities and frameworks. - -To see the other options available, you can run `wails init -help`. More details can be found in the [CLI Reference](../reference/cli.mdx#init). - -## Project Layout - -Wails projects have the following layout: - -``` -. -├── build/ -│ ├── appicon.png -│ ├── darwin/ -│ └── windows/ -├── frontend/ -├── go.mod -├── go.sum -├── main.go -└── wails.json -``` - -### Project structure rundown - -- `/main.go` - The main application -- `/frontend/` - Frontend project files -- `/build/` - Project build directory -- `/build/appicon.png` - The application icon -- `/build/darwin/` - Mac specific project files -- `/build/windows/` - Windows specific project files -- `/wails.json` - The project configuration -- `/go.mod` - Go module file -- `/go.sum` - Go module checksum file - -The `frontend` directory has nothing specific to Wails and can be any frontend project of your choosing. - -The `build` directory is used during the build process. These files may be updated to customise your builds. If files are removed from the build directory, default versions will be regenerated. - -The default module name in `go.mod` is "changeme". You should change this to something more appropriate. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/installation.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/installation.mdx deleted file mode 100644 index bfadb7275..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/installation.mdx +++ /dev/null @@ -1,90 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Installation - -## Supported Platforms - -- Windows 10/11 AMD64/ARM64 -- MacOS 10.13+ AMD64 -- MacOS 11.0+ ARM64 -- Linux AMD64/ARM64 - -## Dependencies - -Wails has a number of common dependencies that are required before installation: - -- Go 1.17+ -- NPM (Node 15+) - -### Go - -Download Go from the [Go Downloads Page](https://go.dev/doc/install). - -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: `echo $PATH | grep go/bin` - -### NPM - -Download NPM 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. - -## Platform Specific Dependencies - -You will also need to install platform specific dependencies: - - - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - - - - Wailsを使用するには、xcodeコマンドラインツールがインストールされている必要があります。 This can be done by running:
- xcode-select --install -
- - Wails requires that the WebView2{" "} - runtime is installed. Some Windows installations will already have this installed. You can check using - the{" "} - wails doctor command (see below). - - - Linux required the standard gcc build tools - plus libgtk3 and libwebkit. Rather than list a ton of commands for different distros, Wails can try to determine - what the installation commands are for your specific distribution. Run wails doctor after - installation - to be shown how to install the dependencies. If your distro/package manager is not supported, please consult the {" "} - Add Linux Distro guide. - -
- - - -## Optional Dependencies - -- [UPX](https://upx.github.io/) for compressing your applications. - -## Installing Wails - -Run `go install github.com/wailsapp/wails/v2/cmd/wails@latest` to install the Wails CLI. - -## System Check - -Running `wails 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 `wails` command appears to be missing? - -If your system is reporting that the `wails` command is missing, make sure you have followed the Go installation guide correctly. Normally, it means that the `go/bin` directory in your User's home directory is not in the `PATH` environment variable. You will also normally need to close and reopen any open command prompts so that changes to the environment made by the installer are reflected at the command prompt. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/_category_.json b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/_category_.json deleted file mode 100644 index 5935dad93..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Guides", - "position": 50 -} diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/application-development.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/application-development.mdx deleted file mode 100644 index a618076f1..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/application-development.mdx +++ /dev/null @@ -1,194 +0,0 @@ -# Application Development - -There are no hard and fast rules for developing applications with Wails, but there are some basic guidelines. - -## Application Setup - -The pattern used by the default templates are that `main.go` is used for configuring and running the application, whilst `app.go` is used for defining the application logic. - -The `app.go` file will define a struct that has 2 methods which act as hooks into the main application: - -```go title="app.go" -type App struct { - ctx context.Context -} - -func NewApp() *App { - return &App{} -} - -func (a *App) startup(ctx context.Context) { - a.ctx = ctx -} - -func (a *App) shutdown(ctx context.Context) { -} -``` - -- The startup method is called as soon as Wails allocates the resources it needs and is a good place for creating resources, setting up event listeners and anything else the application needs at startup. It is given a `context.Context` which is usually saved in a struct field. This context is needed for calling the [runtime](../reference/runtime/intro.mdx). If this method returns an error, the application will terminate. In dev mode, the error will be output to the console. - -- The shutdown method will be called by Wails right at the end of the shutdown process. This is a good place to deallocate memory and perform any shutdown tasks. - -The `main.go` file generally consists of a single call to `wails.Run()`, which accepts the application configuration. The pattern used by the templates is that before the call to `wails.Run()`, an instance of the struct we defined in `app.go` is created and saved in a variable called `app`. This configuration is where we add our callbacks: - -```go {3,9,10} title="main.go" -func main() { - - app := NewApp() - - err := wails.Run(&options.App{ - Title: "My App", - Width: 800, - Height: 600, - OnStartup: app.startup, - OnShutdown: app.shutdown, - }) - if err != nil { - log.Fatal(err) - } -} - -``` - -More information on application lifecycle hooks can be found [here](../howdoesitwork.mdx#application-lifecycle-callbacks). - -## Binding Methods - -It is likely that you will want to call Go methods from the frontend. This is normally done by adding public methods to the already defined struct in `app.go`: - -```go {16-18} title="app.go" -type App struct { - ctx context.Context -} - -func NewApp() *App { - return &App{} -} - -func (a *App) startup(ctx context.Context) { - a.ctx = ctx -} - -func (a *App) shutdown(ctx context.Context) { -} - -func (a *App) Greet(name string) string { - return fmt.Sprintf("Hello %s!", name) -} -``` - -In the main application configuration, the `Bind` key is where we can tell Wails what we want to bind: - -```go {11-13} title="main.go" -func main() { - - app := NewApp() - - err := wails.Run(&options.App{ - Title: "My App", - Width: 800, - Height: 600, - OnStartup: app.startup, - OnShutdown: app.shutdown, - Bind: []interface{}{ - app, - }, - }) - if err != nil { - log.Fatal(err) - } -} - -``` - -This will bind all public methods in our `App` struct (it will never bind the startup and shutdown methods). - -### Dealing with context when binding multiple structs - -If you want to bind methods for multiple structs but want each struct to keep a reference to the context so that you can use the runtime functions, a good pattern is to pass the context from the `OnStartup` method to your struct instances : - -```go -func main() { - - app := NewApp() - otherStruct := NewOtherStruct() - - err := wails.Run(&options.App{ - Title: "My App", - Width: 800, - Height: 600, - OnStartup: func(ctx context.Context){ - app.SetContext(ctx) - otherStruct.SetContext(ctx) - }, - OnShutdown: app.shutdown, - Bind: []interface{}{ - app, - otherStruct - }, - }) - if err != nil { - log.Fatal(err) - } -} -``` - -More information on Binding can be found [here](../howdoesitwork.mdx#method-binding). - -## Application Menu - -Wails supports adding a menu to your application. This is done by passing a [Menu](../reference/menus.mdx#menu) struct to application config. It's common to use a method that returns a Menu, and even more common for that to be a method on the `App` struct used for the lifecycle hooks. - -```go {11} title="main.go" -func main() { - - app := NewApp() - - err := wails.Run(&options.App{ - Title: "My App", - Width: 800, - Height: 600, - OnStartup: app.startup, - OnShutdown: app.shutdown, - Menu: app.menu(), - Bind: []interface{}{ - app, - }, - }) - if err != nil { - log.Fatal(err) - } -} - -``` - -## Assets - -The great thing about the way Wails v2 handles assets is that it doesn't! The only thing you need to give Wails is an `embed.FS`. How you get to that is entirely up to you. You can use vanilla html/css/js files like the vanilla template. You could have some complicated build system, it doesn't matter. - -When `wails build` is run, it will check the `wails.json` project file at the project root. There are 2 keys in the project file that are read: - -- "frontend:install" -- "frontend:build" - -The first, if given, will be executed in the `frontend` directory to install the node modules. The second, if given, will be executed in the `frontend` directory to build the frontend project. - -If these 2 keys aren't given, then Wails does absolutely nothing with the frontend. It is only expecting that `embed.FS`. - -### AssetsHandler - -A Wails v2 app can optionally define a `http.Handler` in the `options.App`, which allows hooking into the AssetServer to create files on the fly or process POST/PUT requests. GET requests are always first handled by the `assets` FS. If the FS doesn't find the requested file the request will be forwarded to the `http.Handler` for serving. Any requests other than GET will be directly processed by the `AssetsHandler` if specified. It's also possible to only use the `AssetsHandler` by specifiy `nil` as the `Assets` option. - -## Built in Dev Server - -Running `wails dev` will start the built in dev server which will start a file watcher in your project directory. By default, if any file changes, wails checks if it was an application file (default: `.go`, configurable with `-e` flag). If it was, then it will rebuild your application and relaunch it. If the changed file was in the assets, it will issue a reload after a short amount of time. - -The dev server uses a technique called "debouncing" which means it doesn't reload straight away, as there may be multiple files changed in a short amount of time. When a trigger occurs, it waits for a set amount of time before issuing a reload. If another trigger happens, it resets to the wait time again. By default this value is `100ms`. If this value doesn't work for your project, it can be configured using the `-debounce` flag. If used, this value will be saved to your project config and become the default. - -## External Dev Server - -Some frameworks come with their own live-reloading server, however they will not be able to take advantage of the Wails Go bindings. In this scenario, it is best to run a watcher script that rebuilds the project into the build directory, which Wails will be watching. For an example, see the default svelte template that uses [rollup](https://rollupjs.org/guide/en/). For [create-react-app](https://create-react-app.dev/), it's possible to use [this script](https://gist.github.com/int128/e0cdec598c5b3db728ff35758abdbafd) to achieve a similar result. - -## Go Module - -The default Wails templates generate a `go.mod` file that contains the module name "changeme". You should change this to something more appropriate after project generation. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/bleeding-edge.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/bleeding-edge.mdx deleted file mode 100644 index b81cc79dc..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/bleeding-edge.mdx +++ /dev/null @@ -1,55 +0,0 @@ -# Bleeding Edge - -## Overview - -Wails is in constant development and new releases are regularly "tagged". This usually happens when all the newer code on `master` has been tested and confirmed working. If you need a bugfix or feature that has not yet made it to a release, it's possible to use the latest "bleeding edge" version using the following steps: - -- `git clone https://github.com/wailsapp/wails` -- `cd wails/v2/cmd/wails` -- `go install` - -NOTE: The directory that you cloned the project into will now be called "clonedir". - -The Wails CLI will now be at the very latest version. - -### Updating your project - -To update projects to use the latest version of the Wails library, update the project's `go.mod` and ensure the following line is at the bottom of the file: - -`replace github.com/wailsapp/wails/v2 => ` - -Example: - -On Windows: `replace github.com/wailsapp/wails/v2 => C:\Users\leaan\Documents\wails-v2-beta\wails\v2` - -On 'nix: `replace github.com/wailsapp/wails/v2 => /home/me/projects/wails/v2` - -To revert to a stable version, run: - -`go install github.com/wailsapp/wails/v2/cmd/wails@latest` - -## Testing a Branch - -If you want to test a branch, follow the instructions above, but ensure you switch the branch you want to test before installing: - -- `git clone https://github.com/wailsapp/wails` -- `cd wails` -- `git checkout -b branch-to-test --track origin/branch-to-test` -- `cd v2/cmd/wails` -- `go install` - -Make sure you [update your project](#updating-your-project) as described above. - -## Testing a PR - -If you want to test a PR, follow the instructions above, but ensure you fetch the PR and switch the branch before installing. Please replace `[IDofThePR]` with the ID of the PR shown on github.com: - -- `git clone https://github.com/wailsapp/wails` -- `cd wails` -- `git fetch -u origin pull/[IDofThePR]/head:test/pr-[IDofThePR]` -- `git checkout test/pr-[IDofThePR]` -- `git reset --hard HEAD` -- `cd v2/cmd/wails` -- `go install` - -Make sure you [update your project](#updating-your-project) as described above. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/dynamic-assets.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/dynamic-assets.mdx deleted file mode 100644 index 77ad6d09e..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/dynamic-assets.mdx +++ /dev/null @@ -1,126 +0,0 @@ -# Dynamic Assets - -If you want to load or generate assets for your frontend dynamically, you can achieve that using the [AssetsHandler](../reference/options#assetshandler) option. The AssetsHandler is a generic `http.Handler` which will be called for any non GET request on the assets server and for GET requests which can not be served from the bundled assets because the file is not found. - -By installing a custom AssetsHandler, you can serve your own assets using a custom asset server. - -## Example - -In our example project, we will create a simple assets handler which will load files off disk: - -```go title=main.go {16-35,49} -package main - -import ( - "embed" - "fmt" - "github.com/wailsapp/wails/v2" - "github.com/wailsapp/wails/v2/pkg/options" - "net/http" - "os" - "strings" -) - -//go:embed frontend/dist -var assets embed.FS - -type FileLoader struct { - http.Handler -} - -func NewFileLoader() *FileLoader { - return &FileLoader{} -} - -func (h *FileLoader) ServeHTTP(res http.ResponseWriter, req *http.Request) { - var err error - requestedFilename := strings.TrimPrefix(req.URL.Path, "/") - println("Requesting file:", requestedFilename) - fileData, err := os.ReadFile(requestedFilename) - if err != nil { - res.WriteHeader(http.StatusBadRequest) - res.Write([]byte(fmt.Sprintf("Could not load file %s", requestedFilename))) - } - - res.Write(fileData) -} - -func main() { - // Create an instance of the app structure - app := NewApp() - - // Create application with options - err := wails.Run(&options.App{ - Title: "helloworld", - Width: 1024, - Height: 768, - Assets: assets, - BackgroundColour: &options.RGBA{R: 27, G: 38, B: 54, A: 255}, - OnStartup: app.startup, - AssetsHandler: NewFileLoader(), - Bind: []interface{}{ - app, - }, - }) - - if err != nil { - println("Error:", err) - } -} -``` - -When we run the application in dev mode using `wails dev`, we will see the following output: - -``` -DEB | [ExternalAssetHandler] Loading 'http://localhost:3001/favicon.ico' -DEB | [ExternalAssetHandler] Loading 'http://localhost:3001/favicon.ico' failed, using AssetHandler -Requesting file: favicon.ico -``` - -As you can see, the assets handler is called when the default assets server is unable to serve the `favicon.ico` file. - -If you right click the main application and select "inspect" to bring up the devtools, you can test this feature out by typing the following into the console: - -``` -let response = await fetch('does-not-exist.txt'); -``` - -This will generate an error in the devtools. We can see that the error is what we expect, returned by our custom assets handler: - -

- -

- -However, if we request `go.mod`, we will see the following output: - -

- -

- -This technique can be used to load images directly into the page. If we updated our default vanilla template and replaced the logo image: - -```html - -``` - -with: - -```html - -``` - -Then we would see the following: - -

- -

- -:::warning -Exposing your filesystem in this way is a security risk. It is recommended that you properly manage access -to your filesystem. -::: diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/frameless.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/frameless.mdx deleted file mode 100644 index c7ca5f6c3..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/frameless.mdx +++ /dev/null @@ -1,84 +0,0 @@ -# Frameless Applications - -Wails supports application that have no frames. This can be achieved by using the [frameless](../reference/options.mdx#frameless) field in [Application Options](../reference/options.mdx#application-options). - -Wails offers a simple solution for dragging the window: Any HTML element that has the CSS style `--wails-draggable:drag` will act as a "drag handle". This property applies to all child elements. If you need to indicate that a nested element should not drag, then use the attribute '--wails-draggable:no-drag' on that element. - - -```html - - - - - - - -
- - -
-
- - - - -``` - -For some projects, using a CSS variable may not be possible due to dynamic styling. In this case, you can use the `CSSDragProperty` and `CSSDragValue` application options to define a property and value that will be used to indicate draggable regions: - -```go title=main.go -package main - -import ( - "embed" - - "github.com/wailsapp/wails/v2" - "github.com/wailsapp/wails/v2/pkg/options" -) - -//go:embed frontend/dist -var assets embed.FS - -func main() { - // Create an instance of the app structure - app := NewApp() - - // Create application with options - err := wails.Run(&options.App{ - Title: "alwaysontop", - Width: 1024, - Height: 768, - Assets: assets, - Frameless: true, - CSSDragProperty: "widows", - CSSDragValue: "1", - Bind: []interface{}{ - app, - }, - }) - - if err != nil { - println("Error:", err) - } -} -``` - -```html title=index.html - - - - - - alwaysontop - - -
- - - - -``` - -:::info Fullscreen - If you allow your application to go fullscreen, this drag functionality will be disabled. -::: diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/frontend.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/frontend.mdx deleted file mode 100644 index 4b192c557..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/frontend.mdx +++ /dev/null @@ -1,75 +0,0 @@ -# Frontend - -## Script Injection - -When Wails serves your `index.html`, by default, it will inject 2 script entries into the `` tag to load `/wails/ipc.js` and `/wails/runtime.js`. These files install the bindings and runtime respectively. - -The code below shows where these are injected by default: - -```html - - - injection example - - - - - - - -
Please enter your name below 👇
-
- - -
- - - - - -``` - -### Overriding Default Script Injection - -To provide more flexibility to developers, there is a meta tag that may be used to customise this behaviour: - -```html - -``` - -The options are as follows: - -| Value | Description | -| ------------------- | ------------------------------------------------ | -| noautoinjectruntime | Disable the autoinjection of `/wails/runtime.js` | -| noautoinjectipc | Disable the autoinjection of `/wails/ipc.js` | -| noautoinject | Disable all autoinjection of scripts | - -Multiple options may be used provided they are comma seperated. - -This code is perfectly valid and operates the same as the autoinjection version: - -```html - - - - injection example - - - - - - -
Please enter your name below 👇
-
- - -
- - - - - - - -``` diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/ides.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/ides.mdx deleted file mode 100644 index a20ae4131..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/ides.mdx +++ /dev/null @@ -1,113 +0,0 @@ -# IDEs - -Wails aims to provide a great development experience. To that aim, we now support generating IDE specific configuration to provide smoother project setup. - -Currently, we support [Visual Studio Code](https://code.visualstudio.com/) but aim to support other IDEs such as Goland. - -## Visual Studio Code - -

- -

- -When generating a project using the `-ide vscode` flags, IDE files will be created alongside the other project files. These files are placed into the `.vscode` directory and provide the correct configuration for debugging your application. - -The 2 files generated are `tasks.json` and `launch.json`. Below are the files generated for the default vanilla project: - -```json title="tasks.json" -{ - "version": "2.0.0", - "tasks": [ - { - "label": "build", - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "command": "go", - "args": ["build", "-tags", "dev", "-gcflags", "all=-N -l", "-o", "build/bin/myproject.exe"] - }, - ] -} -``` - -```json title="launch.json" -{ - "version": "0.2.0", - "configurations": [ - { - "name": "Wails: Debug myproject", - "type": "go", - "request": "launch", - "mode": "exec", - "program": "${workspaceFolder}/build/bin/myproject.exe", - "preLaunchTask": "build", - "cwd": "${workspaceFolder}", - "env": {} - }, - ] -} -``` - -### Configuring the install and build steps - -The `tasks.json` file is simple for the default project as there is no `npm install` or `npm run build` step needed. For projects that have a frontend build step, such as the svelte template, we would need to edit `tasks.json` to add the install and build steps: - -```json title="tasks.json" -{ - "version": "2.0.0", - "tasks": [ - { - "label": "npm install", - "type": "npm", - "script": "install", - "options": { - "cwd": "${workspaceFolder}/frontend" - }, - "presentation": { - "clear": true, - "panel": "shared", - "showReuseMessage": false - }, - "problemMatcher": [] - }, - { - "label": "npm run build", - "type": "npm", - "script": "build", - "options": { - "cwd": "${workspaceFolder}/frontend" - }, - "presentation": { - "clear": true, - "panel": "shared", - "showReuseMessage": false - }, - "problemMatcher": [] - }, - { - "label": "build", - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "command": "go", - "args": ["build", "-tags", "dev", "-gcflags", "all=-N -l", "-o", "build/bin/vscode.exe"], - "dependsOn":[ - "npm install", - "npm run build" - ] - - }, - ] -} -``` - -:::info Future Enhancement - -In the future, we hope to generate a `tasks.json` that includes the install and build steps automatically. - -::: diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/linux-distro-support.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/linux-distro-support.mdx deleted file mode 100644 index 28a224a26..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/linux-distro-support.mdx +++ /dev/null @@ -1,101 +0,0 @@ -# Linux Distro Support - -## Overview - -Wails offers Linux support but providing installation instructions for all available distributions is an impossible task. Instead, Wails tries to determine if the packages you need to develop applications are available via your system's package manager. Currently, we support the following package managers: - -- apt -- dnf -- emerge -- eopkg -- nixpkgs -- pacman -- zypper - -## Adding package names - -There may be circumstances where your distro uses one of the supported package managers but the package name is different. For example, you may use an Ubuntu derivative, but the package name for gtk may be different. Wails attempts to find the correct package by iterating through a list of package names. The list of packages are stored in the packagemanager specific file in the `v2/internal/system/packagemanager` directory. In our example, this would be `v2/internal/system/packagemanager/apt.go`. - -In this file, the list of packages are defined by the `Packages()` method: - -```go -func (a *Apt) Packages() packagemap { - return packagemap{ - "libgtk-3": []*Package{ - {Name: "libgtk-3-dev", SystemPackage: true, Library: true}, - }, - "libwebkit": []*Package{ - {Name: "libwebkit2gtk-4.0-dev", SystemPackage: true, Library: true}, - }, - "gcc": []*Package{ - {Name: "build-essential", SystemPackage: true}, - }, - "pkg-config": []*Package{ - {Name: "pkg-config", SystemPackage: true}, - }, - "npm": []*Package{ - {Name: "npm", SystemPackage: true}, - }, - "docker": []*Package{ - {Name: "docker.io", SystemPackage: true, Optional: true}, - }, - } -} -``` - -Let's assume that in our linux distro, `libgtk-3` is packaged under the name `lib-gtk3-dev`. We could add support for this by adding the following line: - -```go {5} -func (a *Apt) Packages() packagemap { - return packagemap{ - "libgtk-3": []*Package{ - {Name: "libgtk-3-dev", SystemPackage: true, Library: true}, - {Name: "lib-gtk3-dev", SystemPackage: true, Library: true}, - }, - "libwebkit": []*Package{ - {Name: "libwebkit2gtk-4.0-dev", SystemPackage: true, Library: true}, - }, - "gcc": []*Package{ - {Name: "build-essential", SystemPackage: true}, - }, - "pkg-config": []*Package{ - {Name: "pkg-config", SystemPackage: true}, - }, - "npm": []*Package{ - {Name: "npm", SystemPackage: true}, - }, - "docker": []*Package{ - {Name: "docker.io", SystemPackage: true, Optional: true}, - }, - } -} -``` - -## Adding new package managers - -To add a new package manager, perform the following steps: - -- Create a new file in `v2/internal/system/packagemanager` called `.go`, where `` is the name of the package manager. -- Define a struct that conforms to the package manager interface defined in `pm.go`: - -```go -type PackageManager interface { - Name() string - Packages() packagemap - PackageInstalled(*Package) (bool, error) - PackageAvailable(*Package) (bool, error) - InstallCommand(*Package) string -} -``` - -- `Name()` should return the name of the package manager -- `Packages()` should return a `packagemap`, that provides candidate filenames for dependencies -- `PackageInstalled()` should return `true` if the given package is installed -- `PackageAvailable()` should return `true` if the given package is not installed but available for installation -- `InstallCommand()` should return the exact command to install the given package name - -Take a look at the other package managers code to get an idea how this works. - -:::info Remember -If you add support for a new package manager, don't forget to also update this page! -::: diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/linux.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/linux.mdx deleted file mode 100644 index 229c282bf..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/linux.mdx +++ /dev/null @@ -1,18 +0,0 @@ -# Linux - -This page has miscellaneous guides related to developing Wails applications for Linux. - -## Video tag doesn't fire "ended" event - -When using a video tag, the "ended" event is not fired when the video is finished playing. This is a bug in WebkitGTK, however you can use the following workaround to fix it: - -```js -videoTag.addEventListener("timeupdate", (event) => { - if (event.target.duration - event.target.currentTime < 0.2) { - let ended = new Event("ended"); - event.target.dispatchEvent(ended); - } -}); -``` - -Source: [Lyimmi](https://github.com/Lyimmi) on the [discussions board](https://github.com/wailsapp/wails/issues/1729#issuecomment-1212291275) diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/manual-builds.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/manual-builds.mdx deleted file mode 100644 index dcf192d33..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/manual-builds.mdx +++ /dev/null @@ -1,95 +0,0 @@ -# Manual Builds - -The Wails CLI does a lot of heavy lifting for the project, but sometimes it's desirable to manually build your project. This document will discuss the different operations the CLI does and how this may be achieved in different ways. - -## Build Process - -When either `wails build` or `wails dev` are used, the Wails CLI performs a common build process: - - - Install frontend dependencies - - Build frontend project - - Generate build assets - - Compile application - - [optional] Compress application - -### Install frontend dependencies - -#### CLI Steps - -- If the `-s` flag is given, this step is skipped -- Checks `wails.json` to see if there is an install command in the key `frontend:install` -- If there isn't, it skips this step -- If there is, it checks if `package.json` exists in the frontend directory. If it doesn't exist, it skips this step -- An MD5 sum is generated from the `package.json` file contents -- It checks for the existence of `package.json.md5` and if it exists, will compare the contents of it (an MD5 sum) with the one generated to see if the contents have changed. If they are the same, this step is skipped -- If `package.json.md5` does not exist, it creates it using the generated MD5 sum -- If a build is now required, or `node_modules` does not exist, or the `-f` flag is given, the install command is executed in the frontend directory - -#### Manual Steps - -This step could be done from the command line or a script with `npm install`. - -### Build frontend project - -#### Wails CLI - -- If the `-s` flag is given, this step is skipped -- Checks `wails.json` to see if there is a build command in the key `frontend:build` -- If there isn't, it skips this step -- If there is, it is executed in the frontend directory - -#### Manual Steps - -This step could be done from the command line or a script with `npm run build` or whatever the frontend build script is. - -### Generate assets - -#### Wails CLI - -- If `-nopackage` flag is set, this stage is skipped -- If the `build/appicon.png` file does not exist, a default one is created -- For Windows, see [Bundling for Windows](#windows) -- If `build/windows/icon.ico` does not exist, it will create it from the `build/appicon.png` image. - -##### Windows - -- If `build/windows/icon.ico` does not exist, it will create it from `build/appicon.png` using icon sizes of 256, 128, 64, 48, 32 and 16. This is done using [winicon](https://github.com/leaanthony/winicon). -- If the `build/windows/.manifest` file does not exist, it creates it from a default version. -- Compiles the application as a production build (above) -- Uses [winres](https://github.com/tc-hib/winres) to bundle the icon and manifest into a `.syso` file ready for linking. - -#### Manual Steps - -- Create `icon.ico` using the [winicon](https://github.com/leaanthony/winicon) CLI tool (or any other tool). -- Create / Update a `.manifest` file for your application -- Use the [winres CLI](https://github.com/tc-hib/go-winres) to generate a `.syso` file. - -### Compile application - -#### Wails CLI - -- If the `-clean` flag is provided, the `build` directory is deleted and recreated -- For `wails dev`, the following default Go flags are used: `-tags dev -gcflags "all=-N -l"` -- For `wails build`, the following default Go flags are used: `-tags desktop,production -ldflags "-w -s"` - - On Windows, `-ldflags "-w -h -H windowsgui"` -- Additional tags passed to the CLI using `-tags` are added to the defaults -- Additional ldflags passed to the CLI using `-ldflags` are added to the defaults -- The `-o` flag is passed through -- The Go compiler specified by `-compiler` will be used for compilation - -#### Manual steps - -- For dev build, the minimum command would be: `go build -tags dev -gcflags "all=-N -l"` -- For production build, the minimum command would be: `go build -tags desktop,production -ldflags "-w -s -H windowsgui"` -- Ensure that you compile in the same directory as the `.syso` file - -### Compress application - -#### Wails CLI - -- If the `-upx` flag has been given, the `upx` program will be run to compress the application with the default settings -- If `-upxflags` is also passed, these flags are used instead of the default ones - -#### Manual steps - -- Run `upx [flags]` manually to compress the application. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/migrating.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/migrating.mdx deleted file mode 100644 index c3b920e05..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/migrating.mdx +++ /dev/null @@ -1,187 +0,0 @@ -# Migrating from v1 - -## Overview - -Wails v2 is a significant change from v1. This document aims to highlight the changes and the steps in migrating an existing project. - -### Creating the Application - -In v1, the main application is created using `wails.CreateApp`, bindings are added with `app.Bind`, then the application is run using `app.Run()`. - -Example: - -```go title="v1" - app := wails.CreateApp(&wails.AppConfig{ - Title: "MyApp", - Width: 1024, - Height: 768, - JS: js, - CSS: css, - Colour: "#131313", - }) - app.Bind(basic) - app.Run() -``` - -In v2, there is just a single method, `wails.Run()`, that accepts [application options](../reference/options.mdx#application-options). - -```go title="v2" - err := wails.Run(&options.App{ - Title: "MyApp", - Width: 800, - Height: 600, - Assets: assets, - Bind: []interface{}{ - basic, - }, - }) -``` - -### Binding - -In v1, it was possible to bind both arbitrary functions and structs. In v2, this has been simplified to only binding structs. The struct instances that were previously passed to the `Bind()` method in v1, are now specified in the `Bind` field of the [application options](../reference/options.mdx#application-options): - -```go title="v1" - app := wails.CreateApp(/* options */) - app.Bind(basic) -``` - -```go title="v2" - err := wails.Run(&options.App{ - /* other options */ - Bind: []interface{}{ - basic, - }, - }) -``` - -In v1, bound methods were available to the frontend at `window.backend`. This has changed to `window.go`.`` - -### Application Lifecycle - -In v1, there were 2 special methods in a bound struct: `WailsInit()` and `WailsShutdown()`. These have been replaced with 3 lifecycle hooks as part of the [application options](../reference/options.mdx#application-options): - -- [OnStartup](../reference/options.mdx#onstartup) -- [OnShutdown](../reference/options.mdx#onshutdown) -- [OnDomReady](../reference/options.mdx#ondomready) - -Note: [OnDomReady](../reference/options.mdx#ondomready) replaces the `wails:ready` system event in v1. - -These methods can be standard functions, but a common practice is to have them part of a struct: - -```go title="v2" - basic := NewBasicApp() - err := wails.Run(&options.App{ - /* Other Options */ - OnStartup: basic.startup, - OnShutdown: basic.shutdown, - OnDomReady: basic.domready, - }) -... -type Basic struct { - ctx context.Context -} -func (b *Basic) startup(ctx context.Context) { - b.ctx = ctx -} -... -``` - -### Runtime - -The runtime in v2 is much richer than v1 with support for menus, window manipulation and better dialogs. The signature of the methods has changed slightly - please refer the the [Runtime Reference](../reference/runtime/intro.mdx). - -In v1, the [runtime](../reference/runtime/intro.mdx) was available via a struct passed to `WailsInit()`. In v2, the runtime has been moved out to its own package. Each method in the runtime takes the `context.Context` that is passed to the [OnStartup](../reference/options.mdx#onstartup) method. - -```go title="Runtime Example" -package main - -import "github.com/wailsapp/wails/v2/pkg/runtime" - -type Basic struct { - ctx context.Context -} - -// startup is called at application startup -func (a *App) startup(ctx context.Context) { - a.ctx = ctx - runtime.LogInfo(ctx, "Application Startup called!") -} - -``` - -### Assets - -The _biggest_ change in v2 is how assets are handled. - -In v1, assets were passed via 2 application options: - -- `JS` - The application's Javascript -- `CSS` - The application's CSS - -This meant that the responsibility of generating a single JS and CSS file was on the developer. This essentially required the use of complicated packers such as webpack. - -In v2, Wails makes no assumptions about your frontend assets, just like a webserver. All of your application assets are passed to the application options as an `embed.FS`. - -**This means there is no requirement to bundle your assets, encode images as Base64 or attempt the dark art of bundler configuration to use custom fonts**. - -At startup, Wails will scan the given `embed.FS` for `index.html` and use its location as the root path for all the other application assets - just like a webserver would. - -Example: An application has the following project layout. All final assets are placed in the `frontend/dist` directory: - -```shell -. -├── build/ -├── frontend/ -│ └── dist/ -│ ├── index.html -│ ├── main.js -│ ├── main.css -│ └── logo.svg -├── main.go -└── wails.json -``` - -Those assets may be used by the application by simply creating an `embed.FS`: - -```go title="Assets Example" -//go:embed frontend/dist -var assets embed.FS - -func main() { - err := wails.Run(&options.App{ - /* Other Options */ - Assets: assets, - }) -} -``` - -Of course, bundlers can be used if you wish to. The only requirement is to pass the final application assets directory to Wails using an `embed.FS` in the `Assets` key of the [application options](../reference/options.mdx#application-options). - -### Project Configuration - -In v1, the project configuration was stored in the `project.json` file in the project root. In v2, the project configuration is stored in the `wails.json` file in the project root. - -The format of the file is slightly different. Here is a comparison: - -

- -| v1 | v2 | Notes | -| ------------------ | ---------------- | --------------------------------------------------- | -| name | name | | -| description | | Removed | -| author / name | author / name | | -| author / email | author / email | | -| version | version | | -| binaryname | outputfilename | Changed | -| frontend / dir | | Removed | -| frontend / install | frontend:install | Changed | -| frontend / build | frontend:build | Changed | -| frontend / bridge | | Removed | -| frontend / serve | | Removed | -| tags | | Removed | -| | wailsjsdir | The directory to generate wailsjs modules | -| | assetdir | The directory of the compiled frontend assets for `dev` mode. This is normally inferred and could be left empty. | -| | reloaddirs | Comma separated list of additional directories to watch for changes and to trigger reloads in `dev` mode. This is only needed for some more advanced asset configurations. | - -

diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/mouse-buttons.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/mouse-buttons.mdx deleted file mode 100644 index 49e9cd69c..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/mouse-buttons.mdx +++ /dev/null @@ -1,25 +0,0 @@ -# Mouse Buttons - -The Wails runtime intercepts mouse clicks to determine whether a frameless window needs resizing or a window needs to be moved. It has been asked how to detect when a mouse click has occurred, because `window.onclick` doesn't report the mouse buttons correctly. The following code shows how to detect mouse clicks: - -```javascript -window.addEventListener('mousedown', handleMouseButtonDown); - -function handleMouseButtonDown(event) { - if (event.button === 0) { - // left mouse button - } else if (event.button === 1) { - // middle mouse button - } else if (event.button === 2) { - // right mouse button - } else if (event.button === 3) { - // back mouse button - } else if (event.button === 4) { - // forward mouse button - } else { - // other mouse button - } -} -``` - -Reference: https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/overscroll.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/overscroll.mdx deleted file mode 100644 index dca7e83a3..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/overscroll.mdx +++ /dev/null @@ -1,10 +0,0 @@ -# Overscroll - -[Overscroll](https://developer.mozilla.org/en-US/docs/Web/CSS/overscroll-behavior) is the "bounce effect" you sometimes get when you scroll beyond a page's content boundaries. This is common in mobile apps. This can be disabled using CSS: - -```css -html { - height: 100%; - overflow: hidden; -} -``` diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/routing.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/routing.mdx deleted file mode 100644 index 5a47814cc..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/routing.mdx +++ /dev/null @@ -1,47 +0,0 @@ -# Routing - -Routing is a popular way to switch views in an application. This page offers some guidance around how to do that. - -## Vue - -The recommended approach for routing in Vue is [Hash Mode](https://next.router.vuejs.org/guide/essentials/history-mode.html#hash-mode): - -```js -import { createRouter, createWebHashHistory } from 'vue-router' - -const router = createRouter({ - history: createWebHashHistory(), - routes: [ - //... - ], -}) -``` - -## Angular - -The recommended approach for routing in Angular is [HashLocationStrategy](https://codecraft.tv/courses/angular/routing/routing-strategies#_hashlocationstrategy): - -```ts -RouterModule.forRoot(routes, {useHash: true}) -``` - -## React - -The recommended approach for routing in React is [HashRouter](https://reactrouter.com/docs/en/v6/routers/hash-router): - -```jsx -import { HashRouter } from "react-router-dom"; - -ReactDOM.render( - - {/* The rest of your app goes here */} - - } exact /> - } /> - } /> - {/* more... */} - - , - root -); -``` diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/signing.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/signing.mdx deleted file mode 100644 index 3e56f06c1..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/signing.mdx +++ /dev/null @@ -1,375 +0,0 @@ -# Code Signing - -This is a guide on how you can sign your binaries generated with Wails on MacOS and Windows. The guide will target CI environments, more specifically GitHub Actions. - -## Windows - -First off you need a code signing certificate. If you do not already have one, Microsoft's info page lists some providers [here](https://docs.microsoft.com/en-us/windows-hardware/drivers/dashboard/get-a-code-signing-certificate). Please note that an EV certificate is not required unless you need to write kernel-level software such as device drivers. For signing your Wails app, a standard code signing certificate will do just fine. - -It may be a good idea to check with your certificate provider how to sign your binaries on your local machine before targeting automated build systems, just so you know if there are any special requirements. For instance, [here](https://www.ssl.com/how-to/using-your-code-signing-certificate/) is SSL.com's code signing guide for Windows. If you know how to sign locally, it will be easier to troubleshoot any potential issues in a CI environment. For instance, SSL.com code signing certificates require the `/tr` flag for [SignTool.exe](https://docs.microsoft.com/en-us/windows/win32/seccrypto/signtool) while other providers may only need the `/t` flag for providing the timestamping server. Popular GitHub Actions for signing Windows binaries like [this one](https://github.com/Dana-Prajea/code-sign-action) does not support the `/tr` flag on SignTool.exe. Therefore this guide will focus on signing our app manually with PowerShell commands, but you can use actions like the [code-sign-action](https://github.com/Dana-Prajea/code-sign-action) Action if you prefer. - -First off, let's make sure we are able to build our Wails app in our GitHub CI. Here is a small workflow template: - -```yaml -name: "example" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -- name: Get Wails - run: go install github.com/wailsapp/wails/v2/cmd/wails@latest - - name: Build Wails app - run: | - wails build - - name: upload artifacts macOS - if: matrix.platform == 'macos-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-macos - path: build/bin/* - - name: upload artifacts windows - if: matrix.platform == 'windows-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-windows - path: build/bin/* - - name: Get Wails - run: go install github.com/wailsapp/wails/v2/cmd/wails@latest - - name: Build Wails app - run: | - wails build - - name: upload artifacts macOS - if: matrix.platform == 'macos-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-macos - path: build/bin/* - - name: upload artifacts windows - if: matrix.platform == 'windows-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-windows - path: build/bin/* -``` - -Next we need to give the GitHub workflow access to our signing certificate. This is done by encoding your .pfx or .p12 certificate into a base64 string. To do this in PowerShell, you can use the following command assuming your certificate is called 'my-cert.p12': - -```PowerShell -certutil -encode .\my-cert.p12 my-cert-base64.txt -``` - -You should now have your .txt file with the base64 encoded certificate. Now you need to make two action secrets on GitHub. Now you need to make two action secrets on GitHub. Navigate to *Settings -> Secrets -> Actions* and create the two following secrets: - -- **WIN_SIGNING_CERT** with the contents of your base64 encoded certificate text. -- **WIN_SIGNING_CERT_PASSWORD** with the contents of your certificate password. - -Now we're ready to implement the signing in our workflow using one of the two methods: - -### Method 1: signing with commands - -This method uses PowerShell commands to sign our app, and leaves you control over the entire signing process. - -After the `"Build Wails app"` step, we can add the following step to our workflow: - -```yaml -- name: Sign Windows binaries - if: matrix.platform == 'windows-latest' - run: | - echo "Creating certificate file" - New-Item -ItemType directory -Path certificate - Set-Content -Path certificate\certificate.txt -Value '${{ secrets.WIN_SIGNING_CERT }}' - certutil -decode certificate\certificate.txt certificate\certificate.pfx - echo "Signing our binaries" - & 'C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe' sign /fd /t /f certificate\certificate.pfx /p '${{ secrets.WIN_SIGNING_CERT_PASSWORD }}' - -``` - -This script creates a new directory for your certificate file, creates the certificate file from our base64 secret, converts it to a .pfx file, and finally signs the binary. The following variables needs to be replaced in the last line: - -- **signing algorithm**: usually sha256. -- **timestamping server**: URL to the timestamping server to use with your certificate. -- **path to binary**: path to the binary you want to sign. - -Given that our Wails config has `outputfilename` set to "app.exe" and that we have a certificate from SSL.com, this would be our workflow: - -```yaml -name: "example" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -jobs: - package: - strategy: - matrix: - platform: [ windows-latest, macos-latest ] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend here, unless you have configured frontend build and install commands in wails.json. - - name: Get Wails - run: go install github.com/wailsapp/wails/v2/cmd/wails@latest - - name: Build Wails app - run: | - wails build - - name: Sign Windows binaries - if: matrix.platform == 'windows-latest' - run: | - echo "Creating certificate file" - New-Item -ItemType directory -Path certificate - Set-Content -Path certificate\certificate.txt -Value '${{ secrets.WIN_SIGNING_CERT }}' - certutil -decode certificate\certificate.txt certificate\certificate.pfx - echo "Signing our binaries" - & 'C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe' sign /fd sha256 /tr http://ts.ssl.com /f certificate\certificate.pfx /p '${{ secrets.WIN_SIGNING_CERT_PASSWORD }}' .\build\bin\app.exe - - - name: upload artifacts macOS - if: matrix.platform == 'macos-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-macos - path: build/bin/* - - name: upload artifacts windows - if: matrix.platform == 'windows-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-windows - path: build/bin/* -``` - -### Method 2: automatically signing with Action - -It is possible to use a Windows code signing Action like [this](https://github.com/marketplace/actions/code-sign-a-file-with-pfx-certificate) one, but note it requires a SHA1 hash for the certificate and a certificate name. View an example of how to configure it on the Action's [marketplace](https://github.com/marketplace/actions/code-sign-a-file-with-pfx-certificate). - ---- - -## MacOS - -First off you need your code signing certificate from Apple. If you do not have one, a simple Google search will help you acquire one. Once you have your certificate, you need to export it and encode it to base64. [This tutorial](https://localazy.com/blog/how-to-automatically-sign-macos-apps-using-github-actions) shows you how to do that in an easy manner. Once you have exported your .p12 certificate file, you can encode it to base64 as seen in the tutorial with the following command: - -```bash -base64 Certificates.p12 | pbcopy -``` - -Now you're ready to create some GitHub project secrets, just as with Windows: - -- **APPLE_DEVELOPER_CERTIFICATE_P12_BASE64** with the contents of your newly copied base64 certificate. -- **APPLE_DEVELOPER_CERTIFICATE_PASSWORD** with the contents of your certificate password. -- **APPLE_PASSWORD** with the contents of an App-Specific password to your Apple-ID account which you can generate [here](https://appleid.apple.com/account/manage). - -Let's make sure we are able to build our Wails app in our GitHub Action workflow. Here is a small template: - -```yaml -name: "example" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -jobs: - package: - strategy: - matrix: - platform: [ windows-latest, macos-latest ] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend here, unless you have configured frontend build and install commands in wails.json. - - name: Get Wails - run: go install github.com/wailsapp/wails/v2/cmd/wails@latest - - name: Build Wails app - run: | - wails build - - name: upload artifacts macOS - if: matrix.platform == 'macos-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-macos - path: build/bin/* - - name: upload artifacts windows - if: matrix.platform == 'windows-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-windows - path: build/bin/* -``` - -For code signing on macOS, [gon](https://github.com/mitchellh/gon) is a very handy tool for code signing and communicating with Apple servers, also written in Go, and will be used in this guide. - -After the `Build Wails app` step, add the following to the workflow: - -```yaml -- name: MacOS download gon for code signing and app notarization - if: matrix.platform == 'macos-latest' - run: | - brew install mitchellh/gon/gon -``` - -Now we need to configure some gon config files in our `build/darwin` directory: - -1. gon-sign.json: - -```json -{ - "source" : ["./build/bin/app.app"], - "bundle_id" : "app.myapp", - "apple_id": { - "username": "my-appleid@email.com", - "password": "@env:APPLE_PASSWORD" - }, - "sign" :{ - "application_identity" : "Developer ID Application: My Name" - } - } -``` - -Where `source` is your Wails binary, `bundle_id` is your bundle ID, `apple_id` contains your Apple ID username and App-Specific password which you created earlier, and `sign.application_identity` is your identity which you can find by running the following command: - -```bash -security find-identity -v -p codesigning -``` - -2. entitlements.plist: - -```plist - - - - - com.apple.security.app-sandbox - - com.apple.security.network.client - - com.apple.security.network.server - - com.apple.security.files.user-selected.read-write - - com.apple.security.files.downloads.read-write - - - -``` - -In this file you configure the entitlements you need for you app, e.g. camera permissions if your app uses the camera. Read more about entitlements [here](https://developer.apple.com/documentation/bundleresources/entitlements). - -Make sure you have updated your `Info.plist` file with the same bundle ID as you entered in `gon-sign.json`. Here's an example `Info.plist` file: - -```plist - - - CFBundlePackageTypeAPPL - CFBundleNameMyApp - CFBundleExecutableapp - CFBundleIdentifierapp.myapp - CFBundleVersion0.1.0 - CFBundleGetInfoStringMy app is cool and nice and chill and - CFBundleShortVersionString0.1.0 - CFBundleIconFileiconfile - LSMinimumSystemVersion10.13.0 - NSHighResolutionCapabletrue - LSApplicationCategoryTypepublic.app-category.utilities - NSHumanReadableCopyright© Me - -``` - -Now we're ready to add the signing step in our workflow after building the Wails app: - -```yaml -- name: Import Code-Signing Certificates for macOS - if: matrix.platform == 'macos-latest' - uses: Apple-Actions/import-codesign-certs@v1 - with: - # The certificates in a PKCS12 file encoded as a base64 string - p12-file-base64: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_P12_BASE64 }} - # The password used to import the PKCS12 file. - p12-password: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_PASSWORD }} -- name: Sign our macOS binary - if: matrix.platform == 'macos-latest' - run: | - echo "Signing Package" - gon -log-level=info ./build/darwin/gon-sign.json -``` - -Please note that signing binaries with Apple could take anywhere from minutes to hours. - -## Combined workflow file: - -Here is our GitHub workflow file with Windows + macOS combined: - -```yaml -name: "example combined" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -jobs: - package: - strategy: - matrix: - platform: [ windows-latest, macos-latest ] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend here, unless you have configured frontend build and install commands in wails.json. - - name: Get Wails - run: go install github.com/wailsapp/wails/v2/cmd/wails@latest - - name: Build Wails app - run: | - wails build - - name: MacOS download gon for code signing and app notarization - if: matrix.platform == 'macos-latest' - run: | - brew install mitchellh/gon/gon - - name: Import Code-Signing Certificates for macOS - if: matrix.platform == 'macos-latest' - uses: Apple-Actions/import-codesign-certs@v1 - with: - # The certificates in a PKCS12 file encoded as a base64 string - p12-file-base64: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_P12_BASE64 }} - # The password used to import the PKCS12 file. - - name: Get Wails - run: go install github.com/wailsapp/wails/v2/cmd/wails@latest - - name: Build Wails app - run: | - wails build - - name: MacOS download gon for code signing and app notarization - if: matrix.platform == 'macos-latest' - run: | - brew install mitchellh/gon/gon - - name: Import Code-Signing Certificates for macOS - if: matrix.platform == 'macos-latest' - uses: Apple-Actions/import-codesign-certs@v1 - with: - # The certificates in a PKCS12 file encoded as a base64 string - p12-file-base64: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_P12_BASE64 }} - # The password used to import the PKCS12 file. -``` - -# End notes - -This guide inspired by the RiftShare project and its workflow, which is highly recommended to check out [here](https://github.com/achhabra2/riftshare/blob/main/.github/workflows/build.yaml). diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/templates.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/templates.mdx deleted file mode 100644 index df75cbbc7..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/templates.mdx +++ /dev/null @@ -1,95 +0,0 @@ -# Templates - -Wails generates projects from pre-created templates. In v1, this was a difficult to maintain set of projects that were subject to going out of date. In v2, to empower the community, a couple of new features have been added for templates: - -- Ability to generate projects from [Remote Templates](../reference/cli.mdx#remote-templates) -- Tooling to help create your own templates - -## Creating Templates - -To create a template, you can use the `wails generate template` command. To generate a default template, run: - -`wails generate template -name mytemplate` - -This creates the directory "mytemplate" with default files: - -```shell title=mytemplate/ -. -|-- NEXTSTEPS.md -|-- README.md -|-- app.tmpl.go -|-- frontend -| `-- dist -| |-- assets -| | |-- fonts -| | | |-- OFL.txt -| | | `-- nunito-v16-latin-regular.woff2 -| | `-- images -| | `-- logo-dark.svg -| |-- index.html -| |-- main.css -| `-- main.js -|-- go.mod.tmpl -|-- main.tmpl.go -|-- template.json -`-- wails.tmpl.json -``` - -### Template Overview - -The default template consists of the following files and directories: - -| Filename / Dir | Description | -| --------------- | -------------------------------------------- | -| NEXTSTEPS.md | Instructions on how to complete the template | -| README.md | The README published with the template | -| app.tmpl.go | `app.go` template file | -| frontend/ | The directory containing frontend assets | -| go.mod.tmpl | `go.mod` template file | -| main.tmpl.go | `main.go` template file | -| template.json | The template metadata | -| wails.tmpl.json | `wails.json` template file | - -At this point it is advisable to follow the steps in `NEXTSTEPS.md`. - -## Creating a Template from an Existing Project - -It's possible to create a template from an existing frontend project by passing the path to the project when generating the template. We will now walk through how to create a Vue 3 template: - -- Install the vue cli: `npm install -g @vue/cli` -- Create the default project: `vue create vue3-base` - - Select `Default (Vue 3) ([Vue 3] babel, eslint)` -- After the project has been generated, run: - -```shell -> wails generate template -name wails-vue3-template -frontend .\vue3-base\ -Extracting base template files... -Migrating existing project files to frontend directory... -Updating package.json data... -Renaming package.json -> package.tmpl.json... -Updating package-lock.json data... -Renaming package-lock.json -> package-lock.tmpl.json... -``` - -- The template may now be customised as specified in the `NEXTSTEPS.md` file -- Once the files are ready, it can be tested by running: `wails init -n my-vue3-project -t .\wails-vue3-template\` -- To test the new project, run: `cd my-vue3-project` then `wails build` -- Once the project has compiled, run it: `.\build\bin\my-vue3-project.exe` -- You should have a fully functioning Vue3 application: - -
- -
- -## Publishing Templates - -Publishing a template is simply pushing the files to GitHub. The following best practice is encouraged: - -- Remove any unwanted files and directories (such as `.git`) from your frontend directory -- Ensure that `template.json` is complete, especially `helpurl` -- Push the files to GitHub -- Create a PR on the [Community Templates](../community/templates.mdx) page -- Announce the template on the [Template Announcement](https://github.com/wailsapp/wails/discussions/825) discussion board diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/troubleshooting.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/troubleshooting.mdx deleted file mode 100644 index b6a73efa5..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/troubleshooting.mdx +++ /dev/null @@ -1,137 +0,0 @@ -# Troubleshooting - -An assortment of troubleshooting tips. - -## The `wails` command appears to be missing? - -If your system is reporting that the `wails` command is missing, make sure you have followed the Go installation guide correctly. Normally, it means that the `go/bin` directory in your User's home directory is not in the `PATH` environment variable. You will also normally need to close and reopen any open command prompts so that changes to the environment made by the installer are reflected at the command prompt. - -## My application is displaying a white/blank screen - -Check that your application includes the assets from the correct directory. In your `main.go` file, you will have something similar to the following code: - -```go -//go:embed frontend/dist -var assets embed.FS -``` - -Check that `frontend/dist` contains your application assets. - -### Mac - -If this happens on Mac, try adding the following to your `Info.plist`: - -```xml -NSAppTransportSecurity - - NSAllowsLocalNetworking - - -``` - -Reference: https://github.com/wailsapp/wails/issues/1504#issuecomment-1174317433 - -## Mac application not valid - -If your built application looks like this in finder: - -

- -

- -it's likely that your application's `info.plist` is invalid. Update the file in `build/.app/Contents/info.plist` and check if the data is valid, EG check the binary name is correct. To persist the changes, copy the file back to the `build/darwin` directory. - -## Cannot call backend method from frontend with variadic arguments - -If you have a backend method defined with variadic parameters, eg: - -```go -func (a *App) TestFunc(msg string, args ...interface{}) error { - // Code -} -``` - -calling this method from the frontend like this will fail: - -```js -var msg = "Hello: " -var args = ["Go", "JS"] -window.go.main.App.TestFunc(msg, ...args).then((result) => { - //do things here -}).catch((error) => { - //handle error -}); -``` - -Workaround: - -```js -var msg = "Hello " -var args = ["Go", "JS"] -window.go.main.App.TestFunc(msg, args).then((result) => { //without the 3 dots - //do things here -}).catch((error) => { - //handle error -}); -``` - -Credit: https://github.com/wailsapp/wails/issues/1186 - -## I'm having getting proxy errors when trying to install Wails - -If you are getting errors like this: - -``` -"https://proxy.golang.org/github.com/wailsapp/wails/cmd/wails/@v/list": dial tcp 172.217.163.49:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. -``` - -it's probably because the official Go Proxy is being blocked (Users in China have reported this). The solution is to set up the proxy manually, eg: - -``` -go env -w GO111MODULE=on -go env -w GOPROXY=https://goproxy.cn,direct -``` - -Source: https://github.com/wailsapp/wails/issues/1233 - -## The generated Typescript doesn't have the correct types - -Sometimes the generated Typescript doesn't have the correct types. To mitigate this, it is possible to specify what types should be generated using the `ts_type` struct tag. For more details, please read [this](https://github.com/tkrajina/typescriptify-golang-structs#custom-types). - -## When I navigate away from `index.html`, I am unable to call methods on the frontend - -If you navigate away from `index.html` to a new html file, the context will be lost. This can be fixed by adding the following imports to the `` section of any new page you navigate to: - -```html - - - - -``` - -Source: https://github.com/wailsapp/wails/discussions/1512 - -## I get `too many open files` errors on my Mac when I run `wails dev` - -By default, macOS will only allow you to open a maximum of 256 files. This can affect the `wails dev` command. This limit can be increased by running: `ulimit -n 1024` in the terminal. - -FSNotify is [looking to move to Apple's fsevents](https://github.com/fsnotify/fsnotify/issues/11) for Mac. If this isn't completed soon, we will create our own implementation, tracked [here](https://github.com/wailsapp/wails/issues/1733). - -## My Mac app gives me weird compilation errors - -A few users have reported seeing compilation errors such as the following: - -```shell -# github.com/wailsapp/wails/v2/internal/frontend/desktop/darwin -In file included from ../../pkg/mod/github.com/wailsapp/wails/v2@v2.0.0-beta.44.2/internal/frontend/desktop/darwin/callbacks.go:9: -In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:12: -/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSBundle.h:91:143: error: function does not return NSString -- (NSAttributedString *)localizedAttributedStringForKey:(NSString *)key value:(nullable NSString *)value table:(nullable NSString *)tableName NS_FORMAT_ARGUMENT(1) NS_REFINED_FOR_SWIFT API_AVAILABLE(macos(12.0), ios(15.0), watchos(8.0), tvos(15.0)); - ~~~~~~~~~~~~~~ ^ ~ -/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:103:48: note: expanded from macro 'NS_FORMAT_ARGUMENT' - #define NS_FORMAT_ARGUMENT(A) __attribute__ ((format_arg(A))) -``` - -This is *normally* due to a mismatch with the OS version you are running and the version of the XCode Command Line Tools installed. If you see an error like this, try upgrading your XCode Command Line Tools to the latest version. - -Source: https://github.com/wailsapp/wails/issues/1806 \ No newline at end of file diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/vscode.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/vscode.mdx deleted file mode 100644 index ed258656d..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/vscode.mdx +++ /dev/null @@ -1,82 +0,0 @@ - -# Visual Studio Code - -This page is for miscellaneous tips and tricks when using Visual Studio Code with Wails. - -## Vetur Configuration - -Many thanks to [@Lyimmi](https://github.com/Lyimmi) for this tip. Originally posted [here](https://github.com/wailsapp/wails/issues/1791#issuecomment-1228158349). - -Vetur is a popular plugin for Visual Studio Code that provides syntax highlighting and code completion for Vue projects. When loading a Wails project in VSCode, Vetur will throw an error as it is expecting to find the frontend project in the root directory. To fix this, you can do the following: - -Create a file named `vetur.config.js` in the project's root. - -```javascript -// vetur.config.js -/** @type {import('vls').VeturConfig} */ -module.exports = { - // **optional** default: `{}` - // override vscode settings - // Notice: It only affects the settings used by Vetur. - settings: { - "vetur.useWorkspaceDependencies": true, - "vetur.experimental.templateInterpolationService": true - }, - // **optional** default: `[{ root: './' }]` - // support monorepos - projects: [ - { - // **required** - // Where is your project? - // It is relative to `vetur.config.js`. - // root: './packages/repo1', - root: './frontend', - // **optional** default: `'package.json'` - // Where is `package.json` in the project? - // We use it to determine the version of vue. - // It is relative to root property. - package: './package.json', - // **optional** - // Where is TypeScript config file in the project? - // It is relative to root property. - tsconfig: './tsconfig.json', - // **optional** default: `'./.vscode/vetur/snippets'` - // Where is vetur custom snippets folders? - snippetFolder: './.vscode/vetur/snippets', - // **optional** default: `[]` - // Register globally Vue component glob. - // If you set it, you can get completion by that components. - // It is relative to root property. - // Notice: It won't actually do it. You need to use `require.context` or `Vue.component` - globalComponents: [ - './src/components/**/*.vue' - ] - } - ] -} -``` - -Next, configure `frontend/tsconfig.json`: - -```javascript -{ - "compilerOptions": { - "module": "system", - "noImplicitAny": true, - "removeComments": true, - "preserveConstEnums": true, - "sourceMap": true, - "outFile": "../../built/local/tsc.js", - "allowJs": true - }, - "exclude": [ - "node_modules", - "**/*.spec.ts" - ], - "include": [ - "src/**/*", - "wailsjs/**/*.ts" - ] -} -``` -This should enable you to now use Vetur as expected. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/windows-installer.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/windows-installer.mdx deleted file mode 100644 index 249ec5527..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/windows-installer.mdx +++ /dev/null @@ -1,56 +0,0 @@ -# NSIS installer - -

- -
-

- -Wails supports generating Windows installers using the [NSIS installer](https://nsis.sourceforge.io/). - -## Installing NSIS - -### Windows - -The installer is available on the [NSIS Download](https://nsis.sourceforge.io/Download) page. - -If you use the chocolatey package manager, run the following script: - -``` -choco install nsis -``` - -If you install NSIS manually, you need to add the *Bin* folder, which contains `makensis.exe`, in your NSIS installation to your path. [Here](https://www.architectryan.com/2018/03/17/add-to-the-path-on-windows-10/) is a good tutorial on how to add to path on Windows. - -### Linux - -The `nsis` package should be available through your distribution's package manager. - -### MacOS - -NSIS is available to install through homebrew: `brew install nsis`. - -## Generating the installer - -When a new project is created, Wails generates the NSIS configuration files in `build/windows/installer`. The config data is read from `installer/info.json` and that is configured to use the project's `wails.json` Info section: - -```json -// ... - "Info": { - "companyName": "My Company Name", - "productName": "Wails Vite", - "productVersion": "1.0.0", - "copyright": "Copyright.........", - "comments": "Built using Wails (https://wails.io)" - }, -``` - -To generate an installer for your application, use the `-nsis` flag with `wails build`: - -``` -wails build -nsis -``` - -The installer will now be available in the `build/bin` directory. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/windows.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/windows.mdx deleted file mode 100644 index 821808c0b..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/windows.mdx +++ /dev/null @@ -1,61 +0,0 @@ -# Windows - -This page has miscellaneous guides related to developing Wails applications for Windows. - -## Handling the WebView2 Runtime Dependency - -Wails applications built for Windows have a runtime requirement on the Microsoft [WebView2 Runtime](https://developer.microsoft.com/en-us/microsoft-edge/webview2/). Windows 11 will have this installed by default, but some machines won't. Wails offers an easy approach to dealing with this dependency. - -By using the `-webview2` flag when building, you can decide what your application will do when a suitable runtime is not detected (including if the installed runtime is too old). The four options are: - -1. Download -2. Embed -3. Browser -4. Error - -### Download - -This option will prompt the user that no suitable runtime has been found and then offer to download and run the official bootstrapper from Microsoft's WebView2 site. If the user proceeds, the official bootstrapper will be downloaded and run. - -### Embed - -This option embeds the official bootstrapper within the application. If no suitable runtime has been found, the application will offer to run the bootstrapper. This adds ~150k to the binary size. - -### Browser - -This option will prompt the user that no suitable runtime has been found and then offer to open a browser to the official WebView2 page where the bootstrapper can be downloaded and installed. The application will then exit, leaving the installation up to the user. - -### Error - -If no suitable runtime is found, an error is given to the user and no further action taken. - -## Fixed version runtime - -Another way of dealing with webview2 dependency is shipping it yourself. You can download [fixed version runtime](https://developer.microsoft.com/microsoft-edge/webview2/#download-section) and bundle or download it with your application. - -Also, you should specify path to fixed version of webview2 runtime in the `windows.Options` structure when launching wails. - -```go - wails.Run(&options.App{ - Windows: &windows.Options{ - WebviewBrowserPath: "", - }, - }) -``` - -Note: When `WebviewBrowserPath` is specified, `error` strategy will be forced in case of minimal required version mismatch or invalid path to a runtime. - -## Spawning other programs - -When spawning other programs, such as scripts, you will see the window appear on the screen. To hide the window, you can use the following code: - -```go -cmd := exec.Command("your_script.exe") -cmd.SysProcAttr = &syscall.SysProcAttr{ - HideWindow: true, - CreationFlags: 0x08000000, -} -cmd.Start() -``` - -Solution provided by [sithembiso](https://github.com/sithembiso) on the [discussions board](https://github.com/wailsapp/wails/discussions/1734#discussioncomment-3386172). diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/howdoesitwork.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/howdoesitwork.mdx deleted file mode 100644 index 95db08724..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/howdoesitwork.mdx +++ /dev/null @@ -1,356 +0,0 @@ ---- -sidebar_position: 20 ---- - -# How does it work? - -A Wails application is a standard Go application, with a webkit frontend. The Go part of the application consists of the application code and a runtime library that provides a number of useful operations, like controlling the application window. The frontend is a webkit window that will display the frontend assets. Also available to the frontend is a Javascript version of the runtime library. Finally, it is possible to bind Go methods to the frontend, and these will appear as Javascript methods that can be called, just as if they were local Javascript methods. - -
- -
- -## The Main Application - -### Overview - -The main application consists of a single call to `wails.Run()`. It accepts the application configuration which describes the size of the application window, the window title, what assets to use, etc. A basic application might look like this: - -```go title="main.go" -package main - -import ( - "embed" - "log" - - "github.com/wailsapp/wails/v2" - "github.com/wailsapp/wails/v2/pkg/options" -) - -//go:embed frontend/dist -var assets embed.FS - -func main() { - - app := &App{} - - err := wails.Run(&options.App{ - Title: "Basic Demo", - Width: 1024, - Height: 768, - Assets: &assets, - OnStartup: app.startup, - OnShutdown: app.shutdown, - Bind: []interface{}{ - app, - }, - }) - if err != nil { - log.Fatal(err) - } -} - - -type App struct { - ctx context.Context -} - -func (b *App) startup(ctx context.Context) { - b.ctx = ctx -} - -func (b *App) shutdown(ctx context.Context) {} - -func (b *App) Greet(name string) string { - return fmt.Sprintf("Hello %s!", name) -} -``` - -### Options rundown - -This example has the following options set: - -- `Title` - The text that should appear in the window's title bar -- `Width` & `Height` - The dimensions of the window -- `Assets` - The application's frontend assets -- `OnStartup` - A callback for when the window is created and is about to start loading the frontend assets -- `OnShutdown` - A callback for when the application is about to quit -- `Bind` - A slice of struct instances that we wish to expose to the frontend - -A full list of application options can be found in the [Options Reference](reference/options). - -#### Assets - -The `Assets` option is mandatory as you can't have a Wails application without frontend assets. Those assets can be any files you would expect to find in a web application - html, js, css, svg, png, etc. **There is no requirement to generate asset bundles** - plain files will do. When the application starts, it will attempt to load `index.html` from your assets and the frontend will essentially work as a browser from that point on. It is worth noting that there is no requirement on where in the `embed.FS` the files live. It is likely that the embed path uses a nested directory relative to your main application code, such as `frontend/dist`: - -```go title="main.go" -//go:embed frontend/dist -var assets embed.FS -``` - -At startup, Wails will iterate the embedded files looking for the directory containing `index.html`. All other assets will be loaded relative to this directory. - -As production binaries use the files contained in `embed.FS`, there are no external files required to be shipped with the application. - -When running in development mode using the `wails dev` command, the assets are loaded off disk, and any changes result in a "live reload". The location of the assets will be inferred from the `embed.FS`. - -More details can be found in the [Application Development Guide](guides/application-development.mdx). - -#### Application Lifecycle Callbacks - -Just before the frontend is about to load `index.html`, a callback is made to the function provided in [OnStartup](reference/options.mdx#onstartup). A standard Go context is passed to this method. This context is required when calling the runtime so a standard pattern is to save a reference to in this method. Just before the application shuts down, the [OnShutdown](reference/options.mdx#onshutdown) callback is called in the same way, again with the context. There is also an [OnDomReady](reference/options.mdx#ondomready) callback for when the frontend has completed loading all assets in `index.html` and is equivalent of the [`body onload`](https://www.w3schools.com/jsref/event_onload.asp) event in Javascript. It is also possible to hook into the window close (or application quit) event by setting the option [OnBeforeClose](reference/options.mdx#onbeforeclose). - -#### Method Binding - -The `Bind` option is one of the most important options in a Wails application. It specifies which struct methods to expose to the frontend. Think of structs like "controllers" in a traditional web application. When the application starts, it examines the struct instances listed in the `Bind` field in the options, determines which methods are public (starts with an uppercase letter) and will generate Javascript versions of those methods that can be called by the frontend code. - -:::info Note - -Wailsで構造体を正しくバインドするためには、構造体の*インスタンス*をオプションで指定してください。 - -::: - -In this example, we create a new `App` instance and then add this instance to the `Bind` option in `wails.Run`: - -```go {16,24} title="main.go" -package main - -import ( - "embed" - "log" - - "github.com/wailsapp/wails/v2" - "github.com/wailsapp/wails/v2/pkg/options" -) - -//go:embed frontend/dist -var assets embed.FS - -func main() { - - app := &App{} - - err := wails.Run(&options.App{ - Title: "Basic Demo", - Width: 1024, - Height: 768, - Assets: &assets, - Bind: []interface{}{ - app, - }, - }) - if err != nil { - log.Fatal(err) - } -} - - -type App struct { - ctx context.Context -} - -func (a *App) Greet(name string) string { - return fmt.Sprintf("Hello %s!", name) -} -``` - -You may bind as many structs as you like. Just make sure you create an instance of it and pass it in `Bind`: - -```go {8-10} - //... - err := wails.Run(&options.App{ - Title: "Basic Demo", - Width: 1024, - Height: 768, - Assets: &assets, - Bind: []interface{}{ - app, - &mystruct1{}, - &mystruct2{}, - }, - }) - -``` - -When you run `wails dev` (or `wails generate module`), a frontend module will be generated containing the following: - -- Javascript bindings for all bound methods -- Typescript declarations for all bound methods -- Typescript definitions for all Go structs used as inputs or outputs by the bound methods - -This makes it incredibly simple to call Go code from the frontend, using the same strongly typed datastructures. - -## The Frontend - -### Overview - -The frontend is a collection of files rendered by webkit. It's like a browser and webserver in one. There is virtually[^1] no limit to which frameworks or libraries you can use. The main points of interaction between the frontend and your Go code are: - -- Calling bound Go methods -- Calling runtime methods - -### Calling bound Go methods - -When you run your application with `wails dev`, it will automatically generate Javascript bindings for your structs in a directory called `wailsjs/go` (You can also do this by running `wails generate module`). The generated files mirror the package names in your application. In the example above, we bind `app`, which has one public method `Greet`. This will lead to the generation of the following files: - -```bash -wailsjs - └─go - └─main - ├─App.d.ts - └─App.js -``` - -Here we can see that there is a `main` package that contains the Javascript bindings for the bound `App` struct, as well as the Typescript declaration file for those methods. To call `Greet` from our frontend, we simply import the method and call it like a regular Javascript function: - -```javascript -// ... -import {Greet} from '../wailsjs/go/main/App' - - function doGreeting(name) { - Greet(name).then((result) => { - // resultを使って何かする - }) - } -``` - -The Typescript declaration file gives you the correct types for the bound methods: - -```ts -export function Greet(arg1:string):Promise; -``` - -The generated methods return a Promise. A successful call will result in the first return value from the Go call to be passed to the `resolve` handler. An unsuccessful call is when a Go method that has an error type as it's second return value, passes an error instance back to the caller. This is passed back via the `reject` handler. In the example above, `Greet` only returns a `string` so the Javascript call will never reject - unless invalid data is passed to it. - -All data types are correctly translated between Go and Javascript. Even structs. If you return a struct from a Go call, it will be returned to your frontend as a Javascript class. Note: If you wish to use structs, you **must** define `json` struct tags for your fields! - -:::info Note -Anonymous nested structs are not supported at this time. -::: - -It is possible to send structs back to Go. Any Javascript map/class passed as an argument that is expecting a struct, will be converted to that struct type. To make this process a lot easier, in `dev` mode, a TypeScript module is generated, defining all the struct types used in bound methods. Using this module, it's possible to construct and send native Javascript objects to the Go code. - -There is also support for Go methods that use structs in their signature. All Go structs specified by a bound method (either as parameters or return types) will have Typescript versions auto generated as part of the Go code wrapper module. Using these, it's possible to share the same data model between Go and Javascript. - -Example: We update our `Greet` method to accept a `Person` instead of a string: - -```go title="main.go" -type Person struct { - Name string `json:"name"` - Age uint8 `json:"age"` - Address *Address `json:"address"` -} - -type Address struct { - Street string `json:"street"` - Postcode string `json:"postcode"` -} - -func (a *App) Greet(p Person) string { - return fmt.Sprintf("Hello %s (Age: %d)!", p.Name, p.Age) -} -``` - -The `wailsjs/go/main/App.js` file will still have the following code: - -```js title="App.js" -export function Greet(arg1) { - return window['go']['main']['App']['Greet'](arg1); -} -``` - -But the `wailsjs/go/main/App.d.ts` file will be updated with the following code: - -```ts title="App.d.ts" -import {main} from '../models'; - -export function Greet(arg1:main.Person):Promise; -``` - -As we can see, the "main" namespace is imported from a new "models.ts" file. This file contains all the struct definitions used by our bound methods. In this example, this is a `Person` struct. If we look at `models.ts`, we can see how the models are defined: - -```ts title="models.ts" -export namespace main { - - export class Address { - street: string; - postcode: string; - - static createFrom(source: any = {}) { - return new Address(source); - } - - constructor(source: any = {}) { - if ('string' === typeof source) source = JSON.parse(source); - this.street = source["street"]; - this.postcode = source["postcode"]; - } - } - export class Person { - name: string; - age: number; - address?: Address; - - static createFrom(source: any = {}) { - return new Person(source); - } - - constructor(source: any = {}) { - if ('string' === typeof source) source = JSON.parse(source); - this.name = source["name"]; - this.age = source["age"]; - this.address = this.convertValues(source["address"], Address); - } - - convertValues(a: any, classs: any, asMap: boolean = false): any { - if (!a) { - return a; - } - if (a.slice) { - return (a as any[]).map(elem => this.convertValues(elem, classs)); - } else if ("object" === typeof a) { - if (asMap) { - for (const key of Object.keys(a)) { - a[key] = new classs(a[key]); - } - return a; - } - return new classs(a); - } - return a; - } - } -} -``` - -So long as you have TypeScript as part of your frontend build configuration, you can use these models in the following way: - -```js title="mycode.js" -import {Greet} from '../wailsjs/go/main/App' - import {main} from '../wailsjs/go/models' - - function generate() { - let person = new main.Person() - person.name = "Peter" - person.age = 27 - Greet(person).then((result) => { - console.log(result) - }) - } -``` - -The combination of generated bindings and TypeScript models makes for a powerful development environment. - -More information on Binding can be found in the [Binding Methods](guides/application-development.mdx#binding-methods) section of the [Application Development Guide](guides/application-development.mdx). - -### Calling runtime methods - -The Javascript runtime is located at `window.runtime` and contains many methods to do various tasks such as emit an event or perform logging operations: - -```js title="mycode.js" -window.runtime.EventsEmit("my-event", 1); -``` - -More details about the JS runtime can be found in the [Runtime Reference](reference/runtime/intro). - -[^1]: There is a very small subset of libraries that use features unsupported in WebViews. There are often alternatives and workarounds for such cases. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/introduction.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/introduction.mdx deleted file mode 100644 index ab616d0a6..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/introduction.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Introduction - -Wails is a project that enables you to write desktop apps using Go and web technologies. - -Consider it a lightweight and fast Electron alternative for Go. You can easily build applications with the flexibility and power of Go, combined with a rich, modern frontend. - -### Features - -- Native Menus, Dialogs, Theming and Translucency -- Windows, macOS and linux support -- Built in templates for Svelte, React, Preact, Vue, Lit and Vanilla JS -- Easily call Go methods from Javascript -- Automatic Go struct to Typescript model generation -- No CGO or external DLLs required on Windows -- Live development mode using the power of [Vite](https://vite.net/) -- Powerful CLI to easily Create, Build and Package applications -- A rich [runtime library](/docs/next/reference/runtime) -- Applications built with Wails are Apple & Microsoft Store compliant - - -This is [varly](https://varly.app) - a desktop application for MacOS & Windows written using Wails. Not only does it look great, it uses native menus and translucency - everything you'd expect from a modern native app. - -

- - - -

- -### Quick Start Templates - -Wails comes with a number of pre-configured templates that allow you to get your application up and running quickly. There are templates for the following frameworks: Svelte, React, Vue, Preact, Lit and Vanilla. There are both Javascript and Typescript versions for each template. - -### Native Elements - -Wails uses a purpose built library for handling native elements such as Window, Menus, Dialogs, etc, so you can build good-looking, feature rich desktop applications. - -**It does not embed a browser**, so it is resource efficient. Instead, it uses the native rendering engine for the platform. On Windows, this is the new Microsoft Webview2 library, built on Chromium. - -### Go & Javascript Interoperability - -Wails automatically makes your Go methods available to Javascript, so you can call them by name from your frontend! It even generates Typescript models for the structs used by your Go methods, so you can pass the same data structures between Go and Javascript. - -### Runtime Library - -Wails provides a runtime library, for both Go and Javascript, that handles a lot of the things modern applications need, like Eventing, Logging, Dialogs, etc. - -### Live Development Experience - -#### Automatic Rebuilds - -When you run your application in "dev" mode, Wails will build your application as a native desktop application, but will read your assets from disk. It will detect any changes to your Go code and automatically rebuild and relaunch your application. - -#### Automatic Reloads - -When changes to your application assets are detected, your running application will "reload", reflecting your changes almost immediately. - -#### Develop your application in a Browser - -If you prefer to debug and develop in a browser then Wails has you covered. The running application also has a webserver that will run your application in any browser that connects to it. It will even refresh when your assets change on disk. - -### Production-ready Native Binaries - -When you're ready to do the final build of your application, the CLI will compile it down to a single executable, with all the assets bundled into it. On Windows and MacOS, it is possible to create a native package for distribution. The assets used in packaging (icon, info.plist, manifest file, etc) are part of your project and may be customised, giving you total control over how your applications are built. - -### Tooling - -The Wails CLI provides a hassle-free way to generate, build and bundle your applications. It will do the heavy lifting of creating icons, compiling your application with optimal settings and delivering a distributable, production ready binary. Choose from a number of starter templates to get up and running quickly! diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/_category_.json b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/_category_.json deleted file mode 100644 index ebb337b83..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Reference", - "position": 40 -} diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/cli.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/cli.mdx deleted file mode 100644 index 5a00db158..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/cli.mdx +++ /dev/null @@ -1,221 +0,0 @@ ---- -sidebar_position: 2 ---- - -# CLI - -The Wails CLI has a number of commands that are used for managing your projects. All commands are run in the following way: - -`wails ` - -## init - -`wails init` is used for generating projects. - -| Flag | Description | Default | -|:------------------ |:----------------------------------------------------------------------------------------------------------------------- |:-------------------:| -| -n "project name" | Name of the project. **Mandatory**. | | -| -d "project dir" | Project directory to create | Name of the project | -| -g | Initialise git repository | | -| -l | List available project templates | | -| -q | Suppress output to console | | -| -t "template name" | The project template to use. This can be the name of a default template or a URL to a remote template hosted on github. | vanilla | -| -ide | Generate IDE project files | | -| -f | Force build application | false | - -Example: `wails init -n test -d mytestproject -g -ide vscode -q` - -This will generate a a project called "test" in the "mytestproject" directory, initialise git, generate vscode project files and do so silently. - -More information on using IDEs with Wails can be found [here](../guides/ides.mdx). - -### Remote Templates - -Remote templates (hosted on GitHub) are supported and can be installed by using the template's project URL. - -Example: `wails init -n test -t https://github.com/leaanthony/testtemplate[@v1.0.0]` - -A list of community maintained templates can be found [here](../community/templates.mdx) - -:::warning Attention - -**The Wails project does not maintain, is not responsible nor liable for 3rd party templates!** - -If you are unsure about a template, inspect `package.json` and `wails.json` for what scripts are run and what packages are installed. - -::: - -## build - -`wails build` is used for compiling your project to a production-ready binary. - -| Flag | Description | Default | -|:-------------------- |:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |:--------------------------------------------------------------------------------------------------------------------------------------------------- | -| -platform | Build for the given (comma delimited) [platforms](../reference/cli.mdx#platforms) eg. `windows/arm64`. Note, if you do not give the architecture, `runtime.GOARCH` is used. | platform = `GOOS` environment variable if given else `runtime.GOOS`.
arch = `GOARCH` envrionment variable if given else `runtime.GOARCH`. | -| -clean | Cleans the `build/bin` directory | | -| -compiler "compiler" | Use a different go compiler to build, eg go1.15beta1 | go | -| -ldflags "flags" | Additional ldflags to pass to the compiler | | -| -nopackage | Do not package application | | -| -o filename | Output filename | | -| -s | Skip building the frontend | false | -| -f | Force build application | false | -| -tags "extra tags" | Build tags to pass to compiler (quoted and space separated) | | -| -upx | Compress final binary using "upx" | | -| -upxflags | Flags to pass to upx | | -| -v int | Verbosity level (0 - silent, 1 - default, 2 - verbose) | 1 | -| -webview2 | WebView2 installer strategy: download,embed,browser,error | download | -| -u | Updates your project's `go.mod` to use the same version of Wails as the CLI | | -| -debug | Retains debug information in the application. Allows the use of the devtools in the application window | false | -| -trimpath | Remove all file system paths from the resulting executable. | false | -| -race | Build with Go's race detector | false | -| -windowsconsole | Keep the console window for Windows builds | false | - -For a detailed description of the `webview2` flag, please refer to the [Windows](../guides/windows.mdx) Guide. - -If you prefer to build using standard Go tooling, please consult the [Manual Builds](../guides/manual-builds.mdx) guide. - -Example: - -`wails build -clean -o myproject.exe` - -:::info UPX on Apple Silicon - -There are [issues](https://github.com/upx/upx/issues/446) with using UPX with Apple Silicon. - -::: - -:::info UPX on Windows - -Some Antivirus vendors false positively mark `upx` compressed binaries as virus, see [issue](https://github.com/upx/upx/issues/437). - -::: - -### Platforms - -Supported platforms are: - -| Platform | Description | -|:---------------- |:--------------------------------------------- | -| darwin | MacOS + architecture of build machine | -| darwin/amd64 | MacOS 10.13+ AMD64 | -| darwin/arm64 | MacOS 11.0+ ARM64 | -| darwin/universal | MacOS AMD64+ARM64 universal application | -| windows | Windows 10/11 + architecture of build machine | -| windows/amd64 | Windows 10/11 AMD64 | -| windows/arm64 | Windows 10/11 ARM64 | -| linux | Linux + architecture of build machine | -| linux/amd64 | Linux AMD64 | -| linux/arm64 | Linux ARM64 | - -## doctor - -`wails doctor` will run diagnostics to ensure that your system is ready for development. - -Example: - -``` -Wails CLI v2.0.0-beta - -Scanning system - Please wait (this may take a long time)...Done. - -System ------- -OS: Windows 10 Pro -Version: 2009 (Build: 19043) -ID: 21H1 -Go Version: go1.17 -Platform: windows -Architecture: amd64 - -Dependency Package Name Status Version ----------- ------------ ------ ------- -WebView2 N/A Installed 93.0.961.52 -npm N/A Installed 6.14.15 -*upx N/A Installed upx 3.96 - -* - Optional Dependency - -Diagnosis ---------- -Your system is ready for Wails development! - -``` - -## dev - -`wails dev` is used to run your application in a "live development" mode. This means: - -- The application's `go.mod` will be updated to use the same version of Wails as the CLI -- The application is compiled and run automatically -- A watcher is started and will trigger a rebuild of your dev app if it detects changes to your go files -- A webserver is started on `http://localhost:34115` which serves your application (not just frontend) over http. This allows you to use your favourite browser development extensions -- All application assets are loaded from disk. If they are changed, the application will automatically reload (not rebuild). All connected browsers will also reload -- A JS module is generated that provides the following: - - Javascript wrappers of your Go methods with autogenerated JSDoc, providing code hinting - - TypeScript versions of your Go structs, that can be constructed and passed to your go methods -- A second JS module is generated that provides a wrapper + TS declaration for the runtime - -| Flag | Description | Default | -|:---------------------------- |:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |:--------------------- | -| -assetdir "./path/to/assets" | Serve assets from the given directory instead of using the provided asset FS | Value in `wails.json` | -| -browser | Opens a browser to `http://localhost:34115` on startup | | -| -compiler "compiler" | Use a different go compiler to build, eg go1.15beta1 | go | -| -e | Extensions to trigger rebuilds (comma separated) | go | -| -reloaddirs | Additional directories to trigger reloads (comma separated) | Value in `wails.json` | -| -ldflags "flags" | Additional ldflags to pass to the compiler | | -| -tags "extra tags" | Build tags to pass to compiler (quoted and space separated) | | -| -loglevel "loglevel" | Loglevel to use - Trace, Debug, Info, Warning, Error | Debug | -| -noreload | Disable automatic reload when assets change | | -| -nogen | Disable generate module | | -| -v | Verbosity level (0 - silent, 1 - standard, 2 - verbose) | 1 | -| -wailsjsdir | The directory to generate the generated Wails JS modules | Value in `wails.json` | -| -debounce | The time to wait for reload after an asset change is detected | 100 (milliseconds) | -| -devserver "host:port" | The address to bind the wails dev server to | "localhost:34115" | -| -frontenddevserverurl "url" | Use 3rd party dev server url to serve assets, EG Vite | "" | -| -appargs "args" | Arguments passed to the application in shell style | | -| -save | Saves the given `assetdir`, `reloaddirs`, `wailsjsdir`, `debounce`, `devserver` and `frontenddevserverurl` flags in `wails.json` to become the defaults for subsequent invocations. | | -| -race | Build with Go's race detector | false | -| -s | Skip building the frontend | false | - -Example: - -`wails dev -assetdir ./frontend/dist -wailsjsdir ./frontend/src -browser` - -This command will do the following: - -- Build the application and run it (more details [here](../guides/manual-builds.mdx) -- Generate the Wails JS modules in `./frontend/src` -- Watch for updates to files in `./frontend/dist` and reload on any change -- Open a browser and connect to the application - -There is more information on using this feature with existing framework scripts [here](../guides/application-development.mdx#live-reloading). - -## generate - -### template - -Wails uses templates for project generation. The `wails generate template` command helps scaffold a template so that it may be used for generating projects. - -| Flag | Description | -|:---------------- |:------------------------------------------- | -| -name | The template name (Mandatory) | -| -frontend "path" | Path to frontend project to use in template | - -For more details on creating templates, consult the [Templates guide](../guides/templates.mdx). - -### module - -The `wails generate module` command allows you to manually generate the `wailsjs` directory for your application. - -## update - -`wails update` will update the version of the Wails CLI. - -| Flag | Description | -|:------------------ |:------------------------------------- | -| -pre | Update to latest pre-release version | -| -version "version" | Install a specific version of the CLI | - -## version - -`wails version` will simply output the current CLI version. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/menus.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/menus.mdx deleted file mode 100644 index 565c8cb48..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/menus.mdx +++ /dev/null @@ -1,266 +0,0 @@ ---- -sidebar_position: 4 ---- - -# Menus - -It is possible to add an application menu to Wails projects. This is achieved by defining a [Menu](#menu) struct and setting it in the [`Menu`](../reference/options.mdx#menu) application config, or by calling the runtime method [MenuSetApplicationMenu](../reference/runtime/menu.mdx#menusetapplicationmenu). - -An example of how to create a menu: - -```go - AppMenu := menu.NewMenu() - FileMenu := AppMenu.AddSubmenu("File") - FileMenu.AddText("&Open", keys.CmdOrCtrl("o"), openFile) - FileMenu.AddSeparator() - FileMenu.AddText("Quit", keys.CmdOrCtrl("q"), func(_ *menu.CallbackData) { - runtime.Quit() - }) - - if runtime.GOOS == "darwin" { - AppMenu.Append(menu.EditMenu()) // on macos platform, we should append EditMenu to enable Cmd+C,Cmd+V,Cmd+Z... shortcut - } - - err := wails.Run(&options.App{ - Title: "Menus Demo", - Width: 800, - Height: 600, - Menu: AppMenu, - Bind: []interface{}{ - app, - }, - ) - // ... -``` - -```` It is also possible to dynamically update the menu, by updating the menu struct and calling \[MenuUpdateApplicationMenu\](../reference/runtime/menu.mdx#menuupdateapplicationmenu). - -The example above uses helper methods, however it's possible to build the menu structs manually. - -## Menu - -A Menu is a collection of MenuItems: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -## Menu - -A Menu is a collection of MenuItems: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -type Menu struct { - Items []*MenuItem -} -``` - -For the Application menu, each MenuItem represents a single menu such as "Edit". - -A simple helper method is provided for building menus: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -func NewMenuFromItems(first *MenuItem, rest ...*MenuItem) *Menu -``` - -This makes the layout of the code more like that of a menu without the need to add the menu items manually after creating them. Alternatively, you can just create the menu items and add them to the menu manually. - -## MenuItem - -A MenuItem represents an item within a Menu. - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -// MenuItem represents a menu item contained in a menu -type MenuItem struct { - Label string - Role Role - Accelerator *keys.Accelerator - Type Type - Disabled bool - Hidden bool - Checked bool - SubMenu *Menu - Click Callback -} -``` - -| Field | Type | Notes | -| ----------- | ------------------------------------ | ------------------------------------------------------------- | -| Label | string | The menu text | -| Accelerator | [\*keys.Accelerator](#accelerator) | Key binding for this menu item | -| Type | [Type](#type) | Type of MenuItem | -| Disabled | bool | Disables the menu item | -| Hidden | bool | Hides this menu item | -| Checked | bool | Adds check to item (Checkbox & Radio types) | -| SubMenu | [\*Menu](#menu) | Sets the submenu | -| Click | [Callback](#callback) | Callback function when menu clicked | -| Role | string | Defines a [role](#role) for this menu item. Mac only for now. | - -### Accelerator - -Accelerators (sometimes called keyboard shortcuts) define a binding between a keystroke and a menu item. Wails defines an Accelerator as a combination or key + [Modifier](#modifier). They are available in the `"github.com/wailsapp/wails/v2/pkg/menu/keys"` package. - -Example: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" - // Defines cmd+o on Mac and ctrl-o on Window/Linux - myShortcut := keys.CmdOrCtrl("o") -``` - -Keys are any single character on a keyboard with the exception of `+`, which is defined as `plus`. Some keys cannot be represented as characters so there are a set of named characters that may be used: - -- `backspace` -- `tab` -- `return` -- `enter` -- `escape` -- `left` -- `right` -- `up` -- `down` -- `space` -- `delete` -- `home` -- `end` -- `page up` -- `page down` -- `f1` -- `f2` -- `f3` -- `f4` -- `f5` -- `f6` -- `f7` -- `f8` -- `f9` -- `f10` -- `f11` -- `f12` -- `f13` -- `f14` -- `f15` -- `f16` -- `f17` -- `f18` -- `f19` -- `f20` -- `f21` -- `f22` -- `f23` -- `f24` -- `f25` -- `f26` -- `f27` -- `f28` -- `f29` -- `f30` -- `f31` -- `f32` -- `f33` -- `f34` -- `f35` -- `numlock` - -Wails also supports parsing accelerators using the same syntax as Electron. This is useful for storing accelerators in config files. - -Example: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" - // Defines cmd+o on Mac and ctrl-o on Window/Linux - myShortcut, err := keys.Parse("Ctrl+Option+A") -``` - -#### Modifier - -The following modifiers are keys that may be used in combination with the accelerator key: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" -const ( - // CmdOrCtrlKey represents Command on Mac and Control on other platforms - CmdOrCtrlKey Modifier = "cmdorctrl" - // OptionOrAltKey represents Option on Mac and Alt on other platforms - OptionOrAltKey Modifier = "optionoralt" - // ShiftKey represents the shift key on all systems - ShiftKey Modifier = "shift" - // ControlKey represents the control key on all systems - ControlKey Modifier = "ctrl" -) -``` - -A number of helper methods are available to create Accelerators using modifiers: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" -func CmdOrCtrl(key string) *Accelerator -func OptionOrAlt(key string) *Accelerator -func Shift(key string) *Accelerator -func Control(key string) *Accelerator -``` - -Modifiers can be combined using `keys.Combo(key string, modifier1 Modifier, modifier2 Modifier, rest ...Modifier)`: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" - // Defines "Ctrl+Option+A" on Mac and "Ctrl+Alt+A" on Window/Linux - myShortcut := keys.Combo("a", ControlKey, OptionOrAltKey) -``` - -### Type - -Each menu item must have a type and there are 5 types available: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -const ( - TextType Type = "Text" - SeparatorType Type = "Separator" - SubmenuType Type = "Submenu" - CheckboxType Type = "Checkbox" - RadioType Type = "Radio" -) -``` - -For convenience, helper methods are provided to quickly create a menu item: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -func Text(label string, accelerator *keys.Accelerator, click Callback) *MenuItem -func Separator() *MenuItem -func Radio(label string, selected bool, accelerator *keys.Accelerator, click Callback) *MenuItem -func Checkbox(label string, checked bool, accelerator *keys.Accelerator, click Callback) *MenuItem -func SubMenu(label string, menu *Menu) *Menu -``` - -You can also create menu items directly on a menu by using the "Add" helpers: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -func (m *Menu) AddText(label string, accelerator *keys.Accelerator, click Callback) *MenuItem -func (m *Menu) AddSeparator() *MenuItem -func (m *Menu) AddRadio(label string, selected bool, accelerator *keys.Accelerator, click Callback) *MenuItem -func (m *Menu) AddCheckbox(label string, checked bool, accelerator *keys.Accelerator, click Callback) *MenuItem -func (m *Menu) AddSubMenu(label string, menu *Menu) *MenuI -``` - -A note on radio groups: A radio group is defined as a number of radio menu items that are next to each other in the menu. This means that you do not need to group items together as it is automatic. However, that also means you cannot have 2 radio groups next to each other - there must be a non-radio item between them. - -### Callback - -Each menu item may have a callback that is executed when the item is clicked: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -type Callback func(*CallbackData) - -type CallbackData struct { - MenuItem *MenuItem -} -``` - -The function is given a `CallbackData` struct which indicates which menu item triggered the callback. This is useful when using radio groups that may share a callback. - -### Role - -:::info Roles - -Roles are currently supported on Mac only. - -::: - -A menu item may have a role, which is essentially a pre-defined menu item. We currently support the following roles: - -| Role | Description | -| ------------ | ------------------------------------------------------------------------ | -| AppMenuRole | The standard Mac application menu. Can be created using `menu.AppMenu()` | -| EditMenuRole | The standard Mac edit menu. Can be created using `menu.EditMenu()` | diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/options.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/options.mdx deleted file mode 100644 index 797ac7932..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/options.mdx +++ /dev/null @@ -1,627 +0,0 @@ ---- -sidebar_position: 3 ---- - -# Options - -## Application Options - -The `Options.App` struct contains the application configuration. It is passed to the `wails.Run()` method: - -```go title="Example" -import "github.com/wailsapp/wails/v2/pkg/options" - -func main() { - - err := wails.Run(&options.App{ - Title: "Menus Demo", - Width: 800, - Height: 600, - DisableResize: false, - Fullscreen: false, - Frameless: true, - MinWidth: 400, - MinHeight: 400, - MaxWidth: 1280, - MaxHeight: 1024, - StartHidden: false, - HideWindowOnClose: false, - BackgroundColour: &options.RGBA{R: 0, G: 0, B: 0, A: 255}, - AlwaysOnTop: false, - Assets: assets, - AssetsHandler: assetsHandler, - Menu: app.applicationMenu(), - Logger: nil, - LogLevel: logger.DEBUG, - LogLevelProduction: logger.ERROR, - OnStartup: app.startup, - OnDomReady: app.domready, - OnShutdown: app.shutdown, - OnBeforeClose: app.beforeClose, - WindowStartState: options.Maximised, - CSSDragProperty: "--wails-draggable", - CSSDragValue: "drag", - Bind: []interface{}{ - app, - }, - Windows: &windows.Options{ - WebviewIsTransparent: false, - WindowIsTranslucent: false, - DisableWindowIcon: false, - DisableFramelessWindowDecorations: false, - WebviewUserDataPath: "", - WebviewBrowserPath: "", - Theme: windows.SystemDefault, - CustomTheme: &windows.ThemeSettings{ - DarkModeTitleBar: windows.RGB(20, 20, 20), - DarkModeTitleText: windows.RGB(200, 200, 200), - DarkModeBorder: windows.RGB(20, 0, 20), - LightModeTitleBar: windows.RGB(200, 200, 200), - LightModeTitleText: windows.RGB(20, 20, 20), - LightModeBorder: windows.RGB(200, 200, 200), - }, - // User messages that can be customised - Messages *windows.Messages - }, - Mac: &mac.Options{ - TitleBar: &mac.TitleBar{ - TitlebarAppearsTransparent: true, - HideTitle: false, - HideTitleBar: false, - FullSizeContent: false, - UseToolbar: false, - HideToolbarSeparator: true, - }, - Appearance: mac.NSAppearanceNameDarkAqua, - WebviewIsTransparent: true, - WindowIsTranslucent: false, - About: &mac.AboutInfo{ - Title: "My Application", - Message: "© 2021 Me", - Icon: icon, - }, - }, - Linux: &linux.Options{ - Icon: icon, - }, - }) - if err != nil { - log.Fatal(err) - } -} - -``` - -### Title - -The text shown in the window's title bar. - -Type: string - -### Width - -The initial width of the window. - -Name: Width - -### Height - -The initial height of the window. - -Type: [AppearanceType](#appearance-type) - -### DisableResize - -By default, the main window is resizable. Setting this to `true` will keep it a fixed size. - -Type: int - -### Fullscreen - -Setting this to `true` will make the window fullscreen at startup. - -Type: int - -### Frameless - -When set to `true`, the window will have no borders or title bar. Also see [Frameless Windows](../guides/frameless.mdx). - -Type: int - -### MinWidth - -This sets the minimum width for the window. If the value given in `Width` is less than this value, the window will be set to `MinWidth` by default. - -Type: bool - -### MinHeight - -This sets the minimum height for the window. If the value given in `Height` is less than this value, the window will be set to `MinHeight` by default. - -Type: bool - -### MaxWidth - -This sets the maximum width for the window. If the value given in `Width` is more than this value, the window will be set to `MaxWidth` by default. - -Type: bool - -### MaxHeight - -This sets the maximum height for the window. If the value given in `Height` is more than this value, the window will be set to `MaxHeight` by default. - -Type: bool - -### StartHidden - -When set to `true`, the application will be hidden until [WindowShow](../reference/runtime/window.mdx#windowshow) is called. - -Type: int -### HideWindowOnClose - -By default, closing the window will close the application. Setting this to `true` means closing the window will hide the window instead. - -hide the window instead. - -Type: int - -### BackgroundColour - -This value is the default background colour of the window. Default: white - -Type: *options.RGBA Example: options.NewRGBA(255,0,0,128) - Red at 50% transparency - -### AlwaysOnTop - -Indicates that the window should stay above other windows when losing focus. - -Type: int - -### Assets - -The frontend assets to be used by the application. Requires an `index.html` file. - -Name: StartHidden - -### AssetsHandler - - - -The assets handler is a generic `http.Handler` which will be called for any non GET request on the assets server and for GET requests which can not be served from the `assets` because the file is not found. - -| Value | Win | Mac | Lin | -| ----------------------- | --- | --- | --- | -| GET | ✅ | ✅ | ✅ | -| POST | ✅ | ✅ | ❌ | -| PUT | ✅ | ✅ | ❌ | -| PATCH | ✅ | ✅ | ❌ | -| DELETE | ✅ | ✅ | ❌ | -| Request Headers | ✅ | ✅ | ❌ | -| Request Body | ✅ | ✅ | ❌ | -| Request Body Streaming | ❌ | ❌ | ❌ | -| Response StatusCodes | ✅ | ✅ | ❌ | -| Response Headers | ✅ | ✅ | ❌ | -| Response Body | ✅ | ✅ | ✅ | -| Response Body Streaming | ❌ | ❌ | ✅ | - -NOTE: Linux is currently very limited due to targeting a WebKit2GTK Version < 2.36.0. In the future some features will be supported by the introduction of WebKit2GTK 2.36.0+ support. - -NOTE: When used in combination with a Frontend DevServer there might be limitations, eg. Vite serves the index.html on every path, that does not contain a file extension. - -Type: http.Handler - -### Menu - -The menu to be used by the application. More details about Menus in the [Menu Reference](../reference/runtime/menu.mdx). - -NOTE: On Mac, if no menu is specified, a default menu will be created. ::: - -Type: \*menu.Menu - -### Logger - -The logger to be used by the application. More details about logging in the [Log Reference](../reference/runtime/log.mdx). - -Type: bool - -### LogLevel - -The default log level. More details about logging in the [Log Reference](../reference/runtime/log.mdx). - -Name: Assets - -### LogLevelProduction - -The default log level for production builds. More details about logging in the [Log Reference](../reference/runtime/log.mdx). - -Type: logger.LogLevel - -### OnStartup - -This callback is called after the frontend has been created, but before `index.html` has been loaded. It is given the application context. - -Name: AssetsHandler - -### OnDomReady - -This callback is called after the frontend has loaded `index.html` and its resources. It is given the application context. - -Name: AssetsHandler - -### OnShutdown - -This callback is called after the frontend has been destroyed, just before the application terminates. It is given the application context. - -Name: AssetsHandler - -### OnBeforeClose - -If this callback is set, it will be called when the application is about to quit, either by clicking the window close button or calling `runtime.Quit`. Returning true will cause the application to continue, false will continue shutdown as normal. This is good for confirming with the user that they wish to exit the program. - -Example: - -```go title=windowsapp.go -func (b *App) beforeClose(ctx context.Context) (prevent bool) { - dialog, err := runtime.MessageDialog(ctx, runtime.MessageDialogOptions{ - Type: runtime.QuestionDialog, - Title: "Quit?", - Message: "Are you sure you want to quit?", - }) - - if err != nil { - return false - } - return dialog != "Yes" -} -``` - -Type: func(ctx context.Context) bool - -### WindowStartState - -Defines how the window should present itself at startup. - -| Value | Win | Mac | Lin | -| ---------- | --- | --- | --- | -| Fullscreen | ✅ | ✅ | ✅ | -| Maximised | ✅ | ✅ | ✅ | -| Minimised | ✅ | ❌ | ✅ | - -Name: Logger - -### CSSDragProperty - -Indicates the CSS property to use to identify which elements can be used to drag the window. Default: `--wails-draggable`. - -Type: string - -### CSSDragValue - -Indicates what value the `CSSDragProperty` style should have to drag the window. Default: `drag`. - -Type: string - -### Bind - -A slice of struct instances defining methods that need to be bound to the frontend. - -Default: Logger to Stdout - -### Windows - -This defines [Windows specific options](#windows-specific-options). - -Name: LogLevel - -### Mac - -This defines [Mac specific options](#mac-specific-options). - -Default: `Info` in dev mode, `Error` in production mode - -### Linux - -This defines [Linux specific options](#linux-specific-options). - -Name: LogLevelProduction - -## Windows Specific Options - -### WebviewIsTransparent - -Setting this to `true` will make the webview background transparent when an alpha value of `0` is used. This means that if you use `rgba(0,0,0,0)` for `background-color` in your CSS, the host window will show through. Often combined with [WindowIsTranslucent](#WindowIsTranslucent) to make frosty-looking applications. - -Type: int - -### WindowIsTranslucent - -Setting this to `true` will make the window background translucent. Often combined with [WebviewIsTransparent](#WebviewIsTransparent) to make frosty-looking applications. - -Type: int - -### DisableWindowIcon - -Setting this to `true` will remove the icon in the top left corner of the title bar. - -Type: int - -### DisableFramelessWindowDecorations - -Setting this to `true` will remove the window decorations in [Frameless](#Frameless) mode. This means there will be no 'Aero Shadow' and no 'Rounded Corners' shown for the window. Please note that 'Rounded Corners' are only supported on Windows 11. - -Type: int - -### WebviewUserDataPath - -This defines the path where the WebView2 stores the user data. If empty `%APPDATA%\[BinaryName.exe]` will be used. - -Type: string - -### WebviewBrowserPath - -This defines the path to a directory with WebView2 executable files and libraries. If empty, webview2 installed in the system will be used. - -Important information about distribution of fixed version runtime: - -- [How to get and extract runtime](https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution#details-about-the-fixed-version-runtime-distribution-mode) -- [Known issues for fixed version](https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution#known-issues-for-fixed-version) -- [The path of fixed version of the WebView2 Runtime should not contain \Edge\Application\.](https://docs.microsoft.com/en-us/microsoft-edge/webview2/reference/win32/webview2-idl?view=webview2-1.0.1245.22#createcorewebview2environmentwithoptions) - -Type: string - -### Theme - -Minimum Windows Version: Windows 10 2004/20H1 - -This defines the theme that the application should use: - -| Value | Description | -| ------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | -| SystemDefault | *Default*. The theme will be based on the system default. If the user changes their theme, the application will update to use the new setting | -| Dark | The application will use a dark theme exclusively | -| Light | The application will use a light theme exclusively | - -Type: `windows.Theme` - -### CustomTheme - -Name: WindowStartState - -Allows you to specify custom colours for TitleBar, TitleText and Border for both light and dark mode, as well as when the window is active or inactive. - -Type: `windows.CustomTheme` - -#### Name: CustomTheme - -The CustomTheme struct uses `int32` to specify the colour values. These are in the standard(!) Windows format of: `0x00BBGGAA`. A helper function is provided to do RGB conversions into this format: `windows.RGB(r,g,b uint8)`. - -NOTE: Any value not provided will default to black. - -```go -type ThemeSettings struct { - DarkModeTitleBar int32 - DarkModeTitleBarInactive int32 - DarkModeTitleText int32 - DarkModeTitleTextInactive int32 - DarkModeBorder int32 - DarkModeBorderInactive int32 - LightModeTitleBar int32 - LightModeTitleBarInactive int32 - LightModeTitleText int32 - LightModeTitleTextInactive int32 - LightModeBorder int32 - LightModeBorderInactive int32 -} -``` - -Example: - -```go - CustomTheme: &windows.ThemeSettings{ - // Theme to use when window is active - DarkModeTitleBar: windows.RGB(255, 0, 0), // Red - DarkModeTitleText: windows.RGB(0, 255, 0), // Green - DarkModeBorder: windows.RGB(0, 0, 255), // Blue - LightModeTitleBar: windows.RGB(200, 200, 200), - LightModeTitleText: windows.RGB(20, 20, 20), - LightModeBorder: windows.RGB(200, 200, 200), - // Theme to use when window is inactive - DarkModeTitleBarInactive: windows.RGB(128, 0, 0), - DarkModeTitleTextInactive: windows.RGB(0, 128, 0), - DarkModeBorderInactive: windows.RGB(0, 0, 128), - LightModeTitleBarInactive: windows.RGB(100, 100, 100), - LightModeTitleTextInactive: windows.RGB(10, 10, 10), - LightModeBorderInactive: windows.RGB(100, 100, 100), - }, -``` - -### Messages - -A struct of strings used by the webview2 installer if a valid webview2 runtime is not found. - -Type: `*windows.Messages` - -Customise this for any language you choose to support. - -### ResizeDebounceMS - -ResizeDebounceMS is the amount of time to debounce redraws of webview2 when resizing the window. The default value (0) will perform redraws as fast as it can. - -Type: \*mac.Options - -### OnSuspend - -If set, this function will be called when windows initiates a switch to low power mode (suspend/hibernate) - -Name: Linux - -### OnResume - -If set, this function will be called when windows resumes from low power mode (suspend/hibernate) - -Name: Linux - -## Mac Specific Options - -### TitleBar - -The TitleBar struct provides the ability to configure the look and feel of the title bar. - -Type: bool - - -### Appearance - -Appearance is used to set the style of your app in accordance with Apple's [NSAppearance](https://developer.apple.com/documentation/appkit/nsappearancename?language=objc) names. - -Name: WindowIsTranslucent - -### WebviewIsTransparent - -Setting this to `true` will make the webview background transparent when an alpha value of `0` is used. This means that if you use `rgba(0,0,0,0)` for `background-color` in your CSS, the host window will show through. Often combined with [WindowIsTranslucent](#WindowIsTranslucent) to make frosty-looking applications. - -Type: int - -### WindowIsTranslucent - -Setting this to `true` will make the window background translucent. Often combined with [WebviewIsTransparent](#WebviewIsTransparent) to make frosty-looking applications. - -Type: int - -### About - -This configuration lets you set the title, message and icon for the "About" menu item in the app menu created by the "AppMenu" role. - -Name: DisableFramelessWindowDecorations - - -#### Titlebar struct - -The titlebar of the application can be customised by using the TitleBar options: - -```go -type TitleBar struct { - TitlebarAppearsTransparent bool - HideTitle bool - HideTitleBar bool - FullSizeContent bool - UseToolbar bool - HideToolbarSeparator bool -} -``` - -| Name | Description | -| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| TitlebarAppearsTransparent | Makes the titlebar transparent. This has the effect of hiding the titlebar and the content fill the window. [Apple Docs](https://developer.apple.com/documentation/appkit/nswindow/1419167-titlebarappearstransparent?language=objc) | -| HideTitle | Hides the title of the window. [Apple Docs](https://developer.apple.com/documentation/appkit/nswindowtitlevisibility?language=objc) | -| HideTitleBar | Removes [NSWindowStyleMaskTitled](https://developer.apple.com/documentation/appkit/nswindowstylemask/nswindowstylemasktitled/) from the style mask | -| FullSizeContent | Makes the webview fill the entire window. [Apple Docs](https://developer.apple.com/documentation/appkit/nswindowstylemask/nswindowstylemaskfullsizecontentview) | -| UseToolbar | Adds a default toolbar to the window. [Apple Docs](https://developer.apple.com/documentation/appkit/nstoolbar?language=objc) | -| HideToolbarSeparator | Removes the line beneath the toolbar. [Apple Docs](https://developer.apple.com/documentation/appkit/nstoolbar/1516954-showsbaselineseparator?language=objc) | - -Preconfigured titlebar settings are available: - -| Setting | Example | -| --------------------------- | ---------------------------------------------- | -| `mac.TitleBarDefault()` | ![](/img/reference/titlebar-default.webp) | -| `mac.TitleBarHidden()` | ![](/img/reference/titlebar-hidden.webp) | -| `mac.TitleBarHiddenInset()` | ![](/img/reference/titlebar-hidden-inset.webp) | - -Example: - -```go -Mac: &mac.Options{ - TitleBar: mac.TitleBarHiddenInset(), -} -``` - -Click [here](https://github.com/lukakerr/NSWindowStyles) for some inspiration on customising the titlebar. - -#### Appearance type - -You can specify the application's [appearance](https://developer.apple.com/documentation/appkit/nsappearance?language=objc). - -| Value | Description | -| ----------------------------------------------------- | --------------------------------------------------------------- | -| DefaultAppearance | DefaultAppearance uses the default system value | -| NSAppearanceNameAqua | The standard light system appearance | -| NSAppearanceNameDarkAqua | The standard dark system appearance | -| NSAppearanceNameVibrantLight | The light vibrant appearance | -| NSAppearanceNameAccessibilityHighContrastAqua | A high-contrast version of the standard light system appearance | -| NSAppearanceNameAccessibilityHighContrastDarkAqua | A high-contrast version of the standard dark system appearance | -| NSAppearanceNameAccessibilityHighContrastVibrantLight | A high-contrast version of the light vibrant appearance | -| NSAppearanceNameAccessibilityHighContrastVibrantDark | A high-contrast version of the dark vibrant appearance | - -Example: - -```go -Mac: &mac.Options{ - Appearance: mac.NSAppearanceNameDarkAqua, -} -``` - -#### About struct - -```go -type AboutInfo struct { - Title string - Message string - Icon []byte -} -``` - -If these settings are provided, an "About" menu item will appear in the app menu (when using the `AppMenu` role). Given this configuration: - -```go -//go:embed build/appicon.png -var icon []byte - -func main() { - err := wails.Run(&options.App{ - ... - Mac: &mac.Options{ - About: &mac.AboutInfo{ - Title: "My Application", - Message: "© 2021 Me", - Icon: icon, - }, - }, - }) -``` - -The "About" menu item will appear in the app menu: - -
- -
- -
- -When clicked, that will open an about message box: - -
- -
- -
- -## Linux Specific Options - -### Icon - -Sets up the icon representing the window. This icon is used when the window is minimized (also known as iconified). - -Type: []byte - -Some window managers or desktop environments may also place it in the window frame, or display it in other contexts. On others, the icon is not used at all, so your mileage may vary. - -NOTE: Gnome on Wayland at least does not display this icon. To have a application icon there, a `.desktop` file has to be used. On KDE it should work. - -The icon should be provided in whatever size it was naturally drawn; that is, don’t scale the image before passing it. Scaling is postponed until the last minute, when the desired final size is known, to allow best quality. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/project-config.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/project-config.mdx deleted file mode 100644 index 3dc1cf002..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/project-config.mdx +++ /dev/null @@ -1,51 +0,0 @@ ---- -sidebar_position: 5 ---- - -# Project Config - -The project config resides in the `wails.json` file in the project directory. The structure of the config is: - -```json -{ - "name": "[The project name]", - "assetdir": "[Relative path to the directory containing the compiled assets, this is normally inferred and could be left empty]", - "reloaddirs": "[Additional directories to trigger reloads (comma separated), this is only used for some advanced asset configurations]", - "frontend:install": "[The command to install node dependencies, run in the frontend directory - often `npm install`]", - "frontend:build": "[The command to build the assets, run in the frontend directory - often `npm run build`]", - "frontend:dev": "[This command has been replaced by frontend:dev:build. If frontend:dev:build is not specified will falls back to this command. If this command is also not specified will falls back to frontend:build]", - "frontend:dev:build": "[This command is the dev equivalent of frontend:build. If not specified falls back to frontend:dev]", - "frontend:dev:install": "[This command is the dev equivalent of frontend:install. If not specified falls back to frontend:install]", - "frontend:dev:watcher": "[This command is run in a separate process on `wails dev`. Useful for 3rd party watchers or starting 3d party dev servers]", - "frontend:dev:serverUrl": "[URL to a 3rd party dev server to be used to serve assets, EG Vite. If this is set to 'auto' then the devServerUrl will be inferred from the Vite output]", - "wailsjsdir": "[Relative path to the directory that the auto-generated JS modules will be created]", - "version": "[Project config version]", - "outputfilename": "[The name of the binary]", - "debounceMS": 100, // The default time the dev server waits to reload when it detects a change in assets - "devServer": "[Address to bind the wails dev sever to. Default: localhost:34115]", - "appargs": "[Arguments passed to the application in shell style when in dev mode]", - "runNonNativeBuildHooks": false, // Defines if build hooks should be run though they are defined for an OS other than the host OS. - "preBuildHooks": { - "GOOS/GOARCH": "[The command that will be executed before a build of the specified GOOS/GOARCH: ${platform} is replaced with the "GOOS/GOARCH". The "GOOS/GOARCH" hook is executed before the "GOOS/*" and "*/*" hook.]", - "GOOS/*": "[The command that will be executed before a build of the specified GOOS: ${platform} is replaced with the "GOOS/GOARCH". The "GOOS/*" hook is executed before the "*/*" hook.]", - "*/*": "[The command that will be executed before every build: ${platform} is replaced with the "GOOS/GOARCH".]" - }, - "postBuildHooks": { - "GOOS/GOARCH": "[The command that will be executed after a build of the specified GOOS/GOARCH: ${platform} is replaced with the "GOOS/GOARCH" and ${bin} with the path to the compiled binary. The "GOOS/GOARCH" hook is executed before the "GOOS/*" and "*/*" hook.]", - "GOOS/*": "[The command that will be executed after a build of the specified GOOS: ${platform} is replaced with the "GOOS/GOARCH" and ${bin} with the path to the compiled binary. The "GOOS/*" hook is executed before the "*/*" hook.]", - "*/*": "[The command that will be executed after every build: ${platform} is replaced with the "GOOS/GOARCH" and ${bin} with the path to the compiled binary.]" - }, - "info": { // Data used to populate manifests and version info. - "companyName": "[The company name. Default: [The project name]]", - "productName": "[The product name. Default: [The project name]]", - "productVersion": "[The version of the product. Default: '1.0.0']", - "copyright": "[The copyright of the product. Default: 'Copyright.........']", - "comments": "[A short comment of the app. Default: 'Built using Wails (https://wails.app)']" - }, - "nsisType": "['multiple': One installer per architecture. 'single': Single universal installer for all architectures being built. Default: 'multiple']" -} -``` - -This file is read by the Wails CLI when running `wails build` or `wails dev`. - -The `assetdir`, `reloaddirs`, `wailsjsdir`, `debounceMS`, `devserver` and `frontenddevserverurl` flags in `wails build/dev` will update the project config and thus become defaults for subsequent runs. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/_category_.json b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/_category_.json deleted file mode 100644 index ac6d55488..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Runtime", - "position": 1 -} diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/browser.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/browser.mdx deleted file mode 100644 index 976ca1d80..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/browser.mdx +++ /dev/null @@ -1,14 +0,0 @@ ---- -sidebar_position: 7 ---- - -# Browser - -These methods are related to the system browser. - -### BrowserOpenURL - -Opens the given URL in the system browser. - -Go: `BrowserOpenURL(ctx context.Context, url string)`
JS: `BrowserOpenURL(url string)` - diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/dialog.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/dialog.mdx deleted file mode 100644 index bf1dd7246..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/dialog.mdx +++ /dev/null @@ -1,283 +0,0 @@ ---- -sidebar_position: 5 ---- - -# Dialog - -This part of the runtime provides access to native dialogs, such as File Selectors and Message boxes. - -:::info Javascript - Dialog is currently unsupported in the JS runtime. -::: - -### OpenDirectoryDialog - -Opens a dialog that prompts the user to select a directory. Can be customised using [OpenDialogOptions](#opendialogoptions). - -Go: `OpenDirectoryDialog(ctx context.Context, dialogOptions OpenDialogOptions) (string, error)` - -Returns: Selected directory (blank if the user cancelled) or an error - -### OpenFileDialog - -Opens a dialog that prompts the user to select a file. Can be customised using [OpenDialogOptions](#opendialogoptions). - -Go: `OpenFileDialog(ctx context.Context, dialogOptions OpenDialogOptions) (string, error)` - -Returns: Selected file (blank if the user cancelled) or an error - -### OpenMultipleFilesDialog - -Opens a dialog that prompts the user to select multiple files. Can be customised using [OpenDialogOptions](#opendialogoptions). - -Go: `OpenMultipleFilesDialog(ctx context.Context, dialogOptions OpenDialogOptions) ([]string, error)` - -Returns: Selected files (nil if the user cancelled) or an error - -### SaveFileDialog - -Opens a dialog that prompts the user to select a filename for the purposes of saving. Can be customised using [SaveDialogOptions](#savedialogoptions). - -Go: `SaveFileDialog(ctx context.Context, dialogOptions SaveDialogOptions) (string, error)` - -Returns: The selected file (blank if the user cancelled) or an error - -### MessageDialog - -Displays a message using a message dialog. Can be customised using [MessageDialogOptions](#messagedialogoptions). - -Go: `MessageDialog(ctx context.Context, dialogOptions MessageDialogOptions) (string, error)` - -Returns: The text of the selected button or an error - -## Options - -### OpenDialogOptions - -```go -type OpenDialogOptions struct { - DefaultDirectory string - DefaultFilename string - Title string - Filters []FileFilter - ShowHiddenFiles bool - CanCreateDirectories bool - ResolvesAliases bool - TreatPackagesAsDirectories bool -} -``` - -| Field | Description | Win | Mac | Lin | -| -------------------------- | ---------------------------------------------- | --- | --- | --- | -| DefaultDirectory | The directory the dialog will show when opened | ✅ | ✅ | ✅ | -| DefaultFilename | The default filename | ✅ | ✅ | ✅ | -| Title | Title for the dialog | ✅ | ✅ | ✅ | -| [Filters](#filefilter) | A list of file filters | ✅ | ✅ | ✅ | -| ShowHiddenFiles | Show files hidden by the system | | ✅ | ✅ | -| CanCreateDirectories | Allow user to create directories | | ✅ | | -| ResolvesAliases | If true, returns the file not the alias | | ✅ | | -| TreatPackagesAsDirectories | Allow navigating into packages | | ✅ | | - -### SaveDialogOptions - -```go -type SaveDialogOptions struct { - DefaultDirectory string - DefaultFilename string - Title string - Filters []FileFilter - ShowHiddenFiles bool - CanCreateDirectories bool - TreatPackagesAsDirectories bool -} -``` - -| Field | Description | Win | Mac | Lin | -| -------------------------- | ---------------------------------------------- | --- | --- | --- | -| DefaultDirectory | The directory the dialog will show when opened | ✅ | ✅ | ✅ | -| DefaultFilename | The default filename | ✅ | ✅ | ✅ | -| Title | Title for the dialog | ✅ | ✅ | ✅ | -| [Filters](#filefilter) | A list of file filters | ✅ | ✅ | ✅ | -| ShowHiddenFiles | Show files hidden by the system | | ✅ | ✅ | -| CanCreateDirectories | Allow user to create directories | | ✅ | | -| TreatPackagesAsDirectories | Allow navigating into packages | | ✅ | | - -### MessageDialogOptions - -```go -type MessageDialogOptions struct { - Type DialogType - Title string - Message string - Buttons []string - DefaultButton string - CancelButton string -} -``` - -| Field | Description | Win | Mac | Lin | -| ------------- | ------------------------------------------------------------------------- | --- | --- | --- | -| Type | The type of message dialog, eg question, info... | ✅ | ✅ | ✅ | -| Title | Title for the dialog | ✅ | ✅ | ✅ | -| Message | The message to show the user | ✅ | ✅ | ✅ | -| Buttons | A list of button titles | | ✅ | | -| DefaultButton | The button with this text should be treated as default. Bound to `return` | | ✅ | | -| CancelButton | The button with this text should be treated as cancel. Bound to `escape` | | ✅ | | - -#### Windows - -Windows has standard dialog types in which the buttons are not customisable. The value returned will be one of: "Ok", "Cancel", "Abort", "Retry", "Ignore", "Yes", "No", "Try Again" or "Continue" - -#### Linux - -Linux has standard dialog types in which the buttons are not customisable. The value returned will be one of: "Ok", "Cancel", "Yes", "No" - -#### Mac - -A message dialog on Mac may specify up to 4 buttons. If no `DefaultButton` or `CancelButton` is given, the first button is considered default and is bound to the `return` key. - -For the following code: - -```go -selection, err := runtime.MessageDialog(b.ctx, runtime.MessageDialogOptions{ - Title: "It's your turn!", - Message: "Select a number", - Buttons: []string{"one", "two", "three", "four"}, -}) -``` - -the first button is shown as default: - -
- -
- -
- -And if we specify `DefaultButton` to be "two": - -```go -selection, err := runtime.MessageDialog(b.ctx, runtime.MessageDialogOptions{ - Title: "It's your turn!", - Message: "Select a number", - Buttons: []string{"one", "two", "three", "four"}, - DefaultButton: "two", -}) -``` - -the second button is shown as default. When `return` is pressed, the value "two" is returned. - -
- -
- -
- -If we now specify `CancelButton` to be "three": - -```go -selection, err := runtime.MessageDialog(b.ctx, runtime.MessageDialogOptions{ - Title: "It's your turn!", - Message: "Select a number", - Buttons: []string{"one", "two", "three", "four"}, - DefaultButton: "two", - CancelButton: "three", -}) -``` - -the button with "three" is shown at the bottom of the dialog. When `escape` is pressed, the value "three" is returned: - -
- -
- -
-
-
- -#### DialogType - -```go -const ( - InfoDialog DialogType = "info" - WarningDialog DialogType = "warning" - ErrorDialog DialogType = "error" - QuestionDialog DialogType = "question" - ) -``` - -### FileFilter - -```go -type FileFilter struct { - DisplayName string // Filter information EG: "Image Files (*.jpg, *.png)" - Pattern string // semi-colon separated list of extensions, EG: "*.jpg;*.png" -} -``` - -#### Windows - -Windows allows you to use multiple file filters in dialog boxes. Each FileFilter will show up as a separate entry in the dialog: - -
- -
- -
-
-
- -#### Linux - -Linux allows you to use multiple file filters in dialog boxes. Each FileFilter will show up as a separate entry in the dialog: - -
- -
- -
-
-
- -#### Mac - -Mac dialogs only have the concept of a single set of patterns to filter files. If multiple FileFilters are provided, Wails will use all the Patterns defined. - -Example: - -```go - selection, err := runtime.OpenFileDialog(b.ctx, runtime.OpenDialogOptions{ - Title: "Select File", - Filters: []runtime.FileFilter{ - { - DisplayName: "Images (*.png;*.jpg)", - Pattern: "*.png;*.jpg", - }, { - DisplayName: "Videos (*.mov;*.mp4)", - Pattern: "*.mov;*.mp4", - }, - }, - }) -``` - -This will result in the Open File dialog using `*.png,*.jpg,*.mov,*.mp4` as a filter. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/events.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/events.mdx deleted file mode 100644 index 75e8b0a50..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/events.mdx +++ /dev/null @@ -1,38 +0,0 @@ ---- -sidebar_position: 2 ---- - -# Events - -The Wails runtime provides a unified events system, where events can be emitted or received by either Go or Javascript. Optionally, data may be passed with the events. Listeners will receive the data in the local data types. - -### EventsOn - -This method sets up a listener for the given event name. When an event of type `eventName` is [emitted](#EventsEmit), the callback is triggered. Any additional data sent with the emitted event will be passed to the callback. - -Go: `EventsOn(ctx context.Context, eventName string, callback func(optionalData ...interface{}))`
JS: `EventsOn(eventName string, callback function(optionalData?: any))` - -### EventsOff - -This method unregisters the listener for the given event name, optionally multiple listeneres can be unregistered via `additionalEventNames`. - -Go: `EventsOff(ctx context.Context, eventName string, additionalEventNames ...string)`
JS: `EventsOff(eventName string, ...additionalEventNames)` - -### EventsOnce - -This method sets up a listener for the given event name, but will only trigger once. - -Go: `EventsOnce(ctx context.Context, eventName string, callback func(optionalData ...interface{}))`
JS: `EventsOnce(eventName string, callback function(optionalData?: any))` - -### EventsOnMultiple - -This method sets up a listener for the given event name, but will only trigger a maximum of `counter` times. - -Go: `EventsOnMultiple(ctx context.Context, eventName string, callback func(optionalData ...interface{}), counter int)`
JS: `EventsOnMultiple(eventName string, callback function(optionalData?: any), counter int)` - -### EventsEmit - -This method emits the given event. Optional data may be passed with the event. This will trigger any event listeners. - -Go: `EventsEmit(ctx context.Context, eventName string, optionalData ...interface{})`
JS: `EventsEmit(ctx context, optionalData function(optionalData?: any))` - diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/intro.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/intro.mdx deleted file mode 100644 index 6c02c71cd..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/intro.mdx +++ /dev/null @@ -1,73 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Introduction - -The runtime is a library that provides utility methods for your application. There is both a Go and Javascript runtime and the aim is to try and keep them at parity where possible. - -It has utility methods for: - -- [Window](window.mdx) -- [Menu](menu.mdx) -- [Dialog](dialog.mdx) -- [Events](events.mdx) -- [Browser](browser.mdx) -- [Log](log.mdx) - -The Go Runtime is available through importing `github.com/wailsapp/wails/v2/pkg/runtime`. All methods in this package take a context as the first parameter. This context should be obtained from the [OnStartup](../options.mdx#onstartup) or [OnDomReady](../options.mdx#ondomready) hooks. - -:::info Note - -Whilst the context will be provided to the [OnStartup](../options.mdx#onstartup) method, there's no guarantee the runtime will work in this method as the window is initialising in a different thread. If you wish to call runtime methods at startup, use [OnDomReady](../options.mdx#ondomready). - -::: - -The Javascript library is available to the frontend via the `window.runtime` map. There is a runtime package generated when using `dev` mode that provides Typescript declarations for the runtime. This should be located in the `wailsjs` directory in your frontend directory. - -### Hide - -Go: `Hide(ctx context.Context)`
JS: `Hide()` - -Hides the application. - -:::info Note On Mac, this will hide the application in the same way as the `Hide` menu item in standard Mac applications. This is different to hiding the window, but the application still being in the foreground. For Windows and Linux, this is currently the same as `WindowHide`. ::: - -### Show - -Shows the application. - -:::info Note On Mac, this will bring the application back into the foreground. For Windows and Linux, this is currently the same as `WindowShow`. ::: - -Go: `Show(ctx context.Context)`
JS: `Show()` - -### Quit - -Quits the application. - -Go: `Quit(ctx context.Context)`
JS: `Quit()` - -### Environment - -Returns details of the current environment. - -Go: `Environment(ctx context.Context) EnvironmentInfo`
JS: `Environment(): Promise` - -#### EnvironmentInfo - -Go: -```go -type EnvironmentInfo struct { - BuildType string - Platform string - Arch string -} -``` -JS: -```ts -interface EnvironmentInfo { - buildType: string; - platform: string; - arch: string; -} -``` diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/log.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/log.mdx deleted file mode 100644 index e5e6ea7ac..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/log.mdx +++ /dev/null @@ -1,130 +0,0 @@ ---- -sidebar_position: 3 ---- - -# Log - -The Wails runtime provides a logging mechanism that may be called from Go or Javascript. Like most loggers, there are a number of log levels: - -- Trace -- Debug -- Info -- Warning -- Error -- Fatal - -The logger will output any log message at the current, or higher, log level. Example: The `Debug` log level will output all messages except `Trace` messages. - -### LogPrint - -Logs the given message as a raw message. - -Go: `LogPrint(ctx context.Context, message string)`
JS: `LogPrint(message: string)` - -### LogPrintf - -Logs the given message as a raw message. - -Go: `LogPrintf(ctx context.Context, format string, args ...interface{})`
- -### LogTrace - -Logs the given message at the `Trace` log level. - -Go: `LogTrace(ctx context.Context, message string)`
JS: `LogTrace(message: string)` - -### LogTracef - -Logs the given message at the `Trace` log level. - -Go: `LogTracef(ctx context.Context, format string, args ...interface{})`
- -### LogDebug - -Logs the given message at the `Debug` log level. - -Go: `LogDebug(ctx context.Context, message string)`
JS: `LogDebug(message: string)` - -### LogDebugf - -Logs the given message at the `Debug` log level. - -Go: `LogDebugf(ctx context.Context, format string, args ...interface{})`
- -### LogInfo - -Logs the given message at the `Info` log level. - -Go: `LogInfo(ctx context.Context, message string)`
JS: `LogInfo(message: string)` - -### LogInfof - -Logs the given message at the `Info` log level. - -Go: `LogInfof(ctx context.Context, format string, args ...interface{})`
- -### LogWarning - -Logs the given message at the `Warning` log level. - -Go: `LogWarning(ctx context.Context, message string)`
JS: `LogWarning(message: string)` - -### LogWarningf - -Logs the given message at the `Warning` log level. - -Go: `LogWarningf(ctx context.Context, format string, args ...interface{})`
- -### LogError - -Logs the given message at the `Error` log level. - -Go: `LogError(ctx context.Context, message string)`
JS: `LogError(message: string)` - -### LogErrorf - -Logs the given message at the `Error` log level. - -Go: `LogErrorf(ctx context.Context, format string, args ...interface{})`
- -### LogFatal - -Logs the given message at the `Fatal` log level. - -Go: `LogFatal(ctx context.Context, message string)`
JS: `LogFatal(message: string)` - -### LogFatalf - -Logs the given message at the `Fatal` log level. - -Go: `LogFatalf(ctx context.Context, format string, args ...interface{})`
- -### LogSetLogLevel - -Sets the log level. In Javascript, the number relates to the following log levels: - -| Value | Log Level | -| ----- | --------- | -| 1 | Trace | -| 2 | Debug | -| 3 | Info | -| 4 | Warning | -| 5 | Error | - -Go: `LogSetLogLevel(ctx context.Context, level logger.LogLevel)`
JS: `LogSetLogLevel(level: number)` - -## Using a Custom Logger - -A custom logger may be used by providing it using the [Logger](../options.mdx#logger) application option. The only requirement is that the logger implements the `logger.Logger` interface defined in `github.com/wailsapp/wails/v2/pkg/logger`: - -```go title="logger.go" -type Logger interface { - Print(message string) - Trace(message string) - Debug(message string) - Info(message string) - Warning(message string) - Error(message string) - Fatal(message string) -} -``` diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/menu.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/menu.mdx deleted file mode 100644 index 226ff2c68..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/menu.mdx +++ /dev/null @@ -1,23 +0,0 @@ ---- -sidebar_position: 6 ---- - -# Menu - -These methods are related to the application menu. - -:::info Javascript - Menu is currently unsupported in the JS runtime. -::: - -### MenuSetApplicationMenu - -Sets the application menu to the given [menu](../menus.mdx). - -Go: `MenuSetApplicationMenu(ctx context.Context, menu *menu.Menu)` - -### MenuUpdateApplicationMenu - -Updates the application menu, picking up any changes to the menu passed to `MenuSetApplicationMenu`. - -Go: `MenuUpdateApplicationMenu(ctx context.Context)` diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/window.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/window.mdx deleted file mode 100644 index d33db2cbf..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/window.mdx +++ /dev/null @@ -1,209 +0,0 @@ ---- -sidebar_position: 4 ---- - -# Window - -These methods give control of the application window. - -### WindowSetTitle - -Sets the text in the window title bar. - -Go: `WindowSetTitle(ctx context.Context, title string)`
JS: `WindowSetTitle(title: string)` - -### WindowFullscreen - -Makes the window full screen. - -Go: `WindowFullscreen(ctx context.Context)`
JS: `WindowFullscreen()` - -### WindowUnfullscreen - -Restores the previous window dimensions and position prior to full screen. - -Go: `WindowUnfullscreen(ctx context.Context)`
JS: `WindowUnfullscreen()` - -### WindowIsFullscreen - -Returns true if the window is full screen. - -Go: `WindowCenter(ctx context.Context)`
JS: `WindowCenter()` - -### WindowCenter - -Centers the window on the monitor the window is currently on. - -Go: `WindowReload(ctx context.Context)`
JS: `WindowReload()` - -### WindowReload - -Performs a "reload" (Reloads current page). - -Go: `WindowReloadApp(ctx context.Context)`
JS: `WindowReloadApp()` - -### WindowReloadApp - -Reloads the application frontend. - -Go: `WindowSetSystemDefaultTheme(ctx context.Context)`
JS: `WindowSetSystemDefaultTheme()` - -### WindowSetSystemDefaultTheme - -Windows only. - -Go: `WindowSetDarkTheme(ctx context.Context)`
JS: `WindowSetDarkTheme()` - -Sets window theme to system default (dark/light). - -### WindowSetLightTheme - -Windows only. - -Go: `WindowSetLightTheme(ctx context.Context)`
JS: `WindowSetLightTheme()` - -Sets window theme to light. - -### WindowSetDarkTheme - -Windows only. - -Go: `WindowShow(ctx context.Context)`
JS: `WindowShow()` - -Sets window theme to dark. - -### WindowShow - -Shows the window, if it is currently hidden. - -Go: `WindowHide(ctx context.Context)`
JS: `WindowHide()` - -### WindowHide - -Hides the window, if it is currently visible. - -Go: `WindowSetSize(ctx context.Context, width int, height int)`
JS: `WindowSetSize(size: Size)` - -### WindowIsNormal - -Returns true if the window not minimised, maximised or fullscreen. - -Go: `WindowGetSize(ctx context.Context) (width int, height int)`
JS: `WindowGetSize() : Size` - -### WindowSetSize - -Sets the width and height of the window. - -Go: `WindowSetMaxSize(ctx context.Context, width int, height int)`
JS: `WindowSetMaxSize(size: Size)` - -### WindowGetSize - -Gets the width and height of the window. - -Go: `WindowSetMinSize(ctx context.Context, width int, height int)`
JS: `WindowSetMinSize(size: Size)` - -### WindowSetMinSize - -Sets the minimum window size. Will resize the window if the window is currently smaller than the given dimensions. - -Setting a size of `0,0` will disable this constraint. - -Go: `WindowSetAlwaysOnTop(ctx context.Context, b bool)`
JS: `WindowSetAlwaysOnTop(b: Boolen)` - -### WindowSetMaxSize - -Sets the maximum window size. Will resize the window if the window is currently larger than the given dimensions. - -Setting a size of `0,0` will disable this constraint. - -Go: `WindowSetPosition(ctx context.Context, x int, y int)`
JS: `WindowSetPosition(position: Position)` - -### WindowSetAlwaysOnTop - -Sets the window AlwaysOnTop or not on top. - -Go: `WindowGetPosition(ctx context.Context) (x int, y int)`
JS: `WindowGetPosition() : Position` - -### WindowSetPosition - -Sets the window position relative to the monitor the window is currently on. - -Go: `WindowMaximise(ctx context.Context)`
JS: `WindowMaximise()` - -### WindowGetPosition - -Gets the window position relative to the monitor the window is currently on. - -Go: `WindowUnmaximise(ctx context.Context)`
JS: `WindowUnmaximise()` - -### WindowMaximise - -Maximises the window to fill the screen. - -Go: `WindowToggleMaximise(ctx context.Context)`
JS: `WindowToggleMaximise()` - -### WindowUnmaximise - -Restores the window to the dimensions and position prior to maximising. - -Go: `WindowMinimise(ctx context.Context)`
JS: `WindowMinimise()` - -### WindowIsMaximised - -Returns true if the window is maximised. - -Go: `WindowUnminimise(ctx context.Context)`
JS: `WindowUnminimise()` - -### WindowToggleMaximise - -Toggles between Maximised and UnMaximised. - -Go: `WindowToggleMaximise(ctx context.Context)`
JS: `WindowToggleMaximise()` - -### WindowMinimise - -Minimises the window. - -Go: `WindowSetBackgroundColour(ctx context.Context, R, G, B, A uint8)`
JS: `WindowSetBackgroundColour(R, G, B, A)` - -### WindowUnminimise - -Restores the window to the dimensions and position prior to minimising. - -Go: `WindowUnminimise(ctx context.Context)`
JS: `WindowUnminimise()` - -### WindowIsMinimised - -Returns true if the window is minimised. - -Go: `WindowIsMinimised(ctx context.Context) bool` JS: `WindowIsMinimised() bool` - -### WindowSetBackgroundColour - -Sets the background colour of the window to the given RGBA colour definition. This colour will show through for all transparent pixels. - -Valid values for R, G, B and A are 0-255. - -Any value that is not 0 will be considered 255. Any value that is not 0 will be considered 255. ::: - -Go: `WindowSetBackgroundColour(ctx context.Context, R, G, B, A uint8)`
JS: `WindowSetBackgroundColour(R, G, B, A)` - -## Typescript Object Definitions - -### Position - -```ts -interface Position { - x: number; - y: number; -} -``` - -### Size - -```ts -interface Size { - w: number; - h: number; -} -``` diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/_category_.json b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/_category_.json deleted file mode 100644 index dfac1d175..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Tutorials", - "position": 70 -} diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/dogsapi.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/dogsapi.mdx deleted file mode 100644 index f4845fdbe..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/dogsapi.mdx +++ /dev/null @@ -1,243 +0,0 @@ ---- -sidebar_position: 20 ---- - -# Dogs API - -
- -
- -
- -:::note This tutorial has been kindly provided by [@tatadan](https://twitter.com/tatadan) and forms part of their [Wails Examples Repository](https://github.com/tataDan/wails-v2-examples). ::: - -In this tutorial we are going to develop an application that retrieves photos of dogs from the web and then displays them. - -### Create the project - -Let's create the application. From a terminal enter: `wails init -n dogs-api -t svelte` - -Note: We could optionally add `-ide vscode` or `-ide goland` to the end of this command if you wanted to add IDE support. - -Now let's `cd dogs-api` and start editing the project files. - -### Remove unused code - -We will start by removing some elements that we know we will not use: - -- Open `app.go` and remove the following lines: - -```go -// Greet returns a greeting for the given name -func (a *App) Greet(name string) string { - return fmt.Sprintf("Hello %s, It's show time!", name) -} -``` - -- Open `frontend/src/App.svelte` and delete all lines. -- Delete the `frontend/src/assets/images/logo-universal.png` file - -### Creating our application - -Now let's add our new Go code. - -Add the following struct declarations to `app.go` before the function definitions: - -```go -type RandomImage struct { - Message string - Status string -} - -type AllBreeds struct { - Message map[string]map[string][]string - Status string -} - -type ImagesByBreed struct { - Message []string - Status string -} -``` - -Add the following functions to `app.go` (perhaps after the existing function definitions): - -```go -func (a *App) GetRandomImageUrl() string { - response, err := http.Get("https://dog.ceo/api/breeds/image/random") - if err != nil { - log.Fatal(err) - } - - responseData, err := ioutil.ReadAll(response.Body) - if err != nil { - log.Fatal(err) - } - - var data RandomImage - json.Unmarshal(responseData, &data) - - return data.Message -} - -func (a *App) GetBreedList() []string { - var breeds []string - - response, err := http.Get("https://dog.ceo/api/breeds/list/all") - if err != nil { - log.Fatal(err) - } - - responseData, err := ioutil.ReadAll(response.Body) - if err != nil { - log.Fatal(err) - } - - var data AllBreeds - json.Unmarshal(responseData, &data) - - for k := range data.Message { - breeds = append(breeds, k) - } - - sort.Strings(breeds) - - return breeds -} - -func (a *App) GetImageUrlsByBreed(breed string) []string { - - url := fmt.Sprintf("%s%s%s%s", "https://dog.ceo/api/", "breed/", breed, "/images") - response, err := http.Get(url) - if err != nil { - log.Fatal(err) - } - - responseData, err := ioutil.ReadAll(response.Body) - if err != nil { - log.Fatal(err) - } - - var data ImagesByBreed - json.Unmarshal(responseData, &data) - - return data.Message -} -``` - -Modify the `import` section of `app.go` to look like this: - -```go -import ( - "context" - "fmt" - "encoding/json" - "io/ioutil" - "log" - "net/http" - "sort" -) -``` - -Add the following lines to `frontend/src/App.svelte`: - -```html - - -

Dogs API

-
- - Click on down arrow to select a breed - - -
-
-{#if showRandomPhoto} - No dog found -{/if} -{#if showBreedPhotos} - {#each photos as photo} - No dog found - {/each} -{/if} - - -``` - -### Testing the application - -To generate the bindings and test the application, run `wails dev`. - -### Compiling the application - -To compile the application to a single, production grade binary, run `wails build`. - - - - - diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/helloworld.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/helloworld.mdx deleted file mode 100644 index d1b8e9f98..000000000 --- a/website/i18n/ja/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/helloworld.mdx +++ /dev/null @@ -1,118 +0,0 @@ ---- -sidebar_position: 10 ---- - -# Hello World - -The aim of this tutorial is to get you up and running with the most basic application using Wails. You will be able to: - -- Create a new Wails application -- Build the application -- Run the application - -:::note -This tutorial uses Windows as the target platform. Output will vary slightly -depending on your operating system. -::: - -## Create a new Wails application - -To create a new Wails application using the default vanilla JS template, you need to run the following command: - -```bash -wails init -n helloworld -``` - -You should see something similar to the following: - -``` -Wails CLI v2.0.0 - -Initialising Project 'helloworld' ---------------------------------- - -Project Name: helloworld -Project Directory: C:\Users\leaan\tutorial\helloworld -Project Template: vanilla -Template Support: https://wails.io - -Initialised project 'helloworld' in 232ms. -``` - -This will create a new directory called `helloworld` in the current directory. In this directory, you will find a number of files: - -``` -build/ - Contains the build files + compiled application -frontend/ - Contains the frontend files -app.go - Contains the application code -main.go - The main program with the application configuration -wails.json - The project configuration file -go.mod - The go module file -go.sum - The go module checksum file -``` - -## Build the application - -To build the application, change to the new `helloworld` project directory and run the following command: - -```bash -wails build -``` - -You should see something like the following: - -``` -Wails CLI v2.0.0 - -App Type: desktop -Platforms: windows/amd64 -Compiler: C:\Users\leaan\go\go1.18.3\bin\go.exe -Build Mode: Production -Skip Frontend: false -Compress: false -Package: true -Clean Build Dir: false -LDFlags: "" -Tags: [] -Race Detector: false - -Building target: windows/amd64 ------------------------------- - - Installing frontend dependencies: Done. - - Compiling frontend: Done. - - Generating bundle assets: Done. - - Compiling application: Done. -Built 'C:\Users\leaan\tutorial\helloworld\build\bin\helloworld.exe' in 10.616s. -``` - -This has compiled the application and saved it in the `build/bin` directory. - -## Run the application - -If we view the `build/bin` directory in Windows Explorer, we should see our project binary: - -
- -
- -
- -We can run it by simply double-clicking the `helloworld.exe` file. - -On Mac, Wails generates a `helloworld.app` file which can be run by double-clicking it. - -On Linux, you can run the application using `./helloworld` from the `build/bin` directory. - -You should see the application working as expected: - -
- -
-
diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-beta.44.json b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-beta.44.json deleted file mode 100644 index 9702534ef..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-beta.44.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "version.label": { - "message": "v2.0.0-beta.44", - "description": "The label for version v2.0.0-beta.44" - }, - "sidebar.tutorialSidebar.category.Getting Started": { - "message": "시작하기", - "description": "The label for category Getting Started in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Reference": { - "message": "참조", - "description": "The label for category Reference in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Runtime": { - "message": "런타임", - "description": "The label for category Runtime in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Community": { - "message": "커뮤니티", - "description": "The label for category Community in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Showcase": { - "message": "쇼케이스", - "description": "The label for category Showcase in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Guides": { - "message": "가이드", - "description": "The label for category Guides in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Tutorials": { - "message": "Tutorials", - "description": "The label for category Tutorials in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Contributing": { - "message": "Contributing", - "description": "The label for category Contributing in sidebar tutorialSidebar" - } -} diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1.json b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1.json deleted file mode 100644 index 49cf4687e..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "version.label": { - "message": "v2.0.0-rc.1", - "description": "The label for version v2.0.0-rc.1" - }, - "sidebar.docs.category.Getting Started": { - "message": "Getting Started", - "description": "The label for category Getting Started in sidebar docs" - }, - "sidebar.docs.category.Reference": { - "message": "Reference", - "description": "The label for category Reference in sidebar docs" - }, - "sidebar.docs.category.Runtime": { - "message": "Runtime", - "description": "The label for category Runtime in sidebar docs" - }, - "sidebar.docs.category.Community": { - "message": "Community", - "description": "The label for category Community in sidebar docs" - }, - "sidebar.docs.category.Showcase": { - "message": "Showcase", - "description": "The label for category Showcase in sidebar docs" - }, - "sidebar.docs.category.Guides": { - "message": "Guides", - "description": "The label for category Guides in sidebar docs" - }, - "sidebar.docs.category.Tutorials": { - "message": "Tutorials", - "description": "The label for category Tutorials in sidebar docs" - }, - "sidebar.docs.link.Contributing": { - "message": "Contributing", - "description": "The label for link Contributing in sidebar docs, linking to /community-guide#ways-of-contributing" - } -} diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/appendix/_category_.json b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/appendix/_category_.json deleted file mode 100644 index 83af4ca28..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/appendix/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Appendix", - "position": 70 -} diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/_category_.json b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/_category_.json deleted file mode 100644 index 524986e1e..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Community", - "position": 50 -} diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/links.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/links.mdx deleted file mode 100644 index 4a3a89e87..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/links.mdx +++ /dev/null @@ -1,23 +0,0 @@ ---- -sidebar_position: 2 ---- - -# Links - -This page serves as a list for community related links. Please submit a PR (click `Edit this page` at the bottom) to submit links. - -## Awesome Wails - -The [definitive list](https://github.com/wailsapp/awesome-wails) of links related to Wails. - -## Support Channels - -- [Gophers Slack Channel](https://gophers.slack.com/messages/CJ4P9F7MZ/) -- [Gophers Slack Channel Invite](https://invite.slack.golangbridge.org/) -- [Github Issues](https://github.com/wailsapp/wails/issues) -- [v2 Beta Discussion Board](https://github.com/wailsapp/wails/discussions/828) - -## Social Media - -- [Twitter](https://twitter.com/wailsapp) -- [Wails Chinese Community QQ Group](https://qm.qq.com/cgi-bin/qm/qr?k=PmIURne5hFGNd7QWzW5qd6FV-INEjNJv&jump_from=webapi) - Group number: 1067173054 diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/_category_.json b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/_category_.json deleted file mode 100644 index 276e283b7..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Showcase", - "position": 1 -} diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/emailit.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/emailit.mdx deleted file mode 100644 index 4a1ebe835..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/emailit.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# EmailIt - -

- -
-

- -[EmailIt](https://github.com/raguay/EmailIt/) is a Wails 2 program that is a markdown based email sender only with nine notepads, scripts to manipulate the text, and templates. It also has a builtin [Node-Red](https://nodered.org/) server, scripts terminal, and the [ScriptBar](https://github.com/raguay/ScriptBarApp) program for displaying results from Node-Red or a script on your system. Documentation is very scarce, but the programs works. It’s built using Wails2 and Svelte, and the download is a universal macOS application. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/encrypteasy.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/encrypteasy.mdx deleted file mode 100644 index 13c2d8345..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/encrypteasy.mdx +++ /dev/null @@ -1,10 +0,0 @@ -# EncryptEasy - -

- -
-

- -**[EncryptEasy](https://www.encrypteasy.app) is a simple and easy to use PGP encryption tool, managing all your and your contacts keys. Encryption should be simple. Developed with Wails.** - -Encrypting messages using PGP is the industry standard. Everyone has a private and a public key. Your private key, well, needs to be kept private so only you can read messages. Your public key is distributed to anyone who wants to send you secret, encrypted messages. Managing keys, encrypting messages and decrypting messages should be a smooth experience. EncryptEasy is all about making it easy. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/filehound.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/filehound.mdx deleted file mode 100644 index 78cbfca86..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/filehound.mdx +++ /dev/null @@ -1,14 +0,0 @@ -# FileHound Export Utility - -

- -
-

- -[FileHound Export Utility](https://www.filehound.co.uk/) FileHound is a cloud document management platform made for secure file retention, business process automation and SmartCapture capabilities. - -The FileHound Export Utility allows FileHound Administrators the ability to run a secure document and data extraction tasks for alternative back-up and recovery purposes. This application will download all documents and/or meta data saved in FileHound based on the filters you choose. The metadata will be exported in both JSON and XML formats. - -Backend built with: Go 1.15 Wails 1.11.0 go-sqlite3 1.14.6 go-linq 3.2 - -Frontend with: Vue 2.6.11 Vuex 3.4.0 Typescript Tailwind 1.9.6 diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/minecraftupdater.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/minecraftupdater.mdx deleted file mode 100644 index 11247339d..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/minecraftupdater.mdx +++ /dev/null @@ -1,10 +0,0 @@ -# Minecraft Updater - -

- -
-

- -[Minecraft Updater](https://github.com/Gurkengewuerz/MinecraftModUpdater) is a utility tool to update and synchronize Minecraft mods for your userbase. It’s built using Wails2 and React with [antd](https://ant.design/) as frontend framework. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/modalfilemanager.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/modalfilemanager.mdx deleted file mode 100644 index a7ae8c492..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/modalfilemanager.mdx +++ /dev/null @@ -1,12 +0,0 @@ -# Modal File Manager - -

- -
-

- -[Modal File Manager](https://github.com/raguay/ModalFileManager) is a dual pane file manager using web technologies. My original design was based on NW.js and can be found [here](https://github.com/raguay/ModalFileManager-NWjs). This version uses the same Svelte based frontend code (but it has be greatly modified since the departure from NW.js), but the backend is a [Wails 2](https://wails.io/) implementation. By using this implementation, I no longer use command line `rm`, `cp`, etc. commands. It is fully coded using Go and runs much faster than the previous versions. - -This file manager is designed around the same principle as Vim: a state controlled keyboard actions. The number of states isn't fixed, but very programmable. Therefore, an infinite number of keyboard configurations can be created and used. This is the main difference from other file managers. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/mollywallet.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/mollywallet.mdx deleted file mode 100644 index 534b097ca..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/mollywallet.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Molley Wallet - -

- -
-

- -[Molly Wallet](https://github.com/grvlle/constellation_wallet/) the official $DAG wallet of the Constellation Network. It'll let users interact with the Hypergraph Network in various ways, not limited to producing $DAG transactions. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/october.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/october.mdx deleted file mode 100644 index 889d2dd9e..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/october.mdx +++ /dev/null @@ -1,12 +0,0 @@ -# October - -

- -
-

- -[October](https://october.utf9k.net) is a small Wails application that makes it really easy to extract highlights from [Kobo eReaders](https://en.wikipedia.org/wiki/Kobo_eReader) and then forward them to [Readwise](https://readwise.io). - -It has a relatively small scope with all platform versions weighing in under 10MB, and that's without enabling [UPX compression](https://upx.github.io/)! - -In contrast, the author's previous attempts with Electron quickly bloated to several hundred megabytes. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/optimus.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/optimus.mdx deleted file mode 100644 index c3eb79507..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/optimus.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Optimus - -

- -
-

- -[Optimus](https://github.com/splode/optimus) is a desktop image optimization application. It supports conversion and compression between WebP, JPEG, and PNG image formats. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/portfall.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/portfall.mdx deleted file mode 100644 index 4cc2c63c9..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/portfall.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Portfall - -

- -
-

- -[Portfall](https://github.com/rekon-oss/portfall) - A desktop k8s port-forwarding portal for easy access to all your cluster UIs diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/restic-browser.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/restic-browser.mdx deleted file mode 100644 index 1505ce07a..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/restic-browser.mdx +++ /dev/null @@ -1,10 +0,0 @@ -# Restic Browser - -

- -
-

- -[Restic-Browser](https://github.com/emuell/restic-browser) - A simple, cross-platform [restic](https://github.com/restic/restic) backup GUI for browsing and restoring restic repositories. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/riftshare.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/riftshare.mdx deleted file mode 100644 index 5223e88cf..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/riftshare.mdx +++ /dev/null @@ -1,19 +0,0 @@ -# RiftShare - -

- -
-

- -Easy, Secure, and Free file sharing for everyone. Learn more at [Riftshare.app](https://riftshare.app) - -## Features - -- Easy secure file sharing between computers both in the local network and through the internet -- Supports sending files or directories securely through the [magic wormhole protocol](https://magic-wormhole.readthedocs.io/en/latest/) -- Compatible with all other apps using magic wormhole (magic-wormhole or wormhole-william CLI, wormhole-gui, etc.) -- Automatic zipping of multiple selected files to send at once -- Full animations, progress bar, and cancellation support for sending and receiving -- Native OS File Selection -- Open files in one click once received -- Auto Update - don't worry about having the latest release! diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/scriptbar.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/scriptbar.mdx deleted file mode 100644 index aaa556f92..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/scriptbar.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# ScriptBar - -

- -
-

- -[ScriptBar](https://GitHub.com/raguay/ScriptBarApp) is a program to show the output of the embedded [Node-Red](https://nodered.org) server in the [EmailIt](https://GitHub.com/raguay/EmailIt) application. It also displays the output of scripts on your system. ScriptBar doesn't put them in the menubar, but has them all in a convient window for easy viewing. You can have multiple tabs to have many different things show. You can also keep the links to your most visited web sites. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/surge.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/surge.mdx deleted file mode 100644 index 2d895dc29..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/surge.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Surge - -

- -
-

- -[Surge](https://getsurge.io/) is a p2p filesharing app designed to utilize blockchain technologies to enable 100% anonymous file transfers. Surge is end-to-end encrypted, decentralized and open source. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/wally.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/wally.mdx deleted file mode 100644 index 2a2498f40..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/wally.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Wally - -

- -
-

- -[Wally](https://ergodox-ez.com/pages/wally) is the official firmware flasher for [Ergodox](https://ergodox-ez.com/) keyboards. It looks great and is a fantastic example of what you can achieve with Wails: the ability to combine the power of Go and the rich graphical tools of the web development world. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/wombat.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/wombat.mdx deleted file mode 100644 index 54cedacea..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/wombat.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Wombat - -

- -
-

- -[Wombat](https://github.com/rogchap/wombat) is a cross platform gRPC client. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/ytd.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/ytd.mdx deleted file mode 100644 index 178ff0529..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/ytd.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Ytd - -

- -
-

- -[Ytd](https://github.com/marcio199226/ytd/tree/v2-wails) is an app for downloading tracks from youtube, creating offline playlists and share them with your friends, your friends will be able to playback your playlists or download them for offline listening, has an built-in player. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/templates.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/templates.mdx deleted file mode 100644 index d9a29a6fa..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/templates.mdx +++ /dev/null @@ -1,52 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Templates - -This page serves as a list for community supported templates. Please submit a PR (click `Edit this page` at the bottom) to include your templates. To build your own template, please see the [Templates](../guides/templates.mdx) guide. - -To use these templates, run `wails init -n "Your Project Name" -t [the link below[@version]]` - -If there is no version suffix, the main branch code template is used by default. If there is a version suffix, the code template corresponding to the tag of this version is used. - -Example: `wails init -n "Your Project Name" -t https://github.com/misitebao/wails-template-vue` - -:::warning Attention - -**The Wails project does not maintain, is not responsible nor liable for 3rd party templates!** - -If you are unsure about a template, inspect `package.json` and `wails.json` for what scripts are run and what packages are installed. - -::: - -## Vue - -- [wails-template-vue](https://github.com/misitebao/wails-template-vue) - A template using Vite,Vue and Vue-Router(Support both JavaScript and TypeScript) -- [wails-vite-vue-ts](https://github.com/codydbentley/wails-vite-vue-ts) - Vue 3 TypeScript with Vite (and instructions to add features) -- [wails-vite-vue-the-works](https://github.com/codydbentley/wails-vite-vue-the-works) - Vue 3 TypeScript with Vite, Vuex, Vue Router, Sass, and ESLint + Prettier - -## Angular - -- [wails-angular-template](https://github.com/TAINCER/wails-angular-template) - Angular with TypeScript, Sass, Hot-Reload, Code-Splitting and i18n - -## React - -- [wails-react-template](https://github.com/AlienRecall/wails-react-template) - A template using reactjs -- [wails-react-template](https://github.com/flin7/wails-react-template) - A minimal template for React that supports live development -- [wails-template-nextjs](https://github.com/LGiki/wails-template-nextjs) - A template using Next.js and TypeScript - -## Svelte - -- [wails-svelte-template](https://github.com/raitonoberu/wails-svelte-template) - A template using Svelte -- [wails-vite-svelte-template](https://github.com/BillBuilt/wails-vite-svelte-template) - A template using Svelte and Vite -- [wails-vite-svelte-tailwind-template](https://github.com/BillBuilt/wails-vite-svelte-tailwind-template) - A template using Svelte and Vite with TailwindCSS v3 -- [wails-sveltekit-template](https://github.com/h8gi/wails-sveltekit-template) - A template using SvelteKit - -## Elm - -- [wails-elm-template](https://github.com/benjamin-thomas/wails-elm-template) - Develop your GUI app with functional programming and a **snappy** hot-reload setup :tada: :rocket: - -## Pure JavaScript (Vanilla) - -- [wails-pure-js-template](https://github.com/KiddoV/wails-pure-js-template) - A template with nothing but just basic JavaScript, HTML, and CSS \ No newline at end of file diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/_category_.json b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/_category_.json deleted file mode 100644 index fad21931a..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Contributing", - "position": 99 -} diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/developing-new-features.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/developing-new-features.mdx deleted file mode 100644 index 57c5b101b..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/developing-new-features.mdx +++ /dev/null @@ -1,29 +0,0 @@ ---- -sidebar_position: 20 ---- - -# Developing New Features - -We are always keen to add features to Wails and expand on what the project can do. The process for adding new features are as follows: - -- Pick an enhancement ticket with the "TODO" label. It's preferable to select one from the current [Backlog](https://github.com/orgs/wailsapp/projects/1/views/1) but the choice is yours. -- Before developing, check that the ticket includes the following information: -- The purpose of the enhancement -- What is out of scope for the enhancement -- What platforms the enhancement targets (most features should be cross-platform unless there's a very specific reason) -- If the ticket does not include this information, feel free to request the information from the person who opened the ticket. Sometimes placeholder tickets are created and require more details -- Comment on the ticket stating you wish to develop the feature -- Clone the repository and create a branch with the format `feature/_` -- New features often require documentation so please ensure you have also added or updated the documentation as part of the changes -- Once the feature is ready for testing, create a draft PR. Please ensure the PR description has the test scenarios and test cases listed with checkmarks, so that others can know what still needs to be tested. -- Once all the testing is completed, please update the status of the PR from draft and leave a message. - -:::note -There is nothing stopping you from opening a ticket and working on it yourself, but please be aware that all -enhancement requests are reviewed for good fit. Not all ideas will be selected so it's best to have discussion -on the ticket first. -::: - -:::warning -Any PRs opened without a corresponding ticket may be rejected. -::: diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/documenting.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/documenting.mdx deleted file mode 100644 index 06f33914b..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/documenting.mdx +++ /dev/null @@ -1,34 +0,0 @@ ---- -sidebar_position: 40 ---- - -# Documenting - -This website is also the main documentation site for the project. Sometimes this gets out of date and needs some slight adjustments. Some of the documentation isn't written to the best standards either. Developing documentation is hard and so any contribution to this is greatly appreciated. Features without documentation are unfinished so to the project, it's _as important_ as the code. - -We generally do not create tickets for updating documentation so if there is text you think should be updated or rephrased then feel free to submit a PR for that. This site is in the main repository under the `website` directory. We use [Docusaurus](https://docusaurus.io/) to create the site so there is plenty of existing documentation and tutorials around to get started. - -To set up a local documentation development environment, do the following: - -- [Install npm](https://docs.npmjs.com/cli/v8/configuring-npm/install) -- `cd website` -- `npm install` -- `npm run start` - -After it has all installed and is running, you should see the site at [`http://localhost:3000`](http://localhost:3000). Any changes made to the site text will be immediately reflected in the browser. - -## Versioning - -We employ a versioning system where we have the "latest" documentation AKA "Next Version" which has all the changes that have occurred since the last release. We also keep the last release documentation as well as the version before that. - -There isn't usually a reason to update released documentation so we don't generally update the documents in the `versioned_docs` or `versioned_sidebars` directories. - -The "next version" docs are mainly in `website/docs` with some "version independent" documents in `src/pages`. Any updates should be made in the `website/docs` directory. - -## Languages - -The default documents of the Wails project are English documents. We use the "crowdin" tool to translate documents in other languages and synchronize them to the website. You can [join our project](https://crowdin.com/project/wails) and submit your translations to make contributions. - -### Add new language - -If you want to add a new language to the documentation, please follow the prompts to [fill in and submit an Issue](https://github.com/wailsapp/wails/issues/new?assignees=&labels=documentation&template=documentation.yml). After being confirmed by the maintainer, we will add the language to the "crowdin" and you will then be able to submit your translation. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/fixing-bugs.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/fixing-bugs.mdx deleted file mode 100644 index 51bd90b74..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/fixing-bugs.mdx +++ /dev/null @@ -1,27 +0,0 @@ ---- -sidebar_position: 30 ---- - -# Fixing Bugs - -The process for fixing bugs are as follows: - -- Check the current [Backlog](https://github.com/orgs/wailsapp/projects/1/views/1) and select a bug to fix -- Before developing, check that the ticket includes the following information: -- The scope of the issue including platforms affected -- The steps to reproduce. Sometimes bugs are opened that are not Wails issues and the onus is on the reporter to prove that it is a Wails issue with a minimal reproducible example -- The output of `wails doctor` -- If the ticket does not include this information, feel free to request the information from the person who opened the ticket. -- Comment on the ticket stating you wish to develop a fix -- Clone the repository and create a branch with the format `bugfix/_` -- Once the fix is ready for testing, create a draft PR. Please ensure the PR description has the test scenarios and test cases listed with checkmarks, so that others can know what still needs to be tested. -- Once all the testing is completed, please update the status of the PR from draft and leave a message. - -:::note -There is nothing stopping you from opening a ticket and working on it yourself, but please be aware that all -bugfixes should be discussed as the approach may have unintended side effects. -::: - -:::warning -Any PRs opened without a corresponding ticket may be rejected. -::: diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/helping-others.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/helping-others.mdx deleted file mode 100644 index 933c06b35..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/helping-others.mdx +++ /dev/null @@ -1,13 +0,0 @@ ---- -sidebar_position: 50 ---- - -# Helping Others - -A great way to contribute to the project is to help others who are experiencing difficulty. This is normally reported as a ticket or a message on the Wails slack channel. Even just clarifying the issue can really help out. Sometimes, when an issue is discussed and gets resolved, we create a guide out of it to help others who face the same issues. - -To join the Wails slack channel, accept the invite [here](https://gophers.slack.com/join/shared_invite/zt-197vymgt3-sJt4oyakb6nqlVKjXTyeVw#/shared-invite/email) and join us on the channel by following [this link](https://gophers.slack.com/?redir=%2Fmessages%2FCJ4P9F7MZ%2F). - -:::note -Work In Progress -::: diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/setting-up-a-dev-environment.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/setting-up-a-dev-environment.mdx deleted file mode 100644 index b933af9a6..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/setting-up-a-dev-environment.mdx +++ /dev/null @@ -1,30 +0,0 @@ ---- -sidebar_position: 10 ---- - -# Setting up a Development Environment - -You can set up a development environment by doing the following: - -- Install the latest versions of Go and Git -- `git clone https://github.com/wailsapp/wails` -- `cd wails/v2/cmd/wails` -- `go install` - -NOTE: The directory that you cloned the project into will now be called "clonedir". - -The Wails CLI will now be at the very latest version. - -To update projects to use the latest version, update the project's `go.mod` and ensure the following line is at the bottom of the file: - -`replace github.com/wailsapp/wails/v2 => ` - -Example: - -On Windows: `replace github.com/wailsapp/wails/v2 => C:\Users\leaan\Documents\wails-v2-beta\wails\v2` - -On 'nix: `replace github.com/wailsapp/wails/v2 => /home/me/projects/wails/v2` - -To revert back to a stable version, run: - -`go install github.com/wailsapp/wails/v2/cmd/wails@latest` diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/testing.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/testing.mdx deleted file mode 100644 index e751dfc3e..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/testing.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -sidebar_position: 35 ---- - -# Testing - -Testing is vitally important to ensure quality in the project. There are a couple of scenarios where testing can really help the project: - -- Testing if a bug is reproducible on your local system -- Testing PRs to ensure that they work correctly - -If you chose to test if someone's bug report is reproducible on your local system, then feel free to add a comment on the ticket confirming this with the output of `wails doctor`. - -To test PRs, choose a PR to test and check if the PR description has the testing scenarios listed. If not, please ask the person who opened the PR to provide that list. Once you have determined a valid test scenario, please report your findings on the PR. - -If you ever need more clarity or help on testing, please ask a question in the [Contributing to Wails](https://github.com/wailsapp/wails/discussions/1520) discussion or on slack. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/ways-of-contributing.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/ways-of-contributing.mdx deleted file mode 100644 index 6b76d99d9..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/ways-of-contributing.mdx +++ /dev/null @@ -1,18 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Ways of contributing - -Wails is an open source, community driven project. We welcome anyone to join us in contributing to the project. This documentation is aimed at anyone wishing to get familiar with the project and the development processes. - -There are many ways to contribute to the project: - -- Developing new features -- Fixing bugs -- Testing -- Documenting features -- Writing tutorials / guides -- Helping others on the issues + discussions boards - -Guides for these have been created in their own sections. Before getting started, please introduce yourself in the [Contributing to Wails](https://github.com/wailsapp/wails/discussions/1520) discussion. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/_category_.json b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/_category_.json deleted file mode 100644 index 597b920df..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Getting Started", - "position": 10 -} diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/building.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/building.mdx deleted file mode 100644 index a74c762d2..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/building.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -sidebar_position: 6 ---- - -# 프로젝트 컴파일 - -프로젝트 디렉토리에서 `wails build`를 실행하세요. 이 작업은 프로젝트를 컴파일한 후 실행파일을 `build/bin` 디렉토리에 저장합니다. - -실행파일을 실행하면 아래와 같은 기본 애플리케이션을 볼 수 있습니다. - -
- -
- -
- -컴파일 옵션에 대한 자세한 내용은 [CLI Reference](../reference/cli.mdx#build)를 참조하세요. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/development.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/development.mdx deleted file mode 100644 index fc9387174..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/development.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -sidebar_position: 5 ---- - -# 애플리케이션 개발 - -프로젝트 디렉토리에서 `wails dev`를 실행하여 개발 모드에서 애플리케이션을 실행할 수 있습니다. 이렇게 하면 다음과 같은 작업이 수행됩니다. - -- 애플리케이션 빌드 및 실행 -- Go 코드를 Javascript에서 호출할 수 있도록 프론트엔드에 바인딩 -- Using the power of [vite](https://vitejs.dev/), will watch for modifications in your Go files and rebuild/re-run on change -- Sets up a [webserver](http://localhost:34115) that will serve your application over a browser. This allows you to use your favourite browser extensions. You can even call your Go code from the console - -시작하려면 프로젝트 디렉토리에서 `wails dev`를 실행하세요. 더 자세한 정보는 [여기](../reference/cli.mdx#dev)에서 찾을 수 있습니다. - -Coming soon: Tutorial diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/firstproject.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/firstproject.mdx deleted file mode 100644 index 9348ea0a2..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/firstproject.mdx +++ /dev/null @@ -1,132 +0,0 @@ ---- -sidebar_position: 2 ---- - -# Creating a Project - -## Project Generation - -Now that the CLI is installed, you can generate a new project by using the `wails init` command. - -Pick your favourite framework: - - - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - - - - Generate a Svelte project using Javascript with:

- - wails init -n myproject -t svelte - -If you would rather use Typescript:
- - wails init -n myproject -t svelte-ts - -
- - Generate a React project using Javascript with:

- - wails init -n myproject -t react - -If you would rather use Typescript:
- - wails init -n myproject -t react-ts - -
- - Generate a Vue project using Javascript with:

- - wails init -n myproject -t vue - -If you would rather use Typescript:
- - wails init -n myproject -t vue-ts - -
- - Generate a Preact project using Javascript with:

- - wails init -n myproject -t preact - -If you would rather use Typescript:
- - wails init -n myproject -t preact-ts - -
- - Generate a Lit project using Javascript with:

- - wails init -n myproject -t lit - -If you would rather use Typescript:
- - wails init -n myproject -t lit-ts - -
- - Generate a Vanilla project using Javascript with:

- - wails init -n myproject -t vanilla - -If you would rather use Typescript:
- - wails init -n myproject -t vanilla-ts - -
-
- - - -
- -There are also [community templates](../community/templates.mdx) available that offer different capabilities and frameworks. - -To see the other options available, you can run `wails init -help`. More details can be found in the [CLI Reference](../reference/cli.mdx#init). - -## Project Layout - -Wails projects have the following layout: - -``` -. -├── build/ -│ ├── appicon.png -│ ├── darwin/ -│ └── windows/ -├── frontend/ -├── go.mod -├── go.sum -├── main.go -└── wails.json -``` - -### Project structure rundown - -- `/main.go` - The main application -- `/frontend/` - Frontend project files -- `/build/` - Project build directory -- `/build/appicon.png` - The application icon -- `/build/darwin/` - Mac specific project files -- `/build/windows/` - Windows specific project files -- `/wails.json` - The project configuration -- `/go.mod` - Go module file -- `/go.sum` - Go module checksum file - -The `frontend` directory has nothing specific to Wails and can be any frontend project of your choosing. - -The `build` directory is used during the build process. These files may be updated to customise your builds. If files are removed from the build directory, default versions will be regenerated. - -The default module name in `go.mod` is "changeme". You should change this to something more appropriate. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/installation.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/installation.mdx deleted file mode 100644 index 1d702d6cc..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/installation.mdx +++ /dev/null @@ -1,95 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 설치하기 - -## 지원되는 플랫폼 - -- Windows 10/11 AMD64/ARM64 -- MacOS 10.13+ AMD64 -- MacOS 11.0+ ARM64 -- Linux AMD64/ARM64 - -## 의존성 - -Wails는 설치 전에 아래와 같은 몇 가지 공통적인 의존성이 필요합니다. - -- Go 1.17+ -- NPM (Node 15+) - -### Go - -[Go 다운로드 페이지](https://go.dev/doc/install)에서 Go를 다운로드 합니다. - -공식 [Go 설치 지침](https://go.dev/doc/install)에 따라 진행하세요. 또한 `PATH` 환경변수에 `~/go/bin` 디렉토리 경로가 포함되어 있는지 확인해야 합니다. 터미널을 다시 시작하고 아래 내용을 확인하세요. - -- Go 설치 확인: `go version` -- PATH 변수에 "~/go/bin" 확인: `echo $PATH | grep go/bin` - -### NPM - -[Node 다운로드 페이지](https://nodejs.org/en/download/)에서 NPM을 다운로드 합니다. 우리는 일반적으로 최신 버전에서 테스트를 진행하기 때문에 최신 버전 사용을 권장합니다. - -정상적으로 설치된 것을 확인하기 위해 `npm --version`을 실행합니다. - -## 플랫폼에 따른 의존성 - -아래와 같이 플랫폼별 의존성이 있습니다. - - - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - - - - Wails를 사용하려면 xcode 명령어 라인 도구가 설치되어 있어야 합니다. This can be - done by running:
- xcode-select --install -
- - Wails requires that the{" "} - - WebView2 - {" "} - runtime is installed. Some Windows installations will already have this - installed. You can check using the wails doctor command (see - below). - - - Linux required the standard gcc build tools plus{" "} - libgtk3 and libwebkit. Rather than list a ton of - commands for different distros, Wails can try to determine what the - installation commands are for your specific distribution. Run{" "} - wails doctor after installation to be shown how to install the - dependencies. If your distro/package manager is not supported, please - consult the{" "} - Add Linux Distro guide. - -
- - - -## 선택 설치 - -- [UPX](https://upx.github.io/)는 어플리케이션 압축에 필요합니다. - -## Wails 설치 - -`go install github.com/wailsapp/wails/v2/cmd/wails@latest`을 실행하여 Wails CLI를 설치합니다. - -## 시스템 점검 - -`wails doctor`를 실행하면 의존성이 올바르게 설치되어 있는지 점검할 수 있습니다. 문제가 있는 의존성에 대해서는 문제 해결을 위한 도움을 줄 수 있습니다. - -## `wails` 명령어를 찾을 수 없나요? - -시스템에서 `wails` 명령어를 찾을 수 없는 경우 Go 설치 지침을 잘 따라했는지 확인해보세요. 대부분 사용자 홈 디렉토리에 있는 `go/bin` 디렉토리가 `PATH` 환경변수에 존재하지 않는 경우입니다. 또한 변경사항이 명령 프롬프트에 반영되도록 일반적으로 열려 있는 모든 명령 프롬프트를 닫았다가 다시 열어야 합니다. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/_category_.json b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/_category_.json deleted file mode 100644 index 5935dad93..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Guides", - "position": 50 -} diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/application-development.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/application-development.mdx deleted file mode 100644 index a618076f1..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/application-development.mdx +++ /dev/null @@ -1,194 +0,0 @@ -# Application Development - -There are no hard and fast rules for developing applications with Wails, but there are some basic guidelines. - -## Application Setup - -The pattern used by the default templates are that `main.go` is used for configuring and running the application, whilst `app.go` is used for defining the application logic. - -The `app.go` file will define a struct that has 2 methods which act as hooks into the main application: - -```go title="app.go" -type App struct { - ctx context.Context -} - -func NewApp() *App { - return &App{} -} - -func (a *App) startup(ctx context.Context) { - a.ctx = ctx -} - -func (a *App) shutdown(ctx context.Context) { -} -``` - -- The startup method is called as soon as Wails allocates the resources it needs and is a good place for creating resources, setting up event listeners and anything else the application needs at startup. It is given a `context.Context` which is usually saved in a struct field. This context is needed for calling the [runtime](../reference/runtime/intro.mdx). If this method returns an error, the application will terminate. In dev mode, the error will be output to the console. - -- The shutdown method will be called by Wails right at the end of the shutdown process. This is a good place to deallocate memory and perform any shutdown tasks. - -The `main.go` file generally consists of a single call to `wails.Run()`, which accepts the application configuration. The pattern used by the templates is that before the call to `wails.Run()`, an instance of the struct we defined in `app.go` is created and saved in a variable called `app`. This configuration is where we add our callbacks: - -```go {3,9,10} title="main.go" -func main() { - - app := NewApp() - - err := wails.Run(&options.App{ - Title: "My App", - Width: 800, - Height: 600, - OnStartup: app.startup, - OnShutdown: app.shutdown, - }) - if err != nil { - log.Fatal(err) - } -} - -``` - -More information on application lifecycle hooks can be found [here](../howdoesitwork.mdx#application-lifecycle-callbacks). - -## Binding Methods - -It is likely that you will want to call Go methods from the frontend. This is normally done by adding public methods to the already defined struct in `app.go`: - -```go {16-18} title="app.go" -type App struct { - ctx context.Context -} - -func NewApp() *App { - return &App{} -} - -func (a *App) startup(ctx context.Context) { - a.ctx = ctx -} - -func (a *App) shutdown(ctx context.Context) { -} - -func (a *App) Greet(name string) string { - return fmt.Sprintf("Hello %s!", name) -} -``` - -In the main application configuration, the `Bind` key is where we can tell Wails what we want to bind: - -```go {11-13} title="main.go" -func main() { - - app := NewApp() - - err := wails.Run(&options.App{ - Title: "My App", - Width: 800, - Height: 600, - OnStartup: app.startup, - OnShutdown: app.shutdown, - Bind: []interface{}{ - app, - }, - }) - if err != nil { - log.Fatal(err) - } -} - -``` - -This will bind all public methods in our `App` struct (it will never bind the startup and shutdown methods). - -### Dealing with context when binding multiple structs - -If you want to bind methods for multiple structs but want each struct to keep a reference to the context so that you can use the runtime functions, a good pattern is to pass the context from the `OnStartup` method to your struct instances : - -```go -func main() { - - app := NewApp() - otherStruct := NewOtherStruct() - - err := wails.Run(&options.App{ - Title: "My App", - Width: 800, - Height: 600, - OnStartup: func(ctx context.Context){ - app.SetContext(ctx) - otherStruct.SetContext(ctx) - }, - OnShutdown: app.shutdown, - Bind: []interface{}{ - app, - otherStruct - }, - }) - if err != nil { - log.Fatal(err) - } -} -``` - -More information on Binding can be found [here](../howdoesitwork.mdx#method-binding). - -## Application Menu - -Wails supports adding a menu to your application. This is done by passing a [Menu](../reference/menus.mdx#menu) struct to application config. It's common to use a method that returns a Menu, and even more common for that to be a method on the `App` struct used for the lifecycle hooks. - -```go {11} title="main.go" -func main() { - - app := NewApp() - - err := wails.Run(&options.App{ - Title: "My App", - Width: 800, - Height: 600, - OnStartup: app.startup, - OnShutdown: app.shutdown, - Menu: app.menu(), - Bind: []interface{}{ - app, - }, - }) - if err != nil { - log.Fatal(err) - } -} - -``` - -## Assets - -The great thing about the way Wails v2 handles assets is that it doesn't! The only thing you need to give Wails is an `embed.FS`. How you get to that is entirely up to you. You can use vanilla html/css/js files like the vanilla template. You could have some complicated build system, it doesn't matter. - -When `wails build` is run, it will check the `wails.json` project file at the project root. There are 2 keys in the project file that are read: - -- "frontend:install" -- "frontend:build" - -The first, if given, will be executed in the `frontend` directory to install the node modules. The second, if given, will be executed in the `frontend` directory to build the frontend project. - -If these 2 keys aren't given, then Wails does absolutely nothing with the frontend. It is only expecting that `embed.FS`. - -### AssetsHandler - -A Wails v2 app can optionally define a `http.Handler` in the `options.App`, which allows hooking into the AssetServer to create files on the fly or process POST/PUT requests. GET requests are always first handled by the `assets` FS. If the FS doesn't find the requested file the request will be forwarded to the `http.Handler` for serving. Any requests other than GET will be directly processed by the `AssetsHandler` if specified. It's also possible to only use the `AssetsHandler` by specifiy `nil` as the `Assets` option. - -## Built in Dev Server - -Running `wails dev` will start the built in dev server which will start a file watcher in your project directory. By default, if any file changes, wails checks if it was an application file (default: `.go`, configurable with `-e` flag). If it was, then it will rebuild your application and relaunch it. If the changed file was in the assets, it will issue a reload after a short amount of time. - -The dev server uses a technique called "debouncing" which means it doesn't reload straight away, as there may be multiple files changed in a short amount of time. When a trigger occurs, it waits for a set amount of time before issuing a reload. If another trigger happens, it resets to the wait time again. By default this value is `100ms`. If this value doesn't work for your project, it can be configured using the `-debounce` flag. If used, this value will be saved to your project config and become the default. - -## External Dev Server - -Some frameworks come with their own live-reloading server, however they will not be able to take advantage of the Wails Go bindings. In this scenario, it is best to run a watcher script that rebuilds the project into the build directory, which Wails will be watching. For an example, see the default svelte template that uses [rollup](https://rollupjs.org/guide/en/). For [create-react-app](https://create-react-app.dev/), it's possible to use [this script](https://gist.github.com/int128/e0cdec598c5b3db728ff35758abdbafd) to achieve a similar result. - -## Go Module - -The default Wails templates generate a `go.mod` file that contains the module name "changeme". You should change this to something more appropriate after project generation. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/bleeding-edge.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/bleeding-edge.mdx deleted file mode 100644 index b81cc79dc..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/bleeding-edge.mdx +++ /dev/null @@ -1,55 +0,0 @@ -# Bleeding Edge - -## Overview - -Wails is in constant development and new releases are regularly "tagged". This usually happens when all the newer code on `master` has been tested and confirmed working. If you need a bugfix or feature that has not yet made it to a release, it's possible to use the latest "bleeding edge" version using the following steps: - -- `git clone https://github.com/wailsapp/wails` -- `cd wails/v2/cmd/wails` -- `go install` - -NOTE: The directory that you cloned the project into will now be called "clonedir". - -The Wails CLI will now be at the very latest version. - -### Updating your project - -To update projects to use the latest version of the Wails library, update the project's `go.mod` and ensure the following line is at the bottom of the file: - -`replace github.com/wailsapp/wails/v2 => ` - -Example: - -On Windows: `replace github.com/wailsapp/wails/v2 => C:\Users\leaan\Documents\wails-v2-beta\wails\v2` - -On 'nix: `replace github.com/wailsapp/wails/v2 => /home/me/projects/wails/v2` - -To revert to a stable version, run: - -`go install github.com/wailsapp/wails/v2/cmd/wails@latest` - -## Testing a Branch - -If you want to test a branch, follow the instructions above, but ensure you switch the branch you want to test before installing: - -- `git clone https://github.com/wailsapp/wails` -- `cd wails` -- `git checkout -b branch-to-test --track origin/branch-to-test` -- `cd v2/cmd/wails` -- `go install` - -Make sure you [update your project](#updating-your-project) as described above. - -## Testing a PR - -If you want to test a PR, follow the instructions above, but ensure you fetch the PR and switch the branch before installing. Please replace `[IDofThePR]` with the ID of the PR shown on github.com: - -- `git clone https://github.com/wailsapp/wails` -- `cd wails` -- `git fetch -u origin pull/[IDofThePR]/head:test/pr-[IDofThePR]` -- `git checkout test/pr-[IDofThePR]` -- `git reset --hard HEAD` -- `cd v2/cmd/wails` -- `go install` - -Make sure you [update your project](#updating-your-project) as described above. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/dynamic-assets.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/dynamic-assets.mdx deleted file mode 100644 index 4b68aef22..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/dynamic-assets.mdx +++ /dev/null @@ -1,126 +0,0 @@ -# Dynamic Assets - -If you want to load or generate assets for your frontend dynamically, you can achieve that using the [AssetsHandler](../reference/options#assetshandler) option. The AssetsHandler is a generic `http.Handler` which will be called for any non GET request on the assets server and for GET requests which can not be served from the bundled assets because the file is not found. - -By installing a custom AssetsHandler, you can serve your own assets using a custom asset server. - -## Example - -In our example project, we will create a simple assets handler which will load files off disk: - -```go title=main.go {16-35,49} -package main - -import ( - "embed" - "fmt" - "github.com/wailsapp/wails/v2" - "github.com/wailsapp/wails/v2/pkg/options" - "net/http" - "os" - "strings" -) - -//go:embed frontend/dist -var assets embed.FS - -type FileLoader struct { - http.Handler -} - -func NewFileLoader() *FileLoader { - return &FileLoader{} -} - -func (h *FileLoader) ServeHTTP(res http.ResponseWriter, req *http.Request) { - var err error - requestedFilename := strings.TrimPrefix(req.URL.Path, "/") - println("Requesting file:", requestedFilename) - fileData, err := os.ReadFile(requestedFilename) - if err != nil { - res.WriteHeader(http.StatusBadRequest) - res.Write([]byte(fmt.Sprintf("Could not load file %s", requestedFilename))) - } - - res.Write(fileData) -} - -func main() { - // Create an instance of the app structure - app := NewApp() - - // Create application with options - err := wails.Run(&options.App{ - Title: "helloworld", - Width: 1024, - Height: 768, - Assets: assets, - BackgroundColour: &options.RGBA{R: 27, G: 38, B: 54, A: 255}, - OnStartup: app.startup, - AssetsHandler: NewFileLoader(), - Bind: []interface{}{ - app, - }, - }) - - if err != nil { - println("Error:", err) - } -} -``` - -When we run the application in dev mode using `wails dev`, we will see the following output: - -``` -DEB | [ExternalAssetHandler] Loading 'http://localhost:3001/favicon.ico' -DEB | [ExternalAssetHandler] Loading 'http://localhost:3001/favicon.ico' failed, using AssetHandler -Requesting file: favicon.ico -``` - -As you can see, the assets handler is called when the default assets server is unable to serve the `favicon.ico` file. - -If you right click the main application and select "inspect" to bring up the devtools, you can test this feature out by typing the following into the console: - -``` -let response = await fetch('does-not-exist.txt'); -``` - -This will generate an error in the devtools. We can see that the error is what we expect, returned by our custom assets handler: - -

- -

- -However, if we request `go.mod`, we will see the following output: - -

- -

- -This technique can be used to load images directly into the page. If we updated our default vanilla template and replaced the logo image: - -```html - -``` - -with: - -```html - -``` - -Then we would see the following: - -

- -

- -:::warning -Exposing your filesystem in this way is a security risk. It is recommended that you properly manage access -to your filesystem. -::: diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/frameless.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/frameless.mdx deleted file mode 100644 index 4ae507f03..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/frameless.mdx +++ /dev/null @@ -1,84 +0,0 @@ -# Frameless Applications - -Wails supports application that have no frames. This can be achieved by using the [frameless](../reference/options.mdx#frameless) field in [Application Options](../reference/options.mdx#application-options). - -Wails offers a simple solution for dragging the window: Any HTML element that has the CSS style `--wails-draggable:drag` will act as a "drag handle". This property applies to all child elements. If you need to indicate that a nested element should not drag, then use the attribute '--wails-draggable:no-drag' on that element. - - -```html - - - - - - - -
- - -
-
- - - - -``` - -For some projects, using a CSS variable may not be possible due to dynamic styling. In this case, you can use the `CSSDragProperty` and `CSSDragValue` application options to define a property and value that will be used to indicate draggable regions: - -```go title=main.go -package main - -import ( - "embed" - - "github.com/wailsapp/wails/v2" - "github.com/wailsapp/wails/v2/pkg/options" -) - -//go:embed frontend/dist -var assets embed.FS - -func main() { - // Create an instance of the app structure - app := NewApp() - - // Create application with options - err := wails.Run(&options.App{ - Title: "alwaysontop", - Width: 1024, - Height: 768, - Assets: assets, - Frameless: true, - CSSDragProperty: "widows", - CSSDragValue: "1", - Bind: []interface{}{ - app, - }, - }) - - if err != nil { - println("Error:", err) - } -} -``` - -```html title=index.html - - - - - - alwaysontop - - -
- - - - -``` - -:::info Fullscreen -If you allow your application to go fullscreen, this drag functionality will be disabled. -::: diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/frontend.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/frontend.mdx deleted file mode 100644 index ac087ee45..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/frontend.mdx +++ /dev/null @@ -1,72 +0,0 @@ -# Frontend - -## Script Injection - -When Wails serves your `index.html`, by default, it will inject 2 script entries into the `` tag to load `/wails/ipc.js` and `/wails/runtime.js`. These files install the bindings and runtime respectively. - -The code below shows where these are injected by default: - -```html - - - injection example - - - - - - - -
Please enter your name below 👇
-
- - -
- - - - -``` - -### Overriding Default Script Injection - -To provide more flexibility to developers, there is a meta tag that may be used to customise this behaviour: - -```html - -``` - -The options are as follows: - -| Value | Description | -| ------------------- | ------------------------------------------------ | -| noautoinjectruntime | Disable the autoinjection of `/wails/runtime.js` | -| noautoinjectipc | Disable the autoinjection of `/wails/ipc.js` | -| noautoinject | Disable all autoinjection of scripts | - -Multiple options may be used provided they are comma seperated. - -This code is perfectly valid and operates the same as the autoinjection version: - -```html - - - injection example - - - - - - -
Please enter your name below 👇
-
- - -
- - - - - - -``` diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/ides.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/ides.mdx deleted file mode 100644 index 5423ea495..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/ides.mdx +++ /dev/null @@ -1,125 +0,0 @@ -# IDEs - -Wails aims to provide a great development experience. To that aim, we now support generating IDE specific configuration to provide smoother project setup. - -Currently, we support [Visual Studio Code](https://code.visualstudio.com/) but aim to support other IDEs such as Goland. - -## Visual Studio Code - -

- -

- -When generating a project using the `-ide vscode` flags, IDE files will be created alongside the other project files. These files are placed into the `.vscode` directory and provide the correct configuration for debugging your application. - -The 2 files generated are `tasks.json` and `launch.json`. Below are the files generated for the default vanilla project: - -```json title="tasks.json" -{ - "version": "2.0.0", - "tasks": [ - { - "label": "build", - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "command": "go", - "args": [ - "build", - "-tags", - "dev", - "-gcflags", - "all=-N -l", - "-o", - "build/bin/myproject.exe" - ] - } - ] -} -``` - -```json title="launch.json" -{ - "version": "0.2.0", - "configurations": [ - { - "name": "Wails: Debug myproject", - "type": "go", - "request": "launch", - "mode": "exec", - "program": "${workspaceFolder}/build/bin/myproject.exe", - "preLaunchTask": "build", - "cwd": "${workspaceFolder}", - "env": {} - } - ] -} -``` - -### Configuring the install and build steps - -The `tasks.json` file is simple for the default project as there is no `npm install` or `npm run build` step needed. For projects that have a frontend build step, such as the svelte template, we would need to edit `tasks.json` to add the install and build steps: - -```json title="tasks.json" -{ - "version": "2.0.0", - "tasks": [ - { - "label": "npm install", - "type": "npm", - "script": "install", - "options": { - "cwd": "${workspaceFolder}/frontend" - }, - "presentation": { - "clear": true, - "panel": "shared", - "showReuseMessage": false - }, - "problemMatcher": [] - }, - { - "label": "npm run build", - "type": "npm", - "script": "build", - "options": { - "cwd": "${workspaceFolder}/frontend" - }, - "presentation": { - "clear": true, - "panel": "shared", - "showReuseMessage": false - }, - "problemMatcher": [] - }, - { - "label": "build", - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "command": "go", - "args": [ - "build", - "-tags", - "dev", - "-gcflags", - "all=-N -l", - "-o", - "build/bin/vscode.exe" - ], - "dependsOn": ["npm install", "npm run build"] - } - ] -} -``` - -:::info Future Enhancement - -In the future, we hope to generate a `tasks.json` that includes the install and build steps automatically. - -::: diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/linux-distro-support.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/linux-distro-support.mdx deleted file mode 100644 index 28a224a26..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/linux-distro-support.mdx +++ /dev/null @@ -1,101 +0,0 @@ -# Linux Distro Support - -## Overview - -Wails offers Linux support but providing installation instructions for all available distributions is an impossible task. Instead, Wails tries to determine if the packages you need to develop applications are available via your system's package manager. Currently, we support the following package managers: - -- apt -- dnf -- emerge -- eopkg -- nixpkgs -- pacman -- zypper - -## Adding package names - -There may be circumstances where your distro uses one of the supported package managers but the package name is different. For example, you may use an Ubuntu derivative, but the package name for gtk may be different. Wails attempts to find the correct package by iterating through a list of package names. The list of packages are stored in the packagemanager specific file in the `v2/internal/system/packagemanager` directory. In our example, this would be `v2/internal/system/packagemanager/apt.go`. - -In this file, the list of packages are defined by the `Packages()` method: - -```go -func (a *Apt) Packages() packagemap { - return packagemap{ - "libgtk-3": []*Package{ - {Name: "libgtk-3-dev", SystemPackage: true, Library: true}, - }, - "libwebkit": []*Package{ - {Name: "libwebkit2gtk-4.0-dev", SystemPackage: true, Library: true}, - }, - "gcc": []*Package{ - {Name: "build-essential", SystemPackage: true}, - }, - "pkg-config": []*Package{ - {Name: "pkg-config", SystemPackage: true}, - }, - "npm": []*Package{ - {Name: "npm", SystemPackage: true}, - }, - "docker": []*Package{ - {Name: "docker.io", SystemPackage: true, Optional: true}, - }, - } -} -``` - -Let's assume that in our linux distro, `libgtk-3` is packaged under the name `lib-gtk3-dev`. We could add support for this by adding the following line: - -```go {5} -func (a *Apt) Packages() packagemap { - return packagemap{ - "libgtk-3": []*Package{ - {Name: "libgtk-3-dev", SystemPackage: true, Library: true}, - {Name: "lib-gtk3-dev", SystemPackage: true, Library: true}, - }, - "libwebkit": []*Package{ - {Name: "libwebkit2gtk-4.0-dev", SystemPackage: true, Library: true}, - }, - "gcc": []*Package{ - {Name: "build-essential", SystemPackage: true}, - }, - "pkg-config": []*Package{ - {Name: "pkg-config", SystemPackage: true}, - }, - "npm": []*Package{ - {Name: "npm", SystemPackage: true}, - }, - "docker": []*Package{ - {Name: "docker.io", SystemPackage: true, Optional: true}, - }, - } -} -``` - -## Adding new package managers - -To add a new package manager, perform the following steps: - -- Create a new file in `v2/internal/system/packagemanager` called `.go`, where `` is the name of the package manager. -- Define a struct that conforms to the package manager interface defined in `pm.go`: - -```go -type PackageManager interface { - Name() string - Packages() packagemap - PackageInstalled(*Package) (bool, error) - PackageAvailable(*Package) (bool, error) - InstallCommand(*Package) string -} -``` - -- `Name()` should return the name of the package manager -- `Packages()` should return a `packagemap`, that provides candidate filenames for dependencies -- `PackageInstalled()` should return `true` if the given package is installed -- `PackageAvailable()` should return `true` if the given package is not installed but available for installation -- `InstallCommand()` should return the exact command to install the given package name - -Take a look at the other package managers code to get an idea how this works. - -:::info Remember -If you add support for a new package manager, don't forget to also update this page! -::: diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/linux.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/linux.mdx deleted file mode 100644 index 229c282bf..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/linux.mdx +++ /dev/null @@ -1,18 +0,0 @@ -# Linux - -This page has miscellaneous guides related to developing Wails applications for Linux. - -## Video tag doesn't fire "ended" event - -When using a video tag, the "ended" event is not fired when the video is finished playing. This is a bug in WebkitGTK, however you can use the following workaround to fix it: - -```js -videoTag.addEventListener("timeupdate", (event) => { - if (event.target.duration - event.target.currentTime < 0.2) { - let ended = new Event("ended"); - event.target.dispatchEvent(ended); - } -}); -``` - -Source: [Lyimmi](https://github.com/Lyimmi) on the [discussions board](https://github.com/wailsapp/wails/issues/1729#issuecomment-1212291275) diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/manual-builds.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/manual-builds.mdx deleted file mode 100644 index dcf192d33..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/manual-builds.mdx +++ /dev/null @@ -1,95 +0,0 @@ -# Manual Builds - -The Wails CLI does a lot of heavy lifting for the project, but sometimes it's desirable to manually build your project. This document will discuss the different operations the CLI does and how this may be achieved in different ways. - -## Build Process - -When either `wails build` or `wails dev` are used, the Wails CLI performs a common build process: - - - Install frontend dependencies - - Build frontend project - - Generate build assets - - Compile application - - [optional] Compress application - -### Install frontend dependencies - -#### CLI Steps - -- If the `-s` flag is given, this step is skipped -- Checks `wails.json` to see if there is an install command in the key `frontend:install` -- If there isn't, it skips this step -- If there is, it checks if `package.json` exists in the frontend directory. If it doesn't exist, it skips this step -- An MD5 sum is generated from the `package.json` file contents -- It checks for the existence of `package.json.md5` and if it exists, will compare the contents of it (an MD5 sum) with the one generated to see if the contents have changed. If they are the same, this step is skipped -- If `package.json.md5` does not exist, it creates it using the generated MD5 sum -- If a build is now required, or `node_modules` does not exist, or the `-f` flag is given, the install command is executed in the frontend directory - -#### Manual Steps - -This step could be done from the command line or a script with `npm install`. - -### Build frontend project - -#### Wails CLI - -- If the `-s` flag is given, this step is skipped -- Checks `wails.json` to see if there is a build command in the key `frontend:build` -- If there isn't, it skips this step -- If there is, it is executed in the frontend directory - -#### Manual Steps - -This step could be done from the command line or a script with `npm run build` or whatever the frontend build script is. - -### Generate assets - -#### Wails CLI - -- If `-nopackage` flag is set, this stage is skipped -- If the `build/appicon.png` file does not exist, a default one is created -- For Windows, see [Bundling for Windows](#windows) -- If `build/windows/icon.ico` does not exist, it will create it from the `build/appicon.png` image. - -##### Windows - -- If `build/windows/icon.ico` does not exist, it will create it from `build/appicon.png` using icon sizes of 256, 128, 64, 48, 32 and 16. This is done using [winicon](https://github.com/leaanthony/winicon). -- If the `build/windows/.manifest` file does not exist, it creates it from a default version. -- Compiles the application as a production build (above) -- Uses [winres](https://github.com/tc-hib/winres) to bundle the icon and manifest into a `.syso` file ready for linking. - -#### Manual Steps - -- Create `icon.ico` using the [winicon](https://github.com/leaanthony/winicon) CLI tool (or any other tool). -- Create / Update a `.manifest` file for your application -- Use the [winres CLI](https://github.com/tc-hib/go-winres) to generate a `.syso` file. - -### Compile application - -#### Wails CLI - -- If the `-clean` flag is provided, the `build` directory is deleted and recreated -- For `wails dev`, the following default Go flags are used: `-tags dev -gcflags "all=-N -l"` -- For `wails build`, the following default Go flags are used: `-tags desktop,production -ldflags "-w -s"` - - On Windows, `-ldflags "-w -h -H windowsgui"` -- Additional tags passed to the CLI using `-tags` are added to the defaults -- Additional ldflags passed to the CLI using `-ldflags` are added to the defaults -- The `-o` flag is passed through -- The Go compiler specified by `-compiler` will be used for compilation - -#### Manual steps - -- For dev build, the minimum command would be: `go build -tags dev -gcflags "all=-N -l"` -- For production build, the minimum command would be: `go build -tags desktop,production -ldflags "-w -s -H windowsgui"` -- Ensure that you compile in the same directory as the `.syso` file - -### Compress application - -#### Wails CLI - -- If the `-upx` flag has been given, the `upx` program will be run to compress the application with the default settings -- If `-upxflags` is also passed, these flags are used instead of the default ones - -#### Manual steps - -- Run `upx [flags]` manually to compress the application. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/migrating.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/migrating.mdx deleted file mode 100644 index a2f0c4a04..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/migrating.mdx +++ /dev/null @@ -1,187 +0,0 @@ -# Migrating from v1 - -## Overview - -Wails v2 is a significant change from v1. This document aims to highlight the changes and the steps in migrating an existing project. - -### Creating the Application - -In v1, the main application is created using `wails.CreateApp`, bindings are added with `app.Bind`, then the application is run using `app.Run()`. - -Example: - -```go title="v1" - app := wails.CreateApp(&wails.AppConfig{ - Title: "MyApp", - Width: 1024, - Height: 768, - JS: js, - CSS: css, - Colour: "#131313", - }) - app.Bind(basic) - app.Run() -``` - -In v2, there is just a single method, `wails.Run()`, that accepts [application options](../reference/options.mdx#application-options). - -```go title="v2" - err := wails.Run(&options.App{ - Title: "MyApp", - Width: 800, - Height: 600, - Assets: assets, - Bind: []interface{}{ - basic, - }, - }) -``` - -### Binding - -In v1, it was possible to bind both arbitrary functions and structs. In v2, this has been simplified to only binding structs. The struct instances that were previously passed to the `Bind()` method in v1, are now specified in the `Bind` field of the [application options](../reference/options.mdx#application-options): - -```go title="v1" - app := wails.CreateApp(/* options */) - app.Bind(basic) -``` - -```go title="v2" - err := wails.Run(&options.App{ - /* other options */ - Bind: []interface{}{ - basic, - }, - }) -``` - -In v1, bound methods were available to the frontend at `window.backend`. This has changed to `window.go`.`` - -### Application Lifecycle - -In v1, there were 2 special methods in a bound struct: `WailsInit()` and `WailsShutdown()`. These have been replaced with 3 lifecycle hooks as part of the [application options](../reference/options.mdx#application-options): - -- [OnStartup](../reference/options.mdx#onstartup) -- [OnShutdown](../reference/options.mdx#onshutdown) -- [OnDomReady](../reference/options.mdx#ondomready) - -Note: [OnDomReady](../reference/options.mdx#ondomready) replaces the `wails:ready` system event in v1. - -These methods can be standard functions, but a common practice is to have them part of a struct: - -```go title="v2" - basic := NewBasicApp() - err := wails.Run(&options.App{ - /* Other Options */ - OnStartup: basic.startup, - OnShutdown: basic.shutdown, - OnDomReady: basic.domready, - }) -... -type Basic struct { - ctx context.Context -} -func (b *Basic) startup(ctx context.Context) { - b.ctx = ctx -} -... -``` - -### Runtime - -The runtime in v2 is much richer than v1 with support for menus, window manipulation and better dialogs. The signature of the methods has changed slightly - please refer the the [Runtime Reference](../reference/runtime/intro.mdx). - -In v1, the [runtime](../reference/runtime/intro.mdx) was available via a struct passed to `WailsInit()`. In v2, the runtime has been moved out to its own package. Each method in the runtime takes the `context.Context` that is passed to the [OnStartup](../reference/options.mdx#onstartup) method. - -```go title="Runtime Example" -package main - -import "github.com/wailsapp/wails/v2/pkg/runtime" - -type Basic struct { - ctx context.Context -} - -// startup is called at application startup -func (a *App) startup(ctx context.Context) { - a.ctx = ctx - runtime.LogInfo(ctx, "Application Startup called!") -} - -``` - -### Assets - -The _biggest_ change in v2 is how assets are handled. - -In v1, assets were passed via 2 application options: - -- `JS` - The application's Javascript -- `CSS` - The application's CSS - -This meant that the responsibility of generating a single JS and CSS file was on the developer. This essentially required the use of complicated packers such as webpack. - -In v2, Wails makes no assumptions about your frontend assets, just like a webserver. All of your application assets are passed to the application options as an `embed.FS`. - -**This means there is no requirement to bundle your assets, encode images as Base64 or attempt the dark art of bundler configuration to use custom fonts**. - -At startup, Wails will scan the given `embed.FS` for `index.html` and use its location as the root path for all the other application assets - just like a webserver would. - -Example: An application has the following project layout. All final assets are placed in the `frontend/dist` directory: - -```shell -. -├── build/ -├── frontend/ -│ └── dist/ -│ ├── index.html -│ ├── main.js -│ ├── main.css -│ └── logo.svg -├── main.go -└── wails.json -``` - -Those assets may be used by the application by simply creating an `embed.FS`: - -```go title="Assets Example" -//go:embed frontend/dist -var assets embed.FS - -func main() { - err := wails.Run(&options.App{ - /* Other Options */ - Assets: assets, - }) -} -``` - -Of course, bundlers can be used if you wish to. The only requirement is to pass the final application assets directory to Wails using an `embed.FS` in the `Assets` key of the [application options](../reference/options.mdx#application-options). - -### Project Configuration - -In v1, the project configuration was stored in the `project.json` file in the project root. In v2, the project configuration is stored in the `wails.json` file in the project root. - -The format of the file is slightly different. Here is a comparison: - -

- -| v1 | v2 | Notes | -| ------------------ | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| name | name | | -| description | | Removed | -| author / name | author / name | | -| author / email | author / email | | -| version | version | | -| binaryname | outputfilename | Changed | -| frontend / dir | | Removed | -| frontend / install | frontend:install | Changed | -| frontend / build | frontend:build | Changed | -| frontend / bridge | | Removed | -| frontend / serve | | Removed | -| tags | | Removed | -| | wailsjsdir | The directory to generate wailsjs modules | -| | assetdir | The directory of the compiled frontend assets for `dev` mode. This is normally inferred and could be left empty. | -| | reloaddirs | Comma separated list of additional directories to watch for changes and to trigger reloads in `dev` mode. This is only needed for some more advanced asset configurations. | - -

diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/mouse-buttons.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/mouse-buttons.mdx deleted file mode 100644 index 4a3de2a61..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/mouse-buttons.mdx +++ /dev/null @@ -1,25 +0,0 @@ -# Mouse Buttons - -The Wails runtime intercepts mouse clicks to determine whether a frameless window needs resizing or a window needs to be moved. It has been asked how to detect when a mouse click has occurred, because `window.onclick` doesn't report the mouse buttons correctly. The following code shows how to detect mouse clicks: - -```javascript -window.addEventListener("mousedown", handleMouseButtonDown); - -function handleMouseButtonDown(event) { - if (event.button === 0) { - // left mouse button - } else if (event.button === 1) { - // middle mouse button - } else if (event.button === 2) { - // right mouse button - } else if (event.button === 3) { - // back mouse button - } else if (event.button === 4) { - // forward mouse button - } else { - // other mouse button - } -} -``` - -Reference: https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/overscroll.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/overscroll.mdx deleted file mode 100644 index dca7e83a3..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/overscroll.mdx +++ /dev/null @@ -1,10 +0,0 @@ -# Overscroll - -[Overscroll](https://developer.mozilla.org/en-US/docs/Web/CSS/overscroll-behavior) is the "bounce effect" you sometimes get when you scroll beyond a page's content boundaries. This is common in mobile apps. This can be disabled using CSS: - -```css -html { - height: 100%; - overflow: hidden; -} -``` diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/routing.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/routing.mdx deleted file mode 100644 index c35cc1c8a..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/routing.mdx +++ /dev/null @@ -1,47 +0,0 @@ -# Routing - -Routing is a popular way to switch views in an application. This page offers some guidance around how to do that. - -## Vue - -The recommended approach for routing in Vue is [Hash Mode](https://next.router.vuejs.org/guide/essentials/history-mode.html#hash-mode): - -```js -import { createRouter, createWebHashHistory } from "vue-router"; - -const router = createRouter({ - history: createWebHashHistory(), - routes: [ - //... - ], -}); -``` - -## Angular - -The recommended approach for routing in Angular is [HashLocationStrategy](https://codecraft.tv/courses/angular/routing/routing-strategies#_hashlocationstrategy): - -```ts -RouterModule.forRoot(routes, { useHash: true }); -``` - -## React - -The recommended approach for routing in React is [HashRouter](https://reactrouter.com/docs/en/v6/routers/hash-router): - -```jsx -import { HashRouter } from "react-router-dom"; - -ReactDOM.render( - - {/* The rest of your app goes here */} - - } exact /> - } /> - } /> - {/* more... */} - - , - root -); -``` diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/signing.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/signing.mdx deleted file mode 100644 index e615269dd..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/signing.mdx +++ /dev/null @@ -1,379 +0,0 @@ -# Code Signing - -This is a guide on how you can sign your binaries generated with Wails on MacOS and Windows. The guide will target CI environments, more specifically GitHub Actions. - -## Windows - -First off you need a code signing certificate. If you do not already have one, Microsoft's info page lists some providers [here](https://docs.microsoft.com/en-us/windows-hardware/drivers/dashboard/get-a-code-signing-certificate). Please note that an EV certificate is not required unless you need to write kernel-level software such as device drivers. For signing your Wails app, a standard code signing certificate will do just fine. - -It may be a good idea to check with your certificate provider how to sign your binaries on your local machine before targeting automated build systems, just so you know if there are any special requirements. For instance, [here](https://www.ssl.com/how-to/using-your-code-signing-certificate/) is SSL.com's code signing guide for Windows. If you know how to sign locally, it will be easier to troubleshoot any potential issues in a CI environment. For instance, SSL.com code signing certificates require the `/tr` flag for [SignTool.exe](https://docs.microsoft.com/en-us/windows/win32/seccrypto/signtool) while other providers may only need the `/t` flag for providing the timestamping server. Popular GitHub Actions for signing Windows binaries like [this one](https://github.com/Dana-Prajea/code-sign-action) does not support the `/tr` flag on SignTool.exe. Therefore this guide will focus on signing our app manually with PowerShell commands, but you can use actions like the [code-sign-action](https://github.com/Dana-Prajea/code-sign-action) Action if you prefer. - -First off, let's make sure we are able to build our Wails app in our GitHub CI. Here is a small workflow template: - -```yaml -name: "example" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -- name: Get Wails - run: go install github.com/wailsapp/wails/v2/cmd/wails@latest - - name: Build Wails app - run: | - wails build - - name: upload artifacts macOS - if: matrix.platform == 'macos-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-macos - path: build/bin/* - - name: upload artifacts windows - if: matrix.platform == 'windows-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-windows - path: build/bin/* - jobs: - package: - strategy: - matrix: - platform: [windows-latest, macos-latest] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend manually here, unless you have configured frontend build and install commands in wails.json. -``` - -Next we need to give the GitHub workflow access to our signing certificate. This is done by encoding your .pfx or .p12 certificate into a base64 string. To do this in PowerShell, you can use the following command assuming your certificate is called 'my-cert.p12': - -```PowerShell -certutil -encode .\my-cert.p12 my-cert-base64.txt -``` - -You should now have your .txt file with the base64 encoded certificate. Now you need to make two action secrets on GitHub. It should start with _-----BEGIN CERTIFICATE-----_ and end with _-----END CERTIFICATE-----_. Navigate to _Settings -> Secrets -> Actions_ and create the two following secrets: - -- **WIN_SIGNING_CERT** with the contents of your base64 encoded certificate text. -- **WIN_SIGNING_CERT_PASSWORD** with the contents of your certificate password. - -Now we're ready to implement the signing in our workflow using one of the two methods: - -### Method 1: signing with commands - -This method uses PowerShell commands to sign our app, and leaves you control over the entire signing process. - -After the `"Build Wails app"` step, we can add the following step to our workflow: - -```yaml -- name: Sign Windows binaries - if: matrix.platform == 'windows-latest' - run: | - echo "Creating certificate file" - New-Item -ItemType directory -Path certificate - Set-Content -Path certificate\certificate.txt -Value '${{ secrets.WIN_SIGNING_CERT }}' - certutil -decode certificate\certificate.txt certificate\certificate.pfx - echo "Signing our binaries" - & 'C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe' sign /fd /t /f certificate\certificate.pfx /p '${{ secrets.WIN_SIGNING_CERT_PASSWORD }}' - -``` - -This script creates a new directory for your certificate file, creates the certificate file from our base64 secret, converts it to a .pfx file, and finally signs the binary. The following variables needs to be replaced in the last line: - -- **signing algorithm**: usually sha256. -- **timestamping server**: URL to the timestamping server to use with your certificate. -- **path to binary**: path to the binary you want to sign. - -Given that our Wails config has `outputfilename` set to "app.exe" and that we have a certificate from SSL.com, this would be our workflow: - -```yaml -name: "example" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -jobs: - package: - strategy: - matrix: - platform: [windows-latest, macos-latest] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend here, unless you have configured frontend build and install commands in wails.json. - - name: Get Wails - run: go install github.com/wailsapp/wails/v2/cmd/wails@latest - - name: Build Wails app - run: | - wails build - - name: Sign Windows binaries - if: matrix.platform == 'windows-latest' - run: | - echo "Creating certificate file" - New-Item -ItemType directory -Path certificate - Set-Content -Path certificate\certificate.txt -Value '${{ secrets.WIN_SIGNING_CERT }}' - certutil -decode certificate\certificate.txt certificate\certificate.pfx - echo "Signing our binaries" - & 'C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe' sign /fd sha256 /tr http://ts.ssl.com /f certificate\certificate.pfx /p '${{ secrets.WIN_SIGNING_CERT_PASSWORD }}' .\build\bin\app.exe - - - name: upload artifacts macOS - if: matrix.platform == 'macos-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-macos - path: build/bin/* - - name: upload artifacts windows - if: matrix.platform == 'windows-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-windows - path: build/bin/* -``` - -### Method 2: automatically signing with Action - -It is possible to use a Windows code signing Action like [this](https://github.com/marketplace/actions/code-sign-a-file-with-pfx-certificate) one, but note it requires a SHA1 hash for the certificate and a certificate name. View an example of how to configure it on the Action's [marketplace](https://github.com/marketplace/actions/code-sign-a-file-with-pfx-certificate). - ---- - -## MacOS - -First off you need your code signing certificate from Apple. If you do not have one, a simple Google search will help you acquire one. Once you have your certificate, you need to export it and encode it to base64. [This tutorial](https://localazy.com/blog/how-to-automatically-sign-macos-apps-using-github-actions) shows you how to do that in an easy manner. Once you have exported your .p12 certificate file, you can encode it to base64 as seen in the tutorial with the following command: - -```bash -base64 Certificates.p12 | pbcopy -``` - -Now you're ready to create some GitHub project secrets, just as with Windows: - -- **APPLE_DEVELOPER_CERTIFICATE_P12_BASE64** with the contents of your newly copied base64 certificate. -- **APPLE_DEVELOPER_CERTIFICATE_PASSWORD** with the contents of your certificate password. -- **APPLE_PASSWORD** with the contents of an App-Specific password to your Apple-ID account which you can generate [here](https://appleid.apple.com/account/manage). - -Let's make sure we are able to build our Wails app in our GitHub Action workflow. Here is a small template: - -```yaml -name: "example" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -jobs: - package: - strategy: - matrix: - platform: [windows-latest, macos-latest] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend here, unless you have configured frontend build and install commands in wails.json. - jobs: - package: - strategy: - matrix: - platform: [windows-latest, macos-latest] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend manually here, unless you have configured frontend build and install commands in wails.json. -``` - -For code signing on macOS, [gon](https://github.com/mitchellh/gon) is a very handy tool for code signing and communicating with Apple servers, also written in Go, and will be used in this guide. - -After the `Build Wails app` step, add the following to the workflow: - -```yaml -- name: MacOS download gon for code signing and app notarization - if: matrix.platform == 'macos-latest' - run: | - brew install mitchellh/gon/gon -``` - -Now we need to configure some gon config files in our `build/darwin` directory: - -1. gon-sign.json: - -```json -{ - "source": ["./build/bin/app.app"], - "bundle_id": "app.myapp", - "apple_id": { - "username": "my-appleid@email.com", - "password": "@env:APPLE_PASSWORD" - }, - "sign": { - "application_identity": "Developer ID Application: My Name" - } -} -``` - -Where `source` is your Wails binary, `bundle_id` is your bundle ID, `apple_id` contains your Apple ID username and App-Specific password which you created earlier, and `sign.application_identity` is your identity which you can find by running the following command: - -```bash -security find-identity -v -p codesigning -``` - -2. entitlements.plist: - -```plist - - - - - com.apple.security.app-sandbox - - com.apple.security.network.client - - com.apple.security.network.server - - com.apple.security.files.user-selected.read-write - - com.apple.security.files.downloads.read-write - - - -``` - -In this file you configure the entitlements you need for you app, e.g. camera permissions if your app uses the camera. Read more about entitlements [here](https://developer.apple.com/documentation/bundleresources/entitlements). - -Make sure you have updated your `Info.plist` file with the same bundle ID as you entered in `gon-sign.json`. Here's an example `Info.plist` file: - -```plist - - - CFBundlePackageTypeAPPL - CFBundleNameMyApp - CFBundleExecutableapp - CFBundleIdentifierapp.myapp - CFBundleVersion0.1.0 - CFBundleGetInfoStringMy app is cool and nice and chill and - CFBundleShortVersionString0.1.0 - CFBundleIconFileiconfile - LSMinimumSystemVersion10.13.0 - NSHighResolutionCapabletrue - LSApplicationCategoryTypepublic.app-category.utilities - NSHumanReadableCopyright© Me - -``` - -Now we're ready to add the signing step in our workflow after building the Wails app: - -```yaml -- name: Import Code-Signing Certificates for macOS - if: matrix.platform == 'macos-latest' - uses: Apple-Actions/import-codesign-certs@v1 - with: - # The certificates in a PKCS12 file encoded as a base64 string - p12-file-base64: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_P12_BASE64 }} - # The password used to import the PKCS12 file. - p12-password: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_PASSWORD }} -- name: Sign our macOS binary - if: matrix.platform == 'macos-latest' - run: | - echo "Signing Package" - gon -log-level=info ./build/darwin/gon-sign.json -``` - -Please note that signing binaries with Apple could take anywhere from minutes to hours. - -## Combined workflow file: - -Here is our GitHub workflow file with Windows + macOS combined: - -```yaml -name: "example combined" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -jobs: - package: - strategy: - matrix: - platform: [windows-latest, macos-latest] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend here, unless you have configured frontend build and install commands in wails.json. - jobs: - package: - strategy: - matrix: - platform: [windows-latest, macos-latest] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend here, unless you have configured frontend build and install commands in wails.json. - - name: Get Wails - run: go install github.com/wailsapp/wails/v2/cmd/wails@latest - - name: Build Wails app - run: | - wails build - - name: MacOS download gon for code signing and app notarization - if: matrix.platform == 'macos-latest' - run: | - brew install mitchellh/gon/gon - - name: Import Code-Signing Certificates for macOS - if: matrix.platform == 'macos-latest' - uses: Apple-Actions/import-codesign-certs@v1 - with: - # The certificates in a PKCS12 file encoded as a base64 string - p12-file-base64: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_P12_BASE64 }} - # The password used to import the PKCS12 file. -``` - -# End notes - -This guide inspired by the RiftShare project and its workflow, which is highly recommended to check out [here](https://github.com/achhabra2/riftshare/blob/main/.github/workflows/build.yaml). diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/templates.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/templates.mdx deleted file mode 100644 index df75cbbc7..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/templates.mdx +++ /dev/null @@ -1,95 +0,0 @@ -# Templates - -Wails generates projects from pre-created templates. In v1, this was a difficult to maintain set of projects that were subject to going out of date. In v2, to empower the community, a couple of new features have been added for templates: - -- Ability to generate projects from [Remote Templates](../reference/cli.mdx#remote-templates) -- Tooling to help create your own templates - -## Creating Templates - -To create a template, you can use the `wails generate template` command. To generate a default template, run: - -`wails generate template -name mytemplate` - -This creates the directory "mytemplate" with default files: - -```shell title=mytemplate/ -. -|-- NEXTSTEPS.md -|-- README.md -|-- app.tmpl.go -|-- frontend -| `-- dist -| |-- assets -| | |-- fonts -| | | |-- OFL.txt -| | | `-- nunito-v16-latin-regular.woff2 -| | `-- images -| | `-- logo-dark.svg -| |-- index.html -| |-- main.css -| `-- main.js -|-- go.mod.tmpl -|-- main.tmpl.go -|-- template.json -`-- wails.tmpl.json -``` - -### Template Overview - -The default template consists of the following files and directories: - -| Filename / Dir | Description | -| --------------- | -------------------------------------------- | -| NEXTSTEPS.md | Instructions on how to complete the template | -| README.md | The README published with the template | -| app.tmpl.go | `app.go` template file | -| frontend/ | The directory containing frontend assets | -| go.mod.tmpl | `go.mod` template file | -| main.tmpl.go | `main.go` template file | -| template.json | The template metadata | -| wails.tmpl.json | `wails.json` template file | - -At this point it is advisable to follow the steps in `NEXTSTEPS.md`. - -## Creating a Template from an Existing Project - -It's possible to create a template from an existing frontend project by passing the path to the project when generating the template. We will now walk through how to create a Vue 3 template: - -- Install the vue cli: `npm install -g @vue/cli` -- Create the default project: `vue create vue3-base` - - Select `Default (Vue 3) ([Vue 3] babel, eslint)` -- After the project has been generated, run: - -```shell -> wails generate template -name wails-vue3-template -frontend .\vue3-base\ -Extracting base template files... -Migrating existing project files to frontend directory... -Updating package.json data... -Renaming package.json -> package.tmpl.json... -Updating package-lock.json data... -Renaming package-lock.json -> package-lock.tmpl.json... -``` - -- The template may now be customised as specified in the `NEXTSTEPS.md` file -- Once the files are ready, it can be tested by running: `wails init -n my-vue3-project -t .\wails-vue3-template\` -- To test the new project, run: `cd my-vue3-project` then `wails build` -- Once the project has compiled, run it: `.\build\bin\my-vue3-project.exe` -- You should have a fully functioning Vue3 application: - -
- -
- -## Publishing Templates - -Publishing a template is simply pushing the files to GitHub. The following best practice is encouraged: - -- Remove any unwanted files and directories (such as `.git`) from your frontend directory -- Ensure that `template.json` is complete, especially `helpurl` -- Push the files to GitHub -- Create a PR on the [Community Templates](../community/templates.mdx) page -- Announce the template on the [Template Announcement](https://github.com/wailsapp/wails/discussions/825) discussion board diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/troubleshooting.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/troubleshooting.mdx deleted file mode 100644 index 4de561c08..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/troubleshooting.mdx +++ /dev/null @@ -1,142 +0,0 @@ -# Troubleshooting - -An assortment of troubleshooting tips. - -## The `wails` command appears to be missing? - -If your system is reporting that the `wails` command is missing, make sure you have followed the Go installation guide correctly. Normally, it means that the `go/bin` directory in your User's home directory is not in the `PATH` environment variable. You will also normally need to close and reopen any open command prompts so that changes to the environment made by the installer are reflected at the command prompt. - -## My application is displaying a white/blank screen - -Check that your application includes the assets from the correct directory. In your `main.go` file, you will have something similar to the following code: - -```go -//go:embed frontend/dist -var assets embed.FS -``` - -Check that `frontend/dist` contains your application assets. - -### Mac - -If this happens on Mac, try adding the following to your `Info.plist`: - -```xml -NSAppTransportSecurity - - NSAllowsLocalNetworking - - -``` - -Reference: https://github.com/wailsapp/wails/issues/1504#issuecomment-1174317433 - -## Mac application not valid - -If your built application looks like this in finder: - -

- -

- -it's likely that your application's `info.plist` is invalid. Update the file in `build/.app/Contents/info.plist` and check if the data is valid, EG check the binary name is correct. To persist the changes, copy the file back to the `build/darwin` directory. - -## Cannot call backend method from frontend with variadic arguments - -If you have a backend method defined with variadic parameters, eg: - -```go -func (a *App) TestFunc(msg string, args ...interface{}) error { - // Code -} -``` - -calling this method from the frontend like this will fail: - -```js -var msg = "Hello: "; -var args = ["Go", "JS"]; -window.go.main.App.TestFunc(msg, ...args) - .then((result) => { - //do things here - }) - .catch((error) => { - //handle error - }); -``` - -Workaround: - -```js -var msg = "Hello "; -var args = ["Go", "JS"]; -window.go.main.App.TestFunc(msg, args) - .then((result) => { - //without the 3 dots - //do things here - }) - .catch((error) => { - //handle error - }); -``` - -Credit: https://github.com/wailsapp/wails/issues/1186 - -## I'm having getting proxy errors when trying to install Wails - -If you are getting errors like this: - -``` -"https://proxy.golang.org/github.com/wailsapp/wails/cmd/wails/@v/list": dial tcp 172.217.163.49:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. -``` - -it's probably because the official Go Proxy is being blocked (Users in China have reported this). The solution is to set up the proxy manually, eg: - -``` -go env -w GO111MODULE=on -go env -w GOPROXY=https://goproxy.cn,direct -``` - -Source: https://github.com/wailsapp/wails/issues/1233 - -## The generated Typescript doesn't have the correct types - -Sometimes the generated Typescript doesn't have the correct types. To mitigate this, it is possible to specify what types should be generated using the `ts_type` struct tag. For more details, please read [this](https://github.com/tkrajina/typescriptify-golang-structs#custom-types). - -## When I navigate away from `index.html`, I am unable to call methods on the frontend - -If you navigate away from `index.html` to a new html file, the context will be lost. This can be fixed by adding the following imports to the `` section of any new page you navigate to: - -```html - - - - -``` - -Source: https://github.com/wailsapp/wails/discussions/1512 - -## I get `too many open files` errors on my Mac when I run `wails dev` - -By default, macOS will only allow you to open a maximum of 256 files. This can affect the `wails dev` command. This limit can be increased by running: `ulimit -n 1024` in the terminal. - -FSNotify is [looking to move to Apple's fsevents](https://github.com/fsnotify/fsnotify/issues/11) for Mac. If this isn't completed soon, we will create our own implementation, tracked [here](https://github.com/wailsapp/wails/issues/1733). - -## My Mac app gives me weird compilation errors - -A few users have reported seeing compilation errors such as the following: - -```shell -# github.com/wailsapp/wails/v2/internal/frontend/desktop/darwin -In file included from ../../pkg/mod/github.com/wailsapp/wails/v2@v2.0.0-beta.44.2/internal/frontend/desktop/darwin/callbacks.go:9: -In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:12: -/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSBundle.h:91:143: error: function does not return NSString -- (NSAttributedString *)localizedAttributedStringForKey:(NSString *)key value:(nullable NSString *)value table:(nullable NSString *)tableName NS_FORMAT_ARGUMENT(1) NS_REFINED_FOR_SWIFT API_AVAILABLE(macos(12.0), ios(15.0), watchos(8.0), tvos(15.0)); - ~~~~~~~~~~~~~~ ^ ~ -/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:103:48: note: expanded from macro 'NS_FORMAT_ARGUMENT' - #define NS_FORMAT_ARGUMENT(A) __attribute__ ((format_arg(A))) -``` - -This is *normally* due to a mismatch with the OS version you are running and the version of the XCode Command Line Tools installed. If you see an error like this, try upgrading your XCode Command Line Tools to the latest version. - -Source: https://github.com/wailsapp/wails/issues/1806 \ No newline at end of file diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/vscode.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/vscode.mdx deleted file mode 100644 index ed258656d..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/vscode.mdx +++ /dev/null @@ -1,82 +0,0 @@ - -# Visual Studio Code - -This page is for miscellaneous tips and tricks when using Visual Studio Code with Wails. - -## Vetur Configuration - -Many thanks to [@Lyimmi](https://github.com/Lyimmi) for this tip. Originally posted [here](https://github.com/wailsapp/wails/issues/1791#issuecomment-1228158349). - -Vetur is a popular plugin for Visual Studio Code that provides syntax highlighting and code completion for Vue projects. When loading a Wails project in VSCode, Vetur will throw an error as it is expecting to find the frontend project in the root directory. To fix this, you can do the following: - -Create a file named `vetur.config.js` in the project's root. - -```javascript -// vetur.config.js -/** @type {import('vls').VeturConfig} */ -module.exports = { - // **optional** default: `{}` - // override vscode settings - // Notice: It only affects the settings used by Vetur. - settings: { - "vetur.useWorkspaceDependencies": true, - "vetur.experimental.templateInterpolationService": true - }, - // **optional** default: `[{ root: './' }]` - // support monorepos - projects: [ - { - // **required** - // Where is your project? - // It is relative to `vetur.config.js`. - // root: './packages/repo1', - root: './frontend', - // **optional** default: `'package.json'` - // Where is `package.json` in the project? - // We use it to determine the version of vue. - // It is relative to root property. - package: './package.json', - // **optional** - // Where is TypeScript config file in the project? - // It is relative to root property. - tsconfig: './tsconfig.json', - // **optional** default: `'./.vscode/vetur/snippets'` - // Where is vetur custom snippets folders? - snippetFolder: './.vscode/vetur/snippets', - // **optional** default: `[]` - // Register globally Vue component glob. - // If you set it, you can get completion by that components. - // It is relative to root property. - // Notice: It won't actually do it. You need to use `require.context` or `Vue.component` - globalComponents: [ - './src/components/**/*.vue' - ] - } - ] -} -``` - -Next, configure `frontend/tsconfig.json`: - -```javascript -{ - "compilerOptions": { - "module": "system", - "noImplicitAny": true, - "removeComments": true, - "preserveConstEnums": true, - "sourceMap": true, - "outFile": "../../built/local/tsc.js", - "allowJs": true - }, - "exclude": [ - "node_modules", - "**/*.spec.ts" - ], - "include": [ - "src/**/*", - "wailsjs/**/*.ts" - ] -} -``` -This should enable you to now use Vetur as expected. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/windows-installer.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/windows-installer.mdx deleted file mode 100644 index 21de9a408..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/windows-installer.mdx +++ /dev/null @@ -1,56 +0,0 @@ -# NSIS installer - -

- -
-

- -Wails supports generating Windows installers using the [NSIS installer](https://nsis.sourceforge.io/). - -## Installing NSIS - -### Windows - -The installer is available on the [NSIS Download](https://nsis.sourceforge.io/Download) page. - -If you use the chocolatey package manager, run the following script: - -``` -choco install nsis -``` - -If you install NSIS manually, you need to add the _Bin_ folder, which contains `makensis.exe`, in your NSIS installation to your path. [Here](https://www.architectryan.com/2018/03/17/add-to-the-path-on-windows-10/) is a good tutorial on how to add to path on Windows. - -### Linux - -The `nsis` package should be available through your distribution's package manager. - -### MacOS - -NSIS is available to install through homebrew: `brew install nsis`. - -## Generating the installer - -When a new project is created, Wails generates the NSIS configuration files in `build/windows/installer`. The config data is read from `installer/info.json` and that is configured to use the project's `wails.json` Info section: - -```json -// ... - "Info": { - "companyName": "My Company Name", - "productName": "Wails Vite", - "productVersion": "1.0.0", - "copyright": "Copyright.........", - "comments": "Built using Wails (https://wails.io)" - }, -``` - -To generate an installer for your application, use the `-nsis` flag with `wails build`: - -``` -wails build -nsis -``` - -The installer will now be available in the `build/bin` directory. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/windows.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/windows.mdx deleted file mode 100644 index 821808c0b..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/windows.mdx +++ /dev/null @@ -1,61 +0,0 @@ -# Windows - -This page has miscellaneous guides related to developing Wails applications for Windows. - -## Handling the WebView2 Runtime Dependency - -Wails applications built for Windows have a runtime requirement on the Microsoft [WebView2 Runtime](https://developer.microsoft.com/en-us/microsoft-edge/webview2/). Windows 11 will have this installed by default, but some machines won't. Wails offers an easy approach to dealing with this dependency. - -By using the `-webview2` flag when building, you can decide what your application will do when a suitable runtime is not detected (including if the installed runtime is too old). The four options are: - -1. Download -2. Embed -3. Browser -4. Error - -### Download - -This option will prompt the user that no suitable runtime has been found and then offer to download and run the official bootstrapper from Microsoft's WebView2 site. If the user proceeds, the official bootstrapper will be downloaded and run. - -### Embed - -This option embeds the official bootstrapper within the application. If no suitable runtime has been found, the application will offer to run the bootstrapper. This adds ~150k to the binary size. - -### Browser - -This option will prompt the user that no suitable runtime has been found and then offer to open a browser to the official WebView2 page where the bootstrapper can be downloaded and installed. The application will then exit, leaving the installation up to the user. - -### Error - -If no suitable runtime is found, an error is given to the user and no further action taken. - -## Fixed version runtime - -Another way of dealing with webview2 dependency is shipping it yourself. You can download [fixed version runtime](https://developer.microsoft.com/microsoft-edge/webview2/#download-section) and bundle or download it with your application. - -Also, you should specify path to fixed version of webview2 runtime in the `windows.Options` structure when launching wails. - -```go - wails.Run(&options.App{ - Windows: &windows.Options{ - WebviewBrowserPath: "", - }, - }) -``` - -Note: When `WebviewBrowserPath` is specified, `error` strategy will be forced in case of minimal required version mismatch or invalid path to a runtime. - -## Spawning other programs - -When spawning other programs, such as scripts, you will see the window appear on the screen. To hide the window, you can use the following code: - -```go -cmd := exec.Command("your_script.exe") -cmd.SysProcAttr = &syscall.SysProcAttr{ - HideWindow: true, - CreationFlags: 0x08000000, -} -cmd.Start() -``` - -Solution provided by [sithembiso](https://github.com/sithembiso) on the [discussions board](https://github.com/wailsapp/wails/discussions/1734#discussioncomment-3386172). diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/howdoesitwork.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/howdoesitwork.mdx deleted file mode 100644 index f59873eca..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/howdoesitwork.mdx +++ /dev/null @@ -1,355 +0,0 @@ ---- -sidebar_position: 20 ---- - -# How does it work? - -A Wails application is a standard Go application, with a webkit frontend. The Go part of the application consists of the application code and a runtime library that provides a number of useful operations, like controlling the application window. The frontend is a webkit window that will display the frontend assets. Also available to the frontend is a Javascript version of the runtime library. Finally, it is possible to bind Go methods to the frontend, and these will appear as Javascript methods that can be called, just as if they were local Javascript methods. - -
- -
- -## The Main Application - -### Overview - -The main application consists of a single call to `wails.Run()`. It accepts the application configuration which describes the size of the application window, the window title, what assets to use, etc. A basic application might look like this: - -```go title="main.go" -package main - -import ( - "embed" - "log" - - "github.com/wailsapp/wails/v2" - "github.com/wailsapp/wails/v2/pkg/options" -) - -//go:embed frontend/dist -var assets embed.FS - -func main() { - - app := &App{} - - err := wails.Run(&options.App{ - Title: "Basic Demo", - Width: 1024, - Height: 768, - Assets: &assets, - OnStartup: app.startup, - OnShutdown: app.shutdown, - Bind: []interface{}{ - app, - }, - }) - if err != nil { - log.Fatal(err) - } -} - - -type App struct { - ctx context.Context -} - -func (b *App) startup(ctx context.Context) { - b.ctx = ctx -} - -func (b *App) shutdown(ctx context.Context) {} - -func (b *App) Greet(name string) string { - return fmt.Sprintf("Hello %s!", name) -} -``` - -### Options rundown - -This example has the following options set: - -- `Title` - The text that should appear in the window's title bar -- `Width` & `Height` - The dimensions of the window -- `Assets` - The application's frontend assets -- `OnStartup` - A callback for when the window is created and is about to start loading the frontend assets -- `OnShutdown` - A callback for when the application is about to quit -- `Bind` - A slice of struct instances that we wish to expose to the frontend - -A full list of application options can be found in the [Options Reference](reference/options). - -#### Assets - -The `Assets` option is mandatory as you can't have a Wails application without frontend assets. Those assets can be any files you would expect to find in a web application - html, js, css, svg, png, etc. **There is no requirement to generate asset bundles** - plain files will do. When the application starts, it will attempt to load `index.html` from your assets and the frontend will essentially work as a browser from that point on. It is worth noting that there is no requirement on where in the `embed.FS` the files live. It is likely that the embed path uses a nested directory relative to your main application code, such as `frontend/dist`: - -```go title="main.go" -//go:embed frontend/dist -var assets embed.FS -``` - -At startup, Wails will iterate the embedded files looking for the directory containing `index.html`. All other assets will be loaded relative to this directory. - -As production binaries use the files contained in `embed.FS`, there are no external files required to be shipped with the application. - -When running in development mode using the `wails dev` command, the assets are loaded off disk, and any changes result in a "live reload". The location of the assets will be inferred from the `embed.FS`. - -More details can be found in the [Application Development Guide](guides/application-development.mdx). - -#### Application Lifecycle Callbacks - -Just before the frontend is about to load `index.html`, a callback is made to the function provided in [OnStartup](reference/options.mdx#onstartup). A standard Go context is passed to this method. This context is required when calling the runtime so a standard pattern is to save a reference to in this method. Just before the application shuts down, the [OnShutdown](reference/options.mdx#onshutdown) callback is called in the same way, again with the context. There is also an [OnDomReady](reference/options.mdx#ondomready) callback for when the frontend has completed loading all assets in `index.html` and is equivalent of the [`body onload`](https://www.w3schools.com/jsref/event_onload.asp) event in Javascript. It is also possible to hook into the window close (or application quit) event by setting the option [OnBeforeClose](reference/options.mdx#onbeforeclose). - -#### Method Binding - -The `Bind` option is one of the most important options in a Wails application. It specifies which struct methods to expose to the frontend. Think of structs like "controllers" in a traditional web application. When the application starts, it examines the struct instances listed in the `Bind` field in the options, determines which methods are public (starts with an uppercase letter) and will generate Javascript versions of those methods that can be called by the frontend code. - -:::info Note - -Wails requires that you pass in an _instance_ of the struct for it to bind it correctly - -::: - -In this example, we create a new `App` instance and then add this instance to the `Bind` option in `wails.Run`: - -```go {16,24} title="main.go" -package main - -import ( - "embed" - "log" - - "github.com/wailsapp/wails/v2" - "github.com/wailsapp/wails/v2/pkg/options" -) - -//go:embed frontend/dist -var assets embed.FS - -func main() { - - app := &App{} - - err := wails.Run(&options.App{ - Title: "Basic Demo", - Width: 1024, - Height: 768, - Assets: &assets, - Bind: []interface{}{ - app, - }, - }) - if err != nil { - log.Fatal(err) - } -} - - -type App struct { - ctx context.Context -} - -func (a *App) Greet(name string) string { - return fmt.Sprintf("Hello %s!", name) -} -``` - -You may bind as many structs as you like. Just make sure you create an instance of it and pass it in `Bind`: - -```go {8-10} - //... - err := wails.Run(&options.App{ - Title: "Basic Demo", - Width: 1024, - Height: 768, - Assets: &assets, - Bind: []interface{}{ - app, - &mystruct1{}, - &mystruct2{}, - }, - }) - -``` - -When you run `wails dev` (or `wails generate module`), a frontend module will be generated containing the following: - -- Javascript bindings for all bound methods -- Typescript declarations for all bound methods -- Typescript definitions for all Go structs used as inputs or outputs by the bound methods - -This makes it incredibly simple to call Go code from the frontend, using the same strongly typed datastructures. - -## The Frontend - -### Overview - -The frontend is a collection of files rendered by webkit. It's like a browser and webserver in one. There is virtually[^1] no limit to which frameworks or libraries you can use. The main points of interaction between the frontend and your Go code are: - -- Calling bound Go methods -- Calling runtime methods - -### Calling bound Go methods - -When you run your application with `wails dev`, it will automatically generate Javascript bindings for your structs in a directory called `wailsjs/go` (You can also do this by running `wails generate module`). The generated files mirror the package names in your application. In the example above, we bind `app`, which has one public method `Greet`. This will lead to the generation of the following files: - -```bash -wailsjs - └─go - └─main - ├─App.d.ts - └─App.js -``` - -Here we can see that there is a `main` package that contains the Javascript bindings for the bound `App` struct, as well as the Typescript declaration file for those methods. To call `Greet` from our frontend, we simply import the method and call it like a regular Javascript function: - -```javascript -// ... -import { Greet } from "../wailsjs/go/main/App"; - -function doGreeting(name) { - Greet(name).then((result) => { - // Do something with result - }); -} -``` - -The Typescript declaration file gives you the correct types for the bound methods: - -```ts -export function Greet(arg1: string): Promise; -``` - -The generated methods return a Promise. A successful call will result in the first return value from the Go call to be passed to the `resolve` handler. An unsuccessful call is when a Go method that has an error type as it's second return value, passes an error instance back to the caller. This is passed back via the `reject` handler. In the example above, `Greet` only returns a `string` so the Javascript call will never reject - unless invalid data is passed to it. - -All data types are correctly translated between Go and Javascript. Even structs. If you return a struct from a Go call, it will be returned to your frontend as a Javascript class. Note: If you wish to use structs, you **must** define `json` struct tags for your fields! - -:::info Note -Anonymous nested structs are not supported at this time. -::: - -It is possible to send structs back to Go. Any Javascript map/class passed as an argument that is expecting a struct, will be converted to that struct type. To make this process a lot easier, in `dev` mode, a TypeScript module is generated, defining all the struct types used in bound methods. Using this module, it's possible to construct and send native Javascript objects to the Go code. - -There is also support for Go methods that use structs in their signature. All Go structs specified by a bound method (either as parameters or return types) will have Typescript versions auto generated as part of the Go code wrapper module. Using these, it's possible to share the same data model between Go and Javascript. - -Example: We update our `Greet` method to accept a `Person` instead of a string: - -```go title="main.go" -type Person struct { - Name string `json:"name"` - Age uint8 `json:"age"` - Address *Address `json:"address"` -} - -type Address struct { - Street string `json:"street"` - Postcode string `json:"postcode"` -} - -func (a *App) Greet(p Person) string { - return fmt.Sprintf("Hello %s (Age: %d)!", p.Name, p.Age) -} -``` - -The `wailsjs/go/main/App.js` file will still have the following code: - -```js title="App.js" -export function Greet(arg1) { - return window["go"]["main"]["App"]["Greet"](arg1); -} -``` - -But the `wailsjs/go/main/App.d.ts` file will be updated with the following code: - -```ts title="App.d.ts" -import { main } from "../models"; - -export function Greet(arg1: main.Person): Promise; -``` - -As we can see, the "main" namespace is imported from a new "models.ts" file. This file contains all the struct definitions used by our bound methods. In this example, this is a `Person` struct. If we look at `models.ts`, we can see how the models are defined: - -```ts title="models.ts" -export namespace main { - export class Address { - street: string; - postcode: string; - - static createFrom(source: any = {}) { - return new Address(source); - } - - constructor(source: any = {}) { - if ("string" === typeof source) source = JSON.parse(source); - this.street = source["street"]; - this.postcode = source["postcode"]; - } - } - export class Person { - name: string; - age: number; - address?: Address; - - static createFrom(source: any = {}) { - return new Person(source); - } - - constructor(source: any = {}) { - if ("string" === typeof source) source = JSON.parse(source); - this.name = source["name"]; - this.age = source["age"]; - this.address = this.convertValues(source["address"], Address); - } - - convertValues(a: any, classs: any, asMap: boolean = false): any { - if (!a) { - return a; - } - if (a.slice) { - return (a as any[]).map((elem) => this.convertValues(elem, classs)); - } else if ("object" === typeof a) { - if (asMap) { - for (const key of Object.keys(a)) { - a[key] = new classs(a[key]); - } - return a; - } - return new classs(a); - } - return a; - } - } -} -``` - -So long as you have TypeScript as part of your frontend build configuration, you can use these models in the following way: - -```js title="mycode.js" -import { Greet } from "../wailsjs/go/main/App"; -import { main } from "../wailsjs/go/models"; - -function generate() { - let person = new main.Person(); - person.name = "Peter"; - person.age = 27; - Greet(person).then((result) => { - console.log(result); - }); -} -``` - -The combination of generated bindings and TypeScript models makes for a powerful development environment. - -More information on Binding can be found in the [Binding Methods](guides/application-development.mdx#binding-methods) section of the [Application Development Guide](guides/application-development.mdx). - -### Calling runtime methods - -The Javascript runtime is located at `window.runtime` and contains many methods to do various tasks such as emit an event or perform logging operations: - -```js title="mycode.js" -window.runtime.EventsEmit("my-event", 1); -``` - -More details about the JS runtime can be found in the [Runtime Reference](reference/runtime/intro). - -[^1]: There is a very small subset of libraries that use features unsupported in WebViews. There are often alternatives and workarounds for such cases. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/introduction.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/introduction.mdx deleted file mode 100644 index 4e65f932e..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/introduction.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 소개 - -Wails는 Go 및 웹 기술을 사용하여 데스크톱 앱을 작성할 수 있는 프로젝트입니다. - -Consider it a lightweight and fast Electron alternative for Go. You can easily build applications with the flexibility and power of Go, combined with a rich, modern frontend. - -### 기능 - -- Native Menus, Dialogs, Theming and Translucency -- Windows, macOS and linux support -- Built in templates for Svelte, React, Preact, Vue, Lit and Vanilla JS -- Easily call Go methods from Javascript -- Automatic Go struct to Typescript model generation -- No CGO or external DLLs required on Windows -- Live development mode using the power of [Vite](https://vite.net/) -- Powerful CLI to easily Create, Build and Package applications -- A rich [runtime library](/docs/next/reference/runtime) -- Applications built with Wails are Apple & Microsoft Store compliant - - -[varly](https://varly.app)는 Wails를 사용하여 작성된 MacOS & Windows용 데스크톱 애플리케이션입니다. 보기 좋을 뿐만 아니라 최신 네이티브 앱에서 바라는 기본 메뉴 구성과 반투명도를 사용합니다. - -

- - - -

- -### 빠른 시작 템플릿 - -Wails에는 애플리케이션을 빠르게 구성하고 실행할 수 있도록 미리 구성된 여러 템플릿이 함께 제공됩니다. Svelte, React, Vue, Preact, Lit, Vanilla와 같은 프레임워크 템플릿들이 있으며, 각 템플릿에는 Javascript와 Typescript 버전이 있습니다. - -### Native Elements - -Wails uses a purpose built library for handling native elements such as Window, Menus, Dialogs, etc, so you can build good-looking, feature rich desktop applications. - -**It does not embed a browser**, so it is resource efficient. Instead, it uses the native rendering engine for the platform. On Windows, this is the new Microsoft Webview2 library, built on Chromium. - -### Go & Javascript Interoperability - -Wails automatically makes your Go methods available to Javascript, so you can call them by name from your frontend! It even generates Typescript models for the structs used by your Go methods, so you can pass the same data structures between Go and Javascript. - -### Runtime Library - -Wails provides a runtime library, for both Go and Javascript, that handles a lot of the things modern applications need, like Eventing, Logging, Dialogs, etc. - -### Live Development Experience - -#### Automatic Rebuilds - -When you run your application in "dev" mode, Wails will build your application as a native desktop application, but will read your assets from disk. It will detect any changes to your Go code and automatically rebuild and relaunch your application. - -#### Automatic Reloads - -When changes to your application assets are detected, your running application will "reload", reflecting your changes almost immediately. - -#### Develop your application in a Browser - -If you prefer to debug and develop in a browser then Wails has you covered. The running application also has a webserver that will run your application in any browser that connects to it. It will even refresh when your assets change on disk. - -### Production-ready Native Binaries - -When you're ready to do the final build of your application, the CLI will compile it down to a single executable, with all the assets bundled into it. On Windows and MacOS, it is possible to create a native package for distribution. The assets used in packaging (icon, info.plist, manifest file, etc) are part of your project and may be customised, giving you total control over how your applications are built. - -### Tooling - -The Wails CLI provides a hassle-free way to generate, build and bundle your applications. It will do the heavy lifting of creating icons, compiling your application with optimal settings and delivering a distributable, production ready binary. Choose from a number of starter templates to get up and running quickly! diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/_category_.json b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/_category_.json deleted file mode 100644 index ebb337b83..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Reference", - "position": 40 -} diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/cli.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/cli.mdx deleted file mode 100644 index 5a00db158..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/cli.mdx +++ /dev/null @@ -1,221 +0,0 @@ ---- -sidebar_position: 2 ---- - -# CLI - -The Wails CLI has a number of commands that are used for managing your projects. All commands are run in the following way: - -`wails ` - -## init - -`wails init` is used for generating projects. - -| Flag | Description | Default | -|:------------------ |:----------------------------------------------------------------------------------------------------------------------- |:-------------------:| -| -n "project name" | Name of the project. **Mandatory**. | | -| -d "project dir" | Project directory to create | Name of the project | -| -g | Initialise git repository | | -| -l | List available project templates | | -| -q | Suppress output to console | | -| -t "template name" | The project template to use. This can be the name of a default template or a URL to a remote template hosted on github. | vanilla | -| -ide | Generate IDE project files | | -| -f | Force build application | false | - -Example: `wails init -n test -d mytestproject -g -ide vscode -q` - -This will generate a a project called "test" in the "mytestproject" directory, initialise git, generate vscode project files and do so silently. - -More information on using IDEs with Wails can be found [here](../guides/ides.mdx). - -### Remote Templates - -Remote templates (hosted on GitHub) are supported and can be installed by using the template's project URL. - -Example: `wails init -n test -t https://github.com/leaanthony/testtemplate[@v1.0.0]` - -A list of community maintained templates can be found [here](../community/templates.mdx) - -:::warning Attention - -**The Wails project does not maintain, is not responsible nor liable for 3rd party templates!** - -If you are unsure about a template, inspect `package.json` and `wails.json` for what scripts are run and what packages are installed. - -::: - -## build - -`wails build` is used for compiling your project to a production-ready binary. - -| Flag | Description | Default | -|:-------------------- |:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |:--------------------------------------------------------------------------------------------------------------------------------------------------- | -| -platform | Build for the given (comma delimited) [platforms](../reference/cli.mdx#platforms) eg. `windows/arm64`. Note, if you do not give the architecture, `runtime.GOARCH` is used. | platform = `GOOS` environment variable if given else `runtime.GOOS`.
arch = `GOARCH` envrionment variable if given else `runtime.GOARCH`. | -| -clean | Cleans the `build/bin` directory | | -| -compiler "compiler" | Use a different go compiler to build, eg go1.15beta1 | go | -| -ldflags "flags" | Additional ldflags to pass to the compiler | | -| -nopackage | Do not package application | | -| -o filename | Output filename | | -| -s | Skip building the frontend | false | -| -f | Force build application | false | -| -tags "extra tags" | Build tags to pass to compiler (quoted and space separated) | | -| -upx | Compress final binary using "upx" | | -| -upxflags | Flags to pass to upx | | -| -v int | Verbosity level (0 - silent, 1 - default, 2 - verbose) | 1 | -| -webview2 | WebView2 installer strategy: download,embed,browser,error | download | -| -u | Updates your project's `go.mod` to use the same version of Wails as the CLI | | -| -debug | Retains debug information in the application. Allows the use of the devtools in the application window | false | -| -trimpath | Remove all file system paths from the resulting executable. | false | -| -race | Build with Go's race detector | false | -| -windowsconsole | Keep the console window for Windows builds | false | - -For a detailed description of the `webview2` flag, please refer to the [Windows](../guides/windows.mdx) Guide. - -If you prefer to build using standard Go tooling, please consult the [Manual Builds](../guides/manual-builds.mdx) guide. - -Example: - -`wails build -clean -o myproject.exe` - -:::info UPX on Apple Silicon - -There are [issues](https://github.com/upx/upx/issues/446) with using UPX with Apple Silicon. - -::: - -:::info UPX on Windows - -Some Antivirus vendors false positively mark `upx` compressed binaries as virus, see [issue](https://github.com/upx/upx/issues/437). - -::: - -### Platforms - -Supported platforms are: - -| Platform | Description | -|:---------------- |:--------------------------------------------- | -| darwin | MacOS + architecture of build machine | -| darwin/amd64 | MacOS 10.13+ AMD64 | -| darwin/arm64 | MacOS 11.0+ ARM64 | -| darwin/universal | MacOS AMD64+ARM64 universal application | -| windows | Windows 10/11 + architecture of build machine | -| windows/amd64 | Windows 10/11 AMD64 | -| windows/arm64 | Windows 10/11 ARM64 | -| linux | Linux + architecture of build machine | -| linux/amd64 | Linux AMD64 | -| linux/arm64 | Linux ARM64 | - -## doctor - -`wails doctor` will run diagnostics to ensure that your system is ready for development. - -Example: - -``` -Wails CLI v2.0.0-beta - -Scanning system - Please wait (this may take a long time)...Done. - -System ------- -OS: Windows 10 Pro -Version: 2009 (Build: 19043) -ID: 21H1 -Go Version: go1.17 -Platform: windows -Architecture: amd64 - -Dependency Package Name Status Version ----------- ------------ ------ ------- -WebView2 N/A Installed 93.0.961.52 -npm N/A Installed 6.14.15 -*upx N/A Installed upx 3.96 - -* - Optional Dependency - -Diagnosis ---------- -Your system is ready for Wails development! - -``` - -## dev - -`wails dev` is used to run your application in a "live development" mode. This means: - -- The application's `go.mod` will be updated to use the same version of Wails as the CLI -- The application is compiled and run automatically -- A watcher is started and will trigger a rebuild of your dev app if it detects changes to your go files -- A webserver is started on `http://localhost:34115` which serves your application (not just frontend) over http. This allows you to use your favourite browser development extensions -- All application assets are loaded from disk. If they are changed, the application will automatically reload (not rebuild). All connected browsers will also reload -- A JS module is generated that provides the following: - - Javascript wrappers of your Go methods with autogenerated JSDoc, providing code hinting - - TypeScript versions of your Go structs, that can be constructed and passed to your go methods -- A second JS module is generated that provides a wrapper + TS declaration for the runtime - -| Flag | Description | Default | -|:---------------------------- |:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |:--------------------- | -| -assetdir "./path/to/assets" | Serve assets from the given directory instead of using the provided asset FS | Value in `wails.json` | -| -browser | Opens a browser to `http://localhost:34115` on startup | | -| -compiler "compiler" | Use a different go compiler to build, eg go1.15beta1 | go | -| -e | Extensions to trigger rebuilds (comma separated) | go | -| -reloaddirs | Additional directories to trigger reloads (comma separated) | Value in `wails.json` | -| -ldflags "flags" | Additional ldflags to pass to the compiler | | -| -tags "extra tags" | Build tags to pass to compiler (quoted and space separated) | | -| -loglevel "loglevel" | Loglevel to use - Trace, Debug, Info, Warning, Error | Debug | -| -noreload | Disable automatic reload when assets change | | -| -nogen | Disable generate module | | -| -v | Verbosity level (0 - silent, 1 - standard, 2 - verbose) | 1 | -| -wailsjsdir | The directory to generate the generated Wails JS modules | Value in `wails.json` | -| -debounce | The time to wait for reload after an asset change is detected | 100 (milliseconds) | -| -devserver "host:port" | The address to bind the wails dev server to | "localhost:34115" | -| -frontenddevserverurl "url" | Use 3rd party dev server url to serve assets, EG Vite | "" | -| -appargs "args" | Arguments passed to the application in shell style | | -| -save | Saves the given `assetdir`, `reloaddirs`, `wailsjsdir`, `debounce`, `devserver` and `frontenddevserverurl` flags in `wails.json` to become the defaults for subsequent invocations. | | -| -race | Build with Go's race detector | false | -| -s | Skip building the frontend | false | - -Example: - -`wails dev -assetdir ./frontend/dist -wailsjsdir ./frontend/src -browser` - -This command will do the following: - -- Build the application and run it (more details [here](../guides/manual-builds.mdx) -- Generate the Wails JS modules in `./frontend/src` -- Watch for updates to files in `./frontend/dist` and reload on any change -- Open a browser and connect to the application - -There is more information on using this feature with existing framework scripts [here](../guides/application-development.mdx#live-reloading). - -## generate - -### template - -Wails uses templates for project generation. The `wails generate template` command helps scaffold a template so that it may be used for generating projects. - -| Flag | Description | -|:---------------- |:------------------------------------------- | -| -name | The template name (Mandatory) | -| -frontend "path" | Path to frontend project to use in template | - -For more details on creating templates, consult the [Templates guide](../guides/templates.mdx). - -### module - -The `wails generate module` command allows you to manually generate the `wailsjs` directory for your application. - -## update - -`wails update` will update the version of the Wails CLI. - -| Flag | Description | -|:------------------ |:------------------------------------- | -| -pre | Update to latest pre-release version | -| -version "version" | Install a specific version of the CLI | - -## version - -`wails version` will simply output the current CLI version. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/menus.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/menus.mdx deleted file mode 100644 index 1f849f853..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/menus.mdx +++ /dev/null @@ -1,261 +0,0 @@ ---- -sidebar_position: 4 ---- - -# Menus - -It is possible to add an application menu to Wails projects. This is achieved by defining a [Menu](#menu) struct and setting it in the [`Menu`](../reference/options.mdx#menu) application config, or by calling the runtime method [MenuSetApplicationMenu](../reference/runtime/menu.mdx#menusetapplicationmenu). - -An example of how to create a menu: - -```go - AppMenu := menu.NewMenu() - FileMenu := AppMenu.AddSubmenu("File") - FileMenu.AddText("&Open", keys.CmdOrCtrl("o"), openFile) - FileMenu.AddSeparator() - FileMenu.AddText("Quit", keys.CmdOrCtrl("q"), func(_ *menu.CallbackData) { - runtime.Quit() - }) - - if runtime.GOOS == "darwin" { - AppMenu.Append(menu.EditMenu()) // on macos platform, we should append EditMenu to enable Cmd+C,Cmd+V,Cmd+Z... shortcut - } - - err := wails.Run(&options.App{ - Title: "Menus Demo", - Width: 800, - Height: 600, - Menu: AppMenu, - Bind: []interface{}{ - app, - }, - ) - // ... -``` - -It is also possible to dynamically update the menu, by updating the menu struct and calling [MenuUpdateApplicationMenu](../reference/runtime/menu.mdx#menuupdateapplicationmenu). - -The example above uses helper methods, however it's possible to build the menu structs manually. - -## Menu - -A Menu is a collection of MenuItems: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -type Menu struct { - Items []*MenuItem -} -``` - -For the Application menu, each MenuItem represents a single menu such as "Edit". - -A simple helper method is provided for building menus: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -func NewMenuFromItems(first *MenuItem, rest ...*MenuItem) *Menu -``` - -This makes the layout of the code more like that of a menu without the need to add the menu items manually after creating them. Alternatively, you can just create the menu items and add them to the menu manually. - -## MenuItem - -A MenuItem represents an item within a Menu. - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -// MenuItem represents a menu item contained in a menu -type MenuItem struct { - Label string - Role Role - Accelerator *keys.Accelerator - Type Type - Disabled bool - Hidden bool - Checked bool - SubMenu *Menu - Click Callback -} -``` - -| Field | Type | Notes | -| ----------- | ------------------------------------ | ------------------------------------------------------------- | -| Label | string | The menu text | -| Accelerator | [\*keys.Accelerator](#accelerator) | Key binding for this menu item | -| Type | [Type](#type) | Type of MenuItem | -| Disabled | bool | Disables the menu item | -| Hidden | bool | Hides this menu item | -| Checked | bool | Adds check to item (Checkbox & Radio types) | -| SubMenu | [\*Menu](#menu) | Sets the submenu | -| Click | [Callback](#callback) | Callback function when menu clicked | -| Role | string | Defines a [role](#role) for this menu item. Mac only for now. | - -### Accelerator - -Accelerators (sometimes called keyboard shortcuts) define a binding between a keystroke and a menu item. Wails defines an Accelerator as a combination or key + [Modifier](#modifier). They are available in the `"github.com/wailsapp/wails/v2/pkg/menu/keys"` package. - -Example: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" - // Defines cmd+o on Mac and ctrl-o on Window/Linux - myShortcut := keys.CmdOrCtrl("o") -``` - -Keys are any single character on a keyboard with the exception of `+`, which is defined as `plus`. Some keys cannot be represented as characters so there are a set of named characters that may be used: - -- `backspace` -- `tab` -- `return` -- `enter` -- `escape` -- `left` -- `right` -- `up` -- `down` -- `space` -- `delete` -- `home` -- `end` -- `page up` -- `page down` -- `f1` -- `f2` -- `f3` -- `f4` -- `f5` -- `f6` -- `f7` -- `f8` -- `f9` -- `f10` -- `f11` -- `f12` -- `f13` -- `f14` -- `f15` -- `f16` -- `f17` -- `f18` -- `f19` -- `f20` -- `f21` -- `f22` -- `f23` -- `f24` -- `f25` -- `f26` -- `f27` -- `f28` -- `f29` -- `f30` -- `f31` -- `f32` -- `f33` -- `f34` -- `f35` -- `numlock` - -Wails also supports parsing accelerators using the same syntax as Electron. This is useful for storing accelerators in config files. - -Example: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" - // Defines cmd+o on Mac and ctrl-o on Window/Linux - myShortcut, err := keys.Parse("Ctrl+Option+A") -``` - -#### Modifier - -The following modifiers are keys that may be used in combination with the accelerator key: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" -const ( - // CmdOrCtrlKey represents Command on Mac and Control on other platforms - CmdOrCtrlKey Modifier = "cmdorctrl" - // OptionOrAltKey represents Option on Mac and Alt on other platforms - OptionOrAltKey Modifier = "optionoralt" - // ShiftKey represents the shift key on all systems - ShiftKey Modifier = "shift" - // ControlKey represents the control key on all systems - ControlKey Modifier = "ctrl" -) -``` - -A number of helper methods are available to create Accelerators using modifiers: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" -func CmdOrCtrl(key string) *Accelerator -func OptionOrAlt(key string) *Accelerator -func Shift(key string) *Accelerator -func Control(key string) *Accelerator -``` - -Modifiers can be combined using `keys.Combo(key string, modifier1 Modifier, modifier2 Modifier, rest ...Modifier)`: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" - // Defines "Ctrl+Option+A" on Mac and "Ctrl+Alt+A" on Window/Linux - myShortcut := keys.Combo("a", ControlKey, OptionOrAltKey) -``` - -### Type - -Each menu item must have a type and there are 5 types available: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -const ( - TextType Type = "Text" - SeparatorType Type = "Separator" - SubmenuType Type = "Submenu" - CheckboxType Type = "Checkbox" - RadioType Type = "Radio" -) -``` - -For convenience, helper methods are provided to quickly create a menu item: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -func Text(label string, accelerator *keys.Accelerator, click Callback) *MenuItem -func Separator() *MenuItem -func Radio(label string, selected bool, accelerator *keys.Accelerator, click Callback) *MenuItem -func Checkbox(label string, checked bool, accelerator *keys.Accelerator, click Callback) *MenuItem -func SubMenu(label string, menu *Menu) *Menu -``` - -You can also create menu items directly on a menu by using the "Add" helpers: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -func (m *Menu) AddText(label string, accelerator *keys.Accelerator, click Callback) *MenuItem -func (m *Menu) AddSeparator() *MenuItem -func (m *Menu) AddRadio(label string, selected bool, accelerator *keys.Accelerator, click Callback) *MenuItem -func (m *Menu) AddCheckbox(label string, checked bool, accelerator *keys.Accelerator, click Callback) *MenuItem -func (m *Menu) AddSubMenu(label string, menu *Menu) *MenuI -``` - -A note on radio groups: A radio group is defined as a number of radio menu items that are next to each other in the menu. This means that you do not need to group items together as it is automatic. However, that also means you cannot have 2 radio groups next to each other - there must be a non-radio item between them. - -### Callback - -Each menu item may have a callback that is executed when the item is clicked: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -type Callback func(*CallbackData) - -type CallbackData struct { - MenuItem *MenuItem -} -``` - -The function is given a `CallbackData` struct which indicates which menu item triggered the callback. This is useful when using radio groups that may share a callback. - -### Role - -:::info Roles - -Roles are currently supported on Mac only. - -::: - -A menu item may have a role, which is essentially a pre-defined menu item. We currently support the following roles: - -| Role | Description | -| ------------ | ------------------------------------------------------------------------ | -| AppMenuRole | The standard Mac application menu. Can be created using `menu.AppMenu()` | -| EditMenuRole | The standard Mac edit menu. Can be created using `menu.EditMenu()` | diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/options.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/options.mdx deleted file mode 100644 index 7bafbc0fa..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/options.mdx +++ /dev/null @@ -1,633 +0,0 @@ ---- -sidebar_position: 3 ---- - -# Options - -## Application Options - -The `Options.App` struct contains the application configuration. It is passed to the `wails.Run()` method: - -```go title="Example" -import "github.com/wailsapp/wails/v2/pkg/options" - -func main() { - - err := wails.Run(&options.App{ - Title: "Menus Demo", - Width: 800, - Height: 600, - DisableResize: false, - Fullscreen: false, - Frameless: true, - MinWidth: 400, - MinHeight: 400, - MaxWidth: 1280, - MaxHeight: 1024, - StartHidden: false, - HideWindowOnClose: false, - BackgroundColour: &options.RGBA{R: 0, G: 0, B: 0, A: 255}, - AlwaysOnTop: false, - Assets: assets, - AssetsHandler: assetsHandler, - Menu: app.applicationMenu(), - Logger: nil, - LogLevel: logger.DEBUG, - LogLevelProduction: logger.ERROR, - OnStartup: app.startup, - OnDomReady: app.domready, - OnShutdown: app.shutdown, - OnBeforeClose: app.beforeClose, - WindowStartState: options.Maximised, - CSSDragProperty: "--wails-draggable", - CSSDragValue: "drag", - Bind: []interface{}{ - app, - }, - Windows: &windows.Options{ - WebviewIsTransparent: false, - WindowIsTranslucent: false, - DisableWindowIcon: false, - DisableFramelessWindowDecorations: false, - WebviewUserDataPath: "", - WebviewBrowserPath: "", - Theme: windows.SystemDefault, - CustomTheme: &windows.ThemeSettings{ - DarkModeTitleBar: windows.RGB(20, 20, 20), - DarkModeTitleText: windows.RGB(200, 200, 200), - DarkModeBorder: windows.RGB(20, 0, 20), - LightModeTitleBar: windows.RGB(200, 200, 200), - LightModeTitleText: windows.RGB(20, 20, 20), - LightModeBorder: windows.RGB(200, 200, 200), - }, - // User messages that can be customised - Messages *windows.Messages - }, - Mac: &mac.Options{ - TitleBar: &mac.TitleBar{ - TitlebarAppearsTransparent: true, - HideTitle: false, - HideTitleBar: false, - FullSizeContent: false, - UseToolbar: false, - HideToolbarSeparator: true, - }, - Appearance: mac.NSAppearanceNameDarkAqua, - WebviewIsTransparent: true, - WindowIsTranslucent: false, - About: &mac.AboutInfo{ - Title: "My Application", - Message: "© 2021 Me", - Icon: icon, - }, - }, - Linux: &linux.Options{ - Icon: icon, - }, - }) - if err != nil { - log.Fatal(err) - } -} - -``` - -### Title - -The text shown in the window's title bar. - -Type: `string` - -### Width - -The initial width of the window. - -Type: `int`
Default: 1024. - -### Height - -The initial height of the window. - -Type: `int`
Default: 768 - -### DisableResize - -By default, the main window is resizable. Setting this to `true` will keep it a fixed size. - -Type: `bool` - -### Fullscreen - -Setting this to `true` will make the window fullscreen at startup. - -Type: `bool` - -### Frameless - -When set to `true`, the window will have no borders or title bar. Also see [Frameless Windows](../guides/frameless.mdx). - -Type: `bool` - -### MinWidth - -This sets the minimum width for the window. If the value given in `Width` is less than this value, the window will be set to `MinWidth` by default. - -Type: `int` - -### MinHeight - -This sets the minimum height for the window. If the value given in `Height` is less than this value, the window will be set to `MinHeight` by default. - -Type: `int` - -### MaxWidth - -This sets the maximum width for the window. If the value given in `Width` is more than this value, the window will be set to `MaxWidth` by default. - -Type: `int` - -### MaxHeight - -This sets the maximum height for the window. If the value given in `Height` is more than this value, the window will be set to `MaxHeight` by default. - -Type: `int` - -### StartHidden - -When set to `true`, the application will be hidden until [WindowShow](../reference/runtime/window.mdx#windowshow) is called. - -Type: `bool` -### HideWindowOnClose - -By default, closing the window will close the application. Setting this to `true` means closing the window will - -hide the window instead. - -Type: `bool` - -### BackgroundColour - -This value is the default background colour of the window. Example: options.NewRGBA(255,0,0,128) - Red at 50% transparency - -Type: `*options.RGBA`
Default: white - -### AlwaysOnTop - -Indicates that the window should stay above other windows when losing focus. - -Type: `bool` - -### Assets - -The frontend assets to be used by the application. Requires an `index.html` file. - -Type: `embed.FS` - -### AssetsHandler - - - -The assets handler is a generic `http.Handler` which will be called for any non GET request on the assets server and for GET requests which can not be served from the `assets` because the file is not found. - -| Value | Win | Mac | Lin | -| ----------------------- | --- | --- | --- | -| GET | ✅ | ✅ | ✅ | -| POST | ✅ | ✅ | ❌ | -| PUT | ✅ | ✅ | ❌ | -| PATCH | ✅ | ✅ | ❌ | -| DELETE | ✅ | ✅ | ❌ | -| Request Headers | ✅ | ✅ | ❌ | -| Request Body | ✅ | ✅ | ❌ | -| Request Body Streaming | ❌ | ❌ | ❌ | -| Response StatusCodes | ✅ | ✅ | ❌ | -| Response Headers | ✅ | ✅ | ❌ | -| Response Body | ✅ | ✅ | ✅ | -| Response Body Streaming | ❌ | ❌ | ✅ | - -NOTE: Linux is currently very limited due to targeting a WebKit2GTK Version < 2.36.0. In the future some features will be supported by the introduction of WebKit2GTK 2.36.0+ support. - -NOTE: When used in combination with a Frontend DevServer there might be limitations, eg. Vite serves the index.html on every path, that does not contain a file extension. - -Type: `http.Handler` - -### Menu - -The menu to be used by the application. More details about Menus in the [Menu Reference](../reference/runtime/menu.mdx). - -:::note -On Mac, if no menu is specified, a default menu will be created. -::: - -Type: `*menu.Menu` - -### Logger - -The logger to be used by the application. More details about logging in the [Log Reference](../reference/runtime/log.mdx). - -Type: `logger.Logger`
Default: Logs to Stdout - -### LogLevel - -The default log level. More details about logging in the [Log Reference](../reference/runtime/log.mdx). - -Type: `logger.LogLevel`
Default: `Info` in dev mode, `Error` in production mode - -### LogLevelProduction - -The default log level for production builds. More details about logging in the [Log Reference](../reference/runtime/log.mdx). - -Type: `logger.LogLevel`
Default: `Error` - -### OnStartup - -This callback is called after the frontend has been created, but before `index.html` has been loaded. It is given the application context. - -Type: `func(ctx context.Context)` - -### OnDomReady - -This callback is called after the frontend has loaded `index.html` and its resources. It is given the application context. - -Type: `func(ctx context.Context)` - -### OnShutdown - -This callback is called after the frontend has been destroyed, just before the application terminates. It is given the application context. - -Type: `func(ctx context.Context)` - -### OnBeforeClose - -If this callback is set, it will be called when the application is about to quit, either by clicking the window close button or calling `runtime.Quit`. Returning true will cause the application to continue, false will continue shutdown as normal. This is good for confirming with the user that they wish to exit the program. - -Example: - -```go title=windowsapp.go -func (b *App) beforeClose(ctx context.Context) (prevent bool) { - dialog, err := runtime.MessageDialog(ctx, runtime.MessageDialogOptions{ - Title: "Quit?", - Message: "Are you sure you want to quit?", - - Type: ` runtime`.QuestionDialog, - - }) - - if err != nil { - return false - } - return dialog != "Yes" -} -``` - -Type: `func(ctx context.Context) bool` - -### WindowStartState - -Defines how the window should present itself at startup. - -| Value | Win | Mac | Lin | -| ---------- | --- | --- | --- | -| Fullscreen | ✅ | ✅ | ✅ | -| Maximised | ✅ | ✅ | ✅ | -| Minimised | ✅ | ❌ | ✅ | - -Type: `options.WindowStartState` - -### CSSDragProperty - -Indicates the CSS property to use to identify which elements can be used to drag the window. Default: `--wails-draggable`. - -Type: `string` - -### CSSDragValue - -Indicates what value the `CSSDragProperty` style should have to drag the window. Default: `drag`. - -Type: `string` - -### Bind - -A slice of struct instances defining methods that need to be bound to the frontend. - -Type: `[]interface{}` - -### Windows - -This defines [Windows specific options](#windows-specific-options). - -Type: `*windows.Options` - -### Mac - -This defines [Mac specific options](#mac-specific-options). - -Type: `*mac.Options` - -### Linux - -This defines [Linux specific options](#linux-specific-options). - -Type: `*linux.Options` - -## Windows Specific Options - -### WebviewIsTransparent - -Setting this to `true` will make the webview background transparent when an alpha value of `0` is used. This means that if you use `rgba(0,0,0,0)` for `background-color` in your CSS, the host window will show through. Often combined with [WindowIsTranslucent](#WindowIsTranslucent) to make frosty-looking applications. - -Type: `bool` - -### WindowIsTranslucent - -Setting this to `true` will make the window background translucent. Often combined with [WebviewIsTransparent](#WebviewIsTransparent) to make frosty-looking applications. - -Type: `bool` - -### DisableWindowIcon - -Setting this to `true` will remove the icon in the top left corner of the title bar. - -Type: `bool` - -### DisableFramelessWindowDecorations - -Setting this to `true` will remove the window decorations in [Frameless](#Frameless) mode. This means there will be no 'Aero Shadow' and no 'Rounded Corners' shown for the window. Please note that 'Rounded Corners' are only supported on Windows 11. - -Type: `bool` - -### WebviewUserDataPath - -This defines the path where the WebView2 stores the user data. If empty `%APPDATA%\[BinaryName.exe]` will be used. - -Type: `string` - -### WebviewBrowserPath - -This defines the path to a directory with WebView2 executable files and libraries. If empty, webview2 installed in the system will be used. - -Important information about distribution of fixed version runtime: - -- [How to get and extract runtime](https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution#details-about-the-fixed-version-runtime-distribution-mode) -- [Known issues for fixed version](https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution#known-issues-for-fixed-version) -- [The path of fixed version of the WebView2 Runtime should not contain \Edge\Application\.](https://docs.microsoft.com/en-us/microsoft-edge/webview2/reference/win32/webview2-idl?view=webview2-1.0.1245.22#createcorewebview2environmentwithoptions) - -Type: `string` - -### Theme - -Minimum Windows Version: Windows 10 2004/20H1 - -This defines the theme that the application should use: - -| Value | Description | -| ------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | -| SystemDefault | _Default_. The theme will be based on the system default. If the user changes their theme, the application will update to use the new setting | -| Dark | The application will use a dark theme exclusively | -| Light | The application will use a light theme exclusively | - -Type: `windows.Theme` - -### CustomTheme - -:::note -Minimum Windows Version: Windows 10/11 2009/21H2 Build 22000 -::: - -Allows you to specify custom colours for TitleBar, TitleText and Border for both light and dark mode, as well as when the window is active or inactive. - -Type: `windows.CustomTheme` - -#### CustomTheme Type - -The CustomTheme struct uses `int32` to specify the colour values. These are in the standard(!) Windows format of: `0x00BBGGAA`. A helper function is provided to do RGB conversions into this format: `windows.RGB(r,g,b uint8)`. - -NOTE: Any value not provided will default to black. - -```go -type ThemeSettings struct { - DarkModeTitleBar int32 - DarkModeTitleBarInactive int32 - DarkModeTitleText int32 - DarkModeTitleTextInactive int32 - DarkModeBorder int32 - DarkModeBorderInactive int32 - LightModeTitleBar int32 - LightModeTitleBarInactive int32 - LightModeTitleText int32 - LightModeTitleTextInactive int32 - LightModeBorder int32 - LightModeBorderInactive int32 -} -``` - -Example: - -```go - CustomTheme: &windows.ThemeSettings{ - // Theme to use when window is active - DarkModeTitleBar: windows.RGB(255, 0, 0), // Red - DarkModeTitleText: windows.RGB(0, 255, 0), // Green - DarkModeBorder: windows.RGB(0, 0, 255), // Blue - LightModeTitleBar: windows.RGB(200, 200, 200), - LightModeTitleText: windows.RGB(20, 20, 20), - LightModeBorder: windows.RGB(200, 200, 200), - // Theme to use when window is inactive - DarkModeTitleBarInactive: windows.RGB(128, 0, 0), - DarkModeTitleTextInactive: windows.RGB(0, 128, 0), - DarkModeBorderInactive: windows.RGB(0, 0, 128), - LightModeTitleBarInactive: windows.RGB(100, 100, 100), - LightModeTitleTextInactive: windows.RGB(10, 10, 10), - LightModeBorderInactive: windows.RGB(100, 100, 100), - }, -``` - -### Messages - -A struct of strings used by the webview2 installer if a valid webview2 runtime is not found. - -Type: `*windows.Messages` - -Customise this for any language you choose to support. - -### ResizeDebounceMS - -ResizeDebounceMS is the amount of time to debounce redraws of webview2 when resizing the window. The default value (0) will perform redraws as fast as it can. - -Type: `uint16` - -### OnSuspend - -If set, this function will be called when windows initiates a switch to low power mode (suspend/hibernate) - -Type: `func()` - -### OnResume - -If set, this function will be called when windows resumes from low power mode (suspend/hibernate) - -Type: `func()` - -## Mac Specific Options - -### TitleBar - -The TitleBar struct provides the ability to configure the look and feel of the title bar. - -Type: [`*mac.TitleBar`](#titlebar-struct) - - -### Appearance - -Appearance is used to set the style of your app in accordance with Apple's [NSAppearance](https://developer.apple.com/documentation/appkit/nsappearancename?language=objc) names. - -Type: [`AppearanceType`](#appearance-type) - -### WebviewIsTransparent - -Setting this to `true` will make the webview background transparent when an alpha value of `0` is used. This means that if you use `rgba(0,0,0,0)` for `background-color` in your CSS, the host window will show through. Often combined with [WindowIsTranslucent](#WindowIsTranslucent) to make frosty-looking applications. - -Type: `bool` - -### WindowIsTranslucent - -Setting this to `true` will make the window background translucent. Often combined with [WebviewIsTransparent](#WebviewIsTransparent) to make frosty-looking applications. - -Type: `bool` - -### About - -This configuration lets you set the title, message and icon for the "About" menu item in the app menu created by the "AppMenu" role. - -Type: [`About`](#about-struct) - - -#### Titlebar struct - -The titlebar of the application can be customised by using the TitleBar options: - -```go -type TitleBar struct { - TitlebarAppearsTransparent bool - HideTitle bool - HideTitleBar bool - FullSizeContent bool - UseToolbar bool - HideToolbarSeparator bool -} -``` - -| Name | Description | -| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| TitlebarAppearsTransparent | Makes the titlebar transparent. This has the effect of hiding the titlebar and the content fill the window. [Apple Docs](https://developer.apple.com/documentation/appkit/nswindow/1419167-titlebarappearstransparent?language=objc) | -| HideTitle | Hides the title of the window. [Apple Docs](https://developer.apple.com/documentation/appkit/nswindowtitlevisibility?language=objc) | -| HideTitleBar | Removes [NSWindowStyleMaskTitled](https://developer.apple.com/documentation/appkit/nswindowstylemask/nswindowstylemasktitled/) from the style mask | -| FullSizeContent | Makes the webview fill the entire window. [Apple Docs](https://developer.apple.com/documentation/appkit/nswindowstylemask/nswindowstylemaskfullsizecontentview) | -| UseToolbar | Adds a default toolbar to the window. [Apple Docs](https://developer.apple.com/documentation/appkit/nstoolbar?language=objc) | -| HideToolbarSeparator | Removes the line beneath the toolbar. [Apple Docs](https://developer.apple.com/documentation/appkit/nstoolbar/1516954-showsbaselineseparator?language=objc) | - -Preconfigured titlebar settings are available: - -| Setting | Example | -| --------------------------- | ---------------------------------------------- | -| `mac.TitleBarDefault()` | ![](/img/reference/titlebar-default.webp) | -| `mac.TitleBarHidden()` | ![](/img/reference/titlebar-hidden.webp) | -| `mac.TitleBarHiddenInset()` | ![](/img/reference/titlebar-hidden-inset.webp) | - -Example: - -```go -Mac: &mac.Options{ - TitleBar: mac.TitleBarHiddenInset(), -} -``` - -Click [here](https://github.com/lukakerr/NSWindowStyles) for some inspiration on customising the titlebar. - -#### Appearance type - -You can specify the application's [appearance](https://developer.apple.com/documentation/appkit/nsappearance?language=objc). - -| Value | Description | -| ----------------------------------------------------- | --------------------------------------------------------------- | -| DefaultAppearance | DefaultAppearance uses the default system value | -| NSAppearanceNameAqua | The standard light system appearance | -| NSAppearanceNameDarkAqua | The standard dark system appearance | -| NSAppearanceNameVibrantLight | The light vibrant appearance | -| NSAppearanceNameAccessibilityHighContrastAqua | A high-contrast version of the standard light system appearance | -| NSAppearanceNameAccessibilityHighContrastDarkAqua | A high-contrast version of the standard dark system appearance | -| NSAppearanceNameAccessibilityHighContrastVibrantLight | A high-contrast version of the light vibrant appearance | -| NSAppearanceNameAccessibilityHighContrastVibrantDark | A high-contrast version of the dark vibrant appearance | - -Example: - -```go -Mac: &mac.Options{ - Appearance: mac.NSAppearanceNameDarkAqua, -} -``` - -#### About struct - -```go -type AboutInfo struct { - Title string - Message string - Icon []byte -} -``` - -If these settings are provided, an "About" menu item will appear in the app menu (when using the `AppMenu` role). Given this configuration: - -```go -//go:embed build/appicon.png -var icon []byte - -func main() { - err := wails.Run(&options.App{ - ... - Mac: &mac.Options{ - About: &mac.AboutInfo{ - Title: "My Application", - Message: "© 2021 Me", - Icon: icon, - }, - }, - }) -``` - -The "About" menu item will appear in the app menu: - -
- -
- -
- -When clicked, that will open an about message box: - -
- -
- -
- -## Linux Specific Options - -### Icon - -Sets up the icon representing the window. This icon is used when the window is minimized (also known as iconified). - -Type: `[]byte` - -Some window managers or desktop environments may also place it in the window frame, or display it in other contexts. On others, the icon is not used at all, so your mileage may vary. - -NOTE: Gnome on Wayland at least does not display this icon. To have a application icon there, a `.desktop` file has to be used. On KDE it should work. - -The icon should be provided in whatever size it was naturally drawn; that is, don’t scale the image before passing it. Scaling is postponed until the last minute, when the desired final size is known, to allow best quality. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/project-config.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/project-config.mdx deleted file mode 100644 index 3dc1cf002..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/project-config.mdx +++ /dev/null @@ -1,51 +0,0 @@ ---- -sidebar_position: 5 ---- - -# Project Config - -The project config resides in the `wails.json` file in the project directory. The structure of the config is: - -```json -{ - "name": "[The project name]", - "assetdir": "[Relative path to the directory containing the compiled assets, this is normally inferred and could be left empty]", - "reloaddirs": "[Additional directories to trigger reloads (comma separated), this is only used for some advanced asset configurations]", - "frontend:install": "[The command to install node dependencies, run in the frontend directory - often `npm install`]", - "frontend:build": "[The command to build the assets, run in the frontend directory - often `npm run build`]", - "frontend:dev": "[This command has been replaced by frontend:dev:build. If frontend:dev:build is not specified will falls back to this command. If this command is also not specified will falls back to frontend:build]", - "frontend:dev:build": "[This command is the dev equivalent of frontend:build. If not specified falls back to frontend:dev]", - "frontend:dev:install": "[This command is the dev equivalent of frontend:install. If not specified falls back to frontend:install]", - "frontend:dev:watcher": "[This command is run in a separate process on `wails dev`. Useful for 3rd party watchers or starting 3d party dev servers]", - "frontend:dev:serverUrl": "[URL to a 3rd party dev server to be used to serve assets, EG Vite. If this is set to 'auto' then the devServerUrl will be inferred from the Vite output]", - "wailsjsdir": "[Relative path to the directory that the auto-generated JS modules will be created]", - "version": "[Project config version]", - "outputfilename": "[The name of the binary]", - "debounceMS": 100, // The default time the dev server waits to reload when it detects a change in assets - "devServer": "[Address to bind the wails dev sever to. Default: localhost:34115]", - "appargs": "[Arguments passed to the application in shell style when in dev mode]", - "runNonNativeBuildHooks": false, // Defines if build hooks should be run though they are defined for an OS other than the host OS. - "preBuildHooks": { - "GOOS/GOARCH": "[The command that will be executed before a build of the specified GOOS/GOARCH: ${platform} is replaced with the "GOOS/GOARCH". The "GOOS/GOARCH" hook is executed before the "GOOS/*" and "*/*" hook.]", - "GOOS/*": "[The command that will be executed before a build of the specified GOOS: ${platform} is replaced with the "GOOS/GOARCH". The "GOOS/*" hook is executed before the "*/*" hook.]", - "*/*": "[The command that will be executed before every build: ${platform} is replaced with the "GOOS/GOARCH".]" - }, - "postBuildHooks": { - "GOOS/GOARCH": "[The command that will be executed after a build of the specified GOOS/GOARCH: ${platform} is replaced with the "GOOS/GOARCH" and ${bin} with the path to the compiled binary. The "GOOS/GOARCH" hook is executed before the "GOOS/*" and "*/*" hook.]", - "GOOS/*": "[The command that will be executed after a build of the specified GOOS: ${platform} is replaced with the "GOOS/GOARCH" and ${bin} with the path to the compiled binary. The "GOOS/*" hook is executed before the "*/*" hook.]", - "*/*": "[The command that will be executed after every build: ${platform} is replaced with the "GOOS/GOARCH" and ${bin} with the path to the compiled binary.]" - }, - "info": { // Data used to populate manifests and version info. - "companyName": "[The company name. Default: [The project name]]", - "productName": "[The product name. Default: [The project name]]", - "productVersion": "[The version of the product. Default: '1.0.0']", - "copyright": "[The copyright of the product. Default: 'Copyright.........']", - "comments": "[A short comment of the app. Default: 'Built using Wails (https://wails.app)']" - }, - "nsisType": "['multiple': One installer per architecture. 'single': Single universal installer for all architectures being built. Default: 'multiple']" -} -``` - -This file is read by the Wails CLI when running `wails build` or `wails dev`. - -The `assetdir`, `reloaddirs`, `wailsjsdir`, `debounceMS`, `devserver` and `frontenddevserverurl` flags in `wails build/dev` will update the project config and thus become defaults for subsequent runs. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/_category_.json b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/_category_.json deleted file mode 100644 index ac6d55488..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Runtime", - "position": 1 -} diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/browser.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/browser.mdx deleted file mode 100644 index 976ca1d80..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/browser.mdx +++ /dev/null @@ -1,14 +0,0 @@ ---- -sidebar_position: 7 ---- - -# Browser - -These methods are related to the system browser. - -### BrowserOpenURL - -Opens the given URL in the system browser. - -Go: `BrowserOpenURL(ctx context.Context, url string)`
JS: `BrowserOpenURL(url string)` - diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/dialog.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/dialog.mdx deleted file mode 100644 index ad65257ee..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/dialog.mdx +++ /dev/null @@ -1,283 +0,0 @@ ---- -sidebar_position: 5 ---- - -# Dialog - -This part of the runtime provides access to native dialogs, such as File Selectors and Message boxes. - -:::info Javascript -Dialog is currently unsupported in the JS runtime. -::: - -### OpenDirectoryDialog - -Opens a dialog that prompts the user to select a directory. Can be customised using [OpenDialogOptions](#opendialogoptions). - -Go: `OpenDirectoryDialog(ctx context.Context, dialogOptions OpenDialogOptions) (string, error)` - -Returns: Selected directory (blank if the user cancelled) or an error - -### OpenFileDialog - -Opens a dialog that prompts the user to select a file. Can be customised using [OpenDialogOptions](#opendialogoptions). - -Go: `OpenFileDialog(ctx context.Context, dialogOptions OpenDialogOptions) (string, error)` - -Returns: Selected file (blank if the user cancelled) or an error - -### OpenMultipleFilesDialog - -Opens a dialog that prompts the user to select multiple files. Can be customised using [OpenDialogOptions](#opendialogoptions). - -Go: `OpenMultipleFilesDialog(ctx context.Context, dialogOptions OpenDialogOptions) ([]string, error)` - -Returns: Selected files (nil if the user cancelled) or an error - -### SaveFileDialog - -Opens a dialog that prompts the user to select a filename for the purposes of saving. Can be customised using [SaveDialogOptions](#savedialogoptions). - -Go: `SaveFileDialog(ctx context.Context, dialogOptions SaveDialogOptions) (string, error)` - -Returns: The selected file (blank if the user cancelled) or an error - -### MessageDialog - -Displays a message using a message dialog. Can be customised using [MessageDialogOptions](#messagedialogoptions). - -Go: `MessageDialog(ctx context.Context, dialogOptions MessageDialogOptions) (string, error)` - -Returns: The text of the selected button or an error - -## Options - -### OpenDialogOptions - -```go -type OpenDialogOptions struct { - DefaultDirectory string - DefaultFilename string - Title string - Filters []FileFilter - ShowHiddenFiles bool - CanCreateDirectories bool - ResolvesAliases bool - TreatPackagesAsDirectories bool -} -``` - -| Field | Description | Win | Mac | Lin | -| -------------------------- | ---------------------------------------------- | --- | --- | --- | -| DefaultDirectory | The directory the dialog will show when opened | ✅ | ✅ | ✅ | -| DefaultFilename | The default filename | ✅ | ✅ | ✅ | -| Title | Title for the dialog | ✅ | ✅ | ✅ | -| [Filters](#filefilter) | A list of file filters | ✅ | ✅ | ✅ | -| ShowHiddenFiles | Show files hidden by the system | | ✅ | ✅ | -| CanCreateDirectories | Allow user to create directories | | ✅ | | -| ResolvesAliases | If true, returns the file not the alias | | ✅ | | -| TreatPackagesAsDirectories | Allow navigating into packages | | ✅ | | - -### SaveDialogOptions - -```go -type SaveDialogOptions struct { - DefaultDirectory string - DefaultFilename string - Title string - Filters []FileFilter - ShowHiddenFiles bool - CanCreateDirectories bool - TreatPackagesAsDirectories bool -} -``` - -| Field | Description | Win | Mac | Lin | -| -------------------------- | ---------------------------------------------- | --- | --- | --- | -| DefaultDirectory | The directory the dialog will show when opened | ✅ | ✅ | ✅ | -| DefaultFilename | The default filename | ✅ | ✅ | ✅ | -| Title | Title for the dialog | ✅ | ✅ | ✅ | -| [Filters](#filefilter) | A list of file filters | ✅ | ✅ | ✅ | -| ShowHiddenFiles | Show files hidden by the system | | ✅ | ✅ | -| CanCreateDirectories | Allow user to create directories | | ✅ | | -| TreatPackagesAsDirectories | Allow navigating into packages | | ✅ | | - -### MessageDialogOptions - -```go -type MessageDialogOptions struct { - Type DialogType - Title string - Message string - Buttons []string - DefaultButton string - CancelButton string -} -``` - -| Field | Description | Win | Mac | Lin | -| ------------- | ------------------------------------------------------------------------- | --- | --- | --- | -| Type | The type of message dialog, eg question, info... | ✅ | ✅ | ✅ | -| Title | Title for the dialog | ✅ | ✅ | ✅ | -| Message | The message to show the user | ✅ | ✅ | ✅ | -| Buttons | A list of button titles | | ✅ | | -| DefaultButton | The button with this text should be treated as default. Bound to `return` | | ✅ | | -| CancelButton | The button with this text should be treated as cancel. Bound to `escape` | | ✅ | | - -#### Windows - -Windows has standard dialog types in which the buttons are not customisable. The value returned will be one of: "Ok", "Cancel", "Abort", "Retry", "Ignore", "Yes", "No", "Try Again" or "Continue" - -#### Linux - -Linux has standard dialog types in which the buttons are not customisable. The value returned will be one of: "Ok", "Cancel", "Yes", "No" - -#### Mac - -A message dialog on Mac may specify up to 4 buttons. If no `DefaultButton` or `CancelButton` is given, the first button is considered default and is bound to the `return` key. - -For the following code: - -```go -selection, err := runtime.MessageDialog(b.ctx, runtime.MessageDialogOptions{ - Title: "It's your turn!", - Message: "Select a number", - Buttons: []string{"one", "two", "three", "four"}, -}) -``` - -the first button is shown as default: - -
- -
- -
- -And if we specify `DefaultButton` to be "two": - -```go -selection, err := runtime.MessageDialog(b.ctx, runtime.MessageDialogOptions{ - Title: "It's your turn!", - Message: "Select a number", - Buttons: []string{"one", "two", "three", "four"}, - DefaultButton: "two", -}) -``` - -the second button is shown as default. When `return` is pressed, the value "two" is returned. - -
- -
- -
- -If we now specify `CancelButton` to be "three": - -```go -selection, err := runtime.MessageDialog(b.ctx, runtime.MessageDialogOptions{ - Title: "It's your turn!", - Message: "Select a number", - Buttons: []string{"one", "two", "three", "four"}, - DefaultButton: "two", - CancelButton: "three", -}) -``` - -the button with "three" is shown at the bottom of the dialog. When `escape` is pressed, the value "three" is returned: - -
- -
- -
-
-
- -#### DialogType - -```go -const ( - InfoDialog DialogType = "info" - WarningDialog DialogType = "warning" - ErrorDialog DialogType = "error" - QuestionDialog DialogType = "question" - ) -``` - -### FileFilter - -```go -type FileFilter struct { - DisplayName string // Filter information EG: "Image Files (*.jpg, *.png)" - Pattern string // semi-colon separated list of extensions, EG: "*.jpg;*.png" -} -``` - -#### Windows - -Windows allows you to use multiple file filters in dialog boxes. Each FileFilter will show up as a separate entry in the dialog: - -
- -
- -
-
-
- -#### Linux - -Linux allows you to use multiple file filters in dialog boxes. Each FileFilter will show up as a separate entry in the dialog: - -
- -
- -
-
-
- -#### Mac - -Mac dialogs only have the concept of a single set of patterns to filter files. If multiple FileFilters are provided, Wails will use all the Patterns defined. - -Example: - -```go - selection, err := runtime.OpenFileDialog(b.ctx, runtime.OpenDialogOptions{ - Title: "Select File", - Filters: []runtime.FileFilter{ - { - DisplayName: "Images (*.png;*.jpg)", - Pattern: "*.png;*.jpg", - }, { - DisplayName: "Videos (*.mov;*.mp4)", - Pattern: "*.mov;*.mp4", - }, - }, - }) -``` - -This will result in the Open File dialog using `*.png,*.jpg,*.mov,*.mp4` as a filter. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/events.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/events.mdx deleted file mode 100644 index 75e8b0a50..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/events.mdx +++ /dev/null @@ -1,38 +0,0 @@ ---- -sidebar_position: 2 ---- - -# Events - -The Wails runtime provides a unified events system, where events can be emitted or received by either Go or Javascript. Optionally, data may be passed with the events. Listeners will receive the data in the local data types. - -### EventsOn - -This method sets up a listener for the given event name. When an event of type `eventName` is [emitted](#EventsEmit), the callback is triggered. Any additional data sent with the emitted event will be passed to the callback. - -Go: `EventsOn(ctx context.Context, eventName string, callback func(optionalData ...interface{}))`
JS: `EventsOn(eventName string, callback function(optionalData?: any))` - -### EventsOff - -This method unregisters the listener for the given event name, optionally multiple listeneres can be unregistered via `additionalEventNames`. - -Go: `EventsOff(ctx context.Context, eventName string, additionalEventNames ...string)`
JS: `EventsOff(eventName string, ...additionalEventNames)` - -### EventsOnce - -This method sets up a listener for the given event name, but will only trigger once. - -Go: `EventsOnce(ctx context.Context, eventName string, callback func(optionalData ...interface{}))`
JS: `EventsOnce(eventName string, callback function(optionalData?: any))` - -### EventsOnMultiple - -This method sets up a listener for the given event name, but will only trigger a maximum of `counter` times. - -Go: `EventsOnMultiple(ctx context.Context, eventName string, callback func(optionalData ...interface{}), counter int)`
JS: `EventsOnMultiple(eventName string, callback function(optionalData?: any), counter int)` - -### EventsEmit - -This method emits the given event. Optional data may be passed with the event. This will trigger any event listeners. - -Go: `EventsEmit(ctx context.Context, eventName string, optionalData ...interface{})`
JS: `EventsEmit(ctx context, optionalData function(optionalData?: any))` - diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/intro.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/intro.mdx deleted file mode 100644 index 6c02c71cd..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/intro.mdx +++ /dev/null @@ -1,73 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Introduction - -The runtime is a library that provides utility methods for your application. There is both a Go and Javascript runtime and the aim is to try and keep them at parity where possible. - -It has utility methods for: - -- [Window](window.mdx) -- [Menu](menu.mdx) -- [Dialog](dialog.mdx) -- [Events](events.mdx) -- [Browser](browser.mdx) -- [Log](log.mdx) - -The Go Runtime is available through importing `github.com/wailsapp/wails/v2/pkg/runtime`. All methods in this package take a context as the first parameter. This context should be obtained from the [OnStartup](../options.mdx#onstartup) or [OnDomReady](../options.mdx#ondomready) hooks. - -:::info Note - -Whilst the context will be provided to the [OnStartup](../options.mdx#onstartup) method, there's no guarantee the runtime will work in this method as the window is initialising in a different thread. If you wish to call runtime methods at startup, use [OnDomReady](../options.mdx#ondomready). - -::: - -The Javascript library is available to the frontend via the `window.runtime` map. There is a runtime package generated when using `dev` mode that provides Typescript declarations for the runtime. This should be located in the `wailsjs` directory in your frontend directory. - -### Hide - -Go: `Hide(ctx context.Context)`
JS: `Hide()` - -Hides the application. - -:::info Note On Mac, this will hide the application in the same way as the `Hide` menu item in standard Mac applications. This is different to hiding the window, but the application still being in the foreground. For Windows and Linux, this is currently the same as `WindowHide`. ::: - -### Show - -Shows the application. - -:::info Note On Mac, this will bring the application back into the foreground. For Windows and Linux, this is currently the same as `WindowShow`. ::: - -Go: `Show(ctx context.Context)`
JS: `Show()` - -### Quit - -Quits the application. - -Go: `Quit(ctx context.Context)`
JS: `Quit()` - -### Environment - -Returns details of the current environment. - -Go: `Environment(ctx context.Context) EnvironmentInfo`
JS: `Environment(): Promise` - -#### EnvironmentInfo - -Go: -```go -type EnvironmentInfo struct { - BuildType string - Platform string - Arch string -} -``` -JS: -```ts -interface EnvironmentInfo { - buildType: string; - platform: string; - arch: string; -} -``` diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/log.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/log.mdx deleted file mode 100644 index e5e6ea7ac..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/log.mdx +++ /dev/null @@ -1,130 +0,0 @@ ---- -sidebar_position: 3 ---- - -# Log - -The Wails runtime provides a logging mechanism that may be called from Go or Javascript. Like most loggers, there are a number of log levels: - -- Trace -- Debug -- Info -- Warning -- Error -- Fatal - -The logger will output any log message at the current, or higher, log level. Example: The `Debug` log level will output all messages except `Trace` messages. - -### LogPrint - -Logs the given message as a raw message. - -Go: `LogPrint(ctx context.Context, message string)`
JS: `LogPrint(message: string)` - -### LogPrintf - -Logs the given message as a raw message. - -Go: `LogPrintf(ctx context.Context, format string, args ...interface{})`
- -### LogTrace - -Logs the given message at the `Trace` log level. - -Go: `LogTrace(ctx context.Context, message string)`
JS: `LogTrace(message: string)` - -### LogTracef - -Logs the given message at the `Trace` log level. - -Go: `LogTracef(ctx context.Context, format string, args ...interface{})`
- -### LogDebug - -Logs the given message at the `Debug` log level. - -Go: `LogDebug(ctx context.Context, message string)`
JS: `LogDebug(message: string)` - -### LogDebugf - -Logs the given message at the `Debug` log level. - -Go: `LogDebugf(ctx context.Context, format string, args ...interface{})`
- -### LogInfo - -Logs the given message at the `Info` log level. - -Go: `LogInfo(ctx context.Context, message string)`
JS: `LogInfo(message: string)` - -### LogInfof - -Logs the given message at the `Info` log level. - -Go: `LogInfof(ctx context.Context, format string, args ...interface{})`
- -### LogWarning - -Logs the given message at the `Warning` log level. - -Go: `LogWarning(ctx context.Context, message string)`
JS: `LogWarning(message: string)` - -### LogWarningf - -Logs the given message at the `Warning` log level. - -Go: `LogWarningf(ctx context.Context, format string, args ...interface{})`
- -### LogError - -Logs the given message at the `Error` log level. - -Go: `LogError(ctx context.Context, message string)`
JS: `LogError(message: string)` - -### LogErrorf - -Logs the given message at the `Error` log level. - -Go: `LogErrorf(ctx context.Context, format string, args ...interface{})`
- -### LogFatal - -Logs the given message at the `Fatal` log level. - -Go: `LogFatal(ctx context.Context, message string)`
JS: `LogFatal(message: string)` - -### LogFatalf - -Logs the given message at the `Fatal` log level. - -Go: `LogFatalf(ctx context.Context, format string, args ...interface{})`
- -### LogSetLogLevel - -Sets the log level. In Javascript, the number relates to the following log levels: - -| Value | Log Level | -| ----- | --------- | -| 1 | Trace | -| 2 | Debug | -| 3 | Info | -| 4 | Warning | -| 5 | Error | - -Go: `LogSetLogLevel(ctx context.Context, level logger.LogLevel)`
JS: `LogSetLogLevel(level: number)` - -## Using a Custom Logger - -A custom logger may be used by providing it using the [Logger](../options.mdx#logger) application option. The only requirement is that the logger implements the `logger.Logger` interface defined in `github.com/wailsapp/wails/v2/pkg/logger`: - -```go title="logger.go" -type Logger interface { - Print(message string) - Trace(message string) - Debug(message string) - Info(message string) - Warning(message string) - Error(message string) - Fatal(message string) -} -``` diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/menu.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/menu.mdx deleted file mode 100644 index 6a7e06cf9..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/menu.mdx +++ /dev/null @@ -1,23 +0,0 @@ ---- -sidebar_position: 6 ---- - -# Menu - -These methods are related to the application menu. - -:::info Javascript -Menu is currently unsupported in the JS runtime. -::: - -### MenuSetApplicationMenu - -Sets the application menu to the given [menu](../menus.mdx). - -Go: `MenuSetApplicationMenu(ctx context.Context, menu *menu.Menu)` - -### MenuUpdateApplicationMenu - -Updates the application menu, picking up any changes to the menu passed to `MenuSetApplicationMenu`. - -Go: `MenuUpdateApplicationMenu(ctx context.Context)` diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/window.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/window.mdx deleted file mode 100644 index d03143161..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/window.mdx +++ /dev/null @@ -1,211 +0,0 @@ ---- -sidebar_position: 4 ---- - -# Window - -These methods give control of the application window. - -### WindowSetTitle - -Sets the text in the window title bar. - -Go: `WindowSetTitle(ctx context.Context, title string)`
JS: `WindowSetTitle(title: string)` - -### WindowFullscreen - -Makes the window full screen. - -Go: `WindowFullscreen(ctx context.Context)`
JS: `WindowFullscreen()` - -### WindowUnfullscreen - -Restores the previous window dimensions and position prior to full screen. - -Go: `WindowUnfullscreen(ctx context.Context)`
JS: `WindowUnfullscreen()` - -### WindowIsFullscreen - -Returns true if the window is full screen. - -Go: `WindowCenter(ctx context.Context)`
JS: `WindowCenter()` - -### WindowCenter - -Centers the window on the monitor the window is currently on. - -Go: `WindowReload(ctx context.Context)`
JS: `WindowReload()` - -### WindowReload - -Performs a "reload" (Reloads current page). - -Go: `WindowReloadApp(ctx context.Context)`
JS: `WindowReloadApp()` - -### WindowReloadApp - -Reloads the application frontend. - -Go: `WindowSetSystemDefaultTheme(ctx context.Context)`
JS: `WindowSetSystemDefaultTheme()` - -### WindowSetSystemDefaultTheme - -Windows only. - -Go: `WindowSetDarkTheme(ctx context.Context)`
JS: `WindowSetDarkTheme()` - -Sets window theme to system default (dark/light). - -### WindowSetLightTheme - -Windows only. - -Go: `WindowSetLightTheme(ctx context.Context)`
JS: `WindowSetLightTheme()` - -Sets window theme to light. - -### WindowSetDarkTheme - -Windows only. - -Go: `WindowShow(ctx context.Context)`
JS: `WindowShow()` - -Sets window theme to dark. - -### WindowShow - -Shows the window, if it is currently hidden. - -Go: `WindowHide(ctx context.Context)`
JS: `WindowHide()` - -### WindowHide - -Hides the window, if it is currently visible. - -Go: `WindowSetSize(ctx context.Context, width int, height int)`
JS: `WindowSetSize(size: Size)` - -### WindowIsNormal - -Returns true if the window not minimised, maximised or fullscreen. - -Go: `WindowGetSize(ctx context.Context) (width int, height int)`
JS: `WindowGetSize() : Size` - -### WindowSetSize - -Sets the width and height of the window. - -Go: `WindowSetMaxSize(ctx context.Context, width int, height int)`
JS: `WindowSetMaxSize(size: Size)` - -### WindowGetSize - -Gets the width and height of the window. - -Go: `WindowSetMinSize(ctx context.Context, width int, height int)`
JS: `WindowSetMinSize(size: Size)` - -### WindowSetMinSize - -Sets the minimum window size. Will resize the window if the window is currently smaller than the given dimensions. - -Setting a size of `0,0` will disable this constraint. - -Go: `WindowSetAlwaysOnTop(ctx context.Context, b bool)`
JS: `WindowSetAlwaysOnTop(b: Boolen)` - -### WindowSetMaxSize - -Sets the maximum window size. Will resize the window if the window is currently larger than the given dimensions. - -Setting a size of `0,0` will disable this constraint. - -Go: `WindowSetPosition(ctx context.Context, x int, y int)`
JS: `WindowSetPosition(position: Position)` - -### WindowSetAlwaysOnTop - -Sets the window AlwaysOnTop or not on top. - -Go: `WindowGetPosition(ctx context.Context) (x int, y int)`
JS: `WindowGetPosition() : Position` - -### WindowSetPosition - -Sets the window position relative to the monitor the window is currently on. - -Go: `WindowMaximise(ctx context.Context)`
JS: `WindowMaximise()` - -### WindowGetPosition - -Gets the window position relative to the monitor the window is currently on. - -Go: `WindowUnmaximise(ctx context.Context)`
JS: `WindowUnmaximise()` - -### WindowMaximise - -Maximises the window to fill the screen. - -Go: `WindowToggleMaximise(ctx context.Context)`
JS: `WindowToggleMaximise()` - -### WindowUnmaximise - -Restores the window to the dimensions and position prior to maximising. - -Go: `WindowMinimise(ctx context.Context)`
JS: `WindowMinimise()` - -### WindowIsMaximised - -Returns true if the window is maximised. - -Go: `WindowUnminimise(ctx context.Context)`
JS: `WindowUnminimise()` - -### WindowToggleMaximise - -Toggles between Maximised and UnMaximised. - -Go: `WindowToggleMaximise(ctx context.Context)`
JS: `WindowToggleMaximise()` - -### WindowMinimise - -Minimises the window. - -Go: `WindowSetBackgroundColour(ctx context.Context, R, G, B, A uint8)`
JS: `WindowSetBackgroundColour(R, G, B, A)` - -### WindowUnminimise - -Restores the window to the dimensions and position prior to minimising. - -Go: `WindowUnminimise(ctx context.Context)`
JS: `WindowUnminimise()` - -### WindowIsMinimised - -Returns true if the window is minimised. - -Go: `WindowIsMinimised(ctx context.Context) bool` JS: `WindowIsMinimised() bool` - -### WindowSetBackgroundColour - -Sets the background colour of the window to the given RGBA colour definition. This colour will show through for all transparent pixels. - -Valid values for R, G, B and A are 0-255. - -Any value that is not 0 will be considered 255. :::info Windows -On Windows, only alpha values of 0 or 255 are supported. -::: - -Go: `WindowSetBackgroundColour(ctx context.Context, R, G, B, A uint8)`
JS: `WindowSetBackgroundColour(R, G, B, A)` - -## Typescript Object Definitions - -### Position - -```ts -interface Position { - x: number; - y: number; -} -``` - -### Size - -```ts -interface Size { - w: number; - h: number; -} -``` diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/_category_.json b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/_category_.json deleted file mode 100644 index dfac1d175..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Tutorials", - "position": 70 -} diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/dogsapi.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/dogsapi.mdx deleted file mode 100644 index f4845fdbe..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/dogsapi.mdx +++ /dev/null @@ -1,243 +0,0 @@ ---- -sidebar_position: 20 ---- - -# Dogs API - -
- -
- -
- -:::note This tutorial has been kindly provided by [@tatadan](https://twitter.com/tatadan) and forms part of their [Wails Examples Repository](https://github.com/tataDan/wails-v2-examples). ::: - -In this tutorial we are going to develop an application that retrieves photos of dogs from the web and then displays them. - -### Create the project - -Let's create the application. From a terminal enter: `wails init -n dogs-api -t svelte` - -Note: We could optionally add `-ide vscode` or `-ide goland` to the end of this command if you wanted to add IDE support. - -Now let's `cd dogs-api` and start editing the project files. - -### Remove unused code - -We will start by removing some elements that we know we will not use: - -- Open `app.go` and remove the following lines: - -```go -// Greet returns a greeting for the given name -func (a *App) Greet(name string) string { - return fmt.Sprintf("Hello %s, It's show time!", name) -} -``` - -- Open `frontend/src/App.svelte` and delete all lines. -- Delete the `frontend/src/assets/images/logo-universal.png` file - -### Creating our application - -Now let's add our new Go code. - -Add the following struct declarations to `app.go` before the function definitions: - -```go -type RandomImage struct { - Message string - Status string -} - -type AllBreeds struct { - Message map[string]map[string][]string - Status string -} - -type ImagesByBreed struct { - Message []string - Status string -} -``` - -Add the following functions to `app.go` (perhaps after the existing function definitions): - -```go -func (a *App) GetRandomImageUrl() string { - response, err := http.Get("https://dog.ceo/api/breeds/image/random") - if err != nil { - log.Fatal(err) - } - - responseData, err := ioutil.ReadAll(response.Body) - if err != nil { - log.Fatal(err) - } - - var data RandomImage - json.Unmarshal(responseData, &data) - - return data.Message -} - -func (a *App) GetBreedList() []string { - var breeds []string - - response, err := http.Get("https://dog.ceo/api/breeds/list/all") - if err != nil { - log.Fatal(err) - } - - responseData, err := ioutil.ReadAll(response.Body) - if err != nil { - log.Fatal(err) - } - - var data AllBreeds - json.Unmarshal(responseData, &data) - - for k := range data.Message { - breeds = append(breeds, k) - } - - sort.Strings(breeds) - - return breeds -} - -func (a *App) GetImageUrlsByBreed(breed string) []string { - - url := fmt.Sprintf("%s%s%s%s", "https://dog.ceo/api/", "breed/", breed, "/images") - response, err := http.Get(url) - if err != nil { - log.Fatal(err) - } - - responseData, err := ioutil.ReadAll(response.Body) - if err != nil { - log.Fatal(err) - } - - var data ImagesByBreed - json.Unmarshal(responseData, &data) - - return data.Message -} -``` - -Modify the `import` section of `app.go` to look like this: - -```go -import ( - "context" - "fmt" - "encoding/json" - "io/ioutil" - "log" - "net/http" - "sort" -) -``` - -Add the following lines to `frontend/src/App.svelte`: - -```html - - -

Dogs API

-
- - Click on down arrow to select a breed - - -
-
-{#if showRandomPhoto} - No dog found -{/if} -{#if showBreedPhotos} - {#each photos as photo} - No dog found - {/each} -{/if} - - -``` - -### Testing the application - -To generate the bindings and test the application, run `wails dev`. - -### Compiling the application - -To compile the application to a single, production grade binary, run `wails build`. - - - - - diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/helloworld.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/helloworld.mdx deleted file mode 100644 index d1b8e9f98..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/helloworld.mdx +++ /dev/null @@ -1,118 +0,0 @@ ---- -sidebar_position: 10 ---- - -# Hello World - -The aim of this tutorial is to get you up and running with the most basic application using Wails. You will be able to: - -- Create a new Wails application -- Build the application -- Run the application - -:::note -This tutorial uses Windows as the target platform. Output will vary slightly -depending on your operating system. -::: - -## Create a new Wails application - -To create a new Wails application using the default vanilla JS template, you need to run the following command: - -```bash -wails init -n helloworld -``` - -You should see something similar to the following: - -``` -Wails CLI v2.0.0 - -Initialising Project 'helloworld' ---------------------------------- - -Project Name: helloworld -Project Directory: C:\Users\leaan\tutorial\helloworld -Project Template: vanilla -Template Support: https://wails.io - -Initialised project 'helloworld' in 232ms. -``` - -This will create a new directory called `helloworld` in the current directory. In this directory, you will find a number of files: - -``` -build/ - Contains the build files + compiled application -frontend/ - Contains the frontend files -app.go - Contains the application code -main.go - The main program with the application configuration -wails.json - The project configuration file -go.mod - The go module file -go.sum - The go module checksum file -``` - -## Build the application - -To build the application, change to the new `helloworld` project directory and run the following command: - -```bash -wails build -``` - -You should see something like the following: - -``` -Wails CLI v2.0.0 - -App Type: desktop -Platforms: windows/amd64 -Compiler: C:\Users\leaan\go\go1.18.3\bin\go.exe -Build Mode: Production -Skip Frontend: false -Compress: false -Package: true -Clean Build Dir: false -LDFlags: "" -Tags: [] -Race Detector: false - -Building target: windows/amd64 ------------------------------- - - Installing frontend dependencies: Done. - - Compiling frontend: Done. - - Generating bundle assets: Done. - - Compiling application: Done. -Built 'C:\Users\leaan\tutorial\helloworld\build\bin\helloworld.exe' in 10.616s. -``` - -This has compiled the application and saved it in the `build/bin` directory. - -## Run the application - -If we view the `build/bin` directory in Windows Explorer, we should see our project binary: - -
- -
- -
- -We can run it by simply double-clicking the `helloworld.exe` file. - -On Mac, Wails generates a `helloworld.app` file which can be run by double-clicking it. - -On Linux, you can run the application using `./helloworld` from the `build/bin` directory. - -You should see the application working as expected: - -
- -
-
diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-beta.44.json b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-beta.44.json deleted file mode 100644 index b6f38500b..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-beta.44.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "version.label": { - "message": "v2.0.0-beta.44", - "description": "The label for version v2.0.0-beta.44" - }, - "sidebar.tutorialSidebar.category.Getting Started": { - "message": "Getting Started", - "description": "The label for category Getting Started in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Reference": { - "message": "Reference", - "description": "The label for category Reference in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Runtime": { - "message": "Runtime", - "description": "The label for category Runtime in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Community": { - "message": "Community", - "description": "The label for category Community in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Showcase": { - "message": "Showcase", - "description": "The label for category Showcase in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Guides": { - "message": "Guides", - "description": "The label for category Guides in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Tutorials": { - "message": "Tutorials", - "description": "The label for category Tutorials in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Contributing": { - "message": "Contributing", - "description": "The label for category Contributing in sidebar tutorialSidebar" - } -} diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1.json b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1.json deleted file mode 100644 index 49cf4687e..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "version.label": { - "message": "v2.0.0-rc.1", - "description": "The label for version v2.0.0-rc.1" - }, - "sidebar.docs.category.Getting Started": { - "message": "Getting Started", - "description": "The label for category Getting Started in sidebar docs" - }, - "sidebar.docs.category.Reference": { - "message": "Reference", - "description": "The label for category Reference in sidebar docs" - }, - "sidebar.docs.category.Runtime": { - "message": "Runtime", - "description": "The label for category Runtime in sidebar docs" - }, - "sidebar.docs.category.Community": { - "message": "Community", - "description": "The label for category Community in sidebar docs" - }, - "sidebar.docs.category.Showcase": { - "message": "Showcase", - "description": "The label for category Showcase in sidebar docs" - }, - "sidebar.docs.category.Guides": { - "message": "Guides", - "description": "The label for category Guides in sidebar docs" - }, - "sidebar.docs.category.Tutorials": { - "message": "Tutorials", - "description": "The label for category Tutorials in sidebar docs" - }, - "sidebar.docs.link.Contributing": { - "message": "Contributing", - "description": "The label for link Contributing in sidebar docs, linking to /community-guide#ways-of-contributing" - } -} diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/appendix/_category_.json b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/appendix/_category_.json deleted file mode 100644 index 83af4ca28..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/appendix/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Appendix", - "position": 70 -} diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/_category_.json b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/_category_.json deleted file mode 100644 index 524986e1e..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Community", - "position": 50 -} diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/links.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/links.mdx deleted file mode 100644 index 4a3a89e87..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/links.mdx +++ /dev/null @@ -1,23 +0,0 @@ ---- -sidebar_position: 2 ---- - -# Links - -This page serves as a list for community related links. Please submit a PR (click `Edit this page` at the bottom) to submit links. - -## Awesome Wails - -The [definitive list](https://github.com/wailsapp/awesome-wails) of links related to Wails. - -## Support Channels - -- [Gophers Slack Channel](https://gophers.slack.com/messages/CJ4P9F7MZ/) -- [Gophers Slack Channel Invite](https://invite.slack.golangbridge.org/) -- [Github Issues](https://github.com/wailsapp/wails/issues) -- [v2 Beta Discussion Board](https://github.com/wailsapp/wails/discussions/828) - -## Social Media - -- [Twitter](https://twitter.com/wailsapp) -- [Wails Chinese Community QQ Group](https://qm.qq.com/cgi-bin/qm/qr?k=PmIURne5hFGNd7QWzW5qd6FV-INEjNJv&jump_from=webapi) - Group number: 1067173054 diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/_category_.json b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/_category_.json deleted file mode 100644 index 276e283b7..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Showcase", - "position": 1 -} diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/emailit.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/emailit.mdx deleted file mode 100644 index 4a1ebe835..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/emailit.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# EmailIt - -

- -
-

- -[EmailIt](https://github.com/raguay/EmailIt/) is a Wails 2 program that is a markdown based email sender only with nine notepads, scripts to manipulate the text, and templates. It also has a builtin [Node-Red](https://nodered.org/) server, scripts terminal, and the [ScriptBar](https://github.com/raguay/ScriptBarApp) program for displaying results from Node-Red or a script on your system. Documentation is very scarce, but the programs works. It’s built using Wails2 and Svelte, and the download is a universal macOS application. diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/encrypteasy.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/encrypteasy.mdx deleted file mode 100644 index 13c2d8345..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/encrypteasy.mdx +++ /dev/null @@ -1,10 +0,0 @@ -# EncryptEasy - -

- -
-

- -**[EncryptEasy](https://www.encrypteasy.app) is a simple and easy to use PGP encryption tool, managing all your and your contacts keys. Encryption should be simple. Developed with Wails.** - -Encrypting messages using PGP is the industry standard. Everyone has a private and a public key. Your private key, well, needs to be kept private so only you can read messages. Your public key is distributed to anyone who wants to send you secret, encrypted messages. Managing keys, encrypting messages and decrypting messages should be a smooth experience. EncryptEasy is all about making it easy. diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/filehound.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/filehound.mdx deleted file mode 100644 index 78cbfca86..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/filehound.mdx +++ /dev/null @@ -1,14 +0,0 @@ -# FileHound Export Utility - -

- -
-

- -[FileHound Export Utility](https://www.filehound.co.uk/) FileHound is a cloud document management platform made for secure file retention, business process automation and SmartCapture capabilities. - -The FileHound Export Utility allows FileHound Administrators the ability to run a secure document and data extraction tasks for alternative back-up and recovery purposes. This application will download all documents and/or meta data saved in FileHound based on the filters you choose. The metadata will be exported in both JSON and XML formats. - -Backend built with: Go 1.15 Wails 1.11.0 go-sqlite3 1.14.6 go-linq 3.2 - -Frontend with: Vue 2.6.11 Vuex 3.4.0 Typescript Tailwind 1.9.6 diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/minecraftupdater.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/minecraftupdater.mdx deleted file mode 100644 index 11247339d..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/minecraftupdater.mdx +++ /dev/null @@ -1,10 +0,0 @@ -# Minecraft Updater - -

- -
-

- -[Minecraft Updater](https://github.com/Gurkengewuerz/MinecraftModUpdater) is a utility tool to update and synchronize Minecraft mods for your userbase. It’s built using Wails2 and React with [antd](https://ant.design/) as frontend framework. diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/modalfilemanager.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/modalfilemanager.mdx deleted file mode 100644 index a7ae8c492..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/modalfilemanager.mdx +++ /dev/null @@ -1,12 +0,0 @@ -# Modal File Manager - -

- -
-

- -[Modal File Manager](https://github.com/raguay/ModalFileManager) is a dual pane file manager using web technologies. My original design was based on NW.js and can be found [here](https://github.com/raguay/ModalFileManager-NWjs). This version uses the same Svelte based frontend code (but it has be greatly modified since the departure from NW.js), but the backend is a [Wails 2](https://wails.io/) implementation. By using this implementation, I no longer use command line `rm`, `cp`, etc. commands. It is fully coded using Go and runs much faster than the previous versions. - -This file manager is designed around the same principle as Vim: a state controlled keyboard actions. The number of states isn't fixed, but very programmable. Therefore, an infinite number of keyboard configurations can be created and used. This is the main difference from other file managers. diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/mollywallet.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/mollywallet.mdx deleted file mode 100644 index 534b097ca..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/mollywallet.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Molley Wallet - -

- -
-

- -[Molly Wallet](https://github.com/grvlle/constellation_wallet/) the official $DAG wallet of the Constellation Network. It'll let users interact with the Hypergraph Network in various ways, not limited to producing $DAG transactions. diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/october.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/october.mdx deleted file mode 100644 index 889d2dd9e..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/october.mdx +++ /dev/null @@ -1,12 +0,0 @@ -# October - -

- -
-

- -[October](https://october.utf9k.net) is a small Wails application that makes it really easy to extract highlights from [Kobo eReaders](https://en.wikipedia.org/wiki/Kobo_eReader) and then forward them to [Readwise](https://readwise.io). - -It has a relatively small scope with all platform versions weighing in under 10MB, and that's without enabling [UPX compression](https://upx.github.io/)! - -In contrast, the author's previous attempts with Electron quickly bloated to several hundred megabytes. diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/optimus.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/optimus.mdx deleted file mode 100644 index c3eb79507..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/optimus.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Optimus - -

- -
-

- -[Optimus](https://github.com/splode/optimus) is a desktop image optimization application. It supports conversion and compression between WebP, JPEG, and PNG image formats. diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/portfall.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/portfall.mdx deleted file mode 100644 index 4cc2c63c9..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/portfall.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Portfall - -

- -
-

- -[Portfall](https://github.com/rekon-oss/portfall) - A desktop k8s port-forwarding portal for easy access to all your cluster UIs diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/restic-browser.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/restic-browser.mdx deleted file mode 100644 index 1505ce07a..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/restic-browser.mdx +++ /dev/null @@ -1,10 +0,0 @@ -# Restic Browser - -

- -
-

- -[Restic-Browser](https://github.com/emuell/restic-browser) - A simple, cross-platform [restic](https://github.com/restic/restic) backup GUI for browsing and restoring restic repositories. diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/riftshare.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/riftshare.mdx deleted file mode 100644 index 5223e88cf..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/riftshare.mdx +++ /dev/null @@ -1,19 +0,0 @@ -# RiftShare - -

- -
-

- -Easy, Secure, and Free file sharing for everyone. Learn more at [Riftshare.app](https://riftshare.app) - -## Features - -- Easy secure file sharing between computers both in the local network and through the internet -- Supports sending files or directories securely through the [magic wormhole protocol](https://magic-wormhole.readthedocs.io/en/latest/) -- Compatible with all other apps using magic wormhole (magic-wormhole or wormhole-william CLI, wormhole-gui, etc.) -- Automatic zipping of multiple selected files to send at once -- Full animations, progress bar, and cancellation support for sending and receiving -- Native OS File Selection -- Open files in one click once received -- Auto Update - don't worry about having the latest release! diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/scriptbar.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/scriptbar.mdx deleted file mode 100644 index aaa556f92..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/scriptbar.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# ScriptBar - -

- -
-

- -[ScriptBar](https://GitHub.com/raguay/ScriptBarApp) is a program to show the output of the embedded [Node-Red](https://nodered.org) server in the [EmailIt](https://GitHub.com/raguay/EmailIt) application. It also displays the output of scripts on your system. ScriptBar doesn't put them in the menubar, but has them all in a convient window for easy viewing. You can have multiple tabs to have many different things show. You can also keep the links to your most visited web sites. diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/surge.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/surge.mdx deleted file mode 100644 index 2d895dc29..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/surge.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Surge - -

- -
-

- -[Surge](https://getsurge.io/) is a p2p filesharing app designed to utilize blockchain technologies to enable 100% anonymous file transfers. Surge is end-to-end encrypted, decentralized and open source. diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/wally.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/wally.mdx deleted file mode 100644 index 2a2498f40..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/wally.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Wally - -

- -
-

- -[Wally](https://ergodox-ez.com/pages/wally) is the official firmware flasher for [Ergodox](https://ergodox-ez.com/) keyboards. It looks great and is a fantastic example of what you can achieve with Wails: the ability to combine the power of Go and the rich graphical tools of the web development world. diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/wombat.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/wombat.mdx deleted file mode 100644 index 54cedacea..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/wombat.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Wombat - -

- -
-

- -[Wombat](https://github.com/rogchap/wombat) is a cross platform gRPC client. diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/ytd.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/ytd.mdx deleted file mode 100644 index 178ff0529..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/ytd.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Ytd - -

- -
-

- -[Ytd](https://github.com/marcio199226/ytd/tree/v2-wails) is an app for downloading tracks from youtube, creating offline playlists and share them with your friends, your friends will be able to playback your playlists or download them for offline listening, has an built-in player. diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/templates.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/templates.mdx deleted file mode 100644 index d9a29a6fa..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/templates.mdx +++ /dev/null @@ -1,52 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Templates - -This page serves as a list for community supported templates. Please submit a PR (click `Edit this page` at the bottom) to include your templates. To build your own template, please see the [Templates](../guides/templates.mdx) guide. - -To use these templates, run `wails init -n "Your Project Name" -t [the link below[@version]]` - -If there is no version suffix, the main branch code template is used by default. If there is a version suffix, the code template corresponding to the tag of this version is used. - -Example: `wails init -n "Your Project Name" -t https://github.com/misitebao/wails-template-vue` - -:::warning Attention - -**The Wails project does not maintain, is not responsible nor liable for 3rd party templates!** - -If you are unsure about a template, inspect `package.json` and `wails.json` for what scripts are run and what packages are installed. - -::: - -## Vue - -- [wails-template-vue](https://github.com/misitebao/wails-template-vue) - A template using Vite,Vue and Vue-Router(Support both JavaScript and TypeScript) -- [wails-vite-vue-ts](https://github.com/codydbentley/wails-vite-vue-ts) - Vue 3 TypeScript with Vite (and instructions to add features) -- [wails-vite-vue-the-works](https://github.com/codydbentley/wails-vite-vue-the-works) - Vue 3 TypeScript with Vite, Vuex, Vue Router, Sass, and ESLint + Prettier - -## Angular - -- [wails-angular-template](https://github.com/TAINCER/wails-angular-template) - Angular with TypeScript, Sass, Hot-Reload, Code-Splitting and i18n - -## React - -- [wails-react-template](https://github.com/AlienRecall/wails-react-template) - A template using reactjs -- [wails-react-template](https://github.com/flin7/wails-react-template) - A minimal template for React that supports live development -- [wails-template-nextjs](https://github.com/LGiki/wails-template-nextjs) - A template using Next.js and TypeScript - -## Svelte - -- [wails-svelte-template](https://github.com/raitonoberu/wails-svelte-template) - A template using Svelte -- [wails-vite-svelte-template](https://github.com/BillBuilt/wails-vite-svelte-template) - A template using Svelte and Vite -- [wails-vite-svelte-tailwind-template](https://github.com/BillBuilt/wails-vite-svelte-tailwind-template) - A template using Svelte and Vite with TailwindCSS v3 -- [wails-sveltekit-template](https://github.com/h8gi/wails-sveltekit-template) - A template using SvelteKit - -## Elm - -- [wails-elm-template](https://github.com/benjamin-thomas/wails-elm-template) - Develop your GUI app with functional programming and a **snappy** hot-reload setup :tada: :rocket: - -## Pure JavaScript (Vanilla) - -- [wails-pure-js-template](https://github.com/KiddoV/wails-pure-js-template) - A template with nothing but just basic JavaScript, HTML, and CSS \ No newline at end of file diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/_category_.json b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/_category_.json deleted file mode 100644 index 597b920df..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Getting Started", - "position": 10 -} diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/building.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/building.mdx deleted file mode 100644 index 3e0df3b68..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/building.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -sidebar_position: 6 ---- - -# Compiling your Project - -From the project directory, run `wails build`. This will compile your project and save the production-ready binary in the `build/bin` directory. - -If you run the binary, you should see the default application: - -
- -
- -
- -For more details on compilation options, please refer to the [CLI Reference](../reference/cli.mdx#build). diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/development.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/development.mdx deleted file mode 100644 index 54dda5faa..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/development.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -sidebar_position: 5 ---- - -# Developing your Application - -You can run your application in development mode by running `wails dev` from your project directory. This will do the following things: - -- Build your application and run it -- Bind your Go code to the frontend so it can be called from Javascript -- Using the power of [vite](https://vitejs.dev/), will watch for modifications in your Go files and rebuild/re-run on change -- Sets up a [webserver](http://localhost:34115) that will serve your application over a browser. This allows you to use your favourite browser extensions. You can even call your Go code from the console - -To get started, run `wails dev` in the project directory. More information on this can be found [here](../reference/cli.mdx#dev). - -Coming soon: Tutorial diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/firstproject.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/firstproject.mdx deleted file mode 100644 index 94e330c47..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/firstproject.mdx +++ /dev/null @@ -1,130 +0,0 @@ ---- -sidebar_position: 2 ---- - -# Creating a Project - -## Project Generation - -Now that the CLI is installed, you can generate a new project by using the `wails init` command. - -Pick your favourite framework: - - - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - - - - Generate a Svelte project using Javascript with:

- - wails init -n myproject -t svelte -If you would rather use Typescript:
- - wails init -n myproject -t svelte-ts - -
- - Generate a React project using Javascript with:

- - wails init -n myproject -t react -If you would rather use Typescript:
- - wails init -n myproject -t react-ts - -
- - Generate a Vue project using Javascript with:

- - wails init -n myproject -t vue - -If you would rather use Typescript:
- - wails init -n myproject -t vue-ts - -
- - Generate a Preact project using Javascript with:

- - wails init -n myproject -t preact - -If you would rather use Typescript:
- - wails init -n myproject -t preact-ts - -
- - Generate a Lit project using Javascript with:

- - wails init -n myproject -t lit - -If you would rather use Typescript:
- - wails init -n myproject -t lit-ts - -
- - Generate a Vanilla project using Javascript with:

- - wails init -n myproject -t vanilla - -If you would rather use Typescript:
- - wails init -n myproject -t vanilla-ts - -
-
- - - -
- -There are also [community templates](../community/templates.mdx) available that offer different capabilities and frameworks. - -To see the other options available, you can run `wails init -help`. More details can be found in the [CLI Reference](../reference/cli.mdx#init). - -## Project Layout - -Wails projects have the following layout: - -``` -. -├── build/ -│ ├── appicon.png -│ ├── darwin/ -│ └── windows/ -├── frontend/ -├── go.mod -├── go.sum -├── main.go -└── wails.json -``` - -### Project structure rundown - -- `/main.go` - The main application -- `/frontend/` - Frontend project files -- `/build/` - Project build directory -- `/build/appicon.png` - The application icon -- `/build/darwin/` - Mac specific project files -- `/build/windows/` - Windows specific project files -- `/wails.json` - The project configuration -- `/go.mod` - Go module file -- `/go.sum` - Go module checksum file - -The `frontend` directory has nothing specific to Wails and can be any frontend project of your choosing. - -The `build` directory is used during the build process. These files may be updated to customise your builds. If files are removed from the build directory, default versions will be regenerated. - -The default module name in `go.mod` is "changeme". You should change this to something more appropriate. diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/installation.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/installation.mdx deleted file mode 100644 index 5c37d84ff..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/installation.mdx +++ /dev/null @@ -1,90 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Installation - -## Supported Platforms - -- Windows 10/11 AMD64/ARM64 -- MacOS 10.13+ AMD64 -- MacOS 11.0+ ARM64 -- Linux AMD64/ARM64 - -## Dependencies - -Wails has a number of common dependencies that are required before installation: - -- Go 1.17+ -- NPM (Node 15+) - -### Go - -Download Go from the [Go Downloads Page](https://go.dev/doc/install). - -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: `echo $PATH | grep go/bin` - -### NPM - -Download NPM 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. - -## Platform Specific Dependencies - -You will also need to install platform specific dependencies: - - - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - - - - Wails requires that the xcode command line tools are installed. This can be done by running:
- xcode-select --install -
- - Wails requires that the WebView2{" "} - runtime is installed. Some Windows installations will already have this installed. You can check using - the{" "} - wails doctor command (see below). - - - Linux required the standard gcc build tools - plus libgtk3 and libwebkit. Rather than list a ton of commands for different distros, Wails can try to determine - what the installation commands are for your specific distribution. Run wails doctor after - installation - to be shown how to install the dependencies. If your distro/package manager is not supported, please consult the {" "} - Add Linux Distro guide. - -
- - - -## Optional Dependencies - -- [UPX](https://upx.github.io/) for compressing your applications. - -## Installing Wails - -Run `go install github.com/wailsapp/wails/v2/cmd/wails@latest` to install the Wails CLI. - -## System Check - -Running `wails 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 `wails` command appears to be missing? - -If your system is reporting that the `wails` command is missing, make sure you have followed the Go installation guide correctly. Normally, it means that the `go/bin` directory in your User's home directory is not in the `PATH` environment variable. You will also normally need to close and reopen any open command prompts so that changes to the environment made by the installer are reflected at the command prompt. diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/_category_.json b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/_category_.json deleted file mode 100644 index 5935dad93..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Guides", - "position": 50 -} diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/application-development.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/application-development.mdx deleted file mode 100644 index a618076f1..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/application-development.mdx +++ /dev/null @@ -1,194 +0,0 @@ -# Application Development - -There are no hard and fast rules for developing applications with Wails, but there are some basic guidelines. - -## Application Setup - -The pattern used by the default templates are that `main.go` is used for configuring and running the application, whilst `app.go` is used for defining the application logic. - -The `app.go` file will define a struct that has 2 methods which act as hooks into the main application: - -```go title="app.go" -type App struct { - ctx context.Context -} - -func NewApp() *App { - return &App{} -} - -func (a *App) startup(ctx context.Context) { - a.ctx = ctx -} - -func (a *App) shutdown(ctx context.Context) { -} -``` - -- The startup method is called as soon as Wails allocates the resources it needs and is a good place for creating resources, setting up event listeners and anything else the application needs at startup. It is given a `context.Context` which is usually saved in a struct field. This context is needed for calling the [runtime](../reference/runtime/intro.mdx). If this method returns an error, the application will terminate. In dev mode, the error will be output to the console. - -- The shutdown method will be called by Wails right at the end of the shutdown process. This is a good place to deallocate memory and perform any shutdown tasks. - -The `main.go` file generally consists of a single call to `wails.Run()`, which accepts the application configuration. The pattern used by the templates is that before the call to `wails.Run()`, an instance of the struct we defined in `app.go` is created and saved in a variable called `app`. This configuration is where we add our callbacks: - -```go {3,9,10} title="main.go" -func main() { - - app := NewApp() - - err := wails.Run(&options.App{ - Title: "My App", - Width: 800, - Height: 600, - OnStartup: app.startup, - OnShutdown: app.shutdown, - }) - if err != nil { - log.Fatal(err) - } -} - -``` - -More information on application lifecycle hooks can be found [here](../howdoesitwork.mdx#application-lifecycle-callbacks). - -## Binding Methods - -It is likely that you will want to call Go methods from the frontend. This is normally done by adding public methods to the already defined struct in `app.go`: - -```go {16-18} title="app.go" -type App struct { - ctx context.Context -} - -func NewApp() *App { - return &App{} -} - -func (a *App) startup(ctx context.Context) { - a.ctx = ctx -} - -func (a *App) shutdown(ctx context.Context) { -} - -func (a *App) Greet(name string) string { - return fmt.Sprintf("Hello %s!", name) -} -``` - -In the main application configuration, the `Bind` key is where we can tell Wails what we want to bind: - -```go {11-13} title="main.go" -func main() { - - app := NewApp() - - err := wails.Run(&options.App{ - Title: "My App", - Width: 800, - Height: 600, - OnStartup: app.startup, - OnShutdown: app.shutdown, - Bind: []interface{}{ - app, - }, - }) - if err != nil { - log.Fatal(err) - } -} - -``` - -This will bind all public methods in our `App` struct (it will never bind the startup and shutdown methods). - -### Dealing with context when binding multiple structs - -If you want to bind methods for multiple structs but want each struct to keep a reference to the context so that you can use the runtime functions, a good pattern is to pass the context from the `OnStartup` method to your struct instances : - -```go -func main() { - - app := NewApp() - otherStruct := NewOtherStruct() - - err := wails.Run(&options.App{ - Title: "My App", - Width: 800, - Height: 600, - OnStartup: func(ctx context.Context){ - app.SetContext(ctx) - otherStruct.SetContext(ctx) - }, - OnShutdown: app.shutdown, - Bind: []interface{}{ - app, - otherStruct - }, - }) - if err != nil { - log.Fatal(err) - } -} -``` - -More information on Binding can be found [here](../howdoesitwork.mdx#method-binding). - -## Application Menu - -Wails supports adding a menu to your application. This is done by passing a [Menu](../reference/menus.mdx#menu) struct to application config. It's common to use a method that returns a Menu, and even more common for that to be a method on the `App` struct used for the lifecycle hooks. - -```go {11} title="main.go" -func main() { - - app := NewApp() - - err := wails.Run(&options.App{ - Title: "My App", - Width: 800, - Height: 600, - OnStartup: app.startup, - OnShutdown: app.shutdown, - Menu: app.menu(), - Bind: []interface{}{ - app, - }, - }) - if err != nil { - log.Fatal(err) - } -} - -``` - -## Assets - -The great thing about the way Wails v2 handles assets is that it doesn't! The only thing you need to give Wails is an `embed.FS`. How you get to that is entirely up to you. You can use vanilla html/css/js files like the vanilla template. You could have some complicated build system, it doesn't matter. - -When `wails build` is run, it will check the `wails.json` project file at the project root. There are 2 keys in the project file that are read: - -- "frontend:install" -- "frontend:build" - -The first, if given, will be executed in the `frontend` directory to install the node modules. The second, if given, will be executed in the `frontend` directory to build the frontend project. - -If these 2 keys aren't given, then Wails does absolutely nothing with the frontend. It is only expecting that `embed.FS`. - -### AssetsHandler - -A Wails v2 app can optionally define a `http.Handler` in the `options.App`, which allows hooking into the AssetServer to create files on the fly or process POST/PUT requests. GET requests are always first handled by the `assets` FS. If the FS doesn't find the requested file the request will be forwarded to the `http.Handler` for serving. Any requests other than GET will be directly processed by the `AssetsHandler` if specified. It's also possible to only use the `AssetsHandler` by specifiy `nil` as the `Assets` option. - -## Built in Dev Server - -Running `wails dev` will start the built in dev server which will start a file watcher in your project directory. By default, if any file changes, wails checks if it was an application file (default: `.go`, configurable with `-e` flag). If it was, then it will rebuild your application and relaunch it. If the changed file was in the assets, it will issue a reload after a short amount of time. - -The dev server uses a technique called "debouncing" which means it doesn't reload straight away, as there may be multiple files changed in a short amount of time. When a trigger occurs, it waits for a set amount of time before issuing a reload. If another trigger happens, it resets to the wait time again. By default this value is `100ms`. If this value doesn't work for your project, it can be configured using the `-debounce` flag. If used, this value will be saved to your project config and become the default. - -## External Dev Server - -Some frameworks come with their own live-reloading server, however they will not be able to take advantage of the Wails Go bindings. In this scenario, it is best to run a watcher script that rebuilds the project into the build directory, which Wails will be watching. For an example, see the default svelte template that uses [rollup](https://rollupjs.org/guide/en/). For [create-react-app](https://create-react-app.dev/), it's possible to use [this script](https://gist.github.com/int128/e0cdec598c5b3db728ff35758abdbafd) to achieve a similar result. - -## Go Module - -The default Wails templates generate a `go.mod` file that contains the module name "changeme". You should change this to something more appropriate after project generation. diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/bleeding-edge.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/bleeding-edge.mdx deleted file mode 100644 index b81cc79dc..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/bleeding-edge.mdx +++ /dev/null @@ -1,55 +0,0 @@ -# Bleeding Edge - -## Overview - -Wails is in constant development and new releases are regularly "tagged". This usually happens when all the newer code on `master` has been tested and confirmed working. If you need a bugfix or feature that has not yet made it to a release, it's possible to use the latest "bleeding edge" version using the following steps: - -- `git clone https://github.com/wailsapp/wails` -- `cd wails/v2/cmd/wails` -- `go install` - -NOTE: The directory that you cloned the project into will now be called "clonedir". - -The Wails CLI will now be at the very latest version. - -### Updating your project - -To update projects to use the latest version of the Wails library, update the project's `go.mod` and ensure the following line is at the bottom of the file: - -`replace github.com/wailsapp/wails/v2 => ` - -Example: - -On Windows: `replace github.com/wailsapp/wails/v2 => C:\Users\leaan\Documents\wails-v2-beta\wails\v2` - -On 'nix: `replace github.com/wailsapp/wails/v2 => /home/me/projects/wails/v2` - -To revert to a stable version, run: - -`go install github.com/wailsapp/wails/v2/cmd/wails@latest` - -## Testing a Branch - -If you want to test a branch, follow the instructions above, but ensure you switch the branch you want to test before installing: - -- `git clone https://github.com/wailsapp/wails` -- `cd wails` -- `git checkout -b branch-to-test --track origin/branch-to-test` -- `cd v2/cmd/wails` -- `go install` - -Make sure you [update your project](#updating-your-project) as described above. - -## Testing a PR - -If you want to test a PR, follow the instructions above, but ensure you fetch the PR and switch the branch before installing. Please replace `[IDofThePR]` with the ID of the PR shown on github.com: - -- `git clone https://github.com/wailsapp/wails` -- `cd wails` -- `git fetch -u origin pull/[IDofThePR]/head:test/pr-[IDofThePR]` -- `git checkout test/pr-[IDofThePR]` -- `git reset --hard HEAD` -- `cd v2/cmd/wails` -- `go install` - -Make sure you [update your project](#updating-your-project) as described above. diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/dynamic-assets.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/dynamic-assets.mdx deleted file mode 100644 index 77ad6d09e..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/dynamic-assets.mdx +++ /dev/null @@ -1,126 +0,0 @@ -# Dynamic Assets - -If you want to load or generate assets for your frontend dynamically, you can achieve that using the [AssetsHandler](../reference/options#assetshandler) option. The AssetsHandler is a generic `http.Handler` which will be called for any non GET request on the assets server and for GET requests which can not be served from the bundled assets because the file is not found. - -By installing a custom AssetsHandler, you can serve your own assets using a custom asset server. - -## Example - -In our example project, we will create a simple assets handler which will load files off disk: - -```go title=main.go {16-35,49} -package main - -import ( - "embed" - "fmt" - "github.com/wailsapp/wails/v2" - "github.com/wailsapp/wails/v2/pkg/options" - "net/http" - "os" - "strings" -) - -//go:embed frontend/dist -var assets embed.FS - -type FileLoader struct { - http.Handler -} - -func NewFileLoader() *FileLoader { - return &FileLoader{} -} - -func (h *FileLoader) ServeHTTP(res http.ResponseWriter, req *http.Request) { - var err error - requestedFilename := strings.TrimPrefix(req.URL.Path, "/") - println("Requesting file:", requestedFilename) - fileData, err := os.ReadFile(requestedFilename) - if err != nil { - res.WriteHeader(http.StatusBadRequest) - res.Write([]byte(fmt.Sprintf("Could not load file %s", requestedFilename))) - } - - res.Write(fileData) -} - -func main() { - // Create an instance of the app structure - app := NewApp() - - // Create application with options - err := wails.Run(&options.App{ - Title: "helloworld", - Width: 1024, - Height: 768, - Assets: assets, - BackgroundColour: &options.RGBA{R: 27, G: 38, B: 54, A: 255}, - OnStartup: app.startup, - AssetsHandler: NewFileLoader(), - Bind: []interface{}{ - app, - }, - }) - - if err != nil { - println("Error:", err) - } -} -``` - -When we run the application in dev mode using `wails dev`, we will see the following output: - -``` -DEB | [ExternalAssetHandler] Loading 'http://localhost:3001/favicon.ico' -DEB | [ExternalAssetHandler] Loading 'http://localhost:3001/favicon.ico' failed, using AssetHandler -Requesting file: favicon.ico -``` - -As you can see, the assets handler is called when the default assets server is unable to serve the `favicon.ico` file. - -If you right click the main application and select "inspect" to bring up the devtools, you can test this feature out by typing the following into the console: - -``` -let response = await fetch('does-not-exist.txt'); -``` - -This will generate an error in the devtools. We can see that the error is what we expect, returned by our custom assets handler: - -

- -

- -However, if we request `go.mod`, we will see the following output: - -

- -

- -This technique can be used to load images directly into the page. If we updated our default vanilla template and replaced the logo image: - -```html - -``` - -with: - -```html - -``` - -Then we would see the following: - -

- -

- -:::warning -Exposing your filesystem in this way is a security risk. It is recommended that you properly manage access -to your filesystem. -::: diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/frameless.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/frameless.mdx deleted file mode 100644 index c7ca5f6c3..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/frameless.mdx +++ /dev/null @@ -1,84 +0,0 @@ -# Frameless Applications - -Wails supports application that have no frames. This can be achieved by using the [frameless](../reference/options.mdx#frameless) field in [Application Options](../reference/options.mdx#application-options). - -Wails offers a simple solution for dragging the window: Any HTML element that has the CSS style `--wails-draggable:drag` will act as a "drag handle". This property applies to all child elements. If you need to indicate that a nested element should not drag, then use the attribute '--wails-draggable:no-drag' on that element. - - -```html - - - - - - - -
- - -
-
- - - - -``` - -For some projects, using a CSS variable may not be possible due to dynamic styling. In this case, you can use the `CSSDragProperty` and `CSSDragValue` application options to define a property and value that will be used to indicate draggable regions: - -```go title=main.go -package main - -import ( - "embed" - - "github.com/wailsapp/wails/v2" - "github.com/wailsapp/wails/v2/pkg/options" -) - -//go:embed frontend/dist -var assets embed.FS - -func main() { - // Create an instance of the app structure - app := NewApp() - - // Create application with options - err := wails.Run(&options.App{ - Title: "alwaysontop", - Width: 1024, - Height: 768, - Assets: assets, - Frameless: true, - CSSDragProperty: "widows", - CSSDragValue: "1", - Bind: []interface{}{ - app, - }, - }) - - if err != nil { - println("Error:", err) - } -} -``` - -```html title=index.html - - - - - - alwaysontop - - -
- - - - -``` - -:::info Fullscreen - If you allow your application to go fullscreen, this drag functionality will be disabled. -::: diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/frontend.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/frontend.mdx deleted file mode 100644 index 4b192c557..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/frontend.mdx +++ /dev/null @@ -1,75 +0,0 @@ -# Frontend - -## Script Injection - -When Wails serves your `index.html`, by default, it will inject 2 script entries into the `` tag to load `/wails/ipc.js` and `/wails/runtime.js`. These files install the bindings and runtime respectively. - -The code below shows where these are injected by default: - -```html - - - injection example - - - - - - - -
Please enter your name below 👇
-
- - -
- - - - - -``` - -### Overriding Default Script Injection - -To provide more flexibility to developers, there is a meta tag that may be used to customise this behaviour: - -```html - -``` - -The options are as follows: - -| Value | Description | -| ------------------- | ------------------------------------------------ | -| noautoinjectruntime | Disable the autoinjection of `/wails/runtime.js` | -| noautoinjectipc | Disable the autoinjection of `/wails/ipc.js` | -| noautoinject | Disable all autoinjection of scripts | - -Multiple options may be used provided they are comma seperated. - -This code is perfectly valid and operates the same as the autoinjection version: - -```html - - - - injection example - - - - - - -
Please enter your name below 👇
-
- - -
- - - - - - - -``` diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/ides.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/ides.mdx deleted file mode 100644 index a20ae4131..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/ides.mdx +++ /dev/null @@ -1,113 +0,0 @@ -# IDEs - -Wails aims to provide a great development experience. To that aim, we now support generating IDE specific configuration to provide smoother project setup. - -Currently, we support [Visual Studio Code](https://code.visualstudio.com/) but aim to support other IDEs such as Goland. - -## Visual Studio Code - -

- -

- -When generating a project using the `-ide vscode` flags, IDE files will be created alongside the other project files. These files are placed into the `.vscode` directory and provide the correct configuration for debugging your application. - -The 2 files generated are `tasks.json` and `launch.json`. Below are the files generated for the default vanilla project: - -```json title="tasks.json" -{ - "version": "2.0.0", - "tasks": [ - { - "label": "build", - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "command": "go", - "args": ["build", "-tags", "dev", "-gcflags", "all=-N -l", "-o", "build/bin/myproject.exe"] - }, - ] -} -``` - -```json title="launch.json" -{ - "version": "0.2.0", - "configurations": [ - { - "name": "Wails: Debug myproject", - "type": "go", - "request": "launch", - "mode": "exec", - "program": "${workspaceFolder}/build/bin/myproject.exe", - "preLaunchTask": "build", - "cwd": "${workspaceFolder}", - "env": {} - }, - ] -} -``` - -### Configuring the install and build steps - -The `tasks.json` file is simple for the default project as there is no `npm install` or `npm run build` step needed. For projects that have a frontend build step, such as the svelte template, we would need to edit `tasks.json` to add the install and build steps: - -```json title="tasks.json" -{ - "version": "2.0.0", - "tasks": [ - { - "label": "npm install", - "type": "npm", - "script": "install", - "options": { - "cwd": "${workspaceFolder}/frontend" - }, - "presentation": { - "clear": true, - "panel": "shared", - "showReuseMessage": false - }, - "problemMatcher": [] - }, - { - "label": "npm run build", - "type": "npm", - "script": "build", - "options": { - "cwd": "${workspaceFolder}/frontend" - }, - "presentation": { - "clear": true, - "panel": "shared", - "showReuseMessage": false - }, - "problemMatcher": [] - }, - { - "label": "build", - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "command": "go", - "args": ["build", "-tags", "dev", "-gcflags", "all=-N -l", "-o", "build/bin/vscode.exe"], - "dependsOn":[ - "npm install", - "npm run build" - ] - - }, - ] -} -``` - -:::info Future Enhancement - -In the future, we hope to generate a `tasks.json` that includes the install and build steps automatically. - -::: diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/linux-distro-support.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/linux-distro-support.mdx deleted file mode 100644 index 28a224a26..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/linux-distro-support.mdx +++ /dev/null @@ -1,101 +0,0 @@ -# Linux Distro Support - -## Overview - -Wails offers Linux support but providing installation instructions for all available distributions is an impossible task. Instead, Wails tries to determine if the packages you need to develop applications are available via your system's package manager. Currently, we support the following package managers: - -- apt -- dnf -- emerge -- eopkg -- nixpkgs -- pacman -- zypper - -## Adding package names - -There may be circumstances where your distro uses one of the supported package managers but the package name is different. For example, you may use an Ubuntu derivative, but the package name for gtk may be different. Wails attempts to find the correct package by iterating through a list of package names. The list of packages are stored in the packagemanager specific file in the `v2/internal/system/packagemanager` directory. In our example, this would be `v2/internal/system/packagemanager/apt.go`. - -In this file, the list of packages are defined by the `Packages()` method: - -```go -func (a *Apt) Packages() packagemap { - return packagemap{ - "libgtk-3": []*Package{ - {Name: "libgtk-3-dev", SystemPackage: true, Library: true}, - }, - "libwebkit": []*Package{ - {Name: "libwebkit2gtk-4.0-dev", SystemPackage: true, Library: true}, - }, - "gcc": []*Package{ - {Name: "build-essential", SystemPackage: true}, - }, - "pkg-config": []*Package{ - {Name: "pkg-config", SystemPackage: true}, - }, - "npm": []*Package{ - {Name: "npm", SystemPackage: true}, - }, - "docker": []*Package{ - {Name: "docker.io", SystemPackage: true, Optional: true}, - }, - } -} -``` - -Let's assume that in our linux distro, `libgtk-3` is packaged under the name `lib-gtk3-dev`. We could add support for this by adding the following line: - -```go {5} -func (a *Apt) Packages() packagemap { - return packagemap{ - "libgtk-3": []*Package{ - {Name: "libgtk-3-dev", SystemPackage: true, Library: true}, - {Name: "lib-gtk3-dev", SystemPackage: true, Library: true}, - }, - "libwebkit": []*Package{ - {Name: "libwebkit2gtk-4.0-dev", SystemPackage: true, Library: true}, - }, - "gcc": []*Package{ - {Name: "build-essential", SystemPackage: true}, - }, - "pkg-config": []*Package{ - {Name: "pkg-config", SystemPackage: true}, - }, - "npm": []*Package{ - {Name: "npm", SystemPackage: true}, - }, - "docker": []*Package{ - {Name: "docker.io", SystemPackage: true, Optional: true}, - }, - } -} -``` - -## Adding new package managers - -To add a new package manager, perform the following steps: - -- Create a new file in `v2/internal/system/packagemanager` called `.go`, where `` is the name of the package manager. -- Define a struct that conforms to the package manager interface defined in `pm.go`: - -```go -type PackageManager interface { - Name() string - Packages() packagemap - PackageInstalled(*Package) (bool, error) - PackageAvailable(*Package) (bool, error) - InstallCommand(*Package) string -} -``` - -- `Name()` should return the name of the package manager -- `Packages()` should return a `packagemap`, that provides candidate filenames for dependencies -- `PackageInstalled()` should return `true` if the given package is installed -- `PackageAvailable()` should return `true` if the given package is not installed but available for installation -- `InstallCommand()` should return the exact command to install the given package name - -Take a look at the other package managers code to get an idea how this works. - -:::info Remember -If you add support for a new package manager, don't forget to also update this page! -::: diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/linux.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/linux.mdx deleted file mode 100644 index 229c282bf..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/linux.mdx +++ /dev/null @@ -1,18 +0,0 @@ -# Linux - -This page has miscellaneous guides related to developing Wails applications for Linux. - -## Video tag doesn't fire "ended" event - -When using a video tag, the "ended" event is not fired when the video is finished playing. This is a bug in WebkitGTK, however you can use the following workaround to fix it: - -```js -videoTag.addEventListener("timeupdate", (event) => { - if (event.target.duration - event.target.currentTime < 0.2) { - let ended = new Event("ended"); - event.target.dispatchEvent(ended); - } -}); -``` - -Source: [Lyimmi](https://github.com/Lyimmi) on the [discussions board](https://github.com/wailsapp/wails/issues/1729#issuecomment-1212291275) diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/manual-builds.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/manual-builds.mdx deleted file mode 100644 index dcf192d33..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/manual-builds.mdx +++ /dev/null @@ -1,95 +0,0 @@ -# Manual Builds - -The Wails CLI does a lot of heavy lifting for the project, but sometimes it's desirable to manually build your project. This document will discuss the different operations the CLI does and how this may be achieved in different ways. - -## Build Process - -When either `wails build` or `wails dev` are used, the Wails CLI performs a common build process: - - - Install frontend dependencies - - Build frontend project - - Generate build assets - - Compile application - - [optional] Compress application - -### Install frontend dependencies - -#### CLI Steps - -- If the `-s` flag is given, this step is skipped -- Checks `wails.json` to see if there is an install command in the key `frontend:install` -- If there isn't, it skips this step -- If there is, it checks if `package.json` exists in the frontend directory. If it doesn't exist, it skips this step -- An MD5 sum is generated from the `package.json` file contents -- It checks for the existence of `package.json.md5` and if it exists, will compare the contents of it (an MD5 sum) with the one generated to see if the contents have changed. If they are the same, this step is skipped -- If `package.json.md5` does not exist, it creates it using the generated MD5 sum -- If a build is now required, or `node_modules` does not exist, or the `-f` flag is given, the install command is executed in the frontend directory - -#### Manual Steps - -This step could be done from the command line or a script with `npm install`. - -### Build frontend project - -#### Wails CLI - -- If the `-s` flag is given, this step is skipped -- Checks `wails.json` to see if there is a build command in the key `frontend:build` -- If there isn't, it skips this step -- If there is, it is executed in the frontend directory - -#### Manual Steps - -This step could be done from the command line or a script with `npm run build` or whatever the frontend build script is. - -### Generate assets - -#### Wails CLI - -- If `-nopackage` flag is set, this stage is skipped -- If the `build/appicon.png` file does not exist, a default one is created -- For Windows, see [Bundling for Windows](#windows) -- If `build/windows/icon.ico` does not exist, it will create it from the `build/appicon.png` image. - -##### Windows - -- If `build/windows/icon.ico` does not exist, it will create it from `build/appicon.png` using icon sizes of 256, 128, 64, 48, 32 and 16. This is done using [winicon](https://github.com/leaanthony/winicon). -- If the `build/windows/.manifest` file does not exist, it creates it from a default version. -- Compiles the application as a production build (above) -- Uses [winres](https://github.com/tc-hib/winres) to bundle the icon and manifest into a `.syso` file ready for linking. - -#### Manual Steps - -- Create `icon.ico` using the [winicon](https://github.com/leaanthony/winicon) CLI tool (or any other tool). -- Create / Update a `.manifest` file for your application -- Use the [winres CLI](https://github.com/tc-hib/go-winres) to generate a `.syso` file. - -### Compile application - -#### Wails CLI - -- If the `-clean` flag is provided, the `build` directory is deleted and recreated -- For `wails dev`, the following default Go flags are used: `-tags dev -gcflags "all=-N -l"` -- For `wails build`, the following default Go flags are used: `-tags desktop,production -ldflags "-w -s"` - - On Windows, `-ldflags "-w -h -H windowsgui"` -- Additional tags passed to the CLI using `-tags` are added to the defaults -- Additional ldflags passed to the CLI using `-ldflags` are added to the defaults -- The `-o` flag is passed through -- The Go compiler specified by `-compiler` will be used for compilation - -#### Manual steps - -- For dev build, the minimum command would be: `go build -tags dev -gcflags "all=-N -l"` -- For production build, the minimum command would be: `go build -tags desktop,production -ldflags "-w -s -H windowsgui"` -- Ensure that you compile in the same directory as the `.syso` file - -### Compress application - -#### Wails CLI - -- If the `-upx` flag has been given, the `upx` program will be run to compress the application with the default settings -- If `-upxflags` is also passed, these flags are used instead of the default ones - -#### Manual steps - -- Run `upx [flags]` manually to compress the application. diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/migrating.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/migrating.mdx deleted file mode 100644 index 2dff1a91b..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/migrating.mdx +++ /dev/null @@ -1,189 +0,0 @@ -# Migrating from v1 - -## Overview - -Wails v2 is a significant change from v1. This document aims to highlight the changes and the steps in migrating an existing project. - -### Creating the Application - -In v1, the main application is created using `wails.CreateApp`, bindings are added with `app.Bind`, then the application is run using `app.Run()`. - -Example: - -```go title="v1" - app := wails.CreateApp(&wails.AppConfig{ - Title: "MyApp", - Width: 1024, - Height: 768, - JS: js, - CSS: css, - Colour: "#131313", - }) - app.Bind(basic) - app.Run() -``` - -In v2, there is just a single method, `wails.Run()`, that accepts [application options](../reference/options.mdx#application-options). - -```go title="v2" - err := wails.Run(&options.App{ - Title: "MyApp", - Width: 800, - Height: 600, - Assets: assets, - Bind: []interface{}{ - basic, - }, - }) -``` - -### Binding - -In v1, it was possible to bind both arbitrary functions and structs. In v2, this has been simplified to only binding structs. The struct instances that were previously passed to the `Bind()` method in v1, are now specified in the `Bind` field of the [application options](../reference/options.mdx#application-options): - -```go title="v1" - app := wails.CreateApp(/* options */) - app.Bind(basic) -``` - -```go title="v2" - err := wails.Run(&options.App{ - /* other options */ - Bind: []interface{}{ - basic, - }, - }) -``` - -In v1, bound methods were available to the frontend at `window.backend`. This has changed to `window.go`.`` - -### Application Lifecycle - -In v1, there were 2 special methods in a bound struct: `WailsInit()` and `WailsShutdown()`. These have been replaced with 3 lifecycle hooks as part of the [application options](../reference/options.mdx#application-options): - -- [OnStartup](../reference/options.mdx#onstartup) -- [OnShutdown](../reference/options.mdx#onshutdown) -- [OnDomReady](../reference/options.mdx#ondomready) - -Note: [OnDomReady](../reference/options.mdx#ondomready) replaces the `wails:ready` system event in v1. - -These methods can be standard functions, but a common practice is to have them part of a struct: - -```go title="v2" - basic := NewBasicApp() - err := wails.Run(&options.App{ - /* Other Options */ - OnStartup: basic.startup, - OnShutdown: basic.shutdown, - OnDomReady: basic.domready, - }) -... -type Basic struct { - ctx context.Context -} -func (b *Basic) startup(ctx context.Context) { - b.ctx = ctx -} -... -``` - -### Runtime - -The runtime in v2 is much richer than v1 with support for menus, window manipulation and better dialogs. The signature of the methods has changed slightly - please refer the the [Runtime Reference](../reference/runtime/intro.mdx). - -In v1, the [runtime](../reference/runtime/intro.mdx) was available via a struct passed to `WailsInit()`. In v2, the runtime has been moved out to its own package. Each method in the runtime takes the `context.Context` that is passed to the [OnStartup](../reference/options.mdx#onstartup) method. - -```go title="Runtime Example" -package main - -import "github.com/wailsapp/wails/v2/pkg/runtime" - -type Basic struct { - ctx context.Context -} - -// startup is called at application startup -func (a *App) startup(ctx context.Context) { - a.ctx = ctx - runtime.LogInfo(ctx, "Application Startup called!") -} -} -} - -``` - -### Assets - -The _biggest_ change in v2 is how assets are handled. - -In v1, assets were passed via 2 application options: - -- `JS` - The application's Javascript -- `CSS` - The application's CSS - -This meant that the responsibility of generating a single JS and CSS file was on the developer. This essentially required the use of complicated packers such as webpack. - -In v2, Wails makes no assumptions about your frontend assets, just like a webserver. All of your application assets are passed to the application options as an `embed.FS`. - -**This means there is no requirement to bundle your assets, encode images as Base64 or attempt the dark art of bundler configuration to use custom fonts**. - -At startup, Wails will scan the given `embed.FS` for `index.html` and use its location as the root path for all the other application assets - just like a webserver would. - -Example: An application has the following project layout. All final assets are placed in the `frontend/dist` directory: - -```shell -. -├── build/ -├── frontend/ -│ └── dist/ -│ ├── index.html -│ ├── main.js -│ ├── main.css -│ └── logo.svg -├── main.go -└── wails.json -``` - -Those assets may be used by the application by simply creating an `embed.FS`: - -```go title="Assets Example" -//go:embed frontend/dist -var assets embed.FS - -func main() { - err := wails.Run(&options.App{ - /* Other Options */ - Assets: assets, - }) -} -``` - -Of course, bundlers can be used if you wish to. The only requirement is to pass the final application assets directory to Wails using an `embed.FS` in the `Assets` key of the [application options](../reference/options.mdx#application-options). - -### Project Configuration - -In v1, the project configuration was stored in the `project.json` file in the project root. In v2, the project configuration is stored in the `wails.json` file in the project root. - -The format of the file is slightly different. Here is a comparison: - -

- -| v1 | v2 | Notes | -| ------------------ | ---------------- | --------------------------------------------------- | -| name | name | | -| description | | Removed | -| author / name | author / name | | -| author / email | author / email | | -| version | version | | -| binaryname | outputfilename | Changed | -| frontend / dir | | Removed | -| frontend / install | frontend:install | Changed | -| frontend / build | frontend:build | Changed | -| frontend / bridge | | Removed | -| frontend / serve | | Removed | -| tags | | Removed | -| | wailsjsdir | The directory to generate wailsjs modules | -| | assetdir | The directory of the compiled frontend assets for `dev` mode. This is normally inferred and could be left empty. | -| | reloaddirs | Comma separated list of additional directories to watch for changes and to trigger reloads in `dev` mode. This is only needed for some more advanced asset configurations. | - -

diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/mouse-buttons.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/mouse-buttons.mdx deleted file mode 100644 index 49e9cd69c..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/mouse-buttons.mdx +++ /dev/null @@ -1,25 +0,0 @@ -# Mouse Buttons - -The Wails runtime intercepts mouse clicks to determine whether a frameless window needs resizing or a window needs to be moved. It has been asked how to detect when a mouse click has occurred, because `window.onclick` doesn't report the mouse buttons correctly. The following code shows how to detect mouse clicks: - -```javascript -window.addEventListener('mousedown', handleMouseButtonDown); - -function handleMouseButtonDown(event) { - if (event.button === 0) { - // left mouse button - } else if (event.button === 1) { - // middle mouse button - } else if (event.button === 2) { - // right mouse button - } else if (event.button === 3) { - // back mouse button - } else if (event.button === 4) { - // forward mouse button - } else { - // other mouse button - } -} -``` - -Reference: https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/overscroll.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/overscroll.mdx deleted file mode 100644 index dca7e83a3..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/overscroll.mdx +++ /dev/null @@ -1,10 +0,0 @@ -# Overscroll - -[Overscroll](https://developer.mozilla.org/en-US/docs/Web/CSS/overscroll-behavior) is the "bounce effect" you sometimes get when you scroll beyond a page's content boundaries. This is common in mobile apps. This can be disabled using CSS: - -```css -html { - height: 100%; - overflow: hidden; -} -``` diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/routing.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/routing.mdx deleted file mode 100644 index 5a47814cc..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/routing.mdx +++ /dev/null @@ -1,47 +0,0 @@ -# Routing - -Routing is a popular way to switch views in an application. This page offers some guidance around how to do that. - -## Vue - -The recommended approach for routing in Vue is [Hash Mode](https://next.router.vuejs.org/guide/essentials/history-mode.html#hash-mode): - -```js -import { createRouter, createWebHashHistory } from 'vue-router' - -const router = createRouter({ - history: createWebHashHistory(), - routes: [ - //... - ], -}) -``` - -## Angular - -The recommended approach for routing in Angular is [HashLocationStrategy](https://codecraft.tv/courses/angular/routing/routing-strategies#_hashlocationstrategy): - -```ts -RouterModule.forRoot(routes, {useHash: true}) -``` - -## React - -The recommended approach for routing in React is [HashRouter](https://reactrouter.com/docs/en/v6/routers/hash-router): - -```jsx -import { HashRouter } from "react-router-dom"; - -ReactDOM.render( - - {/* The rest of your app goes here */} - - } exact /> - } /> - } /> - {/* more... */} - - , - root -); -``` diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/signing.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/signing.mdx deleted file mode 100644 index 5f2807a82..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/signing.mdx +++ /dev/null @@ -1,377 +0,0 @@ -# Code Signing - -This is a guide on how you can sign your binaries generated with Wails on MacOS and Windows. The guide will target CI environments, more specifically GitHub Actions. - -## Windows - -First off you need a code signing certificate. If you do not already have one, Microsoft's info page lists some providers [here](https://docs.microsoft.com/en-us/windows-hardware/drivers/dashboard/get-a-code-signing-certificate). Please note that an EV certificate is not required unless you need to write kernel-level software such as device drivers. For signing your Wails app, a standard code signing certificate will do just fine. - -It may be a good idea to check with your certificate provider how to sign your binaries on your local machine before targeting automated build systems, just so you know if there are any special requirements. For instance, [here](https://www.ssl.com/how-to/using-your-code-signing-certificate/) is SSL.com's code signing guide for Windows. If you know how to sign locally, it will be easier to troubleshoot any potential issues in a CI environment. For instance, SSL.com code signing certificates require the `/tr` flag for [SignTool.exe](https://docs.microsoft.com/en-us/windows/win32/seccrypto/signtool) while other providers may only need the `/t` flag for providing the timestamping server. Popular GitHub Actions for signing Windows binaries like [this one](https://github.com/Dana-Prajea/code-sign-action) does not support the `/tr` flag on SignTool.exe. Therefore this guide will focus on signing our app manually with PowerShell commands, but you can use actions like the [code-sign-action](https://github.com/Dana-Prajea/code-sign-action) Action if you prefer. - -First off, let's make sure we are able to build our Wails app in our GitHub CI. Here is a small workflow template: - -```yaml -name: "example" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -- name: Get Wails - run: go install github.com/wailsapp/wails/v2/cmd/wails@latest - - name: Build Wails app - run: | - wails build - - name: upload artifacts macOS - if: matrix.platform == 'macos-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-macos - path: build/bin/* - - name: upload artifacts windows - if: matrix.platform == 'windows-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-windows - path: build/bin/* - jobs: - package: - strategy: - matrix: - platform: [ windows-latest, macos-latest ] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend here, unless you have configured frontend build and install commands in wails.json. -``` - -Next we need to give the GitHub workflow access to our signing certificate. This is done by encoding your .pfx or .p12 certificate into a base64 string. To do this in PowerShell, you can use the following command assuming your certificate is called 'my-cert.p12': - -```PowerShell -certutil -encode .\my-cert.p12 my-cert-base64.txt -``` - -You should now have your .txt file with the base64 encoded certificate. Now you need to make two action secrets on GitHub. It should start with *-----BEGIN CERTIFICATE-----* and end with *-----END CERTIFICATE-----*. Navigate to *Settings -> Secrets -> Actions* and create the two following secrets: - -- **WIN_SIGNING_CERT** with the contents of your base64 encoded certificate text. -- **WIN_SIGNING_CERT_PASSWORD** with the contents of your certificate password. - -Now we're ready to implement the signing in our workflow using one of the two methods: - -### Method 1: signing with commands - -This method uses PowerShell commands to sign our app, and leaves you control over the entire signing process. - -After the `"Build Wails app"` step, we can add the following step to our workflow: - -```yaml -- name: Sign Windows binaries - if: matrix.platform == 'windows-latest' - run: | - echo "Creating certificate file" - New-Item -ItemType directory -Path certificate - Set-Content -Path certificate\certificate.txt -Value '${{ secrets.WIN_SIGNING_CERT }}' - certutil -decode certificate\certificate.txt certificate\certificate.pfx - echo "Signing our binaries" - & 'C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe' sign /fd /t /f certificate\certificate.pfx /p '${{ secrets.WIN_SIGNING_CERT_PASSWORD }}' - -``` - -This script creates a new directory for your certificate file, creates the certificate file from our base64 secret, converts it to a .pfx file, and finally signs the binary. The following variables needs to be replaced in the last line: - -- **signing algorithm**: usually sha256. -- **timestamping server**: URL to the timestamping server to use with your certificate. -- **path to binary**: path to the binary you want to sign. - -Given that our Wails config has `outputfilename` set to "app.exe" and that we have a certificate from SSL.com, this would be our workflow: - -```yaml -name: "example" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -jobs: - package: - strategy: - matrix: - platform: [windows-latest, macos-latest] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend here, unless you have configured frontend build and install commands in wails.json. - - name: Get Wails - run: go install github.com/wailsapp/wails/v2/cmd/wails@latest - - name: Build Wails app - run: | - wails build - - name: Sign Windows binaries - if: matrix.platform == 'windows-latest' - run: | - echo "Creating certificate file" - New-Item -ItemType directory -Path certificate - Set-Content -Path certificate\certificate.txt -Value '${{ secrets.WIN_SIGNING_CERT }}' - certutil -decode certificate\certificate.txt certificate\certificate.pfx - echo "Signing our binaries" - & 'C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe' sign /fd sha256 /tr http://ts.ssl.com /f certificate\certificate.pfx /p '${{ secrets.WIN_SIGNING_CERT_PASSWORD }}' .\build\bin\app.exe - - - name: upload artifacts macOS - if: matrix.platform == 'macos-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-macos - path: build/bin/* - - name: upload artifacts windows - if: matrix.platform == 'windows-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-windows - path: build/bin/* -``` - -### Method 2: automatically signing with Action - -It is possible to use a Windows code signing Action like [this](https://github.com/marketplace/actions/code-sign-a-file-with-pfx-certificate) one, but note it requires a SHA1 hash for the certificate and a certificate name. View an example of how to configure it on the Action's [marketplace](https://github.com/marketplace/actions/code-sign-a-file-with-pfx-certificate). - ---- - -## MacOS - -First off you need your code signing certificate from Apple. If you do not have one, a simple Google search will help you acquire one. Once you have your certificate, you need to export it and encode it to base64. [This tutorial](https://localazy.com/blog/how-to-automatically-sign-macos-apps-using-github-actions) shows you how to do that in an easy manner. Once you have exported your .p12 certificate file, you can encode it to base64 as seen in the tutorial with the following command: - -```bash -base64 Certificates.p12 | pbcopy -``` - -Now you're ready to create some GitHub project secrets, just as with Windows: - -- **APPLE_DEVELOPER_CERTIFICATE_P12_BASE64** with the contents of your newly copied base64 certificate. -- **APPLE_DEVELOPER_CERTIFICATE_PASSWORD** with the contents of your certificate password. -- **APPLE_PASSWORD** with the contents of an App-Specific password to your Apple-ID account which you can generate [here](https://appleid.apple.com/account/manage). - -Let's make sure we are able to build our Wails app in our GitHub Action workflow. Here is a small template: - -```yaml -name: "example" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -jobs: - package: - strategy: - matrix: - platform: [windows-latest, macos-latest] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend here, unless you have configured frontend build and install commands in wails.json. - jobs: - package: - strategy: - matrix: - platform: [ windows-latest, macos-latest ] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend here, unless you have configured frontend build and install commands in wails.json. -``` - -For code signing on macOS, [gon](https://github.com/mitchellh/gon) is a very handy tool for code signing and communicating with Apple servers, also written in Go, and will be used in this guide. - -After the `Build Wails app` step, add the following to the workflow: - -```yaml -- name: MacOS download gon for code signing and app notarization - if: matrix.platform == 'macos-latest' - run: | - brew install mitchellh/gon/gon -``` - -Now we need to configure some gon config files in our `build/darwin` directory: - -1. gon-sign.json: - -```json -{ - "source" : ["./build/bin/app.app"], - "bundle_id" : "app.myapp", - "apple_id": { - "username": "my-appleid@email.com", - "password": "@env:APPLE_PASSWORD" - }, - "sign" :{ - "application_identity" : "Developer ID Application: My Name" - } - } -``` - -Where `source` is your Wails binary, `bundle_id` is your bundle ID, `apple_id` contains your Apple ID username and App-Specific password which you created earlier, and `sign.application_identity` is your identity which you can find by running the following command: - -```bash -security find-identity -v -p codesigning -``` - -2. entitlements.plist: - -```plist - - - - - com.apple.security.app-sandbox - - com.apple.security.network.client - - com.apple.security.network.server - - com.apple.security.files.user-selected.read-write - - com.apple.security.files.downloads.read-write - - - -``` - -In this file you configure the entitlements you need for you app, e.g. camera permissions if your app uses the camera. Read more about entitlements [here](https://developer.apple.com/documentation/bundleresources/entitlements). - -Make sure you have updated your `Info.plist` file with the same bundle ID as you entered in `gon-sign.json`. Here's an example `Info.plist` file: - -```plist - - - CFBundlePackageTypeAPPL - CFBundleNameMyApp - CFBundleExecutableapp - CFBundleIdentifierapp.myapp - CFBundleVersion0.1.0 - CFBundleGetInfoStringMy app is cool and nice and chill and - CFBundleShortVersionString0.1.0 - CFBundleIconFileiconfile - LSMinimumSystemVersion10.13.0 - NSHighResolutionCapabletrue - LSApplicationCategoryTypepublic.app-category.utilities - NSHumanReadableCopyright© Me - -``` - -Now we're ready to add the signing step in our workflow after building the Wails app: - -```yaml -- name: Import Code-Signing Certificates for macOS - if: matrix.platform == 'macos-latest' - uses: Apple-Actions/import-codesign-certs@v1 - with: - # The certificates in a PKCS12 file encoded as a base64 string - p12-file-base64: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_P12_BASE64 }} - # The password used to import the PKCS12 file. - p12-password: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_PASSWORD }} -- name: Sign our macOS binary - if: matrix.platform == 'macos-latest' - run: | - echo "Signing Package" - gon -log-level=info ./build/darwin/gon-sign.json -``` - -Please note that signing binaries with Apple could take anywhere from minutes to hours. - -## Combined workflow file: - -Here is our GitHub workflow file with Windows + macOS combined: - -```yaml -name: "example combined" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -jobs: - package: - strategy: - matrix: - platform: [windows-latest, macos-latest] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend here, unless you have configured frontend build and install commands in wails.json. - - name: Get Wails - run: go install github.com/wailsapp/wails/v2/cmd/wails@latest - - name: Build Wails app - run: | - wails build - - name: MacOS download gon for code signing and app notarization - if: matrix.platform == 'macos-latest' - run: | - brew install mitchellh/gon/gon - - name: Import Code-Signing Certificates for macOS - if: matrix.platform == 'macos-latest' - uses: Apple-Actions/import-codesign-certs@v1 - with: - # The certificates in a PKCS12 file encoded as a base64 string - p12-file-base64: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_P12_BASE64 }} - # The password used to import the PKCS12 file. - - name: Get Wails - run: go install github.com/wailsapp/wails/v2/cmd/wails@latest - - name: Build Wails app - run: | - wails build - - name: MacOS download gon for code signing and app notarization - if: matrix.platform == 'macos-latest' - run: | - brew install mitchellh/gon/gon - - name: Import Code-Signing Certificates for macOS - if: matrix.platform == 'macos-latest' - uses: Apple-Actions/import-codesign-certs@v1 - with: - # The certificates in a PKCS12 file encoded as a base64 string - p12-file-base64: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_P12_BASE64 }} - # The password used to import the PKCS12 file. -``` - -# End notes - -This guide inspired by the RiftShare project and its workflow, which is highly recommended to check out [here](https://github.com/achhabra2/riftshare/blob/main/.github/workflows/build.yaml). diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/templates.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/templates.mdx deleted file mode 100644 index df75cbbc7..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/templates.mdx +++ /dev/null @@ -1,95 +0,0 @@ -# Templates - -Wails generates projects from pre-created templates. In v1, this was a difficult to maintain set of projects that were subject to going out of date. In v2, to empower the community, a couple of new features have been added for templates: - -- Ability to generate projects from [Remote Templates](../reference/cli.mdx#remote-templates) -- Tooling to help create your own templates - -## Creating Templates - -To create a template, you can use the `wails generate template` command. To generate a default template, run: - -`wails generate template -name mytemplate` - -This creates the directory "mytemplate" with default files: - -```shell title=mytemplate/ -. -|-- NEXTSTEPS.md -|-- README.md -|-- app.tmpl.go -|-- frontend -| `-- dist -| |-- assets -| | |-- fonts -| | | |-- OFL.txt -| | | `-- nunito-v16-latin-regular.woff2 -| | `-- images -| | `-- logo-dark.svg -| |-- index.html -| |-- main.css -| `-- main.js -|-- go.mod.tmpl -|-- main.tmpl.go -|-- template.json -`-- wails.tmpl.json -``` - -### Template Overview - -The default template consists of the following files and directories: - -| Filename / Dir | Description | -| --------------- | -------------------------------------------- | -| NEXTSTEPS.md | Instructions on how to complete the template | -| README.md | The README published with the template | -| app.tmpl.go | `app.go` template file | -| frontend/ | The directory containing frontend assets | -| go.mod.tmpl | `go.mod` template file | -| main.tmpl.go | `main.go` template file | -| template.json | The template metadata | -| wails.tmpl.json | `wails.json` template file | - -At this point it is advisable to follow the steps in `NEXTSTEPS.md`. - -## Creating a Template from an Existing Project - -It's possible to create a template from an existing frontend project by passing the path to the project when generating the template. We will now walk through how to create a Vue 3 template: - -- Install the vue cli: `npm install -g @vue/cli` -- Create the default project: `vue create vue3-base` - - Select `Default (Vue 3) ([Vue 3] babel, eslint)` -- After the project has been generated, run: - -```shell -> wails generate template -name wails-vue3-template -frontend .\vue3-base\ -Extracting base template files... -Migrating existing project files to frontend directory... -Updating package.json data... -Renaming package.json -> package.tmpl.json... -Updating package-lock.json data... -Renaming package-lock.json -> package-lock.tmpl.json... -``` - -- The template may now be customised as specified in the `NEXTSTEPS.md` file -- Once the files are ready, it can be tested by running: `wails init -n my-vue3-project -t .\wails-vue3-template\` -- To test the new project, run: `cd my-vue3-project` then `wails build` -- Once the project has compiled, run it: `.\build\bin\my-vue3-project.exe` -- You should have a fully functioning Vue3 application: - -
- -
- -## Publishing Templates - -Publishing a template is simply pushing the files to GitHub. The following best practice is encouraged: - -- Remove any unwanted files and directories (such as `.git`) from your frontend directory -- Ensure that `template.json` is complete, especially `helpurl` -- Push the files to GitHub -- Create a PR on the [Community Templates](../community/templates.mdx) page -- Announce the template on the [Template Announcement](https://github.com/wailsapp/wails/discussions/825) discussion board diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/troubleshooting.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/troubleshooting.mdx deleted file mode 100644 index b6a73efa5..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/troubleshooting.mdx +++ /dev/null @@ -1,137 +0,0 @@ -# Troubleshooting - -An assortment of troubleshooting tips. - -## The `wails` command appears to be missing? - -If your system is reporting that the `wails` command is missing, make sure you have followed the Go installation guide correctly. Normally, it means that the `go/bin` directory in your User's home directory is not in the `PATH` environment variable. You will also normally need to close and reopen any open command prompts so that changes to the environment made by the installer are reflected at the command prompt. - -## My application is displaying a white/blank screen - -Check that your application includes the assets from the correct directory. In your `main.go` file, you will have something similar to the following code: - -```go -//go:embed frontend/dist -var assets embed.FS -``` - -Check that `frontend/dist` contains your application assets. - -### Mac - -If this happens on Mac, try adding the following to your `Info.plist`: - -```xml -NSAppTransportSecurity - - NSAllowsLocalNetworking - - -``` - -Reference: https://github.com/wailsapp/wails/issues/1504#issuecomment-1174317433 - -## Mac application not valid - -If your built application looks like this in finder: - -

- -

- -it's likely that your application's `info.plist` is invalid. Update the file in `build/.app/Contents/info.plist` and check if the data is valid, EG check the binary name is correct. To persist the changes, copy the file back to the `build/darwin` directory. - -## Cannot call backend method from frontend with variadic arguments - -If you have a backend method defined with variadic parameters, eg: - -```go -func (a *App) TestFunc(msg string, args ...interface{}) error { - // Code -} -``` - -calling this method from the frontend like this will fail: - -```js -var msg = "Hello: " -var args = ["Go", "JS"] -window.go.main.App.TestFunc(msg, ...args).then((result) => { - //do things here -}).catch((error) => { - //handle error -}); -``` - -Workaround: - -```js -var msg = "Hello " -var args = ["Go", "JS"] -window.go.main.App.TestFunc(msg, args).then((result) => { //without the 3 dots - //do things here -}).catch((error) => { - //handle error -}); -``` - -Credit: https://github.com/wailsapp/wails/issues/1186 - -## I'm having getting proxy errors when trying to install Wails - -If you are getting errors like this: - -``` -"https://proxy.golang.org/github.com/wailsapp/wails/cmd/wails/@v/list": dial tcp 172.217.163.49:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. -``` - -it's probably because the official Go Proxy is being blocked (Users in China have reported this). The solution is to set up the proxy manually, eg: - -``` -go env -w GO111MODULE=on -go env -w GOPROXY=https://goproxy.cn,direct -``` - -Source: https://github.com/wailsapp/wails/issues/1233 - -## The generated Typescript doesn't have the correct types - -Sometimes the generated Typescript doesn't have the correct types. To mitigate this, it is possible to specify what types should be generated using the `ts_type` struct tag. For more details, please read [this](https://github.com/tkrajina/typescriptify-golang-structs#custom-types). - -## When I navigate away from `index.html`, I am unable to call methods on the frontend - -If you navigate away from `index.html` to a new html file, the context will be lost. This can be fixed by adding the following imports to the `` section of any new page you navigate to: - -```html - - - - -``` - -Source: https://github.com/wailsapp/wails/discussions/1512 - -## I get `too many open files` errors on my Mac when I run `wails dev` - -By default, macOS will only allow you to open a maximum of 256 files. This can affect the `wails dev` command. This limit can be increased by running: `ulimit -n 1024` in the terminal. - -FSNotify is [looking to move to Apple's fsevents](https://github.com/fsnotify/fsnotify/issues/11) for Mac. If this isn't completed soon, we will create our own implementation, tracked [here](https://github.com/wailsapp/wails/issues/1733). - -## My Mac app gives me weird compilation errors - -A few users have reported seeing compilation errors such as the following: - -```shell -# github.com/wailsapp/wails/v2/internal/frontend/desktop/darwin -In file included from ../../pkg/mod/github.com/wailsapp/wails/v2@v2.0.0-beta.44.2/internal/frontend/desktop/darwin/callbacks.go:9: -In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:12: -/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSBundle.h:91:143: error: function does not return NSString -- (NSAttributedString *)localizedAttributedStringForKey:(NSString *)key value:(nullable NSString *)value table:(nullable NSString *)tableName NS_FORMAT_ARGUMENT(1) NS_REFINED_FOR_SWIFT API_AVAILABLE(macos(12.0), ios(15.0), watchos(8.0), tvos(15.0)); - ~~~~~~~~~~~~~~ ^ ~ -/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:103:48: note: expanded from macro 'NS_FORMAT_ARGUMENT' - #define NS_FORMAT_ARGUMENT(A) __attribute__ ((format_arg(A))) -``` - -This is *normally* due to a mismatch with the OS version you are running and the version of the XCode Command Line Tools installed. If you see an error like this, try upgrading your XCode Command Line Tools to the latest version. - -Source: https://github.com/wailsapp/wails/issues/1806 \ No newline at end of file diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/vscode.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/vscode.mdx deleted file mode 100644 index ed258656d..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/vscode.mdx +++ /dev/null @@ -1,82 +0,0 @@ - -# Visual Studio Code - -This page is for miscellaneous tips and tricks when using Visual Studio Code with Wails. - -## Vetur Configuration - -Many thanks to [@Lyimmi](https://github.com/Lyimmi) for this tip. Originally posted [here](https://github.com/wailsapp/wails/issues/1791#issuecomment-1228158349). - -Vetur is a popular plugin for Visual Studio Code that provides syntax highlighting and code completion for Vue projects. When loading a Wails project in VSCode, Vetur will throw an error as it is expecting to find the frontend project in the root directory. To fix this, you can do the following: - -Create a file named `vetur.config.js` in the project's root. - -```javascript -// vetur.config.js -/** @type {import('vls').VeturConfig} */ -module.exports = { - // **optional** default: `{}` - // override vscode settings - // Notice: It only affects the settings used by Vetur. - settings: { - "vetur.useWorkspaceDependencies": true, - "vetur.experimental.templateInterpolationService": true - }, - // **optional** default: `[{ root: './' }]` - // support monorepos - projects: [ - { - // **required** - // Where is your project? - // It is relative to `vetur.config.js`. - // root: './packages/repo1', - root: './frontend', - // **optional** default: `'package.json'` - // Where is `package.json` in the project? - // We use it to determine the version of vue. - // It is relative to root property. - package: './package.json', - // **optional** - // Where is TypeScript config file in the project? - // It is relative to root property. - tsconfig: './tsconfig.json', - // **optional** default: `'./.vscode/vetur/snippets'` - // Where is vetur custom snippets folders? - snippetFolder: './.vscode/vetur/snippets', - // **optional** default: `[]` - // Register globally Vue component glob. - // If you set it, you can get completion by that components. - // It is relative to root property. - // Notice: It won't actually do it. You need to use `require.context` or `Vue.component` - globalComponents: [ - './src/components/**/*.vue' - ] - } - ] -} -``` - -Next, configure `frontend/tsconfig.json`: - -```javascript -{ - "compilerOptions": { - "module": "system", - "noImplicitAny": true, - "removeComments": true, - "preserveConstEnums": true, - "sourceMap": true, - "outFile": "../../built/local/tsc.js", - "allowJs": true - }, - "exclude": [ - "node_modules", - "**/*.spec.ts" - ], - "include": [ - "src/**/*", - "wailsjs/**/*.ts" - ] -} -``` -This should enable you to now use Vetur as expected. diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/windows-installer.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/windows-installer.mdx deleted file mode 100644 index 249ec5527..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/windows-installer.mdx +++ /dev/null @@ -1,56 +0,0 @@ -# NSIS installer - -

- -
-

- -Wails supports generating Windows installers using the [NSIS installer](https://nsis.sourceforge.io/). - -## Installing NSIS - -### Windows - -The installer is available on the [NSIS Download](https://nsis.sourceforge.io/Download) page. - -If you use the chocolatey package manager, run the following script: - -``` -choco install nsis -``` - -If you install NSIS manually, you need to add the *Bin* folder, which contains `makensis.exe`, in your NSIS installation to your path. [Here](https://www.architectryan.com/2018/03/17/add-to-the-path-on-windows-10/) is a good tutorial on how to add to path on Windows. - -### Linux - -The `nsis` package should be available through your distribution's package manager. - -### MacOS - -NSIS is available to install through homebrew: `brew install nsis`. - -## Generating the installer - -When a new project is created, Wails generates the NSIS configuration files in `build/windows/installer`. The config data is read from `installer/info.json` and that is configured to use the project's `wails.json` Info section: - -```json -// ... - "Info": { - "companyName": "My Company Name", - "productName": "Wails Vite", - "productVersion": "1.0.0", - "copyright": "Copyright.........", - "comments": "Built using Wails (https://wails.io)" - }, -``` - -To generate an installer for your application, use the `-nsis` flag with `wails build`: - -``` -wails build -nsis -``` - -The installer will now be available in the `build/bin` directory. diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/windows.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/windows.mdx deleted file mode 100644 index 821808c0b..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/windows.mdx +++ /dev/null @@ -1,61 +0,0 @@ -# Windows - -This page has miscellaneous guides related to developing Wails applications for Windows. - -## Handling the WebView2 Runtime Dependency - -Wails applications built for Windows have a runtime requirement on the Microsoft [WebView2 Runtime](https://developer.microsoft.com/en-us/microsoft-edge/webview2/). Windows 11 will have this installed by default, but some machines won't. Wails offers an easy approach to dealing with this dependency. - -By using the `-webview2` flag when building, you can decide what your application will do when a suitable runtime is not detected (including if the installed runtime is too old). The four options are: - -1. Download -2. Embed -3. Browser -4. Error - -### Download - -This option will prompt the user that no suitable runtime has been found and then offer to download and run the official bootstrapper from Microsoft's WebView2 site. If the user proceeds, the official bootstrapper will be downloaded and run. - -### Embed - -This option embeds the official bootstrapper within the application. If no suitable runtime has been found, the application will offer to run the bootstrapper. This adds ~150k to the binary size. - -### Browser - -This option will prompt the user that no suitable runtime has been found and then offer to open a browser to the official WebView2 page where the bootstrapper can be downloaded and installed. The application will then exit, leaving the installation up to the user. - -### Error - -If no suitable runtime is found, an error is given to the user and no further action taken. - -## Fixed version runtime - -Another way of dealing with webview2 dependency is shipping it yourself. You can download [fixed version runtime](https://developer.microsoft.com/microsoft-edge/webview2/#download-section) and bundle or download it with your application. - -Also, you should specify path to fixed version of webview2 runtime in the `windows.Options` structure when launching wails. - -```go - wails.Run(&options.App{ - Windows: &windows.Options{ - WebviewBrowserPath: "", - }, - }) -``` - -Note: When `WebviewBrowserPath` is specified, `error` strategy will be forced in case of minimal required version mismatch or invalid path to a runtime. - -## Spawning other programs - -When spawning other programs, such as scripts, you will see the window appear on the screen. To hide the window, you can use the following code: - -```go -cmd := exec.Command("your_script.exe") -cmd.SysProcAttr = &syscall.SysProcAttr{ - HideWindow: true, - CreationFlags: 0x08000000, -} -cmd.Start() -``` - -Solution provided by [sithembiso](https://github.com/sithembiso) on the [discussions board](https://github.com/wailsapp/wails/discussions/1734#discussioncomment-3386172). diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/howdoesitwork.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/howdoesitwork.mdx deleted file mode 100644 index 0063b47a6..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/howdoesitwork.mdx +++ /dev/null @@ -1,356 +0,0 @@ ---- -sidebar_position: 20 ---- - -# How does it work? - -A Wails application is a standard Go application, with a webkit frontend. The Go part of the application consists of the application code and a runtime library that provides a number of useful operations, like controlling the application window. The frontend is a webkit window that will display the frontend assets. Also available to the frontend is a Javascript version of the runtime library. Finally, it is possible to bind Go methods to the frontend, and these will appear as Javascript methods that can be called, just as if they were local Javascript methods. - -
- -
- -## The Main Application - -### Overview - -The main application consists of a single call to `wails.Run()`. It accepts the application configuration which describes the size of the application window, the window title, what assets to use, etc. A basic application might look like this: - -```go title="main.go" -package main - -import ( - "embed" - "log" - - "github.com/wailsapp/wails/v2" - "github.com/wailsapp/wails/v2/pkg/options" -) - -//go:embed frontend/dist -var assets embed.FS - -func main() { - - app := &App{} - - err := wails.Run(&options.App{ - Title: "Basic Demo", - Width: 1024, - Height: 768, - Assets: &assets, - OnStartup: app.startup, - OnShutdown: app.shutdown, - Bind: []interface{}{ - app, - }, - }) - if err != nil { - log.Fatal(err) - } -} - - -type App struct { - ctx context.Context -} - -func (b *App) startup(ctx context.Context) { - b.ctx = ctx -} - -func (b *App) shutdown(ctx context.Context) {} - -func (b *App) Greet(name string) string { - return fmt.Sprintf("Hello %s!", name) -} -``` - -### Options rundown - -This example has the following options set: - -- `Title` - The text that should appear in the window's title bar -- `Width` & `Height` - The dimensions of the window -- `Assets` - The application's frontend assets -- `OnStartup` - A callback for when the window is created and is about to start loading the frontend assets -- `OnShutdown` - A callback for when the application is about to quit -- `Bind` - A slice of struct instances that we wish to expose to the frontend - -A full list of application options can be found in the [Options Reference](reference/options). - -#### Assets - -The `Assets` option is mandatory as you can't have a Wails application without frontend assets. Those assets can be any files you would expect to find in a web application - html, js, css, svg, png, etc. **There is no requirement to generate asset bundles** - plain files will do. When the application starts, it will attempt to load `index.html` from your assets and the frontend will essentially work as a browser from that point on. It is worth noting that there is no requirement on where in the `embed.FS` the files live. It is likely that the embed path uses a nested directory relative to your main application code, such as `frontend/dist`: - -```go title="main.go" -//go:embed frontend/dist -var assets embed.FS -``` - -At startup, Wails will iterate the embedded files looking for the directory containing `index.html`. All other assets will be loaded relative to this directory. - -As production binaries use the files contained in `embed.FS`, there are no external files required to be shipped with the application. - -When running in development mode using the `wails dev` command, the assets are loaded off disk, and any changes result in a "live reload". The location of the assets will be inferred from the `embed.FS`. - -More details can be found in the [Application Development Guide](guides/application-development.mdx). - -#### Application Lifecycle Callbacks - -Just before the frontend is about to load `index.html`, a callback is made to the function provided in [OnStartup](reference/options.mdx#onstartup). A standard Go context is passed to this method. This context is required when calling the runtime so a standard pattern is to save a reference to in this method. Just before the application shuts down, the [OnShutdown](reference/options.mdx#onshutdown) callback is called in the same way, again with the context. There is also an [OnDomReady](reference/options.mdx#ondomready) callback for when the frontend has completed loading all assets in `index.html` and is equivalent of the [`body onload`](https://www.w3schools.com/jsref/event_onload.asp) event in Javascript. It is also possible to hook into the window close (or application quit) event by setting the option [OnBeforeClose](reference/options.mdx#onbeforeclose). - -#### Method Binding - -The `Bind` option is one of the most important options in a Wails application. It specifies which struct methods to expose to the frontend. Think of structs like "controllers" in a traditional web application. When the application starts, it examines the struct instances listed in the `Bind` field in the options, determines which methods are public (starts with an uppercase letter) and will generate Javascript versions of those methods that can be called by the frontend code. - -:::info Note - -Wails requires that you pass in an *instance* of the struct for it to bind it correctly - -::: - -In this example, we create a new `App` instance and then add this instance to the `Bind` option in `wails.Run`: - -```go {16,24} title="main.go" -package main - -import ( - "embed" - "log" - - "github.com/wailsapp/wails/v2" - "github.com/wailsapp/wails/v2/pkg/options" -) - -//go:embed frontend/dist -var assets embed.FS - -func main() { - - app := &App{} - - err := wails.Run(&options.App{ - Title: "Basic Demo", - Width: 1024, - Height: 768, - Assets: &assets, - Bind: []interface{}{ - app, - }, - }) - if err != nil { - log.Fatal(err) - } -} - - -type App struct { - ctx context.Context -} - -func (a *App) Greet(name string) string { - return fmt.Sprintf("Hello %s!", name) -} -``` - -You may bind as many structs as you like. Just make sure you create an instance of it and pass it in `Bind`: - -```go {8-10} - //... - err := wails.Run(&options.App{ - Title: "Basic Demo", - Width: 1024, - Height: 768, - Assets: &assets, - Bind: []interface{}{ - app, - &mystruct1{}, - &mystruct2{}, - }, - }) - -``` - -When you run `wails dev` (or `wails generate module`), a frontend module will be generated containing the following: - -- Javascript bindings for all bound methods -- Typescript declarations for all bound methods -- Typescript definitions for all Go structs used as inputs or outputs by the bound methods - -This makes it incredibly simple to call Go code from the frontend, using the same strongly typed datastructures. - -## The Frontend - -### Overview - -The frontend is a collection of files rendered by webkit. It's like a browser and webserver in one. There is virtually[^1] no limit to which frameworks or libraries you can use. The main points of interaction between the frontend and your Go code are: - -- Calling bound Go methods -- Calling runtime methods - -### Calling bound Go methods - -When you run your application with `wails dev`, it will automatically generate Javascript bindings for your structs in a directory called `wailsjs/go` (You can also do this by running `wails generate module`). The generated files mirror the package names in your application. In the example above, we bind `app`, which has one public method `Greet`. This will lead to the generation of the following files: - -```bash -wailsjs - └─go - └─main - ├─App.d.ts - └─App.js -``` - -Here we can see that there is a `main` package that contains the Javascript bindings for the bound `App` struct, as well as the Typescript declaration file for those methods. To call `Greet` from our frontend, we simply import the method and call it like a regular Javascript function: - -```javascript -// ... -import {Greet} from '../wailsjs/go/main/App' - - function doGreeting(name) { - Greet(name).then((result) => { - // Do something with result - }) - } -``` - -The Typescript declaration file gives you the correct types for the bound methods: - -```ts -export function Greet(arg1:string):Promise; -``` - -The generated methods return a Promise. A successful call will result in the first return value from the Go call to be passed to the `resolve` handler. An unsuccessful call is when a Go method that has an error type as it's second return value, passes an error instance back to the caller. This is passed back via the `reject` handler. In the example above, `Greet` only returns a `string` so the Javascript call will never reject - unless invalid data is passed to it. - -All data types are correctly translated between Go and Javascript. Even structs. If you return a struct from a Go call, it will be returned to your frontend as a Javascript class. Note: If you wish to use structs, you **must** define `json` struct tags for your fields! - -:::info Note -Anonymous nested structs are not supported at this time. -::: - -It is possible to send structs back to Go. Any Javascript map/class passed as an argument that is expecting a struct, will be converted to that struct type. To make this process a lot easier, in `dev` mode, a TypeScript module is generated, defining all the struct types used in bound methods. Using this module, it's possible to construct and send native Javascript objects to the Go code. - -There is also support for Go methods that use structs in their signature. All Go structs specified by a bound method (either as parameters or return types) will have Typescript versions auto generated as part of the Go code wrapper module. Using these, it's possible to share the same data model between Go and Javascript. - -Example: We update our `Greet` method to accept a `Person` instead of a string: - -```go title="main.go" -type Person struct { - Name string `json:"name"` - Age uint8 `json:"age"` - Address *Address `json:"address"` -} - -type Address struct { - Street string `json:"street"` - Postcode string `json:"postcode"` -} - -func (a *App) Greet(p Person) string { - return fmt.Sprintf("Hello %s (Age: %d)!", p.Name, p.Age) -} -``` - -The `wailsjs/go/main/App.js` file will still have the following code: - -```js title="App.js" -export function Greet(arg1) { - return window['go']['main']['App']['Greet'](arg1); -} -``` - -But the `wailsjs/go/main/App.d.ts` file will be updated with the following code: - -```ts title="App.d.ts" -import {main} from '../models'; - -export function Greet(arg1:main.Person):Promise; -``` - -As we can see, the "main" namespace is imported from a new "models.ts" file. This file contains all the struct definitions used by our bound methods. In this example, this is a `Person` struct. If we look at `models.ts`, we can see how the models are defined: - -```ts title="models.ts" -export namespace main { - - export class Address { - street: string; - postcode: string; - - static createFrom(source: any = {}) { - return new Address(source); - } - - constructor(source: any = {}) { - if ('string' === typeof source) source = JSON.parse(source); - this.street = source["street"]; - this.postcode = source["postcode"]; - } - } - export class Person { - name: string; - age: number; - address?: Address; - - static createFrom(source: any = {}) { - return new Person(source); - } - - constructor(source: any = {}) { - if ('string' === typeof source) source = JSON.parse(source); - this.name = source["name"]; - this.age = source["age"]; - this.address = this.convertValues(source["address"], Address); - } - - convertValues(a: any, classs: any, asMap: boolean = false): any { - if (!a) { - return a; - } - if (a.slice) { - return (a as any[]).map(elem => this.convertValues(elem, classs)); - } else if ("object" === typeof a) { - if (asMap) { - for (const key of Object.keys(a)) { - a[key] = new classs(a[key]); - } - return a; - } - return new classs(a); - } - return a; - } - } -} -``` - -So long as you have TypeScript as part of your frontend build configuration, you can use these models in the following way: - -```js title="mycode.js" -import {Greet} from '../wailsjs/go/main/App' - import {main} from '../wailsjs/go/models' - - function generate() { - let person = new main.Person() - person.name = "Peter" - person.age = 27 - Greet(person).then((result) => { - console.log(result) - }) - } -``` - -The combination of generated bindings and TypeScript models makes for a powerful development environment. - -More information on Binding can be found in the [Binding Methods](guides/application-development.mdx#binding-methods) section of the [Application Development Guide](guides/application-development.mdx). - -### Calling runtime methods - -The Javascript runtime is located at `window.runtime` and contains many methods to do various tasks such as emit an event or perform logging operations: - -```js title="mycode.js" -window.runtime.EventsEmit("my-event", 1); -``` - -More details about the JS runtime can be found in the [Runtime Reference](reference/runtime/intro). - -[^1]: There is a very small subset of libraries that use features unsupported in WebViews. There are often alternatives and workarounds for such cases. diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/introduction.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/introduction.mdx deleted file mode 100644 index 5a832a69e..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/introduction.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Введение - -Wails - это проект, позволяющий писать настольные приложения с использованием Go и web технологий. - -Считайте, что это легкая и быстрая альтернатива Electron для Go. Вы можете легко создавать приложения с гибкостью и мощностью Go, в сочетании с богатым современным фронтендом. - -### Features - -- Native Menus, Dialogs, Theming and Translucency -- Windows, macOS and linux support -- Built in templates for Svelte, React, Preact, Vue, Lit and Vanilla JS -- Easily call Go methods from Javascript -- Automatic Go struct to Typescript model generation -- No CGO or external DLLs required on Windows -- Live development mode using the power of [Vite](https://vite.net/) -- Powerful CLI to easily Create, Build and Package applications -- A rich [runtime library](/docs/next/reference/runtime) -- Applications built with Wails are Apple & Microsoft Store compliant - - -Например, [varly](https://varly.app) - настольное приложение для MacOS & Windows, написанное с помощью Wails. Оно не только великолепно выглядит, но и использует системные меню и полупрозрачность - все, что можно ожидать от современного нативного приложения. - -

- - - -

- -### Шаблоны для быстрого начала - -Wails поставляется с рядом предварительно настроенных шаблонов, которые позволяют вам быстро создать и запустить ваше приложение. Есть шаблоны для следующих фреймворков: Svelte, React, Vue, Preact, Lit и Vanilla. Для каждого шаблона есть и Javascript и Typescript версия. - -### Системные элементы - -Wails использует специально созданную библиотеку для обработки системных элементов, таких как окна, меню, диалоги и так далее, чтобы вы могли создавать хорошо выглядящие, богатые функционалом приложения. - -**It does not embed a browser**, so it is resource efficient. Вместо этого он использует нативный движок отрисовки для необходимой платформы. На Windows это новая библиотека Microsoft Webview2, основанная на Chromium. - -### Взаимодействие Go & Javascript - -Wails автоматически делает ваши методы на Go доступными в Javascript, чтобы вы могли вызывать их по имени! It even generates Typescript models for the structs used by your Go methods, so you can pass the same data structures between Go and Javascript. - -### Библиотека среды выполнения - -Wails предоставляет библиотеку среды выполнения для Go и Javascript, которая справляется со многими вещями, нужными для современный приложений, например, работа с событими, логирование, диалоги и так далее. - -### Опыт разработки в реальном времени - -#### Автоматическая пересборка - -Когда вы запускаете ваше приложение в режиме разработки, Wails будет собирать его, но читать ресурсы с диска. Он будет отслеживать любые изменения в вашем коде на Go и автоматически пересобирать и перезапускать приложение. - -#### Автоматическая перезагрузка - -When changes to your application assets are detected, your running application will "reload", reflecting your changes almost immediately. - -#### Разрабатывайте приложение в браузере - -Если вы предпочитаете отладку и разработку в браузере, то Wails это умеет. Запущенное приложение также имеет веб-сервер который будет запускать ваше приложение в любом браузере который к нему прилоединится. Он будет перезапускаться когда ресурсы на вашем диске изменятся. - -### Бинарные файлы, готовые к выпуску - -Когда вы готовы сделать финальную сборку вашего приложения, CLI соберет всё в один исполняемый файл со всеми ресурсами внутри. На Windows и MacOS есть возможность создать нативный установочный пакет для распространения. The assets used in packaging (icon, info.plist, manifest file, etc) are part of your project and may be customised, giving you total control over how your applications are built. - -### Инструментарий - -Wails CLI предоставляет легкий способ генерировать, собирать и упаковывать ваши приложения. Оно создаст иконки, соберет ваше приложение с оптимальными параметрами и создаст готовый для распространения исполняемый файл. Выберите из нескольких стартовых шаблонов для быстрого старта! diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/_category_.json b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/_category_.json deleted file mode 100644 index ebb337b83..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Reference", - "position": 40 -} diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/cli.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/cli.mdx deleted file mode 100644 index 5a00db158..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/cli.mdx +++ /dev/null @@ -1,221 +0,0 @@ ---- -sidebar_position: 2 ---- - -# CLI - -The Wails CLI has a number of commands that are used for managing your projects. All commands are run in the following way: - -`wails ` - -## init - -`wails init` is used for generating projects. - -| Flag | Description | Default | -|:------------------ |:----------------------------------------------------------------------------------------------------------------------- |:-------------------:| -| -n "project name" | Name of the project. **Mandatory**. | | -| -d "project dir" | Project directory to create | Name of the project | -| -g | Initialise git repository | | -| -l | List available project templates | | -| -q | Suppress output to console | | -| -t "template name" | The project template to use. This can be the name of a default template or a URL to a remote template hosted on github. | vanilla | -| -ide | Generate IDE project files | | -| -f | Force build application | false | - -Example: `wails init -n test -d mytestproject -g -ide vscode -q` - -This will generate a a project called "test" in the "mytestproject" directory, initialise git, generate vscode project files and do so silently. - -More information on using IDEs with Wails can be found [here](../guides/ides.mdx). - -### Remote Templates - -Remote templates (hosted on GitHub) are supported and can be installed by using the template's project URL. - -Example: `wails init -n test -t https://github.com/leaanthony/testtemplate[@v1.0.0]` - -A list of community maintained templates can be found [here](../community/templates.mdx) - -:::warning Attention - -**The Wails project does not maintain, is not responsible nor liable for 3rd party templates!** - -If you are unsure about a template, inspect `package.json` and `wails.json` for what scripts are run and what packages are installed. - -::: - -## build - -`wails build` is used for compiling your project to a production-ready binary. - -| Flag | Description | Default | -|:-------------------- |:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |:--------------------------------------------------------------------------------------------------------------------------------------------------- | -| -platform | Build for the given (comma delimited) [platforms](../reference/cli.mdx#platforms) eg. `windows/arm64`. Note, if you do not give the architecture, `runtime.GOARCH` is used. | platform = `GOOS` environment variable if given else `runtime.GOOS`.
arch = `GOARCH` envrionment variable if given else `runtime.GOARCH`. | -| -clean | Cleans the `build/bin` directory | | -| -compiler "compiler" | Use a different go compiler to build, eg go1.15beta1 | go | -| -ldflags "flags" | Additional ldflags to pass to the compiler | | -| -nopackage | Do not package application | | -| -o filename | Output filename | | -| -s | Skip building the frontend | false | -| -f | Force build application | false | -| -tags "extra tags" | Build tags to pass to compiler (quoted and space separated) | | -| -upx | Compress final binary using "upx" | | -| -upxflags | Flags to pass to upx | | -| -v int | Verbosity level (0 - silent, 1 - default, 2 - verbose) | 1 | -| -webview2 | WebView2 installer strategy: download,embed,browser,error | download | -| -u | Updates your project's `go.mod` to use the same version of Wails as the CLI | | -| -debug | Retains debug information in the application. Allows the use of the devtools in the application window | false | -| -trimpath | Remove all file system paths from the resulting executable. | false | -| -race | Build with Go's race detector | false | -| -windowsconsole | Keep the console window for Windows builds | false | - -For a detailed description of the `webview2` flag, please refer to the [Windows](../guides/windows.mdx) Guide. - -If you prefer to build using standard Go tooling, please consult the [Manual Builds](../guides/manual-builds.mdx) guide. - -Example: - -`wails build -clean -o myproject.exe` - -:::info UPX on Apple Silicon - -There are [issues](https://github.com/upx/upx/issues/446) with using UPX with Apple Silicon. - -::: - -:::info UPX on Windows - -Some Antivirus vendors false positively mark `upx` compressed binaries as virus, see [issue](https://github.com/upx/upx/issues/437). - -::: - -### Platforms - -Supported platforms are: - -| Platform | Description | -|:---------------- |:--------------------------------------------- | -| darwin | MacOS + architecture of build machine | -| darwin/amd64 | MacOS 10.13+ AMD64 | -| darwin/arm64 | MacOS 11.0+ ARM64 | -| darwin/universal | MacOS AMD64+ARM64 universal application | -| windows | Windows 10/11 + architecture of build machine | -| windows/amd64 | Windows 10/11 AMD64 | -| windows/arm64 | Windows 10/11 ARM64 | -| linux | Linux + architecture of build machine | -| linux/amd64 | Linux AMD64 | -| linux/arm64 | Linux ARM64 | - -## doctor - -`wails doctor` will run diagnostics to ensure that your system is ready for development. - -Example: - -``` -Wails CLI v2.0.0-beta - -Scanning system - Please wait (this may take a long time)...Done. - -System ------- -OS: Windows 10 Pro -Version: 2009 (Build: 19043) -ID: 21H1 -Go Version: go1.17 -Platform: windows -Architecture: amd64 - -Dependency Package Name Status Version ----------- ------------ ------ ------- -WebView2 N/A Installed 93.0.961.52 -npm N/A Installed 6.14.15 -*upx N/A Installed upx 3.96 - -* - Optional Dependency - -Diagnosis ---------- -Your system is ready for Wails development! - -``` - -## dev - -`wails dev` is used to run your application in a "live development" mode. This means: - -- The application's `go.mod` will be updated to use the same version of Wails as the CLI -- The application is compiled and run automatically -- A watcher is started and will trigger a rebuild of your dev app if it detects changes to your go files -- A webserver is started on `http://localhost:34115` which serves your application (not just frontend) over http. This allows you to use your favourite browser development extensions -- All application assets are loaded from disk. If they are changed, the application will automatically reload (not rebuild). All connected browsers will also reload -- A JS module is generated that provides the following: - - Javascript wrappers of your Go methods with autogenerated JSDoc, providing code hinting - - TypeScript versions of your Go structs, that can be constructed and passed to your go methods -- A second JS module is generated that provides a wrapper + TS declaration for the runtime - -| Flag | Description | Default | -|:---------------------------- |:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |:--------------------- | -| -assetdir "./path/to/assets" | Serve assets from the given directory instead of using the provided asset FS | Value in `wails.json` | -| -browser | Opens a browser to `http://localhost:34115` on startup | | -| -compiler "compiler" | Use a different go compiler to build, eg go1.15beta1 | go | -| -e | Extensions to trigger rebuilds (comma separated) | go | -| -reloaddirs | Additional directories to trigger reloads (comma separated) | Value in `wails.json` | -| -ldflags "flags" | Additional ldflags to pass to the compiler | | -| -tags "extra tags" | Build tags to pass to compiler (quoted and space separated) | | -| -loglevel "loglevel" | Loglevel to use - Trace, Debug, Info, Warning, Error | Debug | -| -noreload | Disable automatic reload when assets change | | -| -nogen | Disable generate module | | -| -v | Verbosity level (0 - silent, 1 - standard, 2 - verbose) | 1 | -| -wailsjsdir | The directory to generate the generated Wails JS modules | Value in `wails.json` | -| -debounce | The time to wait for reload after an asset change is detected | 100 (milliseconds) | -| -devserver "host:port" | The address to bind the wails dev server to | "localhost:34115" | -| -frontenddevserverurl "url" | Use 3rd party dev server url to serve assets, EG Vite | "" | -| -appargs "args" | Arguments passed to the application in shell style | | -| -save | Saves the given `assetdir`, `reloaddirs`, `wailsjsdir`, `debounce`, `devserver` and `frontenddevserverurl` flags in `wails.json` to become the defaults for subsequent invocations. | | -| -race | Build with Go's race detector | false | -| -s | Skip building the frontend | false | - -Example: - -`wails dev -assetdir ./frontend/dist -wailsjsdir ./frontend/src -browser` - -This command will do the following: - -- Build the application and run it (more details [here](../guides/manual-builds.mdx) -- Generate the Wails JS modules in `./frontend/src` -- Watch for updates to files in `./frontend/dist` and reload on any change -- Open a browser and connect to the application - -There is more information on using this feature with existing framework scripts [here](../guides/application-development.mdx#live-reloading). - -## generate - -### template - -Wails uses templates for project generation. The `wails generate template` command helps scaffold a template so that it may be used for generating projects. - -| Flag | Description | -|:---------------- |:------------------------------------------- | -| -name | The template name (Mandatory) | -| -frontend "path" | Path to frontend project to use in template | - -For more details on creating templates, consult the [Templates guide](../guides/templates.mdx). - -### module - -The `wails generate module` command allows you to manually generate the `wailsjs` directory for your application. - -## update - -`wails update` will update the version of the Wails CLI. - -| Flag | Description | -|:------------------ |:------------------------------------- | -| -pre | Update to latest pre-release version | -| -version "version" | Install a specific version of the CLI | - -## version - -`wails version` will simply output the current CLI version. diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/menus.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/menus.mdx deleted file mode 100644 index 565c8cb48..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/menus.mdx +++ /dev/null @@ -1,266 +0,0 @@ ---- -sidebar_position: 4 ---- - -# Menus - -It is possible to add an application menu to Wails projects. This is achieved by defining a [Menu](#menu) struct and setting it in the [`Menu`](../reference/options.mdx#menu) application config, or by calling the runtime method [MenuSetApplicationMenu](../reference/runtime/menu.mdx#menusetapplicationmenu). - -An example of how to create a menu: - -```go - AppMenu := menu.NewMenu() - FileMenu := AppMenu.AddSubmenu("File") - FileMenu.AddText("&Open", keys.CmdOrCtrl("o"), openFile) - FileMenu.AddSeparator() - FileMenu.AddText("Quit", keys.CmdOrCtrl("q"), func(_ *menu.CallbackData) { - runtime.Quit() - }) - - if runtime.GOOS == "darwin" { - AppMenu.Append(menu.EditMenu()) // on macos platform, we should append EditMenu to enable Cmd+C,Cmd+V,Cmd+Z... shortcut - } - - err := wails.Run(&options.App{ - Title: "Menus Demo", - Width: 800, - Height: 600, - Menu: AppMenu, - Bind: []interface{}{ - app, - }, - ) - // ... -``` - -```` It is also possible to dynamically update the menu, by updating the menu struct and calling \[MenuUpdateApplicationMenu\](../reference/runtime/menu.mdx#menuupdateapplicationmenu). - -The example above uses helper methods, however it's possible to build the menu structs manually. - -## Menu - -A Menu is a collection of MenuItems: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -## Menu - -A Menu is a collection of MenuItems: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -type Menu struct { - Items []*MenuItem -} -``` - -For the Application menu, each MenuItem represents a single menu such as "Edit". - -A simple helper method is provided for building menus: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -func NewMenuFromItems(first *MenuItem, rest ...*MenuItem) *Menu -``` - -This makes the layout of the code more like that of a menu without the need to add the menu items manually after creating them. Alternatively, you can just create the menu items and add them to the menu manually. - -## MenuItem - -A MenuItem represents an item within a Menu. - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -// MenuItem represents a menu item contained in a menu -type MenuItem struct { - Label string - Role Role - Accelerator *keys.Accelerator - Type Type - Disabled bool - Hidden bool - Checked bool - SubMenu *Menu - Click Callback -} -``` - -| Field | Type | Notes | -| ----------- | ------------------------------------ | ------------------------------------------------------------- | -| Label | string | The menu text | -| Accelerator | [\*keys.Accelerator](#accelerator) | Key binding for this menu item | -| Type | [Type](#type) | Type of MenuItem | -| Disabled | bool | Disables the menu item | -| Hidden | bool | Hides this menu item | -| Checked | bool | Adds check to item (Checkbox & Radio types) | -| SubMenu | [\*Menu](#menu) | Sets the submenu | -| Click | [Callback](#callback) | Callback function when menu clicked | -| Role | string | Defines a [role](#role) for this menu item. Mac only for now. | - -### Accelerator - -Accelerators (sometimes called keyboard shortcuts) define a binding between a keystroke and a menu item. Wails defines an Accelerator as a combination or key + [Modifier](#modifier). They are available in the `"github.com/wailsapp/wails/v2/pkg/menu/keys"` package. - -Example: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" - // Defines cmd+o on Mac and ctrl-o on Window/Linux - myShortcut := keys.CmdOrCtrl("o") -``` - -Keys are any single character on a keyboard with the exception of `+`, which is defined as `plus`. Some keys cannot be represented as characters so there are a set of named characters that may be used: - -- `backspace` -- `tab` -- `return` -- `enter` -- `escape` -- `left` -- `right` -- `up` -- `down` -- `space` -- `delete` -- `home` -- `end` -- `page up` -- `page down` -- `f1` -- `f2` -- `f3` -- `f4` -- `f5` -- `f6` -- `f7` -- `f8` -- `f9` -- `f10` -- `f11` -- `f12` -- `f13` -- `f14` -- `f15` -- `f16` -- `f17` -- `f18` -- `f19` -- `f20` -- `f21` -- `f22` -- `f23` -- `f24` -- `f25` -- `f26` -- `f27` -- `f28` -- `f29` -- `f30` -- `f31` -- `f32` -- `f33` -- `f34` -- `f35` -- `numlock` - -Wails also supports parsing accelerators using the same syntax as Electron. This is useful for storing accelerators in config files. - -Example: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" - // Defines cmd+o on Mac and ctrl-o on Window/Linux - myShortcut, err := keys.Parse("Ctrl+Option+A") -``` - -#### Modifier - -The following modifiers are keys that may be used in combination with the accelerator key: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" -const ( - // CmdOrCtrlKey represents Command on Mac and Control on other platforms - CmdOrCtrlKey Modifier = "cmdorctrl" - // OptionOrAltKey represents Option on Mac and Alt on other platforms - OptionOrAltKey Modifier = "optionoralt" - // ShiftKey represents the shift key on all systems - ShiftKey Modifier = "shift" - // ControlKey represents the control key on all systems - ControlKey Modifier = "ctrl" -) -``` - -A number of helper methods are available to create Accelerators using modifiers: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" -func CmdOrCtrl(key string) *Accelerator -func OptionOrAlt(key string) *Accelerator -func Shift(key string) *Accelerator -func Control(key string) *Accelerator -``` - -Modifiers can be combined using `keys.Combo(key string, modifier1 Modifier, modifier2 Modifier, rest ...Modifier)`: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" - // Defines "Ctrl+Option+A" on Mac and "Ctrl+Alt+A" on Window/Linux - myShortcut := keys.Combo("a", ControlKey, OptionOrAltKey) -``` - -### Type - -Each menu item must have a type and there are 5 types available: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -const ( - TextType Type = "Text" - SeparatorType Type = "Separator" - SubmenuType Type = "Submenu" - CheckboxType Type = "Checkbox" - RadioType Type = "Radio" -) -``` - -For convenience, helper methods are provided to quickly create a menu item: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -func Text(label string, accelerator *keys.Accelerator, click Callback) *MenuItem -func Separator() *MenuItem -func Radio(label string, selected bool, accelerator *keys.Accelerator, click Callback) *MenuItem -func Checkbox(label string, checked bool, accelerator *keys.Accelerator, click Callback) *MenuItem -func SubMenu(label string, menu *Menu) *Menu -``` - -You can also create menu items directly on a menu by using the "Add" helpers: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -func (m *Menu) AddText(label string, accelerator *keys.Accelerator, click Callback) *MenuItem -func (m *Menu) AddSeparator() *MenuItem -func (m *Menu) AddRadio(label string, selected bool, accelerator *keys.Accelerator, click Callback) *MenuItem -func (m *Menu) AddCheckbox(label string, checked bool, accelerator *keys.Accelerator, click Callback) *MenuItem -func (m *Menu) AddSubMenu(label string, menu *Menu) *MenuI -``` - -A note on radio groups: A radio group is defined as a number of radio menu items that are next to each other in the menu. This means that you do not need to group items together as it is automatic. However, that also means you cannot have 2 radio groups next to each other - there must be a non-radio item between them. - -### Callback - -Each menu item may have a callback that is executed when the item is clicked: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -type Callback func(*CallbackData) - -type CallbackData struct { - MenuItem *MenuItem -} -``` - -The function is given a `CallbackData` struct which indicates which menu item triggered the callback. This is useful when using radio groups that may share a callback. - -### Role - -:::info Roles - -Roles are currently supported on Mac only. - -::: - -A menu item may have a role, which is essentially a pre-defined menu item. We currently support the following roles: - -| Role | Description | -| ------------ | ------------------------------------------------------------------------ | -| AppMenuRole | The standard Mac application menu. Can be created using `menu.AppMenu()` | -| EditMenuRole | The standard Mac edit menu. Can be created using `menu.EditMenu()` | diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/options.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/options.mdx deleted file mode 100644 index 90620aa77..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/options.mdx +++ /dev/null @@ -1,627 +0,0 @@ ---- -sidebar_position: 3 ---- - -# Options - -## Application Options - -The `Options.App` struct contains the application configuration. It is passed to the `wails.Run()` method: - -```go title="Example" -import "github.com/wailsapp/wails/v2/pkg/options" - -func main() { - - err := wails.Run(&options.App{ - Title: "Menus Demo", - Width: 800, - Height: 600, - DisableResize: false, - Fullscreen: false, - Frameless: true, - MinWidth: 400, - MinHeight: 400, - MaxWidth: 1280, - MaxHeight: 1024, - StartHidden: false, - HideWindowOnClose: false, - BackgroundColour: &options.RGBA{R: 0, G: 0, B: 0, A: 255}, - AlwaysOnTop: false, - Assets: assets, - AssetsHandler: assetsHandler, - Menu: app.applicationMenu(), - Logger: nil, - LogLevel: logger.DEBUG, - LogLevelProduction: logger.ERROR, - OnStartup: app.startup, - OnDomReady: app.domready, - OnShutdown: app.shutdown, - OnBeforeClose: app.beforeClose, - WindowStartState: options.Maximised, - CSSDragProperty: "--wails-draggable", - CSSDragValue: "drag", - Bind: []interface{}{ - app, - }, - Windows: &windows.Options{ - WebviewIsTransparent: false, - WindowIsTranslucent: false, - DisableWindowIcon: false, - DisableFramelessWindowDecorations: false, - WebviewUserDataPath: "", - WebviewBrowserPath: "", - Theme: windows.SystemDefault, - CustomTheme: &windows.ThemeSettings{ - DarkModeTitleBar: windows.RGB(20, 20, 20), - DarkModeTitleText: windows.RGB(200, 200, 200), - DarkModeBorder: windows.RGB(20, 0, 20), - LightModeTitleBar: windows.RGB(200, 200, 200), - LightModeTitleText: windows.RGB(20, 20, 20), - LightModeBorder: windows.RGB(200, 200, 200), - }, - // User messages that can be customised - Messages *windows.Messages - }, - Mac: &mac.Options{ - TitleBar: &mac.TitleBar{ - TitlebarAppearsTransparent: true, - HideTitle: false, - HideTitleBar: false, - FullSizeContent: false, - UseToolbar: false, - HideToolbarSeparator: true, - }, - Appearance: mac.NSAppearanceNameDarkAqua, - WebviewIsTransparent: true, - WindowIsTranslucent: false, - About: &mac.AboutInfo{ - Title: "My Application", - Message: "© 2021 Me", - Icon: icon, - }, - }, - Linux: &linux.Options{ - Icon: icon, - }, - }) - if err != nil { - log.Fatal(err) - } -} - -``` - -### Title - -The text shown in the window's title bar. - -Type: string - -### Width - -The initial width of the window. - -Name: Width - -### Height - -Type: int - -Type: [AppearanceType](#appearance-type) - -### DisableResize - -By default, the main window is resizable. Setting this to `true` will keep it a fixed size. - -Type: int - -### Fullscreen - -Setting this to `true` will make the window fullscreen at startup. - -Type: int - -### Frameless - -When set to `true`, the window will have no borders or title bar. Also see [Frameless Windows](../guides/frameless.mdx). - -Type: int - -### MinWidth - -This sets the minimum width for the window. If the value given in `Width` is less than this value, the window will be set to `MinWidth` by default. - -Type: bool - -### MinHeight - -This sets the minimum height for the window. If the value given in `Height` is less than this value, the window will be set to `MinHeight` by default. - -Type: bool - -### MaxWidth - -This sets the maximum width for the window. If the value given in `Width` is more than this value, the window will be set to `MaxWidth` by default. - -Type: bool - -### MaxHeight - -This sets the maximum height for the window. If the value given in `Height` is more than this value, the window will be set to `MaxHeight` by default. - -Type: bool - -### StartHidden - -When set to `true`, the application will be hidden until [WindowShow](../reference/runtime/window.mdx#windowshow) is called. - -Type: int -### HideWindowOnClose - -By default, closing the window will close the application. Setting this to `true` means closing the window will hide the window instead. - -hide the window instead. - -Type: int - -### BackgroundColour - -This value is the default background colour of the window. Default: white - -Type: *options.RGBA Example: options.NewRGBA(255,0,0,128) - Red at 50% transparency - -### AlwaysOnTop - -Indicates that the window should stay above other windows when losing focus. - -Type: int - -### Assets - -The frontend assets to be used by the application. Requires an `index.html` file. - -Name: StartHidden - -### AssetsHandler - - - -When set to `true`, the application will be hidden until [WindowShow](../reference/runtime/window.mdx#windowshow) is called. - -| Value | Win | Mac | Lin | -| ----------------------- | --- | --- | --- | -| GET | ✅ | ✅ | ✅ | -| POST | ✅ | ✅ | ❌ | -| PUT | ✅ | ✅ | ❌ | -| PATCH | ✅ | ✅ | ❌ | -| DELETE | ✅ | ✅ | ❌ | -| Request Headers | ✅ | ✅ | ❌ | -| Request Body | ✅ | ✅ | ❌ | -| Request Body Streaming | ❌ | ❌ | ❌ | -| Response StatusCodes | ✅ | ✅ | ❌ | -| Response Headers | ✅ | ✅ | ❌ | -| Response Body | ✅ | ✅ | ✅ | -| Response Body Streaming | ❌ | ❌ | ✅ | - -NOTE: Linux is currently very limited due to targeting a WebKit2GTK Version < 2.36.0. In the future some features will be supported by the introduction of WebKit2GTK 2.36.0+ support. - -NOTE: When used in combination with a Frontend DevServer there might be limitations, eg. Vite serves the index.html on every path, that does not contain a file extension. - -Type: http.Handler - -### Menu - -The menu to be used by the application. More details about Menus in the [Menu Reference](../reference/runtime/menu.mdx). - -NOTE: On Mac, if no menu is specified, a default menu will be created. ::: - -Type: \*menu.Menu - -### Logger - -The logger to be used by the application. More details about logging in the [Log Reference](../reference/runtime/log.mdx). - -Type: bool - -### LogLevel - -The default log level. More details about logging in the [Log Reference](../reference/runtime/log.mdx). - -Name: Assets - -### LogLevelProduction - -The default log level for production builds. More details about logging in the [Log Reference](../reference/runtime/log.mdx). - -Type: logger.LogLevel - -### OnStartup - -This callback is called after the frontend has been created, but before `index.html` has been loaded. It is given the application context. - -Name: AssetsHandler - -### OnDomReady - -This callback is called after the frontend has loaded `index.html` and its resources. It is given the application context. - -Name: AssetsHandler - -### OnShutdown - -This callback is called after the frontend has been destroyed, just before the application terminates. It is given the application context. - -Name: AssetsHandler - -### OnBeforeClose - -If this callback is set, it will be called when the application is about to quit, either by clicking the window close button or calling `runtime.Quit`. Returning true will cause the application to continue, false will continue shutdown as normal. This is good for confirming with the user that they wish to exit the program. - -Example: - -```go title=windowsapp.go -func (b *App) beforeClose(ctx context.Context) (prevent bool) { - dialog, err := runtime.MessageDialog(ctx, runtime.MessageDialogOptions{ - Type: runtime.QuestionDialog, - Title: "Quit?", - Message: "Are you sure you want to quit?", - }) - - if err != nil { - return false - } - return dialog != "Yes" -} -``` - -Type: func(ctx context.Context) bool - -### WindowStartState - -Defines how the window should present itself at startup. - -| Value | Win | Mac | Lin | -| ---------- | --- | --- | --- | -| Fullscreen | ✅ | ✅ | ✅ | -| Maximised | ✅ | ✅ | ✅ | -| Minimised | ✅ | ❌ | ✅ | - -Name: Logger - -### CSSDragProperty - -Indicates the CSS property to use to identify which elements can be used to drag the window. Default: `--wails-draggable`. - -Type: string - -### CSSDragValue - -Indicates what value the `CSSDragProperty` style should have to drag the window. Default: `drag`. - -Type: string - -### Bind - -A slice of struct instances defining methods that need to be bound to the frontend. - -Default: Logger to Stdout - -### Windows - -This defines [Windows specific options](#windows-specific-options). - -Name: LogLevel - -### Mac - -This defines [Mac specific options](#mac-specific-options). - -Default: `Info` in dev mode, `Error` in production mode - -### Linux - -This defines [Linux specific options](#linux-specific-options). - -Name: LogLevelProduction - -## Windows Specific Options - -### WebviewIsTransparent - -Setting this to `true` will make the webview background transparent when an alpha value of `0` is used. This means that if you use `rgba(0,0,0,0)` for `background-color` in your CSS, the host window will show through. Often combined with [WindowIsTranslucent](#WindowIsTranslucent) to make frosty-looking applications. - -Type: int - -### WindowIsTranslucent - -Setting this to `true` will make the window background translucent. Often combined with [WebviewIsTransparent](#WebviewIsTransparent) to make frosty-looking applications. - -Type: int - -### DisableWindowIcon - -Setting this to `true` will remove the icon in the top left corner of the title bar. - -Type: int - -### DisableFramelessWindowDecorations - -Setting this to `true` will remove the window decorations in [Frameless](#Frameless) mode. This means there will be no 'Aero Shadow' and no 'Rounded Corners' shown for the window. Please note that 'Rounded Corners' are only supported on Windows 11. - -Type: int - -### WebviewUserDataPath - -This defines the path where the WebView2 stores the user data. If empty `%APPDATA%\[BinaryName.exe]` will be used. - -Type: string - -### WebviewBrowserPath - -This defines the path to a directory with WebView2 executable files and libraries. If empty, webview2 installed in the system will be used. - -Important information about distribution of fixed version runtime: - -- [How to get and extract runtime](https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution#details-about-the-fixed-version-runtime-distribution-mode) -- [Known issues for fixed version](https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution#known-issues-for-fixed-version) -- [The path of fixed version of the WebView2 Runtime should not contain \Edge\Application\.](https://docs.microsoft.com/en-us/microsoft-edge/webview2/reference/win32/webview2-idl?view=webview2-1.0.1245.22#createcorewebview2environmentwithoptions) - -Type: string - -### Theme - -Minimum Windows Version: Windows 10 2004/20H1 - -This defines the theme that the application should use: - -| Value | Description | -| ------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | -| SystemDefault | *Default*. The theme will be based on the system default. If the user changes their theme, the application will update to use the new setting | -| Dark | The application will use a dark theme exclusively | -| Light | The application will use a light theme exclusively | - -Type: `windows.Theme` - -### CustomTheme - -Name: WindowStartState - -Type: options.WindowStartState - -Type: `windows.CustomTheme` - -#### Name: CustomTheme - -The CustomTheme struct uses `int32` to specify the colour values. These are in the standard(!) Windows format of: `0x00BBGGAA`. A helper function is provided to do RGB conversions into this format: `windows.RGB(r,g,b uint8)`. - -NOTE: Any value not provided will default to black. - -```go -type ThemeSettings struct { - DarkModeTitleBar int32 - DarkModeTitleBarInactive int32 - DarkModeTitleText int32 - DarkModeTitleTextInactive int32 - DarkModeBorder int32 - DarkModeBorderInactive int32 - LightModeTitleBar int32 - LightModeTitleBarInactive int32 - LightModeTitleText int32 - LightModeTitleTextInactive int32 - LightModeBorder int32 - LightModeBorderInactive int32 -} -``` - -Example: - -```go - CustomTheme: &windows.ThemeSettings{ - // Theme to use when window is active - DarkModeTitleBar: windows.RGB(255, 0, 0), // Red - DarkModeTitleText: windows.RGB(0, 255, 0), // Green - DarkModeBorder: windows.RGB(0, 0, 255), // Blue - LightModeTitleBar: windows.RGB(200, 200, 200), - LightModeTitleText: windows.RGB(20, 20, 20), - LightModeBorder: windows.RGB(200, 200, 200), - // Theme to use when window is inactive - DarkModeTitleBarInactive: windows.RGB(128, 0, 0), - DarkModeTitleTextInactive: windows.RGB(0, 128, 0), - DarkModeBorderInactive: windows.RGB(0, 0, 128), - LightModeTitleBarInactive: windows.RGB(100, 100, 100), - LightModeTitleTextInactive: windows.RGB(10, 10, 10), - LightModeBorderInactive: windows.RGB(100, 100, 100), - }, -``` - -### Messages - -Name: Windows - -Type: `*windows.Messages` - -Customise this for any language you choose to support. - -### ResizeDebounceMS - -ResizeDebounceMS is the amount of time to debounce redraws of webview2 when resizing the window. The default value (0) will perform redraws as fast as it can. - -Type: \*mac.Options - -### OnSuspend - -If set, this function will be called when windows initiates a switch to low power mode (suspend/hibernate) - -Name: Linux - -### OnResume - -If set, this function will be called when windows resumes from low power mode (suspend/hibernate) - -Name: Linux - -## Mac Specific Options - -### TitleBar - -The TitleBar struct provides the ability to configure the look and feel of the title bar. - -Type: bool - - -### Appearance - -Appearance is used to set the style of your app in accordance with Apple's [NSAppearance](https://developer.apple.com/documentation/appkit/nsappearancename?language=objc) names. - -Name: WindowIsTranslucent - -### WebviewIsTransparent - -Setting this to `true` will make the webview background transparent when an alpha value of `0` is used. This means that if you use `rgba(0,0,0,0)` for `background-color` in your CSS, the host window will show through. Often combined with [WindowIsTranslucent](#WindowIsTranslucent) to make frosty-looking applications. - -Type: int - -### WindowIsTranslucent - -Setting this to `true` will make the window background translucent. Often combined with [WebviewIsTransparent](#WebviewIsTransparent) to make frosty-looking applications. - -Type: int - -### About - -This configuration lets you set the title, message and icon for the "About" menu item in the app menu created by the "AppMenu" role. - -Name: DisableFramelessWindowDecorations - - -#### Titlebar struct - -The titlebar of the application can be customised by using the TitleBar options: - -```go -type TitleBar struct { - TitlebarAppearsTransparent bool - HideTitle bool - HideTitleBar bool - FullSizeContent bool - UseToolbar bool - HideToolbarSeparator bool -} -``` - -| Name | Description | -| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| TitlebarAppearsTransparent | Makes the titlebar transparent. This has the effect of hiding the titlebar and the content fill the window. [Apple Docs](https://developer.apple.com/documentation/appkit/nswindow/1419167-titlebarappearstransparent?language=objc) | -| HideTitle | Hides the title of the window. [Apple Docs](https://developer.apple.com/documentation/appkit/nswindowtitlevisibility?language=objc) | -| HideTitleBar | Removes [NSWindowStyleMaskTitled](https://developer.apple.com/documentation/appkit/nswindowstylemask/nswindowstylemasktitled/) from the style mask | -| FullSizeContent | Makes the webview fill the entire window. [Apple Docs](https://developer.apple.com/documentation/appkit/nswindowstylemask/nswindowstylemaskfullsizecontentview) | -| UseToolbar | Adds a default toolbar to the window. [Apple Docs](https://developer.apple.com/documentation/appkit/nstoolbar?language=objc) | -| HideToolbarSeparator | Removes the line beneath the toolbar. [Apple Docs](https://developer.apple.com/documentation/appkit/nstoolbar/1516954-showsbaselineseparator?language=objc) | - -Preconfigured titlebar settings are available: - -| Setting | Example | -| --------------------------- | ---------------------------------------------- | -| `mac.TitleBarDefault()` | ![](/img/reference/titlebar-default.webp) | -| `mac.TitleBarHidden()` | ![](/img/reference/titlebar-hidden.webp) | -| `mac.TitleBarHiddenInset()` | ![](/img/reference/titlebar-hidden-inset.webp) | - -Example: - -```go -Mac: &mac.Options{ - TitleBar: mac.TitleBarHiddenInset(), -} -``` - -Click [here](https://github.com/lukakerr/NSWindowStyles) for some inspiration on customising the titlebar. - -#### Appearance type - -You can specify the application's [appearance](https://developer.apple.com/documentation/appkit/nsappearance?language=objc). - -| Value | Description | -| ----------------------------------------------------- | --------------------------------------------------------------- | -| DefaultAppearance | DefaultAppearance uses the default system value | -| NSAppearanceNameAqua | The standard light system appearance | -| NSAppearanceNameDarkAqua | The standard dark system appearance | -| NSAppearanceNameVibrantLight | The light vibrant appearance | -| NSAppearanceNameAccessibilityHighContrastAqua | A high-contrast version of the standard light system appearance | -| NSAppearanceNameAccessibilityHighContrastDarkAqua | A high-contrast version of the standard dark system appearance | -| NSAppearanceNameAccessibilityHighContrastVibrantLight | A high-contrast version of the light vibrant appearance | -| NSAppearanceNameAccessibilityHighContrastVibrantDark | A high-contrast version of the dark vibrant appearance | - -Example: - -```go -Mac: &mac.Options{ - Appearance: mac.NSAppearanceNameDarkAqua, -} -``` - -#### About struct - -```go -type AboutInfo struct { - Title string - Message string - Icon []byte -} -``` - -If these settings are provided, an "About" menu item will appear in the app menu (when using the `AppMenu` role). Given this configuration: - -```go -//go:embed build/appicon.png -var icon []byte - -func main() { - err := wails.Run(&options.App{ - ... - Mac: &mac.Options{ - About: &mac.AboutInfo{ - Title: "My Application", - Message: "© 2021 Me", - Icon: icon, - }, - }, - }) -``` - -The "About" menu item will appear in the app menu: - -
- -
- -
- -When clicked, that will open an about message box: - -
- -
- -
- -## Linux Specific Options - -### Icon - -Sets up the icon representing the window. This icon is used when the window is minimized (also known as iconified). - -Type: []byte - -Some window managers or desktop environments may also place it in the window frame, or display it in other contexts. On others, the icon is not used at all, so your mileage may vary. - -NOTE: Gnome on Wayland at least does not display this icon. To have a application icon there, a `.desktop` file has to be used. On KDE it should work. - -The icon should be provided in whatever size it was naturally drawn; that is, don’t scale the image before passing it. Scaling is postponed until the last minute, when the desired final size is known, to allow best quality. diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/project-config.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/project-config.mdx deleted file mode 100644 index 3dc1cf002..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/project-config.mdx +++ /dev/null @@ -1,51 +0,0 @@ ---- -sidebar_position: 5 ---- - -# Project Config - -The project config resides in the `wails.json` file in the project directory. The structure of the config is: - -```json -{ - "name": "[The project name]", - "assetdir": "[Relative path to the directory containing the compiled assets, this is normally inferred and could be left empty]", - "reloaddirs": "[Additional directories to trigger reloads (comma separated), this is only used for some advanced asset configurations]", - "frontend:install": "[The command to install node dependencies, run in the frontend directory - often `npm install`]", - "frontend:build": "[The command to build the assets, run in the frontend directory - often `npm run build`]", - "frontend:dev": "[This command has been replaced by frontend:dev:build. If frontend:dev:build is not specified will falls back to this command. If this command is also not specified will falls back to frontend:build]", - "frontend:dev:build": "[This command is the dev equivalent of frontend:build. If not specified falls back to frontend:dev]", - "frontend:dev:install": "[This command is the dev equivalent of frontend:install. If not specified falls back to frontend:install]", - "frontend:dev:watcher": "[This command is run in a separate process on `wails dev`. Useful for 3rd party watchers or starting 3d party dev servers]", - "frontend:dev:serverUrl": "[URL to a 3rd party dev server to be used to serve assets, EG Vite. If this is set to 'auto' then the devServerUrl will be inferred from the Vite output]", - "wailsjsdir": "[Relative path to the directory that the auto-generated JS modules will be created]", - "version": "[Project config version]", - "outputfilename": "[The name of the binary]", - "debounceMS": 100, // The default time the dev server waits to reload when it detects a change in assets - "devServer": "[Address to bind the wails dev sever to. Default: localhost:34115]", - "appargs": "[Arguments passed to the application in shell style when in dev mode]", - "runNonNativeBuildHooks": false, // Defines if build hooks should be run though they are defined for an OS other than the host OS. - "preBuildHooks": { - "GOOS/GOARCH": "[The command that will be executed before a build of the specified GOOS/GOARCH: ${platform} is replaced with the "GOOS/GOARCH". The "GOOS/GOARCH" hook is executed before the "GOOS/*" and "*/*" hook.]", - "GOOS/*": "[The command that will be executed before a build of the specified GOOS: ${platform} is replaced with the "GOOS/GOARCH". The "GOOS/*" hook is executed before the "*/*" hook.]", - "*/*": "[The command that will be executed before every build: ${platform} is replaced with the "GOOS/GOARCH".]" - }, - "postBuildHooks": { - "GOOS/GOARCH": "[The command that will be executed after a build of the specified GOOS/GOARCH: ${platform} is replaced with the "GOOS/GOARCH" and ${bin} with the path to the compiled binary. The "GOOS/GOARCH" hook is executed before the "GOOS/*" and "*/*" hook.]", - "GOOS/*": "[The command that will be executed after a build of the specified GOOS: ${platform} is replaced with the "GOOS/GOARCH" and ${bin} with the path to the compiled binary. The "GOOS/*" hook is executed before the "*/*" hook.]", - "*/*": "[The command that will be executed after every build: ${platform} is replaced with the "GOOS/GOARCH" and ${bin} with the path to the compiled binary.]" - }, - "info": { // Data used to populate manifests and version info. - "companyName": "[The company name. Default: [The project name]]", - "productName": "[The product name. Default: [The project name]]", - "productVersion": "[The version of the product. Default: '1.0.0']", - "copyright": "[The copyright of the product. Default: 'Copyright.........']", - "comments": "[A short comment of the app. Default: 'Built using Wails (https://wails.app)']" - }, - "nsisType": "['multiple': One installer per architecture. 'single': Single universal installer for all architectures being built. Default: 'multiple']" -} -``` - -This file is read by the Wails CLI when running `wails build` or `wails dev`. - -The `assetdir`, `reloaddirs`, `wailsjsdir`, `debounceMS`, `devserver` and `frontenddevserverurl` flags in `wails build/dev` will update the project config and thus become defaults for subsequent runs. diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/_category_.json b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/_category_.json deleted file mode 100644 index ac6d55488..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Runtime", - "position": 1 -} diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/browser.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/browser.mdx deleted file mode 100644 index 976ca1d80..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/browser.mdx +++ /dev/null @@ -1,14 +0,0 @@ ---- -sidebar_position: 7 ---- - -# Browser - -These methods are related to the system browser. - -### BrowserOpenURL - -Opens the given URL in the system browser. - -Go: `BrowserOpenURL(ctx context.Context, url string)`
JS: `BrowserOpenURL(url string)` - diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/dialog.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/dialog.mdx deleted file mode 100644 index bf1dd7246..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/dialog.mdx +++ /dev/null @@ -1,283 +0,0 @@ ---- -sidebar_position: 5 ---- - -# Dialog - -This part of the runtime provides access to native dialogs, such as File Selectors and Message boxes. - -:::info Javascript - Dialog is currently unsupported in the JS runtime. -::: - -### OpenDirectoryDialog - -Opens a dialog that prompts the user to select a directory. Can be customised using [OpenDialogOptions](#opendialogoptions). - -Go: `OpenDirectoryDialog(ctx context.Context, dialogOptions OpenDialogOptions) (string, error)` - -Returns: Selected directory (blank if the user cancelled) or an error - -### OpenFileDialog - -Opens a dialog that prompts the user to select a file. Can be customised using [OpenDialogOptions](#opendialogoptions). - -Go: `OpenFileDialog(ctx context.Context, dialogOptions OpenDialogOptions) (string, error)` - -Returns: Selected file (blank if the user cancelled) or an error - -### OpenMultipleFilesDialog - -Opens a dialog that prompts the user to select multiple files. Can be customised using [OpenDialogOptions](#opendialogoptions). - -Go: `OpenMultipleFilesDialog(ctx context.Context, dialogOptions OpenDialogOptions) ([]string, error)` - -Returns: Selected files (nil if the user cancelled) or an error - -### SaveFileDialog - -Opens a dialog that prompts the user to select a filename for the purposes of saving. Can be customised using [SaveDialogOptions](#savedialogoptions). - -Go: `SaveFileDialog(ctx context.Context, dialogOptions SaveDialogOptions) (string, error)` - -Returns: The selected file (blank if the user cancelled) or an error - -### MessageDialog - -Displays a message using a message dialog. Can be customised using [MessageDialogOptions](#messagedialogoptions). - -Go: `MessageDialog(ctx context.Context, dialogOptions MessageDialogOptions) (string, error)` - -Returns: The text of the selected button or an error - -## Options - -### OpenDialogOptions - -```go -type OpenDialogOptions struct { - DefaultDirectory string - DefaultFilename string - Title string - Filters []FileFilter - ShowHiddenFiles bool - CanCreateDirectories bool - ResolvesAliases bool - TreatPackagesAsDirectories bool -} -``` - -| Field | Description | Win | Mac | Lin | -| -------------------------- | ---------------------------------------------- | --- | --- | --- | -| DefaultDirectory | The directory the dialog will show when opened | ✅ | ✅ | ✅ | -| DefaultFilename | The default filename | ✅ | ✅ | ✅ | -| Title | Title for the dialog | ✅ | ✅ | ✅ | -| [Filters](#filefilter) | A list of file filters | ✅ | ✅ | ✅ | -| ShowHiddenFiles | Show files hidden by the system | | ✅ | ✅ | -| CanCreateDirectories | Allow user to create directories | | ✅ | | -| ResolvesAliases | If true, returns the file not the alias | | ✅ | | -| TreatPackagesAsDirectories | Allow navigating into packages | | ✅ | | - -### SaveDialogOptions - -```go -type SaveDialogOptions struct { - DefaultDirectory string - DefaultFilename string - Title string - Filters []FileFilter - ShowHiddenFiles bool - CanCreateDirectories bool - TreatPackagesAsDirectories bool -} -``` - -| Field | Description | Win | Mac | Lin | -| -------------------------- | ---------------------------------------------- | --- | --- | --- | -| DefaultDirectory | The directory the dialog will show when opened | ✅ | ✅ | ✅ | -| DefaultFilename | The default filename | ✅ | ✅ | ✅ | -| Title | Title for the dialog | ✅ | ✅ | ✅ | -| [Filters](#filefilter) | A list of file filters | ✅ | ✅ | ✅ | -| ShowHiddenFiles | Show files hidden by the system | | ✅ | ✅ | -| CanCreateDirectories | Allow user to create directories | | ✅ | | -| TreatPackagesAsDirectories | Allow navigating into packages | | ✅ | | - -### MessageDialogOptions - -```go -type MessageDialogOptions struct { - Type DialogType - Title string - Message string - Buttons []string - DefaultButton string - CancelButton string -} -``` - -| Field | Description | Win | Mac | Lin | -| ------------- | ------------------------------------------------------------------------- | --- | --- | --- | -| Type | The type of message dialog, eg question, info... | ✅ | ✅ | ✅ | -| Title | Title for the dialog | ✅ | ✅ | ✅ | -| Message | The message to show the user | ✅ | ✅ | ✅ | -| Buttons | A list of button titles | | ✅ | | -| DefaultButton | The button with this text should be treated as default. Bound to `return` | | ✅ | | -| CancelButton | The button with this text should be treated as cancel. Bound to `escape` | | ✅ | | - -#### Windows - -Windows has standard dialog types in which the buttons are not customisable. The value returned will be one of: "Ok", "Cancel", "Abort", "Retry", "Ignore", "Yes", "No", "Try Again" or "Continue" - -#### Linux - -Linux has standard dialog types in which the buttons are not customisable. The value returned will be one of: "Ok", "Cancel", "Yes", "No" - -#### Mac - -A message dialog on Mac may specify up to 4 buttons. If no `DefaultButton` or `CancelButton` is given, the first button is considered default and is bound to the `return` key. - -For the following code: - -```go -selection, err := runtime.MessageDialog(b.ctx, runtime.MessageDialogOptions{ - Title: "It's your turn!", - Message: "Select a number", - Buttons: []string{"one", "two", "three", "four"}, -}) -``` - -the first button is shown as default: - -
- -
- -
- -And if we specify `DefaultButton` to be "two": - -```go -selection, err := runtime.MessageDialog(b.ctx, runtime.MessageDialogOptions{ - Title: "It's your turn!", - Message: "Select a number", - Buttons: []string{"one", "two", "three", "four"}, - DefaultButton: "two", -}) -``` - -the second button is shown as default. When `return` is pressed, the value "two" is returned. - -
- -
- -
- -If we now specify `CancelButton` to be "three": - -```go -selection, err := runtime.MessageDialog(b.ctx, runtime.MessageDialogOptions{ - Title: "It's your turn!", - Message: "Select a number", - Buttons: []string{"one", "two", "three", "four"}, - DefaultButton: "two", - CancelButton: "three", -}) -``` - -the button with "three" is shown at the bottom of the dialog. When `escape` is pressed, the value "three" is returned: - -
- -
- -
-
-
- -#### DialogType - -```go -const ( - InfoDialog DialogType = "info" - WarningDialog DialogType = "warning" - ErrorDialog DialogType = "error" - QuestionDialog DialogType = "question" - ) -``` - -### FileFilter - -```go -type FileFilter struct { - DisplayName string // Filter information EG: "Image Files (*.jpg, *.png)" - Pattern string // semi-colon separated list of extensions, EG: "*.jpg;*.png" -} -``` - -#### Windows - -Windows allows you to use multiple file filters in dialog boxes. Each FileFilter will show up as a separate entry in the dialog: - -
- -
- -
-
-
- -#### Linux - -Linux allows you to use multiple file filters in dialog boxes. Each FileFilter will show up as a separate entry in the dialog: - -
- -
- -
-
-
- -#### Mac - -Mac dialogs only have the concept of a single set of patterns to filter files. If multiple FileFilters are provided, Wails will use all the Patterns defined. - -Example: - -```go - selection, err := runtime.OpenFileDialog(b.ctx, runtime.OpenDialogOptions{ - Title: "Select File", - Filters: []runtime.FileFilter{ - { - DisplayName: "Images (*.png;*.jpg)", - Pattern: "*.png;*.jpg", - }, { - DisplayName: "Videos (*.mov;*.mp4)", - Pattern: "*.mov;*.mp4", - }, - }, - }) -``` - -This will result in the Open File dialog using `*.png,*.jpg,*.mov,*.mp4` as a filter. diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/events.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/events.mdx deleted file mode 100644 index 75e8b0a50..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/events.mdx +++ /dev/null @@ -1,38 +0,0 @@ ---- -sidebar_position: 2 ---- - -# Events - -The Wails runtime provides a unified events system, where events can be emitted or received by either Go or Javascript. Optionally, data may be passed with the events. Listeners will receive the data in the local data types. - -### EventsOn - -This method sets up a listener for the given event name. When an event of type `eventName` is [emitted](#EventsEmit), the callback is triggered. Any additional data sent with the emitted event will be passed to the callback. - -Go: `EventsOn(ctx context.Context, eventName string, callback func(optionalData ...interface{}))`
JS: `EventsOn(eventName string, callback function(optionalData?: any))` - -### EventsOff - -This method unregisters the listener for the given event name, optionally multiple listeneres can be unregistered via `additionalEventNames`. - -Go: `EventsOff(ctx context.Context, eventName string, additionalEventNames ...string)`
JS: `EventsOff(eventName string, ...additionalEventNames)` - -### EventsOnce - -This method sets up a listener for the given event name, but will only trigger once. - -Go: `EventsOnce(ctx context.Context, eventName string, callback func(optionalData ...interface{}))`
JS: `EventsOnce(eventName string, callback function(optionalData?: any))` - -### EventsOnMultiple - -This method sets up a listener for the given event name, but will only trigger a maximum of `counter` times. - -Go: `EventsOnMultiple(ctx context.Context, eventName string, callback func(optionalData ...interface{}), counter int)`
JS: `EventsOnMultiple(eventName string, callback function(optionalData?: any), counter int)` - -### EventsEmit - -This method emits the given event. Optional data may be passed with the event. This will trigger any event listeners. - -Go: `EventsEmit(ctx context.Context, eventName string, optionalData ...interface{})`
JS: `EventsEmit(ctx context, optionalData function(optionalData?: any))` - diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/intro.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/intro.mdx deleted file mode 100644 index 6c02c71cd..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/intro.mdx +++ /dev/null @@ -1,73 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Introduction - -The runtime is a library that provides utility methods for your application. There is both a Go and Javascript runtime and the aim is to try and keep them at parity where possible. - -It has utility methods for: - -- [Window](window.mdx) -- [Menu](menu.mdx) -- [Dialog](dialog.mdx) -- [Events](events.mdx) -- [Browser](browser.mdx) -- [Log](log.mdx) - -The Go Runtime is available through importing `github.com/wailsapp/wails/v2/pkg/runtime`. All methods in this package take a context as the first parameter. This context should be obtained from the [OnStartup](../options.mdx#onstartup) or [OnDomReady](../options.mdx#ondomready) hooks. - -:::info Note - -Whilst the context will be provided to the [OnStartup](../options.mdx#onstartup) method, there's no guarantee the runtime will work in this method as the window is initialising in a different thread. If you wish to call runtime methods at startup, use [OnDomReady](../options.mdx#ondomready). - -::: - -The Javascript library is available to the frontend via the `window.runtime` map. There is a runtime package generated when using `dev` mode that provides Typescript declarations for the runtime. This should be located in the `wailsjs` directory in your frontend directory. - -### Hide - -Go: `Hide(ctx context.Context)`
JS: `Hide()` - -Hides the application. - -:::info Note On Mac, this will hide the application in the same way as the `Hide` menu item in standard Mac applications. This is different to hiding the window, but the application still being in the foreground. For Windows and Linux, this is currently the same as `WindowHide`. ::: - -### Show - -Shows the application. - -:::info Note On Mac, this will bring the application back into the foreground. For Windows and Linux, this is currently the same as `WindowShow`. ::: - -Go: `Show(ctx context.Context)`
JS: `Show()` - -### Quit - -Quits the application. - -Go: `Quit(ctx context.Context)`
JS: `Quit()` - -### Environment - -Returns details of the current environment. - -Go: `Environment(ctx context.Context) EnvironmentInfo`
JS: `Environment(): Promise` - -#### EnvironmentInfo - -Go: -```go -type EnvironmentInfo struct { - BuildType string - Platform string - Arch string -} -``` -JS: -```ts -interface EnvironmentInfo { - buildType: string; - platform: string; - arch: string; -} -``` diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/log.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/log.mdx deleted file mode 100644 index e5e6ea7ac..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/log.mdx +++ /dev/null @@ -1,130 +0,0 @@ ---- -sidebar_position: 3 ---- - -# Log - -The Wails runtime provides a logging mechanism that may be called from Go or Javascript. Like most loggers, there are a number of log levels: - -- Trace -- Debug -- Info -- Warning -- Error -- Fatal - -The logger will output any log message at the current, or higher, log level. Example: The `Debug` log level will output all messages except `Trace` messages. - -### LogPrint - -Logs the given message as a raw message. - -Go: `LogPrint(ctx context.Context, message string)`
JS: `LogPrint(message: string)` - -### LogPrintf - -Logs the given message as a raw message. - -Go: `LogPrintf(ctx context.Context, format string, args ...interface{})`
- -### LogTrace - -Logs the given message at the `Trace` log level. - -Go: `LogTrace(ctx context.Context, message string)`
JS: `LogTrace(message: string)` - -### LogTracef - -Logs the given message at the `Trace` log level. - -Go: `LogTracef(ctx context.Context, format string, args ...interface{})`
- -### LogDebug - -Logs the given message at the `Debug` log level. - -Go: `LogDebug(ctx context.Context, message string)`
JS: `LogDebug(message: string)` - -### LogDebugf - -Logs the given message at the `Debug` log level. - -Go: `LogDebugf(ctx context.Context, format string, args ...interface{})`
- -### LogInfo - -Logs the given message at the `Info` log level. - -Go: `LogInfo(ctx context.Context, message string)`
JS: `LogInfo(message: string)` - -### LogInfof - -Logs the given message at the `Info` log level. - -Go: `LogInfof(ctx context.Context, format string, args ...interface{})`
- -### LogWarning - -Logs the given message at the `Warning` log level. - -Go: `LogWarning(ctx context.Context, message string)`
JS: `LogWarning(message: string)` - -### LogWarningf - -Logs the given message at the `Warning` log level. - -Go: `LogWarningf(ctx context.Context, format string, args ...interface{})`
- -### LogError - -Logs the given message at the `Error` log level. - -Go: `LogError(ctx context.Context, message string)`
JS: `LogError(message: string)` - -### LogErrorf - -Logs the given message at the `Error` log level. - -Go: `LogErrorf(ctx context.Context, format string, args ...interface{})`
- -### LogFatal - -Logs the given message at the `Fatal` log level. - -Go: `LogFatal(ctx context.Context, message string)`
JS: `LogFatal(message: string)` - -### LogFatalf - -Logs the given message at the `Fatal` log level. - -Go: `LogFatalf(ctx context.Context, format string, args ...interface{})`
- -### LogSetLogLevel - -Sets the log level. In Javascript, the number relates to the following log levels: - -| Value | Log Level | -| ----- | --------- | -| 1 | Trace | -| 2 | Debug | -| 3 | Info | -| 4 | Warning | -| 5 | Error | - -Go: `LogSetLogLevel(ctx context.Context, level logger.LogLevel)`
JS: `LogSetLogLevel(level: number)` - -## Using a Custom Logger - -A custom logger may be used by providing it using the [Logger](../options.mdx#logger) application option. The only requirement is that the logger implements the `logger.Logger` interface defined in `github.com/wailsapp/wails/v2/pkg/logger`: - -```go title="logger.go" -type Logger interface { - Print(message string) - Trace(message string) - Debug(message string) - Info(message string) - Warning(message string) - Error(message string) - Fatal(message string) -} -``` diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/menu.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/menu.mdx deleted file mode 100644 index 226ff2c68..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/menu.mdx +++ /dev/null @@ -1,23 +0,0 @@ ---- -sidebar_position: 6 ---- - -# Menu - -These methods are related to the application menu. - -:::info Javascript - Menu is currently unsupported in the JS runtime. -::: - -### MenuSetApplicationMenu - -Sets the application menu to the given [menu](../menus.mdx). - -Go: `MenuSetApplicationMenu(ctx context.Context, menu *menu.Menu)` - -### MenuUpdateApplicationMenu - -Updates the application menu, picking up any changes to the menu passed to `MenuSetApplicationMenu`. - -Go: `MenuUpdateApplicationMenu(ctx context.Context)` diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/window.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/window.mdx deleted file mode 100644 index 3316a45f9..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/window.mdx +++ /dev/null @@ -1,211 +0,0 @@ ---- -sidebar_position: 4 ---- - -# Window - -These methods give control of the application window. - -### WindowSetTitle - -Sets the text in the window title bar. - -Go: `WindowSetTitle(ctx context.Context, title string)`
JS: `WindowSetTitle(title: string)` - -### WindowFullscreen - -Makes the window full screen. - -Go: `WindowFullscreen(ctx context.Context)`
JS: `WindowFullscreen()` - -### WindowUnfullscreen - -Restores the previous window dimensions and position prior to full screen. - -Go: `WindowUnfullscreen(ctx context.Context)`
JS: `WindowUnfullscreen()` - -### WindowIsFullscreen - -Returns true if the window is full screen. - -Go: `WindowCenter(ctx context.Context)`
JS: `WindowCenter()` - -### WindowCenter - -Centers the window on the monitor the window is currently on. - -Go: `WindowReload(ctx context.Context)`
JS: `WindowReload()` - -### WindowReload - -Performs a "reload" (Reloads current page). - -Go: `WindowReloadApp(ctx context.Context)`
JS: `WindowReloadApp()` - -### WindowReloadApp - -Reloads the application frontend. - -Go: `WindowSetSystemDefaultTheme(ctx context.Context)`
JS: `WindowSetSystemDefaultTheme()` - -### WindowSetSystemDefaultTheme - -Windows only. - -Go: `WindowSetDarkTheme(ctx context.Context)`
JS: `WindowSetDarkTheme()` - -Sets window theme to system default (dark/light). - -### WindowSetLightTheme - -Windows only. - -Go: `WindowSetLightTheme(ctx context.Context)`
JS: `WindowSetLightTheme()` - -Sets window theme to light. - -### WindowSetDarkTheme - -Windows only. - -Go: `WindowShow(ctx context.Context)`
JS: `WindowShow()` - -Sets window theme to dark. - -### WindowShow - -Shows the window, if it is currently hidden. - -Go: `WindowHide(ctx context.Context)`
JS: `WindowHide()` - -### WindowHide - -Hides the window, if it is currently visible. - -Go: `WindowSetSize(ctx context.Context, width int, height int)`
JS: `WindowSetSize(size: Size)` - -### WindowIsNormal - -Returns true if the window not minimised, maximised or fullscreen. - -Go: `WindowGetSize(ctx context.Context) (width int, height int)`
JS: `WindowGetSize() : Size` - -### WindowSetSize - -Sets the width and height of the window. - -Go: `WindowSetMaxSize(ctx context.Context, width int, height int)`
JS: `WindowSetMaxSize(size: Size)` - -### WindowGetSize - -Gets the width and height of the window. - -Go: `WindowSetMinSize(ctx context.Context, width int, height int)`
JS: `WindowSetMinSize(size: Size)` - -### WindowSetMinSize - -Sets the minimum window size. Will resize the window if the window is currently smaller than the given dimensions. - -Setting a size of `0,0` will disable this constraint. - -Go: `WindowSetAlwaysOnTop(ctx context.Context, b bool)`
JS: `WindowSetAlwaysOnTop(b: Boolen)` - -### WindowSetMaxSize - -Sets the maximum window size. Will resize the window if the window is currently larger than the given dimensions. - -Setting a size of `0,0` will disable this constraint. - -Go: `WindowSetPosition(ctx context.Context, x int, y int)`
JS: `WindowSetPosition(position: Position)` - -### WindowSetAlwaysOnTop - -Sets the window AlwaysOnTop or not on top. - -Go: `WindowGetPosition(ctx context.Context) (x int, y int)`
JS: `WindowGetPosition() : Position` - -### WindowSetPosition - -Sets the window position relative to the monitor the window is currently on. - -Go: `WindowMaximise(ctx context.Context)`
JS: `WindowMaximise()` - -### WindowGetPosition - -Gets the window position relative to the monitor the window is currently on. - -Go: `WindowUnmaximise(ctx context.Context)`
JS: `WindowUnmaximise()` - -### WindowMaximise - -Maximises the window to fill the screen. - -Go: `WindowToggleMaximise(ctx context.Context)`
JS: `WindowToggleMaximise()` - -### WindowUnmaximise - -Restores the window to the dimensions and position prior to maximising. - -Go: `WindowMinimise(ctx context.Context)`
JS: `WindowMinimise()` - -### WindowIsMaximised - -Returns true if the window is maximised. - -Go: `WindowUnminimise(ctx context.Context)`
JS: `WindowUnminimise()` - -### WindowToggleMaximise - -Toggles between Maximised and UnMaximised. - -Go: `WindowToggleMaximise(ctx context.Context)`
JS: `WindowToggleMaximise()` - -### WindowMinimise - -Minimises the window. - -Go: `WindowSetBackgroundColour(ctx context.Context, R, G, B, A uint8)`
JS: `WindowSetBackgroundColour(R, G, B, A)` - -### WindowUnminimise - -Restores the window to the dimensions and position prior to minimising. - -Go: `WindowUnminimise(ctx context.Context)`
JS: `WindowUnminimise()` - -### WindowIsMinimised - -Returns true if the window is minimised. - -Go: `WindowIsMinimised(ctx context.Context) bool` JS: `WindowIsMinimised() bool` - -### WindowSetBackgroundColour - -Sets the background colour of the window to the given RGBA colour definition. This colour will show through for all transparent pixels. - -Valid values for R, G, B and A are 0-255. - -Any value that is not 0 will be considered 255. :::info Windows -On Windows, only alpha values of 0 or 255 are supported. -::: - -Go: `WindowSetBackgroundColour(ctx context.Context, R, G, B, A uint8)`
JS: `WindowSetBackgroundColour(R, G, B, A)` - -## Typescript Object Definitions - -### Position - -```ts -interface Position { - x: number; - y: number; -} -``` - -### Size - -```ts -interface Size { - w: number; - h: number; -} -``` diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/_category_.json b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/_category_.json deleted file mode 100644 index dfac1d175..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Tutorials", - "position": 70 -} diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/dogsapi.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/dogsapi.mdx deleted file mode 100644 index f4845fdbe..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/dogsapi.mdx +++ /dev/null @@ -1,243 +0,0 @@ ---- -sidebar_position: 20 ---- - -# Dogs API - -
- -
- -
- -:::note This tutorial has been kindly provided by [@tatadan](https://twitter.com/tatadan) and forms part of their [Wails Examples Repository](https://github.com/tataDan/wails-v2-examples). ::: - -In this tutorial we are going to develop an application that retrieves photos of dogs from the web and then displays them. - -### Create the project - -Let's create the application. From a terminal enter: `wails init -n dogs-api -t svelte` - -Note: We could optionally add `-ide vscode` or `-ide goland` to the end of this command if you wanted to add IDE support. - -Now let's `cd dogs-api` and start editing the project files. - -### Remove unused code - -We will start by removing some elements that we know we will not use: - -- Open `app.go` and remove the following lines: - -```go -// Greet returns a greeting for the given name -func (a *App) Greet(name string) string { - return fmt.Sprintf("Hello %s, It's show time!", name) -} -``` - -- Open `frontend/src/App.svelte` and delete all lines. -- Delete the `frontend/src/assets/images/logo-universal.png` file - -### Creating our application - -Now let's add our new Go code. - -Add the following struct declarations to `app.go` before the function definitions: - -```go -type RandomImage struct { - Message string - Status string -} - -type AllBreeds struct { - Message map[string]map[string][]string - Status string -} - -type ImagesByBreed struct { - Message []string - Status string -} -``` - -Add the following functions to `app.go` (perhaps after the existing function definitions): - -```go -func (a *App) GetRandomImageUrl() string { - response, err := http.Get("https://dog.ceo/api/breeds/image/random") - if err != nil { - log.Fatal(err) - } - - responseData, err := ioutil.ReadAll(response.Body) - if err != nil { - log.Fatal(err) - } - - var data RandomImage - json.Unmarshal(responseData, &data) - - return data.Message -} - -func (a *App) GetBreedList() []string { - var breeds []string - - response, err := http.Get("https://dog.ceo/api/breeds/list/all") - if err != nil { - log.Fatal(err) - } - - responseData, err := ioutil.ReadAll(response.Body) - if err != nil { - log.Fatal(err) - } - - var data AllBreeds - json.Unmarshal(responseData, &data) - - for k := range data.Message { - breeds = append(breeds, k) - } - - sort.Strings(breeds) - - return breeds -} - -func (a *App) GetImageUrlsByBreed(breed string) []string { - - url := fmt.Sprintf("%s%s%s%s", "https://dog.ceo/api/", "breed/", breed, "/images") - response, err := http.Get(url) - if err != nil { - log.Fatal(err) - } - - responseData, err := ioutil.ReadAll(response.Body) - if err != nil { - log.Fatal(err) - } - - var data ImagesByBreed - json.Unmarshal(responseData, &data) - - return data.Message -} -``` - -Modify the `import` section of `app.go` to look like this: - -```go -import ( - "context" - "fmt" - "encoding/json" - "io/ioutil" - "log" - "net/http" - "sort" -) -``` - -Add the following lines to `frontend/src/App.svelte`: - -```html - - -

Dogs API

-
- - Click on down arrow to select a breed - - -
-
-{#if showRandomPhoto} - No dog found -{/if} -{#if showBreedPhotos} - {#each photos as photo} - No dog found - {/each} -{/if} - - -``` - -### Testing the application - -To generate the bindings and test the application, run `wails dev`. - -### Compiling the application - -To compile the application to a single, production grade binary, run `wails build`. - - - - - diff --git a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/helloworld.mdx b/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/helloworld.mdx deleted file mode 100644 index ee2814292..000000000 --- a/website/i18n/ru/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/helloworld.mdx +++ /dev/null @@ -1,118 +0,0 @@ ---- -sidebar_position: 10 ---- - -# Hello World - -Цель этого урока — запустить наиболее базовое приложение, использующее Wails. Вы сможете: - -- Создавать новое Wails приложение -- Собирать приложение -- Запускать приложение - -:::note -В этом уроке в качестве целевой платформы используется Windows. Вывод будет варьироваться в -зависимости от вашей операционной системы. -::: - -## Создавать новое Wails приложение - -Чтобы создать новое Wails приложение, использующее стандартный шаблон JS, вам нужно выполнить следующую команду: - -```bash -wails init -n helloworld -``` - -Вы должны увидеть что-то похожее на следующее: - -``` -Wails CLI v2.0.0 - -Initialising Project 'helloworld' ---------------------------------- - -Project Name: helloworld -Project Directory: C:\Users\leaan\tutorial\helloworld -Project Template: vanilla -Template Support: https://wails.io - -Initialised project 'helloworld' in 232ms. -``` - -Это создаст новый каталог под названием `helloworld` в текущей директории. В этом каталоге вы найдете несколько файлов: - -``` -build/ - Содержит файлы сборки + собранное приложение -frontend/ - Содержит файлы интерфейса -app.go - Содержит код приложения -main.go - Основная программа с настройками приложения -wails.json - Файл настройки проекта -go.mod - Файл модуля Go -go.sum - Файл контрольной суммы модуля Go -``` - -## Собирать приложение - -Чтобы собрать приложение, перейдите в новую директорию `helloworld` и запустите следующую команду: - -```bash -wails build -``` - -Вы должны увидеть что-то похожее на следующее: - -``` -Wails CLI v2.0.0 - -App Type: desktop -Platforms: windows/amd64 -Compiler: C:\Users\leaan\go\go1.18.3\bin\go.exe -Build Mode: Production -Skip Frontend: false -Compress: false -Package: true -Clean Build Dir: false -LDFlags: "" -Tags: [] -Race Detector: false - -Building target: windows/amd64 ------------------------------- - - Installing frontend dependencies: Done. - - Compiling frontend: Done. - - Generating bundle assets: Done. - - Compiling application: Done. -Built 'C:\Users\leaan\tutorial\helloworld\build\bin\helloworld.exe' in 10.616s. -``` - -Приложение собрано и сохранено в папке `build/bin`. - -## Запускать приложение - -Если мы откроем папку `build/bin` в Проводнике, то увидим исполняемый файл проекта: - -
- -
- -
- -Мы можем запустить его, просто дважды щелкнув по файлу `helloworld.exe`. - -На Mac, Wails генерирует файл `helloworld.app` который может быть запущен двойным щелчком. - -На Linux вы можете запустить приложение с помощью файла `./helloworld` из папки `build/bin`. - -Вы должны видеть приложение, работающее так, как ожидалось: - -
- -
-
diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-beta.44.json b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-beta.44.json deleted file mode 100644 index 54beb8d1a..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-beta.44.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "version.label": { - "message": "v2.0.0-beta.44", - "description": "The label for version v2.0.0-beta.44" - }, - "sidebar.tutorialSidebar.category.Getting Started": { - "message": "快速入门", - "description": "The label for category Getting Started in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Reference": { - "message": "参考", - "description": "The label for category Reference in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Runtime": { - "message": "运行时", - "description": "The label for category Runtime in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Community": { - "message": "社区", - "description": "The label for category Community in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Showcase": { - "message": "案例展示", - "description": "The label for category Showcase in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Guides": { - "message": "指南", - "description": "The label for category Guides in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Tutorials": { - "message": "教程", - "description": "The label for category Tutorials in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.Contributing": { - "message": "参与贡献", - "description": "The label for category Contributing in sidebar tutorialSidebar" - } -} diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1.json b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1.json deleted file mode 100644 index 9d6bd1b1a..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "version.label": { - "message": "v2.0.0-rc.1", - "description": "The label for version v2.0.0-rc.1" - }, - "sidebar.docs.category.Getting Started": { - "message": "快速入门", - "description": "The label for category Getting Started in sidebar docs" - }, - "sidebar.docs.category.Reference": { - "message": "参考", - "description": "The label for category Reference in sidebar docs" - }, - "sidebar.docs.category.Runtime": { - "message": "运行时", - "description": "The label for category Runtime in sidebar docs" - }, - "sidebar.docs.category.Community": { - "message": "社区", - "description": "The label for category Community in sidebar docs" - }, - "sidebar.docs.category.Showcase": { - "message": "案例展示", - "description": "The label for category Showcase in sidebar docs" - }, - "sidebar.docs.category.Guides": { - "message": "指南", - "description": "The label for category Guides in sidebar docs" - }, - "sidebar.docs.category.Tutorials": { - "message": "教程", - "description": "The label for category Tutorials in sidebar docs" - }, - "sidebar.docs.link.Contributing": { - "message": "参与贡献", - "description": "The label for link Contributing in sidebar docs, linking to /community-guide#ways-of-contributing" - } -} diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/appendix/_category_.json b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/appendix/_category_.json deleted file mode 100644 index 1374f0d55..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/appendix/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Runtime", - "position": 70 -} diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/_category_.json b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/_category_.json deleted file mode 100644 index 9827bf0c0..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "社区", - "position": 50 -} diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/links.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/links.mdx deleted file mode 100644 index 90c365a3d..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/links.mdx +++ /dev/null @@ -1,23 +0,0 @@ ---- -sidebar_position: 2 ---- - -# 链接 - -此页面用于列出社区相关的链接。 请提交 PR(点击页面底部的`编辑此页`)增加链接。 - -## 了不起的 Wails - -Wails 相关的[优秀列表](https://github.com/wailsapp/awesome-wails)。 - -## 支持的通道 - -- [Gophers Slack Channel](https://gophers.slack.com/messages/CJ4P9F7MZ/) -- [Gophers Slack Channel Invite](https://invite.slack.golangbridge.org/) -- [Github Issues](https://github.com/wailsapp/wails/issues) -- [v2 测试版讨论板](https://github.com/wailsapp/wails/discussions/828) - -## 社交媒体 - -- [Twitter](https://twitter.com/wailsapp) -- [Wails 中文社区 QQ 群](https://qm.qq.com/cgi-bin/qm/qr?k=PmIURne5hFGNd7QWzW5qd6FV-INEjNJv&jump_from=webapi) - 群号:1067173054 diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/_category_.json b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/_category_.json deleted file mode 100644 index 276e283b7..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Showcase", - "position": 1 -} diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/emailit.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/emailit.mdx deleted file mode 100644 index 4a1ebe835..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/emailit.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# EmailIt - -

- -
-

- -[EmailIt](https://github.com/raguay/EmailIt/) is a Wails 2 program that is a markdown based email sender only with nine notepads, scripts to manipulate the text, and templates. It also has a builtin [Node-Red](https://nodered.org/) server, scripts terminal, and the [ScriptBar](https://github.com/raguay/ScriptBarApp) program for displaying results from Node-Red or a script on your system. Documentation is very scarce, but the programs works. It’s built using Wails2 and Svelte, and the download is a universal macOS application. diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/encrypteasy.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/encrypteasy.mdx deleted file mode 100644 index 9b2e5f8ac..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/encrypteasy.mdx +++ /dev/null @@ -1,10 +0,0 @@ -# EncryptEasy - -

- -
-

- -**[cryptEasy](https://www.encrypteasy.app) 是一个管理您和您所有的联系人密钥的简单易用的 PGP 加密工具。 加密应该是简单的。 使用Wails开发。** - -Encrypting messages using PGP is the industry standard. Everyone has a private and a public key. Your private key, well, needs to be kept private so only you can read messages. Your public key is distributed to anyone who wants to send you secret, encrypted messages. Managing keys, encrypting messages and decrypting messages should be a smooth experience. EncryptEasy is all about making it easy. diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/filehound.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/filehound.mdx deleted file mode 100644 index 78cbfca86..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/filehound.mdx +++ /dev/null @@ -1,14 +0,0 @@ -# FileHound Export Utility - -

- -
-

- -[FileHound Export Utility](https://www.filehound.co.uk/) FileHound is a cloud document management platform made for secure file retention, business process automation and SmartCapture capabilities. - -The FileHound Export Utility allows FileHound Administrators the ability to run a secure document and data extraction tasks for alternative back-up and recovery purposes. This application will download all documents and/or meta data saved in FileHound based on the filters you choose. The metadata will be exported in both JSON and XML formats. - -Backend built with: Go 1.15 Wails 1.11.0 go-sqlite3 1.14.6 go-linq 3.2 - -Frontend with: Vue 2.6.11 Vuex 3.4.0 Typescript Tailwind 1.9.6 diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/minecraftupdater.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/minecraftupdater.mdx deleted file mode 100644 index 11247339d..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/minecraftupdater.mdx +++ /dev/null @@ -1,10 +0,0 @@ -# Minecraft Updater - -

- -
-

- -[Minecraft Updater](https://github.com/Gurkengewuerz/MinecraftModUpdater) is a utility tool to update and synchronize Minecraft mods for your userbase. It’s built using Wails2 and React with [antd](https://ant.design/) as frontend framework. diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/modalfilemanager.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/modalfilemanager.mdx deleted file mode 100644 index a7ae8c492..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/modalfilemanager.mdx +++ /dev/null @@ -1,12 +0,0 @@ -# Modal File Manager - -

- -
-

- -[Modal File Manager](https://github.com/raguay/ModalFileManager) is a dual pane file manager using web technologies. My original design was based on NW.js and can be found [here](https://github.com/raguay/ModalFileManager-NWjs). This version uses the same Svelte based frontend code (but it has be greatly modified since the departure from NW.js), but the backend is a [Wails 2](https://wails.io/) implementation. By using this implementation, I no longer use command line `rm`, `cp`, etc. commands. It is fully coded using Go and runs much faster than the previous versions. - -This file manager is designed around the same principle as Vim: a state controlled keyboard actions. The number of states isn't fixed, but very programmable. Therefore, an infinite number of keyboard configurations can be created and used. This is the main difference from other file managers. diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/mollywallet.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/mollywallet.mdx deleted file mode 100644 index 534b097ca..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/mollywallet.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Molley Wallet - -

- -
-

- -[Molly Wallet](https://github.com/grvlle/constellation_wallet/) the official $DAG wallet of the Constellation Network. It'll let users interact with the Hypergraph Network in various ways, not limited to producing $DAG transactions. diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/october.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/october.mdx deleted file mode 100644 index 889d2dd9e..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/october.mdx +++ /dev/null @@ -1,12 +0,0 @@ -# October - -

- -
-

- -[October](https://october.utf9k.net) is a small Wails application that makes it really easy to extract highlights from [Kobo eReaders](https://en.wikipedia.org/wiki/Kobo_eReader) and then forward them to [Readwise](https://readwise.io). - -It has a relatively small scope with all platform versions weighing in under 10MB, and that's without enabling [UPX compression](https://upx.github.io/)! - -In contrast, the author's previous attempts with Electron quickly bloated to several hundred megabytes. diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/optimus.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/optimus.mdx deleted file mode 100644 index c3eb79507..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/optimus.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Optimus - -

- -
-

- -[Optimus](https://github.com/splode/optimus) is a desktop image optimization application. It supports conversion and compression between WebP, JPEG, and PNG image formats. diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/portfall.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/portfall.mdx deleted file mode 100644 index 4cc2c63c9..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/portfall.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Portfall - -

- -
-

- -[Portfall](https://github.com/rekon-oss/portfall) - A desktop k8s port-forwarding portal for easy access to all your cluster UIs diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/restic-browser.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/restic-browser.mdx deleted file mode 100644 index 1505ce07a..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/restic-browser.mdx +++ /dev/null @@ -1,10 +0,0 @@ -# Restic Browser - -

- -
-

- -[Restic-Browser](https://github.com/emuell/restic-browser) - A simple, cross-platform [restic](https://github.com/restic/restic) backup GUI for browsing and restoring restic repositories. diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/riftshare.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/riftshare.mdx deleted file mode 100644 index 5223e88cf..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/riftshare.mdx +++ /dev/null @@ -1,19 +0,0 @@ -# RiftShare - -

- -
-

- -Easy, Secure, and Free file sharing for everyone. Learn more at [Riftshare.app](https://riftshare.app) - -## Features - -- Easy secure file sharing between computers both in the local network and through the internet -- Supports sending files or directories securely through the [magic wormhole protocol](https://magic-wormhole.readthedocs.io/en/latest/) -- Compatible with all other apps using magic wormhole (magic-wormhole or wormhole-william CLI, wormhole-gui, etc.) -- Automatic zipping of multiple selected files to send at once -- Full animations, progress bar, and cancellation support for sending and receiving -- Native OS File Selection -- Open files in one click once received -- Auto Update - don't worry about having the latest release! diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/scriptbar.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/scriptbar.mdx deleted file mode 100644 index aaa556f92..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/scriptbar.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# ScriptBar - -

- -
-

- -[ScriptBar](https://GitHub.com/raguay/ScriptBarApp) is a program to show the output of the embedded [Node-Red](https://nodered.org) server in the [EmailIt](https://GitHub.com/raguay/EmailIt) application. It also displays the output of scripts on your system. ScriptBar doesn't put them in the menubar, but has them all in a convient window for easy viewing. You can have multiple tabs to have many different things show. You can also keep the links to your most visited web sites. diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/surge.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/surge.mdx deleted file mode 100644 index 2d895dc29..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/surge.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Surge - -

- -
-

- -[Surge](https://getsurge.io/) is a p2p filesharing app designed to utilize blockchain technologies to enable 100% anonymous file transfers. Surge is end-to-end encrypted, decentralized and open source. diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/wally.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/wally.mdx deleted file mode 100644 index 2a2498f40..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/wally.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Wally - -

- -
-

- -[Wally](https://ergodox-ez.com/pages/wally) is the official firmware flasher for [Ergodox](https://ergodox-ez.com/) keyboards. It looks great and is a fantastic example of what you can achieve with Wails: the ability to combine the power of Go and the rich graphical tools of the web development world. diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/wombat.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/wombat.mdx deleted file mode 100644 index 54cedacea..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/wombat.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Wombat - -

- -
-

- -[Wombat](https://github.com/rogchap/wombat) is a cross platform gRPC client. diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/ytd.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/ytd.mdx deleted file mode 100644 index 178ff0529..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/showcase/ytd.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Ytd - -

- -
-

- -[Ytd](https://github.com/marcio199226/ytd/tree/v2-wails) is an app for downloading tracks from youtube, creating offline playlists and share them with your friends, your friends will be able to playback your playlists or download them for offline listening, has an built-in player. diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/templates.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/templates.mdx deleted file mode 100644 index 8b98f7115..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/community/templates.mdx +++ /dev/null @@ -1,52 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 模板 - -此页面用作社区支持的模板列表。 请提交一个包含您的模板的 PR(点击页面底部的`编辑此页`)。 要构建您自己的模板,请参考[模板](../guides/templates)指南。 - -要使用这些模板,请运行 `wails init -n "您的项目名" -t [下面的链接[@版本]]` - -如果不带版本后缀,默认使用的是主分支代码模板,如果带有版本后缀,则使用该版本对应标签的代码模板。 If there is a version suffix, the code template corresponding to the tag of this version is used. - -示例:`wails init -n "Your Project Name" -t https://github.com/misitebao/wails-template-vue@v2.0.0-beta.3` - -:::warning 注意 - -**Wails 项目不维护也不对第 3 方模板负责** - -如果您不确定某个模板,请检查 `package.json`和`wails.json` 中安装的模块和运行的脚本。 - -::: - -## Vue - -- [wails-template-vue](https://github.com/misitebao/wails-template-vue) - 基于 Vite、Vue 和 Vue-Router 的 Wails 模板(同时支持 JavaScript 和 TypeScript) -- [wails-vite-vue-ts](https://github.com/codydbentley/wails-vite-vue-ts) - 使用 Vite 的 Vue 3 TypeScript(以及添加功能的说明) -- [wails-vite-vue-the-works](https://github.com/codydbentley/wails-vite-vue-the-works) - 使用 Vite, Vuex, Vue Router, Sass, 和 ESLint + Prettier 的 Vue 3 TypeScript - -## Angular - -- [wails-angular-template](https://github.com/TAINCER/wails-angular-template) - 带有 TypeScript, Sass, 热重载, 代码拆分和 i18n 的 Angular - -## React - -- [wails-react-template](https://github.com/AlienRecall/wails-react-template) - 基于 reactjs 的模板 -- [wails-react-template](https://github.com/flin7/wails-react-template) - 基于 React 并支持实时开发模式的轻量级模板 -- [wails-vite-react-ts](https://github.com/lontten/wails-vite-react-ts) - 基于 Vite + React + TypeScript 的模板 - -## Svelte - -- [wails-svelte-template](https://github.com/raitonoberu/wails-svelte-template) - 基于 Svelte 的模板 -- [wails-vite-svelte-template](https://github.com/BillBuilt/wails-vite-svelte-template) - 使用 Svelte 和 Vite 的模板 -- [wails-vite-svelte-tailwind-template](https://github.com/BillBuilt/wails-vite-svelte-tailwind-template) - 使用 Svelte 和 Vite 和 TailwindCSS v3 的模板 -- [wails-template-nextjs](https://github.com/LGiki/wails-template-nextjs) - 基于 Next.js + TypeScript 的模板 - -## Elm - -- [wails-elm-template](https://github.com/benjamin-thomas/wails-elm-template) - Develop your GUI app with functional programming and a **snappy** hot-reload setup :tada: :rocket: - -## Pure JavaScript (Vanilla) - -- [wails-pure-js-template](https://github.com/KiddoV/wails-pure-js-template) - A template with nothing but just basic JavaScript, HTML, and CSS \ No newline at end of file diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/developing-new-features.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/developing-new-features.mdx deleted file mode 100644 index 9fc9025bd..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/developing-new-features.mdx +++ /dev/null @@ -1,34 +0,0 @@ ---- -sidebar_position: 20 ---- - -# 开发新功能 - -We are always keen to add features to Wails and expand on what the project can do. The process for adding new features are as follows: The process for adding new features are as follows: We are always keen to add features to Wails and expand on what the project can do. The process for adding new features are as follows: The process for adding new features are as follows: The process for adding new features are as follows: - -- Pick an enhancement ticket with the "TODO" label. Pick an enhancement ticket with the "TODO" label. Pick an enhancement ticket with the "TODO" label. It's preferable to select one from the current [Backlog](https://github.com/orgs/wailsapp/projects/1/views/1) but the choice is yours. -- Before developing, check that the ticket includes the following information: -- The purpose of the enhancement -- What is out of scope for the enhancement -- What platforms the enhancement targets (most features should be cross-platform unless there's a very specific reason) -- If the ticket does not include this information, feel free to request the information from the person who opened the ticket. Sometimes placeholder tickets are created and require more details Sometimes placeholder tickets are created and require more details Sometimes placeholder tickets are created and require more details -- Comment on the ticket stating you wish to develop the feature -- Clone the repository and create a branch with the format `feature/_` -- New features often require documentation so please ensure you have also added or updated the documentation as part of the changes -- Once the feature is ready for testing, create a draft PR. Once the feature is ready for testing, create a draft PR. Once the feature is ready for testing, create a draft PR. Please ensure the PR description has the test scenarios and test cases listed with checkmarks, so that others can know what still needs to be tested. Once the feature is ready for testing, create a draft PR. Once the feature is ready for testing, create a draft PR. Please ensure the PR description has the test scenarios and test cases listed with checkmarks, so that others can know what still needs to be tested. Once the feature is ready for testing, create a draft PR. Once the feature is ready for testing, create a draft PR. Please ensure the PR description has the test scenarios and test cases listed with checkmarks, so that others can know what still needs to be tested. -- Once all the testing is completed, please update the status of the PR from draft and leave a message. - -:::note -There is nothing stopping you from opening a ticket and working on it yourself, but please be aware that all -enhancement requests are reviewed for good fit. Not all ideas will be selected so it's best to have discussion -on the ticket first. -::: Not all ideas will be selected so it's best to have discussion -on the ticket first. -::: Not all ideas will be selected so it's best to have discussion -on the ticket first. -::: - -:::warning -Any PRs opened without a corresponding ticket may be rejected. -::: ::: -::: diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/documenting.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/documenting.mdx deleted file mode 100644 index 84e472903..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/documenting.mdx +++ /dev/null @@ -1,34 +0,0 @@ ---- -sidebar_position: 40 ---- - -# 文档 - -This website is also the main documentation site for the project. Sometimes this gets out of date and needs some slight adjustments. Some of the documentation isn't written to the best standards either. Developing documentation is hard and so any contribution to this is greatly appreciated. Features without documentation are unfinished so to the project, it's _as important_ as the code. - -We generally do not create tickets for updating documentation so if there is text you think should be updated or rephrased then feel free to submit a PR for that. This site is in the main repository under the `website` directory. We use [Docusaurus](https://docusaurus.io/) to create the site so there is plenty of existing documentation and tutorials around to get started. This site is in the main repository under the `website` directory. We use [Docusaurus](https://docusaurus.io/) to create the site so there is plenty of existing documentation and tutorials around to get started. This site is in the main repository under the `website` directory. We use [Docusaurus](https://docusaurus.io/) to create the site so there is plenty of existing documentation and tutorials around to get started. - -To set up a local documentation development environment, do the following: - -- [Install npm](https://docs.npmjs.com/cli/v8/configuring-npm/install) -- `cd website` -- `npm install` -- `npm run start` - -After it has all installed and is running, you should see the site at [`http://localhost:3000`](http://localhost:3000). Any changes made to the site text will be immediately reflected in the browser. Any changes made to the site text will be immediately reflected in the browser. Any changes made to the site text will be immediately reflected in the browser. - -## Versioning - -We employ a versioning system where we have the "latest" documentation AKA "Next Version" which has all the changes that have occurred since the last release. We also keep the last release documentation as well as the version before that. We also keep the last release documentation as well as the version before that. We also keep the last release documentation as well as the version before that. - -There isn't usually a reason to update released documentation so we don't generally update the documents in the `versioned_docs` or `versioned_sidebars` directories. - -The "next version" docs are mainly in `website/docs` with some "version independent" documents in `src/pages`. Any updates should be made in the `website/docs` directory. Any updates should be made in the `website/docs` directory. Any updates should be made in the `website/docs` directory. - -## Languages - -The default documents of the Wails project are English documents. We use the "crowdin" tool to translate documents in other languages and synchronize them to the website. You can [join our project](https://crowdin.com/project/wails) and submit your translations to make contributions. - -### Add new language - -If you want to add a new language to the documentation, please follow the prompts to [fill in and submit an Issue](https://github.com/wailsapp/wails/issues/new?assignees=&labels=documentation&template=documentation.yml). After being confirmed by the maintainer, we will add the language to the "crowdin" and you will then be able to submit your translation. diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/fixing-bugs.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/fixing-bugs.mdx deleted file mode 100644 index 01eceeccd..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/fixing-bugs.mdx +++ /dev/null @@ -1,29 +0,0 @@ ---- -sidebar_position: 30 ---- - -# 修复漏洞 - -The process for fixing bugs are as follows: - -- Check the current [Backlog](https://github.com/orgs/wailsapp/projects/1/views/1) and select a bug to fix -- Before developing, check that the ticket includes the following information: -- The scope of the issue including platforms affected -- The steps to reproduce. The steps to reproduce. The steps to reproduce. Sometimes bugs are opened that are not Wails issues and the onus is on the reporter to prove that it is a Wails issue with a minimal reproducible example -- The output of `wails doctor` -- If the ticket does not include this information, feel free to request the information from the person who opened the ticket. -- Comment on the ticket stating you wish to develop a fix -- Clone the repository and create a branch with the format `bugfix/_` -- Once the fix is ready for testing, create a draft PR. Once the fix is ready for testing, create a draft PR. Please ensure the PR description has the test scenarios and test cases listed with checkmarks, so that others can know what still needs to be tested. Once the fix is ready for testing, create a draft PR. Please ensure the PR description has the test scenarios and test cases listed with checkmarks, so that others can know what still needs to be tested. -- Once all the testing is completed, please update the status of the PR from draft and leave a message. - -:::note -There is nothing stopping you from opening a ticket and working on it yourself, but please be aware that all -bugfixes should be discussed as the approach may have unintended side effects. -::: ::: -::: - -:::warning -Any PRs opened without a corresponding ticket may be rejected. -::: ::: -::: diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/setting-up-a-dev-environment.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/setting-up-a-dev-environment.mdx deleted file mode 100644 index 1133e275d..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/setting-up-a-dev-environment.mdx +++ /dev/null @@ -1,30 +0,0 @@ ---- -sidebar_position: 10 ---- - -# 设置开发环境 - -You can set up a development environment by doing the following: - -- Install the latest versions of Go and Git -- `git clone https://github.com/wailsapp/wails` -- `cd wails/v2/cmd/wails` -- `go install` - -NOTE: The directory that you cloned the project into will now be called "clonedir". - -The Wails CLI will now be at the very latest version. - -To update projects to use the latest version, update the project's `go.mod` and ensure the following line is at the bottom of the file: - -`replace github.com/wailsapp/wails/v2 => ` - -Example: - -On Windows: `replace github.com/wailsapp/wails/v2 => C:\Users\leaan\Documents\wails-v2-beta\wails\v2` - -On 'nix: `replace github.com/wailsapp/wails/v2 => /home/me/projects/wails/v2` - -To revert back to a stable version, run: - -`go install github.com/wailsapp/wails/v2/cmd/wails@latest` diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/ways-of-contributing.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/ways-of-contributing.mdx deleted file mode 100644 index 3bbe9a889..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/contributing/ways-of-contributing.mdx +++ /dev/null @@ -1,18 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 贡献方式 - -Wails is an open source, community driven project. We welcome anyone to join us in contributing to the project. This documentation is aimed at anyone wishing to get familiar with the project and the development processes. We welcome anyone to join us in contributing to the project. This documentation is aimed at anyone wishing to get familiar with the project and the development processes. - -There are many ways to contribute to the project: - -- Developing new features -- Fixing bugs -- Testing -- Documenting features -- Writing tutorials / guides -- Helping others on the issues + discussions boards - -Guides for these have been created in their own sections. Guides for these have been created in their own sections. Guides for these have been created in their own sections. Before getting started, please introduce yourself in the [Contributing to Wails](https://github.com/wailsapp/wails/discussions/1520) discussion. diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/_category_.json b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/_category_.json deleted file mode 100644 index 597b920df..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Getting Started", - "position": 10 -} diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/building.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/building.mdx deleted file mode 100644 index 38bf5d47d..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/building.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -sidebar_position: 6 ---- - -# 编译您的项目 - -从项目目录,运行`wails build`。 这将编译您的项目并将构建的可用于生产的二进制文件保存在 `build/bin` 目录中。 - -如果您运行二进制文件,您应该会看到默认应用程序: - -
- -
- -
- -有关编译选项的更多详细信息,请参阅[构建命令](../reference/cli#构建)。 diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/development.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/development.mdx deleted file mode 100644 index a9e165543..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/development.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -sidebar_position: 5 ---- - -# 开发您的应用程序 - -您可以通过运行`wails dev`从项目目录在开发模式下运行您的应用程序。 这将执行以下操作: - -- 构建您的应用程序并运行它 -- 监听 Go 文件中的修改并在更改时重新构建/重新运行 -- Using the power of [vite](https://vitejs.dev/), will watch for modifications in your Go files and rebuild/re-run on change -- 设置将通过浏览器为您的应用程序提供服务的[网络服务器](http://localhost:34115)。 这允许您使用您喜欢的浏览器扩展。 您甚至可以从控制台调用 Go 代码。 - -首先,在项目目录中运行`wails dev`。 可以在[此处](../reference/cli#开发)找到有关这方面的更多信息。 - -即将提供:教程 diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/firstproject.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/firstproject.mdx deleted file mode 100644 index e43d5f7d1..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/firstproject.mdx +++ /dev/null @@ -1,132 +0,0 @@ ---- -sidebar_position: 2 ---- - -# 创建项目 - -## 项目生成 - -现在 CLI 已安装,您可以使用`wails init`命令生成一个新项目。 - -选择您最喜欢的框架: - - - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - - - - Generate a Svelte project using Javascript with:

- - wails init -n myproject -t svelte -If you would rather use Typescript:
- - wails init -n myproject -t svelte-ts - -
- - Generate a React project using Javascript with:

- - wails init -n myproject -t react -If you would rather use Typescript:
- - wails init -n myproject -t react-ts - -
- - Generate a Vue project using Javascript with:

- - wails init -n myproject -t vue - -If you would rather use Typescript:
- - wails init -n myproject -t vue-ts - -
- - Generate a Preact project using Javascript with:

- - wails init -n myproject -t preact - -If you would rather use Typescript:
- - wails init -n myproject -t preact-ts - -
- - Generate a Lit project using Javascript with:

- - wails init -n myproject -t lit - -If you would rather use Typescript:
- - wails init -n myproject -t lit-ts - -
- - Generate a Vanilla project using Javascript with:

- - wails init -n myproject -t vanilla - -If you would rather use Typescript:
- - wails init -n myproject -t vanilla-ts - -
-
- - - -
- -Wails 项目具有以下布局: - -要查看其他可用选项,您可以运行 `wails init -help`。 更多详细信息可以在 [初始化命令](../reference/cli#初始化)中找到。 - -## 项目布局 - -Wails 项目有以下布局: - -``` -. -. -. -├── build/ -│ ├── appicon.png -│ ├── darwin/ -│ └── windows/ -├── frontend/ -├── go.mod -├── go.sum -├── main.go -└── wails.json -``` - -### 项目结构概要 - -- `/main.go` - 主应用 -- `/frontend/` - 前端项目文件 -- `/build/` - 项目构建目录 -- `/wails.json` - 项目配置 -- `/go.mod` - Go mod 文件 -- `/go.sum` - Go mod 校验文件 -- `/build/windows/` - Windows 特定的项目文件 -- `/go.mod` - Go module file -- `/go.sum` - Go module checksum file - -`frontend`目录没有特定于 Wails 的内容,可以是您选择的任何前端项目。 - -`build`目录在构建过程中使用。 这些文件可以修改以自定义您的构建。 如果文件从构建目录中删除,将重新生成默认版本。 - -`go.mod`中的默认模块名称是“changeme”。 您应该将其更改为更合适的内容。 diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/installation.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/installation.mdx deleted file mode 100644 index bbef43c3c..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/gettingstarted/installation.mdx +++ /dev/null @@ -1,109 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 安装 - -## 支持的平台 - -- Windows 10/11 AMD64/ARM64 -- MacOS 10.13+ AMD64 -- MacOS 11.0+ ARM64 -- Linux AMD64/ARM64 - -## 依赖 - -Wails 有许多安装前需要的常见依赖项: - -- Go 1.17+ -- NPM (Node 15+) - -### Go - -从[Go 下载页面](https://golang.org/dl/)下载 Go。 - -确保您遵守官方的[Go 安装说明](https://golang.org/doc/install#install)。 您还需要确保您的 `PATH` 环境变量包含您的 `~/go/bin` 目录路径。 重启终端并执行以下命令检查: - -- 检查 Go 是否安装正确: `go version` -- 检查 "~/go/bin" 是否在您的 PATH 变量中: `echo $PATH | grep go/bin` - -### NPM - -从[Node 下载页面](https://nodejs.org/en/download/)下载 NPM。 最好使用最新版本,因为这是我们通常会测试的版本。 - -运行 `npm --version` 进行验证。 - -## 平台指定依赖关系 - -您还需要安装指定平台的依赖项: - - - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - - - - Wails 需要安装 xcode 命令行工具。 This can be - done by running:
- xcode-select --install -
- - Wails requires that the WebView2{" "} - runtime is installed. Some Windows installations will already have this installed. You can check using - the{" "} - wails doctor command (see below). Some Windows installations will already have this installed. You can check using - the{" "} - wails doctor command (see below). Some Windows installations will already have this - installed. You can check using the wails doctor command (see - below). - - - Linux required the standard gcc build tools - plus libgtk3 and libwebkit. - Rather than list a ton of commands for different distros, Wails can try to determine - what the installation commands are for your specific distribution. Run wails doctor after - installation - to be shown how to install the dependencies. - If your distro/package manager is not supported, please consult the {" "} - Add Linux Distro guide. - Rather than list a ton of commands for different distros, Wails can try to determine - what the installation commands are for your specific distribution. Run wails doctor after - installation - to be shown how to install the dependencies. - If your distro/package manager is not supported, please consult the {" "} - Add Linux Distro guide. Rather than list a ton of - commands for different distros, Wails can try to determine what the - installation commands are for your specific distribution. Run{" "} - wails doctor after installation to be shown how to install the - dependencies. If your distro/package manager is not supported, please - consult the{" "} - Add Linux Distro guide. - -
- - - -## 可选依赖 - -- [UPX](https://upx.github.io/) 用于压缩您的应用程序。 - -## 安装 Wails - -运行 `go install github.com/wailsapp/wails/v2/cmd/wails@latest` 安装 Wails CLI。 - -## 系统检查 - -运行 `wails doctor` 将检查您是否安装了正确的依赖项。 如果没有,它会就缺少的内容提供建议以帮助纠正问题。 - -## The `wails` command appears to be missing? - -If your system is reporting that the `wails` command is missing, make sure you have followed the Go installation guide correctly. Normally, it means that the `go/bin` directory in your User's home directory is not in the `PATH` environment variable. You will also normally need to close and reopen any open command prompts so that changes to the environment made by the installer are reflected at the command prompt. diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/_category_.json b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/_category_.json deleted file mode 100644 index 5935dad93..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Guides", - "position": 50 -} diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/application-development.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/application-development.mdx deleted file mode 100644 index 76e93b17a..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/application-development.mdx +++ /dev/null @@ -1,194 +0,0 @@ -# 应用开发 - -使用 Wails 开发应用程序没有硬性规定,但有一些基本准则。 - -## 应用程序设置 - -默认模板使用 `main.go` 配置和运行应用程序, 同时`app.go`用于定义应用程序逻辑. - -`app.go`文件将定义一个结构体,该结构体有 2 个方法作为主应用程序的回调: - -```go title="app.go" -type App struct { - ctx context.Context -} - -func NewApp() *App { - return &App{} -} - -func (a *App) startup(ctx context.Context) { - a.ctx = ctx -} - -func (a *App) shutdown(ctx context.Context) { -} -``` - -- `startup`方法会在 Wails 分配它需要的资源后立即调用,这是创建资源、设置事件侦听器以及应用程序在启动时需要的任何其他内容的好地方。 它提供了一个`context.Context`, 通常保存在结构字段中。 调用[运行时](../reference/runtime/intro)需要此`context.Context`。 如果此方法返回错误,则应用程序将终止。 在开发模式下,错误会输出到控制台。 - -- The shutdown method will be called by Wails right at the end of the shutdown process. This is a good place to deallocate memory and perform any shutdown tasks. This is a good place to deallocate memory and perform any shutdown tasks. - -`main.go`文件通常由对`wails.Run()`的单个调用组成,它接受应用程序配置。 模板使用的模式是,在调用`wails.Run()`之前, 我们创建并保存一个在`app.go`中定义的结构体的实例在名`app`的变量中。 这个配置是我们添加回调的地方: - -```go {3,9,10} title="main.go" -func main() { - - app := NewApp() - - err := wails.Run(&options.App{ - Title: "My App", - Width: 800, - Height: 600, - OnStartup: app.startup, - OnShutdown: app.shutdown, - }) - if err != nil { - log.Fatal(err) - } -} - -``` - -可以在[此处](../howdoesitwork#应用程序生命周期回调)找到有关应用程序生命周期回调的更多信息。 - -## 绑定方法 - -您可能希望从前端调用 Go 方法。 这通常是通过向`app.go`中已经定义的结构体中添加公共方法来实现的: - -```go {16-18} title="app.go" -type App struct { - ctx context.Context -} - -func NewApp() *App { - return &App{} -} - -func (a *App) startup(ctx context.Context) { - a.ctx = ctx -} - -func (a *App) shutdown(ctx context.Context) { -} - -func (a *App) Greet(name string) string { - return fmt.Printf("Hello %s!", name) -} -``` - -在主应用程序中,`Bind`字段告诉我们 Wails 想要绑定什么: - -```go {11-13} title="main.go" -func main() { - - app := NewApp() - - err := wails.Run(&options.App{ - Title: "My App", - Width: 800, - Height: 600, - OnStartup: app.startup, - OnShutdown: app.shutdown, - Bind: []interface{}{ - app, - }, - }) - if err != nil { - log.Fatal(err) - } -} - -``` - -这将绑定`App`结构中的所有公共方法(它永远不会绑定 startup 和 shutdown 方法)。 - -### Dealing with context when binding multiple structs - -可以在[此处](../howdoesitwork#方法绑定)找到有关绑定的更多信息。 - -```go -func main() { - - app := NewApp() - otherStruct := NewOtherStruct() - - err := wails.Run(&options.App{ - Title: "My App", - Width: 800, - Height: 600, - OnStartup: func(ctx context.Context){ - app.SetContext(ctx) - otherStruct.SetContext(ctx) - }, - OnShutdown: app.shutdown, - Bind: []interface{}{ - app, - otherStruct - }, - }) - if err != nil { - log.Fatal(err) - } -} -``` - -More information on Binding can be found [here](../howdoesitwork.mdx#method-binding). - -## 应用程序菜单 - -Wails 支持向您的应用程序添加菜单。 这是通过将 [菜单](../reference/menus#菜单) 结构体传递给应用程序配置来完成的。 常见做法是使用一个返回菜单的方法,更常见的是用作生命周期回调的 `App` 结构体上的方法。 - -```go {11} title="main.go" -func main() { - - app := NewApp() - - err := wails.Run(&options.App{ - Title: "My App", - Width: 800, - Height: 600, - OnStartup: app.startup, - OnShutdown: app.shutdown, - Menu: app.menu(), - Bind: []interface{}{ - app, - }, - }) - if err != nil { - log.Fatal(err) - } -} - -``` - -## 资源 - -Wails v2 处理资源的方式的伟大之处在于它没有! 您唯一需要给 Wails 的是一个 `embed.FS`, 如何做到这一点完全取决于您。 How you get to that is entirely up to you. 您可以像 vanilla 模板一样使用 vanilla html/css/js 文件。 您可能有一些复杂的构建系统,但这并不影响。 - -当运行`wails build`时,它会检查项目根目录的`wails.json`文件。 文件中有 2 个字段会被读取: - -- "frontend:install" -- "frontend:build" - -第一个,如果有给定,将在`frontend`目录中执行以安装 node 模块。 第二个,如果有给定,将在`frontend`目录中执行以构建前端项目。 - -如果没有给出这两个字段,那么 Wails 不会对前端做任何操作。 它仅仅被用作`embed.FS`。 - -### AssetsHandler - -A Wails v2 app can optionally define a `http.Handler` in the `options.App`, which allows hooking into the AssetServer to create files on the fly or process POST/PUT requests. GET requests are always first handled by the `assets` FS. If the FS doesn't find the requested file the request will be forwarded to the `http.Handler` for serving. Any requests other than GET will be directly processed by the `AssetsHandler` if specified. It's also possible to only use the `AssetsHandler` by specifiy `nil` as the `Assets` option. GET requests are always first handled by the `assets` FS. If the FS doesn't find the requested file the request will be forwarded to the `http.Handler` for serving. Any requests other than GET will be directly processed by the `AssetsHandler` if specified. It's also possible to only use the `AssetsHandler` by specifiy `nil` as the `Assets` option. - -## 内置开发服务器 - -运行`wails dev`将启动内置的开发服务器,它将在您的项目目录中启动一个文件监听器。 默认情况下,如果有任何文件更改,wails 会检查它是否是应用程序文件(默认:.go,可使用`-e`标志配置)。 如果是,那么它将重新构建您的应用程序并重新启动它。 如果更改的文件在`assetdir`目录中,它会在很短的时间后重新加载。 - -开发服务器使用一种称为“防抖”的技术,这意味着它不会立即重新加载,因为可能会在短时间内更改多个文件。 当触发发生时,它会在发出重新加载之前等待一定的时间。 如果发生另一个触发,它会再次重置为等待时间。 默认情况下,此值为 100ms。 如果此值不适用于您的项目,则可以使用`-debounce`标志进行配置。 如果使用,此值将保存到您的项目配置中并成为默认值。 - -## 外部开发服务器 - -一些框架带有自己的实时重新加载服务器,但是它们将无法利用 Wails Go 绑定。 在这种情况下,最好运行一个监听脚本,将项目重新构建到构建目录中,Wails 将监视该目录。 有关示例,请参阅使用[rollup](https://rollupjs.org/guide/en/)的默认 svelte 模板。 对于[create-react-app](https://create-react-app.dev/),可以使用[此脚本](https://gist.github.com/int128/e0cdec598c5b3db728ff35758abdbafd)来实现类似的结果。 - -## Go 模块 - -默认的 Wails 模板会生成一个包含模块名称“changeme”的`go.mod`文件。 您应该在项目生成后将其更改为更合适的内容。 diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/bleeding-edge.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/bleeding-edge.mdx deleted file mode 100644 index 8fad99fde..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/bleeding-edge.mdx +++ /dev/null @@ -1,55 +0,0 @@ -# 前沿风险技术 - -## 概述 - -Wails 一直在开发中,新版本会定期“标记”。 这通常发生在`master`分支上所有较新的代码都经过测试并确认有效时。 如果您需要尚未发布的错误修复或功能,可以通过以下步骤使用最新的“前沿风险”版本: - -- `git clone https://github.com/wailsapp/wails` -- `cd wails/v2/cmd/wails` -- `go install` - -注意:您将项目克隆到的目录现在将被称为“clonedir”。 - -Wails CLI 现在将是最新版本。 - -### Updating your project - -To update projects to use the latest version of the Wails library, update the project's `go.mod` and ensure the following line is at the bottom of the file: - -`replace github.com/wailsapp/wails/v2 => ` - -示例: - -在 Windows 上: `replace github.com/wailsapp/wails/v2 => C:\Users\leaan\Documents\wails-v2-beta\wails\v2` - -在'nix 上: `replace github.com/wailsapp/wails/v2 => /home/me/projects/wails/v2` - -To revert to a stable version, run: - -`go install github.com/wailsapp/wails/v2/cmd/wails@latest` - -## 测试一个分支 - -如果要测试一个分支,请按照上面的说明进行操作,但请确保在安装之前切换要测试的分支: - -- `git clone https://github.com/wailsapp/wails` -- `cd wails` -- `git checkout -b branch-to-test --track origin/branch-to-test` -- `cd v2/cmd/wails` -- `go install` - -Make sure you [update your project](#updating-your-project) as described above. - -## Testing a PR - -If you want to test a PR, follow the instructions above, but ensure you fetch the PR and switch the branch before installing. Please replace `[IDofThePR]` with the ID of the PR shown on github.com: If you want to test a PR, follow the instructions above, but ensure you fetch the PR and switch the branch before installing. Please replace `[IDofThePR]` with the ID of the PR shown on github.com: Please replace `[IDofThePR]` with the ID of the PR shown on github.com: - -- `git clone https://github.com/wailsapp/wails` -- `cd wails` -- `git fetch -u origin pull/[IDofThePR]/head:test/pr-[IDofThePR]` -- `git checkout test/pr-[IDofThePR]` -- `git reset --hard HEAD` -- `cd v2/cmd/wails` -- `go install` - -Make sure you [update your project](#updating-your-project) as described above. diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/dynamic-assets.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/dynamic-assets.mdx deleted file mode 100644 index c28d70e9d..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/dynamic-assets.mdx +++ /dev/null @@ -1,130 +0,0 @@ -# 动态资源 - -If you want to load or generate assets for your frontend dynamically, you can achieve that using the [AssetsHandler](../reference/options#assetshandler) option. The AssetsHandler is a generic `http.Handler` which will be called for any non GET request on the assets server and for GET requests which can not be served from the bundled assets because the file is not found. The AssetsHandler is a generic `http.Handler` which will be called for any non GET request on the assets server and for GET requests which can not be served from the bundled assets because the file is not found. The AssetsHandler is a generic `http.Handler` which will be called for any non GET request on the assets server and for GET requests which can not be served from the bundled assets because the file is not found. - -By installing a custom AssetsHandler, you can serve your own assets using a custom asset server. - -## Example - -In our example project, we will create a simple assets handler which will load files off disk: - -```go title=main.go {16-35,49} -package main - -import ( - "embed" - "fmt" - "github.com/wailsapp/wails/v2" - "github.com/wailsapp/wails/v2/pkg/options" - "net/http" - "os" - "strings" -) - -//go:embed frontend/dist -var assets embed.FS - -type FileLoader struct { - http.Handler -} - -func NewFileLoader() *FileLoader { - return &FileLoader{} -} - -func (h *FileLoader) ServeHTTP(res http.ResponseWriter, req *http.Request) { - var err error - requestedFilename := strings.TrimPrefix(req.URL.Path, "/") - println("Requesting file:", requestedFilename) - fileData, err := os.ReadFile(requestedFilename) - if err != nil { - res.WriteHeader(http.StatusBadRequest) - res.Write([]byte(fmt.Sprintf("Could not load file %s", requestedFilename))) - } - - res.Write(fileData) -} - -func main() { - // Create an instance of the app structure - app := NewApp() - - // Create application with options - err := wails.Run(&options.App{ - Title: "helloworld", - Width: 1024, - Height: 768, - Assets: assets, - BackgroundColour: &options.RGBA{R: 27, G: 38, B: 54, A: 255}, - OnStartup: app.startup, - AssetsHandler: NewFileLoader(), - Bind: []interface{}{ - app, - }, - }) - - if err != nil { - println("Error:", err) - } -} -``` - -When we run the application in dev mode using `wails dev`, we will see the following output: - -``` -DEB | [ExternalAssetHandler] Loading 'http://localhost:3001/favicon.ico' -DEB | [ExternalAssetHandler] Loading 'http://localhost:3001/favicon.ico' failed, using AssetHandler -Requesting file: favicon.ico -``` - -As you can see, the assets handler is called when the default assets server is unable to serve the `favicon.ico` file. - -If you right click the main application and select "inspect" to bring up the devtools, you can test this feature out by typing the following into the console: - -``` -let response = await fetch('does-not-exist.txt'); -``` - -This will generate an error in the devtools. This will generate an error in the devtools. This will generate an error in the devtools. We can see that the error is what we expect, returned by our custom assets handler: - -

- -

- -However, if we request `go.mod`, we will see the following output: - -

- -

- -This technique can be used to load images directly into the page. This technique can be used to load images directly into the page. If we updated our default vanilla template and replaced the logo image: This technique can be used to load images directly into the page. This technique can be used to load images directly into the page. If we updated our default vanilla template and replaced the logo image: This technique can be used to load images directly into the page. If we updated our default vanilla template and replaced the logo image: - -```html - -``` - -with: - -```html - -``` - -Then we would see the following: - -

- -

- -:::warning -Exposing your filesystem in this way is a security risk. It is recommended that you properly manage access -to your filesystem. -::: It is recommended that you properly manage access -to your filesystem. -::: It is recommended that you properly manage access -to your filesystem. -::: diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/frameless.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/frameless.mdx deleted file mode 100644 index 126a36c38..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/frameless.mdx +++ /dev/null @@ -1,84 +0,0 @@ -# 无边框应用 - -Wails supports application that have no frames. 这可以通过使用[应用程序参数选项](../reference/options#应用程序参数选项)中的[无边框](../reference/options#无边框)字段来实现。 - -Wails offers a simple solution for dragging the window: Any HTML element that has the CSS style `--wails-draggable:drag` will act as a "drag handle". This property applies to all child elements. If you need to indicate that a nested element should not drag, then use the attribute '--wails-draggable:no-drag' on that element. - - -```html - - - - - - - -
- - -
-
- - - - -``` - -For some projects, using a CSS variable may not be possible due to dynamic styling. In this case, you can use the `CSSDragProperty` and `CSSDragValue` application options to define a property and value that will be used to indicate draggable regions: - -```go title=main.go -package main - -import ( - "embed" - - "github.com/wailsapp/wails/v2" - "github.com/wailsapp/wails/v2/pkg/options" -) - -//go:embed frontend/dist -var assets embed.FS - -func main() { - // Create an instance of the app structure - app := NewApp() - - // Create application with options - err := wails.Run(&options.App{ - Title: "alwaysontop", - Width: 1024, - Height: 768, - Assets: assets, - Frameless: true, - CSSDragProperty: "widows", - CSSDragValue: "1", - Bind: []interface{}{ - app, - }, - }) - - if err != nil { - println("Error:", err) - } -} -``` - -```html title=index.html - - - - - - alwaysontop - - -
- - - - -``` - -:::info 全屏 -如果您允许应用程序全屏显示,则此拖动功能将被禁用。 -::: diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/frontend.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/frontend.mdx deleted file mode 100644 index 789e834b8..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/frontend.mdx +++ /dev/null @@ -1,72 +0,0 @@ -# 前端 - -## 脚本注入 - -当 Wails 为您的`index.html`提供服务时,默认情况下,它会将 2 个脚本注入``标签以加载`/wails/ipc.js`和`/wails/runtime.js`。 这些文件分别安装绑定和运行时。 - -下面的代码显示了这些默认注入的位置: - -```html - - - injection example - - - - - - - -
Please enter your name below 👇
-
- - -
- - - - -``` - -### 覆盖默认脚本注入 - -为了给开发人员提供更大的灵活性,有一个`meta`标签可用于自定义此行为: - -```html - -``` - -选项如下: - -| 值 | 描述 | -| ------------------- | -------------------------- | -| noautoinjectruntime | 禁用自动注入 `/wails/runtime.js` | -| noautoinjectipc | 禁用自动注入 `/wails/ipc.js` | -| noautoinject | 禁用所有脚本自动注入 | - -可以使用多个选项,前提是它们以逗号分隔。 - -此代码完全有效并且与自动注入版本的操作相同: - -```html - - - injection example - - - - - - -
Please enter your name below 👇
-
- - -
- - - - - - -``` diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/ides.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/ides.mdx deleted file mode 100644 index 0ae681f0f..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/ides.mdx +++ /dev/null @@ -1,110 +0,0 @@ -# 集成开发环境 - -Wails 旨在提供出色的开发体验。 为此,我们现在支持生成 IDE 特定配置以提供更顺畅的项目设置。 - -目前,我们支持[Visual Studio Code](https://code.visualstudio.com/),但我们希望尽快支持其他 IDE,例如 Goland。 - -## Visual Studio Code - -

- -

- -使用`-ide vscode`标志生成项目时,IDE 文件将与其他项目文件一起创建。 这些文件放置在`.vscode`目录中,并为调试应用程序提供正确的配置。 - -生成的 2 个文件是`tasks.json`和`launch.json`. 以下是为默认 vanilla 项目生成的文件: 生成的 2 个文件是`tasks.json`和`launch.json`. 以下是为默认 vanilla 项目生成的文件: Below are the files generated for the default vanilla project: 生成的 2 个文件是`tasks.json`和`launch.json`. 以下是为默认 vanilla 项目生成的文件: Below are the files generated for the default vanilla project: 生成的 2 个文件是`tasks.json`和`launch.json`. 以下是为默认 vanilla 项目生成的文件: Below are the files generated for the default vanilla project: 生成的 2 个文件是`tasks.json`和`launch.json`. 以下是为默认 vanilla 项目生成的文件: Below are the files generated for the default vanilla project: - -```json title="tasks.json" -{ - "version": "2.0.0", - "tasks": [ - { - "label": "build", - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "command": "go", - "args": ["build", "-tags", "dev", "-gcflags", "all=-N -l", "-o", "build/bin/myproject.exe"] - } - ] -} -``` - -```json title="launch.json" -{ - "version": "0.2.0", - "configurations": [ - { - "name": "Wails: Debug myproject", - "type": "go", - "request": "launch", - "mode": "exec", - "program": "${workspaceFolder}/build/bin/myproject.exe", - "preLaunchTask": "build", - "cwd": "${workspaceFolder}", - "env": {}, - "args": ["-assetdir", "frontend/src"] - } - ] -} -``` - -### 配置安装和构建步骤 - -`tasks.json`文件对于默认项目很简单,因为不需要`npm install`或`npm run build`的步骤。 对于具有前端构建步骤的项目,例如 svelte 模板,我们需要编辑`tasks.json`以添加安装和构建步骤: - -```json title="tasks.json" -{ - "version": "2.0.0", - "tasks": [ - { - "label": "npm install", - "type": "npm", - "script": "install", - "options": { - "cwd": "${workspaceFolder}/frontend" - }, - "presentation": { - "clear": true, - "panel": "shared", - "showReuseMessage": false - }, - "problemMatcher": [] - }, - { - "label": "npm run build", - "type": "npm", - "script": "build", - "options": { - "cwd": "${workspaceFolder}/frontend" - }, - "presentation": { - "clear": true, - "panel": "shared", - "showReuseMessage": false - }, - "problemMatcher": [] - }, - { - "label": "build", - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "command": "go", - "args": ["build", "-tags", "dev", "-gcflags", "all=-N -l", "-o", "build/bin/vscode.exe"], - "dependsOn": ["npm install", "npm run build"] - } - ] -} -``` - -:::info 功能改善 - -在未来,我们希望生成一个自动包含安装和构建步骤的`tasks.json`。 - -::: diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/linux-distro-support.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/linux-distro-support.mdx deleted file mode 100644 index 2ee209e03..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/linux-distro-support.mdx +++ /dev/null @@ -1,101 +0,0 @@ -# Linux 发行版支持 - -## 概述 - -Wails 提供 Linux 支持,但为所有可用发行版提供安装说明是一项不可能完成的任务。 相反,Wails 会尝试确定您开发应用程序所需的包是否可以通过系统的包管理器获得。 目前,我们支持以下包管理器: - -- apt -- dnf -- emerge -- eopkg -- nixpkgs -- pacman -- zypper - -## 添加包名 - -在某些情况下,您的发行版使用受支持的包管理器之一,但包名称不同。 例如,您可能使用 Ubuntu 衍生产品,但 gtk 的包名称可能不同。 Wails 尝试通过遍历包名称列表来找到正确的包。 包列表存储在`v2/internal/system/packagemanager` 目录中的包管理器特定文件中。 在我们的示例中,将是`v2/internal/system/packagemanager/apt.go`。 - -在此文件中,包列表由以下`Packages()`方法定义: - -```go -func (a *Apt) Packages() packagemap { - return packagemap{ - "libgtk-3": []*Package{ - {Name: "libgtk-3-dev", SystemPackage: true, Library: true}, - }, - "libwebkit": []*Package{ - {Name: "libwebkit2gtk-4.0-dev", SystemPackage: true, Library: true}, - }, - "gcc": []*Package{ - {Name: "build-essential", SystemPackage: true}, - }, - "pkg-config": []*Package{ - {Name: "pkg-config", SystemPackage: true}, - }, - "npm": []*Package{ - {Name: "npm", SystemPackage: true}, - }, - "docker": []*Package{ - {Name: "docker.io", SystemPackage: true, Optional: true}, - }, - } -} -``` - -假设在我们的 linux 发行版中,libgtk-3 以 lib-gtk3-dev 的名称打包。 我们可以通过添加以下行来添加对此的支持: - -```go {5} -func (a *Apt) Packages() packagemap { - return packagemap{ - "libgtk-3": []*Package{ - {Name: "libgtk-3-dev", SystemPackage: true, Library: true}, - {Name: "lib-gtk3-dev", SystemPackage: true, Library: true}, - }, - "libwebkit": []*Package{ - {Name: "libwebkit2gtk-4.0-dev", SystemPackage: true, Library: true}, - }, - "gcc": []*Package{ - {Name: "build-essential", SystemPackage: true}, - }, - "pkg-config": []*Package{ - {Name: "pkg-config", SystemPackage: true}, - }, - "npm": []*Package{ - {Name: "npm", SystemPackage: true}, - }, - "docker": []*Package{ - {Name: "docker.io", SystemPackage: true, Optional: true}, - }, - } -} -``` - -## 添加新的包管理器 - -要添加新的包管理器,请执行以下步骤: - -- 在`v2/internal/system/packagemanager`中创建一个名为`.go`的新文件,其中``是包管理器的名称。 -- 定义一个符合`pm.go`中定义的包管理器接口的结构体。 - -```go -type PackageManager interface { - Name() string - Packages() packagemap - PackageInstalled(*Package) (bool, error) - PackageAvailable(*Package) (bool, error) - InstallCommand(*Package) string -} -``` - -- `Name()` 应该返回包管理器的名称 -- `Packages()` 应该返回一个`packagemap`,它为依赖项提供候选文件名 -- `PackageInstalled()` 如果安装了指定的包,应该返回`true` -- `PackageAvailable()` 如果指定的软件包未安装但可以安装,则应返回`true` -- `InstallCommand()` 应该返回确切的命令来安装指定的包名 - -查看其他包管理器代码以了解其工作原理。 - -:::info 记住 -如果您添加了对新包管理器的支持,请不要忘记更新此页面! -::: diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/linux.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/linux.mdx deleted file mode 100644 index 073e207b2..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/linux.mdx +++ /dev/null @@ -1,18 +0,0 @@ -# Linux - -This page has miscellaneous guides related to developing Wails applications for Linux. - -## Video tag doesn't fire "ended" event - -When using a video tag, the "ended" event is not fired when the video is finished playing. This is a bug in WebkitGTK, however you can use the following workaround to fix it: This is a bug in WebkitGTK, however you can use the following workaround to fix it: - -```js -videoTag.addEventListener("timeupdate", (event) => { - if (event.target.duration - event.target.currentTime < 0.2) { - let ended = new Event("ended"); - event.target.dispatchEvent(ended); - } -}); -``` - -Source: [Lyimmi](https://github.com/Lyimmi) on the [discussions board](https://github.com/wailsapp/wails/issues/1729#issuecomment-1212291275) diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/manual-builds.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/manual-builds.mdx deleted file mode 100644 index 3472cb91a..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/manual-builds.mdx +++ /dev/null @@ -1,95 +0,0 @@ -# 手动构建 - -Wails CLI 为项目做了很多繁重的工作,但有时需要手动构建项目。 本文档将讨论 CLI 执行的不同操作以及如何以不同方式实现这一点。 - -## 构建过程 - -当使用`wails build`或`wails dev`时,Wails CLI 会执行一个通用的构建过程: - - - 安装前端依赖 - - 构建前端项目 - - 生成构建资源 - - 编译应用程序 - - [可选]压缩应用程序 - -### 安装前端依赖 - -#### 命令行步骤 - -- 如果给出了`-s`标志,则跳过此步骤 -- 检查`wails.json`中是否有安装命令`frontend:install` -- 如果没有,则跳过此步骤 -- 如果有,则检查前端目录中是否存在`package.json`。 如果不存在,则跳过这一步 -- 从`package.json`文件内容生成 MD5 -- 它检查`package.json.md5`是否存在,如果存在,则将其内容(MD5 sum)与生成的内容进行比较,以查看内容是否已更改。 如果相同,则跳过此步骤 -- 如果`package.json.md5`不存在,则使用生成的 MD5 sum 创建它 -- 如果现在需要构建,或者`node_modules`不存在,或者给出了`-f`标志,则在前端目录中执行安装命令 - -#### 手动步骤 - -这一步可以从命令行或带有`npm install`的前端脚本完成. - -### 构建前端项目 - -#### Wails 命令行 - -- 如果给出了`-s`标志,则跳过此步骤 -- 检查`wails.json`中是否有构建命令`frontend:build` -- 如果没有,则跳过此步骤 -- 如果有,就在 frontend 目录下执行它 - -#### 手动步骤 - -这一步可以从命令行或带有前端构建脚本`npm run build`的脚本或任何前端构建脚本完成。 - -### 生成资源 - -#### Wails 命令行 - -- 如果设置了`-nopackage`标志,则跳过此阶段 -- 如果`build/appicon.png`文件不存在,则创建一个默认文件 -- 对于 Windows,请参阅[Windows](#windows) -- 如果`build/windows/icon.ico`不存在,它将从`build/appicon.png`图像创建它。 - -##### Windows - -- 如果`build/windows/icon.ico`不存在,它将从`build/appicon.png`创建 256、128、64、48、32 和 16 大小的图标。 这是使用[winicon](https://github.com/leaanthony/winicon)完成的。 -- 如果`build/windows/.manifest`文件不存在,它会从默认版本创建它。 -- 将应用程序编译为生产版本(如上所述)。 -- 使用[winres](https://github.com/tc-hib/winres)将 icon 和 manifest 打包到一个`.syso`文件。 - -#### 手动步骤 - -- 使用[winicon](https://github.com/leaanthony/winicon)命令行工具或者其他工具创建`icon.ico` -- 为您的应用程序创建或者更新`.manifest`文件 -- 使用[winres 命令行](https://github.com/tc-hib/go-winres)生成一个`.syso`文件 - -### 编译应用程序 - -#### Wails 命令行 - -- 如果提供了`-clean`标志,则删除并重新创建`build`目录 -- 对于`wails dev`,使用以下默认 Go 标志:`-tags dev -gcflags "all=-N -l"` -- 对于`wails build`,使用以下默认 Go 标志:`-tags desktop,production -ldflags "-w -s"` - - 在 Windows 上, `-ldflags "-w -h -H windowsgui"` -- 使用`-tags`传递给命令行的其他`tags`被添加到默认值中 -- 使用`-ldflags`传递给命令行的其他`ldflags`将添加到默认值中 -- 传递`-o`标志 -- 指定的`-compiler`将用于 Go 编译器 - -#### 手动步骤 - -- 开发环境构建,最简单的命令是: `go build -tags dev -gcflags "all=-N -l"` -- 生产环境构建,最简单的命令是:`go build -tags desktop,production -ldflags "-w -s -H windowsgui"` -- 确保在与`.syso`文件相同的目录中进行编译 - -### 压缩应用程序 - -#### Wails 命令行 - -- 如果已给出`-upx`标志,则`upx`程序将运行以使用默认设置压缩应用程序 -- 如果也传递了`-upxflags`标志,则使用这些标志而不是默认 - -#### 手动步骤 - -- 手动运行`upx [flags]`以压缩应用程序。 diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/migrating.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/migrating.mdx deleted file mode 100644 index 426c6cba6..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/migrating.mdx +++ /dev/null @@ -1,205 +0,0 @@ -# 从 v1 迁移 - -## 概述 - -Wails v2 与 v1 相比有重大变化。 本文档旨在重点介绍迁移现有项目的更改和步骤。 - -### 创建应用程序 - -在 v1 中,使用`wails.CreateApp`来创建主应用程序,使用`app.Bind`来添加绑定,然后使用`app.Run()`运行应用程序。 - -示例: - -```go title="v1" - app := wails.CreateApp(&wails.AppConfig{ - Title: "MyApp", - Width: 1024, - Height: 768, - JS: js, - CSS: css, - Colour: "#131313", - }) - app.Bind(basic) - app.Run() -``` - -在 v2 中,只有一个方法`wails.Run()`接受[应用程序参数选项](../reference/options#应用程序参数选项)。 - -```go title="v2" - err := wails.Run(&options.App{ - Title: "MyApp", - Width: 800, - Height: 600, - Assets: assets, - Bind: []interface{}{ - basic, - }, - }) -``` - -### 绑定 - -在 v1 中,可以绑定任意函数和结构。 在 v2 中,这已被简化为仅绑定结构。 以前传递给 v1`Bind()`中的方法的结构实例现在在[应用程序参数选项](../reference/options#应用程序参数选项)`Bind`字段中指定: - -```go title="v1" - app := wails.CreateApp(/* options */) - app.Bind(basic) -``` - -```go title="v2" - err := wails.Run(&options.App{ - /* other options */ - Bind: []interface{}{ - basic, - }, - }) -``` - -在 v1 中,绑定方法在`window.backend`中。 这已更改为`window.go`。 - -### 应用程序生命周期 - -In v1, there were 2 special methods in a bound struct: `WailsInit()` and `WailsShutdown()`. In v1, there were 2 special methods in a bound struct: `WailsInit()` and `WailsShutdown()`. These have been replaced with 3 lifecycle hooks as part of the [application options](../reference/options.mdx#application-options): In v1, there were 2 special methods in a bound struct: `WailsInit()` and `WailsShutdown()`. These have been replaced with 3 lifecycle hooks as part of the [application options](../reference/options.mdx#application-options): In v1, there were 2 special methods in a bound struct: `WailsInit()` and `WailsShutdown()`. These have been replaced with 3 lifecycle hooks as part of the [application options](../reference/options.mdx#application-options): - -- [应用启动回调](../reference/options.mdx#onstartup) -- [应用退出回调](../reference/options.mdx#onshutdown) -- [前端 Dom 加载完成回调](../reference/options.mdx#ondomready) - -注意:[前端 Dom 加载完成回调](../reference/options#前端-dom-加载完成回调)替换了 v1 中的 `wails:ready` 系统事件。 - -这些方法可以是标准函数,但通常的做法是将它们作为结构的一部分: - -```go title="v2" - basic := NewBasicApp() - err := wails.Run(&options.App{ - /* Other Options */ - OnStartup: basic.startup, - OnShutdown: basic.shutdown, - OnDomReady: basic.domready, - }) -... -type Basic struct { - ctx context.Context -} -func (b *Basic) startup(ctx context.Context) { - b.ctx = ctx -} -... -type Basic struct { - ctx context.Context -} -func (b *Basic) startup(ctx context.Context) { - b.ctx = ctx -} -... -type Basic struct { - ctx context.Context -} -func (b *Basic) startup(ctx context.Context) { - b.ctx = ctx -} -... -``` - -### 运行时 - -v2 中的运行时比 v1 丰富得多,支持菜单、窗口操作和更好的对话框。 方法的签名略有变化 - 请参阅[运行时](../reference/runtime/intro)。 - -在 v1 中,[运行时](../reference/runtime/intro)可通过传递给`WailsInit()`. 在 v2 中,运行时已移出到它自己的包。 In v2, the runtime has been moved out to its own package. 运行时中的每个方法都采用`context.Context`传递给了[应用启动回调](../reference/options#应用启动回调)方法。 - -```go title="Runtime Example" -package main - -import "github.com/wailsapp/wails/v2/pkg/runtime" - -type Basic struct { - ctx context.Context -} - -// startup is called at application startup -func (a *App) startup(ctx context.Context) { - a.ctx = ctx - runtime.LogInfo(ctx, "Application Startup called!") -} -} -} - -``` - -### 资源 - -在 v2 最大的变化是资源的处理方式。 - -在 v1 中,资源通过 2 个应用程序参数选项传递: - -- `JS` - 应用程序的 Javascript -- `CSS` - 应用程序的 CSS - -这意味着生成单个 JS 和 CSS 文件的责任在于开发人员。 这本质上需要使用繁琐的打包程序,例如 webpack。 - -在 v2 中,Wails 不对您的前端资源做任何预设,就像网络服务器一样。 您的所有应用程序资源都作为`embed.FS`. - -这意味着不需要打包您的资源、将图像编码为 Base64 或尝试使用奇葩的打包工具配置来使用自定义字体。 - -在启动时,Wails 将扫描给定的`embed.FS`的`index.html`并将其位置用作所有其他应用程序资源的根路径 - 就像网络服务器一样。 - -示例:应用程序具有以下项目布局。 所有最终资源都放在 `frontend/dist`目录中: - -```shell -. -. -. -├── build/ -├── frontend/ -│ └── dist/ -│ ├── index.html -│ ├── main.js -│ ├── main.css -│ └── logo.svg -├── main.go -└── wails.json -``` - -应用程序可以通过简单地创建一个`embed.FS`来使用这些资源: - -```go title="Assets Example" -//go:embed frontend/dist -var assets embed.FS - -func main() { - err := wails.Run(&options.App{ - /* Other Options */ - Assets: assets, - }) -} -``` - -当然,如果您愿意,也可以使用打包工具。 唯一的要求是在 Wails 中使用`embed.FS`,将最终的程序资源目录传递给[应用程序参数选项](../reference/options#应用程序参数选项)的`Assets`键。 - -### 项目配置 - -在 v1 中,项目配置存储在项目根的 `project.json` 文件中。 在 v2 中,项目配置存储在项目根部的 `wails.json` 文件中。 - -文件的格式略有不同。 下面是区别: - -

- -| v1 | v2 | Notes | -| ------------------ | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| name | name | | -| description | | Removed | -| author / name | author / name | | -| author / email | author / email | | -| version | version | | -| binaryname | outputfilename | Changed | -| frontend / dir | | Removed | -| frontend / install | frontend:install | Changed | -| frontend / build | frontend:build | Changed | -| frontend / bridge | | Removed | -| frontend / serve | | Removed | -| tags | | Removed | -| | wailsjsdir | The directory to generate wailsjs modules | -| | assetdir | The directory of the compiled frontend assets for `dev` mode. This is normally inferred and could be left empty. | -| | reloaddirs | Comma separated list of additional directories to watch for changes and to trigger reloads in `dev` mode. 这只需要一些更重要的资源配置。 | - -

diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/mouse-buttons.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/mouse-buttons.mdx deleted file mode 100644 index dcb5b582d..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/mouse-buttons.mdx +++ /dev/null @@ -1,25 +0,0 @@ -# 鼠标按钮 - -The Wails runtime intercepts mouse clicks to determine whether a frameless window needs resizing or a window needs to be moved. It has been asked how to detect when a mouse click has occurred, because `window.onclick` doesn't report the mouse buttons correctly. The following code shows how to detect mouse clicks: It has been asked how to detect when a mouse click has occurred, because `window.onclick` doesn't report the mouse buttons correctly. The following code shows how to detect mouse clicks: It has been asked how to detect when a mouse click has occurred, because `window.onclick` doesn't report the mouse buttons correctly. The following code shows how to detect mouse clicks: - -```javascript -window.addEventListener('mousedown', handleMouseButtonDown); - -function handleMouseButtonDown(event) { - if (event.button === 0) { - // left mouse button - } else if (event.button === 1) { - // middle mouse button - } else if (event.button === 2) { - // right mouse button - } else if (event.button === 3) { - // back mouse button - } else if (event.button === 4) { - // forward mouse button - } else { - // other mouse button - } -} -``` - -Reference: https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/overscroll.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/overscroll.mdx deleted file mode 100644 index 4262f1f84..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/overscroll.mdx +++ /dev/null @@ -1,10 +0,0 @@ -# 滚动超出 - -[Overscroll](https://developer.mozilla.org/zh-CN/docs/Web/CSS/overscroll-behavior) 是当您滚动超出页面内容边界时有时会获得的“弹跳效果”。 这在移动应用程序中很常见。 这可以使用 CSS 禁用: - -```css -html { - height: 100%; - overflow: hidden; -} -``` diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/routing.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/routing.mdx deleted file mode 100644 index 910290a98..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/routing.mdx +++ /dev/null @@ -1,49 +0,0 @@ -# 路由 - -路由是一种在应用程序中切换视图的流行方式。 此页面提供了有关如何执行此操作的一些指导。 - -## Vue - -在 Vue 中推荐的路由方法是[Hash 模式](https://next.router.vuejs.org/guide/essentials/history-mode.html#hash-mode): - -```js -import { createRouter, createWebHashHistory } from "vue-router"; - -const router = createRouter({ - history: createWebHashHistory(), - routes: [ - // .... - ], -}); - ], -}); -``` - -## Angular - -在 Angular 中推荐的路由方法是[HashLocationStrategy](https://codecraft.tv/courses/angular/routing/routing-strategies/#_hashlocationstrategy): - -```ts -RouterModule.forRoot(routes, { useHash: true }); -``` - -## React - -The recommended approach for routing in React is [HashRouter](https://reactrouter.com/docs/en/v6/routers/hash-router): - -```jsx -import { HashRouter } from "react-router-dom"; - -ReactDOM.render( - - {/* The rest of your app goes here */} - - } exact /> - } /> - } /> - {/* more... */} - - , - root -); -``` diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/signing.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/signing.mdx deleted file mode 100644 index a1f4ca990..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/signing.mdx +++ /dev/null @@ -1,575 +0,0 @@ -# 代码签名 - -This is a guide on how you can sign your binaries generated with Wails on MacOS and Windows. The guide will target CI environments, more specifically GitHub Actions. The guide will target CI environments, more specifically GitHub Actions. The guide will target CI environments, more specifically GitHub Actions. - -## Windows - -First off you need a code signing certificate. First off you need a code signing certificate. If you do not already have one, Microsoft's info page lists some providers [here](https://docs.microsoft.com/en-us/windows-hardware/drivers/dashboard/get-a-code-signing-certificate). First off you need a code signing certificate. If you do not already have one, Microsoft's info page lists some providers [here](https://docs.microsoft.com/en-us/windows-hardware/drivers/dashboard/get-a-code-signing-certificate). Please note that an EV certificate is not required unless you need to write kernel-level software such as device drivers. For signing your Wails app, a standard code signing certificate will do just fine. For signing your Wails app, a standard code signing certificate will do just fine. First off you need a code signing certificate. If you do not already have one, Microsoft's info page lists some providers [here](https://docs.microsoft.com/en-us/windows-hardware/drivers/dashboard/get-a-code-signing-certificate). Please note that an EV certificate is not required unless you need to write kernel-level software such as device drivers. For signing your Wails app, a standard code signing certificate will do just fine. For signing your Wails app, a standard code signing certificate will do just fine. - -It may be a good idea to check with your certificate provider how to sign your binaries on your local machine before targeting automated build systems, just so you know if there are any special requirements. For instance, [here](https://www.ssl.com/how-to/using-your-code-signing-certificate/) is SSL.com's code signing guide for Windows. If you know how to sign locally, it will be easier to troubleshoot any potential issues in a CI environment. For instance, SSL.com code signing certificates require the `/tr` flag for [SignTool.exe](https://docs.microsoft.com/en-us/windows/win32/seccrypto/signtool) while other providers may only need the `/t` flag for providing the timestamping server. Popular GitHub Actions for signing Windows binaries like [this one](https://github.com/Dana-Prajea/code-sign-action) does not support the `/tr` flag on SignTool.exe. Therefore this guide will focus on signing our app manually with PowerShell commands, but you can use actions like the [code-sign-action](https://github.com/Dana-Prajea/code-sign-action) Action if you prefer. - -First off, let's make sure we are able to build our Wails app in our GitHub CI. Here is a small workflow template: Here is a small workflow template: Here is a small workflow template: - -```yaml -name: "example" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -name: "example" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -jobs: - package: - strategy: - matrix: - platform: [ windows-latest, macos-latest ] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend manually here, unless you have configured frontend build and install commands in wails.json. - name: "example" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -jobs: - package: - strategy: - matrix: - platform: [ windows-latest, macos-latest ] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend here, unless you have configured frontend build and install commands in wails.json. - - name: Get Wails - run: go install github.com/wailsapp/wails/v2/cmd/wails@latest - - name: Build Wails app - run: | - wails build - - name: upload artifacts macOS - if: matrix.platform == 'macos-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-macos - path: build/bin/* - - name: upload artifacts windows - if: matrix.platform == 'windows-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-windows - path: build/bin/* - name: "example" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -jobs: - package: - strategy: - matrix: - platform: [ windows-latest, macos-latest ] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend here, unless you have configured frontend build and install commands in wails.json. - - name: Get Wails - run: go install github.com/wailsapp/wails/v2/cmd/wails@latest - - name: Build Wails app - run: | - wails build - - name: upload artifacts macOS - if: matrix.platform == 'macos-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-macos - path: build/bin/* - - name: upload artifacts windows - if: matrix.platform == 'windows-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-windows - path: build/bin/* -``` - -Next we need to give the GitHub workflow access to our signing certificate. This is done by encoding your .pfx or .p12 certificate into a base64 string. To do this in PowerShell, you can use the following command assuming your certificate is called 'my-cert.p12': This is done by encoding your .pfx or .p12 certificate into a base64 string. To do this in PowerShell, you can use the following command assuming your certificate is called 'my-cert.p12': This is done by encoding your .pfx or .p12 certificate into a base64 string. To do this in PowerShell, you can use the following command assuming your certificate is called 'my-cert.p12': - -```PowerShell -certutil -encode .\my-cert.p12 my-cert-base64.txt -``` - -You should now have your .txt file with the base64 encoded certificate. It should start with _-----BEGIN CERTIFICATE-----_ and end with _-----END CERTIFICATE-----_. Now you need to make two action secrets on GitHub. Navigate to _Settings -> Secrets -> Actions_ and create the two following secrets: - -- **WIN_SIGNING_CERT** with the contents of your base64 encoded certificate text. -- **WIN_SIGNING_CERT_PASSWORD** with the contents of your certificate password. - -Now we're ready to implement the signing in our workflow using one of the two methods: - -### Method 1: signing with commands - -This method uses PowerShell commands to sign our app, and leaves you control over the entire signing process. - -After the `"Build Wails app"` step, we can add the following step to our workflow: - -```yaml -- name: Sign Windows binaries - if: matrix.platform == 'windows-latest' - run: | - echo "Creating certificate file" - New-Item -ItemType directory -Path certificate - Set-Content -Path certificate\certificate.txt -Value '${{ secrets.WIN_SIGNING_CERT }}' - certutil -decode certificate\certificate.txt certificate\certificate.pfx - echo "Signing our binaries" - & 'C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe' sign /fd /t /f certificate\certificate.pfx /p '${{ secrets.WIN_SIGNING_CERT_PASSWORD }}' - -``` - -This script creates a new directory for your certificate file, creates the certificate file from our base64 secret, converts it to a .pfx file, and finally signs the binary. The following variables needs to be replaced in the last line: The following variables needs to be replaced in the last line: The following variables needs to be replaced in the last line: - -- **signing algorithm**: usually sha256. -- **timestamping server**: URL to the timestamping server to use with your certificate. -- **path to binary**: path to the binary you want to sign. - -Given that our Wails config has `outputfilename` set to "app.exe" and that we have a certificate from SSL.com, this would be our workflow: - -```yaml -name: "example" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -jobs: - package: - strategy: - matrix: - platform: [windows-latest, macos-latest] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend here, unless you have configured frontend build and install commands in wails.json. - name: "example combined" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -jobs: - package: - strategy: - matrix: - platform: [ windows-latest, macos-latest ] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend here, unless you have configured frontend build and install commands in wails.json. - - name: Get Wails - run: go install github.com/wailsapp/wails/v2/cmd/wails@latest - - name: Build Wails app - run: | - wails build - - name: MacOS download gon for code signing and app notarization - if: matrix.platform == 'macos-latest' - run: | - brew install mitchellh/gon/gon - - name: Import Code-Signing Certificates for macOS - if: matrix.platform == 'macos-latest' - uses: Apple-Actions/import-codesign-certs@v1 - with: - # The certificates in a PKCS12 file encoded as a base64 string - p12-file-base64: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_P12_BASE64 }} - # The password used to import the PKCS12 file. - p12-password: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_PASSWORD }} - - name: Sign our macOS binary - if: matrix.platform == 'macos-latest' - run: | - echo "Signing Package" - gon -log-level=info ./build/darwin/gon-sign.json - - name: Sign Windows binaries - if: matrix.platform == 'windows-latest' - run: | - echo "Creating certificate file" - New-Item -ItemType directory -Path certificate - Set-Content -Path certificate\certificate.txt -Value '${{ secrets.WIN_SIGNING_CERT }}' - certutil -decode certificate\certificate.txt certificate\certificate.pfx - echo "Signing our binaries" - & 'C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe' sign /fd sha256 /tr http://ts.ssl.com /f certificate\certificate.pfx /p '${{ secrets.WIN_SIGNING_CERT_PASSWORD }}' .\build\bin\Monitor.exe - - name: upload artifacts macOS - if: matrix.platform == 'macos-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-macos - path: build/bin/* - - name: upload artifacts windows - if: matrix.platform == 'windows-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-windows - path: build/bin/* -``` - -### Method 2: automatically signing with Action - -It is possible to use a Windows code signing Action like [this](https://github.com/marketplace/actions/code-sign-a-file-with-pfx-certificate) one, but note it requires a SHA1 hash for the certificate and a certificate name. View an example of how to configure it on the Action's [marketplace](https://github.com/marketplace/actions/code-sign-a-file-with-pfx-certificate). View an example of how to configure it on the Action's [marketplace](https://github.com/marketplace/actions/code-sign-a-file-with-pfx-certificate). View an example of how to configure it on the Action's [marketplace](https://github.com/marketplace/actions/code-sign-a-file-with-pfx-certificate). - ---- - -## MacOS - -First off you need your code signing certificate from Apple. If you do not have one, a simple Google search will help you acquire one. Once you have your certificate, you need to export it and encode it to base64. [This tutorial](https://localazy.com/blog/how-to-automatically-sign-macos-apps-using-github-actions) shows you how to do that in an easy manner. Once you have exported your .p12 certificate file, you can encode it to base64 as seen in the tutorial with the following command: If you do not have one, a simple Google search will help you acquire one. Once you have your certificate, you need to export it and encode it to base64. [This tutorial](https://localazy.com/blog/how-to-automatically-sign-macos-apps-using-github-actions) shows you how to do that in an easy manner. Once you have exported your .p12 certificate file, you can encode it to base64 as seen in the tutorial with the following command: If you do not have one, a simple Google search will help you acquire one. Once you have your certificate, you need to export it and encode it to base64. [This tutorial](https://localazy.com/blog/how-to-automatically-sign-macos-apps-using-github-actions) shows you how to do that in an easy manner. Once you have exported your .p12 certificate file, you can encode it to base64 as seen in the tutorial with the following command: - -```bash -base64 Certificates.p12 | pbcopy -``` - -Now you're ready to create some GitHub project secrets, just as with Windows: - -- **APPLE_DEVELOPER_CERTIFICATE_P12_BASE64** with the contents of your newly copied base64 certificate. -- **APPLE_DEVELOPER_CERTIFICATE_PASSWORD** with the contents of your certificate password. -- **APPLE_PASSWORD** with the contents of an App-Specific password to your Apple-ID account which you can generate [here](https://appleid.apple.com/account/manage). - -Let's make sure we are able to build our Wails app in our GitHub Action workflow. Here is a small template: Here is a small template: Here is a small template: - -```yaml -name: "example" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -jobs: - package: - strategy: - matrix: - platform: [windows-latest, macos-latest] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend here, unless you have configured frontend build and install commands in wails.json. - name: "example" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -jobs: - package: - strategy: - matrix: - platform: [ windows-latest, macos-latest ] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend here, unless you have configured frontend build and install commands in wails.json. - - name: Get Wails - run: go install github.com/wailsapp/wails/v2/cmd/wails@latest - - name: Build Wails app - run: | - wails build - - name: upload artifacts macOS - if: matrix.platform == 'macos-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-macos - path: build/bin/* - - name: upload artifacts windows - if: matrix.platform == 'windows-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-windows - path: build/bin/* -``` - -For code signing on macOS, [gon](https://github.com/mitchellh/gon) is a very handy tool for code signing and communicating with Apple servers, also written in Go, and will be used in this guide. - -After the `Build Wails app` step, add the following to the workflow: - -```yaml -- name: MacOS download gon for code signing and app notarization - if: matrix.platform == 'macos-latest' - run: | - brew install mitchellh/gon/gon -``` - -Now we need to configure some gon config files in our `build/darwin` directory: - -1. gon-sign.json: - -```json -{ - "source" : ["./build/bin/app.app"], - "bundle_id" : "app.myapp", - "apple_id": { - "username": "my-appleid@email.com", - "password": "@env:APPLE_PASSWORD" - }, - "sign" :{ - "application_identity" : "Developer ID Application: My Name" - } - } -``` - -Where `source` is your Wails binary, `bundle_id` is your bundle ID, `apple_id` contains your Apple ID username and App-Specific password which you created earlier, and `sign.application_identity` is your identity which you can find by running the following command: - -```bash -security find-identity -v -p codesigning -``` - -2. entitlements.plist: - -```plist -name: "example combined" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -jobs: - package: - strategy: - matrix: - platform: [ windows-latest, macos-latest ] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend here, unless you have configured frontend build and install commands in wails.json. - - name: Get Wails - run: go install github.com/wailsapp/wails/v2/cmd/wails@latest - - name: Build Wails app - run: | - wails build - - name: MacOS download gon for code signing and app notarization - if: matrix.platform == 'macos-latest' - run: | - brew install mitchellh/gon/gon - - name: Import Code-Signing Certificates for macOS - if: matrix.platform == 'macos-latest' - uses: Apple-Actions/import-codesign-certs@v1 - with: - # The certificates in a PKCS12 file encoded as a base64 string - p12-file-base64: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_P12_BASE64 }} - # The password used to import the PKCS12 file. - - name: Import Code-Signing Certificates for macOS - if: matrix.platform == 'macos-latest' - uses: Apple-Actions/import-codesign-certs@v1 - with: - # The certificates in a PKCS12 file encoded as a base64 string - p12-file-base64: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_P12_BASE64 }} - # The password used to import the PKCS12 file. - p12-password: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_PASSWORD }} -- name: Sign our macOS binary - if: matrix.platform == 'macos-latest' - run: | - echo "Signing Package" - gon -log-level=info ./build/darwin/gon-sign.json - p12-password: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_PASSWORD }} -- name: Sign our macOS binary - if: matrix.platform == 'macos-latest' - run: | - echo "Signing Package" - gon -log-level=info ./build/darwin/gon-sign.json - p12-password: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_PASSWORD }} -- name: Sign our macOS binary - if: matrix.platform == 'macos-latest' - run: | - echo "Signing Package" - gon -log-level=info ./build/darwin/gon-sign.json -``` - -In this file you configure the entitlements you need for you app, e.g. camera permissions if your app uses the camera. Read more about entitlements [here](https://developer.apple.com/documentation/bundleresources/entitlements). Read more about entitlements [here](https://developer.apple.com/documentation/bundleresources/entitlements). Read more about entitlements [here](https://developer.apple.com/documentation/bundleresources/entitlements). - -Make sure you have updated your `Info.plist` file with the same bundle ID as you entered in `gon-sign.json`. Here's an example `Info.plist` file: Here's an example `Info.plist` file: Here's an example `Info.plist` file: - -```plist - - - CFBundlePackageTypeAPPL - CFBundleNameMyApp - CFBundleExecutableapp - CFBundleIdentifierapp.myapp - CFBundleVersion0.1.0 - CFBundleGetInfoStringMy app is cool and nice and chill and - CFBundleShortVersionString0.1.0 - CFBundleIconFileiconfile - LSMinimumSystemVersion10.13.0 - NSHighResolutionCapabletrue - LSApplicationCategoryTypepublic.app-category.utilities - NSHumanReadableCopyright© Me - -``` - -Now we're ready to add the signing step in our workflow after building the Wails app: - -```yaml -- name: Import Code-Signing Certificates for macOS - if: matrix.platform == 'macos-latest' - uses: Apple-Actions/import-codesign-certs@v1 - with: - # The certificates in a PKCS12 file encoded as a base64 string - p12-file-base64: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_P12_BASE64 }} - # The password used to import the PKCS12 file. - p12-password: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_PASSWORD }} -- name: Sign our macOS binary - if: matrix.platform == 'macos-latest' - run: | - echo "Signing Package" - gon -log-level=info ./build/darwin/gon-sign.json - p12-password: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_PASSWORD }} -- name: Sign our macOS binary - if: matrix.platform == 'macos-latest' - run: | - echo "Signing Package" - gon -log-level=info ./build/darwin/gon-sign.json - p12-password: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_PASSWORD }} -- name: Sign our macOS binary - if: matrix.platform == 'macos-latest' - run: | - echo "Signing Package" - gon -log-level=info ./build/darwin/gon-sign.json -``` - -Please note that signing binaries with Apple could take anywhere from minutes to hours. - -## Combined workflow file: - -Here is our GitHub workflow file with Windows + macOS combined: - -```yaml -name: "example combined" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -jobs: - package: - strategy: - matrix: - platform: [windows-latest, macos-latest] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend here, unless you have configured frontend build and install commands in wails.json. - - name: Get Wails - run: go install github.com/wailsapp/wails/v2/cmd/wails@latest - - name: Build Wails app - run: | - wails build - - name: MacOS download gon for code signing and app notarization - if: matrix.platform == 'macos-latest' - run: | - brew install mitchellh/gon/gon - - name: Import Code-Signing Certificates for macOS - if: matrix.platform == 'macos-latest' - uses: Apple-Actions/import-codesign-certs@v1 - with: - # The certificates in a PKCS12 file encoded as a base64 string - p12-file-base64: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_P12_BASE64 }} - # The password used to import the PKCS12 file. - - name: Import Code-Signing Certificates for macOS - if: matrix.platform == 'macos-latest' - uses: Apple-Actions/import-codesign-certs@v1 - with: - # The certificates in a PKCS12 file encoded as a base64 string - p12-file-base64: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_P12_BASE64 }} - # The password used to import the PKCS12 file. - p12-password: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_PASSWORD }} -- name: Sign our macOS binary - if: matrix.platform == 'macos-latest' - run: | - echo "Signing Package" - gon -log-level=info ./build/darwin/gon-sign.json - p12-password: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_PASSWORD }} -- name: Sign our macOS binary - if: matrix.platform == 'macos-latest' - run: | - echo "Signing Package" - gon -log-level=info ./build/darwin/gon-sign.json - p12-password: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_PASSWORD }} -- name: Sign our macOS binary - if: matrix.platform == 'macos-latest' - run: | - echo "Signing Package" - gon -log-level=info ./build/darwin/gon-sign.json -``` - -# End notes - -This guide inspired by the RiftShare project and its workflow, which is highly recommended to check out [here](https://github.com/achhabra2/riftshare/blob/main/.github/workflows/build.yaml). diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/templates.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/templates.mdx deleted file mode 100644 index 5dba260b8..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/templates.mdx +++ /dev/null @@ -1,102 +0,0 @@ -# 模板 - -Wails 从预先创建的模板生成项目。 在 v1 中,这是一组难以维护的项目,这些项目可能会过时。 在 v2 中,为了增强社区的能力,为模板添加了一些新功能: - -- 能够从[远程模板](../reference/cli#远程模板)生成项目 -- 帮助创建自己的模板的工具 - -## 创建模板 - -要创建模板,您可以使用`wails generate template`命令。 要生成默认模板,请运行: - -`wails generate template -name mytemplate` - -这将使用默认文件创建“mytemplate”目录: - -```shell title=mytemplate/ -. -. -. -|-- NEXTSTEPS.md -|-- README.md -|-- app.tmpl.go -|-- frontend -| `-- dist -| |-- assets -| | |-- fonts -| | | |-- OFL.txt -| | | `-- nunito-v16-latin-regular.woff2 -| | `-- images -| | `-- logo-dark.svg -| |-- index.html -| |-- main.css -| `-- main.js -|-- go.mod.tmpl -|-- main.tmpl.go -|-- template.json -`-- wails.tmpl.json -``` - -### 模板概述 - -默认模板包含以下文件和目录: - -| 文件名 / 目录 | 描述 | -| --------------- | ----------------- | -| NEXTSTEPS.md | 有关如何完成模板的说明 | -| README.md | 随模板发布的 README | -| app.tmpl.go | `app.go` 模板文件 | -| frontend/ | 包含前端资源的目录 | -| go.mod.tmpl | `go.mod` 模板文件 | -| main.tmpl.go | `main.go` 模板文件 | -| template.json | 模板元数据 | -| wails.tmpl.json | `wails.json` 模板文件 | - -此时,建议按照`NEXTSTEPS.md`中的步骤操作。 - -## 从现有项目创建模板 - -通过在生成模板时将路径传递给项目,可以从现有的前端项目创建模板。 我们现在将介绍如何创建 Vue 3 模板: - -- 安装 vue cli: `npm install -g @vue/cli` -- 创建默认项目:`vue create vue3-base` - - 选择 `Default (Vue 3) ([Vue 3] babel, eslint)` -- 项目生成后,运行: - -```shell -> wails generate template -name wails-vue3-template -frontend .\vue3-base\ -Extracting base template files... -Migrating existing project files to frontend directory... -Updating package.json data... -Renaming package.json -> package.tmpl.json... -Updating package-lock.json data... -Renaming package-lock.json -> package-lock.tmpl.json... -Migrating existing project files to frontend directory... -Updating package.json data... -Renaming package.json -> package.tmpl.json... -Updating package-lock.json data... -Renaming package-lock.json -> package-lock.tmpl.json... -``` - -- 现在可以按照`NEXTSTEPS.md`中指定的方式定制模板。 -- 一旦文件准备完毕,就可以通过运行命令来测试它:`wails init -n my-vue3-project -t .\wails-vue3-template\` -- 要测试新项目,请运行:`cd my-vue3-project` then `wails build` -- 项目编译完成后,运行它:`.\build\bin\my-vue3-project.exe` -- 您应该有了一个功能齐全的 Vue3 应用程序: - -
- -
- -## 发布模板 - -发布模板只是将文件推送到 GitHub。 鼓励以下最佳实践: - -- 从前端目录中删除任何不需要的文件和目录(例如:.git) -- 确保`template.json`完整,尤其是`helpurl` -- 将文件推送到 GitHub -- 在[社区模板](../community/templates)页面上创建 PR -- 在[模板公告](https://github.com/wailsapp/wails/discussions/825)讨论板上发布模板 diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/troubleshooting.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/troubleshooting.mdx deleted file mode 100644 index bf338f32f..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/troubleshooting.mdx +++ /dev/null @@ -1,142 +0,0 @@ -# Troubleshooting - -An assortment of troubleshooting tips. - -## The `wails` command appears to be missing? - -If your system is reporting that the `wails` command is missing, make sure you have followed the Go installation guide correctly. Normally, it means that the `go/bin` directory in your User's home directory is not in the `PATH` environment variable. You will also normally need to close and reopen any open command prompts so that changes to the environment made by the installer are reflected at the command prompt. - -## My application is displaying a white/blank screen - -检查您的应用程序是否在正确目录中包含资源。 Check that your application includes the assets from the correct directory. In your `main.go` file, you will have something similar to the following code: - -```go -//go:embed frontend/dist -var assets embed.FS -``` - -Check that `frontend/dist` contains your application assets. - -### Mac - -If this happens on Mac, try adding the following to your `Info.plist`: - -```xml -NSAppTransportSecurity - - NSAllowsLocalNetworking - - -``` - -Reference: https://github.com/wailsapp/wails/issues/1504#issuecomment-1174317433 - -## Mac application not valid - -If your built application looks like this in finder: - -

- -

- -It's likely that your application's `info.plist` is invalid. Update the file in `build/.app/Contents/info.plist` and check if the data is valid, EG check the binary name is correct. To persist the changes, copy the file back to the `build/darwin` directory. - -## Cannot call backend method from frontend with variadic arguments - -If you have a backend method defined with variadic parameters, eg: - -```go -func (a *App) TestFunc(msg string, args ...interface{}) error { - // Code -} -``` - -calling this method from the frontend like this will fail: - -```js -var msg = "Hello: "; -var args = ["Go", "JS"]; -window.go.main.App.TestFunc(msg, ...args) - .then((result) => { - //do things here - }) - .catch((error) => { - //handle error - }); -``` - -Workaround: - -```js -var msg = "Hello "; -var args = ["Go", "JS"]; -window.go.main.App.TestFunc(msg, args) - .then((result) => { - //without the 3 dots - //do things here - }) - .catch((error) => { - //handle error - }); -``` - -Credit: https://github.com/wailsapp/wails/issues/1186 - -## I'm having getting proxy errors when trying to install Wails - -If you are getting errors like this: - -``` -"https://proxy.golang.org/github.com/wailsapp/wails/cmd/wails/@v/list": dial tcp 172.217.163.49:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. -``` - -it's probably because the official Go Proxy is being blocked (Users in China have reported this). The solution is to set up the proxy manually, eg: 解决方案是手动设置代理,例如: - -``` -go env -w GO111MODULE=on -go env -w GOPROXY=https://goproxy.cn,direct -``` - -Source: https://github.com/wailsapp/wails/issues/1233 - -## The generated Typescript doesn't have the correct types - -Sometimes the generated Typescript doesn't have the correct types. Sometimes the generated Typescript doesn't have the correct types. To mitigate this, it is possible to specify what types should be generated using the `ts_type` struct tag. For more details, please read [this](https://github.com/tkrajina/typescriptify-golang-structs#custom-types). For more details, please read [this](https://github.com/tkrajina/typescriptify-golang-structs#custom-types). - -## When I navigate away from `index.html`, I am unable to call methods on the frontend - -If you navigate away from `index.html` to a new html file, the context will be lost. If you navigate away from `index.html` to a new html file, the context will be lost. This can be fixed by adding the following imports to the `` section of any new page you navigate to: - -```html - - - - -``` - -Source: https://github.com/wailsapp/wails/discussions/1512 - -## I get `too many open files` errors on my Mac when I run `wails dev` - -By default, macOS will only allow you to open a maximum of 256 files. This can affect the `wails dev` command. This limit can be increased by running: `ulimit -n 1024` in the terminal. This can affect the `wails dev` command. This limit can be increased by running: `ulimit -n 1024` in the terminal. - -FSNotify is [looking to move to Apple's fsevents](https://github.com/fsnotify/fsnotify/issues/11) for Mac. If this isn't completed soon, we will create our own implementation, tracked [here](https://github.com/wailsapp/wails/issues/1733). If this isn't completed soon, we will create our own implementation, tracked [here](https://github.com/wailsapp/wails/issues/1733). - -## My Mac app gives me weird compilation errors - -A few users have reported seeing compilation errors such as the following: - -```shell -# github.com/wailsapp/wails/v2/internal/frontend/desktop/darwin -In file included from ../../pkg/mod/github.com/wailsapp/wails/v2@v2.0.0-beta.44.2/internal/frontend/desktop/darwin/callbacks.go:9: -In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:12: -/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSBundle.h:91:143: error: function does not return NSString -- (NSAttributedString *)localizedAttributedStringForKey:(NSString *)key value:(nullable NSString *)value table:(nullable NSString *)tableName NS_FORMAT_ARGUMENT(1) NS_REFINED_FOR_SWIFT API_AVAILABLE(macos(12.0), ios(15.0), watchos(8.0), tvos(15.0)); - ~~~~~~~~~~~~~~ ^ ~ -/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:103:48: note: expanded from macro 'NS_FORMAT_ARGUMENT' - #define NS_FORMAT_ARGUMENT(A) __attribute__ ((format_arg(A))) -``` - -This is *normally* due to a mismatch with the OS version you are running and the version of the XCode Command Line Tools installed. If you see an error like this, try upgrading your XCode Command Line Tools to the latest version. - -Source: https://github.com/wailsapp/wails/issues/1806 \ No newline at end of file diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/vscode.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/vscode.mdx deleted file mode 100644 index 9911a286c..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/vscode.mdx +++ /dev/null @@ -1,118 +0,0 @@ - -# Visual Studio Code - -This page is for miscellaneous tips and tricks when using Visual Studio Code with Wails. - -## Vetur Configuration - -Many thanks to [@Lyimmi](https://github.com/Lyimmi) for this tip. Many thanks to [@Lyimmi](https://github.com/Lyimmi) for this tip. Originally posted [here](https://github.com/wailsapp/wails/issues/1791#issuecomment-1228158349). - -Vetur is a popular plugin for Visual Studio Code that provides syntax highlighting and code completion for Vue projects. Vetur is a popular plugin for Visual Studio Code that provides syntax highlighting and code completion for Vue projects. When loading a Wails project in VSCode, Vetur will throw an error as it is expecting to find the frontend project in the root directory. To fix this, you can do the following: To fix this, you can do the following: - -Create a file named `vetur.config.js` in the project's root. - -```javascript -// vetur.config.js -/** @type {import('vls').VeturConfig} */ -module.exports = { - // **optional** default: `{}` - // override vscode settings - // Notice: It only affects the settings used by Vetur. - settings: { - "vetur.useWorkspaceDependencies": true, - "vetur.experimental.templateInterpolationService": true - }, - // **optional** default: `[{ root: './' }]` - // support monorepos - projects: [ - { - // **required** - // Where is your project? - // It is relative to `vetur.config.js`. - // root: './packages/repo1', - root: './frontend', - // **optional** default: `'package.json'` - // Where is `package.json` in the project? - // We use it to determine the version of vue. - // It is relative to root property. - package: './package.json', - // **optional** - // Where is TypeScript config file in the project? - // It is relative to root property. - tsconfig: './tsconfig.json', - // **optional** default: `'./.vscode/vetur/snippets'` - // Where is vetur custom snippets folders? - snippetFolder: './.vscode/vetur/snippets', - // **optional** default: `[]` - // Register globally Vue component glob. - // If you set it, you can get completion by that components. - // It is relative to root property. - // Notice: It won't actually do it. You need to use `require.context` or `Vue.component` - globalComponents: [ - './src/components/**/*.vue' - ] - } - ] -} - settings: { - "vetur.useWorkspaceDependencies": true, - "vetur.experimental.templateInterpolationService": true - }, - // **optional** default: `[{ root: './' }]` - // support monorepos - projects: [ - { - // **required** - // Where is your project? - // It is relative to `vetur.config.js`. - // root: './packages/repo1', - root: './frontend', - // **optional** default: `'package.json'` - // Where is `package.json` in the project? - // We use it to determine the version of vue. - // It is relative to root property. - package: './package.json', - // **optional** - // Where is TypeScript config file in the project? - // It is relative to root property. - tsconfig: './tsconfig.json', - // **optional** default: `'./.vscode/vetur/snippets'` - // Where is vetur custom snippets folders? - snippetFolder: './.vscode/vetur/snippets', - // **optional** default: `[]` - // Register globally Vue component glob. - // If you set it, you can get completion by that components. - // It is relative to root property. - // Notice: It won't actually do it. You need to use `require.context` or `Vue.component` - globalComponents: [ - './src/components/**/*.vue' - ] - } - ] -} -``` - -Next, configure `frontend/tsconfig.json`: - -```javascript -{ - "compilerOptions": { - "module": "system", - "noImplicitAny": true, - "removeComments": true, - "preserveConstEnums": true, - "sourceMap": true, - "outFile": "../../built/local/tsc.js", - "allowJs": true - }, - "exclude": [ - "node_modules", - "**/*.spec.ts" - ], - "include": [ - "src/**/*", - "wailsjs/**/*.ts" - ] -} -``` -This should enable you to now use Vetur as expected. diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/windows-installer.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/windows-installer.mdx deleted file mode 100644 index 5eb5b7d1f..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/windows-installer.mdx +++ /dev/null @@ -1,56 +0,0 @@ -# NSIS 安装程序 - -

- -
-

- -Wails 支持使用[NSIS 安装程序](https://nsis.sourceforge.io/)生成 Windows 安装程序。 - -## 安装 NSIS - -### Windows - -安装程序可在[NSIS 下载页面](https://nsis.sourceforge.io/Download)上找到。 - -如果您使用 chocolatey 包管理器,请运行以下脚本: - -``` -choco install nsis -``` - -如果手动安装 NSIS,则需要将 NSIS 安装目录中包含`makensis.exe`的*Bin*目录添加到 PATH 中。 [这是](https://www.architectryan.com/2018/03/17/add-to-the-path-on-windows-10/) 一个关于如何在 Windows 上添加到 PATH 的好教程。 - -### Linux - -应该可以通过您的发行版的软件包管理器获得`nsis`包。 - -### MacOS - -NSIS 可通 homebrew 安装:`brew install nsis`。 - -## 生成安装程序 - -创建新项目时,Wails 从`installer/info.json`中读取配置数据并使用项目的`wails.json`的 Info 部分,在`build/windows/installer`中生成 NSIS 配置文件: 创建新项目时,Wails 从`installer/info.json`中读取配置数据并使用项目的`wails.json`的 Info 部分,在`build/windows/installer`中生成 NSIS 配置文件: The config data is read from `installer/info.json` and that is configured to use the project's `wails.json` Info section: 创建新项目时,Wails 从`installer/info.json`中读取配置数据并使用项目的`wails.json`的 Info 部分,在`build/windows/installer`中生成 NSIS 配置文件: The config data is read from `installer/info.json` and that is configured to use the project's `wails.json` Info section: - -```json - // ... - "Info": { - "companyName": "My Company Name", - "productName": "Wails Vite", - "productVersion": "1.0.0", - "copyright": "Copyright.........", - "comments": "Built using Wails (https://wails.io)" - }, -``` - -要为您的应用程序生成安装程序,请使用`wails build`的`-nsis`标志: - -``` -wails build -nsis -``` - -现在可用安装程序将生成在`build/bin`目录中。 diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/windows.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/windows.mdx deleted file mode 100644 index 93f89b44c..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/guides/windows.mdx +++ /dev/null @@ -1,61 +0,0 @@ -# Windows 系统 - -此页面包含了在 Windows 上开发 Wails 应用程序相关的其他指南。 - -## 处理 WebView2 运行时依赖 - -为 Windows 构建 Wails 应用程序时对 Microsoft [WebView2 运行时](https://developer.microsoft.com/en-us/microsoft-edge/webview2/)有要求。 默认情况下,Windows 11 会安装它,但有些机器不会。 Wails 提供了一种简单的方法来处理这种依赖关系。 - -通过在构建时使用`-webview2`标志,您可以决定在未检测到合适的运行时的时候(包括安装的运行时是否太旧)应用程序将执行的操作。 四个选项是: - -1. Download(下载) -2. Embed(内嵌) -3. Browser(浏览器) -4. Error(错误) - -### Download(下载) - -此选项将提示用户在未找到合适的运行时时,提供从 Microsoft 的 WebView2 官方站点下载并运行引导程序。 如果用户继续,官方引导程序将被下载并运行。 - -### Embed(内嵌) - -此选项将官方引导程序嵌入到应用程序中。 如果没有找到合适的运行时,应用程序将提供并运行引导程序。 这将使二进制大小增加约 150k。 - -### Browser(浏览器) - -此选项将提示用户没有找到合适的运行时时,提供打开浏览器到 WebView2 官方页面,可以下载和安装引导程序。 然后应用程序将会退出,安装的操作留给用户。 - -### Error(错误) - -如果未找到合适的运行时间,则会向用户显示错误并且不采取进一步措施。 - -## Fixed version runtime - -Another way of dealing with webview2 dependency is shipping it yourself. Another way of dealing with webview2 dependency is shipping it yourself. You can download [fixed version runtime](https://developer.microsoft.com/ru-ru/microsoft-edge/webview2/#download-section) and bundle or download it with your application. Another way of dealing with webview2 dependency is shipping it yourself. You can download [fixed version runtime](https://developer.microsoft.com/microsoft-edge/webview2/#download-section) and bundle or download it with your application. - -Also, you should specify path to fixed version of webview2 runtime in the `windows.Options` structure when launching wails. - -```go - wails.Run(&options.App{ - Windows: &windows.Options{ - WebviewBrowserPath: "", - }, - }) -``` - -Note: When `WebviewBrowserPath` is specified, `error` strategy will be forced in case of minimal required version mismatch or invalid path to a runtime. - -## Spawning other programs - -When spawning other programs, such as scripts, you will see the window appear on the screen. To hide the window, you can use the following code: - -```go -cmd := exec.Command("your_script.exe") -cmd.SysProcAttr = &syscall.SysProcAttr{ - HideWindow: true, - CreationFlags: 0x08000000, -} -cmd.Start() -``` - -Solution provided by [sithembiso](https://github.com/sithembiso) on the [discussions board](https://github.com/wailsapp/wails/discussions/1734#discussioncomment-3386172). diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/howdoesitwork.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/howdoesitwork.mdx deleted file mode 100644 index 297b4087b..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/howdoesitwork.mdx +++ /dev/null @@ -1,435 +0,0 @@ ---- -sidebar_position: 20 ---- - -# 它是如何工作的? - -Wails 应用程序是一个带有一个 webkit 前端的标准的 Go 应用程序。 应用程序的 Go 部分由应用程序代码和一个运行时库组成, 该库提供了许多有用的操作,例如控制应用程序窗口。 前端是一个 webkit 窗口,将显示前端资源。 前端还可以使用运行时库的 Javascript 版本。 最后,可以将 Go 方法绑定到前端,这些将显示为可以调用的 Javascript 方法,就像它们是原生 Javascript 方法一样。 - -
- -
- -## 主应用程序 - -### 概述 - -主应用程序由对`wails.Run()`的调用组成。 它接受描述应用程序窗口大小、窗口标题、要使用的资源等应用程序配置。 基本应用程序可能如下所示: - -```go title="main.go" -package main - -import ( - "embed" - "log" - - "github.com/wailsapp/wails/v2" - "github.com/wailsapp/wails/v2/pkg/options" -) - -//go:embed frontend/dist -var assets embed.FS - -func main() { - - app := &App{} - - err := wails.Run(&options.App{ - Title: "Basic Demo", - Width: 1024, - Height: 768, - Assets: &assets, - OnStartup: app.startup, - OnShutdown: app.shutdown, - Bind: []interface{}{ - app, - }, - }) - if err != nil { - log.Fatal(err) - } -} - - -type App struct { - ctx context.Context -} - -func (b *App) startup(ctx context.Context) { - b.ctx = ctx -} - -func (b *App) shutdown(ctx context.Context) {} - -func (b *App) Greet(name string) string { - return fmt.Sprintf("Hello %s!", name) -} -``` - -### 选项概要 - -此示例设置了以下选项: - -- `Title` - 应该出现在窗口标题栏中的文本 -- `Width&Height`- 窗口的尺寸 -- `Assets` - 应用程序的前端资源 -- `OnStartup` - 创建窗口并即将开始加载前端资源时的回调 -- `OnShutdown` - 应用程序即将退出时的回调 -- `Bind` - 我们希望向前端暴露的一部分结构体实例 - -完整的应用程序参数选项列表可以在[参数选项](./reference/options)中找到。 - -#### 资产 - -`Assets` 选项是必须的,因为您不能拥有没有前端资源的 Wails 应用程序。 这些资源可以是您希望在 Web 应用程序中找到的任何文件 - html、js、css、svg、png 等。 **不需要生成资源包** - 纯文件即可。 当应用程序启动时,它将尝试从您的资源中加载`index.html`,并且那时起前端基本上将作为浏览器工作。 值得注意的是`embed.FS`对文件所在的位置没有要求。 嵌入路径很可能使用了相对于您的主应用程序代码的嵌套目录,例如 `frontend/dist`: - -```go title="main.go" -//go:embed frontend/dist -var assets embed.FS -``` - -启动时,Wails 将遍历嵌入的文件,寻找包含的`index.html`。 所有其他资源将相对于该目录加载。 - -由于可用于生产的二进制文件使用包含在`embed.FS`中的文件,因此应用程序不需要附带任何外部文件。 - -当使用`wails dev`命令在“开发”模式下,资源从磁盘加载,任何更改都会导致“实时重新加载”。 资产的位置将从 `embed.FS` 推断。 - -更多细节可以在[应用程序开发指南](./guides/application-development)中找到。 - -#### 应用程序生命周期回调 - -在即将加载前端`index.html`之前,对 [应用启动回调](./reference/options#应用启动回调) 中提供的函数进行调用。 一个标准的 Go 上下文被传递给这个方法。 调用运行时需要此上下文,因此标准方式是保存此时对它的引用。 在应用程序关闭之前,再次使用上下文以同样的方式调用 [应用退出回调](./reference/options#应用退出回调)。 当前端完成加载`index.html`中所有资源时,还有一个 [前端 Dom 加载完成回调](./reference/options#前端-dom-加载完成回调) ,相当于 Javascript 中的`body onload`事件。 还可以通过设置 [关闭应用程序之前回调](./reference/options#关闭应用程序之前回调) 选项来控制窗口关闭(或应用程序退出)事件。 - -#### 方法绑定 - -`Bind`选项是 Wails 应用程序中最重要的参数选项之一。 它指定向前端暴露哪些结构方法。 想到传统的 web 应用程序中的 "Controllers" 。 当应用程序启动时,它会检查 `Bind` 中列出的结构实例, 确定哪些方法是公开的(以大写字母开头),并将生成前端可以调用的那些方法的 Javascript 版本。 - -:::info 注意 - -Wails 要求您传入结构的 _实例_ 才能正确绑定它 - -::: - -在此示例中,我们创建一个新`App`实例,然后将此实例添加到`wails.Run`中的`Bind`选项: - -```go {16,24} title="main.go" -package main - -import ( - "embed" - "log" - - "github.com/wailsapp/wails/v2" - "github.com/wailsapp/wails/v2/pkg/options" -) - -//go:embed frontend/dist -var assets embed.FS - -func main() { - - app := &App{} - - err := wails.Run(&options.App{ - Title: "Basic Demo", - Width: 1024, - Height: 768, - Assets: &assets, - Bind: []interface{}{ - app, - }, - }) - if err != nil { - log.Fatal(err) - } -} - - -type App struct { - ctx context.Context -} - -func (a *App) Greet(name string) string { - return fmt.Sprintf("Hello %s!", name) -} -``` - -您可以绑定任意数量的结构体。 只需确保创建它的一个实例并将其传递给 `Bind`: - -```go {8-10} - //... - //... - ... - err := wails.Run(&options.App{ - Title: "Basic Demo", - Width: 1024, - Height: 768, - Assets: &assets, - OnStartup: app.startup, - OnShutdown: app.shutdown, - Bind: []interface{}{ - app, - &mystruct1{}, - &mystruct2{}, - }, - }) -... - -``` - -When you run `wails dev` (or `wails generate module`), a frontend module will be generated containing the following: - -- 调用绑定的 Go 方法 -- 调用运行时方法 -- Typescript definitions for all Go structs used as inputs or outputs by the bound methods - -This makes it incredibly simple to call Go code from the frontend, using the same strongly typed datastructures. - -## 前端 - -### 概述 - -前端是由 webkit 渲染的文件集合。 这就像浏览器和网络服务器合二为一。 您可以使用的框架或库[^1]几乎没有限制。 前端和 Go 代码之间的主要交互点是: - -- 调用绑定的 Go 方法 -- 调用运行时方法 - -### 调用绑定的 Go 方法 - -在`wails dev`模式下运行应用程序时,会生成一个 javascript 模块,该模块用 JSDoc 注释包装这些方法。 这确实有助于开发,尤其是因为大多数 IDE 将处理 JSDoc 以提供代码完成和类型提示。 该模块名为`go` 并在`wailsjsdir`标志指定的目录中生成。 The generated files mirror the package names in your application. 在上面的例子中,我们绑定 `app`,它有一个公开方法 `Greet`。 在上面的例子中,我们绑定 `app`,它有一个公开方法 `Greet`。 This will lead to the generation of the following files: - -```bash -window.go.main.App.Greet("Bill").then((result) => { - console.log("The greeting is: " + result); - }) -``` - -Here we can see that there is a `main` package that contains the Javascript bindings for the bound `App` struct, as well as the Typescript declaration file for those methods. To call `Greet` from our frontend, we simply import the method and call it like a regular Javascript function: 要从我们的前端调用 `Greet`,我们只需导入该方法并像普通的 Javascript 函数一样调用它: - -```javascript -// ... -// ... -// ... - // ... - import {Greet} from '../wailsjs/go/main/App' - - function doGreeting(name) { - Greet(name).then((result) => { - // Do something with result - }) - } -``` - -The Typescript declaration file gives you the correct types for the bound methods: - -```ts -const go = { - main: { - App: { - /** - * Greet - * @param {Person} arg1 - Go Type: string - * @returns {Promise} - Go Type: string - */ - Greet: (arg1) => { - return window.go.main.App.Greet(arg1); - }, - }, - }, -}; -export default go; -``` - -这些方法返回一个 Promise。 成功的调用将导致 Go 调用的第一个返回值被传递给 `resolve` 处理程序。 一个不成功的调用是将一个 Go 方法的第二个错误类型返回值通过`reject`传递回调用者。 这通过 `reject` 处理程序传回。 This is passed back via the `reject` handler. 在上面的例子中,Greet 只返回一个字符串,所以 `Javascript` 调用永远不会`reject` - 除非将无效数据传递给它。 - -所有数据类型都在 Go 和 Javascript 之间正确转换。 包括结构体。 如果您从 Go 调用返回一个结构体,它将作为 `Javascript` Map 返回到您的前端。 注意:如果您想使用结构体,您必须为您的结构体字段定义`json` 标签! - -:::info 注意 -目前不支持嵌套匿名结构体。 -::: - -也可以将结构体发送回 Go。 任何作为期望结构的参数传递的 Javascript Map 都将转换为该结构类型。 为了使这个过程更容易,在 `开发`模式下,会生成一个 TypeScript 模块,定义绑定方法中使用的所有结构类型。 使用此模块,可以构建原生 Javascript 对象并将其发送到 Go 代码。 - -还额外支持在其签名中使用结构的 Go 方法。 所有由绑定方法指定的 Go 结构体(作为参数或返回类型)都将自动生成 Typescript 版本作为 Go 代码包装器模块的一部分。 使用这些,可以在 Go 和 Javascript 之间共享相同的数据模型。 - -此外`bindings.js`,还有一个名为`models.ts`的文件. 这包含我们 Go 结构体的 TypeScript 形式: - -```go title="main.go" -type Person struct { - Name string `json:"name"` - Age uint8 `json:"age"` - Address *Address `json:"address"` -} - -type Address struct { - Street string `json:"street"` - Postcode string `json:"postcode"` -} - -func (a *App) Greet(p Person) string { - return fmt.Sprintf("Hello %s (Age: %d)!", p.Name, p.Age) -} -``` - -只要您将 TypeScript 作为前端构建配置的一部分,您就可以通过以下方式使用这些模型: - -```js title="App.js" -export class Address { - street: string; - postcode: string; - - static createFrom(source: any = {}) { - return new Address(source); - } - - constructor(source: any = {}) { - if ("string" === typeof source) source = JSON.parse(source); - this.street = source["street"]; - this.postcode = source["postcode"]; - } -} -export class Person { - name: string; - age: number; - address?: Address; - - static createFrom(source: any = {}) { - return new Person(source); - } - - constructor(source: any = {}) { - if ("string" === typeof source) source = JSON.parse(source); - this.name = source["name"]; - this.age = source["age"]; - this.address = this.convertValues(source["address"], Address); - } - - convertValues(a: any, classs: any, asMap: boolean = false): any { - if (!a) { - return a; - } - if (a.slice) { - return (a as any[]).map((elem) => this.convertValues(elem, classs)); - } else if ("object" === typeof a) { - if (asMap) { - for (const key of Object.keys(a)) { - a[key] = new classs(a[key]); - } - return a; - } - return new classs(a); - } - return a; - } -} -``` - -JSDoc 和 TypeScript 生成模型的组合构成了一个强大的开发环境。 - -```ts title="App.d.ts" -import go from "./wailsjs/go/bindings"; -import { Person } from "./wailsjs/go/models"; - -let name = ""; - -function greet(name) { - let p = new Person(); - p.name = name; - p.age = 42; - go.main.App.Greet(p).then((result) => { - console.log(result); - }); -} -``` - -As we can see, the "main" namespace is imported from a new "models.ts" file. This file contains all the struct definitions used by our bound methods. In this example, this is a `Person` struct. If we look at `models.ts`, we can see how the models are defined: 该文件包含我们绑定方法使用的所有结构定义。 在这个示例中,这是一个 `Person` 结构体。 如果我们查看 `models.ts`,我们可以看到模型是如何定义的: - -```ts title="models.ts" -export namespace main { - - export class Address { - street: string; - postcode: string; - - static createFrom(source: any = {}) { - return new Address(source); - } - - constructor(source: any = {}) { - if ('string' === typeof source) source = JSON.parse(source); - this.street = source["street"]; - this.postcode = source["postcode"]; - } - } - export class Person { - name: string; - age: number; - address?: Address; - - static createFrom(source: any = {}) { - return new Person(source); - } - - constructor(source: any = {}) { - if ('string' === typeof source) source = JSON.parse(source); - this.name = source["name"]; - this.age = source["age"]; - this.address = this.convertValues(source["address"], Address); - } - - convertValues(a: any, classs: any, asMap: boolean = false): any { - if (!a) { - return a; - } - if (a.slice) { - return (a as any[]).map(elem => this.convertValues(elem, classs)); - } else if ("object" === typeof a) { - if (asMap) { - for (const key of Object.keys(a)) { - a[key] = new classs(a[key]); - } - return a; - } - return new classs(a); - } - return a; - } - } -} -``` - -可以在[运行时参考](./reference/runtime/intro)中找到有关 JS 运行时的更多详细信息。 - -```js title="mycode.js" -const go = { - main: { - App: { - /** - * Greet - * @param {Person} arg1 - Go Type: main.Person - * @returns {Promise} - Go Type: string - */ - Greet: (arg1) => { - return window.go.main.App.Greet(arg1); - }, - }, - }, -}; -export default go; -``` - -The combination of generated bindings and TypeScript models makes for a powerful development environment. - -关于绑定的更多信息可以在[应用程序开发指南](./guides/application-development)的[绑定方法](./guides/application-development#绑定方法)一节中找到。 - -### 调用运行时方法 - -Javascript 运行时位于`window.runtime`并包含许多方法来执行各种任务,例如发出事件或执行日志记录操作: - -```js title="mycode.js" -window.runtime.EventsEmit("my-event", 1); -``` - -More details about the JS runtime can be found in the [Runtime Reference](reference/runtime/intro). - -[^1]: 有一小部分库使用了 WebView 中不支持的功能。 对于这种情况,通常有替代方案和解决方法。 diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/introduction.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/introduction.mdx deleted file mode 100644 index 8c191a7aa..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/introduction.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 简介 - -Wails 是一个可让您使用 Go 和 Web 技术编写桌面应用的项目。 - -将它看作为 Go 的快并且轻量的 Electron 替代品。 您可以使用 Go 的灵活性和强大功能,结合丰富的现代前端,轻松的构建应用程序。 - -### 功能 - -- 原生菜单、对话框、主题和半透明 -- Windows、macOS 和 linux 支持 -- 内置 Svelte、React 、Preact 、Vue、Lit 和 Vanilla JS 的模板 -- 从 Javascript 轻松调用 Go 方法 -- 自动将Go结构体转换为TypeScript模块 -- Windows 上不需要 CGO 或外部 DLL -- 使用 [Vite ](https://vite.net/) 的实时开发模式 -- 可以轻松创建、构建和打包应用的强大命令行工具 -- 丰富的 [运行时库](/docs/next/reference/runtime) -- Applications built with Wails are Apple & Microsoft Store compliant - - -这是 [varly](https://varly.app) - 一个使用 Wails 编写的 MacOS 和 Windows 桌面应用。 它不仅看起来很强,它使用原生菜单和半透明 - 你希望从现代原生应用中得到的一切 - -

- - - -

- -### 快速启动模板 - -Wails 带有许多预配置的模板,可让您快速启动和运行应用程序。 有以下框架的模板:Svelte、React、Vue、Preact、Lit 和 Vanilla。 每个模板都有 Javascript 和 Typescript 版本。 - -### 原生元素 - -Wails 使用专门构建的库来处理窗口、菜单、对话框等原生元素,因此您可以构建美观、功能丰富的桌面应用程序。 - -**它不嵌入浏览器**,因此性能高。 相反,它使用平台的原生渲染引擎。 在 Windows 上,是基于 Chromium 构建的新 Microsoft Webview2 库。 - -### Go 和 Javascript 互操作 - -Wails 自动使您的 Go 方法可用于 Javascript,因此您可以从前端按名称调用它们! 它甚至会生成 Go 方法使用的结构体的 Typescript 版本,因此您可以在 Go 和 Javascript 之间传递相同的数据结构。 - -### 运行时库 - -当检测到您的应用程序资源发生更改时,您正在运行的应用程序将“重新加载”,几乎立即反馈您的更改。 - -### 实时开发体验 - -#### 自动重新构建 - -当您在“开发”模式下运行您的应用程序时,Wails 会将您的应用程序构建为原生桌面应用程序,但会从磁盘读取您的资源。 它将检测您的 Go 代码的任何更改并自动重新构建和重新启动您的应用程序。 - -#### 自动重新加载 - -当检测到对您的应用程序资产的更改时,您正在运行的应用程序将“重新加载”,几乎立即反映您的更改 - -#### 在浏览器中开发您的应用程序 - -如果您更喜欢在浏览器中调试和开发,那么 Wails 可以满足您的需求。 正在运行的应用程序还有一个网络服务器,它将在连接到它的任何浏览器中运行您的应用程序。 当您的资源在磁盘上发生变化时,它会刷新。 - -### 可用于生产的原生二进制文件 - -当您准备好完成应用程序的最终构建时,CLI 会将其编译为单个可执行文件,并将所有资源打包到其中。 在 Windows 和 MacOS 上,可以创建用于分发的原生包。 使用打包工具后生成的资源(图标、info.plist、清单文件等)是您项目的一部分,可以自定义,让您完全控制应用程序的构建方式。 - -### 工具 - -Wails CLI 提供了一种简单的方法来生成、构建和打包您的应用程序。 它将完成创建图标的繁重工作,使用最佳设置编译您的应用程序,并提供可分发的、可用于生产的二进制文件。 可以从许多入门模板中进行选择,以快速启动和运行! diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/_category_.json b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/_category_.json deleted file mode 100644 index ebb337b83..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Reference", - "position": 40 -} diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/cli.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/cli.mdx deleted file mode 100644 index 41b1a9926..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/cli.mdx +++ /dev/null @@ -1,252 +0,0 @@ ---- -sidebar_position: 2 ---- - -# 命令行 - -Wails CLI 有许多用于管理项目的命令。 所有命令都以此方式运行: - -`wails <命令> <标志>` - -## 初始化 - -`wails init` 用于生成项目。 - -| 标志 | 描述 | 默认 | -|:--------- |:---------------------------------------------- |:-------:| -| -n "项目名称" | 项目名称。 **强制必填** | | -| -d "项目目录" | 要创建的项目目录 | 项目名 | -| -g | 初始化 git 存储库 | | -| -l | 可用项目模板列表 | | -| -q | 禁止输出到控制台 | | -| -t "模板名称" | 要使用的项目模板。 这可能是默认模板的名称或在 github 上托管的远程模板的 URL 。 | vanilla | -| -ide | 生成 IDE 项目文件 | | -| -f | 强制构建应用 | 否 | - -示例: `wails init -n test -d mytestproject -g -ide vscode -q` - -这将在 "mytestproject" 目录生成一个名为 "test" 的项目,初始化 git,生成 vscode 项目文件并静默执行。 - -可以在[此处](../guides/ides)找到有关在 Wails 中使用 IDE 的更多信息。 - -### 远程模板 - -支持远程模板(托管在 GitHub 上)并且可以使用模板项目的 URL 进行安装。 - -示例: `wails init -n test -t https://github.com/leaanthony/testtemplate[@v1.0.0]` - -可以在[此处](../community/templates)找到社区维护的模板列表 - -:::warning 注意 - -**Wails 项目不维护也不对第 3 方模板负责** - -如果您不信任某个模板,请检查 `package.json` 和 `wails.json` 中安装的模块和运行的脚本。 - -::: - -## 构建 - -`wails build`用于将您的项目编译为生产可用的二进制文件。 - -| 标志 | 描述 | 默认 | -|:-------------------- |:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |:--------------------------- | -| -platform | 为指定的[平台](../reference/cli#平台)(逗号分割)构建,例如:`windows/arm64`。 `windows/arm64`. `windows/arm64`. 注意,如果没有指定架构,则使用`runtime.GOARCH`。 `windows/arm64`. 注意,如果没有指定架构,则使用`runtime.GOARCH`。 | runtime.GOOS/runtime.GOARCH | -| -clean | 清理`build/bin`目录 | | -| -compiler "编译器" | 使用不同的 go 编译器来构建,例如 go1.15beta1 | go | -| -ldflags "标志" | 传递给编译器的额外 ldflags | | -| -nopackage | 不打包应用程序 | | -| -o filename | 输出文件名 | | -| -s | 跳过前端构建 | 否 | -| -f | 强制构建应用 | 否 | -| -tags "额外标签" | 传递给编译器构建标签(引号和空格分隔) | | -| -upx | 使用“upx”压缩最终二进制文件 | | -| -upxflags | 传递给 upx 的标志 | | -| -v int | 详细级别 (0 - silent, 1 - default, 2 - verbose) | 1 | -| -webview2 | WebView2 安装程序策略:download,embed,browser,error. | download | -| -u | 更新项目的 `go.mod` 以使用与 CLI 相同版本的 Wails | | -| -debug | 在应用程序中保留调试信息 在应用程序中保留调试信息 Allows the use of the devtools in the application window | 否 | -| -trimpath | Remove all file system paths from the resulting executable. | 否 | -| -race | Build with Go's race detector | 否 | -| -platform "platform" | Keep the console window for Windows builds | 否 | - -有关`webview2`标志的详细描述,请参阅[Windows 系统](../guides/windows)指南。 - -如果您更喜欢使用标准 Go 工具进行构建,请参阅[手动构建](../guides/manual-builds)指南。 - -示例: - -`wails build -clean -o myproject.exe` - -:::info 苹果芯片上的 UPX - -在苹果芯片上使用 UPX 相关的[问题](https://github.com/upx/upx/issues/446)。 - -::: - -:::info Windows 上的 UPX - -一些防病毒软件供应商误将`upx`压缩的二进制文件标记为病毒,请查看相关[问题](https://github.com/upx/upx/issues/437)。 - -::: - -### 平台 - -支持的平台有: - -| 平台 | 描述 | -|:---------------- |:--------------------------------------------- | -| darwin | MacOS + architecture of build machine | -| darwin/amd64 | MacOS 10.13+ AMD64 | -| darwin/arm64 | MacOS 11.0+ ARM64 | -| darwin/universal | MacOS AMD64+ARM64 universal application | -| windows | Windows 10/11 + architecture of build machine | -| windows/amd64 | Windows 10/11 AMD64 | -| windows/arm64 | Windows 10/11 ARM64 | -| linux | Linux + architecture of build machine | -| linux/amd64 | Linux AMD64 | -| linux/arm64 | Linux ARM64 | - -## 诊断检查 - -`wails doctor` 将运行诊断程序以确保您的系统已准备好进行开发。 - -示例: - -``` -Wails CLI v2.0.0-beta - -Scanning system - Please wait (this may take a long time)...Done. - -Wails CLI v2.0.0-beta - -Scanning system - Please wait (this may take a long time)...Done. - -System ------- -OS: Windows 10 Pro -Version: 2009 (Build: 19043) -ID: 21H1 -Go Version: go1.17 -Platform: windows -Architecture: amd64 - -Dependency Package Name Status Version ----------- ------------ ------ ------- -WebView2 N/A Installed 93.0.961.52 -npm N/A Installed 6.14.15 -*upx N/A Installed upx 3.96 -*docker N/A Installed 20.10.6 - -* - Optional Dependency - -Diagnosis ---------- -Your system is ready for Wails development! - -Wails CLI v2.0.0-beta - -Scanning system - Please wait (this may take a long time)...Done. - -System ------- -OS: Windows 10 Pro -Version: 2009 (Build: 19043) -ID: 21H1 -Go Version: go1.17 -Platform: windows -Architecture: amd64 - -Dependency Package Name Status Version ----------- ------------ ------ ------- -WebView2 N/A Installed 93.0.961.52 -npm N/A Installed 6.14.15 -*upx N/A Installed upx 3.96 -*docker N/A Installed 20.10.6 - -* - Optional Dependency - -Diagnosis ---------- -Your system is ready for Wails development! - -``` - -## 开发 - -`wails dev` 用于以 "实时开发" 模式运行您的应用。 这意味着: - -- 应用程序的`go.mod`将被更新为与 Wails CLI 版本相同的版本 -- 应用程序被编译并自动运行 -- 一个观察者被启动,如果它检测到您的 go 文件的变化,它将触发您的开发应用程序的重新构建 -- 启动一个网络服务器`http://localhost:34115`,通过 http 为您的应用程序(不仅仅是前端)提供服务。 这允许您使用您喜欢的浏览器开发扩展 -- 所有应用程序资源都从磁盘加载。 如果它们被更改,应用程序将自动重新加载(而不是重新构建)。 所有连接的浏览器也将重新加载 -- 生成的 JS 模块提供以下内容: - - 带有自动生成的 JSDoc 的 Go 方法的 Javascript 包装器,提供代码提示 - - 您的 Go 结构体的 TypeScript 版本,可以构造并传递给您的 Go 方法 -- 生成第二个 JS 模块,为运行时提供包装器 + TS 声明 - -| 标志 | 描述 | 默认 | -|:------------------------------ |:-------------------------------------------------------------------------------------------------------------------------------- |:------------------------ | -| -assetdir "./path/to/assets" | 编译资源的路径 | `wails.json`中的值 | -| -browser | 在启动时打开浏览器到`http://localhost:34115` | | -| -compiler "编译器" | 使用不同的 go 编译器来构建,例如 go1.15beta1 | go | -| -e | 触发重新构建的扩展(逗号分隔) | go | -| -reloaddirs | 触发重新加载的附加目录(逗号分隔) | `wails.json`中的值 | -| -ldflags "标志" | 传递给编译器的额外 ldflags | | -| -tags "额外标签" | 传递给编译器构建标签(引号和空格分隔) | | -| -loglevel "日志级别" | 要使用的日志级别 - Trace, Debug, Info, Warning, Error | Debug | -| -noreload | 资源更改时禁用自动重新加载 | | -| -nogen | 详细级别 (0 - silent, 1 - standard, 2 - verbose) | | -| -v | 生成生成的 Wails JS 模块的目录 | 1 | -| -wailsjsdir | 检测到资源更改后等待重新加载的时间 | `wails.json`中的值 | -| -debounce | 将 wails 开发服务器绑定到的地址 | "http://localhost:34115" | -| -frontenddevserverurl "url 地址" | 使用第三方开发服务器提供资源,比如 Vite | "localhost:34115" | -| -frontenddevserverurl "url" | 以 shell 样式传递给应用程序的参数 | "" | -| -appargs "args" | 目标平台/架构 | | -| -save | 将指定的 `assetdir`、 `reloaddirs`、 `wailsjsdir`、 `debounce` 、 `devserver` 和 `frontenddevserverurl` 标志的值保存到 `wails.json` 以成为后续调用的默认值。 | | -| -race | Build with Go's race detector | 否 | -| -s | 跳过前端构建 | 否 | - -示例: - -`wails dev -assetdir ./frontend/dist -wailsjsdir ./frontend/src -browser` - -此命令将执行以下操作: - -- 构建应用程序并运行它(更多细节在[这里](../guides/manual-builds)) -- 在`./frontend/src`中生成 Wails JS 模块 -- 监听`./frontend/dist`中文件的更新并在更改时重新加载 -- 打开浏览器并连接到应用程序 - -[此处](../guides/application-development)提供了有关将此功能与现有框架脚本一起使用的更多信息。 - -## 生成 - -### 模板 - -Wails 使用模板来生成项目。 `wails generate template`命令有助于构建模板,以使它可以用于生成项目。 - -| 标志 | 描述 | -|:-------------- |:--------------- | -| -name | 模板名称(必填) | -| -frontend "路径" | 要在模板中使用的前端项目的路径 | - -有关创建模板的更多详细信息,请参阅[模板指南](../guides/templates)。 - -### module - -`wails update` 将更新 Wails CLI 的版本。 - -## 更新 - -`wails version` 仅输出当前的 CLI 版本。 - -| 标志 | 描述 | -|:------------- |:----------- | -| -pre | 更新到最新的预发布版本 | -| -version "版本" | 安装指定版本的 CLI | - -## 版本 - -`wails version` will simply output the current CLI version. diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/menus.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/menus.mdx deleted file mode 100644 index f486cb1e3..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/menus.mdx +++ /dev/null @@ -1,277 +0,0 @@ ---- -sidebar_position: 4 ---- - -# 应用菜单 - -It is possible to add an application menu to Wails projects. 可以通过定义 [菜单](#菜单) 结构并设置 [`Menu`](../reference/options#菜单) 选项或者通过调用运行时方法 [设置应用程序菜单](../reference/runtime/menu#设置应用程序菜单) 来将应用程序菜单添加到 Wails 项目。 可以通过定义 [菜单](#菜单) 结构并设置 [`Menu`](../reference/options#菜单) 选项或者通过调用运行时方法 [设置应用程序菜单](../reference/runtime/menu#设置应用程序菜单) 来将应用程序菜单添加到 Wails 项目。 - -也可以通过更新菜单结构并调用[更新应用程序菜单](../reference/runtime/menu#更新应用程序菜单)来动态更新菜单 。 - -```go - AppMenu := menu.NewMenu() - FileMenu := AppMenu.AddSubmenu("File") - FileMenu.AddText("&Open", keys.CmdOrCtrl("o"), openFile) - FileMenu.AddSeparator() - FileMenu.AddText("Quit", keys.CmdOrCtrl("q"), func(_ *menu.CallbackData) { - runtime.Quit() - }) - - if runtime.GOOS == "darwin" { - AppMenu.Append(menu.EditMenu()) // on macos platform, we should append EditMenu to enable Cmd+C,Cmd+V,Cmd+Z... shortcut - } - - err := wails.Run(&options.App{ - Title: "Menus Demo", - Width: 800, - Height: 600, - Menu: AppMenu, - Bind: []interface{}{ - app, - }, - ) - // ... -```` - -It is also possible to dynamically update the menu, by updating the menu struct and calling -[MenuUpdateApplicationMenu](../reference/runtime/menu.mdx#menuupdateapplicationmenu). - -The example above uses helper methods, however it's possible to build the menu structs manually. - -type Menu struct { - Items []*MenuItem -} -``` - -示例: - -上面的示例使用快捷方法,但是可以手动构建菜单结构。 - -## Menu - -A Menu is a collection of MenuItems: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -type Menu struct { - Items []*MenuItem -} -``` - -示例: - -上面的示例使用快捷方法,但是可以手动构建菜单结构。 - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -func NewMenuFromItems(first *MenuItem, rest ...*MenuItem) *Menu -``` - -这使得代码的布局更像是菜单的布局,而无需在创建菜单项后手动添加它们。 或者,您可以只创建菜单项并手动将它们添加到菜单中。 - -## 菜单 - -对于应用程序菜单,每个菜单项代表一个菜单,例如“编辑”。 - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -// MenuItem represents a menu item contained in a menu -type MenuItem struct { - Label string - Role Role - Accelerator *keys.Accelerator - Type Type - Disabled bool - Hidden bool - Checked bool - SubMenu *Menu - Click Callback -} -``` - -| 字段 | Type | 注解 | -| ----------- | ------------------------------------ | --------------------------- | -| Label | string | 菜单文字 | -| Accelerator | [\*keys.Accelerator](#accelerator) | 此菜单项的键绑定 | -| Type | [Type](#type) | 菜单项的类型 | -| Disabled | bool | 禁用菜单项 | -| Hidden | bool | 隐藏此菜单项 | -| Checked | bool | 向菜单项设置选中 (复选框和单选类型) | -| SubMenu | [\*Menu](#menu) | 设置子菜单 | -| Click | [Callback](#callback) | 单击菜单时的回调函数 | -| Role | string | 定义此菜单项的[角色](#角色)。 暂时只支持 Mac | - -### Accelerator - -加速器(有时称为键盘快捷键)定义了按键和菜单项之间的绑定。 Wails 将加速器定义为一个组合或键 + [修饰符](#修饰符)。 它们在`"github.com/wailsapp/wails/v2/pkg/menu/keys"`包中可用。 - -Example: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" - // Defines cmd+o on Mac and ctrl-o on Window/Linux - myShortcut := keys.CmdOrCtrl("o") -``` - -键是键盘上除了`+`的任何字符,它被定义为`加号`。 有些键不能表示为字符,因此可以使用一组命名字符: - -- `backspace` -- `tab` -- `return` -- `enter` -- `escape` -- `left` -- `right` -- `up` -- `down` -- `space` -- `delete` -- `home` -- `end` -- `page up` -- `page down` -- `f1` -- `f2` -- `f3` -- `f4` -- `f5` -- `f6` -- `f7` -- `f8` -- `f9` -- `f10` -- `f11` -- `f12` -- `f13` -- `f14` -- `f15` -- `f16` -- `f17` -- `f18` -- `f19` -- `f20` -- `f21` -- `f22` -- `f23` -- `f24` -- `f25` -- `f26` -- `f27` -- `f28` -- `f29` -- `f30` -- `f31` -- `f32` -- `f33` -- `f34` -- `f35` -- `numlock` - -Wails 还支持使用与 Electron 相同的语法来解析加速器。 这对于在配置文件中存储加速器很有用。 - -Example: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" - // Defines cmd+o on Mac and ctrl-o on Window/Linux - myShortcut, err := keys.Parse("Ctrl+Option+A") -``` - -#### 修饰符 - -The following modifiers are keys that may be used in combination with the accelerator key: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" -const ( - // CmdOrCtrlKey represents Command on Mac and Control on other platforms - CmdOrCtrlKey Modifier = "cmdorctrl" - // OptionOrAltKey represents Option on Mac and Alt on other platforms - OptionOrAltKey Modifier = "optionoralt" - // ShiftKey represents the shift key on all systems - ShiftKey Modifier = "shift" - // ControlKey represents the control key on all systems - ControlKey Modifier = "ctrl" -) -``` - -A number of helper methods are available to create Accelerators using modifiers: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" -func CmdOrCtrl(key string) *Accelerator -func OptionOrAlt(key string) *Accelerator -func Shift(key string) *Accelerator -func Control(key string) *Accelerator -``` - -示例: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" - // Defines "Ctrl+Option+A" on Mac and "Ctrl+Alt+A" on Window/Linux - myShortcut := keys.Combo("a", ControlKey, OptionOrAltKey) -``` - -### Type - -以下修饰符是可以与加速键组合使用的键: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -const ( - TextType Type = "Text" - SeparatorType Type = "Separator" - SubmenuType Type = "Submenu" - CheckboxType Type = "Checkbox" - RadioType Type = "Radio" -) -``` - -许多快捷方法可用于使用修饰符创建加速器: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -myMenu := menu.NewMenuFromItems( - menu.SubMenu("File", menu.NewMenuFromItems( - menu.Text("&Open", keys.CmdOrCtrl("o"), openFile), - menu.Separator(), - menu.Text("Quit", keys.CmdOrCtrl("q"), func(_ *menu.CallbackData) { - runtime.Quit() - }), - )), - ) - - runtime.MenuSetApplicationMenu(myMenu) -``` - -修饰符可以结合`keys.Combo(key string, modifier1 Modifier, modifier2 Modifier, rest ...Modifier)`使用: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -func Text(label string, accelerator *keys.Accelerator, click Callback) *MenuItem -func Separator() *MenuItem -func Radio(label string, selected bool, accelerator *keys.Accelerator, click Callback) *MenuItem -func Checkbox(label string, checked bool, accelerator *keys.Accelerator, click Callback) *MenuItem -func SubMenu(label string, menu *Menu) *MenuItem -``` - -关于单选菜单组的说明:单选菜单组定义为菜单中相邻的多个单选菜单项。 这意味着您不需要将项目分组在一起,因为它是自动的。 然而,这也意味着您不能有两个相邻的单选菜单组-它们之间必须有一个非单选菜单项。 - -### Callback - -为方便起见,提供了快捷方法来快速创建菜单项: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -type Callback func(*CallbackData) - -type CallbackData struct { - MenuItem *MenuItem -} -``` - -给函数一个`CallbackData`结构体,它指示哪个菜单项触发了回调。 这在使用可能共享回调的单选菜单组时很有用。 - -### Role - -每个菜单项都可能有一个回调,在单击该项时会执行该回调: - -目前仅 Mac 支持角色。 - -::: - -一个菜单项可能有一个角色,它本质上是一个预定义的菜单项。 我们目前支持以下角色: - -| Role | 描述 | -| ------------ | -------------------------------------- | -| AppMenuRole | 标准的 Mac 应用程序菜单。 可以使用`menu.AppMenu()`创建 | -| EditMenuRole | 标准的 Mac 编辑菜单。 可以使用`menu.EditMenu()`创建 | diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/options.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/options.mdx deleted file mode 100644 index 5235e6fa0..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/options.mdx +++ /dev/null @@ -1,644 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 参数选项 - -## 应用程序参数选项 - -该`Options.App`结构包含应用程序配置。 它被传递给`wails.Run()`方法: - -```go title="Example" -import "github.com/wailsapp/wails/v2/pkg/options" - -func main() { - - err := wails.Run(&options.App{ - Title: "Menus Demo", - Width: 800, - Height: 600, - DisableResize: false, - Fullscreen: false, - Frameless: true, - MinWidth: 400, - MinHeight: 400, - MaxWidth: 1280, - MaxHeight: 1024, - StartHidden: false, - HideWindowOnClose: false, - BackgroundColour: &options.RGBA{R: 0, G: 0, B: 0, A: 255}, - AlwaysOnTop: false, - Assets: assets, - AssetsHandler: assetsHandler, - Menu: app.applicationMenu(), - Logger: nil, - LogLevel: logger.DEBUG, - LogLevelProduction: logger.ERROR, - OnStartup: app.startup, - OnDomReady: app.domready, - OnShutdown: app.shutdown, - OnBeforeClose: app.beforeClose, - WindowStartState: options.Maximised, - CSSDragProperty: "--wails-draggable", - CSSDragValue: "drag", - Bind: []interface{}{ - app, - }, - Windows: &windows.Options{ - WebviewIsTransparent: false, - WindowIsTranslucent: false, - DisableWindowIcon: false, - DisableFramelessWindowDecorations: false, - WebviewUserDataPath: "", - WebviewBrowserPath: "", - Theme: windows.SystemDefault, - CustomTheme: &windows.ThemeSettings{ - DarkModeTitleBar: windows.RGB(20, 20, 20), - DarkModeTitleText: windows.RGB(200, 200, 200), - DarkModeBorder: windows.RGB(20, 0, 20), - LightModeTitleBar: windows.RGB(200, 200, 200), - LightModeTitleText: windows.RGB(20, 20, 20), - LightModeBorder: windows.RGB(200, 200, 200), - }, - // User messages that can be customised - Messages *windows.Messages - }, - Mac: &mac.Options{ - TitleBar: &mac.TitleBar{ - TitlebarAppearsTransparent: true, - HideTitle: false, - HideTitleBar: false, - FullSizeContent: false, - UseToolbar: false, - HideToolbarSeparator: true, - }, - Appearance: mac.NSAppearanceNameDarkAqua, - WebviewIsTransparent: true, - WindowIsTranslucent: false, - About: &mac.AboutInfo{ - Title: "My Application", - Message: "© 2021 Me", - Icon: icon, - }, - }, - Linux: &linux.Options{ - Icon: icon, - }, - }) - if err != nil { - log.Fatal(err) - } -} - -``` - -### 标题 - -窗口标题栏中显示的文本。 - -类型:string - -### 宽度 - -窗口的初始宽度。 - -名称:Width - -### 高度 - -窗口的初始高度。 - -类型:`windows.Theme` - -### 禁用调整窗口尺寸 - -默认情况下,主窗口可调整大小。 将此设置为 `true` 将使其保持固定大小。 - -类型:int - -### Fullscreen - -将此设置为 `true` 将在启动时使窗口全屏。 - -类型:int - -### 无边框 - -设置为`true`时,窗口将没有边框或标题栏。 另请参阅[无边框窗口](../guides/frameless)。 - -类型:int - -### 最小宽度 - -这将设置窗口的最小宽度。 如果给出的值`Width`小于这个值,窗口将被设置为`MinWidth`默认值。 - -类型:bool - -### 最小高度 - -这将设置窗口的最小高度。 如果给出的值`Height`小于这个值,窗口将被设置为`MinHeight`默认值。 - -类型:bool - -### 最大宽度 - -这将设置窗口的最大宽度。 如果给出的值`Width`大于这个值,窗口将被设置为`MaxWidth`默认值。 - -类型:bool - -### 最大高度 - -这将设置窗口的最大高度。 如果给出的值`Height`大于这个值,窗口将被设置为`MaxHeight`默认值。 - -类型:bool - -### 启动时隐藏窗口 - -设置为`true`时,应用程序将被隐藏,直到调用[显示窗口](../reference/runtime/window#显示窗口)。 - -类型:int -### 关闭时隐藏窗口 - -默认情况下,关闭窗口将关闭应用程序。 将此设置为`true`意味着关闭窗口将隐藏窗口。 - -窗口在失去焦点时应保持在其他窗口之上。 - -类型:int - -### RGBA - -This value is the default background colour of the window. Default: white 类型:int (0xRRGGBBAA) 示例:0xFF000088 - 透明度为 50% 的红色 - -Type: `*options.RGBA`
Default: white - -### 窗口固定在最顶层 - -窗口在失去焦点时应保持在其他窗口之上。 - -类型:int - -### 资源 - -应用程序要使用的前端资源。 需要一个`index.html`文件。 - -名称:StartHidden - -### 菜单 - - - -注意:在 Mac 上,如果未指定菜单,则将创建默认菜单。 - -| 值 | Win | Mac | Lin | -| ----------------------- | --- | --- | --- | -| GET | ✅ | ✅ | ✅ | -| POST | ✅ | ✅ | ❌ | -| PUT | ✅ | ✅ | ❌ | -| PATCH | ✅ | ✅ | ❌ | -| DELETE | ✅ | ✅ | ❌ | -| Request Headers | ✅ | ✅ | ❌ | -| Request Body | ✅ | ✅ | ❌ | -| Request Body Streaming | ❌ | ❌ | ❌ | -| Response StatusCodes | ✅ | ✅ | ❌ | -| Response Headers | ✅ | ✅ | ❌ | -| Response Body | ✅ | ✅ | ✅ | -| Response Body Streaming | ❌ | ❌ | ✅ | - -NOTE: Linux is currently very limited due to targeting a WebKit2GTK Version < 2.36.0. In the future some features will be supported by the introduction of WebKit2GTK 2.36.0+ support. In the future some features will be supported by the introduction of WebKit2GTK 2.36.0+ support. - -NOTE: When used in combination with a Frontend DevServer there might be limitations, eg. Vite serves the index.html on every path, that does not contain a file extension. NOTE: When used in combination with a Frontend DevServer there might be limitations, eg. Vite serves the index.html on every path, that does not contain a file extension. Vite serves the index.html on every path, that does not contain a file extension. - -类型:[AppearanceType](#外观类型) - -### 日志 - -应用程序要使用的菜单。 [菜单参考](../reference/runtime/menu)中有关菜单的更多详细信息。 - -:::note -On Mac, if no menu is specified, a default menu will be created. -::: - -This value is the default background colour of the window. Default: white Default: white - -### 日志级别 - -应用程序要使用的记录器。 有关日志记录的更多详细信息,请参阅[日志参考](../reference/runtime/log)。 - -类型:bool - -### 应用启动回调 - -默认日志级别。 有关日志记录的更多详细信息,请参阅[日志参考](../reference/runtime/log)。 - -名称:Assets - -### 前端 Dom 加载完成回调 - -The default log level for production builds. 有关日志记录的更多详细信息,请参阅[日志参考](../reference/runtime/log)。 有关日志记录的更多详细信息,请参阅[日志参考](../reference/runtime/log)。 - -类型:logger.Logger - -### 应用退出回调 - -此回调在前端创建之后调用,但在`index.html`加载之前调用。 它提供了应用程序上下文。 - -类型:\*menu.Menu - -### 关闭应用程序之前回调 - -在前端加载完毕`index.html`及其资源后调用此回调。 它提供了应用程序上下文。 - -类型:\*menu.Menu - -### 窗口启动状态 - -在前端被销毁之后,应用程序终止之前,调用此回调。 它提供了应用程序上下文。 - -类型:\*menu.Menu - -### 绑定 - -如果设置了此回调,它将在通过单击窗口关闭按钮或调用`runtime.Quit`即将退出应用程序时被调用. 返回 `true` 将导致应用程序继续,`false` 将继续正常关闭。 Returning true will cause the application to continue, false will continue shutdown as normal. 这有助于与用户确认他们希望退出程序。 这有助于与用户确认他们希望退出程序。 - -名称:Mac - -```go title=windowsapp.go -func (b *App) beforeClose(ctx context.Context) (prevent bool) { - dialog, err := runtime.MessageDialog(ctx, runtime.MessageDialogOptions{ - 类型: runtime.QuestionDialog, - Title: "Quit?", - Message: "Are you sure you want to quit?", - }) - - if err != nil { - return false - } - return dialog != "Yes" -``` - -类型:func(ctx context.Context) - -### WindowStartState - -名称:Linux - -| 值 | Win | Mac | Lin | -| ---------- | --- | --- | --- | -| Fullscreen | ✅ | ✅ | ✅ | -| Maximised | ✅ | ✅ | ✅ | -| Minimised | ✅ | ❌ | ✅ | - -默认值:在开发模式下是`Info`,在生产模式下是`Error`。 - -### CSSDragProperty - -Indicates the CSS property to use to identify which elements can be used to drag the window. Default: `--wails-draggable`. - -类型:string - -### CSSDragValue - -Indicates what value the `CSSDragProperty` style should have to drag the window. Default: `drag`. - -类型:string - -### Bind - -名称:WebviewIsTransparent - -名称:OnStartup - -### Windows - -名称:WindowIsTranslucent - -名称:LogLevel - -### Mac - -名称:DisableWindowIcon - -类型:func(ctx context.Context) - -### Linux - -名称:DisableFramelessWindowDecorations - -名称:OnShutdown - -## Windows 特定选项 - -### 禁用窗口图标 - -设置为 `true` 时将使 WebView 背景透明。 这意味着如果你使用`rgba(0,0,0,0)`,主窗口将显示。 通常与[窗口半透明](#窗口半透明)结合使用以制作冰霜效果的应用程序。 - -类型:int - -### 禁用无边框窗口装饰 - -将此设置为 `true` 将使窗口半透明。 通常与[网页透明](#网页透明) 结合使用以制作冰霜效果的应用程序。 - -类型:int - -### Webview 用户数据路径 - -这定义了应用程序应该使用的主题: - -类型:int - -### 主题 - -将此设置为`true`将移除[无边框](#无边框)模式下的窗口装饰。 这意味着将不会有`Aero 阴影` 和 `圆角`显示在窗口上。 请注意,`圆角`只在 Windows 11 上支持。 - -类型:int - -### 自定义主题 - -这定义了 WebView2 存储用户数据的路径。 如果为空将使用`%APPDATA%\[BinaryName.exe]`。 - -类型:string - -### 消息 - -This defines the path to a directory with WebView2 executable files and libraries. If empty, webview2 installed in the system will be used. If empty, webview2 installed in the system will be used. - -Important information about distribution of fixed version runtime: - -- [How to get and extract runtime](https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution#details-about-the-fixed-version-runtime-distribution-mode) -- [Known issues for fixed version](https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution#known-issues-for-fixed-version) -- [The path of fixed version of the WebView2 Runtime should not contain \Edge\Application\.](https://docs.microsoft.com/en-us/microsoft-edge/webview2/reference/win32/webview2-idl?view=webview2-1.0.1245.22#createcorewebview2environmentwithoptions) - -类型:string - -### 标题栏 - -TitleBar 结构提供了配置标题栏外观的能力。 - -名称:Appearance - -| 值 | 描述 | -| ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| SystemDefault | _默认_. 主题将基于系统默认值。 The theme will be based on the system default. The theme will be based on the system default. 如果用户更改了他们的主题,应用程序将更新以使用新设置 The theme will be based on the system default. 如果用户更改了他们的主题,应用程序将更新以使用新设置 The theme will be based on the system default. 如果用户更改了他们的主题,应用程序将更新以使用新设置 | -| Dark | 该应用程序将只使用深色主题 | -| Light | 从样式掩码中移除 [NSWindowStyleMaskTitled](https://developer.apple.com/documentation/appkit/nswindowstylemask/nswindowstylemasktitled/)。 | - -类型:[\*mac.TitleBar](#标题栏结构) - -### 外观 - -类型:\*mac.Options - -类型:bool - -Appearance 用于根据 Apple 的 [NSAppearance](https://developer.apple.com/documentation/appkit/nsappearancename?language=objc) 名称设置应用程序的样式。 - -#### 外观 - -CustomTheme 结构使用 `int32` 指定颜色值. 这些是非标准 Windows 格式: `0x00BBGGAA`。 These are in the standard(!) Windows format of: `0x00BBGGAA`. These are in the standard(!) Windows format of: `0x00BBGGAA`. 提供了一个辅助函数来将 RGB 转换为这种格式:`windows.RGB(r,g,b uint8)`。 - -名称:WindowIsTranslucent - -```go -type ThemeSettings struct { - DarkModeTitleBar int32 - DarkModeTitleBarInactive int32 - DarkModeTitleText int32 - DarkModeTitleTextInactive int32 - DarkModeBorder int32 - DarkModeBorderInactive int32 - LightModeTitleBar int32 - LightModeTitleBarInactive int32 - LightModeTitleText int32 - LightModeTitleTextInactive int32 - LightModeBorder int32 - LightModeBorderInactive int32 -} -``` - -名称:Mac - -```go - CustomTheme: &windows.ThemeSettings{ - // Theme to use when window is active - DarkModeTitleBar: windows.RGB(255, 0, 0), // Red - DarkModeTitleText: windows.RGB(0, 255, 0), // Green - DarkModeBorder: windows.RGB(0, 0, 255), // Blue - LightModeTitleBar: windows.RGB(200, 200, 200), - LightModeTitleText: windows.RGB(20, 20, 20), - LightModeBorder: windows.RGB(200, 200, 200), - // Theme to use when window is inactive - DarkModeTitleBarInactive: windows.RGB(128, 0, 0), - DarkModeTitleTextInactive: windows.RGB(0, 128, 0), - DarkModeBorderInactive: windows.RGB(0, 0, 128), - LightModeTitleBarInactive: windows.RGB(100, 100, 100), - LightModeTitleTextInactive: windows.RGB(10, 10, 10), - LightModeBorderInactive: windows.RGB(100, 100, 100), - }, -``` - -### 网页透明 - -一个如果找不到有效的 webview2 运行时,webview2 安装程序所使用的字符串结构。 - -名称:About - -您可以选择支持的任意语言定制此选项。 - -### 窗口半透明 - -ResizeDebounceMS is the amount of time to debounce redraws of webview2 when resizing the window. The default value (0) will perform redraws as fast as it can. The default value (0) will perform redraws as fast as it can. - -Type: \*mac.Options - -### 关于 - -您可以指定应用程序的[外观](https://developer.apple.com/documentation/appkit/nsappearance?language=objc)。 - -类型:bool - -### OnResume - -“关于”菜单项将出现在应用程序菜单中: - -类型:bool - -## Mac 特定选项 - -### TitleBar - -The TitleBar struct provides the ability to configure the look and feel of the title bar. - -类型:bool - - -### Appearance - -Appearance is used to set the style of your app in accordance with Apple's [NSAppearance](https://developer.apple.com/documentation/appkit/nsappearancename?language=objc) names. - -类型:string - -### 禁用窗口图标 - -设置为 `true` 时将使 WebView 背景透明。 这意味着如果你使用`rgba(0,0,0,0)`,主窗口将显示。 通常与[窗口半透明](#窗口半透明)结合使用以制作冰霜效果的应用程序。 - -类型:int - -### 禁用无边框窗口装饰 - -将此设置为 `true` 将使窗口半透明。 通常与[网页透明](#网页透明) 结合使用以制作冰霜效果的应用程序。 - -类型:int - -### About - -This configuration lets you set the title, message and icon for the "About" menu item in the app menu created by the "AppMenu" role. - -名称:CustomTheme - - -#### 标题栏结构 - -预设的标题栏设置可用: - -```go -type TitleBar struct { - TitlebarAppearsTransparent bool - HideTitle bool - HideTitleBar bool - FullSizeContent bool - UseToolbar bool - HideToolbarSeparator bool -} -``` - -| 设置 | 描述 | -| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| TitlebarAppearsTransparent | 使标题栏透明。 This has the effect of hiding the titlebar and the content fill the window. This has the effect of hiding the titlebar and the content fill the window. [Apple Docs](https://developer.apple.com/documentation/appkit/nswindow/1419167-titlebarappearstransparent?language=objc) | -| HideTitle | 隐藏窗口的标题。 [Apple Docs](https://developer.apple.com/documentation/appkit/nswindowtitlevisibility?language=objc) | -| HideTitleBar | Removes [NSWindowStyleMaskTitled](https://developer.apple.com/documentation/appkit/nswindowstylemask/nswindowstylemasktitled/) from the style mask | -| FullSizeContent | 使 webview 填满整个窗口。 [Apple Docs](https://developer.apple.com/documentation/appkit/nswindowstylemask/nswindowstylemaskfullsizecontentview) | -| UseToolbar | 向窗口添加默认工具栏。 [Apple Docs](https://developer.apple.com/documentation/appkit/nstoolbar?language=objc) | -| HideToolbarSeparator | 删除工具栏下方的线条。 [Apple Docs](https://developer.apple.com/documentation/appkit/nstoolbar/1516954-showsbaselineseparator?language=objc) | - -Preconfigured titlebar settings are available: - -| 值 | 描述 | -| --------------------------- | ---------------------------------------------- | -| `mac.TitleBarDefault()` | ![](/img/reference/titlebar-default.webp) | -| `mac.TitleBarHidden()` | ![](/img/reference/titlebar-hidden.webp) | -| `mac.TitleBarHiddenInset()` | ![](/img/reference/titlebar-hidden-inset.webp) | - -名称:Mac - -```go -Mac: &mac.Options{ - TitleBar: mac.TitleBarHiddenInset(), -} -``` - -Click [here](https://github.com/lukakerr/NSWindowStyles) for some inspiration on customising the titlebar. - -#### 外观类型 - -You can specify the application's [appearance](https://developer.apple.com/documentation/appkit/nsappearance?language=objc). - -| 值 | 描述 | -| ----------------------------------------------------- | --------------- | -| DefaultAppearance | 使用默认系统值 | -| NSAppearanceNameAqua | 标准日间系统外观 | -| NSAppearanceNameDarkAqua | 标准黑夜系统外观 | -| NSAppearanceNameVibrantLight | 轻盈灵动的外观 | -| NSAppearanceNameAccessibilityHighContrastAqua | 标准白天系统外观的高对比度版本 | -| NSAppearanceNameAccessibilityHighContrastDarkAqua | 标准黑夜系统外观的高对比度版本 | -| NSAppearanceNameAccessibilityHighContrastVibrantLight | 轻盈灵动外观的高对比度版本 | -| NSAppearanceNameAccessibilityHighContrastVibrantDark | 深色活力外观的高对比度版本 | - -名称:Mac - -```go -Mac: &mac.Options{ - Appearance: mac.NSAppearanceNameDarkAqua, -} -``` - -#### 关于结构 - -```go -type AboutInfo struct { - Title string - Message string - Icon []byte -} -``` - -如果提供了这些设置,“关于”菜单项将出现在应用程序菜单中(使用`AppMenu` role 时)。 建议这样配置: - -```go -//go:embed build/appicon.png -var icon []byte - -func main() { - err := wails.Run(&options.App{ - ... - Mac: &mac.Options{ - About: &mac.AboutInfo{ - Title: "My Application", - Message: "© 2021 Me", - Icon: icon, - }, - }, - }) - Mac: &mac.Options{ - About: &mac.AboutInfo{ - Title: "My Application", - Message: "© 2021 Me", - Icon: icon, - }, - }, - }) - Mac: &mac.Options{ - About: &mac.AboutInfo{ - Title: "My Application", - Message: "© 2021 Me", - Icon: icon, - }, - }, - }) -``` - -The "About" menu item will appear in the app menu: - -
- -
- -
- -When clicked, that will open an about message box: - -
- -
- -
- -## Linux 特定选项 - -### Icon - -设置代表窗口的图标。 当窗口最小化(也称为图标化)时使用此图标。 - -名称:Appearance - -一些窗口管理器或桌面环境也可能将其放置在窗口框架中,或在其他上下文中显示。 在其他情况下,根本不使用该图标,因此您的预计情况可能会有所不同。 - -注意:Wayland 上的 Gnome 至少不显示此图标。 要在那里有一个应用程序图标,必须使用一个`.desktop`文件。 在 KDE 上它应该可以工作。 - -图标应该以自然绘制的任何尺寸提供;也就是说,在传递图像之前不要缩放图像。 缩放将延迟到当所需的最终尺寸已知的最后一刻,以获得最佳质量。 diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/project-config.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/project-config.mdx deleted file mode 100644 index a491fb3d5..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/project-config.mdx +++ /dev/null @@ -1,63 +0,0 @@ ---- -sidebar_position: 5 ---- - -# 项目配置 - -项目配置在项目目录中的`wails.json`文件中。 配置的结构是: - -```json -{ - "name": "[项目名称]", - "assetdir": "[资源目录的相对路径]", - "reloaddirs": "[触发重新加载的附加目录(逗号分隔),这仅用于一些重要资源配置]", - "frontend:install": "[安装 node 依赖的命令,在 frontend 目录下运行 - 通常是 `npm install`]", - "frontend:build": "[构建资源的命令,在 frontend 目录下运行 - 通常是 `npm run build`]", - "frontend:dev": "[此命令已被 frontend:dev:build 替代。 If frontend:dev:build is not specified will falls back to this command. If frontend:dev:build is not specified will falls back to this command. 如果没有指定 frontend:dev:build 将回退到该命令,如果此命令也没有指定将回退到 frontend:build]", - "frontend:dev:build": "[此命令等效于开发模式中的 frontend:build,如果没有指定则回退到 frontend:dev]", - "frontend:dev:install": "[此命令等效于开发模式中的 frontend:install,如果没有指定则只有 frontend:install]", - "frontend:dev:watcher": "[此命令在 `wails dev` 上的单独进程中运行。 If not specified falls back to frontend:dev]", - "frontend:dev:install": "[This command is the dev equivalent of frontend:install. If not specified falls back to frontend:install]", - "frontend:dev:watcher": "[This command is run in a separate process on `wails dev`. Useful for 3rd party watchers or starting 3d party dev servers]", - "frontend:dev:serverUrl": "[URL to a 3rd party dev server to be used to serve assets, EG Vite. 对第 3 方观察者有用]", - "frontend:dev:serverUrl": "[使用第三方开发服务器提供资源,比如 Vite", - "wailsjsdir": "[自动生成的JS模块将被创建的目录的相对路径]", - "version": "[项目配置版本]", - "outputfilename": "[二进制文件的名称]", - "debounceMS": 100, // 在检测到资源更改时,开发服务器等待重新加载的时间 - "devServer": "[将 wails 开发服务器绑定到的地址。 默认:localhost:34115]", - "appargs": "[在dev模式下以shell样式传递给应用程序的参数]", - "runNonNativeBuildHooks": false, // 定义构建钩子是否应该运行,尽管它们是为主机操作系统以外的操作系统定义的。 - "preBuildHooks": { - "GOOS/GOARCH": "[The command that will be executed before a build of the specified GOOS/GOARCH: ${platform} is replaced with the "GOOS/GOARCH". The "GOOS/GOARCH" hook is executed before the "GOOS/*" and "*/*" hook.]", - "GOOS/*": "[The command that will be executed before a build of the specified GOOS: ${platform} is replaced with the "GOOS/GOARCH". The "GOOS/*" hook is executed before the "*/*" hook.]", - "*/*": "[The command that will be executed before every build: ${platform} is replaced with the "GOOS/GOARCH".]" - "postBuildHooks": { - "GOOS/GOARCH": "[在构建指定的 GOOS/GOARCH 后将执行的命令:${platform} 替换为'GOOS/GOARCH',${bin} 替换为编译后的二进制文件的路径。 The "GOOS/GOARCH" hook is executed before the "GOOS/*" and "*/*" hook.]", - "GOOS/*": "[The command that will be executed before a build of the specified GOOS: ${platform} is replaced with the "GOOS/GOARCH". The "GOOS/GOARCH" hook is executed before the "GOOS/*" and "*/*" hook.]", - "GOOS/*": "[The command that will be executed before a build of the specified GOOS: ${platform} is replaced with the "GOOS/GOARCH". The "GOOS/GOARCH" hook is executed before the "GOOS/*" and "*/*" hook.]", - "GOOS/*": "[The command that will be executed before a build of the specified GOOS: ${platform} is replaced with the "GOOS/GOARCH". The "GOOS/*" hook is executed before the "*/*" hook.]", - "*/*": "[The command that will be executed before every build: ${platform} is replaced with the "GOOS/GOARCH".]" - "postBuildHooks": { - "GOOS/GOARCH": "[在构建指定的 GOOS/GOARCH 后将执行的命令:${platform} 替换为'GOOS/GOARCH',${bin} 替换为编译后的二进制文件的路径。 - ]", - "GOOS/*": "[在构建指定的 GOOS 后将执行的命令:${platform} 替换为'GOOS/GOARCH',${bin} 替换为编译后的二进制文件的路径。 'GOOS/GOARCH'钩子在'GOOS/*'和'*/*'钩子之前执行。 ]", - "GOOS/*": "[在构建指定的 GOOS 后将执行的命令:${platform} 替换为'GOOS/GOARCH',${bin} 替换为编译后的二进制文件的路径。 'GOOS/*'钩子在'*/*'钩子之前执行。 ]", - "*/*": "[每次构建后将执行的命令:${platform} 替换为'GOOS/GOARCH',${bin} 替换为编译后的二进制文件的路径。 - ]" - }, - "info": { - // 用于填充 manifests 和 version 信息的数据。 - "companyName": "[公司名称。 默认: [项目名]]", - "productName": "[产品名称。 默认: [项目名]]", - "productVersion": "[产品的版本。 默认: '1.0.0']", - "copyright": "[产品的版权。 默认: 'Copyright.........']", - "comments": "[该应用程序的简短注释。 默认: 'Built using Wails (https://wails.app)']" - }, - "nsisType": "['multiple': 每个架构一个安装程序。 'single': 适用于所有正在构建的架构的单一通用安装程序。 默认: 'multiple']" -} -``` - -该文件将在运行`wails build`或`wails dev`时,由 Wails CLI 读取。 - -`wails build/dev`命令中的`assetdir`、`reloaddirs`、`wailsjsdir`、`debounceMS`、`devserver`和`frontenddevserverurl`标志将覆盖项目配置并作为后续运行的默认值。 diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/_category_.json b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/_category_.json deleted file mode 100644 index ac6d55488..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Runtime", - "position": 1 -} diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/browser.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/browser.mdx deleted file mode 100644 index 7a3679fe9..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/browser.mdx +++ /dev/null @@ -1,14 +0,0 @@ ---- -sidebar_position: 7 ---- - -# 浏览器 - -这些方法与系统浏览器相关。 - -### 浏览器打开 URL - -使用系统默认浏览器打开给定的 URL。 - -Go: `BrowserOpenURL(ctx context.Context, url string)`
JS: `BrowserOpenURL(url string)` - diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/dialog.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/dialog.mdx deleted file mode 100644 index efffe260b..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/dialog.mdx +++ /dev/null @@ -1,283 +0,0 @@ ---- -sidebar_position: 5 ---- - -# 对话框 - -运行时的这一部分提供对原生对话框的调用,例如文件选择器和消息框。 - -:::info Javascript -JS 运行时当前不支持对话框。 -::: - -### 打开选择目录对话框 - -打开一个对话框,提示用户选择目录。 可以使用 [打开选择文件对话框参数选项](#打开选择文件对话框参数选项)进行自定义。 - -Go: `OpenDirectoryDialog(ctx context.Context, dialogOptions OpenDialogOptions) (string, error)` - -返回值: 所选目录(如果用户取消则为空白)或错误 - -### 打开选择文件对话框 - -打开一个对话框,提示用户选择文件。 可以使用 [打开选择文件对话框参数选项](#打开选择文件对话框参数选项)进行自定义。 - -Go: `OpenFileDialog(ctx context.Context, dialogOptions OpenDialogOptions) (string, error)` - -返回值: 所选文件(如果用户取消则为空白)或错误 - -### 打开选择多个文件对话框 - -打开一个对话框,提示用户选择多个文件。 可以使用 [打开选择文件对话框参数选项](#打开选择文件对话框参数选项)进行自定义。 - -Go: `OpenMultipleFilesDialog(ctx context.Context, dialogOptions OpenDialogOptions) ([]string, error)` - -返回值: 选定的文件(如果用户取消则为零)或错误 - -### 保存文件对话框 - -打开一个对话框,提示用户选择文件名以进行保存。 可以使用[保存文件对话框参数选项](#保存文件对话框参数选项)自定义。 - -Go: `SaveFileDialog(ctx context.Context, dialogOptions SaveDialogOptions) (string, error)` - -返回值: 所选文件(如果用户取消则为空白)或错误 - -### 消息对话框 - -使用消息对话框显示消息。 可以使用[消息对话框参数选项](#消息对话框参数选项)进行自定义。 - -Go: `MessageDialog(ctx context.Context, dialogOptions MessageDialogOptions) (string, error)` - -返回值: 所选按钮的文本或错误 - -## 参数选项 - -### 打开选择文件对话框参数选项 - -```go -type OpenDialogOptions struct { - DefaultDirectory string - DefaultFilename string - Title string - Filters []FileFilter - ShowHiddenFiles bool - CanCreateDirectories bool - ResolvesAliases bool - TreatPackagesAsDirectories bool -} -``` - -| 字段 | 描述 | Win | Mac | Lin | -| -------------------------- | ------------------- | --- | --- | --- | -| DefaultDirectory | 对话框打开时显示的目录 | ✅ | ✅ | ✅ | -| DefaultFilename | 默认文件名 | ✅ | ✅ | ✅ | -| Title | 对话框的标题 | ✅ | ✅ | ✅ | -| [Filters](#filefilter) | 文件过滤器列表 | ✅ | ✅ | ✅ | -| ShowHiddenFiles | 显示系统隐藏的文件 | | ✅ | ✅ | -| CanCreateDirectories | 允许用户创建目录 | | ✅ | | -| ResolvesAliases | 如果为 true,则返回文件而不是别名 | | ✅ | | -| TreatPackagesAsDirectories | 允许导航到包 | | ✅ | | - -### 保存文件对话框参数选项 - -```go -type SaveDialogOptions struct { - DefaultDirectory string - DefaultFilename string - Title string - Filters []FileFilter - ShowHiddenFiles bool - CanCreateDirectories bool - TreatPackagesAsDirectories bool -} -``` - -| 字段 | 描述 | Win | Mac | Lin | -| -------------------------- | ----------- | --- | --- | --- | -| DefaultDirectory | 对话框打开时显示的目录 | ✅ | ✅ | ✅ | -| DefaultFilename | 默认文件名 | ✅ | ✅ | ✅ | -| Title | 对话框的标题 | ✅ | ✅ | ✅ | -| [Filters](#filefilter) | 文件过滤器列表 | ✅ | ✅ | ✅ | -| ShowHiddenFiles | 显示系统隐藏的文件 | | ✅ | ✅ | -| CanCreateDirectories | 允许用户创建目录 | | ✅ | | -| TreatPackagesAsDirectories | 允许导航到包 | | ✅ | | - -### 消息对话框参数选项 - -```go -type MessageDialogOptions struct { - Type DialogType - Title string - Message string - Buttons []string - DefaultButton string - CancelButton string -} -``` - -| 字段 | 描述 | Win | Mac | Lin | -| ------------- | ----------------------------------- | --- | --- | --- | -| Type | 消息对话框的类型,例如问题、信息... | ✅ | ✅ | ✅ | -| Title | 对话框的标题 | ✅ | ✅ | ✅ | -| Message | 向用户显示的消息 | ✅ | ✅ | ✅ | -| Buttons | 按钮标题列表 | | ✅ | | -| DefaultButton | 带有此文本的按钮应被视为默认按钮。 Bound to `return` | | ✅ | | -| CancelButton | 带有此文本的按钮应被视为取消。 Bound to `escape` | | ✅ | | - -#### Windows - -Windows 具有标准对话框类型,其中的按钮不可自定义。 返回的值将是以下之一:"Ok"、"Cancel"、"Abort"、"Retry"、"Ignore"、"Yes"、"No"、"Try Again"或"Continue" - -#### Linux - -Linux 有标准的对话框类型,其中的按钮是不可定制的。 返回的值将是以下之一:“Ok”、“Cancel”、“Yes”、“No” - -#### Mac - -Mac 上的消息对话框最多可以指定 4 个按钮。 如果没有`DefaultButton`或`CancelButton`给出,第一个按钮被认为是默认的并绑定到`return`键。 - -对于以下代码: - -```go -selection, err := runtime.MessageDialog(b.ctx, runtime.MessageDialogOptions{ - Title: "It's your turn!", - Message: "Select a number", - Buttons: []string{"one", "two", "three", "four"}, -}) -``` - -第一个按钮显示为默认值: - -
- -
- -
- -如果我们指定`DefaultButton`为“two”: - -```go -selection, err := runtime.MessageDialog(b.ctx, runtime.MessageDialogOptions{ - Title: "It's your turn!", - Message: "Select a number", - Buttons: []string{"one", "two", "three", "four"}, - DefaultButton: "two", -}) -``` - -第二个按钮显示为默认值。 当 `return` 被按下时,则返回数值“two”。 - -
- -
- -
- -如果我们现在指定`CancelButton`为“three”: - -```go -selection, err := runtime.MessageDialog(b.ctx, runtime.MessageDialogOptions{ - Title: "It's your turn!", - Message: "Select a number", - Buttons: []string{"one", "two", "three", "four"}, - DefaultButton: "two", - CancelButton: "three", -}) -``` - -带有“three”的按钮显示在对话框的底部。 当`escape`被按下时,则返回值“three”: - -
- -
- -
-
-
- -#### 对话框类型 - -```go -const ( - InfoDialog DialogType = "info" - WarningDialog DialogType = "warning" - ErrorDialog DialogType = "error" - QuestionDialog DialogType = "question" - ) -``` - -### 文件过滤 - -```go -type FileFilter struct { - DisplayName string // Filter information EG: "Image Files (*.jpg, *.png)" - Pattern string // semi-colon separated list of extensions, EG: "*.jpg;*.png" -} -``` - -#### Windows - -Windows 允许您在对话框中使用多个文件过滤器。 每个 FileFilter 将在对话框中显示为一个单独的条目: - -
- -
- -
-
-
- -#### Linux - -Linux 允许您在对话框中使用多个文件过滤器。 每个 FileFilter 将在对话框中显示为一个单独的条目: - -
- -
- -
-
-
- -#### Mac - -Mac 对话框只有一组模式来过滤文件的概念。 如果提供了多个 FileFilters,Wails 将使用所有定义的模式。 - -示例: - -```go - selection, err := runtime.OpenFileDialog(b.ctx, runtime.OpenDialogOptions{ - Title: "Select File", - Filters: []runtime.FileFilter{ - { - DisplayName: "Images (*.png;*.jpg)", - Pattern: "*.png;*.jpg", - }, { - DisplayName: "Videos (*.mov;*.mp4)", - Pattern: "*.mov;*.mp4", - }, - }, - }) -``` - -这将导致使用`*.png,*.jpg,*.mov,*.mp4`作为过滤器打开文件对话框。 diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/events.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/events.mdx deleted file mode 100644 index 8d21f7bee..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/events.mdx +++ /dev/null @@ -1,38 +0,0 @@ ---- -sidebar_position: 2 ---- - -# 事件 - -Wails 运行时提供了一个统一的事件系统,其中事件可以由 Go 或 Javascript 发出或接收。 可选地,数据可以与事件一起传递。 侦听器将接收本地数据类型中的数据。 - -### 添加事件侦听器 - -此方法为给定的事件名称设置一个侦听器。 当一个`eventName`类型的事件被[触发指定事件](#触发指定事件)时,回调被触发。 与触发事件一起发送的任何其他数据都将传递给回调。 - -Go: `EventsOn(ctx context.Context, eventName string, callback func(optionalData ...interface{}))`
JS: `EventsOn(eventName string, callback function(optionalData?: any))` - -### 移除事件侦听器 - -This method unregisters the listener for the given event name, optionally multiple listeneres can be unregistered via `additionalEventNames`. - -Go: `EventsOff(ctx context.Context, eventName string, additionalEventNames ...string)`
JS: `EventsOff(eventName string, ...additionalEventNames)` - -### 添加只触发一次的事件侦听器 - -此方法为给定的事件名称设置一个侦听器,但只会触发一次。 - -Go: `EventsOnce(ctx context.Context, eventName string, callback func(optionalData ...interface{}))`
JS: `EventsOnce(eventName string, callback function(optionalData?: any))` - -### 添加指定对多触发次数的事件侦听器 - -此方法为给定的事件名称设置一个侦听器,但最多只能触发`counter`次。 - -Go: `EventsOnMultiple(ctx context.Context, eventName string, callback func(optionalData ...interface{}), counter int)`
JS: `EventsOnMultiple(eventName string, callback function(optionalData?: any), counter int)` - -### 触发指定事件 - -此方法触发指定的事件。 可选数据可以与事件一起传递。 这将触发任何事件侦听器。 - -Go: `EventsEmit(ctx context.Context, eventName string, optionalData ...interface{})`
JS: `EventsEmit(ctx context, optionalData function(optionalData?: any))` - diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/intro.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/intro.mdx deleted file mode 100644 index 24f60593f..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/intro.mdx +++ /dev/null @@ -1,73 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 介绍 - -运行时是一个为应用程序提供实用方法的库。 有 Go 和 Javascript 运行时,目的是在可能的情况下尝试使它们保持一致。 - -It has utility methods for: - -- [Window](window.mdx) -- [Menu](menu.mdx) -- [Dialog](dialog.mdx) -- [Events](events.mdx) -- [Browser](browser.mdx) -- [Log](log.mdx) - -Go 运行时可通过导入`github.com/wailsapp/wails/v2/pkg/runtime`。 此包中的所有方法都将 context 作为第一个参数。 此 context 应该从 [应用启动回调](../options.mdx#onstartup) 或 [前端 Dom 加载完成回调](../options.mdx#ondomready) 钩子获得。 - -:::info 注意 - -虽然上下文将提供给[应用启动回调](../../reference/options#应用启动回调)方法,但不能保证运行时将在此方法中工作,因为窗口正在不同的线程中初始化。 如果您希望在启动时调用运行时方法,请使用[前端 Dom 加载完成回调](../../reference/options#前端-dom-加载完成回调)方法。 - -::: - -Javascript 库可通过`window.runtime`提供给前端。 使用 `开发` 模式时会生成一个运行时包,该包为运行时提供 Typescript 声明。 这应该位于您的前端目录中的`wailsjs`目录中。 - -### 隐藏 - -Go: `Hide(ctx context.Context)`
JS: `Hide()` - -隐藏应用程序。 - -:::info Note On Mac, this will hide the application in the same way as the `Hide` menu item in standard Mac applications. This is different to hiding the window, but the application still being in the foreground. For Windows and Linux, this is currently the same as `WindowHide`. ::: This is different to hiding the window, but the application still being in the foreground. For Windows and Linux, this is currently the same as `WindowHide`. ::: - -### 环境 - -Shows the application. - -:::info Note On Mac, this will bring the application back into the foreground. For Windows and Linux, this is currently the same as `WindowShow`. ::: :::info Note On Mac, this will bring the application back into the foreground. For Windows and Linux, this is currently the same as `WindowShow`. ::: For Windows and Linux, this is currently the same as `WindowShow`. ::: ::: - -Go: `Show(ctx context.Context)`
JS: `Show()` - -### Quit - -Quits the application. - -Go: `Quit(ctx context.Context)`
JS: `Quit()` - -### Environment - -Returns details of the current environment. - -Go: `Environment(ctx context.Context) EnvironmentInfo`
JS: `Environment(): Promise` - -#### 环境信息 - -Go: -```go -type EnvironmentInfo struct { - BuildType string - Platform string - Arch string -} -``` -JS: -```ts -interface EnvironmentInfo { - buildType: string; - platform: string; - arch: string; -} -``` diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/log.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/log.mdx deleted file mode 100644 index 2b717aa52..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/log.mdx +++ /dev/null @@ -1,130 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 日志 - -Wails 运行时提供了一种可以从 Go 或 Javascript 调用的日志记录机制。 像大多数记录器一样,有许多日志级别: - -- Trace -- Debug -- Info -- Warning -- Error -- Fatal - -记录器将输出当前或更高日志级别的任何日志消息。 示例:`Debug`日志级别将输出除`Trace`消息之外的所有消息。 - -### 打印日志 - -将给定的消息记录为原始消息。 - -Go: `LogPrint(ctx context.Context, message string)`
JS: `LogPrint(message: string)` - -### 格式化打印日志 - -将给定的消息记录为原始消息。 - -Go: `LogPrintf(ctx context.Context, format string, args ...interface{})`
- -### Trace 日志 - -在`Trace`日志级别记录给定的消息。 - -Go: `LogTrace(ctx context.Context, message string)`
JS: `LogTrace(message: string)` - -### 格式化 Trace 日志 - -在`Trace`日志级别记录给定的消息。 - -Go: `LogTracef(ctx context.Context, format string, args ...interface{})`
- -### Debug 日志 - -在`Debug`日志级别记录给定的消息。 - -Go: `LogDebug(ctx context.Context, message string)`
JS: `LogDebug(message: string)` - -### 格式化 Debug 日志 - -在`Debug`日志级别记录给定的消息。 - -Go: `LogDebugf(ctx context.Context, format string, args ...interface{})`
- -### Info 日志 - -在`Info`日志级别记录给定的消息。 - -Go: `LogInfo(ctx context.Context, message string)`
JS: `LogInfo(message: string)` - -### 格式化 Info 日志 - -在`Info`日志级别记录给定的消息。 - -Go: `LogInfof(ctx context.Context, format string, args ...interface{})`
- -### Warning 日志 - -在`Warning`日志级别记录给定的消息。 - -Go: `LogWarning(ctx context.Context, message string)`
JS: `LogWarning(message: string)` - -### 格式化 Warning 日志 - -在`Warning`日志级别记录给定的消息。 - -Go: `LogWarningf(ctx context.Context, format string, args ...interface{})`
- -### Error 日志 - -在`Error`日志级别记录给定的消息。 - -Go: `LogError(ctx context.Context, message string)`
JS: `LogError(message: string)` - -### 格式化 Error 日志 - -在`Error`日志级别记录给定的消息。 - -Go: `LogErrorf(ctx context.Context, format string, args ...interface{})`
- -### Fatal 日志 - -在`Fatal`日志级别记录给定的消息。 - -Go: `LogFatal(ctx context.Context, message string)`
JS: `LogFatal(message: string)` - -### 格式化 Fatal 日志 - -在`Fatal`日志级别记录给定的消息。 - -Go: `LogFatalf(ctx context.Context, format string, args ...interface{})`
- -### 设置日志级别 - -设置日志级别。 在 Javascript 中,该数字与以下日志级别有关: - -| 值 | 日志等级 | -| - | ------- | -| 1 | Trace | -| 2 | Debug | -| 3 | Info | -| 4 | Warning | -| 5 | Error | - -Go: `LogSetLogLevel(ctx context.Context, level logger.LogLevel)`
JS: `LogSetLogLevel(level: number)` - -## 使用自定义日志 - -可以通过使用应用程序参数选项 [日志](../../reference/options#日志) 提供自定义记录器来使用它。 唯一的要求是记录器实现了在`github.com/wailsapp/wails/v2/pkg/logger`里`logger.Logger`定义的接口: - -```go title="logger.go" -type Logger interface { - Print(message string) - Trace(message string) - Debug(message string) - Info(message string) - Warning(message string) - Error(message string) - Fatal(message string) -} -``` diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/menu.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/menu.mdx deleted file mode 100644 index 4ce2b368e..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/menu.mdx +++ /dev/null @@ -1,24 +0,0 @@ ---- -sidebar_position: 6 ---- - -# 菜单 - -这些方法与应用程序菜单相关。 - -:::info Javascript - Menu is currently unsupported in the JS runtime. -::: ::: -::: ::: - -### 设置应用程序菜单 - -Sets the application menu to the given [menu](../menus.mdx). - -Go: `MenuSetApplicationMenu(ctx context.Context, menu *menu.Menu)` - -### 更新应用程序菜单 - -将应用程序菜单设置为给定的[应用菜单](../../reference/menus)。 - -Go: `MenuUpdateApplicationMenu(ctx context.Context)` diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/window.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/window.mdx deleted file mode 100644 index e26776d0c..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/reference/runtime/window.mdx +++ /dev/null @@ -1,213 +0,0 @@ ---- -sidebar_position: 4 ---- - -# 窗口 - -这些方法可以控制应用程序窗口。 - -### 窗口标题 - -设置窗口标题栏中的文本。 - -Go: `WindowSetTitle(ctx context.Context, title string)`
JS: `WindowSetTitle(title: string)` - -### 窗口全屏 - -使窗口全屏。 - -Go: `WindowFullscreen(ctx context.Context)`
JS: `WindowFullscreen()` - -### 窗口取消全屏 - -在全屏之前恢复先前的窗口尺寸和位置。 - -Go: `WindowUnfullscreen(ctx context.Context)`
JS: `WindowUnfullscreen()` - -### 窗口居中 - -使窗口在当前窗口所在的监视器上居中。 - -Go: `WindowCenter(ctx context.Context)`
JS: `WindowCenter()` - -### 窗口居中 - -使窗口在当前窗口所在的监视器上居中。 - -Go: `WindowReload(ctx context.Context)`
JS: `WindowReload()` - -### 窗口重新加载 - -执行“重新加载”(重新加载 index.html) - -Go: `WindowReloadApp(ctx context.Context)`
JS: `WindowReloadApp()` - -### 窗口设置系统默认主题 - -仅限 Windows。 - -Go: `WindowSetSystemDefaultTheme(ctx context.Context)`
JS: `WindowSetSystemDefaultTheme()` - -### 窗口设置深色主题 - -JS 方法签名: `WindowSetLightTheme()` - -JS 方法签名: `WindowSetLightTheme()` - -仅限 Windows。 - -### 显示窗口 - -JS 方法签名: `WindowSetLightTheme()` - -JS 方法签名: `WindowSetLightTheme()` - -仅限 Windows。 - -### 隐藏窗口 - -JS 方法签名: `WindowSetLightTheme()` - -隐藏窗口(如果当前可见)。 - -如果窗口当前处于隐藏状态,则显示该窗口。 - -### 设置窗口尺寸 - -隐藏窗口(如果当前可见)。 - -Go: `WindowHide(ctx context.Context)`
JS: `WindowHide()` - -### 获取窗口尺寸 - -设置窗口的宽度和高度。 - -Go: `WindowSetSize(ctx context.Context, width int, height int)`
JS: `WindowSetSize(size: Size)` - -### 设置窗口最大尺寸 - -Returns true if the window not minimised, maximised or fullscreen. - -Go: `WindowGetSize(ctx context.Context) (width int, height int)`
JS: `WindowGetSize() : Size` - -### 设置窗口最小尺寸 - -获取窗口的宽度和高度。 - -Go: `WindowSetMinSize(ctx context.Context, width int, height int)`
JS: `WindowSetMinSize(size: Size)` - -### 设置窗口最大尺寸 - -Gets the width and height of the window. - -Go: `WindowSetAlwaysOnTop(ctx context.Context, b bool)`
JS: `WindowSetAlwaysOnTop(b: Boolen)` - -### 设置窗口位置 - -设置最小窗口大小。 如果窗口当前小于给定尺寸,将调整窗口大小。 - -Setting a size of `0,0` will disable this constraint. - -获取相对于窗口当前所在显示器的窗口位置。 - -### 获取窗口位置 - -设置最大窗口大小。 如果窗口当前大于给定尺寸,将调整窗口大小。 - -Setting a size of `0,0` will disable this constraint. - -Go: `WindowSetPosition(ctx context.Context, x int, y int)`
JS: `WindowSetPosition(position: Position)` - -### 窗口最大化 - -获取相对于窗口当前所在显示器的窗口位置。 - -Go: `WindowGetPosition(ctx context.Context) (x int, y int)`
JS: `WindowGetPosition() : Position` - -### 窗口取消最大化 - -最大化窗口以填满屏幕。 - -Go: `WindowMaximise(ctx context.Context)`
JS: `WindowMaximise()` - -### 窗口最大化切换 - -将窗口恢复到最大化之前的尺寸和位置。 - -Go: `WindowUnmaximise(ctx context.Context)`
JS: `WindowUnmaximise()` - -### 窗口最小化 - -在最大化和最大化之间切换。 - -Go: `WindowToggleMaximise(ctx context.Context)`
JS: `WindowToggleMaximise()` - -### 窗口取消最小化 - -最小化窗口。 - -Go: `WindowMinimise(ctx context.Context)`
JS: `WindowMinimise()` - -### 尺寸 - -Returns true if the window is maximised. - -Go: `WindowUnminimise(ctx context.Context)`
JS: `WindowUnminimise()` - -### 窗口设置 RGBA - -将窗口恢复到最小化之前的尺寸和位置。 - -Go: `WindowToggleMaximise(ctx context.Context)`
JS: `WindowToggleMaximise()` - -### 位置 - -窗口 - -Go: `WindowSetBackgroundColour(ctx context.Context, R, G, B, A uint8)`
JS: `WindowSetBackgroundColour(R, G, B, A)` - -### 尺寸 - -Restores the window to the dimensions and position prior to minimising. - -Go: `WindowUnminimise(ctx context.Context)`
JS: `WindowUnminimise()` - -### WindowIsMinimised - -Returns true if the window is minimised. - -Go: `WindowIsMinimised(ctx context.Context) bool` JS: `WindowIsMinimised() bool` - -### WindowSetBackgroundColour - -将窗口的背景颜色设置为给定的 RGBA 颜色定义。 此颜色将显示所有透明像素。 - -Valid values for R, G, B and A are 0-255. - -:::info Windows -On Windows, only alpha values of 0 or 255 are supported. -任何不为 0 的值都将被视为 255。 -任何不为 0 的值都将被视为 255。 -::: - -Go: `WindowSetBackgroundColour(ctx context.Context, R, G, B, A uint8)`
JS: `WindowSetBackgroundColour(R, G, B, A)` - -## Typescript 对象定义 - -### Position - -```ts -interface Position { - x: number; - y: number; -} -``` - -### Size - -```ts -interface Size { - w: number; - h: number; -} -``` diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/_category_.json b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/_category_.json deleted file mode 100644 index dfac1d175..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Tutorials", - "position": 70 -} diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/dogsapi.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/dogsapi.mdx deleted file mode 100644 index f4845fdbe..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/dogsapi.mdx +++ /dev/null @@ -1,243 +0,0 @@ ---- -sidebar_position: 20 ---- - -# Dogs API - -
- -
- -
- -:::note This tutorial has been kindly provided by [@tatadan](https://twitter.com/tatadan) and forms part of their [Wails Examples Repository](https://github.com/tataDan/wails-v2-examples). ::: - -In this tutorial we are going to develop an application that retrieves photos of dogs from the web and then displays them. - -### Create the project - -Let's create the application. From a terminal enter: `wails init -n dogs-api -t svelte` - -Note: We could optionally add `-ide vscode` or `-ide goland` to the end of this command if you wanted to add IDE support. - -Now let's `cd dogs-api` and start editing the project files. - -### Remove unused code - -We will start by removing some elements that we know we will not use: - -- Open `app.go` and remove the following lines: - -```go -// Greet returns a greeting for the given name -func (a *App) Greet(name string) string { - return fmt.Sprintf("Hello %s, It's show time!", name) -} -``` - -- Open `frontend/src/App.svelte` and delete all lines. -- Delete the `frontend/src/assets/images/logo-universal.png` file - -### Creating our application - -Now let's add our new Go code. - -Add the following struct declarations to `app.go` before the function definitions: - -```go -type RandomImage struct { - Message string - Status string -} - -type AllBreeds struct { - Message map[string]map[string][]string - Status string -} - -type ImagesByBreed struct { - Message []string - Status string -} -``` - -Add the following functions to `app.go` (perhaps after the existing function definitions): - -```go -func (a *App) GetRandomImageUrl() string { - response, err := http.Get("https://dog.ceo/api/breeds/image/random") - if err != nil { - log.Fatal(err) - } - - responseData, err := ioutil.ReadAll(response.Body) - if err != nil { - log.Fatal(err) - } - - var data RandomImage - json.Unmarshal(responseData, &data) - - return data.Message -} - -func (a *App) GetBreedList() []string { - var breeds []string - - response, err := http.Get("https://dog.ceo/api/breeds/list/all") - if err != nil { - log.Fatal(err) - } - - responseData, err := ioutil.ReadAll(response.Body) - if err != nil { - log.Fatal(err) - } - - var data AllBreeds - json.Unmarshal(responseData, &data) - - for k := range data.Message { - breeds = append(breeds, k) - } - - sort.Strings(breeds) - - return breeds -} - -func (a *App) GetImageUrlsByBreed(breed string) []string { - - url := fmt.Sprintf("%s%s%s%s", "https://dog.ceo/api/", "breed/", breed, "/images") - response, err := http.Get(url) - if err != nil { - log.Fatal(err) - } - - responseData, err := ioutil.ReadAll(response.Body) - if err != nil { - log.Fatal(err) - } - - var data ImagesByBreed - json.Unmarshal(responseData, &data) - - return data.Message -} -``` - -Modify the `import` section of `app.go` to look like this: - -```go -import ( - "context" - "fmt" - "encoding/json" - "io/ioutil" - "log" - "net/http" - "sort" -) -``` - -Add the following lines to `frontend/src/App.svelte`: - -```html - - -

Dogs API

-
- - Click on down arrow to select a breed - - -
-
-{#if showRandomPhoto} - No dog found -{/if} -{#if showBreedPhotos} - {#each photos as photo} - No dog found - {/each} -{/if} - - -``` - -### Testing the application - -To generate the bindings and test the application, run `wails dev`. - -### Compiling the application - -To compile the application to a single, production grade binary, run `wails build`. - - - - - diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/helloworld.mdx b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/helloworld.mdx deleted file mode 100644 index 034c44fd6..000000000 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/version-v2.0.0-rc.1/tutorials/helloworld.mdx +++ /dev/null @@ -1,117 +0,0 @@ ---- -sidebar_position: 10 ---- - -# 你好世界 - -本教程的目的是让你使用最基本的 软件来运行和使用Wails。 你将可以: - -- 创建一个新的Wails应用 -- 构建应用 -- 运行应用 - -:::note -本教程使用 Windows 作为目标平台。 根据您的操作系统,输出会略有不同。 -::: - -## 创建一个新Wails应用 - -使用默认的vanilla JS模板创建新的Wails程序, 您需要运行这个指令: - -```bash -wails init -n helloworld -``` - -您应该会看到如下输出: - -``` -Wails CLI v2.0.0 - -Initialising Project 'helloworld' ---------------------------------- - -Project Name: helloworld -Project Directory: C:\Users\leaan\tutorial\helloworld -Project Template: vanilla -Template Support: https://wails.io - -Initialised project 'helloworld' in 232ms. -``` - -这将在当前目录中创建一个名为 `helloworld` 的新目录。 在这个目录中,您会找到一些文件: - -``` -build/ - Contains the build files + compiled application -frontend/ - Contains the frontend files -app.go - Contains the application code -main.go - The main program with the application configuration -wails.json - The project configuration file -go.mod - The go module file -go.sum - The go module checksum file -``` - -## 构建应用 - -要构建应用程序,请切换到新的 `helloword` 项目目录并运行以下命令: - -```bash -wails build -``` - -您应该会看到如下输出: - -``` -Wails CLI v2.0.0 - -App Type: desktop -Platforms: windows/amd64 -Compiler: C:\Users\leaan\go\go1.18.3\bin\go.exe -Build Mode: Production -Skip Frontend: false -Compress: false -Package: true -Clean Build Dir: false -LDFlags: "" -Tags: [] -Race Detector: false - -Building target: windows/amd64 ------------------------------- - - Installing frontend dependencies: Done. - - Compiling frontend: Done. - - Generating bundle assets: Done. - - Compiling application: Done. -Built 'C:\Users\leaan\tutorial\helloworld\build\bin\helloworld.exe' in 10.616s. -``` - -这有一个已经编译了的应用程序保存在 `build/bin` 目录中。 - -## 运行应用 - -如果我们在 Windows 文件管理器中查看 `build/bin` 目录,我们应该看到我们的项目二进制文件: - -
- -
- -
- -我们可以通过简单的双击 `helloworld.exe` 文件来运行它。 - -在 Mac 上,Wails 生成一个 `helloworld.app` 文件,可以通过双击来运行。 - -在 Linux 上,您可以从 `build/bin` 目录使用 `/helloword` 运行应用程序。 - -您应该看到应用程序正常工作: - -
- -
-
diff --git a/website/versioned_docs/version-v2.0.0-beta.44/appendix/_category_.json b/website/versioned_docs/version-v2.0.0-beta.44/appendix/_category_.json deleted file mode 100644 index 83af4ca28..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/appendix/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Appendix", - "position": 70 -} diff --git a/website/versioned_docs/version-v2.0.0-beta.44/community/_category_.json b/website/versioned_docs/version-v2.0.0-beta.44/community/_category_.json deleted file mode 100644 index 524986e1e..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/community/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Community", - "position": 50 -} diff --git a/website/versioned_docs/version-v2.0.0-beta.44/community/links.mdx b/website/versioned_docs/version-v2.0.0-beta.44/community/links.mdx deleted file mode 100644 index d081cb9b3..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/community/links.mdx +++ /dev/null @@ -1,24 +0,0 @@ ---- -sidebar_position: 2 ---- - -# Links - -This page serves as a list for community related links. Please submit a PR (click `Edit this page` at the bottom) -to submit links. - -## Awesome Wails - -The [definitive list](https://github.com/wailsapp/awesome-wails) of links related to Wails. - -## Support Channels - -- [Gophers Slack Channel](https://gophers.slack.com/messages/CJ4P9F7MZ/) -- [Gophers Slack Channel Invite](https://invite.slack.golangbridge.org/) -- [Github Issues](https://github.com/wailsapp/wails/issues) -- [v2 Beta Discussion Board](https://github.com/wailsapp/wails/discussions/828) - -## Social Media - -- [Twitter](https://twitter.com/wailsapp) -- [Wails Chinese Community QQ Group](https://qm.qq.com/cgi-bin/qm/qr?k=PmIURne5hFGNd7QWzW5qd6FV-INEjNJv&jump_from=webapi) - Group number: 1067173054 diff --git a/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/_category_.json b/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/_category_.json deleted file mode 100644 index 276e283b7..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Showcase", - "position": 1 -} diff --git a/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/emailit.mdx b/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/emailit.mdx deleted file mode 100644 index 629b67be8..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/emailit.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# EmailIt - -

-
-

- -[EmailIt](https://github.com/raguay/EmailIt/) is a Wails 2 program that is a markdown based email sender only with nine notepads, scripts to manipulate the text, and templates. It also has a builtin [Node-Red](https://nodered.org/) server, scripts terminal, and the [ScriptBar](https://github.com/raguay/ScriptBarApp) program for displaying results from Node-Red or a script on your system. Documentation is very scarce, but the programs works. It’s built using Wails2 and Svelte, and the download is a universal macOS application. - diff --git a/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/encrypteasy.mdx b/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/encrypteasy.mdx deleted file mode 100644 index 5df462ac5..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/encrypteasy.mdx +++ /dev/null @@ -1,10 +0,0 @@ - -# EncryptEasy - -

-
-

- -**[EncryptEasy](https://www.encrypteasy.app) is a simple and easy to use PGP encryption tool, managing all your and your contacts keys. Encryption should be simple. Developed with Wails.** - -Encrypting messages using PGP is the industry standard. Everyone has a private and a public key. Your private key, well, needs to be kept private so only you can read messages. Your public key is distributed to anyone who wants to send you secret, encrypted messages. Managing keys, encrypting messages and decrypting messages should be a smooth experience. EncryptEasy is all about making it easy. diff --git a/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/filehound.mdx b/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/filehound.mdx deleted file mode 100644 index c4e5d96d0..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/filehound.mdx +++ /dev/null @@ -1,23 +0,0 @@ - -# FileHound Export Utility - -

-
-

- - -[FileHound Export Utility](https://www.filehound.co.uk/) FileHound is a cloud document management platform made for secure file retention, business process automation and SmartCapture capabilities. - -The FileHound Export Utility allows FileHound Administrators the ability to run a secure document and data extraction tasks for alternative back-up and recovery purposes. This application will download all documents and/or meta data saved in FileHound based on the filters you choose. The metadata will be exported in both JSON and XML formats. - -Backend built with: -Go 1.15 -Wails 1.11.0 -go-sqlite3 1.14.6 -go-linq 3.2 - -Frontend with: -Vue 2.6.11 -Vuex 3.4.0 -Typescript -Tailwind 1.9.6 diff --git a/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/modalfilemanager.mdx b/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/modalfilemanager.mdx deleted file mode 100644 index 6245d8171..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/modalfilemanager.mdx +++ /dev/null @@ -1,10 +0,0 @@ -# Modal File Manager - -

-
-

- -[Modal File Manager](https://github.com/raguay/ModalFileManager) is a dual pane file manager using web technologies. My original design was based on NW.js and can be found [here](https://github.com/raguay/ModalFileManager-NWjs). This version uses the same Svelte based frontend code (but it has be greatly modified since the departure from NW.js), but the backend is a [Wails 2](https://wails.io/) implementation. By using this implementation, I no longer use command line `rm`, `cp`, etc. commands. It is fully coded using Go and runs much faster than the previous versions. - -This file manager is designed around the same principle as Vim: a state controlled keyboard actions. The number of states isn't fixed, but very programmable. Therefore, an infinite number of keyboard configurations can be created and used. This is the main difference from other file managers. - diff --git a/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/mollywallet.mdx b/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/mollywallet.mdx deleted file mode 100644 index 2354e566e..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/mollywallet.mdx +++ /dev/null @@ -1,9 +0,0 @@ - -# Molley Wallet - -

-
-

- -[Molly Wallet](https://github.com/grvlle/constellation_wallet/) the official $DAG wallet of the Constellation Network. It'll let users interact with the Hypergraph Network in various ways, not limited to producing $DAG transactions. - diff --git a/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/october.mdx b/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/october.mdx deleted file mode 100644 index f9db3cede..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/october.mdx +++ /dev/null @@ -1,11 +0,0 @@ -# October - -

-
-

- -[October](https://october.utf9k.net) is a small Wails application that makes it really easy to extract highlights from [Kobo eReaders](https://en.wikipedia.org/wiki/Kobo_eReader) and then forward them to [Readwise](https://readwise.io). - -It has a relatively small scope with all platform versions weighing in under 10MB, and that's without enabling [UPX compression](https://upx.github.io/)! - -In contrast, the author's previous attempts with Electron quickly bloated to several hundred megabytes. \ No newline at end of file diff --git a/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/optimus.mdx b/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/optimus.mdx deleted file mode 100644 index f35de9442..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/optimus.mdx +++ /dev/null @@ -1,9 +0,0 @@ - -# Optimus - -

-
-

- -[Optimus](https://github.com/splode/optimus) is a desktop image optimization application. It supports conversion and compression between WebP, JPEG, and PNG image formats. - diff --git a/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/portfall.mdx b/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/portfall.mdx deleted file mode 100644 index 63524e35c..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/portfall.mdx +++ /dev/null @@ -1,9 +0,0 @@ - -# Portfall - -

-
-

- -[Portfall](https://github.com/rekon-oss/portfall) - A desktop k8s port-forwarding portal for easy access to all your cluster UIs - diff --git a/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/restic-browser.mdx b/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/restic-browser.mdx deleted file mode 100644 index 034370609..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/restic-browser.mdx +++ /dev/null @@ -1,11 +0,0 @@ - -# Restic Browser - -

-
-

- -[Restic-Browser](https://github.com/emuell/restic-browser) - A simple, cross-platform [restic](https://github.com/restic/restic) backup GUI for browsing and restoring restic repositories. - - - diff --git a/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/riftshare.mdx b/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/riftshare.mdx deleted file mode 100644 index 892d3d7fb..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/riftshare.mdx +++ /dev/null @@ -1,19 +0,0 @@ - -# RiftShare - -

-
-

- -Easy, Secure, and Free file sharing for everyone. Learn more at [Riftshare.app](https://riftshare.app) - -## Features - -* Easy secure file sharing between computers both in the local network and through the internet -* Supports sending files or directories securely through the [magic wormhole protocol](https://magic-wormhole.readthedocs.io/en/latest/) -* Compatible with all other apps using magic wormhole (magic-wormhole or wormhole-william CLI, wormhole-gui, etc.) -* Automatic zipping of multiple selected files to send at once -* Full animations, progress bar, and cancellation support for sending and receiving -* Native OS File Selection -* Open files in one click once received -* Auto Update - don't worry about having the latest release! diff --git a/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/scriptbar.mdx b/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/scriptbar.mdx deleted file mode 100644 index 02538a030..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/scriptbar.mdx +++ /dev/null @@ -1,7 +0,0 @@ -# ScriptBar - -

-
-

- -[ScriptBar](https://GitHub.com/raguay/ScriptBarApp) is a program to show the output of the embedded [Node-Red](https://nodered.org) server in the [EmailIt](https://GitHub.com/raguay/EmailIt) application. It also displays the output of scripts on your system. ScriptBar doesn't put them in the menubar, but has them all in a convient window for easy viewing. You can have multiple tabs to have many different things show. You can also keep the links to your most visited web sites. diff --git a/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/surge.mdx b/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/surge.mdx deleted file mode 100644 index 02fba67c0..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/surge.mdx +++ /dev/null @@ -1,9 +0,0 @@ - -# Surge - -

-
-

- -[Surge](https://getsurge.io/) is a p2p filesharing app designed to utilize blockchain technologies to enable 100% anonymous file transfers. Surge is end-to-end encrypted, decentralized and open source. - diff --git a/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/wally.mdx b/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/wally.mdx deleted file mode 100644 index b4bb707c7..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/wally.mdx +++ /dev/null @@ -1,9 +0,0 @@ - -# Wally - -

-
-

- -[Wally](https://ergodox-ez.com/pages/wally) is the official firmware flasher for [Ergodox](https://ergodox-ez.com/) keyboards. It looks great and is a fantastic example of what you can achieve with Wails: the ability to combine the power of Go and the rich graphical tools of the web development world. - diff --git a/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/wombat.mdx b/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/wombat.mdx deleted file mode 100644 index d580c7eca..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/wombat.mdx +++ /dev/null @@ -1,10 +0,0 @@ - -# Wombat - -

-
-

- - -[Wombat](https://github.com/rogchap/wombat) is a cross platform gRPC client. - diff --git a/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/ytd.mdx b/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/ytd.mdx deleted file mode 100644 index 5b7568436..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/community/showcase/ytd.mdx +++ /dev/null @@ -1,10 +0,0 @@ - -# Ytd - -

-
-

- - -[Ytd](https://github.com/marcio199226/ytd/tree/v2-wails) is an app for downloading tracks from youtube, creating offline playlists and share them with your friends, your friends will be able to playback your playlists or download them for offline listening, has an built-in player. - diff --git a/website/versioned_docs/version-v2.0.0-beta.44/community/templates.mdx b/website/versioned_docs/version-v2.0.0-beta.44/community/templates.mdx deleted file mode 100644 index 3f2fe6dba..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/community/templates.mdx +++ /dev/null @@ -1,49 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Templates - -This page serves as a list for community supported templates. Please submit a PR (click `Edit this page` at the bottom) -to include your templates. To build your own template, please see the [Templates](../guides/templates.mdx) guide. - -To use these templates, run `wails init -n "Your Project Name" -t [the link below[@version]]` - -If there is no version suffix, the main branch code template is used by default. If there is a version suffix, the code template corresponding to the tag of this version is used. - -Example: `wails init -n "Your Project Name" -t https://github.com/misitebao/wails-template-vue` - -:::warning Attention - -**The Wails project does not maintain, is not responsible nor liable for 3rd party templates!** - -If you are unsure about a template, inspect `package.json` and `wails.json` for what scripts are run and what packages are installed. - -::: - -## Vue - -- [wails-template-vue](https://github.com/misitebao/wails-template-vue) - A template using Vite,Vue and Vue-Router(Support both JavaScript and TypeScript) -- [wails-vite-vue-ts](https://github.com/codydbentley/wails-vite-vue-ts) - Vue 3 TypeScript with Vite (and instructions to add features) -- [wails-vite-vue-the-works](https://github.com/codydbentley/wails-vite-vue-the-works) - Vue 3 TypeScript with Vite, Vuex, Vue Router, Sass, and ESLint + Prettier - -## Angular - -- [wails-angular-template](https://github.com/TAINCER/wails-angular-template) - Angular with TypeScript, Sass, Hot-Reload, Code-Splitting and i18n - -## React - -- [wails-react-template](https://github.com/AlienRecall/wails-react-template) - A template using reactjs -- [wails-react-template](https://github.com/flin7/wails-react-template) - A minimal template for React that supports live development -- [wails-template-nextjs](https://github.com/LGiki/wails-template-nextjs) - A template using Next.js and TypeScript - -## Svelte - -- [wails-svelte-template](https://github.com/raitonoberu/wails-svelte-template) - A template using Svelte -- [wails-vite-svelte-template](https://github.com/BillBuilt/wails-vite-svelte-template) - A template using Svelte and Vite -- [wails-vite-svelte-tailwind-template](https://github.com/BillBuilt/wails-vite-svelte-tailwind-template) - A template using Svelte and Vite with TailwindCSS v3 -- [wails-sveltekit-template](https://github.com/h8gi/wails-sveltekit-template) - A template using SvelteKit - -## Elm - -- [wails-elm-template](https://github.com/benjamin-thomas/wails-elm-template) - Develop your GUI app with functional programming and a **snappy** hot-reload setup :tada: :rocket: diff --git a/website/versioned_docs/version-v2.0.0-beta.44/contributing/_category_.json b/website/versioned_docs/version-v2.0.0-beta.44/contributing/_category_.json deleted file mode 100644 index fad21931a..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/contributing/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Contributing", - "position": 99 -} diff --git a/website/versioned_docs/version-v2.0.0-beta.44/contributing/developing-new-features.mdx b/website/versioned_docs/version-v2.0.0-beta.44/contributing/developing-new-features.mdx deleted file mode 100644 index 1aa5ea145..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/contributing/developing-new-features.mdx +++ /dev/null @@ -1,35 +0,0 @@ ---- -sidebar_position: 20 ---- - -# Developing New Features - -We are always keen to add features to Wails and expand on what the project can do. -The process for adding new features are as follows: - -- Pick an enhancement ticket with the "TODO" label. It's preferable to select one from the current -[Backlog](https://github.com/orgs/wailsapp/projects/1/views/1) but the choice is yours. -- Before developing, check that the ticket includes the following information: -- The purpose of the enhancement -- What is out of scope for the enhancement -- What platforms the enhancement targets (most features should be cross-platform unless there's a very specific reason) -- If the ticket does not include this information, feel free to request the information from the -person who opened the ticket. Sometimes placeholder tickets are created and require more details -- Comment on the ticket stating you wish to develop the feature -- Clone the repository and create a branch with the format `feature/_` -- New features often require documentation so please ensure you have also added or updated the documentation as part of -the changes -- Once the feature is ready for testing, create a draft PR. Please ensure the PR description has the test scenarios and -test cases listed with checkmarks, so that others can know what still needs to be tested. -- Once all the testing is completed, please update the status of the PR from draft and leave a message. - -:::note -There is nothing stopping you from opening a ticket and working on it yourself, but please be aware that all -enhancement requests are reviewed for good fit. Not all ideas will be selected so it's best to have discussion -on the ticket first. -::: - -:::warning -Any PRs opened without a corresponding ticket may be rejected. -::: - diff --git a/website/versioned_docs/version-v2.0.0-beta.44/contributing/documenting.mdx b/website/versioned_docs/version-v2.0.0-beta.44/contributing/documenting.mdx deleted file mode 100644 index 1655a44fe..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/contributing/documenting.mdx +++ /dev/null @@ -1,39 +0,0 @@ ---- -sidebar_position: 40 ---- - -# Documenting - -This website is also the main documentation site for the project. Sometimes this gets -out of date and needs some slight adjustments. Some of the documentation isn't written -to the best standards either. Developing documentation is hard and so any contribution -to this is greatly appreciated. Features without documentation are unfinished so to the -project, it's *as important* as the code. - -We generally do not create tickets for updating documentation so if there is text you -think should be updated or rephrased then feel free to submit a PR for that. This site -is in the main repository under the `website` directory. We use [Docusaurus](https://docusaurus.io/) to create -the site so there is plenty of existing documentation and tutorials around to get started. - -To set up a local documentation development environment, do the following: - -- [Install npm](https://docs.npmjs.com/cli/v8/configuring-npm/install) -- `cd website` -- `npm install` -- `npm run start` - -After it has all installed and is running, you should see the site at [`http://localhost:3000`](http://localhost:3000). -Any changes made to the site text will be immediately reflected in the browser. - -## Versioning - -We employ a versioning system where we have the "latest" documentation AKA "Next Version" which -has all the changes that have occurred since the last release. We also keep the last release -documentation as well as the version before that. - -There isn't usually a reason to update released documentation so we don't generally update -the documents in the `versioned_docs` or `versioned_sidebars` directories. - -The "next version" docs are mainly in `website/docs` with some "version independent" documents -in `src/pages`. Any updates should be made in the `website/docs` directory. - diff --git a/website/versioned_docs/version-v2.0.0-beta.44/contributing/fixing-bugs.mdx b/website/versioned_docs/version-v2.0.0-beta.44/contributing/fixing-bugs.mdx deleted file mode 100644 index 7e1c78ad3..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/contributing/fixing-bugs.mdx +++ /dev/null @@ -1,30 +0,0 @@ ---- -sidebar_position: 30 ---- - -# Fixing Bugs - -The process for fixing bugs are as follows: - -- Check the current [Backlog](https://github.com/orgs/wailsapp/projects/1/views/1) and select a bug to fix -- Before developing, check that the ticket includes the following information: -- The scope of the issue including platforms affected -- The steps to reproduce. Sometimes bugs are opened that are not Wails issues and the onus is on the reporter to -prove that it is a Wails issue with a minimal reproducible example -- The output of `wails doctor` -- If the ticket does not include this information, feel free to request the information from the -person who opened the ticket. -- Comment on the ticket stating you wish to develop a fix -- Clone the repository and create a branch with the format `bugfix/_` -- Once the fix is ready for testing, create a draft PR. Please ensure the PR description has the test scenarios and -test cases listed with checkmarks, so that others can know what still needs to be tested. -- Once all the testing is completed, please update the status of the PR from draft and leave a message. - -:::note -There is nothing stopping you from opening a ticket and working on it yourself, but please be aware that all -bugfixes should be discussed as the approach may have unintended side effects. -::: - -:::warning -Any PRs opened without a corresponding ticket may be rejected. -::: \ No newline at end of file diff --git a/website/versioned_docs/version-v2.0.0-beta.44/contributing/helping-others.mdx b/website/versioned_docs/version-v2.0.0-beta.44/contributing/helping-others.mdx deleted file mode 100644 index 340f51a2a..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/contributing/helping-others.mdx +++ /dev/null @@ -1,17 +0,0 @@ ---- -sidebar_position: 50 ---- - -# Helping Others - -A great way to contribute to the project is to help others who are experiencing difficulty. -This is normally reported as a ticket or a message on the Wails slack channel. Even just -clarifying the issue can really help out. Sometimes, when an issue is discussed and gets -resolved, we create a guide out of it to help others who face the same issues. - -To join the Wails slack channel, accept the invite [here](https://gophers.slack.com/join/shared_invite/zt-197vymgt3-sJt4oyakb6nqlVKjXTyeVw#/shared-invite/email) -and join us on the channel by following [this link](https://gophers.slack.com/?redir=%2Fmessages%2FCJ4P9F7MZ%2F). - -:::note -Work In Progress -::: diff --git a/website/versioned_docs/version-v2.0.0-beta.44/contributing/setting-up-a-dev-environment.mdx b/website/versioned_docs/version-v2.0.0-beta.44/contributing/setting-up-a-dev-environment.mdx deleted file mode 100644 index b5cfd8eca..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/contributing/setting-up-a-dev-environment.mdx +++ /dev/null @@ -1,34 +0,0 @@ ---- -sidebar_position: 10 ---- - -# Setting up a Development Environment - -You can set up a development environment by doing the following: - -- Install the latest versions of Go and Git -- `git clone https://github.com/wailsapp/wails` -- `cd wails/v2/cmd/wails` -- `go install` - -NOTE: The directory that you cloned the project into will now be called "clonedir". - -The Wails CLI will now be at the very latest version. - -To update projects to use the latest version, update the project's `go.mod` and -ensure the following line is at the bottom of the file: - -`replace github.com/wailsapp/wails/v2 => ` - -Example: - -On Windows: -`replace github.com/wailsapp/wails/v2 => C:\Users\leaan\Documents\wails-v2-beta\wails\v2` - -On 'nix: -`replace github.com/wailsapp/wails/v2 => /home/me/projects/wails/v2` - -To revert back to a stable version, run: - -`go install github.com/wailsapp/wails/v2/cmd/wails@latest` - diff --git a/website/versioned_docs/version-v2.0.0-beta.44/contributing/testing.mdx b/website/versioned_docs/version-v2.0.0-beta.44/contributing/testing.mdx deleted file mode 100644 index d01204651..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/contributing/testing.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -sidebar_position: 35 ---- - -# Testing - -Testing is vitally important to ensure quality in the project. There are a couple of -scenarios where testing can really help the project: - -- Testing if a bug is reproducible on your local system -- Testing PRs to ensure that they work correctly - -If you chose to test if someone's bug report is reproducible on your local system, then -feel free to add a comment on the ticket confirming this with the output of `wails doctor`. - -To test PRs, choose a PR to test and check if the PR description has the testing scenarios -listed. If not, please ask the person who opened the PR to provide that list. Once you have -determined a valid test scenario, please report your findings on the PR. - -If you ever need more clarity or help on testing, please ask a question in the [Contributing to Wails](https://github.com/wailsapp/wails/discussions/1520) -discussion or on slack. diff --git a/website/versioned_docs/version-v2.0.0-beta.44/contributing/ways-of-contributing.mdx b/website/versioned_docs/version-v2.0.0-beta.44/contributing/ways-of-contributing.mdx deleted file mode 100644 index cfe50b654..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/contributing/ways-of-contributing.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Ways of contributing - -Wails is an open source, community driven project. We welcome anyone to join us in -contributing to the project. This documentation is aimed at anyone wishing to get -familiar with the project and the development processes. - -There are many ways to contribute to the project: - -- Developing new features -- Fixing bugs -- Testing -- Documenting features -- Writing tutorials / guides -- Helping others on the issues + discussions boards - -Guides for these have been created in their own sections. Before getting started, -please introduce yourself in the [Contributing to Wails](https://github.com/wailsapp/wails/discussions/1520) -discussion. \ No newline at end of file diff --git a/website/versioned_docs/version-v2.0.0-beta.44/gettingstarted/_category_.json b/website/versioned_docs/version-v2.0.0-beta.44/gettingstarted/_category_.json deleted file mode 100644 index 597b920df..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/gettingstarted/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Getting Started", - "position": 10 -} diff --git a/website/versioned_docs/version-v2.0.0-beta.44/gettingstarted/building.mdx b/website/versioned_docs/version-v2.0.0-beta.44/gettingstarted/building.mdx deleted file mode 100644 index 73734912e..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/gettingstarted/building.mdx +++ /dev/null @@ -1,19 +0,0 @@ ---- -sidebar_position: 6 ---- - -# Compiling your Project - -From the project directory, run `wails build`. -This will compile your project and save the production-ready binary in the `build/bin` directory. - -If you run the binary, you should see the default application: - -
- -
-
- - -For more details on compilation options, please refer to the [CLI Reference](../reference/cli.mdx#build). - diff --git a/website/versioned_docs/version-v2.0.0-beta.44/gettingstarted/development.mdx b/website/versioned_docs/version-v2.0.0-beta.44/gettingstarted/development.mdx deleted file mode 100644 index 323e90ba9..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/gettingstarted/development.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -sidebar_position: 5 ---- - -# Developing your Application - -You can run your application in development mode by running `wails dev` from your project directory. This will do the following things: - - - Build your application and run it - - Bind your Go code to the frontend so it can be called from Javascript - - Using the power of [vite](https://vitejs.dev/), will watch for modifications in your Go files and rebuild/re-run on change - - Sets up a [webserver](http://localhost:34115) that will serve your application over a browser. This allows you to use your favourite browser extensions. You can even call your Go code from the console - -To get started, run `wails dev` in the project directory. More information on this can be found [here](../reference/cli.mdx#dev). - -Coming soon: Tutorial \ No newline at end of file diff --git a/website/versioned_docs/version-v2.0.0-beta.44/gettingstarted/firstproject.mdx b/website/versioned_docs/version-v2.0.0-beta.44/gettingstarted/firstproject.mdx deleted file mode 100644 index f68643a2f..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/gettingstarted/firstproject.mdx +++ /dev/null @@ -1,125 +0,0 @@ ---- -sidebar_position: 2 ---- - -# Creating a Project - -## Project Generation - -Now that the CLI is installed, you can generate a new project by using the `wails init` command. - -Pick your favourite framework: - - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - - - - Generate a Svelte project using Javascript with:

- - wails init -n myproject -t svelte -If you would rather use Typescript:
- - wails init -n myproject -t svelte-ts -
- - Generate a React project using Javascript with:

- - wails init -n myproject -t react -If you would rather use Typescript:
- - wails init -n myproject -t react-ts -
- - Generate a Vue project using Javascript with:

- - wails init -n myproject -t vue - -If you would rather use Typescript:
- - wails init -n myproject -t vue-ts -
- - Generate a Preact project using Javascript with:

- - wails init -n myproject -t preact - -If you would rather use Typescript:
- - wails init -n myproject -t preact-ts -
- - Generate a Lit project using Javascript with:

- - wails init -n myproject -t lit - -If you would rather use Typescript:
- - wails init -n myproject -t lit-ts -
- - Generate a Vanilla project using Javascript with:

- - wails init -n myproject -t vanilla - -If you would rather use Typescript:
- - wails init -n myproject -t vanilla-ts -
-
- - - -
- -There are also [community templates](../community/templates.mdx) available that offer different capabilities and frameworks. - -To see the other options available, you can run `wails init -help`. -More details can be found in the [CLI Reference](../reference/cli.mdx#init). - -## Project Layout - -Wails projects have the following layout: - -``` -. -├── build/ -│ ├── appicon.png -│ ├── darwin/ -│ └── windows/ -├── frontend/ -├── go.mod -├── go.sum -├── main.go -└── wails.json -``` - -### Project structure rundown - -- `/main.go` - The main application -- `/frontend/` - Frontend project files -- `/build/` - Project build directory -- `/build/appicon.png` - The application icon -- `/build/darwin/` - Mac specific project files -- `/build/windows/` - Windows specific project files -- `/wails.json` - The project configuration -- `/go.mod` - Go module file -- `/go.sum` - Go module checksum file - -The `frontend` directory has nothing specific to Wails and can be any frontend project of your choosing. - -The `build` directory is used during the build process. These files may be updated to customise your builds. If -files are removed from the build directory, default versions will be regenerated. - -The default module name in `go.mod` is "changeme". You should change this to something more appropriate. diff --git a/website/versioned_docs/version-v2.0.0-beta.44/gettingstarted/installation.mdx b/website/versioned_docs/version-v2.0.0-beta.44/gettingstarted/installation.mdx deleted file mode 100644 index c4c7a19bd..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/gettingstarted/installation.mdx +++ /dev/null @@ -1,95 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Installation - -## Supported Platforms - -- Windows 10/11 AMD64/ARM64 -- MacOS 10.13+ AMD64 -- MacOS 11.0+ ARM64 -- Linux AMD64/ARM64 - -## Dependencies - -Wails has a number of common dependencies that are required before installation: - -- Go 1.17+ -- NPM (Node 15+) - -### Go - -Download Go from the [Go Downloads Page](https://go.dev/doc/install). - -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: `echo $PATH | grep go/bin` - -### NPM - -Download NPM 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. - -## Platform Specific Dependencies - -You will also need to install platform specific dependencies: - - - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - - - - Wails requires that the xcode command line tools are installed. This can be done by running:
- xcode-select --install -
- - Wails requires that the WebView2{" "} - runtime is installed. Some Windows installations will already have this installed. You can check using - the{" "} - wails doctor command (see below). - - - Linux required the standard gcc build tools - plus libgtk3 and libwebkit. - Rather than list a ton of commands for different distros, Wails can try to determine - what the installation commands are for your specific distribution. Run wails doctor after - installation - to be shown how to install the dependencies. - If your distro/package manager is not supported, please consult the {" "} - Add Linux Distro guide. - -
- - - -## Optional Dependencies - -- [UPX](https://upx.github.io/) for compressing your applications. - -## Installing Wails - -Run `go install github.com/wailsapp/wails/v2/cmd/wails@latest` to install the Wails CLI. - -## System Check - -Running `wails 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 `wails` command appears to be missing? - -If your system is reporting that the `wails` command is missing, make sure you have followed the Go installation guide -correctly. Normally, it means that the `go/bin` directory in your User's home directory is not in the `PATH` environment -variable. You will also normally need to close and reopen any open command prompts so that changes to the environment -made by the installer are reflected at the command prompt. \ No newline at end of file diff --git a/website/versioned_docs/version-v2.0.0-beta.44/guides/_category_.json b/website/versioned_docs/version-v2.0.0-beta.44/guides/_category_.json deleted file mode 100644 index 5935dad93..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/guides/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Guides", - "position": 50 -} diff --git a/website/versioned_docs/version-v2.0.0-beta.44/guides/application-development.mdx b/website/versioned_docs/version-v2.0.0-beta.44/guides/application-development.mdx deleted file mode 100644 index 13b1b7382..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/guides/application-development.mdx +++ /dev/null @@ -1,231 +0,0 @@ - -# Application Development - -There are no hard and fast rules for developing applications with Wails, but there are some basic guidelines. - -## Application Setup - -The pattern used by the default templates are that `main.go` is used for configuring and running the application, whilst -`app.go` is used for defining the application logic. - -The `app.go` file will define a struct that has 2 methods which act as hooks into the main application: - -```go title="app.go" -type App struct { - ctx context.Context -} - -func NewApp() *App { - return &App{} -} - -func (a *App) startup(ctx context.Context) { - a.ctx = ctx -} - -func (a *App) shutdown(ctx context.Context) { -} -``` - -- The startup method is called as soon as Wails allocates the resources it needs and is a good place for creating resources, - setting up event listeners and anything else the application needs at startup. - It is given a `context.Context` which is usually saved in a struct field. This context is needed for calling the - [runtime](../reference/runtime/intro.mdx). If this method returns an error, the application will terminate. - In dev mode, the error will be output to the console. - -- The shutdown method will be called by Wails right at the end of the shutdown process. This is a good place to deallocate - memory and perform any shutdown tasks. - -The `main.go` file generally consists of a single call to `wails.Run()`, which accepts the application configuration. -The pattern used by the templates is that before the call to `wails.Run()`, an instance of the struct we defined in -`app.go` is created and saved in a variable called `app`. This configuration is where we add our callbacks: - -```go {3,9,10} title="main.go" -func main() { - - app := NewApp() - - err := wails.Run(&options.App{ - Title: "My App", - Width: 800, - Height: 600, - OnStartup: app.startup, - OnShutdown: app.shutdown, - }) - if err != nil { - log.Fatal(err) - } -} - -``` - -More information on application lifecycle hooks can be found [here](../howdoesitwork.mdx#application-lifecycle-callbacks). - -## Binding Methods - -It is likely that you will want to call Go methods from the frontend. This is normally done by adding public methods to -the already defined struct in `app.go`: - -```go {16-18} title="app.go" -type App struct { - ctx context.Context -} - -func NewApp() *App { - return &App{} -} - -func (a *App) startup(ctx context.Context) { - a.ctx = ctx -} - -func (a *App) shutdown(ctx context.Context) { -} - -func (a *App) Greet(name string) string { - return fmt.Sprintf("Hello %s!", name) -} -``` - -In the main application configuration, the `Bind` key is where we can tell Wails what we want to bind: - -```go {11-13} title="main.go" -func main() { - - app := NewApp() - - err := wails.Run(&options.App{ - Title: "My App", - Width: 800, - Height: 600, - OnStartup: app.startup, - OnShutdown: app.shutdown, - Bind: []interface{}{ - app, - }, - }) - if err != nil { - log.Fatal(err) - } -} - -``` - -This will bind all public methods in our `App` struct (it will never bind the startup and shutdown methods). - -### Dealing with context when binding multiple structs - -If you want to bind methods for multiple structs but want each struct to keep a reference to the context so that you -can use the runtime functions, a good pattern is to pass the context from the `OnStartup` method to your struct instances -: - -```go -func main() { - - app := NewApp() - otherStruct := NewOtherStruct() - - err := wails.Run(&options.App{ - Title: "My App", - Width: 800, - Height: 600, - OnStartup: func(ctx context.Context){ - app.SetContext(ctx) - otherStruct.SetContext(ctx) - }, - OnShutdown: app.shutdown, - Bind: []interface{}{ - app, - otherStruct - }, - }) - if err != nil { - log.Fatal(err) - } -} -``` - - - -More information on Binding can be found [here](../howdoesitwork.mdx#method-binding). - -## Application Menu - -Wails supports adding a menu to your application. This is done by passing a [Menu](../reference/menus.mdx#menu) struct -to application config. It's common to use a method that returns a Menu, and even more common for that to be a method on -the `App` struct used for the lifecycle hooks. - -```go {11} title="main.go" -func main() { - - app := NewApp() - - err := wails.Run(&options.App{ - Title: "My App", - Width: 800, - Height: 600, - OnStartup: app.startup, - OnShutdown: app.shutdown, - Menu: app.menu(), - Bind: []interface{}{ - app, - }, - }) - if err != nil { - log.Fatal(err) - } -} - -``` - -## Assets - -The great thing about the way Wails v2 handles assets is that it doesn't! The only thing you need to give Wails is an -`embed.FS`. How you get to that is entirely up to you. You can use vanilla html/css/js files like the vanilla template. -You could have some complicated build system, it doesn't matter. - -When `wails build` is run, it will check the `wails.json` project file at the project root. There are 2 keys in the -project file that are read: - -- "frontend:install" -- "frontend:build" - -The first, if given, will be executed in the `frontend` directory to install the node modules. -The second, if given, will be executed in the `frontend` directory to build the frontend project. - -If these 2 keys aren't given, then Wails does absolutely nothing with the frontend. It is only expecting that `embed.FS`. - -### AssetsHandler - -A Wails v2 app can optionally define a `http.Handler` in the `options.App`, which allows hooking into the AssetServer to -create files on the fly or process POST/PUT requests. -GET requests are always first handled by the `assets` FS. If the FS doesn't find the requested file the request will be -forwarded to the `http.Handler` for serving. Any requests other than GET will be directly processed by the `AssetsHandler` -if specified. -It's also possible to only use the `AssetsHandler` by specifiy `nil` as the `Assets` option. - -## Built in Dev Server - -Running `wails dev` will start the built in dev server which will start a file watcher in your project directory. By -default, if any file changes, wails checks if it was an application file (default: `.go`, configurable with `-e` flag). -If it was, then it will rebuild your application and relaunch it. If the changed file was in the assets, -it will issue a reload after a short amount of time. - -The dev server uses a technique called "debouncing" which means it doesn't reload straight away, -as there may be multiple files changed in a short amount of time. When a trigger occurs, it waits for a set amount of time -before issuing a reload. If another trigger happens, it resets to the wait time again. By default this value is `100ms`. -If this value doesn't work for your project, it can be configured using the `-debounce` flag. If used, this value will -be saved to your project config and become the default. - -## External Dev Server - -Some frameworks come with their own live-reloading server, however they will not be able to take advantage of the Wails -Go bindings. In this scenario, it is best to run a watcher script that rebuilds the project into the build directory, which -Wails will be watching. For an example, see the default svelte template that uses [rollup](https://rollupjs.org/guide/en/). -For [create-react-app](https://create-react-app.dev/), it's possible to use -[this script](https://gist.github.com/int128/e0cdec598c5b3db728ff35758abdbafd) to achieve a similar result. - -## Go Module - -The default Wails templates generate a `go.mod` file that contains the module name "changeme". You should change this -to something more appropriate after project generation. diff --git a/website/versioned_docs/version-v2.0.0-beta.44/guides/bleeding-edge.mdx b/website/versioned_docs/version-v2.0.0-beta.44/guides/bleeding-edge.mdx deleted file mode 100644 index 292b9d523..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/guides/bleeding-edge.mdx +++ /dev/null @@ -1,54 +0,0 @@ - -# Bleeding Edge - -## Overview - -Wails is in constant development and new releases are regularly "tagged". This usually happens when all the newer code -on `master` has been tested and confirmed working. If you need a bugfix or feature that has not yet made it to a release, -it's possible to use the latest "bleeding edge" version using the following steps: - -- `git clone https://github.com/wailsapp/wails` -- `cd wails/v2/cmd/wails` -- `go install` - -NOTE: The directory that you cloned the project into will now be called "clonedir". - -The Wails CLI will now be at the very latest version. To update projects to use the latest version, update the project's -`go.mod` and ensure the following line is at the bottom of the file: - -`replace github.com/wailsapp/wails/v2 => ` - -Example: - -On Windows: -`replace github.com/wailsapp/wails/v2 => C:\Users\leaan\Documents\wails-v2-beta\wails\v2` - -On 'nix: -`replace github.com/wailsapp/wails/v2 => /home/me/projects/wails/v2` - -To revert back to a stable version, run: - -`go install github.com/wailsapp/wails/v2/cmd/wails@latest` - -## Testing a Branch - -If you want to test a branch, follow the instructions above, but ensure you switch the branch you want to test before installing: - -- `git clone https://github.com/wailsapp/wails` -- `cd wails` -- `git checkout -b branch-to-test --track origin/branch-to-test` -- `cd v2/cmd/wails` -- `go install` - -## Testing a PR - -If you want to test a PR, follow the instructions above, but ensure you fetch the PR and switch the branch before installing. -Please replace `[IDofThePR]` with the ID of the PR shown on github.com: - -- `git clone https://github.com/wailsapp/wails` -- `cd wails` -- `git fetch -u origin pull/[IDofThePR]/head:test/pr-[IDofThePR]` -- `git checkout test/pr-[IDofThePR]` -- `git reset --hard HEAD` -- `cd v2/cmd/wails` -- `go install` diff --git a/website/versioned_docs/version-v2.0.0-beta.44/guides/dynamic-assets.mdx b/website/versioned_docs/version-v2.0.0-beta.44/guides/dynamic-assets.mdx deleted file mode 100644 index a8438a397..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/guides/dynamic-assets.mdx +++ /dev/null @@ -1,123 +0,0 @@ -# Dynamic Assets - -If you want to load or generate assets for your frontend dynamically, you can achieve that using the -[AssetsHandler](../reference/options#assetshandler) option. The AssetsHandler is a generic `http.Handler` which will -be called for any non GET request on the assets server and for GET requests which can not be served from the -bundled assets because the file is not found. - -By installing a custom AssetsHandler, you can serve your own assets using a custom asset server. - -## Example - -In our example project, we will create a simple assets handler which will load files off disk: - -```go title=main.go {16-35,49} -package main - -import ( - "embed" - "fmt" - "github.com/wailsapp/wails/v2" - "github.com/wailsapp/wails/v2/pkg/options" - "net/http" - "os" - "strings" -) - -//go:embed frontend/dist -var assets embed.FS - -type FileLoader struct { - http.Handler -} - -func NewFileLoader() *FileLoader { - return &FileLoader{} -} - -func (h *FileLoader) ServeHTTP(res http.ResponseWriter, req *http.Request) { - var err error - requestedFilename := strings.TrimPrefix(req.URL.Path, "/") - println("Requesting file:", requestedFilename) - fileData, err := os.ReadFile(requestedFilename) - if err != nil { - res.WriteHeader(http.StatusBadRequest) - res.Write([]byte(fmt.Sprintf("Could not load file %s", requestedFilename))) - } - - res.Write(fileData) -} - -func main() { - // Create an instance of the app structure - app := NewApp() - - // Create application with options - err := wails.Run(&options.App{ - Title: "helloworld", - Width: 1024, - Height: 768, - Assets: assets, - BackgroundColour: &options.RGBA{R: 27, G: 38, B: 54, A: 255}, - OnStartup: app.startup, - AssetsHandler: NewFileLoader(), - Bind: []interface{}{ - app, - }, - }) - - if err != nil { - println("Error:", err) - } -} -``` - -When we run the application in dev mode using `wails dev`, we will see the following output: - -``` -DEB | [ExternalAssetHandler] Loading 'http://localhost:3001/favicon.ico' -DEB | [ExternalAssetHandler] Loading 'http://localhost:3001/favicon.ico' failed, using AssetHandler -Requesting file: favicon.ico -``` -As you can see, the assets handler is called when the default assets server is unable to serve -the `favicon.ico` file. - -If you right click the main application and select "inspect" to bring up the devtools, you can test -this feature out by typing the following into the console: - -``` -let response = await fetch('does-not-exist.txt'); -``` -This will generate an error in the devtools. We can see that the error is what we expect, returned by -our custom assets handler: - -

- -

- -However, if we request `go.mod`, we will see the following output: - -

- -

- -This technique can be used to load images directly into the page. If we updated our default vanilla template and -replaced the logo image: -```html - -``` -with: -```html - -``` -Then we would see the following: - -

- -

- -:::warning -Exposing your filesystem in this way is a security risk. It is recommended that you properly manage access -to your filesystem. -::: - diff --git a/website/versioned_docs/version-v2.0.0-beta.44/guides/frameless.mdx b/website/versioned_docs/version-v2.0.0-beta.44/guides/frameless.mdx deleted file mode 100644 index 7c22b66d3..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/guides/frameless.mdx +++ /dev/null @@ -1,47 +0,0 @@ - -# Frameless Applications - -Wails supports applications with no frame. This can be achieved by using the [frameless](../reference/options.mdx#frameless) -field in [Application Options](../reference/options.mdx#application-options). - - -:::warning -The `data-wails-drag` attribute is being deprecated in favour of the following CSS style: -`style="--wails-draggable:drag"`. You can use `style="--wails-draggable:no-drag"` to disable the drag behaviour. -For this release only, you can test this by setting the following application option: -```go - Experimental: &options.Experimental{ - UseCSSDrag: true, - }, -``` -::: - -Wails offers a simple solution for dragging the window: Any HTML element that has the attribute "data-wails-drag" will -act as a "drag handle". This property applies to all nested elements. If you need to indicate that a nested element -should not drag, then use the attribute 'data-wails-no-drag' on that element. - -The default vanilla template uses this, even though it is not frameless. The whole `body` element is tagged as draggable. -The `
` is tagged as being not draggable. - -```html - - - - - - - -
- - -
-
- - - - -``` - -:::info Fullscreen - If you allow your application to go fullscreen, this drag functionality will be disabled. -::: diff --git a/website/versioned_docs/version-v2.0.0-beta.44/guides/frontend.mdx b/website/versioned_docs/version-v2.0.0-beta.44/guides/frontend.mdx deleted file mode 100644 index 6c9d0cf27..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/guides/frontend.mdx +++ /dev/null @@ -1,77 +0,0 @@ - -# Frontend - -## Script Injection - -When Wails serves your `index.html`, by default, it will inject 2 script entries into the `` tag to load `/wails/ipc.js` -and `/wails/runtime.js`. These files install the bindings and runtime respectively. - -The code below shows where these are injected by default: - -```html - - - injection example - - - - - - - -
Please enter your name below 👇
-
- - -
- - - - - -``` - -### Overriding Default Script Injection - -To provide more flexibility to developers, there is a meta tag that may be used to customise this behaviour: - -```html - -``` - -The options are as follows: - -| Value | Description | -| -------------------- | ------------------------------------------------- | -| noautoinjectruntime | Disable the autoinjection of `/wails/runtime.js` | -| noautoinjectipc | Disable the autoinjection of `/wails/ipc.js` | -| noautoinject | Disable all autoinjection of scripts | - -Multiple options may be used provided they are comma seperated. - -This code is perfectly valid and operates the same as the autoinjection version: - -```html - - - - injection example - - - - - - -
Please enter your name below 👇
-
- - -
- - - - - - - -``` \ No newline at end of file diff --git a/website/versioned_docs/version-v2.0.0-beta.44/guides/ides.mdx b/website/versioned_docs/version-v2.0.0-beta.44/guides/ides.mdx deleted file mode 100644 index 46f0268ff..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/guides/ides.mdx +++ /dev/null @@ -1,114 +0,0 @@ -# IDEs - -Wails aims to provide a great development experience. To that aim, we now support generating IDE specific configuration -to provide smoother project setup. - -Currently, we support [Visual Studio Code](https://code.visualstudio.com/) but aim to support other IDEs such as Goland. - -## Visual Studio Code - -

- -

- -When generating a project using the `-ide vscode` flags, IDE files will be created alongside the other project files. -These files are placed into the `.vscode` directory and provide the correct configuration for debugging your application. - -The 2 files generated are `tasks.json` and `launch.json`. Below are the files generated for the default vanilla project: - -```json title="tasks.json" -{ - "version": "2.0.0", - "tasks": [ - { - "label": "build", - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "command": "go", - "args": ["build", "-tags", "dev", "-gcflags", "all=-N -l", "-o", "build/bin/myproject.exe"] - }, - ] -} -``` - -```json title="launch.json" -{ - "version": "0.2.0", - "configurations": [ - { - "name": "Wails: Debug myproject", - "type": "go", - "request": "launch", - "mode": "exec", - "program": "${workspaceFolder}/build/bin/myproject.exe", - "preLaunchTask": "build", - "cwd": "${workspaceFolder}", - "env": {} - }, - ] -} -``` - -### Configuring the install and build steps - -The `tasks.json` file is simple for the default project as there is no `npm install` or `npm run build` step needed. -For projects that have a frontend build step, such as the svelte template, we would need to edit `tasks.json` to -add the install and build steps: - -```json title="tasks.json" -{ - "version": "2.0.0", - "tasks": [ - { - "label": "npm install", - "type": "npm", - "script": "install", - "options": { - "cwd": "${workspaceFolder}/frontend" - }, - "presentation": { - "clear": true, - "panel": "shared", - "showReuseMessage": false - }, - "problemMatcher": [] - }, - { - "label": "npm run build", - "type": "npm", - "script": "build", - "options": { - "cwd": "${workspaceFolder}/frontend" - }, - "presentation": { - "clear": true, - "panel": "shared", - "showReuseMessage": false - }, - "problemMatcher": [] - }, - { - "label": "build", - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "command": "go", - "args": ["build", "-tags", "dev", "-gcflags", "all=-N -l", "-o", "build/bin/vscode.exe"], - "dependsOn":[ - "npm install", - "npm run build" - ] - - }, - ] -} -``` - -:::info Future Enhancement - -In the future, we hope to generate a `tasks.json` that includes the install and build steps automatically. - -::: \ No newline at end of file diff --git a/website/versioned_docs/version-v2.0.0-beta.44/guides/linux-distro-support.mdx b/website/versioned_docs/version-v2.0.0-beta.44/guides/linux-distro-support.mdx deleted file mode 100644 index db9dde55a..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/guides/linux-distro-support.mdx +++ /dev/null @@ -1,108 +0,0 @@ - -# Linux Distro Support - -## Overview - -Wails offers Linux support but providing installation instructions for all available distributions is an impossible task. -Instead, Wails tries to determine if the packages you need to develop applications are available via your system's package -manager. Currently, we support the following package managers: - -- apt -- dnf -- emerge -- eopkg -- nixpkgs -- pacman -- zypper - -## Adding package names - -There may be circumstances where your distro uses one of the supported package managers but the package name -is different. For example, you may use an Ubuntu derivative, but the package name for gtk may be different. Wails -attempts to find the correct package by iterating through a list of package names. -The list of packages are stored in the packagemanager specific file in the `v2/internal/system/packagemanager` -directory. In our example, this would be `v2/internal/system/packagemanager/apt.go`. - -In this file, the list of packages are defined by the `Packages()` method: - -```go -func (a *Apt) Packages() packagemap { - return packagemap{ - "libgtk-3": []*Package{ - {Name: "libgtk-3-dev", SystemPackage: true, Library: true}, - }, - "libwebkit": []*Package{ - {Name: "libwebkit2gtk-4.0-dev", SystemPackage: true, Library: true}, - }, - "gcc": []*Package{ - {Name: "build-essential", SystemPackage: true}, - }, - "pkg-config": []*Package{ - {Name: "pkg-config", SystemPackage: true}, - }, - "npm": []*Package{ - {Name: "npm", SystemPackage: true}, - }, - "docker": []*Package{ - {Name: "docker.io", SystemPackage: true, Optional: true}, - }, - } -} -``` - -Let's assume that in our linux distro, `libgtk-3` is packaged under the name `lib-gtk3-dev`. -We could add support for this by adding the following line: - -```go {5} -func (a *Apt) Packages() packagemap { - return packagemap{ - "libgtk-3": []*Package{ - {Name: "libgtk-3-dev", SystemPackage: true, Library: true}, - {Name: "lib-gtk3-dev", SystemPackage: true, Library: true}, - }, - "libwebkit": []*Package{ - {Name: "libwebkit2gtk-4.0-dev", SystemPackage: true, Library: true}, - }, - "gcc": []*Package{ - {Name: "build-essential", SystemPackage: true}, - }, - "pkg-config": []*Package{ - {Name: "pkg-config", SystemPackage: true}, - }, - "npm": []*Package{ - {Name: "npm", SystemPackage: true}, - }, - "docker": []*Package{ - {Name: "docker.io", SystemPackage: true, Optional: true}, - }, - } -} -``` - -## Adding new package managers - -To add a new package manager, perform the following steps: - -- Create a new file in `v2/internal/system/packagemanager` called `.go`, where `` is the name of the package manager. -- Define a struct that conforms to the package manager interface defined in `pm.go`: - -```go -type PackageManager interface { - Name() string - Packages() packagemap - PackageInstalled(*Package) (bool, error) - PackageAvailable(*Package) (bool, error) - InstallCommand(*Package) string -} -``` -- `Name()` should return the name of the package manager -- `Packages()` should return a `packagemap`, that provides candidate filenames for dependencies -- `PackageInstalled()` should return `true` if the given package is installed -- `PackageAvailable()` should return `true` if the given package is not installed but available for installation -- `InstallCommand()` should return the exact command to install the given package name - -Take a look at the other package managers code to get an idea how this works. - -:::info Remember -If you add support for a new package manager, don't forget to also update this page! -::: \ No newline at end of file diff --git a/website/versioned_docs/version-v2.0.0-beta.44/guides/linux.mdx b/website/versioned_docs/version-v2.0.0-beta.44/guides/linux.mdx deleted file mode 100644 index c23c0f348..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/guides/linux.mdx +++ /dev/null @@ -1,20 +0,0 @@ - -# Linux - -This page has miscellaneous guides related to developing Wails applications for Linux. - -## Video tag doesn't fire "ended" event - -When using a video tag, the "ended" event is not fired when the video is finished playing. This is a bug -in WebkitGTK, however you can use the following workaround to fix it: - -```js -videoTag.addEventListener("timeupdate", (event) => { - if(event.target.duration - event.target.currentTime < 0.2) { - let ended = new Event("ended"); - event.target.dispatchEvent(ended); - } -}) -``` -Source: [Lyimmi](https://github.com/Lyimmi) on the -[discussions board](https://github.com/wailsapp/wails/issues/1729#issuecomment-1212291275) \ No newline at end of file diff --git a/website/versioned_docs/version-v2.0.0-beta.44/guides/manual-builds.mdx b/website/versioned_docs/version-v2.0.0-beta.44/guides/manual-builds.mdx deleted file mode 100644 index e3be40d0b..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/guides/manual-builds.mdx +++ /dev/null @@ -1,99 +0,0 @@ - -# Manual Builds - -The Wails CLI does a lot of heavy lifting for the project, but sometimes it's desirable to manually build your project. -This document will discuss the different operations the CLI does and how this may be achieved in different ways. - -## Build Process - -When either `wails build` or `wails dev` are used, the Wails CLI performs a common build process: - - - Install frontend dependencies - - Build frontend project - - Generate build assets - - Compile application - - [optional] Compress application - -### Install frontend dependencies - -#### CLI Steps - -- If the `-s` flag is given, this step is skipped -- Checks `wails.json` to see if there is an install command in the key `frontend:install` -- If there isn't, it skips this step -- If there is, it checks if `package.json` exists in the frontend directory. If it doesn't exist, it skips this step -- An MD5 sum is generated from the `package.json` file contents -- It checks for the existence of `package.json.md5` and if it exists, will compare the contents of it (an MD5 sum) - with the one generated to see if the contents have changed. If they are the same, this step is skipped -- If `package.json.md5` does not exist, it creates it using the generated MD5 sum -- If a build is now required, or `node_modules` does not exist, or the `-f` flag is given, the install command is - executed in the frontend directory - -#### Manual Steps - -This step could be done from the command line or a script with `npm install`. - -### Build frontend project - -#### Wails CLI - -- If the `-s` flag is given, this step is skipped -- Checks `wails.json` to see if there is a build command in the key `frontend:build` -- If there isn't, it skips this step -- If there is, it is executed in the frontend directory - -#### Manual Steps - -This step could be done from the command line or a script with `npm run build` or whatever the frontend build script is. - -### Generate assets - -#### Wails CLI - -- If `-nopackage` flag is set, this stage is skipped -- If the `build/appicon.png` file does not exist, a default one is created -- For Windows, see [Bundling for Windows](#windows) -- If `build/windows/icon.ico` does not exist, it will create it from the `build/appicon.png` image. - -##### Windows - -- If `build/windows/icon.ico` does not exist, it will create it from `build/appicon.png` using icon sizes of 256, 128, 64, 48, 32 and 16. This is done using [winicon](https://github.com/leaanthony/winicon). -- If the `build/windows/.manifest` file does not exist, it creates it from a default version. -- Compiles the application as a production build (above) -- Uses [winres](https://github.com/tc-hib/winres) to bundle the icon and manifest into a `.syso` file ready for linking. - -#### Manual Steps - -- Create `icon.ico` using the [winicon](https://github.com/leaanthony/winicon) CLI tool (or any other tool). -- Create / Update a `.manifest` file for your application -- Use the [winres CLI](https://github.com/tc-hib/go-winres) to generate a `.syso` file. - -### Compile application - -#### Wails CLI - -- If the `-clean` flag is provided, the `build` directory is deleted and recreated -- For `wails dev`, the following default Go flags are used: `-tags dev -gcflags "all=-N -l"` -- For `wails build`, the following default Go flags are used: `-tags desktop,production -ldflags "-w -s"` - - On Windows, `-ldflags "-w -h -H windowsgui"` -- Additional tags passed to the CLI using `-tags` are added to the defaults -- Additional ldflags passed to the CLI using `-ldflags` are added to the defaults -- The `-o` flag is passed through -- The Go compiler specified by `-compiler` will be used for compilation - -#### Manual steps - -- For dev build, the minimum command would be: `go build -tags dev -gcflags "all=-N -l"` -- For production build, the minimum command would be: `go build -tags desktop,production -ldflags "-w -s -H windowsgui"` -- Ensure that you compile in the same directory as the `.syso` file - -### Compress application - -#### Wails CLI - -- If the `-upx` flag has been given, the `upx` program will be run to compress the application with the default settings -- If `-upxflags` is also passed, these flags are used instead of the default ones - -#### Manual steps - -- Run `upx [flags]` manually to compress the application. diff --git a/website/versioned_docs/version-v2.0.0-beta.44/guides/migrating.mdx b/website/versioned_docs/version-v2.0.0-beta.44/guides/migrating.mdx deleted file mode 100644 index 1474131f8..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/guides/migrating.mdx +++ /dev/null @@ -1,206 +0,0 @@ - -# Migrating from v1 - -## Overview - -Wails v2 is a significant change from v1. This document aims to highlight the changes and the steps in migrating an existing project. - -### Creating the Application - -In v1, the main application is created using `wails.CreateApp`, bindings are added with `app.Bind`, then the -application is run using `app.Run()`. - -Example: - -```go title="v1" - app := wails.CreateApp(&wails.AppConfig{ - Title: "MyApp", - Width: 1024, - Height: 768, - JS: js, - CSS: css, - Colour: "#131313", - }) - app.Bind(basic) - app.Run() -``` - -In v2, there is just a single method, `wails.Run()`, that accepts [application options](../reference/options.mdx#application-options). - -```go title="v2" - err := wails.Run(&options.App{ - Title: "MyApp", - Width: 800, - Height: 600, - Assets: assets, - Bind: []interface{}{ - basic, - }, - }) -``` - -### Binding - -In v1, it was possible to bind both arbitrary functions and structs. In v2, this has been simplified to only binding structs. -The struct instances that were previously passed to the `Bind()` method in v1, are now specified in the `Bind` field of -the [application options](../reference/options.mdx#application-options): - -```go title="v1" - app := wails.CreateApp(/* options */) - app.Bind(basic) -``` - -```go title="v2" - err := wails.Run(&options.App{ - /* other options */ - Bind: []interface{}{ - basic, - }, - }) -``` - -In v1, bound methods were available to the frontend at `window.backend`. This has changed to `window.go`.`` - -### Application Lifecycle - -In v1, there were 2 special methods in a bound struct: `WailsInit()` and `WailsShutdown()`. These have -been replaced with 3 lifecycle hooks as part of the [application options](../reference/options.mdx#application-options): - -- [OnStartup](../reference/options.mdx#onstartup) -- [OnShutdown](../reference/options.mdx#onshutdown) -- [OnDomReady](../reference/options.mdx#ondomready) - -Note: [OnDomReady](../reference/options.mdx#ondomready) replaces the `wails:ready` system event in v1. - -These methods can be standard functions, but a common practice is to have them part of a struct: - -```go title="v2" - basic := NewBasicApp() - err := wails.Run(&options.App{ - /* Other Options */ - OnStartup: basic.startup, - OnShutdown: basic.shutdown, - OnDomReady: basic.domready, - }) -... -type Basic struct { - ctx context.Context -} -func (b *Basic) startup(ctx context.Context) { - b.ctx = ctx -} -... -``` - -### Runtime - -The runtime in v2 is much richer than v1 with support for menus, window manipulation -and better dialogs. The signature of the methods has changed slightly - please refer -the the [Runtime Reference](../reference/runtime/intro.mdx). - -In v1, the [runtime](../reference/runtime/intro.mdx) was available via a struct passed to `WailsInit()`. -In v2, the runtime has been moved out to its own package. Each method in the runtime takes the -`context.Context` that is passed to the [OnStartup](../reference/options.mdx#onstartup) method. - -```go title="Runtime Example" -package main - -import "github.com/wailsapp/wails/v2/pkg/runtime" - -type Basic struct { - ctx context.Context -} - -// startup is called at application startup -func (a *App) startup(ctx context.Context) { - a.ctx = ctx - runtime.LogInfo(ctx, "Application Startup called!") -} - -``` - -### Assets - -The _biggest_ change in v2 is how assets are handled. - -In v1, assets were passed via 2 application options: - -- `JS` - The application's Javascript -- `CSS` - The application's CSS - -This meant that the responsibility of generating a single JS and CSS file was on the -developer. This essentially required the use of complicated packers such as webpack. - -In v2, Wails makes no assumptions about your frontend assets, just like a webserver. -All of your application assets are passed to the application options as an `embed.FS`. - -**This means there is no requirement to bundle your assets, encode images as Base64 or -attempt the dark art of bundler configuration to use custom fonts**. - -At startup, Wails -will scan the given `embed.FS` for `index.html` and use its location as the root path -for all the other application assets - just like a webserver would. - -Example: An application has the following project layout. All final assets are placed in the -`frontend/dist` directory: - -```shell -. -├── build/ -├── frontend/ -│ └── dist/ -│ ├── index.html -│ ├── main.js -│ ├── main.css -│ └── logo.svg -├── main.go -└── wails.json -``` - -Those assets may be used by the application by simply creating an `embed.FS`: - -```go title="Assets Example" -//go:embed frontend/dist -var assets embed.FS - -func main() { - err := wails.Run(&options.App{ - /* Other Options */ - Assets: assets, - }) -} -``` - -Of course, bundlers can be used if you wish to. The only requirement is to pass -the final application assets directory to Wails using an `embed.FS` in the `Assets` -key of the [application options](../reference/options.mdx#application-options). - -### Project Configuration - -In v1, the project configuration was stored in the `project.json` file in the project root. -In v2, the project configuration is stored in the `wails.json` file in the project root. - -The format of the file is slightly different. Here is a comparison: - -

- -| v1 | v2 | Notes | -| ------------------ | ---------------- | --------------------------------------------------- | -| name | name | | -| description | | Removed | -| author / name | author / name | | -| author / email | author / email | | -| version | version | | -| binaryname | outputfilename | Changed | -| frontend / dir | | Removed | -| frontend / install | frontend:install | Changed | -| frontend / build | frontend:build | Changed | -| frontend / bridge | | Removed | -| frontend / serve | | Removed | -| tags | | Removed | -| | wailsjsdir | The directory to generate wailsjs modules | -| | assetdir | The directory of the compiled frontend assets for `dev` mode. This is normally inferred and could be left empty. | -| | reloaddirs | Comma separated list of additional directories to watch for changes and to trigger reloads in `dev` mode. This is only needed for some more advanced asset configurations. | - -

- diff --git a/website/versioned_docs/version-v2.0.0-beta.44/guides/mouse-buttons.mdx b/website/versioned_docs/version-v2.0.0-beta.44/guides/mouse-buttons.mdx deleted file mode 100644 index 0a3a45740..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/guides/mouse-buttons.mdx +++ /dev/null @@ -1,28 +0,0 @@ -# Mouse Buttons - -The Wails runtime intercepts mouse clicks to determine whether a frameless window needs resizing or a window needs to be moved. -It has been asked how to detect when a mouse click has occurred, because `window.onclick` doesn't report the mouse buttons correctly. -The following code shows how to detect mouse clicks: - -```javascript - -window.addEventListener('mousedown', handleMouseButtonDown); - -function handleMouseButtonDown(event) { - if (event.button === 0) { - // left mouse button - } else if (event.button === 1) { - // middle mouse button - } else if (event.button === 2) { - // right mouse button - } else if (event.button === 3) { - // back mouse button - } else if (event.button === 4) { - // forward mouse button - } else { - // other mouse button - } -} - -``` -Reference: https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button diff --git a/website/versioned_docs/version-v2.0.0-beta.44/guides/overscroll.mdx b/website/versioned_docs/version-v2.0.0-beta.44/guides/overscroll.mdx deleted file mode 100644 index bbe593bc7..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/guides/overscroll.mdx +++ /dev/null @@ -1,11 +0,0 @@ - -# Overscroll - -[Overscroll](https://developer.mozilla.org/en-US/docs/Web/CSS/overscroll-behavior) is the "bounce effect" you sometimes -get when you scroll beyond a page's content boundaries. This is common in mobile apps. This can be disabled using CSS: - -```css -body { - overscroll-behavior: none; -} -``` \ No newline at end of file diff --git a/website/versioned_docs/version-v2.0.0-beta.44/guides/routing.mdx b/website/versioned_docs/version-v2.0.0-beta.44/guides/routing.mdx deleted file mode 100644 index bdcd49b24..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/guides/routing.mdx +++ /dev/null @@ -1,47 +0,0 @@ - -# Routing - -Routing is a popular way to switch views in an application. This page offers some guidance around how to do that. - -## Vue - -The recommended approach for routing in Vue is [Hash Mode](https://next.router.vuejs.org/guide/essentials/history-mode.html#hash-mode): - -```js -import { createRouter, createWebHashHistory } from 'vue-router' - -const router = createRouter({ - history: createWebHashHistory(), - routes: [ - //... - ], -}) -``` - -## Angular - -The recommended approach for routing in Angular is [HashLocationStrategy](https://codecraft.tv/courses/angular/routing/routing-strategies#_hashlocationstrategy): - -```ts -RouterModule.forRoot(routes, {useHash: true}) -``` - -## React - -The recommended approach for routing in React is [HashRouter](https://reactrouter.com/docs/en/v6/routers/hash-router): - -```jsx -import { HashRouter } from "react-router-dom"; - -ReactDOM.render( - - {/* The rest of your app goes here */} - - } exact /> - } /> - } /> - {/* more... */} - - , - root); -``` diff --git a/website/versioned_docs/version-v2.0.0-beta.44/guides/signing.mdx b/website/versioned_docs/version-v2.0.0-beta.44/guides/signing.mdx deleted file mode 100644 index 3da981dfa..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/guides/signing.mdx +++ /dev/null @@ -1,386 +0,0 @@ -# Code Signing - -This is a guide on how you can sign your binaries generated with Wails on MacOS and Windows. -The guide will target CI environments, more specifically GitHub Actions. - -## Windows -First off you need a code signing certificate. If you do not already have one, Microsoft's -info page lists some providers [here](https://docs.microsoft.com/en-us/windows-hardware/drivers/dashboard/get-a-code-signing-certificate). -Please note that an EV certificate is not required unless you need to write kernel-level -software such as device drivers. For signing your Wails app, a standard code signing -certificate will do just fine. - -It may be a good idea to check with your certificate provider -how to sign your binaries on your local machine before targeting automated build systems, just so you know if there -are any special requirements. For instance, [here](https://www.ssl.com/how-to/using-your-code-signing-certificate/) is SSL.com's code signing guide for Windows. -If you know how to sign locally, it will be easier to -troubleshoot any potential issues in a CI environment. -For instance, SSL.com code signing certificates require the `/tr` flag for [SignTool.exe](https://docs.microsoft.com/en-us/windows/win32/seccrypto/signtool) -while other providers may only need the `/t` flag for providing the timestamping server. Popular GitHub Actions for signing -Windows binaries like [this one](https://github.com/Dana-Prajea/code-sign-action) does not support the `/tr` flag on SignTool.exe. -Therefore this guide will focus on signing our app manually with PowerShell commands, but you can use actions like the [code-sign-action](https://github.com/Dana-Prajea/code-sign-action) -Action if you prefer. - -First off, let's make sure we are able to build our Wails app in our GitHub CI. Here is a small workflow template: -```yaml -name: "example" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -jobs: - package: - strategy: - matrix: - platform: [ windows-latest, macos-latest ] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend manually here, unless you have configured frontend build and install commands in wails.json. - - name: Get Wails - run: go install github.com/wailsapp/wails/v2/cmd/wails@latest - - name: Build Wails app - run: | - wails build - - name: upload artifacts macOS - if: matrix.platform == 'macos-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-macos - path: build/bin/* - - name: upload artifacts windows - if: matrix.platform == 'windows-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-windows - path: build/bin/* -``` - -Next we need to give the GitHub workflow access to our signing certificate. This is done by encoding your .pfx or .p12 certificate -into a base64 string. To do this in PowerShell, you can use the following command assuming your certificate is called 'my-cert.p12': -```PowerShell -certutil -encode .\my-cert.p12 my-cert-base64.txt -``` - -You should now have your .txt file with the base64 encoded certificate. It should start with *-----BEGIN CERTIFICATE-----* and -end with *-----END CERTIFICATE-----*. Now you need to make two action secrets on GitHub. Navigate to *Settings -> Secrets -> Actions* and create the -two following secrets: -* **WIN_SIGNING_CERT** with the contents of your base64 encoded certificate text. -* **WIN_SIGNING_CERT_PASSWORD** with the contents of your certificate password. - -Now we're ready to implement the signing in our workflow using one of the two methods: - -### Method 1: signing with commands -This method uses PowerShell commands to sign our app, and leaves you control over the entire signing process. - -After the `"Build Wails app"` step, we can add the following step to our workflow: -```yaml -- name: Sign Windows binaries - if: matrix.platform == 'windows-latest' - run: | - echo "Creating certificate file" - New-Item -ItemType directory -Path certificate - Set-Content -Path certificate\certificate.txt -Value '${{ secrets.WIN_SIGNING_CERT }}' - certutil -decode certificate\certificate.txt certificate\certificate.pfx - echo "Signing our binaries" - & 'C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe' sign /fd /t /f certificate\certificate.pfx /p '${{ secrets.WIN_SIGNING_CERT_PASSWORD }}' - -``` -This script creates a new directory for your certificate file, creates the certificate file from our base64 secret, converts it to a .pfx file, -and finally signs the binary. The following variables needs to be replaced in the last line: -* **signing algorithm**: usually sha256. -* **timestamping server**: URL to the timestamping server to use with your certificate. -* **path to binary**: path to the binary you want to sign. - -Given that our Wails config has `outputfilename` set to "app.exe" and that we have a certificate from SSL.com, this would be our workflow: -```yaml -name: "example" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -jobs: - package: - strategy: - matrix: - platform: [ windows-latest, macos-latest ] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend here, unless you have configured frontend build and install commands in wails.json. - - name: Get Wails - run: go install github.com/wailsapp/wails/v2/cmd/wails@latest - - name: Build Wails app - run: | - wails build - - name: Sign Windows binaries - if: matrix.platform == 'windows-latest' - run: | - echo "Creating certificate file" - New-Item -ItemType directory -Path certificate - Set-Content -Path certificate\certificate.txt -Value '${{ secrets.WIN_SIGNING_CERT }}' - certutil -decode certificate\certificate.txt certificate\certificate.pfx - echo "Signing our binaries" - & 'C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe' sign /fd sha256 /tr http://ts.ssl.com /f certificate\certificate.pfx /p '${{ secrets.WIN_SIGNING_CERT_PASSWORD }}' .\build\bin\app.exe - - - name: upload artifacts macOS - if: matrix.platform == 'macos-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-macos - path: build/bin/* - - name: upload artifacts windows - if: matrix.platform == 'windows-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-windows - path: build/bin/* -``` - -### Method 2: automatically signing with Action -It is possible to use a Windows code signing Action like [this](https://github.com/marketplace/actions/code-sign-a-file-with-pfx-certificate) one, -but note it requires a SHA1 hash for the certificate and a certificate name. View an example of how to configure it on the Action's [marketplace](https://github.com/marketplace/actions/code-sign-a-file-with-pfx-certificate). - ---- - -## MacOS - -First off you need your code signing certificate from Apple. If you do not have one, a simple Google search will help you acquire one. -Once you have your certificate, you need to export it and encode it to base64. [This tutorial](https://localazy.com/blog/how-to-automatically-sign-macos-apps-using-github-actions) -shows you how to do that in an easy manner. Once you have exported your .p12 certificate file, you can encode it to base64 as seen in the tutorial with the following command: -```bash -base64 Certificates.p12 | pbcopy -``` - -Now you're ready to create some GitHub project secrets, just as with Windows: -* **APPLE_DEVELOPER_CERTIFICATE_P12_BASE64** with the contents of your newly copied base64 certificate. -* **APPLE_DEVELOPER_CERTIFICATE_PASSWORD** with the contents of your certificate password. -* **APPLE_PASSWORD** with the contents of an App-Specific password to your Apple-ID account which you can generate [here](https://appleid.apple.com/account/manage). - -Let's make sure we are able to build our Wails app in our GitHub Action workflow. Here is a small template: - -```yaml -name: "example" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -jobs: - package: - strategy: - matrix: - platform: [ windows-latest, macos-latest ] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend here, unless you have configured frontend build and install commands in wails.json. - - name: Get Wails - run: go install github.com/wailsapp/wails/v2/cmd/wails@latest - - name: Build Wails app - run: | - wails build - - name: upload artifacts macOS - if: matrix.platform == 'macos-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-macos - path: build/bin/* - - name: upload artifacts windows - if: matrix.platform == 'windows-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-windows - path: build/bin/* -``` - -For code signing on macOS, [gon](https://github.com/mitchellh/gon) is a very handy tool for code signing and communicating with Apple servers, also written in Go, and -will be used in this guide. - -After the `Build Wails app` step, add the following to the workflow: -```yaml -- name: MacOS download gon for code signing and app notarization - if: matrix.platform == 'macos-latest' - run: | - brew install mitchellh/gon/gon -``` - -Now we need to configure some gon config files in our `build/darwin` directory: - -1. gon-sign.json: - ```json - { - "source" : ["./build/bin/app.app"], - "bundle_id" : "app.myapp", - "apple_id": { - "username": "my-appleid@email.com", - "password": "@env:APPLE_PASSWORD" - }, - "sign" :{ - "application_identity" : "Developer ID Application: My Name" - } - } - ``` - Where `source` is your Wails binary, `bundle_id` is your bundle ID, `apple_id` contains your Apple ID username and App-Specific password - which you created earlier, and `sign.application_identity` is your identity which you can find by running the following command: - ```bash - security find-identity -v -p codesigning - ``` -2. entitlements.plist: - ```plist - - - - - com.apple.security.app-sandbox - - com.apple.security.network.client - - com.apple.security.network.server - - com.apple.security.files.user-selected.read-write - - com.apple.security.files.downloads.read-write - - - - ``` - In this file you configure the entitlements you need for you app, e.g. camera permissions if your app uses the camera. Read more about entitlements [here](https://developer.apple.com/documentation/bundleresources/entitlements). - -Make sure you have updated your `Info.plist` file with the same bundle ID as you entered in `gon-sign.json`. -Here's an example `Info.plist` file: -```plist - - - CFBundlePackageTypeAPPL - CFBundleNameMyApp - CFBundleExecutableapp - CFBundleIdentifierapp.myapp - CFBundleVersion0.1.0 - CFBundleGetInfoStringMy app is cool and nice and chill and - CFBundleShortVersionString0.1.0 - CFBundleIconFileiconfile - LSMinimumSystemVersion10.13.0 - NSHighResolutionCapabletrue - LSApplicationCategoryTypepublic.app-category.utilities - NSHumanReadableCopyright© Me - -``` - -Now we're ready to add the signing step in our workflow after building the Wails app: -```yaml -- name: Import Code-Signing Certificates for macOS - if: matrix.platform == 'macos-latest' - uses: Apple-Actions/import-codesign-certs@v1 - with: - # The certificates in a PKCS12 file encoded as a base64 string - p12-file-base64: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_P12_BASE64 }} - # The password used to import the PKCS12 file. - p12-password: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_PASSWORD }} -- name: Sign our macOS binary - if: matrix.platform == 'macos-latest' - run: | - echo "Signing Package" - gon -log-level=info ./build/darwin/gon-sign.json -``` -Please note that signing binaries with Apple could take anywhere from minutes to hours. - -## Combined workflow file: -Here is our GitHub workflow file with Windows + macOS combined: -```yaml -name: "example combined" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -jobs: - package: - strategy: - matrix: - platform: [ windows-latest, macos-latest ] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend here, unless you have configured frontend build and install commands in wails.json. - - name: Get Wails - run: go install github.com/wailsapp/wails/v2/cmd/wails@latest - - name: Build Wails app - run: | - wails build - - name: MacOS download gon for code signing and app notarization - if: matrix.platform == 'macos-latest' - run: | - brew install mitchellh/gon/gon - - name: Import Code-Signing Certificates for macOS - if: matrix.platform == 'macos-latest' - uses: Apple-Actions/import-codesign-certs@v1 - with: - # The certificates in a PKCS12 file encoded as a base64 string - p12-file-base64: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_P12_BASE64 }} - # The password used to import the PKCS12 file. - p12-password: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_PASSWORD }} - - name: Sign our macOS binary - if: matrix.platform == 'macos-latest' - run: | - echo "Signing Package" - gon -log-level=info ./build/darwin/gon-sign.json - - name: Sign Windows binaries - if: matrix.platform == 'windows-latest' - run: | - echo "Creating certificate file" - New-Item -ItemType directory -Path certificate - Set-Content -Path certificate\certificate.txt -Value '${{ secrets.WIN_SIGNING_CERT }}' - certutil -decode certificate\certificate.txt certificate\certificate.pfx - echo "Signing our binaries" - & 'C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe' sign /fd sha256 /tr http://ts.ssl.com /f certificate\certificate.pfx /p '${{ secrets.WIN_SIGNING_CERT_PASSWORD }}' .\build\bin\Monitor.exe - - name: upload artifacts macOS - if: matrix.platform == 'macos-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-macos - path: build/bin/* - - name: upload artifacts windows - if: matrix.platform == 'windows-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-windows - path: build/bin/* -``` - -# End notes -This guide inspired by the RiftShare project and its workflow, which is highly recommended to check out [here](https://github.com/achhabra2/riftshare/blob/main/.github/workflows/build.yaml). \ No newline at end of file diff --git a/website/versioned_docs/version-v2.0.0-beta.44/guides/templates.mdx b/website/versioned_docs/version-v2.0.0-beta.44/guides/templates.mdx deleted file mode 100644 index 090cf8a9e..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/guides/templates.mdx +++ /dev/null @@ -1,95 +0,0 @@ - -# Templates - -Wails generates projects from pre-created templates. In v1, this was a difficult to maintain set of projects that were -subject to going out of date. In v2, to empower the community, a couple of new features have been added for templates: - -- Ability to generate projects from [Remote Templates](../reference/cli.mdx#remote-templates) -- Tooling to help create your own templates - -## Creating Templates - -To create a template, you can use the `wails generate template` command. To generate a default template, run: - -`wails generate template -name mytemplate ` - -This creates the directory "mytemplate" with default files: - -```shell title=mytemplate/ -. -|-- NEXTSTEPS.md -|-- README.md -|-- app.tmpl.go -|-- frontend -| `-- dist -| |-- assets -| | |-- fonts -| | | |-- OFL.txt -| | | `-- nunito-v16-latin-regular.woff2 -| | `-- images -| | `-- logo-dark.svg -| |-- index.html -| |-- main.css -| `-- main.js -|-- go.mod.tmpl -|-- main.tmpl.go -|-- template.json -`-- wails.tmpl.json -``` - -### Template Overview - -The default template consists of the following files and directories: - -| Filename / Dir | Description | -| --------------- | -------------------------------------------- | -| NEXTSTEPS.md | Instructions on how to complete the template | -| README.md | The README published with the template | -| app.tmpl.go | `app.go` template file | -| frontend/ | The directory containing frontend assets | -| go.mod.tmpl | `go.mod` template file | -| main.tmpl.go | `main.go` template file | -| template.json | The template metadata | -| wails.tmpl.json | `wails.json` template file | - -At this point it is advisable to follow the steps in `NEXTSTEPS.md`. - -## Creating a Template from an Existing Project - -It's possible to create a template from an existing frontend project by passing the path to the project when generating -the template. We will now walk through how to create a Vue 3 template: - -- Install the vue cli: `npm install -g @vue/cli` -- Create the default project: `vue create vue3-base` - - Select `Default (Vue 3) ([Vue 3] babel, eslint)` -- After the project has been generated, run: - -```shell -> wails generate template -name wails-vue3-template -frontend .\vue3-base\ -Extracting base template files... -Migrating existing project files to frontend directory... -Updating package.json data... -Renaming package.json -> package.tmpl.json... -Updating package-lock.json data... -Renaming package-lock.json -> package-lock.tmpl.json... -``` - -- The template may now be customised as specified in the `NEXTSTEPS.md` file -- Once the files are ready, it can be tested by running: `wails init -n my-vue3-project -t .\wails-vue3-template\` -- To test the new project, run: `cd my-vue3-project` then `wails build` -- Once the project has compiled, run it: `.\build\bin\my-vue3-project.exe` -- You should have a fully functioning Vue3 application: - -
- -
- -## Publishing Templates - -Publishing a template is simply pushing the files to GitHub. The following best practice is encouraged: - -- Remove any unwanted files and directories (such as `.git`) from your frontend directory -- Ensure that `template.json` is complete, especially `helpurl` -- Push the files to GitHub -- Create a PR on the [Community Templates](../community/templates.mdx) page -- Announce the template on the [Template Announcement](https://github.com/wailsapp/wails/discussions/825) discussion board diff --git a/website/versioned_docs/version-v2.0.0-beta.44/guides/troubleshooting.mdx b/website/versioned_docs/version-v2.0.0-beta.44/guides/troubleshooting.mdx deleted file mode 100644 index 6541600b8..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/guides/troubleshooting.mdx +++ /dev/null @@ -1,111 +0,0 @@ -# Troubleshooting - -An assortment of troubleshooting tips. - -## The `wails` command appears to be missing? - -If your system is reporting that the `wails` command is missing, make sure you have followed the Go installation guide -correctly. Normally, it means that the `go/bin` directory in your User's home directory is not in the `PATH` environment -variable. You will also normally need to close and reopen any open command prompts so that changes to the environment -made by the installer are reflected at the command prompt. - -## My application is displaying a white/blank screen - -Check that your application includes the assets from the correct directory. In your `main.go` file, you will have -something similar to the following code: - -```go -//go:embed frontend/dist -var assets embed.FS -``` -Check that `frontend/dist` contains your application assets. - -### Mac - -If this happens on Mac, try adding the following to your `Info.plist`: - -```xml -NSAppTransportSecurity - - NSAllowsLocalNetworking - - -``` - -Reference: https://github.com/wailsapp/wails/issues/1504#issuecomment-1174317433 - -## Mac application not valid - -If your built application looks like this in finder: - -

- -

- -it's likely that your application's `info.plist` is invalid. Update the file in `build/.app/Contents/info.plist` -and check if the data is valid, EG check the binary name is correct. To persist the changes, copy the file back to -the `build/darwin` directory. - -## Cannot call backend method from frontend with variadic arguments - -If you have a backend method defined with variadic parameters, eg: -```go -func (a *App) TestFunc(msg string, args ...interface{}) error { - // Code -} -``` -calling this method from the frontend like this will fail: -```js -var msg = "Hello: " -var args = ["Go", "JS"] -window.go.main.App.TestFunc(msg, ...args).then((result) => { - //do things here -}).catch((error) => { - //handle error -}); -``` -Workaround: -```js -var msg = "Hello " -var args = ["Go", "JS"] -window.go.main.App.TestFunc(msg, args).then((result) => { //without the 3 dots - //do things here -}).catch((error) => { - //handle error -}); -``` -Credit: https://github.com/wailsapp/wails/issues/1186 - -## I'm having getting proxy errors when trying to install Wails - -If you are getting errors like this: -``` -"https://proxy.golang.org/github.com/wailsapp/wails/cmd/wails/@v/list": dial tcp 172.217.163.49:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. -``` -it's probably because the official Go Proxy is being blocked (Users in China have reported this). -The solution is to set up the proxy manually, eg: -``` -go env -w GO111MODULE=on -go env -w GOPROXY=https://goproxy.cn,direct -``` -Source: https://github.com/wailsapp/wails/issues/1233 - -## The generated Typescript doesn't have the correct types - -Sometimes the generated Typescript doesn't have the correct types. To mitigate this, -it is possible to specify what types should be generated using the `ts_type` struct tag. For -more details, please read [this](https://github.com/tkrajina/typescriptify-golang-structs#custom-types). - -## When I navigate away from `index.html`, I am unable to call methods on the frontend - -If you navigate away from `index.html` to a new html file, the context will be lost. This can be fixed by adding -the following imports to the `` section of any new page you navigate to: - -```html - - - - -``` - -Source: https://github.com/wailsapp/wails/discussions/1512 \ No newline at end of file diff --git a/website/versioned_docs/version-v2.0.0-beta.44/guides/windows-installer.mdx b/website/versioned_docs/version-v2.0.0-beta.44/guides/windows-installer.mdx deleted file mode 100644 index decfe0b42..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/guides/windows-installer.mdx +++ /dev/null @@ -1,51 +0,0 @@ -# NSIS installer - -

-
-

- -Wails supports generating Windows installers using the [NSIS installer](https://nsis.sourceforge.io/). - -## Installing NSIS - -### Windows - -The installer is available on the [NSIS Download](https://nsis.sourceforge.io/Download) page. - -If you use the chocolatey package manager, run the following script: -``` -choco install nsis -``` -If you install NSIS manually, you need to add the *Bin* folder, which contains `makensis.exe`, in your NSIS installation to your path. -[Here](https://www.architectryan.com/2018/03/17/add-to-the-path-on-windows-10/) is a good tutorial on how to add to path on Windows. - -### Linux - -The `nsis` package should be available through your distribution's package manager. - -### MacOS - -NSIS is available to install through homebrew: `brew install nsis`. - -## Generating the installer - -When a new project is created, Wails generates the NSIS configuration files in `build/windows/installer`. The config -data is read from `installer/info.json` and that is configured to use the project's `wails.json` Info section: - -```json -// ... - "Info": { - "companyName": "My Company Name", - "productName": "Wails Vite", - "productVersion": "1.0.0", - "copyright": "Copyright.........", - "comments": "Built using Wails (https://wails.io)" - }, -``` - -To generate an installer for your application, use the `-nsis` flag with `wails build`: -``` -wails build -nsis -``` - -The installer will now be available in the `build/bin` directory. diff --git a/website/versioned_docs/version-v2.0.0-beta.44/guides/windows.mdx b/website/versioned_docs/version-v2.0.0-beta.44/guides/windows.mdx deleted file mode 100644 index 73162d8a4..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/guides/windows.mdx +++ /dev/null @@ -1,71 +0,0 @@ - -# Windows - -This page has miscellaneous guides related to developing Wails applications for Windows. - -## Handling the WebView2 Runtime Dependency - -Wails applications built for Windows have a runtime requirement on the Microsoft [WebView2 Runtime](https://developer.microsoft.com/en-us/microsoft-edge/webview2/). -Windows 11 will have this installed by default, but some machines won't. Wails offers an easy approach to dealing with this dependency. - -By using the `-webview2` flag when building, you can decide what your application will do when a suitable runtime is not detected (including if the installed runtime is too old). -The four options are: - -1. Download -2. Embed -3. Browser -4. Error - -### Download - -This option will prompt the user that no suitable runtime has been found and then offer to download and run the official -bootstrapper from Microsoft's WebView2 site. If the user proceeds, the official bootstrapper will be downloaded and run. - -### Embed - -This option embeds the official bootstrapper within the application. If no suitable runtime has been found, the -application will offer to run the bootstrapper. This adds ~150k to the binary size. - -### Browser - -This option will prompt the user that no suitable runtime has been found and then offer to open a browser to the official -WebView2 page where the bootstrapper can be downloaded and installed. The application will then exit, leaving the installation -up to the user. - -### Error - -If no suitable runtime is found, an error is given to the user and no further action taken. - -## Fixed version runtime - -Another way of dealing with webview2 dependency is shipping it yourself. -You can download [fixed version runtime](https://developer.microsoft.com/microsoft-edge/webview2/#download-section) and bundle or download it with your application. - -Also, you should specify path to fixed version of webview2 runtime in the `windows.Options` structure when launching wails. - -```go - wails.Run(&options.App{ - Windows: &windows.Options{ - WebviewBrowserPath: "", - }, - }) -``` - -Note: When `WebviewBrowserPath` is specified, `error` strategy will be forced in case of minimal required version -mismatch or invalid path to a runtime. - -## Spawning other programs - -When spawning other programs, such as scripts, you will see the window appear on the screen. To hide the window, -you can use the following code: - -```go -cmd := exec.Command("your_script.exe") -cmd.SysProcAttr = &syscall.SysProcAttr{ - HideWindow: true, - CreationFlags: 0x08000000, -} -cmd.Start() -``` -Solution provided by [sithembiso](https://github.com/sithembiso) on the -[discussions board](https://github.com/wailsapp/wails/discussions/1734#discussioncomment-3386172). \ No newline at end of file diff --git a/website/versioned_docs/version-v2.0.0-beta.44/howdoesitwork.mdx b/website/versioned_docs/version-v2.0.0-beta.44/howdoesitwork.mdx deleted file mode 100644 index 9a2bed0c2..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/howdoesitwork.mdx +++ /dev/null @@ -1,403 +0,0 @@ ---- -sidebar_position: 20 ---- - -# How does it work? - -A Wails application is a standard Go application, with a webkit frontend. The Go part of the application consists of the -application code and a runtime library that provides a number of useful operations, like controlling the application -window. The frontend is a webkit window that will display the frontend assets. Also available to the frontend is a Javascript -version of the runtime library. Finally, it is possible to bind Go methods to the frontend, and these will appear as -Javascript methods that can be called, just as if they were local Javascript methods. - -
- -
- -## The Main Application - -### Overview - -The main application consists of a single call to `wails.Run()`. It accepts the -application configuration which describes the size of the application window, the window title, -what assets to use, etc. A basic application might look like this: - -```go title="main.go" -package main - -import ( - "embed" - "log" - - "github.com/wailsapp/wails/v2" - "github.com/wailsapp/wails/v2/pkg/options" -) - -//go:embed frontend/dist -var assets embed.FS - -func main() { - - app := &App{} - - err := wails.Run(&options.App{ - Title: "Basic Demo", - Width: 1024, - Height: 768, - Assets: &assets, - OnStartup: app.startup, - OnShutdown: app.shutdown, - Bind: []interface{}{ - app, - }, - }) - if err != nil { - log.Fatal(err) - } -} - - -type App struct { - ctx context.Context -} - -func (b *App) startup(ctx context.Context) { - b.ctx = ctx -} - -func (b *App) shutdown(ctx context.Context) {} - -func (b *App) Greet(name string) string { - return fmt.Sprintf("Hello %s!", name) -} -``` - -### Options rundown - -This example has the following options set: - -- `Title` - The text that should appear in the window's title bar -- `Width` & `Height` - The dimensions of the window -- `Assets` - The application's frontend assets -- `OnStartup` - A callback for when the window is created and is about to start loading the frontend assets -- `OnShutdown` - A callback for when the application is about to quit -- `Bind` - A slice of struct instances that we wish to expose to the frontend - -A full list of application options can be found in the [Options Reference](reference/options). - -#### Assets - -The `Assets` option is mandatory as you can't have a Wails application without frontend assets. Those assets can be -any files you would expect to find in a web application - html, js, css, svg, png, etc. **There is no requirement to -generate asset bundles** - plain files will do. When the application starts, it will attempt to load `index.html` -from your assets and the frontend will essentially work as a browser from that point on. It is worth noting that -there is no requirement on where in the `embed.FS` the files live. It is likely that the embed path uses a nested -directory relative to your main application code, such as `frontend/dist`: - -```go title="main.go" -//go:embed frontend/dist -var assets embed.FS -``` - -At startup, Wails will iterate the embedded files looking for the directory containing `index.html`. All other assets will be loaded relative -to this directory. - -As production binaries use the files contained in `embed.FS`, there are no external files required to be shipped with -the application. - -When running in development mode using the `wails dev` command, the assets are loaded off disk, and any changes result -in a "live reload". The location of the assets will be inferred from the `embed.FS`. - -More details can be found in the [Application Development Guide](guides/application-development.mdx). - -#### Application Lifecycle Callbacks - -Just before the frontend is about to load `index.html`, a callback is made to the function provided in [OnStartup](reference/options.mdx#onstartup). -A standard Go context is passed to this method. This context is required when calling the runtime so a standard pattern is to save -a reference to in this method. Just before the application shuts down, the [OnShutdown](reference/options.mdx#onshutdown) callback is called in the same way, -again with the context. There is also an [OnDomReady](reference/options.mdx#ondomready) callback for when the frontend -has completed loading all assets in `index.html` and is equivalent of the [`body onload`](https://www.w3schools.com/jsref/event_onload.asp) event in Javascript. -It is also possible to hook into the window close (or application quit) event by setting the -option [OnBeforeClose](reference/options.mdx#onbeforeclose). - -#### Method Binding - -The `Bind` option is one of the most important options in a Wails application. It specifies which struct methods -to expose to the frontend. Think of structs like "controllers" in a traditional web application. When the application -starts, it examines the struct instances listed in the `Bind` field in the options, determines which methods are -public (starts with an uppercase letter) and will generate Javascript versions of those methods that can be called -by the frontend code. - -:::info Note - - Wails requires that you pass in an *instance* of the struct for it to bind it correctly - -::: - -In this example, we create a new `App` instance and then add this instance to the `Bind` option in `wails.Run`: - -```go {16,24} title="main.go" -package main - -import ( - "embed" - "log" - - "github.com/wailsapp/wails/v2" - "github.com/wailsapp/wails/v2/pkg/options" -) - -//go:embed frontend/dist -var assets embed.FS - -func main() { - - app := &App{} - - err := wails.Run(&options.App{ - Title: "Basic Demo", - Width: 1024, - Height: 768, - Assets: &assets, - Bind: []interface{}{ - app, - }, - }) - if err != nil { - log.Fatal(err) - } -} - - -type App struct { - ctx context.Context -} - -func (a *App) Greet(name string) string { - return fmt.Sprintf("Hello %s!", name) -} -``` - -You may bind as many structs as you like. Just make sure you create an instance of it and pass it in `Bind`: - -```go {8-10} - //... - err := wails.Run(&options.App{ - Title: "Basic Demo", - Width: 1024, - Height: 768, - Assets: &assets, - Bind: []interface{}{ - app, - &mystruct1{}, - &mystruct2{}, - }, - }) - -``` - -When you run `wails dev` (or `wails generate module`), a frontend module will be generated containing the following: - - Javascript bindings for all bound methods - - Typescript declarations for all bound methods - - Typescript definitions for all Go structs used as inputs or outputs by the bound methods - -This makes it incredibly simple to call Go code from the frontend, using the same strongly typed datastructures. - -## The Frontend - -### Overview - -The frontend is a collection of files rendered by webkit. It's like a browser and webserver in one. -There is virtually[^1] no limit to which frameworks or libraries you can use. The main points of interaction between -the frontend and your Go code are: - -- Calling bound Go methods -- Calling runtime methods - -[^1]: - There is a very small subset of libraries that use features unsupported in WebViews. There are often alternatives and - workarounds for such cases. - -### Calling bound Go methods - -When you run your application with `wails dev`, it will automatically generate Javascript bindings for your structs in a -directory called `wailsjs/go` (You can also do this by running `wails generate module`). The generated files mirror the -package names in your application. In the example above, we bind `app`, which has one public method `Greet`. This will -lead to the generation of the following files: - -```bash -wailsjs - └─go - └─main - ├─App.d.ts - └─App.js -``` -Here we can see that there is a `main` package that contains the Javascript bindings for the bound `App` struct, as well -as the Typescript declaration file for those methods. To call `Greet` from our frontend, we simply import the method and -call it like a regular Javascript function: - -```javascript - // ... - import {Greet} from '../wailsjs/go/main/App' - - function doGreeting(name) { - Greet(name).then((result) => { - // Do something with result - }) - } -``` -The Typescript declaration file gives you the correct types for the bound methods: - -```ts -export function Greet(arg1:string):Promise; -``` - -The generated methods return a Promise. A successful call will result in the first return value from the Go call to be passed -to the `resolve` handler. An unsuccessful call is when a Go method that has an error type as it's second return value, -passes an error instance back to the caller. This is passed back via the `reject` handler. -In the example above, `Greet` only returns a `string` so the Javascript call will never reject - unless invalid data -is passed to it. - -All data types are correctly translated between Go and Javascript. Even structs. If you return a struct from a Go call, -it will be returned to your frontend as a Javascript class. Note: If you wish to use structs, you **must** define -`json` struct tags for your fields! - -:::info Note -Anonymous nested structs are not supported at this time. -::: - -It is possible to send structs back to Go. Any Javascript map/class passed as an argument that -is expecting a struct, will be converted to that struct type. To make this process a lot easier, in `dev` mode, -a TypeScript module is generated, defining all the struct types used in bound methods. Using this module, it's possible -to construct and send native Javascript objects to the Go code. - -There is also support for Go methods that use structs in their signature. All Go structs -specified by a bound method (either as parameters or return types) will have Typescript versions auto -generated as part of the Go code wrapper module. Using these, it's possible to share the same data -model between Go and Javascript. - -Example: We update our `Greet` method to accept a `Person` instead of a string: - -```go title="main.go" -type Person struct { - Name string `json:"name"` - Age uint8 `json:"age"` - Address *Address `json:"address"` -} - -type Address struct { - Street string `json:"street"` - Postcode string `json:"postcode"` -} - -func (a *App) Greet(p Person) string { - return fmt.Sprintf("Hello %s (Age: %d)!", p.Name, p.Age) -} -``` - -The `wailsjs/go/main/App.js` file will still have the following code: - -```js title="App.js" -export function Greet(arg1) { - return window['go']['main']['App']['Greet'](arg1); -} -``` - -But the `wailsjs/go/main/App.d.ts` file will be updated with the following code: - -```ts title="App.d.ts" -import {main} from '../models'; - -export function Greet(arg1:main.Person):Promise; -``` - -As we can see, the "main" namespace is imported from a new "models.ts" file. This file contains all the struct definitions -used by our bound methods. In this example, this is a `Person` struct. If we look at `models.ts`, we can see how the models -are defined: - -```ts title="models.ts" -export namespace main { - - export class Address { - street: string; - postcode: string; - - static createFrom(source: any = {}) { - return new Address(source); - } - - constructor(source: any = {}) { - if ('string' === typeof source) source = JSON.parse(source); - this.street = source["street"]; - this.postcode = source["postcode"]; - } - } - export class Person { - name: string; - age: number; - address?: Address; - - static createFrom(source: any = {}) { - return new Person(source); - } - - constructor(source: any = {}) { - if ('string' === typeof source) source = JSON.parse(source); - this.name = source["name"]; - this.age = source["age"]; - this.address = this.convertValues(source["address"], Address); - } - - convertValues(a: any, classs: any, asMap: boolean = false): any { - if (!a) { - return a; - } - if (a.slice) { - return (a as any[]).map(elem => this.convertValues(elem, classs)); - } else if ("object" === typeof a) { - if (asMap) { - for (const key of Object.keys(a)) { - a[key] = new classs(a[key]); - } - return a; - } - return new classs(a); - } - return a; - } - } -} -``` - -So long as you have TypeScript as part of your frontend build configuration, you can use these models in -the following way: - -```js title="mycode.js" - import {Greet} from '../wailsjs/go/main/App' - import {main} from '../wailsjs/go/models' - - function generate() { - let person = new main.Person() - person.name = "Peter" - person.age = 27 - Greet(person).then((result) => { - console.log(result) - }) - } -``` - -The combination of generated bindings and TypeScript models makes for a powerful development environment. - -More information on Binding can be found in the [Binding Methods](guides/application-development.mdx#binding-methods) -section of the [Application Development Guide](guides/application-development.mdx). - -### Calling runtime methods - -The Javascript runtime is located at `window.runtime` and contains many methods to do various -tasks such as emit an event or perform logging operations: - -```js title="mycode.js" -window.runtime.EventsEmit("my-event", 1); -``` - -More details about the JS runtime can be found in the [Runtime Reference](reference/runtime/intro). diff --git a/website/versioned_docs/version-v2.0.0-beta.44/introduction.mdx b/website/versioned_docs/version-v2.0.0-beta.44/introduction.mdx deleted file mode 100644 index a62caa78c..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/introduction.mdx +++ /dev/null @@ -1,78 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Introduction - -## Overview - -Wails is a project that enables you to write desktop apps using Go and web technologies. - -Consider it a lightweight and fast Electron alternative for Go. You can easily build applications with the flexibility -and power of Go, combined with a rich, modern frontend. - -Wails doesn't hold back with the eye candy either! This is [varly](https://varly.app) - a desktop application for -MacOS & Windows written using Wails. Not only does it look great, it uses native menus and translucency - everything -you'd expect from a modern native app. - -

- - - -

- -## Quick Start Templates - -Wails comes with a number of pre-configured templates that allow you to get your application up and running quickly. -There are templates for the following frameworks: Svelte, React, Vue, Preact, Lit and Vanilla. There are both Javascript -and Typescript versions for each template. - -## Native Elements - -Wails uses a purpose built library for handling native elements such as Window, Menus, Dialogs, etc, so you can build -good-looking, feature rich desktop applications. - -**It does not embed a browser**, so it is resource efficient. Instead, it uses the native rendering engine for the -platform. On Windows, this is the new Microsoft Webview2 library, built on Chromium. - -## Go & Javascript Interoperability - -Wails automatically makes your Go methods available to Javascript, so you can call them by name from your frontend! -It even generates Typescript versions of the structs used by your Go methods, so you can pass the same data structures -between Go and Javascript. - -## Runtime Library - -Wails provides a runtime library, for both Go and Javascript, that handles a lot of the things modern applications need, -like Eventing, Logging, Dialogs, etc. - -## Live Development Experience - -### Automatic Rebuilds - -When you run your application in "dev" mode, Wails will build your application as a native desktop application, but will -read your assets from disk. It will detect any changes to your Go code and automatically rebuild and relaunch your -application. - -### Automatic Reloads - -When changes to your application assets are detected, your running application will "reload", reflecting your changes -almost immediately. - -### Develop your application in a Browser - -If you prefer to debug and develop in a browser then Wails has you covered. The running application also has a webserver -that will run your application in any browser that connects to it. It will even refresh when your assets change on disk. - -## Production-ready Native Binaries - -When you're ready to do the final build of your application, the CLI will compile it down to a single executable, with -all the assets bundled into it. On Windows and MacOS, it is possible to create a native package for distribution. The -assets used in packaging (icon, info.plist, manifest file, etc) are part of your project and may be customised, giving -you total control over how your applications are built. - -## Tooling - -The Wails CLI provides a hassle-free way to generate, build and bundle your applications. It will do the heavy lifting -of creating icons, compiling your application with optimal settings and delivering a distributable, production ready -binary. Choose from a number of starter templates to get up and running quickly! diff --git a/website/versioned_docs/version-v2.0.0-beta.44/reference/_category_.json b/website/versioned_docs/version-v2.0.0-beta.44/reference/_category_.json deleted file mode 100644 index ebb337b83..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/reference/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Reference", - "position": 40 -} diff --git a/website/versioned_docs/version-v2.0.0-beta.44/reference/cli.mdx b/website/versioned_docs/version-v2.0.0-beta.44/reference/cli.mdx deleted file mode 100644 index ee584c439..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/reference/cli.mdx +++ /dev/null @@ -1,227 +0,0 @@ ---- -sidebar_position: 2 ---- - -# CLI - -The Wails CLI has a number of commands that are used for managing your projects. All commands are run in the following way: - -`wails ` - -## init - -`wails init` is used for generating projects. - -| Flag | Description | Default | -| :------------------- | :------------------------------------- | :-------------------------: | -| -n "project name" | Name of the project. **Mandatory**. | | -| -d "project dir" | Project directory to create | Name of the project | -| -g | Initialise git repository | | -| -l | List available project templates | | -| -q | Suppress output to console | | -| -t "template name" | The project template to use. This can be the name of a default template or a URL to a remote template hosted on github. | vanilla | -| -ide | Generate IDE project files | | -| -f | Force build application | false | - -Example: - `wails init -n test -d mytestproject -g -ide vscode -q` - -This will generate a a project called "test" in the "mytestproject" directory, initialise git, -generate vscode project files and do so silently. - -More information on using IDEs with Wails can be found [here](../guides/ides.mdx). - -### Remote Templates - -Remote templates (hosted on GitHub) are supported and can be installed by using the template's project URL. - -Example: - `wails init -n test -t https://github.com/leaanthony/testtemplate[@v1.0.0]` - -A list of community maintained templates can be found [here](../community/templates.mdx) - -:::warning Attention - - **The Wails project does not maintain, is not responsible nor liable for 3rd party templates!** - - If you are unsure about a template, inspect `package.json` and `wails.json` for what scripts are run and what packages are installed. - -::: - -## build - -`wails build` is used for compiling your project to a production-ready binary. - -| Flag | Description | Default | -| :------------------- | :-------------------------------------- | :------------------------- | -| -platform | Build for the given (comma delimited) [platforms](../reference/cli.mdx#platforms) eg. `windows/arm64`. Note, if you do not give the architecture, `runtime.GOARCH` is used. | platform = `GOOS` environment variable if given else `runtime.GOOS`.
arch = `GOARCH` envrionment variable if given else `runtime.GOARCH`. | -| -clean | Cleans the `build/bin` directory | | -| -compiler "compiler"| Use a different go compiler to build, eg go1.15beta1 | go | -| -ldflags "flags" | Additional ldflags to pass to the compiler | | -| -nopackage | Do not package application | | -| -o filename | Output filename | | -| -s | Skip building the frontend | false | -| -f | Force build application | false | -| -tags "extra tags" | Build tags to pass to compiler (quoted and space separated) | | -| -upx | Compress final binary using "upx" | | -| -upxflags | Flags to pass to upx | | -| -v int | Verbosity level (0 - silent, 1 - default, 2 - verbose) | 1 | -| -webview2 | WebView2 installer strategy: download,embed,browser,error | download | -| -u | Updates your project's `go.mod` to use the same version of Wails as the CLI | | -| -debug | Retains debug information in the application. Allows the use of the devtools in the application window | false | -| -trimpath | Remove all file system paths from the resulting executable. | false | -| -race | Build with Go's race detector | false | -| -windowsconsole | Keep the console window for Windows builds | false | - -For a detailed description of the `webview2` flag, please refer to the [Windows](../guides/windows.mdx) Guide. - -If you prefer to build using standard Go tooling, please consult the [Manual Builds](../guides/manual-builds.mdx) -guide. - -Example: - -`wails build -clean -o myproject.exe` - -:::info UPX on Apple Silicon - - There are [issues](https://github.com/upx/upx/issues/446) with using UPX with Apple Silicon. - -::: - -:::info UPX on Windows - - Some Antivirus vendors false positively mark `upx` compressed binaries as virus, see [issue](https://github.com/upx/upx/issues/437). - -::: - -### Platforms - -Supported platforms are: - -| Platform | Description | -|:---------------- |:--------------------------------------------- | -| darwin | MacOS + architecture of build machine | -| darwin/amd64 | MacOS 10.13+ AMD64 | -| darwin/arm64 | MacOS 11.0+ ARM64 | -| darwin/universal | MacOS AMD64+ARM64 universal application | -| windows | Windows 10/11 + architecture of build machine | -| windows/amd64 | Windows 10/11 AMD64 | -| windows/arm64 | Windows 10/11 ARM64 | -| linux | Linux + architecture of build machine | -| linux/amd64 | Linux AMD64 | -| linux/arm64 | Linux ARM64 | - - -## doctor - -`wails doctor` will run diagnostics to ensure that your system is ready for development. - -Example: -``` -Wails CLI v2.0.0-beta - -Scanning system - Please wait (this may take a long time)...Done. - -System ------- -OS: Windows 10 Pro -Version: 2009 (Build: 19043) -ID: 21H1 -Go Version: go1.17 -Platform: windows -Architecture: amd64 - -Dependency Package Name Status Version ----------- ------------ ------ ------- -WebView2 N/A Installed 93.0.961.52 -npm N/A Installed 6.14.15 -*upx N/A Installed upx 3.96 - -* - Optional Dependency - -Diagnosis ---------- -Your system is ready for Wails development! - -``` - -## dev - -`wails dev` is used to run your application in a "live development" mode. This means: - - - The application's `go.mod` will be updated to use the same version of Wails as the CLI - - The application is compiled and run automatically - - A watcher is started and will trigger a rebuild of your dev app if it detects changes to your go files - - A webserver is started on `http://localhost:34115` which serves your application (not just frontend) over http. This allows you to use your favourite browser development extensions - - All application assets are loaded from disk. If they are changed, the application will automatically reload (not rebuild). All connected browsers will also reload - - A JS module is generated that provides the following: - - Javascript wrappers of your Go methods with autogenerated JSDoc, providing code hinting - - TypeScript versions of your Go structs, that can be constructed and passed to your go methods - - A second JS module is generated that provides a wrapper + TS declaration for the runtime - -| Flag | Description | Default | -| :------------------- | :-------------------------------------- | :------------------------- | -| -assetdir "./path/to/assets" | Serve assets from the given directory instead of using the provided asset FS | Value in `wails.json` | -| -browser | Opens a browser to `http://localhost:34115` on startup | | -| -compiler "compiler"| Use a different go compiler to build, eg go1.15beta1 | go | -| -e | Extensions to trigger rebuilds (comma separated) | go | -| -reloaddirs | Additional directories to trigger reloads (comma separated) | Value in `wails.json` | -| -ldflags "flags" | Additional ldflags to pass to the compiler | | -| -tags "extra tags" | Build tags to pass to compiler (quoted and space separated) | | -| -loglevel "loglevel"| Loglevel to use - Trace, Debug, Info, Warning, Error | Debug | -| -noreload | Disable automatic reload when assets change | | -| -nogen | Disable generate module | | -| -v | Verbosity level (0 - silent, 1 - standard, 2 - verbose) | 1 | -| -wailsjsdir | The directory to generate the generated Wails JS modules | Value in `wails.json` | -| -debounce | The time to wait for reload after an asset change is detected | 100 (milliseconds) | -| -devserver "host:port" | The address to bind the wails dev server to | "localhost:34115" | -| -frontenddevserverurl "url" | Use 3rd party dev server url to serve assets, EG Vite | "" | -| -appargs "args" | Arguments passed to the application in shell style | | -| -save | Saves the given `assetdir`, `reloaddirs`, `wailsjsdir`, `debounce`, `devserver` and `frontenddevserverurl` flags in `wails.json` to become the defaults for subsequent invocations. | | -| -race | Build with Go's race detector | false | -| -s | Skip building the frontend | false | - -Example: - -`wails dev -assetdir ./frontend/dist -wailsjsdir ./frontend/src -browser` - -This command will do the following: - - - Build the application and run it (more details [here](../guides/manual-builds.mdx) - - Generate the Wails JS modules in `./frontend/src` - - Watch for updates to files in `./frontend/dist` and reload on any change - - Open a browser and connect to the application - -There is more information on using this feature with existing framework scripts [here](../guides/application-development.mdx#live-reloading). - -## generate - -### template - -Wails uses templates for project generation. The `wails generate template` command helps scaffold a template so that -it may be used for generating projects. - -| Flag | Description | -| :------------------- | :------------------------------------------- | -| -name | The template name (Mandatory) | -| -frontend "path" | Path to frontend project to use in template | - -For more details on creating templates, consult the [Templates guide](../guides/templates.mdx). - -### module - -The `wails generate module` command allows you to manually generate the `wailsjs` directory for your application. - -## update - -`wails update` will update the version of the Wails CLI. - -| Flag | Description | -| :------------------- | :-------------------------------------- | -| -pre | Update to latest pre-release version | -| -version "version" | Install a specific version of the CLI | - - -## version - -`wails version` will simply output the current CLI version. diff --git a/website/versioned_docs/version-v2.0.0-beta.44/reference/menus.mdx b/website/versioned_docs/version-v2.0.0-beta.44/reference/menus.mdx deleted file mode 100644 index ac083ef51..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/reference/menus.mdx +++ /dev/null @@ -1,271 +0,0 @@ ---- -sidebar_position: 4 ---- - -# Menus - -It is possible to add an application menu to Wails projects. This is achieved by defining a [Menu](#menu) struct and -setting it in the [`Menu`](../reference/options.mdx#menu) application config, or by calling the runtime method -[MenuSetApplicationMenu](../reference/runtime/menu.mdx#menusetapplicationmenu). - -An example of how to create a menu: - -```go - AppMenu := menu.NewMenu() - FileMenu := AppMenu.AddSubmenu("File") - FileMenu.AddText("&Open", keys.CmdOrCtrl("o"), openFile) - FileMenu.AddSeparator() - FileMenu.AddText("Quit", keys.CmdOrCtrl("q"), func(_ *menu.CallbackData) { - runtime.Quit() - }) - - if runtime.GOOS == "darwin" { - AppMenu.Append(menu.EditMenu()) // on macos platform, we should append EditMenu to enable Cmd+C,Cmd+V,Cmd+Z... shortcut - } - - err := wails.Run(&options.App{ - Title: "Menus Demo", - Width: 800, - Height: 600, - Menu: AppMenu, - Bind: []interface{}{ - app, - }, - ) - // ... -```` - -It is also possible to dynamically update the menu, by updating the menu struct and calling -[MenuUpdateApplicationMenu](../reference/runtime/menu.mdx#menuupdateapplicationmenu). - -The example above uses helper methods, however it's possible to build the menu structs manually. - -## Menu - -A Menu is a collection of MenuItems: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -type Menu struct { - Items []*MenuItem -} -``` - -For the Application menu, each MenuItem represents a single menu such as "Edit". - -A simple helper method is provided for building menus: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -func NewMenuFromItems(first *MenuItem, rest ...*MenuItem) *Menu -``` - -This makes the layout of the code more like that of a menu without the need to add the menu items manually after creating them. -Alternatively, you can just create the menu items and add them to the menu manually. - -## MenuItem - -A MenuItem represents an item within a Menu. - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -// MenuItem represents a menu item contained in a menu -type MenuItem struct { - Label string - Role Role - Accelerator *keys.Accelerator - Type Type - Disabled bool - Hidden bool - Checked bool - SubMenu *Menu - Click Callback -} -``` - -| Field | Type | Notes | -| ---------------- | ---------------------------------- | ----------------------------------------------------- | -| Label | string | The menu text | -| Accelerator | [\*keys.Accelerator](#accelerator) | Key binding for this menu item | -| Type | [Type](#type) | Type of MenuItem | -| Disabled | bool | Disables the menu item | -| Hidden | bool | Hides this menu item | -| Checked | bool | Adds check to item (Checkbox & Radio types) | -| SubMenu | [\*Menu](#menu) | Sets the submenu | -| Click | [Callback](#callback) | Callback function when menu clicked | -| Role | string | Defines a [role](#role) for this menu item. Mac only for now. | - -### Accelerator - -Accelerators (sometimes called keyboard shortcuts) define a binding between a keystroke and a menu item. Wails defines -an Accelerator as a combination or key + [Modifier](#modifier). They are available in the `"github.com/wailsapp/wails/v2/pkg/menu/keys"` package. - -Example: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" - // Defines cmd+o on Mac and ctrl-o on Window/Linux - myShortcut := keys.CmdOrCtrl("o") -``` - -Keys are any single character on a keyboard with the exception of `+`, which is defined as `plus`. -Some keys cannot be represented as characters so there are a set of named characters that may be used: - -- `backspace` -- `tab` -- `return` -- `enter` -- `escape` -- `left` -- `right` -- `up` -- `down` -- `space` -- `delete` -- `home` -- `end` -- `page up` -- `page down` -- `f1` -- `f2` -- `f3` -- `f4` -- `f5` -- `f6` -- `f7` -- `f8` -- `f9` -- `f10` -- `f11` -- `f12` -- `f13` -- `f14` -- `f15` -- `f16` -- `f17` -- `f18` -- `f19` -- `f20` -- `f21` -- `f22` -- `f23` -- `f24` -- `f25` -- `f26` -- `f27` -- `f28` -- `f29` -- `f30` -- `f31` -- `f32` -- `f33` -- `f34` -- `f35` -- `numlock` - -Wails also supports parsing accelerators using the same syntax as Electron. This is useful for storing accelerators in -config files. - -Example: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" - // Defines cmd+o on Mac and ctrl-o on Window/Linux - myShortcut, err := keys.Parse("Ctrl+Option+A") -``` - -#### Modifier - -The following modifiers are keys that may be used in combination with the accelerator key: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" -const ( - // CmdOrCtrlKey represents Command on Mac and Control on other platforms - CmdOrCtrlKey Modifier = "cmdorctrl" - // OptionOrAltKey represents Option on Mac and Alt on other platforms - OptionOrAltKey Modifier = "optionoralt" - // ShiftKey represents the shift key on all systems - ShiftKey Modifier = "shift" - // ControlKey represents the control key on all systems - ControlKey Modifier = "ctrl" -) -``` -A number of helper methods are available to create Accelerators using modifiers: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" -func CmdOrCtrl(key string) *Accelerator -func OptionOrAlt(key string) *Accelerator -func Shift(key string) *Accelerator -func Control(key string) *Accelerator -``` - -Modifiers can be combined using `keys.Combo(key string, modifier1 Modifier, modifier2 Modifier, rest ...Modifier)`: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" - // Defines "Ctrl+Option+A" on Mac and "Ctrl+Alt+A" on Window/Linux - myShortcut := keys.Combo("a", ControlKey, OptionOrAltKey) -``` - -### Type - -Each menu item must have a type and there are 5 types available: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -const ( - TextType Type = "Text" - SeparatorType Type = "Separator" - SubmenuType Type = "Submenu" - CheckboxType Type = "Checkbox" - RadioType Type = "Radio" -) -``` - -For convenience, helper methods are provided to quickly create a menu item: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -func Text(label string, accelerator *keys.Accelerator, click Callback) *MenuItem -func Separator() *MenuItem -func Radio(label string, selected bool, accelerator *keys.Accelerator, click Callback) *MenuItem -func Checkbox(label string, checked bool, accelerator *keys.Accelerator, click Callback) *MenuItem -func SubMenu(label string, menu *Menu) *Menu -``` -You can also create menu items directly on a menu by using the "Add" helpers: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -func (m *Menu) AddText(label string, accelerator *keys.Accelerator, click Callback) *MenuItem -func (m *Menu) AddSeparator() *MenuItem -func (m *Menu) AddRadio(label string, selected bool, accelerator *keys.Accelerator, click Callback) *MenuItem -func (m *Menu) AddCheckbox(label string, checked bool, accelerator *keys.Accelerator, click Callback) *MenuItem -func (m *Menu) AddSubMenu(label string, menu *Menu) *MenuI -``` - - -A note on radio groups: A radio group is defined as a number of radio menu items that are next to each other in the menu. -This means that you do not need to group items together as it is automatic. However, that also means you cannot have 2 -radio groups next to each other - there must be a non-radio item between them. - -### Callback - -Each menu item may have a callback that is executed when the item is clicked: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -type Callback func(*CallbackData) - -type CallbackData struct { - MenuItem *MenuItem -} -``` - -The function is given a `CallbackData` struct which indicates which menu item triggered the callback. This is useful when -using radio groups that may share a callback. - -### Role - -:::info Roles - - Roles are currently supported on Mac only. - -::: - -A menu item may have a role, which is essentially a pre-defined menu item. We currently support the following roles: - -| Role | Description | -| ---- | ----------- | -| AppMenuRole | The standard Mac application menu. Can be created using `menu.AppMenu()` | -| EditMenuRole | The standard Mac edit menu. Can be created using `menu.EditMenu()` | - diff --git a/website/versioned_docs/version-v2.0.0-beta.44/reference/options.mdx b/website/versioned_docs/version-v2.0.0-beta.44/reference/options.mdx deleted file mode 100644 index b0772c67c..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/reference/options.mdx +++ /dev/null @@ -1,732 +0,0 @@ ---- -sidebar_position: 3 ---- - -# Options - -## Application Options - -The `Options.App` struct contains the application configuration. -It is passed to the `wails.Run()` method: - -```go title="Example" -import "github.com/wailsapp/wails/v2/pkg/options" - -func main() { - - err := wails.Run(&options.App{ - Title: "Menus Demo", - Width: 800, - Height: 600, - DisableResize: false, - Fullscreen: false, - Frameless: true, - MinWidth: 400, - MinHeight: 400, - MaxWidth: 1280, - MaxHeight: 1024, - StartHidden: false, - HideWindowOnClose: false, - BackgroundColour: &options.RGBA{R: 0, G: 0, B: 0, A: 255}, - AlwaysOnTop: false, - Assets: assets, - AssetsHandler: assetsHandler, - Menu: app.applicationMenu(), - Logger: nil, - LogLevel: logger.DEBUG, - LogLevelProduction: logger.ERROR, - OnStartup: app.startup, - OnDomReady: app.domready, - OnShutdown: app.shutdown, - OnBeforeClose: app.beforeClose, - WindowStartState: options.Maximised, - Bind: []interface{}{ - app, - }, - Windows: &windows.Options{ - WebviewIsTransparent: false, - WindowIsTranslucent: false, - DisableWindowIcon: false, - DisableFramelessWindowDecorations: false, - WebviewUserDataPath: "", - WebviewBrowserPath: "", - Theme: windows.SystemDefault, - CustomTheme: &windows.ThemeSettings{ - DarkModeTitleBar: windows.RGB(20, 20, 20), - DarkModeTitleText: windows.RGB(200, 200, 200), - DarkModeBorder: windows.RGB(20, 0, 20), - LightModeTitleBar: windows.RGB(200, 200, 200), - LightModeTitleText: windows.RGB(20, 20, 20), - LightModeBorder: windows.RGB(200, 200, 200), - }, - // User messages that can be customised - Messages *windows.Messages - }, - Mac: &mac.Options{ - TitleBar: &mac.TitleBar{ - TitlebarAppearsTransparent: true, - HideTitle: false, - HideTitleBar: false, - FullSizeContent: false, - UseToolbar: false, - HideToolbarSeparator: true, - }, - Appearance: mac.NSAppearanceNameDarkAqua, - WebviewIsTransparent: true, - WindowIsTranslucent: false, - About: &mac.AboutInfo{ - Title: "My Application", - Message: "© 2021 Me", - Icon: icon, - }, - }, - Linux: &linux.Options{ - Icon: icon, - }, - }) - if err != nil { - log.Fatal(err) - } -} - -``` - - - -### Title - -Name: Title - -Type: string - -The text shown in the window's title bar. - -### Width - -Name: Width - -Type: int - -The initial width of the window. -Default: 1024. - -### Height - -Name: Height - -Type: int - -The initial height of the window. -Default: 768 - -### DisableResize - -Name: DisableResize - -Type: bool - -By default, the main window is resizable. Setting this to `true` will keep it a fixed size. - -### Fullscreen - -Name: Fullscreen - -Type: bool - -Setting this to `true` will make the window fullscreen at startup. - -### Frameless - -Name: Frameless - -Type: bool - -When set to `true`, the window will have no borders or title bar. -Also see [Frameless Windows](../guides/frameless.mdx). - -### MinWidth - -Name: MinWidth - -Type: int - -This sets the minimum width for the window. If the value given in `Width` is less than this value, -the window will be set to `MinWidth` by default. - -### MinHeight - -Name: MinHeight - -Type: int - -This sets the minimum height for the window. If the value given in `Height` is less than this value, -the window will be set to `MinHeight` by default. - -### MaxWidth - -Name: MaxWidth - -Type: int - -This sets the maximum width for the window. If the value given in `Width` is more than this value, -the window will be set to `MaxWidth` by default. - -### MaxHeight - -Name: MaxHeight - -Type: int - -This sets the maximum height for the window. If the value given in `Height` is more than this value, -the window will be set to `MaxHeight` by default. - -### StartHidden - -Name: StartHidden - -Type: bool - -When set to `true`, the application will be hidden until [WindowShow](../reference/runtime/window.mdx#windowshow) -is called. - -### HideWindowOnClose - -Name: HideWindowOnClose - -Type: bool - -By default, closing the window will close the application. Setting this to `true` means closing the window will -hide the window instead. - -### BackgroundColour - -Name: BackgroundColour - -Type: *options.RGBA -Example: options.NewRGBA(255,0,0,128) - Red at 50% transparency - -This value is the default background colour of the window. -Default: white - -### AlwaysOnTop - -Name: AlwaysOnTop - -Type: bool - -Indicates that the window should stay above other windows when losing focus. - -### Assets - -Name: Assets - -Type: embed.FS - -The frontend assets to be used by the application. Requires an `index.html` file. - -### AssetsHandler - - - -Name: AssetsHandler - -Type: http.Handler - - -The assets handler is a generic `http.Handler` which will be called for any non GET request on the assets server -and for GET requests which can not be served from the `assets` because the file is not found. - -| Value | Win | Mac | Lin | -| ----------------------------- | --- | --- | --- | -| GET | ✅ | ✅ | ✅ | -| POST | ✅ | ✅ | ❌ | -| PUT | ✅ | ✅ | ❌ | -| PATCH | ✅ | ✅ | ❌ | -| DELETE | ✅ | ✅ | ❌ | -| Request Headers | ✅ | ✅ | ❌ | -| Request Body | ✅ | ✅ | ❌ | -| Request Body Streaming | ❌ | ❌ | ❌ | -| Response StatusCodes | ✅ | ✅ | ❌ | -| Response Headers | ✅ | ✅ | ❌ | -| Response Body | ✅ | ✅ | ✅ | -| Response Body Streaming | ❌ | ❌ | ✅ | - -NOTE: Linux is currently very limited due to targeting a WebKit2GTK Version < 2.36.0. In the future some features will be -supported by the introduction of WebKit2GTK 2.36.0+ support. - -NOTE: When used in combination with a Frontend DevServer there might be limitations, eg. Vite serves the index.html -on every path, that does not contain a file extension. - -### Menu - -Name: Menu - -Type: \*menu.Menu - -The menu to be used by the application. More details about Menus in the [Menu Reference](../reference/runtime/menu.mdx). - -NOTE: On Mac, if no menu is specified, a default menu will be created. - -### Logger - -Name: Logger - -Type: logger.Logger - -Default: Logger to Stdout - -The logger to be used by the application. More details about logging in the [Log Reference](../reference/runtime/log.mdx). - -### LogLevel - -Name: LogLevel - -Type: logger.LogLevel - -Default: `Info` in dev mode, `Error` in production mode - -The default log level. More details about logging in the [Log Reference](../reference/runtime/log.mdx). - -### LogLevelProduction - -Name: LogLevelProduction - -Type: logger.LogLevel - -Default: `Error` - -The default log level for production builds. More details about logging in the [Log Reference](../reference/runtime/log.mdx). - -### OnStartup - -Name: OnStartup - -Type: func(ctx context.Context) - -This callback is called after the frontend has been created, but before `index.html` has been loaded. It is given -the application context. - -### OnDomReady - -Name: OnDomReady - -Type: func(ctx context.Context) - -This callback is called after the frontend has loaded `index.html` and its resources. It is given -the application context. - -### OnShutdown - -Name: OnShutdown - -Type: func(ctx context.Context) - -This callback is called after the frontend has been destroyed, just before the application terminates. It is given -the application context. - -### OnBeforeClose - -Name: OnBeforeClose - -Type: func(ctx context.Context) bool - -If this callback is set, it will be called when the application is about to quit, either by clicking the window close -button or calling `runtime.Quit`. Returning true will cause the application to continue, false will continue shutdown -as normal. This is good for confirming with the user that they wish to exit the program. - -Example: -```go title=windowsapp.go -func (b *App) beforeClose(ctx context.Context) (prevent bool) { - dialog, err := runtime.MessageDialog(ctx, runtime.MessageDialogOptions{ - Type: runtime.QuestionDialog, - Title: "Quit?", - Message: "Are you sure you want to quit?", - }) - - if err != nil { - return false - } - return dialog != "Yes" -} -``` - -### WindowStartState - -Name: WindowStartState - -Type: options.WindowStartState - -Defines how the window should present itself at startup. - -| Value | Win | Mac | Lin | -| --------------- | --- | --- | --- | -| Fullscreen | ✅ | ✅ | ✅ | -| Maximised | ✅ | ✅ | ✅ | -| Minimised | ✅ | ❌ | ✅ | - -### Bind - -Name: Bind - -Type: []interface{} - -A slice of struct instances defining methods that need to be bound to the frontend. - -### Windows - -Name: Windows - -Type: \*windows.Options - -This defines [Windows specific options](#windows-specific-options). - -### Mac - -Name: Mac - -Type: \*mac.Options - -This defines [Mac specific options](#mac-specific-options). - -### Linux - -Name: Linux - -Type: \*linux.Options - -This defines [Linux specific options](#linux-specific-options). - -## Windows Specific Options - -### WebviewIsTransparent - -Name: WebviewIsTransparent - -Type: bool - -Setting this to `true` will make the webview background transparent when an alpha value of `0` is used. -This means that if you use `rgba(0,0,0,0)` for `background-color` in your CSS, the host window will show through. -Often combined with [WindowIsTranslucent](#WindowIsTranslucent) to make frosty-looking applications. - -### WindowIsTranslucent - -Name: WindowIsTranslucent - -Type: bool - -Setting this to `true` will make the window background translucent. Often combined -with [WebviewIsTransparent](#WebviewIsTransparent) to make frosty-looking applications. - -### DisableWindowIcon - -Name: DisableWindowIcon - -Type: bool - -Setting this to `true` will remove the icon in the top left corner of the title bar. - -### DisableFramelessWindowDecorations - -Name: DisableFramelessWindowDecorations - -Type: bool - -Setting this to `true` will remove the window decorations in [Frameless](#Frameless) mode. This means there will be no -'Aero Shadow' and no 'Rounded Corners' shown for the window. Please note that 'Rounded Corners' are only supported on -Windows 11. - -### WebviewUserDataPath - -Name: WebviewUserDataPath - -Type: string - -This defines the path where the WebView2 stores the user data. If empty `%APPDATA%\[BinaryName.exe]` will be used. - -### WebviewBrowserPath - -Name: WebviewBrowserPath - -Type: string - -This defines the path to a directory with WebView2 executable files and libraries. If empty, webview2 installed in the system will be used. - -Important information about distribution of fixed version runtime: -- [How to get and extract runtime](https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution#details-about-the-fixed-version-runtime-distribution-mode) -- [Known issues for fixed version](https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution#known-issues-for-fixed-version) -- [The path of fixed version of the WebView2 Runtime should not contain \Edge\Application\.](https://docs.microsoft.com/en-us/microsoft-edge/webview2/reference/win32/webview2-idl?view=webview2-1.0.1245.22#createcorewebview2environmentwithoptions) - -### Theme - -Name: Theme - -Type: `windows.Theme` - -Minimum Windows Version: Windows 10 2004/20H1 - -This defines the theme that the application should use: - -| Value | Description | -| --------------- | ----------- | -| SystemDefault | *Default*. The theme will be based on the system default. If the user changes their theme, the application will update to use the new setting | -| Dark | The application will use a dark theme exclusively | -| Light | The application will use a light theme exclusively | - - -### CustomTheme - -Name: CustomTheme - -Type: `windows.CustomTheme` - -Minimum Windows Version: Windows 10/11 2009/21H2 Build 22000 - -Allows you to specify custom colours for TitleBar, TitleText and Border for both light and dark mode, as well as -when the window is active or inactive. - -#### CustomTheme - -The CustomTheme struct uses `int32` to specify the colour values. These are in the standard(!) Windows format of: -`0x00BBGGAA`. A helper function is provided to do RGB conversions into this format: `windows.RGB(r,g,b uint8)`. - -NOTE: Any value not provided will default to black. - -```go -type ThemeSettings struct { - DarkModeTitleBar int32 - DarkModeTitleBarInactive int32 - DarkModeTitleText int32 - DarkModeTitleTextInactive int32 - DarkModeBorder int32 - DarkModeBorderInactive int32 - LightModeTitleBar int32 - LightModeTitleBarInactive int32 - LightModeTitleText int32 - LightModeTitleTextInactive int32 - LightModeBorder int32 - LightModeBorderInactive int32 -} -``` - -Example: -```go - CustomTheme: &windows.ThemeSettings{ - // Theme to use when window is active - DarkModeTitleBar: windows.RGB(255, 0, 0), // Red - DarkModeTitleText: windows.RGB(0, 255, 0), // Green - DarkModeBorder: windows.RGB(0, 0, 255), // Blue - LightModeTitleBar: windows.RGB(200, 200, 200), - LightModeTitleText: windows.RGB(20, 20, 20), - LightModeBorder: windows.RGB(200, 200, 200), - // Theme to use when window is inactive - DarkModeTitleBarInactive: windows.RGB(128, 0, 0), - DarkModeTitleTextInactive: windows.RGB(0, 128, 0), - DarkModeBorderInactive: windows.RGB(0, 0, 128), - LightModeTitleBarInactive: windows.RGB(100, 100, 100), - LightModeTitleTextInactive: windows.RGB(10, 10, 10), - LightModeBorderInactive: windows.RGB(100, 100, 100), - }, -``` - -### Messages - -Name: Messages - -Type: `*windows.Messages` - -A struct of strings used by the webview2 installer if a valid webview2 runtime is not found. -Customise this for any language you choose to support. - -### ResizeDebounceMS - -Name: ResizeDebounceMS - -Type: uint16 - -ResizeDebounceMS is the amount of time to debounce redraws of webview2 when resizing the window. -The default value (0) will perform redraws as fast as it can. - -### OnSuspend - -Name: OnSuspend - -Type: func() - -If set, this function will be called when windows initiates a switch to low power mode (suspend/hibernate) - -### OnResume - -Name: OnResume - -Type: func() - -If set, this function will be called when windows resumes from low power mode (suspend/hibernate) - - - -## Mac Specific Options - -### TitleBar - -Name: TitleBar - -Type: [*mac.TitleBar](#titlebar-struct) - -The TitleBar struct provides the ability to configure the look and feel of the title bar. - -### Appearance - -Name: Appearance - -Type: [AppearanceType](#appearance-type) - -Appearance is used to set the style of your app in accordance with Apple's [NSAppearance](https://developer.apple.com/documentation/appkit/nsappearancename?language=objc) names. - -### WebviewIsTransparent - -Name: WebviewIsTransparent - -Type: bool - -Setting this to `true` will make the webview background transparent when an alpha value of `0` is used. -This means that if you use `rgba(0,0,0,0)` for `background-color` in your CSS, the host window will show through. -Often combined with [WindowIsTranslucent](#WindowIsTranslucent) to make frosty-looking applications. - -### WindowIsTranslucent - -Name: WindowIsTranslucent - -Type: bool - -Setting this to `true` will make the window background translucent. Often combined -with [WebviewIsTransparent](#WebviewIsTransparent) to make frosty-looking applications. - -### About - -Name: About - -Type: [About](#about-struct) - -This configuration lets you set the title, message and icon for the "About" menu item in the app menu created by the "AppMenu" role. - -#### Titlebar struct - -The titlebar of the application can be customised by using the TitleBar options: - -```go -type TitleBar struct { - TitlebarAppearsTransparent bool - HideTitle bool - HideTitleBar bool - FullSizeContent bool - UseToolbar bool - HideToolbarSeparator bool -} -``` - -| Name | Description | -| ---- | ----------- | -| TitlebarAppearsTransparent | Makes the titlebar transparent. This has the effect of hiding the titlebar and the content fill the window. [Apple Docs](https://developer.apple.com/documentation/appkit/nswindow/1419167-titlebarappearstransparent?language=objc) | -| HideTitle | Hides the title of the window. [Apple Docs](https://developer.apple.com/documentation/appkit/nswindowtitlevisibility?language=objc) | -| HideTitleBar | Removes [NSWindowStyleMaskTitled](https://developer.apple.com/documentation/appkit/nswindowstylemask/nswindowstylemasktitled/) from the style mask | -| FullSizeContent | Makes the webview fill the entire window. [Apple Docs](https://developer.apple.com/documentation/appkit/nswindowstylemask/nswindowstylemaskfullsizecontentview)| -| UseToolbar | Adds a default toolbar to the window. [Apple Docs](https://developer.apple.com/documentation/appkit/nstoolbar?language=objc) | -| HideToolbarSeparator | Removes the line beneath the toolbar. [Apple Docs](https://developer.apple.com/documentation/appkit/nstoolbar/1516954-showsbaselineseparator?language=objc) | - -Preconfigured titlebar settings are available: - -| Setting | Example | -| ------- | ------- | -|`mac.TitleBarDefault()` | ![](/img/reference/titlebar-default.webp) | -|`mac.TitleBarHidden()` | ![](/img/reference/titlebar-hidden.webp) | -|`mac.TitleBarHiddenInset()` | ![](/img/reference/titlebar-hidden-inset.webp) | - -Example: -```go -Mac: &mac.Options{ - TitleBar: mac.TitleBarHiddenInset(), -} -``` - -Click [here](https://github.com/lukakerr/NSWindowStyles) for some inspiration on customising the titlebar. - -#### Appearance type - -You can specify the application's [appearance](https://developer.apple.com/documentation/appkit/nsappearance?language=objc). - -| Value | Description | -| --------------- | ------------------ | -| DefaultAppearance | DefaultAppearance uses the default system value | -| NSAppearanceNameAqua | The standard light system appearance | -| NSAppearanceNameDarkAqua | The standard dark system appearance | -| NSAppearanceNameVibrantLight | The light vibrant appearance | -| NSAppearanceNameAccessibilityHighContrastAqua | A high-contrast version of the standard light system appearance | -| NSAppearanceNameAccessibilityHighContrastDarkAqua | A high-contrast version of the standard dark system appearance | -| NSAppearanceNameAccessibilityHighContrastVibrantLight | A high-contrast version of the light vibrant appearance | -| NSAppearanceNameAccessibilityHighContrastVibrantDark | A high-contrast version of the dark vibrant appearance | - -Example: -```go -Mac: &mac.Options{ - Appearance: mac.NSAppearanceNameDarkAqua, -} -``` - -#### About struct - -```go -type AboutInfo struct { - Title string - Message string - Icon []byte -} -``` -If these settings are provided, an "About" menu item will appear in the app menu (when using the `AppMenu` role). -Given this configuration: -```go -//go:embed build/appicon.png -var icon []byte - -func main() { - err := wails.Run(&options.App{ - ... - Mac: &mac.Options{ - About: &mac.AboutInfo{ - Title: "My Application", - Message: "© 2021 Me", - Icon: icon, - }, - }, - }) -``` -The "About" menu item will appear in the app menu: - -
- -
-
- -When clicked, that will open an about message box: - -
- -
-
- -## Linux Specific Options - -### Icon - -Name: Icon - -Type: []byte - -Sets up the icon representing the window. This icon is used when the window is minimized (also known as iconified). -Some window managers or desktop environments may also place it in the window frame, or display it in other contexts. -On others, the icon is not used at all, so your mileage may vary. - -NOTE: Gnome on Wayland at least does not display this icon. To have a application icon there, a `.desktop` file has to be used. -On KDE it should work. - -The icon should be provided in whatever size it was naturally drawn; that is, don’t scale the image before passing it. -Scaling is postponed until the last minute, when the desired final size is known, to allow best quality. diff --git a/website/versioned_docs/version-v2.0.0-beta.44/reference/project-config.mdx b/website/versioned_docs/version-v2.0.0-beta.44/reference/project-config.mdx deleted file mode 100644 index 936e3fd5f..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/reference/project-config.mdx +++ /dev/null @@ -1,52 +0,0 @@ ---- -sidebar_position: 5 ---- - -# Project Config - -The project config resides in the `wails.json` file in the project directory. The structure of the config is: - -```json -{ - "name": "[The project name]", - "assetdir": "[Relative path to the directory containing the compiled assets, this is normally inferred and could be left empty]", - "reloaddirs": "[Additional directories to trigger reloads (comma separated), this is only used for some advanced asset configurations]", - "frontend:install": "[The command to install node dependencies, run in the frontend directory - often `npm install`]", - "frontend:build": "[The command to build the assets, run in the frontend directory - often `npm run build`]", - "frontend:dev": "[This command has been replaced by frontend:dev:build. If frontend:dev:build is not specified will falls back to this command. If this command is also not specified will falls back to frontend:build]", - "frontend:dev:build": "[This command is the dev equivalent of frontend:build. If not specified falls back to frontend:dev]", - "frontend:dev:install": "[This command is the dev equivalent of frontend:install. If not specified falls back to frontend:install]", - "frontend:dev:watcher": "[This command is run in a separate process on `wails dev`. Useful for 3rd party watchers or starting 3d party dev servers]", - "frontend:dev:serverUrl": "[URL to a 3rd party dev server to be used to serve assets, EG Vite. If this is set to 'auto' then the devServerUrl will be inferred from the Vite output]", - "wailsjsdir": "[Relative path to the directory that the auto-generated JS modules will be created]", - "version": "[Project config version]", - "outputfilename": "[The name of the binary]", - "debounceMS": 100, // The default time the dev server waits to reload when it detects a change in assets - "devServer": "[Address to bind the wails dev sever to. Default: localhost:34115]", - "appargs": "[Arguments passed to the application in shell style when in dev mode]", - "runNonNativeBuildHooks": false, // Defines if build hooks should be run though they are defined for an OS other than the host OS. - "preBuildHooks": { - "GOOS/GOARCH": "[The command that will be executed before a build of the specified GOOS/GOARCH: ${platform} is replaced with the "GOOS/GOARCH". The "GOOS/GOARCH" hook is executed before the "GOOS/*" and "*/*" hook.]", - "GOOS/*": "[The command that will be executed before a build of the specified GOOS: ${platform} is replaced with the "GOOS/GOARCH". The "GOOS/*" hook is executed before the "*/*" hook.]", - "*/*": "[The command that will be executed before every build: ${platform} is replaced with the "GOOS/GOARCH".]" - }, - "postBuildHooks": { - "GOOS/GOARCH": "[The command that will be executed after a build of the specified GOOS/GOARCH: ${platform} is replaced with the "GOOS/GOARCH" and ${bin} with the path to the compiled binary. The "GOOS/GOARCH" hook is executed before the "GOOS/*" and "*/*" hook.]", - "GOOS/*": "[The command that will be executed after a build of the specified GOOS: ${platform} is replaced with the "GOOS/GOARCH" and ${bin} with the path to the compiled binary. The "GOOS/*" hook is executed before the "*/*" hook.]", - "*/*": "[The command that will be executed after every build: ${platform} is replaced with the "GOOS/GOARCH" and ${bin} with the path to the compiled binary.]" - }, - "info": { // Data used to populate manifests and version info. - "companyName": "[The company name. Default: [The project name]]", - "productName": "[The product name. Default: [The project name]]", - "productVersion": "[The version of the product. Default: '1.0.0']", - "copyright": "[The copyright of the product. Default: 'Copyright.........']", - "comments": "[A short comment of the app. Default: 'Built using Wails (https://wails.app)']" - }, - "nsisType": "['multiple': One installer per architecture. 'single': Single universal installer for all architectures being built. Default: 'multiple']" -} -``` - -This file is read by the Wails CLI when running `wails build` or `wails dev`. - -The `assetdir`, `reloaddirs`, `wailsjsdir`, `debounceMS`, `devserver` and `frontenddevserverurl` flags in `wails build/dev` will update the project config -and thus become defaults for subsequent runs. \ No newline at end of file diff --git a/website/versioned_docs/version-v2.0.0-beta.44/reference/runtime/_category_.json b/website/versioned_docs/version-v2.0.0-beta.44/reference/runtime/_category_.json deleted file mode 100644 index ac6d55488..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/reference/runtime/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Runtime", - "position": 1 -} diff --git a/website/versioned_docs/version-v2.0.0-beta.44/reference/runtime/browser.mdx b/website/versioned_docs/version-v2.0.0-beta.44/reference/runtime/browser.mdx deleted file mode 100644 index 1cb407d49..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/reference/runtime/browser.mdx +++ /dev/null @@ -1,20 +0,0 @@ ---- -sidebar_position: 7 ---- - -# Browser - -## Overview - -These methods are related to the system browser. - -### BrowserOpenURL -Go Signature: `BrowserOpenURL(ctx context.Context, url string)` - -JS Signature: `BrowserOpenURL(url string)` - -Opens the given URL in the system browser. - - - - diff --git a/website/versioned_docs/version-v2.0.0-beta.44/reference/runtime/dialog.mdx b/website/versioned_docs/version-v2.0.0-beta.44/reference/runtime/dialog.mdx deleted file mode 100644 index 2778010ff..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/reference/runtime/dialog.mdx +++ /dev/null @@ -1,263 +0,0 @@ ---- -sidebar_position: 5 ---- - -# Dialog - -## Overview - -This part of the runtime provides access to native dialogs, such as File Selectors and Message boxes. - -:::info Javascript - Dialog is currently unsupported in the JS runtime. -::: - -### OpenDirectoryDialog - -Opens a dialog that prompts the user to select a directory. Can be customised using [OpenDialogOptions](#opendialogoptions). - -Go Signature: `OpenDirectoryDialog(ctx context.Context, dialogOptions OpenDialogOptions) (string, error)` - -Returns: Selected directory (blank if the user cancelled) or an error - - -### OpenFileDialog - -Opens a dialog that prompts the user to select a file. Can be customised using [OpenDialogOptions](#opendialogoptions). - -Go Signature: `OpenFileDialog(ctx context.Context, dialogOptions OpenDialogOptions) (string, error)` - -Returns: Selected file (blank if the user cancelled) or an error - - - -### OpenMultipleFilesDialog - -Opens a dialog that prompts the user to select multiple files. Can be customised using [OpenDialogOptions](#opendialogoptions). - -Go Signature: `OpenMultipleFilesDialog(ctx context.Context, dialogOptions OpenDialogOptions) ([]string, error)` - -Returns: Selected files (nil if the user cancelled) or an error - - - -### SaveFileDialog - -Opens a dialog that prompts the user to select a filename for the purposes of saving. Can be customised using [SaveDialogOptions](#savedialogoptions). - -Go Signature: `SaveFileDialog(ctx context.Context, dialogOptions SaveDialogOptions) (string, error)` - -Returns: The selected file (blank if the user cancelled) or an error - - - -### MessageDialog - -Displays a message using a message dialog. Can be customised using [MessageDialogOptions](#messagedialogoptions). - -Go Signature: `MessageDialog(ctx context.Context, dialogOptions MessageDialogOptions) (string, error)` - -Returns: The text of the selected button or an error - -## Options - -### OpenDialogOptions - -```go -type OpenDialogOptions struct { - DefaultDirectory string - DefaultFilename string - Title string - Filters []FileFilter - ShowHiddenFiles bool - CanCreateDirectories bool - ResolvesAliases bool - TreatPackagesAsDirectories bool -} -``` -| Field | Description | Win | Mac | Lin | -| -------------------------- | ---------------------------------------------- | --- | --- | --- | -| DefaultDirectory | The directory the dialog will show when opened | ✅ | ✅ | ✅ | -| DefaultFilename | The default filename | ✅ | ✅ | ✅ | -| Title | Title for the dialog | ✅ | ✅ | ✅ | -| [Filters](#filefilter) | A list of file filters | ✅ | ✅ | ✅ | -| ShowHiddenFiles | Show files hidden by the system | | ✅ | ✅ | -| CanCreateDirectories | Allow user to create directories | | ✅ | | -| ResolvesAliases | If true, returns the file not the alias | | ✅ | | -| TreatPackagesAsDirectories | Allow navigating into packages | | ✅ | | - - -### SaveDialogOptions - -```go -type SaveDialogOptions struct { - DefaultDirectory string - DefaultFilename string - Title string - Filters []FileFilter - ShowHiddenFiles bool - CanCreateDirectories bool - TreatPackagesAsDirectories bool -} -``` - -| Field | Description | Win | Mac | Lin | -| -------------------------- | ---------------------------------------------- | --- | --- | --- | -| DefaultDirectory | The directory the dialog will show when opened | ✅ | ✅ | ✅ | -| DefaultFilename | The default filename | ✅ | ✅ | ✅ | -| Title | Title for the dialog | ✅ | ✅ | ✅ | -| [Filters](#filefilter) | A list of file filters | ✅ | ✅ | ✅ | -| ShowHiddenFiles | Show files hidden by the system | | ✅ | ✅ | -| CanCreateDirectories | Allow user to create directories | | ✅ | | -| TreatPackagesAsDirectories | Allow navigating into packages | | ✅ | | - -### MessageDialogOptions - -```go -type MessageDialogOptions struct { - Type DialogType - Title string - Message string - Buttons []string - DefaultButton string - CancelButton string -} -``` -| Field | Description | Win | Mac | Lin | -| ------------- | ------------------------------------------------------------------------- | --- | --- | --- | -| Type | The type of message dialog, eg question, info... | ✅ | ✅ | ✅ | -| Title | Title for the dialog | ✅ | ✅ | ✅ | -| Message | The message to show the user | ✅ | ✅ | ✅ | -| Buttons | A list of button titles | | ✅ | | -| DefaultButton | The button with this text should be treated as default. Bound to `return` | | ✅ | | -| CancelButton | The button with this text should be treated as cancel. Bound to `escape` | | ✅ | | - -#### Windows - -Windows has standard dialog types in which the buttons are not customisable. -The value returned will be one of: "Ok", "Cancel", "Abort", "Retry", "Ignore", "Yes", "No", "Try Again" or "Continue" - -#### Linux - -Linux has standard dialog types in which the buttons are not customisable. -The value returned will be one of: "Ok", "Cancel", "Yes", "No" - -#### Mac - -A message dialog on Mac may specify up to 4 buttons. If no `DefaultButton` or `CancelButton` is given, the first button -is considered default and is bound to the `return` key. - -For the following code: -```go -selection, err := runtime.MessageDialog(b.ctx, runtime.MessageDialogOptions{ - Title: "It's your turn!", - Message: "Select a number", - Buttons: []string{"one", "two", "three", "four"}, -}) -``` -the first button is shown as default: -
- -
-
- -And if we specify `DefaultButton` to be "two": -```go -selection, err := runtime.MessageDialog(b.ctx, runtime.MessageDialogOptions{ - Title: "It's your turn!", - Message: "Select a number", - Buttons: []string{"one", "two", "three", "four"}, - DefaultButton: "two", -}) -``` -the second button is shown as default. When `return` is pressed, the value "two" is returned. -
- -
-
- -If we now specify `CancelButton` to be "three": -```go -selection, err := runtime.MessageDialog(b.ctx, runtime.MessageDialogOptions{ - Title: "It's your turn!", - Message: "Select a number", - Buttons: []string{"one", "two", "three", "four"}, - DefaultButton: "two", - CancelButton: "three", -}) -``` -the button with "three" is shown at the bottom of the dialog. When `escape` is pressed, the value "three" is returned: -
- -
-
-
-
- - -#### DialogType - -```go -const ( - InfoDialog DialogType = "info" - WarningDialog DialogType = "warning" - ErrorDialog DialogType = "error" - QuestionDialog DialogType = "question" - ) -``` - -### FileFilter - -```go -type FileFilter struct { - DisplayName string // Filter information EG: "Image Files (*.jpg, *.png)" - Pattern string // semi-colon separated list of extensions, EG: "*.jpg;*.png" -} -``` - -#### Windows - -Windows allows you to use multiple file filters in dialog boxes. Each FileFilter will show up as a separate entry in the -dialog: - -
- -
-
-
-
- -#### Linux - -Linux allows you to use multiple file filters in dialog boxes. Each FileFilter will show up as a separate entry in the -dialog: - -
- -
-
-
-
- - -#### Mac - -Mac dialogs only have the concept of a single set of patterns to filter files. If multiple FileFilters are provided, -Wails will use all the Patterns defined. - -Example: -```go - selection, err := runtime.OpenFileDialog(b.ctx, runtime.OpenDialogOptions{ - Title: "Select File", - Filters: []runtime.FileFilter{ - { - DisplayName: "Images (*.png;*.jpg)", - Pattern: "*.png;*.jpg", - }, { - DisplayName: "Videos (*.mov;*.mp4)", - Pattern: "*.mov;*.mp4", - }, - }, - }) -``` -This will result in the Open File dialog using `*.png,*.jpg,*.mov,*.mp4` as a filter. \ No newline at end of file diff --git a/website/versioned_docs/version-v2.0.0-beta.44/reference/runtime/events.mdx b/website/versioned_docs/version-v2.0.0-beta.44/reference/runtime/events.mdx deleted file mode 100644 index c08f83c8a..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/reference/runtime/events.mdx +++ /dev/null @@ -1,51 +0,0 @@ ---- -sidebar_position: 2 ---- - -# Events - -## Overview - -The Wails runtime provides a unified events system, where events can be emitted or received by either Go or Javascript. -Optionally, data may be passed with the events. Listeners will receive the data in the local data types. - -### EventsOn - -Go Signature: `EventsOn(ctx context.Context, eventName string, callback func(optionalData ...interface{}))` - -JS Signature: `EventsOn(eventName string, callback function(optionalData?: any))` - -This method sets up a listener for the given event name. When an event of type `eventName` is [emitted](#EventsEmit), -the callback is triggered. Any additional data sent with the emitted event will be passed to the callback. - -### EventsOff - -Go Signature: `EventsOff(ctx context.Context, eventName string)` - -JS Signature: `EventsOff(eventName string)` - -This method unregisters the listener for the given event name. - -### EventsOnce - -Go Signature: `EventsOnce(ctx context.Context, eventName string, callback func(optionalData ...interface{}))` - -JS Signature: `EventsOnce(eventName string, callback function(optionalData?: any))` - -This method sets up a listener for the given event name, but will only trigger once. - -### EventsOnMultiple - -Go Signature: `EventsOnMultiple(ctx context.Context, eventName string, callback func(optionalData ...interface{}), counter int)` - -JS Signature: `EventsOnMultiple(eventName string, callback function(optionalData?: any), counter int)` - -This method sets up a listener for the given event name, but will only trigger a maximum of `counter` times. - -### EventsEmit - -Go Signature: `EventsEmit(ctx context.Context, eventName string, optionalData ...interface{})` - -JS Signature: `EventsEmit(ctx context, optionalData function(optionalData?: any))` - -This method emits the given event. Optional data may be passed with the event. This will trigger any event listeners. diff --git a/website/versioned_docs/version-v2.0.0-beta.44/reference/runtime/intro.mdx b/website/versioned_docs/version-v2.0.0-beta.44/reference/runtime/intro.mdx deleted file mode 100644 index 0a33acdf9..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/reference/runtime/intro.mdx +++ /dev/null @@ -1,70 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Introduction - -The runtime is a library that provides utility methods for your application. There is both a Go and Javascript runtime -and the aim is to try and keep them at parity where possible. - -The Go Runtime is available through importing `github.com/wailsapp/wails/v2/pkg/runtime`. All methods in this package -take a context as the first parameter. This context should be obtained from the [OnStartup](../options.mdx#onstartup) -or [OnDomReady](../options.mdx#ondomready) hooks. - -:::info Note - -Whilst the context will be provided to the -[OnStartup](../options.mdx#onstartup) method, there's no guarantee the runtime will work in this method as -the window is initialising in a different thread. If -you wish to call runtime methods at startup, use [OnDomReady](../options.mdx#ondomready). - -::: - -The Javascript library is available to the frontend via the `window.runtime` map. There is a runtime package generated when using `dev` -mode that provides Typescript declarations for the runtime. This should be located in the `wailsjs` directory in your -frontend directory. - -### Hide - -Go Signature: `Hide(ctx context.Context)` - -Hides the application. - -:::info Note -On Mac, this will hide the application in the same way as the `Hide` menu item in standard Mac applications. -This is different to hiding the window, but the application still being in the foreground. -For Windows and Linux, this is currently the same as `WindowHide`. -::: - -### Show - -Go Signature: `Show(ctx context.Context)` - -Shows the application. - -:::info Note -On Mac, this will bring the application back into the foreground. -For Windows and Linux, this is currently the same as `WindowShow`. -::: - -### Quit - -Go Signature: `Quit(ctx context.Context)` - -Quits the application. - -### Environment - -Go Signature: `Environment(ctx context.Context) EnvironmentInfo` - -Returns details of the current environment. - -#### EnvironmentInfo - -```go -type EnvironmentInfo struct { - BuildType string // Either "production", "debug" or "dev" -} -``` - - diff --git a/website/versioned_docs/version-v2.0.0-beta.44/reference/runtime/log.mdx b/website/versioned_docs/version-v2.0.0-beta.44/reference/runtime/log.mdx deleted file mode 100644 index 713838008..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/reference/runtime/log.mdx +++ /dev/null @@ -1,153 +0,0 @@ ---- -sidebar_position: 3 ---- - -# Log - -## Overview - -The Wails runtime provides a logging mechanism that may be called from Go or Javascript. Like most -loggers, there are a number of log levels: - - - Trace - - Debug - - Info - - Warning - - Error - - Fatal - -The logger will output any log message at the current, or higher, log level. Example: The `Debug` log -level will output all messages except `Trace` messages. - -### LogPrint - -Go Signature: `LogPrint(ctx context.Context, message string)` - -JS Signature: `LogPrint(message: string)` - -Logs the given message as a raw message. - -### LogPrintf - -Go Signature: `LogPrintf(ctx context.Context, format string, args ...interface{})` - -Logs the given message as a raw message. - -### LogTrace - -Go Signature: `LogTrace(ctx context.Context, message string)` - -JS Signature: `LogTrace(message: string)` - -Logs the given message at the `Trace` log level. - -### LogTracef - -Go Signature: `LogTracef(ctx context.Context, format string, args ...interface{})` - -Logs the given message at the `Trace` log level. - -### LogDebug - -Go Signature: `LogDebug(ctx context.Context, message string)` - -JS Signature: `LogDebug(message: string)` - -Logs the given message at the `Debug` log level. - -### LogDebugf - -Go Signature: `LogDebugf(ctx context.Context, format string, args ...interface{})` - -Logs the given message at the `Debug` log level. - -### LogInfo - -Go Signature: `LogInfo(ctx context.Context, message string)` - -JS Signature: `LogInfo(message: string)` - -Logs the given message at the `Info` log level. - -### LogInfof - -Go Signature: `LogInfof(ctx context.Context, format string, args ...interface{})` - -Logs the given message at the `Info` log level. - -### LogWarning - -Go Signature: `LogWarning(ctx context.Context, message string)` - -JS Signature: `LogWarning(message: string)` - -Logs the given message at the `Warning` log level. - -### LogWarningf - -Go Signature: `LogWarningf(ctx context.Context, format string, args ...interface{})` - -Logs the given message at the `Warning` log level. - -### LogError - -Go Signature: `LogError(ctx context.Context, message string)` - -JS Signature: `LogError(message: string)` - -Logs the given message at the `Error` log level. - -### LogErrorf - -Go Signature: `LogErrorf(ctx context.Context, format string, args ...interface{})` - -Logs the given message at the `Error` log level. - -### LogFatal - -Go Signature: `LogFatal(ctx context.Context, message string)` - -JS Signature: `LogFatal(message: string)` - -Logs the given message at the `Fatal` log level. - -### LogFatalf - -Go Signature: `LogFatalf(ctx context.Context, format string, args ...interface{})` - -Logs the given message at the `Fatal` log level. - -### LogSetLogLevel - -Go Signature: `LogSetLogLevel(ctx context.Context, level logger.LogLevel)` - -JS Signature: `LogSetLogLevel(level: number)` - -Sets the log level. In Javascript, the number relates to the following log levels: - -| Value | Log Level | -| ----- | --------- | -| 1 | Trace | -| 2 | Debug | -| 3 | Info | -| 4 | Warning | -| 5 | Error | - -## Using a Custom Logger - -A custom logger may be used by providing it using the [Logger](../options.mdx#logger) -application option. The only requirement is that the logger implements the `logger.Logger` interface -defined in `github.com/wailsapp/wails/v2/pkg/logger`: - -```go title="logger.go" -type Logger interface { - Print(message string) - Trace(message string) - Debug(message string) - Info(message string) - Warning(message string) - Error(message string) - Fatal(message string) -} -``` - diff --git a/website/versioned_docs/version-v2.0.0-beta.44/reference/runtime/menu.mdx b/website/versioned_docs/version-v2.0.0-beta.44/reference/runtime/menu.mdx deleted file mode 100644 index 7d2d01783..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/reference/runtime/menu.mdx +++ /dev/null @@ -1,25 +0,0 @@ ---- -sidebar_position: 6 ---- - -# Menu - -## Overview - -These methods are related to the application menu. - -:::info Javascript - Menu is currently unsupported in the JS runtime. -::: - -### MenuSetApplicationMenu -Go Signature: `MenuSetApplicationMenu(ctx context.Context, menu *menu.Menu)` - -Sets the application menu to the given [menu](../menus.mdx) . - -### MenuUpdateApplicationMenu -Go Signature: `MenuUpdateApplicationMenu(ctx context.Context)` - -Updates the application menu, picking up any changes to the menu passed to `MenuSetApplicationMenu`. - - diff --git a/website/versioned_docs/version-v2.0.0-beta.44/reference/runtime/window.mdx b/website/versioned_docs/version-v2.0.0-beta.44/reference/runtime/window.mdx deleted file mode 100644 index baf6222e5..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/reference/runtime/window.mdx +++ /dev/null @@ -1,224 +0,0 @@ ---- -sidebar_position: 4 ---- - -# Window - -## Overview - -These methods give control of the application window. - -### WindowSetTitle -Go Signature: `WindowSetTitle(ctx context.Context, title string)` - -JS Signature: `WindowSetTitle(title: string)` - -Sets the text in the window title bar. - -### WindowFullscreen -Go Signature: `WindowFullscreen(ctx context.Context)` - -JS Signature: `WindowFullscreen()` - -Makes the window full screen. - -### WindowUnfullscreen -Go Signature: `WindowUnfullscreen(ctx context.Context)` - -JS Signature: `WindowUnfullscreen()` - -Restores the previous window dimensions and position prior to full screen. - -### WindowCenter -Go Signature: `WindowCenter(ctx context.Context)` - -JS Signature: `WindowCenter()` - -Centers the window on the monitor the window is currently on. - -### WindowReload -Go Signature: `WindowReload(ctx context.Context)` - -JS Signature: `WindowReload()` - -Performs a "reload" (Reloads current page). - -### WindowReloadApp -Go Signature: `WindowReloadApp(ctx context.Context)` - -JS Signature: `WindowReloadApp()` - -Reloads the application frontend. - -### WindowSetSy - -### WindowSetSystemDefaultTheme -Go Signature: `WindowSetSystemDefaultTheme(ctx context.Context)` - -JS Signature: `WindowSetSystemDefaultTheme()` - -Windows only. - -Sets window theme to system default (dark/light). - -### WindowSetLightTheme -Go Signature: `WindowSetLightTheme(ctx context.Context)` - -JS Signature: `WindowSetLightTheme()` - -Windows only. - -Sets window theme to light. - -### WindowSetDarkTheme -Go Signature: `WindowSetDarkTheme(ctx context.Context)` - -JS Signature: `WindowSetDarkTheme()` - -Windows only. - -Sets window theme to dark. - -### WindowShow -Go Signature: `WindowShow(ctx context.Context)` - -JS Signature: `WindowShow()` - -Shows the window, if it is currently hidden. - -### WindowHide -Go Signature: `WindowHide(ctx context.Context)` - -JS Signature: `WindowHide()` - -Hides the window, if it is currently visible. - -### WindowSetSize -Go Signature: `WindowSetSize(ctx context.Context, width int, height int)` - -JS Signature: `WindowSetSize(size: Size)` - -Sets the width and height of the window. - -### WindowGetSize -Go Signature: `WindowGetSize(ctx context.Context) (width int, height int)` - -JS Signature: `WindowGetSize() : Size` - -Gets the width and height of the window. - -### WindowSetMinSize -Go Signature: `WindowSetMinSize(ctx context.Context, width int, height int)` - -JS Signature: `WindowSetMinSize(size: Size)` - -Sets the minimum window size. -Will resize the window if the window is currently smaller than the given dimensions. - -Setting a size of `0,0` will disable this constraint. - -### WindowSetMaxSize -Go Signature: `WindowSetMaxSize(ctx context.Context, width int, height int)` - -JS Signature: `WindowSetMaxSize(size: Size)` - -Sets the maximum window size. -Will resize the window if the window is currently larger than the given dimensions. - -Setting a size of `0,0` will disable this constraint. - -### WindowSetAlwaysOnTop -Go Signature: `WindowSetAlwaysOnTop(ctx context.Context, b bool)` - -JS Signature: `WindowSetAlwaysOnTop(b: Boolen)` - -Sets the window AlwaysOnTop or not on top. - - -### WindowSetPosition -Go Signature: `WindowSetPosition(ctx context.Context, x int, y int)` - -JS Signature: `WindowSetPosition(position: Position)` - -Sets the window position relative to the monitor the window is currently on. - -### WindowGetPosition -Go Signature: `WindowGetPosition(ctx context.Context) (x int, y int)` - -JS Signature: `WindowGetPosition() : Position` - -Gets the window position relative to the monitor the window is currently on. - -### WindowMaximise -Go Signature: `WindowMaximise(ctx context.Context)` - -JS Signature: `WindowMaximise()` - -Maximises the window to fill the screen. - -### WindowUnmaximise -Go Signature: `WindowUnmaximise(ctx context.Context)` - -JS Signature: `WindowUnmaximise()` - -Restores the window to the dimensions and position prior to maximising. - -### WindowToggleMaximise -Go Signature: `WindowToggleMaximise(ctx context.Context)` - -JS Signature: `WindowToggleMaximise()` - -Toggles between Maximised and UnMaximised. - -### WindowMinimise -Go Signature: `WindowMinimise(ctx context.Context)` - -JS Signature: `WindowMinimise()` - -Minimises the window. - -### WindowUnminimise -Go Signature: `WindowUnminimise(ctx context.Context)` - -JS Signature: `WindowUnminimise()` - -Restores the window to the dimensions and position prior to minimising. - -### WindowSetBackgroundColour -Go Signature: `WindowSetBackgroundColour(ctx context.Context, R, G, B, A uint8)` - -JS Signature: `WindowSetBackgroundColour(R, G, B, A)` - -Sets the background colour of the window to the given RGBA colour definition. -This colour will show through for all transparent pixels. - -Valid values for R, G, B and A are 0-255. - -:::info Windows - -On Windows, only alpha values of 0 or 255 are supported. -Any value that is not 0 will be considered 255. - -::: - -## Typescript Object Definitions - -### Position - -```ts -interface Position { - x: number; - y: number; -} -``` - -### Size - -```ts -interface Size { - w: number; - h: number; -} -``` - - diff --git a/website/versioned_docs/version-v2.0.0-beta.44/tutorials/_category_.json b/website/versioned_docs/version-v2.0.0-beta.44/tutorials/_category_.json deleted file mode 100644 index dfac1d175..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/tutorials/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Tutorials", - "position": 70 -} diff --git a/website/versioned_docs/version-v2.0.0-beta.44/tutorials/helloworld.mdx b/website/versioned_docs/version-v2.0.0-beta.44/tutorials/helloworld.mdx deleted file mode 100644 index 8edde09f7..000000000 --- a/website/versioned_docs/version-v2.0.0-beta.44/tutorials/helloworld.mdx +++ /dev/null @@ -1,113 +0,0 @@ ---- -sidebar_position: 10 ---- - -# Hello World - -The aim of this tutorial is to get you up and running with the most basic -application using Wails. You will be able to: - - - Create a new Wails application - - Build the application - - Run the application - -:::note -This tutorial uses Windows as the target platform. Output will vary slightly -depending on your operating system. -::: - -## Create a new Wails application - -To create a new Wails application using the default vanilla JS template, -you need to run the following command: - -```bash -wails init -n helloworld -``` - -You should see something similar to the following: - -``` -Wails CLI v2.0.0 - -Initialising Project 'helloworld' ---------------------------------- - -Project Name: helloworld -Project Directory: C:\Users\leaan\tutorial\helloworld -Project Template: vanilla -Template Support: https://wails.io - -Initialised project 'helloworld' in 232ms. -``` - -This will create a new directory called `helloworld` in the current directory. -In this directory, you will find a number of files: - -``` -build/ - Contains the build files + compiled application -frontend/ - Contains the frontend files -app.go - Contains the application code -main.go - The main program with the application configuration -wails.json - The project configuration file -go.mod - The go module file -go.sum - The go module checksum file -``` - -## Build the application - -To build the application, change to the new `helloworld` project directory and run the following command: - -```bash -wails build -``` - -You should see something like the following: - -``` -Wails CLI v2.0.0 - -App Type: desktop -Platforms: windows/amd64 -Compiler: C:\Users\leaan\go\go1.18.3\bin\go.exe -Build Mode: Production -Skip Frontend: false -Compress: false -Package: true -Clean Build Dir: false -LDFlags: "" -Tags: [] -Race Detector: false - -Building target: windows/amd64 ------------------------------- - - Installing frontend dependencies: Done. - - Compiling frontend: Done. - - Generating bundle assets: Done. - - Compiling application: Done. -Built 'C:\Users\leaan\tutorial\helloworld\build\bin\helloworld.exe' in 10.616s. -``` - -This has compiled the application and saved it in the `build/bin` directory. - -## Run the application - -If we view the `build/bin` directory in Windows Explorer, we should see our project binary: - -
- -
-
- -We can run it by simply double-clicking the `helloworld.exe` file. - -On Mac, Wails generates a `helloworld.app` file which can be run by double-clicking it. - -On Linux, you can run the application using `./helloworld` from the `build/bin` directory. - -You should see the application working as expected: - -
- -
-
diff --git a/website/versioned_docs/version-v2.0.0-rc.1/appendix/_category_.json b/website/versioned_docs/version-v2.0.0-rc.1/appendix/_category_.json deleted file mode 100644 index 83af4ca28..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/appendix/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Appendix", - "position": 70 -} diff --git a/website/versioned_docs/version-v2.0.0-rc.1/community/_category_.json b/website/versioned_docs/version-v2.0.0-rc.1/community/_category_.json deleted file mode 100644 index 524986e1e..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/community/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Community", - "position": 50 -} diff --git a/website/versioned_docs/version-v2.0.0-rc.1/community/links.mdx b/website/versioned_docs/version-v2.0.0-rc.1/community/links.mdx deleted file mode 100644 index d081cb9b3..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/community/links.mdx +++ /dev/null @@ -1,24 +0,0 @@ ---- -sidebar_position: 2 ---- - -# Links - -This page serves as a list for community related links. Please submit a PR (click `Edit this page` at the bottom) -to submit links. - -## Awesome Wails - -The [definitive list](https://github.com/wailsapp/awesome-wails) of links related to Wails. - -## Support Channels - -- [Gophers Slack Channel](https://gophers.slack.com/messages/CJ4P9F7MZ/) -- [Gophers Slack Channel Invite](https://invite.slack.golangbridge.org/) -- [Github Issues](https://github.com/wailsapp/wails/issues) -- [v2 Beta Discussion Board](https://github.com/wailsapp/wails/discussions/828) - -## Social Media - -- [Twitter](https://twitter.com/wailsapp) -- [Wails Chinese Community QQ Group](https://qm.qq.com/cgi-bin/qm/qr?k=PmIURne5hFGNd7QWzW5qd6FV-INEjNJv&jump_from=webapi) - Group number: 1067173054 diff --git a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/_category_.json b/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/_category_.json deleted file mode 100644 index 276e283b7..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Showcase", - "position": 1 -} diff --git a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/emailit.mdx b/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/emailit.mdx deleted file mode 100644 index 4a1ebe835..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/emailit.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# EmailIt - -

- -
-

- -[EmailIt](https://github.com/raguay/EmailIt/) is a Wails 2 program that is a markdown based email sender only with nine notepads, scripts to manipulate the text, and templates. It also has a builtin [Node-Red](https://nodered.org/) server, scripts terminal, and the [ScriptBar](https://github.com/raguay/ScriptBarApp) program for displaying results from Node-Red or a script on your system. Documentation is very scarce, but the programs works. It’s built using Wails2 and Svelte, and the download is a universal macOS application. diff --git a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/encrypteasy.mdx b/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/encrypteasy.mdx deleted file mode 100644 index 13c2d8345..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/encrypteasy.mdx +++ /dev/null @@ -1,10 +0,0 @@ -# EncryptEasy - -

- -
-

- -**[EncryptEasy](https://www.encrypteasy.app) is a simple and easy to use PGP encryption tool, managing all your and your contacts keys. Encryption should be simple. Developed with Wails.** - -Encrypting messages using PGP is the industry standard. Everyone has a private and a public key. Your private key, well, needs to be kept private so only you can read messages. Your public key is distributed to anyone who wants to send you secret, encrypted messages. Managing keys, encrypting messages and decrypting messages should be a smooth experience. EncryptEasy is all about making it easy. diff --git a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/filehound.mdx b/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/filehound.mdx deleted file mode 100644 index 741c14034..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/filehound.mdx +++ /dev/null @@ -1,22 +0,0 @@ -# FileHound Export Utility - -

- -
-

- -[FileHound Export Utility](https://www.filehound.co.uk/) FileHound is a cloud document management platform made for secure file retention, business process automation and SmartCapture capabilities. - -The FileHound Export Utility allows FileHound Administrators the ability to run a secure document and data extraction tasks for alternative back-up and recovery purposes. This application will download all documents and/or meta data saved in FileHound based on the filters you choose. The metadata will be exported in both JSON and XML formats. - -Backend built with: -Go 1.15 -Wails 1.11.0 -go-sqlite3 1.14.6 -go-linq 3.2 - -Frontend with: -Vue 2.6.11 -Vuex 3.4.0 -Typescript -Tailwind 1.9.6 diff --git a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/minecraftupdater.mdx b/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/minecraftupdater.mdx deleted file mode 100644 index 11247339d..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/minecraftupdater.mdx +++ /dev/null @@ -1,10 +0,0 @@ -# Minecraft Updater - -

- -
-

- -[Minecraft Updater](https://github.com/Gurkengewuerz/MinecraftModUpdater) is a utility tool to update and synchronize Minecraft mods for your userbase. It’s built using Wails2 and React with [antd](https://ant.design/) as frontend framework. diff --git a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/modalfilemanager.mdx b/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/modalfilemanager.mdx deleted file mode 100644 index a7ae8c492..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/modalfilemanager.mdx +++ /dev/null @@ -1,12 +0,0 @@ -# Modal File Manager - -

- -
-

- -[Modal File Manager](https://github.com/raguay/ModalFileManager) is a dual pane file manager using web technologies. My original design was based on NW.js and can be found [here](https://github.com/raguay/ModalFileManager-NWjs). This version uses the same Svelte based frontend code (but it has be greatly modified since the departure from NW.js), but the backend is a [Wails 2](https://wails.io/) implementation. By using this implementation, I no longer use command line `rm`, `cp`, etc. commands. It is fully coded using Go and runs much faster than the previous versions. - -This file manager is designed around the same principle as Vim: a state controlled keyboard actions. The number of states isn't fixed, but very programmable. Therefore, an infinite number of keyboard configurations can be created and used. This is the main difference from other file managers. diff --git a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/mollywallet.mdx b/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/mollywallet.mdx deleted file mode 100644 index 534b097ca..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/mollywallet.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Molley Wallet - -

- -
-

- -[Molly Wallet](https://github.com/grvlle/constellation_wallet/) the official $DAG wallet of the Constellation Network. It'll let users interact with the Hypergraph Network in various ways, not limited to producing $DAG transactions. diff --git a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/october.mdx b/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/october.mdx deleted file mode 100644 index 889d2dd9e..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/october.mdx +++ /dev/null @@ -1,12 +0,0 @@ -# October - -

- -
-

- -[October](https://october.utf9k.net) is a small Wails application that makes it really easy to extract highlights from [Kobo eReaders](https://en.wikipedia.org/wiki/Kobo_eReader) and then forward them to [Readwise](https://readwise.io). - -It has a relatively small scope with all platform versions weighing in under 10MB, and that's without enabling [UPX compression](https://upx.github.io/)! - -In contrast, the author's previous attempts with Electron quickly bloated to several hundred megabytes. diff --git a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/optimus.mdx b/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/optimus.mdx deleted file mode 100644 index c3eb79507..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/optimus.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Optimus - -

- -
-

- -[Optimus](https://github.com/splode/optimus) is a desktop image optimization application. It supports conversion and compression between WebP, JPEG, and PNG image formats. diff --git a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/portfall.mdx b/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/portfall.mdx deleted file mode 100644 index 4cc2c63c9..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/portfall.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Portfall - -

- -
-

- -[Portfall](https://github.com/rekon-oss/portfall) - A desktop k8s port-forwarding portal for easy access to all your cluster UIs diff --git a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/restic-browser.mdx b/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/restic-browser.mdx deleted file mode 100644 index 1505ce07a..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/restic-browser.mdx +++ /dev/null @@ -1,10 +0,0 @@ -# Restic Browser - -

- -
-

- -[Restic-Browser](https://github.com/emuell/restic-browser) - A simple, cross-platform [restic](https://github.com/restic/restic) backup GUI for browsing and restoring restic repositories. diff --git a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/riftshare.mdx b/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/riftshare.mdx deleted file mode 100644 index 5223e88cf..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/riftshare.mdx +++ /dev/null @@ -1,19 +0,0 @@ -# RiftShare - -

- -
-

- -Easy, Secure, and Free file sharing for everyone. Learn more at [Riftshare.app](https://riftshare.app) - -## Features - -- Easy secure file sharing between computers both in the local network and through the internet -- Supports sending files or directories securely through the [magic wormhole protocol](https://magic-wormhole.readthedocs.io/en/latest/) -- Compatible with all other apps using magic wormhole (magic-wormhole or wormhole-william CLI, wormhole-gui, etc.) -- Automatic zipping of multiple selected files to send at once -- Full animations, progress bar, and cancellation support for sending and receiving -- Native OS File Selection -- Open files in one click once received -- Auto Update - don't worry about having the latest release! diff --git a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/scriptbar.mdx b/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/scriptbar.mdx deleted file mode 100644 index aaa556f92..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/scriptbar.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# ScriptBar - -

- -
-

- -[ScriptBar](https://GitHub.com/raguay/ScriptBarApp) is a program to show the output of the embedded [Node-Red](https://nodered.org) server in the [EmailIt](https://GitHub.com/raguay/EmailIt) application. It also displays the output of scripts on your system. ScriptBar doesn't put them in the menubar, but has them all in a convient window for easy viewing. You can have multiple tabs to have many different things show. You can also keep the links to your most visited web sites. diff --git a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/surge.mdx b/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/surge.mdx deleted file mode 100644 index 2d895dc29..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/surge.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Surge - -

- -
-

- -[Surge](https://getsurge.io/) is a p2p filesharing app designed to utilize blockchain technologies to enable 100% anonymous file transfers. Surge is end-to-end encrypted, decentralized and open source. diff --git a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/wally.mdx b/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/wally.mdx deleted file mode 100644 index 2a2498f40..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/wally.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Wally - -

- -
-

- -[Wally](https://ergodox-ez.com/pages/wally) is the official firmware flasher for [Ergodox](https://ergodox-ez.com/) keyboards. It looks great and is a fantastic example of what you can achieve with Wails: the ability to combine the power of Go and the rich graphical tools of the web development world. diff --git a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/wombat.mdx b/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/wombat.mdx deleted file mode 100644 index 54cedacea..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/wombat.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Wombat - -

- -
-

- -[Wombat](https://github.com/rogchap/wombat) is a cross platform gRPC client. diff --git a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/ytd.mdx b/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/ytd.mdx deleted file mode 100644 index 178ff0529..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/community/showcase/ytd.mdx +++ /dev/null @@ -1,8 +0,0 @@ -# Ytd - -

- -
-

- -[Ytd](https://github.com/marcio199226/ytd/tree/v2-wails) is an app for downloading tracks from youtube, creating offline playlists and share them with your friends, your friends will be able to playback your playlists or download them for offline listening, has an built-in player. diff --git a/website/versioned_docs/version-v2.0.0-rc.1/community/templates.mdx b/website/versioned_docs/version-v2.0.0-rc.1/community/templates.mdx deleted file mode 100644 index 80551784c..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/community/templates.mdx +++ /dev/null @@ -1,53 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Templates - -This page serves as a list for community supported templates. Please submit a PR (click `Edit this page` at the bottom) -to include your templates. To build your own template, please see the [Templates](../guides/templates.mdx) guide. - -To use these templates, run `wails init -n "Your Project Name" -t [the link below[@version]]` - -If there is no version suffix, the main branch code template is used by default. If there is a version suffix, the code template corresponding to the tag of this version is used. - -Example: `wails init -n "Your Project Name" -t https://github.com/misitebao/wails-template-vue` - -:::warning Attention - -**The Wails project does not maintain, is not responsible nor liable for 3rd party templates!** - -If you are unsure about a template, inspect `package.json` and `wails.json` for what scripts are run and what packages are installed. - -::: - -## Vue - -- [wails-template-vue](https://github.com/misitebao/wails-template-vue) - A template using Vite,Vue and Vue-Router(Support both JavaScript and TypeScript) -- [wails-vite-vue-ts](https://github.com/codydbentley/wails-vite-vue-ts) - Vue 3 TypeScript with Vite (and instructions to add features) -- [wails-vite-vue-the-works](https://github.com/codydbentley/wails-vite-vue-the-works) - Vue 3 TypeScript with Vite, Vuex, Vue Router, Sass, and ESLint + Prettier - -## Angular - -- [wails-angular-template](https://github.com/TAINCER/wails-angular-template) - Angular with TypeScript, Sass, Hot-Reload, Code-Splitting and i18n - -## React - -- [wails-react-template](https://github.com/AlienRecall/wails-react-template) - A template using reactjs -- [wails-react-template](https://github.com/flin7/wails-react-template) - A minimal template for React that supports live development -- [wails-template-nextjs](https://github.com/LGiki/wails-template-nextjs) - A template using Next.js and TypeScript - -## Svelte - -- [wails-svelte-template](https://github.com/raitonoberu/wails-svelte-template) - A template using Svelte -- [wails-vite-svelte-template](https://github.com/BillBuilt/wails-vite-svelte-template) - A template using Svelte and Vite -- [wails-vite-svelte-tailwind-template](https://github.com/BillBuilt/wails-vite-svelte-tailwind-template) - A template using Svelte and Vite with TailwindCSS v3 -- [wails-sveltekit-template](https://github.com/h8gi/wails-sveltekit-template) - A template using SvelteKit - -## Elm - -- [wails-elm-template](https://github.com/benjamin-thomas/wails-elm-template) - Develop your GUI app with functional programming and a **snappy** hot-reload setup :tada: :rocket: - -## Pure JavaScript (Vanilla) - -- [wails-pure-js-template](https://github.com/KiddoV/wails-pure-js-template) - A template with nothing but just basic JavaScript, HTML, and CSS \ No newline at end of file diff --git a/website/versioned_docs/version-v2.0.0-rc.1/gettingstarted/_category_.json b/website/versioned_docs/version-v2.0.0-rc.1/gettingstarted/_category_.json deleted file mode 100644 index 597b920df..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/gettingstarted/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Getting Started", - "position": 10 -} diff --git a/website/versioned_docs/version-v2.0.0-rc.1/gettingstarted/building.mdx b/website/versioned_docs/version-v2.0.0-rc.1/gettingstarted/building.mdx deleted file mode 100644 index 33e19b144..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/gettingstarted/building.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -sidebar_position: 6 ---- - -# Compiling your Project - -From the project directory, run `wails build`. -This will compile your project and save the production-ready binary in the `build/bin` directory. - -If you run the binary, you should see the default application: - -
- -
-
- -For more details on compilation options, please refer to the [CLI Reference](../reference/cli.mdx#build). diff --git a/website/versioned_docs/version-v2.0.0-rc.1/gettingstarted/development.mdx b/website/versioned_docs/version-v2.0.0-rc.1/gettingstarted/development.mdx deleted file mode 100644 index 54dda5faa..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/gettingstarted/development.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -sidebar_position: 5 ---- - -# Developing your Application - -You can run your application in development mode by running `wails dev` from your project directory. This will do the following things: - -- Build your application and run it -- Bind your Go code to the frontend so it can be called from Javascript -- Using the power of [vite](https://vitejs.dev/), will watch for modifications in your Go files and rebuild/re-run on change -- Sets up a [webserver](http://localhost:34115) that will serve your application over a browser. This allows you to use your favourite browser extensions. You can even call your Go code from the console - -To get started, run `wails dev` in the project directory. More information on this can be found [here](../reference/cli.mdx#dev). - -Coming soon: Tutorial diff --git a/website/versioned_docs/version-v2.0.0-rc.1/gettingstarted/firstproject.mdx b/website/versioned_docs/version-v2.0.0-rc.1/gettingstarted/firstproject.mdx deleted file mode 100644 index 883b3dde6..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/gettingstarted/firstproject.mdx +++ /dev/null @@ -1,134 +0,0 @@ ---- -sidebar_position: 2 ---- - -# Creating a Project - -## Project Generation - -Now that the CLI is installed, you can generate a new project by using the `wails init` command. - -Pick your favourite framework: - - - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - - - - Generate a Svelte project using Javascript with:

- - wails init -n myproject -t svelte - -If you would rather use Typescript:
- - wails init -n myproject -t svelte-ts - -
- - Generate a React project using Javascript with:

- - wails init -n myproject -t react - -If you would rather use Typescript:
- - wails init -n myproject -t react-ts - -
- - Generate a Vue project using Javascript with:

- - wails init -n myproject -t vue - -If you would rather use Typescript:
- - wails init -n myproject -t vue-ts - -
- - Generate a Preact project using Javascript with:

- - wails init -n myproject -t preact - -If you would rather use Typescript:
- - wails init -n myproject -t preact-ts - -
- - Generate a Lit project using Javascript with:

- - wails init -n myproject -t lit - -If you would rather use Typescript:
- - wails init -n myproject -t lit-ts - -
- - Generate a Vanilla project using Javascript with:

- - wails init -n myproject -t vanilla - -If you would rather use Typescript:
- - wails init -n myproject -t vanilla-ts - -
-
- - - -
- -There are also [community templates](../community/templates.mdx) available that offer different capabilities and frameworks. - -To see the other options available, you can run `wails init -help`. -More details can be found in the [CLI Reference](../reference/cli.mdx#init). - -## Project Layout - -Wails projects have the following layout: - -``` -. -├── build/ -│ ├── appicon.png -│ ├── darwin/ -│ └── windows/ -├── frontend/ -├── go.mod -├── go.sum -├── main.go -└── wails.json -``` - -### Project structure rundown - -- `/main.go` - The main application -- `/frontend/` - Frontend project files -- `/build/` - Project build directory -- `/build/appicon.png` - The application icon -- `/build/darwin/` - Mac specific project files -- `/build/windows/` - Windows specific project files -- `/wails.json` - The project configuration -- `/go.mod` - Go module file -- `/go.sum` - Go module checksum file - -The `frontend` directory has nothing specific to Wails and can be any frontend project of your choosing. - -The `build` directory is used during the build process. These files may be updated to customise your builds. If -files are removed from the build directory, default versions will be regenerated. - -The default module name in `go.mod` is "changeme". You should change this to something more appropriate. diff --git a/website/versioned_docs/version-v2.0.0-rc.1/gettingstarted/installation.mdx b/website/versioned_docs/version-v2.0.0-rc.1/gettingstarted/installation.mdx deleted file mode 100644 index 98d3032cd..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/gettingstarted/installation.mdx +++ /dev/null @@ -1,98 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Installation - -## Supported Platforms - -- Windows 10/11 AMD64/ARM64 -- MacOS 10.13+ AMD64 -- MacOS 11.0+ ARM64 -- Linux AMD64/ARM64 - -## Dependencies - -Wails has a number of common dependencies that are required before installation: - -- Go 1.17+ -- NPM (Node 15+) - -### Go - -Download Go from the [Go Downloads Page](https://go.dev/doc/install). - -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: `echo $PATH | grep go/bin` - -### NPM - -Download NPM 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. - -## Platform Specific Dependencies - -You will also need to install platform specific dependencies: - - - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - - - - Wails requires that the xcode command line tools are installed. This can be - done by running:
- xcode-select --install -
- - Wails requires that the{" "} - - WebView2 - {" "} - runtime is installed. Some Windows installations will already have this - installed. You can check using the wails doctor command (see - below). - - - Linux required the standard gcc build tools plus{" "} - libgtk3 and libwebkit. Rather than list a ton of - commands for different distros, Wails can try to determine what the - installation commands are for your specific distribution. Run{" "} - wails doctor after installation to be shown how to install the - dependencies. If your distro/package manager is not supported, please - consult the{" "} - Add Linux Distro guide. - -
- - - -## Optional Dependencies - -- [UPX](https://upx.github.io/) for compressing your applications. - -## Installing Wails - -Run `go install github.com/wailsapp/wails/v2/cmd/wails@latest` to install the Wails CLI. - -## System Check - -Running `wails 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 `wails` command appears to be missing? - -If your system is reporting that the `wails` command is missing, make sure you have followed the Go installation guide -correctly. Normally, it means that the `go/bin` directory in your User's home directory is not in the `PATH` environment -variable. You will also normally need to close and reopen any open command prompts so that changes to the environment -made by the installer are reflected at the command prompt. diff --git a/website/versioned_docs/version-v2.0.0-rc.1/guides/_category_.json b/website/versioned_docs/version-v2.0.0-rc.1/guides/_category_.json deleted file mode 100644 index 5935dad93..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/guides/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Guides", - "position": 50 -} diff --git a/website/versioned_docs/version-v2.0.0-rc.1/guides/application-development.mdx b/website/versioned_docs/version-v2.0.0-rc.1/guides/application-development.mdx deleted file mode 100644 index f8074d150..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/guides/application-development.mdx +++ /dev/null @@ -1,228 +0,0 @@ -# Application Development - -There are no hard and fast rules for developing applications with Wails, but there are some basic guidelines. - -## Application Setup - -The pattern used by the default templates are that `main.go` is used for configuring and running the application, whilst -`app.go` is used for defining the application logic. - -The `app.go` file will define a struct that has 2 methods which act as hooks into the main application: - -```go title="app.go" -type App struct { - ctx context.Context -} - -func NewApp() *App { - return &App{} -} - -func (a *App) startup(ctx context.Context) { - a.ctx = ctx -} - -func (a *App) shutdown(ctx context.Context) { -} -``` - -- The startup method is called as soon as Wails allocates the resources it needs and is a good place for creating resources, - setting up event listeners and anything else the application needs at startup. - It is given a `context.Context` which is usually saved in a struct field. This context is needed for calling the - [runtime](../reference/runtime/intro.mdx). If this method returns an error, the application will terminate. - In dev mode, the error will be output to the console. - -- The shutdown method will be called by Wails right at the end of the shutdown process. This is a good place to deallocate - memory and perform any shutdown tasks. - -The `main.go` file generally consists of a single call to `wails.Run()`, which accepts the application configuration. -The pattern used by the templates is that before the call to `wails.Run()`, an instance of the struct we defined in -`app.go` is created and saved in a variable called `app`. This configuration is where we add our callbacks: - -```go {3,9,10} title="main.go" -func main() { - - app := NewApp() - - err := wails.Run(&options.App{ - Title: "My App", - Width: 800, - Height: 600, - OnStartup: app.startup, - OnShutdown: app.shutdown, - }) - if err != nil { - log.Fatal(err) - } -} - -``` - -More information on application lifecycle hooks can be found [here](../howdoesitwork.mdx#application-lifecycle-callbacks). - -## Binding Methods - -It is likely that you will want to call Go methods from the frontend. This is normally done by adding public methods to -the already defined struct in `app.go`: - -```go {16-18} title="app.go" -type App struct { - ctx context.Context -} - -func NewApp() *App { - return &App{} -} - -func (a *App) startup(ctx context.Context) { - a.ctx = ctx -} - -func (a *App) shutdown(ctx context.Context) { -} - -func (a *App) Greet(name string) string { - return fmt.Sprintf("Hello %s!", name) -} -``` - -In the main application configuration, the `Bind` key is where we can tell Wails what we want to bind: - -```go {11-13} title="main.go" -func main() { - - app := NewApp() - - err := wails.Run(&options.App{ - Title: "My App", - Width: 800, - Height: 600, - OnStartup: app.startup, - OnShutdown: app.shutdown, - Bind: []interface{}{ - app, - }, - }) - if err != nil { - log.Fatal(err) - } -} - -``` - -This will bind all public methods in our `App` struct (it will never bind the startup and shutdown methods). - -### Dealing with context when binding multiple structs - -If you want to bind methods for multiple structs but want each struct to keep a reference to the context so that you -can use the runtime functions, a good pattern is to pass the context from the `OnStartup` method to your struct instances -: - -```go -func main() { - - app := NewApp() - otherStruct := NewOtherStruct() - - err := wails.Run(&options.App{ - Title: "My App", - Width: 800, - Height: 600, - OnStartup: func(ctx context.Context){ - app.SetContext(ctx) - otherStruct.SetContext(ctx) - }, - OnShutdown: app.shutdown, - Bind: []interface{}{ - app, - otherStruct - }, - }) - if err != nil { - log.Fatal(err) - } -} -``` - -More information on Binding can be found [here](../howdoesitwork.mdx#method-binding). - -## Application Menu - -Wails supports adding a menu to your application. This is done by passing a [Menu](../reference/menus.mdx#menu) struct -to application config. It's common to use a method that returns a Menu, and even more common for that to be a method on -the `App` struct used for the lifecycle hooks. - -```go {11} title="main.go" -func main() { - - app := NewApp() - - err := wails.Run(&options.App{ - Title: "My App", - Width: 800, - Height: 600, - OnStartup: app.startup, - OnShutdown: app.shutdown, - Menu: app.menu(), - Bind: []interface{}{ - app, - }, - }) - if err != nil { - log.Fatal(err) - } -} - -``` - -## Assets - -The great thing about the way Wails v2 handles assets is that it doesn't! The only thing you need to give Wails is an -`embed.FS`. How you get to that is entirely up to you. You can use vanilla html/css/js files like the vanilla template. -You could have some complicated build system, it doesn't matter. - -When `wails build` is run, it will check the `wails.json` project file at the project root. There are 2 keys in the -project file that are read: - -- "frontend:install" -- "frontend:build" - -The first, if given, will be executed in the `frontend` directory to install the node modules. -The second, if given, will be executed in the `frontend` directory to build the frontend project. - -If these 2 keys aren't given, then Wails does absolutely nothing with the frontend. It is only expecting that `embed.FS`. - -### AssetsHandler - -A Wails v2 app can optionally define a `http.Handler` in the `options.App`, which allows hooking into the AssetServer to -create files on the fly or process POST/PUT requests. -GET requests are always first handled by the `assets` FS. If the FS doesn't find the requested file the request will be -forwarded to the `http.Handler` for serving. Any requests other than GET will be directly processed by the `AssetsHandler` -if specified. -It's also possible to only use the `AssetsHandler` by specifiy `nil` as the `Assets` option. - -## Built in Dev Server - -Running `wails dev` will start the built in dev server which will start a file watcher in your project directory. By -default, if any file changes, wails checks if it was an application file (default: `.go`, configurable with `-e` flag). -If it was, then it will rebuild your application and relaunch it. If the changed file was in the assets, -it will issue a reload after a short amount of time. - -The dev server uses a technique called "debouncing" which means it doesn't reload straight away, -as there may be multiple files changed in a short amount of time. When a trigger occurs, it waits for a set amount of time -before issuing a reload. If another trigger happens, it resets to the wait time again. By default this value is `100ms`. -If this value doesn't work for your project, it can be configured using the `-debounce` flag. If used, this value will -be saved to your project config and become the default. - -## External Dev Server - -Some frameworks come with their own live-reloading server, however they will not be able to take advantage of the Wails -Go bindings. In this scenario, it is best to run a watcher script that rebuilds the project into the build directory, which -Wails will be watching. For an example, see the default svelte template that uses [rollup](https://rollupjs.org/guide/en/). -For [create-react-app](https://create-react-app.dev/), it's possible to use -[this script](https://gist.github.com/int128/e0cdec598c5b3db728ff35758abdbafd) to achieve a similar result. - -## Go Module - -The default Wails templates generate a `go.mod` file that contains the module name "changeme". You should change this -to something more appropriate after project generation. diff --git a/website/versioned_docs/version-v2.0.0-rc.1/guides/bleeding-edge.mdx b/website/versioned_docs/version-v2.0.0-rc.1/guides/bleeding-edge.mdx deleted file mode 100644 index 908242edd..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/guides/bleeding-edge.mdx +++ /dev/null @@ -1,61 +0,0 @@ -# Bleeding Edge - -## Overview - -Wails is in constant development and new releases are regularly "tagged". This usually happens when all the newer code -on `master` has been tested and confirmed working. If you need a bugfix or feature that has not yet made it to a release, -it's possible to use the latest "bleeding edge" version using the following steps: - -- `git clone https://github.com/wailsapp/wails` -- `cd wails/v2/cmd/wails` -- `go install` - -NOTE: The directory that you cloned the project into will now be called "clonedir". - -The Wails CLI will now be at the very latest version. - -### Updating your project - -To update projects to use the latest version of the Wails library, update the project's -`go.mod` and ensure the following line is at the bottom of the file: - -`replace github.com/wailsapp/wails/v2 => ` - -Example: - -On Windows: -`replace github.com/wailsapp/wails/v2 => C:\Users\leaan\Documents\wails-v2-beta\wails\v2` - -On 'nix: -`replace github.com/wailsapp/wails/v2 => /home/me/projects/wails/v2` - -To revert to a stable version, run: - -`go install github.com/wailsapp/wails/v2/cmd/wails@latest` - -## Testing a Branch - -If you want to test a branch, follow the instructions above, but ensure you switch the branch you want to test before installing: - -- `git clone https://github.com/wailsapp/wails` -- `cd wails` -- `git checkout -b branch-to-test --track origin/branch-to-test` -- `cd v2/cmd/wails` -- `go install` - -Make sure you [update your project](#updating-your-project) as described above. - -## Testing a PR - -If you want to test a PR, follow the instructions above, but ensure you fetch the PR and switch the branch before installing. -Please replace `[IDofThePR]` with the ID of the PR shown on github.com: - -- `git clone https://github.com/wailsapp/wails` -- `cd wails` -- `git fetch -u origin pull/[IDofThePR]/head:test/pr-[IDofThePR]` -- `git checkout test/pr-[IDofThePR]` -- `git reset --hard HEAD` -- `cd v2/cmd/wails` -- `go install` - -Make sure you [update your project](#updating-your-project) as described above. diff --git a/website/versioned_docs/version-v2.0.0-rc.1/guides/dynamic-assets.mdx b/website/versioned_docs/version-v2.0.0-rc.1/guides/dynamic-assets.mdx deleted file mode 100644 index 62a807167..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/guides/dynamic-assets.mdx +++ /dev/null @@ -1,133 +0,0 @@ -# Dynamic Assets - -If you want to load or generate assets for your frontend dynamically, you can achieve that using the -[AssetsHandler](../reference/options#assetshandler) option. The AssetsHandler is a generic `http.Handler` which will -be called for any non GET request on the assets server and for GET requests which can not be served from the -bundled assets because the file is not found. - -By installing a custom AssetsHandler, you can serve your own assets using a custom asset server. - -## Example - -In our example project, we will create a simple assets handler which will load files off disk: - -```go title=main.go {16-35,49} -package main - -import ( - "embed" - "fmt" - "github.com/wailsapp/wails/v2" - "github.com/wailsapp/wails/v2/pkg/options" - "net/http" - "os" - "strings" -) - -//go:embed frontend/dist -var assets embed.FS - -type FileLoader struct { - http.Handler -} - -func NewFileLoader() *FileLoader { - return &FileLoader{} -} - -func (h *FileLoader) ServeHTTP(res http.ResponseWriter, req *http.Request) { - var err error - requestedFilename := strings.TrimPrefix(req.URL.Path, "/") - println("Requesting file:", requestedFilename) - fileData, err := os.ReadFile(requestedFilename) - if err != nil { - res.WriteHeader(http.StatusBadRequest) - res.Write([]byte(fmt.Sprintf("Could not load file %s", requestedFilename))) - } - - res.Write(fileData) -} - -func main() { - // Create an instance of the app structure - app := NewApp() - - // Create application with options - err := wails.Run(&options.App{ - Title: "helloworld", - Width: 1024, - Height: 768, - Assets: assets, - BackgroundColour: &options.RGBA{R: 27, G: 38, B: 54, A: 255}, - OnStartup: app.startup, - AssetsHandler: NewFileLoader(), - Bind: []interface{}{ - app, - }, - }) - - if err != nil { - println("Error:", err) - } -} -``` - -When we run the application in dev mode using `wails dev`, we will see the following output: - -``` -DEB | [ExternalAssetHandler] Loading 'http://localhost:3001/favicon.ico' -DEB | [ExternalAssetHandler] Loading 'http://localhost:3001/favicon.ico' failed, using AssetHandler -Requesting file: favicon.ico -``` - -As you can see, the assets handler is called when the default assets server is unable to serve -the `favicon.ico` file. - -If you right click the main application and select "inspect" to bring up the devtools, you can test -this feature out by typing the following into the console: - -``` -let response = await fetch('does-not-exist.txt'); -``` - -This will generate an error in the devtools. We can see that the error is what we expect, returned by -our custom assets handler: - -

- -

- -However, if we request `go.mod`, we will see the following output: - -

- -

- -This technique can be used to load images directly into the page. If we updated our default vanilla template and -replaced the logo image: - -```html - -``` - -with: - -```html - -``` - -Then we would see the following: - -

- -

- -:::warning -Exposing your filesystem in this way is a security risk. It is recommended that you properly manage access -to your filesystem. -::: diff --git a/website/versioned_docs/version-v2.0.0-rc.1/guides/frameless.mdx b/website/versioned_docs/version-v2.0.0-rc.1/guides/frameless.mdx deleted file mode 100644 index fa34bc380..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/guides/frameless.mdx +++ /dev/null @@ -1,89 +0,0 @@ -# Frameless Applications - -Wails supports application that have no frames. This can be achieved by using the [frameless](../reference/options.mdx#frameless) -field in [Application Options](../reference/options.mdx#application-options). - -Wails offers a simple solution for dragging the window: Any HTML element that has the CSS style `--wails-draggable:drag` will -act as a "drag handle". This property applies to all child elements. If you need to indicate that a nested element -should not drag, then use the attribute '--wails-draggable:no-drag' on that element. - - -```html - - - - - - - -
- - -
-
- - - - -``` - -For some projects, using a CSS variable may not be possible due to dynamic styling. In this case, you can use the -`CSSDragProperty` and `CSSDragValue` application options to define a property and value that will be used to indicate -draggable regions: - -```go title=main.go -package main - -import ( - "embed" - - "github.com/wailsapp/wails/v2" - "github.com/wailsapp/wails/v2/pkg/options" -) - -//go:embed frontend/dist -var assets embed.FS - -func main() { - // Create an instance of the app structure - app := NewApp() - - // Create application with options - err := wails.Run(&options.App{ - Title: "alwaysontop", - Width: 1024, - Height: 768, - Assets: assets, - Frameless: true, - CSSDragProperty: "widows", - CSSDragValue: "1", - Bind: []interface{}{ - app, - }, - }) - - if err != nil { - println("Error:", err) - } -} -``` - -```html title=index.html - - - - - - alwaysontop - - -
- - - - -``` - -:::info Fullscreen -If you allow your application to go fullscreen, this drag functionality will be disabled. -::: diff --git a/website/versioned_docs/version-v2.0.0-rc.1/guides/frontend.mdx b/website/versioned_docs/version-v2.0.0-rc.1/guides/frontend.mdx deleted file mode 100644 index 1384087da..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/guides/frontend.mdx +++ /dev/null @@ -1,73 +0,0 @@ -# Frontend - -## Script Injection - -When Wails serves your `index.html`, by default, it will inject 2 script entries into the `` tag to load `/wails/ipc.js` -and `/wails/runtime.js`. These files install the bindings and runtime respectively. - -The code below shows where these are injected by default: - -```html - - - injection example - - - - - - - -
Please enter your name below 👇
-
- - -
- - - - -``` - -### Overriding Default Script Injection - -To provide more flexibility to developers, there is a meta tag that may be used to customise this behaviour: - -```html - -``` - -The options are as follows: - -| Value | Description | -| ------------------- | ------------------------------------------------ | -| noautoinjectruntime | Disable the autoinjection of `/wails/runtime.js` | -| noautoinjectipc | Disable the autoinjection of `/wails/ipc.js` | -| noautoinject | Disable all autoinjection of scripts | - -Multiple options may be used provided they are comma seperated. - -This code is perfectly valid and operates the same as the autoinjection version: - -```html - - - injection example - - - - - - -
Please enter your name below 👇
-
- - -
- - - - - - -``` diff --git a/website/versioned_docs/version-v2.0.0-rc.1/guides/ides.mdx b/website/versioned_docs/version-v2.0.0-rc.1/guides/ides.mdx deleted file mode 100644 index aa6841879..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/guides/ides.mdx +++ /dev/null @@ -1,129 +0,0 @@ -# IDEs - -Wails aims to provide a great development experience. To that aim, we now support generating IDE specific configuration -to provide smoother project setup. - -Currently, we support [Visual Studio Code](https://code.visualstudio.com/) but aim to support other IDEs such as Goland. - -## Visual Studio Code - -

- -

- -When generating a project using the `-ide vscode` flags, IDE files will be created alongside the other project files. -These files are placed into the `.vscode` directory and provide the correct configuration for debugging your application. - -The 2 files generated are `tasks.json` and `launch.json`. Below are the files generated for the default vanilla project: - -```json title="tasks.json" -{ - "version": "2.0.0", - "tasks": [ - { - "label": "build", - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "command": "go", - "args": [ - "build", - "-tags", - "dev", - "-gcflags", - "all=-N -l", - "-o", - "build/bin/myproject.exe" - ] - } - ] -} -``` - -```json title="launch.json" -{ - "version": "0.2.0", - "configurations": [ - { - "name": "Wails: Debug myproject", - "type": "go", - "request": "launch", - "mode": "exec", - "program": "${workspaceFolder}/build/bin/myproject.exe", - "preLaunchTask": "build", - "cwd": "${workspaceFolder}", - "env": {} - } - ] -} -``` - -### Configuring the install and build steps - -The `tasks.json` file is simple for the default project as there is no `npm install` or `npm run build` step needed. -For projects that have a frontend build step, such as the svelte template, we would need to edit `tasks.json` to -add the install and build steps: - -```json title="tasks.json" -{ - "version": "2.0.0", - "tasks": [ - { - "label": "npm install", - "type": "npm", - "script": "install", - "options": { - "cwd": "${workspaceFolder}/frontend" - }, - "presentation": { - "clear": true, - "panel": "shared", - "showReuseMessage": false - }, - "problemMatcher": [] - }, - { - "label": "npm run build", - "type": "npm", - "script": "build", - "options": { - "cwd": "${workspaceFolder}/frontend" - }, - "presentation": { - "clear": true, - "panel": "shared", - "showReuseMessage": false - }, - "problemMatcher": [] - }, - { - "label": "build", - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "command": "go", - "args": [ - "build", - "-tags", - "dev", - "-gcflags", - "all=-N -l", - "-o", - "build/bin/vscode.exe" - ], - "dependsOn": ["npm install", "npm run build"] - } - ] -} -``` - -:::info Future Enhancement - -In the future, we hope to generate a `tasks.json` that includes the install and build steps automatically. - -::: diff --git a/website/versioned_docs/version-v2.0.0-rc.1/guides/linux-distro-support.mdx b/website/versioned_docs/version-v2.0.0-rc.1/guides/linux-distro-support.mdx deleted file mode 100644 index 5ec628f2e..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/guides/linux-distro-support.mdx +++ /dev/null @@ -1,108 +0,0 @@ -# Linux Distro Support - -## Overview - -Wails offers Linux support but providing installation instructions for all available distributions is an impossible task. -Instead, Wails tries to determine if the packages you need to develop applications are available via your system's package -manager. Currently, we support the following package managers: - -- apt -- dnf -- emerge -- eopkg -- nixpkgs -- pacman -- zypper - -## Adding package names - -There may be circumstances where your distro uses one of the supported package managers but the package name -is different. For example, you may use an Ubuntu derivative, but the package name for gtk may be different. Wails -attempts to find the correct package by iterating through a list of package names. -The list of packages are stored in the packagemanager specific file in the `v2/internal/system/packagemanager` -directory. In our example, this would be `v2/internal/system/packagemanager/apt.go`. - -In this file, the list of packages are defined by the `Packages()` method: - -```go -func (a *Apt) Packages() packagemap { - return packagemap{ - "libgtk-3": []*Package{ - {Name: "libgtk-3-dev", SystemPackage: true, Library: true}, - }, - "libwebkit": []*Package{ - {Name: "libwebkit2gtk-4.0-dev", SystemPackage: true, Library: true}, - }, - "gcc": []*Package{ - {Name: "build-essential", SystemPackage: true}, - }, - "pkg-config": []*Package{ - {Name: "pkg-config", SystemPackage: true}, - }, - "npm": []*Package{ - {Name: "npm", SystemPackage: true}, - }, - "docker": []*Package{ - {Name: "docker.io", SystemPackage: true, Optional: true}, - }, - } -} -``` - -Let's assume that in our linux distro, `libgtk-3` is packaged under the name `lib-gtk3-dev`. -We could add support for this by adding the following line: - -```go {5} -func (a *Apt) Packages() packagemap { - return packagemap{ - "libgtk-3": []*Package{ - {Name: "libgtk-3-dev", SystemPackage: true, Library: true}, - {Name: "lib-gtk3-dev", SystemPackage: true, Library: true}, - }, - "libwebkit": []*Package{ - {Name: "libwebkit2gtk-4.0-dev", SystemPackage: true, Library: true}, - }, - "gcc": []*Package{ - {Name: "build-essential", SystemPackage: true}, - }, - "pkg-config": []*Package{ - {Name: "pkg-config", SystemPackage: true}, - }, - "npm": []*Package{ - {Name: "npm", SystemPackage: true}, - }, - "docker": []*Package{ - {Name: "docker.io", SystemPackage: true, Optional: true}, - }, - } -} -``` - -## Adding new package managers - -To add a new package manager, perform the following steps: - -- Create a new file in `v2/internal/system/packagemanager` called `.go`, where `` is the name of the package manager. -- Define a struct that conforms to the package manager interface defined in `pm.go`: - -```go -type PackageManager interface { - Name() string - Packages() packagemap - PackageInstalled(*Package) (bool, error) - PackageAvailable(*Package) (bool, error) - InstallCommand(*Package) string -} -``` - -- `Name()` should return the name of the package manager -- `Packages()` should return a `packagemap`, that provides candidate filenames for dependencies -- `PackageInstalled()` should return `true` if the given package is installed -- `PackageAvailable()` should return `true` if the given package is not installed but available for installation -- `InstallCommand()` should return the exact command to install the given package name - -Take a look at the other package managers code to get an idea how this works. - -:::info Remember -If you add support for a new package manager, don't forget to also update this page! -::: diff --git a/website/versioned_docs/version-v2.0.0-rc.1/guides/linux.mdx b/website/versioned_docs/version-v2.0.0-rc.1/guides/linux.mdx deleted file mode 100644 index fa74fe6cf..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/guides/linux.mdx +++ /dev/null @@ -1,20 +0,0 @@ -# Linux - -This page has miscellaneous guides related to developing Wails applications for Linux. - -## Video tag doesn't fire "ended" event - -When using a video tag, the "ended" event is not fired when the video is finished playing. This is a bug -in WebkitGTK, however you can use the following workaround to fix it: - -```js -videoTag.addEventListener("timeupdate", (event) => { - if (event.target.duration - event.target.currentTime < 0.2) { - let ended = new Event("ended"); - event.target.dispatchEvent(ended); - } -}); -``` - -Source: [Lyimmi](https://github.com/Lyimmi) on the -[discussions board](https://github.com/wailsapp/wails/issues/1729#issuecomment-1212291275) diff --git a/website/versioned_docs/version-v2.0.0-rc.1/guides/manual-builds.mdx b/website/versioned_docs/version-v2.0.0-rc.1/guides/manual-builds.mdx deleted file mode 100644 index 41cbfd1dc..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/guides/manual-builds.mdx +++ /dev/null @@ -1,98 +0,0 @@ -# Manual Builds - -The Wails CLI does a lot of heavy lifting for the project, but sometimes it's desirable to manually build your project. -This document will discuss the different operations the CLI does and how this may be achieved in different ways. - -## Build Process - -When either `wails build` or `wails dev` are used, the Wails CLI performs a common build process: - - - Install frontend dependencies - - Build frontend project - - Generate build assets - - Compile application - - [optional] Compress application - -### Install frontend dependencies - -#### CLI Steps - -- If the `-s` flag is given, this step is skipped -- Checks `wails.json` to see if there is an install command in the key `frontend:install` -- If there isn't, it skips this step -- If there is, it checks if `package.json` exists in the frontend directory. If it doesn't exist, it skips this step -- An MD5 sum is generated from the `package.json` file contents -- It checks for the existence of `package.json.md5` and if it exists, will compare the contents of it (an MD5 sum) - with the one generated to see if the contents have changed. If they are the same, this step is skipped -- If `package.json.md5` does not exist, it creates it using the generated MD5 sum -- If a build is now required, or `node_modules` does not exist, or the `-f` flag is given, the install command is - executed in the frontend directory - -#### Manual Steps - -This step could be done from the command line or a script with `npm install`. - -### Build frontend project - -#### Wails CLI - -- If the `-s` flag is given, this step is skipped -- Checks `wails.json` to see if there is a build command in the key `frontend:build` -- If there isn't, it skips this step -- If there is, it is executed in the frontend directory - -#### Manual Steps - -This step could be done from the command line or a script with `npm run build` or whatever the frontend build script is. - -### Generate assets - -#### Wails CLI - -- If `-nopackage` flag is set, this stage is skipped -- If the `build/appicon.png` file does not exist, a default one is created -- For Windows, see [Bundling for Windows](#windows) -- If `build/windows/icon.ico` does not exist, it will create it from the `build/appicon.png` image. - -##### Windows - -- If `build/windows/icon.ico` does not exist, it will create it from `build/appicon.png` using icon sizes of 256, 128, 64, 48, 32 and 16. This is done using [winicon](https://github.com/leaanthony/winicon). -- If the `build/windows/.manifest` file does not exist, it creates it from a default version. -- Compiles the application as a production build (above) -- Uses [winres](https://github.com/tc-hib/winres) to bundle the icon and manifest into a `.syso` file ready for linking. - -#### Manual Steps - -- Create `icon.ico` using the [winicon](https://github.com/leaanthony/winicon) CLI tool (or any other tool). -- Create / Update a `.manifest` file for your application -- Use the [winres CLI](https://github.com/tc-hib/go-winres) to generate a `.syso` file. - -### Compile application - -#### Wails CLI - -- If the `-clean` flag is provided, the `build` directory is deleted and recreated -- For `wails dev`, the following default Go flags are used: `-tags dev -gcflags "all=-N -l"` -- For `wails build`, the following default Go flags are used: `-tags desktop,production -ldflags "-w -s"` - - On Windows, `-ldflags "-w -h -H windowsgui"` -- Additional tags passed to the CLI using `-tags` are added to the defaults -- Additional ldflags passed to the CLI using `-ldflags` are added to the defaults -- The `-o` flag is passed through -- The Go compiler specified by `-compiler` will be used for compilation - -#### Manual steps - -- For dev build, the minimum command would be: `go build -tags dev -gcflags "all=-N -l"` -- For production build, the minimum command would be: `go build -tags desktop,production -ldflags "-w -s -H windowsgui"` -- Ensure that you compile in the same directory as the `.syso` file - -### Compress application - -#### Wails CLI - -- If the `-upx` flag has been given, the `upx` program will be run to compress the application with the default settings -- If `-upxflags` is also passed, these flags are used instead of the default ones - -#### Manual steps - -- Run `upx [flags]` manually to compress the application. diff --git a/website/versioned_docs/version-v2.0.0-rc.1/guides/migrating.mdx b/website/versioned_docs/version-v2.0.0-rc.1/guides/migrating.mdx deleted file mode 100644 index b00859935..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/guides/migrating.mdx +++ /dev/null @@ -1,204 +0,0 @@ -# Migrating from v1 - -## Overview - -Wails v2 is a significant change from v1. This document aims to highlight the changes and the steps in migrating an existing project. - -### Creating the Application - -In v1, the main application is created using `wails.CreateApp`, bindings are added with `app.Bind`, then the -application is run using `app.Run()`. - -Example: - -```go title="v1" - app := wails.CreateApp(&wails.AppConfig{ - Title: "MyApp", - Width: 1024, - Height: 768, - JS: js, - CSS: css, - Colour: "#131313", - }) - app.Bind(basic) - app.Run() -``` - -In v2, there is just a single method, `wails.Run()`, that accepts [application options](../reference/options.mdx#application-options). - -```go title="v2" - err := wails.Run(&options.App{ - Title: "MyApp", - Width: 800, - Height: 600, - Assets: assets, - Bind: []interface{}{ - basic, - }, - }) -``` - -### Binding - -In v1, it was possible to bind both arbitrary functions and structs. In v2, this has been simplified to only binding structs. -The struct instances that were previously passed to the `Bind()` method in v1, are now specified in the `Bind` field of -the [application options](../reference/options.mdx#application-options): - -```go title="v1" - app := wails.CreateApp(/* options */) - app.Bind(basic) -``` - -```go title="v2" - err := wails.Run(&options.App{ - /* other options */ - Bind: []interface{}{ - basic, - }, - }) -``` - -In v1, bound methods were available to the frontend at `window.backend`. This has changed to `window.go`.`` - -### Application Lifecycle - -In v1, there were 2 special methods in a bound struct: `WailsInit()` and `WailsShutdown()`. These have -been replaced with 3 lifecycle hooks as part of the [application options](../reference/options.mdx#application-options): - -- [OnStartup](../reference/options.mdx#onstartup) -- [OnShutdown](../reference/options.mdx#onshutdown) -- [OnDomReady](../reference/options.mdx#ondomready) - -Note: [OnDomReady](../reference/options.mdx#ondomready) replaces the `wails:ready` system event in v1. - -These methods can be standard functions, but a common practice is to have them part of a struct: - -```go title="v2" - basic := NewBasicApp() - err := wails.Run(&options.App{ - /* Other Options */ - OnStartup: basic.startup, - OnShutdown: basic.shutdown, - OnDomReady: basic.domready, - }) -... -type Basic struct { - ctx context.Context -} -func (b *Basic) startup(ctx context.Context) { - b.ctx = ctx -} -... -``` - -### Runtime - -The runtime in v2 is much richer than v1 with support for menus, window manipulation -and better dialogs. The signature of the methods has changed slightly - please refer -the the [Runtime Reference](../reference/runtime/intro.mdx). - -In v1, the [runtime](../reference/runtime/intro.mdx) was available via a struct passed to `WailsInit()`. -In v2, the runtime has been moved out to its own package. Each method in the runtime takes the -`context.Context` that is passed to the [OnStartup](../reference/options.mdx#onstartup) method. - -```go title="Runtime Example" -package main - -import "github.com/wailsapp/wails/v2/pkg/runtime" - -type Basic struct { - ctx context.Context -} - -// startup is called at application startup -func (a *App) startup(ctx context.Context) { - a.ctx = ctx - runtime.LogInfo(ctx, "Application Startup called!") -} - -``` - -### Assets - -The _biggest_ change in v2 is how assets are handled. - -In v1, assets were passed via 2 application options: - -- `JS` - The application's Javascript -- `CSS` - The application's CSS - -This meant that the responsibility of generating a single JS and CSS file was on the -developer. This essentially required the use of complicated packers such as webpack. - -In v2, Wails makes no assumptions about your frontend assets, just like a webserver. -All of your application assets are passed to the application options as an `embed.FS`. - -**This means there is no requirement to bundle your assets, encode images as Base64 or -attempt the dark art of bundler configuration to use custom fonts**. - -At startup, Wails -will scan the given `embed.FS` for `index.html` and use its location as the root path -for all the other application assets - just like a webserver would. - -Example: An application has the following project layout. All final assets are placed in the -`frontend/dist` directory: - -```shell -. -├── build/ -├── frontend/ -│ └── dist/ -│ ├── index.html -│ ├── main.js -│ ├── main.css -│ └── logo.svg -├── main.go -└── wails.json -``` - -Those assets may be used by the application by simply creating an `embed.FS`: - -```go title="Assets Example" -//go:embed frontend/dist -var assets embed.FS - -func main() { - err := wails.Run(&options.App{ - /* Other Options */ - Assets: assets, - }) -} -``` - -Of course, bundlers can be used if you wish to. The only requirement is to pass -the final application assets directory to Wails using an `embed.FS` in the `Assets` -key of the [application options](../reference/options.mdx#application-options). - -### Project Configuration - -In v1, the project configuration was stored in the `project.json` file in the project root. -In v2, the project configuration is stored in the `wails.json` file in the project root. - -The format of the file is slightly different. Here is a comparison: - -

- -| v1 | v2 | Notes | -| ------------------ | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| name | name | | -| description | | Removed | -| author / name | author / name | | -| author / email | author / email | | -| version | version | | -| binaryname | outputfilename | Changed | -| frontend / dir | | Removed | -| frontend / install | frontend:install | Changed | -| frontend / build | frontend:build | Changed | -| frontend / bridge | | Removed | -| frontend / serve | | Removed | -| tags | | Removed | -| | wailsjsdir | The directory to generate wailsjs modules | -| | assetdir | The directory of the compiled frontend assets for `dev` mode. This is normally inferred and could be left empty. | -| | reloaddirs | Comma separated list of additional directories to watch for changes and to trigger reloads in `dev` mode. This is only needed for some more advanced asset configurations. | - -

diff --git a/website/versioned_docs/version-v2.0.0-rc.1/guides/mouse-buttons.mdx b/website/versioned_docs/version-v2.0.0-rc.1/guides/mouse-buttons.mdx deleted file mode 100644 index 5244ce015..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/guides/mouse-buttons.mdx +++ /dev/null @@ -1,27 +0,0 @@ -# Mouse Buttons - -The Wails runtime intercepts mouse clicks to determine whether a frameless window needs resizing or a window needs to be moved. -It has been asked how to detect when a mouse click has occurred, because `window.onclick` doesn't report the mouse buttons correctly. -The following code shows how to detect mouse clicks: - -```javascript -window.addEventListener("mousedown", handleMouseButtonDown); - -function handleMouseButtonDown(event) { - if (event.button === 0) { - // left mouse button - } else if (event.button === 1) { - // middle mouse button - } else if (event.button === 2) { - // right mouse button - } else if (event.button === 3) { - // back mouse button - } else if (event.button === 4) { - // forward mouse button - } else { - // other mouse button - } -} -``` - -Reference: https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button diff --git a/website/versioned_docs/version-v2.0.0-rc.1/guides/obfuscated.mdx b/website/versioned_docs/version-v2.0.0-rc.1/guides/obfuscated.mdx deleted file mode 100644 index 7d0e78def..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/guides/obfuscated.mdx +++ /dev/null @@ -1,43 +0,0 @@ -# Obfuscated Builds - -Wails includes support for obfuscating your application using [garble](https://github.com/burrowers/garble). - -To produce an obfuscated build, you can use the `-obfuscate` flag with the `wails build` command: - -```bash -wails build -obfuscate -``` -To customise the obfuscation settings, you can use the `-garbleargs` flag: - -```bash -wails build -obfuscate -garbleargs "-literals -tiny -seed=myrandomseed" -``` - -These settings may be persisted in your [project config](/guides/reference/project-config). - -## How it works - -In a standard build, all bound methods are available in the frontend under the `window.go` -variable. When these methods are called, the corresponding backend method is called using -the fully qualified function name. When using an obfuscated build, methods are bound using -an ID instead of a name. The bindings generated in the `wailsjs` directory use these IDs to -call the backend functions. - -:::note -To ensure that your application will work in obfuscated mode, you must use the generated -bindings under the `wailsjs` directory in your application. -::: - -## Example - -Importing the "Greet" method from the bindings like this: - -```js -import { Greet } from '../../wailsjs/go/main/App'; - -// snip -Greet('World'); -``` - -will ensure that the method will work correctly in obfuscated mode, as the bindings will -be regenerated with IDs and the call mechanism updated. \ No newline at end of file diff --git a/website/versioned_docs/version-v2.0.0-rc.1/guides/overscroll.mdx b/website/versioned_docs/version-v2.0.0-rc.1/guides/overscroll.mdx deleted file mode 100644 index afe93de41..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/guides/overscroll.mdx +++ /dev/null @@ -1,11 +0,0 @@ -# Overscroll - -[Overscroll](https://developer.mozilla.org/en-US/docs/Web/CSS/overscroll-behavior) is the "bounce effect" you sometimes -get when you scroll beyond a page's content boundaries. This is common in mobile apps. This can be disabled using CSS: - -```css -html { - height: 100%; - overflow: hidden; -} -``` diff --git a/website/versioned_docs/version-v2.0.0-rc.1/guides/routing.mdx b/website/versioned_docs/version-v2.0.0-rc.1/guides/routing.mdx deleted file mode 100644 index c35cc1c8a..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/guides/routing.mdx +++ /dev/null @@ -1,47 +0,0 @@ -# Routing - -Routing is a popular way to switch views in an application. This page offers some guidance around how to do that. - -## Vue - -The recommended approach for routing in Vue is [Hash Mode](https://next.router.vuejs.org/guide/essentials/history-mode.html#hash-mode): - -```js -import { createRouter, createWebHashHistory } from "vue-router"; - -const router = createRouter({ - history: createWebHashHistory(), - routes: [ - //... - ], -}); -``` - -## Angular - -The recommended approach for routing in Angular is [HashLocationStrategy](https://codecraft.tv/courses/angular/routing/routing-strategies#_hashlocationstrategy): - -```ts -RouterModule.forRoot(routes, { useHash: true }); -``` - -## React - -The recommended approach for routing in React is [HashRouter](https://reactrouter.com/docs/en/v6/routers/hash-router): - -```jsx -import { HashRouter } from "react-router-dom"; - -ReactDOM.render( - - {/* The rest of your app goes here */} - - } exact /> - } /> - } /> - {/* more... */} - - , - root -); -``` diff --git a/website/versioned_docs/version-v2.0.0-rc.1/guides/signing.mdx b/website/versioned_docs/version-v2.0.0-rc.1/guides/signing.mdx deleted file mode 100644 index 349ae123a..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/guides/signing.mdx +++ /dev/null @@ -1,411 +0,0 @@ -# Code Signing - -This is a guide on how you can sign your binaries generated with Wails on MacOS and Windows. -The guide will target CI environments, more specifically GitHub Actions. - -## Windows - -First off you need a code signing certificate. If you do not already have one, Microsoft's -info page lists some providers [here](https://docs.microsoft.com/en-us/windows-hardware/drivers/dashboard/get-a-code-signing-certificate). -Please note that an EV certificate is not required unless you need to write kernel-level -software such as device drivers. For signing your Wails app, a standard code signing -certificate will do just fine. - -It may be a good idea to check with your certificate provider -how to sign your binaries on your local machine before targeting automated build systems, just so you know if there -are any special requirements. For instance, [here](https://www.ssl.com/how-to/using-your-code-signing-certificate/) is SSL.com's code signing guide for Windows. -If you know how to sign locally, it will be easier to -troubleshoot any potential issues in a CI environment. -For instance, SSL.com code signing certificates require the `/tr` flag for [SignTool.exe](https://docs.microsoft.com/en-us/windows/win32/seccrypto/signtool) -while other providers may only need the `/t` flag for providing the timestamping server. Popular GitHub Actions for signing -Windows binaries like [this one](https://github.com/Dana-Prajea/code-sign-action) does not support the `/tr` flag on SignTool.exe. -Therefore this guide will focus on signing our app manually with PowerShell commands, but you can use actions like the [code-sign-action](https://github.com/Dana-Prajea/code-sign-action) -Action if you prefer. - -First off, let's make sure we are able to build our Wails app in our GitHub CI. Here is a small workflow template: - -```yaml -name: "example" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -jobs: - package: - strategy: - matrix: - platform: [windows-latest, macos-latest] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend manually here, unless you have configured frontend build and install commands in wails.json. - - name: Get Wails - run: go install github.com/wailsapp/wails/v2/cmd/wails@latest - - name: Build Wails app - run: | - wails build - - name: upload artifacts macOS - if: matrix.platform == 'macos-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-macos - path: build/bin/* - - name: upload artifacts windows - if: matrix.platform == 'windows-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-windows - path: build/bin/* -``` - -Next we need to give the GitHub workflow access to our signing certificate. This is done by encoding your .pfx or .p12 certificate -into a base64 string. To do this in PowerShell, you can use the following command assuming your certificate is called 'my-cert.p12': - -```PowerShell -certutil -encode .\my-cert.p12 my-cert-base64.txt -``` - -You should now have your .txt file with the base64 encoded certificate. It should start with _-----BEGIN CERTIFICATE-----_ and -end with _-----END CERTIFICATE-----_. Now you need to make two action secrets on GitHub. Navigate to _Settings -> Secrets -> Actions_ and create the -two following secrets: - -- **WIN_SIGNING_CERT** with the contents of your base64 encoded certificate text. -- **WIN_SIGNING_CERT_PASSWORD** with the contents of your certificate password. - -Now we're ready to implement the signing in our workflow using one of the two methods: - -### Method 1: signing with commands - -This method uses PowerShell commands to sign our app, and leaves you control over the entire signing process. - -After the `"Build Wails app"` step, we can add the following step to our workflow: - -```yaml -- name: Sign Windows binaries - if: matrix.platform == 'windows-latest' - run: | - echo "Creating certificate file" - New-Item -ItemType directory -Path certificate - Set-Content -Path certificate\certificate.txt -Value '${{ secrets.WIN_SIGNING_CERT }}' - certutil -decode certificate\certificate.txt certificate\certificate.pfx - echo "Signing our binaries" - & 'C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe' sign /fd /t /f certificate\certificate.pfx /p '${{ secrets.WIN_SIGNING_CERT_PASSWORD }}' - -``` - -This script creates a new directory for your certificate file, creates the certificate file from our base64 secret, converts it to a .pfx file, -and finally signs the binary. The following variables needs to be replaced in the last line: - -- **signing algorithm**: usually sha256. -- **timestamping server**: URL to the timestamping server to use with your certificate. -- **path to binary**: path to the binary you want to sign. - -Given that our Wails config has `outputfilename` set to "app.exe" and that we have a certificate from SSL.com, this would be our workflow: - -```yaml -name: "example" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -jobs: - package: - strategy: - matrix: - platform: [windows-latest, macos-latest] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend here, unless you have configured frontend build and install commands in wails.json. - - name: Get Wails - run: go install github.com/wailsapp/wails/v2/cmd/wails@latest - - name: Build Wails app - run: | - wails build - - name: Sign Windows binaries - if: matrix.platform == 'windows-latest' - run: | - echo "Creating certificate file" - New-Item -ItemType directory -Path certificate - Set-Content -Path certificate\certificate.txt -Value '${{ secrets.WIN_SIGNING_CERT }}' - certutil -decode certificate\certificate.txt certificate\certificate.pfx - echo "Signing our binaries" - & 'C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe' sign /fd sha256 /tr http://ts.ssl.com /f certificate\certificate.pfx /p '${{ secrets.WIN_SIGNING_CERT_PASSWORD }}' .\build\bin\app.exe - - - name: upload artifacts macOS - if: matrix.platform == 'macos-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-macos - path: build/bin/* - - name: upload artifacts windows - if: matrix.platform == 'windows-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-windows - path: build/bin/* -``` - -### Method 2: automatically signing with Action - -It is possible to use a Windows code signing Action like [this](https://github.com/marketplace/actions/code-sign-a-file-with-pfx-certificate) one, -but note it requires a SHA1 hash for the certificate and a certificate name. View an example of how to configure it on the Action's [marketplace](https://github.com/marketplace/actions/code-sign-a-file-with-pfx-certificate). - ---- - -## MacOS - -First off you need your code signing certificate from Apple. If you do not have one, a simple Google search will help you acquire one. -Once you have your certificate, you need to export it and encode it to base64. [This tutorial](https://localazy.com/blog/how-to-automatically-sign-macos-apps-using-github-actions) -shows you how to do that in an easy manner. Once you have exported your .p12 certificate file, you can encode it to base64 as seen in the tutorial with the following command: - -```bash -base64 Certificates.p12 | pbcopy -``` - -Now you're ready to create some GitHub project secrets, just as with Windows: - -- **APPLE_DEVELOPER_CERTIFICATE_P12_BASE64** with the contents of your newly copied base64 certificate. -- **APPLE_DEVELOPER_CERTIFICATE_PASSWORD** with the contents of your certificate password. -- **APPLE_PASSWORD** with the contents of an App-Specific password to your Apple-ID account which you can generate [here](https://appleid.apple.com/account/manage). - -Let's make sure we are able to build our Wails app in our GitHub Action workflow. Here is a small template: - -```yaml -name: "example" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -jobs: - package: - strategy: - matrix: - platform: [windows-latest, macos-latest] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend here, unless you have configured frontend build and install commands in wails.json. - - name: Get Wails - run: go install github.com/wailsapp/wails/v2/cmd/wails@latest - - name: Build Wails app - run: | - wails build - - name: upload artifacts macOS - if: matrix.platform == 'macos-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-macos - path: build/bin/* - - name: upload artifacts windows - if: matrix.platform == 'windows-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-windows - path: build/bin/* -``` - -For code signing on macOS, [gon](https://github.com/mitchellh/gon) is a very handy tool for code signing and communicating with Apple servers, also written in Go, and -will be used in this guide. - -After the `Build Wails app` step, add the following to the workflow: - -```yaml -- name: MacOS download gon for code signing and app notarization - if: matrix.platform == 'macos-latest' - run: | - brew install mitchellh/gon/gon -``` - -Now we need to configure some gon config files in our `build/darwin` directory: - -1. gon-sign.json: - -```json -{ - "source": ["./build/bin/app.app"], - "bundle_id": "app.myapp", - "apple_id": { - "username": "my-appleid@email.com", - "password": "@env:APPLE_PASSWORD" - }, - "sign": { - "application_identity": "Developer ID Application: My Name" - } -} -``` - -Where `source` is your Wails binary, `bundle_id` is your bundle ID, `apple_id` contains your Apple ID username and App-Specific password -which you created earlier, and `sign.application_identity` is your identity which you can find by running the following command: - -```bash -security find-identity -v -p codesigning -``` - -2. entitlements.plist: - -```plist - - - - - com.apple.security.app-sandbox - - com.apple.security.network.client - - com.apple.security.network.server - - com.apple.security.files.user-selected.read-write - - com.apple.security.files.downloads.read-write - - - -``` - -In this file you configure the entitlements you need for you app, e.g. camera permissions if your app uses the camera. Read more about entitlements [here](https://developer.apple.com/documentation/bundleresources/entitlements). - -Make sure you have updated your `Info.plist` file with the same bundle ID as you entered in `gon-sign.json`. -Here's an example `Info.plist` file: - -```plist - - - CFBundlePackageTypeAPPL - CFBundleNameMyApp - CFBundleExecutableapp - CFBundleIdentifierapp.myapp - CFBundleVersion0.1.0 - CFBundleGetInfoStringMy app is cool and nice and chill and - CFBundleShortVersionString0.1.0 - CFBundleIconFileiconfile - LSMinimumSystemVersion10.13.0 - NSHighResolutionCapabletrue - LSApplicationCategoryTypepublic.app-category.utilities - NSHumanReadableCopyright© Me - -``` - -Now we're ready to add the signing step in our workflow after building the Wails app: - -```yaml -- name: Import Code-Signing Certificates for macOS - if: matrix.platform == 'macos-latest' - uses: Apple-Actions/import-codesign-certs@v1 - with: - # The certificates in a PKCS12 file encoded as a base64 string - p12-file-base64: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_P12_BASE64 }} - # The password used to import the PKCS12 file. - p12-password: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_PASSWORD }} -- name: Sign our macOS binary - if: matrix.platform == 'macos-latest' - run: | - echo "Signing Package" - gon -log-level=info ./build/darwin/gon-sign.json -``` - -Please note that signing binaries with Apple could take anywhere from minutes to hours. - -## Combined workflow file: - -Here is our GitHub workflow file with Windows + macOS combined: - -```yaml -name: "example combined" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -jobs: - package: - strategy: - matrix: - platform: [windows-latest, macos-latest] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend here, unless you have configured frontend build and install commands in wails.json. - - name: Get Wails - run: go install github.com/wailsapp/wails/v2/cmd/wails@latest - - name: Build Wails app - run: | - wails build - - name: MacOS download gon for code signing and app notarization - if: matrix.platform == 'macos-latest' - run: | - brew install mitchellh/gon/gon - - name: Import Code-Signing Certificates for macOS - if: matrix.platform == 'macos-latest' - uses: Apple-Actions/import-codesign-certs@v1 - with: - # The certificates in a PKCS12 file encoded as a base64 string - p12-file-base64: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_P12_BASE64 }} - # The password used to import the PKCS12 file. - p12-password: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_PASSWORD }} - - name: Sign our macOS binary - if: matrix.platform == 'macos-latest' - run: | - echo "Signing Package" - gon -log-level=info ./build/darwin/gon-sign.json - - name: Sign Windows binaries - if: matrix.platform == 'windows-latest' - run: | - echo "Creating certificate file" - New-Item -ItemType directory -Path certificate - Set-Content -Path certificate\certificate.txt -Value '${{ secrets.WIN_SIGNING_CERT }}' - certutil -decode certificate\certificate.txt certificate\certificate.pfx - echo "Signing our binaries" - & 'C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe' sign /fd sha256 /tr http://ts.ssl.com /f certificate\certificate.pfx /p '${{ secrets.WIN_SIGNING_CERT_PASSWORD }}' .\build\bin\Monitor.exe - - name: upload artifacts macOS - if: matrix.platform == 'macos-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-macos - path: build/bin/* - - name: upload artifacts windows - if: matrix.platform == 'windows-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-windows - path: build/bin/* -``` - -# End notes - -This guide inspired by the RiftShare project and its workflow, which is highly recommended to check out [here](https://github.com/achhabra2/riftshare/blob/main/.github/workflows/build.yaml). diff --git a/website/versioned_docs/version-v2.0.0-rc.1/guides/templates.mdx b/website/versioned_docs/version-v2.0.0-rc.1/guides/templates.mdx deleted file mode 100644 index 923b10d6b..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/guides/templates.mdx +++ /dev/null @@ -1,97 +0,0 @@ -# Templates - -Wails generates projects from pre-created templates. In v1, this was a difficult to maintain set of projects that were -subject to going out of date. In v2, to empower the community, a couple of new features have been added for templates: - -- Ability to generate projects from [Remote Templates](../reference/cli.mdx#remote-templates) -- Tooling to help create your own templates - -## Creating Templates - -To create a template, you can use the `wails generate template` command. To generate a default template, run: - -`wails generate template -name mytemplate ` - -This creates the directory "mytemplate" with default files: - -```shell title=mytemplate/ -. -|-- NEXTSTEPS.md -|-- README.md -|-- app.tmpl.go -|-- frontend -| `-- dist -| |-- assets -| | |-- fonts -| | | |-- OFL.txt -| | | `-- nunito-v16-latin-regular.woff2 -| | `-- images -| | `-- logo-dark.svg -| |-- index.html -| |-- main.css -| `-- main.js -|-- go.mod.tmpl -|-- main.tmpl.go -|-- template.json -`-- wails.tmpl.json -``` - -### Template Overview - -The default template consists of the following files and directories: - -| Filename / Dir | Description | -| --------------- | -------------------------------------------- | -| NEXTSTEPS.md | Instructions on how to complete the template | -| README.md | The README published with the template | -| app.tmpl.go | `app.go` template file | -| frontend/ | The directory containing frontend assets | -| go.mod.tmpl | `go.mod` template file | -| main.tmpl.go | `main.go` template file | -| template.json | The template metadata | -| wails.tmpl.json | `wails.json` template file | - -At this point it is advisable to follow the steps in `NEXTSTEPS.md`. - -## Creating a Template from an Existing Project - -It's possible to create a template from an existing frontend project by passing the path to the project when generating -the template. We will now walk through how to create a Vue 3 template: - -- Install the vue cli: `npm install -g @vue/cli` -- Create the default project: `vue create vue3-base` - - Select `Default (Vue 3) ([Vue 3] babel, eslint)` -- After the project has been generated, run: - -```shell -> wails generate template -name wails-vue3-template -frontend .\vue3-base\ -Extracting base template files... -Migrating existing project files to frontend directory... -Updating package.json data... -Renaming package.json -> package.tmpl.json... -Updating package-lock.json data... -Renaming package-lock.json -> package-lock.tmpl.json... -``` - -- The template may now be customised as specified in the `NEXTSTEPS.md` file -- Once the files are ready, it can be tested by running: `wails init -n my-vue3-project -t .\wails-vue3-template\` -- To test the new project, run: `cd my-vue3-project` then `wails build` -- Once the project has compiled, run it: `.\build\bin\my-vue3-project.exe` -- You should have a fully functioning Vue3 application: - -
- -
- -## Publishing Templates - -Publishing a template is simply pushing the files to GitHub. The following best practice is encouraged: - -- Remove any unwanted files and directories (such as `.git`) from your frontend directory -- Ensure that `template.json` is complete, especially `helpurl` -- Push the files to GitHub -- Create a PR on the [Community Templates](../community/templates.mdx) page -- Announce the template on the [Template Announcement](https://github.com/wailsapp/wails/discussions/825) discussion board diff --git a/website/versioned_docs/version-v2.0.0-rc.1/guides/troubleshooting.mdx b/website/versioned_docs/version-v2.0.0-rc.1/guides/troubleshooting.mdx deleted file mode 100644 index 8f768e0a1..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/guides/troubleshooting.mdx +++ /dev/null @@ -1,159 +0,0 @@ -# Troubleshooting - -An assortment of troubleshooting tips. - -## The `wails` command appears to be missing? - -If your system is reporting that the `wails` command is missing, make sure you have followed the Go installation guide -correctly. Normally, it means that the `go/bin` directory in your User's home directory is not in the `PATH` environment -variable. You will also normally need to close and reopen any open command prompts so that changes to the environment -made by the installer are reflected at the command prompt. - -## My application is displaying a white/blank screen - -Check that your application includes the assets from the correct directory. In your `main.go` file, you will have -something similar to the following code: - -```go -//go:embed frontend/dist -var assets embed.FS -``` - -Check that `frontend/dist` contains your application assets. - -### Mac - -If this happens on Mac, try adding the following to your `Info.plist`: - -```xml -NSAppTransportSecurity - - NSAllowsLocalNetworking - - -``` - -Reference: https://github.com/wailsapp/wails/issues/1504#issuecomment-1174317433 - -## Mac application not valid - -If your built application looks like this in finder: - -

- -

- -it's likely that your application's `info.plist` is invalid. Update the file in `build/.app/Contents/info.plist` -and check if the data is valid, EG check the binary name is correct. To persist the changes, copy the file back to -the `build/darwin` directory. - -## Cannot call backend method from frontend with variadic arguments - -If you have a backend method defined with variadic parameters, eg: - -```go -func (a *App) TestFunc(msg string, args ...interface{}) error { - // Code -} -``` - -calling this method from the frontend like this will fail: - -```js -var msg = "Hello: "; -var args = ["Go", "JS"]; -window.go.main.App.TestFunc(msg, ...args) - .then((result) => { - //do things here - }) - .catch((error) => { - //handle error - }); -``` - -Workaround: - -```js -var msg = "Hello "; -var args = ["Go", "JS"]; -window.go.main.App.TestFunc(msg, args) - .then((result) => { - //without the 3 dots - //do things here - }) - .catch((error) => { - //handle error - }); -``` - -Credit: https://github.com/wailsapp/wails/issues/1186 - -## I'm having getting proxy errors when trying to install Wails - -If you are getting errors like this: - -``` -"https://proxy.golang.org/github.com/wailsapp/wails/cmd/wails/@v/list": dial tcp 172.217.163.49:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. -``` - -it's probably because the official Go Proxy is being blocked (Users in China have reported this). -The solution is to set up the proxy manually, eg: - -``` -go env -w GO111MODULE=on -go env -w GOPROXY=https://goproxy.cn,direct -``` - -Source: https://github.com/wailsapp/wails/issues/1233 - -## The generated Typescript doesn't have the correct types - -Sometimes the generated Typescript doesn't have the correct types. To mitigate this, -it is possible to specify what types should be generated using the `ts_type` struct tag. For -more details, please read [this](https://github.com/tkrajina/typescriptify-golang-structs#custom-types). - -## When I navigate away from `index.html`, I am unable to call methods on the frontend - -If you navigate away from `index.html` to a new html file, the context will be lost. This can be fixed by adding -the following imports to the `` section of any new page you navigate to: - -```html - - - - -``` - -Source: https://github.com/wailsapp/wails/discussions/1512 - -## I get `too many open files` errors on my Mac when I run `wails dev` - -By default, macOS will only allow you to open a maximum of 256 files. This can affect the `wails dev` command. -This limit can be increased by running: `ulimit -n 1024` in the terminal. - -FSNotify is [looking to move to Apple's fsevents](https://github.com/fsnotify/fsnotify/issues/11) for Mac. -If this isn't completed soon, we will create our own implementation, tracked [here](https://github.com/wailsapp/wails/issues/1733). - -## My Mac app gives me weird compilation errors - -A few users have reported seeing compilation errors such as the following: - -```shell -# github.com/wailsapp/wails/v2/internal/frontend/desktop/darwin -In file included from ../../pkg/mod/github.com/wailsapp/wails/v2@v2.0.0-beta.44.2/internal/frontend/desktop/darwin/callbacks.go:9: -In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:12: -/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSBundle.h:91:143: error: function does not return NSString -- (NSAttributedString *)localizedAttributedStringForKey:(NSString *)key value:(nullable NSString *)value table:(nullable NSString *)tableName NS_FORMAT_ARGUMENT(1) NS_REFINED_FOR_SWIFT API_AVAILABLE(macos(12.0), ios(15.0), watchos(8.0), tvos(15.0)); - ~~~~~~~~~~~~~~ ^ ~ -/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:103:48: note: expanded from macro 'NS_FORMAT_ARGUMENT' - #define NS_FORMAT_ARGUMENT(A) __attribute__ ((format_arg(A))) -``` - -This is *normally* due to a mismatch with the OS version you are running and the version of the XCode Command Line Tools -installed. If you see an error like this, try upgrading your XCode Command Line Tools to the latest version. - -Source: https://github.com/wailsapp/wails/issues/1806 \ No newline at end of file diff --git a/website/versioned_docs/version-v2.0.0-rc.1/guides/vscode.mdx b/website/versioned_docs/version-v2.0.0-rc.1/guides/vscode.mdx deleted file mode 100644 index e3d3e1f02..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/guides/vscode.mdx +++ /dev/null @@ -1,85 +0,0 @@ - -# Visual Studio Code - -This page is for miscellaneous tips and tricks when using Visual Studio Code with Wails. - -## Vetur Configuration - -Many thanks to [@Lyimmi](https://github.com/Lyimmi) for this tip. Originally posted -[here](https://github.com/wailsapp/wails/issues/1791#issuecomment-1228158349). - -Vetur is a popular plugin for Visual Studio Code that provides syntax highlighting and code completion -for Vue projects. When loading a Wails project in VSCode, Vetur will throw an error as it is expecting -to find the frontend project in the root directory. To fix this, you can do the following: - -Create a file named `vetur.config.js` in the project's root. - -```javascript -// vetur.config.js -/** @type {import('vls').VeturConfig} */ -module.exports = { - // **optional** default: `{}` - // override vscode settings - // Notice: It only affects the settings used by Vetur. - settings: { - "vetur.useWorkspaceDependencies": true, - "vetur.experimental.templateInterpolationService": true - }, - // **optional** default: `[{ root: './' }]` - // support monorepos - projects: [ - { - // **required** - // Where is your project? - // It is relative to `vetur.config.js`. - // root: './packages/repo1', - root: './frontend', - // **optional** default: `'package.json'` - // Where is `package.json` in the project? - // We use it to determine the version of vue. - // It is relative to root property. - package: './package.json', - // **optional** - // Where is TypeScript config file in the project? - // It is relative to root property. - tsconfig: './tsconfig.json', - // **optional** default: `'./.vscode/vetur/snippets'` - // Where is vetur custom snippets folders? - snippetFolder: './.vscode/vetur/snippets', - // **optional** default: `[]` - // Register globally Vue component glob. - // If you set it, you can get completion by that components. - // It is relative to root property. - // Notice: It won't actually do it. You need to use `require.context` or `Vue.component` - globalComponents: [ - './src/components/**/*.vue' - ] - } - ] -} -``` - -Next, configure `frontend/tsconfig.json`: - -```javascript -{ - "compilerOptions": { - "module": "system", - "noImplicitAny": true, - "removeComments": true, - "preserveConstEnums": true, - "sourceMap": true, - "outFile": "../../built/local/tsc.js", - "allowJs": true - }, - "exclude": [ - "node_modules", - "**/*.spec.ts" - ], - "include": [ - "src/**/*", - "wailsjs/**/*.ts" - ] -} -``` -This should enable you to now use Vetur as expected. diff --git a/website/versioned_docs/version-v2.0.0-rc.1/guides/windows-installer.mdx b/website/versioned_docs/version-v2.0.0-rc.1/guides/windows-installer.mdx deleted file mode 100644 index cb31d0527..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/guides/windows-installer.mdx +++ /dev/null @@ -1,58 +0,0 @@ -# NSIS installer - -

- -
-

- -Wails supports generating Windows installers using the [NSIS installer](https://nsis.sourceforge.io/). - -## Installing NSIS - -### Windows - -The installer is available on the [NSIS Download](https://nsis.sourceforge.io/Download) page. - -If you use the chocolatey package manager, run the following script: - -``` -choco install nsis -``` - -If you install NSIS manually, you need to add the _Bin_ folder, which contains `makensis.exe`, in your NSIS installation to your path. -[Here](https://www.architectryan.com/2018/03/17/add-to-the-path-on-windows-10/) is a good tutorial on how to add to path on Windows. - -### Linux - -The `nsis` package should be available through your distribution's package manager. - -### MacOS - -NSIS is available to install through homebrew: `brew install nsis`. - -## Generating the installer - -When a new project is created, Wails generates the NSIS configuration files in `build/windows/installer`. The config -data is read from `installer/info.json` and that is configured to use the project's `wails.json` Info section: - -```json -// ... - "Info": { - "companyName": "My Company Name", - "productName": "Wails Vite", - "productVersion": "1.0.0", - "copyright": "Copyright.........", - "comments": "Built using Wails (https://wails.io)" - }, -``` - -To generate an installer for your application, use the `-nsis` flag with `wails build`: - -``` -wails build -nsis -``` - -The installer will now be available in the `build/bin` directory. diff --git a/website/versioned_docs/version-v2.0.0-rc.1/guides/windows.mdx b/website/versioned_docs/version-v2.0.0-rc.1/guides/windows.mdx deleted file mode 100644 index 7d7167ecd..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/guides/windows.mdx +++ /dev/null @@ -1,71 +0,0 @@ -# Windows - -This page has miscellaneous guides related to developing Wails applications for Windows. - -## Handling the WebView2 Runtime Dependency - -Wails applications built for Windows have a runtime requirement on the Microsoft [WebView2 Runtime](https://developer.microsoft.com/en-us/microsoft-edge/webview2/). -Windows 11 will have this installed by default, but some machines won't. Wails offers an easy approach to dealing with this dependency. - -By using the `-webview2` flag when building, you can decide what your application will do when a suitable runtime is not detected (including if the installed runtime is too old). -The four options are: - -1. Download -2. Embed -3. Browser -4. Error - -### Download - -This option will prompt the user that no suitable runtime has been found and then offer to download and run the official -bootstrapper from Microsoft's WebView2 site. If the user proceeds, the official bootstrapper will be downloaded and run. - -### Embed - -This option embeds the official bootstrapper within the application. If no suitable runtime has been found, the -application will offer to run the bootstrapper. This adds ~150k to the binary size. - -### Browser - -This option will prompt the user that no suitable runtime has been found and then offer to open a browser to the official -WebView2 page where the bootstrapper can be downloaded and installed. The application will then exit, leaving the installation -up to the user. - -### Error - -If no suitable runtime is found, an error is given to the user and no further action taken. - -## Fixed version runtime - -Another way of dealing with webview2 dependency is shipping it yourself. -You can download [fixed version runtime](https://developer.microsoft.com/microsoft-edge/webview2/#download-section) and bundle or download it with your application. - -Also, you should specify path to fixed version of webview2 runtime in the `windows.Options` structure when launching wails. - -```go - wails.Run(&options.App{ - Windows: &windows.Options{ - WebviewBrowserPath: "", - }, - }) -``` - -Note: When `WebviewBrowserPath` is specified, `error` strategy will be forced in case of minimal required version -mismatch or invalid path to a runtime. - -## Spawning other programs - -When spawning other programs, such as scripts, you will see the window appear on the screen. To hide the window, -you can use the following code: - -```go -cmd := exec.Command("your_script.exe") -cmd.SysProcAttr = &syscall.SysProcAttr{ - HideWindow: true, - CreationFlags: 0x08000000, -} -cmd.Start() -``` - -Solution provided by [sithembiso](https://github.com/sithembiso) on the -[discussions board](https://github.com/wailsapp/wails/discussions/1734#discussioncomment-3386172). diff --git a/website/versioned_docs/version-v2.0.0-rc.1/howdoesitwork.mdx b/website/versioned_docs/version-v2.0.0-rc.1/howdoesitwork.mdx deleted file mode 100644 index 62fafb685..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/howdoesitwork.mdx +++ /dev/null @@ -1,405 +0,0 @@ ---- -sidebar_position: 20 ---- - -# How does it work? - -A Wails application is a standard Go application, with a webkit frontend. The Go part of the application consists of the -application code and a runtime library that provides a number of useful operations, like controlling the application -window. The frontend is a webkit window that will display the frontend assets. Also available to the frontend is a Javascript -version of the runtime library. Finally, it is possible to bind Go methods to the frontend, and these will appear as -Javascript methods that can be called, just as if they were local Javascript methods. - -
- -
- -## The Main Application - -### Overview - -The main application consists of a single call to `wails.Run()`. It accepts the -application configuration which describes the size of the application window, the window title, -what assets to use, etc. A basic application might look like this: - -```go title="main.go" -package main - -import ( - "embed" - "log" - - "github.com/wailsapp/wails/v2" - "github.com/wailsapp/wails/v2/pkg/options" -) - -//go:embed frontend/dist -var assets embed.FS - -func main() { - - app := &App{} - - err := wails.Run(&options.App{ - Title: "Basic Demo", - Width: 1024, - Height: 768, - Assets: &assets, - OnStartup: app.startup, - OnShutdown: app.shutdown, - Bind: []interface{}{ - app, - }, - }) - if err != nil { - log.Fatal(err) - } -} - - -type App struct { - ctx context.Context -} - -func (b *App) startup(ctx context.Context) { - b.ctx = ctx -} - -func (b *App) shutdown(ctx context.Context) {} - -func (b *App) Greet(name string) string { - return fmt.Sprintf("Hello %s!", name) -} -``` - -### Options rundown - -This example has the following options set: - -- `Title` - The text that should appear in the window's title bar -- `Width` & `Height` - The dimensions of the window -- `Assets` - The application's frontend assets -- `OnStartup` - A callback for when the window is created and is about to start loading the frontend assets -- `OnShutdown` - A callback for when the application is about to quit -- `Bind` - A slice of struct instances that we wish to expose to the frontend - -A full list of application options can be found in the [Options Reference](reference/options). - -#### Assets - -The `Assets` option is mandatory as you can't have a Wails application without frontend assets. Those assets can be -any files you would expect to find in a web application - html, js, css, svg, png, etc. **There is no requirement to -generate asset bundles** - plain files will do. When the application starts, it will attempt to load `index.html` -from your assets and the frontend will essentially work as a browser from that point on. It is worth noting that -there is no requirement on where in the `embed.FS` the files live. It is likely that the embed path uses a nested -directory relative to your main application code, such as `frontend/dist`: - -```go title="main.go" -//go:embed frontend/dist -var assets embed.FS -``` - -At startup, Wails will iterate the embedded files looking for the directory containing `index.html`. All other assets will be loaded relative -to this directory. - -As production binaries use the files contained in `embed.FS`, there are no external files required to be shipped with -the application. - -When running in development mode using the `wails dev` command, the assets are loaded off disk, and any changes result -in a "live reload". The location of the assets will be inferred from the `embed.FS`. - -More details can be found in the [Application Development Guide](guides/application-development.mdx). - -#### Application Lifecycle Callbacks - -Just before the frontend is about to load `index.html`, a callback is made to the function provided in [OnStartup](reference/options.mdx#onstartup). -A standard Go context is passed to this method. This context is required when calling the runtime so a standard pattern is to save -a reference to in this method. Just before the application shuts down, the [OnShutdown](reference/options.mdx#onshutdown) callback is called in the same way, -again with the context. There is also an [OnDomReady](reference/options.mdx#ondomready) callback for when the frontend -has completed loading all assets in `index.html` and is equivalent of the [`body onload`](https://www.w3schools.com/jsref/event_onload.asp) event in Javascript. -It is also possible to hook into the window close (or application quit) event by setting the -option [OnBeforeClose](reference/options.mdx#onbeforeclose). - -#### Method Binding - -The `Bind` option is one of the most important options in a Wails application. It specifies which struct methods -to expose to the frontend. Think of structs like "controllers" in a traditional web application. When the application -starts, it examines the struct instances listed in the `Bind` field in the options, determines which methods are -public (starts with an uppercase letter) and will generate Javascript versions of those methods that can be called -by the frontend code. - -:::info Note - -Wails requires that you pass in an _instance_ of the struct for it to bind it correctly - -::: - -In this example, we create a new `App` instance and then add this instance to the `Bind` option in `wails.Run`: - -```go {16,24} title="main.go" -package main - -import ( - "embed" - "log" - - "github.com/wailsapp/wails/v2" - "github.com/wailsapp/wails/v2/pkg/options" -) - -//go:embed frontend/dist -var assets embed.FS - -func main() { - - app := &App{} - - err := wails.Run(&options.App{ - Title: "Basic Demo", - Width: 1024, - Height: 768, - Assets: &assets, - Bind: []interface{}{ - app, - }, - }) - if err != nil { - log.Fatal(err) - } -} - - -type App struct { - ctx context.Context -} - -func (a *App) Greet(name string) string { - return fmt.Sprintf("Hello %s!", name) -} -``` - -You may bind as many structs as you like. Just make sure you create an instance of it and pass it in `Bind`: - -```go {8-10} - //... - err := wails.Run(&options.App{ - Title: "Basic Demo", - Width: 1024, - Height: 768, - Assets: &assets, - Bind: []interface{}{ - app, - &mystruct1{}, - &mystruct2{}, - }, - }) - -``` - -When you run `wails dev` (or `wails generate module`), a frontend module will be generated containing the following: - -- Javascript bindings for all bound methods -- Typescript declarations for all bound methods -- Typescript definitions for all Go structs used as inputs or outputs by the bound methods - -This makes it incredibly simple to call Go code from the frontend, using the same strongly typed datastructures. - -## The Frontend - -### Overview - -The frontend is a collection of files rendered by webkit. It's like a browser and webserver in one. -There is virtually[^1] no limit to which frameworks or libraries you can use. The main points of interaction between -the frontend and your Go code are: - -- Calling bound Go methods -- Calling runtime methods - -[^1]: - There is a very small subset of libraries that use features unsupported in WebViews. There are often alternatives and - workarounds for such cases. - -### Calling bound Go methods - -When you run your application with `wails dev`, it will automatically generate Javascript bindings for your structs in a -directory called `wailsjs/go` (You can also do this by running `wails generate module`). The generated files mirror the -package names in your application. In the example above, we bind `app`, which has one public method `Greet`. This will -lead to the generation of the following files: - -```bash -wailsjs - └─go - └─main - ├─App.d.ts - └─App.js -``` - -Here we can see that there is a `main` package that contains the Javascript bindings for the bound `App` struct, as well -as the Typescript declaration file for those methods. To call `Greet` from our frontend, we simply import the method and -call it like a regular Javascript function: - -```javascript -// ... -import { Greet } from "../wailsjs/go/main/App"; - -function doGreeting(name) { - Greet(name).then((result) => { - // Do something with result - }); -} -``` - -The Typescript declaration file gives you the correct types for the bound methods: - -```ts -export function Greet(arg1: string): Promise; -``` - -The generated methods return a Promise. A successful call will result in the first return value from the Go call to be passed -to the `resolve` handler. An unsuccessful call is when a Go method that has an error type as it's second return value, -passes an error instance back to the caller. This is passed back via the `reject` handler. -In the example above, `Greet` only returns a `string` so the Javascript call will never reject - unless invalid data -is passed to it. - -All data types are correctly translated between Go and Javascript. Even structs. If you return a struct from a Go call, -it will be returned to your frontend as a Javascript class. Note: If you wish to use structs, you **must** define -`json` struct tags for your fields! - -:::info Note -Anonymous nested structs are not supported at this time. -::: - -It is possible to send structs back to Go. Any Javascript map/class passed as an argument that -is expecting a struct, will be converted to that struct type. To make this process a lot easier, in `dev` mode, -a TypeScript module is generated, defining all the struct types used in bound methods. Using this module, it's possible -to construct and send native Javascript objects to the Go code. - -There is also support for Go methods that use structs in their signature. All Go structs -specified by a bound method (either as parameters or return types) will have Typescript versions auto -generated as part of the Go code wrapper module. Using these, it's possible to share the same data -model between Go and Javascript. - -Example: We update our `Greet` method to accept a `Person` instead of a string: - -```go title="main.go" -type Person struct { - Name string `json:"name"` - Age uint8 `json:"age"` - Address *Address `json:"address"` -} - -type Address struct { - Street string `json:"street"` - Postcode string `json:"postcode"` -} - -func (a *App) Greet(p Person) string { - return fmt.Sprintf("Hello %s (Age: %d)!", p.Name, p.Age) -} -``` - -The `wailsjs/go/main/App.js` file will still have the following code: - -```js title="App.js" -export function Greet(arg1) { - return window["go"]["main"]["App"]["Greet"](arg1); -} -``` - -But the `wailsjs/go/main/App.d.ts` file will be updated with the following code: - -```ts title="App.d.ts" -import { main } from "../models"; - -export function Greet(arg1: main.Person): Promise; -``` - -As we can see, the "main" namespace is imported from a new "models.ts" file. This file contains all the struct definitions -used by our bound methods. In this example, this is a `Person` struct. If we look at `models.ts`, we can see how the models -are defined: - -```ts title="models.ts" -export namespace main { - export class Address { - street: string; - postcode: string; - - static createFrom(source: any = {}) { - return new Address(source); - } - - constructor(source: any = {}) { - if ("string" === typeof source) source = JSON.parse(source); - this.street = source["street"]; - this.postcode = source["postcode"]; - } - } - export class Person { - name: string; - age: number; - address?: Address; - - static createFrom(source: any = {}) { - return new Person(source); - } - - constructor(source: any = {}) { - if ("string" === typeof source) source = JSON.parse(source); - this.name = source["name"]; - this.age = source["age"]; - this.address = this.convertValues(source["address"], Address); - } - - convertValues(a: any, classs: any, asMap: boolean = false): any { - if (!a) { - return a; - } - if (a.slice) { - return (a as any[]).map((elem) => this.convertValues(elem, classs)); - } else if ("object" === typeof a) { - if (asMap) { - for (const key of Object.keys(a)) { - a[key] = new classs(a[key]); - } - return a; - } - return new classs(a); - } - return a; - } - } -} -``` - -So long as you have TypeScript as part of your frontend build configuration, you can use these models in -the following way: - -```js title="mycode.js" -import { Greet } from "../wailsjs/go/main/App"; -import { main } from "../wailsjs/go/models"; - -function generate() { - let person = new main.Person(); - person.name = "Peter"; - person.age = 27; - Greet(person).then((result) => { - console.log(result); - }); -} -``` - -The combination of generated bindings and TypeScript models makes for a powerful development environment. - -More information on Binding can be found in the [Binding Methods](guides/application-development.mdx#binding-methods) -section of the [Application Development Guide](guides/application-development.mdx). - -### Calling runtime methods - -The Javascript runtime is located at `window.runtime` and contains many methods to do various -tasks such as emit an event or perform logging operations: - -```js title="mycode.js" -window.runtime.EventsEmit("my-event", 1); -``` - -More details about the JS runtime can be found in the [Runtime Reference](reference/runtime/intro). diff --git a/website/versioned_docs/version-v2.0.0-rc.1/introduction.mdx b/website/versioned_docs/version-v2.0.0-rc.1/introduction.mdx deleted file mode 100644 index 6ef1e7523..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/introduction.mdx +++ /dev/null @@ -1,90 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Introduction - -Wails is a project that enables you to write desktop apps using Go and web technologies. - -Consider it a lightweight and fast Electron alternative for Go. You can easily build applications with the flexibility -and power of Go, combined with a rich, modern frontend. - -### Features - -- Native Menus, Dialogs, Theming and Translucency -- Windows, macOS and linux support -- Built in templates for Svelte, React, Preact, Vue, Lit and Vanilla JS -- Easily call Go methods from Javascript -- Automatic Go struct to Typescript model generation -- No CGO or external DLLs required on Windows -- Live development mode using the power of [Vite](https://vite.net/) -- Powerful CLI to easily Create, Build and Package applications -- A rich [runtime library](/docs/next/reference/runtime) -- Applications built with Wails are Apple & Microsoft Store compliant - - -This is [varly](https://varly.app) - a desktop application for -MacOS & Windows written using Wails. Not only does it look great, it uses native menus and translucency - everything -you'd expect from a modern native app. - -

- - - -

- -### Quick Start Templates - -Wails comes with a number of pre-configured templates that allow you to get your application up and running quickly. -There are templates for the following frameworks: Svelte, React, Vue, Preact, Lit and Vanilla. There are both Javascript -and Typescript versions for each template. - -### Native Elements - -Wails uses a purpose built library for handling native elements such as Window, Menus, Dialogs, etc, so you can build -good-looking, feature rich desktop applications. - -**It does not embed a browser**, so it is resource efficient. Instead, it uses the native rendering engine for the -platform. On Windows, this is the new Microsoft Webview2 library, built on Chromium. - -### Go & Javascript Interoperability - -Wails automatically makes your Go methods available to Javascript, so you can call them by name from your frontend! -It even generates Typescript models for the structs used by your Go methods, so you can pass the same data structures -between Go and Javascript. - -### Runtime Library - -Wails provides a runtime library, for both Go and Javascript, that handles a lot of the things modern applications need, -like Eventing, Logging, Dialogs, etc. - -### Live Development Experience - -#### Automatic Rebuilds - -When you run your application in "dev" mode, Wails will build your application as a native desktop application, but will -read your assets from disk. It will detect any changes to your Go code and automatically rebuild and relaunch your -application. - -#### Automatic Reloads - -When changes to your application assets are detected, your running application will "reload", reflecting your changes -almost immediately. - -#### Develop your application in a Browser - -If you prefer to debug and develop in a browser then Wails has you covered. The running application also has a webserver -that will run your application in any browser that connects to it. It will even refresh when your assets change on disk. - -### Production-ready Native Binaries - -When you're ready to do the final build of your application, the CLI will compile it down to a single executable, with -all the assets bundled into it. On Windows and MacOS, it is possible to create a native package for distribution. The -assets used in packaging (icon, info.plist, manifest file, etc) are part of your project and may be customised, giving -you total control over how your applications are built. - -### Tooling - -The Wails CLI provides a hassle-free way to generate, build and bundle your applications. It will do the heavy lifting -of creating icons, compiling your application with optimal settings and delivering a distributable, production ready -binary. Choose from a number of starter templates to get up and running quickly! diff --git a/website/versioned_docs/version-v2.0.0-rc.1/reference/_category_.json b/website/versioned_docs/version-v2.0.0-rc.1/reference/_category_.json deleted file mode 100644 index ebb337b83..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/reference/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Reference", - "position": 40 -} diff --git a/website/versioned_docs/version-v2.0.0-rc.1/reference/cli.mdx b/website/versioned_docs/version-v2.0.0-rc.1/reference/cli.mdx deleted file mode 100644 index 011ffb8e4..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/reference/cli.mdx +++ /dev/null @@ -1,226 +0,0 @@ ---- -sidebar_position: 2 ---- - -# CLI - -The Wails CLI has a number of commands that are used for managing your projects. All commands are run in the following way: - -`wails ` - -## init - -`wails init` is used for generating projects. - -| Flag | Description | Default | -| :----------------- | :---------------------------------------------------------------------------------------------------------------------- | :-----------------: | -| -n "project name" | Name of the project. **Mandatory**. | | -| -d "project dir" | Project directory to create | Name of the project | -| -g | Initialise git repository | | -| -l | List available project templates | | -| -q | Suppress output to console | | -| -t "template name" | The project template to use. This can be the name of a default template or a URL to a remote template hosted on github. | vanilla | -| -ide | Generate IDE project files | | -| -f | Force build application | false | - -Example: -`wails init -n test -d mytestproject -g -ide vscode -q` - -This will generate a a project called "test" in the "mytestproject" directory, initialise git, -generate vscode project files and do so silently. - -More information on using IDEs with Wails can be found [here](../guides/ides.mdx). - -### Remote Templates - -Remote templates (hosted on GitHub) are supported and can be installed by using the template's project URL. - -Example: -`wails init -n test -t https://github.com/leaanthony/testtemplate[@v1.0.0]` - -A list of community maintained templates can be found [here](../community/templates.mdx) - -:::warning Attention - -**The Wails project does not maintain, is not responsible nor liable for 3rd party templates!** - -If you are unsure about a template, inspect `package.json` and `wails.json` for what scripts are run and what packages are installed. - -::: - -## build - -`wails build` is used for compiling your project to a production-ready binary. - -| Flag | Description | Default | -| :------------------- |:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| :-------------------------------------------------------------------------------------------------------------------------------------------- | -| -platform | Build for the given (comma delimited) [platforms](../reference/cli.mdx#platforms) eg. `windows/arm64`. Note, if you do not give the architecture, `runtime.GOARCH` is used. | platform = `GOOS` environment variable if given else `runtime.GOOS`.
arch = `GOARCH` envrionment variable if given else `runtime.GOARCH`. | -| -clean | Cleans the `build/bin` directory | | -| -compiler "compiler" | Use a different go compiler to build, eg go1.15beta1 | go | -| -ldflags "flags" | Additional ldflags to pass to the compiler | | -| -nopackage | Do not package application | | -| -o filename | Output filename | | -| -s | Skip building the frontend | false | -| -f | Force build application | false | -| -tags "extra tags" | Build tags to pass to Go compiler. Must be quoted. Space or comma (but not both) separated | | -| -upx | Compress final binary using "upx" | | -| -upxflags | Flags to pass to upx | | -| -v int | Verbosity level (0 - silent, 1 - default, 2 - verbose) | 1 | -| -webview2 | WebView2 installer strategy: download,embed,browser,error | download | -| -u | Updates your project's `go.mod` to use the same version of Wails as the CLI | | -| -debug | Retains debug information in the application. Allows the use of the devtools in the application window | false | -| -trimpath | Remove all file system paths from the resulting executable. | false | -| -race | Build with Go's race detector | false | -| -windowsconsole | Keep the console window for Windows builds | false | - -For a detailed description of the `webview2` flag, please refer to the [Windows](../guides/windows.mdx) Guide. - -If you prefer to build using standard Go tooling, please consult the [Manual Builds](../guides/manual-builds.mdx) -guide. - -Example: - -`wails build -clean -o myproject.exe` - -:::info UPX on Apple Silicon - -There are [issues](https://github.com/upx/upx/issues/446) with using UPX with Apple Silicon. - -::: - -:::info UPX on Windows - -Some Antivirus vendors false positively mark `upx` compressed binaries as virus, see [issue](https://github.com/upx/upx/issues/437). - -::: - -### Platforms - -Supported platforms are: - -| Platform | Description | -| :--------------- | :-------------------------------------------- | -| darwin | MacOS + architecture of build machine | -| darwin/amd64 | MacOS 10.13+ AMD64 | -| darwin/arm64 | MacOS 11.0+ ARM64 | -| darwin/universal | MacOS AMD64+ARM64 universal application | -| windows | Windows 10/11 + architecture of build machine | -| windows/amd64 | Windows 10/11 AMD64 | -| windows/arm64 | Windows 10/11 ARM64 | -| linux | Linux + architecture of build machine | -| linux/amd64 | Linux AMD64 | -| linux/arm64 | Linux ARM64 | - -## doctor - -`wails doctor` will run diagnostics to ensure that your system is ready for development. - -Example: - -``` -Wails CLI v2.0.0-beta - -Scanning system - Please wait (this may take a long time)...Done. - -System ------- -OS: Windows 10 Pro -Version: 2009 (Build: 19043) -ID: 21H1 -Go Version: go1.17 -Platform: windows -Architecture: amd64 - -Dependency Package Name Status Version ----------- ------------ ------ ------- -WebView2 N/A Installed 93.0.961.52 -npm N/A Installed 6.14.15 -*upx N/A Installed upx 3.96 - -* - Optional Dependency - -Diagnosis ---------- -Your system is ready for Wails development! - -``` - -## dev - -`wails dev` is used to run your application in a "live development" mode. This means: - -- The application's `go.mod` will be updated to use the same version of Wails as the CLI -- The application is compiled and run automatically -- A watcher is started and will trigger a rebuild of your dev app if it detects changes to your go files -- A webserver is started on `http://localhost:34115` which serves your application (not just frontend) over http. This allows you to use your favourite browser development extensions -- All application assets are loaded from disk. If they are changed, the application will automatically reload (not rebuild). All connected browsers will also reload -- A JS module is generated that provides the following: - - Javascript wrappers of your Go methods with autogenerated JSDoc, providing code hinting - - TypeScript versions of your Go structs, that can be constructed and passed to your go methods -- A second JS module is generated that provides a wrapper + TS declaration for the runtime - -| Flag | Description | Default | -| :--------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------- | -| -assetdir "./path/to/assets" | Serve assets from the given directory instead of using the provided asset FS | Value in `wails.json` | -| -browser | Opens a browser to `http://localhost:34115` on startup | | -| -compiler "compiler" | Use a different go compiler to build, eg go1.15beta1 | go | -| -e | Extensions to trigger rebuilds (comma separated) | go | -| -reloaddirs | Additional directories to trigger reloads (comma separated) | Value in `wails.json` | -| -ldflags "flags" | Additional ldflags to pass to the compiler | | -| -tags "extra tags" | Build tags to pass to compiler (quoted and space separated) | | -| -loglevel "loglevel" | Loglevel to use - Trace, Debug, Info, Warning, Error | Debug | -| -noreload | Disable automatic reload when assets change | | -| -nogen | Disable generate module | | -| -v | Verbosity level (0 - silent, 1 - standard, 2 - verbose) | 1 | -| -wailsjsdir | The directory to generate the generated Wails JS modules | Value in `wails.json` | -| -debounce | The time to wait for reload after an asset change is detected | 100 (milliseconds) | -| -devserver "host:port" | The address to bind the wails dev server to | "localhost:34115" | -| -frontenddevserverurl "url" | Use 3rd party dev server url to serve assets, EG Vite | "" | -| -appargs "args" | Arguments passed to the application in shell style | | -| -save | Saves the given `assetdir`, `reloaddirs`, `wailsjsdir`, `debounce`, `devserver` and `frontenddevserverurl` flags in `wails.json` to become the defaults for subsequent invocations. | | -| -race | Build with Go's race detector | false | -| -s | Skip building the frontend | false | - -Example: - -`wails dev -assetdir ./frontend/dist -wailsjsdir ./frontend/src -browser` - -This command will do the following: - -- Build the application and run it (more details [here](../guides/manual-builds.mdx) -- Generate the Wails JS modules in `./frontend/src` -- Watch for updates to files in `./frontend/dist` and reload on any change -- Open a browser and connect to the application - -There is more information on using this feature with existing framework scripts [here](../guides/application-development.mdx#live-reloading). - -## generate - -### template - -Wails uses templates for project generation. The `wails generate template` command helps scaffold a template so that -it may be used for generating projects. - -| Flag | Description | -| :--------------- | :------------------------------------------ | -| -name | The template name (Mandatory) | -| -frontend "path" | Path to frontend project to use in template | - -For more details on creating templates, consult the [Templates guide](../guides/templates.mdx). - -### module - -The `wails generate module` command allows you to manually generate the `wailsjs` directory for your application. - -## update - -`wails update` will update the version of the Wails CLI. - -| Flag | Description | -| :----------------- | :------------------------------------ | -| -pre | Update to latest pre-release version | -| -version "version" | Install a specific version of the CLI | - -## version - -`wails version` will simply output the current CLI version. diff --git a/website/versioned_docs/version-v2.0.0-rc.1/reference/menus.mdx b/website/versioned_docs/version-v2.0.0-rc.1/reference/menus.mdx deleted file mode 100644 index 608b392bb..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/reference/menus.mdx +++ /dev/null @@ -1,271 +0,0 @@ ---- -sidebar_position: 4 ---- - -# Menus - -It is possible to add an application menu to Wails projects. This is achieved by defining a [Menu](#menu) struct and -setting it in the [`Menu`](../reference/options.mdx#menu) application config, or by calling the runtime method -[MenuSetApplicationMenu](../reference/runtime/menu.mdx#menusetapplicationmenu). - -An example of how to create a menu: - -```go - AppMenu := menu.NewMenu() - FileMenu := AppMenu.AddSubmenu("File") - FileMenu.AddText("&Open", keys.CmdOrCtrl("o"), openFile) - FileMenu.AddSeparator() - FileMenu.AddText("Quit", keys.CmdOrCtrl("q"), func(_ *menu.CallbackData) { - runtime.Quit() - }) - - if runtime.GOOS == "darwin" { - AppMenu.Append(menu.EditMenu()) // on macos platform, we should append EditMenu to enable Cmd+C,Cmd+V,Cmd+Z... shortcut - } - - err := wails.Run(&options.App{ - Title: "Menus Demo", - Width: 800, - Height: 600, - Menu: AppMenu, - Bind: []interface{}{ - app, - }, - ) - // ... -``` - -It is also possible to dynamically update the menu, by updating the menu struct and calling -[MenuUpdateApplicationMenu](../reference/runtime/menu.mdx#menuupdateapplicationmenu). - -The example above uses helper methods, however it's possible to build the menu structs manually. - -## Menu - -A Menu is a collection of MenuItems: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -type Menu struct { - Items []*MenuItem -} -``` - -For the Application menu, each MenuItem represents a single menu such as "Edit". - -A simple helper method is provided for building menus: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -func NewMenuFromItems(first *MenuItem, rest ...*MenuItem) *Menu -``` - -This makes the layout of the code more like that of a menu without the need to add the menu items manually after creating them. -Alternatively, you can just create the menu items and add them to the menu manually. - -## MenuItem - -A MenuItem represents an item within a Menu. - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -// MenuItem represents a menu item contained in a menu -type MenuItem struct { - Label string - Role Role - Accelerator *keys.Accelerator - Type Type - Disabled bool - Hidden bool - Checked bool - SubMenu *Menu - Click Callback -} -``` - -| Field | Type | Notes | -| ----------- | ---------------------------------- | ------------------------------------------------------------- | -| Label | string | The menu text | -| Accelerator | [\*keys.Accelerator](#accelerator) | Key binding for this menu item | -| Type | [Type](#type) | Type of MenuItem | -| Disabled | bool | Disables the menu item | -| Hidden | bool | Hides this menu item | -| Checked | bool | Adds check to item (Checkbox & Radio types) | -| SubMenu | [\*Menu](#menu) | Sets the submenu | -| Click | [Callback](#callback) | Callback function when menu clicked | -| Role | string | Defines a [role](#role) for this menu item. Mac only for now. | - -### Accelerator - -Accelerators (sometimes called keyboard shortcuts) define a binding between a keystroke and a menu item. Wails defines -an Accelerator as a combination or key + [Modifier](#modifier). They are available in the `"github.com/wailsapp/wails/v2/pkg/menu/keys"` package. - -Example: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" - // Defines cmd+o on Mac and ctrl-o on Window/Linux - myShortcut := keys.CmdOrCtrl("o") -``` - -Keys are any single character on a keyboard with the exception of `+`, which is defined as `plus`. -Some keys cannot be represented as characters so there are a set of named characters that may be used: - -- `backspace` -- `tab` -- `return` -- `enter` -- `escape` -- `left` -- `right` -- `up` -- `down` -- `space` -- `delete` -- `home` -- `end` -- `page up` -- `page down` -- `f1` -- `f2` -- `f3` -- `f4` -- `f5` -- `f6` -- `f7` -- `f8` -- `f9` -- `f10` -- `f11` -- `f12` -- `f13` -- `f14` -- `f15` -- `f16` -- `f17` -- `f18` -- `f19` -- `f20` -- `f21` -- `f22` -- `f23` -- `f24` -- `f25` -- `f26` -- `f27` -- `f28` -- `f29` -- `f30` -- `f31` -- `f32` -- `f33` -- `f34` -- `f35` -- `numlock` - -Wails also supports parsing accelerators using the same syntax as Electron. This is useful for storing accelerators in -config files. - -Example: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" - // Defines cmd+o on Mac and ctrl-o on Window/Linux - myShortcut, err := keys.Parse("Ctrl+Option+A") -``` - -#### Modifier - -The following modifiers are keys that may be used in combination with the accelerator key: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" -const ( - // CmdOrCtrlKey represents Command on Mac and Control on other platforms - CmdOrCtrlKey Modifier = "cmdorctrl" - // OptionOrAltKey represents Option on Mac and Alt on other platforms - OptionOrAltKey Modifier = "optionoralt" - // ShiftKey represents the shift key on all systems - ShiftKey Modifier = "shift" - // ControlKey represents the control key on all systems - ControlKey Modifier = "ctrl" -) -``` - -A number of helper methods are available to create Accelerators using modifiers: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" -func CmdOrCtrl(key string) *Accelerator -func OptionOrAlt(key string) *Accelerator -func Shift(key string) *Accelerator -func Control(key string) *Accelerator -``` - -Modifiers can be combined using `keys.Combo(key string, modifier1 Modifier, modifier2 Modifier, rest ...Modifier)`: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" - // Defines "Ctrl+Option+A" on Mac and "Ctrl+Alt+A" on Window/Linux - myShortcut := keys.Combo("a", ControlKey, OptionOrAltKey) -``` - -### Type - -Each menu item must have a type and there are 5 types available: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -const ( - TextType Type = "Text" - SeparatorType Type = "Separator" - SubmenuType Type = "Submenu" - CheckboxType Type = "Checkbox" - RadioType Type = "Radio" -) -``` - -For convenience, helper methods are provided to quickly create a menu item: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -func Text(label string, accelerator *keys.Accelerator, click Callback) *MenuItem -func Separator() *MenuItem -func Radio(label string, selected bool, accelerator *keys.Accelerator, click Callback) *MenuItem -func Checkbox(label string, checked bool, accelerator *keys.Accelerator, click Callback) *MenuItem -func SubMenu(label string, menu *Menu) *Menu -``` - -You can also create menu items directly on a menu by using the "Add" helpers: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -func (m *Menu) AddText(label string, accelerator *keys.Accelerator, click Callback) *MenuItem -func (m *Menu) AddSeparator() *MenuItem -func (m *Menu) AddRadio(label string, selected bool, accelerator *keys.Accelerator, click Callback) *MenuItem -func (m *Menu) AddCheckbox(label string, checked bool, accelerator *keys.Accelerator, click Callback) *MenuItem -func (m *Menu) AddSubMenu(label string, menu *Menu) *MenuI -``` - -A note on radio groups: A radio group is defined as a number of radio menu items that are next to each other in the menu. -This means that you do not need to group items together as it is automatic. However, that also means you cannot have 2 -radio groups next to each other - there must be a non-radio item between them. - -### Callback - -Each menu item may have a callback that is executed when the item is clicked: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -type Callback func(*CallbackData) - -type CallbackData struct { - MenuItem *MenuItem -} -``` - -The function is given a `CallbackData` struct which indicates which menu item triggered the callback. This is useful when -using radio groups that may share a callback. - -### Role - -:::info Roles - -Roles are currently supported on Mac only. - -::: - -A menu item may have a role, which is essentially a pre-defined menu item. We currently support the following roles: - -| Role | Description | -| ------------ | ------------------------------------------------------------------------ | -| AppMenuRole | The standard Mac application menu. Can be created using `menu.AppMenu()` | -| EditMenuRole | The standard Mac edit menu. Can be created using `menu.EditMenu()` | diff --git a/website/versioned_docs/version-v2.0.0-rc.1/reference/options.mdx b/website/versioned_docs/version-v2.0.0-rc.1/reference/options.mdx deleted file mode 100644 index 5371ed964..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/reference/options.mdx +++ /dev/null @@ -1,668 +0,0 @@ ---- -sidebar_position: 3 ---- - -# Options - -## Application Options - -The `Options.App` struct contains the application configuration. -It is passed to the `wails.Run()` method: - -```go title="Example" -import "github.com/wailsapp/wails/v2/pkg/options" - -func main() { - - err := wails.Run(&options.App{ - Title: "Menus Demo", - Width: 800, - Height: 600, - DisableResize: false, - Fullscreen: false, - Frameless: true, - MinWidth: 400, - MinHeight: 400, - MaxWidth: 1280, - MaxHeight: 1024, - StartHidden: false, - HideWindowOnClose: false, - BackgroundColour: &options.RGBA{R: 0, G: 0, B: 0, A: 255}, - AlwaysOnTop: false, - Assets: assets, - AssetsHandler: assetsHandler, - Menu: app.applicationMenu(), - Logger: nil, - LogLevel: logger.DEBUG, - LogLevelProduction: logger.ERROR, - OnStartup: app.startup, - OnDomReady: app.domready, - OnShutdown: app.shutdown, - OnBeforeClose: app.beforeClose, - WindowStartState: options.Maximised, - CSSDragProperty: "--wails-draggable", - CSSDragValue: "drag", - Bind: []interface{}{ - app, - }, - Windows: &windows.Options{ - WebviewIsTransparent: false, - WindowIsTranslucent: false, - DisableWindowIcon: false, - DisableFramelessWindowDecorations: false, - WebviewUserDataPath: "", - WebviewBrowserPath: "", - Theme: windows.SystemDefault, - CustomTheme: &windows.ThemeSettings{ - DarkModeTitleBar: windows.RGB(20, 20, 20), - DarkModeTitleText: windows.RGB(200, 200, 200), - DarkModeBorder: windows.RGB(20, 0, 20), - LightModeTitleBar: windows.RGB(200, 200, 200), - LightModeTitleText: windows.RGB(20, 20, 20), - LightModeBorder: windows.RGB(200, 200, 200), - }, - // User messages that can be customised - Messages *windows.Messages - }, - Mac: &mac.Options{ - TitleBar: &mac.TitleBar{ - TitlebarAppearsTransparent: true, - HideTitle: false, - HideTitleBar: false, - FullSizeContent: false, - UseToolbar: false, - HideToolbarSeparator: true, - }, - Appearance: mac.NSAppearanceNameDarkAqua, - WebviewIsTransparent: true, - WindowIsTranslucent: false, - About: &mac.AboutInfo{ - Title: "My Application", - Message: "© 2021 Me", - Icon: icon, - }, - }, - Linux: &linux.Options{ - Icon: icon, - }, - }) - if err != nil { - log.Fatal(err) - } -} - -``` - -### Title - -The text shown in the window's title bar. - -Type: `string` - -### Width - -The initial width of the window. - -Type: `int`
-Default: 1024. - -### Height - -The initial height of the window. - -Type: `int`
-Default: 768 - -### DisableResize - -By default, the main window is resizable. Setting this to `true` will keep it a fixed size. - -Type: `bool` - -### Fullscreen - -Setting this to `true` will make the window fullscreen at startup. - -Type: `bool` - -### Frameless - -When set to `true`, the window will have no borders or title bar. -Also see [Frameless Windows](../guides/frameless.mdx). - -Type: `bool` - -### MinWidth - -This sets the minimum width for the window. If the value given in `Width` is less than this value, -the window will be set to `MinWidth` by default. - -Type: `int` - -### MinHeight - -This sets the minimum height for the window. If the value given in `Height` is less than this value, -the window will be set to `MinHeight` by default. - -Type: `int` - -### MaxWidth - -This sets the maximum width for the window. If the value given in `Width` is more than this value, -the window will be set to `MaxWidth` by default. - -Type: `int` - -### MaxHeight - -This sets the maximum height for the window. If the value given in `Height` is more than this value, -the window will be set to `MaxHeight` by default. - -Type: `int` - -### StartHidden - -When set to `true`, the application will be hidden until [WindowShow](../reference/runtime/window.mdx#windowshow) -is called. - -Type: `bool` -### HideWindowOnClose - -By default, closing the window will close the application. Setting this to `true` means closing the window will - -hide the window instead. - -Type: `bool` - -### BackgroundColour - -This value is the default background colour of the window. -Example: options.NewRGBA(255,0,0,128) - Red at 50% transparency - -Type: `*options.RGBA`
-Default: white - -### AlwaysOnTop - -Indicates that the window should stay above other windows when losing focus. - -Type: `bool` - -### Assets - -The frontend assets to be used by the application. Requires an `index.html` file. - -Type: `embed.FS` - -### AssetsHandler - - - -The assets handler is a generic `http.Handler` which will be called for any non GET request on the assets server -and for GET requests which can not be served from the `assets` because the file is not found. - -| Value | Win | Mac | Lin | -| ----------------------- | --- | --- | --- | -| GET | ✅ | ✅ | ✅ | -| POST | ✅ | ✅ | ❌ | -| PUT | ✅ | ✅ | ❌ | -| PATCH | ✅ | ✅ | ❌ | -| DELETE | ✅ | ✅ | ❌ | -| Request Headers | ✅ | ✅ | ❌ | -| Request Body | ✅ | ✅ | ❌ | -| Request Body Streaming | ❌ | ❌ | ❌ | -| Response StatusCodes | ✅ | ✅ | ❌ | -| Response Headers | ✅ | ✅ | ❌ | -| Response Body | ✅ | ✅ | ✅ | -| Response Body Streaming | ❌ | ❌ | ✅ | - -NOTE: Linux is currently very limited due to targeting a WebKit2GTK Version < 2.36.0. In the future some features will be -supported by the introduction of WebKit2GTK 2.36.0+ support. - -NOTE: When used in combination with a Frontend DevServer there might be limitations, eg. Vite serves the index.html -on every path, that does not contain a file extension. - -Type: `http.Handler` - -### Menu - -The menu to be used by the application. More details about Menus in the [Menu Reference](../reference/runtime/menu.mdx). - -:::note -On Mac, if no menu is specified, a default menu will be created. -::: - -Type: `*menu.Menu` - -### Logger - -The logger to be used by the application. More details about logging in the [Log Reference](../reference/runtime/log.mdx). - -Type: `logger.Logger`
-Default: Logs to Stdout - -### LogLevel - -The default log level. More details about logging in the [Log Reference](../reference/runtime/log.mdx). - -Type: `logger.LogLevel`
-Default: `Info` in dev mode, `Error` in production mode - -### LogLevelProduction - -The default log level for production builds. More details about logging in the [Log Reference](../reference/runtime/log.mdx). - -Type: `logger.LogLevel`
-Default: `Error` - -### OnStartup - -This callback is called after the frontend has been created, but before `index.html` has been loaded. It is given -the application context. - -Type: `func(ctx context.Context)` - -### OnDomReady - -This callback is called after the frontend has loaded `index.html` and its resources. It is given -the application context. - -Type: `func(ctx context.Context)` - -### OnShutdown - -This callback is called after the frontend has been destroyed, just before the application terminates. It is given -the application context. - -Type: `func(ctx context.Context)` - -### OnBeforeClose - -If this callback is set, it will be called when the application is about to quit, either by clicking the window close -button or calling `runtime.Quit`. Returning true will cause the application to continue, false will continue shutdown -as normal. This is good for confirming with the user that they wish to exit the program. - -Example: - -```go title=windowsapp.go -func (b *App) beforeClose(ctx context.Context) (prevent bool) { - dialog, err := runtime.MessageDialog(ctx, runtime.MessageDialogOptions{ - Title: "Quit?", - Message: "Are you sure you want to quit?", - - Type: ` runtime`.QuestionDialog, - - }) - - if err != nil { - return false - } - return dialog != "Yes" -} -``` - -Type: `func(ctx context.Context) bool` - -### WindowStartState - -Defines how the window should present itself at startup. - -| Value | Win | Mac | Lin | -| ---------- | --- | --- | --- | -| Fullscreen | ✅ | ✅ | ✅ | -| Maximised | ✅ | ✅ | ✅ | -| Minimised | ✅ | ❌ | ✅ | - -Type: `options.WindowStartState` - -### CSSDragProperty - -Indicates the CSS property to use to identify which elements can be used to drag the window. Default: `--wails-draggable`. - -Type: `string` - -### CSSDragValue - -Indicates what value the `CSSDragProperty` style should have to drag the window. Default: `drag`. - -Type: `string` - -### Bind - -A slice of struct instances defining methods that need to be bound to the frontend. - -Type: `[]interface{}` - -### Windows - -This defines [Windows specific options](#windows-specific-options). - -Type: `*windows.Options` - -### Mac - -This defines [Mac specific options](#mac-specific-options). - -Type: `*mac.Options` - -### Linux - -This defines [Linux specific options](#linux-specific-options). - -Type: `*linux.Options` - -## Windows Specific Options - -### WebviewIsTransparent - -Setting this to `true` will make the webview background transparent when an alpha value of `0` is used. -This means that if you use `rgba(0,0,0,0)` for `background-color` in your CSS, the host window will show through. -Often combined with [WindowIsTranslucent](#WindowIsTranslucent) to make frosty-looking applications. - -Type: `bool` - -### WindowIsTranslucent - -Setting this to `true` will make the window background translucent. Often combined -with [WebviewIsTransparent](#WebviewIsTransparent) to make frosty-looking applications. - -Type: `bool` - -### DisableWindowIcon - -Setting this to `true` will remove the icon in the top left corner of the title bar. - -Type: `bool` - -### DisableFramelessWindowDecorations - -Setting this to `true` will remove the window decorations in [Frameless](#Frameless) mode. This means there will be no -'Aero Shadow' and no 'Rounded Corners' shown for the window. Please note that 'Rounded Corners' are only supported on -Windows 11. - -Type: `bool` - -### WebviewUserDataPath - -This defines the path where the WebView2 stores the user data. If empty `%APPDATA%\[BinaryName.exe]` will be used. - -Type: `string` - -### WebviewBrowserPath - -This defines the path to a directory with WebView2 executable files and libraries. If empty, webview2 installed in the system will be used. - -Important information about distribution of fixed version runtime: - -- [How to get and extract runtime](https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution#details-about-the-fixed-version-runtime-distribution-mode) -- [Known issues for fixed version](https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution#known-issues-for-fixed-version) -- [The path of fixed version of the WebView2 Runtime should not contain \Edge\Application\.](https://docs.microsoft.com/en-us/microsoft-edge/webview2/reference/win32/webview2-idl?view=webview2-1.0.1245.22#createcorewebview2environmentwithoptions) - -Type: `string` - -### Theme - -Minimum Windows Version: Windows 10 2004/20H1 - -This defines the theme that the application should use: - -| Value | Description | -| ------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | -| SystemDefault | _Default_. The theme will be based on the system default. If the user changes their theme, the application will update to use the new setting | -| Dark | The application will use a dark theme exclusively | -| Light | The application will use a light theme exclusively | - -Type: `windows.Theme` - -### CustomTheme - -:::note -Minimum Windows Version: Windows 10/11 2009/21H2 Build 22000 -::: - -Allows you to specify custom colours for TitleBar, TitleText and Border for both light and dark mode, as well as -when the window is active or inactive. - -Type: `windows.CustomTheme` - -#### CustomTheme Type - -The CustomTheme struct uses `int32` to specify the colour values. These are in the standard(!) Windows format of: -`0x00BBGGAA`. A helper function is provided to do RGB conversions into this format: `windows.RGB(r,g,b uint8)`. - -NOTE: Any value not provided will default to black. - -```go -type ThemeSettings struct { - DarkModeTitleBar int32 - DarkModeTitleBarInactive int32 - DarkModeTitleText int32 - DarkModeTitleTextInactive int32 - DarkModeBorder int32 - DarkModeBorderInactive int32 - LightModeTitleBar int32 - LightModeTitleBarInactive int32 - LightModeTitleText int32 - LightModeTitleTextInactive int32 - LightModeBorder int32 - LightModeBorderInactive int32 -} -``` - -Example: - -```go - CustomTheme: &windows.ThemeSettings{ - // Theme to use when window is active - DarkModeTitleBar: windows.RGB(255, 0, 0), // Red - DarkModeTitleText: windows.RGB(0, 255, 0), // Green - DarkModeBorder: windows.RGB(0, 0, 255), // Blue - LightModeTitleBar: windows.RGB(200, 200, 200), - LightModeTitleText: windows.RGB(20, 20, 20), - LightModeBorder: windows.RGB(200, 200, 200), - // Theme to use when window is inactive - DarkModeTitleBarInactive: windows.RGB(128, 0, 0), - DarkModeTitleTextInactive: windows.RGB(0, 128, 0), - DarkModeBorderInactive: windows.RGB(0, 0, 128), - LightModeTitleBarInactive: windows.RGB(100, 100, 100), - LightModeTitleTextInactive: windows.RGB(10, 10, 10), - LightModeBorderInactive: windows.RGB(100, 100, 100), - }, -``` - -### Messages - -A struct of strings used by the webview2 installer if a valid webview2 runtime is not found. - -Type: `*windows.Messages` - -Customise this for any language you choose to support. - -### ResizeDebounceMS - -ResizeDebounceMS is the amount of time to debounce redraws of webview2 when resizing the window. -The default value (0) will perform redraws as fast as it can. - -Type: `uint16` - -### OnSuspend - -If set, this function will be called when windows initiates a switch to low power mode (suspend/hibernate) - -Type: `func()` - -### OnResume - -If set, this function will be called when windows resumes from low power mode (suspend/hibernate) - -Type: `func()` - -## Mac Specific Options - -### TitleBar - -The TitleBar struct provides the ability to configure the look and feel of the title bar. - -Type: [`*mac.TitleBar`](#titlebar-struct) - - -### Appearance - -Appearance is used to set the style of your app in accordance with Apple's [NSAppearance](https://developer.apple.com/documentation/appkit/nsappearancename?language=objc) names. - -Type: [`AppearanceType`](#appearance-type) - -### WebviewIsTransparent - -Setting this to `true` will make the webview background transparent when an alpha value of `0` is used. -This means that if you use `rgba(0,0,0,0)` for `background-color` in your CSS, the host window will show through. -Often combined with [WindowIsTranslucent](#WindowIsTranslucent) to make frosty-looking applications. - -Type: `bool` - -### WindowIsTranslucent - -Setting this to `true` will make the window background translucent. Often combined -with [WebviewIsTransparent](#WebviewIsTransparent) to make frosty-looking applications. - -Type: `bool` - -### About - -This configuration lets you set the title, message and icon for the "About" menu item in the app menu created by the "AppMenu" role. - -Type: [`About`](#about-struct) - - -#### Titlebar struct - -The titlebar of the application can be customised by using the TitleBar options: - -```go -type TitleBar struct { - TitlebarAppearsTransparent bool - HideTitle bool - HideTitleBar bool - FullSizeContent bool - UseToolbar bool - HideToolbarSeparator bool -} -``` - -| Name | Description | -| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| TitlebarAppearsTransparent | Makes the titlebar transparent. This has the effect of hiding the titlebar and the content fill the window. [Apple Docs](https://developer.apple.com/documentation/appkit/nswindow/1419167-titlebarappearstransparent?language=objc) | -| HideTitle | Hides the title of the window. [Apple Docs](https://developer.apple.com/documentation/appkit/nswindowtitlevisibility?language=objc) | -| HideTitleBar | Removes [NSWindowStyleMaskTitled](https://developer.apple.com/documentation/appkit/nswindowstylemask/nswindowstylemasktitled/) from the style mask | -| FullSizeContent | Makes the webview fill the entire window. [Apple Docs](https://developer.apple.com/documentation/appkit/nswindowstylemask/nswindowstylemaskfullsizecontentview) | -| UseToolbar | Adds a default toolbar to the window. [Apple Docs](https://developer.apple.com/documentation/appkit/nstoolbar?language=objc) | -| HideToolbarSeparator | Removes the line beneath the toolbar. [Apple Docs](https://developer.apple.com/documentation/appkit/nstoolbar/1516954-showsbaselineseparator?language=objc) | - -Preconfigured titlebar settings are available: - -| Setting | Example | -| --------------------------- | --------------------------------------------- | -| `mac.TitleBarDefault()` | ![](/img/reference/titlebar-default.webp) | -| `mac.TitleBarHidden()` | ![](/img/reference/titlebar-hidden.webp) | -| `mac.TitleBarHiddenInset()` | ![](/img/reference/titlebar-hidden-inset.webp) | - -Example: - -```go -Mac: &mac.Options{ - TitleBar: mac.TitleBarHiddenInset(), -} -``` - -Click [here](https://github.com/lukakerr/NSWindowStyles) for some inspiration on customising the titlebar. - -#### Appearance type - -You can specify the application's [appearance](https://developer.apple.com/documentation/appkit/nsappearance?language=objc). - -| Value | Description | -| ----------------------------------------------------- | --------------------------------------------------------------- | -| DefaultAppearance | DefaultAppearance uses the default system value | -| NSAppearanceNameAqua | The standard light system appearance | -| NSAppearanceNameDarkAqua | The standard dark system appearance | -| NSAppearanceNameVibrantLight | The light vibrant appearance | -| NSAppearanceNameAccessibilityHighContrastAqua | A high-contrast version of the standard light system appearance | -| NSAppearanceNameAccessibilityHighContrastDarkAqua | A high-contrast version of the standard dark system appearance | -| NSAppearanceNameAccessibilityHighContrastVibrantLight | A high-contrast version of the light vibrant appearance | -| NSAppearanceNameAccessibilityHighContrastVibrantDark | A high-contrast version of the dark vibrant appearance | - -Example: - -```go -Mac: &mac.Options{ - Appearance: mac.NSAppearanceNameDarkAqua, -} -``` - -#### About struct - -```go -type AboutInfo struct { - Title string - Message string - Icon []byte -} -``` - -If these settings are provided, an "About" menu item will appear in the app menu (when using the `AppMenu` role). -Given this configuration: - -```go -//go:embed build/appicon.png -var icon []byte - -func main() { - err := wails.Run(&options.App{ - ... - Mac: &mac.Options{ - About: &mac.AboutInfo{ - Title: "My Application", - Message: "© 2021 Me", - Icon: icon, - }, - }, - }) -``` - -The "About" menu item will appear in the app menu: - -
- -
-
- -When clicked, that will open an about message box: - -
- -
-
- -## Linux Specific Options - -### Icon - -Sets up the icon representing the window. This icon is used when the window is minimized (also known as iconified). - -Type: `[]byte` - -Some window managers or desktop environments may also place it in the window frame, or display it in other contexts. -On others, the icon is not used at all, so your mileage may vary. - -NOTE: Gnome on Wayland at least does not display this icon. To have a application icon there, a `.desktop` file has to be used. -On KDE it should work. - -The icon should be provided in whatever size it was naturally drawn; that is, don’t scale the image before passing it. -Scaling is postponed until the last minute, when the desired final size is known, to allow best quality. diff --git a/website/versioned_docs/version-v2.0.0-rc.1/reference/project-config.mdx b/website/versioned_docs/version-v2.0.0-rc.1/reference/project-config.mdx deleted file mode 100644 index 7a243da9e..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/reference/project-config.mdx +++ /dev/null @@ -1,54 +0,0 @@ ---- -sidebar_position: 5 ---- - -# Project Config - -The project config resides in the `wails.json` file in the project directory. The structure of the config is: - -```json -{ - "name": "[The project name]", - "assetdir": "[Relative path to the directory containing the compiled assets, this is normally inferred and could be left empty]", - "reloaddirs": "[Additional directories to trigger reloads (comma separated), this is only used for some advanced asset configurations]", - "frontend:install": "[The command to install node dependencies, run in the frontend directory - often `npm install`]", - "frontend:build": "[The command to build the assets, run in the frontend directory - often `npm run build`]", - "frontend:dev": "[This command has been replaced by frontend:dev:build. If frontend:dev:build is not specified will falls back to this command. If this command is also not specified will falls back to frontend:build]", - "frontend:dev:build": "[This command is the dev equivalent of frontend:build. If not specified falls back to frontend:dev]", - "frontend:dev:install": "[This command is the dev equivalent of frontend:install. If not specified falls back to frontend:install]", - "frontend:dev:watcher": "[This command is run in a separate process on `wails dev`. Useful for 3rd party watchers or starting 3d party dev servers]", - "frontend:dev:serverUrl": "[URL to a 3rd party dev server to be used to serve assets, EG Vite. If this is set to 'auto' then the devServerUrl will be inferred from the Vite output]", - "wailsjsdir": "[Relative path to the directory that the auto-generated JS modules will be created]", - "version": "[Project config version]", - "outputfilename": "[The name of the binary]", - "debounceMS": 100, // The default time the dev server waits to reload when it detects a change in assets - "devServer": "[Address to bind the wails dev sever to. Default: localhost:34115]", - "appargs": "[Arguments passed to the application in shell style when in dev mode]", - "runNonNativeBuildHooks": false, // Defines if build hooks should be run though they are defined for an OS other than the host OS. - "preBuildHooks": { - "GOOS/GOARCH": "[The command that will be executed before a build of the specified GOOS/GOARCH: ${platform} is replaced with the "GOOS/GOARCH". The "GOOS/GOARCH" hook is executed before the "GOOS/*" and "*/*" hook.]", - "GOOS/*": "[The command that will be executed before a build of the specified GOOS: ${platform} is replaced with the "GOOS/GOARCH". The "GOOS/*" hook is executed before the "*/*" hook.]", - "*/*": "[The command that will be executed before every build: ${platform} is replaced with the "GOOS/GOARCH".]" - }, - "postBuildHooks": { - "GOOS/GOARCH": "[The command that will be executed after a build of the specified GOOS/GOARCH: ${platform} is replaced with the "GOOS/GOARCH" and ${bin} with the path to the compiled binary. The "GOOS/GOARCH" hook is executed before the "GOOS/*" and "*/*" hook.]", - "GOOS/*": "[The command that will be executed after a build of the specified GOOS: ${platform} is replaced with the "GOOS/GOARCH" and ${bin} with the path to the compiled binary. The "GOOS/*" hook is executed before the "*/*" hook.]", - "*/*": "[The command that will be executed after every build: ${platform} is replaced with the "GOOS/GOARCH" and ${bin} with the path to the compiled binary.]" - }, - "info": { // Data used to populate manifests and version info. - "companyName": "[The company name. Default: [The project name]]", - "productName": "[The product name. Default: [The project name]]", - "productVersion": "[The version of the product. Default: '1.0.0']", - "copyright": "[The copyright of the product. Default: 'Copyright.........']", - "comments": "[A short comment of the app. Default: 'Built using Wails (https://wails.app)']" - }, - "nsisType": "['multiple': One installer per architecture. 'single': Single universal installer for all architectures being built. Default: 'multiple']", - "obfuscated": "[Whether the app should be obfuscated. Default: false]", - "garbleargs": "[The arguments to pass to the garble command when using the obfuscated flag]" -} -``` - -This file is read by the Wails CLI when running `wails build` or `wails dev`. - -The `assetdir`, `reloaddirs`, `wailsjsdir`, `debounceMS`, `devserver` and `frontenddevserverurl` flags in `wails build/dev` will update the project config -and thus become defaults for subsequent runs. diff --git a/website/versioned_docs/version-v2.0.0-rc.1/reference/runtime/_category_.json b/website/versioned_docs/version-v2.0.0-rc.1/reference/runtime/_category_.json deleted file mode 100644 index ac6d55488..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/reference/runtime/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Runtime", - "position": 1 -} diff --git a/website/versioned_docs/version-v2.0.0-rc.1/reference/runtime/browser.mdx b/website/versioned_docs/version-v2.0.0-rc.1/reference/runtime/browser.mdx deleted file mode 100644 index 263c5897c..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/reference/runtime/browser.mdx +++ /dev/null @@ -1,15 +0,0 @@ ---- -sidebar_position: 7 ---- - -# Browser - -These methods are related to the system browser. - -### BrowserOpenURL - -Opens the given URL in the system browser. - -Go: `BrowserOpenURL(ctx context.Context, url string)`
-JS: `BrowserOpenURL(url string)` - diff --git a/website/versioned_docs/version-v2.0.0-rc.1/reference/runtime/dialog.mdx b/website/versioned_docs/version-v2.0.0-rc.1/reference/runtime/dialog.mdx deleted file mode 100644 index 5f679b1b2..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/reference/runtime/dialog.mdx +++ /dev/null @@ -1,284 +0,0 @@ ---- -sidebar_position: 5 ---- - -# Dialog - -This part of the runtime provides access to native dialogs, such as File Selectors and Message boxes. - -:::info Javascript -Dialog is currently unsupported in the JS runtime. -::: - -### OpenDirectoryDialog - -Opens a dialog that prompts the user to select a directory. Can be customised using [OpenDialogOptions](#opendialogoptions). - -Go: `OpenDirectoryDialog(ctx context.Context, dialogOptions OpenDialogOptions) (string, error)` - -Returns: Selected directory (blank if the user cancelled) or an error - -### OpenFileDialog - -Opens a dialog that prompts the user to select a file. Can be customised using [OpenDialogOptions](#opendialogoptions). - -Go: `OpenFileDialog(ctx context.Context, dialogOptions OpenDialogOptions) (string, error)` - -Returns: Selected file (blank if the user cancelled) or an error - -### OpenMultipleFilesDialog - -Opens a dialog that prompts the user to select multiple files. Can be customised using [OpenDialogOptions](#opendialogoptions). - -Go: `OpenMultipleFilesDialog(ctx context.Context, dialogOptions OpenDialogOptions) ([]string, error)` - -Returns: Selected files (nil if the user cancelled) or an error - -### SaveFileDialog - -Opens a dialog that prompts the user to select a filename for the purposes of saving. Can be customised using [SaveDialogOptions](#savedialogoptions). - -Go: `SaveFileDialog(ctx context.Context, dialogOptions SaveDialogOptions) (string, error)` - -Returns: The selected file (blank if the user cancelled) or an error - -### MessageDialog - -Displays a message using a message dialog. Can be customised using [MessageDialogOptions](#messagedialogoptions). - -Go: `MessageDialog(ctx context.Context, dialogOptions MessageDialogOptions) (string, error)` - -Returns: The text of the selected button or an error - -## Options - -### OpenDialogOptions - -```go -type OpenDialogOptions struct { - DefaultDirectory string - DefaultFilename string - Title string - Filters []FileFilter - ShowHiddenFiles bool - CanCreateDirectories bool - ResolvesAliases bool - TreatPackagesAsDirectories bool -} -``` - -| Field | Description | Win | Mac | Lin | -| -------------------------- | ---------------------------------------------- | --- | --- | --- | -| DefaultDirectory | The directory the dialog will show when opened | ✅ | ✅ | ✅ | -| DefaultFilename | The default filename | ✅ | ✅ | ✅ | -| Title | Title for the dialog | ✅ | ✅ | ✅ | -| [Filters](#filefilter) | A list of file filters | ✅ | ✅ | ✅ | -| ShowHiddenFiles | Show files hidden by the system | | ✅ | ✅ | -| CanCreateDirectories | Allow user to create directories | | ✅ | | -| ResolvesAliases | If true, returns the file not the alias | | ✅ | | -| TreatPackagesAsDirectories | Allow navigating into packages | | ✅ | | - -### SaveDialogOptions - -```go -type SaveDialogOptions struct { - DefaultDirectory string - DefaultFilename string - Title string - Filters []FileFilter - ShowHiddenFiles bool - CanCreateDirectories bool - TreatPackagesAsDirectories bool -} -``` - -| Field | Description | Win | Mac | Lin | -| -------------------------- | ---------------------------------------------- | --- | --- | --- | -| DefaultDirectory | The directory the dialog will show when opened | ✅ | ✅ | ✅ | -| DefaultFilename | The default filename | ✅ | ✅ | ✅ | -| Title | Title for the dialog | ✅ | ✅ | ✅ | -| [Filters](#filefilter) | A list of file filters | ✅ | ✅ | ✅ | -| ShowHiddenFiles | Show files hidden by the system | | ✅ | ✅ | -| CanCreateDirectories | Allow user to create directories | | ✅ | | -| TreatPackagesAsDirectories | Allow navigating into packages | | ✅ | | - -### MessageDialogOptions - -```go -type MessageDialogOptions struct { - Type DialogType - Title string - Message string - Buttons []string - DefaultButton string - CancelButton string -} -``` - -| Field | Description | Win | Mac | Lin | -| ------------- | ------------------------------------------------------------------------- | --- | --- | --- | -| Type | The type of message dialog, eg question, info... | ✅ | ✅ | ✅ | -| Title | Title for the dialog | ✅ | ✅ | ✅ | -| Message | The message to show the user | ✅ | ✅ | ✅ | -| Buttons | A list of button titles | | ✅ | | -| DefaultButton | The button with this text should be treated as default. Bound to `return` | | ✅ | | -| CancelButton | The button with this text should be treated as cancel. Bound to `escape` | | ✅ | | - -#### Windows - -Windows has standard dialog types in which the buttons are not customisable. -The value returned will be one of: "Ok", "Cancel", "Abort", "Retry", "Ignore", "Yes", "No", "Try Again" or "Continue" - -#### Linux - -Linux has standard dialog types in which the buttons are not customisable. -The value returned will be one of: "Ok", "Cancel", "Yes", "No" - -#### Mac - -A message dialog on Mac may specify up to 4 buttons. If no `DefaultButton` or `CancelButton` is given, the first button -is considered default and is bound to the `return` key. - -For the following code: - -```go -selection, err := runtime.MessageDialog(b.ctx, runtime.MessageDialogOptions{ - Title: "It's your turn!", - Message: "Select a number", - Buttons: []string{"one", "two", "three", "four"}, -}) -``` - -the first button is shown as default: - -
- -
-
- -And if we specify `DefaultButton` to be "two": - -```go -selection, err := runtime.MessageDialog(b.ctx, runtime.MessageDialogOptions{ - Title: "It's your turn!", - Message: "Select a number", - Buttons: []string{"one", "two", "three", "four"}, - DefaultButton: "two", -}) -``` - -the second button is shown as default. When `return` is pressed, the value "two" is returned. - -
- -
-
- -If we now specify `CancelButton` to be "three": - -```go -selection, err := runtime.MessageDialog(b.ctx, runtime.MessageDialogOptions{ - Title: "It's your turn!", - Message: "Select a number", - Buttons: []string{"one", "two", "three", "four"}, - DefaultButton: "two", - CancelButton: "three", -}) -``` - -the button with "three" is shown at the bottom of the dialog. When `escape` is pressed, the value "three" is returned: - -
- -
-
-
-
- -#### DialogType - -```go -const ( - InfoDialog DialogType = "info" - WarningDialog DialogType = "warning" - ErrorDialog DialogType = "error" - QuestionDialog DialogType = "question" - ) -``` - -### FileFilter - -```go -type FileFilter struct { - DisplayName string // Filter information EG: "Image Files (*.jpg, *.png)" - Pattern string // semi-colon separated list of extensions, EG: "*.jpg;*.png" -} -``` - -#### Windows - -Windows allows you to use multiple file filters in dialog boxes. Each FileFilter will show up as a separate entry in the -dialog: - -
- -
-
-
-
- -#### Linux - -Linux allows you to use multiple file filters in dialog boxes. Each FileFilter will show up as a separate entry in the -dialog: - -
- -
-
-
-
- -#### Mac - -Mac dialogs only have the concept of a single set of patterns to filter files. If multiple FileFilters are provided, -Wails will use all the Patterns defined. - -Example: - -```go - selection, err := runtime.OpenFileDialog(b.ctx, runtime.OpenDialogOptions{ - Title: "Select File", - Filters: []runtime.FileFilter{ - { - DisplayName: "Images (*.png;*.jpg)", - Pattern: "*.png;*.jpg", - }, { - DisplayName: "Videos (*.mov;*.mp4)", - Pattern: "*.mov;*.mp4", - }, - }, - }) -``` - -This will result in the Open File dialog using `*.png,*.jpg,*.mov,*.mp4` as a filter. diff --git a/website/versioned_docs/version-v2.0.0-rc.1/reference/runtime/events.mdx b/website/versioned_docs/version-v2.0.0-rc.1/reference/runtime/events.mdx deleted file mode 100644 index 6fc64cf47..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/reference/runtime/events.mdx +++ /dev/null @@ -1,45 +0,0 @@ ---- -sidebar_position: 2 ---- - -# Events - -The Wails runtime provides a unified events system, where events can be emitted or received by either Go or Javascript. -Optionally, data may be passed with the events. Listeners will receive the data in the local data types. - -### EventsOn - -This method sets up a listener for the given event name. When an event of type `eventName` is [emitted](#EventsEmit), -the callback is triggered. Any additional data sent with the emitted event will be passed to the callback. - -Go: `EventsOn(ctx context.Context, eventName string, callback func(optionalData ...interface{}))`
-JS: `EventsOn(eventName string, callback function(optionalData?: any))` - -### EventsOff - -This method unregisters the listener for the given event name, optionally multiple listeneres can be unregistered via `additionalEventNames`. - -Go: `EventsOff(ctx context.Context, eventName string, additionalEventNames ...string)`
-JS: `EventsOff(eventName string, ...additionalEventNames)` - -### EventsOnce - -This method sets up a listener for the given event name, but will only trigger once. - -Go: `EventsOnce(ctx context.Context, eventName string, callback func(optionalData ...interface{}))`
-JS: `EventsOnce(eventName string, callback function(optionalData?: any))` - -### EventsOnMultiple - -This method sets up a listener for the given event name, but will only trigger a maximum of `counter` times. - -Go: `EventsOnMultiple(ctx context.Context, eventName string, callback func(optionalData ...interface{}), counter int)`
-JS: `EventsOnMultiple(eventName string, callback function(optionalData?: any), counter int)` - -### EventsEmit - -This method emits the given event. Optional data may be passed with the event. This will trigger any event listeners. - -Go: `EventsEmit(ctx context.Context, eventName string, optionalData ...interface{})`
-JS: `EventsEmit(ctx context, optionalData function(optionalData?: any))` - diff --git a/website/versioned_docs/version-v2.0.0-rc.1/reference/runtime/intro.mdx b/website/versioned_docs/version-v2.0.0-rc.1/reference/runtime/intro.mdx deleted file mode 100644 index 4310bab57..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/reference/runtime/intro.mdx +++ /dev/null @@ -1,92 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Introduction - -The runtime is a library that provides utility methods for your application. There is both a Go and Javascript runtime -and the aim is to try and keep them at parity where possible. - -It has utility methods for: - -- [Window](window.mdx) -- [Menu](menu.mdx) -- [Dialog](dialog.mdx) -- [Events](events.mdx) -- [Browser](browser.mdx) -- [Log](log.mdx) - -The Go Runtime is available through importing `github.com/wailsapp/wails/v2/pkg/runtime`. All methods in this package -take a context as the first parameter. This context should be obtained from the [OnStartup](../options.mdx#onstartup) -or [OnDomReady](../options.mdx#ondomready) hooks. - -:::info Note - -Whilst the context will be provided to the -[OnStartup](../options.mdx#onstartup) method, there's no guarantee the runtime will work in this method as -the window is initialising in a different thread. If -you wish to call runtime methods at startup, use [OnDomReady](../options.mdx#ondomready). - -::: - -The Javascript library is available to the frontend via the `window.runtime` map. There is a runtime package generated when using `dev` -mode that provides Typescript declarations for the runtime. This should be located in the `wailsjs` directory in your -frontend directory. - -### Hide - -Go: `Hide(ctx context.Context)`
-JS: `Hide()` - -Hides the application. - -:::info Note -On Mac, this will hide the application in the same way as the `Hide` menu item in standard Mac applications. -This is different to hiding the window, but the application still being in the foreground. -For Windows and Linux, this is currently the same as `WindowHide`. -::: - -### Show - -Shows the application. - -:::info Note -On Mac, this will bring the application back into the foreground. -For Windows and Linux, this is currently the same as `WindowShow`. -::: - -Go: `Show(ctx context.Context)`
-JS: `Show()` - -### Quit - -Quits the application. - -Go: `Quit(ctx context.Context)`
-JS: `Quit()` - -### Environment - -Returns details of the current environment. - -Go: `Environment(ctx context.Context) EnvironmentInfo`
-JS: `Environment(): Promise` - -#### EnvironmentInfo - -Go: -```go -type EnvironmentInfo struct { - BuildType string - Platform string - Arch string -} -``` -JS: -```ts -interface EnvironmentInfo { - buildType: string; - platform: string; - arch: string; -} -``` diff --git a/website/versioned_docs/version-v2.0.0-rc.1/reference/runtime/log.mdx b/website/versioned_docs/version-v2.0.0-rc.1/reference/runtime/log.mdx deleted file mode 100644 index d38ee9526..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/reference/runtime/log.mdx +++ /dev/null @@ -1,142 +0,0 @@ ---- -sidebar_position: 3 ---- - -# Log - -The Wails runtime provides a logging mechanism that may be called from Go or Javascript. Like most -loggers, there are a number of log levels: - -- Trace -- Debug -- Info -- Warning -- Error -- Fatal - -The logger will output any log message at the current, or higher, log level. Example: The `Debug` log -level will output all messages except `Trace` messages. - -### LogPrint - -Logs the given message as a raw message. - -Go: `LogPrint(ctx context.Context, message string)`
-JS: `LogPrint(message: string)` - -### LogPrintf - -Logs the given message as a raw message. - -Go: `LogPrintf(ctx context.Context, format string, args ...interface{})`
- -### LogTrace - -Logs the given message at the `Trace` log level. - -Go: `LogTrace(ctx context.Context, message string)`
-JS: `LogTrace(message: string)` - -### LogTracef - -Logs the given message at the `Trace` log level. - -Go: `LogTracef(ctx context.Context, format string, args ...interface{})`
- -### LogDebug - -Logs the given message at the `Debug` log level. - -Go: `LogDebug(ctx context.Context, message string)`
-JS: `LogDebug(message: string)` - -### LogDebugf - -Logs the given message at the `Debug` log level. - -Go: `LogDebugf(ctx context.Context, format string, args ...interface{})`
- -### LogInfo - -Logs the given message at the `Info` log level. - -Go: `LogInfo(ctx context.Context, message string)`
-JS: `LogInfo(message: string)` - -### LogInfof - -Logs the given message at the `Info` log level. - -Go: `LogInfof(ctx context.Context, format string, args ...interface{})`
- -### LogWarning - -Logs the given message at the `Warning` log level. - -Go: `LogWarning(ctx context.Context, message string)`
-JS: `LogWarning(message: string)` - -### LogWarningf - -Logs the given message at the `Warning` log level. - -Go: `LogWarningf(ctx context.Context, format string, args ...interface{})`
- -### LogError - -Logs the given message at the `Error` log level. - -Go: `LogError(ctx context.Context, message string)`
-JS: `LogError(message: string)` - -### LogErrorf - -Logs the given message at the `Error` log level. - -Go: `LogErrorf(ctx context.Context, format string, args ...interface{})`
- -### LogFatal - -Logs the given message at the `Fatal` log level. - -Go: `LogFatal(ctx context.Context, message string)`
-JS: `LogFatal(message: string)` - -### LogFatalf - -Logs the given message at the `Fatal` log level. - -Go: `LogFatalf(ctx context.Context, format string, args ...interface{})`
- -### LogSetLogLevel - -Sets the log level. In Javascript, the number relates to the following log levels: - -| Value | Log Level | -| ----- | --------- | -| 1 | Trace | -| 2 | Debug | -| 3 | Info | -| 4 | Warning | -| 5 | Error | - -Go: `LogSetLogLevel(ctx context.Context, level logger.LogLevel)`
-JS: `LogSetLogLevel(level: number)` - -## Using a Custom Logger - -A custom logger may be used by providing it using the [Logger](../options.mdx#logger) -application option. The only requirement is that the logger implements the `logger.Logger` interface -defined in `github.com/wailsapp/wails/v2/pkg/logger`: - -```go title="logger.go" -type Logger interface { - Print(message string) - Trace(message string) - Debug(message string) - Info(message string) - Warning(message string) - Error(message string) - Fatal(message string) -} -``` diff --git a/website/versioned_docs/version-v2.0.0-rc.1/reference/runtime/menu.mdx b/website/versioned_docs/version-v2.0.0-rc.1/reference/runtime/menu.mdx deleted file mode 100644 index 6a7e06cf9..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/reference/runtime/menu.mdx +++ /dev/null @@ -1,23 +0,0 @@ ---- -sidebar_position: 6 ---- - -# Menu - -These methods are related to the application menu. - -:::info Javascript -Menu is currently unsupported in the JS runtime. -::: - -### MenuSetApplicationMenu - -Sets the application menu to the given [menu](../menus.mdx). - -Go: `MenuSetApplicationMenu(ctx context.Context, menu *menu.Menu)` - -### MenuUpdateApplicationMenu - -Updates the application menu, picking up any changes to the menu passed to `MenuSetApplicationMenu`. - -Go: `MenuUpdateApplicationMenu(ctx context.Context)` diff --git a/website/versioned_docs/version-v2.0.0-rc.1/reference/runtime/window.mdx b/website/versioned_docs/version-v2.0.0-rc.1/reference/runtime/window.mdx deleted file mode 100644 index 3ddceea4c..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/reference/runtime/window.mdx +++ /dev/null @@ -1,243 +0,0 @@ ---- -sidebar_position: 4 ---- - -# Window - -These methods give control of the application window. - -### WindowSetTitle - -Sets the text in the window title bar. - -Go: `WindowSetTitle(ctx context.Context, title string)`
-JS: `WindowSetTitle(title: string)` - -### WindowFullscreen - -Makes the window full screen. - -Go: `WindowFullscreen(ctx context.Context)`
-JS: `WindowFullscreen()` - -### WindowUnfullscreen - -Restores the previous window dimensions and position prior to full screen. - -Go: `WindowUnfullscreen(ctx context.Context)`
-JS: `WindowUnfullscreen()` - -### WindowIsFullscreen - -Returns true if the window is full screen. - -Go: `WindowIsFullscreen(ctx context.Context) bool` -JS: `WindowIsFullscreen() bool` - -### WindowCenter - -Centers the window on the monitor the window is currently on. - -Go: `WindowCenter(ctx context.Context)`
-JS: `WindowCenter()` - -### WindowReload - -Performs a "reload" (Reloads current page). - -Go: `WindowReload(ctx context.Context)`
-JS: `WindowReload()` - -### WindowReloadApp - -Reloads the application frontend. - -Go: `WindowReloadApp(ctx context.Context)`
-JS: `WindowReloadApp()` - -### WindowSetSystemDefaultTheme - -Windows only. - -Go: `WindowSetSystemDefaultTheme(ctx context.Context)`
-JS: `WindowSetSystemDefaultTheme()` - -Sets window theme to system default (dark/light). - -### WindowSetLightTheme - -Windows only. - -Go: `WindowSetLightTheme(ctx context.Context)`
-JS: `WindowSetLightTheme()` - -Sets window theme to light. - -### WindowSetDarkTheme - -Windows only. - -Go: `WindowSetDarkTheme(ctx context.Context)`
-JS: `WindowSetDarkTheme()` - -Sets window theme to dark. - -### WindowShow - -Shows the window, if it is currently hidden. - -Go: `WindowShow(ctx context.Context)`
-JS: `WindowShow()` - -### WindowHide - -Hides the window, if it is currently visible. - -Go: `WindowHide(ctx context.Context)`
-JS: `WindowHide()` - -### WindowIsNormal - -Returns true if the window not minimised, maximised or fullscreen. - -Go: `WindowIsNormal(ctx context.Context) bool` -JS: `WindowIsNormal() bool` - -### WindowSetSize - -Sets the width and height of the window. - -Go: `WindowSetSize(ctx context.Context, width int, height int)`
-JS: `WindowSetSize(size: Size)` - -### WindowGetSize - -Gets the width and height of the window. - -Go: `WindowGetSize(ctx context.Context) (width int, height int)`
-JS: `WindowGetSize() : Size` - -### WindowSetMinSize - -Sets the minimum window size. -Will resize the window if the window is currently smaller than the given dimensions. - -Setting a size of `0,0` will disable this constraint. - -Go: `WindowSetMinSize(ctx context.Context, width int, height int)`
-JS: `WindowSetMinSize(size: Size)` - -### WindowSetMaxSize - -Sets the maximum window size. -Will resize the window if the window is currently larger than the given dimensions. - -Setting a size of `0,0` will disable this constraint. - -Go: `WindowSetMaxSize(ctx context.Context, width int, height int)`
-JS: `WindowSetMaxSize(size: Size)` - -### WindowSetAlwaysOnTop - -Sets the window AlwaysOnTop or not on top. - -Go: `WindowSetAlwaysOnTop(ctx context.Context, b bool)`
-JS: `WindowSetAlwaysOnTop(b: Boolen)` - -### WindowSetPosition - -Sets the window position relative to the monitor the window is currently on. - -Go: `WindowSetPosition(ctx context.Context, x int, y int)`
-JS: `WindowSetPosition(position: Position)` - -### WindowGetPosition - -Gets the window position relative to the monitor the window is currently on. - -Go: `WindowGetPosition(ctx context.Context) (x int, y int)`
-JS: `WindowGetPosition() : Position` - -### WindowMaximise - -Maximises the window to fill the screen. - -Go: `WindowMaximise(ctx context.Context)`
-JS: `WindowMaximise()` - -### WindowUnmaximise - -Restores the window to the dimensions and position prior to maximising. - -Go: `WindowUnmaximise(ctx context.Context)`
-JS: `WindowUnmaximise()` - -### WindowIsMaximised - -Returns true if the window is maximised. - -Go: `WindowIsMaximised(ctx context.Context) bool` -JS: `WindowIsMaximised() bool` - -### WindowToggleMaximise - -Toggles between Maximised and UnMaximised. - -Go: `WindowToggleMaximise(ctx context.Context)`
-JS: `WindowToggleMaximise()` - -### WindowMinimise - -Minimises the window. - -Go: `WindowMinimise(ctx context.Context)`
-JS: `WindowMinimise()` - -### WindowUnminimise - -Restores the window to the dimensions and position prior to minimising. - -Go: `WindowUnminimise(ctx context.Context)`
-JS: `WindowUnminimise()` - -### WindowIsMinimised - -Returns true if the window is minimised. - -Go: `WindowIsMinimised(ctx context.Context) bool` -JS: `WindowIsMinimised() bool` - -### WindowSetBackgroundColour - -Sets the background colour of the window to the given RGBA colour definition. -This colour will show through for all transparent pixels. - -Valid values for R, G, B and A are 0-255. - -:::info Windows -On Windows, only alpha values of 0 or 255 are supported. -Any value that is not 0 will be considered 255. -::: - -Go: `WindowSetBackgroundColour(ctx context.Context, R, G, B, A uint8)`
-JS: `WindowSetBackgroundColour(R, G, B, A)` - -## Typescript Object Definitions - -### Position - -```ts -interface Position { - x: number; - y: number; -} -``` - -### Size - -```ts -interface Size { - w: number; - h: number; -} -``` diff --git a/website/versioned_docs/version-v2.0.0-rc.1/tutorials/_category_.json b/website/versioned_docs/version-v2.0.0-rc.1/tutorials/_category_.json deleted file mode 100644 index dfac1d175..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/tutorials/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Tutorials", - "position": 70 -} diff --git a/website/versioned_docs/version-v2.0.0-rc.1/tutorials/dogsapi.mdx b/website/versioned_docs/version-v2.0.0-rc.1/tutorials/dogsapi.mdx deleted file mode 100644 index 4a5f9c88a..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/tutorials/dogsapi.mdx +++ /dev/null @@ -1,248 +0,0 @@ ---- -sidebar_position: 20 ---- - -# Dogs API - -
- -
-
- -:::note -This tutorial has been kindly provided by [@tatadan](https://twitter.com/tatadan) and forms part of -their [Wails Examples Repository](https://github.com/tataDan/wails-v2-examples). -::: - -In this tutorial we are going to develop an application that retrieves photos of dogs from the web -and then displays them. - -### Create the project - -Let's create the application. From a terminal enter: -```wails init -n dogs-api -t svelte``` - -Note: We could optionally add `-ide vscode` or `-ide goland` to the end of this command if you wanted -to add IDE support. - -Now let's `cd dogs-api` and start editing the project files. - -### Remove unused code - -We will start by removing some elements that we know we will not use: - -- Open `app.go` and remove the following lines: - -```go -// Greet returns a greeting for the given name -func (a *App) Greet(name string) string { - return fmt.Sprintf("Hello %s, It's show time!", name) -} -``` - -- Open `frontend/src/App.svelte` and delete all lines. -- Delete the `frontend/src/assets/images/logo-universal.png` file - -### Creating our application - -Now let's add our new Go code. - -Add the following struct declarations to `app.go` before the function definitions: - -```go -type RandomImage struct { - Message string - Status string -} - -type AllBreeds struct { - Message map[string]map[string][]string - Status string -} - -type ImagesByBreed struct { - Message []string - Status string -} -``` - -Add the following functions to `app.go` (perhaps after the existing function definitions): - -```go -func (a *App) GetRandomImageUrl() string { - response, err := http.Get("https://dog.ceo/api/breeds/image/random") - if err != nil { - log.Fatal(err) - } - - responseData, err := ioutil.ReadAll(response.Body) - if err != nil { - log.Fatal(err) - } - - var data RandomImage - json.Unmarshal(responseData, &data) - - return data.Message -} - -func (a *App) GetBreedList() []string { - var breeds []string - - response, err := http.Get("https://dog.ceo/api/breeds/list/all") - if err != nil { - log.Fatal(err) - } - - responseData, err := ioutil.ReadAll(response.Body) - if err != nil { - log.Fatal(err) - } - - var data AllBreeds - json.Unmarshal(responseData, &data) - - for k := range data.Message { - breeds = append(breeds, k) - } - - sort.Strings(breeds) - - return breeds -} - -func (a *App) GetImageUrlsByBreed(breed string) []string { - - url := fmt.Sprintf("%s%s%s%s", "https://dog.ceo/api/", "breed/", breed, "/images") - response, err := http.Get(url) - if err != nil { - log.Fatal(err) - } - - responseData, err := ioutil.ReadAll(response.Body) - if err != nil { - log.Fatal(err) - } - - var data ImagesByBreed - json.Unmarshal(responseData, &data) - - return data.Message -} -``` - -Modify the `import` section of `app.go` to look like this: - -```go -import ( - "context" - "fmt" - "encoding/json" - "io/ioutil" - "log" - "net/http" - "sort" -) -``` - -Add the following lines to `frontend/src/App.svelte`: - -```html - - -

Dogs API

-
- - Click on down arrow to select a breed - - -
-
-{#if showRandomPhoto} - No dog found -{/if} -{#if showBreedPhotos} - {#each photos as photo} - No dog found - {/each} -{/if} - - -``` - -### Testing the application - -To generate the bindings and test the application, run `wails dev`. - -### Compiling the application - -To compile the application to a single, production grade binary, run `wails build`. - - - - - diff --git a/website/versioned_docs/version-v2.0.0-rc.1/tutorials/helloworld.mdx b/website/versioned_docs/version-v2.0.0-rc.1/tutorials/helloworld.mdx deleted file mode 100644 index 50d76f35c..000000000 --- a/website/versioned_docs/version-v2.0.0-rc.1/tutorials/helloworld.mdx +++ /dev/null @@ -1,120 +0,0 @@ ---- -sidebar_position: 10 ---- - -# Hello World - -The aim of this tutorial is to get you up and running with the most basic -application using Wails. You will be able to: - -- Create a new Wails application -- Build the application -- Run the application - -:::note -This tutorial uses Windows as the target platform. Output will vary slightly -depending on your operating system. -::: - -## Create a new Wails application - -To create a new Wails application using the default vanilla JS template, -you need to run the following command: - -```bash -wails init -n helloworld -``` - -You should see something similar to the following: - -``` -Wails CLI v2.0.0 - -Initialising Project 'helloworld' ---------------------------------- - -Project Name: helloworld -Project Directory: C:\Users\leaan\tutorial\helloworld -Project Template: vanilla -Template Support: https://wails.io - -Initialised project 'helloworld' in 232ms. -``` - -This will create a new directory called `helloworld` in the current directory. -In this directory, you will find a number of files: - -``` -build/ - Contains the build files + compiled application -frontend/ - Contains the frontend files -app.go - Contains the application code -main.go - The main program with the application configuration -wails.json - The project configuration file -go.mod - The go module file -go.sum - The go module checksum file -``` - -## Build the application - -To build the application, change to the new `helloworld` project directory and run the following command: - -```bash -wails build -``` - -You should see something like the following: - -``` -Wails CLI v2.0.0 - -App Type: desktop -Platforms: windows/amd64 -Compiler: C:\Users\leaan\go\go1.18.3\bin\go.exe -Build Mode: Production -Skip Frontend: false -Compress: false -Package: true -Clean Build Dir: false -LDFlags: "" -Tags: [] -Race Detector: false - -Building target: windows/amd64 ------------------------------- - - Installing frontend dependencies: Done. - - Compiling frontend: Done. - - Generating bundle assets: Done. - - Compiling application: Done. -Built 'C:\Users\leaan\tutorial\helloworld\build\bin\helloworld.exe' in 10.616s. -``` - -This has compiled the application and saved it in the `build/bin` directory. - -## Run the application - -If we view the `build/bin` directory in Windows Explorer, we should see our project binary: - -
- -
-
- -We can run it by simply double-clicking the `helloworld.exe` file. - -On Mac, Wails generates a `helloworld.app` file which can be run by double-clicking it. - -On Linux, you can run the application using `./helloworld` from the `build/bin` directory. - -You should see the application working as expected: - -
- -
-
diff --git a/website/versioned_sidebars/version-v2.0.0-beta.44-sidebars.json b/website/versioned_sidebars/version-v2.0.0-beta.44-sidebars.json deleted file mode 100644 index caea0c03b..000000000 --- a/website/versioned_sidebars/version-v2.0.0-beta.44-sidebars.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "tutorialSidebar": [ - { - "type": "autogenerated", - "dirName": "." - } - ] -} diff --git a/website/versioned_sidebars/version-v2.0.0-rc.1-sidebars.json b/website/versioned_sidebars/version-v2.0.0-rc.1-sidebars.json deleted file mode 100644 index 76a5e0116..000000000 --- a/website/versioned_sidebars/version-v2.0.0-rc.1-sidebars.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "docs": [ - { - "type": "autogenerated", - "dirName": "." - }, - { - "type": "link", - "label": "Contributing", - "href": "/community-guide#ways-of-contributing" - } - ] -} diff --git a/website/versions.json b/website/versions.json index d538c3047..fe51488c7 100644 --- a/website/versions.json +++ b/website/versions.json @@ -1,4 +1 @@ -[ - "v2.0.0-rc.1", - "v2.0.0-beta.44" -] +[] From 11d54cc8756a7815dbb9cba3c5492823a0851e25 Mon Sep 17 00:00:00 2001 From: Misite Bao Date: Tue, 20 Sep 2022 23:40:50 +0800 Subject: [PATCH 34/62] feat(website): update en docs --- website/babel.config.js | 2 +- website/blog/2022-09-18-v2-release-notes.mdx | 12 +-- website/package.json | 90 ++++++++++---------- 3 files changed, 52 insertions(+), 52 deletions(-) diff --git a/website/babel.config.js b/website/babel.config.js index e00595dae..bfd75dbdf 100644 --- a/website/babel.config.js +++ b/website/babel.config.js @@ -1,3 +1,3 @@ module.exports = { - presets: [require.resolve('@docusaurus/core/lib/babel/preset')], + presets: [require.resolve("@docusaurus/core/lib/babel/preset")], }; diff --git a/website/blog/2022-09-18-v2-release-notes.mdx b/website/blog/2022-09-18-v2-release-notes.mdx index c961a66ab..e3216841a 100644 --- a/website/blog/2022-09-18-v2-release-notes.mdx +++ b/website/blog/2022-09-18-v2-release-notes.mdx @@ -31,20 +31,20 @@ If you are unfamiliar with Wails, it is a project that enables Go programmers to # 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: +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. +- [Dark / Light theme](/docs/reference/options#theme) + [custom theming](/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](/docs/guides/application-development#application-menu) and [dialogs](/docs/reference/runtime/dialog). - Native window translucency effects for [Windows](/docs/reference/options#windowistranslucent) and [macOS](/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. +- Easily generate an [NSIS installer](/docs/guides/windows-installer) for Windows deployments. +- A rich [runtime library](/docs/reference/runtime/intro) providing utility methods for window manipulation, eventing, dialogs, menus and logging. - Support for [obfuscating](/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](/docs/next/howdoesitwork#calling-bound-go-methods). +- Automatic Typescript generation of Go structs. More info [here](/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. @@ -70,7 +70,7 @@ In the course of developing v2, there were many features and bug fixes that were ## 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). +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 diff --git a/website/package.json b/website/package.json index 636b158c7..88349035c 100644 --- a/website/package.json +++ b/website/package.json @@ -1,47 +1,47 @@ { -"name": "wails-website", -"version": "0.0.0", -"private": true, -"scripts": { -"docusaurus": "docusaurus", -"start": "docusaurus start", -"build": "docusaurus build", -"swizzle": "docusaurus swizzle", -"deploy": "docusaurus deploy", -"clear": "docusaurus clear", -"serve": "docusaurus serve", -"write-translations": "docusaurus write-translations", -"write-heading-ids": "docusaurus write-heading-ids", -"crowdin": "crowdin", -"crowdin:sync": "docusaurus write-translations && crowdin upload && crowdin download" -}, -"dependencies": { -"@docusaurus/core": "^2.1.0", -"@docusaurus/preset-classic": "^2.1.0", -"@docusaurus/theme-search-algolia": "^2.1.0", -"@mdx-js/react": "^1.6.22", -"@wails/react-contributors": "^1.1.3", -"clsx": "^1.1.1", -"file-loader": "^6.2.0", -"prism-react-renderer": "^1.2.1", -"react": "^17.0.1", -"react-dom": "^17.0.1", -"react-responsive-carousel": "^3.2.23" -}, -"browserslist": { -"production": [ -">0.5%", -"not dead", -"not op_mini all" -], -"development": [ -"last 1 chrome version", -"last 1 firefox version", -"last 1 safari version" -] -}, -"devDependencies": { -"@crowdin/cli": "^3.8.0", -"prettier": "^2.7.1" -} + "name": "wails-website", + "version": "0.0.0", + "private": true, + "scripts": { + "docusaurus": "docusaurus", + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations": "docusaurus write-translations", + "write-heading-ids": "docusaurus write-heading-ids", + "crowdin": "crowdin", + "crowdin:sync": "docusaurus write-translations && crowdin upload && crowdin download" + }, + "dependencies": { + "@docusaurus/core": "^2.1.0", + "@docusaurus/preset-classic": "^2.1.0", + "@docusaurus/theme-search-algolia": "^2.1.0", + "@mdx-js/react": "^1.6.22", + "@wails/react-contributors": "^1.1.3", + "clsx": "^1.1.1", + "file-loader": "^6.2.0", + "prism-react-renderer": "^1.2.1", + "react": "^17.0.1", + "react-dom": "^17.0.1", + "react-responsive-carousel": "^3.2.23" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "devDependencies": { + "@crowdin/cli": "^3.8.0", + "prettier": "^2.7.1" + } } From 2dd2deadc1fb86931af4d924089d8299c8966c49 Mon Sep 17 00:00:00 2001 From: Misite Bao Date: Wed, 21 Sep 2022 00:39:38 +0800 Subject: [PATCH 35/62] feat(website): update Chinese and Japanese and temporarily remove other language translations Reason: The translation progress of other languages has not yet met the requirements --- website/README.md | 48 +- website/i18n/ja/code.json | 2 +- .../2021-09-27-v2-beta1-release-notes.mdx | 20 +- .../2021-11-08-v2-beta2-release-notes.mdx | 21 +- .../2022-02-22-v2-beta3-release-notes.mdx | 14 +- .../2022-09-18-v2-release-notes.mdx | 99 +++ .../current/community/showcase/emailit.mdx | 2 + .../community/showcase/encrypteasy.mdx | 2 + .../current/community/showcase/filehound.mdx | 2 + .../community/showcase/minecraftupdater.mdx | 6 +- .../community/showcase/modalfilemanager.mdx | 2 + .../community/showcase/mollywallet.mdx | 2 + .../current/community/showcase/october.mdx | 2 + .../current/community/showcase/optimus.mdx | 2 + .../current/community/showcase/portfall.mdx | 2 + .../community/showcase/restic-browser.mdx | 2 + .../current/community/showcase/riftshare.mdx | 2 + .../current/community/showcase/scriptbar.mdx | 2 + .../current/community/showcase/surge.mdx | 2 + .../current/community/showcase/wally.mdx | 2 + .../current/community/showcase/wombat.mdx | 2 + .../current/community/showcase/ytd.mdx | 2 + .../current/community/templates.mdx | 4 +- .../current/gettingstarted/building.mdx | 3 +- .../current/gettingstarted/development.mdx | 2 +- .../current/gettingstarted/firstproject.mdx | 36 +- .../current/gettingstarted/installation.mdx | 31 +- .../current/guides/dynamic-assets.mdx | 12 +- .../current/guides/frameless.mdx | 23 +- .../current/guides/ides.mdx | 3 + .../current/guides/linux-distro-support.mdx | 3 + .../current/guides/obfuscated.mdx | 42 ++ .../current/guides/overscroll.mdx | 4 +- .../current/guides/templates.mdx | 2 + .../current/guides/troubleshooting.mdx | 41 +- .../current/guides/windows-installer.mdx | 4 +- .../current/howdoesitwork.mdx | 8 + .../current/introduction.mdx | 12 +- .../current/reference/cli.mdx | 12 +- .../current/reference/menus.mdx | 70 +- .../current/reference/options.mdx | 261 +++++--- .../current/reference/project-config.mdx | 8 +- .../current/reference/runtime/browser.mdx | 1 - .../current/reference/runtime/dialog.mdx | 31 +- .../current/reference/runtime/events.mdx | 3 +- .../current/reference/runtime/intro.mdx | 29 +- .../current/reference/runtime/menu.mdx | 6 +- .../current/reference/runtime/window.mdx | 16 +- .../current/tutorials/dogsapi.mdx | 22 +- .../current/tutorials/helloworld.mdx | 12 +- .../changelog.mdx | 465 +++++++------ .../docusaurus-plugin-content-pages/coc.mdx | 77 +++ .../community-guide.mdx | 34 +- .../credits.mdx | 4 +- .../docusaurus-plugin-content-pages/faq.mdx | 2 +- .../ja/docusaurus-theme-classic/footer.json | 6 +- .../ja/docusaurus-theme-classic/navbar.json | 8 +- website/i18n/ko/code.json | 415 ------------ .../2021-09-27-v2-beta1-release-notes.mdx | 155 ----- .../2021-11-08-v2-beta2-release-notes.mdx | 163 ----- .../2022-02-22-v2-beta3-release-notes.mdx | 110 --- .../authors.yml | 10 - .../options.json | 14 - .../current.json | 38 -- .../current/appendix/_category_.json | 4 - .../current/community/_category_.json | 4 - .../current/community/links.mdx | 23 - .../community/showcase/_category_.json | 4 - .../current/community/showcase/emailit.mdx | 8 - .../community/showcase/encrypteasy.mdx | 10 - .../current/community/showcase/filehound.mdx | 14 - .../community/showcase/minecraftupdater.mdx | 10 - .../community/showcase/modalfilemanager.mdx | 12 - .../community/showcase/mollywallet.mdx | 8 - .../current/community/showcase/october.mdx | 12 - .../current/community/showcase/optimus.mdx | 8 - .../current/community/showcase/portfall.mdx | 8 - .../community/showcase/restic-browser.mdx | 10 - .../current/community/showcase/riftshare.mdx | 19 - .../current/community/showcase/scriptbar.mdx | 8 - .../current/community/showcase/surge.mdx | 8 - .../current/community/showcase/wally.mdx | 8 - .../current/community/showcase/wombat.mdx | 8 - .../current/community/showcase/ytd.mdx | 8 - .../current/community/templates.mdx | 52 -- .../current/contributing/_category_.json | 4 - .../contributing/developing-new-features.mdx | 29 - .../current/contributing/documenting.mdx | 34 - .../current/contributing/fixing-bugs.mdx | 27 - .../current/contributing/helping-others.mdx | 13 - .../setting-up-a-dev-environment.mdx | 30 - .../current/contributing/testing.mdx | 16 - .../contributing/ways-of-contributing.mdx | 18 - .../current/gettingstarted/_category_.json | 4 - .../current/gettingstarted/building.mdx | 21 - .../current/gettingstarted/development.mdx | 16 - .../current/gettingstarted/firstproject.mdx | 132 ---- .../current/gettingstarted/installation.mdx | 95 --- .../current/guides/_category_.json | 4 - .../guides/application-development.mdx | 194 ------ .../current/guides/bleeding-edge.mdx | 55 -- .../current/guides/dynamic-assets.mdx | 126 ---- .../current/guides/frameless.mdx | 84 --- .../current/guides/frontend.mdx | 72 -- .../current/guides/ides.mdx | 125 ---- .../current/guides/linux-distro-support.mdx | 101 --- .../current/guides/linux.mdx | 18 - .../current/guides/manual-builds.mdx | 95 --- .../current/guides/migrating.mdx | 187 ------ .../current/guides/mouse-buttons.mdx | 25 - .../current/guides/overscroll.mdx | 10 - .../current/guides/routing.mdx | 47 -- .../current/guides/signing.mdx | 379 ----------- .../current/guides/templates.mdx | 95 --- .../current/guides/troubleshooting.mdx | 142 ---- .../current/guides/vscode.mdx | 82 --- .../current/guides/windows-installer.mdx | 56 -- .../current/guides/windows.mdx | 61 -- .../current/howdoesitwork.mdx | 355 ---------- .../current/introduction.mdx | 71 -- .../current/reference/_category_.json | 4 - .../current/reference/cli.mdx | 221 ------ .../current/reference/menus.mdx | 261 -------- .../current/reference/options.mdx | 633 ------------------ .../current/reference/project-config.mdx | 51 -- .../current/reference/runtime/_category_.json | 4 - .../current/reference/runtime/browser.mdx | 14 - .../current/reference/runtime/dialog.mdx | 283 -------- .../current/reference/runtime/events.mdx | 38 -- .../current/reference/runtime/intro.mdx | 73 -- .../current/reference/runtime/log.mdx | 130 ---- .../current/reference/runtime/menu.mdx | 23 - .../current/reference/runtime/window.mdx | 211 ------ .../current/tutorials/_category_.json | 4 - .../current/tutorials/dogsapi.mdx | 243 ------- .../current/tutorials/helloworld.mdx | 118 ---- .../community-guide.mdx | 142 ---- .../contributing/developing-new-features.mdx | 29 - .../contributing/documenting.mdx | 34 - .../contributing/fixing-bugs.mdx | 27 - .../contributing/helping-others.mdx | 13 - .../setting-up-a-dev-environment.mdx | 30 - .../contributing/testing.mdx | 16 - .../contributing/ways-of-contributing.mdx | 18 - .../credits.mdx | 196 ------ .../docusaurus-plugin-content-pages/faq.mdx | 9 - .../markdown-page.md | 7 - .../docusaurus-plugin-content-pages/stats.mdx | 24 - .../ko/docusaurus-theme-classic/footer.json | 54 -- .../ko/docusaurus-theme-classic/navbar.json | 38 -- website/i18n/ru/code.json | 415 ------------ .../2021-09-27-v2-beta1-release-notes.mdx | 155 ----- .../2021-11-08-v2-beta2-release-notes.mdx | 163 ----- .../2022-02-22-v2-beta3-release-notes.mdx | 110 --- .../authors.yml | 10 - .../options.json | 14 - .../current.json | 38 -- .../current/appendix/_category_.json | 4 - .../current/community/_category_.json | 4 - .../current/community/links.mdx | 23 - .../community/showcase/_category_.json | 4 - .../current/community/showcase/emailit.mdx | 8 - .../community/showcase/encrypteasy.mdx | 10 - .../current/community/showcase/filehound.mdx | 14 - .../community/showcase/minecraftupdater.mdx | 10 - .../community/showcase/modalfilemanager.mdx | 12 - .../community/showcase/mollywallet.mdx | 8 - .../current/community/showcase/october.mdx | 12 - .../current/community/showcase/optimus.mdx | 8 - .../current/community/showcase/portfall.mdx | 8 - .../community/showcase/restic-browser.mdx | 10 - .../current/community/showcase/riftshare.mdx | 19 - .../current/community/showcase/scriptbar.mdx | 8 - .../current/community/showcase/surge.mdx | 8 - .../current/community/showcase/wally.mdx | 8 - .../current/community/showcase/wombat.mdx | 8 - .../current/community/showcase/ytd.mdx | 8 - .../current/community/templates.mdx | 52 -- .../current/gettingstarted/_category_.json | 4 - .../current/gettingstarted/building.mdx | 21 - .../current/gettingstarted/development.mdx | 16 - .../current/gettingstarted/firstproject.mdx | 130 ---- .../current/gettingstarted/installation.mdx | 90 --- .../current/guides/_category_.json | 4 - .../guides/application-development.mdx | 194 ------ .../current/guides/bleeding-edge.mdx | 55 -- .../current/guides/dynamic-assets.mdx | 126 ---- .../current/guides/frameless.mdx | 84 --- .../current/guides/frontend.mdx | 75 --- .../current/guides/ides.mdx | 113 ---- .../current/guides/linux-distro-support.mdx | 101 --- .../current/guides/linux.mdx | 18 - .../current/guides/manual-builds.mdx | 95 --- .../current/guides/migrating.mdx | 189 ------ .../current/guides/mouse-buttons.mdx | 25 - .../current/guides/overscroll.mdx | 10 - .../current/guides/routing.mdx | 47 -- .../current/guides/signing.mdx | 377 ----------- .../current/guides/templates.mdx | 95 --- .../current/guides/troubleshooting.mdx | 137 ---- .../current/guides/vscode.mdx | 82 --- .../current/guides/windows-installer.mdx | 56 -- .../current/guides/windows.mdx | 61 -- .../current/howdoesitwork.mdx | 356 ---------- .../current/introduction.mdx | 71 -- .../current/reference/_category_.json | 4 - .../current/reference/cli.mdx | 221 ------ .../current/reference/menus.mdx | 266 -------- .../current/reference/options.mdx | 627 ----------------- .../current/reference/project-config.mdx | 51 -- .../current/reference/runtime/_category_.json | 4 - .../current/reference/runtime/browser.mdx | 14 - .../current/reference/runtime/dialog.mdx | 283 -------- .../current/reference/runtime/events.mdx | 38 -- .../current/reference/runtime/intro.mdx | 73 -- .../current/reference/runtime/log.mdx | 130 ---- .../current/reference/runtime/menu.mdx | 23 - .../current/reference/runtime/window.mdx | 211 ------ .../current/tutorials/_category_.json | 4 - .../current/tutorials/dogsapi.mdx | 243 ------- .../current/tutorials/helloworld.mdx | 118 ---- .../changelog.mdx | 370 ---------- .../community-guide.mdx | 142 ---- .../contributing/developing-new-features.mdx | 29 - .../contributing/documenting.mdx | 34 - .../contributing/fixing-bugs.mdx | 27 - .../contributing/helping-others.mdx | 13 - .../setting-up-a-dev-environment.mdx | 30 - .../contributing/testing.mdx | 16 - .../contributing/ways-of-contributing.mdx | 18 - .../credits.mdx | 196 ------ .../docusaurus-plugin-content-pages/faq.mdx | 9 - .../markdown-page.md | 7 - .../ru/docusaurus-theme-classic/footer.json | 54 -- .../ru/docusaurus-theme-classic/navbar.json | 38 -- .../2022-09-18-v2-release-notes.mdx | 26 +- .../current/reference/cli.mdx | 4 +- .../current/reference/options.mdx | 37 +- .../community-guide.mdx | 10 +- .../credits.mdx | 2 +- 240 files changed, 1052 insertions(+), 14562 deletions(-) create mode 100644 website/i18n/ja/docusaurus-plugin-content-blog/2022-09-18-v2-release-notes.mdx create mode 100644 website/i18n/ja/docusaurus-plugin-content-docs/current/guides/obfuscated.mdx create mode 100644 website/i18n/ja/docusaurus-plugin-content-pages/coc.mdx delete mode 100644 website/i18n/ko/code.json delete mode 100644 website/i18n/ko/docusaurus-plugin-content-blog/2021-09-27-v2-beta1-release-notes.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-blog/2021-11-08-v2-beta2-release-notes.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-blog/2022-02-22-v2-beta3-release-notes.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-blog/authors.yml delete mode 100644 website/i18n/ko/docusaurus-plugin-content-blog/options.json delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current.json delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/appendix/_category_.json delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/community/_category_.json delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/community/links.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/community/showcase/_category_.json delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/community/showcase/emailit.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/community/showcase/encrypteasy.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/community/showcase/filehound.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/community/showcase/minecraftupdater.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/community/showcase/modalfilemanager.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/community/showcase/mollywallet.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/community/showcase/october.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/community/showcase/optimus.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/community/showcase/portfall.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/community/showcase/restic-browser.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/community/showcase/riftshare.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/community/showcase/scriptbar.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/community/showcase/surge.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/community/showcase/wally.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/community/showcase/wombat.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/community/showcase/ytd.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/community/templates.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/contributing/_category_.json delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/contributing/developing-new-features.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/contributing/documenting.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/contributing/fixing-bugs.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/contributing/helping-others.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/contributing/setting-up-a-dev-environment.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/contributing/testing.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/contributing/ways-of-contributing.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/gettingstarted/_category_.json delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/gettingstarted/building.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/gettingstarted/development.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/gettingstarted/firstproject.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/gettingstarted/installation.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/guides/_category_.json delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/guides/application-development.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/guides/bleeding-edge.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/guides/dynamic-assets.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/guides/frameless.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/guides/frontend.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/guides/ides.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/guides/linux-distro-support.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/guides/linux.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/guides/manual-builds.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/guides/migrating.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/guides/mouse-buttons.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/guides/overscroll.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/guides/routing.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/guides/signing.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/guides/templates.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/guides/troubleshooting.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/guides/vscode.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/guides/windows-installer.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/guides/windows.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/howdoesitwork.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/introduction.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/reference/_category_.json delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/reference/cli.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/reference/menus.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/reference/options.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/reference/project-config.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/reference/runtime/_category_.json delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/reference/runtime/browser.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/reference/runtime/dialog.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/reference/runtime/events.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/reference/runtime/intro.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/reference/runtime/log.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/reference/runtime/menu.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/reference/runtime/window.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/tutorials/_category_.json delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/tutorials/dogsapi.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/tutorials/helloworld.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-pages/community-guide.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-pages/contributing/developing-new-features.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-pages/contributing/documenting.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-pages/contributing/fixing-bugs.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-pages/contributing/helping-others.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-pages/contributing/setting-up-a-dev-environment.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-pages/contributing/testing.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-pages/contributing/ways-of-contributing.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-pages/credits.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-pages/faq.mdx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-pages/markdown-page.md delete mode 100644 website/i18n/ko/docusaurus-plugin-content-pages/stats.mdx delete mode 100644 website/i18n/ko/docusaurus-theme-classic/footer.json delete mode 100644 website/i18n/ko/docusaurus-theme-classic/navbar.json delete mode 100644 website/i18n/ru/code.json delete mode 100644 website/i18n/ru/docusaurus-plugin-content-blog/2021-09-27-v2-beta1-release-notes.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-blog/2021-11-08-v2-beta2-release-notes.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-blog/2022-02-22-v2-beta3-release-notes.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-blog/authors.yml delete mode 100644 website/i18n/ru/docusaurus-plugin-content-blog/options.json delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current.json delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/appendix/_category_.json delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/community/_category_.json delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/community/links.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/community/showcase/_category_.json delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/community/showcase/emailit.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/community/showcase/encrypteasy.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/community/showcase/filehound.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/community/showcase/minecraftupdater.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/community/showcase/modalfilemanager.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/community/showcase/mollywallet.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/community/showcase/october.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/community/showcase/optimus.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/community/showcase/portfall.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/community/showcase/restic-browser.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/community/showcase/riftshare.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/community/showcase/scriptbar.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/community/showcase/surge.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/community/showcase/wally.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/community/showcase/wombat.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/community/showcase/ytd.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/community/templates.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/gettingstarted/_category_.json delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/gettingstarted/building.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/gettingstarted/development.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/gettingstarted/firstproject.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/gettingstarted/installation.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/guides/_category_.json delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/guides/application-development.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/guides/bleeding-edge.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/guides/dynamic-assets.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/guides/frameless.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/guides/frontend.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/guides/ides.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/guides/linux-distro-support.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/guides/linux.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/guides/manual-builds.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/guides/migrating.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/guides/mouse-buttons.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/guides/overscroll.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/guides/routing.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/guides/signing.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/guides/templates.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/guides/troubleshooting.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/guides/vscode.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/guides/windows-installer.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/guides/windows.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/howdoesitwork.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/introduction.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/reference/_category_.json delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/reference/cli.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/reference/menus.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/reference/options.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/reference/project-config.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/reference/runtime/_category_.json delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/reference/runtime/browser.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/reference/runtime/dialog.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/reference/runtime/events.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/reference/runtime/intro.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/reference/runtime/log.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/reference/runtime/menu.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/reference/runtime/window.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/tutorials/_category_.json delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/tutorials/dogsapi.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-docs/current/tutorials/helloworld.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-pages/changelog.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-pages/community-guide.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-pages/contributing/developing-new-features.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-pages/contributing/documenting.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-pages/contributing/fixing-bugs.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-pages/contributing/helping-others.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-pages/contributing/setting-up-a-dev-environment.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-pages/contributing/testing.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-pages/contributing/ways-of-contributing.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-pages/credits.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-pages/faq.mdx delete mode 100644 website/i18n/ru/docusaurus-plugin-content-pages/markdown-page.md delete mode 100644 website/i18n/ru/docusaurus-theme-classic/footer.json delete mode 100644 website/i18n/ru/docusaurus-theme-classic/navbar.json diff --git a/website/README.md b/website/README.md index aaba2fa1e..d9383a784 100644 --- a/website/README.md +++ b/website/README.md @@ -5,17 +5,45 @@ This website is built using [Docusaurus 2](https://docusaurus.io/), a modern sta ### Installation ``` -$ yarn +$ npm ``` ### Local Development ``` -$ yarn start +$ npm run start ``` +Other languages: + +``` +npm run start -- --locale +``` + +language - The language code configured in the i18n field in the docusaurus.config.js file. + This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. +### Translate + +After the English source file is updated, run the following command to submit the source file to Crowdin: + +``` +npm run crwodin push -- -b +``` + +branch - Branch name in crowdin project + +Run the following command to pull the translated files in crwodin to the local: + +``` +npm run crwodin pull -- -b -l +``` + +languageCode - **Note** that this refers to the language code in the crowdin project. + +The recommended practice is to update the English source file locally, then translate the file in crowdin, and finally pull the translated file to the local. + ### Build ``` @@ -23,19 +51,3 @@ $ yarn build ``` This command generates static content into the `build` directory and can be served using any static contents hosting service. - -### Deployment - -Using SSH: - -``` -$ USE_SSH=true yarn deploy -``` - -Not using SSH: - -``` -$ GIT_USER= yarn deploy -``` - -If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. diff --git a/website/i18n/ja/code.json b/website/i18n/ja/code.json index 48ebc03f0..91db7b3fa 100644 --- a/website/i18n/ja/code.json +++ b/website/i18n/ja/code.json @@ -3,7 +3,7 @@ "message": "豊富な機能" }, "homepage.Features.Description1": { - "message": "メニューやダイアログなどのネイティブUI要素を使用して、クロスプラットフォームアプリを構築しましょう。" + "message": "Build comprehensive cross-platform applications using native UI elements such as menus and dialogs." }, "homepage.Features.Title2": { "message": "使い慣れた技術" diff --git a/website/i18n/ja/docusaurus-plugin-content-blog/2021-09-27-v2-beta1-release-notes.mdx b/website/i18n/ja/docusaurus-plugin-content-blog/2021-09-27-v2-beta1-release-notes.mdx index 773f6dd6c..cab9b938b 100644 --- a/website/i18n/ja/docusaurus-plugin-content-blog/2021-09-27-v2-beta1-release-notes.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-blog/2021-09-27-v2-beta1-release-notes.mdx @@ -8,6 +8,7 @@ tags: - v2 --- +```mdx-code-block
-
+``` 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. @@ -32,6 +33,7 @@ No, I'm not joking: *No* *CGO* *dependency* 🤯! The thing about Windows is tha ### WebView2 Chromium Renderer +```mdx-code-block
-
+``` 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! @@ -52,6 +54,7 @@ Gophers rejoice! The single binary dream lives on! ### New Features +```mdx-code-block
-
+``` 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. @@ -68,6 +71,7 @@ There were a huge number of requests in v1 for the ability to have greater contr 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. +```mdx-code-block
-
+``` ### No requirement to bundle assets @@ -92,6 +96,7 @@ You just pass a single `embed.FS` that contains all your assets into your applic ### New Development Experience +```mdx-code-block
-
+``` 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. @@ -117,6 +122,7 @@ In addition to this, another JS module is dynamically generated wrapping all you ### Remote Templates +```mdx-code-block
-
+``` 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! It also meant that we didn't have cool modern templates for the latest and greatest tech stacks. It also meant that we didn't have cool modern templates for the latest and greatest tech stacks. @@ -139,7 +145,7 @@ There were many twists and turns, pivots and u-turns to get to this point. This I also need to give a huge thank you :pray: to the following people because without them, this release just wouldn't exist: -- [Misitebao](https://github.com/misitebao) - An absolute workhorse on the Chinese translations and an incredible bug finder. +- [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. diff --git a/website/i18n/ja/docusaurus-plugin-content-blog/2021-11-08-v2-beta2-release-notes.mdx b/website/i18n/ja/docusaurus-plugin-content-blog/2021-11-08-v2-beta2-release-notes.mdx index 04d90e4f6..e11c778df 100644 --- a/website/i18n/ja/docusaurus-plugin-content-blog/2021-11-08-v2-beta2-release-notes.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-blog/2021-11-08-v2-beta2-release-notes.mdx @@ -8,6 +8,7 @@ tags: - v2 --- +```mdx-code-block
-
+``` 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. @@ -26,6 +27,7 @@ So what's new for Wails v2 for Mac vs v1? Hint: It's pretty similar to the Windo ### New Features +```mdx-code-block
-
+``` 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. @@ -78,6 +80,7 @@ In addition to this, another JS module is dynamically generated wrapping all you ### Remote Templates +```mdx-code-block
-
+``` 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! It also meant that we didn't have cool modern templates for the latest and greatest tech stacks. It also meant that we didn't have cool modern templates for the latest and greatest tech stacks. @@ -96,6 +99,7 @@ With v2, I wanted to empower the community by giving you the ability to create a Thanks to the amazing support of [Mat Ryer](https://github.com/matryer/), the Wails project now supports M1 native builds: +```mdx-code-block
-
+``` You can also specify `darwin/amd64` as a target too: +```mdx-code-block
-
+``` Oh, I almost forgot.... you can also do `darwin/universal`.... :wink: +```mdx-code-block
-
+``` ### Cross Compilation to Windows Because Wails v2 for Windows is pure Go, you can target Windows builds without docker. +```mdx-code-block
-
+``` ### WKWebView Renderer diff --git a/website/i18n/ja/docusaurus-plugin-content-blog/2022-02-22-v2-beta3-release-notes.mdx b/website/i18n/ja/docusaurus-plugin-content-blog/2022-02-22-v2-beta3-release-notes.mdx index 35b49f4f4..010417854 100644 --- a/website/i18n/ja/docusaurus-plugin-content-blog/2022-02-22-v2-beta3-release-notes.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-blog/2022-02-22-v2-beta3-release-notes.mdx @@ -8,6 +8,7 @@ tags: - v2 --- +```mdx-code-block
-
+``` 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 +```mdx-code-block
-
+``` 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. @@ -65,6 +67,7 @@ In addition to this, another JS module is dynamically generated wrapping all you ### Remote Templates +```mdx-code-block
-
+``` 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! It also meant that we didn't have cool modern templates for the latest and greatest tech stacks. It also meant that we didn't have cool modern templates for the latest and greatest tech stacks. @@ -83,15 +86,16 @@ With v2, I wanted to empower the community by giving you the ability to create a Because Wails v2 for Windows is pure Go, you can target Windows builds without docker. +```mdx-code-block
-
+``` ### In Conclusion diff --git a/website/i18n/ja/docusaurus-plugin-content-blog/2022-09-18-v2-release-notes.mdx b/website/i18n/ja/docusaurus-plugin-content-blog/2022-09-18-v2-release-notes.mdx new file mode 100644 index 000000000..36017b8b9 --- /dev/null +++ b/website/i18n/ja/docusaurus-plugin-content-blog/2022-09-18-v2-release-notes.mdx @@ -0,0 +1,99 @@ +--- +slug: wails-v2-released +title: Wails v2 Released +authors: + - leaanthony +tags: + - wails + - v2 +--- + +```mdx-code-block +
+ +
+
+``` + +# 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](/docs/reference/options#theme) + [custom theming](/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](/docs/guides/application-development#application-menu) and [dialogs](/docs/reference/runtime/dialog). +- Native window translucency effects for [Windows](/docs/reference/options#windowistranslucent) and [macOS](/docs/reference/options#windowistranslucent-1). Support for Mica & Acrylic backdrops. +- Easily generate an [NSIS installer](/docs/guides/windows-installer) for Windows deployments. +- A rich [runtime library](/docs/reference/runtime/intro) providing utility methods for window manipulation, eventing, dialogs, menus and logging. +- Support for [obfuscating](/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](/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 88 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! diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/emailit.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/emailit.mdx index 4a1ebe835..04150ba28 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/emailit.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/emailit.mdx @@ -1,8 +1,10 @@ # EmailIt +```mdx-code-block


+``` [EmailIt](https://github.com/raguay/EmailIt/) is a Wails 2 program that is a markdown based email sender only with nine notepads, scripts to manipulate the text, and templates. It also has a builtin [Node-Red](https://nodered.org/) server, scripts terminal, and the [ScriptBar](https://github.com/raguay/ScriptBarApp) program for displaying results from Node-Red or a script on your system. Documentation is very scarce, but the programs works. It’s built using Wails2 and Svelte, and the download is a universal macOS application. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/encrypteasy.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/encrypteasy.mdx index 13c2d8345..7504950ea 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/encrypteasy.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/encrypteasy.mdx @@ -1,9 +1,11 @@ # EncryptEasy +```mdx-code-block


+``` **[EncryptEasy](https://www.encrypteasy.app) is a simple and easy to use PGP encryption tool, managing all your and your contacts keys. Encryption should be simple. Developed with Wails.** diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/filehound.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/filehound.mdx index 78cbfca86..134365aaf 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/filehound.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/filehound.mdx @@ -1,9 +1,11 @@ # FileHound Export Utility +```mdx-code-block


+``` [FileHound Export Utility](https://www.filehound.co.uk/) FileHound is a cloud document management platform made for secure file retention, business process automation and SmartCapture capabilities. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/minecraftupdater.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/minecraftupdater.mdx index 11247339d..2f6c7c72b 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/minecraftupdater.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/minecraftupdater.mdx @@ -1,10 +1,14 @@ # Minecraft Updater +```mdx-code-block


+``` [Minecraft Updater](https://github.com/Gurkengewuerz/MinecraftModUpdater) is a utility tool to update and synchronize Minecraft mods for your userbase. It’s built using Wails2 and React with [antd](https://ant.design/) as frontend framework. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/modalfilemanager.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/modalfilemanager.mdx index a7ae8c492..f8e2bcd66 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/modalfilemanager.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/modalfilemanager.mdx @@ -1,11 +1,13 @@ # Modal File Manager +```mdx-code-block


+``` [Modal File Manager](https://github.com/raguay/ModalFileManager) is a dual pane file manager using web technologies. My original design was based on NW.js and can be found [here](https://github.com/raguay/ModalFileManager-NWjs). This version uses the same Svelte based frontend code (but it has be greatly modified since the departure from NW.js), but the backend is a [Wails 2](https://wails.io/) implementation. By using this implementation, I no longer use command line `rm`, `cp`, etc. commands. It is fully coded using Go and runs much faster than the previous versions. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/mollywallet.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/mollywallet.mdx index 534b097ca..5d846d06d 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/mollywallet.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/mollywallet.mdx @@ -1,8 +1,10 @@ # Molley Wallet +```mdx-code-block


+``` [Molly Wallet](https://github.com/grvlle/constellation_wallet/) the official $DAG wallet of the Constellation Network. It'll let users interact with the Hypergraph Network in various ways, not limited to producing $DAG transactions. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/october.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/october.mdx index 889d2dd9e..66d634dc5 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/october.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/october.mdx @@ -1,9 +1,11 @@ # October +```mdx-code-block


+``` [October](https://october.utf9k.net) is a small Wails application that makes it really easy to extract highlights from [Kobo eReaders](https://en.wikipedia.org/wiki/Kobo_eReader) and then forward them to [Readwise](https://readwise.io). diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/optimus.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/optimus.mdx index c3eb79507..4f87479d6 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/optimus.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/optimus.mdx @@ -1,8 +1,10 @@ # Optimus +```mdx-code-block


+``` [Optimus](https://github.com/splode/optimus) is a desktop image optimization application. It supports conversion and compression between WebP, JPEG, and PNG image formats. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/portfall.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/portfall.mdx index 4cc2c63c9..03e740f4c 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/portfall.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/portfall.mdx @@ -1,8 +1,10 @@ # Portfall +```mdx-code-block


+``` [Portfall](https://github.com/rekon-oss/portfall) - A desktop k8s port-forwarding portal for easy access to all your cluster UIs diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/restic-browser.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/restic-browser.mdx index 1505ce07a..3646384ec 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/restic-browser.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/restic-browser.mdx @@ -1,10 +1,12 @@ # Restic Browser +```mdx-code-block


+``` [Restic-Browser](https://github.com/emuell/restic-browser) - A simple, cross-platform [restic](https://github.com/restic/restic) backup GUI for browsing and restoring restic repositories. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/riftshare.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/riftshare.mdx index 5223e88cf..9928b4785 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/riftshare.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/riftshare.mdx @@ -1,9 +1,11 @@ # RiftShare +```mdx-code-block


+``` Easy, Secure, and Free file sharing for everyone. Learn more at [Riftshare.app](https://riftshare.app) diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/scriptbar.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/scriptbar.mdx index aaa556f92..2ccb2acb4 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/scriptbar.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/scriptbar.mdx @@ -1,8 +1,10 @@ # ScriptBar +```mdx-code-block


+``` [ScriptBar](https://GitHub.com/raguay/ScriptBarApp) is a program to show the output of the embedded [Node-Red](https://nodered.org) server in the [EmailIt](https://GitHub.com/raguay/EmailIt) application. It also displays the output of scripts on your system. ScriptBar doesn't put them in the menubar, but has them all in a convient window for easy viewing. You can have multiple tabs to have many different things show. You can also keep the links to your most visited web sites. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/surge.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/surge.mdx index 2d895dc29..c3b3fb4c0 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/surge.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/surge.mdx @@ -1,8 +1,10 @@ # Surge +```mdx-code-block


+``` [Surge](https://getsurge.io/) is a p2p filesharing app designed to utilize blockchain technologies to enable 100% anonymous file transfers. Surge is end-to-end encrypted, decentralized and open source. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/wally.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/wally.mdx index 2a2498f40..7408aa585 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/wally.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/wally.mdx @@ -1,8 +1,10 @@ # Wally +```mdx-code-block


+``` [Wally](https://ergodox-ez.com/pages/wally) is the official firmware flasher for [Ergodox](https://ergodox-ez.com/) keyboards. It looks great and is a fantastic example of what you can achieve with Wails: the ability to combine the power of Go and the rich graphical tools of the web development world. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/wombat.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/wombat.mdx index 54cedacea..f100c55e2 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/wombat.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/wombat.mdx @@ -1,8 +1,10 @@ # Wombat +```mdx-code-block


+``` [Wombat](https://github.com/rogchap/wombat) is a cross platform gRPC client. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/ytd.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/ytd.mdx index 178ff0529..5db428f72 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/ytd.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/showcase/ytd.mdx @@ -1,8 +1,10 @@ # Ytd +```mdx-code-block


+``` [Ytd](https://github.com/marcio199226/ytd/tree/v2-wails) is an app for downloading tracks from youtube, creating offline playlists and share them with your friends, your friends will be able to playback your playlists or download them for offline listening, has an built-in player. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/templates.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/templates.mdx index d9a29a6fa..3c24c5d7e 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/community/templates.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/community/templates.mdx @@ -14,12 +14,14 @@ Example: `wails init -n "Your Project Name" -t https://github.com/misitebao/wail :::warning Attention + **The Wails project does not maintain, is not responsible nor liable for 3rd party templates!** If you are unsure about a template, inspect `package.json` and `wails.json` for what scripts are run and what packages are installed. ::: + ## Vue - [wails-template-vue](https://github.com/misitebao/wails-template-vue) - A template using Vite,Vue and Vue-Router(Support both JavaScript and TypeScript) @@ -49,4 +51,4 @@ If you are unsure about a template, inspect `package.json` and `wails.json` for ## Pure JavaScript (Vanilla) -- [wails-pure-js-template](https://github.com/KiddoV/wails-pure-js-template) - A template with nothing but just basic JavaScript, HTML, and CSS \ No newline at end of file +- [wails-pure-js-template](https://github.com/KiddoV/wails-pure-js-template) - A template with nothing but just basic JavaScript, HTML, and CSS diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/gettingstarted/building.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/gettingstarted/building.mdx index 3e0df3b68..a1f69f033 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/gettingstarted/building.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/gettingstarted/building.mdx @@ -8,6 +8,7 @@ From the project directory, run `wails build`. This will compile your project an If you run the binary, you should see the default application: +```mdx-code-block
-
+``` For more details on compilation options, please refer to the [CLI Reference](../reference/cli.mdx#build). diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/gettingstarted/development.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/gettingstarted/development.mdx index 54dda5faa..a0075ef69 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/gettingstarted/development.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/gettingstarted/development.mdx @@ -8,7 +8,7 @@ You can run your application in development mode by running `wails dev` from you - Build your application and run it - Bind your Go code to the frontend so it can be called from Javascript -- Using the power of [vite](https://vitejs.dev/), will watch for modifications in your Go files and rebuild/re-run on change +- Using the power of [Vite](https://vitejs.dev/), will watch for modifications in your Go files and rebuild/re-run on change - Sets up a [webserver](http://localhost:34115) that will serve your application over a browser. This allows you to use your favourite browser extensions. You can even call your Go code from the console To get started, run `wails dev` in the project directory. More information on this can be found [here](../reference/cli.mdx#dev). diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/gettingstarted/firstproject.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/gettingstarted/firstproject.mdx index 86036d24b..3428906ef 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/gettingstarted/firstproject.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/gettingstarted/firstproject.mdx @@ -10,8 +10,7 @@ Now that the CLI is installed, you can generate a new project by using the `wail Pick your favourite framework: - - +```mdx-code-block import Tabs from "@theme/Tabs"; import TabItem from "@theme/TabItem"; @@ -19,17 +18,18 @@ import TabItem from "@theme/TabItem"; defaultValue="Svelte" values={[ {label: "Svelte", value: "Svelte"}, - {label: "React", value: "React"}, - {label: "Vue", value: "Vue"}, - {label: "Preact", value: "Preact"}, - {label: "Lit", value: "Lit"}, - {label: "Vanilla", value: "Vanilla"}, - ]} + {label: "React", value: "React"}, + {label: "Vue", value: "Vue"}, + {label: "Preact", value: "Preact"}, + {label: "Lit", value: "Lit"}, + {label: "Vanilla", value: "Vanilla"}, + ]} > Generate a Svelte project using Javascript with:

wails init -n myproject -t svelte + If you would rather use Typescript:
wails init -n myproject -t svelte-ts @@ -39,54 +39,54 @@ If you would rather use Typescript:
Generate a React project using Javascript with:

wails init -n myproject -t react + If you would rather use Typescript:
wails init -n myproject -t react-ts
- Vue用のJavascriptプロジェクトを生成する場合:

+ Generate a Vue project using Javascript with:

wails init -n myproject -t vue -Typescriptプロジェクトを生成する場合:
+If you would rather use Typescript:
wails init -n myproject -t vue-ts
- Preact用のJavascriptプロジェクトを生成する場合:

+ Generate a Preact project using Javascript with:

wails init -n myproject -t preact -Typescriptプロジェクトを生成する場合:
+If you would rather use Typescript:
wails init -n myproject -t preact-ts
- Lit用のJavascriptプロジェクトを生成する場合:

+ Generate a Lit project using Javascript with:

wails init -n myproject -t lit -Typescriptプロジェクトを生成する場合:
+If you would rather use Typescript:
wails init -n myproject -t lit-ts
- Vanilla用のJavascriptプロジェクトを生成する場合:

+ Generate a Vanilla project using Javascript with:

wails init -n myproject -t vanilla -Typescriptプロジェクトを生成する場合:
+If you would rather use Typescript:
wails init -n myproject -t vanilla-ts
- - +```
diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/gettingstarted/installation.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/gettingstarted/installation.mdx index 7dff4dd50..858100bbe 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/gettingstarted/installation.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/gettingstarted/installation.mdx @@ -20,7 +20,7 @@ Wails has a number of common dependencies that are required before installation: ### Go -Download Go from the [Go Downloads Page](https://go.dev/doc/install). +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: @@ -37,8 +37,7 @@ Run `npm --version` to verify. You will also need to install platform specific dependencies: - - +```mdx-code-block import Tabs from "@theme/Tabs"; import TabItem from "@theme/TabItem"; @@ -46,32 +45,22 @@ import TabItem from "@theme/TabItem"; defaultValue="Windows" values={[ { label: "Windows", value: "Windows" }, - { label: "MacOS", value: "MacOS" }, - { label: "Linux", value: "Linux" }, - ]} + { label: "MacOS", value: "MacOS" }, + { label: "Linux", value: "Linux" }, + ]} > - Wailsを使用するには、xcodeコマンドラインツールがインストールされている必要があります。 This can be done by running:
- xcode-select --install + Wails requires that the xcode command line tools are installed. This can be + done by running xcode-select --install.
- Wails requires that the WebView2{" "} - runtime is installed. Some Windows installations will already have this installed. You can check using - the{" "} - wails doctor command (see below). + Wails requires that the WebView2 runtime is installed. Some Windows installations will already have this installed. You can check using the wails doctor command. - Linux required the standard gcc build tools - plus libgtk3 and libwebkit. Rather than list a ton of commands for different distros, Wails can try to determine - what the installation commands are for your specific distribution. Run wails doctor after - installation - to be shown how to install the dependencies. If your distro/package manager is not supported, please consult the {" "} - Add Linux Distro guide. + Linux required the standard gcc build tools plus libgtk3 and libwebkit. Rather than list a ton of commands for different distros, Wails can try to determine what the installation commands are for your specific distribution. Run wails doctor after installation to be shown how to install the dependencies. If your distro/package manager is not supported, please consult the Add Linux Distro guide. - - +``` ## Optional Dependencies diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/dynamic-assets.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/dynamic-assets.mdx index a0e14211c..40a779381 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/dynamic-assets.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/dynamic-assets.mdx @@ -87,17 +87,21 @@ let response = await fetch('does-not-exist.txt'); This will generate an error in the devtools. We can see that the error is what we expect, returned by our custom assets handler: +```mdx-code-block

+``` However, if we request `go.mod`, we will see the following output: +```mdx-code-block

+``` This technique can be used to load images directly into the page. If we updated our default vanilla template and replaced the logo image: @@ -113,14 +117,18 @@ with: Then we would see the following: +```mdx-code-block

+``` :::warning -Exposing your filesystem in this way is a security risk. It is recommended that you properly manage access -to your filesystem. + + +Exposing your filesystem in this way is a security risk. It is recommended that you properly manage access to your filesystem. + ::: diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/frameless.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/frameless.mdx index 3541c212f..a9370f36f 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/frameless.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/frameless.mdx @@ -4,7 +4,6 @@ Wails supports application that have no frames. This can be achieved by using th Wails offers a simple solution for dragging the window: Any HTML element that has the CSS style `--wails-draggable:drag` will act as a "drag handle". This property applies to all child elements. If you need to indicate that a nested element should not drag, then use the attribute '--wails-draggable:no-drag' on that element. - ```html @@ -66,19 +65,21 @@ func main() { ```html title=index.html - - - + + + alwaysontop - - -
- - + + +
+ + - ``` :::info Fullscreen - If you allow your application to go fullscreen, this drag functionality will be disabled. + + +If you allow your application to go fullscreen, this drag functionality will be disabled. + ::: diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/ides.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/ides.mdx index a20ae4131..5187065ad 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/ides.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/ides.mdx @@ -6,12 +6,14 @@ Currently, we support [Visual Studio Code](https://code.visualstudio.com/) but a ## Visual Studio Code +```mdx-code-block

+``` When generating a project using the `-ide vscode` flags, IDE files will be created alongside the other project files. These files are placed into the `.vscode` directory and provide the correct configuration for debugging your application. @@ -108,6 +110,7 @@ The `tasks.json` file is simple for the default project as there is no `npm inst :::info Future Enhancement + In the future, we hope to generate a `tasks.json` that includes the install and build steps automatically. ::: diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/linux-distro-support.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/linux-distro-support.mdx index 28a224a26..882f8d258 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/linux-distro-support.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/linux-distro-support.mdx @@ -97,5 +97,8 @@ type PackageManager interface { Take a look at the other package managers code to get an idea how this works. :::info Remember + + If you add support for a new package manager, don't forget to also update this page! + ::: diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/obfuscated.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/obfuscated.mdx new file mode 100644 index 000000000..049efbb32 --- /dev/null +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/obfuscated.mdx @@ -0,0 +1,42 @@ +# Obfuscated Builds + +Wails includes support for obfuscating your application using [garble](https://github.com/burrowers/garble). + +To produce an obfuscated build, you can use the `-obfuscate` flag with the `wails build` command: + +```bash +wails build -obfuscate +``` + +To customise the obfuscation settings, you can use the `-garbleargs` flag: + +```bash +wails build -obfuscate -garbleargs "-literals -tiny -seed=myrandomseed" +``` + +These settings may be persisted in your [project config](../reference/project-config). + +## How it works + +In a standard build, all bound methods are available in the frontend under the `window.go` variable. When these methods are called, the corresponding backend method is called using the fully qualified function name. When using an obfuscated build, methods are bound using an ID instead of a name. The bindings generated in the `wailsjs` directory use these IDs to call the backend functions. + +:::note + + +To ensure that your application will work in obfuscated mode, you must use the generated bindings under the `wailsjs` directory in your application. + +::: + + +## Example + +Importing the "Greet" method from the bindings like this: + +```js +import { Greet } from "../../wailsjs/go/main/App"; + +// snip +Greet("World"); +``` + +will ensure that the method will work correctly in obfuscated mode, as the bindings will be regenerated with IDs and the call mechanism updated. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/overscroll.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/overscroll.mdx index dca7e83a3..9d1d772d0 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/overscroll.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/overscroll.mdx @@ -4,7 +4,7 @@ ```css html { - height: 100%; - overflow: hidden; + height: 100%; + overflow: hidden; } ``` diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/templates.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/templates.mdx index df75cbbc7..790e3107f 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/templates.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/templates.mdx @@ -77,12 +77,14 @@ Renaming package-lock.json -> package-lock.tmpl.json... - Once the project has compiled, run it: `.\build\bin\my-vue3-project.exe` - You should have a fully functioning Vue3 application: +```mdx-code-block
+``` ## Publishing Templates diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/troubleshooting.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/troubleshooting.mdx index 23c9b7728..aa1da16a4 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/troubleshooting.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/troubleshooting.mdx @@ -35,9 +35,15 @@ Reference: https://github.com/wailsapp/wails/issues/1504#issuecomment-1174317433 If your built application looks like this in finder: +```mdx-code-block

- +

+``` it's likely that your application's `info.plist` is invalid. Update the file in `build/.app/Contents/info.plist` and check if the data is valid, EG check the binary name is correct. To persist the changes, copy the file back to the `build/darwin` directory. @@ -54,25 +60,30 @@ func (a *App) TestFunc(msg string, args ...interface{}) error { calling this method from the frontend like this will fail: ```js -var msg = "Hello: " -var args = ["Go", "JS"] -window.go.main.App.TestFunc(msg, ...args).then((result) => { +var msg = "Hello: "; +var args = ["Go", "JS"]; +window.go.main.App.TestFunc(msg, ...args) + .then((result) => { //do things here -}).catch((error) => { + }) + .catch((error) => { //handle error -}); + }); ``` Workaround: ```js -var msg = "Hello " -var args = ["Go", "JS"] -window.go.main.App.TestFunc(msg, args).then((result) => { //without the 3 dots +var msg = "Hello "; +var args = ["Go", "JS"]; +window.go.main.App.TestFunc(msg, args) + .then((result) => { + //without the 3 dots //do things here -}).catch((error) => { + }) + .catch((error) => { //handle error -}); + }); ``` Credit: https://github.com/wailsapp/wails/issues/1186 @@ -104,8 +115,8 @@ If you navigate away from `index.html` to a new html file, the context will be l ```html - - + + ``` @@ -132,6 +143,6 @@ In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/Sy #define NS_FORMAT_ARGUMENT(A) __attribute__ ((format_arg(A))) ``` -This is *normally* due to a mismatch with the OS version you are running and the version of the XCode Command Line Tools installed. If you see an error like this, try upgrading your XCode Command Line Tools to the latest version. +This is _normally_ due to a mismatch with the OS version you are running and the version of the XCode Command Line Tools installed. If you see an error like this, try upgrading your XCode Command Line Tools to the latest version. -Source: https://github.com/wailsapp/wails/issues/1806 \ No newline at end of file +Source: https://github.com/wailsapp/wails/issues/1806 diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/windows-installer.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/windows-installer.mdx index 249ec5527..b0b6e9e1f 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/windows-installer.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/windows-installer.mdx @@ -1,12 +1,14 @@ # NSIS installer +```mdx-code-block

+ />

+``` Wails supports generating Windows installers using the [NSIS installer](https://nsis.sourceforge.io/). diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/howdoesitwork.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/howdoesitwork.mdx index efafbada9..0c706775a 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/howdoesitwork.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/howdoesitwork.mdx @@ -6,9 +6,11 @@ sidebar_position: 20 A Wails application is a standard Go application, with a webkit frontend. The Go part of the application consists of the application code and a runtime library that provides a number of useful operations, like controlling the application window. The frontend is a webkit window that will display the frontend assets. Also available to the frontend is a Javascript version of the runtime library. Finally, it is possible to bind Go methods to the frontend, and these will appear as Javascript methods that can be called, just as if they were local Javascript methods. +```mdx-code-block
+``` ## The Main Application @@ -106,10 +108,12 @@ The `Bind` option is one of the most important options in a Wails application. I :::info Note + Wailsで構造体を正しくバインドするためには、構造体の*インスタンス*をオプションで指定してください。 ::: + In this example, we create a new `App` instance and then add this instance to the `Bind` option in `wails.Run`: ```go {16,24} title="main.go" @@ -225,9 +229,13 @@ The generated methods return a Promise. A successful call will result in the fir All data types are correctly translated between Go and Javascript. Even structs. If you return a struct from a Go call, it will be returned to your frontend as a Javascript class. Note: If you wish to use structs, you **must** define `json` struct tags for your fields! :::info Note + + Anonymous nested structs are not supported at this time. + ::: + It is possible to send structs back to Go. Any Javascript map/class passed as an argument that is expecting a struct, will be converted to that struct type. To make this process a lot easier, in `dev` mode, a TypeScript module is generated, defining all the struct types used in bound methods. Using this module, it's possible to construct and send native Javascript objects to the Go code. There is also support for Go methods that use structs in their signature. All Go structs specified by a bound method (either as parameters or return types) will have Typescript versions auto generated as part of the Go code wrapper module. Using these, it's possible to share the same data model between Go and Javascript. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/introduction.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/introduction.mdx index ab616d0a6..9c0452644 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/introduction.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/introduction.mdx @@ -16,19 +16,23 @@ Consider it a lightweight and fast Electron alternative for Go. You can easily b - Easily call Go methods from Javascript - Automatic Go struct to Typescript model generation - No CGO or external DLLs required on Windows -- Live development mode using the power of [Vite](https://vite.net/) +- Live development mode using the power of [Vite](https://vitejs.dev/) - Powerful CLI to easily Create, Build and Package applications -- A rich [runtime library](/docs/next/reference/runtime) +- A rich [runtime library](/docs/next/reference/runtime/intro) - Applications built with Wails are Apple & Microsoft Store compliant - This is [varly](https://varly.app) - a desktop application for MacOS & Windows written using Wails. Not only does it look great, it uses native menus and translucency - everything you'd expect from a modern native app. +```mdx-code-block

- +

+``` ### Quick Start Templates diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/cli.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/cli.mdx index 1aeb266c4..ecb25d43a 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/cli.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/cli.mdx @@ -39,12 +39,14 @@ A list of community maintained templates can be found [here](../community/templa :::warning Attention + **The Wails project does not maintain, is not responsible nor liable for 3rd party templates!** If you are unsure about a template, inspect `package.json` and `wails.json` for what scripts are run and what packages are installed. ::: + ## build `wails build` is used for compiling your project to a production-ready binary. @@ -59,7 +61,7 @@ If you are unsure about a template, inspect `package.json` and `wails.json` for | -o filename | Output filename | | | -s | Skip building the frontend | false | | -f | Force build application | false | -| -tags "extra tags" | Build tags to pass to compiler (quoted and space separated) | | +| -tags "extra tags" | Build tags to pass to Go compiler. Must be quoted. Space or comma (but not both) separated | | | -upx | Compress final binary using "upx" | | | -upxflags | Flags to pass to upx | | | -v int | Verbosity level (0 - silent, 1 - default, 2 - verbose) | 1 | @@ -68,7 +70,9 @@ If you are unsure about a template, inspect `package.json` and `wails.json` for | -debug | Retains debug information in the application. Allows the use of the devtools in the application window | false | | -trimpath | Remove all file system paths from the resulting executable. | false | | -race | Build with Go's race detector | false | -| -windowsconsole | Keep the console window for Windows builds | false | +| -windowsconsole | Keep the console window for Windows builds | | +| -obfuscate | Obfuscate the application using [garble](https://github.com/burrowers/garble) | false | +| -garbleargs | Arguments to pass to garble | `-literals -tiny -seed=random` | For a detailed description of the `webview2` flag, please refer to the [Windows](../guides/windows.mdx) Guide. @@ -80,16 +84,20 @@ Example: :::info UPX on Apple Silicon + There are [issues](https://github.com/upx/upx/issues/446) with using UPX with Apple Silicon. ::: + :::info UPX on Windows + Some Antivirus vendors false positively mark `upx` compressed binaries as virus, see [issue](https://github.com/upx/upx/issues/437). ::: + ### Platforms Supported platforms are: diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/menus.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/menus.mdx index 565c8cb48..a53759904 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/menus.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/menus.mdx @@ -106,57 +106,23 @@ Example: Keys are any single character on a keyboard with the exception of `+`, which is defined as `plus`. Some keys cannot be represented as characters so there are a set of named characters that may be used: -- `backspace` -- `tab` -- `return` -- `enter` -- `escape` -- `left` -- `right` -- `up` -- `down` -- `space` -- `delete` -- `home` -- `end` -- `page up` -- `page down` -- `f1` -- `f2` -- `f3` -- `f4` -- `f5` -- `f6` -- `f7` -- `f8` -- `f9` -- `f10` -- `f11` -- `f12` -- `f13` -- `f14` -- `f15` -- `f16` -- `f17` -- `f18` -- `f19` -- `f20` -- `f21` -- `f22` -- `f23` -- `f24` -- `f25` -- `f26` -- `f27` -- `f28` -- `f29` -- `f30` -- `f31` -- `f32` -- `f33` -- `f34` -- `f35` -- `numlock` +| | | | | +|:-----------:|:-----:|:-----:|:---------:| +| `backspace` | `f1` | `f16` | `f31` | +| `tab` | `f2` | `f17` | `f32` | +| `return` | `f3` | `f18` | `f33` | +| `enter` | `f4` | `f19` | `f34` | +| `escape` | `f5` | `f20` | `f35` | +| `left` | `f6` | `f21` | `numlock` | +| `right` | `f7` | `f22` | | +| `up` | `f8` | `f23` | | +| `down` | `f9` | `f24` | | +| `space` | `f10` | `f25` | | +| `delete` | `f11` | `f36` | | +| `home` | `f12` | `f37` | | +| `end` | `f13` | `f38` | | +| `page up` | `f14` | `f39` | | +| `page down` | `f15` | `f30` | | Wails also supports parsing accelerators using the same syntax as Electron. This is useful for storing accelerators in config files. @@ -254,10 +220,12 @@ The function is given a `CallbackData` struct which indicates which menu item tr :::info Roles + Roles are currently supported on Mac only. ::: + A menu item may have a role, which is essentially a pre-defined menu item. We currently support the following roles: | Role | Description | diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/options.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/options.mdx index 797ac7932..87f94aec5 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/options.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/options.mdx @@ -47,6 +47,7 @@ func main() { Windows: &windows.Options{ WebviewIsTransparent: false, WindowIsTranslucent: false, + BackdropType: windows.Mica, DisableWindowIcon: false, DisableFramelessWindowDecorations: false, WebviewUserDataPath: "", @@ -62,6 +63,10 @@ func main() { }, // User messages that can be customised Messages *windows.Messages + // OnSuspend is called when Windows enters low power mode + OnSuspend func() + // OnResume is called when Windows resumes from low power mode + OnResume func() }, Mac: &mac.Options{ TitleBar: &mac.TitleBar{ @@ -96,92 +101,93 @@ func main() { The text shown in the window's title bar. -Type: string +Name: Title
Type: `string` ### Width The initial width of the window. -Name: Width +Name: Width
Type: `int`
Default: 1024. ### Height The initial height of the window. -Type: [AppearanceType](#appearance-type) +Name: Height
Type: `int`
Default: 768 ### DisableResize By default, the main window is resizable. Setting this to `true` will keep it a fixed size. -Type: int +Name: DisableResize
Type: `bool` ### Fullscreen Setting this to `true` will make the window fullscreen at startup. -Type: int +Name: Fullscreen
Type: `bool` ### Frameless When set to `true`, the window will have no borders or title bar. Also see [Frameless Windows](../guides/frameless.mdx). -Type: int +Name: Frameless
Type: `bool` ### MinWidth This sets the minimum width for the window. If the value given in `Width` is less than this value, the window will be set to `MinWidth` by default. -Type: bool +Name: MinWidth
Type: `int` ### MinHeight This sets the minimum height for the window. If the value given in `Height` is less than this value, the window will be set to `MinHeight` by default. -Type: bool +Name: MinHeight
Type: `int` ### MaxWidth This sets the maximum width for the window. If the value given in `Width` is more than this value, the window will be set to `MaxWidth` by default. -Type: bool +Name: MaxWidth
Type: `int` ### MaxHeight This sets the maximum height for the window. If the value given in `Height` is more than this value, the window will be set to `MaxHeight` by default. -Type: bool +Name: MaxHeight
Type: `int` ### StartHidden When set to `true`, the application will be hidden until [WindowShow](../reference/runtime/window.mdx#windowshow) is called. -Type: int +Name: StartHidden
Type: `bool` + ### HideWindowOnClose By default, closing the window will close the application. Setting this to `true` means closing the window will hide the window instead. hide the window instead. -Type: int +Name: HideWindowOnClose
Type: `bool` ### BackgroundColour This value is the default background colour of the window. Default: white -Type: *options.RGBA Example: options.NewRGBA(255,0,0,128) - Red at 50% transparency +Name: BackgroundColour
Type: `*options.RGBA`
Default: white ### AlwaysOnTop Indicates that the window should stay above other windows when losing focus. -Type: int +Name: AlwaysOnTop
Type: `bool` ### Assets The frontend assets to be used by the application. Requires an `index.html` file. -Name: StartHidden +Name: Assets
Type: `embed.FS` ### AssetsHandler @@ -208,51 +214,57 @@ NOTE: Linux is currently very limited due to targeting a WebKit2GTK Version < 2. NOTE: When used in combination with a Frontend DevServer there might be limitations, eg. Vite serves the index.html on every path, that does not contain a file extension. -Type: http.Handler +Name: AssetsHandler
Type: `http.Handler` ### Menu The menu to be used by the application. More details about Menus in the [Menu Reference](../reference/runtime/menu.mdx). -NOTE: On Mac, if no menu is specified, a default menu will be created. ::: +:::note -Type: \*menu.Menu + +On Mac, if no menu is specified, a default menu will be created. + +::: + + +Name: Menu
Type: `*menu.Menu` ### Logger The logger to be used by the application. More details about logging in the [Log Reference](../reference/runtime/log.mdx). -Type: bool +Name: Logger
Type: `logger.Logger`
Default: Logs to Stdout ### LogLevel The default log level. More details about logging in the [Log Reference](../reference/runtime/log.mdx). -Name: Assets +Name: LogLevel
Type: `logger.LogLevel`
Default: `Info` in dev mode, `Error` in production mode ### LogLevelProduction The default log level for production builds. More details about logging in the [Log Reference](../reference/runtime/log.mdx). -Type: logger.LogLevel +Name: LogLevelProduction
Type: `logger.LogLevel`
Default: `Error` ### OnStartup This callback is called after the frontend has been created, but before `index.html` has been loaded. It is given the application context. -Name: AssetsHandler +Name: OnStartup
Type: `func(ctx context.Context)` ### OnDomReady This callback is called after the frontend has loaded `index.html` and its resources. It is given the application context. -Name: AssetsHandler +Name: OnDomReady
Type: `func(ctx context.Context)` ### OnShutdown This callback is called after the frontend has been destroyed, just before the application terminates. It is given the application context. -Name: AssetsHandler +Name: OnShutdown
Type: `func(ctx context.Context)` ### OnBeforeClose @@ -275,7 +287,7 @@ func (b *App) beforeClose(ctx context.Context) (prevent bool) { } ``` -Type: func(ctx context.Context) bool +Name: OnBeforeClose
Type: `func(ctx context.Context) bool` ### WindowStartState @@ -287,77 +299,89 @@ Defines how the window should present itself at startup. | Maximised | ✅ | ✅ | ✅ | | Minimised | ✅ | ❌ | ✅ | -Name: Logger +Name: WindowStartState
Type: `options.WindowStartState` ### CSSDragProperty Indicates the CSS property to use to identify which elements can be used to drag the window. Default: `--wails-draggable`. -Type: string +Name: CSSDragProperty
Type: `string` ### CSSDragValue Indicates what value the `CSSDragProperty` style should have to drag the window. Default: `drag`. -Type: string +Name: CSSDragValue
Type: `string` ### Bind A slice of struct instances defining methods that need to be bound to the frontend. -Default: Logger to Stdout +Name: Bind
Type: `[]interface{}` ### Windows -This defines [Windows specific options](#windows-specific-options). +This defines [Windows specific options](#windows). -Name: LogLevel +Name: Windows
Type: `*windows.Options` -### Mac - -This defines [Mac specific options](#mac-specific-options). - -Default: `Info` in dev mode, `Error` in production mode - -### Linux - -This defines [Linux specific options](#linux-specific-options). - -Name: LogLevelProduction - -## Windows Specific Options - -### WebviewIsTransparent +#### WebviewIsTransparent Setting this to `true` will make the webview background transparent when an alpha value of `0` is used. This means that if you use `rgba(0,0,0,0)` for `background-color` in your CSS, the host window will show through. Often combined with [WindowIsTranslucent](#WindowIsTranslucent) to make frosty-looking applications. -Type: int +Name: WebviewIsTransparent
Type: `bool` -### WindowIsTranslucent +#### WindowIsTranslucent -Setting this to `true` will make the window background translucent. Often combined with [WebviewIsTransparent](#WebviewIsTransparent) to make frosty-looking applications. +Setting this to `true` will make the window background translucent. Often combined with [WebviewIsTransparent](#WebviewIsTransparent). -Type: int +For Windows 11 versions before build 22621, this will use the [BlurBehind](https://learn.microsoft.com/en-us/windows/win32/dwm/blur-ovw) method for translucency, which can be slow. For Windows 11 versions after build 22621, this will enable the newer translucency types that are much faster. By default, the type of translucency used will be determined by Windows. To configure this, use the [BackdropType](#BackdropType) option. -### DisableWindowIcon +Name: WindowIsTranslucent
Type: `bool` + +#### BackdropType + +:::note + + +Requires Windows 11 build 22621 or later. + +::: + + +Sets the translucency type of the window. This is only applicable if [WindowIsTranslucent](#WindowIsTranslucent) is set to `true`. + +Name: BackdropType
Type `windows.BackdropType` + +The value can be one of the following: + +| Value | Description | +| ------- | ----------------------------------------------------------------------------------------- | +| Auto | Let Windows decide which backdrop to use | +| None | Do not use translucency | +| Acrylic | Use [Acrylic](https://learn.microsoft.com/en-us/windows/apps/design/style/acrylic) effect | +| Mica | Use [Mica](https://learn.microsoft.com/en-us/windows/apps/design/style/mica) effect | +| Tabbed | Use Tabbed. This is a backdrop that is similar to Mica. | + +#### DisableWindowIcon Setting this to `true` will remove the icon in the top left corner of the title bar. -Type: int +Name: DisableWindowIcon
Type: `bool` -### DisableFramelessWindowDecorations +#### DisableFramelessWindowDecorations Setting this to `true` will remove the window decorations in [Frameless](#Frameless) mode. This means there will be no 'Aero Shadow' and no 'Rounded Corners' shown for the window. Please note that 'Rounded Corners' are only supported on Windows 11. -Type: int +Name: DisableFramelessWindowDecorations
Type: `bool` -### WebviewUserDataPath +#### WebviewUserDataPath This defines the path where the WebView2 stores the user data. If empty `%APPDATA%\[BinaryName.exe]` will be used. -Type: string +Name: WebviewUserDataPath
Type: `string` -### WebviewBrowserPath +#### WebviewBrowserPath This defines the path to a directory with WebView2 executable files and libraries. If empty, webview2 installed in the system will be used. @@ -367,9 +391,9 @@ Important information about distribution of fixed version runtime: - [Known issues for fixed version](https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution#known-issues-for-fixed-version) - [The path of fixed version of the WebView2 Runtime should not contain \Edge\Application\.](https://docs.microsoft.com/en-us/microsoft-edge/webview2/reference/win32/webview2-idl?view=webview2-1.0.1245.22#createcorewebview2environmentwithoptions) -Type: string +Name: WebviewBrowserPath
Type: `string` -### Theme +#### Theme Minimum Windows Version: Windows 10 2004/20H1 @@ -381,17 +405,23 @@ This defines the theme that the application should use: | Dark | The application will use a dark theme exclusively | | Light | The application will use a light theme exclusively | -Type: `windows.Theme` +Name: Theme
Type: `windows.Theme` -### CustomTheme +#### CustomTheme + +:::note + + +Minimum Windows Version: Windows 10/11 2009/21H2 Build 22000 + +::: -Name: WindowStartState Allows you to specify custom colours for TitleBar, TitleText and Border for both light and dark mode, as well as when the window is active or inactive. -Type: `windows.CustomTheme` +Name: CustomTheme
Type: `windows.CustomTheme` -#### Name: CustomTheme +##### CustomTheme type The CustomTheme struct uses `int32` to specify the colour values. These are in the standard(!) Windows format of: `0x00BBGGAA`. A helper function is provided to do RGB conversions into this format: `windows.RGB(r,g,b uint8)`. @@ -435,67 +465,45 @@ Example: }, ``` -### Messages +#### Messages A struct of strings used by the webview2 installer if a valid webview2 runtime is not found. -Type: `*windows.Messages` +Name: Messages
Type: `*windows.Messages` Customise this for any language you choose to support. -### ResizeDebounceMS +#### ResizeDebounceMS ResizeDebounceMS is the amount of time to debounce redraws of webview2 when resizing the window. The default value (0) will perform redraws as fast as it can. -Type: \*mac.Options +Name: ResizeDebounceMS
Type: `uint16` -### OnSuspend +#### OnSuspend -If set, this function will be called when windows initiates a switch to low power mode (suspend/hibernate) +If set, this function will be called when Windows initiates a switch to low power mode (suspend/hibernate) -Name: Linux +Name: OnSuspend
Type: `func()` -### OnResume +#### OnResume -If set, this function will be called when windows resumes from low power mode (suspend/hibernate) +If set, this function will be called when Windows resumes from low power mode (suspend/hibernate) -Name: Linux +Name: OnResume
Type: `func()` -## Mac Specific Options +### Mac -### TitleBar +This defines [Mac specific options](#mac). + +Name: Mac
Type: `*mac.Options` + +#### TitleBar The TitleBar struct provides the ability to configure the look and feel of the title bar. -Type: bool +Name: TitleBar
Type: [`*mac.TitleBar`](#titlebar-struct) - -### Appearance - -Appearance is used to set the style of your app in accordance with Apple's [NSAppearance](https://developer.apple.com/documentation/appkit/nsappearancename?language=objc) names. - -Name: WindowIsTranslucent - -### WebviewIsTransparent - -Setting this to `true` will make the webview background transparent when an alpha value of `0` is used. This means that if you use `rgba(0,0,0,0)` for `background-color` in your CSS, the host window will show through. Often combined with [WindowIsTranslucent](#WindowIsTranslucent) to make frosty-looking applications. - -Type: int - -### WindowIsTranslucent - -Setting this to `true` will make the window background translucent. Often combined with [WebviewIsTransparent](#WebviewIsTransparent) to make frosty-looking applications. - -Type: int - -### About - -This configuration lets you set the title, message and icon for the "About" menu item in the app menu created by the "AppMenu" role. - -Name: DisableFramelessWindowDecorations - - -#### Titlebar struct +##### Titlebar struct The titlebar of the application can be customised by using the TitleBar options: @@ -537,7 +545,13 @@ Mac: &mac.Options{ Click [here](https://github.com/lukakerr/NSWindowStyles) for some inspiration on customising the titlebar. -#### Appearance type +#### Appearance + +Appearance is used to set the style of your app in accordance with Apple's [NSAppearance](https://developer.apple.com/documentation/appkit/nsappearancename?language=objc) names. + +Name: Appearance
Type: [`mac.AppearanceType`](#appearance-type) + +##### Appearance type You can specify the application's [appearance](https://developer.apple.com/documentation/appkit/nsappearance?language=objc). @@ -560,9 +574,28 @@ Mac: &mac.Options{ } ``` -#### About struct +#### WebviewIsTransparent + +Setting this to `true` will make the webview background transparent when an alpha value of `0` is used. This means that if you use `rgba(0,0,0,0)` for `background-color` in your CSS, the host window will show through. Often combined with [WindowIsTranslucent](#WindowIsTranslucent) to make frosty-looking applications. + +Name: WebviewIsTransparent
Type: `bool` + +#### WindowIsTranslucent + +Setting this to `true` will make the window background translucent. Often combined with [WebviewIsTransparent](#WebviewIsTransparent) to make frosty-looking applications. + +Name: WindowIsTranslucent
Type: `bool` + +#### About + +This configuration lets you set the title, message and icon for the "About" menu item in the app menu created by the "AppMenu" role. + +Name: About
Type: [`*mac.AboutInfo`](#about-struct) + +##### About struct ```go + type AboutInfo struct { Title string Message string @@ -591,17 +624,19 @@ func main() { The "About" menu item will appear in the app menu: +```mdx-code-block
-
+``` When clicked, that will open an about message box: +```mdx-code-block
-
+``` -## Linux Specific Options +### Linux -### Icon +This defines [Linux specific options](#linux). + +Name: Linux
Type: `*linux.Options` + +#### Icon Sets up the icon representing the window. This icon is used when the window is minimized (also known as iconified). -Type: []byte +Name: Icon
Type: `[]byte` Some window managers or desktop environments may also place it in the window frame, or display it in other contexts. On others, the icon is not used at all, so your mileage may vary. diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/project-config.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/project-config.mdx index 3dc1cf002..cc9d01aa6 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/project-config.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/project-config.mdx @@ -13,11 +13,11 @@ The project config resides in the `wails.json` file in the project directory. Th "reloaddirs": "[Additional directories to trigger reloads (comma separated), this is only used for some advanced asset configurations]", "frontend:install": "[The command to install node dependencies, run in the frontend directory - often `npm install`]", "frontend:build": "[The command to build the assets, run in the frontend directory - often `npm run build`]", - "frontend:dev": "[This command has been replaced by frontend:dev:build. If frontend:dev:build is not specified will falls back to this command. If this command is also not specified will falls back to frontend:build]", + "frontend:dev": "[This command has been replaced by frontend:dev:build. If frontend:dev:build is not specified will falls back to this command. \nIf this command is also not specified will falls back to frontend:build]", "frontend:dev:build": "[This command is the dev equivalent of frontend:build. If not specified falls back to frontend:dev]", "frontend:dev:install": "[This command is the dev equivalent of frontend:install. If not specified falls back to frontend:install]", "frontend:dev:watcher": "[This command is run in a separate process on `wails dev`. Useful for 3rd party watchers or starting 3d party dev servers]", - "frontend:dev:serverUrl": "[URL to a 3rd party dev server to be used to serve assets, EG Vite. If this is set to 'auto' then the devServerUrl will be inferred from the Vite output]", + "frontend:dev:serverUrl": "[URL to a 3rd party dev server to be used to serve assets, EG Vite. \nIf this is set to 'auto' then the devServerUrl will be inferred from the Vite output]", "wailsjsdir": "[Relative path to the directory that the auto-generated JS modules will be created]", "version": "[Project config version]", "outputfilename": "[The name of the binary]", @@ -42,7 +42,9 @@ The project config resides in the `wails.json` file in the project directory. Th "copyright": "[The copyright of the product. Default: 'Copyright.........']", "comments": "[A short comment of the app. Default: 'Built using Wails (https://wails.app)']" }, - "nsisType": "['multiple': One installer per architecture. 'single': Single universal installer for all architectures being built. Default: 'multiple']" + "nsisType": "['multiple': One installer per architecture. 'single': Single universal installer for all architectures being built. Default: 'multiple']", + "obfuscated": "[Whether the app should be obfuscated. Default: false]", + "garbleargs": "[The arguments to pass to the garble command when using the obfuscated flag]" } ``` diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/runtime/browser.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/runtime/browser.mdx index 976ca1d80..c71ec4a3a 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/runtime/browser.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/runtime/browser.mdx @@ -11,4 +11,3 @@ These methods are related to the system browser. Opens the given URL in the system browser. Go: `BrowserOpenURL(ctx context.Context, url string)`
JS: `BrowserOpenURL(url string)` - diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/runtime/dialog.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/runtime/dialog.mdx index bf1dd7246..d2aa9ab6a 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/runtime/dialog.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/runtime/dialog.mdx @@ -7,9 +7,13 @@ sidebar_position: 5 This part of the runtime provides access to native dialogs, such as File Selectors and Message boxes. :::info Javascript - Dialog is currently unsupported in the JS runtime. + + +Dialog is currently unsupported in the JS runtime. + ::: + ### OpenDirectoryDialog Opens a dialog that prompts the user to select a directory. Can be customised using [OpenDialogOptions](#opendialogoptions). @@ -148,15 +152,16 @@ selection, err := runtime.MessageDialog(b.ctx, runtime.MessageDialogOptions{ the first button is shown as default: +```mdx-code-block
-
+``` And if we specify `DefaultButton` to be "two": @@ -171,15 +176,16 @@ selection, err := runtime.MessageDialog(b.ctx, runtime.MessageDialogOptions{ the second button is shown as default. When `return` is pressed, the value "two" is returned. +```mdx-code-block
-
+``` If we now specify `CancelButton` to be "three": @@ -195,17 +201,18 @@ selection, err := runtime.MessageDialog(b.ctx, runtime.MessageDialogOptions{ the button with "three" is shown at the bottom of the dialog. When `escape` is pressed, the value "three" is returned: +```mdx-code-block
-


+``` #### DialogType @@ -231,33 +238,35 @@ type FileFilter struct { Windows allows you to use multiple file filters in dialog boxes. Each FileFilter will show up as a separate entry in the dialog: +```mdx-code-block
-


+``` #### Linux Linux allows you to use multiple file filters in dialog boxes. Each FileFilter will show up as a separate entry in the dialog: +```mdx-code-block
-


+``` #### Mac diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/runtime/events.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/runtime/events.mdx index 75e8b0a50..48d27f996 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/runtime/events.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/runtime/events.mdx @@ -14,7 +14,7 @@ Go: `EventsOn(ctx context.Context, eventName string, callback func(optionalData ### EventsOff -This method unregisters the listener for the given event name, optionally multiple listeneres can be unregistered via `additionalEventNames`. +このメソッドは、指定されたイベント名のイベントリスナー設定を解除します。引数の`additionalEventNames`を使用することで、複数のリスナーを一度に解除できます。 Go: `EventsOff(ctx context.Context, eventName string, additionalEventNames ...string)`
JS: `EventsOff(eventName string, ...additionalEventNames)` @@ -35,4 +35,3 @@ Go: `EventsOnMultiple(ctx context.Context, eventName string, callback func(optio This method emits the given event. Optional data may be passed with the event. This will trigger any event listeners. Go: `EventsEmit(ctx context.Context, eventName string, optionalData ...interface{})`
JS: `EventsEmit(ctx context, optionalData function(optionalData?: any))` - diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/runtime/intro.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/runtime/intro.mdx index 6c02c71cd..9cbe28096 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/runtime/intro.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/runtime/intro.mdx @@ -6,7 +6,7 @@ sidebar_position: 1 The runtime is a library that provides utility methods for your application. There is both a Go and Javascript runtime and the aim is to try and keep them at parity where possible. -It has utility methods for: +ユーティリティメソッドには次のようなものがあります: - [Window](window.mdx) - [Menu](menu.mdx) @@ -19,10 +19,12 @@ The Go Runtime is available through importing `github.com/wailsapp/wails/v2/pkg/ :::info Note + Whilst the context will be provided to the [OnStartup](../options.mdx#onstartup) method, there's no guarantee the runtime will work in this method as the window is initialising in a different thread. If you wish to call runtime methods at startup, use [OnDomReady](../options.mdx#ondomready). ::: + The Javascript library is available to the frontend via the `window.runtime` map. There is a runtime package generated when using `dev` mode that provides Typescript declarations for the runtime. This should be located in the `wailsjs` directory in your frontend directory. ### Hide @@ -31,13 +33,25 @@ Go: `Hide(ctx context.Context)`
JS: `Hide()` Hides the application. -:::info Note On Mac, this will hide the application in the same way as the `Hide` menu item in standard Mac applications. This is different to hiding the window, but the application still being in the foreground. For Windows and Linux, this is currently the same as `WindowHide`. ::: +:::info Note + + +Macでこのメソッドを使用すると、標準のMacアプリケーションにおけるメニュー項目の`Hide`と同じ方法で、アプリケーションが非表示になります。 This is different to hiding the window, but the application still being in the foreground. For Windows and Linux, this is currently the same as `WindowHide`. + +::: + ### Show Shows the application. -:::info Note On Mac, this will bring the application back into the foreground. For Windows and Linux, this is currently the same as `WindowShow`. ::: +:::info Note + + +Macでこのメソッドを使用すると、アプリケーションがフォアグラウンドに戻ります。 For Windows and Linux, this is currently the same as `WindowShow`. + +::: + Go: `Show(ctx context.Context)`
JS: `Show()` @@ -56,6 +70,7 @@ Go: `Environment(ctx context.Context) EnvironmentInfo`
JS: `Environment(): #### EnvironmentInfo Go: + ```go type EnvironmentInfo struct { BuildType string @@ -63,11 +78,13 @@ type EnvironmentInfo struct { Arch string } ``` + JS: + ```ts interface EnvironmentInfo { - buildType: string; - platform: string; - arch: string; + buildType: string; + platform: string; + arch: string; } ``` diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/runtime/menu.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/runtime/menu.mdx index 226ff2c68..68feb7a3f 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/runtime/menu.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/runtime/menu.mdx @@ -7,9 +7,13 @@ sidebar_position: 6 These methods are related to the application menu. :::info Javascript - Menu is currently unsupported in the JS runtime. + + +Menu is currently unsupported in the JS runtime. + ::: + ### MenuSetApplicationMenu Sets the application menu to the given [menu](../menus.mdx). diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/runtime/window.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/runtime/window.mdx index d33db2cbf..6bc4099cb 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/runtime/window.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/reference/runtime/window.mdx @@ -28,7 +28,7 @@ Go: `WindowUnfullscreen(ctx context.Context)`
JS: `WindowUnfullscreen()` Returns true if the window is full screen. -Go: `WindowCenter(ctx context.Context)`
JS: `WindowCenter()` +Go: `WindowIsFullscreen(ctx context.Context) bool`
JS: `WindowIsFullscreen() bool` ### WindowCenter @@ -88,7 +88,7 @@ Go: `WindowSetSize(ctx context.Context, width int, height int)`
JS: `Window Returns true if the window not minimised, maximised or fullscreen. -Go: `WindowGetSize(ctx context.Context) (width int, height int)`
JS: `WindowGetSize() : Size` +Go: `WindowIsNormal(ctx context.Context) bool`
JS: `WindowIsNormal() bool` ### WindowSetSize @@ -152,7 +152,7 @@ Go: `WindowMinimise(ctx context.Context)`
JS: `WindowMinimise()` Returns true if the window is maximised. -Go: `WindowUnminimise(ctx context.Context)`
JS: `WindowUnminimise()` +Go: `WindowIsMaximised(ctx context.Context) bool`
JS: `WindowIsMaximised() bool` ### WindowToggleMaximise @@ -176,7 +176,7 @@ Go: `WindowUnminimise(ctx context.Context)`
JS: `WindowUnminimise()` Returns true if the window is minimised. -Go: `WindowIsMinimised(ctx context.Context) bool` JS: `WindowIsMinimised() bool` +Go: `WindowIsMinimised(ctx context.Context) bool`
JS: `WindowIsMinimised() bool` ### WindowSetBackgroundColour @@ -184,7 +184,13 @@ Sets the background colour of the window to the given RGBA colour definition. Th Valid values for R, G, B and A are 0-255. -Any value that is not 0 will be considered 255. Any value that is not 0 will be considered 255. ::: +:::info Windows + + +On Windows, only alpha values of 0 or 255 are supported. Any value that is not 0 will be considered 255. + +::: + Go: `WindowSetBackgroundColour(ctx context.Context, R, G, B, A uint8)`
JS: `WindowSetBackgroundColour(R, G, B, A)` diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/tutorials/dogsapi.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/current/tutorials/dogsapi.mdx index f4845fdbe..0910a4060 100644 --- a/website/i18n/ja/docusaurus-plugin-content-docs/current/tutorials/dogsapi.mdx +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/tutorials/dogsapi.mdx @@ -4,6 +4,7 @@ sidebar_position: 20 # Dogs API +```mdx-code-block
-
+``` + +:::note + + +This tutorial has been kindly provided by [@tatadan](https://twitter.com/tatadan) and forms part of their [Wails Examples Repository](https://github.com/tataDan/wails-v2-examples). + +::: -:::note This tutorial has been kindly provided by [@tatadan](https://twitter.com/tatadan) and forms part of their [Wails Examples Repository](https://github.com/tataDan/wails-v2-examples). ::: In this tutorial we are going to develop an application that retrieves photos of dogs from the web and then displays them. @@ -146,6 +153,7 @@ import ( Add the following lines to `frontend/src/App.svelte`: + ```html - - -``` - -For some projects, using a CSS variable may not be possible due to dynamic styling. In this case, you can use the `CSSDragProperty` and `CSSDragValue` application options to define a property and value that will be used to indicate draggable regions: - -```go title=main.go -package main - -import ( - "embed" - - "github.com/wailsapp/wails/v2" - "github.com/wailsapp/wails/v2/pkg/options" -) - -//go:embed all:frontend/dist -var assets embed.FS - -func main() { - // Create an instance of the app structure - app := NewApp() - - // Create application with options - err := wails.Run(&options.App{ - Title: "alwaysontop", - Width: 1024, - Height: 768, - Assets: assets, - Frameless: true, - CSSDragProperty: "widows", - CSSDragValue: "1", - Bind: []interface{}{ - app, - }, - }) - - if err != nil { - println("Error:", err) - } -} -``` - -```html title=index.html - - - - - - alwaysontop - - -
- - - - -``` - -:::info Fullscreen -If you allow your application to go fullscreen, this drag functionality will be disabled. -::: diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/frontend.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/frontend.mdx deleted file mode 100644 index ac087ee45..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/frontend.mdx +++ /dev/null @@ -1,72 +0,0 @@ -# Frontend - -## Script Injection - -When Wails serves your `index.html`, by default, it will inject 2 script entries into the `` tag to load `/wails/ipc.js` and `/wails/runtime.js`. These files install the bindings and runtime respectively. - -The code below shows where these are injected by default: - -```html - - - injection example - - - - - - - -
Please enter your name below 👇
-
- - -
- - - - -``` - -### Overriding Default Script Injection - -To provide more flexibility to developers, there is a meta tag that may be used to customise this behaviour: - -```html - -``` - -The options are as follows: - -| Value | Description | -| ------------------- | ------------------------------------------------ | -| noautoinjectruntime | Disable the autoinjection of `/wails/runtime.js` | -| noautoinjectipc | Disable the autoinjection of `/wails/ipc.js` | -| noautoinject | Disable all autoinjection of scripts | - -Multiple options may be used provided they are comma seperated. - -This code is perfectly valid and operates the same as the autoinjection version: - -```html - - - injection example - - - - - - -
Please enter your name below 👇
-
- - -
- - - - - - -``` diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/ides.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/ides.mdx deleted file mode 100644 index 5423ea495..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/ides.mdx +++ /dev/null @@ -1,125 +0,0 @@ -# IDEs - -Wails aims to provide a great development experience. To that aim, we now support generating IDE specific configuration to provide smoother project setup. - -Currently, we support [Visual Studio Code](https://code.visualstudio.com/) but aim to support other IDEs such as Goland. - -## Visual Studio Code - -

- -

- -When generating a project using the `-ide vscode` flags, IDE files will be created alongside the other project files. These files are placed into the `.vscode` directory and provide the correct configuration for debugging your application. - -The 2 files generated are `tasks.json` and `launch.json`. Below are the files generated for the default vanilla project: - -```json title="tasks.json" -{ - "version": "2.0.0", - "tasks": [ - { - "label": "build", - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "command": "go", - "args": [ - "build", - "-tags", - "dev", - "-gcflags", - "all=-N -l", - "-o", - "build/bin/myproject.exe" - ] - } - ] -} -``` - -```json title="launch.json" -{ - "version": "0.2.0", - "configurations": [ - { - "name": "Wails: Debug myproject", - "type": "go", - "request": "launch", - "mode": "exec", - "program": "${workspaceFolder}/build/bin/myproject.exe", - "preLaunchTask": "build", - "cwd": "${workspaceFolder}", - "env": {} - } - ] -} -``` - -### Configuring the install and build steps - -The `tasks.json` file is simple for the default project as there is no `npm install` or `npm run build` step needed. For projects that have a frontend build step, such as the svelte template, we would need to edit `tasks.json` to add the install and build steps: - -```json title="tasks.json" -{ - "version": "2.0.0", - "tasks": [ - { - "label": "npm install", - "type": "npm", - "script": "install", - "options": { - "cwd": "${workspaceFolder}/frontend" - }, - "presentation": { - "clear": true, - "panel": "shared", - "showReuseMessage": false - }, - "problemMatcher": [] - }, - { - "label": "npm run build", - "type": "npm", - "script": "build", - "options": { - "cwd": "${workspaceFolder}/frontend" - }, - "presentation": { - "clear": true, - "panel": "shared", - "showReuseMessage": false - }, - "problemMatcher": [] - }, - { - "label": "build", - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "command": "go", - "args": [ - "build", - "-tags", - "dev", - "-gcflags", - "all=-N -l", - "-o", - "build/bin/vscode.exe" - ], - "dependsOn": ["npm install", "npm run build"] - } - ] -} -``` - -:::info Future Enhancement - -In the future, we hope to generate a `tasks.json` that includes the install and build steps automatically. - -::: diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/linux-distro-support.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/linux-distro-support.mdx deleted file mode 100644 index 28a224a26..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/linux-distro-support.mdx +++ /dev/null @@ -1,101 +0,0 @@ -# Linux Distro Support - -## Overview - -Wails offers Linux support but providing installation instructions for all available distributions is an impossible task. Instead, Wails tries to determine if the packages you need to develop applications are available via your system's package manager. Currently, we support the following package managers: - -- apt -- dnf -- emerge -- eopkg -- nixpkgs -- pacman -- zypper - -## Adding package names - -There may be circumstances where your distro uses one of the supported package managers but the package name is different. For example, you may use an Ubuntu derivative, but the package name for gtk may be different. Wails attempts to find the correct package by iterating through a list of package names. The list of packages are stored in the packagemanager specific file in the `v2/internal/system/packagemanager` directory. In our example, this would be `v2/internal/system/packagemanager/apt.go`. - -In this file, the list of packages are defined by the `Packages()` method: - -```go -func (a *Apt) Packages() packagemap { - return packagemap{ - "libgtk-3": []*Package{ - {Name: "libgtk-3-dev", SystemPackage: true, Library: true}, - }, - "libwebkit": []*Package{ - {Name: "libwebkit2gtk-4.0-dev", SystemPackage: true, Library: true}, - }, - "gcc": []*Package{ - {Name: "build-essential", SystemPackage: true}, - }, - "pkg-config": []*Package{ - {Name: "pkg-config", SystemPackage: true}, - }, - "npm": []*Package{ - {Name: "npm", SystemPackage: true}, - }, - "docker": []*Package{ - {Name: "docker.io", SystemPackage: true, Optional: true}, - }, - } -} -``` - -Let's assume that in our linux distro, `libgtk-3` is packaged under the name `lib-gtk3-dev`. We could add support for this by adding the following line: - -```go {5} -func (a *Apt) Packages() packagemap { - return packagemap{ - "libgtk-3": []*Package{ - {Name: "libgtk-3-dev", SystemPackage: true, Library: true}, - {Name: "lib-gtk3-dev", SystemPackage: true, Library: true}, - }, - "libwebkit": []*Package{ - {Name: "libwebkit2gtk-4.0-dev", SystemPackage: true, Library: true}, - }, - "gcc": []*Package{ - {Name: "build-essential", SystemPackage: true}, - }, - "pkg-config": []*Package{ - {Name: "pkg-config", SystemPackage: true}, - }, - "npm": []*Package{ - {Name: "npm", SystemPackage: true}, - }, - "docker": []*Package{ - {Name: "docker.io", SystemPackage: true, Optional: true}, - }, - } -} -``` - -## Adding new package managers - -To add a new package manager, perform the following steps: - -- Create a new file in `v2/internal/system/packagemanager` called `.go`, where `` is the name of the package manager. -- Define a struct that conforms to the package manager interface defined in `pm.go`: - -```go -type PackageManager interface { - Name() string - Packages() packagemap - PackageInstalled(*Package) (bool, error) - PackageAvailable(*Package) (bool, error) - InstallCommand(*Package) string -} -``` - -- `Name()` should return the name of the package manager -- `Packages()` should return a `packagemap`, that provides candidate filenames for dependencies -- `PackageInstalled()` should return `true` if the given package is installed -- `PackageAvailable()` should return `true` if the given package is not installed but available for installation -- `InstallCommand()` should return the exact command to install the given package name - -Take a look at the other package managers code to get an idea how this works. - -:::info Remember -If you add support for a new package manager, don't forget to also update this page! -::: diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/linux.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/linux.mdx deleted file mode 100644 index 229c282bf..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/linux.mdx +++ /dev/null @@ -1,18 +0,0 @@ -# Linux - -This page has miscellaneous guides related to developing Wails applications for Linux. - -## Video tag doesn't fire "ended" event - -When using a video tag, the "ended" event is not fired when the video is finished playing. This is a bug in WebkitGTK, however you can use the following workaround to fix it: - -```js -videoTag.addEventListener("timeupdate", (event) => { - if (event.target.duration - event.target.currentTime < 0.2) { - let ended = new Event("ended"); - event.target.dispatchEvent(ended); - } -}); -``` - -Source: [Lyimmi](https://github.com/Lyimmi) on the [discussions board](https://github.com/wailsapp/wails/issues/1729#issuecomment-1212291275) diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/manual-builds.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/manual-builds.mdx deleted file mode 100644 index dcf192d33..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/manual-builds.mdx +++ /dev/null @@ -1,95 +0,0 @@ -# Manual Builds - -The Wails CLI does a lot of heavy lifting for the project, but sometimes it's desirable to manually build your project. This document will discuss the different operations the CLI does and how this may be achieved in different ways. - -## Build Process - -When either `wails build` or `wails dev` are used, the Wails CLI performs a common build process: - - - Install frontend dependencies - - Build frontend project - - Generate build assets - - Compile application - - [optional] Compress application - -### Install frontend dependencies - -#### CLI Steps - -- If the `-s` flag is given, this step is skipped -- Checks `wails.json` to see if there is an install command in the key `frontend:install` -- If there isn't, it skips this step -- If there is, it checks if `package.json` exists in the frontend directory. If it doesn't exist, it skips this step -- An MD5 sum is generated from the `package.json` file contents -- It checks for the existence of `package.json.md5` and if it exists, will compare the contents of it (an MD5 sum) with the one generated to see if the contents have changed. If they are the same, this step is skipped -- If `package.json.md5` does not exist, it creates it using the generated MD5 sum -- If a build is now required, or `node_modules` does not exist, or the `-f` flag is given, the install command is executed in the frontend directory - -#### Manual Steps - -This step could be done from the command line or a script with `npm install`. - -### Build frontend project - -#### Wails CLI - -- If the `-s` flag is given, this step is skipped -- Checks `wails.json` to see if there is a build command in the key `frontend:build` -- If there isn't, it skips this step -- If there is, it is executed in the frontend directory - -#### Manual Steps - -This step could be done from the command line or a script with `npm run build` or whatever the frontend build script is. - -### Generate assets - -#### Wails CLI - -- If `-nopackage` flag is set, this stage is skipped -- If the `build/appicon.png` file does not exist, a default one is created -- For Windows, see [Bundling for Windows](#windows) -- If `build/windows/icon.ico` does not exist, it will create it from the `build/appicon.png` image. - -##### Windows - -- If `build/windows/icon.ico` does not exist, it will create it from `build/appicon.png` using icon sizes of 256, 128, 64, 48, 32 and 16. This is done using [winicon](https://github.com/leaanthony/winicon). -- If the `build/windows/.manifest` file does not exist, it creates it from a default version. -- Compiles the application as a production build (above) -- Uses [winres](https://github.com/tc-hib/winres) to bundle the icon and manifest into a `.syso` file ready for linking. - -#### Manual Steps - -- Create `icon.ico` using the [winicon](https://github.com/leaanthony/winicon) CLI tool (or any other tool). -- Create / Update a `.manifest` file for your application -- Use the [winres CLI](https://github.com/tc-hib/go-winres) to generate a `.syso` file. - -### Compile application - -#### Wails CLI - -- If the `-clean` flag is provided, the `build` directory is deleted and recreated -- For `wails dev`, the following default Go flags are used: `-tags dev -gcflags "all=-N -l"` -- For `wails build`, the following default Go flags are used: `-tags desktop,production -ldflags "-w -s"` - - On Windows, `-ldflags "-w -h -H windowsgui"` -- Additional tags passed to the CLI using `-tags` are added to the defaults -- Additional ldflags passed to the CLI using `-ldflags` are added to the defaults -- The `-o` flag is passed through -- The Go compiler specified by `-compiler` will be used for compilation - -#### Manual steps - -- For dev build, the minimum command would be: `go build -tags dev -gcflags "all=-N -l"` -- For production build, the minimum command would be: `go build -tags desktop,production -ldflags "-w -s -H windowsgui"` -- Ensure that you compile in the same directory as the `.syso` file - -### Compress application - -#### Wails CLI - -- If the `-upx` flag has been given, the `upx` program will be run to compress the application with the default settings -- If `-upxflags` is also passed, these flags are used instead of the default ones - -#### Manual steps - -- Run `upx [flags]` manually to compress the application. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/migrating.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/migrating.mdx deleted file mode 100644 index 1ad2754a9..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/migrating.mdx +++ /dev/null @@ -1,187 +0,0 @@ -# Migrating from v1 - -## Overview - -Wails v2 is a significant change from v1. This document aims to highlight the changes and the steps in migrating an existing project. - -### Creating the Application - -In v1, the main application is created using `wails.CreateApp`, bindings are added with `app.Bind`, then the application is run using `app.Run()`. - -Example: - -```go title="v1" - app := wails.CreateApp(&wails.AppConfig{ - Title: "MyApp", - Width: 1024, - Height: 768, - JS: js, - CSS: css, - Colour: "#131313", - }) - app.Bind(basic) - app.Run() -``` - -In v2, there is just a single method, `wails.Run()`, that accepts [application options](../reference/options.mdx#application-options). - -```go title="v2" - err := wails.Run(&options.App{ - Title: "MyApp", - Width: 800, - Height: 600, - Assets: assets, - Bind: []interface{}{ - basic, - }, - }) -``` - -### Binding - -In v1, it was possible to bind both arbitrary functions and structs. In v2, this has been simplified to only binding structs. The struct instances that were previously passed to the `Bind()` method in v1, are now specified in the `Bind` field of the [application options](../reference/options.mdx#application-options): - -```go title="v1" - app := wails.CreateApp(/* options */) - app.Bind(basic) -``` - -```go title="v2" - err := wails.Run(&options.App{ - /* other options */ - Bind: []interface{}{ - basic, - }, - }) -``` - -In v1, bound methods were available to the frontend at `window.backend`. This has changed to `window.go`.`` - -### Application Lifecycle - -In v1, there were 2 special methods in a bound struct: `WailsInit()` and `WailsShutdown()`. These have been replaced with 3 lifecycle hooks as part of the [application options](../reference/options.mdx#application-options): - -- [OnStartup](../reference/options.mdx#onstartup) -- [OnShutdown](../reference/options.mdx#onshutdown) -- [OnDomReady](../reference/options.mdx#ondomready) - -Note: [OnDomReady](../reference/options.mdx#ondomready) replaces the `wails:ready` system event in v1. - -These methods can be standard functions, but a common practice is to have them part of a struct: - -```go title="v2" - basic := NewBasicApp() - err := wails.Run(&options.App{ - /* Other Options */ - OnStartup: basic.startup, - OnShutdown: basic.shutdown, - OnDomReady: basic.domready, - }) -... -type Basic struct { - ctx context.Context -} -func (b *Basic) startup(ctx context.Context) { - b.ctx = ctx -} -... -``` - -### Runtime - -The runtime in v2 is much richer than v1 with support for menus, window manipulation and better dialogs. The signature of the methods has changed slightly - please refer the the [Runtime Reference](../reference/runtime/intro.mdx). - -In v1, the [runtime](../reference/runtime/intro.mdx) was available via a struct passed to `WailsInit()`. In v2, the runtime has been moved out to its own package. Each method in the runtime takes the `context.Context` that is passed to the [OnStartup](../reference/options.mdx#onstartup) method. - -```go title="Runtime Example" -package main - -import "github.com/wailsapp/wails/v2/pkg/runtime" - -type Basic struct { - ctx context.Context -} - -// startup is called at application startup -func (a *App) startup(ctx context.Context) { - a.ctx = ctx - runtime.LogInfo(ctx, "Application Startup called!") -} - -``` - -### Assets - -The _biggest_ change in v2 is how assets are handled. - -In v1, assets were passed via 2 application options: - -- `JS` - The application's Javascript -- `CSS` - The application's CSS - -This meant that the responsibility of generating a single JS and CSS file was on the developer. This essentially required the use of complicated packers such as webpack. - -In v2, Wails makes no assumptions about your frontend assets, just like a webserver. All of your application assets are passed to the application options as an `embed.FS`. - -**This means there is no requirement to bundle your assets, encode images as Base64 or attempt the dark art of bundler configuration to use custom fonts**. - -At startup, Wails will scan the given `embed.FS` for `index.html` and use its location as the root path for all the other application assets - just like a webserver would. - -Example: An application has the following project layout. All final assets are placed in the `frontend/dist` directory: - -```shell -. -├── build/ -├── frontend/ -│ └── dist/ -│ ├── index.html -│ ├── main.js -│ ├── main.css -│ └── logo.svg -├── main.go -└── wails.json -``` - -Those assets may be used by the application by simply creating an `embed.FS`: - -```go title="Assets Example" -//go:embed all:frontend/dist -var assets embed.FS - -func main() { - err := wails.Run(&options.App{ - /* Other Options */ - Assets: assets, - }) -} -``` - -Of course, bundlers can be used if you wish to. The only requirement is to pass the final application assets directory to Wails using an `embed.FS` in the `Assets` key of the [application options](../reference/options.mdx#application-options). - -### Project Configuration - -In v1, the project configuration was stored in the `project.json` file in the project root. In v2, the project configuration is stored in the `wails.json` file in the project root. - -The format of the file is slightly different. Here is a comparison: - -

- -| v1 | v2 | Notes | -| ------------------ | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| name | name | | -| description | | Removed | -| author / name | author / name | | -| author / email | author / email | | -| version | version | | -| binaryname | outputfilename | Changed | -| frontend / dir | | Removed | -| frontend / install | frontend:install | Changed | -| frontend / build | frontend:build | Changed | -| frontend / bridge | | Removed | -| frontend / serve | | Removed | -| tags | | Removed | -| | wailsjsdir | The directory to generate wailsjs modules | -| | assetdir | The directory of the compiled frontend assets for `dev` mode. This is normally inferred and could be left empty. | -| | reloaddirs | Comma separated list of additional directories to watch for changes and to trigger reloads in `dev` mode. This is only needed for some more advanced asset configurations. | - -

diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/mouse-buttons.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/mouse-buttons.mdx deleted file mode 100644 index 4a3de2a61..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/mouse-buttons.mdx +++ /dev/null @@ -1,25 +0,0 @@ -# Mouse Buttons - -The Wails runtime intercepts mouse clicks to determine whether a frameless window needs resizing or a window needs to be moved. It has been asked how to detect when a mouse click has occurred, because `window.onclick` doesn't report the mouse buttons correctly. The following code shows how to detect mouse clicks: - -```javascript -window.addEventListener("mousedown", handleMouseButtonDown); - -function handleMouseButtonDown(event) { - if (event.button === 0) { - // left mouse button - } else if (event.button === 1) { - // middle mouse button - } else if (event.button === 2) { - // right mouse button - } else if (event.button === 3) { - // back mouse button - } else if (event.button === 4) { - // forward mouse button - } else { - // other mouse button - } -} -``` - -Reference: https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/overscroll.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/overscroll.mdx deleted file mode 100644 index dca7e83a3..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/overscroll.mdx +++ /dev/null @@ -1,10 +0,0 @@ -# Overscroll - -[Overscroll](https://developer.mozilla.org/en-US/docs/Web/CSS/overscroll-behavior) is the "bounce effect" you sometimes get when you scroll beyond a page's content boundaries. This is common in mobile apps. This can be disabled using CSS: - -```css -html { - height: 100%; - overflow: hidden; -} -``` diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/routing.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/routing.mdx deleted file mode 100644 index c35cc1c8a..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/routing.mdx +++ /dev/null @@ -1,47 +0,0 @@ -# Routing - -Routing is a popular way to switch views in an application. This page offers some guidance around how to do that. - -## Vue - -The recommended approach for routing in Vue is [Hash Mode](https://next.router.vuejs.org/guide/essentials/history-mode.html#hash-mode): - -```js -import { createRouter, createWebHashHistory } from "vue-router"; - -const router = createRouter({ - history: createWebHashHistory(), - routes: [ - //... - ], -}); -``` - -## Angular - -The recommended approach for routing in Angular is [HashLocationStrategy](https://codecraft.tv/courses/angular/routing/routing-strategies#_hashlocationstrategy): - -```ts -RouterModule.forRoot(routes, { useHash: true }); -``` - -## React - -The recommended approach for routing in React is [HashRouter](https://reactrouter.com/docs/en/v6/routers/hash-router): - -```jsx -import { HashRouter } from "react-router-dom"; - -ReactDOM.render( - - {/* The rest of your app goes here */} - - } exact /> - } /> - } /> - {/* more... */} - - , - root -); -``` diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/signing.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/signing.mdx deleted file mode 100644 index e615269dd..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/signing.mdx +++ /dev/null @@ -1,379 +0,0 @@ -# Code Signing - -This is a guide on how you can sign your binaries generated with Wails on MacOS and Windows. The guide will target CI environments, more specifically GitHub Actions. - -## Windows - -First off you need a code signing certificate. If you do not already have one, Microsoft's info page lists some providers [here](https://docs.microsoft.com/en-us/windows-hardware/drivers/dashboard/get-a-code-signing-certificate). Please note that an EV certificate is not required unless you need to write kernel-level software such as device drivers. For signing your Wails app, a standard code signing certificate will do just fine. - -It may be a good idea to check with your certificate provider how to sign your binaries on your local machine before targeting automated build systems, just so you know if there are any special requirements. For instance, [here](https://www.ssl.com/how-to/using-your-code-signing-certificate/) is SSL.com's code signing guide for Windows. If you know how to sign locally, it will be easier to troubleshoot any potential issues in a CI environment. For instance, SSL.com code signing certificates require the `/tr` flag for [SignTool.exe](https://docs.microsoft.com/en-us/windows/win32/seccrypto/signtool) while other providers may only need the `/t` flag for providing the timestamping server. Popular GitHub Actions for signing Windows binaries like [this one](https://github.com/Dana-Prajea/code-sign-action) does not support the `/tr` flag on SignTool.exe. Therefore this guide will focus on signing our app manually with PowerShell commands, but you can use actions like the [code-sign-action](https://github.com/Dana-Prajea/code-sign-action) Action if you prefer. - -First off, let's make sure we are able to build our Wails app in our GitHub CI. Here is a small workflow template: - -```yaml -name: "example" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -- name: Get Wails - run: go install github.com/wailsapp/wails/v2/cmd/wails@latest - - name: Build Wails app - run: | - wails build - - name: upload artifacts macOS - if: matrix.platform == 'macos-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-macos - path: build/bin/* - - name: upload artifacts windows - if: matrix.platform == 'windows-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-windows - path: build/bin/* - jobs: - package: - strategy: - matrix: - platform: [windows-latest, macos-latest] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend manually here, unless you have configured frontend build and install commands in wails.json. -``` - -Next we need to give the GitHub workflow access to our signing certificate. This is done by encoding your .pfx or .p12 certificate into a base64 string. To do this in PowerShell, you can use the following command assuming your certificate is called 'my-cert.p12': - -```PowerShell -certutil -encode .\my-cert.p12 my-cert-base64.txt -``` - -You should now have your .txt file with the base64 encoded certificate. Now you need to make two action secrets on GitHub. It should start with _-----BEGIN CERTIFICATE-----_ and end with _-----END CERTIFICATE-----_. Navigate to _Settings -> Secrets -> Actions_ and create the two following secrets: - -- **WIN_SIGNING_CERT** with the contents of your base64 encoded certificate text. -- **WIN_SIGNING_CERT_PASSWORD** with the contents of your certificate password. - -Now we're ready to implement the signing in our workflow using one of the two methods: - -### Method 1: signing with commands - -This method uses PowerShell commands to sign our app, and leaves you control over the entire signing process. - -After the `"Build Wails app"` step, we can add the following step to our workflow: - -```yaml -- name: Sign Windows binaries - if: matrix.platform == 'windows-latest' - run: | - echo "Creating certificate file" - New-Item -ItemType directory -Path certificate - Set-Content -Path certificate\certificate.txt -Value '${{ secrets.WIN_SIGNING_CERT }}' - certutil -decode certificate\certificate.txt certificate\certificate.pfx - echo "Signing our binaries" - & 'C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe' sign /fd /t /f certificate\certificate.pfx /p '${{ secrets.WIN_SIGNING_CERT_PASSWORD }}' - -``` - -This script creates a new directory for your certificate file, creates the certificate file from our base64 secret, converts it to a .pfx file, and finally signs the binary. The following variables needs to be replaced in the last line: - -- **signing algorithm**: usually sha256. -- **timestamping server**: URL to the timestamping server to use with your certificate. -- **path to binary**: path to the binary you want to sign. - -Given that our Wails config has `outputfilename` set to "app.exe" and that we have a certificate from SSL.com, this would be our workflow: - -```yaml -name: "example" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -jobs: - package: - strategy: - matrix: - platform: [windows-latest, macos-latest] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend here, unless you have configured frontend build and install commands in wails.json. - - name: Get Wails - run: go install github.com/wailsapp/wails/v2/cmd/wails@latest - - name: Build Wails app - run: | - wails build - - name: Sign Windows binaries - if: matrix.platform == 'windows-latest' - run: | - echo "Creating certificate file" - New-Item -ItemType directory -Path certificate - Set-Content -Path certificate\certificate.txt -Value '${{ secrets.WIN_SIGNING_CERT }}' - certutil -decode certificate\certificate.txt certificate\certificate.pfx - echo "Signing our binaries" - & 'C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe' sign /fd sha256 /tr http://ts.ssl.com /f certificate\certificate.pfx /p '${{ secrets.WIN_SIGNING_CERT_PASSWORD }}' .\build\bin\app.exe - - - name: upload artifacts macOS - if: matrix.platform == 'macos-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-macos - path: build/bin/* - - name: upload artifacts windows - if: matrix.platform == 'windows-latest' - uses: actions/upload-artifact@v2 - with: - name: wails-binaries-windows - path: build/bin/* -``` - -### Method 2: automatically signing with Action - -It is possible to use a Windows code signing Action like [this](https://github.com/marketplace/actions/code-sign-a-file-with-pfx-certificate) one, but note it requires a SHA1 hash for the certificate and a certificate name. View an example of how to configure it on the Action's [marketplace](https://github.com/marketplace/actions/code-sign-a-file-with-pfx-certificate). - ---- - -## MacOS - -First off you need your code signing certificate from Apple. If you do not have one, a simple Google search will help you acquire one. Once you have your certificate, you need to export it and encode it to base64. [This tutorial](https://localazy.com/blog/how-to-automatically-sign-macos-apps-using-github-actions) shows you how to do that in an easy manner. Once you have exported your .p12 certificate file, you can encode it to base64 as seen in the tutorial with the following command: - -```bash -base64 Certificates.p12 | pbcopy -``` - -Now you're ready to create some GitHub project secrets, just as with Windows: - -- **APPLE_DEVELOPER_CERTIFICATE_P12_BASE64** with the contents of your newly copied base64 certificate. -- **APPLE_DEVELOPER_CERTIFICATE_PASSWORD** with the contents of your certificate password. -- **APPLE_PASSWORD** with the contents of an App-Specific password to your Apple-ID account which you can generate [here](https://appleid.apple.com/account/manage). - -Let's make sure we are able to build our Wails app in our GitHub Action workflow. Here is a small template: - -```yaml -name: "example" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -jobs: - package: - strategy: - matrix: - platform: [windows-latest, macos-latest] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend here, unless you have configured frontend build and install commands in wails.json. - jobs: - package: - strategy: - matrix: - platform: [windows-latest, macos-latest] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend manually here, unless you have configured frontend build and install commands in wails.json. -``` - -For code signing on macOS, [gon](https://github.com/mitchellh/gon) is a very handy tool for code signing and communicating with Apple servers, also written in Go, and will be used in this guide. - -After the `Build Wails app` step, add the following to the workflow: - -```yaml -- name: MacOS download gon for code signing and app notarization - if: matrix.platform == 'macos-latest' - run: | - brew install mitchellh/gon/gon -``` - -Now we need to configure some gon config files in our `build/darwin` directory: - -1. gon-sign.json: - -```json -{ - "source": ["./build/bin/app.app"], - "bundle_id": "app.myapp", - "apple_id": { - "username": "my-appleid@email.com", - "password": "@env:APPLE_PASSWORD" - }, - "sign": { - "application_identity": "Developer ID Application: My Name" - } -} -``` - -Where `source` is your Wails binary, `bundle_id` is your bundle ID, `apple_id` contains your Apple ID username and App-Specific password which you created earlier, and `sign.application_identity` is your identity which you can find by running the following command: - -```bash -security find-identity -v -p codesigning -``` - -2. entitlements.plist: - -```plist - - - - - com.apple.security.app-sandbox - - com.apple.security.network.client - - com.apple.security.network.server - - com.apple.security.files.user-selected.read-write - - com.apple.security.files.downloads.read-write - - - -``` - -In this file you configure the entitlements you need for you app, e.g. camera permissions if your app uses the camera. Read more about entitlements [here](https://developer.apple.com/documentation/bundleresources/entitlements). - -Make sure you have updated your `Info.plist` file with the same bundle ID as you entered in `gon-sign.json`. Here's an example `Info.plist` file: - -```plist - - - CFBundlePackageTypeAPPL - CFBundleNameMyApp - CFBundleExecutableapp - CFBundleIdentifierapp.myapp - CFBundleVersion0.1.0 - CFBundleGetInfoStringMy app is cool and nice and chill and - CFBundleShortVersionString0.1.0 - CFBundleIconFileiconfile - LSMinimumSystemVersion10.13.0 - NSHighResolutionCapabletrue - LSApplicationCategoryTypepublic.app-category.utilities - NSHumanReadableCopyright© Me - -``` - -Now we're ready to add the signing step in our workflow after building the Wails app: - -```yaml -- name: Import Code-Signing Certificates for macOS - if: matrix.platform == 'macos-latest' - uses: Apple-Actions/import-codesign-certs@v1 - with: - # The certificates in a PKCS12 file encoded as a base64 string - p12-file-base64: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_P12_BASE64 }} - # The password used to import the PKCS12 file. - p12-password: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_PASSWORD }} -- name: Sign our macOS binary - if: matrix.platform == 'macos-latest' - run: | - echo "Signing Package" - gon -log-level=info ./build/darwin/gon-sign.json -``` - -Please note that signing binaries with Apple could take anywhere from minutes to hours. - -## Combined workflow file: - -Here is our GitHub workflow file with Windows + macOS combined: - -```yaml -name: "example combined" -on: - workflow_dispatch: - # This Action only starts when you go to Actions and manually run the workflow. - -jobs: - package: - strategy: - matrix: - platform: [windows-latest, macos-latest] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend here, unless you have configured frontend build and install commands in wails.json. - jobs: - package: - strategy: - matrix: - platform: [windows-latest, macos-latest] - go-version: [1.18] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - # You may need to manually build you frontend here, unless you have configured frontend build and install commands in wails.json. - - name: Get Wails - run: go install github.com/wailsapp/wails/v2/cmd/wails@latest - - name: Build Wails app - run: | - wails build - - name: MacOS download gon for code signing and app notarization - if: matrix.platform == 'macos-latest' - run: | - brew install mitchellh/gon/gon - - name: Import Code-Signing Certificates for macOS - if: matrix.platform == 'macos-latest' - uses: Apple-Actions/import-codesign-certs@v1 - with: - # The certificates in a PKCS12 file encoded as a base64 string - p12-file-base64: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_P12_BASE64 }} - # The password used to import the PKCS12 file. -``` - -# End notes - -This guide inspired by the RiftShare project and its workflow, which is highly recommended to check out [here](https://github.com/achhabra2/riftshare/blob/main/.github/workflows/build.yaml). diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/templates.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/templates.mdx deleted file mode 100644 index df75cbbc7..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/templates.mdx +++ /dev/null @@ -1,95 +0,0 @@ -# Templates - -Wails generates projects from pre-created templates. In v1, this was a difficult to maintain set of projects that were subject to going out of date. In v2, to empower the community, a couple of new features have been added for templates: - -- Ability to generate projects from [Remote Templates](../reference/cli.mdx#remote-templates) -- Tooling to help create your own templates - -## Creating Templates - -To create a template, you can use the `wails generate template` command. To generate a default template, run: - -`wails generate template -name mytemplate` - -This creates the directory "mytemplate" with default files: - -```shell title=mytemplate/ -. -|-- NEXTSTEPS.md -|-- README.md -|-- app.tmpl.go -|-- frontend -| `-- dist -| |-- assets -| | |-- fonts -| | | |-- OFL.txt -| | | `-- nunito-v16-latin-regular.woff2 -| | `-- images -| | `-- logo-dark.svg -| |-- index.html -| |-- main.css -| `-- main.js -|-- go.mod.tmpl -|-- main.tmpl.go -|-- template.json -`-- wails.tmpl.json -``` - -### Template Overview - -The default template consists of the following files and directories: - -| Filename / Dir | Description | -| --------------- | -------------------------------------------- | -| NEXTSTEPS.md | Instructions on how to complete the template | -| README.md | The README published with the template | -| app.tmpl.go | `app.go` template file | -| frontend/ | The directory containing frontend assets | -| go.mod.tmpl | `go.mod` template file | -| main.tmpl.go | `main.go` template file | -| template.json | The template metadata | -| wails.tmpl.json | `wails.json` template file | - -At this point it is advisable to follow the steps in `NEXTSTEPS.md`. - -## Creating a Template from an Existing Project - -It's possible to create a template from an existing frontend project by passing the path to the project when generating the template. We will now walk through how to create a Vue 3 template: - -- Install the vue cli: `npm install -g @vue/cli` -- Create the default project: `vue create vue3-base` - - Select `Default (Vue 3) ([Vue 3] babel, eslint)` -- After the project has been generated, run: - -```shell -> wails generate template -name wails-vue3-template -frontend .\vue3-base\ -Extracting base template files... -Migrating existing project files to frontend directory... -Updating package.json data... -Renaming package.json -> package.tmpl.json... -Updating package-lock.json data... -Renaming package-lock.json -> package-lock.tmpl.json... -``` - -- The template may now be customised as specified in the `NEXTSTEPS.md` file -- Once the files are ready, it can be tested by running: `wails init -n my-vue3-project -t .\wails-vue3-template\` -- To test the new project, run: `cd my-vue3-project` then `wails build` -- Once the project has compiled, run it: `.\build\bin\my-vue3-project.exe` -- You should have a fully functioning Vue3 application: - -
- -
- -## Publishing Templates - -Publishing a template is simply pushing the files to GitHub. The following best practice is encouraged: - -- Remove any unwanted files and directories (such as `.git`) from your frontend directory -- Ensure that `template.json` is complete, especially `helpurl` -- Push the files to GitHub -- Create a PR on the [Community Templates](../community/templates.mdx) page -- Announce the template on the [Template Announcement](https://github.com/wailsapp/wails/discussions/825) discussion board diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/troubleshooting.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/troubleshooting.mdx deleted file mode 100644 index 3e16071fd..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/troubleshooting.mdx +++ /dev/null @@ -1,142 +0,0 @@ -# Troubleshooting - -An assortment of troubleshooting tips. - -## The `wails` command appears to be missing? - -If your system is reporting that the `wails` command is missing, make sure you have followed the Go installation guide correctly. Normally, it means that the `go/bin` directory in your User's home directory is not in the `PATH` environment variable. You will also normally need to close and reopen any open command prompts so that changes to the environment made by the installer are reflected at the command prompt. - -## My application is displaying a white/blank screen - -Check that your application includes the assets from the correct directory. In your `main.go` file, you will have something similar to the following code: - -```go -//go:embed all:frontend/dist -var assets embed.FS -``` - -Check that `frontend/dist` contains your application assets. - -### Mac - -If this happens on Mac, try adding the following to your `Info.plist`: - -```xml -NSAppTransportSecurity - - NSAllowsLocalNetworking - - -``` - -Reference: https://github.com/wailsapp/wails/issues/1504#issuecomment-1174317433 - -## Mac application not valid - -If your built application looks like this in finder: - -

- -

- -it's likely that your application's `info.plist` is invalid. Update the file in `build/.app/Contents/info.plist` and check if the data is valid, EG check the binary name is correct. To persist the changes, copy the file back to the `build/darwin` directory. - -## Cannot call backend method from frontend with variadic arguments - -If you have a backend method defined with variadic parameters, eg: - -```go -func (a *App) TestFunc(msg string, args ...interface{}) error { - // Code -} -``` - -calling this method from the frontend like this will fail: - -```js -var msg = "Hello: "; -var args = ["Go", "JS"]; -window.go.main.App.TestFunc(msg, ...args) - .then((result) => { - //do things here - }) - .catch((error) => { - //handle error - }); -``` - -Workaround: - -```js -var msg = "Hello "; -var args = ["Go", "JS"]; -window.go.main.App.TestFunc(msg, args) - .then((result) => { - //without the 3 dots - //do things here - }) - .catch((error) => { - //handle error - }); -``` - -Credit: https://github.com/wailsapp/wails/issues/1186 - -## I'm having getting proxy errors when trying to install Wails - -If you are getting errors like this: - -``` -"https://proxy.golang.org/github.com/wailsapp/wails/cmd/wails/@v/list": dial tcp 172.217.163.49:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. -``` - -it's probably because the official Go Proxy is being blocked (Users in China have reported this). The solution is to set up the proxy manually, eg: - -``` -go env -w GO111MODULE=on -go env -w GOPROXY=https://goproxy.cn,direct -``` - -Source: https://github.com/wailsapp/wails/issues/1233 - -## The generated Typescript doesn't have the correct types - -Sometimes the generated Typescript doesn't have the correct types. To mitigate this, it is possible to specify what types should be generated using the `ts_type` struct tag. For more details, please read [this](https://github.com/tkrajina/typescriptify-golang-structs#custom-types). - -## When I navigate away from `index.html`, I am unable to call methods on the frontend - -If you navigate away from `index.html` to a new html file, the context will be lost. This can be fixed by adding the following imports to the `` section of any new page you navigate to: - -```html - - - - -``` - -Source: https://github.com/wailsapp/wails/discussions/1512 - -## I get `too many open files` errors on my Mac when I run `wails dev` - -By default, macOS will only allow you to open a maximum of 256 files. This can affect the `wails dev` command. This limit can be increased by running: `ulimit -n 1024` in the terminal. - -FSNotify is [looking to move to Apple's fsevents](https://github.com/fsnotify/fsnotify/issues/11) for Mac. If this isn't completed soon, we will create our own implementation, tracked [here](https://github.com/wailsapp/wails/issues/1733). - -## My Mac app gives me weird compilation errors - -A few users have reported seeing compilation errors such as the following: - -```shell -# github.com/wailsapp/wails/v2/internal/frontend/desktop/darwin -In file included from ../../pkg/mod/github.com/wailsapp/wails/v2@v2.0.0-beta.44.2/internal/frontend/desktop/darwin/callbacks.go:9: -In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:12: -/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSBundle.h:91:143: error: function does not return NSString -- (NSAttributedString *)localizedAttributedStringForKey:(NSString *)key value:(nullable NSString *)value table:(nullable NSString *)tableName NS_FORMAT_ARGUMENT(1) NS_REFINED_FOR_SWIFT API_AVAILABLE(macos(12.0), ios(15.0), watchos(8.0), tvos(15.0)); - ~~~~~~~~~~~~~~ ^ ~ -/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:103:48: note: expanded from macro 'NS_FORMAT_ARGUMENT' - #define NS_FORMAT_ARGUMENT(A) __attribute__ ((format_arg(A))) -``` - -This is *normally* due to a mismatch with the OS version you are running and the version of the XCode Command Line Tools installed. If you see an error like this, try upgrading your XCode Command Line Tools to the latest version. - -Source: https://github.com/wailsapp/wails/issues/1806 \ No newline at end of file diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/vscode.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/vscode.mdx deleted file mode 100644 index ed258656d..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/vscode.mdx +++ /dev/null @@ -1,82 +0,0 @@ - -# Visual Studio Code - -This page is for miscellaneous tips and tricks when using Visual Studio Code with Wails. - -## Vetur Configuration - -Many thanks to [@Lyimmi](https://github.com/Lyimmi) for this tip. Originally posted [here](https://github.com/wailsapp/wails/issues/1791#issuecomment-1228158349). - -Vetur is a popular plugin for Visual Studio Code that provides syntax highlighting and code completion for Vue projects. When loading a Wails project in VSCode, Vetur will throw an error as it is expecting to find the frontend project in the root directory. To fix this, you can do the following: - -Create a file named `vetur.config.js` in the project's root. - -```javascript -// vetur.config.js -/** @type {import('vls').VeturConfig} */ -module.exports = { - // **optional** default: `{}` - // override vscode settings - // Notice: It only affects the settings used by Vetur. - settings: { - "vetur.useWorkspaceDependencies": true, - "vetur.experimental.templateInterpolationService": true - }, - // **optional** default: `[{ root: './' }]` - // support monorepos - projects: [ - { - // **required** - // Where is your project? - // It is relative to `vetur.config.js`. - // root: './packages/repo1', - root: './frontend', - // **optional** default: `'package.json'` - // Where is `package.json` in the project? - // We use it to determine the version of vue. - // It is relative to root property. - package: './package.json', - // **optional** - // Where is TypeScript config file in the project? - // It is relative to root property. - tsconfig: './tsconfig.json', - // **optional** default: `'./.vscode/vetur/snippets'` - // Where is vetur custom snippets folders? - snippetFolder: './.vscode/vetur/snippets', - // **optional** default: `[]` - // Register globally Vue component glob. - // If you set it, you can get completion by that components. - // It is relative to root property. - // Notice: It won't actually do it. You need to use `require.context` or `Vue.component` - globalComponents: [ - './src/components/**/*.vue' - ] - } - ] -} -``` - -Next, configure `frontend/tsconfig.json`: - -```javascript -{ - "compilerOptions": { - "module": "system", - "noImplicitAny": true, - "removeComments": true, - "preserveConstEnums": true, - "sourceMap": true, - "outFile": "../../built/local/tsc.js", - "allowJs": true - }, - "exclude": [ - "node_modules", - "**/*.spec.ts" - ], - "include": [ - "src/**/*", - "wailsjs/**/*.ts" - ] -} -``` -This should enable you to now use Vetur as expected. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/windows-installer.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/windows-installer.mdx deleted file mode 100644 index 21de9a408..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/windows-installer.mdx +++ /dev/null @@ -1,56 +0,0 @@ -# NSIS installer - -

- -
-

- -Wails supports generating Windows installers using the [NSIS installer](https://nsis.sourceforge.io/). - -## Installing NSIS - -### Windows - -The installer is available on the [NSIS Download](https://nsis.sourceforge.io/Download) page. - -If you use the chocolatey package manager, run the following script: - -``` -choco install nsis -``` - -If you install NSIS manually, you need to add the _Bin_ folder, which contains `makensis.exe`, in your NSIS installation to your path. [Here](https://www.architectryan.com/2018/03/17/add-to-the-path-on-windows-10/) is a good tutorial on how to add to path on Windows. - -### Linux - -The `nsis` package should be available through your distribution's package manager. - -### MacOS - -NSIS is available to install through homebrew: `brew install nsis`. - -## Generating the installer - -When a new project is created, Wails generates the NSIS configuration files in `build/windows/installer`. The config data is read from `installer/info.json` and that is configured to use the project's `wails.json` Info section: - -```json -// ... - "Info": { - "companyName": "My Company Name", - "productName": "Wails Vite", - "productVersion": "1.0.0", - "copyright": "Copyright.........", - "comments": "Built using Wails (https://wails.io)" - }, -``` - -To generate an installer for your application, use the `-nsis` flag with `wails build`: - -``` -wails build -nsis -``` - -The installer will now be available in the `build/bin` directory. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/windows.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/windows.mdx deleted file mode 100644 index 821808c0b..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/guides/windows.mdx +++ /dev/null @@ -1,61 +0,0 @@ -# Windows - -This page has miscellaneous guides related to developing Wails applications for Windows. - -## Handling the WebView2 Runtime Dependency - -Wails applications built for Windows have a runtime requirement on the Microsoft [WebView2 Runtime](https://developer.microsoft.com/en-us/microsoft-edge/webview2/). Windows 11 will have this installed by default, but some machines won't. Wails offers an easy approach to dealing with this dependency. - -By using the `-webview2` flag when building, you can decide what your application will do when a suitable runtime is not detected (including if the installed runtime is too old). The four options are: - -1. Download -2. Embed -3. Browser -4. Error - -### Download - -This option will prompt the user that no suitable runtime has been found and then offer to download and run the official bootstrapper from Microsoft's WebView2 site. If the user proceeds, the official bootstrapper will be downloaded and run. - -### Embed - -This option embeds the official bootstrapper within the application. If no suitable runtime has been found, the application will offer to run the bootstrapper. This adds ~150k to the binary size. - -### Browser - -This option will prompt the user that no suitable runtime has been found and then offer to open a browser to the official WebView2 page where the bootstrapper can be downloaded and installed. The application will then exit, leaving the installation up to the user. - -### Error - -If no suitable runtime is found, an error is given to the user and no further action taken. - -## Fixed version runtime - -Another way of dealing with webview2 dependency is shipping it yourself. You can download [fixed version runtime](https://developer.microsoft.com/microsoft-edge/webview2/#download-section) and bundle or download it with your application. - -Also, you should specify path to fixed version of webview2 runtime in the `windows.Options` structure when launching wails. - -```go - wails.Run(&options.App{ - Windows: &windows.Options{ - WebviewBrowserPath: "", - }, - }) -``` - -Note: When `WebviewBrowserPath` is specified, `error` strategy will be forced in case of minimal required version mismatch or invalid path to a runtime. - -## Spawning other programs - -When spawning other programs, such as scripts, you will see the window appear on the screen. To hide the window, you can use the following code: - -```go -cmd := exec.Command("your_script.exe") -cmd.SysProcAttr = &syscall.SysProcAttr{ - HideWindow: true, - CreationFlags: 0x08000000, -} -cmd.Start() -``` - -Solution provided by [sithembiso](https://github.com/sithembiso) on the [discussions board](https://github.com/wailsapp/wails/discussions/1734#discussioncomment-3386172). diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/howdoesitwork.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/howdoesitwork.mdx deleted file mode 100644 index bb1046dfc..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/howdoesitwork.mdx +++ /dev/null @@ -1,355 +0,0 @@ ---- -sidebar_position: 20 ---- - -# How does it work? - -A Wails application is a standard Go application, with a webkit frontend. The Go part of the application consists of the application code and a runtime library that provides a number of useful operations, like controlling the application window. The frontend is a webkit window that will display the frontend assets. Also available to the frontend is a Javascript version of the runtime library. Finally, it is possible to bind Go methods to the frontend, and these will appear as Javascript methods that can be called, just as if they were local Javascript methods. - -
- -
- -## The Main Application - -### Overview - -The main application consists of a single call to `wails.Run()`. It accepts the application configuration which describes the size of the application window, the window title, what assets to use, etc. A basic application might look like this: - -```go title="main.go" -package main - -import ( - "embed" - "log" - - "github.com/wailsapp/wails/v2" - "github.com/wailsapp/wails/v2/pkg/options" -) - -//go:embed all:frontend/dist -var assets embed.FS - -func main() { - - app := &App{} - - err := wails.Run(&options.App{ - Title: "Basic Demo", - Width: 1024, - Height: 768, - Assets: &assets, - OnStartup: app.startup, - OnShutdown: app.shutdown, - Bind: []interface{}{ - app, - }, - }) - if err != nil { - log.Fatal(err) - } -} - - -type App struct { - ctx context.Context -} - -func (b *App) startup(ctx context.Context) { - b.ctx = ctx -} - -func (b *App) shutdown(ctx context.Context) {} - -func (b *App) Greet(name string) string { - return fmt.Sprintf("Hello %s!", name) -} -``` - -### Options rundown - -This example has the following options set: - -- `Title` - The text that should appear in the window's title bar -- `Width` & `Height` - The dimensions of the window -- `Assets` - The application's frontend assets -- `OnStartup` - A callback for when the window is created and is about to start loading the frontend assets -- `OnShutdown` - A callback for when the application is about to quit -- `Bind` - A slice of struct instances that we wish to expose to the frontend - -A full list of application options can be found in the [Options Reference](reference/options). - -#### Assets - -The `Assets` option is mandatory as you can't have a Wails application without frontend assets. Those assets can be any files you would expect to find in a web application - html, js, css, svg, png, etc. **There is no requirement to generate asset bundles** - plain files will do. When the application starts, it will attempt to load `index.html` from your assets and the frontend will essentially work as a browser from that point on. It is worth noting that there is no requirement on where in the `embed.FS` the files live. It is likely that the embed path uses a nested directory relative to your main application code, such as `frontend/dist`: - -```go title="main.go" -//go:embed all:frontend/dist -var assets embed.FS -``` - -At startup, Wails will iterate the embedded files looking for the directory containing `index.html`. All other assets will be loaded relative to this directory. - -As production binaries use the files contained in `embed.FS`, there are no external files required to be shipped with the application. - -When running in development mode using the `wails dev` command, the assets are loaded off disk, and any changes result in a "live reload". The location of the assets will be inferred from the `embed.FS`. - -More details can be found in the [Application Development Guide](guides/application-development.mdx). - -#### Application Lifecycle Callbacks - -Just before the frontend is about to load `index.html`, a callback is made to the function provided in [OnStartup](reference/options.mdx#onstartup). A standard Go context is passed to this method. This context is required when calling the runtime so a standard pattern is to save a reference to in this method. Just before the application shuts down, the [OnShutdown](reference/options.mdx#onshutdown) callback is called in the same way, again with the context. There is also an [OnDomReady](reference/options.mdx#ondomready) callback for when the frontend has completed loading all assets in `index.html` and is equivalent of the [`body onload`](https://www.w3schools.com/jsref/event_onload.asp) event in Javascript. It is also possible to hook into the window close (or application quit) event by setting the option [OnBeforeClose](reference/options.mdx#onbeforeclose). - -#### Method Binding - -The `Bind` option is one of the most important options in a Wails application. It specifies which struct methods to expose to the frontend. Think of structs like "controllers" in a traditional web application. When the application starts, it examines the struct instances listed in the `Bind` field in the options, determines which methods are public (starts with an uppercase letter) and will generate Javascript versions of those methods that can be called by the frontend code. - -:::info Note - -Wails requires that you pass in an _instance_ of the struct for it to bind it correctly - -::: - -In this example, we create a new `App` instance and then add this instance to the `Bind` option in `wails.Run`: - -```go {16,24} title="main.go" -package main - -import ( - "embed" - "log" - - "github.com/wailsapp/wails/v2" - "github.com/wailsapp/wails/v2/pkg/options" -) - -//go:embed all:frontend/dist -var assets embed.FS - -func main() { - - app := &App{} - - err := wails.Run(&options.App{ - Title: "Basic Demo", - Width: 1024, - Height: 768, - Assets: &assets, - Bind: []interface{}{ - app, - }, - }) - if err != nil { - log.Fatal(err) - } -} - - -type App struct { - ctx context.Context -} - -func (a *App) Greet(name string) string { - return fmt.Sprintf("Hello %s!", name) -} -``` - -You may bind as many structs as you like. Just make sure you create an instance of it and pass it in `Bind`: - -```go {8-10} - //... - err := wails.Run(&options.App{ - Title: "Basic Demo", - Width: 1024, - Height: 768, - Assets: &assets, - Bind: []interface{}{ - app, - &mystruct1{}, - &mystruct2{}, - }, - }) - -``` - -When you run `wails dev` (or `wails generate module`), a frontend module will be generated containing the following: - -- Javascript bindings for all bound methods -- Typescript declarations for all bound methods -- Typescript definitions for all Go structs used as inputs or outputs by the bound methods - -This makes it incredibly simple to call Go code from the frontend, using the same strongly typed datastructures. - -## The Frontend - -### Overview - -The frontend is a collection of files rendered by webkit. It's like a browser and webserver in one. There is virtually[^1] no limit to which frameworks or libraries you can use. The main points of interaction between the frontend and your Go code are: - -- Calling bound Go methods -- Calling runtime methods - -### Calling bound Go methods - -When you run your application with `wails dev`, it will automatically generate Javascript bindings for your structs in a directory called `wailsjs/go` (You can also do this by running `wails generate module`). The generated files mirror the package names in your application. In the example above, we bind `app`, which has one public method `Greet`. This will lead to the generation of the following files: - -```bash -wailsjs - └─go - └─main - ├─App.d.ts - └─App.js -``` - -Here we can see that there is a `main` package that contains the Javascript bindings for the bound `App` struct, as well as the Typescript declaration file for those methods. To call `Greet` from our frontend, we simply import the method and call it like a regular Javascript function: - -```javascript -// ... -import { Greet } from "../wailsjs/go/main/App"; - -function doGreeting(name) { - Greet(name).then((result) => { - // Do something with result - }); -} -``` - -The Typescript declaration file gives you the correct types for the bound methods: - -```ts -export function Greet(arg1: string): Promise; -``` - -The generated methods return a Promise. A successful call will result in the first return value from the Go call to be passed to the `resolve` handler. An unsuccessful call is when a Go method that has an error type as it's second return value, passes an error instance back to the caller. This is passed back via the `reject` handler. In the example above, `Greet` only returns a `string` so the Javascript call will never reject - unless invalid data is passed to it. - -All data types are correctly translated between Go and Javascript. Even structs. If you return a struct from a Go call, it will be returned to your frontend as a Javascript class. Note: If you wish to use structs, you **must** define `json` struct tags for your fields! - -:::info Note -Anonymous nested structs are not supported at this time. -::: - -It is possible to send structs back to Go. Any Javascript map/class passed as an argument that is expecting a struct, will be converted to that struct type. To make this process a lot easier, in `dev` mode, a TypeScript module is generated, defining all the struct types used in bound methods. Using this module, it's possible to construct and send native Javascript objects to the Go code. - -There is also support for Go methods that use structs in their signature. All Go structs specified by a bound method (either as parameters or return types) will have Typescript versions auto generated as part of the Go code wrapper module. Using these, it's possible to share the same data model between Go and Javascript. - -Example: We update our `Greet` method to accept a `Person` instead of a string: - -```go title="main.go" -type Person struct { - Name string `json:"name"` - Age uint8 `json:"age"` - Address *Address `json:"address"` -} - -type Address struct { - Street string `json:"street"` - Postcode string `json:"postcode"` -} - -func (a *App) Greet(p Person) string { - return fmt.Sprintf("Hello %s (Age: %d)!", p.Name, p.Age) -} -``` - -The `wailsjs/go/main/App.js` file will still have the following code: - -```js title="App.js" -export function Greet(arg1) { - return window["go"]["main"]["App"]["Greet"](arg1); -} -``` - -But the `wailsjs/go/main/App.d.ts` file will be updated with the following code: - -```ts title="App.d.ts" -import { main } from "../models"; - -export function Greet(arg1: main.Person): Promise; -``` - -As we can see, the "main" namespace is imported from a new "models.ts" file. This file contains all the struct definitions used by our bound methods. In this example, this is a `Person` struct. If we look at `models.ts`, we can see how the models are defined: - -```ts title="models.ts" -export namespace main { - export class Address { - street: string; - postcode: string; - - static createFrom(source: any = {}) { - return new Address(source); - } - - constructor(source: any = {}) { - if ("string" === typeof source) source = JSON.parse(source); - this.street = source["street"]; - this.postcode = source["postcode"]; - } - } - export class Person { - name: string; - age: number; - address?: Address; - - static createFrom(source: any = {}) { - return new Person(source); - } - - constructor(source: any = {}) { - if ("string" === typeof source) source = JSON.parse(source); - this.name = source["name"]; - this.age = source["age"]; - this.address = this.convertValues(source["address"], Address); - } - - convertValues(a: any, classs: any, asMap: boolean = false): any { - if (!a) { - return a; - } - if (a.slice) { - return (a as any[]).map((elem) => this.convertValues(elem, classs)); - } else if ("object" === typeof a) { - if (asMap) { - for (const key of Object.keys(a)) { - a[key] = new classs(a[key]); - } - return a; - } - return new classs(a); - } - return a; - } - } -} -``` - -So long as you have TypeScript as part of your frontend build configuration, you can use these models in the following way: - -```js title="mycode.js" -import { Greet } from "../wailsjs/go/main/App"; -import { main } from "../wailsjs/go/models"; - -function generate() { - let person = new main.Person(); - person.name = "Peter"; - person.age = 27; - Greet(person).then((result) => { - console.log(result); - }); -} -``` - -The combination of generated bindings and TypeScript models makes for a powerful development environment. - -More information on Binding can be found in the [Binding Methods](guides/application-development.mdx#binding-methods) section of the [Application Development Guide](guides/application-development.mdx). - -### Calling runtime methods - -The Javascript runtime is located at `window.runtime` and contains many methods to do various tasks such as emit an event or perform logging operations: - -```js title="mycode.js" -window.runtime.EventsEmit("my-event", 1); -``` - -More details about the JS runtime can be found in the [Runtime Reference](reference/runtime/intro). - -[^1]: There is a very small subset of libraries that use features unsupported in WebViews. There are often alternatives and workarounds for such cases. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/introduction.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/introduction.mdx deleted file mode 100644 index 4e65f932e..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/introduction.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 소개 - -Wails는 Go 및 웹 기술을 사용하여 데스크톱 앱을 작성할 수 있는 프로젝트입니다. - -Consider it a lightweight and fast Electron alternative for Go. You can easily build applications with the flexibility and power of Go, combined with a rich, modern frontend. - -### 기능 - -- Native Menus, Dialogs, Theming and Translucency -- Windows, macOS and linux support -- Built in templates for Svelte, React, Preact, Vue, Lit and Vanilla JS -- Easily call Go methods from Javascript -- Automatic Go struct to Typescript model generation -- No CGO or external DLLs required on Windows -- Live development mode using the power of [Vite](https://vite.net/) -- Powerful CLI to easily Create, Build and Package applications -- A rich [runtime library](/docs/next/reference/runtime) -- Applications built with Wails are Apple & Microsoft Store compliant - - -[varly](https://varly.app)는 Wails를 사용하여 작성된 MacOS & Windows용 데스크톱 애플리케이션입니다. 보기 좋을 뿐만 아니라 최신 네이티브 앱에서 바라는 기본 메뉴 구성과 반투명도를 사용합니다. - -

- - - -

- -### 빠른 시작 템플릿 - -Wails에는 애플리케이션을 빠르게 구성하고 실행할 수 있도록 미리 구성된 여러 템플릿이 함께 제공됩니다. Svelte, React, Vue, Preact, Lit, Vanilla와 같은 프레임워크 템플릿들이 있으며, 각 템플릿에는 Javascript와 Typescript 버전이 있습니다. - -### Native Elements - -Wails uses a purpose built library for handling native elements such as Window, Menus, Dialogs, etc, so you can build good-looking, feature rich desktop applications. - -**It does not embed a browser**, so it is resource efficient. Instead, it uses the native rendering engine for the platform. On Windows, this is the new Microsoft Webview2 library, built on Chromium. - -### Go & Javascript Interoperability - -Wails automatically makes your Go methods available to Javascript, so you can call them by name from your frontend! It even generates Typescript models for the structs used by your Go methods, so you can pass the same data structures between Go and Javascript. - -### Runtime Library - -Wails provides a runtime library, for both Go and Javascript, that handles a lot of the things modern applications need, like Eventing, Logging, Dialogs, etc. - -### Live Development Experience - -#### Automatic Rebuilds - -When you run your application in "dev" mode, Wails will build your application as a native desktop application, but will read your assets from disk. It will detect any changes to your Go code and automatically rebuild and relaunch your application. - -#### Automatic Reloads - -When changes to your application assets are detected, your running application will "reload", reflecting your changes almost immediately. - -#### Develop your application in a Browser - -If you prefer to debug and develop in a browser then Wails has you covered. The running application also has a webserver that will run your application in any browser that connects to it. It will even refresh when your assets change on disk. - -### Production-ready Native Binaries - -When you're ready to do the final build of your application, the CLI will compile it down to a single executable, with all the assets bundled into it. On Windows and MacOS, it is possible to create a native package for distribution. The assets used in packaging (icon, info.plist, manifest file, etc) are part of your project and may be customised, giving you total control over how your applications are built. - -### Tooling - -The Wails CLI provides a hassle-free way to generate, build and bundle your applications. It will do the heavy lifting of creating icons, compiling your application with optimal settings and delivering a distributable, production ready binary. Choose from a number of starter templates to get up and running quickly! diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/_category_.json b/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/_category_.json deleted file mode 100644 index ebb337b83..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Reference", - "position": 40 -} diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/cli.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/cli.mdx deleted file mode 100644 index 5a00db158..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/cli.mdx +++ /dev/null @@ -1,221 +0,0 @@ ---- -sidebar_position: 2 ---- - -# CLI - -The Wails CLI has a number of commands that are used for managing your projects. All commands are run in the following way: - -`wails ` - -## init - -`wails init` is used for generating projects. - -| Flag | Description | Default | -|:------------------ |:----------------------------------------------------------------------------------------------------------------------- |:-------------------:| -| -n "project name" | Name of the project. **Mandatory**. | | -| -d "project dir" | Project directory to create | Name of the project | -| -g | Initialise git repository | | -| -l | List available project templates | | -| -q | Suppress output to console | | -| -t "template name" | The project template to use. This can be the name of a default template or a URL to a remote template hosted on github. | vanilla | -| -ide | Generate IDE project files | | -| -f | Force build application | false | - -Example: `wails init -n test -d mytestproject -g -ide vscode -q` - -This will generate a a project called "test" in the "mytestproject" directory, initialise git, generate vscode project files and do so silently. - -More information on using IDEs with Wails can be found [here](../guides/ides.mdx). - -### Remote Templates - -Remote templates (hosted on GitHub) are supported and can be installed by using the template's project URL. - -Example: `wails init -n test -t https://github.com/leaanthony/testtemplate[@v1.0.0]` - -A list of community maintained templates can be found [here](../community/templates.mdx) - -:::warning Attention - -**The Wails project does not maintain, is not responsible nor liable for 3rd party templates!** - -If you are unsure about a template, inspect `package.json` and `wails.json` for what scripts are run and what packages are installed. - -::: - -## build - -`wails build` is used for compiling your project to a production-ready binary. - -| Flag | Description | Default | -|:-------------------- |:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |:--------------------------------------------------------------------------------------------------------------------------------------------------- | -| -platform | Build for the given (comma delimited) [platforms](../reference/cli.mdx#platforms) eg. `windows/arm64`. Note, if you do not give the architecture, `runtime.GOARCH` is used. | platform = `GOOS` environment variable if given else `runtime.GOOS`.
arch = `GOARCH` envrionment variable if given else `runtime.GOARCH`. | -| -clean | Cleans the `build/bin` directory | | -| -compiler "compiler" | Use a different go compiler to build, eg go1.15beta1 | go | -| -ldflags "flags" | Additional ldflags to pass to the compiler | | -| -nopackage | Do not package application | | -| -o filename | Output filename | | -| -s | Skip building the frontend | false | -| -f | Force build application | false | -| -tags "extra tags" | Build tags to pass to compiler (quoted and space separated) | | -| -upx | Compress final binary using "upx" | | -| -upxflags | Flags to pass to upx | | -| -v int | Verbosity level (0 - silent, 1 - default, 2 - verbose) | 1 | -| -webview2 | WebView2 installer strategy: download,embed,browser,error | download | -| -u | Updates your project's `go.mod` to use the same version of Wails as the CLI | | -| -debug | Retains debug information in the application. Allows the use of the devtools in the application window | false | -| -trimpath | Remove all file system paths from the resulting executable. | false | -| -race | Build with Go's race detector | false | -| -windowsconsole | Keep the console window for Windows builds | false | - -For a detailed description of the `webview2` flag, please refer to the [Windows](../guides/windows.mdx) Guide. - -If you prefer to build using standard Go tooling, please consult the [Manual Builds](../guides/manual-builds.mdx) guide. - -Example: - -`wails build -clean -o myproject.exe` - -:::info UPX on Apple Silicon - -There are [issues](https://github.com/upx/upx/issues/446) with using UPX with Apple Silicon. - -::: - -:::info UPX on Windows - -Some Antivirus vendors false positively mark `upx` compressed binaries as virus, see [issue](https://github.com/upx/upx/issues/437). - -::: - -### Platforms - -Supported platforms are: - -| Platform | Description | -|:---------------- |:--------------------------------------------- | -| darwin | MacOS + architecture of build machine | -| darwin/amd64 | MacOS 10.13+ AMD64 | -| darwin/arm64 | MacOS 11.0+ ARM64 | -| darwin/universal | MacOS AMD64+ARM64 universal application | -| windows | Windows 10/11 + architecture of build machine | -| windows/amd64 | Windows 10/11 AMD64 | -| windows/arm64 | Windows 10/11 ARM64 | -| linux | Linux + architecture of build machine | -| linux/amd64 | Linux AMD64 | -| linux/arm64 | Linux ARM64 | - -## doctor - -`wails doctor` will run diagnostics to ensure that your system is ready for development. - -Example: - -``` -Wails CLI v2.0.0-beta - -Scanning system - Please wait (this may take a long time)...Done. - -System ------- -OS: Windows 10 Pro -Version: 2009 (Build: 19043) -ID: 21H1 -Go Version: go1.17 -Platform: windows -Architecture: amd64 - -Dependency Package Name Status Version ----------- ------------ ------ ------- -WebView2 N/A Installed 93.0.961.52 -npm N/A Installed 6.14.15 -*upx N/A Installed upx 3.96 - -* - Optional Dependency - -Diagnosis ---------- -Your system is ready for Wails development! - -``` - -## dev - -`wails dev` is used to run your application in a "live development" mode. This means: - -- The application's `go.mod` will be updated to use the same version of Wails as the CLI -- The application is compiled and run automatically -- A watcher is started and will trigger a rebuild of your dev app if it detects changes to your go files -- A webserver is started on `http://localhost:34115` which serves your application (not just frontend) over http. This allows you to use your favourite browser development extensions -- All application assets are loaded from disk. If they are changed, the application will automatically reload (not rebuild). All connected browsers will also reload -- A JS module is generated that provides the following: - - Javascript wrappers of your Go methods with autogenerated JSDoc, providing code hinting - - TypeScript versions of your Go structs, that can be constructed and passed to your go methods -- A second JS module is generated that provides a wrapper + TS declaration for the runtime - -| Flag | Description | Default | -|:---------------------------- |:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |:--------------------- | -| -assetdir "./path/to/assets" | Serve assets from the given directory instead of using the provided asset FS | Value in `wails.json` | -| -browser | Opens a browser to `http://localhost:34115` on startup | | -| -compiler "compiler" | Use a different go compiler to build, eg go1.15beta1 | go | -| -e | Extensions to trigger rebuilds (comma separated) | go | -| -reloaddirs | Additional directories to trigger reloads (comma separated) | Value in `wails.json` | -| -ldflags "flags" | Additional ldflags to pass to the compiler | | -| -tags "extra tags" | Build tags to pass to compiler (quoted and space separated) | | -| -loglevel "loglevel" | Loglevel to use - Trace, Debug, Info, Warning, Error | Debug | -| -noreload | Disable automatic reload when assets change | | -| -nogen | Disable generate module | | -| -v | Verbosity level (0 - silent, 1 - standard, 2 - verbose) | 1 | -| -wailsjsdir | The directory to generate the generated Wails JS modules | Value in `wails.json` | -| -debounce | The time to wait for reload after an asset change is detected | 100 (milliseconds) | -| -devserver "host:port" | The address to bind the wails dev server to | "localhost:34115" | -| -frontenddevserverurl "url" | Use 3rd party dev server url to serve assets, EG Vite | "" | -| -appargs "args" | Arguments passed to the application in shell style | | -| -save | Saves the given `assetdir`, `reloaddirs`, `wailsjsdir`, `debounce`, `devserver` and `frontenddevserverurl` flags in `wails.json` to become the defaults for subsequent invocations. | | -| -race | Build with Go's race detector | false | -| -s | Skip building the frontend | false | - -Example: - -`wails dev -assetdir ./frontend/dist -wailsjsdir ./frontend/src -browser` - -This command will do the following: - -- Build the application and run it (more details [here](../guides/manual-builds.mdx) -- Generate the Wails JS modules in `./frontend/src` -- Watch for updates to files in `./frontend/dist` and reload on any change -- Open a browser and connect to the application - -There is more information on using this feature with existing framework scripts [here](../guides/application-development.mdx#live-reloading). - -## generate - -### template - -Wails uses templates for project generation. The `wails generate template` command helps scaffold a template so that it may be used for generating projects. - -| Flag | Description | -|:---------------- |:------------------------------------------- | -| -name | The template name (Mandatory) | -| -frontend "path" | Path to frontend project to use in template | - -For more details on creating templates, consult the [Templates guide](../guides/templates.mdx). - -### module - -The `wails generate module` command allows you to manually generate the `wailsjs` directory for your application. - -## update - -`wails update` will update the version of the Wails CLI. - -| Flag | Description | -|:------------------ |:------------------------------------- | -| -pre | Update to latest pre-release version | -| -version "version" | Install a specific version of the CLI | - -## version - -`wails version` will simply output the current CLI version. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/menus.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/menus.mdx deleted file mode 100644 index 1f849f853..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/menus.mdx +++ /dev/null @@ -1,261 +0,0 @@ ---- -sidebar_position: 4 ---- - -# Menus - -It is possible to add an application menu to Wails projects. This is achieved by defining a [Menu](#menu) struct and setting it in the [`Menu`](../reference/options.mdx#menu) application config, or by calling the runtime method [MenuSetApplicationMenu](../reference/runtime/menu.mdx#menusetapplicationmenu). - -An example of how to create a menu: - -```go - AppMenu := menu.NewMenu() - FileMenu := AppMenu.AddSubmenu("File") - FileMenu.AddText("&Open", keys.CmdOrCtrl("o"), openFile) - FileMenu.AddSeparator() - FileMenu.AddText("Quit", keys.CmdOrCtrl("q"), func(_ *menu.CallbackData) { - runtime.Quit() - }) - - if runtime.GOOS == "darwin" { - AppMenu.Append(menu.EditMenu()) // on macos platform, we should append EditMenu to enable Cmd+C,Cmd+V,Cmd+Z... shortcut - } - - err := wails.Run(&options.App{ - Title: "Menus Demo", - Width: 800, - Height: 600, - Menu: AppMenu, - Bind: []interface{}{ - app, - }, - ) - // ... -``` - -It is also possible to dynamically update the menu, by updating the menu struct and calling [MenuUpdateApplicationMenu](../reference/runtime/menu.mdx#menuupdateapplicationmenu). - -The example above uses helper methods, however it's possible to build the menu structs manually. - -## Menu - -A Menu is a collection of MenuItems: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -type Menu struct { - Items []*MenuItem -} -``` - -For the Application menu, each MenuItem represents a single menu such as "Edit". - -A simple helper method is provided for building menus: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -func NewMenuFromItems(first *MenuItem, rest ...*MenuItem) *Menu -``` - -This makes the layout of the code more like that of a menu without the need to add the menu items manually after creating them. Alternatively, you can just create the menu items and add them to the menu manually. - -## MenuItem - -A MenuItem represents an item within a Menu. - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -// MenuItem represents a menu item contained in a menu -type MenuItem struct { - Label string - Role Role - Accelerator *keys.Accelerator - Type Type - Disabled bool - Hidden bool - Checked bool - SubMenu *Menu - Click Callback -} -``` - -| Field | Type | Notes | -| ----------- | ------------------------------------ | ------------------------------------------------------------- | -| Label | string | The menu text | -| Accelerator | [\*keys.Accelerator](#accelerator) | Key binding for this menu item | -| Type | [Type](#type) | Type of MenuItem | -| Disabled | bool | Disables the menu item | -| Hidden | bool | Hides this menu item | -| Checked | bool | Adds check to item (Checkbox & Radio types) | -| SubMenu | [\*Menu](#menu) | Sets the submenu | -| Click | [Callback](#callback) | Callback function when menu clicked | -| Role | string | Defines a [role](#role) for this menu item. Mac only for now. | - -### Accelerator - -Accelerators (sometimes called keyboard shortcuts) define a binding between a keystroke and a menu item. Wails defines an Accelerator as a combination or key + [Modifier](#modifier). They are available in the `"github.com/wailsapp/wails/v2/pkg/menu/keys"` package. - -Example: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" - // Defines cmd+o on Mac and ctrl-o on Window/Linux - myShortcut := keys.CmdOrCtrl("o") -``` - -Keys are any single character on a keyboard with the exception of `+`, which is defined as `plus`. Some keys cannot be represented as characters so there are a set of named characters that may be used: - -- `backspace` -- `tab` -- `return` -- `enter` -- `escape` -- `left` -- `right` -- `up` -- `down` -- `space` -- `delete` -- `home` -- `end` -- `page up` -- `page down` -- `f1` -- `f2` -- `f3` -- `f4` -- `f5` -- `f6` -- `f7` -- `f8` -- `f9` -- `f10` -- `f11` -- `f12` -- `f13` -- `f14` -- `f15` -- `f16` -- `f17` -- `f18` -- `f19` -- `f20` -- `f21` -- `f22` -- `f23` -- `f24` -- `f25` -- `f26` -- `f27` -- `f28` -- `f29` -- `f30` -- `f31` -- `f32` -- `f33` -- `f34` -- `f35` -- `numlock` - -Wails also supports parsing accelerators using the same syntax as Electron. This is useful for storing accelerators in config files. - -Example: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" - // Defines cmd+o on Mac and ctrl-o on Window/Linux - myShortcut, err := keys.Parse("Ctrl+Option+A") -``` - -#### Modifier - -The following modifiers are keys that may be used in combination with the accelerator key: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" -const ( - // CmdOrCtrlKey represents Command on Mac and Control on other platforms - CmdOrCtrlKey Modifier = "cmdorctrl" - // OptionOrAltKey represents Option on Mac and Alt on other platforms - OptionOrAltKey Modifier = "optionoralt" - // ShiftKey represents the shift key on all systems - ShiftKey Modifier = "shift" - // ControlKey represents the control key on all systems - ControlKey Modifier = "ctrl" -) -``` - -A number of helper methods are available to create Accelerators using modifiers: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" -func CmdOrCtrl(key string) *Accelerator -func OptionOrAlt(key string) *Accelerator -func Shift(key string) *Accelerator -func Control(key string) *Accelerator -``` - -Modifiers can be combined using `keys.Combo(key string, modifier1 Modifier, modifier2 Modifier, rest ...Modifier)`: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu/keys" - // Defines "Ctrl+Option+A" on Mac and "Ctrl+Alt+A" on Window/Linux - myShortcut := keys.Combo("a", ControlKey, OptionOrAltKey) -``` - -### Type - -Each menu item must have a type and there are 5 types available: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -const ( - TextType Type = "Text" - SeparatorType Type = "Separator" - SubmenuType Type = "Submenu" - CheckboxType Type = "Checkbox" - RadioType Type = "Radio" -) -``` - -For convenience, helper methods are provided to quickly create a menu item: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -func Text(label string, accelerator *keys.Accelerator, click Callback) *MenuItem -func Separator() *MenuItem -func Radio(label string, selected bool, accelerator *keys.Accelerator, click Callback) *MenuItem -func Checkbox(label string, checked bool, accelerator *keys.Accelerator, click Callback) *MenuItem -func SubMenu(label string, menu *Menu) *Menu -``` - -You can also create menu items directly on a menu by using the "Add" helpers: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -func (m *Menu) AddText(label string, accelerator *keys.Accelerator, click Callback) *MenuItem -func (m *Menu) AddSeparator() *MenuItem -func (m *Menu) AddRadio(label string, selected bool, accelerator *keys.Accelerator, click Callback) *MenuItem -func (m *Menu) AddCheckbox(label string, checked bool, accelerator *keys.Accelerator, click Callback) *MenuItem -func (m *Menu) AddSubMenu(label string, menu *Menu) *MenuI -``` - -A note on radio groups: A radio group is defined as a number of radio menu items that are next to each other in the menu. This means that you do not need to group items together as it is automatic. However, that also means you cannot have 2 radio groups next to each other - there must be a non-radio item between them. - -### Callback - -Each menu item may have a callback that is executed when the item is clicked: - -```go title="Package: github.com/wailsapp/wails/v2/pkg/menu" -type Callback func(*CallbackData) - -type CallbackData struct { - MenuItem *MenuItem -} -``` - -The function is given a `CallbackData` struct which indicates which menu item triggered the callback. This is useful when using radio groups that may share a callback. - -### Role - -:::info Roles - -Roles are currently supported on Mac only. - -::: - -A menu item may have a role, which is essentially a pre-defined menu item. We currently support the following roles: - -| Role | Description | -| ------------ | ------------------------------------------------------------------------ | -| AppMenuRole | The standard Mac application menu. Can be created using `menu.AppMenu()` | -| EditMenuRole | The standard Mac edit menu. Can be created using `menu.EditMenu()` | diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/options.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/options.mdx deleted file mode 100644 index 7bafbc0fa..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/options.mdx +++ /dev/null @@ -1,633 +0,0 @@ ---- -sidebar_position: 3 ---- - -# Options - -## Application Options - -The `Options.App` struct contains the application configuration. It is passed to the `wails.Run()` method: - -```go title="Example" -import "github.com/wailsapp/wails/v2/pkg/options" - -func main() { - - err := wails.Run(&options.App{ - Title: "Menus Demo", - Width: 800, - Height: 600, - DisableResize: false, - Fullscreen: false, - Frameless: true, - MinWidth: 400, - MinHeight: 400, - MaxWidth: 1280, - MaxHeight: 1024, - StartHidden: false, - HideWindowOnClose: false, - BackgroundColour: &options.RGBA{R: 0, G: 0, B: 0, A: 255}, - AlwaysOnTop: false, - Assets: assets, - AssetsHandler: assetsHandler, - Menu: app.applicationMenu(), - Logger: nil, - LogLevel: logger.DEBUG, - LogLevelProduction: logger.ERROR, - OnStartup: app.startup, - OnDomReady: app.domready, - OnShutdown: app.shutdown, - OnBeforeClose: app.beforeClose, - WindowStartState: options.Maximised, - CSSDragProperty: "--wails-draggable", - CSSDragValue: "drag", - Bind: []interface{}{ - app, - }, - Windows: &windows.Options{ - WebviewIsTransparent: false, - WindowIsTranslucent: false, - DisableWindowIcon: false, - DisableFramelessWindowDecorations: false, - WebviewUserDataPath: "", - WebviewBrowserPath: "", - Theme: windows.SystemDefault, - CustomTheme: &windows.ThemeSettings{ - DarkModeTitleBar: windows.RGB(20, 20, 20), - DarkModeTitleText: windows.RGB(200, 200, 200), - DarkModeBorder: windows.RGB(20, 0, 20), - LightModeTitleBar: windows.RGB(200, 200, 200), - LightModeTitleText: windows.RGB(20, 20, 20), - LightModeBorder: windows.RGB(200, 200, 200), - }, - // User messages that can be customised - Messages *windows.Messages - }, - Mac: &mac.Options{ - TitleBar: &mac.TitleBar{ - TitlebarAppearsTransparent: true, - HideTitle: false, - HideTitleBar: false, - FullSizeContent: false, - UseToolbar: false, - HideToolbarSeparator: true, - }, - Appearance: mac.NSAppearanceNameDarkAqua, - WebviewIsTransparent: true, - WindowIsTranslucent: false, - About: &mac.AboutInfo{ - Title: "My Application", - Message: "© 2021 Me", - Icon: icon, - }, - }, - Linux: &linux.Options{ - Icon: icon, - }, - }) - if err != nil { - log.Fatal(err) - } -} - -``` - -### Title - -The text shown in the window's title bar. - -Type: `string` - -### Width - -The initial width of the window. - -Type: `int`
Default: 1024. - -### Height - -The initial height of the window. - -Type: `int`
Default: 768 - -### DisableResize - -By default, the main window is resizable. Setting this to `true` will keep it a fixed size. - -Type: `bool` - -### Fullscreen - -Setting this to `true` will make the window fullscreen at startup. - -Type: `bool` - -### Frameless - -When set to `true`, the window will have no borders or title bar. Also see [Frameless Windows](../guides/frameless.mdx). - -Type: `bool` - -### MinWidth - -This sets the minimum width for the window. If the value given in `Width` is less than this value, the window will be set to `MinWidth` by default. - -Type: `int` - -### MinHeight - -This sets the minimum height for the window. If the value given in `Height` is less than this value, the window will be set to `MinHeight` by default. - -Type: `int` - -### MaxWidth - -This sets the maximum width for the window. If the value given in `Width` is more than this value, the window will be set to `MaxWidth` by default. - -Type: `int` - -### MaxHeight - -This sets the maximum height for the window. If the value given in `Height` is more than this value, the window will be set to `MaxHeight` by default. - -Type: `int` - -### StartHidden - -When set to `true`, the application will be hidden until [WindowShow](../reference/runtime/window.mdx#windowshow) is called. - -Type: `bool` -### HideWindowOnClose - -By default, closing the window will close the application. Setting this to `true` means closing the window will - -hide the window instead. - -Type: `bool` - -### BackgroundColour - -This value is the default background colour of the window. Example: options.NewRGBA(255,0,0,128) - Red at 50% transparency - -Type: `*options.RGBA`
Default: white - -### AlwaysOnTop - -Indicates that the window should stay above other windows when losing focus. - -Type: `bool` - -### Assets - -The frontend assets to be used by the application. Requires an `index.html` file. - -Type: `embed.FS` - -### AssetsHandler - - - -The assets handler is a generic `http.Handler` which will be called for any non GET request on the assets server and for GET requests which can not be served from the `assets` because the file is not found. - -| Value | Win | Mac | Lin | -| ----------------------- | --- | --- | --- | -| GET | ✅ | ✅ | ✅ | -| POST | ✅ | ✅ | ❌ | -| PUT | ✅ | ✅ | ❌ | -| PATCH | ✅ | ✅ | ❌ | -| DELETE | ✅ | ✅ | ❌ | -| Request Headers | ✅ | ✅ | ❌ | -| Request Body | ✅ | ✅ | ❌ | -| Request Body Streaming | ❌ | ❌ | ❌ | -| Response StatusCodes | ✅ | ✅ | ❌ | -| Response Headers | ✅ | ✅ | ❌ | -| Response Body | ✅ | ✅ | ✅ | -| Response Body Streaming | ❌ | ❌ | ✅ | - -NOTE: Linux is currently very limited due to targeting a WebKit2GTK Version < 2.36.0. In the future some features will be supported by the introduction of WebKit2GTK 2.36.0+ support. - -NOTE: When used in combination with a Frontend DevServer there might be limitations, eg. Vite serves the index.html on every path, that does not contain a file extension. - -Type: `http.Handler` - -### Menu - -The menu to be used by the application. More details about Menus in the [Menu Reference](../reference/runtime/menu.mdx). - -:::note -On Mac, if no menu is specified, a default menu will be created. -::: - -Type: `*menu.Menu` - -### Logger - -The logger to be used by the application. More details about logging in the [Log Reference](../reference/runtime/log.mdx). - -Type: `logger.Logger`
Default: Logs to Stdout - -### LogLevel - -The default log level. More details about logging in the [Log Reference](../reference/runtime/log.mdx). - -Type: `logger.LogLevel`
Default: `Info` in dev mode, `Error` in production mode - -### LogLevelProduction - -The default log level for production builds. More details about logging in the [Log Reference](../reference/runtime/log.mdx). - -Type: `logger.LogLevel`
Default: `Error` - -### OnStartup - -This callback is called after the frontend has been created, but before `index.html` has been loaded. It is given the application context. - -Type: `func(ctx context.Context)` - -### OnDomReady - -This callback is called after the frontend has loaded `index.html` and its resources. It is given the application context. - -Type: `func(ctx context.Context)` - -### OnShutdown - -This callback is called after the frontend has been destroyed, just before the application terminates. It is given the application context. - -Type: `func(ctx context.Context)` - -### OnBeforeClose - -If this callback is set, it will be called when the application is about to quit, either by clicking the window close button or calling `runtime.Quit`. Returning true will cause the application to continue, false will continue shutdown as normal. This is good for confirming with the user that they wish to exit the program. - -Example: - -```go title=windowsapp.go -func (b *App) beforeClose(ctx context.Context) (prevent bool) { - dialog, err := runtime.MessageDialog(ctx, runtime.MessageDialogOptions{ - Title: "Quit?", - Message: "Are you sure you want to quit?", - - Type: ` runtime`.QuestionDialog, - - }) - - if err != nil { - return false - } - return dialog != "Yes" -} -``` - -Type: `func(ctx context.Context) bool` - -### WindowStartState - -Defines how the window should present itself at startup. - -| Value | Win | Mac | Lin | -| ---------- | --- | --- | --- | -| Fullscreen | ✅ | ✅ | ✅ | -| Maximised | ✅ | ✅ | ✅ | -| Minimised | ✅ | ❌ | ✅ | - -Type: `options.WindowStartState` - -### CSSDragProperty - -Indicates the CSS property to use to identify which elements can be used to drag the window. Default: `--wails-draggable`. - -Type: `string` - -### CSSDragValue - -Indicates what value the `CSSDragProperty` style should have to drag the window. Default: `drag`. - -Type: `string` - -### Bind - -A slice of struct instances defining methods that need to be bound to the frontend. - -Type: `[]interface{}` - -### Windows - -This defines [Windows specific options](#windows-specific-options). - -Type: `*windows.Options` - -### Mac - -This defines [Mac specific options](#mac-specific-options). - -Type: `*mac.Options` - -### Linux - -This defines [Linux specific options](#linux-specific-options). - -Type: `*linux.Options` - -## Windows Specific Options - -### WebviewIsTransparent - -Setting this to `true` will make the webview background transparent when an alpha value of `0` is used. This means that if you use `rgba(0,0,0,0)` for `background-color` in your CSS, the host window will show through. Often combined with [WindowIsTranslucent](#WindowIsTranslucent) to make frosty-looking applications. - -Type: `bool` - -### WindowIsTranslucent - -Setting this to `true` will make the window background translucent. Often combined with [WebviewIsTransparent](#WebviewIsTransparent) to make frosty-looking applications. - -Type: `bool` - -### DisableWindowIcon - -Setting this to `true` will remove the icon in the top left corner of the title bar. - -Type: `bool` - -### DisableFramelessWindowDecorations - -Setting this to `true` will remove the window decorations in [Frameless](#Frameless) mode. This means there will be no 'Aero Shadow' and no 'Rounded Corners' shown for the window. Please note that 'Rounded Corners' are only supported on Windows 11. - -Type: `bool` - -### WebviewUserDataPath - -This defines the path where the WebView2 stores the user data. If empty `%APPDATA%\[BinaryName.exe]` will be used. - -Type: `string` - -### WebviewBrowserPath - -This defines the path to a directory with WebView2 executable files and libraries. If empty, webview2 installed in the system will be used. - -Important information about distribution of fixed version runtime: - -- [How to get and extract runtime](https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution#details-about-the-fixed-version-runtime-distribution-mode) -- [Known issues for fixed version](https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution#known-issues-for-fixed-version) -- [The path of fixed version of the WebView2 Runtime should not contain \Edge\Application\.](https://docs.microsoft.com/en-us/microsoft-edge/webview2/reference/win32/webview2-idl?view=webview2-1.0.1245.22#createcorewebview2environmentwithoptions) - -Type: `string` - -### Theme - -Minimum Windows Version: Windows 10 2004/20H1 - -This defines the theme that the application should use: - -| Value | Description | -| ------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | -| SystemDefault | _Default_. The theme will be based on the system default. If the user changes their theme, the application will update to use the new setting | -| Dark | The application will use a dark theme exclusively | -| Light | The application will use a light theme exclusively | - -Type: `windows.Theme` - -### CustomTheme - -:::note -Minimum Windows Version: Windows 10/11 2009/21H2 Build 22000 -::: - -Allows you to specify custom colours for TitleBar, TitleText and Border for both light and dark mode, as well as when the window is active or inactive. - -Type: `windows.CustomTheme` - -#### CustomTheme Type - -The CustomTheme struct uses `int32` to specify the colour values. These are in the standard(!) Windows format of: `0x00BBGGAA`. A helper function is provided to do RGB conversions into this format: `windows.RGB(r,g,b uint8)`. - -NOTE: Any value not provided will default to black. - -```go -type ThemeSettings struct { - DarkModeTitleBar int32 - DarkModeTitleBarInactive int32 - DarkModeTitleText int32 - DarkModeTitleTextInactive int32 - DarkModeBorder int32 - DarkModeBorderInactive int32 - LightModeTitleBar int32 - LightModeTitleBarInactive int32 - LightModeTitleText int32 - LightModeTitleTextInactive int32 - LightModeBorder int32 - LightModeBorderInactive int32 -} -``` - -Example: - -```go - CustomTheme: &windows.ThemeSettings{ - // Theme to use when window is active - DarkModeTitleBar: windows.RGB(255, 0, 0), // Red - DarkModeTitleText: windows.RGB(0, 255, 0), // Green - DarkModeBorder: windows.RGB(0, 0, 255), // Blue - LightModeTitleBar: windows.RGB(200, 200, 200), - LightModeTitleText: windows.RGB(20, 20, 20), - LightModeBorder: windows.RGB(200, 200, 200), - // Theme to use when window is inactive - DarkModeTitleBarInactive: windows.RGB(128, 0, 0), - DarkModeTitleTextInactive: windows.RGB(0, 128, 0), - DarkModeBorderInactive: windows.RGB(0, 0, 128), - LightModeTitleBarInactive: windows.RGB(100, 100, 100), - LightModeTitleTextInactive: windows.RGB(10, 10, 10), - LightModeBorderInactive: windows.RGB(100, 100, 100), - }, -``` - -### Messages - -A struct of strings used by the webview2 installer if a valid webview2 runtime is not found. - -Type: `*windows.Messages` - -Customise this for any language you choose to support. - -### ResizeDebounceMS - -ResizeDebounceMS is the amount of time to debounce redraws of webview2 when resizing the window. The default value (0) will perform redraws as fast as it can. - -Type: `uint16` - -### OnSuspend - -If set, this function will be called when windows initiates a switch to low power mode (suspend/hibernate) - -Type: `func()` - -### OnResume - -If set, this function will be called when windows resumes from low power mode (suspend/hibernate) - -Type: `func()` - -## Mac Specific Options - -### TitleBar - -The TitleBar struct provides the ability to configure the look and feel of the title bar. - -Type: [`*mac.TitleBar`](#titlebar-struct) - - -### Appearance - -Appearance is used to set the style of your app in accordance with Apple's [NSAppearance](https://developer.apple.com/documentation/appkit/nsappearancename?language=objc) names. - -Type: [`AppearanceType`](#appearance-type) - -### WebviewIsTransparent - -Setting this to `true` will make the webview background transparent when an alpha value of `0` is used. This means that if you use `rgba(0,0,0,0)` for `background-color` in your CSS, the host window will show through. Often combined with [WindowIsTranslucent](#WindowIsTranslucent) to make frosty-looking applications. - -Type: `bool` - -### WindowIsTranslucent - -Setting this to `true` will make the window background translucent. Often combined with [WebviewIsTransparent](#WebviewIsTransparent) to make frosty-looking applications. - -Type: `bool` - -### About - -This configuration lets you set the title, message and icon for the "About" menu item in the app menu created by the "AppMenu" role. - -Type: [`About`](#about-struct) - - -#### Titlebar struct - -The titlebar of the application can be customised by using the TitleBar options: - -```go -type TitleBar struct { - TitlebarAppearsTransparent bool - HideTitle bool - HideTitleBar bool - FullSizeContent bool - UseToolbar bool - HideToolbarSeparator bool -} -``` - -| Name | Description | -| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| TitlebarAppearsTransparent | Makes the titlebar transparent. This has the effect of hiding the titlebar and the content fill the window. [Apple Docs](https://developer.apple.com/documentation/appkit/nswindow/1419167-titlebarappearstransparent?language=objc) | -| HideTitle | Hides the title of the window. [Apple Docs](https://developer.apple.com/documentation/appkit/nswindowtitlevisibility?language=objc) | -| HideTitleBar | Removes [NSWindowStyleMaskTitled](https://developer.apple.com/documentation/appkit/nswindowstylemask/nswindowstylemasktitled/) from the style mask | -| FullSizeContent | Makes the webview fill the entire window. [Apple Docs](https://developer.apple.com/documentation/appkit/nswindowstylemask/nswindowstylemaskfullsizecontentview) | -| UseToolbar | Adds a default toolbar to the window. [Apple Docs](https://developer.apple.com/documentation/appkit/nstoolbar?language=objc) | -| HideToolbarSeparator | Removes the line beneath the toolbar. [Apple Docs](https://developer.apple.com/documentation/appkit/nstoolbar/1516954-showsbaselineseparator?language=objc) | - -Preconfigured titlebar settings are available: - -| Setting | Example | -| --------------------------- | ---------------------------------------------- | -| `mac.TitleBarDefault()` | ![](/img/reference/titlebar-default.webp) | -| `mac.TitleBarHidden()` | ![](/img/reference/titlebar-hidden.webp) | -| `mac.TitleBarHiddenInset()` | ![](/img/reference/titlebar-hidden-inset.webp) | - -Example: - -```go -Mac: &mac.Options{ - TitleBar: mac.TitleBarHiddenInset(), -} -``` - -Click [here](https://github.com/lukakerr/NSWindowStyles) for some inspiration on customising the titlebar. - -#### Appearance type - -You can specify the application's [appearance](https://developer.apple.com/documentation/appkit/nsappearance?language=objc). - -| Value | Description | -| ----------------------------------------------------- | --------------------------------------------------------------- | -| DefaultAppearance | DefaultAppearance uses the default system value | -| NSAppearanceNameAqua | The standard light system appearance | -| NSAppearanceNameDarkAqua | The standard dark system appearance | -| NSAppearanceNameVibrantLight | The light vibrant appearance | -| NSAppearanceNameAccessibilityHighContrastAqua | A high-contrast version of the standard light system appearance | -| NSAppearanceNameAccessibilityHighContrastDarkAqua | A high-contrast version of the standard dark system appearance | -| NSAppearanceNameAccessibilityHighContrastVibrantLight | A high-contrast version of the light vibrant appearance | -| NSAppearanceNameAccessibilityHighContrastVibrantDark | A high-contrast version of the dark vibrant appearance | - -Example: - -```go -Mac: &mac.Options{ - Appearance: mac.NSAppearanceNameDarkAqua, -} -``` - -#### About struct - -```go -type AboutInfo struct { - Title string - Message string - Icon []byte -} -``` - -If these settings are provided, an "About" menu item will appear in the app menu (when using the `AppMenu` role). Given this configuration: - -```go -//go:embed build/appicon.png -var icon []byte - -func main() { - err := wails.Run(&options.App{ - ... - Mac: &mac.Options{ - About: &mac.AboutInfo{ - Title: "My Application", - Message: "© 2021 Me", - Icon: icon, - }, - }, - }) -``` - -The "About" menu item will appear in the app menu: - -
- -
- -
- -When clicked, that will open an about message box: - -
- -
- -
- -## Linux Specific Options - -### Icon - -Sets up the icon representing the window. This icon is used when the window is minimized (also known as iconified). - -Type: `[]byte` - -Some window managers or desktop environments may also place it in the window frame, or display it in other contexts. On others, the icon is not used at all, so your mileage may vary. - -NOTE: Gnome on Wayland at least does not display this icon. To have a application icon there, a `.desktop` file has to be used. On KDE it should work. - -The icon should be provided in whatever size it was naturally drawn; that is, don’t scale the image before passing it. Scaling is postponed until the last minute, when the desired final size is known, to allow best quality. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/project-config.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/project-config.mdx deleted file mode 100644 index 3dc1cf002..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/project-config.mdx +++ /dev/null @@ -1,51 +0,0 @@ ---- -sidebar_position: 5 ---- - -# Project Config - -The project config resides in the `wails.json` file in the project directory. The structure of the config is: - -```json -{ - "name": "[The project name]", - "assetdir": "[Relative path to the directory containing the compiled assets, this is normally inferred and could be left empty]", - "reloaddirs": "[Additional directories to trigger reloads (comma separated), this is only used for some advanced asset configurations]", - "frontend:install": "[The command to install node dependencies, run in the frontend directory - often `npm install`]", - "frontend:build": "[The command to build the assets, run in the frontend directory - often `npm run build`]", - "frontend:dev": "[This command has been replaced by frontend:dev:build. If frontend:dev:build is not specified will falls back to this command. If this command is also not specified will falls back to frontend:build]", - "frontend:dev:build": "[This command is the dev equivalent of frontend:build. If not specified falls back to frontend:dev]", - "frontend:dev:install": "[This command is the dev equivalent of frontend:install. If not specified falls back to frontend:install]", - "frontend:dev:watcher": "[This command is run in a separate process on `wails dev`. Useful for 3rd party watchers or starting 3d party dev servers]", - "frontend:dev:serverUrl": "[URL to a 3rd party dev server to be used to serve assets, EG Vite. If this is set to 'auto' then the devServerUrl will be inferred from the Vite output]", - "wailsjsdir": "[Relative path to the directory that the auto-generated JS modules will be created]", - "version": "[Project config version]", - "outputfilename": "[The name of the binary]", - "debounceMS": 100, // The default time the dev server waits to reload when it detects a change in assets - "devServer": "[Address to bind the wails dev sever to. Default: localhost:34115]", - "appargs": "[Arguments passed to the application in shell style when in dev mode]", - "runNonNativeBuildHooks": false, // Defines if build hooks should be run though they are defined for an OS other than the host OS. - "preBuildHooks": { - "GOOS/GOARCH": "[The command that will be executed before a build of the specified GOOS/GOARCH: ${platform} is replaced with the "GOOS/GOARCH". The "GOOS/GOARCH" hook is executed before the "GOOS/*" and "*/*" hook.]", - "GOOS/*": "[The command that will be executed before a build of the specified GOOS: ${platform} is replaced with the "GOOS/GOARCH". The "GOOS/*" hook is executed before the "*/*" hook.]", - "*/*": "[The command that will be executed before every build: ${platform} is replaced with the "GOOS/GOARCH".]" - }, - "postBuildHooks": { - "GOOS/GOARCH": "[The command that will be executed after a build of the specified GOOS/GOARCH: ${platform} is replaced with the "GOOS/GOARCH" and ${bin} with the path to the compiled binary. The "GOOS/GOARCH" hook is executed before the "GOOS/*" and "*/*" hook.]", - "GOOS/*": "[The command that will be executed after a build of the specified GOOS: ${platform} is replaced with the "GOOS/GOARCH" and ${bin} with the path to the compiled binary. The "GOOS/*" hook is executed before the "*/*" hook.]", - "*/*": "[The command that will be executed after every build: ${platform} is replaced with the "GOOS/GOARCH" and ${bin} with the path to the compiled binary.]" - }, - "info": { // Data used to populate manifests and version info. - "companyName": "[The company name. Default: [The project name]]", - "productName": "[The product name. Default: [The project name]]", - "productVersion": "[The version of the product. Default: '1.0.0']", - "copyright": "[The copyright of the product. Default: 'Copyright.........']", - "comments": "[A short comment of the app. Default: 'Built using Wails (https://wails.app)']" - }, - "nsisType": "['multiple': One installer per architecture. 'single': Single universal installer for all architectures being built. Default: 'multiple']" -} -``` - -This file is read by the Wails CLI when running `wails build` or `wails dev`. - -The `assetdir`, `reloaddirs`, `wailsjsdir`, `debounceMS`, `devserver` and `frontenddevserverurl` flags in `wails build/dev` will update the project config and thus become defaults for subsequent runs. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/runtime/_category_.json b/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/runtime/_category_.json deleted file mode 100644 index ac6d55488..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/runtime/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Runtime", - "position": 1 -} diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/runtime/browser.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/runtime/browser.mdx deleted file mode 100644 index 976ca1d80..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/runtime/browser.mdx +++ /dev/null @@ -1,14 +0,0 @@ ---- -sidebar_position: 7 ---- - -# Browser - -These methods are related to the system browser. - -### BrowserOpenURL - -Opens the given URL in the system browser. - -Go: `BrowserOpenURL(ctx context.Context, url string)`
JS: `BrowserOpenURL(url string)` - diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/runtime/dialog.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/runtime/dialog.mdx deleted file mode 100644 index ad65257ee..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/runtime/dialog.mdx +++ /dev/null @@ -1,283 +0,0 @@ ---- -sidebar_position: 5 ---- - -# Dialog - -This part of the runtime provides access to native dialogs, such as File Selectors and Message boxes. - -:::info Javascript -Dialog is currently unsupported in the JS runtime. -::: - -### OpenDirectoryDialog - -Opens a dialog that prompts the user to select a directory. Can be customised using [OpenDialogOptions](#opendialogoptions). - -Go: `OpenDirectoryDialog(ctx context.Context, dialogOptions OpenDialogOptions) (string, error)` - -Returns: Selected directory (blank if the user cancelled) or an error - -### OpenFileDialog - -Opens a dialog that prompts the user to select a file. Can be customised using [OpenDialogOptions](#opendialogoptions). - -Go: `OpenFileDialog(ctx context.Context, dialogOptions OpenDialogOptions) (string, error)` - -Returns: Selected file (blank if the user cancelled) or an error - -### OpenMultipleFilesDialog - -Opens a dialog that prompts the user to select multiple files. Can be customised using [OpenDialogOptions](#opendialogoptions). - -Go: `OpenMultipleFilesDialog(ctx context.Context, dialogOptions OpenDialogOptions) ([]string, error)` - -Returns: Selected files (nil if the user cancelled) or an error - -### SaveFileDialog - -Opens a dialog that prompts the user to select a filename for the purposes of saving. Can be customised using [SaveDialogOptions](#savedialogoptions). - -Go: `SaveFileDialog(ctx context.Context, dialogOptions SaveDialogOptions) (string, error)` - -Returns: The selected file (blank if the user cancelled) or an error - -### MessageDialog - -Displays a message using a message dialog. Can be customised using [MessageDialogOptions](#messagedialogoptions). - -Go: `MessageDialog(ctx context.Context, dialogOptions MessageDialogOptions) (string, error)` - -Returns: The text of the selected button or an error - -## Options - -### OpenDialogOptions - -```go -type OpenDialogOptions struct { - DefaultDirectory string - DefaultFilename string - Title string - Filters []FileFilter - ShowHiddenFiles bool - CanCreateDirectories bool - ResolvesAliases bool - TreatPackagesAsDirectories bool -} -``` - -| Field | Description | Win | Mac | Lin | -| -------------------------- | ---------------------------------------------- | --- | --- | --- | -| DefaultDirectory | The directory the dialog will show when opened | ✅ | ✅ | ✅ | -| DefaultFilename | The default filename | ✅ | ✅ | ✅ | -| Title | Title for the dialog | ✅ | ✅ | ✅ | -| [Filters](#filefilter) | A list of file filters | ✅ | ✅ | ✅ | -| ShowHiddenFiles | Show files hidden by the system | | ✅ | ✅ | -| CanCreateDirectories | Allow user to create directories | | ✅ | | -| ResolvesAliases | If true, returns the file not the alias | | ✅ | | -| TreatPackagesAsDirectories | Allow navigating into packages | | ✅ | | - -### SaveDialogOptions - -```go -type SaveDialogOptions struct { - DefaultDirectory string - DefaultFilename string - Title string - Filters []FileFilter - ShowHiddenFiles bool - CanCreateDirectories bool - TreatPackagesAsDirectories bool -} -``` - -| Field | Description | Win | Mac | Lin | -| -------------------------- | ---------------------------------------------- | --- | --- | --- | -| DefaultDirectory | The directory the dialog will show when opened | ✅ | ✅ | ✅ | -| DefaultFilename | The default filename | ✅ | ✅ | ✅ | -| Title | Title for the dialog | ✅ | ✅ | ✅ | -| [Filters](#filefilter) | A list of file filters | ✅ | ✅ | ✅ | -| ShowHiddenFiles | Show files hidden by the system | | ✅ | ✅ | -| CanCreateDirectories | Allow user to create directories | | ✅ | | -| TreatPackagesAsDirectories | Allow navigating into packages | | ✅ | | - -### MessageDialogOptions - -```go -type MessageDialogOptions struct { - Type DialogType - Title string - Message string - Buttons []string - DefaultButton string - CancelButton string -} -``` - -| Field | Description | Win | Mac | Lin | -| ------------- | ------------------------------------------------------------------------- | --- | --- | --- | -| Type | The type of message dialog, eg question, info... | ✅ | ✅ | ✅ | -| Title | Title for the dialog | ✅ | ✅ | ✅ | -| Message | The message to show the user | ✅ | ✅ | ✅ | -| Buttons | A list of button titles | | ✅ | | -| DefaultButton | The button with this text should be treated as default. Bound to `return` | | ✅ | | -| CancelButton | The button with this text should be treated as cancel. Bound to `escape` | | ✅ | | - -#### Windows - -Windows has standard dialog types in which the buttons are not customisable. The value returned will be one of: "Ok", "Cancel", "Abort", "Retry", "Ignore", "Yes", "No", "Try Again" or "Continue" - -#### Linux - -Linux has standard dialog types in which the buttons are not customisable. The value returned will be one of: "Ok", "Cancel", "Yes", "No" - -#### Mac - -A message dialog on Mac may specify up to 4 buttons. If no `DefaultButton` or `CancelButton` is given, the first button is considered default and is bound to the `return` key. - -For the following code: - -```go -selection, err := runtime.MessageDialog(b.ctx, runtime.MessageDialogOptions{ - Title: "It's your turn!", - Message: "Select a number", - Buttons: []string{"one", "two", "three", "four"}, -}) -``` - -the first button is shown as default: - -
- -
- -
- -And if we specify `DefaultButton` to be "two": - -```go -selection, err := runtime.MessageDialog(b.ctx, runtime.MessageDialogOptions{ - Title: "It's your turn!", - Message: "Select a number", - Buttons: []string{"one", "two", "three", "four"}, - DefaultButton: "two", -}) -``` - -the second button is shown as default. When `return` is pressed, the value "two" is returned. - -
- -
- -
- -If we now specify `CancelButton` to be "three": - -```go -selection, err := runtime.MessageDialog(b.ctx, runtime.MessageDialogOptions{ - Title: "It's your turn!", - Message: "Select a number", - Buttons: []string{"one", "two", "three", "four"}, - DefaultButton: "two", - CancelButton: "three", -}) -``` - -the button with "three" is shown at the bottom of the dialog. When `escape` is pressed, the value "three" is returned: - -
- -
- -
-
-
- -#### DialogType - -```go -const ( - InfoDialog DialogType = "info" - WarningDialog DialogType = "warning" - ErrorDialog DialogType = "error" - QuestionDialog DialogType = "question" - ) -``` - -### FileFilter - -```go -type FileFilter struct { - DisplayName string // Filter information EG: "Image Files (*.jpg, *.png)" - Pattern string // semi-colon separated list of extensions, EG: "*.jpg;*.png" -} -``` - -#### Windows - -Windows allows you to use multiple file filters in dialog boxes. Each FileFilter will show up as a separate entry in the dialog: - -
- -
- -
-
-
- -#### Linux - -Linux allows you to use multiple file filters in dialog boxes. Each FileFilter will show up as a separate entry in the dialog: - -
- -
- -
-
-
- -#### Mac - -Mac dialogs only have the concept of a single set of patterns to filter files. If multiple FileFilters are provided, Wails will use all the Patterns defined. - -Example: - -```go - selection, err := runtime.OpenFileDialog(b.ctx, runtime.OpenDialogOptions{ - Title: "Select File", - Filters: []runtime.FileFilter{ - { - DisplayName: "Images (*.png;*.jpg)", - Pattern: "*.png;*.jpg", - }, { - DisplayName: "Videos (*.mov;*.mp4)", - Pattern: "*.mov;*.mp4", - }, - }, - }) -``` - -This will result in the Open File dialog using `*.png,*.jpg,*.mov,*.mp4` as a filter. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/runtime/events.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/runtime/events.mdx deleted file mode 100644 index 75e8b0a50..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/runtime/events.mdx +++ /dev/null @@ -1,38 +0,0 @@ ---- -sidebar_position: 2 ---- - -# Events - -The Wails runtime provides a unified events system, where events can be emitted or received by either Go or Javascript. Optionally, data may be passed with the events. Listeners will receive the data in the local data types. - -### EventsOn - -This method sets up a listener for the given event name. When an event of type `eventName` is [emitted](#EventsEmit), the callback is triggered. Any additional data sent with the emitted event will be passed to the callback. - -Go: `EventsOn(ctx context.Context, eventName string, callback func(optionalData ...interface{}))`
JS: `EventsOn(eventName string, callback function(optionalData?: any))` - -### EventsOff - -This method unregisters the listener for the given event name, optionally multiple listeneres can be unregistered via `additionalEventNames`. - -Go: `EventsOff(ctx context.Context, eventName string, additionalEventNames ...string)`
JS: `EventsOff(eventName string, ...additionalEventNames)` - -### EventsOnce - -This method sets up a listener for the given event name, but will only trigger once. - -Go: `EventsOnce(ctx context.Context, eventName string, callback func(optionalData ...interface{}))`
JS: `EventsOnce(eventName string, callback function(optionalData?: any))` - -### EventsOnMultiple - -This method sets up a listener for the given event name, but will only trigger a maximum of `counter` times. - -Go: `EventsOnMultiple(ctx context.Context, eventName string, callback func(optionalData ...interface{}), counter int)`
JS: `EventsOnMultiple(eventName string, callback function(optionalData?: any), counter int)` - -### EventsEmit - -This method emits the given event. Optional data may be passed with the event. This will trigger any event listeners. - -Go: `EventsEmit(ctx context.Context, eventName string, optionalData ...interface{})`
JS: `EventsEmit(ctx context, optionalData function(optionalData?: any))` - diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/runtime/intro.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/runtime/intro.mdx deleted file mode 100644 index 6c02c71cd..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/runtime/intro.mdx +++ /dev/null @@ -1,73 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Introduction - -The runtime is a library that provides utility methods for your application. There is both a Go and Javascript runtime and the aim is to try and keep them at parity where possible. - -It has utility methods for: - -- [Window](window.mdx) -- [Menu](menu.mdx) -- [Dialog](dialog.mdx) -- [Events](events.mdx) -- [Browser](browser.mdx) -- [Log](log.mdx) - -The Go Runtime is available through importing `github.com/wailsapp/wails/v2/pkg/runtime`. All methods in this package take a context as the first parameter. This context should be obtained from the [OnStartup](../options.mdx#onstartup) or [OnDomReady](../options.mdx#ondomready) hooks. - -:::info Note - -Whilst the context will be provided to the [OnStartup](../options.mdx#onstartup) method, there's no guarantee the runtime will work in this method as the window is initialising in a different thread. If you wish to call runtime methods at startup, use [OnDomReady](../options.mdx#ondomready). - -::: - -The Javascript library is available to the frontend via the `window.runtime` map. There is a runtime package generated when using `dev` mode that provides Typescript declarations for the runtime. This should be located in the `wailsjs` directory in your frontend directory. - -### Hide - -Go: `Hide(ctx context.Context)`
JS: `Hide()` - -Hides the application. - -:::info Note On Mac, this will hide the application in the same way as the `Hide` menu item in standard Mac applications. This is different to hiding the window, but the application still being in the foreground. For Windows and Linux, this is currently the same as `WindowHide`. ::: - -### Show - -Shows the application. - -:::info Note On Mac, this will bring the application back into the foreground. For Windows and Linux, this is currently the same as `WindowShow`. ::: - -Go: `Show(ctx context.Context)`
JS: `Show()` - -### Quit - -Quits the application. - -Go: `Quit(ctx context.Context)`
JS: `Quit()` - -### Environment - -Returns details of the current environment. - -Go: `Environment(ctx context.Context) EnvironmentInfo`
JS: `Environment(): Promise` - -#### EnvironmentInfo - -Go: -```go -type EnvironmentInfo struct { - BuildType string - Platform string - Arch string -} -``` -JS: -```ts -interface EnvironmentInfo { - buildType: string; - platform: string; - arch: string; -} -``` diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/runtime/log.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/runtime/log.mdx deleted file mode 100644 index e5e6ea7ac..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/runtime/log.mdx +++ /dev/null @@ -1,130 +0,0 @@ ---- -sidebar_position: 3 ---- - -# Log - -The Wails runtime provides a logging mechanism that may be called from Go or Javascript. Like most loggers, there are a number of log levels: - -- Trace -- Debug -- Info -- Warning -- Error -- Fatal - -The logger will output any log message at the current, or higher, log level. Example: The `Debug` log level will output all messages except `Trace` messages. - -### LogPrint - -Logs the given message as a raw message. - -Go: `LogPrint(ctx context.Context, message string)`
JS: `LogPrint(message: string)` - -### LogPrintf - -Logs the given message as a raw message. - -Go: `LogPrintf(ctx context.Context, format string, args ...interface{})`
- -### LogTrace - -Logs the given message at the `Trace` log level. - -Go: `LogTrace(ctx context.Context, message string)`
JS: `LogTrace(message: string)` - -### LogTracef - -Logs the given message at the `Trace` log level. - -Go: `LogTracef(ctx context.Context, format string, args ...interface{})`
- -### LogDebug - -Logs the given message at the `Debug` log level. - -Go: `LogDebug(ctx context.Context, message string)`
JS: `LogDebug(message: string)` - -### LogDebugf - -Logs the given message at the `Debug` log level. - -Go: `LogDebugf(ctx context.Context, format string, args ...interface{})`
- -### LogInfo - -Logs the given message at the `Info` log level. - -Go: `LogInfo(ctx context.Context, message string)`
JS: `LogInfo(message: string)` - -### LogInfof - -Logs the given message at the `Info` log level. - -Go: `LogInfof(ctx context.Context, format string, args ...interface{})`
- -### LogWarning - -Logs the given message at the `Warning` log level. - -Go: `LogWarning(ctx context.Context, message string)`
JS: `LogWarning(message: string)` - -### LogWarningf - -Logs the given message at the `Warning` log level. - -Go: `LogWarningf(ctx context.Context, format string, args ...interface{})`
- -### LogError - -Logs the given message at the `Error` log level. - -Go: `LogError(ctx context.Context, message string)`
JS: `LogError(message: string)` - -### LogErrorf - -Logs the given message at the `Error` log level. - -Go: `LogErrorf(ctx context.Context, format string, args ...interface{})`
- -### LogFatal - -Logs the given message at the `Fatal` log level. - -Go: `LogFatal(ctx context.Context, message string)`
JS: `LogFatal(message: string)` - -### LogFatalf - -Logs the given message at the `Fatal` log level. - -Go: `LogFatalf(ctx context.Context, format string, args ...interface{})`
- -### LogSetLogLevel - -Sets the log level. In Javascript, the number relates to the following log levels: - -| Value | Log Level | -| ----- | --------- | -| 1 | Trace | -| 2 | Debug | -| 3 | Info | -| 4 | Warning | -| 5 | Error | - -Go: `LogSetLogLevel(ctx context.Context, level logger.LogLevel)`
JS: `LogSetLogLevel(level: number)` - -## Using a Custom Logger - -A custom logger may be used by providing it using the [Logger](../options.mdx#logger) application option. The only requirement is that the logger implements the `logger.Logger` interface defined in `github.com/wailsapp/wails/v2/pkg/logger`: - -```go title="logger.go" -type Logger interface { - Print(message string) - Trace(message string) - Debug(message string) - Info(message string) - Warning(message string) - Error(message string) - Fatal(message string) -} -``` diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/runtime/menu.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/runtime/menu.mdx deleted file mode 100644 index 6a7e06cf9..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/runtime/menu.mdx +++ /dev/null @@ -1,23 +0,0 @@ ---- -sidebar_position: 6 ---- - -# Menu - -These methods are related to the application menu. - -:::info Javascript -Menu is currently unsupported in the JS runtime. -::: - -### MenuSetApplicationMenu - -Sets the application menu to the given [menu](../menus.mdx). - -Go: `MenuSetApplicationMenu(ctx context.Context, menu *menu.Menu)` - -### MenuUpdateApplicationMenu - -Updates the application menu, picking up any changes to the menu passed to `MenuSetApplicationMenu`. - -Go: `MenuUpdateApplicationMenu(ctx context.Context)` diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/runtime/window.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/runtime/window.mdx deleted file mode 100644 index d03143161..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/reference/runtime/window.mdx +++ /dev/null @@ -1,211 +0,0 @@ ---- -sidebar_position: 4 ---- - -# Window - -These methods give control of the application window. - -### WindowSetTitle - -Sets the text in the window title bar. - -Go: `WindowSetTitle(ctx context.Context, title string)`
JS: `WindowSetTitle(title: string)` - -### WindowFullscreen - -Makes the window full screen. - -Go: `WindowFullscreen(ctx context.Context)`
JS: `WindowFullscreen()` - -### WindowUnfullscreen - -Restores the previous window dimensions and position prior to full screen. - -Go: `WindowUnfullscreen(ctx context.Context)`
JS: `WindowUnfullscreen()` - -### WindowIsFullscreen - -Returns true if the window is full screen. - -Go: `WindowCenter(ctx context.Context)`
JS: `WindowCenter()` - -### WindowCenter - -Centers the window on the monitor the window is currently on. - -Go: `WindowReload(ctx context.Context)`
JS: `WindowReload()` - -### WindowReload - -Performs a "reload" (Reloads current page). - -Go: `WindowReloadApp(ctx context.Context)`
JS: `WindowReloadApp()` - -### WindowReloadApp - -Reloads the application frontend. - -Go: `WindowSetSystemDefaultTheme(ctx context.Context)`
JS: `WindowSetSystemDefaultTheme()` - -### WindowSetSystemDefaultTheme - -Windows only. - -Go: `WindowSetDarkTheme(ctx context.Context)`
JS: `WindowSetDarkTheme()` - -Sets window theme to system default (dark/light). - -### WindowSetLightTheme - -Windows only. - -Go: `WindowSetLightTheme(ctx context.Context)`
JS: `WindowSetLightTheme()` - -Sets window theme to light. - -### WindowSetDarkTheme - -Windows only. - -Go: `WindowShow(ctx context.Context)`
JS: `WindowShow()` - -Sets window theme to dark. - -### WindowShow - -Shows the window, if it is currently hidden. - -Go: `WindowHide(ctx context.Context)`
JS: `WindowHide()` - -### WindowHide - -Hides the window, if it is currently visible. - -Go: `WindowSetSize(ctx context.Context, width int, height int)`
JS: `WindowSetSize(size: Size)` - -### WindowIsNormal - -Returns true if the window not minimised, maximised or fullscreen. - -Go: `WindowGetSize(ctx context.Context) (width int, height int)`
JS: `WindowGetSize() : Size` - -### WindowSetSize - -Sets the width and height of the window. - -Go: `WindowSetMaxSize(ctx context.Context, width int, height int)`
JS: `WindowSetMaxSize(size: Size)` - -### WindowGetSize - -Gets the width and height of the window. - -Go: `WindowSetMinSize(ctx context.Context, width int, height int)`
JS: `WindowSetMinSize(size: Size)` - -### WindowSetMinSize - -Sets the minimum window size. Will resize the window if the window is currently smaller than the given dimensions. - -Setting a size of `0,0` will disable this constraint. - -Go: `WindowSetAlwaysOnTop(ctx context.Context, b bool)`
JS: `WindowSetAlwaysOnTop(b: Boolen)` - -### WindowSetMaxSize - -Sets the maximum window size. Will resize the window if the window is currently larger than the given dimensions. - -Setting a size of `0,0` will disable this constraint. - -Go: `WindowSetPosition(ctx context.Context, x int, y int)`
JS: `WindowSetPosition(position: Position)` - -### WindowSetAlwaysOnTop - -Sets the window AlwaysOnTop or not on top. - -Go: `WindowGetPosition(ctx context.Context) (x int, y int)`
JS: `WindowGetPosition() : Position` - -### WindowSetPosition - -Sets the window position relative to the monitor the window is currently on. - -Go: `WindowMaximise(ctx context.Context)`
JS: `WindowMaximise()` - -### WindowGetPosition - -Gets the window position relative to the monitor the window is currently on. - -Go: `WindowUnmaximise(ctx context.Context)`
JS: `WindowUnmaximise()` - -### WindowMaximise - -Maximises the window to fill the screen. - -Go: `WindowToggleMaximise(ctx context.Context)`
JS: `WindowToggleMaximise()` - -### WindowUnmaximise - -Restores the window to the dimensions and position prior to maximising. - -Go: `WindowMinimise(ctx context.Context)`
JS: `WindowMinimise()` - -### WindowIsMaximised - -Returns true if the window is maximised. - -Go: `WindowUnminimise(ctx context.Context)`
JS: `WindowUnminimise()` - -### WindowToggleMaximise - -Toggles between Maximised and UnMaximised. - -Go: `WindowToggleMaximise(ctx context.Context)`
JS: `WindowToggleMaximise()` - -### WindowMinimise - -Minimises the window. - -Go: `WindowSetBackgroundColour(ctx context.Context, R, G, B, A uint8)`
JS: `WindowSetBackgroundColour(R, G, B, A)` - -### WindowUnminimise - -Restores the window to the dimensions and position prior to minimising. - -Go: `WindowUnminimise(ctx context.Context)`
JS: `WindowUnminimise()` - -### WindowIsMinimised - -Returns true if the window is minimised. - -Go: `WindowIsMinimised(ctx context.Context) bool` JS: `WindowIsMinimised() bool` - -### WindowSetBackgroundColour - -Sets the background colour of the window to the given RGBA colour definition. This colour will show through for all transparent pixels. - -Valid values for R, G, B and A are 0-255. - -Any value that is not 0 will be considered 255. :::info Windows -On Windows, only alpha values of 0 or 255 are supported. -::: - -Go: `WindowSetBackgroundColour(ctx context.Context, R, G, B, A uint8)`
JS: `WindowSetBackgroundColour(R, G, B, A)` - -## Typescript Object Definitions - -### Position - -```ts -interface Position { - x: number; - y: number; -} -``` - -### Size - -```ts -interface Size { - w: number; - h: number; -} -``` diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/tutorials/_category_.json b/website/i18n/ko/docusaurus-plugin-content-docs/current/tutorials/_category_.json deleted file mode 100644 index dfac1d175..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/tutorials/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Tutorials", - "position": 70 -} diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/tutorials/dogsapi.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/tutorials/dogsapi.mdx deleted file mode 100644 index f4845fdbe..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/tutorials/dogsapi.mdx +++ /dev/null @@ -1,243 +0,0 @@ ---- -sidebar_position: 20 ---- - -# Dogs API - -
- -
- -
- -:::note This tutorial has been kindly provided by [@tatadan](https://twitter.com/tatadan) and forms part of their [Wails Examples Repository](https://github.com/tataDan/wails-v2-examples). ::: - -In this tutorial we are going to develop an application that retrieves photos of dogs from the web and then displays them. - -### Create the project - -Let's create the application. From a terminal enter: `wails init -n dogs-api -t svelte` - -Note: We could optionally add `-ide vscode` or `-ide goland` to the end of this command if you wanted to add IDE support. - -Now let's `cd dogs-api` and start editing the project files. - -### Remove unused code - -We will start by removing some elements that we know we will not use: - -- Open `app.go` and remove the following lines: - -```go -// Greet returns a greeting for the given name -func (a *App) Greet(name string) string { - return fmt.Sprintf("Hello %s, It's show time!", name) -} -``` - -- Open `frontend/src/App.svelte` and delete all lines. -- Delete the `frontend/src/assets/images/logo-universal.png` file - -### Creating our application - -Now let's add our new Go code. - -Add the following struct declarations to `app.go` before the function definitions: - -```go -type RandomImage struct { - Message string - Status string -} - -type AllBreeds struct { - Message map[string]map[string][]string - Status string -} - -type ImagesByBreed struct { - Message []string - Status string -} -``` - -Add the following functions to `app.go` (perhaps after the existing function definitions): - -```go -func (a *App) GetRandomImageUrl() string { - response, err := http.Get("https://dog.ceo/api/breeds/image/random") - if err != nil { - log.Fatal(err) - } - - responseData, err := ioutil.ReadAll(response.Body) - if err != nil { - log.Fatal(err) - } - - var data RandomImage - json.Unmarshal(responseData, &data) - - return data.Message -} - -func (a *App) GetBreedList() []string { - var breeds []string - - response, err := http.Get("https://dog.ceo/api/breeds/list/all") - if err != nil { - log.Fatal(err) - } - - responseData, err := ioutil.ReadAll(response.Body) - if err != nil { - log.Fatal(err) - } - - var data AllBreeds - json.Unmarshal(responseData, &data) - - for k := range data.Message { - breeds = append(breeds, k) - } - - sort.Strings(breeds) - - return breeds -} - -func (a *App) GetImageUrlsByBreed(breed string) []string { - - url := fmt.Sprintf("%s%s%s%s", "https://dog.ceo/api/", "breed/", breed, "/images") - response, err := http.Get(url) - if err != nil { - log.Fatal(err) - } - - responseData, err := ioutil.ReadAll(response.Body) - if err != nil { - log.Fatal(err) - } - - var data ImagesByBreed - json.Unmarshal(responseData, &data) - - return data.Message -} -``` - -Modify the `import` section of `app.go` to look like this: - -```go -import ( - "context" - "fmt" - "encoding/json" - "io/ioutil" - "log" - "net/http" - "sort" -) -``` - -Add the following lines to `frontend/src/App.svelte`: - -```html - - -

Dogs API

-
- - Click on down arrow to select a breed - - -
-
-{#if showRandomPhoto} - No dog found -{/if} -{#if showBreedPhotos} - {#each photos as photo} - No dog found - {/each} -{/if} - - -``` - -### Testing the application - -To generate the bindings and test the application, run `wails dev`. - -### Compiling the application - -To compile the application to a single, production grade binary, run `wails build`. - - - - - diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/tutorials/helloworld.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/tutorials/helloworld.mdx deleted file mode 100644 index d1b8e9f98..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/tutorials/helloworld.mdx +++ /dev/null @@ -1,118 +0,0 @@ ---- -sidebar_position: 10 ---- - -# Hello World - -The aim of this tutorial is to get you up and running with the most basic application using Wails. You will be able to: - -- Create a new Wails application -- Build the application -- Run the application - -:::note -This tutorial uses Windows as the target platform. Output will vary slightly -depending on your operating system. -::: - -## Create a new Wails application - -To create a new Wails application using the default vanilla JS template, you need to run the following command: - -```bash -wails init -n helloworld -``` - -You should see something similar to the following: - -``` -Wails CLI v2.0.0 - -Initialising Project 'helloworld' ---------------------------------- - -Project Name: helloworld -Project Directory: C:\Users\leaan\tutorial\helloworld -Project Template: vanilla -Template Support: https://wails.io - -Initialised project 'helloworld' in 232ms. -``` - -This will create a new directory called `helloworld` in the current directory. In this directory, you will find a number of files: - -``` -build/ - Contains the build files + compiled application -frontend/ - Contains the frontend files -app.go - Contains the application code -main.go - The main program with the application configuration -wails.json - The project configuration file -go.mod - The go module file -go.sum - The go module checksum file -``` - -## Build the application - -To build the application, change to the new `helloworld` project directory and run the following command: - -```bash -wails build -``` - -You should see something like the following: - -``` -Wails CLI v2.0.0 - -App Type: desktop -Platforms: windows/amd64 -Compiler: C:\Users\leaan\go\go1.18.3\bin\go.exe -Build Mode: Production -Skip Frontend: false -Compress: false -Package: true -Clean Build Dir: false -LDFlags: "" -Tags: [] -Race Detector: false - -Building target: windows/amd64 ------------------------------- - - Installing frontend dependencies: Done. - - Compiling frontend: Done. - - Generating bundle assets: Done. - - Compiling application: Done. -Built 'C:\Users\leaan\tutorial\helloworld\build\bin\helloworld.exe' in 10.616s. -``` - -This has compiled the application and saved it in the `build/bin` directory. - -## Run the application - -If we view the `build/bin` directory in Windows Explorer, we should see our project binary: - -
- -
- -
- -We can run it by simply double-clicking the `helloworld.exe` file. - -On Mac, Wails generates a `helloworld.app` file which can be run by double-clicking it. - -On Linux, you can run the application using `./helloworld` from the `build/bin` directory. - -You should see the application working as expected: - -
- -
-
diff --git a/website/i18n/ko/docusaurus-plugin-content-pages/community-guide.mdx b/website/i18n/ko/docusaurus-plugin-content-pages/community-guide.mdx deleted file mode 100644 index 5a999e28a..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-pages/community-guide.mdx +++ /dev/null @@ -1,142 +0,0 @@ -# Community Guide - -The number of Wails users is growing at an incredible rate, and if you're reading this, chances are you're ready to join. So... welcome! - -## Resources - -### Code of Conduct - -coming soon... - -### Stay in the Know - -- Follow our [official Twitter account](https://twitter.com/wailsapp). - -### Get Support - -- [GitHub](https://github.com/wailsapp/wails) - If you have a bug to report or feature to request, that's what the GitHub issues are for. Please respect the rules specified in each repository's issue template. -- [Slack](https://gophers.slack.com/messages/CJ4P9F7MZ/) - A place for Wails devs to meet and chat in real time. -- [QQ Group(中文)](https://qm.qq.com/cgi-bin/qm/qr?k=PmIURne5hFGNd7QWzW5qd6FV-INEjNJv&jump_from=webapi) - A Wails group for Chinese developers to communicate, where you can get help from other developers. - -### Explore the Ecosystem - -- [The Awesome Wails Page](https://github.com/wailsapp/awesome-wails) - See what other awesome resources have been published by other awesome people. - -## Ways of contributing - -Wails is an open source, community driven project. We welcome anyone to join us in contributing to the project. This documentation is aimed at anyone wishing to get familiar with the project and the development processes. - -There are many ways to contribute to the project: - -- Developing new features -- Fixing bugs -- Testing -- Documenting features -- Writing tutorials / guides -- Helping others on the issues + discussions boards - -Guides for these have been created in their own sections. Before getting started, please introduce yourself in the [Contributing to Wails](https://github.com/wailsapp/wails/discussions/1520) discussion. - -### Developing New Features - -We are always keen to add features to Wails and expand on what the project can do. The process for adding new features are as follows: - -- Pick an enhancement ticket with the "TODO" label. It's preferable to select one from the current [Backlog](https://github.com/orgs/wailsapp/projects/1/views/1) but the choice is yours. -- Before developing, check that the ticket includes the following information: -- The purpose of the enhancement -- What is out of scope for the enhancement -- What platforms the enhancement targets (most features should be cross-platform unless there's a very specific reason) -- If the ticket does not include this information, feel free to request the information from the person who opened the ticket. Sometimes placeholder tickets are created and require more details -- Comment on the ticket stating you wish to develop the feature -- Clone the repository and create a branch with the format `feature/_` -- New features often require documentation so please ensure you have also added or updated the documentation as part of the changes -- Once the feature is ready for testing, create a draft PR. Please ensure the PR description has the test scenarios and test cases listed with checkmarks, so that others can know what still needs to be tested. -- Once all the testing is completed, please update the status of the PR from draft and leave a message. - -:::note -There is nothing stopping you from opening a ticket and working on it yourself, but please be aware that all -enhancement requests are reviewed for good fit. Not all ideas will be selected so it's best to have discussion -on the ticket first. -::: - -:::warning -Any PRs opened without a corresponding ticket may be rejected. -::: - -### Fixing Bugs - -The process for fixing bugs are as follows: - -- Check the current [Backlog](https://github.com/orgs/wailsapp/projects/1/views/1) and select a bug to fix -- Before developing, check that the ticket includes the following information: -- The scope of the issue including platforms affected -- The steps to reproduce. Sometimes bugs are opened that are not Wails issues and the onus is on the reporter to prove that it is a Wails issue with a minimal reproducible example -- The output of `wails doctor` -- If the ticket does not include this information, feel free to request the information from the person who opened the ticket. -- Comment on the ticket stating you wish to develop a fix -- Clone the repository and create a branch with the format `bugfix/_` -- Once the fix is ready for testing, create a draft PR. Please ensure the PR description has the test scenarios and test cases listed with checkmarks, so that others can know what still needs to be tested. -- Once all the testing is completed, please update the status of the PR from draft and leave a message. - -:::note -There is nothing stopping you from opening a ticket and working on it yourself, but please be aware that all -bugfixes should be discussed as the approach may have unintended side effects. -::: - -:::warning -Any PRs opened without a corresponding ticket may be rejected. -::: - -### Testing - -Testing is vitally important to ensure quality in the project. There are a couple of scenarios where testing can really help the project: - -- Testing if a bug is reproducible on your local system -- Testing PRs to ensure that they work correctly - -If you chose to test if someone's bug report is reproducible on your local system, then feel free to add a comment on the ticket confirming this with the output of `wails doctor`. - -To test PRs, choose a PR to test and check if the PR description has the testing scenarios listed. If not, please ask the person who opened the PR to provide that list. Once you have determined a valid test scenario, please report your findings on the PR. - -If you ever need more clarity or help on testing, please ask a question in the [Contributing to Wails](https://github.com/wailsapp/wails/discussions/1520) discussion or on slack. - -### Documenting - -This website is also the main documentation site for the project. Sometimes this gets out of date and needs some slight adjustments. Some of the documentation isn't written to the best standards either. Developing documentation is hard and so any contribution to this is greatly appreciated. Features without documentation are unfinished so to the project, it's _as important_ as the code. - -We generally do not create tickets for updating documentation so if there is text you think should be updated or rephrased then feel free to submit a PR for that. This site is in the main repository under the `website` directory. We use [Docusaurus](https://docusaurus.io/) to create the site so there is plenty of existing documentation and tutorials around to get started. - -To set up a local documentation development environment, do the following: - -- [Install npm](https://docs.npmjs.com/cli/v8/configuring-npm/install) -- `cd website` -- `npm install` -- `npm run start` - -After it has all installed and is running, you should see the site at [`http://localhost:3000`](http://localhost:3000). Any changes made to the site text will be immediately reflected in the browser. - -#### Versioning - -We employ a versioning system where we have the "latest" documentation AKA "Next Version" which has all the changes that have occurred since the last release. We also keep the last release documentation as well as the version before that. - -There isn't usually a reason to update released documentation so we don't generally update the documents in the `versioned_docs` or `versioned_sidebars` directories. - -The "next version" docs are mainly in `website/docs` with some "version independent" documents in `src/pages`. Any updates should be made in the `website/docs` directory. - -#### Languages - -The default documents of the Wails project are English documents. We use the "crowdin" tool to translate documents in other languages and synchronize them to the website. You can [join our project](https://crowdin.com/project/wails) and submit your translations to make contributions. - -##### Add new language - -If you want to add a new language to the documentation, please follow the prompts to [fill in and submit an Issue](https://github.com/wailsapp/wails/issues/new?assignees=&labels=documentation&template=documentation.yml). After being confirmed by the maintainer, we will add the language to the "crowdin" and you will then be able to submit your translation. - -### Helping Others - -A great way to contribute to the project is to help others who are experiencing difficulty. This is normally reported as a ticket or a message on the Wails slack channel. Even just clarifying the issue can really help out. Sometimes, when an issue is discussed and gets resolved, we create a guide out of it to help others who face the same issues. - -To join the Wails slack channel, accept the invite [here](https://gophers.slack.com/join/shared_invite/zt-197vymgt3-sJt4oyakb6nqlVKjXTyeVw#/shared-invite/email) and join us on the channel by following [this link](https://gophers.slack.com/?redir=%2Fmessages%2FCJ4P9F7MZ%2F). - -:::note -Work In Progress -::: diff --git a/website/i18n/ko/docusaurus-plugin-content-pages/contributing/developing-new-features.mdx b/website/i18n/ko/docusaurus-plugin-content-pages/contributing/developing-new-features.mdx deleted file mode 100644 index 57c5b101b..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-pages/contributing/developing-new-features.mdx +++ /dev/null @@ -1,29 +0,0 @@ ---- -sidebar_position: 20 ---- - -# Developing New Features - -We are always keen to add features to Wails and expand on what the project can do. The process for adding new features are as follows: - -- Pick an enhancement ticket with the "TODO" label. It's preferable to select one from the current [Backlog](https://github.com/orgs/wailsapp/projects/1/views/1) but the choice is yours. -- Before developing, check that the ticket includes the following information: -- The purpose of the enhancement -- What is out of scope for the enhancement -- What platforms the enhancement targets (most features should be cross-platform unless there's a very specific reason) -- If the ticket does not include this information, feel free to request the information from the person who opened the ticket. Sometimes placeholder tickets are created and require more details -- Comment on the ticket stating you wish to develop the feature -- Clone the repository and create a branch with the format `feature/_` -- New features often require documentation so please ensure you have also added or updated the documentation as part of the changes -- Once the feature is ready for testing, create a draft PR. Please ensure the PR description has the test scenarios and test cases listed with checkmarks, so that others can know what still needs to be tested. -- Once all the testing is completed, please update the status of the PR from draft and leave a message. - -:::note -There is nothing stopping you from opening a ticket and working on it yourself, but please be aware that all -enhancement requests are reviewed for good fit. Not all ideas will be selected so it's best to have discussion -on the ticket first. -::: - -:::warning -Any PRs opened without a corresponding ticket may be rejected. -::: diff --git a/website/i18n/ko/docusaurus-plugin-content-pages/contributing/documenting.mdx b/website/i18n/ko/docusaurus-plugin-content-pages/contributing/documenting.mdx deleted file mode 100644 index 06f33914b..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-pages/contributing/documenting.mdx +++ /dev/null @@ -1,34 +0,0 @@ ---- -sidebar_position: 40 ---- - -# Documenting - -This website is also the main documentation site for the project. Sometimes this gets out of date and needs some slight adjustments. Some of the documentation isn't written to the best standards either. Developing documentation is hard and so any contribution to this is greatly appreciated. Features without documentation are unfinished so to the project, it's _as important_ as the code. - -We generally do not create tickets for updating documentation so if there is text you think should be updated or rephrased then feel free to submit a PR for that. This site is in the main repository under the `website` directory. We use [Docusaurus](https://docusaurus.io/) to create the site so there is plenty of existing documentation and tutorials around to get started. - -To set up a local documentation development environment, do the following: - -- [Install npm](https://docs.npmjs.com/cli/v8/configuring-npm/install) -- `cd website` -- `npm install` -- `npm run start` - -After it has all installed and is running, you should see the site at [`http://localhost:3000`](http://localhost:3000). Any changes made to the site text will be immediately reflected in the browser. - -## Versioning - -We employ a versioning system where we have the "latest" documentation AKA "Next Version" which has all the changes that have occurred since the last release. We also keep the last release documentation as well as the version before that. - -There isn't usually a reason to update released documentation so we don't generally update the documents in the `versioned_docs` or `versioned_sidebars` directories. - -The "next version" docs are mainly in `website/docs` with some "version independent" documents in `src/pages`. Any updates should be made in the `website/docs` directory. - -## Languages - -The default documents of the Wails project are English documents. We use the "crowdin" tool to translate documents in other languages and synchronize them to the website. You can [join our project](https://crowdin.com/project/wails) and submit your translations to make contributions. - -### Add new language - -If you want to add a new language to the documentation, please follow the prompts to [fill in and submit an Issue](https://github.com/wailsapp/wails/issues/new?assignees=&labels=documentation&template=documentation.yml). After being confirmed by the maintainer, we will add the language to the "crowdin" and you will then be able to submit your translation. diff --git a/website/i18n/ko/docusaurus-plugin-content-pages/contributing/fixing-bugs.mdx b/website/i18n/ko/docusaurus-plugin-content-pages/contributing/fixing-bugs.mdx deleted file mode 100644 index 51bd90b74..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-pages/contributing/fixing-bugs.mdx +++ /dev/null @@ -1,27 +0,0 @@ ---- -sidebar_position: 30 ---- - -# Fixing Bugs - -The process for fixing bugs are as follows: - -- Check the current [Backlog](https://github.com/orgs/wailsapp/projects/1/views/1) and select a bug to fix -- Before developing, check that the ticket includes the following information: -- The scope of the issue including platforms affected -- The steps to reproduce. Sometimes bugs are opened that are not Wails issues and the onus is on the reporter to prove that it is a Wails issue with a minimal reproducible example -- The output of `wails doctor` -- If the ticket does not include this information, feel free to request the information from the person who opened the ticket. -- Comment on the ticket stating you wish to develop a fix -- Clone the repository and create a branch with the format `bugfix/_` -- Once the fix is ready for testing, create a draft PR. Please ensure the PR description has the test scenarios and test cases listed with checkmarks, so that others can know what still needs to be tested. -- Once all the testing is completed, please update the status of the PR from draft and leave a message. - -:::note -There is nothing stopping you from opening a ticket and working on it yourself, but please be aware that all -bugfixes should be discussed as the approach may have unintended side effects. -::: - -:::warning -Any PRs opened without a corresponding ticket may be rejected. -::: diff --git a/website/i18n/ko/docusaurus-plugin-content-pages/contributing/helping-others.mdx b/website/i18n/ko/docusaurus-plugin-content-pages/contributing/helping-others.mdx deleted file mode 100644 index 933c06b35..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-pages/contributing/helping-others.mdx +++ /dev/null @@ -1,13 +0,0 @@ ---- -sidebar_position: 50 ---- - -# Helping Others - -A great way to contribute to the project is to help others who are experiencing difficulty. This is normally reported as a ticket or a message on the Wails slack channel. Even just clarifying the issue can really help out. Sometimes, when an issue is discussed and gets resolved, we create a guide out of it to help others who face the same issues. - -To join the Wails slack channel, accept the invite [here](https://gophers.slack.com/join/shared_invite/zt-197vymgt3-sJt4oyakb6nqlVKjXTyeVw#/shared-invite/email) and join us on the channel by following [this link](https://gophers.slack.com/?redir=%2Fmessages%2FCJ4P9F7MZ%2F). - -:::note -Work In Progress -::: diff --git a/website/i18n/ko/docusaurus-plugin-content-pages/contributing/setting-up-a-dev-environment.mdx b/website/i18n/ko/docusaurus-plugin-content-pages/contributing/setting-up-a-dev-environment.mdx deleted file mode 100644 index b933af9a6..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-pages/contributing/setting-up-a-dev-environment.mdx +++ /dev/null @@ -1,30 +0,0 @@ ---- -sidebar_position: 10 ---- - -# Setting up a Development Environment - -You can set up a development environment by doing the following: - -- Install the latest versions of Go and Git -- `git clone https://github.com/wailsapp/wails` -- `cd wails/v2/cmd/wails` -- `go install` - -NOTE: The directory that you cloned the project into will now be called "clonedir". - -The Wails CLI will now be at the very latest version. - -To update projects to use the latest version, update the project's `go.mod` and ensure the following line is at the bottom of the file: - -`replace github.com/wailsapp/wails/v2 => ` - -Example: - -On Windows: `replace github.com/wailsapp/wails/v2 => C:\Users\leaan\Documents\wails-v2-beta\wails\v2` - -On 'nix: `replace github.com/wailsapp/wails/v2 => /home/me/projects/wails/v2` - -To revert back to a stable version, run: - -`go install github.com/wailsapp/wails/v2/cmd/wails@latest` diff --git a/website/i18n/ko/docusaurus-plugin-content-pages/contributing/testing.mdx b/website/i18n/ko/docusaurus-plugin-content-pages/contributing/testing.mdx deleted file mode 100644 index e751dfc3e..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-pages/contributing/testing.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -sidebar_position: 35 ---- - -# Testing - -Testing is vitally important to ensure quality in the project. There are a couple of scenarios where testing can really help the project: - -- Testing if a bug is reproducible on your local system -- Testing PRs to ensure that they work correctly - -If you chose to test if someone's bug report is reproducible on your local system, then feel free to add a comment on the ticket confirming this with the output of `wails doctor`. - -To test PRs, choose a PR to test and check if the PR description has the testing scenarios listed. If not, please ask the person who opened the PR to provide that list. Once you have determined a valid test scenario, please report your findings on the PR. - -If you ever need more clarity or help on testing, please ask a question in the [Contributing to Wails](https://github.com/wailsapp/wails/discussions/1520) discussion or on slack. diff --git a/website/i18n/ko/docusaurus-plugin-content-pages/contributing/ways-of-contributing.mdx b/website/i18n/ko/docusaurus-plugin-content-pages/contributing/ways-of-contributing.mdx deleted file mode 100644 index 6b76d99d9..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-pages/contributing/ways-of-contributing.mdx +++ /dev/null @@ -1,18 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Ways of contributing - -Wails is an open source, community driven project. We welcome anyone to join us in contributing to the project. This documentation is aimed at anyone wishing to get familiar with the project and the development processes. - -There are many ways to contribute to the project: - -- Developing new features -- Fixing bugs -- Testing -- Documenting features -- Writing tutorials / guides -- Helping others on the issues + discussions boards - -Guides for these have been created in their own sections. Before getting started, please introduce yourself in the [Contributing to Wails](https://github.com/wailsapp/wails/discussions/1520) discussion. diff --git a/website/i18n/ko/docusaurus-plugin-content-pages/credits.mdx b/website/i18n/ko/docusaurus-plugin-content-pages/credits.mdx deleted file mode 100644 index 2970d3704..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-pages/credits.mdx +++ /dev/null @@ -1,196 +0,0 @@ -# Credits - -- [Lea Anthony](https://github.com/leaanthony) - Project owner, lead developer -- [Stffabi](https://github.com/stffabi) - Technical lead, developer and maintainer -- [Misitebao](https://github.com/misitebao) - Documentation wizard, Chinese translation, Windows testing, Bug finder general -- [Travis McLane](https://github.com/tmclane) - Cross-compilation work, MacOS testing -- [Byron Chris](https://github.com/bh90210) - Linux distro wizard, Linux testing - -## Sponsors - - -## Contributors - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Lea Anthony

💻 🤔 🎨 🖋 💡 🧑‍🏫 📆 🔧 🐛 📝 🚧 📦 👀 💬 🔬 ⚠️ 📢 👀 📖

stffabi

💻 🤔 🎨 🐛 🚧 📦 👀 💬 🔬 👀 📖 ⚠️

Travis McLane

💻 🔬 📦 🤔 🐛 👀 ⚠️ 💬 📖

Misite Bao

📖 🌍 🔬 🚧

Byron Chris

💻 🔬 🚧 🐛 👀 ⚠️ 💬 🤔 🎨 📦 🚇

konez2k

💻 📦 🤔

Dario Emerson

💻 🐛 🤔 ⚠️

Ian M. Jones

💻 🐛 🤔 ⚠️ 👀 📦

marktohark

💻

Ryan H

💻

Cody Bentley

💻 📦 🤔 💵

Florent

💻 🐛

Alexander Hudek

💻 💵

Tim Kipp

💻

Altynbek Kaliakbarov

💻

Nikolai Zimmermann

💻

k-muchmore

💻

Snider

💻 🤔 📖 💵

Albert Sun

💻 ⚠️

Ariel

💻 🐛

Ilgıt Yıldırım

💻 🐛 💵

Toyam Cox

💻 📦 🐛

hi019

💻 🐛

Arthur Wiebe

💻 🐛

Balakrishna Prasad Ganne

💻

BillBuilt

💻 📦 🤔 💬 💵

Eng Zer Jun

🚧 💻

LGiki

📖

Lontten

📖

Lukas Crepaz

💻 🐛

Marcus Crane

🐛 📖 💵

Qais Patankar

📖

Wakeful-Cloud

💻 🐛

Zámbó, Levente

💻 📦 🐛 ⚠️

Ironpark

💻 🤔

mondy

💻 📖

Benjamin Ryan

🐛

fallendusk

📦 💻

Mat Ryer

💻 🤔 🐛

Abtin

💻 🐛

Adrian Lanzafame

📦 💻

Aleksey Polyakov

🐛 💻

Alexander Matviychuk

💻 📦

AlienRecall

💻 📦

Aman

📖

Amaury Tobias Quiroz

💻 🐛

Andreas Wenk

📖

Antonio Stanković

💻 📦

Arpit Jain

📖

Austin Schey

💻 🐛

Benjamin Thomas

💻 📦 🤔

Bertram Truong

💻 🐛

Blake Bourque

📖

Denis

📖

diogox

💻 📦

Dmitry Gomzyakov

💻 📦

Edward Browncross

💻

Elie Grenon

💻

Florian Didron

💻 🐛 🤔 ⚠️ 👀 📦

GargantuaX

📖 💵

Igor Minin

💻 🐛

Jae-Sung Lee

💻 🤔

Jarek

💻 📦

Junker

📖

Kris Raney

💻 🐛

Luken

📖

Mark Stenglein

💻 🐛

buddyabaddon

💻

MikeSchaap

💻 🐛

NYSSEN Michaël

💻 🐛

Nan0

💻 🤔 ⚠️ 👀

oskar

📖

Pierre Joye

💻 🐛 🤔 ⚠️

Reuben Thomas-Davis

💻 🐛

Robin

💻 🐛

Sebastian Bauer

💻 🤔 ⚠️ 👀 💬

Sidharth Rathi

📖 🐛

Sithembiso Khumalo

💻 🐛

Soheib El-Harrache

💻 🐛 💵

Sophie Au

💻 🐛

Stefanos Papadakis

💻 🐛

Steve Chung

💻 🐛

Timm Ortloff

📖

Tom

💻

Valentin Trinqué

💻 🐛

mattn

💻 🐛

bearsh

💻 🤔 📖

chenxiao

💻 🤔 📖

fengweiqiang

💻 📦

flin7

📖

fred21O4

📖

gardc

📖

rayshoo

📖

Ishiyama Yuzuki

💻 🐛

佰阅

💻

刀刀

📖 🐛

归位

💻 🐛

skamensky

💻 🤔 📖

dependabot[bot]

💻 🚧

Damian Sieradzki

💵

John Dorman

💵

Ian Sinnott

💵

Arden Shackelford

💵

Bironou

💵

CharlieGo_

💵

overnet

💵

jugglingjsons

💵

Selvin Ortiz

💵

ZanderCodes

💵

Michael Voronov

💵

letheanVPN

💵

Tai Groot

💵

easy-web-it

💵

Michael Olson

💵

EdenNetwork Italia

💵

ondoki

💵

QuEST Rail LLC

💵

Gilgameš

💵

Bernt-Johan Bergshaven

💵

Liam Bigelow

💵

Nick Arellano

💵

Frank Chiarulli Jr.

💵

Tyler

💵

Trea Hauet

💵

Kent 'picat' Gruber

💵

tc-hib

💵

Antonio

📖

MyNameIsAres

📖

Maicarons J

📖
- - - - - - -## 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. -- [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. diff --git a/website/i18n/ko/docusaurus-plugin-content-pages/faq.mdx b/website/i18n/ko/docusaurus-plugin-content-pages/faq.mdx deleted file mode 100644 index 77b3acd4e..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-pages/faq.mdx +++ /dev/null @@ -1,9 +0,0 @@ -# FAQ - -## What's with the name? - -When I saw WebView, I thought "What I really want is tooling around building a WebView app, a bit like Rails is to Ruby". So initially it was a play on words (Webview on Rails). It just so happened to also be a homophone of the English name for the [Country](https://en.wikipedia.org/wiki/Wales) I am from. So it stuck. - -## Is this an alternative to Electron? - -Depends on your requirements. It's designed to make it easy for Go programmers to make lightweight desktop applications or add a frontend to their existing applications. Wails v2 does offer native elements such as menus and dialogs, so it is becoming a lightweight electron alternative. diff --git a/website/i18n/ko/docusaurus-plugin-content-pages/markdown-page.md b/website/i18n/ko/docusaurus-plugin-content-pages/markdown-page.md deleted file mode 100644 index 9756c5b66..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-pages/markdown-page.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Markdown page example ---- - -# Markdown page example - -You don't need React to write simple standalone pages. diff --git a/website/i18n/ko/docusaurus-plugin-content-pages/stats.mdx b/website/i18n/ko/docusaurus-plugin-content-pages/stats.mdx deleted file mode 100644 index dd174cd99..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-pages/stats.mdx +++ /dev/null @@ -1,24 +0,0 @@ -# Website Stats - -To enable us to understand how better to focus our efforts on translations and platform support, we use [Plausible](https://plausible.io/privacy-focused-web-analytics) to gather **anonymous** stats like country and platform. We chose Plausible because we believe in respecting the privacy of our users. We also believe in transparency, therefore have made the dashboard public. - -If you have any concerns or suggestions, please raise them in the projects github discussions. - - - - - -export const NewComponent = () => ( -
-