Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 8 additions & 15 deletions Sources/CodexBar/MenuCardView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -166,8 +166,8 @@ struct UsageMenuCardView: View {
}
}
.padding(.horizontal, 16)
.padding(.top, 2)
.padding(.bottom, 2)
.padding(.top, 8)
.padding(.bottom, 6)
.frame(width: self.width, alignment: .leading)
}

Expand Down Expand Up @@ -363,21 +363,14 @@ private struct MetricRow: View {

struct UsageMenuCardHeaderSectionView: View {
let model: UsageMenuCardView.Model
let showDivider: Bool
let width: CGFloat

var body: some View {
VStack(alignment: .leading, spacing: 6) {
UsageMenuCardHeaderView(model: self.model)

if self.showDivider {
Divider()
}
}
.padding(.horizontal, 16)
.padding(.top, 2)
.padding(.bottom, self.model.subtitleStyle == .error ? 2 : 0)
.frame(width: self.width, alignment: .leading)
UsageMenuCardHeaderView(model: self.model)
.padding(.horizontal, 16)
.padding(.top, 8)
.padding(.bottom, 8)
.frame(width: self.width, alignment: .leading)
}
}

Expand Down Expand Up @@ -408,7 +401,7 @@ struct UsageMenuCardUsageSectionView: View {
}
}
.padding(.horizontal, 16)
.padding(.top, 10)
.padding(.top, 8)
.padding(.bottom, self.bottomPadding)
.frame(width: self.width, alignment: .leading)
}
Expand Down
56 changes: 24 additions & 32 deletions Sources/CodexBar/StatusItemController+Menu.swift
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,6 @@ extension StatusItemController {
UsageMenuCardView(model: model, width: context.menuWidth),
id: "menuCard",
width: context.menuWidth))
menu.addItem(.separator())
} else {
for (index, model) in cards.enumerated() {
menu.addItem(self.makeMenuCardItem(
Expand All @@ -303,9 +302,6 @@ extension StatusItemController {
menu.addItem(.separator())
}
}
if !cards.isEmpty {
menu.addItem(.separator())
}
}
return false
}
Expand All @@ -332,7 +328,6 @@ extension StatusItemController {
if context.currentProvider == .codex, model.creditsText != nil {
menu.addItem(self.makeBuyCreditsItem())
}
menu.addItem(.separator())
return false
}

Expand All @@ -355,7 +350,6 @@ extension StatusItemController {
_ = self.addCostHistorySubmenu(to: menu, provider: currentProvider)
}
}
menu.addItem(.separator())
}

private func addActionableSections(_ sections: [MenuDescriptor.Section], to menu: NSMenu) {
Expand All @@ -366,6 +360,9 @@ extension StatusItemController {
}
}
for (index, section) in actionableSections.enumerated() {
// Add a separator before each section group with a spacer for consistent padding
menu.addItem(.separator())
self.addMenuSpacer(to: menu, height: 4)
for entry in section.entries {
switch entry {
case let .text(text, style):
Expand Down Expand Up @@ -404,12 +401,19 @@ extension StatusItemController {
menu.addItem(.separator())
}
}
if index < actionableSections.count - 1 {
menu.addItem(.separator())
}
// Add trailing spacer after each section group for consistent padding
self.addMenuSpacer(to: menu, height: 4)
}
}

private func addMenuSpacer(to menu: NSMenu, height: CGFloat) {
let spacerView = NSView(frame: NSRect(x: 0, y: 0, width: 1, height: height))
let spacerItem = NSMenuItem()
spacerItem.view = spacerView
spacerItem.isEnabled = false
menu.addItem(spacerItem)
}

func makeMenu(for provider: UsageProvider?) -> NSMenu {
let menu = NSMenu()
menu.autoenablesItems = false
Expand Down Expand Up @@ -658,22 +662,20 @@ extension StatusItemController {
let hasCredits = model.creditsText != nil
let hasExtraUsage = model.providerCost != nil
let hasCost = model.tokenUsage != nil
let bottomPadding = CGFloat(hasCredits ? 4 : 6)
let sectionSpacing = CGFloat(6)
let usageBottomPadding = bottomPadding
let creditsBottomPadding = bottomPadding
let sectionPadding = CGFloat(6)
let sectionSpacing = CGFloat(8)

let headerView = UsageMenuCardHeaderSectionView(
model: model,
showDivider: hasUsageBlock,
width: width)
menu.addItem(self.makeMenuCardItem(headerView, id: "menuCardHeader", width: width))

if hasUsageBlock {
menu.addItem(.separator())
let usageView = UsageMenuCardUsageSectionView(
model: model,
showBottomDivider: false,
bottomPadding: usageBottomPadding,
bottomPadding: sectionPadding,
width: width)
let usageSubmenu = self.makeUsageSubmenu(
provider: provider,
Expand All @@ -686,19 +688,13 @@ extension StatusItemController {
submenu: usageSubmenu))
}

if hasCredits || hasExtraUsage || hasCost {
menu.addItem(.separator())
}

if hasCredits {
if hasExtraUsage || hasCost {
menu.addItem(.separator())
}
menu.addItem(.separator())
let creditsView = UsageMenuCardCreditsSectionView(
model: model,
showBottomDivider: false,
topPadding: sectionSpacing,
bottomPadding: creditsBottomPadding,
bottomPadding: sectionPadding,
width: width)
let creditsSubmenu = webItems.hasCreditsHistory ? self.makeCreditsHistorySubmenu() : nil
menu.addItem(self.makeMenuCardItem(
Expand All @@ -711,27 +707,23 @@ extension StatusItemController {
}
}
if hasExtraUsage {
if hasCredits {
menu.addItem(.separator())
}
menu.addItem(.separator())
let extraUsageView = UsageMenuCardExtraUsageSectionView(
model: model,
topPadding: sectionSpacing,
bottomPadding: bottomPadding,
bottomPadding: sectionPadding,
width: width)
menu.addItem(self.makeMenuCardItem(
extraUsageView,
id: "menuCardExtraUsage",
width: width))
}
if hasCost {
if hasCredits || hasExtraUsage {
menu.addItem(.separator())
}
menu.addItem(.separator())
let costView = UsageMenuCardCostSectionView(
model: model,
topPadding: sectionSpacing,
bottomPadding: bottomPadding,
bottomPadding: sectionPadding,
width: width)
let costSubmenu = webItems.hasCostHistory ? self.makeCostHistorySubmenu(provider: provider) : nil
menu.addItem(self.makeMenuCardItem(
Expand Down Expand Up @@ -891,7 +883,7 @@ extension StatusItemController {
RoundedRectangle(cornerRadius: 6, style: .continuous)
.fill(MenuHighlightStyle.selectionBackground(true))
.padding(.horizontal, 6)
.padding(.vertical, 2)
.padding(.vertical, 1)
}
}
.overlay(alignment: .topTrailing) {
Expand Down