@dropins/storefront-cart 1.6.0-alpha3 → 1.6.0-alpha4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/api/fragments.d.ts +0 -1
  2. package/api.js +1 -1
  3. package/api.js.map +1 -1
  4. package/chunks/CartSummaryGrid.js +1 -1
  5. package/chunks/CartSummaryGrid.js.map +1 -1
  6. package/chunks/CartSummaryList.js +1 -1
  7. package/chunks/CartSummaryList.js.map +1 -1
  8. package/chunks/CartSummaryTable2.js +1 -1
  9. package/chunks/CartSummaryTable2.js.map +1 -1
  10. package/chunks/EmptyCart.js +1 -1
  11. package/chunks/EmptyCart.js.map +1 -1
  12. package/chunks/EmptyCart2.js +1 -1
  13. package/chunks/EmptyCart2.js.map +1 -1
  14. package/chunks/OrderSummary.js +1 -1
  15. package/chunks/OrderSummary.js.map +1 -1
  16. package/chunks/OrderSummaryLine.js +1 -1
  17. package/chunks/OrderSummaryLine.js.map +1 -1
  18. package/chunks/acdl.js +1 -1
  19. package/chunks/applyCouponsToCart.js +2 -2
  20. package/chunks/applyCouponsToCart.js.map +1 -1
  21. package/chunks/createGuestCart.js +2 -2
  22. package/chunks/createGuestCart.js.map +1 -1
  23. package/chunks/getEstimateShipping.js +2 -2
  24. package/chunks/getEstimateShipping.js.map +1 -1
  25. package/chunks/getEstimatedTotals.js +2 -2
  26. package/chunks/getEstimatedTotals.js.map +1 -1
  27. package/chunks/persisted-data.js +1 -1
  28. package/chunks/refreshCart.js +7 -7
  29. package/chunks/refreshCart.js.map +1 -1
  30. package/chunks/removeGiftCardFromCart.js +3 -3
  31. package/chunks/removeGiftCardFromCart.js.map +1 -1
  32. package/chunks/resetCart.js +1 -1
  33. package/chunks/resetCart.js.map +1 -1
  34. package/chunks/setGiftOptionsOnCart.js +2 -2
  35. package/chunks/setGiftOptionsOnCart.js.map +1 -1
  36. package/chunks/updateProductsFromCart.js +2 -2
  37. package/chunks/updateProductsFromCart.js.map +1 -1
  38. package/components/index.d.ts +0 -1
  39. package/containers/CartSummaryGrid.js +1 -1
  40. package/containers/CartSummaryList.js +1 -1
  41. package/containers/CartSummaryTable.js +1 -1
  42. package/containers/Coupons.js +1 -1
  43. package/containers/Coupons.js.map +1 -1
  44. package/containers/EmptyCart.js +1 -1
  45. package/containers/EstimateShipping.js +1 -1
  46. package/containers/EstimateShipping.js.map +1 -1
  47. package/containers/GiftCards.js +1 -1
  48. package/containers/GiftCards.js.map +1 -1
  49. package/containers/GiftOptions.js +1 -1
  50. package/containers/GiftOptions.js.map +1 -1
  51. package/containers/MiniCart.js +1 -1
  52. package/containers/MiniCart.js.map +1 -1
  53. package/containers/OrderSummary.js +1 -1
  54. package/containers/OrderSummaryLine.js +1 -1
  55. package/containers/index.d.ts +0 -1
  56. package/data/models/cart-model.d.ts +16 -3
  57. package/data/models/shipping-models.d.ts +0 -1
  58. package/fragments.js +7 -30
  59. package/fragments.js.map +1 -1
  60. package/i18n/en_US.json.d.ts +0 -5
  61. package/package.json +1 -1
  62. package/render.js +3 -4
  63. package/render.js.map +1 -1
  64. package/api/graphql/ShippingMethodFragment.d.ts +0 -18
  65. package/chunks/OrderSummaryLine2.js +0 -4
  66. package/chunks/OrderSummaryLine2.js.map +0 -1
  67. package/chunks/ShippingOrderSummaryLine.js +0 -4
  68. package/chunks/ShippingOrderSummaryLine.js.map +0 -1
  69. package/chunks/state.js +0 -4
  70. package/chunks/state.js.map +0 -1
  71. package/components/ShippingOrderSummaryLine/ShippingOrderSummaryLine.d.ts +0 -13
  72. package/components/ShippingOrderSummaryLine/index.d.ts +0 -18
  73. package/containers/ShippingOrderSummaryLine/ShippingOrderSummaryLine.d.ts +0 -7
  74. package/containers/ShippingOrderSummaryLine/index.d.ts +0 -19
  75. package/containers/ShippingOrderSummaryLine.d.ts +0 -3
  76. package/containers/ShippingOrderSummaryLine.js +0 -4
  77. package/containers/ShippingOrderSummaryLine.js.map +0 -1
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
3
- import{jsxs as m,jsx as a}from"@dropins/tools/preact-jsx-runtime.js";import{classes as E,VComponent as I,debounce as $e,Slot as N}from"@dropins/tools/lib.js";import{Button as J,Icon as K,Image as De,Price as D,Skeleton as Ee,SkeletonRow as Me}from"@dropins/tools/components.js";/* empty css */import{useState as fe,useCallback as Ae,useMemo as Qe}from"@dropins/tools/preact-compat.js";import{useState as ee,useCallback as ze,useEffect as Be,useMemo as Ge}from"@dropins/tools/preact-hooks.js";import{useText as te}from"@dropins/tools/i18n.js";import{events as Ce}from"@dropins/tools/event-bus.js";import{s as We}from"./state.js";import{u as ve}from"./updateProductsFromCart.js";import{g as Ie}from"./persisted-data.js";import{a as Ve}from"./createGuestCart.js";import{E as Xe}from"./EmptyCart2.js";import{S as je,a as Re,b as He}from"./Trash.js";import{S as Fe}from"./Close.js";const ae=({entries:n,className:l,...s})=>{const e=te({itemLabel:"Cart.CartSummaryTable.item",priceLabel:"Cart.CartSummaryTable.price",qtyLabel:"Cart.CartSummaryTable.qty",subtotalLabel:"Cart.CartSummaryTable.subtotal",mobilePriceLabel:"Cart.CartSummaryTable.mobilePrice",mobileQtyLabel:"Cart.CartSummaryTable.mobileQty",mobileSubtotalLabel:"Cart.CartSummaryTable.mobileSubtotal"});return m("div",{...s,className:E(["cart-cart-summary-table",l]),children:[m("div",{className:"cart-cart-summary-table__header",children:[a("div",{className:"cart-cart-summary-table__header-item",children:e.itemLabel}),a("div",{className:"cart-cart-summary-table__header-price",children:e.priceLabel}),a("div",{className:"cart-cart-summary-table__header-qty",children:e.qtyLabel}),a("div",{className:"cart-cart-summary-table__header-subtotal",children:e.subtotalLabel})]}),a("div",{className:"cart-cart-summary-table__body",children:n.map(i=>i.undoBanner?a("div",{className:"cart-cart-summary-table__undo-banner",children:a(I,{node:i.undoBanner})},i.uid):m("div",{className:E(["cart-cart-summary-table__row",["cart-cart-summary-table__row--updating",i.updating],["cart-cart-summary-table__row--error",i.hasError]]),children:[a("div",{className:"cart-cart-summary-table__cell-item",children:a(I,{node:i.item})}),m("div",{className:"cart-cart-summary-table__cell-price",children:[a("span",{className:"cart-cart-summary-table__mobile-label",children:e.mobilePriceLabel}),a(I,{node:i.price})]}),m("div",{className:"cart-cart-summary-table__cell-qty",children:[a("span",{className:"cart-cart-summary-table__mobile-label",children:e.mobileQtyLabel}),a(I,{node:i.quantity})]}),m("div",{className:"cart-cart-summary-table__cell-subtotal",children:[a("span",{className:"cart-cart-summary-table__mobile-label",children:e.mobileSubtotalLabel}),a(I,{node:i.subtotal})]}),a("div",{className:"cart-cart-summary-table__item-footer",children:a(I,{className:"cart-cart-summary-table__item-actions",node:i.actions})})]},i.uid))})]})},Je=({className:n,productTitle:l,sku:s,image:e,configurations:i,alert:o,warning:b,...y})=>m("div",{...y,className:E(["cart-cart-summary-table__item",n]),children:[e&&a(I,{className:"cart-cart-summary-table__item-image-wrapper",node:e}),m("div",{className:"cart-cart-summary-table__item-details",children:[l&&a(I,{className:"cart-cart-summary-table__item-name",node:l}),s&&a(I,{className:"cart-cart-summary-table__sku",node:s}),o&&a(I,{className:"cart-cart-summary-table__item-quantity-alert-text",node:o}),b&&a(I,{className:"cart-cart-summary-table__item-quantity-warning-text",node:b}),i&&a(I,{className:"cart-cart-summary-table__item-configurations",node:i})]})]}),Ke=({dictionary:n,onQuantityUpdate:l,onItemRemove:s})=>{var T,k;const[e,i]=fe(new Map),[o,b]=fe(new Map),y=(k=(T=We)==null?void 0:T.config)==null?void 0:k.shoppingCartDisplaySetting,P=(y==null?void 0:y.price)==="INCLUDING_TAX",C=(y==null?void 0:y.price)==="INCLUDING_EXCLUDING_TAX",S=({item:t})=>{const c={...t.bundleOptions,...t.selectedOptions,...t.customizableOptions,...t.recipient?{[n.recipient]:t.recipient}:null,...t.recipientEmail&&t.recipient?{[n.recipient]:`${t.recipient} (${t.recipientEmail})`}:null,...t.sender?{[n.sender]:t.sender}:null,...t.senderEmail&&t.sender?{[n.sender]:`${t.sender} (${t.senderEmail})`}:{},...t.message?{[n.message]:t.message}:null,...t.links&&t.links.count?t.links.count>1?{[n.files.replace("{count}",t.links.count.toString())]:t.links.result}:{[n.file.replace("{count}",t.links.count.toString())]:t.links.result}:null};if(Object.keys(c).length!==0)return c},L=t=>{var c,u,d,p;return P?t.discounted?{amount:t.regularPrice.value,currency:t.regularPrice.currency,"data-testid":"discounted-regular-item-price"}:{amount:(c=t.taxedPrice)==null?void 0:c.value,currency:(u=t.taxedPrice)==null?void 0:u.currency,"data-testid":"taxed-item-price"}:{amount:(d=t.regularPrice)==null?void 0:d.value,currency:(p=t.regularPrice)==null?void 0:p.currency,"data-testid":"regular-item-price"}},U=t=>{var d,p,v,M,A,Q,j,R,H,z;const c={"aria-label":n.regularPrice},u=t.discounted?{}:null;return["INCLUDING_TAX","INCLUDING_EXCLUDING_TAX"].includes(y==null?void 0:y.price)?(c.amount=(d=t.rowTotalIncludingTax)==null?void 0:d.value,c.currency=(p=t.rowTotalIncludingTax)==null?void 0:p.currency,c.variant=t.discounted?"strikethrough":"default",c["data-testid"]="including-tax-item-total",u&&(c.amount=(v=t.total)==null?void 0:v.value,c.currency=(M=t.total)==null?void 0:M.currency,u.amount=(A=t.rowTotalIncludingTax)==null?void 0:A.value,u.currency=(Q=t.rowTotalIncludingTax)==null?void 0:Q.currency,u.sale=!0,u["aria-label"]=n.discountedPrice,u["data-testid"]="discount-total")):(c.amount=(j=t.total)==null?void 0:j.value,c.currency=(R=t.total)==null?void 0:R.currency,c.variant=t.discounted?"strikethrough":"default",c["data-testid"]="regular-item-total",u&&(u.amount=(H=t.discountedTotal)==null?void 0:H.value,u.currency=(z=t.discountedTotal)==null?void 0:z.currency,u.sale=!0,u["aria-label"]=n.regularPrice,u["data-testid"]="discount-total")),{subtotalProps:c,subtotalDiscountProps:u}},f=t=>{var p,v;const c=o.get(t.uid),u=t.insufficientQuantity&&t.stockLevel?t.stockLevel==="noNumber"?n.insufficientQuantityGeneral:n.insufficientQuantity.replace("{inventory}",(p=t.stockLevel)==null?void 0:p.toString()).replace("{count}",t.quantity.toString()):void 0,d=t.lowInventory&&t.onlyXLeftInStock&&n.lowInventory.replace("{count}",(v=t.onlyXLeftInStock)==null?void 0:v.toString());return c||u||d||void 0},q=Ae(async(t,c)=>{const u=(d,p)=>ve([{uid:d.uid,quantity:p}]);if(!(isNaN(c)||t.quantity===c)){b(new Map);try{i(d=>{const p=new Map(d);return p.set(t.uid,{isUpdating:!0,updatedValue:c}),p}),await u(t,c),c===0?s==null||s(t):l==null||l(t,c)}catch(d){i(p=>{const v=new Map(p);return v.delete(t.uid),v}),b(p=>{const v=new Map(p);return v.set(t.uid,d.message),v})}}},[s,l]),w=Qe(()=>$e(q,500),[q]);return{showIncludedTaxPrice:P,showExcludingTaxPrice:C,itemsUpdating:e,itemUpdateErrors:o,getConfiguration:S,getPriceProps:L,getSubtotalProps:U,processQuantityChange:q,debouncedQuantityChange:w,setItemsUpdating:i,getWarningMessage:f,setItemUpdateError:(t,c)=>{b(u=>{const d=new Map(u);return c?d.set(t,c):d.delete(t),d})},handleRemoveItem:t=>(i(c=>{const u=new Map(c);return u.set(t.uid,{isUpdating:!0,updatedValue:0}),u}),ve([{uid:t.uid,quantity:0}]).then(c=>(s==null||s(t),Promise.resolve(c)))),setItemUpdating:(t,c)=>{i(u=>{const d=new Map(u);return d.set(t,{isUpdating:c,updatedValue:c}),d})}}},Ye=({variant:n="primary",className:l,type:s="warning",additionalActions:e,onDismiss:i,heading:o,description:b,icon:y,itemList:P,actionButtonPosition:C,...S})=>{var U,f,q;const L=te({dismiss:"Dropin.InlineAlert.dismissLabel"});return m("div",{...S,className:E(["dropin-in-line-alert",`dropin-in-line-alert--${s}`,`dropin-in-line-alert--${n}`,l]),children:[m("div",{className:"dropin-in-line-alert__heading",children:[m("div",{className:"dropin-in-line-alert__title-container",children:[y&&a(I,{node:y,className:"dropin-in-line-alert__icon"}),a("span",{className:"dropin-in-line-alert__title",children:o})]}),m("div",{className:"dropin-in-line-alert__actions-container",children:[e&&(C==="top"||!C&&e.length<=1)&&a(J,{variant:"tertiary",className:"dropin-in-line-alert__additional-action",onClick:e.length>0?(U=e[0])==null?void 0:U.onClick:void 0,"aria-label":(f=e[0])==null?void 0:f.label,children:(q=e[0])==null?void 0:q.label}),i&&a(J,{icon:a(K,{source:Fe,size:"24",stroke:"2"}),className:"dropin-in-line-alert__dismiss-button",variant:"tertiary",onClick:i,"aria-label":L.dismiss})]})]}),b&&a("p",{className:"dropin-in-line-alert__description",children:b}),a("div",{className:"dropin-in-line-alert__item-list-container",children:P&&a(I,{node:P,className:E(["dropin-in-line-alert__item-list"])})}),e&&(C==="bottom"||!C&&e.length>1)&&a("div",{className:"dropin-in-line-alert__additional-actions-container",children:e.map(w=>a(J,{variant:"tertiary",className:"dropin-in-line-alert__additional-action",onClick:w.onClick,children:w.label},w.label))})]})},Ze=()=>a(Ee,{"data-testid":"cart-summary-table-skeleton",className:"cart-cart-summary-table__skeleton",rowGap:"medium",children:a(Me,{variant:"row",size:"xlarge",fullWidth:!0,lines:4,multilineGap:"small"})}),ea=({initialData:n=null,routeProduct:l,routeEmptyCartCTA:s,slots:e,className:i,allowQuantityUpdates:o=!0,allowRemoveItems:b=!0,onQuantityUpdate:y,onItemRemove:P,undo:C=!1,...S})=>{const[L,U]=ee(!n),[f,q]=ee(n),[w,W]=ee([]),x=te({file:"Cart.CartItem.file",files:"Cart.CartItem.files",heading:"Cart.Cart.heading",message:"Cart.CartItem.message",recipient:"Cart.CartItem.recipient",regularPrice:"Cart.CartItem.regularPrice",discountedPrice:"Cart.CartItem.discountedPrice",sender:"Cart.CartItem.sender",lowInventory:"Cart.CartItem.lowInventory",insufficientQuantity:"Cart.CartItem.insufficientQuantity",insufficientQuantityGeneral:"Cart.CartItem.insufficientQuantityGeneral",outOfStockHeading:"Cart.OutOfStockMessage.heading",outOfStockDescription:"Cart.OutOfStockMessage.message",outOfStockAlert:"Cart.OutOfStockMessage.alert",removeAction:"Cart.OutOfStockMessage.action",notAvailableMessage:"Cart.CartItem.notAvailableMessage",viewMore:"Cart.Cart.viewMore",viewAll:"Cart.Cart.viewAll",discountPercent:"Cart.CartItem.discountPercentage",savingsAmount:"Cart.CartItem.savingsAmount",includingTax:"Cart.CartItem.includingTax",excludingTax:"Cart.CartItem.excludingTax",remove:"Dropin.CartItem.remove.label",removeDefault:"Dropin.CartItem.removeDefault.label",quantity:"Dropin.CartItem.quantity.label",itemBeingRemoved:"Cart.CartItem.itemBeingRemoved",itemRemoved:"Cart.CartItem.itemRemoved",itemRemovedDescription:"Cart.CartItem.itemRemovedDescription",undoAction:"Cart.CartItem.undoAction",dismissAction:"Cart.CartItem.dismissAction"}),{showIncludedTaxPrice:V,showExcludingTaxPrice:X,itemsUpdating:T,itemUpdateErrors:k,getConfiguration:t,getPriceProps:c,getSubtotalProps:u,debouncedQuantityChange:d,setItemsUpdating:p,getWarningMessage:v,handleRemoveItem:M,setItemUpdating:A,setItemUpdateError:Q}=Ke({dictionary:x,onQuantityUpdate:y,onItemRemove:P});function j(h){const r=Ie(),g=r==null?void 0:r.items.find(_=>_.uid===h);g&&W(_=>{const O=r.items.findIndex($=>$.uid===h);return O!==-1&&!_.some($=>$.item.uid===h)?(Ce.emit("cart/product/removed",{item:g,index:O}),[..._,{item:g,index:O,loading:!1,error:void 0}]):_})}const R=aa(w,W),H=ta(W),z=ze(h=>{C&&j(h.uid),M(h)},[C,M]);Be(()=>{const h=Ce.on("cart/data",r=>{U(!0),q(r),p(new Map),U(!1)},{eager:!0});return()=>{h==null||h.off()}},[U,q,p]);const B=Ge(()=>{var h;return((h=f==null?void 0:f.items)==null?void 0:h.sort((r,g)=>k.has(r.uid)&&!k.has(g.uid)?-1:!k.has(r.uid)&&k.has(g.uid)?1:r.outOfStock&&!g.outOfStock?-1:!r.outOfStock&&g.outOfStock?1:0).map((r,g)=>{var se,ue,oe,de,me,be,pe,ge,ye,_e,he;const _=T.has(r.uid),O=v(r),$=a(N,{name:"ProductTitle",slot:e==null?void 0:e.ProductTitle,context:{item:r},children:l?a("a",{href:l(r),children:r.name}):r.name}),F={src:r.image.src,alt:r.image.alt,width:"300",height:"300",params:{width:300}},re=a(De,{"data-testid":`cart-table-item-image-${r.sku}`,loading:g<4?"eager":"lazy",...F}),ke=a(N,{name:"Thumbnail",slot:e==null?void 0:e.Thumbnail,className:"cart-cart-summary-table__item-image-wrapper",context:{item:r,defaultImageProps:{...F,loading:g<4?"eager":"lazy"},index:g},children:l?a("a",{href:l(r),children:re}):re}),Se=a(N,{name:"Sku",slot:e==null?void 0:e.Sku,context:{item:r},children:r.sku}),we=r.outOfStock||e!=null&&e.ItemAlert?a(N,{name:"ItemAlert",slot:e==null?void 0:e.ItemAlert,context:{item:r},children:r.outOfStock&&m("div",{className:"cart-cart-summary-table__item-quantity-alert-wrapper","data-testid":`cart-table-item-quantity-alert-${r.uid}`,children:[a(K,{className:"cart-cart-summary-table__item-quantity-alert-icon",source:je,size:"16"}),a("span",{className:"cart-cart-summary-table__item-quantity-alert-text",children:x.outOfStockAlert})]})}):void 0,Te=O||e!=null&&e.ItemWarning?a(N,{name:"ItemWarning",slot:e==null?void 0:e.ItemWarning,context:{item:r},children:O&&m("div",{className:"cart-cart-summary-table__item-quantity-warning-wrapper","data-testid":`cart-table-item-quantity-warning-${r.uid}`,children:[a(K,{className:"cart-cart-summary-table__item-quantity-warning-icon",source:Re,size:"16"}),a("span",{className:"cart-cart-summary-table__item-quantity-warning-text",children:O})]})}):void 0,Y=t({item:r}),Pe=Y||e!=null&&e.Configurations?a(N,{name:"Configurations",slot:e==null?void 0:e.Configurations,context:{item:r},children:Y&&a("ul",{className:"cart-cart-summary-table__item-configurations","data-testid":`cart-table-item-configurations-${r.sku}`,children:Object.entries(Y).map(([G,Z])=>m("li",{className:"cart-cart-summary-table__item-configuration","data-testid":`cart-table-item-configuration-${G}`,children:[m("span",{className:"cart-cart-summary-table__item-configuration-label",children:[G,":"]}),a("span",{className:"cart-cart-summary-table__item-configuration-value",children:Z})]},G))})}):void 0,{subtotalProps:qe,subtotalDiscountProps:ne}=u(r),ie=(se=T.get(r.uid))==null?void 0:se.updatedValue,ce=_&&!isNaN(ie)?ie:r.quantity,le=G=>{const Z=G.target,Ue=parseInt(Z.value,10);d(r,Ue)},Oe=T.has(r.uid)&&((ue=T.get(r.uid))==null?void 0:ue.updatedValue)===0,Le=a(N,{name:"Actions",slot:e==null?void 0:e.Actions,context:{item:r,itemsUpdating:T,setItemUpdating:A,setItemUpdateError:Q},children:b&&!Oe&&a(J,{variant:"tertiary",size:"medium",className:"cart-cart-summary-table__item-remove-button","data-testid":`cart-table-item-remove-${r.uid}`,icon:a(K,{source:He,size:"32"}),onClick:()=>z(r),"aria-label":((oe=x.remove)==null?void 0:oe.replace("{product}",r.name))||x.removeDefault})});return{key:r.uid,uid:r.uid,updating:_,hasError:r.outOfStock||k.has(r.uid),item:a(N,{name:"Item",slot:e==null?void 0:e.Item,context:{item:r},children:a(Je,{productTitle:$,image:ke,sku:Se,configurations:Pe,alert:we,warning:Te})}),price:m(N,{name:"Price",className:"cart-cart-summary-table__item-price",slot:e==null?void 0:e.Price,context:{item:r},children:[a(D,{...c(r)}),V&&m("span",{className:"cart-cart-summary-table__item-price-tax-label",children:[x.includingTax,": ",a(D,{amount:(de=r.taxedPrice)==null?void 0:de.value,currency:(me=r.taxedPrice)==null?void 0:me.currency})]}),X&&m("span",{className:"cart-cart-summary-table__item-price-tax-label",children:[x.excludingTax,": ",a(D,{amount:(be=r.regularPrice)==null?void 0:be.value,currency:(pe=r.regularPrice)==null?void 0:pe.currency})]})]}),quantity:a(N,{name:"Quantity",className:"cart-cart-summary-table__item-qty",slot:e==null?void 0:e.Quantity,context:{item:r,isUpdating:_,quantityInputValue:ce,handleInputChange:le,itemUpdateErrors:k},children:o?a("input",{id:`cart-table-item-quantity-${r.uid}`,"data-testid":`cart-table-item-quantity-${r.uid}`,type:"number",min:"1",value:ce,disabled:_,"aria-label":x.quantity,className:E(["cart-cart-summary-table__cell-qty-input","cart-cart-summary-table__cell-qty-updater",["cart-cart-summary-table__cell-qty-updater--disabled",_],["cart-cart-summary-table__cell-qty-updater--error",k.has(r.uid)]]),onChange:le}):a("span",{children:r.quantity})}),subtotal:m(N,{name:"Subtotal",className:"cart-cart-summary-table__item-subtotal",slot:e==null?void 0:e.Subtotal,context:{item:r},children:[a(D,{...qe}),ne&&a(D,{...ne}),V&&m("span",{className:"cart-cart-summary-table__item-subtotal-tax-label",children:[x.includingTax,": ",a(D,{amount:(ge=r.rowTotalIncludingTax)==null?void 0:ge.value,currency:(ye=r.rowTotalIncludingTax)==null?void 0:ye.currency})]}),X&&m("span",{className:"cart-cart-summary-table__item-subtotal-tax-label",children:[x.excludingTax,": ",a(D,{amount:(_e=r.rowTotal)==null?void 0:_e.value,currency:(he=r.rowTotal)==null?void 0:he.currency})]})]}),actions:Le}}))||[]},[f,T,o,l,e,k,x,t,b,d,v,c,u,A,Q,V,X,z]);if(L)return a(Ze,{});const Ne=()=>{if(!(f!=null&&f.items))return null;const h=[],r=f.items;for(let g=0;g<=B.length;g++)C&&w.filter(_=>_.index===g).forEach(({item:_,error:O})=>{const $=ra(_.uid,T),F=la({item:_,error:O},_,$,x,R,H,e);h.push({uid:`undo-banner-${_.uid}`,updating:!1,hasError:!1,item:a("div",{}),price:a("div",{}),quantity:a("div",{}),subtotal:a("div",{}),actions:a("div",{}),undoBanner:F})}),g<B.length&&g<r.length&&h.push(B[g]);return a(ae,{entries:h,className:i,...S})},xe=a(N,{name:"EmptyCart",slot:e==null?void 0:e.EmptyCart,context:{},children:a(Xe,{ctaLinkURL:s==null?void 0:s()})});return f!=null&&f.totalQuantity||C&&w.length>0?C?w.length>0?Ne():a(ae,{entries:B,className:i,...S}):a(ae,{entries:B,className:i,...S}):xe};ea.getInitialData=async function(){return Ie()};const aa=(n,l)=>async s=>{l(i=>i.map(o=>o.item.uid===s?{...o,error:void 0}:o));const e=n.find(i=>i.item.uid===s);if(e)try{await Ve([{sku:e.item.sku,parentSku:e.item.topLevelSku,quantity:e.item.quantity,optionsUIDs:e.item.bundleOptionsUIDs||(e.item.selectedOptionsUIDs?Object.values(e.item.selectedOptionsUIDs):void 0),enteredOptions:e.item.customizableOptions?Object.entries(e.item.customizableOptions).map(([i,o])=>({uid:i,value:o})):void 0}]),l(i=>i.filter(o=>o.item.uid!==s))}catch(i){l(o=>o.map(b=>b.item.uid===s?{...b,error:(i==null?void 0:i.message)||"Failed to restore item."}:b))}},ta=n=>l=>{n(s=>s.filter(e=>e.item.uid!==l))},ra=(n,l)=>{var s;return l.has(n)&&((s=l.get(n))==null?void 0:s.updatedValue)===0},na=(n,l,s,e,i,o)=>n?[]:[{label:l.undoAction,onClick:()=>{s(i)},"aria-label":`${l.undoAction} remove ${o}`},{label:l.dismissAction,onClick:()=>{e(i)},"aria-label":`${l.dismissAction} undo for ${o}`}],ia=(n,l)=>()=>n(l),ca=(n,l)=>()=>n(l),la=(n,l,s,e,i,o,b)=>{var S,L;const y=na(s,e,i,o,n.item.uid,n.item.name),P=ia(i,n.item.uid),C=ca(o,n.item.uid);return a(N,{name:"UndoBanner",slot:b==null?void 0:b.UndoBanner,context:{item:n.item,loading:s,error:n.error,onUndo:P,onDismiss:C},children:a(Ye,{type:n.error?"error":"info",heading:s?(S=e.itemBeingRemoved)==null?void 0:S.replace("{product}",l.name):(L=e.itemRemoved)==null?void 0:L.replace("{product}",n.item.name),description:n.error||e.itemRemovedDescription,variant:"primary",actionButtonPosition:"bottom",additionalActions:y},`undo-banner-${n.item.uid}`)},`undo-banner-${n.item.uid}`)};export{ea as C,ta as a,na as b,aa as c,ia as d,ca as e,la as f,ra as g};
3
+ import{jsxs as m,jsx as a}from"@dropins/tools/preact-jsx-runtime.js";import{classes as E,VComponent as I,debounce as $e,Slot as N}from"@dropins/tools/lib.js";import{Button as J,Icon as K,Image as De,Price as D,Skeleton as Ee,SkeletonRow as Me}from"@dropins/tools/components.js";/* empty css */import{useState as fe,useCallback as Ae,useMemo as Qe}from"@dropins/tools/preact-compat.js";import{useState as ee,useCallback as ze,useEffect as Be,useMemo as Ge}from"@dropins/tools/preact-hooks.js";import{useText as te}from"@dropins/tools/i18n.js";import{events as Ce}from"@dropins/tools/event-bus.js";import{s as We}from"./resetCart.js";import{u as ve}from"./updateProductsFromCart.js";import{g as Ie}from"./persisted-data.js";import{a as Ve}from"./createGuestCart.js";import{E as Xe}from"./EmptyCart.js";import{S as je,a as Re,b as He}from"./Trash.js";import{S as Fe}from"./Close.js";const ae=({entries:n,className:l,...s})=>{const e=te({itemLabel:"Cart.CartSummaryTable.item",priceLabel:"Cart.CartSummaryTable.price",qtyLabel:"Cart.CartSummaryTable.qty",subtotalLabel:"Cart.CartSummaryTable.subtotal",mobilePriceLabel:"Cart.CartSummaryTable.mobilePrice",mobileQtyLabel:"Cart.CartSummaryTable.mobileQty",mobileSubtotalLabel:"Cart.CartSummaryTable.mobileSubtotal"});return m("div",{...s,className:E(["cart-cart-summary-table",l]),children:[m("div",{className:"cart-cart-summary-table__header",children:[a("div",{className:"cart-cart-summary-table__header-item",children:e.itemLabel}),a("div",{className:"cart-cart-summary-table__header-price",children:e.priceLabel}),a("div",{className:"cart-cart-summary-table__header-qty",children:e.qtyLabel}),a("div",{className:"cart-cart-summary-table__header-subtotal",children:e.subtotalLabel})]}),a("div",{className:"cart-cart-summary-table__body",children:n.map(i=>i.undoBanner?a("div",{className:"cart-cart-summary-table__undo-banner",children:a(I,{node:i.undoBanner})},i.uid):m("div",{className:E(["cart-cart-summary-table__row",["cart-cart-summary-table__row--updating",i.updating],["cart-cart-summary-table__row--error",i.hasError]]),children:[a("div",{className:"cart-cart-summary-table__cell-item",children:a(I,{node:i.item})}),m("div",{className:"cart-cart-summary-table__cell-price",children:[a("span",{className:"cart-cart-summary-table__mobile-label",children:e.mobilePriceLabel}),a(I,{node:i.price})]}),m("div",{className:"cart-cart-summary-table__cell-qty",children:[a("span",{className:"cart-cart-summary-table__mobile-label",children:e.mobileQtyLabel}),a(I,{node:i.quantity})]}),m("div",{className:"cart-cart-summary-table__cell-subtotal",children:[a("span",{className:"cart-cart-summary-table__mobile-label",children:e.mobileSubtotalLabel}),a(I,{node:i.subtotal})]}),a("div",{className:"cart-cart-summary-table__item-footer",children:a(I,{className:"cart-cart-summary-table__item-actions",node:i.actions})})]},i.uid))})]})},Je=({className:n,productTitle:l,sku:s,image:e,configurations:i,alert:o,warning:b,...y})=>m("div",{...y,className:E(["cart-cart-summary-table__item",n]),children:[e&&a(I,{className:"cart-cart-summary-table__item-image-wrapper",node:e}),m("div",{className:"cart-cart-summary-table__item-details",children:[l&&a(I,{className:"cart-cart-summary-table__item-name",node:l}),s&&a(I,{className:"cart-cart-summary-table__sku",node:s}),o&&a(I,{className:"cart-cart-summary-table__item-quantity-alert-text",node:o}),b&&a(I,{className:"cart-cart-summary-table__item-quantity-warning-text",node:b}),i&&a(I,{className:"cart-cart-summary-table__item-configurations",node:i})]})]}),Ke=({dictionary:n,onQuantityUpdate:l,onItemRemove:s})=>{var T,k;const[e,i]=fe(new Map),[o,b]=fe(new Map),y=(k=(T=We)==null?void 0:T.config)==null?void 0:k.shoppingCartDisplaySetting,P=(y==null?void 0:y.price)==="INCLUDING_TAX",C=(y==null?void 0:y.price)==="INCLUDING_EXCLUDING_TAX",S=({item:t})=>{const c={...t.bundleOptions,...t.selectedOptions,...t.customizableOptions,...t.recipient?{[n.recipient]:t.recipient}:null,...t.recipientEmail&&t.recipient?{[n.recipient]:`${t.recipient} (${t.recipientEmail})`}:null,...t.sender?{[n.sender]:t.sender}:null,...t.senderEmail&&t.sender?{[n.sender]:`${t.sender} (${t.senderEmail})`}:{},...t.message?{[n.message]:t.message}:null,...t.links&&t.links.count?t.links.count>1?{[n.files.replace("{count}",t.links.count.toString())]:t.links.result}:{[n.file.replace("{count}",t.links.count.toString())]:t.links.result}:null};if(Object.keys(c).length!==0)return c},L=t=>{var c,u,d,p;return P?t.discounted?{amount:t.regularPrice.value,currency:t.regularPrice.currency,"data-testid":"discounted-regular-item-price"}:{amount:(c=t.taxedPrice)==null?void 0:c.value,currency:(u=t.taxedPrice)==null?void 0:u.currency,"data-testid":"taxed-item-price"}:{amount:(d=t.regularPrice)==null?void 0:d.value,currency:(p=t.regularPrice)==null?void 0:p.currency,"data-testid":"regular-item-price"}},U=t=>{var d,p,v,M,A,Q,j,R,H,z;const c={"aria-label":n.regularPrice},u=t.discounted?{}:null;return["INCLUDING_TAX","INCLUDING_EXCLUDING_TAX"].includes(y==null?void 0:y.price)?(c.amount=(d=t.rowTotalIncludingTax)==null?void 0:d.value,c.currency=(p=t.rowTotalIncludingTax)==null?void 0:p.currency,c.variant=t.discounted?"strikethrough":"default",c["data-testid"]="including-tax-item-total",u&&(c.amount=(v=t.total)==null?void 0:v.value,c.currency=(M=t.total)==null?void 0:M.currency,u.amount=(A=t.rowTotalIncludingTax)==null?void 0:A.value,u.currency=(Q=t.rowTotalIncludingTax)==null?void 0:Q.currency,u.sale=!0,u["aria-label"]=n.discountedPrice,u["data-testid"]="discount-total")):(c.amount=(j=t.total)==null?void 0:j.value,c.currency=(R=t.total)==null?void 0:R.currency,c.variant=t.discounted?"strikethrough":"default",c["data-testid"]="regular-item-total",u&&(u.amount=(H=t.discountedTotal)==null?void 0:H.value,u.currency=(z=t.discountedTotal)==null?void 0:z.currency,u.sale=!0,u["aria-label"]=n.regularPrice,u["data-testid"]="discount-total")),{subtotalProps:c,subtotalDiscountProps:u}},f=t=>{var p,v;const c=o.get(t.uid),u=t.insufficientQuantity&&t.stockLevel?t.stockLevel==="noNumber"?n.insufficientQuantityGeneral:n.insufficientQuantity.replace("{inventory}",(p=t.stockLevel)==null?void 0:p.toString()).replace("{count}",t.quantity.toString()):void 0,d=t.lowInventory&&t.onlyXLeftInStock&&n.lowInventory.replace("{count}",(v=t.onlyXLeftInStock)==null?void 0:v.toString());return c||u||d||void 0},q=Ae(async(t,c)=>{const u=(d,p)=>ve([{uid:d.uid,quantity:p}]);if(!(isNaN(c)||t.quantity===c)){b(new Map);try{i(d=>{const p=new Map(d);return p.set(t.uid,{isUpdating:!0,updatedValue:c}),p}),await u(t,c),c===0?s==null||s(t):l==null||l(t,c)}catch(d){i(p=>{const v=new Map(p);return v.delete(t.uid),v}),b(p=>{const v=new Map(p);return v.set(t.uid,d.message),v})}}},[s,l]),w=Qe(()=>$e(q,500),[q]);return{showIncludedTaxPrice:P,showExcludingTaxPrice:C,itemsUpdating:e,itemUpdateErrors:o,getConfiguration:S,getPriceProps:L,getSubtotalProps:U,processQuantityChange:q,debouncedQuantityChange:w,setItemsUpdating:i,getWarningMessage:f,setItemUpdateError:(t,c)=>{b(u=>{const d=new Map(u);return c?d.set(t,c):d.delete(t),d})},handleRemoveItem:t=>(i(c=>{const u=new Map(c);return u.set(t.uid,{isUpdating:!0,updatedValue:0}),u}),ve([{uid:t.uid,quantity:0}]).then(c=>(s==null||s(t),Promise.resolve(c)))),setItemUpdating:(t,c)=>{i(u=>{const d=new Map(u);return d.set(t,{isUpdating:c,updatedValue:c}),d})}}},Ye=({variant:n="primary",className:l,type:s="warning",additionalActions:e,onDismiss:i,heading:o,description:b,icon:y,itemList:P,actionButtonPosition:C,...S})=>{var U,f,q;const L=te({dismiss:"Dropin.InlineAlert.dismissLabel"});return m("div",{...S,className:E(["dropin-in-line-alert",`dropin-in-line-alert--${s}`,`dropin-in-line-alert--${n}`,l]),children:[m("div",{className:"dropin-in-line-alert__heading",children:[m("div",{className:"dropin-in-line-alert__title-container",children:[y&&a(I,{node:y,className:"dropin-in-line-alert__icon"}),a("span",{className:"dropin-in-line-alert__title",children:o})]}),m("div",{className:"dropin-in-line-alert__actions-container",children:[e&&(C==="top"||!C&&e.length<=1)&&a(J,{variant:"tertiary",className:"dropin-in-line-alert__additional-action",onClick:e.length>0?(U=e[0])==null?void 0:U.onClick:void 0,"aria-label":(f=e[0])==null?void 0:f.label,children:(q=e[0])==null?void 0:q.label}),i&&a(J,{icon:a(K,{source:Fe,size:"24",stroke:"2"}),className:"dropin-in-line-alert__dismiss-button",variant:"tertiary",onClick:i,"aria-label":L.dismiss})]})]}),b&&a("p",{className:"dropin-in-line-alert__description",children:b}),a("div",{className:"dropin-in-line-alert__item-list-container",children:P&&a(I,{node:P,className:E(["dropin-in-line-alert__item-list"])})}),e&&(C==="bottom"||!C&&e.length>1)&&a("div",{className:"dropin-in-line-alert__additional-actions-container",children:e.map(w=>a(J,{variant:"tertiary",className:"dropin-in-line-alert__additional-action",onClick:w.onClick,children:w.label},w.label))})]})},Ze=()=>a(Ee,{"data-testid":"cart-summary-table-skeleton",className:"cart-cart-summary-table__skeleton",rowGap:"medium",children:a(Me,{variant:"row",size:"xlarge",fullWidth:!0,lines:4,multilineGap:"small"})}),ea=({initialData:n=null,routeProduct:l,routeEmptyCartCTA:s,slots:e,className:i,allowQuantityUpdates:o=!0,allowRemoveItems:b=!0,onQuantityUpdate:y,onItemRemove:P,undo:C=!1,...S})=>{const[L,U]=ee(!n),[f,q]=ee(n),[w,W]=ee([]),x=te({file:"Cart.CartItem.file",files:"Cart.CartItem.files",heading:"Cart.Cart.heading",message:"Cart.CartItem.message",recipient:"Cart.CartItem.recipient",regularPrice:"Cart.CartItem.regularPrice",discountedPrice:"Cart.CartItem.discountedPrice",sender:"Cart.CartItem.sender",lowInventory:"Cart.CartItem.lowInventory",insufficientQuantity:"Cart.CartItem.insufficientQuantity",insufficientQuantityGeneral:"Cart.CartItem.insufficientQuantityGeneral",outOfStockHeading:"Cart.OutOfStockMessage.heading",outOfStockDescription:"Cart.OutOfStockMessage.message",outOfStockAlert:"Cart.OutOfStockMessage.alert",removeAction:"Cart.OutOfStockMessage.action",notAvailableMessage:"Cart.CartItem.notAvailableMessage",viewMore:"Cart.Cart.viewMore",viewAll:"Cart.Cart.viewAll",discountPercent:"Cart.CartItem.discountPercentage",savingsAmount:"Cart.CartItem.savingsAmount",includingTax:"Cart.CartItem.includingTax",excludingTax:"Cart.CartItem.excludingTax",remove:"Dropin.CartItem.remove.label",removeDefault:"Dropin.CartItem.removeDefault.label",quantity:"Dropin.CartItem.quantity.label",itemBeingRemoved:"Cart.CartItem.itemBeingRemoved",itemRemoved:"Cart.CartItem.itemRemoved",itemRemovedDescription:"Cart.CartItem.itemRemovedDescription",undoAction:"Cart.CartItem.undoAction",dismissAction:"Cart.CartItem.dismissAction"}),{showIncludedTaxPrice:V,showExcludingTaxPrice:X,itemsUpdating:T,itemUpdateErrors:k,getConfiguration:t,getPriceProps:c,getSubtotalProps:u,debouncedQuantityChange:d,setItemsUpdating:p,getWarningMessage:v,handleRemoveItem:M,setItemUpdating:A,setItemUpdateError:Q}=Ke({dictionary:x,onQuantityUpdate:y,onItemRemove:P});function j(h){const r=Ie(),g=r==null?void 0:r.items.find(_=>_.uid===h);g&&W(_=>{const O=r.items.findIndex($=>$.uid===h);return O!==-1&&!_.some($=>$.item.uid===h)?(Ce.emit("cart/product/removed",{item:g,index:O}),[..._,{item:g,index:O,loading:!1,error:void 0}]):_})}const R=aa(w,W),H=ta(W),z=ze(h=>{C&&j(h.uid),M(h)},[C,M]);Be(()=>{const h=Ce.on("cart/data",r=>{U(!0),q(r),p(new Map),U(!1)},{eager:!0});return()=>{h==null||h.off()}},[U,q,p]);const B=Ge(()=>{var h;return((h=f==null?void 0:f.items)==null?void 0:h.sort((r,g)=>k.has(r.uid)&&!k.has(g.uid)?-1:!k.has(r.uid)&&k.has(g.uid)?1:r.outOfStock&&!g.outOfStock?-1:!r.outOfStock&&g.outOfStock?1:0).map((r,g)=>{var se,ue,oe,de,me,be,pe,ge,ye,_e,he;const _=T.has(r.uid),O=v(r),$=a(N,{name:"ProductTitle",slot:e==null?void 0:e.ProductTitle,context:{item:r},children:l?a("a",{href:l(r),children:r.name}):r.name}),F={src:r.image.src,alt:r.image.alt,width:"300",height:"300",params:{width:300}},re=a(De,{"data-testid":`cart-table-item-image-${r.sku}`,loading:g<4?"eager":"lazy",...F}),ke=a(N,{name:"Thumbnail",slot:e==null?void 0:e.Thumbnail,className:"cart-cart-summary-table__item-image-wrapper",context:{item:r,defaultImageProps:{...F,loading:g<4?"eager":"lazy"},index:g},children:l?a("a",{href:l(r),children:re}):re}),Se=a(N,{name:"Sku",slot:e==null?void 0:e.Sku,context:{item:r},children:r.sku}),we=r.outOfStock||e!=null&&e.ItemAlert?a(N,{name:"ItemAlert",slot:e==null?void 0:e.ItemAlert,context:{item:r},children:r.outOfStock&&m("div",{className:"cart-cart-summary-table__item-quantity-alert-wrapper","data-testid":`cart-table-item-quantity-alert-${r.uid}`,children:[a(K,{className:"cart-cart-summary-table__item-quantity-alert-icon",source:je,size:"16"}),a("span",{className:"cart-cart-summary-table__item-quantity-alert-text",children:x.outOfStockAlert})]})}):void 0,Te=O||e!=null&&e.ItemWarning?a(N,{name:"ItemWarning",slot:e==null?void 0:e.ItemWarning,context:{item:r},children:O&&m("div",{className:"cart-cart-summary-table__item-quantity-warning-wrapper","data-testid":`cart-table-item-quantity-warning-${r.uid}`,children:[a(K,{className:"cart-cart-summary-table__item-quantity-warning-icon",source:Re,size:"16"}),a("span",{className:"cart-cart-summary-table__item-quantity-warning-text",children:O})]})}):void 0,Y=t({item:r}),Pe=Y||e!=null&&e.Configurations?a(N,{name:"Configurations",slot:e==null?void 0:e.Configurations,context:{item:r},children:Y&&a("ul",{className:"cart-cart-summary-table__item-configurations","data-testid":`cart-table-item-configurations-${r.sku}`,children:Object.entries(Y).map(([G,Z])=>m("li",{className:"cart-cart-summary-table__item-configuration","data-testid":`cart-table-item-configuration-${G}`,children:[m("span",{className:"cart-cart-summary-table__item-configuration-label",children:[G,":"]}),a("span",{className:"cart-cart-summary-table__item-configuration-value",children:Z})]},G))})}):void 0,{subtotalProps:qe,subtotalDiscountProps:ne}=u(r),ie=(se=T.get(r.uid))==null?void 0:se.updatedValue,ce=_&&!isNaN(ie)?ie:r.quantity,le=G=>{const Z=G.target,Ue=parseInt(Z.value,10);d(r,Ue)},Oe=T.has(r.uid)&&((ue=T.get(r.uid))==null?void 0:ue.updatedValue)===0,Le=a(N,{name:"Actions",slot:e==null?void 0:e.Actions,context:{item:r,itemsUpdating:T,setItemUpdating:A,setItemUpdateError:Q},children:b&&!Oe&&a(J,{variant:"tertiary",size:"medium",className:"cart-cart-summary-table__item-remove-button","data-testid":`cart-table-item-remove-${r.uid}`,icon:a(K,{source:He,size:"32"}),onClick:()=>z(r),"aria-label":((oe=x.remove)==null?void 0:oe.replace("{product}",r.name))||x.removeDefault})});return{key:r.uid,uid:r.uid,updating:_,hasError:r.outOfStock||k.has(r.uid),item:a(N,{name:"Item",slot:e==null?void 0:e.Item,context:{item:r},children:a(Je,{productTitle:$,image:ke,sku:Se,configurations:Pe,alert:we,warning:Te})}),price:m(N,{name:"Price",className:"cart-cart-summary-table__item-price",slot:e==null?void 0:e.Price,context:{item:r},children:[a(D,{...c(r)}),V&&m("span",{className:"cart-cart-summary-table__item-price-tax-label",children:[x.includingTax,": ",a(D,{amount:(de=r.taxedPrice)==null?void 0:de.value,currency:(me=r.taxedPrice)==null?void 0:me.currency})]}),X&&m("span",{className:"cart-cart-summary-table__item-price-tax-label",children:[x.excludingTax,": ",a(D,{amount:(be=r.regularPrice)==null?void 0:be.value,currency:(pe=r.regularPrice)==null?void 0:pe.currency})]})]}),quantity:a(N,{name:"Quantity",className:"cart-cart-summary-table__item-qty",slot:e==null?void 0:e.Quantity,context:{item:r,isUpdating:_,quantityInputValue:ce,handleInputChange:le,itemUpdateErrors:k},children:o?a("input",{id:`cart-table-item-quantity-${r.uid}`,"data-testid":`cart-table-item-quantity-${r.uid}`,type:"number",min:"1",value:ce,disabled:_,"aria-label":x.quantity,className:E(["cart-cart-summary-table__cell-qty-input","cart-cart-summary-table__cell-qty-updater",["cart-cart-summary-table__cell-qty-updater--disabled",_],["cart-cart-summary-table__cell-qty-updater--error",k.has(r.uid)]]),onChange:le}):a("span",{children:r.quantity})}),subtotal:m(N,{name:"Subtotal",className:"cart-cart-summary-table__item-subtotal",slot:e==null?void 0:e.Subtotal,context:{item:r},children:[a(D,{...qe}),ne&&a(D,{...ne}),V&&m("span",{className:"cart-cart-summary-table__item-subtotal-tax-label",children:[x.includingTax,": ",a(D,{amount:(ge=r.rowTotalIncludingTax)==null?void 0:ge.value,currency:(ye=r.rowTotalIncludingTax)==null?void 0:ye.currency})]}),X&&m("span",{className:"cart-cart-summary-table__item-subtotal-tax-label",children:[x.excludingTax,": ",a(D,{amount:(_e=r.rowTotal)==null?void 0:_e.value,currency:(he=r.rowTotal)==null?void 0:he.currency})]})]}),actions:Le}}))||[]},[f,T,o,l,e,k,x,t,b,d,v,c,u,A,Q,V,X,z]);if(L)return a(Ze,{});const Ne=()=>{if(!(f!=null&&f.items))return null;const h=[],r=f.items;for(let g=0;g<=B.length;g++)C&&w.filter(_=>_.index===g).forEach(({item:_,error:O})=>{const $=ra(_.uid,T),F=la({item:_,error:O},_,$,x,R,H,e);h.push({uid:`undo-banner-${_.uid}`,updating:!1,hasError:!1,item:a("div",{}),price:a("div",{}),quantity:a("div",{}),subtotal:a("div",{}),actions:a("div",{}),undoBanner:F})}),g<B.length&&g<r.length&&h.push(B[g]);return a(ae,{entries:h,className:i,...S})},xe=a(N,{name:"EmptyCart",slot:e==null?void 0:e.EmptyCart,context:{},children:a(Xe,{ctaLinkURL:s==null?void 0:s()})});return f!=null&&f.totalQuantity||C&&w.length>0?C?w.length>0?Ne():a(ae,{entries:B,className:i,...S}):a(ae,{entries:B,className:i,...S}):xe};ea.getInitialData=async function(){return Ie()};const aa=(n,l)=>async s=>{l(i=>i.map(o=>o.item.uid===s?{...o,error:void 0}:o));const e=n.find(i=>i.item.uid===s);if(e)try{await Ve([{sku:e.item.sku,parentSku:e.item.topLevelSku,quantity:e.item.quantity,optionsUIDs:e.item.bundleOptionsUIDs||(e.item.selectedOptionsUIDs?Object.values(e.item.selectedOptionsUIDs):void 0),enteredOptions:e.item.customizableOptions?Object.entries(e.item.customizableOptions).map(([i,o])=>({uid:i,value:o})):void 0}]),l(i=>i.filter(o=>o.item.uid!==s))}catch(i){l(o=>o.map(b=>b.item.uid===s?{...b,error:(i==null?void 0:i.message)||"Failed to restore item."}:b))}},ta=n=>l=>{n(s=>s.filter(e=>e.item.uid!==l))},ra=(n,l)=>{var s;return l.has(n)&&((s=l.get(n))==null?void 0:s.updatedValue)===0},na=(n,l,s,e,i,o)=>n?[]:[{label:l.undoAction,onClick:()=>{s(i)},"aria-label":`${l.undoAction} remove ${o}`},{label:l.dismissAction,onClick:()=>{e(i)},"aria-label":`${l.dismissAction} undo for ${o}`}],ia=(n,l)=>()=>n(l),ca=(n,l)=>()=>n(l),la=(n,l,s,e,i,o,b)=>{var S,L;const y=na(s,e,i,o,n.item.uid,n.item.name),P=ia(i,n.item.uid),C=ca(o,n.item.uid);return a(N,{name:"UndoBanner",slot:b==null?void 0:b.UndoBanner,context:{item:n.item,loading:s,error:n.error,onUndo:P,onDismiss:C},children:a(Ye,{type:n.error?"error":"info",heading:s?(S=e.itemBeingRemoved)==null?void 0:S.replace("{product}",l.name):(L=e.itemRemoved)==null?void 0:L.replace("{product}",n.item.name),description:n.error||e.itemRemovedDescription,variant:"primary",actionButtonPosition:"bottom",additionalActions:y},`undo-banner-${n.item.uid}`)},`undo-banner-${n.item.uid}`)};export{ea as C,ta as a,na as b,aa as c,ia as d,ca as e,la as f,ra as g};
4
4
  //# sourceMappingURL=CartSummaryTable2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CartSummaryTable2.js","sources":["/@dropins/storefront-cart/src/components/CartSummaryTable/CartSummaryTable.tsx","/@dropins/storefront-cart/src/components/CartSummaryTable/Elements/Item/Item.tsx","/@dropins/storefront-cart/src/hooks/useCartItems.ts","../../node_modules/@adobe-commerce/elsie/src/components/InLineAlert/InLineAlert.tsx","/@dropins/storefront-cart/src/containers/CartSummaryTable/CartSummaryTable.tsx"],"sourcesContent":["/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\n/**\n * CartSummaryTable is a responsive grid-based component that displays cart items in a table-like format.\n * It adapts to mobile views by switching to a stacked layout with labeled sections.\n * \n * @component\n */\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport '@/cart/components/CartSummaryTable/CartSummaryTable.css';\n\n/**\n * Represents a single row entry in the cart summary table\n * Each field accepts a VNode to allow for flexible content rendering\n */\nexport interface CartTableEntry {\n /** The item UID */\n uid: string;\n /** Whether the item is updating */\n updating: boolean;\n /** Whether the item has an update error */\n hasError: boolean;\n /** The product details section (typically includes image, name, and options) */\n item: VNode;\n /** The unit price of the product */\n price: VNode;\n /** The quantity selector/display */\n quantity: VNode;\n /** The total price for this line item */\n subtotal: VNode;\n /** Actions bar on the bottom of the row */\n actions: VNode;\n /** Optional undo banner for removed items */\n undoBanner?: VNode;\n}\n\n/**\n * Props for the CartSummaryTable component\n */\nexport interface CartSummaryTableProps extends HTMLAttributes<HTMLDivElement> {\n /** Array of cart entries to display in the table */\n entries: CartTableEntry[];\n /** Optional CSS class name for custom styling */\n className?: string;\n}\n\n/**\n * CartSummaryTable component displays cart items in a responsive grid layout\n * - Uses CSS Grid for layout with 4 columns on desktop\n * - Switches to a stacked single-column layout on mobile with labeled sections\n * - Renders each entry's content using VComponent for proper component handling\n */\nexport const CartSummaryTable: FunctionComponent<CartSummaryTableProps> = ({\n entries,\n className,\n ...props\n}) => {\n const dictionary = useText({\n itemLabel: 'Cart.CartSummaryTable.item',\n priceLabel: 'Cart.CartSummaryTable.price',\n qtyLabel: 'Cart.CartSummaryTable.qty',\n subtotalLabel: 'Cart.CartSummaryTable.subtotal',\n mobilePriceLabel: 'Cart.CartSummaryTable.mobilePrice',\n mobileQtyLabel: 'Cart.CartSummaryTable.mobileQty',\n mobileSubtotalLabel: 'Cart.CartSummaryTable.mobileSubtotal'\n });\n\n return (\n <div {...props} className={classes(['cart-cart-summary-table', className])}>\n {/* Table header - hidden on mobile */}\n <div className=\"cart-cart-summary-table__header\">\n <div className=\"cart-cart-summary-table__header-item\">{dictionary.itemLabel}</div>\n <div className=\"cart-cart-summary-table__header-price\">{dictionary.priceLabel}</div>\n <div className=\"cart-cart-summary-table__header-qty\">{dictionary.qtyLabel}</div>\n <div className=\"cart-cart-summary-table__header-subtotal\">{dictionary.subtotalLabel}</div>\n </div>\n {/* Table body - adapts to grid layout on mobile */}\n <div className=\"cart-cart-summary-table__body\">\n {entries.map((entry) => {\n // If this entry is an undo banner, render it as a full-width banner\n if (entry.undoBanner) {\n return (\n <div key={entry.uid} className=\"cart-cart-summary-table__undo-banner\">\n <VComponent node={entry.undoBanner} />\n </div>\n );\n }\n \n // Otherwise render as a regular table row\n return (\n <div key={entry.uid} className={classes([\n 'cart-cart-summary-table__row',\n [ 'cart-cart-summary-table__row--updating', entry.updating ],\n [ 'cart-cart-summary-table__row--error', entry.hasError ],\n ])}\n >\n <div className=\"cart-cart-summary-table__cell-item\">\n <VComponent node={entry.item} />\n </div>\n <div className=\"cart-cart-summary-table__cell-price\">\n <span className=\"cart-cart-summary-table__mobile-label\">{dictionary.mobilePriceLabel}</span>\n <VComponent node={entry.price} />\n </div>\n <div className=\"cart-cart-summary-table__cell-qty\">\n <span className=\"cart-cart-summary-table__mobile-label\">{dictionary.mobileQtyLabel}</span>\n <VComponent node={entry.quantity} />\n </div>\n <div className=\"cart-cart-summary-table__cell-subtotal\">\n <span className=\"cart-cart-summary-table__mobile-label\">{dictionary.mobileSubtotalLabel}</span>\n <VComponent node={entry.subtotal} />\n </div>\n <div className=\"cart-cart-summary-table__item-footer\">\n <VComponent className=\"cart-cart-summary-table__item-actions\" node={entry.actions} />\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n \nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\nimport '@/cart/components/CartSummaryTable/Elements/Item/Item.css';\n\nexport interface ItemProps extends HTMLAttributes<HTMLDivElement> {\n productTitle: VNode;\n sku?: VNode;\n image?: VNode;\n configurations?: VNode;\n alert?: VNode;\n warning?: VNode;\n}\n\nexport const Item: FunctionComponent<ItemProps> = ({\n className,\n productTitle,\n sku,\n image,\n configurations,\n alert,\n warning,\n ...props\n}) => {\n return (\n <div {...props} className={classes(['cart-cart-summary-table__item', className])}>\n {image && <VComponent className=\"cart-cart-summary-table__item-image-wrapper\" node={image} />}\n <div className=\"cart-cart-summary-table__item-details\">\n {productTitle && <VComponent className=\"cart-cart-summary-table__item-name\" node={productTitle} />}\n {sku && <VComponent className=\"cart-cart-summary-table__sku\" node={sku} />}\n {alert && <VComponent className=\"cart-cart-summary-table__item-quantity-alert-text\" node={alert} />}\n {warning && <VComponent className=\"cart-cart-summary-table__item-quantity-warning-text\" node={warning} />}\n {configurations && <VComponent className=\"cart-cart-summary-table__item-configurations\" node={configurations} />}\n </div>\n </div>\n );\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\n/**\n * This hook provides an API for getting calculated cart items data.\n */\n\nimport { useState, useCallback, useMemo } from 'preact/compat';\nimport { CartModel } from '../data/models';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { state } from '@/cart/lib/state';\nimport { PriceProps } from '@adobe-commerce/elsie/components/Price';\nimport { updateProductsFromCart } from '@/cart/api';\nimport { debounce } from '@adobe-commerce/elsie/lib';\n\n\n/**\n * Params for the useCartItems hook\n * \n * @param {\n * dictionary: ReturnType<typeof useText>;\n * onQuantityUpdate?: (item: CartModel['items'][number], quantity: number) => void;\n * onItemRemove?: (item: CartModel['items'][number]) => void;\n * }\n * \n * dictionary - The dictionary\n * onQuantityUpdate - The function to call when the quantity is updated\n * onItemRemove - The function to call when the item is removed\n */\nexport interface useCartItemsProps {\n dictionary: ReturnType<typeof useText>;\n onQuantityUpdate?: (item: CartModel['items'][number], quantity: number) => void;\n onItemRemove?: (item: CartModel['items'][number]) => void;\n}\n\n/**\n * Params for the getConfiguration function\n */\ninterface GetConfigurationParams {\n item: CartModel['items'][number];\n}\n\ninterface ItemUpdateState {\n isUpdating: boolean;\n updatedValue: any;\n}\n\n/**\n * Type for the API returned by useCartItems\n *\n * This interface ensures that the returned object from the hook is well-typed and clear for consumers.\n */\nexport interface UseCartItemsApi {\n showIncludedTaxPrice: boolean; // Whether to show prices including tax\n showExcludingTaxPrice: boolean; // Whether to show prices excluding tax\n itemsUpdating: Map<string, ItemUpdateState>; // Tracks which items are currently being updated\n itemUpdateErrors: Map<string, string>; // Tracks update errors for each item\n getConfiguration: (params: GetConfigurationParams) => object | undefined; // Returns configuration details for a cart item\n getPriceProps: (item: CartModel['items'][number]) => PriceProps; // Returns price display props for a cart item\n getSubtotalProps: (item: CartModel['items'][number]) => { subtotalProps: PriceProps; subtotalDiscountProps: PriceProps | null }; // Returns subtotal and discount subtotal props\n processQuantityChange: (item: CartModel['items'][number], value: number) => Promise<void>; // Handles quantity change with state and error management\n debouncedQuantityChange: (item: CartModel['items'][number], value: number) => void; // Debounced version of processQuantityChange\n setItemsUpdating: (itemsUpdating: Map<string, ItemUpdateState>) => void; // Allows external setting of updating state\n getWarningMessage: (item: CartModel['items'][number]) => string | undefined; // Returns warning message for a cart item\n setItemUpdateError: (uid: string, error: string) => void; // Sets or clears update error for an item\n handleRemoveItem: (item: CartModel['items'][number]) => Promise<CartModel | null>; // Removes an item from the cart\n setItemUpdating: (uid: string, state: boolean) => void; // Sets updating state for a specific item\n}\n\n/**\n * useCartItems hook\n *\n * Provides an API for managing and retrieving calculated cart items data, including price, subtotal, configuration, quantity updates, and error handling.\n *\n * @param {Object} params\n * @param {ReturnType<typeof useText>} params.dictionary - The i18n dictionary\n * @param {(item: CartModel['items'][number], quantity: number) => void} [params.onQuantityUpdate] - Callback when item quantity is updated\n * @param {(item: CartModel['items'][number]) => void} [params.onItemRemove] - Callback when item is removed\n *\n * @returns {Object} API for cart item management:\n * - showIncludedTaxPrice: boolean\n * - showExcludingTaxPrice: boolean\n * - itemsUpdating: Map<string, ItemUpdateState>\n * - itemUpdateErrors: Map<string, string>\n * - getConfiguration(item): object | undefined\n * - getPriceProps(item): PriceProps\n * - getSubtotalProps(item): { subtotalProps: PriceProps, subtotalDiscountProps: PriceProps | null }\n * - processQuantityChange(item, value): Promise<void>\n * - debouncedQuantityChange(item, value): void\n * - setItemsUpdating(map): void\n * - getWarningMessage(item): string | undefined\n * - setItemUpdateError(uid, error): void\n * - handleRemoveItem(item): Promise<CartModel>\n * - setItemUpdating(uid, state): void\n */\nexport const useCartItems = ({ dictionary, onQuantityUpdate, onItemRemove }: useCartItemsProps): UseCartItemsApi => {\n // State for tracking which items are being updated (e.g., quantity change in progress)\n const [itemsUpdating, setItemsUpdating] = useState<Map<string, ItemUpdateState>>(new Map());\n // State for tracking errors related to item updates\n const [itemUpdateErrors, setItemUpdateErrors] = useState<Map<string, string>>(new Map());\n\n // Get cart display settings (e.g., tax display mode) from global state\n const cartSettings = state?.config?.shoppingCartDisplaySetting;\n\n // Determine which price display modes are active\n const showIncludedTaxPrice = cartSettings?.price === 'INCLUDING_TAX';\n const showExcludingTaxPrice = cartSettings?.price === 'INCLUDING_EXCLUDING_TAX';\n\n /**\n * Returns a configuration object for the cart item, combining bundle, selected, and customizable options, as well as recipient/sender info.\n * Returns undefined if there is no configuration to show.\n */\n const getConfiguration = ({ item }: GetConfigurationParams) => {\n // Merge all possible configuration sources into a single object\n const configuration = {\n ...item.bundleOptions,\n ...item.selectedOptions,\n ...item.customizableOptions,\n // Add recipient/sender info if present\n ...(item.recipient ? { [dictionary.recipient]: item.recipient } : null),\n ...(item.recipientEmail && item.recipient\n ? {\n [dictionary.recipient]: `${item.recipient} (${item.recipientEmail})`,\n }\n : null),\n ...(item.sender ? { [dictionary.sender]: item.sender } : null),\n ...(item.senderEmail && item.sender\n ? {\n [dictionary.sender]: `${item.sender} (${item.senderEmail})`,\n }\n : {}),\n ...(item.message ? { [dictionary.message]: item.message } : null),\n // Add file/link info if present\n ...(item.links && item.links.count\n ? item.links.count > 1\n ? {\n [dictionary.files.replace(\n '{count}',\n item.links.count.toString()\n )]: item.links.result,\n }\n : {\n [dictionary.file.replace('{count}', item.links.count.toString())]:\n item.links.result,\n }\n : null),\n };\n\n // If no configuration, return undefined\n if (Object.keys(configuration).length === 0) {\n return undefined;\n }\n\n return configuration;\n };\n\n /**\n * Returns price props for the cart item, depending on tax and discount settings.\n * Used for rendering the price in the UI.\n */\n const getPriceProps = (item: CartModel['items'][number]) => {\n return showIncludedTaxPrice\n ? item.discounted\n ? {\n amount: item.regularPrice.value,\n currency: item.regularPrice.currency,\n 'data-testid': 'discounted-regular-item-price',\n }\n : {\n amount: item.taxedPrice?.value,\n currency: item.taxedPrice?.currency,\n 'data-testid': 'taxed-item-price',\n }\n : {\n amount: item.regularPrice?.value,\n currency: item.regularPrice?.currency,\n 'data-testid': 'regular-item-price',\n };\n };\n\n /**\n * Returns subtotal and discount subtotal props for the cart item.\n * Used for rendering the subtotal and any discount in the UI.\n */\n const getSubtotalProps = (item: CartModel['items'][number]) => {\n const subtotalProps: PriceProps = {\n 'aria-label': dictionary.regularPrice,\n };\n // If the item is discounted, prepare a separate object for the discount subtotal\n const subtotalDiscountProps: PriceProps | null = item.discounted ? {} : null;\n\n if (\n ['INCLUDING_TAX', 'INCLUDING_EXCLUDING_TAX'].includes(\n cartSettings?.price as string\n )\n ) {\n subtotalProps['amount'] = item.rowTotalIncludingTax?.value;\n subtotalProps['currency'] = item.rowTotalIncludingTax?.currency;\n subtotalProps['variant'] = item.discounted ? 'strikethrough' : 'default';\n // @ts-ignore: data-testid is used for testing\n subtotalProps['data-testid'] = 'including-tax-item-total';\n\n if (subtotalDiscountProps) {\n // If discounted, show the original total as the discount\n subtotalProps['amount'] = item.total?.value;\n subtotalProps['currency'] = item.total?.currency;\n\n subtotalDiscountProps['amount'] = item.rowTotalIncludingTax?.value;\n subtotalDiscountProps['currency'] = item.rowTotalIncludingTax?.currency;\n subtotalDiscountProps['sale'] = true;\n subtotalDiscountProps['aria-label'] = dictionary.discountedPrice;\n // @ts-ignore: data-testid is used for testing\n subtotalDiscountProps['data-testid'] = 'discount-total';\n }\n } else {\n subtotalProps['amount'] = item.total?.value;\n subtotalProps['currency'] = item.total?.currency;\n subtotalProps['variant'] = item.discounted ? 'strikethrough' : 'default';\n // @ts-ignore: data-testid is used for testing\n subtotalProps['data-testid'] = 'regular-item-total';\n\n if (subtotalDiscountProps) {\n subtotalDiscountProps['amount'] = item.discountedTotal?.value;\n subtotalDiscountProps['currency'] = item.discountedTotal?.currency;\n subtotalDiscountProps['sale'] = true;\n subtotalDiscountProps['aria-label'] = dictionary.regularPrice;\n // @ts-ignore: data-testid is used for testing\n subtotalDiscountProps['data-testid'] = 'discount-total';\n }\n }\n\n return {\n subtotalProps,\n subtotalDiscountProps,\n };\n };\n\n /**\n * Returns a warning message for the cart item, based on update errors, insufficient quantity, or low inventory.\n * Returns undefined if there is no warning.\n */\n const getWarningMessage = (item: CartModel['items'][number]) => {\n // Check for update error first\n const updateErrorMessage = itemUpdateErrors.get(item.uid);\n\n // Check for insufficient quantity\n const insufficientQuantityText = item.insufficientQuantity && item.stockLevel\n ? item.stockLevel === 'noNumber'\n ? dictionary.insufficientQuantityGeneral // No stock level set\n : dictionary.insufficientQuantity // Stock level set\n .replace('{inventory}', item.stockLevel?.toString())\n .replace('{count}', item.quantity.toString())\n : undefined; // Could not generate insufficient quantity text\n\n // Check for low inventory\n const lowInventoryText = item.lowInventory &&\n item.onlyXLeftInStock &&\n dictionary.lowInventory.replace(\n '{count}',\n item.onlyXLeftInStock?.toString()\n );\n\n // Return the first warning found, or undefined\n return updateErrorMessage || insufficientQuantityText || lowInventoryText || undefined;\n };\n\n /**\n * Processes a quantity change for the cart item, updating state and handling errors.\n * Handles optimistic UI updates and error state.\n */\n const processQuantityChange = useCallback(\n async (item: CartModel['items'][number], value: number) => {\n\n /**\n * Updates the quantity for the cart item in the backend.\n * This function is used internally by processQuantityChange.\n */\n const handleQuantityChange = (item: CartModel['items'][number], quantity: number) => {\n return updateProductsFromCart([\n {\n uid: item.uid,\n quantity,\n },\n ]);\n };\n\n if (isNaN(value) || item.quantity === value) {\n return;\n }\n\n // Clear all item update errors before processing\n setItemUpdateErrors(new Map());\n\n try {\n // Mark item as updating\n setItemsUpdating((prev) => {\n const next = new Map(prev);\n next.set(item.uid, { isUpdating: true, updatedValue: value });\n return next;\n });\n\n await handleQuantityChange(item, value);\n\n // Callbacks for item removal or quantity update\n if (value === 0) {\n onItemRemove?.(item);\n } else {\n onQuantityUpdate?.(item, value);\n }\n } catch (error: any) {\n // Remove updating state and set error message\n setItemsUpdating((prev) => {\n const next = new Map(prev);\n next.delete(item.uid);\n return next;\n });\n setItemUpdateErrors((prev) => {\n const next = new Map(prev);\n next.set(item.uid, error.message);\n return next;\n });\n }\n },\n [onItemRemove, onQuantityUpdate]\n );\n\n /**\n * Debounced version of processQuantityChange (500ms delay).\n * Use this to avoid rapid API calls when the user is typing or clicking quickly.\n */\n const debouncedQuantityChange = useMemo(\n () => debounce(processQuantityChange, 500),\n [processQuantityChange]\n );\n\n /**\n * Removes the item from the cart (sets quantity to 0).\n * Also updates the UI state to reflect the removal.\n */\n const handleRemoveItem = (item: CartModel['items'][number]) => {\n setItemsUpdating((prev) => {\n const next = new Map(prev);\n next.set(item.uid, { isUpdating: true, updatedValue: 0 });\n return next;\n });\n return updateProductsFromCart([\n {\n uid: item.uid,\n quantity: 0,\n },\n ]).then((data) => {\n onItemRemove?.(item);\n return Promise.resolve(data);\n });\n };\n\n /**\n * Sets the updating state for a specific cart item.\n * Used to manually mark an item as updating or not.\n */\n const setItemUpdating = (uid: string, state: boolean) => {\n setItemsUpdating((prev) => {\n const next = new Map(prev);\n next.set(uid, { isUpdating: state, updatedValue: state });\n return next;\n });\n };\n\n /**\n * Sets or clears the update error for a specific cart item.\n * Pass an error string to set, or an empty string to clear.\n */\n const setItemUpdateError = (uid: string, error: string) => {\n setItemUpdateErrors((prev) => {\n const next = new Map(prev);\n if (error) {\n next.set(uid, error);\n } else {\n next.delete(uid);\n }\n return next;\n });\n };\n\n // Construct the API object to return from the hook\n const api: UseCartItemsApi = {\n showIncludedTaxPrice,\n showExcludingTaxPrice,\n itemsUpdating,\n itemUpdateErrors,\n getConfiguration,\n getPriceProps,\n getSubtotalProps,\n processQuantityChange,\n debouncedQuantityChange,\n setItemsUpdating,\n getWarningMessage,\n setItemUpdateError,\n handleRemoveItem,\n setItemUpdating,\n };\n\n // Return the API for use in components\n return api;\n};","/********************************************************************\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { Button, Icon } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Close } from '@adobe-commerce/elsie/icons';\nimport { VComponent, classes } from '@adobe-commerce/elsie/lib';\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\n\nimport '@adobe-commerce/elsie/components/InLineAlert/InLineAlert.css';\nexport interface InLineAlertProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'icon'> {\n variant?: 'primary' | 'secondary';\n heading: string;\n description?: string;\n type?: 'error' | 'warning' | 'success';\n icon?: VNode<HTMLAttributes<SVGSVGElement>>;\n additionalActions?: Array<{\n label: string;\n onClick: (event: Event) => void;\n }>;\n onDismiss?: (event: Event) => void;\n itemList?: VNode;\n actionButtonPosition?: 'top' | 'bottom';\n}\n\nexport const InLineAlert: FunctionComponent<InLineAlertProps> = ({\n variant = 'primary',\n className,\n type = 'warning',\n additionalActions,\n onDismiss,\n heading,\n description,\n icon,\n itemList,\n actionButtonPosition,\n ...props\n}) => {\n const translations = useText({\n dismiss: 'Dropin.InlineAlert.dismissLabel',\n });\n\n return (\n <div\n {...props}\n className={classes([\n 'dropin-in-line-alert',\n `dropin-in-line-alert--${type}`,\n `dropin-in-line-alert--${variant}`,\n className,\n ])}\n >\n <div className={'dropin-in-line-alert__heading'}>\n <div className={'dropin-in-line-alert__title-container'}>\n {icon && (\n <VComponent node={icon} className={'dropin-in-line-alert__icon'} />\n )}\n\n <span className={'dropin-in-line-alert__title'}>{heading}</span>\n </div>\n\n <div className={'dropin-in-line-alert__actions-container'}>\n {additionalActions &&\n (actionButtonPosition === 'top' ||\n (!actionButtonPosition && additionalActions.length <= 1)) && (\n <Button\n variant=\"tertiary\"\n className={'dropin-in-line-alert__additional-action'}\n onClick={\n additionalActions.length > 0\n ? additionalActions[0]?.onClick\n : undefined\n }\n aria-label={additionalActions[0]?.label}\n >\n {additionalActions[0]?.label}\n </Button>\n )}\n {onDismiss && (\n <Button\n icon={<Icon source={Close} size=\"24\" stroke=\"2\" />}\n className={'dropin-in-line-alert__dismiss-button'}\n variant=\"tertiary\"\n onClick={onDismiss}\n aria-label={translations.dismiss}\n />\n )}\n </div>\n </div>\n\n {description && (\n <p className={'dropin-in-line-alert__description'}>{description}</p>\n )}\n <div className={'dropin-in-line-alert__item-list-container'}>\n {itemList && (\n <VComponent\n node={itemList}\n className={classes(['dropin-in-line-alert__item-list'])}\n />\n )}\n </div>\n {additionalActions &&\n (actionButtonPosition === 'bottom' ||\n (!actionButtonPosition && additionalActions.length > 1)) && (\n <div className={'dropin-in-line-alert__additional-actions-container'}>\n {additionalActions.map((action) => (\n <Button\n key={action.label}\n variant=\"tertiary\"\n className={'dropin-in-line-alert__additional-action'}\n onClick={action.onClick}\n >\n {action.label}\n </Button>\n ))}\n </div>\n )}\n </div>\n );\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { HTMLAttributes } from 'preact/compat';\nimport { classes, Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { CartModel } from '@/cart/data/models/cart-model';\nimport { CartSummaryTable as CartSummaryTableComponent } from '@/cart/components';\nimport {\n Price,\n Skeleton,\n SkeletonRow,\n Image,\n ImageProps,\n Icon,\n Button,\n} from '@adobe-commerce/elsie/components';\nimport { useState, useEffect, useMemo, useCallback } from 'preact/hooks';\nimport { events } from '@adobe-commerce/event-bus';\nimport {\n Cart,\n OrderError,\n Trash,\n WarningWithCircle,\n} from '@adobe-commerce/elsie/icons';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Item } from '@/cart/components/CartSummaryTable/Elements/Item/Item';\nimport { useCartItems } from '@/cart/hooks/useCartItems';\nimport { getPersistedCartData } from '@/cart/lib/persisted-data';\nimport { InLineAlert } from '@adobe-commerce/elsie/components/InLineAlert';\nimport { addProductsToCart } from '@/cart/api/addProductsToCart/addProductsToCart';\nimport { VNode } from 'preact';\nimport { EmptyCart } from '@/cart/containers/EmptyCart';\n\nexport interface CartSummaryTableContainerProps\n extends HTMLAttributes<HTMLDivElement> {\n /** Initial data for the cart */\n initialData?: CartModel | null;\n /** Optional CSS class name for custom styling */\n className?: string;\n /** Slots for customizing different parts of the table */\n slots?: {\n /** Slot for customizing the item cell content */\n Item?: SlotProps<{ item: CartModel['items'][number] }>;\n /** Slot for customizing the price cell content */\n Price?: SlotProps<{ item: CartModel['items'][number] }>;\n /** Slot for customizing the quantity cell content */\n Quantity?: SlotProps<{\n item: CartModel['items'][number];\n isUpdating: boolean;\n quantityInputValue: number;\n handleInputChange: (e: Event) => void;\n itemUpdateErrors: Map<string, string>;\n }>;\n /** Slot for customizing the subtotal cell content */\n Subtotal?: SlotProps<{ item: CartModel['items'][number] }>;\n /** Slot for customizing the thumbnail image on an item */\n Thumbnail?: SlotProps<{\n item: CartModel['items'][number];\n defaultImageProps: ImageProps;\n index: number;\n }>;\n /** Slot for customizing the product title on an item */\n ProductTitle?: SlotProps<{ item: CartModel['items'][number] }>;\n /** Slot for customizing the product sku on an item */\n Sku?: SlotProps<{ item: CartModel['items'][number] }>;\n /** Slot for customizing the product configurations on an item */\n Configurations?: SlotProps<{ item: CartModel['items'][number] }>;\n /** Slot for customizing the product alert on an item */\n ItemAlert?: SlotProps<{ item: CartModel['items'][number] }>;\n /** Slot for customizing the product warning on an item */\n ItemWarning?: SlotProps<{ item: CartModel['items'][number] }>;\n /** Slot for customizing the actions on an item */\n Actions?: SlotProps<{\n item: CartModel['items'][number];\n itemsUpdating: Map<string, { isUpdating: boolean; updatedValue: number }>;\n setItemUpdating: (uid: string, state: boolean) => void;\n setItemUpdateError: (uid: string, error: string) => void;\n }>;\n UndoBanner?: SlotProps<{\n item: CartModel['items'][number];\n loading: boolean;\n error?: string;\n onUndo: () => void;\n onDismiss: () => void;\n }>;\n /** Slot for customizing the empty cart */\n EmptyCart?: SlotProps;\n };\n /** Function for getting the product page route */\n routeProduct?: (item: CartModel['items'][number]) => string;\n /** Function for getting the empty cart CTA route */\n routeEmptyCartCTA?: () => string;\n /** Whether to allow quantity updates */\n allowQuantityUpdates?: boolean;\n /** Whether to allow remove items */\n allowRemoveItems?: boolean;\n /** On quantity update */\n onQuantityUpdate?: (\n item: CartModel['items'][number],\n quantity: number\n ) => void;\n /** On item remove */\n onItemRemove?: (item: CartModel['items'][number]) => void;\n /** Whether to enable undo functionality for removed items */\n undo?: boolean;\n}\n\n/**\n * Skeleton loader component for the cart summary table\n */\nconst CartSummaryTableSkeleton = () => {\n return (\n <Skeleton\n data-testid=\"cart-summary-table-skeleton\"\n className=\"cart-cart-summary-table__skeleton\"\n rowGap=\"medium\"\n >\n <SkeletonRow\n variant=\"row\"\n size=\"xlarge\"\n fullWidth={true}\n lines={4}\n multilineGap=\"small\"\n />\n </Skeleton>\n );\n};\n\n/**\n * Container component for CartSummaryTable that provides slots for customizing the table cells\n * and handles data management\n */\nexport const CartSummaryTable: Container<\n CartSummaryTableContainerProps,\n CartModel | null\n> = ({\n initialData = null,\n routeProduct,\n routeEmptyCartCTA,\n slots,\n className,\n allowQuantityUpdates = true,\n allowRemoveItems = true,\n onQuantityUpdate,\n onItemRemove,\n undo = false,\n ...props\n}) => {\n const [loading, setLoading] = useState(!initialData);\n const [cartModelData, setCartModelData] = useState<CartModel | null>(\n initialData\n );\n const [recentlyRemovedItems, setRecentlyRemovedItems] = useState<\n {\n item: CartModel['items'][number];\n index: number;\n loading: boolean;\n error?: string;\n }[]\n >([]);\n /** I18n text for the cart summary table */\n const dictionary = useText({\n file: 'Cart.CartItem.file',\n files: 'Cart.CartItem.files',\n heading: 'Cart.Cart.heading',\n message: 'Cart.CartItem.message',\n recipient: 'Cart.CartItem.recipient',\n regularPrice: 'Cart.CartItem.regularPrice',\n discountedPrice: 'Cart.CartItem.discountedPrice',\n sender: 'Cart.CartItem.sender',\n lowInventory: 'Cart.CartItem.lowInventory',\n insufficientQuantity: 'Cart.CartItem.insufficientQuantity',\n insufficientQuantityGeneral: 'Cart.CartItem.insufficientQuantityGeneral',\n outOfStockHeading: 'Cart.OutOfStockMessage.heading',\n outOfStockDescription: 'Cart.OutOfStockMessage.message',\n outOfStockAlert: 'Cart.OutOfStockMessage.alert',\n removeAction: 'Cart.OutOfStockMessage.action',\n notAvailableMessage: 'Cart.CartItem.notAvailableMessage',\n viewMore: 'Cart.Cart.viewMore',\n viewAll: 'Cart.Cart.viewAll',\n discountPercent: 'Cart.CartItem.discountPercentage',\n savingsAmount: 'Cart.CartItem.savingsAmount',\n includingTax: 'Cart.CartItem.includingTax',\n excludingTax: 'Cart.CartItem.excludingTax',\n remove: 'Dropin.CartItem.remove.label',\n removeDefault: 'Dropin.CartItem.removeDefault.label',\n quantity: 'Dropin.CartItem.quantity.label',\n itemBeingRemoved: 'Cart.CartItem.itemBeingRemoved',\n itemRemoved: 'Cart.CartItem.itemRemoved',\n itemRemovedDescription: 'Cart.CartItem.itemRemovedDescription',\n undoAction: 'Cart.CartItem.undoAction',\n dismissAction: 'Cart.CartItem.dismissAction',\n });\n\n /** Helper functions */\n const {\n showIncludedTaxPrice,\n showExcludingTaxPrice,\n itemsUpdating,\n itemUpdateErrors,\n getConfiguration,\n getPriceProps,\n getSubtotalProps,\n debouncedQuantityChange,\n setItemsUpdating,\n getWarningMessage,\n handleRemoveItem,\n setItemUpdating,\n setItemUpdateError,\n } = useCartItems({ dictionary, onQuantityUpdate, onItemRemove });\n\n // Helper to add to recently removed items for undo\n function addToRecentlyRemovedItems(uid: string) {\n const cart = getPersistedCartData();\n const item = cart?.items.find((i) => i.uid === uid);\n if (item) {\n setRecentlyRemovedItems((prev) => {\n const index = cart.items.findIndex((i) => i.uid === uid);\n if (index !== -1 && !prev.some((r) => r.item.uid === uid)) {\n // Emit the event for analytics or listeners\n events.emit('cart/product/removed', { item, index });\n return [...prev, { item, index, loading: false, error: undefined }];\n }\n return prev;\n });\n }\n }\n\n const handleUndo = createUndoHandler(\n recentlyRemovedItems,\n setRecentlyRemovedItems\n );\n\n const handleDismiss = createDismissHandler(setRecentlyRemovedItems);\n\n const handleRemoveWithUndo = useCallback(\n (item: CartModel['items'][number]) => {\n if (undo) {\n addToRecentlyRemovedItems(item.uid);\n }\n handleRemoveItem(item); // original remove logic\n },\n [undo, handleRemoveItem]\n );\n\n /**\n * Handle the cart data event\n */\n useEffect(() => {\n const cartDataEvent = events.on(\n 'cart/data',\n (payload: Cart | null) => {\n setLoading(true);\n setCartModelData(payload as CartModel);\n setItemsUpdating(new Map());\n setLoading(false);\n },\n { eager: true }\n );\n\n return () => {\n cartDataEvent?.off();\n };\n }, [setLoading, setCartModelData, setItemsUpdating]);\n\n // Transform cart items into table entries with slots for customization\n const entries = useMemo(\n () =>\n cartModelData?.items\n ?.sort((a, b) => {\n // Sort out of stock items and items with update errors last\n // to show them at the top since we are rendering the list in reverse order\n if (itemUpdateErrors.has(a.uid) && !itemUpdateErrors.has(b.uid))\n return -1;\n if (!itemUpdateErrors.has(a.uid) && itemUpdateErrors.has(b.uid))\n return 1;\n if (a.outOfStock && !b.outOfStock) return -1;\n if (!a.outOfStock && b.outOfStock) return 1;\n return 0;\n })\n .map((item, index) => {\n const isUpdating = itemsUpdating.has(item.uid);\n const warningMessage = getWarningMessage(item);\n\n const productTitle = (\n <Slot\n name=\"ProductTitle\"\n slot={slots?.ProductTitle}\n context={{ item }}\n >\n {routeProduct ? (\n <a href={routeProduct(item)}>{item.name}</a>\n ) : (\n item.name\n )}\n </Slot>\n );\n\n const defaultImageProps = {\n src: item.image.src,\n alt: item.image.alt,\n width: '300',\n height: '300',\n params: { width: 300 },\n };\n\n const defaultImage = (\n <Image\n data-testid={`cart-table-item-image-${item.sku}`}\n loading={index < 4 ? 'eager' : 'lazy'}\n {...defaultImageProps}\n />\n );\n\n const productImage = (\n <Slot\n name=\"Thumbnail\"\n slot={slots?.Thumbnail}\n className=\"cart-cart-summary-table__item-image-wrapper\"\n context={{\n item,\n defaultImageProps: {\n ...defaultImageProps,\n loading: index < 4 ? 'eager' : 'lazy',\n },\n index,\n }}\n >\n {routeProduct ? (\n <a href={routeProduct(item)}>{defaultImage}</a>\n ) : (\n defaultImage\n )}\n </Slot>\n );\n\n const productSku = (\n <Slot name=\"Sku\" slot={slots?.Sku} context={{ item }}>\n {item.sku}\n </Slot>\n );\n\n const itemAlert =\n item.outOfStock || slots?.ItemAlert ? (\n <Slot name=\"ItemAlert\" slot={slots?.ItemAlert} context={{ item }}>\n {item.outOfStock && (\n <div\n className=\"cart-cart-summary-table__item-quantity-alert-wrapper\"\n data-testid={`cart-table-item-quantity-alert-${item.uid}`}\n >\n <Icon\n className=\"cart-cart-summary-table__item-quantity-alert-icon\"\n source={OrderError}\n size={'16'}\n />\n <span className=\"cart-cart-summary-table__item-quantity-alert-text\">\n {dictionary.outOfStockAlert}\n </span>\n </div>\n )}\n </Slot>\n ) : undefined;\n\n const itemWarning =\n warningMessage || slots?.ItemWarning ? (\n <Slot\n name=\"ItemWarning\"\n slot={slots?.ItemWarning}\n context={{ item }}\n >\n {warningMessage && (\n <div\n className=\"cart-cart-summary-table__item-quantity-warning-wrapper\"\n data-testid={`cart-table-item-quantity-warning-${item.uid}`}\n >\n <Icon\n className=\"cart-cart-summary-table__item-quantity-warning-icon\"\n source={WarningWithCircle}\n size={'16'}\n />\n <span className=\"cart-cart-summary-table__item-quantity-warning-text\">\n {warningMessage}\n </span>\n </div>\n )}\n </Slot>\n ) : undefined;\n\n const itemConfigurations = getConfiguration({ item });\n const productConfigurations =\n itemConfigurations || slots?.Configurations ? (\n <Slot\n name=\"Configurations\"\n slot={slots?.Configurations}\n context={{ item }}\n >\n {itemConfigurations && (\n <ul\n className=\"cart-cart-summary-table__item-configurations\"\n data-testid={`cart-table-item-configurations-${item.sku}`}\n >\n {Object.entries(itemConfigurations).map(([key, value]) => (\n <li\n className=\"cart-cart-summary-table__item-configuration\"\n data-testid={`cart-table-item-configuration-${key}`}\n key={key}\n >\n <span className=\"cart-cart-summary-table__item-configuration-label\">\n {key}:\n </span>\n <span className=\"cart-cart-summary-table__item-configuration-value\">\n {value}\n </span>\n </li>\n ))}\n </ul>\n )}\n </Slot>\n ) : undefined;\n\n const { subtotalProps, subtotalDiscountProps } =\n getSubtotalProps(item);\n\n const updatedValue = itemsUpdating.get(item.uid)?.updatedValue;\n const quantityInputValue =\n isUpdating && !isNaN(updatedValue) ? updatedValue : item.quantity;\n\n const handleInputChange = (e: Event) => {\n const target = e.target as HTMLInputElement;\n const value = parseInt(target.value, 10);\n\n debouncedQuantityChange(item, value);\n };\n\n const isBeingRemoved =\n itemsUpdating.has(item.uid) &&\n itemsUpdating.get(item.uid)?.updatedValue === 0;\n const actions = (\n <Slot\n name=\"Actions\"\n slot={slots?.Actions}\n context={{\n item,\n itemsUpdating,\n setItemUpdating,\n setItemUpdateError,\n }}\n >\n {allowRemoveItems && !isBeingRemoved && (\n <Button\n variant=\"tertiary\"\n size=\"medium\"\n className=\"cart-cart-summary-table__item-remove-button\"\n data-testid={`cart-table-item-remove-${item.uid}`}\n icon={<Icon source={Trash} size={'32'} />}\n onClick={() => handleRemoveWithUndo(item)}\n aria-label={\n dictionary.remove?.replace('{product}', item.name) ||\n dictionary.removeDefault\n }\n />\n )}\n </Slot>\n );\n\n return {\n key: item.uid,\n uid: item.uid,\n updating: isUpdating,\n hasError: item.outOfStock || itemUpdateErrors.has(item.uid),\n item: (\n <Slot name=\"Item\" slot={slots?.Item} context={{ item }}>\n <Item\n productTitle={productTitle}\n image={productImage}\n sku={productSku}\n configurations={productConfigurations}\n alert={itemAlert}\n warning={itemWarning}\n />\n </Slot>\n ),\n price: (\n <Slot\n name=\"Price\"\n className=\"cart-cart-summary-table__item-price\"\n slot={slots?.Price}\n context={{ item }}\n >\n <Price {...getPriceProps(item)} />\n {showIncludedTaxPrice && (\n <span className=\"cart-cart-summary-table__item-price-tax-label\">\n {dictionary.includingTax}:&nbsp;\n <Price\n amount={item.taxedPrice?.value}\n currency={item.taxedPrice?.currency}\n />\n </span>\n )}\n {showExcludingTaxPrice && (\n <span className=\"cart-cart-summary-table__item-price-tax-label\">\n {dictionary.excludingTax}:&nbsp;\n <Price\n amount={item.regularPrice?.value}\n currency={item.regularPrice?.currency}\n />\n </span>\n )}\n </Slot>\n ),\n quantity: (\n <Slot\n name=\"Quantity\"\n className=\"cart-cart-summary-table__item-qty\"\n slot={slots?.Quantity}\n context={{\n item,\n isUpdating,\n quantityInputValue,\n handleInputChange,\n itemUpdateErrors,\n }}\n >\n {allowQuantityUpdates ? (\n <input\n id={`cart-table-item-quantity-${item.uid}`}\n data-testid={`cart-table-item-quantity-${item.uid}`}\n type=\"number\"\n min=\"1\"\n value={quantityInputValue}\n disabled={isUpdating}\n aria-label={dictionary.quantity}\n className={classes([\n 'cart-cart-summary-table__cell-qty-input',\n 'cart-cart-summary-table__cell-qty-updater',\n [\n 'cart-cart-summary-table__cell-qty-updater--disabled',\n isUpdating,\n ],\n [\n 'cart-cart-summary-table__cell-qty-updater--error',\n itemUpdateErrors.has(item.uid),\n ],\n ])}\n onChange={handleInputChange}\n />\n ) : (\n <span>{item.quantity}</span>\n )}\n </Slot>\n ),\n subtotal: (\n <Slot\n name=\"Subtotal\"\n className=\"cart-cart-summary-table__item-subtotal\"\n slot={slots?.Subtotal}\n context={{ item }}\n >\n <Price {...subtotalProps} />\n {subtotalDiscountProps && <Price {...subtotalDiscountProps} />}\n {showIncludedTaxPrice && (\n <span className=\"cart-cart-summary-table__item-subtotal-tax-label\">\n {dictionary.includingTax}:&nbsp;\n <Price\n amount={item.rowTotalIncludingTax?.value}\n currency={item.rowTotalIncludingTax?.currency}\n />\n </span>\n )}\n {showExcludingTaxPrice && (\n <span className=\"cart-cart-summary-table__item-subtotal-tax-label\">\n {dictionary.excludingTax}:&nbsp;\n <Price\n amount={item.rowTotal?.value}\n currency={item.rowTotal?.currency}\n />\n </span>\n )}\n </Slot>\n ),\n actions,\n };\n }) || [],\n [\n cartModelData,\n itemsUpdating,\n allowQuantityUpdates,\n routeProduct,\n slots,\n itemUpdateErrors,\n dictionary,\n getConfiguration,\n allowRemoveItems,\n debouncedQuantityChange,\n getWarningMessage,\n getPriceProps,\n getSubtotalProps,\n setItemUpdating,\n setItemUpdateError,\n showIncludedTaxPrice,\n showExcludingTaxPrice,\n handleRemoveWithUndo,\n ]\n );\n\n /**\n * Render the cart summary table skeleton if the cart is loading\n */\n if (loading) {\n return <CartSummaryTableSkeleton />;\n }\n const renderTableWithUndoBanners = () => {\n if (!cartModelData?.items) return null;\n const tableEntries: any[] = [];\n const items = cartModelData.items;\n\n // Process items up to the available entries length\n for (let i = 0; i <= entries.length; i++) {\n // Render undo banners for this index position if undo is enabled\n if (undo) {\n recentlyRemovedItems\n .filter((r) => r.index === i)\n .forEach(({ item, error }) => {\n const isUndoBeingRemoved = getIsUndoBeingRemoved(item.uid, itemsUpdating);\n const undoBanner = createUndoBanner(\n { item, index: i, error },\n item,\n isUndoBeingRemoved,\n dictionary,\n handleUndo,\n handleDismiss,\n slots\n );\n \n // Add undo banner as a special entry\n tableEntries.push({\n uid: `undo-banner-${item.uid}`,\n updating: false,\n hasError: false,\n item: <div />,\n price: <div />,\n quantity: <div />,\n subtotal: <div />,\n actions: <div />,\n undoBanner,\n });\n });\n }\n \n // Render cart item if not at the end and within the entries limit\n if (i < entries.length && i < items.length) {\n tableEntries.push(entries[i]);\n }\n }\n \n return (\n <CartSummaryTableComponent\n entries={tableEntries}\n className={className}\n {...props}\n />\n );\n };\n\n /**\n * Create empty cart component with undo banner support\n */\n const emptyCart = (\n <Slot name=\"EmptyCart\" slot={slots?.EmptyCart} context={{}}>\n <EmptyCart ctaLinkURL={routeEmptyCartCTA?.()} />\n </Slot>\n );\n\n /**\n * Choose between original table entries and undo banner version (matches CartSummaryList logic)\n */\n const tableContent = \n cartModelData?.totalQuantity ||\n (undo && recentlyRemovedItems.length > 0) ? (\n !undo ? (\n <CartSummaryTableComponent\n entries={entries}\n className={className}\n {...props}\n />\n ) : recentlyRemovedItems.length > 0 ? (\n renderTableWithUndoBanners()\n ) : (\n <CartSummaryTableComponent\n entries={entries}\n className={className}\n {...props}\n />\n )\n ) : emptyCart;\n\n /**\n * Render the cart summary table\n */\n return tableContent;\n};\n\nCartSummaryTable.getInitialData = async function () {\n return getPersistedCartData();\n};\n\nexport const createUndoHandler = (\n recentlyRemovedItems: {\n item: CartModel['items'][number];\n index: number;\n loading: boolean;\n error?: string;\n }[],\n setRecentlyRemovedItems: (\n updater: (\n prev: {\n item: CartModel['items'][number];\n index: number;\n loading: boolean;\n error?: string;\n }[]\n ) => {\n item: CartModel['items'][number];\n index: number;\n loading: boolean;\n error?: string;\n }[]\n ) => void\n) => {\n return async (uid: string) => {\n setRecentlyRemovedItems((prev) =>\n prev.map((r) => (r.item.uid === uid ? { ...r, error: undefined } : r))\n );\n\n const removed = recentlyRemovedItems.find((r) => r.item.uid === uid);\n if (!removed) return;\n\n try {\n await addProductsToCart([\n {\n sku: removed.item.sku,\n parentSku: removed.item.topLevelSku,\n quantity: removed.item.quantity,\n optionsUIDs:\n removed.item.bundleOptionsUIDs || // Use bundle option UIDs for bundle products\n (removed.item.selectedOptionsUIDs\n ? Object.values(removed.item.selectedOptionsUIDs)\n : undefined),\n enteredOptions: removed.item.customizableOptions\n ? Object.entries(removed.item.customizableOptions).map(\n ([uid, value]) => ({ uid, value })\n )\n : undefined,\n },\n ]);\n setRecentlyRemovedItems((prev) => prev.filter((r) => r.item.uid !== uid));\n } catch (error: any) {\n setRecentlyRemovedItems((prev) =>\n prev.map((r) =>\n r.item.uid === uid\n ? { ...r, error: error?.message || 'Failed to restore item.' }\n : r\n )\n );\n }\n };\n};\n\nexport const createDismissHandler = (\n setRecentlyRemovedItems: (\n updater: (\n prev: {\n item: CartModel['items'][number];\n index: number;\n loading: boolean;\n error?: string;\n }[]\n ) => {\n item: CartModel['items'][number];\n index: number;\n loading: boolean;\n error?: string;\n }[]\n ) => void\n) => {\n return (uid: string) => {\n setRecentlyRemovedItems((prev) => prev.filter((r) => r.item.uid !== uid));\n };\n};\n\n/**\n * Helper function to determine if an undo is currently being removed\n * This makes the logic more explicit and testable\n */\nexport const getIsUndoBeingRemoved = (\n itemUid: string,\n itemsUpdating: Map<string, { isUpdating: boolean; updatedValue: number }>\n): boolean => {\n return itemsUpdating.has(itemUid) && itemsUpdating.get(itemUid)?.updatedValue === 0;\n};\n\n/**\n * Helper function to create additional actions for undo banner\n * This makes the ternary operator logic more explicit and testable\n */\nexport const createUndoBannerActions = (\n isUndoBeingRemoved: boolean,\n dictionary: any,\n handleUndo: (uid: string) => void,\n handleDismiss: (uid: string) => void,\n itemUid: string,\n itemName: string\n) => {\n if (isUndoBeingRemoved) {\n return []; // Hide buttons while removing\n }\n \n return [\n {\n label: dictionary.undoAction,\n onClick: () => {\n handleUndo(itemUid);\n },\n 'aria-label': `${dictionary.undoAction} remove ${itemName}`,\n },\n {\n label: dictionary.dismissAction,\n onClick: () => {\n handleDismiss(itemUid);\n },\n 'aria-label': `${dictionary.dismissAction} undo for ${itemName}`,\n },\n ];\n};\n\n/**\n * Helper function to create undo callback\n */\nexport const createUndoCallback = (\n handleUndo: (uid: string) => void,\n itemUid: string\n) => {\n return () => handleUndo(itemUid);\n};\n\n/**\n * Helper function to create dismiss callback\n */\nexport const createDismissCallback = (\n handleDismiss: (uid: string) => void,\n itemUid: string\n) => {\n return () => handleDismiss(itemUid);\n};\n\nexport const createUndoBanner = (\n removed: { item: CartModel['items'][number]; index: number; error?: string },\n item: CartModel['items'][number],\n isUndoBeingRemoved: boolean,\n dictionary: any,\n handleUndo: (uid: string) => void,\n handleDismiss: (uid: string) => void,\n slots?: CartSummaryTableContainerProps['slots']\n): VNode => {\n const additionalActions = createUndoBannerActions(\n isUndoBeingRemoved,\n dictionary,\n handleUndo,\n handleDismiss,\n removed.item.uid,\n removed.item.name\n );\n\n const onUndoCallback = createUndoCallback(handleUndo, removed.item.uid);\n const onDismissCallback = createDismissCallback(handleDismiss, removed.item.uid);\n\n return (\n <Slot\n name=\"UndoBanner\"\n slot={slots?.UndoBanner}\n context={{\n item: removed.item,\n loading: isUndoBeingRemoved,\n error: removed.error,\n onUndo: onUndoCallback,\n onDismiss: onDismissCallback,\n }}\n key={`undo-banner-${removed.item.uid}`}\n >\n <InLineAlert\n key={`undo-banner-${removed.item.uid}`}\n type={removed.error ? 'error' : 'info'}\n heading={\n isUndoBeingRemoved\n ? dictionary.itemBeingRemoved?.replace('{product}', item.name)\n : dictionary.itemRemoved?.replace('{product}', removed.item.name)\n }\n description={removed.error || dictionary.itemRemovedDescription}\n variant=\"primary\"\n actionButtonPosition=\"bottom\"\n additionalActions={additionalActions}\n />\n </Slot>\n );\n};\n"],"names":["CartSummaryTable","entries","className","props","dictionary","useText","jsxs","classes","jsx","entry","VComponent","Item","productTitle","sku","image","configurations","alert","warning","useCartItems","onQuantityUpdate","onItemRemove","itemsUpdating","setItemsUpdating","useState","itemUpdateErrors","setItemUpdateErrors","cartSettings","_b","_a","state","showIncludedTaxPrice","showExcludingTaxPrice","getConfiguration","item","configuration","getPriceProps","_c","_d","getSubtotalProps","subtotalProps","subtotalDiscountProps","_e","_f","_g","_h","_i","_j","getWarningMessage","updateErrorMessage","insufficientQuantityText","lowInventoryText","processQuantityChange","useCallback","value","handleQuantityChange","quantity","updateProductsFromCart","prev","next","error","debouncedQuantityChange","useMemo","debounce","uid","data","InLineAlert","variant","type","additionalActions","onDismiss","heading","description","icon","itemList","actionButtonPosition","translations","Button","Icon","Close","action","CartSummaryTableSkeleton","Skeleton","SkeletonRow","initialData","routeProduct","routeEmptyCartCTA","slots","allowQuantityUpdates","allowRemoveItems","undo","loading","setLoading","cartModelData","setCartModelData","recentlyRemovedItems","setRecentlyRemovedItems","handleRemoveItem","setItemUpdating","setItemUpdateError","addToRecentlyRemovedItems","cart","getPersistedCartData","i","index","r","events","handleUndo","createUndoHandler","handleDismiss","createDismissHandler","handleRemoveWithUndo","useEffect","cartDataEvent","payload","a","b","isUpdating","warningMessage","Slot","defaultImageProps","defaultImage","Image","productImage","productSku","itemAlert","OrderError","itemWarning","WarningWithCircle","itemConfigurations","productConfigurations","key","updatedValue","quantityInputValue","handleInputChange","e","target","isBeingRemoved","actions","Trash","Price","_k","renderTableWithUndoBanners","tableEntries","items","isUndoBeingRemoved","getIsUndoBeingRemoved","undoBanner","createUndoBanner","CartSummaryTableComponent","emptyCart","EmptyCart","removed","addProductsToCart","itemUid","createUndoBannerActions","itemName","createUndoCallback","createDismissCallback","onUndoCallback","onDismissCallback"],"mappings":"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","x_google_ignoreList":[3]}
1
+ {"version":3,"file":"CartSummaryTable2.js","sources":["/@dropins/storefront-cart/src/components/CartSummaryTable/CartSummaryTable.tsx","/@dropins/storefront-cart/src/components/CartSummaryTable/Elements/Item/Item.tsx","/@dropins/storefront-cart/src/hooks/useCartItems.ts","../../node_modules/@adobe-commerce/elsie/src/components/InLineAlert/InLineAlert.tsx","/@dropins/storefront-cart/src/containers/CartSummaryTable/CartSummaryTable.tsx"],"sourcesContent":["/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\n/**\n * CartSummaryTable is a responsive grid-based component that displays cart items in a table-like format.\n * It adapts to mobile views by switching to a stacked layout with labeled sections.\n * \n * @component\n */\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport '@/cart/components/CartSummaryTable/CartSummaryTable.css';\n\n/**\n * Represents a single row entry in the cart summary table\n * Each field accepts a VNode to allow for flexible content rendering\n */\nexport interface CartTableEntry {\n /** The item UID */\n uid: string;\n /** Whether the item is updating */\n updating: boolean;\n /** Whether the item has an update error */\n hasError: boolean;\n /** The product details section (typically includes image, name, and options) */\n item: VNode;\n /** The unit price of the product */\n price: VNode;\n /** The quantity selector/display */\n quantity: VNode;\n /** The total price for this line item */\n subtotal: VNode;\n /** Actions bar on the bottom of the row */\n actions: VNode;\n /** Optional undo banner for removed items */\n undoBanner?: VNode;\n}\n\n/**\n * Props for the CartSummaryTable component\n */\nexport interface CartSummaryTableProps extends HTMLAttributes<HTMLDivElement> {\n /** Array of cart entries to display in the table */\n entries: CartTableEntry[];\n /** Optional CSS class name for custom styling */\n className?: string;\n}\n\n/**\n * CartSummaryTable component displays cart items in a responsive grid layout\n * - Uses CSS Grid for layout with 4 columns on desktop\n * - Switches to a stacked single-column layout on mobile with labeled sections\n * - Renders each entry's content using VComponent for proper component handling\n */\nexport const CartSummaryTable: FunctionComponent<CartSummaryTableProps> = ({\n entries,\n className,\n ...props\n}) => {\n const dictionary = useText({\n itemLabel: 'Cart.CartSummaryTable.item',\n priceLabel: 'Cart.CartSummaryTable.price',\n qtyLabel: 'Cart.CartSummaryTable.qty',\n subtotalLabel: 'Cart.CartSummaryTable.subtotal',\n mobilePriceLabel: 'Cart.CartSummaryTable.mobilePrice',\n mobileQtyLabel: 'Cart.CartSummaryTable.mobileQty',\n mobileSubtotalLabel: 'Cart.CartSummaryTable.mobileSubtotal'\n });\n\n return (\n <div {...props} className={classes(['cart-cart-summary-table', className])}>\n {/* Table header - hidden on mobile */}\n <div className=\"cart-cart-summary-table__header\">\n <div className=\"cart-cart-summary-table__header-item\">{dictionary.itemLabel}</div>\n <div className=\"cart-cart-summary-table__header-price\">{dictionary.priceLabel}</div>\n <div className=\"cart-cart-summary-table__header-qty\">{dictionary.qtyLabel}</div>\n <div className=\"cart-cart-summary-table__header-subtotal\">{dictionary.subtotalLabel}</div>\n </div>\n {/* Table body - adapts to grid layout on mobile */}\n <div className=\"cart-cart-summary-table__body\">\n {entries.map((entry) => {\n // If this entry is an undo banner, render it as a full-width banner\n if (entry.undoBanner) {\n return (\n <div key={entry.uid} className=\"cart-cart-summary-table__undo-banner\">\n <VComponent node={entry.undoBanner} />\n </div>\n );\n }\n \n // Otherwise render as a regular table row\n return (\n <div key={entry.uid} className={classes([\n 'cart-cart-summary-table__row',\n [ 'cart-cart-summary-table__row--updating', entry.updating ],\n [ 'cart-cart-summary-table__row--error', entry.hasError ],\n ])}\n >\n <div className=\"cart-cart-summary-table__cell-item\">\n <VComponent node={entry.item} />\n </div>\n <div className=\"cart-cart-summary-table__cell-price\">\n <span className=\"cart-cart-summary-table__mobile-label\">{dictionary.mobilePriceLabel}</span>\n <VComponent node={entry.price} />\n </div>\n <div className=\"cart-cart-summary-table__cell-qty\">\n <span className=\"cart-cart-summary-table__mobile-label\">{dictionary.mobileQtyLabel}</span>\n <VComponent node={entry.quantity} />\n </div>\n <div className=\"cart-cart-summary-table__cell-subtotal\">\n <span className=\"cart-cart-summary-table__mobile-label\">{dictionary.mobileSubtotalLabel}</span>\n <VComponent node={entry.subtotal} />\n </div>\n <div className=\"cart-cart-summary-table__item-footer\">\n <VComponent className=\"cart-cart-summary-table__item-actions\" node={entry.actions} />\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n \nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\nimport '@/cart/components/CartSummaryTable/Elements/Item/Item.css';\n\nexport interface ItemProps extends HTMLAttributes<HTMLDivElement> {\n productTitle: VNode;\n sku?: VNode;\n image?: VNode;\n configurations?: VNode;\n alert?: VNode;\n warning?: VNode;\n}\n\nexport const Item: FunctionComponent<ItemProps> = ({\n className,\n productTitle,\n sku,\n image,\n configurations,\n alert,\n warning,\n ...props\n}) => {\n return (\n <div {...props} className={classes(['cart-cart-summary-table__item', className])}>\n {image && <VComponent className=\"cart-cart-summary-table__item-image-wrapper\" node={image} />}\n <div className=\"cart-cart-summary-table__item-details\">\n {productTitle && <VComponent className=\"cart-cart-summary-table__item-name\" node={productTitle} />}\n {sku && <VComponent className=\"cart-cart-summary-table__sku\" node={sku} />}\n {alert && <VComponent className=\"cart-cart-summary-table__item-quantity-alert-text\" node={alert} />}\n {warning && <VComponent className=\"cart-cart-summary-table__item-quantity-warning-text\" node={warning} />}\n {configurations && <VComponent className=\"cart-cart-summary-table__item-configurations\" node={configurations} />}\n </div>\n </div>\n );\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\n/**\n * This hook provides an API for getting calculated cart items data.\n */\n\nimport { useState, useCallback, useMemo } from 'preact/compat';\nimport { CartModel } from '../data/models';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { state } from '@/cart/lib/state';\nimport { PriceProps } from '@adobe-commerce/elsie/components/Price';\nimport { updateProductsFromCart } from '@/cart/api';\nimport { debounce } from '@adobe-commerce/elsie/lib';\n\n\n/**\n * Params for the useCartItems hook\n * \n * @param {\n * dictionary: ReturnType<typeof useText>;\n * onQuantityUpdate?: (item: CartModel['items'][number], quantity: number) => void;\n * onItemRemove?: (item: CartModel['items'][number]) => void;\n * }\n * \n * dictionary - The dictionary\n * onQuantityUpdate - The function to call when the quantity is updated\n * onItemRemove - The function to call when the item is removed\n */\nexport interface useCartItemsProps {\n dictionary: ReturnType<typeof useText>;\n onQuantityUpdate?: (item: CartModel['items'][number], quantity: number) => void;\n onItemRemove?: (item: CartModel['items'][number]) => void;\n}\n\n/**\n * Params for the getConfiguration function\n */\ninterface GetConfigurationParams {\n item: CartModel['items'][number];\n}\n\ninterface ItemUpdateState {\n isUpdating: boolean;\n updatedValue: any;\n}\n\n/**\n * Type for the API returned by useCartItems\n *\n * This interface ensures that the returned object from the hook is well-typed and clear for consumers.\n */\nexport interface UseCartItemsApi {\n showIncludedTaxPrice: boolean; // Whether to show prices including tax\n showExcludingTaxPrice: boolean; // Whether to show prices excluding tax\n itemsUpdating: Map<string, ItemUpdateState>; // Tracks which items are currently being updated\n itemUpdateErrors: Map<string, string>; // Tracks update errors for each item\n getConfiguration: (params: GetConfigurationParams) => object | undefined; // Returns configuration details for a cart item\n getPriceProps: (item: CartModel['items'][number]) => PriceProps; // Returns price display props for a cart item\n getSubtotalProps: (item: CartModel['items'][number]) => { subtotalProps: PriceProps; subtotalDiscountProps: PriceProps | null }; // Returns subtotal and discount subtotal props\n processQuantityChange: (item: CartModel['items'][number], value: number) => Promise<void>; // Handles quantity change with state and error management\n debouncedQuantityChange: (item: CartModel['items'][number], value: number) => void; // Debounced version of processQuantityChange\n setItemsUpdating: (itemsUpdating: Map<string, ItemUpdateState>) => void; // Allows external setting of updating state\n getWarningMessage: (item: CartModel['items'][number]) => string | undefined; // Returns warning message for a cart item\n setItemUpdateError: (uid: string, error: string) => void; // Sets or clears update error for an item\n handleRemoveItem: (item: CartModel['items'][number]) => Promise<CartModel | null>; // Removes an item from the cart\n setItemUpdating: (uid: string, state: boolean) => void; // Sets updating state for a specific item\n}\n\n/**\n * useCartItems hook\n *\n * Provides an API for managing and retrieving calculated cart items data, including price, subtotal, configuration, quantity updates, and error handling.\n *\n * @param {Object} params\n * @param {ReturnType<typeof useText>} params.dictionary - The i18n dictionary\n * @param {(item: CartModel['items'][number], quantity: number) => void} [params.onQuantityUpdate] - Callback when item quantity is updated\n * @param {(item: CartModel['items'][number]) => void} [params.onItemRemove] - Callback when item is removed\n *\n * @returns {Object} API for cart item management:\n * - showIncludedTaxPrice: boolean\n * - showExcludingTaxPrice: boolean\n * - itemsUpdating: Map<string, ItemUpdateState>\n * - itemUpdateErrors: Map<string, string>\n * - getConfiguration(item): object | undefined\n * - getPriceProps(item): PriceProps\n * - getSubtotalProps(item): { subtotalProps: PriceProps, subtotalDiscountProps: PriceProps | null }\n * - processQuantityChange(item, value): Promise<void>\n * - debouncedQuantityChange(item, value): void\n * - setItemsUpdating(map): void\n * - getWarningMessage(item): string | undefined\n * - setItemUpdateError(uid, error): void\n * - handleRemoveItem(item): Promise<CartModel>\n * - setItemUpdating(uid, state): void\n */\nexport const useCartItems = ({ dictionary, onQuantityUpdate, onItemRemove }: useCartItemsProps): UseCartItemsApi => {\n // State for tracking which items are being updated (e.g., quantity change in progress)\n const [itemsUpdating, setItemsUpdating] = useState<Map<string, ItemUpdateState>>(new Map());\n // State for tracking errors related to item updates\n const [itemUpdateErrors, setItemUpdateErrors] = useState<Map<string, string>>(new Map());\n\n // Get cart display settings (e.g., tax display mode) from global state\n const cartSettings = state?.config?.shoppingCartDisplaySetting;\n\n // Determine which price display modes are active\n const showIncludedTaxPrice = cartSettings?.price === 'INCLUDING_TAX';\n const showExcludingTaxPrice = cartSettings?.price === 'INCLUDING_EXCLUDING_TAX';\n\n /**\n * Returns a configuration object for the cart item, combining bundle, selected, and customizable options, as well as recipient/sender info.\n * Returns undefined if there is no configuration to show.\n */\n const getConfiguration = ({ item }: GetConfigurationParams) => {\n // Merge all possible configuration sources into a single object\n const configuration = {\n ...item.bundleOptions,\n ...item.selectedOptions,\n ...item.customizableOptions,\n // Add recipient/sender info if present\n ...(item.recipient ? { [dictionary.recipient]: item.recipient } : null),\n ...(item.recipientEmail && item.recipient\n ? {\n [dictionary.recipient]: `${item.recipient} (${item.recipientEmail})`,\n }\n : null),\n ...(item.sender ? { [dictionary.sender]: item.sender } : null),\n ...(item.senderEmail && item.sender\n ? {\n [dictionary.sender]: `${item.sender} (${item.senderEmail})`,\n }\n : {}),\n ...(item.message ? { [dictionary.message]: item.message } : null),\n // Add file/link info if present\n ...(item.links && item.links.count\n ? item.links.count > 1\n ? {\n [dictionary.files.replace(\n '{count}',\n item.links.count.toString()\n )]: item.links.result,\n }\n : {\n [dictionary.file.replace('{count}', item.links.count.toString())]:\n item.links.result,\n }\n : null),\n };\n\n // If no configuration, return undefined\n if (Object.keys(configuration).length === 0) {\n return undefined;\n }\n\n return configuration;\n };\n\n /**\n * Returns price props for the cart item, depending on tax and discount settings.\n * Used for rendering the price in the UI.\n */\n const getPriceProps = (item: CartModel['items'][number]) => {\n return showIncludedTaxPrice\n ? item.discounted\n ? {\n amount: item.regularPrice.value,\n currency: item.regularPrice.currency,\n 'data-testid': 'discounted-regular-item-price',\n }\n : {\n amount: item.taxedPrice?.value,\n currency: item.taxedPrice?.currency,\n 'data-testid': 'taxed-item-price',\n }\n : {\n amount: item.regularPrice?.value,\n currency: item.regularPrice?.currency,\n 'data-testid': 'regular-item-price',\n };\n };\n\n /**\n * Returns subtotal and discount subtotal props for the cart item.\n * Used for rendering the subtotal and any discount in the UI.\n */\n const getSubtotalProps = (item: CartModel['items'][number]) => {\n const subtotalProps: PriceProps = {\n 'aria-label': dictionary.regularPrice,\n };\n // If the item is discounted, prepare a separate object for the discount subtotal\n const subtotalDiscountProps: PriceProps | null = item.discounted ? {} : null;\n\n if (\n ['INCLUDING_TAX', 'INCLUDING_EXCLUDING_TAX'].includes(\n cartSettings?.price as string\n )\n ) {\n subtotalProps['amount'] = item.rowTotalIncludingTax?.value;\n subtotalProps['currency'] = item.rowTotalIncludingTax?.currency;\n subtotalProps['variant'] = item.discounted ? 'strikethrough' : 'default';\n // @ts-ignore: data-testid is used for testing\n subtotalProps['data-testid'] = 'including-tax-item-total';\n\n if (subtotalDiscountProps) {\n // If discounted, show the original total as the discount\n subtotalProps['amount'] = item.total?.value;\n subtotalProps['currency'] = item.total?.currency;\n\n subtotalDiscountProps['amount'] = item.rowTotalIncludingTax?.value;\n subtotalDiscountProps['currency'] = item.rowTotalIncludingTax?.currency;\n subtotalDiscountProps['sale'] = true;\n subtotalDiscountProps['aria-label'] = dictionary.discountedPrice;\n // @ts-ignore: data-testid is used for testing\n subtotalDiscountProps['data-testid'] = 'discount-total';\n }\n } else {\n subtotalProps['amount'] = item.total?.value;\n subtotalProps['currency'] = item.total?.currency;\n subtotalProps['variant'] = item.discounted ? 'strikethrough' : 'default';\n // @ts-ignore: data-testid is used for testing\n subtotalProps['data-testid'] = 'regular-item-total';\n\n if (subtotalDiscountProps) {\n subtotalDiscountProps['amount'] = item.discountedTotal?.value;\n subtotalDiscountProps['currency'] = item.discountedTotal?.currency;\n subtotalDiscountProps['sale'] = true;\n subtotalDiscountProps['aria-label'] = dictionary.regularPrice;\n // @ts-ignore: data-testid is used for testing\n subtotalDiscountProps['data-testid'] = 'discount-total';\n }\n }\n\n return {\n subtotalProps,\n subtotalDiscountProps,\n };\n };\n\n /**\n * Returns a warning message for the cart item, based on update errors, insufficient quantity, or low inventory.\n * Returns undefined if there is no warning.\n */\n const getWarningMessage = (item: CartModel['items'][number]) => {\n // Check for update error first\n const updateErrorMessage = itemUpdateErrors.get(item.uid);\n\n // Check for insufficient quantity\n const insufficientQuantityText = item.insufficientQuantity && item.stockLevel\n ? item.stockLevel === 'noNumber'\n ? dictionary.insufficientQuantityGeneral // No stock level set\n : dictionary.insufficientQuantity // Stock level set\n .replace('{inventory}', item.stockLevel?.toString())\n .replace('{count}', item.quantity.toString())\n : undefined; // Could not generate insufficient quantity text\n\n // Check for low inventory\n const lowInventoryText = item.lowInventory &&\n item.onlyXLeftInStock &&\n dictionary.lowInventory.replace(\n '{count}',\n item.onlyXLeftInStock?.toString()\n );\n\n // Return the first warning found, or undefined\n return updateErrorMessage || insufficientQuantityText || lowInventoryText || undefined;\n };\n\n /**\n * Processes a quantity change for the cart item, updating state and handling errors.\n * Handles optimistic UI updates and error state.\n */\n const processQuantityChange = useCallback(\n async (item: CartModel['items'][number], value: number) => {\n\n /**\n * Updates the quantity for the cart item in the backend.\n * This function is used internally by processQuantityChange.\n */\n const handleQuantityChange = (item: CartModel['items'][number], quantity: number) => {\n return updateProductsFromCart([\n {\n uid: item.uid,\n quantity,\n },\n ]);\n };\n\n if (isNaN(value) || item.quantity === value) {\n return;\n }\n\n // Clear all item update errors before processing\n setItemUpdateErrors(new Map());\n\n try {\n // Mark item as updating\n setItemsUpdating((prev) => {\n const next = new Map(prev);\n next.set(item.uid, { isUpdating: true, updatedValue: value });\n return next;\n });\n\n await handleQuantityChange(item, value);\n\n // Callbacks for item removal or quantity update\n if (value === 0) {\n onItemRemove?.(item);\n } else {\n onQuantityUpdate?.(item, value);\n }\n } catch (error: any) {\n // Remove updating state and set error message\n setItemsUpdating((prev) => {\n const next = new Map(prev);\n next.delete(item.uid);\n return next;\n });\n setItemUpdateErrors((prev) => {\n const next = new Map(prev);\n next.set(item.uid, error.message);\n return next;\n });\n }\n },\n [onItemRemove, onQuantityUpdate]\n );\n\n /**\n * Debounced version of processQuantityChange (500ms delay).\n * Use this to avoid rapid API calls when the user is typing or clicking quickly.\n */\n const debouncedQuantityChange = useMemo(\n () => debounce(processQuantityChange, 500),\n [processQuantityChange]\n );\n\n /**\n * Removes the item from the cart (sets quantity to 0).\n * Also updates the UI state to reflect the removal.\n */\n const handleRemoveItem = (item: CartModel['items'][number]) => {\n setItemsUpdating((prev) => {\n const next = new Map(prev);\n next.set(item.uid, { isUpdating: true, updatedValue: 0 });\n return next;\n });\n return updateProductsFromCart([\n {\n uid: item.uid,\n quantity: 0,\n },\n ]).then((data) => {\n onItemRemove?.(item);\n return Promise.resolve(data);\n });\n };\n\n /**\n * Sets the updating state for a specific cart item.\n * Used to manually mark an item as updating or not.\n */\n const setItemUpdating = (uid: string, state: boolean) => {\n setItemsUpdating((prev) => {\n const next = new Map(prev);\n next.set(uid, { isUpdating: state, updatedValue: state });\n return next;\n });\n };\n\n /**\n * Sets or clears the update error for a specific cart item.\n * Pass an error string to set, or an empty string to clear.\n */\n const setItemUpdateError = (uid: string, error: string) => {\n setItemUpdateErrors((prev) => {\n const next = new Map(prev);\n if (error) {\n next.set(uid, error);\n } else {\n next.delete(uid);\n }\n return next;\n });\n };\n\n // Construct the API object to return from the hook\n const api: UseCartItemsApi = {\n showIncludedTaxPrice,\n showExcludingTaxPrice,\n itemsUpdating,\n itemUpdateErrors,\n getConfiguration,\n getPriceProps,\n getSubtotalProps,\n processQuantityChange,\n debouncedQuantityChange,\n setItemsUpdating,\n getWarningMessage,\n setItemUpdateError,\n handleRemoveItem,\n setItemUpdating,\n };\n\n // Return the API for use in components\n return api;\n};","/********************************************************************\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { Button, Icon } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Close } from '@adobe-commerce/elsie/icons';\nimport { VComponent, classes } from '@adobe-commerce/elsie/lib';\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\n\nimport '@adobe-commerce/elsie/components/InLineAlert/InLineAlert.css';\nexport interface InLineAlertProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'icon'> {\n variant?: 'primary' | 'secondary';\n heading: string;\n description?: string;\n type?: 'error' | 'warning' | 'success';\n icon?: VNode<HTMLAttributes<SVGSVGElement>>;\n additionalActions?: Array<{\n label: string;\n onClick: (event: Event) => void;\n }>;\n onDismiss?: (event: Event) => void;\n itemList?: VNode;\n actionButtonPosition?: 'top' | 'bottom';\n}\n\nexport const InLineAlert: FunctionComponent<InLineAlertProps> = ({\n variant = 'primary',\n className,\n type = 'warning',\n additionalActions,\n onDismiss,\n heading,\n description,\n icon,\n itemList,\n actionButtonPosition,\n ...props\n}) => {\n const translations = useText({\n dismiss: 'Dropin.InlineAlert.dismissLabel',\n });\n\n return (\n <div\n {...props}\n className={classes([\n 'dropin-in-line-alert',\n `dropin-in-line-alert--${type}`,\n `dropin-in-line-alert--${variant}`,\n className,\n ])}\n >\n <div className={'dropin-in-line-alert__heading'}>\n <div className={'dropin-in-line-alert__title-container'}>\n {icon && (\n <VComponent node={icon} className={'dropin-in-line-alert__icon'} />\n )}\n\n <span className={'dropin-in-line-alert__title'}>{heading}</span>\n </div>\n\n <div className={'dropin-in-line-alert__actions-container'}>\n {additionalActions &&\n (actionButtonPosition === 'top' ||\n (!actionButtonPosition && additionalActions.length <= 1)) && (\n <Button\n variant=\"tertiary\"\n className={'dropin-in-line-alert__additional-action'}\n onClick={\n additionalActions.length > 0\n ? additionalActions[0]?.onClick\n : undefined\n }\n aria-label={additionalActions[0]?.label}\n >\n {additionalActions[0]?.label}\n </Button>\n )}\n {onDismiss && (\n <Button\n icon={<Icon source={Close} size=\"24\" stroke=\"2\" />}\n className={'dropin-in-line-alert__dismiss-button'}\n variant=\"tertiary\"\n onClick={onDismiss}\n aria-label={translations.dismiss}\n />\n )}\n </div>\n </div>\n\n {description && (\n <p className={'dropin-in-line-alert__description'}>{description}</p>\n )}\n <div className={'dropin-in-line-alert__item-list-container'}>\n {itemList && (\n <VComponent\n node={itemList}\n className={classes(['dropin-in-line-alert__item-list'])}\n />\n )}\n </div>\n {additionalActions &&\n (actionButtonPosition === 'bottom' ||\n (!actionButtonPosition && additionalActions.length > 1)) && (\n <div className={'dropin-in-line-alert__additional-actions-container'}>\n {additionalActions.map((action) => (\n <Button\n key={action.label}\n variant=\"tertiary\"\n className={'dropin-in-line-alert__additional-action'}\n onClick={action.onClick}\n >\n {action.label}\n </Button>\n ))}\n </div>\n )}\n </div>\n );\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { HTMLAttributes } from 'preact/compat';\nimport { classes, Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { CartModel } from '@/cart/data/models/cart-model';\nimport { CartSummaryTable as CartSummaryTableComponent } from '@/cart/components';\nimport {\n Price,\n Skeleton,\n SkeletonRow,\n Image,\n ImageProps,\n Icon,\n Button,\n} from '@adobe-commerce/elsie/components';\nimport { useState, useEffect, useMemo, useCallback } from 'preact/hooks';\nimport { events } from '@adobe-commerce/event-bus';\nimport {\n Cart,\n OrderError,\n Trash,\n WarningWithCircle,\n} from '@adobe-commerce/elsie/icons';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Item } from '@/cart/components/CartSummaryTable/Elements/Item/Item';\nimport { useCartItems } from '@/cart/hooks/useCartItems';\nimport { getPersistedCartData } from '@/cart/lib/persisted-data';\nimport { InLineAlert } from '@adobe-commerce/elsie/components/InLineAlert';\nimport { addProductsToCart } from '@/cart/api/addProductsToCart/addProductsToCart';\nimport { VNode } from 'preact';\nimport { EmptyCart } from '@/cart/containers/EmptyCart';\n\nexport interface CartSummaryTableContainerProps\n extends HTMLAttributes<HTMLDivElement> {\n /** Initial data for the cart */\n initialData?: CartModel | null;\n /** Optional CSS class name for custom styling */\n className?: string;\n /** Slots for customizing different parts of the table */\n slots?: {\n /** Slot for customizing the item cell content */\n Item?: SlotProps<{ item: CartModel['items'][number] }>;\n /** Slot for customizing the price cell content */\n Price?: SlotProps<{ item: CartModel['items'][number] }>;\n /** Slot for customizing the quantity cell content */\n Quantity?: SlotProps<{\n item: CartModel['items'][number];\n isUpdating: boolean;\n quantityInputValue: number;\n handleInputChange: (e: Event) => void;\n itemUpdateErrors: Map<string, string>;\n }>;\n /** Slot for customizing the subtotal cell content */\n Subtotal?: SlotProps<{ item: CartModel['items'][number] }>;\n /** Slot for customizing the thumbnail image on an item */\n Thumbnail?: SlotProps<{\n item: CartModel['items'][number];\n defaultImageProps: ImageProps;\n index: number;\n }>;\n /** Slot for customizing the product title on an item */\n ProductTitle?: SlotProps<{ item: CartModel['items'][number] }>;\n /** Slot for customizing the product sku on an item */\n Sku?: SlotProps<{ item: CartModel['items'][number] }>;\n /** Slot for customizing the product configurations on an item */\n Configurations?: SlotProps<{ item: CartModel['items'][number] }>;\n /** Slot for customizing the product alert on an item */\n ItemAlert?: SlotProps<{ item: CartModel['items'][number] }>;\n /** Slot for customizing the product warning on an item */\n ItemWarning?: SlotProps<{ item: CartModel['items'][number] }>;\n /** Slot for customizing the actions on an item */\n Actions?: SlotProps<{\n item: CartModel['items'][number];\n itemsUpdating: Map<string, { isUpdating: boolean; updatedValue: number }>;\n setItemUpdating: (uid: string, state: boolean) => void;\n setItemUpdateError: (uid: string, error: string) => void;\n }>;\n UndoBanner?: SlotProps<{\n item: CartModel['items'][number];\n loading: boolean;\n error?: string;\n onUndo: () => void;\n onDismiss: () => void;\n }>;\n /** Slot for customizing the empty cart */\n EmptyCart?: SlotProps;\n };\n /** Function for getting the product page route */\n routeProduct?: (item: CartModel['items'][number]) => string;\n /** Function for getting the empty cart CTA route */\n routeEmptyCartCTA?: () => string;\n /** Whether to allow quantity updates */\n allowQuantityUpdates?: boolean;\n /** Whether to allow remove items */\n allowRemoveItems?: boolean;\n /** On quantity update */\n onQuantityUpdate?: (\n item: CartModel['items'][number],\n quantity: number\n ) => void;\n /** On item remove */\n onItemRemove?: (item: CartModel['items'][number]) => void;\n /** Whether to enable undo functionality for removed items */\n undo?: boolean;\n}\n\n/**\n * Skeleton loader component for the cart summary table\n */\nconst CartSummaryTableSkeleton = () => {\n return (\n <Skeleton\n data-testid=\"cart-summary-table-skeleton\"\n className=\"cart-cart-summary-table__skeleton\"\n rowGap=\"medium\"\n >\n <SkeletonRow\n variant=\"row\"\n size=\"xlarge\"\n fullWidth={true}\n lines={4}\n multilineGap=\"small\"\n />\n </Skeleton>\n );\n};\n\n/**\n * Container component for CartSummaryTable that provides slots for customizing the table cells\n * and handles data management\n */\nexport const CartSummaryTable: Container<\n CartSummaryTableContainerProps,\n CartModel | null\n> = ({\n initialData = null,\n routeProduct,\n routeEmptyCartCTA,\n slots,\n className,\n allowQuantityUpdates = true,\n allowRemoveItems = true,\n onQuantityUpdate,\n onItemRemove,\n undo = false,\n ...props\n}) => {\n const [loading, setLoading] = useState(!initialData);\n const [cartModelData, setCartModelData] = useState<CartModel | null>(\n initialData\n );\n const [recentlyRemovedItems, setRecentlyRemovedItems] = useState<\n {\n item: CartModel['items'][number];\n index: number;\n loading: boolean;\n error?: string;\n }[]\n >([]);\n /** I18n text for the cart summary table */\n const dictionary = useText({\n file: 'Cart.CartItem.file',\n files: 'Cart.CartItem.files',\n heading: 'Cart.Cart.heading',\n message: 'Cart.CartItem.message',\n recipient: 'Cart.CartItem.recipient',\n regularPrice: 'Cart.CartItem.regularPrice',\n discountedPrice: 'Cart.CartItem.discountedPrice',\n sender: 'Cart.CartItem.sender',\n lowInventory: 'Cart.CartItem.lowInventory',\n insufficientQuantity: 'Cart.CartItem.insufficientQuantity',\n insufficientQuantityGeneral: 'Cart.CartItem.insufficientQuantityGeneral',\n outOfStockHeading: 'Cart.OutOfStockMessage.heading',\n outOfStockDescription: 'Cart.OutOfStockMessage.message',\n outOfStockAlert: 'Cart.OutOfStockMessage.alert',\n removeAction: 'Cart.OutOfStockMessage.action',\n notAvailableMessage: 'Cart.CartItem.notAvailableMessage',\n viewMore: 'Cart.Cart.viewMore',\n viewAll: 'Cart.Cart.viewAll',\n discountPercent: 'Cart.CartItem.discountPercentage',\n savingsAmount: 'Cart.CartItem.savingsAmount',\n includingTax: 'Cart.CartItem.includingTax',\n excludingTax: 'Cart.CartItem.excludingTax',\n remove: 'Dropin.CartItem.remove.label',\n removeDefault: 'Dropin.CartItem.removeDefault.label',\n quantity: 'Dropin.CartItem.quantity.label',\n itemBeingRemoved: 'Cart.CartItem.itemBeingRemoved',\n itemRemoved: 'Cart.CartItem.itemRemoved',\n itemRemovedDescription: 'Cart.CartItem.itemRemovedDescription',\n undoAction: 'Cart.CartItem.undoAction',\n dismissAction: 'Cart.CartItem.dismissAction',\n });\n\n /** Helper functions */\n const {\n showIncludedTaxPrice,\n showExcludingTaxPrice,\n itemsUpdating,\n itemUpdateErrors,\n getConfiguration,\n getPriceProps,\n getSubtotalProps,\n debouncedQuantityChange,\n setItemsUpdating,\n getWarningMessage,\n handleRemoveItem,\n setItemUpdating,\n setItemUpdateError,\n } = useCartItems({ dictionary, onQuantityUpdate, onItemRemove });\n\n // Helper to add to recently removed items for undo\n function addToRecentlyRemovedItems(uid: string) {\n const cart = getPersistedCartData();\n const item = cart?.items.find((i) => i.uid === uid);\n if (item) {\n setRecentlyRemovedItems((prev) => {\n const index = cart.items.findIndex((i) => i.uid === uid);\n if (index !== -1 && !prev.some((r) => r.item.uid === uid)) {\n // Emit the event for analytics or listeners\n events.emit('cart/product/removed', { item, index });\n return [...prev, { item, index, loading: false, error: undefined }];\n }\n return prev;\n });\n }\n }\n\n const handleUndo = createUndoHandler(\n recentlyRemovedItems,\n setRecentlyRemovedItems\n );\n\n const handleDismiss = createDismissHandler(setRecentlyRemovedItems);\n\n const handleRemoveWithUndo = useCallback(\n (item: CartModel['items'][number]) => {\n if (undo) {\n addToRecentlyRemovedItems(item.uid);\n }\n handleRemoveItem(item); // original remove logic\n },\n [undo, handleRemoveItem]\n );\n\n /**\n * Handle the cart data event\n */\n useEffect(() => {\n const cartDataEvent = events.on(\n 'cart/data',\n (payload: Cart | null) => {\n setLoading(true);\n setCartModelData(payload as CartModel);\n setItemsUpdating(new Map());\n setLoading(false);\n },\n { eager: true }\n );\n\n return () => {\n cartDataEvent?.off();\n };\n }, [setLoading, setCartModelData, setItemsUpdating]);\n\n // Transform cart items into table entries with slots for customization\n const entries = useMemo(\n () =>\n cartModelData?.items\n ?.sort((a, b) => {\n // Sort out of stock items and items with update errors last\n // to show them at the top since we are rendering the list in reverse order\n if (itemUpdateErrors.has(a.uid) && !itemUpdateErrors.has(b.uid))\n return -1;\n if (!itemUpdateErrors.has(a.uid) && itemUpdateErrors.has(b.uid))\n return 1;\n if (a.outOfStock && !b.outOfStock) return -1;\n if (!a.outOfStock && b.outOfStock) return 1;\n return 0;\n })\n .map((item, index) => {\n const isUpdating = itemsUpdating.has(item.uid);\n const warningMessage = getWarningMessage(item);\n\n const productTitle = (\n <Slot\n name=\"ProductTitle\"\n slot={slots?.ProductTitle}\n context={{ item }}\n >\n {routeProduct ? (\n <a href={routeProduct(item)}>{item.name}</a>\n ) : (\n item.name\n )}\n </Slot>\n );\n\n const defaultImageProps = {\n src: item.image.src,\n alt: item.image.alt,\n width: '300',\n height: '300',\n params: { width: 300 },\n };\n\n const defaultImage = (\n <Image\n data-testid={`cart-table-item-image-${item.sku}`}\n loading={index < 4 ? 'eager' : 'lazy'}\n {...defaultImageProps}\n />\n );\n\n const productImage = (\n <Slot\n name=\"Thumbnail\"\n slot={slots?.Thumbnail}\n className=\"cart-cart-summary-table__item-image-wrapper\"\n context={{\n item,\n defaultImageProps: {\n ...defaultImageProps,\n loading: index < 4 ? 'eager' : 'lazy',\n },\n index,\n }}\n >\n {routeProduct ? (\n <a href={routeProduct(item)}>{defaultImage}</a>\n ) : (\n defaultImage\n )}\n </Slot>\n );\n\n const productSku = (\n <Slot name=\"Sku\" slot={slots?.Sku} context={{ item }}>\n {item.sku}\n </Slot>\n );\n\n const itemAlert =\n item.outOfStock || slots?.ItemAlert ? (\n <Slot name=\"ItemAlert\" slot={slots?.ItemAlert} context={{ item }}>\n {item.outOfStock && (\n <div\n className=\"cart-cart-summary-table__item-quantity-alert-wrapper\"\n data-testid={`cart-table-item-quantity-alert-${item.uid}`}\n >\n <Icon\n className=\"cart-cart-summary-table__item-quantity-alert-icon\"\n source={OrderError}\n size={'16'}\n />\n <span className=\"cart-cart-summary-table__item-quantity-alert-text\">\n {dictionary.outOfStockAlert}\n </span>\n </div>\n )}\n </Slot>\n ) : undefined;\n\n const itemWarning =\n warningMessage || slots?.ItemWarning ? (\n <Slot\n name=\"ItemWarning\"\n slot={slots?.ItemWarning}\n context={{ item }}\n >\n {warningMessage && (\n <div\n className=\"cart-cart-summary-table__item-quantity-warning-wrapper\"\n data-testid={`cart-table-item-quantity-warning-${item.uid}`}\n >\n <Icon\n className=\"cart-cart-summary-table__item-quantity-warning-icon\"\n source={WarningWithCircle}\n size={'16'}\n />\n <span className=\"cart-cart-summary-table__item-quantity-warning-text\">\n {warningMessage}\n </span>\n </div>\n )}\n </Slot>\n ) : undefined;\n\n const itemConfigurations = getConfiguration({ item });\n const productConfigurations =\n itemConfigurations || slots?.Configurations ? (\n <Slot\n name=\"Configurations\"\n slot={slots?.Configurations}\n context={{ item }}\n >\n {itemConfigurations && (\n <ul\n className=\"cart-cart-summary-table__item-configurations\"\n data-testid={`cart-table-item-configurations-${item.sku}`}\n >\n {Object.entries(itemConfigurations).map(([key, value]) => (\n <li\n className=\"cart-cart-summary-table__item-configuration\"\n data-testid={`cart-table-item-configuration-${key}`}\n key={key}\n >\n <span className=\"cart-cart-summary-table__item-configuration-label\">\n {key}:\n </span>\n <span className=\"cart-cart-summary-table__item-configuration-value\">\n {value}\n </span>\n </li>\n ))}\n </ul>\n )}\n </Slot>\n ) : undefined;\n\n const { subtotalProps, subtotalDiscountProps } =\n getSubtotalProps(item);\n\n const updatedValue = itemsUpdating.get(item.uid)?.updatedValue;\n const quantityInputValue =\n isUpdating && !isNaN(updatedValue) ? updatedValue : item.quantity;\n\n const handleInputChange = (e: Event) => {\n const target = e.target as HTMLInputElement;\n const value = parseInt(target.value, 10);\n\n debouncedQuantityChange(item, value);\n };\n\n const isBeingRemoved =\n itemsUpdating.has(item.uid) &&\n itemsUpdating.get(item.uid)?.updatedValue === 0;\n const actions = (\n <Slot\n name=\"Actions\"\n slot={slots?.Actions}\n context={{\n item,\n itemsUpdating,\n setItemUpdating,\n setItemUpdateError,\n }}\n >\n {allowRemoveItems && !isBeingRemoved && (\n <Button\n variant=\"tertiary\"\n size=\"medium\"\n className=\"cart-cart-summary-table__item-remove-button\"\n data-testid={`cart-table-item-remove-${item.uid}`}\n icon={<Icon source={Trash} size={'32'} />}\n onClick={() => handleRemoveWithUndo(item)}\n aria-label={\n dictionary.remove?.replace('{product}', item.name) ||\n dictionary.removeDefault\n }\n />\n )}\n </Slot>\n );\n\n return {\n key: item.uid,\n uid: item.uid,\n updating: isUpdating,\n hasError: item.outOfStock || itemUpdateErrors.has(item.uid),\n item: (\n <Slot name=\"Item\" slot={slots?.Item} context={{ item }}>\n <Item\n productTitle={productTitle}\n image={productImage}\n sku={productSku}\n configurations={productConfigurations}\n alert={itemAlert}\n warning={itemWarning}\n />\n </Slot>\n ),\n price: (\n <Slot\n name=\"Price\"\n className=\"cart-cart-summary-table__item-price\"\n slot={slots?.Price}\n context={{ item }}\n >\n <Price {...getPriceProps(item)} />\n {showIncludedTaxPrice && (\n <span className=\"cart-cart-summary-table__item-price-tax-label\">\n {dictionary.includingTax}:&nbsp;\n <Price\n amount={item.taxedPrice?.value}\n currency={item.taxedPrice?.currency}\n />\n </span>\n )}\n {showExcludingTaxPrice && (\n <span className=\"cart-cart-summary-table__item-price-tax-label\">\n {dictionary.excludingTax}:&nbsp;\n <Price\n amount={item.regularPrice?.value}\n currency={item.regularPrice?.currency}\n />\n </span>\n )}\n </Slot>\n ),\n quantity: (\n <Slot\n name=\"Quantity\"\n className=\"cart-cart-summary-table__item-qty\"\n slot={slots?.Quantity}\n context={{\n item,\n isUpdating,\n quantityInputValue,\n handleInputChange,\n itemUpdateErrors,\n }}\n >\n {allowQuantityUpdates ? (\n <input\n id={`cart-table-item-quantity-${item.uid}`}\n data-testid={`cart-table-item-quantity-${item.uid}`}\n type=\"number\"\n min=\"1\"\n value={quantityInputValue}\n disabled={isUpdating}\n aria-label={dictionary.quantity}\n className={classes([\n 'cart-cart-summary-table__cell-qty-input',\n 'cart-cart-summary-table__cell-qty-updater',\n [\n 'cart-cart-summary-table__cell-qty-updater--disabled',\n isUpdating,\n ],\n [\n 'cart-cart-summary-table__cell-qty-updater--error',\n itemUpdateErrors.has(item.uid),\n ],\n ])}\n onChange={handleInputChange}\n />\n ) : (\n <span>{item.quantity}</span>\n )}\n </Slot>\n ),\n subtotal: (\n <Slot\n name=\"Subtotal\"\n className=\"cart-cart-summary-table__item-subtotal\"\n slot={slots?.Subtotal}\n context={{ item }}\n >\n <Price {...subtotalProps} />\n {subtotalDiscountProps && <Price {...subtotalDiscountProps} />}\n {showIncludedTaxPrice && (\n <span className=\"cart-cart-summary-table__item-subtotal-tax-label\">\n {dictionary.includingTax}:&nbsp;\n <Price\n amount={item.rowTotalIncludingTax?.value}\n currency={item.rowTotalIncludingTax?.currency}\n />\n </span>\n )}\n {showExcludingTaxPrice && (\n <span className=\"cart-cart-summary-table__item-subtotal-tax-label\">\n {dictionary.excludingTax}:&nbsp;\n <Price\n amount={item.rowTotal?.value}\n currency={item.rowTotal?.currency}\n />\n </span>\n )}\n </Slot>\n ),\n actions,\n };\n }) || [],\n [\n cartModelData,\n itemsUpdating,\n allowQuantityUpdates,\n routeProduct,\n slots,\n itemUpdateErrors,\n dictionary,\n getConfiguration,\n allowRemoveItems,\n debouncedQuantityChange,\n getWarningMessage,\n getPriceProps,\n getSubtotalProps,\n setItemUpdating,\n setItemUpdateError,\n showIncludedTaxPrice,\n showExcludingTaxPrice,\n handleRemoveWithUndo,\n ]\n );\n\n /**\n * Render the cart summary table skeleton if the cart is loading\n */\n if (loading) {\n return <CartSummaryTableSkeleton />;\n }\n const renderTableWithUndoBanners = () => {\n if (!cartModelData?.items) return null;\n const tableEntries: any[] = [];\n const items = cartModelData.items;\n\n // Process items up to the available entries length\n for (let i = 0; i <= entries.length; i++) {\n // Render undo banners for this index position if undo is enabled\n if (undo) {\n recentlyRemovedItems\n .filter((r) => r.index === i)\n .forEach(({ item, error }) => {\n const isUndoBeingRemoved = getIsUndoBeingRemoved(item.uid, itemsUpdating);\n const undoBanner = createUndoBanner(\n { item, index: i, error },\n item,\n isUndoBeingRemoved,\n dictionary,\n handleUndo,\n handleDismiss,\n slots\n );\n \n // Add undo banner as a special entry\n tableEntries.push({\n uid: `undo-banner-${item.uid}`,\n updating: false,\n hasError: false,\n item: <div />,\n price: <div />,\n quantity: <div />,\n subtotal: <div />,\n actions: <div />,\n undoBanner,\n });\n });\n }\n \n // Render cart item if not at the end and within the entries limit\n if (i < entries.length && i < items.length) {\n tableEntries.push(entries[i]);\n }\n }\n \n return (\n <CartSummaryTableComponent\n entries={tableEntries}\n className={className}\n {...props}\n />\n );\n };\n\n /**\n * Create empty cart component with undo banner support\n */\n const emptyCart = (\n <Slot name=\"EmptyCart\" slot={slots?.EmptyCart} context={{}}>\n <EmptyCart ctaLinkURL={routeEmptyCartCTA?.()} />\n </Slot>\n );\n\n /**\n * Choose between original table entries and undo banner version (matches CartSummaryList logic)\n */\n const tableContent = \n cartModelData?.totalQuantity ||\n (undo && recentlyRemovedItems.length > 0) ? (\n !undo ? (\n <CartSummaryTableComponent\n entries={entries}\n className={className}\n {...props}\n />\n ) : recentlyRemovedItems.length > 0 ? (\n renderTableWithUndoBanners()\n ) : (\n <CartSummaryTableComponent\n entries={entries}\n className={className}\n {...props}\n />\n )\n ) : emptyCart;\n\n /**\n * Render the cart summary table\n */\n return tableContent;\n};\n\nCartSummaryTable.getInitialData = async function () {\n return getPersistedCartData();\n};\n\nexport const createUndoHandler = (\n recentlyRemovedItems: {\n item: CartModel['items'][number];\n index: number;\n loading: boolean;\n error?: string;\n }[],\n setRecentlyRemovedItems: (\n updater: (\n prev: {\n item: CartModel['items'][number];\n index: number;\n loading: boolean;\n error?: string;\n }[]\n ) => {\n item: CartModel['items'][number];\n index: number;\n loading: boolean;\n error?: string;\n }[]\n ) => void\n) => {\n return async (uid: string) => {\n setRecentlyRemovedItems((prev) =>\n prev.map((r) => (r.item.uid === uid ? { ...r, error: undefined } : r))\n );\n\n const removed = recentlyRemovedItems.find((r) => r.item.uid === uid);\n if (!removed) return;\n\n try {\n await addProductsToCart([\n {\n sku: removed.item.sku,\n parentSku: removed.item.topLevelSku,\n quantity: removed.item.quantity,\n optionsUIDs:\n removed.item.bundleOptionsUIDs || // Use bundle option UIDs for bundle products\n (removed.item.selectedOptionsUIDs\n ? Object.values(removed.item.selectedOptionsUIDs)\n : undefined),\n enteredOptions: removed.item.customizableOptions\n ? Object.entries(removed.item.customizableOptions).map(\n ([uid, value]) => ({ uid, value })\n )\n : undefined,\n },\n ]);\n setRecentlyRemovedItems((prev) => prev.filter((r) => r.item.uid !== uid));\n } catch (error: any) {\n setRecentlyRemovedItems((prev) =>\n prev.map((r) =>\n r.item.uid === uid\n ? { ...r, error: error?.message || 'Failed to restore item.' }\n : r\n )\n );\n }\n };\n};\n\nexport const createDismissHandler = (\n setRecentlyRemovedItems: (\n updater: (\n prev: {\n item: CartModel['items'][number];\n index: number;\n loading: boolean;\n error?: string;\n }[]\n ) => {\n item: CartModel['items'][number];\n index: number;\n loading: boolean;\n error?: string;\n }[]\n ) => void\n) => {\n return (uid: string) => {\n setRecentlyRemovedItems((prev) => prev.filter((r) => r.item.uid !== uid));\n };\n};\n\n/**\n * Helper function to determine if an undo is currently being removed\n * This makes the logic more explicit and testable\n */\nexport const getIsUndoBeingRemoved = (\n itemUid: string,\n itemsUpdating: Map<string, { isUpdating: boolean; updatedValue: number }>\n): boolean => {\n return itemsUpdating.has(itemUid) && itemsUpdating.get(itemUid)?.updatedValue === 0;\n};\n\n/**\n * Helper function to create additional actions for undo banner\n * This makes the ternary operator logic more explicit and testable\n */\nexport const createUndoBannerActions = (\n isUndoBeingRemoved: boolean,\n dictionary: any,\n handleUndo: (uid: string) => void,\n handleDismiss: (uid: string) => void,\n itemUid: string,\n itemName: string\n) => {\n if (isUndoBeingRemoved) {\n return []; // Hide buttons while removing\n }\n \n return [\n {\n label: dictionary.undoAction,\n onClick: () => {\n handleUndo(itemUid);\n },\n 'aria-label': `${dictionary.undoAction} remove ${itemName}`,\n },\n {\n label: dictionary.dismissAction,\n onClick: () => {\n handleDismiss(itemUid);\n },\n 'aria-label': `${dictionary.dismissAction} undo for ${itemName}`,\n },\n ];\n};\n\n/**\n * Helper function to create undo callback\n */\nexport const createUndoCallback = (\n handleUndo: (uid: string) => void,\n itemUid: string\n) => {\n return () => handleUndo(itemUid);\n};\n\n/**\n * Helper function to create dismiss callback\n */\nexport const createDismissCallback = (\n handleDismiss: (uid: string) => void,\n itemUid: string\n) => {\n return () => handleDismiss(itemUid);\n};\n\nexport const createUndoBanner = (\n removed: { item: CartModel['items'][number]; index: number; error?: string },\n item: CartModel['items'][number],\n isUndoBeingRemoved: boolean,\n dictionary: any,\n handleUndo: (uid: string) => void,\n handleDismiss: (uid: string) => void,\n slots?: CartSummaryTableContainerProps['slots']\n): VNode => {\n const additionalActions = createUndoBannerActions(\n isUndoBeingRemoved,\n dictionary,\n handleUndo,\n handleDismiss,\n removed.item.uid,\n removed.item.name\n );\n\n const onUndoCallback = createUndoCallback(handleUndo, removed.item.uid);\n const onDismissCallback = createDismissCallback(handleDismiss, removed.item.uid);\n\n return (\n <Slot\n name=\"UndoBanner\"\n slot={slots?.UndoBanner}\n context={{\n item: removed.item,\n loading: isUndoBeingRemoved,\n error: removed.error,\n onUndo: onUndoCallback,\n onDismiss: onDismissCallback,\n }}\n key={`undo-banner-${removed.item.uid}`}\n >\n <InLineAlert\n key={`undo-banner-${removed.item.uid}`}\n type={removed.error ? 'error' : 'info'}\n heading={\n isUndoBeingRemoved\n ? dictionary.itemBeingRemoved?.replace('{product}', item.name)\n : dictionary.itemRemoved?.replace('{product}', removed.item.name)\n }\n description={removed.error || dictionary.itemRemovedDescription}\n variant=\"primary\"\n actionButtonPosition=\"bottom\"\n additionalActions={additionalActions}\n />\n </Slot>\n );\n};\n"],"names":["CartSummaryTable","entries","className","props","dictionary","useText","jsxs","classes","jsx","entry","VComponent","Item","productTitle","sku","image","configurations","alert","warning","useCartItems","onQuantityUpdate","onItemRemove","itemsUpdating","setItemsUpdating","useState","itemUpdateErrors","setItemUpdateErrors","cartSettings","_b","_a","state","showIncludedTaxPrice","showExcludingTaxPrice","getConfiguration","item","configuration","getPriceProps","_c","_d","getSubtotalProps","subtotalProps","subtotalDiscountProps","_e","_f","_g","_h","_i","_j","getWarningMessage","updateErrorMessage","insufficientQuantityText","lowInventoryText","processQuantityChange","useCallback","value","handleQuantityChange","quantity","updateProductsFromCart","prev","next","error","debouncedQuantityChange","useMemo","debounce","uid","data","InLineAlert","variant","type","additionalActions","onDismiss","heading","description","icon","itemList","actionButtonPosition","translations","Button","Icon","Close","action","CartSummaryTableSkeleton","Skeleton","SkeletonRow","initialData","routeProduct","routeEmptyCartCTA","slots","allowQuantityUpdates","allowRemoveItems","undo","loading","setLoading","cartModelData","setCartModelData","recentlyRemovedItems","setRecentlyRemovedItems","handleRemoveItem","setItemUpdating","setItemUpdateError","addToRecentlyRemovedItems","cart","getPersistedCartData","i","index","r","events","handleUndo","createUndoHandler","handleDismiss","createDismissHandler","handleRemoveWithUndo","useEffect","cartDataEvent","payload","a","b","isUpdating","warningMessage","Slot","defaultImageProps","defaultImage","Image","productImage","productSku","itemAlert","OrderError","itemWarning","WarningWithCircle","itemConfigurations","productConfigurations","key","updatedValue","quantityInputValue","handleInputChange","e","target","isBeingRemoved","actions","Trash","Price","_k","renderTableWithUndoBanners","tableEntries","items","isUndoBeingRemoved","getIsUndoBeingRemoved","undoBanner","createUndoBanner","CartSummaryTableComponent","emptyCart","EmptyCart","removed","addProductsToCart","itemUid","createUndoBannerActions","itemName","createUndoCallback","createDismissCallback","onUndoCallback","onDismissCallback"],"mappings":"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","x_google_ignoreList":[3]}
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
3
- import{jsx as r}from"@dropins/tools/preact-jsx-runtime.js";import{classes as o}from"@dropins/tools/lib.js";import{IllustratedMessage as i,Button as s,Icon as m}from"@dropins/tools/components.js";/* empty css */import*as t from"@dropins/tools/preact-compat.js";import{useText as l}from"@dropins/tools/i18n.js";const p=e=>t.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e},t.createElement("g",{clipPath:"url(#clip0_102_196)"},t.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M18.3601 18.16H6.5601L4.8801 3H2.3501M19.6701 19.59C19.6701 20.3687 19.0388 21 18.2601 21C17.4814 21 16.8501 20.3687 16.8501 19.59C16.8501 18.8113 17.4814 18.18 18.2601 18.18C19.0388 18.18 19.6701 18.8113 19.6701 19.59ZM7.42986 19.59C7.42986 20.3687 6.79858 21 6.01986 21C5.24114 21 4.60986 20.3687 4.60986 19.59C4.60986 18.8113 5.24114 18.18 6.01986 18.18C6.79858 18.18 7.42986 18.8113 7.42986 19.59Z",stroke:"currentColor",strokeLinejoin:"round"}),t.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M5.25 6.37L20.89 8.06L20.14 14.8H6.19",stroke:"currentColor",strokeLinejoin:"round"})),t.createElement("defs",null,t.createElement("clipPath",{id:"clip0_102_196"},t.createElement("rect",{vectorEffect:"non-scaling-stroke",width:19.29,height:19.5,fill:"white",transform:"translate(2.3501 2.25)"})))),g=({className:e,children:d,ctaLinkURL:a,...n})=>{const c=l({emptyCart:"Cart.EmptyCart.heading",cta:"Cart.EmptyCart.cta"});return r("div",{...n,className:o(["cart-empty-cart",e]),children:r(i,{className:o(["cart-empty-cart__wrapper",e]),"data-testid":"cart-empty-cart",heading:c.emptyCart,icon:r(m,{className:"cart-empty-cart__icon",source:p}),action:a?r(s,{"data-testid":"cart-empty-cart-button",size:"medium",variant:"primary",type:"submit",href:a,children:c.cta},"routeHome"):void 0})})};export{g as E};
3
+ import{jsx as t}from"@dropins/tools/preact-jsx-runtime.js";import{E as p}from"./EmptyCart2.js";import"@dropins/tools/lib.js";import"@dropins/tools/preact-compat.js";/* empty css */import"@dropins/tools/components.js";import"@dropins/tools/preact-hooks.js";const c=({routeCTA:m})=>t(p,{ctaLinkURL:m==null?void 0:m()});export{c as E};
4
4
  //# sourceMappingURL=EmptyCart.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EmptyCart.js","sources":["../../node_modules/@adobe-commerce/elsie/src/icons/Cart.svg","/@dropins/storefront-cart/src/components/EmptyCart/EmptyCart.tsx"],"sourcesContent":["import * as React from \"react\";\nconst SvgCart = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { clipPath: \"url(#clip0_102_196)\" }, /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M18.3601 18.16H6.5601L4.8801 3H2.3501M19.6701 19.59C19.6701 20.3687 19.0388 21 18.2601 21C17.4814 21 16.8501 20.3687 16.8501 19.59C16.8501 18.8113 17.4814 18.18 18.2601 18.18C19.0388 18.18 19.6701 18.8113 19.6701 19.59ZM7.42986 19.59C7.42986 20.3687 6.79858 21 6.01986 21C5.24114 21 4.60986 20.3687 4.60986 19.59C4.60986 18.8113 5.24114 18.18 6.01986 18.18C6.79858 18.18 7.42986 18.8113 7.42986 19.59Z\", stroke: \"currentColor\", strokeLinejoin: \"round\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M5.25 6.37L20.89 8.06L20.14 14.8H6.19\", stroke: \"currentColor\", strokeLinejoin: \"round\" })), /* @__PURE__ */ React.createElement(\"defs\", null, /* @__PURE__ */ React.createElement(\"clipPath\", { id: \"clip0_102_196\" }, /* @__PURE__ */ React.createElement(\"rect\", { vectorEffect: \"non-scaling-stroke\", width: 19.29, height: 19.5, fill: \"white\", transform: \"translate(2.3501 2.25)\" }))));\nexport default SvgCart;\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { FunctionComponent } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { classes } from '@adobe-commerce/elsie/lib';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Button, Icon, IllustratedMessage } from '@adobe-commerce/elsie/components';\nimport { Cart } from '@adobe-commerce/elsie/icons';\n\nimport '@/cart/components/EmptyCart/EmptyCart.css';\n\nexport interface EmptyCartProps extends HTMLAttributes<HTMLDivElement> {\n ctaLinkURL?: string;\n}\n\nexport const EmptyCart: FunctionComponent<EmptyCartProps> = ({\n className,\n children,\n ctaLinkURL,\n ...props\n}) => {\n const labels = useText({\n emptyCart: 'Cart.EmptyCart.heading',\n cta: 'Cart.EmptyCart.cta',\n });\n\n return (\n <div {...props} className={classes(['cart-empty-cart', className])}>\n <IllustratedMessage\n className={classes(['cart-empty-cart__wrapper', className])}\n data-testid=\"cart-empty-cart\"\n heading={labels.emptyCart}\n icon={<Icon className=\"cart-empty-cart__icon\" source={Cart} />}\n action={\n ctaLinkURL ? (\n <Button\n data-testid=\"cart-empty-cart-button\"\n size=\"medium\"\n variant=\"primary\"\n key=\"routeHome\"\n type=\"submit\"\n href={ctaLinkURL}\n >\n {labels.cta}\n </Button>\n ) : undefined\n }\n />\n </div>\n );\n};\n"],"names":["SvgCart","props","React","EmptyCart","className","children","ctaLinkURL","labels","useText","jsx","classes","IllustratedMessage","Icon","Cart","Button"],"mappings":"oUACA,MAAMA,EAAWC,GAA0BC,EAAM,cAAc,MAAO,CAAE,MAAO,GAAI,OAAQ,GAAI,QAAS,YAAa,KAAM,OAAQ,MAAO,6BAA8B,GAAGD,CAAO,EAAkBC,EAAM,cAAc,IAAK,CAAE,SAAU,qBAAqB,EAAoBA,EAAM,cAAc,OAAQ,CAAE,aAAc,qBAAsB,EAAG,oZAAqZ,OAAQ,eAAgB,eAAgB,OAAO,CAAE,EAAmBA,EAAM,cAAc,OAAQ,CAAE,aAAc,qBAAsB,EAAG,wCAAyC,OAAQ,eAAgB,eAAgB,OAAS,CAAA,CAAC,EAAmBA,EAAM,cAAc,OAAQ,KAAsBA,EAAM,cAAc,WAAY,CAAE,GAAI,eAAe,EAAoBA,EAAM,cAAc,OAAQ,CAAE,aAAc,qBAAsB,MAAO,MAAO,OAAQ,KAAM,KAAM,QAAS,UAAW,wBAAwB,CAAE,CAAC,CAAC,CAAC,EC6BtuCC,EAA+C,CAAC,CAC3D,UAAAC,EACA,SAAAC,EACA,WAAAC,EACA,GAAGL,CACL,IAAM,CACJ,MAAMM,EAASC,EAAQ,CACrB,UAAW,yBACX,IAAK,oBAAA,CACN,EAGC,OAAAC,EAAC,MAAK,CAAA,GAAGR,EAAO,UAAWS,EAAQ,CAAC,kBAAmBN,CAAS,CAAC,EAC/D,SAAAK,EAACE,EAAA,CACC,UAAWD,EAAQ,CAAC,2BAA4BN,CAAS,CAAC,EAC1D,cAAY,kBACZ,QAASG,EAAO,UAChB,KAAOE,EAAAG,EAAA,CAAK,UAAU,wBAAwB,OAAQC,EAAM,EAC5D,OACEP,EACEG,EAACK,EAAA,CACC,cAAY,yBACZ,KAAK,SACL,QAAQ,UAER,KAAK,SACL,KAAMR,EAEL,SAAOC,EAAA,GAAA,EAJJ,WAAA,EAMJ,MAAA,CAAA,EAGV,CAEJ","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"EmptyCart.js","sources":["/@dropins/storefront-cart/src/containers/EmptyCart/EmptyCart.tsx"],"sourcesContent":["/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { HTMLAttributes } from 'preact/compat';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { EmptyCart as Root } from '@/cart/components';\n\nexport interface EmptyCartProps extends HTMLAttributes<HTMLDivElement> {\n routeCTA?: () => string;\n}\n \nexport const EmptyCart: Container<EmptyCartProps> = ({ routeCTA }) => {\n return (\n <Root ctaLinkURL={routeCTA?.()} />\n );\n};\n"],"names":["EmptyCart","routeCTA","jsx","Root"],"mappings":"+QAyBO,MAAMA,EAAuC,CAAC,CAAE,SAAAC,KAElDC,EAAAC,EAAA,CAAK,WAAYF,GAAA,YAAAA,GAAc,CAAA"}
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
3
- import{jsx as t}from"@dropins/tools/preact-jsx-runtime.js";import{E as p}from"./EmptyCart.js";import"@dropins/tools/lib.js";import"@dropins/tools/preact-compat.js";/* empty css */import"@dropins/tools/components.js";import"@dropins/tools/preact-hooks.js";const c=({routeCTA:m})=>t(p,{ctaLinkURL:m==null?void 0:m()});export{c as E};
3
+ import{jsx as r}from"@dropins/tools/preact-jsx-runtime.js";import{classes as o}from"@dropins/tools/lib.js";import{IllustratedMessage as i,Button as s,Icon as m}from"@dropins/tools/components.js";/* empty css */import*as t from"@dropins/tools/preact-compat.js";import{useText as l}from"@dropins/tools/i18n.js";const p=e=>t.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e},t.createElement("g",{clipPath:"url(#clip0_102_196)"},t.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M18.3601 18.16H6.5601L4.8801 3H2.3501M19.6701 19.59C19.6701 20.3687 19.0388 21 18.2601 21C17.4814 21 16.8501 20.3687 16.8501 19.59C16.8501 18.8113 17.4814 18.18 18.2601 18.18C19.0388 18.18 19.6701 18.8113 19.6701 19.59ZM7.42986 19.59C7.42986 20.3687 6.79858 21 6.01986 21C5.24114 21 4.60986 20.3687 4.60986 19.59C4.60986 18.8113 5.24114 18.18 6.01986 18.18C6.79858 18.18 7.42986 18.8113 7.42986 19.59Z",stroke:"currentColor",strokeLinejoin:"round"}),t.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M5.25 6.37L20.89 8.06L20.14 14.8H6.19",stroke:"currentColor",strokeLinejoin:"round"})),t.createElement("defs",null,t.createElement("clipPath",{id:"clip0_102_196"},t.createElement("rect",{vectorEffect:"non-scaling-stroke",width:19.29,height:19.5,fill:"white",transform:"translate(2.3501 2.25)"})))),g=({className:e,children:d,ctaLinkURL:a,...n})=>{const c=l({emptyCart:"Cart.EmptyCart.heading",cta:"Cart.EmptyCart.cta"});return r("div",{...n,className:o(["cart-empty-cart",e]),children:r(i,{className:o(["cart-empty-cart__wrapper",e]),"data-testid":"cart-empty-cart",heading:c.emptyCart,icon:r(m,{className:"cart-empty-cart__icon",source:p}),action:a?r(s,{"data-testid":"cart-empty-cart-button",size:"medium",variant:"primary",type:"submit",href:a,children:c.cta},"routeHome"):void 0})})};export{g as E};
4
4
  //# sourceMappingURL=EmptyCart2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EmptyCart2.js","sources":["/@dropins/storefront-cart/src/containers/EmptyCart/EmptyCart.tsx"],"sourcesContent":["/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { HTMLAttributes } from 'preact/compat';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { EmptyCart as Root } from '@/cart/components';\n\nexport interface EmptyCartProps extends HTMLAttributes<HTMLDivElement> {\n routeCTA?: () => string;\n}\n \nexport const EmptyCart: Container<EmptyCartProps> = ({ routeCTA }) => {\n return (\n <Root ctaLinkURL={routeCTA?.()} />\n );\n};\n"],"names":["EmptyCart","routeCTA","jsx","Root"],"mappings":"8QAyBO,MAAMA,EAAuC,CAAC,CAAE,SAAAC,KAElDC,EAAAC,EAAA,CAAK,WAAYF,GAAA,YAAAA,GAAc,CAAA"}
1
+ {"version":3,"file":"EmptyCart2.js","sources":["../../node_modules/@adobe-commerce/elsie/src/icons/Cart.svg","/@dropins/storefront-cart/src/components/EmptyCart/EmptyCart.tsx"],"sourcesContent":["import * as React from \"react\";\nconst SvgCart = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { clipPath: \"url(#clip0_102_196)\" }, /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M18.3601 18.16H6.5601L4.8801 3H2.3501M19.6701 19.59C19.6701 20.3687 19.0388 21 18.2601 21C17.4814 21 16.8501 20.3687 16.8501 19.59C16.8501 18.8113 17.4814 18.18 18.2601 18.18C19.0388 18.18 19.6701 18.8113 19.6701 19.59ZM7.42986 19.59C7.42986 20.3687 6.79858 21 6.01986 21C5.24114 21 4.60986 20.3687 4.60986 19.59C4.60986 18.8113 5.24114 18.18 6.01986 18.18C6.79858 18.18 7.42986 18.8113 7.42986 19.59Z\", stroke: \"currentColor\", strokeLinejoin: \"round\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M5.25 6.37L20.89 8.06L20.14 14.8H6.19\", stroke: \"currentColor\", strokeLinejoin: \"round\" })), /* @__PURE__ */ React.createElement(\"defs\", null, /* @__PURE__ */ React.createElement(\"clipPath\", { id: \"clip0_102_196\" }, /* @__PURE__ */ React.createElement(\"rect\", { vectorEffect: \"non-scaling-stroke\", width: 19.29, height: 19.5, fill: \"white\", transform: \"translate(2.3501 2.25)\" }))));\nexport default SvgCart;\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { FunctionComponent } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { classes } from '@adobe-commerce/elsie/lib';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Button, Icon, IllustratedMessage } from '@adobe-commerce/elsie/components';\nimport { Cart } from '@adobe-commerce/elsie/icons';\n\nimport '@/cart/components/EmptyCart/EmptyCart.css';\n\nexport interface EmptyCartProps extends HTMLAttributes<HTMLDivElement> {\n ctaLinkURL?: string;\n}\n\nexport const EmptyCart: FunctionComponent<EmptyCartProps> = ({\n className,\n children,\n ctaLinkURL,\n ...props\n}) => {\n const labels = useText({\n emptyCart: 'Cart.EmptyCart.heading',\n cta: 'Cart.EmptyCart.cta',\n });\n\n return (\n <div {...props} className={classes(['cart-empty-cart', className])}>\n <IllustratedMessage\n className={classes(['cart-empty-cart__wrapper', className])}\n data-testid=\"cart-empty-cart\"\n heading={labels.emptyCart}\n icon={<Icon className=\"cart-empty-cart__icon\" source={Cart} />}\n action={\n ctaLinkURL ? (\n <Button\n data-testid=\"cart-empty-cart-button\"\n size=\"medium\"\n variant=\"primary\"\n key=\"routeHome\"\n type=\"submit\"\n href={ctaLinkURL}\n >\n {labels.cta}\n </Button>\n ) : undefined\n }\n />\n </div>\n );\n};\n"],"names":["SvgCart","props","React","EmptyCart","className","children","ctaLinkURL","labels","useText","jsx","classes","IllustratedMessage","Icon","Cart","Button"],"mappings":"oUACA,MAAMA,EAAWC,GAA0BC,EAAM,cAAc,MAAO,CAAE,MAAO,GAAI,OAAQ,GAAI,QAAS,YAAa,KAAM,OAAQ,MAAO,6BAA8B,GAAGD,CAAO,EAAkBC,EAAM,cAAc,IAAK,CAAE,SAAU,qBAAqB,EAAoBA,EAAM,cAAc,OAAQ,CAAE,aAAc,qBAAsB,EAAG,oZAAqZ,OAAQ,eAAgB,eAAgB,OAAO,CAAE,EAAmBA,EAAM,cAAc,OAAQ,CAAE,aAAc,qBAAsB,EAAG,wCAAyC,OAAQ,eAAgB,eAAgB,OAAS,CAAA,CAAC,EAAmBA,EAAM,cAAc,OAAQ,KAAsBA,EAAM,cAAc,WAAY,CAAE,GAAI,eAAe,EAAoBA,EAAM,cAAc,OAAQ,CAAE,aAAc,qBAAsB,MAAO,MAAO,OAAQ,KAAM,KAAM,QAAS,UAAW,wBAAwB,CAAE,CAAC,CAAC,CAAC,EC6BtuCC,EAA+C,CAAC,CAC3D,UAAAC,EACA,SAAAC,EACA,WAAAC,EACA,GAAGL,CACL,IAAM,CACJ,MAAMM,EAASC,EAAQ,CACrB,UAAW,yBACX,IAAK,oBAAA,CACN,EAGC,OAAAC,EAAC,MAAK,CAAA,GAAGR,EAAO,UAAWS,EAAQ,CAAC,kBAAmBN,CAAS,CAAC,EAC/D,SAAAK,EAACE,EAAA,CACC,UAAWD,EAAQ,CAAC,2BAA4BN,CAAS,CAAC,EAC1D,cAAY,kBACZ,QAASG,EAAO,UAChB,KAAOE,EAAAG,EAAA,CAAK,UAAU,wBAAwB,OAAQC,EAAM,EAC5D,OACEP,EACEG,EAACK,EAAA,CACC,cAAY,yBACZ,KAAK,SACL,QAAQ,UAER,KAAK,SACL,KAAMR,EAEL,SAAOC,EAAA,GAAA,EAJJ,WAAA,EAMJ,MAAA,CAAA,EAGV,CAEJ","x_google_ignoreList":[0]}