|
|
@@ -16,13 +16,6 @@ struct LanguageTranslatorView: View {
|
|
|
.padding(.bottom, 28)
|
|
|
|
|
|
contentCard(panelHeight: dynamicPanelHeight)
|
|
|
- .padding(.bottom, 24)
|
|
|
-
|
|
|
- GradientButton(title: "Translate") {
|
|
|
- viewModel.translate()
|
|
|
- }
|
|
|
- .disabled(!viewModel.canTranslate)
|
|
|
- .opacity(viewModel.canTranslate ? 1 : 0.55)
|
|
|
}
|
|
|
.frame(maxWidth: 1200, alignment: .topLeading)
|
|
|
.frame(maxWidth: .infinity, alignment: .topLeading)
|
|
|
@@ -86,24 +79,6 @@ struct LanguageTranslatorView: View {
|
|
|
|
|
|
sourcePanel(height: panelHeight)
|
|
|
|
|
|
- HStack(spacing: 8) {
|
|
|
- ToolbarButton(title: "Paste Text", iconName: "doc.on.clipboard") {
|
|
|
- viewModel.pasteText()
|
|
|
- }
|
|
|
-
|
|
|
- ToolbarButton(title: "Upload File", iconName: "square.and.arrow.up") {
|
|
|
- viewModel.uploadFile()
|
|
|
- }
|
|
|
-
|
|
|
- Spacer()
|
|
|
-
|
|
|
- swapLanguagesButton
|
|
|
-
|
|
|
- ClearButton {
|
|
|
- viewModel.clearText()
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
targetPanel(height: panelHeight)
|
|
|
|
|
|
Text("Press ⌘ + Return to translate")
|
|
|
@@ -122,11 +97,33 @@ struct LanguageTranslatorView: View {
|
|
|
|
|
|
private func sourcePanel(height: CGFloat) -> some View {
|
|
|
VStack(alignment: .leading, spacing: 12) {
|
|
|
- LanguagePicker(
|
|
|
- title: "From",
|
|
|
- selection: $viewModel.sourceLanguage,
|
|
|
- languages: viewModel.sourceLanguageOptions
|
|
|
- )
|
|
|
+ HStack(spacing: 8) {
|
|
|
+ LanguagePicker(
|
|
|
+ title: "From",
|
|
|
+ selection: $viewModel.sourceLanguage,
|
|
|
+ languages: viewModel.sourceLanguageOptions
|
|
|
+ )
|
|
|
+
|
|
|
+ ToolbarButton(title: "Paste Text", iconName: "doc.on.clipboard") {
|
|
|
+ viewModel.pasteText()
|
|
|
+ }
|
|
|
+
|
|
|
+ ToolbarButton(title: "Upload File", iconName: "square.and.arrow.up") {
|
|
|
+ viewModel.uploadFile()
|
|
|
+ }
|
|
|
+
|
|
|
+ ToolbarButton(title: "Translate", iconName: "sparkles") {
|
|
|
+ viewModel.translate()
|
|
|
+ }
|
|
|
+ .disabled(!viewModel.canTranslate)
|
|
|
+ .opacity(viewModel.canTranslate ? 1 : 0.55)
|
|
|
+
|
|
|
+ Spacer()
|
|
|
+
|
|
|
+ ClearButton {
|
|
|
+ viewModel.clearText()
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
ZStack(alignment: .bottomTrailing) {
|
|
|
ThinCaretTextEditor(text: $viewModel.sourceText, onSubmit: viewModel.translate)
|
|
|
@@ -209,26 +206,6 @@ struct LanguageTranslatorView: View {
|
|
|
)
|
|
|
.clipShape(RoundedRectangle(cornerRadius: AppTheme.inputCornerRadius))
|
|
|
}
|
|
|
-
|
|
|
- private var swapLanguagesButton: some View {
|
|
|
- Button {
|
|
|
- viewModel.swapLanguages()
|
|
|
- } label: {
|
|
|
- Image(systemName: "arrow.up.arrow.down")
|
|
|
- .font(.system(size: 12, weight: .semibold))
|
|
|
- .foregroundStyle(AppTheme.textSecondary)
|
|
|
- .padding(.horizontal, 10)
|
|
|
- .padding(.vertical, 7)
|
|
|
- .background(Color.white)
|
|
|
- .clipShape(RoundedRectangle(cornerRadius: 8))
|
|
|
- .overlay(
|
|
|
- RoundedRectangle(cornerRadius: 8)
|
|
|
- .stroke(AppTheme.border, lineWidth: 1)
|
|
|
- )
|
|
|
- }
|
|
|
- .buttonStyle(.plain)
|
|
|
- .accessibilityLabel("Swap languages")
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
private struct LanguagePicker: View {
|