One circular FAB (peer-count badge) replaces the top-right overlay row: draggable anywhere (pointer capture, 4px click-vs-drag threshold — the comment-pin pattern), position persisted in localStorage, panel opens toward screen center and stacks composable sections — roster, source chip, view-only pill, follow row, comments, chrome toggle. Renders at z-50 above everything (decided: covers wx dialogs; trivially dismissed via click-away/ Esc/drag). CommentLayer portals its bar + list panel into the menu's comments slot; pins/popovers/composer/click-catcher stay canvas-anchored. The FAB is the chrome-hidden survivor. e2e specs updated with an openOverlayMenu helper (panel is closed by default, click-away closes it). NOTE: Playwright suites updated but not executed here (no local WASM artifacts) — verify on CI / next session. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A42xfPFNdfsUt9eowkC9eM
16 lines
767 B
TypeScript
16 lines
767 B
TypeScript
import { expect, type Page } from '@playwright/test';
|
|
|
|
/**
|
|
* Open the overlay menu (collab-presence 0010) if its panel isn't already
|
|
* open. The roster, source chip, view-only pill, comment bar and chrome
|
|
* toggle live inside the panel; the FAB (with the peer-count badge) is the
|
|
* only overlay control always on screen. Any canvas click closes the panel
|
|
* (click-away), so specs re-open it before each in-panel interaction.
|
|
*/
|
|
export async function openOverlayMenu(page: Page): Promise<void> {
|
|
const fab = page.getByTestId('overlay-menu-fab');
|
|
await expect(fab).toBeVisible({ timeout: 30000 });
|
|
if (await page.getByTestId('overlay-menu-panel').count()) return;
|
|
await fab.click();
|
|
await expect(page.getByTestId('overlay-menu-panel')).toBeVisible();
|
|
}
|