Remember previous location (Preferences): persists collection +
document chain (or Home) to UserDefaults on every navigation change,
gated on the preference. Restored once per launch by resolving the
stored IDs back through the API, stopping at the first failure
(deleted doc, offline, etc.) rather than aborting the whole restore —
a partial chain beats falling all the way back to Home. Cleared on
sign-out so switching accounts can't restore a stale location.
Command Palette (new Settings → Editor section, not synced to
Outline): ⌘K opens a floating overlay, arrow-key/click navigation,
Enter or click to select. Always searches locally, never a
per-keystroke network request:
- Lightweight (default): live listCollections + listViewedDocuments
fetch once on open.
- Full Workspace (opt-in, requires Full Local Sync on): reads
CachingOutlineAPIClient's local cache directly — zero network calls,
includes nested sub-documents now that Full Local Sync actually
caches them (see the paired OutlineKit commit).
Fixed through live testing, in order found:
- Focus: the search field wasn't reliably first responder the instant
⌘K opened it (also the likely source of several AppKit
CA-transaction console warnings) — added a short delay before
focusing.
- Full Workspace "no results": was sequential one-collection-at-a-time
fetching before the cache-read redesign: withTaskGroup made it
concurrent, and reading from the cache instead of the network made
it moot.
- Arrow keys not moving selection: .onKeyPress was on the outer card,
but the focused TextField swallowed the events before they could
bubble up. Moved the handlers directly onto the TextField.
- Search ranking: exact-phrase-only matching meant a title like "Test
Plan Document" never matched a "test document" query at all
(filtered out, not just ranked low), making it look like collections
always won. Added a fallback tier: every word of a multi-word query
present anywhere in the title still matches, ranked below
exact/prefix/substring hits.
- foregroundStyle(.secondary vs .orange) ternary: HierarchicalShapeStyle
vs Color type mismatch, fixed with AnyShapeStyle on both branches.