设置 actions/checkout 的 fetch-depth 为 0,确保检出完整的 Git 历史记录,这是 vuepress-deploy 操作正确生成页面版本信息所必需的。同时移除配置文件中无关的空行。
4 lines
65 KiB
JavaScript
4 lines
65 KiB
JavaScript
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).CWDComments={})}(this,function(e){"use strict";var t=Object.defineProperty,n=(e,n,r)=>((e,n,r)=>n in e?t(e,n,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[n]=r)(e,"symbol"!=typeof n?n+"":n,r);
|
||
/*! CWDComments widget v0.0.1 */
|
||
function r(e){const t=e.apiBaseUrl.replace(/\/$/,"");function n(){try{const e="cwd_like_uid";let t=localStorage.getItem(e);return t||(t="undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():`${Date.now()}_${Math.random().toString(16).slice(2)}`,localStorage.setItem(e,t)),t}catch(e){return"anonymous"}}return{fetchComments:async function(n=1,r=20){const o=new URLSearchParams({post_slug:e.postSlug,page:n.toString(),limit:r.toString(),nested:"true"});e.avatarPrefix&&o.set("avatar_prefix",e.avatarPrefix);const i=await fetch(`${t}/api/comments?${o}`);if(!i.ok)throw new Error(`获取评论失败:${i.status} ${i.statusText}`);return i.json()},submitComment:async function(n){const r=await fetch(`${t}/api/comments`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({post_slug:e.postSlug,post_title:e.postTitle,post_url:e.postUrl,name:n.name,email:n.email,url:n.url||void 0,content:n.content,parent_id:n.parentId,adminToken:n.adminToken})});if(!r.ok){let e=r.statusText;try{const t=await r.json();t.message&&(e=t.message)}catch(o){}throw new Error(e)}return r.json()},verifyAdminKey:async function(e){const n=await fetch(`${t}/api/verify-admin`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({adminToken:e})});if(!n.ok){let e=n.statusText;try{const t=await n.json();t.message&&(e=t.message)}catch(r){}throw new Error(e)}return n.json()},trackVisit:async function(){try{await fetch(`${t}/api/analytics/visit`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({postSlug:e.postSlug,postTitle:e.postTitle,postUrl:e.postUrl})})}catch(n){}},getLikeStatus:async function(){const r=new URLSearchParams({post_slug:e.postSlug}),o={"X-CWD-Like-User":n()},i=await fetch(`${t}/api/like?${r.toString()}`,{method:"GET",headers:o});return i.ok?i.json():{liked:!1,alreadyLiked:!1,totalLikes:0}},likePage:async function(){const r={"Content-Type":"application/json","X-CWD-Like-User":n()},o=await fetch(`${t}/api/like`,{method:"POST",headers:r,body:JSON.stringify({postSlug:e.postSlug,postTitle:e.postTitle,postUrl:e.postUrl})});if(!o.ok){let e=o.statusText;try{const t=await o.json();t.message&&(e=t.message)}catch(i){}throw new Error(e)}return o.json()},likeComment:async function(e,n=!0){const r="number"==typeof e?e:"string"==typeof e&&e.trim()?Number.parseInt(e.trim(),10):NaN;if(!Number.isFinite(r)||r<=0)throw new Error("Invalid comment id");const o=n?"POST":"DELETE",i=await fetch(`${t}/api/comments/like`,{method:o,headers:{"Content-Type":"application/json"},body:JSON.stringify({id:r})});if(!i.ok){let e=i.statusText;try{const t=await i.json();t.message&&(e=t.message)}catch(s){}throw new Error(e)}return i.json()}}}const o="cwd_admin_auth",i="cwd-salt";function s(e){try{const t=e=>e.split("").map(e=>e.charCodeAt(0)),n=e=>("0"+Number(e).toString(16)).substr(-2),r=e=>t(i).reduce((e,t)=>e^t,e);return e.split("").map(t).map(r).map(n).join("")}catch(t){return btoa(e)}}const a={saveToken(e){const t={adminToken:s(e),timestamp:Date.now()};localStorage.setItem(o,JSON.stringify(t))},getToken(){try{const e=localStorage.getItem(o);if(!e)return null;const t=JSON.parse(e);return Date.now()-t.timestamp>2592e5?(this.clearToken(),null):function(e){try{const t=e=>e.split("").map(e=>e.charCodeAt(0)),n=e=>t(i).reduce((e,t)=>e^t,e);return e.match(/.{1,2}/g).map(e=>parseInt(e,16)).map(n).map(e=>String.fromCharCode(e)).join("")}catch(t){return atob(e)}}(t.adminToken)}catch(e){return this.clearToken(),null}},clearToken(){localStorage.removeItem(o)},hasToken(){return!!this.getToken()}},l="cwd_user_info";class c{constructor(e){this.state={...e},this.listeners=[]}getState(){return{...this.state}}setState(e){const t={...this.state};this.state={...this.state,...e},this.listeners.forEach(e=>{e(this.state,t)})}subscribe(e){return this.listeners.push(e),()=>{this.listeners=this.listeners.filter(t=>t!==e)}}}function d(e,t,n,r){const o=function(){try{const e=localStorage.getItem(l);if(e){const t=JSON.parse(e);return{name:t.name||"",email:t.email||"",url:t.url||""}}}catch(e){}return{name:"",email:"",url:""}}(),i=new c({comments:[],loading:!0,error:null,successMessage:"",pagination:{page:1,limit:e.pageSize||20,total:0,totalCount:0},form:{name:o.name||"",email:o.email||"",url:o.url||"",content:""},formErrors:{},submitting:!1,replyingTo:null,replyContent:"",replyError:null,likeCount:0,liked:!1,commentLikeLoadingId:null});async function s(e=1){i.setState({loading:!0,error:null});try{const n=await t(e,i.getState().pagination.limit);i.setState({comments:n.data,pagination:{page:n.pagination.page,limit:n.pagination.limit,total:n.pagination.total,totalCount:n.pagination.totalCount},loading:!1})}catch(n){i.setState({error:n instanceof Error?n.message:"加载评论失败",loading:!1})}}return i.subscribe(e=>{(e.form.name||e.form.email||e.form.url)&&function(e,t,n){try{const r={name:e,email:t,url:n};localStorage.setItem(l,JSON.stringify(r))}catch(r){}}(e.form.name,e.form.email,e.form.url)}),{store:i,getTotalPages:()=>i.getState().pagination.total,loadComments:s,submitNewComment:async function(){const t=i.getState(),r=t.form,{validateCommentForm:o}=await Promise.resolve().then(()=>S),l=o(r);if(!l.valid)return i.setState({formErrors:l.errors}),!1;i.setState({formErrors:{},submitting:!0,error:null,successMessage:""});try{const o=await n({name:r.name,email:r.email,url:r.url,content:r.content,adminToken:a.getToken()}),l=o&&"string"==typeof o.message?o.message:e.requireReview?"已提交评论,待管理员审核后显示":"评论已提交";return i.setState({form:{...r,content:""},submitting:!1,successMessage:l}),await s(t.pagination.page),!0}catch(c){return i.setState({error:c instanceof Error?c.message:"提交评论失败",submitting:!1,successMessage:""}),!1}},submitReply:async function(e){const t=i.getState();if(!t.replyContent.trim())return!1;const{validateReplyUserInfo:r}=await Promise.resolve().then(()=>S),o=r(t.form);if(!o.valid){const e=Object.values(o.errors).join(";");return i.setState({replyError:e}),!1}i.setState({formErrors:{},submitting:!0,replyError:null});try{return await n({name:t.form.name,email:t.form.email,url:t.form.url,content:t.replyContent,parentId:e,adminToken:a.getToken()}),i.setState({replyContent:"",replyingTo:null,submitting:!1}),await s(t.pagination.page),!0}catch(l){return i.setState({error:l instanceof Error?l.message:"提交回复失败",submitting:!1}),!1}},startReply:function(e){i.setState({replyingTo:e,replyContent:"",replyError:null})},cancelReply:function(){i.setState({replyingTo:null,replyContent:"",replyError:null})},updateFormField:function(e,t){const n={...i.getState().form};n[e]=t,i.setState({form:n})},updateReplyContent:function(e){i.setState({replyContent:e})},clearReplyError:function(){i.setState({replyError:null})},clearError:function(){i.setState({error:null})},clearSuccess:function(){i.setState({successMessage:""})},goToPage:function(e){const t=i.getState().pagination.total;e>=1&&e<=t&&s(e)},setLikeState:function(e,t){const n="number"==typeof e&&Number.isFinite(e)&&e>=0?e:0;i.setState({likeCount:n,liked:!!t})},likeComment:async function(e,t=!0){const n=i.getState();if(!r||n.commentLikeLoadingId===e)return;const o="number"==typeof e?e:"string"==typeof e&&e.trim()?Number.parseInt(e.trim(),10):NaN;if(Number.isFinite(o)&&!(o<=0)){i.setState({commentLikeLoadingId:o});try{const e=Array.isArray(n.comments)?n.comments:[],s=t?1:-1,a=e.map(e=>{if(!e||"number"!=typeof e.id)return e;if(e.id===o){const t="number"==typeof e.likes&&Number.isFinite(e.likes)&&e.likes>=0?e.likes:0,n=Math.max(0,t+s);return{...e,likes:n}}if(Array.isArray(e.replies)&&e.replies.length>0){const t=e.replies.map(e=>{if(!e||"number"!=typeof e.id)return e;if(e.id===o){const t="number"==typeof e.likes&&Number.isFinite(e.likes)&&e.likes>=0?e.likes:0,n=Math.max(0,t+s);return{...e,likes:n}}return e});return{...e,replies:t}}return e});i.setState({comments:a}),await r(o,t)}catch(s){}finally{i.getState().commentLikeLoadingId===o&&i.setState({commentLikeLoadingId:null})}}}}}class m{constructor(e,t={}){this.container="string"==typeof e?document.querySelector(e):e,this.props=t,this.state={},this.elements={},this.destroyed=!1}setState(e){if(this.destroyed)return;const t={...this.state};this.state="function"==typeof e?{...this.state,...e(t)}:{...this.state,...e},this.update(t)}setProps(e){if(this.destroyed)return;const t={...this.props};this.props={...this.props,...e},this.updateProps(t)}render(){}update(e){this.render()}updateProps(e){}destroy(){this.destroyed=!0,this.container&&this.elements.root&&this.elements.root.parentNode&&this.elements.root.parentNode.removeChild(this.elements.root),this.elements={}}createElement(e,t={}){const n=new Set(["svg","path","circle","rect","line","polyline","polygon","ellipse","g","defs","clipPath","mask","pattern","text","tspan","use","symbol","linearGradient","radialGradient","stop","filter"]).has(String(e).toLowerCase()),r=n?document.createElementNS("http://www.w3.org/2000/svg",e):document.createElement(e);if(t.className&&(n?r.setAttribute("class",t.className):r.className=t.className),t.attributes&&Object.entries(t.attributes).forEach(([e,t])=>{if(e.startsWith("on")){const n=e.slice(2).toLowerCase();r.addEventListener(n,t)}else"dataset"===e?Object.entries(t).forEach(([e,t])=>{r.dataset[e]=t}):["disabled","checked","readonly","required","autofocus"].includes(e)?t&&r.setAttribute(e,""):r.setAttribute(e,t)}),void 0!==t.text&&(r.textContent=t.text),void 0!==t.html&&(r.innerHTML=t.html),t.children){(Array.isArray(t.children)?t.children:[t.children]).forEach(e=>{e instanceof Node&&r.appendChild(e)})}return r}createTextElement(e,t,n=""){return this.createElement(e,{className:n,text:t})}empty(e){for(;e.firstChild;)e.removeChild(e.firstChild)}}class p extends m{constructor(e,t={}){super(e,t),this.state={key:"",error:"",loading:!1},this.elements={input:null,error:null,submitBtn:null}}render(){const{key:e,error:t,loading:n}=this.state,r=this.createElement("div",{className:"cwd-modal-overlay",children:[this.createElement("div",{className:"cwd-modal",children:[this.createTextElement("h3","管理员身份验证","cwd-modal-title"),this.createElement("div",{className:"cwd-modal-body",children:[this.createTextElement("p","检测到管理员邮箱,请输入密钥以继续。","cwd-modal-desc"),this.createElement("input",{className:"cwd-form-input "+(t?"cwd-input-error":""),attributes:{type:"password",placeholder:"请输入管理员密钥",value:e,disabled:n,onInput:e=>this.setState({key:e.target.value,error:""}),onKeydown:e=>{"Enter"===e.key&&this.handleSubmit()}}}),t?this.createTextElement("div",t,"cwd-error-text"):null]}),this.createElement("div",{className:"cwd-modal-actions",children:[this.createElement("button",{className:"cwd-btn cwd-btn-secondary",text:"取消",attributes:{type:"button",disabled:n,onClick:()=>this.props.onCancel&&this.props.onCancel()}}),this.createElement("button",{className:"cwd-btn cwd-btn-primary",text:n?"验证中...":"验证",attributes:{type:"button",disabled:n||!e,onClick:()=>this.handleSubmit()}})]})]})]});this.empty(this.container),this.container.appendChild(r),this.elements.input=r.querySelector("input"),this.elements.error=r.querySelector(".cwd-error-text"),this.elements.submitBtn=r.querySelector(".cwd-btn-primary"),this.update();const o=this.elements.input;o&&setTimeout(()=>o.focus(),50)}setState(e){this.state={...this.state,...e},this.update()}update(){const{key:e,error:t,loading:n}=this.state;this.elements.input&&(this.elements.input.value=e,this.elements.input.disabled=n,t?this.elements.input.classList.add("cwd-input-error"):this.elements.input.classList.remove("cwd-input-error")),this.elements.error&&(t?(this.elements.error.textContent=t,this.elements.error.style.display=""):(this.elements.error.textContent="",this.elements.error.style.display="none")),this.elements.submitBtn&&(this.elements.submitBtn.disabled=n||!e,this.elements.submitBtn.textContent=n?"验证中...":"验证")}handleSubmit(){this.state.key&&this.props.onSubmit&&(this.setState({loading:!0}),this.props.onSubmit(this.state.key).catch(e=>{this.setState({error:e.message||"验证失败",loading:!1})}))}destroy(){this.empty(this.container)}}class h extends m{constructor(e,t={}){super(e,t),this.state={localForm:{...t.form}},this.modal=null}render(){const{formErrors:e,submitting:t}=this.props,{localForm:n}=this.state,r=n.name.trim()&&n.email.trim()&&n.content.trim(),o=this.props.adminEmail&&n.email.trim()===this.props.adminEmail&&a.hasToken(),i=this.createElement("form",{className:"cwd-comment-form",attributes:{novalidate:!0,onSubmit:e=>this.handleSubmit(e)},children:[this.createTextElement("h3","发表评论","cwd-form-title"),this.createElement("div",{className:"cwd-form-fields",children:[this.createElement("div",{className:"cwd-form-row",children:[this.createFormField("昵称 *","text","name",n.name,e.name),this.createElement("div",{className:"cwd-form-field-wrapper",children:[this.createFormField("邮箱 *","email","email",n.email,e.email),o?this.createElement("div",{className:"cwd-admin-controls",children:[this.createElement("button",{className:"cwd-btn-text",text:"退出验证",attributes:{type:"button",title:"清除管理员凭证",onClick:()=>{a.clearToken(),this.render()}}})]}):null]}),this.createFormField("网址","url","url",n.url,e.url)]}),this.createElement("div",{className:"cwd-form-field",children:[this.createTextElement("label","写下你的评论...","cwd-form-label"),this.createElement("textarea",{className:"cwd-form-textarea "+(e.content?"cwd-input-error":""),attributes:{placeholder:"",rows:4,disabled:t,onInput:e=>this.handleFieldChange("content",e.target.value)}}),...e.content?[this.createTextElement("span",e.content,"cwd-error-text")]:[]]})]}),this.createElement("div",{className:"cwd-form-actions",children:[this.createElement("button",{className:"cwd-btn cwd-btn-primary",attributes:{type:"submit",disabled:t||!r},text:t?"提交中...":"提交评论"})]})]});this.setInputValues(i,n),this.elements.root=i,this.empty(this.container),this.container.appendChild(i)}updateProps(e){if(!this.props.submitting&&this.props.form!==e.form){const e=this.state.localForm.name||"",t=this.state.localForm.email||"",n=this.state.localForm.url||"",r=this.state.localForm.content||"";this.state.localForm={name:this.props.form.name||e,email:this.props.form.email||t,url:this.props.form.url||n,content:void 0!==this.props.form.content?this.props.form.content:r},this.elements.root&&this.setInputValues(this.elements.root,this.state.localForm)}this.elements.root&&this.updateFormState()}updateFormState(){const{formErrors:e,submitting:t}=this.props,{localForm:n}=this.state,r=n.name.trim()&&n.email.trim()&&n.content.trim(),o=this.elements.root.querySelector('button[type="submit"]');o&&(o.disabled=t||!r,o.textContent=t?"提交中...":"提交评论");this.elements.root.querySelectorAll("input, textarea").forEach(e=>{e.disabled=t}),this.updateErrors(e)}updateErrors(e){if(!this.elements.root)return;const t=this.elements.root.querySelector('input[name="name"]');this.updateFieldError(t,null==e?void 0:e.name);const n=this.elements.root.querySelector('input[name="email"]');this.updateFieldError(n,null==e?void 0:e.email);const r=this.elements.root.querySelector('input[name="url"]');this.updateFieldError(r,null==e?void 0:e.url);const o=this.elements.root.querySelector("textarea");this.updateFieldError(o,null==e?void 0:e.content)}updateFieldError(e,t){if(!e)return;t?e.classList.add("cwd-input-error"):e.classList.remove("cwd-input-error");const n=e.parentElement;let r=n.querySelector(".cwd-error-text");t?(r||(r=document.createElement("span"),r.className="cwd-error-text",n.appendChild(r)),r.textContent=t):r&&r.remove()}createFormField(e,t,n,r,o,i=""){return this.createElement("div",{className:"cwd-form-field",children:[this.createTextElement("label",e,"cwd-form-label"),this.createElement("input",{className:"cwd-form-input "+(o?"cwd-input-error":""),attributes:{type:t,name:n,value:r||"",disabled:this.props.submitting,onInput:e=>this.handleFieldChange(n,e.target.value),onBlur:e=>{"email"===n&&this.handleEmailBlur(e.target.value)}}}),...o?[this.createTextElement("span",o,"cwd-error-text")]:[]]})}setInputValues(e,t){const n=e.querySelector('input[name="name"]'),r=e.querySelector('input[name="email"]'),o=e.querySelector('input[name="url"]'),i=e.querySelector("textarea");n&&(n.value=t.name||""),r&&(r.value=t.email||""),o&&(o.value=t.url||""),i&&(i.value=t.content||"")}handleFieldChange(e,t){this.state.localForm[e]=t,this.props.onFieldChange&&this.props.onFieldChange(e,t),this.elements.root&&this.updateFormState()}handleSubmit(e){e.preventDefault(),this.props.onSubmit&&this.props.onSubmit(this.state.localForm)}async handleEmailBlur(e){if(e&&this.props.adminEmail&&e.trim()===this.props.adminEmail){if(a.hasToken())return;this.showAuthModal()}}showAuthModal(){let e=this.elements.root.querySelector(".cwd-modal-container");e||(e=document.createElement("div"),e.className="cwd-modal-container",this.elements.root.appendChild(e)),this.modal=new p(e,{onCancel:()=>{this.modal.destroy(),this.modal=null},onSubmit:async e=>{this.props.onVerifyAdmin&&(await this.props.onVerifyAdmin(e),a.saveToken(e),this.modal.destroy(),this.modal=null)}}),this.modal.render()}}class u extends m{constructor(e,t={}){super(e,t);const{currentUser:n}=t;this.state={content:t.content||"",showUserInfo:!n||!n.name||!n.email}}render(){const{currentUser:e}=this.props,{showUserInfo:t}=this.state,n=this.createElement("div",{className:"cwd-reply-editor",children:[this.createElement("div",{className:"cwd-reply-header",children:[this.createTextElement("span",`回复 @${this.props.replyToAuthor}`,"cwd-reply-to"),this.createElement("button",{className:"cwd-btn-close",attributes:{type:"button",onClick:()=>this.handleCancel()},text:"✕"})]}),...t?[this.createElement("div",{className:"cwd-form-row",attributes:{style:"margin-bottom: 12px;"},children:[this.createFormField("昵称 *","text","name",null==e?void 0:e.name),this.createFormField("邮箱 *","email","email",null==e?void 0:e.email),this.createFormField("网址","url","url",null==e?void 0:e.url)]})]:[],this.createElement("textarea",{className:"cwd-reply-textarea",attributes:{rows:3,placeholder:"写下你的回复...",disabled:this.props.submitting,onInput:e=>this.handleInput(e)}}),...this.props.error?[this.createElement("div",{className:"cwd-error-inline cwd-error-small",children:[this.createTextElement("span",this.props.error),this.createElement("button",{className:"cwd-error-close",attributes:{type:"button",onClick:()=>this.handleClearError()},text:"✕"})]})]:[],this.createElement("div",{className:"cwd-reply-actions",children:[this.createElement("button",{className:"cwd-btn cwd-btn-primary cwd-btn-small",attributes:{type:"button",disabled:this.props.submitting||!this.state.content.trim(),onClick:()=>this.handleSubmit()},text:this.props.submitting?"提交中...":"提交回复"}),this.createElement("button",{className:"cwd-btn cwd-btn-secondary cwd-btn-small",attributes:{type:"button",disabled:this.props.submitting,onClick:()=>this.handleCancel()},text:"取消"})]})]}),r=n.querySelector("textarea");r&&(r.value=this.state.content),this.elements.root=n,this.empty(this.container),this.container.appendChild(n)}updateProps(e){if(this.props.content!==this.state.content&&this.props.content!==(null==e?void 0:e.content))return this.state.content=this.props.content,void this.render();JSON.stringify(this.props.currentUser)===JSON.stringify(null==e?void 0:e.currentUser)&&this.props.error===(null==e?void 0:e.error)&&this.props.submitting===(null==e?void 0:e.submitting)||this.render()}handleInput(e){var t;this.state.content=e.target.value;const n=null==(t=this.elements.root)?void 0:t.querySelector(".cwd-btn-primary");n&&(n.disabled=this.props.submitting||!this.state.content.trim()),this.props.onUpdate&&this.props.onUpdate(this.state.content)}handleSubmit(){this.props.onSubmit&&this.props.onSubmit()}handleCancel(){this.props.onCancel&&this.props.onCancel()}handleClearError(){this.props.onClearError&&this.props.onClearError()}setContent(e){var t;this.state.content=e;const n=null==(t=this.elements.root)?void 0:t.querySelector("textarea");n&&(n.value=e)}getContent(){return this.state.content}focus(){var e;const t=null==(e=this.elements.root)?void 0:e.querySelector("textarea");t&&t.focus()}handleUserInfoChange(e,t){this.props.onUpdateUserInfo&&this.props.onUpdateUserInfo(e,t)}createFormField(e,t,n,r){return this.createElement("div",{className:"cwd-form-field",children:[this.createElement("input",{className:"cwd-form-input",attributes:{type:t,placeholder:e,value:r||"",disabled:this.props.submitting,onInput:e=>this.handleUserInfoChange(n,e.target.value)}})]})}}function f(e){const t=new Date(e),n=(new Date).getTime()-t.getTime(),r=Math.floor(n/1e3),o=Math.floor(r/60),i=Math.floor(o/60),s=Math.floor(i/24);return s<3?s>0?1===s?"昨天":`${s}天前`:i>0?`${i}小时前`:o>0?`${o}分钟前`:"刚刚":function(e){const t=new Date(e),n=t.getFullYear(),r=String(t.getMonth()+1).padStart(2,"0"),o=String(t.getDate()).padStart(2,"0"),i=String(t.getHours()).padStart(2,"0"),s=String(t.getMinutes()).padStart(2,"0"),a=String(t.getSeconds()).padStart(2,"0");return`${n}/${r}/${o} ${i}:${s}:${a}`}(e)}const g=class e extends m{constructor(e,t={}){super(e,t),this.replyEditor=null,this.childCommentItems=[]}render(){const{comment:t,isReply:n,adminEmail:r,adminBadge:o}=this.props,i="number"==typeof t.priority&&t.priority>1,s=this.props.replyingTo===t.id,a=r&&t.email===r,l=this.createElement("div",{className:"cwd-comment-item "+(n?"cwd-comment-reply":""),children:[this.createElement("div",{className:"cwd-comment-avatar",children:[this.createElement("img",{attributes:{src:t.avatar,alt:t.name,loading:"lazy"}})]}),this.createElement("div",{className:"cwd-comment-body",children:[this.createElement("div",{className:"cwd-comment-header",children:[this.createElement("div",{className:"cwd-comment-author",children:[t.url?this.createElement("span",{className:"cwd-author-name",children:[this.createElement("a",{attributes:{href:t.url,target:"_blank",rel:"noopener noreferrer"},text:t.name})]}):this.createTextElement("span",t.name,"cwd-author-name"),...a?[o?this.createTextElement("span",`${o}`,"cwd-admin-badge"):this.createElement("span",{className:"cwd-admin-badge cwd-admin-badge-icon",attributes:{title:"网站管理员"},html:'<svg viewBox="0 0 22 22" aria-label="网站管理员" role="img" class="cwd-admin-icon" style="width:15px;height:15px;fill:currentColor;vertical-align:-0.15em;"><g><path d="M20.396 11c-.018-.646-.215-1.275-.57-1.816-.354-.54-.852-.972-1.438-1.246.223-.607.27-1.264.14-1.897-.131-.634-.437-1.218-.882-1.687-.47-.445-1.053-.75-1.687-.882-.633-.13-1.29-.083-1.897.14-.273-.587-.704-1.086-1.245-1.44S11.647 1.62 11 1.604c-.646.017-1.273.213-1.813.568s-.969.854-1.24 1.44c-.608-.223-1.267-.272-1.902-.14-.635.13-1.22.436-1.69.882-.445.47-.749 1.055-.878 1.688-.13.633-.08 1.29.144 1.896-.587.274-1.087.705-1.443 1.245-.356.54-.555 1.17-.574 1.817.02.647.218 1.276.574 1.817.356.54.856.972 1.443 1.245-.224.606-.274 1.263-.144 1.896.13.634.433 1.218.877 1.688.47.443 1.054.747 1.687.878.633.132 1.29.084 1.897-.136.274.586.705 1.084 1.246 1.439.54.354 1.17.551 1.816.569.647-.016 1.276-.213 1.817-.567s.972-.854 1.245-1.44c.604.239 1.266.296 1.903.164.636-.132 1.22-.447 1.68-.907.46-.46.776-1.044.908-1.681s.075-1.299-.165-1.903c.586-.274 1.084-.705 1.439-1.246.354-.54.551-1.17.569-1.816zM9.662 14.85l-3.429-3.428 1.293-1.302 2.072 2.072 4.4-4.794 1.347 1.246z"></path></g></svg>'})]:[],...i?[this.createTextElement("span","置顶","cwd-pin-badge")]:[],...t.replyToAuthor?[this.createTextElement("span"," 回复 ","cwd-reply-to-separator"),this.createTextElement("span",t.replyToAuthor,"cwd-reply-to-author")]:[]]}),this.createElement("div",{className:"cwd-comment-actions",children:[this.createElement("span",{className:"cwd-action-btn",attributes:{onClick:()=>this.handleReply()},text:"回复"}),...!1!==this.props.enableCommentLike?[this.createElement("div",{className:"cwd-comment-like",children:[this.createElement("button",{className:"cwd-comment-like-button"+(this.hasLiked(t.id)?" cwd-comment-like-button-liked":""),attributes:{type:"button","aria-label":this.hasLiked(t.id)?"取消点赞":"点赞",onClick:()=>this.handleLikeComment()},children:[this.createElement("span",{className:"cwd-comment-like-icon-wrapper",children:[this.createElement("svg",{className:"cwd-comment-like-icon",attributes:{viewBox:"0 0 24 24","aria-hidden":"true",fill:this.hasLiked(t.id)?"currentColor":"none"},children:[this.createElement("path",{attributes:{d:"M2 21h4V9H2v12zm20-11c0-1.1-.9-2-2-2h-6.31l.95-4.57.03-.32c0-.41-.17-.79-.44-1.06L13 1 7.59 6.41C7.22 6.78 7 7.3 7 7.83V19c0 1.1.9 2 2 2h8c.78 0 1.48-.45 1.82-1.11l3.02-7.05c.11-.23.16-.48.16-.74v-2z"}})]})]}),...(()=>{const e="number"==typeof t.likes&&Number.isFinite(t.likes)&&t.likes>=0?t.likes:0;return e>=1?[this.createTextElement("span",String(e),"cwd-comment-like-count")]:[]})()]})]})]:[],this.createTextElement("span",f(t.created),"cwd-comment-time")]})]}),this.createElement("div",{className:"cwd-comment-content"}),this.createElement("div",{className:"cwd-reply-editor-container"}),...t.replies&&t.replies.length>0?[this.createElement("div",{className:"cwd-replies"})]:[]]})]}),c=l.querySelector(".cwd-comment-content");if(c&&(c.innerHTML=t.contentHtml),s){const e=l.querySelector(".cwd-reply-editor-container");e&&(this.replyEditor=new u(e,{replyToAuthor:t.name,content:this.props.replyContent,error:this.props.replyError,submitting:this.props.submitting,currentUser:this.props.currentUser,onUpdateUserInfo:this.props.onUpdateUserInfo,onUpdate:e=>this.handleUpdateReplyContent(e),onSubmit:()=>this.handleSubmitReply(),onCancel:()=>this.handleCancelReply(),onClearError:()=>this.handleClearReplyError()}),this.replyEditor.render(),this.replyEditor.focus())}else this.replyEditor=null;if(this.childCommentItems=[],t.replies&&t.replies.length>0){const n=l.querySelector(".cwd-replies");n&&t.replies.forEach(t=>{const r=new e(n,{comment:t,isReply:!0,replyingTo:this.props.replyingTo,replyContent:this.props.replyContent,replyError:this.props.replyError,submitting:this.props.submitting,currentUser:this.props.currentUser,onUpdateUserInfo:this.props.onUpdateUserInfo,adminEmail:this.props.adminEmail,adminBadge:this.props.adminBadge,enableCommentLike:this.props.enableCommentLike,onReply:this.props.onReply,onLikeComment:this.props.onLikeComment,onSubmitReply:this.props.onSubmitReply,onCancelReply:this.props.onCancelReply,onUpdateReplyContent:this.props.onUpdateReplyContent,onClearReplyError:this.props.onClearReplyError});r.render(),this.childCommentItems.push(r)})}this.elements.root=l,this.container.contains(l)?this.container.replaceChild(l,this.elements.root):this.container.appendChild(l)}updateProps(e){var t;const{comment:n}=this.props,r=e.replyingTo===n.id,o=this.props.replyingTo===n.id;if(this.props.comment===e.comment){if(o!==r){const e=null==(t=this.elements.root)?void 0:t.querySelector(":scope > .cwd-comment-body > .cwd-reply-editor-container");o&&e?(this.replyEditor=new u(e,{replyToAuthor:n.name,content:this.props.replyContent,error:this.props.replyError,submitting:this.props.submitting,currentUser:this.props.currentUser,onUpdateUserInfo:this.props.onUpdateUserInfo,onUpdate:e=>this.handleUpdateReplyContent(e),onSubmit:()=>this.handleSubmitReply(),onCancel:()=>this.handleCancelReply(),onClearError:()=>this.handleClearReplyError()}),this.replyEditor.render(),this.replyEditor.focus()):!o&&e&&(e.innerHTML="",this.replyEditor=null)}else o&&this.replyEditor&&this.replyEditor.setProps({content:this.props.replyContent,error:this.props.replyError,submitting:this.props.submitting,currentUser:this.props.currentUser});this.childCommentItems&&this.childCommentItems.length>0&&this.childCommentItems.forEach(e=>{e.setProps({replyingTo:this.props.replyingTo,replyContent:this.props.replyContent,replyError:this.props.replyError,submitting:this.props.submitting,currentUser:this.props.currentUser,enableCommentLike:this.props.enableCommentLike,onLikeComment:this.props.onLikeComment})})}else this.render()}handleReply(){this.props.onReply&&this.props.onReply(this.props.comment.id)}handleLikeComment(){if(!this.props.onLikeComment)return;const t=String(this.props.comment.id),n=Date.now(),r=`${this.getUserId()}_${t}`,o=e._likeDebounce.get(r);if(o&&n-o<1e3)return;e._likeDebounce.set(r,n);const i=this.getLikedComments();i.has(t)||(i.add(t),this.saveLikedComments(i),this.props.onLikeComment(t,!0))}getUserId(){if(e._userId)return e._userId;const t="cwd_comment_user_id";let n=localStorage.getItem(t);return n||(n="u_"+Date.now()+"_"+Math.random().toString(36).substring(2,12),localStorage.setItem(t,n)),e._userId=n,n}getLikedComments(){const e=`cwd_comment_liked_${this.getUserId()}`,t=localStorage.getItem(e),n=new Set;if(t)try{const e=JSON.parse(t);Array.isArray(e)&&e.forEach(e=>n.add(String(e)))}catch(r){}return n}saveLikedComments(e){const t=`cwd_comment_liked_${this.getUserId()}`;localStorage.setItem(t,JSON.stringify(Array.from(e)))}hasLiked(e){return this.getLikedComments().has(String(e))}handleSubmitReply(){this.props.onSubmitReply&&this.props.onSubmitReply(this.props.comment.id)}handleCancelReply(){this.props.onCancelReply&&this.props.onCancelReply()}handleUpdateReplyContent(e){this.props.onUpdateReplyContent&&this.props.onUpdateReplyContent(e)}handleClearReplyError(){this.props.onClearReplyError&&this.props.onClearReplyError()}};n(g,"_likeDebounce",new Map),n(g,"_userId",null);let b=g;class w extends m{constructor(e,t={}){super(e,{text:"加载中...",...t})}render(){const e=this.createElement("div",{className:"cwd-loading",children:[this.createElement("div",{className:"cwd-spinner"}),this.createTextElement("span",this.props.text,"cwd-loading-text")]});this.elements.root=e,this.empty(this.container),this.container.appendChild(e)}setText(e){this.props.text=e;const t=this.elements.root.querySelector(".cwd-loading-text");t&&(t.textContent=e)}}class y extends m{constructor(e,t={}){super(e,t),this.state={currentPage:t.currentPage||1,totalPages:t.totalPages||1}}getDisplayedPages(){const{currentPage:e,totalPages:t}=this.state,n=[],r=Math.max(1,e-Math.floor(2.5)),o=Math.min(t,r+5-1);for(let i=o-5+1;i<=o;i++)i>=1&&n.push(i);return n.slice(0,5)}render(){if(this.state.totalPages<=1)return void this.empty(this.container);const e=this.getDisplayedPages(),t=this.createElement("div",{className:"cwd-pagination",children:[this.createElement("button",{className:"cwd-page-btn",attributes:{type:"button",disabled:1===this.state.currentPage,onClick:()=>this.handlePrev()},text:"上一页"}),this.createElement("div",{className:"cwd-page-numbers",children:e.map(e=>this.createElement("button",{className:"cwd-page-num "+(e===this.state.currentPage?"cwd-page-num-active":""),attributes:{type:"button",onClick:()=>this.handleGoTo(e)},text:e.toString()}))}),this.createElement("button",{className:"cwd-page-btn",attributes:{type:"button",disabled:this.state.currentPage===this.state.totalPages,onClick:()=>this.handleNext()},text:"下一页"})]});this.elements.root=t,this.empty(this.container),this.container.appendChild(t)}updateProps(){this.state.currentPage=this.props.currentPage,this.state.totalPages=this.props.totalPages,this.render()}handlePrev(){this.props.onPrev&&this.props.onPrev()}handleNext(){this.props.onNext&&this.props.onNext()}handleGoTo(e){this.props.onGoTo&&this.props.onGoTo(e)}}class x extends m{constructor(e,t={}){super(e,t),this.loadingComponent=null,this.paginationComponent=null,this.commentItems=new Map}render(){const{comments:e,loading:t,error:n,currentPage:r,totalPages:o}=this.props;if(this.empty(this.container),t&&0===e.length)return this.loadingComponent=new w(this.container,{text:"加载评论中..."}),this.loadingComponent.render(),void(this.elements.root=this.loadingComponent.elements.root);if(n&&0===e.length){const e=this.createElement("div",{className:"cwd-error",children:[this.createTextElement("span",n),this.createElement("button",{className:"cwd-error-retry",attributes:{type:"button",onClick:()=>this.handleRetry()},text:"重试"})]});return this.elements.root=e,void this.container.appendChild(e)}const i=this.createElement("div",{className:"cwd-comment-list"});if(e.length>0){const t=this.createElement("div",{className:"cwd-comments"});this.commentItems.clear(),e.forEach((e,n)=>{const r=new b(t,{comment:e,replyingTo:this.props.replyingTo,replyContent:this.props.replyContent,replyError:this.props.replyError,submitting:this.props.submitting,currentUser:this.props.currentUser,onUpdateUserInfo:this.props.onUpdateUserInfo,adminEmail:this.props.adminEmail,adminBadge:this.props.adminBadge,enableCommentLike:this.props.enableCommentLike,onReply:e=>this.handleReply(e),onSubmitReply:e=>this.handleSubmitReply(e),onCancelReply:()=>this.handleCancelReply(),onUpdateReplyContent:e=>this.handleUpdateReplyContent(e),onClearReplyError:()=>this.handleClearReplyError(),onLikeComment:(e,t)=>this.handleLikeComment(e,t)});r.render(),this.commentItems.set(e.id,r)}),i.appendChild(t)}else{const e=this.createElement("div",{className:"cwd-empty",children:[this.createTextElement("p","暂无评论,快来抢沙发吧!","cwd-empty-text")]});i.appendChild(e)}if(o>1){const e=this.createElement("div");i.appendChild(e),this.paginationComponent=new y(e,{currentPage:r,totalPages:o,onPrev:()=>this.handlePrevPage(),onNext:()=>this.handleNextPage(),onGoTo:e=>this.handleGoToPage(e)}),this.paginationComponent.render()}else this.paginationComponent=null;this.elements.root=i,this.container.appendChild(i)}updateProps(e){if(this.props.loading===e.loading||this.props.loading)if(this.props.comments===e.comments)if(this.props.replyingTo===e.replyingTo&&this.props.replyError===e.replyError&&this.props.submitting===e.submitting&&this.props.currentUser===e.currentUser){if(this.paginationComponent){(this.props.currentPage!==e.currentPage||this.props.totalPages!==e.totalPages)&&(this.paginationComponent.props.currentPage=this.props.currentPage,this.paginationComponent.props.totalPages=this.props.totalPages,this.paginationComponent.updateProps())}}else this.commentItems.forEach(e=>{e.setProps({replyingTo:this.props.replyingTo,replyContent:this.props.replyContent,replyError:this.props.replyError,submitting:this.props.submitting,currentUser:this.props.currentUser,enableCommentLike:this.props.enableCommentLike,onLikeComment:(e,t)=>this.handleLikeComment(e,t)})});else this.render();else this.render()}handleRetry(){this.props.onRetry&&this.props.onRetry()}handleReply(e){this.props.onReply&&this.props.onReply(e)}handleSubmitReply(e){this.props.onSubmitReply&&this.props.onSubmitReply(e)}handleCancelReply(){this.props.onCancelReply&&this.props.onCancelReply()}handleUpdateReplyContent(e){this.props.onUpdateReplyContent&&this.props.onUpdateReplyContent(e)}handleClearReplyError(){this.props.onClearReplyError&&this.props.onClearReplyError()}handleLikeComment(e,t){this.props.onLikeComment&&this.props.onLikeComment(e,t)}handlePrevPage(){this.props.onPrevPage&&this.props.onPrevPage()}handleNextPage(){this.props.onNextPage&&this.props.onNextPage()}handleGoToPage(e){this.props.onGoToPage&&this.props.onGoToPage(e)}}class k{constructor(e){this.config={...e},"undefined"!=typeof window&&(this.config.postSlug=window.location.origin+window.location.pathname),"undefined"!=typeof document&&(this.config.postTitle=document.title||this.config.postSlug),"undefined"!=typeof window&&(this.config.postUrl=window.location.origin+window.location.pathname),this.hostElement=this._resolveElement(e.el),this.shadowRoot=null,this.mountPoint=null,this.commentForm=null,this.commentList=null,this.formContainer=null,this.customStyleElement=null,this.store=null,this.unsubscribe=null,this.likeState={count:0,liked:!1,loading:!1},this._likeButtonEl=null,this._likeCountEl=null,this._mounted=!1}_resolveElement(e){if("undefined"==typeof document)return null;if(!e)return null;if("string"==typeof e){const t=document.querySelector(e);return t&&t instanceof HTMLElement?t:null}return e instanceof HTMLElement?e:null}async _loadServerConfig(){try{const e=this.config.apiBaseUrl;if(!e)return{};const t=e.replace(/\/$/,""),n=await fetch(`${t}/api/config/comments`);if(!n.ok)return{};const r=await n.json();return{adminEmail:r.adminEmail||"",adminBadge:r.adminBadge||"",adminEnabled:!!r.adminEnabled,avatarPrefix:r.avatarPrefix||"",allowedDomains:Array.isArray(r.allowedDomains)?r.allowedDomains:[],enableCommentLike:"boolean"!=typeof r.enableCommentLike||r.enableCommentLike,enableArticleLike:"boolean"!=typeof r.enableArticleLike||r.enableArticleLike}}catch(e){return{}}}mount(){if(!this._mounted){if(this.hostElement){this.shadowRoot=this.hostElement.attachShadow({mode:"open"});const e=document.createElement("style");e.textContent=':root,[data-theme=light]{--cwd-primary: #0969da;--cwd-primary-hover: #0864ca;--cwd-text: #24292f;--cwd-text-secondary: #6e7781;--cwd-bg: #ffffff;--cwd-bg-input: #ffffff;--cwd-bg-secondary: #f6f8fa;--cwd-bg-reply: #f6f8fa;--cwd-bg-hover: #f6f8fa;--cwd-bg-disabled: #f6f8fa;--cwd-bg-avatar: #f6f8fa;--cwd-border: #d0d7de;--cwd-border-light: #eaeef2;--cwd-error: #cf222e;--cwd-bg-error: #ffebe9;--cwd-border-error: #fd8c73;--cwd-radius: 6px}[data-theme=dark]{--cwd-primary: #58a6ff;--cwd-primary-hover: #4094ff;--cwd-text: #c9d1d9;--cwd-text-secondary: #8b949e;--cwd-bg: #0d1117;--cwd-bg-input: #0d1117;--cwd-bg-secondary: #161b22;--cwd-bg-reply: #161b22;--cwd-bg-hover: #161b22;--cwd-bg-disabled: #161b22;--cwd-bg-avatar: #161b22;--cwd-border: #30363d;--cwd-border-light: #21262d;--cwd-error: #f85149;--cwd-bg-error: #3d1614;--cwd-border-error: #f85149}*{box-sizing:border-box;margin:0;padding:0}.cwd-container{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Noto Sans,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:14px;line-height:1.5;color:var(--cwd-text);background:var(--cwd-bg);word-wrap:break-word}.cwd-header{display:flex;align-items:center;justify-content:space-between;padding:16px 0;margin-bottom:16px;border-bottom:1px solid var(--cwd-border)}.cwd-count{font-size:16px;font-weight:600;color:var(--cwd-text)}.cwd-comments-header{padding:16px 0;border-bottom:1px solid var(--cwd-border)}.cwd-comments-count{font-size:16px;font-weight:600;color:var(--cwd-text)}.cwd-loading{display:flex;align-items:center;justify-content:center;gap:12px;padding:40px 20px;color:var(--cwd-text-secondary, #6e7781)}.cwd-spinner{width:20px;height:20px;border:2px solid var(--cwd-border, #d0d7de);border-top-color:var(--cwd-primary, #0969da);border-radius:50%;animation:cwd-spin .6s linear infinite}@keyframes cwd-spin{to{transform:rotate(360deg)}}.cwd-loading-text{font-size:14px}.cwd-comment-form{background:var(--cwd-bg, #ffffff);border:1px solid var(--cwd-border, #d0d7de);border-radius:var(--cwd-radius, 6px);padding:20px;margin-bottom:24px}.cwd-form-title{margin:0 0 16px;font-size:16px;font-weight:600;color:var(--cwd-text, #24292f)}.cwd-form-fields{display:flex;flex-direction:column;gap:12px}.cwd-form-row{display:grid;grid-template-columns:1fr 1fr 1fr;gap:12px}@media(max-width:640px){.cwd-form-row{grid-template-columns:1fr}}.cwd-form-field{display:flex;flex-direction:column;gap:4px}.cwd-form-label{font-size:13px;font-weight:500;color:var(--cwd-text, #24292f)}.cwd-form-field input,.cwd-form-field textarea{width:100%;padding:8px 12px;font-size:14px;line-height:1.5;color:var(--cwd-text, #24292f);background:var(--cwd-bg-input, #ffffff);border:1px solid var(--cwd-border, #d0d7de);border-radius:var(--cwd-radius, 6px);transition:border-color .2s,box-shadow .2s;font-family:inherit}.cwd-form-field input:focus,.cwd-form-field textarea:focus{outline:none;border-color:var(--cwd-primary, #0969da);box-shadow:0 0 0 3px #0969da1a}.cwd-form-field input:disabled,.cwd-form-field textarea:disabled{background:var(--cwd-bg-disabled, #f6f8fa);cursor:not-allowed}.cwd-form-field input.cwd-input-error,.cwd-form-field textarea.cwd-input-error{border-color:var(--cwd-error, #cf222e)}.cwd-form-field textarea{resize:vertical;min-height:80px}.cwd-error-text{font-size:12px;color:var(--cwd-error, #cf222e)}.cwd-form-actions{display:flex;justify-content:flex-end;margin-top:16px}.cwd-btn{padding:8px 16px;font-size:14px;font-weight:500;line-height:1.5;border:none;border-radius:var(--cwd-radius, 6px);cursor:pointer;transition:background-color .2s;font-family:inherit}.cwd-btn-primary{color:#fff;background:var(--cwd-primary, #0969da)}.cwd-btn-primary:hover:not(:disabled){background:var(--cwd-primary-hover, #0864ca)}.cwd-btn:disabled{opacity:.6;cursor:not-allowed}.cwd-reply-editor{margin-top:12px;padding:12px;background:var(--cwd-bg-reply, #f6f8fa);border:1px solid var(--cwd-border, #d0d7de);border-radius:var(--cwd-radius, 6px)}.cwd-reply-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.cwd-reply-to{font-size:13px;font-weight:500;color:var(--cwd-text-secondary, #6e7781)}.cwd-btn-close{width:20px;height:20px;padding:0;font-size:14px;color:var(--cwd-text-secondary, #6e7781);background:transparent;border:none;border-radius:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background-color .2s}.cwd-btn-close:hover{background:var(--cwd-bg-hover, rgba(0, 0, 0, .05))}.cwd-reply-textarea{width:100%;padding:8px 12px;font-size:14px;line-height:1.5;color:var(--cwd-text, #24292f);background:var(--cwd-bg-input, #ffffff);border:1px solid var(--cwd-border, #d0d7de);border-radius:var(--cwd-radius, 6px);resize:vertical;font-family:inherit;margin-bottom:8px}.cwd-reply-textarea:focus{outline:none;border-color:var(--cwd-primary, #0969da);box-shadow:0 0 0 3px #0969da1a}.cwd-reply-actions{display:flex;gap:8px;justify-content:flex-end}.cwd-btn-small{padding:4px 10px;font-size:12px}.cwd-btn-secondary{color:var(--cwd-text, #24292f);background:var(--cwd-bg-secondary, #f6f8fa);border:1px solid var(--cwd-border, #d0d7de)}.cwd-btn-secondary:hover:not(:disabled){background:var(--cwd-bg-hover, #eaeef2)}.cwd-comment-item{display:flex;gap:12px;padding:20px 0;border-bottom:1px solid var(--cwd-border-light, #eaeef2)}.cwd-comment-body:hover .cwd-action-btn{display:inline-flex!important}.cwd-comment-item:last-child{border-bottom:none}.cwd-comment-reply{padding-top:12px;padding-bottom:12px}.cwd-comment-avatar{flex-shrink:0;width:40px;height:40px;border-radius:5px;overflow:hidden;background:var(--cwd-bg-avatar, #f6f8fa)}.cwd-comment-avatar img{width:100%;height:100%;object-fit:cover}.cwd-comment-reply .cwd-comment-avatar{width:32px;height:32px}.cwd-comment-body{flex:1;min-width:0}.cwd-comment-header{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:4px}.cwd-author-name{font-size:16px;font-weight:600;color:var(--cwd-text, #24292f)}.cwd-author-name a{color:inherit;text-decoration:none}.cwd-author-name a:hover{color:var(--cwd-primary, #0969da);text-decoration:underline}.cwd-comment-author{display:inline-flex;align-items:center}.cwd-admin-badge{background:#db850d;color:#fff;border-radius:3px;padding:1px 4px;font-size:12px;margin:0 4px}.cwd-pin-badge{background:#fff8c5;color:#9a6700;border-radius:3px;padding:1px 4px;font-size:12px;margin:0 4px}.cwd-reply-to-separator{margin:0 4px}.cwd-reply-to-author{font-style:italic}.cwd-comment-time{font-size:12px;color:var(--cwd-text-secondary, #6e7781)}.cwd-comment-content{font-size:14px;line-height:1.6;color:var(--cwd-text, #24292f);word-wrap:break-word;margin-top:10px}.cwd-comment-content p{margin:0 0 8px}.cwd-comment-content p:last-child{margin-bottom:0}.cwd-comment-content a{color:var(--cwd-primary, #0969da);text-decoration:none}.cwd-comment-content a:hover{text-decoration:underline}.cwd-comment-content h1,.cwd-comment-content h2,.cwd-comment-content h3,.cwd-comment-content h4,.cwd-comment-content h5,.cwd-comment-content h6{margin-top:16px;margin-bottom:8px;font-weight:600;line-height:1.25}.cwd-comment-content h1{font-size:1.5em}.cwd-comment-content h2{font-size:1.3em}.cwd-comment-content h3{font-size:1.1em}.cwd-comment-content ul,.cwd-comment-content ol{padding-left:1.7em;margin:0 0 8px}.cwd-comment-content li+li{margin-top:4px}.cwd-comment-content code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.9em;background:var(--cwd-bg-secondary, #f6f8fa);padding:.2em .4em;border-radius:4px}.cwd-comment-content pre{padding:12px;margin:12px 0;overflow-x:auto;background:var(--cwd-bg-secondary, #f6f8fa);border-radius:6px;font-size:.9em}.cwd-comment-content pre code{padding:0;background:transparent;border-radius:0;display:block}.cwd-comment-content blockquote{margin:8px 0;padding:0 12px;border-left:4px solid var(--cwd-border, #d0d7de);color:var(--cwd-text-secondary, #6e7781)}.cwd-comment-content hr{border:0;border-top:1px solid var(--cwd-border-light, #eaeef2);margin:16px 0}.cwd-comment-content table{border-collapse:collapse;border-spacing:0;width:100%;font-size:13px;margin:12px 0}.cwd-comment-content th,.cwd-comment-content td{border:1px solid var(--cwd-border, #d0d7de);padding:6px 12px;text-align:left}.cwd-comment-content th{background:var(--cwd-bg-secondary, #f6f8fa)}.cwd-comment-content img{max-width:100%;height:auto}.cwd-like{display:flex;align-items:center;justify-content:center;padding:30px 15px}.cwd-like-button{display:inline-flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;gap:6px;padding:4px 10px;border-radius:999px;border:1px solid var(--cwd-border-light, #eaeef2);border:none;background:var(--cwd-bg-secondary, #f6f8fa);background:none;color:var(--cwd-text-secondary, #6e7781);cursor:pointer;font-size:13px;font-family:inherit;transition:background-color .2s ease,border-color .2s ease,color .2s ease,transform .15s ease}.cwd-like-button[data-liked=true]{color:var(--cwd-primary, #0969da)}.cwd-like-button[data-loading=true]{opacity:.6;cursor:default;pointer-events:none}.cwd-like-icon-wrapper{display:inline-flex;align-items:center;justify-content:center}.cwd-like-icon{width:32px;height:32px;fill:currentColor}.cwd-like-count{text-align:center}.cwd-like-animate .cwd-like-icon{animation:cwd-like-bounce .3s ease}@keyframes cwd-like-bounce{0%{transform:scale(1)}50%{transform:scale(1.2)}to{transform:scale(1.05)}}.cwd-comment-actions{display:flex;align-items:center;gap:12px}.cwd-comment-like{display:flex;align-items:center}.cwd-comment-like-button{display:inline-flex;align-items:center;border:1px solid var(--cwd-border-light, #eaeef2);border:1px solid transparent;background:var(--cwd-bg-secondary, #f6f8fa);background:none;color:var(--cwd-text-secondary, #6e7781);cursor:pointer;font-size:12px;font-family:inherit;transition:background-color .2s ease,border-color .2s ease,color .2s ease,transform .15s ease}.cwd-comment-like-button:hover{color:var(--cwd-primary, #0969da)}.cwd-comment-like-icon-wrapper{display:inline-flex;align-items:center;justify-content:center}.cwd-comment-like-icon{width:14px;height:14px;fill:currentColor}.cwd-comment-like-count{white-space:nowrap;padding-left:5px;text-align:right}.cwd-action-btn{display:inline-flex;align-items:center;font-size:12px;color:var(--cwd-text-secondary, #6e7781);background:transparent;border:none;border-radius:4px;cursor:pointer;transition:background-color .2s;font-family:inherit;display:none}.cwd-action-btn:hover{color:var(--cwd-primary, #0969da)}.cwd-replies{margin-top:12px;padding-left:12px;border-left:2px solid var(--cwd-border-light, #eaeef2)}.cwd-comment-list{min-height:100px}.cwd{display:flex;flex-direction:column}.cwd-error{padding:20px;text-align:center;color:var(--cwd-error, #cf222e);background:var(--cwd-bg-error, #ffebe9);border:1px solid var(--cwd-border-error, #fd8c73);border-radius:var(--cwd-radius, 6px)}.cwd-error-retry{margin-left:12px;padding:4px 12px;font-size:13px;color:#fff;background:var(--cwd-primary, #0969da);border:none;border-radius:4px;cursor:pointer;font-family:inherit}.cwd-error-retry:hover{background:var(--cwd-primary-hover, #0864ca)}.cwd-empty{padding:40px 20px;text-align:center}.cwd-empty-icon{font-size:48px;margin-bottom:12px}.cwd-empty-text{margin:0;font-size:14px;color:var(--cwd-text-secondary, #6e7781)}.cwd-pagination{display:flex;align-items:center;justify-content:center;gap:8px;padding:20px 0}.cwd-page-btn{padding:6px 12px;font-size:13px;color:var(--cwd-text, #24292f);background:var(--cwd-bg, #ffffff);border:1px solid var(--cwd-border, #d0d7de);border-radius:var(--cwd-radius, 6px);cursor:pointer;transition:background-color .2s;font-family:inherit}.cwd-page-btn:hover:not(:disabled){background:var(--cwd-bg-hover, #f6f8fa)}.cwd-page-btn:disabled{opacity:.5;cursor:not-allowed}.cwd-page-numbers{display:flex;gap:4px}.cwd-page-num{min-width:32px;padding:6px 8px;font-size:13px;color:var(--cwd-text, #24292f);background:var(--cwd-bg, #ffffff);border:1px solid var(--cwd-border, #d0d7de);border-radius:var(--cwd-radius, 6px);cursor:pointer;transition:background-color .2s;font-family:inherit}.cwd-page-num-active{color:#fff;background:var(--cwd-primary, #0969da);border-color:var(--cwd-primary, #0969da)}.cwd-error-inline{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;margin-bottom:16px;font-size:14px;color:var(--cwd-error, #cf222e);background:var(--cwd-bg-error, #ffebe9);border:1px solid var(--cwd-border-error, #fd8c73);border-radius:var(--cwd-radius, 6px)}.cwd-error-close{width:20px;height:20px;padding:0;font-size:14px;color:inherit;background:transparent;border:none;border-radius:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background-color .2s}.cwd-error-close:hover{background:#0000001a}.cwd-success-inline{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;margin-bottom:16px;font-size:14px;color:#1a7f37;background:#dafbe1;border:1px solid #54ae65;border-radius:var(--cwd-radius, 6px)}.cwd-load-more{display:block;width:100%;padding:12px;margin:16px 0;font-size:14px;color:var(--cwd-primary);background:var(--cwd-bg-secondary);border:1px solid var(--cwd-border);border-radius:var(--cwd-radius);cursor:pointer;transition:background-color .2s;font-family:inherit}.cwd-load-more:hover{background:var(--cwd-bg-hover)}.fade-enter-active,.fade-leave-active{transition:opacity .2s ease}.fade-enter-from,.fade-leave-to{opacity:0}.cwd-container::-webkit-scrollbar{width:8px;height:8px}.cwd-container::-webkit-scrollbar-track{background:transparent}.cwd-container::-webkit-scrollbar-thumb{background:var(--cwd-border);border-radius:4px}.cwd-container::-webkit-scrollbar-thumb:hover{background:var(--cwd-text-secondary)}.cwd-modal-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:10000;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.cwd-modal{background:var(--cwd-bg, #ffffff);border-radius:var(--cwd-radius, 6px);width:90%;max-width:400px;box-shadow:0 8px 24px #0003;border:1px solid var(--cwd-border, #d0d7de);overflow:hidden;animation:cwd-modal-in .2s ease-out}@keyframes cwd-modal-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.cwd-modal-title{margin:0;padding:16px 20px;border-bottom:1px solid var(--cwd-border, #d0d7de);font-size:16px;font-weight:600;color:var(--cwd-text, #24292f)}.cwd-modal-body{padding:20px}.cwd-modal-desc{margin:0 0 16px;font-size:14px;color:var(--cwd-text-secondary, #6e7781)}.cwd-form-input{width:100%;padding:8px 12px;font-size:14px;line-height:1.5;color:var(--cwd-text, #24292f);background:var(--cwd-bg-input, #ffffff);border:1px solid var(--cwd-border, #d0d7de);border-radius:var(--cwd-radius, 6px);transition:border-color .2s,box-shadow .2s;font-family:inherit}.cwd-modal-actions{padding:16px 20px;background:var(--cwd-bg-secondary, #f6f8fa);border-top:1px solid var(--cwd-border, #d0d7de);display:flex;justify-content:flex-end;gap:12px}.cwd-form-field-wrapper{display:flex;flex-direction:column;gap:4px;position:relative}.cwd-admin-controls{position:absolute;top:0;right:0;display:flex;align-items:center;gap:8px;font-size:12px}.cwd-admin-verified{color:#1a7f37;font-weight:500}.cwd-btn-text{background:none;border:none;padding:0;color:var(--cwd-text-secondary);font-size:12px;cursor:pointer;text-decoration:underline}.cwd-btn-text:hover{color:var(--cwd-primary)}.cwd-admin-badge.cwd-admin-badge-icon{background:transparent;padding:0;color:#db850d}',this.shadowRoot.appendChild(e),this.mountPoint=document.createElement("div"),this.mountPoint.className="cwd-comments-container",this.shadowRoot.appendChild(this.mountPoint),this.config.theme&&this.mountPoint.setAttribute("data-theme",this.config.theme),this._applyCustomCss()}(async()=>{const e=await this._loadServerConfig();if(!this._mounted)return;if(e.allowedDomains&&e.allowedDomains.length>0&&"undefined"!=typeof window){const t=window.location.hostname;if(!e.allowedDomains.some(e=>t===e||t.endsWith("."+e)))return void(this.mountPoint&&(this.mountPoint.innerHTML=`\n <div style="padding: 20px; text-align: center; color: #666; font-size: 14px; border: 1px solid #eee; border-radius: 8px; background: #f9f9f9;">\n 当前域名 (${t}) 未获得评论组件调用授权\n </div>\n `))}e.avatarPrefix&&(this.config.avatarPrefix=e.avatarPrefix),e.adminEmail&&(this.config.adminEmail=e.adminEmail),e.adminEnabled&&(this.config.adminBadge=e.adminBadge),this.config.requireReview=!!e.requireReview,this.config.enableCommentLike=e.enableCommentLike,this.config.enableArticleLike=e.enableArticleLike;const t=r(this.config);if(this.api=t,this.hostElement&&this.mountPoint&&(this.store=d(this.config,t.fetchComments.bind(t),t.submitComment.bind(t),"function"==typeof t.likeComment?t.likeComment.bind(t):void 0),this.unsubscribe=this.store.store.subscribe(e=>{this._onStateChange(e)}),this._render(),this.store.loadComments()),this.api&&"function"==typeof this.api.trackVisit&&this.api.trackVisit(),this.api&&"function"==typeof this.api.getLikeStatus)try{const e=await this.api.getLikeStatus(),t=e&&"number"==typeof e.totalLikes?e.totalLikes:0,n=!(!e||!e.liked);this.likeState.count=t,this.likeState.liked=n,this.store&&"function"==typeof this.store.setLikeState&&this.store.setLikeState(t,n),this._updateLikeButton()}catch(n){}})(),this._mounted=!0}}unmount(){if(this._mounted){if(this.commentForm&&(this.commentForm.destroy(),this.commentForm=null),this.commentList&&(this.commentList.destroy(),this.commentList=null),this.unsubscribe&&(this.unsubscribe(),this.unsubscribe=null),this.hostElement)for(;this.hostElement.firstChild;)this.hostElement.removeChild(this.hostElement.firstChild);this.shadowRoot=null,this.mountPoint=null,this.store=null,this._mounted=!1}}_render(){if(!this.mountPoint)return;const e=this.store.store.getState(),t=this.mountPoint.querySelector(".cwd-error-inline");if(e.error){if(!t){const t=document.createElement("div");t.className="cwd-error-inline",t.innerHTML=`\n <span>${e.error}</span>\n <button type="button" class="cwd-error-close" data-action="clear-error">✕</button>\n `,t.querySelector('[data-action="clear-error"]').addEventListener("click",()=>{this.store.clearError()}),this.mountPoint.insertBefore(t,this.mountPoint.firstChild)}}else t&&t.remove();const n=this.mountPoint.querySelector(".cwd-success-inline");if(e.successMessage)if(n){const t=n.querySelector("span");t&&(t.textContent=e.successMessage)}else{const t=document.createElement("div");t.className="cwd-success-inline",t.innerHTML=`\n <span>${e.successMessage}</span>\n <button type="button" class="cwd-error-close" data-action="clear-success">✕</button>\n `,t.querySelector('[data-action="clear-success"]').addEventListener("click",()=>{this.store.clearSuccess()}),this.mountPoint.insertBefore(t,this.mountPoint.firstChild)}else n&&n.remove();let r=this.mountPoint.querySelector(".cwd-comments-header");if(!r){r=document.createElement("div"),r.className="cwd-comments-header";const e=!1!==this.config.enableArticleLike;r.innerHTML=`\n\t\t\t\t<div class="cwd-like" ${e?"":'style="display: none;"'}>\n <button type="button" class="cwd-like-button" data-liked="false">\n <span class="cwd-like-icon-wrapper">\n <svg class="cwd-like-icon" viewBox="0 0 24 24" aria-hidden="true">\n <path d="M12 21c-.4 0-.8-.1-1.1-.4L4.5 15C3 13.6 2 11.7 2 9.6 2 6.5 4.5 4 7.6 4c1.7 0 3.3.8 4.4 2.1C13.1 4.8 14.7 4 16.4 4 19.5 4 22 6.5 22 9.6c0 2.1-1 4-2.5 5.4l-6.4 5.6c-.3.3-.7.4-1.1.4z"></path>\n </svg>\n </span>\n\t\t\t\t\t\t<div>已有 <span class="cwd-like-count">0</span>人喜欢~ </div>\n </button>\n </div>\n <h3 class="cwd-comments-count">\n 共 <span class="cwd-comments-count-number">0</span> 条评论\n </h3>\n `,this.mountPoint.appendChild(r)}const o=r.querySelector(".cwd-comments-count-number");if(o&&(o.textContent=e.pagination.totalCount),this._initLikeButton(r),this.formContainer||(this.formContainer=document.createElement("div"),this.mountPoint.appendChild(this.formContainer)),this.commentForm||(this.commentForm=new h(this.formContainer,{form:e.form,formErrors:e.formErrors,submitting:e.submitting,onSubmit:()=>this._handleSubmit(),onFieldChange:(e,t)=>this.store.updateFormField(e,t),adminEmail:this.config.adminEmail,onVerifyAdmin:e=>this.api.verifyAdminKey(e)}),this.commentForm.render()),!this.commentList){const t=document.createElement("div");this.mountPoint.appendChild(t),this.commentList=new x(t,{comments:e.comments,loading:e.loading,error:null,currentPage:e.pagination.page,totalPages:this.store.getTotalPages(),replyingTo:e.replyingTo,replyContent:e.replyContent,replyError:e.replyError,submitting:e.submitting,currentUser:e.form,onUpdateUserInfo:(e,t)=>this.store.updateFormField(e,t),adminEmail:this.config.adminEmail,adminBadge:this.config.adminBadge,enableCommentLike:!1!==this.config.enableCommentLike,onRetry:()=>this.store.loadComments(),onReply:e=>this.store.startReply(e),onSubmitReply:e=>this.store.submitReply(e),onCancelReply:()=>this.store.cancelReply(),onUpdateReplyContent:e=>this.store.updateReplyContent(e),onClearReplyError:()=>this.store.clearReplyError(),onPrevPage:()=>this.store.goToPage(e.pagination.page-1),onNextPage:()=>this.store.goToPage(e.pagination.page+1),onGoToPage:e=>this.store.goToPage(e),onLikeComment:(e,t)=>{this.store&&"function"==typeof this.store.likeComment&&this.store.likeComment(e,t)}}),this.commentList.render()}}_onStateChange(e,t){var n,r,o,i,s,a,l;if(!this._mounted)return;if(null==(r=null==(n=this.commentForm)?void 0:n.elements)?void 0:r.root){const t=this.commentForm.elements.root;null!==e.replyingTo?t.style.display="none":t.style.display=""}this.commentForm&&this.commentForm.setProps({form:e.form,formErrors:e.formErrors,submitting:e.submitting,adminEmail:this.config.adminEmail});const c=null==(o=this.mountPoint)?void 0:o.querySelector(".cwd-error-inline");if(e.error){if(!c){const t=document.createElement("div");t.className="cwd-error-inline",t.innerHTML=`\n <span>${e.error}</span>\n <button type="button" class="cwd-error-close" data-action="clear-error">✕</button>\n `,t.querySelector('[data-action="clear-error"]').addEventListener("click",()=>{this.store.clearError()}),null==(i=this.mountPoint)||i.insertBefore(t,this.mountPoint.firstChild)}}else c&&c.remove();const d=null==(s=this.mountPoint)?void 0:s.querySelector(".cwd-success-inline");if(e.successMessage)if(d){const t=d.querySelector("span");t&&(t.textContent=e.successMessage)}else{const t=document.createElement("div");t.className="cwd-success-inline",t.innerHTML=`\n <span>${e.successMessage}</span>\n <button type="button" class="cwd-error-close" data-action="clear-success">✕</button>\n `,t.querySelector('[data-action="clear-success"]').addEventListener("click",()=>{this.store.clearSuccess()}),null==(a=this.mountPoint)||a.insertBefore(t,this.mountPoint.firstChild)}else d&&d.remove();const m=null==(l=this.mountPoint)?void 0:l.querySelector(".cwd-comments-header"),p=null==m?void 0:m.querySelector(".cwd-comments-count-number");p&&(p.textContent=e.pagination.totalCount),"number"!=typeof e.likeCount&&"boolean"!=typeof e.liked||("number"==typeof e.likeCount&&(this.likeState.count=e.likeCount),"boolean"==typeof e.liked&&(this.likeState.liked=e.liked),m&&(this._likeButtonEl&&this._likeCountEl||this._initLikeButton(m),this._updateLikeButton())),this.commentList&&this.commentList.setProps({comments:e.comments,loading:e.loading,currentPage:e.pagination.page,totalPages:this.store.getTotalPages(),replyingTo:e.replyingTo,replyContent:e.replyContent,replyError:e.replyError,submitting:e.submitting,currentUser:e.form})}async _handleSubmit(){await this.store.submitNewComment()&&this.commentForm&&(this.commentForm.state.localForm={...this.store.store.getState().form})}updateConfig(e){const t={...this.config};Object.assign(this.config,e),"undefined"!=typeof window&&(this.config.postSlug=window.location.origin+window.location.pathname),"undefined"!=typeof document&&(this.config.postTitle=document.title||this.config.postSlug),"undefined"!=typeof window&&(this.config.postUrl=window.location.origin+window.location.pathname),e.theme&&this.mountPoint&&this.mountPoint.setAttribute("data-theme",e.theme);if(this.config.apiBaseUrl!==t.apiBaseUrl||this.config.pageSize!==t.pageSize||this.config.postSlug!==t.postSlug){const e=r(this.config);this.api=e,this.unsubscribe&&this.unsubscribe(),this.store=d(this.config,e.fetchComments.bind(e),e.submitComment.bind(e)),this.unsubscribe=this.store.store.subscribe(e=>{this._onStateChange(e)}),this.store.loadComments()}this._applyCustomCss()}_applyCustomCss(){if(!this.shadowRoot)return;const e=(this.config&&"string"==typeof this.config.customCssUrl?this.config.customCssUrl:"").trim();if(!e)return this.customStyleElement&&this.customStyleElement.parentNode&&this.customStyleElement.parentNode.removeChild(this.customStyleElement),void(this.customStyleElement=null);if(!this.customStyleElement){const t=document.createElement("link");return t.rel="stylesheet",t.href=e,this.shadowRoot.appendChild(t),void(this.customStyleElement=t)}this.customStyleElement.href=e,this.customStyleElement.parentNode!==this.shadowRoot&&this.shadowRoot.appendChild(this.customStyleElement)}_initLikeButton(e){e&&(this._likeButtonEl||(this._likeButtonEl=e.querySelector(".cwd-like-button"),this._likeButtonEl&&this._likeButtonEl.addEventListener("click",()=>{this._handleLikeClick()})),this._likeCountEl||(this._likeCountEl=e.querySelector(".cwd-like-count")),this._updateLikeButton())}_updateLikeButton(e=!1){var t,n;if(!this._likeButtonEl){if(!this.mountPoint)return;const e=this.mountPoint.querySelector(".cwd-comments-header");if(!e)return;this._initLikeButton(e)}if(!this._likeButtonEl)return;const r=null==(n=null==(t=this.store)?void 0:t.store)?void 0:n.getState(),o=r?!!r.liked:this.likeState.liked,i=r&&"number"==typeof r.likeCount?r.likeCount:this.likeState.count;this.likeState.count=i,this.likeState.liked=o,this._likeButtonEl.dataset.liked=o?"true":"false",this._likeButtonEl.dataset.loading=this.likeState.loading?"true":"false",this._likeCountEl&&(this._likeCountEl.textContent=String(i)),e&&this._likeButtonEl&&(this._likeButtonEl.classList.remove("cwd-like-animate"),this._likeButtonEl.offsetWidth,this._likeButtonEl.classList.add("cwd-like-animate"))}_handleLikeClick(){var e,t;if(!this.api||"function"!=typeof this.api.likePage)return;if(this.likeState.loading)return;const n=null==(t=null==(e=this.store)?void 0:e.store)?void 0:t.getState(),r=n&&"number"==typeof n.likeCount?n.likeCount:this.likeState.count,o=n?!!n.liked:this.likeState.liked;if(o)return;const i=r+1;this.likeState.loading=!0,this.likeState.count=i,this.likeState.liked=!0,this.store&&"function"==typeof this.store.setLikeState&&this.store.setLikeState(i,!0),this._updateLikeButton(!0),this.api.likePage().then(e=>{const t=e&&"number"==typeof e.totalLikes?e.totalLikes:i,n=!(!e||!e.liked);this.likeState.count=t,this.likeState.liked=n,this.store&&"function"==typeof this.store.setLikeState&&this.store.setLikeState(t,n),this._updateLikeButton()}).catch(()=>{this.likeState.count=r,this.likeState.liked=o,this.store&&"function"==typeof this.store.setLikeState&&this.store.setLikeState(r,o),this._updateLikeButton()}).finally(()=>{this.likeState.loading=!1,this._updateLikeButton()})}getConfig(){return{...this.config}}}function v(e){return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e)}function C(e){if(!e)return!0;try{return new URL(e),!0}catch{return!1}}function E(e){return e&&0!==e.trim().length?e.length>1e3?{valid:!1,error:"评论内容不能超过 1000 字"}:{valid:!0}:{valid:!1,error:"请输入评论内容"}}"undefined"!=typeof window&&(window.CWDComments=k);const S=Object.freeze(Object.defineProperty({__proto__:null,isValidEmail:v,isValidUrl:C,validateCommentContent:E,validateCommentForm:function(e){const t={};e.name&&0!==e.name.trim().length?e.name.length>50&&(t.name="昵称不能超过 50 字"):t.name="请输入昵称",e.email&&0!==e.email.trim().length?v(e.email)||(t.email="邮箱格式不正确"):t.email="请输入邮箱",e.url&&!C(e.url)&&(t.url="网址格式不正确");const n=E(e.content);return n.valid||(t.content=n.error),{valid:0===Object.keys(t).length,errors:t}},validateReplyUserInfo:function(e){const t={};return e.name&&0!==e.name.trim().length?e.name.length>50&&(t.name="昵称不能超过 50 字"):t.name="请输入昵称",e.email&&0!==e.email.trim().length?v(e.email)||(t.email="邮箱格式不正确"):t.email="请输入邮箱",e.url&&!C(e.url)&&(t.url="网址格式不正确"),{valid:0===Object.keys(t).length,errors:t}}},Symbol.toStringTag,{value:"Module"}));e.CWDComments=k,e.default=k,Object.defineProperties(e,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
|