koishi-plugin-memesluna 0.5.0 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/style.css +1 -1
- package/lib/config.d.ts +1 -0
- package/lib/index.d.ts +4 -1
- package/lib/index.js +266 -111
- package/lib/service.d.ts +9 -8
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{send as b,icons as Qt}from"@koishijs/client";import{defineComponent as Jt,ref as c,reactive as Se,computed as _,onMounted as Yt,onUnmounted as Xt,watch as qe,openBlock as n,createElementBlock as o,createCommentVNode as d,createElementVNode as e,Fragment as f,toDisplayString as i,normalizeClass as y,createVNode as es,Transition as ts,withCtx as ss,withDirectives as w,vModelText as H,vModelSelect as ne,createTextVNode as S,renderList as $,withModifiers as E,createStaticVNode as Ue,withKeys as ls,vShow as Be,h as ht}from"vue";const as={class:"memesluna-app-layout"},ns={class:"notion-content"},os={class:"content-breadcrumb-header"},is={class:"breadcrumbs"},rs={key:0,class:"crumb-parent"},us={key:1,class:"crumb-parent"},cs={key:2,class:"crumb-parent"},ds={key:3,class:"crumb-parent"},vs={class:"crumb-child active"},ps={key:0,class:"header-quick-stats"},gs={class:"stat-bubble"},fs={class:"stat-bubble"},ms={class:"stat-bubble"},hs={key:0,class:"notion-view-switcher"},bs={key:0,class:"toast-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},ys={key:1,class:"toast-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},ws={key:2,class:"toast-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},ks={key:1,class:"loading-container"},Cs={class:"content-body-wrapper"},_s={key:0,class:"resources-router-view"},xs={key:0,class:"collections-folder-view"},Is={class:"notion-db-header page-section-header collection-list-header"},$s={class:"notion-db-actions collection-toolbar"},Ms={class:"collection-search-shell"},Es={class:"collection-filter-shell"},Ls={key:0,class:"empty-placeholder-card"},Ss={key:1,class:"empty-placeholder-card"},Us={key:2,class:"folders-grid"},Bs=["onClick"],As=["src","alt"],Vs={key:1,class:"folder-cover-empty"},Ns={key:2,class:"folder-cover-badge"},Ps={class:"folder-body"},Rs={class:"folder-title-row"},Ts=["title"],Ds=["onClick"],Fs=["onClick"],zs=["onClick"],Os={class:"folder-count"},Hs={class:"folder-meta-row"},Ws={class:"folder-meta-item"},Gs={class:"asset-detail-shell"},js={class:"detail-topbar"},Zs={class:"detail-breadcrumbs"},qs={class:"detail-crumb-current"},Ks={class:"detail-top-actions"},Qs={class:"asset-hero-panel"},Js={class:"asset-identity-card"},Ys={class:"asset-avatar-frame"},Xs=["src","alt"],el={key:1,class:"asset-avatar-empty"},tl={class:"asset-title-stack"},sl={class:"asset-title-row"},ll={class:"asset-meta-line"},al={class:"asset-api-card"},nl={class:"asset-api-row"},ol=["disabled"],il={key:0,class:"api-preview-strip"},rl=["src"],ul={class:"asset-import-panel"},cl={class:"asset-import-header"},dl={class:"asset-import-actions"},vl={class:"asset-gallery-section"},pl={class:"asset-gallery-toolbar"},gl={class:"asset-tabs"},fl={class:"asset-filter-bar"},ml={class:"asset-search-box"},hl={class:"asset-view-toggle"},bl={class:"gallery-tab-content"},yl={key:0,class:"empty-gallery"},wl={key:1,class:"empty-gallery"},kl={key:2},Cl={key:0,class:"gallery-bulk-toolbar floating"},_l={class:"bulk-status"},xl={class:"bulk-meta"},Il={class:"bulk-actions"},$l={key:1,class:"bulk-move-group"},Ml=["value","disabled"],El=["disabled"],Ll=["onClick","title"],Sl={key:0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2.5"},Ul=["onClick","title"],Bl=["src"],Al={class:"gallery-list-meta"},Vl={class:"gallery-card-overlay"},Nl={key:0,class:"overlay-actions"},Pl=["onClick"],Rl={class:"move-dropdown-menu"},Tl=["onClick"],Dl=["onClick"],Fl={key:1,class:"overlay-actions"},zl=["onClick"],Ol=["onClick"],Hl={key:1,class:"pagination-container"},Wl=["disabled"],Gl={class:"page-indicator"},jl=["disabled"],Zl={class:"distribution-router-view"},ql={class:"endpoint-layout"},Kl={class:"notion-form-panel endpoint-editor-panel"},Ql={class:"panel-title-row"},Jl={class:"notion-panel-title"},Yl={class:"form-fields endpoint-form-grid"},Xl={class:"form-group"},ea=["disabled"],ta={class:"form-group"},sa={class:"form-group span-2"},la={class:"endpoint-preview span-2"},aa={class:"form-actions span-2"},na={class:"notion-table-panel"},oa={class:"table-title-row"},ia={class:"table-count"},ra={class:"table-container"},ua={class:"flat-table"},ca={key:0},da={class:"endpoint-name"},va=["title"],pa={class:"font-mono"},ga={class:"url-line"},fa=["onClick"],ma=["onClick"],ha=["title"],ba={style:{"text-align":"right"}},ya={class:"action-buttons"},wa=["href"],ka=["onClick"],Ca=["onClick"],_a={class:"staging-router-view"},xa={class:"notion-db-header page-section-header staging-page-header"},Ia={class:"staging-header-actions"},$a=["disabled"],Ma={class:"staging-toolbar"},Ea={class:"asset-search-box staging-search-box"},La={class:"staging-count-pill"},Sa={key:0,class:"empty-placeholder-card staging-empty-card"},Ua={key:1,class:"similar-staging-view"},Ba={key:0,class:"empty-gallery"},Aa={key:1,class:"similar-message"},Va={key:2,class:"empty-gallery"},Na={class:"similar-group-header"},Pa={class:"staging-grid"},Ra=["onClick"],Ta=["src","alt"],Da={class:"staging-card-body"},Fa={class:"staging-title-row"},za=["title"],Oa={class:"staging-ext-tag"},Ha={class:"staging-meta-grid"},Wa=["title"],Ga=["onUpdate:modelValue","disabled"],ja=["value"],Za={class:"staging-actions"},qa=["onClick","disabled"],Ka=["onClick","disabled"],Qa={key:2,class:"empty-gallery"},Ja={key:3,class:"staging-grid"},Ya=["onClick"],Xa=["src","alt"],en={class:"staging-card-body"},tn={class:"staging-title-row"},sn=["title"],ln={class:"staging-ext-tag"},an={class:"staging-meta-grid"},nn=["title"],on=["onUpdate:modelValue","disabled"],rn=["value"],un={class:"staging-actions"},cn=["onClick","disabled"],dn=["onClick","disabled"],vn={class:"settings-router-view"},pn={class:"settings-preview-panel"},gn={class:"preview-dashboard-grid"},fn={class:"preview-card route-table-card"},mn={class:"preview-card-header"},hn=["disabled"],bn={key:0,class:"preview-table-wrap"},yn={class:"preview-route-table"},wn=["src","alt","onError"],kn={class:"preview-route-name"},Cn=["title"],_n=["title","onClick"],xn={class:"preview-row-actions"},In=["href"],$n={key:1,class:"preview-empty-state"},Mn={class:"preview-card prompt-card"},En={class:"preview-card-header"},Ln=["disabled"],Sn={class:"preview-code-block final-prompt polished"},Un={key:0},Bn={key:1,class:"text-gray-muted"},An=Jt({__name:"Dashboard",setup(oe){const k=c("resources"),p=c(true),D=c("/memesluna"),Q=c("http://localhost:5140"),J=c([]),C=c([]),F=c([]),Ae=c(""),V=c({}),U=c(""),z=c("all"),Ve=c([]),Y=c(false),be=c(""),ie=c(false),N=c(null),m=Se({name:"",group:"",description:"",url:""}),Ne=c(new Set),Ke=c(""),u=c(null),ye=c(""),X=c("all"),W=c(null),we=c(""),re=c(""),x=Se({images:[],links:[]}),P=Se({}),O=c("all"),ue=c(false),B=c(new Set),ee=c(""),ce=c(""),de=c("name"),ve=c("all"),te=c("grid"),L=c(""),ke=c(false),se=c(null);function bt(l){se.value===l?se.value=null:se.value=l}function Pe(l){return B.value.has(l)}function Qe(l){const t=new Set(B.value);t.has(l)?t.delete(l):t.add(l),B.value=t}function pe(){B.value=new Set,ee.value=""}function yt(){const l=new Set(B.value),t=De.value.filter(s=>s.type==="local");Je.value?t.forEach(s=>l.delete(s.value)):t.forEach(s=>l.add(s.value)),B.value=l}function wt(l){if(l.type==="local"&&M.value.length){Qe(l.value);return}je(l.src)}const I=c(1),Re=c(24),kt=_(()=>{if(!u.value)return[];const l=x.images.map(s=>({id:`local:${s}`,type:"local",label:s,src:We(u.value.name,s),value:s})),t=x.links.map(s=>({id:`external:${s}`,type:"external",label:It(s),src:s,value:s}));return O.value==="local"?l:O.value==="external"?t:[...l,...t]}),Te=_(()=>{const l=ce.value.trim().toLowerCase();let t=kt.value.filter(s=>l?s.label.toLowerCase().includes(l)||s.value.toLowerCase().includes(l):true);return ve.value==="selected"&&(t=t.filter(s=>s.type==="local"&&B.value.has(s.value))),[...t].sort((s,a)=>de.value==="nameDesc"?a.label.localeCompare(s.label):s.label.localeCompare(a.label))}),le=_(()=>Math.max(1,Math.ceil(Te.value.length/Re.value))),De=_(()=>{const l=(I.value-1)*Re.value;return Te.value.slice(l,l+Re.value)}),M=_(()=>Array.from(B.value)),Je=_(()=>{const l=De.value.filter(t=>t.type==="local");return l.length>0&&l.every(t=>B.value.has(t.value))}),Ye=_(()=>{if(!u.value)return"";const l=x.images[0];return l?We(u.value.name,l):x.links[0]||""}),Xe=_(()=>u.value?j(u.value.name):""),et=_(()=>{var l;return((l=u.value)==null?void 0:l.totalCount)||x.images.length+x.links.length}),tt=_(()=>{const l=m.name.trim();return l?j(l):""}),st=_(()=>{const l=C.value.filter(s=>s.hasContent).map(s=>({id:`collection:${s.name}`,type:"collection",typeLabel:"表情包",name:s.name,description:s.description||`${s.name} 表情包`,path:`${D.value}/${s.name}`,fullUrl:j(s.name),previewImages:nt(s.name).slice(0,3)})),t=J.value.map(s=>{const a=j(s.name),v=Ne.value.has(`endpoint:${s.name}`)?[]:[a];return{id:`endpoint:${s.name}`,type:"endpoint",typeLabel:"重定向",name:s.name,description:s.description||"302 重定向",path:`${D.value}/${s.name}`,fullUrl:a,previewImages:v}});return[...l,...t]}),lt=_(()=>{const l=ye.value.trim().toLowerCase();return C.value.filter(t=>{const s=!l||t.name.toLowerCase().includes(l)||(t.description||"").toLowerCase().includes(l),a=X.value==="all"||X.value==="local"&&t.localCount>0&&t.linkCount===0||X.value==="external"&&t.linkCount>0;return s&&a})}),Ce=_(()=>{const l=Ae.value.trim().toLowerCase();return l?F.value.filter(t=>t.filename.toLowerCase().includes(l)||t.originalName.toLowerCase().includes(l)||t.source.toLowerCase().includes(l)||t.reason.toLowerCase().includes(l)):F.value}),Fe=_(()=>{const l=new Set(Ce.value.map(t=>t.id));return Ve.value.map((t,s)=>({...t,label:String(s+1),items:t.items.filter(a=>l.has(a.id))})).filter(t=>t.items.length>1)}),Ct=_(()=>{const l=new Map;for(const t of Fe.value)for(const s of t.items)l.set(s.id,s);return Array.from(l.values())}),ze=c(""),ge=c(""),fe=c(false),Oe=c(null),R=Se({show:false,message:"",type:"info"});let He=null;function r(l,t="info"){He&&clearTimeout(He),R.message=l,R.type=t,R.show=true,He=setTimeout(()=>{R.show=false},2500)}function _e(l){k.value=l,l==="settings"&&ot(),l==="staging"&&me()}function G(){const l=Q.value.endsWith("/")?Q.value.slice(0,-1):Q.value,t=D.value.startsWith("/")?D.value:`/${D.value}`,s=t.endsWith("/")?t.slice(0,-1):t;return`${l}${s}`}function j(l){return`${G()}/${l}`}function We(l,t){return`${G()}/api/admin/collections/${encodeURIComponent(l)}/images/${encodeURIComponent(t)}`}function xe(l){return`${G()}/api/admin/staged-images/${encodeURIComponent(l)}`}function _t(l){if(l.type!=="endpoint")return;const t=new Set(Ne.value);t.add(l.id),Ne.value=t}function Ie(l){if(!l)return"-";const t=new Date(l);return Number.isNaN(t.getTime())?"-":t.toLocaleDateString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit"})}function xt(l){return Number.isFinite(l)?String(Math.round(l*100))+"%":"-"}function at(l){if(!Number.isFinite(l)||l<=0)return"-";const t=["B","KB","MB","GB"];let s=l,a=0;for(;s>=1024&&a<t.length-1;)s/=1024,a++;return`${s>=10||a===0?s.toFixed(0):s.toFixed(1)} ${t[a]}`}function $e(l){const t=l.split(".").pop();return t?t.toUpperCase():"IMG"}function It(l){try{const t=new URL(l);return decodeURIComponent(t.pathname.split("/").filter(Boolean).pop()||t.hostname)||t.hostname}catch{return l}}function $t(l){return P[l]}function nt(l){var t;return((t=P[l])==null?void 0:t.images)||[]}function Ge(l){return nt(l).slice(0,6)}async function Mt(l){var t;if(!(!l.hasContent||(t=P[l.name])!=null&&t.images.length)){P[l.name]=P[l.name]||{loading:true,images:[]},P[l.name].loading=true;try{const s=await fetch(`${G()}/api/collections/${encodeURIComponent(l.name)}/resources`);if(!s.ok)return;const a=await s.json(),v=9,q=Array.isArray(a.images)?a.images.slice(0,v).map(Ee=>We(l.name,Ee)):[],he=Array.isArray(a.links)?a.links.slice(0,v-q.length):[];P[l.name].images=[...q,...he]}catch{P[l.name].images=[]}finally{P[l.name].loading=false}}}function Et(){C.value.filter(l=>l.hasContent).slice(0,24).forEach(l=>{Mt(l)})}async function h(){try{Q.value=window.location.origin;const l=await b("memesluna/getState");l&&(l.backendPath&&(D.value=l.backendPath),J.value=Array.isArray(l.endpoints)?l.endpoints:[],C.value=Array.isArray(l.collections)?l.collections:[],F.value=Array.isArray(l.stagedImages)?l.stagedImages:[],Et())}catch(l){r(l instanceof Error?l.message:"获取插件状态同步失败","error")}}async function ot(){try{const l=await fetch(`${G()}/api/homepage-data`);if(l.ok){const t=await l.json();ze.value=t.routeInventory||"",ge.value=t.llmPrompt||""}}catch(l){console.error("Failed to sync settings variables preview:",l)}}async function me(){try{const l=await b("memesluna/getStagedImages");F.value=Array.isArray(l)?l:[],z.value==="similar"&&await it()}catch(l){r(l instanceof Error?l.message:"刷新暂缓区失败","error")}}async function it(){Y.value=true;try{const l=await b("memesluna/getSimilarStagedImages");Ve.value=Array.isArray(l==null?void 0:l.groups)?l.groups:[],be.value=(l==null?void 0:l.message)||"",l&&l.available===false&&r(l.message||"相似图片筛选不可用","error")}catch(l){Ve.value=[],be.value="",r(l instanceof Error?l.message:"筛选相似图片失败","error")}finally{Y.value=false}}async function Lt(){if(z.value==="similar"){z.value="all";return}z.value="similar",await it()}async function rt(l){var s;const t=V.value[l.id];if(!t){r("请选择目标表情包","error");return}U.value=l.id;try{const a=await b("memesluna/promoteStagedImage",l.id,t);a?(r(`已归档到表情包 "${t}",新文件名 ${a}`,"success"),delete V.value[l.id]):r("暂缓图片不存在或已被处理","error"),await me(),await h(),((s=u.value)==null?void 0:s.name)===t&&await A(t)}catch(a){r(a instanceof Error?a.message:"归档暂缓图片失败","error")}finally{U.value=""}}async function ut(l){if(confirm(`确认从暂缓区删除 "${l.originalName||l.filename}" 吗?`)){U.value=l.id;try{await b("memesluna/deleteStagedImage",l.id)?(r("已从暂缓区删除","success"),delete V.value[l.id]):r("暂缓图片不存在或已被处理","error"),await me(),await h()}catch(t){r(t instanceof Error?t.message:"删除暂缓图片失败","error")}finally{U.value=""}}}async function St(l){let t=0;for(const s of l)try{const a=await ft(s.file);await b("memesluna/addStagedImage",{base64:a,originalName:s.file.name,source:u.value?`upload:${u.value.name}`:"upload-filter",reason:s.reason}),t++}catch(a){console.error("Failed to stage filtered image:",s.file.name,a)}return t&&await me(),t}function Ut(){Me(),ie.value=true}function ct(){Me(),ie.value=false}function Me(){N.value=null,m.name="",m.group="",m.description="",m.url=""}function Bt(l){N.value=l,ie.value=true,m.name=l.name||"",m.group=l.group||"",m.description=l.description||"",m.url=l.url||""}async function At(){const l=m.name.trim(),t=m.url.trim();if(!l||!t){r("端点名称和目标直链 URL 均必填","error");return}const s={name:l,group:m.group.trim()||"默认分组",description:m.description.trim(),url:t,method:"redirect"};try{p.value=true,N.value?(await b("memesluna/updateEndpoint",N.value.name,s),r("端点路由参数已成功更新","success")):(await b("memesluna/createEndpoint",s),r("接口端点已成功创建","success")),await h(),Me(),ie.value=false}catch(a){r(a instanceof Error?a.message:"保存端点失败","error")}finally{p.value=false}}async function Vt(l){if(confirm(`确认删除端点路由 "${l}" 吗?`))try{p.value=true,await b("memesluna/deleteEndpoint",l),r("该分发端点已彻底删除","success"),await h(),N.value&&N.value.name===l&&Me()}catch(t){r(t instanceof Error?t.message:"删除端点路由失败","error")}finally{p.value=false}}async function Z(l){try{await navigator.clipboard.writeText(l),r("成功复制链接到剪贴板","success")}catch{r("复制失败","error")}}async function Nt(){var t;let l=Ke.value.trim();if(l||(l=((t=window.prompt("请输入表情包名称"))==null?void 0:t.trim())||""),!l){r("表情包名称不能为空","error");return}try{if(p.value=true,!await b("memesluna/createCollection",l)){r("该名称的表情包已存在,请更换其他名称","error");return}r("表情包已成功创建","success"),Ke.value="",await h()}catch(s){r(s instanceof Error?s.message:"创建失败","error")}finally{p.value=false}}async function dt(l){if(W.value=null,!!confirm(`⚠️ 危险操作:确认永久且彻底删除表情包 "${l}",及其包含的所有本地图片文件吗?此项操作不可逆!`))try{p.value=true,await b("memesluna/deleteCollection",l),r("该表情包资源已彻底销毁删除","success"),u.value=null,await h()}catch(t){r(t instanceof Error?t.message:"删除失败","error")}finally{p.value=false}}async function vt(l){W.value=null,u.value=l,we.value=l.description||"",re.value="",ce.value="",de.value="name",ve.value="all",te.value="grid",L.value="",I.value=1,pe(),await A(l.name)}function Pt(){u.value=null,L.value&&URL.revokeObjectURL(L.value),L.value="",pe()}async function A(l){try{const t=await fetch(`${G()}/api/collections/${encodeURIComponent(l)}/resources`);if(t.ok){const s=await t.json();x.images=Array.isArray(s.images)?s.images:[],x.links=Array.isArray(s.links)?s.links:[];const a=new Set(x.images);B.value=new Set(M.value.filter(v=>a.has(v)))}}catch{r("加载该表情包下的图片缓存失败","error")}}async function Rt(){if(!u.value)return;p.value=true,await A(u.value.name),await h();const l=C.value.find(t=>t.name===u.value.name);l&&(u.value=l),p.value=false,r("本地及缓存资源数据已刷新成功","success")}async function Tt(){if(u.value){ke.value=true;try{const l=await fetch(Xe.value,{redirect:"follow"});if(!l.ok){r("测试接口未返回可用图片","error");return}const t=await l.blob();if(!t.type.startsWith("image/")){r("测试接口返回的不是图片资源","error");return}L.value&&URL.revokeObjectURL(L.value),L.value=URL.createObjectURL(t),r("已获取随机图片预览","success"),await h();const s=C.value.find(a=>{var v;return a.name===((v=u.value)==null?void 0:v.name)});s&&(u.value=s)}catch(l){r(l instanceof Error?l.message:"测试接口失败","error")}finally{ke.value=false}}}async function pt(){if(u.value)try{p.value=true,await b("memesluna/setCollectionDescription",u.value.name,we.value.trim()),r("表情包描述已成功保存","success"),await h();const l=C.value.find(t=>t.name===u.value.name);l&&(u.value=l)}catch(l){r(l instanceof Error?l.message:"保存表情包描述失败","error")}finally{p.value=false}}function Dt(){Oe.value&&Oe.value.click()}function Ft(l){const t=l.target;t.files&>(t.files)}function zt(l){fe.value=false,l.dataTransfer&&l.dataTransfer.files&>(l.dataTransfer.files)}async function gt(l){if(!u.value)return;const t=10*1024*1024,a=Array.from(l).filter(g=>{const K=g.name.toLowerCase();return g.type.startsWith("image/")||/\.(jpe?g|png|gif|bmp|webp|svg|tiff?|psd|avif)$/.test(K)});if(!a.length){r("请拖入或选择有效的图片格式文件","error");return}const v=a.filter(g=>g.name.toLowerCase().endsWith(".avif")),q=a.filter(g=>!g.name.toLowerCase().endsWith(".avif")),he=new Map;for(const g of q)g.size>t&&he.set(g,"文件大小超过 10MB,需人工复核后再决定是否归档");const Ee=Array.from(he,([g,K])=>({file:g,reason:K})),Le=q.filter(g=>!he.has(g));let ae=0;if(Ee.length&&(ae=await St(Ee)),!Le.length){if(ae>0){const g=v.length?`,${v.length} 张 AVIF 已直接拦截`:"";r(`已将 ${ae} 张被过滤图片放入暂缓区${g}`,"success")}else v.length?r("已拦截 AVIF 图片。此格式不会进入暂缓区,请先转码为 JPG/PNG/GIF/WEBP。","error"):r("图片已被过滤,但写入暂缓区失败","error");await h();return}if(Le.length>50){r("单次上传表情上限为 50 张,请分批次导入","error"),ae&&await h();return}r(`正在转码并上传 ${Le.length} 张表情图片...`,"info");try{const g=[];for(const T of Le){const Ze=await ft(T);g.push({base64:Ze,originalName:T.name})}const K=await fetch(`${G()}/api/admin/collections/${encodeURIComponent(u.value.name)}/images`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({images:g})});if(K.ok){const T=await K.json();if(T.ok&&T.uploaded&&T.uploaded.length>0){const Ze=ae?`,另有 ${ae} 张进入暂缓区`:"",Kt=v.length?`,${v.length} 张 AVIF 已直接拦截`:"";r(`成功将 ${T.uploaded.length} 张表情入库并完成数字重命名${Ze}${Kt}`,"success")}else r("上传图片写入失败","error")}else{const T=await K.json().catch(()=>({}));r(T.error||"上传中继失败","error")}}catch(g){r(`上传网络错误: ${g instanceof Error?g.message:"错误"}`,"error")}finally{await A(u.value.name),await h()}}function ft(l){return new Promise((t,s)=>{const a=new FileReader;a.readAsDataURL(l),a.onload=()=>{const q=a.result.split(",")[1];t(q)},a.onerror=v=>s(v)})}async function Ot(){if(!u.value)return;const l=re.value.trim();if(!l){r("链接文本不能为空","error");return}try{p.value=true;const t=await b("memesluna/addLinks",u.value.name,l);r(`已成功录入 ${t} 条网络图片外链`,"success"),re.value="",await A(u.value.name),await h()}catch(t){r(t instanceof Error?t.message:"添加失败","error")}finally{p.value=false}}async function Ht(l,t){if(confirm("确认删除该图片网络外链直链吗?"))try{p.value=true,await b("memesluna/deleteLink",l,t),r("外链直链已彻底删除","success"),await A(l),await h()}catch(s){r(s instanceof Error?s.message:"删除链接失败","error")}finally{p.value=false}}async function Wt(l,t){if(confirm(`确认永久删除该本地图片素材 "${t}" 吗?此操作无法恢复!`))try{p.value=true,await b("memesluna/deleteLocalImage",l,t),r("该本地图片已永久删除","success"),await A(l),await h()}catch(s){r(s instanceof Error?s.message:"删除失败","error")}finally{p.value=false}}async function Gt(){if(!u.value||!M.value.length)return;const l=M.value;if(confirm(`确认永久删除已选择的 ${l.length} 张本地图片素材吗?此操作无法恢复!`))try{p.value=true;for(const t of l)await b("memesluna/deleteLocalImage",u.value.name,t);r(`已删除 ${l.length} 张本地图片`,"success"),pe(),await A(u.value.name),await h()}catch(t){r(t instanceof Error?t.message:"批量删除失败","error")}finally{p.value=false}}async function jt(l,t,s){try{p.value=true,await b("memesluna/moveLocalImage",l,t,s)?(r(`已将素材移动至表情包 "${t}" 并重命名`,"success"),await A(l),await h()):r("移动失败","error")}catch(a){r(a instanceof Error?a.message:"移库失败","error")}finally{p.value=false}}async function Zt(){if(!u.value||!M.value.length||!ee.value)return;const l=u.value.name,t=ee.value;if(t===l){r("不能移动到当前表情包","error");return}const s=M.value;try{p.value=true;for(const a of s)await b("memesluna/moveLocalImage",l,t,a);r(`已将 ${s.length} 张素材移动至表情包 "${t}"`,"success"),pe(),await A(l),await h()}catch(a){r(a instanceof Error?a.message:"批量移动失败","error")}finally{p.value=false}}function je(l){window.open(l,"_blank")}function qt(l){W.value=W.value===l?null:l}const mt=()=>{se.value=null,W.value=null};return Yt(async()=>{window.addEventListener("click",mt),p.value=true,await h(),p.value=false}),Xt(()=>{window.removeEventListener("click",mt),L.value&&URL.revokeObjectURL(L.value)}),qe(x,()=>{I.value>le.value&&le.value>0&&(I.value=le.value)}),qe([ce,de,ve],()=>{I.value=1}),qe([ye,X],()=>{W.value=null}),(l,t)=>(n(),o("div",as,[d(" MAIN CONTENT AREA "),e("main",ns,[d(" Top Notion Breadcrumbs "),e("header",os,[e("div",is,[t[35]||(t[35]=e("span",{class:"crumb-root"},"MemesLuna 控制台",-1)),t[36]||(t[36]=e("span",{class:"crumb-separator"},"/",-1)),k.value==="resources"?(n(),o("span",rs,"表情包管理")):k.value==="distribution"?(n(),o("span",us,"分发管理")):k.value==="settings"?(n(),o("span",cs,"预览")):k.value==="staging"?(n(),o("span",ds,"暂缓区")):d("v-if",true),k.value==="resources"&&u.value?(n(),o(f,{key:4},[t[34]||(t[34]=e("span",{class:"crumb-separator"},"/",-1)),e("span",vs,"表情包: "+i(u.value.name),1)],64)):d("v-if",true)]),d(" Quick Stats Banner "),p.value?d("v-if",true):(n(),o("div",ps,[e("span",gs,"📂 表情包总数: "+i(C.value.length),1),e("span",fs,"🌐 分发接口: "+i(J.value.length),1),e("span",ms,"🕓 暂缓候选: "+i(F.value.length),1)]))]),d(" NOTION-STYLE HORIZONTAL VIEW SWITCHER "),u.value?d("v-if",true):(n(),o("div",hs,[e("button",{onClick:t[0]||(t[0]=s=>_e("resources")),class:y(["switcher-btn",k.value==="resources"?"active":""])},[...t[37]||(t[37]=[e("span",{class:"switcher-icon"},"📦",-1),e("span",{class:"switcher-label"},"表情包管理",-1)])],2),e("button",{onClick:t[1]||(t[1]=s=>_e("distribution")),class:y(["switcher-btn",k.value==="distribution"?"active":""])},[...t[38]||(t[38]=[e("span",{class:"switcher-icon"},"🌐",-1),e("span",{class:"switcher-label"},"分发管理",-1)])],2),e("button",{onClick:t[2]||(t[2]=s=>_e("staging")),class:y(["switcher-btn",k.value==="staging"?"active":""])},[...t[39]||(t[39]=[e("span",{class:"switcher-icon"},"🕓",-1),e("span",{class:"switcher-label"},"暂缓区",-1)])],2),e("button",{onClick:t[3]||(t[3]=s=>_e("settings")),class:y(["switcher-btn",k.value==="settings"?"active":""])},[...t[40]||(t[40]=[e("span",{class:"switcher-icon"},"👁️",-1),e("span",{class:"switcher-label"},"预览",-1)])],2)])),d(" Global Toast Alert Banner "),es(ts,{name:"fade"},{default:ss(()=>[R.show?(n(),o("div",{key:0,class:y(["toast-banner",R.type])},[R.type==="success"?(n(),o("svg",bs,[...t[41]||(t[41]=[e("polyline",{points:"20 6 9 17 4 12"},null,-1)])])):R.type==="error"?(n(),o("svg",ys,[...t[42]||(t[42]=[e("circle",{cx:"12",cy:"12",r:"10"},null,-1),e("line",{x1:"12",y1:"8",x2:"12",y2:"12"},null,-1),e("line",{x1:"12",y1:"16",x2:"12.01",y2:"16"},null,-1)])])):(n(),o("svg",ws,[...t[43]||(t[43]=[e("circle",{cx:"12",cy:"12",r:"10"},null,-1),e("line",{x1:"12",y1:"16",x2:"12",y2:"12"},null,-1),e("line",{x1:"12",y1:"8",x2:"12.01",y2:"8"},null,-1)])])),e("span",null,i(R.message),1)],2)):d("v-if",true)]),_:1}),d(" Loading Cover "),p.value?(n(),o("div",ks,[...t[44]||(t[44]=[e("div",{class:"spinner"},null,-1),e("p",null,"正在同步数据...",-1)])])):(n(),o(f,{key:2},[d(" MAIN ROUTER BODY "),e("div",Cs,[d(" MENU VIEW 1: RESOURCES (📦) "),k.value==="resources"?(n(),o("div",_s,[d(" Collection Lists (Folder view) "),u.value?(n(),o(f,{key:1},[d(" Collection Details (Inside details view) "),e("div",{class:"collection-detail-layout",onDragover:t[26]||(t[26]=E(s=>fe.value=true,["prevent"]))},[e("div",Gs,[e("div",js,[e("div",Zs,[e("button",{onClick:Pt,class:"detail-back-btn",title:"返回列表"},[...t[56]||(t[56]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("path",{d:"m15 18-6-6 6-6"})],-1),S(" 返回列表 ",-1)])]),t[57]||(t[57]=e("span",{class:"detail-separator"},"/",-1)),e("span",qs,i(u.value.name),1),t[58]||(t[58]=e("span",{class:"detail-separator"},"/",-1)),t[59]||(t[59]=e("span",{class:"detail-crumb-strong"},"图片素材",-1))]),e("div",Ks,[e("button",{onClick:Rt,class:"asset-btn secondary",title:"刷新缓存"},[...t[60]||(t[60]=[Ue('<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" data-v-cbb0f9f4><path d="M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16" data-v-cbb0f9f4></path><path d="M3 21v-5h5" data-v-cbb0f9f4></path><path d="M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8" data-v-cbb0f9f4></path><path d="M16 8h5V3" data-v-cbb0f9f4></path></svg> 刷新缓存 ',2)])]),e("button",{onClick:Dt,class:"asset-btn primary"},[...t[61]||(t[61]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}),e("path",{d:"m17 8-5-5-5 5"}),e("path",{d:"M12 3v12"})],-1),S(" 上传图片 ",-1)])]),e("button",{onClick:t[7]||(t[7]=s=>ue.value=!ue.value),class:"asset-btn secondary"},[...t[62]||(t[62]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("path",{d:"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"}),e("path",{d:"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"})],-1),S(" 导入外链 ",-1)])]),e("button",{onClick:t[8]||(t[8]=s=>dt(u.value.name)),class:"asset-btn danger ghost",title:"删除表情包"},[...t[63]||(t[63]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("path",{d:"M3 6h18"}),e("path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6"}),e("path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"})],-1)])]),e("input",{ref_key:"fileInput",ref:Oe,type:"file",multiple:"",accept:"image/*",class:"hidden-file-input",onChange:Ft},null,544)])]),e("section",Qs,[e("div",Js,[e("div",Ys,[Ye.value?(n(),o("img",{key:0,src:Ye.value,class:"asset-avatar-img",alt:`${u.value.name} 封面`},null,8,Xs)):(n(),o("div",el,[...t[64]||(t[64]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("path",{d:"M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"})],-1)])]))]),e("div",tl,[e("div",sl,[e("h1",null,i(u.value.name),1),t[65]||(t[65]=e("span",{class:"asset-pill"},"本地",-1))]),w(e("input",{"onUpdate:modelValue":t[9]||(t[9]=s=>we.value=s),class:"asset-description-input",placeholder:"添加表情包描述",onBlur:pt,onKeyup:ls(pt,["enter"])},null,544),[[H,we.value]]),e("div",ll,[e("span",null,"创建于 "+i(Ie(u.value.createdAt)),1),e("span",null,"最后更新 "+i(Ie(u.value.updatedAt)),1),e("span",null,"共 "+i(et.value)+" 张图片",1)])])]),e("div",al,[t[68]||(t[68]=e("div",{class:"asset-card-label"},"API 调用地址",-1)),e("div",nl,[e("code",null,i(Xe.value),1),e("button",{onClick:Tt,class:"asset-test-btn",disabled:ke.value},[t[66]||(t[66]=e("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[e("path",{d:"M8 5v14l11-7z"})],-1)),S(" "+i(ke.value?"测试中":"测试接口"),1)],8,ol)]),t[69]||(t[69]=e("div",{class:"asset-api-hint"},"直接访问该链接将随机返回一张表情图片",-1)),L.value?(n(),o("div",il,[e("img",{src:L.value,alt:"API 返回图片预览"},null,8,rl),t[67]||(t[67]=e("span",null,"随机预览",-1))])):d("v-if",true)])]),d(" Drag over drop zone area "),w(e("div",{class:"sidebar-drop-zone-overlay",onDragover:t[10]||(t[10]=E(s=>fe.value=true,["prevent"])),onDragleave:t[11]||(t[11]=E(s=>fe.value=false,["prevent"])),onDrop:E(zt,["prevent"])},[...t[70]||(t[70]=[Ue('<div class="drop-overlay-box" data-v-cbb0f9f4><svg class="drop-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" data-v-cbb0f9f4><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" data-v-cbb0f9f4></path><polyline points="17 8 12 3 7 8" data-v-cbb0f9f4></polyline><line x1="12" y1="3" x2="12" y2="15" data-v-cbb0f9f4></line></svg><p data-v-cbb0f9f4>释放图片文件以导入此表情包</p></div>',1)])],544),[[Be,fe.value]]),w(e("div",ul,[e("div",cl,[t[72]||(t[72]=e("div",null,[e("div",{class:"asset-import-title"},"导入外链图片"),e("div",{class:"asset-import-desc"},"每行一个以 http:// 或 https:// 开头的图片链接")],-1)),e("button",{onClick:t[12]||(t[12]=s=>ue.value=false),class:"asset-icon-btn compact",title:"关闭导入面板"},[...t[71]||(t[71]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("path",{d:"M18 6 6 18"}),e("path",{d:"m6 6 12 12"})],-1)])])]),w(e("textarea",{"onUpdate:modelValue":t[13]||(t[13]=s=>re.value=s),rows:"4",class:"asset-link-textarea",placeholder:"每行一个以 http:// 或 https:// 开头的链接"},null,512),[[H,re.value]]),e("div",dl,[e("button",{onClick:Ot,class:"asset-btn primary"},"确认导入"),e("button",{onClick:t[14]||(t[14]=s=>ue.value=false),class:"asset-btn secondary"},"取消")])],512),[[Be,ue.value]]),e("section",vl,[e("div",pl,[e("div",gl,[e("button",{onClick:t[15]||(t[15]=s=>{O.value="all",I.value=1}),class:y(["asset-tab",O.value==="all"?"active":""])},[t[73]||(t[73]=S(" 全部 ",-1)),e("span",null,i(et.value),1)],2),e("button",{onClick:t[16]||(t[16]=s=>{O.value="local",I.value=1}),class:y(["asset-tab",O.value==="local"?"active":""])},[t[74]||(t[74]=S(" 本地图片 ",-1)),e("span",null,i(x.images.length),1)],2),e("button",{onClick:t[17]||(t[17]=s=>{O.value="external",I.value=1}),class:y(["asset-tab",O.value==="external"?"active":""])},[t[75]||(t[75]=S(" 外链图片 ",-1)),e("span",null,i(x.links.length),1)],2)]),e("div",fl,[e("div",ml,[t[76]||(t[76]=e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("circle",{cx:"11",cy:"11",r:"8"}),e("path",{d:"m21 21-4.3-4.3"})],-1)),w(e("input",{"onUpdate:modelValue":t[18]||(t[18]=s=>ce.value=s),placeholder:"搜索图片或外链"},null,512),[[H,ce.value]])]),w(e("select",{"onUpdate:modelValue":t[19]||(t[19]=s=>ve.value=s),class:"asset-select"},[...t[77]||(t[77]=[e("option",{value:"all"},"筛选: 全部",-1),e("option",{value:"selected"},"筛选: 已选",-1)])],512),[[ne,ve.value]]),w(e("select",{"onUpdate:modelValue":t[20]||(t[20]=s=>de.value=s),class:"asset-select"},[...t[78]||(t[78]=[e("option",{value:"name"},"排序: 文件名",-1),e("option",{value:"nameDesc"},"排序: 文件名倒序",-1)])],512),[[ne,de.value]]),e("div",hl,[e("button",{onClick:t[21]||(t[21]=s=>te.value="grid"),class:y(te.value==="grid"?"active":""),title:"网格视图"},[...t[79]||(t[79]=[Ue('<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" data-v-cbb0f9f4><rect x="3" y="3" width="7" height="7" rx="1" data-v-cbb0f9f4></rect><rect x="14" y="3" width="7" height="7" rx="1" data-v-cbb0f9f4></rect><rect x="3" y="14" width="7" height="7" rx="1" data-v-cbb0f9f4></rect><rect x="14" y="14" width="7" height="7" rx="1" data-v-cbb0f9f4></rect></svg>',1)])],2),e("button",{onClick:t[22]||(t[22]=s=>te.value="list"),class:y(te.value==="list"?"active":""),title:"列表视图"},[...t[80]||(t[80]=[Ue('<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" data-v-cbb0f9f4><path d="M8 6h13" data-v-cbb0f9f4></path><path d="M8 12h13" data-v-cbb0f9f4></path><path d="M8 18h13" data-v-cbb0f9f4></path><path d="M3 6h.01" data-v-cbb0f9f4></path><path d="M3 12h.01" data-v-cbb0f9f4></path><path d="M3 18h.01" data-v-cbb0f9f4></path></svg>',1)])],2)])])]),e("div",bl,[!x.images.length&&!x.links.length?(n(),o("div",yl," 表情包内尚无任何图片资源 ")):Te.value.length?(n(),o("div",kl,[M.value.length?(n(),o("div",Cl,[e("div",_l,[t[81]||(t[81]=e("span",{class:"bulk-title"},"本地素材",-1)),e("span",xl,"已选择 "+i(M.value.length)+" 张",1)]),e("div",Il,[e("button",{onClick:yt,class:"toolbar-btn compact"},i(Je.value?"取消本页":"选择本页"),1),M.value.length?(n(),o("button",{key:0,onClick:pe,class:"toolbar-btn compact"}," 清空选择 ")):d("v-if",true),M.value.length?(n(),o("div",$l,[w(e("select",{"onUpdate:modelValue":t[23]||(t[23]=s=>ee.value=s),class:"flat-select compact-select"},[t[82]||(t[82]=e("option",{value:""},"移动到...",-1)),(n(true),o(f,null,$(C.value,s=>(n(),o("option",{key:s.name,value:s.name,disabled:s.name===u.value.name},i(s.name),9,Ml))),128))],512),[[ne,ee.value]]),e("button",{onClick:Zt,class:"toolbar-btn compact",disabled:!ee.value}," 移动 ",8,El)])):d("v-if",true),t[83]||(t[83]=e("button",{class:"toolbar-btn compact",disabled:""},"设置标签",-1)),M.value.length?(n(),o("button",{key:2,onClick:Gt,class:"toolbar-btn compact danger"}," 批量删除 ")):d("v-if",true)])])):d("v-if",true),e("div",{class:y(["notion-gallery-grid",te.value==="list"?"list-mode":""])},[(n(true),o(f,null,$(De.value,s=>(n(),o("div",{key:s.id,class:y(["notion-gallery-card",{"notion-gallery-card-active-dropdown":s.type==="local"&&se.value===s.value,selected:s.type==="local"&&Pe(s.value),external:s.type==="external"}])},[s.type==="local"?(n(),o("button",{key:0,class:"gallery-select-toggle",onClick:E(a=>Qe(s.value),["stop"]),title:Pe(s.value)?"取消选择":"选择图片"},[Pe(s.value)?(n(),o("svg",Sl,[...t[84]||(t[84]=[e("polyline",{points:"20 6 9 17 4 12"},null,-1)])])):d("v-if",true)],8,Ll)):d("v-if",true),e("div",{class:"gallery-img-container",onClick:a=>wt(s),style:{cursor:"pointer"},title:s.type==="local"&&M.value.length?"切换选择状态":"在新标签页中打开原图"},[e("img",{src:s.src,class:"gallery-img",loading:"lazy"},null,8,Bl),e("span",{class:y(["image-format-badge",s.type])},i(s.type==="external"?"LINK":$e(s.value)),3)],8,Ul),e("div",Al,[e("div",null,i(s.label),1),e("span",null,i(s.type==="external"?"外链图片":$e(s.value)),1)]),e("div",Vl,[s.type==="local"?(n(),o("div",Nl,[e("div",{class:"card-action-btn move move-dropdown-container",onClick:E(a=>bt(s.value),["stop"])},[t[85]||(t[85]=e("span",null,"修改",-1)),w(e("div",Rl,[(n(true),o(f,null,$(C.value,a=>(n(),o(f,null,[a.name!==u.value.name?(n(),o("button",{key:a.name,onClick:E(v=>jt(u.value.name,a.name,s.value),["stop"]),class:"dropdown-item"},i(a.name),9,Tl)):d("v-if",true)],64))),256))],512),[[Be,se.value===s.value]])],8,Pl),e("button",{onClick:E(a=>Wt(u.value.name,s.value),["stop"]),class:"card-action-btn danger"}," 删除 ",8,Dl)])):(n(),o("div",Fl,[e("button",{onClick:E(a=>Z(s.value),["stop"]),class:"card-action-btn"}," 复制 ",8,zl),e("button",{onClick:E(a=>Ht(u.value.name,s.value),["stop"]),class:"card-action-btn danger"}," 删除 ",8,Ol)]))])],2))),128))],2),le.value>1?(n(),o("div",Hl,[e("button",{disabled:I.value===1,onClick:t[24]||(t[24]=s=>I.value--),class:"btn btn-secondary page-btn"}," 上一页 ",8,Wl),e("span",Gl,[t[86]||(t[86]=S("第 ",-1)),e("b",null,i(I.value),1),S(" / "+i(le.value)+" 页",1)]),e("button",{disabled:I.value===le.value,onClick:t[25]||(t[25]=s=>I.value++),class:"btn btn-secondary page-btn"}," 下一页 ",8,jl)])):d("v-if",true)])):(n(),o("div",wl," 没有匹配当前搜索或筛选条件的图片 "))])])])],32)],2112)):(n(),o("div",xs,[d(" Creator bar in Notion Style "),e("div",Is,[t[49]||(t[49]=e("div",null,[e("h1",{class:"notion-main-title"},"表情包管理"),e("p",{class:"section-desc compact"},"管理表情包合集与图片素材")],-1)),e("div",$s,[e("div",Ms,[t[45]||(t[45]=e("svg",{class:"collection-toolbar-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("circle",{cx:"11",cy:"11",r:"8"}),e("path",{d:"m21 21-4.3-4.3"})],-1)),w(e("input",{"onUpdate:modelValue":t[4]||(t[4]=s=>ye.value=s),class:"flat-input collection-search-input",placeholder:"搜索表情包合集..."},null,512),[[H,ye.value]])]),e("label",Es,[t[47]||(t[47]=e("svg",{class:"collection-toolbar-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("path",{d:"M3 4h18l-7 8v6l-4 2v-8z"})],-1)),w(e("select",{"onUpdate:modelValue":t[5]||(t[5]=s=>X.value=s),class:"flat-select collection-filter-select","aria-label":"筛选表情包合集"},[...t[46]||(t[46]=[e("option",{value:"all"},"全部",-1),e("option",{value:"local"},"仅本地",-1),e("option",{value:"external"},"含外链",-1)])],512),[[ne,X.value]])]),e("button",{onClick:Nt,class:"btn btn-primary btn-notion"},[...t[48]||(t[48]=[e("span",{class:"btn-plus"},"+",-1),S(" 新建表情包 ",-1)])])])]),t[55]||(t[55]=e("hr",{class:"notion-hr"},null,-1)),d(" Folders grid layout "),C.value.length?lt.value.length?(n(),o("div",Us,[(n(true),o(f,null,$(lt.value,s=>{var a;return n(),o("div",{key:s.name,class:"folder-card",onClick:v=>vt(s)},[e("div",{class:y(["folder-cover",Ge(s.name).length?"has-preview":"empty"])},[Ge(s.name).length?(n(true),o(f,{key:0},$(Ge(s.name),v=>(n(),o("img",{key:v,src:v,class:"folder-cover-img",loading:"lazy",alt:`${s.name} 预览图`},null,8,As))),128)):(n(),o("div",Vs,[...t[52]||(t[52]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("path",{d:"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"})],-1)])])),(a=$t(s.name))!=null&&a.loading?(n(),o("span",Ns,"同步中")):d("v-if",true)],2),e("div",Ps,[e("div",Rs,[e("div",{class:"folder-name",title:s.description||s.name},i(s.name),9,Ts),e("button",{class:"folder-more-btn",title:"更多操作",onClick:E(v=>qt(s.name),["stop"])},[...t[53]||(t[53]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("circle",{cx:"5",cy:"12",r:"1"}),e("circle",{cx:"12",cy:"12",r:"1"}),e("circle",{cx:"19",cy:"12",r:"1"})],-1)])],8,Ds),W.value===s.name?(n(),o("div",{key:0,class:"folder-action-menu",onClick:t[6]||(t[6]=E(()=>{},["stop"]))},[e("button",{onClick:v=>vt(s)},"打开详情",8,Fs),e("button",{class:"danger",onClick:v=>dt(s.name)},"删除表情包",8,zs)])):d("v-if",true)]),e("div",Os,i(s.totalCount)+" 张图片",1),e("div",Hs,[e("span",Ws,[t[54]||(t[54]=e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("path",{d:"M3 7a2 2 0 0 1 2-2h5l2 3h7a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"})],-1)),S(" 本地 "+i(s.localCount)+" · 外链 "+i(s.linkCount),1)])])])],8,Bs)}),128))])):(n(),o("div",Ss,[...t[51]||(t[51]=[e("div",{class:"empty-icon"},"🔎",-1),e("h3",null,"没有匹配的表情包合集",-1),e("p",null,"换个关键词或筛选条件再试试。",-1)])])):(n(),o("div",Ls,[...t[50]||(t[50]=[e("div",{class:"empty-icon"},"📁",-1),e("h3",null,"尚未创建任何表情包",-1),e("p",null,"点击右上角按钮即可快速创建一个新的表情包合集。",-1)])]))]))])):k.value==="distribution"?(n(),o(f,{key:1},[d(" MENU VIEW 2: DISTRIBUTION (🌐) "),e("div",Zl,[e("div",{class:"notion-db-header page-section-header"},[t[87]||(t[87]=e("div",null,[e("h1",{class:"notion-main-title"},"分发管理"),e("p",{class:"section-desc compact"},"管理统一重定向端点与外部目标地址")],-1)),e("button",{onClick:Ut,class:"btn btn-primary btn-notion"}," + 新建端点 ")]),t[102]||(t[102]=e("hr",{class:"notion-hr"},null,-1)),e("div",ql,[d(" Endpoint Editor Form Panel "),w(e("div",Kl,[e("div",Ql,[e("h2",Jl,i(N.value?"编辑分发端点":"创建新分发端点"),1),e("button",{onClick:ct,class:"icon-btn hover-bg",title:"收起编辑器"},[...t[88]||(t[88]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e("line",{x1:"6",y1:"6",x2:"18",y2:"18"})],-1)])])]),e("div",Yl,[e("div",Xl,[t[89]||(t[89]=e("label",null,"端点名称 *",-1)),w(e("input",{"onUpdate:modelValue":t[27]||(t[27]=s=>m.name=s),disabled:!!N.value,class:"flat-input",placeholder:"例如: moe"},null,8,ea),[[H,m.name]]),t[90]||(t[90]=e("span",{class:"field-hint"},"只能包含字母、数字、下划线和连字符",-1))]),e("div",ta,[t[91]||(t[91]=e("label",null,"描述",-1)),w(e("input",{"onUpdate:modelValue":t[28]||(t[28]=s=>m.description=s),class:"flat-input",placeholder:"例如: 萌版横图"},null,512),[[H,m.description]])]),e("div",sa,[t[92]||(t[92]=e("label",null,"目标 URL *",-1)),w(e("input",{"onUpdate:modelValue":t[29]||(t[29]=s=>m.url=s),class:"flat-input",placeholder:"https://example.com/api"},null,512),[[H,m.url]])]),e("div",la,[t[93]||(t[93]=e("span",null,"访问预览",-1)),e("code",{onClick:t[30]||(t[30]=s=>Z(tt.value))},i(tt.value||"填写端点名称后生成预览"),1)]),e("div",aa,[e("button",{onClick:At,class:"btn btn-primary flex-grow"},i(N.value?"保存修改":"立即创建"),1),e("button",{onClick:ct,class:"btn btn-secondary"}," 取消 ")])])],512),[[Be,ie.value]]),d(" Endpoints Table List "),e("div",na,[e("div",oa,[t[94]||(t[94]=e("h2",{class:"notion-panel-title"},"端点列表",-1)),e("span",ia,i(J.value.length)+" 条路由",1)]),e("div",ra,[e("table",ua,[t[101]||(t[101]=e("thead",null,[e("tr",null,[e("th",{style:{width:"18%"}},"名称"),e("th",{style:{width:"20%"}},"描述"),e("th",{style:{width:"17%"}},"方式"),e("th",{style:{width:"35%"}},"访问路径 & 转发目标"),e("th",{style:{width:"10%","text-align":"right"}},"管理")])],-1)),e("tbody",null,[J.value.length?d("v-if",true):(n(),o("tr",ca,[...t[95]||(t[95]=[e("td",{colspan:"5",class:"empty-cell"},"尚未配置任何转发 API 端点",-1)])])),(n(true),o(f,null,$(J.value,s=>(n(),o("tr",{key:s.name},[e("td",null,[e("div",da,i(s.name),1)]),e("td",{class:"cell-desc",title:s.description},i(s.description||"-"),9,va),t[100]||(t[100]=e("td",null,[e("span",{class:"method-tag redirect"},"重定向"),e("div",{class:"target-url"},"302 重定向")],-1)),e("td",pa,[e("div",ga,[e("span",{class:"link-text",onClick:a=>Z(j(s.name))}," /"+i(s.name),9,fa),e("button",{onClick:a=>Z(j(s.name)),class:"icon-btn-inline",title:"复制完整链接"},[...t[96]||(t[96]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("rect",{x:"9",y:"9",width:"13",height:"13",rx:"2",ry:"2"}),e("path",{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"})],-1)])],8,ma)]),e("div",{class:"target-url truncate",title:s.url}," → "+i(s.url),9,ha)]),e("td",ba,[e("div",ya,[e("a",{href:j(s.name),target:"_blank",class:"icon-btn hover-bg",title:"测试该端点访问"},[...t[97]||(t[97]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"}),e("polyline",{points:"15 3 21 3 21 9"}),e("line",{x1:"10",y1:"14",x2:"21",y2:"3"})],-1)])],8,wa),e("button",{onClick:a=>Bt(s),class:"icon-btn hover-bg",title:"编辑参数"},[...t[98]||(t[98]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("path",{d:"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"}),e("path",{d:"M18.5 2.5a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4 9.5-9.5z"})],-1)])],8,ka),e("button",{onClick:a=>Vt(s.name),class:"icon-btn hover-danger",title:"彻底删除"},[...t[99]||(t[99]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("polyline",{points:"3 6 5 6 21 6"}),e("path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"})],-1)])],8,Ca)])])]))),128))])])])])])])],2112)):k.value==="staging"?(n(),o(f,{key:2},[d(" MENU VIEW 3: STAGING (暂缓区) "),e("div",_a,[e("div",xa,[t[103]||(t[103]=e("div",null,[e("h1",{class:"notion-main-title"},"暂缓区"),e("p",{class:"section-desc compact"},"复核被上传过滤器拦截或自动收集的候选图片,再手动归档到表情包分组")],-1)),e("div",Ia,[e("button",{onClick:Lt,class:y(["btn",z.value==="similar"?"btn-primary":"btn-secondary","btn-notion"]),disabled:Y.value||F.value.length<2},i(Y.value?"筛选中...":z.value==="similar"?"显示全部":"筛选相似图片"),11,$a),e("button",{onClick:me,class:"btn btn-secondary btn-notion"}," 刷新列表 ")])]),e("div",Ma,[e("div",Ea,[t[104]||(t[104]=e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("circle",{cx:"11",cy:"11",r:"8"}),e("path",{d:"m21 21-4.3-4.3"})],-1)),w(e("input",{"onUpdate:modelValue":t[31]||(t[31]=s=>Ae.value=s),placeholder:"搜索文件名、来源或原因"},null,512),[[H,Ae.value]])]),e("div",La,i(z.value==="similar"?Ct.value.length:Ce.value.length)+" / "+i(F.value.length)+" 张候选 ",1)]),F.value.length?z.value==="similar"?(n(),o("div",Ua,[Y.value?(n(),o("div",Ba,"正在筛选相似图片...")):be.value?(n(),o("div",Aa,i(be.value),1)):d("v-if",true),!Y.value&&!Fe.value.length?(n(),o("div",Va," 暂缓区没有匹配当前条件的相似图片 ")):d("v-if",true),(n(true),o(f,null,$(Fe.value,s=>(n(),o("section",{key:s.id,class:"similar-group"},[e("div",Na,[e("div",null,[e("h3",null,"相似组 "+i(s.label),1),e("p",null,i(s.items.length)+" 张候选,最高相似度 "+i(xt(s.similarity)),1)])]),e("div",Pa,[(n(true),o(f,null,$(s.items,a=>(n(),o("article",{key:a.id,class:"staging-card"},[e("button",{class:"staging-image-shell",onClick:v=>je(xe(a.id)),title:"打开原图"},[e("img",{class:"staging-image",src:xe(a.id),alt:a.originalName||a.filename,loading:"lazy"},null,8,Ta)],8,Ra),e("div",Da,[e("div",Fa,[e("div",{class:"staging-title",title:a.originalName||a.filename},i(a.originalName||a.filename),9,za),e("span",Oa,i($e(a.filename)),1)]),e("div",Ha,[e("span",{title:a.reason||"暂缓候选"},i(a.reason||"暂缓候选"),9,Wa),e("span",null,i(a.source||"filter"),1),e("span",null,i(at(a.size)),1),e("span",null,i(Ie(a.createdAt)),1)]),w(e("select",{"onUpdate:modelValue":v=>V.value[a.id]=v,class:"flat-select staging-select",disabled:!C.value.length},[t[106]||(t[106]=e("option",{value:""},"选择目标表情包",-1)),(n(true),o(f,null,$(C.value,v=>(n(),o("option",{key:v.name,value:v.name},i(v.name),9,ja))),128))],8,Ga),[[ne,V.value[a.id]]]),e("div",Za,[e("button",{onClick:v=>rt(a),class:"btn btn-primary staging-action-btn",disabled:U.value===a.id||!V.value[a.id]},i(U.value===a.id?"处理中...":"归档到表情包"),9,qa),e("button",{onClick:v=>ut(a),class:"btn btn-danger staging-action-btn",disabled:U.value===a.id}," 删除 ",8,Ka)])])]))),128))])]))),128))])):Ce.value.length?(n(),o("div",Ja,[(n(true),o(f,null,$(Ce.value,s=>(n(),o("article",{key:s.id,class:"staging-card"},[e("button",{class:"staging-image-shell",onClick:a=>je(xe(s.id)),title:"打开原图"},[e("img",{class:"staging-image",src:xe(s.id),alt:s.originalName||s.filename,loading:"lazy"},null,8,Xa)],8,Ya),e("div",en,[e("div",tn,[e("div",{class:"staging-title",title:s.originalName||s.filename},i(s.originalName||s.filename),9,sn),e("span",ln,i($e(s.filename)),1)]),e("div",an,[e("span",{title:s.reason||"暂缓候选"},i(s.reason||"暂缓候选"),9,nn),e("span",null,i(s.source||"filter"),1),e("span",null,i(at(s.size)),1),e("span",null,i(Ie(s.createdAt)),1)]),w(e("select",{"onUpdate:modelValue":a=>V.value[s.id]=a,class:"flat-select staging-select",disabled:!C.value.length},[t[107]||(t[107]=e("option",{value:""},"选择目标表情包",-1)),(n(true),o(f,null,$(C.value,a=>(n(),o("option",{key:a.name,value:a.name},i(a.name),9,rn))),128))],8,on),[[ne,V.value[s.id]]]),e("div",un,[e("button",{onClick:a=>rt(s),class:"btn btn-primary staging-action-btn",disabled:U.value===s.id||!V.value[s.id]},i(U.value===s.id?"处理中...":"归档到表情包"),9,cn),e("button",{onClick:a=>ut(s),class:"btn btn-danger staging-action-btn",disabled:U.value===s.id}," 删除 ",8,dn)])])]))),128))])):(n(),o("div",Qa," 没有匹配当前搜索条件的暂缓图片 ")):(n(),o("div",Sa,[...t[105]||(t[105]=[e("div",{class:"empty-icon"},"🕓",-1),e("h3",null,"暂缓区为空",-1),e("p",null,"上传时被过滤器拦截或自动收集命中的候选图片会先保存在这里,等待人工复核。",-1)])]))])],2112)):k.value==="settings"?(n(),o(f,{key:3},[d(" MENU VIEW 4: PREVIEW (👁️ 预览) "),e("div",vn,[e("div",pn,[e("div",{class:"notion-db-header page-section-header preview-page-header"},[t[108]||(t[108]=e("div",null,[e("h1",{class:"notion-main-title"},"预览"),e("p",{class:"section-desc compact"},"实时预览路由与最终提示词效果")],-1)),e("button",{onClick:ot,class:"btn btn-secondary btn-notion"}," 刷新预览 ")]),e("div",gn,[e("section",fn,[e("div",mn,[t[109]||(t[109]=e("div",null,[e("div",{class:"preview-card-title"},"路由清单"),e("div",{class:"preview-card-desc"},"{endpoint} 中可供 ChatLuna 使用的合集与端点")],-1)),e("button",{onClick:t[32]||(t[32]=s=>Z(ze.value)),class:"preview-action-btn",disabled:!ze.value,title:"复制路由清单"}," 复制清单 ",8,hn)]),st.value.length?(n(),o("div",bn,[e("table",yn,[t[111]||(t[111]=e("thead",null,[e("tr",null,[e("th",null,"预览"),e("th",null,"包名"),e("th",null,"描述"),e("th",null,"路径"),e("th",null,"操作")])],-1)),e("tbody",null,[(n(true),o(f,null,$(st.value,s=>(n(),o("tr",{key:s.id},[e("td",null,[s.previewImages.length?(n(),o("div",{key:0,class:y(["preview-mini-cover",s.previewImages.length===1?"single":""])},[(n(true),o(f,null,$(s.previewImages,a=>(n(),o("img",{key:a,src:a,alt:`${s.name} 预览`,loading:"lazy",onError:v=>_t(s)},null,40,wn))),128))],2)):(n(),o("div",{key:1,class:y(["preview-route-icon",s.type])},i(s.type==="collection"?"包":"API"),3))]),e("td",null,[e("div",kn,i(s.name),1),e("span",{class:y(["preview-route-type",s.type])},i(s.typeLabel),3)]),e("td",null,[e("div",{class:"preview-route-desc",title:s.description},i(s.description),9,Cn)]),e("td",null,[e("code",{class:"preview-route-path",title:s.fullUrl,onClick:a=>Z(s.fullUrl)},i(s.path),9,_n)]),e("td",null,[e("div",xn,[e("a",{href:s.fullUrl,target:"_blank",class:"icon-btn hover-bg",title:"打开预览"},[...t[110]||(t[110]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"}),e("polyline",{points:"15 3 21 3 21 9"}),e("line",{x1:"10",y1:"14",x2:"21",y2:"3"})],-1)])],8,In)])])]))),128))])])])):(n(),o("div",$n," 暂无可用表情包及路由,请前往表情包管理或分发管理中创建。 "))]),e("section",Mn,[e("div",En,[t[112]||(t[112]=e("div",null,[e("div",{class:"preview-card-title"},"最终提示词"),e("div",{class:"preview-card-desc"},"{memesluna} 注入给 LLM 的完整文本")],-1)),e("button",{onClick:t[33]||(t[33]=s=>Z(ge.value)),class:"preview-action-btn",disabled:!ge.value,title:"复制最终提示词"}," 复制提示词 ",8,Ln)]),e("div",Sn,[ge.value?(n(),o("pre",Un,i(ge.value),1)):(n(),o("pre",Bn,"- 正在获取最终提示词预览... -"))])])])])])],2112)):d("v-if",true)])],2112))])]))}}),Vn=(oe,k)=>{const p=oe.__vccOpts||oe;for(const[D,Q]of k)p[D]=Q;return p},Nn=Vn(An,[["__scopeId","data-v-cbb0f9f4"]]),Pn="M1024 512C1024 229.230208 794.769792 0 512 0 229.230208 0 0 229.230208 0 512 0 794.769792 229.230208 1024 512 1024 629.410831 1024 740.826187 984.331046 830.768465 912.686662 841.557579 904.092491 843.33693 888.379234 834.742758 877.590121 826.148587 866.801009 810.43533 865.021658 799.646219 873.615827 718.470035 938.277495 618.001779 974.048781 512 974.048781 256.817504 974.048781 49.951219 767.182496 49.951219 512 49.951219 256.817504 256.817504 49.951219 512 49.951219 767.182496 49.951219 974.048781 256.817504 974.048781 512 974.048781 599.492834 949.714859 683.336764 904.470807 755.960693 897.177109 767.668243 900.755245 783.071797 912.462793 790.365493 924.170342 797.659191 939.573897 794.081058 946.867595 782.373508 997.013826 701.880796 1024 608.898379 1024 512ZM337.170731 499.512194C371.654852 499.512194 399.609756 471.557291 399.609756 437.073171 399.609756 402.58905 371.654852 374.634146 337.170731 374.634146 302.686611 374.634146 274.731708 402.58905 274.731708 437.073171 274.731708 471.557291 302.686611 499.512194 337.170731 499.512194ZM711.804879 499.512194C746.288998 499.512194 774.243902 471.557291 774.243902 437.073171 774.243902 402.58905 746.288998 374.634146 711.804879 374.634146 677.320757 374.634146 649.365854 402.58905 649.365854 437.073171 649.365854 471.557291 677.320757 499.512194 711.804879 499.512194ZM352.788105 768.770967C396.165222 803.472661 453.151987 824.195121 524.487806 824.195121 595.823622 824.195121 652.810387 803.472661 696.187505 768.770967 722.700531 747.560546 738.882517 725.984565 746.631548 710.486505 752.800254 698.149092 747.799529 683.146916 735.462114 676.978208 723.124702 670.809502 708.122526 675.810227 701.953818 688.147642 701.03616 689.982957 698.492224 694.172969 694.165854 699.941463 686.602473 710.025971 676.927317 720.210345 664.983226 729.765617 630.311565 757.502948 584.273939 774.243902 524.487806 774.243902 464.70167 774.243902 418.664045 757.502948 383.992384 729.765617 372.048292 720.210345 362.373137 710.025971 354.809756 699.941463 350.483386 694.172969 347.93945 689.982957 347.021792 688.147642 340.853084 675.810227 325.850908 670.809502 313.513495 676.978208 301.176081 683.146916 296.175356 698.149092 302.344062 710.486505 310.093092 725.984565 326.275078 747.560546 352.788105 768.770967Z",Rn={name:"MemesLunaIcon",render(){return ht("svg",{class:"k-icon",viewBox:"0 0 1024 1024",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},[ht("path",{fill:"currentColor",d:Pn})])}};Qt.register("MemesLunaEmoji",Rn);const Fn=oe=>{oe.page({name:"MemesLuna",path:"/memesluna",icon:"MemesLunaEmoji",component:Nn,authority:1,order:500})};export{Fn as default};
|
|
1
|
+
import{send as m,icons as ns}from"@koishijs/client";import{defineComponent as os,ref as u,reactive as Ae,computed as k,onMounted as is,onUnmounted as rs,watch as Je,openBlock as n,createElementBlock as o,createCommentVNode as d,createElementVNode as t,Fragment as h,toDisplayString as i,normalizeClass as b,createVNode as cs,Transition as us,withCtx as ds,withDirectives as w,vModelText as W,vModelSelect as re,createTextVNode as U,renderList as $,withModifiers as S,createStaticVNode as Be,withKeys as vs,vShow as Pe,h as kt}from"vue";const ps={class:"memesluna-app-layout"},gs={class:"notion-content"},fs={class:"content-breadcrumb-header"},ms={class:"breadcrumbs"},hs={key:0,class:"crumb-parent"},ys={key:1,class:"crumb-parent"},bs={key:2,class:"crumb-parent"},ws={key:3,class:"crumb-parent"},ks={class:"crumb-child active"},Cs={key:0,class:"header-quick-stats"},_s={class:"stat-bubble"},xs={class:"stat-bubble"},Is={class:"stat-bubble"},$s={key:0,class:"notion-view-switcher"},Ss={key:0,class:"toast-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},Es={key:1,class:"toast-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},Ms={key:2,class:"toast-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},Ls={key:1,class:"loading-container"},Us={class:"content-body-wrapper"},As={key:0,class:"resources-router-view"},Bs={key:0,class:"collections-folder-view"},Ps={class:"notion-db-header page-section-header collection-list-header"},Vs={class:"notion-db-actions collection-toolbar"},Ns={class:"collection-search-shell"},Rs={class:"collection-filter-shell"},Ts={key:0,class:"empty-placeholder-card"},Ds={key:1,class:"empty-placeholder-card"},Fs={key:2,class:"folders-grid"},zs=["onClick"],Os=["src","alt"],Hs={key:1,class:"folder-cover-empty"},Ws={key:2,class:"folder-cover-badge"},Gs={class:"folder-body"},js={class:"folder-title-row"},Zs=["title"],qs=["onClick"],Ks=["onClick"],Qs=["onClick"],Js={class:"folder-info-row"},Ys={class:"folder-count"},Xs={class:"folder-meta-row"},el={class:"folder-meta-item"},tl={class:"asset-detail-shell"},sl={class:"detail-topbar"},ll={class:"detail-breadcrumbs"},al={class:"detail-crumb-current"},nl={class:"detail-top-actions"},ol={class:"asset-hero-panel"},il={class:"asset-identity-card"},rl={class:"asset-avatar-frame"},cl=["src","alt"],ul={key:1,class:"asset-avatar-empty"},dl={class:"asset-title-stack"},vl={class:"asset-title-row"},pl={class:"asset-meta-line"},gl={class:"asset-api-card"},fl={class:"asset-api-row"},ml=["disabled"],hl={key:0,class:"api-preview-strip"},yl=["src"],bl={class:"asset-import-panel"},wl={class:"asset-import-header"},kl={class:"asset-import-actions"},Cl={class:"asset-gallery-section"},_l={class:"asset-gallery-toolbar"},xl={class:"asset-tabs"},Il={class:"asset-filter-bar"},$l={class:"asset-search-box"},Sl={class:"asset-view-toggle"},El={class:"gallery-tab-content"},Ml={key:0,class:"empty-gallery"},Ll={key:1,class:"empty-gallery"},Ul={key:2},Al={key:0,class:"gallery-bulk-toolbar floating"},Bl={class:"bulk-status"},Pl={class:"bulk-meta"},Vl={class:"bulk-actions"},Nl={key:1,class:"bulk-move-group"},Rl=["value","disabled"],Tl=["disabled"],Dl=["onClick","title"],Fl={key:0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2.5"},zl=["onClick","title"],Ol=["src"],Hl={class:"gallery-list-meta"},Wl={class:"gallery-card-overlay"},Gl={key:0,class:"overlay-actions"},jl=["onClick"],Zl={class:"move-dropdown-menu"},ql=["onClick"],Kl=["onClick"],Ql={key:1,class:"overlay-actions"},Jl=["onClick"],Yl=["onClick"],Xl={key:1,class:"pagination-container"},ea=["disabled"],ta={class:"page-indicator"},sa=["disabled"],la={class:"distribution-router-view"},aa={class:"endpoint-layout"},na={class:"notion-form-panel endpoint-editor-panel"},oa={class:"panel-title-row"},ia={class:"notion-panel-title"},ra={class:"form-fields endpoint-form-grid"},ca={class:"form-group"},ua=["disabled"],da={class:"form-group"},va={class:"form-group span-2"},pa={class:"endpoint-preview span-2"},ga={class:"form-actions span-2"},fa={class:"notion-table-panel"},ma={class:"table-title-row"},ha={class:"table-count"},ya={class:"table-container"},ba={class:"flat-table"},wa={key:0},ka={class:"endpoint-name"},Ca=["title"],_a={class:"font-mono"},xa={class:"url-line"},Ia=["onClick"],$a=["onClick"],Sa=["title"],Ea={style:{"text-align":"right"}},Ma={class:"action-buttons"},La=["href"],Ua=["onClick"],Aa=["onClick"],Ba={class:"staging-router-view"},Pa={class:"notion-db-header page-section-header staging-page-header"},Va={class:"staging-header-actions"},Na=["disabled"],Ra={class:"staging-toolbar"},Ta={class:"asset-search-box staging-search-box"},Da={class:"staging-count-pill"},Fa={key:0,class:"empty-placeholder-card staging-empty-card"},za={key:1,class:"similar-staging-view"},Oa={key:0,class:"empty-gallery"},Ha={key:1,class:"similar-message"},Wa={key:2,class:"empty-gallery"},Ga={class:"similar-group-header"},ja={class:"staging-grid"},Za=["onClick"],qa=["src","alt"],Ka={class:"staging-card-body"},Qa={class:"staging-title-row"},Ja=["title"],Ya={class:"staging-ext-tag"},Xa={class:"staging-meta-grid"},en=["title"],tn=["onUpdate:modelValue","disabled"],sn=["value"],ln={class:"staging-actions"},an=["onClick","disabled"],nn=["onClick","disabled"],on={key:2,class:"empty-gallery"},rn={key:3},cn={key:0,class:"staging-batch-toolbar"},un={class:"bulk-status"},dn={class:"bulk-meta"},vn={class:"bulk-actions"},pn={class:"staging-grid"},gn=["onClick","title"],fn={key:0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2.5"},mn=["onClick"],hn=["src","alt"],yn={class:"staging-card-body"},bn={class:"staging-title-row"},wn=["title"],kn={class:"staging-ext-tag"},Cn={class:"staging-meta-grid"},_n=["title"],xn=["onUpdate:modelValue","disabled"],In=["value"],$n={class:"staging-actions"},Sn=["onClick","disabled"],En=["onClick","disabled"],Mn={class:"settings-router-view"},Ln={class:"settings-preview-panel"},Un={class:"preview-dashboard-grid"},An={class:"preview-card route-table-card"},Bn={class:"preview-card-header"},Pn=["disabled"],Vn={key:0,class:"preview-table-wrap"},Nn={class:"preview-route-table"},Rn=["src","alt","onError"],Tn={class:"preview-route-name"},Dn=["title"],Fn=["title","onClick"],zn={class:"preview-row-actions"},On=["href"],Hn={key:1,class:"preview-empty-state"},Wn={class:"preview-card prompt-card"},Gn={class:"preview-card-header"},jn=["disabled"],Zn={class:"preview-code-block final-prompt polished"},qn={key:0},Kn={key:1,class:"text-gray-muted"},Qn=os({__name:"Dashboard",setup(ce){const C=u("resources"),p=u(true),z=u("/memesluna"),X=u("http://localhost:5140"),ee=u([]),_=u([]),M=u([]),Ve=u(""),N=u({}),A=u(""),O=u("all"),Ne=u([]),te=u(false),we=u(""),B=u(new Set),ue=u(false),R=u(null),y=Ae({name:"",group:"",description:"",url:""}),Re=u(new Set),Ye=u(""),c=u(null),ke=u(""),se=u("all"),G=u(null),Ce=u(""),de=u(""),x=Ae({images:[],links:[]}),T=Ae({}),H=u("all"),ve=u(false),P=u(new Set),le=u(""),pe=u(""),ge=u("name"),fe=u("all"),ae=u("grid"),L=u(""),_e=u(false),ne=u(null);function Ct(s){ne.value===s?ne.value=null:ne.value=s}function Te(s){return P.value.has(s)}function Xe(s){const e=new Set(P.value);e.has(s)?e.delete(s):e.add(s),P.value=e}function me(){P.value=new Set,le.value=""}function _t(){const s=new Set(P.value),e=ze.value.filter(l=>l.type==="local");et.value?e.forEach(l=>s.delete(l.value)):e.forEach(l=>s.add(l.value)),P.value=s}function xt(s){if(s.type==="local"&&E.value.length){Xe(s.value);return}Ke(s.src)}const I=u(1),De=u(24),It=k(()=>{if(!c.value)return[];const s=x.images.map(l=>({id:`local:${l}`,type:"local",label:l,src:Ze(c.value.name,l),value:l})),e=x.links.map(l=>({id:`external:${l}`,type:"external",label:Pt(l),src:l,value:l}));return H.value==="local"?s:H.value==="external"?e:[...s,...e]}),Fe=k(()=>{const s=pe.value.trim().toLowerCase();let e=It.value.filter(l=>s?l.label.toLowerCase().includes(s)||l.value.toLowerCase().includes(s):true);return fe.value==="selected"&&(e=e.filter(l=>l.type==="local"&&P.value.has(l.value))),[...e].sort((l,a)=>ge.value==="nameDesc"?a.label.localeCompare(l.label):l.label.localeCompare(a.label))}),oe=k(()=>Math.max(1,Math.ceil(Fe.value.length/De.value))),ze=k(()=>{const s=(I.value-1)*De.value;return Fe.value.slice(s,s+De.value)}),E=k(()=>Array.from(P.value)),et=k(()=>{const s=ze.value.filter(e=>e.type==="local");return s.length>0&&s.every(e=>P.value.has(e.value))}),tt=k(()=>{if(!c.value)return"";const s=x.images[0];return s?Ze(c.value.name,s):x.links[0]||""}),st=k(()=>c.value?q(c.value.name):""),lt=k(()=>{var s;return((s=c.value)==null?void 0:s.totalCount)||x.images.length+x.links.length}),at=k(()=>{const s=y.name.trim();return s?q(s):""}),nt=k(()=>{const s=_.value.filter(l=>l.hasContent).map(l=>({id:`collection:${l.name}`,type:"collection",typeLabel:"表情包",name:l.name,description:l.description||`${l.name} 表情包`,path:`${z.value}/${l.name}`,fullUrl:q(l.name),previewImages:ct(l.name).slice(0,3)})),e=ee.value.map(l=>{const a=q(l.name),v=Re.value.has(`endpoint:${l.name}`)?[]:[a];return{id:`endpoint:${l.name}`,type:"endpoint",typeLabel:"重定向",name:l.name,description:l.description||"302 重定向",path:`${z.value}/${l.name}`,fullUrl:a,previewImages:v}});return[...s,...e]}),ot=k(()=>{const s=ke.value.trim().toLowerCase();return _.value.filter(e=>{const l=!s||e.name.toLowerCase().includes(s)||(e.description||"").toLowerCase().includes(s),a=se.value==="all"||se.value==="local"&&e.localCount>0&&e.linkCount===0||se.value==="external"&&e.linkCount>0;return l&&a})}),j=k(()=>{const s=Ve.value.trim().toLowerCase();return s?M.value.filter(e=>e.filename.toLowerCase().includes(s)||e.originalName.toLowerCase().includes(s)||e.source.toLowerCase().includes(s)||e.reason.toLowerCase().includes(s)):M.value}),Oe=k(()=>{const s=new Set(j.value.map(e=>e.id));return Ne.value.map((e,l)=>({...e,label:String(l+1),items:e.items.filter(a=>s.has(a.id))})).filter(e=>e.items.length>1)}),$t=k(()=>{const s=new Map;for(const e of Oe.value)for(const l of e.items)s.set(l.id,l);return Array.from(s.values())}),St=k(()=>Array.from(B.value)),it=k(()=>{const s=j.value;return s.length>0&&s.every(e=>B.value.has(e.id))});function He(s){return B.value.has(s)}function Et(s){const e=new Set(B.value);e.has(s)?e.delete(s):e.add(s),B.value=e}function Mt(){const s=new Set(B.value);it.value?j.value.forEach(e=>s.delete(e.id)):j.value.forEach(e=>s.add(e.id)),B.value=s}function xe(){B.value=new Set}async function Lt(){const s=St.value;if(s.length&&confirm(`确认永久删除已选择的 ${s.length} 张暂缓图片吗?此操作无法恢复!`))try{p.value=true,await Promise.all(s.map(e=>m("memesluna/deleteStagedImage",e))),r(`已删除 ${s.length} 张暂缓图片`,"success"),xe(),await K(),await g()}catch(e){r(e instanceof Error?e.message:"批量删除暂缓图片失败","error")}finally{p.value=false}}async function Ut(){if(M.value.length&&confirm(`⚠️ 危险操作:确认永久删除暂缓区全部 ${M.value.length} 张图片吗?此操作不可逆!`))try{p.value=true;const s=await m("memesluna/deleteAllStagedImages");r(`已清空暂缓区,共删除 ${s} 张图片`,"success"),xe(),await K(),await g()}catch(s){r(s instanceof Error?s.message:"清空暂缓区失败","error")}finally{p.value=false}}const We=u(""),he=u(""),ye=u(false),Ge=u(null),D=Ae({show:false,message:"",type:"info"});let je=null;function r(s,e="info"){je&&clearTimeout(je),D.message=s,D.type=e,D.show=true,je=setTimeout(()=>{D.show=false},2500)}function Ie(s){C.value=s,s==="settings"&&ut(),s==="staging"?K():xe()}function Z(){const s=X.value.endsWith("/")?X.value.slice(0,-1):X.value,e=z.value.startsWith("/")?z.value:`/${z.value}`,l=e.endsWith("/")?e.slice(0,-1):e;return`${s}${l}`}function q(s){return`${Z()}/${s}`}function Ze(s,e){return`${Z()}/api/admin/collections/${encodeURIComponent(s)}/images/${encodeURIComponent(e)}`}function $e(s){return`${Z()}/api/admin/staged-images/${encodeURIComponent(s)}`}function At(s){if(s.type!=="endpoint")return;const e=new Set(Re.value);e.add(s.id),Re.value=e}function Se(s){if(!s)return"-";const e=new Date(s);return Number.isNaN(e.getTime())?"-":e.toLocaleDateString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit"})}function Bt(s){return Number.isFinite(s)?String(Math.round(s*100))+"%":"-"}function rt(s){if(!Number.isFinite(s)||s<=0)return"-";const e=["B","KB","MB","GB"];let l=s,a=0;for(;l>=1024&&a<e.length-1;)l/=1024,a++;return`${l>=10||a===0?l.toFixed(0):l.toFixed(1)} ${e[a]}`}function Ee(s){const e=s.split(".").pop();return e?e.toUpperCase():"IMG"}function Pt(s){try{const e=new URL(s);return decodeURIComponent(e.pathname.split("/").filter(Boolean).pop()||e.hostname)||e.hostname}catch{return s}}function Vt(s){return T[s]}function ct(s){var e;return((e=T[s])==null?void 0:e.images)||[]}function qe(s){return ct(s).slice(0,6)}async function Nt(s){var e;if(!(!s.hasContent||(e=T[s.name])!=null&&e.images.length)){T[s.name]=T[s.name]||{loading:true,images:[]},T[s.name].loading=true;try{const l=await fetch(`${Z()}/api/collections/${encodeURIComponent(s.name)}/resources`);if(!l.ok)return;const a=await l.json(),v=9,J=Array.isArray(a.images)?a.images.slice(0,v).map(Le=>Ze(s.name,Le)):[],be=Array.isArray(a.links)?a.links.slice(0,v-J.length):[];T[s.name].images=[...J,...be]}catch{T[s.name].images=[]}finally{T[s.name].loading=false}}}function Rt(){_.value.filter(s=>s.hasContent).slice(0,24).forEach(s=>{Nt(s)})}async function g(){try{X.value=window.location.origin;const s=await m("memesluna/getState");s&&(s.backendPath&&(z.value=s.backendPath),ee.value=Array.isArray(s.endpoints)?s.endpoints:[],_.value=Array.isArray(s.collections)?s.collections:[],M.value=Array.isArray(s.stagedImages)?s.stagedImages:[],Rt())}catch(s){r(s instanceof Error?s.message:"获取插件状态同步失败","error")}}async function ut(){try{const s=await fetch(`${Z()}/api/homepage-data`);if(s.ok){const e=await s.json();We.value=e.routeInventory||"",he.value=e.llmPrompt||""}}catch(s){console.error("Failed to sync settings variables preview:",s)}}async function K(){try{const s=await m("memesluna/getStagedImages");M.value=Array.isArray(s)?s:[],O.value==="similar"&&await dt()}catch(s){r(s instanceof Error?s.message:"刷新暂缓区失败","error")}}async function dt(){te.value=true;try{const s=await m("memesluna/getSimilarStagedImages");Ne.value=Array.isArray(s==null?void 0:s.groups)?s.groups:[],we.value=(s==null?void 0:s.message)||"",s&&s.available===false&&r(s.message||"相似图片筛选不可用","error")}catch(s){Ne.value=[],we.value="",r(s instanceof Error?s.message:"筛选相似图片失败","error")}finally{te.value=false}}async function Tt(){if(O.value==="similar"){O.value="all";return}O.value="similar",await dt()}async function vt(s){var l;const e=N.value[s.id];if(!e){r("请选择目标表情包","error");return}A.value=s.id;try{const a=await m("memesluna/promoteStagedImage",s.id,e);a?(r(`已归档到表情包 "${e}",新文件名 ${a}`,"success"),delete N.value[s.id]):r("暂缓图片不存在或已被处理","error"),await K(),await g(),((l=c.value)==null?void 0:l.name)===e&&await V(e)}catch(a){r(a instanceof Error?a.message:"归档暂缓图片失败","error")}finally{A.value=""}}async function pt(s){if(confirm(`确认从暂缓区删除 "${s.originalName||s.filename}" 吗?`)){A.value=s.id;try{await m("memesluna/deleteStagedImage",s.id)?(r("已从暂缓区删除","success"),delete N.value[s.id]):r("暂缓图片不存在或已被处理","error"),await K(),await g()}catch(e){r(e instanceof Error?e.message:"删除暂缓图片失败","error")}finally{A.value=""}}}async function Dt(s){let e=0;for(const l of s)try{const a=await bt(l.file);await m("memesluna/addStagedImage",{base64:a,originalName:l.file.name,source:c.value?`upload:${c.value.name}`:"upload-filter",reason:l.reason}),e++}catch(a){console.error("Failed to stage filtered image:",l.file.name,a)}return e&&await K(),e}function Ft(){Me(),ue.value=true}function gt(){Me(),ue.value=false}function Me(){R.value=null,y.name="",y.group="",y.description="",y.url=""}function zt(s){R.value=s,ue.value=true,y.name=s.name||"",y.group=s.group||"",y.description=s.description||"",y.url=s.url||""}async function Ot(){const s=y.name.trim(),e=y.url.trim();if(!s||!e){r("端点名称和目标直链 URL 均必填","error");return}const l={name:s,group:y.group.trim()||"默认分组",description:y.description.trim(),url:e,method:"redirect"};try{p.value=true,R.value?(await m("memesluna/updateEndpoint",R.value.name,l),r("端点路由参数已成功更新","success")):(await m("memesluna/createEndpoint",l),r("接口端点已成功创建","success")),await g(),Me(),ue.value=false}catch(a){r(a instanceof Error?a.message:"保存端点失败","error")}finally{p.value=false}}async function Ht(s){if(confirm(`确认删除端点路由 "${s}" 吗?`))try{p.value=true,await m("memesluna/deleteEndpoint",s),r("该分发端点已彻底删除","success"),await g(),R.value&&R.value.name===s&&Me()}catch(e){r(e instanceof Error?e.message:"删除端点路由失败","error")}finally{p.value=false}}async function Q(s){try{await navigator.clipboard.writeText(s),r("成功复制链接到剪贴板","success")}catch{r("复制失败","error")}}async function Wt(){var e;let s=Ye.value.trim();if(s||(s=((e=window.prompt("请输入表情包名称"))==null?void 0:e.trim())||""),!s){r("表情包名称不能为空","error");return}try{if(p.value=true,!await m("memesluna/createCollection",s)){r("该名称的表情包已存在,请更换其他名称","error");return}r("表情包已成功创建","success"),Ye.value="",await g()}catch(l){r(l instanceof Error?l.message:"创建失败","error")}finally{p.value=false}}async function ft(s){if(G.value=null,!!confirm(`⚠️ 危险操作:确认永久且彻底删除表情包 "${s}",及其包含的所有本地图片文件吗?此项操作不可逆!`))try{p.value=true,await m("memesluna/deleteCollection",s),r("该表情包资源已彻底销毁删除","success"),c.value=null,await g()}catch(e){r(e instanceof Error?e.message:"删除失败","error")}finally{p.value=false}}async function mt(s){G.value=null,c.value=s,Ce.value=s.description||"",de.value="",pe.value="",ge.value="name",fe.value="all",ae.value="grid",L.value="",I.value=1,me(),await V(s.name)}function Gt(){c.value=null,L.value&&URL.revokeObjectURL(L.value),L.value="",me()}async function V(s){try{const e=await fetch(`${Z()}/api/collections/${encodeURIComponent(s)}/resources`);if(e.ok){const l=await e.json();x.images=Array.isArray(l.images)?l.images:[],x.links=Array.isArray(l.links)?l.links:[];const a=new Set(x.images);P.value=new Set(E.value.filter(v=>a.has(v)))}}catch{r("加载该表情包下的图片缓存失败","error")}}async function jt(){if(!c.value)return;p.value=true,await V(c.value.name),await g();const s=_.value.find(e=>e.name===c.value.name);s&&(c.value=s),p.value=false,r("本地及缓存资源数据已刷新成功","success")}async function Zt(){if(c.value){_e.value=true;try{const s=await fetch(st.value,{redirect:"follow"});if(!s.ok){r("测试接口未返回可用图片","error");return}const e=await s.blob();if(!e.type.startsWith("image/")){r("测试接口返回的不是图片资源","error");return}L.value&&URL.revokeObjectURL(L.value),L.value=URL.createObjectURL(e),r("已获取随机图片预览","success"),await g();const l=_.value.find(a=>{var v;return a.name===((v=c.value)==null?void 0:v.name)});l&&(c.value=l)}catch(s){r(s instanceof Error?s.message:"测试接口失败","error")}finally{_e.value=false}}}async function ht(){if(c.value)try{p.value=true,await m("memesluna/setCollectionDescription",c.value.name,Ce.value.trim()),r("表情包描述已成功保存","success"),await g();const s=_.value.find(e=>e.name===c.value.name);s&&(c.value=s)}catch(s){r(s instanceof Error?s.message:"保存表情包描述失败","error")}finally{p.value=false}}function qt(){Ge.value&&Ge.value.click()}function Kt(s){const e=s.target;e.files&&yt(e.files)}function Qt(s){ye.value=false,s.dataTransfer&&s.dataTransfer.files&&yt(s.dataTransfer.files)}async function yt(s){if(!c.value)return;const e=10*1024*1024,a=Array.from(s).filter(f=>{const Y=f.name.toLowerCase();return f.type.startsWith("image/")||/\.(jpe?g|png|gif|bmp|webp|svg|tiff?|psd|avif)$/.test(Y)});if(!a.length){r("请拖入或选择有效的图片格式文件","error");return}const v=a.filter(f=>f.name.toLowerCase().endsWith(".avif")),J=a.filter(f=>!f.name.toLowerCase().endsWith(".avif")),be=new Map;for(const f of J)f.size>e&&be.set(f,"文件大小超过 10MB,需人工复核后再决定是否归档");const Le=Array.from(be,([f,Y])=>({file:f,reason:Y})),Ue=J.filter(f=>!be.has(f));let ie=0;if(Le.length&&(ie=await Dt(Le)),!Ue.length){if(ie>0){const f=v.length?`,${v.length} 张 AVIF 已直接拦截`:"";r(`已将 ${ie} 张被过滤图片放入暂缓区${f}`,"success")}else v.length?r("已拦截 AVIF 图片。此格式不会进入暂缓区,请先转码为 JPG/PNG/GIF/WEBP。","error"):r("图片已被过滤,但写入暂缓区失败","error");await g();return}if(Ue.length>50){r("单次上传表情上限为 50 张,请分批次导入","error"),ie&&await g();return}r(`正在转码并上传 ${Ue.length} 张表情图片...`,"info");try{const f=[];for(const F of Ue){const Qe=await bt(F);f.push({base64:Qe,originalName:F.name})}const Y=await fetch(`${Z()}/api/admin/collections/${encodeURIComponent(c.value.name)}/images`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({images:f})});if(Y.ok){const F=await Y.json();if(F.ok&&F.uploaded&&F.uploaded.length>0){const Qe=ie?`,另有 ${ie} 张进入暂缓区`:"",as=v.length?`,${v.length} 张 AVIF 已直接拦截`:"";r(`成功将 ${F.uploaded.length} 张表情入库并完成数字重命名${Qe}${as}`,"success")}else r("上传图片写入失败","error")}else{const F=await Y.json().catch(()=>({}));r(F.error||"上传中继失败","error")}}catch(f){r(`上传网络错误: ${f instanceof Error?f.message:"错误"}`,"error")}finally{await V(c.value.name),await g()}}function bt(s){return new Promise((e,l)=>{const a=new FileReader;a.readAsDataURL(s),a.onload=()=>{const J=a.result.split(",")[1];e(J)},a.onerror=v=>l(v)})}async function Jt(){if(!c.value)return;const s=de.value.trim();if(!s){r("链接文本不能为空","error");return}try{p.value=true;const e=await m("memesluna/addLinks",c.value.name,s);r(`已成功录入 ${e} 条网络图片外链`,"success"),de.value="",await V(c.value.name),await g()}catch(e){r(e instanceof Error?e.message:"添加失败","error")}finally{p.value=false}}async function Yt(s,e){if(confirm("确认删除该图片网络外链直链吗?"))try{p.value=true,await m("memesluna/deleteLink",s,e),r("外链直链已彻底删除","success"),await V(s),await g()}catch(l){r(l instanceof Error?l.message:"删除链接失败","error")}finally{p.value=false}}async function Xt(s,e){if(confirm(`确认永久删除该本地图片素材 "${e}" 吗?此操作无法恢复!`))try{p.value=true,await m("memesluna/deleteLocalImage",s,e),r("该本地图片已永久删除","success"),await V(s),await g()}catch(l){r(l instanceof Error?l.message:"删除失败","error")}finally{p.value=false}}async function es(){if(!c.value||!E.value.length)return;const s=E.value;if(confirm(`确认永久删除已选择的 ${s.length} 张本地图片素材吗?此操作无法恢复!`))try{p.value=true,await Promise.all(s.map(e=>m("memesluna/deleteLocalImage",c.value.name,e))),r(`已删除 ${s.length} 张本地图片`,"success"),me(),await V(c.value.name),await g()}catch(e){r(e instanceof Error?e.message:"批量删除失败","error")}finally{p.value=false}}async function ts(s,e,l){try{p.value=true,await m("memesluna/moveLocalImage",s,e,l)?(r(`已将素材移动至表情包 "${e}" 并重命名`,"success"),await V(s),await g()):r("移动失败","error")}catch(a){r(a instanceof Error?a.message:"移库失败","error")}finally{p.value=false}}async function ss(){if(!c.value||!E.value.length||!le.value)return;const s=c.value.name,e=le.value;if(e===s){r("不能移动到当前表情包","error");return}const l=E.value;try{p.value=true,await Promise.all(l.map(a=>m("memesluna/moveLocalImage",s,e,a))),r(`已将 ${l.length} 张素材移动至表情包 "${e}"`,"success"),me(),await V(s),await g()}catch(a){r(a instanceof Error?a.message:"批量移动失败","error")}finally{p.value=false}}function Ke(s){window.open(s,"_blank")}function ls(s){G.value=G.value===s?null:s}const wt=()=>{ne.value=null,G.value=null};return is(async()=>{window.addEventListener("click",wt),p.value=true,await g(),p.value=false}),rs(()=>{window.removeEventListener("click",wt),L.value&&URL.revokeObjectURL(L.value)}),Je(x,()=>{I.value>oe.value&&oe.value>0&&(I.value=oe.value)}),Je([pe,ge,fe],()=>{I.value=1}),Je([ke,se],()=>{G.value=null}),(s,e)=>(n(),o("div",ps,[d(" MAIN CONTENT AREA "),t("main",gs,[d(" Top Notion Breadcrumbs "),t("header",fs,[t("div",ms,[e[35]||(e[35]=t("span",{class:"crumb-root"},"MemesLuna 控制台",-1)),e[36]||(e[36]=t("span",{class:"crumb-separator"},"/",-1)),C.value==="resources"?(n(),o("span",hs,"表情包管理")):C.value==="distribution"?(n(),o("span",ys,"分发管理")):C.value==="settings"?(n(),o("span",bs,"预览")):C.value==="staging"?(n(),o("span",ws,"暂缓区")):d("v-if",true),C.value==="resources"&&c.value?(n(),o(h,{key:4},[e[34]||(e[34]=t("span",{class:"crumb-separator"},"/",-1)),t("span",ks,"表情包: "+i(c.value.name),1)],64)):d("v-if",true)]),d(" Quick Stats Banner "),p.value?d("v-if",true):(n(),o("div",Cs,[t("span",_s,"📂 表情包总数: "+i(_.value.length),1),t("span",xs,"🌐 分发接口: "+i(ee.value.length),1),t("span",Is,"🕓 暂缓候选: "+i(M.value.length),1)]))]),d(" NOTION-STYLE HORIZONTAL VIEW SWITCHER "),c.value?d("v-if",true):(n(),o("div",$s,[t("button",{onClick:e[0]||(e[0]=l=>Ie("resources")),class:b(["switcher-btn",C.value==="resources"?"active":""])},[...e[37]||(e[37]=[t("span",{class:"switcher-icon"},"📦",-1),t("span",{class:"switcher-label"},"表情包管理",-1)])],2),t("button",{onClick:e[1]||(e[1]=l=>Ie("distribution")),class:b(["switcher-btn",C.value==="distribution"?"active":""])},[...e[38]||(e[38]=[t("span",{class:"switcher-icon"},"🌐",-1),t("span",{class:"switcher-label"},"分发管理",-1)])],2),t("button",{onClick:e[2]||(e[2]=l=>Ie("staging")),class:b(["switcher-btn",C.value==="staging"?"active":""])},[...e[39]||(e[39]=[t("span",{class:"switcher-icon"},"🕓",-1),t("span",{class:"switcher-label"},"暂缓区",-1)])],2),t("button",{onClick:e[3]||(e[3]=l=>Ie("settings")),class:b(["switcher-btn",C.value==="settings"?"active":""])},[...e[40]||(e[40]=[t("span",{class:"switcher-icon"},"👁️",-1),t("span",{class:"switcher-label"},"预览",-1)])],2)])),d(" Global Toast Alert Banner "),cs(us,{name:"fade"},{default:ds(()=>[D.show?(n(),o("div",{key:0,class:b(["toast-banner",D.type])},[D.type==="success"?(n(),o("svg",Ss,[...e[41]||(e[41]=[t("polyline",{points:"20 6 9 17 4 12"},null,-1)])])):D.type==="error"?(n(),o("svg",Es,[...e[42]||(e[42]=[t("circle",{cx:"12",cy:"12",r:"10"},null,-1),t("line",{x1:"12",y1:"8",x2:"12",y2:"12"},null,-1),t("line",{x1:"12",y1:"16",x2:"12.01",y2:"16"},null,-1)])])):(n(),o("svg",Ms,[...e[43]||(e[43]=[t("circle",{cx:"12",cy:"12",r:"10"},null,-1),t("line",{x1:"12",y1:"16",x2:"12",y2:"12"},null,-1),t("line",{x1:"12",y1:"8",x2:"12.01",y2:"8"},null,-1)])])),t("span",null,i(D.message),1)],2)):d("v-if",true)]),_:1}),d(" Loading Cover "),p.value?(n(),o("div",Ls,[...e[44]||(e[44]=[t("div",{class:"spinner"},null,-1),t("p",null,"正在同步数据...",-1)])])):(n(),o(h,{key:2},[d(" MAIN ROUTER BODY "),t("div",Us,[d(" MENU VIEW 1: RESOURCES (📦) "),C.value==="resources"?(n(),o("div",As,[d(" Collection Lists (Folder view) "),c.value?(n(),o(h,{key:1},[d(" Collection Details (Inside details view) "),t("div",{class:"collection-detail-layout",onDragover:e[26]||(e[26]=S(l=>ye.value=true,["prevent"]))},[t("div",tl,[t("div",sl,[t("div",ll,[t("button",{onClick:Gt,class:"detail-back-btn",title:"返回列表"},[...e[56]||(e[56]=[t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("path",{d:"m15 18-6-6 6-6"})],-1),U(" 返回列表 ",-1)])]),e[57]||(e[57]=t("span",{class:"detail-separator"},"/",-1)),t("span",al,i(c.value.name),1),e[58]||(e[58]=t("span",{class:"detail-separator"},"/",-1)),e[59]||(e[59]=t("span",{class:"detail-crumb-strong"},"图片素材",-1))]),t("div",nl,[t("button",{onClick:jt,class:"asset-btn secondary",title:"刷新缓存"},[...e[60]||(e[60]=[Be('<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" data-v-b8acd784><path d="M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16" data-v-b8acd784></path><path d="M3 21v-5h5" data-v-b8acd784></path><path d="M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8" data-v-b8acd784></path><path d="M16 8h5V3" data-v-b8acd784></path></svg> 刷新缓存 ',2)])]),t("button",{onClick:qt,class:"asset-btn primary"},[...e[61]||(e[61]=[t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}),t("path",{d:"m17 8-5-5-5 5"}),t("path",{d:"M12 3v12"})],-1),U(" 上传图片 ",-1)])]),t("button",{onClick:e[7]||(e[7]=l=>ve.value=!ve.value),class:"asset-btn secondary"},[...e[62]||(e[62]=[t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("path",{d:"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"}),t("path",{d:"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"})],-1),U(" 导入外链 ",-1)])]),t("button",{onClick:e[8]||(e[8]=l=>ft(c.value.name)),class:"asset-btn danger ghost",title:"删除表情包"},[...e[63]||(e[63]=[t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("path",{d:"M3 6h18"}),t("path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6"}),t("path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"})],-1)])]),t("input",{ref_key:"fileInput",ref:Ge,type:"file",multiple:"",accept:"image/*",class:"hidden-file-input",onChange:Kt},null,544)])]),t("section",ol,[t("div",il,[t("div",rl,[tt.value?(n(),o("img",{key:0,src:tt.value,class:"asset-avatar-img",alt:`${c.value.name} 封面`},null,8,cl)):(n(),o("div",ul,[...e[64]||(e[64]=[t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("path",{d:"M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"})],-1)])]))]),t("div",dl,[t("div",vl,[t("h1",null,i(c.value.name),1),e[65]||(e[65]=t("span",{class:"asset-pill"},"本地",-1))]),w(t("input",{"onUpdate:modelValue":e[9]||(e[9]=l=>Ce.value=l),class:"asset-description-input",placeholder:"添加表情包描述",onBlur:ht,onKeyup:vs(ht,["enter"])},null,544),[[W,Ce.value]]),t("div",pl,[t("span",null,"创建于 "+i(Se(c.value.createdAt)),1),t("span",null,"最后更新 "+i(Se(c.value.updatedAt)),1),t("span",null,"共 "+i(lt.value)+" 张图片",1)])])]),t("div",gl,[e[68]||(e[68]=t("div",{class:"asset-card-label"},"API 调用地址",-1)),t("div",fl,[t("code",null,i(st.value),1),t("button",{onClick:Zt,class:"asset-test-btn",disabled:_e.value},[e[66]||(e[66]=t("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[t("path",{d:"M8 5v14l11-7z"})],-1)),U(" "+i(_e.value?"测试中":"测试接口"),1)],8,ml)]),e[69]||(e[69]=t("div",{class:"asset-api-hint"},"直接访问该链接将随机返回一张表情图片",-1)),L.value?(n(),o("div",hl,[t("img",{src:L.value,alt:"API 返回图片预览"},null,8,yl),e[67]||(e[67]=t("span",null,"随机预览",-1))])):d("v-if",true)])]),d(" Drag over drop zone area "),w(t("div",{class:"sidebar-drop-zone-overlay",onDragover:e[10]||(e[10]=S(l=>ye.value=true,["prevent"])),onDragleave:e[11]||(e[11]=S(l=>ye.value=false,["prevent"])),onDrop:S(Qt,["prevent"])},[...e[70]||(e[70]=[Be('<div class="drop-overlay-box" data-v-b8acd784><svg class="drop-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" data-v-b8acd784><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" data-v-b8acd784></path><polyline points="17 8 12 3 7 8" data-v-b8acd784></polyline><line x1="12" y1="3" x2="12" y2="15" data-v-b8acd784></line></svg><p data-v-b8acd784>释放图片文件以导入此表情包</p></div>',1)])],544),[[Pe,ye.value]]),w(t("div",bl,[t("div",wl,[e[72]||(e[72]=t("div",null,[t("div",{class:"asset-import-title"},"导入外链图片"),t("div",{class:"asset-import-desc"},"每行一个以 http:// 或 https:// 开头的图片链接")],-1)),t("button",{onClick:e[12]||(e[12]=l=>ve.value=false),class:"asset-icon-btn compact",title:"关闭导入面板"},[...e[71]||(e[71]=[t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("path",{d:"M18 6 6 18"}),t("path",{d:"m6 6 12 12"})],-1)])])]),w(t("textarea",{"onUpdate:modelValue":e[13]||(e[13]=l=>de.value=l),rows:"4",class:"asset-link-textarea",placeholder:"每行一个以 http:// 或 https:// 开头的链接"},null,512),[[W,de.value]]),t("div",kl,[t("button",{onClick:Jt,class:"asset-btn primary"},"确认导入"),t("button",{onClick:e[14]||(e[14]=l=>ve.value=false),class:"asset-btn secondary"},"取消")])],512),[[Pe,ve.value]]),t("section",Cl,[t("div",_l,[t("div",xl,[t("button",{onClick:e[15]||(e[15]=l=>{H.value="all",I.value=1}),class:b(["asset-tab",H.value==="all"?"active":""])},[e[73]||(e[73]=U(" 全部 ",-1)),t("span",null,i(lt.value),1)],2),t("button",{onClick:e[16]||(e[16]=l=>{H.value="local",I.value=1}),class:b(["asset-tab",H.value==="local"?"active":""])},[e[74]||(e[74]=U(" 本地图片 ",-1)),t("span",null,i(x.images.length),1)],2),t("button",{onClick:e[17]||(e[17]=l=>{H.value="external",I.value=1}),class:b(["asset-tab",H.value==="external"?"active":""])},[e[75]||(e[75]=U(" 外链图片 ",-1)),t("span",null,i(x.links.length),1)],2)]),t("div",Il,[t("div",$l,[e[76]||(e[76]=t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("circle",{cx:"11",cy:"11",r:"8"}),t("path",{d:"m21 21-4.3-4.3"})],-1)),w(t("input",{"onUpdate:modelValue":e[18]||(e[18]=l=>pe.value=l),placeholder:"搜索图片或外链"},null,512),[[W,pe.value]])]),w(t("select",{"onUpdate:modelValue":e[19]||(e[19]=l=>fe.value=l),class:"asset-select"},[...e[77]||(e[77]=[t("option",{value:"all"},"筛选: 全部",-1),t("option",{value:"selected"},"筛选: 已选",-1)])],512),[[re,fe.value]]),w(t("select",{"onUpdate:modelValue":e[20]||(e[20]=l=>ge.value=l),class:"asset-select"},[...e[78]||(e[78]=[t("option",{value:"name"},"排序: 文件名",-1),t("option",{value:"nameDesc"},"排序: 文件名倒序",-1)])],512),[[re,ge.value]]),t("div",Sl,[t("button",{onClick:e[21]||(e[21]=l=>ae.value="grid"),class:b(ae.value==="grid"?"active":""),title:"网格视图"},[...e[79]||(e[79]=[Be('<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" data-v-b8acd784><rect x="3" y="3" width="7" height="7" rx="1" data-v-b8acd784></rect><rect x="14" y="3" width="7" height="7" rx="1" data-v-b8acd784></rect><rect x="3" y="14" width="7" height="7" rx="1" data-v-b8acd784></rect><rect x="14" y="14" width="7" height="7" rx="1" data-v-b8acd784></rect></svg>',1)])],2),t("button",{onClick:e[22]||(e[22]=l=>ae.value="list"),class:b(ae.value==="list"?"active":""),title:"列表视图"},[...e[80]||(e[80]=[Be('<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" data-v-b8acd784><path d="M8 6h13" data-v-b8acd784></path><path d="M8 12h13" data-v-b8acd784></path><path d="M8 18h13" data-v-b8acd784></path><path d="M3 6h.01" data-v-b8acd784></path><path d="M3 12h.01" data-v-b8acd784></path><path d="M3 18h.01" data-v-b8acd784></path></svg>',1)])],2)])])]),t("div",El,[!x.images.length&&!x.links.length?(n(),o("div",Ml," 表情包内尚无任何图片资源 ")):Fe.value.length?(n(),o("div",Ul,[E.value.length?(n(),o("div",Al,[t("div",Bl,[e[81]||(e[81]=t("span",{class:"bulk-title"},"本地素材",-1)),t("span",Pl,"已选择 "+i(E.value.length)+" 张",1)]),t("div",Vl,[t("button",{onClick:_t,class:"toolbar-btn compact"},i(et.value?"取消本页":"选择本页"),1),E.value.length?(n(),o("button",{key:0,onClick:me,class:"toolbar-btn compact"}," 清空选择 ")):d("v-if",true),E.value.length?(n(),o("div",Nl,[w(t("select",{"onUpdate:modelValue":e[23]||(e[23]=l=>le.value=l),class:"flat-select compact-select"},[e[82]||(e[82]=t("option",{value:""},"移动到...",-1)),(n(true),o(h,null,$(_.value,l=>(n(),o("option",{key:l.name,value:l.name,disabled:l.name===c.value.name},i(l.name),9,Rl))),128))],512),[[re,le.value]]),t("button",{onClick:ss,class:"toolbar-btn compact",disabled:!le.value}," 移动 ",8,Tl)])):d("v-if",true),e[83]||(e[83]=t("button",{class:"toolbar-btn compact",disabled:""},"设置标签",-1)),E.value.length?(n(),o("button",{key:2,onClick:es,class:"toolbar-btn compact danger"}," 批量删除 ")):d("v-if",true)])])):d("v-if",true),t("div",{class:b(["notion-gallery-grid",ae.value==="list"?"list-mode":""])},[(n(true),o(h,null,$(ze.value,l=>(n(),o("div",{key:l.id,class:b(["notion-gallery-card",{"notion-gallery-card-active-dropdown":l.type==="local"&&ne.value===l.value,selected:l.type==="local"&&Te(l.value),external:l.type==="external"}])},[l.type==="local"?(n(),o("button",{key:0,class:"gallery-select-toggle",onClick:S(a=>Xe(l.value),["stop"]),title:Te(l.value)?"取消选择":"选择图片"},[Te(l.value)?(n(),o("svg",Fl,[...e[84]||(e[84]=[t("polyline",{points:"20 6 9 17 4 12"},null,-1)])])):d("v-if",true)],8,Dl)):d("v-if",true),t("div",{class:"gallery-img-container",onClick:a=>xt(l),style:{cursor:"pointer"},title:l.type==="local"&&E.value.length?"切换选择状态":"在新标签页中打开原图"},[t("img",{src:l.src,class:"gallery-img",loading:"lazy"},null,8,Ol),t("span",{class:b(["image-format-badge",l.type])},i(l.type==="external"?"LINK":Ee(l.value)),3)],8,zl),t("div",Hl,[t("div",null,i(l.label),1),t("span",null,i(l.type==="external"?"外链图片":Ee(l.value)),1)]),t("div",Wl,[l.type==="local"?(n(),o("div",Gl,[t("div",{class:"card-action-btn move move-dropdown-container",onClick:S(a=>Ct(l.value),["stop"])},[e[85]||(e[85]=t("span",null,"修改",-1)),w(t("div",Zl,[(n(true),o(h,null,$(_.value,a=>(n(),o(h,null,[a.name!==c.value.name?(n(),o("button",{key:a.name,onClick:S(v=>ts(c.value.name,a.name,l.value),["stop"]),class:"dropdown-item"},i(a.name),9,ql)):d("v-if",true)],64))),256))],512),[[Pe,ne.value===l.value]])],8,jl),t("button",{onClick:S(a=>Xt(c.value.name,l.value),["stop"]),class:"card-action-btn danger"}," 删除 ",8,Kl)])):(n(),o("div",Ql,[t("button",{onClick:S(a=>Q(l.value),["stop"]),class:"card-action-btn"}," 复制 ",8,Jl),t("button",{onClick:S(a=>Yt(c.value.name,l.value),["stop"]),class:"card-action-btn danger"}," 删除 ",8,Yl)]))])],2))),128))],2),oe.value>1?(n(),o("div",Xl,[t("button",{disabled:I.value===1,onClick:e[24]||(e[24]=l=>I.value--),class:"btn btn-secondary page-btn"}," 上一页 ",8,ea),t("span",ta,[e[86]||(e[86]=U("第 ",-1)),t("b",null,i(I.value),1),U(" / "+i(oe.value)+" 页",1)]),t("button",{disabled:I.value===oe.value,onClick:e[25]||(e[25]=l=>I.value++),class:"btn btn-secondary page-btn"}," 下一页 ",8,sa)])):d("v-if",true)])):(n(),o("div",Ll," 没有匹配当前搜索或筛选条件的图片 "))])])])],32)],2112)):(n(),o("div",Bs,[d(" Creator bar in Notion Style "),t("div",Ps,[e[49]||(e[49]=t("div",null,[t("h1",{class:"notion-main-title"},"表情包管理"),t("p",{class:"section-desc compact"},"管理表情包合集与图片素材")],-1)),t("div",Vs,[t("div",Ns,[e[45]||(e[45]=t("svg",{class:"collection-toolbar-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("circle",{cx:"11",cy:"11",r:"8"}),t("path",{d:"m21 21-4.3-4.3"})],-1)),w(t("input",{"onUpdate:modelValue":e[4]||(e[4]=l=>ke.value=l),class:"flat-input collection-search-input",placeholder:"搜索表情包合集..."},null,512),[[W,ke.value]])]),t("label",Rs,[e[47]||(e[47]=t("svg",{class:"collection-toolbar-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("path",{d:"M3 4h18l-7 8v6l-4 2v-8z"})],-1)),w(t("select",{"onUpdate:modelValue":e[5]||(e[5]=l=>se.value=l),class:"flat-select collection-filter-select","aria-label":"筛选表情包合集"},[...e[46]||(e[46]=[t("option",{value:"all"},"全部",-1),t("option",{value:"local"},"仅本地",-1),t("option",{value:"external"},"含外链",-1)])],512),[[re,se.value]])]),t("button",{onClick:Wt,class:"btn btn-primary btn-notion"},[...e[48]||(e[48]=[t("span",{class:"btn-plus"},"+",-1),U(" 新建表情包 ",-1)])])])]),e[55]||(e[55]=t("hr",{class:"notion-hr"},null,-1)),d(" Folders grid layout "),_.value.length?ot.value.length?(n(),o("div",Fs,[(n(true),o(h,null,$(ot.value,l=>{var a;return n(),o("div",{key:l.name,class:"folder-card",onClick:v=>mt(l)},[t("div",{class:b(["folder-cover",qe(l.name).length?"has-preview":"empty"])},[qe(l.name).length?(n(true),o(h,{key:0},$(qe(l.name),v=>(n(),o("img",{key:v,src:v,class:"folder-cover-img",loading:"lazy",alt:`${l.name} 预览图`},null,8,Os))),128)):(n(),o("div",Hs,[...e[52]||(e[52]=[t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("path",{d:"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"})],-1)])])),(a=Vt(l.name))!=null&&a.loading?(n(),o("span",Ws,"同步中")):d("v-if",true)],2),t("div",Gs,[t("div",js,[t("div",{class:"folder-name",title:l.description||l.name},i(l.name),9,Zs),t("button",{class:"folder-more-btn",title:"更多操作",onClick:S(v=>ls(l.name),["stop"])},[...e[53]||(e[53]=[t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("circle",{cx:"5",cy:"12",r:"1"}),t("circle",{cx:"12",cy:"12",r:"1"}),t("circle",{cx:"19",cy:"12",r:"1"})],-1)])],8,qs),G.value===l.name?(n(),o("div",{key:0,class:"folder-action-menu",onClick:e[6]||(e[6]=S(()=>{},["stop"]))},[t("button",{onClick:v=>mt(l)},"打开详情",8,Ks),t("button",{class:"danger",onClick:v=>ft(l.name)},"删除表情包",8,Qs)])):d("v-if",true)]),t("div",Js,[t("div",Ys,i(l.totalCount)+" 张图片",1),t("div",Xs,[t("span",el,[e[54]||(e[54]=t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("path",{d:"M3 7a2 2 0 0 1 2-2h5l2 3h7a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"})],-1)),U(" 本地 "+i(l.localCount)+" · 外链 "+i(l.linkCount),1)])])])])],8,zs)}),128))])):(n(),o("div",Ds,[...e[51]||(e[51]=[t("div",{class:"empty-icon"},"🔎",-1),t("h3",null,"没有匹配的表情包合集",-1),t("p",null,"换个关键词或筛选条件再试试。",-1)])])):(n(),o("div",Ts,[...e[50]||(e[50]=[t("div",{class:"empty-icon"},"📁",-1),t("h3",null,"尚未创建任何表情包",-1),t("p",null,"点击右上角按钮即可快速创建一个新的表情包合集。",-1)])]))]))])):C.value==="distribution"?(n(),o(h,{key:1},[d(" MENU VIEW 2: DISTRIBUTION (🌐) "),t("div",la,[t("div",{class:"notion-db-header page-section-header"},[e[87]||(e[87]=t("div",null,[t("h1",{class:"notion-main-title"},"分发管理"),t("p",{class:"section-desc compact"},"管理统一重定向端点与外部目标地址")],-1)),t("button",{onClick:Ft,class:"btn btn-primary btn-notion"}," + 新建端点 ")]),e[102]||(e[102]=t("hr",{class:"notion-hr"},null,-1)),t("div",aa,[d(" Endpoint Editor Form Panel "),w(t("div",na,[t("div",oa,[t("h2",ia,i(R.value?"编辑分发端点":"创建新分发端点"),1),t("button",{onClick:gt,class:"icon-btn hover-bg",title:"收起编辑器"},[...e[88]||(e[88]=[t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),t("line",{x1:"6",y1:"6",x2:"18",y2:"18"})],-1)])])]),t("div",ra,[t("div",ca,[e[89]||(e[89]=t("label",null,"端点名称 *",-1)),w(t("input",{"onUpdate:modelValue":e[27]||(e[27]=l=>y.name=l),disabled:!!R.value,class:"flat-input",placeholder:"例如: moe"},null,8,ua),[[W,y.name]]),e[90]||(e[90]=t("span",{class:"field-hint"},"只能包含字母、数字、下划线和连字符",-1))]),t("div",da,[e[91]||(e[91]=t("label",null,"描述",-1)),w(t("input",{"onUpdate:modelValue":e[28]||(e[28]=l=>y.description=l),class:"flat-input",placeholder:"例如: 萌版横图"},null,512),[[W,y.description]])]),t("div",va,[e[92]||(e[92]=t("label",null,"目标 URL *",-1)),w(t("input",{"onUpdate:modelValue":e[29]||(e[29]=l=>y.url=l),class:"flat-input",placeholder:"https://example.com/api"},null,512),[[W,y.url]])]),t("div",pa,[e[93]||(e[93]=t("span",null,"访问预览",-1)),t("code",{onClick:e[30]||(e[30]=l=>Q(at.value))},i(at.value||"填写端点名称后生成预览"),1)]),t("div",ga,[t("button",{onClick:Ot,class:"btn btn-primary flex-grow"},i(R.value?"保存修改":"立即创建"),1),t("button",{onClick:gt,class:"btn btn-secondary"}," 取消 ")])])],512),[[Pe,ue.value]]),d(" Endpoints Table List "),t("div",fa,[t("div",ma,[e[94]||(e[94]=t("h2",{class:"notion-panel-title"},"端点列表",-1)),t("span",ha,i(ee.value.length)+" 条路由",1)]),t("div",ya,[t("table",ba,[e[101]||(e[101]=t("thead",null,[t("tr",null,[t("th",{style:{width:"18%"}},"名称"),t("th",{style:{width:"20%"}},"描述"),t("th",{style:{width:"17%"}},"方式"),t("th",{style:{width:"35%"}},"访问路径 & 转发目标"),t("th",{style:{width:"10%","text-align":"right"}},"管理")])],-1)),t("tbody",null,[ee.value.length?d("v-if",true):(n(),o("tr",wa,[...e[95]||(e[95]=[t("td",{colspan:"5",class:"empty-cell"},"尚未配置任何转发 API 端点",-1)])])),(n(true),o(h,null,$(ee.value,l=>(n(),o("tr",{key:l.name},[t("td",null,[t("div",ka,i(l.name),1)]),t("td",{class:"cell-desc",title:l.description},i(l.description||"-"),9,Ca),e[100]||(e[100]=t("td",null,[t("span",{class:"method-tag redirect"},"重定向"),t("div",{class:"target-url"},"302 重定向")],-1)),t("td",_a,[t("div",xa,[t("span",{class:"link-text",onClick:a=>Q(q(l.name))}," /"+i(l.name),9,Ia),t("button",{onClick:a=>Q(q(l.name)),class:"icon-btn-inline",title:"复制完整链接"},[...e[96]||(e[96]=[t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("rect",{x:"9",y:"9",width:"13",height:"13",rx:"2",ry:"2"}),t("path",{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"})],-1)])],8,$a)]),t("div",{class:"target-url truncate",title:l.url}," → "+i(l.url),9,Sa)]),t("td",Ea,[t("div",Ma,[t("a",{href:q(l.name),target:"_blank",class:"icon-btn hover-bg",title:"测试该端点访问"},[...e[97]||(e[97]=[t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"}),t("polyline",{points:"15 3 21 3 21 9"}),t("line",{x1:"10",y1:"14",x2:"21",y2:"3"})],-1)])],8,La),t("button",{onClick:a=>zt(l),class:"icon-btn hover-bg",title:"编辑参数"},[...e[98]||(e[98]=[t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("path",{d:"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"}),t("path",{d:"M18.5 2.5a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4 9.5-9.5z"})],-1)])],8,Ua),t("button",{onClick:a=>Ht(l.name),class:"icon-btn hover-danger",title:"彻底删除"},[...e[99]||(e[99]=[t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("polyline",{points:"3 6 5 6 21 6"}),t("path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"})],-1)])],8,Aa)])])]))),128))])])])])])])],2112)):C.value==="staging"?(n(),o(h,{key:2},[d(" MENU VIEW 3: STAGING (暂缓区) "),t("div",Ba,[t("div",Pa,[e[103]||(e[103]=t("div",null,[t("h1",{class:"notion-main-title"},"暂缓区"),t("p",{class:"section-desc compact"},"复核被上传过滤器拦截或自动收集的候选图片,再手动归档到表情包分组")],-1)),t("div",Va,[t("button",{onClick:Tt,class:b(["btn",O.value==="similar"?"btn-primary":"btn-secondary","btn-notion"]),disabled:te.value||M.value.length<2},i(te.value?"筛选中...":O.value==="similar"?"显示全部":"筛选相似图片"),11,Na),t("button",{onClick:K,class:"btn btn-secondary btn-notion"}," 刷新列表 "),M.value.length?(n(),o("button",{key:0,onClick:Ut,class:"btn btn-danger btn-notion"}," 一键清空 ")):d("v-if",true)])]),t("div",Ra,[t("div",Ta,[e[104]||(e[104]=t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("circle",{cx:"11",cy:"11",r:"8"}),t("path",{d:"m21 21-4.3-4.3"})],-1)),w(t("input",{"onUpdate:modelValue":e[31]||(e[31]=l=>Ve.value=l),placeholder:"搜索文件名、来源或原因"},null,512),[[W,Ve.value]])]),t("div",Da,i(O.value==="similar"?$t.value.length:j.value.length)+" / "+i(M.value.length)+" 张候选 ",1)]),M.value.length?O.value==="similar"?(n(),o("div",za,[te.value?(n(),o("div",Oa,"正在筛选相似图片...")):we.value?(n(),o("div",Ha,i(we.value),1)):d("v-if",true),!te.value&&!Oe.value.length?(n(),o("div",Wa," 暂缓区没有匹配当前条件的相似图片 ")):d("v-if",true),(n(true),o(h,null,$(Oe.value,l=>(n(),o("section",{key:l.id,class:"similar-group"},[t("div",Ga,[t("div",null,[t("h3",null,"相似组 "+i(l.label),1),t("p",null,i(l.items.length)+" 张候选,最高相似度 "+i(Bt(l.similarity)),1)])]),t("div",ja,[(n(true),o(h,null,$(l.items,a=>(n(),o("article",{key:a.id,class:"staging-card"},[t("button",{class:"staging-image-shell",onClick:v=>Ke($e(a.id)),title:"打开原图"},[t("img",{class:"staging-image",src:$e(a.id),alt:a.originalName||a.filename,loading:"lazy"},null,8,qa)],8,Za),t("div",Ka,[t("div",Qa,[t("div",{class:"staging-title",title:a.originalName||a.filename},i(a.originalName||a.filename),9,Ja),t("span",Ya,i(Ee(a.filename)),1)]),t("div",Xa,[t("span",{title:a.reason||"暂缓候选"},i(a.reason||"暂缓候选"),9,en),t("span",null,i(a.source||"filter"),1),t("span",null,i(rt(a.size)),1),t("span",null,i(Se(a.createdAt)),1)]),w(t("select",{"onUpdate:modelValue":v=>N.value[a.id]=v,class:"flat-select staging-select",disabled:!_.value.length},[e[106]||(e[106]=t("option",{value:""},"选择目标表情包",-1)),(n(true),o(h,null,$(_.value,v=>(n(),o("option",{key:v.name,value:v.name},i(v.name),9,sn))),128))],8,tn),[[re,N.value[a.id]]]),t("div",ln,[t("button",{onClick:v=>vt(a),class:"btn btn-primary staging-action-btn",disabled:A.value===a.id||!N.value[a.id]},i(A.value===a.id?"处理中...":"归档到表情包"),9,an),t("button",{onClick:v=>pt(a),class:"btn btn-danger staging-action-btn",disabled:A.value===a.id}," 删除 ",8,nn)])])]))),128))])]))),128))])):j.value.length?(n(),o("div",rn,[B.value.size?(n(),o("div",cn,[t("div",un,[e[107]||(e[107]=t("span",{class:"bulk-title"},"暂缓区",-1)),t("span",dn,"已选择 "+i(B.value.size)+" 张",1)]),t("div",vn,[t("button",{onClick:Mt,class:"toolbar-btn compact"},i(it.value?"取消全选":"全选当前"),1),t("button",{onClick:xe,class:"toolbar-btn compact"}," 清空选择 "),t("button",{onClick:Lt,class:"toolbar-btn compact danger"}," 批量删除 ")])])):d("v-if",true),t("div",pn,[(n(true),o(h,null,$(j.value,l=>(n(),o("article",{key:l.id,class:b(["staging-card",{"staging-card-selected":He(l.id)}])},[t("button",{class:"staging-select-toggle",onClick:S(a=>Et(l.id),["stop"]),title:He(l.id)?"取消选择":"选择图片"},[He(l.id)?(n(),o("svg",fn,[...e[108]||(e[108]=[t("polyline",{points:"20 6 9 17 4 12"},null,-1)])])):d("v-if",true)],8,gn),t("button",{class:"staging-image-shell",onClick:a=>Ke($e(l.id)),title:"打开原图"},[t("img",{class:"staging-image",src:$e(l.id),alt:l.originalName||l.filename,loading:"lazy"},null,8,hn)],8,mn),t("div",yn,[t("div",bn,[t("div",{class:"staging-title",title:l.originalName||l.filename},i(l.originalName||l.filename),9,wn),t("span",kn,i(Ee(l.filename)),1)]),t("div",Cn,[t("span",{title:l.reason||"暂缓候选"},i(l.reason||"暂缓候选"),9,_n),t("span",null,i(l.source||"filter"),1),t("span",null,i(rt(l.size)),1),t("span",null,i(Se(l.createdAt)),1)]),w(t("select",{"onUpdate:modelValue":a=>N.value[l.id]=a,class:"flat-select staging-select",disabled:!_.value.length},[e[109]||(e[109]=t("option",{value:""},"选择目标表情包",-1)),(n(true),o(h,null,$(_.value,a=>(n(),o("option",{key:a.name,value:a.name},i(a.name),9,In))),128))],8,xn),[[re,N.value[l.id]]]),t("div",$n,[t("button",{onClick:a=>vt(l),class:"btn btn-primary staging-action-btn",disabled:A.value===l.id||!N.value[l.id]},i(A.value===l.id?"处理中...":"归档到表情包"),9,Sn),t("button",{onClick:a=>pt(l),class:"btn btn-danger staging-action-btn",disabled:A.value===l.id}," 删除 ",8,En)])])],2))),128))])])):(n(),o("div",on," 没有匹配当前搜索条件的暂缓图片 ")):(n(),o("div",Fa,[...e[105]||(e[105]=[t("div",{class:"empty-icon"},"🕓",-1),t("h3",null,"暂缓区为空",-1),t("p",null,"上传时被过滤器拦截或自动收集命中的候选图片会先保存在这里,等待人工复核。",-1)])]))])],2112)):C.value==="settings"?(n(),o(h,{key:3},[d(" MENU VIEW 4: PREVIEW (👁️ 预览) "),t("div",Mn,[t("div",Ln,[t("div",{class:"notion-db-header page-section-header preview-page-header"},[e[110]||(e[110]=t("div",null,[t("h1",{class:"notion-main-title"},"预览"),t("p",{class:"section-desc compact"},"实时预览路由与最终提示词效果")],-1)),t("button",{onClick:ut,class:"btn btn-secondary btn-notion"}," 刷新预览 ")]),t("div",Un,[t("section",An,[t("div",Bn,[e[111]||(e[111]=t("div",null,[t("div",{class:"preview-card-title"},"路由清单"),t("div",{class:"preview-card-desc"},"{endpoint} 中可供 ChatLuna 使用的合集与端点")],-1)),t("button",{onClick:e[32]||(e[32]=l=>Q(We.value)),class:"preview-action-btn",disabled:!We.value,title:"复制路由清单"}," 复制清单 ",8,Pn)]),nt.value.length?(n(),o("div",Vn,[t("table",Nn,[e[113]||(e[113]=t("thead",null,[t("tr",null,[t("th",null,"预览"),t("th",null,"包名"),t("th",null,"描述"),t("th",null,"路径"),t("th",null,"操作")])],-1)),t("tbody",null,[(n(true),o(h,null,$(nt.value,l=>(n(),o("tr",{key:l.id},[t("td",null,[l.previewImages.length?(n(),o("div",{key:0,class:b(["preview-mini-cover",l.previewImages.length===1?"single":""])},[(n(true),o(h,null,$(l.previewImages,a=>(n(),o("img",{key:a,src:a,alt:`${l.name} 预览`,loading:"lazy",onError:v=>At(l)},null,40,Rn))),128))],2)):(n(),o("div",{key:1,class:b(["preview-route-icon",l.type])},i(l.type==="collection"?"包":"API"),3))]),t("td",null,[t("div",Tn,i(l.name),1),t("span",{class:b(["preview-route-type",l.type])},i(l.typeLabel),3)]),t("td",null,[t("div",{class:"preview-route-desc",title:l.description},i(l.description),9,Dn)]),t("td",null,[t("code",{class:"preview-route-path",title:l.fullUrl,onClick:a=>Q(l.fullUrl)},i(l.path),9,Fn)]),t("td",null,[t("div",zn,[t("a",{href:l.fullUrl,target:"_blank",class:"icon-btn hover-bg",title:"打开预览"},[...e[112]||(e[112]=[t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"}),t("polyline",{points:"15 3 21 3 21 9"}),t("line",{x1:"10",y1:"14",x2:"21",y2:"3"})],-1)])],8,On)])])]))),128))])])])):(n(),o("div",Hn," 暂无可用表情包及路由,请前往表情包管理或分发管理中创建。 "))]),t("section",Wn,[t("div",Gn,[e[114]||(e[114]=t("div",null,[t("div",{class:"preview-card-title"},"最终提示词"),t("div",{class:"preview-card-desc"},"{memesluna} 注入给 LLM 的完整文本")],-1)),t("button",{onClick:e[33]||(e[33]=l=>Q(he.value)),class:"preview-action-btn",disabled:!he.value,title:"复制最终提示词"}," 复制提示词 ",8,jn)]),t("div",Zn,[he.value?(n(),o("pre",qn,i(he.value),1)):(n(),o("pre",Kn,"- 正在获取最终提示词预览... -"))])])])])])],2112)):d("v-if",true)])],2112))])]))}}),Jn=(ce,C)=>{const p=ce.__vccOpts||ce;for(const[z,X]of C)p[z]=X;return p},Yn=Jn(Qn,[["__scopeId","data-v-b8acd784"]]),Xn="M1024 512C1024 229.230208 794.769792 0 512 0 229.230208 0 0 229.230208 0 512 0 794.769792 229.230208 1024 512 1024 629.410831 1024 740.826187 984.331046 830.768465 912.686662 841.557579 904.092491 843.33693 888.379234 834.742758 877.590121 826.148587 866.801009 810.43533 865.021658 799.646219 873.615827 718.470035 938.277495 618.001779 974.048781 512 974.048781 256.817504 974.048781 49.951219 767.182496 49.951219 512 49.951219 256.817504 256.817504 49.951219 512 49.951219 767.182496 49.951219 974.048781 256.817504 974.048781 512 974.048781 599.492834 949.714859 683.336764 904.470807 755.960693 897.177109 767.668243 900.755245 783.071797 912.462793 790.365493 924.170342 797.659191 939.573897 794.081058 946.867595 782.373508 997.013826 701.880796 1024 608.898379 1024 512ZM337.170731 499.512194C371.654852 499.512194 399.609756 471.557291 399.609756 437.073171 399.609756 402.58905 371.654852 374.634146 337.170731 374.634146 302.686611 374.634146 274.731708 402.58905 274.731708 437.073171 274.731708 471.557291 302.686611 499.512194 337.170731 499.512194ZM711.804879 499.512194C746.288998 499.512194 774.243902 471.557291 774.243902 437.073171 774.243902 402.58905 746.288998 374.634146 711.804879 374.634146 677.320757 374.634146 649.365854 402.58905 649.365854 437.073171 649.365854 471.557291 677.320757 499.512194 711.804879 499.512194ZM352.788105 768.770967C396.165222 803.472661 453.151987 824.195121 524.487806 824.195121 595.823622 824.195121 652.810387 803.472661 696.187505 768.770967 722.700531 747.560546 738.882517 725.984565 746.631548 710.486505 752.800254 698.149092 747.799529 683.146916 735.462114 676.978208 723.124702 670.809502 708.122526 675.810227 701.953818 688.147642 701.03616 689.982957 698.492224 694.172969 694.165854 699.941463 686.602473 710.025971 676.927317 720.210345 664.983226 729.765617 630.311565 757.502948 584.273939 774.243902 524.487806 774.243902 464.70167 774.243902 418.664045 757.502948 383.992384 729.765617 372.048292 720.210345 362.373137 710.025971 354.809756 699.941463 350.483386 694.172969 347.93945 689.982957 347.021792 688.147642 340.853084 675.810227 325.850908 670.809502 313.513495 676.978208 301.176081 683.146916 296.175356 698.149092 302.344062 710.486505 310.093092 725.984565 326.275078 747.560546 352.788105 768.770967Z",eo={name:"MemesLunaIcon",render(){return kt("svg",{class:"k-icon",viewBox:"0 0 1024 1024",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},[kt("path",{fill:"currentColor",d:Xn})])}};ns.register("MemesLunaEmoji",eo);const lo=ce=>{ce.page({name:"MemesLuna",path:"/memesluna",icon:"MemesLunaEmoji",component:Yn,authority:1,order:500})};export{lo as default};
|