diff --git a/components/calendar/calendar-app.tsx b/components/calendar/calendar-app.tsx index 141702b6d..2222e5013 100644 --- a/components/calendar/calendar-app.tsx +++ b/components/calendar/calendar-app.tsx @@ -2201,6 +2201,10 @@ export function CalendarApp({ linkSegments: routeSegments }: CalendarAppProps = {!isNarrow && ( { dragStartWidth.current = calSidebarWidth; setIsResizing(true); }} onResize={(delta) => setCalSidebarWidth(Math.max(180, Math.min(400, dragStartWidth.current + delta)))} onResizeEnd={() => { diff --git a/components/contacts/contacts-app.tsx b/components/contacts/contacts-app.tsx index 2897db310..a71b95046 100644 --- a/components/contacts/contacts-app.tsx +++ b/components/contacts/contacts-app.tsx @@ -1275,6 +1275,10 @@ function ContactsAppContent({ linkSegments: routeSegments }: ContactsAppProps = {!isNarrow && ( { sidebarDragStartWidth.current = sidebarWidth; setIsSidebarResizing(true); }} onResize={(delta) => setSidebarWidth(Math.max(180, Math.min(400, sidebarDragStartWidth.current + delta)))} onResizeEnd={() => { @@ -1390,6 +1394,10 @@ function ContactsAppContent({ linkSegments: routeSegments }: ContactsAppProps = {!isMobile && ( { listDragStartWidth.current = listWidth; setIsListResizing(true); }} onResize={(delta) => setListWidth(Math.max(220, Math.min(500, listDragStartWidth.current + delta)))} onResizeEnd={() => { diff --git a/components/email/composer-plugin-sidebars.tsx b/components/email/composer-plugin-sidebars.tsx index 25360fd45..b3ba0beda 100644 --- a/components/email/composer-plugin-sidebars.tsx +++ b/components/email/composer-plugin-sidebars.tsx @@ -242,6 +242,10 @@ export function ComposerPluginSidebar({ const handle = mode === "docked" && onWidthChange ? ( { dragStart.current = width; }} onResize={(delta) => onWidthChange(dragStart.current + (side === "left" ? delta : -delta))} diff --git a/components/email/email-viewer.tsx b/components/email/email-viewer.tsx index e11f183d6..45302a079 100644 --- a/components/email/email-viewer.tsx +++ b/components/email/email-viewer.tsx @@ -3866,6 +3866,10 @@ export function EmailViewer({ <> {!sidebarOverlay && ( { detailSidebarWidthRef.current = detailSidebarWidth; }} onResize={(delta) => { const newWidth = Math.max(200, Math.min(500, detailSidebarWidthRef.current - delta)); diff --git a/components/files/file-browser.tsx b/components/files/file-browser.tsx index bdb3930db..ebd46612b 100644 --- a/components/files/file-browser.tsx +++ b/components/files/file-browser.tsx @@ -1221,6 +1221,10 @@ export function FileBrowser({ {sidebar} { dragStartWidth.current = sidebarWidth; setIsResizing(true); }} onResize={(delta) => setSidebarWidth(Math.max(180, Math.min(400, dragStartWidth.current + delta)))} onResizeEnd={() => { diff --git a/components/layout/__tests__/resize-handle.test.tsx b/components/layout/__tests__/resize-handle.test.tsx index fb542a472..c56401daa 100644 --- a/components/layout/__tests__/resize-handle.test.tsx +++ b/components/layout/__tests__/resize-handle.test.tsx @@ -1,7 +1,26 @@ import { describe, it, expect, vi } from 'vitest'; -import { render, fireEvent } from '@testing-library/react'; +import { useRef, useState } from 'react'; +import { render, fireEvent, act } from '@testing-library/react'; import { ResizeHandle } from '../resize-handle'; +/** A pane whose width the handle changes, as the apps wire it up. */ +function Pane({ onSave }: { onSave: (width: number) => void }) { + const [width, setWidth] = useState(200); + const start = useRef(width); + return ( + { start.current = width; }} + onResize={(delta) => setWidth(Math.max(180, Math.min(400, start.current + delta)))} + onResizeEnd={() => onSave(width)} + /> + ); +} + + describe('ResizeHandle', () => { it('should render with separator role', () => { const { getByRole } = render( @@ -14,7 +33,7 @@ describe('ResizeHandle', () => { }); describe('keyboard interaction', () => { - it('should call onResize with negative delta on ArrowLeft', () => { + it('should call onResize with negative delta on ArrowLeft', async () => { const onResize = vi.fn(); const onResizeEnd = vi.fn(); const { getByRole } = render( @@ -23,10 +42,11 @@ describe('ResizeHandle', () => { const handle = getByRole('separator'); fireEvent.keyDown(handle, { key: 'ArrowLeft' }); expect(onResize).toHaveBeenCalledWith(-10); + await act(async () => {}); expect(onResizeEnd).toHaveBeenCalled(); }); - it('should call onResize with positive delta on ArrowRight', () => { + it('should call onResize with positive delta on ArrowRight', async () => { const onResize = vi.fn(); const onResizeEnd = vi.fn(); const { getByRole } = render( @@ -35,6 +55,7 @@ describe('ResizeHandle', () => { const handle = getByRole('separator'); fireEvent.keyDown(handle, { key: 'ArrowRight' }); expect(onResize).toHaveBeenCalledWith(10); + await act(async () => {}); expect(onResizeEnd).toHaveBeenCalled(); }); @@ -49,6 +70,58 @@ describe('ResizeHandle', () => { fireEvent.keyDown(handle, { key: 'a' }); expect(onResize).not.toHaveBeenCalled(); }); + + it('should keep the arrows away from the mail shortcuts on the window', () => { + const shortcuts = vi.fn(); + window.addEventListener('keydown', shortcuts); + try { + const { getAllByRole } = render( + <> + + + + ); + const [horizontal, vertical] = getAllByRole('separator'); + fireEvent.keyDown(horizontal, { key: 'ArrowDown' }); + fireEvent.keyDown(horizontal, { key: 'ArrowUp' }); + fireEvent.keyDown(vertical, { key: 'ArrowLeft' }); + expect(shortcuts).not.toHaveBeenCalled(); + // Keys the handle doesn't use still reach them. + fireEvent.keyDown(vertical, { key: 'j' }); + expect(shortcuts).toHaveBeenCalledOnce(); + } finally { + window.removeEventListener('keydown', shortcuts); + } + }); + + it('should step from the current width on every press and save the new one', async () => { + const onSave = vi.fn(); + const { getByRole } = render(); + const handle = getByRole('separator'); + fireEvent.keyDown(handle, { key: 'ArrowRight' }); + await act(async () => {}); + fireEvent.keyDown(handle, { key: 'ArrowRight' }); + await act(async () => {}); + expect(handle).toHaveAttribute('aria-valuenow', '220'); + expect(onSave).toHaveBeenLastCalledWith(220); + }); + }); + + describe('name and value', () => { + it('should say which pane it resizes and how wide it is', () => { + const { getByRole } = render(); + const handle = getByRole('separator', { name: 'resize_sidebar' }); + expect(handle).toHaveAttribute('aria-valuenow', '200'); + expect(handle).toHaveAttribute('aria-valuemin', '180'); + expect(handle).toHaveAttribute('aria-valuemax', '400'); + }); + + it('should fall back to a plain name and no value', () => { + const { getByRole } = render(); + const handle = getByRole('separator'); + expect(handle).toHaveAccessibleName('resize'); + expect(handle).not.toHaveAttribute('aria-valuenow'); + }); }); describe('double-click', () => { diff --git a/components/layout/resize-handle.tsx b/components/layout/resize-handle.tsx index 33e853d90..27a23128a 100644 --- a/components/layout/resize-handle.tsx +++ b/components/layout/resize-handle.tsx @@ -13,11 +13,33 @@ interface ResizeHandleProps { className?: string; /** Stable hook for tests (not user-visible). */ testId?: string; + /** + * The pane the handle resizes, which names it for screen readers + * ("Resize message list"). Without it the name is a plain "Resize". + */ + pane?: ResizePane; + /** + * The size of the pane it resizes, in px, and the limits of that size. A + * focusable separator must expose its value (WCAG 4.1.2), so screen + * readers say how wide the pane is now and how far it can go. + */ + value?: number; + min?: number; + max?: number; } const KEYBOARD_STEP = 10; -export function ResizeHandle({ onResizeStart, onResize, onResizeEnd, onDoubleClick, orientation = "vertical", className, testId }: ResizeHandleProps) { +export type ResizePane = "sidebar" | "messageList" | "contactList" | "sidePanel"; + +const PANE_LABEL_KEYS: Record = { + sidebar: "resize_sidebar", + messageList: "resize_message_list", + contactList: "resize_contact_list", + sidePanel: "resize_side_panel", +}; + +export function ResizeHandle({ onResizeStart, onResize, onResizeEnd, onDoubleClick, orientation = "vertical", className, testId, pane, value, min, max }: ResizeHandleProps) { const t = useTranslations("shell"); const handleRef = useRef(null); // Id of the pointer that started the drag, or null when idle. Only that @@ -76,9 +98,17 @@ export function ResizeHandle({ onResizeStart, onResize, onResizeEnd, onDoubleCli else return; } e.preventDefault(); - onResize(delta); - onResizeEnd?.(); - }, [onResize, onResizeEnd, isHorizontal]); + // The arrows belong to the handle: the mail shortcuts listen on the + // window and would otherwise also move the selection. + e.stopPropagation(); + // Each step starts from the size the pane has now, as a drag does; + // without the start every press moved from the same old width. + callbacks.current.onResizeStart?.(); + callbacks.current.onResize(delta); + // The end runs after the new size has rendered, so a caller that saves + // the size in its end callback saves this step and not the last one. + queueMicrotask(() => callbacks.current.onResizeEnd?.()); + }, [isHorizontal]); useEffect(() => { const handlePointerMove = (e: PointerEvent) => { @@ -122,7 +152,10 @@ export function ResizeHandle({ onResizeStart, onResize, onResizeEnd, onDoubleCli ref={handleRef} role="separator" aria-orientation={isHorizontal ? "horizontal" : "vertical"} - aria-label={t("resize")} + aria-label={t(pane ? PANE_LABEL_KEYS[pane] : "resize")} + aria-valuenow={value === undefined ? undefined : Math.round(value)} + aria-valuemin={value === undefined ? undefined : min} + aria-valuemax={value === undefined ? undefined : max} data-testid={testId} tabIndex={0} onPointerDown={handlePointerDown} diff --git a/components/mail/mail-app.tsx b/components/mail/mail-app.tsx index c585e289b..cb032cdd1 100644 --- a/components/mail/mail-app.tsx +++ b/components/mail/mail-app.tsx @@ -57,7 +57,7 @@ import { useSettingsStore } from "@/stores/settings-store"; import { useEffectiveMailLayout } from "@/hooks/use-effective-mail-layout"; import { useContactStore } from "@/stores/contact-store"; import { useIdentityStore } from "@/stores/identity-store"; -import { useUIStore } from "@/stores/ui-store"; +import { useUIStore, SIDEBAR_MIN, SIDEBAR_MAX, EMAIL_LIST_MIN, EMAIL_LIST_MAX, EMAIL_LIST_HEIGHT_MIN, EMAIL_LIST_HEIGHT_MAX } from "@/stores/ui-store"; import { useDeviceDetection } from "@/hooks/use-media-query"; import { usePaneSize } from "@/hooks/use-pane-size"; import { usePaneId } from "@/hooks/use-pane-context"; @@ -4922,6 +4922,10 @@ export function MailApp({ linkSegments: routeSegments }: MailAppProps = {}) { absent under Mountain View, whose navigation has a fixed width) */} {!isMobile && !isTablet && !sidebarCollapsed && !inlineApp && !fullscreenReading && !mvShell && ( { dragStartWidth.current = sidebarWidth; setIsResizing(true); }} onResize={(delta) => setSidebarWidth(dragStartWidth.current + delta)} onResizeEnd={() => { setIsResizing(false); persistColumnWidths(); }} @@ -5345,6 +5349,10 @@ export function MailApp({ linkSegments: routeSegments }: MailAppProps = {}) { {/* Email list resize handle (desktop only) */} {!isMobile && !isTablet && !isFocusedMailLayout && !isHorizontalMailLayout && !shouldHideViewerPane && !fullscreenReading && ( { dragStartWidth.current = emailListWidth; setIsResizing(true); }} onResize={(delta) => setEmailListWidth(dragStartWidth.current + delta)} onResizeEnd={() => { setIsResizing(false); persistColumnWidths(); }} @@ -5354,6 +5362,10 @@ export function MailApp({ linkSegments: routeSegments }: MailAppProps = {}) { {!isMobile && !isTablet && isHorizontalMailLayout && !shouldHideHorizontalViewerPane && !fullscreenReading && ( { dragStartWidth.current = emailListHeight; setIsResizing(true); }} onResize={(delta) => setEmailListHeight(dragStartWidth.current + delta)} onResizeEnd={() => { setIsResizing(false); persistColumnWidths(); }} diff --git a/components/settings/settings-app.tsx b/components/settings/settings-app.tsx index a0c92051b..79b6e25b6 100644 --- a/components/settings/settings-app.tsx +++ b/components/settings/settings-app.tsx @@ -1188,6 +1188,10 @@ export function SettingsApp({ linkSegments: routeSegments }: SettingsAppProps = { dragStartWidth.current = settingsSidebarWidth; setIsResizing(true); }} onResize={(delta) => setSettingsSidebarWidth(Math.max(180, Math.min(400, dragStartWidth.current + delta)))} onResizeEnd={() => { diff --git a/locales/ar/common.json b/locales/ar/common.json index 2bfb3644d..2afaaa776 100644 --- a/locales/ar/common.json +++ b/locales/ar/common.json @@ -5721,7 +5721,11 @@ "reading_pane": "جزء القراءة", "name_unread": "{name}، {count} غير مقروءة", "expand_folder": "توسيع {name}", - "collapse_folder": "طي {name}" + "collapse_folder": "طي {name}", + "resize_sidebar": "تغيير حجم الشريط الجانبي", + "resize_message_list": "تغيير حجم قائمة الرسائل", + "resize_contact_list": "تغيير حجم قائمة جهات الاتصال", + "resize_side_panel": "تغيير حجم اللوحة الجانبية" }, "plugin_pages": { "loading": "جارٍ تحميل الصفحة", diff --git a/locales/ca/common.json b/locales/ca/common.json index e11033a56..4c0fb7e99 100644 --- a/locales/ca/common.json +++ b/locales/ca/common.json @@ -5721,7 +5721,11 @@ "reading_pane": "Panell de lectura", "name_unread": "{name}, {count} sense llegir", "expand_folder": "Desplega {name}", - "collapse_folder": "Plega {name}" + "collapse_folder": "Plega {name}", + "resize_sidebar": "Canvia la mida de la barra lateral", + "resize_message_list": "Canvia la mida de la llista de missatges", + "resize_contact_list": "Canvia la mida de la llista de contactes", + "resize_side_panel": "Canvia la mida del tauler lateral" }, "plugin_pages": { "loading": "S'està carregant la pàgina", diff --git a/locales/cs/common.json b/locales/cs/common.json index 301602661..579e42ab3 100644 --- a/locales/cs/common.json +++ b/locales/cs/common.json @@ -5721,7 +5721,11 @@ "reading_pane": "Podokno čtení", "name_unread": "{name}, Nepřečteno: {count}", "expand_folder": "Rozbalit {name}", - "collapse_folder": "Sbalit {name}" + "collapse_folder": "Sbalit {name}", + "resize_sidebar": "Změnit velikost postranního panelu", + "resize_message_list": "Změnit velikost seznamu zpráv", + "resize_contact_list": "Změnit velikost seznamu kontaktů", + "resize_side_panel": "Změnit velikost bočního panelu" }, "plugin_pages": { "loading": "Načítání stránky", diff --git a/locales/da/common.json b/locales/da/common.json index 7a205874d..b73ce0d33 100644 --- a/locales/da/common.json +++ b/locales/da/common.json @@ -5721,7 +5721,11 @@ "reading_pane": "Læserude", "name_unread": "{name}, {count} ulæste", "expand_folder": "Udvid {name}", - "collapse_folder": "Skjul {name}" + "collapse_folder": "Skjul {name}", + "resize_sidebar": "Tilpas størrelsen på sidepanelet", + "resize_message_list": "Tilpas størrelsen på meddelelseslisten", + "resize_contact_list": "Tilpas størrelsen på kontaktlisten", + "resize_side_panel": "Tilpas størrelsen på sideruden" }, "plugin_pages": { "loading": "Indlæser side", diff --git a/locales/de/common.json b/locales/de/common.json index aaadafb08..6eb98b898 100644 --- a/locales/de/common.json +++ b/locales/de/common.json @@ -5721,7 +5721,11 @@ "reading_pane": "Lesebereich", "name_unread": "{name}, {count} ungelesen", "expand_folder": "{name} aufklappen", - "collapse_folder": "{name} zuklappen" + "collapse_folder": "{name} zuklappen", + "resize_sidebar": "Größe der Seitenleiste ändern", + "resize_message_list": "Größe der Nachrichtenliste ändern", + "resize_contact_list": "Größe der Kontaktliste ändern", + "resize_side_panel": "Größe des Seitenbereichs ändern" }, "plugin_pages": { "loading": "Seite wird geladen", diff --git a/locales/en/common.json b/locales/en/common.json index c5bbb41f4..54530c04b 100644 --- a/locales/en/common.json +++ b/locales/en/common.json @@ -5721,7 +5721,11 @@ "reading_pane": "Reading pane", "name_unread": "{name}, {count} unread", "expand_folder": "Expand {name}", - "collapse_folder": "Collapse {name}" + "collapse_folder": "Collapse {name}", + "resize_sidebar": "Resize sidebar", + "resize_message_list": "Resize message list", + "resize_contact_list": "Resize contact list", + "resize_side_panel": "Resize side panel" }, "plugin_pages": { "loading": "Loading page", diff --git a/locales/es/common.json b/locales/es/common.json index dad54c55d..f09fc04ad 100644 --- a/locales/es/common.json +++ b/locales/es/common.json @@ -5721,7 +5721,11 @@ "reading_pane": "Panel de lectura", "name_unread": "{name}, {count} sin leer", "expand_folder": "Expandir {name}", - "collapse_folder": "Contraer {name}" + "collapse_folder": "Contraer {name}", + "resize_sidebar": "Cambiar el tamaño de la barra lateral", + "resize_message_list": "Cambiar el tamaño de la lista de mensajes", + "resize_contact_list": "Cambiar el tamaño de la lista de contactos", + "resize_side_panel": "Cambiar el tamaño del panel lateral" }, "plugin_pages": { "loading": "Cargando la página", diff --git a/locales/et/common.json b/locales/et/common.json index fff787ecd..0654a9e34 100644 --- a/locales/et/common.json +++ b/locales/et/common.json @@ -5721,7 +5721,11 @@ "reading_pane": "Lugemispaan", "name_unread": "{name}, Lugemata: {count}", "expand_folder": "Laienda {name}", - "collapse_folder": "Ahenda {name}" + "collapse_folder": "Ahenda {name}", + "resize_sidebar": "Muuda külgriba suurust", + "resize_message_list": "Muuda kirjade loendi suurust", + "resize_contact_list": "Muuda kontaktide loendi suurust", + "resize_side_panel": "Muuda külgpaneeli suurust" }, "plugin_pages": { "loading": "Lehe laadimine", diff --git a/locales/fa/common.json b/locales/fa/common.json index b538ae258..aa5da3ef8 100644 --- a/locales/fa/common.json +++ b/locales/fa/common.json @@ -5721,7 +5721,11 @@ "reading_pane": "قاب خواندن", "name_unread": "{name}، {count} خوانده‌نشده", "expand_folder": "باز کردن {name}", - "collapse_folder": "بستن {name}" + "collapse_folder": "بستن {name}", + "resize_sidebar": "تغییر اندازه نوار کناری", + "resize_message_list": "تغییر اندازه فهرست پیام‌ها", + "resize_contact_list": "تغییر اندازه فهرست مخاطبین", + "resize_side_panel": "تغییر اندازه پنل کناری" }, "plugin_pages": { "loading": "در حال بارگذاری صفحه", diff --git a/locales/fr/common.json b/locales/fr/common.json index 0dac58ed2..bfa341651 100644 --- a/locales/fr/common.json +++ b/locales/fr/common.json @@ -5721,7 +5721,11 @@ "reading_pane": "Volet de lecture", "name_unread": "{name}, {count} non lus", "expand_folder": "Développer {name}", - "collapse_folder": "Réduire {name}" + "collapse_folder": "Réduire {name}", + "resize_sidebar": "Redimensionner la barre latérale", + "resize_message_list": "Redimensionner la liste des messages", + "resize_contact_list": "Redimensionner la liste des contacts", + "resize_side_panel": "Redimensionner le panneau latéral" }, "plugin_pages": { "loading": "Chargement de la page", diff --git a/locales/he/common.json b/locales/he/common.json index 8d1c7eb2c..f93a0aeb9 100644 --- a/locales/he/common.json +++ b/locales/he/common.json @@ -5722,7 +5722,11 @@ "reading_pane": "חלונית קריאה", "name_unread": "{name}, {count} שלא נקראו", "expand_folder": "הרחב את {name}", - "collapse_folder": "כווץ את {name}" + "collapse_folder": "כווץ את {name}", + "resize_sidebar": "שינוי גודל סרגל הצד", + "resize_message_list": "שינוי גודל רשימת ההודעות", + "resize_contact_list": "שינוי גודל רשימת אנשי הקשר", + "resize_side_panel": "שינוי גודל החלונית הצדדית" }, "plugin_pages": { "loading": "טוען את הדף", diff --git a/locales/hu/common.json b/locales/hu/common.json index c60fc6bdd..fde8f77d1 100644 --- a/locales/hu/common.json +++ b/locales/hu/common.json @@ -5721,7 +5721,11 @@ "reading_pane": "Olvasóablak", "name_unread": "{name}, {count} olvasatlan", "expand_folder": "{name} kibontása", - "collapse_folder": "{name} összecsukása" + "collapse_folder": "{name} összecsukása", + "resize_sidebar": "Oldalsáv átméretezése", + "resize_message_list": "Üzenetlista átméretezése", + "resize_contact_list": "Névjegylista átméretezése", + "resize_side_panel": "Oldalpanel átméretezése" }, "plugin_pages": { "loading": "Oldal betöltése", diff --git a/locales/it/common.json b/locales/it/common.json index 7839786ec..95aa4c7d1 100644 --- a/locales/it/common.json +++ b/locales/it/common.json @@ -5721,7 +5721,11 @@ "reading_pane": "Riquadro di lettura", "name_unread": "{name}, {count} non letti", "expand_folder": "Espandi {name}", - "collapse_folder": "Comprimi {name}" + "collapse_folder": "Comprimi {name}", + "resize_sidebar": "Ridimensiona la barra laterale", + "resize_message_list": "Ridimensiona l'elenco dei messaggi", + "resize_contact_list": "Ridimensiona l'elenco dei contatti", + "resize_side_panel": "Ridimensiona il pannello laterale" }, "plugin_pages": { "loading": "Caricamento della pagina", diff --git a/locales/ja/common.json b/locales/ja/common.json index 293b5f12b..fceedd5ee 100644 --- a/locales/ja/common.json +++ b/locales/ja/common.json @@ -5721,7 +5721,11 @@ "reading_pane": "閲覧ウィンドウ", "name_unread": "{name}、未読 {count} 件", "expand_folder": "{name}を展開", - "collapse_folder": "{name}を折りたたむ" + "collapse_folder": "{name}を折りたたむ", + "resize_sidebar": "サイドバーのサイズを変更", + "resize_message_list": "メッセージ一覧のサイズを変更", + "resize_contact_list": "連絡先一覧のサイズを変更", + "resize_side_panel": "サイドパネルのサイズを変更" }, "plugin_pages": { "loading": "ページを読み込んでいます", diff --git a/locales/ko/common.json b/locales/ko/common.json index f80a3fb83..f35078345 100644 --- a/locales/ko/common.json +++ b/locales/ko/common.json @@ -5721,7 +5721,11 @@ "reading_pane": "읽기 창", "name_unread": "{name}, 읽지 않음 {count}개", "expand_folder": "{name} 펼치기", - "collapse_folder": "{name} 접기" + "collapse_folder": "{name} 접기", + "resize_sidebar": "사이드바 크기 조정", + "resize_message_list": "메시지 목록 크기 조정", + "resize_contact_list": "연락처 목록 크기 조정", + "resize_side_panel": "사이드 패널 크기 조정" }, "plugin_pages": { "loading": "페이지를 불러오는 중", diff --git a/locales/lv/common.json b/locales/lv/common.json index d0a34577f..cac59364a 100644 --- a/locales/lv/common.json +++ b/locales/lv/common.json @@ -5721,7 +5721,11 @@ "reading_pane": "Lasīšanas rūts", "name_unread": "{name}, Nelasīti: {count}", "expand_folder": "Izvērst {name}", - "collapse_folder": "Sakļaut {name}" + "collapse_folder": "Sakļaut {name}", + "resize_sidebar": "Mainīt sānjoslas izmēru", + "resize_message_list": "Mainīt ziņojumu saraksta izmēru", + "resize_contact_list": "Mainīt kontaktu saraksta izmēru", + "resize_side_panel": "Mainīt sānu paneļa izmēru" }, "plugin_pages": { "loading": "Ielādē lapu", diff --git a/locales/mn/common.json b/locales/mn/common.json index ad827e574..b51bfa446 100644 --- a/locales/mn/common.json +++ b/locales/mn/common.json @@ -5721,7 +5721,11 @@ "reading_pane": "Унших хэсэг", "name_unread": "{name}, {count} уншаагүй", "expand_folder": "{name}-г дэлгэх", - "collapse_folder": "{name}-г хураах" + "collapse_folder": "{name}-г хураах", + "resize_sidebar": "Хажуугийн самбарын хэмжээг өөрчлөх", + "resize_message_list": "Захидлын жагсаалтын хэмжээг өөрчлөх", + "resize_contact_list": "Харилцагчдын жагсаалтын хэмжээг өөрчлөх", + "resize_side_panel": "Хажуугийн хэсгийн хэмжээг өөрчлөх" }, "plugin_pages": { "loading": "Хуудсыг ачаалж байна", diff --git a/locales/nb/common.json b/locales/nb/common.json index b9e4c4348..d54a8dd8c 100644 --- a/locales/nb/common.json +++ b/locales/nb/common.json @@ -5721,7 +5721,11 @@ "reading_pane": "Leserute", "name_unread": "{name}, {count} uleste", "expand_folder": "Utvid {name}", - "collapse_folder": "Skjul {name}" + "collapse_folder": "Skjul {name}", + "resize_sidebar": "Endre størrelse på sidepanelet", + "resize_message_list": "Endre størrelse på meldingslisten", + "resize_contact_list": "Endre størrelse på kontaktlisten", + "resize_side_panel": "Endre størrelse på sideruten" }, "plugin_pages": { "loading": "Laster inn siden", diff --git a/locales/nl/common.json b/locales/nl/common.json index 5a0705402..9094ea2b1 100644 --- a/locales/nl/common.json +++ b/locales/nl/common.json @@ -5721,7 +5721,11 @@ "reading_pane": "Leesvenster", "name_unread": "{name}, {count} ongelezen", "expand_folder": "{name} uitvouwen", - "collapse_folder": "{name} samenvouwen" + "collapse_folder": "{name} samenvouwen", + "resize_sidebar": "Formaat van zijbalk wijzigen", + "resize_message_list": "Formaat van berichtenlijst wijzigen", + "resize_contact_list": "Formaat van contactenlijst wijzigen", + "resize_side_panel": "Formaat van zijpaneel wijzigen" }, "plugin_pages": { "loading": "Pagina laden", diff --git a/locales/pl/common.json b/locales/pl/common.json index 3f4db941c..f5df755db 100644 --- a/locales/pl/common.json +++ b/locales/pl/common.json @@ -5721,7 +5721,11 @@ "reading_pane": "Okienko odczytu", "name_unread": "{name}, Nieprzeczytane: {count}", "expand_folder": "Rozwiń {name}", - "collapse_folder": "Zwiń {name}" + "collapse_folder": "Zwiń {name}", + "resize_sidebar": "Zmień rozmiar paska bocznego", + "resize_message_list": "Zmień rozmiar listy wiadomości", + "resize_contact_list": "Zmień rozmiar listy kontaktów", + "resize_side_panel": "Zmień rozmiar panelu bocznego" }, "plugin_pages": { "loading": "Wczytywanie strony", diff --git a/locales/pt/common.json b/locales/pt/common.json index e399daf85..976b5ebde 100644 --- a/locales/pt/common.json +++ b/locales/pt/common.json @@ -5721,7 +5721,11 @@ "reading_pane": "Painel de leitura", "name_unread": "{name}, {count} não lidas", "expand_folder": "Expandir {name}", - "collapse_folder": "Recolher {name}" + "collapse_folder": "Recolher {name}", + "resize_sidebar": "Redimensionar a barra lateral", + "resize_message_list": "Redimensionar a lista de mensagens", + "resize_contact_list": "Redimensionar a lista de contatos", + "resize_side_panel": "Redimensionar o painel lateral" }, "plugin_pages": { "loading": "Carregando a página", diff --git a/locales/ro/common.json b/locales/ro/common.json index 268959070..d409c635b 100644 --- a/locales/ro/common.json +++ b/locales/ro/common.json @@ -5721,7 +5721,11 @@ "reading_pane": "Panoul de citire", "name_unread": "{name}, {count} necitite", "expand_folder": "Extinde {name}", - "collapse_folder": "Restrânge {name}" + "collapse_folder": "Restrânge {name}", + "resize_sidebar": "Redimensionează bara laterală", + "resize_message_list": "Redimensionează lista de mesaje", + "resize_contact_list": "Redimensionează lista de contacte", + "resize_side_panel": "Redimensionează panoul lateral" }, "plugin_pages": { "loading": "Se încarcă pagina", diff --git a/locales/ru/common.json b/locales/ru/common.json index 1ef7f5ba0..d9d179a11 100644 --- a/locales/ru/common.json +++ b/locales/ru/common.json @@ -5721,7 +5721,11 @@ "reading_pane": "Область чтения", "name_unread": "{name}, Непрочитанных: {count}", "expand_folder": "Развернуть {name}", - "collapse_folder": "Свернуть {name}" + "collapse_folder": "Свернуть {name}", + "resize_sidebar": "Изменить размер боковой панели", + "resize_message_list": "Изменить размер списка писем", + "resize_contact_list": "Изменить размер списка контактов", + "resize_side_panel": "Изменить размер боковой области" }, "plugin_pages": { "loading": "Загрузка страницы", diff --git a/locales/sk/common.json b/locales/sk/common.json index 08cedbc7e..b64b9151c 100644 --- a/locales/sk/common.json +++ b/locales/sk/common.json @@ -5721,7 +5721,11 @@ "reading_pane": "Tabla na čítanie", "name_unread": "{name}, Neprečítané: {count}", "expand_folder": "Rozbaliť {name}", - "collapse_folder": "Zbaliť {name}" + "collapse_folder": "Zbaliť {name}", + "resize_sidebar": "Zmeniť veľkosť bočného panela", + "resize_message_list": "Zmeniť veľkosť zoznamu správ", + "resize_contact_list": "Zmeniť veľkosť zoznamu kontaktov", + "resize_side_panel": "Zmeniť veľkosť bočnej oblasti" }, "plugin_pages": { "loading": "Načítava sa stránka", diff --git a/locales/th/common.json b/locales/th/common.json index 8341705d5..3f7c71226 100644 --- a/locales/th/common.json +++ b/locales/th/common.json @@ -56,7 +56,11 @@ "reading_pane": "บานหน้าต่างอ่าน", "name_unread": "{name}, ยังไม่ได้อ่าน {count}", "expand_folder": "ขยาย {name}", - "collapse_folder": "ย่อ {name}" + "collapse_folder": "ย่อ {name}", + "resize_sidebar": "ปรับขนาดแถบด้านข้าง", + "resize_message_list": "ปรับขนาดรายการข้อความ", + "resize_contact_list": "ปรับขนาดรายชื่อผู้ติดต่อ", + "resize_side_panel": "ปรับขนาดแผงด้านข้าง" }, "date": { "today": "วันนี้", diff --git a/locales/tr/common.json b/locales/tr/common.json index 60b2a40d6..f5a88ab80 100644 --- a/locales/tr/common.json +++ b/locales/tr/common.json @@ -5721,7 +5721,11 @@ "reading_pane": "Okuma bölmesi", "name_unread": "{name}, {count} okunmamış", "expand_folder": "Genişlet: {name}", - "collapse_folder": "Daralt: {name}" + "collapse_folder": "Daralt: {name}", + "resize_sidebar": "Kenar çubuğunu yeniden boyutlandır", + "resize_message_list": "İleti listesini yeniden boyutlandır", + "resize_contact_list": "Kişi listesini yeniden boyutlandır", + "resize_side_panel": "Yan paneli yeniden boyutlandır" }, "plugin_pages": { "loading": "Sayfa yükleniyor", diff --git a/locales/uk/common.json b/locales/uk/common.json index f78d3dada..379b6cb26 100644 --- a/locales/uk/common.json +++ b/locales/uk/common.json @@ -5721,7 +5721,11 @@ "reading_pane": "Область читання", "name_unread": "{name}, Непрочитаних: {count}", "expand_folder": "Розгорнути {name}", - "collapse_folder": "Згорнути {name}" + "collapse_folder": "Згорнути {name}", + "resize_sidebar": "Змінити розмір бічної панелі", + "resize_message_list": "Змінити розмір списку листів", + "resize_contact_list": "Змінити розмір списку контактів", + "resize_side_panel": "Змінити розмір бічної області" }, "plugin_pages": { "loading": "Завантаження сторінки", diff --git a/locales/zh-TW/common.json b/locales/zh-TW/common.json index ec6e42e23..26c07b416 100644 --- a/locales/zh-TW/common.json +++ b/locales/zh-TW/common.json @@ -5721,7 +5721,11 @@ "reading_pane": "閱讀窗格", "name_unread": "{name},{count} 封未讀", "expand_folder": "展開 {name}", - "collapse_folder": "收合 {name}" + "collapse_folder": "收合 {name}", + "resize_sidebar": "調整側邊欄大小", + "resize_message_list": "調整郵件清單大小", + "resize_contact_list": "調整聯絡人清單大小", + "resize_side_panel": "調整側面板大小" }, "plugin_pages": { "loading": "正在載入頁面", diff --git a/locales/zh/common.json b/locales/zh/common.json index 1d2dfff9d..cae9a1a9d 100644 --- a/locales/zh/common.json +++ b/locales/zh/common.json @@ -5721,7 +5721,11 @@ "reading_pane": "阅读窗格", "name_unread": "{name},{count} 封未读", "expand_folder": "展开 {name}", - "collapse_folder": "折叠 {name}" + "collapse_folder": "折叠 {name}", + "resize_sidebar": "调整侧边栏大小", + "resize_message_list": "调整邮件列表大小", + "resize_contact_list": "调整联系人列表大小", + "resize_side_panel": "调整侧面板大小" }, "plugin_pages": { "loading": "正在加载页面", diff --git a/stores/ui-store.ts b/stores/ui-store.ts index bbc857815..275474aff 100644 --- a/stores/ui-store.ts +++ b/stores/ui-store.ts @@ -6,15 +6,15 @@ import { uiHooks } from "@/lib/plugin-hooks"; export type ActiveView = "sidebar" | "list" | "viewer"; // Column width constraints (in pixels) -const SIDEBAR_MIN = 180; -const SIDEBAR_MAX = 400; +export const SIDEBAR_MIN = 180; +export const SIDEBAR_MAX = 400; const SIDEBAR_DEFAULT = 256; -const EMAIL_LIST_MIN = 240; -const EMAIL_LIST_MAX = 600; +export const EMAIL_LIST_MIN = 240; +export const EMAIL_LIST_MAX = 600; const EMAIL_LIST_DEFAULT = 384; // Email list height (in pixels) for horizontal "Reading Pane at Bottom" layout -const EMAIL_LIST_HEIGHT_MIN = 160; -const EMAIL_LIST_HEIGHT_MAX = 800; +export const EMAIL_LIST_HEIGHT_MIN = 160; +export const EMAIL_LIST_HEIGHT_MAX = 800; const EMAIL_LIST_HEIGHT_DEFAULT = 320; interface UIState {