style: align translation controls with launcher design

This commit is contained in:
Valdemar Lorenzen
2026-10-15 11:16:49 +02:00
parent c31424b217
commit 31c651ecb1
4 changed files with 43 additions and 11 deletions
+35 -5
View File
@@ -10,7 +10,7 @@ final class TranslationController: NSViewController {
private var usesMyMemory: Bool { provider.indexOfSelectedItem == 0 }
private let output = NSTextView()
private let status = NSTextField(wrappingLabelWithString: "")
private let translateButton = NSButton(title: "Translate ↵", target: nil, action: nil)
private let translateButton = NSButton(title: "Translate", target: nil, action: nil)
private var task: Task<Void, Never>?
var input: (() -> String)?
var closed: (() -> Void)?
@@ -22,10 +22,9 @@ final class TranslationController: NSViewController {
override func loadView() {
view = NSView()
let back = NSButton(title: "‹ Back", target: self, action: #selector(goBack))
let title = NSTextField(labelWithString: "Conjure Translate · English → Japanese")
title.font = .systemFont(ofSize: 13, weight: .semibold)
let heading = NSStackView(views: [back, title, NSView()])
let heading = NSStackView(views: [title, NSView()])
provider.addItems(withTitles: ["MyMemory (no key)", "OpenAI · gpt-6-luna"])
provider.selectItem(at: UserDefaults.standard.string(forKey: "translationProvider") == "openai" ? 1 : 0)
provider.setAccessibilityLabel("Translation provider")
@@ -41,6 +40,33 @@ final class TranslationController: NSViewController {
translateButton.target = self
translateButton.action = #selector(translate)
translateButton.keyEquivalent = "\r"
translateButton.isBordered = false
translateButton.font = .systemFont(ofSize: 12, weight: .medium)
translateButton.contentTintColor = SunsetPalette.text
translateButton.toolTip = "Translate the English input (Return). Escape returns to the launcher."
let returnKey = ShortcutIndicator("↵")
let actionPill = NSView()
actionPill.wantsLayer = true
actionPill.layer?.cornerRadius = 18
actionPill.layer?.borderWidth = 0.5
actionPill.layer?.borderColor = SunsetPalette.accent.withAlphaComponent(0.35).cgColor
actionPill.layer?.backgroundColor = SunsetPalette.background.withAlphaComponent(0.25).cgColor
for control in [translateButton, returnKey] {
control.translatesAutoresizingMaskIntoConstraints = false
actionPill.addSubview(control)
}
NSLayoutConstraint.activate([
actionPill.heightAnchor.constraint(equalToConstant: 36),
translateButton.leadingAnchor.constraint(equalTo: actionPill.leadingAnchor, constant: 14),
translateButton.centerYAnchor.constraint(equalTo: actionPill.centerYAnchor),
returnKey.leadingAnchor.constraint(equalTo: translateButton.trailingAnchor, constant: 8),
returnKey.centerYAnchor.constraint(equalTo: actionPill.centerYAnchor),
returnKey.trailingAnchor.constraint(equalTo: actionPill.trailingAnchor, constant: -12),
])
let footer = NSStackView(views: [NSView(), actionPill])
footer.orientation = .horizontal
footer.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(footer)
output.isEditable = false
output.isSelectable = true
output.drawsBackground = false
@@ -56,7 +82,7 @@ final class TranslationController: NSViewController {
output.textContainer?.widthTracksTextView = true
status.textColor = SunsetPalette.secondaryText
status.font = .systemFont(ofSize: 12)
let stack = NSStackView(views: [heading, provider, credentials, scroll, status, translateButton])
let stack = NSStackView(views: [heading, provider, credentials, scroll, status])
stack.orientation = .vertical
stack.alignment = .leading
stack.spacing = 12
@@ -66,7 +92,11 @@ final class TranslationController: NSViewController {
stack.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16),
stack.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16),
stack.topAnchor.constraint(equalTo: view.topAnchor),
stack.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -16),
stack.bottomAnchor.constraint(equalTo: footer.topAnchor, constant: -12),
footer.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16),
footer.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -8),
footer.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -8),
footer.heightAnchor.constraint(equalToConstant: 36),
credentials.widthAnchor.constraint(equalTo: stack.widthAnchor),
scroll.widthAnchor.constraint(equalTo: stack.widthAnchor),
scroll.heightAnchor.constraint(greaterThanOrEqualToConstant: 100),