create-pixi-vn 2.0.12 → 2.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/package.json +1 -1
  2. package/template-react-vite-muijoy-ink/.vscode/extensions.json +2 -1
  3. package/template-react-vite-muijoy-ink/.vscode/settings.json +6 -1
  4. package/template-react-vite-muijoy-ink/_gitignore +1 -0
  5. package/template-react-vite-muijoy-ink/ink/second_part.ink +571 -0
  6. package/template-react-vite-muijoy-ink/ink/start.ink +214 -0
  7. package/template-react-vite-muijoy-ink/package-lock.json +230 -4
  8. package/template-react-vite-muijoy-ink/package.json +3 -1
  9. package/template-react-vite-muijoy-ink/src/App.tsx +25 -25
  10. package/template-react-vite-muijoy-ink/src/assets/index.ts +2 -4
  11. package/template-react-vite-muijoy-ink/src/assets/ink-manifest.gen.json +4 -1
  12. package/template-react-vite-muijoy-ink/src/content/ink/hashtag-commands.ts +38 -0
  13. package/template-react-vite-muijoy-ink/src/content/ink/text-replaces.ts +19 -0
  14. package/template-react-vite-muijoy-ink/src/lib/hooks/ink-hooks.tsx +12 -0
  15. package/template-react-vite-muijoy-ink/src/lib/i18n.ts +22 -1
  16. package/template-react-vite-muijoy-ink/src/pixi-vn-keys.gen.d.ts +2 -0
  17. package/template-react-vite-muijoy-ink/src/routes/__root.tsx +4 -0
  18. package/template-react-vite-muijoy-ink/vite.config.ts +6 -0
  19. package/template-react-vite-muijoy-ink-tauri/.assetpack.ts +9 -0
  20. package/template-react-vite-muijoy-ink-tauri/.vscode/extensions.json +5 -1
  21. package/template-react-vite-muijoy-ink-tauri/.vscode/launch.json +11 -0
  22. package/template-react-vite-muijoy-ink-tauri/.vscode/settings.json +6 -1
  23. package/template-react-vite-muijoy-ink-tauri/.vscode/tasks.json +47 -0
  24. package/template-react-vite-muijoy-ink-tauri/README.md +3 -3
  25. package/template-react-vite-muijoy-ink-tauri/_github/workflows/desktop.yml +188 -0
  26. package/template-react-vite-muijoy-ink-tauri/_github/workflows/mobile.yml +270 -0
  27. package/template-react-vite-muijoy-ink-tauri/_gitignore +11 -0
  28. package/template-react-vite-muijoy-ink-tauri/ink/second_part.ink +571 -0
  29. package/template-react-vite-muijoy-ink-tauri/ink/start.ink +214 -0
  30. package/template-react-vite-muijoy-ink-tauri/package-lock.json +480 -4
  31. package/template-react-vite-muijoy-ink-tauri/package.json +13 -2
  32. package/template-react-vite-muijoy-ink-tauri/src/App.tsx +25 -25
  33. package/template-react-vite-muijoy-ink-tauri/src/assets/index.ts +2 -4
  34. package/template-react-vite-muijoy-ink-tauri/src/assets/ink-manifest.gen.json +4 -1
  35. package/template-react-vite-muijoy-ink-tauri/src/components/menus/main-menu.tsx +16 -1
  36. package/template-react-vite-muijoy-ink-tauri/src/components/menus/settings/quick-menus.tsx +17 -1
  37. package/template-react-vite-muijoy-ink-tauri/src/components/menus/settings/system-controls.tsx +11 -1
  38. package/template-react-vite-muijoy-ink-tauri/src/content/ink/hashtag-commands.ts +55 -0
  39. package/template-react-vite-muijoy-ink-tauri/src/content/ink/text-replaces.ts +19 -0
  40. package/template-react-vite-muijoy-ink-tauri/src/lib/hooks/ink-hooks.tsx +12 -0
  41. package/template-react-vite-muijoy-ink-tauri/src/lib/hooks/quit-hooks.ts +24 -0
  42. package/template-react-vite-muijoy-ink-tauri/src/lib/i18n.ts +22 -1
  43. package/template-react-vite-muijoy-ink-tauri/src/lib/query/settings-query.ts +7 -1
  44. package/template-react-vite-muijoy-ink-tauri/src/lib/steam.ts +143 -0
  45. package/template-react-vite-muijoy-ink-tauri/src/pixi-vn-keys.gen.d.ts +2 -0
  46. package/template-react-vite-muijoy-ink-tauri/src/routes/__root.tsx +4 -0
  47. package/template-react-vite-muijoy-ink-tauri/src-tauri/Cargo.toml +50 -0
  48. package/template-react-vite-muijoy-ink-tauri/src-tauri/build.rs +46 -0
  49. package/template-react-vite-muijoy-ink-tauri/src-tauri/capabilities/default.json +21 -0
  50. package/template-react-vite-muijoy-ink-tauri/src-tauri/icons/128x128.png +0 -0
  51. package/template-react-vite-muijoy-ink-tauri/src-tauri/icons/128x128@2x.png +0 -0
  52. package/template-react-vite-muijoy-ink-tauri/src-tauri/icons/32x32.png +0 -0
  53. package/template-react-vite-muijoy-ink-tauri/src-tauri/icons/Square107x107Logo.png +0 -0
  54. package/template-react-vite-muijoy-ink-tauri/src-tauri/icons/Square142x142Logo.png +0 -0
  55. package/template-react-vite-muijoy-ink-tauri/src-tauri/icons/Square150x150Logo.png +0 -0
  56. package/template-react-vite-muijoy-ink-tauri/src-tauri/icons/Square284x284Logo.png +0 -0
  57. package/template-react-vite-muijoy-ink-tauri/src-tauri/icons/Square30x30Logo.png +0 -0
  58. package/template-react-vite-muijoy-ink-tauri/src-tauri/icons/Square310x310Logo.png +0 -0
  59. package/template-react-vite-muijoy-ink-tauri/src-tauri/icons/Square44x44Logo.png +0 -0
  60. package/template-react-vite-muijoy-ink-tauri/src-tauri/icons/Square71x71Logo.png +0 -0
  61. package/template-react-vite-muijoy-ink-tauri/src-tauri/icons/Square89x89Logo.png +0 -0
  62. package/template-react-vite-muijoy-ink-tauri/src-tauri/icons/StoreLogo.png +0 -0
  63. package/template-react-vite-muijoy-ink-tauri/src-tauri/icons/icon.icns +0 -0
  64. package/template-react-vite-muijoy-ink-tauri/src-tauri/icons/icon.ico +0 -0
  65. package/template-react-vite-muijoy-ink-tauri/src-tauri/icons/icon.png +0 -0
  66. package/template-react-vite-muijoy-ink-tauri/src-tauri/src/lib.rs +64 -0
  67. package/template-react-vite-muijoy-ink-tauri/src-tauri/src/main.rs +6 -0
  68. package/template-react-vite-muijoy-ink-tauri/src-tauri/src/steam.rs +238 -0
  69. package/template-react-vite-muijoy-ink-tauri/src-tauri/tauri.conf.json +50 -0
  70. package/template-react-vite-muijoy-ink-tauri/vite.config.ts +30 -0
  71. package/template-react-vite-muijoy-tauri/.assetpack.ts +9 -0
  72. package/template-react-vite-muijoy-tauri/.vscode/extensions.json +4 -1
  73. package/template-react-vite-muijoy-tauri/.vscode/launch.json +11 -0
  74. package/template-react-vite-muijoy-tauri/.vscode/tasks.json +47 -0
  75. package/template-react-vite-muijoy-tauri/README.md +3 -3
  76. package/template-react-vite-muijoy-tauri/_github/workflows/desktop.yml +188 -0
  77. package/template-react-vite-muijoy-tauri/_github/workflows/mobile.yml +270 -0
  78. package/template-react-vite-muijoy-tauri/_gitignore +10 -0
  79. package/template-react-vite-muijoy-tauri/package-lock.json +250 -0
  80. package/template-react-vite-muijoy-tauri/package.json +10 -1
  81. package/template-react-vite-muijoy-tauri/src/components/menus/main-menu.tsx +16 -1
  82. package/template-react-vite-muijoy-tauri/src/components/menus/settings/quick-menus.tsx +17 -1
  83. package/template-react-vite-muijoy-tauri/src/components/menus/settings/system-controls.tsx +11 -1
  84. package/template-react-vite-muijoy-tauri/src/lib/hooks/quit-hooks.ts +24 -0
  85. package/template-react-vite-muijoy-tauri/src/lib/query/settings-query.ts +7 -1
  86. package/template-react-vite-muijoy-tauri/src/lib/steam.ts +143 -0
  87. package/template-react-vite-muijoy-tauri/src-tauri/Cargo.toml +50 -0
  88. package/template-react-vite-muijoy-tauri/src-tauri/build.rs +46 -0
  89. package/template-react-vite-muijoy-tauri/src-tauri/capabilities/default.json +21 -0
  90. package/template-react-vite-muijoy-tauri/src-tauri/icons/128x128.png +0 -0
  91. package/template-react-vite-muijoy-tauri/src-tauri/icons/128x128@2x.png +0 -0
  92. package/template-react-vite-muijoy-tauri/src-tauri/icons/32x32.png +0 -0
  93. package/template-react-vite-muijoy-tauri/src-tauri/icons/Square107x107Logo.png +0 -0
  94. package/template-react-vite-muijoy-tauri/src-tauri/icons/Square142x142Logo.png +0 -0
  95. package/template-react-vite-muijoy-tauri/src-tauri/icons/Square150x150Logo.png +0 -0
  96. package/template-react-vite-muijoy-tauri/src-tauri/icons/Square284x284Logo.png +0 -0
  97. package/template-react-vite-muijoy-tauri/src-tauri/icons/Square30x30Logo.png +0 -0
  98. package/template-react-vite-muijoy-tauri/src-tauri/icons/Square310x310Logo.png +0 -0
  99. package/template-react-vite-muijoy-tauri/src-tauri/icons/Square44x44Logo.png +0 -0
  100. package/template-react-vite-muijoy-tauri/src-tauri/icons/Square71x71Logo.png +0 -0
  101. package/template-react-vite-muijoy-tauri/src-tauri/icons/Square89x89Logo.png +0 -0
  102. package/template-react-vite-muijoy-tauri/src-tauri/icons/StoreLogo.png +0 -0
  103. package/template-react-vite-muijoy-tauri/src-tauri/icons/icon.icns +0 -0
  104. package/template-react-vite-muijoy-tauri/src-tauri/icons/icon.ico +0 -0
  105. package/template-react-vite-muijoy-tauri/src-tauri/icons/icon.png +0 -0
  106. package/template-react-vite-muijoy-tauri/src-tauri/src/lib.rs +64 -0
  107. package/template-react-vite-muijoy-tauri/src-tauri/src/main.rs +6 -0
  108. package/template-react-vite-muijoy-tauri/src-tauri/src/steam.rs +238 -0
  109. package/template-react-vite-muijoy-tauri/src-tauri/tauri.conf.json +50 -0
  110. package/template-react-vite-muijoy-tauri/vite.config.ts +24 -0
  111. package/template-react-vite-muijoy-ink/src/content/labels/second.label.ts +0 -1207
  112. package/template-react-vite-muijoy-ink/src/content/labels/start.label.ts +0 -566
  113. package/template-react-vite-muijoy-ink-tauri/src/content/labels/second.label.ts +0 -1207
  114. package/template-react-vite-muijoy-ink-tauri/src/content/labels/start.label.ts +0 -566
@@ -0,0 +1,188 @@
1
+ name: 'Build & Publish Desktop App'
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - 'v*'
7
+
8
+ jobs:
9
+ # ── Create the release exactly once before the matrix starts ────────────────
10
+ create-release:
11
+ runs-on: ubuntu-latest
12
+ permissions:
13
+ contents: write
14
+ outputs:
15
+ release_tag: ${{ github.ref_name }}
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+
19
+ - name: create release
20
+ run: |
21
+ gh release view "${{ github.ref_name }}" 2>/dev/null || \
22
+ gh release create "${{ github.ref_name }}" \
23
+ --title "App v$(jq -r '.version' src-tauri/tauri.conf.json)" \
24
+ --notes "See the assets to download this version and install." \
25
+ 2>/dev/null || \
26
+ gh release view "${{ github.ref_name }}" > /dev/null
27
+ env:
28
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
29
+
30
+ # ── Build and upload per platform ───────────────────────────────────────────
31
+ publish-tauri:
32
+ needs: create-release
33
+ permissions:
34
+ contents: write
35
+ strategy:
36
+ fail-fast: false
37
+ matrix:
38
+ include:
39
+ - platform: 'macos-latest'
40
+ args: '--target aarch64-apple-darwin'
41
+ target: 'aarch64-apple-darwin'
42
+ arch: 'aarch64'
43
+ - platform: 'macos-latest'
44
+ args: '--target x86_64-apple-darwin'
45
+ target: 'x86_64-apple-darwin'
46
+ arch: 'x86_64'
47
+ - platform: 'ubuntu-22.04'
48
+ args: ''
49
+ target: ''
50
+ arch: 'x64'
51
+ - platform: 'windows-latest'
52
+ args: ''
53
+ target: ''
54
+ arch: 'x64'
55
+
56
+ runs-on: ${{ matrix.platform }}
57
+ steps:
58
+ - uses: actions/checkout@v4
59
+
60
+ - name: setup node
61
+ uses: actions/setup-node@v6
62
+ with:
63
+ node-version: lts/*
64
+
65
+ - name: install Rust stable
66
+ uses: dtolnay/rust-toolchain@stable
67
+ with:
68
+ targets: ${{ matrix.platform == 'macos-latest' && 'aarch64-apple-darwin,x86_64-apple-darwin' || '' }}
69
+
70
+ - name: install dependencies (ubuntu only)
71
+ if: matrix.platform == 'ubuntu-22.04'
72
+ run: |
73
+ sudo apt-get update
74
+ sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf
75
+
76
+ - name: install frontend dependencies
77
+ run: npm i
78
+
79
+ - name: build app
80
+ uses: tauri-apps/tauri-action@v0
81
+ env:
82
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
83
+ with:
84
+ args: ${{ matrix.args }}
85
+
86
+ # ── Linux: .deb + .AppImage (AppImage is already portable) ─────────────
87
+ - name: upload artifacts (Linux)
88
+ if: matrix.platform == 'ubuntu-22.04'
89
+ env:
90
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
91
+ TAG: ${{ needs.create-release.outputs.release_tag }}
92
+ run: |
93
+ upload_file() {
94
+ local file="$1"
95
+ local limit=$((1900 * 1024 * 1024))
96
+ local size; size=$(stat -c%s "$file")
97
+ if [ "$size" -gt "$limit" ]; then
98
+ echo "Splitting $(basename "$file") (${size} bytes) into 1.9 GB parts..."
99
+ split -b 1900m "$file" "${file}.part"
100
+ for part in "${file}.part"*; do
101
+ gh release upload "$TAG" "$part" --clobber
102
+ done
103
+ else
104
+ gh release upload "$TAG" "$file" --clobber
105
+ fi
106
+ }
107
+ find src-tauri/target/release/bundle -type f \
108
+ \( -name "*.deb" -o -name "*.AppImage" -o -name "*.rpm" \) |
109
+ while IFS= read -r f; do upload_file "$f"; done
110
+
111
+ # ── macOS: .dmg installer + portable .app.tar.gz ───────────────────────
112
+ - name: upload artifacts (macOS)
113
+ if: matrix.platform == 'macos-latest'
114
+ env:
115
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
116
+ TAG: ${{ needs.create-release.outputs.release_tag }}
117
+ run: |
118
+ BIN_NAME=$(grep '^name = ' src-tauri/Cargo.toml | head -1 | cut -d'"' -f2)
119
+ VERSION=$(jq -r '.version' src-tauri/tauri.conf.json)
120
+ ARCH="${{ matrix.arch }}"
121
+ BUNDLE_DIR="src-tauri/target/${{ matrix.target }}/release/bundle"
122
+
123
+ upload_file() {
124
+ local file="$1"
125
+ local limit=$((1900 * 1024 * 1024))
126
+ local size; size=$(stat -f%z "$file")
127
+ if [ "$size" -gt "$limit" ]; then
128
+ echo "Splitting $(basename "$file") (${size} bytes) into 1.9 GB parts..."
129
+ split -b 1900m "$file" "${file}.part"
130
+ for part in "${file}.part"*; do
131
+ gh release upload "$TAG" "$part" --clobber
132
+ done
133
+ else
134
+ gh release upload "$TAG" "$file" --clobber
135
+ fi
136
+ }
137
+
138
+ # DMG installer
139
+ find "$BUNDLE_DIR/dmg" -name "*.dmg" |
140
+ while IFS= read -r f; do upload_file "$f"; done
141
+
142
+ # Portable: bundle .app into a tar.gz
143
+ APP_PATH=$(find "$BUNDLE_DIR/macos" -maxdepth 1 -name "*.app" | head -1)
144
+ PORTABLE="${BIN_NAME}_${VERSION}_macos_${ARCH}-portable.tar.gz"
145
+ tar -czf "$PORTABLE" -C "$(dirname "$APP_PATH")" "$(basename "$APP_PATH")"
146
+ upload_file "$PORTABLE"
147
+
148
+ # ── Windows: NSIS/.msi installers + portable .zip ──────────────────────
149
+ - name: upload artifacts (Windows)
150
+ if: matrix.platform == 'windows-latest'
151
+ shell: pwsh
152
+ env:
153
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
154
+ run: |
155
+ $tag = "${{ needs.create-release.outputs.release_tag }}"
156
+ $ver = (Get-Content src-tauri/tauri.conf.json | ConvertFrom-Json).version
157
+ $name = (Select-String -Path src-tauri/Cargo.toml `
158
+ -Pattern '^name = "(.+)"').Matches[0].Groups[1].Value
159
+
160
+ function Upload-File($Path, $Tag) {
161
+ $limitBytes = 1900 * 1MB
162
+ $item = Get-Item $Path
163
+ if ($item.Length -gt $limitBytes) {
164
+ Write-Host "Splitting $($item.Name) ($($item.Length) bytes) into 1.9 GB parts..."
165
+ $stream = [System.IO.File]::OpenRead($Path)
166
+ $buf = New-Object byte[] $limitBytes
167
+ $i = 0
168
+ while (($n = $stream.Read($buf, 0, $buf.Length)) -gt 0) {
169
+ $part = "$Path.part$($i.ToString('D3'))"
170
+ $data = if ($n -eq $buf.Length) { $buf } else { $buf[0..($n - 1)] }
171
+ [System.IO.File]::WriteAllBytes($part, $data)
172
+ gh release upload $Tag $part --clobber
173
+ $i++
174
+ }
175
+ $stream.Dispose()
176
+ } else {
177
+ gh release upload $Tag $Path --clobber
178
+ }
179
+ }
180
+
181
+ # NSIS and MSI installers
182
+ Get-ChildItem -Recurse src-tauri/target/release/bundle -Include "*.exe","*.msi" |
183
+ ForEach-Object { Upload-File $_.FullName $tag }
184
+
185
+ # Portable ZIP (single EXE, no installer)
186
+ $zip = "${name}_${ver}_windows_x64-portable.zip"
187
+ Compress-Archive -Path "src-tauri/target/release/$name.exe" -DestinationPath $zip
188
+ Upload-File $zip $tag
@@ -0,0 +1,270 @@
1
+ name: 'Build Mobile App (Debug)'
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - 'v*'
7
+ workflow_dispatch:
8
+
9
+ jobs:
10
+ # ── Create the release exactly once before the builds start ──────────────────
11
+ create-release:
12
+ runs-on: ubuntu-latest
13
+ permissions:
14
+ contents: write
15
+ outputs:
16
+ release_tag: ${{ github.ref_name }}
17
+ steps:
18
+ - uses: actions/checkout@v4
19
+
20
+ - name: create release
21
+ run: |
22
+ gh release view "${{ github.ref_name }}" 2>/dev/null || \
23
+ gh release create "${{ github.ref_name }}" \
24
+ --title "App v$(jq -r '.version' src-tauri/tauri.conf.json)" \
25
+ --notes "See the assets to download this version and install." \
26
+ 2>/dev/null || \
27
+ gh release view "${{ github.ref_name }}" > /dev/null
28
+ env:
29
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
30
+
31
+ # ---------------------------------------------------------------------------
32
+ # Android debug — unsigned APK uploaded to the release
33
+ # ---------------------------------------------------------------------------
34
+ build-android:
35
+ needs: create-release
36
+ runs-on: ubuntu-22.04
37
+ permissions:
38
+ contents: write
39
+ steps:
40
+ - uses: actions/checkout@v4
41
+
42
+ - name: setup node
43
+ uses: actions/setup-node@v4
44
+ with:
45
+ node-version: lts/*
46
+
47
+ - name: setup Java 17
48
+ uses: actions/setup-java@v4
49
+ with:
50
+ distribution: 'zulu'
51
+ java-version: '17'
52
+
53
+ - name: setup Android SDK
54
+ uses: android-actions/setup-android@v3
55
+
56
+ - name: install Android NDK r27
57
+ run: sdkmanager "ndk;27.0.12077973"
58
+
59
+ - name: install Rust stable + Android targets
60
+ uses: dtolnay/rust-toolchain@stable
61
+ with:
62
+ targets: aarch64-linux-android,armv7-linux-androideabi,i686-linux-android,x86_64-linux-android
63
+
64
+ - name: install Linux dependencies
65
+ run: |
66
+ sudo apt-get update
67
+ sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf
68
+
69
+ - name: install frontend dependencies
70
+ run: npm i
71
+
72
+ - name: init Tauri Android project
73
+ run: npx tauri android init
74
+ env:
75
+ NDK_HOME: ${{ env.ANDROID_HOME }}/ndk/27.0.12077973
76
+
77
+ - name: patch Android manifest (landscape + fullscreen)
78
+ run: |
79
+ python3 << 'PYEOF'
80
+ import glob, re
81
+
82
+ manifest = glob.glob('src-tauri/gen/android/app/src/main/AndroidManifest.xml')[0]
83
+ with open(manifest) as f:
84
+ content = f.read()
85
+ # Remove any pre-existing screenOrientation to avoid duplicates
86
+ content = re.sub(r'\s+android:screenOrientation="[^"]*"', '', content)
87
+ # Insert screenOrientation directly on the first <activity tag (robust, independent
88
+ # of which other attributes Tauri generates)
89
+ patched, n = re.subn(
90
+ r'(<activity\b)',
91
+ r'\1\n android:screenOrientation="sensorLandscape"',
92
+ content,
93
+ count=1
94
+ )
95
+ if n == 0:
96
+ print('WARNING: <activity> tag not found in manifest — orientation NOT patched')
97
+ else:
98
+ content = patched
99
+ print(f'Patched {manifest} (screenOrientation=sensorLandscape)')
100
+ with open(manifest, 'w') as f:
101
+ f.write(content)
102
+
103
+ # Tauri may generate styles.xml or themes.xml depending on the version
104
+ styles_candidates = (
105
+ glob.glob('src-tauri/gen/android/app/src/main/res/values/styles.xml') +
106
+ glob.glob('src-tauri/gen/android/app/src/main/res/values/themes.xml')
107
+ )
108
+ if not styles_candidates:
109
+ print('Warning: no styles.xml/themes.xml found, skipping fullscreen patch')
110
+ else:
111
+ styles = styles_candidates[0]
112
+ with open(styles) as f:
113
+ content = f.read()
114
+ # Hide status bar (fullscreen)
115
+ content = content.replace(
116
+ '</style>',
117
+ ' <item name="android:windowFullscreen">true</item>\n </style>',
118
+ 1
119
+ )
120
+ with open(styles, 'w') as f:
121
+ f.write(content)
122
+ print(f'Patched {styles}')
123
+ PYEOF
124
+
125
+ - name: build Android app
126
+ run: npx tauri android build --debug
127
+ env:
128
+ NDK_HOME: ${{ env.ANDROID_HOME }}/ndk/27.0.12077973
129
+
130
+ - name: upload APK to release
131
+ env:
132
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
133
+ TAG: ${{ needs.create-release.outputs.release_tag }}
134
+ run: |
135
+ find src-tauri/gen/android -name "*.apk" | while IFS= read -r f; do
136
+ gh release upload "$TAG" "$f" --clobber
137
+ done
138
+
139
+ # ---------------------------------------------------------------------------
140
+ # iOS debug — unsigned build uploaded to the release (best-effort)
141
+ # ---------------------------------------------------------------------------
142
+ build-ios:
143
+ needs: create-release
144
+ runs-on: macos-latest
145
+ permissions:
146
+ contents: write
147
+ steps:
148
+ - uses: actions/checkout@v4
149
+
150
+ - name: setup node
151
+ uses: actions/setup-node@v4
152
+ with:
153
+ node-version: lts/*
154
+
155
+ - name: install Rust stable + iOS targets
156
+ uses: dtolnay/rust-toolchain@stable
157
+ with:
158
+ targets: aarch64-apple-ios,aarch64-apple-ios-sim,x86_64-apple-ios
159
+
160
+ - name: install frontend dependencies
161
+ run: npm i
162
+
163
+ - name: init Tauri iOS project
164
+ run: npx tauri ios init
165
+
166
+ - name: disable code signing in Xcode project
167
+ run: |
168
+ python3 << 'PYEOF'
169
+ import glob, re
170
+ pbxproj = glob.glob('src-tauri/gen/apple/*.xcodeproj/project.pbxproj')[0]
171
+ with open(pbxproj) as f:
172
+ content = f.read()
173
+ sign_off = (
174
+ '\n\t\t\t\tCODE_SIGN_IDENTITY = "";'
175
+ '\n\t\t\t\tCODE_SIGNING_REQUIRED = NO;'
176
+ '\n\t\t\t\tCODE_SIGNING_ALLOWED = NO;'
177
+ '\n\t\t\t\tDEVELOPMENT_TEAM = "";'
178
+ )
179
+ content = re.sub(r'(buildSettings = \{)', r'\1' + sign_off, content)
180
+ with open(pbxproj, 'w') as f:
181
+ f.write(content)
182
+ print(f'Patched {pbxproj}')
183
+ PYEOF
184
+
185
+ - name: patch iOS Info.plist (landscape + hide status bar)
186
+ run: |
187
+ python3 << 'PYEOF'
188
+ import glob, re
189
+
190
+ plists = glob.glob('src-tauri/gen/apple/*/Info.plist')
191
+ if not plists:
192
+ plists = glob.glob('src-tauri/gen/apple/*/*/Info.plist')
193
+ for plist in plists:
194
+ with open(plist) as f:
195
+ content = f.read()
196
+
197
+ # Remove any existing orientation / status bar keys so we can replace them
198
+ for key in [
199
+ 'UISupportedInterfaceOrientations',
200
+ 'UISupportedInterfaceOrientations~ipad',
201
+ 'UIStatusBarHidden',
202
+ 'UIViewControllerBasedStatusBarAppearance',
203
+ ]:
204
+ content = re.sub(
205
+ rf'\s*<key>{re.escape(key)}</key>\s*(<(true|false)/>|<array>.*?</array>)',
206
+ '', content, flags=re.DOTALL
207
+ )
208
+
209
+ additions = (
210
+ '\t<key>UIStatusBarHidden</key>\n'
211
+ '\t<true/>\n'
212
+ '\t<key>UIViewControllerBasedStatusBarAppearance</key>\n'
213
+ '\t<false/>\n'
214
+ '\t<key>UISupportedInterfaceOrientations</key>\n'
215
+ '\t<array>\n'
216
+ '\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n'
217
+ '\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n'
218
+ '\t</array>\n'
219
+ '\t<key>UISupportedInterfaceOrientations~ipad</key>\n'
220
+ '\t<array>\n'
221
+ '\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n'
222
+ '\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n'
223
+ '\t</array>\n'
224
+ )
225
+ new_content, n = re.subn(
226
+ r'</dict>\s*</plist>\s*$',
227
+ additions + '</dict>\n</plist>\n',
228
+ content.rstrip(),
229
+ flags=re.DOTALL
230
+ )
231
+ if n == 0:
232
+ print(f'WARNING: </dict></plist> not found in {plist} — orientation NOT patched')
233
+ else:
234
+ content = new_content
235
+ print(f'Patched {plist}')
236
+ with open(plist, 'w') as f:
237
+ f.write(content)
238
+ PYEOF
239
+
240
+ - name: build iOS app
241
+ run: npx tauri ios build --debug
242
+ # Export step fails without a signing team; archive still succeeds.
243
+ # We extract the .app from the .xcarchive below instead.
244
+ continue-on-error: true
245
+
246
+ - name: package and upload iOS app from archive
247
+ env:
248
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
249
+ TAG: ${{ needs.create-release.outputs.release_tag }}
250
+ run: |
251
+ BIN_NAME=$(grep '^name = ' src-tauri/Cargo.toml | head -1 | cut -d'"' -f2)
252
+ VERSION=$(jq -r '.version' src-tauri/tauri.conf.json)
253
+
254
+ ARCHIVE=$(find src-tauri/gen/apple/build -name "*.xcarchive" 2>/dev/null | head -1)
255
+ if [ -z "$ARCHIVE" ]; then
256
+ echo "No .xcarchive found — build may have failed before archiving"
257
+ exit 1
258
+ fi
259
+
260
+ APP=$(find "$ARCHIVE/Products/Applications" -name "*.app" | head -1)
261
+ if [ -z "$APP" ]; then
262
+ echo "No .app found inside archive $ARCHIVE"
263
+ exit 1
264
+ fi
265
+
266
+ mkdir Payload
267
+ cp -r "$APP" Payload/
268
+ IPA="${BIN_NAME}_${VERSION}_ios-debug.ipa"
269
+ zip -r "$IPA" Payload/
270
+ gh release upload "$TAG" "$IPA" --clobber
@@ -22,3 +22,13 @@ public/assets
22
22
  *.njsproj
23
23
  *.sln
24
24
  *.sw?
25
+
26
+ # Tauri
27
+ *Cargo.lock
28
+ src-tauri/target
29
+ src-tauri/gen
30
+
31
+ # Steam redistributable libraries (copied automatically by build.rs)
32
+ src-tauri/steam_api64.dll
33
+ src-tauri/libsteam_api.so
34
+ src-tauri/libsteam_api.dylib