@anker-in/headless-ui 1.3.22 → 1.3.23

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.
@@ -75,6 +75,12 @@ interface AiuiContextType {
75
75
  * </AiuiProvider>
76
76
  */
77
77
  onExposure?: OnExposureCallback;
78
+ /**
79
+ * 自定义 locale → BCP47 语言标签映射,会与内置 map merge(外部优先级更高)。
80
+ * 消费方无需修改 headless-ui 源码即可支持新 locale 的价格格式化。
81
+ * @example { 'eu-pl': 'pl-PL', 'eu-pt': 'pt-PT' }
82
+ */
83
+ localeMap?: Record<string, string>;
78
84
  }
79
85
  export declare const AiuiContext: React.Context<AiuiContextType>;
80
86
  export declare const useAiuiContext: () => AiuiContextType;
@@ -1,2 +1,2 @@
1
- "use strict";var d=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var A=Object.getOwnPropertyNames;var E=Object.prototype.hasOwnProperty;var C=(e,t)=>{for(var i in t)d(e,i,{get:t[i],enumerable:!0})},D=(e,t,i,c)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of A(t))!E.call(e,n)&&n!==i&&d(e,n,{get:()=>t[n],enumerable:!(c=x(t,n))||c.enumerable});return e};var T=e=>D(d({},"__esModule",{value:!0}),e);var L={};C(L,{AiuiContext:()=>l,default:()=>R,useAiuiContext:()=>_});module.exports=T(L);var m=require("react/jsx-runtime"),v=require("../../shared/track.js"),a=require("react");const l=(0,a.createContext)({trackingData:{},locale:void 0,copyWriting:{}}),_=()=>{const e=(0,a.useContext)(l);if(!e)throw new Error("useAiui must be used in <AiuiProvider>");return e},P=({children:e,...t})=>{const i=(0,a.useRef)(null),c=(0,a.useRef)(t?.trackingData);return(0,a.useEffect)(()=>{c.current=t?.trackingData},[t?.trackingData]),(0,a.useEffect)(()=>{const n=i.current;if(!n)return;const g=(r,o)=>{const s={};if(!o||!o.attributes)return s;for(const k of Array.from(o.attributes)){const p=k?.name;p?.startsWith("data-headless-")&&(s[p]=o.getAttribute(p))}const h=s?.["data-headless-sku"],b=s?.["data-headless-type-name"]?.split?.("#"),u=s?.["data-headless-title-desc-button"]?.split?.("#"),f=s?.["data-headless-nav-position"]?.split?.("#");(0,v.gaTrack)({event:"ga4Event",event_name:"component_click",event_parameters:{page_group:c.current?.pageGroup||"Home Page",component_type:b?.[0]||"",component_name:b?.[1]||"",position:f?.[1]||"",navigation:f?.[0]||"",button_name:u?.[2]||"",SKU:h||"",component_title:u?.[0]||"",component_description:u?.[1]||""}})},y=new MutationObserver(()=>{n.querySelectorAll("[data-headless-type-name]").forEach(r=>{r.hasAttribute("data-headless-track-bound")||(r.addEventListener("click",o=>g(o,r)),r.setAttribute("data-headless-track-bound","true"))})});return y.observe(n,{childList:!0,subtree:!0}),n.querySelectorAll("[data-headless-type-name]").forEach(r=>{r.hasAttribute("data-headless-track-bound")||(r.addEventListener("click",o=>g(o,r)),r.setAttribute("data-headless-track-bound","true"))}),()=>y.disconnect()},[]),(0,m.jsx)(l.Provider,{value:t,children:(0,m.jsx)("div",{ref:i,children:e})})};var R=P;
1
+ "use strict";var l=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var E=Object.getOwnPropertyNames;var C=Object.prototype.hasOwnProperty;var D=(e,t)=>{for(var i in t)l(e,i,{get:t[i],enumerable:!0})},T=(e,t,i,c)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of E(t))!C.call(e,a)&&a!==i&&l(e,a,{get:()=>t[a],enumerable:!(c=A(t,a))||c.enumerable});return e};var _=e=>T(l({},"__esModule",{value:!0}),e);var L={};D(L,{AiuiContext:()=>d,default:()=>R,useAiuiContext:()=>M});module.exports=_(L);var m=require("react/jsx-runtime"),v=require("../../shared/track.js"),n=require("react"),h=require("../../helpers/index.js");const d=(0,n.createContext)({trackingData:{},locale:void 0,copyWriting:{}}),M=()=>{const e=(0,n.useContext)(d);if(!e)throw new Error("useAiui must be used in <AiuiProvider>");return e},P=({children:e,...t})=>{const i=(0,n.useRef)(null),c=(0,n.useRef)(t?.trackingData);return(0,n.useEffect)(()=>{t.localeMap&&Object.keys(t.localeMap).length>0&&(0,h.extendLocaleMap)(t.localeMap)},[t.localeMap]),(0,n.useEffect)(()=>{c.current=t?.trackingData},[t?.trackingData]),(0,n.useEffect)(()=>{const a=i.current;if(!a)return;const g=(o,r)=>{const s={};if(!r||!r.attributes)return s;for(const x of Array.from(r.attributes)){const u=x?.name;u?.startsWith("data-headless-")&&(s[u]=r.getAttribute(u))}const k=s?.["data-headless-sku"],f=s?.["data-headless-type-name"]?.split?.("#"),p=s?.["data-headless-title-desc-button"]?.split?.("#"),b=s?.["data-headless-nav-position"]?.split?.("#");(0,v.gaTrack)({event:"ga4Event",event_name:"component_click",event_parameters:{page_group:c.current?.pageGroup||"Home Page",component_type:f?.[0]||"",component_name:f?.[1]||"",position:b?.[1]||"",navigation:b?.[0]||"",button_name:p?.[2]||"",SKU:k||"",component_title:p?.[0]||"",component_description:p?.[1]||""}})},y=new MutationObserver(()=>{a.querySelectorAll("[data-headless-type-name]").forEach(o=>{o.hasAttribute("data-headless-track-bound")||(o.addEventListener("click",r=>g(r,o)),o.setAttribute("data-headless-track-bound","true"))})});return y.observe(a,{childList:!0,subtree:!0}),a.querySelectorAll("[data-headless-type-name]").forEach(o=>{o.hasAttribute("data-headless-track-bound")||(o.addEventListener("click",r=>g(r,o)),o.setAttribute("data-headless-track-bound","true"))}),()=>y.disconnect()},[]),(0,m.jsx)(d.Provider,{value:t,children:(0,m.jsx)("div",{ref:i,children:e})})};var R=P;
2
2
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/biz-components/AiuiProvider/index.tsx"],
4
- "sourcesContent": ["import { gaTrack } from '../../shared/track.js'\nimport React, { createContext, useContext, useEffect, useRef } from 'react'\nimport type { CurrencyDisplayType } from '../../types/props.js'\n\n/**\n * Exposure tracking parameters\n */\nexport interface ExposureParams {\n componentType: string\n componentName: string\n componentTitle?: string\n componentDescription?: string\n navigation?: string\n pageGroup?: string\n position?: number\n}\n\n/**\n * Callback function for custom exposure handling\n */\nexport type OnExposureCallback = (params: ExposureParams) => void\n\ninterface AiuiContextType {\n /**\n * \u5168\u5C40\u57CB\u70B9\u6570\u636E\uFF0C\u81F3\u5C11\u5E94\u5305\u542B pageGroup \u5B57\u6BB5\u7528\u4E8E\u533A\u5206\u9875\u9762\uFF0C\u5176\u4ED6\u5B57\u6BB5\u53EF\u6839\u636E\u9700\u8981\u6DFB\u52A0\n */\n trackingData: Record<string, any>\n /**\n * \u5F53\u524D\u8BED\u8A00\u73AF\u5883\uFF0C\u9ED8\u8BA4\u4E3A\u6D4F\u89C8\u5668\u8BED\u8A00\n */\n locale?: string\n /**\n * \u5F53\u524D\u9875\u9762\u8DEF\u5F84\uFF0C\u7528\u4E8E\u57CB\u70B9\u533A\u5206\u4E0D\u540C\u9875\u9762\uFF0C\u9ED8\u8BA4\u4E3A window.location.pathname\n */\n pathname?: string\n /**\n * \u5546\u6237\u81EA\u5B9A\u4E49\u7684\u5E97\u94FA\u57DF\u540D\uFF0C\u7528\u4E8E\u57CB\u70B9\u533A\u5206\u4E0D\u540C\u5546\u6237\uFF0C\u9ED8\u8BA4\u4E3A\u7A7A\u5B57\u7B26\u4E32\n */\n storeDomain?: string\n /**\n * \u5F53\u524D\u9875\u9762\u7684 handle\uFF08slug\uFF09\uFF0C\u7528\u4E8E tracking \u57CB\u70B9\u533A\u5206\u9875\u9762\u8D44\u6E90\uFF0C\u7531\u6D88\u8D39\u65B9\u4F20\u5165\u3002\n * \u4F8B\u5982\uFF1A<AiuiProvider pageHandle={page.handle} ...>\n * ProductLottery\u3001Media Endorsement \u7B49\u7EC4\u4EF6\u53EF\u901A\u8FC7 useAiuiContext() \u8BFB\u53D6\u6B64\u5B57\u6BB5\u3002\n */\n pageHandle?: string\n /**\n * \u7528\u6237\u662F\u5426\u767B\u5F55\n */\n isLogin?: boolean\n\n /**\n * \u7528\u6237\u662F\u5426\u4E3APlus\u4F1A\u5458\n */\n isPlusMember?: boolean\n /**\n * \u8D27\u5E01\u4EE3\u7801\uFF0C\u9ED8\u8BA4\u4E3AUSD\n */\n currencyCode?: string\n /**\n * \u8D27\u5E01\u663E\u793A\u65B9\u5F0F\uFF0C\u9ED8\u8BA4\u4E3Asymbol\uFF08\u7B26\u53F7\uFF09\uFF0C\u53EF\u9009\u503C\u5305\u62EC\uFF1A'symbol'\uFF08\u7B26\u53F7\uFF0C\u5982$\uFF09\u3001'code'\uFF08\u8D27\u5E01\u4EE3\u7801\uFF0C\u5982USD\uFF09\u548C'name'\uFF08\u8D27\u5E01\u540D\u79F0\uFF0C\u5982\u7F8E\u5143\uFF09\u3002\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#currencydisplay for more details\n */\n currencyDisplay?: CurrencyDisplayType\n /**\n * \u6587\u6848\u914D\u7F6E\uFF0C\u5546\u6237\u53EF\u901A\u8FC7\u6B64\u5B57\u6BB5\u8986\u76D6\u9ED8\u8BA4\u6587\u6848\n */\n copyWriting?: Record<string, string>\n /**\n * \u81EA\u5B9A\u4E49\u66DD\u5149\u56DE\u8C03\u3002\u4F20\u5165\u540E\u4F1A\u66FF\u4EE3\u9ED8\u8BA4\u7684 GA \u57CB\u70B9\u903B\u8F91\u3002\n *\n * @example\n * <AiuiProvider\n * trackingData={{ pageGroup: 'Home Page' }}\n * onExposure={(params) => {\n * // \u4F7F\u7528\u5546\u6237\u81EA\u5DF1\u7684\u57CB\u70B9\u7CFB\u7EDF\u8BB0\u5F55\u66DD\u5149\u4E8B\u4EF6\n * ga.track('component_impression', params)\n * }}\n * >\n * {children}\n * </AiuiProvider>\n */\n onExposure?: OnExposureCallback\n}\n\nexport const AiuiContext = createContext<AiuiContextType>({\n trackingData: {},\n locale: undefined,\n copyWriting: {},\n})\n\nexport const useAiuiContext = () => {\n const context = useContext(AiuiContext)\n if (!context) {\n throw new Error('useAiui must be used in <AiuiProvider>')\n }\n return context\n}\n\nconst AiuiProvider = ({\n children,\n ...rest\n}: {\n children: React.ReactNode\n} & AiuiContextType) => {\n const rootRef = useRef<HTMLDivElement>(null)\n const trackingDataRef = useRef(rest?.trackingData)\n useEffect(() => {\n trackingDataRef.current = rest?.trackingData\n }, [rest?.trackingData])\n\n useEffect(() => {\n const root = rootRef.current\n if (!root) return\n\n const handleTrackClick = (_e: Event, el: Element) => {\n const out: any = {}\n if (!el || !el.attributes) return out\n for (const attr of Array.from(el.attributes)) {\n const name = (attr as any)?.name\n if (name?.startsWith('data-headless-')) {\n out[name] = el.getAttribute(name)\n }\n }\n const sku = out?.['data-headless-sku']\n const nameType = out?.['data-headless-type-name']?.split?.('#')\n const titleDesc = out?.['data-headless-title-desc-button']?.split?.('#')\n const navPosition = out?.['data-headless-nav-position']?.split?.('#')\n gaTrack({\n event: 'ga4Event',\n event_name: 'component_click',\n event_parameters: {\n page_group: trackingDataRef.current?.pageGroup || 'Home Page',\n component_type: nameType?.[0] || '',\n component_name: nameType?.[1] || '',\n position: navPosition?.[1] || '',\n navigation: navPosition?.[0] || '',\n button_name: titleDesc?.[2] || '',\n SKU: sku || '',\n component_title: titleDesc?.[0] || '',\n component_description: titleDesc?.[1] || '',\n },\n })\n }\n const observer = new MutationObserver(() => {\n root.querySelectorAll('[data-headless-type-name]').forEach(el => {\n if (!el.hasAttribute('data-headless-track-bound')) {\n el.addEventListener('click', e => handleTrackClick(e, el))\n el.setAttribute('data-headless-track-bound', 'true') // \u907F\u514D\u91CD\u590D\u7ED1\u5B9A\n }\n })\n })\n observer.observe(root, { childList: true, subtree: true })\n // \u521D\u59CB\u5316\u4E00\u6B21\u73B0\u6709\u8282\u70B9\n root.querySelectorAll('[data-headless-type-name]').forEach(el => {\n if (!el.hasAttribute('data-headless-track-bound')) {\n el.addEventListener('click', e => handleTrackClick(e, el))\n el.setAttribute('data-headless-track-bound', 'true')\n }\n })\n return () => observer.disconnect()\n }, [])\n\n return (\n <AiuiContext.Provider value={rest}>\n <div ref={rootRef}>{children}</div>\n </AiuiContext.Provider>\n )\n}\n\nexport default AiuiProvider\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iBAAAE,EAAA,YAAAC,EAAA,mBAAAC,IAAA,eAAAC,EAAAL,GAoKM,IAAAM,EAAA,6BApKNC,EAAwB,iCACxBC,EAAoE,iBAmF7D,MAAMN,KAAc,iBAA+B,CACxD,aAAc,CAAC,EACf,OAAQ,OACR,YAAa,CAAC,CAChB,CAAC,EAEYE,EAAiB,IAAM,CAClC,MAAMK,KAAU,cAAWP,CAAW,EACtC,GAAI,CAACO,EACH,MAAM,IAAI,MAAM,wCAAwC,EAE1D,OAAOA,CACT,EAEMC,EAAe,CAAC,CACpB,SAAAC,EACA,GAAGC,CACL,IAEwB,CACtB,MAAMC,KAAU,UAAuB,IAAI,EACrCC,KAAkB,UAAOF,GAAM,YAAY,EACjD,sBAAU,IAAM,CACdE,EAAgB,QAAUF,GAAM,YAClC,EAAG,CAACA,GAAM,YAAY,CAAC,KAEvB,aAAU,IAAM,CACd,MAAMG,EAAOF,EAAQ,QACrB,GAAI,CAACE,EAAM,OAEX,MAAMC,EAAmB,CAACC,EAAWC,IAAgB,CACnD,MAAMC,EAAW,CAAC,EAClB,GAAI,CAACD,GAAM,CAACA,EAAG,WAAY,OAAOC,EAClC,UAAWC,KAAQ,MAAM,KAAKF,EAAG,UAAU,EAAG,CAC5C,MAAMG,EAAQD,GAAc,KACxBC,GAAM,WAAW,gBAAgB,IACnCF,EAAIE,CAAI,EAAIH,EAAG,aAAaG,CAAI,EAEpC,CACA,MAAMC,EAAMH,IAAM,mBAAmB,EAC/BI,EAAWJ,IAAM,yBAAyB,GAAG,QAAQ,GAAG,EACxDK,EAAYL,IAAM,iCAAiC,GAAG,QAAQ,GAAG,EACjEM,EAAcN,IAAM,4BAA4B,GAAG,QAAQ,GAAG,KACpE,WAAQ,CACN,MAAO,WACP,WAAY,kBACZ,iBAAkB,CAChB,WAAYL,EAAgB,SAAS,WAAa,YAClD,eAAgBS,IAAW,CAAC,GAAK,GACjC,eAAgBA,IAAW,CAAC,GAAK,GACjC,SAAUE,IAAc,CAAC,GAAK,GAC9B,WAAYA,IAAc,CAAC,GAAK,GAChC,YAAaD,IAAY,CAAC,GAAK,GAC/B,IAAKF,GAAO,GACZ,gBAAiBE,IAAY,CAAC,GAAK,GACnC,sBAAuBA,IAAY,CAAC,GAAK,EAC3C,CACF,CAAC,CACH,EACME,EAAW,IAAI,iBAAiB,IAAM,CAC1CX,EAAK,iBAAiB,2BAA2B,EAAE,QAAQG,GAAM,CAC1DA,EAAG,aAAa,2BAA2B,IAC9CA,EAAG,iBAAiB,QAASS,GAAKX,EAAiBW,EAAGT,CAAE,CAAC,EACzDA,EAAG,aAAa,4BAA6B,MAAM,EAEvD,CAAC,CACH,CAAC,EACD,OAAAQ,EAAS,QAAQX,EAAM,CAAE,UAAW,GAAM,QAAS,EAAK,CAAC,EAEzDA,EAAK,iBAAiB,2BAA2B,EAAE,QAAQG,GAAM,CAC1DA,EAAG,aAAa,2BAA2B,IAC9CA,EAAG,iBAAiB,QAASS,GAAKX,EAAiBW,EAAGT,CAAE,CAAC,EACzDA,EAAG,aAAa,4BAA6B,MAAM,EAEvD,CAAC,EACM,IAAMQ,EAAS,WAAW,CACnC,EAAG,CAAC,CAAC,KAGH,OAACxB,EAAY,SAAZ,CAAqB,MAAOU,EAC3B,mBAAC,OAAI,IAAKC,EAAU,SAAAF,EAAS,EAC/B,CAEJ,EAEA,IAAOR,EAAQO",
6
- "names": ["AiuiProvider_exports", "__export", "AiuiContext", "AiuiProvider_default", "useAiuiContext", "__toCommonJS", "import_jsx_runtime", "import_track", "import_react", "context", "AiuiProvider", "children", "rest", "rootRef", "trackingDataRef", "root", "handleTrackClick", "_e", "el", "out", "attr", "name", "sku", "nameType", "titleDesc", "navPosition", "observer", "e"]
4
+ "sourcesContent": ["import { gaTrack } from '../../shared/track.js'\nimport React, { createContext, useContext, useEffect, useRef } from 'react'\nimport type { CurrencyDisplayType } from '../../types/props.js'\nimport { extendLocaleMap } from '../../helpers/index.js'\n\n/**\n * Exposure tracking parameters\n */\nexport interface ExposureParams {\n componentType: string\n componentName: string\n componentTitle?: string\n componentDescription?: string\n navigation?: string\n pageGroup?: string\n position?: number\n}\n\n/**\n * Callback function for custom exposure handling\n */\nexport type OnExposureCallback = (params: ExposureParams) => void\n\ninterface AiuiContextType {\n /**\n * \u5168\u5C40\u57CB\u70B9\u6570\u636E\uFF0C\u81F3\u5C11\u5E94\u5305\u542B pageGroup \u5B57\u6BB5\u7528\u4E8E\u533A\u5206\u9875\u9762\uFF0C\u5176\u4ED6\u5B57\u6BB5\u53EF\u6839\u636E\u9700\u8981\u6DFB\u52A0\n */\n trackingData: Record<string, any>\n /**\n * \u5F53\u524D\u8BED\u8A00\u73AF\u5883\uFF0C\u9ED8\u8BA4\u4E3A\u6D4F\u89C8\u5668\u8BED\u8A00\n */\n locale?: string\n /**\n * \u5F53\u524D\u9875\u9762\u8DEF\u5F84\uFF0C\u7528\u4E8E\u57CB\u70B9\u533A\u5206\u4E0D\u540C\u9875\u9762\uFF0C\u9ED8\u8BA4\u4E3A window.location.pathname\n */\n pathname?: string\n /**\n * \u5546\u6237\u81EA\u5B9A\u4E49\u7684\u5E97\u94FA\u57DF\u540D\uFF0C\u7528\u4E8E\u57CB\u70B9\u533A\u5206\u4E0D\u540C\u5546\u6237\uFF0C\u9ED8\u8BA4\u4E3A\u7A7A\u5B57\u7B26\u4E32\n */\n storeDomain?: string\n /**\n * \u5F53\u524D\u9875\u9762\u7684 handle\uFF08slug\uFF09\uFF0C\u7528\u4E8E tracking \u57CB\u70B9\u533A\u5206\u9875\u9762\u8D44\u6E90\uFF0C\u7531\u6D88\u8D39\u65B9\u4F20\u5165\u3002\n * \u4F8B\u5982\uFF1A<AiuiProvider pageHandle={page.handle} ...>\n * ProductLottery\u3001Media Endorsement \u7B49\u7EC4\u4EF6\u53EF\u901A\u8FC7 useAiuiContext() \u8BFB\u53D6\u6B64\u5B57\u6BB5\u3002\n */\n pageHandle?: string\n /**\n * \u7528\u6237\u662F\u5426\u767B\u5F55\n */\n isLogin?: boolean\n\n /**\n * \u7528\u6237\u662F\u5426\u4E3APlus\u4F1A\u5458\n */\n isPlusMember?: boolean\n /**\n * \u8D27\u5E01\u4EE3\u7801\uFF0C\u9ED8\u8BA4\u4E3AUSD\n */\n currencyCode?: string\n /**\n * \u8D27\u5E01\u663E\u793A\u65B9\u5F0F\uFF0C\u9ED8\u8BA4\u4E3Asymbol\uFF08\u7B26\u53F7\uFF09\uFF0C\u53EF\u9009\u503C\u5305\u62EC\uFF1A'symbol'\uFF08\u7B26\u53F7\uFF0C\u5982$\uFF09\u3001'code'\uFF08\u8D27\u5E01\u4EE3\u7801\uFF0C\u5982USD\uFF09\u548C'name'\uFF08\u8D27\u5E01\u540D\u79F0\uFF0C\u5982\u7F8E\u5143\uFF09\u3002\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#currencydisplay for more details\n */\n currencyDisplay?: CurrencyDisplayType\n /**\n * \u6587\u6848\u914D\u7F6E\uFF0C\u5546\u6237\u53EF\u901A\u8FC7\u6B64\u5B57\u6BB5\u8986\u76D6\u9ED8\u8BA4\u6587\u6848\n */\n copyWriting?: Record<string, string>\n /**\n * \u81EA\u5B9A\u4E49\u66DD\u5149\u56DE\u8C03\u3002\u4F20\u5165\u540E\u4F1A\u66FF\u4EE3\u9ED8\u8BA4\u7684 GA \u57CB\u70B9\u903B\u8F91\u3002\n *\n * @example\n * <AiuiProvider\n * trackingData={{ pageGroup: 'Home Page' }}\n * onExposure={(params) => {\n * // \u4F7F\u7528\u5546\u6237\u81EA\u5DF1\u7684\u57CB\u70B9\u7CFB\u7EDF\u8BB0\u5F55\u66DD\u5149\u4E8B\u4EF6\n * ga.track('component_impression', params)\n * }}\n * >\n * {children}\n * </AiuiProvider>\n */\n onExposure?: OnExposureCallback\n /**\n * \u81EA\u5B9A\u4E49 locale \u2192 BCP47 \u8BED\u8A00\u6807\u7B7E\u6620\u5C04\uFF0C\u4F1A\u4E0E\u5185\u7F6E map merge\uFF08\u5916\u90E8\u4F18\u5148\u7EA7\u66F4\u9AD8\uFF09\u3002\n * \u6D88\u8D39\u65B9\u65E0\u9700\u4FEE\u6539 headless-ui \u6E90\u7801\u5373\u53EF\u652F\u6301\u65B0 locale \u7684\u4EF7\u683C\u683C\u5F0F\u5316\u3002\n * @example { 'eu-pl': 'pl-PL', 'eu-pt': 'pt-PT' }\n */\n localeMap?: Record<string, string>\n}\n\nexport const AiuiContext = createContext<AiuiContextType>({\n trackingData: {},\n locale: undefined,\n copyWriting: {},\n})\n\nexport const useAiuiContext = () => {\n const context = useContext(AiuiContext)\n if (!context) {\n throw new Error('useAiui must be used in <AiuiProvider>')\n }\n return context\n}\n\nconst AiuiProvider = ({\n children,\n ...rest\n}: {\n children: React.ReactNode\n} & AiuiContextType) => {\n const rootRef = useRef<HTMLDivElement>(null)\n const trackingDataRef = useRef(rest?.trackingData)\n useEffect(() => {\n if (rest.localeMap && Object.keys(rest.localeMap).length > 0) {\n extendLocaleMap(rest.localeMap)\n }\n }, [rest.localeMap])\n\n useEffect(() => {\n trackingDataRef.current = rest?.trackingData\n }, [rest?.trackingData])\n\n useEffect(() => {\n const root = rootRef.current\n if (!root) return\n\n const handleTrackClick = (_e: Event, el: Element) => {\n const out: any = {}\n if (!el || !el.attributes) return out\n for (const attr of Array.from(el.attributes)) {\n const name = (attr as any)?.name\n if (name?.startsWith('data-headless-')) {\n out[name] = el.getAttribute(name)\n }\n }\n const sku = out?.['data-headless-sku']\n const nameType = out?.['data-headless-type-name']?.split?.('#')\n const titleDesc = out?.['data-headless-title-desc-button']?.split?.('#')\n const navPosition = out?.['data-headless-nav-position']?.split?.('#')\n gaTrack({\n event: 'ga4Event',\n event_name: 'component_click',\n event_parameters: {\n page_group: trackingDataRef.current?.pageGroup || 'Home Page',\n component_type: nameType?.[0] || '',\n component_name: nameType?.[1] || '',\n position: navPosition?.[1] || '',\n navigation: navPosition?.[0] || '',\n button_name: titleDesc?.[2] || '',\n SKU: sku || '',\n component_title: titleDesc?.[0] || '',\n component_description: titleDesc?.[1] || '',\n },\n })\n }\n const observer = new MutationObserver(() => {\n root.querySelectorAll('[data-headless-type-name]').forEach(el => {\n if (!el.hasAttribute('data-headless-track-bound')) {\n el.addEventListener('click', e => handleTrackClick(e, el))\n el.setAttribute('data-headless-track-bound', 'true') // \u907F\u514D\u91CD\u590D\u7ED1\u5B9A\n }\n })\n })\n observer.observe(root, { childList: true, subtree: true })\n // \u521D\u59CB\u5316\u4E00\u6B21\u73B0\u6709\u8282\u70B9\n root.querySelectorAll('[data-headless-type-name]').forEach(el => {\n if (!el.hasAttribute('data-headless-track-bound')) {\n el.addEventListener('click', e => handleTrackClick(e, el))\n el.setAttribute('data-headless-track-bound', 'true')\n }\n })\n return () => observer.disconnect()\n }, [])\n\n return (\n <AiuiContext.Provider value={rest}>\n <div ref={rootRef}>{children}</div>\n </AiuiContext.Provider>\n )\n}\n\nexport default AiuiProvider\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iBAAAE,EAAA,YAAAC,EAAA,mBAAAC,IAAA,eAAAC,EAAAL,GAiLM,IAAAM,EAAA,6BAjLNC,EAAwB,iCACxBC,EAAoE,iBAEpEC,EAAgC,kCAwFzB,MAAMP,KAAc,iBAA+B,CACxD,aAAc,CAAC,EACf,OAAQ,OACR,YAAa,CAAC,CAChB,CAAC,EAEYE,EAAiB,IAAM,CAClC,MAAMM,KAAU,cAAWR,CAAW,EACtC,GAAI,CAACQ,EACH,MAAM,IAAI,MAAM,wCAAwC,EAE1D,OAAOA,CACT,EAEMC,EAAe,CAAC,CACpB,SAAAC,EACA,GAAGC,CACL,IAEwB,CACtB,MAAMC,KAAU,UAAuB,IAAI,EACrCC,KAAkB,UAAOF,GAAM,YAAY,EACjD,sBAAU,IAAM,CACVA,EAAK,WAAa,OAAO,KAAKA,EAAK,SAAS,EAAE,OAAS,MACzD,mBAAgBA,EAAK,SAAS,CAElC,EAAG,CAACA,EAAK,SAAS,CAAC,KAEnB,aAAU,IAAM,CACdE,EAAgB,QAAUF,GAAM,YAClC,EAAG,CAACA,GAAM,YAAY,CAAC,KAEvB,aAAU,IAAM,CACd,MAAMG,EAAOF,EAAQ,QACrB,GAAI,CAACE,EAAM,OAEX,MAAMC,EAAmB,CAACC,EAAWC,IAAgB,CACnD,MAAMC,EAAW,CAAC,EAClB,GAAI,CAACD,GAAM,CAACA,EAAG,WAAY,OAAOC,EAClC,UAAWC,KAAQ,MAAM,KAAKF,EAAG,UAAU,EAAG,CAC5C,MAAMG,EAAQD,GAAc,KACxBC,GAAM,WAAW,gBAAgB,IACnCF,EAAIE,CAAI,EAAIH,EAAG,aAAaG,CAAI,EAEpC,CACA,MAAMC,EAAMH,IAAM,mBAAmB,EAC/BI,EAAWJ,IAAM,yBAAyB,GAAG,QAAQ,GAAG,EACxDK,EAAYL,IAAM,iCAAiC,GAAG,QAAQ,GAAG,EACjEM,EAAcN,IAAM,4BAA4B,GAAG,QAAQ,GAAG,KACpE,WAAQ,CACN,MAAO,WACP,WAAY,kBACZ,iBAAkB,CAChB,WAAYL,EAAgB,SAAS,WAAa,YAClD,eAAgBS,IAAW,CAAC,GAAK,GACjC,eAAgBA,IAAW,CAAC,GAAK,GACjC,SAAUE,IAAc,CAAC,GAAK,GAC9B,WAAYA,IAAc,CAAC,GAAK,GAChC,YAAaD,IAAY,CAAC,GAAK,GAC/B,IAAKF,GAAO,GACZ,gBAAiBE,IAAY,CAAC,GAAK,GACnC,sBAAuBA,IAAY,CAAC,GAAK,EAC3C,CACF,CAAC,CACH,EACME,EAAW,IAAI,iBAAiB,IAAM,CAC1CX,EAAK,iBAAiB,2BAA2B,EAAE,QAAQG,GAAM,CAC1DA,EAAG,aAAa,2BAA2B,IAC9CA,EAAG,iBAAiB,QAASS,GAAKX,EAAiBW,EAAGT,CAAE,CAAC,EACzDA,EAAG,aAAa,4BAA6B,MAAM,EAEvD,CAAC,CACH,CAAC,EACD,OAAAQ,EAAS,QAAQX,EAAM,CAAE,UAAW,GAAM,QAAS,EAAK,CAAC,EAEzDA,EAAK,iBAAiB,2BAA2B,EAAE,QAAQG,GAAM,CAC1DA,EAAG,aAAa,2BAA2B,IAC9CA,EAAG,iBAAiB,QAASS,GAAKX,EAAiBW,EAAGT,CAAE,CAAC,EACzDA,EAAG,aAAa,4BAA6B,MAAM,EAEvD,CAAC,EACM,IAAMQ,EAAS,WAAW,CACnC,EAAG,CAAC,CAAC,KAGH,OAACzB,EAAY,SAAZ,CAAqB,MAAOW,EAC3B,mBAAC,OAAI,IAAKC,EAAU,SAAAF,EAAS,EAC/B,CAEJ,EAEA,IAAOT,EAAQQ",
6
+ "names": ["AiuiProvider_exports", "__export", "AiuiContext", "AiuiProvider_default", "useAiuiContext", "__toCommonJS", "import_jsx_runtime", "import_track", "import_react", "import_helpers", "context", "AiuiProvider", "children", "rest", "rootRef", "trackingDataRef", "root", "handleTrackClick", "_e", "el", "out", "attr", "name", "sku", "nameType", "titleDesc", "navPosition", "observer", "e"]
7
7
  }
@@ -1,4 +1,4 @@
1
1
  export { cn, getLocalizedPath } from './utils.js';
2
2
  export { noop } from './utils.js';
3
- export { formatPrice, languageTerritory, PRICE_SYMBOL } from './priceFormatting.js';
3
+ export { formatPrice, languageTerritory, PRICE_SYMBOL, extendLocaleMap } from './priceFormatting.js';
4
4
  export { isLexicalEmpty } from './isLexicalEmpty.js';
@@ -1,2 +1,2 @@
1
- "use strict";var p=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var n=(r,o)=>{for(var a in o)p(r,a,{get:o[a],enumerable:!0})},L=(r,o,a,f)=>{if(o&&typeof o=="object"||typeof o=="function")for(let t of g(o))!l.call(r,t)&&t!==a&&p(r,t,{get:()=>o[t],enumerable:!(f=c(o,t))||f.enumerable});return r};var P=r=>L(p({},"__esModule",{value:!0}),r);var y={};n(y,{PRICE_SYMBOL:()=>e.PRICE_SYMBOL,cn:()=>m.cn,formatPrice:()=>e.formatPrice,getLocalizedPath:()=>m.getLocalizedPath,isLexicalEmpty:()=>x.isLexicalEmpty,languageTerritory:()=>e.languageTerritory,noop:()=>i.noop});module.exports=P(y);var m=require("./utils.js"),i=require("./utils.js"),e=require("./priceFormatting.js"),x=require("./isLexicalEmpty.js");
1
+ "use strict";var m=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var n=Object.prototype.hasOwnProperty;var L=(r,o)=>{for(var a in o)m(r,a,{get:o[a],enumerable:!0})},g=(r,o,a,x)=>{if(o&&typeof o=="object"||typeof o=="function")for(let t of l(o))!n.call(r,t)&&t!==a&&m(r,t,{get:()=>o[t],enumerable:!(x=i(o,t))||x.enumerable});return r};var P=r=>g(m({},"__esModule",{value:!0}),r);var d={};L(d,{PRICE_SYMBOL:()=>e.PRICE_SYMBOL,cn:()=>p.cn,extendLocaleMap:()=>e.extendLocaleMap,formatPrice:()=>e.formatPrice,getLocalizedPath:()=>p.getLocalizedPath,isLexicalEmpty:()=>f.isLexicalEmpty,languageTerritory:()=>e.languageTerritory,noop:()=>c.noop});module.exports=P(d);var p=require("./utils.js"),c=require("./utils.js"),e=require("./priceFormatting.js"),f=require("./isLexicalEmpty.js");
2
2
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/helpers/index.ts"],
4
- "sourcesContent": ["export { cn, getLocalizedPath } from './utils.js'\nexport { noop } from './utils.js'\nexport { formatPrice, languageTerritory, PRICE_SYMBOL } from './priceFormatting.js'\nexport { isLexicalEmpty } from './isLexicalEmpty.js'\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,kOAAAE,EAAAF,GAAA,IAAAG,EAAqC,sBACrCA,EAAqB,sBACrBC,EAA6D,gCAC7DC,EAA+B",
4
+ "sourcesContent": ["export { cn, getLocalizedPath } from './utils.js'\nexport { noop } from './utils.js'\nexport { formatPrice, languageTerritory, PRICE_SYMBOL, extendLocaleMap } from './priceFormatting.js'\nexport { isLexicalEmpty } from './isLexicalEmpty.js'\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wQAAAE,EAAAF,GAAA,IAAAG,EAAqC,sBACrCA,EAAqB,sBACrBC,EAA8E,gCAC9EC,EAA+B",
6
6
  "names": ["helpers_exports", "__export", "__toCommonJS", "import_utils", "import_priceFormatting", "import_isLexicalEmpty"]
7
7
  }
@@ -1,4 +1,9 @@
1
1
  export declare const PRICE_SYMBOL: any;
2
+ /**
3
+ * 注入自定义 locale → BCP47 映射,与内置 map merge(外部优先级更高)。
4
+ * 由 AiuiProvider 在挂载时调用,消费方无需修改 headless-ui 源码即可支持新 locale。
5
+ */
6
+ export declare const extendLocaleMap: (map: Record<string, string>) => void;
2
7
  export declare const languageTerritory: (locale: string) => string;
3
8
  export declare function formatPrice({ amount, currencyCode, locale, maximumFractionDigits, minimumFractionDigits, removeTrailingZeros, currencyDisplay, }: {
4
9
  amount: number;
@@ -1,2 +1,2 @@
1
- "use strict";var u=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var y=(e,n)=>{for(var r in n)u(e,r,{get:n[r],enumerable:!0})},b=(e,n,r,a)=>{if(n&&typeof n=="object"||typeof n=="function")for(let t of f(n))!g.call(e,t)&&t!==r&&u(e,t,{get:()=>n[t],enumerable:!(a=d(n,t))||a.enumerable});return e};var p=e=>b(u({},"__esModule",{value:!0}),e);var D={};y(D,{PRICE_SYMBOL:()=>E,formatPrice:()=>S,languageTerritory:()=>s});module.exports=p(D);const E={us:"$",uk:"\xA3",ca:"$",eu:"\u20AC",fr:"\u20AC",de:"\u20AC",nl:"\u20AC",vn:"\u20AB",cl:"$",sg:"$",ae:"AED"},s=e=>({us:"en-US",uk:"en-GB",ca:"en-CA",au:"AU","eu-en":"en","eu-fr":"fr-FR",fr:"FR","ca-fr":"FR","nl-fr":"FR",my:"MY",it:"IT",vn:"VN",es:"es-ES","eu-it":"it-IT","eu-de":"de-DE",de:"de-DE","eu-es":"es-ES","cz-en":"en-CZ",nl:"nl-NL","dk-en":"en-DK","gr-en":"en-GR","mk-en":"en-MK","hu-en":"en-HU","se-en":"en-SE","hr-en":"en-HR","bg-en":"en-BG","ee-en":"en-EE","fi-en":"en-FI","lt-en":"en-LT",pl:"pl-PL","ro-en":"en-RO","si-en":"en-SI","sk-en":"en-SK","no-en":"en-NO","ad-en":"en-AD","al-en":"en-AL","ba-en":"en-BA","me-en":"en-ME","rs-en":"en-RS","gl-en":"en-GL","is-en":"en-IS","ua-en":"en-UA","by-en":"en-BY","md-en":"en-MD","lv-en":"en-LV","at-de":"de-AT","lu-de":"de-LU","li-de":"de-LI","va-it":"it-VA","sm-it":"it-SM","be-nl":"nl-BE","ae-en":"en-AE",nz:"en-NZ","sg-en":"en-SG","sa-en":"en-SA","vn-vi":"vi-VN",ie:"en-IE",tw:"zh-TW"})[e]||"";function S({amount:e,currencyCode:n,locale:r,maximumFractionDigits:a,minimumFractionDigits:t,removeTrailingZeros:c=!1,currencyDisplay:o="symbol"}){const m=r==="nl"?"EUR":n||"USD",l=s(r);if(!l)return null;let i=new Intl.NumberFormat(l,{style:"currency",currency:m,currencyDisplay:o,minimumFractionDigits:a===0?0:t,maximumFractionDigits:a})?.format?.(e);return["eu-de","eu-en","de","eu"].includes(r)&&(i=i?.toString()?.replace?.(/[\s]/g,"")),c&&(i=i?.replace?.(/(\.\d*?[1-9])0+\b/,"$1")?.replace?.(/\.0+\b/,"")?.replace?.(/(,\d*?[1-9])0+\b/,"$1")?.replace?.(/,0+\b/,"")),i}
1
+ "use strict";var s=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var L=Object.prototype.hasOwnProperty;var b=(e,n)=>{for(var r in n)s(e,r,{get:n[r],enumerable:!0})},E=(e,n,r,i)=>{if(n&&typeof n=="object"||typeof n=="function")for(let t of y(n))!L.call(e,t)&&t!==r&&s(e,t,{get:()=>n[t],enumerable:!(i=f(n,t))||i.enumerable});return e};var R=e=>E(s({},"__esModule",{value:!0}),e);var I={};b(I,{PRICE_SYMBOL:()=>S,extendLocaleMap:()=>A,formatPrice:()=>D,languageTerritory:()=>d});module.exports=R(I);const S={us:"$",uk:"\xA3",ca:"$",eu:"\u20AC",fr:"\u20AC",de:"\u20AC",nl:"\u20AC",vn:"\u20AB",cl:"$",sg:"$",ae:"AED"},u={us:"en-US",uk:"en-GB",ca:"en-CA",au:"AU","eu-en":"en","eu-fr":"fr-FR",fr:"FR","ca-fr":"FR","nl-fr":"FR",my:"MY",it:"IT",vn:"VN",es:"es-ES","eu-it":"it-IT","eu-de":"de-DE",de:"de-DE","eu-es":"es-ES","cz-en":"en-CZ",nl:"nl-NL","dk-en":"en-DK","gr-en":"en-GR","mk-en":"en-MK","hu-en":"en-HU","se-en":"en-SE","hr-en":"en-HR","bg-en":"en-BG","ee-en":"en-EE","fi-en":"en-FI","lt-en":"en-LT",pl:"pl-PL","ro-en":"en-RO","si-en":"en-SI","sk-en":"en-SK","no-en":"en-NO","ad-en":"en-AD","al-en":"en-AL","ba-en":"en-BA","me-en":"en-ME","rs-en":"en-RS","gl-en":"en-GL","is-en":"en-IS","ua-en":"en-UA","by-en":"en-BY","md-en":"en-MD","lv-en":"en-LV","at-de":"de-AT","lu-de":"de-LU","li-de":"de-LI","va-it":"it-VA","sm-it":"it-SM","be-nl":"nl-BE","ae-en":"en-AE",nz:"en-NZ","sg-en":"en-SG","sa-en":"en-SA","vn-vi":"vi-VN",ie:"en-IE",tw:"zh-TW"};let c={},o=u;const A=e=>{c={...c,...e},o={...u,...c}},d=e=>o[e]||"";function D({amount:e,currencyCode:n,locale:r,maximumFractionDigits:i,minimumFractionDigits:t,removeTrailingZeros:m=!1,currencyDisplay:g="symbol"}){const p=r==="nl"?"EUR":n||"USD",l=d(r);if(!l)return null;let a=new Intl.NumberFormat(l,{style:"currency",currency:p,currencyDisplay:g,minimumFractionDigits:i===0?0:t,maximumFractionDigits:i})?.format?.(e);return["eu-de","eu-en","de","eu"].includes(r)&&(a=a?.toString()?.replace?.(/[\s]/g,"")),m&&(a=a?.replace?.(/(\.\d*?[1-9])0+\b/,"$1")?.replace?.(/\.0+\b/,"")?.replace?.(/(,\d*?[1-9])0+\b/,"$1")?.replace?.(/,0+\b/,"")),a}
2
2
  //# sourceMappingURL=priceFormatting.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/helpers/priceFormatting.ts"],
4
- "sourcesContent": ["export const PRICE_SYMBOL = {\n us: '$',\n uk: '\u00A3',\n ca: '$',\n eu: '\u20AC',\n fr: '\u20AC',\n de: '\u20AC',\n nl: '\u20AC',\n vn: '\u20AB',\n cl: '$',\n sg: '$',\n ae: 'AED',\n} as any\n\nexport const languageTerritory = (locale: string) =>\n // https://unicode-org.github.io/cldr-staging/charts/37/supplemental/language_territory_information.html\n ({\n us: 'en-US',\n uk: 'en-GB',\n ca: 'en-CA',\n au: 'AU',\n 'eu-en': 'en',\n 'eu-fr': 'fr-FR',\n fr: 'FR',\n 'ca-fr': 'FR',\n 'nl-fr': 'FR',\n my: 'MY',\n it: 'IT',\n vn: 'VN',\n es: 'es-ES',\n 'eu-it': 'it-IT',\n 'eu-de': 'de-DE',\n de: 'de-DE',\n 'eu-es': 'es-ES',\n 'cz-en': 'en-CZ',\n nl: 'nl-NL',\n 'dk-en': 'en-DK',\n 'gr-en': 'en-GR',\n 'mk-en': 'en-MK',\n 'hu-en': 'en-HU',\n 'se-en': 'en-SE',\n 'hr-en': 'en-HR',\n 'bg-en': 'en-BG',\n 'ee-en': 'en-EE',\n 'fi-en': 'en-FI',\n 'lt-en': 'en-LT',\n pl: 'pl-PL',\n 'ro-en': 'en-RO',\n 'si-en': 'en-SI',\n 'sk-en': 'en-SK',\n 'no-en': 'en-NO',\n 'ad-en': 'en-AD',\n 'al-en': 'en-AL',\n 'ba-en': 'en-BA',\n 'me-en': 'en-ME',\n 'rs-en': 'en-RS',\n 'gl-en': 'en-GL',\n 'is-en': 'en-IS',\n 'ua-en': 'en-UA',\n 'by-en': 'en-BY',\n 'md-en': 'en-MD',\n 'lv-en': 'en-LV',\n 'at-de': 'de-AT',\n 'lu-de': 'de-LU',\n 'li-de': 'de-LI',\n 'va-it': 'it-VA',\n 'sm-it': 'it-SM',\n 'be-nl': 'nl-BE',\n 'ae-en': 'en-AE',\n nz: 'en-NZ',\n 'sg-en': 'en-SG',\n 'sa-en': 'en-SA',\n 'vn-vi': 'vi-VN',\n ie: 'en-IE',\n tw: 'zh-TW',\n })[locale] || ''\n\nexport function formatPrice({\n amount,\n currencyCode,\n locale,\n maximumFractionDigits,\n minimumFractionDigits,\n removeTrailingZeros = false,\n currencyDisplay = 'symbol',\n}: {\n amount: number\n currencyCode: string\n locale: string\n maximumFractionDigits?: number\n minimumFractionDigits?: number\n removeTrailingZeros?: boolean\n currencyDisplay?: Intl.NumberFormatOptions['currencyDisplay']\n}) {\n const code = locale === 'nl' ? 'EUR' : currencyCode || 'USD'\n const localeLanguage = languageTerritory(locale)\n if (!localeLanguage) {\n return null\n }\n const formatCurrency = new Intl.NumberFormat(localeLanguage, {\n style: 'currency',\n currency: code,\n currencyDisplay: currencyDisplay,\n minimumFractionDigits: maximumFractionDigits === 0 ? 0 : minimumFractionDigits,\n maximumFractionDigits,\n })\n\n let formattedValue = formatCurrency?.format?.(amount)\n\n if (['eu-de', 'eu-en', 'de', 'eu'].includes(locale)) {\n formattedValue = formattedValue?.toString()?.replace?.(/[\\s]/g, '')\n }\n\n if (removeTrailingZeros) {\n formattedValue = formattedValue\n ?.replace?.(/(\\.\\d*?[1-9])0+\\b/, '$1')\n ?.replace?.(/\\.0+\\b/, '')\n ?.replace?.(/(,\\d*?[1-9])0+\\b/, '$1')\n ?.replace?.(/,0+\\b/, '')\n }\n\n return formattedValue\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,kBAAAE,EAAA,gBAAAC,EAAA,sBAAAC,IAAA,eAAAC,EAAAL,GAAO,MAAME,EAAe,CAC1B,GAAI,IACJ,GAAI,OACJ,GAAI,IACJ,GAAI,SACJ,GAAI,SACJ,GAAI,SACJ,GAAI,SACJ,GAAI,SACJ,GAAI,IACJ,GAAI,IACJ,GAAI,KACN,EAEaE,EAAqBE,IAE/B,CACC,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,GAAI,KACJ,QAAS,KACT,QAAS,QACT,GAAI,KACJ,QAAS,KACT,QAAS,KACT,GAAI,KACJ,GAAI,KACJ,GAAI,KACJ,GAAI,QACJ,QAAS,QACT,QAAS,QACT,GAAI,QACJ,QAAS,QACT,QAAS,QACT,GAAI,QACJ,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,GAAI,QACJ,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,GAAI,QACJ,QAAS,QACT,QAAS,QACT,QAAS,QACT,GAAI,QACJ,GAAI,OACN,GAAGA,CAAM,GAAK,GAET,SAASH,EAAY,CAC1B,OAAAI,EACA,aAAAC,EACA,OAAAF,EACA,sBAAAG,EACA,sBAAAC,EACA,oBAAAC,EAAsB,GACtB,gBAAAC,EAAkB,QACpB,EAQG,CACD,MAAMC,EAAOP,IAAW,KAAO,MAAQE,GAAgB,MACjDM,EAAiBV,EAAkBE,CAAM,EAC/C,GAAI,CAACQ,EACH,OAAO,KAUT,IAAIC,EARmB,IAAI,KAAK,aAAaD,EAAgB,CAC3D,MAAO,WACP,SAAUD,EACV,gBAAiBD,EACjB,sBAAuBH,IAA0B,EAAI,EAAIC,EACzD,sBAAAD,CACF,CAAC,GAEoC,SAASF,CAAM,EAEpD,MAAI,CAAC,QAAS,QAAS,KAAM,IAAI,EAAE,SAASD,CAAM,IAChDS,EAAiBA,GAAgB,SAAS,GAAG,UAAU,QAAS,EAAE,GAGhEJ,IACFI,EAAiBA,GACb,UAAU,oBAAqB,IAAI,GACnC,UAAU,SAAU,EAAE,GACtB,UAAU,mBAAoB,IAAI,GAClC,UAAU,QAAS,EAAE,GAGpBA,CACT",
6
- "names": ["priceFormatting_exports", "__export", "PRICE_SYMBOL", "formatPrice", "languageTerritory", "__toCommonJS", "locale", "amount", "currencyCode", "maximumFractionDigits", "minimumFractionDigits", "removeTrailingZeros", "currencyDisplay", "code", "localeLanguage", "formattedValue"]
4
+ "sourcesContent": ["export const PRICE_SYMBOL = {\n us: '$',\n uk: '\u00A3',\n ca: '$',\n eu: '\u20AC',\n fr: '\u20AC',\n de: '\u20AC',\n nl: '\u20AC',\n vn: '\u20AB',\n cl: '$',\n sg: '$',\n ae: 'AED',\n} as any\n\nconst BUILTIN_LOCALE_MAP: Record<string, string> = {\n // https://unicode-org.github.io/cldr-staging/charts/37/supplemental/language_territory_information.html\n us: 'en-US',\n uk: 'en-GB',\n ca: 'en-CA',\n au: 'AU',\n 'eu-en': 'en',\n 'eu-fr': 'fr-FR',\n fr: 'FR',\n 'ca-fr': 'FR',\n 'nl-fr': 'FR',\n my: 'MY',\n it: 'IT',\n vn: 'VN',\n es: 'es-ES',\n 'eu-it': 'it-IT',\n 'eu-de': 'de-DE',\n de: 'de-DE',\n 'eu-es': 'es-ES',\n 'cz-en': 'en-CZ',\n nl: 'nl-NL',\n 'dk-en': 'en-DK',\n 'gr-en': 'en-GR',\n 'mk-en': 'en-MK',\n 'hu-en': 'en-HU',\n 'se-en': 'en-SE',\n 'hr-en': 'en-HR',\n 'bg-en': 'en-BG',\n 'ee-en': 'en-EE',\n 'fi-en': 'en-FI',\n 'lt-en': 'en-LT',\n pl: 'pl-PL',\n 'ro-en': 'en-RO',\n 'si-en': 'en-SI',\n 'sk-en': 'en-SK',\n 'no-en': 'en-NO',\n 'ad-en': 'en-AD',\n 'al-en': 'en-AL',\n 'ba-en': 'en-BA',\n 'me-en': 'en-ME',\n 'rs-en': 'en-RS',\n 'gl-en': 'en-GL',\n 'is-en': 'en-IS',\n 'ua-en': 'en-UA',\n 'by-en': 'en-BY',\n 'md-en': 'en-MD',\n 'lv-en': 'en-LV',\n 'at-de': 'de-AT',\n 'lu-de': 'de-LU',\n 'li-de': 'de-LI',\n 'va-it': 'it-VA',\n 'sm-it': 'it-SM',\n 'be-nl': 'nl-BE',\n 'ae-en': 'en-AE',\n nz: 'en-NZ',\n 'sg-en': 'en-SG',\n 'sa-en': 'en-SA',\n 'vn-vi': 'vi-VN',\n ie: 'en-IE',\n tw: 'zh-TW',\n}\n\nlet _extraLocaleMap: Record<string, string> = {}\nlet _mergedLocaleMap: Record<string, string> = BUILTIN_LOCALE_MAP\n\n/**\n * \u6CE8\u5165\u81EA\u5B9A\u4E49 locale \u2192 BCP47 \u6620\u5C04\uFF0C\u4E0E\u5185\u7F6E map merge\uFF08\u5916\u90E8\u4F18\u5148\u7EA7\u66F4\u9AD8\uFF09\u3002\n * \u7531 AiuiProvider \u5728\u6302\u8F7D\u65F6\u8C03\u7528\uFF0C\u6D88\u8D39\u65B9\u65E0\u9700\u4FEE\u6539 headless-ui \u6E90\u7801\u5373\u53EF\u652F\u6301\u65B0 locale\u3002\n */\nexport const extendLocaleMap = (map: Record<string, string>) => {\n _extraLocaleMap = { ..._extraLocaleMap, ...map }\n _mergedLocaleMap = { ...BUILTIN_LOCALE_MAP, ..._extraLocaleMap }\n}\n\nexport const languageTerritory = (locale: string) => {\n return _mergedLocaleMap[locale] || ''\n}\n\nexport function formatPrice({\n amount,\n currencyCode,\n locale,\n maximumFractionDigits,\n minimumFractionDigits,\n removeTrailingZeros = false,\n currencyDisplay = 'symbol',\n}: {\n amount: number\n currencyCode: string\n locale: string\n maximumFractionDigits?: number\n minimumFractionDigits?: number\n removeTrailingZeros?: boolean\n currencyDisplay?: Intl.NumberFormatOptions['currencyDisplay']\n}) {\n const code = locale === 'nl' ? 'EUR' : currencyCode || 'USD'\n const localeLanguage = languageTerritory(locale)\n if (!localeLanguage) {\n return null\n }\n const formatCurrency = new Intl.NumberFormat(localeLanguage, {\n style: 'currency',\n currency: code,\n currencyDisplay: currencyDisplay,\n minimumFractionDigits: maximumFractionDigits === 0 ? 0 : minimumFractionDigits,\n maximumFractionDigits,\n })\n\n let formattedValue = formatCurrency?.format?.(amount)\n\n if (['eu-de', 'eu-en', 'de', 'eu'].includes(locale)) {\n formattedValue = formattedValue?.toString()?.replace?.(/[\\s]/g, '')\n }\n\n if (removeTrailingZeros) {\n formattedValue = formattedValue\n ?.replace?.(/(\\.\\d*?[1-9])0+\\b/, '$1')\n ?.replace?.(/\\.0+\\b/, '')\n ?.replace?.(/(,\\d*?[1-9])0+\\b/, '$1')\n ?.replace?.(/,0+\\b/, '')\n }\n\n return formattedValue\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,kBAAAE,EAAA,oBAAAC,EAAA,gBAAAC,EAAA,sBAAAC,IAAA,eAAAC,EAAAN,GAAO,MAAME,EAAe,CAC1B,GAAI,IACJ,GAAI,OACJ,GAAI,IACJ,GAAI,SACJ,GAAI,SACJ,GAAI,SACJ,GAAI,SACJ,GAAI,SACJ,GAAI,IACJ,GAAI,IACJ,GAAI,KACN,EAEMK,EAA6C,CAEjD,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,GAAI,KACJ,QAAS,KACT,QAAS,QACT,GAAI,KACJ,QAAS,KACT,QAAS,KACT,GAAI,KACJ,GAAI,KACJ,GAAI,KACJ,GAAI,QACJ,QAAS,QACT,QAAS,QACT,GAAI,QACJ,QAAS,QACT,QAAS,QACT,GAAI,QACJ,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,GAAI,QACJ,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,GAAI,QACJ,QAAS,QACT,QAAS,QACT,QAAS,QACT,GAAI,QACJ,GAAI,OACN,EAEA,IAAIC,EAA0C,CAAC,EAC3CC,EAA2CF,EAMxC,MAAMJ,EAAmBO,GAAgC,CAC9DF,EAAkB,CAAE,GAAGA,EAAiB,GAAGE,CAAI,EAC/CD,EAAmB,CAAE,GAAGF,EAAoB,GAAGC,CAAgB,CACjE,EAEaH,EAAqBM,GACzBF,EAAiBE,CAAM,GAAK,GAG9B,SAASP,EAAY,CAC1B,OAAAQ,EACA,aAAAC,EACA,OAAAF,EACA,sBAAAG,EACA,sBAAAC,EACA,oBAAAC,EAAsB,GACtB,gBAAAC,EAAkB,QACpB,EAQG,CACD,MAAMC,EAAOP,IAAW,KAAO,MAAQE,GAAgB,MACjDM,EAAiBd,EAAkBM,CAAM,EAC/C,GAAI,CAACQ,EACH,OAAO,KAUT,IAAIC,EARmB,IAAI,KAAK,aAAaD,EAAgB,CAC3D,MAAO,WACP,SAAUD,EACV,gBAAiBD,EACjB,sBAAuBH,IAA0B,EAAI,EAAIC,EACzD,sBAAAD,CACF,CAAC,GAEoC,SAASF,CAAM,EAEpD,MAAI,CAAC,QAAS,QAAS,KAAM,IAAI,EAAE,SAASD,CAAM,IAChDS,EAAiBA,GAAgB,SAAS,GAAG,UAAU,QAAS,EAAE,GAGhEJ,IACFI,EAAiBA,GACb,UAAU,oBAAqB,IAAI,GACnC,UAAU,SAAU,EAAE,GACtB,UAAU,mBAAoB,IAAI,GAClC,UAAU,QAAS,EAAE,GAGpBA,CACT",
6
+ "names": ["priceFormatting_exports", "__export", "PRICE_SYMBOL", "extendLocaleMap", "formatPrice", "languageTerritory", "__toCommonJS", "BUILTIN_LOCALE_MAP", "_extraLocaleMap", "_mergedLocaleMap", "map", "locale", "amount", "currencyCode", "maximumFractionDigits", "minimumFractionDigits", "removeTrailingZeros", "currencyDisplay", "code", "localeLanguage", "formattedValue"]
7
7
  }
@@ -75,6 +75,12 @@ interface AiuiContextType {
75
75
  * </AiuiProvider>
76
76
  */
77
77
  onExposure?: OnExposureCallback;
78
+ /**
79
+ * 自定义 locale → BCP47 语言标签映射,会与内置 map merge(外部优先级更高)。
80
+ * 消费方无需修改 headless-ui 源码即可支持新 locale 的价格格式化。
81
+ * @example { 'eu-pl': 'pl-PL', 'eu-pt': 'pt-PT' }
82
+ */
83
+ localeMap?: Record<string, string>;
78
84
  }
79
85
  export declare const AiuiContext: React.Context<AiuiContextType>;
80
86
  export declare const useAiuiContext: () => AiuiContextType;
@@ -1,2 +1,2 @@
1
- import{jsx as f}from"react/jsx-runtime";import{gaTrack as k}from"../../shared/track.js";import{createContext as x,useContext as A,useEffect as g,useRef as y}from"react";const b=x({trackingData:{},locale:void 0,copyWriting:{}}),_=()=>{const r=A(b);if(!r)throw new Error("useAiui must be used in <AiuiProvider>");return r},E=({children:r,...a})=>{const c=y(null),u=y(a?.trackingData);return g(()=>{u.current=a?.trackingData},[a?.trackingData]),g(()=>{const o=c.current;if(!o)return;const p=(t,e)=>{const n={};if(!e||!e.attributes)return n;for(const h of Array.from(e.attributes)){const s=h?.name;s?.startsWith("data-headless-")&&(n[s]=e.getAttribute(s))}const v=n?.["data-headless-sku"],l=n?.["data-headless-type-name"]?.split?.("#"),i=n?.["data-headless-title-desc-button"]?.split?.("#"),m=n?.["data-headless-nav-position"]?.split?.("#");k({event:"ga4Event",event_name:"component_click",event_parameters:{page_group:u.current?.pageGroup||"Home Page",component_type:l?.[0]||"",component_name:l?.[1]||"",position:m?.[1]||"",navigation:m?.[0]||"",button_name:i?.[2]||"",SKU:v||"",component_title:i?.[0]||"",component_description:i?.[1]||""}})},d=new MutationObserver(()=>{o.querySelectorAll("[data-headless-type-name]").forEach(t=>{t.hasAttribute("data-headless-track-bound")||(t.addEventListener("click",e=>p(e,t)),t.setAttribute("data-headless-track-bound","true"))})});return d.observe(o,{childList:!0,subtree:!0}),o.querySelectorAll("[data-headless-type-name]").forEach(t=>{t.hasAttribute("data-headless-track-bound")||(t.addEventListener("click",e=>p(e,t)),t.setAttribute("data-headless-track-bound","true"))}),()=>d.disconnect()},[]),f(b.Provider,{value:a,children:f("div",{ref:c,children:r})})};var P=E;export{b as AiuiContext,P as default,_ as useAiuiContext};
1
+ import{jsx as b}from"react/jsx-runtime";import{gaTrack as k}from"../../shared/track.js";import{createContext as x,useContext as A,useEffect as c,useRef as y}from"react";import{extendLocaleMap as E}from"../../helpers/index.js";const f=x({trackingData:{},locale:void 0,copyWriting:{}}),P=()=>{const o=A(f);if(!o)throw new Error("useAiui must be used in <AiuiProvider>");return o},C=({children:o,...e})=>{const p=y(null),u=y(e?.trackingData);return c(()=>{e.localeMap&&Object.keys(e.localeMap).length>0&&E(e.localeMap)},[e.localeMap]),c(()=>{u.current=e?.trackingData},[e?.trackingData]),c(()=>{const r=p.current;if(!r)return;const l=(t,n)=>{const a={};if(!n||!n.attributes)return a;for(const h of Array.from(n.attributes)){const s=h?.name;s?.startsWith("data-headless-")&&(a[s]=n.getAttribute(s))}const v=a?.["data-headless-sku"],m=a?.["data-headless-type-name"]?.split?.("#"),i=a?.["data-headless-title-desc-button"]?.split?.("#"),g=a?.["data-headless-nav-position"]?.split?.("#");k({event:"ga4Event",event_name:"component_click",event_parameters:{page_group:u.current?.pageGroup||"Home Page",component_type:m?.[0]||"",component_name:m?.[1]||"",position:g?.[1]||"",navigation:g?.[0]||"",button_name:i?.[2]||"",SKU:v||"",component_title:i?.[0]||"",component_description:i?.[1]||""}})},d=new MutationObserver(()=>{r.querySelectorAll("[data-headless-type-name]").forEach(t=>{t.hasAttribute("data-headless-track-bound")||(t.addEventListener("click",n=>l(n,t)),t.setAttribute("data-headless-track-bound","true"))})});return d.observe(r,{childList:!0,subtree:!0}),r.querySelectorAll("[data-headless-type-name]").forEach(t=>{t.hasAttribute("data-headless-track-bound")||(t.addEventListener("click",n=>l(n,t)),t.setAttribute("data-headless-track-bound","true"))}),()=>d.disconnect()},[]),b(f.Provider,{value:e,children:b("div",{ref:p,children:o})})};var R=C;export{f as AiuiContext,R as default,P as useAiuiContext};
2
2
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/biz-components/AiuiProvider/index.tsx"],
4
- "sourcesContent": ["import { gaTrack } from '../../shared/track.js'\nimport React, { createContext, useContext, useEffect, useRef } from 'react'\nimport type { CurrencyDisplayType } from '../../types/props.js'\n\n/**\n * Exposure tracking parameters\n */\nexport interface ExposureParams {\n componentType: string\n componentName: string\n componentTitle?: string\n componentDescription?: string\n navigation?: string\n pageGroup?: string\n position?: number\n}\n\n/**\n * Callback function for custom exposure handling\n */\nexport type OnExposureCallback = (params: ExposureParams) => void\n\ninterface AiuiContextType {\n /**\n * \u5168\u5C40\u57CB\u70B9\u6570\u636E\uFF0C\u81F3\u5C11\u5E94\u5305\u542B pageGroup \u5B57\u6BB5\u7528\u4E8E\u533A\u5206\u9875\u9762\uFF0C\u5176\u4ED6\u5B57\u6BB5\u53EF\u6839\u636E\u9700\u8981\u6DFB\u52A0\n */\n trackingData: Record<string, any>\n /**\n * \u5F53\u524D\u8BED\u8A00\u73AF\u5883\uFF0C\u9ED8\u8BA4\u4E3A\u6D4F\u89C8\u5668\u8BED\u8A00\n */\n locale?: string\n /**\n * \u5F53\u524D\u9875\u9762\u8DEF\u5F84\uFF0C\u7528\u4E8E\u57CB\u70B9\u533A\u5206\u4E0D\u540C\u9875\u9762\uFF0C\u9ED8\u8BA4\u4E3A window.location.pathname\n */\n pathname?: string\n /**\n * \u5546\u6237\u81EA\u5B9A\u4E49\u7684\u5E97\u94FA\u57DF\u540D\uFF0C\u7528\u4E8E\u57CB\u70B9\u533A\u5206\u4E0D\u540C\u5546\u6237\uFF0C\u9ED8\u8BA4\u4E3A\u7A7A\u5B57\u7B26\u4E32\n */\n storeDomain?: string\n /**\n * \u5F53\u524D\u9875\u9762\u7684 handle\uFF08slug\uFF09\uFF0C\u7528\u4E8E tracking \u57CB\u70B9\u533A\u5206\u9875\u9762\u8D44\u6E90\uFF0C\u7531\u6D88\u8D39\u65B9\u4F20\u5165\u3002\n * \u4F8B\u5982\uFF1A<AiuiProvider pageHandle={page.handle} ...>\n * ProductLottery\u3001Media Endorsement \u7B49\u7EC4\u4EF6\u53EF\u901A\u8FC7 useAiuiContext() \u8BFB\u53D6\u6B64\u5B57\u6BB5\u3002\n */\n pageHandle?: string\n /**\n * \u7528\u6237\u662F\u5426\u767B\u5F55\n */\n isLogin?: boolean\n\n /**\n * \u7528\u6237\u662F\u5426\u4E3APlus\u4F1A\u5458\n */\n isPlusMember?: boolean\n /**\n * \u8D27\u5E01\u4EE3\u7801\uFF0C\u9ED8\u8BA4\u4E3AUSD\n */\n currencyCode?: string\n /**\n * \u8D27\u5E01\u663E\u793A\u65B9\u5F0F\uFF0C\u9ED8\u8BA4\u4E3Asymbol\uFF08\u7B26\u53F7\uFF09\uFF0C\u53EF\u9009\u503C\u5305\u62EC\uFF1A'symbol'\uFF08\u7B26\u53F7\uFF0C\u5982$\uFF09\u3001'code'\uFF08\u8D27\u5E01\u4EE3\u7801\uFF0C\u5982USD\uFF09\u548C'name'\uFF08\u8D27\u5E01\u540D\u79F0\uFF0C\u5982\u7F8E\u5143\uFF09\u3002\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#currencydisplay for more details\n */\n currencyDisplay?: CurrencyDisplayType\n /**\n * \u6587\u6848\u914D\u7F6E\uFF0C\u5546\u6237\u53EF\u901A\u8FC7\u6B64\u5B57\u6BB5\u8986\u76D6\u9ED8\u8BA4\u6587\u6848\n */\n copyWriting?: Record<string, string>\n /**\n * \u81EA\u5B9A\u4E49\u66DD\u5149\u56DE\u8C03\u3002\u4F20\u5165\u540E\u4F1A\u66FF\u4EE3\u9ED8\u8BA4\u7684 GA \u57CB\u70B9\u903B\u8F91\u3002\n *\n * @example\n * <AiuiProvider\n * trackingData={{ pageGroup: 'Home Page' }}\n * onExposure={(params) => {\n * // \u4F7F\u7528\u5546\u6237\u81EA\u5DF1\u7684\u57CB\u70B9\u7CFB\u7EDF\u8BB0\u5F55\u66DD\u5149\u4E8B\u4EF6\n * ga.track('component_impression', params)\n * }}\n * >\n * {children}\n * </AiuiProvider>\n */\n onExposure?: OnExposureCallback\n}\n\nexport const AiuiContext = createContext<AiuiContextType>({\n trackingData: {},\n locale: undefined,\n copyWriting: {},\n})\n\nexport const useAiuiContext = () => {\n const context = useContext(AiuiContext)\n if (!context) {\n throw new Error('useAiui must be used in <AiuiProvider>')\n }\n return context\n}\n\nconst AiuiProvider = ({\n children,\n ...rest\n}: {\n children: React.ReactNode\n} & AiuiContextType) => {\n const rootRef = useRef<HTMLDivElement>(null)\n const trackingDataRef = useRef(rest?.trackingData)\n useEffect(() => {\n trackingDataRef.current = rest?.trackingData\n }, [rest?.trackingData])\n\n useEffect(() => {\n const root = rootRef.current\n if (!root) return\n\n const handleTrackClick = (_e: Event, el: Element) => {\n const out: any = {}\n if (!el || !el.attributes) return out\n for (const attr of Array.from(el.attributes)) {\n const name = (attr as any)?.name\n if (name?.startsWith('data-headless-')) {\n out[name] = el.getAttribute(name)\n }\n }\n const sku = out?.['data-headless-sku']\n const nameType = out?.['data-headless-type-name']?.split?.('#')\n const titleDesc = out?.['data-headless-title-desc-button']?.split?.('#')\n const navPosition = out?.['data-headless-nav-position']?.split?.('#')\n gaTrack({\n event: 'ga4Event',\n event_name: 'component_click',\n event_parameters: {\n page_group: trackingDataRef.current?.pageGroup || 'Home Page',\n component_type: nameType?.[0] || '',\n component_name: nameType?.[1] || '',\n position: navPosition?.[1] || '',\n navigation: navPosition?.[0] || '',\n button_name: titleDesc?.[2] || '',\n SKU: sku || '',\n component_title: titleDesc?.[0] || '',\n component_description: titleDesc?.[1] || '',\n },\n })\n }\n const observer = new MutationObserver(() => {\n root.querySelectorAll('[data-headless-type-name]').forEach(el => {\n if (!el.hasAttribute('data-headless-track-bound')) {\n el.addEventListener('click', e => handleTrackClick(e, el))\n el.setAttribute('data-headless-track-bound', 'true') // \u907F\u514D\u91CD\u590D\u7ED1\u5B9A\n }\n })\n })\n observer.observe(root, { childList: true, subtree: true })\n // \u521D\u59CB\u5316\u4E00\u6B21\u73B0\u6709\u8282\u70B9\n root.querySelectorAll('[data-headless-type-name]').forEach(el => {\n if (!el.hasAttribute('data-headless-track-bound')) {\n el.addEventListener('click', e => handleTrackClick(e, el))\n el.setAttribute('data-headless-track-bound', 'true')\n }\n })\n return () => observer.disconnect()\n }, [])\n\n return (\n <AiuiContext.Provider value={rest}>\n <div ref={rootRef}>{children}</div>\n </AiuiContext.Provider>\n )\n}\n\nexport default AiuiProvider\n"],
5
- "mappings": "AAoKM,cAAAA,MAAA,oBApKN,OAAS,WAAAC,MAAe,wBACxB,OAAgB,iBAAAC,EAAe,cAAAC,EAAY,aAAAC,EAAW,UAAAC,MAAc,QAmF7D,MAAMC,EAAcJ,EAA+B,CACxD,aAAc,CAAC,EACf,OAAQ,OACR,YAAa,CAAC,CAChB,CAAC,EAEYK,EAAiB,IAAM,CAClC,MAAMC,EAAUL,EAAWG,CAAW,EACtC,GAAI,CAACE,EACH,MAAM,IAAI,MAAM,wCAAwC,EAE1D,OAAOA,CACT,EAEMC,EAAe,CAAC,CACpB,SAAAC,EACA,GAAGC,CACL,IAEwB,CACtB,MAAMC,EAAUP,EAAuB,IAAI,EACrCQ,EAAkBR,EAAOM,GAAM,YAAY,EACjD,OAAAP,EAAU,IAAM,CACdS,EAAgB,QAAUF,GAAM,YAClC,EAAG,CAACA,GAAM,YAAY,CAAC,EAEvBP,EAAU,IAAM,CACd,MAAMU,EAAOF,EAAQ,QACrB,GAAI,CAACE,EAAM,OAEX,MAAMC,EAAmB,CAACC,EAAWC,IAAgB,CACnD,MAAMC,EAAW,CAAC,EAClB,GAAI,CAACD,GAAM,CAACA,EAAG,WAAY,OAAOC,EAClC,UAAWC,KAAQ,MAAM,KAAKF,EAAG,UAAU,EAAG,CAC5C,MAAMG,EAAQD,GAAc,KACxBC,GAAM,WAAW,gBAAgB,IACnCF,EAAIE,CAAI,EAAIH,EAAG,aAAaG,CAAI,EAEpC,CACA,MAAMC,EAAMH,IAAM,mBAAmB,EAC/BI,EAAWJ,IAAM,yBAAyB,GAAG,QAAQ,GAAG,EACxDK,EAAYL,IAAM,iCAAiC,GAAG,QAAQ,GAAG,EACjEM,EAAcN,IAAM,4BAA4B,GAAG,QAAQ,GAAG,EACpEjB,EAAQ,CACN,MAAO,WACP,WAAY,kBACZ,iBAAkB,CAChB,WAAYY,EAAgB,SAAS,WAAa,YAClD,eAAgBS,IAAW,CAAC,GAAK,GACjC,eAAgBA,IAAW,CAAC,GAAK,GACjC,SAAUE,IAAc,CAAC,GAAK,GAC9B,WAAYA,IAAc,CAAC,GAAK,GAChC,YAAaD,IAAY,CAAC,GAAK,GAC/B,IAAKF,GAAO,GACZ,gBAAiBE,IAAY,CAAC,GAAK,GACnC,sBAAuBA,IAAY,CAAC,GAAK,EAC3C,CACF,CAAC,CACH,EACME,EAAW,IAAI,iBAAiB,IAAM,CAC1CX,EAAK,iBAAiB,2BAA2B,EAAE,QAAQG,GAAM,CAC1DA,EAAG,aAAa,2BAA2B,IAC9CA,EAAG,iBAAiB,QAAS,GAAKF,EAAiB,EAAGE,CAAE,CAAC,EACzDA,EAAG,aAAa,4BAA6B,MAAM,EAEvD,CAAC,CACH,CAAC,EACD,OAAAQ,EAAS,QAAQX,EAAM,CAAE,UAAW,GAAM,QAAS,EAAK,CAAC,EAEzDA,EAAK,iBAAiB,2BAA2B,EAAE,QAAQG,GAAM,CAC1DA,EAAG,aAAa,2BAA2B,IAC9CA,EAAG,iBAAiB,QAAS,GAAKF,EAAiB,EAAGE,CAAE,CAAC,EACzDA,EAAG,aAAa,4BAA6B,MAAM,EAEvD,CAAC,EACM,IAAMQ,EAAS,WAAW,CACnC,EAAG,CAAC,CAAC,EAGHzB,EAACM,EAAY,SAAZ,CAAqB,MAAOK,EAC3B,SAAAX,EAAC,OAAI,IAAKY,EAAU,SAAAF,EAAS,EAC/B,CAEJ,EAEA,IAAOgB,EAAQjB",
6
- "names": ["jsx", "gaTrack", "createContext", "useContext", "useEffect", "useRef", "AiuiContext", "useAiuiContext", "context", "AiuiProvider", "children", "rest", "rootRef", "trackingDataRef", "root", "handleTrackClick", "_e", "el", "out", "attr", "name", "sku", "nameType", "titleDesc", "navPosition", "observer", "AiuiProvider_default"]
4
+ "sourcesContent": ["import { gaTrack } from '../../shared/track.js'\nimport React, { createContext, useContext, useEffect, useRef } from 'react'\nimport type { CurrencyDisplayType } from '../../types/props.js'\nimport { extendLocaleMap } from '../../helpers/index.js'\n\n/**\n * Exposure tracking parameters\n */\nexport interface ExposureParams {\n componentType: string\n componentName: string\n componentTitle?: string\n componentDescription?: string\n navigation?: string\n pageGroup?: string\n position?: number\n}\n\n/**\n * Callback function for custom exposure handling\n */\nexport type OnExposureCallback = (params: ExposureParams) => void\n\ninterface AiuiContextType {\n /**\n * \u5168\u5C40\u57CB\u70B9\u6570\u636E\uFF0C\u81F3\u5C11\u5E94\u5305\u542B pageGroup \u5B57\u6BB5\u7528\u4E8E\u533A\u5206\u9875\u9762\uFF0C\u5176\u4ED6\u5B57\u6BB5\u53EF\u6839\u636E\u9700\u8981\u6DFB\u52A0\n */\n trackingData: Record<string, any>\n /**\n * \u5F53\u524D\u8BED\u8A00\u73AF\u5883\uFF0C\u9ED8\u8BA4\u4E3A\u6D4F\u89C8\u5668\u8BED\u8A00\n */\n locale?: string\n /**\n * \u5F53\u524D\u9875\u9762\u8DEF\u5F84\uFF0C\u7528\u4E8E\u57CB\u70B9\u533A\u5206\u4E0D\u540C\u9875\u9762\uFF0C\u9ED8\u8BA4\u4E3A window.location.pathname\n */\n pathname?: string\n /**\n * \u5546\u6237\u81EA\u5B9A\u4E49\u7684\u5E97\u94FA\u57DF\u540D\uFF0C\u7528\u4E8E\u57CB\u70B9\u533A\u5206\u4E0D\u540C\u5546\u6237\uFF0C\u9ED8\u8BA4\u4E3A\u7A7A\u5B57\u7B26\u4E32\n */\n storeDomain?: string\n /**\n * \u5F53\u524D\u9875\u9762\u7684 handle\uFF08slug\uFF09\uFF0C\u7528\u4E8E tracking \u57CB\u70B9\u533A\u5206\u9875\u9762\u8D44\u6E90\uFF0C\u7531\u6D88\u8D39\u65B9\u4F20\u5165\u3002\n * \u4F8B\u5982\uFF1A<AiuiProvider pageHandle={page.handle} ...>\n * ProductLottery\u3001Media Endorsement \u7B49\u7EC4\u4EF6\u53EF\u901A\u8FC7 useAiuiContext() \u8BFB\u53D6\u6B64\u5B57\u6BB5\u3002\n */\n pageHandle?: string\n /**\n * \u7528\u6237\u662F\u5426\u767B\u5F55\n */\n isLogin?: boolean\n\n /**\n * \u7528\u6237\u662F\u5426\u4E3APlus\u4F1A\u5458\n */\n isPlusMember?: boolean\n /**\n * \u8D27\u5E01\u4EE3\u7801\uFF0C\u9ED8\u8BA4\u4E3AUSD\n */\n currencyCode?: string\n /**\n * \u8D27\u5E01\u663E\u793A\u65B9\u5F0F\uFF0C\u9ED8\u8BA4\u4E3Asymbol\uFF08\u7B26\u53F7\uFF09\uFF0C\u53EF\u9009\u503C\u5305\u62EC\uFF1A'symbol'\uFF08\u7B26\u53F7\uFF0C\u5982$\uFF09\u3001'code'\uFF08\u8D27\u5E01\u4EE3\u7801\uFF0C\u5982USD\uFF09\u548C'name'\uFF08\u8D27\u5E01\u540D\u79F0\uFF0C\u5982\u7F8E\u5143\uFF09\u3002\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#currencydisplay for more details\n */\n currencyDisplay?: CurrencyDisplayType\n /**\n * \u6587\u6848\u914D\u7F6E\uFF0C\u5546\u6237\u53EF\u901A\u8FC7\u6B64\u5B57\u6BB5\u8986\u76D6\u9ED8\u8BA4\u6587\u6848\n */\n copyWriting?: Record<string, string>\n /**\n * \u81EA\u5B9A\u4E49\u66DD\u5149\u56DE\u8C03\u3002\u4F20\u5165\u540E\u4F1A\u66FF\u4EE3\u9ED8\u8BA4\u7684 GA \u57CB\u70B9\u903B\u8F91\u3002\n *\n * @example\n * <AiuiProvider\n * trackingData={{ pageGroup: 'Home Page' }}\n * onExposure={(params) => {\n * // \u4F7F\u7528\u5546\u6237\u81EA\u5DF1\u7684\u57CB\u70B9\u7CFB\u7EDF\u8BB0\u5F55\u66DD\u5149\u4E8B\u4EF6\n * ga.track('component_impression', params)\n * }}\n * >\n * {children}\n * </AiuiProvider>\n */\n onExposure?: OnExposureCallback\n /**\n * \u81EA\u5B9A\u4E49 locale \u2192 BCP47 \u8BED\u8A00\u6807\u7B7E\u6620\u5C04\uFF0C\u4F1A\u4E0E\u5185\u7F6E map merge\uFF08\u5916\u90E8\u4F18\u5148\u7EA7\u66F4\u9AD8\uFF09\u3002\n * \u6D88\u8D39\u65B9\u65E0\u9700\u4FEE\u6539 headless-ui \u6E90\u7801\u5373\u53EF\u652F\u6301\u65B0 locale \u7684\u4EF7\u683C\u683C\u5F0F\u5316\u3002\n * @example { 'eu-pl': 'pl-PL', 'eu-pt': 'pt-PT' }\n */\n localeMap?: Record<string, string>\n}\n\nexport const AiuiContext = createContext<AiuiContextType>({\n trackingData: {},\n locale: undefined,\n copyWriting: {},\n})\n\nexport const useAiuiContext = () => {\n const context = useContext(AiuiContext)\n if (!context) {\n throw new Error('useAiui must be used in <AiuiProvider>')\n }\n return context\n}\n\nconst AiuiProvider = ({\n children,\n ...rest\n}: {\n children: React.ReactNode\n} & AiuiContextType) => {\n const rootRef = useRef<HTMLDivElement>(null)\n const trackingDataRef = useRef(rest?.trackingData)\n useEffect(() => {\n if (rest.localeMap && Object.keys(rest.localeMap).length > 0) {\n extendLocaleMap(rest.localeMap)\n }\n }, [rest.localeMap])\n\n useEffect(() => {\n trackingDataRef.current = rest?.trackingData\n }, [rest?.trackingData])\n\n useEffect(() => {\n const root = rootRef.current\n if (!root) return\n\n const handleTrackClick = (_e: Event, el: Element) => {\n const out: any = {}\n if (!el || !el.attributes) return out\n for (const attr of Array.from(el.attributes)) {\n const name = (attr as any)?.name\n if (name?.startsWith('data-headless-')) {\n out[name] = el.getAttribute(name)\n }\n }\n const sku = out?.['data-headless-sku']\n const nameType = out?.['data-headless-type-name']?.split?.('#')\n const titleDesc = out?.['data-headless-title-desc-button']?.split?.('#')\n const navPosition = out?.['data-headless-nav-position']?.split?.('#')\n gaTrack({\n event: 'ga4Event',\n event_name: 'component_click',\n event_parameters: {\n page_group: trackingDataRef.current?.pageGroup || 'Home Page',\n component_type: nameType?.[0] || '',\n component_name: nameType?.[1] || '',\n position: navPosition?.[1] || '',\n navigation: navPosition?.[0] || '',\n button_name: titleDesc?.[2] || '',\n SKU: sku || '',\n component_title: titleDesc?.[0] || '',\n component_description: titleDesc?.[1] || '',\n },\n })\n }\n const observer = new MutationObserver(() => {\n root.querySelectorAll('[data-headless-type-name]').forEach(el => {\n if (!el.hasAttribute('data-headless-track-bound')) {\n el.addEventListener('click', e => handleTrackClick(e, el))\n el.setAttribute('data-headless-track-bound', 'true') // \u907F\u514D\u91CD\u590D\u7ED1\u5B9A\n }\n })\n })\n observer.observe(root, { childList: true, subtree: true })\n // \u521D\u59CB\u5316\u4E00\u6B21\u73B0\u6709\u8282\u70B9\n root.querySelectorAll('[data-headless-type-name]').forEach(el => {\n if (!el.hasAttribute('data-headless-track-bound')) {\n el.addEventListener('click', e => handleTrackClick(e, el))\n el.setAttribute('data-headless-track-bound', 'true')\n }\n })\n return () => observer.disconnect()\n }, [])\n\n return (\n <AiuiContext.Provider value={rest}>\n <div ref={rootRef}>{children}</div>\n </AiuiContext.Provider>\n )\n}\n\nexport default AiuiProvider\n"],
5
+ "mappings": "AAiLM,cAAAA,MAAA,oBAjLN,OAAS,WAAAC,MAAe,wBACxB,OAAgB,iBAAAC,EAAe,cAAAC,EAAY,aAAAC,EAAW,UAAAC,MAAc,QAEpE,OAAS,mBAAAC,MAAuB,yBAwFzB,MAAMC,EAAcL,EAA+B,CACxD,aAAc,CAAC,EACf,OAAQ,OACR,YAAa,CAAC,CAChB,CAAC,EAEYM,EAAiB,IAAM,CAClC,MAAMC,EAAUN,EAAWI,CAAW,EACtC,GAAI,CAACE,EACH,MAAM,IAAI,MAAM,wCAAwC,EAE1D,OAAOA,CACT,EAEMC,EAAe,CAAC,CACpB,SAAAC,EACA,GAAGC,CACL,IAEwB,CACtB,MAAMC,EAAUR,EAAuB,IAAI,EACrCS,EAAkBT,EAAOO,GAAM,YAAY,EACjD,OAAAR,EAAU,IAAM,CACVQ,EAAK,WAAa,OAAO,KAAKA,EAAK,SAAS,EAAE,OAAS,GACzDN,EAAgBM,EAAK,SAAS,CAElC,EAAG,CAACA,EAAK,SAAS,CAAC,EAEnBR,EAAU,IAAM,CACdU,EAAgB,QAAUF,GAAM,YAClC,EAAG,CAACA,GAAM,YAAY,CAAC,EAEvBR,EAAU,IAAM,CACd,MAAMW,EAAOF,EAAQ,QACrB,GAAI,CAACE,EAAM,OAEX,MAAMC,EAAmB,CAACC,EAAWC,IAAgB,CACnD,MAAMC,EAAW,CAAC,EAClB,GAAI,CAACD,GAAM,CAACA,EAAG,WAAY,OAAOC,EAClC,UAAWC,KAAQ,MAAM,KAAKF,EAAG,UAAU,EAAG,CAC5C,MAAMG,EAAQD,GAAc,KACxBC,GAAM,WAAW,gBAAgB,IACnCF,EAAIE,CAAI,EAAIH,EAAG,aAAaG,CAAI,EAEpC,CACA,MAAMC,EAAMH,IAAM,mBAAmB,EAC/BI,EAAWJ,IAAM,yBAAyB,GAAG,QAAQ,GAAG,EACxDK,EAAYL,IAAM,iCAAiC,GAAG,QAAQ,GAAG,EACjEM,EAAcN,IAAM,4BAA4B,GAAG,QAAQ,GAAG,EACpElB,EAAQ,CACN,MAAO,WACP,WAAY,kBACZ,iBAAkB,CAChB,WAAYa,EAAgB,SAAS,WAAa,YAClD,eAAgBS,IAAW,CAAC,GAAK,GACjC,eAAgBA,IAAW,CAAC,GAAK,GACjC,SAAUE,IAAc,CAAC,GAAK,GAC9B,WAAYA,IAAc,CAAC,GAAK,GAChC,YAAaD,IAAY,CAAC,GAAK,GAC/B,IAAKF,GAAO,GACZ,gBAAiBE,IAAY,CAAC,GAAK,GACnC,sBAAuBA,IAAY,CAAC,GAAK,EAC3C,CACF,CAAC,CACH,EACME,EAAW,IAAI,iBAAiB,IAAM,CAC1CX,EAAK,iBAAiB,2BAA2B,EAAE,QAAQG,GAAM,CAC1DA,EAAG,aAAa,2BAA2B,IAC9CA,EAAG,iBAAiB,QAASS,GAAKX,EAAiBW,EAAGT,CAAE,CAAC,EACzDA,EAAG,aAAa,4BAA6B,MAAM,EAEvD,CAAC,CACH,CAAC,EACD,OAAAQ,EAAS,QAAQX,EAAM,CAAE,UAAW,GAAM,QAAS,EAAK,CAAC,EAEzDA,EAAK,iBAAiB,2BAA2B,EAAE,QAAQG,GAAM,CAC1DA,EAAG,aAAa,2BAA2B,IAC9CA,EAAG,iBAAiB,QAASS,GAAKX,EAAiBW,EAAGT,CAAE,CAAC,EACzDA,EAAG,aAAa,4BAA6B,MAAM,EAEvD,CAAC,EACM,IAAMQ,EAAS,WAAW,CACnC,EAAG,CAAC,CAAC,EAGH1B,EAACO,EAAY,SAAZ,CAAqB,MAAOK,EAC3B,SAAAZ,EAAC,OAAI,IAAKa,EAAU,SAAAF,EAAS,EAC/B,CAEJ,EAEA,IAAOiB,EAAQlB",
6
+ "names": ["jsx", "gaTrack", "createContext", "useContext", "useEffect", "useRef", "extendLocaleMap", "AiuiContext", "useAiuiContext", "context", "AiuiProvider", "children", "rest", "rootRef", "trackingDataRef", "root", "handleTrackClick", "_e", "el", "out", "attr", "name", "sku", "nameType", "titleDesc", "navPosition", "observer", "e", "AiuiProvider_default"]
7
7
  }
@@ -1,4 +1,4 @@
1
1
  export { cn, getLocalizedPath } from './utils.js';
2
2
  export { noop } from './utils.js';
3
- export { formatPrice, languageTerritory, PRICE_SYMBOL } from './priceFormatting.js';
3
+ export { formatPrice, languageTerritory, PRICE_SYMBOL, extendLocaleMap } from './priceFormatting.js';
4
4
  export { isLexicalEmpty } from './isLexicalEmpty.js';
@@ -1,2 +1,2 @@
1
- import{cn as e,getLocalizedPath as t}from"./utils.js";import{noop as m}from"./utils.js";import{formatPrice as f,languageTerritory as i,PRICE_SYMBOL as x}from"./priceFormatting.js";import{isLexicalEmpty as g}from"./isLexicalEmpty.js";export{x as PRICE_SYMBOL,e as cn,f as formatPrice,t as getLocalizedPath,g as isLexicalEmpty,i as languageTerritory,m as noop};
1
+ import{cn as r,getLocalizedPath as t}from"./utils.js";import{noop as p}from"./utils.js";import{formatPrice as x,languageTerritory as c,PRICE_SYMBOL as f,extendLocaleMap as i}from"./priceFormatting.js";import{isLexicalEmpty as n}from"./isLexicalEmpty.js";export{f as PRICE_SYMBOL,r as cn,i as extendLocaleMap,x as formatPrice,t as getLocalizedPath,n as isLexicalEmpty,c as languageTerritory,p as noop};
2
2
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/helpers/index.ts"],
4
- "sourcesContent": ["export { cn, getLocalizedPath } from './utils.js'\nexport { noop } from './utils.js'\nexport { formatPrice, languageTerritory, PRICE_SYMBOL } from './priceFormatting.js'\nexport { isLexicalEmpty } from './isLexicalEmpty.js'\n"],
5
- "mappings": "AAAA,OAAS,MAAAA,EAAI,oBAAAC,MAAwB,aACrC,OAAS,QAAAC,MAAY,aACrB,OAAS,eAAAC,EAAa,qBAAAC,EAAmB,gBAAAC,MAAoB,uBAC7D,OAAS,kBAAAC,MAAsB",
6
- "names": ["cn", "getLocalizedPath", "noop", "formatPrice", "languageTerritory", "PRICE_SYMBOL", "isLexicalEmpty"]
4
+ "sourcesContent": ["export { cn, getLocalizedPath } from './utils.js'\nexport { noop } from './utils.js'\nexport { formatPrice, languageTerritory, PRICE_SYMBOL, extendLocaleMap } from './priceFormatting.js'\nexport { isLexicalEmpty } from './isLexicalEmpty.js'\n"],
5
+ "mappings": "AAAA,OAAS,MAAAA,EAAI,oBAAAC,MAAwB,aACrC,OAAS,QAAAC,MAAY,aACrB,OAAS,eAAAC,EAAa,qBAAAC,EAAmB,gBAAAC,EAAc,mBAAAC,MAAuB,uBAC9E,OAAS,kBAAAC,MAAsB",
6
+ "names": ["cn", "getLocalizedPath", "noop", "formatPrice", "languageTerritory", "PRICE_SYMBOL", "extendLocaleMap", "isLexicalEmpty"]
7
7
  }
@@ -1,4 +1,9 @@
1
1
  export declare const PRICE_SYMBOL: any;
2
+ /**
3
+ * 注入自定义 locale → BCP47 映射,与内置 map merge(外部优先级更高)。
4
+ * 由 AiuiProvider 在挂载时调用,消费方无需修改 headless-ui 源码即可支持新 locale。
5
+ */
6
+ export declare const extendLocaleMap: (map: Record<string, string>) => void;
2
7
  export declare const languageTerritory: (locale: string) => string;
3
8
  export declare function formatPrice({ amount, currencyCode, locale, maximumFractionDigits, minimumFractionDigits, removeTrailingZeros, currencyDisplay, }: {
4
9
  amount: number;
@@ -1,2 +1,2 @@
1
- const d={us:"$",uk:"\xA3",ca:"$",eu:"\u20AC",fr:"\u20AC",de:"\u20AC",nl:"\u20AC",vn:"\u20AB",cl:"$",sg:"$",ae:"AED"},o=n=>({us:"en-US",uk:"en-GB",ca:"en-CA",au:"AU","eu-en":"en","eu-fr":"fr-FR",fr:"FR","ca-fr":"FR","nl-fr":"FR",my:"MY",it:"IT",vn:"VN",es:"es-ES","eu-it":"it-IT","eu-de":"de-DE",de:"de-DE","eu-es":"es-ES","cz-en":"en-CZ",nl:"nl-NL","dk-en":"en-DK","gr-en":"en-GR","mk-en":"en-MK","hu-en":"en-HU","se-en":"en-SE","hr-en":"en-HR","bg-en":"en-BG","ee-en":"en-EE","fi-en":"en-FI","lt-en":"en-LT",pl:"pl-PL","ro-en":"en-RO","si-en":"en-SI","sk-en":"en-SK","no-en":"en-NO","ad-en":"en-AD","al-en":"en-AL","ba-en":"en-BA","me-en":"en-ME","rs-en":"en-RS","gl-en":"en-GL","is-en":"en-IS","ua-en":"en-UA","by-en":"en-BY","md-en":"en-MD","lv-en":"en-LV","at-de":"de-AT","lu-de":"de-LU","li-de":"de-LI","va-it":"it-VA","sm-it":"it-SM","be-nl":"nl-BE","ae-en":"en-AE",nz:"en-NZ","sg-en":"en-SG","sa-en":"en-SA","vn-vi":"vi-VN",ie:"en-IE",tw:"zh-TW"})[n]||"";function f({amount:n,currencyCode:i,locale:r,maximumFractionDigits:t,minimumFractionDigits:u,removeTrailingZeros:l=!1,currencyDisplay:s="symbol"}){const c=r==="nl"?"EUR":i||"USD",a=o(r);if(!a)return null;let e=new Intl.NumberFormat(a,{style:"currency",currency:c,currencyDisplay:s,minimumFractionDigits:t===0?0:u,maximumFractionDigits:t})?.format?.(n);return["eu-de","eu-en","de","eu"].includes(r)&&(e=e?.toString()?.replace?.(/[\s]/g,"")),l&&(e=e?.replace?.(/(\.\d*?[1-9])0+\b/,"$1")?.replace?.(/\.0+\b/,"")?.replace?.(/(,\d*?[1-9])0+\b/,"$1")?.replace?.(/,0+\b/,"")),e}export{d as PRICE_SYMBOL,f as formatPrice,o as languageTerritory};
1
+ const f={us:"$",uk:"\xA3",ca:"$",eu:"\u20AC",fr:"\u20AC",de:"\u20AC",nl:"\u20AC",vn:"\u20AB",cl:"$",sg:"$",ae:"AED"},s={us:"en-US",uk:"en-GB",ca:"en-CA",au:"AU","eu-en":"en","eu-fr":"fr-FR",fr:"FR","ca-fr":"FR","nl-fr":"FR",my:"MY",it:"IT",vn:"VN",es:"es-ES","eu-it":"it-IT","eu-de":"de-DE",de:"de-DE","eu-es":"es-ES","cz-en":"en-CZ",nl:"nl-NL","dk-en":"en-DK","gr-en":"en-GR","mk-en":"en-MK","hu-en":"en-HU","se-en":"en-SE","hr-en":"en-HR","bg-en":"en-BG","ee-en":"en-EE","fi-en":"en-FI","lt-en":"en-LT",pl:"pl-PL","ro-en":"en-RO","si-en":"en-SI","sk-en":"en-SK","no-en":"en-NO","ad-en":"en-AD","al-en":"en-AL","ba-en":"en-BA","me-en":"en-ME","rs-en":"en-RS","gl-en":"en-GL","is-en":"en-IS","ua-en":"en-UA","by-en":"en-BY","md-en":"en-MD","lv-en":"en-LV","at-de":"de-AT","lu-de":"de-LU","li-de":"de-LI","va-it":"it-VA","sm-it":"it-SM","be-nl":"nl-BE","ae-en":"en-AE",nz:"en-NZ","sg-en":"en-SG","sa-en":"en-SA","vn-vi":"vi-VN",ie:"en-IE",tw:"zh-TW"};let t={},c=s;const y=e=>{t={...t,...e},c={...s,...t}},g=e=>c[e]||"";function L({amount:e,currencyCode:l,locale:r,maximumFractionDigits:i,minimumFractionDigits:u,removeTrailingZeros:o=!1,currencyDisplay:d="symbol"}){const m=r==="nl"?"EUR":l||"USD",a=g(r);if(!a)return null;let n=new Intl.NumberFormat(a,{style:"currency",currency:m,currencyDisplay:d,minimumFractionDigits:i===0?0:u,maximumFractionDigits:i})?.format?.(e);return["eu-de","eu-en","de","eu"].includes(r)&&(n=n?.toString()?.replace?.(/[\s]/g,"")),o&&(n=n?.replace?.(/(\.\d*?[1-9])0+\b/,"$1")?.replace?.(/\.0+\b/,"")?.replace?.(/(,\d*?[1-9])0+\b/,"$1")?.replace?.(/,0+\b/,"")),n}export{f as PRICE_SYMBOL,y as extendLocaleMap,L as formatPrice,g as languageTerritory};
2
2
  //# sourceMappingURL=priceFormatting.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/helpers/priceFormatting.ts"],
4
- "sourcesContent": ["export const PRICE_SYMBOL = {\n us: '$',\n uk: '\u00A3',\n ca: '$',\n eu: '\u20AC',\n fr: '\u20AC',\n de: '\u20AC',\n nl: '\u20AC',\n vn: '\u20AB',\n cl: '$',\n sg: '$',\n ae: 'AED',\n} as any\n\nexport const languageTerritory = (locale: string) =>\n // https://unicode-org.github.io/cldr-staging/charts/37/supplemental/language_territory_information.html\n ({\n us: 'en-US',\n uk: 'en-GB',\n ca: 'en-CA',\n au: 'AU',\n 'eu-en': 'en',\n 'eu-fr': 'fr-FR',\n fr: 'FR',\n 'ca-fr': 'FR',\n 'nl-fr': 'FR',\n my: 'MY',\n it: 'IT',\n vn: 'VN',\n es: 'es-ES',\n 'eu-it': 'it-IT',\n 'eu-de': 'de-DE',\n de: 'de-DE',\n 'eu-es': 'es-ES',\n 'cz-en': 'en-CZ',\n nl: 'nl-NL',\n 'dk-en': 'en-DK',\n 'gr-en': 'en-GR',\n 'mk-en': 'en-MK',\n 'hu-en': 'en-HU',\n 'se-en': 'en-SE',\n 'hr-en': 'en-HR',\n 'bg-en': 'en-BG',\n 'ee-en': 'en-EE',\n 'fi-en': 'en-FI',\n 'lt-en': 'en-LT',\n pl: 'pl-PL',\n 'ro-en': 'en-RO',\n 'si-en': 'en-SI',\n 'sk-en': 'en-SK',\n 'no-en': 'en-NO',\n 'ad-en': 'en-AD',\n 'al-en': 'en-AL',\n 'ba-en': 'en-BA',\n 'me-en': 'en-ME',\n 'rs-en': 'en-RS',\n 'gl-en': 'en-GL',\n 'is-en': 'en-IS',\n 'ua-en': 'en-UA',\n 'by-en': 'en-BY',\n 'md-en': 'en-MD',\n 'lv-en': 'en-LV',\n 'at-de': 'de-AT',\n 'lu-de': 'de-LU',\n 'li-de': 'de-LI',\n 'va-it': 'it-VA',\n 'sm-it': 'it-SM',\n 'be-nl': 'nl-BE',\n 'ae-en': 'en-AE',\n nz: 'en-NZ',\n 'sg-en': 'en-SG',\n 'sa-en': 'en-SA',\n 'vn-vi': 'vi-VN',\n ie: 'en-IE',\n tw: 'zh-TW',\n })[locale] || ''\n\nexport function formatPrice({\n amount,\n currencyCode,\n locale,\n maximumFractionDigits,\n minimumFractionDigits,\n removeTrailingZeros = false,\n currencyDisplay = 'symbol',\n}: {\n amount: number\n currencyCode: string\n locale: string\n maximumFractionDigits?: number\n minimumFractionDigits?: number\n removeTrailingZeros?: boolean\n currencyDisplay?: Intl.NumberFormatOptions['currencyDisplay']\n}) {\n const code = locale === 'nl' ? 'EUR' : currencyCode || 'USD'\n const localeLanguage = languageTerritory(locale)\n if (!localeLanguage) {\n return null\n }\n const formatCurrency = new Intl.NumberFormat(localeLanguage, {\n style: 'currency',\n currency: code,\n currencyDisplay: currencyDisplay,\n minimumFractionDigits: maximumFractionDigits === 0 ? 0 : minimumFractionDigits,\n maximumFractionDigits,\n })\n\n let formattedValue = formatCurrency?.format?.(amount)\n\n if (['eu-de', 'eu-en', 'de', 'eu'].includes(locale)) {\n formattedValue = formattedValue?.toString()?.replace?.(/[\\s]/g, '')\n }\n\n if (removeTrailingZeros) {\n formattedValue = formattedValue\n ?.replace?.(/(\\.\\d*?[1-9])0+\\b/, '$1')\n ?.replace?.(/\\.0+\\b/, '')\n ?.replace?.(/(,\\d*?[1-9])0+\\b/, '$1')\n ?.replace?.(/,0+\\b/, '')\n }\n\n return formattedValue\n}\n"],
5
- "mappings": "AAAO,MAAMA,EAAe,CAC1B,GAAI,IACJ,GAAI,OACJ,GAAI,IACJ,GAAI,SACJ,GAAI,SACJ,GAAI,SACJ,GAAI,SACJ,GAAI,SACJ,GAAI,IACJ,GAAI,IACJ,GAAI,KACN,EAEaC,EAAqBC,IAE/B,CACC,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,GAAI,KACJ,QAAS,KACT,QAAS,QACT,GAAI,KACJ,QAAS,KACT,QAAS,KACT,GAAI,KACJ,GAAI,KACJ,GAAI,KACJ,GAAI,QACJ,QAAS,QACT,QAAS,QACT,GAAI,QACJ,QAAS,QACT,QAAS,QACT,GAAI,QACJ,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,GAAI,QACJ,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,GAAI,QACJ,QAAS,QACT,QAAS,QACT,QAAS,QACT,GAAI,QACJ,GAAI,OACN,GAAGA,CAAM,GAAK,GAET,SAASC,EAAY,CAC1B,OAAAC,EACA,aAAAC,EACA,OAAAH,EACA,sBAAAI,EACA,sBAAAC,EACA,oBAAAC,EAAsB,GACtB,gBAAAC,EAAkB,QACpB,EAQG,CACD,MAAMC,EAAOR,IAAW,KAAO,MAAQG,GAAgB,MACjDM,EAAiBV,EAAkBC,CAAM,EAC/C,GAAI,CAACS,EACH,OAAO,KAUT,IAAIC,EARmB,IAAI,KAAK,aAAaD,EAAgB,CAC3D,MAAO,WACP,SAAUD,EACV,gBAAiBD,EACjB,sBAAuBH,IAA0B,EAAI,EAAIC,EACzD,sBAAAD,CACF,CAAC,GAEoC,SAASF,CAAM,EAEpD,MAAI,CAAC,QAAS,QAAS,KAAM,IAAI,EAAE,SAASF,CAAM,IAChDU,EAAiBA,GAAgB,SAAS,GAAG,UAAU,QAAS,EAAE,GAGhEJ,IACFI,EAAiBA,GACb,UAAU,oBAAqB,IAAI,GACnC,UAAU,SAAU,EAAE,GACtB,UAAU,mBAAoB,IAAI,GAClC,UAAU,QAAS,EAAE,GAGpBA,CACT",
6
- "names": ["PRICE_SYMBOL", "languageTerritory", "locale", "formatPrice", "amount", "currencyCode", "maximumFractionDigits", "minimumFractionDigits", "removeTrailingZeros", "currencyDisplay", "code", "localeLanguage", "formattedValue"]
4
+ "sourcesContent": ["export const PRICE_SYMBOL = {\n us: '$',\n uk: '\u00A3',\n ca: '$',\n eu: '\u20AC',\n fr: '\u20AC',\n de: '\u20AC',\n nl: '\u20AC',\n vn: '\u20AB',\n cl: '$',\n sg: '$',\n ae: 'AED',\n} as any\n\nconst BUILTIN_LOCALE_MAP: Record<string, string> = {\n // https://unicode-org.github.io/cldr-staging/charts/37/supplemental/language_territory_information.html\n us: 'en-US',\n uk: 'en-GB',\n ca: 'en-CA',\n au: 'AU',\n 'eu-en': 'en',\n 'eu-fr': 'fr-FR',\n fr: 'FR',\n 'ca-fr': 'FR',\n 'nl-fr': 'FR',\n my: 'MY',\n it: 'IT',\n vn: 'VN',\n es: 'es-ES',\n 'eu-it': 'it-IT',\n 'eu-de': 'de-DE',\n de: 'de-DE',\n 'eu-es': 'es-ES',\n 'cz-en': 'en-CZ',\n nl: 'nl-NL',\n 'dk-en': 'en-DK',\n 'gr-en': 'en-GR',\n 'mk-en': 'en-MK',\n 'hu-en': 'en-HU',\n 'se-en': 'en-SE',\n 'hr-en': 'en-HR',\n 'bg-en': 'en-BG',\n 'ee-en': 'en-EE',\n 'fi-en': 'en-FI',\n 'lt-en': 'en-LT',\n pl: 'pl-PL',\n 'ro-en': 'en-RO',\n 'si-en': 'en-SI',\n 'sk-en': 'en-SK',\n 'no-en': 'en-NO',\n 'ad-en': 'en-AD',\n 'al-en': 'en-AL',\n 'ba-en': 'en-BA',\n 'me-en': 'en-ME',\n 'rs-en': 'en-RS',\n 'gl-en': 'en-GL',\n 'is-en': 'en-IS',\n 'ua-en': 'en-UA',\n 'by-en': 'en-BY',\n 'md-en': 'en-MD',\n 'lv-en': 'en-LV',\n 'at-de': 'de-AT',\n 'lu-de': 'de-LU',\n 'li-de': 'de-LI',\n 'va-it': 'it-VA',\n 'sm-it': 'it-SM',\n 'be-nl': 'nl-BE',\n 'ae-en': 'en-AE',\n nz: 'en-NZ',\n 'sg-en': 'en-SG',\n 'sa-en': 'en-SA',\n 'vn-vi': 'vi-VN',\n ie: 'en-IE',\n tw: 'zh-TW',\n}\n\nlet _extraLocaleMap: Record<string, string> = {}\nlet _mergedLocaleMap: Record<string, string> = BUILTIN_LOCALE_MAP\n\n/**\n * \u6CE8\u5165\u81EA\u5B9A\u4E49 locale \u2192 BCP47 \u6620\u5C04\uFF0C\u4E0E\u5185\u7F6E map merge\uFF08\u5916\u90E8\u4F18\u5148\u7EA7\u66F4\u9AD8\uFF09\u3002\n * \u7531 AiuiProvider \u5728\u6302\u8F7D\u65F6\u8C03\u7528\uFF0C\u6D88\u8D39\u65B9\u65E0\u9700\u4FEE\u6539 headless-ui \u6E90\u7801\u5373\u53EF\u652F\u6301\u65B0 locale\u3002\n */\nexport const extendLocaleMap = (map: Record<string, string>) => {\n _extraLocaleMap = { ..._extraLocaleMap, ...map }\n _mergedLocaleMap = { ...BUILTIN_LOCALE_MAP, ..._extraLocaleMap }\n}\n\nexport const languageTerritory = (locale: string) => {\n return _mergedLocaleMap[locale] || ''\n}\n\nexport function formatPrice({\n amount,\n currencyCode,\n locale,\n maximumFractionDigits,\n minimumFractionDigits,\n removeTrailingZeros = false,\n currencyDisplay = 'symbol',\n}: {\n amount: number\n currencyCode: string\n locale: string\n maximumFractionDigits?: number\n minimumFractionDigits?: number\n removeTrailingZeros?: boolean\n currencyDisplay?: Intl.NumberFormatOptions['currencyDisplay']\n}) {\n const code = locale === 'nl' ? 'EUR' : currencyCode || 'USD'\n const localeLanguage = languageTerritory(locale)\n if (!localeLanguage) {\n return null\n }\n const formatCurrency = new Intl.NumberFormat(localeLanguage, {\n style: 'currency',\n currency: code,\n currencyDisplay: currencyDisplay,\n minimumFractionDigits: maximumFractionDigits === 0 ? 0 : minimumFractionDigits,\n maximumFractionDigits,\n })\n\n let formattedValue = formatCurrency?.format?.(amount)\n\n if (['eu-de', 'eu-en', 'de', 'eu'].includes(locale)) {\n formattedValue = formattedValue?.toString()?.replace?.(/[\\s]/g, '')\n }\n\n if (removeTrailingZeros) {\n formattedValue = formattedValue\n ?.replace?.(/(\\.\\d*?[1-9])0+\\b/, '$1')\n ?.replace?.(/\\.0+\\b/, '')\n ?.replace?.(/(,\\d*?[1-9])0+\\b/, '$1')\n ?.replace?.(/,0+\\b/, '')\n }\n\n return formattedValue\n}\n"],
5
+ "mappings": "AAAO,MAAMA,EAAe,CAC1B,GAAI,IACJ,GAAI,OACJ,GAAI,IACJ,GAAI,SACJ,GAAI,SACJ,GAAI,SACJ,GAAI,SACJ,GAAI,SACJ,GAAI,IACJ,GAAI,IACJ,GAAI,KACN,EAEMC,EAA6C,CAEjD,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,GAAI,KACJ,QAAS,KACT,QAAS,QACT,GAAI,KACJ,QAAS,KACT,QAAS,KACT,GAAI,KACJ,GAAI,KACJ,GAAI,KACJ,GAAI,QACJ,QAAS,QACT,QAAS,QACT,GAAI,QACJ,QAAS,QACT,QAAS,QACT,GAAI,QACJ,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,GAAI,QACJ,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,QAAS,QACT,GAAI,QACJ,QAAS,QACT,QAAS,QACT,QAAS,QACT,GAAI,QACJ,GAAI,OACN,EAEA,IAAIC,EAA0C,CAAC,EAC3CC,EAA2CF,EAMxC,MAAMG,EAAmBC,GAAgC,CAC9DH,EAAkB,CAAE,GAAGA,EAAiB,GAAGG,CAAI,EAC/CF,EAAmB,CAAE,GAAGF,EAAoB,GAAGC,CAAgB,CACjE,EAEaI,EAAqBC,GACzBJ,EAAiBI,CAAM,GAAK,GAG9B,SAASC,EAAY,CAC1B,OAAAC,EACA,aAAAC,EACA,OAAAH,EACA,sBAAAI,EACA,sBAAAC,EACA,oBAAAC,EAAsB,GACtB,gBAAAC,EAAkB,QACpB,EAQG,CACD,MAAMC,EAAOR,IAAW,KAAO,MAAQG,GAAgB,MACjDM,EAAiBV,EAAkBC,CAAM,EAC/C,GAAI,CAACS,EACH,OAAO,KAUT,IAAIC,EARmB,IAAI,KAAK,aAAaD,EAAgB,CAC3D,MAAO,WACP,SAAUD,EACV,gBAAiBD,EACjB,sBAAuBH,IAA0B,EAAI,EAAIC,EACzD,sBAAAD,CACF,CAAC,GAEoC,SAASF,CAAM,EAEpD,MAAI,CAAC,QAAS,QAAS,KAAM,IAAI,EAAE,SAASF,CAAM,IAChDU,EAAiBA,GAAgB,SAAS,GAAG,UAAU,QAAS,EAAE,GAGhEJ,IACFI,EAAiBA,GACb,UAAU,oBAAqB,IAAI,GACnC,UAAU,SAAU,EAAE,GACtB,UAAU,mBAAoB,IAAI,GAClC,UAAU,QAAS,EAAE,GAGpBA,CACT",
6
+ "names": ["PRICE_SYMBOL", "BUILTIN_LOCALE_MAP", "_extraLocaleMap", "_mergedLocaleMap", "extendLocaleMap", "map", "languageTerritory", "locale", "formatPrice", "amount", "currencyCode", "maximumFractionDigits", "minimumFractionDigits", "removeTrailingZeros", "currencyDisplay", "code", "localeLanguage", "formattedValue"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anker-in/headless-ui",
3
- "version": "1.3.22",
3
+ "version": "1.3.23",
4
4
  "type": "commonjs",
5
5
  "main": "./dist/cjs/index.js",
6
6
  "types": "./dist/cjs/index.d.ts",