mirror of
https://github.com/bulwarkmail/webmail.git
synced 2026-10-30 16:16:19 +00:00
fix: name pane resize handles, expose their width and keep their arrow keys from the mail shortcuts
This commit is contained in:
@@ -2201,6 +2201,10 @@ export function CalendarApp({ linkSegments: routeSegments }: CalendarAppProps =
|
||||
</div>
|
||||
{!isNarrow && (
|
||||
<ResizeHandle
|
||||
pane="sidebar"
|
||||
value={calSidebarWidth}
|
||||
min={180}
|
||||
max={400}
|
||||
onResizeStart={() => { dragStartWidth.current = calSidebarWidth; setIsResizing(true); }}
|
||||
onResize={(delta) => setCalSidebarWidth(Math.max(180, Math.min(400, dragStartWidth.current + delta)))}
|
||||
onResizeEnd={() => {
|
||||
|
||||
@@ -1275,6 +1275,10 @@ function ContactsAppContent({ linkSegments: routeSegments }: ContactsAppProps =
|
||||
</div>
|
||||
{!isNarrow && (
|
||||
<ResizeHandle
|
||||
pane="sidebar"
|
||||
value={sidebarWidth}
|
||||
min={180}
|
||||
max={400}
|
||||
onResizeStart={() => { 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 && (
|
||||
<ResizeHandle
|
||||
pane="contactList"
|
||||
value={listWidth}
|
||||
min={220}
|
||||
max={500}
|
||||
onResizeStart={() => { listDragStartWidth.current = listWidth; setIsListResizing(true); }}
|
||||
onResize={(delta) => setListWidth(Math.max(220, Math.min(500, listDragStartWidth.current + delta)))}
|
||||
onResizeEnd={() => {
|
||||
|
||||
@@ -242,6 +242,10 @@ export function ComposerPluginSidebar({
|
||||
const handle = mode === "docked" && onWidthChange ? (
|
||||
<ResizeHandle
|
||||
testId={`composer-sidebar-resize-${side}`}
|
||||
pane="sidePanel"
|
||||
value={width}
|
||||
min={MIN_COMPOSER_SIDEBAR_WIDTH}
|
||||
max={MAX_COMPOSER_SIDEBAR_WIDTH}
|
||||
className="hidden md:block"
|
||||
onResizeStart={() => { dragStart.current = width; }}
|
||||
onResize={(delta) => onWidthChange(dragStart.current + (side === "left" ? delta : -delta))}
|
||||
|
||||
@@ -3866,6 +3866,10 @@ export function EmailViewer({
|
||||
<>
|
||||
{!sidebarOverlay && (
|
||||
<ResizeHandle
|
||||
pane="sidePanel"
|
||||
value={detailSidebarWidth}
|
||||
min={200}
|
||||
max={500}
|
||||
onResizeStart={() => { detailSidebarWidthRef.current = detailSidebarWidth; }}
|
||||
onResize={(delta) => {
|
||||
const newWidth = Math.max(200, Math.min(500, detailSidebarWidthRef.current - delta));
|
||||
|
||||
@@ -1221,6 +1221,10 @@ export function FileBrowser({
|
||||
{sidebar}
|
||||
</div>
|
||||
<ResizeHandle
|
||||
pane="sidebar"
|
||||
value={sidebarWidth}
|
||||
min={180}
|
||||
max={400}
|
||||
onResizeStart={() => { dragStartWidth.current = sidebarWidth; setIsResizing(true); }}
|
||||
onResize={(delta) => setSidebarWidth(Math.max(180, Math.min(400, dragStartWidth.current + delta)))}
|
||||
onResizeEnd={() => {
|
||||
|
||||
@@ -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 (
|
||||
<ResizeHandle
|
||||
pane="sidebar"
|
||||
value={width}
|
||||
min={180}
|
||||
max={400}
|
||||
onResizeStart={() => { 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(
|
||||
<>
|
||||
<ResizeHandle orientation="horizontal" onResize={vi.fn()} />
|
||||
<ResizeHandle onResize={vi.fn()} />
|
||||
</>
|
||||
);
|
||||
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(<Pane onSave={onSave} />);
|
||||
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(<Pane onSave={vi.fn()} />);
|
||||
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(<ResizeHandle onResize={vi.fn()} />);
|
||||
const handle = getByRole('separator');
|
||||
expect(handle).toHaveAccessibleName('resize');
|
||||
expect(handle).not.toHaveAttribute('aria-valuenow');
|
||||
});
|
||||
});
|
||||
|
||||
describe('double-click', () => {
|
||||
|
||||
@@ -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<ResizePane, string> = {
|
||||
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<HTMLDivElement>(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}
|
||||
|
||||
@@ -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 && (
|
||||
<ResizeHandle
|
||||
pane="sidebar"
|
||||
value={sidebarWidth}
|
||||
min={SIDEBAR_MIN}
|
||||
max={SIDEBAR_MAX}
|
||||
onResizeStart={() => { 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 && (
|
||||
<ResizeHandle
|
||||
pane="messageList"
|
||||
value={emailListWidth}
|
||||
min={EMAIL_LIST_MIN}
|
||||
max={EMAIL_LIST_MAX}
|
||||
onResizeStart={() => { 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 && (
|
||||
<ResizeHandle
|
||||
orientation="horizontal"
|
||||
pane="messageList"
|
||||
value={emailListHeight}
|
||||
min={EMAIL_LIST_HEIGHT_MIN}
|
||||
max={EMAIL_LIST_HEIGHT_MAX}
|
||||
onResizeStart={() => { dragStartWidth.current = emailListHeight; setIsResizing(true); }}
|
||||
onResize={(delta) => setEmailListHeight(dragStartWidth.current + delta)}
|
||||
onResizeEnd={() => { setIsResizing(false); persistColumnWidths(); }}
|
||||
|
||||
@@ -1188,6 +1188,10 @@ export function SettingsApp({ linkSegments: routeSegments }: SettingsAppProps =
|
||||
</div>
|
||||
|
||||
<ResizeHandle
|
||||
pane="sidebar"
|
||||
value={settingsSidebarWidth}
|
||||
min={180}
|
||||
max={400}
|
||||
onResizeStart={() => { dragStartWidth.current = settingsSidebarWidth; setIsResizing(true); }}
|
||||
onResize={(delta) => setSettingsSidebarWidth(Math.max(180, Math.min(400, dragStartWidth.current + delta)))}
|
||||
onResizeEnd={() => {
|
||||
|
||||
@@ -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": "جارٍ تحميل الصفحة",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": "در حال بارگذاری صفحه",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": "טוען את הדף",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": "ページを読み込んでいます",
|
||||
|
||||
@@ -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": "페이지를 불러오는 중",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": "Хуудсыг ачаалж байна",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": "Загрузка страницы",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": "วันนี้",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": "Завантаження сторінки",
|
||||
|
||||
@@ -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": "正在載入頁面",
|
||||
|
||||
@@ -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": "正在加载页面",
|
||||
|
||||
+6
-6
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user