- {translate(
- 'auto.components.right.sidebar.edge.peek.tip.title',
- 'Hover the right edge to peek'
- )}
-
- {translate(
- 'auto.components.right.sidebar.edge.peek.tip.settings',
- 'Turn this off in Settings'
- )}
+
{getRightSidebarEdgePeekTipTitle()}
+
+ {getRightSidebarEdgePeekTipSettingsPrefix()}{' '}
+
{/* Tooltip-style caret pointing up at the toggle icon. */}
{
})
})
+describe('tip copy', () => {
+ it('describes the edge gesture and links into Settings', () => {
+ expect(getRightSidebarEdgePeekTipTitle()).toContain('right edge')
+ expect(getRightSidebarEdgePeekSettingsLinkLabel()).toMatch(/Settings/)
+ expect(getRightSidebarEdgePeekSettingsLinkLabel()).toMatch(/Appearance/)
+ expect(getRightSidebarEdgePeekSettingsLinkLabel()).toMatch(/Edge Peek/)
+ })
+})
+
+describe('openRightSidebarEdgePeekSetting', () => {
+ it('opens Appearance with the edge-peek section and seeds search', () => {
+ const openSettingsPage = vi.fn()
+ const openSettingsTarget = vi.fn()
+ const setSettingsSearchQuery = vi.fn()
+ openRightSidebarEdgePeekSetting({
+ openSettingsPage,
+ openSettingsTarget,
+ setSettingsSearchQuery
+ })
+ expect(setSettingsSearchQuery).toHaveBeenCalled()
+ expect(openSettingsTarget).toHaveBeenCalledWith({
+ pane: 'appearance',
+ repoId: null,
+ sectionId: RIGHT_SIDEBAR_EDGE_PEEK_SETTING_ID
+ })
+ expect(openSettingsPage).toHaveBeenCalled()
+ })
+})
+
describe('RIGHT_SIDEBAR_EDGE_PEEK_TIP_VISIBLE_MS', () => {
it('stays brief (tooltip-length, not toast-length)', () => {
- expect(RIGHT_SIDEBAR_EDGE_PEEK_TIP_VISIBLE_MS).toBe(1000)
+ expect(RIGHT_SIDEBAR_EDGE_PEEK_TIP_VISIBLE_MS).toBeLessThanOrEqual(3000)
+ expect(RIGHT_SIDEBAR_EDGE_PEEK_TIP_VISIBLE_MS).toBeGreaterThanOrEqual(1000)
})
})
diff --git a/src/renderer/src/components/right-sidebar/right-sidebar-edge-peek-tip.ts b/src/renderer/src/components/right-sidebar/right-sidebar-edge-peek-tip.ts
index d3bcc42f734..070ad6df51d 100644
--- a/src/renderer/src/components/right-sidebar/right-sidebar-edge-peek-tip.ts
+++ b/src/renderer/src/components/right-sidebar/right-sidebar-edge-peek-tip.ts
@@ -1,11 +1,18 @@
import type { GlobalSettings } from '../../../../shared/types'
+import { translate } from '@/i18n/i18n'
+import {
+ getRightSidebarEdgePeekEntry,
+ RIGHT_SIDEBAR_EDGE_PEEK_SETTING_ID
+} from '@/components/settings/appearance-sidebar-search'
import {
isRightSidebarEdgePeekEnabled,
isRightSidebarEdgePeekTipDismissed
} from './right-sidebar-edge-peek-preference'
-/** How long the one-shot edge-peek hint stays visible. */
-export const RIGHT_SIDEBAR_EDGE_PEEK_TIP_VISIBLE_MS = 1000
+/** How long the one-shot edge-peek hint stays visible (long enough to read). */
+export const RIGHT_SIDEBAR_EDGE_PEEK_TIP_VISIBLE_MS = 2500
+
+export { RIGHT_SIDEBAR_EDGE_PEEK_SETTING_ID }
type TipSettings = Pick<
GlobalSettings,
@@ -23,3 +30,42 @@ export function markRightSidebarEdgePeekTipDismissed(args: {
() => {}
)
}
+
+export function getRightSidebarEdgePeekTipTitle(): string {
+ // Why: new key so older locale catalog rows for the short "to peek" title
+ // don't override this longer, more specific copy.
+ return translate(
+ 'auto.components.right.sidebar.edge.peek.tip.titleLong',
+ 'Hover over the right edge of the screen to quickly show this sidebar.'
+ )
+}
+
+export function getRightSidebarEdgePeekTipSettingsPrefix(): string {
+ return translate('auto.components.right.sidebar.edge.peek.tip.settingsPrefix', 'Turn this off in')
+}
+
+/** Clickable Settings breadcrumb for the edge-peek control. */
+export function getRightSidebarEdgePeekSettingsLinkLabel(): string {
+ return translate(
+ 'auto.components.right.sidebar.edge.peek.tip.settingsLink',
+ 'Settings › Appearance › {{value0}}',
+ { value0: getRightSidebarEdgePeekEntry().title }
+ )
+}
+
+/** Opens Appearance and scrolls/highlights the edge-peek switch. */
+export function openRightSidebarEdgePeekSetting(args: {
+ openSettingsPage: () => void
+ openSettingsTarget: (target: { pane: 'appearance'; repoId: null; sectionId: string }) => void
+ setSettingsSearchQuery: (query: string) => void
+}): void {
+ // Why: seed search so Appearance's Advanced disclosure force-opens (the switch
+ // lives under Advanced and is unmounted when collapsed).
+ args.setSettingsSearchQuery(getRightSidebarEdgePeekEntry().title)
+ args.openSettingsTarget({
+ pane: 'appearance',
+ repoId: null,
+ sectionId: RIGHT_SIDEBAR_EDGE_PEEK_SETTING_ID
+ })
+ args.openSettingsPage()
+}
diff --git a/src/renderer/src/components/settings/AppearanceWindowSidebarSection.tsx b/src/renderer/src/components/settings/AppearanceWindowSidebarSection.tsx
index c893d930bf0..6402322e93b 100644
--- a/src/renderer/src/components/settings/AppearanceWindowSidebarSection.tsx
+++ b/src/renderer/src/components/settings/AppearanceWindowSidebarSection.tsx
@@ -23,7 +23,8 @@ import { LeftSidebarAppearanceSetting } from './LeftSidebarAppearanceSetting'
import {
getLeftSidebarAppearanceEntry,
getRightSidebarEdgePeekEntry,
- getWorkspaceCardLayoutEntry
+ getWorkspaceCardLayoutEntry,
+ RIGHT_SIDEBAR_EDGE_PEEK_SETTING_ID
} from './appearance-sidebar-search'
import { isRightSidebarEdgePeekEnabled } from '../right-sidebar/right-sidebar-edge-peek-preference'
import { translate } from '@/i18n/i18n'
@@ -248,21 +249,23 @@ export function AppearanceWindowSidebarSection({
/>
-
-
+
- updateSettings({ rightSidebarEdgePeekEnabled: !edgePeekEnabled })
- }
- ariaLabel={rightSidebarEdgePeekEntry.title}
- />
-
+ keywords={rightSidebarEdgePeekEntry.keywords}
+ >
+
+ updateSettings({ rightSidebarEdgePeekEnabled: !edgePeekEnabled })
+ }
+ ariaLabel={rightSidebarEdgePeekEntry.title}
+ />
+
+