Wizard polish: step headlines, gated Next, real summary, portal action bar

Mobile only (<=639px); desktop markup untouched.

Bug fix: the Back/Next bar was fixed-positioned inside the screen
entrance animation's transformed wrapper, so it painted under the content
and jumped to the viewport bottom about a second in. It is now portalled
to <body> and only fades in, pinned to the bottom from the first frame.
The other fixed/sticky elements (tab bar, drawer, sheets, install sheet)
were checked and live outside the animated wrappers.

- The step name is now the large headline with a one-line description;
  the repeated page title is dropped on phones. Thin progress bar + 1/3.
- Step 1: formats/limits hint, one big dashed Add photos or files area
  (plus icon), Camera and Paste text instead as secondaries, and a
  'nothing added yet' placeholder that becomes the thumbnail/chip list.
- Next is disabled until a photo, file or pasted text exists; step 3 can
  never be reached empty.
- Step 1 shows Cancel (back to the Library) instead of a dead Back.
- Step 3 is a real summary: thumbnail/chip strip plus Files, Difficulty,
  Activities and Folder rows, each with an Edit link to its step; Freeze
  is the single primary action.
- Step 2 got a visible Difficulty label and a helper line under every
  group, defaults still preselected.
- Bottom chrome: flat full-width Back/Next bar above the safe area, and
  the tab bar hides inside both wizards. The lower-right orb is hidden on
  phones so it can never glow behind the bar.
- Make my homework matches: headline, hint, big add area, placeholder,
  Cancel, gated Next, flat bar.

Verified: new wizard suite 80/80 (bar position sampled at 5 frames during
the entrance from tab bar/drawer/empty state; 360 + 390, dark + light,
EN + CS, reduced motion on/off; gating, summary Edit links, hidden tab
bar and orb), declutter 116/116, regression 74/74, mobile 52/52,
animation 8/8, i18n 25/25. Lint + build clean. SW freezmo-v22.
This commit is contained in:
Martin Dvořák 2026-10-10 11:35:45 +00:00
commit e66141e9a0
9 changed files with 338 additions and 132 deletions

View file

@ -89,6 +89,7 @@ const en: Record<string, string> = {
"common.next": "Next",
"common.more": "More",
"common.less": "Less",
"common.edit": "Edit",
"common.stepOf": "{n} / {total}",
/* header ---------------------------------------------------------- */
@ -186,6 +187,7 @@ const en: Record<string, string> = {
"homework.subtitle": "Paste it, photograph it or add a file — then pick how I should help.",
"homework.phone.assignment": "The assignment",
"homework.phone.mode": "How should I help?",
"homework.phone.modeDesc": "Pick how I should help with this assignment.",
"homework.phone.preview": "Assignment preview",
"homework.phone.startHint": "Tap a card to start.",
"homework.source.title": "1. The assignment",
@ -327,8 +329,17 @@ const en: Record<string, string> = {
"upload.pasteInstead": "Paste text instead",
"upload.focusExtra": "Add a focus or extra notes (optional)",
"upload.phone.notes": "Your notes",
"upload.phone.notesDesc": "Photos, PDF, Word or text — up to {images} photos and {documents} files.",
"upload.phone.options": "Options",
"upload.phone.optionsDesc": "Everything has a sensible default — change what you like.",
"upload.phone.summary": "Ready to freeze",
"upload.phone.summaryDesc": "Check what goes in, then freeze.",
"upload.phone.difficultyHelp": "How deep the questions go.",
"upload.phone.activitiesHelp": "How many activities to build.",
"upload.phone.folderHelp": "Where the deck lands in your library.",
"upload.nothingAdded": "Nothing added yet",
"upload.summary.files": "Files",
"upload.summary.folder": "Folder",
"upload.summaryText": "Text",
"upload.photoCount.one": "{n} photo",
"upload.photoCount.few": "{n} photos",
@ -707,6 +718,7 @@ const cs: Record<string, string> = {
"common.next": "Další",
"common.more": "Více",
"common.less": "Méně",
"common.edit": "Upravit",
"common.stepOf": "{n} / {total}",
/* header ---------------------------------------------------------- */
@ -804,6 +816,7 @@ const cs: Record<string, string> = {
"homework.subtitle": "Vlož ho, vyfoť nebo přidej soubor — a vyber, jak ti mám pomoct.",
"homework.phone.assignment": "Zadání",
"homework.phone.mode": "Jak ti mám pomoct?",
"homework.phone.modeDesc": "Vyber, jak ti s tímto zadáním pomůžu.",
"homework.phone.preview": "Náhled zadání",
"homework.phone.startHint": "Klepni na kartu a začnu.",
"homework.source.title": "1. Zadání",
@ -945,8 +958,17 @@ const cs: Record<string, string> = {
"upload.pasteInstead": "Místo toho vložit text",
"upload.focusExtra": "Přidat zaměření nebo poznámky navíc (nepovinné)",
"upload.phone.notes": "Tvoje poznámky",
"upload.phone.notesDesc": "Fotky, PDF, Word nebo text — až {images} fotek a {documents} souborů.",
"upload.phone.options": "Možnosti",
"upload.phone.optionsDesc": "Vše má rozumné výchozí hodnoty — změň, co chceš.",
"upload.phone.summary": "Připraveno ke zmrazení",
"upload.phone.summaryDesc": "Zkontroluj, co se použije, a zmraz.",
"upload.phone.difficultyHelp": "Jak hluboko otázky jdou.",
"upload.phone.activitiesHelp": "Kolik aktivit se vytvoří.",
"upload.phone.folderHelp": "Kam se sada v knihovně zařadí.",
"upload.nothingAdded": "Zatím nic přidáno",
"upload.summary.files": "Soubory",
"upload.summary.folder": "Složka",
"upload.summaryText": "Text",
"upload.photoCount.one": "{n} fotka",
"upload.photoCount.few": "{n} fotky",