+ {/* Bottom nav — sticky en bas sur mobile pour rester accessible quand
+ le formulaire est long, normal en flux sur desktop. */}
+
- {/* Sélecteur d'étape */}
-
+ {/* Sélecteur d'étape — scroll horizontal sur mobile, wrap au-delà.
+ Le -mx + px compense pour pouvoir scroller jusqu'au bord de la card. */}
+
{draft.steps.map((s, idx) => {
const filled = s.subject.trim() !== "" && s.body.trim() !== "";
return (
@@ -577,7 +624,7 @@ function StepMessages({
type="button"
onClick={() => setSelectedIdx(idx)}
className={cn(
- "inline-flex items-center gap-2 rounded-default border px-3 py-1.5",
+ "shrink-0 inline-flex items-center gap-2 rounded-default border px-3 py-1.5",
"text-[12.5px] font-medium transition-all",
idx === selectedIdx
? "border-rubis bg-rubis-glow text-rubis-deep"
@@ -616,9 +663,18 @@ function StepMessages({
updateSelected({ subject: e.target.value })}
+ onFocus={() => {
+ setFocusedField("subject");
+ captureSubjectSelection();
+ }}
+ onSelect={captureSubjectSelection}
+ onBlur={captureSubjectSelection}
+ onKeyUp={captureSubjectSelection}
+ onClick={captureSubjectSelection}
maxLength={200}
/>
@@ -627,9 +683,18 @@ function StepMessages({