@anker-in/headless-ui 1.3.41 → 1.3.43

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 (65) hide show
  1. package/dist/cjs/biz-components/GraphicOverlay/GraphicOverlay.js +1 -1
  2. package/dist/cjs/biz-components/GraphicOverlay/GraphicOverlay.js.map +2 -2
  3. package/dist/cjs/biz-components/Listing/BizProductProvider.d.ts +3 -1
  4. package/dist/cjs/biz-components/Listing/BizProductProvider.js +1 -1
  5. package/dist/cjs/biz-components/Listing/BizProductProvider.js.map +3 -3
  6. package/dist/cjs/biz-components/Listing/components/CartActionButtons/index.d.ts +9 -1
  7. package/dist/cjs/biz-components/Listing/components/CartActionButtons/index.js +1 -1
  8. package/dist/cjs/biz-components/Listing/components/CartActionButtons/index.js.map +3 -3
  9. package/dist/cjs/biz-components/Listing/components/ProductCard/ProductSummary/index.js +1 -1
  10. package/dist/cjs/biz-components/Listing/components/ProductCard/ProductSummary/index.js.map +3 -3
  11. package/dist/cjs/biz-components/Listing/components/PurchaseBar/ProductActions/index.js +1 -1
  12. package/dist/cjs/biz-components/Listing/components/PurchaseBar/ProductActions/index.js.map +3 -3
  13. package/dist/cjs/biz-components/MultiLayoutGraphicBlock/MultiLayoutGraphicBlock.js +1 -1
  14. package/dist/cjs/biz-components/MultiLayoutGraphicBlock/MultiLayoutGraphicBlock.js.map +2 -2
  15. package/dist/cjs/biz-components/NotifyMeDialog/NotifyMeDialog.d.ts +7 -0
  16. package/dist/cjs/biz-components/NotifyMeDialog/NotifyMeDialog.js +2 -0
  17. package/dist/cjs/biz-components/NotifyMeDialog/NotifyMeDialog.js.map +7 -0
  18. package/dist/cjs/biz-components/NotifyMeDialog/index.d.ts +2 -0
  19. package/dist/cjs/biz-components/NotifyMeDialog/index.js +2 -0
  20. package/dist/cjs/biz-components/NotifyMeDialog/index.js.map +7 -0
  21. package/dist/cjs/biz-components/NotifyMeDialog/types.d.ts +111 -0
  22. package/dist/cjs/biz-components/NotifyMeDialog/types.js +2 -0
  23. package/dist/cjs/biz-components/NotifyMeDialog/types.js.map +7 -0
  24. package/dist/cjs/biz-components/ProductNav/ProductNav.js +1 -1
  25. package/dist/cjs/biz-components/ProductNav/ProductNav.js.map +3 -3
  26. package/dist/cjs/biz-components/ProductNav/types.d.ts +3 -1
  27. package/dist/cjs/biz-components/ProductNav/types.js.map +1 -1
  28. package/dist/cjs/biz-components/index.d.ts +2 -0
  29. package/dist/cjs/biz-components/index.js +1 -1
  30. package/dist/cjs/biz-components/index.js.map +3 -3
  31. package/dist/cjs/components/tabs.js +1 -1
  32. package/dist/cjs/components/tabs.js.map +2 -2
  33. package/dist/esm/biz-components/GraphicOverlay/GraphicOverlay.js +1 -1
  34. package/dist/esm/biz-components/GraphicOverlay/GraphicOverlay.js.map +2 -2
  35. package/dist/esm/biz-components/Listing/BizProductProvider.d.ts +3 -1
  36. package/dist/esm/biz-components/Listing/BizProductProvider.js +1 -1
  37. package/dist/esm/biz-components/Listing/BizProductProvider.js.map +3 -3
  38. package/dist/esm/biz-components/Listing/components/CartActionButtons/index.d.ts +9 -1
  39. package/dist/esm/biz-components/Listing/components/CartActionButtons/index.js +1 -1
  40. package/dist/esm/biz-components/Listing/components/CartActionButtons/index.js.map +3 -3
  41. package/dist/esm/biz-components/Listing/components/ProductCard/ProductSummary/index.js +1 -1
  42. package/dist/esm/biz-components/Listing/components/ProductCard/ProductSummary/index.js.map +3 -3
  43. package/dist/esm/biz-components/Listing/components/PurchaseBar/ProductActions/index.js +1 -1
  44. package/dist/esm/biz-components/Listing/components/PurchaseBar/ProductActions/index.js.map +3 -3
  45. package/dist/esm/biz-components/MultiLayoutGraphicBlock/MultiLayoutGraphicBlock.js +1 -1
  46. package/dist/esm/biz-components/MultiLayoutGraphicBlock/MultiLayoutGraphicBlock.js.map +2 -2
  47. package/dist/esm/biz-components/NotifyMeDialog/NotifyMeDialog.d.ts +7 -0
  48. package/dist/esm/biz-components/NotifyMeDialog/NotifyMeDialog.js +2 -0
  49. package/dist/esm/biz-components/NotifyMeDialog/NotifyMeDialog.js.map +7 -0
  50. package/dist/esm/biz-components/NotifyMeDialog/index.d.ts +2 -0
  51. package/dist/esm/biz-components/NotifyMeDialog/index.js +2 -0
  52. package/dist/esm/biz-components/NotifyMeDialog/index.js.map +7 -0
  53. package/dist/esm/biz-components/NotifyMeDialog/types.d.ts +111 -0
  54. package/dist/esm/biz-components/NotifyMeDialog/types.js +1 -0
  55. package/dist/esm/biz-components/NotifyMeDialog/types.js.map +7 -0
  56. package/dist/esm/biz-components/ProductNav/ProductNav.js +1 -1
  57. package/dist/esm/biz-components/ProductNav/ProductNav.js.map +3 -3
  58. package/dist/esm/biz-components/ProductNav/types.d.ts +3 -1
  59. package/dist/esm/biz-components/index.d.ts +2 -0
  60. package/dist/esm/biz-components/index.js +1 -1
  61. package/dist/esm/biz-components/index.js.map +3 -3
  62. package/dist/esm/components/tabs.js +1 -1
  63. package/dist/esm/components/tabs.js.map +2 -2
  64. package/package.json +1 -1
  65. package/style.css +33 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/biz-components/NotifyMeDialog/NotifyMeDialog.tsx"],
4
+ "sourcesContent": ["'use client'\n\nimport { useCallback, useEffect, useState } from 'react'\nimport {\n Button,\n Text,\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n Input,\n Checkbox,\n Heading,\n} from '../../components/index.js'\nimport { cn } from '../../helpers/index.js'\nimport type { NotifyMeDialogProps } from './types.js'\nimport * as React from 'react'\nimport { useExposure } from '../../hooks/useExposure.js'\nimport { useAiuiContext } from '../AiuiProvider/index.js'\nimport { gaTrack } from '../../shared/track.js'\n\nconst componentType = 'copy'\nconst componentName = 'NotifyMeDialog'\n\ntype EmailState = 'idle' | 'error-empty' | 'error-format'\ntype SubmitState = 'idle' | 'loading' | 'success' | 'error-submit'\n\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n\nconst NotifyMeDialog = ({\n open,\n onOpenChange,\n copy,\n classNames,\n checkboxes = [],\n subscriptionMeta,\n onSubmit,\n}: NotifyMeDialogProps) => {\n const {\n title,\n subTitle,\n emailLabel = 'Email address',\n emailPlaceholder = 'your@email.com',\n submitBtnText = 'Notify Me',\n errorEmpty,\n errorInvalidEmail,\n errorCheckboxRequired,\n errorSubmit = 'Something went wrong. Please try again.',\n errorSubmitDetail,\n successTitle,\n successDesc,\n successBtnText,\n } = copy\n\n const notifyMeDialogRef = React.useRef<HTMLDivElement>(null)\n const { trackingData } = useAiuiContext()\n useExposure(notifyMeDialogRef, {\n componentType,\n componentName,\n componentTitle: title,\n componentDescription: subTitle,\n })\n\n const [email, setEmail] = useState('')\n const [checkedStates, setCheckedStates] = useState<boolean[]>(() => checkboxes.map(() => false))\n const [emailState, setEmailState] = useState<EmailState>('idle')\n const [checkboxErrors, setCheckboxErrors] = useState<boolean[]>(() => checkboxes.map(() => false))\n const [submitState, setSubmitState] = useState<SubmitState>('idle')\n const [errorCode, setErrorCode] = useState<string | null>(null)\n\n // \u6839\u636E\u9519\u8BEF\u7801\u5339\u914D\u5BF9\u5E94\u6587\u6848\uFF0C\u672A\u5339\u914D\u5230\u5219\u56DE\u9000\u5230 errorSubmit\n const resolvedErrorMessage = errorCode\n ? (errorSubmitDetail?.find(d => d.code === errorCode)?.message ?? errorSubmit)\n : errorSubmit\n\n // \u662F\u5426\u53EF\u4EE5\u70B9\u51FB\u63D0\u4EA4\uFF08loading/success \u65F6\u7981\u7528\uFF09\n const canSubmit = submitState !== 'loading' && submitState !== 'success'\n\n // checkbox \u72B6\u6001\u53D8\u5316\n const updateCheckedState = useCallback(\n (index: number) => {\n // checkbox \u70B9\u51FB\u57CB\u70B9\n const cb = checkboxes[index]\n if (cb) {\n gaTrack({\n event: 'ga4Event',\n event_name: 'component_click',\n event_parameters: {\n page_group: trackingData.pageGroup || 'Home Page',\n component_type: componentType,\n component_name: componentName,\n button_name: cb.label,\n component_title: title,\n component_description: subTitle || '',\n },\n })\n }\n\n setCheckedStates(prev => {\n const next = [...prev]\n next[index] = !next[index]\n return next\n })\n // \u6E05\u9664\u5F53\u524D checkbox \u7684\u9519\u8BEF\u72B6\u6001\n setCheckboxErrors(prev => {\n const next = [...prev]\n next[index] = false\n return next\n })\n // \u6E05\u9664\u90AE\u7BB1\u9519\u8BEF\u548C\u63D0\u4EA4\u9519\u8BEF\n if (emailState !== 'idle') setEmailState('idle')\n if (submitState === 'error-submit') {\n setSubmitState('idle')\n setErrorCode(null)\n }\n },\n [emailState, submitState]\n )\n\n // \u90AE\u7BB1\u8F93\u5165\u53D8\u5316\n const handleEmailChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setEmail(e.target.value)\n if (emailState !== 'idle') setEmailState('idle')\n setCheckboxErrors(prev => (prev.some(Boolean) ? prev.map(() => false) : prev))\n if (submitState === 'error-submit') {\n setSubmitState('idle')\n setErrorCode(null)\n }\n },\n [emailState, submitState]\n )\n\n /**\n * \u5BA2\u6237\u7AEF onSubmit \u8C03\u7528\u793A\u4F8B\n *\n * \u63A5\u53E3\u5931\u8D25\u65F6\u9700 throw { code } \u4EE5\u4FBF\u7EC4\u4EF6\u6309 errorSubmitDetail \u5339\u914D\u5BF9\u5E94\u63D0\u793A\u6587\u6848\uFF0C\n * code \u4E3A number \u7C7B\u578B\u65F6\u7EC4\u4EF6\u4F1A\u81EA\u52A8\u8F6C\u4E3A string \u8FDB\u884C\u5339\u914D\u3002\n *\n * @example\n * const handleNotifyMeSubmit = useCallback(\n * async (params) => {\n * const { email, checkedItems, meta } = params\n * const res = await fetch('/api/multipass/shopifyservices/product_arrival_notices', {\n * method: 'POST',\n * headers: {\n * 'Content-Type': 'application/json',\n * 'current-language': locale,\n * },\n * body: JSON.stringify({\n * email,\n * locale,\n * sku: variant.sku,\n * shop: shop.primaryDomain?.host,\n * }),\n * })\n * if (res.ok) {\n * if (checkedItems?.some?.((item) => item.checked && item.checkbox_id === 'subscribe')) {\n * subscribe({ email, dealsType: 'outStockNotify_subscribe_emails' })\n * }\n * } else {\n * throw { code: res.status }\n * }\n * },\n * [locale, variant.sku, shop.primaryDomain?.host, subscribe],\n * )\n */\n // \u70B9\u51FB\u63D0\u4EA4\n const handleSubmit = useCallback(async () => {\n // \u70B9\u51FB\u63D0\u4EA4\u57CB\u70B9\n gaTrack({\n event: 'ga4Event',\n event_name: 'component_click',\n event_parameters: {\n page_group: trackingData.pageGroup || 'Home Page',\n component_type: componentType,\n component_name: componentName,\n button_name: submitBtnText,\n component_title: title,\n component_description: subTitle || '',\n },\n })\n\n let hasError = false\n\n // \u6821\u9A8C\u90AE\u7BB1\u975E\u7A7A\n if (!email.trim()) {\n setEmailState('error-empty')\n hasError = true\n } else if (!EMAIL_REGEX.test(email.trim())) {\n setEmailState('error-format')\n hasError = true\n } else {\n setEmailState('idle')\n }\n\n // \u6821\u9A8C required checkbox\n const newCheckboxErrors = checkboxes.map((cb, i) => {\n if (cb.label && cb.required && !checkedStates[i]) {\n hasError = true\n return true\n }\n return false\n })\n setCheckboxErrors(newCheckboxErrors)\n\n if (hasError) return\n\n setSubmitState('loading')\n try {\n const checkedItems = checkboxes\n .map((cb, i) =>\n cb.checkbox_id !== undefined ? { checkbox_id: cb.checkbox_id!, checked: checkedStates[i] } : null\n )\n .filter((item): item is { checkbox_id: string; checked: boolean } => item !== null)\n await onSubmit({ email: email.trim(), checkedItems, meta: subscriptionMeta })\n setSubmitState('success')\n } catch (err: unknown) {\n const code =\n err && typeof err === 'object' && 'code' in err ? String((err as Record<string, unknown>).code) : null\n setErrorCode(code)\n setSubmitState('error-submit')\n }\n }, [email, checkboxes, checkedStates, subscriptionMeta, onSubmit])\n\n // error-submit 3s \u540E\u81EA\u52A8\u6D88\u5931\n useEffect(() => {\n if (submitState !== 'error-submit') return\n const timer = setTimeout(() => {\n setSubmitState('idle')\n setErrorCode(null)\n }, 3000)\n return () => clearTimeout(timer)\n }, [submitState])\n\n // \u5173\u95ED\u5F39\u7A97\u65F6\u91CD\u7F6E\n const handleOpenChange = useCallback(\n (isOpen: boolean) => {\n if (!isOpen) {\n setEmail('')\n setCheckedStates(checkboxes.map(() => false))\n setEmailState('idle')\n setCheckboxErrors(checkboxes.map(() => false))\n setSubmitState('idle')\n setErrorCode(null)\n }\n onOpenChange(isOpen)\n },\n [checkboxes, onOpenChange]\n )\n\n const hasCheckboxes = checkboxes.some(cb => cb.label)\n\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent\n ref={notifyMeDialogRef}\n aria-describedby=\"notify-me-content\"\n className={cn(\n 'laptop:max-w-[480px] laptop:[&_.dialog-close-icon]:size-6 laptop:gap-8 rounded-box laptop:p-8 max-h-[90vh] w-[calc(100%-32px)] gap-6 overflow-y-auto bg-white p-6 [&_.dialog-close-icon]:size-5',\n classNames?.root\n )}\n >\n {submitState !== 'success' && (\n <DialogHeader className={cn(classNames?.header)}>\n <DialogTitle>\n <Heading as=\"h2\" size={2} className={cn('text-info-primary text-center font-bold', classNames?.title)}>\n {title}\n </Heading>\n </DialogTitle>\n {subTitle && (\n <DialogDescription asChild>\n <Text\n as=\"p\"\n className={cn('text-info-primary laptop:text-base mt-1 text-center text-sm', classNames?.subTitle)}\n >\n {subTitle}\n </Text>\n </DialogDescription>\n )}\n </DialogHeader>\n )}\n\n {submitState === 'success' ? (\n <div className={cn('flex flex-col items-center text-center', classNames?.successText)}>\n {/* \u6210\u529F\u56FE\u6807 */}\n <div className=\"flex size-20 items-center justify-center\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"80\" height=\"80\" viewBox=\"0 0 80 80\" fill=\"none\">\n <circle cx=\"40\" cy=\"40\" r=\"35\" fill=\"#30D158\" />\n <path\n d=\"M23.3333 38.3333L36.6666 50L56.6666 30\"\n stroke=\"white\"\n strokeWidth=\"6.66667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n <div className=\"mt-4\">\n {/* \u6807\u9898 */}\n <Heading as=\"h3\" size={2} className=\"text-info-primary font-bold\">\n {successTitle}\n </Heading>\n {/* \u526F\u6587\u6848 */}\n {successDesc && (\n <Text as=\"p\" className=\"text-info-primary laptop:text-base mt-1 text-sm\">\n {successDesc}\n </Text>\n )}\n </div>\n {/* \u786E\u8BA4\u6309\u94AE */}\n {successBtnText && (\n <Button\n variant=\"primary\"\n size=\"lg\"\n onClick={() => onOpenChange(false)}\n className=\"laptop:mt-8 mt-6 w-full\"\n >\n {successBtnText}\n </Button>\n )}\n </div>\n ) : (\n <div className=\"flex flex-col gap-4\">\n {/* \u90AE\u7BB1\u8F93\u5165\u6846 */}\n <div className={classNames?.emailInput}>\n <Text\n as=\"label\"\n htmlFor=\"notify-me-email\"\n className=\"text-info-primary laptop:text-base mb-2 block text-sm\"\n >\n {emailLabel}\n </Text>\n <Input\n id=\"notify-me-email\"\n type=\"email\"\n placeholder={emailPlaceholder}\n value={email}\n onChange={handleEmailChange}\n disabled={submitState === 'loading'}\n className={cn(\n 'placeholder:text-info-tertiary text-info-primary laptop:h-[54px] laptop:text-base laptop:p-4 border-lines-1 h-[44px] w-full bg-white p-3 text-sm font-bold placeholder:font-bold focus-visible:!outline-none',\n emailState !== 'idle' && 'border-error-0'\n )}\n />\n {emailState === 'error-empty' && (\n <Text as=\"p\" className=\"text-error-0 laptop:text-base mt-2 text-sm\">\n {errorEmpty}\n </Text>\n )}\n {emailState === 'error-format' && (\n <Text as=\"p\" className=\"text-error-0 laptop:text-base mt-2 text-sm\">\n {errorInvalidEmail}\n </Text>\n )}\n </div>\n\n {/* Checkboxes \u5217\u8868 */}\n {hasCheckboxes && (\n <div className={cn('laptop:gap-4 flex flex-col gap-2', classNames?.checkboxes)}>\n {checkboxes.map((cb, i) => {\n if (!cb.label) return null\n return (\n <div key={i}>\n <label\n className={cn(\n 'text-info-tertiary flex cursor-pointer items-start gap-2',\n classNames?.checkboxItem\n )}\n >\n <Checkbox\n checked={checkedStates[i]}\n onCheckedChange={() => updateCheckedState(i)}\n data-headless-type-name={`${componentType}#${componentName}`}\n data-headless-title-desc-button={`''#''#${cb.label}`}\n data-headless-nav-position={`''#1`}\n disabled={submitState === 'loading'}\n className=\"border-info-secondary data-[state=checked]:bg-info-secondary mt-0.5 shrink-0\"\n />\n <Text\n as=\"span\"\n className=\"text-info-tertiary laptop:text-base [&_a]:text-brand-0 text-sm leading-snug [&_a]:underline\"\n html={cb.label}\n />\n </label>\n {checkboxErrors[i] && (\n <Text as=\"p\" className=\"text-error-0 laptop:text-base mt-2 text-sm\">\n {errorCheckboxRequired}\n </Text>\n )}\n </div>\n )\n })}\n </div>\n )}\n\n {/* \u63D0\u4EA4\u6309\u94AE */}\n <Button\n variant=\"primary\"\n size=\"lg\"\n loading={submitState === 'loading'}\n disabled={!canSubmit}\n onClick={handleSubmit}\n className={cn('w-full', classNames?.submitBtn)}\n data-headless-type-name={`${componentType}#${componentName}`}\n data-headless-title-desc-button={`''#''#${submitBtnText}`}\n data-headless-nav-position={`''#1`}\n >\n {submitBtnText}\n </Button>\n\n {/* \u63D0\u4EA4\u9519\u8BEF\uFF08\u5F39\u7A97\u6700\u5E95\u90E8\uFF09 */}\n {submitState === 'error-submit' && (\n <Text as=\"p\" className={cn('text-error-0 laptop:text-base text-sm', classNames?.errorText)}>\n {resolvedErrorMessage}\n </Text>\n )}\n </div>\n )}\n </DialogContent>\n </Dialog>\n )\n}\n\nNotifyMeDialog.displayName = 'NotifyMeDialog'\n\nexport default NotifyMeDialog\nexport type { NotifyMeDialogProps }\n"],
5
+ "mappings": "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",
6
+ "names": ["jsx", "jsxs", "useCallback", "useEffect", "useState", "Button", "Text", "Dialog", "DialogContent", "DialogHeader", "DialogTitle", "DialogDescription", "Input", "Checkbox", "Heading", "cn", "React", "useExposure", "useAiuiContext", "gaTrack", "componentType", "componentName", "EMAIL_REGEX", "NotifyMeDialog", "open", "onOpenChange", "copy", "classNames", "checkboxes", "subscriptionMeta", "onSubmit", "title", "subTitle", "emailLabel", "emailPlaceholder", "submitBtnText", "errorEmpty", "errorInvalidEmail", "errorCheckboxRequired", "errorSubmit", "errorSubmitDetail", "successTitle", "successDesc", "successBtnText", "notifyMeDialogRef", "trackingData", "email", "setEmail", "checkedStates", "setCheckedStates", "emailState", "setEmailState", "checkboxErrors", "setCheckboxErrors", "submitState", "setSubmitState", "errorCode", "setErrorCode", "resolvedErrorMessage", "d", "canSubmit", "updateCheckedState", "index", "cb", "prev", "next", "handleEmailChange", "handleSubmit", "hasError", "newCheckboxErrors", "i", "checkedItems", "item", "err", "code", "timer", "handleOpenChange", "isOpen", "hasCheckboxes", "NotifyMeDialog_default"]
7
+ }
@@ -0,0 +1,2 @@
1
+ export { default as NotifyMeDialog } from './NotifyMeDialog.js';
2
+ export type { NotifyMeDialogProps, NotifyMeDialogCopy, NotifyMeDialogSemanticName, CheckboxConfig, ErrorDetail, SubscribeFormData, SubscriptionMeta, } from './types.js';
@@ -0,0 +1,2 @@
1
+ import{default as i}from"./NotifyMeDialog.js";export{i as NotifyMeDialog};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/biz-components/NotifyMeDialog/index.tsx"],
4
+ "sourcesContent": ["export { default as NotifyMeDialog } from './NotifyMeDialog.js'\nexport type {\n NotifyMeDialogProps,\n NotifyMeDialogCopy,\n NotifyMeDialogSemanticName,\n CheckboxConfig,\n ErrorDetail,\n SubscribeFormData,\n SubscriptionMeta,\n} from './types.js'\n"],
5
+ "mappings": "AAAA,OAAoB,WAAXA,MAAiC",
6
+ "names": ["default"]
7
+ }
@@ -0,0 +1,111 @@
1
+ /**
2
+ * CheckboxConfig - 勾选框配置
3
+ *
4
+ * 每项独立控制展示与提交限制,顺序按数组顺序渲染。
5
+ * label 有值时展示该项,无值时跳过不渲染。
6
+ */
7
+ export interface CheckboxConfig {
8
+ /** checkbox 名称标识,用于提交时识别选中了哪些项 */
9
+ checkbox_id: string;
10
+ /** checkbox 旁展示的文案;为空或不传则不渲染该 checkbox */
11
+ label: string;
12
+ /** 是否必须勾选才能提交;true 时未勾选则按钮 disabled;默认 false */
13
+ required?: boolean;
14
+ }
15
+ /**
16
+ * SubscriptionMeta - 订阅元数据
17
+ *
18
+ * 区分 OOS 到货通知和活动订阅两种模式,确保提交时携带正确的业务参数。
19
+ */
20
+ export type SubscriptionMeta = {
21
+ /** 固定值,标识 OOS 到货通知 */
22
+ mode: 'oos';
23
+ } | {
24
+ /** 固定值,标识活动订阅 */
25
+ mode: 'activity';
26
+ /** 活动标识,由业务层从 activeNotifyInfo 配置中读取 */
27
+ dealsType: string;
28
+ };
29
+ /**
30
+ * ErrorDetail - 按错误码映射错误提示
31
+ *
32
+ * 支持消费方根据接口返回的错误码配置不同的提示文案。
33
+ * code 匹配时显示对应 message;未匹配到则回退到 errorSubmit。
34
+ */
35
+ export interface ErrorDetail {
36
+ /** 错误码,如 "422"、"500" */
37
+ code: string;
38
+ /** 该错误码对应的提示文案 */
39
+ message: string;
40
+ }
41
+ /**
42
+ * NotifyMeDialogCopy - 文案配置
43
+ *
44
+ * 将弹窗内所有可配置文案集中到一个对象中,
45
+ * 方便从 CMS / 多语言配置层一次性传入。
46
+ */
47
+ export interface NotifyMeDialogCopy {
48
+ /** 弹窗主标题,如 "Email me when available" */
49
+ title: string;
50
+ /** 弹窗副标题;为空时不渲染 */
51
+ subTitle?: string;
52
+ /** 邮箱输入框占位文案 */
53
+ emailPlaceholder?: string;
54
+ /** 提交按钮文案 */
55
+ submitBtnText?: string;
56
+ /** 邮箱输入框标签文案,默认 "Email address" */
57
+ emailLabel?: string;
58
+ /** 邮箱输入框为空时的错误提示 */
59
+ errorEmpty: string;
60
+ /** 邮箱格式不合法时的错误提示 */
61
+ errorInvalidEmail: string;
62
+ /** 必选 checkbox 未勾选时的提示文案 */
63
+ errorCheckboxRequired: string;
64
+ /** 接口调用失败时的默认错误提示,当 errorSubmitDetail 中未匹配到对应 code 时使用 */
65
+ errorSubmit?: string;
66
+ /** 按错误码映射的错误提示,code 匹配到时显示对应 message;未传入或不匹配时回退到 errorSubmit */
67
+ errorSubmitDetail?: ErrorDetail[];
68
+ /** 提交成功后的主标题 */
69
+ successTitle: string;
70
+ /** 提交成功后的副文案;为空时不渲染 */
71
+ successDesc?: string;
72
+ /** 提交成功后的按钮文案;为空时不渲染按钮 */
73
+ successBtnText?: string;
74
+ }
75
+ /**
76
+ * NotifyMeDialogSemanticName - 组件语义化区域名
77
+ *
78
+ * 用于 classNames prop,按语义区域自定义样式。
79
+ * 未传入的 key 使用组件默认样式。
80
+ */
81
+ export type NotifyMeDialogSemanticName = 'root' | 'header' | 'title' | 'subTitle' | 'emailInput' | 'checkboxes' | 'checkboxItem' | 'submitBtn' | 'errorText' | 'successText';
82
+ /**
83
+ * SubscribeFormData - 提交时暴露的完整表单数据
84
+ */
85
+ export interface SubscribeFormData {
86
+ /** 用户输入的邮箱 */
87
+ email: string;
88
+ /** 各 checkbox 的状态列表,仅包含配置了 name 的项 */
89
+ checkedItems: {
90
+ checkbox_id: string;
91
+ checked: boolean;
92
+ }[];
93
+ /** 订阅元数据 */
94
+ meta: SubscriptionMeta;
95
+ }
96
+ export interface NotifyMeDialogProps {
97
+ /** 是否打开弹窗 */
98
+ open: boolean;
99
+ /** 关闭弹窗回调 */
100
+ onOpenChange: (open: boolean) => void;
101
+ /** 文案配置 */
102
+ copy: NotifyMeDialogCopy;
103
+ /** 各区域自定义样式 */
104
+ classNames?: Partial<Record<NotifyMeDialogSemanticName, string>>;
105
+ /** 勾选框列表,支持配置多个;每项 label 有值时展示,无值时跳过 */
106
+ checkboxes?: CheckboxConfig[];
107
+ /** 订阅元数据,区分 OOS / 活动两种模式 */
108
+ subscriptionMeta: SubscriptionMeta;
109
+ /** 提交回调,接收完整表单数据,业务层决定调哪个接口 */
110
+ onSubmit: (data: SubscribeFormData) => Promise<void>;
111
+ }
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -1,2 +1,2 @@
1
- "use client";import{jsx as o,jsxs as i}from"react/jsx-runtime";import{useState as Y,useEffect as w,useCallback as F,forwardRef as G,useImperativeHandle as I,useRef as f}from"react";import{cn as T}from"../../helpers/utils.js";import{withLayout as V}from"../../shared/Styles.js";import{Button as L,Text as N}from"../../components/index.js";import{useExposure as _}from"../../hooks/useExposure.js";import*as E from"@radix-ui/react-popover";const $="navigation",q="product_nav",O=k=>o("svg",{width:"20",height:"20",viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",...k,children:o("path",{d:"M5 7.5L10 12.5L15 7.5",stroke:"currentColor",strokeWidth:"1.66667",strokeLinecap:"round",strokeLinejoin:"round"})}),M=G(({className:k="",data:D,id:H,onAnchorClick:P,scrollOffsetExtra:b=0},A)=>{const{tabLinks:v=[],anchorList:r=[],textLink:a,buyBtn:p,theme:B="light"}=D||{},[z,x]=Y(""),d=f(null),g=f(!1),u=f(""),m=f(null),y=f(new Map);I(A,()=>d.current),_(d,{componentType:$,componentName:q});const h=F(()=>{if(r.length===0)return;const e=window.scrollY;window.scrollTo({top:0,behavior:"instant"}),requestAnimationFrame(()=>{const t=new Map;r.forEach(s=>{const n=document.getElementById(s.id);if(n){const l=n.getBoundingClientRect();t.set(s.id,l.top+window.scrollY)}}),y.current=t,window.scrollTo({top:e,behavior:"instant"})})},[r]);w(()=>{if(r.length===0)return;const e=setTimeout(h,100);return()=>clearTimeout(e)},[r,h]),w(()=>{if(r.length===0)return;let e=null;const t=new ResizeObserver(()=>{e&&clearTimeout(e),e=setTimeout(h,150)});return t.observe(document.body),()=>{t.disconnect(),e&&clearTimeout(e)}},[r,h]),w(()=>{if(r.length===0)return;const e=()=>{if(g.current){m.current&&clearTimeout(m.current),m.current=setTimeout(()=>{g.current=!1,u.current&&(x(u.current),u.current="")},100);return}const s=d.current?.offsetHeight||0,n=window.scrollY+s+b+10;let l="";const S=y.current;for(let c=r.length-1;c>=0;c--){const R=r[c],C=S.get(R.id);if(C!==void 0&&n>=C){l=R.id;break}}if(!l&&r.length>0){const c=S.get(r[0].id);c!==void 0&&n<c&&(l="")}x(l)},t=setTimeout(()=>{e()},200);return window.addEventListener("scroll",e,{passive:!0}),()=>{clearTimeout(t),window.removeEventListener("scroll",e),m.current&&clearTimeout(m.current)}},[r,b]),w(()=>{const e=document.querySelectorAll(".header"),t=[];return e.forEach(s=>{const n=s;t.push({element:n,originalPosition:n.style.position||getComputedStyle(n).position}),n.style.position="relative"}),()=>{t.forEach(({element:s,originalPosition:n})=>{s.style.position=n==="static"?"":n})}},[]);const j=(e,t)=>{e.preventDefault();const s=y.current.get(t);if(s===void 0){console.warn(`Cached position for "${t}" not found`);return}x(t),u.current=t,g.current=!0;const n=d.current?.offsetHeight||0,l=s-n-b;window.scrollTo({top:l,behavior:"smooth"}),window.history.pushState(null,"",`#${t}`)};return i("div",{id:H,ref:d,className:T("product-nav text-info-primary bg-container-primary tablet:px-8 laptop:px-16 desktop:px-16 lg-desktop:px-[calc(50%-832px)] !sticky top-0 !z-[51] flex w-full justify-between overflow-hidden px-4 py-0",{"aiui-dark":B==="dark"},k),children:[i("div",{className:"product-nav-main desktop:flex-row desktop:gap-[48px] flex w-full flex-col justify-start",children:[i("div",{className:"product-nav-header laptop:w-full desktop:w-fit desktop:gap-[24px] desktop:py-0 flex w-full flex-row items-center justify-between gap-[16px] pt-[14px]",children:[i("div",{className:"product-nav-tabs flex flex-row items-center gap-[8px]",children:[v.map((e,t)=>i("div",{className:"product-nav-tab-item flex items-center gap-[8px]",children:[o("a",{href:e.link,className:T("product-nav-tab-link hover:text-brand-color text-nowrap text-[14px] font-bold tracking-[-0.04em]",{"text-[#6D6D6F]":t!==0,"hidden desktop:block":t===1}),children:o("span",{children:e.label})}),t!==v.length-1&&o("div",{className:"product-nav-tab-divider desktop:inline-block hidden h-[14px] w-px bg-[#E4E5E6]"})]},e.link||t)),v.length>1&&i(E.Root,{children:[o(E.Trigger,{asChild:!0,children:o("button",{className:"product-nav-dropdown-trigger desktop:hidden -ml-1 inline-block","aria-label":"More products",children:o(O,{className:"text-[#1D1D1F]"})})}),o(E.Content,{className:"product-nav-dropdown-content rounded-[6px] border border-[#E4E5E6] bg-white p-[6px] px-[8px] py-[4px]",style:{boxShadow:"0px 4px 8px 0px rgba(0,0,0,0.12)"},side:"bottom",align:"end",alignOffset:10,sideOffset:10,children:v.slice(1).map(e=>o("a",{href:e.link,className:"product-nav-dropdown-link hover:text-brand-color text-nowrap",children:o("span",{children:e.label})},e.link))})]})]}),i("div",{className:"product-nav-mobile-actions desktop:hidden desktop:gap-[24px] flex items-center gap-[16px]",children:[a?.link&&o("a",{href:a.link,target:a.target||"_self",className:"product-nav-text-link hover:text-brand-color cursor-pointer",children:o(N,{size:2,className:"text-nowrap",children:a.text})}),p?.link&&o(L,{as:"a",href:p.link,size:"sm",className:"product-nav-buy-button text-nowrap",children:p.text})]})]}),o("div",{className:"product-nav-anchors laptop:w-fit desktop:gap-[24px] desktop:py-[8px] flex w-full items-center gap-[16px] overflow-x-scroll py-[12px] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden",children:r.map((e,t)=>i("a",{href:`#${e.id}`,className:"product-nav-anchor-link",onClick:s=>{P?(s.preventDefault(),x(e.id),u.current=e.id,g.current=!0,P(e,t)):j(s,e.id)},children:[o(N,{size:2,className:"product-nav-anchor-text text-nowrap",children:e.label}),o("div",{className:T("product-nav-anchor-indicator laptop:top-[12px] desktop:top-[10px] relative top-[12px] h-[4px] w-full bg-transparent",{"!bg-brand-0":z===e.id})})]},e.id))})]}),i("div",{className:"product-nav-desktop-actions desktop:flex desktop:gap-[24px] desktop:py-[8px] hidden items-center gap-[16px]",children:[a?.link&&o("a",{href:a.link,target:a.target||"_self",className:"product-nav-text-link hover:text-brand-color cursor-pointer text-black",children:o(N,{size:2,className:"text-nowrap",children:a.text})}),p?.link&&o(L,{as:"a",href:p.link,size:"sm",className:"product-nav-buy-button text-nowrap",children:p.text})]})]})});M.displayName="ProductNav";var X=V(M);export{X as default};
1
+ "use client";import{jsx as o,jsxs as a}from"react/jsx-runtime";import{useState as F,useEffect as b,useCallback as G,forwardRef as V,useImperativeHandle as _,useRef as v}from"react";import{cn as E}from"../../helpers/utils.js";import{withLayout as $}from"../../shared/Styles.js";import{Button as L,Text as P}from"../../components/index.js";import{useExposure as q}from"../../hooks/useExposure.js";import*as S from"@radix-ui/react-popover";const O="navigation",W="product_nav",y=c=>c.anchorId??c.id??"",J=c=>o("svg",{width:"20",height:"20",viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",...c,children:o("path",{d:"M5 7.5L10 12.5L15 7.5",stroke:"currentColor",strokeWidth:"1.66667",strokeLinecap:"round",strokeLinejoin:"round"})}),M=V(({className:c="",data:D,id:H,onAnchorClick:R,scrollOffsetExtra:T=0},I)=>{const{tabLinks:h=[],anchorList:s=[],textLink:l,buyBtn:p,theme:B="light"}=D||{},[z,x]=F(""),u=v(null),g=v(!1),m=v(""),f=v(null),N=v(new Map);_(I,()=>u.current),q(u,{componentType:O,componentName:W});const w=G(()=>{if(s.length===0)return;const e=window.scrollY;window.scrollTo({top:0,behavior:"instant"}),requestAnimationFrame(()=>{const t=new Map;s.forEach(r=>{const n=y(r),i=document.getElementById(n);if(i){const k=i.getBoundingClientRect();t.set(n,k.top+window.scrollY)}}),N.current=t,window.scrollTo({top:e,behavior:"instant"})})},[s]);b(()=>{if(s.length===0)return;const e=setTimeout(w,100);return()=>clearTimeout(e)},[s,w]),b(()=>{if(s.length===0)return;let e=null;const t=new ResizeObserver(()=>{e&&clearTimeout(e),e=setTimeout(w,150)});return t.observe(document.body),()=>{t.disconnect(),e&&clearTimeout(e)}},[s,w]),b(()=>{if(s.length===0)return;const e=()=>{if(g.current){f.current&&clearTimeout(f.current),f.current=setTimeout(()=>{g.current=!1,m.current&&(x(m.current),m.current="")},100);return}const r=u.current?.offsetHeight||0,n=window.scrollY+r+T+10;let i="";const k=N.current;for(let d=s.length-1;d>=0;d--){const Y=s[d],A=y(Y),C=k.get(A);if(C!==void 0&&n>=C){i=A;break}}if(!i&&s.length>0){const d=k.get(y(s[0]));d!==void 0&&n<d&&(i="")}x(i)},t=setTimeout(()=>{e()},200);return window.addEventListener("scroll",e,{passive:!0}),()=>{clearTimeout(t),window.removeEventListener("scroll",e),f.current&&clearTimeout(f.current)}},[s,T]),b(()=>{const e=document.querySelectorAll(".header"),t=[];return e.forEach(r=>{const n=r;t.push({element:n,originalPosition:n.style.position||getComputedStyle(n).position}),n.style.position="relative"}),()=>{t.forEach(({element:r,originalPosition:n})=>{r.style.position=n==="static"?"":n})}},[]);const j=(e,t)=>{e.preventDefault();const r=N.current.get(t);if(r===void 0){console.warn(`Cached position for "${t}" not found`);return}x(t),m.current=t,g.current=!0;const n=u.current?.offsetHeight||0,i=r-n-T;window.scrollTo({top:i,behavior:"smooth"}),window.history.pushState(null,"",`#${t}`)};return a("div",{id:H,ref:u,className:E("product-nav text-info-primary bg-container-primary tablet:px-8 laptop:px-16 desktop:px-16 lg-desktop:px-[calc(50%-832px)] !sticky top-0 !z-[51] flex w-full justify-between overflow-hidden px-4 py-0",{"aiui-dark":B==="dark"},c),children:[a("div",{className:"product-nav-main desktop:flex-row desktop:gap-[48px] flex w-full flex-col justify-start",children:[a("div",{className:"product-nav-header laptop:w-full desktop:w-fit desktop:gap-[24px] desktop:py-0 flex w-full flex-row items-center justify-between gap-[16px] pt-[14px]",children:[a("div",{className:"product-nav-tabs flex flex-row items-center gap-[8px]",children:[h.map((e,t)=>a("div",{className:"product-nav-tab-item flex items-center gap-[8px]",children:[o("a",{href:e.link,className:E("product-nav-tab-link hover:text-brand-color text-nowrap text-[14px] font-bold tracking-[-0.04em]",{"text-[#6D6D6F]":t!==0,"hidden desktop:block":t===1}),children:o("span",{children:e.label})}),t!==h.length-1&&o("div",{className:"product-nav-tab-divider desktop:inline-block hidden h-[14px] w-px bg-[#E4E5E6]"})]},e.link||t)),h.length>1&&a(S.Root,{children:[o(S.Trigger,{asChild:!0,children:o("button",{className:"product-nav-dropdown-trigger desktop:hidden -ml-1 inline-block","aria-label":"More products",children:o(J,{className:"text-[#1D1D1F]"})})}),o(S.Content,{className:"product-nav-dropdown-content rounded-[6px] border border-[#E4E5E6] bg-white p-[6px] px-[8px] py-[4px]",style:{boxShadow:"0px 4px 8px 0px rgba(0,0,0,0.12)"},side:"bottom",align:"end",alignOffset:10,sideOffset:10,children:h.slice(1).map(e=>o("a",{href:e.link,className:"product-nav-dropdown-link hover:text-brand-color text-nowrap",children:o("span",{children:e.label})},e.link))})]})]}),a("div",{className:"product-nav-mobile-actions desktop:hidden desktop:gap-[24px] flex items-center gap-[16px]",children:[l?.link&&o("a",{href:l.link,target:l.target||"_self",className:"product-nav-text-link hover:text-brand-color cursor-pointer",children:o(P,{size:2,className:"text-nowrap",children:l.text})}),p?.link&&o(L,{as:"a",href:p.link,size:"sm",className:"product-nav-buy-button text-nowrap",children:p.text})]})]}),o("div",{className:"product-nav-anchors laptop:w-fit desktop:gap-[24px] desktop:py-[8px] flex w-full items-center gap-[16px] overflow-x-scroll py-[12px] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden",children:s.map((e,t)=>{const r=y(e);return a("a",{href:`#${r}`,className:"product-nav-anchor-link",onClick:n=>{R?(n.preventDefault(),x(r),m.current=r,g.current=!0,R(e,t)):j(n,r)},children:[o(P,{size:2,className:"product-nav-anchor-text text-nowrap",children:e.label}),o("div",{className:E("product-nav-anchor-indicator laptop:top-[12px] desktop:top-[10px] relative top-[12px] h-[4px] w-full bg-transparent",{"!bg-brand-0":z===r})})]},r)})})]}),a("div",{className:"product-nav-desktop-actions desktop:flex desktop:gap-[24px] desktop:py-[8px] hidden items-center gap-[16px]",children:[l?.link&&o("a",{href:l.link,target:l.target||"_self",className:"product-nav-text-link hover:text-brand-color cursor-pointer text-black",children:o(P,{size:2,className:"text-nowrap",children:l.text})}),p?.link&&o(L,{as:"a",href:p.link,size:"sm",className:"product-nav-buy-button text-nowrap",children:p.text})]})]})});M.displayName="ProductNav";var ee=$(M);export{ee as default};
2
2
  //# sourceMappingURL=ProductNav.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/biz-components/ProductNav/ProductNav.tsx"],
4
- "sourcesContent": ["'use client'\nimport { useState, useEffect, useCallback, forwardRef, useImperativeHandle, useRef } from 'react'\nimport { cn } from '../../helpers/utils.js'\nimport { withLayout } from '../../shared/Styles.js'\nimport { Button, Text } from '../../components/index.js'\nimport { useExposure } from '../../hooks/useExposure.js'\nimport type { ProductNavProps } from './types.js'\nimport * as Popover from '@radix-ui/react-popover'\n\nconst componentType = 'navigation'\nconst componentName = 'product_nav'\n\nconst ChevronDownIcon = (props: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path\n d=\"M5 7.5L10 12.5L15 7.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.66667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nconst ProductNav = forwardRef<HTMLDivElement, ProductNavProps>(\n ({ className = '', data, id, onAnchorClick, scrollOffsetExtra = 0 }, ref) => {\n const { tabLinks = [], anchorList = [], textLink, buyBtn, theme = 'light' } = data || {}\n const [activeAnchorId, setActiveAnchorId] = useState('')\n const innerRef = useRef<HTMLDivElement>(null)\n const isScrollingRef = useRef(false) // \u6807\u8BB0\u662F\u5426\u6B63\u5728\u7A0B\u5E8F\u5316\u6EDA\u52A8\u4E2D\n const targetAnchorIdRef = useRef<string>('') // \u8BB0\u5F55\u70B9\u51FB\u76EE\u6807\u951A\u70B9\n const scrollEndTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null) // \u6EDA\u52A8\u7ED3\u675F\u68C0\u6D4B\u5B9A\u65F6\u5668\n const anchorPositionsRef = useRef<Map<string, number>>(new Map()) // \u7F13\u5B58\u951A\u70B9\u539F\u59CB\u4F4D\u7F6E\n\n useImperativeHandle(ref, () => innerRef.current as HTMLDivElement)\n\n useExposure(innerRef, {\n componentType,\n componentName,\n })\n\n // \u7F13\u5B58\u6240\u6709\u951A\u70B9\u7684\u7EDD\u5BF9\u4F4D\u7F6E\uFF08\u6EDA\u52A8\u5230\u9876\u90E8\u540E\u8BA1\u7B97\uFF0C\u907F\u514D sticky \u5F71\u54CD\uFF09\n const updateAnchorPositions = useCallback(() => {\n if (anchorList.length === 0) return\n\n const originalScrollY = window.scrollY\n window.scrollTo({ top: 0, behavior: 'instant' as ScrollBehavior })\n\n requestAnimationFrame(() => {\n const positions = new Map<string, number>()\n anchorList.forEach(anchor => {\n const element = document.getElementById(anchor.id)\n if (element) {\n const rect = element.getBoundingClientRect()\n positions.set(anchor.id, rect.top + window.scrollY)\n }\n })\n anchorPositionsRef.current = positions\n\n window.scrollTo({ top: originalScrollY, behavior: 'instant' as ScrollBehavior })\n })\n }, [anchorList])\n\n // \u521D\u59CB\u5316\u65F6\u7F13\u5B58\u6240\u6709\u951A\u70B9\u7684\u539F\u59CB\u4F4D\u7F6E\n useEffect(() => {\n if (anchorList.length === 0) return\n\n // \u9875\u9762\u52A0\u8F7D\u540E\u5EF6\u8FDF\u8BA1\u7B97\uFF0C\u786E\u4FDD\u5E03\u5C40\u5B8C\u6210\n const timer = setTimeout(updateAnchorPositions, 100)\n\n return () => clearTimeout(timer)\n }, [anchorList, updateAnchorPositions])\n\n // \u76D1\u542C body \u9AD8\u5EA6\u53D8\u5316\uFF0C\u9AD8\u5EA6\u6539\u53D8\u65F6\u91CD\u65B0\u8BA1\u7B97\u951A\u70B9\u4F4D\u7F6E\n useEffect(() => {\n if (anchorList.length === 0) return\n\n let resizeTimer: ReturnType<typeof setTimeout> | null = null\n\n const observer = new ResizeObserver(() => {\n // debounce\uFF0C\u907F\u514D\u9AD8\u9891\u89E6\u53D1\n if (resizeTimer) clearTimeout(resizeTimer)\n resizeTimer = setTimeout(updateAnchorPositions, 150)\n })\n\n observer.observe(document.body)\n\n return () => {\n observer.disconnect()\n if (resizeTimer) clearTimeout(resizeTimer)\n }\n }, [anchorList, updateAnchorPositions])\n\n // \u6EDA\u52A8\u76D1\u542C\uFF1A\u68C0\u6D4B\u5F53\u524D\u6EDA\u52A8\u4F4D\u7F6E\u5BF9\u5E94\u7684\u951A\u70B9\n useEffect(() => {\n if (anchorList.length === 0) return\n\n const handleScroll = () => {\n // \u5982\u679C\u6B63\u5728\u7A0B\u5E8F\u5316\u6EDA\u52A8\u4E2D\uFF0C\u4F7F\u7528 debounce \u68C0\u6D4B\u6EDA\u52A8\u7ED3\u675F\n if (isScrollingRef.current) {\n // \u6E05\u9664\u4E4B\u524D\u7684\u5B9A\u65F6\u5668\n if (scrollEndTimerRef.current) {\n clearTimeout(scrollEndTimerRef.current)\n }\n // \u8BBE\u7F6E\u65B0\u7684\u5B9A\u65F6\u5668\uFF0C100ms \u6CA1\u6709\u65B0\u6EDA\u52A8\u4E8B\u4EF6\u5219\u8BA4\u4E3A\u6EDA\u52A8\u7ED3\u675F\n scrollEndTimerRef.current = setTimeout(() => {\n isScrollingRef.current = false\n // \u6EDA\u52A8\u7ED3\u675F\u540E\uFF0C\u786E\u4FDD\u9AD8\u4EAE\u505C\u7559\u5728\u76EE\u6807\u951A\u70B9\n if (targetAnchorIdRef.current) {\n setActiveAnchorId(targetAnchorIdRef.current)\n targetAnchorIdRef.current = ''\n }\n }, 100)\n return\n }\n\n const navHeight = innerRef.current?.offsetHeight || 0\n const scrollPosition = window.scrollY + navHeight + scrollOffsetExtra + 10 // 10px \u7F13\u51B2\n\n let currentAnchorId = ''\n\n // \u4F7F\u7528\u7F13\u5B58\u7684\u951A\u70B9\u4F4D\u7F6E\n const positions = anchorPositionsRef.current\n\n // \u904D\u5386\u6240\u6709\u951A\u70B9\uFF0C\u627E\u5230\u5F53\u524D\u6EDA\u52A8\u4F4D\u7F6E\u5BF9\u5E94\u7684\u951A\u70B9\n for (let i = anchorList.length - 1; i >= 0; i--) {\n const anchor = anchorList[i]\n const elementTop = positions.get(anchor.id)\n if (elementTop !== undefined && scrollPosition >= elementTop) {\n currentAnchorId = anchor.id\n break\n }\n }\n\n // \u5982\u679C\u6CA1\u6709\u627E\u5230\u4E14\u7F13\u5B58\u4E2D\u6709\u7B2C\u4E00\u4E2A\u951A\u70B9\u7684\u4F4D\u7F6E\n if (!currentAnchorId && anchorList.length > 0) {\n const firstElementTop = positions.get(anchorList[0].id)\n if (firstElementTop !== undefined && scrollPosition < firstElementTop) {\n currentAnchorId = ''\n }\n }\n\n setActiveAnchorId(currentAnchorId)\n }\n\n // \u5EF6\u8FDF\u521D\u59CB\u5316\uFF0C\u7B49\u5F85\u4F4D\u7F6E\u7F13\u5B58\u5B8C\u6210\n const timer = setTimeout(() => {\n handleScroll()\n }, 200)\n\n window.addEventListener('scroll', handleScroll, { passive: true })\n return () => {\n clearTimeout(timer)\n window.removeEventListener('scroll', handleScroll)\n // \u6E05\u7406\u5B9A\u65F6\u5668\n if (scrollEndTimerRef.current) {\n clearTimeout(scrollEndTimerRef.current)\n }\n }\n }, [anchorList, scrollOffsetExtra])\n\n // \u8BBE\u7F6E\u9875\u9762\u4E2Dheader\u5143\u7D20\u7684position\u4E3Arelative\n useEffect(() => {\n const headerElements = document.querySelectorAll('.header')\n const originalStyles: { element: HTMLElement; originalPosition: string }[] = []\n\n headerElements.forEach(element => {\n const htmlElement = element as HTMLElement\n // \u4FDD\u5B58\u539F\u59CB\u6837\u5F0F\n originalStyles.push({\n element: htmlElement,\n originalPosition: htmlElement.style.position || getComputedStyle(htmlElement).position,\n })\n // \u8BBE\u7F6E\u4E3Arelative\n htmlElement.style.position = 'relative'\n })\n\n // \u6E05\u7406\u51FD\u6570\uFF1A\u6062\u590D\u539F\u59CB\u6837\u5F0F\n return () => {\n originalStyles.forEach(({ element, originalPosition }) => {\n element.style.position = originalPosition === 'static' ? '' : originalPosition\n })\n }\n }, [])\n\n // \u5904\u7406\u951A\u70B9\u70B9\u51FB\u6EDA\u52A8\n const handleAnchorClick = (e: React.MouseEvent, anchorId: string) => {\n e.preventDefault()\n\n // \u4F7F\u7528\u7F13\u5B58\u7684\u4F4D\u7F6E\n const elementAbsoluteTop = anchorPositionsRef.current.get(anchorId)\n if (elementAbsoluteTop === undefined) {\n console.warn(`Cached position for \"${anchorId}\" not found`)\n return\n }\n\n // \u7ACB\u5373\u66F4\u65B0\u9AD8\u4EAE\u72B6\u6001\uFF0C\u907F\u514D\u6EDA\u52A8\u8FC7\u7A0B\u4E2D\u95EA\u70C1\n setActiveAnchorId(anchorId)\n\n // \u8BB0\u5F55\u76EE\u6807\u951A\u70B9\uFF0C\u7528\u4E8E\u6EDA\u52A8\u7ED3\u675F\u540E\u786E\u4FDD\u9AD8\u4EAE\u6B63\u786E\n targetAnchorIdRef.current = anchorId\n\n // \u6807\u8BB0\u6B63\u5728\u7A0B\u5E8F\u5316\u6EDA\u52A8\uFF0C\u6682\u505C\u6EDA\u52A8\u76D1\u542C\n isScrollingRef.current = true\n\n // \u83B7\u53D6\u5BFC\u822A\u680F\u9AD8\u5EA6\n const navHeight = innerRef.current?.offsetHeight || 0\n\n // \u76EE\u6807\u6EDA\u52A8\u4F4D\u7F6E = \u7F13\u5B58\u7684\u5143\u7D20\u7EDD\u5BF9\u4F4D\u7F6E - \u5BFC\u822A\u680F\u9AD8\u5EA6 - \u989D\u5916\u504F\u79FB\n const targetPosition = elementAbsoluteTop - navHeight - scrollOffsetExtra\n\n // \u5E73\u6ED1\u6EDA\u52A8\u5230\u76EE\u6807\u4F4D\u7F6E\n window.scrollTo({\n top: targetPosition,\n behavior: 'smooth',\n })\n\n // \u66F4\u65B0 URL hash\uFF08\u4E0D\u89E6\u53D1\u9875\u9762\u8DF3\u8F6C\uFF09\n window.history.pushState(null, '', `#${anchorId}`)\n\n // \u6CE8\u610F\uFF1A\u6EDA\u52A8\u7ED3\u675F\u68C0\u6D4B\u7531 handleScroll \u4E2D\u7684 debounce \u903B\u8F91\u5904\u7406\n // \u4E0D\u518D\u4F7F\u7528\u56FA\u5B9A 800ms \u8D85\u65F6\uFF0C\u800C\u662F\u68C0\u6D4B\u5B9E\u9645\u6EDA\u52A8\u7ED3\u675F\n }\n\n return (\n <div\n id={id}\n ref={innerRef}\n className={cn(\n 'product-nav text-info-primary bg-container-primary tablet:px-8 laptop:px-16 desktop:px-16 lg-desktop:px-[calc(50%-832px)] !sticky top-0 !z-[51] flex w-full justify-between overflow-hidden px-4 py-0',\n {\n 'aiui-dark': theme === 'dark',\n },\n className\n )}\n >\n <div className=\"product-nav-main desktop:flex-row desktop:gap-[48px] flex w-full flex-col justify-start\">\n {/* Tab Links Section */}\n <div className=\"product-nav-header laptop:w-full desktop:w-fit desktop:gap-[24px] desktop:py-0 flex w-full flex-row items-center justify-between gap-[16px] pt-[14px]\">\n <div className=\"product-nav-tabs flex flex-row items-center gap-[8px]\">\n {tabLinks.map((tabLink, index) => {\n return (\n <div key={tabLink.link || index} className=\"product-nav-tab-item flex items-center gap-[8px]\">\n <a\n href={tabLink.link}\n className={cn(\n 'product-nav-tab-link hover:text-brand-color text-nowrap text-[14px] font-bold tracking-[-0.04em]',\n {\n 'text-[#6D6D6F]': index !== 0,\n 'hidden desktop:block': index === 1,\n }\n )}\n // onClick={() => onShowSpecs?.(false)}\n >\n <span>{tabLink.label}</span>\n </a>\n {index !== tabLinks.length - 1 && (\n <div className=\"product-nav-tab-divider desktop:inline-block hidden h-[14px] w-px bg-[#E4E5E6]\" />\n )}\n </div>\n )\n })}\n\n {/* Mobile Dropdown */}\n {tabLinks.length > 1 && (\n <Popover.Root>\n <Popover.Trigger asChild>\n <button\n className=\"product-nav-dropdown-trigger desktop:hidden -ml-1 inline-block\"\n aria-label=\"More products\"\n >\n <ChevronDownIcon className=\"text-[#1D1D1F]\" />\n </button>\n </Popover.Trigger>\n <Popover.Content\n className=\"product-nav-dropdown-content rounded-[6px] border border-[#E4E5E6] bg-white p-[6px] px-[8px] py-[4px]\"\n style={{\n boxShadow: '0px 4px 8px 0px rgba(0,0,0,0.12)',\n }}\n side=\"bottom\"\n align=\"end\"\n alignOffset={10}\n sideOffset={10}\n >\n {tabLinks.slice(1).map(tabLink => (\n <a\n key={tabLink.link}\n href={tabLink.link}\n className=\"product-nav-dropdown-link hover:text-brand-color text-nowrap\"\n >\n <span>{tabLink.label}</span>\n </a>\n ))}\n </Popover.Content>\n </Popover.Root>\n )}\n </div>\n\n {/* Mobile Actions */}\n <div className=\"product-nav-mobile-actions desktop:hidden desktop:gap-[24px] flex items-center gap-[16px]\">\n {/* {specs?.text && (\n <Text\n size={2}\n onClick={handleSpecsClick}\n className=\"product-nav-specs-button cursor-pointer hover:text-brand-color\"\n >\n {specs.text}\n </Text>\n )} */}\n {textLink?.link && (\n <a\n href={textLink.link}\n target={textLink.target || '_self'}\n className=\"product-nav-text-link hover:text-brand-color cursor-pointer\"\n >\n <Text size={2} className=\"text-nowrap\">\n {textLink.text}\n </Text>\n </a>\n )}\n {buyBtn?.link && (\n <Button as=\"a\" href={buyBtn.link} size=\"sm\" className=\"product-nav-buy-button text-nowrap\">\n {buyBtn.text}\n </Button>\n )}\n </div>\n </div>\n\n {/* Anchor Navigation */}\n <div className=\"product-nav-anchors laptop:w-fit desktop:gap-[24px] desktop:py-[8px] flex w-full items-center gap-[16px] overflow-x-scroll py-[12px] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\">\n {anchorList.map((anchor, index) => (\n <a\n key={anchor.id}\n href={`#${anchor.id}`}\n className=\"product-nav-anchor-link\"\n onClick={e => {\n // \u5982\u679C\u63D0\u4F9B\u4E86\u81EA\u5B9A\u4E49\u70B9\u51FB\u4E8B\u4EF6,\u4F7F\u7528\u81EA\u5B9A\u4E49\u4E8B\u4EF6\u5E76\u963B\u6B62\u9ED8\u8BA4\u884C\u4E3A\n if (onAnchorClick) {\n e.preventDefault()\n // \u6807\u8BB0\u7A0B\u5E8F\u5316\u6EDA\u52A8\uFF0C\u907F\u514D\u6EDA\u52A8\u8FC7\u7A0B\u4E2D\u9AD8\u4EAE\u95EA\u70C1\n setActiveAnchorId(anchor.id)\n targetAnchorIdRef.current = anchor.id\n isScrollingRef.current = true\n onAnchorClick(anchor, index)\n } else {\n // \u4F7F\u7528\u9ED8\u8BA4\u7684\u951A\u70B9\u6EDA\u52A8\u884C\u4E3A\uFF0C\u5E26\u504F\u79FB\u91CF\n handleAnchorClick(e, anchor.id)\n }\n }}\n >\n <Text size={2} className=\"product-nav-anchor-text text-nowrap\">\n {anchor.label}\n </Text>\n <div\n className={cn(\n 'product-nav-anchor-indicator laptop:top-[12px] desktop:top-[10px] relative top-[12px] h-[4px] w-full bg-transparent',\n {\n '!bg-brand-0': activeAnchorId === anchor.id,\n }\n )}\n />\n </a>\n ))}\n </div>\n </div>\n\n {/* Desktop Actions */}\n <div className=\"product-nav-desktop-actions desktop:flex desktop:gap-[24px] desktop:py-[8px] hidden items-center gap-[16px]\">\n {/* {specs?.text && (\n <Text\n size={2}\n onClick={handleSpecsClick}\n className=\"product-nav-specs-button cursor-pointer text-black hover:text-brand-color\"\n >\n {specs.text}\n </Text>\n )} */}\n {textLink?.link && (\n <a\n href={textLink.link}\n target={textLink.target || '_self'}\n className=\"product-nav-text-link hover:text-brand-color cursor-pointer text-black\"\n >\n <Text size={2} className=\"text-nowrap\">\n {textLink.text}\n </Text>\n </a>\n )}\n {buyBtn?.link && (\n <Button as=\"a\" href={buyBtn.link} size=\"sm\" className=\"product-nav-buy-button text-nowrap\">\n {buyBtn.text}\n </Button>\n )}\n </div>\n </div>\n )\n }\n)\n\nProductNav.displayName = 'ProductNav'\n\nexport default withLayout(ProductNav)\n"],
5
- "mappings": "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",
6
- "names": ["jsx", "jsxs", "useState", "useEffect", "useCallback", "forwardRef", "useImperativeHandle", "useRef", "cn", "withLayout", "Button", "Text", "useExposure", "Popover", "componentType", "componentName", "ChevronDownIcon", "props", "ProductNav", "className", "data", "id", "onAnchorClick", "scrollOffsetExtra", "ref", "tabLinks", "anchorList", "textLink", "buyBtn", "theme", "activeAnchorId", "setActiveAnchorId", "innerRef", "isScrollingRef", "targetAnchorIdRef", "scrollEndTimerRef", "anchorPositionsRef", "updateAnchorPositions", "originalScrollY", "positions", "anchor", "element", "rect", "timer", "resizeTimer", "observer", "handleScroll", "navHeight", "scrollPosition", "currentAnchorId", "i", "elementTop", "firstElementTop", "headerElements", "originalStyles", "htmlElement", "originalPosition", "handleAnchorClick", "anchorId", "elementAbsoluteTop", "targetPosition", "tabLink", "index", "e", "ProductNav_default"]
4
+ "sourcesContent": ["'use client'\nimport { useState, useEffect, useCallback, forwardRef, useImperativeHandle, useRef } from 'react'\nimport { cn } from '../../helpers/utils.js'\nimport { withLayout } from '../../shared/Styles.js'\nimport { Button, Text } from '../../components/index.js'\nimport { useExposure } from '../../hooks/useExposure.js'\nimport type { ProductNavProps } from './types.js'\nimport type { AnchorItem } from './types.js'\nimport * as Popover from '@radix-ui/react-popover'\n\nconst componentType = 'navigation'\nconst componentName = 'product_nav'\n\n// \u517C\u5BB9\u65E7\u6570\u636E\u7684 id \u5B57\u6BB5\u4E0E\u65B0\u6570\u636E\u7684 anchorId \u5B57\u6BB5\uFF08\u8BE6\u89C1 AnchorItem \u7C7B\u578B\u5B9A\u4E49\uFF09\nconst getAnchorId = (anchor: AnchorItem) => anchor.anchorId ?? anchor.id ?? ''\n\nconst ChevronDownIcon = (props: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path\n d=\"M5 7.5L10 12.5L15 7.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.66667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nconst ProductNav = forwardRef<HTMLDivElement, ProductNavProps>(\n ({ className = '', data, id, onAnchorClick, scrollOffsetExtra = 0 }, ref) => {\n const { tabLinks = [], anchorList = [], textLink, buyBtn, theme = 'light' } = data || {}\n const [activeAnchorId, setActiveAnchorId] = useState('')\n const innerRef = useRef<HTMLDivElement>(null)\n const isScrollingRef = useRef(false) // \u6807\u8BB0\u662F\u5426\u6B63\u5728\u7A0B\u5E8F\u5316\u6EDA\u52A8\u4E2D\n const targetAnchorIdRef = useRef<string>('') // \u8BB0\u5F55\u70B9\u51FB\u76EE\u6807\u951A\u70B9\n const scrollEndTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null) // \u6EDA\u52A8\u7ED3\u675F\u68C0\u6D4B\u5B9A\u65F6\u5668\n const anchorPositionsRef = useRef<Map<string, number>>(new Map()) // \u7F13\u5B58\u951A\u70B9\u539F\u59CB\u4F4D\u7F6E\n\n useImperativeHandle(ref, () => innerRef.current as HTMLDivElement)\n\n useExposure(innerRef, {\n componentType,\n componentName,\n })\n\n // \u7F13\u5B58\u6240\u6709\u951A\u70B9\u7684\u7EDD\u5BF9\u4F4D\u7F6E\uFF08\u6EDA\u52A8\u5230\u9876\u90E8\u540E\u8BA1\u7B97\uFF0C\u907F\u514D sticky \u5F71\u54CD\uFF09\n const updateAnchorPositions = useCallback(() => {\n if (anchorList.length === 0) return\n\n const originalScrollY = window.scrollY\n window.scrollTo({ top: 0, behavior: 'instant' as ScrollBehavior })\n\n requestAnimationFrame(() => {\n const positions = new Map<string, number>()\n anchorList.forEach(anchor => {\n const anchorId = getAnchorId(anchor)\n const element = document.getElementById(anchorId)\n if (element) {\n const rect = element.getBoundingClientRect()\n positions.set(anchorId, rect.top + window.scrollY)\n }\n })\n anchorPositionsRef.current = positions\n\n window.scrollTo({ top: originalScrollY, behavior: 'instant' as ScrollBehavior })\n })\n }, [anchorList])\n\n // \u521D\u59CB\u5316\u65F6\u7F13\u5B58\u6240\u6709\u951A\u70B9\u7684\u539F\u59CB\u4F4D\u7F6E\n useEffect(() => {\n if (anchorList.length === 0) return\n\n // \u9875\u9762\u52A0\u8F7D\u540E\u5EF6\u8FDF\u8BA1\u7B97\uFF0C\u786E\u4FDD\u5E03\u5C40\u5B8C\u6210\n const timer = setTimeout(updateAnchorPositions, 100)\n\n return () => clearTimeout(timer)\n }, [anchorList, updateAnchorPositions])\n\n // \u76D1\u542C body \u9AD8\u5EA6\u53D8\u5316\uFF0C\u9AD8\u5EA6\u6539\u53D8\u65F6\u91CD\u65B0\u8BA1\u7B97\u951A\u70B9\u4F4D\u7F6E\n useEffect(() => {\n if (anchorList.length === 0) return\n\n let resizeTimer: ReturnType<typeof setTimeout> | null = null\n\n const observer = new ResizeObserver(() => {\n // debounce\uFF0C\u907F\u514D\u9AD8\u9891\u89E6\u53D1\n if (resizeTimer) clearTimeout(resizeTimer)\n resizeTimer = setTimeout(updateAnchorPositions, 150)\n })\n\n observer.observe(document.body)\n\n return () => {\n observer.disconnect()\n if (resizeTimer) clearTimeout(resizeTimer)\n }\n }, [anchorList, updateAnchorPositions])\n\n // \u6EDA\u52A8\u76D1\u542C\uFF1A\u68C0\u6D4B\u5F53\u524D\u6EDA\u52A8\u4F4D\u7F6E\u5BF9\u5E94\u7684\u951A\u70B9\n useEffect(() => {\n if (anchorList.length === 0) return\n\n const handleScroll = () => {\n // \u5982\u679C\u6B63\u5728\u7A0B\u5E8F\u5316\u6EDA\u52A8\u4E2D\uFF0C\u4F7F\u7528 debounce \u68C0\u6D4B\u6EDA\u52A8\u7ED3\u675F\n if (isScrollingRef.current) {\n // \u6E05\u9664\u4E4B\u524D\u7684\u5B9A\u65F6\u5668\n if (scrollEndTimerRef.current) {\n clearTimeout(scrollEndTimerRef.current)\n }\n // \u8BBE\u7F6E\u65B0\u7684\u5B9A\u65F6\u5668\uFF0C100ms \u6CA1\u6709\u65B0\u6EDA\u52A8\u4E8B\u4EF6\u5219\u8BA4\u4E3A\u6EDA\u52A8\u7ED3\u675F\n scrollEndTimerRef.current = setTimeout(() => {\n isScrollingRef.current = false\n // \u6EDA\u52A8\u7ED3\u675F\u540E\uFF0C\u786E\u4FDD\u9AD8\u4EAE\u505C\u7559\u5728\u76EE\u6807\u951A\u70B9\n if (targetAnchorIdRef.current) {\n setActiveAnchorId(targetAnchorIdRef.current)\n targetAnchorIdRef.current = ''\n }\n }, 100)\n return\n }\n\n const navHeight = innerRef.current?.offsetHeight || 0\n const scrollPosition = window.scrollY + navHeight + scrollOffsetExtra + 10 // 10px \u7F13\u51B2\n\n let currentAnchorId = ''\n\n // \u4F7F\u7528\u7F13\u5B58\u7684\u951A\u70B9\u4F4D\u7F6E\n const positions = anchorPositionsRef.current\n\n // \u904D\u5386\u6240\u6709\u951A\u70B9\uFF0C\u627E\u5230\u5F53\u524D\u6EDA\u52A8\u4F4D\u7F6E\u5BF9\u5E94\u7684\u951A\u70B9\n for (let i = anchorList.length - 1; i >= 0; i--) {\n const anchor = anchorList[i]\n const anchorId = getAnchorId(anchor)\n const elementTop = positions.get(anchorId)\n if (elementTop !== undefined && scrollPosition >= elementTop) {\n currentAnchorId = anchorId\n break\n }\n }\n\n // \u5982\u679C\u6CA1\u6709\u627E\u5230\u4E14\u7F13\u5B58\u4E2D\u6709\u7B2C\u4E00\u4E2A\u951A\u70B9\u7684\u4F4D\u7F6E\n if (!currentAnchorId && anchorList.length > 0) {\n const firstElementTop = positions.get(getAnchorId(anchorList[0]))\n if (firstElementTop !== undefined && scrollPosition < firstElementTop) {\n currentAnchorId = ''\n }\n }\n\n setActiveAnchorId(currentAnchorId)\n }\n\n // \u5EF6\u8FDF\u521D\u59CB\u5316\uFF0C\u7B49\u5F85\u4F4D\u7F6E\u7F13\u5B58\u5B8C\u6210\n const timer = setTimeout(() => {\n handleScroll()\n }, 200)\n\n window.addEventListener('scroll', handleScroll, { passive: true })\n return () => {\n clearTimeout(timer)\n window.removeEventListener('scroll', handleScroll)\n // \u6E05\u7406\u5B9A\u65F6\u5668\n if (scrollEndTimerRef.current) {\n clearTimeout(scrollEndTimerRef.current)\n }\n }\n }, [anchorList, scrollOffsetExtra])\n\n // \u8BBE\u7F6E\u9875\u9762\u4E2Dheader\u5143\u7D20\u7684position\u4E3Arelative\n useEffect(() => {\n const headerElements = document.querySelectorAll('.header')\n const originalStyles: { element: HTMLElement; originalPosition: string }[] = []\n\n headerElements.forEach(element => {\n const htmlElement = element as HTMLElement\n // \u4FDD\u5B58\u539F\u59CB\u6837\u5F0F\n originalStyles.push({\n element: htmlElement,\n originalPosition: htmlElement.style.position || getComputedStyle(htmlElement).position,\n })\n // \u8BBE\u7F6E\u4E3Arelative\n htmlElement.style.position = 'relative'\n })\n\n // \u6E05\u7406\u51FD\u6570\uFF1A\u6062\u590D\u539F\u59CB\u6837\u5F0F\n return () => {\n originalStyles.forEach(({ element, originalPosition }) => {\n element.style.position = originalPosition === 'static' ? '' : originalPosition\n })\n }\n }, [])\n\n // \u5904\u7406\u951A\u70B9\u70B9\u51FB\u6EDA\u52A8\n const handleAnchorClick = (e: React.MouseEvent, anchorId: string) => {\n e.preventDefault()\n\n // \u4F7F\u7528\u7F13\u5B58\u7684\u4F4D\u7F6E\n const elementAbsoluteTop = anchorPositionsRef.current.get(anchorId)\n if (elementAbsoluteTop === undefined) {\n console.warn(`Cached position for \"${anchorId}\" not found`)\n return\n }\n\n // \u7ACB\u5373\u66F4\u65B0\u9AD8\u4EAE\u72B6\u6001\uFF0C\u907F\u514D\u6EDA\u52A8\u8FC7\u7A0B\u4E2D\u95EA\u70C1\n setActiveAnchorId(anchorId)\n\n // \u8BB0\u5F55\u76EE\u6807\u951A\u70B9\uFF0C\u7528\u4E8E\u6EDA\u52A8\u7ED3\u675F\u540E\u786E\u4FDD\u9AD8\u4EAE\u6B63\u786E\n targetAnchorIdRef.current = anchorId\n\n // \u6807\u8BB0\u6B63\u5728\u7A0B\u5E8F\u5316\u6EDA\u52A8\uFF0C\u6682\u505C\u6EDA\u52A8\u76D1\u542C\n isScrollingRef.current = true\n\n // \u83B7\u53D6\u5BFC\u822A\u680F\u9AD8\u5EA6\n const navHeight = innerRef.current?.offsetHeight || 0\n\n // \u76EE\u6807\u6EDA\u52A8\u4F4D\u7F6E = \u7F13\u5B58\u7684\u5143\u7D20\u7EDD\u5BF9\u4F4D\u7F6E - \u5BFC\u822A\u680F\u9AD8\u5EA6 - \u989D\u5916\u504F\u79FB\n const targetPosition = elementAbsoluteTop - navHeight - scrollOffsetExtra\n\n // \u5E73\u6ED1\u6EDA\u52A8\u5230\u76EE\u6807\u4F4D\u7F6E\n window.scrollTo({\n top: targetPosition,\n behavior: 'smooth',\n })\n\n // \u66F4\u65B0 URL hash\uFF08\u4E0D\u89E6\u53D1\u9875\u9762\u8DF3\u8F6C\uFF09\n window.history.pushState(null, '', `#${anchorId}`)\n\n // \u6CE8\u610F\uFF1A\u6EDA\u52A8\u7ED3\u675F\u68C0\u6D4B\u7531 handleScroll \u4E2D\u7684 debounce \u903B\u8F91\u5904\u7406\n // \u4E0D\u518D\u4F7F\u7528\u56FA\u5B9A 800ms \u8D85\u65F6\uFF0C\u800C\u662F\u68C0\u6D4B\u5B9E\u9645\u6EDA\u52A8\u7ED3\u675F\n }\n\n return (\n <div\n id={id}\n ref={innerRef}\n className={cn(\n 'product-nav text-info-primary bg-container-primary tablet:px-8 laptop:px-16 desktop:px-16 lg-desktop:px-[calc(50%-832px)] !sticky top-0 !z-[51] flex w-full justify-between overflow-hidden px-4 py-0',\n {\n 'aiui-dark': theme === 'dark',\n },\n className\n )}\n >\n <div className=\"product-nav-main desktop:flex-row desktop:gap-[48px] flex w-full flex-col justify-start\">\n {/* Tab Links Section */}\n <div className=\"product-nav-header laptop:w-full desktop:w-fit desktop:gap-[24px] desktop:py-0 flex w-full flex-row items-center justify-between gap-[16px] pt-[14px]\">\n <div className=\"product-nav-tabs flex flex-row items-center gap-[8px]\">\n {tabLinks.map((tabLink, index) => {\n return (\n <div key={tabLink.link || index} className=\"product-nav-tab-item flex items-center gap-[8px]\">\n <a\n href={tabLink.link}\n className={cn(\n 'product-nav-tab-link hover:text-brand-color text-nowrap text-[14px] font-bold tracking-[-0.04em]',\n {\n 'text-[#6D6D6F]': index !== 0,\n 'hidden desktop:block': index === 1,\n }\n )}\n // onClick={() => onShowSpecs?.(false)}\n >\n <span>{tabLink.label}</span>\n </a>\n {index !== tabLinks.length - 1 && (\n <div className=\"product-nav-tab-divider desktop:inline-block hidden h-[14px] w-px bg-[#E4E5E6]\" />\n )}\n </div>\n )\n })}\n\n {/* Mobile Dropdown */}\n {tabLinks.length > 1 && (\n <Popover.Root>\n <Popover.Trigger asChild>\n <button\n className=\"product-nav-dropdown-trigger desktop:hidden -ml-1 inline-block\"\n aria-label=\"More products\"\n >\n <ChevronDownIcon className=\"text-[#1D1D1F]\" />\n </button>\n </Popover.Trigger>\n <Popover.Content\n className=\"product-nav-dropdown-content rounded-[6px] border border-[#E4E5E6] bg-white p-[6px] px-[8px] py-[4px]\"\n style={{\n boxShadow: '0px 4px 8px 0px rgba(0,0,0,0.12)',\n }}\n side=\"bottom\"\n align=\"end\"\n alignOffset={10}\n sideOffset={10}\n >\n {tabLinks.slice(1).map(tabLink => (\n <a\n key={tabLink.link}\n href={tabLink.link}\n className=\"product-nav-dropdown-link hover:text-brand-color text-nowrap\"\n >\n <span>{tabLink.label}</span>\n </a>\n ))}\n </Popover.Content>\n </Popover.Root>\n )}\n </div>\n\n {/* Mobile Actions */}\n <div className=\"product-nav-mobile-actions desktop:hidden desktop:gap-[24px] flex items-center gap-[16px]\">\n {/* {specs?.text && (\n <Text\n size={2}\n onClick={handleSpecsClick}\n className=\"product-nav-specs-button cursor-pointer hover:text-brand-color\"\n >\n {specs.text}\n </Text>\n )} */}\n {textLink?.link && (\n <a\n href={textLink.link}\n target={textLink.target || '_self'}\n className=\"product-nav-text-link hover:text-brand-color cursor-pointer\"\n >\n <Text size={2} className=\"text-nowrap\">\n {textLink.text}\n </Text>\n </a>\n )}\n {buyBtn?.link && (\n <Button as=\"a\" href={buyBtn.link} size=\"sm\" className=\"product-nav-buy-button text-nowrap\">\n {buyBtn.text}\n </Button>\n )}\n </div>\n </div>\n\n {/* Anchor Navigation */}\n <div className=\"product-nav-anchors laptop:w-fit desktop:gap-[24px] desktop:py-[8px] flex w-full items-center gap-[16px] overflow-x-scroll py-[12px] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\">\n {anchorList.map((anchor, index) => {\n const anchorId = getAnchorId(anchor)\n return (\n <a\n key={anchorId}\n href={`#${anchorId}`}\n className=\"product-nav-anchor-link\"\n onClick={e => {\n // \u5982\u679C\u63D0\u4F9B\u4E86\u81EA\u5B9A\u4E49\u70B9\u51FB\u4E8B\u4EF6,\u4F7F\u7528\u81EA\u5B9A\u4E49\u4E8B\u4EF6\u5E76\u963B\u6B62\u9ED8\u8BA4\u884C\u4E3A\n if (onAnchorClick) {\n e.preventDefault()\n // \u6807\u8BB0\u7A0B\u5E8F\u5316\u6EDA\u52A8\uFF0C\u907F\u514D\u6EDA\u52A8\u8FC7\u7A0B\u4E2D\u9AD8\u4EAE\u95EA\u70C1\n setActiveAnchorId(anchorId)\n targetAnchorIdRef.current = anchorId\n isScrollingRef.current = true\n onAnchorClick(anchor, index)\n } else {\n // \u4F7F\u7528\u9ED8\u8BA4\u7684\u951A\u70B9\u6EDA\u52A8\u884C\u4E3A\uFF0C\u5E26\u504F\u79FB\u91CF\n handleAnchorClick(e, anchorId)\n }\n }}\n >\n <Text size={2} className=\"product-nav-anchor-text text-nowrap\">\n {anchor.label}\n </Text>\n <div\n className={cn(\n 'product-nav-anchor-indicator laptop:top-[12px] desktop:top-[10px] relative top-[12px] h-[4px] w-full bg-transparent',\n {\n '!bg-brand-0': activeAnchorId === anchorId,\n }\n )}\n />\n </a>\n )\n })}\n </div>\n </div>\n\n {/* Desktop Actions */}\n <div className=\"product-nav-desktop-actions desktop:flex desktop:gap-[24px] desktop:py-[8px] hidden items-center gap-[16px]\">\n {/* {specs?.text && (\n <Text\n size={2}\n onClick={handleSpecsClick}\n className=\"product-nav-specs-button cursor-pointer text-black hover:text-brand-color\"\n >\n {specs.text}\n </Text>\n )} */}\n {textLink?.link && (\n <a\n href={textLink.link}\n target={textLink.target || '_self'}\n className=\"product-nav-text-link hover:text-brand-color cursor-pointer text-black\"\n >\n <Text size={2} className=\"text-nowrap\">\n {textLink.text}\n </Text>\n </a>\n )}\n {buyBtn?.link && (\n <Button as=\"a\" href={buyBtn.link} size=\"sm\" className=\"product-nav-buy-button text-nowrap\">\n {buyBtn.text}\n </Button>\n )}\n </div>\n </div>\n )\n }\n)\n\nProductNav.displayName = 'ProductNav'\n\nexport default withLayout(ProductNav)\n"],
5
+ "mappings": "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",
6
+ "names": ["jsx", "jsxs", "useState", "useEffect", "useCallback", "forwardRef", "useImperativeHandle", "useRef", "cn", "withLayout", "Button", "Text", "useExposure", "Popover", "componentType", "componentName", "getAnchorId", "anchor", "ChevronDownIcon", "props", "ProductNav", "className", "data", "id", "onAnchorClick", "scrollOffsetExtra", "ref", "tabLinks", "anchorList", "textLink", "buyBtn", "theme", "activeAnchorId", "setActiveAnchorId", "innerRef", "isScrollingRef", "targetAnchorIdRef", "scrollEndTimerRef", "anchorPositionsRef", "updateAnchorPositions", "originalScrollY", "positions", "anchorId", "element", "rect", "timer", "resizeTimer", "observer", "handleScroll", "navHeight", "scrollPosition", "currentAnchorId", "i", "elementTop", "firstElementTop", "headerElements", "originalStyles", "htmlElement", "originalPosition", "handleAnchorClick", "elementAbsoluteTop", "targetPosition", "tabLink", "index", "e", "ProductNav_default"]
7
7
  }
@@ -4,7 +4,9 @@ export interface TabLink {
4
4
  label: string;
5
5
  }
6
6
  export interface AnchorItem {
7
- id: string;
7
+ /** @deprecated 使用 anchorId 代替,保留仅用于兼容旧数据 */
8
+ id?: string;
9
+ anchorId?: string;
8
10
  label: string;
9
11
  }
10
12
  export interface BuyButton {
@@ -66,6 +66,8 @@ export { default as BenefitsTab } from './Listing/components/ProductCard/Product
66
66
  export { default as PaidShipping } from './Listing/components/PaidShipping/index.js';
67
67
  export { default as CartActionButtons } from './Listing/components/CartActionButtons/index.js';
68
68
  export type { CartActionButtonsProps } from './Listing/components/CartActionButtons/index.js';
69
+ export { NotifyMeDialog } from './NotifyMeDialog/index.js';
70
+ export type { NotifyMeDialogProps, CheckboxConfig, SubscriptionMeta } from './NotifyMeDialog/types.js';
69
71
  export { default as ProductServiceBenefits } from './Listing/components/ProductCard/ProductDetail/ProductServiceBenefits/index.js';
70
72
  export type { ProductServiceBenefitsProps, ServiceBenefitItem, } from './Listing/components/ProductCard/ProductDetail/ProductServiceBenefits/index.js';
71
73
  export { default as ProductPaidShipping } from './Listing/components/ProductCard/ProductPaidShipping/index.js';
@@ -1,2 +1,2 @@
1
- import{default as o}from"./ActivitySchedule/index.js";import{default as i}from"./GiftShelf/index.js";import{default as s}from"./GiftTierShelf/index.js";import{default as d}from"./ActivityMechanism/index.js";import{default as u}from"./BrandEquity/index.js";import{default as m}from"./MemberEquity/index.js";import{default as x}from"./Slogan/index.js";import{default as h}from"./Title/index.js";import{default as P}from"./Spacer/index.js";import{default as g}from"./ShelfDisplay/index.js";import{default as v}from"./Evaluate/index.js";import{default as T}from"./Category/index.js";import{default as j}from"./HeroBanner/index.js";import{default as D}from"./AccordionCards/index.js";import{default as A}from"./Graphic/index.js";import{default as L}from"./MediaPlayerBase/index.js";import{default as w}from"./MediaPlayerSticky/index.js";import{default as O}from"./MediaPlayerMulti/index.js";import{default as W}from"./Marquee/index.js";import{default as N}from"./MarqueeReview/index.js";import{default as H}from"./WhyChoose/index.js";import{default as _}from"./Faq/index.js";import{MarqueeItem as U,MarqueeImageContent as Y,MarqueeTextContent as J}from"./Marquee/index.js";import{default as X}from"./MultiLayoutGraphicBlock/index.js";import{default as $}from"./GraphicAttractionBlock/index.js";import{default as te}from"./HeaderNavigation/index.js";import{default as oe}from"./FooterNavigation/index.js";import{default as ie}from"./SearchPage/index.js";import{IPC_SEARCH_PAGE as se,SearchPageTabType as fe}from"./SearchPage/types.js";import{withLayout as ce}from"../shared/Styles.js";import{default as le}from"./AiuiProvider/index.js";import{default as ne}from"./Tabs/index.js";import{default as ye}from"./SwiperBox/index.js";import{VideoModal as Se}from"./VideoModal/index.js";import{default as Ce}from"./CreativeModule/index.js";import{default as Me}from"./GraphicOverlay/index.js";import{default as Be}from"./Specs/index.js";import{default as Ie}from"./TabsGroup/index.js";import{default as be,useBizProductContext as De}from"./Listing/BizProductProvider.js";import{default as Ae}from"./Listing/components/PurchaseBar/index.js";import{default as Le}from"./Listing/components/PurchaseBar/ProductActions/index.js";import{default as we}from"./Listing/components/ProductCard/index.js";import{default as Oe}from"./Listing/components/ProductCard/ProductDetail/ProductBenefitsTabs/index.js";import{default as We}from"./Listing/components/ProductCard/ProductDetail/ProductBenefits/index.js";import{default as Ne}from"./Listing/components/ProductCard/ProductDetail/ProductHighlight/index.js";import{default as He}from"./Listing/components/ProductCard/ProductDetail/ProductFreeGift/index.js";import{default as _e}from"./Listing/components/ProductCard/ProductDetail/ProductExchangePurchase/index.js";import{default as Ue}from"./Listing/components/ProductCard/ProductDetail/ProductOptions/index.js";import{default as Je}from"./Listing/components/ProductCard/ProductDetail/ProductBundle/index.js";import{default as Xe}from"./Listing/components/ProductCard/ProductDetail/ProductCoupon/index.js";import{default as $e}from"./Listing/components/ProductCard/ProductDetail/ProductBanner/index.js";import{default as tt}from"./Listing/components/ProductCard/ProductGridBox.js";import{default as ot}from"./Listing/components/ProductCard/ProductGallery/index.js";import{default as it}from"./Listing/components/ProductCard/ProductDetail/index.js";import{default as st}from"./Listing/components/ProductCard/ProductSummary/index.js";import{default as dt}from"./Listing/components/ProductCard/ProductDetail/BenefitsTab.js";import{default as ut}from"./Listing/components/PaidShipping/index.js";import{default as mt}from"./Listing/components/CartActionButtons/index.js";import{default as xt}from"./Listing/components/ProductCard/ProductDetail/ProductServiceBenefits/index.js";import{default as ht}from"./Listing/components/ProductCard/ProductPaidShipping/index.js";import{default as Pt}from"./GraphicMore/index.js";import{default as gt}from"./Features/index.js";import{default as vt}from"./AplusDesc/index.js";import{default as Tt}from"./GiftBox/index.js";import{default as jt}from"./SelectStore/index.js";import{default as Dt}from"./DownLoad/index.js";import{default as At}from"./FootCharger/index.js";import{default as Lt}from"./BrandCardLink/index.js";import*as kt from"./IPRedirect/index.js";import{default as Vt}from"./WheelLottery/index.js";import{default as Et}from"./ProductLottery/index.js";import{default as qt}from"./ProductCompare/index.js";import{default as Rt}from"./Ksp/index.js";import{default as Kt}from"./ImageTextFeature/index.js";import{default as zt}from"./FeatureCards/index.js";import{default as Yt}from"./FeaturedBlogPosts/index.js";import{default as Qt}from"./ImageWithText/index.js";import{default as Zt}from"./VideoFeature/index.js";import{default as er}from"./TabsWithMedia/index.js";import{default as rr}from"./TabWithImage/index.js";import{default as ar}from"./FeatureShowcase/index.js";import{default as pr}from"./ProductHero/index.js";import{default as fr}from"./SpecsComparison/index.js";import{default as cr}from"./MediaSceneSwitcher/index.js";import{default as lr}from"./MediaSceneSwitcherV2/index.js";import{default as nr}from"./ThreeDCarousel/index.js";import{default as yr}from"./ProductNav/index.js";import{default as Sr}from"./AnchorNavigation/index.js";import{default as Cr}from"./PromotionalBar/index.js";import{default as Mr}from"./EventSchedule/index.js";import{default as Br}from"./SecondaryBanner/index.js";import{default as Ir}from"./BuyOneGetOneShelf/index.js";import{default as br}from"./ActiveShelf/index.js";import{default as Fr}from"./MediaShelf/index.js";import{default as Gr,CreditsProductCard as Lr}from"./CreditsShelf/index.js";import{default as wr,SceneProductCard as Vr}from"./SceneShelf/index.js";import{default as Er,SceneShelfV2ProductCard as Wr}from"./SceneShelfV2/index.js";import{default as Nr}from"./SceneShelfV3/index.js";import{default as Hr}from"./MediaEndorsement/index.js";import{default as _r}from"./MediaTextOverlay/index.js";import{default as Ur}from"./ImageOverlayShelf/index.js";import{default as Jr}from"./ImageTextOverlay/index.js";import{default as Xr}from"./MiniCart/index.js";import{default as $r}from"./MiniCart/CircleProgress.js";import{default as to,MiniCartDialog as ro}from"./MiniCart/MiniCartDialog.js";import{default as ao}from"./WebPushPopup/index.js";import{useEmarsysWebPush as po}from"../hooks/useEmarsysWebPush.js";const e={"ipc-accordioncards":"AccordionCards","ipc-aplusdesc":"AplusDesc","ipc-banner":"HeroBanner","ipc-brand-equity":"BrandEquity","ipc-category":"Category","ipc-collection-banner":"CollectionBanner","ipc-collection-shelves":"CollectionShelves","ipc-creativemodule":"CreativeModule","ipc-download":"DownLoad","ipc-evaluate":"Evaluate","ipc-faq":"Faq","ipc-features":"Features","ipc-footcharger":"FootCharger","ipc-ga-block":"GraphicAttractionBlock","ipc-giftbox":"GiftBox","ipc-giftshelf":"GiftShelf","ipc-graphic":"Graphic","ipc-graphicmore":"GraphicMore","ipc-graphicoverlay":"GraphicOverlay","ipc-marquee":"Marquee","ipc-mediaplayerbase":"MediaPlayerBase","ipc-mediaplayermulti":"MediaPlayerMulti","ipc-mediaplayersticky":"MediaPlayerSticky","ipc-member-equity":"MemberEquity","ipc-mlg-block":"MultiLayoutGraphicBlock","ipc-search-page-tabs":"SearchPageBlock","ipc-selectstore":"SelectStore","ipc-shelfdisplay":"ShelfDisplay","ipc-slogan":"Slogan","ipc-spacer":"Spacer","ipc-specs":"Specs","ipc-tabs":"Tabs","ipc-text-marquee":"TextMarquee","ipc-title":"Title","ipc-whychoose":"WhyChoose","ipc-product-nav":"ProductNav","ipc-brand-card-link":"BrandCardLink","ipc-ipredirect":"IPRedirect",ksp:"Ksp","ipc-secondary-banner":"SecondaryBanner","ipc-media-endorsement":"MediaEndorsement","ipc-media-scene-switcher-v2":"MediaSceneSwitcherV2","ipc-featured-blog-posts":"FeaturedBlogPosts","ipc-media-text-overlay":"MediaTextOverlay",ProductCompare:"ProductCompare"};import{useAiuiContext as fo}from"./AiuiProvider/index.js";import{default as uo}from"./ModalRegisterSubscribe/index.js";import{default as mo}from"./ModalSubscribeConfirm/index.js";import{default as xo}from"./ModalCoupon/index.js";import{default as ho}from"./ModalSmsSubscribe/index.js";import{default as Po}from"./ModalVerify/index.js";export{D as AccordionCards,br as ActiveShelf,d as ActivityMechanism,o as ActivitySchedule,le as AiuiProvider,Sr as AnchorNavigation,vt as AplusDesc,dt as BenefitsTab,be as BizProductProvider,Lt as BrandCardLink,u as BrandEquity,Ir as BuyOneGetOneShelf,mt as CartActionButtons,T as Category,Ce as CreativeModule,Lr as CreditsProductCard,Gr as CreditsShelf,Dt as DownLoad,v as Evaluate,Mr as EventSchedule,_ as Faq,zt as FeatureCards,ar as FeatureShowcase,Yt as FeaturedBlogPosts,gt as Features,At as FootCharger,oe as FooterNavigation,Tt as GiftBox,i as GiftShelf,s as GiftTierShelf,A as Graphic,$ as GraphicAttractionBlock,Pt as GraphicMore,Me as GraphicOverlay,te as HeaderNavigation,j as HeroBanner,se as IPC_SEARCH_PAGE,kt as IPRedirect,Ur as ImageOverlayShelf,Kt as ImageTextFeature,Jr as ImageTextOverlay,Qt as ImageWithText,Rt as Ksp,W as Marquee,Y as MarqueeImageContent,U as MarqueeItem,N as MarqueeReview,J as MarqueeTextContent,Hr as MediaEndorsement,L as MediaPlayerBase,O as MediaPlayerMulti,w as MediaPlayerSticky,cr as MediaSceneSwitcher,lr as MediaSceneSwitcherV2,Fr as MediaShelf,_r as MediaTextOverlay,m as MemberEquity,Xr as MiniCart,$r as MiniCartCircleProgress,to as MiniCartDialog,ro as MiniCartDialogComponent,xo as ModalCoupon,uo as ModalRegisterSubscribe,ho as ModalSmsSubscribe,mo as ModalSubscribeConfirm,Po as ModalVerify,X as MultiLayoutGraphicBlock,e as PAYLOAD_COMPONENT_MAP,ut as PaidShipping,Le as ProductActions,$e as ProductBanner,We as ProductBenefits,Oe as ProductBenefitsTabs,Je as ProductBundle,we as ProductCard,qt as ProductCompare,Xe as ProductCoupon,it as ProductDetail,_e as ProductExchangePurchase,He as ProductFreeGift,ot as ProductGallery,tt as ProductGridBox,pr as ProductHero,Ne as ProductHighlight,Et as ProductLottery,yr as ProductNav,Ue as ProductOptions,ht as ProductPaidShipping,xt as ProductServiceBenefits,st as ProductSummary,Cr as PromotionalBar,Ae as PurchaseBar,Vr as SceneProductCard,wr as SceneShelf,Er as SceneShelfV2,Wr as SceneShelfV2ProductCard,Nr as SceneShelfV3,ie as SearchPage,fe as SearchPageTabType,Br as SecondaryBanner,jt as SelectStore,g as ShelfDisplay,x as Slogan,P as Spacer,Be as Specs,fr as SpecsComparison,ye as SwiperBox,Ie as TabGroup,rr as TabWithImage,ne as Tabs,er as TabsWithMedia,nr as ThreeDCarousel,h as Title,Zt as VideoFeature,Se as VideoModal,ao as WebPushPopup,Vt as WheelLottery,H as WhyChoose,fo as useAiuiContext,De as useBizProductContext,po as useEmarsysWebPush,ce as withLayout};
1
+ import{default as o}from"./ActivitySchedule/index.js";import{default as i}from"./GiftShelf/index.js";import{default as s}from"./GiftTierShelf/index.js";import{default as d}from"./ActivityMechanism/index.js";import{default as u}from"./BrandEquity/index.js";import{default as m}from"./MemberEquity/index.js";import{default as x}from"./Slogan/index.js";import{default as h}from"./Title/index.js";import{default as P}from"./Spacer/index.js";import{default as g}from"./ShelfDisplay/index.js";import{default as v}from"./Evaluate/index.js";import{default as T}from"./Category/index.js";import{default as b}from"./HeroBanner/index.js";import{default as D}from"./AccordionCards/index.js";import{default as A}from"./Graphic/index.js";import{default as k}from"./MediaPlayerBase/index.js";import{default as w}from"./MediaPlayerSticky/index.js";import{default as O}from"./MediaPlayerMulti/index.js";import{default as W}from"./Marquee/index.js";import{default as q}from"./MarqueeReview/index.js";import{default as H}from"./WhyChoose/index.js";import{default as _}from"./Faq/index.js";import{MarqueeItem as U,MarqueeImageContent as Y,MarqueeTextContent as J}from"./Marquee/index.js";import{default as X}from"./MultiLayoutGraphicBlock/index.js";import{default as $}from"./GraphicAttractionBlock/index.js";import{default as te}from"./HeaderNavigation/index.js";import{default as oe}from"./FooterNavigation/index.js";import{default as ie}from"./SearchPage/index.js";import{IPC_SEARCH_PAGE as se,SearchPageTabType as fe}from"./SearchPage/types.js";import{withLayout as ce}from"../shared/Styles.js";import{default as le}from"./AiuiProvider/index.js";import{default as ne}from"./Tabs/index.js";import{default as ye}from"./SwiperBox/index.js";import{VideoModal as Se}from"./VideoModal/index.js";import{default as Ce}from"./CreativeModule/index.js";import{default as Me}from"./GraphicOverlay/index.js";import{default as Be}from"./Specs/index.js";import{default as Ie}from"./TabsGroup/index.js";import{default as je,useBizProductContext as De}from"./Listing/BizProductProvider.js";import{default as Ae}from"./Listing/components/PurchaseBar/index.js";import{default as ke}from"./Listing/components/PurchaseBar/ProductActions/index.js";import{default as we}from"./Listing/components/ProductCard/index.js";import{default as Oe}from"./Listing/components/ProductCard/ProductDetail/ProductBenefitsTabs/index.js";import{default as We}from"./Listing/components/ProductCard/ProductDetail/ProductBenefits/index.js";import{default as qe}from"./Listing/components/ProductCard/ProductDetail/ProductHighlight/index.js";import{default as He}from"./Listing/components/ProductCard/ProductDetail/ProductFreeGift/index.js";import{default as _e}from"./Listing/components/ProductCard/ProductDetail/ProductExchangePurchase/index.js";import{default as Ue}from"./Listing/components/ProductCard/ProductDetail/ProductOptions/index.js";import{default as Je}from"./Listing/components/ProductCard/ProductDetail/ProductBundle/index.js";import{default as Xe}from"./Listing/components/ProductCard/ProductDetail/ProductCoupon/index.js";import{default as $e}from"./Listing/components/ProductCard/ProductDetail/ProductBanner/index.js";import{default as tt}from"./Listing/components/ProductCard/ProductGridBox.js";import{default as ot}from"./Listing/components/ProductCard/ProductGallery/index.js";import{default as it}from"./Listing/components/ProductCard/ProductDetail/index.js";import{default as st}from"./Listing/components/ProductCard/ProductSummary/index.js";import{default as dt}from"./Listing/components/ProductCard/ProductDetail/BenefitsTab.js";import{default as ut}from"./Listing/components/PaidShipping/index.js";import{default as mt}from"./Listing/components/CartActionButtons/index.js";import{NotifyMeDialog as xt}from"./NotifyMeDialog/index.js";import{default as ht}from"./Listing/components/ProductCard/ProductDetail/ProductServiceBenefits/index.js";import{default as Pt}from"./Listing/components/ProductCard/ProductPaidShipping/index.js";import{default as gt}from"./GraphicMore/index.js";import{default as vt}from"./Features/index.js";import{default as Tt}from"./AplusDesc/index.js";import{default as bt}from"./GiftBox/index.js";import{default as Dt}from"./SelectStore/index.js";import{default as At}from"./DownLoad/index.js";import{default as kt}from"./FootCharger/index.js";import{default as wt}from"./BrandCardLink/index.js";import*as Vt from"./IPRedirect/index.js";import{default as Et}from"./WheelLottery/index.js";import{default as Nt}from"./ProductLottery/index.js";import{default as Rt}from"./ProductCompare/index.js";import{default as Kt}from"./Ksp/index.js";import{default as zt}from"./ImageTextFeature/index.js";import{default as Yt}from"./FeatureCards/index.js";import{default as Qt}from"./FeaturedBlogPosts/index.js";import{default as Zt}from"./ImageWithText/index.js";import{default as er}from"./VideoFeature/index.js";import{default as rr}from"./TabsWithMedia/index.js";import{default as ar}from"./TabWithImage/index.js";import{default as pr}from"./FeatureShowcase/index.js";import{default as fr}from"./ProductHero/index.js";import{default as cr}from"./SpecsComparison/index.js";import{default as lr}from"./MediaSceneSwitcher/index.js";import{default as nr}from"./MediaSceneSwitcherV2/index.js";import{default as yr}from"./ThreeDCarousel/index.js";import{default as Sr}from"./ProductNav/index.js";import{default as Cr}from"./AnchorNavigation/index.js";import{default as Mr}from"./PromotionalBar/index.js";import{default as Br}from"./EventSchedule/index.js";import{default as Ir}from"./SecondaryBanner/index.js";import{default as jr}from"./BuyOneGetOneShelf/index.js";import{default as Fr}from"./ActiveShelf/index.js";import{default as Gr}from"./MediaShelf/index.js";import{default as Lr,CreditsProductCard as wr}from"./CreditsShelf/index.js";import{default as Or,SceneProductCard as Er}from"./SceneShelf/index.js";import{default as Nr,SceneShelfV2ProductCard as qr}from"./SceneShelfV2/index.js";import{default as Hr}from"./SceneShelfV3/index.js";import{default as _r}from"./MediaEndorsement/index.js";import{default as Ur}from"./MediaTextOverlay/index.js";import{default as Jr}from"./ImageOverlayShelf/index.js";import{default as Xr}from"./ImageTextOverlay/index.js";import{default as $r}from"./MiniCart/index.js";import{default as to}from"./MiniCart/CircleProgress.js";import{default as oo,MiniCartDialog as ao}from"./MiniCart/MiniCartDialog.js";import{default as po}from"./WebPushPopup/index.js";import{useEmarsysWebPush as fo}from"../hooks/useEmarsysWebPush.js";const e={"ipc-accordioncards":"AccordionCards","ipc-aplusdesc":"AplusDesc","ipc-banner":"HeroBanner","ipc-brand-equity":"BrandEquity","ipc-category":"Category","ipc-collection-banner":"CollectionBanner","ipc-collection-shelves":"CollectionShelves","ipc-creativemodule":"CreativeModule","ipc-download":"DownLoad","ipc-evaluate":"Evaluate","ipc-faq":"Faq","ipc-features":"Features","ipc-footcharger":"FootCharger","ipc-ga-block":"GraphicAttractionBlock","ipc-giftbox":"GiftBox","ipc-giftshelf":"GiftShelf","ipc-graphic":"Graphic","ipc-graphicmore":"GraphicMore","ipc-graphicoverlay":"GraphicOverlay","ipc-marquee":"Marquee","ipc-mediaplayerbase":"MediaPlayerBase","ipc-mediaplayermulti":"MediaPlayerMulti","ipc-mediaplayersticky":"MediaPlayerSticky","ipc-member-equity":"MemberEquity","ipc-mlg-block":"MultiLayoutGraphicBlock","ipc-search-page-tabs":"SearchPageBlock","ipc-selectstore":"SelectStore","ipc-shelfdisplay":"ShelfDisplay","ipc-slogan":"Slogan","ipc-spacer":"Spacer","ipc-specs":"Specs","ipc-tabs":"Tabs","ipc-text-marquee":"TextMarquee","ipc-title":"Title","ipc-whychoose":"WhyChoose","ipc-product-nav":"ProductNav","ipc-brand-card-link":"BrandCardLink","ipc-ipredirect":"IPRedirect",ksp:"Ksp","ipc-secondary-banner":"SecondaryBanner","ipc-media-endorsement":"MediaEndorsement","ipc-media-scene-switcher-v2":"MediaSceneSwitcherV2","ipc-featured-blog-posts":"FeaturedBlogPosts","ipc-media-text-overlay":"MediaTextOverlay",ProductCompare:"ProductCompare"};import{useAiuiContext as uo}from"./AiuiProvider/index.js";import{default as mo}from"./ModalRegisterSubscribe/index.js";import{default as xo}from"./ModalSubscribeConfirm/index.js";import{default as ho}from"./ModalCoupon/index.js";import{default as Po}from"./ModalSmsSubscribe/index.js";import{default as go}from"./ModalVerify/index.js";export{D as AccordionCards,Fr as ActiveShelf,d as ActivityMechanism,o as ActivitySchedule,le as AiuiProvider,Cr as AnchorNavigation,Tt as AplusDesc,dt as BenefitsTab,je as BizProductProvider,wt as BrandCardLink,u as BrandEquity,jr as BuyOneGetOneShelf,mt as CartActionButtons,T as Category,Ce as CreativeModule,wr as CreditsProductCard,Lr as CreditsShelf,At as DownLoad,v as Evaluate,Br as EventSchedule,_ as Faq,Yt as FeatureCards,pr as FeatureShowcase,Qt as FeaturedBlogPosts,vt as Features,kt as FootCharger,oe as FooterNavigation,bt as GiftBox,i as GiftShelf,s as GiftTierShelf,A as Graphic,$ as GraphicAttractionBlock,gt as GraphicMore,Me as GraphicOverlay,te as HeaderNavigation,b as HeroBanner,se as IPC_SEARCH_PAGE,Vt as IPRedirect,Jr as ImageOverlayShelf,zt as ImageTextFeature,Xr as ImageTextOverlay,Zt as ImageWithText,Kt as Ksp,W as Marquee,Y as MarqueeImageContent,U as MarqueeItem,q as MarqueeReview,J as MarqueeTextContent,_r as MediaEndorsement,k as MediaPlayerBase,O as MediaPlayerMulti,w as MediaPlayerSticky,lr as MediaSceneSwitcher,nr as MediaSceneSwitcherV2,Gr as MediaShelf,Ur as MediaTextOverlay,m as MemberEquity,$r as MiniCart,to as MiniCartCircleProgress,oo as MiniCartDialog,ao as MiniCartDialogComponent,ho as ModalCoupon,mo as ModalRegisterSubscribe,Po as ModalSmsSubscribe,xo as ModalSubscribeConfirm,go as ModalVerify,X as MultiLayoutGraphicBlock,xt as NotifyMeDialog,e as PAYLOAD_COMPONENT_MAP,ut as PaidShipping,ke as ProductActions,$e as ProductBanner,We as ProductBenefits,Oe as ProductBenefitsTabs,Je as ProductBundle,we as ProductCard,Rt as ProductCompare,Xe as ProductCoupon,it as ProductDetail,_e as ProductExchangePurchase,He as ProductFreeGift,ot as ProductGallery,tt as ProductGridBox,fr as ProductHero,qe as ProductHighlight,Nt as ProductLottery,Sr as ProductNav,Ue as ProductOptions,Pt as ProductPaidShipping,ht as ProductServiceBenefits,st as ProductSummary,Mr as PromotionalBar,Ae as PurchaseBar,Er as SceneProductCard,Or as SceneShelf,Nr as SceneShelfV2,qr as SceneShelfV2ProductCard,Hr as SceneShelfV3,ie as SearchPage,fe as SearchPageTabType,Ir as SecondaryBanner,Dt as SelectStore,g as ShelfDisplay,x as Slogan,P as Spacer,Be as Specs,cr as SpecsComparison,ye as SwiperBox,Ie as TabGroup,ar as TabWithImage,ne as Tabs,rr as TabsWithMedia,yr as ThreeDCarousel,h as Title,er as VideoFeature,Se as VideoModal,po as WebPushPopup,Et as WheelLottery,H as WhyChoose,uo as useAiuiContext,De as useBizProductContext,fo as useEmarsysWebPush,ce as withLayout};
2
2
  //# sourceMappingURL=index.js.map