Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
{
"images" : [
{
"filename" : "AccessibilityPermissionLight.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "AccessibilityPermissionDark.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "AccessibilityPermissionLight 1.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "AccessibilityPermissionDark 1.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "AccessibilityPermissionLight 2.png",
"idiom" : "universal",
"scale" : "3x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "AccessibilityPermissionDark 2.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
{
"images" : [
{
"filename" : "EnableKeymanLight.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "EnableKeymanDark.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "EnableKeymanLight 2.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "EnableKeymanDark 1.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "EnableKeymanLight 1.png",
"idiom" : "universal",
"scale" : "3x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "EnableKeymanDark 2.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"images" : [
{
"filename" : "InstallerIcon.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "InstallerIcon 1.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "InstallerIcon 2.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"images" : [
{
"filename" : "Keyman-256.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Keyman-256 1.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Keyman-256 2.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
{
"images" : [
{
"filename" : "keyman logo BIG (2) 3.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "Keyman_Logo_BIG_Dark.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "keyman logo BIG (2) 1.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "Keyman_Logo_BIG_Dark 1.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "keyman logo BIG (2) 2.png",
"idiom" : "universal",
"scale" : "3x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "Keyman_Logo_BIG_Dark 2.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 12 additions & 0 deletions mac/Config/Config/ConfigApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,30 @@ struct ConfigApp: App {
@Environment(\.openWindow) private var openWindow

var body: some Scene {


Window("Configuration", id: "config") {
ConfigView()
.environmentObject(settings)
.task {
if !installation.isInstallationComplete() {
openWindow(id: "install")
openWindow(id: "new install")
}
}
}
Window("Installation", id: "install") {
InstallView()
.environmentObject(installation)
}


Window("New Installation", id: "new install") {
ParentInstallView()
.environmentObject(installation)
}
.defaultSize(width: 500, height: 400)
.windowResizability(.contentSize)

}
}
46 changes: 46 additions & 0 deletions mac/Config/Config/InstallationViews/CompletedInstallView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* Keyman is copyright (C) SIL Global. MIT License.
*
* Created by Eli Schantz on 2026-07-01
*
* View used for notifying the user that installation is complete.
*/

import SwiftUI

struct CompletedInstallView: View {
@EnvironmentObject var installation: InstallationContainer
let namespace: Namespace.ID

var versionText: String {
if let version = installation.installationState?.keymanVersion {
return "Version: \(version) "
} else {
return "No version to display"
}
}

var body: some View {

VStack {

Spacer()

KeymanLogo(namespace: namespace)
Text(versionText)
.foregroundStyle(.secondary)

Spacer()

GradientDivider(namespace: namespace)
.padding(.bottom, 8)
HStack {
Text("Installation complete")
.font(.title2)
.frame(maxWidth: .infinity, alignment: .leading)
NavigationButton(action: .dismiss)
}
}
}
}

61 changes: 61 additions & 0 deletions mac/Config/Config/InstallationViews/EnableInputMethodView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/*
* Keyman is copyright (C) SIL Global. MIT License.
*
* Created by Eli Schantz on 2026-07-01
*
* View used for directing the user to enable the Keyman input method.
*/

import SwiftUI

struct EnableInputMethodView: View {
@EnvironmentObject var installation: InstallationContainer
let namespace: Namespace.ID
let onContinue: () -> Void
@State var enableButtonPressed : Bool = false

var body: some View {
VStack {
Text("Enable Keyman")
.font(.title)
.bold()
.frame(maxWidth: .infinity, alignment: .center)
.matchedGeometryEffect(id: "title", in: namespace)
GradientDivider(namespace: namespace)

Spacer()

Image("EnableKeyman")
.interpolation(.high)
.resizable()
.scaledToFit()
.frame(height: 150)
.padding(.horizontal, 100)
.padding(.bottom, 8)
Text("To use Keyman, enable the Keyman input method in System Settings.")
.multilineTextAlignment(.center)

Spacer()

HStack {
Text("Enable input method")
.font(.title2)
.frame(maxWidth: .infinity, alignment: .leading)
Button {
enableButtonPressed = true
installation.executeNextInstallationTask()
} label: {
Text("Enable")
.padding(.horizontal, 16)
.padding(.vertical, 4)
}
.buttonStyle(.borderedProminent)
.tint(.blue)
.clipShape(Capsule())
.matchedGeometryEffect(id: "actionButton", in: namespace)
NavigationButton(action: .advance, onContinue: onContinue)
.disabled(!enableButtonPressed)
}
}
}
}
30 changes: 30 additions & 0 deletions mac/Config/Config/InstallationViews/GradientDivider.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
* Keyman is copyright (C) SIL Global. MIT License.
*
* Created by Eli Schantz on 2026-07-01
*
* View used for creating a thin divider with a Keyman color gradient.
*/

import SwiftUI

struct GradientDivider: View {
let namespace: Namespace.ID
var id: String = "divider"

var body: some View {
Rectangle()
.fill(LinearGradient(
colors: [
Color(.keymanBlue),
Color(.keymanOrange),
Color(.keymanRed)
],
startPoint: .leading,
endPoint: .trailing
))
.frame(height: 1)
.opacity(0.5)
.matchedGeometryEffect(id: id, in: namespace)
}
}
Loading