import { describe, expect, test } from "bun:test"; import { readFileSync } from "node:fs"; describe("home page hierarchy", () => { test("desktop layout is selected with useIsMobile rather than Tailwind breakpoint classes", () => { const source = readFileSync("src/app/page.tsx", "utf8"); expect(source).toContain("useIsMobile"); expect(source).toContain("grid-cols-[minmax(0,0.75fr)_minmax(0,1.25fr)]"); expect(source).toContain('"items-center justify-between"'); expect(source).toContain("desktopUtilityActionsClasses"); expect(source).toContain("AI capture"); expect(source).toContain("Event timeline"); }); test("manual create is routed through a More menu instead of a primary mobile action", () => { const source = readFileSync("src/app/page.tsx", "utf8"); expect(source).toContain("More"); expect(source).not.toContain("New Event"); }); test("mobile layout keeps capture before timeline without order utility breakpoints", () => { const source = readFileSync("src/app/page.tsx", "utf8"); expect(source).not.toContain("order-1 lg:order-none"); expect(source).toContain("Import"); expect(source).toContain("Manual create"); }); test("mobile header gives controls their own full-width row so the title is not squeezed by actions", () => { const source = readFileSync("src/app/page.tsx", "utf8"); expect(source).toContain("isMobile ? \"w-full\" : undefined"); expect(source).toContain("headerActionsClasses"); expect(source).toContain('"flex w-full items-center justify-between gap-2"'); expect(source).toContain("flex flex-wrap items-center justify-end gap-2"); }); test("mobile header keeps export inside the More menu instead of a dedicated button", () => { const source = readFileSync("src/app/page.tsx", "utf8"); expect(source).toContain("!isMobile && ("); expect(source).toContain("Export"); expect(source).toContain("onClick={handleExport}"); }); test("mobile More trigger collapses to an icon button so utility actions fit on one row", () => { const source = readFileSync("src/app/page.tsx", "utf8"); expect(source).toContain('size={isMobile ? "icon" : "sm"}'); expect(source).toContain("moreTriggerLabel"); expect(source).toContain('isMobile ? null : "More"'); }); test("mobile header omits the theme toggle so auth and overflow actions have a stable hierarchy", () => { const source = readFileSync("src/app/page.tsx", "utf8"); expect(source).not.toContain(""); }); test("mobile header uses a column layout with a dedicated action row instead of desktop justify-between framing", () => { const source = readFileSync("src/app/page.tsx", "utf8"); expect(source).toContain("headerLayoutClasses"); expect(source).toContain('isMobile ? "flex-col items-start"'); expect(source).toContain('"flex w-full items-center justify-between gap-2"'); }); });