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.