No stylesheet of its own: it is a RadioGroup of locations, each row carrying a location-dot icon, the address line, and the city/state/zip as a second description line. When the customer's zip is known, the nearest location's second line becomes "City, ST ZIP | Closest to 94538" — appended to the same string, not a separate badge. A "See Map" ActionText links to the dealer's own /location/ page and sits below the group. While locations are being sorted, the rows are replaced by a centred 32px Spinner. This step is hidden by the flow's predicate when a location is already preselected; and on Test Drive with isAppointmentLocationLockedByVehicle, it renders with every unselected location disabled rather than hiding.
Schedule declares the card recipe locally — white, 1px --gray-5, 5px radius, a 48px header with a --gray-6 bottom border, 16px scrolling content — a fourth copy of the Module recipe in the codebase. Its .times block then overrides the RadioGroup from outside, every declaration !important: rows drop from 64px to 48px, padding becomes 0 16px, the radius becomes 7px, the gap becomes 16px and the label weight becomes 500. Unavailable slots are not rendered as disabled rows — they are absent from selectedDayTimeOptions entirely. The header shows the full date, and appends " at 10:30 AM" once a slot is chosen. On mount the content scrolls the selected slot to its vertical centre. This is also the one step that passes withoutHeaderMinHeight, because the calendar needs the room.
Its whole stylesheet exists to let the textarea grow: the Input and its container both take flex: 1, and so does the textarea inside, so the message field absorbs the remaining step height instead of staying 3 rows tall. The salesperson Select is hidden by default — it needs showDealerDropdown and at least one assignable dealer whose locations include the chosen location, so picking a different location can empty it. Its placeholder is "No Salesperson" and its label defaults to "Salesperson (Optional)", overridable per dealer through widgetConfig.fields. Both fields say (Optional) in the label rather than marking required fields.
The Datepicker component itself is not built yet — the calendar above is a stand-in at the right dimensions (32px day cells, 7-column grid, 4px gaps, 7px radius) so the step reads correctly. Its selected day uses the same off-token blue gradient recorded on the ValueBox card. Treat the day-cell geometry here as indicative until Datepicker is mirrored from its own source.