- Center the active step using offsetLeft/offsetWidth instead of getBoundingClientRect,
so repeated or mid-transition centering calls use untransformed layout positions and
cannot accumulate drift.
- Constrain the stepper to width: 100% with overflow: hidden so its max-content track
can no longer extend past the modal body into the header/footer area.
- Replace the window-size watcher with a ResizeObserver on the stepper's viewport so
it re-centers when the modal body resizes for any reason.
The stepper now keeps the current step centered on one line: the track translates
with a 550ms ease-out transition as steps advance, and a mask gradient fades
overflowing steps so nothing is visible at the extremities. Visited steps remain
clickable; the position recalculates on step-count changes and window resize.
Replaces the single-form New Proposal modal with a multi-step wizard aligned with
the backend's structured revision data:
- Basics: title and proposal type (General / Funding / Policy)
- Decision: decision requested, rationale, responsible party, conflict disclosure
- Scope & risks: in/out-of-scope lists and risk+mitigation pairs
- Funding or Policy: type-specific structured fields (max authorization with
currency, target date, finished criteria, milestones; supersedes, effective date)
- Narrative: optional free-form markdown via PostBuilder, mapped to the additional
context section
- Review: grouped summary before submission
The wizard builds commonData/typeData payloads and per-step validation, and Modal
gains a footer slot used for Back/Next/Create navigation. Generated API models are
extended in place with the new optional fields until the backend spec is regenerated.
Verification: npx vue-tsc -b and npm run build both pass cleanly.