diff --git a/.gitignore b/.gitignore index 66c0304..373ba35 100644 --- a/.gitignore +++ b/.gitignore @@ -63,7 +63,7 @@ fastlane/test_output # macOS .DS_Store +.claude # Build output build/ - diff --git a/PortBar/Core/Settings.swift b/PortBar/Core/Settings.swift index ce8ba3f..4a4e7f7 100644 --- a/PortBar/Core/Settings.swift +++ b/PortBar/Core/Settings.swift @@ -7,19 +7,22 @@ final class PortBarSettings: ObservableObject { private init() {} // Popover size — user-resizable via the footer grip, persisted across launches. - static let widthRange: ClosedRange = 460...1000 + // Lower bound must fit every column or rows overflow and get clipped. + static let widthRange: ClosedRange = 600...1100 static let heightRange: ClosedRange = 240...760 @Published var popoverWidth: CGFloat = { let v = CGFloat(UserDefaults.standard.double(forKey: "pb.popoverWidth")) - return v > 0 ? v : 520 + let d = v > 0 ? v : 600 + return min(max(d, widthRange.lowerBound), widthRange.upperBound) }() { didSet { UserDefaults.standard.set(Double(popoverWidth), forKey: "pb.popoverWidth") } } @Published var popoverListHeight: CGFloat = { let v = CGFloat(UserDefaults.standard.double(forKey: "pb.popoverListHeight")) - return v > 0 ? v : 400 + let d = v > 0 ? v : 400 + return min(max(d, heightRange.lowerBound), heightRange.upperBound) }() { didSet { UserDefaults.standard.set(Double(popoverListHeight), forKey: "pb.popoverListHeight") } } diff --git a/PortBar/UI/PortListPopoverView.swift b/PortBar/UI/PortListPopoverView.swift index e269253..40aac86 100644 --- a/PortBar/UI/PortListPopoverView.swift +++ b/PortBar/UI/PortListPopoverView.swift @@ -207,7 +207,8 @@ struct PortListPopoverView: View { } .font(.caption.weight(.semibold)) .foregroundStyle(Color.secondary) - .padding(.horizontal, 14) + .padding(.leading, 14) + .padding(.trailing, 26) // match row gutter so columns stay aligned .padding(.vertical, 5) .background(Color(NSColor.controlBackgroundColor)) } @@ -376,7 +377,8 @@ struct PortPopoverRow: View { } .frame(width: 104, alignment: .trailing) } - .padding(.horizontal, 14) + .padding(.leading, 14) + .padding(.trailing, 26) // clear the scroll bar gutter so ✕ isn't covered .padding(.vertical, 6) .background(hovered ? Color(NSColor.selectedContentBackgroundColor).opacity(0.1) : Color.clear) .onHover { hovered = $0 } diff --git a/README.md b/README.md index 717dac3..64c35b9 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,10 @@ A native macOS menu bar app that shows every active listening port on your machi Click the icon → a panel drops down listing all your ports. Kill a runaway process, open it in the browser, or copy the port — all without touching the terminal. +

+ PortBar popover showing active ports with process, project, uptime, LAN-exposure marker and action buttons +

+ --- ## Features diff --git a/docs/img/portbar.png b/docs/img/portbar.png new file mode 100644 index 0000000..2abb7b5 Binary files /dev/null and b/docs/img/portbar.png differ