@youidian/sdk 3.3.10 → 3.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/feedback.ts"],"sourcesContent":["export type FeedbackIdentityKind =\n\t| \"ANONYMOUS\"\n\t| \"HOSTED_LOGIN\"\n\t| \"MERCHANT_USER\"\n\t| \"UNKNOWN\"\n\nexport type FeedbackActor = {\n\tidentityKind?: FeedbackIdentityKind | Lowercase<FeedbackIdentityKind>\n\tanonymousUserId?: string | null\n\tloginExternalUserId?: string | null\n\tmerchantUserId?: string | null\n\tcontactEmail?: string | null\n\tcontactPhone?: string | null\n\tdisplayName?: string | null\n}\n\nexport type FeedbackCategoryOption = {\n\tvalue: string\n\tlabel: string\n}\n\nexport type FeedbackWidgetOptions = {\n\tappId: string\n\tapiBaseUrl?: string\n\tactor?: FeedbackActor\n\tmetadata?: Record<string, unknown>\n\tcategories?: FeedbackCategoryOption[]\n\tlauncherText?: string\n\tpanelTitle?: string\n\tpanelSubtitle?: string\n\tplaceholder?: string\n\tcontactPlaceholder?: string\n\tonThreadCreated?: (threadId: string) => void\n\tonMessageSent?: (messageId: string) => void\n\tonError?: (error: Error) => void\n}\n\nexport type FeedbackWidgetController = {\n\topen: () => void\n\tclose: () => void\n\tdestroy: () => void\n}\n\ntype FeedbackMessage = {\n\tid: string\n\tsenderType: string\n\tcontent: string\n\ttranslatedContent?: string | null\n\tcreatedAt: string\n}\n\ntype ThreadState = {\n\tthreadId: string\n\tclientToken: string\n\tlastMessageId?: string\n\tstatus: string\n\tcategory?: string\n\tcontentPreview?: string\n\tcreatedAt?: string\n}\n\nconst DEFAULT_CATEGORIES: FeedbackCategoryOption[] = [\n\t{ value: \"BUG\", label: \"问题反馈\" },\n\t{ value: \"PAYMENT\", label: \"支付问题\" },\n\t{ value: \"LOGIN\", label: \"登录问题\" },\n\t{ value: \"SUGGESTION\", label: \"功能建议\" },\n\t{ value: \"OTHER\", label: \"其他\" },\n]\n\nconst STYLE_ID = \"youidian-feedback-widget-style\"\nconst MAX_IMAGES_PER_MESSAGE = 4\nconst DEFAULT_PANEL_TITLE = \"反馈\"\nconst DEFAULT_PANEL_SUBTITLE = \"提交问题、建议或使用反馈。\"\nconst DEFAULT_ATTACHMENTS_LABEL = \"支持粘贴、拖入或上传截图,最多 4 张\"\nconst FEEDBACK_ICON = `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M21 11.5a8.4 8.4 0 0 1-.9 3.8 8.6 8.6 0 0 1-7.7 4.7 8.5 8.5 0 0 1-3.8-.9L3 21l1.9-5.2a8.5 8.5 0 0 1-1-4.1 8.6 8.6 0 0 1 8.6-8.6 8.5 8.5 0 0 1 8.5 8.4Z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M8.4 10.2h7.2M8.4 13.5h4.7\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\" stroke-linecap=\"round\"/></svg>`\nconst BUG_ICON = `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M8 8.5a4 4 0 0 1 8 0v6a4 4 0 0 1-8 0v-6Z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"/><path d=\"M5 9h3m8 0h3M5.5 15H8m8 0h2.5M7 5.5 5.5 4M17 5.5 18.5 4M12 4.5V2.8M12 20.5v-12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"/></svg>`\nconst NOTE_ICON = `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M7 3.5h7l3.5 3.5v13.5H7A2.5 2.5 0 0 1 4.5 18V6A2.5 2.5 0 0 1 7 3.5Z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"/><path d=\"M14 3.8V7h3.2M8 11h8M8 15h6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"/></svg>`\nconst MAIL_ICON = `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M4.5 6.5h15v11h-15v-11Z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linejoin=\"round\"/><path d=\"m5 7 7 6 7-6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`\nconst IMAGE_ICON = `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M5 5h14v14H5V5Z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linejoin=\"round\"/><path d=\"m7.5 16 3.2-3.2 2.4 2.4 1.7-1.7L18 16.8\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M15.8 8.2h.01\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.6\" stroke-linecap=\"round\"/></svg>`\nconst CHEVRON_ICON = `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"m7 10 5 5 5-5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`\n\nfunction ensureStyle() {\n\tif (typeof document === \"undefined\") return\n\tif (document.getElementById(STYLE_ID)) return\n\tconst style = document.createElement(\"style\")\n\tstyle.id = STYLE_ID\n\tstyle.textContent = `\n.yd-feedback-root,.yd-feedback-root *{box-sizing:border-box}\n.yd-feedback-root{--yd-feedback-bg:hsl(var(--background,0 0% 100%));--yd-feedback-fg:hsl(var(--foreground,240 10% 3.9%));--yd-feedback-card:hsl(var(--card,0 0% 100%));--yd-feedback-card-fg:hsl(var(--card-foreground,240 10% 3.9%));--yd-feedback-muted:hsl(var(--muted,240 4.8% 95.9%));--yd-feedback-muted-fg:hsl(var(--muted-foreground,240 3.8% 46.1%));--yd-feedback-border:hsl(var(--border,240 5.9% 90%));--yd-feedback-primary:hsl(var(--primary,142 76% 36%));--yd-feedback-primary-fg:hsl(var(--primary-foreground,0 0% 100%));--yd-feedback-ring:hsl(var(--ring,142 76% 36%));font:14px/1.5 Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;color:var(--yd-feedback-fg)}\n.yd-feedback-root button,.yd-feedback-root input,.yd-feedback-root textarea{font:inherit}\n.yd-feedback-launcher{position:fixed;right:22px;bottom:22px;z-index:2147483000;width:54px;height:54px;display:grid;place-items:center;border:1px solid color-mix(in srgb,var(--yd-feedback-primary) 24%,var(--yd-feedback-border));border-radius:999px;background:var(--yd-feedback-primary);color:var(--yd-feedback-primary-fg);box-shadow:0 18px 45px color-mix(in srgb,var(--yd-feedback-primary) 22%,transparent);cursor:pointer;transition:transform .18s ease,box-shadow .18s ease,background .18s ease}\n.yd-feedback-launcher:hover{transform:translateY(-2px);box-shadow:0 22px 56px color-mix(in srgb,var(--yd-feedback-primary) 30%,transparent)}\n.yd-feedback-launcher:focus-visible{outline:3px solid color-mix(in srgb,var(--yd-feedback-ring) 32%,transparent);outline-offset:3px}\n.yd-feedback-launcher svg{width:27px;height:27px}\n.yd-feedback-panel{position:fixed;inset:auto 22px 86px auto;z-index:2147483000;width:min(760px,calc(100vw - 44px));height:min(560px,calc(100vh - 108px));display:none;grid-template-rows:auto minmax(0,1fr);overflow:hidden;border:1px solid var(--yd-feedback-border);border-radius:18px;background:var(--yd-feedback-card);color:var(--yd-feedback-card-fg);box-shadow:0 24px 70px rgba(15,23,42,.18)}\n.yd-feedback-panel[data-open=\"true\"]{display:grid}\n.yd-feedback-header{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:18px 20px 16px;border-bottom:1px solid var(--yd-feedback-border);background:var(--yd-feedback-card)}\n.yd-feedback-title{margin:0;font-size:22px;line-height:1.15;font-weight:760;letter-spacing:0;color:var(--yd-feedback-fg)}\n.yd-feedback-subtitle{margin:8px 0 0;color:var(--yd-feedback-muted-fg);font-size:13px;line-height:1.45}\n.yd-feedback-close{display:grid;place-items:center;width:34px;height:34px;border:0;border-radius:10px;background:transparent;color:var(--yd-feedback-muted-fg);cursor:pointer;transition:background .16s ease,color .16s ease}\n.yd-feedback-close:hover{background:var(--yd-feedback-muted);color:var(--yd-feedback-fg)}\n.yd-feedback-close svg{width:24px;height:24px}\n.yd-feedback-shell{display:grid;min-height:0;grid-template-columns:230px minmax(0,1fr)}\n.yd-feedback-sidebar{min-width:0;border-right:1px solid var(--yd-feedback-border);background:var(--yd-feedback-muted)}\n.yd-feedback-sidebar-toolbar{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:14px 14px;border-bottom:1px solid var(--yd-feedback-border)}\n.yd-feedback-sidebar-title{display:flex;align-items:center;gap:9px;color:var(--yd-feedback-fg);font-size:15px;font-weight:720}\n.yd-feedback-sidebar-title svg{width:20px;height:20px;color:var(--yd-feedback-primary)}\n.yd-feedback-icon-button{display:grid;place-items:center;width:34px;height:34px;border:1px solid var(--yd-feedback-border);border-radius:999px;background:var(--yd-feedback-card);color:var(--yd-feedback-fg);cursor:pointer;transition:background .16s ease,border-color .16s ease}\n.yd-feedback-icon-button:hover{background:color-mix(in srgb,var(--yd-feedback-primary) 8%,var(--yd-feedback-card));border-color:color-mix(in srgb,var(--yd-feedback-primary) 38%,var(--yd-feedback-border))}\n.yd-feedback-icon-button svg{width:18px;height:18px}\n.yd-feedback-thread-list{padding:12px}\n.yd-feedback-thread-card{display:none;border:1px solid var(--yd-feedback-border);border-radius:14px;background:var(--yd-feedback-card);padding:12px}\n.yd-feedback-thread-card[data-visible=\"true\"]{display:block}\n.yd-feedback-thread-badges{display:flex;flex-wrap:wrap;gap:7px;margin-bottom:10px}\n.yd-feedback-badge{display:inline-flex;align-items:center;border:1px solid var(--yd-feedback-border);border-radius:999px;background:var(--yd-feedback-muted);color:var(--yd-feedback-fg);padding:4px 9px;font-size:11px;font-weight:700;line-height:1}\n.yd-feedback-badge[data-status=\"true\"]{border-color:color-mix(in srgb,var(--yd-feedback-primary) 45%,var(--yd-feedback-border));background:color-mix(in srgb,var(--yd-feedback-primary) 12%,var(--yd-feedback-card));color:var(--yd-feedback-primary)}\n.yd-feedback-thread-preview{margin:0;color:var(--yd-feedback-fg);font-size:13px;line-height:1.45;word-break:break-word}\n.yd-feedback-thread-meta{display:flex;justify-content:space-between;gap:10px;margin-top:10px;color:var(--yd-feedback-muted-fg);font-size:11px}\n.yd-feedback-empty-thread{border:1px dashed var(--yd-feedback-border);border-radius:14px;padding:14px;color:var(--yd-feedback-muted-fg);font-size:12px}\n.yd-feedback-main{min-width:0;min-height:0;background:var(--yd-feedback-card);overflow:hidden}\n.yd-feedback-form{height:100%;display:grid;grid-template-rows:auto auto auto minmax(0,1fr) auto auto;gap:14px;padding:16px 18px 0}\n.yd-feedback-row{display:grid;gap:14px;grid-template-columns:180px minmax(0,1fr)}\n.yd-feedback-field{display:flex;min-width:0;flex-direction:column;gap:8px}\n.yd-feedback-label{display:flex;align-items:center;gap:8px;color:var(--yd-feedback-fg);font-size:13px;font-weight:720}\n.yd-feedback-label svg{width:17px;height:17px;color:var(--yd-feedback-fg)}\n.yd-feedback-input,.yd-feedback-textarea{width:100%;border:1px solid var(--yd-feedback-border);border-radius:13px;background:var(--yd-feedback-card);color:var(--yd-feedback-fg);outline:none;transition:border-color .16s ease,box-shadow .16s ease,background .16s ease}\n.yd-feedback-input{height:40px;padding:0 13px;font-size:14px}\n.yd-feedback-textarea{min-height:118px;padding:13px 14px;font-size:14px;resize:none}\n.yd-feedback-input::placeholder,.yd-feedback-textarea::placeholder{color:var(--yd-feedback-muted-fg)}\n.yd-feedback-input:focus,.yd-feedback-textarea:focus{border-color:var(--yd-feedback-ring);box-shadow:0 0 0 3px color-mix(in srgb,var(--yd-feedback-ring) 18%,transparent);background:var(--yd-feedback-card)}\n.yd-feedback-compose-box{overflow:hidden;border:1px solid var(--yd-feedback-border);border-radius:15px;background:var(--yd-feedback-card)}\n.yd-feedback-compose-box .yd-feedback-textarea{border:0;border-radius:0;box-shadow:none;background:transparent}\n.yd-feedback-attachment-row{display:flex;align-items:center;justify-content:space-between;gap:12px;border-top:1px solid var(--yd-feedback-border);padding:9px 12px;color:var(--yd-feedback-muted-fg)}\n.yd-feedback-file-trigger{display:inline-flex;align-items:center;gap:8px;border:0;background:transparent;color:var(--yd-feedback-fg);cursor:pointer;padding:7px 8px;border-radius:10px}\n.yd-feedback-file-trigger:hover{background:var(--yd-feedback-muted)}\n.yd-feedback-file-trigger svg{width:18px;height:18px}\n.yd-feedback-file-input{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;clip-path:inset(50%)}\n.yd-feedback-files{min-width:0;text-align:right;color:var(--yd-feedback-muted-fg);font-size:12px}\n.yd-feedback-select{position:relative;width:142px}\n.yd-feedback-select-button{width:100%;height:40px;display:flex;align-items:center;justify-content:space-between;gap:10px;border:1px solid var(--yd-feedback-border);border-radius:13px;background:var(--yd-feedback-card);color:var(--yd-feedback-fg);padding:0 12px;cursor:pointer}\n.yd-feedback-select-value{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:700}\n.yd-feedback-select-value svg{width:18px;height:18px;color:var(--yd-feedback-muted-fg)}\n.yd-feedback-select-chevron{width:17px;height:17px;color:var(--yd-feedback-muted-fg)}\n.yd-feedback-select-menu{position:absolute;left:0;top:calc(100% + 7px);z-index:2;display:none;min-width:176px;max-height:220px;overflow:auto;border:1px solid var(--yd-feedback-border);border-radius:13px;background:var(--yd-feedback-card);box-shadow:0 18px 45px rgba(15,23,42,.16);padding:5px}\n.yd-feedback-select[data-open=\"true\"] .yd-feedback-select-menu{display:block}\n.yd-feedback-select-option{width:100%;min-height:38px;display:flex;align-items:center;gap:8px;border:0;border-radius:10px;background:transparent;color:var(--yd-feedback-fg);text-align:left;padding:9px 10px;cursor:pointer}\n.yd-feedback-select-option svg{width:18px;height:18px;flex:0 0 18px;color:var(--yd-feedback-muted-fg)}\n.yd-feedback-select-option span{line-height:1.2;white-space:nowrap}\n.yd-feedback-select-option:hover,.yd-feedback-select-option[data-selected=\"true\"]{background:color-mix(in srgb,var(--yd-feedback-primary) 10%,var(--yd-feedback-card));color:var(--yd-feedback-fg)}\n.yd-feedback-messages{display:flex;min-height:0;flex-direction:column;gap:8px;overflow:auto}\n.yd-feedback-message{border:1px solid var(--yd-feedback-border);border-radius:12px;padding:9px 10px;background:var(--yd-feedback-muted)}\n.yd-feedback-message[data-admin=\"true\"]{background:color-mix(in srgb,var(--yd-feedback-primary) 10%,var(--yd-feedback-card));border-color:color-mix(in srgb,var(--yd-feedback-primary) 24%,var(--yd-feedback-border))}\n.yd-feedback-message-meta{margin-bottom:4px;color:var(--yd-feedback-muted-fg);font-size:11px}\n.yd-feedback-message-content{color:var(--yd-feedback-fg);font-size:12px;line-height:1.45;word-break:break-word}\n.yd-feedback-actions{position:sticky;bottom:0;display:flex;align-items:center;justify-content:flex-end;gap:12px;margin:0 -18px;padding:12px 18px 16px;border-top:1px solid var(--yd-feedback-border);background:var(--yd-feedback-card)}\n.yd-feedback-submit{min-width:104px;height:44px;border:0;border-radius:13px;background:var(--yd-feedback-primary);color:var(--yd-feedback-primary-fg);padding:0 18px;font-size:14px;font-weight:800;cursor:pointer;box-shadow:0 12px 24px color-mix(in srgb,var(--yd-feedback-primary) 18%,transparent);transition:background .16s ease,transform .16s ease}\n.yd-feedback-submit:hover{transform:translateY(-1px)}\n.yd-feedback-submit:disabled{opacity:.55;cursor:not-allowed;transform:none}\n.yd-feedback-secondary{height:38px;border:0;border-radius:12px;background:transparent;color:var(--yd-feedback-fg);padding:0 12px;font-size:14px;font-weight:760;cursor:pointer}\n.yd-feedback-secondary:hover{background:var(--yd-feedback-muted)}\n.yd-feedback-error{min-height:18px;color:#fb7185;font-size:13px}\n@media (max-width:760px){\n\t.yd-feedback-panel{inset:auto 14px 78px 14px;width:auto;height:min(560px,calc(100vh - 96px));border-radius:16px}\n\t.yd-feedback-header{padding:16px 16px 14px}\n\t.yd-feedback-title{font-size:20px}\n\t.yd-feedback-shell{grid-template-columns:1fr}\n\t.yd-feedback-sidebar{display:none}\n\t.yd-feedback-form{padding:14px 14px 0;gap:12px}\n\t.yd-feedback-row{grid-template-columns:1fr}\n\t.yd-feedback-actions{justify-content:space-between}\n}\n`\n\tdocument.head.appendChild(style)\n}\n\nfunction getBaseUrl(options: FeedbackWidgetOptions) {\n\treturn (options.apiBaseUrl || \"https://pay.imgto.link\").replace(/\\/$/, \"\")\n}\n\nfunction safeJson(value: unknown) {\n\ttry {\n\t\treturn JSON.stringify(value)\n\t} catch {\n\t\treturn \"{}\"\n\t}\n}\n\nfunction escapeHtml(value: string) {\n\treturn value\n\t\t.replace(/&/g, \"&amp;\")\n\t\t.replace(/</g, \"&lt;\")\n\t\t.replace(/>/g, \"&gt;\")\n\t\t.replace(/\"/g, \"&quot;\")\n\t\t.replace(/'/g, \"&#39;\")\n}\n\nfunction getInitialContact(actor?: FeedbackActor) {\n\treturn actor?.contactEmail || actor?.contactPhone || \"\"\n}\n\nfunction formatCategoryLabel(\n\tvalue?: string,\n\tcategories: FeedbackCategoryOption[] = DEFAULT_CATEGORIES,\n) {\n\tconst matched = categories.find((item) => item.value === value)\n\treturn matched?.label || value || DEFAULT_CATEGORIES[0]?.label || \"反馈\"\n}\n\nfunction formatThreadStatus(value?: string) {\n\tconst statusMap: Record<string, string> = {\n\t\tOPEN: \"已提交\",\n\t\tWAITING_ADMIN: \"等待回复\",\n\t\tWAITING_USER: \"待补充\",\n\t\tRESOLVED: \"已处理\",\n\t\tCLOSED: \"已关闭\",\n\t}\n\treturn statusMap[value || \"\"] || value || \"已提交\"\n}\n\nfunction formatSenderType(value: string) {\n\tif (value === \"END_USER\") return \"用户\"\n\tif (value === \"ADMIN\") return \"管理员\"\n\treturn \"系统\"\n}\n\nfunction formatThreadTime(value?: string) {\n\tif (!value) return \"\"\n\treturn new Date(value).toLocaleString()\n}\n\nasync function requestJson<T>(url: string, init?: RequestInit): Promise<T> {\n\tconst response = await fetch(url, {\n\t\t...init,\n\t\theaders: {\n\t\t\tAccept: \"application/json\",\n\t\t\t...(init?.body ? { \"Content-Type\": \"application/json\" } : {}),\n\t\t\t...(init?.headers || {}),\n\t\t},\n\t})\n\tconst payload = await response.json().catch(() => null)\n\tif (!response.ok || payload?.code !== 200) {\n\t\tthrow new Error(payload?.message || response.statusText || \"Request failed\")\n\t}\n\treturn payload.data as T\n}\n\nfunction collectMetadata(options: FeedbackWidgetOptions) {\n\tconst page =\n\t\ttypeof window === \"undefined\"\n\t\t\t? {}\n\t\t\t: {\n\t\t\t\t\tpageUrl: window.location.href,\n\t\t\t\t\tpageTitle: document.title,\n\t\t\t\t\tuserAgent: navigator.userAgent,\n\t\t\t\t}\n\treturn { ...page, ...(options.metadata || {}) }\n}\n\nasync function compressImage(file: File): Promise<File> {\n\tif (typeof document === \"undefined\" || !file.type.startsWith(\"image/\")) {\n\t\treturn file\n\t}\n\tconst bitmap = await createImageBitmap(file)\n\tconst maxSize = 1600\n\tconst scale = Math.min(1, maxSize / Math.max(bitmap.width, bitmap.height))\n\tconst canvas = document.createElement(\"canvas\")\n\tcanvas.width = Math.max(1, Math.round(bitmap.width * scale))\n\tcanvas.height = Math.max(1, Math.round(bitmap.height * scale))\n\tconst ctx = canvas.getContext(\"2d\")\n\tif (!ctx) return file\n\tctx.drawImage(bitmap, 0, 0, canvas.width, canvas.height)\n\tconst blob = await new Promise<Blob | null>((resolve) => {\n\t\tcanvas.toBlob(resolve, \"image/webp\", 0.82)\n\t})\n\tif (!blob) return file\n\treturn new File([blob], file.name.replace(/\\.[^.]+$/, \".webp\"), {\n\t\ttype: \"image/webp\",\n\t\tlastModified: Date.now(),\n\t})\n}\n\nexport function createFeedbackWidget(\n\tcontainer: HTMLElement,\n\toptions: FeedbackWidgetOptions,\n): FeedbackWidgetController {\n\tif (typeof document === \"undefined\") {\n\t\treturn { open() {}, close() {}, destroy() {} }\n\t}\n\tif (!options.appId) throw new Error(\"appId is required\")\n\tensureStyle()\n\n\tlet threadState: ThreadState | null = null\n\tlet pollTimer: number | null = null\n\tlet panelReady = false\n\tlet pendingFiles: File[] = []\n\tlet renderedMessages: FeedbackMessage[] = []\n\tlet removeLoadListener: (() => void) | null = null\n\tconst root = document.createElement(\"div\")\n\troot.className = \"yd-feedback-root\"\n\tconst launcher = document.createElement(\"button\")\n\tlauncher.type = \"button\"\n\tlauncher.className = \"yd-feedback-launcher\"\n\tlauncher.setAttribute(\"aria-label\", options.launcherText || \"反馈\")\n\tlauncher.innerHTML = FEEDBACK_ICON\n\troot.appendChild(launcher)\n\tcontainer.appendChild(root)\n\n\tconst panel = document.createElement(\"section\")\n\tpanel.className = \"yd-feedback-panel\"\n\tpanel.setAttribute(\"aria-label\", options.panelTitle || DEFAULT_PANEL_TITLE)\n\tpanel.innerHTML = `\n<div class=\"yd-feedback-header\">\n\t<div>\n\t\t<h2 class=\"yd-feedback-title\">${escapeHtml(options.panelTitle || DEFAULT_PANEL_TITLE)}</h2>\n\t\t<p class=\"yd-feedback-subtitle\">${escapeHtml(options.panelSubtitle || DEFAULT_PANEL_SUBTITLE)}</p>\n\t</div>\n\t<button type=\"button\" class=\"yd-feedback-close\" aria-label=\"关闭\">\n\t\t<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M6 6l12 12M18 6 6 18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\"/></svg>\n\t</button>\n</div>\n<div class=\"yd-feedback-shell\">\n\t<aside class=\"yd-feedback-sidebar\">\n\t\t<div class=\"yd-feedback-sidebar-toolbar\">\n\t\t\t<div class=\"yd-feedback-sidebar-title\">${FEEDBACK_ICON}<span>反馈记录</span></div>\n\t\t\t<button type=\"button\" class=\"yd-feedback-icon-button\" data-role=\"clear\" aria-label=\"新建反馈\">\n\t\t\t\t<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12 5v14M5 12h14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\"/></svg>\n\t\t\t</button>\n\t\t</div>\n\t\t<div class=\"yd-feedback-thread-list\">\n\t\t\t<div class=\"yd-feedback-thread-card\" data-role=\"thread-card\">\n\t\t\t\t<div class=\"yd-feedback-thread-badges\">\n\t\t\t\t\t<span class=\"yd-feedback-badge\" data-role=\"thread-category\">问题反馈</span>\n\t\t\t\t\t<span class=\"yd-feedback-badge\" data-status=\"true\" data-role=\"thread-status\">已提交</span>\n\t\t\t\t</div>\n\t\t\t\t<p class=\"yd-feedback-thread-preview\" data-role=\"thread-preview\"></p>\n\t\t\t\t<div class=\"yd-feedback-thread-meta\">\n\t\t\t\t\t<span data-role=\"thread-time\"></span>\n\t\t\t\t\t<span>我的反馈</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"yd-feedback-empty-thread\" data-role=\"thread-empty\">提交反馈后,记录会显示在这里。</div>\n\t\t</div>\n\t</aside>\n\t<div class=\"yd-feedback-main\">\n\t\t<div class=\"yd-feedback-form\">\n\t\t\t<div class=\"yd-feedback-row\">\n\t\t\t\t<div class=\"yd-feedback-field\">\n\t\t\t\t\t<label class=\"yd-feedback-label\">反馈类型</label>\n\t\t\t\t\t<div class=\"yd-feedback-select\" data-role=\"category-select\">\n\t\t\t\t\t\t<button type=\"button\" class=\"yd-feedback-select-button\" data-role=\"category-trigger\">\n\t\t\t\t\t\t\t<span class=\"yd-feedback-select-value\">${BUG_ICON}<span data-role=\"category-value\">问题反馈</span></span>\n\t\t\t\t\t\t\t<span class=\"yd-feedback-select-chevron\">${CHEVRON_ICON}</span>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<div class=\"yd-feedback-select-menu\" data-role=\"category-menu\"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"yd-feedback-field\">\n\t\t\t\t<label class=\"yd-feedback-label\">${NOTE_ICON}<span>反馈内容</span></label>\n\t\t\t\t<div class=\"yd-feedback-compose-box\">\n\t\t\t\t\t<textarea class=\"yd-feedback-textarea\" data-role=\"content\" placeholder=\"${escapeHtml(options.placeholder || \"请描述问题现象、操作步骤或建议内容。\")}\"></textarea>\n\t\t\t\t\t<div class=\"yd-feedback-attachment-row\">\n\t\t\t\t\t\t<button type=\"button\" class=\"yd-feedback-file-trigger\" data-role=\"files-trigger\">${IMAGE_ICON}<span>上传图片</span></button>\n\t\t\t\t\t\t<input class=\"yd-feedback-file-input\" type=\"file\" accept=\"image/png,image/jpeg,image/webp\" multiple data-role=\"files\" />\n\t\t\t\t\t\t<div class=\"yd-feedback-files\" data-role=\"files-label\">${DEFAULT_ATTACHMENTS_LABEL}</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"yd-feedback-field\">\n\t\t\t\t<label class=\"yd-feedback-label\">${MAIL_ICON}<span>联系方式(选填)</span></label>\n\t\t\t\t<input class=\"yd-feedback-input\" data-role=\"contact\" value=\"${escapeHtml(getInitialContact(options.actor))}\" placeholder=\"${escapeHtml(options.contactPlaceholder || \"邮箱或电话号码,仅用于反馈跟进\")}\" />\n\t\t\t</div>\n\t\t\t<div class=\"yd-feedback-messages\" data-role=\"messages\"></div>\n\t\t\t<div class=\"yd-feedback-error\" data-role=\"error\"></div>\n\t\t\t<div class=\"yd-feedback-actions\">\n\t\t\t\t<button type=\"button\" class=\"yd-feedback-secondary\" data-role=\"clear-secondary\">关闭</button>\n\t\t\t\t<button type=\"button\" class=\"yd-feedback-submit\" data-role=\"submit\">提交反馈</button>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>\n`\n\n\tfunction initPanel() {\n\t\tif (panelReady) return\n\t\tpanelReady = true\n\t\troot.appendChild(panel)\n\t\tconst categorySelect = panel.querySelector<HTMLElement>(\n\t\t\t'[data-role=\"category-select\"]',\n\t\t)\n\t\tconst categoryMenu = panel.querySelector<HTMLElement>(\n\t\t\t'[data-role=\"category-menu\"]',\n\t\t)\n\t\tconst categoryValue = panel.querySelector<HTMLElement>(\n\t\t\t'[data-role=\"category-value\"]',\n\t\t)\n\t\tif (categoryMenu && categoryValue) {\n\t\t\tconst categories = options.categories || DEFAULT_CATEGORIES\n\t\t\tcategoryValue.textContent =\n\t\t\t\tcategories[0]?.label || DEFAULT_CATEGORIES[0]?.label || \"反馈\"\n\t\t\tfor (const item of categories) {\n\t\t\t\tconst option = document.createElement(\"button\")\n\t\t\t\toption.type = \"button\"\n\t\t\t\toption.className = \"yd-feedback-select-option\"\n\t\t\t\toption.dataset.value = item.value\n\t\t\t\toption.dataset.selected = String(item.value === categories[0]?.value)\n\t\t\t\toption.innerHTML = `${BUG_ICON}<span>${escapeHtml(item.label)}</span>`\n\t\t\t\toption.addEventListener(\"click\", () => {\n\t\t\t\t\tfor (const node of categoryMenu.querySelectorAll<HTMLElement>(\n\t\t\t\t\t\t\".yd-feedback-select-option\",\n\t\t\t\t\t)) {\n\t\t\t\t\t\tnode.dataset.selected = String(node === option)\n\t\t\t\t\t}\n\t\t\t\t\tcategoryValue.textContent = item.label\n\t\t\t\t\tif (categorySelect) {\n\t\t\t\t\t\tcategorySelect.dataset.value = item.value\n\t\t\t\t\t\tcategorySelect.dataset.open = \"false\"\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tcategoryMenu.appendChild(option)\n\t\t\t}\n\t\t\tcategorySelect?.setAttribute(\"data-value\", categories[0]?.value || \"BUG\")\n\t\t}\n\t\tpanel\n\t\t\t.querySelector<HTMLButtonElement>('[data-role=\"category-trigger\"]')\n\t\t\t?.addEventListener(\"click\", () => {\n\t\t\t\tif (!categorySelect) return\n\t\t\t\tcategorySelect.dataset.open =\n\t\t\t\t\tcategorySelect.dataset.open === \"true\" ? \"false\" : \"true\"\n\t\t\t})\n\t\tpanel\n\t\t\t.querySelector<HTMLButtonElement>(\".yd-feedback-close\")\n\t\t\t?.addEventListener(\"click\", close)\n\t\tpanel\n\t\t\t.querySelector<HTMLButtonElement>('[data-role=\"clear\"]')\n\t\t\t?.addEventListener(\"click\", resetThread)\n\t\tpanel\n\t\t\t.querySelector<HTMLButtonElement>('[data-role=\"clear-secondary\"]')\n\t\t\t?.addEventListener(\"click\", close)\n\t\tpanel\n\t\t\t.querySelector<HTMLButtonElement>('[data-role=\"files-trigger\"]')\n\t\t\t?.addEventListener(\"click\", () => {\n\t\t\t\tpanel.querySelector<HTMLInputElement>('[data-role=\"files\"]')?.click()\n\t\t\t})\n\t\tpanel\n\t\t\t.querySelector<HTMLInputElement>('[data-role=\"files\"]')\n\t\t\t?.addEventListener(\"change\", (event) => {\n\t\t\t\tsetPendingFiles((event.target as HTMLInputElement).files)\n\t\t\t})\n\t\tconst composeBox = panel.querySelector<HTMLElement>(\n\t\t\t\".yd-feedback-compose-box\",\n\t\t)\n\t\tcomposeBox?.addEventListener(\"dragover\", (event) => {\n\t\t\tevent.preventDefault()\n\t\t})\n\t\tcomposeBox?.addEventListener(\"drop\", (event) => {\n\t\t\tevent.preventDefault()\n\t\t\tsetPendingFiles(event.dataTransfer?.files || null)\n\t\t})\n\t\tcomposeBox?.addEventListener(\"paste\", (event) => {\n\t\t\tconst files = Array.from(event.clipboardData?.files || []).filter(\n\t\t\t\t(file) => file.type.startsWith(\"image/\"),\n\t\t\t)\n\t\t\tif (files.length > 0) {\n\t\t\t\tsetPendingFiles(files)\n\t\t\t}\n\t\t})\n\t\tpanel\n\t\t\t.querySelector<HTMLButtonElement>('[data-role=\"submit\"]')\n\t\t\t?.addEventListener(\"click\", () => void submit())\n\t}\n\n\tfunction setPendingFiles(files: FileList | File[] | null) {\n\t\tpendingFiles = Array.from(files || [])\n\t\t\t.filter((file) => file.type.startsWith(\"image/\"))\n\t\t\t.slice(0, MAX_IMAGES_PER_MESSAGE)\n\t\tconst label = panel.querySelector<HTMLElement>('[data-role=\"files-label\"]')\n\t\tif (label) {\n\t\t\tlabel.textContent =\n\t\t\t\tpendingFiles.length > 0\n\t\t\t\t\t? `已选择 ${pendingFiles.length} 张图片`\n\t\t\t\t\t: DEFAULT_ATTACHMENTS_LABEL\n\t\t}\n\t}\n\n\tfunction resetThread() {\n\t\tthreadState = null\n\t\tpendingFiles = []\n\t\trenderedMessages = []\n\t\trenderMessages([])\n\t\tupdateThreadCard()\n\t\tsetError(\"\")\n\t\tconst textarea = panel.querySelector<HTMLTextAreaElement>(\n\t\t\t'[data-role=\"content\"]',\n\t\t)\n\t\tif (textarea) textarea.value = \"\"\n\t\tconst fileInput = panel.querySelector<HTMLInputElement>(\n\t\t\t'[data-role=\"files\"]',\n\t\t)\n\t\tif (fileInput) fileInput.value = \"\"\n\t\tconst filesLabel = panel.querySelector<HTMLElement>(\n\t\t\t'[data-role=\"files-label\"]',\n\t\t)\n\t\tif (filesLabel) filesLabel.textContent = DEFAULT_ATTACHMENTS_LABEL\n\t}\n\n\tfunction updateThreadCard() {\n\t\tconst card = panel.querySelector<HTMLElement>('[data-role=\"thread-card\"]')\n\t\tconst empty = panel.querySelector<HTMLElement>('[data-role=\"thread-empty\"]')\n\t\tif (!card || !empty) return\n\t\tif (!threadState) {\n\t\t\tcard.dataset.visible = \"false\"\n\t\t\tempty.style.display = \"block\"\n\t\t\treturn\n\t\t}\n\t\tcard.dataset.visible = \"true\"\n\t\tempty.style.display = \"none\"\n\t\tconst category = card.querySelector<HTMLElement>(\n\t\t\t'[data-role=\"thread-category\"]',\n\t\t)\n\t\tconst status = card.querySelector<HTMLElement>(\n\t\t\t'[data-role=\"thread-status\"]',\n\t\t)\n\t\tconst preview = card.querySelector<HTMLElement>(\n\t\t\t'[data-role=\"thread-preview\"]',\n\t\t)\n\t\tconst time = card.querySelector<HTMLElement>('[data-role=\"thread-time\"]')\n\t\tif (category) {\n\t\t\tcategory.textContent = formatCategoryLabel(\n\t\t\t\tthreadState.category || DEFAULT_CATEGORIES[0]?.value,\n\t\t\t\toptions.categories || DEFAULT_CATEGORIES,\n\t\t\t)\n\t\t}\n\t\tif (status) status.textContent = formatThreadStatus(threadState.status)\n\t\tif (preview) preview.textContent = threadState.contentPreview || \"\"\n\t\tif (time) time.textContent = formatThreadTime(threadState.createdAt)\n\t}\n\n\tfunction setError(message: string) {\n\t\tconst node = panel.querySelector<HTMLElement>('[data-role=\"error\"]')\n\t\tif (node) node.textContent = message\n\t\tif (message) options.onError?.(new Error(message))\n\t}\n\n\tfunction setSubmitting(value: boolean) {\n\t\tconst button = panel.querySelector<HTMLButtonElement>(\n\t\t\t'[data-role=\"submit\"]',\n\t\t)\n\t\tif (button) button.disabled = value\n\t}\n\n\tfunction renderMessages(messages: FeedbackMessage[]) {\n\t\tconst node = panel.querySelector<HTMLElement>('[data-role=\"messages\"]')\n\t\tif (!node) return\n\t\trenderedMessages = messages\n\t\tnode.innerHTML = \"\"\n\t\tfor (const message of messages) {\n\t\t\tconst item = document.createElement(\"div\")\n\t\t\titem.className = \"yd-feedback-message\"\n\t\t\titem.dataset.admin = String(message.senderType !== \"END_USER\")\n\t\t\titem.innerHTML = `<div class=\"yd-feedback-message-meta\">${formatSenderType(message.senderType)} · ${new Date(message.createdAt).toLocaleString()}</div><div class=\"yd-feedback-message-content\"></div>`\n\t\t\tconst content = item.querySelector(\".yd-feedback-message-content\")\n\t\t\tif (content) {\n\t\t\t\tcontent.textContent =\n\t\t\t\t\tmessage.senderType === \"END_USER\"\n\t\t\t\t\t\t? message.content\n\t\t\t\t\t\t: message.translatedContent || message.content\n\t\t\t}\n\t\t\tnode.appendChild(item)\n\t\t}\n\t}\n\n\tfunction appendMessages(messages: FeedbackMessage[]) {\n\t\tconst byId = new Map<string, FeedbackMessage>()\n\t\tfor (const message of renderedMessages) byId.set(message.id, message)\n\t\tfor (const message of messages) byId.set(message.id, message)\n\t\trenderMessages(Array.from(byId.values()))\n\t}\n\n\tasync function uploadImages(files: File[]) {\n\t\tconst selected = files.slice(0, MAX_IMAGES_PER_MESSAGE)\n\t\tconst ids: string[] = []\n\t\tfor (const file of selected) {\n\t\t\tconst compressed = await compressImage(file)\n\t\t\tconst body = new FormData()\n\t\t\tbody.append(\"file\", compressed)\n\t\t\tif (threadState) body.append(\"threadId\", threadState.threadId)\n\t\t\tconst headers: Record<string, string> = {}\n\t\t\tif (threadState) headers[\"x-feedback-token\"] = threadState.clientToken\n\t\t\tconst response = await fetch(\n\t\t\t\t`${getBaseUrl(options)}/api/v1/feedback/${encodeURIComponent(options.appId)}/resources/images`,\n\t\t\t\t{ method: \"POST\", body, headers },\n\t\t\t)\n\t\t\tconst payload = await response.json()\n\t\t\tif (!response.ok || payload?.code !== 200) {\n\t\t\t\tthrow new Error(payload?.message || \"Image upload failed\")\n\t\t\t}\n\t\t\tids.push(payload.data.resource.id)\n\t\t}\n\t\treturn ids\n\t}\n\n\tasync function submit() {\n\t\tconst content = panel\n\t\t\t.querySelector<HTMLTextAreaElement>('[data-role=\"content\"]')\n\t\t\t?.value.trim()\n\t\tif (!content) {\n\t\t\tsetError(\"请输入反馈内容。\")\n\t\t\treturn\n\t\t}\n\t\tsetSubmitting(true)\n\t\tsetError(\"\")\n\t\ttry {\n\t\t\tconst category =\n\t\t\t\tpanel.querySelector<HTMLElement>('[data-role=\"category-select\"]')\n\t\t\t\t\t?.dataset.value || \"OTHER\"\n\t\t\tconst contact =\n\t\t\t\tpanel.querySelector<HTMLInputElement>('[data-role=\"contact\"]')?.value ||\n\t\t\t\t\"\"\n\t\t\tconst fileInput = panel.querySelector<HTMLInputElement>(\n\t\t\t\t'[data-role=\"files\"]',\n\t\t\t)\n\t\t\tconst attachments = await uploadImages(pendingFiles)\n\t\t\tif (!threadState) {\n\t\t\t\tconst result = await requestJson<{\n\t\t\t\t\tthread: { id: string; status: string }\n\t\t\t\t\tmessage: { id: string }\n\t\t\t\t\tclientToken: string\n\t\t\t\t}>(\n\t\t\t\t\t`${getBaseUrl(options)}/api/v1/feedback/${encodeURIComponent(options.appId)}/threads`,\n\t\t\t\t\t{\n\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\tbody: safeJson({\n\t\t\t\t\t\t\tcategory,\n\t\t\t\t\t\t\tcontent,\n\t\t\t\t\t\t\tattachments,\n\t\t\t\t\t\t\tactor: {\n\t\t\t\t\t\t\t\t...(options.actor || {}),\n\t\t\t\t\t\t\t\tcontactEmail: contact.includes(\"@\")\n\t\t\t\t\t\t\t\t\t? contact\n\t\t\t\t\t\t\t\t\t: options.actor?.contactEmail,\n\t\t\t\t\t\t\t\tcontactPhone:\n\t\t\t\t\t\t\t\t\tcontact && !contact.includes(\"@\")\n\t\t\t\t\t\t\t\t\t\t? contact\n\t\t\t\t\t\t\t\t\t\t: options.actor?.contactPhone,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmetadata: collectMetadata(options),\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\tthreadState = {\n\t\t\t\t\tthreadId: result.thread.id,\n\t\t\t\t\tclientToken: result.clientToken,\n\t\t\t\t\tlastMessageId: result.message?.id,\n\t\t\t\t\tstatus: result.thread.status,\n\t\t\t\t\tcategory,\n\t\t\t\t\tcontentPreview: content,\n\t\t\t\t\tcreatedAt: new Date().toISOString(),\n\t\t\t\t}\n\t\t\t\tupdateThreadCard()\n\t\t\t\toptions.onThreadCreated?.(result.thread.id)\n\t\t\t\toptions.onMessageSent?.(result.message.id)\n\t\t\t} else {\n\t\t\t\tconst result = await requestJson<{ message: { id: string } }>(\n\t\t\t\t\t`${getBaseUrl(options)}/api/v1/feedback/${encodeURIComponent(options.appId)}/threads/${encodeURIComponent(threadState.threadId)}/messages`,\n\t\t\t\t\t{\n\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\theaders: { \"x-feedback-token\": threadState.clientToken },\n\t\t\t\t\t\tbody: safeJson({\n\t\t\t\t\t\t\tcontent,\n\t\t\t\t\t\t\tattachments,\n\t\t\t\t\t\t\tmetadata: collectMetadata(options),\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\tthreadState.lastMessageId = result.message.id\n\t\t\t\tthreadState.contentPreview = content\n\t\t\t\toptions.onMessageSent?.(result.message.id)\n\t\t\t}\n\t\t\tconst textarea = panel.querySelector<HTMLTextAreaElement>(\n\t\t\t\t'[data-role=\"content\"]',\n\t\t\t)\n\t\t\tif (textarea) textarea.value = \"\"\n\t\t\tif (fileInput) fileInput.value = \"\"\n\t\t\tpendingFiles = []\n\t\t\tconst filesLabel = panel.querySelector<HTMLElement>(\n\t\t\t\t'[data-role=\"files-label\"]',\n\t\t\t)\n\t\t\tif (filesLabel) filesLabel.textContent = DEFAULT_ATTACHMENTS_LABEL\n\t\t\tawait pollOnce()\n\t\t\tstartPolling()\n\t\t} catch (error) {\n\t\t\tsetError(error instanceof Error ? error.message : \"提交失败\")\n\t\t} finally {\n\t\t\tsetSubmitting(false)\n\t\t}\n\t}\n\n\tasync function pollOnce() {\n\t\tif (!threadState) return\n\t\tconst currentThread = threadState\n\t\tconst params = new URLSearchParams()\n\t\tif (currentThread.lastMessageId) {\n\t\t\tparams.set(\"afterMessageId\", currentThread.lastMessageId)\n\t\t}\n\t\tparams.set(\"feedbackToken\", currentThread.clientToken)\n\t\tconst result = await requestJson<{\n\t\t\tthreadStatus: string\n\t\t\tmessages: FeedbackMessage[]\n\t\t\tnextPollAfterMs: number\n\t\t}>(\n\t\t\t`${getBaseUrl(options)}/api/v1/feedback/${encodeURIComponent(options.appId)}/threads/${encodeURIComponent(currentThread.threadId)}/messages?${params.toString()}`,\n\t\t)\n\t\tcurrentThread.status = result.threadStatus\n\t\tupdateThreadCard()\n\t\tif (result.messages.length > 0) {\n\t\t\tconst latestMessage = result.messages.at(-1)\n\t\t\tif (latestMessage) currentThread.lastMessageId = latestMessage.id\n\t\t\tappendMessages(result.messages)\n\t\t}\n\t\tif (result.threadStatus !== \"WAITING_ADMIN\") stopPolling()\n\t\telse schedulePoll(result.nextPollAfterMs)\n\t}\n\n\tfunction schedulePoll(delay: number) {\n\t\tstopPolling()\n\t\tif (!delay || delay < 1 || document.hidden || !threadState) return\n\t\tpollTimer = window.setTimeout(() => void pollOnce(), delay)\n\t}\n\n\tfunction startPolling() {\n\t\tif (!threadState || threadState.status !== \"WAITING_ADMIN\") return\n\t\tschedulePoll(10_000)\n\t}\n\n\tfunction stopPolling() {\n\t\tif (pollTimer) window.clearTimeout(pollTimer)\n\t\tpollTimer = null\n\t}\n\n\tfunction open() {\n\t\tinitPanel()\n\t\tpanel.dataset.open = \"true\"\n\t\twindow.setTimeout(() => {\n\t\t\tpanel.querySelector<HTMLTextAreaElement>('[data-role=\"content\"]')?.focus()\n\t\t}, 0)\n\t}\n\n\tfunction close() {\n\t\tpanel.dataset.open = \"false\"\n\t\tstopPolling()\n\t}\n\n\tlauncher.addEventListener(\"click\", open)\n\tconst handleVisibilityChange = () => {\n\t\tif (document.hidden) stopPolling()\n\t\telse startPolling()\n\t}\n\tconst handleDocumentClick = (event: MouseEvent) => {\n\t\tconst categorySelect = panel.querySelector<HTMLElement>(\n\t\t\t'[data-role=\"category-select\"]',\n\t\t)\n\t\tif (\n\t\t\tcategorySelect &&\n\t\t\tevent.target instanceof Node &&\n\t\t\t!categorySelect.contains(event.target)\n\t\t) {\n\t\t\tcategorySelect.dataset.open = \"false\"\n\t\t}\n\t}\n\tdocument.addEventListener(\"visibilitychange\", handleVisibilityChange)\n\tdocument.addEventListener(\"click\", handleDocumentClick)\n\n\tif (typeof window !== \"undefined\") {\n\t\tconst preload = () => {\n\t\t\tif (\"requestIdleCallback\" in window) {\n\t\t\t\t;(window as any).requestIdleCallback(() => initPanel())\n\t\t\t} else {\n\t\t\t\tglobalThis.setTimeout(() => initPanel(), 1200)\n\t\t\t}\n\t\t}\n\t\tif (document.readyState === \"complete\") preload()\n\t\telse {\n\t\t\twindow.addEventListener(\"load\", preload, { once: true })\n\t\t\tremoveLoadListener = () => window.removeEventListener(\"load\", preload)\n\t\t}\n\t}\n\n\treturn {\n\t\topen,\n\t\tclose,\n\t\tdestroy() {\n\t\t\tstopPolling()\n\t\t\tdocument.removeEventListener(\"visibilitychange\", handleVisibilityChange)\n\t\t\tdocument.removeEventListener(\"click\", handleDocumentClick)\n\t\t\tremoveLoadListener?.()\n\t\t\troot.remove()\n\t\t},\n\t}\n}\n\nexport function mountFeedbackWidget(\n\tcontainer: HTMLElement,\n\toptions: FeedbackWidgetOptions,\n) {\n\treturn createFeedbackWidget(container, options)\n}\n"],"mappings":";AA6DA,IAAM,qBAA+C;AAAA,EACpD,EAAE,OAAO,OAAO,OAAO,2BAAO;AAAA,EAC9B,EAAE,OAAO,WAAW,OAAO,2BAAO;AAAA,EAClC,EAAE,OAAO,SAAS,OAAO,2BAAO;AAAA,EAChC,EAAE,OAAO,cAAc,OAAO,2BAAO;AAAA,EACrC,EAAE,OAAO,SAAS,OAAO,eAAK;AAC/B;AAEA,IAAM,WAAW;AACjB,IAAM,yBAAyB;AAC/B,IAAM,sBAAsB;AAC5B,IAAM,yBAAyB;AAC/B,IAAM,4BAA4B;AAClC,IAAM,gBAAgB;AACtB,IAAM,WAAW;AACjB,IAAM,YAAY;AAClB,IAAM,YAAY;AAClB,IAAM,aAAa;AACnB,IAAM,eAAe;AAErB,SAAS,cAAc;AACtB,MAAI,OAAO,aAAa,YAAa;AACrC,MAAI,SAAS,eAAe,QAAQ,EAAG;AACvC,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,KAAK;AACX,QAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsFpB,WAAS,KAAK,YAAY,KAAK;AAChC;AAEA,SAAS,WAAW,SAAgC;AACnD,UAAQ,QAAQ,cAAc,0BAA0B,QAAQ,OAAO,EAAE;AAC1E;AAEA,SAAS,SAAS,OAAgB;AACjC,MAAI;AACH,WAAO,KAAK,UAAU,KAAK;AAAA,EAC5B,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAEA,SAAS,WAAW,OAAe;AAClC,SAAO,MACL,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,OAAO;AACxB;AAEA,SAAS,kBAAkB,OAAuB;AACjD,SAAO,OAAO,gBAAgB,OAAO,gBAAgB;AACtD;AAEA,SAAS,oBACR,OACA,aAAuC,oBACtC;AACD,QAAM,UAAU,WAAW,KAAK,CAAC,SAAS,KAAK,UAAU,KAAK;AAC9D,SAAO,SAAS,SAAS,SAAS,mBAAmB,CAAC,GAAG,SAAS;AACnE;AAEA,SAAS,mBAAmB,OAAgB;AAC3C,QAAM,YAAoC;AAAA,IACzC,MAAM;AAAA,IACN,eAAe;AAAA,IACf,cAAc;AAAA,IACd,UAAU;AAAA,IACV,QAAQ;AAAA,EACT;AACA,SAAO,UAAU,SAAS,EAAE,KAAK,SAAS;AAC3C;AAEA,SAAS,iBAAiB,OAAe;AACxC,MAAI,UAAU,WAAY,QAAO;AACjC,MAAI,UAAU,QAAS,QAAO;AAC9B,SAAO;AACR;AAEA,SAAS,iBAAiB,OAAgB;AACzC,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,IAAI,KAAK,KAAK,EAAE,eAAe;AACvC;AAEA,eAAe,YAAe,KAAa,MAAgC;AAC1E,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IACjC,GAAG;AAAA,IACH,SAAS;AAAA,MACR,QAAQ;AAAA,MACR,GAAI,MAAM,OAAO,EAAE,gBAAgB,mBAAmB,IAAI,CAAC;AAAA,MAC3D,GAAI,MAAM,WAAW,CAAC;AAAA,IACvB;AAAA,EACD,CAAC;AACD,QAAM,UAAU,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,IAAI;AACtD,MAAI,CAAC,SAAS,MAAM,SAAS,SAAS,KAAK;AAC1C,UAAM,IAAI,MAAM,SAAS,WAAW,SAAS,cAAc,gBAAgB;AAAA,EAC5E;AACA,SAAO,QAAQ;AAChB;AAEA,SAAS,gBAAgB,SAAgC;AACxD,QAAM,OACL,OAAO,WAAW,cACf,CAAC,IACD;AAAA,IACA,SAAS,OAAO,SAAS;AAAA,IACzB,WAAW,SAAS;AAAA,IACpB,WAAW,UAAU;AAAA,EACtB;AACH,SAAO,EAAE,GAAG,MAAM,GAAI,QAAQ,YAAY,CAAC,EAAG;AAC/C;AAEA,eAAe,cAAc,MAA2B;AACvD,MAAI,OAAO,aAAa,eAAe,CAAC,KAAK,KAAK,WAAW,QAAQ,GAAG;AACvE,WAAO;AAAA,EACR;AACA,QAAM,SAAS,MAAM,kBAAkB,IAAI;AAC3C,QAAM,UAAU;AAChB,QAAM,QAAQ,KAAK,IAAI,GAAG,UAAU,KAAK,IAAI,OAAO,OAAO,OAAO,MAAM,CAAC;AACzE,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,QAAQ,KAAK,CAAC;AAC3D,SAAO,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,SAAS,KAAK,CAAC;AAC7D,QAAM,MAAM,OAAO,WAAW,IAAI;AAClC,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI,UAAU,QAAQ,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AACvD,QAAM,OAAO,MAAM,IAAI,QAAqB,CAAC,YAAY;AACxD,WAAO,OAAO,SAAS,cAAc,IAAI;AAAA,EAC1C,CAAC;AACD,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,IAAI,KAAK,CAAC,IAAI,GAAG,KAAK,KAAK,QAAQ,YAAY,OAAO,GAAG;AAAA,IAC/D,MAAM;AAAA,IACN,cAAc,KAAK,IAAI;AAAA,EACxB,CAAC;AACF;AAEO,SAAS,qBACf,WACA,SAC2B;AAC3B,MAAI,OAAO,aAAa,aAAa;AACpC,WAAO,EAAE,OAAO;AAAA,IAAC,GAAG,QAAQ;AAAA,IAAC,GAAG,UAAU;AAAA,IAAC,EAAE;AAAA,EAC9C;AACA,MAAI,CAAC,QAAQ,MAAO,OAAM,IAAI,MAAM,mBAAmB;AACvD,cAAY;AAEZ,MAAI,cAAkC;AACtC,MAAI,YAA2B;AAC/B,MAAI,aAAa;AACjB,MAAI,eAAuB,CAAC;AAC5B,MAAI,mBAAsC,CAAC;AAC3C,MAAI,qBAA0C;AAC9C,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,QAAM,WAAW,SAAS,cAAc,QAAQ;AAChD,WAAS,OAAO;AAChB,WAAS,YAAY;AACrB,WAAS,aAAa,cAAc,QAAQ,gBAAgB,cAAI;AAChE,WAAS,YAAY;AACrB,OAAK,YAAY,QAAQ;AACzB,YAAU,YAAY,IAAI;AAE1B,QAAM,QAAQ,SAAS,cAAc,SAAS;AAC9C,QAAM,YAAY;AAClB,QAAM,aAAa,cAAc,QAAQ,cAAc,mBAAmB;AAC1E,QAAM,YAAY;AAAA;AAAA;AAAA,kCAGe,WAAW,QAAQ,cAAc,mBAAmB,CAAC;AAAA,oCACnD,WAAW,QAAQ,iBAAiB,sBAAsB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4CASnD,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gDA2BT,QAAQ;AAAA,kDACN,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uCAOvB,SAAS;AAAA;AAAA,+EAE+B,WAAW,QAAQ,eAAe,8GAAoB,CAAC;AAAA;AAAA,yFAE7C,UAAU;AAAA;AAAA,+DAEpC,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA,uCAKjD,SAAS;AAAA,kEACkB,WAAW,kBAAkB,QAAQ,KAAK,CAAC,CAAC,kBAAkB,WAAW,QAAQ,sBAAsB,4FAAiB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAa1L,WAAS,YAAY;AACpB,QAAI,WAAY;AAChB,iBAAa;AACb,SAAK,YAAY,KAAK;AACtB,UAAM,iBAAiB,MAAM;AAAA,MAC5B;AAAA,IACD;AACA,UAAM,eAAe,MAAM;AAAA,MAC1B;AAAA,IACD;AACA,UAAM,gBAAgB,MAAM;AAAA,MAC3B;AAAA,IACD;AACA,QAAI,gBAAgB,eAAe;AAClC,YAAM,aAAa,QAAQ,cAAc;AACzC,oBAAc,cACb,WAAW,CAAC,GAAG,SAAS,mBAAmB,CAAC,GAAG,SAAS;AACzD,iBAAW,QAAQ,YAAY;AAC9B,cAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,eAAO,OAAO;AACd,eAAO,YAAY;AACnB,eAAO,QAAQ,QAAQ,KAAK;AAC5B,eAAO,QAAQ,WAAW,OAAO,KAAK,UAAU,WAAW,CAAC,GAAG,KAAK;AACpE,eAAO,YAAY,GAAG,QAAQ,SAAS,WAAW,KAAK,KAAK,CAAC;AAC7D,eAAO,iBAAiB,SAAS,MAAM;AACtC,qBAAW,QAAQ,aAAa;AAAA,YAC/B;AAAA,UACD,GAAG;AACF,iBAAK,QAAQ,WAAW,OAAO,SAAS,MAAM;AAAA,UAC/C;AACA,wBAAc,cAAc,KAAK;AACjC,cAAI,gBAAgB;AACnB,2BAAe,QAAQ,QAAQ,KAAK;AACpC,2BAAe,QAAQ,OAAO;AAAA,UAC/B;AAAA,QACD,CAAC;AACD,qBAAa,YAAY,MAAM;AAAA,MAChC;AACA,sBAAgB,aAAa,cAAc,WAAW,CAAC,GAAG,SAAS,KAAK;AAAA,IACzE;AACA,UACE,cAAiC,gCAAgC,GAChE,iBAAiB,SAAS,MAAM;AACjC,UAAI,CAAC,eAAgB;AACrB,qBAAe,QAAQ,OACtB,eAAe,QAAQ,SAAS,SAAS,UAAU;AAAA,IACrD,CAAC;AACF,UACE,cAAiC,oBAAoB,GACpD,iBAAiB,SAAS,KAAK;AAClC,UACE,cAAiC,qBAAqB,GACrD,iBAAiB,SAAS,WAAW;AACxC,UACE,cAAiC,+BAA+B,GAC/D,iBAAiB,SAAS,KAAK;AAClC,UACE,cAAiC,6BAA6B,GAC7D,iBAAiB,SAAS,MAAM;AACjC,YAAM,cAAgC,qBAAqB,GAAG,MAAM;AAAA,IACrE,CAAC;AACF,UACE,cAAgC,qBAAqB,GACpD,iBAAiB,UAAU,CAAC,UAAU;AACvC,sBAAiB,MAAM,OAA4B,KAAK;AAAA,IACzD,CAAC;AACF,UAAM,aAAa,MAAM;AAAA,MACxB;AAAA,IACD;AACA,gBAAY,iBAAiB,YAAY,CAAC,UAAU;AACnD,YAAM,eAAe;AAAA,IACtB,CAAC;AACD,gBAAY,iBAAiB,QAAQ,CAAC,UAAU;AAC/C,YAAM,eAAe;AACrB,sBAAgB,MAAM,cAAc,SAAS,IAAI;AAAA,IAClD,CAAC;AACD,gBAAY,iBAAiB,SAAS,CAAC,UAAU;AAChD,YAAM,QAAQ,MAAM,KAAK,MAAM,eAAe,SAAS,CAAC,CAAC,EAAE;AAAA,QAC1D,CAAC,SAAS,KAAK,KAAK,WAAW,QAAQ;AAAA,MACxC;AACA,UAAI,MAAM,SAAS,GAAG;AACrB,wBAAgB,KAAK;AAAA,MACtB;AAAA,IACD,CAAC;AACD,UACE,cAAiC,sBAAsB,GACtD,iBAAiB,SAAS,MAAM,KAAK,OAAO,CAAC;AAAA,EACjD;AAEA,WAAS,gBAAgB,OAAiC;AACzD,mBAAe,MAAM,KAAK,SAAS,CAAC,CAAC,EACnC,OAAO,CAAC,SAAS,KAAK,KAAK,WAAW,QAAQ,CAAC,EAC/C,MAAM,GAAG,sBAAsB;AACjC,UAAM,QAAQ,MAAM,cAA2B,2BAA2B;AAC1E,QAAI,OAAO;AACV,YAAM,cACL,aAAa,SAAS,IACnB,sBAAO,aAAa,MAAM,wBAC1B;AAAA,IACL;AAAA,EACD;AAEA,WAAS,cAAc;AACtB,kBAAc;AACd,mBAAe,CAAC;AAChB,uBAAmB,CAAC;AACpB,mBAAe,CAAC,CAAC;AACjB,qBAAiB;AACjB,aAAS,EAAE;AACX,UAAM,WAAW,MAAM;AAAA,MACtB;AAAA,IACD;AACA,QAAI,SAAU,UAAS,QAAQ;AAC/B,UAAM,YAAY,MAAM;AAAA,MACvB;AAAA,IACD;AACA,QAAI,UAAW,WAAU,QAAQ;AACjC,UAAM,aAAa,MAAM;AAAA,MACxB;AAAA,IACD;AACA,QAAI,WAAY,YAAW,cAAc;AAAA,EAC1C;AAEA,WAAS,mBAAmB;AAC3B,UAAM,OAAO,MAAM,cAA2B,2BAA2B;AACzE,UAAM,QAAQ,MAAM,cAA2B,4BAA4B;AAC3E,QAAI,CAAC,QAAQ,CAAC,MAAO;AACrB,QAAI,CAAC,aAAa;AACjB,WAAK,QAAQ,UAAU;AACvB,YAAM,MAAM,UAAU;AACtB;AAAA,IACD;AACA,SAAK,QAAQ,UAAU;AACvB,UAAM,MAAM,UAAU;AACtB,UAAM,WAAW,KAAK;AAAA,MACrB;AAAA,IACD;AACA,UAAM,SAAS,KAAK;AAAA,MACnB;AAAA,IACD;AACA,UAAM,UAAU,KAAK;AAAA,MACpB;AAAA,IACD;AACA,UAAM,OAAO,KAAK,cAA2B,2BAA2B;AACxE,QAAI,UAAU;AACb,eAAS,cAAc;AAAA,QACtB,YAAY,YAAY,mBAAmB,CAAC,GAAG;AAAA,QAC/C,QAAQ,cAAc;AAAA,MACvB;AAAA,IACD;AACA,QAAI,OAAQ,QAAO,cAAc,mBAAmB,YAAY,MAAM;AACtE,QAAI,QAAS,SAAQ,cAAc,YAAY,kBAAkB;AACjE,QAAI,KAAM,MAAK,cAAc,iBAAiB,YAAY,SAAS;AAAA,EACpE;AAEA,WAAS,SAAS,SAAiB;AAClC,UAAM,OAAO,MAAM,cAA2B,qBAAqB;AACnE,QAAI,KAAM,MAAK,cAAc;AAC7B,QAAI,QAAS,SAAQ,UAAU,IAAI,MAAM,OAAO,CAAC;AAAA,EAClD;AAEA,WAAS,cAAc,OAAgB;AACtC,UAAM,SAAS,MAAM;AAAA,MACpB;AAAA,IACD;AACA,QAAI,OAAQ,QAAO,WAAW;AAAA,EAC/B;AAEA,WAAS,eAAe,UAA6B;AACpD,UAAM,OAAO,MAAM,cAA2B,wBAAwB;AACtE,QAAI,CAAC,KAAM;AACX,uBAAmB;AACnB,SAAK,YAAY;AACjB,eAAW,WAAW,UAAU;AAC/B,YAAM,OAAO,SAAS,cAAc,KAAK;AACzC,WAAK,YAAY;AACjB,WAAK,QAAQ,QAAQ,OAAO,QAAQ,eAAe,UAAU;AAC7D,WAAK,YAAY,yCAAyC,iBAAiB,QAAQ,UAAU,CAAC,SAAM,IAAI,KAAK,QAAQ,SAAS,EAAE,eAAe,CAAC;AAChJ,YAAM,UAAU,KAAK,cAAc,8BAA8B;AACjE,UAAI,SAAS;AACZ,gBAAQ,cACP,QAAQ,eAAe,aACpB,QAAQ,UACR,QAAQ,qBAAqB,QAAQ;AAAA,MAC1C;AACA,WAAK,YAAY,IAAI;AAAA,IACtB;AAAA,EACD;AAEA,WAAS,eAAe,UAA6B;AACpD,UAAM,OAAO,oBAAI,IAA6B;AAC9C,eAAW,WAAW,iBAAkB,MAAK,IAAI,QAAQ,IAAI,OAAO;AACpE,eAAW,WAAW,SAAU,MAAK,IAAI,QAAQ,IAAI,OAAO;AAC5D,mBAAe,MAAM,KAAK,KAAK,OAAO,CAAC,CAAC;AAAA,EACzC;AAEA,iBAAe,aAAa,OAAe;AAC1C,UAAM,WAAW,MAAM,MAAM,GAAG,sBAAsB;AACtD,UAAM,MAAgB,CAAC;AACvB,eAAW,QAAQ,UAAU;AAC5B,YAAM,aAAa,MAAM,cAAc,IAAI;AAC3C,YAAM,OAAO,IAAI,SAAS;AAC1B,WAAK,OAAO,QAAQ,UAAU;AAC9B,UAAI,YAAa,MAAK,OAAO,YAAY,YAAY,QAAQ;AAC7D,YAAM,UAAkC,CAAC;AACzC,UAAI,YAAa,SAAQ,kBAAkB,IAAI,YAAY;AAC3D,YAAM,WAAW,MAAM;AAAA,QACtB,GAAG,WAAW,OAAO,CAAC,oBAAoB,mBAAmB,QAAQ,KAAK,CAAC;AAAA,QAC3E,EAAE,QAAQ,QAAQ,MAAM,QAAQ;AAAA,MACjC;AACA,YAAM,UAAU,MAAM,SAAS,KAAK;AACpC,UAAI,CAAC,SAAS,MAAM,SAAS,SAAS,KAAK;AAC1C,cAAM,IAAI,MAAM,SAAS,WAAW,qBAAqB;AAAA,MAC1D;AACA,UAAI,KAAK,QAAQ,KAAK,SAAS,EAAE;AAAA,IAClC;AACA,WAAO;AAAA,EACR;AAEA,iBAAe,SAAS;AACvB,UAAM,UAAU,MACd,cAAmC,uBAAuB,GACzD,MAAM,KAAK;AACd,QAAI,CAAC,SAAS;AACb,eAAS,kDAAU;AACnB;AAAA,IACD;AACA,kBAAc,IAAI;AAClB,aAAS,EAAE;AACX,QAAI;AACH,YAAM,WACL,MAAM,cAA2B,+BAA+B,GAC7D,QAAQ,SAAS;AACrB,YAAM,UACL,MAAM,cAAgC,uBAAuB,GAAG,SAChE;AACD,YAAM,YAAY,MAAM;AAAA,QACvB;AAAA,MACD;AACA,YAAM,cAAc,MAAM,aAAa,YAAY;AACnD,UAAI,CAAC,aAAa;AACjB,cAAM,SAAS,MAAM;AAAA,UAKpB,GAAG,WAAW,OAAO,CAAC,oBAAoB,mBAAmB,QAAQ,KAAK,CAAC;AAAA,UAC3E;AAAA,YACC,QAAQ;AAAA,YACR,MAAM,SAAS;AAAA,cACd;AAAA,cACA;AAAA,cACA;AAAA,cACA,OAAO;AAAA,gBACN,GAAI,QAAQ,SAAS,CAAC;AAAA,gBACtB,cAAc,QAAQ,SAAS,GAAG,IAC/B,UACA,QAAQ,OAAO;AAAA,gBAClB,cACC,WAAW,CAAC,QAAQ,SAAS,GAAG,IAC7B,UACA,QAAQ,OAAO;AAAA,cACpB;AAAA,cACA,UAAU,gBAAgB,OAAO;AAAA,YAClC,CAAC;AAAA,UACF;AAAA,QACD;AACA,sBAAc;AAAA,UACb,UAAU,OAAO,OAAO;AAAA,UACxB,aAAa,OAAO;AAAA,UACpB,eAAe,OAAO,SAAS;AAAA,UAC/B,QAAQ,OAAO,OAAO;AAAA,UACtB;AAAA,UACA,gBAAgB;AAAA,UAChB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QACnC;AACA,yBAAiB;AACjB,gBAAQ,kBAAkB,OAAO,OAAO,EAAE;AAC1C,gBAAQ,gBAAgB,OAAO,QAAQ,EAAE;AAAA,MAC1C,OAAO;AACN,cAAM,SAAS,MAAM;AAAA,UACpB,GAAG,WAAW,OAAO,CAAC,oBAAoB,mBAAmB,QAAQ,KAAK,CAAC,YAAY,mBAAmB,YAAY,QAAQ,CAAC;AAAA,UAC/H;AAAA,YACC,QAAQ;AAAA,YACR,SAAS,EAAE,oBAAoB,YAAY,YAAY;AAAA,YACvD,MAAM,SAAS;AAAA,cACd;AAAA,cACA;AAAA,cACA,UAAU,gBAAgB,OAAO;AAAA,YAClC,CAAC;AAAA,UACF;AAAA,QACD;AACA,oBAAY,gBAAgB,OAAO,QAAQ;AAC3C,oBAAY,iBAAiB;AAC7B,gBAAQ,gBAAgB,OAAO,QAAQ,EAAE;AAAA,MAC1C;AACA,YAAM,WAAW,MAAM;AAAA,QACtB;AAAA,MACD;AACA,UAAI,SAAU,UAAS,QAAQ;AAC/B,UAAI,UAAW,WAAU,QAAQ;AACjC,qBAAe,CAAC;AAChB,YAAM,aAAa,MAAM;AAAA,QACxB;AAAA,MACD;AACA,UAAI,WAAY,YAAW,cAAc;AACzC,YAAM,SAAS;AACf,mBAAa;AAAA,IACd,SAAS,OAAO;AACf,eAAS,iBAAiB,QAAQ,MAAM,UAAU,0BAAM;AAAA,IACzD,UAAE;AACD,oBAAc,KAAK;AAAA,IACpB;AAAA,EACD;AAEA,iBAAe,WAAW;AACzB,QAAI,CAAC,YAAa;AAClB,UAAM,gBAAgB;AACtB,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,cAAc,eAAe;AAChC,aAAO,IAAI,kBAAkB,cAAc,aAAa;AAAA,IACzD;AACA,WAAO,IAAI,iBAAiB,cAAc,WAAW;AACrD,UAAM,SAAS,MAAM;AAAA,MAKpB,GAAG,WAAW,OAAO,CAAC,oBAAoB,mBAAmB,QAAQ,KAAK,CAAC,YAAY,mBAAmB,cAAc,QAAQ,CAAC,aAAa,OAAO,SAAS,CAAC;AAAA,IAChK;AACA,kBAAc,SAAS,OAAO;AAC9B,qBAAiB;AACjB,QAAI,OAAO,SAAS,SAAS,GAAG;AAC/B,YAAM,gBAAgB,OAAO,SAAS,GAAG,EAAE;AAC3C,UAAI,cAAe,eAAc,gBAAgB,cAAc;AAC/D,qBAAe,OAAO,QAAQ;AAAA,IAC/B;AACA,QAAI,OAAO,iBAAiB,gBAAiB,aAAY;AAAA,QACpD,cAAa,OAAO,eAAe;AAAA,EACzC;AAEA,WAAS,aAAa,OAAe;AACpC,gBAAY;AACZ,QAAI,CAAC,SAAS,QAAQ,KAAK,SAAS,UAAU,CAAC,YAAa;AAC5D,gBAAY,OAAO,WAAW,MAAM,KAAK,SAAS,GAAG,KAAK;AAAA,EAC3D;AAEA,WAAS,eAAe;AACvB,QAAI,CAAC,eAAe,YAAY,WAAW,gBAAiB;AAC5D,iBAAa,GAAM;AAAA,EACpB;AAEA,WAAS,cAAc;AACtB,QAAI,UAAW,QAAO,aAAa,SAAS;AAC5C,gBAAY;AAAA,EACb;AAEA,WAAS,OAAO;AACf,cAAU;AACV,UAAM,QAAQ,OAAO;AACrB,WAAO,WAAW,MAAM;AACvB,YAAM,cAAmC,uBAAuB,GAAG,MAAM;AAAA,IAC1E,GAAG,CAAC;AAAA,EACL;AAEA,WAAS,QAAQ;AAChB,UAAM,QAAQ,OAAO;AACrB,gBAAY;AAAA,EACb;AAEA,WAAS,iBAAiB,SAAS,IAAI;AACvC,QAAM,yBAAyB,MAAM;AACpC,QAAI,SAAS,OAAQ,aAAY;AAAA,QAC5B,cAAa;AAAA,EACnB;AACA,QAAM,sBAAsB,CAAC,UAAsB;AAClD,UAAM,iBAAiB,MAAM;AAAA,MAC5B;AAAA,IACD;AACA,QACC,kBACA,MAAM,kBAAkB,QACxB,CAAC,eAAe,SAAS,MAAM,MAAM,GACpC;AACD,qBAAe,QAAQ,OAAO;AAAA,IAC/B;AAAA,EACD;AACA,WAAS,iBAAiB,oBAAoB,sBAAsB;AACpE,WAAS,iBAAiB,SAAS,mBAAmB;AAEtD,MAAI,OAAO,WAAW,aAAa;AAClC,UAAM,UAAU,MAAM;AACrB,UAAI,yBAAyB,QAAQ;AACpC;AAAC,QAAC,OAAe,oBAAoB,MAAM,UAAU,CAAC;AAAA,MACvD,OAAO;AACN,mBAAW,WAAW,MAAM,UAAU,GAAG,IAAI;AAAA,MAC9C;AAAA,IACD;AACA,QAAI,SAAS,eAAe,WAAY,SAAQ;AAAA,SAC3C;AACJ,aAAO,iBAAiB,QAAQ,SAAS,EAAE,MAAM,KAAK,CAAC;AACvD,2BAAqB,MAAM,OAAO,oBAAoB,QAAQ,OAAO;AAAA,IACtE;AAAA,EACD;AAEA,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA,UAAU;AACT,kBAAY;AACZ,eAAS,oBAAoB,oBAAoB,sBAAsB;AACvE,eAAS,oBAAoB,SAAS,mBAAmB;AACzD,2BAAqB;AACrB,WAAK,OAAO;AAAA,IACb;AAAA,EACD;AACD;AAEO,SAAS,oBACf,WACA,SACC;AACD,SAAO,qBAAqB,WAAW,OAAO;AAC/C;","names":[]}