feat: tableur mobile — barres repliées par défaut, bascule unique #189
CI / lint (push) Successful in 2m42s
CI / security (push) Successful in 1m38s
CI / test (push) Successful in 4m19s
CI / build (push) Successful in 1m27s
CI / e2e (push) Successful in 17m12s

Sous 768 px, la barre de menus, le ruban et le groupe Recherche sont
repliés par défaut : la barre de formule (fx), les onglets et Enregistrer
restent visibles et la grille récupère la hauteur d'écran. Un bouton
unique (#xlsx-tools-toggle) dans la barre des feuilles déplie/replie
l'ensemble (aria-expanded, état actif) ; desktop inchangé.

Ergonomie tactile : cibles ≥ 44 px, onglets en défilement horizontal,
champs de la barre de formule en 16 px (anti-zoom iOS), barre de formule
en 2 lignes quand les outils sont ouverts.

Tests : JSDOM xlsx-viewer.test.mjs (+2, 165/165), E2E mobile (repli par
défaut, dépliage, no-overflow ruban, cibles 44 px) ; openXlsx() déplie
automatiquement ≤ 768 px pour les tests desktop.
This commit is contained in:
2026-10-08 15:45:39 -04:00
parent e01e837a2a
commit 36b4962efb
17 changed files with 341 additions and 17 deletions
+36 -2
View File
@@ -72,6 +72,14 @@ async function openXlsx(page, file) {
}
await treeItem.dblclick({ timeout: 5000 });
await expect(page.locator('#content-area .xlsx-table')).toBeVisible({ timeout: 15000 });
// #189 — sous 768px la barre de menus et le ruban sont repliés par défaut.
// Les tests « desktop » qui les manipulent les déplient d'abord ; le test
// mobile dédié ouvre lui-même la feuille pour vérifier l'état replié.
const toggle = page.locator('#xlsx-tools-toggle');
if (await toggle.isVisible().catch(() => false)) {
await toggle.click();
await expect(page.locator('#content-area .xlsx-menubar')).toBeVisible();
}
}
test.describe('Excel viewer — garde-fous d\'écriture et valeurs calculées (#153)', () => {
@@ -513,12 +521,27 @@ test.describe('Excel viewer — menus à icônes et fermeture au focus (#179)',
await expect(page.locator('#xlsx-minibar')).toBeVisible();
});
test('mobile : ruban sans débordement et cibles tactiles 44px', async ({ page, viewport }) => {
test('mobile : barres repliées par défaut, ruban sans débordement et cibles 44px (#189)', async ({ page, viewport }) => {
test.skip((viewport?.width ?? 9999) > 768, 'Mobile viewport required');
await login(page);
await page.evaluate(() => window.TabManager.open('TestVault', FIXTURE));
await page.evaluate((f) => window.TabManager.open('TestVault', f), FIXTURE);
await expect(page.locator('#content-area .xlsx-table')).toBeVisible({ timeout: 15000 });
// #189 — par défaut la barre de menus et le ruban sont repliés : la grille
// garde la hauteur d'écran. La barre de formule, elle, reste visible.
await expect(page.locator('#content-area .xlsx-menubar')).toBeHidden();
await expect(page.locator('#content-area .xlsx-cmdbar')).toBeHidden();
await expect(page.locator('#content-area .xlsx-formula-bar')).toBeVisible();
await expect(page.locator('#content-area .xlsx-sheetbar')).toBeVisible();
const toggle = page.locator('#xlsx-tools-toggle');
await expect(toggle).toBeVisible();
// Un clic déplie menus + ruban (état annoncé par aria-expanded).
await toggle.click();
await expect(page.locator('#content-area .xlsx-menubar')).toBeVisible();
await expect(page.locator('#content-area .xlsx-cmdbar')).toBeVisible();
await expect(toggle).toHaveAttribute('aria-expanded', 'true');
// Le ruban s'enroule au lieu de déborder horizontalement.
const overflow = await page.evaluate(() => {
const bar = document.querySelector('#content-area .xlsx-cmdbar');
@@ -526,6 +549,17 @@ test.describe('Excel viewer — menus à icônes et fermeture au focus (#179)',
});
expect(overflow).toBeLessThanOrEqual(1);
// Cibles tactiles : le basculeur et chaque commande du ruban font 44px.
const toggleBox = await toggle.boundingBox();
expect(toggleBox.height).toBeGreaterThanOrEqual(44);
const ribbonBtnBox = await page.locator('#xs-b').boundingBox();
expect(ribbonBtnBox.height).toBeGreaterThanOrEqual(44);
// Repli : la grille retrouve toute sa hauteur.
await toggle.click();
await expect(page.locator('#content-area .xlsx-menubar')).toBeHidden();
await expect(toggle).toHaveAttribute('aria-expanded', 'false');
// Menu contextuel (clic droit émulé) : tient dans le viewport, entrées ≥ 44px.
await page.locator('#content-area td[data-cell="A1"]').click({ button: 'right' });
const menu = page.locator('.xlsx-context-menu');