mirror of
https://github.com/4gray/iptvnator.git
synced 2026-10-16 22:26:16 -08:00
* docs(ui): record the Angular Material role decision in the UI guidelines Angular Material stays the behaviour and accessibility layer; the look comes from the design kit through mat.*-overrides() on --app-* tokens in the shared partials, kit-only components build on CDK, and plain actions may become native buttons. Records the measured Material and CDK share of the initial bytes, why a replacement would not pay, and the v22 behaviour changes to keep covered in E2E. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * style(ui): one global kit layer for menus, select panels and destructive buttons - `<mat-menu class="app-menu">` gets the kit panel from one rule in styles.scss; the two lazy components drop their `::ng-deep` copies. - Select option panels follow the same panel: bordered, 10px radius, 6px padding, 36px rows at 13px, the chosen row on the list-selection tokens. - `.app-destructive-button` is the kit's red tint on the `--app-danger-*` tokens (tinted fill, red text, no ripple, 40% opacity when disabled) instead of a solid error fill, for filled, text, outlined and icon buttons. - The backdrop blur is scoped to the dark backdrop the CDK gives modal overlays; menus, selects and popovers open over a transparent backdrop that no longer matches the rule. - `mat.elevation-classes()` is dropped: nothing uses `.mat-elevation-z*`, and its 25 rules cost 4.4 KB of the initial stylesheet. The stack now measures 1,595,843 initial bytes (was 1,597,764). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * test(e2e): wait for focus to enter an opened menu before navigating it Material focuses a menu's first item after the next render, which the zoneless scheduler runs on a later task than the keydown that opened it. The panel is visible before that, so End sent as soon as it appeared still reached the trigger: on the Linux runner the Sources row-menu delete test then found "Remove playlist" inactive on every retry. `waitForMenuFocus` polls for the active element inside the open menu; the Sources keyboard and switcher keyboard tests use it before their first navigation key. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
22 lines
809 B
TypeScript
22 lines
809 B
TypeScript
import { expect, Locator, Page } from '@playwright/test';
|
|
|
|
/**
|
|
* Wait until keyboard focus has entered the open `mat-menu`, and return it.
|
|
*
|
|
* Material moves focus to the first item after the next render, which the
|
|
* zoneless scheduler runs on a later task than the keydown that opened the
|
|
* menu. The panel is visible before that, so a navigation key sent as soon
|
|
* as it appears still reaches the trigger and the menu never sees it.
|
|
*/
|
|
export async function waitForMenuFocus(page: Page): Promise<Locator> {
|
|
const menu = page.getByRole('menu');
|
|
await expect(menu).toBeVisible();
|
|
await expect
|
|
.poll(
|
|
() => menu.evaluate((el) => el.contains(document.activeElement)),
|
|
{ message: 'focus inside the open menu' }
|
|
)
|
|
.toBe(true);
|
|
return menu;
|
|
}
|