🎉 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.
This commit is contained in:
83
ShotScreen/Sources/SwiftUIViews.swift
Normal file
83
ShotScreen/Sources/SwiftUIViews.swift
Normal file
@@ -0,0 +1,83 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user