feat: add an always-show scrollbars preference

Adds a device-local setting to keep overlay scrollbars visible.
Surfaces the setting in visual settings and settings search.
Updates scrollbar behavior and tests for the new preference.
This commit is contained in:
Bohdan Triapitsyn
2026-09-07 23:16:36 +03:00
parent 7b206b1014
commit 2ec0238e5c
24 changed files with 273 additions and 14 deletions
@@ -1,5 +1,7 @@
import { linearIntegrationI18n } from './linear-integration.i18n';
export const settingsDict = {
'settings.openchamber.visual.field.alwaysShowScrollbars': 'Bildlaufleisten immer anzeigen',
'settings.openchamber.visual.field.alwaysShowScrollbarsHint': 'Bildlaufleisten bleiben sichtbar, damit du sie ohne vorheriges Scrollen ziehen kannst. Gilt nur auf diesem Gerät.',
'settings.providers.page.openCodeGo.title': 'OpenCode Go Nutzungsverfolgung',
'settings.providers.page.openCodeGo.description': 'Verbinden Sie das OpenCode Go Dashboard, um rollierenden, wöchentlichen und monatlichen Verbrauch anzuzeigen.',
'settings.providers.page.openCodeGo.workspaceId': 'Workspace-ID',
@@ -1,5 +1,7 @@
import { linearIntegrationI18n } from './linear-integration.i18n';
export const settingsDict = {
'settings.openchamber.visual.field.alwaysShowScrollbars': 'Always show scrollbars',
'settings.openchamber.visual.field.alwaysShowScrollbarsHint': 'Keep scrollbars visible so you can drag them without scrolling first. Applies on this device only.',
'settings.providers.page.openCodeGo.title': 'OpenCode Go usage tracking',
'settings.providers.page.openCodeGo.description': 'Connect the OpenCode Go dashboard to show rolling, weekly, and monthly quota.',
'settings.providers.page.openCodeGo.workspaceId': 'Workspace ID',
@@ -1,5 +1,7 @@
import { linearIntegrationI18n } from './linear-integration.i18n';
export const settingsDict = {
'settings.openchamber.visual.field.alwaysShowScrollbars': 'Mostrar siempre las barras de desplazamiento',
'settings.openchamber.visual.field.alwaysShowScrollbarsHint': 'Mantén las barras visibles para poder arrastrarlas sin desplazarte primero. Solo se aplica en este dispositivo.',
'settings.providers.page.openCodeGo.title': 'Seguimiento de uso de OpenCode Go',
'settings.providers.page.openCodeGo.description': 'Conecta el panel de OpenCode Go para ver las cuotas móvil, semanal y mensual.',
'settings.providers.page.openCodeGo.workspaceId': 'ID del espacio de trabajo',
@@ -1,5 +1,7 @@
import { linearIntegrationI18n } from './linear-integration.i18n';
export const settingsDict = {
'settings.openchamber.visual.field.alwaysShowScrollbars': 'Toujours afficher les barres de défilement',
'settings.openchamber.visual.field.alwaysShowScrollbarsHint': 'Gardez les barres visibles pour pouvoir les faire glisser sans commencer par faire défiler le contenu. Uniquement sur cet appareil.',
'settings.providers.page.openCodeGo.title': 'Suivi de lutilisation dOpenCode Go',
'settings.providers.page.openCodeGo.description': 'Connectez le tableau de bord OpenCode Go pour afficher les quotas glissant, hebdomadaire et mensuel.',
'settings.providers.page.openCodeGo.workspaceId': 'ID de lespace de travail',
@@ -1,5 +1,7 @@
import { linearIntegrationI18n } from './linear-integration.i18n';
export const settingsDict = {
'settings.openchamber.visual.field.alwaysShowScrollbars': 'スクロールバーを常に表示',
'settings.openchamber.visual.field.alwaysShowScrollbarsHint': 'スクロールバーを常に表示し、先にスクロールしなくてもドラッグできるようにします。このデバイスにのみ適用されます。',
'settings.providers.page.openCodeGo.title': 'OpenCode Go 使用量追跡',
'settings.providers.page.openCodeGo.description': 'OpenCode Go ダッシュボードを接続して、ローリング、週間、月間のクォータを表示します。',
'settings.providers.page.openCodeGo.workspaceId': 'ワークスペース ID',
@@ -1,5 +1,7 @@
import { linearIntegrationI18n } from './linear-integration.i18n';
export const settingsDict = {
'settings.openchamber.visual.field.alwaysShowScrollbars': '스크롤바 항상 표시',
'settings.openchamber.visual.field.alwaysShowScrollbarsHint': '먼저 스크롤하지 않고도 드래그할 수 있도록 스크롤바를 항상 표시합니다. 이 기기에만 적용됩니다.',
'settings.providers.page.openCodeGo.title': 'OpenCode Go 사용량 추적',
'settings.providers.page.openCodeGo.description': 'OpenCode Go 대시보드를 연결하여 롤링, 주간 및 월간 할당량을 표시합니다.',
'settings.providers.page.openCodeGo.workspaceId': '워크스페이스 ID',
@@ -1,5 +1,7 @@
import { linearIntegrationI18n } from './linear-integration.i18n';
export const settingsDict = {
'settings.openchamber.visual.field.alwaysShowScrollbars': 'Zawsze pokazuj paski przewijania',
'settings.openchamber.visual.field.alwaysShowScrollbarsHint': 'Paski przewijania pozostają widoczne, aby można było je przeciągać bez wcześniejszego przewijania. Dotyczy tylko tego urządzenia.',
'settings.providers.page.openCodeGo.title': 'Śledzenie użycia OpenCode Go',
'settings.providers.page.openCodeGo.description': 'Połącz panel OpenCode Go, aby wyświetlać limity kroczące, tygodniowe i miesięczne.',
'settings.providers.page.openCodeGo.workspaceId': 'ID przestrzeni roboczej',
@@ -1,5 +1,7 @@
import { linearIntegrationI18n } from './linear-integration.i18n';
export const settingsDict = {
'settings.openchamber.visual.field.alwaysShowScrollbars': 'Sempre mostrar barras de rolagem',
'settings.openchamber.visual.field.alwaysShowScrollbarsHint': 'Mantenha as barras visíveis para poder arrastá-las sem precisar rolar primeiro. Aplica-se apenas a este dispositivo.',
'settings.providers.page.openCodeGo.title': 'Monitoramento de uso do OpenCode Go',
'settings.providers.page.openCodeGo.description': 'Conecte o painel do OpenCode Go para exibir as cotas móvel, semanal e mensal.',
'settings.providers.page.openCodeGo.workspaceId': 'ID do workspace',
@@ -1,5 +1,7 @@
import { linearIntegrationI18n } from './linear-integration.i18n';
export const settingsDict = {
'settings.openchamber.visual.field.alwaysShowScrollbars': 'Kaydırma çubuklarını her zaman göster',
'settings.openchamber.visual.field.alwaysShowScrollbarsHint': 'Önce kaydırma yapmadan sürükleyebilmeniz için kaydırma çubuklarını görünür tutar. Yalnızca bu cihazda geçerlidir.',
'settings.providers.page.openCodeGo.title': 'OpenCode Go kullanım takibi',
'settings.providers.page.openCodeGo.description': 'Kayan, haftalık ve aylık kotayı göstermek için OpenCode Go kontrol panelini bağlayın.',
'settings.providers.page.openCodeGo.workspaceId': 'Çalışma alanı ID\'si',
@@ -1,5 +1,7 @@
import { linearIntegrationI18n } from './linear-integration.i18n';
export const settingsDict = {
'settings.openchamber.visual.field.alwaysShowScrollbars': 'Завжди показувати смуги прокручування',
'settings.openchamber.visual.field.alwaysShowScrollbarsHint': 'Залишати смуги прокручування видимими, щоб можна було перетягнути повзунок без попереднього прокручування. Лише на цьому пристрої.',
'settings.providers.page.openCodeGo.title': 'Відстеження використання OpenCode Go',
'settings.providers.page.openCodeGo.description': 'Підключіть панель OpenCode Go, щоб бачити ковзну, тижневу та місячну квоту.',
'settings.providers.page.openCodeGo.workspaceId': 'ID робочого простору',
@@ -1,5 +1,7 @@
import { linearIntegrationI18n } from './linear-integration.i18n';
export const settingsDict = {
'settings.openchamber.visual.field.alwaysShowScrollbars': '始终显示滚动条',
'settings.openchamber.visual.field.alwaysShowScrollbarsHint': '保持滚动条可见,无需先滚动即可拖动。仅在此设备上生效。',
'settings.providers.page.openCodeGo.title': 'OpenCode Go 用量跟踪',
'settings.providers.page.openCodeGo.description': '连接 OpenCode Go 控制面板以显示滚动、每周和每月配额。',
'settings.providers.page.openCodeGo.workspaceId': '工作区 ID',
@@ -1,5 +1,7 @@
import { linearIntegrationI18n } from './linear-integration.i18n';
export const settingsDict = {
'settings.openchamber.visual.field.alwaysShowScrollbars': '一律顯示捲軸',
'settings.openchamber.visual.field.alwaysShowScrollbarsHint': '保持捲軸可見,不必先捲動就能拖曳。僅在此裝置上生效。',
'settings.providers.page.openCodeGo.title': 'OpenCode Go 用量追蹤',
'settings.providers.page.openCodeGo.description': '連接 OpenCode Go 控制面板以顯示滾動、每週和每月配額。',
'settings.providers.page.openCodeGo.workspaceId': '工作區 ID',
+1
View File
@@ -544,6 +544,7 @@ export const LOCAL_DEVICE_KEYS = [
'linearIssueListPriority',
'showTerminalQuickKeysOnDesktop',
'dockBadgeEnabled',
'alwaysShowScrollbars',
'agentMemoryViewedAt',
'projectContextSidebarWidth',
] as const;
@@ -17,6 +17,17 @@ const runtimeCtx = {
};
describe('settings search', () => {
test('finds the scrollbar preference on every surface', () => {
for (const context of [runtimeCtx, { ...runtimeCtx, isDesktop: true }, { ...runtimeCtx, isVSCode: true }, { ...runtimeCtx, isMobile: true }]) {
const results = buildSettingsSearchResults({
query: 'scrollbar',
runtimeCtx: context,
t,
getPageTitle: (page) => page,
});
expect(results.find((result) => result.id === 'appearance.scrollbars')?.page).toBe('appearance');
}
});
test('finds Linear connect on the integrations page', () => {
const results = buildSettingsSearchResults({
query: 'linear',
+7
View File
@@ -75,6 +75,13 @@ const SETTINGS_SEARCH_ITEMS: readonly SettingsSearchItem[] = [
// Electron shell (isMac already implies isDesktopShell), local or remote host.
isAvailable: (ctx) => ctx.isMac,
},
{
id: 'appearance.scrollbars',
page: 'appearance',
titleKey: 'settings.openchamber.visual.field.alwaysShowScrollbars',
descriptionKey: 'settings.openchamber.visual.field.alwaysShowScrollbarsHint',
keywords: ['scrollbar', 'scrollbars', 'scroll', 'mouse', 'wheel', 'accessibility', 'always visible'],
},
{
id: 'appearance.pwa-install-name',
page: 'appearance',