ProposalDetail now displays the structured fields captured by the creation wizard
as labeled sections instead of a flat paragraph list:
- Decision requested, rationale, scope (included/excluded), risks with mitigations,
responsible party, and conflict disclosure from commonData
- Funding details (formatted maximum authorization, target completion, milestones)
and finished criteria from typeData for funding proposals
- Policy details (supersedes, effective date) for policy proposals
- Free-form narrative blocks remain as an 'Additional context' section, separated
from the structured data by a rule only when both exist
Each section uses the app's existing pattern of a bold header heading with a small
uppercase eyebrow label, and empty sections are omitted so older proposals render
unchanged.
- 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.