koishi-plugin-memesluna 0.4.7 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/style.css +1 -1
- package/lib/config.d.ts +1 -0
- package/lib/index.js +59 -4
- package/lib/service.d.ts +2 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{send as h,icons as Qt}from"@koishijs/client";import{defineComponent as Jt,ref as u,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 bt}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"},cs={key:1,class:"crumb-parent"},us={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"},bs={key:0,class:"notion-view-switcher"},hs={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-info-row"},Hs={class:"folder-count"},Ws={class:"folder-meta-row"},Gs={class:"folder-meta-item"},js={class:"asset-detail-shell"},Zs={class:"detail-topbar"},qs={class:"detail-breadcrumbs"},Ks={class:"detail-crumb-current"},Qs={class:"detail-top-actions"},Js={class:"asset-hero-panel"},Ys={class:"asset-identity-card"},Xs={class:"asset-avatar-frame"},el=["src","alt"],tl={key:1,class:"asset-avatar-empty"},sl={class:"asset-title-stack"},ll={class:"asset-title-row"},al={class:"asset-meta-line"},nl={class:"asset-api-card"},ol={class:"asset-api-row"},il=["disabled"],rl={key:0,class:"api-preview-strip"},cl=["src"],ul={class:"asset-import-panel"},dl={class:"asset-import-header"},vl={class:"asset-import-actions"},pl={class:"asset-gallery-section"},gl={class:"asset-gallery-toolbar"},fl={class:"asset-tabs"},ml={class:"asset-filter-bar"},bl={class:"asset-search-box"},hl={class:"asset-view-toggle"},yl={class:"gallery-tab-content"},wl={key:0,class:"empty-gallery"},kl={key:1,class:"empty-gallery"},Cl={key:2},_l={key:0,class:"gallery-bulk-toolbar floating"},xl={class:"bulk-status"},Il={class:"bulk-meta"},$l={class:"bulk-actions"},Ml={key:1,class:"bulk-move-group"},El=["value","disabled"],Ll=["disabled"],Sl=["onClick","title"],Ul={key:0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2.5"},Bl=["onClick","title"],Al=["src"],Vl={class:"gallery-list-meta"},Nl={class:"gallery-card-overlay"},Pl={key:0,class:"overlay-actions"},Rl=["onClick"],Tl={class:"move-dropdown-menu"},Dl=["onClick"],Fl=["onClick"],zl={key:1,class:"overlay-actions"},Ol=["onClick"],Hl=["onClick"],Wl={key:1,class:"pagination-container"},Gl=["disabled"],jl={class:"page-indicator"},Zl=["disabled"],ql={class:"distribution-router-view"},Kl={class:"endpoint-layout"},Ql={class:"notion-form-panel endpoint-editor-panel"},Jl={class:"panel-title-row"},Yl={class:"notion-panel-title"},Xl={class:"form-fields endpoint-form-grid"},ea={class:"form-group"},ta=["disabled"],sa={class:"form-group"},la={class:"form-group span-2"},aa={class:"endpoint-preview span-2"},na={class:"form-actions span-2"},oa={class:"notion-table-panel"},ia={class:"table-title-row"},ra={class:"table-count"},ca={class:"table-container"},ua={class:"flat-table"},da={key:0},va={class:"endpoint-name"},pa=["title"],ga={class:"font-mono"},fa={class:"url-line"},ma=["onClick"],ba=["onClick"],ha=["title"],ya={style:{"text-align":"right"}},wa={class:"action-buttons"},ka=["href"],Ca=["onClick"],_a=["onClick"],xa={class:"staging-router-view"},Ia={class:"notion-db-header page-section-header staging-page-header"},$a={class:"staging-header-actions"},Ma=["disabled"],Ea={class:"staging-toolbar"},La={class:"asset-search-box staging-search-box"},Sa={class:"staging-count-pill"},Ua={key:0,class:"empty-placeholder-card staging-empty-card"},Ba={key:1,class:"similar-staging-view"},Aa={key:0,class:"empty-gallery"},Va={key:1,class:"similar-message"},Na={key:2,class:"empty-gallery"},Pa={class:"similar-group-header"},Ra={class:"staging-grid"},Ta=["onClick"],Da=["src","alt"],Fa={class:"staging-card-body"},za={class:"staging-title-row"},Oa=["title"],Ha={class:"staging-ext-tag"},Wa={class:"staging-meta-grid"},Ga=["title"],ja=["onUpdate:modelValue","disabled"],Za=["value"],qa={class:"staging-actions"},Ka=["onClick","disabled"],Qa=["onClick","disabled"],Ja={key:2,class:"empty-gallery"},Ya={key:3,class:"staging-grid"},Xa=["onClick"],en=["src","alt"],tn={class:"staging-card-body"},sn={class:"staging-title-row"},ln=["title"],an={class:"staging-ext-tag"},nn={class:"staging-meta-grid"},on=["title"],rn=["onUpdate:modelValue","disabled"],cn=["value"],un={class:"staging-actions"},dn=["onClick","disabled"],vn=["onClick","disabled"],pn={class:"settings-router-view"},gn={class:"settings-preview-panel"},fn={class:"preview-dashboard-grid"},mn={class:"preview-card route-table-card"},bn={class:"preview-card-header"},hn=["disabled"],yn={key:0,class:"preview-table-wrap"},wn={class:"preview-route-table"},kn=["src","alt","onError"],Cn={class:"preview-route-name"},_n=["title"],xn=["title","onClick"],In={class:"preview-row-actions"},$n=["href"],Mn={key:1,class:"preview-empty-state"},En={class:"preview-card prompt-card"},Ln={class:"preview-card-header"},Sn=["disabled"],Un={class:"preview-code-block final-prompt polished"},Bn={key:0},An={key:1,class:"text-gray-muted"},Vn=Jt({__name:"Dashboard",setup(oe){const k=u("resources"),p=u(true),D=u("/memesluna"),Q=u("http://localhost:5140"),J=u([]),C=u([]),F=u([]),Ae=u(""),V=u({}),U=u(""),z=u("all"),Ve=u([]),Y=u(false),he=u(""),ie=u(false),N=u(null),m=Se({name:"",group:"",description:"",url:""}),Ne=u(new Set),Ke=u(""),c=u(null),ye=u(""),X=u("all"),W=u(null),we=u(""),re=u(""),x=Se({images:[],links:[]}),P=Se({}),O=u("all"),ce=u(false),B=u(new Set),ee=u(""),ue=u(""),de=u("name"),ve=u("all"),te=u("grid"),L=u(""),ke=u(false),se=u(null);function ht(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=u(1),Re=u(24),kt=_(()=>{if(!c.value)return[];const l=x.images.map(s=>({id:`local:${s}`,type:"local",label:s,src:We(c.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=ue.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(!c.value)return"";const l=x.images[0];return l?We(c.value.name,l):x.links[0]||""}),Xe=_(()=>c.value?j(c.value.name):""),et=_(()=>{var l;return((l=c.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=u(""),ge=u(""),fe=u(false),Oe=u(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)):[],be=Array.isArray(a.links)?a.links.slice(0,v-q.length):[];P[l.name].images=[...q,...be]}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 b(){try{Q.value=window.location.origin;const l=await h("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 h("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 h("memesluna/getSimilarStagedImages");Ve.value=Array.isArray(l==null?void 0:l.groups)?l.groups:[],he.value=(l==null?void 0:l.message)||"",l&&l.available===false&&r(l.message||"相似图片筛选不可用","error")}catch(l){Ve.value=[],he.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 h("memesluna/promoteStagedImage",l.id,t);a?(r(`已归档到表情包 "${t}",新文件名 ${a}`,"success"),delete V.value[l.id]):r("暂缓图片不存在或已被处理","error"),await me(),await b(),((s=c.value)==null?void 0:s.name)===t&&await A(t)}catch(a){r(a instanceof Error?a.message:"归档暂缓图片失败","error")}finally{U.value=""}}async function ct(l){if(confirm(`确认从暂缓区删除 "${l.originalName||l.filename}" 吗?`)){U.value=l.id;try{await h("memesluna/deleteStagedImage",l.id)?(r("已从暂缓区删除","success"),delete V.value[l.id]):r("暂缓图片不存在或已被处理","error"),await me(),await b()}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 h("memesluna/addStagedImage",{base64:a,originalName:s.file.name,source:c.value?`upload:${c.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 ut(){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 h("memesluna/updateEndpoint",N.value.name,s),r("端点路由参数已成功更新","success")):(await h("memesluna/createEndpoint",s),r("接口端点已成功创建","success")),await b(),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 h("memesluna/deleteEndpoint",l),r("该分发端点已彻底删除","success"),await b(),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 h("memesluna/createCollection",l)){r("该名称的表情包已存在,请更换其他名称","error");return}r("表情包已成功创建","success"),Ke.value="",await b()}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 h("memesluna/deleteCollection",l),r("该表情包资源已彻底销毁删除","success"),c.value=null,await b()}catch(t){r(t instanceof Error?t.message:"删除失败","error")}finally{p.value=false}}async function vt(l){W.value=null,c.value=l,we.value=l.description||"",re.value="",ue.value="",de.value="name",ve.value="all",te.value="grid",L.value="",I.value=1,pe(),await A(l.name)}function Pt(){c.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(!c.value)return;p.value=true,await A(c.value.name),await b();const l=C.value.find(t=>t.name===c.value.name);l&&(c.value=l),p.value=false,r("本地及缓存资源数据已刷新成功","success")}async function Tt(){if(c.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 b();const s=C.value.find(a=>{var v;return a.name===((v=c.value)==null?void 0:v.name)});s&&(c.value=s)}catch(l){r(l instanceof Error?l.message:"测试接口失败","error")}finally{ke.value=false}}}async function pt(){if(c.value)try{p.value=true,await h("memesluna/setCollectionDescription",c.value.name,we.value.trim()),r("表情包描述已成功保存","success"),await b();const l=C.value.find(t=>t.name===c.value.name);l&&(c.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(!c.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")),be=new Map;for(const g of q)g.size>t&&be.set(g,"文件大小超过 10MB,需人工复核后再决定是否归档");const Ee=Array.from(be,([g,K])=>({file:g,reason:K})),Le=q.filter(g=>!be.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 b();return}if(Le.length>50){r("单次上传表情上限为 50 张,请分批次导入","error"),ae&&await b();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(c.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(c.value.name),await b()}}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(!c.value)return;const l=re.value.trim();if(!l){r("链接文本不能为空","error");return}try{p.value=true;const t=await h("memesluna/addLinks",c.value.name,l);r(`已成功录入 ${t} 条网络图片外链`,"success"),re.value="",await A(c.value.name),await b()}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 h("memesluna/deleteLink",l,t),r("外链直链已彻底删除","success"),await A(l),await b()}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 h("memesluna/deleteLocalImage",l,t),r("该本地图片已永久删除","success"),await A(l),await b()}catch(s){r(s instanceof Error?s.message:"删除失败","error")}finally{p.value=false}}async function Gt(){if(!c.value||!M.value.length)return;const l=M.value;if(confirm(`确认永久删除已选择的 ${l.length} 张本地图片素材吗?此操作无法恢复!`))try{p.value=true;for(const t of l)await h("memesluna/deleteLocalImage",c.value.name,t);r(`已删除 ${l.length} 张本地图片`,"success"),pe(),await A(c.value.name),await b()}catch(t){r(t instanceof Error?t.message:"批量删除失败","error")}finally{p.value=false}}async function jt(l,t,s){try{p.value=true,await h("memesluna/moveLocalImage",l,t,s)?(r(`已将素材移动至表情包 "${t}" 并重命名`,"success"),await A(l),await b()):r("移动失败","error")}catch(a){r(a instanceof Error?a.message:"移库失败","error")}finally{p.value=false}}async function Zt(){if(!c.value||!M.value.length||!ee.value)return;const l=c.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 h("memesluna/moveLocalImage",l,t,a);r(`已将 ${s.length} 张素材移动至表情包 "${t}"`,"success"),pe(),await A(l),await b()}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 b(),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([ue,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",cs,"分发管理")):k.value==="settings"?(n(),o("span",us,"预览")):k.value==="staging"?(n(),o("span",ds,"暂缓区")):d("v-if",true),k.value==="resources"&&c.value?(n(),o(f,{key:4},[t[34]||(t[34]=e("span",{class:"crumb-separator"},"/",-1)),e("span",vs,"表情包: "+i(c.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 "),c.value?d("v-if",true):(n(),o("div",bs,[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",hs,[...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) "),c.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",js,[e("div",Zs,[e("div",qs,[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",Ks,i(c.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",Qs,[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-bb76bc55><path d="M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16" data-v-bb76bc55></path><path d="M3 21v-5h5" data-v-bb76bc55></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-bb76bc55></path><path d="M16 8h5V3" data-v-bb76bc55></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=>ce.value=!ce.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(c.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",Js,[e("div",Ys,[e("div",Xs,[Ye.value?(n(),o("img",{key:0,src:Ye.value,class:"asset-avatar-img",alt:`${c.value.name} 封面`},null,8,el)):(n(),o("div",tl,[...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",sl,[e("div",ll,[e("h1",null,i(c.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",al,[e("span",null,"创建于 "+i(Ie(c.value.createdAt)),1),e("span",null,"最后更新 "+i(Ie(c.value.updatedAt)),1),e("span",null,"共 "+i(et.value)+" 张图片",1)])])]),e("div",nl,[t[68]||(t[68]=e("div",{class:"asset-card-label"},"API 调用地址",-1)),e("div",ol,[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,il)]),t[69]||(t[69]=e("div",{class:"asset-api-hint"},"直接访问该链接将随机返回一张表情图片",-1)),L.value?(n(),o("div",rl,[e("img",{src:L.value,alt:"API 返回图片预览"},null,8,cl),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-bb76bc55><svg class="drop-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" data-v-bb76bc55><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" data-v-bb76bc55></path><polyline points="17 8 12 3 7 8" data-v-bb76bc55></polyline><line x1="12" y1="3" x2="12" y2="15" data-v-bb76bc55></line></svg><p data-v-bb76bc55>释放图片文件以导入此表情包</p></div>',1)])],544),[[Be,fe.value]]),w(e("div",ul,[e("div",dl,[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=>ce.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",vl,[e("button",{onClick:Ot,class:"asset-btn primary"},"确认导入"),e("button",{onClick:t[14]||(t[14]=s=>ce.value=false),class:"asset-btn secondary"},"取消")])],512),[[Be,ce.value]]),e("section",pl,[e("div",gl,[e("div",fl,[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",ml,[e("div",bl,[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=>ue.value=s),placeholder:"搜索图片或外链"},null,512),[[H,ue.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-bb76bc55><rect x="3" y="3" width="7" height="7" rx="1" data-v-bb76bc55></rect><rect x="14" y="3" width="7" height="7" rx="1" data-v-bb76bc55></rect><rect x="3" y="14" width="7" height="7" rx="1" data-v-bb76bc55></rect><rect x="14" y="14" width="7" height="7" rx="1" data-v-bb76bc55></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-bb76bc55><path d="M8 6h13" data-v-bb76bc55></path><path d="M8 12h13" data-v-bb76bc55></path><path d="M8 18h13" data-v-bb76bc55></path><path d="M3 6h.01" data-v-bb76bc55></path><path d="M3 12h.01" data-v-bb76bc55></path><path d="M3 18h.01" data-v-bb76bc55></path></svg>',1)])],2)])])]),e("div",yl,[!x.images.length&&!x.links.length?(n(),o("div",wl," 表情包内尚无任何图片资源 ")):Te.value.length?(n(),o("div",Cl,[M.value.length?(n(),o("div",_l,[e("div",xl,[t[81]||(t[81]=e("span",{class:"bulk-title"},"本地素材",-1)),e("span",Il,"已选择 "+i(M.value.length)+" 张",1)]),e("div",$l,[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",Ml,[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===c.value.name},i(s.name),9,El))),128))],512),[[ne,ee.value]]),e("button",{onClick:Zt,class:"toolbar-btn compact",disabled:!ee.value}," 移动 ",8,Ll)])):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",Ul,[...t[84]||(t[84]=[e("polyline",{points:"20 6 9 17 4 12"},null,-1)])])):d("v-if",true)],8,Sl)):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,Al),e("span",{class:y(["image-format-badge",s.type])},i(s.type==="external"?"LINK":$e(s.value)),3)],8,Bl),e("div",Vl,[e("div",null,i(s.label),1),e("span",null,i(s.type==="external"?"外链图片":$e(s.value)),1)]),e("div",Nl,[s.type==="local"?(n(),o("div",Pl,[e("div",{class:"card-action-btn move move-dropdown-container",onClick:E(a=>ht(s.value),["stop"])},[t[85]||(t[85]=e("span",null,"修改",-1)),w(e("div",Tl,[(n(true),o(f,null,$(C.value,a=>(n(),o(f,null,[a.name!==c.value.name?(n(),o("button",{key:a.name,onClick:E(v=>jt(c.value.name,a.name,s.value),["stop"]),class:"dropdown-item"},i(a.name),9,Dl)):d("v-if",true)],64))),256))],512),[[Be,se.value===s.value]])],8,Rl),e("button",{onClick:E(a=>Wt(c.value.name,s.value),["stop"]),class:"card-action-btn danger"}," 删除 ",8,Fl)])):(n(),o("div",zl,[e("button",{onClick:E(a=>Z(s.value),["stop"]),class:"card-action-btn"}," 复制 ",8,Ol),e("button",{onClick:E(a=>Ht(c.value.name,s.value),["stop"]),class:"card-action-btn danger"}," 删除 ",8,Hl)]))])],2))),128))],2),le.value>1?(n(),o("div",Wl,[e("button",{disabled:I.value===1,onClick:t[24]||(t[24]=s=>I.value--),class:"btn btn-secondary page-btn"}," 上一页 ",8,Gl),e("span",jl,[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,Zl)])):d("v-if",true)])):(n(),o("div",kl," 没有匹配当前搜索或筛选条件的图片 "))])])])],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,[e("div",Hs,i(s.totalCount)+" 张图片",1),e("div",Ws,[e("span",Gs,[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",ql,[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",Kl,[d(" Endpoint Editor Form Panel "),w(e("div",Ql,[e("div",Jl,[e("h2",Yl,i(N.value?"编辑分发端点":"创建新分发端点"),1),e("button",{onClick:ut,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",Xl,[e("div",ea,[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,ta),[[H,m.name]]),t[90]||(t[90]=e("span",{class:"field-hint"},"只能包含字母、数字、下划线和连字符",-1))]),e("div",sa,[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",la,[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",aa,[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",na,[e("button",{onClick:At,class:"btn btn-primary flex-grow"},i(N.value?"保存修改":"立即创建"),1),e("button",{onClick:ut,class:"btn btn-secondary"}," 取消 ")])])],512),[[Be,ie.value]]),d(" Endpoints Table List "),e("div",oa,[e("div",ia,[t[94]||(t[94]=e("h2",{class:"notion-panel-title"},"端点列表",-1)),e("span",ra,i(J.value.length)+" 条路由",1)]),e("div",ca,[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",da,[...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",va,i(s.name),1)]),e("td",{class:"cell-desc",title:s.description},i(s.description||"-"),9,pa),t[100]||(t[100]=e("td",null,[e("span",{class:"method-tag redirect"},"重定向"),e("div",{class:"target-url"},"302 重定向")],-1)),e("td",ga,[e("div",fa,[e("span",{class:"link-text",onClick:a=>Z(j(s.name))}," /"+i(s.name),9,ma),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,ba)]),e("div",{class:"target-url truncate",title:s.url}," → "+i(s.url),9,ha)]),e("td",ya,[e("div",wa,[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,ka),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,Ca),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,_a)])])]))),128))])])])])])])],2112)):k.value==="staging"?(n(),o(f,{key:2},[d(" MENU VIEW 3: STAGING (暂缓区) "),e("div",xa,[e("div",Ia,[t[103]||(t[103]=e("div",null,[e("h1",{class:"notion-main-title"},"暂缓区"),e("p",{class:"section-desc compact"},"复核被上传过滤器拦截或自动收集的候选图片,再手动归档到表情包分组")],-1)),e("div",$a,[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,Ma),e("button",{onClick:me,class:"btn btn-secondary btn-notion"}," 刷新列表 ")])]),e("div",Ea,[e("div",La,[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",Sa,i(z.value==="similar"?Ct.value.length:Ce.value.length)+" / "+i(F.value.length)+" 张候选 ",1)]),F.value.length?z.value==="similar"?(n(),o("div",Ba,[Y.value?(n(),o("div",Aa,"正在筛选相似图片...")):he.value?(n(),o("div",Va,i(he.value),1)):d("v-if",true),!Y.value&&!Fe.value.length?(n(),o("div",Na," 暂缓区没有匹配当前条件的相似图片 ")):d("v-if",true),(n(true),o(f,null,$(Fe.value,s=>(n(),o("section",{key:s.id,class:"similar-group"},[e("div",Pa,[e("div",null,[e("h3",null,"相似组 "+i(s.label),1),e("p",null,i(s.items.length)+" 张候选,最高相似度 "+i(xt(s.similarity)),1)])]),e("div",Ra,[(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,Da)],8,Ta),e("div",Fa,[e("div",za,[e("div",{class:"staging-title",title:a.originalName||a.filename},i(a.originalName||a.filename),9,Oa),e("span",Ha,i($e(a.filename)),1)]),e("div",Wa,[e("span",{title:a.reason||"暂缓候选"},i(a.reason||"暂缓候选"),9,Ga),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,Za))),128))],8,ja),[[ne,V.value[a.id]]]),e("div",qa,[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,Ka),e("button",{onClick:v=>ct(a),class:"btn btn-danger staging-action-btn",disabled:U.value===a.id}," 删除 ",8,Qa)])])]))),128))])]))),128))])):Ce.value.length?(n(),o("div",Ya,[(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,en)],8,Xa),e("div",tn,[e("div",sn,[e("div",{class:"staging-title",title:s.originalName||s.filename},i(s.originalName||s.filename),9,ln),e("span",an,i($e(s.filename)),1)]),e("div",nn,[e("span",{title:s.reason||"暂缓候选"},i(s.reason||"暂缓候选"),9,on),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,cn))),128))],8,rn),[[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,dn),e("button",{onClick:a=>ct(s),class:"btn btn-danger staging-action-btn",disabled:U.value===s.id}," 删除 ",8,vn)])])]))),128))])):(n(),o("div",Ja," 没有匹配当前搜索条件的暂缓图片 ")):(n(),o("div",Ua,[...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",pn,[e("div",gn,[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",fn,[e("section",mn,[e("div",bn,[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",yn,[e("table",wn,[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,kn))),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",Cn,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,_n)]),e("td",null,[e("code",{class:"preview-route-path",title:s.fullUrl,onClick:a=>Z(s.fullUrl)},i(s.path),9,xn)]),e("td",null,[e("div",In,[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,$n)])])]))),128))])])])):(n(),o("div",Mn," 暂无可用表情包及路由,请前往表情包管理或分发管理中创建。 "))]),e("section",En,[e("div",Ln,[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,Sn)]),e("div",Un,[ge.value?(n(),o("pre",Bn,i(ge.value),1)):(n(),o("pre",An,"- 正在获取最终提示词预览... -"))])])])])])],2112)):d("v-if",true)])],2112))])]))}}),Nn=(oe,k)=>{const p=oe.__vccOpts||oe;for(const[D,Q]of k)p[D]=Q;return p},Pn=Nn(Vn,[["__scopeId","data-v-bb76bc55"]]),Rn="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",Tn={name:"MemesLunaIcon",render(){return bt("svg",{class:"k-icon",viewBox:"0 0 1024 1024",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},[bt("path",{fill:"currentColor",d:Rn})])}};Qt.register("MemesLunaEmoji",Tn);const zn=oe=>{oe.page({name:"MemesLuna",path:"/memesluna",icon:"MemesLunaEmoji",component:Pn,authority:1,order:500})};export{zn 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};
|
package/dist/style.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.memesluna-app-layout[data-v-bb76bc55]{min-height:100vh;padding-left:64px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,"Segoe UI Emoji","Apple Color Emoji";background-color:var(--k-bg-card, #ffffff);color:var(--k-text-normal, #37352f);box-sizing:border-box;color-scheme:light;--k-bg-card: var(--k-card-bg, #ffffff);--k-bg-panel: var(--k-hover-bg, #f7f7f5);--k-bg-button-hover: var(--k-hover-bg, rgba(55, 53, 47, .04));--k-text-muted: var(--k-text-light, rgba(55, 53, 47, .55));--memesluna-drop-overlay-bg: rgba(255, 255, 255, .85);--memesluna-floating-action-bg: rgba(255, 255, 255, .92);--memesluna-floating-shadow: none;--memesluna-focus-ring: rgba(35, 131, 226, .15);--memesluna-primary-soft-bg: rgba(35, 131, 226, .1);--memesluna-primary-faint-bg: rgba(35, 131, 226, .04);--memesluna-success-soft-bg: rgba(43, 138, 92, .1);--memesluna-danger-soft-bg: rgba(235, 87, 87, .08);--memesluna-danger-border: rgba(235, 87, 87, .25);--memesluna-toast-success-bg: #f2f9f5;--memesluna-toast-error-bg: #fdf2f2;--memesluna-final-prompt-bg: rgba(35, 131, 226, .02);--memesluna-final-prompt-text: #1e3a8a;--memesluna-code-bg: #ffffff;--memesluna-code-text: #111827;--memesluna-code-border: rgba(15, 23, 42, .09);--memesluna-soft-shadow: none;--memesluna-card-shadow: none;--memesluna-popover-shadow: none}html.dark .memesluna-app-layout,.theme-root.dark .memesluna-app-layout{color-scheme:dark;--k-bg-card: var(--k-card-bg, #252529);--k-bg-panel: var(--k-hover-bg, #303036);--k-bg-button-hover: var(--k-hover-bg, rgba(255, 255, 255, .06));--k-text-muted: var(--k-text-light, rgba(235, 235, 245, .62));--memesluna-drop-overlay-bg: rgba(20, 20, 24, .82);--memesluna-floating-action-bg: rgba(42, 42, 48, .94);--memesluna-floating-shadow: none;--memesluna-focus-ring: rgba(64, 158, 255, .24);--memesluna-primary-soft-bg: rgba(64, 158, 255, .16);--memesluna-primary-faint-bg: rgba(64, 158, 255, .1);--memesluna-success-soft-bg: rgba(103, 194, 58, .16);--memesluna-danger-soft-bg: rgba(235, 87, 87, .16);--memesluna-danger-border: rgba(235, 87, 87, .34);--memesluna-toast-success-bg: rgba(43, 138, 92, .16);--memesluna-toast-error-bg: rgba(235, 87, 87, .16);--memesluna-final-prompt-bg: rgba(64, 158, 255, .12);--memesluna-final-prompt-text: var(--k-color-primary-tint, #8ab4f8);--memesluna-code-bg: #000000;--memesluna-code-text: #f8fafc;--memesluna-code-border: rgba(255, 255, 255, .14);--memesluna-soft-shadow: none;--memesluna-card-shadow: none;--memesluna-popover-shadow: none}.notion-content[data-v-bb76bc55]{padding:80px 112px 112px;box-sizing:border-box;max-width:1880px;margin:0 auto}.content-breadcrumb-header[data-v-bb76bc55]{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px;padding-bottom:12px;border-bottom:1px solid var(--k-color-border, rgba(55, 53, 47, .08))}.breadcrumbs[data-v-bb76bc55]{display:flex;align-items:center;gap:8px;font-size:.82rem;color:var(--k-text-muted, rgba(55, 53, 47, .5))}.crumb-root[data-v-bb76bc55]{font-weight:500}.crumb-parent[data-v-bb76bc55]{color:var(--k-text-normal, #37352f);font-weight:500}.crumb-child.active[data-v-bb76bc55]{color:var(--k-color-primary, #2383e2);font-weight:600}.crumb-separator[data-v-bb76bc55]{color:var(--k-color-border, rgba(55, 53, 47, .25))}.header-quick-stats[data-v-bb76bc55]{display:flex;gap:8px}.stat-bubble[data-v-bb76bc55]{font-size:.72rem;font-weight:500;background-color:var(--k-bg-panel, rgba(55, 53, 47, .05));color:var(--k-text-muted, rgba(55, 53, 47, .65));padding:2px 8px;border-radius:4px}.notion-view-switcher[data-v-bb76bc55]{display:flex;align-items:center;gap:4px;border-bottom:1px solid var(--k-color-border, rgba(55, 53, 47, .08));margin-bottom:24px;padding-bottom:2px}.switcher-btn[data-v-bb76bc55]{background:transparent;border:none;padding:6px 16px;font-size:.85rem;font-weight:500;color:var(--k-text-muted, rgba(55, 53, 47, .5));cursor:pointer;display:flex;align-items:center;gap:6px;transition:background .1s ease,color .1s ease;border-bottom:2px solid transparent;border-radius:4px 4px 0 0;margin-bottom:-1px}.switcher-btn[data-v-bb76bc55]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .04));color:var(--k-text-normal, #37352f)}.switcher-btn.active[data-v-bb76bc55]{color:var(--k-text-normal, #37352f);border-bottom:2px solid var(--k-text-normal, #37352f);font-weight:600;border-radius:0}.switcher-icon[data-v-bb76bc55]{font-size:.95rem}.notion-db-header[data-v-bb76bc55]{display:flex;justify-content:space-between;align-items:center;margin-top:12px;margin-bottom:12px}.collection-list-header[data-v-bb76bc55]{gap:20px;justify-content:flex-end}.collection-title-group[data-v-bb76bc55]{display:flex;align-items:center;gap:22px;min-width:0}.notion-db-title[data-v-bb76bc55]{font-size:1.24rem;font-weight:700;margin:0;color:var(--k-text-normal, #37352f);white-space:nowrap}.collection-total-count[data-v-bb76bc55]{color:var(--k-text-muted, rgba(55, 53, 47, .58));font-size:.82rem;white-space:nowrap}.notion-db-actions[data-v-bb76bc55]{display:flex;align-items:center;gap:8px}.collection-toolbar[data-v-bb76bc55]{flex-wrap:nowrap;justify-content:flex-end}.collection-search-shell[data-v-bb76bc55],.collection-filter-shell[data-v-bb76bc55]{position:relative;display:inline-flex;align-items:center;color:var(--k-text-muted, rgba(55, 53, 47, .52))}.collection-toolbar-icon[data-v-bb76bc55]{position:absolute;right:11px;width:15px;height:15px;pointer-events:none;color:currentColor;z-index:1}.collection-search-shell .collection-search-input[data-v-bb76bc55]{width:280px;height:36px;padding-left:12px;padding-right:36px;border-radius:6px;font-size:.82rem;background-color:var(--k-bg-card, #ffffff)}.collection-filter-shell .collection-filter-select[data-v-bb76bc55]{width:128px;height:36px;padding-left:12px;padding-right:36px;border-radius:6px;font-size:.82rem;background-color:var(--k-bg-card, #ffffff);cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none}.collection-name-input-notion[data-v-bb76bc55]{width:200px;height:28px;font-size:.78rem}.btn-notion[data-v-bb76bc55]{height:36px;padding:0 14px;gap:6px;border-radius:6px;font-size:.84rem;font-weight:600;white-space:nowrap}.btn-plus[data-v-bb76bc55]{font-size:1rem;line-height:1}.notion-hr[data-v-bb76bc55]{border:none;border-top:1px solid var(--k-color-border, rgba(55, 53, 47, .09));margin:8px 0 20px}.folders-grid[data-v-bb76bc55]{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:20px 24px}.folder-card[data-v-bb76bc55]{background:var(--k-bg-card, #ffffff);border:1px solid var(--k-color-border, rgba(15, 23, 42, .09));border-radius:8px;overflow:hidden;cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease,transform .15s ease;display:flex;flex-direction:column;min-width:0;box-shadow:0 2px 8px #0f172a0d}.folder-card[data-v-bb76bc55]:hover{border-color:#2383e247;box-shadow:0 8px 24px #0f172a14;transform:translateY(-1px)}.folder-cover[data-v-bb76bc55]{position:relative;aspect-ratio:2.18 / 1;min-height:132px;background-color:var(--k-bg-panel, #f7f7f5);border-bottom:1px solid var(--k-color-border, rgba(15, 23, 42, .08));display:grid;grid-template-columns:repeat(3,minmax(0,1fr));grid-template-rows:repeat(2,minmax(0,1fr));gap:1px;overflow:hidden}.folder-cover.has-preview[data-v-bb76bc55]{background-color:var(--k-color-border, rgba(15, 23, 42, .08))}.folder-cover.empty[data-v-bb76bc55]{display:flex;align-items:center;justify-content:center;color:var(--k-text-muted, rgba(55, 53, 47, .4))}.folder-card:hover .folder-cover.empty[data-v-bb76bc55]{color:var(--k-text-muted, rgba(55, 53, 47, .55));background-color:var(--k-bg-button-hover, #f1f1ef)}.folder-cover-empty svg[data-v-bb76bc55]{width:32px;height:32px}.folder-cover-img[data-v-bb76bc55]{width:100%;height:100%;object-fit:cover;background-color:var(--k-bg-panel, #f7f7f5)}.folder-cover-badge[data-v-bb76bc55]{position:absolute;right:8px;bottom:8px;padding:1px 6px;border-radius:3px;background-color:var(--memesluna-floating-action-bg);box-shadow:var(--memesluna-floating-shadow);color:var(--k-text-muted, rgba(55, 53, 47, .6));font-size:.65rem;font-weight:500}.folder-body[data-v-bb76bc55]{padding:15px 16px 16px;flex:1;display:flex;flex-direction:column;box-sizing:border-box;min-height:108px}.folder-title-row[data-v-bb76bc55]{position:relative;display:flex;align-items:center;justify-content:space-between;gap:10px}.folder-name[data-v-bb76bc55]{min-width:0;font-size:.96rem;font-weight:700;color:var(--k-text-normal, #37352f);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.folder-more-btn[data-v-bb76bc55]{width:26px;height:26px;border:none;border-radius:5px;background:transparent;color:var(--k-text-muted, rgba(55, 53, 47, .56));display:inline-flex;align-items:center;justify-content:center;padding:0;cursor:pointer;flex-shrink:0}.folder-more-btn[data-v-bb76bc55]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .06));color:var(--k-text-normal, #37352f)}.folder-more-btn svg[data-v-bb76bc55]{width:17px;height:17px}.folder-action-menu[data-v-bb76bc55]{position:absolute;right:0;top:30px;min-width:112px;padding:5px;border-radius:6px;background-color:var(--k-bg-card, #ffffff);border:1px solid var(--k-color-border, rgba(15, 23, 42, .12));box-shadow:0 10px 28px #0f172a24;z-index:20}.folder-action-menu button[data-v-bb76bc55]{width:100%;height:28px;padding:0 9px;border:none;border-radius:4px;background:transparent;color:var(--k-text-normal, #37352f);text-align:left;font:inherit;font-size:.78rem;cursor:pointer}.folder-action-menu button[data-v-bb76bc55]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .06))}.folder-action-menu button.danger[data-v-bb76bc55]{color:var(--k-color-danger, #eb5757)}.folder-info-row[data-v-bb76bc55]{display:flex;justify-content:space-between;align-items:center;margin-top:9px;gap:8px}.folder-count[data-v-bb76bc55]{color:var(--k-text-muted, rgba(55, 53, 47, .62));font-size:.86rem;line-height:1.4;white-space:nowrap}.folder-meta-row[data-v-bb76bc55]{display:flex;align-items:center;min-width:0}.folder-meta-item[data-v-bb76bc55]{min-width:0;display:inline-flex;align-items:center;gap:5px;color:var(--k-text-muted, rgba(55, 53, 47, .6));font-size:.8rem;line-height:1.35;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.folder-meta-item svg[data-v-bb76bc55]{width:15px;height:15px;flex-shrink:0}.collection-detail-layout[data-v-bb76bc55]{margin-top:4px}.asset-detail-shell[data-v-bb76bc55]{display:flex;flex-direction:column;gap:14px}.detail-topbar[data-v-bb76bc55]{display:flex;align-items:center;justify-content:space-between;gap:16px;padding-bottom:8px}.detail-breadcrumbs[data-v-bb76bc55]{display:flex;align-items:center;gap:8px;min-width:0;color:var(--k-text-muted, rgba(55, 53, 47, .58));font-size:.82rem}.detail-back-btn[data-v-bb76bc55]{border:none;background:transparent;color:inherit;display:inline-flex;align-items:center;gap:5px;padding:5px 7px;border-radius:8px;cursor:pointer;font:inherit}.detail-back-btn[data-v-bb76bc55]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .05));color:var(--k-text-normal, #111827)}.detail-back-btn svg[data-v-bb76bc55],.asset-btn svg[data-v-bb76bc55],.asset-icon-btn svg[data-v-bb76bc55],.asset-test-btn svg[data-v-bb76bc55],.asset-view-toggle svg[data-v-bb76bc55]{width:16px;height:16px;flex:0 0 16px}.detail-separator[data-v-bb76bc55]{color:var(--k-color-border, rgba(55, 53, 47, .3))}.detail-crumb-current[data-v-bb76bc55],.detail-crumb-strong[data-v-bb76bc55]{color:var(--k-text-normal, #111827);font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.detail-top-actions[data-v-bb76bc55]{display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:wrap}.asset-btn[data-v-bb76bc55],.asset-icon-btn[data-v-bb76bc55],.asset-test-btn[data-v-bb76bc55]{border:1px solid var(--k-color-border, rgba(15, 23, 42, .1));background-color:var(--k-bg-card, #ffffff);color:var(--k-text-normal, #111827);border-radius:12px;min-height:36px;padding:0 13px;display:inline-flex;align-items:center;justify-content:center;gap:7px;font-size:.8rem;font-weight:650;cursor:pointer;box-shadow:none;transition:border-color .15s ease,background-color .15s ease,color .15s ease}.asset-btn[data-v-bb76bc55]:hover,.asset-icon-btn[data-v-bb76bc55]:hover,.asset-test-btn[data-v-bb76bc55]:hover{background-color:var(--k-bg-panel, #f8fafc)}.asset-btn.primary[data-v-bb76bc55],.asset-test-btn[data-v-bb76bc55]{border-color:transparent;background:#1f6feb;color:#fff;box-shadow:none}.asset-btn.primary[data-v-bb76bc55]:hover,.asset-test-btn[data-v-bb76bc55]:hover{background:#1a5fd0}.asset-btn.secondary[data-v-bb76bc55]{background-color:var(--k-bg-card, #ffffff)}.asset-btn.ghost[data-v-bb76bc55]{width:36px;padding:0}.asset-btn.danger[data-v-bb76bc55]{color:var(--k-color-danger, #eb5757)}.asset-btn.danger[data-v-bb76bc55]:hover{background-color:var(--memesluna-danger-soft-bg);border-color:var(--memesluna-danger-border)}.asset-hero-panel[data-v-bb76bc55]{display:grid;grid-template-columns:minmax(280px,.95fr) minmax(520px,1.55fr);gap:14px;align-items:stretch;padding:18px;border:1px solid var(--k-color-border, rgba(15, 23, 42, .08));border-radius:16px;background:var(--k-bg-card, #ffffff);box-shadow:var(--memesluna-soft-shadow)}.asset-identity-card[data-v-bb76bc55]{display:flex;align-items:center;gap:16px;min-width:0}.asset-avatar-frame[data-v-bb76bc55]{width:96px;height:96px;border-radius:18px;overflow:hidden;flex:0 0 96px;background:var(--k-bg-panel, #f6f8fb);box-shadow:inset 0 0 0 1px var(--k-color-border, rgba(15, 23, 42, .08))}.asset-avatar-img[data-v-bb76bc55]{width:100%;height:100%;object-fit:cover}.asset-avatar-empty[data-v-bb76bc55]{width:100%;height:100%;display:flex;align-items:center;justify-content:center;color:var(--k-text-muted, rgba(55, 53, 47, .42))}.asset-avatar-empty svg[data-v-bb76bc55]{width:34px;height:34px}.asset-title-stack[data-v-bb76bc55]{min-width:0;flex:1}.asset-title-row[data-v-bb76bc55]{display:flex;align-items:center;gap:9px}.asset-title-row h1[data-v-bb76bc55]{margin:0;color:var(--k-text-normal, #0f172a);font-size:1.7rem;line-height:1.1;font-weight:760;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.asset-pill[data-v-bb76bc55]{padding:3px 8px;border-radius:999px;background-color:var(--memesluna-danger-soft-bg);color:var(--k-color-danger, #eb5757);font-size:.72rem;font-weight:700}.asset-description-input[data-v-bb76bc55]{margin-top:9px;width:100%;border:none;background:transparent;color:var(--k-text-muted, rgba(55, 53, 47, .68));font-size:.88rem;line-height:1.4;padding:4px 0;outline:none;font-family:inherit}.asset-description-input[data-v-bb76bc55]:focus{color:var(--k-text-normal, #111827)}.asset-meta-line[data-v-bb76bc55]{display:flex;flex-wrap:wrap;gap:8px 14px;margin-top:12px;color:var(--k-text-muted, rgba(55, 53, 47, .58));font-size:.75rem}.asset-api-card[data-v-bb76bc55]{min-width:0;align-self:center;width:100%;box-shadow:none}.asset-card-label[data-v-bb76bc55]{color:var(--k-text-normal, #111827);font-size:.8rem;font-weight:720;margin-bottom:9px}.asset-api-row[data-v-bb76bc55]{display:grid;grid-template-columns:minmax(260px,1fr) auto;gap:10px;align-items:center}.asset-api-row code[data-v-bb76bc55]{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:9px 10px;border-radius:10px;background-color:var(--memesluna-primary-faint-bg);color:var(--k-color-primary, #2563eb);font:.82rem SFMono-Regular,Consolas,monospace;box-shadow:inset 0 0 0 1px #2563eb14}.asset-icon-btn[data-v-bb76bc55]{min-height:34px;padding:0 11px;border-radius:10px;font-size:.76rem}.asset-icon-btn.compact[data-v-bb76bc55]{width:32px;min-height:32px;padding:0}.asset-test-btn[data-v-bb76bc55]:disabled{opacity:.68;cursor:wait}.asset-api-hint[data-v-bb76bc55]{margin-top:10px;color:var(--k-text-muted, rgba(55, 53, 47, .56));font-size:.74rem}.api-preview-strip[data-v-bb76bc55]{margin-top:10px;display:flex;align-items:center;gap:9px;color:var(--k-text-muted, rgba(55, 53, 47, .6));font-size:.75rem}.api-preview-strip img[data-v-bb76bc55]{width:42px;height:42px;object-fit:cover;border-radius:10px;box-shadow:none}.asset-import-panel[data-v-bb76bc55]{padding:14px;border:1px solid var(--k-color-border, rgba(15, 23, 42, .08));border-radius:14px;background-color:var(--k-bg-card, #ffffff);box-shadow:none}.asset-import-header[data-v-bb76bc55]{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin-bottom:10px}.asset-import-title[data-v-bb76bc55]{color:var(--k-text-normal, #111827);font-size:.9rem;font-weight:720}.asset-import-desc[data-v-bb76bc55]{margin-top:3px;color:var(--k-text-muted, rgba(55, 53, 47, .56));font-size:.75rem}.asset-link-textarea[data-v-bb76bc55]{width:100%;resize:vertical;min-height:92px;box-sizing:border-box;border:1px solid var(--k-color-border, rgba(15, 23, 42, .1));border-radius:12px;background-color:var(--k-bg-panel, #f8fafc);color:var(--k-text-normal, #111827);padding:10px 12px;font:.8rem SFMono-Regular,Consolas,monospace;outline:none}.asset-link-textarea[data-v-bb76bc55]:focus{border-color:var(--k-color-primary, #2563eb);box-shadow:0 0 0 3px var(--memesluna-focus-ring);background-color:var(--k-bg-card, #ffffff)}.asset-import-actions[data-v-bb76bc55]{display:flex;justify-content:flex-end;gap:8px;margin-top:10px}.asset-gallery-section[data-v-bb76bc55]{border:1px solid var(--k-color-border, rgba(15, 23, 42, .08));border-radius:16px;background-color:var(--k-bg-card, #ffffff);box-shadow:none;overflow:hidden}.asset-gallery-toolbar[data-v-bb76bc55]{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:12px 14px;border-bottom:1px solid var(--k-color-border, rgba(15, 23, 42, .08))}.asset-tabs[data-v-bb76bc55],.asset-filter-bar[data-v-bb76bc55],.asset-view-toggle[data-v-bb76bc55]{display:flex;align-items:center;gap:6px}.asset-tabs[data-v-bb76bc55]{flex-wrap:wrap}.asset-tab[data-v-bb76bc55]{border:none;background:transparent;color:var(--k-text-muted, rgba(55, 53, 47, .62));border-radius:999px;padding:7px 11px;cursor:pointer;display:inline-flex;align-items:center;gap:7px;font-size:.8rem;font-weight:680}.asset-tab[data-v-bb76bc55]:hover,.asset-tab.active[data-v-bb76bc55]{color:var(--k-color-primary, #2563eb);background-color:var(--memesluna-primary-soft-bg)}.asset-tab span[data-v-bb76bc55]{min-width:20px;height:18px;display:inline-flex;align-items:center;justify-content:center;padding:0 6px;border-radius:999px;background-color:var(--k-bg-panel, rgba(15, 23, 42, .06));color:inherit;font-size:.7rem}.asset-filter-bar[data-v-bb76bc55]{flex:1;justify-content:flex-end;min-width:0}.asset-search-box[data-v-bb76bc55]{flex:1;max-width:320px;min-width:180px;height:36px;display:flex;align-items:center;gap:8px;padding:0 11px;border:1px solid var(--k-color-border, rgba(15, 23, 42, .1));border-radius:12px;background-color:var(--k-bg-card, #ffffff);color:var(--k-text-muted, rgba(55, 53, 47, .5))}.asset-search-box svg[data-v-bb76bc55]{width:16px;height:16px;flex:0 0 16px}.asset-search-box input[data-v-bb76bc55]{min-width:0;flex:1;border:none;background:transparent;color:var(--k-text-normal, #111827);outline:none;font:inherit;font-size:.8rem}.asset-select[data-v-bb76bc55]{height:36px;border:1px solid var(--k-color-border, rgba(15, 23, 42, .1));border-radius:12px;background-color:var(--k-bg-card, #ffffff);color:var(--k-text-normal, #111827);padding:0 10px;font-size:.78rem;font-weight:600;outline:none}.asset-view-toggle[data-v-bb76bc55]{padding:3px;border:1px solid var(--k-color-border, rgba(15, 23, 42, .1));border-radius:12px;background-color:var(--k-bg-panel, #f8fafc)}.asset-view-toggle button[data-v-bb76bc55]{width:30px;height:28px;border:none;border-radius:9px;background:transparent;color:var(--k-text-muted, rgba(55, 53, 47, .55));cursor:pointer;display:inline-flex;align-items:center;justify-content:center;padding:0}.asset-view-toggle button.active[data-v-bb76bc55]{background-color:var(--k-bg-card, #ffffff);color:var(--k-color-primary, #2563eb)}.notion-page-toolbar[data-v-bb76bc55]{display:flex;align-items:center;gap:8px;margin-bottom:20px;border-bottom:1px solid var(--k-color-border, rgba(55, 53, 47, .08));padding-bottom:8px}.toolbar-btn[data-v-bb76bc55]{background:transparent;border:none;font-size:.78rem;color:var(--k-text-muted, rgba(55, 53, 47, .6));cursor:pointer;display:inline-flex;align-items:center;padding:4px 10px;border-radius:4px;font-weight:500;transition:all .1s ease}.toolbar-btn[data-v-bb76bc55]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .04));color:var(--k-text-normal, #37352f)}.toolbar-btn.danger[data-v-bb76bc55]{color:var(--k-color-danger, #eb5757)}.toolbar-btn.danger[data-v-bb76bc55]:hover{background-color:var(--memesluna-danger-soft-bg)}.toolbar-divider[data-v-bb76bc55]{width:1px;height:14px;background-color:var(--k-color-border, rgba(55, 53, 47, .12))}.notion-properties-panel[data-v-bb76bc55]{margin-bottom:20px;display:flex;flex-direction:column;gap:6px}.property-row[data-v-bb76bc55]{display:flex;align-items:center;font-size:.82rem}.property-label[data-v-bb76bc55]{width:110px;color:var(--k-text-muted, rgba(55, 53, 47, .45));display:flex;align-items:center;gap:6px;-webkit-user-select:none;user-select:none}.prop-icon[data-v-bb76bc55]{font-size:.95rem}.property-value[data-v-bb76bc55]{flex:1}.property-input-text[data-v-bb76bc55]{border:none;background:transparent;font-size:.82rem;color:var(--k-text-normal, #37352f);width:100%;padding:4px 8px;border-radius:4px;box-sizing:border-box;font-family:inherit;transition:background .1s ease}.property-input-text[data-v-bb76bc55]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .03))}.property-input-text[data-v-bb76bc55]:focus{background-color:var(--k-bg-card, #ffffff);box-shadow:inset 0 0 0 1px var(--k-color-primary, #2383e2);outline:none}.notion-callout[data-v-bb76bc55]{display:flex;gap:12px;padding:14px 16px;border-radius:4px;background-color:var(--k-bg-panel, rgba(242, 241, 237, .45));border:1px solid var(--k-color-border, rgba(55, 53, 47, .08))}.callout-icon[data-v-bb76bc55]{font-size:1.15rem;-webkit-user-select:none;user-select:none}.callout-content[data-v-bb76bc55]{flex:1;min-width:0}.callout-title[data-v-bb76bc55]{font-weight:600;font-size:.85rem;color:var(--k-text-normal, #37352f);margin-bottom:2px}.callout-desc[data-v-bb76bc55]{font-size:.75rem;color:var(--k-text-muted, rgba(55, 53, 47, .5));margin-bottom:10px;line-height:1.4}.callout-actions[data-v-bb76bc55]{display:flex;gap:8px}.btn-small[data-v-bb76bc55]{font-size:.75rem;padding:2px 10px;height:24px}.hidden-file-input[data-v-bb76bc55]{display:none}.sidebar-drop-zone-overlay[data-v-bb76bc55]{position:fixed;top:0;left:0;width:100%;height:100%;z-index:9999;background-color:var(--memesluna-drop-overlay-bg);display:flex;align-items:center;justify-content:center;padding:40px;box-sizing:border-box}.drop-overlay-box[data-v-bb76bc55]{border:2px dashed var(--k-color-primary, #2383e2);background-color:var(--memesluna-primary-faint-bg);border-radius:8px;width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;color:var(--k-color-primary, #2383e2);font-size:1.1rem;font-weight:500}.drop-overlay-box .drop-icon[data-v-bb76bc55]{width:48px;height:48px;margin-bottom:16px}.gallery-view-switcher[data-v-bb76bc55]{display:flex;gap:16px;border-bottom:1px solid var(--k-color-border, rgba(55, 53, 47, .09));padding-bottom:2px}.gallery-tab-btn[data-v-bb76bc55]{background:transparent;border:none;font-size:.82rem;color:var(--k-text-muted, rgba(55, 53, 47, .5));cursor:pointer;padding-bottom:6px;border-bottom:2px solid transparent;font-weight:500;transition:all .1s ease}.gallery-tab-btn[data-v-bb76bc55]:hover{color:var(--k-text-normal, #37352f)}.gallery-tab-btn.active[data-v-bb76bc55]{color:var(--k-text-normal, #37352f);border-bottom-color:var(--k-text-normal, #37352f)}.gallery-tab-content[data-v-bb76bc55]{padding:14px;margin-top:0}.gallery-bulk-toolbar[data-v-bb76bc55]{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:0 auto 12px;padding:9px 10px;border:1px solid var(--k-color-border, rgba(15, 23, 42, .1));border-radius:14px;background-color:var(--memesluna-floating-action-bg);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.gallery-bulk-toolbar.floating[data-v-bb76bc55]{position:sticky;top:8px;z-index:40;max-width:920px}.bulk-status[data-v-bb76bc55]{display:flex;align-items:center;gap:8px;min-width:0}.bulk-title[data-v-bb76bc55]{font-size:.82rem;font-weight:720;color:var(--k-text-normal, #37352f)}.bulk-meta[data-v-bb76bc55]{font-size:.72rem;color:var(--k-text-muted, rgba(55, 53, 47, .55))}.bulk-actions[data-v-bb76bc55],.bulk-move-group[data-v-bb76bc55]{display:flex;align-items:center;gap:6px;flex-wrap:wrap;justify-content:flex-end}.toolbar-btn.compact[data-v-bb76bc55]{font-size:.74rem;padding:5px 9px;border-radius:10px}.toolbar-btn[data-v-bb76bc55]:disabled{opacity:.45;cursor:not-allowed}.compact-select[data-v-bb76bc55]{height:30px;padding:2px 9px;font-size:.74rem;border-radius:10px}.notion-gallery-grid[data-v-bb76bc55]{display:grid;grid-template-columns:repeat(auto-fill,minmax(174px,1fr));gap:7px}.notion-gallery-card[data-v-bb76bc55]{background:transparent;border:none;border-radius:12px;position:relative;aspect-ratio:4 / 3;transition:opacity .15s ease;box-shadow:none;overflow:hidden}.notion-gallery-card[data-v-bb76bc55]:hover,.notion-gallery-card.selected[data-v-bb76bc55]{box-shadow:none}.notion-gallery-card.selected .gallery-img-container[data-v-bb76bc55]{box-shadow:inset 0 0 0 2px var(--k-color-primary, #2563eb)}.notion-gallery-card.external .gallery-img-container[data-v-bb76bc55]{background-color:var(--k-bg-card, #ffffff)}.gallery-select-toggle[data-v-bb76bc55]{position:absolute;top:9px;left:9px;z-index:12;width:24px;height:24px;border:1px solid rgba(255,255,255,.82);border-radius:999px;background-color:var(--memesluna-floating-action-bg);box-shadow:none;color:var(--k-color-primary, #2383e2);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;opacity:0;transition:opacity .12s ease,border-color .12s ease}.gallery-select-toggle svg[data-v-bb76bc55]{width:14px;height:14px}.notion-gallery-card:hover .gallery-select-toggle[data-v-bb76bc55],.notion-gallery-card.selected .gallery-select-toggle[data-v-bb76bc55]{opacity:1}.gallery-img-container[data-v-bb76bc55]{width:100%;height:100%;background-color:var(--k-bg-panel, #f7f7f5);display:flex;align-items:center;justify-content:center;overflow:hidden;border-radius:12px;box-shadow:inset 0 0 0 1px #0f172a14}.gallery-img[data-v-bb76bc55]{width:100%;height:100%;object-fit:cover}.image-format-badge[data-v-bb76bc55]{position:absolute;right:8px;bottom:8px;z-index:12;padding:2px 6px;border-radius:7px;background:#0f172a9e;color:#fff;font-size:.68rem;font-weight:700;line-height:1.1}.image-format-badge.external[data-v-bb76bc55]{background:#0d9488d1}.gallery-list-meta[data-v-bb76bc55]{display:none}.notion-gallery-grid.list-mode[data-v-bb76bc55]{grid-template-columns:1fr;gap:8px}.notion-gallery-grid.list-mode .notion-gallery-card[data-v-bb76bc55]{aspect-ratio:auto;min-height:76px;display:grid;grid-template-columns:96px 1fr;align-items:center;gap:12px;padding:8px;border:1px solid var(--k-color-border, rgba(15, 23, 42, .08));background-color:var(--k-bg-card, #ffffff)}.notion-gallery-grid.list-mode .gallery-img-container[data-v-bb76bc55]{height:68px}.notion-gallery-grid.list-mode .gallery-list-meta[data-v-bb76bc55]{display:block;min-width:0;padding-right:88px}.gallery-list-meta div[data-v-bb76bc55]{color:var(--k-text-normal, #111827);font-size:.82rem;font-weight:650;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gallery-list-meta span[data-v-bb76bc55]{display:block;margin-top:4px;color:var(--k-text-muted, rgba(55, 53, 47, .55));font-size:.72rem}.gallery-card-overlay[data-v-bb76bc55]{position:absolute;top:0;left:0;right:0;bottom:0;background:linear-gradient(to bottom,#00000047,#0000 35%,#0000);border-radius:12px;opacity:0;transition:opacity .15s ease;pointer-events:none;z-index:10}.notion-gallery-card:hover .gallery-card-overlay[data-v-bb76bc55],.notion-gallery-card-active-dropdown .gallery-card-overlay[data-v-bb76bc55]{opacity:1}.overlay-actions[data-v-bb76bc55]{position:absolute;top:8px;right:8px;display:flex;gap:6px;pointer-events:auto}.overlay-actions .card-action-btn[data-v-bb76bc55]{border:none;background-color:var(--memesluna-floating-action-bg);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);color:var(--k-text-normal, #37352f);font-size:.65rem;padding:3px 8px;border-radius:9px;cursor:pointer;font-weight:500;box-shadow:var(--memesluna-floating-shadow);transition:all .1s ease;display:flex;align-items:center;justify-content:center}.overlay-actions .card-action-btn.move[data-v-bb76bc55]:hover{background:var(--k-color-success, #2b8a5c);color:#fff}.overlay-actions .card-action-btn[data-v-bb76bc55]:hover{background:var(--k-bg-card, #ffffff);color:var(--k-color-primary, #2563eb)}.overlay-actions .card-action-btn.danger[data-v-bb76bc55]{color:var(--k-color-danger, #eb5757)}.overlay-actions .card-action-btn.danger[data-v-bb76bc55]:hover{background:var(--k-color-danger, #eb5757);color:#fff}.flat-input[data-v-bb76bc55],.flat-select[data-v-bb76bc55],.flat-textarea[data-v-bb76bc55]{box-sizing:border-box;padding:6px 10px;border:1px solid var(--k-color-border, rgba(15, 15, 15, .12));border-radius:4px;background:var(--k-bg-panel, rgba(242, 241, 237, .45));color:var(--k-text-normal, #37352f);font-size:.82rem;font-family:inherit;transition:background .1s ease,border-color .1s ease;outline:none}.flat-input[data-v-bb76bc55]:focus,.flat-select[data-v-bb76bc55]:focus,.flat-textarea[data-v-bb76bc55]:focus{border-color:var(--k-color-primary, #2383e2);background:var(--k-bg-card, #ffffff);box-shadow:0 0 0 2px var(--memesluna-focus-ring)}.flat-input[data-v-bb76bc55]::placeholder,.flat-textarea[data-v-bb76bc55]::placeholder,.property-input-text[data-v-bb76bc55]::placeholder{color:var(--k-text-muted, rgba(55, 53, 47, .45));opacity:.78}.flat-input[data-v-bb76bc55]:disabled{background:var(--k-bg-panel, rgba(55, 53, 47, .05));color:var(--k-text-muted, rgba(55, 53, 47, .4));cursor:not-allowed}.field-hint[data-v-bb76bc55]{font-size:.7rem;color:var(--k-text-muted, rgba(55, 53, 47, .45));margin-top:4px;display:block}.btn[data-v-bb76bc55]{box-sizing:border-box;padding:4px 14px;font-size:.82rem;font-weight:500;border-radius:4px;cursor:pointer;transition:all .1s ease;display:inline-flex;align-items:center;justify-content:center;height:32px;border:none}.btn-primary[data-v-bb76bc55]{background-color:var(--k-color-primary, #2383e2);color:#fff}.btn-primary[data-v-bb76bc55]:hover{background-color:var(--k-color-primary-shade, #1a6cb8)}.btn-secondary[data-v-bb76bc55]{background-color:var(--k-bg-card, #ffffff);color:var(--k-text-normal, #37352f);border:1px solid var(--k-color-border, rgba(55, 53, 47, .16))}.btn-secondary[data-v-bb76bc55]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .04))}.btn-danger[data-v-bb76bc55]{background-color:var(--k-color-danger, #eb5757);color:#fff}.btn-danger[data-v-bb76bc55]:hover{background-color:var(--k-color-danger-shade, #d44c4c)}.w-full[data-v-bb76bc55]{width:100%}.mt-2[data-v-bb76bc55]{margin-top:8px}.mt-3[data-v-bb76bc55]{margin-top:12px}.mt-4[data-v-bb76bc55]{margin-top:16px}.empty-placeholder-card[data-v-bb76bc55]{padding:60px 20px;text-align:center;border:1px dashed var(--k-color-border, rgba(55, 53, 47, .2));border-radius:8px;background-color:var(--k-bg-panel, rgba(55, 53, 47, .01))}.empty-icon[data-v-bb76bc55]{font-size:2.5rem;margin-bottom:12px}.empty-placeholder-card h3[data-v-bb76bc55]{font-size:.95rem;margin:0 0 6px;font-weight:600}.empty-placeholder-card p[data-v-bb76bc55]{font-size:.78rem;color:var(--k-text-muted, rgba(55, 53, 47, .5));margin:0}.empty-gallery[data-v-bb76bc55]{padding:36px;text-align:center;color:var(--k-text-muted, rgba(55, 53, 47, .4));background-color:var(--k-bg-panel, #f7f7f5);border-radius:6px;font-size:.78rem}.move-dropdown-container[data-v-bb76bc55]{position:relative}.move-dropdown-menu[data-v-bb76bc55]{position:absolute;top:100%;left:0;margin-top:4px;background-color:var(--k-bg-card, #ffffff);border:1px solid var(--k-color-border, rgba(55, 53, 47, .15));border-radius:6px;z-index:100;min-width:120px;width:max-content;box-sizing:border-box}.dropdown-item[data-v-bb76bc55]{border:none;background:transparent;width:100%;text-align:left;padding:4px 6px;font-size:.68rem;cursor:pointer;color:var(--k-text-normal, #37352f)}.dropdown-item[data-v-bb76bc55]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .04))}.pagination-container[data-v-bb76bc55]{display:flex;align-items:center;justify-content:center;gap:16px;margin-top:20px;padding-top:12px;border-top:1px solid var(--k-color-border, rgba(55, 53, 47, .06))}.page-indicator[data-v-bb76bc55]{font-size:.78rem;color:var(--k-text-muted, rgba(55, 53, 47, .6))}.page-btn[data-v-bb76bc55]{height:28px;padding:0 10px;font-size:.75rem}.links-list-container[data-v-bb76bc55]{border:1px solid var(--k-color-border, rgba(55, 53, 47, .09));border-radius:6px;overflow:hidden}.link-item-row[data-v-bb76bc55]{display:flex;justify-content:space-between;align-items:center;padding:8px 12px;border-bottom:1px solid var(--k-color-border, rgba(55, 53, 47, .06));background-color:var(--k-bg-card, #ffffff)}.link-item-row[data-v-bb76bc55]:last-child{border-bottom:none}.link-item-row[data-v-bb76bc55]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .015))}.link-url-wrapper[data-v-bb76bc55]{display:flex;align-items:center;gap:8px;flex:1;min-width:0;margin-right:16px}.bullet[data-v-bb76bc55]{color:var(--k-text-muted, rgba(55, 53, 47, .35));font-weight:700}.link-url-text[data-v-bb76bc55]{color:var(--k-text-muted, rgba(55, 53, 47, .65));font-family:SFMono-Regular,Consolas,monospace;font-size:.75rem;cursor:pointer}.link-url-text[data-v-bb76bc55]:hover{color:var(--k-color-primary, #2383e2);text-decoration:underline}.link-actions[data-v-bb76bc55]{display:flex;gap:6px}.staging-router-view[data-v-bb76bc55]{display:flex;flex-direction:column;gap:16px}.staging-page-header[data-v-bb76bc55]{margin-bottom:4px}.staging-header-actions[data-v-bb76bc55]{display:flex;align-items:center;gap:8px;flex-wrap:wrap;justify-content:flex-end}.similar-staging-view[data-v-bb76bc55]{display:flex;flex-direction:column;gap:16px}.similar-message[data-v-bb76bc55]{color:var(--k-text-muted, rgba(55, 53, 47, .58));font-size:.78rem;font-weight:650}.similar-group[data-v-bb76bc55]{display:flex;flex-direction:column;gap:10px;padding-top:12px;border-top:1px solid var(--k-color-border, rgba(15, 23, 42, .08))}.similar-group[data-v-bb76bc55]:first-of-type{padding-top:0;border-top:none}.similar-group-header[data-v-bb76bc55]{display:flex;align-items:center;justify-content:space-between;gap:12px}.similar-group-header h3[data-v-bb76bc55]{margin:0;color:var(--k-text-normal, #111827);font-size:.96rem;font-weight:750}.similar-group-header p[data-v-bb76bc55]{margin:4px 0 0;color:var(--k-text-muted, rgba(55, 53, 47, .58));font-size:.74rem}.staging-toolbar[data-v-bb76bc55]{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 0;border-top:1px solid var(--k-color-border, rgba(15, 23, 42, .06));border-bottom:1px solid var(--k-color-border, rgba(15, 23, 42, .06))}.staging-search-box[data-v-bb76bc55]{max-width:420px}.staging-count-pill[data-v-bb76bc55]{height:28px;display:inline-flex;align-items:center;padding:0 10px;border-radius:999px;background-color:var(--k-bg-panel, rgba(15, 23, 42, .05));color:var(--k-text-muted, rgba(55, 53, 47, .58));font-size:.76rem;font-weight:650;white-space:nowrap}.staging-empty-card[data-v-bb76bc55]{margin-top:8px}.staging-grid[data-v-bb76bc55]{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:14px}.staging-card[data-v-bb76bc55]{min-width:0;overflow:hidden;border:1px solid var(--k-color-border, rgba(15, 23, 42, .09));border-radius:8px;background-color:var(--k-bg-card, #ffffff);box-shadow:none}.staging-image-shell[data-v-bb76bc55]{width:100%;aspect-ratio:1 / 1;display:flex;align-items:center;justify-content:center;padding:0;border:none;border-bottom:1px solid var(--k-color-border, rgba(15, 23, 42, .08));background-color:var(--k-bg-panel, #f8fafc);cursor:pointer}.staging-image[data-v-bb76bc55]{width:100%;height:100%;object-fit:contain;display:block}.staging-card-body[data-v-bb76bc55]{padding:12px;display:flex;flex-direction:column;gap:10px}.staging-title-row[data-v-bb76bc55]{display:flex;align-items:center;justify-content:space-between;gap:8px;min-width:0}.staging-title[data-v-bb76bc55]{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--k-text-normal, #111827);font-size:.86rem;font-weight:700}.staging-ext-tag[data-v-bb76bc55]{flex:0 0 auto;padding:2px 7px;border-radius:999px;background-color:var(--memesluna-primary-soft-bg);color:var(--k-color-primary, #2563eb);font-size:.66rem;font-weight:750}.staging-meta-grid[data-v-bb76bc55]{display:grid;grid-template-columns:1fr 1fr;gap:6px 10px;color:var(--k-text-muted, rgba(55, 53, 47, .58));font-size:.72rem;line-height:1.35}.staging-meta-grid span[data-v-bb76bc55]{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.staging-select[data-v-bb76bc55]{width:100%;height:34px}.staging-actions[data-v-bb76bc55]{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px}.staging-action-btn[data-v-bb76bc55]{min-width:0;width:100%;white-space:nowrap}.page-section-header[data-v-bb76bc55]{align-items:center;justify-content:space-between;gap:16px;margin-top:0;margin-bottom:14px}.page-section-header>div[data-v-bb76bc55]{min-width:0}.page-section-header .notion-main-title[data-v-bb76bc55]{margin:0;font-size:1.78rem;line-height:1.18;font-weight:700;color:var(--k-text-normal, #37352f)}.page-section-header .btn-notion[data-v-bb76bc55]{align-self:center}.section-desc.compact[data-v-bb76bc55]{margin:8px 0 0;max-width:620px;line-height:1.45}.endpoint-layout[data-v-bb76bc55]{display:flex;flex-direction:column;gap:16px}.notion-form-panel[data-v-bb76bc55]{padding:12px 0}.endpoint-editor-panel[data-v-bb76bc55]{padding:14px;border:1px solid var(--k-color-border, rgba(55, 53, 47, .08));border-radius:6px;background-color:var(--k-bg-card, #ffffff)}.panel-title-row[data-v-bb76bc55],.table-title-row[data-v-bb76bc55]{display:flex;align-items:center;justify-content:space-between;gap:12px}.notion-panel-title[data-v-bb76bc55]{font-size:1rem;font-weight:600;margin-top:0;margin-bottom:16px;color:var(--k-text-normal, #37352f)}.panel-title-row .notion-panel-title[data-v-bb76bc55],.table-title-row .notion-panel-title[data-v-bb76bc55]{margin-bottom:0}.table-count[data-v-bb76bc55]{font-size:.72rem;color:var(--k-text-muted, rgba(55, 53, 47, .5))}.form-fields[data-v-bb76bc55]{display:flex;flex-direction:column;gap:12px}.form-group[data-v-bb76bc55]{display:flex;flex-direction:column}.endpoint-form-grid[data-v-bb76bc55]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:14px}.span-2[data-v-bb76bc55]{grid-column:1 / -1}.form-group label[data-v-bb76bc55]{font-size:.75rem;font-weight:600;color:var(--k-text-muted, rgba(55, 53, 47, .65));margin-bottom:4px}.form-row[data-v-bb76bc55]{display:flex;gap:10px}.form-actions[data-v-bb76bc55]{display:flex;gap:8px;margin-top:8px}.flex-grow[data-v-bb76bc55]{flex:1}.endpoint-preview[data-v-bb76bc55]{display:flex;align-items:center;gap:8px;padding:7px 10px;border-radius:4px;background-color:var(--k-bg-panel, rgba(55, 53, 47, .04))}.endpoint-preview span[data-v-bb76bc55]{color:var(--k-text-muted, rgba(55, 53, 47, .5));font-size:.72rem;font-weight:600;flex-shrink:0}.endpoint-preview code[data-v-bb76bc55]{color:var(--k-color-primary, #2383e2);font-family:SFMono-Regular,Consolas,monospace;font-size:.74rem;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.notion-table-panel[data-v-bb76bc55]{padding:12px 0}.table-title-row[data-v-bb76bc55]{margin-bottom:8px}.table-container[data-v-bb76bc55]{overflow-x:auto;border:1px solid var(--k-color-border, rgba(55, 53, 47, .08));border-radius:6px;background-color:var(--k-bg-card, #ffffff)}.flat-table[data-v-bb76bc55]{width:100%;border-collapse:collapse;font-size:.78rem}.flat-table th[data-v-bb76bc55]{padding:8px 12px;background-color:var(--k-bg-panel, #f7f7f5);border-bottom:1px solid var(--k-color-border, rgba(55, 53, 47, .08));color:var(--k-text-muted, rgba(55, 53, 47, .55));font-weight:600;font-size:.72rem;text-transform:uppercase;text-align:left}.flat-table td[data-v-bb76bc55]{padding:10px 12px;border-bottom:1px solid var(--k-color-border, rgba(55, 53, 47, .05));text-align:left}.flat-table tr:last-child td[data-v-bb76bc55]{border-bottom:none}.empty-cell[data-v-bb76bc55]{text-align:center;padding:40px!important;color:var(--k-text-muted, rgba(55, 53, 47, .35))}.endpoint-name[data-v-bb76bc55]{font-weight:600}.group-badge[data-v-bb76bc55]{display:inline-block;background-color:var(--k-bg-panel, rgba(55, 53, 47, .06));color:var(--k-text-muted, rgba(55, 53, 47, .6));padding:1px 6px;border-radius:3px;font-size:.65rem;font-weight:500;margin-top:4px}.cell-desc[data-v-bb76bc55]{color:var(--k-text-muted, rgba(55, 53, 47, .55));max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.method-tag[data-v-bb76bc55]{font-size:.65rem;font-weight:600;padding:1px 5px;border-radius:3px;text-transform:uppercase;margin-right:6px}.method-tag.redirect[data-v-bb76bc55]{background-color:var(--memesluna-primary-soft-bg);color:var(--k-color-primary, #2383e2)}.link-text[data-v-bb76bc55]{font-weight:500;color:var(--k-color-primary, #2383e2);cursor:pointer}.link-text[data-v-bb76bc55]:hover{text-decoration:underline}.target-url[data-v-bb76bc55]{font-size:.72rem;color:var(--k-text-muted, rgba(55, 53, 47, .4));max-width:300px;margin-top:2px}.url-line[data-v-bb76bc55]{display:flex;align-items:center;gap:4px}.font-mono[data-v-bb76bc55]{font-family:SFMono-Regular,Consolas,monospace}.truncate[data-v-bb76bc55]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.action-buttons[data-v-bb76bc55]{display:flex;justify-content:flex-end;gap:4px}.icon-btn[data-v-bb76bc55]{background:transparent;border:1px solid var(--k-color-border, rgba(55, 53, 47, .15));border-radius:4px;padding:3px;cursor:pointer;color:var(--k-text-muted, rgba(55, 53, 47, .55));display:inline-flex}.icon-btn svg[data-v-bb76bc55]{width:12px;height:12px}.icon-btn.hover-bg[data-v-bb76bc55]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .04));color:var(--k-text-normal, #37352f)}.icon-btn.hover-danger[data-v-bb76bc55]:hover{background-color:var(--memesluna-danger-soft-bg);border-color:var(--memesluna-danger-border);color:var(--k-color-danger, #eb5757)}.icon-btn-inline[data-v-bb76bc55]{background:transparent;border:none;cursor:pointer;color:var(--k-text-muted, rgba(55, 53, 47, .35));display:inline-flex;padding:0;vertical-align:middle}.icon-btn-inline[data-v-bb76bc55]:hover{color:var(--k-color-primary, #2383e2)}.icon-btn-inline svg[data-v-bb76bc55]{width:10px;height:10px}.settings-preview-panel[data-v-bb76bc55]{width:100%;max-width:none;margin:0 auto}.preview-page-header[data-v-bb76bc55]{margin-bottom:12px}.preview-dashboard-grid[data-v-bb76bc55]{display:grid;grid-template-columns:minmax(560px,1fr) minmax(420px,.9fr);gap:22px;align-items:start}.preview-card[data-v-bb76bc55]{min-width:0;border:1px solid var(--k-color-border, rgba(15, 23, 42, .09));border-radius:14px;background-color:var(--k-bg-card, #ffffff);box-shadow:0 10px 32px #0f172a0f;overflow:hidden}.preview-card-header[data-v-bb76bc55]{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;padding:18px 20px 16px;border-bottom:1px solid var(--k-color-border, rgba(15, 23, 42, .08))}.preview-card-title[data-v-bb76bc55]{color:var(--k-text-normal, #111827);font-size:1rem;line-height:1.25;font-weight:760}.preview-card-desc[data-v-bb76bc55]{margin-top:5px;color:var(--k-text-muted, rgba(55, 53, 47, .56));font-size:.76rem;line-height:1.45}.preview-action-btn[data-v-bb76bc55]{height:32px;padding:0 11px;border:1px solid var(--k-color-border, rgba(15, 23, 42, .1));border-radius:8px;background-color:var(--k-bg-card, #ffffff);color:var(--k-text-normal, #111827);font-size:.76rem;font-weight:650;cursor:pointer;white-space:nowrap}.preview-action-btn[data-v-bb76bc55]:hover:not(:disabled){background-color:var(--k-bg-panel, #f8fafc)}.preview-action-btn[data-v-bb76bc55]:disabled{opacity:.45;cursor:not-allowed}.preview-table-wrap[data-v-bb76bc55]{overflow-x:auto}.preview-route-table[data-v-bb76bc55]{width:100%;border-collapse:collapse;table-layout:fixed}.preview-route-table th[data-v-bb76bc55],.preview-route-table td[data-v-bb76bc55]{padding:12px 14px;border-bottom:1px solid var(--k-color-border, rgba(15, 23, 42, .06));text-align:left;vertical-align:middle}.preview-route-table th[data-v-bb76bc55]{background-color:var(--k-bg-panel, #f8fafc);color:var(--k-text-muted, rgba(55, 53, 47, .54));font-size:.7rem;font-weight:740}.preview-route-table tr:last-child td[data-v-bb76bc55]{border-bottom:none}.preview-route-table th[data-v-bb76bc55]:nth-child(1),.preview-route-table td[data-v-bb76bc55]:nth-child(1){width:86px}.preview-route-table th[data-v-bb76bc55]:nth-child(2),.preview-route-table td[data-v-bb76bc55]:nth-child(2){width:130px}.preview-route-table th[data-v-bb76bc55]:nth-child(4),.preview-route-table td[data-v-bb76bc55]:nth-child(4){width:186px}.preview-route-table th[data-v-bb76bc55]:nth-child(5),.preview-route-table td[data-v-bb76bc55]:nth-child(5){width:64px;text-align:center}.preview-mini-cover[data-v-bb76bc55]{width:58px;height:42px;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1px;overflow:hidden;border-radius:8px;background-color:var(--k-color-border, rgba(15, 23, 42, .08))}.preview-mini-cover.single[data-v-bb76bc55]{display:block}.preview-mini-cover img[data-v-bb76bc55]{width:100%;height:100%;object-fit:cover;background-color:var(--k-bg-panel, #f7f7f5)}.preview-route-icon[data-v-bb76bc55]{width:58px;height:42px;display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:var(--memesluna-primary-faint-bg);color:var(--k-color-primary, #2383e2);font-size:.7rem;font-weight:760}.preview-route-icon.endpoint[data-v-bb76bc55]{background-color:var(--memesluna-success-soft-bg);color:var(--k-color-success, #2b8a5c)}.preview-route-name[data-v-bb76bc55]{min-width:0;color:var(--k-text-normal, #111827);font-size:.84rem;font-weight:730;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.preview-route-type[data-v-bb76bc55]{display:inline-flex;align-items:center;margin-top:5px;padding:2px 6px;border-radius:999px;background-color:var(--memesluna-primary-soft-bg);color:var(--k-color-primary, #2383e2);font-size:.66rem;font-weight:700}.preview-route-type.endpoint[data-v-bb76bc55]{background-color:var(--memesluna-success-soft-bg);color:var(--k-color-success, #2b8a5c)}.preview-route-desc[data-v-bb76bc55]{color:var(--k-text-muted, rgba(55, 53, 47, .64));font-size:.78rem;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;line-clamp:3;line-height:1.45;max-height:4.35em}.preview-route-path[data-v-bb76bc55]{display:block;max-width:100%;padding:6px 8px;border-radius:7px;background-color:var(--memesluna-primary-faint-bg);color:var(--k-color-primary, #2383e2);font-family:SFMono-Regular,Consolas,monospace;font-size:.72rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer}.preview-row-actions[data-v-bb76bc55]{display:flex;align-items:center;justify-content:center}.preview-empty-state[data-v-bb76bc55]{padding:64px 20px;color:var(--k-text-muted, rgba(55, 53, 47, .48));text-align:center;font-size:.82rem}.preview-prompt-container[data-v-bb76bc55]{display:flex;flex-direction:column;gap:12px}.preview-sub-title[data-v-bb76bc55]{font-size:.72rem;font-weight:600;color:var(--k-text-muted, rgba(55, 53, 47, .45));text-transform:uppercase}.preview-sub-desc[data-v-bb76bc55]{margin-top:2px;font-size:.72rem;color:var(--k-text-muted, rgba(55, 53, 47, .45))}.preview-block-header[data-v-bb76bc55]{display:flex;align-items:flex-end;justify-content:space-between;gap:12px}.preview-code-block[data-v-bb76bc55]{background-color:var(--k-bg-panel, #faf9f6);border:1px solid var(--k-color-border, rgba(55, 53, 47, .08));border-radius:6px;padding:12px;max-height:150px;overflow-y:auto}.preview-code-block pre[data-v-bb76bc55]{margin:0;font-family:SFMono-Regular,Consolas,monospace;font-size:.72rem;white-space:pre-wrap;word-break:break-all;color:var(--k-text-normal, #27272a)}.preview-code-block.final-prompt[data-v-bb76bc55]{max-height:620px;background-color:var(--memesluna-final-prompt-bg);border-color:var(--memesluna-primary-soft-bg)}.preview-code-block.polished[data-v-bb76bc55]{margin:16px;border-radius:12px;background:var(--memesluna-code-bg);border-color:var(--memesluna-code-border);box-shadow:none}.preview-code-block.final-prompt pre[data-v-bb76bc55]{color:var(--memesluna-code-text);font-size:.76rem;line-height:1.7}.text-gray-muted[data-v-bb76bc55]{color:var(--k-text-muted, rgba(55, 53, 47, .35));font-style:italic}.toast-banner[data-v-bb76bc55]{position:fixed;top:24px;right:24px;z-index:10000;display:flex;align-items:center;gap:8px;padding:10px 16px;border-radius:6px;font-size:.78rem;font-weight:500;background-color:var(--k-bg-card, #ffffff);border:1px solid var(--k-color-border, rgba(55, 53, 47, .15));box-shadow:var(--memesluna-card-shadow);color:var(--k-text-normal, #37352f)}.toast-banner.success[data-v-bb76bc55]{background-color:var(--memesluna-toast-success-bg);border-color:var(--memesluna-success-soft-bg);color:var(--k-color-success, #2b8a5c)}.toast-banner.error[data-v-bb76bc55]{background-color:var(--memesluna-toast-error-bg);border-color:var(--memesluna-danger-border);color:var(--k-color-danger, #eb5757)}.toast-icon[data-v-bb76bc55]{width:14px;height:14px;flex-shrink:0}.loading-container[data-v-bb76bc55]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:80px 0}.spinner[data-v-bb76bc55]{width:20px;height:20px;border:2px solid var(--k-color-border, rgba(55, 53, 47, .08));border-top-color:var(--k-text-normal, rgba(55, 53, 47, .6));border-radius:50%;animation:spin-bb76bc55 .8s linear infinite;margin-bottom:12px}@keyframes spin-bb76bc55{to{transform:rotate(360deg)}}.loading-container p[data-v-bb76bc55]{font-size:.78rem;color:var(--k-text-muted, rgba(55, 53, 47, .5));margin:0}.fade-enter-active[data-v-bb76bc55],.fade-leave-active[data-v-bb76bc55]{transition:opacity .15s ease,transform .15s ease}.fade-enter-from[data-v-bb76bc55],.fade-leave-to[data-v-bb76bc55]{opacity:0;transform:translateY(-8px)}@media (max-width: 1280px){.notion-content[data-v-bb76bc55]{padding:64px 80px 96px}.preview-dashboard-grid[data-v-bb76bc55]{grid-template-columns:1fr}.staging-grid[data-v-bb76bc55]{grid-template-columns:repeat(auto-fill,minmax(210px,1fr))}}@media (max-width: 780px){.memesluna-app-layout[data-v-bb76bc55]{padding-left:0}.notion-content[data-v-bb76bc55]{padding:18px 16px}.content-breadcrumb-header[data-v-bb76bc55],.notion-db-header[data-v-bb76bc55],.page-section-header[data-v-bb76bc55],.notion-page-header[data-v-bb76bc55],.gallery-bulk-toolbar[data-v-bb76bc55]{align-items:stretch;flex-direction:column}.notion-db-actions[data-v-bb76bc55],.bulk-actions[data-v-bb76bc55],.form-actions[data-v-bb76bc55],.staging-header-actions[data-v-bb76bc55],.collection-name-input-notion[data-v-bb76bc55],.notion-db-actions .btn[data-v-bb76bc55],.form-actions .btn[data-v-bb76bc55]{width:100%}.endpoint-form-grid[data-v-bb76bc55]{grid-template-columns:1fr}.span-2[data-v-bb76bc55]{grid-column:auto}.folders-grid[data-v-bb76bc55]{grid-template-columns:1fr}.notion-gallery-grid[data-v-bb76bc55]{grid-template-columns:repeat(auto-fill,minmax(130px,1fr))}.preview-block-header[data-v-bb76bc55],.preview-card-header[data-v-bb76bc55]{align-items:stretch;flex-direction:column}.preview-action-btn[data-v-bb76bc55]{width:100%}.staging-toolbar[data-v-bb76bc55]{align-items:stretch;flex-direction:column}.staging-search-box[data-v-bb76bc55]{max-width:none;width:100%}.preview-route-table[data-v-bb76bc55]{min-width:720px}}@media (max-width: 1180px){.asset-hero-panel[data-v-bb76bc55]{grid-template-columns:1fr}}@media (max-width: 980px){.detail-topbar[data-v-bb76bc55],.asset-gallery-toolbar[data-v-bb76bc55]{align-items:stretch;flex-direction:column}.detail-top-actions[data-v-bb76bc55],.asset-filter-bar[data-v-bb76bc55]{justify-content:flex-start}.asset-filter-bar[data-v-bb76bc55]{flex-wrap:wrap}.asset-search-box[data-v-bb76bc55]{max-width:none;width:100%}}@media (max-width: 640px){.asset-hero-panel[data-v-bb76bc55]{padding:14px;border-radius:14px}.asset-identity-card[data-v-bb76bc55]{align-items:flex-start}.asset-avatar-frame[data-v-bb76bc55]{width:72px;height:72px;flex-basis:72px;border-radius:14px}.asset-title-row h1[data-v-bb76bc55]{font-size:1.35rem}.asset-api-row[data-v-bb76bc55]{grid-template-columns:1fr}.asset-tabs[data-v-bb76bc55],.detail-top-actions[data-v-bb76bc55]{width:100%}.asset-btn[data-v-bb76bc55]{flex:1}.notion-gallery-grid[data-v-bb76bc55]{grid-template-columns:repeat(auto-fill,minmax(138px,1fr))}.staging-grid[data-v-bb76bc55],.staging-actions[data-v-bb76bc55]{grid-template-columns:1fr}}
|
|
1
|
+
.memesluna-app-layout[data-v-b8acd784]{min-height:100vh;padding-left:64px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,"Segoe UI Emoji","Apple Color Emoji";background-color:var(--k-bg-card, #ffffff);color:var(--k-text-normal, #37352f);box-sizing:border-box;color-scheme:light;--k-bg-card: var(--k-card-bg, #ffffff);--k-bg-panel: var(--k-hover-bg, #f7f7f5);--k-bg-button-hover: var(--k-hover-bg, rgba(55, 53, 47, .04));--k-text-muted: var(--k-text-light, rgba(55, 53, 47, .55));--memesluna-drop-overlay-bg: rgba(255, 255, 255, .85);--memesluna-floating-action-bg: rgba(255, 255, 255, .92);--memesluna-floating-shadow: none;--memesluna-focus-ring: rgba(35, 131, 226, .15);--memesluna-primary-soft-bg: rgba(35, 131, 226, .1);--memesluna-primary-faint-bg: rgba(35, 131, 226, .04);--memesluna-success-soft-bg: rgba(43, 138, 92, .1);--memesluna-danger-soft-bg: rgba(235, 87, 87, .08);--memesluna-danger-border: rgba(235, 87, 87, .25);--memesluna-toast-success-bg: #f2f9f5;--memesluna-toast-error-bg: #fdf2f2;--memesluna-final-prompt-bg: rgba(35, 131, 226, .02);--memesluna-final-prompt-text: #1e3a8a;--memesluna-code-bg: #ffffff;--memesluna-code-text: #111827;--memesluna-code-border: rgba(15, 23, 42, .09);--memesluna-soft-shadow: none;--memesluna-card-shadow: none;--memesluna-popover-shadow: none}html.dark .memesluna-app-layout,.theme-root.dark .memesluna-app-layout{color-scheme:dark;--k-bg-card: var(--k-card-bg, #252529);--k-bg-panel: var(--k-hover-bg, #303036);--k-bg-button-hover: var(--k-hover-bg, rgba(255, 255, 255, .06));--k-text-muted: var(--k-text-light, rgba(235, 235, 245, .62));--memesluna-drop-overlay-bg: rgba(20, 20, 24, .82);--memesluna-floating-action-bg: rgba(42, 42, 48, .94);--memesluna-floating-shadow: none;--memesluna-focus-ring: rgba(64, 158, 255, .24);--memesluna-primary-soft-bg: rgba(64, 158, 255, .16);--memesluna-primary-faint-bg: rgba(64, 158, 255, .1);--memesluna-success-soft-bg: rgba(103, 194, 58, .16);--memesluna-danger-soft-bg: rgba(235, 87, 87, .16);--memesluna-danger-border: rgba(235, 87, 87, .34);--memesluna-toast-success-bg: rgba(43, 138, 92, .16);--memesluna-toast-error-bg: rgba(235, 87, 87, .16);--memesluna-final-prompt-bg: rgba(64, 158, 255, .12);--memesluna-final-prompt-text: var(--k-color-primary-tint, #8ab4f8);--memesluna-code-bg: #000000;--memesluna-code-text: #f8fafc;--memesluna-code-border: rgba(255, 255, 255, .14);--memesluna-soft-shadow: none;--memesluna-card-shadow: none;--memesluna-popover-shadow: none}.notion-content[data-v-b8acd784]{padding:80px 112px 112px;box-sizing:border-box;max-width:1880px;margin:0 auto}.content-breadcrumb-header[data-v-b8acd784]{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px;padding-bottom:12px;border-bottom:1px solid var(--k-color-border, rgba(55, 53, 47, .08))}.breadcrumbs[data-v-b8acd784]{display:flex;align-items:center;gap:8px;font-size:.82rem;color:var(--k-text-muted, rgba(55, 53, 47, .5))}.crumb-root[data-v-b8acd784]{font-weight:500}.crumb-parent[data-v-b8acd784]{color:var(--k-text-normal, #37352f);font-weight:500}.crumb-child.active[data-v-b8acd784]{color:var(--k-color-primary, #2383e2);font-weight:600}.crumb-separator[data-v-b8acd784]{color:var(--k-color-border, rgba(55, 53, 47, .25))}.header-quick-stats[data-v-b8acd784]{display:flex;gap:8px}.stat-bubble[data-v-b8acd784]{font-size:.72rem;font-weight:500;background-color:var(--k-bg-panel, rgba(55, 53, 47, .05));color:var(--k-text-muted, rgba(55, 53, 47, .65));padding:2px 8px;border-radius:4px}.notion-view-switcher[data-v-b8acd784]{display:flex;align-items:center;gap:4px;border-bottom:1px solid var(--k-color-border, rgba(55, 53, 47, .08));margin-bottom:24px;padding-bottom:2px}.switcher-btn[data-v-b8acd784]{background:transparent;border:none;padding:6px 16px;font-size:.85rem;font-weight:500;color:var(--k-text-muted, rgba(55, 53, 47, .5));cursor:pointer;display:flex;align-items:center;gap:6px;transition:background .1s ease,color .1s ease;border-bottom:2px solid transparent;border-radius:4px 4px 0 0;margin-bottom:-1px}.switcher-btn[data-v-b8acd784]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .04));color:var(--k-text-normal, #37352f)}.switcher-btn.active[data-v-b8acd784]{color:var(--k-text-normal, #37352f);border-bottom:2px solid var(--k-text-normal, #37352f);font-weight:600;border-radius:0}.switcher-icon[data-v-b8acd784]{font-size:.95rem}.notion-db-header[data-v-b8acd784]{display:flex;justify-content:space-between;align-items:center;margin-top:12px;margin-bottom:12px}.collection-list-header[data-v-b8acd784]{gap:20px;justify-content:flex-end}.collection-title-group[data-v-b8acd784]{display:flex;align-items:center;gap:22px;min-width:0}.notion-db-title[data-v-b8acd784]{font-size:1.24rem;font-weight:700;margin:0;color:var(--k-text-normal, #37352f);white-space:nowrap}.collection-total-count[data-v-b8acd784]{color:var(--k-text-muted, rgba(55, 53, 47, .58));font-size:.82rem;white-space:nowrap}.notion-db-actions[data-v-b8acd784]{display:flex;align-items:center;gap:8px}.collection-toolbar[data-v-b8acd784]{flex-wrap:nowrap;justify-content:flex-end}.collection-search-shell[data-v-b8acd784],.collection-filter-shell[data-v-b8acd784]{position:relative;display:inline-flex;align-items:center;color:var(--k-text-muted, rgba(55, 53, 47, .52))}.collection-toolbar-icon[data-v-b8acd784]{position:absolute;right:11px;width:15px;height:15px;pointer-events:none;color:currentColor;z-index:1}.collection-search-shell .collection-search-input[data-v-b8acd784]{width:280px;height:36px;padding-left:12px;padding-right:36px;border-radius:6px;font-size:.82rem;background-color:var(--k-bg-card, #ffffff)}.collection-filter-shell .collection-filter-select[data-v-b8acd784]{width:128px;height:36px;padding-left:12px;padding-right:36px;border-radius:6px;font-size:.82rem;background-color:var(--k-bg-card, #ffffff);cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none}.collection-name-input-notion[data-v-b8acd784]{width:200px;height:28px;font-size:.78rem}.btn-notion[data-v-b8acd784]{height:36px;padding:0 14px;gap:6px;border-radius:6px;font-size:.84rem;font-weight:600;white-space:nowrap}.btn-plus[data-v-b8acd784]{font-size:1rem;line-height:1}.notion-hr[data-v-b8acd784]{border:none;border-top:1px solid var(--k-color-border, rgba(55, 53, 47, .09));margin:8px 0 20px}.folders-grid[data-v-b8acd784]{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:20px 24px}.folder-card[data-v-b8acd784]{background:var(--k-bg-card, #ffffff);border:1px solid var(--k-color-border, rgba(15, 23, 42, .09));border-radius:8px;overflow:hidden;cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease,transform .15s ease;display:flex;flex-direction:column;min-width:0;box-shadow:0 2px 8px #0f172a0d}.folder-card[data-v-b8acd784]:hover{border-color:#2383e247;box-shadow:0 8px 24px #0f172a14;transform:translateY(-1px)}.folder-cover[data-v-b8acd784]{position:relative;aspect-ratio:2.18 / 1;min-height:132px;background-color:var(--k-bg-panel, #f7f7f5);border-bottom:1px solid var(--k-color-border, rgba(15, 23, 42, .08));display:grid;grid-template-columns:repeat(3,minmax(0,1fr));grid-template-rows:repeat(2,minmax(0,1fr));gap:1px;overflow:hidden}.folder-cover.has-preview[data-v-b8acd784]{background-color:var(--k-color-border, rgba(15, 23, 42, .08))}.folder-cover.empty[data-v-b8acd784]{display:flex;align-items:center;justify-content:center;color:var(--k-text-muted, rgba(55, 53, 47, .4))}.folder-card:hover .folder-cover.empty[data-v-b8acd784]{color:var(--k-text-muted, rgba(55, 53, 47, .55));background-color:var(--k-bg-button-hover, #f1f1ef)}.folder-cover-empty svg[data-v-b8acd784]{width:32px;height:32px}.folder-cover-img[data-v-b8acd784]{width:100%;height:100%;object-fit:cover;background-color:var(--k-bg-panel, #f7f7f5)}.folder-cover-badge[data-v-b8acd784]{position:absolute;right:8px;bottom:8px;padding:1px 6px;border-radius:3px;background-color:var(--memesluna-floating-action-bg);box-shadow:var(--memesluna-floating-shadow);color:var(--k-text-muted, rgba(55, 53, 47, .6));font-size:.65rem;font-weight:500}.folder-body[data-v-b8acd784]{padding:15px 16px 16px;flex:1;display:flex;flex-direction:column;box-sizing:border-box;min-height:108px}.folder-title-row[data-v-b8acd784]{position:relative;display:flex;align-items:center;justify-content:space-between;gap:10px}.folder-name[data-v-b8acd784]{min-width:0;font-size:.96rem;font-weight:700;color:var(--k-text-normal, #37352f);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.folder-more-btn[data-v-b8acd784]{width:26px;height:26px;border:none;border-radius:5px;background:transparent;color:var(--k-text-muted, rgba(55, 53, 47, .56));display:inline-flex;align-items:center;justify-content:center;padding:0;cursor:pointer;flex-shrink:0}.folder-more-btn[data-v-b8acd784]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .06));color:var(--k-text-normal, #37352f)}.folder-more-btn svg[data-v-b8acd784]{width:17px;height:17px}.folder-action-menu[data-v-b8acd784]{position:absolute;right:0;top:30px;min-width:112px;padding:5px;border-radius:6px;background-color:var(--k-bg-card, #ffffff);border:1px solid var(--k-color-border, rgba(15, 23, 42, .12));box-shadow:0 10px 28px #0f172a24;z-index:20}.folder-action-menu button[data-v-b8acd784]{width:100%;height:28px;padding:0 9px;border:none;border-radius:4px;background:transparent;color:var(--k-text-normal, #37352f);text-align:left;font:inherit;font-size:.78rem;cursor:pointer}.folder-action-menu button[data-v-b8acd784]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .06))}.folder-action-menu button.danger[data-v-b8acd784]{color:var(--k-color-danger, #eb5757)}.folder-info-row[data-v-b8acd784]{display:flex;justify-content:space-between;align-items:center;margin-top:9px;gap:8px}.folder-count[data-v-b8acd784]{color:var(--k-text-muted, rgba(55, 53, 47, .62));font-size:.86rem;line-height:1.4;white-space:nowrap}.folder-meta-row[data-v-b8acd784]{display:flex;align-items:center;min-width:0}.folder-meta-item[data-v-b8acd784]{min-width:0;display:inline-flex;align-items:center;gap:5px;color:var(--k-text-muted, rgba(55, 53, 47, .6));font-size:.8rem;line-height:1.35;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.folder-meta-item svg[data-v-b8acd784]{width:15px;height:15px;flex-shrink:0}.collection-detail-layout[data-v-b8acd784]{margin-top:4px}.asset-detail-shell[data-v-b8acd784]{display:flex;flex-direction:column;gap:14px}.detail-topbar[data-v-b8acd784]{display:flex;align-items:center;justify-content:space-between;gap:16px;padding-bottom:8px}.detail-breadcrumbs[data-v-b8acd784]{display:flex;align-items:center;gap:8px;min-width:0;color:var(--k-text-muted, rgba(55, 53, 47, .58));font-size:.82rem}.detail-back-btn[data-v-b8acd784]{border:none;background:transparent;color:inherit;display:inline-flex;align-items:center;gap:5px;padding:5px 7px;border-radius:8px;cursor:pointer;font:inherit}.detail-back-btn[data-v-b8acd784]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .05));color:var(--k-text-normal, #111827)}.detail-back-btn svg[data-v-b8acd784],.asset-btn svg[data-v-b8acd784],.asset-icon-btn svg[data-v-b8acd784],.asset-test-btn svg[data-v-b8acd784],.asset-view-toggle svg[data-v-b8acd784]{width:16px;height:16px;flex:0 0 16px}.detail-separator[data-v-b8acd784]{color:var(--k-color-border, rgba(55, 53, 47, .3))}.detail-crumb-current[data-v-b8acd784],.detail-crumb-strong[data-v-b8acd784]{color:var(--k-text-normal, #111827);font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.detail-top-actions[data-v-b8acd784]{display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:wrap}.asset-btn[data-v-b8acd784],.asset-icon-btn[data-v-b8acd784],.asset-test-btn[data-v-b8acd784]{border:1px solid var(--k-color-border, rgba(15, 23, 42, .1));background-color:var(--k-bg-card, #ffffff);color:var(--k-text-normal, #111827);border-radius:12px;min-height:36px;padding:0 13px;display:inline-flex;align-items:center;justify-content:center;gap:7px;font-size:.8rem;font-weight:650;cursor:pointer;box-shadow:none;transition:border-color .15s ease,background-color .15s ease,color .15s ease}.asset-btn[data-v-b8acd784]:hover,.asset-icon-btn[data-v-b8acd784]:hover,.asset-test-btn[data-v-b8acd784]:hover{background-color:var(--k-bg-panel, #f8fafc)}.asset-btn.primary[data-v-b8acd784],.asset-test-btn[data-v-b8acd784]{border-color:transparent;background:#1f6feb;color:#fff;box-shadow:none}.asset-btn.primary[data-v-b8acd784]:hover,.asset-test-btn[data-v-b8acd784]:hover{background:#1a5fd0}.asset-btn.secondary[data-v-b8acd784]{background-color:var(--k-bg-card, #ffffff)}.asset-btn.ghost[data-v-b8acd784]{width:36px;padding:0}.asset-btn.danger[data-v-b8acd784]{color:var(--k-color-danger, #eb5757)}.asset-btn.danger[data-v-b8acd784]:hover{background-color:var(--memesluna-danger-soft-bg);border-color:var(--memesluna-danger-border)}.asset-hero-panel[data-v-b8acd784]{display:grid;grid-template-columns:minmax(280px,.95fr) minmax(520px,1.55fr);gap:14px;align-items:stretch;padding:18px;border:1px solid var(--k-color-border, rgba(15, 23, 42, .08));border-radius:16px;background:var(--k-bg-card, #ffffff);box-shadow:var(--memesluna-soft-shadow)}.asset-identity-card[data-v-b8acd784]{display:flex;align-items:center;gap:16px;min-width:0}.asset-avatar-frame[data-v-b8acd784]{width:96px;height:96px;border-radius:18px;overflow:hidden;flex:0 0 96px;background:var(--k-bg-panel, #f6f8fb);box-shadow:inset 0 0 0 1px var(--k-color-border, rgba(15, 23, 42, .08))}.asset-avatar-img[data-v-b8acd784]{width:100%;height:100%;object-fit:cover}.asset-avatar-empty[data-v-b8acd784]{width:100%;height:100%;display:flex;align-items:center;justify-content:center;color:var(--k-text-muted, rgba(55, 53, 47, .42))}.asset-avatar-empty svg[data-v-b8acd784]{width:34px;height:34px}.asset-title-stack[data-v-b8acd784]{min-width:0;flex:1}.asset-title-row[data-v-b8acd784]{display:flex;align-items:center;gap:9px}.asset-title-row h1[data-v-b8acd784]{margin:0;color:var(--k-text-normal, #0f172a);font-size:1.7rem;line-height:1.1;font-weight:760;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.asset-pill[data-v-b8acd784]{padding:3px 8px;border-radius:999px;background-color:var(--memesluna-danger-soft-bg);color:var(--k-color-danger, #eb5757);font-size:.72rem;font-weight:700}.asset-description-input[data-v-b8acd784]{margin-top:9px;width:100%;border:none;background:transparent;color:var(--k-text-muted, rgba(55, 53, 47, .68));font-size:.88rem;line-height:1.4;padding:4px 0;outline:none;font-family:inherit}.asset-description-input[data-v-b8acd784]:focus{color:var(--k-text-normal, #111827)}.asset-meta-line[data-v-b8acd784]{display:flex;flex-wrap:wrap;gap:8px 14px;margin-top:12px;color:var(--k-text-muted, rgba(55, 53, 47, .58));font-size:.75rem}.asset-api-card[data-v-b8acd784]{min-width:0;align-self:center;width:100%;box-shadow:none}.asset-card-label[data-v-b8acd784]{color:var(--k-text-normal, #111827);font-size:.8rem;font-weight:720;margin-bottom:9px}.asset-api-row[data-v-b8acd784]{display:grid;grid-template-columns:minmax(260px,1fr) auto;gap:10px;align-items:center}.asset-api-row code[data-v-b8acd784]{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:9px 10px;border-radius:10px;background-color:var(--memesluna-primary-faint-bg);color:var(--k-color-primary, #2563eb);font:.82rem SFMono-Regular,Consolas,monospace;box-shadow:inset 0 0 0 1px #2563eb14}.asset-icon-btn[data-v-b8acd784]{min-height:34px;padding:0 11px;border-radius:10px;font-size:.76rem}.asset-icon-btn.compact[data-v-b8acd784]{width:32px;min-height:32px;padding:0}.asset-test-btn[data-v-b8acd784]:disabled{opacity:.68;cursor:wait}.asset-api-hint[data-v-b8acd784]{margin-top:10px;color:var(--k-text-muted, rgba(55, 53, 47, .56));font-size:.74rem}.api-preview-strip[data-v-b8acd784]{margin-top:10px;display:flex;align-items:center;gap:9px;color:var(--k-text-muted, rgba(55, 53, 47, .6));font-size:.75rem}.api-preview-strip img[data-v-b8acd784]{width:42px;height:42px;object-fit:cover;border-radius:10px;box-shadow:none}.asset-import-panel[data-v-b8acd784]{padding:14px;border:1px solid var(--k-color-border, rgba(15, 23, 42, .08));border-radius:14px;background-color:var(--k-bg-card, #ffffff);box-shadow:none}.asset-import-header[data-v-b8acd784]{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin-bottom:10px}.asset-import-title[data-v-b8acd784]{color:var(--k-text-normal, #111827);font-size:.9rem;font-weight:720}.asset-import-desc[data-v-b8acd784]{margin-top:3px;color:var(--k-text-muted, rgba(55, 53, 47, .56));font-size:.75rem}.asset-link-textarea[data-v-b8acd784]{width:100%;resize:vertical;min-height:92px;box-sizing:border-box;border:1px solid var(--k-color-border, rgba(15, 23, 42, .1));border-radius:12px;background-color:var(--k-bg-panel, #f8fafc);color:var(--k-text-normal, #111827);padding:10px 12px;font:.8rem SFMono-Regular,Consolas,monospace;outline:none}.asset-link-textarea[data-v-b8acd784]:focus{border-color:var(--k-color-primary, #2563eb);box-shadow:0 0 0 3px var(--memesluna-focus-ring);background-color:var(--k-bg-card, #ffffff)}.asset-import-actions[data-v-b8acd784]{display:flex;justify-content:flex-end;gap:8px;margin-top:10px}.asset-gallery-section[data-v-b8acd784]{border:1px solid var(--k-color-border, rgba(15, 23, 42, .08));border-radius:16px;background-color:var(--k-bg-card, #ffffff);box-shadow:none;overflow:hidden}.asset-gallery-toolbar[data-v-b8acd784]{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:12px 14px;border-bottom:1px solid var(--k-color-border, rgba(15, 23, 42, .08))}.asset-tabs[data-v-b8acd784],.asset-filter-bar[data-v-b8acd784],.asset-view-toggle[data-v-b8acd784]{display:flex;align-items:center;gap:6px}.asset-tabs[data-v-b8acd784]{flex-wrap:wrap}.asset-tab[data-v-b8acd784]{border:none;background:transparent;color:var(--k-text-muted, rgba(55, 53, 47, .62));border-radius:999px;padding:7px 11px;cursor:pointer;display:inline-flex;align-items:center;gap:7px;font-size:.8rem;font-weight:680}.asset-tab[data-v-b8acd784]:hover,.asset-tab.active[data-v-b8acd784]{color:var(--k-color-primary, #2563eb);background-color:var(--memesluna-primary-soft-bg)}.asset-tab span[data-v-b8acd784]{min-width:20px;height:18px;display:inline-flex;align-items:center;justify-content:center;padding:0 6px;border-radius:999px;background-color:var(--k-bg-panel, rgba(15, 23, 42, .06));color:inherit;font-size:.7rem}.asset-filter-bar[data-v-b8acd784]{flex:1;justify-content:flex-end;min-width:0}.asset-search-box[data-v-b8acd784]{flex:1;max-width:320px;min-width:180px;height:36px;display:flex;align-items:center;gap:8px;padding:0 11px;border:1px solid var(--k-color-border, rgba(15, 23, 42, .1));border-radius:12px;background-color:var(--k-bg-card, #ffffff);color:var(--k-text-muted, rgba(55, 53, 47, .5))}.asset-search-box svg[data-v-b8acd784]{width:16px;height:16px;flex:0 0 16px}.asset-search-box input[data-v-b8acd784]{min-width:0;flex:1;border:none;background:transparent;color:var(--k-text-normal, #111827);outline:none;font:inherit;font-size:.8rem}.asset-select[data-v-b8acd784]{height:36px;border:1px solid var(--k-color-border, rgba(15, 23, 42, .1));border-radius:12px;background-color:var(--k-bg-card, #ffffff);color:var(--k-text-normal, #111827);padding:0 10px;font-size:.78rem;font-weight:600;outline:none}.asset-view-toggle[data-v-b8acd784]{padding:3px;border:1px solid var(--k-color-border, rgba(15, 23, 42, .1));border-radius:12px;background-color:var(--k-bg-panel, #f8fafc)}.asset-view-toggle button[data-v-b8acd784]{width:30px;height:28px;border:none;border-radius:9px;background:transparent;color:var(--k-text-muted, rgba(55, 53, 47, .55));cursor:pointer;display:inline-flex;align-items:center;justify-content:center;padding:0}.asset-view-toggle button.active[data-v-b8acd784]{background-color:var(--k-bg-card, #ffffff);color:var(--k-color-primary, #2563eb)}.notion-page-toolbar[data-v-b8acd784]{display:flex;align-items:center;gap:8px;margin-bottom:20px;border-bottom:1px solid var(--k-color-border, rgba(55, 53, 47, .08));padding-bottom:8px}.toolbar-btn[data-v-b8acd784]{background:transparent;border:none;font-size:.78rem;color:var(--k-text-muted, rgba(55, 53, 47, .6));cursor:pointer;display:inline-flex;align-items:center;padding:4px 10px;border-radius:4px;font-weight:500;transition:all .1s ease}.toolbar-btn[data-v-b8acd784]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .04));color:var(--k-text-normal, #37352f)}.toolbar-btn.danger[data-v-b8acd784]{color:var(--k-color-danger, #eb5757)}.toolbar-btn.danger[data-v-b8acd784]:hover{background-color:var(--memesluna-danger-soft-bg)}.toolbar-divider[data-v-b8acd784]{width:1px;height:14px;background-color:var(--k-color-border, rgba(55, 53, 47, .12))}.notion-properties-panel[data-v-b8acd784]{margin-bottom:20px;display:flex;flex-direction:column;gap:6px}.property-row[data-v-b8acd784]{display:flex;align-items:center;font-size:.82rem}.property-label[data-v-b8acd784]{width:110px;color:var(--k-text-muted, rgba(55, 53, 47, .45));display:flex;align-items:center;gap:6px;-webkit-user-select:none;user-select:none}.prop-icon[data-v-b8acd784]{font-size:.95rem}.property-value[data-v-b8acd784]{flex:1}.property-input-text[data-v-b8acd784]{border:none;background:transparent;font-size:.82rem;color:var(--k-text-normal, #37352f);width:100%;padding:4px 8px;border-radius:4px;box-sizing:border-box;font-family:inherit;transition:background .1s ease}.property-input-text[data-v-b8acd784]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .03))}.property-input-text[data-v-b8acd784]:focus{background-color:var(--k-bg-card, #ffffff);box-shadow:inset 0 0 0 1px var(--k-color-primary, #2383e2);outline:none}.notion-callout[data-v-b8acd784]{display:flex;gap:12px;padding:14px 16px;border-radius:4px;background-color:var(--k-bg-panel, rgba(242, 241, 237, .45));border:1px solid var(--k-color-border, rgba(55, 53, 47, .08))}.callout-icon[data-v-b8acd784]{font-size:1.15rem;-webkit-user-select:none;user-select:none}.callout-content[data-v-b8acd784]{flex:1;min-width:0}.callout-title[data-v-b8acd784]{font-weight:600;font-size:.85rem;color:var(--k-text-normal, #37352f);margin-bottom:2px}.callout-desc[data-v-b8acd784]{font-size:.75rem;color:var(--k-text-muted, rgba(55, 53, 47, .5));margin-bottom:10px;line-height:1.4}.callout-actions[data-v-b8acd784]{display:flex;gap:8px}.btn-small[data-v-b8acd784]{font-size:.75rem;padding:2px 10px;height:24px}.hidden-file-input[data-v-b8acd784]{display:none}.sidebar-drop-zone-overlay[data-v-b8acd784]{position:fixed;top:0;left:0;width:100%;height:100%;z-index:9999;background-color:var(--memesluna-drop-overlay-bg);display:flex;align-items:center;justify-content:center;padding:40px;box-sizing:border-box}.drop-overlay-box[data-v-b8acd784]{border:2px dashed var(--k-color-primary, #2383e2);background-color:var(--memesluna-primary-faint-bg);border-radius:8px;width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;color:var(--k-color-primary, #2383e2);font-size:1.1rem;font-weight:500}.drop-overlay-box .drop-icon[data-v-b8acd784]{width:48px;height:48px;margin-bottom:16px}.gallery-view-switcher[data-v-b8acd784]{display:flex;gap:16px;border-bottom:1px solid var(--k-color-border, rgba(55, 53, 47, .09));padding-bottom:2px}.gallery-tab-btn[data-v-b8acd784]{background:transparent;border:none;font-size:.82rem;color:var(--k-text-muted, rgba(55, 53, 47, .5));cursor:pointer;padding-bottom:6px;border-bottom:2px solid transparent;font-weight:500;transition:all .1s ease}.gallery-tab-btn[data-v-b8acd784]:hover{color:var(--k-text-normal, #37352f)}.gallery-tab-btn.active[data-v-b8acd784]{color:var(--k-text-normal, #37352f);border-bottom-color:var(--k-text-normal, #37352f)}.gallery-tab-content[data-v-b8acd784]{padding:14px;margin-top:0}.gallery-bulk-toolbar[data-v-b8acd784]{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:0 auto 12px;padding:9px 10px;border:1px solid var(--k-color-border, rgba(15, 23, 42, .1));border-radius:14px;background-color:var(--memesluna-floating-action-bg);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.gallery-bulk-toolbar.floating[data-v-b8acd784]{position:sticky;top:8px;z-index:40;max-width:920px}.bulk-status[data-v-b8acd784]{display:flex;align-items:center;gap:8px;min-width:0}.bulk-title[data-v-b8acd784]{font-size:.82rem;font-weight:720;color:var(--k-text-normal, #37352f)}.bulk-meta[data-v-b8acd784]{font-size:.72rem;color:var(--k-text-muted, rgba(55, 53, 47, .55))}.bulk-actions[data-v-b8acd784],.bulk-move-group[data-v-b8acd784]{display:flex;align-items:center;gap:6px;flex-wrap:wrap;justify-content:flex-end}.toolbar-btn.compact[data-v-b8acd784]{font-size:.74rem;padding:5px 9px;border-radius:10px}.toolbar-btn[data-v-b8acd784]:disabled{opacity:.45;cursor:not-allowed}.compact-select[data-v-b8acd784]{height:30px;padding:2px 9px;font-size:.74rem;border-radius:10px}.notion-gallery-grid[data-v-b8acd784]{display:grid;grid-template-columns:repeat(auto-fill,minmax(174px,1fr));gap:7px}.notion-gallery-card[data-v-b8acd784]{background:transparent;border:none;border-radius:12px;position:relative;aspect-ratio:4 / 3;transition:opacity .15s ease;box-shadow:none;overflow:hidden}.notion-gallery-card[data-v-b8acd784]:hover,.notion-gallery-card.selected[data-v-b8acd784]{box-shadow:none}.notion-gallery-card.selected .gallery-img-container[data-v-b8acd784]{box-shadow:inset 0 0 0 2px var(--k-color-primary, #2563eb)}.notion-gallery-card.external .gallery-img-container[data-v-b8acd784]{background-color:var(--k-bg-card, #ffffff)}.gallery-select-toggle[data-v-b8acd784]{position:absolute;top:9px;left:9px;z-index:12;width:24px;height:24px;border:1px solid rgba(255,255,255,.82);border-radius:999px;background-color:var(--memesluna-floating-action-bg);box-shadow:none;color:var(--k-color-primary, #2383e2);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;opacity:0;transition:opacity .12s ease,border-color .12s ease}.gallery-select-toggle svg[data-v-b8acd784]{width:14px;height:14px}.notion-gallery-card:hover .gallery-select-toggle[data-v-b8acd784],.notion-gallery-card.selected .gallery-select-toggle[data-v-b8acd784]{opacity:1}.gallery-img-container[data-v-b8acd784]{width:100%;height:100%;background-color:var(--k-bg-panel, #f7f7f5);display:flex;align-items:center;justify-content:center;overflow:hidden;border-radius:12px;box-shadow:inset 0 0 0 1px #0f172a14}.gallery-img[data-v-b8acd784]{width:100%;height:100%;object-fit:cover}.image-format-badge[data-v-b8acd784]{position:absolute;right:8px;bottom:8px;z-index:12;padding:2px 6px;border-radius:7px;background:#0f172a9e;color:#fff;font-size:.68rem;font-weight:700;line-height:1.1}.image-format-badge.external[data-v-b8acd784]{background:#0d9488d1}.gallery-list-meta[data-v-b8acd784]{display:none}.notion-gallery-grid.list-mode[data-v-b8acd784]{grid-template-columns:1fr;gap:8px}.notion-gallery-grid.list-mode .notion-gallery-card[data-v-b8acd784]{aspect-ratio:auto;min-height:76px;display:grid;grid-template-columns:96px 1fr;align-items:center;gap:12px;padding:8px;border:1px solid var(--k-color-border, rgba(15, 23, 42, .08));background-color:var(--k-bg-card, #ffffff)}.notion-gallery-grid.list-mode .gallery-img-container[data-v-b8acd784]{height:68px}.notion-gallery-grid.list-mode .gallery-list-meta[data-v-b8acd784]{display:block;min-width:0;padding-right:88px}.gallery-list-meta div[data-v-b8acd784]{color:var(--k-text-normal, #111827);font-size:.82rem;font-weight:650;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gallery-list-meta span[data-v-b8acd784]{display:block;margin-top:4px;color:var(--k-text-muted, rgba(55, 53, 47, .55));font-size:.72rem}.gallery-card-overlay[data-v-b8acd784]{position:absolute;top:0;left:0;right:0;bottom:0;background:linear-gradient(to bottom,#00000047,#0000 35%,#0000);border-radius:12px;opacity:0;transition:opacity .15s ease;pointer-events:none;z-index:10}.notion-gallery-card:hover .gallery-card-overlay[data-v-b8acd784],.notion-gallery-card-active-dropdown .gallery-card-overlay[data-v-b8acd784]{opacity:1}.overlay-actions[data-v-b8acd784]{position:absolute;top:8px;right:8px;display:flex;gap:6px;pointer-events:auto}.overlay-actions .card-action-btn[data-v-b8acd784]{border:none;background-color:var(--memesluna-floating-action-bg);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);color:var(--k-text-normal, #37352f);font-size:.65rem;padding:3px 8px;border-radius:9px;cursor:pointer;font-weight:500;box-shadow:var(--memesluna-floating-shadow);transition:all .1s ease;display:flex;align-items:center;justify-content:center}.overlay-actions .card-action-btn.move[data-v-b8acd784]:hover{background:var(--k-color-success, #2b8a5c);color:#fff}.overlay-actions .card-action-btn[data-v-b8acd784]:hover{background:var(--k-bg-card, #ffffff);color:var(--k-color-primary, #2563eb)}.overlay-actions .card-action-btn.danger[data-v-b8acd784]{color:var(--k-color-danger, #eb5757)}.overlay-actions .card-action-btn.danger[data-v-b8acd784]:hover{background:var(--k-color-danger, #eb5757);color:#fff}.flat-input[data-v-b8acd784],.flat-select[data-v-b8acd784],.flat-textarea[data-v-b8acd784]{box-sizing:border-box;padding:6px 10px;border:1px solid var(--k-color-border, rgba(15, 15, 15, .12));border-radius:4px;background:var(--k-bg-panel, rgba(242, 241, 237, .45));color:var(--k-text-normal, #37352f);font-size:.82rem;font-family:inherit;transition:background .1s ease,border-color .1s ease;outline:none}.flat-input[data-v-b8acd784]:focus,.flat-select[data-v-b8acd784]:focus,.flat-textarea[data-v-b8acd784]:focus{border-color:var(--k-color-primary, #2383e2);background:var(--k-bg-card, #ffffff);box-shadow:0 0 0 2px var(--memesluna-focus-ring)}.flat-input[data-v-b8acd784]::placeholder,.flat-textarea[data-v-b8acd784]::placeholder,.property-input-text[data-v-b8acd784]::placeholder{color:var(--k-text-muted, rgba(55, 53, 47, .45));opacity:.78}.flat-input[data-v-b8acd784]:disabled{background:var(--k-bg-panel, rgba(55, 53, 47, .05));color:var(--k-text-muted, rgba(55, 53, 47, .4));cursor:not-allowed}.field-hint[data-v-b8acd784]{font-size:.7rem;color:var(--k-text-muted, rgba(55, 53, 47, .45));margin-top:4px;display:block}.btn[data-v-b8acd784]{box-sizing:border-box;padding:4px 14px;font-size:.82rem;font-weight:500;border-radius:4px;cursor:pointer;transition:all .1s ease;display:inline-flex;align-items:center;justify-content:center;height:32px;border:none}.btn-primary[data-v-b8acd784]{background-color:var(--k-color-primary, #2383e2);color:#fff}.btn-primary[data-v-b8acd784]:hover{background-color:var(--k-color-primary-shade, #1a6cb8)}.btn-secondary[data-v-b8acd784]{background-color:var(--k-bg-card, #ffffff);color:var(--k-text-normal, #37352f);border:1px solid var(--k-color-border, rgba(55, 53, 47, .16))}.btn-secondary[data-v-b8acd784]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .04))}.btn-danger[data-v-b8acd784]{background-color:var(--k-color-danger, #eb5757);color:#fff}.btn-danger[data-v-b8acd784]:hover{background-color:var(--k-color-danger-shade, #d44c4c)}.w-full[data-v-b8acd784]{width:100%}.mt-2[data-v-b8acd784]{margin-top:8px}.mt-3[data-v-b8acd784]{margin-top:12px}.mt-4[data-v-b8acd784]{margin-top:16px}.empty-placeholder-card[data-v-b8acd784]{padding:60px 20px;text-align:center;border:1px dashed var(--k-color-border, rgba(55, 53, 47, .2));border-radius:8px;background-color:var(--k-bg-panel, rgba(55, 53, 47, .01))}.empty-icon[data-v-b8acd784]{font-size:2.5rem;margin-bottom:12px}.empty-placeholder-card h3[data-v-b8acd784]{font-size:.95rem;margin:0 0 6px;font-weight:600}.empty-placeholder-card p[data-v-b8acd784]{font-size:.78rem;color:var(--k-text-muted, rgba(55, 53, 47, .5));margin:0}.empty-gallery[data-v-b8acd784]{padding:36px;text-align:center;color:var(--k-text-muted, rgba(55, 53, 47, .4));background-color:var(--k-bg-panel, #f7f7f5);border-radius:6px;font-size:.78rem}.move-dropdown-container[data-v-b8acd784]{position:relative}.move-dropdown-menu[data-v-b8acd784]{position:absolute;top:100%;left:0;margin-top:4px;background-color:var(--k-bg-card, #ffffff);border:1px solid var(--k-color-border, rgba(55, 53, 47, .15));border-radius:6px;z-index:100;min-width:120px;width:max-content;box-sizing:border-box}.dropdown-item[data-v-b8acd784]{border:none;background:transparent;width:100%;text-align:left;padding:4px 6px;font-size:.68rem;cursor:pointer;color:var(--k-text-normal, #37352f)}.dropdown-item[data-v-b8acd784]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .04))}.pagination-container[data-v-b8acd784]{display:flex;align-items:center;justify-content:center;gap:16px;margin-top:20px;padding-top:12px;border-top:1px solid var(--k-color-border, rgba(55, 53, 47, .06))}.page-indicator[data-v-b8acd784]{font-size:.78rem;color:var(--k-text-muted, rgba(55, 53, 47, .6))}.page-btn[data-v-b8acd784]{height:28px;padding:0 10px;font-size:.75rem}.links-list-container[data-v-b8acd784]{border:1px solid var(--k-color-border, rgba(55, 53, 47, .09));border-radius:6px;overflow:hidden}.link-item-row[data-v-b8acd784]{display:flex;justify-content:space-between;align-items:center;padding:8px 12px;border-bottom:1px solid var(--k-color-border, rgba(55, 53, 47, .06));background-color:var(--k-bg-card, #ffffff)}.link-item-row[data-v-b8acd784]:last-child{border-bottom:none}.link-item-row[data-v-b8acd784]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .015))}.link-url-wrapper[data-v-b8acd784]{display:flex;align-items:center;gap:8px;flex:1;min-width:0;margin-right:16px}.bullet[data-v-b8acd784]{color:var(--k-text-muted, rgba(55, 53, 47, .35));font-weight:700}.link-url-text[data-v-b8acd784]{color:var(--k-text-muted, rgba(55, 53, 47, .65));font-family:SFMono-Regular,Consolas,monospace;font-size:.75rem;cursor:pointer}.link-url-text[data-v-b8acd784]:hover{color:var(--k-color-primary, #2383e2);text-decoration:underline}.link-actions[data-v-b8acd784]{display:flex;gap:6px}.staging-router-view[data-v-b8acd784]{display:flex;flex-direction:column;gap:16px}.staging-page-header[data-v-b8acd784]{margin-bottom:4px}.staging-header-actions[data-v-b8acd784]{display:flex;align-items:center;gap:8px;flex-wrap:wrap;justify-content:flex-end}.similar-staging-view[data-v-b8acd784]{display:flex;flex-direction:column;gap:16px}.similar-message[data-v-b8acd784]{color:var(--k-text-muted, rgba(55, 53, 47, .58));font-size:.78rem;font-weight:650}.similar-group[data-v-b8acd784]{display:flex;flex-direction:column;gap:10px;padding-top:12px;border-top:1px solid var(--k-color-border, rgba(15, 23, 42, .08))}.similar-group[data-v-b8acd784]:first-of-type{padding-top:0;border-top:none}.similar-group-header[data-v-b8acd784]{display:flex;align-items:center;justify-content:space-between;gap:12px}.similar-group-header h3[data-v-b8acd784]{margin:0;color:var(--k-text-normal, #111827);font-size:.96rem;font-weight:750}.similar-group-header p[data-v-b8acd784]{margin:4px 0 0;color:var(--k-text-muted, rgba(55, 53, 47, .58));font-size:.74rem}.staging-toolbar[data-v-b8acd784]{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 0;border-top:1px solid var(--k-color-border, rgba(15, 23, 42, .06));border-bottom:1px solid var(--k-color-border, rgba(15, 23, 42, .06))}.staging-search-box[data-v-b8acd784]{max-width:420px}.staging-count-pill[data-v-b8acd784]{height:28px;display:inline-flex;align-items:center;padding:0 10px;border-radius:999px;background-color:var(--k-bg-panel, rgba(15, 23, 42, .05));color:var(--k-text-muted, rgba(55, 53, 47, .58));font-size:.76rem;font-weight:650;white-space:nowrap}.staging-empty-card[data-v-b8acd784]{margin-top:8px}.staging-grid[data-v-b8acd784]{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:14px}.staging-card[data-v-b8acd784]{position:relative;min-width:0;overflow:hidden;border:1px solid var(--k-color-border, rgba(15, 23, 42, .09));border-radius:8px;background-color:var(--k-bg-card, #ffffff);box-shadow:none}.staging-card-selected[data-v-b8acd784]{border-color:var(--k-color-primary, #2383e2);box-shadow:0 0 0 2px var(--memesluna-focus-ring)}.staging-select-toggle[data-v-b8acd784]{position:absolute;top:8px;left:8px;z-index:5;width:24px;height:24px;border-radius:6px;border:2px solid rgba(255,255,255,.8);background-color:#ffffffd9;color:var(--k-color-primary, #2383e2);display:flex;align-items:center;justify-content:center;cursor:pointer;padding:0;transition:background-color .15s ease}.staging-select-toggle[data-v-b8acd784]:hover{background-color:#fffffff2}.staging-select-toggle svg[data-v-b8acd784]{width:14px;height:14px}.staging-batch-toolbar[data-v-b8acd784]{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 14px;margin-bottom:14px;border:1px solid var(--k-color-border, rgba(15, 23, 42, .09));border-radius:8px;background-color:var(--memesluna-floating-action-bg, rgba(255, 255, 255, .92))}.staging-image-shell[data-v-b8acd784]{width:100%;aspect-ratio:1 / 1;display:flex;align-items:center;justify-content:center;padding:0;border:none;border-bottom:1px solid var(--k-color-border, rgba(15, 23, 42, .08));background-color:var(--k-bg-panel, #f8fafc);cursor:pointer}.staging-image[data-v-b8acd784]{width:100%;height:100%;object-fit:contain;display:block}.staging-card-body[data-v-b8acd784]{padding:12px;display:flex;flex-direction:column;gap:10px}.staging-title-row[data-v-b8acd784]{display:flex;align-items:center;justify-content:space-between;gap:8px;min-width:0}.staging-title[data-v-b8acd784]{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--k-text-normal, #111827);font-size:.86rem;font-weight:700}.staging-ext-tag[data-v-b8acd784]{flex:0 0 auto;padding:2px 7px;border-radius:999px;background-color:var(--memesluna-primary-soft-bg);color:var(--k-color-primary, #2563eb);font-size:.66rem;font-weight:750}.staging-meta-grid[data-v-b8acd784]{display:grid;grid-template-columns:1fr 1fr;gap:6px 10px;color:var(--k-text-muted, rgba(55, 53, 47, .58));font-size:.72rem;line-height:1.35}.staging-meta-grid span[data-v-b8acd784]{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.staging-select[data-v-b8acd784]{width:100%;height:34px}.staging-actions[data-v-b8acd784]{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px}.staging-action-btn[data-v-b8acd784]{min-width:0;width:100%;white-space:nowrap}.page-section-header[data-v-b8acd784]{align-items:center;justify-content:space-between;gap:16px;margin-top:0;margin-bottom:14px}.page-section-header>div[data-v-b8acd784]{min-width:0}.page-section-header .notion-main-title[data-v-b8acd784]{margin:0;font-size:1.78rem;line-height:1.18;font-weight:700;color:var(--k-text-normal, #37352f)}.page-section-header .btn-notion[data-v-b8acd784]{align-self:center}.section-desc.compact[data-v-b8acd784]{margin:8px 0 0;max-width:620px;line-height:1.45}.endpoint-layout[data-v-b8acd784]{display:flex;flex-direction:column;gap:16px}.notion-form-panel[data-v-b8acd784]{padding:12px 0}.endpoint-editor-panel[data-v-b8acd784]{padding:14px;border:1px solid var(--k-color-border, rgba(55, 53, 47, .08));border-radius:6px;background-color:var(--k-bg-card, #ffffff)}.panel-title-row[data-v-b8acd784],.table-title-row[data-v-b8acd784]{display:flex;align-items:center;justify-content:space-between;gap:12px}.notion-panel-title[data-v-b8acd784]{font-size:1rem;font-weight:600;margin-top:0;margin-bottom:16px;color:var(--k-text-normal, #37352f)}.panel-title-row .notion-panel-title[data-v-b8acd784],.table-title-row .notion-panel-title[data-v-b8acd784]{margin-bottom:0}.table-count[data-v-b8acd784]{font-size:.72rem;color:var(--k-text-muted, rgba(55, 53, 47, .5))}.form-fields[data-v-b8acd784]{display:flex;flex-direction:column;gap:12px}.form-group[data-v-b8acd784]{display:flex;flex-direction:column}.endpoint-form-grid[data-v-b8acd784]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:14px}.span-2[data-v-b8acd784]{grid-column:1 / -1}.form-group label[data-v-b8acd784]{font-size:.75rem;font-weight:600;color:var(--k-text-muted, rgba(55, 53, 47, .65));margin-bottom:4px}.form-row[data-v-b8acd784]{display:flex;gap:10px}.form-actions[data-v-b8acd784]{display:flex;gap:8px;margin-top:8px}.flex-grow[data-v-b8acd784]{flex:1}.endpoint-preview[data-v-b8acd784]{display:flex;align-items:center;gap:8px;padding:7px 10px;border-radius:4px;background-color:var(--k-bg-panel, rgba(55, 53, 47, .04))}.endpoint-preview span[data-v-b8acd784]{color:var(--k-text-muted, rgba(55, 53, 47, .5));font-size:.72rem;font-weight:600;flex-shrink:0}.endpoint-preview code[data-v-b8acd784]{color:var(--k-color-primary, #2383e2);font-family:SFMono-Regular,Consolas,monospace;font-size:.74rem;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.notion-table-panel[data-v-b8acd784]{padding:12px 0}.table-title-row[data-v-b8acd784]{margin-bottom:8px}.table-container[data-v-b8acd784]{overflow-x:auto;border:1px solid var(--k-color-border, rgba(55, 53, 47, .08));border-radius:6px;background-color:var(--k-bg-card, #ffffff)}.flat-table[data-v-b8acd784]{width:100%;border-collapse:collapse;font-size:.78rem}.flat-table th[data-v-b8acd784]{padding:8px 12px;background-color:var(--k-bg-panel, #f7f7f5);border-bottom:1px solid var(--k-color-border, rgba(55, 53, 47, .08));color:var(--k-text-muted, rgba(55, 53, 47, .55));font-weight:600;font-size:.72rem;text-transform:uppercase;text-align:left}.flat-table td[data-v-b8acd784]{padding:10px 12px;border-bottom:1px solid var(--k-color-border, rgba(55, 53, 47, .05));text-align:left}.flat-table tr:last-child td[data-v-b8acd784]{border-bottom:none}.empty-cell[data-v-b8acd784]{text-align:center;padding:40px!important;color:var(--k-text-muted, rgba(55, 53, 47, .35))}.endpoint-name[data-v-b8acd784]{font-weight:600}.group-badge[data-v-b8acd784]{display:inline-block;background-color:var(--k-bg-panel, rgba(55, 53, 47, .06));color:var(--k-text-muted, rgba(55, 53, 47, .6));padding:1px 6px;border-radius:3px;font-size:.65rem;font-weight:500;margin-top:4px}.cell-desc[data-v-b8acd784]{color:var(--k-text-muted, rgba(55, 53, 47, .55));max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.method-tag[data-v-b8acd784]{font-size:.65rem;font-weight:600;padding:1px 5px;border-radius:3px;text-transform:uppercase;margin-right:6px}.method-tag.redirect[data-v-b8acd784]{background-color:var(--memesluna-primary-soft-bg);color:var(--k-color-primary, #2383e2)}.link-text[data-v-b8acd784]{font-weight:500;color:var(--k-color-primary, #2383e2);cursor:pointer}.link-text[data-v-b8acd784]:hover{text-decoration:underline}.target-url[data-v-b8acd784]{font-size:.72rem;color:var(--k-text-muted, rgba(55, 53, 47, .4));max-width:300px;margin-top:2px}.url-line[data-v-b8acd784]{display:flex;align-items:center;gap:4px}.font-mono[data-v-b8acd784]{font-family:SFMono-Regular,Consolas,monospace}.truncate[data-v-b8acd784]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.action-buttons[data-v-b8acd784]{display:flex;justify-content:flex-end;gap:4px}.icon-btn[data-v-b8acd784]{background:transparent;border:1px solid var(--k-color-border, rgba(55, 53, 47, .15));border-radius:4px;padding:3px;cursor:pointer;color:var(--k-text-muted, rgba(55, 53, 47, .55));display:inline-flex}.icon-btn svg[data-v-b8acd784]{width:12px;height:12px}.icon-btn.hover-bg[data-v-b8acd784]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .04));color:var(--k-text-normal, #37352f)}.icon-btn.hover-danger[data-v-b8acd784]:hover{background-color:var(--memesluna-danger-soft-bg);border-color:var(--memesluna-danger-border);color:var(--k-color-danger, #eb5757)}.icon-btn-inline[data-v-b8acd784]{background:transparent;border:none;cursor:pointer;color:var(--k-text-muted, rgba(55, 53, 47, .35));display:inline-flex;padding:0;vertical-align:middle}.icon-btn-inline[data-v-b8acd784]:hover{color:var(--k-color-primary, #2383e2)}.icon-btn-inline svg[data-v-b8acd784]{width:10px;height:10px}.settings-preview-panel[data-v-b8acd784]{width:100%;max-width:none;margin:0 auto}.preview-page-header[data-v-b8acd784]{margin-bottom:12px}.preview-dashboard-grid[data-v-b8acd784]{display:grid;grid-template-columns:minmax(560px,1fr) minmax(420px,.9fr);gap:22px;align-items:start}.preview-card[data-v-b8acd784]{min-width:0;border:1px solid var(--k-color-border, rgba(15, 23, 42, .09));border-radius:14px;background-color:var(--k-bg-card, #ffffff);box-shadow:0 10px 32px #0f172a0f;overflow:hidden}.preview-card-header[data-v-b8acd784]{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;padding:18px 20px 16px;border-bottom:1px solid var(--k-color-border, rgba(15, 23, 42, .08))}.preview-card-title[data-v-b8acd784]{color:var(--k-text-normal, #111827);font-size:1rem;line-height:1.25;font-weight:760}.preview-card-desc[data-v-b8acd784]{margin-top:5px;color:var(--k-text-muted, rgba(55, 53, 47, .56));font-size:.76rem;line-height:1.45}.preview-action-btn[data-v-b8acd784]{height:32px;padding:0 11px;border:1px solid var(--k-color-border, rgba(15, 23, 42, .1));border-radius:8px;background-color:var(--k-bg-card, #ffffff);color:var(--k-text-normal, #111827);font-size:.76rem;font-weight:650;cursor:pointer;white-space:nowrap}.preview-action-btn[data-v-b8acd784]:hover:not(:disabled){background-color:var(--k-bg-panel, #f8fafc)}.preview-action-btn[data-v-b8acd784]:disabled{opacity:.45;cursor:not-allowed}.preview-table-wrap[data-v-b8acd784]{overflow-x:auto}.preview-route-table[data-v-b8acd784]{width:100%;border-collapse:collapse;table-layout:fixed}.preview-route-table th[data-v-b8acd784],.preview-route-table td[data-v-b8acd784]{padding:12px 14px;border-bottom:1px solid var(--k-color-border, rgba(15, 23, 42, .06));text-align:left;vertical-align:middle}.preview-route-table th[data-v-b8acd784]{background-color:var(--k-bg-panel, #f8fafc);color:var(--k-text-muted, rgba(55, 53, 47, .54));font-size:.7rem;font-weight:740}.preview-route-table tr:last-child td[data-v-b8acd784]{border-bottom:none}.preview-route-table th[data-v-b8acd784]:nth-child(1),.preview-route-table td[data-v-b8acd784]:nth-child(1){width:86px}.preview-route-table th[data-v-b8acd784]:nth-child(2),.preview-route-table td[data-v-b8acd784]:nth-child(2){width:130px}.preview-route-table th[data-v-b8acd784]:nth-child(4),.preview-route-table td[data-v-b8acd784]:nth-child(4){width:186px}.preview-route-table th[data-v-b8acd784]:nth-child(5),.preview-route-table td[data-v-b8acd784]:nth-child(5){width:64px;text-align:center}.preview-mini-cover[data-v-b8acd784]{width:58px;height:42px;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1px;overflow:hidden;border-radius:8px;background-color:var(--k-color-border, rgba(15, 23, 42, .08))}.preview-mini-cover.single[data-v-b8acd784]{display:block}.preview-mini-cover img[data-v-b8acd784]{width:100%;height:100%;object-fit:cover;background-color:var(--k-bg-panel, #f7f7f5)}.preview-route-icon[data-v-b8acd784]{width:58px;height:42px;display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:var(--memesluna-primary-faint-bg);color:var(--k-color-primary, #2383e2);font-size:.7rem;font-weight:760}.preview-route-icon.endpoint[data-v-b8acd784]{background-color:var(--memesluna-success-soft-bg);color:var(--k-color-success, #2b8a5c)}.preview-route-name[data-v-b8acd784]{min-width:0;color:var(--k-text-normal, #111827);font-size:.84rem;font-weight:730;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.preview-route-type[data-v-b8acd784]{display:inline-flex;align-items:center;margin-top:5px;padding:2px 6px;border-radius:999px;background-color:var(--memesluna-primary-soft-bg);color:var(--k-color-primary, #2383e2);font-size:.66rem;font-weight:700}.preview-route-type.endpoint[data-v-b8acd784]{background-color:var(--memesluna-success-soft-bg);color:var(--k-color-success, #2b8a5c)}.preview-route-desc[data-v-b8acd784]{color:var(--k-text-muted, rgba(55, 53, 47, .64));font-size:.78rem;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;line-clamp:3;line-height:1.45;max-height:4.35em}.preview-route-path[data-v-b8acd784]{display:block;max-width:100%;padding:6px 8px;border-radius:7px;background-color:var(--memesluna-primary-faint-bg);color:var(--k-color-primary, #2383e2);font-family:SFMono-Regular,Consolas,monospace;font-size:.72rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer}.preview-row-actions[data-v-b8acd784]{display:flex;align-items:center;justify-content:center}.preview-empty-state[data-v-b8acd784]{padding:64px 20px;color:var(--k-text-muted, rgba(55, 53, 47, .48));text-align:center;font-size:.82rem}.preview-prompt-container[data-v-b8acd784]{display:flex;flex-direction:column;gap:12px}.preview-sub-title[data-v-b8acd784]{font-size:.72rem;font-weight:600;color:var(--k-text-muted, rgba(55, 53, 47, .45));text-transform:uppercase}.preview-sub-desc[data-v-b8acd784]{margin-top:2px;font-size:.72rem;color:var(--k-text-muted, rgba(55, 53, 47, .45))}.preview-block-header[data-v-b8acd784]{display:flex;align-items:flex-end;justify-content:space-between;gap:12px}.preview-code-block[data-v-b8acd784]{background-color:var(--k-bg-panel, #faf9f6);border:1px solid var(--k-color-border, rgba(55, 53, 47, .08));border-radius:6px;padding:12px;max-height:150px;overflow-y:auto}.preview-code-block pre[data-v-b8acd784]{margin:0;font-family:SFMono-Regular,Consolas,monospace;font-size:.72rem;white-space:pre-wrap;word-break:break-all;color:var(--k-text-normal, #27272a)}.preview-code-block.final-prompt[data-v-b8acd784]{max-height:620px;background-color:var(--memesluna-final-prompt-bg);border-color:var(--memesluna-primary-soft-bg)}.preview-code-block.polished[data-v-b8acd784]{margin:16px;border-radius:12px;background:var(--memesluna-code-bg);border-color:var(--memesluna-code-border);box-shadow:none}.preview-code-block.final-prompt pre[data-v-b8acd784]{color:var(--memesluna-code-text);font-size:.76rem;line-height:1.7}.text-gray-muted[data-v-b8acd784]{color:var(--k-text-muted, rgba(55, 53, 47, .35));font-style:italic}.toast-banner[data-v-b8acd784]{position:fixed;top:24px;right:24px;z-index:10000;display:flex;align-items:center;gap:8px;padding:10px 16px;border-radius:6px;font-size:.78rem;font-weight:500;background-color:var(--k-bg-card, #ffffff);border:1px solid var(--k-color-border, rgba(55, 53, 47, .15));box-shadow:var(--memesluna-card-shadow);color:var(--k-text-normal, #37352f)}.toast-banner.success[data-v-b8acd784]{background-color:var(--memesluna-toast-success-bg);border-color:var(--memesluna-success-soft-bg);color:var(--k-color-success, #2b8a5c)}.toast-banner.error[data-v-b8acd784]{background-color:var(--memesluna-toast-error-bg);border-color:var(--memesluna-danger-border);color:var(--k-color-danger, #eb5757)}.toast-icon[data-v-b8acd784]{width:14px;height:14px;flex-shrink:0}.loading-container[data-v-b8acd784]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:80px 0}.spinner[data-v-b8acd784]{width:20px;height:20px;border:2px solid var(--k-color-border, rgba(55, 53, 47, .08));border-top-color:var(--k-text-normal, rgba(55, 53, 47, .6));border-radius:50%;animation:spin-b8acd784 .8s linear infinite;margin-bottom:12px}@keyframes spin-b8acd784{to{transform:rotate(360deg)}}.loading-container p[data-v-b8acd784]{font-size:.78rem;color:var(--k-text-muted, rgba(55, 53, 47, .5));margin:0}.fade-enter-active[data-v-b8acd784],.fade-leave-active[data-v-b8acd784]{transition:opacity .15s ease,transform .15s ease}.fade-enter-from[data-v-b8acd784],.fade-leave-to[data-v-b8acd784]{opacity:0;transform:translateY(-8px)}@media (max-width: 1280px){.notion-content[data-v-b8acd784]{padding:64px 80px 96px}.preview-dashboard-grid[data-v-b8acd784]{grid-template-columns:1fr}.staging-grid[data-v-b8acd784]{grid-template-columns:repeat(auto-fill,minmax(210px,1fr))}}@media (max-width: 780px){.memesluna-app-layout[data-v-b8acd784]{padding-left:0}.notion-content[data-v-b8acd784]{padding:18px 16px}.content-breadcrumb-header[data-v-b8acd784],.notion-db-header[data-v-b8acd784],.page-section-header[data-v-b8acd784],.notion-page-header[data-v-b8acd784],.gallery-bulk-toolbar[data-v-b8acd784]{align-items:stretch;flex-direction:column}.notion-db-actions[data-v-b8acd784],.bulk-actions[data-v-b8acd784],.form-actions[data-v-b8acd784],.staging-header-actions[data-v-b8acd784],.collection-name-input-notion[data-v-b8acd784],.notion-db-actions .btn[data-v-b8acd784],.form-actions .btn[data-v-b8acd784]{width:100%}.endpoint-form-grid[data-v-b8acd784]{grid-template-columns:1fr}.span-2[data-v-b8acd784]{grid-column:auto}.folders-grid[data-v-b8acd784]{grid-template-columns:1fr}.notion-gallery-grid[data-v-b8acd784]{grid-template-columns:repeat(auto-fill,minmax(130px,1fr))}.preview-block-header[data-v-b8acd784],.preview-card-header[data-v-b8acd784]{align-items:stretch;flex-direction:column}.preview-action-btn[data-v-b8acd784]{width:100%}.staging-toolbar[data-v-b8acd784]{align-items:stretch;flex-direction:column}.staging-search-box[data-v-b8acd784]{max-width:none;width:100%}.preview-route-table[data-v-b8acd784]{min-width:720px}}@media (max-width: 1180px){.asset-hero-panel[data-v-b8acd784]{grid-template-columns:1fr}}@media (max-width: 980px){.detail-topbar[data-v-b8acd784],.asset-gallery-toolbar[data-v-b8acd784]{align-items:stretch;flex-direction:column}.detail-top-actions[data-v-b8acd784],.asset-filter-bar[data-v-b8acd784]{justify-content:flex-start}.asset-filter-bar[data-v-b8acd784]{flex-wrap:wrap}.asset-search-box[data-v-b8acd784]{max-width:none;width:100%}}@media (max-width: 640px){.asset-hero-panel[data-v-b8acd784]{padding:14px;border-radius:14px}.asset-identity-card[data-v-b8acd784]{align-items:flex-start}.asset-avatar-frame[data-v-b8acd784]{width:72px;height:72px;flex-basis:72px;border-radius:14px}.asset-title-row h1[data-v-b8acd784]{font-size:1.35rem}.asset-api-row[data-v-b8acd784]{grid-template-columns:1fr}.asset-tabs[data-v-b8acd784],.detail-top-actions[data-v-b8acd784]{width:100%}.asset-btn[data-v-b8acd784]{flex:1}.notion-gallery-grid[data-v-b8acd784]{grid-template-columns:repeat(auto-fill,minmax(138px,1fr))}.staging-grid[data-v-b8acd784],.staging-actions[data-v-b8acd784]{grid-template-columns:1fr}}
|
package/lib/config.d.ts
CHANGED
package/lib/index.js
CHANGED
|
@@ -976,6 +976,35 @@ var MemesLunaService = class extends import_koishi.Service {
|
|
|
976
976
|
await this.ctx.database.remove("memesluna_staged_images", { id });
|
|
977
977
|
return true;
|
|
978
978
|
}
|
|
979
|
+
async deleteExpiredStagedImages(retentionDays) {
|
|
980
|
+
if (retentionDays <= 0) return 0;
|
|
981
|
+
const cutoff = new Date(Date.now() - retentionDays * 24 * 60 * 60 * 1e3);
|
|
982
|
+
const rows = await this.ctx.database.get("memesluna_staged_images", {});
|
|
983
|
+
const expired = rows.filter((row) => new Date(row.created_at).getTime() < cutoff.getTime());
|
|
984
|
+
if (!expired.length) return 0;
|
|
985
|
+
for (const row of expired) {
|
|
986
|
+
try {
|
|
987
|
+
await import_promises.default.unlink(this.resolveStagedImagePath(row.filename));
|
|
988
|
+
} catch {
|
|
989
|
+
}
|
|
990
|
+
}
|
|
991
|
+
const ids = expired.map((row) => row.id);
|
|
992
|
+
await this.ctx.database.remove("memesluna_staged_images", { id: ids });
|
|
993
|
+
return ids.length;
|
|
994
|
+
}
|
|
995
|
+
async deleteAllStagedImages() {
|
|
996
|
+
const rows = await this.ctx.database.get("memesluna_staged_images", {});
|
|
997
|
+
if (!rows.length) return 0;
|
|
998
|
+
for (const row of rows) {
|
|
999
|
+
try {
|
|
1000
|
+
await import_promises.default.unlink(this.resolveStagedImagePath(row.filename));
|
|
1001
|
+
} catch {
|
|
1002
|
+
}
|
|
1003
|
+
}
|
|
1004
|
+
const ids = rows.map((row) => row.id);
|
|
1005
|
+
await this.ctx.database.remove("memesluna_staged_images", { id: ids });
|
|
1006
|
+
return ids.length;
|
|
1007
|
+
}
|
|
979
1008
|
async promoteStagedImage(id, collectionName) {
|
|
980
1009
|
this.ensureCollectionName(collectionName);
|
|
981
1010
|
if (!await this.collectionExists(collectionName)) {
|
|
@@ -1267,7 +1296,8 @@ var Config = import_koishi2.Schema.intersect([
|
|
|
1267
1296
|
groupAutoCollectLimit: import_koishi2.Schema.number().min(1).max(5e3).default(300).description("每个群每天最多自动放入暂缓区的图片数量")
|
|
1268
1297
|
}).description("自动暂存配置"),
|
|
1269
1298
|
import_koishi2.Schema.object({
|
|
1270
|
-
similarityThreshold: import_koishi2.Schema.number().min(0.5).max(1).step(0.01).role("slider").default(0.9).description("暂缓区相似图片筛选阈值,只用于聚类展示,不会自动删除图片")
|
|
1299
|
+
similarityThreshold: import_koishi2.Schema.number().min(0.5).max(1).step(0.01).role("slider").default(0.9).description("暂缓区相似图片筛选阈值,只用于聚类展示,不会自动删除图片"),
|
|
1300
|
+
stagingRetentionDays: import_koishi2.Schema.number().min(0).max(365).default(0).description("暂缓区图片自动清理天数,0 表示永不自动清理")
|
|
1271
1301
|
}).description("暂缓区复核配置")
|
|
1272
1302
|
]);
|
|
1273
1303
|
var name = "memesluna";
|
|
@@ -1603,6 +1633,9 @@ function applyConsole(ctx, config, service) {
|
|
|
1603
1633
|
consoleService.addListener("memesluna/getBaseUrl", async () => {
|
|
1604
1634
|
return `${toAbsoluteBaseUrl(ctx, config)}${config.backendPath}`;
|
|
1605
1635
|
});
|
|
1636
|
+
consoleService.addListener("memesluna/deleteAllStagedImages", withReady(async () => {
|
|
1637
|
+
return await service.deleteAllStagedImages();
|
|
1638
|
+
}));
|
|
1606
1639
|
}
|
|
1607
1640
|
__name(applyConsole, "applyConsole");
|
|
1608
1641
|
function applyAutoCollect(ctx, config) {
|
|
@@ -1657,6 +1690,25 @@ function applyAutoCollect(ctx, config) {
|
|
|
1657
1690
|
ctx.logger("memesluna").info(`Auto collect started: ${windowMinutes}m/${threshold} times, ${config.minEmojiSize || 50}KB-${config.maxEmojiSize || 15}MB, ${dailyLimit}/day/group`);
|
|
1658
1691
|
}
|
|
1659
1692
|
__name(applyAutoCollect, "applyAutoCollect");
|
|
1693
|
+
function applyStagingCleanup(ctx, config) {
|
|
1694
|
+
const retentionDays = config.stagingRetentionDays || 0;
|
|
1695
|
+
if (retentionDays <= 0) return;
|
|
1696
|
+
const cleanupIntervalMs = Math.max(60 * 60 * 1e3, retentionDays * 24 * 60 * 60 * 1e3 / 4);
|
|
1697
|
+
ctx.setInterval(async () => {
|
|
1698
|
+
try {
|
|
1699
|
+
const service = ctx.memesluna;
|
|
1700
|
+
await service.ready;
|
|
1701
|
+
const deleted = await service.deleteExpiredStagedImages(retentionDays);
|
|
1702
|
+
if (deleted > 0) {
|
|
1703
|
+
ctx.logger("memesluna").info(`Staging cleanup: removed ${deleted} expired images (retention: ${retentionDays} days)`);
|
|
1704
|
+
}
|
|
1705
|
+
} catch (error) {
|
|
1706
|
+
ctx.logger("memesluna").debug(`Staging cleanup failed: ${error.message}`);
|
|
1707
|
+
}
|
|
1708
|
+
}, cleanupIntervalMs);
|
|
1709
|
+
ctx.logger("memesluna").info(`Staging auto-clean enabled: retention ${retentionDays} days`);
|
|
1710
|
+
}
|
|
1711
|
+
__name(applyStagingCleanup, "applyStagingCleanup");
|
|
1660
1712
|
function applyServer(ctx, config, service) {
|
|
1661
1713
|
if (!ctx.server) return;
|
|
1662
1714
|
const basePath = config.backendPath;
|
|
@@ -1675,9 +1727,7 @@ function applyServer(ctx, config, service) {
|
|
|
1675
1727
|
};
|
|
1676
1728
|
});
|
|
1677
1729
|
ctx.server.get(`${basePath}/api/admin/state`, async (koa) => {
|
|
1678
|
-
|
|
1679
|
-
console.log("Admin State:", JSON.stringify(state, null, 2));
|
|
1680
|
-
koa.body = state;
|
|
1730
|
+
koa.body = await buildAdminState(service);
|
|
1681
1731
|
});
|
|
1682
1732
|
ctx.server.post(`${basePath}/api/admin/collections`, async (koa) => {
|
|
1683
1733
|
const body = getRequestBody(koa);
|
|
@@ -1746,6 +1796,10 @@ function applyServer(ctx, config, service) {
|
|
|
1746
1796
|
);
|
|
1747
1797
|
koa.body = { ok: true, staged };
|
|
1748
1798
|
});
|
|
1799
|
+
ctx.server.delete(`${basePath}/api/admin/staged-images`, async (koa) => {
|
|
1800
|
+
const deleted = await service.deleteAllStagedImages();
|
|
1801
|
+
koa.body = { ok: true, deleted };
|
|
1802
|
+
});
|
|
1749
1803
|
ctx.server.patch(`${basePath}/api/admin/collections/:name/description`, async (koa) => {
|
|
1750
1804
|
const name2 = toTrimmedString(koa.params.name);
|
|
1751
1805
|
const body = getRequestBody(koa);
|
|
@@ -1981,6 +2035,7 @@ __name(applyServer, "applyServer");
|
|
|
1981
2035
|
function apply(ctx, config) {
|
|
1982
2036
|
ctx.plugin(MemesLunaService, config);
|
|
1983
2037
|
applyAutoCollect(ctx, config);
|
|
2038
|
+
applyStagingCleanup(ctx, config);
|
|
1984
2039
|
ctx.inject(["memesluna", "server"], async (ctx2) => {
|
|
1985
2040
|
const service = ctx2.memesluna;
|
|
1986
2041
|
await service.ready;
|
package/lib/service.d.ts
CHANGED
|
@@ -130,6 +130,8 @@ export declare class MemesLunaService extends Service {
|
|
|
130
130
|
filename: string;
|
|
131
131
|
} | null>;
|
|
132
132
|
deleteStagedImage(id: string): Promise<boolean>;
|
|
133
|
+
deleteExpiredStagedImages(retentionDays: number): Promise<number>;
|
|
134
|
+
deleteAllStagedImages(): Promise<number>;
|
|
133
135
|
promoteStagedImage(id: string, collectionName: string): Promise<string | null>;
|
|
134
136
|
deleteImageFromCollection(collectionName: string, filename: string): Promise<boolean>;
|
|
135
137
|
moveImageToCollection(sourceCollection: string, targetCollection: string, filename: string): Promise<string | null>;
|
package/package.json
CHANGED