Skip to content

Add fn as a trigger key; rebuild ready screen and Settings on grouped Forms - #209

Merged
alexkroman merged 7 commits into
mainfrom
fn-trigger-and-form-redesign
Sep 29, 2026
Merged

alexkroman merged 7 commits into
mainfrom
fn-trigger-and-form-redesign

Conversation

@alexkroman

Copy link
Copy Markdown
Collaborator

Summary

  • fn trigger key. TriggerKey.function uses keycode 63 and the secondary-fn device bit. The new engine type GlobeKeyOverride sets macOS's "Press 🌐 key to" setting to Do Nothing while fn is bound, so pressing fn no longer opens the emoji picker, switches input source or starts Apple Dictation as well. Binding any other key restores the previous value. That saved value is stored outside DefaultsKey on purpose, so a settings reset doesn't erase it. The tap stays listen-only.
  • Ready screen. It is now a grouped Form, like the Settings panes:
    • a Shortcut row with a keycap that lights up while the key is down, plus the activation mode or live phase
    • a Style pop-up (⌘1–⌘5, "Edit Styles…")
    • Recent rows, with a prompt for the first dictation when the list is empty
    • a footer bar with "Powered by AssemblyAI · Report a bug"; the LinkedIn share moved to the Help menu
    • the CardFill/CardBorder colors are gone
  • Settings. The tabs are now General / Styles / Vocabulary / Advanced. The Developer section moved under Advanced.
  • Docs. AGENTS.md, README.md and the engine README are updated to match.

Also includes 133578e, the revert of "Speak all punctuation" (#207). It was on the branch this work started from and isn't on main yet.

Test plan

  • scripts/check.sh: engine tests (698), app build, lint and periphery all pass locally
  • UI suite and leak scan (CI)
  • Manual: bind fn and confirm the 🌐 action no longer fires; switch back to right ⌘ and confirm System Settings shows the original value

🤖 Generated with Claude Code

alexkroman-assembly and others added 2 commits September 29, 2026 07:56
This reverts commit 6d0ba47.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…uped Forms

- TriggerKey gains `fn` (keycode 63, secondary-fn device bit). GlobeKeyOverride
  sets "Press 🌐 key to" (com.apple.HIToolbox AppleFnUsageType) to Do Nothing
  while fn is bound and restores the replaced value on rebind, since the
  listen-only tap can't swallow the press.
- ReadyView moves to a grouped Form: a Shortcut row with a keycap that lights
  while the key is down, a Style pop-up (⌘1–⌘5, "Edit Styles…"), and a Recent
  section; drops the hand-drawn card colors.
- Settings splits into General / Styles / Vocabulary / Advanced; the Developer
  section now lives under Advanced.
- TriggerActivation gains startVerb/finishHint for the UI copy.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
alexkroman-assembly and others added 2 commits September 29, 2026 09:47
- Migrate a keycode 63 saved before fn was removed (#146) to right ⌘,
  once, so restoring fn doesn't silently rebind users and disable 🌐.
- Keep GlobeKeyOverride's replaced-value record in a suite both builds
  share, so Blurt and Blurt Dev can't restore each other to Do Nothing;
  no-op instead of falling back to .standard if a domain won't open.
- reset-install.sh restores the 🌐 setting from that record before
  wiping the host domains.
- Shortcut footer says the override lands at the next log-in and links
  to Keyboard Settings, which applies it now.
- Clear a stale Text Shortcuts selection however the row was deleted.
- Rename reservedHeight's separatorThickness to rowSpacing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The prompt is one combined accessibility element, and on macOS its
static-text trait doesn't make it an AXStaticText, so querying
staticTexts never matched and both ReadyViewUITests empty-state
assertions failed. Match on any descendant, as recentRow already does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
alexkroman-assembly and others added 2 commits September 29, 2026 10:25
a737f76's guess was wrong: the prompt is one combined element, and
macOS doesn't expose its accessibilityLabel as the XCUIElement label, so
no label predicate matches it whatever the element type. Give it a
stable identifier in UITestIdentifiers and look it up by that, as the
ready screen's other test-addressed elements are. Reproduced locally:
the label lookup fails exactly as on CI, the identifier lookup passes,
and the full BlurtUITests suite (28 tests) is green.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
xcodegen names the local package reference after the checkout's
directory, so generating in /tmp/blurt-fn rewrote the 'blurt' entry.
No project.yml change; this puts the file back to match CI's checkout.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@alexkroman
alexkroman added this pull request to the merge queue Sep 29, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Sep 29, 2026
…edesign

# Conflicts:
#	App/Blurt/Blurt/Wizard/DeveloperSection.swift
#	App/Blurt/Blurt/Wizard/SettingsWindowRoot.swift
#	App/Blurt/Blurt/Wizard/TextShortcutsSection.swift
@alexkroman
alexkroman added this pull request to the merge queue Sep 29, 2026
Merged via the queue into main with commit c2b1384 Sep 29, 2026
10 checks passed
@alexkroman
alexkroman deleted the fn-trigger-and-form-redesign branch September 29, 2026 19:00
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.

2 participants