import { createRawSnippet } from "svelte";
import { describe, expect, it } from "vitest";
import { DRAWER_SIDES, Drawer, drawer as drawerAppearance } from "./fixtures/drawer-alert-dialog-consumer";
import { classes, classesOf, render } from "./mount";
describe("the Base Drawer", () => {
it("moves focus into the drawer and restores it after keyboard dismissal", () => {
const root = render(Drawer, {
triggerLabel: "Open filters",
title: "Filters",
children: createRawSnippet(() => ({
render: () => '',
})),
});
const trigger = root.querySelector("[data-dialog-trigger]")!;
trigger.focus();
trigger.click();
const dialog = root.querySelector("dialog")!;
expect(document.activeElement).toBe(root.querySelector("[data-first-filter]"));
dialog.dispatchEvent(new KeyboardEvent("keydown", { key: "Escape", bubbles: true }));
expect(dialog.open).toBe(false);
expect(document.activeElement).toBe(trigger);
});
// Which edge a side paints at is a rendered fact a class name cannot prove:
// `right-0` once passed here while the panel opened on the left. The showcase
// browser test (apps/showcase/test/drawer.browser.test.ts) measures it.
it("renders every side with its exported appearance", () => {
expect(DRAWER_SIDES).toEqual(["top", "right", "bottom", "left"]);
for (const side of DRAWER_SIDES) {
const root = render(Drawer, {
triggerLabel: `Open ${side} drawer`,
title: `${side} drawer`,
side,
class: "consumer-drawer",
});
const element = root.querySelector("dialog")!;
expect(classes(element)).toEqual(
classesOf(drawerAppearance({ side, class: "consumer-drawer" })),
);
expect(classes(element).has("p-[var(--reddb-spatial-inset-lg)]")).toBe(true);
expect(classes(element).has("motion-reduce:transition-none")).toBe(true);
}
});
});