feat(v3.4.14): mini-user store UX, brand config, client settings

Store list/detail package flow, configurable WeChat mini brand assets and customer service, shop H5 home refresh.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-06 15:21:59 +08:00
parent 53a79d1255
commit a2abbb6169
29 changed files with 1408 additions and 513 deletions
@@ -7,6 +7,8 @@ type ProductCarouselProps = {
alt: string;
variant?: 'home' | 'detail' | 'store';
previewable?: boolean;
/** cover=aspectFill 裁剪铺满;contain=aspectFit 缩放完整显示(门店门头固定区) */
imageFit?: 'cover' | 'contain';
};
/** 商品/门店轮播(对齐 h5 ProductCarousel 三变体) */
@@ -15,12 +17,14 @@ export default function ProductCarousel({
alt,
variant = 'detail',
previewable = false,
imageFit = 'cover',
}: ProductCarouselProps) {
const slides = images.length > 0 ? images : [''];
const [activeIndex, setActiveIndex] = useState(0);
const prefix =
variant === 'store' ? 'store-detail-carousel' : variant === 'home' ? 'home-carousel' : 'detail-carousel';
const imageMode = 'aspectFill';
const isContain = imageFit === 'contain';
const wrapClass = `${prefix}-wrap${isContain ? ` ${prefix}-wrap--contain` : ''}`;
function previewAt(index: number) {
const urls = slides.filter(Boolean);
@@ -30,7 +34,7 @@ export default function ProductCarousel({
}
return (
<View className={`${prefix}-wrap`}>
<View className={wrapClass}>
<Swiper
className={prefix}
circular={slides.length > 1}
@@ -42,7 +46,7 @@ export default function ProductCarousel({
<Image
className={`${prefix}-image`}
src={src}
mode={imageMode}
mode={isContain ? 'aspectFit' : 'aspectFill'}
alt={alt}
onClick={previewable ? () => previewAt(index) : undefined}
/>