mirror of
https://github.com/AgentSeal/codeburn.git
synced 2026-05-17 12:20:43 +00:00
- Fix refresh loop: proper while loop with 30s sleep and force:true instead of single-fire Task that never repeated - Fix loading overlay: counter-based isLoading so concurrent fetches don't flicker the overlay on/off - Fix rapid tab switching: cancel previous switchTask, check Task.isCancelled after CLI returns to discard stale results - Fix tab strip vs hero desync: fetch provider-specific and all-provider data in parallel so costs arrive from same data snapshot - Fix stale menubar icon after wake: forceRefresh now fetches today/all in parallel alongside the current selection - Fix accent color: ThemeState is now @Observable so color changes propagate via observation, removing .id() view hierarchy teardown - Fix currency flash: defer store.currency and symbol update until a rate is available so symbol and rate apply atomically - Fix export: terminationHandler instead of waitUntilExit (no UI freeze), HHmmss in filename to prevent overwrite on double-export - Fix CurrencyState: @MainActor isolation with proper Sendable conformance, nonisolated on pure static functions - Fix streak count: iterate calendar days instead of sparse history entries so gaps are counted as streak-breakers - Fix TrendBar identity: stable date-based id instead of UUID - Add GPT-5.3 and DeepSeek model display names
36 lines
1.3 KiB
Swift
36 lines
1.3 KiB
Swift
import SwiftUI
|
|
|
|
struct PeriodSegmentedControl: View {
|
|
@Environment(AppStore.self) private var store
|
|
|
|
var body: some View {
|
|
HStack(spacing: 1) {
|
|
ForEach(Period.allCases) { period in
|
|
Button {
|
|
store.switchTo(period: period)
|
|
} label: {
|
|
Text(period.rawValue)
|
|
.font(.system(size: 11, weight: .medium))
|
|
.foregroundStyle(store.selectedPeriod == period ? AnyShapeStyle(.primary) : AnyShapeStyle(.secondary))
|
|
.frame(maxWidth: .infinity)
|
|
.padding(.vertical, 4)
|
|
.contentShape(Rectangle())
|
|
}
|
|
.buttonStyle(.plain)
|
|
.background(
|
|
RoundedRectangle(cornerRadius: 5)
|
|
.fill(store.selectedPeriod == period ? Color(NSColor.windowBackgroundColor).opacity(0.85) : .clear)
|
|
.shadow(color: .black.opacity(store.selectedPeriod == period ? 0.06 : 0), radius: 1, y: 0.5)
|
|
)
|
|
}
|
|
}
|
|
.padding(2)
|
|
.background(
|
|
RoundedRectangle(cornerRadius: 7)
|
|
.fill(Color.secondary.opacity(0.08))
|
|
)
|
|
.padding(.horizontal, 12)
|
|
.padding(.top, 6)
|
|
.padding(.bottom, 10)
|
|
}
|
|
}
|