Shipping reusable renders the shipping carrier selection step in checkout. It lists available carriers, persists the selected shipping line to the checkout via the SDK, and (when a BoxNow carrier is available) integrates the BoxNow locker selection widget.Components/Checkout/Default.liquid:{% render 'Reusables\\Shipping\\Default', carriers: carriers %}carrierscarriers.globalConfig.freeAtPrice/freeAtWeight).$store.checkout.data.shippingOptions (not from the carriers Liquid parameter).carriers (for globalConfig + the initial carrier list)checkout.checkout (to show where shippingLine gets persisted){
"status": "Start",
"checkout": {
"finalPrice": 168,
"finalPriceText": "168,00 €",
"shippingAddress": {
"id": "Address Id",
"firstName": "Sample text",
"lastName": "Sample text",
"phoneNumber": "Sample text",
"address1": "Sample text",
"city": "Sample text",
"state": "Sample text",
"country": "Sample text",
"countryCode": "GR",
"postalCode": "Sample text",
"email": "sample@example.com"
}
},
"carriers": {
"globalConfig": {
"freeAtPriceText": "Sample text",
"freeAtWeightText": "Sample text"
},
"list": [
{
"carrierId": "Carrier Id",
"carrierCode": "sample",
"title": "Sample text",
"type": "Manual",
"totalAmount": 0,
"totalAmountText": "0,00 €",
"logo": {
"id": "Image Id",
"link": "https://example.com/sample"
}
},
...
]
}
}$store.checkout.data.shippingOptions: arraycarrier.idcarrier.type (or shippingLine.type) (used to detect BoxNow)carrier.logo.link (optional)shippingLine object with:carrierIdcarrierCodetitletypenetPricetotalAmount, totalAmountTextvatLinescarriers should include:carriers.globalConfig.freeAtPrice and/or carriers.globalConfig.freeAtWeightcarriers.globalConfig.freeAtPriceText and/or carriers.globalConfig.freeAtWeightTextcarrier.logo.link (when present, an image is rendered)carrier.boxNowPartnerId (when present, sets window._bn_map_widget_config.partnerId for the BoxNow widget)x-data="shippingreusabledefault.initComponent(shippingBoxNowErrorMessage, shippingErrorMessage)"$store.checkout.canShowDetails('shipping') to decide whether to show the step details.carrier in $store.checkout.data.shippingOptions.@change handler calls selectShipping(carrier).#boxnow-widget-trigger).window._bn_map_widget_configboxnow:locker-selected with detail: selected.shippingreusabledefault (in Reusables/Shipping/Default.js).initComponent(shippingBoxNowErrorMessage, shippingErrorMessage)boxNowLockerIdboxNowLockerTitleboxNowLockerNameboxNowError_pendingBoxNowCarrier_bn_widget_loadedselectedCarrierIdboxnow:locker-selected:boxNowLocker*boxNowError_pendingBoxNowCarrier is set, calls submitBoxNowShipping(...)$store.checkout.data:data.shippingOptions becomes available_loadBoxNowWidgetScript()).https://widget-cdn.boxnow.gr/map-widget/client/v5.jscarrier.carrier.type (or carrier.shippingLine.type) equals "BoxNow".shippingOptions entry is a BoxNow carrier.selectedCarrierId against carrier.carrier.id.shippingLine payload including:boxNowLockerId, boxNowLockerTitle, boxNowLockerNameservicesreusabledefault.updateCheckout(updatedCheckoutData, 'shipping')shippingBoxNowErrorMessageboxNowError = trueAlpine.store('checkout').steps['shipping'].valid = trueselectedCarrierId._pendingBoxNowCarrier = carriersteps.shipping.valid = false)shippingshippingLine payload (without locker fields)servicesreusabledefault.updateCheckout(updatedCheckoutData, 'shipping')shippingErrorMessageaddShippingInfo with items from prepareItemsForCheckoutProcess(...).$store.checkoutdata.shippingOptionssteps.shipping.validisUpdating, isReadycanShowDetails(step)currentStep$store.toastremoveAll()add(message, icon, type)servicesreusabledefault.updateCheckout(updatedCheckoutData, 'shipping')Reusables/Shipping/Default.liquidReusables/Shipping/Default.jsReusables/Shipping/Default.jsonComponents/Checkout/Default.liquid$store.checkout$store.toast$store.checkout.data.shippingOptions; the Liquid carriers parameter is only used for the free-shipping informational text.updateCheckout(..., 'shipping') called.disabled and :disabled bindings; runtime behavior is controlled by :disabled="Alpine.store('checkout').isUpdating || !Alpine.store('checkout').isReady".