Monorepo for Aesthetic.Computer aesthetic.computer
4
fork

Configure Feed

Select the types of activity you want to include in your feed.

slab/menuband: tighter popover — arrows flank octave, MIDI inline, borderless Quit

Octave: chevron-arrows now sit on EITHER side of the big monospaced
number (was both on the right). Reads as a "step left / right" widget.

MIDI: switch dropped from its own row → inline in the title row, after
the octave arrows. Tiny "MIDI" caption + the switch. Saves a whole row
of vertical space; kills the "Routes via virtual port" sublabel.

Quit: bottom-right, borderless (bezelStyle .inline + isBordered =
false), red text only, just says "Quit". Pushed right via a leading
spacer in its row.

Site:
- Bump download cache-buster query string to ?v=5ca1a46.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

+34 -39
+33 -38
slab/menuband/Sources/MenuBand/MenuBandPopover.swift
··· 155 155 rightArrow.target = self 156 156 rightArrow.action = #selector(octaveUp) 157 157 158 - let octaveArrows = NSStackView(views: [leftArrow, rightArrow]) 159 - octaveArrows.orientation = .horizontal 160 - octaveArrows.spacing = 1 161 - 158 + // Arrows flank the number — left arrow, then big number, then 159 + // right arrow. Reads naturally as a "step left / right" widget. 160 + titleRow.addArrangedSubview(leftArrow) 162 161 titleRow.addArrangedSubview(octaveLabel) 163 - titleRow.addArrangedSubview(octaveArrows) 162 + titleRow.addArrangedSubview(rightArrow) 164 163 titleRow.addArrangedSubview(octaveStepper) // hidden, here for layout-time only 164 + 165 + // MIDI toggle — tucked into the title row instead of its own panel. 166 + // Tiny label + switch, no spacer between (sits flush right of the 167 + // octave arrows so the row stays compact). 168 + midiSwitch = NSSwitch() 169 + midiSwitch.target = self 170 + midiSwitch.action = #selector(midiSwitchToggled(_:)) 171 + let midiInlineLabel = NSTextField(labelWithString: "MIDI") 172 + midiInlineLabel.font = NSFont.systemFont(ofSize: 10, weight: .semibold) 173 + midiInlineLabel.textColor = .secondaryLabelColor 174 + titleRow.setCustomSpacing(12, after: rightArrow) 175 + titleRow.addArrangedSubview(midiInlineLabel) 176 + titleRow.addArrangedSubview(midiSwitch) 177 + 165 178 stack.addArrangedSubview(titleRow) 166 179 titleRow.widthAnchor.constraint(equalTo: stack.widthAnchor, 167 180 constant: -24).isActive = true ··· 244 257 245 258 stack.addArrangedSubview(makeSeparator()) 246 259 247 - // MIDI switch — single-line, just "MIDI" + the switch. 248 - midiSwitch = NSSwitch() 249 - midiSwitch.target = self 250 - midiSwitch.action = #selector(midiSwitchToggled(_:)) 251 - let midiRow = NSStackView() 252 - midiRow.orientation = .horizontal 253 - midiRow.alignment = .centerY 254 - midiRow.spacing = 8 255 - midiRow.distribution = .fill 256 - let midiLabel = NSTextField(labelWithString: "MIDI") 257 - midiLabel.font = NSFont.systemFont(ofSize: 12, weight: .semibold) 258 - midiLabel.textColor = .labelColor 259 - let midiSpacer = NSView() 260 - midiSpacer.setContentHuggingPriority(.defaultLow, for: .horizontal) 261 - midiRow.addArrangedSubview(midiLabel) 262 - midiRow.addArrangedSubview(midiSpacer) 263 - midiRow.addArrangedSubview(midiSwitch) 264 - stack.addArrangedSubview(midiRow) 265 - midiRow.widthAnchor.constraint(equalTo: stack.widthAnchor, constant: -24).isActive = true 260 + // (MIDI switch lives in the title row above — see octave + MIDI block.) 266 261 267 262 // MIDI self-test status — populated by the controller after each 268 263 // toggle-on. Empty when MIDI is off. ··· 368 363 aboutCrashRow.addArrangedSubview(crashCol) 369 364 stack.addArrangedSubview(aboutCrashRow) 370 365 371 - stack.addArrangedSubview(makeSeparator()) 372 - 373 - // Quit — red stop button so it's visually distinct from the 374 - // toggles/links above. 366 + // Quit — small, borderless, bottom-right. Red text only. 375 367 let quit = NSButton() 376 - quit.title = "Quit Menu Band" 377 - quit.image = NSImage(systemSymbolName: "stop.circle.fill", 378 - accessibilityDescription: "Quit") 379 - quit.imagePosition = .imageLeading 380 - quit.bezelStyle = .recessed 368 + quit.bezelStyle = .inline 369 + quit.isBordered = false 381 370 quit.controlSize = .small 382 - quit.contentTintColor = NSColor.systemRed 383 371 quit.target = self 384 372 quit.action = #selector(quitApp) 385 - let quitTitle = NSAttributedString( 386 - string: "Quit Menu Band", 373 + quit.attributedTitle = NSAttributedString( 374 + string: "Quit", 387 375 attributes: [ 388 376 .foregroundColor: NSColor.systemRed, 389 377 .font: NSFont.systemFont(ofSize: 11, weight: .semibold), 390 378 ] 391 379 ) 392 - quit.attributedTitle = quitTitle 393 - stack.addArrangedSubview(quit) 380 + let quitRow = NSStackView() 381 + quitRow.orientation = .horizontal 382 + let quitSpacer = NSView() 383 + quitSpacer.setContentHuggingPriority(.defaultLow, for: .horizontal) 384 + quitRow.addArrangedSubview(quitSpacer) 385 + quitRow.addArrangedSubview(quit) 386 + stack.addArrangedSubview(quitRow) 387 + quitRow.widthAnchor.constraint(equalTo: stack.widthAnchor, 388 + constant: -24).isActive = true 394 389 395 390 NSLayoutConstraint.activate([ 396 391 stack.leadingAnchor.constraint(equalTo: root.leadingAnchor),
+1 -1
system/public/menuband/index.html
··· 879 879 <p class="tagline">Built-in macOS instruments, in the menu bar.</p> 880 880 881 881 <div class="button-row"> 882 - <a class="aqua" href="https://assets.aesthetic.computer/menuband/Menu-Band-0.1.dmg?v=eb9687b" download> 882 + <a class="aqua" href="https://assets.aesthetic.computer/menuband/Menu-Band-0.1.dmg?v=5ca1a46" download> 883 883 Download 884 884 <small>0.1 · Apple Silicon · 1.1 MB</small> 885 885 </a>