BillingRetail is the Checkout reusable that renders the Billing and Shipping address steps for retail customers (and optionally B2B).AddressForm reusable, and only controls the step markup (titles, step icons, and step visibility).Components/Checkout/Default.liquid, inside the Billing area:{% render 'Reusables\\BillingRetail\\Default', addresses: addresses, countriesList: countriesList, headQuarterAddress: headQuarterAddress %}addresses and countriesList are taken from the Checkout component model (model.addresses, model.countriesList).headQuarterAddress is derived from the checkout model only for B2B customers:{% assign isB2bCustomer = GlobalData.Settings.IsB2bCustomer %}
{% if isB2bCustomer %}
{% assign headQuarterAddress = checkout.billingAddress %}
{% else %}
{% assign headQuarterAddress = nil %}
{% endif %}BillingRetail is rendered with named parameters (it doesn’t receive a platform model object).{
"checkout": {
"billingAddress": {
"id": "Billing Address Id",
"name": "",
"firstName": "Sample first name",
"lastName": "Sample last name",
"phoneNumber": "Sample phone",
"address1": "Sample address",
"city": "Sample city",
"state": "Sample state",
"country": "Sample country",
"countryCode": "GR",
"postalCode": "10552",
"email": "sample@example.com"
},
"shippingAddress": {
"id": "Shipping Address Id",
"name": "",
"firstName": "Sample first name",
"lastName": "Sample last name",
"phoneNumber": "Sample phone",
"address1": "Sample address",
"city": "Sample city",
"state": "Sample state",
"country": "Sample country",
"countryCode": "GR",
"postalCode": "10552",
"email": "sample@example.com"
}
},
"countriesList": [
{
"code": "GR",
"name": "Greece"
},
...
],
"addresses": [
{
"name": "",
"isSelectable": true,
"address": {
"id": "Address Id",
"firstName": "Sample first name",
"lastName": "Sample last name",
"phoneNumber": "Sample phone",
"address1": "Sample address",
"city": "Sample city",
"state": "Sample state",
"country": "Sample country",
"countryCode": "GR",
"postalCode": "10552",
"email": "sample@example.com"
},
"requiresInvoice": false
}
]
}addresses (array)isSelectable (boolean)address (object) – the address fields used by AddressForm (id, firstName, lastName, phoneNumber, email, address1, postalCode, city, country/countryCode, state)countriesList (array)codenameheadQuarterAddress (object | nil)AddressForm.checkout.billingAddress.Reusables/BillingRetail/Default.liquid.<div class="flex flex-col lg:gap-10" x-data="billingretailreusabledefault">billingBillingAddress → “Billing Information”billingShippingAddress → “Shipping Information”<div x-show="$store.checkout.canShowDetails('billingBillingAddress')"><div x-show="$store.checkout.canShowDetails('billingShippingAddress')" x-cloak>AddressForm:{% render 'Reusables\\AddressForm\\Default',
addressType: 'billing',
addresses: addresses,
countriesList: countriesList,
headQuarterAddress: headQuarterAddress
%}{% render 'Reusables\\AddressForm\\Default',
addressType: 'shipping',
addresses: addresses,
countriesList: countriesList,
headQuarterAddress: headQuarterAddress
%}BillingRetail does not declare a JS factory.Reusables/BillingRetail/Default.js only defines an empty object:$store.checkout (for step visibility and validity)addressformreusabledefault.initComponent(...) (for the actual address forms)BillingRetail itself; it’s purely structural.Reusables/AddressForm/Default.js$store.checkout and $store.sharedAddresses in Assets/js/theme.jsBillingRetail template:$store.checkoutsteps['billingBillingAddress'].valid / steps['billingShippingAddress'].validcanShowDetails(stepName)AddressForm:$store.sharedAddresses$store.toastAddressForm uses it for validation/invalid-address messages.BillingRetail itself has no service calls.AddressForm (and/or other higher-level checkout logic).Reusables/BillingRetail/Default.liquidReusables/BillingRetail/Default.jsReusables/BillingRetail/Default.json (translations)Reusables/AddressForm/Default.liquidReusables/AddressForm/Default.js (main logic)$store.checkout, $store.sharedAddresses, $store.toast in Assets/js/theme.jsBillingRetail uses two step names hard-coded in the template:billingBillingAddressbillingShippingAddressAddressForm also derives its internal stepName from addressType using the same mapping:stepName: addressType === "shipping" ? "billingShippingAddress" : "billingBillingAddress",GlobalData.Settings.deliveryZonesEnabled is true, AddressForm adds extra validation through $store.sharedAddresses.validAddresses[...] and may show a blocking toast (inValidAddressMessage) until the address is selectable.{% render 'Reusables\\BillingRetail\\Default',
addresses: model.addresses,
countriesList: model.countriesList,
headQuarterAddress: GlobalData.Settings.IsB2bCustomer ? model.checkout.billingAddress : nil
%}