The shape is always the same — confirmation header, the flow's result body, the confetti canvas, then a Divider, a next-steps header and the module checklist. embedded drops the checklist (the form is mounted in the dealer's page, where next steps would send the customer nowhere). terminal drops the body and the checklist, and the source explains exactly why: the submitter is a dead end, such as an invited co-signer, "who is not the customer this widget belongs to and has nothing to do here afterwards". The header shows when isFirstSubmission || terminal, so revisiting a finished flow later shows the body without the confirmation. The widget carries sixteen lead-form entries in RESULT_CONFIG, each mapping a header and a body; this mirrors the shape they share, with one real example (a finance submission) rather than sixteen variants.
Module order is fixed: trade-in, vehicle, finance, appointment, credit app. Each row is hidden if the flow hides its own (a finance submission does not offer finance — hideModules.finance), if the block is disabled, or if the host site hides it individually via blocks[name].module.hidden — which suppresses the row without disabling the underlying flow. The whole checklist additionally requires the retailing package. A row is a Module when its step is done and a ModuleCta when it is not, so the same row shape carries either a summary or a call to action. Note the trade-in row swaps in a ProtectedSummary instead of the vehicle when the customer status is protected.
A canvas 300px tall at z-index 1, pointer-events: none with a source comment — "don't block click events for item cards" — so it sits over the module rows without stealing their clicks. It fires once, on first submission (navigation.animation), 150 particles at 70° spread from origin.y 0.6, then clears the flag. It is skipped entirely under prefers-reduced-motion, checked in the tsx rather than CSS. The canvas is rendered above as an empty element: this twin does not run the particle library.
With no signed-in customer, Menu renders the General lead form through the step frame — a signed-out visitor gets a contact form, not an empty account page. Signed in, it is this: a regular Header greeting ("Hi Dana,"), then five SelectorButton rows in a fixed order — inventory, Documents, Appointments, Vehicle Requests, Profile — then "Need Direct Help? / Contact Us", then Log Out. The inventory row's label is inventoryCopy.pluralCapitalized, so it reads "Trucks" or "Trailers" at the right dealer; never hard-code "Cars". Vehicle Requests is conditional on blocks.vehicleRequestsDisabled. When the account exists but is unverified, a "Verify Your Account" InfoBox and button appear and every row except inventory goes disabled — browsing stays open, saved data does not. The "Need Direct Help?" row carries flex: 1, which is what pushes Log Out to the bottom of the screen; Log Out renders only when actually authenticated.