Skip to content

UX changes for notch presentation and DynamicNotchKit pin update#265

Merged
altic-dev merged 12 commits intomainfrom
B/1.5.13-optimized-notch-design
Apr 26, 2026
Merged

UX changes for notch presentation and DynamicNotchKit pin update#265
altic-dev merged 12 commits intomainfrom
B/1.5.13-optimized-notch-design

Conversation

@altic-dev
Copy link
Copy Markdown
Owner

@altic-dev altic-dev commented Apr 10, 2026

Description

UX changes for compact notch presentation, plus a DynamicNotchKit pin update for faster notch opening. Also merges latest main and addresses the Codex review feedback around overlay screen policy, bottom overlay command sync, and processing labels.

Type of Change

  • 🐞 Bug fix (non-breaking change which fixes an issue)
  • ✨ New feature (non-breaking change which adds functionality)
  • 💥 Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • 📝 Documentation update

Related Issues

Testing

  • Tested on Intel Mac
  • Tested on Apple Silicon Mac
  • Tested on macOS 15
  • Ran linter locally: swiftlint --strict --config .swiftlint.yml Sources/
  • Ran formatter locally: swiftformat --config .swiftformat Sources
  • Built locally: sh build_incremental.sh

Notes

  • Updated local release notes for 1.5.13-beta.1; release notes are gitignored.
  • GitHub review threads are addressed in code but not manually resolved.

Screenshots / Video

Add screenshots or video recording of the app after you have made your changes.

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b3cca70d00

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +591 to +592
let resolvedScreen = screen ?? self.preferredPresentationScreen()
self.currentScreenSupportsCompactPresentation = self.supportsCompactPresentation(on: resolvedScreen)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Derive policy from active overlay screen

refreshNotchPresentationPolicy falls back to preferredPresentationScreen() (mouse location) when no screen is provided, and capability getters (for example canShowExpandedCommandOutput) call it on each access. On multi-display setups this causes the policy to flip as the cursor moves between displays with and without compact-notch support, so compact-mode command expansion/actions can be enabled or disabled mid-session even though the overlay is already attached to a specific screen. Bind policy evaluation to the screen used when the notch was shown instead of recomputing from pointer location.

Useful? React with 👍 / 👎.

Comment on lines +561 to +562
private var enableNotchFeatures: Bool {
SettingsStore.shared.overlayPosition == .top || self.supportsCommandNotchUI
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Decouple bottom command sync from notch style

shouldSyncCommandConversationToNotch is gated by enableNotchFeatures, which returns false when overlayPosition is .bottom and compact mode disables command UI. This means a user can select Compact in top mode, switch to bottom overlay, and then lose command conversation syncing/expanded command output entirely because a hidden top-notch style flag is still applied. Bottom overlay command behavior should not depend on the top-notch presentation mode.

Useful? React with 👍 / 👎.

@altic-dev
Copy link
Copy Markdown
Owner Author

@codex review

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: cdb0906cf6

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

private var processingStatusText: String {
let t = self.contentState.transcriptionText.trimmingCharacters(in: .whitespacesAndNewlines)
return t.isEmpty ? self.processingLabel : t
guard Self.transientOverlayStatusTexts.contains(t) else { return self.processingLabel }
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Accept current processing tokens in status matcher

This new strict guard only returns transcriptionText when it exactly matches transientOverlayStatusTexts, but ContentView now writes "Transcribing"/"Refining" (without ellipses). In bottom-overlay dictation flows, "Transcribing" is rejected here and the UI falls back to "Refining...", so users see the wrong processing phase text during final transcription. Include the non-ellipsis variants (or avoid exact-match filtering) so phase labels remain accurate.

Useful? React with 👍 / 👎.

Comment on lines +285 to +287
guard self.shouldSyncCommandNotchState else {
NotchContentState.shared.clearCommandOutput()
return
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve command history when notch sync is temporarily disabled

When sync is disabled by presentation policy, this branch clears all notch command output state. If the user later re-enables standard notch mode, there is no automatic settings-change resync path, so expanded command output remains empty (and cannot open from existing history) until a new message or chat reload occurs. This makes mode toggling appear to lose the current conversation in notch UI.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 395472ea18

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +338 to +343
guard self.shouldShowOrTrackLivePreviewText else {
if !NotchContentState.shared.transcriptionText.isEmpty {
NotchContentState.shared.updateTranscription("")
}
return
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve processing status updates when live preview is off

The new guard drops all updateTranscriptionText writes whenever enableStreamingPreview is false, but dictation stop-flow still relies on these writes ("Transcribing"/"Refining") to drive accurate phase text. In bottom-overlay mode this causes processingStatusText to miss the transient token and fall back to the generic label ("Refining..."), so users with Live Preview disabled see the wrong processing phase during final transcription. Keep phase/status tokens flowing independently from live-preview text suppression.

Useful? React with 👍 / 👎.

@altic-dev altic-dev merged commit 416c234 into main Apr 26, 2026
2 checks passed
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8d66139c43

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

private func showExpandedNotchIfNeeded() {
guard self.enableNotchOutput else { return }
guard self.shouldSyncCommandNotchState else { return }
guard NotchOverlayManager.shared.canShowExpandedCommandOutput else { return }
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Allow bottom overlay to open expanded command output

Fresh evidence in this revision is the new showExpandedNotchIfNeeded guard on canShowExpandedCommandOutput: when a user previously selected Compact notch style and then switches to bottom overlay, this guard prevents expanded command output from opening even though bottom mode still syncs command messages. Because bottom overlay still has no in-place command history surface, command responses become inaccessible until the style is changed back or a different path re-syncs UI state.

Useful? React with 👍 / 👎.

Comment on lines +305 to +309
private static let transientOverlayStatusTexts: Set<String> = [
"Transcribing",
"Refining",
"Thinking",
"Working",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Include reprocessing status in transient token allowlist

The new exact-match status filter excludes "Reprocessing...", but reprocessDictationText still writes that token to the overlay state. In reprocess flows, the matcher rejects it and falls back to the generic processing label, so users see the wrong phase text instead of the explicit reprocessing state.

Useful? React with 👍 / 👎.

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.

[✨ FEATURE] Better Notch Animation

1 participant