Files
shotscreen/ShotScreen/Sources/SwiftUIViews.swift
Nick Roodenrijs 0dabed11d2 🎉 ShotScreen v1.0 - Initial Release
🚀 First official release of ShotScreen with complete feature set:

 Core Features:
- Advanced screenshot capture system
- Multi-monitor support
- Professional UI/UX design
- Automated update system with Sparkle
- Apple notarized & code signed

🛠 Technical Excellence:
- Native Swift macOS application
- Professional build & deployment pipeline
- Comprehensive error handling
- Memory optimized performance

📦 Distribution Ready:
- Professional DMG packaging
- Apple notarization complete
- No security warnings for users
- Ready for public distribution

This is the foundation release that establishes ShotScreen as a premium screenshot tool for macOS.
2025-06-28 16:15:15 +02:00

83 lines
2.7 KiB
Swift

import SwiftUI
// MARK: - Multi-Monitor Selection Overlay View
struct MultiMonitorSelectionOverlayView: View {
@State private var animationOffset: CGFloat = 0
var body: some View {
ZStack {
// Semi-transparent background with subtle gradient
Rectangle()
.fill(
LinearGradient(
gradient: Gradient(colors: [
Color.blue.opacity(0.15),
Color.blue.opacity(0.25)
]),
startPoint: .topLeading,
endPoint: .bottomTrailing
)
)
// Animated border
Rectangle()
.stroke(
LinearGradient(
gradient: Gradient(colors: [
Color.blue.opacity(0.8),
Color.cyan.opacity(0.6),
Color.blue.opacity(0.8)
]),
startPoint: .leading,
endPoint: .trailing
),
lineWidth: 2
)
.overlay(
// Animated dashed border for better visibility
Rectangle()
.stroke(
Color.white.opacity(0.8),
style: StrokeStyle(
lineWidth: 1,
dash: [8, 4],
dashPhase: animationOffset
)
)
)
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.onAppear {
// Start the dash animation
withAnimation(.linear(duration: 2).repeatForever(autoreverses: false)) {
animationOffset = 24
}
}
}
}
// MARK: - Crosshair Overlay View
struct CrosshairOverlayView: View {
let mouseLocation: CGPoint
private let crosshairSize: CGFloat = 20
var body: some View {
ZStack {
// Horizontal line
Rectangle()
.fill(Color.white)
.frame(width: crosshairSize, height: 2)
.shadow(color: .black, radius: 1, x: 0, y: 0)
// Vertical line
Rectangle()
.fill(Color.white)
.frame(width: 2, height: crosshairSize)
.shadow(color: .black, radius: 1, x: 0, y: 0)
}
.position(mouseLocation)
.allowsHitTesting(false) // Don't interfere with mouse events
}
}