You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat(settings): adds navigation TOC and section grouping (#106)
* feat(settings): add section IDs and reorder into logical groups
- Add optional id prop to Section component for scroll-spy targeting
- Assign stable IDs to all 12 Section usages in SettingsPage
- Reorder sections into 4 logical groups: Data Sources, Display,
Integrations, Account
- Add group heading dividers between groups
- Export SETTINGS_PAGE_SECTION_IDS constant for test sync
- Fix existing tests to use getByRole('heading') for disambiguation
* test(settings): adds SettingsTOC unit tests
* fix(settings): addresses review findings for SettingsTOC
- Replaces Map.groupBy (ES2024) with manual reduce for browser compat
- Promotes displayedActiveId to createMemo
- Adds scrollend listener cleanup on unmount
- Adds aria-current='location' to active TOC items
- Adds aria-label to mobile toggle button
- Increases mobile touch target (btn-sm → btn, full width)
- Bumps mobile dropdown z-index from z-30 to z-40
- Removes redundant 'relative' class on mobile container
- Scopes mobile toggle test query with within()
* docs: adds settings navigation section to user guide
* fix(settings): clears scrollingTo immediately for instant scroll
When prefers-reduced-motion is active, scrollIntoView uses behavior
'instant' which completes synchronously. The scrollend event may not
fire in all browsers for instant scrolls, leaving scrollingTo stuck.
Uses requestAnimationFrame to clear in the next frame instead.
* fix(settings): fixes indentation, reduced-motion gap, adds rAF test
- Fixes closing tag indentation in two-column layout wrapper
- Adds animate-pulse to prefers-reduced-motion override
- Adds test verifying requestAnimationFrame is used for instant scroll
* fix(settings): restores window property mocks in afterEach
Object.defineProperty on window.innerHeight, scrollY, and
scrollHeight leaked between tests. Captures original values
and restores in afterEach to prevent cross-test contamination.
* fix(settings): uses JS-driven smooth scroll for browser compat
Native scrollIntoView({behavior: 'smooth'}) can be overridden by
browser settings (Vivaldi, some Chromium forks disable smooth scroll
at the engine level). Replaces with requestAnimationFrame-driven
eased scroll that works regardless of browser scroll settings.
Still uses scrollIntoView for instant scroll (reduced-motion).
* fix(settings): prevents header oscillation during smooth scroll
The scroll listener that shrinks/expands the header was firing during
programmatic TOC scrolling, causing a feedback loop: scroll crosses
50px threshold → header resizes → content shifts → scroll position
changes → header resizes again. Uses a data-scrollLock attribute to
suppress header state updates during TOC-driven scroll animations.
Dispatches a synthetic scroll event on completion to sync final state.
* fix(settings): adds hysteresis to header scroll threshold
Shrink at scrollY > 50, expand only at scrollY < 10. The 40px dead
zone absorbs the ~32px content shift from header padding change,
preventing the layout feedback loop where header resize triggers
scroll position change which re-triggers header resize.
* fix(settings): updates TOC registry for Dependencies section
Adds 'dependencies' to SETTINGS_SECTIONS (13 entries) to match
upstream's new Dependencies section in SettingsPage.
Copy file name to clipboardExpand all lines: docs/USER_GUIDE.md
+8Lines changed: 8 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -635,6 +635,14 @@ Jira uses rotating refresh tokens — each refresh invalidates the previous toke
635
635
636
636
---
637
637
638
+
## Settings Navigation
639
+
640
+
The Settings page organizes its sections into four groups: **Data Sources** (Orgs & Repos, Tracked Users, Refresh, API Usage), **Display** (Appearance, Tabs, Custom Tabs), **Integrations** (GitHub Actions, Notifications, MCP Relay, Jira), and **Account** (Data).
641
+
642
+
On desktop (1024px+), a sticky sidebar on the left shows a table of contents with all sections grouped and highlighted as you scroll. Click any item to jump to that section. On smaller screens, a dropdown bar appears below the header showing the current section name — tap it to open a section picker.
643
+
644
+
The header shrinks as you scroll to maximize content space.
645
+
638
646
## Settings Reference
639
647
640
648
Settings are saved automatically to `localStorage` and persist across sessions. All settings can be exported as a JSON file via **Settings > Data > Export**.
description="Allow a local MCP server to read dashboard data. Enable this if you use Claude Code or another AI client with the GitHub Tracker MCP server."
871
910
>
@@ -920,7 +959,7 @@ export default function SettingsPage() {
920
959
</Section>
921
960
922
961
{/* Section 11: Jira Cloud Integration */}
923
-
<Sectiontitle="Jira Cloud Integration">
962
+
<Sectionid="jira"title="Jira Cloud Integration">
924
963
<Show
925
964
when={isJiraAuthenticated()}
926
965
fallback={
@@ -1132,8 +1171,8 @@ export default function SettingsPage() {
1132
1171
</Show>
1133
1172
</Section>
1134
1173
1135
-
{/* Dependencies */}
1136
-
<Sectiontitle="Dependencies">
1174
+
{/* Section 12: Dependencies */}
1175
+
<Sectionid="dependencies"title="Dependencies">
1137
1176
<SettingRow
1138
1177
label="Dependencies tab"
1139
1178
description="Auto-show a Dependencies tab when dependency bot PRs are detected"
@@ -1162,8 +1201,10 @@ export default function SettingsPage() {
0 commit comments