{"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, createSdkFallbackArtwork } 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\" | \"EXPIRED\"\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\") {\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: [\n\t\t\t\t\t\"M20 6V11H15\",\n\t\t\t\t\t\"M4 18V13H9\",\n\t\t\t\t\t\"M18.2 9A7 7 0 0 0 6.2 6.6L4 9\",\n\t\t\t\t\t\"M5.8 15A7 7 0 0 0 17.8 17.4L20 15\",\n\t\t\t\t]\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 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(createSdkFallbackArtwork(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 (\n\t\t\t\t\t\tstatus.status === \"CANCELLED\" ||\n\t\t\t\t\t\tstatus.status === \"FAILED\" ||\n\t\t\t\t\t\tstatus.status === \"EXPIRED\"\n\t\t\t\t\t) {\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\nexport type SdkFallbackArtworkTheme = {\n\tprimary: string\n\tprimary10: string\n\tprimary14: string\n\tprimary20: string\n\tprimary28: string\n\tprimary36: 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\nexport function createSdkFallbackArtwork(theme: SdkFallbackArtworkTheme) {\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\n\tconst icon = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\")\n\ticon.setAttribute(\"viewBox\", \"0 0 24 24\")\n\ticon.setAttribute(\"fill\", \"none\")\n\ticon.setAttribute(\"aria-hidden\", \"true\")\n\tObject.assign(icon.style, {\n\t\tdisplay: \"block\",\n\t\tflex: \"0 0 auto\",\n\t\theight: \"52px\",\n\t\ttransform: \"rotate(4deg)\",\n\t\twidth: \"52px\",\n\t})\n\n\tfor (const value of [\n\t\t\"M12 7V12L15 14\",\n\t\t\"M21 12A9 9 0 1 1 3 12A9 9 0 0 1 21 12\",\n\t]) {\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\ticon.appendChild(path)\n\t}\n\n\ttile.appendChild(icon)\n\tartwork.appendChild(wash)\n\tartwork.appendChild(blob)\n\tartwork.appendChild(tile)\n\treturn artwork\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\t\"pt-BR\",\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\t\"pt-br\": \"pt-BR\",\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 getDocumentLocale(): string | undefined {\n\tif (typeof document === \"undefined\") return\n\treturn normalizeSdkLocale(document.documentElement?.lang)\n}\n\nexport function getAutoResolvedLocale(locale?: string): string {\n\treturn (\n\t\tnormalizeSdkLocale(locale) ||\n\t\tgetDocumentLocale() ||\n\t\tgetBrowserLocale() ||\n\t\tSDK_DEFAULT_LOCALE\n\t)\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 { createSdkFallbackArtwork } from \"./brand-logo\"\nimport { 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\twidth: \"100%\",\n\t})\n\tcontent.appendChild(\n\t\tcreateSdkFallbackArtwork({\n\t\t\tprimary: \"#171717\",\n\t\t\tprimary10: \"rgba(23,23,23,0.1)\",\n\t\t\tprimary14: \"rgba(23,23,23,0.14)\",\n\t\t\tprimary20: \"rgba(23,23,23,0.2)\",\n\t\t\tprimary28: \"rgba(23,23,23,0.28)\",\n\t\t\tprimary36: \"rgba(23,23,23,0.36)\",\n\t\t\tsecondary: \"#525252\",\n\t\t}),\n\t)\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\ntype LoginLoadingBrandText = { name: string; tagline: string }\n\nconst DEFAULT_LOGIN_LOADING_BRAND_TEXT: LoginLoadingBrandText = {\n\tname: \"Youidian\",\n\ttagline: \"Developer Service\",\n}\n\nconst LOGIN_LOADING_BRAND_TEXT: Record<string, LoginLoadingBrandText> = {\n\tde: { name: \"Youidian\", tagline: \"Entwicklerservice\" },\n\ten: DEFAULT_LOGIN_LOADING_BRAND_TEXT,\n\tes: { name: \"Youidian\", tagline: \"Servicios para desarrolladores\" },\n\tfr: { name: \"Youidian\", tagline: \"Services pour développeurs\" },\n\tit: { name: \"Youidian\", tagline: \"Servizi per sviluppatori\" },\n\tja: { name: \"Youidian\", tagline: \"開発者サービス\" },\n\tko: { name: \"Youidian\", tagline: \"개발자 서비스\" },\n\tnl: { name: \"Youidian\", tagline: \"Ontwikkelaarsservice\" },\n\tpt: { name: \"Youidian\", tagline: \"Serviço para desenvolvedores\" },\n\t\"pt-BR\": { name: \"Youidian\", tagline: \"Serviço para desenvolvedores\" },\n\t\"zh-CN\": { name: \"优易点\", tagline: \"开发者服务中台\" },\n\t\"zh-Hant\": { name: \"優易點\", tagline: \"開發者服務平台\" },\n}\n\nfunction getLoginLoadingBrandText(locale: string) {\n\treturn LOGIN_LOADING_BRAND_TEXT[locale] || DEFAULT_LOGIN_LOADING_BRAND_TEXT\n}\n\nfunction createBrandLoadingCopy(locale: string) {\n\tconst text = getLoginLoadingBrandText(locale)\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 = text.name\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 = text.tagline\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(locale: string) {\n\tensureLoginLoadingStyles()\n\tconst text = getLoginLoadingBrandText(locale)\n\tconst panel = document.createElement(\"div\")\n\tapplyLoginLoadingPanelStyle(panel)\n\tpanel.setAttribute(\"role\", \"status\")\n\tpanel.setAttribute(\"aria-label\", `${text.name} ${text.tagline}`)\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(locale))\n\tpanel.appendChild(content)\n\n\treturn panel\n}\n\nfunction createLoginRedirectingPanel(_options: {\n\tdescription: string\n\tlocale: string\n\ttitle: string\n}) {\n\treturn createLoginLoadingPanel(_options.locale)\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, locale: string) {\n\t\tif (this.iframeLoadingPanel || this.iframeReady) {\n\t\t\treturn\n\t\t}\n\n\t\tconst panel = createLoginLoadingPanel(locale)\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\tlocale: string\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\tlocale: options.locale,\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\tlocale: string\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(\n\t\t\t\thostedFrame.container,\n\t\t\t\tgetAutoResolvedLocale(params.locale),\n\t\t\t)\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\tlocale: getAutoResolvedLocale(params.locale),\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"]}