Quote component renders the quote flow.model.CartData).model.QuoteDetail).Components/Quote/Default.liquidmodel.Settings.Id (string): used as the wrapper id (comp-{{ id }}).model.Settings.CssClass (string, optional): additional classes on the wrapper.{
"state": "Create",
"cartData": {
"id": "Cart Id",
"token": "Cart Token",
"companyId": "Company Id",
"customerId": "Customer Id",
"finalPrice": 98.89,
"finalPriceText": "98,89 €",
"netValue": 89.9,
"netValueText": "89,90 €",
"vatValue": 8.99,
"vatValueText": "8,99 €",
"cartItems": [
{
"id": "Cart Line Id",
"productId": "Product Id",
"productVariantId": "Variant Id",
"quantity": 1,
"productTitle": "Sample title",
"link": "sample-alias",
"imageLink": "https://example.com/sample",
"masterProductImageLink": "https://example.com/sample",
"unitId": "Unit Id",
"unitText": "Sample unit",
"categoryId": "Category Id",
"originalPrice": 0,
"originalPriceText": "0,00 €",
"finalPrice": 89.9,
"finalPriceText": "89,90 €",
"subTotalPrice": 98.89,
"subTotalPriceText": "98,89 €",
"subTotalNetValue": 89.9,
"subTotalVatValue": 8.99,
"quantityConstraints": {
"additive": {
"minimum": 1,
"maximum": 999998,
"step": 1,
"isValid": true
},
"absolute": {
"minimum": 1,
"maximum": 999999,
"step": 1,
"isValid": true
}
}
}
],
"validation": {
"errors": [],
"isSuccess": true,
"lines": [
{
"lineId": "Cart Line Id",
"isSuccess": true,
"errors": []
}
]
}
},
"quoteDetail": null,
"settings": {
"id": "Component Id",
"cssClass": "(UNDEFINED)"
}
}{
"state": "Get",
"quoteDetail": {
"id": "Quote Id",
"code": "Q20260427-141131392",
"status": "Accepted",
"title": "Sample title",
"notes": "",
"creatorName": "Sample name",
"createdAt": "2026-04-27T14:11:31.394672+00:00",
"finalNetAmount": 417.39,
"finalNetAmountText": "417,39 €",
"initialNetAmount": 419.9,
"initialNetAmountText": "419,90 €",
"vatAmount": 85.13,
"vatAmountText": "85,13 €",
"discountRate": 0.006,
"discountRateText": "0,6 %",
"discountValue": 2.52,
"discountValueText": "2,52 €",
"lines": [
{
"lineId": "Quote Line Id",
"productId": "Product Id",
"productVariantId": "Variant Id",
"sku": "SKU-0000",
"title": "Sample title",
"link": "product/sample-alias",
"imageLink": "https://example.com/sample",
"quantity": 2,
"initialPricePerItem": 100,
"initialPricePerItemText": "100,00 €",
"finalPricePerItem": 99.25,
"finalPricePerItemText": "99,25 €",
"netValue": 198.5,
"netValueText": "198,50 €",
"lineValue": 198.5,
"lineValueText": "198,50 €",
"initialLineValue": 200,
"initialLineValueText": "200,00 €",
"vatRate": 23,
"vatValue": 46,
"vatValueText": "46,00 €",
"discountRate": 0.0075,
"discountRateText": "0,75 %",
"discountValue": 1.5,
"discountValueText": "1,50 €",
"discountValuePerItem": 0.75,
"discountValuePerItemText": "0,75 €",
"categoryId": "Category Id",
"brandId": "Brand Id",
"unitId": "Unit Id",
"masterProductImageLink": "https://example.com/sample",
"minOrderQuantity": 1,
"startQuantity": 12
}
],
"validation": {
"errors": [],
"isSuccess": true,
"lines": [
{
"lineId": "Quote Line Id",
"isSuccess": true,
"errors": []
}
]
}
},
"cartData": null,
"settings": {
"id": "Component Id",
"cssClass": "(UNDEFINED)"
}
}model.StateState=Create: model.CartData (expects cartItems to exist)State=Get: model.QuoteDetail (expects lines to exist)model.Settings.CssClassmodel.QuoteDetail / model.CartData may include a validation object.Components/Quote/Default.liquid.modelData based on model.State:Create uses model.CartDataGet uses model.QuoteDetailx-data='quotedefault.initComponent({{ modelData | serialize | escape }})'$store.quote.quoteData as the client-side source of truth.Alpine.store("quote").quoteData as the client-side source of truth.$store.quote.quoteData directly.$store.quote store is expected to exist at runtime.validation.isSuccess == false.quotedefault.initComponent(data)Components/Quote/Default.js.Alpine.store("quote").quoteData.parseQuoteValidation(...):error.typelineIds per typeComponents/Quote/Default.js.document.querySelector("header").clientHeight.quote-aside { top: <headerHeight>px }handleCreateQuote(...):Alpine.store("modal").open(...).servicesreusabledefault.createQuote(quoteData)./quote/{quoteId}.handleOrderQuote(...):localStorage.quoteToken = Alpine.store("quote").quoteData.id./checkout?quote=<quoteId>.localStorage.quoteData and calls:servicesreusabledefault.updateProductCart(...)servicesreusabledefault.updateProductQuantity(...)Reusables/Services/Default.js (servicesreusabledefault)Alpine.store("quote")Alpine.store("toast")Alpine.store("modal")axiosprepareListProducts(...), sendGAEvent(...)model.Translations) and uses them inside the template and JS.