From b7ed71e991f6667ae936b6b4b3988f3be00dbc76 Mon Sep 17 00:00:00 2001 From: NicolasMica Date: Sat, 7 Mar 2026 00:31:03 +0100 Subject: [PATCH 1/4] Lower deployment target to macOS 15 and fix unguarded glassEffect calls MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The deployment target was set to macOS 26.0, preventing the app from running on macOS 15 (Sequoia). Two bare .glassEffect() calls in SettingsView lacked #available guards — replaced with the existing liquidGlass() wrapper which already handles the fallback. --- LaunchNext.xcodeproj/project.pbxproj | 4 ++-- LaunchNext/SettingsView.swift | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/LaunchNext.xcodeproj/project.pbxproj b/LaunchNext.xcodeproj/project.pbxproj index 10a3dd8..30c50e1 100644 --- a/LaunchNext.xcodeproj/project.pbxproj +++ b/LaunchNext.xcodeproj/project.pbxproj @@ -269,7 +269,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MACOSX_DEPLOYMENT_TARGET = 26.0; + MACOSX_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -330,7 +330,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MACOSX_DEPLOYMENT_TARGET = 26.0; + MACOSX_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = macosx; diff --git a/LaunchNext/SettingsView.swift b/LaunchNext/SettingsView.swift index 7ef6e54..970def2 100644 --- a/LaunchNext/SettingsView.swift +++ b/LaunchNext/SettingsView.swift @@ -2207,7 +2207,7 @@ private enum SettingsSection: String, CaseIterable, Identifiable { .padding(.vertical, 10) label - .glassEffect(.clear, in: Capsule()) + .liquidGlass(in: Capsule()) .clipShape(Capsule()) .shadow(color: Color.black.opacity(shadowOpacity), radius: shadowRadius, x: 0, y: shadowOffsetY) .scaleEffect(scale) @@ -2360,7 +2360,7 @@ private enum SettingsSection: String, CaseIterable, Identifiable { .frame(maxWidth: .infinity) } .buttonStyle(.plain) - .glassEffect(.regular, in: RoundedRectangle(cornerRadius: 20, style: .continuous)) + .liquidGlass(in: RoundedRectangle(cornerRadius: 20, style: .continuous)) } // MARK: - Inline Games From b8f063a7dceb1144679362df1359b325620e36ff Mon Sep 17 00:00:00 2001 From: NicolasMica Date: Sat, 7 Mar 2026 01:18:26 +0100 Subject: [PATCH 2/4] Update documentation: macOS 15 requirement and repo references - Update all README files to reflect macOS 15 (Sequoia) as minimum requirement instead of macOS 26 - Update GitHub repository references from RoversX to NicolasMica across all READMEs - Update git clone URLs and download links in all language variants --- README.md | 4 ++-- i18n/README.cs.md | 4 ++-- i18n/README.de.md | 4 ++-- i18n/README.es.md | 4 ++-- i18n/README.fr.md | 4 ++-- i18n/README.hi.md | 4 ++-- i18n/README.it.md | 4 ++-- i18n/README.ja.md | 4 ++-- i18n/README.ko.md | 4 ++-- i18n/README.ru.md | 4 ++-- i18n/README.vi.md | 4 ++-- i18n/README.zh.md | 4 ++-- 12 files changed, 24 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 6706c6c..13dadcb 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ Reads directly from the system Launchpad database: ## Installation ### Requirements -- macOS 26 (Tahoe) or later +- macOS 15 (Sequoia) or later - Apple Silicon or Intel processor - Xcode 26 (for building from source) @@ -132,7 +132,7 @@ xcodebuild -project LaunchNext.xcodeproj -scheme LaunchNext -configuration Relea ### Common Issues **Q: App won't start?** -A: Ensure macOS 26.0+ and check system permissions. +A: Ensure macOS 15.0+ and check system permissions. ## Contributing diff --git a/i18n/README.cs.md b/i18n/README.cs.md index a3ded5e..bf1c48f 100644 --- a/i18n/README.cs.md +++ b/i18n/README.cs.md @@ -57,7 +57,7 @@ Data aplikace jsou bezpečně uložena v: ## Instalace ### Požadavky -- macOS 26 (Tahoe) nebo novější +- macOS 15 (Sequoia) nebo novější - Procesor Apple Silicon nebo Intel - Xcode 26 (pro sestavení ze zdrojového kódu) @@ -132,7 +132,7 @@ xcodebuild -project LaunchNext.xcodeproj -scheme LaunchNext -configuration Relea ### Běžné problémy **Q: Aplikace se nespustí?** -A: Ujistěte se, že máte macOS 26.0+ a zkontrolujte systémová oprávnění. +A: Ujistěte se, že máte macOS 15.0+ a zkontrolujte systémová oprávnění. ## Přispívání diff --git a/i18n/README.de.md b/i18n/README.de.md index 9b37756..afa2b8b 100644 --- a/i18n/README.de.md +++ b/i18n/README.de.md @@ -100,7 +100,7 @@ Liest direkt aus der System-Launchpad-Datenbank: ## Installation ### Anforderungen -- macOS 26 (Tahoe) oder später +- macOS 15 (Sequoia) oder später - Apple Silicon oder Intel-Prozessor - Xcode 26 (für Build aus Quellcode) @@ -170,7 +170,7 @@ xcodebuild -project LaunchNext.xcodeproj -scheme LaunchNext -configuration Relea ### Häufige Probleme **F: App startet nicht?** -A: Stellen Sie macOS 26.0+ sicher und prüfen Sie Systemberechtigungen. +A: Stellen Sie macOS 15.0+ sicher und prüfen Sie Systemberechtigungen. **F: Import-Button fehlt?** A: Überprüfen Sie, dass SettingsView.swift die Import-Funktionalität enthält. diff --git a/i18n/README.es.md b/i18n/README.es.md index ad34e1e..7ae9721 100644 --- a/i18n/README.es.md +++ b/i18n/README.es.md @@ -100,7 +100,7 @@ Lee directamente desde la base de datos del sistema Launchpad: ## Instalación ### Requisitos -- macOS 26 (Tahoe) o posterior +- macOS 15 (Sequoia) o posterior - Procesador Apple Silicon o Intel - Xcode 26 (para compilar desde fuente) @@ -163,7 +163,7 @@ xcodebuild -project LaunchNext.xcodeproj -scheme LaunchNext -configuration Relea ### Problemas comunes **P: ¿La aplicación no inicia?** -R: Asegúrate de tener macOS 26+ y verifica los permisos del sistema. +R: Asegúrate de tener macOS 15+ y verifica los permisos del sistema. **P: ¿Falta el botón de importación?** R: Verifica que SettingsView.swift incluya la funcionalidad de importación. diff --git a/i18n/README.fr.md b/i18n/README.fr.md index ea376a8..4259341 100644 --- a/i18n/README.fr.md +++ b/i18n/README.fr.md @@ -100,7 +100,7 @@ Lit directement depuis la base de données système Launchpad : ## Installation ### Configuration requise -- macOS 26 (Tahoe) ou version ultérieure +- macOS 15 (Sequoia) ou version ultérieure - Processeur Apple Silicon ou Intel - Xcode 26 (pour compiler depuis les sources) @@ -163,7 +163,7 @@ xcodebuild -project LaunchNext.xcodeproj -scheme LaunchNext -configuration Relea ### Problèmes courants **Q: L'application ne démarre pas ?** -R: Assurez-vous d'avoir macOS 26+ et vérifiez les permissions système. +R: Assurez-vous d'avoir macOS 15+ et vérifiez les permissions système. **Q: Le bouton d'import est manquant ?** R: Vérifiez que SettingsView.swift inclut la fonctionnalité d'import. diff --git a/i18n/README.hi.md b/i18n/README.hi.md index d2f0393..ecfde94 100644 --- a/i18n/README.hi.md +++ b/i18n/README.hi.md @@ -102,7 +102,7 @@ sudo xattr -r -d com.apple.quarantine /Applications/LaunchNext.app ## स्थापना ### आवश्यकताएं -- macOS 26 (Tahoe) या बाद का संस्करण +- macOS 15 (Sequoia) या बाद का संस्करण - Apple Silicon या Intel प्रोसेसर - Xcode 26 (स्रोत से बिल्ड करने के लिए) @@ -227,7 +227,7 @@ LaunchNext/ ### सामान्य समस्याएं **प्र: ऐप शुरू नहीं हो रहा?** -उ: macOS 26.0+ सुनिश्चित करें और सिस्टम अनुमतियों की जांच करें। +उ: macOS 15.0+ सुनिश्चित करें और सिस्टम अनुमतियों की जांच करें। **प्र: आयात बटन गायब है?** उ: सत्यापित करें कि SettingsView.swift में आयात कार्यक्षमता शामिल है। diff --git a/i18n/README.it.md b/i18n/README.it.md index 75d81ee..37ff7ed 100644 --- a/i18n/README.it.md +++ b/i18n/README.it.md @@ -57,7 +57,7 @@ Legge direttamente dal database Launchpad di sistema: ## Installazione ### Requisiti -- macOS 26 (Tahoe) o successivo +- macOS 15 (Sequoia) o successivo - Processore Apple Silicon o Intel - Xcode 26 (per compilare dal codice sorgente) @@ -132,7 +132,7 @@ xcodebuild -project LaunchNext.xcodeproj -scheme LaunchNext -configuration Relea ### Problemi Comuni **D: L'app non si avvia?** -R: Assicurati di avere macOS 26.0+ e controlla i permessi di sistema. +R: Assicurati di avere macOS 15.0+ e controlla i permessi di sistema. ## Contribuire diff --git a/i18n/README.ja.md b/i18n/README.ja.md index a3f8a1f..fd4d4e7 100644 --- a/i18n/README.ja.md +++ b/i18n/README.ja.md @@ -100,7 +100,7 @@ sudo xattr -r -d com.apple.quarantine /Applications/LaunchNext.app ## インストール ### システム要件 -- macOS 26 (Tahoe) 以降 +- macOS 15 (Sequoia) 以降 - Apple Silicon または Intel プロセッサ - Xcode 26(ソースからビルドする場合) @@ -163,7 +163,7 @@ xcodebuild -project LaunchNext.xcodeproj -scheme LaunchNext -configuration Relea ### よくある問題 **Q: アプリが起動しませんか?** -A: macOS 26+ であることを確認し、システム権限をチェックしてください。 +A: macOS 15+ であることを確認し、システム権限をチェックしてください。 **Q: インポートボタンが見つかりませんか?** A: SettingsView.swift にインポート機能が含まれていることを確認してください。 diff --git a/i18n/README.ko.md b/i18n/README.ko.md index 70fd7d9..0247a70 100644 --- a/i18n/README.ko.md +++ b/i18n/README.ko.md @@ -104,7 +104,7 @@ sudo xattr -r -d com.apple.quarantine /Applications/LaunchNext.app ## 설치 ### 요구사항 -- macOS 26 (Tahoe) 이상 +- macOS 15 (Sequoia) 이상 - Apple Silicon 또는 Intel 프로세서 - Xcode 26 (소스에서 빌드하는 경우) @@ -229,7 +229,7 @@ LaunchNext/ ### 일반적인 문제 **Q: 앱이 시작되지 않나요?** -A: macOS 26.0+ 확인 및 시스템 권한을 확인해주세요 +A: macOS 15.0+ 확인 및 시스템 권한을 확인해주세요 **Q: 가져오기 버튼이 없나요?** A: SettingsView.swift에 가져오기 기능이 포함되어 있는지 확인해주세요 diff --git a/i18n/README.ru.md b/i18n/README.ru.md index d36251d..3f97d2a 100644 --- a/i18n/README.ru.md +++ b/i18n/README.ru.md @@ -100,7 +100,7 @@ sudo xattr -r -d com.apple.quarantine /Applications/LaunchNext.app ## Установка ### Требования -- macOS 26 (Tahoe) или новее +- macOS 15 (Sequoia) или новее - Процессор Apple Silicon или Intel - Xcode 26 (для сборки из исходного кода) @@ -170,7 +170,7 @@ xcodebuild -project LaunchNext.xcodeproj -scheme LaunchNext -configuration Relea ### Общие проблемы **В: Приложение не запускается?** -О: Убедитесь в macOS 26.0+ и проверьте системные разрешения. +О: Убедитесь в macOS 15.0+ и проверьте системные разрешения. **В: Кнопка импорта отсутствует?** О: Убедитесь, что SettingsView.swift включает функциональность импорта. diff --git a/i18n/README.vi.md b/i18n/README.vi.md index 2c0ce54..2a9cd7f 100644 --- a/i18n/README.vi.md +++ b/i18n/README.vi.md @@ -102,7 +102,7 @@ Dữ liệu ứng dụng được lưu trữ an toàn tại: ## Cài đặt ### Yêu cầu -- macOS 26 (Tahoe) trở lên +- macOS 15 (Sequoia) trở lên - Bộ xử lý Apple Silicon hoặc Intel - Xcode 26 (để xây dựng từ mã nguồn) @@ -227,7 +227,7 @@ LaunchNext/ ### Vấn đề thường gặp **Q: Ứng dụng không khởi động?** -A: Đảm bảo macOS 26.0+ và kiểm tra quyền hệ thống. +A: Đảm bảo macOS 15.0+ và kiểm tra quyền hệ thống. **Q: Thiếu nút nhập?** A: Xác minh SettingsView.swift bao gồm chức năng nhập. diff --git a/i18n/README.zh.md b/i18n/README.zh.md index 985ac4e..8d4e8ed 100644 --- a/i18n/README.zh.md +++ b/i18n/README.zh.md @@ -100,7 +100,7 @@ sudo xattr -r -d com.apple.quarantine /Applications/LaunchNext.app ## 安装 ### 系统要求 -- macOS 26 (Tahoe) 或更高版本 +- macOS 15 (Sequoia) 或更高版本 - Apple Silicon 或 Intel 处理器 - Xcode 26(从源码构建) @@ -163,7 +163,7 @@ xcodebuild -project LaunchNext.xcodeproj -scheme LaunchNext -configuration Relea ### 常见问题 **问:应用无法启动?** -答:确保 macOS 26.0+ 并检查系统权限。 +答:确保 macOS 15.0+ 并检查系统权限。 **问:导入按钮缺失?** 答:验证 SettingsView.swift 包含导入功能。 From 910d1ece5d61f860dfa91e899cf8360d6d6b727a Mon Sep 17 00:00:00 2001 From: NicolasMica Date: Sat, 7 Mar 2026 01:45:34 +0100 Subject: [PATCH 3/4] Add SwiftUpdater build step to build-from-source instructions The Xcode build phase expects a pre-built SwiftUpdater binary. Without this step, first-time builds fail. Added as step 2 across all 12 README translations. --- README.md | 9 +++++++-- i18n/README.cs.md | 9 +++++++-- i18n/README.de.md | 9 +++++++-- i18n/README.es.md | 9 +++++++-- i18n/README.fr.md | 9 +++++++-- i18n/README.hi.md | 9 +++++++-- i18n/README.it.md | 9 +++++++-- i18n/README.ja.md | 9 +++++++-- i18n/README.ko.md | 9 +++++++-- i18n/README.ru.md | 9 +++++++-- i18n/README.vi.md | 9 +++++++-- i18n/README.zh.md | 9 +++++++-- 12 files changed, 84 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 13dadcb..8c61373 100644 --- a/README.md +++ b/README.md @@ -69,12 +69,17 @@ Reads directly from the system Launchpad database: cd LaunchNext ``` -2. **Open in Xcode** +2. **Build the updater** + ```bash + swift build --package-path UpdaterScripts/SwiftUpdater --configuration release --arch arm64 --arch x86_64 --product SwiftUpdater + ``` + +3. **Open in Xcode** ```bash open LaunchNext.xcodeproj ``` -3. **Build and run** +4. **Build and run** - Select your target device - Press `⌘+R` to build and run - Or `⌘+B` to build only diff --git a/i18n/README.cs.md b/i18n/README.cs.md index bf1c48f..22ad38b 100644 --- a/i18n/README.cs.md +++ b/i18n/README.cs.md @@ -69,12 +69,17 @@ Data aplikace jsou bezpečně uložena v: cd LaunchNext ``` -2. **Otevřít v Xcode** +2. **Sestavit aktualizátor** + ```bash + swift build --package-path UpdaterScripts/SwiftUpdater --configuration release --arch arm64 --arch x86_64 --product SwiftUpdater + ``` + +3. **Otevřít v Xcode** ```bash open LaunchNext.xcodeproj ``` -3. **Sestavit a spustit** +4. **Sestavit a spustit** - Vyberte vaše cílové zařízení - Stiskněte `⌘+R` pro sestavení a spuštění - Nebo `⌘+B` pouze pro sestavení diff --git a/i18n/README.de.md b/i18n/README.de.md index afa2b8b..32154a0 100644 --- a/i18n/README.de.md +++ b/i18n/README.de.md @@ -112,12 +112,17 @@ Liest direkt aus der System-Launchpad-Datenbank: cd LaunchNext/LaunchNext ``` -2. **In Xcode öffnen** +2. **Updater bauen** + ```bash + swift build --package-path UpdaterScripts/SwiftUpdater --configuration release --arch arm64 --arch x86_64 --product SwiftUpdater + ``` + +3. **In Xcode öffnen** ```bash open LaunchNext.xcodeproj ``` -3. **Bauen und ausführen** +4. **Bauen und ausführen** - Wählen Sie Ihr Zielgerät - Drücken Sie `⌘+R` zum Bauen und Ausführen - Oder `⌘+B` nur zum Bauen diff --git a/i18n/README.es.md b/i18n/README.es.md index 7ae9721..acd2ecc 100644 --- a/i18n/README.es.md +++ b/i18n/README.es.md @@ -112,12 +112,17 @@ Lee directamente desde la base de datos del sistema Launchpad: cd LaunchNext/LaunchNext ``` -2. **Abrir en Xcode** +2. **Compilar el actualizador** + ```bash + swift build --package-path UpdaterScripts/SwiftUpdater --configuration release --arch arm64 --arch x86_64 --product SwiftUpdater + ``` + +3. **Abrir en Xcode** ```bash open LaunchNext.xcodeproj ``` -3. **Compilar y ejecutar** +4. **Compilar y ejecutar** - Seleccionar tu dispositivo objetivo - Presionar `⌘+R` para compilar y ejecutar - O `⌘+B` para solo compilar diff --git a/i18n/README.fr.md b/i18n/README.fr.md index 4259341..4efdb61 100644 --- a/i18n/README.fr.md +++ b/i18n/README.fr.md @@ -112,12 +112,17 @@ Lit directement depuis la base de données système Launchpad : cd LaunchNext/LaunchNext ``` -2. **Ouvrir dans Xcode** +2. **Compiler le metteur à jour** + ```bash + swift build --package-path UpdaterScripts/SwiftUpdater --configuration release --arch arm64 --arch x86_64 --product SwiftUpdater + ``` + +3. **Ouvrir dans Xcode** ```bash open LaunchNext.xcodeproj ``` -3. **Compiler et exécuter** +4. **Compiler et exécuter** - Sélectionner votre périphérique cible - Appuyer sur `⌘+R` pour compiler et exécuter - Ou `⌘+B` pour compiler seulement diff --git a/i18n/README.hi.md b/i18n/README.hi.md index ecfde94..73abb2a 100644 --- a/i18n/README.hi.md +++ b/i18n/README.hi.md @@ -114,12 +114,17 @@ sudo xattr -r -d com.apple.quarantine /Applications/LaunchNext.app cd LaunchNext/LaunchNext ``` -2. **Xcode में खोलें** +2. **अपडेटर बिल्ड करें** + ```bash + swift build --package-path UpdaterScripts/SwiftUpdater --configuration release --arch arm64 --arch x86_64 --product SwiftUpdater + ``` + +3. **Xcode में खोलें** ```bash open LaunchNext.xcodeproj ``` -3. **बिल्ड और रन करें** +4. **बिल्ड और रन करें** - अपना लक्ष्य डिवाइस चुनें - बिल्ड और रन करने के लिए `⌘+R` दबाएं - या केवल बिल्ड करने के लिए `⌘+B` diff --git a/i18n/README.it.md b/i18n/README.it.md index 37ff7ed..d28eec6 100644 --- a/i18n/README.it.md +++ b/i18n/README.it.md @@ -69,12 +69,17 @@ Legge direttamente dal database Launchpad di sistema: cd LaunchNext ``` -2. **Apri in Xcode** +2. **Compila l'aggiornatore** + ```bash + swift build --package-path UpdaterScripts/SwiftUpdater --configuration release --arch arm64 --arch x86_64 --product SwiftUpdater + ``` + +3. **Apri in Xcode** ```bash open LaunchNext.xcodeproj ``` -3. **Compila ed esegui** +4. **Compila ed esegui** - Seleziona il tuo dispositivo target - Premi `⌘+R` per compilare ed eseguire - O `⌘+B` per solo compilare diff --git a/i18n/README.ja.md b/i18n/README.ja.md index fd4d4e7..8af0c1f 100644 --- a/i18n/README.ja.md +++ b/i18n/README.ja.md @@ -112,12 +112,17 @@ sudo xattr -r -d com.apple.quarantine /Applications/LaunchNext.app cd LaunchNext/LaunchNext ``` -2. **Xcode で開く** +2. **アップデーターをビルド** + ```bash + swift build --package-path UpdaterScripts/SwiftUpdater --configuration release --arch arm64 --arch x86_64 --product SwiftUpdater + ``` + +3. **Xcode で開く** ```bash open LaunchNext.xcodeproj ``` -3. **ビルドして実行** +4. **ビルドして実行** - ターゲットデバイスを選択 - `⌘+R` でビルドして実行 - または `⌘+B` でビルドのみ diff --git a/i18n/README.ko.md b/i18n/README.ko.md index 0247a70..fed6e2f 100644 --- a/i18n/README.ko.md +++ b/i18n/README.ko.md @@ -116,12 +116,17 @@ sudo xattr -r -d com.apple.quarantine /Applications/LaunchNext.app cd LaunchNext/LaunchNext ``` -2. **Xcode에서 열기** +2. **업데이터 빌드** + ```bash + swift build --package-path UpdaterScripts/SwiftUpdater --configuration release --arch arm64 --arch x86_64 --product SwiftUpdater + ``` + +3. **Xcode에서 열기** ```bash open LaunchNext.xcodeproj ``` -3. **빌드 및 실행** +4. **빌드 및 실행** - 타겟 디바이스 선택 - `⌘+R`로 빌드 및 실행 - 또는 `⌘+B`로 빌드만 실행 diff --git a/i18n/README.ru.md b/i18n/README.ru.md index 3f97d2a..769cd01 100644 --- a/i18n/README.ru.md +++ b/i18n/README.ru.md @@ -112,12 +112,17 @@ sudo xattr -r -d com.apple.quarantine /Applications/LaunchNext.app cd LaunchNext/LaunchNext ``` -2. **Открыть в Xcode** +2. **Собрать обновлятор** + ```bash + swift build --package-path UpdaterScripts/SwiftUpdater --configuration release --arch arm64 --arch x86_64 --product SwiftUpdater + ``` + +3. **Открыть в Xcode** ```bash open LaunchNext.xcodeproj ``` -3. **Собрать и запустить** +4. **Собрать и запустить** - Выберите целевое устройство - Нажмите `⌘+R` для сборки и запуска - Или `⌘+B` только для сборки diff --git a/i18n/README.vi.md b/i18n/README.vi.md index 2a9cd7f..0a73903 100644 --- a/i18n/README.vi.md +++ b/i18n/README.vi.md @@ -114,12 +114,17 @@ Dữ liệu ứng dụng được lưu trữ an toàn tại: cd LaunchNext/LaunchNext ``` -2. **Mở trong Xcode** +2. **Xây dựng trình cập nhật** + ```bash + swift build --package-path UpdaterScripts/SwiftUpdater --configuration release --arch arm64 --arch x86_64 --product SwiftUpdater + ``` + +3. **Mở trong Xcode** ```bash open LaunchNext.xcodeproj ``` -3. **Xây dựng và chạy** +4. **Xây dựng và chạy** - Chọn thiết bị đích - Nhấn `⌘+R` để xây dựng và chạy - Hoặc `⌘+B` chỉ để xây dựng diff --git a/i18n/README.zh.md b/i18n/README.zh.md index 8d4e8ed..89cf1a1 100644 --- a/i18n/README.zh.md +++ b/i18n/README.zh.md @@ -112,12 +112,17 @@ sudo xattr -r -d com.apple.quarantine /Applications/LaunchNext.app cd LaunchNext/LaunchNext ``` -2. **在 Xcode 中打开** +2. **构建更新器** + ```bash + swift build --package-path UpdaterScripts/SwiftUpdater --configuration release --arch arm64 --arch x86_64 --product SwiftUpdater + ``` + +3. **在 Xcode 中打开** ```bash open LaunchNext.xcodeproj ``` -3. **构建和运行** +4. **构建和运行** - 选择目标设备 - 按 `⌘+R` 构建并运行 - 或按 `⌘+B` 仅构建 From 9c2dadd6044c2d1a6640ae7f230762dc2ea8cd35 Mon Sep 17 00:00:00 2001 From: Nicolas Micallef Date: Sun, 8 Mar 2026 18:05:35 +0100 Subject: [PATCH 4/4] feat: Add glass effect style system with identity, clear, and regular types (#10) * feat: Add glass effect type parameter to liquidGlass wrapper Support both .regular and .clear glass effect types with appropriate material fallbacks for pre-macOS 26 compatibility. .regular uses regularMaterial as fallback while .clear uses ultraThinMaterial, providing better visual parity with the glass effects on newer macOS versions. Restore .clear type on the Capsule label in SettingsView that was lost during deployment target migration. * feat: Add identity glass effect style with proper fallbacks * feat: Add glass effect preview to appearance settings --- LaunchNext/Extensions.swift | 52 +++++++++++-- LaunchNext/SettingsView.swift | 133 +++++++++++++++++++++++++++++++++- 2 files changed, 175 insertions(+), 10 deletions(-) diff --git a/LaunchNext/Extensions.swift b/LaunchNext/Extensions.swift index ba8d850..6f55791 100644 --- a/LaunchNext/Extensions.swift +++ b/LaunchNext/Extensions.swift @@ -15,23 +15,59 @@ extension Font { } } +// MARK: - Glass Effect Style + +enum LiquidGlassStyle { + case regular + case clear + case identity +} + // MARK: - View Extensions for Glass Effect extension View { @ViewBuilder - func liquidGlass(in shape: S, isEnabled: Bool = true) -> some View { - if #available(macOS 26.0, iOS 18.0, *) { - self.glassEffect(.regular, in: shape) + func liquidGlass(_ style: LiquidGlassStyle = .regular, in shape: S, isEnabled: Bool = true) -> some View { + if #available(macOS 26.0, iOS 26.0, *) { + switch style { + case .regular: + self.glassEffect(.regular, in: shape) + case .clear: + self.glassEffect(.clear, in: shape) + case .identity: + self.glassEffect(.identity, in: shape) + } } else { - self.background(.ultraThinMaterial, in: shape) + switch style { + case .regular: + self.background(.regularMaterial, in: shape) + case .clear: + self.background(.ultraThinMaterial, in: shape) + case .identity: + self + } } } @ViewBuilder - func liquidGlass(isEnabled: Bool = true) -> some View { - if #available(macOS 26.0, iOS 18.0, *) { - self.glassEffect(.regular) + func liquidGlass(_ style: LiquidGlassStyle = .regular, isEnabled: Bool = true) -> some View { + if #available(macOS 26.0, iOS 26.0, *) { + switch style { + case .regular: + self.glassEffect(.regular) + case .clear: + self.glassEffect(.clear) + case .identity: + self.glassEffect(.identity) + } } else { - self.background(.ultraThinMaterial) + switch style { + case .regular: + self.background(.regularMaterial) + case .clear: + self.background(.ultraThinMaterial) + case .identity: + self + } } } } diff --git a/LaunchNext/SettingsView.swift b/LaunchNext/SettingsView.swift index 970def2..5d1dc3b 100644 --- a/LaunchNext/SettingsView.swift +++ b/LaunchNext/SettingsView.swift @@ -199,6 +199,7 @@ struct SettingsView: View { .background(.ultraThinMaterial) Button { + appStore.stopAccessibilityPolling() appStore.isSetting = false } label: { Image(systemName: "xmark") @@ -499,7 +500,7 @@ private enum SettingsSection: String, CaseIterable, Identifiable { ScrollView(showsIndicators: false) { scrollContent(for: section) } - .scrollDisabled(section == .about || section == .general) + .scrollDisabled(section == .about) .frame(maxWidth: .infinity, maxHeight: .infinity) .scrollBounceBehavior(.basedOnSize) } @@ -2207,7 +2208,7 @@ private enum SettingsSection: String, CaseIterable, Identifiable { .padding(.vertical, 10) label - .liquidGlass(in: Capsule()) + .liquidGlass(.clear, in: Capsule()) .clipShape(Capsule()) .shadow(color: Color.black.opacity(shadowOpacity), radius: shadowRadius, x: 0, y: shadowOffsetY) .scaleEffect(scale) @@ -2753,6 +2754,72 @@ private enum SettingsSection: String, CaseIterable, Identifiable { .frame(maxWidth: .infinity, alignment: .leading) } + Divider() + + HStack(alignment: .center, spacing: 24) { + VStack(alignment: .leading, spacing: 4) { + HStack { + Text(appStore.localized(.kioskModeTitle)) + .font(.subheadline.weight(.semibold)) + Spacer() + Toggle("", isOn: $appStore.kioskMode) + .labelsHidden() + .toggleStyle(.switch) + } + Text(appStore.localized(.kioskModeDescription)) + .font(.footnote) + .foregroundStyle(.secondary) + } + .frame(maxWidth: .infinity, alignment: .leading) + + VStack(alignment: .leading, spacing: 4) { + HStack { + Text(appStore.localized(.autoFullscreenTitle)) + .font(.subheadline.weight(.semibold)) + Spacer() + Toggle("", isOn: $appStore.autoFullscreen) + .labelsHidden() + .toggleStyle(.switch) + .onAppear { + appStore.startAccessibilityPolling() + } + .onDisappear { + appStore.stopAccessibilityPolling() + } + .onChange(of: appStore.autoFullscreen) { newValue in + if newValue && !appStore.isAccessibilityTrusted() { + appStore.autoFullscreen = false + appStore.promptAccessibilityPermission() + } + } + } + Text(appStore.localized(.autoFullscreenDescription)) + .font(.footnote) + .foregroundStyle(.secondary) + } + .frame(maxWidth: .infinity, alignment: .leading) + } + + Divider() + + HStack(alignment: .center, spacing: 24) { + VStack(alignment: .leading, spacing: 4) { + HStack { + Text(appStore.localized(.showInDockTitle)) + .font(.subheadline.weight(.semibold)) + Spacer() + Toggle("", isOn: $appStore.showInDock) + .labelsHidden() + .toggleStyle(.switch) + } + Text(appStore.localized(.showInDockDescription)) + .font(.footnote) + .foregroundStyle(.secondary) + } + .frame(maxWidth: .infinity, alignment: .leading) + + Spacer().frame(maxWidth: .infinity) + } } .padding(12) .frame(maxWidth: .infinity, alignment: .leading) @@ -3661,6 +3728,32 @@ private enum SettingsSection: String, CaseIterable, Identifiable { .pickerStyle(.segmented) .labelsHidden() } + + if #available(macOS 26.0, iOS 26.0, *) { + let useGlass = appStore.launchpadBackgroundStyle == .glass + let shape = RoundedRectangle(cornerRadius: 14, style: .continuous) + + ZStack { + Image("AboutBackground") + .resizable() + .interpolation(.high) + .aspectRatio(contentMode: .fill) + + HStack(spacing: 16) { + glassPreviewCard(label: "Regular", icon: "app.fill", style: .regular, useGlass: useGlass, shape: shape) + glassPreviewCard(label: "Clear", icon: "app.fill", style: .clear, useGlass: useGlass, shape: shape) + glassPreviewCard(label: "Identity", icon: "app.fill", style: .identity, useGlass: useGlass, shape: shape) + } + .padding(20) + } + .frame(height: 140) + .clipShape(RoundedRectangle(cornerRadius: 16, style: .continuous)) + .overlay( + RoundedRectangle(cornerRadius: 16, style: .continuous) + .stroke(Color.white.opacity(0.18), lineWidth: 1.4) + ) + .allowsHitTesting(false) + } } } @@ -4017,6 +4110,39 @@ private enum SettingsSection: String, CaseIterable, Identifiable { .padding(.bottom, 20) } + @ViewBuilder + private func glassPreviewCard(label: String, icon: String, style: LiquidGlassStyle, useGlass: Bool, shape: some Shape) -> some View { + let content = VStack(spacing: 8) { + Image(systemName: icon) + .font(.title) + Text(label) + .font(.subheadline.weight(.medium)) + } + .foregroundStyle(.white) + .frame(maxWidth: .infinity) + .padding(.vertical, 18) + + if useGlass, #available(macOS 26.0, iOS 26.0, *) { + switch style { + case .regular: + content.glassEffect(.regular, in: shape) + case .clear: + content.glassEffect(.clear, in: shape) + case .identity: + content.glassEffect(.identity, in: shape) + } + } else { + switch style { + case .regular: + content.background(.regularMaterial, in: shape) + case .clear: + content.background(.ultraThinMaterial, in: shape) + case .identity: + content + } + } + } + // MARK: - Export / Import Application Support Data private func supportDirectoryURL() throws -> URL { let fm = FileManager.default @@ -4181,6 +4307,9 @@ private enum SettingsSection: String, CaseIterable, Identifiable { keys.insert("isStartOnLogin") keys.insert(AppStore.showQuickRefreshButtonKey) keys.insert(AppStore.lockLayoutKey) + keys.insert("kioskMode") + keys.insert("autoFullscreen") + keys.insert("showInDock") keys.insert(AppStore.uninstallToolAppPathKey) } if appearanceCheckbox.state == .on {