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/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.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/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/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/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/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 `
+