@anker-in/headless-ui 1.1.55 → 1.1.57

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 (213) hide show
  1. package/dist/cjs/biz-components/ActiveShelf/ProductCard.d.ts +1 -1
  2. package/dist/cjs/biz-components/ActiveShelf/ProductCard.js +1 -1
  3. package/dist/cjs/biz-components/ActiveShelf/ProductCard.js.map +2 -2
  4. package/dist/cjs/biz-components/ActiveShelf/index.js +1 -1
  5. package/dist/cjs/biz-components/ActiveShelf/index.js.map +2 -2
  6. package/dist/cjs/biz-components/BuyOneGetOneShelf/FreeGiftItem.js +1 -1
  7. package/dist/cjs/biz-components/BuyOneGetOneShelf/FreeGiftItem.js.map +2 -2
  8. package/dist/cjs/biz-components/BuyOneGetOneShelf/ProductCard.js +1 -1
  9. package/dist/cjs/biz-components/BuyOneGetOneShelf/ProductCard.js.map +2 -2
  10. package/dist/cjs/biz-components/BuyOneGetOneShelf/index.js +1 -1
  11. package/dist/cjs/biz-components/BuyOneGetOneShelf/index.js.map +2 -2
  12. package/dist/cjs/biz-components/Category/SwiperCategory.d.ts +2 -0
  13. package/dist/cjs/biz-components/Category/SwiperCategory.js +1 -1
  14. package/dist/cjs/biz-components/Category/SwiperCategory.js.map +3 -3
  15. package/dist/cjs/biz-components/Category/index.js +1 -1
  16. package/dist/cjs/biz-components/Category/index.js.map +3 -3
  17. package/dist/cjs/biz-components/CreditsShelf/ProductCard.d.ts +41 -0
  18. package/dist/cjs/biz-components/CreditsShelf/ProductCard.js +2 -0
  19. package/dist/cjs/biz-components/CreditsShelf/ProductCard.js.map +7 -0
  20. package/dist/cjs/biz-components/CreditsShelf/ProductsList.d.ts +20 -0
  21. package/dist/cjs/biz-components/CreditsShelf/ProductsList.js +2 -0
  22. package/dist/cjs/biz-components/CreditsShelf/ProductsList.js.map +7 -0
  23. package/dist/cjs/biz-components/CreditsShelf/Root.d.ts +43 -0
  24. package/dist/cjs/biz-components/CreditsShelf/Root.js +2 -0
  25. package/dist/cjs/biz-components/CreditsShelf/Root.js.map +7 -0
  26. package/dist/cjs/biz-components/CreditsShelf/context.d.ts +40 -0
  27. package/dist/cjs/biz-components/CreditsShelf/context.js +2 -0
  28. package/dist/cjs/biz-components/CreditsShelf/context.js.map +7 -0
  29. package/dist/cjs/biz-components/CreditsShelf/index.d.ts +15 -0
  30. package/dist/cjs/biz-components/CreditsShelf/index.js +2 -0
  31. package/dist/cjs/biz-components/CreditsShelf/index.js.map +7 -0
  32. package/dist/cjs/biz-components/CreditsShelf/types.d.ts +73 -0
  33. package/dist/cjs/biz-components/CreditsShelf/types.js +2 -0
  34. package/dist/cjs/biz-components/CreditsShelf/types.js.map +7 -0
  35. package/dist/cjs/biz-components/GiftBox/index.js +1 -1
  36. package/dist/cjs/biz-components/GiftBox/index.js.map +2 -2
  37. package/dist/cjs/biz-components/HeroBanner/HeroBanner.js +1 -1
  38. package/dist/cjs/biz-components/HeroBanner/HeroBanner.js.map +3 -3
  39. package/dist/cjs/biz-components/ImageOverlayShelf/ProductCard.js +1 -1
  40. package/dist/cjs/biz-components/ImageOverlayShelf/ProductCard.js.map +2 -2
  41. package/dist/cjs/biz-components/MediaPlayerBase/index.js +1 -1
  42. package/dist/cjs/biz-components/MediaPlayerBase/index.js.map +2 -2
  43. package/dist/cjs/biz-components/MediaPlayerSticky/index.js +1 -1
  44. package/dist/cjs/biz-components/MediaPlayerSticky/index.js.map +2 -2
  45. package/dist/cjs/biz-components/MediaSceneSwitcher/MediaSceneSwitcher.js +2 -2
  46. package/dist/cjs/biz-components/MediaSceneSwitcher/MediaSceneSwitcher.js.map +2 -2
  47. package/dist/cjs/biz-components/MediaSceneSwitcher/types.d.ts +1 -0
  48. package/dist/cjs/biz-components/MediaSceneSwitcher/types.js +1 -1
  49. package/dist/cjs/biz-components/MediaSceneSwitcher/types.js.map +1 -1
  50. package/dist/cjs/biz-components/MediaShelf/ProductCard.js +1 -1
  51. package/dist/cjs/biz-components/MediaShelf/ProductCard.js.map +2 -2
  52. package/dist/cjs/biz-components/MiniCart/CircleProgress.d.ts +38 -0
  53. package/dist/cjs/biz-components/MiniCart/CircleProgress.js +2 -0
  54. package/dist/cjs/biz-components/MiniCart/CircleProgress.js.map +7 -0
  55. package/dist/cjs/biz-components/MiniCart/MiniCartDialog.js +1 -1
  56. package/dist/cjs/biz-components/MiniCart/MiniCartDialog.js.map +1 -1
  57. package/dist/cjs/biz-components/MiniCart/index.d.ts +31 -1
  58. package/dist/cjs/biz-components/MiniCart/index.js +1 -1
  59. package/dist/cjs/biz-components/MiniCart/index.js.map +3 -3
  60. package/dist/cjs/biz-components/SceneShelf/Footer.d.ts +21 -0
  61. package/dist/cjs/biz-components/SceneShelf/Footer.js +2 -0
  62. package/dist/cjs/biz-components/SceneShelf/Footer.js.map +7 -0
  63. package/dist/cjs/biz-components/SceneShelf/ProductCard.d.ts +23 -0
  64. package/dist/cjs/biz-components/SceneShelf/ProductCard.js +2 -0
  65. package/dist/cjs/biz-components/SceneShelf/ProductCard.js.map +7 -0
  66. package/dist/cjs/biz-components/SceneShelf/ProductsPanel.d.ts +26 -0
  67. package/dist/cjs/biz-components/SceneShelf/ProductsPanel.js +2 -0
  68. package/dist/cjs/biz-components/SceneShelf/ProductsPanel.js.map +7 -0
  69. package/dist/cjs/biz-components/SceneShelf/Root.d.ts +20 -0
  70. package/dist/cjs/biz-components/SceneShelf/Root.js +2 -0
  71. package/dist/cjs/biz-components/SceneShelf/Root.js.map +7 -0
  72. package/dist/cjs/biz-components/SceneShelf/Scene.d.ts +38 -0
  73. package/dist/cjs/biz-components/SceneShelf/Scene.js +2 -0
  74. package/dist/cjs/biz-components/SceneShelf/Scene.js.map +7 -0
  75. package/dist/cjs/biz-components/SceneShelf/SceneImage.d.ts +14 -0
  76. package/dist/cjs/biz-components/SceneShelf/SceneImage.js +2 -0
  77. package/dist/cjs/biz-components/SceneShelf/SceneImage.js.map +7 -0
  78. package/dist/cjs/biz-components/SceneShelf/context.d.ts +40 -0
  79. package/dist/cjs/biz-components/SceneShelf/context.js +2 -0
  80. package/dist/cjs/biz-components/SceneShelf/context.js.map +7 -0
  81. package/dist/cjs/biz-components/SceneShelf/index.d.ts +21 -0
  82. package/dist/cjs/biz-components/SceneShelf/index.js +2 -0
  83. package/dist/cjs/biz-components/SceneShelf/index.js.map +7 -0
  84. package/dist/cjs/biz-components/SceneShelf/types.d.ts +51 -0
  85. package/dist/cjs/biz-components/SceneShelf/types.js +2 -0
  86. package/dist/cjs/biz-components/SceneShelf/types.js.map +7 -0
  87. package/dist/cjs/biz-components/SecondaryBanner/index.d.ts +25 -0
  88. package/dist/cjs/biz-components/SecondaryBanner/index.js +1 -1
  89. package/dist/cjs/biz-components/SecondaryBanner/index.js.map +3 -3
  90. package/dist/cjs/biz-components/index.d.ts +8 -1
  91. package/dist/cjs/biz-components/index.js +1 -1
  92. package/dist/cjs/biz-components/index.js.map +3 -3
  93. package/dist/cjs/components/Countdown.js +1 -1
  94. package/dist/cjs/components/Countdown.js.map +2 -2
  95. package/dist/cjs/components/button.js +1 -1
  96. package/dist/cjs/components/button.js.map +2 -2
  97. package/dist/cjs/components/checkbox.js +1 -1
  98. package/dist/cjs/components/checkbox.js.map +2 -2
  99. package/dist/cjs/components/text.js +1 -1
  100. package/dist/cjs/components/text.js.map +2 -2
  101. package/dist/cjs/stories/decorators/dataPropsDecorator.d.ts +16 -0
  102. package/dist/cjs/stories/decorators/dataPropsDecorator.js +2 -0
  103. package/dist/cjs/stories/decorators/dataPropsDecorator.js.map +7 -0
  104. package/dist/esm/biz-components/ActiveShelf/ProductCard.d.ts +1 -1
  105. package/dist/esm/biz-components/ActiveShelf/ProductCard.js +1 -1
  106. package/dist/esm/biz-components/ActiveShelf/ProductCard.js.map +2 -2
  107. package/dist/esm/biz-components/ActiveShelf/index.js +1 -1
  108. package/dist/esm/biz-components/ActiveShelf/index.js.map +2 -2
  109. package/dist/esm/biz-components/BuyOneGetOneShelf/FreeGiftItem.js +1 -1
  110. package/dist/esm/biz-components/BuyOneGetOneShelf/FreeGiftItem.js.map +2 -2
  111. package/dist/esm/biz-components/BuyOneGetOneShelf/ProductCard.js +1 -1
  112. package/dist/esm/biz-components/BuyOneGetOneShelf/ProductCard.js.map +2 -2
  113. package/dist/esm/biz-components/BuyOneGetOneShelf/index.js +1 -1
  114. package/dist/esm/biz-components/BuyOneGetOneShelf/index.js.map +2 -2
  115. package/dist/esm/biz-components/Category/SwiperCategory.d.ts +2 -0
  116. package/dist/esm/biz-components/Category/SwiperCategory.js +1 -1
  117. package/dist/esm/biz-components/Category/SwiperCategory.js.map +3 -3
  118. package/dist/esm/biz-components/Category/index.js +1 -1
  119. package/dist/esm/biz-components/Category/index.js.map +3 -3
  120. package/dist/esm/biz-components/CreditsShelf/ProductCard.d.ts +41 -0
  121. package/dist/esm/biz-components/CreditsShelf/ProductCard.js +2 -0
  122. package/dist/esm/biz-components/CreditsShelf/ProductCard.js.map +7 -0
  123. package/dist/esm/biz-components/CreditsShelf/ProductsList.d.ts +20 -0
  124. package/dist/esm/biz-components/CreditsShelf/ProductsList.js +2 -0
  125. package/dist/esm/biz-components/CreditsShelf/ProductsList.js.map +7 -0
  126. package/dist/esm/biz-components/CreditsShelf/Root.d.ts +43 -0
  127. package/dist/esm/biz-components/CreditsShelf/Root.js +2 -0
  128. package/dist/esm/biz-components/CreditsShelf/Root.js.map +7 -0
  129. package/dist/esm/biz-components/CreditsShelf/context.d.ts +40 -0
  130. package/dist/esm/biz-components/CreditsShelf/context.js +2 -0
  131. package/dist/esm/biz-components/CreditsShelf/context.js.map +7 -0
  132. package/dist/esm/biz-components/CreditsShelf/index.d.ts +15 -0
  133. package/dist/esm/biz-components/CreditsShelf/index.js +2 -0
  134. package/dist/esm/biz-components/CreditsShelf/index.js.map +7 -0
  135. package/dist/esm/biz-components/CreditsShelf/types.d.ts +73 -0
  136. package/dist/esm/biz-components/CreditsShelf/types.js +2 -0
  137. package/dist/esm/biz-components/CreditsShelf/types.js.map +7 -0
  138. package/dist/esm/biz-components/GiftBox/index.js +1 -1
  139. package/dist/esm/biz-components/GiftBox/index.js.map +2 -2
  140. package/dist/esm/biz-components/HeroBanner/HeroBanner.js +1 -1
  141. package/dist/esm/biz-components/HeroBanner/HeroBanner.js.map +3 -3
  142. package/dist/esm/biz-components/ImageOverlayShelf/ProductCard.js +1 -1
  143. package/dist/esm/biz-components/ImageOverlayShelf/ProductCard.js.map +2 -2
  144. package/dist/esm/biz-components/MediaPlayerBase/index.js +1 -1
  145. package/dist/esm/biz-components/MediaPlayerBase/index.js.map +2 -2
  146. package/dist/esm/biz-components/MediaPlayerSticky/index.js +1 -1
  147. package/dist/esm/biz-components/MediaPlayerSticky/index.js.map +2 -2
  148. package/dist/esm/biz-components/MediaSceneSwitcher/MediaSceneSwitcher.js +2 -2
  149. package/dist/esm/biz-components/MediaSceneSwitcher/MediaSceneSwitcher.js.map +2 -2
  150. package/dist/esm/biz-components/MediaSceneSwitcher/types.d.ts +1 -0
  151. package/dist/esm/biz-components/MediaShelf/ProductCard.js +1 -1
  152. package/dist/esm/biz-components/MediaShelf/ProductCard.js.map +2 -2
  153. package/dist/esm/biz-components/MiniCart/CircleProgress.d.ts +38 -0
  154. package/dist/esm/biz-components/MiniCart/CircleProgress.js +2 -0
  155. package/dist/esm/biz-components/MiniCart/CircleProgress.js.map +7 -0
  156. package/dist/esm/biz-components/MiniCart/MiniCartDialog.js +1 -1
  157. package/dist/esm/biz-components/MiniCart/MiniCartDialog.js.map +1 -1
  158. package/dist/esm/biz-components/MiniCart/index.d.ts +31 -1
  159. package/dist/esm/biz-components/MiniCart/index.js +1 -1
  160. package/dist/esm/biz-components/MiniCart/index.js.map +3 -3
  161. package/dist/esm/biz-components/SceneShelf/Footer.d.ts +21 -0
  162. package/dist/esm/biz-components/SceneShelf/Footer.js +2 -0
  163. package/dist/esm/biz-components/SceneShelf/Footer.js.map +7 -0
  164. package/dist/esm/biz-components/SceneShelf/ProductCard.d.ts +23 -0
  165. package/dist/esm/biz-components/SceneShelf/ProductCard.js +2 -0
  166. package/dist/esm/biz-components/SceneShelf/ProductCard.js.map +7 -0
  167. package/dist/esm/biz-components/SceneShelf/ProductsPanel.d.ts +26 -0
  168. package/dist/esm/biz-components/SceneShelf/ProductsPanel.js +2 -0
  169. package/dist/esm/biz-components/SceneShelf/ProductsPanel.js.map +7 -0
  170. package/dist/esm/biz-components/SceneShelf/Root.d.ts +20 -0
  171. package/dist/esm/biz-components/SceneShelf/Root.js +2 -0
  172. package/dist/esm/biz-components/SceneShelf/Root.js.map +7 -0
  173. package/dist/esm/biz-components/SceneShelf/Scene.d.ts +38 -0
  174. package/dist/esm/biz-components/SceneShelf/Scene.js +2 -0
  175. package/dist/esm/biz-components/SceneShelf/Scene.js.map +7 -0
  176. package/dist/esm/biz-components/SceneShelf/SceneImage.d.ts +14 -0
  177. package/dist/esm/biz-components/SceneShelf/SceneImage.js +2 -0
  178. package/dist/esm/biz-components/SceneShelf/SceneImage.js.map +7 -0
  179. package/dist/esm/biz-components/SceneShelf/context.d.ts +40 -0
  180. package/dist/esm/biz-components/SceneShelf/context.js +2 -0
  181. package/dist/esm/biz-components/SceneShelf/context.js.map +7 -0
  182. package/dist/esm/biz-components/SceneShelf/index.d.ts +21 -0
  183. package/dist/esm/biz-components/SceneShelf/index.js +2 -0
  184. package/dist/esm/biz-components/SceneShelf/index.js.map +7 -0
  185. package/dist/esm/biz-components/SceneShelf/types.d.ts +51 -0
  186. package/dist/esm/biz-components/SceneShelf/types.js +2 -0
  187. package/dist/esm/biz-components/SceneShelf/types.js.map +7 -0
  188. package/dist/esm/biz-components/SecondaryBanner/index.d.ts +25 -0
  189. package/dist/esm/biz-components/SecondaryBanner/index.js +1 -1
  190. package/dist/esm/biz-components/SecondaryBanner/index.js.map +3 -3
  191. package/dist/esm/biz-components/index.d.ts +8 -1
  192. package/dist/esm/biz-components/index.js +1 -1
  193. package/dist/esm/biz-components/index.js.map +3 -3
  194. package/dist/esm/components/Countdown.js +1 -1
  195. package/dist/esm/components/Countdown.js.map +2 -2
  196. package/dist/esm/components/button.js +1 -1
  197. package/dist/esm/components/button.js.map +2 -2
  198. package/dist/esm/components/checkbox.js +1 -1
  199. package/dist/esm/components/checkbox.js.map +2 -2
  200. package/dist/esm/components/text.js +1 -1
  201. package/dist/esm/components/text.js.map +2 -2
  202. package/dist/esm/stories/decorators/dataPropsDecorator.d.ts +16 -0
  203. package/dist/esm/stories/decorators/dataPropsDecorator.js +2 -0
  204. package/dist/esm/stories/decorators/dataPropsDecorator.js.map +7 -0
  205. package/dist/tokens/anker.css +1 -0
  206. package/dist/tokens/base.css +1 -0
  207. package/dist/tokens/eufy.css +1 -0
  208. package/dist/tokens/eufyMake.css +1 -0
  209. package/dist/tokens/solix.css +1 -0
  210. package/dist/tokens/soundcore.css +1 -0
  211. package/package.json +6 -2
  212. package/style.css +20 -3
  213. package/tailwind.config.js +1 -0
@@ -1,2 +1,2 @@
1
- "use strict";"use client";var dt=Object.create;var v=Object.defineProperty;var ut=Object.getOwnPropertyDescriptor;var mt=Object.getOwnPropertyNames;var gt=Object.getPrototypeOf,ft=Object.prototype.hasOwnProperty;var ht=(r,e)=>{for(var s in e)v(r,s,{get:e[s],enumerable:!0})},j=(r,e,s,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let u of mt(e))!ft.call(r,u)&&u!==s&&v(r,u,{get:()=>e[u],enumerable:!(a=ut(e,u))||a.enumerable});return r};var vt=(r,e,s)=>(s=r!=null?dt(gt(r)):{},j(e||!r||!r.__esModule?v(s,"default",{value:r,enumerable:!0}):s,r)),xt=r=>j(v({},"__esModule",{value:!0}),r);var wt={};ht(wt,{default:()=>bt});module.exports=xt(wt);var t=require("react/jsx-runtime"),p=vt(require("react")),o=require("../../helpers/index.js"),R=require("../../components/index.js"),C=require("../../components/index.js"),d=require("../../components/index.js");const H=p.forwardRef(({className:r,classNames:e={},data:s,cart:a,onRemoveItem:u,onCheckout:E,onClickToView:V,...W},q)=>{const{copy:c,theme:y="light",locale:Ct="us"}=s||{},G=c?.emptyCart||"Your Cart is Empty",k=c?.description||'Add one more to get <span style="color: var(--brand-color)">50% <span> off',U=c?.itemsInCart||"You have selected {count} items",X=c?.total||"Total {total}",yt=c?.totalWithCoupon||"total: {total} ({subtotal})",F=c?.clickToView||"Click to view cart",O=c?.buyNowText||"Buy Now",Y=c?.savingText||"Saving {amount}",m=a?.lineItems||[],M=m.reduce((i,n)=>i+(n?.quantity||0),0),Z=M===0,$=parseFloat(a?.cost?.totalAmount?.amount||"0"),J=parseFloat(a?.cost?.subtotalAmount?.amount||"0"),K=parseFloat(a?.cost?.savingAmount?.amount||"0"),Q=a?.cost?.totalAmount?.formattedPrice||"",L=J>$?a?.cost?.subtotalAmount?.formattedPrice:null,N=K>0?a?.cost?.savingAmount?.formattedPrice:null,l=p.useRef(null),[x,_]=p.useState(!1),[I,T]=p.useState(!1),[h,P]=p.useState(null),z=async i=>{if(!h){P(i);try{await u?.(i,a)}finally{P(null)}}},[A,b]=p.useState(!1),[tt,et]=p.useState(0),[ot,it]=p.useState(0),nt=i=>{l.current&&(b(!0),et(i.pageX-l.current.offsetLeft),it(l.current.scrollLeft))},rt=i=>{if(!A||!l.current)return;i.preventDefault();const f=(i.pageX-l.current.offsetLeft-tt)*1.5;l.current.scrollLeft=ot-f},at=()=>{b(!1)},st=()=>{b(!1)},S=i=>{if(l.current){const n=l.current,f=100;n.scrollBy({left:i==="right"?f:-f,behavior:"smooth"})}},w=({className:i})=>(0,t.jsx)("svg",{className:i,width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:(0,t.jsx)("path",{d:"M6 4L10 8L6 12",stroke:"currentColor",strokeWidth:"1.33",strokeLinecap:"round",strokeLinejoin:"round"})}),lt=({className:i})=>(0,t.jsx)("svg",{className:i,width:"20",height:"20",viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:(0,t.jsx)("path",{d:"M2.5 5H17.5M8.33333 9.16667V14.1667M11.6667 9.16667V14.1667M3.33333 5L4.16667 16.6667C4.16667 17.1087 4.34226 17.5326 4.65482 17.8452C4.96738 18.1577 5.39131 18.3333 5.83333 18.3333H14.1667C14.6087 18.3333 15.0326 18.1577 15.3452 17.8452C15.6577 17.5326 15.8333 17.1087 15.8333 16.6667L16.6667 5M7.5 5V2.5C7.5 2.27899 7.5878 2.06702 7.74408 1.91074C7.90036 1.75446 8.11232 1.66667 8.33333 1.66667H11.6667C11.8877 1.66667 12.0996 1.75446 12.2559 1.91074C12.4122 2.06702 12.5 2.27899 12.5 2.5V5",stroke:"currentColor",strokeWidth:"1.25",strokeLinecap:"round",strokeLinejoin:"round"})}),ct=i=>m.length?(0,t.jsxs)("div",{className:(0,o.cn)("bg-container-primary flex gap-1 rounded-lg p-1",e?.itemsGrid),children:[m.length>0&&(0,t.jsx)("button",{onClick:()=>S("left"),className:(0,o.cn)("border-border laptop:flex hover:bg-muted-foreground/10 laptop:flex hidden size-12 shrink-0 items-center justify-center rounded-lg transition-colors",e?.expandButton),"aria-label":"Scroll left to see more items",children:(0,t.jsx)(w,{className:"size-4 rotate-180"})}),(0,t.jsx)("div",{ref:l,onMouseDown:nt,onMouseMove:rt,onMouseUp:at,onMouseLeave:st,className:(0,o.cn)("scrollbar-hide laptop:gap-1 laptop:max-w-[240px] flex w-full gap-1 overflow-x-auto [-ms-overflow-style:none] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden",A?"cursor-grabbing":"cursor-grab",e?.itemGridContainer),children:m.filter(n=>n&&n.id).map(n=>{const D=(n.merchandise||{}).image||{},B=D.url,pt=D.altText||"Product image";return(0,t.jsxs)("div",{className:(0,o.cn)("laptop:size-12 bg-container-secondary laptop:bg-white group relative size-16 shrink-0 rounded-lg",e?.gridItem),children:[B&&(0,t.jsx)("img",{src:B,alt:pt,draggable:!1,className:"pointer-events-none size-full select-none rounded-lg object-cover"}),h===n.id&&(0,t.jsx)("div",{className:"absolute inset-0 flex items-center justify-center rounded-lg bg-black/50",children:(0,t.jsxs)("svg",{width:"20",height:"20",viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",className:"animate-spin text-white",children:[(0,t.jsx)("circle",{cx:"8",cy:"8",r:"6",stroke:"currentColor",strokeWidth:"2",opacity:"0.3"}),(0,t.jsx)("path",{d:"M14 8a6 6 0 0 0-6-6",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"})]})}),(0,t.jsx)("span",{role:"button",onClick:()=>z(n.id),className:(0,o.cn)("laptop:hidden absolute right-[2px] top-[2px] cursor-pointer",h===n.id&&"pointer-events-none opacity-0"),"aria-label":"delete",children:(0,t.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",className:"pointer-events-none",children:[(0,t.jsx)("rect",{x:"1.33301",y:"1.33301",width:"13.3333",height:"13.3333",rx:"6.66667",fill:"white"}),(0,t.jsx)("path",{d:"M5.37705 5.28896C5.57234 5.09402 5.88839 5.09442 6.08347 5.28965L8.08602 7.29358L10.0906 5.28896C10.2858 5.09402 10.6026 5.09395 10.7977 5.28896C10.9928 5.48418 10.9926 5.80078 10.7977 5.99607L8.79312 8.00069L10.7964 10.0053C10.9913 10.2007 10.9909 10.5179 10.7957 10.7131C10.6005 10.908 10.2844 10.9074 10.0893 10.7124L8.08602 8.7078L6.08347 10.7103C5.88821 10.9056 5.57155 10.9057 5.37636 10.7103C5.18148 10.515 5.18132 10.1984 5.37636 10.0032L7.37891 8.00069L5.37636 5.99676C5.18119 5.80143 5.18181 5.48423 5.37705 5.28896Z",fill:"#767880"})]})}),n.quantity>1&&(0,t.jsx)("div",{className:"mini-cart-quantity bg-brand-0 laptop:size-4 absolute bottom-0 right-0 flex size-4 items-center justify-center rounded-full text-white",children:(0,t.jsx)(C.Text,{className:"text-sm",html:String(n.quantity)})}),(0,t.jsx)("div",{className:(0,o.cn)("laptop:flex absolute inset-0 hidden items-center justify-center rounded-lg bg-black/60 opacity-0 transition-opacity group-hover:opacity-100",h===n.id&&"hidden",e?.gridItemOverlay),children:(0,t.jsx)("button",{onClick:()=>z(n.id),className:"flex items-center justify-center rounded-full bg-white/20 p-1 transition-colors hover:bg-white/30","aria-label":"Remove item",children:(0,t.jsx)(lt,{className:"laptop:size-3 pointer-events-none size-4 text-white"})})})]},n.id)})}),m.length>0&&(0,t.jsx)("button",{onClick:()=>S("right"),className:(0,o.cn)("border-border laptop:flex hover:bg-muted-foreground/10 laptop:flex hidden size-12 shrink-0 items-center justify-center rounded-lg transition-colors",e?.expandButton),"aria-label":"Scroll right to see more items",children:(0,t.jsx)(w,{className:"size-4"})})]}):null,g=!Z&&m.length>0;return(0,t.jsx)("div",{ref:q,className:(0,o.cn)("bg-container-secondary-1 text-info-primary tablet:px-6 laptop:px-12 desktop:px-12 lg-desktop:px-[128px] laptop:py-[16px] flex w-full px-4 py-[12px]","flex-col items-stretch gap-3","laptop:flex-row laptop:items-center laptop:justify-around","laptop:items-center laptop:gap-4","tablet:gap-6 laptop:gap-8",r,e?.root,{"aiui-dark bg-container-primary":y==="dark"}),...W,children:(0,t.jsxs)("div",{className:(0,o.cn)("laptop:flex-row flex w-full flex-col gap-4","laptop:flex-1 laptop:items-start","tablet:gap-6 laptop:gap-8",e?.content),children:[(0,t.jsxs)("div",{className:"laptop:flex-1 flex w-full flex-col",children:[(0,t.jsx)("div",{className:(0,o.cn)("tablet:gap-2 flex flex-col gap-1",e?.cartInfo),children:g?(0,t.jsxs)("div",{className:"flex w-full items-center gap-2",children:[(0,t.jsx)(d.Heading,{size:2,as:"h3",className:(0,o.cn)("",e?.cartTitle),html:U.replace("{count}",`<span class="text-brand-0">${M||0}</span>`)}),(0,t.jsxs)(d.Heading,{size:1,as:"h5",onClick:()=>{window.innerWidth<1025?_(!x):V?.(a)},className:(0,o.cn)("flex cursor-pointer items-center gap-1",e?.expandButton),children:[(0,t.jsx)(d.Heading,{as:"h6",size:1,className:"laptop:block hidden text-nowrap",html:F}),(0,t.jsx)(w,{className:(0,o.cn)("size-4 transition-transform",x?"laptop:rotate-0 -rotate-90":"laptop:rotate-0 rotate-90")})]})]}):(0,t.jsx)(d.Heading,{as:"h3",size:2,className:(0,o.cn)("tablet:text-2xl text-xl font-semibold",e?.cartTitle),html:G})}),(0,t.jsx)("div",{children:k&&(0,t.jsx)(C.Text,{size:2,className:(0,o.cn)("mini-cart-description",e?.cartDescription),html:k})})]}),g&&(0,t.jsx)("div",{className:(0,o.cn)("laptop:block",x?"block":"hidden"),children:ct(y)}),g&&(0,t.jsx)("hr",{className:"laptop:hidden border-lines w-full border-t"}),(0,t.jsxs)("div",{className:(0,o.cn)("tablet:gap-6 laptop:justify-end flex flex-row items-center justify-between gap-4",e?.priceSection),children:[(0,t.jsxs)("div",{className:"flex flex-col items-end justify-center gap-1",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(d.Heading,{as:"h6",size:2,className:(0,o.cn)(" whitespace-nowrap ",e?.totalPrice),html:X.replace("{total}",Q)}),L&&(0,t.jsx)(d.Heading,{as:"h6",size:2,className:(0,o.cn)("whitespace-nowrap line-through",e?.originalPrice),html:L})]}),N&&(0,t.jsx)(d.Heading,{size:2,as:"h6",className:(0,o.cn)("laptop:text-right text-marketing-0 w-full text-left",e?.saveAmount),html:Y.replace("{amount}",N)})]}),(0,t.jsx)(R.Button,{disabled:!g,loading:I,onClick:async()=>{if(!I){T(!0);try{await E?.(a)}finally{T(!1)}}},className:(0,o.cn)("whitespace-nowrap",e?.actionButton),children:O})]})]})})});H.displayName="MiniCart";var bt=H;
1
+ "use strict";"use client";var Ct=Object.create;var v=Object.defineProperty;var kt=Object.getOwnPropertyDescriptor;var Mt=Object.getOwnPropertyNames;var Lt=Object.getPrototypeOf,St=Object.prototype.hasOwnProperty;var Nt=(i,e)=>{for(var c in e)v(i,c,{get:e[c],enumerable:!0})},q=(i,e,c,l)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of Mt(e))!St.call(i,a)&&a!==c&&v(i,a,{get:()=>e[a],enumerable:!(l=kt(e,a))||l.enumerable});return i};var G=(i,e,c)=>(c=i!=null?Ct(Lt(i)):{},q(e||!i||!i.__esModule?v(c,"default",{value:i,enumerable:!0}):c,i)),Pt=i=>q(v({},"__esModule",{value:!0}),i);var zt={};Nt(zt,{default:()=>It});module.exports=Pt(zt);var t=require("react/jsx-runtime"),s=G(require("react")),o=require("../../helpers/index.js"),X=require("../../components/index.js"),b=require("../../components/index.js"),g=require("../../components/index.js"),F=G(require("./CircleProgress.js"));const U=s.forwardRef(({className:i,classNames:e={},data:c,cart:l,progressConfig:a,onRemoveItem:O,onCheckout:Y,onClickToView:M,...Z},$)=>{const{copy:d,theme:L="light",locale:Tt="us",showMobileViewMore:J=!0}=c||{},K=d?.emptyCart||"Your Cart is Empty",S=d?.description||"",Q=d?.itemsInCart||"You have selected {count} items",_=d?.total||"Total {total}",At=d?.totalWithCoupon||"total: {total} ({subtotal})",N=d?.clickToView||"Click to view cart",tt=d?.buyNowText||"Buy Now",et=d?.savingText||"Saving {amount}",u=s.useMemo(()=>l?.lineItems||[],[l?.lineItems]),P=u.reduce((r,n)=>r+(n?.quantity||0),0),ot=P===0,rt=parseFloat(l?.cost?.totalAmount?.amount||"0"),nt=parseFloat(l?.cost?.subtotalAmount?.amount||"0"),at=parseFloat(l?.cost?.savingAmount?.amount||"0"),it=l?.cost?.totalAmount?.formattedPrice||"",I=nt>rt?l?.cost?.subtotalAmount?.formattedPrice:null,z=at>0?l?.cost?.savingAmount?.formattedPrice:null,p=s.useRef(null),[w,lt]=s.useState(!1),[T,A]=s.useState(!1),[B,j]=s.useState(null),D=async r=>{if(!B){j(r);try{await O?.(r,l)}finally{j(null)}}},[R,y]=s.useState(!1),[st,ct]=s.useState(0),[pt,dt]=s.useState(0),[E,ut]=s.useState(!1),[H,mt]=s.useState(!0),h=s.useCallback(()=>{const r=p.current;if(!r)return;const{scrollLeft:n,scrollWidth:m,clientWidth:x}=r;ut(n>0),mt(n<m-x-1)},[]),gt=s.useCallback(()=>{h()},[h]);s.useEffect(()=>{h()},[u.length,h]);const ft=r=>{p.current&&(y(!0),ct(r.pageX-p.current.offsetLeft),dt(p.current.scrollLeft))},ht=r=>{if(!R||!p.current)return;r.preventDefault();const m=(r.pageX-p.current.offsetLeft-st)*1.5;p.current.scrollLeft=pt-m},xt=()=>{y(!1)},vt=()=>{y(!1)},V=r=>{if(p.current){const n=p.current,m=100;n.scrollBy({left:r==="right"?m:-m,behavior:"smooth"})}},C=({className:r})=>(0,t.jsx)("svg",{className:r,width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:(0,t.jsx)("path",{d:"M6 4L10 8L6 12",stroke:"currentColor",strokeWidth:"1.33",strokeLinecap:"round",strokeLinejoin:"round"})}),bt=({className:r})=>(0,t.jsx)("svg",{className:r,width:"20",height:"20",viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:(0,t.jsx)("path",{d:"M2.5 5H17.5M8.33333 9.16667V14.1667M11.6667 9.16667V14.1667M3.33333 5L4.16667 16.6667C4.16667 17.1087 4.34226 17.5326 4.65482 17.8452C4.96738 18.1577 5.39131 18.3333 5.83333 18.3333H14.1667C14.6087 18.3333 15.0326 18.1577 15.3452 17.8452C15.6577 17.5326 15.8333 17.1087 15.8333 16.6667L16.6667 5M7.5 5V2.5C7.5 2.27899 7.5878 2.06702 7.74408 1.91074C7.90036 1.75446 8.11232 1.66667 8.33333 1.66667H11.6667C11.8877 1.66667 12.0996 1.75446 12.2559 1.91074C12.4122 2.06702 12.5 2.27899 12.5 2.5V5",stroke:"currentColor",strokeWidth:"1.25",strokeLinecap:"round",strokeLinejoin:"round"})}),wt=r=>u.length?(0,t.jsxs)("div",{className:(0,o.cn)("laptop:bg-container-secondary-0 flex gap-1 rounded-lg p-1",e?.itemsGrid),children:[u.length>=5&&(0,t.jsx)("button",{onClick:()=>V("left"),className:(0,o.cn)("border-border laptop:flex hover:bg-muted-foreground/10 hidden w-[32px] shrink-0 items-center justify-center rounded-lg px-2 transition-colors",!E&&"laptop:bg-container-secondary-1 laptop:text-transparent laptop:pointer-events-none laptop:-my-1 laptop:-ml-1 laptop:py-1 laptop:pl-1 laptop:rounded-r-none",e?.expandButton,{"laptop:bg-container-secondary-0":r==="dark","laptop:bg-container-primary":r==="dark"&&!E}),"aria-label":"Scroll left to see more items",children:(0,t.jsx)(C,{className:"laptop:size-4 size-5 rotate-180"})}),(0,t.jsxs)("div",{ref:p,onMouseDown:ft,onMouseMove:ht,onMouseUp:xt,onMouseLeave:vt,onScroll:gt,className:(0,o.cn)("scrollbar-hide laptop:gap-1 laptop:w-[256px] laptop:shrink-0 flex w-full gap-1 overflow-x-auto [-ms-overflow-style:none] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden",R?"cursor-grabbing":"cursor-grab",e?.itemGridContainer),children:[u.filter(n=>n&&n.id).map(n=>{const x=(n.merchandise||{}).image||{},W=x.url,yt=x.altText||"Product image",k=B===n.id;return(0,t.jsxs)("div",{className:(0,o.cn)("laptop:size-12 group relative size-16 shrink-0",e?.gridItem),children:[W&&(0,t.jsx)("img",{src:W,alt:yt,draggable:!1,className:"pointer-events-none size-full select-none rounded-lg object-cover"}),k&&(0,t.jsx)("div",{className:"absolute inset-0 flex items-center justify-center rounded-lg bg-black/50",children:(0,t.jsxs)("svg",{width:"20",height:"20",viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",className:"animate-spin text-white",children:[(0,t.jsx)("circle",{cx:"8",cy:"8",r:"6",stroke:"currentColor",strokeWidth:"2",opacity:"0.3"}),(0,t.jsx)("path",{d:"M14 8a6 6 0 0 0-6-6",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"})]})}),(0,t.jsx)("span",{role:"button",onClick:()=>D(n.id),className:(0,o.cn)("laptop:hidden absolute right-[2px] top-[2px] cursor-pointer",k&&"pointer-events-none opacity-0"),"aria-label":"delete",children:(0,t.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",className:"pointer-events-none",children:[(0,t.jsx)("rect",{x:"1.33301",y:"1.33301",width:"13.3333",height:"13.3333",rx:"6.66667",fill:"white"}),(0,t.jsx)("path",{d:"M5.37705 5.28896C5.57234 5.09402 5.88839 5.09442 6.08347 5.28965L8.08602 7.29358L10.0906 5.28896C10.2858 5.09402 10.6026 5.09395 10.7977 5.28896C10.9928 5.48418 10.9926 5.80078 10.7977 5.99607L8.79312 8.00069L10.7964 10.0053C10.9913 10.2007 10.9909 10.5179 10.7957 10.7131C10.6005 10.908 10.2844 10.9074 10.0893 10.7124L8.08602 8.7078L6.08347 10.7103C5.88821 10.9056 5.57155 10.9057 5.37636 10.7103C5.18148 10.515 5.18132 10.1984 5.37636 10.0032L7.37891 8.00069L5.37636 5.99676C5.18119 5.80143 5.18181 5.48423 5.37705 5.28896Z",fill:"#767880"})]})}),n.quantity>1&&(0,t.jsx)("div",{className:"mini-cart-quantity bg-brand-0 laptop:size-4 absolute bottom-0 right-0 flex size-4 items-center justify-center rounded-full text-white",children:(0,t.jsx)(b.Text,{className:"text-sm",html:String(n.quantity)})}),(0,t.jsx)("div",{role:"button",onClick:()=>D(n.id),className:(0,o.cn)("absolute inset-0 hidden cursor-pointer items-center justify-center rounded-lg bg-black/60 transition-opacity","laptop:flex laptop:opacity-0 laptop:group-hover:opacity-100",k&&"laptop:hidden",e?.gridItemOverlay),"aria-label":"Remove item",children:(0,t.jsx)(bt,{className:"pointer-events-none size-[20px] text-white"})})]},n.id)}),J&&(0,t.jsx)("button",{onClick:()=>M?.(l),className:(0,o.cn)("bg-container-secondary-0 laptop:hidden flex size-16 shrink-0 items-center justify-center rounded-md",e?.mobileViewMoreButton),"aria-label":N,children:(0,t.jsx)("svg",{width:"20",height:"20",viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",className:"text-info-quaternary",children:(0,t.jsx)("path",{d:"M7.5 5L12.5 10L7.5 15",stroke:"currentColor",strokeWidth:"1.67",strokeLinecap:"round",strokeLinejoin:"round"})})})]}),u.length>=5&&(0,t.jsx)("button",{onClick:()=>V("right"),className:(0,o.cn)("border-border laptop:flex hover:bg-muted-foreground/10 hidden w-[32px] shrink-0 items-center justify-center rounded-lg px-2 transition-colors",!H&&"laptop:bg-container-secondary-1 laptop:text-transparent laptop:pointer-events-none laptop:-my-1 laptop:-mr-1 laptop:py-1 laptop:pr-1 laptop:rounded-l-none",e?.expandButton,{"laptop:bg-container-secondary-0":r==="dark","laptop:bg-container-primary":r==="dark"&&!H}),"aria-label":"Scroll right to see more items",children:(0,t.jsx)(C,{className:"laptop:size-4 size-5"})})]}):null,f=!ot&&u.length>0;return(0,t.jsx)("div",{ref:$,className:(0,o.cn)("bg-container-secondary-1 text-info-primary tablet:px-6 laptop:px-12 desktop:px-12 lg-desktop:px-[128px] laptop:py-[16px] flex w-full px-4 py-[12px]","flex-col items-stretch gap-3","laptop:flex-row laptop:items-center laptop:justify-around","laptop:items-center laptop:gap-4","tablet:gap-6 laptop:gap-8",i,e?.root,{"aiui-dark bg-container-primary":L==="dark"}),...Z,children:(0,t.jsxs)("div",{className:(0,o.cn)("laptop:flex-row flex w-full flex-col gap-4","laptop:flex-1 laptop:items-center laptop:justify-between","tablet:gap-6 laptop:gap-8",e?.content),children:[(0,t.jsxs)("div",{className:(0,o.cn)("relative flex shrink flex-row items-center gap-2","desktop:gap-4",a&&"laptop:pl-[104px] pl-[72px]"),children:[a&&(0,t.jsx)(F.default,{totalSteps:a.totalSteps,currentStep:a.currentStep,image:a.image,label:a.label,progressColor:a.progressColor,labelColor:a.labelColor,backgroundColor:a.backgroundColor,size:a.size,laptopSize:a.laptopSize,className:(0,o.cn)("absolute bottom-0 left-0","lg-desktop:bottom-auto lg-desktop:top-[-46px] desktop:bottom-auto desktop:top-[-52px]",e?.circleProgress)}),(0,t.jsxs)("div",{className:"laptop:flex-1 flex w-full flex-col",children:[(0,t.jsx)("div",{className:(0,o.cn)("tablet:gap-2 flex flex-col gap-1",e?.cartInfo),children:f?(0,t.jsxs)("div",{className:"flex w-full items-center gap-2",children:[(0,t.jsx)(g.Heading,{size:2,as:"h3",className:(0,o.cn)("",e?.cartTitle),html:Q.replace("{count}",`<span class="text-brand-0">${P||0}</span>`)}),(0,t.jsxs)(g.Heading,{size:1,as:"h5",onClick:()=>{window.innerWidth<1025?lt(!w):M?.(l)},className:(0,o.cn)("flex cursor-pointer items-center gap-1",e?.expandButton),children:[(0,t.jsx)(b.Text,{as:"span",size:1,className:"desktop:block hidden text-nowrap text-[16px] ",html:N}),(0,t.jsx)(C,{className:(0,o.cn)("size-4 transition-transform",w?"laptop:rotate-0 -rotate-90":"laptop:rotate-0 rotate-90")})]})]}):(0,t.jsx)(g.Heading,{as:"h3",size:2,className:(0,o.cn)("tablet:text-2xl text-xl font-semibold",e?.cartTitle),html:K})}),S&&(0,t.jsx)(b.Text,{size:2,className:(0,o.cn)("mini-cart-description text-info-tertiary desktop:text-[16px] lg-desktop:text-[18px] text-[14px]",e?.cartDescription),html:S})]})]}),f&&(0,t.jsx)("div",{className:(0,o.cn)("laptop:block laptop:shrink",w?"block":"hidden"),children:wt(L)}),f&&(0,t.jsx)("hr",{className:"laptop:hidden border-lines w-full border-t"}),(0,t.jsxs)("div",{className:(0,o.cn)("tablet:gap-6 laptop:gap-4 laptop:justify-end flex flex-row items-stretch justify-between gap-4",e?.priceSection),children:[(0,t.jsxs)("div",{className:"flex flex-col items-end justify-center",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(g.Heading,{as:"h6",size:2,className:(0,o.cn)("whitespace-nowrap text-nowrap",e?.totalPrice),html:_.replace("{total}",it)}),I&&(0,t.jsx)(g.Heading,{as:"h6",size:2,className:(0,o.cn)("text-info-tertiary whitespace-nowrap line-through",e?.originalPrice),html:I})]}),z&&(0,t.jsx)(g.Heading,{size:2,as:"h6",className:(0,o.cn)("laptop:text-right text-marketing-1 w-full whitespace-nowrap text-nowrap text-left",e?.saveAmount),html:et.replace("{amount}",z)})]}),(0,t.jsx)(X.Button,{disabled:!f,loading:T,onClick:async()=>{if(!T){A(!0);try{await Y?.(l)}finally{A(!1)}}},className:(0,o.cn)("whitespace-nowrap",e?.actionButton),children:tt})]})]})})});U.displayName="MiniCart";var It=U;
2
2
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/biz-components/MiniCart/index.tsx"],
4
- "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { cn } from '../../helpers/index.js'\nimport { Button } from '../../components/index.js'\nimport { Text } from '../../components/index.js'\nimport { Heading } from '../../components/index.js'\nimport type { Theme } from '../../types/props.js'\n\nexport type MiniCartSemanticName =\n | 'root'\n | 'content'\n | 'cartInfo'\n | 'cartTitle'\n | 'cartDescription'\n | 'priceSection'\n | 'totalPrice'\n | 'originalPrice'\n | 'saveAmount'\n | 'actionButton'\n | 'itemsGrid'\n | 'itemGridContainer'\n | 'gridItem'\n | 'gridItemOverlay'\n | 'expandButton'\n\n/**\n * \u6587\u6848\u914D\u7F6E\n */\nexport interface MiniCartCopy {\n emptyCart: string\n description: string\n total: string\n itemsInCart: string\n totalWithCoupon: string\n clickToView: string\n buyNowText: string\n savingText: string\n}\n\n/**\n * MiniCart \u4E1A\u52A1\u7EC4\u4EF6\u6570\u636E\u63A5\u53E3\n */\nexport interface MiniCartData {\n /** \u6587\u6848\u914D\u7F6E */\n copy?: MiniCartCopy\n theme?: 'light' | 'dark'\n /** \u5730\u533A\u4EE3\u7801\uFF0C\u7528\u4E8E\u4EF7\u683C\u683C\u5F0F\u5316 */\n locale?: string\n}\n\n/**\n * \u8D2D\u7269\u8F66\u5546\u54C1\u9879\u7C7B\u578B\n */\nexport type CartLineItem = {\n id: string\n quantity: number\n cost: {\n totalAmount: {\n amount: string\n currencyCode: string\n formattedPrice: string\n }\n subtotalAmount?: {\n amount: string\n currencyCode: string\n formattedPrice?: string\n }\n }\n merchandise: {\n id: string\n sku: string\n /** \u5546\u54C1\u6807\u9898 - MiniCartDialog \u9700\u8981 */\n title?: string\n image: {\n url: string\n altText: string | null\n }\n }\n}\n\n/**\n * \u8D2D\u7269\u8F66\u7C7B\u578B\n */\nexport type Cart = {\n id: string\n checkoutUrl: string\n lineItems: CartLineItem[]\n cost: {\n totalAmount: {\n amount: string\n currencyCode: string\n formattedPrice: string\n }\n subtotalAmount?: {\n amount: string\n currencyCode: string\n formattedPrice?: string\n }\n savingAmount?: {\n amount?: string\n currencyCode: string\n formattedPrice?: string\n }\n }\n}\n\nexport interface MiniCartProps extends React.HTMLAttributes<HTMLDivElement> {\n /** \u4E1A\u52A1\u6570\u636E */\n data: MiniCartData\n /**\n * \u5404\u90E8\u5206\u7684\u81EA\u5B9A\u4E49\u6837\u5F0F\u7C7B\u540D\n */\n classNames?: Partial<Record<MiniCartSemanticName, string>>\n /**\n * \u4EA7\u54C1\u4FE1\u606F\uFF08\u7528\u4E8E\u4E3B\u8981\u5C55\u793A\u7684\u4EA7\u54C1\uFF09\n */\n cart: Cart\n /**\n * \u5220\u9664\u5546\u54C1\u9879\u7684\u56DE\u8C03\u51FD\u6570\n * @param id \u5546\u54C1 ID\n * @param cart \u8D2D\u7269\u8F66\u6570\u636E\n * @returns \u652F\u6301\u8FD4\u56DE Promise\uFF0C\u5185\u90E8\u81EA\u52A8\u5904\u7406 loading \u72B6\u6001\n */\n onRemoveItem?: (id: string, cart: Cart) => void | Promise<void>\n /**\n * \u70B9\u51FB\u7ED3\u7B97\u6309\u94AE\u7684\u56DE\u8C03\u51FD\u6570\n * @param cart\n * @returns \u652F\u6301\u8FD4\u56DE Promise\uFF0C\u5185\u90E8\u81EA\u52A8\u5904\u7406 loading \u72B6\u6001\n */\n onCheckout?: (cart: Cart) => void | Promise<void>\n /**\n * \u70B9\u51FBclick to view\u7684\u56DE\u8C03\u51FD\u6570\n * @param cart\n * @returns\n */\n onClickToView?: (cart: Cart) => void\n}\n\n/**\n * MiniCart - \u8FF7\u4F60\u8D2D\u7269\u8F66\n *\n * @description \u8FF7\u4F60\u8D2D\u7269\u8F66\uFF08Mini Cart\uFF09\u662F\u4E00\u4E2A\u5E38\u89C1\u7684\u7535\u5546UI\u7EC4\u4EF6\uFF0C\u901A\u5E38\u5728\u7528\u6237\u6D4F\u89C8\u5546\u54C1\u65F6\u4EE5\u5E95\u90E8\u60AC\u6D6E\u7684\u5F62\u5F0F\u51FA\u73B0\uFF0C\u5141\u8BB8\u7528\u6237\u5FEB\u901F\u67E5\u770B\u3001\u7F16\u8F91\u8D2D\u7269\u8F66\u5185\u5BB9\u800C\u4E0D\u79BB\u5F00\u5F53\u524D\u9875\u9762\uFF0C\u540C\u65F6\u53EF\u4EE5\u627F\u8F7D\u6EE1\u8D60\uFF0C\u6EE1\u51CF\u7B49\u6D3B\u52A8\u3002\n */\nconst MiniCart = React.forwardRef<HTMLDivElement, MiniCartProps>(\n ({ className, classNames = {}, data, cart, onRemoveItem, onCheckout, onClickToView, ...props }, ref) => {\n const { copy, theme = 'light', locale = 'us' } = data || {}\n\n // \u6587\u6848\u914D\u7F6E\uFF0C\u5E26\u9ED8\u8BA4\u503C\n const emptyCart = copy?.emptyCart || 'Your Cart is Empty'\n const description =\n copy?.description || 'Add one more to get <span style=\"color: var(--brand-color)\">50% <span> off'\n const itemsInCart = copy?.itemsInCart || 'You have selected {count} items'\n const total = copy?.total || 'Total {total}'\n const totalWithCoupon = copy?.totalWithCoupon || 'total: {total} ({subtotal})'\n const clickToView = copy?.clickToView || 'Click to view cart'\n const buyNowText = copy?.buyNowText || 'Buy Now'\n const savingText = copy?.savingText || 'Saving {amount}'\n\n // \u4ECECart\u5BF9\u8C61\u4E2D\u63D0\u53D6\u6570\u636E\uFF0C\u4F7F\u7528\u53EF\u9009\u94FE\u548C\u9ED8\u8BA4\u503C\n const items = cart?.lineItems || []\n const itemCount = items.reduce((total, item) => total + (item?.quantity || 0), 0)\n const isEmpty = itemCount === 0\n\n // \u63D0\u524D\u8D4B\u503C\u6240\u6709\u91D1\u989D\u76F8\u5173\u53D8\u91CF\n const totalAmount = parseFloat(cart?.cost?.totalAmount?.amount || '0')\n const subtotalAmount = parseFloat(cart?.cost?.subtotalAmount?.amount || '0')\n const savingAmount = parseFloat(cart?.cost?.savingAmount?.amount || '0')\n\n // \u8BA1\u7B97\u4EF7\u683C\u4FE1\u606F\n const finalPrice = cart?.cost?.totalAmount?.formattedPrice || ''\n const originalPrice = subtotalAmount > totalAmount ? cart?.cost?.subtotalAmount?.formattedPrice : null\n const savingPrice = savingAmount > 0 ? cart?.cost?.savingAmount?.formattedPrice : null\n\n // \u6EDA\u52A8\u5BB9\u5668\u5F15\u7528\n const scrollContainerRef = React.useRef<HTMLDivElement>(null)\n\n // \u79FB\u52A8\u7AEF\u4EA7\u54C1\u5C55\u5F00\u72B6\u6001\n const [isProductsExpanded, setIsProductsExpanded] = React.useState(false)\n\n // checkout loading \u72B6\u6001\n const [checkoutLoading, setCheckoutLoading] = React.useState(false)\n\n // \u5220\u9664\u5546\u54C1 loading \u72B6\u6001\uFF08\u5B58\u50A8\u6B63\u5728\u5220\u9664\u7684\u5546\u54C1 ID\uFF09\n const [removingItemId, setRemovingItemId] = React.useState<string | null>(null)\n\n // \u5904\u7406\u5220\u9664\u5546\u54C1\n const handleRemoveItem = async (id: string) => {\n if (removingItemId) return\n setRemovingItemId(id)\n try {\n await onRemoveItem?.(id, cart)\n } finally {\n setRemovingItemId(null)\n }\n }\n\n // \u9F20\u6807\u62D6\u62FD\u6EDA\u52A8\u72B6\u6001\n const [isDragging, setIsDragging] = React.useState(false)\n const [startX, setStartX] = React.useState(0)\n const [scrollLeft, setScrollLeft] = React.useState(0)\n\n // \u9F20\u6807\u62D6\u62FD\u6EDA\u52A8\u5904\u7406\n const handleMouseDown = (e: React.MouseEvent<HTMLDivElement>) => {\n if (!scrollContainerRef.current) return\n setIsDragging(true)\n setStartX(e.pageX - scrollContainerRef.current.offsetLeft)\n setScrollLeft(scrollContainerRef.current.scrollLeft)\n }\n\n const handleMouseMove = (e: React.MouseEvent<HTMLDivElement>) => {\n if (!isDragging || !scrollContainerRef.current) return\n e.preventDefault()\n const x = e.pageX - scrollContainerRef.current.offsetLeft\n const walk = (x - startX) * 1.5 // \u6EDA\u52A8\u901F\u5EA6\u500D\u6570\n scrollContainerRef.current.scrollLeft = scrollLeft - walk\n }\n\n const handleMouseUp = () => {\n setIsDragging(false)\n }\n\n const handleMouseLeave = () => {\n setIsDragging(false)\n }\n\n // \u6C34\u5E73\u6EDA\u52A8\u51FD\u6570\n const scrollHorizontally = (direction: 'left' | 'right') => {\n if (scrollContainerRef.current) {\n const container = scrollContainerRef.current\n const scrollAmount = 100 // \u6BCF\u6B21\u6EDA\u52A8\u7684\u50CF\u7D20\u6570\uFF08\u8C03\u5C0F\u4E00\u4E9B\uFF09\n container.scrollBy({ left: direction === 'right' ? scrollAmount : -scrollAmount, behavior: 'smooth' })\n }\n }\n\n // \u7BAD\u5934\u56FE\u6807\u7EC4\u4EF6\n const ArrowIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6 4L10 8L6 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.33\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n\n // \u5220\u9664\u56FE\u6807\u7EC4\u4EF6\n const DeleteIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M2.5 5H17.5M8.33333 9.16667V14.1667M11.6667 9.16667V14.1667M3.33333 5L4.16667 16.6667C4.16667 17.1087 4.34226 17.5326 4.65482 17.8452C4.96738 18.1577 5.39131 18.3333 5.83333 18.3333H14.1667C14.6087 18.3333 15.0326 18.1577 15.3452 17.8452C15.6577 17.5326 15.8333 17.1087 15.8333 16.6667L16.6667 5M7.5 5V2.5C7.5 2.27899 7.5878 2.06702 7.74408 1.91074C7.90036 1.75446 8.11232 1.66667 8.33333 1.66667H11.6667C11.8877 1.66667 12.0996 1.75446 12.2559 1.91074C12.4122 2.06702 12.5 2.27899 12.5 2.5V5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n\n // Render items grid\n const renderItemsGrid = (theme: Theme) => {\n if (!items.length) return null\n\n return (\n <div className={cn('bg-container-primary flex gap-1 rounded-lg p-1', classNames?.itemsGrid)}>\n {/* \u5DE6\u6EDA\u52A8\u6309\u94AE - \u684C\u9762\u7AEF\u663E\u793A */}\n {items.length > 0 && (\n <button\n onClick={() => scrollHorizontally('left')}\n className={cn(\n 'border-border laptop:flex hover:bg-muted-foreground/10 laptop:flex hidden size-12 shrink-0 items-center justify-center rounded-lg transition-colors',\n classNames?.expandButton\n )}\n aria-label=\"Scroll left to see more items\"\n >\n <ArrowIcon className=\"size-4 rotate-180\" />\n </button>\n )}\n\n <div\n ref={scrollContainerRef}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseLeave}\n className={cn(\n 'scrollbar-hide laptop:gap-1 laptop:max-w-[240px] flex w-full gap-1 overflow-x-auto [-ms-overflow-style:none] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden',\n isDragging ? 'cursor-grabbing' : 'cursor-grab',\n classNames?.itemGridContainer\n )}\n >\n {items\n .filter(line => line && line.id)\n .map(line => {\n const safeproduct = line.merchandise || {}\n const safeImage = safeproduct.image || {}\n const imageUrl = safeImage.url\n const imageAlt = safeImage.altText || 'Product image'\n\n return (\n <div\n key={line.id}\n className={cn(\n 'laptop:size-12 bg-container-secondary laptop:bg-white group relative size-16 shrink-0 rounded-lg',\n classNames?.gridItem\n )}\n >\n {imageUrl && (\n <img\n src={imageUrl}\n alt={imageAlt}\n draggable={false}\n className=\"pointer-events-none size-full select-none rounded-lg object-cover\"\n />\n )}\n {/* \u5220\u9664 loading \u906E\u7F69 */}\n {removingItemId === line.id && (\n <div className=\"absolute inset-0 flex items-center justify-center rounded-lg bg-black/50\">\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"animate-spin text-white\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"2\" opacity=\"0.3\" />\n <path d=\"M14 8a6 6 0 0 0-6-6\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n </div>\n )}\n <span\n role=\"button\"\n onClick={() => handleRemoveItem(line.id)}\n className={cn(\n 'laptop:hidden absolute right-[2px] top-[2px] cursor-pointer',\n removingItemId === line.id && 'pointer-events-none opacity-0'\n )}\n aria-label=\"delete\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"pointer-events-none\"\n >\n <rect x=\"1.33301\" y=\"1.33301\" width=\"13.3333\" height=\"13.3333\" rx=\"6.66667\" fill=\"white\" />\n <path\n d=\"M5.37705 5.28896C5.57234 5.09402 5.88839 5.09442 6.08347 5.28965L8.08602 7.29358L10.0906 5.28896C10.2858 5.09402 10.6026 5.09395 10.7977 5.28896C10.9928 5.48418 10.9926 5.80078 10.7977 5.99607L8.79312 8.00069L10.7964 10.0053C10.9913 10.2007 10.9909 10.5179 10.7957 10.7131C10.6005 10.908 10.2844 10.9074 10.0893 10.7124L8.08602 8.7078L6.08347 10.7103C5.88821 10.9056 5.57155 10.9057 5.37636 10.7103C5.18148 10.515 5.18132 10.1984 5.37636 10.0032L7.37891 8.00069L5.37636 5.99676C5.18119 5.80143 5.18181 5.48423 5.37705 5.28896Z\"\n fill=\"#767880\"\n />\n </svg>\n </span>\n {line.quantity > 1 && (\n <div className=\"mini-cart-quantity bg-brand-0 laptop:size-4 absolute bottom-0 right-0 flex size-4 items-center justify-center rounded-full text-white\">\n <Text className=\"text-sm\" html={String(line.quantity)} />\n </div>\n )}\n\n <div\n className={cn(\n 'laptop:flex absolute inset-0 hidden items-center justify-center rounded-lg bg-black/60 opacity-0 transition-opacity group-hover:opacity-100',\n removingItemId === line.id && 'hidden',\n classNames?.gridItemOverlay\n )}\n >\n <button\n onClick={() => handleRemoveItem(line.id)}\n className=\"flex items-center justify-center rounded-full bg-white/20 p-1 transition-colors hover:bg-white/30\"\n aria-label=\"Remove item\"\n >\n <DeleteIcon className=\"laptop:size-3 pointer-events-none size-4 text-white\" />\n </button>\n </div>\n </div>\n )\n })}\n </div>\n\n {/* \u53F3\u6EDA\u52A8\u6309\u94AE - \u684C\u9762\u7AEF\u663E\u793A */}\n {items.length > 0 && (\n <button\n onClick={() => scrollHorizontally('right')}\n className={cn(\n 'border-border laptop:flex hover:bg-muted-foreground/10 laptop:flex hidden size-12 shrink-0 items-center justify-center rounded-lg transition-colors',\n classNames?.expandButton\n )}\n aria-label=\"Scroll right to see more items\"\n >\n <ArrowIcon className=\"size-4\" />\n </button>\n )}\n </div>\n )\n }\n\n // Check if cart has items\n const hasItems = !isEmpty && items.length > 0\n\n return (\n <div\n ref={ref}\n className={cn(\n 'bg-container-secondary-1 text-info-primary tablet:px-6 laptop:px-12 desktop:px-12 lg-desktop:px-[128px] laptop:py-[16px] flex w-full px-4 py-[12px]',\n // \u79FB\u52A8\u7AEF\u5782\u76F4\u5E03\u5C40\uFF0C\u5927\u5C4F\u5E55\u6C34\u5E73\u5E03\u5C40\n 'flex-col items-stretch gap-3',\n 'laptop:flex-row laptop:items-center laptop:justify-around',\n hasItems ? 'laptop:items-center laptop:gap-4' : 'laptop:items-center laptop:gap-4',\n 'tablet:gap-6 laptop:gap-8',\n className,\n classNames?.root,\n {\n 'aiui-dark bg-container-primary': theme === 'dark',\n }\n )}\n {...props}\n >\n {/* \u79FB\u52A8\u7AEF\uFF1A\u5782\u76F4\u6392\u5217 | \u684C\u9762\u7AEF\uFF1A\u6C34\u5E73\u4E09\u5217\u5E03\u5C40 */}\n <div\n className={cn(\n 'laptop:flex-row flex w-full flex-col gap-4',\n 'laptop:flex-1 laptop:items-start',\n 'tablet:gap-6 laptop:gap-8',\n classNames?.content\n )}\n >\n {/* Center: Cart info and dynamic content */}\n <div className=\"laptop:flex-1 flex w-full flex-col\">\n {/* Cart title area */}\n <div className={cn('tablet:gap-2 flex flex-col gap-1', classNames?.cartInfo)}>\n {hasItems ? (\n <div className=\"flex w-full items-center gap-2\">\n <Heading\n size={2}\n as=\"h3\"\n className={cn('', classNames?.cartTitle)}\n html={itemsInCart.replace('{count}', `<span class=\"text-brand-0\">${itemCount || 0}</span>`)}\n />\n\n {/* Click to view link / Toggle products */}\n <Heading\n size={1}\n as=\"h5\"\n onClick={() => {\n // \u79FB\u52A8\u7AEF\uFF1A\u5207\u6362\u4EA7\u54C1\u5C55\u5F00\u72B6\u6001\uFF0C\u684C\u9762\u7AEF\uFF1A\u8C03\u7528\u539F\u56DE\u8C03\n const isMobile = window.innerWidth < 1025\n if (isMobile) {\n setIsProductsExpanded(!isProductsExpanded)\n } else {\n onClickToView?.(cart)\n }\n }}\n className={cn('flex cursor-pointer items-center gap-1', classNames?.expandButton)}\n >\n {/* \u684C\u9762\u7AEF\u663E\u793A\u6587\u5B57 + \u56FE\u6807\uFF0C\u79FB\u52A8\u7AEF\u53EA\u663E\u793A\u56FE\u6807 */}\n <Heading as=\"h6\" size={1} className=\"laptop:block hidden text-nowrap\" html={clickToView} />\n <ArrowIcon\n className={cn(\n 'size-4 transition-transform',\n isProductsExpanded ? 'laptop:rotate-0 -rotate-90' : 'laptop:rotate-0 rotate-90'\n )}\n />\n </Heading>\n </div>\n ) : (\n <Heading\n as=\"h3\"\n size={2}\n className={cn('tablet:text-2xl text-xl font-semibold', classNames?.cartTitle)}\n html={emptyCart}\n />\n )}\n </div>\n <div>\n {description && (\n <Text\n size={2}\n className={cn('mini-cart-description', classNames?.cartDescription)}\n html={description}\n />\n )}\n </div>\n </div>\n\n {/* Items grid (\u79FB\u52A8\u7AEF\uFF1A\u6839\u636E\u5C55\u5F00\u72B6\u6001\u663E\u793A\uFF0C\u684C\u9762\u7AEF\uFF1A\u59CB\u7EC8\u663E\u793A) */}\n {hasItems && (\n <div className={cn('laptop:block', isProductsExpanded ? 'block' : 'hidden')}>{renderItemsGrid(theme)}</div>\n )}\n {/* \u79FB\u52A8\u7AEF\uFF1A\u5206\u5272\u7EBF\uFF08\u53EA\u5728\u6709\u5546\u54C1\u65F6\u663E\u793A\uFF09 */}\n {hasItems && <hr className=\"laptop:hidden border-lines w-full border-t\" />}\n\n {/* Price and button area */}\n <div\n className={cn(\n 'tablet:gap-6 laptop:justify-end flex flex-row items-center justify-between gap-4',\n classNames?.priceSection\n )}\n >\n {/* Price info */}\n <div className=\"flex flex-col items-end justify-center gap-1\">\n {/* Main price row */}\n <div className=\"flex items-center gap-2\">\n <Heading\n as=\"h6\"\n size={2}\n className={cn(' whitespace-nowrap ', classNames?.totalPrice)}\n html={total.replace('{total}', finalPrice)}\n />\n\n {/* Original price (if discounted) */}\n {originalPrice && (\n <Heading\n as=\"h6\"\n size={2}\n className={cn('whitespace-nowrap line-through', classNames?.originalPrice)}\n html={originalPrice}\n />\n )}\n </div>\n\n {/* Save amount */}\n {savingPrice && (\n <Heading\n size={2}\n as=\"h6\"\n className={cn('laptop:text-right text-marketing-0 w-full text-left', classNames?.saveAmount)}\n html={savingText.replace('{amount}', savingPrice)}\n />\n )}\n </div>\n\n {/* Action button */}\n <Button\n disabled={!hasItems}\n loading={checkoutLoading}\n onClick={async () => {\n if (checkoutLoading) return\n setCheckoutLoading(true)\n try {\n await onCheckout?.(cart)\n } finally {\n setCheckoutLoading(false)\n }\n }}\n className={cn('whitespace-nowrap', classNames?.actionButton)}\n >\n {buyNowText}\n </Button>\n </div>\n </div>\n </div>\n )\n }\n)\n\nMiniCart.displayName = 'MiniCart'\nexport default MiniCart\n"],
5
- "mappings": "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",
6
- "names": ["MiniCart_exports", "__export", "MiniCart_default", "__toCommonJS", "import_jsx_runtime", "React", "import_helpers", "import_components", "MiniCart", "className", "classNames", "data", "cart", "onRemoveItem", "onCheckout", "onClickToView", "props", "ref", "copy", "theme", "locale", "emptyCart", "description", "itemsInCart", "total", "totalWithCoupon", "clickToView", "buyNowText", "savingText", "items", "itemCount", "item", "isEmpty", "totalAmount", "subtotalAmount", "savingAmount", "finalPrice", "originalPrice", "savingPrice", "scrollContainerRef", "isProductsExpanded", "setIsProductsExpanded", "checkoutLoading", "setCheckoutLoading", "removingItemId", "setRemovingItemId", "handleRemoveItem", "id", "isDragging", "setIsDragging", "startX", "setStartX", "scrollLeft", "setScrollLeft", "handleMouseDown", "e", "handleMouseMove", "walk", "handleMouseUp", "handleMouseLeave", "scrollHorizontally", "direction", "container", "scrollAmount", "ArrowIcon", "DeleteIcon", "renderItemsGrid", "line", "safeImage", "imageUrl", "imageAlt", "hasItems"]
4
+ "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { cn } from '../../helpers/index.js'\nimport { Button } from '../../components/index.js'\nimport { Text } from '../../components/index.js'\nimport { Heading } from '../../components/index.js'\nimport type { Theme, Img } from '../../types/props.js'\nimport CircleProgress from './CircleProgress.js'\n\nexport type MiniCartSemanticName =\n | 'root'\n | 'content'\n | 'cartInfo'\n | 'cartTitle'\n | 'cartDescription'\n | 'priceSection'\n | 'totalPrice'\n | 'originalPrice'\n | 'saveAmount'\n | 'actionButton'\n | 'itemsGrid'\n | 'itemGridContainer'\n | 'gridItem'\n | 'gridItemOverlay'\n | 'expandButton'\n | 'circleProgress'\n | 'mobileViewMoreButton'\n\n/**\n * \u5706\u5F62\u8FDB\u5EA6\u6761\u914D\u7F6E\n */\nexport interface CircleProgressConfig {\n /** \u603B\u9636\u6BB5\u6570 (1-4) */\n totalSteps?: 1 | 2 | 3 | 4\n /** \u5F53\u524D\u5B8C\u6210\u7684\u9636\u6BB5 (0 \u5230 totalSteps) */\n currentStep?: number\n /** \u4E2D\u95F4\u663E\u793A\u7684\u56FE\u7247 */\n image?: Img\n /** \u5E95\u90E8\u663E\u793A\u7684\u6587\u6848 */\n label?: string\n /** \u8FDB\u5EA6\u6761\u989C\u8272\uFF0C\u9ED8\u8BA4\u4E3A\u54C1\u724C\u8272 */\n progressColor?: string\n /** \u5E95\u90E8\u6587\u6848\u80CC\u666F\u8272\uFF0C\u9ED8\u8BA4\u4E3A\u54C1\u724C\u8425\u9500\u8272 */\n labelColor?: string\n /** \u80CC\u666F\u989C\u8272\uFF0C\u9ED8\u8BA4\u4E3A\u5BB9\u5668\u80CC\u666F\u8272 */\n backgroundColor?: string\n /** \u79FB\u52A8\u7AEF\u7EC4\u4EF6\u5C3A\u5BF8\uFF0C\u9ED8\u8BA4 48 */\n size?: number\n /** laptop \u4EE5\u4E0A\u7EC4\u4EF6\u5C3A\u5BF8\uFF0C\u9ED8\u8BA4 80 */\n laptopSize?: number\n}\n\n/**\n * \u6587\u6848\u914D\u7F6E\n */\nexport interface MiniCartCopy {\n emptyCart: string\n description: string\n total: string\n itemsInCart: string\n totalWithCoupon: string\n clickToView: string\n buyNowText: string\n savingText: string\n}\n\n/**\n * MiniCart \u4E1A\u52A1\u7EC4\u4EF6\u6570\u636E\u63A5\u53E3\n */\nexport interface MiniCartData {\n /** \u6587\u6848\u914D\u7F6E */\n copy?: MiniCartCopy\n theme?: 'light' | 'dark'\n /** \u5730\u533A\u4EE3\u7801\uFF0C\u7528\u4E8E\u4EF7\u683C\u683C\u5F0F\u5316 */\n locale?: string\n /** \u662F\u5426\u663E\u793A\u624B\u673A\u7AEF\u67E5\u770B\u66F4\u591A\u6309\u94AE\uFF0C\u9ED8\u8BA4 true */\n showMobileViewMore?: boolean\n}\n\n/**\n * \u8D2D\u7269\u8F66\u5546\u54C1\u9879\u7C7B\u578B\n */\nexport type CartLineItem = {\n id: string\n quantity: number\n cost: {\n totalAmount: {\n amount: string\n currencyCode: string\n formattedPrice: string\n }\n subtotalAmount?: {\n amount: string\n currencyCode: string\n formattedPrice?: string\n }\n }\n merchandise: {\n id: string\n sku: string\n /** \u5546\u54C1\u6807\u9898 - MiniCartDialog \u9700\u8981 */\n title?: string\n image: {\n url: string\n altText: string | null\n }\n }\n}\n\n/**\n * \u8D2D\u7269\u8F66\u7C7B\u578B\n */\nexport type Cart = {\n id: string\n checkoutUrl: string\n lineItems: CartLineItem[]\n cost: {\n totalAmount: {\n amount: string\n currencyCode: string\n formattedPrice: string\n }\n subtotalAmount?: {\n amount: string\n currencyCode: string\n formattedPrice?: string\n }\n savingAmount?: {\n amount?: string\n currencyCode: string\n formattedPrice?: string\n }\n }\n}\n\nexport interface MiniCartProps extends React.HTMLAttributes<HTMLDivElement> {\n /** \u4E1A\u52A1\u6570\u636E */\n data: MiniCartData\n /**\n * \u5404\u90E8\u5206\u7684\u81EA\u5B9A\u4E49\u6837\u5F0F\u7C7B\u540D\n */\n classNames?: Partial<Record<MiniCartSemanticName, string>>\n /**\n * \u4EA7\u54C1\u4FE1\u606F\uFF08\u7528\u4E8E\u4E3B\u8981\u5C55\u793A\u7684\u4EA7\u54C1\uFF09\n */\n cart: Cart\n /**\n * \u5706\u5F62\u8FDB\u5EA6\u6761\u914D\u7F6E\uFF0C\u4E0D\u4F20\u5219\u4E0D\u663E\u793A\u8FDB\u5EA6\u6761\n */\n progressConfig?: CircleProgressConfig\n /**\n * \u5220\u9664\u5546\u54C1\u9879\u7684\u56DE\u8C03\u51FD\u6570\n * @param id \u5546\u54C1 ID\n * @param cart \u8D2D\u7269\u8F66\u6570\u636E\n * @returns \u652F\u6301\u8FD4\u56DE Promise\uFF0C\u5185\u90E8\u81EA\u52A8\u5904\u7406 loading \u72B6\u6001\n */\n onRemoveItem?: (id: string, cart: Cart) => void | Promise<void>\n /**\n * \u70B9\u51FB\u7ED3\u7B97\u6309\u94AE\u7684\u56DE\u8C03\u51FD\u6570\n * @param cart\n * @returns \u652F\u6301\u8FD4\u56DE Promise\uFF0C\u5185\u90E8\u81EA\u52A8\u5904\u7406 loading \u72B6\u6001\n */\n onCheckout?: (cart: Cart) => void | Promise<void>\n /**\n * \u70B9\u51FBclick to view\u7684\u56DE\u8C03\u51FD\u6570\n * @param cart\n * @returns\n */\n onClickToView?: (cart: Cart) => void\n}\n\n/**\n * MiniCart - \u8FF7\u4F60\u8D2D\u7269\u8F66\n *\n * @description \u8FF7\u4F60\u8D2D\u7269\u8F66\uFF08Mini Cart\uFF09\u662F\u4E00\u4E2A\u5E38\u89C1\u7684\u7535\u5546UI\u7EC4\u4EF6\uFF0C\u901A\u5E38\u5728\u7528\u6237\u6D4F\u89C8\u5546\u54C1\u65F6\u4EE5\u5E95\u90E8\u60AC\u6D6E\u7684\u5F62\u5F0F\u51FA\u73B0\uFF0C\u5141\u8BB8\u7528\u6237\u5FEB\u901F\u67E5\u770B\u3001\u7F16\u8F91\u8D2D\u7269\u8F66\u5185\u5BB9\u800C\u4E0D\u79BB\u5F00\u5F53\u524D\u9875\u9762\uFF0C\u540C\u65F6\u53EF\u4EE5\u627F\u8F7D\u6EE1\u8D60\uFF0C\u6EE1\u51CF\u7B49\u6D3B\u52A8\u3002\n */\nconst MiniCart = React.forwardRef<HTMLDivElement, MiniCartProps>(\n (\n { className, classNames = {}, data, cart, progressConfig, onRemoveItem, onCheckout, onClickToView, ...props },\n ref\n ) => {\n const { copy, theme = 'light', locale = 'us', showMobileViewMore = true } = data || {}\n\n // \u6587\u6848\u914D\u7F6E\uFF0C\u5E26\u9ED8\u8BA4\u503C\n const emptyCart = copy?.emptyCart || 'Your Cart is Empty'\n const description = copy?.description || ''\n const itemsInCart = copy?.itemsInCart || 'You have selected {count} items'\n const total = copy?.total || 'Total {total}'\n const totalWithCoupon = copy?.totalWithCoupon || 'total: {total} ({subtotal})'\n const clickToView = copy?.clickToView || 'Click to view cart'\n const buyNowText = copy?.buyNowText || 'Buy Now'\n const savingText = copy?.savingText || 'Saving {amount}'\n\n // \u4ECECart\u5BF9\u8C61\u4E2D\u63D0\u53D6\u6570\u636E\uFF0C\u4F7F\u7528\u53EF\u9009\u94FE\u548C\u9ED8\u8BA4\u503C\n const items = React.useMemo(() => cart?.lineItems || [], [cart?.lineItems])\n const itemCount = items.reduce((total, item) => total + (item?.quantity || 0), 0)\n const isEmpty = itemCount === 0\n\n // \u63D0\u524D\u8D4B\u503C\u6240\u6709\u91D1\u989D\u76F8\u5173\u53D8\u91CF\n const totalAmount = parseFloat(cart?.cost?.totalAmount?.amount || '0')\n const subtotalAmount = parseFloat(cart?.cost?.subtotalAmount?.amount || '0')\n const savingAmount = parseFloat(cart?.cost?.savingAmount?.amount || '0')\n\n // \u8BA1\u7B97\u4EF7\u683C\u4FE1\u606F\n const finalPrice = cart?.cost?.totalAmount?.formattedPrice || ''\n const originalPrice = subtotalAmount > totalAmount ? cart?.cost?.subtotalAmount?.formattedPrice : null\n const savingPrice = savingAmount > 0 ? cart?.cost?.savingAmount?.formattedPrice : null\n\n // \u6EDA\u52A8\u5BB9\u5668\u5F15\u7528\n const scrollContainerRef = React.useRef<HTMLDivElement>(null)\n\n // \u79FB\u52A8\u7AEF\u4EA7\u54C1\u5C55\u5F00\u72B6\u6001\n const [isProductsExpanded, setIsProductsExpanded] = React.useState(false)\n\n // checkout loading \u72B6\u6001\n const [checkoutLoading, setCheckoutLoading] = React.useState(false)\n\n // \u5220\u9664\u5546\u54C1 loading \u72B6\u6001\n const [removingItemId, setRemovingItemId] = React.useState<string | null>(null)\n\n // \u5904\u7406\u5220\u9664\u5546\u54C1\n const handleRemoveItem = async (id: string) => {\n if (removingItemId) return\n setRemovingItemId(id)\n try {\n await onRemoveItem?.(id, cart)\n } finally {\n setRemovingItemId(null)\n }\n }\n\n // \u9F20\u6807\u62D6\u62FD\u6EDA\u52A8\u72B6\u6001\n const [isDragging, setIsDragging] = React.useState(false)\n const [startX, setStartX] = React.useState(0)\n const [scrollLeft, setScrollLeft] = React.useState(0)\n\n // \u6EDA\u52A8\u4F4D\u7F6E\u72B6\u6001\uFF08\u63A7\u5236\u5DE6\u53F3\u6309\u94AE\u663E\u793A\uFF09\n const [canScrollLeft, setCanScrollLeft] = React.useState(false)\n const [canScrollRight, setCanScrollRight] = React.useState(true)\n\n // \u68C0\u67E5\u6EDA\u52A8\u4F4D\u7F6E\uFF0C\u66F4\u65B0\u6309\u94AE\u663E\u793A\u72B6\u6001\n const updateScrollButtons = React.useCallback(() => {\n const container = scrollContainerRef.current\n if (!container) return\n\n const { scrollLeft, scrollWidth, clientWidth } = container\n setCanScrollLeft(scrollLeft > 0)\n setCanScrollRight(scrollLeft < scrollWidth - clientWidth - 1)\n }, [])\n\n // \u76D1\u542C\u6EDA\u52A8\u4E8B\u4EF6\n const handleScroll = React.useCallback(() => {\n updateScrollButtons()\n }, [updateScrollButtons])\n\n // \u521D\u59CB\u5316\u548C items \u53D8\u5316\u65F6\u66F4\u65B0\u6EDA\u52A8\u72B6\u6001\n React.useEffect(() => {\n updateScrollButtons()\n }, [items.length, updateScrollButtons])\n\n // \u9F20\u6807\u62D6\u62FD\u6EDA\u52A8\u5904\u7406\n const handleMouseDown = (e: React.MouseEvent<HTMLDivElement>) => {\n if (!scrollContainerRef.current) return\n setIsDragging(true)\n setStartX(e.pageX - scrollContainerRef.current.offsetLeft)\n setScrollLeft(scrollContainerRef.current.scrollLeft)\n }\n\n const handleMouseMove = (e: React.MouseEvent<HTMLDivElement>) => {\n if (!isDragging || !scrollContainerRef.current) return\n e.preventDefault()\n const x = e.pageX - scrollContainerRef.current.offsetLeft\n const walk = (x - startX) * 1.5 // \u6EDA\u52A8\u901F\u5EA6\u500D\u6570\n scrollContainerRef.current.scrollLeft = scrollLeft - walk\n }\n\n const handleMouseUp = () => {\n setIsDragging(false)\n }\n\n const handleMouseLeave = () => {\n setIsDragging(false)\n }\n\n // \u6C34\u5E73\u6EDA\u52A8\u51FD\u6570\n const scrollHorizontally = (direction: 'left' | 'right') => {\n if (scrollContainerRef.current) {\n const container = scrollContainerRef.current\n const scrollAmount = 100 // \u6BCF\u6B21\u6EDA\u52A8\u7684\u50CF\u7D20\u6570\uFF08\u8C03\u5C0F\u4E00\u4E9B\uFF09\n container.scrollBy({ left: direction === 'right' ? scrollAmount : -scrollAmount, behavior: 'smooth' })\n }\n }\n\n // \u7BAD\u5934\u56FE\u6807\u7EC4\u4EF6\n const ArrowIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6 4L10 8L6 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.33\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n\n // \u5220\u9664\u56FE\u6807\u7EC4\u4EF6\n const DeleteIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M2.5 5H17.5M8.33333 9.16667V14.1667M11.6667 9.16667V14.1667M3.33333 5L4.16667 16.6667C4.16667 17.1087 4.34226 17.5326 4.65482 17.8452C4.96738 18.1577 5.39131 18.3333 5.83333 18.3333H14.1667C14.6087 18.3333 15.0326 18.1577 15.3452 17.8452C15.6577 17.5326 15.8333 17.1087 15.8333 16.6667L16.6667 5M7.5 5V2.5C7.5 2.27899 7.5878 2.06702 7.74408 1.91074C7.90036 1.75446 8.11232 1.66667 8.33333 1.66667H11.6667C11.8877 1.66667 12.0996 1.75446 12.2559 1.91074C12.4122 2.06702 12.5 2.27899 12.5 2.5V5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n\n // Render items grid\n const renderItemsGrid = (theme: Theme) => {\n if (!items.length) return null\n\n return (\n <div className={cn('laptop:bg-container-secondary-0 flex gap-1 rounded-lg p-1', classNames?.itemsGrid)}>\n {/* \u5DE6\u6EDA\u52A8\u6309\u94AE - \u684C\u9762\u7AEF\u663E\u793A\uFF0C\u5C11\u4E8E5\u4E2A\u5546\u54C1\u65F6\u4E0D\u6E32\u67D3\uFF0C\u6EDA\u52A8\u5230\u5F00\u5934\u65F6\u9690\u85CF\u4F46\u4FDD\u6301\u5360\u4F4D */}\n {items.length >= 5 && (\n <button\n onClick={() => scrollHorizontally('left')}\n className={cn(\n 'border-border laptop:flex hover:bg-muted-foreground/10 hidden w-[32px] shrink-0 items-center justify-center rounded-lg px-2 transition-colors',\n !canScrollLeft &&\n 'laptop:bg-container-secondary-1 laptop:text-transparent laptop:pointer-events-none laptop:-my-1 laptop:-ml-1 laptop:py-1 laptop:pl-1 laptop:rounded-r-none',\n classNames?.expandButton,\n {\n 'laptop:bg-container-secondary-0': theme === 'dark',\n 'laptop:bg-container-primary': theme === 'dark' && !canScrollLeft,\n }\n )}\n aria-label=\"Scroll left to see more items\"\n >\n <ArrowIcon className=\"laptop:size-4 size-5 rotate-180\" />\n </button>\n )}\n\n <div\n ref={scrollContainerRef}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseLeave}\n onScroll={handleScroll}\n className={cn(\n 'scrollbar-hide laptop:gap-1 laptop:w-[256px] laptop:shrink-0 flex w-full gap-1 overflow-x-auto [-ms-overflow-style:none] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden',\n isDragging ? 'cursor-grabbing' : 'cursor-grab',\n classNames?.itemGridContainer\n )}\n >\n {items\n .filter(line => line && line.id)\n .map(line => {\n const safeProduct = line.merchandise || {}\n const safeImage = safeProduct.image || {}\n const imageUrl = safeImage.url\n const imageAlt = safeImage.altText || 'Product image'\n const isLoading = removingItemId === line.id\n\n return (\n <div\n key={line.id}\n className={cn('laptop:size-12 group relative size-16 shrink-0', classNames?.gridItem)}\n >\n {imageUrl && (\n <img\n src={imageUrl}\n alt={imageAlt}\n draggable={false}\n className=\"pointer-events-none size-full select-none rounded-lg object-cover\"\n />\n )}\n {/* \u5220\u9664 loading \u906E\u7F69 */}\n {isLoading && (\n <div className=\"absolute inset-0 flex items-center justify-center rounded-lg bg-black/50\">\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"animate-spin text-white\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"2\" opacity=\"0.3\" />\n <path d=\"M14 8a6 6 0 0 0-6-6\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n </div>\n )}\n <span\n role=\"button\"\n onClick={() => handleRemoveItem(line.id)}\n className={cn(\n 'laptop:hidden absolute right-[2px] top-[2px] cursor-pointer',\n isLoading && 'pointer-events-none opacity-0'\n )}\n aria-label=\"delete\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"pointer-events-none\"\n >\n <rect x=\"1.33301\" y=\"1.33301\" width=\"13.3333\" height=\"13.3333\" rx=\"6.66667\" fill=\"white\" />\n <path\n d=\"M5.37705 5.28896C5.57234 5.09402 5.88839 5.09442 6.08347 5.28965L8.08602 7.29358L10.0906 5.28896C10.2858 5.09402 10.6026 5.09395 10.7977 5.28896C10.9928 5.48418 10.9926 5.80078 10.7977 5.99607L8.79312 8.00069L10.7964 10.0053C10.9913 10.2007 10.9909 10.5179 10.7957 10.7131C10.6005 10.908 10.2844 10.9074 10.0893 10.7124L8.08602 8.7078L6.08347 10.7103C5.88821 10.9056 5.57155 10.9057 5.37636 10.7103C5.18148 10.515 5.18132 10.1984 5.37636 10.0032L7.37891 8.00069L5.37636 5.99676C5.18119 5.80143 5.18181 5.48423 5.37705 5.28896Z\"\n fill=\"#767880\"\n />\n </svg>\n </span>\n {line.quantity > 1 && (\n <div className=\"mini-cart-quantity bg-brand-0 laptop:size-4 absolute bottom-0 right-0 flex size-4 items-center justify-center rounded-full text-white\">\n <Text className=\"text-sm\" html={String(line.quantity)} />\n </div>\n )}\n\n <div\n role=\"button\"\n onClick={() => handleRemoveItem(line.id)}\n className={cn(\n 'absolute inset-0 hidden cursor-pointer items-center justify-center rounded-lg bg-black/60 transition-opacity',\n 'laptop:flex laptop:opacity-0 laptop:group-hover:opacity-100',\n isLoading && 'laptop:hidden',\n classNames?.gridItemOverlay\n )}\n aria-label=\"Remove item\"\n >\n <DeleteIcon className=\"pointer-events-none size-[20px] text-white\" />\n </div>\n </div>\n )\n })}\n\n {/* \u624B\u673A\u7AEF\u67E5\u770B\u66F4\u591A\u6309\u94AE */}\n {showMobileViewMore && (\n <button\n onClick={() => onClickToView?.(cart)}\n className={cn(\n 'bg-container-secondary-0 laptop:hidden flex size-16 shrink-0 items-center justify-center rounded-md',\n classNames?.mobileViewMoreButton\n )}\n aria-label={clickToView}\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"text-info-quaternary\"\n >\n <path\n d=\"M7.5 5L12.5 10L7.5 15\"\n stroke=\"currentColor\"\n strokeWidth=\"1.67\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n </div>\n\n {/* \u53F3\u6EDA\u52A8\u6309\u94AE - \u684C\u9762\u7AEF\u663E\u793A\uFF0C\u5C11\u4E8E5\u4E2A\u5546\u54C1\u65F6\u4E0D\u6E32\u67D3\uFF0C\u6EDA\u52A8\u5230\u7ED3\u5C3E\u65F6\u9690\u85CF\u4F46\u4FDD\u6301\u5360\u4F4D */}\n {items.length >= 5 && (\n <button\n onClick={() => scrollHorizontally('right')}\n className={cn(\n 'border-border laptop:flex hover:bg-muted-foreground/10 hidden w-[32px] shrink-0 items-center justify-center rounded-lg px-2 transition-colors',\n !canScrollRight &&\n 'laptop:bg-container-secondary-1 laptop:text-transparent laptop:pointer-events-none laptop:-my-1 laptop:-mr-1 laptop:py-1 laptop:pr-1 laptop:rounded-l-none',\n classNames?.expandButton,\n {\n 'laptop:bg-container-secondary-0': theme === 'dark',\n 'laptop:bg-container-primary': theme === 'dark' && !canScrollRight,\n }\n )}\n aria-label=\"Scroll right to see more items\"\n >\n <ArrowIcon className=\"laptop:size-4 size-5\" />\n </button>\n )}\n </div>\n )\n }\n\n // Check if cart has items\n const hasItems = !isEmpty && items.length > 0\n\n return (\n <div\n ref={ref}\n className={cn(\n 'bg-container-secondary-1 text-info-primary tablet:px-6 laptop:px-12 desktop:px-12 lg-desktop:px-[128px] laptop:py-[16px] flex w-full px-4 py-[12px]',\n // \u79FB\u52A8\u7AEF\u5782\u76F4\u5E03\u5C40\uFF0C\u5927\u5C4F\u5E55\u6C34\u5E73\u5E03\u5C40\n 'flex-col items-stretch gap-3',\n 'laptop:flex-row laptop:items-center laptop:justify-around',\n hasItems ? 'laptop:items-center laptop:gap-4' : 'laptop:items-center laptop:gap-4',\n 'tablet:gap-6 laptop:gap-8',\n className,\n classNames?.root,\n {\n 'aiui-dark bg-container-primary': theme === 'dark',\n }\n )}\n {...props}\n >\n {/* \u79FB\u52A8\u7AEF\uFF1A\u5782\u76F4\u6392\u5217 | \u684C\u9762\u7AEF\uFF1A\u6C34\u5E73\u4E09\u5217\u5E03\u5C40 */}\n <div\n className={cn(\n 'laptop:flex-row flex w-full flex-col gap-4',\n 'laptop:flex-1 laptop:items-center laptop:justify-between',\n 'tablet:gap-6 laptop:gap-8',\n classNames?.content\n )}\n >\n <div\n className={cn(\n 'relative flex shrink flex-row items-center gap-2',\n 'desktop:gap-4',\n progressConfig && 'laptop:pl-[104px] pl-[72px]'\n )}\n >\n {/* \u5DE6\u4FA7\u5706\u5F62\u8FDB\u5EA6\u6761 - \u53EA\u6709\u914D\u7F6E\u4E86\u624D\u663E\u793A */}\n {progressConfig && (\n <CircleProgress\n totalSteps={progressConfig.totalSteps}\n currentStep={progressConfig.currentStep}\n image={progressConfig.image}\n label={progressConfig.label}\n progressColor={progressConfig.progressColor}\n labelColor={progressConfig.labelColor}\n backgroundColor={progressConfig.backgroundColor}\n size={progressConfig.size}\n laptopSize={progressConfig.laptopSize}\n className={cn(\n 'absolute bottom-0 left-0',\n 'lg-desktop:bottom-auto lg-desktop:top-[-46px] desktop:bottom-auto desktop:top-[-52px]',\n classNames?.circleProgress\n )}\n />\n )}\n {/* Center: Cart info and dynamic content */}\n <div className=\"laptop:flex-1 flex w-full flex-col\">\n {/* Cart title area */}\n <div className={cn('tablet:gap-2 flex flex-col gap-1', classNames?.cartInfo)}>\n {hasItems ? (\n <div className=\"flex w-full items-center gap-2\">\n <Heading\n size={2}\n as=\"h3\"\n className={cn('', classNames?.cartTitle)}\n html={itemsInCart.replace('{count}', `<span class=\"text-brand-0\">${itemCount || 0}</span>`)}\n />\n\n {/* Click to view link / Toggle products */}\n <Heading\n size={1}\n as=\"h5\"\n onClick={() => {\n // \u79FB\u52A8\u7AEF\uFF1A\u5207\u6362\u4EA7\u54C1\u5C55\u5F00\u72B6\u6001\uFF0C\u684C\u9762\u7AEF\uFF1A\u8C03\u7528\u539F\u56DE\u8C03\n const isMobile = window.innerWidth < 1025\n if (isMobile) {\n setIsProductsExpanded(!isProductsExpanded)\n } else {\n onClickToView?.(cart)\n }\n }}\n className={cn('flex cursor-pointer items-center gap-1', classNames?.expandButton)}\n >\n {/* \u684C\u9762\u7AEF\u663E\u793A\u6587\u5B57 + \u56FE\u6807\uFF0C\u79FB\u52A8\u7AEF\u53EA\u663E\u793A\u56FE\u6807 */}\n <Text\n as=\"span\"\n size={1}\n className=\"desktop:block hidden text-nowrap text-[16px] \"\n html={clickToView}\n />\n <ArrowIcon\n className={cn(\n 'size-4 transition-transform',\n isProductsExpanded ? 'laptop:rotate-0 -rotate-90' : 'laptop:rotate-0 rotate-90'\n )}\n />\n </Heading>\n </div>\n ) : (\n <Heading\n as=\"h3\"\n size={2}\n className={cn('tablet:text-2xl text-xl font-semibold', classNames?.cartTitle)}\n html={emptyCart}\n />\n )}\n </div>\n\n {description && (\n <Text\n size={2}\n className={cn(\n 'mini-cart-description text-info-tertiary desktop:text-[16px] lg-desktop:text-[18px] text-[14px]',\n classNames?.cartDescription\n )}\n html={description}\n />\n )}\n </div>\n </div>\n\n {/* Items grid (\u79FB\u52A8\u7AEF\uFF1A\u6839\u636E\u5C55\u5F00\u72B6\u6001\u663E\u793A\uFF0C\u684C\u9762\u7AEF\uFF1A\u59CB\u7EC8\u663E\u793A) */}\n {hasItems && (\n <div className={cn('laptop:block laptop:shrink', isProductsExpanded ? 'block' : 'hidden')}>\n {renderItemsGrid(theme)}\n </div>\n )}\n {/* \u79FB\u52A8\u7AEF\uFF1A\u5206\u5272\u7EBF\uFF08\u53EA\u5728\u6709\u5546\u54C1\u65F6\u663E\u793A\uFF09 */}\n {hasItems && <hr className=\"laptop:hidden border-lines w-full border-t\" />}\n\n {/* Price and button area */}\n <div\n className={cn(\n 'tablet:gap-6 laptop:gap-4 laptop:justify-end flex flex-row items-stretch justify-between gap-4',\n classNames?.priceSection\n )}\n >\n {/* Price info */}\n <div className=\"flex flex-col items-end justify-center\">\n {/* Main price row */}\n <div className=\"flex items-center gap-2\">\n <Heading\n as=\"h6\"\n size={2}\n className={cn('whitespace-nowrap text-nowrap', classNames?.totalPrice)}\n html={total.replace('{total}', finalPrice)}\n />\n\n {/* Original price (if discounted) */}\n {originalPrice && (\n <Heading\n as=\"h6\"\n size={2}\n className={cn('text-info-tertiary whitespace-nowrap line-through', classNames?.originalPrice)}\n html={originalPrice}\n />\n )}\n </div>\n\n {/* Save amount */}\n {savingPrice && (\n <Heading\n size={2}\n as=\"h6\"\n className={cn(\n 'laptop:text-right text-marketing-1 w-full whitespace-nowrap text-nowrap text-left',\n classNames?.saveAmount\n )}\n html={savingText.replace('{amount}', savingPrice)}\n />\n )}\n </div>\n\n {/* Action button */}\n <Button\n disabled={!hasItems}\n loading={checkoutLoading}\n onClick={async () => {\n if (checkoutLoading) return\n setCheckoutLoading(true)\n try {\n await onCheckout?.(cart)\n } finally {\n setCheckoutLoading(false)\n }\n }}\n className={cn('whitespace-nowrap', classNames?.actionButton)}\n >\n {buyNowText}\n </Button>\n </div>\n </div>\n </div>\n )\n }\n)\n\nMiniCart.displayName = 'MiniCart'\nexport default MiniCart\n"],
5
+ "mappings": "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",
6
+ "names": ["MiniCart_exports", "__export", "MiniCart_default", "__toCommonJS", "import_jsx_runtime", "React", "import_helpers", "import_components", "import_CircleProgress", "MiniCart", "className", "classNames", "data", "cart", "progressConfig", "onRemoveItem", "onCheckout", "onClickToView", "props", "ref", "copy", "theme", "locale", "showMobileViewMore", "emptyCart", "description", "itemsInCart", "total", "totalWithCoupon", "clickToView", "buyNowText", "savingText", "items", "itemCount", "item", "isEmpty", "totalAmount", "subtotalAmount", "savingAmount", "finalPrice", "originalPrice", "savingPrice", "scrollContainerRef", "isProductsExpanded", "setIsProductsExpanded", "checkoutLoading", "setCheckoutLoading", "removingItemId", "setRemovingItemId", "handleRemoveItem", "id", "isDragging", "setIsDragging", "startX", "setStartX", "scrollLeft", "setScrollLeft", "canScrollLeft", "setCanScrollLeft", "canScrollRight", "setCanScrollRight", "updateScrollButtons", "container", "scrollWidth", "clientWidth", "handleScroll", "handleMouseDown", "e", "handleMouseMove", "walk", "handleMouseUp", "handleMouseLeave", "scrollHorizontally", "direction", "scrollAmount", "ArrowIcon", "DeleteIcon", "renderItemsGrid", "line", "safeImage", "imageUrl", "imageAlt", "isLoading", "hasItems", "CircleProgress"]
7
7
  }
@@ -0,0 +1,21 @@
1
+ import * as React from 'react';
2
+ import type { PriceData } from './types.js';
3
+ export interface SceneShelfFooterProps extends React.HTMLAttributes<HTMLDivElement> {
4
+ /** 总价标签 */
5
+ totalPriceLabel?: string;
6
+ /** 当前总价 */
7
+ totalCurrentPrice?: PriceData;
8
+ /** 原总价 */
9
+ totalOriginalPrice?: PriceData;
10
+ /** 添加到购物车按钮文本 */
11
+ addToCartButtonText?: string;
12
+ /** 立即购买按钮文本 */
13
+ shopNowButtonText?: string;
14
+ }
15
+ /**
16
+ * SceneShelf Footer 组件
17
+ *
18
+ * @description 底部区域,包含总价和按钮组
19
+ */
20
+ declare const SceneShelfFooter: React.ForwardRefExoticComponent<SceneShelfFooterProps & React.RefAttributes<HTMLDivElement>>;
21
+ export { SceneShelfFooter };
@@ -0,0 +1,2 @@
1
+ "use strict";"use client";var F=Object.create;var x=Object.defineProperty;var z=Object.getOwnPropertyDescriptor;var H=Object.getOwnPropertyNames;var M=Object.getPrototypeOf,R=Object.prototype.hasOwnProperty;var E=(t,e)=>{for(var o in e)x(t,o,{get:e[o],enumerable:!0})},h=(t,e,o,c)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of H(e))!R.call(t,n)&&n!==o&&x(t,n,{get:()=>e[n],enumerable:!(c=z(e,n))||c.enumerable});return t};var j=(t,e,o)=>(o=t!=null?F(M(t)):{},h(e||!t||!t.__esModule?x(o,"default",{value:t,enumerable:!0}):o,t)),q=t=>h(x({},"__esModule",{value:!0}),t);var G={};E(G,{SceneShelfFooter:()=>m});module.exports=q(G);var r=require("react/jsx-runtime"),u=j(require("react")),i=require("../../helpers/index.js"),s=require("../../components/index.js"),N=require("./context.js");const m=u.forwardRef(({totalPriceLabel:t,totalCurrentPrice:e,totalOriginalPrice:o,addToCartButtonText:c,shopNowButtonText:n,className:w,...C},S)=>{const a=(0,N.useSceneShelfContext)(),T=t??a?.totalPriceLabel??"Total Price:",d=e??a?.totalCurrentPrice,f=o??a?.totalOriginalPrice,y=c??a?.addToCartButtonText??"Add to Cart",v=n??a?.shopNowButtonText??"Shop Now",p=a?.selectedProducts??[],b=a?.onAddToCart,B=a?.onShopNow,L=a?.showOriginalPrice??!0,l=a?.classNames,[A,g]=u.useState(!1),[O,P]=u.useState(!1),k=async()=>{g(!0);try{await b?.(p)}finally{g(!1)}},D=async()=>{P(!0);try{await B?.(p)}finally{P(!1)}};return(0,r.jsxs)("div",{ref:S,className:(0,i.cn)("tablet:items-end tablet:flex-row flex flex-col items-start justify-between gap-4",w,l?.footer),...C,children:[(0,r.jsxs)("div",{className:(0,i.cn)("flex flex-wrap items-center gap-1",l?.totalPrice),children:[T&&(0,r.jsx)(s.Text,{as:"span",size:2,className:"text-info-primary lg-desktop:text-[24px] text-[20px]",children:T}),d&&(0,r.jsx)(s.Text,{as:"span",size:2,className:(0,i.cn)("text-info-primary lg-desktop:text-[24px] text-[20px]",l?.currentTotalPrice),children:d.formatted}),L&&f&&d&&f.value>d.value&&(0,r.jsx)(s.Text,{as:"span",size:2,className:(0,i.cn)("text-info-quaternary lg-desktop:text-[24px] text-[20px] line-through",l?.originalTotalPrice),children:f.formatted})]}),(0,r.jsxs)("div",{className:(0,i.cn)("flex gap-3",l?.buttonGroup),children:[(0,r.jsx)(s.Button,{variant:"secondary",onClick:k,disabled:p.length===0,loading:A,children:y}),(0,r.jsx)(s.Button,{variant:"primary",onClick:D,disabled:p.length===0,loading:O,children:v})]})]})});m.displayName="SceneShelf.Footer";
2
+ //# sourceMappingURL=Footer.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/biz-components/SceneShelf/Footer.tsx"],
4
+ "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { cn } from '../../helpers/index.js'\nimport { Button, Text } from '../../components/index.js'\nimport { useSceneShelfContext } from './context.js'\nimport type { PriceData } from './types.js'\n\nexport interface SceneShelfFooterProps extends React.HTMLAttributes<HTMLDivElement> {\n /** \u603B\u4EF7\u6807\u7B7E */\n totalPriceLabel?: string\n /** \u5F53\u524D\u603B\u4EF7 */\n totalCurrentPrice?: PriceData\n /** \u539F\u603B\u4EF7 */\n totalOriginalPrice?: PriceData\n /** \u6DFB\u52A0\u5230\u8D2D\u7269\u8F66\u6309\u94AE\u6587\u672C */\n addToCartButtonText?: string\n /** \u7ACB\u5373\u8D2D\u4E70\u6309\u94AE\u6587\u672C */\n shopNowButtonText?: string\n}\n\n/**\n * SceneShelf Footer \u7EC4\u4EF6\n *\n * @description \u5E95\u90E8\u533A\u57DF\uFF0C\u5305\u542B\u603B\u4EF7\u548C\u6309\u94AE\u7EC4\n */\nconst SceneShelfFooter = React.forwardRef<HTMLDivElement, SceneShelfFooterProps>(\n (\n {\n totalPriceLabel: totalPriceLabelProp,\n totalCurrentPrice: totalCurrentPriceProp,\n totalOriginalPrice: totalOriginalPriceProp,\n addToCartButtonText: addToCartButtonTextProp,\n shopNowButtonText: shopNowButtonTextProp,\n className,\n ...props\n },\n ref\n ) => {\n const context = useSceneShelfContext()\n\n // Props \u4F18\u5148\u7EA7\u9AD8\u4E8E Context\n const totalPriceLabel = totalPriceLabelProp ?? context?.totalPriceLabel ?? 'Total Price:'\n const totalCurrentPrice = totalCurrentPriceProp ?? context?.totalCurrentPrice\n const totalOriginalPrice = totalOriginalPriceProp ?? context?.totalOriginalPrice\n const addToCartButtonText = addToCartButtonTextProp ?? context?.addToCartButtonText ?? 'Add to Cart'\n const shopNowButtonText = shopNowButtonTextProp ?? context?.shopNowButtonText ?? 'Shop Now'\n\n const selectedProducts = context?.selectedProducts ?? []\n const onAddToCart = context?.onAddToCart\n const onShopNow = context?.onShopNow\n const showOriginalPrice = context?.showOriginalPrice ?? true\n const classNames = context?.classNames\n\n // \u6309\u94AE loading \u72B6\u6001\n const [addToCartLoading, setAddToCartLoading] = React.useState(false)\n const [shopNowLoading, setShopNowLoading] = React.useState(false)\n\n // \u5904\u7406\u6DFB\u52A0\u5230\u8D2D\u7269\u8F66\n const handleAddToCart = async () => {\n setAddToCartLoading(true)\n try {\n await onAddToCart?.(selectedProducts)\n } finally {\n setAddToCartLoading(false)\n }\n }\n\n // \u5904\u7406\u7ACB\u5373\u8D2D\u4E70\n const handleShopNow = async () => {\n setShopNowLoading(true)\n try {\n await onShopNow?.(selectedProducts)\n } finally {\n setShopNowLoading(false)\n }\n }\n\n return (\n <div\n ref={ref}\n className={cn(\n 'tablet:items-end tablet:flex-row flex flex-col items-start justify-between gap-4',\n className,\n classNames?.footer\n )}\n {...props}\n >\n {/* \u603B\u4EF7 */}\n <div className={cn('flex flex-wrap items-center gap-1', classNames?.totalPrice)}>\n {totalPriceLabel && (\n <Text as=\"span\" size={2} className=\"text-info-primary lg-desktop:text-[24px] text-[20px]\">\n {totalPriceLabel}\n </Text>\n )}\n {totalCurrentPrice && (\n <Text\n as=\"span\"\n size={2}\n className={cn('text-info-primary lg-desktop:text-[24px] text-[20px]', classNames?.currentTotalPrice)}\n >\n {totalCurrentPrice.formatted}\n </Text>\n )}\n {showOriginalPrice &&\n totalOriginalPrice &&\n totalCurrentPrice &&\n totalOriginalPrice.value > totalCurrentPrice.value && (\n <Text\n as=\"span\"\n size={2}\n className={cn(\n 'text-info-quaternary lg-desktop:text-[24px] text-[20px] line-through',\n classNames?.originalTotalPrice\n )}\n >\n {totalOriginalPrice.formatted}\n </Text>\n )}\n </div>\n\n {/* \u6309\u94AE\u7EC4 */}\n <div className={cn('flex gap-3', classNames?.buttonGroup)}>\n <Button\n variant=\"secondary\"\n onClick={handleAddToCart}\n disabled={selectedProducts.length === 0}\n loading={addToCartLoading}\n >\n {addToCartButtonText}\n </Button>\n <Button\n variant=\"primary\"\n onClick={handleShopNow}\n disabled={selectedProducts.length === 0}\n loading={shopNowLoading}\n >\n {shopNowButtonText}\n </Button>\n </div>\n </div>\n )\n }\n)\n\nSceneShelfFooter.displayName = 'SceneShelf.Footer'\n\nexport { SceneShelfFooter }\n"],
5
+ "mappings": "ukBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,sBAAAE,IAAA,eAAAC,EAAAH,GAyFQ,IAAAI,EAAA,6BAvFRC,EAAuB,oBACvBC,EAAmB,kCACnBC,EAA6B,qCAC7BC,EAAqC,wBAqBrC,MAAMN,EAAmBG,EAAM,WAC7B,CACE,CACE,gBAAiBI,EACjB,kBAAmBC,EACnB,mBAAoBC,EACpB,oBAAqBC,EACrB,kBAAmBC,EACnB,UAAAC,EACA,GAAGC,CACL,EACAC,IACG,CACH,MAAMC,KAAU,wBAAqB,EAG/BC,EAAkBT,GAAuBQ,GAAS,iBAAmB,eACrEE,EAAoBT,GAAyBO,GAAS,kBACtDG,EAAqBT,GAA0BM,GAAS,mBACxDI,EAAsBT,GAA2BK,GAAS,qBAAuB,cACjFK,EAAoBT,GAAyBI,GAAS,mBAAqB,WAE3EM,EAAmBN,GAAS,kBAAoB,CAAC,EACjDO,EAAcP,GAAS,YACvBQ,EAAYR,GAAS,UACrBS,EAAoBT,GAAS,mBAAqB,GAClDU,EAAaV,GAAS,WAGtB,CAACW,EAAkBC,CAAmB,EAAIxB,EAAM,SAAS,EAAK,EAC9D,CAACyB,EAAgBC,CAAiB,EAAI1B,EAAM,SAAS,EAAK,EAG1D2B,EAAkB,SAAY,CAClCH,EAAoB,EAAI,EACxB,GAAI,CACF,MAAML,IAAcD,CAAgB,CACtC,QAAE,CACAM,EAAoB,EAAK,CAC3B,CACF,EAGMI,EAAgB,SAAY,CAChCF,EAAkB,EAAI,EACtB,GAAI,CACF,MAAMN,IAAYF,CAAgB,CACpC,QAAE,CACAQ,EAAkB,EAAK,CACzB,CACF,EAEA,SACE,QAAC,OACC,IAAKf,EACL,aAAW,MACT,mFACAF,EACAa,GAAY,MACd,EACC,GAAGZ,EAGJ,qBAAC,OAAI,aAAW,MAAG,oCAAqCY,GAAY,UAAU,EAC3E,UAAAT,MACC,OAAC,QAAK,GAAG,OAAO,KAAM,EAAG,UAAU,uDAChC,SAAAA,EACH,EAEDC,MACC,OAAC,QACC,GAAG,OACH,KAAM,EACN,aAAW,MAAG,uDAAwDQ,GAAY,iBAAiB,EAElG,SAAAR,EAAkB,UACrB,EAEDO,GACCN,GACAD,GACAC,EAAmB,MAAQD,EAAkB,UAC3C,OAAC,QACC,GAAG,OACH,KAAM,EACN,aAAW,MACT,uEACAQ,GAAY,kBACd,EAEC,SAAAP,EAAmB,UACtB,GAEN,KAGA,QAAC,OAAI,aAAW,MAAG,aAAcO,GAAY,WAAW,EACtD,oBAAC,UACC,QAAQ,YACR,QAASK,EACT,SAAUT,EAAiB,SAAW,EACtC,QAASK,EAER,SAAAP,EACH,KACA,OAAC,UACC,QAAQ,UACR,QAASY,EACT,SAAUV,EAAiB,SAAW,EACtC,QAASO,EAER,SAAAR,EACH,GACF,GACF,CAEJ,CACF,EAEApB,EAAiB,YAAc",
6
+ "names": ["Footer_exports", "__export", "SceneShelfFooter", "__toCommonJS", "import_jsx_runtime", "React", "import_helpers", "import_components", "import_context", "totalPriceLabelProp", "totalCurrentPriceProp", "totalOriginalPriceProp", "addToCartButtonTextProp", "shopNowButtonTextProp", "className", "props", "ref", "context", "totalPriceLabel", "totalCurrentPrice", "totalOriginalPrice", "addToCartButtonText", "shopNowButtonText", "selectedProducts", "onAddToCart", "onShopNow", "showOriginalPrice", "classNames", "addToCartLoading", "setAddToCartLoading", "shopNowLoading", "setShopNowLoading", "handleAddToCart", "handleShopNow"]
7
+ }
@@ -0,0 +1,23 @@
1
+ import * as React from 'react';
2
+ import type { SceneProductCardSemanticName, SceneProductCardData } from './types.js';
3
+ export interface SceneProductCardProps extends React.HTMLAttributes<HTMLDivElement> {
4
+ /** 产品数据 */
5
+ product: SceneProductCardData;
6
+ /** 是否选中 */
7
+ selected?: boolean;
8
+ /** 选中状态变化回调 */
9
+ onSelectChange?: (selected: boolean, product: SceneProductCardData) => void;
10
+ /** 是否显示标签 */
11
+ showTags?: boolean;
12
+ /** 是否显示原价 */
13
+ showOriginalPrice?: boolean;
14
+ /** 语义化类名 */
15
+ classNames?: Partial<Record<SceneProductCardSemanticName, string>>;
16
+ }
17
+ /**
18
+ * SceneProductCard - 场景推荐货架产品卡片
19
+ *
20
+ * @description 用于场景推荐货架的可选中产品卡片组件
21
+ */
22
+ declare const SceneProductCard: React.ForwardRefExoticComponent<SceneProductCardProps & React.RefAttributes<HTMLDivElement>>;
23
+ export { SceneProductCard };
@@ -0,0 +1,2 @@
1
+ "use strict";"use client";var T=Object.create;var g=Object.defineProperty;var z=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames;var O=Object.getPrototypeOf,H=Object.prototype.hasOwnProperty;var R=(a,t)=>{for(var e in t)g(a,e,{get:t[e],enumerable:!0})},h=(a,t,e,d)=>{if(t&&typeof t=="object"||typeof t=="function")for(let l of D(t))!H.call(a,l)&&l!==e&&g(a,l,{get:()=>t[l],enumerable:!(d=z(t,l))||d.enumerable});return a};var L=(a,t,e)=>(e=a!=null?T(O(a)):{},h(t||!a||!a.__esModule?g(e,"default",{value:a,enumerable:!0}):e,a)),M=a=>h(g({},"__esModule",{value:!0}),a);var q={};R(q,{SceneProductCard:()=>x});module.exports=M(q);var s=require("react/jsx-runtime"),j=L(require("react")),r=require("../../helpers/index.js"),o=require("../../components/index.js"),b=require("./context.js");const x=j.forwardRef(({className:a,classNames:t,product:e,selected:d,onSelectChange:l,showTags:P,showOriginalPrice:C,...u},k)=>{const c=(0,b.useSceneShelfContext)(),S=P??c?.showTags??!0,N=C??c?.showOriginalPrice??!0,i=t??c?.classNames??{},m=d??(c?c.selectedIds.has(e.id):!1),f=l??c?.onSelectChange,p=e.soldOut??!1,v=n=>{p||typeof n=="boolean"&&f?.(n,e)},w=()=>{p||f?.(!m,e)};return(0,s.jsxs)("div",{ref:k,className:(0,r.cn)("lg-desktop:gap-2 lg-desktop:h-[362px] lg-desktop:px-6 lg-desktop:pb-6 lg-desktop:pt-4 rounded-box box-border flex h-[284px] flex-col gap-2 border-2 border-solid p-4 pb-6 transition-colors",p?"cursor-not-allowed opacity-50":"cursor-pointer",m?(0,r.cn)("border-brand-0 bg-container-secondary-0",i?.cardSelected):(0,r.cn)("border-lines bg-container-primary",i?.card),a),onClick:w,...u,children:[(0,s.jsx)("div",{className:(0,r.cn)("lg-desktop:left-6 lg-desktop:top-6 absolute left-4 top-4 flex flex-wrap gap-1 pr-9",i?.tags),children:S&&e.tags?.map((n,y)=>(0,s.jsx)(o.Badge,{variant:n.variant||"outline",size:"sm",children:n.label},y))}),(0,s.jsx)(o.Checkbox,{checked:m,disabled:p,onCheckedChange:v,onClick:n=>n.stopPropagation(),className:(0,r.cn)("text-brand-0 border-brand-0 lg-desktop:right-6 lg-desktop:top-6 absolute right-4 top-4 size-5 shrink-0",i?.checkbox)}),(0,s.jsx)("div",{className:(0,r.cn)("flex flex-1 items-center justify-center",i?.image),children:(0,s.jsx)(o.Picture,{source:e.imageUrl,alt:e.imageAlt||e.title,className:"lg-desktop:size-[175px] aspect-square size-[124px] ",imgClassName:"object-contain"})}),(0,s.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,s.jsx)(o.Heading,{as:"h3",size:2,className:(0,r.cn)("text-info-primary line-clamp-2",i?.title),html:e.title}),(0,s.jsxs)("div",{className:(0,r.cn)("flex flex-wrap items-center gap-1",i?.priceWrapper),children:[(0,s.jsx)(o.Text,{as:"span",size:2,className:(0,r.cn)("text-info-primary lg-desktop:text-[24px] text-[20px]",i?.currentPrice),children:e.currentPrice.formatted}),N&&e.originalPrice&&e.originalPrice.value>e.currentPrice.value&&(0,s.jsx)(o.Text,{as:"span",size:2,className:(0,r.cn)("text-info-quaternary lg-desktop:text-[24px] text-[20px] line-through",i?.originalPrice),children:e.originalPrice.formatted})]})]})]})});x.displayName="SceneShelf.ProductCard";
2
+ //# sourceMappingURL=ProductCard.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/biz-components/SceneShelf/ProductCard.tsx"],
4
+ "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { cn } from '../../helpers/index.js'\nimport { Checkbox, Badge, Heading, Text, Picture } from '../../components/index.js'\nimport { useSceneShelfContext } from './context.js'\nimport type { SceneProductCardSemanticName, SceneProductCardData } from './types.js'\n\nexport interface SceneProductCardProps extends React.HTMLAttributes<HTMLDivElement> {\n /** \u4EA7\u54C1\u6570\u636E */\n product: SceneProductCardData\n /** \u662F\u5426\u9009\u4E2D */\n selected?: boolean\n /** \u9009\u4E2D\u72B6\u6001\u53D8\u5316\u56DE\u8C03 */\n onSelectChange?: (selected: boolean, product: SceneProductCardData) => void\n /** \u662F\u5426\u663E\u793A\u6807\u7B7E */\n showTags?: boolean\n /** \u662F\u5426\u663E\u793A\u539F\u4EF7 */\n showOriginalPrice?: boolean\n /** \u8BED\u4E49\u5316\u7C7B\u540D */\n classNames?: Partial<Record<SceneProductCardSemanticName, string>>\n}\n\n/**\n * SceneProductCard - \u573A\u666F\u63A8\u8350\u8D27\u67B6\u4EA7\u54C1\u5361\u7247\n *\n * @description \u7528\u4E8E\u573A\u666F\u63A8\u8350\u8D27\u67B6\u7684\u53EF\u9009\u4E2D\u4EA7\u54C1\u5361\u7247\u7EC4\u4EF6\n */\nconst SceneProductCard = React.forwardRef<HTMLDivElement, SceneProductCardProps>(\n (\n {\n className,\n classNames: classNamesProp,\n product,\n selected: selectedProp,\n onSelectChange: onSelectChangeProp,\n showTags: showTagsProp,\n showOriginalPrice: showOriginalPriceProp,\n ...props\n },\n ref\n ) => {\n // \u4ECE Context \u8BFB\u53D6\u914D\u7F6E\n const context = useSceneShelfContext()\n\n // Props \u4F18\u5148\u7EA7\u9AD8\u4E8E Context\n const showTags = showTagsProp ?? context?.showTags ?? true\n const showOriginalPrice = showOriginalPriceProp ?? context?.showOriginalPrice ?? true\n const classNames = classNamesProp ?? context?.classNames ?? {}\n\n // \u9009\u4E2D\u72B6\u6001\u548C\u56DE\u8C03\u4ECE Context \u83B7\u53D6\n const selected = selectedProp ?? (context ? context.selectedIds.has(product.id) : false)\n const onSelectChange = onSelectChangeProp ?? context?.onSelectChange\n const disabled = product.soldOut ?? false\n\n const handleCheckboxChange = (checked: boolean | 'indeterminate') => {\n if (disabled) return\n if (typeof checked === 'boolean') {\n onSelectChange?.(checked, product)\n }\n }\n\n const handleCardClick = () => {\n if (disabled) return\n onSelectChange?.(!selected, product)\n }\n\n return (\n <div\n ref={ref}\n className={cn(\n 'lg-desktop:gap-2 lg-desktop:h-[362px] lg-desktop:px-6 lg-desktop:pb-6 lg-desktop:pt-4 rounded-box box-border flex h-[284px] flex-col gap-2 border-2 border-solid p-4 pb-6 transition-colors',\n disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer',\n selected\n ? cn('border-brand-0 bg-container-secondary-0', classNames?.cardSelected)\n : cn('border-lines bg-container-primary', classNames?.card),\n className\n )}\n onClick={handleCardClick}\n {...props}\n >\n {/* \u6807\u7B7E\u533A\u57DF */}\n <div\n className={cn(\n 'lg-desktop:left-6 lg-desktop:top-6 absolute left-4 top-4 flex flex-wrap gap-1 pr-9',\n classNames?.tags\n )}\n >\n {showTags &&\n product.tags?.map((tag, index) => (\n <Badge key={index} variant={tag.variant || 'outline'} size=\"sm\">\n {tag.label}\n </Badge>\n ))}\n </div>\n\n {/* Checkbox */}\n <Checkbox\n checked={selected}\n disabled={disabled}\n onCheckedChange={handleCheckboxChange}\n onClick={e => e.stopPropagation()}\n className={cn(\n 'text-brand-0 border-brand-0 lg-desktop:right-6 lg-desktop:top-6 absolute right-4 top-4 size-5 shrink-0',\n classNames?.checkbox\n )}\n />\n\n {/* \u4EA7\u54C1\u56FE\u7247 */}\n <div className={cn('flex flex-1 items-center justify-center', classNames?.image)}>\n <Picture\n source={product.imageUrl}\n alt={product.imageAlt || product.title}\n className=\"lg-desktop:size-[175px] aspect-square size-[124px] \"\n imgClassName=\"object-contain\"\n />\n </div>\n\n {/* \u4EA7\u54C1\u4FE1\u606F */}\n <div className=\"flex flex-col gap-4\">\n {/* \u4EA7\u54C1\u540D\u79F0 */}\n <Heading\n as=\"h3\"\n size={2}\n className={cn('text-info-primary line-clamp-2', classNames?.title)}\n html={product.title}\n />\n\n {/* \u4EF7\u683C\u533A\u57DF */}\n <div className={cn('flex flex-wrap items-center gap-1', classNames?.priceWrapper)}>\n <Text\n as=\"span\"\n size={2}\n className={cn('text-info-primary lg-desktop:text-[24px] text-[20px]', classNames?.currentPrice)}\n >\n {product.currentPrice.formatted}\n </Text>\n {showOriginalPrice && product.originalPrice && product.originalPrice.value > product.currentPrice.value && (\n <Text\n as=\"span\"\n size={2}\n className={cn(\n 'text-info-quaternary lg-desktop:text-[24px] text-[20px] line-through',\n classNames?.originalPrice\n )}\n >\n {product.originalPrice.formatted}\n </Text>\n )}\n </div>\n </div>\n </div>\n )\n }\n)\n\nSceneProductCard.displayName = 'SceneShelf.ProductCard'\n\nexport { SceneProductCard }\n"],
5
+ "mappings": "ukBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,sBAAAE,IAAA,eAAAC,EAAAH,GA0Fc,IAAAI,EAAA,6BAxFdC,EAAuB,oBACvBC,EAAmB,kCACnBC,EAAwD,qCACxDC,EAAqC,wBAuBrC,MAAMN,EAAmBG,EAAM,WAC7B,CACE,CACE,UAAAI,EACA,WAAYC,EACZ,QAAAC,EACA,SAAUC,EACV,eAAgBC,EAChB,SAAUC,EACV,kBAAmBC,EACnB,GAAGC,CACL,EACAC,IACG,CAEH,MAAMC,KAAU,wBAAqB,EAG/BC,EAAWL,GAAgBI,GAAS,UAAY,GAChDE,EAAoBL,GAAyBG,GAAS,mBAAqB,GAC3EG,EAAaX,GAAkBQ,GAAS,YAAc,CAAC,EAGvDI,EAAWV,IAAiBM,EAAUA,EAAQ,YAAY,IAAIP,EAAQ,EAAE,EAAI,IAC5EY,EAAiBV,GAAsBK,GAAS,eAChDM,EAAWb,EAAQ,SAAW,GAE9Bc,EAAwBC,GAAuC,CAC/DF,GACA,OAAOE,GAAY,WACrBH,IAAiBG,EAASf,CAAO,CAErC,EAEMgB,EAAkB,IAAM,CACxBH,GACJD,IAAiB,CAACD,EAAUX,CAAO,CACrC,EAEA,SACE,QAAC,OACC,IAAKM,EACL,aAAW,MACT,8LACAO,EAAW,gCAAkC,iBAC7CF,KACI,MAAG,0CAA2CD,GAAY,YAAY,KACtE,MAAG,oCAAqCA,GAAY,IAAI,EAC5DZ,CACF,EACA,QAASkB,EACR,GAAGX,EAGJ,oBAAC,OACC,aAAW,MACT,qFACAK,GAAY,IACd,EAEC,SAAAF,GACCR,EAAQ,MAAM,IAAI,CAACiB,EAAKC,OACtB,OAAC,SAAkB,QAASD,EAAI,SAAW,UAAW,KAAK,KACxD,SAAAA,EAAI,OADKC,CAEZ,CACD,EACL,KAGA,OAAC,YACC,QAASP,EACT,SAAUE,EACV,gBAAiBC,EACjB,QAASK,GAAKA,EAAE,gBAAgB,EAChC,aAAW,MACT,yGACAT,GAAY,QACd,EACF,KAGA,OAAC,OAAI,aAAW,MAAG,0CAA2CA,GAAY,KAAK,EAC7E,mBAAC,WACC,OAAQV,EAAQ,SAChB,IAAKA,EAAQ,UAAYA,EAAQ,MACjC,UAAU,sDACV,aAAa,iBACf,EACF,KAGA,QAAC,OAAI,UAAU,sBAEb,oBAAC,WACC,GAAG,KACH,KAAM,EACN,aAAW,MAAG,iCAAkCU,GAAY,KAAK,EACjE,KAAMV,EAAQ,MAChB,KAGA,QAAC,OAAI,aAAW,MAAG,oCAAqCU,GAAY,YAAY,EAC9E,oBAAC,QACC,GAAG,OACH,KAAM,EACN,aAAW,MAAG,uDAAwDA,GAAY,YAAY,EAE7F,SAAAV,EAAQ,aAAa,UACxB,EACCS,GAAqBT,EAAQ,eAAiBA,EAAQ,cAAc,MAAQA,EAAQ,aAAa,UAChG,OAAC,QACC,GAAG,OACH,KAAM,EACN,aAAW,MACT,uEACAU,GAAY,aACd,EAEC,SAAAV,EAAQ,cAAc,UACzB,GAEJ,GACF,GACF,CAEJ,CACF,EAEAT,EAAiB,YAAc",
6
+ "names": ["ProductCard_exports", "__export", "SceneProductCard", "__toCommonJS", "import_jsx_runtime", "React", "import_helpers", "import_components", "import_context", "className", "classNamesProp", "product", "selectedProp", "onSelectChangeProp", "showTagsProp", "showOriginalPriceProp", "props", "ref", "context", "showTags", "showOriginalPrice", "classNames", "selected", "onSelectChange", "disabled", "handleCheckboxChange", "checked", "handleCardClick", "tag", "index", "e"]
7
+ }
@@ -0,0 +1,26 @@
1
+ import * as React from 'react';
2
+ import type { PriceData } from './types.js';
3
+ import 'swiper/css';
4
+ export interface SceneShelfProductsPanelProps extends React.HTMLAttributes<HTMLDivElement> {
5
+ /** 标题 */
6
+ title?: string;
7
+ /** 总价标签 */
8
+ totalPriceLabel?: string;
9
+ /** 当前总价 */
10
+ totalCurrentPrice?: PriceData;
11
+ /** 原总价 */
12
+ totalOriginalPrice?: PriceData;
13
+ /** 添加到购物车按钮文本 */
14
+ addToCartButtonText?: string;
15
+ /** 立即购买按钮文本 */
16
+ shopNowButtonText?: string;
17
+ /** 子组件(ProductCard 或自定义卡片) */
18
+ children: React.ReactNode;
19
+ }
20
+ /**
21
+ * SceneShelf ProductsPanel 组件
22
+ *
23
+ * @description 产品面板组件,包含产品列表(Swiper)和底部操作区域(总价 + 按钮)
24
+ */
25
+ declare const SceneShelfProductsPanel: React.ForwardRefExoticComponent<SceneShelfProductsPanelProps & React.RefAttributes<HTMLDivElement>>;
26
+ export { SceneShelfProductsPanel };
@@ -0,0 +1,2 @@
1
+ "use strict";"use client";var F=Object.create;var x=Object.defineProperty;var G=Object.getOwnPropertyDescriptor;var V=Object.getOwnPropertyNames;var I=Object.getPrototypeOf,J=Object.prototype.hasOwnProperty;var K=(e,o)=>{for(var a in o)x(e,a,{get:o[a],enumerable:!0})},N=(e,o,a,c)=>{if(o&&typeof o=="object"||typeof o=="function")for(let l of V(o))!J.call(e,l)&&l!==a&&x(e,l,{get:()=>o[l],enumerable:!(c=G(o,l))||c.enumerable});return e};var Q=(e,o,a)=>(a=e!=null?F(I(e)):{},N(o||!e||!e.__esModule?x(a,"default",{value:e,enumerable:!0}):a,e)),U=e=>N(x({},"__esModule",{value:!0}),e);var W={};K(W,{SceneShelfProductsPanel:()=>P});module.exports=U(W);var t=require("react/jsx-runtime"),m=Q(require("react")),f=require("swiper/react"),u=require("swiper/modules"),i=require("../../helpers/index.js"),s=require("../../components/index.js"),S=require("./context.js"),Y=require("swiper/css");const P=m.forwardRef(({title:e,totalPriceLabel:o,totalCurrentPrice:a,totalOriginalPrice:c,addToCartButtonText:l,shopNowButtonText:y,className:C,children:b,...v},B)=>{const r=(0,S.useSceneShelfContext)(),n=r?.classNames,w=o??r?.totalPriceLabel??"Total Price:",d=a??r?.totalCurrentPrice,h=c??r?.totalOriginalPrice,k=l??r?.addToCartButtonText??"Add to Cart",L=y??r?.shopNowButtonText??"Shop Now",p=r?.selectedProducts??[],A=r?.onAddToCart,M=r?.onShopNow,O=r?.showOriginalPrice??!0,[D,g]=m.useState(!1),[R,T]=m.useState(!1),z=m.Children.toArray(b),H=async()=>{g(!0);try{await A?.(p)}finally{g(!1)}},j=async()=>{T(!0);try{await M?.(p)}finally{T(!1)}};return(0,t.jsxs)("div",{ref:B,className:(0,i.cn)("bg-container-primary laptop:p-6 lg-desktop:p-8 flex min-w-0 flex-1 flex-col justify-between overflow-hidden p-4",C,n?.content),...v,children:[e&&(0,t.jsx)(s.Heading,{as:"h2",size:3,className:(0,i.cn)("text-info-primary flex-0 mb-[16px] line-clamp-1 shrink-0",n?.title),html:e}),(0,t.jsx)("div",{className:(0,i.cn)("lg-desktop:mb-[24px] mb-[16px] flex-1 ",n?.productList),children:(0,t.jsx)(f.Swiper,{modules:[u.FreeMode,u.Mousewheel],freeMode:!0,mousewheel:{forceToAxis:!0},slidesPerView:"auto",spaceBetween:10,breakpoints:{768:{spaceBetween:16}},children:z.map((E,q)=>(0,t.jsx)(f.SwiperSlide,{className:"lg-desktop:!w-[342px] h-fit !w-[248px] shrink-0",children:E},q))})}),(0,t.jsxs)("div",{className:(0,i.cn)("tablet:items-end tablet:flex-row flex-0 flex flex-col items-start justify-between gap-2",n?.footer),children:[(0,t.jsxs)("div",{className:(0,i.cn)("flex flex-wrap items-center gap-1",n?.totalPrice),children:[w&&(0,t.jsx)(s.Text,{as:"span",size:2,className:"text-info-primary lg-desktop:text-[24px] text-[20px]",children:w}),d&&(0,t.jsx)(s.Text,{as:"span",size:2,className:(0,i.cn)("text-info-primary lg-desktop:text-[24px] text-[20px]",n?.currentTotalPrice),children:d.formatted}),O&&h&&d&&h.value>d.value&&(0,t.jsx)(s.Text,{as:"span",size:2,className:(0,i.cn)("text-info-quaternary lg-desktop:text-[24px] text-[20px] line-through",n?.originalTotalPrice),children:h.formatted})]}),(0,t.jsxs)("div",{className:(0,i.cn)("flex gap-3",n?.buttonGroup),children:[(0,t.jsx)(s.Button,{variant:"secondary",onClick:H,disabled:p.length===0,loading:D,children:k}),(0,t.jsx)(s.Button,{variant:"primary",onClick:j,disabled:p.length===0,loading:R,children:L})]})]})]})});P.displayName="SceneShelf.ProductsPanel";
2
+ //# sourceMappingURL=ProductsPanel.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/biz-components/SceneShelf/ProductsPanel.tsx"],
4
+ "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { Swiper, SwiperSlide } from 'swiper/react'\nimport { FreeMode, Mousewheel } from 'swiper/modules'\nimport { cn } from '../../helpers/index.js'\nimport { Heading, Button, Text } from '../../components/index.js'\nimport { useSceneShelfContext } from './context.js'\nimport type { PriceData } from './types.js'\nimport 'swiper/css'\n\nexport interface SceneShelfProductsPanelProps extends React.HTMLAttributes<HTMLDivElement> {\n /** \u6807\u9898 */\n title?: string\n /** \u603B\u4EF7\u6807\u7B7E */\n totalPriceLabel?: string\n /** \u5F53\u524D\u603B\u4EF7 */\n totalCurrentPrice?: PriceData\n /** \u539F\u603B\u4EF7 */\n totalOriginalPrice?: PriceData\n /** \u6DFB\u52A0\u5230\u8D2D\u7269\u8F66\u6309\u94AE\u6587\u672C */\n addToCartButtonText?: string\n /** \u7ACB\u5373\u8D2D\u4E70\u6309\u94AE\u6587\u672C */\n shopNowButtonText?: string\n /** \u5B50\u7EC4\u4EF6\uFF08ProductCard \u6216\u81EA\u5B9A\u4E49\u5361\u7247\uFF09 */\n children: React.ReactNode\n}\n\n/**\n * SceneShelf ProductsPanel \u7EC4\u4EF6\n *\n * @description \u4EA7\u54C1\u9762\u677F\u7EC4\u4EF6\uFF0C\u5305\u542B\u4EA7\u54C1\u5217\u8868\uFF08Swiper\uFF09\u548C\u5E95\u90E8\u64CD\u4F5C\u533A\u57DF\uFF08\u603B\u4EF7 + \u6309\u94AE\uFF09\n */\nconst SceneShelfProductsPanel = React.forwardRef<HTMLDivElement, SceneShelfProductsPanelProps>(\n (\n {\n title,\n totalPriceLabel: totalPriceLabelProp,\n totalCurrentPrice: totalCurrentPriceProp,\n totalOriginalPrice: totalOriginalPriceProp,\n addToCartButtonText: addToCartButtonTextProp,\n shopNowButtonText: shopNowButtonTextProp,\n className,\n children,\n ...props\n },\n ref\n ) => {\n const context = useSceneShelfContext()\n const classNames = context?.classNames\n\n // Props \u4F18\u5148\u7EA7\u9AD8\u4E8E Context\n const totalPriceLabel = totalPriceLabelProp ?? context?.totalPriceLabel ?? 'Total Price:'\n const totalCurrentPrice = totalCurrentPriceProp ?? context?.totalCurrentPrice\n const totalOriginalPrice = totalOriginalPriceProp ?? context?.totalOriginalPrice\n const addToCartButtonText = addToCartButtonTextProp ?? context?.addToCartButtonText ?? 'Add to Cart'\n const shopNowButtonText = shopNowButtonTextProp ?? context?.shopNowButtonText ?? 'Shop Now'\n\n const selectedProducts = context?.selectedProducts ?? []\n const onAddToCart = context?.onAddToCart\n const onShopNow = context?.onShopNow\n const showOriginalPrice = context?.showOriginalPrice ?? true\n\n // \u6309\u94AE loading \u72B6\u6001\n const [addToCartLoading, setAddToCartLoading] = React.useState(false)\n const [shopNowLoading, setShopNowLoading] = React.useState(false)\n\n // \u5C06 children \u8F6C\u6362\u4E3A\u6570\u7EC4\n const childrenArray = React.Children.toArray(children)\n\n // \u5904\u7406\u6DFB\u52A0\u5230\u8D2D\u7269\u8F66\n const handleAddToCart = async () => {\n setAddToCartLoading(true)\n try {\n await onAddToCart?.(selectedProducts)\n } finally {\n setAddToCartLoading(false)\n }\n }\n\n // \u5904\u7406\u7ACB\u5373\u8D2D\u4E70\n const handleShopNow = async () => {\n setShopNowLoading(true)\n try {\n await onShopNow?.(selectedProducts)\n } finally {\n setShopNowLoading(false)\n }\n }\n\n return (\n <div\n ref={ref}\n className={cn(\n 'bg-container-primary laptop:p-6 lg-desktop:p-8 flex min-w-0 flex-1 flex-col justify-between overflow-hidden p-4',\n className,\n classNames?.content\n )}\n {...props}\n >\n {/* \u6807\u9898 */}\n {title && (\n <Heading\n as=\"h2\"\n size={3}\n className={cn('text-info-primary flex-0 mb-[16px] line-clamp-1 shrink-0', classNames?.title)}\n html={title}\n />\n )}\n\n {/* \u4EA7\u54C1\u5217\u8868 - Swiper \u5BB9\u5668 */}\n <div className={cn('lg-desktop:mb-[24px] mb-[16px] flex-1 ', classNames?.productList)}>\n <Swiper\n modules={[FreeMode, Mousewheel]}\n freeMode={true}\n mousewheel={{\n forceToAxis: true,\n }}\n slidesPerView=\"auto\"\n spaceBetween={10}\n breakpoints={{\n 768: {\n spaceBetween: 16,\n },\n }}\n >\n {childrenArray.map((child, index) => (\n <SwiperSlide key={index} className=\"lg-desktop:!w-[342px] h-fit !w-[248px] shrink-0\">\n {child}\n </SwiperSlide>\n ))}\n </Swiper>\n </div>\n\n {/* \u5E95\u90E8\u533A\u57DF - \u603B\u4EF7 + \u6309\u94AE */}\n <div\n className={cn(\n 'tablet:items-end tablet:flex-row flex-0 flex flex-col items-start justify-between gap-2',\n classNames?.footer\n )}\n >\n {/* \u603B\u4EF7 */}\n <div className={cn('flex flex-wrap items-center gap-1', classNames?.totalPrice)}>\n {totalPriceLabel && (\n <Text as=\"span\" size={2} className=\"text-info-primary lg-desktop:text-[24px] text-[20px]\">\n {totalPriceLabel}\n </Text>\n )}\n {totalCurrentPrice && (\n <Text\n as=\"span\"\n size={2}\n className={cn('text-info-primary lg-desktop:text-[24px] text-[20px]', classNames?.currentTotalPrice)}\n >\n {totalCurrentPrice.formatted}\n </Text>\n )}\n {showOriginalPrice &&\n totalOriginalPrice &&\n totalCurrentPrice &&\n totalOriginalPrice.value > totalCurrentPrice.value && (\n <Text\n as=\"span\"\n size={2}\n className={cn(\n 'text-info-quaternary lg-desktop:text-[24px] text-[20px] line-through',\n classNames?.originalTotalPrice\n )}\n >\n {totalOriginalPrice.formatted}\n </Text>\n )}\n </div>\n\n {/* \u6309\u94AE\u7EC4 */}\n <div className={cn('flex gap-3', classNames?.buttonGroup)}>\n <Button\n variant=\"secondary\"\n onClick={handleAddToCart}\n disabled={selectedProducts.length === 0}\n loading={addToCartLoading}\n >\n {addToCartButtonText}\n </Button>\n <Button\n variant=\"primary\"\n onClick={handleShopNow}\n disabled={selectedProducts.length === 0}\n loading={shopNowLoading}\n >\n {shopNowButtonText}\n </Button>\n </div>\n </div>\n </div>\n )\n }\n)\n\nSceneShelfProductsPanel.displayName = 'SceneShelf.ProductsPanel'\n\nexport { SceneShelfProductsPanel }\n"],
5
+ "mappings": "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",
6
+ "names": ["ProductsPanel_exports", "__export", "SceneShelfProductsPanel", "__toCommonJS", "import_jsx_runtime", "React", "import_react", "import_modules", "import_helpers", "import_components", "import_context", "import_css", "title", "totalPriceLabelProp", "totalCurrentPriceProp", "totalOriginalPriceProp", "addToCartButtonTextProp", "shopNowButtonTextProp", "className", "children", "props", "ref", "context", "classNames", "totalPriceLabel", "totalCurrentPrice", "totalOriginalPrice", "addToCartButtonText", "shopNowButtonText", "selectedProducts", "onAddToCart", "onShopNow", "showOriginalPrice", "addToCartLoading", "setAddToCartLoading", "shopNowLoading", "setShopNowLoading", "childrenArray", "handleAddToCart", "handleShopNow", "child", "index"]
7
+ }
@@ -0,0 +1,20 @@
1
+ import * as React from 'react';
2
+ import type { SceneShelfSemanticName } from './types.js';
3
+ export interface SceneShelfRootProps extends React.HTMLAttributes<HTMLDivElement> {
4
+ /** 主标题 */
5
+ title?: string;
6
+ /** 副标题 */
7
+ subtitle?: string;
8
+ theme?: 'light' | 'dark';
9
+ /** 语义化类名 */
10
+ classNames?: Partial<Record<SceneShelfSemanticName, string>>;
11
+ /** 子组件(多个 Scene) */
12
+ children: React.ReactNode;
13
+ }
14
+ /**
15
+ * SceneShelf Root 组件
16
+ *
17
+ * @description 最外层容器,包含标题和多个场景
18
+ */
19
+ declare const SceneShelfRoot: React.ForwardRefExoticComponent<SceneShelfRootProps & React.RefAttributes<HTMLDivElement>>;
20
+ export { SceneShelfRoot };
@@ -0,0 +1,2 @@
1
+ "use strict";"use client";var h=Object.create;var n=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var R=Object.getOwnPropertyNames;var v=Object.getPrototypeOf,g=Object.prototype.hasOwnProperty;var y=(e,t)=>{for(var i in t)n(e,i,{get:t[i],enumerable:!0})},s=(e,t,i,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of R(t))!g.call(e,a)&&a!==i&&n(e,a,{get:()=>t[a],enumerable:!(r=S(t,a))||r.enumerable});return e};var N=(e,t,i)=>(i=e!=null?h(v(e)):{},s(t||!e||!e.__esModule?n(i,"default",{value:e,enumerable:!0}):i,e)),x=e=>s(n({},"__esModule",{value:!0}),e);var H={};y(H,{SceneShelfRoot:()=>l});module.exports=x(H);var o=require("react/jsx-runtime"),u=N(require("react")),m=require("../../helpers/index.js"),c=require("../../components/index.js");const l=u.forwardRef(({title:e,subtitle:t,theme:i="light",classNames:r,className:a,children:d,...f},p)=>(0,o.jsxs)("div",{ref:p,className:(0,m.cn)("text-info-primary w-full",{"aiui-dark":i==="dark"},a,r?.root),...f,children:[(e||t)&&(0,o.jsxs)("div",{className:(0,m.cn)("mb-6",r?.header),children:[e&&(0,o.jsx)(c.Heading,{as:"h2",size:4,className:(0,m.cn)("text-info-primary mb-2",r?.title),html:e}),t&&(0,o.jsx)(c.Text,{as:"p",size:3,className:(0,m.cn)("",r?.subtitle),html:t})]}),(0,o.jsx)("div",{className:(0,m.cn)("space-y-6",r?.sceneList),children:d})]}));l.displayName="SceneShelf.Root";
2
+ //# sourceMappingURL=Root.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/biz-components/SceneShelf/Root.tsx"],
4
+ "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { cn } from '../../helpers/index.js'\nimport { Heading, Text } from '../../components/index.js'\nimport type { SceneShelfSemanticName } from './types.js'\n\nexport interface SceneShelfRootProps extends React.HTMLAttributes<HTMLDivElement> {\n /** \u4E3B\u6807\u9898 */\n title?: string\n /** \u526F\u6807\u9898 */\n subtitle?: string\n theme?: 'light' | 'dark'\n /** \u8BED\u4E49\u5316\u7C7B\u540D */\n classNames?: Partial<Record<SceneShelfSemanticName, string>>\n /** \u5B50\u7EC4\u4EF6\uFF08\u591A\u4E2A Scene\uFF09 */\n children: React.ReactNode\n}\n\n/**\n * SceneShelf Root \u7EC4\u4EF6\n *\n * @description \u6700\u5916\u5C42\u5BB9\u5668\uFF0C\u5305\u542B\u6807\u9898\u548C\u591A\u4E2A\u573A\u666F\n */\nconst SceneShelfRoot = React.forwardRef<HTMLDivElement, SceneShelfRootProps>(\n ({ title, subtitle, theme = 'light', classNames, className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'text-info-primary w-full',\n {\n 'aiui-dark': theme === 'dark',\n },\n className,\n classNames?.root\n )}\n {...props}\n >\n {/* \u6807\u9898\u533A\u57DF */}\n {(title || subtitle) && (\n <div className={cn('mb-6', classNames?.header)}>\n {title && (\n <Heading as=\"h2\" size={4} className={cn('text-info-primary mb-2', classNames?.title)} html={title} />\n )}\n {subtitle && <Text as=\"p\" size={3} className={cn('', classNames?.subtitle)} html={subtitle} />}\n </div>\n )}\n\n {/* \u573A\u666F\u5217\u8868 */}\n <div className={cn('space-y-6', classNames?.sceneList)}>{children}</div>\n </div>\n )\n }\n)\n\nSceneShelfRoot.displayName = 'SceneShelf.Root'\n\nexport { SceneShelfRoot }\n"],
5
+ "mappings": "ukBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,oBAAAE,IAAA,eAAAC,EAAAH,GAyCU,IAAAI,EAAA,6BAvCVC,EAAuB,oBACvBC,EAAmB,kCACnBC,EAA8B,qCAoB9B,MAAML,EAAiBG,EAAM,WAC3B,CAAC,CAAE,MAAAG,EAAO,SAAAC,EAAU,MAAAC,EAAQ,QAAS,WAAAC,EAAY,UAAAC,EAAW,SAAAC,EAAU,GAAGC,CAAM,EAAGC,OAE9E,QAAC,OACC,IAAKA,EACL,aAAW,MACT,2BACA,CACE,YAAaL,IAAU,MACzB,EACAE,EACAD,GAAY,IACd,EACC,GAAGG,EAGF,WAAAN,GAASC,OACT,QAAC,OAAI,aAAW,MAAG,OAAQE,GAAY,MAAM,EAC1C,UAAAH,MACC,OAAC,WAAQ,GAAG,KAAK,KAAM,EAAG,aAAW,MAAG,yBAA0BG,GAAY,KAAK,EAAG,KAAMH,EAAO,EAEpGC,MAAY,OAAC,QAAK,GAAG,IAAI,KAAM,EAAG,aAAW,MAAG,GAAIE,GAAY,QAAQ,EAAG,KAAMF,EAAU,GAC9F,KAIF,OAAC,OAAI,aAAW,MAAG,YAAaE,GAAY,SAAS,EAAI,SAAAE,EAAS,GACpE,CAGN,EAEAX,EAAe,YAAc",
6
+ "names": ["Root_exports", "__export", "SceneShelfRoot", "__toCommonJS", "import_jsx_runtime", "React", "import_helpers", "import_components", "title", "subtitle", "theme", "classNames", "className", "children", "props", "ref"]
7
+ }
@@ -0,0 +1,38 @@
1
+ import * as React from 'react';
2
+ import { type SceneShelfContextValue } from './context.js';
3
+ import type { SceneProductCardData, PriceData } from './types.js';
4
+ export interface SceneShelfSceneProps extends React.HTMLAttributes<HTMLDivElement> {
5
+ /** 是否展示标签 */
6
+ showTags?: boolean;
7
+ /** 是否展示原价 */
8
+ showOriginalPrice?: boolean;
9
+ /** 语义化类名 */
10
+ classNames?: SceneShelfContextValue['classNames'];
11
+ /** 产品选中状态变化回调 */
12
+ onSelectionChange?: (selectedProducts: SceneProductCardData[]) => void;
13
+ /** 点击添加到购物车回调 */
14
+ onAddToCart?: (selectedProducts: SceneProductCardData[]) => void | Promise<void>;
15
+ /** 点击立即购买回调 */
16
+ onShopNow?: (selectedProducts: SceneProductCardData[]) => void | Promise<void>;
17
+ /** 添加到购物车按钮文本 */
18
+ addToCartButtonText?: string;
19
+ /** 立即购买按钮文本 */
20
+ shopNowButtonText?: string;
21
+ /** 总价标签 */
22
+ totalPriceLabel?: string;
23
+ /** 当前总价 */
24
+ totalCurrentPrice?: PriceData;
25
+ /** 原总价 */
26
+ totalOriginalPrice?: PriceData;
27
+ /** 初始选中的产品列表(通过 defaultSelected 标记) */
28
+ products?: SceneProductCardData[];
29
+ /** 子组件 */
30
+ children: React.ReactNode;
31
+ }
32
+ /**
33
+ * SceneShelf Scene 组件
34
+ *
35
+ * @description 单个场景容器,提供 Context 配置和选择状态管理
36
+ */
37
+ declare const SceneShelfScene: React.ForwardRefExoticComponent<SceneShelfSceneProps & React.RefAttributes<HTMLDivElement>>;
38
+ export { SceneShelfScene };
@@ -0,0 +1,2 @@
1
+ "use strict";"use client";var k=Object.create;var i=Object.defineProperty;var H=Object.getOwnPropertyDescriptor;var L=Object.getOwnPropertyNames;var A=Object.getPrototypeOf,I=Object.prototype.hasOwnProperty;var j=(e,t)=>{for(var o in t)i(e,o,{get:t[o],enumerable:!0})},g=(e,t,o,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of L(t))!I.call(e,n)&&n!==o&&i(e,n,{get:()=>t[n],enumerable:!(a=H(t,n))||a.enumerable});return e};var q=(e,t,o)=>(o=e!=null?k(A(e)):{},g(t||!e||!e.__esModule?i(o,"default",{value:e,enumerable:!0}):o,e)),z=e=>g(i({},"__esModule",{value:!0}),e);var B={};j(B,{SceneShelfScene:()=>u});module.exports=z(B);var h=require("react/jsx-runtime"),r=q(require("react")),w=require("../../helpers/index.js"),b=require("./context.js");const u=r.forwardRef(({showTags:e=!0,showOriginalPrice:t=!0,classNames:o,onSelectionChange:a,onAddToCart:n,onShopNow:P,addToCartButtonText:m="Add to Cart",shopNowButtonText:p="Shop Now",totalPriceLabel:x="Total Price:",totalCurrentPrice:C,totalOriginalPrice:v,products:S=[],className:M,children:R,...y},E)=>{const[l,N]=r.useState(()=>{const c=new Set;return S.forEach(d=>{d.defaultSelected&&c.add(d.id)}),c}),s=r.useMemo(()=>S.filter(c=>l.has(c.id)),[S,l]),D=r.useCallback((c,d)=>{N(V=>{const f=new Set(V);return c?f.add(d.id):f.delete(d.id),f})},[]);r.useEffect(()=>{a?.(s)},[s,a]);const T=r.useMemo(()=>({showTags:e,showOriginalPrice:t,classNames:o,selectedIds:l,selectedProducts:s,onSelectChange:D,onAddToCart:n,onShopNow:P,addToCartButtonText:m,shopNowButtonText:p,totalPriceLabel:x,totalCurrentPrice:C,totalOriginalPrice:v}),[e,t,o,l,s,D,n,P,m,p,x,C,v]);return(0,h.jsx)(b.SceneShelfContext.Provider,{value:T,children:(0,h.jsx)("div",{ref:E,className:(0,w.cn)("rounded-box tablet:flex-row lg-desktop:min-h-[560px] desktop:h-[448px] laptop:min-h-[448px] flex min-h-[560px] w-full flex-col items-stretch gap-0 overflow-hidden",M,o?.scene),...y,children:R})})});u.displayName="SceneShelf.Scene";
2
+ //# sourceMappingURL=Scene.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/biz-components/SceneShelf/Scene.tsx"],
4
+ "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { cn } from '../../helpers/index.js'\nimport { SceneShelfContext, type SceneShelfContextValue } from './context.js'\nimport type { SceneProductCardData, PriceData } from './types.js'\n\nexport interface SceneShelfSceneProps extends React.HTMLAttributes<HTMLDivElement> {\n /** \u662F\u5426\u5C55\u793A\u6807\u7B7E */\n showTags?: boolean\n /** \u662F\u5426\u5C55\u793A\u539F\u4EF7 */\n showOriginalPrice?: boolean\n /** \u8BED\u4E49\u5316\u7C7B\u540D */\n classNames?: SceneShelfContextValue['classNames']\n /** \u4EA7\u54C1\u9009\u4E2D\u72B6\u6001\u53D8\u5316\u56DE\u8C03 */\n onSelectionChange?: (selectedProducts: SceneProductCardData[]) => void\n /** \u70B9\u51FB\u6DFB\u52A0\u5230\u8D2D\u7269\u8F66\u56DE\u8C03 */\n onAddToCart?: (selectedProducts: SceneProductCardData[]) => void | Promise<void>\n /** \u70B9\u51FB\u7ACB\u5373\u8D2D\u4E70\u56DE\u8C03 */\n onShopNow?: (selectedProducts: SceneProductCardData[]) => void | Promise<void>\n /** \u6DFB\u52A0\u5230\u8D2D\u7269\u8F66\u6309\u94AE\u6587\u672C */\n addToCartButtonText?: string\n /** \u7ACB\u5373\u8D2D\u4E70\u6309\u94AE\u6587\u672C */\n shopNowButtonText?: string\n /** \u603B\u4EF7\u6807\u7B7E */\n totalPriceLabel?: string\n /** \u5F53\u524D\u603B\u4EF7 */\n totalCurrentPrice?: PriceData\n /** \u539F\u603B\u4EF7 */\n totalOriginalPrice?: PriceData\n /** \u521D\u59CB\u9009\u4E2D\u7684\u4EA7\u54C1\u5217\u8868\uFF08\u901A\u8FC7 defaultSelected \u6807\u8BB0\uFF09 */\n products?: SceneProductCardData[]\n /** \u5B50\u7EC4\u4EF6 */\n children: React.ReactNode\n}\n\n/**\n * SceneShelf Scene \u7EC4\u4EF6\n *\n * @description \u5355\u4E2A\u573A\u666F\u5BB9\u5668\uFF0C\u63D0\u4F9B Context \u914D\u7F6E\u548C\u9009\u62E9\u72B6\u6001\u7BA1\u7406\n */\nconst SceneShelfScene = React.forwardRef<HTMLDivElement, SceneShelfSceneProps>(\n (\n {\n showTags = true,\n showOriginalPrice = true,\n classNames,\n onSelectionChange,\n onAddToCart,\n onShopNow,\n addToCartButtonText = 'Add to Cart',\n shopNowButtonText = 'Shop Now',\n totalPriceLabel = 'Total Price:',\n totalCurrentPrice,\n totalOriginalPrice,\n products = [],\n className,\n children,\n ...props\n },\n ref\n ) => {\n // \u7BA1\u7406\u9009\u4E2D\u72B6\u6001\n const [selectedIds, setSelectedIds] = React.useState<Set<string>>(() => {\n const initialSelected = new Set<string>()\n products.forEach(product => {\n if (product.defaultSelected) {\n initialSelected.add(product.id)\n }\n })\n return initialSelected\n })\n\n // \u8BA1\u7B97\u9009\u4E2D\u7684\u4EA7\u54C1\n const selectedProducts = React.useMemo(() => {\n return products.filter(product => selectedIds.has(product.id))\n }, [products, selectedIds])\n\n // \u5904\u7406\u9009\u4E2D\u72B6\u6001\u53D8\u5316\n const handleSelectChange = React.useCallback((selected: boolean, product: SceneProductCardData) => {\n setSelectedIds(prev => {\n const newSet = new Set(prev)\n if (selected) {\n newSet.add(product.id)\n } else {\n newSet.delete(product.id)\n }\n return newSet\n })\n }, [])\n\n // \u901A\u77E5\u7236\u7EC4\u4EF6\u9009\u4E2D\u72B6\u6001\u53D8\u5316\n React.useEffect(() => {\n onSelectionChange?.(selectedProducts)\n }, [selectedProducts, onSelectionChange])\n\n const contextValue = React.useMemo<SceneShelfContextValue>(\n () => ({\n showTags,\n showOriginalPrice,\n classNames,\n selectedIds,\n selectedProducts,\n onSelectChange: handleSelectChange,\n onAddToCart,\n onShopNow,\n addToCartButtonText,\n shopNowButtonText,\n totalPriceLabel,\n totalCurrentPrice,\n totalOriginalPrice,\n }),\n [\n showTags,\n showOriginalPrice,\n classNames,\n selectedIds,\n selectedProducts,\n handleSelectChange,\n onAddToCart,\n onShopNow,\n addToCartButtonText,\n shopNowButtonText,\n totalPriceLabel,\n totalCurrentPrice,\n totalOriginalPrice,\n ]\n )\n\n return (\n <SceneShelfContext.Provider value={contextValue}>\n <div\n ref={ref}\n className={cn(\n 'rounded-box tablet:flex-row lg-desktop:min-h-[560px] desktop:h-[448px] laptop:min-h-[448px] flex min-h-[560px] w-full flex-col items-stretch gap-0 overflow-hidden',\n className,\n classNames?.scene\n )}\n {...props}\n >\n {children}\n </div>\n </SceneShelfContext.Provider>\n )\n }\n)\n\nSceneShelfScene.displayName = 'SceneShelf.Scene'\n\nexport { SceneShelfScene }\n"],
5
+ "mappings": "ukBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,IAAA,eAAAC,EAAAH,GAmIQ,IAAAI,EAAA,6BAjIRC,EAAuB,oBACvBC,EAAmB,kCACnBC,EAA+D,wBAqC/D,MAAML,EAAkBG,EAAM,WAC5B,CACE,CACE,SAAAG,EAAW,GACX,kBAAAC,EAAoB,GACpB,WAAAC,EACA,kBAAAC,EACA,YAAAC,EACA,UAAAC,EACA,oBAAAC,EAAsB,cACtB,kBAAAC,EAAoB,WACpB,gBAAAC,EAAkB,eAClB,kBAAAC,EACA,mBAAAC,EACA,SAAAC,EAAW,CAAC,EACZ,UAAAC,EACA,SAAAC,EACA,GAAGC,CACL,EACAC,IACG,CAEH,KAAM,CAACC,EAAaC,CAAc,EAAIpB,EAAM,SAAsB,IAAM,CACtE,MAAMqB,EAAkB,IAAI,IAC5B,OAAAP,EAAS,QAAQQ,GAAW,CACtBA,EAAQ,iBACVD,EAAgB,IAAIC,EAAQ,EAAE,CAElC,CAAC,EACMD,CACT,CAAC,EAGKE,EAAmBvB,EAAM,QAAQ,IAC9Bc,EAAS,OAAOQ,GAAWH,EAAY,IAAIG,EAAQ,EAAE,CAAC,EAC5D,CAACR,EAAUK,CAAW,CAAC,EAGpBK,EAAqBxB,EAAM,YAAY,CAACyB,EAAmBH,IAAkC,CACjGF,EAAeM,GAAQ,CACrB,MAAMC,EAAS,IAAI,IAAID,CAAI,EAC3B,OAAID,EACFE,EAAO,IAAIL,EAAQ,EAAE,EAErBK,EAAO,OAAOL,EAAQ,EAAE,EAEnBK,CACT,CAAC,CACH,EAAG,CAAC,CAAC,EAGL3B,EAAM,UAAU,IAAM,CACpBM,IAAoBiB,CAAgB,CACtC,EAAG,CAACA,EAAkBjB,CAAiB,CAAC,EAExC,MAAMsB,EAAe5B,EAAM,QACzB,KAAO,CACL,SAAAG,EACA,kBAAAC,EACA,WAAAC,EACA,YAAAc,EACA,iBAAAI,EACA,eAAgBC,EAChB,YAAAjB,EACA,UAAAC,EACA,oBAAAC,EACA,kBAAAC,EACA,gBAAAC,EACA,kBAAAC,EACA,mBAAAC,CACF,GACA,CACEV,EACAC,EACAC,EACAc,EACAI,EACAC,EACAjB,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,CACF,CACF,EAEA,SACE,OAAC,oBAAkB,SAAlB,CAA2B,MAAOe,EACjC,mBAAC,OACC,IAAKV,EACL,aAAW,MACT,sKACAH,EACAV,GAAY,KACd,EACC,GAAGY,EAEH,SAAAD,EACH,EACF,CAEJ,CACF,EAEAnB,EAAgB,YAAc",
6
+ "names": ["Scene_exports", "__export", "SceneShelfScene", "__toCommonJS", "import_jsx_runtime", "React", "import_helpers", "import_context", "showTags", "showOriginalPrice", "classNames", "onSelectionChange", "onAddToCart", "onShopNow", "addToCartButtonText", "shopNowButtonText", "totalPriceLabel", "totalCurrentPrice", "totalOriginalPrice", "products", "className", "children", "props", "ref", "selectedIds", "setSelectedIds", "initialSelected", "product", "selectedProducts", "handleSelectChange", "selected", "prev", "newSet", "contextValue"]
7
+ }
@@ -0,0 +1,14 @@
1
+ import * as React from 'react';
2
+ export interface SceneShelfSceneImageProps extends React.HTMLAttributes<HTMLDivElement> {
3
+ /** 场景图片 URL */
4
+ imageUrl: string;
5
+ /** 场景图片 Alt */
6
+ imageAlt?: string;
7
+ }
8
+ /**
9
+ * SceneShelf SceneImage 组件
10
+ *
11
+ * @description 场景推荐货架的场景图片展示组件
12
+ */
13
+ declare const SceneShelfSceneImage: React.ForwardRefExoticComponent<SceneShelfSceneImageProps & React.RefAttributes<HTMLDivElement>>;
14
+ export { SceneShelfSceneImage };
@@ -0,0 +1,2 @@
1
+ "use strict";"use client";var p=Object.create;var a=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var h=Object.getPrototypeOf,x=Object.prototype.hasOwnProperty;var d=(e,t)=>{for(var s in t)a(e,s,{get:t[s],enumerable:!0})},m=(e,t,s,l)=>{if(t&&typeof t=="object"||typeof t=="function")for(let c of u(t))!x.call(e,c)&&c!==s&&a(e,c,{get:()=>t[c],enumerable:!(l=g(t,c))||l.enumerable});return e};var N=(e,t,s)=>(s=e!=null?p(h(e)):{},m(t||!e||!e.__esModule?a(s,"default",{value:e,enumerable:!0}):s,e)),v=e=>m(a({},"__esModule",{value:!0}),e);var b={};d(b,{SceneShelfSceneImage:()=>n});module.exports=v(b);var r=require("react/jsx-runtime"),I=N(require("react")),o=require("../../helpers/index.js"),i=require("../../components/index.js"),f=require("./context.js");const n=I.forwardRef(({imageUrl:e,imageAlt:t,className:s,...l},c)=>{const S=(0,f.useSceneShelfContext)()?.classNames;return(0,r.jsx)("div",{ref:c,className:(0,o.cn)("tablet:h-full tablet:w-[327px] desktop:w-[544px] h-[240px] w-full shrink-0",s,S?.sceneImage),...l,children:(0,r.jsx)(i.Picture,{source:e,alt:t||"",className:"size-full",imgClassName:"size-full object-cover"})})});n.displayName="SceneShelf.SceneImage";
2
+ //# sourceMappingURL=SceneImage.js.map