SettingsComponents.swift 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import SwiftUI
  2. struct SettingsToggleRow: View {
  3. let icon: String
  4. let title: String
  5. var subtitle: String?
  6. @Binding var isOn: Bool
  7. var body: some View {
  8. HStack(spacing: 12) {
  9. Image(systemName: icon)
  10. .font(.system(size: 14, weight: .medium))
  11. .foregroundStyle(AppTheme.accentPurple)
  12. .frame(width: 32, height: 32)
  13. .background(
  14. RoundedRectangle(cornerRadius: 8)
  15. .fill(AppTheme.accentPurple.opacity(0.12))
  16. )
  17. VStack(alignment: .leading, spacing: 2) {
  18. Text(title)
  19. .font(.system(size: 13, weight: .medium))
  20. .foregroundStyle(AppTheme.textPrimary)
  21. if let subtitle {
  22. Text(subtitle)
  23. .font(.system(size: 10))
  24. .foregroundStyle(AppTheme.textSecondary)
  25. }
  26. }
  27. Spacer()
  28. Toggle("", isOn: $isOn)
  29. .labelsHidden()
  30. .toggleStyle(.switch)
  31. }
  32. .padding(.horizontal, 12)
  33. .padding(.vertical, 10)
  34. .background(AppTheme.panelBackground)
  35. .clipShape(RoundedRectangle(cornerRadius: 8))
  36. .overlay(
  37. RoundedRectangle(cornerRadius: 8)
  38. .stroke(AppTheme.cardBorder, lineWidth: 1)
  39. )
  40. .frame(maxWidth: .infinity, alignment: .leading)
  41. }
  42. }
  43. struct SettingsLinkRow: View {
  44. let icon: String
  45. let title: String
  46. var subtitle: String?
  47. let action: () -> Void
  48. var body: some View {
  49. Button(action: action) {
  50. HStack(spacing: 12) {
  51. Image(systemName: icon)
  52. .font(.system(size: 14, weight: .medium))
  53. .foregroundStyle(AppTheme.accentPurple)
  54. .frame(width: 32, height: 32)
  55. .background(
  56. RoundedRectangle(cornerRadius: 8)
  57. .fill(AppTheme.accentPurple.opacity(0.12))
  58. )
  59. VStack(alignment: .leading, spacing: 2) {
  60. Text(title)
  61. .font(.system(size: 13, weight: .medium))
  62. .foregroundStyle(AppTheme.textPrimary)
  63. if let subtitle {
  64. Text(subtitle)
  65. .font(.system(size: 10))
  66. .foregroundStyle(AppTheme.textSecondary)
  67. }
  68. }
  69. Spacer()
  70. Image(systemName: "arrow.up.right")
  71. .font(.system(size: 11, weight: .medium))
  72. .foregroundStyle(AppTheme.textTertiary)
  73. }
  74. .padding(.horizontal, 12)
  75. .padding(.vertical, 10)
  76. .background(AppTheme.panelBackground)
  77. .clipShape(RoundedRectangle(cornerRadius: 8))
  78. .overlay(
  79. RoundedRectangle(cornerRadius: 8)
  80. .stroke(AppTheme.cardBorder, lineWidth: 1)
  81. )
  82. }
  83. .buttonStyle(AppPlainButtonStyle())
  84. .hoverCard(cornerRadius: 8)
  85. .frame(maxWidth: .infinity, alignment: .leading)
  86. }
  87. }