None of these four steps has its own stylesheet except PersonalInformation, whose entire index.module.pcss is the 65% / 35% split that puts DL number and DL state on one row inside a Stack direction="row" gap={8}. Everything else is the locked atoms dropped straight into the step frame, which is why the 16px content gap does all the spacing. Step titles are not in the step files: StepContainer reads them from the stepper's step config, so the twin passes them as props — treat the titles here as representative, not authoritative.
FullName shows Middle Name only when middleName !== undefined; Application Type only when the flow is not pre-qualification, not edit mode and not type-locked; the Co-signer option only for an authenticated customer with a credit app on file, or an invite code; Applicant Type only for a non-primary application; and the business and marital questions only under isBusinessApplicationEnabled / isSpouseApplicationEnabled. EmailOrPhone hides Zip unless requireZip, and hides the consent checkbox entirely for an authenticated customer — which also changes the CTA from Agree & Continue back to Continue. CustomerInfo is skipped by the flow's hide predicate once the customer is already converted. PersonalInformation drops the DL row and the SSN independently, and its subtitle is written four ways to match which of them survive.
Field labels here are Title Case ("First Name", "Date of Birth", "DL State") — not the sentence case used in prose. The consent text is DefaultCommunicationTerms from const/text/terms.ts, rendered through CheckboxMinor with inline links and a {dealership-name} placeholder the widget substitutes per dealer. On mobile the DL label shortens to "DL Number"; at desktop width it is "Driver's License Number".