Files
siftlode/frontend/src/lib/viewportUnits.contract.test.ts
T
peter 4646aae320 fix(design): the table header takes the B9 fade utility, and every size is dvh, not vh (E28 S3d4)
The table header carried an arbitrary-value copy of fade-below; a contract refuses a hand gradient of a surface colour. 100vh is the viewport with a tablet browser's toolbar retracted, so h-screen / min-h-screen / static vh hid the last rows under it; a contract holds dvh (the Plex player stage changes with S3f, where it is played on the tablet).
2026-09-26 00:39:10 +02:00

34 lines
1.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { readdirSync, readFileSync } from "node:fs";
import { describe, expect, it } from "vitest";
// E28 S3d4 (E18.5's `h-screen` → `dvh`). `100vh` is the viewport with a mobile browser's toolbars
// RETRACTED: on a tablet with the toolbar showing, an `h-screen` shell runs its bottom edge (the
// last rows, a dialog's footer) under the toolbar. `dvh` follows the toolbar. A static `vh` size is
// the same trap at a smaller scale, so the app sizes by `dvh` everywhere.
function sources(): Array<[string, string]> {
const walk = (u: URL, prefix: string): Array<[string, string]> =>
readdirSync(u, { withFileTypes: true }).flatMap((e) => {
if (e.isDirectory()) return walk(new URL(`${e.name}/`, u), `${prefix}${e.name}/`);
if (!/\.tsx?$/.test(e.name) || e.name.includes(".test.")) return [];
return [
[`${prefix}${e.name}`, readFileSync(new URL(e.name, u), "utf-8")] as [string, string],
];
});
return walk(new URL("../", import.meta.url), "");
}
// The Plex player's stage is sized with the 80vh × 1.25 zoom trick. It changes in S3f, where the
// players are re-fitted for touch and verified by playing them on the tablet.
const PENDING_S3F = new Set(["components/PlexPlayer.tsx"]);
describe("viewport units", () => {
it("are dynamic: no h-screen / min-h-screen, no static vh", () => {
const hits = sources()
.filter(([name]) => !PENDING_S3F.has(name))
.filter(([, src]) => /\b(?:min-|max-)?h-screen\b|\d(?:\.\d+)?vh\b/.test(src))
.map(([name]) => name);
expect(hits).toEqual([]);
});
});