@youidian/sdk 3.4.2 → 3.4.4
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.
- package/dist/client.cjs +2 -2
- package/dist/client.cjs.map +1 -1
- package/dist/client.js +2 -2
- package/dist/client.js.map +1 -1
- package/dist/index.cjs +33 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +33 -2
- package/dist/index.js.map +1 -1
- package/dist/login.cjs +1 -1
- package/dist/login.cjs.map +1 -1
- package/dist/login.js +1 -1
- package/dist/login.js.map +1 -1
- package/dist/server.cjs +31 -0
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.cts +38 -1
- package/dist/server.d.ts +38 -1
- package/dist/server.js +31 -0
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
package/dist/client.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts","../src/brand-logo.ts","../src/hosted-modal.ts","../src/environment.ts","../src/login.ts"],"sourcesContent":["/**\n * Youidian Payment SDK - Client Module\n * 用于浏览器端集成,包含支付弹窗、状态轮询等功能\n * 不依赖 Node.js crypto 模块\n */\n\nimport { createSdkBrandLogo } from \"./brand-logo\"\nimport {\n\tapplyLocaleToUrl,\n\tgetAutoResolvedLocale,\n\tHostedFrameModal,\n} from \"./hosted-modal\"\n\n/**\n * Payment event types from checkout pages\n */\nexport type PaymentEventType =\n\t| \"PAYMENT_READY\"\n\t| \"PAYMENT_SUCCESS\"\n\t| \"PAYMENT_CANCELLED\"\n\t| \"PAYMENT_CLOSE\"\n\t| \"PAYMENT_RESIZE\"\n\t| \"PAYMENT_STARTED\"\n\n/**\n * Payment event data from postMessage\n */\nexport interface PaymentEventData {\n\ttype: PaymentEventType\n\torderId?: string\n\theight?: number\n}\n\n/**\n * Order status response\n */\nexport interface OrderStatus {\n\torderId: string\n\tstatus: \"PENDING\" | \"PAID\" | \"CANCELLED\" | \"REFUNDED\" | \"FAILED\"\n\tpaidAt?: string\n\tchannelTransactionId?: string\n}\n\nexport interface PaymentUIThemeColors {\n\tprimary?: string\n\tsecondary?: string\n\tforeground?: string\n\tmuted?: string\n\tsurface?: string\n}\n\n/**\n * Payment UI Options\n */\nexport interface PaymentUIOptions {\n\tlocale?: string\n\tonSuccess?: (orderId?: string) => void\n\tonCancel?: (orderId?: string) => void\n\tonClose?: () => void\n\tonFallbackBlocked?: (url: string) => void\n\tonFallbackOpen?: (url: string) => void\n\tonFallbackVisible?: () => void\n\t/** Origin to validate postMessage (defaults to '*', set for security) */\n\tallowedOrigin?: string\n\t/** Theme colors for SDK fallback/loading chrome. Defaults to Youidian green. */\n\ttheme?: PaymentUIThemeColors\n\t/** Text for the fallback button shown when the checkout iframe is slow. */\n\tfallbackButtonText?: string\n\t/** Text for retrying the embedded checkout iframe. */\n\tfallbackRetryText?: string\n\t/** How long to wait for PAYMENT_READY or PAYMENT_RESIZE. Defaults to 8000ms. */\n\tiframeLoadTimeoutMs?: number\n\t/** Description shown while the hosted checkout iframe is loading. */\n\tloadingDescription?: string\n\t/** Title shown while the hosted checkout iframe is loading. */\n\tloadingTitle?: string\n}\n\nconst DEFAULT_PAYMENT_IFRAME_LOAD_TIMEOUT_MS = 8000\nconst PAYMENT_UI_LOG_PREFIX = \"[Youidian PaymentUI]\"\n\ntype ResolvedPaymentTheme = {\n\tforeground: string\n\tmuted: string\n\tprimary: string\n\tprimary10: string\n\tprimary14: string\n\tprimary20: string\n\tprimary28: string\n\tprimary36: string\n\tprimary64: string\n\tsecondary: string\n\tsurface: string\n}\n\nfunction hexToRgb(value: string) {\n\tconst normalized = value.trim().replace(/^#/, \"\")\n\tif (!/^[0-9a-f]{3}([0-9a-f]{3})?$/i.test(normalized)) return null\n\tconst hex =\n\t\tnormalized.length === 3\n\t\t\t? normalized\n\t\t\t\t\t.split(\"\")\n\t\t\t\t\t.map((char) => `${char}${char}`)\n\t\t\t\t\t.join(\"\")\n\t\t\t: normalized\n\tconst number = Number.parseInt(hex, 16)\n\treturn {\n\t\tb: number & 255,\n\t\tg: (number >> 8) & 255,\n\t\tr: (number >> 16) & 255,\n\t}\n}\n\nfunction alphaColor(value: string, alpha: number) {\n\tconst rgb = hexToRgb(value)\n\tif (!rgb)\n\t\treturn `color-mix(in srgb, ${value} ${Math.round(alpha * 100)}%, transparent)`\n\treturn `rgba(${rgb.r},${rgb.g},${rgb.b},${alpha})`\n}\n\nfunction resolvePaymentTheme(options?: PaymentUIOptions): ResolvedPaymentTheme {\n\tconst primary = options?.theme?.primary || \"#16a34a\"\n\tconst secondary =\n\t\toptions?.theme?.secondary || \"color-mix(in srgb, #16a34a 78%, white)\"\n\tconst foreground = options?.theme?.foreground || \"#0f172a\"\n\tconst muted = options?.theme?.muted || \"#64748b\"\n\tconst surface = options?.theme?.surface || \"#ffffff\"\n\n\treturn {\n\t\tforeground,\n\t\tmuted,\n\t\tprimary,\n\t\tprimary10: alphaColor(primary, 0.1),\n\t\tprimary14: alphaColor(primary, 0.14),\n\t\tprimary20: alphaColor(primary, 0.2),\n\t\tprimary28: alphaColor(primary, 0.28),\n\t\tprimary36: alphaColor(primary, 0.36),\n\t\tprimary64: alphaColor(primary, 0.64),\n\t\tsecondary,\n\t\tsurface,\n\t}\n}\n\nfunction logPaymentInfo(message: string, details?: Record<string, unknown>) {\n\tif (typeof console === \"undefined\") return\n\tconsole.info(PAYMENT_UI_LOG_PREFIX, message, details || {})\n}\n\nfunction logPaymentWarn(message: string, details?: Record<string, unknown>) {\n\tif (typeof console === \"undefined\") return\n\tconsole.warn(PAYMENT_UI_LOG_PREFIX, message, details || {})\n}\n\nfunction getPaymentIframeLoadTimeoutMs(options?: PaymentUIOptions) {\n\tconst timeout = options?.iframeLoadTimeoutMs\n\tif (typeof timeout !== \"number\" || !Number.isFinite(timeout)) {\n\t\treturn DEFAULT_PAYMENT_IFRAME_LOAD_TIMEOUT_MS\n\t}\n\treturn Math.max(0, timeout)\n}\n\nfunction isChinesePaymentLocale(locale?: string) {\n\treturn locale?.toLowerCase().startsWith(\"zh\") || false\n}\n\nfunction getPaymentFallbackText(options?: PaymentUIOptions) {\n\tconst isChinese = isChinesePaymentLocale(options?.locale)\n\treturn {\n\t\tbuttonText:\n\t\t\toptions?.fallbackButtonText ||\n\t\t\t(isChinese ? \"在新页面中打开\" : \"Open in new page\"),\n\t\tdescription: isChinese\n\t\t\t? \"当前网络可能较慢,建议重新尝试或在新页面中打开,以获得更流畅的支付体验。\"\n\t\t\t: \"Your network may be slow. Try again or open the payment page in a new page to continue.\",\n\t\tretryText:\n\t\t\toptions?.fallbackRetryText || (isChinese ? \"重新尝试\" : \"Try again\"),\n\t\ttitle: isChinese ? \"支付页面打开较慢\" : \"Payment page is taking longer\",\n\t}\n}\n\nfunction getPaymentBrandText(options?: PaymentUIOptions) {\n\tconst isChinese = isChinesePaymentLocale(options?.locale)\n\treturn {\n\t\tlanguage: isChinese ? \"zh\" : \"en\",\n\t\tname: isChinese ? \"优易点\" : \"Youidian\",\n\t\tsubtitle: isChinese ? \"开发者服务平台\" : \"Developer Service Platform\",\n\t}\n}\n\nfunction getPaymentBrandLoadingText(options?: PaymentUIOptions) {\n\tconst isChinese = isChinesePaymentLocale(options?.locale)\n\treturn {\n\t\tlanguage: isChinese ? \"zh\" : \"en\",\n\t\tname: isChinese ? \"优易点\" : \"Youidian\",\n\t\tsubtitle: isChinese ? \"开发者服务中台\" : \"Developer Service\",\n\t}\n}\n\nfunction getPaymentLoadingText(options?: PaymentUIOptions) {\n\tconst isChinese = isChinesePaymentLocale(options?.locale)\n\treturn (\n\t\toptions?.loadingTitle ||\n\t\toptions?.loadingDescription ||\n\t\t(isChinese ? \"加载中...\" : \"Loading...\")\n\t)\n}\n\nfunction applyPaymentPanelStyle(\n\tpanel: HTMLDivElement,\n\ttheme: ResolvedPaymentTheme,\n) {\n\tObject.assign(panel.style, {\n\t\tposition: \"absolute\",\n\t\tinset: \"0\",\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tjustifyContent: \"center\",\n\t\tborderRadius: \"28px\",\n\t\tbackground: `linear-gradient(180deg, ${theme.surface} 0%, rgba(248,250,252,0.98) 100%)`,\n\t\tcolor: theme.foreground,\n\t\tpadding: \"28px 24px\",\n\t\ttextAlign: \"center\",\n\t\tzIndex: \"1\",\n\t\tboxShadow: \"none\",\n\t\tbackdropFilter: \"blur(16px)\",\n\t})\n}\n\nfunction createPaymentIcon(type: \"external\" | \"refresh\" | \"slow\") {\n\tconst svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\")\n\tsvg.setAttribute(\"viewBox\", \"0 0 24 24\")\n\tsvg.setAttribute(\"fill\", \"none\")\n\tsvg.setAttribute(\"aria-hidden\", \"true\")\n\tObject.assign(svg.style, {\n\t\tdisplay: \"block\",\n\t\tflex: \"0 0 auto\",\n\t})\n\n\tconst paths =\n\t\ttype === \"external\"\n\t\t\t? [\n\t\t\t\t\t\"M7 17L17 7\",\n\t\t\t\t\t\"M10 7H17V14\",\n\t\t\t\t\t\"M6.5 6.5H5.5A2.5 2.5 0 0 0 3 9V18.5A2.5 2.5 0 0 0 5.5 21H15A2.5 2.5 0 0 0 17.5 18.5V17.5\",\n\t\t\t\t]\n\t\t\t: type === \"refresh\"\n\t\t\t\t? [\n\t\t\t\t\t\t\"M20 6V11H15\",\n\t\t\t\t\t\t\"M4 18V13H9\",\n\t\t\t\t\t\t\"M18.2 9A7 7 0 0 0 6.2 6.6L4 9\",\n\t\t\t\t\t\t\"M5.8 15A7 7 0 0 0 17.8 17.4L20 15\",\n\t\t\t\t\t]\n\t\t\t\t: [\"M12 7V12L15 14\", \"M21 12A9 9 0 1 1 3 12A9 9 0 0 1 21 12\"]\n\n\tfor (const value of paths) {\n\t\tconst path = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\")\n\t\tpath.setAttribute(\"d\", value)\n\t\tpath.setAttribute(\"stroke\", \"currentColor\")\n\t\tpath.setAttribute(\"stroke-width\", \"2\")\n\t\tpath.setAttribute(\"stroke-linecap\", \"round\")\n\t\tpath.setAttribute(\"stroke-linejoin\", \"round\")\n\t\tsvg.appendChild(path)\n\t}\n\n\treturn svg\n}\n\nfunction createPaymentFallbackArtwork(theme: ResolvedPaymentTheme) {\n\tconst artwork = document.createElement(\"div\")\n\tObject.assign(artwork.style, {\n\t\theight: \"164px\",\n\t\tmargin: \"0 auto 34px\",\n\t\tposition: \"relative\",\n\t\twidth: \"184px\",\n\t})\n\n\tconst wash = document.createElement(\"div\")\n\tObject.assign(wash.style, {\n\t\tposition: \"absolute\",\n\t\tleft: \"16px\",\n\t\ttop: \"20px\",\n\t\twidth: \"152px\",\n\t\theight: \"126px\",\n\t\tborderRadius: \"48% 52% 43% 57% / 54% 42% 58% 46%\",\n\t\tbackground: `radial-gradient(circle at 48% 42%, ${theme.primary20}, ${theme.primary10} 52%, transparent 76%)`,\n\t\tfilter: \"blur(1px)\",\n\t\ttransform: \"rotate(-10deg)\",\n\t})\n\n\tconst blob = document.createElement(\"div\")\n\tObject.assign(blob.style, {\n\t\tposition: \"absolute\",\n\t\tleft: \"26px\",\n\t\ttop: \"28px\",\n\t\twidth: \"132px\",\n\t\theight: \"116px\",\n\t\tborderRadius: \"42% 58% 53% 47% / 45% 39% 61% 55%\",\n\t\tbackground: `linear-gradient(150deg, ${theme.primary14}, ${theme.primary10})`,\n\t\tboxShadow: `0 30px 64px ${theme.primary14}`,\n\t\ttransform: \"rotate(8deg)\",\n\t})\n\n\tconst tile = document.createElement(\"div\")\n\tObject.assign(tile.style, {\n\t\tposition: \"absolute\",\n\t\tleft: \"50%\",\n\t\ttop: \"50%\",\n\t\ttransform: \"translate(-50%, -50%) rotate(-4deg)\",\n\t\twidth: \"112px\",\n\t\theight: \"106px\",\n\t\tborderRadius: \"38% 62% 50% 50% / 44% 43% 57% 56%\",\n\t\tbackground: `linear-gradient(145deg, ${theme.primary}, ${theme.secondary})`,\n\t\tborder: `1px solid ${theme.primary36}`,\n\t\tcolor: \"#ffffff\",\n\t\tdisplay: \"inline-flex\",\n\t\talignItems: \"center\",\n\t\tjustifyContent: \"center\",\n\t\tboxShadow: `0 26px 54px ${theme.primary28}`,\n\t})\n\tconst icon = createPaymentIcon(\"slow\")\n\tObject.assign(icon.style, {\n\t\twidth: \"52px\",\n\t\theight: \"52px\",\n\t\ttransform: \"rotate(4deg)\",\n\t})\n\ttile.appendChild(icon)\n\n\tartwork.appendChild(wash)\n\tartwork.appendChild(blob)\n\tartwork.appendChild(tile)\n\treturn artwork\n}\n\nfunction createPaymentBrandLoading(\n\toptions: PaymentUIOptions | undefined,\n\ttheme: ResolvedPaymentTheme,\n) {\n\tconst brand = getPaymentBrandLoadingText(options)\n\tconst wrapper = document.createElement(\"div\")\n\tObject.assign(wrapper.style, {\n\t\tdisplay: \"flex\",\n\t\tflexDirection: \"column\",\n\t\talignItems: \"center\",\n\t\tjustifyContent: \"center\",\n\t\tmargin: \"0 auto 16px\",\n\t})\n\n\twrapper.appendChild(\n\t\tcreateSdkBrandLogo({\n\t\t\tanimated: true,\n\t\t\tbrand,\n\t\t\tbrandWidth: 292,\n\t\t\tcopyWidth: 176,\n\t\t\tgap: 6,\n\t\t\tmarkMarginRight: -10,\n\t\t\tmarkSize: 112,\n\t\t\tnameSize: 39,\n\t\t\tsubtitleMarginTop: 8,\n\t\t\tsubtitleSize: 14,\n\t\t\tsubtitleWeight: \"700\",\n\t\t\ttheme,\n\t\t\tvariant: \"brand\",\n\t\t}),\n\t)\n\treturn wrapper\n}\n\nfunction createPaymentPlatformLogo(\n\toptions: PaymentUIOptions | undefined,\n\ttheme: ResolvedPaymentTheme,\n) {\n\tconst brand = getPaymentBrandText(options)\n\tconst wrapper = document.createElement(\"div\")\n\tObject.assign(wrapper.style, {\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tjustifyContent: \"center\",\n\t\tmargin: \"0 auto 10px\",\n\t})\n\twrapper.appendChild(\n\t\tcreateSdkBrandLogo({\n\t\t\tbrand,\n\t\t\tmarkSize: 48,\n\t\t\tnameSize: brand.language === \"zh\" ? 22 : 22,\n\t\t\tsubtitleSize: brand.language === \"zh\" ? 9 : 9,\n\t\t\ttheme,\n\t\t}),\n\t)\n\treturn wrapper\n}\n\nfunction createPaymentPanelContent() {\n\tconst content = document.createElement(\"div\")\n\tObject.assign(content.style, {\n\t\tdisplay: \"flex\",\n\t\tflexDirection: \"column\",\n\t\tjustifyContent: \"center\",\n\t\tmaxWidth: \"364px\",\n\t\tminHeight: \"100%\",\n\t\twidth: \"100%\",\n\t})\n\n\treturn content\n}\n\nfunction createPaymentPanelTitle(value: string, theme?: ResolvedPaymentTheme) {\n\tconst title = document.createElement(\"div\")\n\ttitle.textContent = value\n\tObject.assign(title.style, {\n\t\tcolor: theme?.foreground || \"#0f172a\",\n\t\tfontSize: \"24px\",\n\t\tfontWeight: \"900\",\n\t\tlineHeight: \"1.22\",\n\t\tmarginBottom: \"16px\",\n\t})\n\treturn title\n}\n\nfunction createPaymentPanelDescription(\n\tvalue: string,\n\ttheme?: ResolvedPaymentTheme,\n) {\n\tconst description = document.createElement(\"div\")\n\tdescription.textContent = value\n\tObject.assign(description.style, {\n\t\tcolor: theme?.muted || \"#64748b\",\n\t\tfontSize: \"14px\",\n\t\tfontWeight: \"600\",\n\t\tlineHeight: \"1.62\",\n\t\tmargin: \"0 auto\",\n\t\tmaxWidth: \"320px\",\n\t})\n\treturn description\n}\n\nfunction createPaymentLoadingDescription(\n\tvalue: string,\n\ttheme?: ResolvedPaymentTheme,\n) {\n\tconst description = document.createElement(\"div\")\n\tdescription.textContent = value\n\tObject.assign(description.style, {\n\t\tcolor: theme?.muted || \"#64748b\",\n\t\tfontSize: \"14px\",\n\t\tfontWeight: \"500\",\n\t\tlineHeight: \"1.25\",\n\t\tmargin: \"12px auto 0\",\n\t\tmaxWidth: \"320px\",\n\t})\n\treturn description\n}\n\nfunction createPaymentFallbackMessage(options: {\n\tdescription: string\n\ttheme: ResolvedPaymentTheme\n\ttitle: string\n}) {\n\tconst message = document.createElement(\"div\")\n\tObject.assign(message.style, {\n\t\tmargin: \"0 auto\",\n\t\ttextAlign: \"center\",\n\t})\n\tmessage.appendChild(createPaymentFallbackArtwork(options.theme))\n\tmessage.appendChild(createPaymentPanelTitle(options.title, options.theme))\n\tmessage.appendChild(\n\t\tcreatePaymentPanelDescription(options.description, options.theme),\n\t)\n\treturn message\n}\n\nfunction createPaymentLoadingPanel(options?: PaymentUIOptions) {\n\tconst panel = document.createElement(\"div\")\n\tconst theme = resolvePaymentTheme(options)\n\tapplyPaymentPanelStyle(panel, theme)\n\n\tconst content = createPaymentPanelContent()\n\tcontent.appendChild(createPaymentBrandLoading(options, theme))\n\tcontent.appendChild(\n\t\tcreatePaymentLoadingDescription(getPaymentLoadingText(options), theme),\n\t)\n\tpanel.appendChild(content)\n\treturn panel\n}\n\nfunction createPaymentButton(\n\tvalue: string,\n\toptions?: {\n\t\ticon?: \"external\" | \"refresh\"\n\t\tprimary?: boolean\n\t\ttheme?: ResolvedPaymentTheme\n\t},\n) {\n\tconst primary = options?.primary || false\n\tconst theme = options?.theme || resolvePaymentTheme()\n\tconst button = document.createElement(\"button\")\n\tbutton.type = \"button\"\n\tObject.assign(button.style, {\n\t\twidth: \"100%\",\n\t\theight: \"50px\",\n\t\tborderRadius: \"14px\",\n\t\tborder: primary\n\t\t\t? `1px solid ${theme.primary}`\n\t\t\t: `1px solid ${theme.primary64}`,\n\t\tbackground: primary\n\t\t\t? `linear-gradient(135deg, ${theme.primary}, ${theme.secondary})`\n\t\t\t: \"#ffffff\",\n\t\tcolor: primary ? \"#ffffff\" : theme.primary,\n\t\tcursor: \"pointer\",\n\t\tdisplay: \"inline-flex\",\n\t\talignItems: \"center\",\n\t\tjustifyContent: \"center\",\n\t\tgap: \"10px\",\n\t\tfontSize: \"15px\",\n\t\tfontWeight: \"800\",\n\t\tmarginTop: primary ? \"12px\" : \"0\",\n\t\tboxShadow: primary ? `0 14px 28px ${theme.primary20}` : \"none\",\n\t})\n\tif (options?.icon) {\n\t\tconst icon = createPaymentIcon(options.icon)\n\t\tObject.assign(icon.style, {\n\t\t\twidth: \"17px\",\n\t\t\theight: \"17px\",\n\t\t})\n\t\tbutton.appendChild(icon)\n\t}\n\tconst label = document.createElement(\"span\")\n\tlabel.textContent = value\n\tbutton.appendChild(label)\n\treturn button\n}\n\nfunction createPaymentFallbackPanel(options: {\n\tbuttonText: string\n\tdescription: string\n\tpaymentOptions?: PaymentUIOptions\n\tonOpen: () => void\n\tonRetry: () => void\n\tretryText: string\n\ttitle: string\n}) {\n\tconst panel = document.createElement(\"div\")\n\tconst theme = resolvePaymentTheme(options.paymentOptions)\n\tapplyPaymentPanelStyle(panel, theme)\n\n\tconst content = createPaymentPanelContent()\n\tObject.assign(content.style, {\n\t\tjustifyContent: \"space-between\",\n\t})\n\n\tconst main = document.createElement(\"div\")\n\tObject.assign(main.style, {\n\t\tdisplay: \"flex\",\n\t\tflexDirection: \"column\",\n\t\talignItems: \"center\",\n\t\tmarginTop: \"38px\",\n\t\twidth: \"100%\",\n\t})\n\tmain.appendChild(\n\t\tcreatePaymentFallbackMessage({\n\t\t\tdescription: options.description,\n\t\t\ttheme,\n\t\t\ttitle: options.title,\n\t\t}),\n\t)\n\n\tconst actions = document.createElement(\"div\")\n\tObject.assign(actions.style, {\n\t\tmarginTop: \"46px\",\n\t\twidth: \"100%\",\n\t})\n\n\tconst retryButton = createPaymentButton(options.retryText, {\n\t\ticon: \"refresh\",\n\t\ttheme,\n\t})\n\tretryButton.onclick = options.onRetry\n\tactions.appendChild(retryButton)\n\n\tconst openButton = createPaymentButton(options.buttonText, {\n\t\ticon: \"external\",\n\t\tprimary: true,\n\t\ttheme,\n\t})\n\topenButton.onclick = options.onOpen\n\tactions.appendChild(openButton)\n\n\tmain.appendChild(actions)\n\tcontent.appendChild(main)\n\tcontent.appendChild(createPaymentPlatformLogo(options.paymentOptions, theme))\n\tpanel.appendChild(content)\n\treturn panel\n}\n\n/**\n * Poll Options\n */\nexport interface PollOptions {\n\t/** Polling interval in ms (default: 3000) */\n\tinterval?: number\n\t/** Timeout in ms (default: 300000 = 5 minutes) */\n\ttimeout?: number\n\t/** Callback on each status check */\n\tonStatusChange?: (status: OrderStatus) => void\n}\n\n/**\n * Client-side Payment UI Helper\n * 浏览器端支付 UI 辅助类,用于弹出支付窗口和轮询订单状态\n */\n/**\n * Params for opening payment directly without manual URL construction\n */\nexport interface PaymentParams {\n\tappId: string\n\tuserId?: string\n\t/** Existing Youidian order ID - opens checkout for an already-created order */\n\torderId?: string\n\t/** Product ID - use with priceId for direct ID-based payment */\n\tproductId?: string\n\t/** Price ID - use with productId for direct ID-based payment */\n\tpriceId?: string\n\t/** Product code - use with locale for code-based payment (alternative to productId/priceId) */\n\tproductCode?: string\n\t/** Optional custom recharge amount in the smallest currency unit */\n\tcustomAmount?: {\n\t\tamount: number\n\t\tcurrency: string\n\t}\n\n\t/**\n\t * @deprecated Use checkoutUrl instead\n\t * Defaults to https://pay.imgto.link\n\t */\n\tbaseUrl?: string\n\n\t/**\n\t * Checkout page URL (e.g. https://pay.youidian.com)\n\t * Defaults to https://pay.imgto.link\n\t */\n\tcheckoutUrl?: string\n}\n\n/**\n * Client-side Payment UI Helper\n * 浏览器端支付 UI 辅助类,用于弹出支付窗口和轮询订单状态\n */\nexport class PaymentUI extends HostedFrameModal<PaymentEventData> {\n\tprivate activeCheckoutAppId: string | null = null\n\tprivate activeCheckoutBaseUrl: string | null = null\n\tprivate activeOrderId: string | null = null\n\tprivate paymentCompleted = false\n\tprivate cancelRequestedOrderId: string | null = null\n\tprivate iframeFallbackPanel: HTMLDivElement | null = null\n\tprivate iframeLoadingPanel: HTMLDivElement | null = null\n\tprivate iframeLoadTimer: number | null = null\n\tprivate iframeReady = false\n\n\tprivate cleanupPaymentFrameState() {\n\t\tif (typeof window !== \"undefined\" && this.iframeLoadTimer) {\n\t\t\twindow.clearTimeout(this.iframeLoadTimer)\n\t\t}\n\t\tif (this.iframeFallbackPanel?.parentNode) {\n\t\t\tthis.iframeFallbackPanel.parentNode.removeChild(this.iframeFallbackPanel)\n\t\t}\n\t\tif (this.iframeLoadingPanel?.parentNode) {\n\t\t\tthis.iframeLoadingPanel.parentNode.removeChild(this.iframeLoadingPanel)\n\t\t}\n\t\tthis.iframeFallbackPanel = null\n\t\tthis.iframeLoadingPanel = null\n\t\tthis.iframeLoadTimer = null\n\t\tthis.iframeReady = false\n\t}\n\n\tprivate markPaymentIframeReady() {\n\t\tif (this.iframeReady) return\n\t\tthis.iframeReady = true\n\t\tif (typeof window !== \"undefined\" && this.iframeLoadTimer) {\n\t\t\twindow.clearTimeout(this.iframeLoadTimer)\n\t\t\tthis.iframeLoadTimer = null\n\t\t}\n\t\tif (this.iframeFallbackPanel?.parentNode) {\n\t\t\tthis.iframeFallbackPanel.parentNode.removeChild(this.iframeFallbackPanel)\n\t\t}\n\t\tif (this.iframeLoadingPanel?.parentNode) {\n\t\t\tthis.iframeLoadingPanel.parentNode.removeChild(this.iframeLoadingPanel)\n\t\t}\n\t\tthis.iframeFallbackPanel = null\n\t\tthis.iframeLoadingPanel = null\n\t}\n\n\tprivate showPaymentIframeLoading(\n\t\tcontainer: HTMLDivElement,\n\t\toptions?: PaymentUIOptions,\n\t) {\n\t\tif (this.iframeLoadingPanel || this.iframeReady) return\n\n\t\tconst panel = createPaymentLoadingPanel(options)\n\t\tthis.iframeLoadingPanel = panel\n\t\tcontainer.appendChild(panel)\n\t}\n\n\tprivate openFallbackPaymentPage(\n\t\tfinalUrl: string,\n\t\toptions?: PaymentUIOptions,\n\t) {\n\t\tif (typeof window === \"undefined\") return\n\n\t\tconst popup = window.open(\n\t\t\tfinalUrl,\n\t\t\t\"youidian-payment-checkout\",\n\t\t\t\"popup=yes,width=480,height=760,resizable=yes,scrollbars=yes\",\n\t\t)\n\t\tif (popup) {\n\t\t\tlogPaymentInfo(\"Opened hosted checkout fallback page\", {\n\t\t\t\tcheckoutUrl: finalUrl,\n\t\t\t})\n\t\t\toptions?.onFallbackOpen?.(finalUrl)\n\t\t\ttry {\n\t\t\t\tpopup.focus()\n\t\t\t} catch {\n\t\t\t\t// Ignore focus failures in restrictive browsers.\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tlogPaymentWarn(\"Hosted checkout fallback popup was blocked\", {\n\t\t\tcheckoutUrl: finalUrl,\n\t\t})\n\t\toptions?.onFallbackBlocked?.(finalUrl)\n\t\twindow.location.assign(finalUrl)\n\t}\n\n\tprivate showPaymentIframeFallback(options: {\n\t\tcontainer: HTMLDivElement\n\t\tfinalUrl: string\n\t\tpaymentOptions?: PaymentUIOptions\n\t}) {\n\t\tif (this.iframeReady || this.iframeFallbackPanel) return\n\n\t\tconst { container, finalUrl, paymentOptions } = options\n\t\tlogPaymentWarn(\"Hosted checkout iframe did not report ready in time\", {\n\t\t\tcheckoutUrl: finalUrl,\n\t\t})\n\t\tif (this.iframeLoadingPanel?.parentNode) {\n\t\t\tthis.iframeLoadingPanel.parentNode.removeChild(this.iframeLoadingPanel)\n\t\t}\n\t\tthis.iframeLoadingPanel = null\n\n\t\tconst fallbackText = getPaymentFallbackText(paymentOptions)\n\t\tconst panel = createPaymentFallbackPanel({\n\t\t\tbuttonText: fallbackText.buttonText,\n\t\t\tdescription: fallbackText.description,\n\t\t\tonOpen: () => {\n\t\t\t\tthis.openFallbackPaymentPage(finalUrl, paymentOptions)\n\t\t\t},\n\t\t\tonRetry: () => {\n\t\t\t\tthis.iframeFallbackPanel = null\n\t\t\t\tif (panel.parentNode) {\n\t\t\t\t\tpanel.parentNode.removeChild(panel)\n\t\t\t\t}\n\t\t\t\tthis.iframeReady = false\n\t\t\t\tthis.showPaymentIframeLoading(container, paymentOptions)\n\t\t\t\tif (this.iframe) {\n\t\t\t\t\tthis.iframe.src = finalUrl\n\t\t\t\t}\n\t\t\t\tthis.startPaymentIframeWatchdog({\n\t\t\t\t\tcontainer,\n\t\t\t\t\tfinalUrl,\n\t\t\t\t\tpaymentOptions,\n\t\t\t\t})\n\t\t\t},\n\t\t\tpaymentOptions,\n\t\t\tretryText: fallbackText.retryText,\n\t\t\ttitle: fallbackText.title,\n\t\t})\n\n\t\tthis.iframeFallbackPanel = panel\n\t\tcontainer.appendChild(panel)\n\t\tpaymentOptions?.onFallbackVisible?.()\n\t}\n\n\tprivate startPaymentIframeWatchdog(options: {\n\t\tcontainer: HTMLDivElement\n\t\tfinalUrl: string\n\t\tpaymentOptions?: PaymentUIOptions\n\t}) {\n\t\tif (typeof window === \"undefined\") return\n\n\t\tif (this.iframeLoadTimer) {\n\t\t\twindow.clearTimeout(this.iframeLoadTimer)\n\t\t}\n\t\tconst timeoutMs = getPaymentIframeLoadTimeoutMs(options.paymentOptions)\n\t\tif (timeoutMs === 0) {\n\t\t\tthis.showPaymentIframeFallback(options)\n\t\t\treturn\n\t\t}\n\n\t\tthis.iframeLoadTimer = window.setTimeout(() => {\n\t\t\tthis.iframeLoadTimer = null\n\t\t\tthis.showPaymentIframeFallback(options)\n\t\t}, timeoutMs)\n\t}\n\n\tprivate cancelHostedOrder(reason = \"user_cancel\", orderId?: string) {\n\t\tconst targetOrderId = orderId || this.activeOrderId\n\t\tif (\n\t\t\t!targetOrderId ||\n\t\t\t!this.activeCheckoutAppId ||\n\t\t\t!this.activeCheckoutBaseUrl ||\n\t\t\tthis.paymentCompleted ||\n\t\t\tthis.cancelRequestedOrderId === targetOrderId\n\t\t) {\n\t\t\treturn\n\t\t}\n\n\t\tthis.cancelRequestedOrderId = targetOrderId\n\t\tconst url = `${this.activeCheckoutBaseUrl}/api/internal/checkout/cancel-order`\n\t\tconst payload = JSON.stringify({\n\t\t\tappId: this.activeCheckoutAppId,\n\t\t\torderId: targetOrderId,\n\t\t\treason,\n\t\t})\n\n\t\tif (typeof navigator !== \"undefined\" && navigator.sendBeacon) {\n\t\t\tconst sent = navigator.sendBeacon(\n\t\t\t\turl,\n\t\t\t\tnew Blob([payload], { type: \"application/json\" }),\n\t\t\t)\n\t\t\tif (sent) return\n\t\t}\n\n\t\tvoid fetch(url, {\n\t\t\tmethod: \"POST\",\n\t\t\tbody: payload,\n\t\t\theaders: { \"Content-Type\": \"text/plain;charset=UTF-8\" },\n\t\t\tkeepalive: true,\n\t\t\tmode: \"no-cors\",\n\t\t}).catch(() => {\n\t\t\tthis.cancelRequestedOrderId = null\n\t\t})\n\t}\n\n\t/**\n\t * Opens the payment checkout page in an iframe modal.\n\t * @param urlOrParams - The checkout page URL or payment parameters\n\t * @param options - UI options\n\t */\n\topenPayment(urlOrParams: string | PaymentParams, options?: PaymentUIOptions) {\n\t\tif (typeof document === \"undefined\") return // Server-side guard\n\t\tif (this.modal) return // Prevent multiple modals\n\n\t\tlet checkoutUrl: string\n\t\tthis.activeOrderId = null\n\t\tthis.paymentCompleted = false\n\t\tthis.cancelRequestedOrderId = null\n\t\tthis.cleanupPaymentFrameState()\n\t\tif (typeof urlOrParams === \"string\") {\n\t\t\tcheckoutUrl = urlOrParams\n\t\t\ttry {\n\t\t\t\tconst parsedUrl = new URL(checkoutUrl)\n\t\t\t\tthis.activeCheckoutBaseUrl = parsedUrl.origin\n\t\t\t\tconst parts = parsedUrl.pathname.split(\"/\").filter(Boolean)\n\t\t\t\tconst checkoutIndex = parts.indexOf(\"checkout\")\n\t\t\t\tthis.activeCheckoutAppId =\n\t\t\t\t\tcheckoutIndex >= 0 ? parts[checkoutIndex + 1] || null : null\n\t\t\t} catch {\n\t\t\t\tthis.activeCheckoutAppId = null\n\t\t\t\tthis.activeCheckoutBaseUrl = null\n\t\t\t}\n\t\t} else {\n\t\t\tconst {\n\t\t\t\tappId,\n\t\t\t\torderId,\n\t\t\t\tproductId,\n\t\t\t\tpriceId,\n\t\t\t\tproductCode,\n\t\t\t\tuserId,\n\t\t\t\tcustomAmount,\n\t\t\t\tcheckoutUrl: checkoutUrlParam,\n\t\t\t\tbaseUrl = \"https://pay.imgto.link\",\n\t\t\t} = urlOrParams\n\n\t\t\t// 优先使用 checkoutUrl,其次 baseUrl,默认 https://pay.imgto.link\n\t\t\tconst base = (checkoutUrlParam || baseUrl).replace(/\\/$/, \"\")\n\t\t\tthis.activeCheckoutAppId = appId\n\t\t\tthis.activeCheckoutBaseUrl = base\n\n\t\t\tconst query = new URLSearchParams()\n\t\t\tif (userId) query.set(\"userId\", userId)\n\t\t\tif (customAmount) {\n\t\t\t\tconst amount = Number(customAmount.amount)\n\t\t\t\tconst currency = customAmount.currency.trim().toUpperCase()\n\t\t\t\tif (!Number.isInteger(amount) || amount <= 0) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"customAmount.amount must be a positive integer in the smallest currency unit\",\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tif (!/^[A-Z]{3}$/.test(currency)) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"customAmount.currency must be a 3-letter currency code\",\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tquery.set(\"customAmount\", String(amount))\n\t\t\t\tquery.set(\"customCurrency\", currency)\n\t\t\t}\n\n\t\t\tif (orderId) {\n\t\t\t\tconst cleanOrderId = orderId.trim()\n\t\t\t\tif (!cleanOrderId) {\n\t\t\t\t\tthrow new Error(\"orderId is required\")\n\t\t\t\t}\n\t\t\t\tthis.activeOrderId = cleanOrderId\n\t\t\t\tcheckoutUrl = `${base}/checkout/${appId}/orders/${cleanOrderId}`\n\t\t\t\tconst queryString = query.toString()\n\t\t\t\tif (queryString) checkoutUrl += `?${queryString}`\n\t\t\t} else if (productCode) {\n\t\t\t\t// Use product code route\n\t\t\t\tcheckoutUrl = `${base}/checkout/${appId}/code/${productCode}?${query.toString()}`\n\t\t\t} else if (productId && priceId) {\n\t\t\t\t// Use ID-based route\n\t\t\t\tcheckoutUrl = `${base}/checkout/${appId}/${productId}/${priceId}?${query.toString()}`\n\t\t\t} else {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"Either orderId, productCode, or both productId and priceId are required\",\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\tconst finalUrl = applyLocaleToUrl(\n\t\t\tcheckoutUrl,\n\t\t\tgetAutoResolvedLocale(options?.locale),\n\t\t)\n\n\t\tconst hostedFrame = this.openHostedFrame(finalUrl, {\n\t\t\tallowedOrigin: options?.allowedOrigin,\n\t\t\theight: \"min(760px, calc(100vh - 32px))\",\n\t\t\tonCloseButton: () => {\n\t\t\t\tthis.cancelHostedOrder(\"modal_close\")\n\t\t\t\toptions?.onCancel?.(this.activeOrderId || undefined)\n\t\t\t},\n\t\t\tonMessage: (data, container, event) => {\n\t\t\t\tconst isIframeMessage = event.source === this.iframe?.contentWindow\n\t\t\t\tif (\n\t\t\t\t\tisIframeMessage &&\n\t\t\t\t\t(data.type === \"PAYMENT_READY\" ||\n\t\t\t\t\t\tdata.type === \"PAYMENT_RESIZE\" ||\n\t\t\t\t\t\tdata.type === \"PAYMENT_STARTED\")\n\t\t\t\t) {\n\t\t\t\t\tthis.markPaymentIframeReady()\n\t\t\t\t}\n\t\t\t\tswitch (data.type) {\n\t\t\t\t\tcase \"PAYMENT_READY\":\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase \"PAYMENT_STARTED\":\n\t\t\t\t\t\tif (data.orderId) {\n\t\t\t\t\t\t\tthis.activeOrderId = data.orderId\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase \"PAYMENT_SUCCESS\":\n\t\t\t\t\t\tthis.paymentCompleted = true\n\t\t\t\t\t\toptions?.onSuccess?.(data.orderId)\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase \"PAYMENT_CANCELLED\":\n\t\t\t\t\t\tthis.cancelHostedOrder(\"payment_cancelled\", data.orderId)\n\t\t\t\t\t\toptions?.onCancel?.(data.orderId)\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase \"PAYMENT_RESIZE\":\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase \"PAYMENT_CLOSE\":\n\t\t\t\t\t\tthis.cancelHostedOrder(\"payment_close\", data.orderId)\n\t\t\t\t\t\tthis.close()\n\t\t\t\t\t\toptions?.onClose?.()\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t},\n\t\t\twidth: \"min(450px, 100%)\",\n\t\t})\n\n\t\tif (hostedFrame) {\n\t\t\tthis.showPaymentIframeLoading(hostedFrame.container, options)\n\t\t\tthis.startPaymentIframeWatchdog({\n\t\t\t\tcontainer: hostedFrame.container,\n\t\t\t\tfinalUrl,\n\t\t\t\tpaymentOptions: options,\n\t\t\t})\n\t\t}\n\t}\n\n\tclose() {\n\t\tsuper.close()\n\t\tthis.cleanupPaymentFrameState()\n\t}\n\n\t/**\n\t * Poll order status from integrator's API endpoint\n\t * @param statusUrl - The integrator's API endpoint to check order status\n\t * @param options - Polling options\n\t * @returns Promise that resolves when order is paid or rejects on timeout/failure\n\t */\n\tasync pollOrderStatus(\n\t\tstatusUrl: string,\n\t\toptions?: PollOptions,\n\t): Promise<OrderStatus> {\n\t\tconst interval = options?.interval || 3000\n\t\tconst timeout = options?.timeout || 300000\n\t\tconst startTime = Date.now()\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst poll = async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst response = await fetch(statusUrl)\n\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\tthrow new Error(`Status check failed: ${response.status}`)\n\t\t\t\t\t}\n\n\t\t\t\t\tconst status: OrderStatus = await response.json()\n\t\t\t\t\toptions?.onStatusChange?.(status)\n\n\t\t\t\t\tif (status.status === \"PAID\") {\n\t\t\t\t\t\tresolve(status)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\tif (status.status === \"CANCELLED\" || status.status === \"FAILED\") {\n\t\t\t\t\t\treject(new Error(`Order ${status.status.toLowerCase()}`))\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\t// Check timeout\n\t\t\t\t\tif (Date.now() - startTime > timeout) {\n\t\t\t\t\t\treject(new Error(\"Polling timeout\"))\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\t// Continue polling\n\t\t\t\t\tsetTimeout(poll, interval)\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// On network error, continue polling unless timeout\n\t\t\t\t\tif (Date.now() - startTime > timeout) {\n\t\t\t\t\t\treject(error)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tsetTimeout(poll, interval)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpoll()\n\t\t})\n\t}\n}\n\nexport interface WechatMessageBindingUIOptions {\n\tbindingUrl: string\n\tdisplayMode?: \"redirect\" | \"popup\"\n\tpopupName?: string\n}\n\nexport class MessageUI {\n\topenWechatBinding(options: WechatMessageBindingUIOptions) {\n\t\tconst bindingUrl = options.bindingUrl?.trim()\n\t\tif (!bindingUrl) {\n\t\t\tthrow new Error(\"bindingUrl is required\")\n\t\t}\n\t\tif (options.displayMode === \"popup\") {\n\t\t\tconst popup = window.open(\n\t\t\t\tbindingUrl,\n\t\t\t\toptions.popupName || \"youidian-wechat-message-binding\",\n\t\t\t\t\"width=480,height=720,noopener,noreferrer\",\n\t\t\t)\n\t\t\tif (!popup) {\n\t\t\t\twindow.location.href = bindingUrl\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t\twindow.location.href = bindingUrl\n\t}\n}\n\nexport function createMessageUI() {\n\treturn new MessageUI()\n}\n\n/**\n * Convenience function to create a PaymentUI instance\n */\nexport function createPaymentUI(): PaymentUI {\n\treturn new PaymentUI()\n}\n\nexport type {\n\tLoginDeviceType,\n\tLoginEnvironment,\n\tLoginEnvironmentInput,\n} from \"./environment\"\nexport { detectLoginEnvironment } from \"./environment\"\nexport type {\n\tLoginCallbackOptions,\n\tLoginDisplayMode,\n\tLoginEventData,\n\tLoginEventType,\n\tLoginParams,\n\tLoginResult,\n\tLoginUIOptions,\n} from \"./login\"\nexport { createLoginUI, handleLoginCallbackIfPresent, LoginUI } from \"./login\"\n","export type SdkBrandLogoCopy = {\n\tlanguage: string\n\tname: string\n\tsubtitle: string\n}\n\nexport type SdkBrandLogoTheme = {\n\tforeground: string\n\tmuted: string\n\tprimary: string\n\tsecondary: string\n}\n\ntype SdkBrandLogoMarkOptions = {\n\tanimated?: boolean\n\tinverted?: boolean\n\tsize: number\n\ttheme: SdkBrandLogoTheme\n\tvariant?: \"brand\" | \"mark\"\n}\n\ntype SdkBrandLogoOptions = {\n\tanimated?: boolean\n\tbrand: SdkBrandLogoCopy\n\tbrandWidth?: number\n\tcopyWidth?: number\n\tgap?: number\n\tmarkMarginRight?: number\n\tmarkSize: number\n\tnameSize: number\n\tsubtitleMarginTop?: number\n\tsubtitleSize: number\n\tsubtitleWeight?: string\n\ttheme: SdkBrandLogoTheme\n\tvariant?: \"brand\" | \"mark\"\n}\n\nfunction ensureSdkBrandLogoStyles() {\n\tif (document.getElementById?.(\"youidian-sdk-brand-logo-style\")) {\n\t\treturn\n\t}\n\n\tconst style = document.createElement(\"style\")\n\tstyle.id = \"youidian-sdk-brand-logo-style\"\n\tstyle.textContent = `\n\t\t.youidian-sdk-brand-logo__ring,\n\t\t.youidian-sdk-brand-logo__dot,\n\t\t.youidian-sdk-brand-logo__copy,\n\t\t.youidian-sdk-brand-logo__tagline {\n\t\t\ttransform-box: fill-box;\n\t\t\ttransform-origin: center;\n\t\t\twill-change: opacity, transform;\n\t\t}\n\n\t\t.youidian-sdk-brand-logo[data-animated=\"true\"] .youidian-sdk-brand-logo__ring {\n\t\t\tanimation: youidian-sdk-brand-logo-ring 1400ms cubic-bezier(0.4, 0, 0.2, 1) infinite;\n\t\t}\n\n\t\t.youidian-sdk-brand-logo[data-animated=\"true\"] .youidian-sdk-brand-logo__dot {\n\t\t\tanimation: youidian-sdk-brand-logo-dot 1400ms cubic-bezier(0.4, 0, 0.2, 1) infinite;\n\t\t}\n\n\t\t.youidian-sdk-brand-logo[data-animated=\"true\"] .youidian-sdk-brand-logo__copy {\n\t\t\tanimation: youidian-sdk-brand-logo-copy 1600ms cubic-bezier(0.4, 0, 0.2, 1) infinite;\n\t\t}\n\n\t\t.youidian-sdk-brand-logo[data-animated=\"true\"] .youidian-sdk-brand-logo__tagline {\n\t\t\tanimation: youidian-sdk-brand-logo-tagline 1600ms cubic-bezier(0.4, 0, 0.2, 1) infinite;\n\t\t}\n\n\t\t@keyframes youidian-sdk-brand-logo-ring {\n\t\t\t0%,\n\t\t\t100% {\n\t\t\t\topacity: 0.72;\n\t\t\t\ttransform: rotate(0deg) scale(0.98);\n\t\t\t}\n\t\t\t50% {\n\t\t\t\topacity: 1;\n\t\t\t\ttransform: rotate(8deg) scale(1.02);\n\t\t\t}\n\t\t}\n\n\t\t@keyframes youidian-sdk-brand-logo-dot {\n\t\t\t0%,\n\t\t\t100% {\n\t\t\t\topacity: 0.58;\n\t\t\t\ttransform: scale(0.9);\n\t\t\t}\n\t\t\t50% {\n\t\t\t\topacity: 1;\n\t\t\t\ttransform: scale(1.08);\n\t\t\t}\n\t\t}\n\n\t\t@keyframes youidian-sdk-brand-logo-copy {\n\t\t\t0%,\n\t\t\t100% {\n\t\t\t\topacity: 0.86;\n\t\t\t\ttransform: translateY(0);\n\t\t\t}\n\t\t\t50% {\n\t\t\t\topacity: 1;\n\t\t\t\ttransform: translateY(-1px);\n\t\t\t}\n\t\t}\n\n\t\t@keyframes youidian-sdk-brand-logo-tagline {\n\t\t\t0%,\n\t\t\t100% {\n\t\t\t\topacity: 0.64;\n\t\t\t}\n\t\t\t50% {\n\t\t\t\topacity: 0.92;\n\t\t\t}\n\t\t}\n\n\t\t@media (prefers-reduced-motion: reduce) {\n\t\t\t.youidian-sdk-brand-logo__ring,\n\t\t\t.youidian-sdk-brand-logo__dot,\n\t\t\t.youidian-sdk-brand-logo__copy,\n\t\t\t.youidian-sdk-brand-logo__tagline {\n\t\t\t\tanimation: none;\n\t\t\t\topacity: 1;\n\t\t\t\ttransform: none;\n\t\t\t}\n\t\t}\n\t`\n\tdocument.head?.appendChild(style)\n}\n\nexport function createSdkBrandLogoMark({\n\tanimated,\n\tinverted,\n\tsize,\n\ttheme,\n\tvariant = \"brand\",\n}: SdkBrandLogoMarkOptions) {\n\tensureSdkBrandLogoStyles()\n\n\tconst mark = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\")\n\tmark.setAttribute(\"viewBox\", \"0 0 512 512\")\n\tmark.setAttribute(\"fill\", \"none\")\n\tmark.setAttribute(\"aria-hidden\", \"true\")\n\tObject.assign(mark.style, {\n\t\twidth: `${size}px`,\n\t\theight: `${size}px`,\n\t\tcolor: inverted ? \"#ffffff\" : theme.primary,\n\t\tdisplay: \"block\",\n\t\tflex: \"0 0 auto\",\n\t\toverflow: \"visible\",\n\t})\n\n\tconst logoGroup = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\")\n\tlogoGroup.setAttribute(\n\t\t\"transform\",\n\t\tvariant === \"mark\"\n\t\t\t? \"matrix(0.74 0 0 0.74 -124 -114)\"\n\t\t\t: \"matrix(0.58 0 0 0.58 -40 -31)\",\n\t)\n\n\tconst ring = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\")\n\tring.setAttribute(\"class\", animated ? \"youidian-sdk-brand-logo__ring\" : \"\")\n\tring.setAttribute(\"fill\", inverted ? \"currentColor\" : theme.primary)\n\tring.setAttribute(\n\t\t\"d\",\n\t\t\"M704.298 679.54A264 264 0 1 1 704.298 309.46A49 49 0 0 1 634.4 378.149A166 166 0 1 0 634.4 610.851A49 49 0 0 1 704.298 679.54Z\",\n\t)\n\n\tconst dot = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\")\n\tdot.setAttribute(\"class\", animated ? \"youidian-sdk-brand-logo__dot\" : \"\")\n\tdot.setAttribute(\"fill\", inverted ? \"currentColor\" : theme.secondary)\n\tdot.setAttribute(\"cx\", \"714.5\")\n\tdot.setAttribute(\"cy\", \"490.5\")\n\tdot.setAttribute(\"r\", \"68\")\n\tdot.setAttribute(\"opacity\", inverted ? \"0.78\" : \"1\")\n\n\tlogoGroup.appendChild(ring)\n\tlogoGroup.appendChild(dot)\n\tmark.appendChild(logoGroup)\n\treturn mark\n}\n\nexport function createSdkBrandLogo({\n\tanimated,\n\tbrand,\n\tbrandWidth,\n\tcopyWidth,\n\tgap = 10,\n\tmarkMarginRight,\n\tmarkSize,\n\tnameSize,\n\tsubtitleMarginTop = 6,\n\tsubtitleSize,\n\tsubtitleWeight = \"800\",\n\ttheme,\n\tvariant = \"brand\",\n}: SdkBrandLogoOptions) {\n\tensureSdkBrandLogoStyles()\n\n\tconst wrapper = document.createElement(\"div\")\n\twrapper.className = \"youidian-sdk-brand-logo\"\n\twrapper.setAttribute(\"data-animated\", animated ? \"true\" : \"false\")\n\tObject.assign(wrapper.style, {\n\t\tdisplay: \"inline-flex\",\n\t\talignItems: \"center\",\n\t\tjustifyContent: \"center\",\n\t\tgap: `${gap}px`,\n\t\twidth: brandWidth ? `${brandWidth}px` : undefined,\n\t})\n\n\tconst copy = document.createElement(\"div\")\n\tcopy.className = \"youidian-sdk-brand-logo__copy\"\n\tcopy.setAttribute(\"data-brand-locale\", brand.language)\n\tObject.assign(copy.style, {\n\t\tdisplay: \"flex\",\n\t\tflexDirection: \"column\",\n\t\talignItems: \"flex-start\",\n\t\tjustifyContent: \"center\",\n\t\tlineHeight: \"1\",\n\t\twidth: copyWidth ? `${copyWidth}px` : undefined,\n\t})\n\n\tconst name = document.createElement(\"div\")\n\tname.className = \"youidian-sdk-brand-logo__name\"\n\tname.textContent = brand.name\n\tObject.assign(name.style, {\n\t\tcolor: theme.foreground,\n\t\tfontFamily:\n\t\t\tbrand.language === \"zh\"\n\t\t\t\t? '\"Noto Sans TC\", \"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif'\n\t\t\t\t: '\"Unbounded\", \"Space Grotesk\", \"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n\t\tfontSize: `${nameSize}px`,\n\t\tfontWeight: brand.language === \"zh\" ? \"900\" : \"800\",\n\t\tletterSpacing: brand.language === \"zh\" ? \"0.08em\" : \"0.01em\",\n\t\tlineHeight: \"1\",\n\t\twhiteSpace: \"nowrap\",\n\t})\n\n\tconst subtitle = document.createElement(\"div\")\n\tsubtitle.className = \"youidian-sdk-brand-logo__tagline\"\n\tsubtitle.textContent = brand.subtitle\n\tObject.assign(subtitle.style, {\n\t\tcolor: theme.muted,\n\t\tfontFamily:\n\t\t\tbrand.language === \"zh\"\n\t\t\t\t? '\"Noto Sans TC\", \"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif'\n\t\t\t\t: '\"Space Grotesk\", \"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n\t\tfontSize: `${subtitleSize}px`,\n\t\tfontWeight: subtitleWeight,\n\t\tletterSpacing: brand.language === \"zh\" ? \"0.24em\" : \"0.07em\",\n\t\tlineHeight: \"1\",\n\t\tmarginTop: `${subtitleMarginTop}px`,\n\t\ttextTransform: brand.language === \"zh\" ? \"none\" : \"uppercase\",\n\t\twhiteSpace: \"nowrap\",\n\t})\n\n\tcopy.appendChild(name)\n\tcopy.appendChild(subtitle)\n\tconst mark = createSdkBrandLogoMark({\n\t\tanimated,\n\t\tsize: markSize,\n\t\ttheme,\n\t\tvariant,\n\t})\n\tif (typeof markMarginRight === \"number\") {\n\t\tmark.style.marginRight = `${markMarginRight}px`\n\t}\n\twrapper.appendChild(mark)\n\twrapper.appendChild(copy)\n\treturn wrapper\n}\n","export interface HostedFrameMessage {\n\ttype: string\n\theight?: number\n}\n\ntype HostedFrameOptions<TData extends HostedFrameMessage> = {\n\tallowedOrigin?: string\n\theight?: string\n\tonCloseButton?: () => void\n\tonMessage: (\n\t\tdata: TData,\n\t\tcontainer: HTMLDivElement,\n\t\tevent: MessageEvent,\n\t) => void\n\twidth?: string\n}\n\ntype HostedFrameInstance = {\n\tcontainer: HTMLDivElement\n\tiframe: HTMLIFrameElement\n}\n\nconst SDK_SUPPORTED_LOCALES = [\n\t\"en\",\n\t\"zh-CN\",\n\t\"zh-Hant\",\n\t\"fr\",\n\t\"de\",\n\t\"ja\",\n\t\"es\",\n\t\"ko\",\n\t\"nl\",\n\t\"it\",\n\t\"pt\",\n] as const\n\nconst SDK_DEFAULT_LOCALE = \"zh-CN\"\n\nconst SDK_LOCALE_ALIASES: Record<string, string> = {\n\ten: \"en\",\n\t\"en-us\": \"en\",\n\t\"en-gb\": \"en\",\n\tzh: \"zh-CN\",\n\t\"zh-cn\": \"zh-CN\",\n\t\"zh-tw\": \"zh-Hant\",\n\t\"zh-hk\": \"zh-Hant\",\n\t\"zh-hant\": \"zh-Hant\",\n\t\"zh-hans\": \"zh-CN\",\n\tfr: \"fr\",\n\tde: \"de\",\n\tja: \"ja\",\n\tes: \"es\",\n\tko: \"ko\",\n\tnl: \"nl\",\n\tit: \"it\",\n\tpt: \"pt\",\n}\n\nfunction matchSupportedBaseLocale(locale: string): string | undefined {\n\tconst base = locale.toLowerCase().split(\"-\")[0]\n\treturn SDK_SUPPORTED_LOCALES.find((item) => item.toLowerCase() === base)\n}\n\nexport function normalizeSdkLocale(locale?: string): string | undefined {\n\tif (!locale) return\n\n\tconst sanitized = locale.trim().replace(/_/g, \"-\")\n\tif (!sanitized) return\n\n\tconst lower = sanitized.toLowerCase()\n\tif (SDK_LOCALE_ALIASES[lower]) {\n\t\treturn SDK_LOCALE_ALIASES[lower]\n\t}\n\n\tlet canonical: string | undefined\n\ttry {\n\t\tcanonical = Intl.getCanonicalLocales(sanitized)[0]\n\t} catch {\n\t\tcanonical = undefined\n\t}\n\n\tconst candidates = [canonical, sanitized].filter(Boolean) as string[]\n\n\tfor (const candidate of candidates) {\n\t\tconst candidateLower = candidate.toLowerCase()\n\n\t\tif (SDK_LOCALE_ALIASES[candidateLower]) {\n\t\t\treturn SDK_LOCALE_ALIASES[candidateLower]\n\t\t}\n\t\tif ((SDK_SUPPORTED_LOCALES as readonly string[]).includes(candidate)) {\n\t\t\treturn candidate\n\t\t}\n\n\t\tconst baseMatch = matchSupportedBaseLocale(candidate)\n\t\tif (baseMatch) {\n\t\t\treturn baseMatch\n\t\t}\n\t}\n}\n\nexport function getBrowserLocale(): string | undefined {\n\tif (typeof navigator === \"undefined\") return\n\n\tfor (const candidate of navigator.languages || []) {\n\t\tconst normalized = normalizeSdkLocale(candidate)\n\t\tif (normalized) return normalized\n\t}\n\n\treturn normalizeSdkLocale(navigator.language)\n}\n\nexport function getAutoResolvedLocale(locale?: string): string {\n\treturn normalizeSdkLocale(locale) || getBrowserLocale() || SDK_DEFAULT_LOCALE\n}\n\nexport function applyLocaleToUrl(urlValue: string, locale?: string): string {\n\tif (!locale) return urlValue\n\n\ttry {\n\t\tconst url = new URL(urlValue)\n\t\tconst localePrefix = `/${locale}`\n\t\tif (\n\t\t\t!url.pathname.startsWith(`${localePrefix}/`) &&\n\t\t\turl.pathname !== localePrefix\n\t\t) {\n\t\t\turl.pathname = `${localePrefix}${url.pathname}`\n\t\t}\n\t\treturn url.toString()\n\t} catch (_error) {\n\t\tconst localePrefix = `/${locale}`\n\t\tif (!urlValue.startsWith(`${localePrefix}/`) && urlValue !== localePrefix) {\n\t\t\treturn `${localePrefix}${urlValue.startsWith(\"/\") ? \"\" : \"/\"}${urlValue}`\n\t\t}\n\t\treturn urlValue\n\t}\n}\n\nexport class HostedFrameModal<TData extends HostedFrameMessage> {\n\tprotected iframe: HTMLIFrameElement | null = null\n\tprotected modal: HTMLDivElement | null = null\n\tprotected messageHandler: ((event: MessageEvent) => void) | null = null\n\n\tprotected openHostedFrame(\n\t\turl: string,\n\t\toptions: HostedFrameOptions<TData>,\n\t): HostedFrameInstance | null {\n\t\tif (typeof document === \"undefined\") return null\n\t\tif (this.modal) return null\n\n\t\tthis.modal = document.createElement(\"div\")\n\t\tObject.assign(this.modal.style, {\n\t\t\tposition: \"fixed\",\n\t\t\ttop: \"0\",\n\t\t\tleft: \"0\",\n\t\t\twidth: \"100%\",\n\t\t\theight: \"100%\",\n\t\t\tbackgroundColor: \"rgba(15,23,42,0.52)\",\n\t\t\tdisplay: \"flex\",\n\t\t\talignItems: \"center\",\n\t\t\tjustifyContent: \"center\",\n\t\t\tzIndex: \"9999\",\n\t\t\ttransition: \"opacity 0.3s ease\",\n\t\t\tbackdropFilter: \"blur(14px)\",\n\t\t\tpadding: \"16px\",\n\t\t})\n\n\t\tconst container = document.createElement(\"div\")\n\t\tObject.assign(container.style, {\n\t\t\twidth: options.width || \"450px\",\n\t\t\theight: options.height || \"min(760px, calc(100vh - 32px))\",\n\t\t\tbackgroundColor: \"transparent\",\n\t\t\tborderRadius: \"28px\",\n\t\t\toverflow: \"visible\",\n\t\t\tposition: \"relative\",\n\t\t\tboxShadow: \"none\",\n\t\t\tmaxWidth: \"calc(100vw - 32px)\",\n\t\t\tmaxHeight: \"calc(100vh - 32px)\",\n\t\t\ttransition: \"none\",\n\t\t})\n\n\t\tconst closeBtn = document.createElement(\"button\")\n\t\tcloseBtn.innerHTML = \"×\"\n\t\tObject.assign(closeBtn.style, {\n\t\t\tposition: \"absolute\",\n\t\t\tright: \"-14px\",\n\t\t\ttop: \"-14px\",\n\t\t\tfontSize: \"20px\",\n\t\t\twidth: \"36px\",\n\t\t\theight: \"36px\",\n\t\t\tborderRadius: \"9999px\",\n\t\t\tborder: \"1px solid rgba(255,255,255,0.5)\",\n\t\t\tbackground: \"rgba(255,255,255,0.9)\",\n\t\t\tcursor: \"pointer\",\n\t\t\tcolor: \"#475569\",\n\t\t\tzIndex: \"2\",\n\t\t\tboxShadow: \"0 10px 30px rgba(15,23,42,0.16)\",\n\t\t})\n\t\tcloseBtn.onclick = () => {\n\t\t\tthis.close()\n\t\t\toptions.onCloseButton?.()\n\t\t}\n\n\t\tthis.iframe = document.createElement(\"iframe\")\n\t\tthis.iframe.src = url\n\t\tthis.iframe.allow = \"local-network-access\"\n\t\tObject.assign(this.iframe.style, {\n\t\t\twidth: \"100%\",\n\t\t\theight: \"100%\",\n\t\t\tborder: \"none\",\n\t\t\tborderRadius: \"28px\",\n\t\t\tbackground: \"transparent\",\n\t\t\tdisplay: \"block\",\n\t\t})\n\n\t\tcontainer.appendChild(closeBtn)\n\t\tcontainer.appendChild(this.iframe)\n\t\tthis.modal.appendChild(container)\n\t\tdocument.body.appendChild(this.modal)\n\n\t\tthis.messageHandler = (event: MessageEvent) => {\n\t\t\tif (options.allowedOrigin && options.allowedOrigin !== \"*\") {\n\t\t\t\tif (event.origin !== options.allowedOrigin) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst data = event.data as TData\n\t\t\tif (!data || typeof data !== \"object\" || !data.type) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\toptions.onMessage(data, container, event)\n\t\t}\n\n\t\twindow.addEventListener(\"message\", this.messageHandler)\n\n\t\treturn {\n\t\t\tcontainer,\n\t\t\tiframe: this.iframe,\n\t\t}\n\t}\n\n\tclose() {\n\t\tif (typeof window === \"undefined\") return\n\n\t\tif (this.messageHandler) {\n\t\t\twindow.removeEventListener(\"message\", this.messageHandler)\n\t\t\tthis.messageHandler = null\n\t\t}\n\n\t\tif (this.modal?.parentNode) {\n\t\t\tthis.modal.parentNode.removeChild(this.modal)\n\t\t}\n\n\t\tthis.modal = null\n\t\tthis.iframe = null\n\t}\n}\n","export type LoginDeviceType = \"desktop\" | \"mobile\" | \"tablet\" | \"unknown\"\n\nexport type LoginEnvironmentInput = {\n\tcoarsePointer?: boolean\n\tmaxTouchPoints?: number\n\tplatform?: string\n\tstandalone?: boolean\n\tuserAgent?: string\n\tuserAgentDataMobile?: boolean\n}\n\nexport type LoginEnvironment = {\n\tdeviceType: LoginDeviceType\n\tisAndroid: boolean\n\tisCoarsePointer: boolean\n\tisDesktop: boolean\n\tisIOS: boolean\n\tisIPadOS: boolean\n\tisMobile: boolean\n\tisStandalone: boolean\n\tisTablet: boolean\n\tisTouch: boolean\n\tisWeChat: boolean\n\tmaxTouchPoints: number\n\tplatform: string\n\tshouldUseRedirectLogin: boolean\n\tuserAgent: string\n}\n\ntype NavigatorWithLoginSignals = Navigator & {\n\tstandalone?: boolean\n\tuserAgentData?: {\n\t\tmobile?: boolean\n\t}\n}\n\nfunction normalizeText(value?: string) {\n\treturn value || \"\"\n}\n\nfunction getRuntimeInput(): LoginEnvironmentInput {\n\tif (typeof navigator === \"undefined\") {\n\t\treturn {}\n\t}\n\n\tconst nav = navigator as NavigatorWithLoginSignals\n\tconst coarsePointer =\n\t\ttypeof window !== \"undefined\" && typeof window.matchMedia === \"function\"\n\t\t\t? window.matchMedia(\"(pointer: coarse)\").matches\n\t\t\t: undefined\n\n\treturn {\n\t\tcoarsePointer,\n\t\tmaxTouchPoints: nav.maxTouchPoints || 0,\n\t\tplatform: nav.platform || \"\",\n\t\tstandalone: nav.standalone,\n\t\tuserAgent: nav.userAgent || \"\",\n\t\tuserAgentDataMobile: nav.userAgentData?.mobile,\n\t}\n}\n\nfunction includesAny(value: string, patterns: RegExp[]) {\n\treturn patterns.some((pattern) => pattern.test(value))\n}\n\nexport function detectLoginEnvironment(\n\tinput: LoginEnvironmentInput = getRuntimeInput(),\n): LoginEnvironment {\n\tconst userAgent = normalizeText(input.userAgent)\n\tconst platform = normalizeText(input.platform)\n\tconst rawMaxTouchPoints = input.maxTouchPoints ?? 0\n\tconst maxTouchPoints = Number.isFinite(rawMaxTouchPoints)\n\t\t? Math.max(0, rawMaxTouchPoints)\n\t\t: 0\n\tconst isCoarsePointer = input.coarsePointer === true\n\tconst isTouch = maxTouchPoints > 0 || isCoarsePointer\n\n\tconst isWeChat = /micromessenger/i.test(userAgent)\n\tconst isAndroid = /\\bandroid\\b/i.test(userAgent)\n\tconst hasExplicitIOSDevice = /\\b(iPad|iPhone|iPod)\\b/i.test(userAgent)\n\tconst hasMacintoshUserAgent = /\\bMacintosh\\b/i.test(userAgent)\n\tconst hasMacPlatform = /^Mac/i.test(platform)\n\tconst isIPadOS =\n\t\t!hasExplicitIOSDevice &&\n\t\thasMacintoshUserAgent &&\n\t\thasMacPlatform &&\n\t\ttypeof input.standalone !== \"undefined\" &&\n\t\tmaxTouchPoints > 2\n\tconst isIOS = hasExplicitIOSDevice || isIPadOS\n\n\tconst isTabletByUa = includesAny(userAgent, [\n\t\t/\\biPad\\b/i,\n\t\t/\\btablet\\b/i,\n\t\t/\\bplaybook\\b/i,\n\t\t/\\bsilk\\b(?!.*\\bmobile\\b)/i,\n\t\t/\\bkindle\\b/i,\n\t\t/\\bnexus 7\\b/i,\n\t\t/\\bnexus 9\\b/i,\n\t\t/\\bxoom\\b/i,\n\t\t/\\bsm-t\\d+/i,\n\t\t/\\bgt-p\\d+/i,\n\t\t/\\bmi pad\\b/i,\n\t])\n\tconst isMobileByUa = includesAny(userAgent, [\n\t\t/\\bMobile\\b/i,\n\t\t/\\biPhone\\b/i,\n\t\t/\\biPod\\b/i,\n\t\t/\\bWindows Phone\\b/i,\n\t\t/\\bIEMobile\\b/i,\n\t\t/\\bBlackBerry\\b/i,\n\t\t/\\bBB10\\b/i,\n\t\t/\\bOpera Mini\\b/i,\n\t\t/\\bOpera Mobi\\b/i,\n\t\t/\\bwebOS\\b/i,\n\t])\n\tconst isAndroidTablet = isAndroid && !/\\bMobile\\b/i.test(userAgent)\n\tconst isTablet = isIPadOS || isTabletByUa || isAndroidTablet\n\tconst isMobile =\n\t\tinput.userAgentDataMobile === true ||\n\t\tisMobileByUa ||\n\t\t(isAndroid && !isTablet) ||\n\t\t(isIOS && !isTablet)\n\tconst deviceType: LoginDeviceType = isTablet\n\t\t? \"tablet\"\n\t\t: isMobile\n\t\t\t? \"mobile\"\n\t\t\t: userAgent || platform || isTouch\n\t\t\t\t? \"desktop\"\n\t\t\t\t: \"unknown\"\n\n\tconst shouldUseRedirectLogin =\n\t\tdeviceType === \"mobile\" || deviceType === \"tablet\" || isWeChat\n\n\treturn {\n\t\tdeviceType,\n\t\tisAndroid,\n\t\tisCoarsePointer,\n\t\tisDesktop: deviceType === \"desktop\",\n\t\tisIOS,\n\t\tisIPadOS,\n\t\tisMobile,\n\t\tisStandalone: input.standalone === true,\n\t\tisTablet,\n\t\tisTouch,\n\t\tisWeChat,\n\t\tmaxTouchPoints,\n\t\tplatform,\n\t\tshouldUseRedirectLogin,\n\t\tuserAgent,\n\t}\n}\n","import { detectLoginEnvironment } from \"./environment\"\nimport {\n\tapplyLocaleToUrl,\n\tgetAutoResolvedLocale,\n\ttype HostedFrameMessage,\n\tHostedFrameModal,\n} from \"./hosted-modal\"\n\nexport type LoginEventType =\n\t| \"LOGIN_READY\"\n\t| \"LOGIN_SUCCESS\"\n\t| \"LOGIN_CANCELLED\"\n\t| \"LOGIN_CLOSE\"\n\t| \"LOGIN_RESIZE\"\n\t| \"LOGIN_REDIRECT_REQUIRED\"\n\t| \"LOGIN_ERROR\"\n\nexport type LoginDisplayMode = \"auto\" | \"modal\" | \"popup\" | \"redirect\"\nexport type LoginFallbackRedirectMode = \"auto\" | \"manual\"\n\nexport interface LoginResult {\n\tavatar?: string | null\n\tchannel?: string\n\temail?: string | null\n\texpiresAt?: string\n\tlegacyCasdoorId?: string\n\tloginToken?: string\n\tname?: string | null\n\tusername?: string | null\n\tphoneCountryCode?: string | null\n\tphoneNumber?: string | null\n\tphoneE164?: string | null\n\tphoneVerifiedAt?: string | null\n\tuserId?: string\n\twechatOpenId?: string | null\n\twechatUnionId?: string | null\n}\n\nexport interface LoginEventData extends HostedFrameMessage, LoginResult {\n\ttype: LoginEventType\n\tattemptId?: string\n\tauthUrl?: string\n\tchannel?: string\n\terror?: string\n\tmessage?: string\n}\n\nexport interface LoginUIOptions {\n\t/** Origin to validate postMessage (defaults to '*', set for security) */\n\tallowedOrigin?: string\n\t/** Whether the SDK should close the login surface after receiving LOGIN_CLOSE. Defaults to true. */\n\tautoClose?: boolean\n\t/** Optional same-origin URL used as the no-API OAuth callback landing page. */\n\tcallbackUrl?: string\n\t/**\n\t * How to open the hosted login page. Defaults to \"auto\", which uses an\n\t * iframe modal on desktop and redirects on mobile/embedded browsers.\n\t */\n\tdisplayMode?: LoginDisplayMode\n\t/** Text for the fallback button shown when the iframe does not report readiness. */\n\tfallbackButtonText?: string\n\t/** Description for the fallback panel shown when the iframe does not report readiness. */\n\tfallbackDescription?: string\n\t/**\n\t * Whether the SDK should redirect automatically when iframe loading times out.\n\t * Defaults to \"manual\" to avoid taking over the integrator page when the\n\t * hosted page is only slow to report readiness.\n\t */\n\tfallbackRedirectMode?: LoginFallbackRedirectMode\n\t/** Title for the fallback panel shown when the iframe does not report readiness. */\n\tfallbackTitle?: string\n\t/**\n\t * How long the SDK waits for LOGIN_READY or LOGIN_RESIZE before showing the\n\t * fallback redirect button. Only used when displayMode is \"modal\".\n\t * Defaults to 6000ms.\n\t */\n\tiframeLoadTimeoutMs?: number\n\t/** Description shown while the hosted login iframe is loading. */\n\tloadingDescription?: string\n\t/** Title shown while the hosted login iframe is loading. */\n\tloadingTitle?: string\n\t/**\n\t * Whether to poll popup.closed to detect manual popup closure.\n\t * Only used when displayMode is \"popup\". Defaults to false because COOP can\n\t * make popup.closed unreliable.\n\t */\n\tmonitorPopupClosed?: boolean\n\tonCancel?: () => void\n\tonClose?: () => void\n\tonError?: (message?: string, data?: LoginEventData) => void\n\tonFallbackVisible?: () => void\n\tonSuccess?: (result: LoginResult) => void\n}\n\nexport interface LoginCallbackOptions {\n\t/**\n\t * Whether the callback helper should close the current window after\n\t * publishing the login result. Defaults to false; LoginUI closes the popup\n\t * it opened after receiving the callback event.\n\t */\n\tautoClose?: boolean\n\tonError?: (message?: string, data?: LoginEventData) => void\n\tonResult?: (data: LoginEventData) => void\n\tonSuccess?: (result: LoginResult) => void\n}\n\nexport interface LoginParams {\n\tappId: string\n\n\t/**\n\t * @deprecated Use loginUrl instead\n\t * Defaults to https://pay.imgto.link\n\t */\n\tbaseUrl?: string\n\n\t/**\n\t * Hosted login page base URL (e.g. https://pay.youidian.com)\n\t * Defaults to https://pay.imgto.link\n\t */\n\tloginUrl?: string\n\n\t/**\n\t * Optional locale prefix to prepend to the hosted login path.\n\t * If omitted, the SDK automatically resolves the locale from the browser language.\n\t */\n\tlocale?: string\n\n\t/** Preferred provider/channel code */\n\tpreferredChannel?: string\n}\n\nfunction getOrigin(value?: string): string | null {\n\tif (!value) return null\n\ttry {\n\t\treturn new URL(value).origin\n\t} catch {\n\t\treturn null\n\t}\n}\n\nfunction isValidLoginRedirectUrl(value?: string): value is string {\n\tif (!value) return false\n\ttry {\n\t\tconst url = new URL(value)\n\t\treturn url.protocol === \"https:\" || url.protocol === \"http:\"\n\t} catch {\n\t\treturn false\n\t}\n}\n\nfunction createLoginCallbackState() {\n\tif (typeof crypto !== \"undefined\" && crypto.randomUUID) {\n\t\treturn crypto.randomUUID().replace(/-/g, \"\")\n\t}\n\treturn `${Date.now().toString(36)}${Math.random().toString(36).slice(2)}`\n}\n\nfunction buildLoginCallbackUrl(callbackState: string, callbackUrl?: string) {\n\tconst baseUrl = callbackUrl || window.location.href\n\tconst url = new URL(baseUrl, window.location.href)\n\tconst returnHash = url.hash.replace(/^#/, \"\")\n\n\turl.hash = \"\"\n\turl.searchParams.set(LOGIN_CALLBACK_MARKER, \"1\")\n\turl.searchParams.set(LOGIN_CALLBACK_STATE_PARAM, callbackState)\n\tif (returnHash) {\n\t\turl.searchParams.set(LOGIN_CALLBACK_RETURN_HASH_PARAM, returnHash)\n\t} else {\n\t\turl.searchParams.delete(LOGIN_CALLBACK_RETURN_HASH_PARAM)\n\t}\n\n\treturn url.toString()\n}\n\nfunction buildLoginLaunchPayload(\n\tparams: LoginParams,\n\toptions?: LoginUIOptions,\n\tcallbackState?: string,\n) {\n\tconst parentOrigin =\n\t\ttypeof window !== \"undefined\" ? window.location.origin : undefined\n\tconst callbackUrl =\n\t\ttypeof window !== \"undefined\" && callbackState\n\t\t\t? buildLoginCallbackUrl(callbackState, options?.callbackUrl)\n\t\t\t: undefined\n\n\treturn {\n\t\tautoClose: options?.autoClose ?? true,\n\t\tcallbackUrl,\n\t\tcallbackState,\n\t\torigin: parentOrigin,\n\t\tpreferredChannel: params.preferredChannel,\n\t}\n}\n\nfunction appendLoginLaunchHash(\n\turlValue: string,\n\tpayload: ReturnType<typeof buildLoginLaunchPayload>,\n) {\n\tconst hashParams = new URLSearchParams()\n\tif (payload.autoClose === false) {\n\t\thashParams.set(\"ydAutoClose\", \"false\")\n\t}\n\tif (payload.origin) {\n\t\thashParams.set(\"ydOrigin\", payload.origin)\n\t}\n\tif (payload.callbackUrl) {\n\t\thashParams.set(\"ydCallbackUrl\", payload.callbackUrl)\n\t}\n\tif (payload.preferredChannel) {\n\t\thashParams.set(\"ydPreferredChannel\", payload.preferredChannel)\n\t}\n\tconst hash = hashParams.toString()\n\tif (!hash) {\n\t\treturn urlValue\n\t}\n\n\ttry {\n\t\tconst url = new URL(urlValue)\n\t\turl.hash = hash\n\t\treturn url.toString()\n\t} catch (_error) {\n\t\treturn `${urlValue}#${hash}`\n\t}\n}\n\nfunction buildLoginPopupName(payload: LoginLaunchPayload) {\n\treturn `youidian-login:${JSON.stringify(payload)}`\n}\n\nfunction buildLoginUrl(\n\tparams: LoginParams,\n\toptions: LoginUIOptions | undefined,\n\tlaunchPayload: LoginLaunchPayload,\n): string {\n\tconst { appId, baseUrl = \"https://pay.imgto.link\", loginUrl } = params\n\tconst rawBase = (loginUrl || baseUrl).replace(/\\/$/, \"\")\n\tconst parentOrigin = launchPayload.origin\n\n\tlet finalUrl: string\n\ttry {\n\t\tconst url = new URL(rawBase)\n\t\tif (!/\\/auth\\/connect\\/[^/]+$/.test(url.pathname)) {\n\t\t\turl.pathname =\n\t\t\t\t`${url.pathname.replace(/\\/$/, \"\")}/auth/connect/${appId}`.replace(\n\t\t\t\t\t/\\/{2,}/g,\n\t\t\t\t\t\"/\",\n\t\t\t\t)\n\t\t}\n\t\tfinalUrl = url.toString()\n\t} catch (_error) {\n\t\tif (/\\/auth\\/connect\\/[^/]+$/.test(rawBase)) {\n\t\t\tfinalUrl = rawBase\n\t\t} else {\n\t\t\tfinalUrl = `${rawBase}/auth/connect/${appId}`.replace(/\\/{2,}/g, \"/\")\n\t\t}\n\t}\n\n\tfinalUrl = applyLocaleToUrl(finalUrl, getAutoResolvedLocale(params.locale))\n\n\ttry {\n\t\tconst url = new URL(finalUrl)\n\t\tif (params.preferredChannel) {\n\t\t\turl.searchParams.set(\"preferredChannel\", params.preferredChannel)\n\t\t}\n\t\tif (options?.autoClose === false) {\n\t\t\turl.searchParams.set(\"autoClose\", \"false\")\n\t\t}\n\t\tif (parentOrigin) {\n\t\t\turl.searchParams.set(\"origin\", parentOrigin)\n\t\t}\n\t\treturn appendLoginLaunchHash(url.toString(), launchPayload)\n\t} catch (_error) {\n\t\tconst searchParams = new URLSearchParams()\n\t\tif (params.preferredChannel) {\n\t\t\tsearchParams.set(\"preferredChannel\", params.preferredChannel)\n\t\t}\n\t\tif (options?.autoClose === false) {\n\t\t\tsearchParams.set(\"autoClose\", \"false\")\n\t\t}\n\t\tif (parentOrigin) {\n\t\t\tsearchParams.set(\"origin\", parentOrigin)\n\t\t}\n\t\tconst query = searchParams.toString()\n\t\tif (!query) {\n\t\t\treturn appendLoginLaunchHash(finalUrl, launchPayload)\n\t\t}\n\t\tconst separator = finalUrl.includes(\"?\") ? \"&\" : \"?\"\n\t\treturn appendLoginLaunchHash(\n\t\t\t`${finalUrl}${separator}${query}`,\n\t\t\tlaunchPayload,\n\t\t)\n\t}\n}\n\nfunction extractLoginResult(data: LoginEventData): LoginResult {\n\treturn {\n\t\tavatar: data.avatar,\n\t\tchannel: data.channel,\n\t\temail: data.email,\n\t\texpiresAt: data.expiresAt,\n\t\tlegacyCasdoorId: data.legacyCasdoorId,\n\t\tloginToken: data.loginToken,\n\t\tname: data.name,\n\t\tusername: data.username,\n\t\tphoneCountryCode: data.phoneCountryCode,\n\t\tphoneNumber: data.phoneNumber,\n\t\tphoneE164: data.phoneE164,\n\t\tphoneVerifiedAt: data.phoneVerifiedAt,\n\t\tuserId: data.userId,\n\t\twechatOpenId: data.wechatOpenId,\n\t\twechatUnionId: data.wechatUnionId,\n\t}\n}\n\nconst LOGIN_UI_LOG_PREFIX = \"[Youidian LoginUI]\"\nconst LOGIN_CALLBACK_MARKER = \"yd_login_callback\"\nconst LOGIN_CALLBACK_RESULT_PARAM = \"yd_login_result\"\nconst LOGIN_CALLBACK_RETURN_HASH_PARAM = \"yd_login_return_hash\"\nconst LOGIN_CALLBACK_STATE_PARAM = \"yd_login_state\"\nconst LOGIN_CALLBACK_STORAGE_PREFIX = \"yd-login-callback:\"\nconst LOGIN_CALLBACK_CURRENT_PAGE_STORAGE_KEY = \"yd-login-current-page-callback\"\nconst DEFAULT_IFRAME_LOAD_TIMEOUT_MS = 6000\n\ntype LoginLaunchPayload = ReturnType<typeof buildLoginLaunchPayload>\n\nfunction decodeCallbackPayload(value: string): LoginEventData | null {\n\ttry {\n\t\tconst padded = value.padEnd(\n\t\t\tvalue.length + ((4 - (value.length % 4)) % 4),\n\t\t\t\"=\",\n\t\t)\n\t\tconst base64 = padded.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\")\n\t\tconst binary = atob(base64)\n\t\tconst json = decodeURIComponent(\n\t\t\tArray.from(\n\t\t\t\tbinary,\n\t\t\t\t(char) => `%${char.charCodeAt(0).toString(16).padStart(2, \"0\")}`,\n\t\t\t).join(\"\"),\n\t\t)\n\t\tconst parsed = JSON.parse(json) as LoginEventData\n\t\treturn parsed && typeof parsed === \"object\" && parsed.type ? parsed : null\n\t} catch {\n\t\treturn null\n\t}\n}\n\nfunction getLoginCallbackChannelName(state: string) {\n\treturn `youidian-login:${state}`\n}\n\nfunction getLoginCallbackStorageKey(state: string) {\n\treturn `${LOGIN_CALLBACK_STORAGE_PREFIX}${state}`\n}\n\nfunction publishLoginCallback(state: string, data: LoginEventData) {\n\ttry {\n\t\tconst channel = new BroadcastChannel(getLoginCallbackChannelName(state))\n\t\tchannel.postMessage(data)\n\t\tchannel.close()\n\t} catch {\n\t\t// BroadcastChannel is not available in every embedded browser.\n\t}\n\n\ttry {\n\t\tconst storageKey = getLoginCallbackStorageKey(state)\n\t\twindow.localStorage.setItem(storageKey, JSON.stringify(data))\n\t\twindow.setTimeout(() => {\n\t\t\ttry {\n\t\t\t\twindow.localStorage.removeItem(storageKey)\n\t\t\t} catch {\n\t\t\t\t// Ignore cleanup failures.\n\t\t\t}\n\t\t}, 800)\n\t} catch {\n\t\t// localStorage may be disabled; postMessage remains available below.\n\t}\n\n\ttry {\n\t\twindow.opener?.postMessage(data, window.location.origin)\n\t} catch {\n\t\t// opener is only an opportunistic fast path.\n\t}\n}\n\nfunction safeIsPopupClosed(popup: Window | null) {\n\tif (!popup) return true\n\ttry {\n\t\treturn popup.closed\n\t} catch {\n\t\tlogLoginDebug(\"Unable to read popup.closed; treating popup as open\")\n\t\treturn false\n\t}\n}\n\nfunction safeClosePopup(popup: Window | null) {\n\tif (!popup) return\n\ttry {\n\t\tpopup.close()\n\t} catch {\n\t\tlogLoginDebug(\"Unable to close popup\")\n\t}\n}\n\nfunction cleanLoginCallbackUrl(url: URL) {\n\turl.searchParams.delete(LOGIN_CALLBACK_MARKER)\n\turl.searchParams.delete(LOGIN_CALLBACK_STATE_PARAM)\n\tconst returnHash = url.searchParams.get(LOGIN_CALLBACK_RETURN_HASH_PARAM)\n\turl.searchParams.delete(LOGIN_CALLBACK_RETURN_HASH_PARAM)\n\turl.hash = returnHash ? `#${returnHash}` : \"\"\n\treturn url.toString()\n}\n\nfunction saveCurrentPageLoginCallback(data: LoginEventData) {\n\ttry {\n\t\twindow.sessionStorage.setItem(\n\t\t\tLOGIN_CALLBACK_CURRENT_PAGE_STORAGE_KEY,\n\t\t\tJSON.stringify({\n\t\t\t\tcreatedAt: Date.now(),\n\t\t\t\tdata,\n\t\t\t}),\n\t\t)\n\t} catch {\n\t\t// sessionStorage may be disabled in some embedded browsers.\n\t}\n}\n\nfunction readCurrentPageLoginCallback() {\n\ttry {\n\t\tconst raw = window.sessionStorage.getItem(\n\t\t\tLOGIN_CALLBACK_CURRENT_PAGE_STORAGE_KEY,\n\t\t)\n\t\tif (!raw) return null\n\t\twindow.sessionStorage.removeItem(LOGIN_CALLBACK_CURRENT_PAGE_STORAGE_KEY)\n\t\tconst parsed = JSON.parse(raw) as {\n\t\t\tcreatedAt?: number\n\t\t\tdata?: LoginEventData\n\t\t} | null\n\t\tconst data = parsed?.data\n\t\treturn data && typeof data === \"object\" && data.type ? data : null\n\t} catch {\n\t\treturn null\n\t}\n}\n\nfunction deliverLoginCallbackData(\n\tdata: LoginEventData,\n\toptions?: LoginCallbackOptions,\n) {\n\toptions?.onResult?.(data)\n\tswitch (data.type) {\n\t\tcase \"LOGIN_SUCCESS\":\n\t\t\toptions?.onSuccess?.(extractLoginResult(data))\n\t\t\tbreak\n\t\tcase \"LOGIN_ERROR\":\n\t\t\toptions?.onError?.(data.message || data.error, data)\n\t\t\tbreak\n\t\tdefault:\n\t\t\tbreak\n\t}\n}\n\nexport function handleLoginCallbackIfPresent(options?: LoginCallbackOptions) {\n\tif (typeof window === \"undefined\") {\n\t\treturn false\n\t}\n\n\tconst url = new URL(window.location.href)\n\tif (url.searchParams.get(LOGIN_CALLBACK_MARKER) !== \"1\") {\n\t\tif (options?.onResult || options?.onSuccess || options?.onError) {\n\t\t\tconst pendingData = readCurrentPageLoginCallback()\n\t\t\tif (pendingData) {\n\t\t\t\tdeliverLoginCallbackData(pendingData, options)\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t\treturn false\n\t}\n\n\tconst state = url.searchParams.get(LOGIN_CALLBACK_STATE_PARAM) || \"\"\n\tconst hashParams = new URLSearchParams(url.hash.replace(/^#/, \"\"))\n\tconst rawResult = hashParams.get(LOGIN_CALLBACK_RESULT_PARAM)\n\tconst data: LoginEventData | null =\n\t\trawResult && state\n\t\t\t? decodeCallbackPayload(rawResult)\n\t\t\t: {\n\t\t\t\t\ttype: \"LOGIN_ERROR\",\n\t\t\t\t\tmessage: \"Missing login callback result\",\n\t\t\t\t}\n\n\ttry {\n\t\tdocument.documentElement.style.visibility = \"hidden\"\n\t} catch {\n\t\t// This is best-effort to avoid a visible callback-page flash.\n\t}\n\n\tif (state && data) {\n\t\tpublishLoginCallback(state, data)\n\t}\n\tif (data && (options?.onResult || options?.onSuccess || options?.onError)) {\n\t\tdeliverLoginCallbackData(data, options)\n\t} else if (data) {\n\t\tsaveCurrentPageLoginCallback(data)\n\t}\n\n\ttry {\n\t\twindow.history.replaceState(null, \"\", cleanLoginCallbackUrl(url))\n\t} catch {\n\t\t// Ignore history cleanup failures.\n\t}\n\n\tif (options?.autoClose === true) {\n\t\twindow.setTimeout(() => {\n\t\t\ttry {\n\t\t\t\twindow.close()\n\t\t\t} catch {\n\t\t\t\t// Some browsers disallow script-closing the current window.\n\t\t\t}\n\t\t}, 30)\n\t\treturn true\n\t}\n\n\ttry {\n\t\tdocument.documentElement.style.visibility = \"\"\n\t} catch {\n\t\t// Ignore visibility restoration failures.\n\t}\n\n\treturn true\n}\n\nfunction logLoginDebug(message: string, details?: Record<string, unknown>) {\n\tif (typeof console === \"undefined\") return\n\tconsole.debug(LOGIN_UI_LOG_PREFIX, message, details || {})\n}\n\nfunction logLoginInfo(message: string, details?: Record<string, unknown>) {\n\tif (typeof console === \"undefined\") return\n\tconsole.info(LOGIN_UI_LOG_PREFIX, message, details || {})\n}\n\nfunction logLoginWarn(message: string, details?: Record<string, unknown>) {\n\tif (typeof console === \"undefined\") return\n\tconsole.warn(LOGIN_UI_LOG_PREFIX, message, details || {})\n}\n\nfunction getIframeLoadTimeoutMs(options?: LoginUIOptions) {\n\tconst timeout = options?.iframeLoadTimeoutMs\n\tif (typeof timeout !== \"number\" || !Number.isFinite(timeout)) {\n\t\treturn DEFAULT_IFRAME_LOAD_TIMEOUT_MS\n\t}\n\treturn Math.max(0, timeout)\n}\n\nfunction applyLoginPanelStyle(panel: HTMLDivElement) {\n\tObject.assign(panel.style, {\n\t\tposition: \"absolute\",\n\t\tinset: \"0\",\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tjustifyContent: \"center\",\n\t\tborder: \"1px solid rgba(229,229,229,0.92)\",\n\t\tborderRadius: \"28px\",\n\t\tbackground: \"rgba(255,255,255,0.94)\",\n\t\tcolor: \"#0f172a\",\n\t\tpadding: \"24px\",\n\t\ttextAlign: \"center\",\n\t\tzIndex: \"1\",\n\t\tboxShadow: \"0 18px 50px rgba(15,15,15,0.06)\",\n\t\tbackdropFilter: \"blur(16px)\",\n\t})\n}\n\nfunction applyLoginLoadingPanelStyle(panel: HTMLDivElement) {\n\tObject.assign(panel.style, {\n\t\tposition: \"absolute\",\n\t\tinset: \"0\",\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tjustifyContent: \"center\",\n\t\tborder: \"0\",\n\t\tborderRadius: \"28px\",\n\t\tbackground: \"rgba(255,255,255,0.94)\",\n\t\tcolor: \"#0f172a\",\n\t\tpadding: \"24px\",\n\t\ttextAlign: \"center\",\n\t\tzIndex: \"1\",\n\t\tboxShadow: \"none\",\n\t\tbackdropFilter: \"blur(16px)\",\n\t})\n}\n\nfunction createLoginPanelContent() {\n\tconst content = document.createElement(\"div\")\n\tObject.assign(content.style, {\n\t\tmaxWidth: \"360px\",\n\t})\n\n\tconst badge = document.createElement(\"div\")\n\tbadge.textContent = \"YOUiDIAN\"\n\tObject.assign(badge.style, {\n\t\tdisplay: \"inline-flex\",\n\t\talignItems: \"center\",\n\t\tborder: \"1px solid rgba(229,229,229,0.92)\",\n\t\tborderRadius: \"9999px\",\n\t\tbackground: \"#fafafa\",\n\t\tcolor: \"#171717\",\n\t\tfontSize: \"11px\",\n\t\tfontWeight: \"700\",\n\t\tletterSpacing: \"0.22em\",\n\t\tlineHeight: \"1\",\n\t\tmarginBottom: \"18px\",\n\t\tpadding: \"8px 12px\",\n\t})\n\n\tcontent.appendChild(badge)\n\n\treturn content\n}\n\nfunction createBrandLoadingMark() {\n\tconst logo = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\")\n\tlogo.setAttribute(\"viewBox\", \"0 0 1024 1024\")\n\tlogo.setAttribute(\"fill\", \"none\")\n\tlogo.setAttribute(\"aria-hidden\", \"true\")\n\tObject.assign(logo.style, {\n\t\twidth: \"112px\",\n\t\theight: \"112px\",\n\t\tcolor: \"#22c55e\",\n\t\tdisplay: \"block\",\n\t\toverflow: \"visible\",\n\t})\n\n\tconst group = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\")\n\tgroup.setAttribute(\"fill\", \"currentColor\")\n\n\tconst ring = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\")\n\tring.setAttribute(\n\t\t\"d\",\n\t\t\"M704.298 679.54A264 264 0 1 1 704.298 309.46A49 49 0 0 1 634.4 378.149A166 166 0 1 0 634.4 610.851A49 49 0 0 1 704.298 679.54Z\",\n\t)\n\tring.setAttribute(\"class\", \"youidian-sdk-brand-loading__ring\")\n\n\tconst dot = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\")\n\tdot.setAttribute(\"class\", \"youidian-sdk-brand-loading__dot\")\n\tdot.setAttribute(\"cx\", \"714.5\")\n\tdot.setAttribute(\"cy\", \"490.5\")\n\tdot.setAttribute(\"r\", \"68\")\n\n\tgroup.appendChild(ring)\n\tgroup.appendChild(dot)\n\tlogo.appendChild(group)\n\n\treturn logo\n}\n\nfunction createBrandLoadingCopy() {\n\tconst brand = document.createElement(\"div\")\n\tbrand.className = \"youidian-sdk-brand-loading__copy\"\n\tObject.assign(brand.style, {\n\t\tdisplay: \"flex\",\n\t\tflexDirection: \"column\",\n\t\talignItems: \"flex-start\",\n\t\tjustifyContent: \"center\",\n\t\tlineHeight: \"1\",\n\t})\n\n\tconst name = document.createElement(\"div\")\n\tname.className = \"youidian-sdk-brand-loading__name\"\n\tname.textContent = \"优易点\"\n\tObject.assign(name.style, {\n\t\tcolor: \"#0f172a\",\n\t\tfontSize: \"34px\",\n\t\tfontWeight: \"900\",\n\t\tletterSpacing: \"0\",\n\t\tlineHeight: \"1\",\n\t})\n\n\tconst tagline = document.createElement(\"div\")\n\ttagline.className = \"youidian-sdk-brand-loading__tagline\"\n\ttagline.textContent = \"开发者服务中台\"\n\tObject.assign(tagline.style, {\n\t\tcolor: \"#64748b\",\n\t\tfontSize: \"16px\",\n\t\tfontWeight: \"700\",\n\t\tletterSpacing: \"0.24em\",\n\t\tlineHeight: \"1\",\n\t\tmarginTop: \"6px\",\n\t})\n\n\tbrand.appendChild(name)\n\tbrand.appendChild(tagline)\n\treturn brand\n}\n\nfunction createLoginPanelTitle(value: string) {\n\tconst title = document.createElement(\"div\")\n\ttitle.textContent = value\n\tObject.assign(title.style, {\n\t\tcolor: \"#171717\",\n\t\tfontSize: \"18px\",\n\t\tfontWeight: \"700\",\n\t\tlineHeight: \"1.35\",\n\t\tmarginBottom: \"10px\",\n\t})\n\treturn title\n}\n\nfunction createLoginPanelDescription(value: string) {\n\tconst description = document.createElement(\"div\")\n\tdescription.textContent = value\n\tObject.assign(description.style, {\n\t\tcolor: \"#525252\",\n\t\tfontSize: \"14px\",\n\t\tlineHeight: \"1.6\",\n\t\tmarginBottom: \"20px\",\n\t})\n\treturn description\n}\n\nfunction ensureLoginLoadingStyles() {\n\tif (document.getElementById(\"youidian-login-loading-style\")) {\n\t\treturn\n\t}\n\tconst style = document.createElement(\"style\")\n\tstyle.id = \"youidian-login-loading-style\"\n\tstyle.textContent = `\n\t\t.youidian-sdk-brand-loading__ring,\n\t\t.youidian-sdk-brand-loading__dot {\n\t\t\ttransform-box: fill-box;\n\t\t\ttransform-origin: center;\n\t\t\twill-change: opacity, transform;\n\t\t}\n\n\t\t.youidian-sdk-brand-loading__ring {\n\t\t\tanimation: youidian-sdk-brand-loading-ring 1400ms cubic-bezier(0.4, 0, 0.2, 1) infinite;\n\t\t}\n\n\t\t.youidian-sdk-brand-loading__dot {\n\t\t\tanimation: youidian-sdk-brand-loading-dot 1400ms cubic-bezier(0.4, 0, 0.2, 1) infinite;\n\t\t}\n\n\t\t.youidian-sdk-brand-loading__copy {\n\t\t\twill-change: opacity, transform;\n\t\t\tanimation: youidian-sdk-brand-loading-copy 1600ms cubic-bezier(0.4, 0, 0.2, 1) infinite;\n\t\t}\n\n\t\t.youidian-sdk-brand-loading__tagline {\n\t\t\twill-change: opacity;\n\t\t\tanimation: youidian-sdk-brand-loading-tagline 1600ms cubic-bezier(0.4, 0, 0.2, 1) infinite;\n\t\t}\n\n\t\t@keyframes youidian-sdk-brand-loading-ring {\n\t\t\t0%,\n\t\t\t100% {\n\t\t\t\topacity: 0.72;\n\t\t\t\ttransform: rotate(0deg) scale(0.98);\n\t\t\t}\n\t\t\t50% {\n\t\t\t\topacity: 1;\n\t\t\t\ttransform: rotate(8deg) scale(1.02);\n\t\t\t}\n\t\t}\n\n\t\t@keyframes youidian-sdk-brand-loading-dot {\n\t\t\t0%,\n\t\t\t100% {\n\t\t\t\topacity: 0.55;\n\t\t\t\ttransform: scale(0.9);\n\t\t\t}\n\t\t\t50% {\n\t\t\t\topacity: 1;\n\t\t\t\ttransform: scale(1.08);\n\t\t\t}\n\t\t}\n\n\t\t@keyframes youidian-sdk-brand-loading-copy {\n\t\t\t0%,\n\t\t\t100% {\n\t\t\t\topacity: 0.86;\n\t\t\t\ttransform: translateY(0);\n\t\t\t}\n\t\t\t50% {\n\t\t\t\topacity: 1;\n\t\t\t\ttransform: translateY(-1px);\n\t\t\t}\n\t\t}\n\n\t\t@keyframes youidian-sdk-brand-loading-tagline {\n\t\t\t0%,\n\t\t\t100% {\n\t\t\t\topacity: 0.64;\n\t\t\t}\n\t\t\t50% {\n\t\t\t\topacity: 0.92;\n\t\t\t}\n\t\t}\n\n\t\t@media (prefers-reduced-motion: reduce) {\n\t\t\t.youidian-sdk-brand-loading__ring,\n\t\t\t.youidian-sdk-brand-loading__dot,\n\t\t\t.youidian-sdk-brand-loading__copy,\n\t\t\t.youidian-sdk-brand-loading__tagline {\n\t\t\t\tanimation: none;\n\t\t\t\topacity: 1;\n\t\t\t\ttransform: none;\n\t\t\t}\n\t\t}\n\t`\n\tdocument.head.appendChild(style)\n}\n\nfunction createLoginLoadingPanel() {\n\tensureLoginLoadingStyles()\n\tconst panel = document.createElement(\"div\")\n\tapplyLoginLoadingPanelStyle(panel)\n\tpanel.setAttribute(\"role\", \"status\")\n\tpanel.setAttribute(\"aria-label\", \"优易点开发者服务中台\")\n\n\tconst content = document.createElement(\"div\")\n\tObject.assign(content.style, {\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tjustifyContent: \"center\",\n\t\tgap: \"12px\",\n\t})\n\tcontent.appendChild(createBrandLoadingMark())\n\tcontent.appendChild(createBrandLoadingCopy())\n\tpanel.appendChild(content)\n\n\treturn panel\n}\n\nfunction createLoginRedirectingPanel(_options: {\n\tdescription: string\n\ttitle: string\n}) {\n\treturn createLoginLoadingPanel()\n}\n\nfunction createLoginFallbackPanel(options: {\n\tbuttonText: string\n\tdescription: string\n\tonRedirect: () => void\n\ttitle: string\n}) {\n\tconst panel = document.createElement(\"div\")\n\tapplyLoginPanelStyle(panel)\n\n\tconst content = createLoginPanelContent()\n\n\tconst button = document.createElement(\"button\")\n\tbutton.type = \"button\"\n\tbutton.textContent = options.buttonText\n\tObject.assign(button.style, {\n\t\twidth: \"100%\",\n\t\tborder: \"0\",\n\t\tborderRadius: \"12px\",\n\t\tbackground: \"#0a0a0a\",\n\t\tcolor: \"#ffffff\",\n\t\tcursor: \"pointer\",\n\t\tfontSize: \"14px\",\n\t\tfontWeight: \"700\",\n\t\tminHeight: \"44px\",\n\t\tpadding: \"12px 16px\",\n\t\tboxShadow: \"0 12px 28px rgba(17,17,17,0.14)\",\n\t})\n\tbutton.onclick = options.onRedirect\n\n\tcontent.appendChild(createLoginPanelTitle(options.title))\n\tcontent.appendChild(createLoginPanelDescription(options.description))\n\tcontent.appendChild(button)\n\tpanel.appendChild(content)\n\n\treturn panel\n}\n\nexport class LoginUI extends HostedFrameModal<LoginEventData> {\n\tprivate popup: Window | null = null\n\tprivate callbackChannel: BroadcastChannel | null = null\n\tprivate callbackStorageHandler: ((event: StorageEvent) => void) | null = null\n\tprivate popupMessageHandler: ((event: MessageEvent) => void) | null = null\n\tprivate closeMonitor: number | null = null\n\tprivate iframeFallbackPanel: HTMLDivElement | null = null\n\tprivate iframeLoadingPanel: HTMLDivElement | null = null\n\tprivate iframeLoadTimer: number | null = null\n\tprivate iframeRedirectTimer: number | null = null\n\tprivate iframeReady = false\n\tprivate completed = false\n\n\tprivate cleanup() {\n\t\tif (this.callbackChannel) {\n\t\t\tthis.callbackChannel.close()\n\t\t}\n\t\tif (typeof window !== \"undefined\" && this.callbackStorageHandler) {\n\t\t\twindow.removeEventListener(\"storage\", this.callbackStorageHandler)\n\t\t}\n\t\tif (typeof window !== \"undefined\" && this.popupMessageHandler) {\n\t\t\twindow.removeEventListener(\"message\", this.popupMessageHandler)\n\t\t}\n\t\tthis.callbackChannel = null\n\t\tthis.callbackStorageHandler = null\n\t\tif (typeof window !== \"undefined\" && this.closeMonitor) {\n\t\t\twindow.clearInterval(this.closeMonitor)\n\t\t}\n\t\tif (typeof window !== \"undefined\" && this.iframeLoadTimer) {\n\t\t\twindow.clearTimeout(this.iframeLoadTimer)\n\t\t}\n\t\tif (typeof window !== \"undefined\" && this.iframeRedirectTimer) {\n\t\t\twindow.clearTimeout(this.iframeRedirectTimer)\n\t\t}\n\t\tif (this.iframeFallbackPanel?.parentNode) {\n\t\t\tthis.iframeFallbackPanel.parentNode.removeChild(this.iframeFallbackPanel)\n\t\t}\n\t\tif (this.iframeLoadingPanel?.parentNode) {\n\t\t\tthis.iframeLoadingPanel.parentNode.removeChild(this.iframeLoadingPanel)\n\t\t}\n\t\tthis.popupMessageHandler = null\n\t\tthis.closeMonitor = null\n\t\tthis.iframeFallbackPanel = null\n\t\tthis.iframeLoadingPanel = null\n\t\tthis.iframeLoadTimer = null\n\t\tthis.iframeRedirectTimer = null\n\t\tthis.iframeReady = false\n\t\tthis.popup = null\n\t\tthis.completed = false\n\t}\n\n\tprivate markIframeReady() {\n\t\tif (this.iframeReady) return\n\t\tthis.iframeReady = true\n\t\tif (typeof window !== \"undefined\" && this.iframeLoadTimer) {\n\t\t\twindow.clearTimeout(this.iframeLoadTimer)\n\t\t\tthis.iframeLoadTimer = null\n\t\t}\n\t\tif (typeof window !== \"undefined\" && this.iframeRedirectTimer) {\n\t\t\twindow.clearTimeout(this.iframeRedirectTimer)\n\t\t\tthis.iframeRedirectTimer = null\n\t\t}\n\t\tif (this.iframeFallbackPanel?.parentNode) {\n\t\t\tthis.iframeFallbackPanel.parentNode.removeChild(this.iframeFallbackPanel)\n\t\t}\n\t\tif (this.iframeLoadingPanel?.parentNode) {\n\t\t\tthis.iframeLoadingPanel.parentNode.removeChild(this.iframeLoadingPanel)\n\t\t}\n\t\tthis.iframeFallbackPanel = null\n\t\tthis.iframeLoadingPanel = null\n\t}\n\n\tprivate showIframeLoading(container: HTMLDivElement) {\n\t\tif (this.iframeLoadingPanel || this.iframeReady) {\n\t\t\treturn\n\t\t}\n\n\t\tconst panel = createLoginLoadingPanel()\n\t\tthis.iframeLoadingPanel = panel\n\t\tcontainer.appendChild(panel)\n\t}\n\n\tprivate showIframeFallback(options: {\n\t\tcontainer: HTMLDivElement\n\t\tfinalUrl: string\n\t\tlaunchPayload: LoginLaunchPayload\n\t\tloginOptions?: LoginUIOptions\n\t}) {\n\t\tif (this.iframeReady || this.iframeFallbackPanel) {\n\t\t\treturn\n\t\t}\n\n\t\tconst { container, finalUrl, loginOptions } = options\n\t\tlogLoginWarn(\"Hosted login iframe did not report ready in time\", {\n\t\t\tloginUrl: finalUrl,\n\t\t})\n\t\tif (this.iframeLoadingPanel?.parentNode) {\n\t\t\tthis.iframeLoadingPanel.parentNode.removeChild(this.iframeLoadingPanel)\n\t\t}\n\t\tthis.iframeLoadingPanel = null\n\n\t\tif (loginOptions?.fallbackRedirectMode === \"auto\") {\n\t\t\tconst panel = createLoginRedirectingPanel({\n\t\t\t\tdescription:\n\t\t\t\t\tloginOptions?.fallbackDescription ||\n\t\t\t\t\t\"The embedded login page is taking longer than expected. Redirecting you to the login page now.\",\n\t\t\t\ttitle: loginOptions?.fallbackTitle || \"Redirecting to login page\",\n\t\t\t})\n\t\t\tthis.iframeFallbackPanel = panel\n\t\t\tcontainer.appendChild(panel)\n\t\t\tloginOptions?.onFallbackVisible?.()\n\t\t\tthis.iframeRedirectTimer = window.setTimeout(() => {\n\t\t\t\tthis.iframeRedirectTimer = null\n\t\t\t\tlogLoginInfo(\"Redirecting to hosted login fallback page\", {\n\t\t\t\t\tloginUrl: finalUrl,\n\t\t\t\t})\n\t\t\t\twindow.location.assign(finalUrl)\n\t\t\t}, 350)\n\t\t\treturn\n\t\t}\n\n\t\tconst panel = createLoginFallbackPanel({\n\t\t\tbuttonText: loginOptions?.fallbackButtonText || \"Continue to login\",\n\t\t\tdescription:\n\t\t\t\tloginOptions?.fallbackDescription ||\n\t\t\t\t\"The embedded login page is taking longer than expected. Continue on the login page to finish signing in.\",\n\t\t\ttitle: loginOptions?.fallbackTitle || \"Login page is still loading\",\n\t\t\tonRedirect: () => {\n\t\t\t\tlogLoginInfo(\"Redirecting to hosted login fallback page\", {\n\t\t\t\t\tloginUrl: finalUrl,\n\t\t\t\t})\n\t\t\t\twindow.location.assign(finalUrl)\n\t\t\t},\n\t\t})\n\n\t\tthis.iframeFallbackPanel = panel\n\t\tcontainer.appendChild(panel)\n\t\tloginOptions?.onFallbackVisible?.()\n\t}\n\n\tprivate startIframeWatchdog(options: {\n\t\tcontainer: HTMLDivElement\n\t\tfinalUrl: string\n\t\tlaunchPayload: LoginLaunchPayload\n\t\tloginOptions?: LoginUIOptions\n\t}) {\n\t\tif (typeof window === \"undefined\") return\n\n\t\tconst timeoutMs = getIframeLoadTimeoutMs(options.loginOptions)\n\t\tif (timeoutMs === 0) {\n\t\t\tthis.showIframeFallback(options)\n\t\t\treturn\n\t\t}\n\n\t\tthis.iframeLoadTimer = window.setTimeout(() => {\n\t\t\tthis.iframeLoadTimer = null\n\t\t\tthis.showIframeFallback(options)\n\t\t}, timeoutMs)\n\t}\n\n\tprivate handleLoginEvent(data: LoginEventData, options?: LoginUIOptions) {\n\t\tif (!data || typeof data !== \"object\" || !data.type) {\n\t\t\tlogLoginDebug(\"Ignored non-login event payload\")\n\t\t\treturn\n\t\t}\n\n\t\tlogLoginInfo(\"Received login event\", {\n\t\t\ttype: data.type,\n\t\t})\n\n\t\tswitch (data.type) {\n\t\t\tcase \"LOGIN_READY\":\n\t\t\t\tbreak\n\t\t\tcase \"LOGIN_SUCCESS\":\n\t\t\t\tif (this.completed) {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tthis.completed = true\n\t\t\t\tlogLoginInfo(\"Login succeeded\", {\n\t\t\t\t\tchannel: data.channel || null,\n\t\t\t\t\tuserId: data.userId || null,\n\t\t\t\t})\n\t\t\t\toptions?.onSuccess?.(extractLoginResult(data))\n\t\t\t\tbreak\n\t\t\tcase \"LOGIN_CANCELLED\":\n\t\t\t\tlogLoginInfo(\"Login cancelled\")\n\t\t\t\toptions?.onCancel?.()\n\t\t\t\tbreak\n\t\t\tcase \"LOGIN_RESIZE\":\n\t\t\t\tbreak\n\t\t\tcase \"LOGIN_REDIRECT_REQUIRED\":\n\t\t\t\tif (!isValidLoginRedirectUrl(data.authUrl)) {\n\t\t\t\t\tlogLoginWarn(\"Login redirect requested with invalid authUrl\")\n\t\t\t\t\toptions?.onError?.(\"Login redirect URL is invalid\", data)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tlogLoginInfo(\"Login redirect requested by hosted page\", {\n\t\t\t\t\tattemptId: data.attemptId || null,\n\t\t\t\t\tchannel: data.channel || null,\n\t\t\t\t\tauthUrl: data.authUrl,\n\t\t\t\t})\n\t\t\t\tthis.close()\n\t\t\t\twindow.location.assign(data.authUrl)\n\t\t\t\tbreak\n\t\t\tcase \"LOGIN_ERROR\":\n\t\t\t\tif (this.completed) {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tlogLoginWarn(\"Login flow reported an error\", {\n\t\t\t\t\tmessage: data.message || data.error || null,\n\t\t\t\t})\n\t\t\t\toptions?.onError?.(data.message || data.error, data)\n\t\t\t\tbreak\n\t\t\tcase \"LOGIN_CLOSE\":\n\t\t\t\tif (options?.autoClose === false) {\n\t\t\t\t\tlogLoginInfo(\n\t\t\t\t\t\t\"Login surface requested close; autoClose disabled, keeping it open\",\n\t\t\t\t\t)\n\t\t\t\t\toptions?.onClose?.()\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tlogLoginInfo(\"Login surface requested close; autoClose enabled\")\n\t\t\t\tthis.close()\n\t\t\t\toptions?.onClose?.()\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\tprivate openLoginRedirect(params: LoginParams, options?: LoginUIOptions) {\n\t\tif (typeof window === \"undefined\") return\n\n\t\tconst { callbackState, finalUrl, launchPayload } = this.buildOpenContext(\n\t\t\tparams,\n\t\t\toptions,\n\t\t)\n\t\tlogLoginInfo(\"Redirecting to hosted login page\", {\n\t\t\tappId: params.appId,\n\t\t\tcallbackState,\n\t\t\tcallbackUrl: launchPayload.callbackUrl || null,\n\t\t\thasCallbackUrl: Boolean(launchPayload.callbackUrl),\n\t\t\tloginUrl: finalUrl,\n\t\t\tautoClose: options?.autoClose ?? true,\n\t\t\tdisplayMode: \"redirect\",\n\t\t\tpageUrl: window.location.href,\n\t\t\tparentOrigin: launchPayload.origin || null,\n\t\t})\n\t\twindow.location.assign(finalUrl)\n\t}\n\n\tprivate listenForLoginCallback(\n\t\tcallbackState: string,\n\t\toptions?: LoginUIOptions,\n\t) {\n\t\ttry {\n\t\t\tthis.callbackChannel = new BroadcastChannel(\n\t\t\t\tgetLoginCallbackChannelName(callbackState),\n\t\t\t)\n\t\t\tthis.callbackChannel.onmessage = (event) => {\n\t\t\t\tthis.handleLoginEvent(event.data as LoginEventData, options)\n\t\t\t\tthis.handleLoginEvent({ type: \"LOGIN_CLOSE\" }, options)\n\t\t\t}\n\t\t} catch {\n\t\t\tlogLoginDebug(\"BroadcastChannel is unavailable for login callback\")\n\t\t}\n\n\t\tthis.callbackStorageHandler = (event: StorageEvent) => {\n\t\t\tif (\n\t\t\t\tevent.key !== getLoginCallbackStorageKey(callbackState) ||\n\t\t\t\t!event.newValue\n\t\t\t) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst data = JSON.parse(event.newValue) as LoginEventData\n\t\t\t\tthis.handleLoginEvent(data, options)\n\t\t\t\tthis.handleLoginEvent({ type: \"LOGIN_CLOSE\" }, options)\n\t\t\t} catch {\n\t\t\t\tlogLoginWarn(\"Failed to parse login callback storage payload\")\n\t\t\t}\n\t\t}\n\t\twindow.addEventListener(\"storage\", this.callbackStorageHandler)\n\t}\n\n\tclose() {\n\t\tlogLoginInfo(\"close() called\", {\n\t\t\thasModal: Boolean(this.modal),\n\t\t\thasPopup: Boolean(this.popup),\n\t\t\tpopupClosed: safeIsPopupClosed(this.popup),\n\t\t})\n\t\tsafeClosePopup(this.popup)\n\t\tsuper.close()\n\t\tthis.cleanup()\n\t}\n\n\tprivate buildOpenContext(params: LoginParams, options?: LoginUIOptions) {\n\t\tconst callbackState = createLoginCallbackState()\n\t\tconst launchPayload = buildLoginLaunchPayload(\n\t\t\tparams,\n\t\t\toptions,\n\t\t\tcallbackState,\n\t\t)\n\t\tconst finalUrl = buildLoginUrl(params, options, launchPayload)\n\t\treturn { callbackState, finalUrl, launchPayload }\n\t}\n\n\tprivate openLoginModal(params: LoginParams, options?: LoginUIOptions) {\n\t\tif (typeof document === \"undefined\") return\n\t\tif (this.modal) return\n\n\t\tconst { callbackState, finalUrl, launchPayload } = this.buildOpenContext(\n\t\t\tparams,\n\t\t\toptions,\n\t\t)\n\t\tconst loginOrigin = getOrigin(finalUrl)\n\t\tlogLoginInfo(\"Opening hosted login iframe modal\", {\n\t\t\tappId: params.appId,\n\t\t\tcallbackState,\n\t\t\tcallbackUrl: launchPayload.callbackUrl || null,\n\t\t\thasCallbackUrl: Boolean(launchPayload.callbackUrl),\n\t\t\tloginUrl: finalUrl,\n\t\t\tallowedOrigin: options?.allowedOrigin || null,\n\t\t\tautoClose: options?.autoClose ?? true,\n\t\t\tdisplayMode: \"modal\",\n\t\t\tpageUrl: typeof window !== \"undefined\" ? window.location.href : null,\n\t\t\tparentOrigin: launchPayload.origin || null,\n\t\t})\n\n\t\tthis.completed = false\n\t\tthis.iframeReady = false\n\t\tthis.listenForLoginCallback(callbackState, options)\n\t\tconst hostedFrame = this.openHostedFrame(finalUrl, {\n\t\t\tallowedOrigin: options?.allowedOrigin || loginOrigin || undefined,\n\t\t\theight: \"min(760px, 94vh)\",\n\t\t\tonCloseButton: () => {\n\t\t\t\toptions?.onCancel?.()\n\t\t\t\toptions?.onClose?.()\n\t\t\t},\n\t\t\tonMessage: (data, _container, event) => {\n\t\t\t\tconst isIframeEvent = event.source === this.iframe?.contentWindow\n\t\t\t\t// 诊断:LOGIN_READY/LOGIN_RESIZE 到达但 event.source 不匹配当前 iframe\n\t\t\t\t// 时,markIframeReady 不会执行,loading 面板会卡住直至 6s fallback。\n\t\t\t\t// 这类「iframe 不出现」曾无任何日志,加 warn 便于线上定位根因\n\t\t\t\t// (常见诱因:iframe 加载了被缓存/重定向的旧文档导致 contentWindow\n\t\t\t\t// 身份变化,或同一页面挂了多个 SDK 实例)。\n\t\t\t\tif (\n\t\t\t\t\t!isIframeEvent &&\n\t\t\t\t\t(data.type === \"LOGIN_READY\" || data.type === \"LOGIN_RESIZE\")\n\t\t\t\t) {\n\t\t\t\t\tlogLoginWarn(\n\t\t\t\t\t\t\"Login lifecycle event ignored: event.source does not match iframe contentWindow\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: data.type,\n\t\t\t\t\t\t\teventOrigin: event.origin,\n\t\t\t\t\t\t\thasIframe: Boolean(this.iframe),\n\t\t\t\t\t\t\thasIframeContentWindow: Boolean(this.iframe?.contentWindow),\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\t(isIframeEvent &&\n\t\t\t\t\t\t(data.type === \"LOGIN_READY\" || data.type === \"LOGIN_RESIZE\")) ||\n\t\t\t\t\tdata.type === \"LOGIN_SUCCESS\" ||\n\t\t\t\t\tdata.type === \"LOGIN_ERROR\"\n\t\t\t\t) {\n\t\t\t\t\tthis.markIframeReady()\n\t\t\t\t}\n\t\t\t\tthis.handleLoginEvent(data, options)\n\t\t\t},\n\t\t\twidth: \"min(520px, 100%)\",\n\t\t})\n\n\t\tif (hostedFrame) {\n\t\t\tthis.showIframeLoading(hostedFrame.container)\n\t\t\tthis.startIframeWatchdog({\n\t\t\t\tcontainer: hostedFrame.container,\n\t\t\t\tfinalUrl,\n\t\t\t\tlaunchPayload,\n\t\t\t\tloginOptions: options,\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate openLoginPopup(params: LoginParams, options?: LoginUIOptions) {\n\t\tif (typeof window === \"undefined\") return\n\t\tif (this.popup && !safeIsPopupClosed(this.popup)) return\n\n\t\tconst { callbackState, finalUrl, launchPayload } = this.buildOpenContext(\n\t\t\tparams,\n\t\t\toptions,\n\t\t)\n\t\tlogLoginInfo(\"Opening hosted login popup\", {\n\t\t\tappId: params.appId,\n\t\t\tcallbackState,\n\t\t\tcallbackUrl: launchPayload.callbackUrl || null,\n\t\t\thasCallbackUrl: Boolean(launchPayload.callbackUrl),\n\t\t\tloginUrl: finalUrl,\n\t\t\tallowedOrigin: options?.allowedOrigin || null,\n\t\t\tautoClose: options?.autoClose ?? true,\n\t\t\tdisplayMode: \"popup\",\n\t\t\tpageUrl: typeof window !== \"undefined\" ? window.location.href : null,\n\t\t\tparentOrigin: launchPayload.origin || null,\n\t\t})\n\t\tconst popupWidth = 520\n\t\tconst popupHeight = 720\n\t\tconst left = Math.max(\n\t\t\t0,\n\t\t\tMath.round(window.screenX + (window.outerWidth - popupWidth) / 2),\n\t\t)\n\t\tconst top = Math.max(\n\t\t\t0,\n\t\t\tMath.round(window.screenY + (window.outerHeight - popupHeight) / 2),\n\t\t)\n\t\tconst features = [\n\t\t\t\"popup=yes\",\n\t\t\t`width=${popupWidth}`,\n\t\t\t`height=${popupHeight}`,\n\t\t\t`left=${left}`,\n\t\t\t`top=${top}`,\n\t\t\t\"resizable=yes\",\n\t\t\t\"scrollbars=yes\",\n\t\t].join(\",\")\n\n\t\tconst popupName = buildLoginPopupName(launchPayload)\n\t\tconst popup = window.open(finalUrl, popupName, features)\n\t\tif (!popup) {\n\t\t\tlogLoginWarn(\"Popup blocked by the browser\")\n\t\t\toptions?.onError?.(\"Login popup was blocked\")\n\t\t\treturn\n\t\t}\n\n\t\tthis.popup = popup\n\t\tthis.completed = false\n\t\tthis.listenForLoginCallback(callbackState, options)\n\n\t\tconst allowedOrigin = options?.allowedOrigin\n\t\tconst popupOrigin = getOrigin(finalUrl)\n\n\t\tthis.popupMessageHandler = (event: MessageEvent) => {\n\t\t\tif (\n\t\t\t\tallowedOrigin &&\n\t\t\t\tallowedOrigin !== \"*\" &&\n\t\t\t\tevent.origin !== allowedOrigin\n\t\t\t) {\n\t\t\t\tlogLoginWarn(\"Ignored message due to allowedOrigin mismatch\", {\n\t\t\t\t\tallowedOrigin,\n\t\t\t\t\teventOrigin: event.origin,\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (!allowedOrigin && popupOrigin && event.origin !== popupOrigin) {\n\t\t\t\tlogLoginWarn(\"Ignored message due to popup origin mismatch\", {\n\t\t\t\t\texpectedOrigin: popupOrigin,\n\t\t\t\t\teventOrigin: event.origin,\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst data = event.data as LoginEventData\n\t\t\tif (!data || typeof data !== \"object\" || !data.type) {\n\t\t\t\tlogLoginDebug(\"Ignored non-login postMessage payload\")\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tlogLoginInfo(\"Received login event\", {\n\t\t\t\ttype: data.type,\n\t\t\t\teventOrigin: event.origin,\n\t\t\t})\n\n\t\t\tthis.handleLoginEvent(data, options)\n\t\t}\n\n\t\twindow.addEventListener(\"message\", this.popupMessageHandler)\n\n\t\tif (options?.monitorPopupClosed === true) {\n\t\t\tthis.closeMonitor = window.setInterval(() => {\n\t\t\t\tif (!this.popup || safeIsPopupClosed(this.popup)) {\n\t\t\t\t\tconst shouldTreatAsCancel = !this.completed\n\t\t\t\t\tlogLoginInfo(\"Detected popup closed\", {\n\t\t\t\t\t\tshouldTreatAsCancel,\n\t\t\t\t\t})\n\t\t\t\t\tthis.cleanup()\n\t\t\t\t\tif (shouldTreatAsCancel) {\n\t\t\t\t\t\toptions?.onCancel?.()\n\t\t\t\t\t}\n\t\t\t\t\toptions?.onClose?.()\n\t\t\t\t}\n\t\t\t}, 500)\n\t\t}\n\t}\n\n\topenLogin(params: LoginParams, options?: LoginUIOptions) {\n\t\tif (typeof window === \"undefined\") return\n\n\t\tconst displayMode = options?.displayMode ?? \"auto\"\n\t\tif (displayMode === \"redirect\") {\n\t\t\tthis.openLoginRedirect(params, options)\n\t\t\treturn\n\t\t}\n\t\tif (displayMode === \"popup\") {\n\t\t\tthis.openLoginPopup(params, options)\n\t\t\treturn\n\t\t}\n\t\tif (\n\t\t\tdisplayMode === \"auto\" &&\n\t\t\tdetectLoginEnvironment().shouldUseRedirectLogin\n\t\t) {\n\t\t\tthis.openLoginRedirect(params, options)\n\t\t\treturn\n\t\t}\n\t\tthis.openLoginModal(params, options)\n\t}\n}\n\nexport function createLoginUI(): LoginUI {\n\treturn new LoginUI()\n}\n\nhandleLoginCallbackIfPresent({ autoClose: false })\n"],"mappings":"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","names":["panel"]}
|
|
1
|
+
{"version":3,"sources":["../src/client.ts","../src/brand-logo.ts","../src/hosted-modal.ts","../src/environment.ts","../src/login.ts"],"sourcesContent":["/**\n * Youidian Payment SDK - Client Module\n * 用于浏览器端集成,包含支付弹窗、状态轮询等功能\n * 不依赖 Node.js crypto 模块\n */\n\nimport { createSdkBrandLogo } from \"./brand-logo\"\nimport {\n\tapplyLocaleToUrl,\n\tgetAutoResolvedLocale,\n\tHostedFrameModal,\n} from \"./hosted-modal\"\n\n/**\n * Payment event types from checkout pages\n */\nexport type PaymentEventType =\n\t| \"PAYMENT_READY\"\n\t| \"PAYMENT_SUCCESS\"\n\t| \"PAYMENT_CANCELLED\"\n\t| \"PAYMENT_CLOSE\"\n\t| \"PAYMENT_RESIZE\"\n\t| \"PAYMENT_STARTED\"\n\n/**\n * Payment event data from postMessage\n */\nexport interface PaymentEventData {\n\ttype: PaymentEventType\n\torderId?: string\n\theight?: number\n}\n\n/**\n * Order status response\n */\nexport interface OrderStatus {\n\torderId: string\n\tstatus: \"PENDING\" | \"PAID\" | \"CANCELLED\" | \"REFUNDED\" | \"FAILED\"\n\tpaidAt?: string\n\tchannelTransactionId?: string\n}\n\nexport interface PaymentUIThemeColors {\n\tprimary?: string\n\tsecondary?: string\n\tforeground?: string\n\tmuted?: string\n\tsurface?: string\n}\n\n/**\n * Payment UI Options\n */\nexport interface PaymentUIOptions {\n\tlocale?: string\n\tonSuccess?: (orderId?: string) => void\n\tonCancel?: (orderId?: string) => void\n\tonClose?: () => void\n\tonFallbackBlocked?: (url: string) => void\n\tonFallbackOpen?: (url: string) => void\n\tonFallbackVisible?: () => void\n\t/** Origin to validate postMessage (defaults to '*', set for security) */\n\tallowedOrigin?: string\n\t/** Theme colors for SDK fallback/loading chrome. Defaults to Youidian green. */\n\ttheme?: PaymentUIThemeColors\n\t/** Text for the fallback button shown when the checkout iframe is slow. */\n\tfallbackButtonText?: string\n\t/** Text for retrying the embedded checkout iframe. */\n\tfallbackRetryText?: string\n\t/** How long to wait for PAYMENT_READY or PAYMENT_RESIZE. Defaults to 8000ms. */\n\tiframeLoadTimeoutMs?: number\n\t/** Description shown while the hosted checkout iframe is loading. */\n\tloadingDescription?: string\n\t/** Title shown while the hosted checkout iframe is loading. */\n\tloadingTitle?: string\n}\n\nconst DEFAULT_PAYMENT_IFRAME_LOAD_TIMEOUT_MS = 8000\nconst PAYMENT_UI_LOG_PREFIX = \"[Youidian PaymentUI]\"\n\ntype ResolvedPaymentTheme = {\n\tforeground: string\n\tmuted: string\n\tprimary: string\n\tprimary10: string\n\tprimary14: string\n\tprimary20: string\n\tprimary28: string\n\tprimary36: string\n\tprimary64: string\n\tsecondary: string\n\tsurface: string\n}\n\nfunction hexToRgb(value: string) {\n\tconst normalized = value.trim().replace(/^#/, \"\")\n\tif (!/^[0-9a-f]{3}([0-9a-f]{3})?$/i.test(normalized)) return null\n\tconst hex =\n\t\tnormalized.length === 3\n\t\t\t? normalized\n\t\t\t\t\t.split(\"\")\n\t\t\t\t\t.map((char) => `${char}${char}`)\n\t\t\t\t\t.join(\"\")\n\t\t\t: normalized\n\tconst number = Number.parseInt(hex, 16)\n\treturn {\n\t\tb: number & 255,\n\t\tg: (number >> 8) & 255,\n\t\tr: (number >> 16) & 255,\n\t}\n}\n\nfunction alphaColor(value: string, alpha: number) {\n\tconst rgb = hexToRgb(value)\n\tif (!rgb)\n\t\treturn `color-mix(in srgb, ${value} ${Math.round(alpha * 100)}%, transparent)`\n\treturn `rgba(${rgb.r},${rgb.g},${rgb.b},${alpha})`\n}\n\nfunction resolvePaymentTheme(options?: PaymentUIOptions): ResolvedPaymentTheme {\n\tconst primary = options?.theme?.primary || \"#16a34a\"\n\tconst secondary =\n\t\toptions?.theme?.secondary || \"color-mix(in srgb, #16a34a 78%, white)\"\n\tconst foreground = options?.theme?.foreground || \"#0f172a\"\n\tconst muted = options?.theme?.muted || \"#64748b\"\n\tconst surface = options?.theme?.surface || \"#ffffff\"\n\n\treturn {\n\t\tforeground,\n\t\tmuted,\n\t\tprimary,\n\t\tprimary10: alphaColor(primary, 0.1),\n\t\tprimary14: alphaColor(primary, 0.14),\n\t\tprimary20: alphaColor(primary, 0.2),\n\t\tprimary28: alphaColor(primary, 0.28),\n\t\tprimary36: alphaColor(primary, 0.36),\n\t\tprimary64: alphaColor(primary, 0.64),\n\t\tsecondary,\n\t\tsurface,\n\t}\n}\n\nfunction logPaymentInfo(message: string, details?: Record<string, unknown>) {\n\tif (typeof console === \"undefined\") return\n\tconsole.info(PAYMENT_UI_LOG_PREFIX, message, details || {})\n}\n\nfunction logPaymentWarn(message: string, details?: Record<string, unknown>) {\n\tif (typeof console === \"undefined\") return\n\tconsole.warn(PAYMENT_UI_LOG_PREFIX, message, details || {})\n}\n\nfunction getPaymentIframeLoadTimeoutMs(options?: PaymentUIOptions) {\n\tconst timeout = options?.iframeLoadTimeoutMs\n\tif (typeof timeout !== \"number\" || !Number.isFinite(timeout)) {\n\t\treturn DEFAULT_PAYMENT_IFRAME_LOAD_TIMEOUT_MS\n\t}\n\treturn Math.max(0, timeout)\n}\n\nfunction isChinesePaymentLocale(locale?: string) {\n\treturn locale?.toLowerCase().startsWith(\"zh\") || false\n}\n\nfunction getPaymentFallbackText(options?: PaymentUIOptions) {\n\tconst isChinese = isChinesePaymentLocale(options?.locale)\n\treturn {\n\t\tbuttonText:\n\t\t\toptions?.fallbackButtonText ||\n\t\t\t(isChinese ? \"在新页面中打开\" : \"Open in new page\"),\n\t\tdescription: isChinese\n\t\t\t? \"当前网络可能较慢,建议重新尝试或在新页面中打开,以获得更流畅的支付体验。\"\n\t\t\t: \"Your network may be slow. Try again or open the payment page in a new page to continue.\",\n\t\tretryText:\n\t\t\toptions?.fallbackRetryText || (isChinese ? \"重新尝试\" : \"Try again\"),\n\t\ttitle: isChinese ? \"支付页面打开较慢\" : \"Payment page is taking longer\",\n\t}\n}\n\nfunction getPaymentBrandText(options?: PaymentUIOptions) {\n\tconst isChinese = isChinesePaymentLocale(options?.locale)\n\treturn {\n\t\tlanguage: isChinese ? \"zh\" : \"en\",\n\t\tname: isChinese ? \"优易点\" : \"Youidian\",\n\t\tsubtitle: isChinese ? \"开发者服务平台\" : \"Developer Service Platform\",\n\t}\n}\n\nfunction getPaymentBrandLoadingText(options?: PaymentUIOptions) {\n\tconst isChinese = isChinesePaymentLocale(options?.locale)\n\treturn {\n\t\tlanguage: isChinese ? \"zh\" : \"en\",\n\t\tname: isChinese ? \"优易点\" : \"Youidian\",\n\t\tsubtitle: isChinese ? \"开发者服务中台\" : \"Developer Service\",\n\t}\n}\n\nfunction getPaymentLoadingText(options?: PaymentUIOptions) {\n\tconst isChinese = isChinesePaymentLocale(options?.locale)\n\treturn (\n\t\toptions?.loadingTitle ||\n\t\toptions?.loadingDescription ||\n\t\t(isChinese ? \"加载中...\" : \"Loading...\")\n\t)\n}\n\nfunction applyPaymentPanelStyle(\n\tpanel: HTMLDivElement,\n\ttheme: ResolvedPaymentTheme,\n) {\n\tObject.assign(panel.style, {\n\t\tposition: \"absolute\",\n\t\tinset: \"0\",\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tjustifyContent: \"center\",\n\t\tborderRadius: \"28px\",\n\t\tbackground: `linear-gradient(180deg, ${theme.surface} 0%, rgba(248,250,252,0.98) 100%)`,\n\t\tcolor: theme.foreground,\n\t\tpadding: \"28px 24px\",\n\t\ttextAlign: \"center\",\n\t\tzIndex: \"1\",\n\t\tboxShadow: \"none\",\n\t\tbackdropFilter: \"blur(16px)\",\n\t})\n}\n\nfunction createPaymentIcon(type: \"external\" | \"refresh\" | \"slow\") {\n\tconst svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\")\n\tsvg.setAttribute(\"viewBox\", \"0 0 24 24\")\n\tsvg.setAttribute(\"fill\", \"none\")\n\tsvg.setAttribute(\"aria-hidden\", \"true\")\n\tObject.assign(svg.style, {\n\t\tdisplay: \"block\",\n\t\tflex: \"0 0 auto\",\n\t})\n\n\tconst paths =\n\t\ttype === \"external\"\n\t\t\t? [\n\t\t\t\t\t\"M7 17L17 7\",\n\t\t\t\t\t\"M10 7H17V14\",\n\t\t\t\t\t\"M6.5 6.5H5.5A2.5 2.5 0 0 0 3 9V18.5A2.5 2.5 0 0 0 5.5 21H15A2.5 2.5 0 0 0 17.5 18.5V17.5\",\n\t\t\t\t]\n\t\t\t: type === \"refresh\"\n\t\t\t\t? [\n\t\t\t\t\t\t\"M20 6V11H15\",\n\t\t\t\t\t\t\"M4 18V13H9\",\n\t\t\t\t\t\t\"M18.2 9A7 7 0 0 0 6.2 6.6L4 9\",\n\t\t\t\t\t\t\"M5.8 15A7 7 0 0 0 17.8 17.4L20 15\",\n\t\t\t\t\t]\n\t\t\t\t: [\"M12 7V12L15 14\", \"M21 12A9 9 0 1 1 3 12A9 9 0 0 1 21 12\"]\n\n\tfor (const value of paths) {\n\t\tconst path = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\")\n\t\tpath.setAttribute(\"d\", value)\n\t\tpath.setAttribute(\"stroke\", \"currentColor\")\n\t\tpath.setAttribute(\"stroke-width\", \"2\")\n\t\tpath.setAttribute(\"stroke-linecap\", \"round\")\n\t\tpath.setAttribute(\"stroke-linejoin\", \"round\")\n\t\tsvg.appendChild(path)\n\t}\n\n\treturn svg\n}\n\nfunction createPaymentFallbackArtwork(theme: ResolvedPaymentTheme) {\n\tconst artwork = document.createElement(\"div\")\n\tObject.assign(artwork.style, {\n\t\theight: \"164px\",\n\t\tmargin: \"0 auto 34px\",\n\t\tposition: \"relative\",\n\t\twidth: \"184px\",\n\t})\n\n\tconst wash = document.createElement(\"div\")\n\tObject.assign(wash.style, {\n\t\tposition: \"absolute\",\n\t\tleft: \"16px\",\n\t\ttop: \"20px\",\n\t\twidth: \"152px\",\n\t\theight: \"126px\",\n\t\tborderRadius: \"48% 52% 43% 57% / 54% 42% 58% 46%\",\n\t\tbackground: `radial-gradient(circle at 48% 42%, ${theme.primary20}, ${theme.primary10} 52%, transparent 76%)`,\n\t\tfilter: \"blur(1px)\",\n\t\ttransform: \"rotate(-10deg)\",\n\t})\n\n\tconst blob = document.createElement(\"div\")\n\tObject.assign(blob.style, {\n\t\tposition: \"absolute\",\n\t\tleft: \"26px\",\n\t\ttop: \"28px\",\n\t\twidth: \"132px\",\n\t\theight: \"116px\",\n\t\tborderRadius: \"42% 58% 53% 47% / 45% 39% 61% 55%\",\n\t\tbackground: `linear-gradient(150deg, ${theme.primary14}, ${theme.primary10})`,\n\t\tboxShadow: `0 30px 64px ${theme.primary14}`,\n\t\ttransform: \"rotate(8deg)\",\n\t})\n\n\tconst tile = document.createElement(\"div\")\n\tObject.assign(tile.style, {\n\t\tposition: \"absolute\",\n\t\tleft: \"50%\",\n\t\ttop: \"50%\",\n\t\ttransform: \"translate(-50%, -50%) rotate(-4deg)\",\n\t\twidth: \"112px\",\n\t\theight: \"106px\",\n\t\tborderRadius: \"38% 62% 50% 50% / 44% 43% 57% 56%\",\n\t\tbackground: `linear-gradient(145deg, ${theme.primary}, ${theme.secondary})`,\n\t\tborder: `1px solid ${theme.primary36}`,\n\t\tcolor: \"#ffffff\",\n\t\tdisplay: \"inline-flex\",\n\t\talignItems: \"center\",\n\t\tjustifyContent: \"center\",\n\t\tboxShadow: `0 26px 54px ${theme.primary28}`,\n\t})\n\tconst icon = createPaymentIcon(\"slow\")\n\tObject.assign(icon.style, {\n\t\twidth: \"52px\",\n\t\theight: \"52px\",\n\t\ttransform: \"rotate(4deg)\",\n\t})\n\ttile.appendChild(icon)\n\n\tartwork.appendChild(wash)\n\tartwork.appendChild(blob)\n\tartwork.appendChild(tile)\n\treturn artwork\n}\n\nfunction createPaymentBrandLoading(\n\toptions: PaymentUIOptions | undefined,\n\ttheme: ResolvedPaymentTheme,\n) {\n\tconst brand = getPaymentBrandLoadingText(options)\n\tconst wrapper = document.createElement(\"div\")\n\tObject.assign(wrapper.style, {\n\t\tdisplay: \"flex\",\n\t\tflexDirection: \"column\",\n\t\talignItems: \"center\",\n\t\tjustifyContent: \"center\",\n\t\tmargin: \"0 auto 16px\",\n\t})\n\n\twrapper.appendChild(\n\t\tcreateSdkBrandLogo({\n\t\t\tanimated: true,\n\t\t\tbrand,\n\t\t\tbrandWidth: 292,\n\t\t\tcopyWidth: 176,\n\t\t\tgap: 6,\n\t\t\tmarkMarginRight: -10,\n\t\t\tmarkSize: 112,\n\t\t\tnameSize: 39,\n\t\t\tsubtitleMarginTop: 8,\n\t\t\tsubtitleSize: 14,\n\t\t\tsubtitleWeight: \"700\",\n\t\t\ttheme,\n\t\t\tvariant: \"brand\",\n\t\t}),\n\t)\n\treturn wrapper\n}\n\nfunction createPaymentPlatformLogo(\n\toptions: PaymentUIOptions | undefined,\n\ttheme: ResolvedPaymentTheme,\n) {\n\tconst brand = getPaymentBrandText(options)\n\tconst wrapper = document.createElement(\"div\")\n\tObject.assign(wrapper.style, {\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tjustifyContent: \"center\",\n\t\tmargin: \"0 auto 10px\",\n\t})\n\twrapper.appendChild(\n\t\tcreateSdkBrandLogo({\n\t\t\tbrand,\n\t\t\tmarkSize: 48,\n\t\t\tnameSize: brand.language === \"zh\" ? 22 : 22,\n\t\t\tsubtitleSize: brand.language === \"zh\" ? 9 : 9,\n\t\t\ttheme,\n\t\t}),\n\t)\n\treturn wrapper\n}\n\nfunction createPaymentPanelContent() {\n\tconst content = document.createElement(\"div\")\n\tObject.assign(content.style, {\n\t\tdisplay: \"flex\",\n\t\tflexDirection: \"column\",\n\t\tjustifyContent: \"center\",\n\t\tmaxWidth: \"364px\",\n\t\tminHeight: \"100%\",\n\t\twidth: \"100%\",\n\t})\n\n\treturn content\n}\n\nfunction createPaymentPanelTitle(value: string, theme?: ResolvedPaymentTheme) {\n\tconst title = document.createElement(\"div\")\n\ttitle.textContent = value\n\tObject.assign(title.style, {\n\t\tcolor: theme?.foreground || \"#0f172a\",\n\t\tfontSize: \"24px\",\n\t\tfontWeight: \"900\",\n\t\tlineHeight: \"1.22\",\n\t\tmarginBottom: \"16px\",\n\t})\n\treturn title\n}\n\nfunction createPaymentPanelDescription(\n\tvalue: string,\n\ttheme?: ResolvedPaymentTheme,\n) {\n\tconst description = document.createElement(\"div\")\n\tdescription.textContent = value\n\tObject.assign(description.style, {\n\t\tcolor: theme?.muted || \"#64748b\",\n\t\tfontSize: \"14px\",\n\t\tfontWeight: \"600\",\n\t\tlineHeight: \"1.62\",\n\t\tmargin: \"0 auto\",\n\t\tmaxWidth: \"320px\",\n\t})\n\treturn description\n}\n\nfunction createPaymentLoadingDescription(\n\tvalue: string,\n\ttheme?: ResolvedPaymentTheme,\n) {\n\tconst description = document.createElement(\"div\")\n\tdescription.textContent = value\n\tObject.assign(description.style, {\n\t\tcolor: theme?.muted || \"#64748b\",\n\t\tfontSize: \"14px\",\n\t\tfontWeight: \"500\",\n\t\tlineHeight: \"1.25\",\n\t\tmargin: \"12px auto 0\",\n\t\tmaxWidth: \"320px\",\n\t})\n\treturn description\n}\n\nfunction createPaymentFallbackMessage(options: {\n\tdescription: string\n\ttheme: ResolvedPaymentTheme\n\ttitle: string\n}) {\n\tconst message = document.createElement(\"div\")\n\tObject.assign(message.style, {\n\t\tmargin: \"0 auto\",\n\t\ttextAlign: \"center\",\n\t})\n\tmessage.appendChild(createPaymentFallbackArtwork(options.theme))\n\tmessage.appendChild(createPaymentPanelTitle(options.title, options.theme))\n\tmessage.appendChild(\n\t\tcreatePaymentPanelDescription(options.description, options.theme),\n\t)\n\treturn message\n}\n\nfunction createPaymentLoadingPanel(options?: PaymentUIOptions) {\n\tconst panel = document.createElement(\"div\")\n\tconst theme = resolvePaymentTheme(options)\n\tapplyPaymentPanelStyle(panel, theme)\n\n\tconst content = createPaymentPanelContent()\n\tcontent.appendChild(createPaymentBrandLoading(options, theme))\n\tcontent.appendChild(\n\t\tcreatePaymentLoadingDescription(getPaymentLoadingText(options), theme),\n\t)\n\tpanel.appendChild(content)\n\treturn panel\n}\n\nfunction createPaymentButton(\n\tvalue: string,\n\toptions?: {\n\t\ticon?: \"external\" | \"refresh\"\n\t\tprimary?: boolean\n\t\ttheme?: ResolvedPaymentTheme\n\t},\n) {\n\tconst primary = options?.primary || false\n\tconst theme = options?.theme || resolvePaymentTheme()\n\tconst button = document.createElement(\"button\")\n\tbutton.type = \"button\"\n\tObject.assign(button.style, {\n\t\twidth: \"100%\",\n\t\theight: \"50px\",\n\t\tborderRadius: \"14px\",\n\t\tborder: primary\n\t\t\t? `1px solid ${theme.primary}`\n\t\t\t: `1px solid ${theme.primary64}`,\n\t\tbackground: primary\n\t\t\t? `linear-gradient(135deg, ${theme.primary}, ${theme.secondary})`\n\t\t\t: \"#ffffff\",\n\t\tcolor: primary ? \"#ffffff\" : theme.primary,\n\t\tcursor: \"pointer\",\n\t\tdisplay: \"inline-flex\",\n\t\talignItems: \"center\",\n\t\tjustifyContent: \"center\",\n\t\tgap: \"10px\",\n\t\tfontSize: \"15px\",\n\t\tfontWeight: \"800\",\n\t\tmarginTop: primary ? \"12px\" : \"0\",\n\t\tboxShadow: primary ? `0 14px 28px ${theme.primary20}` : \"none\",\n\t})\n\tif (options?.icon) {\n\t\tconst icon = createPaymentIcon(options.icon)\n\t\tObject.assign(icon.style, {\n\t\t\twidth: \"17px\",\n\t\t\theight: \"17px\",\n\t\t})\n\t\tbutton.appendChild(icon)\n\t}\n\tconst label = document.createElement(\"span\")\n\tlabel.textContent = value\n\tbutton.appendChild(label)\n\treturn button\n}\n\nfunction createPaymentFallbackPanel(options: {\n\tbuttonText: string\n\tdescription: string\n\tpaymentOptions?: PaymentUIOptions\n\tonOpen: () => void\n\tonRetry: () => void\n\tretryText: string\n\ttitle: string\n}) {\n\tconst panel = document.createElement(\"div\")\n\tconst theme = resolvePaymentTheme(options.paymentOptions)\n\tapplyPaymentPanelStyle(panel, theme)\n\n\tconst content = createPaymentPanelContent()\n\tObject.assign(content.style, {\n\t\tjustifyContent: \"space-between\",\n\t})\n\n\tconst main = document.createElement(\"div\")\n\tObject.assign(main.style, {\n\t\tdisplay: \"flex\",\n\t\tflexDirection: \"column\",\n\t\talignItems: \"center\",\n\t\tmarginTop: \"38px\",\n\t\twidth: \"100%\",\n\t})\n\tmain.appendChild(\n\t\tcreatePaymentFallbackMessage({\n\t\t\tdescription: options.description,\n\t\t\ttheme,\n\t\t\ttitle: options.title,\n\t\t}),\n\t)\n\n\tconst actions = document.createElement(\"div\")\n\tObject.assign(actions.style, {\n\t\tmarginTop: \"46px\",\n\t\twidth: \"100%\",\n\t})\n\n\tconst retryButton = createPaymentButton(options.retryText, {\n\t\ticon: \"refresh\",\n\t\ttheme,\n\t})\n\tretryButton.onclick = options.onRetry\n\tactions.appendChild(retryButton)\n\n\tconst openButton = createPaymentButton(options.buttonText, {\n\t\ticon: \"external\",\n\t\tprimary: true,\n\t\ttheme,\n\t})\n\topenButton.onclick = options.onOpen\n\tactions.appendChild(openButton)\n\n\tmain.appendChild(actions)\n\tcontent.appendChild(main)\n\tcontent.appendChild(createPaymentPlatformLogo(options.paymentOptions, theme))\n\tpanel.appendChild(content)\n\treturn panel\n}\n\n/**\n * Poll Options\n */\nexport interface PollOptions {\n\t/** Polling interval in ms (default: 3000) */\n\tinterval?: number\n\t/** Timeout in ms (default: 300000 = 5 minutes) */\n\ttimeout?: number\n\t/** Callback on each status check */\n\tonStatusChange?: (status: OrderStatus) => void\n}\n\n/**\n * Client-side Payment UI Helper\n * 浏览器端支付 UI 辅助类,用于弹出支付窗口和轮询订单状态\n */\n/**\n * Params for opening payment directly without manual URL construction\n */\nexport interface PaymentParams {\n\tappId: string\n\tuserId?: string\n\t/** Existing Youidian order ID - opens checkout for an already-created order */\n\torderId?: string\n\t/** Product ID - use with priceId for direct ID-based payment */\n\tproductId?: string\n\t/** Price ID - use with productId for direct ID-based payment */\n\tpriceId?: string\n\t/** Product code - use with locale for code-based payment (alternative to productId/priceId) */\n\tproductCode?: string\n\t/** Optional custom recharge amount in the smallest currency unit */\n\tcustomAmount?: {\n\t\tamount: number\n\t\tcurrency: string\n\t}\n\n\t/**\n\t * @deprecated Use checkoutUrl instead\n\t * Defaults to https://pay.imgto.link\n\t */\n\tbaseUrl?: string\n\n\t/**\n\t * Checkout page URL (e.g. https://pay.youidian.com)\n\t * Defaults to https://pay.imgto.link\n\t */\n\tcheckoutUrl?: string\n}\n\n/**\n * Client-side Payment UI Helper\n * 浏览器端支付 UI 辅助类,用于弹出支付窗口和轮询订单状态\n */\nexport class PaymentUI extends HostedFrameModal<PaymentEventData> {\n\tprivate activeCheckoutAppId: string | null = null\n\tprivate activeCheckoutBaseUrl: string | null = null\n\tprivate activeOrderId: string | null = null\n\tprivate paymentCompleted = false\n\tprivate cancelRequestedOrderId: string | null = null\n\tprivate iframeFallbackPanel: HTMLDivElement | null = null\n\tprivate iframeLoadingPanel: HTMLDivElement | null = null\n\tprivate iframeLoadTimer: number | null = null\n\tprivate iframeReady = false\n\n\tprivate cleanupPaymentFrameState() {\n\t\tif (typeof window !== \"undefined\" && this.iframeLoadTimer) {\n\t\t\twindow.clearTimeout(this.iframeLoadTimer)\n\t\t}\n\t\tif (this.iframeFallbackPanel?.parentNode) {\n\t\t\tthis.iframeFallbackPanel.parentNode.removeChild(this.iframeFallbackPanel)\n\t\t}\n\t\tif (this.iframeLoadingPanel?.parentNode) {\n\t\t\tthis.iframeLoadingPanel.parentNode.removeChild(this.iframeLoadingPanel)\n\t\t}\n\t\tthis.iframeFallbackPanel = null\n\t\tthis.iframeLoadingPanel = null\n\t\tthis.iframeLoadTimer = null\n\t\tthis.iframeReady = false\n\t}\n\n\tprivate markPaymentIframeReady() {\n\t\tif (this.iframeReady) return\n\t\tthis.iframeReady = true\n\t\tif (typeof window !== \"undefined\" && this.iframeLoadTimer) {\n\t\t\twindow.clearTimeout(this.iframeLoadTimer)\n\t\t\tthis.iframeLoadTimer = null\n\t\t}\n\t\tif (this.iframeFallbackPanel?.parentNode) {\n\t\t\tthis.iframeFallbackPanel.parentNode.removeChild(this.iframeFallbackPanel)\n\t\t}\n\t\tif (this.iframeLoadingPanel?.parentNode) {\n\t\t\tthis.iframeLoadingPanel.parentNode.removeChild(this.iframeLoadingPanel)\n\t\t}\n\t\tthis.iframeFallbackPanel = null\n\t\tthis.iframeLoadingPanel = null\n\t}\n\n\tprivate showPaymentIframeLoading(\n\t\tcontainer: HTMLDivElement,\n\t\toptions?: PaymentUIOptions,\n\t) {\n\t\tif (this.iframeLoadingPanel || this.iframeReady) return\n\n\t\tconst panel = createPaymentLoadingPanel(options)\n\t\tthis.iframeLoadingPanel = panel\n\t\tcontainer.appendChild(panel)\n\t}\n\n\tprivate openFallbackPaymentPage(\n\t\tfinalUrl: string,\n\t\toptions?: PaymentUIOptions,\n\t) {\n\t\tif (typeof window === \"undefined\") return\n\n\t\tconst popup = window.open(\n\t\t\tfinalUrl,\n\t\t\t\"youidian-payment-checkout\",\n\t\t\t\"popup=yes,width=480,height=760,resizable=yes,scrollbars=yes\",\n\t\t)\n\t\tif (popup) {\n\t\t\tlogPaymentInfo(\"Opened hosted checkout fallback page\", {\n\t\t\t\tcheckoutUrl: finalUrl,\n\t\t\t})\n\t\t\toptions?.onFallbackOpen?.(finalUrl)\n\t\t\ttry {\n\t\t\t\tpopup.focus()\n\t\t\t} catch {\n\t\t\t\t// Ignore focus failures in restrictive browsers.\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tlogPaymentWarn(\"Hosted checkout fallback popup was blocked\", {\n\t\t\tcheckoutUrl: finalUrl,\n\t\t})\n\t\toptions?.onFallbackBlocked?.(finalUrl)\n\t\twindow.location.assign(finalUrl)\n\t}\n\n\tprivate showPaymentIframeFallback(options: {\n\t\tcontainer: HTMLDivElement\n\t\tfinalUrl: string\n\t\tpaymentOptions?: PaymentUIOptions\n\t}) {\n\t\tif (this.iframeReady || this.iframeFallbackPanel) return\n\n\t\tconst { container, finalUrl, paymentOptions } = options\n\t\tlogPaymentWarn(\"Hosted checkout iframe did not report ready in time\", {\n\t\t\tcheckoutUrl: finalUrl,\n\t\t})\n\t\tif (this.iframeLoadingPanel?.parentNode) {\n\t\t\tthis.iframeLoadingPanel.parentNode.removeChild(this.iframeLoadingPanel)\n\t\t}\n\t\tthis.iframeLoadingPanel = null\n\n\t\tconst fallbackText = getPaymentFallbackText(paymentOptions)\n\t\tconst panel = createPaymentFallbackPanel({\n\t\t\tbuttonText: fallbackText.buttonText,\n\t\t\tdescription: fallbackText.description,\n\t\t\tonOpen: () => {\n\t\t\t\tthis.openFallbackPaymentPage(finalUrl, paymentOptions)\n\t\t\t},\n\t\t\tonRetry: () => {\n\t\t\t\tthis.iframeFallbackPanel = null\n\t\t\t\tif (panel.parentNode) {\n\t\t\t\t\tpanel.parentNode.removeChild(panel)\n\t\t\t\t}\n\t\t\t\tthis.iframeReady = false\n\t\t\t\tthis.showPaymentIframeLoading(container, paymentOptions)\n\t\t\t\tif (this.iframe) {\n\t\t\t\t\tthis.iframe.src = finalUrl\n\t\t\t\t}\n\t\t\t\tthis.startPaymentIframeWatchdog({\n\t\t\t\t\tcontainer,\n\t\t\t\t\tfinalUrl,\n\t\t\t\t\tpaymentOptions,\n\t\t\t\t})\n\t\t\t},\n\t\t\tpaymentOptions,\n\t\t\tretryText: fallbackText.retryText,\n\t\t\ttitle: fallbackText.title,\n\t\t})\n\n\t\tthis.iframeFallbackPanel = panel\n\t\tcontainer.appendChild(panel)\n\t\tpaymentOptions?.onFallbackVisible?.()\n\t}\n\n\tprivate startPaymentIframeWatchdog(options: {\n\t\tcontainer: HTMLDivElement\n\t\tfinalUrl: string\n\t\tpaymentOptions?: PaymentUIOptions\n\t}) {\n\t\tif (typeof window === \"undefined\") return\n\n\t\tif (this.iframeLoadTimer) {\n\t\t\twindow.clearTimeout(this.iframeLoadTimer)\n\t\t}\n\t\tconst timeoutMs = getPaymentIframeLoadTimeoutMs(options.paymentOptions)\n\t\tif (timeoutMs === 0) {\n\t\t\tthis.showPaymentIframeFallback(options)\n\t\t\treturn\n\t\t}\n\n\t\tthis.iframeLoadTimer = window.setTimeout(() => {\n\t\t\tthis.iframeLoadTimer = null\n\t\t\tthis.showPaymentIframeFallback(options)\n\t\t}, timeoutMs)\n\t}\n\n\tprivate cancelHostedOrder(reason = \"user_cancel\", orderId?: string) {\n\t\tconst targetOrderId = orderId || this.activeOrderId\n\t\tif (\n\t\t\t!targetOrderId ||\n\t\t\t!this.activeCheckoutAppId ||\n\t\t\t!this.activeCheckoutBaseUrl ||\n\t\t\tthis.paymentCompleted ||\n\t\t\tthis.cancelRequestedOrderId === targetOrderId\n\t\t) {\n\t\t\treturn\n\t\t}\n\n\t\tthis.cancelRequestedOrderId = targetOrderId\n\t\tconst url = `${this.activeCheckoutBaseUrl}/api/internal/checkout/cancel-order`\n\t\tconst payload = JSON.stringify({\n\t\t\tappId: this.activeCheckoutAppId,\n\t\t\torderId: targetOrderId,\n\t\t\treason,\n\t\t})\n\n\t\tif (typeof navigator !== \"undefined\" && navigator.sendBeacon) {\n\t\t\tconst sent = navigator.sendBeacon(\n\t\t\t\turl,\n\t\t\t\tnew Blob([payload], { type: \"application/json\" }),\n\t\t\t)\n\t\t\tif (sent) return\n\t\t}\n\n\t\tvoid fetch(url, {\n\t\t\tmethod: \"POST\",\n\t\t\tbody: payload,\n\t\t\theaders: { \"Content-Type\": \"text/plain;charset=UTF-8\" },\n\t\t\tkeepalive: true,\n\t\t\tmode: \"no-cors\",\n\t\t}).catch(() => {\n\t\t\tthis.cancelRequestedOrderId = null\n\t\t})\n\t}\n\n\t/**\n\t * Opens the payment checkout page in an iframe modal.\n\t * @param urlOrParams - The checkout page URL or payment parameters\n\t * @param options - UI options\n\t */\n\topenPayment(urlOrParams: string | PaymentParams, options?: PaymentUIOptions) {\n\t\tif (typeof document === \"undefined\") return // Server-side guard\n\t\tif (this.modal) return // Prevent multiple modals\n\n\t\tlet checkoutUrl: string\n\t\tthis.activeOrderId = null\n\t\tthis.paymentCompleted = false\n\t\tthis.cancelRequestedOrderId = null\n\t\tthis.cleanupPaymentFrameState()\n\t\tif (typeof urlOrParams === \"string\") {\n\t\t\tcheckoutUrl = urlOrParams\n\t\t\ttry {\n\t\t\t\tconst parsedUrl = new URL(checkoutUrl)\n\t\t\t\tthis.activeCheckoutBaseUrl = parsedUrl.origin\n\t\t\t\tconst parts = parsedUrl.pathname.split(\"/\").filter(Boolean)\n\t\t\t\tconst checkoutIndex = parts.indexOf(\"checkout\")\n\t\t\t\tthis.activeCheckoutAppId =\n\t\t\t\t\tcheckoutIndex >= 0 ? parts[checkoutIndex + 1] || null : null\n\t\t\t} catch {\n\t\t\t\tthis.activeCheckoutAppId = null\n\t\t\t\tthis.activeCheckoutBaseUrl = null\n\t\t\t}\n\t\t} else {\n\t\t\tconst {\n\t\t\t\tappId,\n\t\t\t\torderId,\n\t\t\t\tproductId,\n\t\t\t\tpriceId,\n\t\t\t\tproductCode,\n\t\t\t\tuserId,\n\t\t\t\tcustomAmount,\n\t\t\t\tcheckoutUrl: checkoutUrlParam,\n\t\t\t\tbaseUrl = \"https://pay.imgto.link\",\n\t\t\t} = urlOrParams\n\n\t\t\t// 优先使用 checkoutUrl,其次 baseUrl,默认 https://pay.imgto.link\n\t\t\tconst base = (checkoutUrlParam || baseUrl).replace(/\\/$/, \"\")\n\t\t\tthis.activeCheckoutAppId = appId\n\t\t\tthis.activeCheckoutBaseUrl = base\n\n\t\t\tconst query = new URLSearchParams()\n\t\t\tif (userId) query.set(\"userId\", userId)\n\t\t\tif (customAmount) {\n\t\t\t\tconst amount = Number(customAmount.amount)\n\t\t\t\tconst currency = customAmount.currency.trim().toUpperCase()\n\t\t\t\tif (!Number.isInteger(amount) || amount <= 0) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"customAmount.amount must be a positive integer in the smallest currency unit\",\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tif (!/^[A-Z]{3}$/.test(currency)) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"customAmount.currency must be a 3-letter currency code\",\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tquery.set(\"customAmount\", String(amount))\n\t\t\t\tquery.set(\"customCurrency\", currency)\n\t\t\t}\n\n\t\t\tif (orderId) {\n\t\t\t\tconst cleanOrderId = orderId.trim()\n\t\t\t\tif (!cleanOrderId) {\n\t\t\t\t\tthrow new Error(\"orderId is required\")\n\t\t\t\t}\n\t\t\t\tthis.activeOrderId = cleanOrderId\n\t\t\t\tcheckoutUrl = `${base}/checkout/${appId}/orders/${cleanOrderId}`\n\t\t\t\tconst queryString = query.toString()\n\t\t\t\tif (queryString) checkoutUrl += `?${queryString}`\n\t\t\t} else if (productCode) {\n\t\t\t\t// Use product code route\n\t\t\t\tcheckoutUrl = `${base}/checkout/${appId}/code/${productCode}?${query.toString()}`\n\t\t\t} else if (productId && priceId) {\n\t\t\t\t// Use ID-based route\n\t\t\t\tcheckoutUrl = `${base}/checkout/${appId}/${productId}/${priceId}?${query.toString()}`\n\t\t\t} else {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"Either orderId, productCode, or both productId and priceId are required\",\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\tconst finalUrl = applyLocaleToUrl(\n\t\t\tcheckoutUrl,\n\t\t\tgetAutoResolvedLocale(options?.locale),\n\t\t)\n\n\t\tconst hostedFrame = this.openHostedFrame(finalUrl, {\n\t\t\tallowedOrigin: options?.allowedOrigin,\n\t\t\theight: \"min(680px, calc(100vh - 32px))\",\n\t\t\tonCloseButton: () => {\n\t\t\t\tthis.cancelHostedOrder(\"modal_close\")\n\t\t\t\toptions?.onCancel?.(this.activeOrderId || undefined)\n\t\t\t},\n\t\t\tonMessage: (data, container, event) => {\n\t\t\t\tconst isIframeMessage = event.source === this.iframe?.contentWindow\n\t\t\t\tif (\n\t\t\t\t\tisIframeMessage &&\n\t\t\t\t\t(data.type === \"PAYMENT_READY\" ||\n\t\t\t\t\t\tdata.type === \"PAYMENT_RESIZE\" ||\n\t\t\t\t\t\tdata.type === \"PAYMENT_STARTED\")\n\t\t\t\t) {\n\t\t\t\t\tthis.markPaymentIframeReady()\n\t\t\t\t}\n\t\t\t\tswitch (data.type) {\n\t\t\t\t\tcase \"PAYMENT_READY\":\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase \"PAYMENT_STARTED\":\n\t\t\t\t\t\tif (data.orderId) {\n\t\t\t\t\t\t\tthis.activeOrderId = data.orderId\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase \"PAYMENT_SUCCESS\":\n\t\t\t\t\t\tthis.paymentCompleted = true\n\t\t\t\t\t\toptions?.onSuccess?.(data.orderId)\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase \"PAYMENT_CANCELLED\":\n\t\t\t\t\t\tthis.cancelHostedOrder(\"payment_cancelled\", data.orderId)\n\t\t\t\t\t\toptions?.onCancel?.(data.orderId)\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase \"PAYMENT_RESIZE\":\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase \"PAYMENT_CLOSE\":\n\t\t\t\t\t\tthis.cancelHostedOrder(\"payment_close\", data.orderId)\n\t\t\t\t\t\tthis.close()\n\t\t\t\t\t\toptions?.onClose?.()\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t},\n\t\t\twidth: \"min(450px, 100%)\",\n\t\t})\n\n\t\tif (hostedFrame) {\n\t\t\tthis.showPaymentIframeLoading(hostedFrame.container, options)\n\t\t\tthis.startPaymentIframeWatchdog({\n\t\t\t\tcontainer: hostedFrame.container,\n\t\t\t\tfinalUrl,\n\t\t\t\tpaymentOptions: options,\n\t\t\t})\n\t\t}\n\t}\n\n\tclose() {\n\t\tsuper.close()\n\t\tthis.cleanupPaymentFrameState()\n\t}\n\n\t/**\n\t * Poll order status from integrator's API endpoint\n\t * @param statusUrl - The integrator's API endpoint to check order status\n\t * @param options - Polling options\n\t * @returns Promise that resolves when order is paid or rejects on timeout/failure\n\t */\n\tasync pollOrderStatus(\n\t\tstatusUrl: string,\n\t\toptions?: PollOptions,\n\t): Promise<OrderStatus> {\n\t\tconst interval = options?.interval || 3000\n\t\tconst timeout = options?.timeout || 300000\n\t\tconst startTime = Date.now()\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst poll = async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst response = await fetch(statusUrl)\n\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\tthrow new Error(`Status check failed: ${response.status}`)\n\t\t\t\t\t}\n\n\t\t\t\t\tconst status: OrderStatus = await response.json()\n\t\t\t\t\toptions?.onStatusChange?.(status)\n\n\t\t\t\t\tif (status.status === \"PAID\") {\n\t\t\t\t\t\tresolve(status)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\tif (status.status === \"CANCELLED\" || status.status === \"FAILED\") {\n\t\t\t\t\t\treject(new Error(`Order ${status.status.toLowerCase()}`))\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\t// Check timeout\n\t\t\t\t\tif (Date.now() - startTime > timeout) {\n\t\t\t\t\t\treject(new Error(\"Polling timeout\"))\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\t// Continue polling\n\t\t\t\t\tsetTimeout(poll, interval)\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// On network error, continue polling unless timeout\n\t\t\t\t\tif (Date.now() - startTime > timeout) {\n\t\t\t\t\t\treject(error)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tsetTimeout(poll, interval)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpoll()\n\t\t})\n\t}\n}\n\nexport interface WechatMessageBindingUIOptions {\n\tbindingUrl: string\n\tdisplayMode?: \"redirect\" | \"popup\"\n\tpopupName?: string\n}\n\nexport class MessageUI {\n\topenWechatBinding(options: WechatMessageBindingUIOptions) {\n\t\tconst bindingUrl = options.bindingUrl?.trim()\n\t\tif (!bindingUrl) {\n\t\t\tthrow new Error(\"bindingUrl is required\")\n\t\t}\n\t\tif (options.displayMode === \"popup\") {\n\t\t\tconst popup = window.open(\n\t\t\t\tbindingUrl,\n\t\t\t\toptions.popupName || \"youidian-wechat-message-binding\",\n\t\t\t\t\"width=480,height=720,noopener,noreferrer\",\n\t\t\t)\n\t\t\tif (!popup) {\n\t\t\t\twindow.location.href = bindingUrl\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t\twindow.location.href = bindingUrl\n\t}\n}\n\nexport function createMessageUI() {\n\treturn new MessageUI()\n}\n\n/**\n * Convenience function to create a PaymentUI instance\n */\nexport function createPaymentUI(): PaymentUI {\n\treturn new PaymentUI()\n}\n\nexport type {\n\tLoginDeviceType,\n\tLoginEnvironment,\n\tLoginEnvironmentInput,\n} from \"./environment\"\nexport { detectLoginEnvironment } from \"./environment\"\nexport type {\n\tLoginCallbackOptions,\n\tLoginDisplayMode,\n\tLoginEventData,\n\tLoginEventType,\n\tLoginParams,\n\tLoginResult,\n\tLoginUIOptions,\n} from \"./login\"\nexport { createLoginUI, handleLoginCallbackIfPresent, LoginUI } from \"./login\"\n","export type SdkBrandLogoCopy = {\n\tlanguage: string\n\tname: string\n\tsubtitle: string\n}\n\nexport type SdkBrandLogoTheme = {\n\tforeground: string\n\tmuted: string\n\tprimary: string\n\tsecondary: string\n}\n\ntype SdkBrandLogoMarkOptions = {\n\tanimated?: boolean\n\tinverted?: boolean\n\tsize: number\n\ttheme: SdkBrandLogoTheme\n\tvariant?: \"brand\" | \"mark\"\n}\n\ntype SdkBrandLogoOptions = {\n\tanimated?: boolean\n\tbrand: SdkBrandLogoCopy\n\tbrandWidth?: number\n\tcopyWidth?: number\n\tgap?: number\n\tmarkMarginRight?: number\n\tmarkSize: number\n\tnameSize: number\n\tsubtitleMarginTop?: number\n\tsubtitleSize: number\n\tsubtitleWeight?: string\n\ttheme: SdkBrandLogoTheme\n\tvariant?: \"brand\" | \"mark\"\n}\n\nfunction ensureSdkBrandLogoStyles() {\n\tif (document.getElementById?.(\"youidian-sdk-brand-logo-style\")) {\n\t\treturn\n\t}\n\n\tconst style = document.createElement(\"style\")\n\tstyle.id = \"youidian-sdk-brand-logo-style\"\n\tstyle.textContent = `\n\t\t.youidian-sdk-brand-logo__ring,\n\t\t.youidian-sdk-brand-logo__dot,\n\t\t.youidian-sdk-brand-logo__copy,\n\t\t.youidian-sdk-brand-logo__tagline {\n\t\t\ttransform-box: fill-box;\n\t\t\ttransform-origin: center;\n\t\t\twill-change: opacity, transform;\n\t\t}\n\n\t\t.youidian-sdk-brand-logo[data-animated=\"true\"] .youidian-sdk-brand-logo__ring {\n\t\t\tanimation: youidian-sdk-brand-logo-ring 1400ms cubic-bezier(0.4, 0, 0.2, 1) infinite;\n\t\t}\n\n\t\t.youidian-sdk-brand-logo[data-animated=\"true\"] .youidian-sdk-brand-logo__dot {\n\t\t\tanimation: youidian-sdk-brand-logo-dot 1400ms cubic-bezier(0.4, 0, 0.2, 1) infinite;\n\t\t}\n\n\t\t.youidian-sdk-brand-logo[data-animated=\"true\"] .youidian-sdk-brand-logo__copy {\n\t\t\tanimation: youidian-sdk-brand-logo-copy 1600ms cubic-bezier(0.4, 0, 0.2, 1) infinite;\n\t\t}\n\n\t\t.youidian-sdk-brand-logo[data-animated=\"true\"] .youidian-sdk-brand-logo__tagline {\n\t\t\tanimation: youidian-sdk-brand-logo-tagline 1600ms cubic-bezier(0.4, 0, 0.2, 1) infinite;\n\t\t}\n\n\t\t@keyframes youidian-sdk-brand-logo-ring {\n\t\t\t0%,\n\t\t\t100% {\n\t\t\t\topacity: 0.72;\n\t\t\t\ttransform: rotate(0deg) scale(0.98);\n\t\t\t}\n\t\t\t50% {\n\t\t\t\topacity: 1;\n\t\t\t\ttransform: rotate(8deg) scale(1.02);\n\t\t\t}\n\t\t}\n\n\t\t@keyframes youidian-sdk-brand-logo-dot {\n\t\t\t0%,\n\t\t\t100% {\n\t\t\t\topacity: 0.58;\n\t\t\t\ttransform: scale(0.9);\n\t\t\t}\n\t\t\t50% {\n\t\t\t\topacity: 1;\n\t\t\t\ttransform: scale(1.08);\n\t\t\t}\n\t\t}\n\n\t\t@keyframes youidian-sdk-brand-logo-copy {\n\t\t\t0%,\n\t\t\t100% {\n\t\t\t\topacity: 0.86;\n\t\t\t\ttransform: translateY(0);\n\t\t\t}\n\t\t\t50% {\n\t\t\t\topacity: 1;\n\t\t\t\ttransform: translateY(-1px);\n\t\t\t}\n\t\t}\n\n\t\t@keyframes youidian-sdk-brand-logo-tagline {\n\t\t\t0%,\n\t\t\t100% {\n\t\t\t\topacity: 0.64;\n\t\t\t}\n\t\t\t50% {\n\t\t\t\topacity: 0.92;\n\t\t\t}\n\t\t}\n\n\t\t@media (prefers-reduced-motion: reduce) {\n\t\t\t.youidian-sdk-brand-logo__ring,\n\t\t\t.youidian-sdk-brand-logo__dot,\n\t\t\t.youidian-sdk-brand-logo__copy,\n\t\t\t.youidian-sdk-brand-logo__tagline {\n\t\t\t\tanimation: none;\n\t\t\t\topacity: 1;\n\t\t\t\ttransform: none;\n\t\t\t}\n\t\t}\n\t`\n\tdocument.head?.appendChild(style)\n}\n\nexport function createSdkBrandLogoMark({\n\tanimated,\n\tinverted,\n\tsize,\n\ttheme,\n\tvariant = \"brand\",\n}: SdkBrandLogoMarkOptions) {\n\tensureSdkBrandLogoStyles()\n\n\tconst mark = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\")\n\tmark.setAttribute(\"viewBox\", \"0 0 512 512\")\n\tmark.setAttribute(\"fill\", \"none\")\n\tmark.setAttribute(\"aria-hidden\", \"true\")\n\tObject.assign(mark.style, {\n\t\twidth: `${size}px`,\n\t\theight: `${size}px`,\n\t\tcolor: inverted ? \"#ffffff\" : theme.primary,\n\t\tdisplay: \"block\",\n\t\tflex: \"0 0 auto\",\n\t\toverflow: \"visible\",\n\t})\n\n\tconst logoGroup = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\")\n\tlogoGroup.setAttribute(\n\t\t\"transform\",\n\t\tvariant === \"mark\"\n\t\t\t? \"matrix(0.74 0 0 0.74 -124 -114)\"\n\t\t\t: \"matrix(0.58 0 0 0.58 -40 -31)\",\n\t)\n\n\tconst ring = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\")\n\tring.setAttribute(\"class\", animated ? \"youidian-sdk-brand-logo__ring\" : \"\")\n\tring.setAttribute(\"fill\", inverted ? \"currentColor\" : theme.primary)\n\tring.setAttribute(\n\t\t\"d\",\n\t\t\"M704.298 679.54A264 264 0 1 1 704.298 309.46A49 49 0 0 1 634.4 378.149A166 166 0 1 0 634.4 610.851A49 49 0 0 1 704.298 679.54Z\",\n\t)\n\n\tconst dot = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\")\n\tdot.setAttribute(\"class\", animated ? \"youidian-sdk-brand-logo__dot\" : \"\")\n\tdot.setAttribute(\"fill\", inverted ? \"currentColor\" : theme.secondary)\n\tdot.setAttribute(\"cx\", \"714.5\")\n\tdot.setAttribute(\"cy\", \"490.5\")\n\tdot.setAttribute(\"r\", \"68\")\n\tdot.setAttribute(\"opacity\", inverted ? \"0.78\" : \"1\")\n\n\tlogoGroup.appendChild(ring)\n\tlogoGroup.appendChild(dot)\n\tmark.appendChild(logoGroup)\n\treturn mark\n}\n\nexport function createSdkBrandLogo({\n\tanimated,\n\tbrand,\n\tbrandWidth,\n\tcopyWidth,\n\tgap = 10,\n\tmarkMarginRight,\n\tmarkSize,\n\tnameSize,\n\tsubtitleMarginTop = 6,\n\tsubtitleSize,\n\tsubtitleWeight = \"800\",\n\ttheme,\n\tvariant = \"brand\",\n}: SdkBrandLogoOptions) {\n\tensureSdkBrandLogoStyles()\n\n\tconst wrapper = document.createElement(\"div\")\n\twrapper.className = \"youidian-sdk-brand-logo\"\n\twrapper.setAttribute(\"data-animated\", animated ? \"true\" : \"false\")\n\tObject.assign(wrapper.style, {\n\t\tdisplay: \"inline-flex\",\n\t\talignItems: \"center\",\n\t\tjustifyContent: \"center\",\n\t\tgap: `${gap}px`,\n\t\twidth: brandWidth ? `${brandWidth}px` : undefined,\n\t})\n\n\tconst copy = document.createElement(\"div\")\n\tcopy.className = \"youidian-sdk-brand-logo__copy\"\n\tcopy.setAttribute(\"data-brand-locale\", brand.language)\n\tObject.assign(copy.style, {\n\t\tdisplay: \"flex\",\n\t\tflexDirection: \"column\",\n\t\talignItems: \"flex-start\",\n\t\tjustifyContent: \"center\",\n\t\tlineHeight: \"1\",\n\t\twidth: copyWidth ? `${copyWidth}px` : undefined,\n\t})\n\n\tconst name = document.createElement(\"div\")\n\tname.className = \"youidian-sdk-brand-logo__name\"\n\tname.textContent = brand.name\n\tObject.assign(name.style, {\n\t\tcolor: theme.foreground,\n\t\tfontFamily:\n\t\t\tbrand.language === \"zh\"\n\t\t\t\t? '\"Noto Sans TC\", \"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif'\n\t\t\t\t: '\"Unbounded\", \"Space Grotesk\", \"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n\t\tfontSize: `${nameSize}px`,\n\t\tfontWeight: brand.language === \"zh\" ? \"900\" : \"800\",\n\t\tletterSpacing: brand.language === \"zh\" ? \"0.08em\" : \"0.01em\",\n\t\tlineHeight: \"1\",\n\t\twhiteSpace: \"nowrap\",\n\t})\n\n\tconst subtitle = document.createElement(\"div\")\n\tsubtitle.className = \"youidian-sdk-brand-logo__tagline\"\n\tsubtitle.textContent = brand.subtitle\n\tObject.assign(subtitle.style, {\n\t\tcolor: theme.muted,\n\t\tfontFamily:\n\t\t\tbrand.language === \"zh\"\n\t\t\t\t? '\"Noto Sans TC\", \"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif'\n\t\t\t\t: '\"Space Grotesk\", \"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n\t\tfontSize: `${subtitleSize}px`,\n\t\tfontWeight: subtitleWeight,\n\t\tletterSpacing: brand.language === \"zh\" ? \"0.24em\" : \"0.07em\",\n\t\tlineHeight: \"1\",\n\t\tmarginTop: `${subtitleMarginTop}px`,\n\t\ttextTransform: brand.language === \"zh\" ? \"none\" : \"uppercase\",\n\t\twhiteSpace: \"nowrap\",\n\t})\n\n\tcopy.appendChild(name)\n\tcopy.appendChild(subtitle)\n\tconst mark = createSdkBrandLogoMark({\n\t\tanimated,\n\t\tsize: markSize,\n\t\ttheme,\n\t\tvariant,\n\t})\n\tif (typeof markMarginRight === \"number\") {\n\t\tmark.style.marginRight = `${markMarginRight}px`\n\t}\n\twrapper.appendChild(mark)\n\twrapper.appendChild(copy)\n\treturn wrapper\n}\n","export interface HostedFrameMessage {\n\ttype: string\n\theight?: number\n}\n\ntype HostedFrameOptions<TData extends HostedFrameMessage> = {\n\tallowedOrigin?: string\n\theight?: string\n\tonCloseButton?: () => void\n\tonMessage: (\n\t\tdata: TData,\n\t\tcontainer: HTMLDivElement,\n\t\tevent: MessageEvent,\n\t) => void\n\twidth?: string\n}\n\ntype HostedFrameInstance = {\n\tcontainer: HTMLDivElement\n\tiframe: HTMLIFrameElement\n}\n\nconst SDK_SUPPORTED_LOCALES = [\n\t\"en\",\n\t\"zh-CN\",\n\t\"zh-Hant\",\n\t\"fr\",\n\t\"de\",\n\t\"ja\",\n\t\"es\",\n\t\"ko\",\n\t\"nl\",\n\t\"it\",\n\t\"pt\",\n] as const\n\nconst SDK_DEFAULT_LOCALE = \"zh-CN\"\n\nconst SDK_LOCALE_ALIASES: Record<string, string> = {\n\ten: \"en\",\n\t\"en-us\": \"en\",\n\t\"en-gb\": \"en\",\n\tzh: \"zh-CN\",\n\t\"zh-cn\": \"zh-CN\",\n\t\"zh-tw\": \"zh-Hant\",\n\t\"zh-hk\": \"zh-Hant\",\n\t\"zh-hant\": \"zh-Hant\",\n\t\"zh-hans\": \"zh-CN\",\n\tfr: \"fr\",\n\tde: \"de\",\n\tja: \"ja\",\n\tes: \"es\",\n\tko: \"ko\",\n\tnl: \"nl\",\n\tit: \"it\",\n\tpt: \"pt\",\n}\n\nfunction matchSupportedBaseLocale(locale: string): string | undefined {\n\tconst base = locale.toLowerCase().split(\"-\")[0]\n\treturn SDK_SUPPORTED_LOCALES.find((item) => item.toLowerCase() === base)\n}\n\nexport function normalizeSdkLocale(locale?: string): string | undefined {\n\tif (!locale) return\n\n\tconst sanitized = locale.trim().replace(/_/g, \"-\")\n\tif (!sanitized) return\n\n\tconst lower = sanitized.toLowerCase()\n\tif (SDK_LOCALE_ALIASES[lower]) {\n\t\treturn SDK_LOCALE_ALIASES[lower]\n\t}\n\n\tlet canonical: string | undefined\n\ttry {\n\t\tcanonical = Intl.getCanonicalLocales(sanitized)[0]\n\t} catch {\n\t\tcanonical = undefined\n\t}\n\n\tconst candidates = [canonical, sanitized].filter(Boolean) as string[]\n\n\tfor (const candidate of candidates) {\n\t\tconst candidateLower = candidate.toLowerCase()\n\n\t\tif (SDK_LOCALE_ALIASES[candidateLower]) {\n\t\t\treturn SDK_LOCALE_ALIASES[candidateLower]\n\t\t}\n\t\tif ((SDK_SUPPORTED_LOCALES as readonly string[]).includes(candidate)) {\n\t\t\treturn candidate\n\t\t}\n\n\t\tconst baseMatch = matchSupportedBaseLocale(candidate)\n\t\tif (baseMatch) {\n\t\t\treturn baseMatch\n\t\t}\n\t}\n}\n\nexport function getBrowserLocale(): string | undefined {\n\tif (typeof navigator === \"undefined\") return\n\n\tfor (const candidate of navigator.languages || []) {\n\t\tconst normalized = normalizeSdkLocale(candidate)\n\t\tif (normalized) return normalized\n\t}\n\n\treturn normalizeSdkLocale(navigator.language)\n}\n\nexport function getAutoResolvedLocale(locale?: string): string {\n\treturn normalizeSdkLocale(locale) || getBrowserLocale() || SDK_DEFAULT_LOCALE\n}\n\nexport function applyLocaleToUrl(urlValue: string, locale?: string): string {\n\tif (!locale) return urlValue\n\n\ttry {\n\t\tconst url = new URL(urlValue)\n\t\tconst localePrefix = `/${locale}`\n\t\tif (\n\t\t\t!url.pathname.startsWith(`${localePrefix}/`) &&\n\t\t\turl.pathname !== localePrefix\n\t\t) {\n\t\t\turl.pathname = `${localePrefix}${url.pathname}`\n\t\t}\n\t\treturn url.toString()\n\t} catch (_error) {\n\t\tconst localePrefix = `/${locale}`\n\t\tif (!urlValue.startsWith(`${localePrefix}/`) && urlValue !== localePrefix) {\n\t\t\treturn `${localePrefix}${urlValue.startsWith(\"/\") ? \"\" : \"/\"}${urlValue}`\n\t\t}\n\t\treturn urlValue\n\t}\n}\n\nexport class HostedFrameModal<TData extends HostedFrameMessage> {\n\tprotected iframe: HTMLIFrameElement | null = null\n\tprotected modal: HTMLDivElement | null = null\n\tprotected messageHandler: ((event: MessageEvent) => void) | null = null\n\n\tprotected openHostedFrame(\n\t\turl: string,\n\t\toptions: HostedFrameOptions<TData>,\n\t): HostedFrameInstance | null {\n\t\tif (typeof document === \"undefined\") return null\n\t\tif (this.modal) return null\n\n\t\tthis.modal = document.createElement(\"div\")\n\t\tObject.assign(this.modal.style, {\n\t\t\tposition: \"fixed\",\n\t\t\ttop: \"0\",\n\t\t\tleft: \"0\",\n\t\t\twidth: \"100%\",\n\t\t\theight: \"100%\",\n\t\t\tbackgroundColor: \"rgba(15,23,42,0.52)\",\n\t\t\tdisplay: \"flex\",\n\t\t\talignItems: \"center\",\n\t\t\tjustifyContent: \"center\",\n\t\t\tzIndex: \"9999\",\n\t\t\ttransition: \"opacity 0.3s ease\",\n\t\t\tbackdropFilter: \"blur(14px)\",\n\t\t\tpadding: \"16px\",\n\t\t})\n\n\t\tconst container = document.createElement(\"div\")\n\t\tObject.assign(container.style, {\n\t\t\twidth: options.width || \"450px\",\n\t\t\theight: options.height || \"min(680px, calc(100vh - 32px))\",\n\t\t\tbackgroundColor: \"transparent\",\n\t\t\tborderRadius: \"28px\",\n\t\t\toverflow: \"visible\",\n\t\t\tposition: \"relative\",\n\t\t\tboxShadow: \"none\",\n\t\t\tmaxWidth: \"calc(100vw - 32px)\",\n\t\t\tmaxHeight: \"calc(100vh - 32px)\",\n\t\t\ttransition: \"none\",\n\t\t})\n\n\t\tconst closeBtn = document.createElement(\"button\")\n\t\tcloseBtn.innerHTML = \"×\"\n\t\tObject.assign(closeBtn.style, {\n\t\t\tposition: \"absolute\",\n\t\t\tright: \"-14px\",\n\t\t\ttop: \"-14px\",\n\t\t\tfontSize: \"20px\",\n\t\t\twidth: \"36px\",\n\t\t\theight: \"36px\",\n\t\t\tborderRadius: \"9999px\",\n\t\t\tborder: \"1px solid rgba(255,255,255,0.5)\",\n\t\t\tbackground: \"rgba(255,255,255,0.9)\",\n\t\t\tcursor: \"pointer\",\n\t\t\tcolor: \"#475569\",\n\t\t\tzIndex: \"2\",\n\t\t\tboxShadow: \"0 10px 30px rgba(15,23,42,0.16)\",\n\t\t})\n\t\tcloseBtn.onclick = () => {\n\t\t\tthis.close()\n\t\t\toptions.onCloseButton?.()\n\t\t}\n\n\t\tthis.iframe = document.createElement(\"iframe\")\n\t\tthis.iframe.src = url\n\t\tthis.iframe.allow = \"local-network-access\"\n\t\tObject.assign(this.iframe.style, {\n\t\t\twidth: \"100%\",\n\t\t\theight: \"100%\",\n\t\t\tborder: \"none\",\n\t\t\tborderRadius: \"28px\",\n\t\t\tbackground: \"transparent\",\n\t\t\tdisplay: \"block\",\n\t\t})\n\n\t\tcontainer.appendChild(closeBtn)\n\t\tcontainer.appendChild(this.iframe)\n\t\tthis.modal.appendChild(container)\n\t\tdocument.body.appendChild(this.modal)\n\n\t\tthis.messageHandler = (event: MessageEvent) => {\n\t\t\tif (options.allowedOrigin && options.allowedOrigin !== \"*\") {\n\t\t\t\tif (event.origin !== options.allowedOrigin) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst data = event.data as TData\n\t\t\tif (!data || typeof data !== \"object\" || !data.type) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\toptions.onMessage(data, container, event)\n\t\t}\n\n\t\twindow.addEventListener(\"message\", this.messageHandler)\n\n\t\treturn {\n\t\t\tcontainer,\n\t\t\tiframe: this.iframe,\n\t\t}\n\t}\n\n\tclose() {\n\t\tif (typeof window === \"undefined\") return\n\n\t\tif (this.messageHandler) {\n\t\t\twindow.removeEventListener(\"message\", this.messageHandler)\n\t\t\tthis.messageHandler = null\n\t\t}\n\n\t\tif (this.modal?.parentNode) {\n\t\t\tthis.modal.parentNode.removeChild(this.modal)\n\t\t}\n\n\t\tthis.modal = null\n\t\tthis.iframe = null\n\t}\n}\n","export type LoginDeviceType = \"desktop\" | \"mobile\" | \"tablet\" | \"unknown\"\n\nexport type LoginEnvironmentInput = {\n\tcoarsePointer?: boolean\n\tmaxTouchPoints?: number\n\tplatform?: string\n\tstandalone?: boolean\n\tuserAgent?: string\n\tuserAgentDataMobile?: boolean\n}\n\nexport type LoginEnvironment = {\n\tdeviceType: LoginDeviceType\n\tisAndroid: boolean\n\tisCoarsePointer: boolean\n\tisDesktop: boolean\n\tisIOS: boolean\n\tisIPadOS: boolean\n\tisMobile: boolean\n\tisStandalone: boolean\n\tisTablet: boolean\n\tisTouch: boolean\n\tisWeChat: boolean\n\tmaxTouchPoints: number\n\tplatform: string\n\tshouldUseRedirectLogin: boolean\n\tuserAgent: string\n}\n\ntype NavigatorWithLoginSignals = Navigator & {\n\tstandalone?: boolean\n\tuserAgentData?: {\n\t\tmobile?: boolean\n\t}\n}\n\nfunction normalizeText(value?: string) {\n\treturn value || \"\"\n}\n\nfunction getRuntimeInput(): LoginEnvironmentInput {\n\tif (typeof navigator === \"undefined\") {\n\t\treturn {}\n\t}\n\n\tconst nav = navigator as NavigatorWithLoginSignals\n\tconst coarsePointer =\n\t\ttypeof window !== \"undefined\" && typeof window.matchMedia === \"function\"\n\t\t\t? window.matchMedia(\"(pointer: coarse)\").matches\n\t\t\t: undefined\n\n\treturn {\n\t\tcoarsePointer,\n\t\tmaxTouchPoints: nav.maxTouchPoints || 0,\n\t\tplatform: nav.platform || \"\",\n\t\tstandalone: nav.standalone,\n\t\tuserAgent: nav.userAgent || \"\",\n\t\tuserAgentDataMobile: nav.userAgentData?.mobile,\n\t}\n}\n\nfunction includesAny(value: string, patterns: RegExp[]) {\n\treturn patterns.some((pattern) => pattern.test(value))\n}\n\nexport function detectLoginEnvironment(\n\tinput: LoginEnvironmentInput = getRuntimeInput(),\n): LoginEnvironment {\n\tconst userAgent = normalizeText(input.userAgent)\n\tconst platform = normalizeText(input.platform)\n\tconst rawMaxTouchPoints = input.maxTouchPoints ?? 0\n\tconst maxTouchPoints = Number.isFinite(rawMaxTouchPoints)\n\t\t? Math.max(0, rawMaxTouchPoints)\n\t\t: 0\n\tconst isCoarsePointer = input.coarsePointer === true\n\tconst isTouch = maxTouchPoints > 0 || isCoarsePointer\n\n\tconst isWeChat = /micromessenger/i.test(userAgent)\n\tconst isAndroid = /\\bandroid\\b/i.test(userAgent)\n\tconst hasExplicitIOSDevice = /\\b(iPad|iPhone|iPod)\\b/i.test(userAgent)\n\tconst hasMacintoshUserAgent = /\\bMacintosh\\b/i.test(userAgent)\n\tconst hasMacPlatform = /^Mac/i.test(platform)\n\tconst isIPadOS =\n\t\t!hasExplicitIOSDevice &&\n\t\thasMacintoshUserAgent &&\n\t\thasMacPlatform &&\n\t\ttypeof input.standalone !== \"undefined\" &&\n\t\tmaxTouchPoints > 2\n\tconst isIOS = hasExplicitIOSDevice || isIPadOS\n\n\tconst isTabletByUa = includesAny(userAgent, [\n\t\t/\\biPad\\b/i,\n\t\t/\\btablet\\b/i,\n\t\t/\\bplaybook\\b/i,\n\t\t/\\bsilk\\b(?!.*\\bmobile\\b)/i,\n\t\t/\\bkindle\\b/i,\n\t\t/\\bnexus 7\\b/i,\n\t\t/\\bnexus 9\\b/i,\n\t\t/\\bxoom\\b/i,\n\t\t/\\bsm-t\\d+/i,\n\t\t/\\bgt-p\\d+/i,\n\t\t/\\bmi pad\\b/i,\n\t])\n\tconst isMobileByUa = includesAny(userAgent, [\n\t\t/\\bMobile\\b/i,\n\t\t/\\biPhone\\b/i,\n\t\t/\\biPod\\b/i,\n\t\t/\\bWindows Phone\\b/i,\n\t\t/\\bIEMobile\\b/i,\n\t\t/\\bBlackBerry\\b/i,\n\t\t/\\bBB10\\b/i,\n\t\t/\\bOpera Mini\\b/i,\n\t\t/\\bOpera Mobi\\b/i,\n\t\t/\\bwebOS\\b/i,\n\t])\n\tconst isAndroidTablet = isAndroid && !/\\bMobile\\b/i.test(userAgent)\n\tconst isTablet = isIPadOS || isTabletByUa || isAndroidTablet\n\tconst isMobile =\n\t\tinput.userAgentDataMobile === true ||\n\t\tisMobileByUa ||\n\t\t(isAndroid && !isTablet) ||\n\t\t(isIOS && !isTablet)\n\tconst deviceType: LoginDeviceType = isTablet\n\t\t? \"tablet\"\n\t\t: isMobile\n\t\t\t? \"mobile\"\n\t\t\t: userAgent || platform || isTouch\n\t\t\t\t? \"desktop\"\n\t\t\t\t: \"unknown\"\n\n\tconst shouldUseRedirectLogin =\n\t\tdeviceType === \"mobile\" || deviceType === \"tablet\" || isWeChat\n\n\treturn {\n\t\tdeviceType,\n\t\tisAndroid,\n\t\tisCoarsePointer,\n\t\tisDesktop: deviceType === \"desktop\",\n\t\tisIOS,\n\t\tisIPadOS,\n\t\tisMobile,\n\t\tisStandalone: input.standalone === true,\n\t\tisTablet,\n\t\tisTouch,\n\t\tisWeChat,\n\t\tmaxTouchPoints,\n\t\tplatform,\n\t\tshouldUseRedirectLogin,\n\t\tuserAgent,\n\t}\n}\n","import { detectLoginEnvironment } from \"./environment\"\nimport {\n\tapplyLocaleToUrl,\n\tgetAutoResolvedLocale,\n\ttype HostedFrameMessage,\n\tHostedFrameModal,\n} from \"./hosted-modal\"\n\nexport type LoginEventType =\n\t| \"LOGIN_READY\"\n\t| \"LOGIN_SUCCESS\"\n\t| \"LOGIN_CANCELLED\"\n\t| \"LOGIN_CLOSE\"\n\t| \"LOGIN_RESIZE\"\n\t| \"LOGIN_REDIRECT_REQUIRED\"\n\t| \"LOGIN_ERROR\"\n\nexport type LoginDisplayMode = \"auto\" | \"modal\" | \"popup\" | \"redirect\"\nexport type LoginFallbackRedirectMode = \"auto\" | \"manual\"\n\nexport interface LoginResult {\n\tavatar?: string | null\n\tchannel?: string\n\temail?: string | null\n\texpiresAt?: string\n\tlegacyCasdoorId?: string\n\tloginToken?: string\n\tname?: string | null\n\tusername?: string | null\n\tphoneCountryCode?: string | null\n\tphoneNumber?: string | null\n\tphoneE164?: string | null\n\tphoneVerifiedAt?: string | null\n\tuserId?: string\n\twechatOpenId?: string | null\n\twechatUnionId?: string | null\n}\n\nexport interface LoginEventData extends HostedFrameMessage, LoginResult {\n\ttype: LoginEventType\n\tattemptId?: string\n\tauthUrl?: string\n\tchannel?: string\n\terror?: string\n\tmessage?: string\n}\n\nexport interface LoginUIOptions {\n\t/** Origin to validate postMessage (defaults to '*', set for security) */\n\tallowedOrigin?: string\n\t/** Whether the SDK should close the login surface after receiving LOGIN_CLOSE. Defaults to true. */\n\tautoClose?: boolean\n\t/** Optional same-origin URL used as the no-API OAuth callback landing page. */\n\tcallbackUrl?: string\n\t/**\n\t * How to open the hosted login page. Defaults to \"auto\", which uses an\n\t * iframe modal on desktop and redirects on mobile/embedded browsers.\n\t */\n\tdisplayMode?: LoginDisplayMode\n\t/** Text for the fallback button shown when the iframe does not report readiness. */\n\tfallbackButtonText?: string\n\t/** Description for the fallback panel shown when the iframe does not report readiness. */\n\tfallbackDescription?: string\n\t/**\n\t * Whether the SDK should redirect automatically when iframe loading times out.\n\t * Defaults to \"manual\" to avoid taking over the integrator page when the\n\t * hosted page is only slow to report readiness.\n\t */\n\tfallbackRedirectMode?: LoginFallbackRedirectMode\n\t/** Title for the fallback panel shown when the iframe does not report readiness. */\n\tfallbackTitle?: string\n\t/**\n\t * How long the SDK waits for LOGIN_READY or LOGIN_RESIZE before showing the\n\t * fallback redirect button. Only used when displayMode is \"modal\".\n\t * Defaults to 6000ms.\n\t */\n\tiframeLoadTimeoutMs?: number\n\t/** Description shown while the hosted login iframe is loading. */\n\tloadingDescription?: string\n\t/** Title shown while the hosted login iframe is loading. */\n\tloadingTitle?: string\n\t/**\n\t * Whether to poll popup.closed to detect manual popup closure.\n\t * Only used when displayMode is \"popup\". Defaults to false because COOP can\n\t * make popup.closed unreliable.\n\t */\n\tmonitorPopupClosed?: boolean\n\tonCancel?: () => void\n\tonClose?: () => void\n\tonError?: (message?: string, data?: LoginEventData) => void\n\tonFallbackVisible?: () => void\n\tonSuccess?: (result: LoginResult) => void\n}\n\nexport interface LoginCallbackOptions {\n\t/**\n\t * Whether the callback helper should close the current window after\n\t * publishing the login result. Defaults to false; LoginUI closes the popup\n\t * it opened after receiving the callback event.\n\t */\n\tautoClose?: boolean\n\tonError?: (message?: string, data?: LoginEventData) => void\n\tonResult?: (data: LoginEventData) => void\n\tonSuccess?: (result: LoginResult) => void\n}\n\nexport interface LoginParams {\n\tappId: string\n\n\t/**\n\t * @deprecated Use loginUrl instead\n\t * Defaults to https://pay.imgto.link\n\t */\n\tbaseUrl?: string\n\n\t/**\n\t * Hosted login page base URL (e.g. https://pay.youidian.com)\n\t * Defaults to https://pay.imgto.link\n\t */\n\tloginUrl?: string\n\n\t/**\n\t * Optional locale prefix to prepend to the hosted login path.\n\t * If omitted, the SDK automatically resolves the locale from the browser language.\n\t */\n\tlocale?: string\n\n\t/** Preferred provider/channel code */\n\tpreferredChannel?: string\n}\n\nfunction getOrigin(value?: string): string | null {\n\tif (!value) return null\n\ttry {\n\t\treturn new URL(value).origin\n\t} catch {\n\t\treturn null\n\t}\n}\n\nfunction isValidLoginRedirectUrl(value?: string): value is string {\n\tif (!value) return false\n\ttry {\n\t\tconst url = new URL(value)\n\t\treturn url.protocol === \"https:\" || url.protocol === \"http:\"\n\t} catch {\n\t\treturn false\n\t}\n}\n\nfunction createLoginCallbackState() {\n\tif (typeof crypto !== \"undefined\" && crypto.randomUUID) {\n\t\treturn crypto.randomUUID().replace(/-/g, \"\")\n\t}\n\treturn `${Date.now().toString(36)}${Math.random().toString(36).slice(2)}`\n}\n\nfunction buildLoginCallbackUrl(callbackState: string, callbackUrl?: string) {\n\tconst baseUrl = callbackUrl || window.location.href\n\tconst url = new URL(baseUrl, window.location.href)\n\tconst returnHash = url.hash.replace(/^#/, \"\")\n\n\turl.hash = \"\"\n\turl.searchParams.set(LOGIN_CALLBACK_MARKER, \"1\")\n\turl.searchParams.set(LOGIN_CALLBACK_STATE_PARAM, callbackState)\n\tif (returnHash) {\n\t\turl.searchParams.set(LOGIN_CALLBACK_RETURN_HASH_PARAM, returnHash)\n\t} else {\n\t\turl.searchParams.delete(LOGIN_CALLBACK_RETURN_HASH_PARAM)\n\t}\n\n\treturn url.toString()\n}\n\nfunction buildLoginLaunchPayload(\n\tparams: LoginParams,\n\toptions?: LoginUIOptions,\n\tcallbackState?: string,\n) {\n\tconst parentOrigin =\n\t\ttypeof window !== \"undefined\" ? window.location.origin : undefined\n\tconst callbackUrl =\n\t\ttypeof window !== \"undefined\" && callbackState\n\t\t\t? buildLoginCallbackUrl(callbackState, options?.callbackUrl)\n\t\t\t: undefined\n\n\treturn {\n\t\tautoClose: options?.autoClose ?? true,\n\t\tcallbackUrl,\n\t\tcallbackState,\n\t\torigin: parentOrigin,\n\t\tpreferredChannel: params.preferredChannel,\n\t}\n}\n\nfunction appendLoginLaunchHash(\n\turlValue: string,\n\tpayload: ReturnType<typeof buildLoginLaunchPayload>,\n) {\n\tconst hashParams = new URLSearchParams()\n\tif (payload.autoClose === false) {\n\t\thashParams.set(\"ydAutoClose\", \"false\")\n\t}\n\tif (payload.origin) {\n\t\thashParams.set(\"ydOrigin\", payload.origin)\n\t}\n\tif (payload.callbackUrl) {\n\t\thashParams.set(\"ydCallbackUrl\", payload.callbackUrl)\n\t}\n\tif (payload.preferredChannel) {\n\t\thashParams.set(\"ydPreferredChannel\", payload.preferredChannel)\n\t}\n\tconst hash = hashParams.toString()\n\tif (!hash) {\n\t\treturn urlValue\n\t}\n\n\ttry {\n\t\tconst url = new URL(urlValue)\n\t\turl.hash = hash\n\t\treturn url.toString()\n\t} catch (_error) {\n\t\treturn `${urlValue}#${hash}`\n\t}\n}\n\nfunction buildLoginPopupName(payload: LoginLaunchPayload) {\n\treturn `youidian-login:${JSON.stringify(payload)}`\n}\n\nfunction buildLoginUrl(\n\tparams: LoginParams,\n\toptions: LoginUIOptions | undefined,\n\tlaunchPayload: LoginLaunchPayload,\n): string {\n\tconst { appId, baseUrl = \"https://pay.imgto.link\", loginUrl } = params\n\tconst rawBase = (loginUrl || baseUrl).replace(/\\/$/, \"\")\n\tconst parentOrigin = launchPayload.origin\n\n\tlet finalUrl: string\n\ttry {\n\t\tconst url = new URL(rawBase)\n\t\tif (!/\\/auth\\/connect\\/[^/]+$/.test(url.pathname)) {\n\t\t\turl.pathname =\n\t\t\t\t`${url.pathname.replace(/\\/$/, \"\")}/auth/connect/${appId}`.replace(\n\t\t\t\t\t/\\/{2,}/g,\n\t\t\t\t\t\"/\",\n\t\t\t\t)\n\t\t}\n\t\tfinalUrl = url.toString()\n\t} catch (_error) {\n\t\tif (/\\/auth\\/connect\\/[^/]+$/.test(rawBase)) {\n\t\t\tfinalUrl = rawBase\n\t\t} else {\n\t\t\tfinalUrl = `${rawBase}/auth/connect/${appId}`.replace(/\\/{2,}/g, \"/\")\n\t\t}\n\t}\n\n\tfinalUrl = applyLocaleToUrl(finalUrl, getAutoResolvedLocale(params.locale))\n\n\ttry {\n\t\tconst url = new URL(finalUrl)\n\t\tif (params.preferredChannel) {\n\t\t\turl.searchParams.set(\"preferredChannel\", params.preferredChannel)\n\t\t}\n\t\tif (options?.autoClose === false) {\n\t\t\turl.searchParams.set(\"autoClose\", \"false\")\n\t\t}\n\t\tif (parentOrigin) {\n\t\t\turl.searchParams.set(\"origin\", parentOrigin)\n\t\t}\n\t\treturn appendLoginLaunchHash(url.toString(), launchPayload)\n\t} catch (_error) {\n\t\tconst searchParams = new URLSearchParams()\n\t\tif (params.preferredChannel) {\n\t\t\tsearchParams.set(\"preferredChannel\", params.preferredChannel)\n\t\t}\n\t\tif (options?.autoClose === false) {\n\t\t\tsearchParams.set(\"autoClose\", \"false\")\n\t\t}\n\t\tif (parentOrigin) {\n\t\t\tsearchParams.set(\"origin\", parentOrigin)\n\t\t}\n\t\tconst query = searchParams.toString()\n\t\tif (!query) {\n\t\t\treturn appendLoginLaunchHash(finalUrl, launchPayload)\n\t\t}\n\t\tconst separator = finalUrl.includes(\"?\") ? \"&\" : \"?\"\n\t\treturn appendLoginLaunchHash(\n\t\t\t`${finalUrl}${separator}${query}`,\n\t\t\tlaunchPayload,\n\t\t)\n\t}\n}\n\nfunction extractLoginResult(data: LoginEventData): LoginResult {\n\treturn {\n\t\tavatar: data.avatar,\n\t\tchannel: data.channel,\n\t\temail: data.email,\n\t\texpiresAt: data.expiresAt,\n\t\tlegacyCasdoorId: data.legacyCasdoorId,\n\t\tloginToken: data.loginToken,\n\t\tname: data.name,\n\t\tusername: data.username,\n\t\tphoneCountryCode: data.phoneCountryCode,\n\t\tphoneNumber: data.phoneNumber,\n\t\tphoneE164: data.phoneE164,\n\t\tphoneVerifiedAt: data.phoneVerifiedAt,\n\t\tuserId: data.userId,\n\t\twechatOpenId: data.wechatOpenId,\n\t\twechatUnionId: data.wechatUnionId,\n\t}\n}\n\nconst LOGIN_UI_LOG_PREFIX = \"[Youidian LoginUI]\"\nconst LOGIN_CALLBACK_MARKER = \"yd_login_callback\"\nconst LOGIN_CALLBACK_RESULT_PARAM = \"yd_login_result\"\nconst LOGIN_CALLBACK_RETURN_HASH_PARAM = \"yd_login_return_hash\"\nconst LOGIN_CALLBACK_STATE_PARAM = \"yd_login_state\"\nconst LOGIN_CALLBACK_STORAGE_PREFIX = \"yd-login-callback:\"\nconst LOGIN_CALLBACK_CURRENT_PAGE_STORAGE_KEY = \"yd-login-current-page-callback\"\nconst DEFAULT_IFRAME_LOAD_TIMEOUT_MS = 6000\n\ntype LoginLaunchPayload = ReturnType<typeof buildLoginLaunchPayload>\n\nfunction decodeCallbackPayload(value: string): LoginEventData | null {\n\ttry {\n\t\tconst padded = value.padEnd(\n\t\t\tvalue.length + ((4 - (value.length % 4)) % 4),\n\t\t\t\"=\",\n\t\t)\n\t\tconst base64 = padded.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\")\n\t\tconst binary = atob(base64)\n\t\tconst json = decodeURIComponent(\n\t\t\tArray.from(\n\t\t\t\tbinary,\n\t\t\t\t(char) => `%${char.charCodeAt(0).toString(16).padStart(2, \"0\")}`,\n\t\t\t).join(\"\"),\n\t\t)\n\t\tconst parsed = JSON.parse(json) as LoginEventData\n\t\treturn parsed && typeof parsed === \"object\" && parsed.type ? parsed : null\n\t} catch {\n\t\treturn null\n\t}\n}\n\nfunction getLoginCallbackChannelName(state: string) {\n\treturn `youidian-login:${state}`\n}\n\nfunction getLoginCallbackStorageKey(state: string) {\n\treturn `${LOGIN_CALLBACK_STORAGE_PREFIX}${state}`\n}\n\nfunction publishLoginCallback(state: string, data: LoginEventData) {\n\ttry {\n\t\tconst channel = new BroadcastChannel(getLoginCallbackChannelName(state))\n\t\tchannel.postMessage(data)\n\t\tchannel.close()\n\t} catch {\n\t\t// BroadcastChannel is not available in every embedded browser.\n\t}\n\n\ttry {\n\t\tconst storageKey = getLoginCallbackStorageKey(state)\n\t\twindow.localStorage.setItem(storageKey, JSON.stringify(data))\n\t\twindow.setTimeout(() => {\n\t\t\ttry {\n\t\t\t\twindow.localStorage.removeItem(storageKey)\n\t\t\t} catch {\n\t\t\t\t// Ignore cleanup failures.\n\t\t\t}\n\t\t}, 800)\n\t} catch {\n\t\t// localStorage may be disabled; postMessage remains available below.\n\t}\n\n\ttry {\n\t\twindow.opener?.postMessage(data, window.location.origin)\n\t} catch {\n\t\t// opener is only an opportunistic fast path.\n\t}\n}\n\nfunction safeIsPopupClosed(popup: Window | null) {\n\tif (!popup) return true\n\ttry {\n\t\treturn popup.closed\n\t} catch {\n\t\tlogLoginDebug(\"Unable to read popup.closed; treating popup as open\")\n\t\treturn false\n\t}\n}\n\nfunction safeClosePopup(popup: Window | null) {\n\tif (!popup) return\n\ttry {\n\t\tpopup.close()\n\t} catch {\n\t\tlogLoginDebug(\"Unable to close popup\")\n\t}\n}\n\nfunction cleanLoginCallbackUrl(url: URL) {\n\turl.searchParams.delete(LOGIN_CALLBACK_MARKER)\n\turl.searchParams.delete(LOGIN_CALLBACK_STATE_PARAM)\n\tconst returnHash = url.searchParams.get(LOGIN_CALLBACK_RETURN_HASH_PARAM)\n\turl.searchParams.delete(LOGIN_CALLBACK_RETURN_HASH_PARAM)\n\turl.hash = returnHash ? `#${returnHash}` : \"\"\n\treturn url.toString()\n}\n\nfunction saveCurrentPageLoginCallback(data: LoginEventData) {\n\ttry {\n\t\twindow.sessionStorage.setItem(\n\t\t\tLOGIN_CALLBACK_CURRENT_PAGE_STORAGE_KEY,\n\t\t\tJSON.stringify({\n\t\t\t\tcreatedAt: Date.now(),\n\t\t\t\tdata,\n\t\t\t}),\n\t\t)\n\t} catch {\n\t\t// sessionStorage may be disabled in some embedded browsers.\n\t}\n}\n\nfunction readCurrentPageLoginCallback() {\n\ttry {\n\t\tconst raw = window.sessionStorage.getItem(\n\t\t\tLOGIN_CALLBACK_CURRENT_PAGE_STORAGE_KEY,\n\t\t)\n\t\tif (!raw) return null\n\t\twindow.sessionStorage.removeItem(LOGIN_CALLBACK_CURRENT_PAGE_STORAGE_KEY)\n\t\tconst parsed = JSON.parse(raw) as {\n\t\t\tcreatedAt?: number\n\t\t\tdata?: LoginEventData\n\t\t} | null\n\t\tconst data = parsed?.data\n\t\treturn data && typeof data === \"object\" && data.type ? data : null\n\t} catch {\n\t\treturn null\n\t}\n}\n\nfunction deliverLoginCallbackData(\n\tdata: LoginEventData,\n\toptions?: LoginCallbackOptions,\n) {\n\toptions?.onResult?.(data)\n\tswitch (data.type) {\n\t\tcase \"LOGIN_SUCCESS\":\n\t\t\toptions?.onSuccess?.(extractLoginResult(data))\n\t\t\tbreak\n\t\tcase \"LOGIN_ERROR\":\n\t\t\toptions?.onError?.(data.message || data.error, data)\n\t\t\tbreak\n\t\tdefault:\n\t\t\tbreak\n\t}\n}\n\nexport function handleLoginCallbackIfPresent(options?: LoginCallbackOptions) {\n\tif (typeof window === \"undefined\") {\n\t\treturn false\n\t}\n\n\tconst url = new URL(window.location.href)\n\tif (url.searchParams.get(LOGIN_CALLBACK_MARKER) !== \"1\") {\n\t\tif (options?.onResult || options?.onSuccess || options?.onError) {\n\t\t\tconst pendingData = readCurrentPageLoginCallback()\n\t\t\tif (pendingData) {\n\t\t\t\tdeliverLoginCallbackData(pendingData, options)\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t\treturn false\n\t}\n\n\tconst state = url.searchParams.get(LOGIN_CALLBACK_STATE_PARAM) || \"\"\n\tconst hashParams = new URLSearchParams(url.hash.replace(/^#/, \"\"))\n\tconst rawResult = hashParams.get(LOGIN_CALLBACK_RESULT_PARAM)\n\tconst data: LoginEventData | null =\n\t\trawResult && state\n\t\t\t? decodeCallbackPayload(rawResult)\n\t\t\t: {\n\t\t\t\t\ttype: \"LOGIN_ERROR\",\n\t\t\t\t\tmessage: \"Missing login callback result\",\n\t\t\t\t}\n\n\ttry {\n\t\tdocument.documentElement.style.visibility = \"hidden\"\n\t} catch {\n\t\t// This is best-effort to avoid a visible callback-page flash.\n\t}\n\n\tif (state && data) {\n\t\tpublishLoginCallback(state, data)\n\t}\n\tif (data && (options?.onResult || options?.onSuccess || options?.onError)) {\n\t\tdeliverLoginCallbackData(data, options)\n\t} else if (data) {\n\t\tsaveCurrentPageLoginCallback(data)\n\t}\n\n\ttry {\n\t\twindow.history.replaceState(null, \"\", cleanLoginCallbackUrl(url))\n\t} catch {\n\t\t// Ignore history cleanup failures.\n\t}\n\n\tif (options?.autoClose === true) {\n\t\twindow.setTimeout(() => {\n\t\t\ttry {\n\t\t\t\twindow.close()\n\t\t\t} catch {\n\t\t\t\t// Some browsers disallow script-closing the current window.\n\t\t\t}\n\t\t}, 30)\n\t\treturn true\n\t}\n\n\ttry {\n\t\tdocument.documentElement.style.visibility = \"\"\n\t} catch {\n\t\t// Ignore visibility restoration failures.\n\t}\n\n\treturn true\n}\n\nfunction logLoginDebug(message: string, details?: Record<string, unknown>) {\n\tif (typeof console === \"undefined\") return\n\tconsole.debug(LOGIN_UI_LOG_PREFIX, message, details || {})\n}\n\nfunction logLoginInfo(message: string, details?: Record<string, unknown>) {\n\tif (typeof console === \"undefined\") return\n\tconsole.info(LOGIN_UI_LOG_PREFIX, message, details || {})\n}\n\nfunction logLoginWarn(message: string, details?: Record<string, unknown>) {\n\tif (typeof console === \"undefined\") return\n\tconsole.warn(LOGIN_UI_LOG_PREFIX, message, details || {})\n}\n\nfunction getIframeLoadTimeoutMs(options?: LoginUIOptions) {\n\tconst timeout = options?.iframeLoadTimeoutMs\n\tif (typeof timeout !== \"number\" || !Number.isFinite(timeout)) {\n\t\treturn DEFAULT_IFRAME_LOAD_TIMEOUT_MS\n\t}\n\treturn Math.max(0, timeout)\n}\n\nfunction applyLoginPanelStyle(panel: HTMLDivElement) {\n\tObject.assign(panel.style, {\n\t\tposition: \"absolute\",\n\t\tinset: \"0\",\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tjustifyContent: \"center\",\n\t\tborder: \"1px solid rgba(229,229,229,0.92)\",\n\t\tborderRadius: \"28px\",\n\t\tbackground: \"rgba(255,255,255,0.94)\",\n\t\tcolor: \"#0f172a\",\n\t\tpadding: \"24px\",\n\t\ttextAlign: \"center\",\n\t\tzIndex: \"1\",\n\t\tboxShadow: \"0 18px 50px rgba(15,15,15,0.06)\",\n\t\tbackdropFilter: \"blur(16px)\",\n\t})\n}\n\nfunction applyLoginLoadingPanelStyle(panel: HTMLDivElement) {\n\tObject.assign(panel.style, {\n\t\tposition: \"absolute\",\n\t\tinset: \"0\",\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tjustifyContent: \"center\",\n\t\tborder: \"0\",\n\t\tborderRadius: \"28px\",\n\t\tbackground: \"rgba(255,255,255,0.94)\",\n\t\tcolor: \"#0f172a\",\n\t\tpadding: \"24px\",\n\t\ttextAlign: \"center\",\n\t\tzIndex: \"1\",\n\t\tboxShadow: \"none\",\n\t\tbackdropFilter: \"blur(16px)\",\n\t})\n}\n\nfunction createLoginPanelContent() {\n\tconst content = document.createElement(\"div\")\n\tObject.assign(content.style, {\n\t\tmaxWidth: \"360px\",\n\t})\n\n\tconst badge = document.createElement(\"div\")\n\tbadge.textContent = \"YOUiDIAN\"\n\tObject.assign(badge.style, {\n\t\tdisplay: \"inline-flex\",\n\t\talignItems: \"center\",\n\t\tborder: \"1px solid rgba(229,229,229,0.92)\",\n\t\tborderRadius: \"9999px\",\n\t\tbackground: \"#fafafa\",\n\t\tcolor: \"#171717\",\n\t\tfontSize: \"11px\",\n\t\tfontWeight: \"700\",\n\t\tletterSpacing: \"0.22em\",\n\t\tlineHeight: \"1\",\n\t\tmarginBottom: \"18px\",\n\t\tpadding: \"8px 12px\",\n\t})\n\n\tcontent.appendChild(badge)\n\n\treturn content\n}\n\nfunction createBrandLoadingMark() {\n\tconst logo = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\")\n\tlogo.setAttribute(\"viewBox\", \"0 0 1024 1024\")\n\tlogo.setAttribute(\"fill\", \"none\")\n\tlogo.setAttribute(\"aria-hidden\", \"true\")\n\tObject.assign(logo.style, {\n\t\twidth: \"112px\",\n\t\theight: \"112px\",\n\t\tcolor: \"#22c55e\",\n\t\tdisplay: \"block\",\n\t\toverflow: \"visible\",\n\t})\n\n\tconst group = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\")\n\tgroup.setAttribute(\"fill\", \"currentColor\")\n\n\tconst ring = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\")\n\tring.setAttribute(\n\t\t\"d\",\n\t\t\"M704.298 679.54A264 264 0 1 1 704.298 309.46A49 49 0 0 1 634.4 378.149A166 166 0 1 0 634.4 610.851A49 49 0 0 1 704.298 679.54Z\",\n\t)\n\tring.setAttribute(\"class\", \"youidian-sdk-brand-loading__ring\")\n\n\tconst dot = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\")\n\tdot.setAttribute(\"class\", \"youidian-sdk-brand-loading__dot\")\n\tdot.setAttribute(\"cx\", \"714.5\")\n\tdot.setAttribute(\"cy\", \"490.5\")\n\tdot.setAttribute(\"r\", \"68\")\n\n\tgroup.appendChild(ring)\n\tgroup.appendChild(dot)\n\tlogo.appendChild(group)\n\n\treturn logo\n}\n\nfunction createBrandLoadingCopy() {\n\tconst brand = document.createElement(\"div\")\n\tbrand.className = \"youidian-sdk-brand-loading__copy\"\n\tObject.assign(brand.style, {\n\t\tdisplay: \"flex\",\n\t\tflexDirection: \"column\",\n\t\talignItems: \"flex-start\",\n\t\tjustifyContent: \"center\",\n\t\tlineHeight: \"1\",\n\t})\n\n\tconst name = document.createElement(\"div\")\n\tname.className = \"youidian-sdk-brand-loading__name\"\n\tname.textContent = \"优易点\"\n\tObject.assign(name.style, {\n\t\tcolor: \"#0f172a\",\n\t\tfontSize: \"34px\",\n\t\tfontWeight: \"900\",\n\t\tletterSpacing: \"0\",\n\t\tlineHeight: \"1\",\n\t})\n\n\tconst tagline = document.createElement(\"div\")\n\ttagline.className = \"youidian-sdk-brand-loading__tagline\"\n\ttagline.textContent = \"开发者服务中台\"\n\tObject.assign(tagline.style, {\n\t\tcolor: \"#64748b\",\n\t\tfontSize: \"16px\",\n\t\tfontWeight: \"700\",\n\t\tletterSpacing: \"0.24em\",\n\t\tlineHeight: \"1\",\n\t\tmarginTop: \"6px\",\n\t})\n\n\tbrand.appendChild(name)\n\tbrand.appendChild(tagline)\n\treturn brand\n}\n\nfunction createLoginPanelTitle(value: string) {\n\tconst title = document.createElement(\"div\")\n\ttitle.textContent = value\n\tObject.assign(title.style, {\n\t\tcolor: \"#171717\",\n\t\tfontSize: \"18px\",\n\t\tfontWeight: \"700\",\n\t\tlineHeight: \"1.35\",\n\t\tmarginBottom: \"10px\",\n\t})\n\treturn title\n}\n\nfunction createLoginPanelDescription(value: string) {\n\tconst description = document.createElement(\"div\")\n\tdescription.textContent = value\n\tObject.assign(description.style, {\n\t\tcolor: \"#525252\",\n\t\tfontSize: \"14px\",\n\t\tlineHeight: \"1.6\",\n\t\tmarginBottom: \"20px\",\n\t})\n\treturn description\n}\n\nfunction ensureLoginLoadingStyles() {\n\tif (document.getElementById(\"youidian-login-loading-style\")) {\n\t\treturn\n\t}\n\tconst style = document.createElement(\"style\")\n\tstyle.id = \"youidian-login-loading-style\"\n\tstyle.textContent = `\n\t\t.youidian-sdk-brand-loading__ring,\n\t\t.youidian-sdk-brand-loading__dot {\n\t\t\ttransform-box: fill-box;\n\t\t\ttransform-origin: center;\n\t\t\twill-change: opacity, transform;\n\t\t}\n\n\t\t.youidian-sdk-brand-loading__ring {\n\t\t\tanimation: youidian-sdk-brand-loading-ring 1400ms cubic-bezier(0.4, 0, 0.2, 1) infinite;\n\t\t}\n\n\t\t.youidian-sdk-brand-loading__dot {\n\t\t\tanimation: youidian-sdk-brand-loading-dot 1400ms cubic-bezier(0.4, 0, 0.2, 1) infinite;\n\t\t}\n\n\t\t.youidian-sdk-brand-loading__copy {\n\t\t\twill-change: opacity, transform;\n\t\t\tanimation: youidian-sdk-brand-loading-copy 1600ms cubic-bezier(0.4, 0, 0.2, 1) infinite;\n\t\t}\n\n\t\t.youidian-sdk-brand-loading__tagline {\n\t\t\twill-change: opacity;\n\t\t\tanimation: youidian-sdk-brand-loading-tagline 1600ms cubic-bezier(0.4, 0, 0.2, 1) infinite;\n\t\t}\n\n\t\t@keyframes youidian-sdk-brand-loading-ring {\n\t\t\t0%,\n\t\t\t100% {\n\t\t\t\topacity: 0.72;\n\t\t\t\ttransform: rotate(0deg) scale(0.98);\n\t\t\t}\n\t\t\t50% {\n\t\t\t\topacity: 1;\n\t\t\t\ttransform: rotate(8deg) scale(1.02);\n\t\t\t}\n\t\t}\n\n\t\t@keyframes youidian-sdk-brand-loading-dot {\n\t\t\t0%,\n\t\t\t100% {\n\t\t\t\topacity: 0.55;\n\t\t\t\ttransform: scale(0.9);\n\t\t\t}\n\t\t\t50% {\n\t\t\t\topacity: 1;\n\t\t\t\ttransform: scale(1.08);\n\t\t\t}\n\t\t}\n\n\t\t@keyframes youidian-sdk-brand-loading-copy {\n\t\t\t0%,\n\t\t\t100% {\n\t\t\t\topacity: 0.86;\n\t\t\t\ttransform: translateY(0);\n\t\t\t}\n\t\t\t50% {\n\t\t\t\topacity: 1;\n\t\t\t\ttransform: translateY(-1px);\n\t\t\t}\n\t\t}\n\n\t\t@keyframes youidian-sdk-brand-loading-tagline {\n\t\t\t0%,\n\t\t\t100% {\n\t\t\t\topacity: 0.64;\n\t\t\t}\n\t\t\t50% {\n\t\t\t\topacity: 0.92;\n\t\t\t}\n\t\t}\n\n\t\t@media (prefers-reduced-motion: reduce) {\n\t\t\t.youidian-sdk-brand-loading__ring,\n\t\t\t.youidian-sdk-brand-loading__dot,\n\t\t\t.youidian-sdk-brand-loading__copy,\n\t\t\t.youidian-sdk-brand-loading__tagline {\n\t\t\t\tanimation: none;\n\t\t\t\topacity: 1;\n\t\t\t\ttransform: none;\n\t\t\t}\n\t\t}\n\t`\n\tdocument.head.appendChild(style)\n}\n\nfunction createLoginLoadingPanel() {\n\tensureLoginLoadingStyles()\n\tconst panel = document.createElement(\"div\")\n\tapplyLoginLoadingPanelStyle(panel)\n\tpanel.setAttribute(\"role\", \"status\")\n\tpanel.setAttribute(\"aria-label\", \"优易点开发者服务中台\")\n\n\tconst content = document.createElement(\"div\")\n\tObject.assign(content.style, {\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tjustifyContent: \"center\",\n\t\tgap: \"12px\",\n\t})\n\tcontent.appendChild(createBrandLoadingMark())\n\tcontent.appendChild(createBrandLoadingCopy())\n\tpanel.appendChild(content)\n\n\treturn panel\n}\n\nfunction createLoginRedirectingPanel(_options: {\n\tdescription: string\n\ttitle: string\n}) {\n\treturn createLoginLoadingPanel()\n}\n\nfunction createLoginFallbackPanel(options: {\n\tbuttonText: string\n\tdescription: string\n\tonRedirect: () => void\n\ttitle: string\n}) {\n\tconst panel = document.createElement(\"div\")\n\tapplyLoginPanelStyle(panel)\n\n\tconst content = createLoginPanelContent()\n\n\tconst button = document.createElement(\"button\")\n\tbutton.type = \"button\"\n\tbutton.textContent = options.buttonText\n\tObject.assign(button.style, {\n\t\twidth: \"100%\",\n\t\tborder: \"0\",\n\t\tborderRadius: \"12px\",\n\t\tbackground: \"#0a0a0a\",\n\t\tcolor: \"#ffffff\",\n\t\tcursor: \"pointer\",\n\t\tfontSize: \"14px\",\n\t\tfontWeight: \"700\",\n\t\tminHeight: \"44px\",\n\t\tpadding: \"12px 16px\",\n\t\tboxShadow: \"0 12px 28px rgba(17,17,17,0.14)\",\n\t})\n\tbutton.onclick = options.onRedirect\n\n\tcontent.appendChild(createLoginPanelTitle(options.title))\n\tcontent.appendChild(createLoginPanelDescription(options.description))\n\tcontent.appendChild(button)\n\tpanel.appendChild(content)\n\n\treturn panel\n}\n\nexport class LoginUI extends HostedFrameModal<LoginEventData> {\n\tprivate popup: Window | null = null\n\tprivate callbackChannel: BroadcastChannel | null = null\n\tprivate callbackStorageHandler: ((event: StorageEvent) => void) | null = null\n\tprivate popupMessageHandler: ((event: MessageEvent) => void) | null = null\n\tprivate closeMonitor: number | null = null\n\tprivate iframeFallbackPanel: HTMLDivElement | null = null\n\tprivate iframeLoadingPanel: HTMLDivElement | null = null\n\tprivate iframeLoadTimer: number | null = null\n\tprivate iframeRedirectTimer: number | null = null\n\tprivate iframeReady = false\n\tprivate completed = false\n\n\tprivate cleanup() {\n\t\tif (this.callbackChannel) {\n\t\t\tthis.callbackChannel.close()\n\t\t}\n\t\tif (typeof window !== \"undefined\" && this.callbackStorageHandler) {\n\t\t\twindow.removeEventListener(\"storage\", this.callbackStorageHandler)\n\t\t}\n\t\tif (typeof window !== \"undefined\" && this.popupMessageHandler) {\n\t\t\twindow.removeEventListener(\"message\", this.popupMessageHandler)\n\t\t}\n\t\tthis.callbackChannel = null\n\t\tthis.callbackStorageHandler = null\n\t\tif (typeof window !== \"undefined\" && this.closeMonitor) {\n\t\t\twindow.clearInterval(this.closeMonitor)\n\t\t}\n\t\tif (typeof window !== \"undefined\" && this.iframeLoadTimer) {\n\t\t\twindow.clearTimeout(this.iframeLoadTimer)\n\t\t}\n\t\tif (typeof window !== \"undefined\" && this.iframeRedirectTimer) {\n\t\t\twindow.clearTimeout(this.iframeRedirectTimer)\n\t\t}\n\t\tif (this.iframeFallbackPanel?.parentNode) {\n\t\t\tthis.iframeFallbackPanel.parentNode.removeChild(this.iframeFallbackPanel)\n\t\t}\n\t\tif (this.iframeLoadingPanel?.parentNode) {\n\t\t\tthis.iframeLoadingPanel.parentNode.removeChild(this.iframeLoadingPanel)\n\t\t}\n\t\tthis.popupMessageHandler = null\n\t\tthis.closeMonitor = null\n\t\tthis.iframeFallbackPanel = null\n\t\tthis.iframeLoadingPanel = null\n\t\tthis.iframeLoadTimer = null\n\t\tthis.iframeRedirectTimer = null\n\t\tthis.iframeReady = false\n\t\tthis.popup = null\n\t\tthis.completed = false\n\t}\n\n\tprivate markIframeReady() {\n\t\tif (this.iframeReady) return\n\t\tthis.iframeReady = true\n\t\tif (typeof window !== \"undefined\" && this.iframeLoadTimer) {\n\t\t\twindow.clearTimeout(this.iframeLoadTimer)\n\t\t\tthis.iframeLoadTimer = null\n\t\t}\n\t\tif (typeof window !== \"undefined\" && this.iframeRedirectTimer) {\n\t\t\twindow.clearTimeout(this.iframeRedirectTimer)\n\t\t\tthis.iframeRedirectTimer = null\n\t\t}\n\t\tif (this.iframeFallbackPanel?.parentNode) {\n\t\t\tthis.iframeFallbackPanel.parentNode.removeChild(this.iframeFallbackPanel)\n\t\t}\n\t\tif (this.iframeLoadingPanel?.parentNode) {\n\t\t\tthis.iframeLoadingPanel.parentNode.removeChild(this.iframeLoadingPanel)\n\t\t}\n\t\tthis.iframeFallbackPanel = null\n\t\tthis.iframeLoadingPanel = null\n\t}\n\n\tprivate showIframeLoading(container: HTMLDivElement) {\n\t\tif (this.iframeLoadingPanel || this.iframeReady) {\n\t\t\treturn\n\t\t}\n\n\t\tconst panel = createLoginLoadingPanel()\n\t\tthis.iframeLoadingPanel = panel\n\t\tcontainer.appendChild(panel)\n\t}\n\n\tprivate showIframeFallback(options: {\n\t\tcontainer: HTMLDivElement\n\t\tfinalUrl: string\n\t\tlaunchPayload: LoginLaunchPayload\n\t\tloginOptions?: LoginUIOptions\n\t}) {\n\t\tif (this.iframeReady || this.iframeFallbackPanel) {\n\t\t\treturn\n\t\t}\n\n\t\tconst { container, finalUrl, loginOptions } = options\n\t\tlogLoginWarn(\"Hosted login iframe did not report ready in time\", {\n\t\t\tloginUrl: finalUrl,\n\t\t})\n\t\tif (this.iframeLoadingPanel?.parentNode) {\n\t\t\tthis.iframeLoadingPanel.parentNode.removeChild(this.iframeLoadingPanel)\n\t\t}\n\t\tthis.iframeLoadingPanel = null\n\n\t\tif (loginOptions?.fallbackRedirectMode === \"auto\") {\n\t\t\tconst panel = createLoginRedirectingPanel({\n\t\t\t\tdescription:\n\t\t\t\t\tloginOptions?.fallbackDescription ||\n\t\t\t\t\t\"The embedded login page is taking longer than expected. Redirecting you to the login page now.\",\n\t\t\t\ttitle: loginOptions?.fallbackTitle || \"Redirecting to login page\",\n\t\t\t})\n\t\t\tthis.iframeFallbackPanel = panel\n\t\t\tcontainer.appendChild(panel)\n\t\t\tloginOptions?.onFallbackVisible?.()\n\t\t\tthis.iframeRedirectTimer = window.setTimeout(() => {\n\t\t\t\tthis.iframeRedirectTimer = null\n\t\t\t\tlogLoginInfo(\"Redirecting to hosted login fallback page\", {\n\t\t\t\t\tloginUrl: finalUrl,\n\t\t\t\t})\n\t\t\t\twindow.location.assign(finalUrl)\n\t\t\t}, 350)\n\t\t\treturn\n\t\t}\n\n\t\tconst panel = createLoginFallbackPanel({\n\t\t\tbuttonText: loginOptions?.fallbackButtonText || \"Continue to login\",\n\t\t\tdescription:\n\t\t\t\tloginOptions?.fallbackDescription ||\n\t\t\t\t\"The embedded login page is taking longer than expected. Continue on the login page to finish signing in.\",\n\t\t\ttitle: loginOptions?.fallbackTitle || \"Login page is still loading\",\n\t\t\tonRedirect: () => {\n\t\t\t\tlogLoginInfo(\"Redirecting to hosted login fallback page\", {\n\t\t\t\t\tloginUrl: finalUrl,\n\t\t\t\t})\n\t\t\t\twindow.location.assign(finalUrl)\n\t\t\t},\n\t\t})\n\n\t\tthis.iframeFallbackPanel = panel\n\t\tcontainer.appendChild(panel)\n\t\tloginOptions?.onFallbackVisible?.()\n\t}\n\n\tprivate startIframeWatchdog(options: {\n\t\tcontainer: HTMLDivElement\n\t\tfinalUrl: string\n\t\tlaunchPayload: LoginLaunchPayload\n\t\tloginOptions?: LoginUIOptions\n\t}) {\n\t\tif (typeof window === \"undefined\") return\n\n\t\tconst timeoutMs = getIframeLoadTimeoutMs(options.loginOptions)\n\t\tif (timeoutMs === 0) {\n\t\t\tthis.showIframeFallback(options)\n\t\t\treturn\n\t\t}\n\n\t\tthis.iframeLoadTimer = window.setTimeout(() => {\n\t\t\tthis.iframeLoadTimer = null\n\t\t\tthis.showIframeFallback(options)\n\t\t}, timeoutMs)\n\t}\n\n\tprivate handleLoginEvent(data: LoginEventData, options?: LoginUIOptions) {\n\t\tif (!data || typeof data !== \"object\" || !data.type) {\n\t\t\tlogLoginDebug(\"Ignored non-login event payload\")\n\t\t\treturn\n\t\t}\n\n\t\tlogLoginInfo(\"Received login event\", {\n\t\t\ttype: data.type,\n\t\t})\n\n\t\tswitch (data.type) {\n\t\t\tcase \"LOGIN_READY\":\n\t\t\t\tbreak\n\t\t\tcase \"LOGIN_SUCCESS\":\n\t\t\t\tif (this.completed) {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tthis.completed = true\n\t\t\t\tlogLoginInfo(\"Login succeeded\", {\n\t\t\t\t\tchannel: data.channel || null,\n\t\t\t\t\tuserId: data.userId || null,\n\t\t\t\t})\n\t\t\t\toptions?.onSuccess?.(extractLoginResult(data))\n\t\t\t\tbreak\n\t\t\tcase \"LOGIN_CANCELLED\":\n\t\t\t\tlogLoginInfo(\"Login cancelled\")\n\t\t\t\toptions?.onCancel?.()\n\t\t\t\tbreak\n\t\t\tcase \"LOGIN_RESIZE\":\n\t\t\t\tbreak\n\t\t\tcase \"LOGIN_REDIRECT_REQUIRED\":\n\t\t\t\tif (!isValidLoginRedirectUrl(data.authUrl)) {\n\t\t\t\t\tlogLoginWarn(\"Login redirect requested with invalid authUrl\")\n\t\t\t\t\toptions?.onError?.(\"Login redirect URL is invalid\", data)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tlogLoginInfo(\"Login redirect requested by hosted page\", {\n\t\t\t\t\tattemptId: data.attemptId || null,\n\t\t\t\t\tchannel: data.channel || null,\n\t\t\t\t\tauthUrl: data.authUrl,\n\t\t\t\t})\n\t\t\t\tthis.close()\n\t\t\t\twindow.location.assign(data.authUrl)\n\t\t\t\tbreak\n\t\t\tcase \"LOGIN_ERROR\":\n\t\t\t\tif (this.completed) {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tlogLoginWarn(\"Login flow reported an error\", {\n\t\t\t\t\tmessage: data.message || data.error || null,\n\t\t\t\t})\n\t\t\t\toptions?.onError?.(data.message || data.error, data)\n\t\t\t\tbreak\n\t\t\tcase \"LOGIN_CLOSE\":\n\t\t\t\tif (options?.autoClose === false) {\n\t\t\t\t\tlogLoginInfo(\n\t\t\t\t\t\t\"Login surface requested close; autoClose disabled, keeping it open\",\n\t\t\t\t\t)\n\t\t\t\t\toptions?.onClose?.()\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tlogLoginInfo(\"Login surface requested close; autoClose enabled\")\n\t\t\t\tthis.close()\n\t\t\t\toptions?.onClose?.()\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\tprivate openLoginRedirect(params: LoginParams, options?: LoginUIOptions) {\n\t\tif (typeof window === \"undefined\") return\n\n\t\tconst { callbackState, finalUrl, launchPayload } = this.buildOpenContext(\n\t\t\tparams,\n\t\t\toptions,\n\t\t)\n\t\tlogLoginInfo(\"Redirecting to hosted login page\", {\n\t\t\tappId: params.appId,\n\t\t\tcallbackState,\n\t\t\tcallbackUrl: launchPayload.callbackUrl || null,\n\t\t\thasCallbackUrl: Boolean(launchPayload.callbackUrl),\n\t\t\tloginUrl: finalUrl,\n\t\t\tautoClose: options?.autoClose ?? true,\n\t\t\tdisplayMode: \"redirect\",\n\t\t\tpageUrl: window.location.href,\n\t\t\tparentOrigin: launchPayload.origin || null,\n\t\t})\n\t\twindow.location.assign(finalUrl)\n\t}\n\n\tprivate listenForLoginCallback(\n\t\tcallbackState: string,\n\t\toptions?: LoginUIOptions,\n\t) {\n\t\ttry {\n\t\t\tthis.callbackChannel = new BroadcastChannel(\n\t\t\t\tgetLoginCallbackChannelName(callbackState),\n\t\t\t)\n\t\t\tthis.callbackChannel.onmessage = (event) => {\n\t\t\t\tthis.handleLoginEvent(event.data as LoginEventData, options)\n\t\t\t\tthis.handleLoginEvent({ type: \"LOGIN_CLOSE\" }, options)\n\t\t\t}\n\t\t} catch {\n\t\t\tlogLoginDebug(\"BroadcastChannel is unavailable for login callback\")\n\t\t}\n\n\t\tthis.callbackStorageHandler = (event: StorageEvent) => {\n\t\t\tif (\n\t\t\t\tevent.key !== getLoginCallbackStorageKey(callbackState) ||\n\t\t\t\t!event.newValue\n\t\t\t) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst data = JSON.parse(event.newValue) as LoginEventData\n\t\t\t\tthis.handleLoginEvent(data, options)\n\t\t\t\tthis.handleLoginEvent({ type: \"LOGIN_CLOSE\" }, options)\n\t\t\t} catch {\n\t\t\t\tlogLoginWarn(\"Failed to parse login callback storage payload\")\n\t\t\t}\n\t\t}\n\t\twindow.addEventListener(\"storage\", this.callbackStorageHandler)\n\t}\n\n\tclose() {\n\t\tlogLoginInfo(\"close() called\", {\n\t\t\thasModal: Boolean(this.modal),\n\t\t\thasPopup: Boolean(this.popup),\n\t\t\tpopupClosed: safeIsPopupClosed(this.popup),\n\t\t})\n\t\tsafeClosePopup(this.popup)\n\t\tsuper.close()\n\t\tthis.cleanup()\n\t}\n\n\tprivate buildOpenContext(params: LoginParams, options?: LoginUIOptions) {\n\t\tconst callbackState = createLoginCallbackState()\n\t\tconst launchPayload = buildLoginLaunchPayload(\n\t\t\tparams,\n\t\t\toptions,\n\t\t\tcallbackState,\n\t\t)\n\t\tconst finalUrl = buildLoginUrl(params, options, launchPayload)\n\t\treturn { callbackState, finalUrl, launchPayload }\n\t}\n\n\tprivate openLoginModal(params: LoginParams, options?: LoginUIOptions) {\n\t\tif (typeof document === \"undefined\") return\n\t\tif (this.modal) return\n\n\t\tconst { callbackState, finalUrl, launchPayload } = this.buildOpenContext(\n\t\t\tparams,\n\t\t\toptions,\n\t\t)\n\t\tconst loginOrigin = getOrigin(finalUrl)\n\t\tlogLoginInfo(\"Opening hosted login iframe modal\", {\n\t\t\tappId: params.appId,\n\t\t\tcallbackState,\n\t\t\tcallbackUrl: launchPayload.callbackUrl || null,\n\t\t\thasCallbackUrl: Boolean(launchPayload.callbackUrl),\n\t\t\tloginUrl: finalUrl,\n\t\t\tallowedOrigin: options?.allowedOrigin || null,\n\t\t\tautoClose: options?.autoClose ?? true,\n\t\t\tdisplayMode: \"modal\",\n\t\t\tpageUrl: typeof window !== \"undefined\" ? window.location.href : null,\n\t\t\tparentOrigin: launchPayload.origin || null,\n\t\t})\n\n\t\tthis.completed = false\n\t\tthis.iframeReady = false\n\t\tthis.listenForLoginCallback(callbackState, options)\n\t\tconst hostedFrame = this.openHostedFrame(finalUrl, {\n\t\t\tallowedOrigin: options?.allowedOrigin || loginOrigin || undefined,\n\t\t\theight: \"min(760px, 94vh)\",\n\t\t\tonCloseButton: () => {\n\t\t\t\toptions?.onCancel?.()\n\t\t\t\toptions?.onClose?.()\n\t\t\t},\n\t\t\tonMessage: (data, _container, event) => {\n\t\t\t\tconst isIframeEvent = event.source === this.iframe?.contentWindow\n\t\t\t\t// 诊断:LOGIN_READY/LOGIN_RESIZE 到达但 event.source 不匹配当前 iframe\n\t\t\t\t// 时,markIframeReady 不会执行,loading 面板会卡住直至 6s fallback。\n\t\t\t\t// 这类「iframe 不出现」曾无任何日志,加 warn 便于线上定位根因\n\t\t\t\t// (常见诱因:iframe 加载了被缓存/重定向的旧文档导致 contentWindow\n\t\t\t\t// 身份变化,或同一页面挂了多个 SDK 实例)。\n\t\t\t\tif (\n\t\t\t\t\t!isIframeEvent &&\n\t\t\t\t\t(data.type === \"LOGIN_READY\" || data.type === \"LOGIN_RESIZE\")\n\t\t\t\t) {\n\t\t\t\t\tlogLoginWarn(\n\t\t\t\t\t\t\"Login lifecycle event ignored: event.source does not match iframe contentWindow\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: data.type,\n\t\t\t\t\t\t\teventOrigin: event.origin,\n\t\t\t\t\t\t\thasIframe: Boolean(this.iframe),\n\t\t\t\t\t\t\thasIframeContentWindow: Boolean(this.iframe?.contentWindow),\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\t(isIframeEvent &&\n\t\t\t\t\t\t(data.type === \"LOGIN_READY\" || data.type === \"LOGIN_RESIZE\")) ||\n\t\t\t\t\tdata.type === \"LOGIN_SUCCESS\" ||\n\t\t\t\t\tdata.type === \"LOGIN_ERROR\"\n\t\t\t\t) {\n\t\t\t\t\tthis.markIframeReady()\n\t\t\t\t}\n\t\t\t\tthis.handleLoginEvent(data, options)\n\t\t\t},\n\t\t\twidth: \"min(520px, 100%)\",\n\t\t})\n\n\t\tif (hostedFrame) {\n\t\t\tthis.showIframeLoading(hostedFrame.container)\n\t\t\tthis.startIframeWatchdog({\n\t\t\t\tcontainer: hostedFrame.container,\n\t\t\t\tfinalUrl,\n\t\t\t\tlaunchPayload,\n\t\t\t\tloginOptions: options,\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate openLoginPopup(params: LoginParams, options?: LoginUIOptions) {\n\t\tif (typeof window === \"undefined\") return\n\t\tif (this.popup && !safeIsPopupClosed(this.popup)) return\n\n\t\tconst { callbackState, finalUrl, launchPayload } = this.buildOpenContext(\n\t\t\tparams,\n\t\t\toptions,\n\t\t)\n\t\tlogLoginInfo(\"Opening hosted login popup\", {\n\t\t\tappId: params.appId,\n\t\t\tcallbackState,\n\t\t\tcallbackUrl: launchPayload.callbackUrl || null,\n\t\t\thasCallbackUrl: Boolean(launchPayload.callbackUrl),\n\t\t\tloginUrl: finalUrl,\n\t\t\tallowedOrigin: options?.allowedOrigin || null,\n\t\t\tautoClose: options?.autoClose ?? true,\n\t\t\tdisplayMode: \"popup\",\n\t\t\tpageUrl: typeof window !== \"undefined\" ? window.location.href : null,\n\t\t\tparentOrigin: launchPayload.origin || null,\n\t\t})\n\t\tconst popupWidth = 520\n\t\tconst popupHeight = 720\n\t\tconst left = Math.max(\n\t\t\t0,\n\t\t\tMath.round(window.screenX + (window.outerWidth - popupWidth) / 2),\n\t\t)\n\t\tconst top = Math.max(\n\t\t\t0,\n\t\t\tMath.round(window.screenY + (window.outerHeight - popupHeight) / 2),\n\t\t)\n\t\tconst features = [\n\t\t\t\"popup=yes\",\n\t\t\t`width=${popupWidth}`,\n\t\t\t`height=${popupHeight}`,\n\t\t\t`left=${left}`,\n\t\t\t`top=${top}`,\n\t\t\t\"resizable=yes\",\n\t\t\t\"scrollbars=yes\",\n\t\t].join(\",\")\n\n\t\tconst popupName = buildLoginPopupName(launchPayload)\n\t\tconst popup = window.open(finalUrl, popupName, features)\n\t\tif (!popup) {\n\t\t\tlogLoginWarn(\"Popup blocked by the browser\")\n\t\t\toptions?.onError?.(\"Login popup was blocked\")\n\t\t\treturn\n\t\t}\n\n\t\tthis.popup = popup\n\t\tthis.completed = false\n\t\tthis.listenForLoginCallback(callbackState, options)\n\n\t\tconst allowedOrigin = options?.allowedOrigin\n\t\tconst popupOrigin = getOrigin(finalUrl)\n\n\t\tthis.popupMessageHandler = (event: MessageEvent) => {\n\t\t\tif (\n\t\t\t\tallowedOrigin &&\n\t\t\t\tallowedOrigin !== \"*\" &&\n\t\t\t\tevent.origin !== allowedOrigin\n\t\t\t) {\n\t\t\t\tlogLoginWarn(\"Ignored message due to allowedOrigin mismatch\", {\n\t\t\t\t\tallowedOrigin,\n\t\t\t\t\teventOrigin: event.origin,\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (!allowedOrigin && popupOrigin && event.origin !== popupOrigin) {\n\t\t\t\tlogLoginWarn(\"Ignored message due to popup origin mismatch\", {\n\t\t\t\t\texpectedOrigin: popupOrigin,\n\t\t\t\t\teventOrigin: event.origin,\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst data = event.data as LoginEventData\n\t\t\tif (!data || typeof data !== \"object\" || !data.type) {\n\t\t\t\tlogLoginDebug(\"Ignored non-login postMessage payload\")\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tlogLoginInfo(\"Received login event\", {\n\t\t\t\ttype: data.type,\n\t\t\t\teventOrigin: event.origin,\n\t\t\t})\n\n\t\t\tthis.handleLoginEvent(data, options)\n\t\t}\n\n\t\twindow.addEventListener(\"message\", this.popupMessageHandler)\n\n\t\tif (options?.monitorPopupClosed === true) {\n\t\t\tthis.closeMonitor = window.setInterval(() => {\n\t\t\t\tif (!this.popup || safeIsPopupClosed(this.popup)) {\n\t\t\t\t\tconst shouldTreatAsCancel = !this.completed\n\t\t\t\t\tlogLoginInfo(\"Detected popup closed\", {\n\t\t\t\t\t\tshouldTreatAsCancel,\n\t\t\t\t\t})\n\t\t\t\t\tthis.cleanup()\n\t\t\t\t\tif (shouldTreatAsCancel) {\n\t\t\t\t\t\toptions?.onCancel?.()\n\t\t\t\t\t}\n\t\t\t\t\toptions?.onClose?.()\n\t\t\t\t}\n\t\t\t}, 500)\n\t\t}\n\t}\n\n\topenLogin(params: LoginParams, options?: LoginUIOptions) {\n\t\tif (typeof window === \"undefined\") return\n\n\t\tconst displayMode = options?.displayMode ?? \"auto\"\n\t\tif (displayMode === \"redirect\") {\n\t\t\tthis.openLoginRedirect(params, options)\n\t\t\treturn\n\t\t}\n\t\tif (displayMode === \"popup\") {\n\t\t\tthis.openLoginPopup(params, options)\n\t\t\treturn\n\t\t}\n\t\tif (\n\t\t\tdisplayMode === \"auto\" &&\n\t\t\tdetectLoginEnvironment().shouldUseRedirectLogin\n\t\t) {\n\t\t\tthis.openLoginRedirect(params, options)\n\t\t\treturn\n\t\t}\n\t\tthis.openLoginModal(params, options)\n\t}\n}\n\nexport function createLoginUI(): LoginUI {\n\treturn new LoginUI()\n}\n\nhandleLoginCallbackIfPresent({ autoClose: false })\n"],"mappings":"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","names":["panel"]}
|