@anker-in/headless-ui 1.3.78 → 1.3.79

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 (45) hide show
  1. package/dist/cjs/biz-components/HeroBanner/HeroBanner.js +1 -1
  2. package/dist/cjs/biz-components/HeroBanner/HeroBannerCarousel.d.ts +9 -10
  3. package/dist/cjs/biz-components/HeroBanner/HeroBannerCarousel.js +1 -1
  4. package/dist/cjs/biz-components/HeroBanner/index.d.ts +3 -0
  5. package/dist/cjs/biz-components/HeroBanner/index.js +1 -1
  6. package/dist/cjs/biz-components/HeroBanner/mediaResolver.d.ts +58 -0
  7. package/dist/cjs/biz-components/HeroBanner/mediaResolver.js +1 -0
  8. package/dist/cjs/biz-components/HeroBanner/types.d.ts +116 -8
  9. package/dist/cjs/biz-components/HeroBanner/types.js +1 -1
  10. package/dist/cjs/biz-components/SecondaryBanner/SecondaryBannerCarousel.d.ts +9 -9
  11. package/dist/cjs/biz-components/SecondaryBanner/SecondaryBannerCarousel.js +1 -1
  12. package/dist/cjs/biz-components/SecondaryBanner/index.d.ts +53 -6
  13. package/dist/cjs/biz-components/SecondaryBanner/index.js +1 -1
  14. package/dist/cjs/biz-components/index.d.ts +1 -0
  15. package/dist/cjs/biz-components/index.js +1 -1
  16. package/dist/cjs/helpers/ScrollLoadVideo.js +1 -1
  17. package/dist/cjs/hooks/useCarouselPlayback.d.ts +110 -0
  18. package/dist/cjs/hooks/useCarouselPlayback.js +1 -0
  19. package/dist/cjs/index.d.ts +4 -0
  20. package/dist/cjs/index.js +1 -1
  21. package/dist/cjs/shared/CarouselControls.d.ts +75 -0
  22. package/dist/cjs/shared/CarouselControls.js +1 -0
  23. package/dist/esm/biz-components/HeroBanner/HeroBanner.js +1 -1
  24. package/dist/esm/biz-components/HeroBanner/HeroBannerCarousel.d.ts +9 -10
  25. package/dist/esm/biz-components/HeroBanner/HeroBannerCarousel.js +1 -1
  26. package/dist/esm/biz-components/HeroBanner/index.d.ts +3 -0
  27. package/dist/esm/biz-components/HeroBanner/index.js +1 -1
  28. package/dist/esm/biz-components/HeroBanner/mediaResolver.d.ts +58 -0
  29. package/dist/esm/biz-components/HeroBanner/mediaResolver.js +1 -0
  30. package/dist/esm/biz-components/HeroBanner/types.d.ts +116 -8
  31. package/dist/esm/biz-components/SecondaryBanner/SecondaryBannerCarousel.d.ts +9 -9
  32. package/dist/esm/biz-components/SecondaryBanner/SecondaryBannerCarousel.js +1 -1
  33. package/dist/esm/biz-components/SecondaryBanner/index.d.ts +53 -6
  34. package/dist/esm/biz-components/SecondaryBanner/index.js +1 -1
  35. package/dist/esm/biz-components/index.d.ts +1 -0
  36. package/dist/esm/biz-components/index.js +1 -1
  37. package/dist/esm/helpers/ScrollLoadVideo.js +1 -1
  38. package/dist/esm/hooks/useCarouselPlayback.d.ts +110 -0
  39. package/dist/esm/hooks/useCarouselPlayback.js +1 -0
  40. package/dist/esm/index.d.ts +4 -0
  41. package/dist/esm/index.js +1 -1
  42. package/dist/esm/shared/CarouselControls.d.ts +75 -0
  43. package/dist/esm/shared/CarouselControls.js +1 -0
  44. package/package.json +1 -1
  45. package/style.css +32 -23
@@ -0,0 +1,58 @@
1
+ import type { Media } from '../../types/props.js';
2
+ /**
3
+ * 5-breakpoint media tiers, mapped to the Tailwind preset boundaries:
4
+ * lgDesktop ≥1920 | desktop 1440-1919 | laptop 1025-1439 | tablet 768-1024 | mobile <768
5
+ */
6
+ export type MediaTier = 'lgDesktop' | 'desktop' | 'laptop' | 'tablet' | 'mobile';
7
+ export type MediaKind = 'image' | 'video';
8
+ /**
9
+ * Structured per-tier media bag. `media.sources[tier]` takes precedence over
10
+ * the flat fields for the same tier.
11
+ */
12
+ export interface TieredMediaSources {
13
+ sources?: Partial<Record<MediaTier, {
14
+ image?: Media;
15
+ video?: Media;
16
+ }>>;
17
+ }
18
+ /**
19
+ * All media-bearing fields the resolver understands. Both HeroBannerProps['data']
20
+ * and HeroBannerSlideData structurally satisfy this interface.
21
+ */
22
+ export interface TieredMediaFields {
23
+ /** Legacy PC tier (≥1025) — mapped to the `laptop` tier */
24
+ pcImage?: Media;
25
+ /** Legacy pad tier (768-1024) — mapped to the `tablet` tier */
26
+ padImage?: Media;
27
+ /** Legacy mobile tier (<768) — mapped to the `mobile` tier */
28
+ mobileImage?: Media;
29
+ pcVideo?: Media;
30
+ padVideo?: Media;
31
+ mobileVideo?: Media;
32
+ /** New-tier flat fields (CMS parity) */
33
+ lgDesktopImage?: Media;
34
+ desktopImage?: Media;
35
+ lgDesktopVideo?: Media;
36
+ desktopVideo?: Media;
37
+ /** Optional structured form — takes precedence over flat fields */
38
+ media?: TieredMediaSources;
39
+ }
40
+ /**
41
+ * Resolve the effective media for a tier, walking the tier fallback chain.
42
+ * Returns undefined when nothing in the chain resolves.
43
+ */
44
+ export declare const resolveTierMedia: (data: TieredMediaFields, tier: MediaTier, kind: MediaKind) => Media | undefined;
45
+ /**
46
+ * Build a Picture `source` string covering all 5 tiers. Only tiers that
47
+ * resolve are emitted; unresolved tiers simply fall through to the next
48
+ * matching <source> (which the resolver chain already filled where possible).
49
+ * Legacy 3-field data produces output that renders pixel-identically to the
50
+ * legacy hand-written descriptor.
51
+ */
52
+ export declare const buildPictureSource: (data: TieredMediaFields) => string;
53
+ /**
54
+ * SSR-safe 5-tier detection matching the Tailwind preset boundaries exactly.
55
+ * When no query matches (SSR / tests with all-false mock) the desktop-most
56
+ * tier is returned, mirroring the legacy "default to PC" behavior.
57
+ */
58
+ export declare const useMediaTier: () => MediaTier;
@@ -0,0 +1 @@
1
+ "use client";import{useMediaQuery as r}from"react-responsive";const d={lgDesktop:["lgDesktop","desktop","laptop","tablet","mobile"],desktop:["desktop","lgDesktop","laptop","tablet","mobile"],laptop:["laptop","desktop","lgDesktop","tablet","mobile"],tablet:["tablet","mobile","laptop","desktop","lgDesktop"],mobile:["mobile","tablet","laptop","desktop","lgDesktop"]},s={lgDesktop:["lgDesktop","desktop","laptop","tablet","mobile"],desktop:["desktop","lgDesktop","laptop","tablet","mobile"],laptop:["laptop","desktop","lgDesktop","tablet","mobile"],tablet:["tablet","laptop","mobile","desktop","lgDesktop"],mobile:["mobile","tablet","laptop","desktop","lgDesktop"]},l=(e,t,i)=>{const o=e.media?.sources?.[t]?.[i];if(o)return o;if(i==="image")switch(t){case"lgDesktop":return e.lgDesktopImage;case"desktop":return e.desktopImage;case"laptop":return e.pcImage;case"tablet":return e.padImage;case"mobile":return e.mobileImage}switch(t){case"lgDesktop":return e.lgDesktopVideo;case"desktop":return e.desktopVideo;case"laptop":return e.pcVideo;case"tablet":return e.padVideo;case"mobile":return e.mobileVideo}},n=(e,t,i)=>{const o=(i==="image"?d:s)[t];for(const p of o){const a=l(e,p,i);if(a?.url)return a}},m=[{tier:"lgDesktop"},{tier:"desktop",breakpoint:1919},{tier:"laptop",breakpoint:1439},{tier:"tablet",breakpoint:1024},{tier:"mobile",breakpoint:767}],b=e=>{const t=[];for(const{tier:i,breakpoint:o}of m){const p=n(e,i,"image")?.url;p&&t.push(o?`${p} ${o}`:p)}return t.join(", ")},k=()=>{const e=r({query:"(max-width: 767px)"}),t=r({query:"(min-width: 768px) and (max-width: 1024px)"}),i=r({query:"(min-width: 1025px) and (max-width: 1439px)"}),o=r({query:"(min-width: 1440px) and (max-width: 1919px)"});return e?"mobile":t?"tablet":i?"laptop":o?"desktop":"lgDesktop"};export{b as buildPictureSource,n as resolveTierMedia,k as useMediaTier};
@@ -1,9 +1,70 @@
1
1
  import type { ButtonProps } from '../../components/button.js';
2
2
  import type { Media, Theme } from '../../types/props.js';
3
3
  type TitleSizeType = '5' | '4' | '3' | '2' | '1';
4
+ /** 5-breakpoint media tier keys (Tailwind preset boundaries). */
5
+ export type HeroBannerMediaTier = 'lgDesktop' | 'desktop' | 'laptop' | 'tablet' | 'mobile';
4
6
  /**
5
- * Carousel navigation configuration for HeroBanner. v1: arrows only.
6
- * autoplay, dots, and progress are intentionally EXCLUDED from v1.
7
+ * Structured per-tier media. `media.sources[tier]` takes precedence over the
8
+ * flat fields (`lgDesktopImage`/`desktopImage`/legacy `pcImage`/`padImage`/`mobileImage`).
9
+ */
10
+ export interface HeroBannerTieredMedia {
11
+ sources: Partial<Record<HeroBannerMediaTier, {
12
+ image?: Media;
13
+ video?: Media;
14
+ }>>;
15
+ }
16
+ /** New-tier flat fields + structured media, shared by banner data and slides. */
17
+ export interface HeroBannerTieredMediaFields {
18
+ /** ≥1920 image (CMS flat field) */
19
+ lgDesktopImage?: Media;
20
+ /** 1440-1919 image (CMS flat field) */
21
+ desktopImage?: Media;
22
+ /** ≥1920 video (CMS flat field) */
23
+ lgDesktopVideo?: Media;
24
+ /** 1440-1919 video (CMS flat field) */
25
+ desktopVideo?: Media;
26
+ /** Structured 5-tier media — takes precedence over the flat fields */
27
+ media?: HeroBannerTieredMedia;
28
+ }
29
+ /** Video multi-theme window (D19): times are seconds relative to the video playhead. */
30
+ export interface HeroBannerMultiThemeFields {
31
+ /** Enable playhead-driven theme switching for this video frame @default false */
32
+ isMultiThemeEnabled?: boolean;
33
+ theme_1?: 'light' | 'dark';
34
+ /** Window 1 start (seconds, inclusive) */
35
+ star_time_1?: number;
36
+ /** Window 1 end (seconds, exclusive) */
37
+ end_time_1?: number;
38
+ theme_2?: 'light' | 'dark';
39
+ /** Window 2 start (seconds, inclusive) */
40
+ star_time_2?: number;
41
+ /** Window 2 end (seconds, exclusive) */
42
+ end_time_2?: number;
43
+ }
44
+ /**
45
+ * Accessibility label overrides for HeroBanner carousel controls.
46
+ * All labels default to English; override per-locale as needed.
47
+ */
48
+ export interface HeroBannerA11yLabels {
49
+ /** Accessible name for the previous-slide arrow @default 'Previous slide' */
50
+ prevSlide?: string;
51
+ /** Accessible name for the next-slide arrow @default 'Next slide' */
52
+ nextSlide?: string;
53
+ /** Accessible name for the pause button while autoplaying @default 'Pause autoplay' */
54
+ pauseAutoplay?: string;
55
+ /** Accessible name for the play button while stopped @default 'Play autoplay' */
56
+ playAutoplay?: string;
57
+ /** Accessible name for the corner video button while the video is playing @default 'Pause video' */
58
+ pauseVideo?: string;
59
+ /** Accessible name for the corner video button while the video is paused @default 'Play video' */
60
+ playVideo?: string;
61
+ /** Slide status noun, used as `{slideStatus} {n} / {total}` @default 'Slide' */
62
+ slideStatus?: string;
63
+ /** Accessible name for the carousel region @default 'Banner carousel' */
64
+ carouselLabel?: string;
65
+ }
66
+ /**
67
+ * Carousel navigation configuration for HeroBanner.
7
68
  */
8
69
  export interface HeroBannerCarouselConfig {
9
70
  /**
@@ -12,15 +73,32 @@ export interface HeroBannerCarouselConfig {
12
73
  * @default true
13
74
  */
14
75
  showArrows?: boolean;
76
+ /**
77
+ * Unified size applied to all carousel frames (CMS 轮播配置 → 尺寸).
78
+ * Takes precedence over top-level data.size in carousel mode.
79
+ */
80
+ size?: 'default' | 'sm';
81
+ /**
82
+ * @deprecated The legacy Swiper bullet dots are replaced by the fixed
83
+ * segmented progress + pause/play control cluster. This field is kept for
84
+ * type compatibility only and no longer affects rendering.
85
+ */
15
86
  showDots?: boolean;
87
+ /**
88
+ * @deprecated Loop is always enabled; this field is ignored.
89
+ */
16
90
  loop?: boolean;
91
+ /**
92
+ * 全局默认自动轮播间隔(秒)。`999` / 缺省 / `<5` = 不自动轮播(静态展示首帧)。
93
+ * 可被单帧 `items[i].autoplaySeconds`(1-30 秒)覆盖。
94
+ */
17
95
  autoplaySeconds?: number;
18
96
  }
19
97
  /**
20
98
  * Per-slide data for HeroBanner carousel mode.
21
99
  * Mirrors the single-banner data shape; no nested carousels allowed in v1.
22
100
  */
23
- export interface HeroBannerSlideData {
101
+ export interface HeroBannerSlideData extends HeroBannerTieredMediaFields, HeroBannerMultiThemeFields {
24
102
  title: string;
25
103
  subtitle: string;
26
104
  pcImage: Media;
@@ -62,6 +140,11 @@ export interface HeroBannerSlideData {
62
140
  customTertiaryEventId?: string;
63
141
  } & Omit<ButtonProps, 'children'>;
64
142
  theme?: Theme;
143
+ /**
144
+ * 单帧轮播间隔(秒),覆盖全局默认间隔。可选范围 1-30 秒,不允许 999;
145
+ * 缺省/无效值时回退全局 `carousel.autoplaySeconds`。
146
+ */
147
+ autoplaySeconds?: number;
65
148
  size?: 'default' | 'sm';
66
149
  titleSize?: TitleSizeType;
67
150
  align?: 'left' | 'center';
@@ -90,6 +173,16 @@ export interface HeroBannerProps extends Omit<React.HTMLAttributes<HTMLDivElemen
90
173
  pcVideo?: Media;
91
174
  padVideo?: Media;
92
175
  mobileVideo?: Media;
176
+ /** ≥1920 image (CMS flat field) */
177
+ lgDesktopImage?: Media;
178
+ /** 1440-1919 image (CMS flat field) */
179
+ desktopImage?: Media;
180
+ /** ≥1920 video (CMS flat field) */
181
+ lgDesktopVideo?: Media;
182
+ /** 1440-1919 video (CMS flat field) */
183
+ desktopVideo?: Media;
184
+ /** Structured 5-tier media — takes precedence over the flat fields */
185
+ media?: HeroBannerTieredMedia;
93
186
  isShowVideo?: boolean;
94
187
  /** 视频是否循环播放 */
95
188
  isVideoLoop?: boolean;
@@ -127,7 +220,11 @@ export interface HeroBannerProps extends Omit<React.HTMLAttributes<HTMLDivElemen
127
220
  } & Omit<ButtonProps, 'children'>;
128
221
  /** 主题 */
129
222
  theme?: Theme;
130
- /** 大小, 默认default,单banner, 可选sm, 用于多banner场景 */
223
+ /**
224
+ * 大小, 默认default,单banner。default 使用 5 档固定高度表(560/560/400/560/800)。
225
+ * `sm`(多 banner 场景的旧等比高度)保留可用。
226
+ * @deprecated 变体 `sm` 已废弃,仅存量兼容保留;新页面请使用 `default`。
227
+ */
131
228
  size?: 'default' | 'sm';
132
229
  titleSize?: TitleSizeType;
133
230
  /** 内容对齐方式 */
@@ -137,8 +234,14 @@ export interface HeroBannerProps extends Omit<React.HTMLAttributes<HTMLDivElemen
137
234
  title: string;
138
235
  }>;
139
236
  /**
140
- * Carousel slide items. When present and non-empty, activates carousel mode.
141
- * Single-banner mode is used when this field is absent or empty.
237
+ * 展示模式(CMS 配置)。'single' 时强制单帧渲染并忽略 items——
238
+ * 兼容线上"轮播数据未清"的脏数据场景(1505)。
239
+ */
240
+ mode?: 'single' | 'carousel';
241
+ /**
242
+ * Carousel slide items. When present and non-empty, activates carousel mode
243
+ * (unless mode === 'single'). Single-banner mode is used when this field is
244
+ * absent or empty.
142
245
  * DECISION-002: items absence = legacy single-banner path.
143
246
  */
144
247
  items?: HeroBannerSlideData[];
@@ -153,8 +256,13 @@ export interface HeroBannerProps extends Omit<React.HTMLAttributes<HTMLDivElemen
153
256
  */
154
257
  enableParallax?: boolean;
155
258
  };
156
- onSecondaryClick?: (data: any, e: any, customPrimaryEventId?: string) => void;
157
- onPrimaryClick?: (data: any, e: any, customSecondaryEventId?: string) => void;
259
+ onSecondaryClick?: (data: any, e: any, customSecondaryEventId?: string) => void;
260
+ onPrimaryClick?: (data: any, e: any, customPrimaryEventId?: string) => void;
158
261
  onTertiaryClick?: (data: any, e: any, customTertiaryEventId?: string) => void;
262
+ /**
263
+ * Accessibility label overrides for carousel controls (arrows, pause/play,
264
+ * replay, live announcements). Defaults are English.
265
+ */
266
+ a11yLabels?: HeroBannerA11yLabels;
159
267
  }
160
268
  export {};
@@ -1,21 +1,21 @@
1
1
  import React from 'react';
2
- import type { SecondaryBannerData, SecondaryBannerSemanticName, JumpOptions } from './index.js';
2
+ import type { SecondaryBannerA11yLabels, SecondaryBannerData, SecondaryBannerSemanticName, JumpOptions } from './index.js';
3
3
  import 'swiper/css';
4
- import 'swiper/css/navigation';
5
- import 'swiper/css/pagination';
6
4
  interface SecondaryBannerCarouselProps extends React.HTMLAttributes<HTMLElement> {
7
5
  data: SecondaryBannerData;
8
6
  classNames?: Partial<Record<SecondaryBannerSemanticName, string>>;
9
7
  jumpOptions?: JumpOptions;
8
+ a11yLabels?: SecondaryBannerA11yLabels;
10
9
  }
11
10
  /**
12
- * SecondaryBannerCarousel — arrows-only Navigation Swiper wrapping SecondaryBanner slides.
11
+ * SecondaryBannerCarousel — Swiper carousel sharing HeroBanner's playback
12
+ * state machine (useCarouselPlayback, plan §3/§9 Iter 3).
13
13
  *
14
- * Architecture:
15
- * - DECISION-A007: Navigation only, loop=false, slidesPerView=1
16
- * - DECISION-A005: isActive pass-through to SecondaryBanner; querySelectorAll for video pause
17
- * - DECISION-008: SecondaryBanner.isActive => autoPlay={isActive ?? true}
18
- * - DECISION-A006: arrow buttons at z-[20], above any overlay
14
+ * Frames are image-only this round: no video play-once/replay/multi-theme —
15
+ * the hook's video-specific surface stays unwired. The legacy
16
+ * `carousel.autoplaySeconds` keeps its old semantics (`> 0` enables, clamped
17
+ * to ≥3s); `showDots`/`loop` are deprecated and ignored (fixed segmented
18
+ * progress + pause/play cluster, loop always on).
19
19
  */
20
20
  declare const SecondaryBannerCarousel: React.ForwardRefExoticComponent<SecondaryBannerCarouselProps & React.RefAttributes<HTMLElement>>;
21
21
  export default SecondaryBannerCarousel;
@@ -1 +1 @@
1
- "use client";import{jsx as n,jsxs as d}from"react/jsx-runtime";import w,{useRef as b,useCallback as O,useState as h,useEffect as v}from"react";import{Swiper as I,SwiperSlide as H}from"swiper/react";import{Navigation as S,Pagination as x,Autoplay as q}from"swiper/modules";import{cn as k}from"../../helpers/index.js";import V from"./index.js";import{secondaryBannerVariants as J}from"./index.js";import"swiper/css";import"swiper/css/navigation";import"swiper/css/pagination";const W=()=>d("svg",{className:"lg-desktop:size-14 size-10",viewBox:"0 0 40 40",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",children:[n("circle",{cx:"20",cy:"20",r:"20",fill:"currentColor",fillOpacity:"0.2"}),n("path",{d:"M23 13L16 20L23 27",stroke:"white",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})]}),$=()=>d("svg",{className:"lg-desktop:size-14 size-10",viewBox:"0 0 40 40",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",children:[n("circle",{cx:"20",cy:"20",r:"20",fill:"currentColor",fillOpacity:"0.2"}),n("path",{d:"M17 13L24 20L17 27",stroke:"white",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})]}),C=w.forwardRef(({data:f,className:L,classNames:E,jumpOptions:N,..._},B)=>{const s=f.items||[],m=f.carousel,T=f.size??"base",a=b(null),[M,z]=h(0),[l,R]=h(null);v(()=>{const e=a.current;!e||!l||e.pagination&&(e.pagination.el=l,e.pagination.init(),e.pagination.render(),e.pagination.update())},[l]);const y=(s[M]?.theme??"light")==="dark";v(()=>{const e=()=>{const t=a.current;if(t)if(document.visibilityState==="hidden")t.autoplay?.stop();else{t.autoplay?.start();const i=t.realIndex??0;c.current.forEach((r,u)=>{r.current&&r.current.querySelectorAll("video").forEach(p=>{u!==i&&p.pause()})})}};return document.addEventListener("visibilitychange",e),()=>document.removeEventListener("visibilitychange",e)},[]);const c=b(s.map(()=>w.createRef())),j=(m?.showArrows??!0)&&s.length>1,g=m?.showDots??!0,o=m?.autoplaySeconds??void 0,A=o!=null&&o>0?[S,x,q]:[S,x],P=o!=null&&o>0?{delay:Math.max(o*1e3,3e3),disableOnInteraction:!1}:!1,D=O(e=>{const t=e.realIndex;c.current.forEach((r,u)=>{u!==t&&r.current&&r.current.querySelectorAll("video").forEach(p=>{p.pause(),p.currentTime=0})});const i=c.current[t];i?.current&&i.current.querySelectorAll("video").forEach(r=>{r.paused&&r.play()?.catch(()=>{})}),z(t)},[]);return d("section",{ref:B,className:k("secondary-banner-carousel group relative w-full overflow-hidden",J({size:T}),{"aiui-dark":y},L),..._,children:[n(I,{onSwiper:e=>a.current=e,onSlideChange:D,modules:A,slidesPerView:1,loop:!0,initialSlide:0,allowTouchMove:!0,autoplay:P,pagination:g?{clickable:!0,el:l,renderBullet:(e,t)=>`<span class="${t} banner-dot"></span>`}:!1,children:s.map((e,t)=>n(H,{children:({isActive:i})=>n("div",{ref:c.current[t],children:n(V,{data:e,isActive:i,classNames:E,jumpOptions:N})})},t))}),j&&d("div",{className:"pointer-events-none absolute inset-0 z-20 flex items-center justify-between px-4",children:[n("button",{type:"button",className:"tablet:flex pointer-events-auto hidden scale-95 items-center justify-center opacity-0 transition-all duration-300 ease-out hover:scale-105 focus-visible:scale-105 group-focus-within:scale-100 group-focus-within:opacity-100 group-hover:scale-100 group-hover:opacity-100",onClick:()=>a.current?.slidePrev(),"aria-label":"Previous banner",children:n(W,{})}),n("button",{type:"button",className:"tablet:flex pointer-events-auto hidden scale-95 items-center justify-center opacity-0 transition-all duration-300 ease-out hover:scale-105 focus-visible:scale-105 group-focus-within:scale-100 group-focus-within:opacity-100 group-hover:scale-100 group-hover:opacity-100",onClick:()=>a.current?.slideNext(),"aria-label":"Next banner",children:n($,{})})]}),g&&n("div",{ref:R,style:{"--swiper-pagination-bottom":"0px"},className:k("secondary-banner-pagination swiper-pagination lg-desktop:!bottom-6 [&_.banner-dot.swiper-pagination-bullet-active]:bg-info-primary [&_.banner-dot]:bg-info-quaternary absolute !bottom-4 !left-1/2 z-20 flex !w-auto !-translate-x-1/2 items-center justify-center gap-2 [&_.banner-dot.swiper-pagination-bullet-active]:h-2 [&_.banner-dot.swiper-pagination-bullet-active]:w-8 [&_.banner-dot.swiper-pagination-bullet-active]:rounded-full [&_.banner-dot]:size-2 [&_.banner-dot]:rounded-full [&_.banner-dot]:transition-all [&_.banner-dot]:duration-300 [&_.banner-dot]:ease-out [&_.swiper-pagination-bullet]:m-0 [&_.swiper-pagination-bullet]:shrink-0 [&_.swiper-pagination-bullet]:opacity-100",{"aiui-dark":y})})]})});C.displayName="SecondaryBannerCarousel";var ne=C;export{ne as default};
1
+ "use client";import{jsx as o,jsxs as ye}from"react/jsx-runtime";import R,{useCallback as p,useEffect as oe,useRef as V,useState as N}from"react";import{Swiper as se,SwiperSlide as ie}from"swiper/react";import{cn as x}from"../../helpers/index.js";import{useCarouselPlayback as le}from"../../hooks/useCarouselPlayback.js";import{CarouselArrows as ce,CarouselCornerToggle as ue,CarouselProgressControls as de}from"../../shared/CarouselControls.js";import pe from"./index.js";import{secondaryBannerVariants as me}from"./index.js";import"swiper/css";const Se={prevSlide:"Previous banner",nextSlide:"Next banner",pauseAutoplay:"Pause autoplay",playAutoplay:"Play autoplay",pauseVideo:"Pause video",playVideo:"Play video",slideStatus:"Slide",carouselLabel:"Banner carousel"},M=R.forwardRef(({data:m,className:F,classNames:I,jumpOptions:k,a11yLabels:D,...H},c)=>{const a=m.items||[],S=m.carousel,h=S?.size??m.size??"base",t={...Se,...D},q=V(null),s=V(a.map(()=>R.createRef())),y=S?.autoplaySeconds,d=a.length>1&&y!=null&&y>0,b=d?Math.max(y,3):void 0,z=p(()=>b,[b]),O=p(e=>{s.current.forEach((r,l)=>{l!==e&&r.current&&r.current.querySelectorAll("video").forEach(g=>{g.pause(),g.currentTime=0})});const n=s.current[e];n?.current&&n.current.querySelectorAll("video").forEach(r=>{r.currentTime=0,r.play()?.catch(()=>{})})},[]),{rootRef:L,activeIndex:i,playbackState:$,resetNonce:j,announcement:J,activeFrameIntervalSec:C,isTimerRunning:_,handleSwiperInit:U,handleSlideChange:W,handleTransitionEnd:Y,handleSliderFirstMove:G,goToSlide:T,goToSlideIndex:K,handlePausePlayClick:Q,handleFocus:X,handleBlur:Z}=le({frameCount:a.length,resolveFrameIntervalSec:z,isAutoplayEnabled:d,swiperRef:q,slideStatusLabel:t.slideStatus,onSlideMediaSync:O,onPauseToggle:(e,n)=>{s.current[n]?.current?.querySelectorAll("video")?.forEach(l=>{e?l.pause():l.ended||l.play()?.catch(()=>{})})}}),ee=p(e=>{L.current=e,typeof c=="function"?c(e):c&&(c.current=e)},[c,L]),v=p(e=>{const n=a[e];return n?[n.pcImage,n.padImage,n.mobileImage].some(r=>r?.mimeType?.startsWith("video/")):!1},[a])(i),[f,E]=N(null),[A,w]=N(null);oe(()=>{if(E(null),w(null),!v)return;const e=s.current[i]?.current?.querySelector("video");if(!e)return;const n=()=>E(e.ended?"ended":e.paused?"paused":"playing"),r=()=>w(Number.isFinite(e.duration)?e.duration:null);return n(),r(),e.addEventListener("play",n),e.addEventListener("pause",n),e.addEventListener("ended",n),e.addEventListener("loadedmetadata",r),()=>{e.removeEventListener("play",n),e.removeEventListener("pause",n),e.removeEventListener("ended",n),e.removeEventListener("loadedmetadata",r)}},[i,v]);const P=C!==void 0,u=!P&&v&&A!==null&&A>5&&f!=="ended"&&f!==null,ne=P||u,re=u?f==="paused":$==="STOPPED",ae=()=>{if(!u){Q();return}const e=s.current[i]?.current?.querySelector("video");e&&(e.paused?e.play()?.catch(()=>{}):e.pause())},B=a[i]?.theme??"light",te=(S?.showArrows??!0)&&a.length>1;return ye("section",{ref:ee,role:"region","aria-roledescription":"carousel","aria-label":t.carouselLabel,onFocus:X,onBlur:Z,className:x("secondary-banner-carousel group relative w-full overflow-hidden",me({size:h}),F),...H,children:[o(se,{onSwiper:U,onSlideChange:W,onSlideChangeTransitionEnd:Y,onSliderFirstMove:G,slidesPerView:1,loop:!0,initialSlide:0,allowTouchMove:!0,children:a.map((e,n)=>o(ie,{children:({isActive:r})=>o("div",{ref:s.current[n],role:"group","aria-roledescription":"slide","aria-label":`${t.slideStatus} ${n+1} / ${a.length}`,className:x({"aiui-dark":e.theme==="dark"}),children:o(pe,{data:{...e,size:h},isActive:r,classNames:I,jumpOptions:k})})},n))}),te&&o(ce,{onPrev:()=>T("prev"),onNext:()=>T("next"),prevLabel:t.prevSlide,nextLabel:t.nextSlide}),d&&o(de,{frameCount:a.length,activeIndex:i,resetNonce:j,activeFrameIntervalSec:C,isAutoplayEnabled:d,isTimerRunning:_,onSegmentClick:K,segmentLabel:e=>`${t.slideStatus} ${e+1} / ${a.length}`,classPrefix:"secondary-banner",theme:B}),ne&&o(ue,{isPaused:re,onToggle:ae,pausedLabel:u?t.playVideo:t.playAutoplay,playingLabel:u?t.pauseVideo:t.pauseAutoplay,classPrefix:"secondary-banner",theme:B}),o("div",{"aria-live":"polite","aria-atomic":"true",className:"sr-only",children:J})]})});M.displayName="SecondaryBannerCarousel";var Ae=M;export{Ae as default};
@@ -3,18 +3,60 @@ import type { Media as MediaType, Theme } from '../../types/props.js';
3
3
  import type { ButtonProps } from '../../components/button.js';
4
4
  export type SecondaryBannerSemanticName = 'root' | 'title' | 'superTitle' | 'subtitle' | 'content' | 'buttonGroup' | 'primaryButton' | 'secondaryButton';
5
5
  /**
6
- * Carousel navigation configuration for SecondaryBanner. v1: arrows only.
7
- * autoplay, dots, and progress are intentionally EXCLUDED from v1.
6
+ * Accessibility label overrides for the SecondaryBanner carousel controls.
7
+ * All labels default to English; override per-locale as needed.
8
+ */
9
+ export interface SecondaryBannerA11yLabels {
10
+ /** Accessible name for the previous-slide arrow @default 'Previous banner' */
11
+ prevSlide?: string;
12
+ /** Accessible name for the next-slide arrow @default 'Next banner' */
13
+ nextSlide?: string;
14
+ /** Accessible name for the pause button while autoplaying @default 'Pause autoplay' */
15
+ pauseAutoplay?: string;
16
+ /** Accessible name for the play button while stopped @default 'Play autoplay' */
17
+ playAutoplay?: string;
18
+ /** Accessible name for the corner video button while the video is playing @default 'Pause video' */
19
+ pauseVideo?: string;
20
+ /** Accessible name for the corner video button while the video is paused @default 'Play video' */
21
+ playVideo?: string;
22
+ /** Slide status noun, used as `{slideStatus} {n} / {total}` @default 'Slide' */
23
+ slideStatus?: string;
24
+ /** Accessible name for the carousel region @default 'Banner carousel' */
25
+ carouselLabel?: string;
26
+ }
27
+ /**
28
+ * Carousel navigation configuration for SecondaryBanner.
29
+ * Iter 3: the carousel shares HeroBanner's playback state machine
30
+ * (useCarouselPlayback) and renders the fixed segmented progress + pause/play
31
+ * control cluster.
8
32
  */
9
33
  export interface SecondaryBannerCarouselConfig {
10
34
  /**
11
- * Show prev/next arrow navigation controls.
35
+ * Show prev/next arrow navigation controls (≥1025 only).
12
36
  * Only used when data.items has 2+ slides.
13
37
  * @default true
14
38
  */
15
39
  showArrows?: boolean;
40
+ /**
41
+ * Unified size applied to all carousel frames (CMS 轮播配置 → 尺寸).
42
+ * Takes precedence over top-level data.size in carousel mode.
43
+ */
44
+ size?: 'sm' | 'base' | 'lg' | 'xlg';
45
+ /**
46
+ * @deprecated The legacy Swiper bullet dots are replaced by the fixed
47
+ * segmented progress + pause/play control cluster. This field is kept for
48
+ * type compatibility only and no longer affects rendering.
49
+ */
16
50
  showDots?: boolean;
51
+ /**
52
+ * @deprecated Loop is always enabled; this field is ignored.
53
+ */
17
54
  loop?: boolean;
55
+ /**
56
+ * Autoplay interval in seconds (frames are image-only, so a single interval
57
+ * applies to every frame). `> 0` enables autoplay (clamped to ≥3s);
58
+ * absent / ≤ 0 disables it and renders a static first frame.
59
+ */
18
60
  autoplaySeconds?: number;
19
61
  }
20
62
  /**
@@ -132,9 +174,9 @@ export interface SecondaryBannerData {
132
174
  */
133
175
  items?: SecondaryBannerSlideData[];
134
176
  /**
135
- * Display mode: 'single' renders the first frame only; 'carousel' activates Swiper.
136
- * Mirrors the CMS `mode` field (single | carousel). Defaults to single-banner path
137
- * when absent (backward-compatible with legacy data that has no mode field).
177
+ * Display mode hint mirrored from the CMS `mode` field (single | carousel).
178
+ * Carousel activation is driven by `items` presence (DECISION-002, same as
179
+ * HeroBanner); this field is informational and kept for CMS compatibility.
138
180
  */
139
181
  mode?: 'single' | 'carousel';
140
182
  /**
@@ -159,6 +201,11 @@ export interface SecondaryBannerProps extends React.HTMLAttributes<HTMLElement>
159
201
  * @default true
160
202
  */
161
203
  isActive?: boolean;
204
+ /**
205
+ * Accessibility label overrides for carousel controls (arrows, pause/play,
206
+ * live announcements). Defaults are English.
207
+ */
208
+ a11yLabels?: SecondaryBannerA11yLabels;
162
209
  }
163
210
  declare const _default: React.ForwardRefExoticComponent<Omit<SecondaryBannerProps & React.RefAttributes<HTMLElement>, "container" | keyof import("../../shared/Styles.js").StylesProps> & import("../../shared/Styles.js").StylesProps & import("../index.js").ContainerProps & React.RefAttributes<unknown>> & {
164
211
  readonly $$typeof: symbol;
@@ -1 +1 @@
1
- "use client";import{jsx as t,jsxs as p}from"react/jsx-runtime";import*as T from"react";import{cva as F}from"class-variance-authority";import v from"jump.js";import{cn as n,getLocalizedPath as I}from"../../helpers/index.js";import{Text as S,Button as z,Heading as W,Picture as $,Countdown as q}from"../../components/index.js";import{withLayout as G}from"../../shared/Styles.js";import K from"../Media/index.js";import{useAiuiContext as Q}from"../AiuiProvider/index.js";import U from"./SecondaryBannerCarousel.js";const X=F("text-info-primary relative w-full",{variants:{size:{sm:"tablet:aspect-[768/480] laptop:aspect-[1920/480] desktop:aspect-[1920/480] lg-desktop:aspect-[1920/480] aspect-[390/480]",base:"tablet:aspect-[768/660] laptop:aspect-[1920/720] desktop:aspect-[1920/720] lg-desktop:aspect-[1920/720] aspect-[390/660]",lg:"tablet:aspect-[768/660] laptop:aspect-[1920/930] desktop:aspect-[1920/930] lg-desktop:aspect-[1920/930] aspect-[390/660]",xlg:"tablet:aspect-[768/660] laptop:aspect-[1920/930] desktop:aspect-[1920/930] lg-desktop:aspect-[1920/930] aspect-[390/660] overflow-visible"}},defaultVariants:{size:"base"}}),C=T.forwardRef(({className:u,classNames:a={},data:e,jumpOptions:g={},isActive:M,...b},y)=>{const{pcImage:D,padImage:N,mobileImage:L,isVideoLoop:A,endDate:f,endDate_tz:O,dateFormat:P,size:w,iconArray:c,theme:_,primaryButton:o,secondaryButton:i,title:j,titleTag:H}=e,V=A??!0,m=w??"base",E=_??"light",J=H??"h2",{locale:x="us"}=Q(),h={...{duration:500,offset:0},...g},d=T.useId(),l=j?`${d}-title`:void 0,k=e.subtitle?`${d}-subtitle`:void 0,B=e.superTitle?`${d}-super-title`:void 0,R=[B,k].filter(Boolean).join(" ")||void 0;return e.mode==="carousel"&&e.items&&e.items.length>0?t(U,{data:e,className:u,classNames:a,jumpOptions:g,ref:y,...b}):p("section",{ref:y,role:"banner","aria-labelledby":l,"aria-describedby":R,className:n({"aiui-dark":E==="dark"},X({size:m}),u,a?.root),...b,children:[t("div",{className:n("absolute inset-0",{"h-fit":m==="xlg"}),children:t(K,{pcImage:D,padImage:N,mobileImage:L,className:"size-full",imgClassName:"object-cover",videoClassName:"object-cover",muted:!0,loop:V,playsInline:!0,autoPlay:M??!0})}),p("div",{className:n("banner-content laptop:top-1/2 laptop:-translate-y-1/2 tablet:px-[32px] laptop:px-[64px] lg-desktop:px-[calc(50%-832px)] absolute top-12 z-10 flex flex-col items-start justify-center px-[16px] text-left",a?.content),children:[p("div",{className:"banner-inner-title desktop:gap-2 flex flex-col items-start gap-1",children:[e.superTitle&&t(S,{as:"p",size:2,id:B,className:n("banner-super-title desktop:text-[16px] lg-desktop:text-[18px]",a?.superTitle),html:e.superTitle}),e.title&&t(W,{as:J,size:["xlg","lg"].includes(m)?5:4,id:l,className:n("banner-title ",a?.title),html:e.title}),e.subtitle&&t(S,{as:"p",size:3,id:k,className:n("banner-subtitle desktop:text-[16px] lg-desktop:text-[18px]",a?.subtitle),html:e.subtitle})]}),f&&t("div",{className:"banner-countdown",children:t(q,{endDate:f,endDate_tz:O,dateFormat:P,variant:"spacious",className:"lg-desktop:mt-8 mt-6"})}),p("div",{className:n("banner-cta-group lg-desktop:mt-[32px] lg-desktop:gap-3 mt-6 flex gap-2",a?.buttonGroup),children:[i?.text&&t(z,{variant:"secondary",onClick:r=>{if(i.link?.startsWith("#")){r.preventDefault();const s=document.querySelector(i.link);s&&v(s,h)}i.onClick?.()},className:n("",a?.secondaryButton),"aria-describedby":l,...i.link&&!i.link.startsWith("#")?{as:"a",href:I(i.link,x)}:{},children:i.text}),o?.text&&t(z,{onClick:r=>{if(o.link?.startsWith("#")){r.preventDefault();const s=document.querySelector(o.link);s&&v(s,h)}o.onClick?.()},className:n("",a?.primaryButton),"aria-describedby":l,...o.link&&!o.link.startsWith("#")?{as:"a",href:I(o.link,x)}:{},children:o.text})]}),Array.isArray(c)&&c.length>0&&t("div",{className:"banner-icons desktop:mt-3 lg-desktop:mt-4 mt-2 flex items-center gap-2",role:"group","aria-label":"brand icons",children:c.map((r,s)=>r.pcImage?t($,{source:r.pcImage.url,alt:r.pcImage.alt||`icon ${s+1}`,role:"img",className:"laptop:h-auto h-[48px] max-w-none",imgClassName:"h-full"},s):null)})]})]})});C.displayName="SecondaryBanner";var re=G(C);export{re as default,X as secondaryBannerVariants};
1
+ "use client";import{jsx as t,jsxs as p}from"react/jsx-runtime";import*as v from"react";import{cva as W}from"class-variance-authority";import T from"jump.js";import{cn as n,getLocalizedPath as S}from"../../helpers/index.js";import{Text as I,Button as z,Heading as $,Picture as q,Countdown as G}from"../../components/index.js";import{withLayout as K}from"../../shared/Styles.js";import Q from"../Media/index.js";import{useAiuiContext as U}from"../AiuiProvider/index.js";import X from"./SecondaryBannerCarousel.js";const Y=W("text-info-primary relative w-full",{variants:{size:{sm:"tablet:aspect-[768/480] laptop:aspect-[1024/480] desktop:aspect-[1440/480] lg-desktop:aspect-[1920/480] aspect-[390/480]",base:"tablet:aspect-[768/660] laptop:aspect-[1024/432] desktop:aspect-[1440/576] lg-desktop:aspect-[1920/720] aspect-[390/660]",lg:"tablet:aspect-[768/660] laptop:aspect-[1024/520] desktop:aspect-[1440/700] lg-desktop:aspect-[1920/930] aspect-[390/660]",xlg:"tablet:aspect-[768/1320] laptop:aspect-[1024/864] desktop:aspect-[1440/1152] lg-desktop:aspect-[1920/1440] aspect-[390/1440] overflow-visible"}},defaultVariants:{size:"base"}}),C=v.forwardRef(({className:u,classNames:a={},data:e,jumpOptions:g={},isActive:L,a11yLabels:M,...b},y)=>{const{pcImage:A,padImage:D,mobileImage:N,isVideoLoop:O,endDate:f,endDate_tz:P,dateFormat:w,size:V,iconArray:c,theme:_,primaryButton:i,secondaryButton:o,title:j,titleTag:H}=e,E=O??!0,d=V??"base",J=_??"light",R=H??"h2",{locale:x="us"}=U(),h={...{duration:500,offset:0},...g},m=v.useId(),l=j?`${m}-title`:void 0,k=e.subtitle?`${m}-subtitle`:void 0,B=e.superTitle?`${m}-super-title`:void 0,F=[B,k].filter(Boolean).join(" ")||void 0;return e.items&&e.items.length>0?t(X,{data:e,className:u,classNames:a,jumpOptions:g,a11yLabels:M,ref:y,...b}):p("section",{ref:y,role:"banner","aria-labelledby":l,"aria-describedby":F,className:n({"aiui-dark":J==="dark"},Y({size:d}),u,a?.root),...b,children:[t("div",{className:n("absolute inset-0",{"h-fit":d==="xlg"}),children:t(Q,{pcImage:A,padImage:D,mobileImage:N,className:"size-full",imgClassName:"object-cover",videoClassName:"object-cover",muted:!0,loop:E,playsInline:!0,autoPlay:L??!0})}),p("div",{className:n("banner-content laptop:top-[min(50%,50vh)] laptop:-translate-y-1/2 tablet:px-[32px] laptop:px-[64px] lg-desktop:px-[calc(50%-832px)] absolute top-12 z-10 flex flex-col items-start justify-center px-[16px] text-left",a?.content),children:[p("div",{className:"banner-inner-title desktop:gap-2 flex flex-col items-start gap-1",children:[e.superTitle&&t(I,{as:"p",size:2,id:B,className:n("banner-super-title desktop:text-[16px] lg-desktop:text-[18px]",a?.superTitle),html:e.superTitle}),e.title&&t($,{as:R,size:["xlg","lg"].includes(d)?5:4,id:l,className:n("banner-title ",a?.title),html:e.title}),e.subtitle&&t(I,{as:"p",size:3,id:k,className:n("banner-subtitle desktop:text-[16px] lg-desktop:text-[18px]",a?.subtitle),html:e.subtitle})]}),f&&t("div",{className:"banner-countdown",children:t(G,{endDate:f,endDate_tz:P,dateFormat:w,variant:"spacious",className:"lg-desktop:mt-8 mt-6"})}),p("div",{className:n("banner-cta-group lg-desktop:mt-[32px] lg-desktop:gap-3 mt-6 flex gap-2",a?.buttonGroup),children:[o?.text&&t(z,{variant:"secondary",onClick:r=>{if(o.link?.startsWith("#")){r.preventDefault();const s=document.querySelector(o.link);s&&T(s,h)}o.onClick?.()},className:n("",a?.secondaryButton),"aria-describedby":l,...o.link&&!o.link.startsWith("#")?{as:"a",href:S(o.link,x)}:{},children:o.text}),i?.text&&t(z,{onClick:r=>{if(i.link?.startsWith("#")){r.preventDefault();const s=document.querySelector(i.link);s&&T(s,h)}i.onClick?.()},className:n("",a?.primaryButton),"aria-describedby":l,...i.link&&!i.link.startsWith("#")?{as:"a",href:S(i.link,x)}:{},children:i.text})]}),Array.isArray(c)&&c.length>0&&t("div",{className:"banner-icons desktop:mt-3 lg-desktop:mt-4 mt-2 flex items-center gap-2",role:"group","aria-label":"brand icons",children:c.map((r,s)=>r.pcImage?t(q,{source:r.pcImage.url,alt:r.pcImage.alt||`icon ${s+1}`,role:"img",className:"laptop:h-auto h-[48px] max-w-none",imgClassName:"h-full"},s):null)})]})]})});C.displayName="SecondaryBanner";var le=K(C);export{le as default,Y as secondaryBannerVariants};
@@ -19,6 +19,7 @@ export type { ShelfDisplayProps, ShelfDisplayType, ShelfDisplayItem, SocialEndor
19
19
  export { default as Evaluate } from './Evaluate/index.js';
20
20
  export { default as Category } from './Category/index.js';
21
21
  export { default as HeroBanner } from './HeroBanner/index.js';
22
+ export type { HeroBannerProps, HeroBannerSlideData, HeroBannerCarouselConfig, HeroBannerA11yLabels, HeroBannerMediaTier, HeroBannerTieredMedia, HeroBannerTieredMediaFields, HeroBannerMultiThemeFields, } from './HeroBanner/index.js';
22
23
  export { default as AccordionCards } from './AccordionCards/index.js';
23
24
  export { default as Graphic } from './Graphic/index.js';
24
25
  export { default as MediaPlayerBase } from './MediaPlayerBase/index.js';
@@ -1 +1 @@
1
- import{AccessoriesProductGrid as o,SectionHeader as a,PromoBanner as i,MainProductArea as s,AddToCartSuccessPopover as p}from"./AccessoriesShelf/index.js";import{default as d}from"./ActivitySchedule/index.js";import{default as n}from"./GiftShelf/index.js";import{default as l}from"./GiftTierShelf/index.js";import{default as x}from"./ActivityMechanism/index.js";import{default as S}from"./BrandEquity/index.js";import{default as P}from"./MemberEquity/index.js";import{default as g}from"./Slogan/index.js";import{default as v}from"./Title/index.js";import{default as B}from"./Spacer/index.js";import{default as b}from"./ShelfDisplay/index.js";import{default as D}from"./ShelfDisplayHorizontal/index.js";import{default as F}from"./Evaluate/index.js";import{default as O}from"./Category/index.js";import{default as V}from"./HeroBanner/index.js";import{default as k}from"./AccordionCards/index.js";import{default as N}from"./Graphic/index.js";import{default as R}from"./MediaPlayerBase/index.js";import{default as H}from"./MediaPlayerSticky/index.js";import{default as K}from"./MediaPlayerMulti/index.js";import{default as _}from"./Marquee/index.js";import{default as J}from"./MarqueeReview/index.js";import{default as X}from"./WhyChoose/index.js";import{default as $}from"./Faq/index.js";import{MarqueeItem as te,MarqueeImageContent as re,MarqueeTextContent as oe}from"./Marquee/index.js";import{default as ie}from"./MultiLayoutGraphicBlock/index.js";import{default as pe}from"./GraphicAttractionBlock/index.js";import{default as de}from"./HeaderNavigation/index.js";import{default as ne}from"./FooterNavigation/index.js";import{default as le}from"./SearchPage/index.js";import{IPC_SEARCH_PAGE as xe,SearchPageTabType as ye}from"./SearchPage/types.js";import{withLayout as he}from"../shared/Styles.js";import{default as Ce}from"./AiuiProvider/index.js";import{default as Me}from"./Tabs/index.js";import{default as Te}from"./SwiperBox/index.js";import{VideoModal as Ie}from"./VideoModal/index.js";import{default as Ae}from"./CreativeModule/index.js";import{default as je}from"./GraphicOverlay/index.js";import{default as Ge}from"./Specs/index.js";import{default as we}from"./TabsGroup/index.js";import{default as Le,useBizProductContext as ke}from"./Listing/BizProductProvider.js";import{default as Ne}from"./Listing/components/PurchaseBar/index.js";import{default as Re}from"./Listing/components/PurchaseBar/ProductActions/index.js";import{default as He}from"./Listing/components/ProductCard/ProductDetail/ProductBenefitsTabs/index.js";import{default as Ke}from"./Listing/components/ProductCard/ProductDetail/ProductBenefits/index.js";import{default as _e}from"./Listing/components/ProductCard/ProductDetail/ProductHighlight/index.js";import{default as Je}from"./Listing/components/ProductCard/ProductDetail/ProductFreeGift/index.js";import{default as Xe}from"./Listing/components/ProductCard/ProductDetail/ProductFunctionFreeGift/index.js";import{default as $e}from"./Listing/components/ProductCard/ProductDetail/ProductOptions/index.js";import{default as tt}from"./Listing/components/ProductCard/ProductDetail/ProductBundle/index.js";import{default as ot}from"./Listing/components/ProductCard/ProductDetail/ProductCoupon/index.js";import{default as it}from"./Listing/components/ProductCard/ProductDetail/ProductBanner/index.js";import{default as pt}from"./Listing/components/ProductCard/ProductGridBox.js";import{default as dt}from"./Listing/components/ProductCard/ProductGallery/index.js";import{default as nt}from"./Listing/components/ProductCard/ProductSummary/index.js";import{default as lt}from"./Listing/components/ProductCard/ProductDetail/BenefitsTab.js";import{default as xt}from"./Listing/components/ProductCard/ProductDetail/CreditCouponRedeem/index.js";import{default as St}from"./Listing/components/PaidShipping/index.js";import{default as Pt}from"./Listing/components/CartActionButtons/index.js";import{NotifyMeDialog as gt}from"./NotifyMeDialog/index.js";import{default as vt}from"./Listing/components/ProductCard/ProductDetail/ProductServiceBenefits/index.js";import{default as Bt}from"./Listing/components/ProductCard/ProductPaidShipping/index.js";import{default as bt}from"./GraphicMore/index.js";import{default as Dt}from"./Features/index.js";import{default as Ft}from"./AplusDesc/index.js";import{default as Ot}from"./GiftBox/index.js";import{default as Vt}from"./SelectStore/index.js";import{default as kt}from"./DownLoad/index.js";import{default as Nt}from"./FootCharger/index.js";import{default as Rt}from"./BrandCardLink/index.js";import*as qt from"./IPRedirect/index.js";import{default as zt}from"./WheelLottery/index.js";import{default as Ut}from"./ProductLottery/index.js";import{default as Yt}from"./ProductCompare/index.js";import{default as Qt}from"./Ksp/index.js";import{default as Zt}from"./ImageTextFeature/index.js";import{default as er}from"./FeatureCards/index.js";import{default as rr}from"./FeaturedBlogPosts/index.js";import{default as ar}from"./ImageWithText/index.js";import{default as sr}from"./VideoFeature/index.js";import{default as fr}from"./TabsWithMedia/index.js";import{default as cr}from"./TabWithImage/index.js";import{default as ur}from"./FeatureShowcase/index.js";import{default as mr}from"./ProductHero/index.js";import{default as yr}from"./SpecsComparison/index.js";import{default as hr}from"./MediaSceneSwitcher/index.js";import{default as Cr}from"./MediaSceneSwitcherV2/index.js";import{default as Mr}from"./ThreeDCarousel/index.js";import{default as Tr}from"./ProductNav/index.js";import{default as Ir}from"./AnchorNavigation/index.js";import{default as Ar}from"./PromotionalBar/index.js";import{default as jr}from"./EventSchedule/index.js";import{default as Gr}from"./SecondaryBanner/index.js";import{default as wr}from"./BuyOneGetOneShelf/index.js";import{default as Lr}from"./ActiveShelf/index.js";import{default as Wr}from"./MediaShelf/index.js";import{default as Er,CreditsProductCard as Rr}from"./CreditsShelf/index.js";import{default as Hr,SceneProductCard as zr}from"./SceneShelf/index.js";import{default as Ur,SceneShelfV2ProductCard as _r}from"./SceneShelfV2/index.js";import{default as Jr}from"./SceneShelfV3/index.js";import{default as Xr}from"./MediaEndorsement/index.js";import{default as $r}from"./MediaTextOverlay/index.js";import{default as to}from"./ImageOverlayShelf/index.js";import{default as oo,AccessoryProductCard as ao}from"./AccessoriesShelf/components/AccessoryShelf/index.js";import{default as so}from"./ImageTextOverlay/index.js";import{default as fo}from"./MiniCart/index.js";import{default as no}from"./MiniCart/CircleProgress.js";import{default as lo,MiniCartDialog as mo}from"./MiniCart/MiniCartDialog.js";import{default as yo}from"./WebPushPopup/index.js";import{useEmarsysWebPush as ho}from"../hooks/useEmarsysWebPush.js";const e={ActivityMechanism:"ActivityMechanism",ActivitySchedule:"ActivitySchedule",AnchorNavigation:"AnchorNavigation",EventSchedule:"EventSchedule",FeatureCards:"FeatureCards",GiftShelf:"GiftShelf",GiftTierShelf:"GiftTierShelf",ImageTextFeature:"ImageTextFeature",ImageTextOverlay:"ImageTextOverlay",ImageWithText:"ImageWithText",MarqueeReview:"MarqueeReview",MediaSceneSwitcher:"MediaSceneSwitcher",ProductCompare:"ProductCompare",ProductHero:"ProductHero",ProductNav:"ProductNav",PromotionalBar:"PromotionalBar",TabsWithMedia:"TabsWithMedia",ThreeDCarousel:"ThreeDCarousel",VideoFeature:"VideoFeature","ipc-accordioncards":"AccordionCards","ipc-active-shelf":"ActiveShelf","ipc-add-to-cart-success-popover":"AddToCartSuccessPopover","ipc-aplusdesc":"AplusDesc","ipc-banner":"HeroBanner","ipc-bogo-shelf":"BuyOneGetOneShelf","ipc-brand-card-link":"BrandCardLink","ipc-brand-equity":"BrandEquity","ipc-category":"Category","ipc-creativemodule":"CreativeModule","ipc-credits-shelf":"CreditsShelf","ipc-download":"DownLoad","ipc-evaluate":"Evaluate","ipc-faq":"Faq","ipc-features":"Features","ipc-featured-blog-posts":"FeaturedBlogPosts","ipc-footcharger":"FootCharger","ipc-ga-block":"GraphicAttractionBlock","ipc-giftbox":"GiftBox","ipc-graphic":"Graphic","ipc-graphicmore":"GraphicMore","ipc-graphicoverlay":"GraphicOverlay","ipc-image-overlay-shelf":"ImageOverlayShelf","ipc-marquee":"Marquee","ipc-media-endorsement":"MediaEndorsement","ipc-media-shelf":"MediaShelf","ipc-media-scene-switcher-v2":"MediaSceneSwitcherV2","ipc-media-text-overlay":"MediaTextOverlay","ipc-mediaplayerbase":"MediaPlayerBase","ipc-mediaplayermulti":"MediaPlayerMulti","ipc-mediaplayersticky":"MediaPlayerSticky","ipc-member-equity":"MemberEquity","ipc-mini-cart":"MiniCart","ipc-mlg-block":"MultiLayoutGraphicBlock","ipc-notify-me-dialog":"NotifyMeDialog","ipc-product-lottery":"ProductLottery","ipc-scene-shelf":"SceneShelf","ipc-scene-shelf-v2":"SceneShelfV2","ipc-scene-shelf-v3":"SceneShelfV3","ipc-search-page":"SearchPage","ipc-search-page-tabs":"SearchPage","ipc-secondary-banner":"SecondaryBanner","ipc-selectstore":"SelectStore","ipc-shelfdisplay":"ShelfDisplay","ipc-shelfdisplay-horizontal":"ShelfDisplayHorizontal","ipc-slogan":"Slogan","ipc-spacer":"Spacer","ipc-specs":"Specs","ipc-tabs":"Tabs","ipc-title":"Title","ipc-wheel-lottery":"WheelLottery","ipc-whychoose":"WhyChoose",ksp:"Ksp",modalCoupon:"ModalCoupon",modalRegisterSubscribe:"ModalRegisterSubscribe",modalSmsSubscribe:"ModalSmsSubscribe",modalSubscribeConfirm:"ModalSubscribeConfirm",modalVerify:"ModalVerify"};import{CartSummaryHeader as Co,CartItemRow as go,CartGiftSection as Mo,CartPerksSection as vo,CartThirdPartyBanner as To,CartPriceSummary as Bo}from"./CartDetail/index.js";import{useAiuiContext as bo}from"./AiuiProvider/index.js";import{default as Do}from"./ModalRegisterSubscribe/index.js";import{default as Fo}from"./ModalSubscribeConfirm/index.js";import{default as Oo}from"./ModalCoupon/index.js";import{default as Vo}from"./ModalSmsSubscribe/index.js";import{default as ko}from"./ModalVerify/index.js";export{o as AccessoriesProductGrid,ao as AccessoryProductCard,oo as AccessoryShelf,k as AccordionCards,Lr as ActiveShelf,x as ActivityMechanism,d as ActivitySchedule,p as AddToCartSuccessPopover,Ce as AiuiProvider,Ir as AnchorNavigation,Ft as AplusDesc,lt as BenefitsTab,Le as BizProductProvider,Rt as BrandCardLink,S as BrandEquity,wr as BuyOneGetOneShelf,Pt as CartActionButtons,Mo as CartGiftSection,go as CartItemRow,vo as CartPerksSection,Bo as CartPriceSummary,Co as CartSummaryHeader,To as CartThirdPartyBanner,O as Category,Ae as CreativeModule,xt as CreditCouponRedeem,Rr as CreditsProductCard,Er as CreditsShelf,kt as DownLoad,F as Evaluate,jr as EventSchedule,$ as Faq,er as FeatureCards,ur as FeatureShowcase,rr as FeaturedBlogPosts,Dt as Features,Nt as FootCharger,ne as FooterNavigation,Ot as GiftBox,n as GiftShelf,l as GiftTierShelf,N as Graphic,pe as GraphicAttractionBlock,bt as GraphicMore,je as GraphicOverlay,de as HeaderNavigation,V as HeroBanner,xe as IPC_SEARCH_PAGE,qt as IPRedirect,to as ImageOverlayShelf,Zt as ImageTextFeature,so as ImageTextOverlay,ar as ImageWithText,Qt as Ksp,s as MainProductArea,_ as Marquee,re as MarqueeImageContent,te as MarqueeItem,J as MarqueeReview,oe as MarqueeTextContent,Xr as MediaEndorsement,R as MediaPlayerBase,K as MediaPlayerMulti,H as MediaPlayerSticky,hr as MediaSceneSwitcher,Cr as MediaSceneSwitcherV2,Wr as MediaShelf,$r as MediaTextOverlay,P as MemberEquity,fo as MiniCart,no as MiniCartCircleProgress,lo as MiniCartDialog,mo as MiniCartDialogComponent,Oo as ModalCoupon,Do as ModalRegisterSubscribe,Vo as ModalSmsSubscribe,Fo as ModalSubscribeConfirm,ko as ModalVerify,ie as MultiLayoutGraphicBlock,gt as NotifyMeDialog,e as PAYLOAD_COMPONENT_MAP,St as PaidShipping,Re as ProductActions,it as ProductBanner,Ke as ProductBenefits,He as ProductBenefitsTabs,tt as ProductBundle,Yt as ProductCompare,ot as ProductCoupon,Je as ProductFreeGift,Xe as ProductFunctionFreeGift,dt as ProductGallery,pt as ProductGridBox,mr as ProductHero,_e as ProductHighlight,Ut as ProductLottery,Tr as ProductNav,$e as ProductOptions,Bt as ProductPaidShipping,vt as ProductServiceBenefits,nt as ProductSummary,i as PromoBanner,Ar as PromotionalBar,Ne as PurchaseBar,zr as SceneProductCard,Hr as SceneShelf,Ur as SceneShelfV2,_r as SceneShelfV2ProductCard,Jr as SceneShelfV3,le as SearchPage,ye as SearchPageTabType,Gr as SecondaryBanner,a as SectionHeader,Vt as SelectStore,b as ShelfDisplay,D as ShelfDisplayHorizontal,g as Slogan,B as Spacer,Ge as Specs,yr as SpecsComparison,Te as SwiperBox,we as TabGroup,cr as TabWithImage,Me as Tabs,fr as TabsWithMedia,Mr as ThreeDCarousel,v as Title,sr as VideoFeature,Ie as VideoModal,yo as WebPushPopup,zt as WheelLottery,X as WhyChoose,bo as useAiuiContext,ke as useBizProductContext,ho as useEmarsysWebPush,he as withLayout};
1
+ import{AccessoriesProductGrid as o,SectionHeader as a,PromoBanner as i,MainProductArea as s,AddToCartSuccessPopover as p}from"./AccessoriesShelf/index.js";import{default as f}from"./ActivitySchedule/index.js";import{default as n}from"./GiftShelf/index.js";import{default as u}from"./GiftTierShelf/index.js";import{default as x}from"./ActivityMechanism/index.js";import{default as S}from"./BrandEquity/index.js";import{default as P}from"./MemberEquity/index.js";import{default as g}from"./Slogan/index.js";import{default as B}from"./Title/index.js";import{default as v}from"./Spacer/index.js";import{default as b}from"./ShelfDisplay/index.js";import{default as D}from"./ShelfDisplayHorizontal/index.js";import{default as j}from"./Evaluate/index.js";import{default as O}from"./Category/index.js";import{default as L}from"./HeroBanner/index.js";import{default as k}from"./AccordionCards/index.js";import{default as N}from"./Graphic/index.js";import{default as H}from"./MediaPlayerBase/index.js";import{default as q}from"./MediaPlayerSticky/index.js";import{default as K}from"./MediaPlayerMulti/index.js";import{default as _}from"./Marquee/index.js";import{default as J}from"./MarqueeReview/index.js";import{default as X}from"./WhyChoose/index.js";import{default as $}from"./Faq/index.js";import{MarqueeItem as te,MarqueeImageContent as re,MarqueeTextContent as oe}from"./Marquee/index.js";import{default as ie}from"./MultiLayoutGraphicBlock/index.js";import{default as pe}from"./GraphicAttractionBlock/index.js";import{default as fe}from"./HeaderNavigation/index.js";import{default as ne}from"./FooterNavigation/index.js";import{default as ue}from"./SearchPage/index.js";import{IPC_SEARCH_PAGE as xe,SearchPageTabType as ye}from"./SearchPage/types.js";import{withLayout as he}from"../shared/Styles.js";import{default as Ce}from"./AiuiProvider/index.js";import{default as Me}from"./Tabs/index.js";import{default as Te}from"./SwiperBox/index.js";import{VideoModal as Ie}from"./VideoModal/index.js";import{default as Ae}from"./CreativeModule/index.js";import{default as Fe}from"./GraphicOverlay/index.js";import{default as Ge}from"./Specs/index.js";import{default as we}from"./TabsGroup/index.js";import{default as Ve,useBizProductContext as ke}from"./Listing/BizProductProvider.js";import{default as Ne}from"./Listing/components/PurchaseBar/index.js";import{default as He}from"./Listing/components/PurchaseBar/ProductActions/index.js";import{default as qe}from"./Listing/components/ProductCard/ProductDetail/ProductBenefitsTabs/index.js";import{default as Ke}from"./Listing/components/ProductCard/ProductDetail/ProductBenefits/index.js";import{default as _e}from"./Listing/components/ProductCard/ProductDetail/ProductHighlight/index.js";import{default as Je}from"./Listing/components/ProductCard/ProductDetail/ProductFreeGift/index.js";import{default as Xe}from"./Listing/components/ProductCard/ProductDetail/ProductFunctionFreeGift/index.js";import{default as $e}from"./Listing/components/ProductCard/ProductDetail/ProductOptions/index.js";import{default as tt}from"./Listing/components/ProductCard/ProductDetail/ProductBundle/index.js";import{default as ot}from"./Listing/components/ProductCard/ProductDetail/ProductCoupon/index.js";import{default as it}from"./Listing/components/ProductCard/ProductDetail/ProductBanner/index.js";import{default as pt}from"./Listing/components/ProductCard/ProductGridBox.js";import{default as ft}from"./Listing/components/ProductCard/ProductGallery/index.js";import{default as nt}from"./Listing/components/ProductCard/ProductSummary/index.js";import{default as ut}from"./Listing/components/ProductCard/ProductDetail/BenefitsTab.js";import{default as xt}from"./Listing/components/ProductCard/ProductDetail/CreditCouponRedeem/index.js";import{default as St}from"./Listing/components/PaidShipping/index.js";import{default as Pt}from"./Listing/components/CartActionButtons/index.js";import{NotifyMeDialog as gt}from"./NotifyMeDialog/index.js";import{default as Bt}from"./Listing/components/ProductCard/ProductDetail/ProductServiceBenefits/index.js";import{default as vt}from"./Listing/components/ProductCard/ProductPaidShipping/index.js";import{default as bt}from"./GraphicMore/index.js";import{default as Dt}from"./Features/index.js";import{default as jt}from"./AplusDesc/index.js";import{default as Ot}from"./GiftBox/index.js";import{default as Lt}from"./SelectStore/index.js";import{default as kt}from"./DownLoad/index.js";import{default as Nt}from"./FootCharger/index.js";import{default as Ht}from"./BrandCardLink/index.js";import*as Rt from"./IPRedirect/index.js";import{default as zt}from"./WheelLottery/index.js";import{default as Ut}from"./ProductLottery/index.js";import{default as Yt}from"./ProductCompare/index.js";import{default as Qt}from"./Ksp/index.js";import{default as Zt}from"./ImageTextFeature/index.js";import{default as er}from"./FeatureCards/index.js";import{default as rr}from"./FeaturedBlogPosts/index.js";import{default as ar}from"./ImageWithText/index.js";import{default as sr}from"./VideoFeature/index.js";import{default as dr}from"./TabsWithMedia/index.js";import{default as cr}from"./TabWithImage/index.js";import{default as lr}from"./FeatureShowcase/index.js";import{default as mr}from"./ProductHero/index.js";import{default as yr}from"./SpecsComparison/index.js";import{default as hr}from"./MediaSceneSwitcher/index.js";import{default as Cr}from"./MediaSceneSwitcherV2/index.js";import{default as Mr}from"./ThreeDCarousel/index.js";import{default as Tr}from"./ProductNav/index.js";import{default as Ir}from"./AnchorNavigation/index.js";import{default as Ar}from"./PromotionalBar/index.js";import{default as Fr}from"./EventSchedule/index.js";import{default as Gr}from"./SecondaryBanner/index.js";import{default as wr}from"./BuyOneGetOneShelf/index.js";import{default as Vr}from"./ActiveShelf/index.js";import{default as Wr}from"./MediaShelf/index.js";import{default as Er,CreditsProductCard as Hr}from"./CreditsShelf/index.js";import{default as qr,SceneProductCard as zr}from"./SceneShelf/index.js";import{default as Ur,SceneShelfV2ProductCard as _r}from"./SceneShelfV2/index.js";import{default as Jr}from"./SceneShelfV3/index.js";import{default as Xr}from"./MediaEndorsement/index.js";import{default as $r}from"./MediaTextOverlay/index.js";import{default as to}from"./ImageOverlayShelf/index.js";import{default as oo,AccessoryProductCard as ao}from"./AccessoriesShelf/components/AccessoryShelf/index.js";import{default as so}from"./ImageTextOverlay/index.js";import{default as fo}from"./MiniCart/index.js";import{default as no}from"./MiniCart/CircleProgress.js";import{default as uo,MiniCartDialog as mo}from"./MiniCart/MiniCartDialog.js";import{default as yo}from"./WebPushPopup/index.js";import{useEmarsysWebPush as ho}from"../hooks/useEmarsysWebPush.js";const e={ActivityMechanism:"ActivityMechanism",ActivitySchedule:"ActivitySchedule",AnchorNavigation:"AnchorNavigation",EventSchedule:"EventSchedule",FeatureCards:"FeatureCards",GiftShelf:"GiftShelf",GiftTierShelf:"GiftTierShelf",ImageTextFeature:"ImageTextFeature",ImageTextOverlay:"ImageTextOverlay",ImageWithText:"ImageWithText",MarqueeReview:"MarqueeReview",MediaSceneSwitcher:"MediaSceneSwitcher",ProductCompare:"ProductCompare",ProductHero:"ProductHero",ProductNav:"ProductNav",PromotionalBar:"PromotionalBar",TabsWithMedia:"TabsWithMedia",ThreeDCarousel:"ThreeDCarousel",VideoFeature:"VideoFeature","ipc-accordioncards":"AccordionCards","ipc-active-shelf":"ActiveShelf","ipc-add-to-cart-success-popover":"AddToCartSuccessPopover","ipc-aplusdesc":"AplusDesc","ipc-banner":"HeroBanner","ipc-bogo-shelf":"BuyOneGetOneShelf","ipc-brand-card-link":"BrandCardLink","ipc-brand-equity":"BrandEquity","ipc-category":"Category","ipc-creativemodule":"CreativeModule","ipc-credits-shelf":"CreditsShelf","ipc-download":"DownLoad","ipc-evaluate":"Evaluate","ipc-faq":"Faq","ipc-features":"Features","ipc-featured-blog-posts":"FeaturedBlogPosts","ipc-footcharger":"FootCharger","ipc-ga-block":"GraphicAttractionBlock","ipc-giftbox":"GiftBox","ipc-graphic":"Graphic","ipc-graphicmore":"GraphicMore","ipc-graphicoverlay":"GraphicOverlay","ipc-image-overlay-shelf":"ImageOverlayShelf","ipc-marquee":"Marquee","ipc-media-endorsement":"MediaEndorsement","ipc-media-shelf":"MediaShelf","ipc-media-scene-switcher-v2":"MediaSceneSwitcherV2","ipc-media-text-overlay":"MediaTextOverlay","ipc-mediaplayerbase":"MediaPlayerBase","ipc-mediaplayermulti":"MediaPlayerMulti","ipc-mediaplayersticky":"MediaPlayerSticky","ipc-member-equity":"MemberEquity","ipc-mini-cart":"MiniCart","ipc-mlg-block":"MultiLayoutGraphicBlock","ipc-notify-me-dialog":"NotifyMeDialog","ipc-product-lottery":"ProductLottery","ipc-scene-shelf":"SceneShelf","ipc-scene-shelf-v2":"SceneShelfV2","ipc-scene-shelf-v3":"SceneShelfV3","ipc-search-page":"SearchPage","ipc-search-page-tabs":"SearchPage","ipc-secondary-banner":"SecondaryBanner","ipc-selectstore":"SelectStore","ipc-shelfdisplay":"ShelfDisplay","ipc-shelfdisplay-horizontal":"ShelfDisplayHorizontal","ipc-slogan":"Slogan","ipc-spacer":"Spacer","ipc-specs":"Specs","ipc-tabs":"Tabs","ipc-title":"Title","ipc-wheel-lottery":"WheelLottery","ipc-whychoose":"WhyChoose",ksp:"Ksp",modalCoupon:"ModalCoupon",modalRegisterSubscribe:"ModalRegisterSubscribe",modalSmsSubscribe:"ModalSmsSubscribe",modalSubscribeConfirm:"ModalSubscribeConfirm",modalVerify:"ModalVerify"};import{CartSummaryHeader as Co,CartItemRow as go,CartGiftSection as Mo,CartPerksSection as Bo,CartThirdPartyBanner as To,CartPriceSummary as vo}from"./CartDetail/index.js";import{useAiuiContext as bo}from"./AiuiProvider/index.js";import{default as Do}from"./ModalRegisterSubscribe/index.js";import{default as jo}from"./ModalSubscribeConfirm/index.js";import{default as Oo}from"./ModalCoupon/index.js";import{default as Lo}from"./ModalSmsSubscribe/index.js";import{default as ko}from"./ModalVerify/index.js";export{o as AccessoriesProductGrid,ao as AccessoryProductCard,oo as AccessoryShelf,k as AccordionCards,Vr as ActiveShelf,x as ActivityMechanism,f as ActivitySchedule,p as AddToCartSuccessPopover,Ce as AiuiProvider,Ir as AnchorNavigation,jt as AplusDesc,ut as BenefitsTab,Ve as BizProductProvider,Ht as BrandCardLink,S as BrandEquity,wr as BuyOneGetOneShelf,Pt as CartActionButtons,Mo as CartGiftSection,go as CartItemRow,Bo as CartPerksSection,vo as CartPriceSummary,Co as CartSummaryHeader,To as CartThirdPartyBanner,O as Category,Ae as CreativeModule,xt as CreditCouponRedeem,Hr as CreditsProductCard,Er as CreditsShelf,kt as DownLoad,j as Evaluate,Fr as EventSchedule,$ as Faq,er as FeatureCards,lr as FeatureShowcase,rr as FeaturedBlogPosts,Dt as Features,Nt as FootCharger,ne as FooterNavigation,Ot as GiftBox,n as GiftShelf,u as GiftTierShelf,N as Graphic,pe as GraphicAttractionBlock,bt as GraphicMore,Fe as GraphicOverlay,fe as HeaderNavigation,L as HeroBanner,xe as IPC_SEARCH_PAGE,Rt as IPRedirect,to as ImageOverlayShelf,Zt as ImageTextFeature,so as ImageTextOverlay,ar as ImageWithText,Qt as Ksp,s as MainProductArea,_ as Marquee,re as MarqueeImageContent,te as MarqueeItem,J as MarqueeReview,oe as MarqueeTextContent,Xr as MediaEndorsement,H as MediaPlayerBase,K as MediaPlayerMulti,q as MediaPlayerSticky,hr as MediaSceneSwitcher,Cr as MediaSceneSwitcherV2,Wr as MediaShelf,$r as MediaTextOverlay,P as MemberEquity,fo as MiniCart,no as MiniCartCircleProgress,uo as MiniCartDialog,mo as MiniCartDialogComponent,Oo as ModalCoupon,Do as ModalRegisterSubscribe,Lo as ModalSmsSubscribe,jo as ModalSubscribeConfirm,ko as ModalVerify,ie as MultiLayoutGraphicBlock,gt as NotifyMeDialog,e as PAYLOAD_COMPONENT_MAP,St as PaidShipping,He as ProductActions,it as ProductBanner,Ke as ProductBenefits,qe as ProductBenefitsTabs,tt as ProductBundle,Yt as ProductCompare,ot as ProductCoupon,Je as ProductFreeGift,Xe as ProductFunctionFreeGift,ft as ProductGallery,pt as ProductGridBox,mr as ProductHero,_e as ProductHighlight,Ut as ProductLottery,Tr as ProductNav,$e as ProductOptions,vt as ProductPaidShipping,Bt as ProductServiceBenefits,nt as ProductSummary,i as PromoBanner,Ar as PromotionalBar,Ne as PurchaseBar,zr as SceneProductCard,qr as SceneShelf,Ur as SceneShelfV2,_r as SceneShelfV2ProductCard,Jr as SceneShelfV3,ue as SearchPage,ye as SearchPageTabType,Gr as SecondaryBanner,a as SectionHeader,Lt as SelectStore,b as ShelfDisplay,D as ShelfDisplayHorizontal,g as Slogan,v as Spacer,Ge as Specs,yr as SpecsComparison,Te as SwiperBox,we as TabGroup,cr as TabWithImage,Me as Tabs,dr as TabsWithMedia,Mr as ThreeDCarousel,B as Title,sr as VideoFeature,Ie as VideoModal,yo as WebPushPopup,zt as WheelLottery,X as WhyChoose,bo as useAiuiContext,ke as useBizProductContext,ho as useEmarsysWebPush,he as withLayout};
@@ -1 +1 @@
1
- import{jsx as b}from"react/jsx-runtime";import{useRef as i,useEffect as f,useState as T}from"react";import{cn as m}from"../helpers/utils.js";const H=({src:v,poster:a,eagerPoster:h=!1,className:p="",videoClassName:g="",autoplay:y=!0,muted:L=!0,loop:t=!0,controls:E=!1,playsInline:R=!0,videoRef:M,intersectionObserverConfig:P={threshold:0,rootMargin:"200px"},...V})=>{const[o,w]=T(!1),I=i(null),l=i(null),c=i(!1),e=M||I,{threshold:d,rootMargin:u}=P;return f(()=>{const n=e.current;if(!n||t)return;const r=()=>{c.current=!0};return n.addEventListener("ended",r),()=>{n.removeEventListener("ended",r)}},[e,t,o]),f(()=>{const n=new IntersectionObserver(S=>{S.forEach(k=>{if(k.isIntersecting){if(o||w(!0),e.current){const s=e.current;if(!t&&c.current)return;s.muted=!0,s.currentTime=0,s.play().catch(N=>{console.warn("\u89C6\u9891\u81EA\u52A8\u64AD\u653E\u5931\u8D25:",N)})}}else e.current&&e.current.pause()})},{threshold:d,rootMargin:u}),r=l.current;return r&&n.observe(r),()=>{r&&n.unobserve(r)}},[e,t,u,o,d]),b("div",{ref:l,className:m("relative size-full",p),children:b("video",{ref:e,src:o?v:void 0,poster:h||o?a:void 0,className:m("size-full object-cover",g),loop:t,muted:L,controls:E,playsInline:R,preload:"metadata",disablePictureInPicture:!0,"webkit-playsinline":!0,autoPlay:y,...V})})};var C=H;export{C as default};
1
+ import{jsx as m}from"react/jsx-runtime";import{useRef as i,useEffect as l,useState as T}from"react";import{cn as v}from"../helpers/utils.js";const H=({src:b,poster:c,eagerPoster:p=!1,className:h="",videoClassName:y="",autoplay:g=!0,muted:L=!0,loop:t=!0,controls:E=!1,playsInline:R=!0,videoRef:P,intersectionObserverConfig:M={threshold:0,rootMargin:"200px"},...V})=>{const[o,w]=T(!1),I=i(null),u=i(null),s=i(!1),r=P||I,{threshold:d,rootMargin:f}=M;return l(()=>{const e=r.current;if(!e||t)return;const n=()=>{s.current=!0};return e.addEventListener("ended",n),()=>{e.removeEventListener("ended",n)}},[r,t,o]),l(()=>{const e=r.current;if(!e||!o)return;const n=()=>{!e.paused||e.ended||!t&&s.current||(e.muted=!0,e.play().catch(()=>{}))};return e.addEventListener("canplay",n),()=>e.removeEventListener("canplay",n)},[r,o,t]),l(()=>{const e=new IntersectionObserver(S=>{S.forEach(k=>{if(k.isIntersecting){if(o||w(!0),r.current){const a=r.current;if(!t&&s.current)return;a.muted=!0,a.currentTime=0,a.play().catch(N=>{console.warn("\u89C6\u9891\u81EA\u52A8\u64AD\u653E\u5931\u8D25:",N)})}}else r.current&&r.current.pause()})},{threshold:d,rootMargin:f}),n=u.current;return n&&e.observe(n),()=>{n&&e.unobserve(n)}},[r,t,f,o,d]),m("div",{ref:u,className:v("relative size-full",h),children:m("video",{ref:r,src:o?b:void 0,poster:p||o?c:void 0,className:v("size-full object-cover",y),loop:t,muted:L,controls:E,playsInline:R,preload:"metadata",disablePictureInPicture:!0,"webkit-playsinline":!0,autoPlay:g,...V})})};var C=H;export{C as default};