BillingRetail is the checkout billing-step reusable for retail customers.Components/Checkout/Default.liquid:{% render 'Reusables\\BillingRetail\\Default', addresses: addresses, countriesList: countriesList, headQuarterAddress: headQuarterAddress %}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 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
%}