Fix the clipped answer field + the doubled AI note; ordering only where it fits

UI bug from a phone screenshot (short answer, Czech):
- The textarea was flex-shrunk inside the slide's column (58px instead of
  ~82px), clipping the typed answer mid-line. Every direct child of a
  study/review/guide slide is now shrink-0 and the slide scrolls instead.
- Two AI disclaimers were visible at once: the activity's own after the
  grading box plus the feed's row. The activity-level copy is gone; the
  feed/guide row (which also carries the report control) is the single one.
  The phase-2 check now asserts the note sits below the graded feedback.
- The mobile suite's backdrop-tap check is deterministic too (the spring
  animation made the measured box mid-flight).

Ordering activities: the deck prompt now allows them only when the notes
hold a real sequence (chronological events, process stages, procedure steps,
a lifecycle, a ranked scale) and points at matching / multiple choice /
true-false when they do not - "sort these" was landing on decks with no
order at all.

Version 0.2.4, SW -> freezmo-v57.
This commit is contained in:
Martin Dvořák 2026-10-13 07:27:39 +00:00
commit 9b0354fb11
9 changed files with 34 additions and 15 deletions

View file

@ -142,13 +142,15 @@ const browser = await launchBrowser();
await page.getByRole("button", { name: "Submit answer" }).click();
await page.waitForTimeout(800);
check("grading: AI feedback rendered", await page.getByText("Nice — scattering does the work.").isVisible());
// Scope it to the placement: the disclaimer directly under the graded box.
// The disclaimer sits below the graded feedback (the feed's row carries it;
// the activity no longer duplicates it right after the grading box).
const feedbackDisclaimer = await page.evaluate(() => {
const feedback = [...document.querySelectorAll("p")].find((el) => el.textContent.includes("Nice — scattering does the work."));
const next = feedback?.closest("div")?.nextElementSibling;
return Boolean(next?.textContent?.includes("Freezmo uses AI"));
const note = [...document.querySelectorAll("p")].find((el) => el.textContent.includes("Freezmo uses AI"));
if (!feedback || !note) return false;
return note.getBoundingClientRect().top > feedback.getBoundingClientRect().bottom - 4;
});
check("grading: AI disclaimer under the feedback", feedbackDisclaimer);
check("grading: AI disclaimer below the feedback", feedbackDisclaimer);
await context.close();
}