Skip to content

feat(settings): deep links into Settings panes (WW-53) - #469

Merged
nathanialhenniges merged 1 commit into
mainfrom
claude/deep-links-settings-panes-9111ad
Sep 1, 2026
Merged

feat(settings): deep links into Settings panes (WW-53)#469
nathanialhenniges merged 1 commit into
mainfrom
claude/deep-links-settings-panes-9111ad

Conversation

@nathanialhenniges

@nathanialhenniges nathanialhenniges commented Sep 1, 2026

Copy link
Copy Markdown
Member

Closes WW-53.

What

wolfwave://settings/<pane>[/<section>] opens Settings at a named pane, scrolls to the tagged card, and flashes it with an accent ring. Works whether Settings is closed or already open on another pane. Anything unknown falls back to the General pane; an unknown section on a known pane keeps the pane and skips the scroll.

  • wolfwave scheme registered in Info.plist (CFBundleURLTypes), received in AppDelegate.application(_:open:).
  • Core/SettingsDeepLink.swift: pure nonisolated parser + urlString inverse. Pane ids are new stable kebab-case SettingsSection.slug values, never the visible titles. Section slugs restricted to [a-z0-9-]+.
  • Core/SettingsNavigation.swift: @MainActor @Observable hand-off (pending / highlighted) consumed by SettingsView; one ScrollViewReader reaches every pane, including ones that own their own ScrollView. Each new link cancels the previous in-flight scroll task, and highlight expiry lives in SettingsView so a slug with no mounted anchor still clears.
  • Views/Shared/DeepLinkAnchor.swift: .deepLinkSection("slug") scroll target + fading accent ring; 30+ anchors tagged across all panes. Catalog entry added.
  • Removed the old Twitch-only selectedSettingsSection UserDefaults hint (key, Preferences accessors, AppConstants.Twitch/Discord.settingsSection); its two callers now route through navigateSettings(to:). This also fixes pane selection when the window is already open.

Full pane/section table: Settings docs → Deep links (settings.mdx in this PR).

Testing

  • SettingsDeepLinkTests (new): slug stability/uniqueness, round-trips, case + trailing-slash tolerance, every fallback path.
  • Full unit suite run pre-rebase (1364 tests; only the known parallelism flakes in SkipVoteManagerTests etc., all pass in isolation). Post-rebase: build + SettingsDeepLinkTests + AppConstantsTests green.
  • Live-verified on the Dev app: warm delivery, cold launch via URL, fallback to General, on-screen scroll + ring flash.
  • Codex CLI review run; fixes folded in (CFBundleTypeRole, slug-only logging, stale-task cancellation, highlight expiry).

🤖 Generated with Claude Code

wolfwave://settings/<pane>[/<section>] opens Settings at a named pane,
scrolls to the tagged card, and flashes it. Stable kebab-case slugs
(never display titles), safe fallback to General for anything unknown.
Replaces the Twitch-only selectedSettingsSection UserDefaults hint,
which also fixes navigation when the window is already open.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@nathanialhenniges
nathanialhenniges force-pushed the claude/deep-links-settings-panes-9111ad branch from 0e1b9b4 to 52ff56f Compare September 1, 2026 17:32
@nathanialhenniges
nathanialhenniges merged commit 858a17e into main Sep 1, 2026
10 checks passed
nathanialhenniges added a commit that referenced this pull request Sep 2, 2026
wolfwave://settings/<pane>[/<section>] opens Settings at a named pane,
scrolls to the tagged card, and flashes it. Stable kebab-case slugs
(never display titles), safe fallback to General for anything unknown.
Replaces the Twitch-only selectedSettingsSection UserDefaults hint,
which also fixes navigation when the window is already open.
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