vibetunnel/mac/VibeTunnel/Presentation/Components/Menu/MenuStyles.swift

48 lines
1.8 KiB
Swift

import SwiftUI
/// Common styling constants and modifiers for the VibeTunnel menu.
enum MenuStyles {
static let menuWidth: CGFloat = 384
static let cornerRadius: CGFloat = 6
static let smallCornerRadius: CGFloat = 4
static let padding: CGFloat = 12
static let smallPadding: CGFloat = 8
static let animationDuration: Double = 0.15
static let headerGradientLight: [Color] = [
AppColors.Fallback.controlBackground(for: .light),
AppColors.Fallback.controlBackground(for: .light).opacity(0.8)
]
static let headerGradientDark: [Color] = [
AppColors.Fallback.controlBackground(for: .dark).opacity(0.6),
AppColors.Fallback.controlBackground(for: .dark).opacity(0.3)
]
}
// MARK: - View Modifiers
extension View {
/// Applies standard hover effect for menu items
func menuItemHover(isHovered: Bool, colorScheme: ColorScheme) -> some View {
self
.background(
RoundedRectangle(cornerRadius: MenuStyles.cornerRadius)
.fill(isHovered ? AppColors.Fallback.accentHover(for: colorScheme).opacity(0.1) : Color.clear)
.animation(.easeInOut(duration: MenuStyles.animationDuration), value: isHovered)
)
}
/// Applies standard focus ring for keyboard navigation
func menuItemFocus(isFocused: Bool, colorScheme: ColorScheme) -> some View {
self
.overlay(
RoundedRectangle(cornerRadius: MenuStyles.smallCornerRadius)
.strokeBorder(
isFocused ? AppColors.Fallback.accentHover(for: colorScheme).opacity(2) : Color.clear,
lineWidth: 1
)
.animation(.easeInOut(duration: MenuStyles.animationDuration), value: isFocused)
)
}
}