chore: rename project to clawdbot
This commit is contained in:
65
apps/macos/Sources/Clawdbot/OnboardingWidgets.swift
Normal file
65
apps/macos/Sources/Clawdbot/OnboardingWidgets.swift
Normal file
@@ -0,0 +1,65 @@
|
||||
import AppKit
|
||||
import SwiftUI
|
||||
|
||||
struct GlowingClawdbotIcon: View {
|
||||
@Environment(\.scenePhase) private var scenePhase
|
||||
|
||||
let size: CGFloat
|
||||
let glowIntensity: Double
|
||||
let enableFloating: Bool
|
||||
|
||||
@State private var breathe = false
|
||||
|
||||
init(size: CGFloat = 148, glowIntensity: Double = 0.35, enableFloating: Bool = true) {
|
||||
self.size = size
|
||||
self.glowIntensity = glowIntensity
|
||||
self.enableFloating = enableFloating
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
let glowBlurRadius: CGFloat = 18
|
||||
let glowCanvasSize: CGFloat = self.size + 56
|
||||
ZStack {
|
||||
Circle()
|
||||
.fill(
|
||||
LinearGradient(
|
||||
colors: [
|
||||
Color.accentColor.opacity(self.glowIntensity),
|
||||
Color.blue.opacity(self.glowIntensity * 0.6),
|
||||
],
|
||||
startPoint: .topLeading,
|
||||
endPoint: .bottomTrailing))
|
||||
.frame(width: glowCanvasSize, height: glowCanvasSize)
|
||||
.padding(glowBlurRadius)
|
||||
.blur(radius: glowBlurRadius)
|
||||
.scaleEffect(self.breathe ? 1.08 : 0.96)
|
||||
.opacity(0.84)
|
||||
|
||||
Image(nsImage: NSApp.applicationIconImage)
|
||||
.resizable()
|
||||
.frame(width: self.size, height: self.size)
|
||||
.clipShape(RoundedRectangle(cornerRadius: self.size * 0.22, style: .continuous))
|
||||
.shadow(color: .black.opacity(0.18), radius: 14, y: 6)
|
||||
.scaleEffect(self.breathe ? 1.02 : 1.0)
|
||||
}
|
||||
.frame(
|
||||
width: glowCanvasSize + (glowBlurRadius * 2),
|
||||
height: glowCanvasSize + (glowBlurRadius * 2))
|
||||
.onAppear { self.updateBreatheAnimation() }
|
||||
.onDisappear { self.breathe = false }
|
||||
.onChange(of: self.scenePhase) { _, _ in
|
||||
self.updateBreatheAnimation()
|
||||
}
|
||||
}
|
||||
|
||||
private func updateBreatheAnimation() {
|
||||
guard self.enableFloating, self.scenePhase == .active else {
|
||||
self.breathe = false
|
||||
return
|
||||
}
|
||||
guard !self.breathe else { return }
|
||||
withAnimation(Animation.easeInOut(duration: 3.6).repeatForever(autoreverses: true)) {
|
||||
self.breathe = true
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user