feat(design): the three 375 rows (E28 S3f3)

- Download row: answers to its own width (container query); below 40rem
  it stacks: picture beside a two-line title, the meta line across the
  row (one line, never wraps: zoomed on the iPad its pieces broke apart),
  then the source link and the actions on one wrapping line. The paste
  field takes a line of its own when the buttons would squeeze it.
- YT playlist row: below 42rem the length rides on the picture and the
  title runs two lines over the channel.
- Channels tag row: the suggestions take a line of their own below
  40rem (the chip lane was 0 px and the row's menu off the screen).
- Pager: on a phone the arrows drop their words (names kept), and the
  size label stays one line.
- Lint: a class split where the interpolation is the variant itself
  (${NARROW}:w-24) is refused too; it had shipped with no CSS.
This commit is contained in:
2026-09-27 04:15:08 +02:00
parent d510c8a534
commit a58a398427
11 changed files with 275 additions and 77 deletions
@@ -25,6 +25,7 @@ describe("a hover gated on `enabled:` alone", () => {
const lint = async (cls: string) =>
(
await eslint.lintText(
// eslint-disable-next-line no-restricted-syntax -- probe SOURCE text handed to ESLint, not a class
`export const c = "p-1 ${cls}:text-fg";
`,
{
@@ -49,6 +50,14 @@ describe("a class split by an interpolation", () => {
expect(await split("const A = 'x';\nexport const b = `${A}" + "hover:text-fg`;\n")).toBe(1);
expect(await split("const A = 'x';\nexport const c = `p-1 ${A}" + act + "hover:x`;\n")).toBe(1);
});
it("is refused when the interpolation is the variant itself", async () => {
expect(
await split("const N = '@max-[40rem]/r';\nexport const f = `w-28 ${N}" + ":w-24`;\n"),
).toBe(1);
});
it("leaves a clock alone", async () => {
expect(await split("const m = 1;\nexport const g = `${m}:00 ${m}:${m}`;\n")).toBe(0);
});
it("leaves a whole class, a leading variant and a plain value alone", async () => {
expect(await split("const n = 1;\nexport const d = `hover:text-fg w-${n} ${n}px`;\n")).toBe(0);
expect(