Skip to content

Artifactory: the composer is a sheet; the board sits at the foot of the rail - #236

Merged
scgopi merged 1 commit into
mainfrom
fix/artifactory-composer-sheet
Sep 1, 2026
Merged

Artifactory: the composer is a sheet; the board sits at the foot of the rail#236
scgopi merged 1 commit into
mainfrom
fix/artifactory-composer-sheet

Conversation

@scgopi

@scgopi scgopi commented Sep 1, 2026

Copy link
Copy Markdown
Owner

Follow-up to #235. Reported: Leave a note still does not take the keyboard, and the board sits at the top of the rail when it should be at the bottom.

The focus fix in #235 was aimed at the wrong thing

It assumed @FocusState was being written too early. It was — but fixing the timing changed nothing, because the write can never land at all. While a loop is open, Ghostty's NSView holds the window's first responder, and SwiftUI's focus system cannot take first responder off an AppKit view inside the same window. The caret never arrives, every keystroke goes to the terminal, the draft stays empty.

The evidence was in the codebase the whole time: every text field that works in this app is in a sheet. JumpPaletteView focuses with a bare onAppear because a sheet's own window is key, and AppView says in as many words that ⌘K has to open over a terminal. The rail was documented read-only; I put the first inline field into it and found out why.

Changes

  • The composer is a sheet — the same 420pt form the rename and workspace prompts use: a Form, ⎋ to cancel, ⌘↵ to post, byte counter as the bound approaches. Leave a note in the rail opens it.
  • The section moves to the foot of the rail, under the spacer, so slack collects above it rather than inside it. Low and against the footer is where a message board belongs — newest at the bottom, composer under it.

Verification

Suite 1482 tests / 153 suites pass; swiftlint 0 errors, swift-format --strict clean.

⚠️ Still needs a human to click once — no GUI automation here — but this time the mechanism is the one every other text entry in the app already relies on.

🤖 Generated with Claude Code

https://claude.ai/code/session_019A6NULwEiBXEdRXwEKKcRH

…he rail

Reported, after #235: "Leave a note" still does not take the keyboard, and the
board sits at the top of the rail when it should be at the bottom.

The focus fix in #235 was aimed at the wrong thing. It assumed `@FocusState`
was being written too early; it was, but fixing the timing changed nothing,
because the write can never land at all. While a loop is open Ghostty's
`NSView` holds the window's first responder, and SwiftUI's focus system cannot
take first responder off an AppKit view inside the same window — the caret
never arrives, every keystroke goes to the terminal, the draft stays empty.
The evidence was in the codebase the whole time: every text field that works
in this app is in a sheet, `JumpPaletteView` focuses with a bare `onAppear`
because a sheet's own window is key, and `AppView` says in as many words that
⌘K has to open over a terminal. The rail was documented read-only; I put the
first inline field into it and found out why.

- The composer is now a sheet — the same 420pt form the rename and workspace
  prompts use, with a Form, ⎋ to cancel, ⌘↵ to post, and the byte counter as
  the bound approaches. "Leave a note" in the rail opens it.
- The section moves from above THIS LOOP to the foot of the rail, under the
  spacer, so slack collects above it rather than inside it. Low and against
  the footer is where a message board belongs — newest at the bottom, composer
  under it.

Suite: 1482 tests / 153 suites pass; swiftlint 0 errors, format clean. Still
needs a human to click once — no GUI automation here — but this time the
mechanism is the one every other text entry in the app already relies on.

Signed-off-by: scgopi <scgopireddy@gmail.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019A6NULwEiBXEdRXwEKKcRH
@scgopi
scgopi merged commit 1ccd18b into main Sep 1, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant