fix(design): the saved-view chip on one line, one Escape per layer, the /watch action row (E28 S3d)
- SelectTrigger lays its toolbar value out as a row; the saved-view chip passes its glyph and modified dot through the icon/trailing slots (an <svg> is display:block and broke the chip in two). - One Escape in a dialog's open list closed the list AND the dialog: the list's close flushes synchronously and pops its layer before the dialog's window listener runs. takeEscape() is the one close-on-Escape test (topmost AND not yet taken); Modal, the Welcome lightbox and useLayer use it, and keymap.dispatch ignores a taken Escape. - /watch: the Download sits on the toolbar rung, level with the Repeat chip.
This commit is contained in:
@@ -67,6 +67,25 @@ describe("WatchPage repeat", () => {
|
||||
});
|
||||
});
|
||||
|
||||
// E28: the Download link sat at the button's 32 beside the Repeat chip's 28 — one row, two heights.
|
||||
describe("WatchPage action row", () => {
|
||||
it("puts the Download on the toolbar rung, level with the Repeat chip", async () => {
|
||||
window.history.replaceState({}, "", "/watch/tok-row");
|
||||
mockMeta({
|
||||
needs_password: false,
|
||||
audio: false,
|
||||
allow_download: true,
|
||||
file_url: "/f.mp4",
|
||||
title: "A clip",
|
||||
});
|
||||
const view = render(<WatchPage />);
|
||||
const repeat = await view.findByRole("button", { name: "Repeat" });
|
||||
const download = view.container.querySelector('a[href="/f.mp4"]')!;
|
||||
expect(repeat.className).toContain("h-7");
|
||||
expect(download.className).toContain("h-7");
|
||||
});
|
||||
});
|
||||
|
||||
describe("WatchPage media element (S3 · 5a)", () => {
|
||||
it("renders a native <audio> for an audio-only asset", async () => {
|
||||
window.history.replaceState({}, "", "/watch/tok-audio");
|
||||
|
||||
Reference in New Issue
Block a user