diff --git a/ClaudeChecker/ContentView.swift b/ClaudeChecker/ContentView.swift
index 80e228e..c7efb5e 100644
--- a/ClaudeChecker/ContentView.swift
+++ b/ClaudeChecker/ContentView.swift
@@ -47,13 +47,29 @@ struct ContentView: View {
EmptyStateView()
.padding(.vertical, 40)
} else {
- VStack(spacing: 1) {
+ VStack(spacing: 8) {
ForEach(vm.limits) { limit in
- LimitCard(limit: limit)
+ VStack(spacing: 0) {
+ HStack {
+ Text(limit.window == .fiveHour ? "5hr Limit" : "7 Day Limit")
+ .font(.system(size: 11, weight: .semibold))
+ .foregroundColor(.secondary)
+ .textCase(.uppercase)
+ Spacer()
+ }
+ .padding(.horizontal, 16)
+ .padding(.top, 10)
+ .padding(.bottom, 4)
+
+ LimitCard(limit: limit)
+ .background(Color(nsColor: .controlBackgroundColor))
+ .cornerRadius(8)
+ .overlay(RoundedRectangle(cornerRadius: 8).stroke(Color.primary.opacity(0.08), lineWidth: 0.5))
+ .padding(.horizontal, 8)
+ }
}
}
- .background(Color.primary.opacity(0.05))
- .padding(.vertical, 1)
+ .padding(.bottom, 4)
// Extra credits row
if let extra = vm.extraUsage, extra.isEnabled {
diff --git a/ClaudeChecker/Info.plist b/ClaudeChecker/Info.plist
index f248adb..7b525b8 100644
--- a/ClaudeChecker/Info.plist
+++ b/ClaudeChecker/Info.plist
@@ -15,9 +15,9 @@
CFBundlePackageType
APPL
CFBundleShortVersionString
- 1.1.0
+ 1.1.1
CFBundleVersion
- 33
+ 34
LSMinimumSystemVersion
13.0
LSUIElement
diff --git a/ClaudeChecker/LoginView.swift b/ClaudeChecker/LoginView.swift
index 2f2b8dc..85616aa 100644
--- a/ClaudeChecker/LoginView.swift
+++ b/ClaudeChecker/LoginView.swift
@@ -24,21 +24,27 @@ struct LoginWebView: NSViewRepresentable {
class Coordinator: NSObject, WKNavigationDelegate {
let onAuthenticated: () -> Void
+ var didAuthenticate = false
init(onAuthenticated: @escaping () -> Void) {
self.onAuthenticated = onAuthenticated
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
+ guard !didAuthenticate else { return }
+ // Don't fire on the login/auth pages themselves
+ if let url = webView.url?.absoluteString,
+ url.contains("/login") || url.contains("/auth") { return }
+
WKWebsiteDataStore.default().httpCookieStore.getAllCookies { cookies in
let hasSession = cookies.contains {
$0.domain.contains("claude.ai") &&
($0.name == "sessionKey" || $0.name == "__Secure-next-auth.session-token")
}
- if hasSession {
- DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
- self.onAuthenticated()
- }
+ guard hasSession, !self.didAuthenticate else { return }
+ self.didAuthenticate = true
+ DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
+ self.onAuthenticated()
}
}
}
@@ -58,9 +64,18 @@ struct LoginSheetView: View {
Text(authenticated ? "✓ Signed in — loading data…" : "Sign in to Claude")
.font(.system(size: 13, weight: .semibold))
Spacer()
- Button("Cancel") { isPresented = false }
- .buttonStyle(.bordered)
+ if authenticated {
+ Button("Done") {
+ isPresented = false
+ onDone()
+ }
+ .buttonStyle(.borderedProminent)
.controlSize(.small)
+ } else {
+ Button("Cancel") { isPresented = false }
+ .buttonStyle(.bordered)
+ .controlSize(.small)
+ }
}
.padding(.horizontal, 14)
.padding(.vertical, 10)
diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md
index 5955024..6451a0f 100644
--- a/RELEASE_NOTES.md
+++ b/RELEASE_NOTES.md
@@ -1,16 +1,7 @@
-## What's new in v1.1.0
+## What's new in v1.1.1
-### Clickable notifications
-Tapping a limit warning or reset notification opens the main window. Tapping an update notification opens the update sheet directly — no need to manually click the menubar icon.
+### Clearer limit labels
+The 5hr and 7 Day usage cards now have clear section headers so it's immediately obvious which limit is which.
-### Update indicator in menubar
-When an update is available, the menubar shows **↑ Update** alongside your usage percentages so you know at a glance without opening the app.
-
-### Release notes render correctly
-The update banner and update sheet now render markdown formatting — headers, **bold text**, and bullet points display properly.
-
-### Update notification improved
-The update popup now reads **"Tap to view release notes & update now!"** making it clear you can read what changed before installing.
-
-### Main window always opens on click
-Closing the app while Settings was open would cause the next click to reopen straight to Settings. The app now always returns to the main window.
+### Login window fix
+The sign-in sheet now reliably closes after a successful login. A **Done** button also appears as a fallback once authentication is detected — no more being stuck with only a Cancel button.