@anker-in/headless-ui 1.3.19 → 1.3.21

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 (70) hide show
  1. package/dist/cjs/biz-components/BuyOneGetOneShelf/PriceAndActions.d.ts +1 -0
  2. package/dist/cjs/biz-components/BuyOneGetOneShelf/PriceAndActions.js +1 -1
  3. package/dist/cjs/biz-components/BuyOneGetOneShelf/PriceAndActions.js.map +3 -3
  4. package/dist/cjs/biz-components/BuyOneGetOneShelf/ProductCard.d.ts +1 -0
  5. package/dist/cjs/biz-components/BuyOneGetOneShelf/ProductCard.js +1 -1
  6. package/dist/cjs/biz-components/BuyOneGetOneShelf/ProductCard.js.map +3 -3
  7. package/dist/cjs/biz-components/BuyOneGetOneShelf/ProductImage.d.ts +2 -0
  8. package/dist/cjs/biz-components/BuyOneGetOneShelf/ProductImage.js +1 -1
  9. package/dist/cjs/biz-components/BuyOneGetOneShelf/ProductImage.js.map +3 -3
  10. package/dist/cjs/biz-components/BuyOneGetOneShelf/ProductInfo.d.ts +2 -5
  11. package/dist/cjs/biz-components/BuyOneGetOneShelf/ProductInfo.js +1 -1
  12. package/dist/cjs/biz-components/BuyOneGetOneShelf/ProductInfo.js.map +3 -3
  13. package/dist/cjs/biz-components/BuyOneGetOneShelf/types.d.ts +2 -0
  14. package/dist/cjs/biz-components/BuyOneGetOneShelf/types.js.map +1 -1
  15. package/dist/cjs/biz-components/EventSchedule/index.d.ts +2 -2
  16. package/dist/cjs/biz-components/EventSchedule/index.js +1 -1
  17. package/dist/cjs/biz-components/EventSchedule/index.js.map +3 -3
  18. package/dist/cjs/biz-components/Listing/components/ProductCard/ProductSummary/index.js +1 -1
  19. package/dist/cjs/biz-components/Listing/components/ProductCard/ProductSummary/index.js.map +3 -3
  20. package/dist/cjs/biz-components/Listing/components/PurchaseBar/ProductActions/index.js +1 -1
  21. package/dist/cjs/biz-components/Listing/components/PurchaseBar/ProductActions/index.js.map +3 -3
  22. package/dist/cjs/biz-components/MultiLayoutGraphicBlock/MultiLayoutGraphicBlock.d.ts +2 -0
  23. package/dist/cjs/biz-components/MultiLayoutGraphicBlock/MultiLayoutGraphicBlock.js +1 -1
  24. package/dist/cjs/biz-components/MultiLayoutGraphicBlock/MultiLayoutGraphicBlock.js.map +3 -3
  25. package/dist/cjs/biz-components/MultiLayoutGraphicBlock/MultiLayoutGraphicBlockCarousel.d.ts +22 -0
  26. package/dist/cjs/biz-components/MultiLayoutGraphicBlock/MultiLayoutGraphicBlockCarousel.js +2 -0
  27. package/dist/cjs/biz-components/MultiLayoutGraphicBlock/MultiLayoutGraphicBlockCarousel.js.map +7 -0
  28. package/dist/cjs/biz-components/MultiLayoutGraphicBlock/types.d.ts +18 -0
  29. package/dist/cjs/biz-components/MultiLayoutGraphicBlock/types.js +1 -1
  30. package/dist/cjs/biz-components/MultiLayoutGraphicBlock/types.js.map +1 -1
  31. package/dist/cjs/biz-components/Specs/index.js +1 -1
  32. package/dist/cjs/biz-components/Specs/index.js.map +3 -3
  33. package/dist/cjs/shared/Styles.d.ts +2 -0
  34. package/dist/cjs/shared/Styles.js +1 -1
  35. package/dist/cjs/shared/Styles.js.map +3 -3
  36. package/dist/esm/biz-components/BuyOneGetOneShelf/PriceAndActions.d.ts +1 -0
  37. package/dist/esm/biz-components/BuyOneGetOneShelf/PriceAndActions.js +1 -1
  38. package/dist/esm/biz-components/BuyOneGetOneShelf/PriceAndActions.js.map +3 -3
  39. package/dist/esm/biz-components/BuyOneGetOneShelf/ProductCard.d.ts +1 -0
  40. package/dist/esm/biz-components/BuyOneGetOneShelf/ProductCard.js +1 -1
  41. package/dist/esm/biz-components/BuyOneGetOneShelf/ProductCard.js.map +3 -3
  42. package/dist/esm/biz-components/BuyOneGetOneShelf/ProductImage.d.ts +2 -0
  43. package/dist/esm/biz-components/BuyOneGetOneShelf/ProductImage.js +1 -1
  44. package/dist/esm/biz-components/BuyOneGetOneShelf/ProductImage.js.map +3 -3
  45. package/dist/esm/biz-components/BuyOneGetOneShelf/ProductInfo.d.ts +2 -5
  46. package/dist/esm/biz-components/BuyOneGetOneShelf/ProductInfo.js +1 -1
  47. package/dist/esm/biz-components/BuyOneGetOneShelf/ProductInfo.js.map +3 -3
  48. package/dist/esm/biz-components/BuyOneGetOneShelf/types.d.ts +2 -0
  49. package/dist/esm/biz-components/BuyOneGetOneShelf/types.js.map +1 -1
  50. package/dist/esm/biz-components/EventSchedule/index.d.ts +2 -2
  51. package/dist/esm/biz-components/EventSchedule/index.js +1 -1
  52. package/dist/esm/biz-components/EventSchedule/index.js.map +3 -3
  53. package/dist/esm/biz-components/Listing/components/ProductCard/ProductSummary/index.js +1 -1
  54. package/dist/esm/biz-components/Listing/components/ProductCard/ProductSummary/index.js.map +3 -3
  55. package/dist/esm/biz-components/Listing/components/PurchaseBar/ProductActions/index.js +1 -1
  56. package/dist/esm/biz-components/Listing/components/PurchaseBar/ProductActions/index.js.map +3 -3
  57. package/dist/esm/biz-components/MultiLayoutGraphicBlock/MultiLayoutGraphicBlock.d.ts +2 -0
  58. package/dist/esm/biz-components/MultiLayoutGraphicBlock/MultiLayoutGraphicBlock.js +1 -1
  59. package/dist/esm/biz-components/MultiLayoutGraphicBlock/MultiLayoutGraphicBlock.js.map +3 -3
  60. package/dist/esm/biz-components/MultiLayoutGraphicBlock/MultiLayoutGraphicBlockCarousel.d.ts +22 -0
  61. package/dist/esm/biz-components/MultiLayoutGraphicBlock/MultiLayoutGraphicBlockCarousel.js +2 -0
  62. package/dist/esm/biz-components/MultiLayoutGraphicBlock/MultiLayoutGraphicBlockCarousel.js.map +7 -0
  63. package/dist/esm/biz-components/MultiLayoutGraphicBlock/types.d.ts +18 -0
  64. package/dist/esm/biz-components/Specs/index.js +1 -1
  65. package/dist/esm/biz-components/Specs/index.js.map +3 -3
  66. package/dist/esm/shared/Styles.d.ts +2 -0
  67. package/dist/esm/shared/Styles.js +1 -1
  68. package/dist/esm/shared/Styles.js.map +3 -3
  69. package/package.json +1 -1
  70. package/style.css +21 -0
@@ -1,2 +1,2 @@
1
- "use strict";var k=Object.create;var m=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var $=Object.getOwnPropertyNames;var j=Object.getPrototypeOf,x=Object.prototype.hasOwnProperty;var L=(t,e)=>{for(var n in e)m(t,n,{get:e[n],enumerable:!0})},P=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of $(e))!x.call(t,o)&&o!==n&&m(t,o,{get:()=>e[o],enumerable:!(r=h(e,o))||r.enumerable});return t};var d=(t,e,n)=>(n=t!=null?k(j(t)):{},P(e||!t||!t.__esModule?m(n,"default",{value:t,enumerable:!0}):n,t)),E=t=>P(m({},"__esModule",{value:!0}),t);var D={};L(D,{getStylesProps:()=>w,useStyles:()=>T,withLayout:()=>M});module.exports=E(D);var s=require("react/jsx-runtime"),a=d(require("react")),f=require("./simpleHash.js"),S=d(require("./getKeyPropsString.js")),y=require("../components/grid.js"),g=require("../components/container.js"),b=d(require("./ErrorBoundary.js"));const B={12:"col-start-1 col-end-13",10:"col-start-2 col-end-12",8:"col-start-3 col-end-11",6:"col-start-4 col-end-10",4:"col-start-5 col-end-9"},_={12:"tablet:col-start-1 tablet:col-end-13",10:"tablet:col-start-2 tablet:col-end-12",8:"tablet:col-start-3 tablet:col-end-11",6:"tablet:col-start-4 tablet:col-end-10",4:"tablet:col-start-5 tablet:col-end-9"},C=t=>{const e=(0,S.default)(t);return`style_${(0,f.simpleHash)(e)}`},w=t=>{const{style:e,uid:n,disabled:r,containerClassName:o}=t;return{style:e,uid:n,disabled:r,containerClassName:o}},O=({style:t,uid:e=C({}),disabled:n=!1})=>!t||n?null:(0,s.jsx)("style",{suppressHydrationWarning:!0,"data-style-id":e,dangerouslySetInnerHTML:{__html:`.block-${e} { ${t} }`}}),T=(t,e)=>{const n=(0,a.useMemo)(()=>t?.uid||C({...t,...e??{}}),[e,t]),r=(0,a.useMemo)(()=>(0,s.jsx)(O,{...t,uid:n}),[t,n]);return{className:`block-${n} `,StyleComponent:r,uid:n}},G=t=>{const{desktopSpan:e,mobileSpan:n}=t||{},r=n?B[n]:"",o=e?_[e]:"";return`${r} ${o}`.trim()},A=t=>t?typeof t=="string"?t:typeof t=="object"&&Object.entries(t).length<=0?"":Object.entries(t).map(([e,n])=>`${e.replace(/([A-Z])/g,"-$1").toLowerCase()}: ${n}`).join("; ")+";":"",F=(t,e)=>[t,e].map(A).filter(n=>!!n).map(n=>n.trim().endsWith(";")?n:`${n};`).join(" ");function K(t,e){const n=a.default.forwardRef((r,o)=>{const{container:i,containerClassName:c,className:l,...p}=r;if(!i||Reflect.ownKeys(i).length===0)return(0,s.jsx)(t,{...p,className:l,ref:o});const u=[e,c,l].filter(Boolean).join(" ").trim();return(0,s.jsx)(g.Container,{className:u,children:(0,s.jsx)(y.Grid,{className:"container_grid",children:(0,s.jsx)(y.GridItem,{className:G(i),children:(0,s.jsx)(t,{...p,ref:o})})})})});return n.displayName=`WithContainerLayout(${t.displayName||t.name||"Component"})`,n}function v(t,e){const n=a.default.forwardRef((r,o)=>{const i=w(r),c=F(e?.style,i.style),l={...e,...i,...c&&{style:c}},{className:p,StyleComponent:u}=T(l,r.data),{style:U,uid:Z,disabled:q,className:N,...I}=r;return(0,s.jsxs)(s.Fragment,{children:[u,(0,s.jsx)(t,{...I,className:[p,N].filter(Boolean).join(" ").trim(),ref:o})]})});return n.displayName=`WithStyleInjection(${t.displayName||t.name||"Component"})`,n}function H(t){const e=a.default.forwardRef((n,r)=>(0,s.jsx)(b.default,{children:(0,s.jsx)(t,{...n,ref:r})}));return e.displayName=`WithErrorBoundary(${t.displayName||t.name||"Component"})`,e}const R=new WeakMap;function M(t,e){if(R.has(t))return t;const n=H(v(K(t,e?.containerClassName),e));n.displayName=`WithLayout(${t.displayName||t.name||"Component"})`,R.set(t,!0);const r=n;return Object.getOwnPropertyNames(t).forEach(o=>{!(o in r)&&o!=="arguments"&&o!=="caller"&&o!=="length"&&o!=="name"&&(r[o]=t[o])}),r}
1
+ "use strict";var h=Object.create;var m=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var $=Object.getOwnPropertyNames;var j=Object.getPrototypeOf,L=Object.prototype.hasOwnProperty;var E=(t,e)=>{for(var n in e)m(t,n,{get:e[n],enumerable:!0})},C=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of $(e))!L.call(t,o)&&o!==n&&m(t,o,{get:()=>e[o],enumerable:!(r=x(e,o))||r.enumerable});return t};var d=(t,e,n)=>(n=t!=null?h(j(t)):{},C(e||!t||!t.__esModule?m(n,"default",{value:t,enumerable:!0}):n,t)),_=t=>C(m({},"__esModule",{value:!0}),t);var U={};E(U,{getStylesProps:()=>T,useStyles:()=>N,withLayout:()=>D});module.exports=_(U);var s=require("react/jsx-runtime"),i=d(require("react")),S=require("./simpleHash.js"),g=d(require("./getKeyPropsString.js")),y=require("../components/grid.js"),b=require("../components/container.js"),w=d(require("./ErrorBoundary.js"));const B={12:"col-start-1 col-end-13",10:"col-start-2 col-end-12",8:"col-start-3 col-end-11",6:"col-start-4 col-end-10",4:"col-start-5 col-end-9"},O={12:"tablet:col-start-1 tablet:col-end-13",10:"tablet:col-start-2 tablet:col-end-12",8:"tablet:col-start-3 tablet:col-end-11",6:"tablet:col-start-4 tablet:col-end-10",4:"tablet:col-start-5 tablet:col-end-9"},R=t=>{const e=(0,g.default)(t);return`style_${(0,S.simpleHash)(e)}`},T=t=>{const{style:e,uid:n,disabled:r,containerClassName:o,idx:a}=t;return{style:e,uid:n,disabled:r,containerClassName:o,idx:a}},G=({style:t,uid:e=R({}),disabled:n=!1})=>!t||n?null:(0,s.jsx)("style",{suppressHydrationWarning:!0,"data-style-id":e,dangerouslySetInnerHTML:{__html:`.block-${e} { ${t} }`}}),N=(t,e)=>{const n=(0,i.useMemo)(()=>t?.uid||R({...t,...e??{}}),[e,t]),r=(0,i.useMemo)(()=>(0,s.jsx)(G,{...t,uid:n}),[t,n]);return{className:`block-${n} `,StyleComponent:r,uid:n,idx:t?.idx}},A=t=>{const{desktopSpan:e,mobileSpan:n}=t||{},r=n?B[n]:"",o=e?O[e]:"";return`${r} ${o}`.trim()},F=t=>t?typeof t=="string"?t:typeof t=="object"&&Object.entries(t).length<=0?"":Object.entries(t).map(([e,n])=>`${e.replace(/([A-Z])/g,"-$1").toLowerCase()}: ${n}`).join("; ")+";":"",K=(t,e)=>[t,e].map(F).filter(n=>!!n).map(n=>n.trim().endsWith(";")?n:`${n};`).join(" ");function v(t,e){const n=i.default.forwardRef((r,o)=>{const{container:a,containerClassName:c,className:l,...p}=r;if(!a||Reflect.ownKeys(a).length===0)return(0,s.jsx)(t,{...p,className:l,ref:o});const u=[e,c,l].filter(Boolean).join(" ").trim();return(0,s.jsx)(b.Container,{className:u,children:(0,s.jsx)(y.Grid,{className:"container_grid",children:(0,s.jsx)(y.GridItem,{className:A(a),children:(0,s.jsx)(t,{...p,ref:o})})})})});return n.displayName=`WithContainerLayout(${t.displayName||t.name||"Component"})`,n}function H(t,e){const n=i.default.forwardRef((r,o)=>{const a=T(r),c=K(e?.style,a.style),l={...e,...a,...c&&{style:c}},{className:p,StyleComponent:u,idx:P}=N(l,r.data),{style:Z,uid:q,disabled:z,idx:J,className:I,...k}=r;return(0,s.jsxs)(s.Fragment,{children:[u,(0,s.jsx)(t,{...k,...P?{id:P}:{},className:[p,I].filter(Boolean).join(" ").trim(),ref:o})]})});return n.displayName=`WithStyleInjection(${t.displayName||t.name||"Component"})`,n}function M(t){const e=i.default.forwardRef((n,r)=>(0,s.jsx)(w.default,{children:(0,s.jsx)(t,{...n,ref:r})}));return e.displayName=`WithErrorBoundary(${t.displayName||t.name||"Component"})`,e}const f=new WeakMap;function D(t,e){if(f.has(t))return t;const n=M(H(v(t,e?.containerClassName),e));n.displayName=`WithLayout(${t.displayName||t.name||"Component"})`,f.set(t,!0);const r=n;return Object.getOwnPropertyNames(t).forEach(o=>{!(o in r)&&o!=="arguments"&&o!=="caller"&&o!=="length"&&o!=="name"&&(r[o]=t[o])}),r}
2
2
  //# sourceMappingURL=Styles.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/shared/Styles.tsx"],
4
- "sourcesContent": ["import React, { useMemo } from 'react'\nimport { simpleHash } from './simpleHash.js'\nimport getKeyPropsString from './getKeyPropsString.js'\nimport { Grid, GridItem } from '../components/grid.js'\nimport { Container } from '../components/container.js'\nimport ErrorBoundary from './ErrorBoundary.js'\n\nconst colContentClasses: Record<number, string> = {\n 12: 'col-start-1 col-end-13',\n 10: 'col-start-2 col-end-12',\n 8: 'col-start-3 col-end-11',\n 6: 'col-start-4 col-end-10',\n 4: 'col-start-5 col-end-9',\n} as const\n\n// \u9884\u5B9A\u4E49\u5E26 tablet \u524D\u7F00\u7684\u7C7B\u540D\uFF0C\u786E\u4FDD Tailwind \u53EF\u4EE5\u8BC6\u522B\nconst colContentClassesTablet: Record<number, string> = {\n 12: 'tablet:col-start-1 tablet:col-end-13',\n 10: 'tablet:col-start-2 tablet:col-end-12',\n 8: 'tablet:col-start-3 tablet:col-end-11',\n 6: 'tablet:col-start-4 tablet:col-end-10',\n 4: 'tablet:col-start-5 tablet:col-end-9',\n} as const\n\nexport interface ContainerProps {\n container?: {\n desktopSpan: number\n mobileSpan: number\n }\n}\n\nexport interface StylesProps {\n style?: string | React.CSSProperties\n uid?: string\n disabled?: boolean\n containerClassName?: string\n}\n\ntype LayoutProps<P> = Omit<P, keyof StylesProps | keyof ContainerProps> & StylesProps & ContainerProps\n\ntype StaticComponentProperties<T> = Omit<T, keyof React.ComponentType<any> | 'displayName' | 'prototype'>\n\nconst generateUID = (props: Record<string, unknown>) => {\n const keyString = getKeyPropsString(props)\n return `style_${simpleHash(keyString)}`\n}\n\nexport const getStylesProps = <T extends StylesProps>(props: T): StylesProps => {\n const { style, uid, disabled, containerClassName } = props\n return { style, uid, disabled, containerClassName }\n}\n\nconst Styles: React.FC<StylesProps> = ({ style, uid = generateUID({}), disabled = false }) => {\n if (!style || disabled) {\n return null\n }\n\n return (\n <style\n suppressHydrationWarning\n data-style-id={uid}\n dangerouslySetInnerHTML={{ __html: `.block-${uid} { ${style} }` }}\n />\n )\n}\n\nexport const useStyles = (styleProps: Partial<StylesProps>, data?: Record<string, unknown>) => {\n const uid = useMemo(() => styleProps?.uid || generateUID({ ...styleProps, ...(data ?? {}) }), [data, styleProps])\n\n const StyleComponent = useMemo(() => <Styles {...styleProps} uid={uid} />, [styleProps, uid])\n\n return {\n className: `block-${uid} `,\n StyleComponent,\n uid,\n } as const\n}\n\nconst getGridItemClassName = (container?: ContainerProps['container']) => {\n const { desktopSpan, mobileSpan } = container || {}\n const mobileClasses = mobileSpan ? colContentClasses[mobileSpan] : ''\n const desktopClasses = desktopSpan ? colContentClassesTablet[desktopSpan] : ''\n return `${mobileClasses} ${desktopClasses}`.trim()\n}\n\nconst styleToString = (style?: string | React.CSSProperties): string => {\n if (!style) return ''\n if (typeof style === 'string') return style\n if (typeof style === 'object' && Object.entries(style).length <= 0) return ''\n return (\n Object.entries(style)\n .map(([key, value]) => {\n const cssKey = key.replace(/([A-Z])/g, '-$1').toLowerCase()\n return `${cssKey}: ${value}`\n })\n .join('; ') + ';'\n )\n}\n\nconst mergeStyles = (a?: string | React.CSSProperties, b?: string | React.CSSProperties): string =>\n [a, b]\n .map(styleToString)\n .filter((s): s is string => Boolean(s))\n .map(s => (s.trim().endsWith(';') ? s : `${s};`))\n .join(' ')\n\ntype InternalProps = StylesProps &\n ContainerProps & { className?: string; data?: Record<string, unknown> } & Record<string, unknown>\n\nfunction withContainerLayout(\n WrappedComponent: React.ComponentType<InternalProps>,\n defaultContainerClassName?: string\n): React.ComponentType<InternalProps> {\n const Wrapped = React.forwardRef<unknown, InternalProps>((props, ref) => {\n // eslint-disable-next-line no-unused-vars\n const { container, containerClassName, className, ...componentProps } = props\n\n if (!container || Reflect.ownKeys(container).length === 0) {\n return <WrappedComponent {...componentProps} className={className as string | undefined} ref={ref} />\n }\n\n const mergedContainerClassName = [defaultContainerClassName, containerClassName, className]\n .filter(Boolean)\n .join(' ')\n .trim()\n\n return (\n <Container className={mergedContainerClassName}>\n <Grid className=\"container_grid\">\n <GridItem className={getGridItemClassName(container as ContainerProps['container'])}>\n <WrappedComponent {...componentProps} ref={ref} />\n </GridItem>\n </Grid>\n </Container>\n )\n })\n\n Wrapped.displayName = `WithContainerLayout(${WrappedComponent.displayName || WrappedComponent.name || 'Component'})`\n return Wrapped as React.ComponentType<InternalProps>\n}\n\nfunction withStyleInjection(\n WrappedComponent: React.ComponentType<InternalProps>,\n defaultStyleProps?: Partial<StylesProps>\n): React.ComponentType<InternalProps> {\n const Wrapped = React.forwardRef<unknown, InternalProps>((props, ref) => {\n const propsStyleProps = getStylesProps(props)\n const mergedStyle = mergeStyles(defaultStyleProps?.style, propsStyleProps.style)\n\n const finalStyleProps: StylesProps = {\n ...defaultStyleProps,\n ...propsStyleProps,\n ...(mergedStyle && { style: mergedStyle }),\n }\n\n const { className, StyleComponent } = useStyles(finalStyleProps, props.data as Record<string, unknown> | undefined)\n\n // eslint-disable-next-line no-unused-vars\n const { style: _s, uid: _u, disabled: _d, className: ownClassName, ...rest } = props\n\n return (\n <>\n {StyleComponent}\n <WrappedComponent {...rest} className={[className, ownClassName].filter(Boolean).join(' ').trim()} ref={ref} />\n </>\n )\n })\n\n Wrapped.displayName = `WithStyleInjection(${WrappedComponent.displayName || WrappedComponent.name || 'Component'})`\n return Wrapped as React.ComponentType<InternalProps>\n}\n\nfunction withErrorBoundary(WrappedComponent: React.ComponentType<InternalProps>): React.ComponentType<InternalProps> {\n const Wrapped = React.forwardRef<unknown, InternalProps>((props, ref) => (\n <ErrorBoundary>\n <WrappedComponent {...props} ref={ref} />\n </ErrorBoundary>\n ))\n\n Wrapped.displayName = `WithErrorBoundary(${WrappedComponent.displayName || WrappedComponent.name || 'Component'})`\n return Wrapped as React.ComponentType<InternalProps>\n}\n\nconst wrappedComponents = new WeakMap<React.ComponentType<never>, true>()\n\nexport function withLayout<T extends React.ComponentType<any>>(\n WrappedComponent: T,\n defaultLayoutProps?: Partial<StylesProps & ContainerProps>\n): React.ForwardRefExoticComponent<LayoutProps<React.ComponentProps<T>> & React.RefAttributes<unknown>> &\n StaticComponentProperties<T> {\n if (wrappedComponents.has(WrappedComponent as React.ComponentType<never>)) {\n return WrappedComponent as unknown as React.ForwardRefExoticComponent<\n LayoutProps<React.ComponentProps<T>> & React.RefAttributes<unknown>\n > &\n StaticComponentProperties<T>\n }\n\n const composed = withErrorBoundary(\n withStyleInjection(\n withContainerLayout(\n WrappedComponent as unknown as React.ComponentType<InternalProps>,\n defaultLayoutProps?.containerClassName\n ),\n defaultLayoutProps\n )\n )\n\n composed.displayName = `WithLayout(${WrappedComponent.displayName || WrappedComponent.name || 'Component'})`\n\n wrappedComponents.set(WrappedComponent as React.ComponentType<never>, true)\n\n const result = composed as unknown as React.ForwardRefExoticComponent<\n LayoutProps<React.ComponentProps<T>> & React.RefAttributes<unknown>\n > &\n StaticComponentProperties<T>\n\n Object.getOwnPropertyNames(WrappedComponent).forEach(key => {\n if (!(key in result) && key !== 'arguments' && key !== 'caller' && key !== 'length' && key !== 'name') {\n ;(result as any)[key] = (WrappedComponent as any)[key]\n }\n })\n\n return result\n}\n"],
5
- "mappings": "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",
6
- "names": ["Styles_exports", "__export", "getStylesProps", "useStyles", "withLayout", "__toCommonJS", "import_jsx_runtime", "import_react", "import_simpleHash", "import_getKeyPropsString", "import_grid", "import_container", "import_ErrorBoundary", "colContentClasses", "colContentClassesTablet", "generateUID", "props", "keyString", "getKeyPropsString", "style", "uid", "disabled", "containerClassName", "Styles", "styleProps", "data", "StyleComponent", "getGridItemClassName", "container", "desktopSpan", "mobileSpan", "mobileClasses", "desktopClasses", "styleToString", "key", "value", "mergeStyles", "a", "b", "s", "withContainerLayout", "WrappedComponent", "defaultContainerClassName", "Wrapped", "React", "ref", "className", "componentProps", "mergedContainerClassName", "withStyleInjection", "defaultStyleProps", "propsStyleProps", "mergedStyle", "finalStyleProps", "_s", "_u", "_d", "ownClassName", "rest", "withErrorBoundary", "ErrorBoundary", "wrappedComponents", "defaultLayoutProps", "composed", "result"]
4
+ "sourcesContent": ["import React, { useMemo } from 'react'\nimport { simpleHash } from './simpleHash.js'\nimport getKeyPropsString from './getKeyPropsString.js'\nimport { Grid, GridItem } from '../components/grid.js'\nimport { Container } from '../components/container.js'\nimport ErrorBoundary from './ErrorBoundary.js'\n\nconst colContentClasses: Record<number, string> = {\n 12: 'col-start-1 col-end-13',\n 10: 'col-start-2 col-end-12',\n 8: 'col-start-3 col-end-11',\n 6: 'col-start-4 col-end-10',\n 4: 'col-start-5 col-end-9',\n} as const\n\n// \u9884\u5B9A\u4E49\u5E26 tablet \u524D\u7F00\u7684\u7C7B\u540D\uFF0C\u786E\u4FDD Tailwind \u53EF\u4EE5\u8BC6\u522B\nconst colContentClassesTablet: Record<number, string> = {\n 12: 'tablet:col-start-1 tablet:col-end-13',\n 10: 'tablet:col-start-2 tablet:col-end-12',\n 8: 'tablet:col-start-3 tablet:col-end-11',\n 6: 'tablet:col-start-4 tablet:col-end-10',\n 4: 'tablet:col-start-5 tablet:col-end-9',\n} as const\n\nexport interface ContainerProps {\n container?: {\n desktopSpan: number\n mobileSpan: number\n }\n}\n\nexport interface StylesProps {\n style?: string | React.CSSProperties\n uid?: string\n disabled?: boolean\n containerClassName?: string\n idx?: string\n}\n\ntype LayoutProps<P> = Omit<P, keyof StylesProps | keyof ContainerProps> & StylesProps & ContainerProps\n\ntype StaticComponentProperties<T> = Omit<T, keyof React.ComponentType<any> | 'displayName' | 'prototype'>\n\nconst generateUID = (props: Record<string, unknown>) => {\n const keyString = getKeyPropsString(props)\n return `style_${simpleHash(keyString)}`\n}\n\nexport const getStylesProps = <T extends StylesProps>(props: T): StylesProps => {\n const { style, uid, disabled, containerClassName, idx } = props\n return { style, uid, disabled, containerClassName, idx }\n}\n\nconst Styles: React.FC<StylesProps> = ({ style, uid = generateUID({}), disabled = false }) => {\n if (!style || disabled) {\n return null\n }\n\n return (\n <style\n suppressHydrationWarning\n data-style-id={uid}\n dangerouslySetInnerHTML={{ __html: `.block-${uid} { ${style} }` }}\n />\n )\n}\n\nexport const useStyles = (styleProps: Partial<StylesProps>, data?: Record<string, unknown>) => {\n const uid = useMemo(() => styleProps?.uid || generateUID({ ...styleProps, ...(data ?? {}) }), [data, styleProps])\n\n const StyleComponent = useMemo(() => <Styles {...styleProps} uid={uid} />, [styleProps, uid])\n\n return {\n className: `block-${uid} `,\n StyleComponent,\n uid,\n idx: styleProps?.idx,\n } as const\n}\n\nconst getGridItemClassName = (container?: ContainerProps['container']) => {\n const { desktopSpan, mobileSpan } = container || {}\n const mobileClasses = mobileSpan ? colContentClasses[mobileSpan] : ''\n const desktopClasses = desktopSpan ? colContentClassesTablet[desktopSpan] : ''\n return `${mobileClasses} ${desktopClasses}`.trim()\n}\n\nconst styleToString = (style?: string | React.CSSProperties): string => {\n if (!style) return ''\n if (typeof style === 'string') return style\n if (typeof style === 'object' && Object.entries(style).length <= 0) return ''\n return (\n Object.entries(style)\n .map(([key, value]) => {\n const cssKey = key.replace(/([A-Z])/g, '-$1').toLowerCase()\n return `${cssKey}: ${value}`\n })\n .join('; ') + ';'\n )\n}\n\nconst mergeStyles = (a?: string | React.CSSProperties, b?: string | React.CSSProperties): string =>\n [a, b]\n .map(styleToString)\n .filter((s): s is string => Boolean(s))\n .map(s => (s.trim().endsWith(';') ? s : `${s};`))\n .join(' ')\n\ntype InternalProps = StylesProps &\n ContainerProps & { className?: string; data?: Record<string, unknown> } & Record<string, unknown>\n\nfunction withContainerLayout(\n WrappedComponent: React.ComponentType<InternalProps>,\n defaultContainerClassName?: string\n): React.ComponentType<InternalProps> {\n const Wrapped = React.forwardRef<unknown, InternalProps>((props, ref) => {\n // eslint-disable-next-line no-unused-vars\n const { container, containerClassName, className, ...componentProps } = props\n\n if (!container || Reflect.ownKeys(container).length === 0) {\n return <WrappedComponent {...componentProps} className={className as string | undefined} ref={ref} />\n }\n\n const mergedContainerClassName = [defaultContainerClassName, containerClassName, className]\n .filter(Boolean)\n .join(' ')\n .trim()\n\n return (\n <Container className={mergedContainerClassName}>\n <Grid className=\"container_grid\">\n <GridItem className={getGridItemClassName(container as ContainerProps['container'])}>\n <WrappedComponent {...componentProps} ref={ref} />\n </GridItem>\n </Grid>\n </Container>\n )\n })\n\n Wrapped.displayName = `WithContainerLayout(${WrappedComponent.displayName || WrappedComponent.name || 'Component'})`\n return Wrapped as React.ComponentType<InternalProps>\n}\n\nfunction withStyleInjection(\n WrappedComponent: React.ComponentType<InternalProps>,\n defaultStyleProps?: Partial<StylesProps>\n): React.ComponentType<InternalProps> {\n const Wrapped = React.forwardRef<unknown, InternalProps>((props, ref) => {\n const propsStyleProps = getStylesProps(props)\n const mergedStyle = mergeStyles(defaultStyleProps?.style, propsStyleProps.style)\n\n const finalStyleProps: StylesProps = {\n ...defaultStyleProps,\n ...propsStyleProps,\n ...(mergedStyle && { style: mergedStyle }),\n }\n\n const { className, StyleComponent, idx } = useStyles(\n finalStyleProps,\n props.data as Record<string, unknown> | undefined\n )\n\n // eslint-disable-next-line no-unused-vars\n const { style: _s, uid: _u, disabled: _d, idx: _idx, className: ownClassName, ...rest } = props\n\n return (\n <>\n {StyleComponent}\n <WrappedComponent\n {...rest}\n {...(idx ? { id: idx } : {})}\n className={[className, ownClassName].filter(Boolean).join(' ').trim()}\n ref={ref}\n />\n </>\n )\n })\n\n Wrapped.displayName = `WithStyleInjection(${WrappedComponent.displayName || WrappedComponent.name || 'Component'})`\n return Wrapped as React.ComponentType<InternalProps>\n}\n\nfunction withErrorBoundary(WrappedComponent: React.ComponentType<InternalProps>): React.ComponentType<InternalProps> {\n const Wrapped = React.forwardRef<unknown, InternalProps>((props, ref) => (\n <ErrorBoundary>\n <WrappedComponent {...props} ref={ref} />\n </ErrorBoundary>\n ))\n\n Wrapped.displayName = `WithErrorBoundary(${WrappedComponent.displayName || WrappedComponent.name || 'Component'})`\n return Wrapped as React.ComponentType<InternalProps>\n}\n\nconst wrappedComponents = new WeakMap<React.ComponentType<never>, true>()\n\nexport function withLayout<T extends React.ComponentType<any>>(\n WrappedComponent: T,\n defaultLayoutProps?: Partial<StylesProps & ContainerProps>\n): React.ForwardRefExoticComponent<LayoutProps<React.ComponentProps<T>> & React.RefAttributes<unknown>> &\n StaticComponentProperties<T> {\n if (wrappedComponents.has(WrappedComponent as React.ComponentType<never>)) {\n return WrappedComponent as unknown as React.ForwardRefExoticComponent<\n LayoutProps<React.ComponentProps<T>> & React.RefAttributes<unknown>\n > &\n StaticComponentProperties<T>\n }\n\n const composed = withErrorBoundary(\n withStyleInjection(\n withContainerLayout(\n WrappedComponent as unknown as React.ComponentType<InternalProps>,\n defaultLayoutProps?.containerClassName\n ),\n defaultLayoutProps\n )\n )\n\n composed.displayName = `WithLayout(${WrappedComponent.displayName || WrappedComponent.name || 'Component'})`\n\n wrappedComponents.set(WrappedComponent as React.ComponentType<never>, true)\n\n const result = composed as unknown as React.ForwardRefExoticComponent<\n LayoutProps<React.ComponentProps<T>> & React.RefAttributes<unknown>\n > &\n StaticComponentProperties<T>\n\n Object.getOwnPropertyNames(WrappedComponent).forEach(key => {\n if (!(key in result) && key !== 'arguments' && key !== 'caller' && key !== 'length' && key !== 'name') {\n ;(result as any)[key] = (WrappedComponent as any)[key]\n }\n })\n\n return result\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["Styles_exports", "__export", "getStylesProps", "useStyles", "withLayout", "__toCommonJS", "import_jsx_runtime", "import_react", "import_simpleHash", "import_getKeyPropsString", "import_grid", "import_container", "import_ErrorBoundary", "colContentClasses", "colContentClassesTablet", "generateUID", "props", "keyString", "getKeyPropsString", "style", "uid", "disabled", "containerClassName", "idx", "Styles", "styleProps", "data", "StyleComponent", "getGridItemClassName", "container", "desktopSpan", "mobileSpan", "mobileClasses", "desktopClasses", "styleToString", "key", "value", "mergeStyles", "a", "b", "s", "withContainerLayout", "WrappedComponent", "defaultContainerClassName", "Wrapped", "React", "ref", "className", "componentProps", "mergedContainerClassName", "withStyleInjection", "defaultStyleProps", "propsStyleProps", "mergedStyle", "finalStyleProps", "_s", "_u", "_d", "_idx", "ownClassName", "rest", "withErrorBoundary", "ErrorBoundary", "wrappedComponents", "defaultLayoutProps", "composed", "result"]
7
7
  }
@@ -6,6 +6,7 @@ export interface PriceAndActionsProps extends React.HTMLAttributes<HTMLDivElemen
6
6
  priceLabel?: string;
7
7
  learnMoreText?: string;
8
8
  shopNowText?: string;
9
+ soldOutText?: string;
9
10
  onLearnMore?: () => void;
10
11
  onShopNow?: () => void;
11
12
  availableForSale: boolean;
@@ -1,2 +1,2 @@
1
- "use client";import{Fragment as A,jsx as e,jsxs as a}from"react/jsx-runtime";import*as k from"react";import{cn as t}from"../../helpers/index.js";import m from"../../components/button.js";import{Text as g}from"../../components/text.js";import{Heading as u}from"../../components/index.js";const f=k.forwardRef(({currentPrice:x,originalPrice:i,priceLabel:r,learnMoreText:n="Learn More",shopNowText:o="Shop Now",onLearnMore:h,onShopNow:y,availableForSale:s,learnMoreLoading:P,shopNowLoading:N,className:v,trackingTitle:l,trackingDescription:d,trackingSku:c,classNames:p},b)=>a("div",{ref:b,className:t("flex w-full flex-col justify-center gap-2",v),children:[e("div",{className:"flex w-full items-center gap-2",children:s?a(A,{children:[e(u,{size:2,className:t("text-info-primary"),children:x}),i&&e(u,{size:2,className:t("text-info-tertiary line-through",p?.productCardOriginalPrice),children:i})]}):e(g,{size:4,className:t("text-info-primary text-2xl leading-[1.2] tracking-[-0.48px]","tablet:text-xl tablet:tracking-[-0.4px]"),children:"Sold out"})}),r&&e(g,{size:4,className:t("text-marketing-1 desktop:text-[16px] lg-desktop:text-[18px] text-[14px]",p?.productCardPriceLabel),children:r}),a("div",{className:t("flex w-full items-center gap-3","tablet:gap-2"),children:[e(m,{variant:"secondary",size:"lg",onClick:h,loading:P,"data-headless-type-name":"BuyOneGetOneShelf#ProductCard","data-headless-title-desc-button":`${l||""}#${d||""}#${n}`,"data-headless-sku":c,children:n}),e(m,{variant:"primary",size:"lg",onClick:y,disabled:!s,loading:N,"data-headless-type-name":"BuyOneGetOneShelf#ProductCard","data-headless-title-desc-button":`${l||""}#${d||""}#${o}`,"data-headless-sku":c,children:o})]})]}));f.displayName="PriceAndActions";var w=f;export{w as default};
1
+ "use client";import{Fragment as A,jsx as e,jsxs as a}from"react/jsx-runtime";import*as k from"react";import{cn as t}from"../../helpers/index.js";import m from"../../components/button.js";import{Text as g}from"../../components/text.js";import{Heading as u}from"../../components/index.js";const f=k.forwardRef(({currentPrice:x,originalPrice:i,priceLabel:r,learnMoreText:n="Learn More",shopNowText:o="Shop Now",soldOutText:h="Sold out",onLearnMore:y,onShopNow:P,availableForSale:s,learnMoreLoading:N,shopNowLoading:v,className:b,trackingTitle:l,trackingDescription:d,trackingSku:c,classNames:p},O)=>a("div",{ref:O,className:t("flex w-full flex-col justify-center gap-2",b),children:[e("div",{className:"flex w-full items-center gap-2",children:s?a(A,{children:[e(u,{size:2,className:t("text-info-primary"),children:x}),i&&e(u,{size:2,className:t("text-info-tertiary line-through",p?.productCardOriginalPrice),children:i})]}):e(g,{size:4,className:t("text-info-primary text-2xl leading-[1.2] tracking-[-0.48px]","tablet:text-xl tablet:tracking-[-0.4px]"),children:h})}),r&&e(g,{size:4,className:t("text-marketing-1 desktop:text-[16px] lg-desktop:text-[18px] text-[14px]",p?.productCardPriceLabel),children:r}),a("div",{className:t("flex w-full items-center gap-3","tablet:gap-2"),children:[e(m,{variant:"secondary",size:"lg",onClick:y,loading:N,"data-headless-type-name":"BuyOneGetOneShelf#ProductCard","data-headless-title-desc-button":`${l||""}#${d||""}#${n}`,"data-headless-sku":c,children:n}),e(m,{variant:"primary",size:"lg",onClick:P,disabled:!s,loading:v,"data-headless-type-name":"BuyOneGetOneShelf#ProductCard","data-headless-title-desc-button":`${l||""}#${d||""}#${o}`,"data-headless-sku":c,children:o})]})]}));f.displayName="PriceAndActions";var B=f;export{B as default};
2
2
  //# sourceMappingURL=PriceAndActions.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/biz-components/BuyOneGetOneShelf/PriceAndActions.tsx"],
4
- "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { cn } from '../../helpers/index.js'\nimport Button from '../../components/button.js'\nimport { Text } from '../../components/text.js'\nimport { Heading } from '../../components/index.js'\nimport type { BuyOneGetOneShelfProductCardSemanticName } from './types.js'\n\nexport interface PriceAndActionsProps extends React.HTMLAttributes<HTMLDivElement> {\n currentPrice: string\n originalPrice?: string\n priceLabel?: string\n learnMoreText?: string\n shopNowText?: string\n onLearnMore?: () => void\n onShopNow?: () => void\n availableForSale: boolean\n learnMoreLoading?: boolean\n shopNowLoading?: boolean\n trackingTitle?: string\n trackingDescription?: string\n trackingSku?: string\n classNames?: Partial<Record<BuyOneGetOneShelfProductCardSemanticName, string>>\n}\n\nconst PriceAndActions = React.forwardRef<HTMLDivElement, PriceAndActionsProps>(\n (\n {\n currentPrice,\n originalPrice,\n priceLabel,\n learnMoreText = 'Learn More',\n shopNowText = 'Shop Now',\n onLearnMore,\n onShopNow,\n availableForSale,\n learnMoreLoading,\n shopNowLoading,\n className,\n trackingTitle,\n trackingDescription,\n trackingSku,\n classNames,\n },\n ref\n ) => {\n return (\n <div ref={ref} className={cn('flex w-full flex-col justify-center gap-2', className)}>\n <div className=\"flex w-full items-center gap-2\">\n {availableForSale ? (\n <>\n <Heading size={2} className={cn('text-info-primary')}>\n {currentPrice}\n </Heading>\n {originalPrice && (\n <Heading\n size={2}\n className={cn('text-info-tertiary line-through', classNames?.productCardOriginalPrice)}\n >\n {originalPrice}\n </Heading>\n )}\n </>\n ) : (\n <Text\n size={4}\n className={cn(\n 'text-info-primary text-2xl leading-[1.2] tracking-[-0.48px]',\n 'tablet:text-xl tablet:tracking-[-0.4px]'\n )}\n >\n Sold out\n </Text>\n )}\n </div>\n\n {priceLabel && (\n <Text\n size={4}\n className={cn(\n 'text-marketing-1 desktop:text-[16px] lg-desktop:text-[18px] text-[14px]',\n classNames?.productCardPriceLabel\n )}\n >\n {priceLabel}\n </Text>\n )}\n\n {/* \u6309\u94AE\u7EC4 */}\n <div className={cn('flex w-full items-center gap-3', 'tablet:gap-2')}>\n <Button\n variant=\"secondary\"\n size=\"lg\"\n onClick={onLearnMore}\n loading={learnMoreLoading}\n data-headless-type-name=\"BuyOneGetOneShelf#ProductCard\"\n data-headless-title-desc-button={`${trackingTitle || ''}#${trackingDescription || ''}#${learnMoreText}`}\n data-headless-sku={trackingSku}\n >\n {learnMoreText}\n </Button>\n <Button\n variant=\"primary\"\n size=\"lg\"\n onClick={onShopNow}\n disabled={!availableForSale}\n loading={shopNowLoading}\n data-headless-type-name=\"BuyOneGetOneShelf#ProductCard\"\n data-headless-title-desc-button={`${trackingTitle || ''}#${trackingDescription || ''}#${shopNowText}`}\n data-headless-sku={trackingSku}\n >\n {shopNowText}\n </Button>\n </div>\n </div>\n )\n }\n)\n\nPriceAndActions.displayName = 'PriceAndActions'\n\nexport default PriceAndActions\n"],
5
- "mappings": "aAmDY,mBAAAA,EACE,OAAAC,EADF,QAAAC,MAAA,oBAjDZ,UAAYC,MAAW,QACvB,OAAS,MAAAC,MAAU,yBACnB,OAAOC,MAAY,6BACnB,OAAS,QAAAC,MAAY,2BACrB,OAAS,WAAAC,MAAe,4BAoBxB,MAAMC,EAAkBL,EAAM,WAC5B,CACE,CACE,aAAAM,EACA,cAAAC,EACA,WAAAC,EACA,cAAAC,EAAgB,aAChB,YAAAC,EAAc,WACd,YAAAC,EACA,UAAAC,EACA,iBAAAC,EACA,iBAAAC,EACA,eAAAC,EACA,UAAAC,EACA,cAAAC,EACA,oBAAAC,EACA,YAAAC,EACA,WAAAC,CACF,EACAC,IAGEtB,EAAC,OAAI,IAAKsB,EAAK,UAAWpB,EAAG,4CAA6Ce,CAAS,EACjF,UAAAlB,EAAC,OAAI,UAAU,iCACZ,SAAAe,EACCd,EAAAF,EAAA,CACE,UAAAC,EAACM,EAAA,CAAQ,KAAM,EAAG,UAAWH,EAAG,mBAAmB,EAChD,SAAAK,EACH,EACCC,GACCT,EAACM,EAAA,CACC,KAAM,EACN,UAAWH,EAAG,kCAAmCmB,GAAY,wBAAwB,EAEpF,SAAAb,EACH,GAEJ,EAEAT,EAACK,EAAA,CACC,KAAM,EACN,UAAWF,EACT,8DACA,yCACF,EACD,oBAED,EAEJ,EAECO,GACCV,EAACK,EAAA,CACC,KAAM,EACN,UAAWF,EACT,0EACAmB,GAAY,qBACd,EAEC,SAAAZ,EACH,EAIFT,EAAC,OAAI,UAAWE,EAAG,iCAAkC,cAAc,EACjE,UAAAH,EAACI,EAAA,CACC,QAAQ,YACR,KAAK,KACL,QAASS,EACT,QAASG,EACT,0BAAwB,gCACxB,kCAAiC,GAAGG,GAAiB,EAAE,IAAIC,GAAuB,EAAE,IAAIT,CAAa,GACrG,oBAAmBU,EAElB,SAAAV,EACH,EACAX,EAACI,EAAA,CACC,QAAQ,UACR,KAAK,KACL,QAASU,EACT,SAAU,CAACC,EACX,QAASE,EACT,0BAAwB,gCACxB,kCAAiC,GAAGE,GAAiB,EAAE,IAAIC,GAAuB,EAAE,IAAIR,CAAW,GACnG,oBAAmBS,EAElB,SAAAT,EACH,GACF,GACF,CAGN,EAEAL,EAAgB,YAAc,kBAE9B,IAAOiB,EAAQjB",
6
- "names": ["Fragment", "jsx", "jsxs", "React", "cn", "Button", "Text", "Heading", "PriceAndActions", "currentPrice", "originalPrice", "priceLabel", "learnMoreText", "shopNowText", "onLearnMore", "onShopNow", "availableForSale", "learnMoreLoading", "shopNowLoading", "className", "trackingTitle", "trackingDescription", "trackingSku", "classNames", "ref", "PriceAndActions_default"]
4
+ "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { cn } from '../../helpers/index.js'\nimport Button from '../../components/button.js'\nimport { Text } from '../../components/text.js'\nimport { Heading } from '../../components/index.js'\nimport type { BuyOneGetOneShelfProductCardSemanticName } from './types.js'\n\nexport interface PriceAndActionsProps extends React.HTMLAttributes<HTMLDivElement> {\n currentPrice: string\n originalPrice?: string\n priceLabel?: string\n learnMoreText?: string\n shopNowText?: string\n soldOutText?: string\n onLearnMore?: () => void\n onShopNow?: () => void\n availableForSale: boolean\n learnMoreLoading?: boolean\n shopNowLoading?: boolean\n trackingTitle?: string\n trackingDescription?: string\n trackingSku?: string\n classNames?: Partial<Record<BuyOneGetOneShelfProductCardSemanticName, string>>\n}\n\nconst PriceAndActions = React.forwardRef<HTMLDivElement, PriceAndActionsProps>(\n (\n {\n currentPrice,\n originalPrice,\n priceLabel,\n learnMoreText = 'Learn More',\n shopNowText = 'Shop Now',\n soldOutText = 'Sold out',\n onLearnMore,\n onShopNow,\n availableForSale,\n learnMoreLoading,\n shopNowLoading,\n className,\n trackingTitle,\n trackingDescription,\n trackingSku,\n classNames,\n },\n ref\n ) => {\n return (\n <div ref={ref} className={cn('flex w-full flex-col justify-center gap-2', className)}>\n <div className=\"flex w-full items-center gap-2\">\n {availableForSale ? (\n <>\n <Heading size={2} className={cn('text-info-primary')}>\n {currentPrice}\n </Heading>\n {originalPrice && (\n <Heading\n size={2}\n className={cn('text-info-tertiary line-through', classNames?.productCardOriginalPrice)}\n >\n {originalPrice}\n </Heading>\n )}\n </>\n ) : (\n <Text\n size={4}\n className={cn(\n 'text-info-primary text-2xl leading-[1.2] tracking-[-0.48px]',\n 'tablet:text-xl tablet:tracking-[-0.4px]'\n )}\n >\n {soldOutText}\n </Text>\n )}\n </div>\n\n {priceLabel && (\n <Text\n size={4}\n className={cn(\n 'text-marketing-1 desktop:text-[16px] lg-desktop:text-[18px] text-[14px]',\n classNames?.productCardPriceLabel\n )}\n >\n {priceLabel}\n </Text>\n )}\n\n {/* \u6309\u94AE\u7EC4 */}\n <div className={cn('flex w-full items-center gap-3', 'tablet:gap-2')}>\n <Button\n variant=\"secondary\"\n size=\"lg\"\n onClick={onLearnMore}\n loading={learnMoreLoading}\n data-headless-type-name=\"BuyOneGetOneShelf#ProductCard\"\n data-headless-title-desc-button={`${trackingTitle || ''}#${trackingDescription || ''}#${learnMoreText}`}\n data-headless-sku={trackingSku}\n >\n {learnMoreText}\n </Button>\n <Button\n variant=\"primary\"\n size=\"lg\"\n onClick={onShopNow}\n disabled={!availableForSale}\n loading={shopNowLoading}\n data-headless-type-name=\"BuyOneGetOneShelf#ProductCard\"\n data-headless-title-desc-button={`${trackingTitle || ''}#${trackingDescription || ''}#${shopNowText}`}\n data-headless-sku={trackingSku}\n >\n {shopNowText}\n </Button>\n </div>\n </div>\n )\n }\n)\n\nPriceAndActions.displayName = 'PriceAndActions'\n\nexport default PriceAndActions\n"],
5
+ "mappings": "aAqDY,mBAAAA,EACE,OAAAC,EADF,QAAAC,MAAA,oBAnDZ,UAAYC,MAAW,QACvB,OAAS,MAAAC,MAAU,yBACnB,OAAOC,MAAY,6BACnB,OAAS,QAAAC,MAAY,2BACrB,OAAS,WAAAC,MAAe,4BAqBxB,MAAMC,EAAkBL,EAAM,WAC5B,CACE,CACE,aAAAM,EACA,cAAAC,EACA,WAAAC,EACA,cAAAC,EAAgB,aAChB,YAAAC,EAAc,WACd,YAAAC,EAAc,WACd,YAAAC,EACA,UAAAC,EACA,iBAAAC,EACA,iBAAAC,EACA,eAAAC,EACA,UAAAC,EACA,cAAAC,EACA,oBAAAC,EACA,YAAAC,EACA,WAAAC,CACF,EACAC,IAGEvB,EAAC,OAAI,IAAKuB,EAAK,UAAWrB,EAAG,4CAA6CgB,CAAS,EACjF,UAAAnB,EAAC,OAAI,UAAU,iCACZ,SAAAgB,EACCf,EAAAF,EAAA,CACE,UAAAC,EAACM,EAAA,CAAQ,KAAM,EAAG,UAAWH,EAAG,mBAAmB,EAChD,SAAAK,EACH,EACCC,GACCT,EAACM,EAAA,CACC,KAAM,EACN,UAAWH,EAAG,kCAAmCoB,GAAY,wBAAwB,EAEpF,SAAAd,EACH,GAEJ,EAEAT,EAACK,EAAA,CACC,KAAM,EACN,UAAWF,EACT,8DACA,yCACF,EAEC,SAAAU,EACH,EAEJ,EAECH,GACCV,EAACK,EAAA,CACC,KAAM,EACN,UAAWF,EACT,0EACAoB,GAAY,qBACd,EAEC,SAAAb,EACH,EAIFT,EAAC,OAAI,UAAWE,EAAG,iCAAkC,cAAc,EACjE,UAAAH,EAACI,EAAA,CACC,QAAQ,YACR,KAAK,KACL,QAASU,EACT,QAASG,EACT,0BAAwB,gCACxB,kCAAiC,GAAGG,GAAiB,EAAE,IAAIC,GAAuB,EAAE,IAAIV,CAAa,GACrG,oBAAmBW,EAElB,SAAAX,EACH,EACAX,EAACI,EAAA,CACC,QAAQ,UACR,KAAK,KACL,QAASW,EACT,SAAU,CAACC,EACX,QAASE,EACT,0BAAwB,gCACxB,kCAAiC,GAAGE,GAAiB,EAAE,IAAIC,GAAuB,EAAE,IAAIT,CAAW,GACnG,oBAAmBU,EAElB,SAAAV,EACH,GACF,GACF,CAGN,EAEAL,EAAgB,YAAc,kBAE9B,IAAOkB,EAAQlB",
6
+ "names": ["Fragment", "jsx", "jsxs", "React", "cn", "Button", "Text", "Heading", "PriceAndActions", "currentPrice", "originalPrice", "priceLabel", "learnMoreText", "shopNowText", "soldOutText", "onLearnMore", "onShopNow", "availableForSale", "learnMoreLoading", "shopNowLoading", "className", "trackingTitle", "trackingDescription", "trackingSku", "classNames", "ref", "PriceAndActions_default"]
7
7
  }
@@ -16,6 +16,7 @@ export interface ProductCardProps extends React.HTMLAttributes<HTMLDivElement> {
16
16
  /** 布局模式 */
17
17
  layout?: 'horizontal' | 'vertical';
18
18
  classNames?: Partial<Record<BuyOneGetOneShelfProductCardSemanticName, string>>;
19
+ soldOutText?: string;
19
20
  /** @deprecated Use `onProductImageClick` instead. */
20
21
  onProductClick?: (product: ProductCardData) => void;
21
22
  /** 产品图片点击回调 */
@@ -1,2 +1,2 @@
1
- "use client";import{jsx as a,jsxs as w}from"react/jsx-runtime";import*as n from"react";import{cn as x}from"../../helpers/index.js";import B from"./ProductImage.js";import E from"./ProductInfo.js";import H from"./GiftSelection.js";import W from"./PriceAndActions.js";const C=n.forwardRef(({productData:t,gifts:r=[],giftType:i=1,selectedGiftSku:v,sceneImages:F,tags:L,layout:f="horizontal",className:g,onProductClick:m,onProductImageClick:p,onLearnMore:N,onShopNow:y,onGiftClick:G,onGiftSelectionChange:M,classNames:h,...I},O)=>{const[T,S]=n.useState(!1),[z,P]=n.useState(!1),[b,c]=n.useState(()=>!r||r.length===0?[]:i===2?r.map(e=>e.id):[r[0].id]),d=n.useMemo(()=>r?r.map(e=>({...e,selected:b.includes(e.id)})):[],[r,b]);n.useEffect(()=>{if(!r||r.length===0){c([]);return}c(i===2?r.map(e=>e.id):e=>{const o=e[0];return o&&r.some(u=>u.id===o)?[o]:[r[0].id]})},[r,i]);const s=n.useMemo(()=>({...t,gifts:r,gift_type:i}),[t,r,i]),R=e=>{if(i===2){const o=d.filter(l=>l.selected);G?.(e,o);return}c(()=>{const o=[e.id],l=r?.filter(u=>o.includes(u.id))||[];return G?.(e,l),M?.(l,s),o})},k=()=>{(p??m)?.(s)},j=async()=>{const e=d.filter(o=>o.selected);S(!0);try{await N?.(s,e)}finally{S(!1)}},A=async()=>{const e=d.filter(o=>o.selected);P(!0);try{await y?.(s,e)}finally{P(!1)}};return w("div",{ref:O,className:x("bg-container-primary rounded-box flex items-stretch overflow-hidden",f==="horizontal"?["laptop:flex-row lg-desktop:min-h-[560px] desktop:min-h-[448px] tablet:min-h-[526px] min-h-[610px] flex-col","laptop:col-span-2"]:["flex-col justify-between"],p??m?"cursor-pointer":"",g),...I,children:[a(B,{images:F,name:t.name,layout:f,tags:t.tags||L,onClick:k}),a("div",{className:x("bg-container-primary desktop:p-6 flex flex-col justify-between p-4",f==="horizontal"?["rounded-r-box laptop:rounded-r-box tablet:rounded-b-box tablet:rounded-l-none","laptop:basis-[39.1%]","desktop:basis-[42.1%]","lg-desktop:basis-[42.1%]","shrink-0"]:["rounded-b-box","w-full","grow"]),children:w("div",{className:"flex flex-1 flex-col justify-between gap-6",children:[a(E,{name:t.name,onClick:k,description:t.description,classNames:h}),a(H,{freeGiftLabel:t.freeGiftLabel,freeGifts:d,onGiftClick:R,giftType:i,selectedGiftSku:v}),a(W,{currentPrice:t.currentPrice??"",originalPrice:t.originalPrice,priceLabel:t.priceLabel,learnMoreText:t.learnMoreText,shopNowText:t.shopNowText,onLearnMore:j,onShopNow:A,availableForSale:t.availableForSale,learnMoreLoading:T,shopNowLoading:z,trackingTitle:t.name,trackingDescription:t.description,trackingSku:t.sku,classNames:h})]})})]})});C.displayName="BuyOneGetOneShelf.ProductCard";var Q=C;export{Q as default};
1
+ "use client";import{jsx as a,jsxs as g}from"react/jsx-runtime";import*as i from"react";import{cn as w}from"../../helpers/index.js";import W from"./ProductImage.js";import V from"./ProductInfo.js";import _ from"./GiftSelection.js";import $ from"./PriceAndActions.js";const v=i.forwardRef(({productData:e,gifts:r=[],giftType:n=1,selectedGiftSku:F,sceneImages:L,tags:N,layout:u="horizontal",className:y,onProductClick:p,onProductImageClick:G,onLearnMore:M,onShopNow:I,onGiftClick:h,onGiftSelectionChange:O,classNames:S,soldOutText:T,...H},z)=>{const[R,P]=i.useState(!1),[j,b]=i.useState(!1),[x,d]=i.useState(()=>!r||r.length===0?[]:n===2?r.map(t=>t.id):[r[0].id]),c=i.useMemo(()=>r?r.map(t=>({...t,selected:x.includes(t.id)})):[],[r,x]);i.useEffect(()=>{if(!r||r.length===0){d([]);return}d(n===2?r.map(t=>t.id):t=>{const o=t[0];return o&&r.some(m=>m.id===o)?[o]:[r[0].id]})},[r,n]);const s=i.useMemo(()=>({...e,gifts:r,gift_type:n}),[e,r,n]),A=t=>{if(n===2){const o=c.filter(l=>l.selected);h?.(t,o);return}d(()=>{const o=[t.id],l=r?.filter(m=>o.includes(m.id))||[];return h?.(t,l),O?.(l,s),o})},f=!!(G??p),k=`/products/${e.handle}`,C=()=>{(G??p)?.(s)},B=async()=>{const t=c.filter(o=>o.selected);P(!0);try{await M?.(s,t)}finally{P(!1)}},E=async()=>{const t=c.filter(o=>o.selected);b(!0);try{await I?.(s,t)}finally{b(!1)}};return g("div",{ref:z,className:w("bg-container-primary rounded-box flex items-stretch overflow-hidden",u==="horizontal"?["laptop:flex-row lg-desktop:min-h-[560px] desktop:min-h-[448px] tablet:min-h-[526px] min-h-[610px] flex-col","laptop:col-span-2"]:["flex-col justify-between"],y),...H,children:[a(W,{images:L,name:e.name,layout:u,tags:e.tags||N,onClick:f?C:void 0,href:f?void 0:k}),a("div",{className:w("bg-container-primary desktop:p-6 flex flex-col justify-between p-4",u==="horizontal"?["rounded-r-box laptop:rounded-r-box tablet:rounded-b-box tablet:rounded-l-none","laptop:basis-[39.1%]","desktop:basis-[42.1%]","lg-desktop:basis-[42.1%]","shrink-0"]:["rounded-b-box","w-full","grow"]),children:g("div",{className:"flex flex-1 flex-col justify-between gap-6",children:[a(V,{name:e.name,onClick:f?C:void 0,href:f?void 0:k,description:e.description,classNames:S}),a(_,{freeGiftLabel:e.freeGiftLabel,freeGifts:c,onGiftClick:A,giftType:n,selectedGiftSku:F}),a($,{currentPrice:e.currentPrice??"",originalPrice:e.originalPrice,priceLabel:e.priceLabel,learnMoreText:e.learnMoreText,shopNowText:e.shopNowText,soldOutText:T,onLearnMore:B,onShopNow:E,availableForSale:e.availableForSale,learnMoreLoading:R,shopNowLoading:j,trackingTitle:e.name,trackingDescription:e.description,trackingSku:e.sku,classNames:S})]})})]})});v.displayName="BuyOneGetOneShelf.ProductCard";var X=v;export{X as default};
2
2
  //# sourceMappingURL=ProductCard.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/biz-components/BuyOneGetOneShelf/ProductCard.tsx"],
4
- "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { cn } from '../../helpers/index.js'\nimport ProductImage from './ProductImage.js'\nimport ProductInfo from './ProductInfo.js'\nimport GiftSelection from './GiftSelection.js'\nimport PriceAndActions from './PriceAndActions.js'\nimport type {\n FreeGift,\n FreeGiftWithSelection,\n ProductCardData,\n PureProductData,\n ProductTag,\n BuyOneGetOneShelfProductCardSemanticName,\n} from './types.js'\n\nexport interface ProductCardProps extends React.HTMLAttributes<HTMLDivElement> {\n /** \u4EA7\u54C1\u6570\u636E\uFF08\u4E0D\u5305\u542B\u8D60\u54C1\u4FE1\u606F\uFF09 */\n productData: PureProductData\n /** \u8D60\u54C1\u5217\u8868 */\n gifts?: FreeGift[]\n /** \u8D60\u54C1\u7C7B\u578B 1-> \u8D60\u9001\u5176\u4E2D\u4E00\u4E2A\u8D60\u54C1\uFF0C 2 -> \u8D60\u9001\u6240\u6709\u8D60\u54C1 */\n giftType?: 1 | 2\n /** \u573A\u666F\u56FE\u7247 */\n sceneImages: any\n /** \u4EA7\u54C1\u6807\u7B7E */\n tags?: ProductTag[]\n /** \u5F53\u524D\u9009\u4E2D\u7684\u8D60\u54C1SKU\uFF08\u53D7\u63A7\u7EC4\u4EF6\uFF09 */\n selectedGiftSku?: string\n /** \u5E03\u5C40\u6A21\u5F0F */\n layout?: 'horizontal' | 'vertical'\n classNames?: Partial<Record<BuyOneGetOneShelfProductCardSemanticName, string>>\n /** @deprecated Use `onProductImageClick` instead. */\n onProductClick?: (product: ProductCardData) => void\n /** \u4EA7\u54C1\u56FE\u7247\u70B9\u51FB\u56DE\u8C03 */\n onProductImageClick?: (product: ProductCardData) => void\n /** Learn More \u70B9\u51FB\u56DE\u8C03 */\n onLearnMore?: (product: ProductCardData, selectedGifts: FreeGift[]) => void\n /** Shop Now \u70B9\u51FB\u56DE\u8C03 */\n onShopNow?: (product: ProductCardData, selectedGifts: FreeGift[]) => void\n /** \u8D60\u54C1\u70B9\u51FB\u56DE\u8C03 */\n onGiftClick?: (gift: FreeGift, selectedGifts: FreeGift[]) => void\n /** \u8D60\u54C1\u9009\u62E9\u53D8\u5316\u56DE\u8C03 */\n onGiftSelectionChange?: (selectedGifts: FreeGift[], product: ProductCardData) => void\n /** \u9009\u4E2D\u8D60\u54C1SKU\u53D8\u5316\u56DE\u8C03\uFF08\u53D7\u63A7\u7EC4\u4EF6\uFF09 */\n onSelectedGiftSkuChange?: (selectedSku: string | null) => void\n}\n\n/**\n * ProductCard - \u4E70\u8D60\u8D27\u67B6\u4EA7\u54C1\u5361\u7247\n *\n * @description \u7528\u4E8E\u4E70\u4E00\u8D60\u4E00\u6D3B\u52A8\u7684\u4EA7\u54C1\u5C55\u793A\u5361\u7247\uFF0C\u5DE6\u4FA7\u5C55\u793A\u4EA7\u54C1\u56FE\u7247\u548C\u6807\u7B7E\uFF0C\u53F3\u4FA7\u5C55\u793A\u4EA7\u54C1\u4FE1\u606F\u3001\u8D60\u54C1\u548C\u8D2D\u4E70\u6309\u94AE\n */\nconst ProductCard = React.forwardRef<HTMLDivElement, ProductCardProps>(\n (\n {\n productData,\n gifts = [],\n giftType = 1,\n selectedGiftSku,\n sceneImages,\n tags,\n layout = 'horizontal',\n className,\n onProductClick,\n onProductImageClick,\n onLearnMore,\n onShopNow,\n onGiftClick,\n onGiftSelectionChange,\n classNames,\n ...props\n },\n ref\n ) => {\n const [learnMoreLoading, setLearnMoreLoading] = React.useState(false)\n const [shopNowLoading, setShopNowLoading] = React.useState(false)\n\n // \u5185\u90E8\u72B6\u6001\u7BA1\u7406\u8D60\u54C1\u7684\u9009\u62E9\u72B6\u6001 - \u4F7F\u7528\u9009\u4E2D\u7684ID\u6570\u7EC4\u800C\u4E0D\u662F\u4FEE\u6539gift\u5BF9\u8C61\n const [selectedGiftIds, setSelectedGiftIds] = React.useState<string[]>(() => {\n if (!gifts || gifts.length === 0) return []\n\n if (giftType === 2) {\n // gift_type 2 (\u5168\u9009\u6A21\u5F0F) - \u9009\u4E2D\u6240\u6709\u8D60\u54C1\n return gifts.map((gift: FreeGift) => gift.id)\n } else {\n // gift_type 1 (\u5355\u9009\u6A21\u5F0F) - \u9ED8\u8BA4\u9009\u4E2D\u7B2C\u4E00\u4E2A\u8D60\u54C1\n return [gifts[0].id]\n }\n })\n\n // \u751F\u6210\u5E26\u6709\u9009\u62E9\u72B6\u6001\u7684\u8D60\u54C1\u5217\u8868\u7528\u4E8E\u6E32\u67D3\n const giftsWithSelection = React.useMemo(() => {\n if (!gifts) return []\n\n return gifts.map((gift: FreeGift) => ({\n ...gift,\n selected: selectedGiftIds.includes(gift.id),\n }))\n }, [gifts, selectedGiftIds])\n\n // \u5F53 gifts \u6216 giftType \u66F4\u65B0\u65F6\uFF0C\u540C\u6B65\u66F4\u65B0\u5185\u90E8\u72B6\u6001\n React.useEffect(() => {\n if (!gifts || gifts.length === 0) {\n setSelectedGiftIds([])\n return\n }\n\n if (giftType === 2) {\n // gift_type 2 (\u5168\u9009\u6A21\u5F0F) - \u9009\u4E2D\u6240\u6709\u8D60\u54C1\n setSelectedGiftIds(gifts.map((gift: FreeGift) => gift.id))\n } else {\n // gift_type 1 (\u5355\u9009\u6A21\u5F0F) - \u667A\u80FD\u72B6\u6001\u7BA1\u7406\n setSelectedGiftIds(prevSelectedIds => {\n // \u68C0\u67E5\u5F53\u524D\u9009\u4E2D\u7684\u793C\u54C1\u662F\u5426\u4ECD\u7136\u5B58\u5728\u4E8E\u65B0\u7684 gifts \u5217\u8868\u4E2D\n const currentSelectedId = prevSelectedIds[0]\n const isCurrentSelectionValid =\n currentSelectedId && gifts.some((gift: FreeGift) => gift.id === currentSelectedId)\n\n // \u5982\u679C\u5F53\u524D\u9009\u4E2D\u72B6\u6001\u4ECD\u7136\u6709\u6548\uFF0C\u4FDD\u6301\u4E0D\u53D8\uFF1B\u5426\u5219\u9ED8\u8BA4\u9009\u4E2D\u7B2C\u4E00\u4E2A\n return isCurrentSelectionValid ? [currentSelectedId] : [gifts[0].id]\n })\n }\n }, [gifts, giftType])\n\n // \u6784\u9020\u5B8C\u6574\u7684\u4EA7\u54C1\u6570\u636E\u7528\u4E8E\u56DE\u8C03\n const fullProductData: ProductCardData = React.useMemo(\n () => ({\n ...productData,\n gifts,\n gift_type: giftType,\n }),\n [productData, gifts, giftType]\n )\n\n const handleGiftClick = (gift: FreeGift) => {\n // gift_type 2 (\u5168\u9009\u6A21\u5F0F) - \u4E0D\u5141\u8BB8\u53D6\u6D88\u9009\u62E9\uFF0C\u76F4\u63A5\u8FD4\u56DE\n if (giftType === 2) {\n // \u83B7\u53D6\u5F53\u524D\u6240\u6709\u9009\u4E2D\u7684gifts\u4F5C\u4E3A\u7B2C\u4E8C\u4E2A\u53C2\u6570\n const currentSelectedGifts = giftsWithSelection.filter((g: FreeGiftWithSelection) => g.selected)\n onGiftClick?.(gift, currentSelectedGifts)\n return\n }\n\n // gift_type 1 (\u5355\u9009\u6A21\u5F0F)\n setSelectedGiftIds(() => {\n const newSelectedIds = [gift.id] // \u5355\u9009\uFF1A\u59CB\u7EC8\u9009\u4E2D\u5F53\u524D\u9879\uFF0C\u70B9\u51FB\u5DF2\u9009\u4E2D\u9879\u4FDD\u6301\u72B6\u6001\uFF0C\u70B9\u51FB\u672A\u9009\u4E2D\u9879\u5207\u6362\u5230\u8BE5\u9879\n\n // \u8BA1\u7B97\u65B0\u7684\u9009\u4E2Dgifts\u4F5C\u4E3A\u7B2C\u4E8C\u4E2A\u53C2\u6570\u4F20\u9012\u7ED9\u56DE\u8C03\n const newSelectedGifts = gifts?.filter((g: FreeGift) => newSelectedIds.includes(g.id)) || []\n\n // \u8C03\u7528\u56DE\u8C03\u51FD\u6570\uFF0C\u7B2C\u4E8C\u4E2A\u53C2\u6570\u662F\u5F53\u524D\u9009\u4E2D\u7684gifts\n onGiftClick?.(gift, newSelectedGifts)\n onGiftSelectionChange?.(newSelectedGifts, fullProductData)\n\n return newSelectedIds\n })\n }\n\n const handleProductImageClick = () => {\n const callback = onProductImageClick ?? onProductClick\n callback?.(fullProductData)\n }\n\n const handleLearnMoreClick = async () => {\n const selectedGifts = giftsWithSelection.filter(gift => gift.selected)\n setLearnMoreLoading(true)\n try {\n await onLearnMore?.(fullProductData, selectedGifts)\n } finally {\n setLearnMoreLoading(false)\n }\n }\n\n const handleShopNowClick = async () => {\n const selectedGifts = giftsWithSelection.filter(gift => gift.selected)\n setShopNowLoading(true)\n try {\n await onShopNow?.(fullProductData, selectedGifts)\n } finally {\n setShopNowLoading(false)\n }\n }\n\n return (\n <div\n ref={ref}\n className={cn(\n 'bg-container-primary rounded-box flex items-stretch overflow-hidden',\n // \u6839\u636E\u5E03\u5C40\u6A21\u5F0F\u8C03\u6574\u5BB9\u5668\n layout === 'horizontal'\n ? [\n 'laptop:flex-row lg-desktop:min-h-[560px] desktop:min-h-[448px] tablet:min-h-[526px] min-h-[610px] flex-col',\n 'laptop:col-span-2',\n ]\n : ['flex-col justify-between'],\n (onProductImageClick ?? onProductClick) ? 'cursor-pointer' : '',\n className\n )}\n {...props}\n >\n {/* \u4EA7\u54C1\u56FE\u7247\u533A\u57DF */}\n <ProductImage\n images={sceneImages}\n name={productData.name}\n layout={layout}\n tags={productData.tags || tags}\n onClick={handleProductImageClick}\n />\n\n {/* \u4EA7\u54C1\u4FE1\u606F\u533A\u57DF */}\n <div\n className={cn(\n 'bg-container-primary desktop:p-6 flex flex-col justify-between p-4',\n // \u6839\u636E\u5E03\u5C40\u6A21\u5F0F\u8C03\u6574\u5706\u89D2\u548C\u5C3A\u5BF8\n layout === 'horizontal'\n ? [\n 'rounded-r-box laptop:rounded-r-box tablet:rounded-b-box tablet:rounded-l-none',\n // \u4F7F\u7528 flex-basis \u8BBE\u7F6E\u5BBD\u5EA6\u6BD4\u4F8B\n 'laptop:basis-[39.1%]', // 360px / 921px \u2248 39.1%\n 'desktop:basis-[42.1%]', // 552px / 1312px \u2248 42.1%\n 'lg-desktop:basis-[42.1%]', // 700px / 1664px \u2248 42.1%\n 'shrink-0',\n ]\n : ['rounded-b-box', 'w-full', 'grow']\n )}\n >\n <div className=\"flex flex-1 flex-col justify-between gap-6\">\n {/* \u4EA7\u54C1\u6807\u9898\u548C\u63CF\u8FF0 */}\n <ProductInfo\n name={productData.name}\n onClick={handleProductImageClick}\n description={productData.description}\n classNames={classNames}\n />\n\n {/* \u514D\u8D39\u8D60\u54C1\u533A\u57DF */}\n <GiftSelection\n freeGiftLabel={productData.freeGiftLabel}\n freeGifts={giftsWithSelection}\n onGiftClick={handleGiftClick}\n giftType={giftType}\n selectedGiftSku={selectedGiftSku}\n />\n <PriceAndActions\n currentPrice={productData.currentPrice ?? ''}\n originalPrice={productData.originalPrice}\n priceLabel={productData.priceLabel}\n learnMoreText={productData.learnMoreText}\n shopNowText={productData.shopNowText}\n onLearnMore={handleLearnMoreClick}\n onShopNow={handleShopNowClick}\n availableForSale={productData.availableForSale}\n learnMoreLoading={learnMoreLoading}\n shopNowLoading={shopNowLoading}\n trackingTitle={productData.name}\n trackingDescription={productData.description}\n trackingSku={productData.sku}\n classNames={classNames}\n />\n </div>\n </div>\n </div>\n )\n }\n)\n\nProductCard.displayName = 'BuyOneGetOneShelf.ProductCard'\n\nexport default ProductCard\n"],
5
- "mappings": "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",
6
- "names": ["jsx", "jsxs", "React", "cn", "ProductImage", "ProductInfo", "GiftSelection", "PriceAndActions", "ProductCard", "productData", "gifts", "giftType", "selectedGiftSku", "sceneImages", "tags", "layout", "className", "onProductClick", "onProductImageClick", "onLearnMore", "onShopNow", "onGiftClick", "onGiftSelectionChange", "classNames", "props", "ref", "learnMoreLoading", "setLearnMoreLoading", "shopNowLoading", "setShopNowLoading", "selectedGiftIds", "setSelectedGiftIds", "gift", "giftsWithSelection", "prevSelectedIds", "currentSelectedId", "fullProductData", "handleGiftClick", "currentSelectedGifts", "g", "newSelectedIds", "newSelectedGifts", "handleProductImageClick", "handleLearnMoreClick", "selectedGifts", "handleShopNowClick", "ProductCard_default"]
4
+ "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { cn } from '../../helpers/index.js'\nimport ProductImage from './ProductImage.js'\nimport ProductInfo from './ProductInfo.js'\nimport GiftSelection from './GiftSelection.js'\nimport PriceAndActions from './PriceAndActions.js'\nimport type {\n FreeGift,\n FreeGiftWithSelection,\n ProductCardData,\n PureProductData,\n ProductTag,\n BuyOneGetOneShelfProductCardSemanticName,\n} from './types.js'\n\nexport interface ProductCardProps extends React.HTMLAttributes<HTMLDivElement> {\n /** \u4EA7\u54C1\u6570\u636E\uFF08\u4E0D\u5305\u542B\u8D60\u54C1\u4FE1\u606F\uFF09 */\n productData: PureProductData\n /** \u8D60\u54C1\u5217\u8868 */\n gifts?: FreeGift[]\n /** \u8D60\u54C1\u7C7B\u578B 1-> \u8D60\u9001\u5176\u4E2D\u4E00\u4E2A\u8D60\u54C1\uFF0C 2 -> \u8D60\u9001\u6240\u6709\u8D60\u54C1 */\n giftType?: 1 | 2\n /** \u573A\u666F\u56FE\u7247 */\n sceneImages: any\n /** \u4EA7\u54C1\u6807\u7B7E */\n tags?: ProductTag[]\n /** \u5F53\u524D\u9009\u4E2D\u7684\u8D60\u54C1SKU\uFF08\u53D7\u63A7\u7EC4\u4EF6\uFF09 */\n selectedGiftSku?: string\n /** \u5E03\u5C40\u6A21\u5F0F */\n layout?: 'horizontal' | 'vertical'\n classNames?: Partial<Record<BuyOneGetOneShelfProductCardSemanticName, string>>\n soldOutText?: string\n /** @deprecated Use `onProductImageClick` instead. */\n onProductClick?: (product: ProductCardData) => void\n /** \u4EA7\u54C1\u56FE\u7247\u70B9\u51FB\u56DE\u8C03 */\n onProductImageClick?: (product: ProductCardData) => void\n /** Learn More \u70B9\u51FB\u56DE\u8C03 */\n onLearnMore?: (product: ProductCardData, selectedGifts: FreeGift[]) => void\n /** Shop Now \u70B9\u51FB\u56DE\u8C03 */\n onShopNow?: (product: ProductCardData, selectedGifts: FreeGift[]) => void\n /** \u8D60\u54C1\u70B9\u51FB\u56DE\u8C03 */\n onGiftClick?: (gift: FreeGift, selectedGifts: FreeGift[]) => void\n /** \u8D60\u54C1\u9009\u62E9\u53D8\u5316\u56DE\u8C03 */\n onGiftSelectionChange?: (selectedGifts: FreeGift[], product: ProductCardData) => void\n /** \u9009\u4E2D\u8D60\u54C1SKU\u53D8\u5316\u56DE\u8C03\uFF08\u53D7\u63A7\u7EC4\u4EF6\uFF09 */\n onSelectedGiftSkuChange?: (selectedSku: string | null) => void\n}\n\n/**\n * ProductCard - \u4E70\u8D60\u8D27\u67B6\u4EA7\u54C1\u5361\u7247\n *\n * @description \u7528\u4E8E\u4E70\u4E00\u8D60\u4E00\u6D3B\u52A8\u7684\u4EA7\u54C1\u5C55\u793A\u5361\u7247\uFF0C\u5DE6\u4FA7\u5C55\u793A\u4EA7\u54C1\u56FE\u7247\u548C\u6807\u7B7E\uFF0C\u53F3\u4FA7\u5C55\u793A\u4EA7\u54C1\u4FE1\u606F\u3001\u8D60\u54C1\u548C\u8D2D\u4E70\u6309\u94AE\n */\nconst ProductCard = React.forwardRef<HTMLDivElement, ProductCardProps>(\n (\n {\n productData,\n gifts = [],\n giftType = 1,\n selectedGiftSku,\n sceneImages,\n tags,\n layout = 'horizontal',\n className,\n onProductClick,\n onProductImageClick,\n onLearnMore,\n onShopNow,\n onGiftClick,\n onGiftSelectionChange,\n classNames,\n soldOutText,\n ...props\n },\n ref\n ) => {\n const [learnMoreLoading, setLearnMoreLoading] = React.useState(false)\n const [shopNowLoading, setShopNowLoading] = React.useState(false)\n\n // \u5185\u90E8\u72B6\u6001\u7BA1\u7406\u8D60\u54C1\u7684\u9009\u62E9\u72B6\u6001 - \u4F7F\u7528\u9009\u4E2D\u7684ID\u6570\u7EC4\u800C\u4E0D\u662F\u4FEE\u6539gift\u5BF9\u8C61\n const [selectedGiftIds, setSelectedGiftIds] = React.useState<string[]>(() => {\n if (!gifts || gifts.length === 0) return []\n\n if (giftType === 2) {\n // gift_type 2 (\u5168\u9009\u6A21\u5F0F) - \u9009\u4E2D\u6240\u6709\u8D60\u54C1\n return gifts.map((gift: FreeGift) => gift.id)\n } else {\n // gift_type 1 (\u5355\u9009\u6A21\u5F0F) - \u9ED8\u8BA4\u9009\u4E2D\u7B2C\u4E00\u4E2A\u8D60\u54C1\n return [gifts[0].id]\n }\n })\n\n // \u751F\u6210\u5E26\u6709\u9009\u62E9\u72B6\u6001\u7684\u8D60\u54C1\u5217\u8868\u7528\u4E8E\u6E32\u67D3\n const giftsWithSelection = React.useMemo(() => {\n if (!gifts) return []\n\n return gifts.map((gift: FreeGift) => ({\n ...gift,\n selected: selectedGiftIds.includes(gift.id),\n }))\n }, [gifts, selectedGiftIds])\n\n // \u5F53 gifts \u6216 giftType \u66F4\u65B0\u65F6\uFF0C\u540C\u6B65\u66F4\u65B0\u5185\u90E8\u72B6\u6001\n React.useEffect(() => {\n if (!gifts || gifts.length === 0) {\n setSelectedGiftIds([])\n return\n }\n\n if (giftType === 2) {\n // gift_type 2 (\u5168\u9009\u6A21\u5F0F) - \u9009\u4E2D\u6240\u6709\u8D60\u54C1\n setSelectedGiftIds(gifts.map((gift: FreeGift) => gift.id))\n } else {\n // gift_type 1 (\u5355\u9009\u6A21\u5F0F) - \u667A\u80FD\u72B6\u6001\u7BA1\u7406\n setSelectedGiftIds(prevSelectedIds => {\n // \u68C0\u67E5\u5F53\u524D\u9009\u4E2D\u7684\u793C\u54C1\u662F\u5426\u4ECD\u7136\u5B58\u5728\u4E8E\u65B0\u7684 gifts \u5217\u8868\u4E2D\n const currentSelectedId = prevSelectedIds[0]\n const isCurrentSelectionValid =\n currentSelectedId && gifts.some((gift: FreeGift) => gift.id === currentSelectedId)\n\n // \u5982\u679C\u5F53\u524D\u9009\u4E2D\u72B6\u6001\u4ECD\u7136\u6709\u6548\uFF0C\u4FDD\u6301\u4E0D\u53D8\uFF1B\u5426\u5219\u9ED8\u8BA4\u9009\u4E2D\u7B2C\u4E00\u4E2A\n return isCurrentSelectionValid ? [currentSelectedId] : [gifts[0].id]\n })\n }\n }, [gifts, giftType])\n\n // \u6784\u9020\u5B8C\u6574\u7684\u4EA7\u54C1\u6570\u636E\u7528\u4E8E\u56DE\u8C03\n const fullProductData: ProductCardData = React.useMemo(\n () => ({\n ...productData,\n gifts,\n gift_type: giftType,\n }),\n [productData, gifts, giftType]\n )\n\n const handleGiftClick = (gift: FreeGift) => {\n // gift_type 2 (\u5168\u9009\u6A21\u5F0F) - \u4E0D\u5141\u8BB8\u53D6\u6D88\u9009\u62E9\uFF0C\u76F4\u63A5\u8FD4\u56DE\n if (giftType === 2) {\n // \u83B7\u53D6\u5F53\u524D\u6240\u6709\u9009\u4E2D\u7684gifts\u4F5C\u4E3A\u7B2C\u4E8C\u4E2A\u53C2\u6570\n const currentSelectedGifts = giftsWithSelection.filter((g: FreeGiftWithSelection) => g.selected)\n onGiftClick?.(gift, currentSelectedGifts)\n return\n }\n\n // gift_type 1 (\u5355\u9009\u6A21\u5F0F)\n setSelectedGiftIds(() => {\n const newSelectedIds = [gift.id] // \u5355\u9009\uFF1A\u59CB\u7EC8\u9009\u4E2D\u5F53\u524D\u9879\uFF0C\u70B9\u51FB\u5DF2\u9009\u4E2D\u9879\u4FDD\u6301\u72B6\u6001\uFF0C\u70B9\u51FB\u672A\u9009\u4E2D\u9879\u5207\u6362\u5230\u8BE5\u9879\n\n // \u8BA1\u7B97\u65B0\u7684\u9009\u4E2Dgifts\u4F5C\u4E3A\u7B2C\u4E8C\u4E2A\u53C2\u6570\u4F20\u9012\u7ED9\u56DE\u8C03\n const newSelectedGifts = gifts?.filter((g: FreeGift) => newSelectedIds.includes(g.id)) || []\n\n // \u8C03\u7528\u56DE\u8C03\u51FD\u6570\uFF0C\u7B2C\u4E8C\u4E2A\u53C2\u6570\u662F\u5F53\u524D\u9009\u4E2D\u7684gifts\n onGiftClick?.(gift, newSelectedGifts)\n onGiftSelectionChange?.(newSelectedGifts, fullProductData)\n\n return newSelectedIds\n })\n }\n\n const hasClickHandler = !!(onProductImageClick ?? onProductClick)\n const productHref = `/products/${productData.handle}`\n\n const handleProductImageClick = () => {\n const callback = onProductImageClick ?? onProductClick\n callback?.(fullProductData)\n }\n\n const handleLearnMoreClick = async () => {\n const selectedGifts = giftsWithSelection.filter(gift => gift.selected)\n setLearnMoreLoading(true)\n try {\n await onLearnMore?.(fullProductData, selectedGifts)\n } finally {\n setLearnMoreLoading(false)\n }\n }\n\n const handleShopNowClick = async () => {\n const selectedGifts = giftsWithSelection.filter(gift => gift.selected)\n setShopNowLoading(true)\n try {\n await onShopNow?.(fullProductData, selectedGifts)\n } finally {\n setShopNowLoading(false)\n }\n }\n\n return (\n <div\n ref={ref}\n className={cn(\n 'bg-container-primary rounded-box flex items-stretch overflow-hidden',\n // \u6839\u636E\u5E03\u5C40\u6A21\u5F0F\u8C03\u6574\u5BB9\u5668\n layout === 'horizontal'\n ? [\n 'laptop:flex-row lg-desktop:min-h-[560px] desktop:min-h-[448px] tablet:min-h-[526px] min-h-[610px] flex-col',\n 'laptop:col-span-2',\n ]\n : ['flex-col justify-between'],\n className\n )}\n {...props}\n >\n {/* \u4EA7\u54C1\u56FE\u7247\u533A\u57DF */}\n <ProductImage\n images={sceneImages}\n name={productData.name}\n layout={layout}\n tags={productData.tags || tags}\n onClick={hasClickHandler ? handleProductImageClick : undefined}\n href={hasClickHandler ? undefined : productHref}\n />\n\n {/* \u4EA7\u54C1\u4FE1\u606F\u533A\u57DF */}\n <div\n className={cn(\n 'bg-container-primary desktop:p-6 flex flex-col justify-between p-4',\n // \u6839\u636E\u5E03\u5C40\u6A21\u5F0F\u8C03\u6574\u5706\u89D2\u548C\u5C3A\u5BF8\n layout === 'horizontal'\n ? [\n 'rounded-r-box laptop:rounded-r-box tablet:rounded-b-box tablet:rounded-l-none',\n // \u4F7F\u7528 flex-basis \u8BBE\u7F6E\u5BBD\u5EA6\u6BD4\u4F8B\n 'laptop:basis-[39.1%]', // 360px / 921px \u2248 39.1%\n 'desktop:basis-[42.1%]', // 552px / 1312px \u2248 42.1%\n 'lg-desktop:basis-[42.1%]', // 700px / 1664px \u2248 42.1%\n 'shrink-0',\n ]\n : ['rounded-b-box', 'w-full', 'grow']\n )}\n >\n <div className=\"flex flex-1 flex-col justify-between gap-6\">\n {/* \u4EA7\u54C1\u6807\u9898\u548C\u63CF\u8FF0 */}\n <ProductInfo\n name={productData.name}\n onClick={hasClickHandler ? handleProductImageClick : undefined}\n href={hasClickHandler ? undefined : productHref}\n description={productData.description}\n classNames={classNames}\n />\n\n {/* \u514D\u8D39\u8D60\u54C1\u533A\u57DF */}\n <GiftSelection\n freeGiftLabel={productData.freeGiftLabel}\n freeGifts={giftsWithSelection}\n onGiftClick={handleGiftClick}\n giftType={giftType}\n selectedGiftSku={selectedGiftSku}\n />\n <PriceAndActions\n currentPrice={productData.currentPrice ?? ''}\n originalPrice={productData.originalPrice}\n priceLabel={productData.priceLabel}\n learnMoreText={productData.learnMoreText}\n shopNowText={productData.shopNowText}\n soldOutText={soldOutText}\n onLearnMore={handleLearnMoreClick}\n onShopNow={handleShopNowClick}\n availableForSale={productData.availableForSale}\n learnMoreLoading={learnMoreLoading}\n shopNowLoading={shopNowLoading}\n trackingTitle={productData.name}\n trackingDescription={productData.description}\n trackingSku={productData.sku}\n classNames={classNames}\n />\n </div>\n </div>\n </div>\n )\n }\n)\n\nProductCard.displayName = 'BuyOneGetOneShelf.ProductCard'\n\nexport default ProductCard\n"],
5
+ "mappings": "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",
6
+ "names": ["jsx", "jsxs", "React", "cn", "ProductImage", "ProductInfo", "GiftSelection", "PriceAndActions", "ProductCard", "productData", "gifts", "giftType", "selectedGiftSku", "sceneImages", "tags", "layout", "className", "onProductClick", "onProductImageClick", "onLearnMore", "onShopNow", "onGiftClick", "onGiftSelectionChange", "classNames", "soldOutText", "props", "ref", "learnMoreLoading", "setLearnMoreLoading", "shopNowLoading", "setShopNowLoading", "selectedGiftIds", "setSelectedGiftIds", "gift", "giftsWithSelection", "prevSelectedIds", "currentSelectedId", "fullProductData", "handleGiftClick", "currentSelectedGifts", "g", "newSelectedIds", "newSelectedGifts", "hasClickHandler", "productHref", "handleProductImageClick", "handleLearnMoreClick", "selectedGifts", "handleShopNowClick", "ProductCard_default"]
7
7
  }
@@ -11,6 +11,8 @@ export interface ProductImageProps extends React.HTMLAttributes<HTMLDivElement>
11
11
  layout?: 'horizontal' | 'vertical';
12
12
  /** 点击回调 */
13
13
  onClick?: () => void;
14
+ /** 产品链接(无 onClick 回调时自动使用 a 标签跳转) */
15
+ href?: string;
14
16
  }
15
17
  /**
16
18
  * ProductImage - 产品图片区域
@@ -1,2 +1,2 @@
1
- "use client";import{jsx as r,jsxs as z}from"react/jsx-runtime";import*as b from"react";import{cn as i}from"../../helpers/index.js";import h from"../../components/picture.js";import P from"../../components/badge.js";const l=b.forwardRef(({images:s,name:p,tags:o,layout:t="horizontal",className:m,onClick:a},n)=>{const{laptop:c,mobile:d,tablet:u,desktop:f,lgDesktop:v}=s;return z("div",{ref:n,className:i("relative grow overflow-hidden",t==="horizontal"?["min-h-[240px]","laptop:basis-[60.9%]","desktop:basis-[57.9%]","lg-desktop:basis-[57.9%]"]:["h-fit grow-0"],a?"cursor-pointer":"",m),onClick:a,children:[r(h,{source:`${d?.url}, ${u?.url} 768, ${c?.url} 1024, ${f?.url} 1440, ${v?.url} 1920`,alt:p,className:i({"laptop:absolute inset-0 size-full static":t==="horizontal","w-full h-auto":t==="vertical"}),imgClassName:"size-full object-cover"}),o&&o.length>0&&r("div",{className:"absolute left-4 top-4 flex gap-2",children:o.map((e,g)=>r(P,{variant:e.variant,size:"lg",promotionalType:e.variant==="promotional"?e.promotionalType:void 0,children:e.label},g))})]})});l.displayName="ProductImage";var w=l;export{w as default};
1
+ "use client";import{Fragment as h,jsx as e,jsxs as z}from"react/jsx-runtime";import*as g from"react";import{cn as d}from"../../helpers/index.js";import v from"../../components/picture.js";import P from"../../components/badge.js";import{LocalizedLink as b}from"../../shared/LocalizedLink.js";const c=({images:a,name:r,tags:t,layout:o})=>{const{laptop:p,mobile:i,tablet:l,desktop:s,lgDesktop:n}=a;return z(h,{children:[e(v,{source:`${i?.url}, ${l?.url} 768, ${p?.url} 1024, ${s?.url} 1440, ${n?.url} 1920`,alt:r,className:d({"laptop:absolute inset-0 size-full static":o==="horizontal","w-full h-auto":o==="vertical"}),imgClassName:"size-full object-cover"}),t&&t.length>0&&e("div",{className:"absolute left-4 top-4 flex gap-2",children:t.map((m,f)=>e(P,{variant:m.variant,size:"lg",promotionalType:m.variant==="promotional"?m.promotionalType:void 0,children:m.label},f))})]})},u=g.forwardRef(({images:a,name:r,tags:t,layout:o="horizontal",className:p,onClick:i,href:l},s)=>{const n=d("relative grow overflow-hidden",o==="horizontal"?["min-h-[240px]","laptop:basis-[60.9%]","desktop:basis-[57.9%]","lg-desktop:basis-[57.9%]"]:["h-fit grow-0"],i||l?"cursor-pointer":"",p);return i?e("div",{ref:s,className:n,onClick:i,children:e(c,{images:a,name:r,tags:t,layout:o})}):l?e(b,{href:l,className:n,children:e("div",{ref:s,children:e(c,{images:a,name:r,tags:t,layout:o})})}):e("div",{ref:s,className:n,children:e(c,{images:a,name:r,tags:t,layout:o})})});u.displayName="ProductImage";var T=u;export{T as default};
2
2
  //# sourceMappingURL=ProductImage.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/biz-components/BuyOneGetOneShelf/ProductImage.tsx"],
4
- "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { cn } from '../../helpers/index.js'\nimport Picture from '../../components/picture.js'\nimport Badge from '../../components/badge.js'\nimport type { ProductTag } from './types.js'\n\nexport interface ProductImageProps extends React.HTMLAttributes<HTMLDivElement> {\n /** \u54CD\u5E94\u5F0F\u56FE\u7247\u96C6\u5408 */\n images: any\n /** \u4EA7\u54C1\u540D\u79F0\uFF0C\u7528\u4F5C alt \u6587\u672C */\n name: string\n /** \u4EA7\u54C1\u6807\u7B7E */\n tags?: ProductTag[]\n /** \u5E03\u5C40\u6A21\u5F0F */\n layout?: 'horizontal' | 'vertical'\n /** \u70B9\u51FB\u56DE\u8C03 */\n onClick?: () => void\n}\n\n/**\n * ProductImage - \u4EA7\u54C1\u56FE\u7247\u533A\u57DF\n */\nconst ProductImage = React.forwardRef<HTMLDivElement, ProductImageProps>(\n ({ images, name, tags, layout = 'horizontal', className, onClick }, ref) => {\n const { laptop, mobile, tablet, desktop, lgDesktop } = images\n\n return (\n <div\n ref={ref}\n className={cn(\n 'relative grow overflow-hidden',\n // \u6839\u636E\u5E03\u5C40\u6A21\u5F0F\u8C03\u6574\u5C3A\u5BF8\u548C\u5706\u89D2\n layout === 'horizontal'\n ? [\n // \u6C34\u5E73\u5E03\u5C40\uFF1A\u4F7F\u7528 flex-basis \u8BBE\u7F6E\u5BBD\u5EA6\u6BD4\u4F8B\n 'min-h-[240px]',\n 'laptop:basis-[60.9%]', // 561px / 921px \u2248 60.9%\n 'desktop:basis-[57.9%]', // 760px / 1312px \u2248 57.9%\n 'lg-desktop:basis-[57.9%]', // 964px / 1664px \u2248 57.9%\n ]\n : [\n // \u5782\u76F4\u5E03\u5C40\uFF1A\u4E0A\u9762\u56FE\u7247\uFF0C\u4E0B\u9762\u5185\u5BB9, \u4E0D\u9650\u5236\u9AD8\u5EA6\n 'h-fit grow-0',\n ],\n onClick ? 'cursor-pointer' : '',\n className\n )}\n onClick={onClick}\n >\n <Picture\n source={`${mobile?.url}, ${tablet?.url} 768, ${laptop?.url} 1024, ${desktop?.url} 1440, ${lgDesktop?.url} 1920`}\n alt={name}\n className={cn({\n 'laptop:absolute inset-0 size-full static': layout === 'horizontal',\n 'w-full h-auto': layout === 'vertical',\n })}\n imgClassName=\"size-full object-cover\"\n />\n\n {/* \u5DE6\u4E0A\u89D2\u6807\u7B7E */}\n {tags && tags.length > 0 && (\n <div className=\"absolute left-4 top-4 flex gap-2\">\n {tags.map((tag, index) => (\n <Badge\n key={index}\n variant={tag.variant}\n size=\"lg\"\n promotionalType={tag.variant === 'promotional' ? tag.promotionalType : undefined}\n >\n {tag.label}\n </Badge>\n ))}\n </div>\n )}\n </div>\n )\n }\n)\n\nProductImage.displayName = 'ProductImage'\n\nexport default ProductImage\n"],
5
- "mappings": "aA6BM,OAsBE,OAAAA,EAtBF,QAAAC,MAAA,oBA3BN,UAAYC,MAAW,QACvB,OAAS,MAAAC,MAAU,yBACnB,OAAOC,MAAa,8BACpB,OAAOC,MAAW,4BAmBlB,MAAMC,EAAeJ,EAAM,WACzB,CAAC,CAAE,OAAAK,EAAQ,KAAAC,EAAM,KAAAC,EAAM,OAAAC,EAAS,aAAc,UAAAC,EAAW,QAAAC,CAAQ,EAAGC,IAAQ,CAC1E,KAAM,CAAE,OAAAC,EAAQ,OAAAC,EAAQ,OAAAC,EAAQ,QAAAC,EAAS,UAAAC,CAAU,EAAIX,EAEvD,OACEN,EAAC,OACC,IAAKY,EACL,UAAWV,EACT,gCAEAO,IAAW,aACP,CAEE,gBACA,uBACA,wBACA,0BACF,EACA,CAEE,cACF,EACJE,EAAU,iBAAmB,GAC7BD,CACF,EACA,QAASC,EAET,UAAAZ,EAACI,EAAA,CACC,OAAQ,GAAGW,GAAQ,GAAG,KAAKC,GAAQ,GAAG,SAASF,GAAQ,GAAG,UAAUG,GAAS,GAAG,UAAUC,GAAW,GAAG,QACxG,IAAKV,EACL,UAAWL,EAAG,CACZ,2CAA4CO,IAAW,aACvD,gBAAiBA,IAAW,UAC9B,CAAC,EACD,aAAa,yBACf,EAGCD,GAAQA,EAAK,OAAS,GACrBT,EAAC,OAAI,UAAU,mCACZ,SAAAS,EAAK,IAAI,CAACU,EAAKC,IACdpB,EAACK,EAAA,CAEC,QAASc,EAAI,QACb,KAAK,KACL,gBAAiBA,EAAI,UAAY,cAAgBA,EAAI,gBAAkB,OAEtE,SAAAA,EAAI,OALAC,CAMP,CACD,EACH,GAEJ,CAEJ,CACF,EAEAd,EAAa,YAAc,eAE3B,IAAOe,EAAQf",
6
- "names": ["jsx", "jsxs", "React", "cn", "Picture", "Badge", "ProductImage", "images", "name", "tags", "layout", "className", "onClick", "ref", "laptop", "mobile", "tablet", "desktop", "lgDesktop", "tag", "index", "ProductImage_default"]
4
+ "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { cn } from '../../helpers/index.js'\nimport Picture from '../../components/picture.js'\nimport Badge from '../../components/badge.js'\nimport { LocalizedLink } from '../../shared/LocalizedLink.js'\nimport type { ProductTag } from './types.js'\n\nexport interface ProductImageProps extends React.HTMLAttributes<HTMLDivElement> {\n /** \u54CD\u5E94\u5F0F\u56FE\u7247\u96C6\u5408 */\n images: any\n /** \u4EA7\u54C1\u540D\u79F0\uFF0C\u7528\u4F5C alt \u6587\u672C */\n name: string\n /** \u4EA7\u54C1\u6807\u7B7E */\n tags?: ProductTag[]\n /** \u5E03\u5C40\u6A21\u5F0F */\n layout?: 'horizontal' | 'vertical'\n /** \u70B9\u51FB\u56DE\u8C03 */\n onClick?: () => void\n /** \u4EA7\u54C1\u94FE\u63A5\uFF08\u65E0 onClick \u56DE\u8C03\u65F6\u81EA\u52A8\u4F7F\u7528 a \u6807\u7B7E\u8DF3\u8F6C\uFF09 */\n href?: string\n}\n\nconst ProductImageContent = ({\n images,\n name,\n tags,\n layout,\n}: Pick<ProductImageProps, 'images' | 'name' | 'tags' | 'layout'>) => {\n const { laptop, mobile, tablet, desktop, lgDesktop } = images\n\n return (\n <>\n <Picture\n source={`${mobile?.url}, ${tablet?.url} 768, ${laptop?.url} 1024, ${desktop?.url} 1440, ${lgDesktop?.url} 1920`}\n alt={name}\n className={cn({\n 'laptop:absolute inset-0 size-full static': layout === 'horizontal',\n 'w-full h-auto': layout === 'vertical',\n })}\n imgClassName=\"size-full object-cover\"\n />\n\n {tags && tags.length > 0 && (\n <div className=\"absolute left-4 top-4 flex gap-2\">\n {tags.map((tag, index) => (\n <Badge\n key={index}\n variant={tag.variant}\n size=\"lg\"\n promotionalType={tag.variant === 'promotional' ? tag.promotionalType : undefined}\n >\n {tag.label}\n </Badge>\n ))}\n </div>\n )}\n </>\n )\n}\n\n/**\n * ProductImage - \u4EA7\u54C1\u56FE\u7247\u533A\u57DF\n */\nconst ProductImage = React.forwardRef<HTMLDivElement, ProductImageProps>(\n ({ images, name, tags, layout = 'horizontal', className, onClick, href }, ref) => {\n const containerClass = cn(\n 'relative grow overflow-hidden',\n layout === 'horizontal'\n ? ['min-h-[240px]', 'laptop:basis-[60.9%]', 'desktop:basis-[57.9%]', 'lg-desktop:basis-[57.9%]']\n : ['h-fit grow-0'],\n onClick || href ? 'cursor-pointer' : '',\n className\n )\n\n if (onClick) {\n return (\n <div ref={ref} className={containerClass} onClick={onClick}>\n <ProductImageContent images={images} name={name} tags={tags} layout={layout} />\n </div>\n )\n }\n\n if (href) {\n return (\n <LocalizedLink href={href} className={containerClass}>\n <div ref={ref}>\n <ProductImageContent images={images} name={name} tags={tags} layout={layout} />\n </div>\n </LocalizedLink>\n )\n }\n\n return (\n <div ref={ref} className={containerClass}>\n <ProductImageContent images={images} name={name} tags={tags} layout={layout} />\n </div>\n )\n }\n)\n\nProductImage.displayName = 'ProductImage'\n\nexport default ProductImage\n"],
5
+ "mappings": "aAiCI,mBAAAA,EACE,OAAAC,EADF,QAAAC,MAAA,oBA/BJ,UAAYC,MAAW,QACvB,OAAS,MAAAC,MAAU,yBACnB,OAAOC,MAAa,8BACpB,OAAOC,MAAW,4BAClB,OAAS,iBAAAC,MAAqB,gCAkB9B,MAAMC,EAAsB,CAAC,CAC3B,OAAAC,EACA,KAAAC,EACA,KAAAC,EACA,OAAAC,CACF,IAAsE,CACpE,KAAM,CAAE,OAAAC,EAAQ,OAAAC,EAAQ,OAAAC,EAAQ,QAAAC,EAAS,UAAAC,CAAU,EAAIR,EAEvD,OACEP,EAAAF,EAAA,CACE,UAAAC,EAACI,EAAA,CACC,OAAQ,GAAGS,GAAQ,GAAG,KAAKC,GAAQ,GAAG,SAASF,GAAQ,GAAG,UAAUG,GAAS,GAAG,UAAUC,GAAW,GAAG,QACxG,IAAKP,EACL,UAAWN,EAAG,CACZ,2CAA4CQ,IAAW,aACvD,gBAAiBA,IAAW,UAC9B,CAAC,EACD,aAAa,yBACf,EAECD,GAAQA,EAAK,OAAS,GACrBV,EAAC,OAAI,UAAU,mCACZ,SAAAU,EAAK,IAAI,CAACO,EAAKC,IACdlB,EAACK,EAAA,CAEC,QAASY,EAAI,QACb,KAAK,KACL,gBAAiBA,EAAI,UAAY,cAAgBA,EAAI,gBAAkB,OAEtE,SAAAA,EAAI,OALAC,CAMP,CACD,EACH,GAEJ,CAEJ,EAKMC,EAAejB,EAAM,WACzB,CAAC,CAAE,OAAAM,EAAQ,KAAAC,EAAM,KAAAC,EAAM,OAAAC,EAAS,aAAc,UAAAS,EAAW,QAAAC,EAAS,KAAAC,CAAK,EAAGC,IAAQ,CAChF,MAAMC,EAAiBrB,EACrB,gCACAQ,IAAW,aACP,CAAC,gBAAiB,uBAAwB,wBAAyB,0BAA0B,EAC7F,CAAC,cAAc,EACnBU,GAAWC,EAAO,iBAAmB,GACrCF,CACF,EAEA,OAAIC,EAEArB,EAAC,OAAI,IAAKuB,EAAK,UAAWC,EAAgB,QAASH,EACjD,SAAArB,EAACO,EAAA,CAAoB,OAAQC,EAAQ,KAAMC,EAAM,KAAMC,EAAM,OAAQC,EAAQ,EAC/E,EAIAW,EAEAtB,EAACM,EAAA,CAAc,KAAMgB,EAAM,UAAWE,EACpC,SAAAxB,EAAC,OAAI,IAAKuB,EACR,SAAAvB,EAACO,EAAA,CAAoB,OAAQC,EAAQ,KAAMC,EAAM,KAAMC,EAAM,OAAQC,EAAQ,EAC/E,EACF,EAKFX,EAAC,OAAI,IAAKuB,EAAK,UAAWC,EACxB,SAAAxB,EAACO,EAAA,CAAoB,OAAQC,EAAQ,KAAMC,EAAM,KAAMC,EAAM,OAAQC,EAAQ,EAC/E,CAEJ,CACF,EAEAQ,EAAa,YAAc,eAE3B,IAAOM,EAAQN",
6
+ "names": ["Fragment", "jsx", "jsxs", "React", "cn", "Picture", "Badge", "LocalizedLink", "ProductImageContent", "images", "name", "tags", "layout", "laptop", "mobile", "tablet", "desktop", "lgDesktop", "tag", "index", "ProductImage", "className", "onClick", "href", "ref", "containerClass", "ProductImage_default"]
7
7
  }
@@ -1,15 +1,12 @@
1
1
  import * as React from 'react';
2
2
  import type { BuyOneGetOneShelfProductCardSemanticName } from './types.js';
3
3
  export interface ProductInfoProps extends React.HTMLAttributes<HTMLDivElement> {
4
- /** 产品名称 */
5
4
  name: string;
6
- /** 产品描述 */
7
5
  description?: string;
8
6
  classNames?: Partial<Record<BuyOneGetOneShelfProductCardSemanticName, string>>;
9
7
  onClick?: () => void;
8
+ /** 产品链接(无 onClick 回调时自动使用 a 标签跳转) */
9
+ href?: string;
10
10
  }
11
- /**
12
- * ProductInfo - 产品信息区域
13
- */
14
11
  declare const ProductInfo: React.ForwardRefExoticComponent<ProductInfoProps & React.RefAttributes<HTMLDivElement>>;
15
12
  export default ProductInfo;
@@ -1,2 +1,2 @@
1
- "use client";import{jsx as o,jsxs as p}from"react/jsx-runtime";import*as m from"react";import{cn as e}from"../../helpers/index.js";import{Text as s}from"../../components/text.js";import{Heading as d}from"../../components/heading.js";const r=m.forwardRef(({name:i,description:a,onClick:n,className:c,classNames:t={}},l)=>p("div",{ref:l,className:e("text-info-primary flex w-full flex-col gap-1",c),children:[o(d,{as:"h4",size:2,html:i,className:e("line-clamp-1 ",t?.productCardTitle),onClick:()=>n?.()}),o(s,{size:2,html:a,className:e("desktop:text-[16px] lg-desktop:text-[18px] line-clamp-1",t?.productCardDescription)})]}));r.displayName="ProductInfo";var P=r;export{P as default};
1
+ "use client";import{jsx as t,jsxs as u}from"react/jsx-runtime";import*as s from"react";import{cn as e}from"../../helpers/index.js";import{Text as p}from"../../components/text.js";import{Heading as o}from"../../components/heading.js";import{LocalizedLink as f}from"../../shared/LocalizedLink.js";const c=s.forwardRef(({name:i,description:n,onClick:a,href:l,className:d,classNames:r={}},m)=>u("div",{ref:m,className:e("text-info-primary flex w-full flex-col gap-1",d),children:[a?t(o,{as:"h4",size:2,html:i,className:e("line-clamp-1 ",r?.productCardTitle),onClick:()=>a?.()}):l?t(f,{href:l,className:"block",children:t(o,{as:"h4",size:2,html:i,className:e("line-clamp-1 ",r?.productCardTitle)})}):t(o,{as:"h4",size:2,html:i,className:e("line-clamp-1 ",r?.productCardTitle)}),t(p,{size:2,html:n,className:e("desktop:text-[16px] lg-desktop:text-[18px] line-clamp-1",r?.productCardDescription)})]}));c.displayName="ProductInfo";var C=c;export{C as default};
2
2
  //# sourceMappingURL=ProductInfo.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/biz-components/BuyOneGetOneShelf/ProductInfo.tsx"],
4
- "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { cn } from '../../helpers/index.js'\nimport { Text } from '../../components/text.js'\nimport { Heading } from '../../components/heading.js'\nimport type { BuyOneGetOneShelfProductCardSemanticName } from './types.js'\n\nexport interface ProductInfoProps extends React.HTMLAttributes<HTMLDivElement> {\n /** \u4EA7\u54C1\u540D\u79F0 */\n name: string\n /** \u4EA7\u54C1\u63CF\u8FF0 */\n description?: string\n classNames?: Partial<Record<BuyOneGetOneShelfProductCardSemanticName, string>>\n onClick?: () => void\n}\n\n/**\n * ProductInfo - \u4EA7\u54C1\u4FE1\u606F\u533A\u57DF\n */\nconst ProductInfo = React.forwardRef<HTMLDivElement, ProductInfoProps>(\n ({ name, description, onClick, className, classNames = {} }, ref) => {\n return (\n <div ref={ref} className={cn('text-info-primary flex w-full flex-col gap-1', className)}>\n <Heading\n as=\"h4\"\n size={2}\n html={name}\n className={cn('line-clamp-1 ', classNames?.productCardTitle)}\n onClick={() => onClick?.()}\n />\n <Text\n size={2}\n html={description}\n className={cn('desktop:text-[16px] lg-desktop:text-[18px] line-clamp-1', classNames?.productCardDescription)}\n />\n </div>\n )\n }\n)\n\nProductInfo.displayName = 'ProductInfo'\n\nexport default ProductInfo\n"],
5
- "mappings": "aAuBM,OACE,OAAAA,EADF,QAAAC,MAAA,oBArBN,UAAYC,MAAW,QACvB,OAAS,MAAAC,MAAU,yBACnB,OAAS,QAAAC,MAAY,2BACrB,OAAS,WAAAC,MAAe,8BAexB,MAAMC,EAAcJ,EAAM,WACxB,CAAC,CAAE,KAAAK,EAAM,YAAAC,EAAa,QAAAC,EAAS,UAAAC,EAAW,WAAAC,EAAa,CAAC,CAAE,EAAGC,IAEzDX,EAAC,OAAI,IAAKW,EAAK,UAAWT,EAAG,+CAAgDO,CAAS,EACpF,UAAAV,EAACK,EAAA,CACC,GAAG,KACH,KAAM,EACN,KAAME,EACN,UAAWJ,EAAG,gBAAiBQ,GAAY,gBAAgB,EAC3D,QAAS,IAAMF,IAAU,EAC3B,EACAT,EAACI,EAAA,CACC,KAAM,EACN,KAAMI,EACN,UAAWL,EAAG,0DAA2DQ,GAAY,sBAAsB,EAC7G,GACF,CAGN,EAEAL,EAAY,YAAc,cAE1B,IAAOO,EAAQP",
6
- "names": ["jsx", "jsxs", "React", "cn", "Text", "Heading", "ProductInfo", "name", "description", "onClick", "className", "classNames", "ref", "ProductInfo_default"]
4
+ "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { cn } from '../../helpers/index.js'\nimport { Text } from '../../components/text.js'\nimport { Heading } from '../../components/heading.js'\nimport { LocalizedLink } from '../../shared/LocalizedLink.js'\nimport type { BuyOneGetOneShelfProductCardSemanticName } from './types.js'\n\nexport interface ProductInfoProps extends React.HTMLAttributes<HTMLDivElement> {\n name: string\n description?: string\n classNames?: Partial<Record<BuyOneGetOneShelfProductCardSemanticName, string>>\n onClick?: () => void\n /** \u4EA7\u54C1\u94FE\u63A5\uFF08\u65E0 onClick \u56DE\u8C03\u65F6\u81EA\u52A8\u4F7F\u7528 a \u6807\u7B7E\u8DF3\u8F6C\uFF09 */\n href?: string\n}\n\nconst ProductInfo = React.forwardRef<HTMLDivElement, ProductInfoProps>(\n ({ name, description, onClick, href, className, classNames = {} }, ref) => {\n return (\n <div ref={ref} className={cn('text-info-primary flex w-full flex-col gap-1', className)}>\n {onClick ? (\n <Heading\n as=\"h4\"\n size={2}\n html={name}\n className={cn('line-clamp-1 ', classNames?.productCardTitle)}\n onClick={() => onClick?.()}\n />\n ) : href ? (\n <LocalizedLink href={href} className=\"block\">\n <Heading as=\"h4\" size={2} html={name} className={cn('line-clamp-1 ', classNames?.productCardTitle)} />\n </LocalizedLink>\n ) : (\n <Heading as=\"h4\" size={2} html={name} className={cn('line-clamp-1 ', classNames?.productCardTitle)} />\n )}\n <Text\n size={2}\n html={description}\n className={cn('desktop:text-[16px] lg-desktop:text-[18px] line-clamp-1', classNames?.productCardDescription)}\n />\n </div>\n )\n }\n)\n\nProductInfo.displayName = 'ProductInfo'\n\nexport default ProductInfo\n"],
5
+ "mappings": "aAqBM,OAEI,OAAAA,EAFJ,QAAAC,MAAA,oBAnBN,UAAYC,MAAW,QACvB,OAAS,MAAAC,MAAU,yBACnB,OAAS,QAAAC,MAAY,2BACrB,OAAS,WAAAC,MAAe,8BACxB,OAAS,iBAAAC,MAAqB,gCAY9B,MAAMC,EAAcL,EAAM,WACxB,CAAC,CAAE,KAAAM,EAAM,YAAAC,EAAa,QAAAC,EAAS,KAAAC,EAAM,UAAAC,EAAW,WAAAC,EAAa,CAAC,CAAE,EAAGC,IAE/Db,EAAC,OAAI,IAAKa,EAAK,UAAWX,EAAG,+CAAgDS,CAAS,EACnF,UAAAF,EACCV,EAACK,EAAA,CACC,GAAG,KACH,KAAM,EACN,KAAMG,EACN,UAAWL,EAAG,gBAAiBU,GAAY,gBAAgB,EAC3D,QAAS,IAAMH,IAAU,EAC3B,EACEC,EACFX,EAACM,EAAA,CAAc,KAAMK,EAAM,UAAU,QACnC,SAAAX,EAACK,EAAA,CAAQ,GAAG,KAAK,KAAM,EAAG,KAAMG,EAAM,UAAWL,EAAG,gBAAiBU,GAAY,gBAAgB,EAAG,EACtG,EAEAb,EAACK,EAAA,CAAQ,GAAG,KAAK,KAAM,EAAG,KAAMG,EAAM,UAAWL,EAAG,gBAAiBU,GAAY,gBAAgB,EAAG,EAEtGb,EAACI,EAAA,CACC,KAAM,EACN,KAAMK,EACN,UAAWN,EAAG,0DAA2DU,GAAY,sBAAsB,EAC7G,GACF,CAGN,EAEAN,EAAY,YAAc,cAE1B,IAAOQ,EAAQR",
6
+ "names": ["jsx", "jsxs", "React", "cn", "Text", "Heading", "LocalizedLink", "ProductInfo", "name", "description", "onClick", "href", "className", "classNames", "ref", "ProductInfo_default"]
7
7
  }
@@ -139,6 +139,7 @@ export interface CopyConfig {
139
139
  freeGiftLabel: string;
140
140
  learnMoreText: string;
141
141
  freeGiftHeading: string;
142
+ soldOutText?: string;
142
143
  }
143
144
  /**
144
145
  * 买赠项目接口
@@ -199,6 +200,7 @@ export interface BuyOneGetOneShelfCardProps extends Omit<React.HTMLAttributes<HT
199
200
  gifts?: FreeGift[];
200
201
  /** 赠品类型 1-> 赠送其中一个赠品, 2 -> 赠送所有赠品 */
201
202
  giftType?: 1 | 2;
203
+ soldOutText?: string;
202
204
  /** 场景图片 */
203
205
  sceneImages?: ResponsiveImages;
204
206
  /** 布局模式(通常由父组件自动决定) */
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/biz-components/BuyOneGetOneShelf/types.ts"],
4
- "sourcesContent": ["import * as React from 'react'\nimport type { Theme } from '../../types/props'\n\n/**\n * \u514D\u8D39\u8D60\u54C1\u63A5\u53E3\n */\nexport interface FreeGift {\n /** \u8D60\u54C1ID */\n id: string\n /** \u8D60\u54C1\u56FE\u7247URL */\n image: string\n /** \u8D60\u54C1\u540D\u79F0 */\n name: string\n /** \u539F\u4EF7 */\n originalPrice: string\n /** \u73B0\u4EF7\uFF08\u901A\u5E38\u4E3AFree\uFF09 */\n currentPrice: string\n /** \u6570\u91CF */\n quantity: number\n /** \u53D8\u4F53ID */\n variantId: string\n /** SKU */\n sku: string\n /** \u53E5\u67C4 */\n handle: string\n /** \u8D60\u54C1tag */\n tag?: string\n}\n\n/**\n * \u5E26\u9009\u62E9\u72B6\u6001\u7684\u514D\u8D39\u8D60\u54C1\u63A5\u53E3\n */\nexport interface FreeGiftWithSelection extends FreeGift {\n /** \u662F\u5426\u5DF2\u9009\u4E2D */\n selected?: boolean\n}\n\n/**\n * \u4EA7\u54C1\u6807\u7B7E\u63A5\u53E3\n */\nexport interface ProductTag {\n /** \u6807\u7B7E\u6587\u672C */\n label: string\n /** \u6807\u7B7E\u6837\u5F0F\u53D8\u4F53 */\n variant: 'outline' | 'fill' | 'promotional'\n /** \u4FC3\u9500\u7C7B\u578B\uFF08\u4EC5\u5F53 variant \u4E3A 'promotional' \u65F6\u6709\u6548\uFF09 */\n promotionalType?: 'plus-member' | 'regular-member' | 'regular-discount' | 'time-limited-discount'\n}\n\n// Root \u7EC4\u4EF6\u76F8\u5173\u7684\u8BED\u4E49\u7C7B\u540D\nexport type BuyOneGetOneShelfRootSemanticName = 'root' | 'title' | 'description' | 'content' | 'viewMoreBtn'\n\n// ProductCard \u7EC4\u4EF6\u76F8\u5173\u7684\u8BED\u4E49\u7C7B\u540D\nexport type BuyOneGetOneShelfProductCardSemanticName =\n | 'productCard'\n | 'productCardImage'\n | 'productCardTitle'\n | 'productCardDescription'\n | 'productCardPriceLabel'\n | 'productCardPrice'\n | 'productCardOriginalPrice'\n | 'productCardGiftsContainer'\n | 'productCardBtnGroup'\n\n// \u5B8C\u6574\u7684\u8BED\u4E49\u7C7B\u540D\uFF08\u5411\u540E\u517C\u5BB9\uFF09\nexport type BuyOneGetOneShelfSemanticName = BuyOneGetOneShelfRootSemanticName | BuyOneGetOneShelfProductCardSemanticName\n\n/**\n * \u54CD\u5E94\u5F0F\u56FE\u7247\u63A5\u53E3\n */\nexport interface ResponsiveImage {\n id: number\n baseUrl?: string\n url: string\n thumbnailURL?: string\n filename?: string\n mimeType?: string\n width?: number\n height?: number\n}\n\n/**\n * \u54CD\u5E94\u5F0F\u56FE\u7247\u96C6\u5408\u63A5\u53E3\n */\nexport interface ResponsiveImages {\n laptop?: ResponsiveImage\n mobile?: ResponsiveImage\n tablet?: ResponsiveImage\n desktop?: ResponsiveImage\n lgDesktop?: ResponsiveImage\n}\n\n/**\n * \u4EA7\u54C1\u57FA\u7840\u6570\u636E\u63A5\u53E3\n */\nexport interface BaseProductData {\n sku: string\n name: string\n image: string\n value: string\n handle: string\n shopify_id: string\n}\n\nexport interface WithGiftData {\n /**\n * \u8D60\u54C1\n */\n gifts: FreeGift[]\n /**\n * \u8D60\u54C1\u7C7B\u578B 1-> \u8D60\u9001\u5176\u4E2D\u4E00\u4E2A\u8D60\u54C1\uFF0C 2 -> \u8D60\u9001\u6240\u6709\u8D60\u54C1\n */\n gift_type: 1 | 2\n}\n\n/**\n * \u7EAF\u4EA7\u54C1\u6570\u636E\u63A5\u53E3\uFF08\u4E0D\u5305\u542B\u8D60\u54C1\u4FE1\u606F\uFF09\n */\nexport interface PureProductData extends BaseProductData {\n /** \u4EA7\u54C1\u63CF\u8FF0 */\n description?: string\n /** \u5F53\u524D\u4EF7\u683C */\n currentPrice?: string\n /** \u539F\u4EF7 */\n originalPrice?: string\n /** \u4EF7\u683C\u6807\u7B7E\u6587\u672C\uFF08\u5982 \"Plus Member Price\"\uFF09 */\n priceLabel?: string\n /** \u4E86\u89E3\u66F4\u591A\u6309\u94AE\u6587\u672C */\n learnMoreText?: string\n /** \u7ACB\u5373\u8D2D\u4E70\u6309\u94AE\u6587\u672C */\n shopNowText?: string\n /** \u8D60\u54C1\u6807\u7B7E\u6587\u672C */\n freeGiftLabel?: string\n /** \u4EA7\u54C1\u6807\u7B7E */\n tags?: ProductTag[]\n /** \u8D60\u54C1\u9009\u62E9\u6A21\u5F0F */\n giftSelectionMode?: 'single' | 'multiple'\n availableForSale: boolean\n}\n\nexport interface ProductData extends BaseProductData, WithGiftData {\n /** \u4EA7\u54C1\u63CF\u8FF0 */\n description?: string\n /** \u5F53\u524D\u4EF7\u683C */\n currentPrice?: string\n /** \u539F\u4EF7 */\n originalPrice?: string\n /** \u4E86\u89E3\u66F4\u591A\u6309\u94AE\u6587\u672C */\n learnMoreText?: string\n /** \u7ACB\u5373\u8D2D\u4E70\u6309\u94AE\u6587\u672C */\n shopNowText?: string\n /** \u8D60\u54C1\u6807\u7B7E\u6587\u672C */\n freeGiftLabel?: string\n /** \u8D60\u54C1\u9009\u62E9\u6A21\u5F0F */\n giftSelectionMode?: 'single' | 'multiple'\n}\n\n// Alias for consistency with other components\nexport type ProductCardData = ProductData\n\n/**\n * \u6587\u6848\u914D\u7F6E\u63A5\u53E3\n */\nexport interface CopyConfig {\n shopNowText: string\n freeGiftLabel: string\n learnMoreText: string\n freeGiftHeading: string\n}\n\n/**\n * \u4E70\u8D60\u9879\u76EE\u63A5\u53E3\n */\nexport interface BogoItem {\n id: string\n data: ProductData[]\n images: ResponsiveImages\n shopNowFun: string\n shopNowText: string\n learnMoreText: string\n layout?: 'horizontal' | 'vertical'\n}\n\n/**\n * BuyOneGetOneShelf \u4E1A\u52A1\u7EC4\u4EF6\u6570\u636E\u63A5\u53E3 - \u65B0\u683C\u5F0F\n */\nexport interface BuyOneGetOneShelfData {\n copy: CopyConfig\n theme: string\n title: string\n subtitle: string\n bogoItems: BogoItem[]\n /** \u8D85\u8FC7\u6B64\u6570\u91CF\u7684\u5546\u54C1\u65F6\u663E\u793A\"View More/View Less\"\u6309\u94AE\uFF0C\u9ED8\u8BA4 4 */\n viewMoreThreshold?: number\n /** View More \u6309\u94AE\u6587\u6848\uFF0C\u9ED8\u8BA4 'View More' */\n viewMoreText?: string\n /** View Less \u6309\u94AE\u6587\u6848\uFF0C\u9ED8\u8BA4 'View Less' */\n viewLessText?: string\n}\n\n// Root \u7EC4\u4EF6 Props\uFF08\u65B0\u7684\u7EC4\u5408\u5F0F\u8BBE\u8BA1\uFF09\nexport interface BuyOneGetOneShelfProps extends React.HTMLAttributes<HTMLDivElement> {\n /** \u6807\u9898 */\n title?: string\n /** \u526F\u6807\u9898 */\n subtitle?: string\n theme?: Theme\n /** \u5B50\u7EC4\u4EF6 */\n children: React.ReactNode\n /** Root \u7EC4\u4EF6\u7684\u81EA\u5B9A\u4E49\u7C7B\u540D */\n classNames?: Partial<Record<BuyOneGetOneShelfRootSemanticName, string>>\n /** \u8D85\u8FC7\u6B64\u6570\u91CF\u7684\u5546\u54C1\u65F6\u663E\u793A\"View More/View Less\"\u6309\u94AE\uFF0C\u9ED8\u8BA4 4 */\n viewMoreThreshold?: number\n /** View More \u6309\u94AE\u6587\u6848\uFF0C\u9ED8\u8BA4 'View More' */\n viewMoreText?: string\n /** View Less \u6309\u94AE\u6587\u6848\uFF0C\u9ED8\u8BA4 'View Less' */\n viewLessText?: string\n}\n\n// \u5361\u7247\u7EC4\u4EF6Props - \u57FA\u4E8EProductCardProps\u4F46\u7B80\u5316\nexport interface BuyOneGetOneShelfCardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onClick'> {\n /** \u4EA7\u54C1\u6570\u636E */\n productData: BaseProductData & {\n description?: string\n currentPrice?: string\n originalPrice?: string\n learnMoreText?: string\n shopNowText?: string\n freeGiftLabel?: string\n }\n /** \u8D60\u54C1\u5217\u8868 */\n gifts?: FreeGift[]\n /** \u8D60\u54C1\u7C7B\u578B 1-> \u8D60\u9001\u5176\u4E2D\u4E00\u4E2A\u8D60\u54C1\uFF0C 2 -> \u8D60\u9001\u6240\u6709\u8D60\u54C1 */\n giftType?: 1 | 2\n /** \u573A\u666F\u56FE\u7247 */\n sceneImages?: ResponsiveImages\n /** \u5E03\u5C40\u6A21\u5F0F\uFF08\u901A\u5E38\u7531\u7236\u7EC4\u4EF6\u81EA\u52A8\u51B3\u5B9A\uFF09 */\n layout?: 'horizontal' | 'vertical'\n /** ProductCard \u7EC4\u4EF6\u7684\u81EA\u5B9A\u4E49\u7C7B\u540D */\n classNames?: Partial<Record<BuyOneGetOneShelfProductCardSemanticName, string>>\n /** @deprecated Use `onProductImageClick` instead. */\n onProductClick?: (product: ProductCardData) => void\n /** \u4EA7\u54C1\u56FE\u7247\u70B9\u51FB\u56DE\u8C03 */\n onProductImageClick?: (product: ProductCardData) => void\n /** Learn More \u70B9\u51FB\u56DE\u8C03 */\n onLearnMore?: (product: ProductCardData, selectedGifts: FreeGift[]) => void\n /** Shop Now \u70B9\u51FB\u56DE\u8C03 */\n onShopNow?: (product: ProductCardData, selectedGifts: FreeGift[]) => void\n /** \u8D60\u54C1\u70B9\u51FB\u56DE\u8C03 */\n onGiftClick?: (gift: FreeGift, selectedGifts: FreeGift[]) => void\n /** \u8D60\u54C1\u9009\u62E9\u53D8\u5316\u56DE\u8C03 */\n onGiftSelectionChange?: (selectedGifts: FreeGift[], product: ProductCardData) => void\n /** \u9009\u4E2D\u8D60\u54C1SKU\u53D8\u5316\u56DE\u8C03\uFF08\u53D7\u63A7\u7EC4\u4EF6\uFF09 */\n onSelectedGiftSkuChange?: (selectedSku: string | null) => void\n}\n\n// \u4FDD\u6301\u5411\u540E\u517C\u5BB9\u7684\u4F20\u7EDFProps\nexport interface BuyOneGetOneShelfLegacyProps extends React.HTMLAttributes<HTMLDivElement> {\n /** \u4E1A\u52A1\u6570\u636E */\n data: BuyOneGetOneShelfData\n /** @deprecated Use `onProductImageClick` instead. */\n onProductClick?: (product: ProductCardData) => void\n /** \u4EA7\u54C1\u56FE\u7247\u70B9\u51FB\u56DE\u8C03 */\n onProductImageClick?: (product: ProductCardData) => void\n /** Learn More\u6309\u94AE\u70B9\u51FB\u4E8B\u4EF6 */\n onLearnMore?: (product: ProductCardData, selectedGifts: FreeGift[]) => void\n /** Shop Now\u6309\u94AE\u70B9\u51FB\u4E8B\u4EF6 */\n onShopNow?: (product: ProductCardData, selectedGifts: FreeGift[]) => void\n onAddToCart?: (product: ProductCardData) => void\n /** \u8D60\u54C1\u70B9\u51FB\u4E8B\u4EF6 */\n onGiftClick?: (gift: FreeGift, selectedGifts: FreeGift[]) => void\n /** \u8D60\u54C1\u9009\u62E9\u53D8\u5316\u4E8B\u4EF6 */\n onGiftSelectionChange?: (selectedGifts: FreeGift[], product: ProductCardData) => void\n classNames?: Partial<Record<BuyOneGetOneShelfSemanticName, string>>\n}\n"],
4
+ "sourcesContent": ["import * as React from 'react'\nimport type { Theme } from '../../types/props'\n\n/**\n * \u514D\u8D39\u8D60\u54C1\u63A5\u53E3\n */\nexport interface FreeGift {\n /** \u8D60\u54C1ID */\n id: string\n /** \u8D60\u54C1\u56FE\u7247URL */\n image: string\n /** \u8D60\u54C1\u540D\u79F0 */\n name: string\n /** \u539F\u4EF7 */\n originalPrice: string\n /** \u73B0\u4EF7\uFF08\u901A\u5E38\u4E3AFree\uFF09 */\n currentPrice: string\n /** \u6570\u91CF */\n quantity: number\n /** \u53D8\u4F53ID */\n variantId: string\n /** SKU */\n sku: string\n /** \u53E5\u67C4 */\n handle: string\n /** \u8D60\u54C1tag */\n tag?: string\n}\n\n/**\n * \u5E26\u9009\u62E9\u72B6\u6001\u7684\u514D\u8D39\u8D60\u54C1\u63A5\u53E3\n */\nexport interface FreeGiftWithSelection extends FreeGift {\n /** \u662F\u5426\u5DF2\u9009\u4E2D */\n selected?: boolean\n}\n\n/**\n * \u4EA7\u54C1\u6807\u7B7E\u63A5\u53E3\n */\nexport interface ProductTag {\n /** \u6807\u7B7E\u6587\u672C */\n label: string\n /** \u6807\u7B7E\u6837\u5F0F\u53D8\u4F53 */\n variant: 'outline' | 'fill' | 'promotional'\n /** \u4FC3\u9500\u7C7B\u578B\uFF08\u4EC5\u5F53 variant \u4E3A 'promotional' \u65F6\u6709\u6548\uFF09 */\n promotionalType?: 'plus-member' | 'regular-member' | 'regular-discount' | 'time-limited-discount'\n}\n\n// Root \u7EC4\u4EF6\u76F8\u5173\u7684\u8BED\u4E49\u7C7B\u540D\nexport type BuyOneGetOneShelfRootSemanticName = 'root' | 'title' | 'description' | 'content' | 'viewMoreBtn'\n\n// ProductCard \u7EC4\u4EF6\u76F8\u5173\u7684\u8BED\u4E49\u7C7B\u540D\nexport type BuyOneGetOneShelfProductCardSemanticName =\n | 'productCard'\n | 'productCardImage'\n | 'productCardTitle'\n | 'productCardDescription'\n | 'productCardPriceLabel'\n | 'productCardPrice'\n | 'productCardOriginalPrice'\n | 'productCardGiftsContainer'\n | 'productCardBtnGroup'\n\n// \u5B8C\u6574\u7684\u8BED\u4E49\u7C7B\u540D\uFF08\u5411\u540E\u517C\u5BB9\uFF09\nexport type BuyOneGetOneShelfSemanticName = BuyOneGetOneShelfRootSemanticName | BuyOneGetOneShelfProductCardSemanticName\n\n/**\n * \u54CD\u5E94\u5F0F\u56FE\u7247\u63A5\u53E3\n */\nexport interface ResponsiveImage {\n id: number\n baseUrl?: string\n url: string\n thumbnailURL?: string\n filename?: string\n mimeType?: string\n width?: number\n height?: number\n}\n\n/**\n * \u54CD\u5E94\u5F0F\u56FE\u7247\u96C6\u5408\u63A5\u53E3\n */\nexport interface ResponsiveImages {\n laptop?: ResponsiveImage\n mobile?: ResponsiveImage\n tablet?: ResponsiveImage\n desktop?: ResponsiveImage\n lgDesktop?: ResponsiveImage\n}\n\n/**\n * \u4EA7\u54C1\u57FA\u7840\u6570\u636E\u63A5\u53E3\n */\nexport interface BaseProductData {\n sku: string\n name: string\n image: string\n value: string\n handle: string\n shopify_id: string\n}\n\nexport interface WithGiftData {\n /**\n * \u8D60\u54C1\n */\n gifts: FreeGift[]\n /**\n * \u8D60\u54C1\u7C7B\u578B 1-> \u8D60\u9001\u5176\u4E2D\u4E00\u4E2A\u8D60\u54C1\uFF0C 2 -> \u8D60\u9001\u6240\u6709\u8D60\u54C1\n */\n gift_type: 1 | 2\n}\n\n/**\n * \u7EAF\u4EA7\u54C1\u6570\u636E\u63A5\u53E3\uFF08\u4E0D\u5305\u542B\u8D60\u54C1\u4FE1\u606F\uFF09\n */\nexport interface PureProductData extends BaseProductData {\n /** \u4EA7\u54C1\u63CF\u8FF0 */\n description?: string\n /** \u5F53\u524D\u4EF7\u683C */\n currentPrice?: string\n /** \u539F\u4EF7 */\n originalPrice?: string\n /** \u4EF7\u683C\u6807\u7B7E\u6587\u672C\uFF08\u5982 \"Plus Member Price\"\uFF09 */\n priceLabel?: string\n /** \u4E86\u89E3\u66F4\u591A\u6309\u94AE\u6587\u672C */\n learnMoreText?: string\n /** \u7ACB\u5373\u8D2D\u4E70\u6309\u94AE\u6587\u672C */\n shopNowText?: string\n /** \u8D60\u54C1\u6807\u7B7E\u6587\u672C */\n freeGiftLabel?: string\n /** \u4EA7\u54C1\u6807\u7B7E */\n tags?: ProductTag[]\n /** \u8D60\u54C1\u9009\u62E9\u6A21\u5F0F */\n giftSelectionMode?: 'single' | 'multiple'\n availableForSale: boolean\n}\n\nexport interface ProductData extends BaseProductData, WithGiftData {\n /** \u4EA7\u54C1\u63CF\u8FF0 */\n description?: string\n /** \u5F53\u524D\u4EF7\u683C */\n currentPrice?: string\n /** \u539F\u4EF7 */\n originalPrice?: string\n /** \u4E86\u89E3\u66F4\u591A\u6309\u94AE\u6587\u672C */\n learnMoreText?: string\n /** \u7ACB\u5373\u8D2D\u4E70\u6309\u94AE\u6587\u672C */\n shopNowText?: string\n /** \u8D60\u54C1\u6807\u7B7E\u6587\u672C */\n freeGiftLabel?: string\n /** \u8D60\u54C1\u9009\u62E9\u6A21\u5F0F */\n giftSelectionMode?: 'single' | 'multiple'\n}\n\n// Alias for consistency with other components\nexport type ProductCardData = ProductData\n\n/**\n * \u6587\u6848\u914D\u7F6E\u63A5\u53E3\n */\nexport interface CopyConfig {\n shopNowText: string\n freeGiftLabel: string\n learnMoreText: string\n freeGiftHeading: string\n soldOutText?: string\n}\n\n/**\n * \u4E70\u8D60\u9879\u76EE\u63A5\u53E3\n */\nexport interface BogoItem {\n id: string\n data: ProductData[]\n images: ResponsiveImages\n shopNowFun: string\n shopNowText: string\n learnMoreText: string\n layout?: 'horizontal' | 'vertical'\n}\n\n/**\n * BuyOneGetOneShelf \u4E1A\u52A1\u7EC4\u4EF6\u6570\u636E\u63A5\u53E3 - \u65B0\u683C\u5F0F\n */\nexport interface BuyOneGetOneShelfData {\n copy: CopyConfig\n theme: string\n title: string\n subtitle: string\n bogoItems: BogoItem[]\n /** \u8D85\u8FC7\u6B64\u6570\u91CF\u7684\u5546\u54C1\u65F6\u663E\u793A\"View More/View Less\"\u6309\u94AE\uFF0C\u9ED8\u8BA4 4 */\n viewMoreThreshold?: number\n /** View More \u6309\u94AE\u6587\u6848\uFF0C\u9ED8\u8BA4 'View More' */\n viewMoreText?: string\n /** View Less \u6309\u94AE\u6587\u6848\uFF0C\u9ED8\u8BA4 'View Less' */\n viewLessText?: string\n}\n\n// Root \u7EC4\u4EF6 Props\uFF08\u65B0\u7684\u7EC4\u5408\u5F0F\u8BBE\u8BA1\uFF09\nexport interface BuyOneGetOneShelfProps extends React.HTMLAttributes<HTMLDivElement> {\n /** \u6807\u9898 */\n title?: string\n /** \u526F\u6807\u9898 */\n subtitle?: string\n theme?: Theme\n /** \u5B50\u7EC4\u4EF6 */\n children: React.ReactNode\n /** Root \u7EC4\u4EF6\u7684\u81EA\u5B9A\u4E49\u7C7B\u540D */\n classNames?: Partial<Record<BuyOneGetOneShelfRootSemanticName, string>>\n /** \u8D85\u8FC7\u6B64\u6570\u91CF\u7684\u5546\u54C1\u65F6\u663E\u793A\"View More/View Less\"\u6309\u94AE\uFF0C\u9ED8\u8BA4 4 */\n viewMoreThreshold?: number\n /** View More \u6309\u94AE\u6587\u6848\uFF0C\u9ED8\u8BA4 'View More' */\n viewMoreText?: string\n /** View Less \u6309\u94AE\u6587\u6848\uFF0C\u9ED8\u8BA4 'View Less' */\n viewLessText?: string\n}\n\n// \u5361\u7247\u7EC4\u4EF6Props - \u57FA\u4E8EProductCardProps\u4F46\u7B80\u5316\nexport interface BuyOneGetOneShelfCardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onClick'> {\n /** \u4EA7\u54C1\u6570\u636E */\n productData: BaseProductData & {\n description?: string\n currentPrice?: string\n originalPrice?: string\n learnMoreText?: string\n shopNowText?: string\n freeGiftLabel?: string\n }\n /** \u8D60\u54C1\u5217\u8868 */\n gifts?: FreeGift[]\n /** \u8D60\u54C1\u7C7B\u578B 1-> \u8D60\u9001\u5176\u4E2D\u4E00\u4E2A\u8D60\u54C1\uFF0C 2 -> \u8D60\u9001\u6240\u6709\u8D60\u54C1 */\n giftType?: 1 | 2\n soldOutText?: string\n /** \u573A\u666F\u56FE\u7247 */\n sceneImages?: ResponsiveImages\n /** \u5E03\u5C40\u6A21\u5F0F\uFF08\u901A\u5E38\u7531\u7236\u7EC4\u4EF6\u81EA\u52A8\u51B3\u5B9A\uFF09 */\n layout?: 'horizontal' | 'vertical'\n /** ProductCard \u7EC4\u4EF6\u7684\u81EA\u5B9A\u4E49\u7C7B\u540D */\n classNames?: Partial<Record<BuyOneGetOneShelfProductCardSemanticName, string>>\n /** @deprecated Use `onProductImageClick` instead. */\n onProductClick?: (product: ProductCardData) => void\n /** \u4EA7\u54C1\u56FE\u7247\u70B9\u51FB\u56DE\u8C03 */\n onProductImageClick?: (product: ProductCardData) => void\n /** Learn More \u70B9\u51FB\u56DE\u8C03 */\n onLearnMore?: (product: ProductCardData, selectedGifts: FreeGift[]) => void\n /** Shop Now \u70B9\u51FB\u56DE\u8C03 */\n onShopNow?: (product: ProductCardData, selectedGifts: FreeGift[]) => void\n /** \u8D60\u54C1\u70B9\u51FB\u56DE\u8C03 */\n onGiftClick?: (gift: FreeGift, selectedGifts: FreeGift[]) => void\n /** \u8D60\u54C1\u9009\u62E9\u53D8\u5316\u56DE\u8C03 */\n onGiftSelectionChange?: (selectedGifts: FreeGift[], product: ProductCardData) => void\n /** \u9009\u4E2D\u8D60\u54C1SKU\u53D8\u5316\u56DE\u8C03\uFF08\u53D7\u63A7\u7EC4\u4EF6\uFF09 */\n onSelectedGiftSkuChange?: (selectedSku: string | null) => void\n}\n\n// \u4FDD\u6301\u5411\u540E\u517C\u5BB9\u7684\u4F20\u7EDFProps\nexport interface BuyOneGetOneShelfLegacyProps extends React.HTMLAttributes<HTMLDivElement> {\n /** \u4E1A\u52A1\u6570\u636E */\n data: BuyOneGetOneShelfData\n /** @deprecated Use `onProductImageClick` instead. */\n onProductClick?: (product: ProductCardData) => void\n /** \u4EA7\u54C1\u56FE\u7247\u70B9\u51FB\u56DE\u8C03 */\n onProductImageClick?: (product: ProductCardData) => void\n /** Learn More\u6309\u94AE\u70B9\u51FB\u4E8B\u4EF6 */\n onLearnMore?: (product: ProductCardData, selectedGifts: FreeGift[]) => void\n /** Shop Now\u6309\u94AE\u70B9\u51FB\u4E8B\u4EF6 */\n onShopNow?: (product: ProductCardData, selectedGifts: FreeGift[]) => void\n onAddToCart?: (product: ProductCardData) => void\n /** \u8D60\u54C1\u70B9\u51FB\u4E8B\u4EF6 */\n onGiftClick?: (gift: FreeGift, selectedGifts: FreeGift[]) => void\n /** \u8D60\u54C1\u9009\u62E9\u53D8\u5316\u4E8B\u4EF6 */\n onGiftSelectionChange?: (selectedGifts: FreeGift[], product: ProductCardData) => void\n classNames?: Partial<Record<BuyOneGetOneShelfSemanticName, string>>\n}\n"],
5
5
  "mappings": "AAAA,MAAuB",
6
6
  "names": []
7
7
  }
@@ -22,9 +22,9 @@ export interface StateIcon {
22
22
  export interface EventScheduleItem {
23
23
  /** 标题 */
24
24
  title: string;
25
- /** 开始日期(ISO 8601 格式或任何 dayjs 支持的格式,如 '2024-12-01') */
25
+ /** 开始日期(ISO 8601 格式,如 '2024-12-01T00:00:00Z') */
26
26
  startDate: string;
27
- /** 结束日期(ISO 8601 格式或任何 dayjs 支持的格式,如 '2024-12-31') */
27
+ /** 结束日期(ISO 8601 格式,如 '2024-12-31T23:59:59Z') */
28
28
  endDate: string;
29
29
  /**
30
30
  * 卡片背景图标配置,状态化图标(必须包含 active 和 inactive)
@@ -1,2 +1,2 @@
1
- "use client";import{jsx as s,jsxs as g}from"react/jsx-runtime";import*as n from"react";import{cn as d}from"../../helpers/index.js";import{withLayout as B}from"../../shared/Styles.js";import{Text as y,Picture as P,Heading as R,Container as z}from"../../components/index.js";import{Swiper as D,SwiperSlide as L}from"swiper/react";import w from"dayjs";import{cva as x}from"class-variance-authority";const S=(e,r)=>{const c=w(),u=w(e).startOf("day"),m=w(r).endOf("day");return c.isAfter(m)?"completed":c.isBefore(u)?"not-started":"in-progress"},j=x("h-1 w-full overflow-hidden",{variants:{state:{"in-progress-light":"bg-[#F6CD4E]","in-progress-dark":"bg-[#D79941]","not-started-light":"bg-[#EAEAEC]","not-started-dark":"bg-[#1E2024]","completed-light":"bg-[#F6CD4E]","completed-dark":"bg-[#D79941]"}},defaultVariants:{state:"not-started-light"}}),H=x("size-4 rounded-full transition-colors",{variants:{state:{"in-progress-light":"bg-[#F6CD4E]","in-progress-dark":"bg-[#D79941]","not-started-light":"bg-[#EAEAEC]","not-started-dark":"bg-[#1E2024]","completed-light":"bg-[#F6CD4E]","completed-dark":"bg-[#D79941]"}},defaultVariants:{state:"not-started-light"}}),k=x("font-bold leading-[1.2]",{variants:{state:{"in-progress-light":"text-[#080A0F]","in-progress-dark":"text-white","not-started-light":"text-[#080A0F]","not-started-dark":"text-[#F5F6F7]","completed-light":"text-[#4A4C56]/60","completed-dark":"text-[#F5F6F7]/60"}},defaultVariants:{state:"not-started-light"}}),O=x("laptop:h-[160px] rounded-box relative flex h-[120px] min-w-0 flex-col justify-between gap-2 overflow-hidden",{variants:{state:{"in-progress-light":"bg-[#F4E8BC]","in-progress-dark":"bg-[#D79941]","not-started-light":"bg-[#EAEAEC]","not-started-dark":"bg-[#1E2024]","completed-light":"bg-[#F4E8BC]","completed-dark":"bg-[#D79941]"}},defaultVariants:{state:"not-started-light"}}),q=({timeStatus:e,theme:r="light",className:c,index:u,nodeLength:m})=>{const o=`${e}-${r}`,i=u===0,l=u===m-1;return g("div",{className:d(`event-schedule-timeline-node event-schedule-timeline-node--${e} relative my-2 flex h-1 w-full items-center justify-center`,c),children:[s("div",{className:d(`event-schedule-timeline-progress event-schedule-timeline-progress--${e}`,j({state:o}),i&&"rounded-l-full",l&&"rounded-r-full")}),s("div",{className:"absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2",children:s("div",{className:d(`event-schedule-timeline-dot event-schedule-timeline-dot--${e}`,H({state:o}))})})]})},G=(e,r)=>{if(e)return r==="in-progress"?e.active:r==="completed"&&e.completed||e.inactive},J=({timeStatus:e,item:r,theme:c="light",className:u,scheduleCount:m})=>{const o=n.useMemo(()=>G(r.icon,e),[r.icon,e]),i=`${e}-${c}`;return g("div",{className:d(`event-schedule-card event-schedule-card--${e}`,O({state:i}),u),children:[o&&s("div",{className:`event-schedule-card__background-icon event-schedule-card__background-icon--${e} laptop:w-[128px] desktop:w-[160px] absolute bottom-0 right-0 z-10 w-[120px]`,children:s(P,{source:o.url,alt:o.alt,className:"aspect-square"})}),g("div",{className:`event-schedule-card__content event-schedule-card__content--${e} tablet:px-4 tablet:py-3 desktop:pl-6 desktop:pr-16 relative z-20 flex h-full flex-col justify-between p-4 pr-8`,children:[s(R,{html:r.title,className:d(`event-schedule-card__title event-schedule-card__title--${e}`,m>=4?"desktop:text-[24px]":"desktop:text-[32px]","laptop:text-[24px] line-clamp-1 text-[20px]",k({state:i}))}),s("div",{className:`event-schedule-card__details event-schedule-card__details--${e} flex flex-col gap-0.5`,children:r.items.map((l,a)=>g("div",{className:`event-schedule-card__detail-item event-schedule-card__detail-item--${e} flex items-center gap-2`,children:[l.icon&&s(y,{className:d(`event-schedule-card__detail-icon event-schedule-card__detail-icon--${e} desktop:size-6 size-5 shrink-0`,k({state:i})),html:l.icon}),s(y,{html:l.label,className:d(`event-schedule-card__detail-text event-schedule-card__detail-text--${e} lg-desktop:text-[18px] desktop:text-[16px] line-clamp-1 flex-1 text-[14px] leading-[1.4]`,k({state:i}))})]},a))})]})]})},F=n.forwardRef(({classNames:e={},data:r,className:c,...u},m)=>{const o=r.theme||"light",i=n.useRef(null),l=n.useRef(null),a=n.useRef(!1),f=n.useMemo(()=>r?.scheduleList?.length||2,[r?.scheduleList]),v=n.useMemo(()=>r.scheduleList.findIndex(t=>S(t.startDate,t.endDate)==="in-progress"),[r.scheduleList]),b=n.useCallback((t,h=!1)=>{const p=M=>{switch(M){case"mobile":return{slidesPerView:1.17};case"tablet":return t===2?{slidesPerView:2}:{slidesPerView:2.4};case"laptop":return t===2?{}:t===4?{slidesPerView:3.2}:{slidesPerView:t};case"desktop":return t===2?{slidesPerView:2}:{slidesPerView:t}}},T=p("mobile"),C=p("tablet"),N=p("laptop"),_=p("desktop");return h?{0:{...T,spaceBetween:12},768:{...C,spaceBetween:12},1024:{...N,spaceBetween:16},1440:{..._,spaceBetween:16}}:{0:T,768:C,1024:N,1440:_}},[]),V=n.useMemo(()=>b(f,!0),[f,b]),$=n.useMemo(()=>b(f,!1),[f,b]),E=r.showTimeline!==!1,A=n.useCallback(t=>{a.current||!l.current||(a.current=!0,l.current.slideTo(t.activeIndex,t.params.speed),setTimeout(()=>{a.current=!1},50))},[]),I=n.useCallback(t=>{a.current||!i.current||(a.current=!0,i.current.slideTo(t.activeIndex,t.params.speed),setTimeout(()=>{a.current=!1},50))},[]);return n.useEffect(()=>{i.current&&l.current&&v>=0&&setTimeout(()=>{a.current=!0,i.current?.slideTo(v,500),l.current?.slideTo(v,500),setTimeout(()=>{a.current=!1},600)},100)},[v]),g(z,{...u,ref:m,className:d("event-schedule-root overflow-hidden",e?.root,c),children:[E&&s(D,{breakpoints:$,className:"event-schedule-timeline h-4 w-full !overflow-visible",onSwiper:t=>{l.current=t},onSlideChange:I,children:r.scheduleList.map((t,h)=>{const p=S(t.startDate,t.endDate);return s(L,{className:"",children:s(q,{className:e?.timeline,timeStatus:p,theme:o,index:h,nodeLength:r.scheduleList.length})},"timelineNode"+h)})}),s(D,{breakpoints:V,className:"event-schedule-cards w-full !overflow-visible",onSwiper:t=>{i.current=t},onSlideChange:A,children:r.scheduleList.map((t,h)=>{const p=S(t.startDate,t.endDate);return s(L,{children:s(J,{timeStatus:p,className:d(E?"laptop:mt-4 mt-2":"",e?.eventScheduleCard),item:t,theme:o,scheduleCount:r.scheduleList.length})},"SwiperSlideItem"+h)})})]})});F.displayName="EventSchedule";var Z=B(F);export{Z as default};
1
+ "use client";import{jsx as s,jsxs as g}from"react/jsx-runtime";import*as n from"react";import{cn as d}from"../../helpers/index.js";import{withLayout as A}from"../../shared/Styles.js";import{Text as _,Picture as B,Heading as P,Container as R}from"../../components/index.js";import{Swiper as D,SwiperSlide as y}from"swiper/react";import{cva as b}from"class-variance-authority";const x=(e,r)=>{const c=Date.now(),u=new Date(e).getTime(),m=new Date(r).getTime();return c>m?"completed":c<u?"not-started":"in-progress"},z=b("h-1 w-full overflow-hidden",{variants:{state:{"in-progress-light":"bg-[#F6CD4E]","in-progress-dark":"bg-[#D79941]","not-started-light":"bg-[#EAEAEC]","not-started-dark":"bg-[#1E2024]","completed-light":"bg-[#F6CD4E]","completed-dark":"bg-[#D79941]"}},defaultVariants:{state:"not-started-light"}}),H=b("size-4 rounded-full transition-colors",{variants:{state:{"in-progress-light":"bg-[#F6CD4E]","in-progress-dark":"bg-[#D79941]","not-started-light":"bg-[#EAEAEC]","not-started-dark":"bg-[#1E2024]","completed-light":"bg-[#F6CD4E]","completed-dark":"bg-[#D79941]"}},defaultVariants:{state:"not-started-light"}}),S=b("font-bold leading-[1.2]",{variants:{state:{"in-progress-light":"text-[#080A0F]","in-progress-dark":"text-white","not-started-light":"text-[#080A0F]","not-started-dark":"text-[#F5F6F7]","completed-light":"text-[#4A4C56]/60","completed-dark":"text-[#F5F6F7]/60"}},defaultVariants:{state:"not-started-light"}}),j=b("laptop:h-[160px] rounded-box relative flex h-[120px] min-w-0 flex-col justify-between gap-2 overflow-hidden",{variants:{state:{"in-progress-light":"bg-[#F4E8BC]","in-progress-dark":"bg-[#D79941]","not-started-light":"bg-[#EAEAEC]","not-started-dark":"bg-[#1E2024]","completed-light":"bg-[#F4E8BC]","completed-dark":"bg-[#D79941]"}},defaultVariants:{state:"not-started-light"}}),q=({timeStatus:e,theme:r="light",className:c,index:u,nodeLength:m})=>{const o=`${e}-${r}`,i=u===0,l=u===m-1;return g("div",{className:d(`event-schedule-timeline-node event-schedule-timeline-node--${e} relative my-2 flex h-1 w-full items-center justify-center`,c),children:[s("div",{className:d(`event-schedule-timeline-progress event-schedule-timeline-progress--${e}`,z({state:o}),i&&"rounded-l-full",l&&"rounded-r-full")}),s("div",{className:"absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2",children:s("div",{className:d(`event-schedule-timeline-dot event-schedule-timeline-dot--${e}`,H({state:o}))})})]})},G=(e,r)=>{if(e)return r==="in-progress"?e.active:r==="completed"&&e.completed||e.inactive},J=({timeStatus:e,item:r,theme:c="light",className:u,scheduleCount:m})=>{const o=n.useMemo(()=>G(r.icon,e),[r.icon,e]),i=`${e}-${c}`;return g("div",{className:d(`event-schedule-card event-schedule-card--${e}`,j({state:i}),u),children:[o&&s("div",{className:`event-schedule-card__background-icon event-schedule-card__background-icon--${e} laptop:w-[128px] desktop:w-[160px] absolute bottom-0 right-0 z-10 w-[120px]`,children:s(B,{source:o.url,alt:o.alt,className:"aspect-square"})}),g("div",{className:`event-schedule-card__content event-schedule-card__content--${e} tablet:px-4 tablet:py-3 desktop:pl-6 desktop:pr-16 relative z-20 flex h-full flex-col justify-between p-4 pr-8`,children:[s(P,{html:r.title,className:d(`event-schedule-card__title event-schedule-card__title--${e}`,m>=4?"desktop:text-[24px]":"desktop:text-[32px]","laptop:text-[24px] line-clamp-1 text-[20px]",S({state:i}))}),s("div",{className:`event-schedule-card__details event-schedule-card__details--${e} flex flex-col gap-0.5`,children:r.items.map((l,a)=>g("div",{className:`event-schedule-card__detail-item event-schedule-card__detail-item--${e} flex items-center gap-2`,children:[l.icon&&s(_,{className:d(`event-schedule-card__detail-icon event-schedule-card__detail-icon--${e} desktop:size-6 size-5 shrink-0`,S({state:i})),html:l.icon}),s(_,{html:l.label,className:d(`event-schedule-card__detail-text event-schedule-card__detail-text--${e} lg-desktop:text-[18px] desktop:text-[16px] line-clamp-1 flex-1 text-[14px] leading-[1.4]`,S({state:i}))})]},a))})]})]})},L=n.forwardRef(({classNames:e={},data:r,className:c,...u},m)=>{const o=r.theme||"light",i=n.useRef(null),l=n.useRef(null),a=n.useRef(!1),f=n.useMemo(()=>r?.scheduleList?.length||2,[r?.scheduleList]),v=n.useMemo(()=>r.scheduleList.findIndex(t=>x(t.startDate,t.endDate)==="in-progress"),[r.scheduleList]),w=n.useCallback((t,h=!1)=>{const p=M=>{switch(M){case"mobile":return{slidesPerView:1.17};case"tablet":return t===2?{slidesPerView:2}:{slidesPerView:2.4};case"laptop":return t===2?{}:t===4?{slidesPerView:3.2}:{slidesPerView:t};case"desktop":return t===2?{slidesPerView:2}:{slidesPerView:t}}},T=p("mobile"),E=p("tablet"),C=p("laptop"),N=p("desktop");return h?{0:{...T,spaceBetween:12},768:{...E,spaceBetween:12},1024:{...C,spaceBetween:16},1440:{...N,spaceBetween:16}}:{0:T,768:E,1024:C,1440:N}},[]),F=n.useMemo(()=>w(f,!0),[f,w]),V=n.useMemo(()=>w(f,!1),[f,w]),k=r.showTimeline!==!1,$=n.useCallback(t=>{a.current||!l.current||(a.current=!0,l.current.slideTo(t.activeIndex,t.params.speed),setTimeout(()=>{a.current=!1},50))},[]),I=n.useCallback(t=>{a.current||!i.current||(a.current=!0,i.current.slideTo(t.activeIndex,t.params.speed),setTimeout(()=>{a.current=!1},50))},[]);return n.useEffect(()=>{i.current&&l.current&&v>=0&&setTimeout(()=>{a.current=!0,i.current?.slideTo(v,500),l.current?.slideTo(v,500),setTimeout(()=>{a.current=!1},600)},100)},[v]),g(R,{...u,ref:m,className:d("event-schedule-root overflow-hidden",e?.root,c),children:[k&&s(D,{breakpoints:V,className:"event-schedule-timeline h-4 w-full !overflow-visible",onSwiper:t=>{l.current=t},onSlideChange:I,children:r.scheduleList.map((t,h)=>{const p=x(t.startDate,t.endDate);return s(y,{className:"",children:s(q,{className:e?.timeline,timeStatus:p,theme:o,index:h,nodeLength:r.scheduleList.length})},"timelineNode"+h)})}),s(D,{breakpoints:F,className:"event-schedule-cards w-full !overflow-visible",onSwiper:t=>{i.current=t},onSlideChange:$,children:r.scheduleList.map((t,h)=>{const p=x(t.startDate,t.endDate);return s(y,{children:s(J,{timeStatus:p,className:d(k?"laptop:mt-4 mt-2":"",e?.eventScheduleCard),item:t,theme:o,scheduleCount:r.scheduleList.length})},"SwiperSlideItem"+h)})})]})});L.displayName="EventSchedule";var X=A(L);export{X as default};
2
2
  //# sourceMappingURL=index.js.map