diff --git a/v3/Taskfile.yaml b/v3/Taskfile.yaml
index fc145cf68..20075549b 100644
--- a/v3/Taskfile.yaml
+++ b/v3/Taskfile.yaml
@@ -134,3 +134,87 @@ tasks:
- install-runtime-deps
cmds:
- task: build-runtime-all
+
+ recreate-template-dir:
+ dir: internal/templates
+ internal: true
+ silent: true
+ cmds:
+ - rm -rf {{.TEMPLATE_DIR}}
+ - mkdir -p {{.TEMPLATE_DIR}}
+
+ generate-template:
+ dir: internal/templates/{{.TEMPLATE}}
+ deps:
+ - task: recreate-template-dir
+ vars:
+ TEMPLATE_DIR: "{{.TEMPLATE}}"
+ silent: true
+ cmds:
+ - cmd: pnpm create vite frontend --template {{.TEMPLATE}}
+ - cmd: cp -rf ../_base/{{.TEMPLATE}}/* .
+ ignore_error: true
+ - cmd: cp -rf ../_base/default/* .
+ ignore_error: true
+ - cmd: rm frontend/public/vite.svg
+ - cmd: go run ../../../tasks/sed/sed.go replace -dir frontend -old Vite -new Wails -ext .ts,.js,.html -ignore vite.config.js,vite.config.ts,vite-env.d.ts
+ - cmd: go run ../../../tasks/sed/sed.go replace -dir frontend -old vite -new wails -ext .ts,.js,.html -ignore vite.config.js,vite.config.ts,vite-env.d.ts
+ - cmd: go run ../../../tasks/sed/sed.go replace -dir frontend -old wails.svg -new wails.png -ext .ts,.js,.html -ignore vite.config.js,vite.config.ts,vite-env.d.ts
+ - cmd: go run ../../../tasks/sed/sed.go replace -dir frontend -old wailsjs.dev -new wails.io -ext .ts,.js,.html -ignore vite.config.js,vite.config.ts,vite-env.d.ts
+ - cmd: go run ../../../tasks/sed/sed.go replace -dir frontend -old "framework powered by Wails" -new "framework powered by Vite" -ext .ts,.js,.html,.svelte -ignore vite.config.js,vite.config.ts,vite-env.d.ts
+
+ reinstall-cli:
+ dir: cmd/wails
+ internal: true
+ cmds:
+ - go install
+ - echo "Reinstalled wails CLI"
+
+ generate-templates:
+ dir: internal/templates/
+ deps:
+ - task: generate-template
+ vars:
+ TEMPLATE: svelte
+ - task: generate-template
+ vars:
+ TEMPLATE: svelte-ts
+ - task: generate-template
+ vars:
+ TEMPLATE: vue
+ - task: generate-template
+ vars:
+ TEMPLATE: vue-ts
+ - task: generate-template
+ vars:
+ TEMPLATE: react
+ - task: generate-template
+ vars:
+ TEMPLATE: react-ts
+ - task: generate-template
+ vars:
+ TEMPLATE: preact
+ - task: generate-template
+ vars:
+ TEMPLATE: preact-ts
+ - task: generate-template
+ vars:
+ TEMPLATE: lit
+ - task: generate-template
+ vars:
+ TEMPLATE: lit-ts
+ - task: generate-template
+ vars:
+ TEMPLATE: vanilla
+ - task: generate-template
+ vars:
+ TEMPLATE: vanilla-ts
+ - task: generate-template
+ vars:
+ TEMPLATE: react-swc
+ - task: generate-template
+ vars:
+ TEMPLATE: react-swc-ts
+ cmds:
+ - task: reinstall-cli
+ - echo "Generated templates"
diff --git a/v3/examples/build/Taskfile.yml b/v3/examples/build/Taskfile.yml
index ed71e373c..67e1db618 100644
--- a/v3/examples/build/Taskfile.yml
+++ b/v3/examples/build/Taskfile.yml
@@ -20,10 +20,9 @@ tasks:
generate-icons:
summary: Generates Windows `.ico` and Mac `.icns` files from an image
- dir: build
cmds:
# Generates both .ico and .icns files
- - wails generate icon -input appicon.png
+ - wails generate icons -input appicon.png
build-prod:
summary: Creates a production build of the application
diff --git a/v3/go.mod b/v3/go.mod
index 83a089d76..5bcbc2fc7 100644
--- a/v3/go.mod
+++ b/v3/go.mod
@@ -6,6 +6,7 @@ require (
github.com/go-task/task/v3 v3.20.0
github.com/jackmordaunt/icns/v2 v2.2.1
github.com/leaanthony/clir v1.5.0
+ github.com/leaanthony/gosod v1.0.3
github.com/leaanthony/winicon v1.0.0
github.com/pterm/pterm v0.12.51
github.com/samber/lo v1.37.0
diff --git a/v3/go.sum b/v3/go.sum
index 51f179243..7a5ef1a8f 100644
--- a/v3/go.sum
+++ b/v3/go.sum
@@ -49,6 +49,10 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/leaanthony/clir v1.0.4/go.mod h1:k/RBkdkFl18xkkACMCLt09bhiZnrGORoxmomeMvDpE0=
github.com/leaanthony/clir v1.5.0 h1:zaH7fgsZ5OLfr0YwJBwQ+EYxCjXQsHF+CRudIiZb0KQ=
github.com/leaanthony/clir v1.5.0/go.mod h1:k/RBkdkFl18xkkACMCLt09bhiZnrGORoxmomeMvDpE0=
+github.com/leaanthony/debme v1.2.1 h1:9Tgwf+kjcrbMQ4WnPcEIUcQuIZYqdWftzZkBr+i/oOc=
+github.com/leaanthony/debme v1.2.1/go.mod h1:3V+sCm5tYAgQymvSOfYQ5Xx2JCr+OXiD9Jkw3otUjiA=
+github.com/leaanthony/gosod v1.0.3 h1:Fnt+/B6NjQOVuCWOKYRREZnjGyvg+mEhd1nkkA04aTQ=
+github.com/leaanthony/gosod v1.0.3/go.mod h1:BJ2J+oHsQIyIQpnLPjnqFGTMnOZXDbvWtRCSG7jGxs4=
github.com/leaanthony/slicer v1.5.0 h1:aHYTN8xbCCLxJmkNKiLB6tgcMARl4eWmH9/F+S/0HtY=
github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY=
github.com/leaanthony/winicon v1.0.0 h1:ZNt5U5dY71oEoKZ97UVwJRT4e+5xo5o/ieKuHuk8NqQ=
@@ -56,6 +60,7 @@ github.com/leaanthony/winicon v1.0.0/go.mod h1:en5xhijl92aphrJdmRPlh4NI1L6wq3gEm
github.com/lithammer/fuzzysearch v1.1.5 h1:Ag7aKU08wp0R9QCfF4GoGST9HbmAIeLP7xwMrOBEp1c=
github.com/lithammer/fuzzysearch v1.1.5/go.mod h1:1R1LRNk7yKid1BaQkmuLQaHruxcC4HmAH30Dh61Ih1Q=
github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=
+github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU=
github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-colorable v0.1.11 h1:nQ+aFkoE2TMGc0b68U2OKSexC+eq46+XwZzWXHRmPYs=
github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
@@ -114,8 +119,6 @@ github.com/tc-hib/winres v0.1.6 h1:qgsYHze+BxQPEYilxIz/KCQGaClvI2+yLBAZs+3+0B8=
github.com/tc-hib/winres v0.1.6/go.mod h1:pe6dOR40VOrGz8PkzreVKNvEKnlE8t4yR8A8naL+t7A=
github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs=
github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o=
-github.com/wailsapp/task/v3 v3.19.1 h1:syDKYaPBXgrXKKSJVEWcOEoSFtZzpvxqlHf90YRukRc=
-github.com/wailsapp/task/v3 v3.19.1/go.mod h1:y7rWakbLR5gFElGgo6rA2dyr6vU/zNIDVfn3S4Of6OI=
github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6 h1:Wn+nhnS+VytzE0PegUzSh4T3hXJCtggKGD/4U5H9+wQ=
github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6/go.mod h1:zlNLI0E2c2qA6miiuAHtp0Bac8FaGH0tlhA19OssR/8=
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8=
diff --git a/v3/internal/commands/defaults/icon.ico b/v3/internal/commands/defaults/icon.ico
new file mode 100644
index 000000000..bfa0690b7
Binary files /dev/null and b/v3/internal/commands/defaults/icon.ico differ
diff --git a/v3/internal/commands/icons.go b/v3/internal/commands/icons.go
index dde3b8bfe..4eee8734f 100644
--- a/v3/internal/commands/icons.go
+++ b/v3/internal/commands/icons.go
@@ -15,17 +15,9 @@ import (
type IconsOptions struct {
Example bool `description:"Generate example icon file (appicon.png) in the current directory"`
Input string `description:"The input image file"`
- Sizes string `description:"The sizes to generate in .ico file (comma separated)"`
- WindowsFilename string `description:"The output filename for the Windows icon"`
- MacFilename string `description:"The output filename for the Mac icon bundle"`
-}
-
-func (i *IconsOptions) Default() *IconsOptions {
- return &IconsOptions{
- Sizes: "256,128,64,48,32,16",
- MacFilename: "icons.icns",
- WindowsFilename: "icons.ico",
- }
+ Sizes string `description:"The sizes to generate in .ico file (comma separated)" default:"256,128,64,48,32,16"`
+ WindowsFilename string `description:"The output filename for the Windows icon" default:"icon.ico"`
+ MacFilename string `description:"The output filename for the Mac icon bundle" default:"icons.icns"`
}
func GenerateIcons(options *IconsOptions) error {
@@ -51,7 +43,6 @@ func GenerateIcons(options *IconsOptions) error {
return err
}
}
-
iconData, err := os.ReadFile(options.Input)
if err != nil {
return err
diff --git a/v3/internal/commands/init.go b/v3/internal/commands/init.go
index 14248a4f3..6527460b4 100644
--- a/v3/internal/commands/init.go
+++ b/v3/internal/commands/init.go
@@ -1,8 +1,44 @@
package commands
-type InitOptions struct {
+import (
+ "fmt"
+
+ "github.com/wailsapp/wails/v3/internal/flags"
+ "github.com/wailsapp/wails/v3/internal/templates"
+
+ "github.com/pterm/pterm"
+)
+
+func Init(options *flags.Init) error {
+ if options.List {
+ return printTemplates()
+ }
+
+ if options.Quiet {
+ pterm.DisableOutput()
+ }
+
+ if options.ProjectName == "" {
+ return fmt.Errorf("please use the -n flag to specify a project name")
+ }
+
+ if !templates.ValidTemplateName(options.TemplateName) {
+ return fmt.Errorf("invalid template name: %s. Use -l flag to view available templates", options.TemplateName)
+ }
+
+ return templates.Install(options)
}
-func Init(options *InitOptions) error {
- return nil
+func printTemplates() error {
+ defaultTemplates := templates.GetDefaultTemplates()
+
+ pterm.DefaultSection.Println("Available templates")
+
+ table := pterm.TableData{{"Name", "Description"}}
+ for _, template := range defaultTemplates {
+ table = append(table, []string{template.Name, template.Description})
+ }
+ err := pterm.DefaultTable.WithHasHeader(true).WithBoxed(true).WithData(table).Render()
+ pterm.Println()
+ return err
}
diff --git a/v3/internal/commands/task.go b/v3/internal/commands/task.go
index d47395e37..ae33e9215 100644
--- a/v3/internal/commands/task.go
+++ b/v3/internal/commands/task.go
@@ -44,7 +44,7 @@ func ListTasks(options *ListTaskOptions) error {
return err
}
if len(tasks) == 0 {
- return fmt.Errorf("no tasks found. Ensure there is a `Taskfile.yml` in your project. You can generate a default takfile by running `wails generate defaults`")
+ return fmt.Errorf("no tasks found. Ensure there is a `Taskfile.tmpl.yml` in your project. You can generate a default takfile by running `wails generate defaults`")
}
tableData := [][]string{
{"Task", "Summary"},
diff --git a/v3/internal/flags/common.go b/v3/internal/flags/common.go
new file mode 100644
index 000000000..e58eff411
--- /dev/null
+++ b/v3/internal/flags/common.go
@@ -0,0 +1,5 @@
+package flags
+
+type Common struct {
+ NoColour bool `description:"Disable colour in output"`
+}
diff --git a/v3/internal/flags/init.go b/v3/internal/flags/init.go
new file mode 100644
index 000000000..97b80a98f
--- /dev/null
+++ b/v3/internal/flags/init.go
@@ -0,0 +1,14 @@
+package flags
+
+type Init struct {
+ Common
+
+ TemplateName string `name:"t" description:"Name of built-in template to use, path to template or template url" default:"vanilla"`
+ ProjectName string `name:"n" description:"Name of project" default:"."`
+ //CIMode bool `name:"ci" description:"CI Mode"`
+ ProjectDir string `name:"d" description:"Project directory" default:"."`
+ Quiet bool `name:"q" description:"Suppress output to console"`
+ //InitGit bool `name:"g" description:"Initialise git repository"`
+ //IDE string `name:"ide" description:"Generate IDE project files"`
+ List bool `name:"l" description:"List templates"`
+}
diff --git a/v3/internal/templates/_base/default/Taskfile.tmpl.yml b/v3/internal/templates/_base/default/Taskfile.tmpl.yml
new file mode 100644
index 000000000..4d3d4b22d
--- /dev/null
+++ b/v3/internal/templates/_base/default/Taskfile.tmpl.yml
@@ -0,0 +1,82 @@
+version: '3'
+
+vars:
+ APP_NAME: "{{.ProjectName}}"
+
+tasks:
+
+ pre-build:
+ summary: Pre-build hooks
+
+ post-build:
+ summary: Post-build hooks
+
+ install-frontend-deps:
+ summary: Install frontend dependencies
+ dir: frontend
+ sources:
+ - package.json
+ - package-lock.json
+ generates:
+ - node_modules/*
+ preconditions:
+ - sh: npm version
+ msg: "Looks like npm isn't installed. Npm is part of the Node installer: https://nodejs.org/en/download/"
+ cmds:
+ - npm install
+
+ build-frontend:
+ summary: Build the frontend project
+ dir: frontend
+ deps:
+ - install-frontend-deps
+ cmds:
+ - npm run build
+
+ build:
+ summary: Builds the application
+ cmds:
+ - task: pre-build
+ - task: build-frontend
+ - go build -gcflags=all="-N -l" -o build/bin/{{ "{{.APP_NAME}}" }} main.go
+ - task: post-build
+ env:
+ CGO_CFLAGS: "-mmacosx-version-min=10.13"
+ CGO_LDFLAGS: "-mmacosx-version-min=10.13"
+
+ generate-icons:
+ summary: Generates Windows `.ico` and Mac `.icns` files from an image
+ dir: build
+ cmds:
+ # Generates both .ico and .icns files
+ - wails generate icons -input appicon.png
+
+ build-app-prod-darwin:
+ summary: Creates a production build of the application
+ cmds:
+ - GOOS=darwin GOARCH={{ "{{.ARCH}}" }} go build -tags production -ldflags="-w -s" -o build/bin/{{ "{{.APP_NAME}}" }}
+ env:
+ CGO_CFLAGS: "-mmacosx-version-min=10.13"
+ CGO_LDFLAGS: "-mmacosx-version-min=10.13"
+ vars:
+ ARCH: $GOARCH
+
+
+ create-app-bundle:
+ summary: Builds a `.app` bundle
+ cmds:
+ - mkdir -p {{ "{{.APP_NAME}}" }}.app/Contents/{MacOS,Resources}
+ - cp build/icons.icns {{ "{{.APP_NAME}}" }}.app/Contents/Resources
+ - cp build/bin/{{ "{{.APP_NAME}}" }} {{ "{{.APP_NAME}}" }}.app/Contents/MacOS
+ - cp build/Info.plist {{ "{{.APP_NAME}}" }}.app/Contents
+
+ package-darwin-arm64:
+ summary: Packages a production build of the application into a `.app` bundle
+ platform: darwin
+ deps:
+ - task: build-app-prod-darwin
+ vars:
+ ARCH: arm64
+ - generate-icons
+ cmds:
+ - task: create-app-bundle
\ No newline at end of file
diff --git a/v3/internal/templates/_base/default/build/Info.plist.tmpl b/v3/internal/templates/_base/default/build/Info.plist.tmpl
new file mode 100644
index 000000000..93d9a5bf1
--- /dev/null
+++ b/v3/internal/templates/_base/default/build/Info.plist.tmpl
@@ -0,0 +1,27 @@
+
+
+
+ CFBundlePackageType
+ APPL
+ CFBundleName
+ {{ "{{.Info.ProductName}}" }}
+ CFBundleExecutable
+ {{ "{{.ProjectName}}" }}
+ CFBundleIdentifier
+ com.wails.{{ "{{.ProjectName}}" }}
+ CFBundleVersion
+ v1.0.0
+ CFBundleGetInfoString
+ This is a comment
+ CFBundleShortVersionString
+ v1.0.0
+ CFBundleIconFile
+ iconfile
+ LSMinimumSystemVersion
+ 10.13.0
+ NSHighResolutionCapable
+ true
+ NSHumanReadableCopyright
+ (c) 2023 My Company Name
+
+
\ No newline at end of file
diff --git a/v3/internal/templates/_base/default/build/appicon.png b/v3/internal/templates/_base/default/build/appicon.png
new file mode 100644
index 000000000..63617fe4f
Binary files /dev/null and b/v3/internal/templates/_base/default/build/appicon.png differ
diff --git a/v3/internal/templates/_base/default/build/info.json b/v3/internal/templates/_base/default/build/info.json
new file mode 100644
index 000000000..1005eb5cb
--- /dev/null
+++ b/v3/internal/templates/_base/default/build/info.json
@@ -0,0 +1,15 @@
+{
+ "fixed": {
+ "file_version": "v1.0.0"
+ },
+ "info": {
+ "0000": {
+ "ProductVersion": "v1.0.0",
+ "CompanyName": "My Company Name",
+ "FileDescription": "A thing that does a thing",
+ "LegalCopyright": "(c) 2023 My Company Name",
+ "ProductName": "My Product Name",
+ "Comments": "This is a comment"
+ }
+ }
+}
\ No newline at end of file
diff --git a/v3/internal/templates/_base/default/frontend/public/wails.png b/v3/internal/templates/_base/default/frontend/public/wails.png
new file mode 100644
index 000000000..8bdf42483
Binary files /dev/null and b/v3/internal/templates/_base/default/frontend/public/wails.png differ
diff --git a/v3/internal/templates/_base/default/go.mod.tmpl b/v3/internal/templates/_base/default/go.mod.tmpl
new file mode 100644
index 000000000..270f8c6d7
--- /dev/null
+++ b/v3/internal/templates/_base/default/go.mod.tmpl
@@ -0,0 +1,13 @@
+module changeme
+
+go 1.19
+
+require github.com/wailsapp/wails/v3 v3.0.0-alpha.0
+
+require (
+ github.com/imdario/mergo v0.3.12 // indirect
+ github.com/leaanthony/slicer v1.5.0 // indirect
+ github.com/wailsapp/mimetype v1.4.1 // indirect
+ github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6 // indirect
+ golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect
+)
diff --git a/v3/internal/templates/_base/default/go.sum.tmpl b/v3/internal/templates/_base/default/go.sum.tmpl
new file mode 100644
index 000000000..29c7b303e
--- /dev/null
+++ b/v3/internal/templates/_base/default/go.sum.tmpl
@@ -0,0 +1,22 @@
+github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
+github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
+github.com/leaanthony/slicer v1.5.0 h1:aHYTN8xbCCLxJmkNKiLB6tgcMARl4eWmH9/F+S/0HtY=
+github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY=
+github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=
+github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs=
+github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o=
+github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6 h1:Wn+nhnS+VytzE0PegUzSh4T3hXJCtggKGD/4U5H9+wQ=
+github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6/go.mod h1:zlNLI0E2c2qA6miiuAHtp0Bac8FaGH0tlhA19OssR/8=
+github.com/wailsapp/wails/v3 v3.0.0-alpha.0 h1:T5gqG98Xr8LBf69oxlPkhpsFD59w2SnqUZk6XHj8Zoc=
+github.com/wailsapp/wails/v3 v3.0.0-alpha.0/go.mod h1:OAfO5bP0TSUvCIHZYc6Dqfow/9RqxzHvYtmhWPpo1c0=
+golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
diff --git a/v3/internal/templates/_base/default/main.tmpl.go b/v3/internal/templates/_base/default/main.tmpl.go
new file mode 100644
index 000000000..ea8f138b8
--- /dev/null
+++ b/v3/internal/templates/_base/default/main.tmpl.go
@@ -0,0 +1,45 @@
+package main
+
+import (
+ "embed"
+ _ "embed"
+ "log"
+
+ "github.com/wailsapp/wails/v3/pkg/options"
+
+ "github.com/wailsapp/wails/v3/pkg/application"
+)
+
+//go:embed frontend/dist
+var assets embed.FS
+
+func main() {
+ app := application.New(options.Application{
+ Name: "{{.ProjectName}}",
+ Description: "A demo of using raw HTML & CSS",
+ Mac: options.Mac{
+ ApplicationShouldTerminateAfterLastWindowClosed: true,
+ },
+ })
+ // Create window
+ app.NewWebviewWindowWithOptions(&options.WebviewWindow{
+ Title: "Plain Bundle",
+ CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
+ Mac: options.MacWindow{
+ InvisibleTitleBarHeight: 50,
+ Backdrop: options.MacBackdropTranslucent,
+ TitleBar: options.TitleBarHiddenInset,
+ },
+
+ URL: "/",
+ Assets: options.Assets{
+ FS: assets,
+ },
+ })
+
+ err := app.Run()
+
+ if err != nil {
+ log.Fatal(err)
+ }
+}
diff --git a/v3/internal/templates/_base/lit-ts/frontend/index.html b/v3/internal/templates/_base/lit-ts/frontend/index.html
new file mode 100644
index 000000000..b4898b214
--- /dev/null
+++ b/v3/internal/templates/_base/lit-ts/frontend/index.html
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+ Wails + Lit + TS
+
+
+
+
+
+ Wails + Lit
+
+
+
diff --git a/v3/internal/templates/_base/lit/frontend/index.html b/v3/internal/templates/_base/lit/frontend/index.html
new file mode 100644
index 000000000..0f030a2f4
--- /dev/null
+++ b/v3/internal/templates/_base/lit/frontend/index.html
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+ Wails + Lit
+
+
+
+
+
+ Wails + Lit
+
+
+
diff --git a/v3/internal/templates/_base/preact-ts/frontend/index.html b/v3/internal/templates/_base/preact-ts/frontend/index.html
new file mode 100644
index 000000000..c467c421b
--- /dev/null
+++ b/v3/internal/templates/_base/preact-ts/frontend/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Wails + Preact + TS
+
+
+
+
+
+
diff --git a/v3/internal/templates/_base/preact/frontend/index.html b/v3/internal/templates/_base/preact/frontend/index.html
new file mode 100644
index 000000000..a3c698def
--- /dev/null
+++ b/v3/internal/templates/_base/preact/frontend/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Wails + Preact
+
+
+
+
+
+
diff --git a/v3/internal/templates/_base/react-swc-ts/frontend/index.html b/v3/internal/templates/_base/react-swc-ts/frontend/index.html
new file mode 100644
index 000000000..44b5c452b
--- /dev/null
+++ b/v3/internal/templates/_base/react-swc-ts/frontend/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Wails + React + TS
+
+
+
+
+
+
diff --git a/v3/internal/templates/_base/react-swc/frontend/index.html b/v3/internal/templates/_base/react-swc/frontend/index.html
new file mode 100644
index 000000000..cc495265c
--- /dev/null
+++ b/v3/internal/templates/_base/react-swc/frontend/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Wails + React
+
+
+
+
+
+
diff --git a/v3/internal/templates/_base/react-ts/frontend/index.html b/v3/internal/templates/_base/react-ts/frontend/index.html
new file mode 100644
index 000000000..44b5c452b
--- /dev/null
+++ b/v3/internal/templates/_base/react-ts/frontend/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Wails + React + TS
+
+
+
+
+
+
diff --git a/v3/internal/templates/_base/react/frontend/index.html b/v3/internal/templates/_base/react/frontend/index.html
new file mode 100644
index 000000000..cc495265c
--- /dev/null
+++ b/v3/internal/templates/_base/react/frontend/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Wails + React
+
+
+
+
+
+
diff --git a/v3/internal/templates/_base/svelte-ts/frontend/index.html b/v3/internal/templates/_base/svelte-ts/frontend/index.html
new file mode 100644
index 000000000..2d5c0f2de
--- /dev/null
+++ b/v3/internal/templates/_base/svelte-ts/frontend/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Wails + Svelte + TS
+
+
+
+
+
+
diff --git a/v3/internal/templates/_base/svelte/frontend/README.md b/v3/internal/templates/_base/svelte/frontend/README.md
new file mode 100644
index 000000000..fd6a7082f
--- /dev/null
+++ b/v3/internal/templates/_base/svelte/frontend/README.md
@@ -0,0 +1 @@
+# Wails + Svelte
\ No newline at end of file
diff --git a/v3/internal/templates/_base/svelte/frontend/index.html b/v3/internal/templates/_base/svelte/frontend/index.html
new file mode 100644
index 000000000..d12bc9069
--- /dev/null
+++ b/v3/internal/templates/_base/svelte/frontend/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Wails + Svelte
+
+
+
+
+
+
diff --git a/v3/internal/templates/_base/svelte/frontend/src/App.svelte b/v3/internal/templates/_base/svelte/frontend/src/App.svelte
new file mode 100644
index 000000000..c677e3838
--- /dev/null
+++ b/v3/internal/templates/_base/svelte/frontend/src/App.svelte
@@ -0,0 +1,45 @@
+
+
+
+
+ Wails + Svelte
+
+
+
+
+
+
+ Check out SvelteKit, the official Svelte app framework powered by Wails!
+
+
+
+ Click on the Wails and Svelte logos to learn more
+
+
+
+
diff --git a/v3/internal/templates/_base/vanilla-ts/frontend/index.html b/v3/internal/templates/_base/vanilla-ts/frontend/index.html
new file mode 100644
index 000000000..8c692073a
--- /dev/null
+++ b/v3/internal/templates/_base/vanilla-ts/frontend/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Wails + TS
+
+
+
+
+
+
diff --git a/v3/internal/templates/_base/vanilla/frontend/index.html b/v3/internal/templates/_base/vanilla/frontend/index.html
new file mode 100644
index 000000000..c4eb3cc44
--- /dev/null
+++ b/v3/internal/templates/_base/vanilla/frontend/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Wails App
+
+
+
+
+
+
diff --git a/v3/internal/templates/_base/vue-ts/frontend/index.html b/v3/internal/templates/_base/vue-ts/frontend/index.html
new file mode 100644
index 000000000..28870032c
--- /dev/null
+++ b/v3/internal/templates/_base/vue-ts/frontend/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Wails + Vue + TS
+
+
+
+
+
+
diff --git a/v3/internal/templates/_base/vue/frontend/index.html b/v3/internal/templates/_base/vue/frontend/index.html
new file mode 100644
index 000000000..5057cc3c1
--- /dev/null
+++ b/v3/internal/templates/_base/vue/frontend/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Wails + Vue
+
+
+
+
+
+
diff --git a/v3/internal/templates/lit-ts/Taskfile.tmpl.yml b/v3/internal/templates/lit-ts/Taskfile.tmpl.yml
new file mode 100644
index 000000000..4d3d4b22d
--- /dev/null
+++ b/v3/internal/templates/lit-ts/Taskfile.tmpl.yml
@@ -0,0 +1,82 @@
+version: '3'
+
+vars:
+ APP_NAME: "{{.ProjectName}}"
+
+tasks:
+
+ pre-build:
+ summary: Pre-build hooks
+
+ post-build:
+ summary: Post-build hooks
+
+ install-frontend-deps:
+ summary: Install frontend dependencies
+ dir: frontend
+ sources:
+ - package.json
+ - package-lock.json
+ generates:
+ - node_modules/*
+ preconditions:
+ - sh: npm version
+ msg: "Looks like npm isn't installed. Npm is part of the Node installer: https://nodejs.org/en/download/"
+ cmds:
+ - npm install
+
+ build-frontend:
+ summary: Build the frontend project
+ dir: frontend
+ deps:
+ - install-frontend-deps
+ cmds:
+ - npm run build
+
+ build:
+ summary: Builds the application
+ cmds:
+ - task: pre-build
+ - task: build-frontend
+ - go build -gcflags=all="-N -l" -o build/bin/{{ "{{.APP_NAME}}" }} main.go
+ - task: post-build
+ env:
+ CGO_CFLAGS: "-mmacosx-version-min=10.13"
+ CGO_LDFLAGS: "-mmacosx-version-min=10.13"
+
+ generate-icons:
+ summary: Generates Windows `.ico` and Mac `.icns` files from an image
+ dir: build
+ cmds:
+ # Generates both .ico and .icns files
+ - wails generate icons -input appicon.png
+
+ build-app-prod-darwin:
+ summary: Creates a production build of the application
+ cmds:
+ - GOOS=darwin GOARCH={{ "{{.ARCH}}" }} go build -tags production -ldflags="-w -s" -o build/bin/{{ "{{.APP_NAME}}" }}
+ env:
+ CGO_CFLAGS: "-mmacosx-version-min=10.13"
+ CGO_LDFLAGS: "-mmacosx-version-min=10.13"
+ vars:
+ ARCH: $GOARCH
+
+
+ create-app-bundle:
+ summary: Builds a `.app` bundle
+ cmds:
+ - mkdir -p {{ "{{.APP_NAME}}" }}.app/Contents/{MacOS,Resources}
+ - cp build/icons.icns {{ "{{.APP_NAME}}" }}.app/Contents/Resources
+ - cp build/bin/{{ "{{.APP_NAME}}" }} {{ "{{.APP_NAME}}" }}.app/Contents/MacOS
+ - cp build/Info.plist {{ "{{.APP_NAME}}" }}.app/Contents
+
+ package-darwin-arm64:
+ summary: Packages a production build of the application into a `.app` bundle
+ platform: darwin
+ deps:
+ - task: build-app-prod-darwin
+ vars:
+ ARCH: arm64
+ - generate-icons
+ cmds:
+ - task: create-app-bundle
\ No newline at end of file
diff --git a/v3/internal/templates/lit-ts/build/Info.plist.tmpl b/v3/internal/templates/lit-ts/build/Info.plist.tmpl
new file mode 100644
index 000000000..93d9a5bf1
--- /dev/null
+++ b/v3/internal/templates/lit-ts/build/Info.plist.tmpl
@@ -0,0 +1,27 @@
+
+
+
+ CFBundlePackageType
+ APPL
+ CFBundleName
+ {{ "{{.Info.ProductName}}" }}
+ CFBundleExecutable
+ {{ "{{.ProjectName}}" }}
+ CFBundleIdentifier
+ com.wails.{{ "{{.ProjectName}}" }}
+ CFBundleVersion
+ v1.0.0
+ CFBundleGetInfoString
+ This is a comment
+ CFBundleShortVersionString
+ v1.0.0
+ CFBundleIconFile
+ iconfile
+ LSMinimumSystemVersion
+ 10.13.0
+ NSHighResolutionCapable
+ true
+ NSHumanReadableCopyright
+ (c) 2023 My Company Name
+
+
\ No newline at end of file
diff --git a/v3/internal/templates/lit-ts/build/appicon.png b/v3/internal/templates/lit-ts/build/appicon.png
new file mode 100644
index 000000000..63617fe4f
Binary files /dev/null and b/v3/internal/templates/lit-ts/build/appicon.png differ
diff --git a/v3/internal/templates/lit-ts/build/info.json b/v3/internal/templates/lit-ts/build/info.json
new file mode 100644
index 000000000..1005eb5cb
--- /dev/null
+++ b/v3/internal/templates/lit-ts/build/info.json
@@ -0,0 +1,15 @@
+{
+ "fixed": {
+ "file_version": "v1.0.0"
+ },
+ "info": {
+ "0000": {
+ "ProductVersion": "v1.0.0",
+ "CompanyName": "My Company Name",
+ "FileDescription": "A thing that does a thing",
+ "LegalCopyright": "(c) 2023 My Company Name",
+ "ProductName": "My Product Name",
+ "Comments": "This is a comment"
+ }
+ }
+}
\ No newline at end of file
diff --git a/v3/internal/templates/lit-ts/frontend/.gitignore b/v3/internal/templates/lit-ts/frontend/.gitignore
new file mode 100644
index 000000000..a547bf36d
--- /dev/null
+++ b/v3/internal/templates/lit-ts/frontend/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/v3/internal/templates/lit-ts/frontend/index.html b/v3/internal/templates/lit-ts/frontend/index.html
new file mode 100644
index 000000000..ca539730d
--- /dev/null
+++ b/v3/internal/templates/lit-ts/frontend/index.html
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+ Wails + Lit + TS
+
+
+
+
+
+ Wails + Lit
+
+
+
diff --git a/v3/internal/templates/lit-ts/frontend/package.json b/v3/internal/templates/lit-ts/frontend/package.json
new file mode 100644
index 000000000..42a86bd4b
--- /dev/null
+++ b/v3/internal/templates/lit-ts/frontend/package.json
@@ -0,0 +1,26 @@
+{
+ "name": "frontend",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "main": "dist/my-element.es.js",
+ "exports": {
+ ".": "./dist/my-element.es.js"
+ },
+ "types": "types/my-element.d.ts",
+ "files": [
+ "dist",
+ "types"
+ ],
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc && vite build"
+ },
+ "dependencies": {
+ "lit": "^2.4.1"
+ },
+ "devDependencies": {
+ "typescript": "^4.9.3",
+ "vite": "^4.0.0"
+ }
+}
\ No newline at end of file
diff --git a/v3/internal/templates/lit-ts/frontend/public/wails.png b/v3/internal/templates/lit-ts/frontend/public/wails.png
new file mode 100644
index 000000000..8bdf42483
Binary files /dev/null and b/v3/internal/templates/lit-ts/frontend/public/wails.png differ
diff --git a/v3/internal/templates/lit-ts/frontend/src/assets/lit.svg b/v3/internal/templates/lit-ts/frontend/src/assets/lit.svg
new file mode 100644
index 000000000..4a9c1fe66
--- /dev/null
+++ b/v3/internal/templates/lit-ts/frontend/src/assets/lit.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/v3/internal/templates/lit-ts/frontend/src/index.css b/v3/internal/templates/lit-ts/frontend/src/index.css
new file mode 100644
index 000000000..d39ac2e34
--- /dev/null
+++ b/v3/internal/templates/lit-ts/frontend/src/index.css
@@ -0,0 +1,40 @@
+:root {
+ font-family: Inter, Avenir, Helvetica, Arial, sans-serif;
+ font-size: 16px;
+ line-height: 24px;
+ font-weight: 400;
+
+ color-scheme: light dark;
+ color: rgba(255, 255, 255, 0.87);
+ background-color: #242424;
+
+ font-synthesis: none;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-text-size-adjust: 100%;
+}
+
+a {
+ font-weight: 500;
+ color: #646cff;
+ text-decoration: inherit;
+}
+a:hover {
+ color: #535bf2;
+}
+
+body {
+ margin: 0;
+ display: flex;
+ place-items: center;
+ min-width: 320px;
+ min-height: 100vh;
+}
+
+@media (prefers-color-scheme: light) {
+ :root {
+ color: #213547;
+ background-color: #ffffff;
+ }
+}
diff --git a/v3/internal/templates/lit-ts/frontend/src/my-element.ts b/v3/internal/templates/lit-ts/frontend/src/my-element.ts
new file mode 100644
index 000000000..9f1c76e89
--- /dev/null
+++ b/v3/internal/templates/lit-ts/frontend/src/my-element.ts
@@ -0,0 +1,125 @@
+import { LitElement, css, html } from 'lit'
+import { customElement, property } from 'lit/decorators.js'
+import litLogo from './assets/lit.svg'
+
+/**
+ * An example element.
+ *
+ * @slot - This element has a slot
+ * @csspart button - The button
+ */
+@customElement('my-element')
+export class MyElement extends LitElement {
+ /**
+ * Copy for the read the docs hint.
+ */
+ @property()
+ docsHint = 'Click on the Wails and Lit logos to learn more'
+
+ /**
+ * The number of times the button has been clicked.
+ */
+ @property({ type: Number })
+ count = 0
+
+ render() {
+ return html`
+
+
+
+
+
+ ${this.docsHint}
+ `
+ }
+
+ private _onClick() {
+ this.count++
+ }
+
+ static styles = css`
+ :host {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+ text-align: center;
+ }
+
+ .logo {
+ height: 6em;
+ padding: 1.5em;
+ will-change: filter;
+ }
+ .logo:hover {
+ filter: drop-shadow(0 0 2em #646cffaa);
+ }
+ .logo.lit:hover {
+ filter: drop-shadow(0 0 2em #325cffaa);
+ }
+
+ .card {
+ padding: 2em;
+ }
+
+ .read-the-docs {
+ color: #888;
+ }
+
+ h1 {
+ font-size: 3.2em;
+ line-height: 1.1;
+ }
+
+ a {
+ font-weight: 500;
+ color: #646cff;
+ text-decoration: inherit;
+ }
+ a:hover {
+ color: #535bf2;
+ }
+
+ button {
+ border-radius: 8px;
+ border: 1px solid transparent;
+ padding: 0.6em 1.2em;
+ font-size: 1em;
+ font-weight: 500;
+ font-family: inherit;
+ background-color: #1a1a1a;
+ cursor: pointer;
+ transition: border-color 0.25s;
+ }
+ button:hover {
+ border-color: #646cff;
+ }
+ button:focus,
+ button:focus-visible {
+ outline: 4px auto -webkit-focus-ring-color;
+ }
+
+ @media (prefers-color-scheme: light) {
+ a:hover {
+ color: #747bff;
+ }
+ button {
+ background-color: #f9f9f9;
+ }
+ }
+ `
+}
+
+declare global {
+ interface HTMLElementTagNameMap {
+ 'my-element': MyElement
+ }
+}
diff --git a/v3/internal/templates/lit-ts/frontend/src/vite-env.d.ts b/v3/internal/templates/lit-ts/frontend/src/vite-env.d.ts
new file mode 100644
index 000000000..11f02fe2a
--- /dev/null
+++ b/v3/internal/templates/lit-ts/frontend/src/vite-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/v3/internal/templates/lit-ts/frontend/tsconfig.json b/v3/internal/templates/lit-ts/frontend/tsconfig.json
new file mode 100644
index 000000000..b080b2b2c
--- /dev/null
+++ b/v3/internal/templates/lit-ts/frontend/tsconfig.json
@@ -0,0 +1,23 @@
+{
+ "compilerOptions": {
+ "module": "ESNext",
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
+ "declaration": true,
+ "emitDeclarationOnly": true,
+ "outDir": "./types",
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noImplicitReturns": true,
+ "noFallthroughCasesInSwitch": true,
+ "moduleResolution": "Node",
+ "isolatedModules": true,
+ "allowSyntheticDefaultImports": true,
+ "experimentalDecorators": true,
+ "forceConsistentCasingInFileNames": true,
+ "useDefineForClassFields": false,
+ "skipLibCheck": true
+ },
+ "include": ["src/**/*.ts"],
+ "references": [{ "path": "./tsconfig.node.json" }]
+}
diff --git a/v3/internal/templates/lit-ts/frontend/tsconfig.node.json b/v3/internal/templates/lit-ts/frontend/tsconfig.node.json
new file mode 100644
index 000000000..9d31e2aed
--- /dev/null
+++ b/v3/internal/templates/lit-ts/frontend/tsconfig.node.json
@@ -0,0 +1,9 @@
+{
+ "compilerOptions": {
+ "composite": true,
+ "module": "ESNext",
+ "moduleResolution": "Node",
+ "allowSyntheticDefaultImports": true
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/v3/internal/templates/lit-ts/frontend/vite.config.ts b/v3/internal/templates/lit-ts/frontend/vite.config.ts
new file mode 100644
index 000000000..fe69491e3
--- /dev/null
+++ b/v3/internal/templates/lit-ts/frontend/vite.config.ts
@@ -0,0 +1,14 @@
+import { defineConfig } from 'vite'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ build: {
+ lib: {
+ entry: 'src/my-element.ts',
+ formats: ['es'],
+ },
+ rollupOptions: {
+ external: /^lit/,
+ },
+ },
+})
diff --git a/v3/internal/templates/lit-ts/go.mod.tmpl b/v3/internal/templates/lit-ts/go.mod.tmpl
new file mode 100644
index 000000000..270f8c6d7
--- /dev/null
+++ b/v3/internal/templates/lit-ts/go.mod.tmpl
@@ -0,0 +1,13 @@
+module changeme
+
+go 1.19
+
+require github.com/wailsapp/wails/v3 v3.0.0-alpha.0
+
+require (
+ github.com/imdario/mergo v0.3.12 // indirect
+ github.com/leaanthony/slicer v1.5.0 // indirect
+ github.com/wailsapp/mimetype v1.4.1 // indirect
+ github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6 // indirect
+ golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect
+)
diff --git a/v3/internal/templates/lit-ts/go.sum.tmpl b/v3/internal/templates/lit-ts/go.sum.tmpl
new file mode 100644
index 000000000..29c7b303e
--- /dev/null
+++ b/v3/internal/templates/lit-ts/go.sum.tmpl
@@ -0,0 +1,22 @@
+github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
+github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
+github.com/leaanthony/slicer v1.5.0 h1:aHYTN8xbCCLxJmkNKiLB6tgcMARl4eWmH9/F+S/0HtY=
+github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY=
+github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=
+github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs=
+github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o=
+github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6 h1:Wn+nhnS+VytzE0PegUzSh4T3hXJCtggKGD/4U5H9+wQ=
+github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6/go.mod h1:zlNLI0E2c2qA6miiuAHtp0Bac8FaGH0tlhA19OssR/8=
+github.com/wailsapp/wails/v3 v3.0.0-alpha.0 h1:T5gqG98Xr8LBf69oxlPkhpsFD59w2SnqUZk6XHj8Zoc=
+github.com/wailsapp/wails/v3 v3.0.0-alpha.0/go.mod h1:OAfO5bP0TSUvCIHZYc6Dqfow/9RqxzHvYtmhWPpo1c0=
+golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
diff --git a/v3/internal/templates/lit-ts/main.tmpl.go b/v3/internal/templates/lit-ts/main.tmpl.go
new file mode 100644
index 000000000..ea8f138b8
--- /dev/null
+++ b/v3/internal/templates/lit-ts/main.tmpl.go
@@ -0,0 +1,45 @@
+package main
+
+import (
+ "embed"
+ _ "embed"
+ "log"
+
+ "github.com/wailsapp/wails/v3/pkg/options"
+
+ "github.com/wailsapp/wails/v3/pkg/application"
+)
+
+//go:embed frontend/dist
+var assets embed.FS
+
+func main() {
+ app := application.New(options.Application{
+ Name: "{{.ProjectName}}",
+ Description: "A demo of using raw HTML & CSS",
+ Mac: options.Mac{
+ ApplicationShouldTerminateAfterLastWindowClosed: true,
+ },
+ })
+ // Create window
+ app.NewWebviewWindowWithOptions(&options.WebviewWindow{
+ Title: "Plain Bundle",
+ CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
+ Mac: options.MacWindow{
+ InvisibleTitleBarHeight: 50,
+ Backdrop: options.MacBackdropTranslucent,
+ TitleBar: options.TitleBarHiddenInset,
+ },
+
+ URL: "/",
+ Assets: options.Assets{
+ FS: assets,
+ },
+ })
+
+ err := app.Run()
+
+ if err != nil {
+ log.Fatal(err)
+ }
+}
diff --git a/v3/internal/templates/lit/Taskfile.tmpl.yml b/v3/internal/templates/lit/Taskfile.tmpl.yml
new file mode 100644
index 000000000..4d3d4b22d
--- /dev/null
+++ b/v3/internal/templates/lit/Taskfile.tmpl.yml
@@ -0,0 +1,82 @@
+version: '3'
+
+vars:
+ APP_NAME: "{{.ProjectName}}"
+
+tasks:
+
+ pre-build:
+ summary: Pre-build hooks
+
+ post-build:
+ summary: Post-build hooks
+
+ install-frontend-deps:
+ summary: Install frontend dependencies
+ dir: frontend
+ sources:
+ - package.json
+ - package-lock.json
+ generates:
+ - node_modules/*
+ preconditions:
+ - sh: npm version
+ msg: "Looks like npm isn't installed. Npm is part of the Node installer: https://nodejs.org/en/download/"
+ cmds:
+ - npm install
+
+ build-frontend:
+ summary: Build the frontend project
+ dir: frontend
+ deps:
+ - install-frontend-deps
+ cmds:
+ - npm run build
+
+ build:
+ summary: Builds the application
+ cmds:
+ - task: pre-build
+ - task: build-frontend
+ - go build -gcflags=all="-N -l" -o build/bin/{{ "{{.APP_NAME}}" }} main.go
+ - task: post-build
+ env:
+ CGO_CFLAGS: "-mmacosx-version-min=10.13"
+ CGO_LDFLAGS: "-mmacosx-version-min=10.13"
+
+ generate-icons:
+ summary: Generates Windows `.ico` and Mac `.icns` files from an image
+ dir: build
+ cmds:
+ # Generates both .ico and .icns files
+ - wails generate icons -input appicon.png
+
+ build-app-prod-darwin:
+ summary: Creates a production build of the application
+ cmds:
+ - GOOS=darwin GOARCH={{ "{{.ARCH}}" }} go build -tags production -ldflags="-w -s" -o build/bin/{{ "{{.APP_NAME}}" }}
+ env:
+ CGO_CFLAGS: "-mmacosx-version-min=10.13"
+ CGO_LDFLAGS: "-mmacosx-version-min=10.13"
+ vars:
+ ARCH: $GOARCH
+
+
+ create-app-bundle:
+ summary: Builds a `.app` bundle
+ cmds:
+ - mkdir -p {{ "{{.APP_NAME}}" }}.app/Contents/{MacOS,Resources}
+ - cp build/icons.icns {{ "{{.APP_NAME}}" }}.app/Contents/Resources
+ - cp build/bin/{{ "{{.APP_NAME}}" }} {{ "{{.APP_NAME}}" }}.app/Contents/MacOS
+ - cp build/Info.plist {{ "{{.APP_NAME}}" }}.app/Contents
+
+ package-darwin-arm64:
+ summary: Packages a production build of the application into a `.app` bundle
+ platform: darwin
+ deps:
+ - task: build-app-prod-darwin
+ vars:
+ ARCH: arm64
+ - generate-icons
+ cmds:
+ - task: create-app-bundle
\ No newline at end of file
diff --git a/v3/internal/templates/lit/build/Info.plist.tmpl b/v3/internal/templates/lit/build/Info.plist.tmpl
new file mode 100644
index 000000000..93d9a5bf1
--- /dev/null
+++ b/v3/internal/templates/lit/build/Info.plist.tmpl
@@ -0,0 +1,27 @@
+
+
+
+ CFBundlePackageType
+ APPL
+ CFBundleName
+ {{ "{{.Info.ProductName}}" }}
+ CFBundleExecutable
+ {{ "{{.ProjectName}}" }}
+ CFBundleIdentifier
+ com.wails.{{ "{{.ProjectName}}" }}
+ CFBundleVersion
+ v1.0.0
+ CFBundleGetInfoString
+ This is a comment
+ CFBundleShortVersionString
+ v1.0.0
+ CFBundleIconFile
+ iconfile
+ LSMinimumSystemVersion
+ 10.13.0
+ NSHighResolutionCapable
+ true
+ NSHumanReadableCopyright
+ (c) 2023 My Company Name
+
+
\ No newline at end of file
diff --git a/v3/internal/templates/lit/build/appicon.png b/v3/internal/templates/lit/build/appicon.png
new file mode 100644
index 000000000..63617fe4f
Binary files /dev/null and b/v3/internal/templates/lit/build/appicon.png differ
diff --git a/v3/internal/templates/lit/build/info.json b/v3/internal/templates/lit/build/info.json
new file mode 100644
index 000000000..1005eb5cb
--- /dev/null
+++ b/v3/internal/templates/lit/build/info.json
@@ -0,0 +1,15 @@
+{
+ "fixed": {
+ "file_version": "v1.0.0"
+ },
+ "info": {
+ "0000": {
+ "ProductVersion": "v1.0.0",
+ "CompanyName": "My Company Name",
+ "FileDescription": "A thing that does a thing",
+ "LegalCopyright": "(c) 2023 My Company Name",
+ "ProductName": "My Product Name",
+ "Comments": "This is a comment"
+ }
+ }
+}
\ No newline at end of file
diff --git a/v3/internal/templates/lit/frontend/.gitignore b/v3/internal/templates/lit/frontend/.gitignore
new file mode 100644
index 000000000..a547bf36d
--- /dev/null
+++ b/v3/internal/templates/lit/frontend/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/v3/internal/templates/lit/frontend/index.html b/v3/internal/templates/lit/frontend/index.html
new file mode 100644
index 000000000..9da997ad7
--- /dev/null
+++ b/v3/internal/templates/lit/frontend/index.html
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+ Wails + Lit
+
+
+
+
+
+ Wails + Lit
+
+
+
diff --git a/v3/internal/templates/lit/frontend/package.json b/v3/internal/templates/lit/frontend/package.json
new file mode 100644
index 000000000..1c4979def
--- /dev/null
+++ b/v3/internal/templates/lit/frontend/package.json
@@ -0,0 +1,23 @@
+{
+ "name": "frontend",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "main": "dist/my-element.es.js",
+ "exports": {
+ ".": "./dist/my-element.es.js"
+ },
+ "files": [
+ "dist"
+ ],
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build"
+ },
+ "dependencies": {
+ "lit": "^2.4.1"
+ },
+ "devDependencies": {
+ "vite": "^4.0.0"
+ }
+}
\ No newline at end of file
diff --git a/v3/internal/templates/lit/frontend/public/wails.png b/v3/internal/templates/lit/frontend/public/wails.png
new file mode 100644
index 000000000..8bdf42483
Binary files /dev/null and b/v3/internal/templates/lit/frontend/public/wails.png differ
diff --git a/v3/internal/templates/lit/frontend/src/assets/lit.svg b/v3/internal/templates/lit/frontend/src/assets/lit.svg
new file mode 100644
index 000000000..4a9c1fe66
--- /dev/null
+++ b/v3/internal/templates/lit/frontend/src/assets/lit.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/v3/internal/templates/lit/frontend/src/index.css b/v3/internal/templates/lit/frontend/src/index.css
new file mode 100644
index 000000000..b52d4c639
--- /dev/null
+++ b/v3/internal/templates/lit/frontend/src/index.css
@@ -0,0 +1,31 @@
+:root {
+ font-family: Inter, Avenir, Helvetica, Arial, sans-serif;
+ font-size: 16px;
+ line-height: 24px;
+ font-weight: 400;
+
+ color-scheme: light dark;
+ color: rgba(255, 255, 255, 0.87);
+ background-color: #242424;
+
+ font-synthesis: none;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-text-size-adjust: 100%;
+}
+
+body {
+ margin: 0;
+ display: flex;
+ place-items: center;
+ min-width: 320px;
+ min-height: 100vh;
+}
+
+@media (prefers-color-scheme: light) {
+ :root {
+ color: #213547;
+ background-color: #ffffff;
+ }
+}
diff --git a/v3/internal/templates/lit/frontend/src/my-element.js b/v3/internal/templates/lit/frontend/src/my-element.js
new file mode 100644
index 000000000..515f8fa58
--- /dev/null
+++ b/v3/internal/templates/lit/frontend/src/my-element.js
@@ -0,0 +1,129 @@
+import { LitElement, css, html } from 'lit'
+import litLogo from './assets/lit.svg'
+
+/**
+ * An example element.
+ *
+ * @slot - This element has a slot
+ * @csspart button - The button
+ */
+export class MyElement extends LitElement {
+ static get properties() {
+ return {
+ /**
+ * Copy for the read the docs hint.
+ */
+ docsHint: { type: String },
+
+ /**
+ * The number of times the button has been clicked.
+ */
+ count: { type: Number },
+ }
+ }
+
+ constructor() {
+ super()
+ this.docsHint = 'Click on the Wails and Lit logos to learn more'
+ this.count = 0
+ }
+
+ render() {
+ return html`
+
+
+
+
+
+ ${this.docsHint}
+ `
+ }
+
+ _onClick() {
+ this.count++
+ }
+
+ static get styles() {
+ return css`
+ :host {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+ text-align: center;
+ }
+
+ .logo {
+ height: 6em;
+ padding: 1.5em;
+ will-change: filter;
+ }
+ .logo:hover {
+ filter: drop-shadow(0 0 2em #646cffaa);
+ }
+ .logo.lit:hover {
+ filter: drop-shadow(0 0 2em #325cffaa);
+ }
+
+ .card {
+ padding: 2em;
+ }
+
+ .read-the-docs {
+ color: #888;
+ }
+
+ a {
+ font-weight: 500;
+ color: #646cff;
+ text-decoration: inherit;
+ }
+ a:hover {
+ color: #535bf2;
+ }
+
+ h1 {
+ font-size: 3.2em;
+ line-height: 1.1;
+ }
+
+ button {
+ border-radius: 8px;
+ border: 1px solid transparent;
+ padding: 0.6em 1.2em;
+ font-size: 1em;
+ font-weight: 500;
+ font-family: inherit;
+ background-color: #1a1a1a;
+ cursor: pointer;
+ transition: border-color 0.25s;
+ }
+ button:hover {
+ border-color: #646cff;
+ }
+ button:focus,
+ button:focus-visible {
+ outline: 4px auto -webkit-focus-ring-color;
+ }
+
+ @media (prefers-color-scheme: light) {
+ a:hover {
+ color: #747bff;
+ }
+ button {
+ background-color: #f9f9f9;
+ }
+ }
+ `
+ }
+}
+
+window.customElements.define('my-element', MyElement)
diff --git a/v3/internal/templates/lit/frontend/vite.config.js b/v3/internal/templates/lit/frontend/vite.config.js
new file mode 100644
index 000000000..3847c1f38
--- /dev/null
+++ b/v3/internal/templates/lit/frontend/vite.config.js
@@ -0,0 +1,14 @@
+import { defineConfig } from 'vite'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ build: {
+ lib: {
+ entry: 'src/my-element.js',
+ formats: ['es'],
+ },
+ rollupOptions: {
+ external: /^lit/,
+ },
+ },
+})
diff --git a/v3/internal/templates/lit/go.mod.tmpl b/v3/internal/templates/lit/go.mod.tmpl
new file mode 100644
index 000000000..270f8c6d7
--- /dev/null
+++ b/v3/internal/templates/lit/go.mod.tmpl
@@ -0,0 +1,13 @@
+module changeme
+
+go 1.19
+
+require github.com/wailsapp/wails/v3 v3.0.0-alpha.0
+
+require (
+ github.com/imdario/mergo v0.3.12 // indirect
+ github.com/leaanthony/slicer v1.5.0 // indirect
+ github.com/wailsapp/mimetype v1.4.1 // indirect
+ github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6 // indirect
+ golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect
+)
diff --git a/v3/internal/templates/lit/go.sum.tmpl b/v3/internal/templates/lit/go.sum.tmpl
new file mode 100644
index 000000000..29c7b303e
--- /dev/null
+++ b/v3/internal/templates/lit/go.sum.tmpl
@@ -0,0 +1,22 @@
+github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
+github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
+github.com/leaanthony/slicer v1.5.0 h1:aHYTN8xbCCLxJmkNKiLB6tgcMARl4eWmH9/F+S/0HtY=
+github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY=
+github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=
+github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs=
+github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o=
+github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6 h1:Wn+nhnS+VytzE0PegUzSh4T3hXJCtggKGD/4U5H9+wQ=
+github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6/go.mod h1:zlNLI0E2c2qA6miiuAHtp0Bac8FaGH0tlhA19OssR/8=
+github.com/wailsapp/wails/v3 v3.0.0-alpha.0 h1:T5gqG98Xr8LBf69oxlPkhpsFD59w2SnqUZk6XHj8Zoc=
+github.com/wailsapp/wails/v3 v3.0.0-alpha.0/go.mod h1:OAfO5bP0TSUvCIHZYc6Dqfow/9RqxzHvYtmhWPpo1c0=
+golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
diff --git a/v3/internal/templates/lit/main.tmpl.go b/v3/internal/templates/lit/main.tmpl.go
new file mode 100644
index 000000000..ea8f138b8
--- /dev/null
+++ b/v3/internal/templates/lit/main.tmpl.go
@@ -0,0 +1,45 @@
+package main
+
+import (
+ "embed"
+ _ "embed"
+ "log"
+
+ "github.com/wailsapp/wails/v3/pkg/options"
+
+ "github.com/wailsapp/wails/v3/pkg/application"
+)
+
+//go:embed frontend/dist
+var assets embed.FS
+
+func main() {
+ app := application.New(options.Application{
+ Name: "{{.ProjectName}}",
+ Description: "A demo of using raw HTML & CSS",
+ Mac: options.Mac{
+ ApplicationShouldTerminateAfterLastWindowClosed: true,
+ },
+ })
+ // Create window
+ app.NewWebviewWindowWithOptions(&options.WebviewWindow{
+ Title: "Plain Bundle",
+ CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
+ Mac: options.MacWindow{
+ InvisibleTitleBarHeight: 50,
+ Backdrop: options.MacBackdropTranslucent,
+ TitleBar: options.TitleBarHiddenInset,
+ },
+
+ URL: "/",
+ Assets: options.Assets{
+ FS: assets,
+ },
+ })
+
+ err := app.Run()
+
+ if err != nil {
+ log.Fatal(err)
+ }
+}
diff --git a/v3/internal/templates/preact-ts/Taskfile.tmpl.yml b/v3/internal/templates/preact-ts/Taskfile.tmpl.yml
new file mode 100644
index 000000000..4d3d4b22d
--- /dev/null
+++ b/v3/internal/templates/preact-ts/Taskfile.tmpl.yml
@@ -0,0 +1,82 @@
+version: '3'
+
+vars:
+ APP_NAME: "{{.ProjectName}}"
+
+tasks:
+
+ pre-build:
+ summary: Pre-build hooks
+
+ post-build:
+ summary: Post-build hooks
+
+ install-frontend-deps:
+ summary: Install frontend dependencies
+ dir: frontend
+ sources:
+ - package.json
+ - package-lock.json
+ generates:
+ - node_modules/*
+ preconditions:
+ - sh: npm version
+ msg: "Looks like npm isn't installed. Npm is part of the Node installer: https://nodejs.org/en/download/"
+ cmds:
+ - npm install
+
+ build-frontend:
+ summary: Build the frontend project
+ dir: frontend
+ deps:
+ - install-frontend-deps
+ cmds:
+ - npm run build
+
+ build:
+ summary: Builds the application
+ cmds:
+ - task: pre-build
+ - task: build-frontend
+ - go build -gcflags=all="-N -l" -o build/bin/{{ "{{.APP_NAME}}" }} main.go
+ - task: post-build
+ env:
+ CGO_CFLAGS: "-mmacosx-version-min=10.13"
+ CGO_LDFLAGS: "-mmacosx-version-min=10.13"
+
+ generate-icons:
+ summary: Generates Windows `.ico` and Mac `.icns` files from an image
+ dir: build
+ cmds:
+ # Generates both .ico and .icns files
+ - wails generate icons -input appicon.png
+
+ build-app-prod-darwin:
+ summary: Creates a production build of the application
+ cmds:
+ - GOOS=darwin GOARCH={{ "{{.ARCH}}" }} go build -tags production -ldflags="-w -s" -o build/bin/{{ "{{.APP_NAME}}" }}
+ env:
+ CGO_CFLAGS: "-mmacosx-version-min=10.13"
+ CGO_LDFLAGS: "-mmacosx-version-min=10.13"
+ vars:
+ ARCH: $GOARCH
+
+
+ create-app-bundle:
+ summary: Builds a `.app` bundle
+ cmds:
+ - mkdir -p {{ "{{.APP_NAME}}" }}.app/Contents/{MacOS,Resources}
+ - cp build/icons.icns {{ "{{.APP_NAME}}" }}.app/Contents/Resources
+ - cp build/bin/{{ "{{.APP_NAME}}" }} {{ "{{.APP_NAME}}" }}.app/Contents/MacOS
+ - cp build/Info.plist {{ "{{.APP_NAME}}" }}.app/Contents
+
+ package-darwin-arm64:
+ summary: Packages a production build of the application into a `.app` bundle
+ platform: darwin
+ deps:
+ - task: build-app-prod-darwin
+ vars:
+ ARCH: arm64
+ - generate-icons
+ cmds:
+ - task: create-app-bundle
\ No newline at end of file
diff --git a/v3/internal/templates/preact-ts/build/Info.plist.tmpl b/v3/internal/templates/preact-ts/build/Info.plist.tmpl
new file mode 100644
index 000000000..93d9a5bf1
--- /dev/null
+++ b/v3/internal/templates/preact-ts/build/Info.plist.tmpl
@@ -0,0 +1,27 @@
+
+
+
+ CFBundlePackageType
+ APPL
+ CFBundleName
+ {{ "{{.Info.ProductName}}" }}
+ CFBundleExecutable
+ {{ "{{.ProjectName}}" }}
+ CFBundleIdentifier
+ com.wails.{{ "{{.ProjectName}}" }}
+ CFBundleVersion
+ v1.0.0
+ CFBundleGetInfoString
+ This is a comment
+ CFBundleShortVersionString
+ v1.0.0
+ CFBundleIconFile
+ iconfile
+ LSMinimumSystemVersion
+ 10.13.0
+ NSHighResolutionCapable
+ true
+ NSHumanReadableCopyright
+ (c) 2023 My Company Name
+
+
\ No newline at end of file
diff --git a/v3/internal/templates/preact-ts/build/appicon.png b/v3/internal/templates/preact-ts/build/appicon.png
new file mode 100644
index 000000000..63617fe4f
Binary files /dev/null and b/v3/internal/templates/preact-ts/build/appicon.png differ
diff --git a/v3/internal/templates/preact-ts/build/info.json b/v3/internal/templates/preact-ts/build/info.json
new file mode 100644
index 000000000..1005eb5cb
--- /dev/null
+++ b/v3/internal/templates/preact-ts/build/info.json
@@ -0,0 +1,15 @@
+{
+ "fixed": {
+ "file_version": "v1.0.0"
+ },
+ "info": {
+ "0000": {
+ "ProductVersion": "v1.0.0",
+ "CompanyName": "My Company Name",
+ "FileDescription": "A thing that does a thing",
+ "LegalCopyright": "(c) 2023 My Company Name",
+ "ProductName": "My Product Name",
+ "Comments": "This is a comment"
+ }
+ }
+}
\ No newline at end of file
diff --git a/v3/internal/templates/preact-ts/frontend/.gitignore b/v3/internal/templates/preact-ts/frontend/.gitignore
new file mode 100644
index 000000000..a547bf36d
--- /dev/null
+++ b/v3/internal/templates/preact-ts/frontend/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/v3/internal/templates/preact-ts/frontend/index.html b/v3/internal/templates/preact-ts/frontend/index.html
new file mode 100644
index 000000000..9270ebd4e
--- /dev/null
+++ b/v3/internal/templates/preact-ts/frontend/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Wails + Preact + TS
+
+
+
+
+
+
diff --git a/v3/internal/templates/preact-ts/frontend/package.json b/v3/internal/templates/preact-ts/frontend/package.json
new file mode 100644
index 000000000..cab9db654
--- /dev/null
+++ b/v3/internal/templates/preact-ts/frontend/package.json
@@ -0,0 +1,19 @@
+{
+ "name": "frontend",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc && vite build",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "preact": "^10.11.3"
+ },
+ "devDependencies": {
+ "@preact/preset-vite": "^2.4.0",
+ "typescript": "^4.9.3",
+ "vite": "^4.0.0"
+ }
+}
\ No newline at end of file
diff --git a/v3/internal/templates/preact-ts/frontend/public/wails.png b/v3/internal/templates/preact-ts/frontend/public/wails.png
new file mode 100644
index 000000000..8bdf42483
Binary files /dev/null and b/v3/internal/templates/preact-ts/frontend/public/wails.png differ
diff --git a/v3/internal/templates/preact-ts/frontend/src/app.css b/v3/internal/templates/preact-ts/frontend/src/app.css
new file mode 100644
index 000000000..088ed3ace
--- /dev/null
+++ b/v3/internal/templates/preact-ts/frontend/src/app.css
@@ -0,0 +1,25 @@
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+ text-align: center;
+}
+
+.logo {
+ height: 6em;
+ padding: 1.5em;
+}
+.logo:hover {
+ filter: drop-shadow(0 0 2em #646cffaa);
+}
+.logo.preact:hover {
+ filter: drop-shadow(0 0 2em #673ab8aa);
+}
+
+.card {
+ padding: 2em;
+}
+
+.read-the-docs {
+ color: #888;
+}
diff --git a/v3/internal/templates/preact-ts/frontend/src/app.tsx b/v3/internal/templates/preact-ts/frontend/src/app.tsx
new file mode 100644
index 000000000..ccde5b9f3
--- /dev/null
+++ b/v3/internal/templates/preact-ts/frontend/src/app.tsx
@@ -0,0 +1,32 @@
+import { useState } from 'preact/hooks'
+import preactLogo from './assets/preact.svg'
+import './app.css'
+
+export function App() {
+ const [count, setCount] = useState(0)
+
+ return (
+ <>
+
+ Vite + Preact
+
+
+
+ Edit src/app.tsx
and save to test HMR
+
+
+
+ Click on the Vite and Preact logos to learn more
+
+ >
+ )
+}
diff --git a/v3/internal/templates/preact-ts/frontend/src/assets/preact.svg b/v3/internal/templates/preact-ts/frontend/src/assets/preact.svg
new file mode 100644
index 000000000..908f17def
--- /dev/null
+++ b/v3/internal/templates/preact-ts/frontend/src/assets/preact.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/v3/internal/templates/preact-ts/frontend/src/index.css b/v3/internal/templates/preact-ts/frontend/src/index.css
new file mode 100644
index 000000000..917888c1d
--- /dev/null
+++ b/v3/internal/templates/preact-ts/frontend/src/index.css
@@ -0,0 +1,70 @@
+:root {
+ font-family: Inter, Avenir, Helvetica, Arial, sans-serif;
+ font-size: 16px;
+ line-height: 24px;
+ font-weight: 400;
+
+ color-scheme: light dark;
+ color: rgba(255, 255, 255, 0.87);
+ background-color: #242424;
+
+ font-synthesis: none;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-text-size-adjust: 100%;
+}
+
+a {
+ font-weight: 500;
+ color: #646cff;
+ text-decoration: inherit;
+}
+a:hover {
+ color: #535bf2;
+}
+
+body {
+ margin: 0;
+ display: flex;
+ place-items: center;
+ min-width: 320px;
+ min-height: 100vh;
+}
+
+h1 {
+ font-size: 3.2em;
+ line-height: 1.1;
+}
+
+button {
+ border-radius: 8px;
+ border: 1px solid transparent;
+ padding: 0.6em 1.2em;
+ font-size: 1em;
+ font-weight: 500;
+ font-family: inherit;
+ background-color: #1a1a1a;
+ cursor: pointer;
+ transition: border-color 0.25s;
+}
+button:hover {
+ border-color: #646cff;
+}
+button:focus,
+button:focus-visible {
+ outline: 4px auto -webkit-focus-ring-color;
+}
+
+@media (prefers-color-scheme: light) {
+ :root {
+ color: #213547;
+ background-color: #ffffff;
+ }
+ a:hover {
+ color: #747bff;
+ }
+ button {
+ background-color: #f9f9f9;
+ }
+}
diff --git a/v3/internal/templates/preact-ts/frontend/src/main.tsx b/v3/internal/templates/preact-ts/frontend/src/main.tsx
new file mode 100644
index 000000000..e0ce3e998
--- /dev/null
+++ b/v3/internal/templates/preact-ts/frontend/src/main.tsx
@@ -0,0 +1,5 @@
+import { render } from 'preact'
+import { App } from './app'
+import './index.css'
+
+render(, document.getElementById('app') as HTMLElement)
diff --git a/v3/internal/templates/preact-ts/frontend/src/vite-env.d.ts b/v3/internal/templates/preact-ts/frontend/src/vite-env.d.ts
new file mode 100644
index 000000000..11f02fe2a
--- /dev/null
+++ b/v3/internal/templates/preact-ts/frontend/src/vite-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/v3/internal/templates/preact-ts/frontend/tsconfig.json b/v3/internal/templates/preact-ts/frontend/tsconfig.json
new file mode 100644
index 000000000..9c1b1e0aa
--- /dev/null
+++ b/v3/internal/templates/preact-ts/frontend/tsconfig.json
@@ -0,0 +1,22 @@
+{
+ "compilerOptions": {
+ "target": "ESNext",
+ "useDefineForClassFields": true,
+ "lib": ["DOM", "DOM.Iterable", "ESNext"],
+ "allowJs": false,
+ "skipLibCheck": true,
+ "esModuleInterop": false,
+ "allowSyntheticDefaultImports": true,
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "module": "ESNext",
+ "moduleResolution": "Node",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "jsx": "react-jsx",
+ "jsxImportSource": "preact"
+ },
+ "include": ["src"],
+ "references": [{ "path": "./tsconfig.node.json" }]
+}
diff --git a/v3/internal/templates/preact-ts/frontend/tsconfig.node.json b/v3/internal/templates/preact-ts/frontend/tsconfig.node.json
new file mode 100644
index 000000000..9d31e2aed
--- /dev/null
+++ b/v3/internal/templates/preact-ts/frontend/tsconfig.node.json
@@ -0,0 +1,9 @@
+{
+ "compilerOptions": {
+ "composite": true,
+ "module": "ESNext",
+ "moduleResolution": "Node",
+ "allowSyntheticDefaultImports": true
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/v3/internal/templates/preact-ts/frontend/vite.config.ts b/v3/internal/templates/preact-ts/frontend/vite.config.ts
new file mode 100644
index 000000000..29b326faf
--- /dev/null
+++ b/v3/internal/templates/preact-ts/frontend/vite.config.ts
@@ -0,0 +1,7 @@
+import { defineConfig } from 'vite'
+import preact from '@preact/preset-vite'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [preact()],
+})
diff --git a/v3/internal/templates/preact-ts/go.mod.tmpl b/v3/internal/templates/preact-ts/go.mod.tmpl
new file mode 100644
index 000000000..270f8c6d7
--- /dev/null
+++ b/v3/internal/templates/preact-ts/go.mod.tmpl
@@ -0,0 +1,13 @@
+module changeme
+
+go 1.19
+
+require github.com/wailsapp/wails/v3 v3.0.0-alpha.0
+
+require (
+ github.com/imdario/mergo v0.3.12 // indirect
+ github.com/leaanthony/slicer v1.5.0 // indirect
+ github.com/wailsapp/mimetype v1.4.1 // indirect
+ github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6 // indirect
+ golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect
+)
diff --git a/v3/internal/templates/preact-ts/go.sum.tmpl b/v3/internal/templates/preact-ts/go.sum.tmpl
new file mode 100644
index 000000000..29c7b303e
--- /dev/null
+++ b/v3/internal/templates/preact-ts/go.sum.tmpl
@@ -0,0 +1,22 @@
+github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
+github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
+github.com/leaanthony/slicer v1.5.0 h1:aHYTN8xbCCLxJmkNKiLB6tgcMARl4eWmH9/F+S/0HtY=
+github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY=
+github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=
+github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs=
+github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o=
+github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6 h1:Wn+nhnS+VytzE0PegUzSh4T3hXJCtggKGD/4U5H9+wQ=
+github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6/go.mod h1:zlNLI0E2c2qA6miiuAHtp0Bac8FaGH0tlhA19OssR/8=
+github.com/wailsapp/wails/v3 v3.0.0-alpha.0 h1:T5gqG98Xr8LBf69oxlPkhpsFD59w2SnqUZk6XHj8Zoc=
+github.com/wailsapp/wails/v3 v3.0.0-alpha.0/go.mod h1:OAfO5bP0TSUvCIHZYc6Dqfow/9RqxzHvYtmhWPpo1c0=
+golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
diff --git a/v3/internal/templates/preact-ts/main.tmpl.go b/v3/internal/templates/preact-ts/main.tmpl.go
new file mode 100644
index 000000000..ea8f138b8
--- /dev/null
+++ b/v3/internal/templates/preact-ts/main.tmpl.go
@@ -0,0 +1,45 @@
+package main
+
+import (
+ "embed"
+ _ "embed"
+ "log"
+
+ "github.com/wailsapp/wails/v3/pkg/options"
+
+ "github.com/wailsapp/wails/v3/pkg/application"
+)
+
+//go:embed frontend/dist
+var assets embed.FS
+
+func main() {
+ app := application.New(options.Application{
+ Name: "{{.ProjectName}}",
+ Description: "A demo of using raw HTML & CSS",
+ Mac: options.Mac{
+ ApplicationShouldTerminateAfterLastWindowClosed: true,
+ },
+ })
+ // Create window
+ app.NewWebviewWindowWithOptions(&options.WebviewWindow{
+ Title: "Plain Bundle",
+ CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
+ Mac: options.MacWindow{
+ InvisibleTitleBarHeight: 50,
+ Backdrop: options.MacBackdropTranslucent,
+ TitleBar: options.TitleBarHiddenInset,
+ },
+
+ URL: "/",
+ Assets: options.Assets{
+ FS: assets,
+ },
+ })
+
+ err := app.Run()
+
+ if err != nil {
+ log.Fatal(err)
+ }
+}
diff --git a/v3/internal/templates/preact/Taskfile.tmpl.yml b/v3/internal/templates/preact/Taskfile.tmpl.yml
new file mode 100644
index 000000000..4d3d4b22d
--- /dev/null
+++ b/v3/internal/templates/preact/Taskfile.tmpl.yml
@@ -0,0 +1,82 @@
+version: '3'
+
+vars:
+ APP_NAME: "{{.ProjectName}}"
+
+tasks:
+
+ pre-build:
+ summary: Pre-build hooks
+
+ post-build:
+ summary: Post-build hooks
+
+ install-frontend-deps:
+ summary: Install frontend dependencies
+ dir: frontend
+ sources:
+ - package.json
+ - package-lock.json
+ generates:
+ - node_modules/*
+ preconditions:
+ - sh: npm version
+ msg: "Looks like npm isn't installed. Npm is part of the Node installer: https://nodejs.org/en/download/"
+ cmds:
+ - npm install
+
+ build-frontend:
+ summary: Build the frontend project
+ dir: frontend
+ deps:
+ - install-frontend-deps
+ cmds:
+ - npm run build
+
+ build:
+ summary: Builds the application
+ cmds:
+ - task: pre-build
+ - task: build-frontend
+ - go build -gcflags=all="-N -l" -o build/bin/{{ "{{.APP_NAME}}" }} main.go
+ - task: post-build
+ env:
+ CGO_CFLAGS: "-mmacosx-version-min=10.13"
+ CGO_LDFLAGS: "-mmacosx-version-min=10.13"
+
+ generate-icons:
+ summary: Generates Windows `.ico` and Mac `.icns` files from an image
+ dir: build
+ cmds:
+ # Generates both .ico and .icns files
+ - wails generate icons -input appicon.png
+
+ build-app-prod-darwin:
+ summary: Creates a production build of the application
+ cmds:
+ - GOOS=darwin GOARCH={{ "{{.ARCH}}" }} go build -tags production -ldflags="-w -s" -o build/bin/{{ "{{.APP_NAME}}" }}
+ env:
+ CGO_CFLAGS: "-mmacosx-version-min=10.13"
+ CGO_LDFLAGS: "-mmacosx-version-min=10.13"
+ vars:
+ ARCH: $GOARCH
+
+
+ create-app-bundle:
+ summary: Builds a `.app` bundle
+ cmds:
+ - mkdir -p {{ "{{.APP_NAME}}" }}.app/Contents/{MacOS,Resources}
+ - cp build/icons.icns {{ "{{.APP_NAME}}" }}.app/Contents/Resources
+ - cp build/bin/{{ "{{.APP_NAME}}" }} {{ "{{.APP_NAME}}" }}.app/Contents/MacOS
+ - cp build/Info.plist {{ "{{.APP_NAME}}" }}.app/Contents
+
+ package-darwin-arm64:
+ summary: Packages a production build of the application into a `.app` bundle
+ platform: darwin
+ deps:
+ - task: build-app-prod-darwin
+ vars:
+ ARCH: arm64
+ - generate-icons
+ cmds:
+ - task: create-app-bundle
\ No newline at end of file
diff --git a/v3/internal/templates/preact/build/Info.plist.tmpl b/v3/internal/templates/preact/build/Info.plist.tmpl
new file mode 100644
index 000000000..93d9a5bf1
--- /dev/null
+++ b/v3/internal/templates/preact/build/Info.plist.tmpl
@@ -0,0 +1,27 @@
+
+
+
+ CFBundlePackageType
+ APPL
+ CFBundleName
+ {{ "{{.Info.ProductName}}" }}
+ CFBundleExecutable
+ {{ "{{.ProjectName}}" }}
+ CFBundleIdentifier
+ com.wails.{{ "{{.ProjectName}}" }}
+ CFBundleVersion
+ v1.0.0
+ CFBundleGetInfoString
+ This is a comment
+ CFBundleShortVersionString
+ v1.0.0
+ CFBundleIconFile
+ iconfile
+ LSMinimumSystemVersion
+ 10.13.0
+ NSHighResolutionCapable
+ true
+ NSHumanReadableCopyright
+ (c) 2023 My Company Name
+
+
\ No newline at end of file
diff --git a/v3/internal/templates/preact/build/appicon.png b/v3/internal/templates/preact/build/appicon.png
new file mode 100644
index 000000000..63617fe4f
Binary files /dev/null and b/v3/internal/templates/preact/build/appicon.png differ
diff --git a/v3/internal/templates/preact/build/info.json b/v3/internal/templates/preact/build/info.json
new file mode 100644
index 000000000..1005eb5cb
--- /dev/null
+++ b/v3/internal/templates/preact/build/info.json
@@ -0,0 +1,15 @@
+{
+ "fixed": {
+ "file_version": "v1.0.0"
+ },
+ "info": {
+ "0000": {
+ "ProductVersion": "v1.0.0",
+ "CompanyName": "My Company Name",
+ "FileDescription": "A thing that does a thing",
+ "LegalCopyright": "(c) 2023 My Company Name",
+ "ProductName": "My Product Name",
+ "Comments": "This is a comment"
+ }
+ }
+}
\ No newline at end of file
diff --git a/v3/internal/templates/preact/frontend/.gitignore b/v3/internal/templates/preact/frontend/.gitignore
new file mode 100644
index 000000000..a547bf36d
--- /dev/null
+++ b/v3/internal/templates/preact/frontend/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/v3/internal/templates/preact/frontend/index.html b/v3/internal/templates/preact/frontend/index.html
new file mode 100644
index 000000000..139931e70
--- /dev/null
+++ b/v3/internal/templates/preact/frontend/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Wails + Preact
+
+
+
+
+
+
diff --git a/v3/internal/templates/preact/frontend/package.json b/v3/internal/templates/preact/frontend/package.json
new file mode 100644
index 000000000..f44069b31
--- /dev/null
+++ b/v3/internal/templates/preact/frontend/package.json
@@ -0,0 +1,18 @@
+{
+ "name": "frontend",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "preact": "^10.11.3"
+ },
+ "devDependencies": {
+ "@preact/preset-vite": "^2.4.0",
+ "vite": "^4.0.0"
+ }
+}
\ No newline at end of file
diff --git a/v3/internal/templates/preact/frontend/public/wails.png b/v3/internal/templates/preact/frontend/public/wails.png
new file mode 100644
index 000000000..8bdf42483
Binary files /dev/null and b/v3/internal/templates/preact/frontend/public/wails.png differ
diff --git a/v3/internal/templates/preact/frontend/src/app.css b/v3/internal/templates/preact/frontend/src/app.css
new file mode 100644
index 000000000..088ed3ace
--- /dev/null
+++ b/v3/internal/templates/preact/frontend/src/app.css
@@ -0,0 +1,25 @@
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+ text-align: center;
+}
+
+.logo {
+ height: 6em;
+ padding: 1.5em;
+}
+.logo:hover {
+ filter: drop-shadow(0 0 2em #646cffaa);
+}
+.logo.preact:hover {
+ filter: drop-shadow(0 0 2em #673ab8aa);
+}
+
+.card {
+ padding: 2em;
+}
+
+.read-the-docs {
+ color: #888;
+}
diff --git a/v3/internal/templates/preact/frontend/src/app.jsx b/v3/internal/templates/preact/frontend/src/app.jsx
new file mode 100644
index 000000000..2679f4886
--- /dev/null
+++ b/v3/internal/templates/preact/frontend/src/app.jsx
@@ -0,0 +1,32 @@
+import { useState } from 'preact/hooks'
+import preactLogo from './assets/preact.svg'
+import './app.css'
+
+export function App() {
+ const [count, setCount] = useState(0)
+
+ return (
+ <>
+
+ Vite + Preact
+
+
+
+ Edit src/app.jsx
and save to test HMR
+
+
+
+ Click on the Vite and Preact logos to learn more
+
+ >
+ )
+}
diff --git a/v3/internal/templates/preact/frontend/src/assets/preact.svg b/v3/internal/templates/preact/frontend/src/assets/preact.svg
new file mode 100644
index 000000000..908f17def
--- /dev/null
+++ b/v3/internal/templates/preact/frontend/src/assets/preact.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/v3/internal/templates/preact/frontend/src/index.css b/v3/internal/templates/preact/frontend/src/index.css
new file mode 100644
index 000000000..917888c1d
--- /dev/null
+++ b/v3/internal/templates/preact/frontend/src/index.css
@@ -0,0 +1,70 @@
+:root {
+ font-family: Inter, Avenir, Helvetica, Arial, sans-serif;
+ font-size: 16px;
+ line-height: 24px;
+ font-weight: 400;
+
+ color-scheme: light dark;
+ color: rgba(255, 255, 255, 0.87);
+ background-color: #242424;
+
+ font-synthesis: none;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-text-size-adjust: 100%;
+}
+
+a {
+ font-weight: 500;
+ color: #646cff;
+ text-decoration: inherit;
+}
+a:hover {
+ color: #535bf2;
+}
+
+body {
+ margin: 0;
+ display: flex;
+ place-items: center;
+ min-width: 320px;
+ min-height: 100vh;
+}
+
+h1 {
+ font-size: 3.2em;
+ line-height: 1.1;
+}
+
+button {
+ border-radius: 8px;
+ border: 1px solid transparent;
+ padding: 0.6em 1.2em;
+ font-size: 1em;
+ font-weight: 500;
+ font-family: inherit;
+ background-color: #1a1a1a;
+ cursor: pointer;
+ transition: border-color 0.25s;
+}
+button:hover {
+ border-color: #646cff;
+}
+button:focus,
+button:focus-visible {
+ outline: 4px auto -webkit-focus-ring-color;
+}
+
+@media (prefers-color-scheme: light) {
+ :root {
+ color: #213547;
+ background-color: #ffffff;
+ }
+ a:hover {
+ color: #747bff;
+ }
+ button {
+ background-color: #f9f9f9;
+ }
+}
diff --git a/v3/internal/templates/preact/frontend/src/main.jsx b/v3/internal/templates/preact/frontend/src/main.jsx
new file mode 100644
index 000000000..be3fbce92
--- /dev/null
+++ b/v3/internal/templates/preact/frontend/src/main.jsx
@@ -0,0 +1,5 @@
+import { render } from 'preact'
+import { App } from './app'
+import './index.css'
+
+render(, document.getElementById('app'))
diff --git a/v3/internal/templates/preact/frontend/vite.config.js b/v3/internal/templates/preact/frontend/vite.config.js
new file mode 100644
index 000000000..29b326faf
--- /dev/null
+++ b/v3/internal/templates/preact/frontend/vite.config.js
@@ -0,0 +1,7 @@
+import { defineConfig } from 'vite'
+import preact from '@preact/preset-vite'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [preact()],
+})
diff --git a/v3/internal/templates/preact/go.mod.tmpl b/v3/internal/templates/preact/go.mod.tmpl
new file mode 100644
index 000000000..270f8c6d7
--- /dev/null
+++ b/v3/internal/templates/preact/go.mod.tmpl
@@ -0,0 +1,13 @@
+module changeme
+
+go 1.19
+
+require github.com/wailsapp/wails/v3 v3.0.0-alpha.0
+
+require (
+ github.com/imdario/mergo v0.3.12 // indirect
+ github.com/leaanthony/slicer v1.5.0 // indirect
+ github.com/wailsapp/mimetype v1.4.1 // indirect
+ github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6 // indirect
+ golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect
+)
diff --git a/v3/internal/templates/preact/go.sum.tmpl b/v3/internal/templates/preact/go.sum.tmpl
new file mode 100644
index 000000000..29c7b303e
--- /dev/null
+++ b/v3/internal/templates/preact/go.sum.tmpl
@@ -0,0 +1,22 @@
+github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
+github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
+github.com/leaanthony/slicer v1.5.0 h1:aHYTN8xbCCLxJmkNKiLB6tgcMARl4eWmH9/F+S/0HtY=
+github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY=
+github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=
+github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs=
+github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o=
+github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6 h1:Wn+nhnS+VytzE0PegUzSh4T3hXJCtggKGD/4U5H9+wQ=
+github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6/go.mod h1:zlNLI0E2c2qA6miiuAHtp0Bac8FaGH0tlhA19OssR/8=
+github.com/wailsapp/wails/v3 v3.0.0-alpha.0 h1:T5gqG98Xr8LBf69oxlPkhpsFD59w2SnqUZk6XHj8Zoc=
+github.com/wailsapp/wails/v3 v3.0.0-alpha.0/go.mod h1:OAfO5bP0TSUvCIHZYc6Dqfow/9RqxzHvYtmhWPpo1c0=
+golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
diff --git a/v3/internal/templates/preact/main.tmpl.go b/v3/internal/templates/preact/main.tmpl.go
new file mode 100644
index 000000000..ea8f138b8
--- /dev/null
+++ b/v3/internal/templates/preact/main.tmpl.go
@@ -0,0 +1,45 @@
+package main
+
+import (
+ "embed"
+ _ "embed"
+ "log"
+
+ "github.com/wailsapp/wails/v3/pkg/options"
+
+ "github.com/wailsapp/wails/v3/pkg/application"
+)
+
+//go:embed frontend/dist
+var assets embed.FS
+
+func main() {
+ app := application.New(options.Application{
+ Name: "{{.ProjectName}}",
+ Description: "A demo of using raw HTML & CSS",
+ Mac: options.Mac{
+ ApplicationShouldTerminateAfterLastWindowClosed: true,
+ },
+ })
+ // Create window
+ app.NewWebviewWindowWithOptions(&options.WebviewWindow{
+ Title: "Plain Bundle",
+ CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
+ Mac: options.MacWindow{
+ InvisibleTitleBarHeight: 50,
+ Backdrop: options.MacBackdropTranslucent,
+ TitleBar: options.TitleBarHiddenInset,
+ },
+
+ URL: "/",
+ Assets: options.Assets{
+ FS: assets,
+ },
+ })
+
+ err := app.Run()
+
+ if err != nil {
+ log.Fatal(err)
+ }
+}
diff --git a/v3/internal/templates/react-swc-ts/Taskfile.tmpl.yml b/v3/internal/templates/react-swc-ts/Taskfile.tmpl.yml
new file mode 100644
index 000000000..4d3d4b22d
--- /dev/null
+++ b/v3/internal/templates/react-swc-ts/Taskfile.tmpl.yml
@@ -0,0 +1,82 @@
+version: '3'
+
+vars:
+ APP_NAME: "{{.ProjectName}}"
+
+tasks:
+
+ pre-build:
+ summary: Pre-build hooks
+
+ post-build:
+ summary: Post-build hooks
+
+ install-frontend-deps:
+ summary: Install frontend dependencies
+ dir: frontend
+ sources:
+ - package.json
+ - package-lock.json
+ generates:
+ - node_modules/*
+ preconditions:
+ - sh: npm version
+ msg: "Looks like npm isn't installed. Npm is part of the Node installer: https://nodejs.org/en/download/"
+ cmds:
+ - npm install
+
+ build-frontend:
+ summary: Build the frontend project
+ dir: frontend
+ deps:
+ - install-frontend-deps
+ cmds:
+ - npm run build
+
+ build:
+ summary: Builds the application
+ cmds:
+ - task: pre-build
+ - task: build-frontend
+ - go build -gcflags=all="-N -l" -o build/bin/{{ "{{.APP_NAME}}" }} main.go
+ - task: post-build
+ env:
+ CGO_CFLAGS: "-mmacosx-version-min=10.13"
+ CGO_LDFLAGS: "-mmacosx-version-min=10.13"
+
+ generate-icons:
+ summary: Generates Windows `.ico` and Mac `.icns` files from an image
+ dir: build
+ cmds:
+ # Generates both .ico and .icns files
+ - wails generate icons -input appicon.png
+
+ build-app-prod-darwin:
+ summary: Creates a production build of the application
+ cmds:
+ - GOOS=darwin GOARCH={{ "{{.ARCH}}" }} go build -tags production -ldflags="-w -s" -o build/bin/{{ "{{.APP_NAME}}" }}
+ env:
+ CGO_CFLAGS: "-mmacosx-version-min=10.13"
+ CGO_LDFLAGS: "-mmacosx-version-min=10.13"
+ vars:
+ ARCH: $GOARCH
+
+
+ create-app-bundle:
+ summary: Builds a `.app` bundle
+ cmds:
+ - mkdir -p {{ "{{.APP_NAME}}" }}.app/Contents/{MacOS,Resources}
+ - cp build/icons.icns {{ "{{.APP_NAME}}" }}.app/Contents/Resources
+ - cp build/bin/{{ "{{.APP_NAME}}" }} {{ "{{.APP_NAME}}" }}.app/Contents/MacOS
+ - cp build/Info.plist {{ "{{.APP_NAME}}" }}.app/Contents
+
+ package-darwin-arm64:
+ summary: Packages a production build of the application into a `.app` bundle
+ platform: darwin
+ deps:
+ - task: build-app-prod-darwin
+ vars:
+ ARCH: arm64
+ - generate-icons
+ cmds:
+ - task: create-app-bundle
\ No newline at end of file
diff --git a/v3/internal/templates/react-swc-ts/build/Info.plist.tmpl b/v3/internal/templates/react-swc-ts/build/Info.plist.tmpl
new file mode 100644
index 000000000..93d9a5bf1
--- /dev/null
+++ b/v3/internal/templates/react-swc-ts/build/Info.plist.tmpl
@@ -0,0 +1,27 @@
+
+
+
+ CFBundlePackageType
+ APPL
+ CFBundleName
+ {{ "{{.Info.ProductName}}" }}
+ CFBundleExecutable
+ {{ "{{.ProjectName}}" }}
+ CFBundleIdentifier
+ com.wails.{{ "{{.ProjectName}}" }}
+ CFBundleVersion
+ v1.0.0
+ CFBundleGetInfoString
+ This is a comment
+ CFBundleShortVersionString
+ v1.0.0
+ CFBundleIconFile
+ iconfile
+ LSMinimumSystemVersion
+ 10.13.0
+ NSHighResolutionCapable
+ true
+ NSHumanReadableCopyright
+ (c) 2023 My Company Name
+
+
\ No newline at end of file
diff --git a/v3/internal/templates/react-swc-ts/build/appicon.png b/v3/internal/templates/react-swc-ts/build/appicon.png
new file mode 100644
index 000000000..63617fe4f
Binary files /dev/null and b/v3/internal/templates/react-swc-ts/build/appicon.png differ
diff --git a/v3/internal/templates/react-swc-ts/build/info.json b/v3/internal/templates/react-swc-ts/build/info.json
new file mode 100644
index 000000000..1005eb5cb
--- /dev/null
+++ b/v3/internal/templates/react-swc-ts/build/info.json
@@ -0,0 +1,15 @@
+{
+ "fixed": {
+ "file_version": "v1.0.0"
+ },
+ "info": {
+ "0000": {
+ "ProductVersion": "v1.0.0",
+ "CompanyName": "My Company Name",
+ "FileDescription": "A thing that does a thing",
+ "LegalCopyright": "(c) 2023 My Company Name",
+ "ProductName": "My Product Name",
+ "Comments": "This is a comment"
+ }
+ }
+}
\ No newline at end of file
diff --git a/v3/internal/templates/react-swc-ts/frontend/.gitignore b/v3/internal/templates/react-swc-ts/frontend/.gitignore
new file mode 100644
index 000000000..a547bf36d
--- /dev/null
+++ b/v3/internal/templates/react-swc-ts/frontend/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/v3/internal/templates/react-swc-ts/frontend/index.html b/v3/internal/templates/react-swc-ts/frontend/index.html
new file mode 100644
index 000000000..28868c572
--- /dev/null
+++ b/v3/internal/templates/react-swc-ts/frontend/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Wails + React + TS
+
+
+
+
+
+
diff --git a/v3/internal/templates/react-swc-ts/frontend/package.json b/v3/internal/templates/react-swc-ts/frontend/package.json
new file mode 100644
index 000000000..26dc1bca8
--- /dev/null
+++ b/v3/internal/templates/react-swc-ts/frontend/package.json
@@ -0,0 +1,22 @@
+{
+ "name": "frontend",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc && vite build",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0"
+ },
+ "devDependencies": {
+ "@types/react": "^18.0.26",
+ "@types/react-dom": "^18.0.9",
+ "@vitejs/plugin-react-swc": "^3.0.0",
+ "typescript": "^4.9.3",
+ "vite": "^4.0.0"
+ }
+}
\ No newline at end of file
diff --git a/v3/internal/templates/react-swc-ts/frontend/public/wails.png b/v3/internal/templates/react-swc-ts/frontend/public/wails.png
new file mode 100644
index 000000000..8bdf42483
Binary files /dev/null and b/v3/internal/templates/react-swc-ts/frontend/public/wails.png differ
diff --git a/v3/internal/templates/react-swc-ts/frontend/src/App.css b/v3/internal/templates/react-swc-ts/frontend/src/App.css
new file mode 100644
index 000000000..2c5e2ef5c
--- /dev/null
+++ b/v3/internal/templates/react-swc-ts/frontend/src/App.css
@@ -0,0 +1,41 @@
+#root {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+ text-align: center;
+}
+
+.logo {
+ height: 6em;
+ padding: 1.5em;
+ will-change: filter;
+}
+.logo:hover {
+ filter: drop-shadow(0 0 2em #646cffaa);
+}
+.logo.react:hover {
+ filter: drop-shadow(0 0 2em #61dafbaa);
+}
+
+@keyframes logo-spin {
+ from {
+ transform: rotate(0deg);
+ }
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+@media (prefers-reduced-motion: no-preference) {
+ a:nth-of-type(2) .logo {
+ animation: logo-spin infinite 20s linear;
+ }
+}
+
+.card {
+ padding: 2em;
+}
+
+.read-the-docs {
+ color: #888;
+}
diff --git a/v3/internal/templates/react-swc-ts/frontend/src/App.tsx b/v3/internal/templates/react-swc-ts/frontend/src/App.tsx
new file mode 100644
index 000000000..cd201360b
--- /dev/null
+++ b/v3/internal/templates/react-swc-ts/frontend/src/App.tsx
@@ -0,0 +1,34 @@
+import { useState } from 'react'
+import reactLogo from './assets/react.svg'
+import './App.css'
+
+function App() {
+ const [count, setCount] = useState(0)
+
+ return (
+
+
+
Vite + React
+
+
+
+ Edit src/App.tsx
and save to test HMR
+
+
+
+ Click on the Vite and React logos to learn more
+
+
+ )
+}
+
+export default App
diff --git a/v3/internal/templates/react-swc-ts/frontend/src/assets/react.svg b/v3/internal/templates/react-swc-ts/frontend/src/assets/react.svg
new file mode 100644
index 000000000..6c87de9bb
--- /dev/null
+++ b/v3/internal/templates/react-swc-ts/frontend/src/assets/react.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/v3/internal/templates/react-swc-ts/frontend/src/index.css b/v3/internal/templates/react-swc-ts/frontend/src/index.css
new file mode 100644
index 000000000..917888c1d
--- /dev/null
+++ b/v3/internal/templates/react-swc-ts/frontend/src/index.css
@@ -0,0 +1,70 @@
+:root {
+ font-family: Inter, Avenir, Helvetica, Arial, sans-serif;
+ font-size: 16px;
+ line-height: 24px;
+ font-weight: 400;
+
+ color-scheme: light dark;
+ color: rgba(255, 255, 255, 0.87);
+ background-color: #242424;
+
+ font-synthesis: none;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-text-size-adjust: 100%;
+}
+
+a {
+ font-weight: 500;
+ color: #646cff;
+ text-decoration: inherit;
+}
+a:hover {
+ color: #535bf2;
+}
+
+body {
+ margin: 0;
+ display: flex;
+ place-items: center;
+ min-width: 320px;
+ min-height: 100vh;
+}
+
+h1 {
+ font-size: 3.2em;
+ line-height: 1.1;
+}
+
+button {
+ border-radius: 8px;
+ border: 1px solid transparent;
+ padding: 0.6em 1.2em;
+ font-size: 1em;
+ font-weight: 500;
+ font-family: inherit;
+ background-color: #1a1a1a;
+ cursor: pointer;
+ transition: border-color 0.25s;
+}
+button:hover {
+ border-color: #646cff;
+}
+button:focus,
+button:focus-visible {
+ outline: 4px auto -webkit-focus-ring-color;
+}
+
+@media (prefers-color-scheme: light) {
+ :root {
+ color: #213547;
+ background-color: #ffffff;
+ }
+ a:hover {
+ color: #747bff;
+ }
+ button {
+ background-color: #f9f9f9;
+ }
+}
diff --git a/v3/internal/templates/react-swc-ts/frontend/src/main.tsx b/v3/internal/templates/react-swc-ts/frontend/src/main.tsx
new file mode 100644
index 000000000..791f139e2
--- /dev/null
+++ b/v3/internal/templates/react-swc-ts/frontend/src/main.tsx
@@ -0,0 +1,10 @@
+import React from 'react'
+import ReactDOM from 'react-dom/client'
+import App from './App'
+import './index.css'
+
+ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
+
+
+ ,
+)
diff --git a/v3/internal/templates/react-swc-ts/frontend/src/vite-env.d.ts b/v3/internal/templates/react-swc-ts/frontend/src/vite-env.d.ts
new file mode 100644
index 000000000..11f02fe2a
--- /dev/null
+++ b/v3/internal/templates/react-swc-ts/frontend/src/vite-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/v3/internal/templates/react-swc-ts/frontend/tsconfig.json b/v3/internal/templates/react-swc-ts/frontend/tsconfig.json
new file mode 100644
index 000000000..3d0a51a86
--- /dev/null
+++ b/v3/internal/templates/react-swc-ts/frontend/tsconfig.json
@@ -0,0 +1,21 @@
+{
+ "compilerOptions": {
+ "target": "ESNext",
+ "useDefineForClassFields": true,
+ "lib": ["DOM", "DOM.Iterable", "ESNext"],
+ "allowJs": false,
+ "skipLibCheck": true,
+ "esModuleInterop": false,
+ "allowSyntheticDefaultImports": true,
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "module": "ESNext",
+ "moduleResolution": "Node",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "jsx": "react-jsx"
+ },
+ "include": ["src"],
+ "references": [{ "path": "./tsconfig.node.json" }]
+}
diff --git a/v3/internal/templates/react-swc-ts/frontend/tsconfig.node.json b/v3/internal/templates/react-swc-ts/frontend/tsconfig.node.json
new file mode 100644
index 000000000..9d31e2aed
--- /dev/null
+++ b/v3/internal/templates/react-swc-ts/frontend/tsconfig.node.json
@@ -0,0 +1,9 @@
+{
+ "compilerOptions": {
+ "composite": true,
+ "module": "ESNext",
+ "moduleResolution": "Node",
+ "allowSyntheticDefaultImports": true
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/v3/internal/templates/react-swc-ts/frontend/vite.config.ts b/v3/internal/templates/react-swc-ts/frontend/vite.config.ts
new file mode 100644
index 000000000..861b04b35
--- /dev/null
+++ b/v3/internal/templates/react-swc-ts/frontend/vite.config.ts
@@ -0,0 +1,7 @@
+import { defineConfig } from 'vite'
+import react from '@vitejs/plugin-react-swc'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [react()],
+})
diff --git a/v3/internal/templates/react-swc-ts/go.mod.tmpl b/v3/internal/templates/react-swc-ts/go.mod.tmpl
new file mode 100644
index 000000000..270f8c6d7
--- /dev/null
+++ b/v3/internal/templates/react-swc-ts/go.mod.tmpl
@@ -0,0 +1,13 @@
+module changeme
+
+go 1.19
+
+require github.com/wailsapp/wails/v3 v3.0.0-alpha.0
+
+require (
+ github.com/imdario/mergo v0.3.12 // indirect
+ github.com/leaanthony/slicer v1.5.0 // indirect
+ github.com/wailsapp/mimetype v1.4.1 // indirect
+ github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6 // indirect
+ golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect
+)
diff --git a/v3/internal/templates/react-swc-ts/go.sum.tmpl b/v3/internal/templates/react-swc-ts/go.sum.tmpl
new file mode 100644
index 000000000..29c7b303e
--- /dev/null
+++ b/v3/internal/templates/react-swc-ts/go.sum.tmpl
@@ -0,0 +1,22 @@
+github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
+github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
+github.com/leaanthony/slicer v1.5.0 h1:aHYTN8xbCCLxJmkNKiLB6tgcMARl4eWmH9/F+S/0HtY=
+github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY=
+github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=
+github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs=
+github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o=
+github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6 h1:Wn+nhnS+VytzE0PegUzSh4T3hXJCtggKGD/4U5H9+wQ=
+github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6/go.mod h1:zlNLI0E2c2qA6miiuAHtp0Bac8FaGH0tlhA19OssR/8=
+github.com/wailsapp/wails/v3 v3.0.0-alpha.0 h1:T5gqG98Xr8LBf69oxlPkhpsFD59w2SnqUZk6XHj8Zoc=
+github.com/wailsapp/wails/v3 v3.0.0-alpha.0/go.mod h1:OAfO5bP0TSUvCIHZYc6Dqfow/9RqxzHvYtmhWPpo1c0=
+golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
diff --git a/v3/internal/templates/react-swc-ts/main.tmpl.go b/v3/internal/templates/react-swc-ts/main.tmpl.go
new file mode 100644
index 000000000..ea8f138b8
--- /dev/null
+++ b/v3/internal/templates/react-swc-ts/main.tmpl.go
@@ -0,0 +1,45 @@
+package main
+
+import (
+ "embed"
+ _ "embed"
+ "log"
+
+ "github.com/wailsapp/wails/v3/pkg/options"
+
+ "github.com/wailsapp/wails/v3/pkg/application"
+)
+
+//go:embed frontend/dist
+var assets embed.FS
+
+func main() {
+ app := application.New(options.Application{
+ Name: "{{.ProjectName}}",
+ Description: "A demo of using raw HTML & CSS",
+ Mac: options.Mac{
+ ApplicationShouldTerminateAfterLastWindowClosed: true,
+ },
+ })
+ // Create window
+ app.NewWebviewWindowWithOptions(&options.WebviewWindow{
+ Title: "Plain Bundle",
+ CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
+ Mac: options.MacWindow{
+ InvisibleTitleBarHeight: 50,
+ Backdrop: options.MacBackdropTranslucent,
+ TitleBar: options.TitleBarHiddenInset,
+ },
+
+ URL: "/",
+ Assets: options.Assets{
+ FS: assets,
+ },
+ })
+
+ err := app.Run()
+
+ if err != nil {
+ log.Fatal(err)
+ }
+}
diff --git a/v3/internal/templates/react-swc/Taskfile.tmpl.yml b/v3/internal/templates/react-swc/Taskfile.tmpl.yml
new file mode 100644
index 000000000..4d3d4b22d
--- /dev/null
+++ b/v3/internal/templates/react-swc/Taskfile.tmpl.yml
@@ -0,0 +1,82 @@
+version: '3'
+
+vars:
+ APP_NAME: "{{.ProjectName}}"
+
+tasks:
+
+ pre-build:
+ summary: Pre-build hooks
+
+ post-build:
+ summary: Post-build hooks
+
+ install-frontend-deps:
+ summary: Install frontend dependencies
+ dir: frontend
+ sources:
+ - package.json
+ - package-lock.json
+ generates:
+ - node_modules/*
+ preconditions:
+ - sh: npm version
+ msg: "Looks like npm isn't installed. Npm is part of the Node installer: https://nodejs.org/en/download/"
+ cmds:
+ - npm install
+
+ build-frontend:
+ summary: Build the frontend project
+ dir: frontend
+ deps:
+ - install-frontend-deps
+ cmds:
+ - npm run build
+
+ build:
+ summary: Builds the application
+ cmds:
+ - task: pre-build
+ - task: build-frontend
+ - go build -gcflags=all="-N -l" -o build/bin/{{ "{{.APP_NAME}}" }} main.go
+ - task: post-build
+ env:
+ CGO_CFLAGS: "-mmacosx-version-min=10.13"
+ CGO_LDFLAGS: "-mmacosx-version-min=10.13"
+
+ generate-icons:
+ summary: Generates Windows `.ico` and Mac `.icns` files from an image
+ dir: build
+ cmds:
+ # Generates both .ico and .icns files
+ - wails generate icons -input appicon.png
+
+ build-app-prod-darwin:
+ summary: Creates a production build of the application
+ cmds:
+ - GOOS=darwin GOARCH={{ "{{.ARCH}}" }} go build -tags production -ldflags="-w -s" -o build/bin/{{ "{{.APP_NAME}}" }}
+ env:
+ CGO_CFLAGS: "-mmacosx-version-min=10.13"
+ CGO_LDFLAGS: "-mmacosx-version-min=10.13"
+ vars:
+ ARCH: $GOARCH
+
+
+ create-app-bundle:
+ summary: Builds a `.app` bundle
+ cmds:
+ - mkdir -p {{ "{{.APP_NAME}}" }}.app/Contents/{MacOS,Resources}
+ - cp build/icons.icns {{ "{{.APP_NAME}}" }}.app/Contents/Resources
+ - cp build/bin/{{ "{{.APP_NAME}}" }} {{ "{{.APP_NAME}}" }}.app/Contents/MacOS
+ - cp build/Info.plist {{ "{{.APP_NAME}}" }}.app/Contents
+
+ package-darwin-arm64:
+ summary: Packages a production build of the application into a `.app` bundle
+ platform: darwin
+ deps:
+ - task: build-app-prod-darwin
+ vars:
+ ARCH: arm64
+ - generate-icons
+ cmds:
+ - task: create-app-bundle
\ No newline at end of file
diff --git a/v3/internal/templates/react-swc/build/Info.plist.tmpl b/v3/internal/templates/react-swc/build/Info.plist.tmpl
new file mode 100644
index 000000000..93d9a5bf1
--- /dev/null
+++ b/v3/internal/templates/react-swc/build/Info.plist.tmpl
@@ -0,0 +1,27 @@
+
+
+
+ CFBundlePackageType
+ APPL
+ CFBundleName
+ {{ "{{.Info.ProductName}}" }}
+ CFBundleExecutable
+ {{ "{{.ProjectName}}" }}
+ CFBundleIdentifier
+ com.wails.{{ "{{.ProjectName}}" }}
+ CFBundleVersion
+ v1.0.0
+ CFBundleGetInfoString
+ This is a comment
+ CFBundleShortVersionString
+ v1.0.0
+ CFBundleIconFile
+ iconfile
+ LSMinimumSystemVersion
+ 10.13.0
+ NSHighResolutionCapable
+ true
+ NSHumanReadableCopyright
+ (c) 2023 My Company Name
+
+
\ No newline at end of file
diff --git a/v3/internal/templates/react-swc/build/appicon.png b/v3/internal/templates/react-swc/build/appicon.png
new file mode 100644
index 000000000..63617fe4f
Binary files /dev/null and b/v3/internal/templates/react-swc/build/appicon.png differ
diff --git a/v3/internal/templates/react-swc/build/info.json b/v3/internal/templates/react-swc/build/info.json
new file mode 100644
index 000000000..1005eb5cb
--- /dev/null
+++ b/v3/internal/templates/react-swc/build/info.json
@@ -0,0 +1,15 @@
+{
+ "fixed": {
+ "file_version": "v1.0.0"
+ },
+ "info": {
+ "0000": {
+ "ProductVersion": "v1.0.0",
+ "CompanyName": "My Company Name",
+ "FileDescription": "A thing that does a thing",
+ "LegalCopyright": "(c) 2023 My Company Name",
+ "ProductName": "My Product Name",
+ "Comments": "This is a comment"
+ }
+ }
+}
\ No newline at end of file
diff --git a/v3/internal/templates/react-swc/frontend/.gitignore b/v3/internal/templates/react-swc/frontend/.gitignore
new file mode 100644
index 000000000..a547bf36d
--- /dev/null
+++ b/v3/internal/templates/react-swc/frontend/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/v3/internal/templates/react-swc/frontend/index.html b/v3/internal/templates/react-swc/frontend/index.html
new file mode 100644
index 000000000..fe5530dd4
--- /dev/null
+++ b/v3/internal/templates/react-swc/frontend/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Wails + React
+
+
+
+
+
+
diff --git a/v3/internal/templates/react-swc/frontend/package.json b/v3/internal/templates/react-swc/frontend/package.json
new file mode 100644
index 000000000..6583b9c4b
--- /dev/null
+++ b/v3/internal/templates/react-swc/frontend/package.json
@@ -0,0 +1,21 @@
+{
+ "name": "frontend",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0"
+ },
+ "devDependencies": {
+ "@types/react": "^18.0.26",
+ "@types/react-dom": "^18.0.9",
+ "@vitejs/plugin-react-swc": "^3.0.0",
+ "vite": "^4.0.0"
+ }
+}
\ No newline at end of file
diff --git a/v3/internal/templates/react-swc/frontend/public/wails.png b/v3/internal/templates/react-swc/frontend/public/wails.png
new file mode 100644
index 000000000..8bdf42483
Binary files /dev/null and b/v3/internal/templates/react-swc/frontend/public/wails.png differ
diff --git a/v3/internal/templates/react-swc/frontend/src/App.css b/v3/internal/templates/react-swc/frontend/src/App.css
new file mode 100644
index 000000000..2c5e2ef5c
--- /dev/null
+++ b/v3/internal/templates/react-swc/frontend/src/App.css
@@ -0,0 +1,41 @@
+#root {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+ text-align: center;
+}
+
+.logo {
+ height: 6em;
+ padding: 1.5em;
+ will-change: filter;
+}
+.logo:hover {
+ filter: drop-shadow(0 0 2em #646cffaa);
+}
+.logo.react:hover {
+ filter: drop-shadow(0 0 2em #61dafbaa);
+}
+
+@keyframes logo-spin {
+ from {
+ transform: rotate(0deg);
+ }
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+@media (prefers-reduced-motion: no-preference) {
+ a:nth-of-type(2) .logo {
+ animation: logo-spin infinite 20s linear;
+ }
+}
+
+.card {
+ padding: 2em;
+}
+
+.read-the-docs {
+ color: #888;
+}
diff --git a/v3/internal/templates/react-swc/frontend/src/App.jsx b/v3/internal/templates/react-swc/frontend/src/App.jsx
new file mode 100644
index 000000000..ef0adc0d5
--- /dev/null
+++ b/v3/internal/templates/react-swc/frontend/src/App.jsx
@@ -0,0 +1,34 @@
+import { useState } from 'react'
+import reactLogo from './assets/react.svg'
+import './App.css'
+
+function App() {
+ const [count, setCount] = useState(0)
+
+ return (
+
+
+
Vite + React
+
+
+
+ Edit src/App.jsx
and save to test HMR
+
+
+
+ Click on the Vite and React logos to learn more
+
+
+ )
+}
+
+export default App
diff --git a/v3/internal/templates/react-swc/frontend/src/assets/react.svg b/v3/internal/templates/react-swc/frontend/src/assets/react.svg
new file mode 100644
index 000000000..6c87de9bb
--- /dev/null
+++ b/v3/internal/templates/react-swc/frontend/src/assets/react.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/v3/internal/templates/react-swc/frontend/src/index.css b/v3/internal/templates/react-swc/frontend/src/index.css
new file mode 100644
index 000000000..917888c1d
--- /dev/null
+++ b/v3/internal/templates/react-swc/frontend/src/index.css
@@ -0,0 +1,70 @@
+:root {
+ font-family: Inter, Avenir, Helvetica, Arial, sans-serif;
+ font-size: 16px;
+ line-height: 24px;
+ font-weight: 400;
+
+ color-scheme: light dark;
+ color: rgba(255, 255, 255, 0.87);
+ background-color: #242424;
+
+ font-synthesis: none;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-text-size-adjust: 100%;
+}
+
+a {
+ font-weight: 500;
+ color: #646cff;
+ text-decoration: inherit;
+}
+a:hover {
+ color: #535bf2;
+}
+
+body {
+ margin: 0;
+ display: flex;
+ place-items: center;
+ min-width: 320px;
+ min-height: 100vh;
+}
+
+h1 {
+ font-size: 3.2em;
+ line-height: 1.1;
+}
+
+button {
+ border-radius: 8px;
+ border: 1px solid transparent;
+ padding: 0.6em 1.2em;
+ font-size: 1em;
+ font-weight: 500;
+ font-family: inherit;
+ background-color: #1a1a1a;
+ cursor: pointer;
+ transition: border-color 0.25s;
+}
+button:hover {
+ border-color: #646cff;
+}
+button:focus,
+button:focus-visible {
+ outline: 4px auto -webkit-focus-ring-color;
+}
+
+@media (prefers-color-scheme: light) {
+ :root {
+ color: #213547;
+ background-color: #ffffff;
+ }
+ a:hover {
+ color: #747bff;
+ }
+ button {
+ background-color: #f9f9f9;
+ }
+}
diff --git a/v3/internal/templates/react-swc/frontend/src/main.jsx b/v3/internal/templates/react-swc/frontend/src/main.jsx
new file mode 100644
index 000000000..5cc599199
--- /dev/null
+++ b/v3/internal/templates/react-swc/frontend/src/main.jsx
@@ -0,0 +1,10 @@
+import React from 'react'
+import ReactDOM from 'react-dom/client'
+import App from './App'
+import './index.css'
+
+ReactDOM.createRoot(document.getElementById('root')).render(
+
+
+ ,
+)
diff --git a/v3/internal/templates/react-swc/frontend/vite.config.js b/v3/internal/templates/react-swc/frontend/vite.config.js
new file mode 100644
index 000000000..861b04b35
--- /dev/null
+++ b/v3/internal/templates/react-swc/frontend/vite.config.js
@@ -0,0 +1,7 @@
+import { defineConfig } from 'vite'
+import react from '@vitejs/plugin-react-swc'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [react()],
+})
diff --git a/v3/internal/templates/react-swc/go.mod.tmpl b/v3/internal/templates/react-swc/go.mod.tmpl
new file mode 100644
index 000000000..270f8c6d7
--- /dev/null
+++ b/v3/internal/templates/react-swc/go.mod.tmpl
@@ -0,0 +1,13 @@
+module changeme
+
+go 1.19
+
+require github.com/wailsapp/wails/v3 v3.0.0-alpha.0
+
+require (
+ github.com/imdario/mergo v0.3.12 // indirect
+ github.com/leaanthony/slicer v1.5.0 // indirect
+ github.com/wailsapp/mimetype v1.4.1 // indirect
+ github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6 // indirect
+ golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect
+)
diff --git a/v3/internal/templates/react-swc/go.sum.tmpl b/v3/internal/templates/react-swc/go.sum.tmpl
new file mode 100644
index 000000000..29c7b303e
--- /dev/null
+++ b/v3/internal/templates/react-swc/go.sum.tmpl
@@ -0,0 +1,22 @@
+github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
+github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
+github.com/leaanthony/slicer v1.5.0 h1:aHYTN8xbCCLxJmkNKiLB6tgcMARl4eWmH9/F+S/0HtY=
+github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY=
+github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=
+github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs=
+github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o=
+github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6 h1:Wn+nhnS+VytzE0PegUzSh4T3hXJCtggKGD/4U5H9+wQ=
+github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6/go.mod h1:zlNLI0E2c2qA6miiuAHtp0Bac8FaGH0tlhA19OssR/8=
+github.com/wailsapp/wails/v3 v3.0.0-alpha.0 h1:T5gqG98Xr8LBf69oxlPkhpsFD59w2SnqUZk6XHj8Zoc=
+github.com/wailsapp/wails/v3 v3.0.0-alpha.0/go.mod h1:OAfO5bP0TSUvCIHZYc6Dqfow/9RqxzHvYtmhWPpo1c0=
+golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
diff --git a/v3/internal/templates/react-swc/main.tmpl.go b/v3/internal/templates/react-swc/main.tmpl.go
new file mode 100644
index 000000000..ea8f138b8
--- /dev/null
+++ b/v3/internal/templates/react-swc/main.tmpl.go
@@ -0,0 +1,45 @@
+package main
+
+import (
+ "embed"
+ _ "embed"
+ "log"
+
+ "github.com/wailsapp/wails/v3/pkg/options"
+
+ "github.com/wailsapp/wails/v3/pkg/application"
+)
+
+//go:embed frontend/dist
+var assets embed.FS
+
+func main() {
+ app := application.New(options.Application{
+ Name: "{{.ProjectName}}",
+ Description: "A demo of using raw HTML & CSS",
+ Mac: options.Mac{
+ ApplicationShouldTerminateAfterLastWindowClosed: true,
+ },
+ })
+ // Create window
+ app.NewWebviewWindowWithOptions(&options.WebviewWindow{
+ Title: "Plain Bundle",
+ CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
+ Mac: options.MacWindow{
+ InvisibleTitleBarHeight: 50,
+ Backdrop: options.MacBackdropTranslucent,
+ TitleBar: options.TitleBarHiddenInset,
+ },
+
+ URL: "/",
+ Assets: options.Assets{
+ FS: assets,
+ },
+ })
+
+ err := app.Run()
+
+ if err != nil {
+ log.Fatal(err)
+ }
+}
diff --git a/v3/internal/templates/react-ts/Taskfile.tmpl.yml b/v3/internal/templates/react-ts/Taskfile.tmpl.yml
new file mode 100644
index 000000000..4d3d4b22d
--- /dev/null
+++ b/v3/internal/templates/react-ts/Taskfile.tmpl.yml
@@ -0,0 +1,82 @@
+version: '3'
+
+vars:
+ APP_NAME: "{{.ProjectName}}"
+
+tasks:
+
+ pre-build:
+ summary: Pre-build hooks
+
+ post-build:
+ summary: Post-build hooks
+
+ install-frontend-deps:
+ summary: Install frontend dependencies
+ dir: frontend
+ sources:
+ - package.json
+ - package-lock.json
+ generates:
+ - node_modules/*
+ preconditions:
+ - sh: npm version
+ msg: "Looks like npm isn't installed. Npm is part of the Node installer: https://nodejs.org/en/download/"
+ cmds:
+ - npm install
+
+ build-frontend:
+ summary: Build the frontend project
+ dir: frontend
+ deps:
+ - install-frontend-deps
+ cmds:
+ - npm run build
+
+ build:
+ summary: Builds the application
+ cmds:
+ - task: pre-build
+ - task: build-frontend
+ - go build -gcflags=all="-N -l" -o build/bin/{{ "{{.APP_NAME}}" }} main.go
+ - task: post-build
+ env:
+ CGO_CFLAGS: "-mmacosx-version-min=10.13"
+ CGO_LDFLAGS: "-mmacosx-version-min=10.13"
+
+ generate-icons:
+ summary: Generates Windows `.ico` and Mac `.icns` files from an image
+ dir: build
+ cmds:
+ # Generates both .ico and .icns files
+ - wails generate icons -input appicon.png
+
+ build-app-prod-darwin:
+ summary: Creates a production build of the application
+ cmds:
+ - GOOS=darwin GOARCH={{ "{{.ARCH}}" }} go build -tags production -ldflags="-w -s" -o build/bin/{{ "{{.APP_NAME}}" }}
+ env:
+ CGO_CFLAGS: "-mmacosx-version-min=10.13"
+ CGO_LDFLAGS: "-mmacosx-version-min=10.13"
+ vars:
+ ARCH: $GOARCH
+
+
+ create-app-bundle:
+ summary: Builds a `.app` bundle
+ cmds:
+ - mkdir -p {{ "{{.APP_NAME}}" }}.app/Contents/{MacOS,Resources}
+ - cp build/icons.icns {{ "{{.APP_NAME}}" }}.app/Contents/Resources
+ - cp build/bin/{{ "{{.APP_NAME}}" }} {{ "{{.APP_NAME}}" }}.app/Contents/MacOS
+ - cp build/Info.plist {{ "{{.APP_NAME}}" }}.app/Contents
+
+ package-darwin-arm64:
+ summary: Packages a production build of the application into a `.app` bundle
+ platform: darwin
+ deps:
+ - task: build-app-prod-darwin
+ vars:
+ ARCH: arm64
+ - generate-icons
+ cmds:
+ - task: create-app-bundle
\ No newline at end of file
diff --git a/v3/internal/templates/react-ts/build/Info.plist.tmpl b/v3/internal/templates/react-ts/build/Info.plist.tmpl
new file mode 100644
index 000000000..93d9a5bf1
--- /dev/null
+++ b/v3/internal/templates/react-ts/build/Info.plist.tmpl
@@ -0,0 +1,27 @@
+
+
+
+ CFBundlePackageType
+ APPL
+ CFBundleName
+ {{ "{{.Info.ProductName}}" }}
+ CFBundleExecutable
+ {{ "{{.ProjectName}}" }}
+ CFBundleIdentifier
+ com.wails.{{ "{{.ProjectName}}" }}
+ CFBundleVersion
+ v1.0.0
+ CFBundleGetInfoString
+ This is a comment
+ CFBundleShortVersionString
+ v1.0.0
+ CFBundleIconFile
+ iconfile
+ LSMinimumSystemVersion
+ 10.13.0
+ NSHighResolutionCapable
+ true
+ NSHumanReadableCopyright
+ (c) 2023 My Company Name
+
+
\ No newline at end of file
diff --git a/v3/internal/templates/react-ts/build/appicon.png b/v3/internal/templates/react-ts/build/appicon.png
new file mode 100644
index 000000000..63617fe4f
Binary files /dev/null and b/v3/internal/templates/react-ts/build/appicon.png differ
diff --git a/v3/internal/templates/react-ts/build/info.json b/v3/internal/templates/react-ts/build/info.json
new file mode 100644
index 000000000..1005eb5cb
--- /dev/null
+++ b/v3/internal/templates/react-ts/build/info.json
@@ -0,0 +1,15 @@
+{
+ "fixed": {
+ "file_version": "v1.0.0"
+ },
+ "info": {
+ "0000": {
+ "ProductVersion": "v1.0.0",
+ "CompanyName": "My Company Name",
+ "FileDescription": "A thing that does a thing",
+ "LegalCopyright": "(c) 2023 My Company Name",
+ "ProductName": "My Product Name",
+ "Comments": "This is a comment"
+ }
+ }
+}
\ No newline at end of file
diff --git a/v3/internal/templates/react-ts/frontend/.gitignore b/v3/internal/templates/react-ts/frontend/.gitignore
new file mode 100644
index 000000000..a547bf36d
--- /dev/null
+++ b/v3/internal/templates/react-ts/frontend/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/v3/internal/templates/react-ts/frontend/index.html b/v3/internal/templates/react-ts/frontend/index.html
new file mode 100644
index 000000000..28868c572
--- /dev/null
+++ b/v3/internal/templates/react-ts/frontend/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Wails + React + TS
+
+
+
+
+
+
diff --git a/v3/internal/templates/react-ts/frontend/package.json b/v3/internal/templates/react-ts/frontend/package.json
new file mode 100644
index 000000000..e846a02c1
--- /dev/null
+++ b/v3/internal/templates/react-ts/frontend/package.json
@@ -0,0 +1,22 @@
+{
+ "name": "frontend",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc && vite build",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0"
+ },
+ "devDependencies": {
+ "@types/react": "^18.0.26",
+ "@types/react-dom": "^18.0.9",
+ "@vitejs/plugin-react": "^3.0.0",
+ "typescript": "^4.9.3",
+ "vite": "^4.0.0"
+ }
+}
\ No newline at end of file
diff --git a/v3/internal/templates/react-ts/frontend/public/wails.png b/v3/internal/templates/react-ts/frontend/public/wails.png
new file mode 100644
index 000000000..8bdf42483
Binary files /dev/null and b/v3/internal/templates/react-ts/frontend/public/wails.png differ
diff --git a/v3/internal/templates/react-ts/frontend/src/App.css b/v3/internal/templates/react-ts/frontend/src/App.css
new file mode 100644
index 000000000..2c5e2ef5c
--- /dev/null
+++ b/v3/internal/templates/react-ts/frontend/src/App.css
@@ -0,0 +1,41 @@
+#root {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+ text-align: center;
+}
+
+.logo {
+ height: 6em;
+ padding: 1.5em;
+ will-change: filter;
+}
+.logo:hover {
+ filter: drop-shadow(0 0 2em #646cffaa);
+}
+.logo.react:hover {
+ filter: drop-shadow(0 0 2em #61dafbaa);
+}
+
+@keyframes logo-spin {
+ from {
+ transform: rotate(0deg);
+ }
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+@media (prefers-reduced-motion: no-preference) {
+ a:nth-of-type(2) .logo {
+ animation: logo-spin infinite 20s linear;
+ }
+}
+
+.card {
+ padding: 2em;
+}
+
+.read-the-docs {
+ color: #888;
+}
diff --git a/v3/internal/templates/react-ts/frontend/src/App.tsx b/v3/internal/templates/react-ts/frontend/src/App.tsx
new file mode 100644
index 000000000..cd201360b
--- /dev/null
+++ b/v3/internal/templates/react-ts/frontend/src/App.tsx
@@ -0,0 +1,34 @@
+import { useState } from 'react'
+import reactLogo from './assets/react.svg'
+import './App.css'
+
+function App() {
+ const [count, setCount] = useState(0)
+
+ return (
+
+
+
Vite + React
+
+
+
+ Edit src/App.tsx
and save to test HMR
+
+
+
+ Click on the Vite and React logos to learn more
+
+
+ )
+}
+
+export default App
diff --git a/v3/internal/templates/react-ts/frontend/src/assets/react.svg b/v3/internal/templates/react-ts/frontend/src/assets/react.svg
new file mode 100644
index 000000000..6c87de9bb
--- /dev/null
+++ b/v3/internal/templates/react-ts/frontend/src/assets/react.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/v3/internal/templates/react-ts/frontend/src/index.css b/v3/internal/templates/react-ts/frontend/src/index.css
new file mode 100644
index 000000000..917888c1d
--- /dev/null
+++ b/v3/internal/templates/react-ts/frontend/src/index.css
@@ -0,0 +1,70 @@
+:root {
+ font-family: Inter, Avenir, Helvetica, Arial, sans-serif;
+ font-size: 16px;
+ line-height: 24px;
+ font-weight: 400;
+
+ color-scheme: light dark;
+ color: rgba(255, 255, 255, 0.87);
+ background-color: #242424;
+
+ font-synthesis: none;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-text-size-adjust: 100%;
+}
+
+a {
+ font-weight: 500;
+ color: #646cff;
+ text-decoration: inherit;
+}
+a:hover {
+ color: #535bf2;
+}
+
+body {
+ margin: 0;
+ display: flex;
+ place-items: center;
+ min-width: 320px;
+ min-height: 100vh;
+}
+
+h1 {
+ font-size: 3.2em;
+ line-height: 1.1;
+}
+
+button {
+ border-radius: 8px;
+ border: 1px solid transparent;
+ padding: 0.6em 1.2em;
+ font-size: 1em;
+ font-weight: 500;
+ font-family: inherit;
+ background-color: #1a1a1a;
+ cursor: pointer;
+ transition: border-color 0.25s;
+}
+button:hover {
+ border-color: #646cff;
+}
+button:focus,
+button:focus-visible {
+ outline: 4px auto -webkit-focus-ring-color;
+}
+
+@media (prefers-color-scheme: light) {
+ :root {
+ color: #213547;
+ background-color: #ffffff;
+ }
+ a:hover {
+ color: #747bff;
+ }
+ button {
+ background-color: #f9f9f9;
+ }
+}
diff --git a/v3/internal/templates/react-ts/frontend/src/main.tsx b/v3/internal/templates/react-ts/frontend/src/main.tsx
new file mode 100644
index 000000000..791f139e2
--- /dev/null
+++ b/v3/internal/templates/react-ts/frontend/src/main.tsx
@@ -0,0 +1,10 @@
+import React from 'react'
+import ReactDOM from 'react-dom/client'
+import App from './App'
+import './index.css'
+
+ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
+
+
+ ,
+)
diff --git a/v3/internal/templates/react-ts/frontend/src/vite-env.d.ts b/v3/internal/templates/react-ts/frontend/src/vite-env.d.ts
new file mode 100644
index 000000000..11f02fe2a
--- /dev/null
+++ b/v3/internal/templates/react-ts/frontend/src/vite-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/v3/internal/templates/react-ts/frontend/tsconfig.json b/v3/internal/templates/react-ts/frontend/tsconfig.json
new file mode 100644
index 000000000..3d0a51a86
--- /dev/null
+++ b/v3/internal/templates/react-ts/frontend/tsconfig.json
@@ -0,0 +1,21 @@
+{
+ "compilerOptions": {
+ "target": "ESNext",
+ "useDefineForClassFields": true,
+ "lib": ["DOM", "DOM.Iterable", "ESNext"],
+ "allowJs": false,
+ "skipLibCheck": true,
+ "esModuleInterop": false,
+ "allowSyntheticDefaultImports": true,
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "module": "ESNext",
+ "moduleResolution": "Node",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "jsx": "react-jsx"
+ },
+ "include": ["src"],
+ "references": [{ "path": "./tsconfig.node.json" }]
+}
diff --git a/v3/internal/templates/react-ts/frontend/tsconfig.node.json b/v3/internal/templates/react-ts/frontend/tsconfig.node.json
new file mode 100644
index 000000000..9d31e2aed
--- /dev/null
+++ b/v3/internal/templates/react-ts/frontend/tsconfig.node.json
@@ -0,0 +1,9 @@
+{
+ "compilerOptions": {
+ "composite": true,
+ "module": "ESNext",
+ "moduleResolution": "Node",
+ "allowSyntheticDefaultImports": true
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/v3/internal/templates/react-ts/frontend/vite.config.ts b/v3/internal/templates/react-ts/frontend/vite.config.ts
new file mode 100644
index 000000000..5a33944a9
--- /dev/null
+++ b/v3/internal/templates/react-ts/frontend/vite.config.ts
@@ -0,0 +1,7 @@
+import { defineConfig } from 'vite'
+import react from '@vitejs/plugin-react'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [react()],
+})
diff --git a/v3/internal/templates/react-ts/go.mod.tmpl b/v3/internal/templates/react-ts/go.mod.tmpl
new file mode 100644
index 000000000..270f8c6d7
--- /dev/null
+++ b/v3/internal/templates/react-ts/go.mod.tmpl
@@ -0,0 +1,13 @@
+module changeme
+
+go 1.19
+
+require github.com/wailsapp/wails/v3 v3.0.0-alpha.0
+
+require (
+ github.com/imdario/mergo v0.3.12 // indirect
+ github.com/leaanthony/slicer v1.5.0 // indirect
+ github.com/wailsapp/mimetype v1.4.1 // indirect
+ github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6 // indirect
+ golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect
+)
diff --git a/v3/internal/templates/react-ts/go.sum.tmpl b/v3/internal/templates/react-ts/go.sum.tmpl
new file mode 100644
index 000000000..29c7b303e
--- /dev/null
+++ b/v3/internal/templates/react-ts/go.sum.tmpl
@@ -0,0 +1,22 @@
+github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
+github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
+github.com/leaanthony/slicer v1.5.0 h1:aHYTN8xbCCLxJmkNKiLB6tgcMARl4eWmH9/F+S/0HtY=
+github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY=
+github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=
+github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs=
+github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o=
+github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6 h1:Wn+nhnS+VytzE0PegUzSh4T3hXJCtggKGD/4U5H9+wQ=
+github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6/go.mod h1:zlNLI0E2c2qA6miiuAHtp0Bac8FaGH0tlhA19OssR/8=
+github.com/wailsapp/wails/v3 v3.0.0-alpha.0 h1:T5gqG98Xr8LBf69oxlPkhpsFD59w2SnqUZk6XHj8Zoc=
+github.com/wailsapp/wails/v3 v3.0.0-alpha.0/go.mod h1:OAfO5bP0TSUvCIHZYc6Dqfow/9RqxzHvYtmhWPpo1c0=
+golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
diff --git a/v3/internal/templates/react-ts/main.tmpl.go b/v3/internal/templates/react-ts/main.tmpl.go
new file mode 100644
index 000000000..ea8f138b8
--- /dev/null
+++ b/v3/internal/templates/react-ts/main.tmpl.go
@@ -0,0 +1,45 @@
+package main
+
+import (
+ "embed"
+ _ "embed"
+ "log"
+
+ "github.com/wailsapp/wails/v3/pkg/options"
+
+ "github.com/wailsapp/wails/v3/pkg/application"
+)
+
+//go:embed frontend/dist
+var assets embed.FS
+
+func main() {
+ app := application.New(options.Application{
+ Name: "{{.ProjectName}}",
+ Description: "A demo of using raw HTML & CSS",
+ Mac: options.Mac{
+ ApplicationShouldTerminateAfterLastWindowClosed: true,
+ },
+ })
+ // Create window
+ app.NewWebviewWindowWithOptions(&options.WebviewWindow{
+ Title: "Plain Bundle",
+ CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
+ Mac: options.MacWindow{
+ InvisibleTitleBarHeight: 50,
+ Backdrop: options.MacBackdropTranslucent,
+ TitleBar: options.TitleBarHiddenInset,
+ },
+
+ URL: "/",
+ Assets: options.Assets{
+ FS: assets,
+ },
+ })
+
+ err := app.Run()
+
+ if err != nil {
+ log.Fatal(err)
+ }
+}
diff --git a/v3/internal/templates/react/Taskfile.tmpl.yml b/v3/internal/templates/react/Taskfile.tmpl.yml
new file mode 100644
index 000000000..4d3d4b22d
--- /dev/null
+++ b/v3/internal/templates/react/Taskfile.tmpl.yml
@@ -0,0 +1,82 @@
+version: '3'
+
+vars:
+ APP_NAME: "{{.ProjectName}}"
+
+tasks:
+
+ pre-build:
+ summary: Pre-build hooks
+
+ post-build:
+ summary: Post-build hooks
+
+ install-frontend-deps:
+ summary: Install frontend dependencies
+ dir: frontend
+ sources:
+ - package.json
+ - package-lock.json
+ generates:
+ - node_modules/*
+ preconditions:
+ - sh: npm version
+ msg: "Looks like npm isn't installed. Npm is part of the Node installer: https://nodejs.org/en/download/"
+ cmds:
+ - npm install
+
+ build-frontend:
+ summary: Build the frontend project
+ dir: frontend
+ deps:
+ - install-frontend-deps
+ cmds:
+ - npm run build
+
+ build:
+ summary: Builds the application
+ cmds:
+ - task: pre-build
+ - task: build-frontend
+ - go build -gcflags=all="-N -l" -o build/bin/{{ "{{.APP_NAME}}" }} main.go
+ - task: post-build
+ env:
+ CGO_CFLAGS: "-mmacosx-version-min=10.13"
+ CGO_LDFLAGS: "-mmacosx-version-min=10.13"
+
+ generate-icons:
+ summary: Generates Windows `.ico` and Mac `.icns` files from an image
+ dir: build
+ cmds:
+ # Generates both .ico and .icns files
+ - wails generate icons -input appicon.png
+
+ build-app-prod-darwin:
+ summary: Creates a production build of the application
+ cmds:
+ - GOOS=darwin GOARCH={{ "{{.ARCH}}" }} go build -tags production -ldflags="-w -s" -o build/bin/{{ "{{.APP_NAME}}" }}
+ env:
+ CGO_CFLAGS: "-mmacosx-version-min=10.13"
+ CGO_LDFLAGS: "-mmacosx-version-min=10.13"
+ vars:
+ ARCH: $GOARCH
+
+
+ create-app-bundle:
+ summary: Builds a `.app` bundle
+ cmds:
+ - mkdir -p {{ "{{.APP_NAME}}" }}.app/Contents/{MacOS,Resources}
+ - cp build/icons.icns {{ "{{.APP_NAME}}" }}.app/Contents/Resources
+ - cp build/bin/{{ "{{.APP_NAME}}" }} {{ "{{.APP_NAME}}" }}.app/Contents/MacOS
+ - cp build/Info.plist {{ "{{.APP_NAME}}" }}.app/Contents
+
+ package-darwin-arm64:
+ summary: Packages a production build of the application into a `.app` bundle
+ platform: darwin
+ deps:
+ - task: build-app-prod-darwin
+ vars:
+ ARCH: arm64
+ - generate-icons
+ cmds:
+ - task: create-app-bundle
\ No newline at end of file
diff --git a/v3/internal/templates/react/build/Info.plist.tmpl b/v3/internal/templates/react/build/Info.plist.tmpl
new file mode 100644
index 000000000..93d9a5bf1
--- /dev/null
+++ b/v3/internal/templates/react/build/Info.plist.tmpl
@@ -0,0 +1,27 @@
+
+
+
+ CFBundlePackageType
+ APPL
+ CFBundleName
+ {{ "{{.Info.ProductName}}" }}
+ CFBundleExecutable
+ {{ "{{.ProjectName}}" }}
+ CFBundleIdentifier
+ com.wails.{{ "{{.ProjectName}}" }}
+ CFBundleVersion
+ v1.0.0
+ CFBundleGetInfoString
+ This is a comment
+ CFBundleShortVersionString
+ v1.0.0
+ CFBundleIconFile
+ iconfile
+ LSMinimumSystemVersion
+ 10.13.0
+ NSHighResolutionCapable
+ true
+ NSHumanReadableCopyright
+ (c) 2023 My Company Name
+
+
\ No newline at end of file
diff --git a/v3/internal/templates/react/build/appicon.png b/v3/internal/templates/react/build/appicon.png
new file mode 100644
index 000000000..63617fe4f
Binary files /dev/null and b/v3/internal/templates/react/build/appicon.png differ
diff --git a/v3/internal/templates/react/build/info.json b/v3/internal/templates/react/build/info.json
new file mode 100644
index 000000000..1005eb5cb
--- /dev/null
+++ b/v3/internal/templates/react/build/info.json
@@ -0,0 +1,15 @@
+{
+ "fixed": {
+ "file_version": "v1.0.0"
+ },
+ "info": {
+ "0000": {
+ "ProductVersion": "v1.0.0",
+ "CompanyName": "My Company Name",
+ "FileDescription": "A thing that does a thing",
+ "LegalCopyright": "(c) 2023 My Company Name",
+ "ProductName": "My Product Name",
+ "Comments": "This is a comment"
+ }
+ }
+}
\ No newline at end of file
diff --git a/v3/internal/templates/react/frontend/.gitignore b/v3/internal/templates/react/frontend/.gitignore
new file mode 100644
index 000000000..a547bf36d
--- /dev/null
+++ b/v3/internal/templates/react/frontend/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/v3/internal/templates/react/frontend/index.html b/v3/internal/templates/react/frontend/index.html
new file mode 100644
index 000000000..fe5530dd4
--- /dev/null
+++ b/v3/internal/templates/react/frontend/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Wails + React
+
+
+
+
+
+
diff --git a/v3/internal/templates/react/frontend/package.json b/v3/internal/templates/react/frontend/package.json
new file mode 100644
index 000000000..2371d17c8
--- /dev/null
+++ b/v3/internal/templates/react/frontend/package.json
@@ -0,0 +1,21 @@
+{
+ "name": "frontend",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0"
+ },
+ "devDependencies": {
+ "@types/react": "^18.0.26",
+ "@types/react-dom": "^18.0.9",
+ "@vitejs/plugin-react": "^3.0.0",
+ "vite": "^4.0.0"
+ }
+}
\ No newline at end of file
diff --git a/v3/internal/templates/react/frontend/public/wails.png b/v3/internal/templates/react/frontend/public/wails.png
new file mode 100644
index 000000000..8bdf42483
Binary files /dev/null and b/v3/internal/templates/react/frontend/public/wails.png differ
diff --git a/v3/internal/templates/react/frontend/src/App.css b/v3/internal/templates/react/frontend/src/App.css
new file mode 100644
index 000000000..2c5e2ef5c
--- /dev/null
+++ b/v3/internal/templates/react/frontend/src/App.css
@@ -0,0 +1,41 @@
+#root {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+ text-align: center;
+}
+
+.logo {
+ height: 6em;
+ padding: 1.5em;
+ will-change: filter;
+}
+.logo:hover {
+ filter: drop-shadow(0 0 2em #646cffaa);
+}
+.logo.react:hover {
+ filter: drop-shadow(0 0 2em #61dafbaa);
+}
+
+@keyframes logo-spin {
+ from {
+ transform: rotate(0deg);
+ }
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+@media (prefers-reduced-motion: no-preference) {
+ a:nth-of-type(2) .logo {
+ animation: logo-spin infinite 20s linear;
+ }
+}
+
+.card {
+ padding: 2em;
+}
+
+.read-the-docs {
+ color: #888;
+}
diff --git a/v3/internal/templates/react/frontend/src/App.jsx b/v3/internal/templates/react/frontend/src/App.jsx
new file mode 100644
index 000000000..ef0adc0d5
--- /dev/null
+++ b/v3/internal/templates/react/frontend/src/App.jsx
@@ -0,0 +1,34 @@
+import { useState } from 'react'
+import reactLogo from './assets/react.svg'
+import './App.css'
+
+function App() {
+ const [count, setCount] = useState(0)
+
+ return (
+
+
+
Vite + React
+
+
+
+ Edit src/App.jsx
and save to test HMR
+
+
+
+ Click on the Vite and React logos to learn more
+
+
+ )
+}
+
+export default App
diff --git a/v3/internal/templates/react/frontend/src/assets/react.svg b/v3/internal/templates/react/frontend/src/assets/react.svg
new file mode 100644
index 000000000..6c87de9bb
--- /dev/null
+++ b/v3/internal/templates/react/frontend/src/assets/react.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/v3/internal/templates/react/frontend/src/index.css b/v3/internal/templates/react/frontend/src/index.css
new file mode 100644
index 000000000..917888c1d
--- /dev/null
+++ b/v3/internal/templates/react/frontend/src/index.css
@@ -0,0 +1,70 @@
+:root {
+ font-family: Inter, Avenir, Helvetica, Arial, sans-serif;
+ font-size: 16px;
+ line-height: 24px;
+ font-weight: 400;
+
+ color-scheme: light dark;
+ color: rgba(255, 255, 255, 0.87);
+ background-color: #242424;
+
+ font-synthesis: none;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-text-size-adjust: 100%;
+}
+
+a {
+ font-weight: 500;
+ color: #646cff;
+ text-decoration: inherit;
+}
+a:hover {
+ color: #535bf2;
+}
+
+body {
+ margin: 0;
+ display: flex;
+ place-items: center;
+ min-width: 320px;
+ min-height: 100vh;
+}
+
+h1 {
+ font-size: 3.2em;
+ line-height: 1.1;
+}
+
+button {
+ border-radius: 8px;
+ border: 1px solid transparent;
+ padding: 0.6em 1.2em;
+ font-size: 1em;
+ font-weight: 500;
+ font-family: inherit;
+ background-color: #1a1a1a;
+ cursor: pointer;
+ transition: border-color 0.25s;
+}
+button:hover {
+ border-color: #646cff;
+}
+button:focus,
+button:focus-visible {
+ outline: 4px auto -webkit-focus-ring-color;
+}
+
+@media (prefers-color-scheme: light) {
+ :root {
+ color: #213547;
+ background-color: #ffffff;
+ }
+ a:hover {
+ color: #747bff;
+ }
+ button {
+ background-color: #f9f9f9;
+ }
+}
diff --git a/v3/internal/templates/react/frontend/src/main.jsx b/v3/internal/templates/react/frontend/src/main.jsx
new file mode 100644
index 000000000..5cc599199
--- /dev/null
+++ b/v3/internal/templates/react/frontend/src/main.jsx
@@ -0,0 +1,10 @@
+import React from 'react'
+import ReactDOM from 'react-dom/client'
+import App from './App'
+import './index.css'
+
+ReactDOM.createRoot(document.getElementById('root')).render(
+
+
+ ,
+)
diff --git a/v3/internal/templates/react/frontend/vite.config.js b/v3/internal/templates/react/frontend/vite.config.js
new file mode 100644
index 000000000..5a33944a9
--- /dev/null
+++ b/v3/internal/templates/react/frontend/vite.config.js
@@ -0,0 +1,7 @@
+import { defineConfig } from 'vite'
+import react from '@vitejs/plugin-react'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [react()],
+})
diff --git a/v3/internal/templates/react/go.mod.tmpl b/v3/internal/templates/react/go.mod.tmpl
new file mode 100644
index 000000000..270f8c6d7
--- /dev/null
+++ b/v3/internal/templates/react/go.mod.tmpl
@@ -0,0 +1,13 @@
+module changeme
+
+go 1.19
+
+require github.com/wailsapp/wails/v3 v3.0.0-alpha.0
+
+require (
+ github.com/imdario/mergo v0.3.12 // indirect
+ github.com/leaanthony/slicer v1.5.0 // indirect
+ github.com/wailsapp/mimetype v1.4.1 // indirect
+ github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6 // indirect
+ golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect
+)
diff --git a/v3/internal/templates/react/go.sum.tmpl b/v3/internal/templates/react/go.sum.tmpl
new file mode 100644
index 000000000..29c7b303e
--- /dev/null
+++ b/v3/internal/templates/react/go.sum.tmpl
@@ -0,0 +1,22 @@
+github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
+github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
+github.com/leaanthony/slicer v1.5.0 h1:aHYTN8xbCCLxJmkNKiLB6tgcMARl4eWmH9/F+S/0HtY=
+github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY=
+github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=
+github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs=
+github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o=
+github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6 h1:Wn+nhnS+VytzE0PegUzSh4T3hXJCtggKGD/4U5H9+wQ=
+github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6/go.mod h1:zlNLI0E2c2qA6miiuAHtp0Bac8FaGH0tlhA19OssR/8=
+github.com/wailsapp/wails/v3 v3.0.0-alpha.0 h1:T5gqG98Xr8LBf69oxlPkhpsFD59w2SnqUZk6XHj8Zoc=
+github.com/wailsapp/wails/v3 v3.0.0-alpha.0/go.mod h1:OAfO5bP0TSUvCIHZYc6Dqfow/9RqxzHvYtmhWPpo1c0=
+golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
diff --git a/v3/internal/templates/react/main.tmpl.go b/v3/internal/templates/react/main.tmpl.go
new file mode 100644
index 000000000..ea8f138b8
--- /dev/null
+++ b/v3/internal/templates/react/main.tmpl.go
@@ -0,0 +1,45 @@
+package main
+
+import (
+ "embed"
+ _ "embed"
+ "log"
+
+ "github.com/wailsapp/wails/v3/pkg/options"
+
+ "github.com/wailsapp/wails/v3/pkg/application"
+)
+
+//go:embed frontend/dist
+var assets embed.FS
+
+func main() {
+ app := application.New(options.Application{
+ Name: "{{.ProjectName}}",
+ Description: "A demo of using raw HTML & CSS",
+ Mac: options.Mac{
+ ApplicationShouldTerminateAfterLastWindowClosed: true,
+ },
+ })
+ // Create window
+ app.NewWebviewWindowWithOptions(&options.WebviewWindow{
+ Title: "Plain Bundle",
+ CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
+ Mac: options.MacWindow{
+ InvisibleTitleBarHeight: 50,
+ Backdrop: options.MacBackdropTranslucent,
+ TitleBar: options.TitleBarHiddenInset,
+ },
+
+ URL: "/",
+ Assets: options.Assets{
+ FS: assets,
+ },
+ })
+
+ err := app.Run()
+
+ if err != nil {
+ log.Fatal(err)
+ }
+}
diff --git a/v3/internal/templates/svelte-ts/Taskfile.tmpl.yml b/v3/internal/templates/svelte-ts/Taskfile.tmpl.yml
new file mode 100644
index 000000000..4d3d4b22d
--- /dev/null
+++ b/v3/internal/templates/svelte-ts/Taskfile.tmpl.yml
@@ -0,0 +1,82 @@
+version: '3'
+
+vars:
+ APP_NAME: "{{.ProjectName}}"
+
+tasks:
+
+ pre-build:
+ summary: Pre-build hooks
+
+ post-build:
+ summary: Post-build hooks
+
+ install-frontend-deps:
+ summary: Install frontend dependencies
+ dir: frontend
+ sources:
+ - package.json
+ - package-lock.json
+ generates:
+ - node_modules/*
+ preconditions:
+ - sh: npm version
+ msg: "Looks like npm isn't installed. Npm is part of the Node installer: https://nodejs.org/en/download/"
+ cmds:
+ - npm install
+
+ build-frontend:
+ summary: Build the frontend project
+ dir: frontend
+ deps:
+ - install-frontend-deps
+ cmds:
+ - npm run build
+
+ build:
+ summary: Builds the application
+ cmds:
+ - task: pre-build
+ - task: build-frontend
+ - go build -gcflags=all="-N -l" -o build/bin/{{ "{{.APP_NAME}}" }} main.go
+ - task: post-build
+ env:
+ CGO_CFLAGS: "-mmacosx-version-min=10.13"
+ CGO_LDFLAGS: "-mmacosx-version-min=10.13"
+
+ generate-icons:
+ summary: Generates Windows `.ico` and Mac `.icns` files from an image
+ dir: build
+ cmds:
+ # Generates both .ico and .icns files
+ - wails generate icons -input appicon.png
+
+ build-app-prod-darwin:
+ summary: Creates a production build of the application
+ cmds:
+ - GOOS=darwin GOARCH={{ "{{.ARCH}}" }} go build -tags production -ldflags="-w -s" -o build/bin/{{ "{{.APP_NAME}}" }}
+ env:
+ CGO_CFLAGS: "-mmacosx-version-min=10.13"
+ CGO_LDFLAGS: "-mmacosx-version-min=10.13"
+ vars:
+ ARCH: $GOARCH
+
+
+ create-app-bundle:
+ summary: Builds a `.app` bundle
+ cmds:
+ - mkdir -p {{ "{{.APP_NAME}}" }}.app/Contents/{MacOS,Resources}
+ - cp build/icons.icns {{ "{{.APP_NAME}}" }}.app/Contents/Resources
+ - cp build/bin/{{ "{{.APP_NAME}}" }} {{ "{{.APP_NAME}}" }}.app/Contents/MacOS
+ - cp build/Info.plist {{ "{{.APP_NAME}}" }}.app/Contents
+
+ package-darwin-arm64:
+ summary: Packages a production build of the application into a `.app` bundle
+ platform: darwin
+ deps:
+ - task: build-app-prod-darwin
+ vars:
+ ARCH: arm64
+ - generate-icons
+ cmds:
+ - task: create-app-bundle
\ No newline at end of file
diff --git a/v3/internal/templates/svelte-ts/build/Info.plist.tmpl b/v3/internal/templates/svelte-ts/build/Info.plist.tmpl
new file mode 100644
index 000000000..93d9a5bf1
--- /dev/null
+++ b/v3/internal/templates/svelte-ts/build/Info.plist.tmpl
@@ -0,0 +1,27 @@
+
+
+
+ CFBundlePackageType
+ APPL
+ CFBundleName
+ {{ "{{.Info.ProductName}}" }}
+ CFBundleExecutable
+ {{ "{{.ProjectName}}" }}
+ CFBundleIdentifier
+ com.wails.{{ "{{.ProjectName}}" }}
+ CFBundleVersion
+ v1.0.0
+ CFBundleGetInfoString
+ This is a comment
+ CFBundleShortVersionString
+ v1.0.0
+ CFBundleIconFile
+ iconfile
+ LSMinimumSystemVersion
+ 10.13.0
+ NSHighResolutionCapable
+ true
+ NSHumanReadableCopyright
+ (c) 2023 My Company Name
+
+
\ No newline at end of file
diff --git a/v3/internal/templates/svelte-ts/build/appicon.png b/v3/internal/templates/svelte-ts/build/appicon.png
new file mode 100644
index 000000000..63617fe4f
Binary files /dev/null and b/v3/internal/templates/svelte-ts/build/appicon.png differ
diff --git a/v3/internal/templates/svelte-ts/build/info.json b/v3/internal/templates/svelte-ts/build/info.json
new file mode 100644
index 000000000..1005eb5cb
--- /dev/null
+++ b/v3/internal/templates/svelte-ts/build/info.json
@@ -0,0 +1,15 @@
+{
+ "fixed": {
+ "file_version": "v1.0.0"
+ },
+ "info": {
+ "0000": {
+ "ProductVersion": "v1.0.0",
+ "CompanyName": "My Company Name",
+ "FileDescription": "A thing that does a thing",
+ "LegalCopyright": "(c) 2023 My Company Name",
+ "ProductName": "My Product Name",
+ "Comments": "This is a comment"
+ }
+ }
+}
\ No newline at end of file
diff --git a/v3/internal/templates/svelte-ts/frontend/.gitignore b/v3/internal/templates/svelte-ts/frontend/.gitignore
new file mode 100644
index 000000000..a547bf36d
--- /dev/null
+++ b/v3/internal/templates/svelte-ts/frontend/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/v3/internal/templates/svelte-ts/frontend/.vscode/extensions.json b/v3/internal/templates/svelte-ts/frontend/.vscode/extensions.json
new file mode 100644
index 000000000..bdef82015
--- /dev/null
+++ b/v3/internal/templates/svelte-ts/frontend/.vscode/extensions.json
@@ -0,0 +1,3 @@
+{
+ "recommendations": ["svelte.svelte-vscode"]
+}
diff --git a/v3/internal/templates/svelte-ts/frontend/README.md b/v3/internal/templates/svelte-ts/frontend/README.md
new file mode 100644
index 000000000..e6cd94fce
--- /dev/null
+++ b/v3/internal/templates/svelte-ts/frontend/README.md
@@ -0,0 +1,47 @@
+# Svelte + TS + Vite
+
+This template should help get you started developing with Svelte and TypeScript in Vite.
+
+## Recommended IDE Setup
+
+[VS Code](https://code.visualstudio.com/) + [Svelte](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode).
+
+## Need an official Svelte framework?
+
+Check out [SvelteKit](https://github.com/sveltejs/kit#readme), which is also powered by Vite. Deploy anywhere with its serverless-first approach and adapt to various platforms, with out of the box support for TypeScript, SCSS, and Less, and easily-added support for mdsvex, GraphQL, PostCSS, Tailwind CSS, and more.
+
+## Technical considerations
+
+**Why use this over SvelteKit?**
+
+- It brings its own routing solution which might not be preferable for some users.
+- It is first and foremost a framework that just happens to use Vite under the hood, not a Vite app.
+
+This template contains as little as possible to get started with Vite + TypeScript + Svelte, while taking into account the developer experience with regards to HMR and intellisense. It demonstrates capabilities on par with the other `create-vite` templates and is a good starting point for beginners dipping their toes into a Vite + Svelte project.
+
+Should you later need the extended capabilities and extensibility provided by SvelteKit, the template has been structured similarly to SvelteKit so that it is easy to migrate.
+
+**Why `global.d.ts` instead of `compilerOptions.types` inside `jsconfig.json` or `tsconfig.json`?**
+
+Setting `compilerOptions.types` shuts out all other types not explicitly listed in the configuration. Using triple-slash references keeps the default TypeScript setting of accepting type information from the entire workspace, while also adding `svelte` and `vite/client` type information.
+
+**Why include `.vscode/extensions.json`?**
+
+Other templates indirectly recommend extensions via the README, but this file allows VS Code to prompt the user to install the recommended extension upon opening the project.
+
+**Why enable `allowJs` in the TS template?**
+
+While `allowJs: false` would indeed prevent the use of `.js` files in the project, it does not prevent the use of JavaScript syntax in `.svelte` files. In addition, it would force `checkJs: false`, bringing the worst of both worlds: not being able to guarantee the entire codebase is TypeScript, and also having worse typechecking for the existing JavaScript. In addition, there are valid use cases in which a mixed codebase may be relevant.
+
+**Why is HMR not preserving my local component state?**
+
+HMR state preservation comes with a number of gotchas! It has been disabled by default in both `svelte-hmr` and `@sveltejs/vite-plugin-svelte` due to its often surprising behavior. You can read the details [here](https://github.com/rixo/svelte-hmr#svelte-hmr).
+
+If you have state that's important to retain within a component, consider creating an external store which would not be replaced by HMR.
+
+```ts
+// store.ts
+// An extremely simple external store
+import { writable } from 'svelte/store'
+export default writable(0)
+```
diff --git a/v3/internal/templates/svelte-ts/frontend/index.html b/v3/internal/templates/svelte-ts/frontend/index.html
new file mode 100644
index 000000000..a7eaac78d
--- /dev/null
+++ b/v3/internal/templates/svelte-ts/frontend/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Wails + Svelte + TS
+
+
+
+
+
+
diff --git a/v3/internal/templates/svelte-ts/frontend/package.json b/v3/internal/templates/svelte-ts/frontend/package.json
new file mode 100644
index 000000000..222683e0d
--- /dev/null
+++ b/v3/internal/templates/svelte-ts/frontend/package.json
@@ -0,0 +1,21 @@
+{
+ "name": "frontend",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview",
+ "check": "svelte-check --tsconfig ./tsconfig.json"
+ },
+ "devDependencies": {
+ "@sveltejs/vite-plugin-svelte": "^2.0.0",
+ "@tsconfig/svelte": "^3.0.0",
+ "svelte": "^3.54.0",
+ "svelte-check": "^2.10.0",
+ "tslib": "^2.4.1",
+ "typescript": "^4.9.3",
+ "vite": "^4.0.0"
+ }
+}
\ No newline at end of file
diff --git a/v3/internal/templates/svelte-ts/frontend/public/wails.png b/v3/internal/templates/svelte-ts/frontend/public/wails.png
new file mode 100644
index 000000000..8bdf42483
Binary files /dev/null and b/v3/internal/templates/svelte-ts/frontend/public/wails.png differ
diff --git a/v3/internal/templates/svelte-ts/frontend/src/App.svelte b/v3/internal/templates/svelte-ts/frontend/src/App.svelte
new file mode 100644
index 000000000..1e9dc0394
--- /dev/null
+++ b/v3/internal/templates/svelte-ts/frontend/src/App.svelte
@@ -0,0 +1,45 @@
+
+
+
+
+ Vite + Svelte
+
+
+
+
+
+
+ Check out SvelteKit, the official Svelte app framework powered by Vite!
+
+
+
+ Click on the Vite and Svelte logos to learn more
+
+
+
+
\ No newline at end of file
diff --git a/v3/internal/templates/svelte-ts/frontend/src/app.css b/v3/internal/templates/svelte-ts/frontend/src/app.css
new file mode 100644
index 000000000..bcc7233dd
--- /dev/null
+++ b/v3/internal/templates/svelte-ts/frontend/src/app.css
@@ -0,0 +1,81 @@
+:root {
+ font-family: Inter, Avenir, Helvetica, Arial, sans-serif;
+ font-size: 16px;
+ line-height: 24px;
+ font-weight: 400;
+
+ color-scheme: light dark;
+ color: rgba(255, 255, 255, 0.87);
+ background-color: #242424;
+
+ font-synthesis: none;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-text-size-adjust: 100%;
+}
+
+a {
+ font-weight: 500;
+ color: #646cff;
+ text-decoration: inherit;
+}
+a:hover {
+ color: #535bf2;
+}
+
+body {
+ margin: 0;
+ display: flex;
+ place-items: center;
+ min-width: 320px;
+ min-height: 100vh;
+}
+
+h1 {
+ font-size: 3.2em;
+ line-height: 1.1;
+}
+
+.card {
+ padding: 2em;
+}
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+ text-align: center;
+}
+
+button {
+ border-radius: 8px;
+ border: 1px solid transparent;
+ padding: 0.6em 1.2em;
+ font-size: 1em;
+ font-weight: 500;
+ font-family: inherit;
+ background-color: #1a1a1a;
+ cursor: pointer;
+ transition: border-color 0.25s;
+}
+button:hover {
+ border-color: #646cff;
+}
+button:focus,
+button:focus-visible {
+ outline: 4px auto -webkit-focus-ring-color;
+}
+
+@media (prefers-color-scheme: light) {
+ :root {
+ color: #213547;
+ background-color: #ffffff;
+ }
+ a:hover {
+ color: #747bff;
+ }
+ button {
+ background-color: #f9f9f9;
+ }
+}
diff --git a/v3/internal/templates/svelte-ts/frontend/src/assets/svelte.svg b/v3/internal/templates/svelte-ts/frontend/src/assets/svelte.svg
new file mode 100644
index 000000000..c5e08481f
--- /dev/null
+++ b/v3/internal/templates/svelte-ts/frontend/src/assets/svelte.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/v3/internal/templates/svelte-ts/frontend/src/lib/Counter.svelte b/v3/internal/templates/svelte-ts/frontend/src/lib/Counter.svelte
new file mode 100644
index 000000000..979b4dfc9
--- /dev/null
+++ b/v3/internal/templates/svelte-ts/frontend/src/lib/Counter.svelte
@@ -0,0 +1,10 @@
+
+
+
diff --git a/v3/internal/templates/svelte-ts/frontend/src/main.ts b/v3/internal/templates/svelte-ts/frontend/src/main.ts
new file mode 100644
index 000000000..8a909a15a
--- /dev/null
+++ b/v3/internal/templates/svelte-ts/frontend/src/main.ts
@@ -0,0 +1,8 @@
+import './app.css'
+import App from './App.svelte'
+
+const app = new App({
+ target: document.getElementById('app'),
+})
+
+export default app
diff --git a/v3/internal/templates/svelte-ts/frontend/src/vite-env.d.ts b/v3/internal/templates/svelte-ts/frontend/src/vite-env.d.ts
new file mode 100644
index 000000000..4078e7476
--- /dev/null
+++ b/v3/internal/templates/svelte-ts/frontend/src/vite-env.d.ts
@@ -0,0 +1,2 @@
+///
+///
diff --git a/v3/internal/templates/svelte-ts/frontend/svelte.config.js b/v3/internal/templates/svelte-ts/frontend/svelte.config.js
new file mode 100644
index 000000000..7a2b764a6
--- /dev/null
+++ b/v3/internal/templates/svelte-ts/frontend/svelte.config.js
@@ -0,0 +1,7 @@
+import { wailsPreprocess } from '@sveltejs/wails-plugin-svelte'
+
+export default {
+ // Consult https://svelte.dev/docs#compile-time-svelte-preprocess
+ // for more information about preprocessors
+ preprocess: wailsPreprocess(),
+}
diff --git a/v3/internal/templates/svelte-ts/frontend/tsconfig.json b/v3/internal/templates/svelte-ts/frontend/tsconfig.json
new file mode 100644
index 000000000..c4e1c5fe6
--- /dev/null
+++ b/v3/internal/templates/svelte-ts/frontend/tsconfig.json
@@ -0,0 +1,20 @@
+{
+ "extends": "@tsconfig/svelte/tsconfig.json",
+ "compilerOptions": {
+ "target": "ESNext",
+ "useDefineForClassFields": true,
+ "module": "ESNext",
+ "resolveJsonModule": true,
+ /**
+ * Typecheck JS in `.svelte` and `.js` files by default.
+ * Disable checkJs if you'd like to use dynamic types in JS.
+ * Note that setting allowJs false does not prevent the use
+ * of JS in `.svelte` files.
+ */
+ "allowJs": true,
+ "checkJs": true,
+ "isolatedModules": true
+ },
+ "include": ["src/**/*.d.ts", "src/**/*.ts", "src/**/*.js", "src/**/*.svelte"],
+ "references": [{ "path": "./tsconfig.node.json" }]
+}
diff --git a/v3/internal/templates/svelte-ts/frontend/tsconfig.node.json b/v3/internal/templates/svelte-ts/frontend/tsconfig.node.json
new file mode 100644
index 000000000..65dbdb96a
--- /dev/null
+++ b/v3/internal/templates/svelte-ts/frontend/tsconfig.node.json
@@ -0,0 +1,8 @@
+{
+ "compilerOptions": {
+ "composite": true,
+ "module": "ESNext",
+ "moduleResolution": "Node"
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/v3/internal/templates/svelte-ts/frontend/vite.config.ts b/v3/internal/templates/svelte-ts/frontend/vite.config.ts
new file mode 100644
index 000000000..d70196943
--- /dev/null
+++ b/v3/internal/templates/svelte-ts/frontend/vite.config.ts
@@ -0,0 +1,7 @@
+import { defineConfig } from 'vite'
+import { svelte } from '@sveltejs/vite-plugin-svelte'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [svelte()],
+})
diff --git a/v3/internal/templates/svelte-ts/go.mod.tmpl b/v3/internal/templates/svelte-ts/go.mod.tmpl
new file mode 100644
index 000000000..270f8c6d7
--- /dev/null
+++ b/v3/internal/templates/svelte-ts/go.mod.tmpl
@@ -0,0 +1,13 @@
+module changeme
+
+go 1.19
+
+require github.com/wailsapp/wails/v3 v3.0.0-alpha.0
+
+require (
+ github.com/imdario/mergo v0.3.12 // indirect
+ github.com/leaanthony/slicer v1.5.0 // indirect
+ github.com/wailsapp/mimetype v1.4.1 // indirect
+ github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6 // indirect
+ golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect
+)
diff --git a/v3/internal/templates/svelte-ts/go.sum.tmpl b/v3/internal/templates/svelte-ts/go.sum.tmpl
new file mode 100644
index 000000000..29c7b303e
--- /dev/null
+++ b/v3/internal/templates/svelte-ts/go.sum.tmpl
@@ -0,0 +1,22 @@
+github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
+github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
+github.com/leaanthony/slicer v1.5.0 h1:aHYTN8xbCCLxJmkNKiLB6tgcMARl4eWmH9/F+S/0HtY=
+github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY=
+github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=
+github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs=
+github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o=
+github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6 h1:Wn+nhnS+VytzE0PegUzSh4T3hXJCtggKGD/4U5H9+wQ=
+github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6/go.mod h1:zlNLI0E2c2qA6miiuAHtp0Bac8FaGH0tlhA19OssR/8=
+github.com/wailsapp/wails/v3 v3.0.0-alpha.0 h1:T5gqG98Xr8LBf69oxlPkhpsFD59w2SnqUZk6XHj8Zoc=
+github.com/wailsapp/wails/v3 v3.0.0-alpha.0/go.mod h1:OAfO5bP0TSUvCIHZYc6Dqfow/9RqxzHvYtmhWPpo1c0=
+golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
diff --git a/v3/internal/templates/svelte-ts/main.tmpl.go b/v3/internal/templates/svelte-ts/main.tmpl.go
new file mode 100644
index 000000000..ea8f138b8
--- /dev/null
+++ b/v3/internal/templates/svelte-ts/main.tmpl.go
@@ -0,0 +1,45 @@
+package main
+
+import (
+ "embed"
+ _ "embed"
+ "log"
+
+ "github.com/wailsapp/wails/v3/pkg/options"
+
+ "github.com/wailsapp/wails/v3/pkg/application"
+)
+
+//go:embed frontend/dist
+var assets embed.FS
+
+func main() {
+ app := application.New(options.Application{
+ Name: "{{.ProjectName}}",
+ Description: "A demo of using raw HTML & CSS",
+ Mac: options.Mac{
+ ApplicationShouldTerminateAfterLastWindowClosed: true,
+ },
+ })
+ // Create window
+ app.NewWebviewWindowWithOptions(&options.WebviewWindow{
+ Title: "Plain Bundle",
+ CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
+ Mac: options.MacWindow{
+ InvisibleTitleBarHeight: 50,
+ Backdrop: options.MacBackdropTranslucent,
+ TitleBar: options.TitleBarHiddenInset,
+ },
+
+ URL: "/",
+ Assets: options.Assets{
+ FS: assets,
+ },
+ })
+
+ err := app.Run()
+
+ if err != nil {
+ log.Fatal(err)
+ }
+}
diff --git a/v3/internal/templates/svelte/Taskfile.tmpl.yml b/v3/internal/templates/svelte/Taskfile.tmpl.yml
new file mode 100644
index 000000000..4d3d4b22d
--- /dev/null
+++ b/v3/internal/templates/svelte/Taskfile.tmpl.yml
@@ -0,0 +1,82 @@
+version: '3'
+
+vars:
+ APP_NAME: "{{.ProjectName}}"
+
+tasks:
+
+ pre-build:
+ summary: Pre-build hooks
+
+ post-build:
+ summary: Post-build hooks
+
+ install-frontend-deps:
+ summary: Install frontend dependencies
+ dir: frontend
+ sources:
+ - package.json
+ - package-lock.json
+ generates:
+ - node_modules/*
+ preconditions:
+ - sh: npm version
+ msg: "Looks like npm isn't installed. Npm is part of the Node installer: https://nodejs.org/en/download/"
+ cmds:
+ - npm install
+
+ build-frontend:
+ summary: Build the frontend project
+ dir: frontend
+ deps:
+ - install-frontend-deps
+ cmds:
+ - npm run build
+
+ build:
+ summary: Builds the application
+ cmds:
+ - task: pre-build
+ - task: build-frontend
+ - go build -gcflags=all="-N -l" -o build/bin/{{ "{{.APP_NAME}}" }} main.go
+ - task: post-build
+ env:
+ CGO_CFLAGS: "-mmacosx-version-min=10.13"
+ CGO_LDFLAGS: "-mmacosx-version-min=10.13"
+
+ generate-icons:
+ summary: Generates Windows `.ico` and Mac `.icns` files from an image
+ dir: build
+ cmds:
+ # Generates both .ico and .icns files
+ - wails generate icons -input appicon.png
+
+ build-app-prod-darwin:
+ summary: Creates a production build of the application
+ cmds:
+ - GOOS=darwin GOARCH={{ "{{.ARCH}}" }} go build -tags production -ldflags="-w -s" -o build/bin/{{ "{{.APP_NAME}}" }}
+ env:
+ CGO_CFLAGS: "-mmacosx-version-min=10.13"
+ CGO_LDFLAGS: "-mmacosx-version-min=10.13"
+ vars:
+ ARCH: $GOARCH
+
+
+ create-app-bundle:
+ summary: Builds a `.app` bundle
+ cmds:
+ - mkdir -p {{ "{{.APP_NAME}}" }}.app/Contents/{MacOS,Resources}
+ - cp build/icons.icns {{ "{{.APP_NAME}}" }}.app/Contents/Resources
+ - cp build/bin/{{ "{{.APP_NAME}}" }} {{ "{{.APP_NAME}}" }}.app/Contents/MacOS
+ - cp build/Info.plist {{ "{{.APP_NAME}}" }}.app/Contents
+
+ package-darwin-arm64:
+ summary: Packages a production build of the application into a `.app` bundle
+ platform: darwin
+ deps:
+ - task: build-app-prod-darwin
+ vars:
+ ARCH: arm64
+ - generate-icons
+ cmds:
+ - task: create-app-bundle
\ No newline at end of file
diff --git a/v3/internal/templates/svelte/build/Info.plist.tmpl b/v3/internal/templates/svelte/build/Info.plist.tmpl
new file mode 100644
index 000000000..93d9a5bf1
--- /dev/null
+++ b/v3/internal/templates/svelte/build/Info.plist.tmpl
@@ -0,0 +1,27 @@
+
+
+
+ CFBundlePackageType
+ APPL
+ CFBundleName
+ {{ "{{.Info.ProductName}}" }}
+ CFBundleExecutable
+ {{ "{{.ProjectName}}" }}
+ CFBundleIdentifier
+ com.wails.{{ "{{.ProjectName}}" }}
+ CFBundleVersion
+ v1.0.0
+ CFBundleGetInfoString
+ This is a comment
+ CFBundleShortVersionString
+ v1.0.0
+ CFBundleIconFile
+ iconfile
+ LSMinimumSystemVersion
+ 10.13.0
+ NSHighResolutionCapable
+ true
+ NSHumanReadableCopyright
+ (c) 2023 My Company Name
+
+
\ No newline at end of file
diff --git a/v3/internal/templates/svelte/build/appicon.png b/v3/internal/templates/svelte/build/appicon.png
new file mode 100644
index 000000000..63617fe4f
Binary files /dev/null and b/v3/internal/templates/svelte/build/appicon.png differ
diff --git a/v3/internal/templates/svelte/build/info.json b/v3/internal/templates/svelte/build/info.json
new file mode 100644
index 000000000..1005eb5cb
--- /dev/null
+++ b/v3/internal/templates/svelte/build/info.json
@@ -0,0 +1,15 @@
+{
+ "fixed": {
+ "file_version": "v1.0.0"
+ },
+ "info": {
+ "0000": {
+ "ProductVersion": "v1.0.0",
+ "CompanyName": "My Company Name",
+ "FileDescription": "A thing that does a thing",
+ "LegalCopyright": "(c) 2023 My Company Name",
+ "ProductName": "My Product Name",
+ "Comments": "This is a comment"
+ }
+ }
+}
\ No newline at end of file
diff --git a/v3/internal/templates/svelte/frontend/.gitignore b/v3/internal/templates/svelte/frontend/.gitignore
new file mode 100644
index 000000000..a547bf36d
--- /dev/null
+++ b/v3/internal/templates/svelte/frontend/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/v3/internal/templates/svelte/frontend/.vscode/extensions.json b/v3/internal/templates/svelte/frontend/.vscode/extensions.json
new file mode 100644
index 000000000..bdef82015
--- /dev/null
+++ b/v3/internal/templates/svelte/frontend/.vscode/extensions.json
@@ -0,0 +1,3 @@
+{
+ "recommendations": ["svelte.svelte-vscode"]
+}
diff --git a/v3/internal/templates/svelte/frontend/README.md b/v3/internal/templates/svelte/frontend/README.md
new file mode 100644
index 000000000..fd6a7082f
--- /dev/null
+++ b/v3/internal/templates/svelte/frontend/README.md
@@ -0,0 +1 @@
+# Wails + Svelte
\ No newline at end of file
diff --git a/v3/internal/templates/svelte/frontend/index.html b/v3/internal/templates/svelte/frontend/index.html
new file mode 100644
index 000000000..1ea50f904
--- /dev/null
+++ b/v3/internal/templates/svelte/frontend/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Wails + Svelte
+
+
+
+
+
+
diff --git a/v3/internal/templates/svelte/frontend/jsconfig.json b/v3/internal/templates/svelte/frontend/jsconfig.json
new file mode 100644
index 000000000..e596c5823
--- /dev/null
+++ b/v3/internal/templates/svelte/frontend/jsconfig.json
@@ -0,0 +1,33 @@
+{
+ "compilerOptions": {
+ "moduleResolution": "Node",
+ "target": "ESNext",
+ "module": "ESNext",
+ /**
+ * svelte-preprocess cannot figure out whether you have
+ * a value or a type, so tell TypeScript to enforce using
+ * `import type` instead of `import` for Types.
+ */
+ "importsNotUsedAsValues": "error",
+ "isolatedModules": true,
+ "resolveJsonModule": true,
+ /**
+ * To have warnings / errors of the Svelte compiler at the
+ * correct position, enable source maps by default.
+ */
+ "sourceMap": true,
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+ "forceConsistentCasingInFileNames": true,
+ /**
+ * Typecheck JS in `.svelte` and `.js` files by default.
+ * Disable this if you'd like to use dynamic types.
+ */
+ "checkJs": true
+ },
+ /**
+ * Use global.d.ts instead of compilerOptions.types
+ * to avoid limiting type declarations.
+ */
+ "include": ["src/**/*.d.ts", "src/**/*.js", "src/**/*.svelte"]
+}
diff --git a/v3/internal/templates/svelte/frontend/package.json b/v3/internal/templates/svelte/frontend/package.json
new file mode 100644
index 000000000..2e166feea
--- /dev/null
+++ b/v3/internal/templates/svelte/frontend/package.json
@@ -0,0 +1,16 @@
+{
+ "name": "frontend",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview"
+ },
+ "devDependencies": {
+ "@sveltejs/vite-plugin-svelte": "^2.0.0",
+ "svelte": "^3.54.0",
+ "vite": "^4.0.0"
+ }
+}
\ No newline at end of file
diff --git a/v3/internal/templates/svelte/frontend/public/wails.png b/v3/internal/templates/svelte/frontend/public/wails.png
new file mode 100644
index 000000000..8bdf42483
Binary files /dev/null and b/v3/internal/templates/svelte/frontend/public/wails.png differ
diff --git a/v3/internal/templates/svelte/frontend/src/App.svelte b/v3/internal/templates/svelte/frontend/src/App.svelte
new file mode 100644
index 000000000..539c395dd
--- /dev/null
+++ b/v3/internal/templates/svelte/frontend/src/App.svelte
@@ -0,0 +1,45 @@
+
+
+
+
+ Wails + Svelte
+
+
+
+
+
+
+ Check out SvelteKit, the official Svelte app framework powered by Vite!
+
+
+
+ Click on the Wails and Svelte logos to learn more
+
+
+
+
diff --git a/v3/internal/templates/svelte/frontend/src/app.css b/v3/internal/templates/svelte/frontend/src/app.css
new file mode 100644
index 000000000..bcc7233dd
--- /dev/null
+++ b/v3/internal/templates/svelte/frontend/src/app.css
@@ -0,0 +1,81 @@
+:root {
+ font-family: Inter, Avenir, Helvetica, Arial, sans-serif;
+ font-size: 16px;
+ line-height: 24px;
+ font-weight: 400;
+
+ color-scheme: light dark;
+ color: rgba(255, 255, 255, 0.87);
+ background-color: #242424;
+
+ font-synthesis: none;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-text-size-adjust: 100%;
+}
+
+a {
+ font-weight: 500;
+ color: #646cff;
+ text-decoration: inherit;
+}
+a:hover {
+ color: #535bf2;
+}
+
+body {
+ margin: 0;
+ display: flex;
+ place-items: center;
+ min-width: 320px;
+ min-height: 100vh;
+}
+
+h1 {
+ font-size: 3.2em;
+ line-height: 1.1;
+}
+
+.card {
+ padding: 2em;
+}
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+ text-align: center;
+}
+
+button {
+ border-radius: 8px;
+ border: 1px solid transparent;
+ padding: 0.6em 1.2em;
+ font-size: 1em;
+ font-weight: 500;
+ font-family: inherit;
+ background-color: #1a1a1a;
+ cursor: pointer;
+ transition: border-color 0.25s;
+}
+button:hover {
+ border-color: #646cff;
+}
+button:focus,
+button:focus-visible {
+ outline: 4px auto -webkit-focus-ring-color;
+}
+
+@media (prefers-color-scheme: light) {
+ :root {
+ color: #213547;
+ background-color: #ffffff;
+ }
+ a:hover {
+ color: #747bff;
+ }
+ button {
+ background-color: #f9f9f9;
+ }
+}
diff --git a/v3/internal/templates/svelte/frontend/src/assets/svelte.svg b/v3/internal/templates/svelte/frontend/src/assets/svelte.svg
new file mode 100644
index 000000000..c5e08481f
--- /dev/null
+++ b/v3/internal/templates/svelte/frontend/src/assets/svelte.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/v3/internal/templates/svelte/frontend/src/lib/Counter.svelte b/v3/internal/templates/svelte/frontend/src/lib/Counter.svelte
new file mode 100644
index 000000000..e45f90310
--- /dev/null
+++ b/v3/internal/templates/svelte/frontend/src/lib/Counter.svelte
@@ -0,0 +1,10 @@
+
+
+
diff --git a/v3/internal/templates/svelte/frontend/src/main.js b/v3/internal/templates/svelte/frontend/src/main.js
new file mode 100644
index 000000000..8a909a15a
--- /dev/null
+++ b/v3/internal/templates/svelte/frontend/src/main.js
@@ -0,0 +1,8 @@
+import './app.css'
+import App from './App.svelte'
+
+const app = new App({
+ target: document.getElementById('app'),
+})
+
+export default app
diff --git a/v3/internal/templates/svelte/frontend/src/vite-env.d.ts b/v3/internal/templates/svelte/frontend/src/vite-env.d.ts
new file mode 100644
index 000000000..4078e7476
--- /dev/null
+++ b/v3/internal/templates/svelte/frontend/src/vite-env.d.ts
@@ -0,0 +1,2 @@
+///
+///
diff --git a/v3/internal/templates/svelte/frontend/vite.config.js b/v3/internal/templates/svelte/frontend/vite.config.js
new file mode 100644
index 000000000..d70196943
--- /dev/null
+++ b/v3/internal/templates/svelte/frontend/vite.config.js
@@ -0,0 +1,7 @@
+import { defineConfig } from 'vite'
+import { svelte } from '@sveltejs/vite-plugin-svelte'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [svelte()],
+})
diff --git a/v3/internal/templates/svelte/go.mod.tmpl b/v3/internal/templates/svelte/go.mod.tmpl
new file mode 100644
index 000000000..270f8c6d7
--- /dev/null
+++ b/v3/internal/templates/svelte/go.mod.tmpl
@@ -0,0 +1,13 @@
+module changeme
+
+go 1.19
+
+require github.com/wailsapp/wails/v3 v3.0.0-alpha.0
+
+require (
+ github.com/imdario/mergo v0.3.12 // indirect
+ github.com/leaanthony/slicer v1.5.0 // indirect
+ github.com/wailsapp/mimetype v1.4.1 // indirect
+ github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6 // indirect
+ golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect
+)
diff --git a/v3/internal/templates/svelte/go.sum.tmpl b/v3/internal/templates/svelte/go.sum.tmpl
new file mode 100644
index 000000000..29c7b303e
--- /dev/null
+++ b/v3/internal/templates/svelte/go.sum.tmpl
@@ -0,0 +1,22 @@
+github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
+github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
+github.com/leaanthony/slicer v1.5.0 h1:aHYTN8xbCCLxJmkNKiLB6tgcMARl4eWmH9/F+S/0HtY=
+github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY=
+github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=
+github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs=
+github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o=
+github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6 h1:Wn+nhnS+VytzE0PegUzSh4T3hXJCtggKGD/4U5H9+wQ=
+github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6/go.mod h1:zlNLI0E2c2qA6miiuAHtp0Bac8FaGH0tlhA19OssR/8=
+github.com/wailsapp/wails/v3 v3.0.0-alpha.0 h1:T5gqG98Xr8LBf69oxlPkhpsFD59w2SnqUZk6XHj8Zoc=
+github.com/wailsapp/wails/v3 v3.0.0-alpha.0/go.mod h1:OAfO5bP0TSUvCIHZYc6Dqfow/9RqxzHvYtmhWPpo1c0=
+golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
diff --git a/v3/internal/templates/svelte/main.tmpl.go b/v3/internal/templates/svelte/main.tmpl.go
new file mode 100644
index 000000000..ea8f138b8
--- /dev/null
+++ b/v3/internal/templates/svelte/main.tmpl.go
@@ -0,0 +1,45 @@
+package main
+
+import (
+ "embed"
+ _ "embed"
+ "log"
+
+ "github.com/wailsapp/wails/v3/pkg/options"
+
+ "github.com/wailsapp/wails/v3/pkg/application"
+)
+
+//go:embed frontend/dist
+var assets embed.FS
+
+func main() {
+ app := application.New(options.Application{
+ Name: "{{.ProjectName}}",
+ Description: "A demo of using raw HTML & CSS",
+ Mac: options.Mac{
+ ApplicationShouldTerminateAfterLastWindowClosed: true,
+ },
+ })
+ // Create window
+ app.NewWebviewWindowWithOptions(&options.WebviewWindow{
+ Title: "Plain Bundle",
+ CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
+ Mac: options.MacWindow{
+ InvisibleTitleBarHeight: 50,
+ Backdrop: options.MacBackdropTranslucent,
+ TitleBar: options.TitleBarHiddenInset,
+ },
+
+ URL: "/",
+ Assets: options.Assets{
+ FS: assets,
+ },
+ })
+
+ err := app.Run()
+
+ if err != nil {
+ log.Fatal(err)
+ }
+}
diff --git a/v3/internal/templates/templates.go b/v3/internal/templates/templates.go
new file mode 100644
index 000000000..465c08833
--- /dev/null
+++ b/v3/internal/templates/templates.go
@@ -0,0 +1,165 @@
+package templates
+
+import (
+ "embed"
+ "fmt"
+ "io/fs"
+ "os"
+
+ "github.com/wailsapp/wails/v3/internal/flags"
+
+ "github.com/leaanthony/gosod"
+
+ "github.com/samber/lo"
+)
+
+//go:embed lit
+var lit embed.FS
+
+//go:embed lit-ts
+var litTS embed.FS
+
+//go:embed vue
+var vue embed.FS
+
+//go:embed vue-ts
+var vueTS embed.FS
+
+//go:embed react
+var react embed.FS
+
+//go:embed react-ts
+var reactTS embed.FS
+
+//go:embed react-swc
+var reactSWC embed.FS
+
+//go:embed react-swc-ts
+var reactSWCTS embed.FS
+
+//go:embed svelte
+var svelte embed.FS
+
+//go:embed svelte-ts
+var svelteTS embed.FS
+
+//go:embed preact
+var preact embed.FS
+
+//go:embed preact-ts
+var preactTS embed.FS
+
+//go:embed vanilla
+var vanilla embed.FS
+
+//go:embed vanilla-ts
+var vanillaTS embed.FS
+
+type TemplateData struct {
+ Name string
+ Description string
+ FS embed.FS
+}
+
+var defaultTemplates = []TemplateData{
+ {
+ Name: "lit",
+ Description: "Template using Lit Web Components: https://lit.dev",
+ FS: lit,
+ },
+ {
+ Name: "lit-ts",
+ Description: "Template using Lit Web Components (TypeScript) : https://lit.dev",
+ FS: litTS,
+ },
+ {
+ Name: "vue",
+ Description: "Template using Vue: https://vuejs.org",
+ FS: vue,
+ },
+ {
+ Name: "vue-ts",
+ Description: "Template using Vue (TypeScript): https://vuejs.org",
+ FS: vueTS,
+ },
+ {
+ Name: "react",
+ Description: "Template using React: https://reactjs.org",
+ FS: react,
+ },
+ {
+ Name: "react-ts",
+ Description: "Template using React (TypeScript): https://reactjs.org",
+ FS: reactTS,
+ },
+ {
+ Name: "react-swc",
+ Description: "Template using React with SWC: https://reactjs.org & https://swc.rs",
+ FS: reactSWC,
+ },
+ {
+ Name: "react-swc-ts",
+ Description: "Template using React with SWC (TypeScript): https://reactjs.org & https://swc.rs",
+ FS: reactSWCTS,
+ },
+ {
+ Name: "svelte",
+ Description: "Template using Svelte: https://svelte.dev",
+ FS: svelte,
+ },
+ {
+ Name: "svelte-ts",
+ Description: "Template using Svelte (TypeScript): https://svelte.dev",
+ FS: svelteTS,
+ },
+ {
+ Name: "preact",
+ Description: "Template using Preact: https://preactjs.com",
+ FS: preact,
+ },
+ {
+ Name: "preact-ts",
+ Description: "Template using Preact (TypeScript): https://preactjs.com",
+ FS: preactTS,
+ },
+ {
+ Name: "vanilla",
+ Description: "Template using Vanilla JS",
+ FS: vanilla,
+ },
+ {
+ Name: "vanilla-ts",
+ Description: "Template using Vanilla JS (TypeScript)",
+ FS: vanillaTS,
+ },
+}
+
+func ValidTemplateName(name string) bool {
+ return lo.ContainsBy(defaultTemplates, func(template TemplateData) bool {
+ return template.Name == name
+ })
+}
+
+func GetDefaultTemplates() []TemplateData {
+ return defaultTemplates
+}
+
+func Install(options *flags.Init) error {
+ template, found := lo.Find(defaultTemplates, func(template TemplateData) bool {
+ return template.Name == options.TemplateName
+ })
+ if !found {
+ return fmt.Errorf("template '%s' not found", options.TemplateName)
+ }
+
+ if options.ProjectDir == "." || options.ProjectDir == "" {
+ options.ProjectDir = lo.Must(os.Getwd())
+ }
+ targetDir := fmt.Sprintf("%s/%s", options.ProjectDir, options.ProjectName)
+ fmt.Printf("Installing template '%s' into '%s'\n", options.TemplateName, targetDir)
+ tfs, err := fs.Sub(template.FS, options.TemplateName)
+ if err != nil {
+ return err
+ }
+ return gosod.New(tfs).Extract(targetDir, options)
+}
diff --git a/v3/internal/templates/templates_test.go b/v3/internal/templates/templates_test.go
new file mode 100644
index 000000000..25fa790b5
--- /dev/null
+++ b/v3/internal/templates/templates_test.go
@@ -0,0 +1,34 @@
+package templates
+
+import (
+ "testing"
+
+ "github.com/wailsapp/wails/v3/internal/flags"
+)
+
+func TestInstall(t *testing.T) {
+ type args struct {
+ }
+ tests := []struct {
+ name string
+ options *flags.Init
+ wantErr bool
+ }{
+ {
+ name: "should install template",
+ options: &flags.Init{
+ ProjectName: "test",
+ TemplateName: "svelte",
+ Quiet: false,
+ },
+ wantErr: false,
+ },
+ }
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ if err := Install(tt.options); (err != nil) != tt.wantErr {
+ t.Errorf("Install() error = %v, wantErr %v", err, tt.wantErr)
+ }
+ })
+ }
+}
diff --git a/v3/internal/templates/vanilla-ts/Taskfile.tmpl.yml b/v3/internal/templates/vanilla-ts/Taskfile.tmpl.yml
new file mode 100644
index 000000000..4d3d4b22d
--- /dev/null
+++ b/v3/internal/templates/vanilla-ts/Taskfile.tmpl.yml
@@ -0,0 +1,82 @@
+version: '3'
+
+vars:
+ APP_NAME: "{{.ProjectName}}"
+
+tasks:
+
+ pre-build:
+ summary: Pre-build hooks
+
+ post-build:
+ summary: Post-build hooks
+
+ install-frontend-deps:
+ summary: Install frontend dependencies
+ dir: frontend
+ sources:
+ - package.json
+ - package-lock.json
+ generates:
+ - node_modules/*
+ preconditions:
+ - sh: npm version
+ msg: "Looks like npm isn't installed. Npm is part of the Node installer: https://nodejs.org/en/download/"
+ cmds:
+ - npm install
+
+ build-frontend:
+ summary: Build the frontend project
+ dir: frontend
+ deps:
+ - install-frontend-deps
+ cmds:
+ - npm run build
+
+ build:
+ summary: Builds the application
+ cmds:
+ - task: pre-build
+ - task: build-frontend
+ - go build -gcflags=all="-N -l" -o build/bin/{{ "{{.APP_NAME}}" }} main.go
+ - task: post-build
+ env:
+ CGO_CFLAGS: "-mmacosx-version-min=10.13"
+ CGO_LDFLAGS: "-mmacosx-version-min=10.13"
+
+ generate-icons:
+ summary: Generates Windows `.ico` and Mac `.icns` files from an image
+ dir: build
+ cmds:
+ # Generates both .ico and .icns files
+ - wails generate icons -input appicon.png
+
+ build-app-prod-darwin:
+ summary: Creates a production build of the application
+ cmds:
+ - GOOS=darwin GOARCH={{ "{{.ARCH}}" }} go build -tags production -ldflags="-w -s" -o build/bin/{{ "{{.APP_NAME}}" }}
+ env:
+ CGO_CFLAGS: "-mmacosx-version-min=10.13"
+ CGO_LDFLAGS: "-mmacosx-version-min=10.13"
+ vars:
+ ARCH: $GOARCH
+
+
+ create-app-bundle:
+ summary: Builds a `.app` bundle
+ cmds:
+ - mkdir -p {{ "{{.APP_NAME}}" }}.app/Contents/{MacOS,Resources}
+ - cp build/icons.icns {{ "{{.APP_NAME}}" }}.app/Contents/Resources
+ - cp build/bin/{{ "{{.APP_NAME}}" }} {{ "{{.APP_NAME}}" }}.app/Contents/MacOS
+ - cp build/Info.plist {{ "{{.APP_NAME}}" }}.app/Contents
+
+ package-darwin-arm64:
+ summary: Packages a production build of the application into a `.app` bundle
+ platform: darwin
+ deps:
+ - task: build-app-prod-darwin
+ vars:
+ ARCH: arm64
+ - generate-icons
+ cmds:
+ - task: create-app-bundle
\ No newline at end of file
diff --git a/v3/internal/templates/vanilla-ts/build/Info.plist.tmpl b/v3/internal/templates/vanilla-ts/build/Info.plist.tmpl
new file mode 100644
index 000000000..93d9a5bf1
--- /dev/null
+++ b/v3/internal/templates/vanilla-ts/build/Info.plist.tmpl
@@ -0,0 +1,27 @@
+
+
+
+ CFBundlePackageType
+ APPL
+ CFBundleName
+ {{ "{{.Info.ProductName}}" }}
+ CFBundleExecutable
+ {{ "{{.ProjectName}}" }}
+ CFBundleIdentifier
+ com.wails.{{ "{{.ProjectName}}" }}
+ CFBundleVersion
+ v1.0.0
+ CFBundleGetInfoString
+ This is a comment
+ CFBundleShortVersionString
+ v1.0.0
+ CFBundleIconFile
+ iconfile
+ LSMinimumSystemVersion
+ 10.13.0
+ NSHighResolutionCapable
+ true
+ NSHumanReadableCopyright
+ (c) 2023 My Company Name
+
+
\ No newline at end of file
diff --git a/v3/internal/templates/vanilla-ts/build/appicon.png b/v3/internal/templates/vanilla-ts/build/appicon.png
new file mode 100644
index 000000000..63617fe4f
Binary files /dev/null and b/v3/internal/templates/vanilla-ts/build/appicon.png differ
diff --git a/v3/internal/templates/vanilla-ts/build/info.json b/v3/internal/templates/vanilla-ts/build/info.json
new file mode 100644
index 000000000..1005eb5cb
--- /dev/null
+++ b/v3/internal/templates/vanilla-ts/build/info.json
@@ -0,0 +1,15 @@
+{
+ "fixed": {
+ "file_version": "v1.0.0"
+ },
+ "info": {
+ "0000": {
+ "ProductVersion": "v1.0.0",
+ "CompanyName": "My Company Name",
+ "FileDescription": "A thing that does a thing",
+ "LegalCopyright": "(c) 2023 My Company Name",
+ "ProductName": "My Product Name",
+ "Comments": "This is a comment"
+ }
+ }
+}
\ No newline at end of file
diff --git a/v3/internal/templates/vanilla-ts/frontend/.gitignore b/v3/internal/templates/vanilla-ts/frontend/.gitignore
new file mode 100644
index 000000000..a547bf36d
--- /dev/null
+++ b/v3/internal/templates/vanilla-ts/frontend/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/v3/internal/templates/vanilla-ts/frontend/index.html b/v3/internal/templates/vanilla-ts/frontend/index.html
new file mode 100644
index 000000000..3da9b4918
--- /dev/null
+++ b/v3/internal/templates/vanilla-ts/frontend/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Wails + TS
+
+
+
+
+
+
diff --git a/v3/internal/templates/vanilla-ts/frontend/package.json b/v3/internal/templates/vanilla-ts/frontend/package.json
new file mode 100644
index 000000000..fddd59a6c
--- /dev/null
+++ b/v3/internal/templates/vanilla-ts/frontend/package.json
@@ -0,0 +1,15 @@
+{
+ "name": "frontend",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc && vite build",
+ "preview": "vite preview"
+ },
+ "devDependencies": {
+ "typescript": "^4.9.3",
+ "vite": "^4.0.0"
+ }
+}
\ No newline at end of file
diff --git a/v3/internal/templates/vanilla-ts/frontend/public/wails.png b/v3/internal/templates/vanilla-ts/frontend/public/wails.png
new file mode 100644
index 000000000..8bdf42483
Binary files /dev/null and b/v3/internal/templates/vanilla-ts/frontend/public/wails.png differ
diff --git a/v3/internal/templates/vanilla-ts/frontend/src/counter.ts b/v3/internal/templates/vanilla-ts/frontend/src/counter.ts
new file mode 100644
index 000000000..09e5afd2d
--- /dev/null
+++ b/v3/internal/templates/vanilla-ts/frontend/src/counter.ts
@@ -0,0 +1,9 @@
+export function setupCounter(element: HTMLButtonElement) {
+ let counter = 0
+ const setCounter = (count: number) => {
+ counter = count
+ element.innerHTML = `count is ${counter}`
+ }
+ element.addEventListener('click', () => setCounter(counter + 1))
+ setCounter(0)
+}
diff --git a/v3/internal/templates/vanilla-ts/frontend/src/main.ts b/v3/internal/templates/vanilla-ts/frontend/src/main.ts
new file mode 100644
index 000000000..b386148ad
--- /dev/null
+++ b/v3/internal/templates/vanilla-ts/frontend/src/main.ts
@@ -0,0 +1,23 @@
+import './style.css'
+import typescriptLogo from './typescript.svg'
+import { setupCounter } from './counter'
+
+document.querySelector('#app')!.innerHTML = `
+
+
+
+
+
+
+
+
Wails + TypeScript
+
+
+
+
+ Click on the Wails and TypeScript logos to learn more
+
+
+`
+
+setupCounter(document.querySelector('#counter')!)
diff --git a/v3/internal/templates/vanilla-ts/frontend/src/style.css b/v3/internal/templates/vanilla-ts/frontend/src/style.css
new file mode 100644
index 000000000..ac37d84b9
--- /dev/null
+++ b/v3/internal/templates/vanilla-ts/frontend/src/style.css
@@ -0,0 +1,97 @@
+:root {
+ font-family: Inter, Avenir, Helvetica, Arial, sans-serif;
+ font-size: 16px;
+ line-height: 24px;
+ font-weight: 400;
+
+ color-scheme: light dark;
+ color: rgba(255, 255, 255, 0.87);
+ background-color: #242424;
+
+ font-synthesis: none;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-text-size-adjust: 100%;
+}
+
+a {
+ font-weight: 500;
+ color: #646cff;
+ text-decoration: inherit;
+}
+a:hover {
+ color: #535bf2;
+}
+
+body {
+ margin: 0;
+ display: flex;
+ place-items: center;
+ min-width: 320px;
+ min-height: 100vh;
+}
+
+h1 {
+ font-size: 3.2em;
+ line-height: 1.1;
+}
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+ text-align: center;
+}
+
+.logo {
+ height: 6em;
+ padding: 1.5em;
+ will-change: filter;
+}
+.logo:hover {
+ filter: drop-shadow(0 0 2em #646cffaa);
+}
+.logo.vanilla:hover {
+ filter: drop-shadow(0 0 2em #3178c6aa);
+}
+
+.card {
+ padding: 2em;
+}
+
+.read-the-docs {
+ color: #888;
+}
+
+button {
+ border-radius: 8px;
+ border: 1px solid transparent;
+ padding: 0.6em 1.2em;
+ font-size: 1em;
+ font-weight: 500;
+ font-family: inherit;
+ background-color: #1a1a1a;
+ cursor: pointer;
+ transition: border-color 0.25s;
+}
+button:hover {
+ border-color: #646cff;
+}
+button:focus,
+button:focus-visible {
+ outline: 4px auto -webkit-focus-ring-color;
+}
+
+@media (prefers-color-scheme: light) {
+ :root {
+ color: #213547;
+ background-color: #ffffff;
+ }
+ a:hover {
+ color: #747bff;
+ }
+ button {
+ background-color: #f9f9f9;
+ }
+}
diff --git a/v3/internal/templates/vanilla-ts/frontend/src/typescript.svg b/v3/internal/templates/vanilla-ts/frontend/src/typescript.svg
new file mode 100644
index 000000000..d91c910cc
--- /dev/null
+++ b/v3/internal/templates/vanilla-ts/frontend/src/typescript.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/v3/internal/templates/vanilla-ts/frontend/src/vite-env.d.ts b/v3/internal/templates/vanilla-ts/frontend/src/vite-env.d.ts
new file mode 100644
index 000000000..11f02fe2a
--- /dev/null
+++ b/v3/internal/templates/vanilla-ts/frontend/src/vite-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/v3/internal/templates/vanilla-ts/frontend/tsconfig.json b/v3/internal/templates/vanilla-ts/frontend/tsconfig.json
new file mode 100644
index 000000000..eac16d14a
--- /dev/null
+++ b/v3/internal/templates/vanilla-ts/frontend/tsconfig.json
@@ -0,0 +1,19 @@
+{
+ "compilerOptions": {
+ "target": "ESNext",
+ "useDefineForClassFields": true,
+ "module": "ESNext",
+ "lib": ["ESNext", "DOM"],
+ "moduleResolution": "Node",
+ "strict": true,
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "esModuleInterop": true,
+ "noEmit": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noImplicitReturns": true,
+ "skipLibCheck": true
+ },
+ "include": ["src"]
+}
diff --git a/v3/internal/templates/vanilla-ts/go.mod.tmpl b/v3/internal/templates/vanilla-ts/go.mod.tmpl
new file mode 100644
index 000000000..270f8c6d7
--- /dev/null
+++ b/v3/internal/templates/vanilla-ts/go.mod.tmpl
@@ -0,0 +1,13 @@
+module changeme
+
+go 1.19
+
+require github.com/wailsapp/wails/v3 v3.0.0-alpha.0
+
+require (
+ github.com/imdario/mergo v0.3.12 // indirect
+ github.com/leaanthony/slicer v1.5.0 // indirect
+ github.com/wailsapp/mimetype v1.4.1 // indirect
+ github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6 // indirect
+ golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect
+)
diff --git a/v3/internal/templates/vanilla-ts/go.sum.tmpl b/v3/internal/templates/vanilla-ts/go.sum.tmpl
new file mode 100644
index 000000000..29c7b303e
--- /dev/null
+++ b/v3/internal/templates/vanilla-ts/go.sum.tmpl
@@ -0,0 +1,22 @@
+github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
+github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
+github.com/leaanthony/slicer v1.5.0 h1:aHYTN8xbCCLxJmkNKiLB6tgcMARl4eWmH9/F+S/0HtY=
+github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY=
+github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=
+github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs=
+github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o=
+github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6 h1:Wn+nhnS+VytzE0PegUzSh4T3hXJCtggKGD/4U5H9+wQ=
+github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6/go.mod h1:zlNLI0E2c2qA6miiuAHtp0Bac8FaGH0tlhA19OssR/8=
+github.com/wailsapp/wails/v3 v3.0.0-alpha.0 h1:T5gqG98Xr8LBf69oxlPkhpsFD59w2SnqUZk6XHj8Zoc=
+github.com/wailsapp/wails/v3 v3.0.0-alpha.0/go.mod h1:OAfO5bP0TSUvCIHZYc6Dqfow/9RqxzHvYtmhWPpo1c0=
+golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
diff --git a/v3/internal/templates/vanilla-ts/main.tmpl.go b/v3/internal/templates/vanilla-ts/main.tmpl.go
new file mode 100644
index 000000000..ea8f138b8
--- /dev/null
+++ b/v3/internal/templates/vanilla-ts/main.tmpl.go
@@ -0,0 +1,45 @@
+package main
+
+import (
+ "embed"
+ _ "embed"
+ "log"
+
+ "github.com/wailsapp/wails/v3/pkg/options"
+
+ "github.com/wailsapp/wails/v3/pkg/application"
+)
+
+//go:embed frontend/dist
+var assets embed.FS
+
+func main() {
+ app := application.New(options.Application{
+ Name: "{{.ProjectName}}",
+ Description: "A demo of using raw HTML & CSS",
+ Mac: options.Mac{
+ ApplicationShouldTerminateAfterLastWindowClosed: true,
+ },
+ })
+ // Create window
+ app.NewWebviewWindowWithOptions(&options.WebviewWindow{
+ Title: "Plain Bundle",
+ CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
+ Mac: options.MacWindow{
+ InvisibleTitleBarHeight: 50,
+ Backdrop: options.MacBackdropTranslucent,
+ TitleBar: options.TitleBarHiddenInset,
+ },
+
+ URL: "/",
+ Assets: options.Assets{
+ FS: assets,
+ },
+ })
+
+ err := app.Run()
+
+ if err != nil {
+ log.Fatal(err)
+ }
+}
diff --git a/v3/internal/templates/vanilla/Taskfile.tmpl.yml b/v3/internal/templates/vanilla/Taskfile.tmpl.yml
new file mode 100644
index 000000000..4d3d4b22d
--- /dev/null
+++ b/v3/internal/templates/vanilla/Taskfile.tmpl.yml
@@ -0,0 +1,82 @@
+version: '3'
+
+vars:
+ APP_NAME: "{{.ProjectName}}"
+
+tasks:
+
+ pre-build:
+ summary: Pre-build hooks
+
+ post-build:
+ summary: Post-build hooks
+
+ install-frontend-deps:
+ summary: Install frontend dependencies
+ dir: frontend
+ sources:
+ - package.json
+ - package-lock.json
+ generates:
+ - node_modules/*
+ preconditions:
+ - sh: npm version
+ msg: "Looks like npm isn't installed. Npm is part of the Node installer: https://nodejs.org/en/download/"
+ cmds:
+ - npm install
+
+ build-frontend:
+ summary: Build the frontend project
+ dir: frontend
+ deps:
+ - install-frontend-deps
+ cmds:
+ - npm run build
+
+ build:
+ summary: Builds the application
+ cmds:
+ - task: pre-build
+ - task: build-frontend
+ - go build -gcflags=all="-N -l" -o build/bin/{{ "{{.APP_NAME}}" }} main.go
+ - task: post-build
+ env:
+ CGO_CFLAGS: "-mmacosx-version-min=10.13"
+ CGO_LDFLAGS: "-mmacosx-version-min=10.13"
+
+ generate-icons:
+ summary: Generates Windows `.ico` and Mac `.icns` files from an image
+ dir: build
+ cmds:
+ # Generates both .ico and .icns files
+ - wails generate icons -input appicon.png
+
+ build-app-prod-darwin:
+ summary: Creates a production build of the application
+ cmds:
+ - GOOS=darwin GOARCH={{ "{{.ARCH}}" }} go build -tags production -ldflags="-w -s" -o build/bin/{{ "{{.APP_NAME}}" }}
+ env:
+ CGO_CFLAGS: "-mmacosx-version-min=10.13"
+ CGO_LDFLAGS: "-mmacosx-version-min=10.13"
+ vars:
+ ARCH: $GOARCH
+
+
+ create-app-bundle:
+ summary: Builds a `.app` bundle
+ cmds:
+ - mkdir -p {{ "{{.APP_NAME}}" }}.app/Contents/{MacOS,Resources}
+ - cp build/icons.icns {{ "{{.APP_NAME}}" }}.app/Contents/Resources
+ - cp build/bin/{{ "{{.APP_NAME}}" }} {{ "{{.APP_NAME}}" }}.app/Contents/MacOS
+ - cp build/Info.plist {{ "{{.APP_NAME}}" }}.app/Contents
+
+ package-darwin-arm64:
+ summary: Packages a production build of the application into a `.app` bundle
+ platform: darwin
+ deps:
+ - task: build-app-prod-darwin
+ vars:
+ ARCH: arm64
+ - generate-icons
+ cmds:
+ - task: create-app-bundle
\ No newline at end of file
diff --git a/v3/internal/templates/vanilla/build/Info.plist.tmpl b/v3/internal/templates/vanilla/build/Info.plist.tmpl
new file mode 100644
index 000000000..93d9a5bf1
--- /dev/null
+++ b/v3/internal/templates/vanilla/build/Info.plist.tmpl
@@ -0,0 +1,27 @@
+
+
+
+ CFBundlePackageType
+ APPL
+ CFBundleName
+ {{ "{{.Info.ProductName}}" }}
+ CFBundleExecutable
+ {{ "{{.ProjectName}}" }}
+ CFBundleIdentifier
+ com.wails.{{ "{{.ProjectName}}" }}
+ CFBundleVersion
+ v1.0.0
+ CFBundleGetInfoString
+ This is a comment
+ CFBundleShortVersionString
+ v1.0.0
+ CFBundleIconFile
+ iconfile
+ LSMinimumSystemVersion
+ 10.13.0
+ NSHighResolutionCapable
+ true
+ NSHumanReadableCopyright
+ (c) 2023 My Company Name
+
+
\ No newline at end of file
diff --git a/v3/internal/templates/vanilla/build/appicon.png b/v3/internal/templates/vanilla/build/appicon.png
new file mode 100644
index 000000000..63617fe4f
Binary files /dev/null and b/v3/internal/templates/vanilla/build/appicon.png differ
diff --git a/v3/internal/templates/vanilla/build/info.json b/v3/internal/templates/vanilla/build/info.json
new file mode 100644
index 000000000..1005eb5cb
--- /dev/null
+++ b/v3/internal/templates/vanilla/build/info.json
@@ -0,0 +1,15 @@
+{
+ "fixed": {
+ "file_version": "v1.0.0"
+ },
+ "info": {
+ "0000": {
+ "ProductVersion": "v1.0.0",
+ "CompanyName": "My Company Name",
+ "FileDescription": "A thing that does a thing",
+ "LegalCopyright": "(c) 2023 My Company Name",
+ "ProductName": "My Product Name",
+ "Comments": "This is a comment"
+ }
+ }
+}
\ No newline at end of file
diff --git a/v3/internal/templates/vanilla/frontend/.gitignore b/v3/internal/templates/vanilla/frontend/.gitignore
new file mode 100644
index 000000000..a547bf36d
--- /dev/null
+++ b/v3/internal/templates/vanilla/frontend/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/v3/internal/templates/vanilla/frontend/counter.js b/v3/internal/templates/vanilla/frontend/counter.js
new file mode 100644
index 000000000..881e2d7ad
--- /dev/null
+++ b/v3/internal/templates/vanilla/frontend/counter.js
@@ -0,0 +1,9 @@
+export function setupCounter(element) {
+ let counter = 0
+ const setCounter = (count) => {
+ counter = count
+ element.innerHTML = `count is ${counter}`
+ }
+ element.addEventListener('click', () => setCounter(counter + 1))
+ setCounter(0)
+}
diff --git a/v3/internal/templates/vanilla/frontend/index.html b/v3/internal/templates/vanilla/frontend/index.html
new file mode 100644
index 000000000..a13d62487
--- /dev/null
+++ b/v3/internal/templates/vanilla/frontend/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Wails App
+
+
+
+
+
+
diff --git a/v3/internal/templates/vanilla/frontend/javascript.svg b/v3/internal/templates/vanilla/frontend/javascript.svg
new file mode 100644
index 000000000..f9abb2b72
--- /dev/null
+++ b/v3/internal/templates/vanilla/frontend/javascript.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/v3/internal/templates/vanilla/frontend/main.js b/v3/internal/templates/vanilla/frontend/main.js
new file mode 100644
index 000000000..5a926e5b8
--- /dev/null
+++ b/v3/internal/templates/vanilla/frontend/main.js
@@ -0,0 +1,23 @@
+import './style.css'
+import javascriptLogo from './javascript.svg'
+import { setupCounter } from './counter.js'
+
+document.querySelector('#app').innerHTML = `
+
+
+
+
+
+
+
+
Hello Wails!
+
+
+
+
+ Click on the Wails logo to learn more
+
+
+`
+
+setupCounter(document.querySelector('#counter'))
diff --git a/v3/internal/templates/vanilla/frontend/package.json b/v3/internal/templates/vanilla/frontend/package.json
new file mode 100644
index 000000000..63288c9ef
--- /dev/null
+++ b/v3/internal/templates/vanilla/frontend/package.json
@@ -0,0 +1,14 @@
+{
+ "name": "frontend",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview"
+ },
+ "devDependencies": {
+ "vite": "^4.0.0"
+ }
+}
\ No newline at end of file
diff --git a/v3/internal/templates/vanilla/frontend/public/wails.png b/v3/internal/templates/vanilla/frontend/public/wails.png
new file mode 100644
index 000000000..8bdf42483
Binary files /dev/null and b/v3/internal/templates/vanilla/frontend/public/wails.png differ
diff --git a/v3/internal/templates/vanilla/frontend/style.css b/v3/internal/templates/vanilla/frontend/style.css
new file mode 100644
index 000000000..12320801d
--- /dev/null
+++ b/v3/internal/templates/vanilla/frontend/style.css
@@ -0,0 +1,97 @@
+:root {
+ font-family: Inter, Avenir, Helvetica, Arial, sans-serif;
+ font-size: 16px;
+ line-height: 24px;
+ font-weight: 400;
+
+ color-scheme: light dark;
+ color: rgba(255, 255, 255, 0.87);
+ background-color: #242424;
+
+ font-synthesis: none;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-text-size-adjust: 100%;
+}
+
+a {
+ font-weight: 500;
+ color: #646cff;
+ text-decoration: inherit;
+}
+a:hover {
+ color: #535bf2;
+}
+
+body {
+ margin: 0;
+ display: flex;
+ place-items: center;
+ min-width: 320px;
+ min-height: 100vh;
+}
+
+h1 {
+ font-size: 3.2em;
+ line-height: 1.1;
+}
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+ text-align: center;
+}
+
+.logo {
+ height: 6em;
+ padding: 1.5em;
+ will-change: filter;
+}
+.logo:hover {
+ filter: drop-shadow(0 0 2em #646cffaa);
+}
+.logo.vanilla:hover {
+ filter: drop-shadow(0 0 2em #f7df1eaa);
+}
+
+.card {
+ padding: 2em;
+}
+
+.read-the-docs {
+ color: #888;
+}
+
+button {
+ border-radius: 8px;
+ border: 1px solid transparent;
+ padding: 0.6em 1.2em;
+ font-size: 1em;
+ font-weight: 500;
+ font-family: inherit;
+ background-color: #1a1a1a;
+ cursor: pointer;
+ transition: border-color 0.25s;
+}
+button:hover {
+ border-color: #646cff;
+}
+button:focus,
+button:focus-visible {
+ outline: 4px auto -webkit-focus-ring-color;
+}
+
+@media (prefers-color-scheme: light) {
+ :root {
+ color: #213547;
+ background-color: #ffffff;
+ }
+ a:hover {
+ color: #747bff;
+ }
+ button {
+ background-color: #f9f9f9;
+ }
+}
diff --git a/v3/internal/templates/vanilla/go.mod.tmpl b/v3/internal/templates/vanilla/go.mod.tmpl
new file mode 100644
index 000000000..270f8c6d7
--- /dev/null
+++ b/v3/internal/templates/vanilla/go.mod.tmpl
@@ -0,0 +1,13 @@
+module changeme
+
+go 1.19
+
+require github.com/wailsapp/wails/v3 v3.0.0-alpha.0
+
+require (
+ github.com/imdario/mergo v0.3.12 // indirect
+ github.com/leaanthony/slicer v1.5.0 // indirect
+ github.com/wailsapp/mimetype v1.4.1 // indirect
+ github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6 // indirect
+ golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect
+)
diff --git a/v3/internal/templates/vanilla/go.sum.tmpl b/v3/internal/templates/vanilla/go.sum.tmpl
new file mode 100644
index 000000000..29c7b303e
--- /dev/null
+++ b/v3/internal/templates/vanilla/go.sum.tmpl
@@ -0,0 +1,22 @@
+github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
+github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
+github.com/leaanthony/slicer v1.5.0 h1:aHYTN8xbCCLxJmkNKiLB6tgcMARl4eWmH9/F+S/0HtY=
+github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY=
+github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=
+github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs=
+github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o=
+github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6 h1:Wn+nhnS+VytzE0PegUzSh4T3hXJCtggKGD/4U5H9+wQ=
+github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6/go.mod h1:zlNLI0E2c2qA6miiuAHtp0Bac8FaGH0tlhA19OssR/8=
+github.com/wailsapp/wails/v3 v3.0.0-alpha.0 h1:T5gqG98Xr8LBf69oxlPkhpsFD59w2SnqUZk6XHj8Zoc=
+github.com/wailsapp/wails/v3 v3.0.0-alpha.0/go.mod h1:OAfO5bP0TSUvCIHZYc6Dqfow/9RqxzHvYtmhWPpo1c0=
+golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
diff --git a/v3/internal/templates/vanilla/main.tmpl.go b/v3/internal/templates/vanilla/main.tmpl.go
new file mode 100644
index 000000000..ea8f138b8
--- /dev/null
+++ b/v3/internal/templates/vanilla/main.tmpl.go
@@ -0,0 +1,45 @@
+package main
+
+import (
+ "embed"
+ _ "embed"
+ "log"
+
+ "github.com/wailsapp/wails/v3/pkg/options"
+
+ "github.com/wailsapp/wails/v3/pkg/application"
+)
+
+//go:embed frontend/dist
+var assets embed.FS
+
+func main() {
+ app := application.New(options.Application{
+ Name: "{{.ProjectName}}",
+ Description: "A demo of using raw HTML & CSS",
+ Mac: options.Mac{
+ ApplicationShouldTerminateAfterLastWindowClosed: true,
+ },
+ })
+ // Create window
+ app.NewWebviewWindowWithOptions(&options.WebviewWindow{
+ Title: "Plain Bundle",
+ CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
+ Mac: options.MacWindow{
+ InvisibleTitleBarHeight: 50,
+ Backdrop: options.MacBackdropTranslucent,
+ TitleBar: options.TitleBarHiddenInset,
+ },
+
+ URL: "/",
+ Assets: options.Assets{
+ FS: assets,
+ },
+ })
+
+ err := app.Run()
+
+ if err != nil {
+ log.Fatal(err)
+ }
+}
diff --git a/v3/internal/templates/vue-ts/Taskfile.tmpl.yml b/v3/internal/templates/vue-ts/Taskfile.tmpl.yml
new file mode 100644
index 000000000..4d3d4b22d
--- /dev/null
+++ b/v3/internal/templates/vue-ts/Taskfile.tmpl.yml
@@ -0,0 +1,82 @@
+version: '3'
+
+vars:
+ APP_NAME: "{{.ProjectName}}"
+
+tasks:
+
+ pre-build:
+ summary: Pre-build hooks
+
+ post-build:
+ summary: Post-build hooks
+
+ install-frontend-deps:
+ summary: Install frontend dependencies
+ dir: frontend
+ sources:
+ - package.json
+ - package-lock.json
+ generates:
+ - node_modules/*
+ preconditions:
+ - sh: npm version
+ msg: "Looks like npm isn't installed. Npm is part of the Node installer: https://nodejs.org/en/download/"
+ cmds:
+ - npm install
+
+ build-frontend:
+ summary: Build the frontend project
+ dir: frontend
+ deps:
+ - install-frontend-deps
+ cmds:
+ - npm run build
+
+ build:
+ summary: Builds the application
+ cmds:
+ - task: pre-build
+ - task: build-frontend
+ - go build -gcflags=all="-N -l" -o build/bin/{{ "{{.APP_NAME}}" }} main.go
+ - task: post-build
+ env:
+ CGO_CFLAGS: "-mmacosx-version-min=10.13"
+ CGO_LDFLAGS: "-mmacosx-version-min=10.13"
+
+ generate-icons:
+ summary: Generates Windows `.ico` and Mac `.icns` files from an image
+ dir: build
+ cmds:
+ # Generates both .ico and .icns files
+ - wails generate icons -input appicon.png
+
+ build-app-prod-darwin:
+ summary: Creates a production build of the application
+ cmds:
+ - GOOS=darwin GOARCH={{ "{{.ARCH}}" }} go build -tags production -ldflags="-w -s" -o build/bin/{{ "{{.APP_NAME}}" }}
+ env:
+ CGO_CFLAGS: "-mmacosx-version-min=10.13"
+ CGO_LDFLAGS: "-mmacosx-version-min=10.13"
+ vars:
+ ARCH: $GOARCH
+
+
+ create-app-bundle:
+ summary: Builds a `.app` bundle
+ cmds:
+ - mkdir -p {{ "{{.APP_NAME}}" }}.app/Contents/{MacOS,Resources}
+ - cp build/icons.icns {{ "{{.APP_NAME}}" }}.app/Contents/Resources
+ - cp build/bin/{{ "{{.APP_NAME}}" }} {{ "{{.APP_NAME}}" }}.app/Contents/MacOS
+ - cp build/Info.plist {{ "{{.APP_NAME}}" }}.app/Contents
+
+ package-darwin-arm64:
+ summary: Packages a production build of the application into a `.app` bundle
+ platform: darwin
+ deps:
+ - task: build-app-prod-darwin
+ vars:
+ ARCH: arm64
+ - generate-icons
+ cmds:
+ - task: create-app-bundle
\ No newline at end of file
diff --git a/v3/internal/templates/vue-ts/build/Info.plist.tmpl b/v3/internal/templates/vue-ts/build/Info.plist.tmpl
new file mode 100644
index 000000000..93d9a5bf1
--- /dev/null
+++ b/v3/internal/templates/vue-ts/build/Info.plist.tmpl
@@ -0,0 +1,27 @@
+
+
+
+ CFBundlePackageType
+ APPL
+ CFBundleName
+ {{ "{{.Info.ProductName}}" }}
+ CFBundleExecutable
+ {{ "{{.ProjectName}}" }}
+ CFBundleIdentifier
+ com.wails.{{ "{{.ProjectName}}" }}
+ CFBundleVersion
+ v1.0.0
+ CFBundleGetInfoString
+ This is a comment
+ CFBundleShortVersionString
+ v1.0.0
+ CFBundleIconFile
+ iconfile
+ LSMinimumSystemVersion
+ 10.13.0
+ NSHighResolutionCapable
+ true
+ NSHumanReadableCopyright
+ (c) 2023 My Company Name
+
+
\ No newline at end of file
diff --git a/v3/internal/templates/vue-ts/build/appicon.png b/v3/internal/templates/vue-ts/build/appicon.png
new file mode 100644
index 000000000..63617fe4f
Binary files /dev/null and b/v3/internal/templates/vue-ts/build/appicon.png differ
diff --git a/v3/internal/templates/vue-ts/build/info.json b/v3/internal/templates/vue-ts/build/info.json
new file mode 100644
index 000000000..1005eb5cb
--- /dev/null
+++ b/v3/internal/templates/vue-ts/build/info.json
@@ -0,0 +1,15 @@
+{
+ "fixed": {
+ "file_version": "v1.0.0"
+ },
+ "info": {
+ "0000": {
+ "ProductVersion": "v1.0.0",
+ "CompanyName": "My Company Name",
+ "FileDescription": "A thing that does a thing",
+ "LegalCopyright": "(c) 2023 My Company Name",
+ "ProductName": "My Product Name",
+ "Comments": "This is a comment"
+ }
+ }
+}
\ No newline at end of file
diff --git a/v3/internal/templates/vue-ts/frontend/.gitignore b/v3/internal/templates/vue-ts/frontend/.gitignore
new file mode 100644
index 000000000..a547bf36d
--- /dev/null
+++ b/v3/internal/templates/vue-ts/frontend/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/v3/internal/templates/vue-ts/frontend/.vscode/extensions.json b/v3/internal/templates/vue-ts/frontend/.vscode/extensions.json
new file mode 100644
index 000000000..c0a6e5a48
--- /dev/null
+++ b/v3/internal/templates/vue-ts/frontend/.vscode/extensions.json
@@ -0,0 +1,3 @@
+{
+ "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"]
+}
diff --git a/v3/internal/templates/vue-ts/frontend/README.md b/v3/internal/templates/vue-ts/frontend/README.md
new file mode 100644
index 000000000..ef72fd524
--- /dev/null
+++ b/v3/internal/templates/vue-ts/frontend/README.md
@@ -0,0 +1,18 @@
+# Vue 3 + TypeScript + Vite
+
+This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 `
+