Skip to content

macOS 14+ compatibility + Japanese IME input fix#44

Merged
ojowwalker77 merged 3 commits into
release-1.3.0from
claude/zen-wilson-e22d48
Jul 2, 2026
Merged

macOS 14+ compatibility + Japanese IME input fix#44
ojowwalker77 merged 3 commits into
release-1.3.0from
claude/zen-wilson-e22d48

Conversation

@ojowwalker77

Copy link
Copy Markdown
Owner

Lowers the minimum macOS version from 26 (Tahoe) to 14 (Sonoma) and fixes Japanese/CJK text input in the canvas editor. No behavior change on Tahoe.

macOS 14+ compatibility

Tahoe-only APIs were already gated; the audit confirmed there are zero unguarded ones (proven by a clean compile at the lowered target). The real floor is SwiftData @Model (board persistence), which requires macOS 14 — not any Tahoe feature.

  • Deployment target .macOS(.v26).macOS(.v14); MIN_SYSTEM_VERSION 26.014.0 (Info.plist LSMinimumSystemVersion).
  • Apple Intelligence (FoundationModels) stays weak-linked + #available(macOS 26)-gated; Settings shows "Requires macOS 26" instead of a dead control. Liquid Glass keeps its vibrancy fallback.
  • SF Symbols the compiler can't version-check: apple.intelligence and wand.and.sparkles are macOS 15+, so they'd render as missing-glyph boxes on 14. Added Image(systemName:fallback:) (probes the running OS via NSImage(systemSymbolName:)) → falls back to sparkles / wand.and.stars (both macOS 10.15). Verified every symbol string in the app against the on-device SF Symbols availability DB; only these two were above the floor.

Japanese IME input fix

Japanese/Chinese/Korean input composes as marked text before committing. textDidChange fires on every composing keystroke and was:

  • reformatting the text storage (normalizeBodyRuns) over the provisional run — stripping the IME's marked-text styling,
  • opening the @-mention menu on half-composed text — letting it steal the Return that confirms a candidate,
  • serializing text the user could still cancel into the saved board.

Fix: guard the heavy path on tv.hasMarkedText() and defer chip deletion to the input system while composing. Settled text is handled by the commit's final textDidChange.

Verification

  • Clean build at minos 14.0; all 40 tests pass.
  • Confirmed FoundationModels is weak-linked and the staged Info.plist reports LSMinimumSystemVersion 14.0.
  • Wrote a Japanese card to a running board via the loopback canvas API — こんにちは!日本語入力テスト — Japanese IME works 🎉 round-tripped intact.

Not verified: on-device launch on real macOS 14/15 hardware, and keyboard IME composition typed by hand (can't drive the input method from CI). Both warrant a manual smoke test before release.

Lower the deployment target from macOS 26 to macOS 14 — the real floor, set by
SwiftData (@model) in DumpStore, not by any Tahoe feature. Every Tahoe-only
surface is optional and degrades gracefully below 26:

- Apple Intelligence (FoundationModels) is weak-linked and #available-gated;
  Settings shows "Requires macOS 26" rather than a dead control.
- Liquid Glass falls back to a vibrancy surface (already gated).
- apple.intelligence / wand.and.sparkles are macOS 15+ SF Symbols that would
  render as a missing-glyph box on 14 (the compiler can't catch symbol
  strings). A new Image(systemName:fallback:) helper probes the running OS and
  substitutes an always-available glyph (sparkles / wand.and.stars).

Verified against the SF Symbols availability DB and a clean build at
minos 14.0 with all 40 tests passing.
Japanese/Chinese/Korean input composes as marked text before it commits.
textDidChange fires on every keystroke while composing, and it was reformatting
the text storage (normalizeBodyRuns) and opening the @-mention menu over that
provisional text — stripping the IME's marked-text styling, letting the menu
steal the Return that confirms a candidate, and serializing text the user could
still cancel.

Guard the heavy path (normalize, mention scan, serialize, lint) on
tv.hasMarkedText() and defer chip deletion to the input system while composing;
the settled text is handled by the commit's final textDidChange.
@github-actions github-actions Bot added size:M vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. labels Jul 1, 2026
@ojowwalker77 ojowwalker77 changed the base branch from release-1.2.3 to release-1.3.0 July 1, 2026 23:58
@ojowwalker77 ojowwalker77 merged commit e33edae into release-1.3.0 Jul 2, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant