koishi-plugin-memesluna 0.4.4 → 0.4.5

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 CHANGED
@@ -1 +1 @@
1
- import{send as b,icons as Qt}from"@koishijs/client";import{defineComponent as Jt,ref as c,reactive as Se,computed as _,onMounted as Yt,onUnmounted as Xt,watch as qe,openBlock as n,createElementBlock as o,createCommentVNode as d,createElementVNode as e,Fragment as f,toDisplayString as i,normalizeClass as y,createVNode as es,Transition as ts,withCtx as ss,withDirectives as w,vModelText as H,vModelSelect as ne,createTextVNode as S,renderList as $,withModifiers as E,createStaticVNode as Ue,withKeys as ls,vShow as Be,h as ht}from"vue";const as={class:"memesluna-app-layout"},ns={class:"notion-content"},os={class:"content-breadcrumb-header"},is={class:"breadcrumbs"},rs={key:0,class:"crumb-parent"},us={key:1,class:"crumb-parent"},cs={key:2,class:"crumb-parent"},ds={key:3,class:"crumb-parent"},vs={class:"crumb-child active"},ps={key:0,class:"header-quick-stats"},gs={class:"stat-bubble"},fs={class:"stat-bubble"},ms={class:"stat-bubble"},hs={key:0,class:"notion-view-switcher"},bs={key:0,class:"toast-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},ys={key:1,class:"toast-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},ws={key:2,class:"toast-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},ks={key:1,class:"loading-container"},Cs={class:"content-body-wrapper"},_s={key:0,class:"resources-router-view"},xs={key:0,class:"collections-folder-view"},Is={class:"notion-db-header page-section-header collection-list-header"},$s={class:"notion-db-actions collection-toolbar"},Ms={class:"collection-search-shell"},Es={class:"collection-filter-shell"},Ls={key:0,class:"empty-placeholder-card"},Ss={key:1,class:"empty-placeholder-card"},Us={key:2,class:"folders-grid"},Bs=["onClick"],As=["src","alt"],Vs={key:1,class:"folder-cover-empty"},Ns={key:2,class:"folder-cover-badge"},Ps={class:"folder-body"},Rs={class:"folder-title-row"},Ts=["title"],Ds=["onClick"],Fs=["onClick"],zs=["onClick"],Os={class:"folder-count"},Hs={class:"folder-meta-row"},Ws={class:"folder-meta-item"},Gs={class:"asset-detail-shell"},js={class:"detail-topbar"},Zs={class:"detail-breadcrumbs"},qs={class:"detail-crumb-current"},Ks={class:"detail-top-actions"},Qs={class:"asset-hero-panel"},Js={class:"asset-identity-card"},Ys={class:"asset-avatar-frame"},Xs=["src","alt"],el={key:1,class:"asset-avatar-empty"},tl={class:"asset-title-stack"},sl={class:"asset-title-row"},ll={class:"asset-meta-line"},al={class:"asset-api-card"},nl={class:"asset-api-row"},ol=["disabled"],il={key:0,class:"api-preview-strip"},rl=["src"],ul={class:"asset-import-panel"},cl={class:"asset-import-header"},dl={class:"asset-import-actions"},vl={class:"asset-gallery-section"},pl={class:"asset-gallery-toolbar"},gl={class:"asset-tabs"},fl={class:"asset-filter-bar"},ml={class:"asset-search-box"},hl={class:"asset-view-toggle"},bl={class:"gallery-tab-content"},yl={key:0,class:"empty-gallery"},wl={key:1,class:"empty-gallery"},kl={key:2},Cl={key:0,class:"gallery-bulk-toolbar floating"},_l={class:"bulk-status"},xl={class:"bulk-meta"},Il={class:"bulk-actions"},$l={key:1,class:"bulk-move-group"},Ml=["value","disabled"],El=["disabled"],Ll=["onClick","title"],Sl={key:0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2.5"},Ul=["onClick","title"],Bl=["src"],Al={class:"gallery-list-meta"},Vl={class:"gallery-card-overlay"},Nl={key:0,class:"overlay-actions"},Pl=["onClick"],Rl={class:"move-dropdown-menu"},Tl=["onClick"],Dl=["onClick"],Fl={key:1,class:"overlay-actions"},zl=["onClick"],Ol=["onClick"],Hl={key:1,class:"pagination-container"},Wl=["disabled"],Gl={class:"page-indicator"},jl=["disabled"],Zl={class:"distribution-router-view"},ql={class:"endpoint-layout"},Kl={class:"notion-form-panel endpoint-editor-panel"},Ql={class:"panel-title-row"},Jl={class:"notion-panel-title"},Yl={class:"form-fields endpoint-form-grid"},Xl={class:"form-group"},ea=["disabled"],ta={class:"form-group"},sa={class:"form-group span-2"},la={class:"endpoint-preview span-2"},aa={class:"form-actions span-2"},na={class:"notion-table-panel"},oa={class:"table-title-row"},ia={class:"table-count"},ra={class:"table-container"},ua={class:"flat-table"},ca={key:0},da={class:"endpoint-name"},va=["title"],pa={class:"font-mono"},ga={class:"url-line"},fa=["onClick"],ma=["onClick"],ha=["title"],ba={style:{"text-align":"right"}},ya={class:"action-buttons"},wa=["href"],ka=["onClick"],Ca=["onClick"],_a={class:"staging-router-view"},xa={class:"notion-db-header page-section-header staging-page-header"},Ia={class:"staging-header-actions"},$a=["disabled"],Ma={class:"staging-toolbar"},Ea={class:"asset-search-box staging-search-box"},La={class:"staging-count-pill"},Sa={key:0,class:"empty-placeholder-card staging-empty-card"},Ua={key:1,class:"similar-staging-view"},Ba={key:0,class:"empty-gallery"},Aa={key:1,class:"similar-message"},Va={key:2,class:"empty-gallery"},Na={class:"similar-group-header"},Pa={class:"staging-grid"},Ra=["onClick"],Ta=["src","alt"],Da={class:"staging-card-body"},Fa={class:"staging-title-row"},za=["title"],Oa={class:"staging-ext-tag"},Ha={class:"staging-meta-grid"},Wa=["title"],Ga=["onUpdate:modelValue","disabled"],ja=["value"],Za={class:"staging-actions"},qa=["onClick","disabled"],Ka=["onClick","disabled"],Qa={key:2,class:"empty-gallery"},Ja={key:3,class:"staging-grid"},Ya=["onClick"],Xa=["src","alt"],en={class:"staging-card-body"},tn={class:"staging-title-row"},sn=["title"],ln={class:"staging-ext-tag"},an={class:"staging-meta-grid"},nn=["title"],on=["onUpdate:modelValue","disabled"],rn=["value"],un={class:"staging-actions"},cn=["onClick","disabled"],dn=["onClick","disabled"],vn={class:"settings-router-view"},pn={class:"settings-preview-panel"},gn={class:"preview-dashboard-grid"},fn={class:"preview-card route-table-card"},mn={class:"preview-card-header"},hn=["disabled"],bn={key:0,class:"preview-table-wrap"},yn={class:"preview-route-table"},wn=["src","alt","onError"],kn={class:"preview-route-name"},Cn=["title"],_n=["title","onClick"],xn={class:"preview-row-actions"},In=["href"],$n={key:1,class:"preview-empty-state"},Mn={class:"preview-card prompt-card"},En={class:"preview-card-header"},Ln=["disabled"],Sn={class:"preview-code-block final-prompt polished"},Un={key:0},Bn={key:1,class:"text-gray-muted"},An=Jt({__name:"Dashboard",setup(oe){const k=c("resources"),p=c(true),D=c("/memesluna"),Q=c("http://localhost:5140"),J=c([]),C=c([]),F=c([]),Ae=c(""),V=c({}),U=c(""),z=c("all"),Ve=c([]),Y=c(false),be=c(""),ie=c(false),N=c(null),m=Se({name:"",group:"",description:"",url:""}),Ne=c(new Set),Ke=c(""),u=c(null),ye=c(""),X=c("all"),W=c(null),we=c(""),re=c(""),x=Se({images:[],links:[]}),P=Se({}),O=c("all"),ue=c(false),B=c(new Set),ee=c(""),ce=c(""),de=c("name"),ve=c("all"),te=c("grid"),L=c(""),ke=c(false),se=c(null);function bt(l){se.value===l?se.value=null:se.value=l}function Pe(l){return B.value.has(l)}function Qe(l){const t=new Set(B.value);t.has(l)?t.delete(l):t.add(l),B.value=t}function pe(){B.value=new Set,ee.value=""}function yt(){const l=new Set(B.value),t=De.value.filter(s=>s.type==="local");Je.value?t.forEach(s=>l.delete(s.value)):t.forEach(s=>l.add(s.value)),B.value=l}function wt(l){if(l.type==="local"&&M.value.length){Qe(l.value);return}je(l.src)}const I=c(1),Re=c(24),kt=_(()=>{if(!u.value)return[];const l=x.images.map(s=>({id:`local:${s}`,type:"local",label:s,src:We(u.value.name,s),value:s})),t=x.links.map(s=>({id:`external:${s}`,type:"external",label:It(s),src:s,value:s}));return O.value==="local"?l:O.value==="external"?t:[...l,...t]}),Te=_(()=>{const l=ce.value.trim().toLowerCase();let t=kt.value.filter(s=>l?s.label.toLowerCase().includes(l)||s.value.toLowerCase().includes(l):true);return ve.value==="selected"&&(t=t.filter(s=>s.type==="local"&&B.value.has(s.value))),[...t].sort((s,a)=>de.value==="nameDesc"?a.label.localeCompare(s.label):s.label.localeCompare(a.label))}),le=_(()=>Math.max(1,Math.ceil(Te.value.length/Re.value))),De=_(()=>{const l=(I.value-1)*Re.value;return Te.value.slice(l,l+Re.value)}),M=_(()=>Array.from(B.value)),Je=_(()=>{const l=De.value.filter(t=>t.type==="local");return l.length>0&&l.every(t=>B.value.has(t.value))}),Ye=_(()=>{if(!u.value)return"";const l=x.images[0];return l?We(u.value.name,l):x.links[0]||""}),Xe=_(()=>u.value?j(u.value.name):""),et=_(()=>{var l;return((l=u.value)==null?void 0:l.totalCount)||x.images.length+x.links.length}),tt=_(()=>{const l=m.name.trim();return l?j(l):""}),st=_(()=>{const l=C.value.filter(s=>s.hasContent).map(s=>({id:`collection:${s.name}`,type:"collection",typeLabel:"表情包",name:s.name,description:s.description||`${s.name} 表情包`,path:`${D.value}/${s.name}`,fullUrl:j(s.name),previewImages:nt(s.name).slice(0,3)})),t=J.value.map(s=>{const a=j(s.name),v=Ne.value.has(`endpoint:${s.name}`)?[]:[a];return{id:`endpoint:${s.name}`,type:"endpoint",typeLabel:"重定向",name:s.name,description:s.description||"302 重定向",path:`${D.value}/${s.name}`,fullUrl:a,previewImages:v}});return[...l,...t]}),lt=_(()=>{const l=ye.value.trim().toLowerCase();return C.value.filter(t=>{const s=!l||t.name.toLowerCase().includes(l)||(t.description||"").toLowerCase().includes(l),a=X.value==="all"||X.value==="local"&&t.localCount>0&&t.linkCount===0||X.value==="external"&&t.linkCount>0;return s&&a})}),Ce=_(()=>{const l=Ae.value.trim().toLowerCase();return l?F.value.filter(t=>t.filename.toLowerCase().includes(l)||t.originalName.toLowerCase().includes(l)||t.source.toLowerCase().includes(l)||t.reason.toLowerCase().includes(l)):F.value}),Fe=_(()=>{const l=new Set(Ce.value.map(t=>t.id));return Ve.value.map((t,s)=>({...t,label:String(s+1),items:t.items.filter(a=>l.has(a.id))})).filter(t=>t.items.length>1)}),Ct=_(()=>{const l=new Map;for(const t of Fe.value)for(const s of t.items)l.set(s.id,s);return Array.from(l.values())}),ze=c(""),ge=c(""),fe=c(false),Oe=c(null),R=Se({show:false,message:"",type:"info"});let He=null;function r(l,t="info"){He&&clearTimeout(He),R.message=l,R.type=t,R.show=true,He=setTimeout(()=>{R.show=false},2500)}function _e(l){k.value=l,l==="settings"&&ot(),l==="staging"&&me()}function G(){const l=Q.value.endsWith("/")?Q.value.slice(0,-1):Q.value,t=D.value.startsWith("/")?D.value:`/${D.value}`,s=t.endsWith("/")?t.slice(0,-1):t;return`${l}${s}`}function j(l){return`${G()}/${l}`}function We(l,t){return`${G()}/api/admin/collections/${encodeURIComponent(l)}/images/${encodeURIComponent(t)}`}function xe(l){return`${G()}/api/admin/staged-images/${encodeURIComponent(l)}`}function _t(l){if(l.type!=="endpoint")return;const t=new Set(Ne.value);t.add(l.id),Ne.value=t}function Ie(l){if(!l)return"-";const t=new Date(l);return Number.isNaN(t.getTime())?"-":t.toLocaleDateString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit"})}function xt(l){return Number.isFinite(l)?String(Math.round(l*100))+"%":"-"}function at(l){if(!Number.isFinite(l)||l<=0)return"-";const t=["B","KB","MB","GB"];let s=l,a=0;for(;s>=1024&&a<t.length-1;)s/=1024,a++;return`${s>=10||a===0?s.toFixed(0):s.toFixed(1)} ${t[a]}`}function $e(l){const t=l.split(".").pop();return t?t.toUpperCase():"IMG"}function It(l){try{const t=new URL(l);return decodeURIComponent(t.pathname.split("/").filter(Boolean).pop()||t.hostname)||t.hostname}catch{return l}}function $t(l){return P[l]}function nt(l){var t;return((t=P[l])==null?void 0:t.images)||[]}function Ge(l){return nt(l).slice(0,6)}async function Mt(l){var t;if(!(!l.hasContent||(t=P[l.name])!=null&&t.images.length)){P[l.name]=P[l.name]||{loading:true,images:[]},P[l.name].loading=true;try{const s=await fetch(`${G()}/api/collections/${encodeURIComponent(l.name)}/resources`);if(!s.ok)return;const a=await s.json(),v=9,q=Array.isArray(a.images)?a.images.slice(0,v).map(Ee=>We(l.name,Ee)):[],he=Array.isArray(a.links)?a.links.slice(0,v-q.length):[];P[l.name].images=[...q,...he]}catch{P[l.name].images=[]}finally{P[l.name].loading=false}}}function Et(){C.value.filter(l=>l.hasContent).slice(0,24).forEach(l=>{Mt(l)})}async function h(){try{Q.value=window.location.origin;const l=await b("memesluna/getState");l&&(l.backendPath&&(D.value=l.backendPath),J.value=Array.isArray(l.endpoints)?l.endpoints:[],C.value=Array.isArray(l.collections)?l.collections:[],F.value=Array.isArray(l.stagedImages)?l.stagedImages:[],Et())}catch(l){r(l instanceof Error?l.message:"获取插件状态同步失败","error")}}async function ot(){try{const l=await fetch(`${G()}/api/homepage-data`);if(l.ok){const t=await l.json();ze.value=t.routeInventory||"",ge.value=t.llmPrompt||""}}catch(l){console.error("Failed to sync settings variables preview:",l)}}async function me(){try{const l=await b("memesluna/getStagedImages");F.value=Array.isArray(l)?l:[],z.value==="similar"&&await it()}catch(l){r(l instanceof Error?l.message:"刷新暂缓区失败","error")}}async function it(){Y.value=true;try{const l=await b("memesluna/getSimilarStagedImages");Ve.value=Array.isArray(l==null?void 0:l.groups)?l.groups:[],be.value=(l==null?void 0:l.message)||"",l&&l.available===false&&r(l.message||"相似图片筛选不可用","error")}catch(l){Ve.value=[],be.value="",r(l instanceof Error?l.message:"筛选相似图片失败","error")}finally{Y.value=false}}async function Lt(){if(z.value==="similar"){z.value="all";return}z.value="similar",await it()}async function rt(l){var s;const t=V.value[l.id];if(!t){r("请选择目标表情包","error");return}U.value=l.id;try{const a=await b("memesluna/promoteStagedImage",l.id,t);a?(r(`已归档到表情包 "${t}",新文件名 ${a}`,"success"),delete V.value[l.id]):r("暂缓图片不存在或已被处理","error"),await me(),await h(),((s=u.value)==null?void 0:s.name)===t&&await A(t)}catch(a){r(a instanceof Error?a.message:"归档暂缓图片失败","error")}finally{U.value=""}}async function ut(l){if(confirm(`确认从暂缓区删除 "${l.originalName||l.filename}" 吗?`)){U.value=l.id;try{await b("memesluna/deleteStagedImage",l.id)?(r("已从暂缓区删除","success"),delete V.value[l.id]):r("暂缓图片不存在或已被处理","error"),await me(),await h()}catch(t){r(t instanceof Error?t.message:"删除暂缓图片失败","error")}finally{U.value=""}}}async function St(l){let t=0;for(const s of l)try{const a=await ft(s.file);await b("memesluna/addStagedImage",{base64:a,originalName:s.file.name,source:u.value?`upload:${u.value.name}`:"upload-filter",reason:s.reason}),t++}catch(a){console.error("Failed to stage filtered image:",s.file.name,a)}return t&&await me(),t}function Ut(){Me(),ie.value=true}function ct(){Me(),ie.value=false}function Me(){N.value=null,m.name="",m.group="",m.description="",m.url=""}function Bt(l){N.value=l,ie.value=true,m.name=l.name||"",m.group=l.group||"",m.description=l.description||"",m.url=l.url||""}async function At(){const l=m.name.trim(),t=m.url.trim();if(!l||!t){r("端点名称和目标直链 URL 均必填","error");return}const s={name:l,group:m.group.trim()||"默认分组",description:m.description.trim(),url:t,method:"redirect"};try{p.value=true,N.value?(await b("memesluna/updateEndpoint",N.value.name,s),r("端点路由参数已成功更新","success")):(await b("memesluna/createEndpoint",s),r("接口端点已成功创建","success")),await h(),Me(),ie.value=false}catch(a){r(a instanceof Error?a.message:"保存端点失败","error")}finally{p.value=false}}async function Vt(l){if(confirm(`确认删除端点路由 "${l}" 吗?`))try{p.value=true,await b("memesluna/deleteEndpoint",l),r("该分发端点已彻底删除","success"),await h(),N.value&&N.value.name===l&&Me()}catch(t){r(t instanceof Error?t.message:"删除端点路由失败","error")}finally{p.value=false}}async function Z(l){try{await navigator.clipboard.writeText(l),r("成功复制链接到剪贴板","success")}catch{r("复制失败","error")}}async function Nt(){var t;let l=Ke.value.trim();if(l||(l=((t=window.prompt("请输入表情包名称"))==null?void 0:t.trim())||""),!l){r("表情包名称不能为空","error");return}try{if(p.value=true,!await b("memesluna/createCollection",l)){r("该名称的表情包已存在,请更换其他名称","error");return}r("表情包已成功创建","success"),Ke.value="",await h()}catch(s){r(s instanceof Error?s.message:"创建失败","error")}finally{p.value=false}}async function dt(l){if(W.value=null,!!confirm(`⚠️ 危险操作:确认永久且彻底删除表情包 "${l}",及其包含的所有本地图片文件吗?此项操作不可逆!`))try{p.value=true,await b("memesluna/deleteCollection",l),r("该表情包资源已彻底销毁删除","success"),u.value=null,await h()}catch(t){r(t instanceof Error?t.message:"删除失败","error")}finally{p.value=false}}async function vt(l){W.value=null,u.value=l,we.value=l.description||"",re.value="",ce.value="",de.value="name",ve.value="all",te.value="grid",L.value="",I.value=1,pe(),await A(l.name)}function Pt(){u.value=null,L.value&&URL.revokeObjectURL(L.value),L.value="",pe()}async function A(l){try{const t=await fetch(`${G()}/api/collections/${encodeURIComponent(l)}/resources`);if(t.ok){const s=await t.json();x.images=Array.isArray(s.images)?s.images:[],x.links=Array.isArray(s.links)?s.links:[];const a=new Set(x.images);B.value=new Set(M.value.filter(v=>a.has(v)))}}catch{r("加载该表情包下的图片缓存失败","error")}}async function Rt(){if(!u.value)return;p.value=true,await A(u.value.name),await h();const l=C.value.find(t=>t.name===u.value.name);l&&(u.value=l),p.value=false,r("本地及缓存资源数据已刷新成功","success")}async function Tt(){if(u.value){ke.value=true;try{const l=await fetch(Xe.value,{redirect:"follow"});if(!l.ok){r("测试接口未返回可用图片","error");return}const t=await l.blob();if(!t.type.startsWith("image/")){r("测试接口返回的不是图片资源","error");return}L.value&&URL.revokeObjectURL(L.value),L.value=URL.createObjectURL(t),r("已获取随机图片预览","success"),await h();const s=C.value.find(a=>{var v;return a.name===((v=u.value)==null?void 0:v.name)});s&&(u.value=s)}catch(l){r(l instanceof Error?l.message:"测试接口失败","error")}finally{ke.value=false}}}async function pt(){if(u.value)try{p.value=true,await b("memesluna/setCollectionDescription",u.value.name,we.value.trim()),r("表情包描述已成功保存","success"),await h();const l=C.value.find(t=>t.name===u.value.name);l&&(u.value=l)}catch(l){r(l instanceof Error?l.message:"保存表情包描述失败","error")}finally{p.value=false}}function Dt(){Oe.value&&Oe.value.click()}function Ft(l){const t=l.target;t.files&&gt(t.files)}function zt(l){fe.value=false,l.dataTransfer&&l.dataTransfer.files&&gt(l.dataTransfer.files)}async function gt(l){if(!u.value)return;const t=10*1024*1024,a=Array.from(l).filter(g=>{const K=g.name.toLowerCase();return g.type.startsWith("image/")||/\.(jpe?g|png|gif|bmp|webp|svg|tiff?|psd|avif)$/.test(K)});if(!a.length){r("请拖入或选择有效的图片格式文件","error");return}const v=a.filter(g=>g.name.toLowerCase().endsWith(".avif")),q=a.filter(g=>!g.name.toLowerCase().endsWith(".avif")),he=new Map;for(const g of q)g.size>t&&he.set(g,"文件大小超过 10MB,需人工复核后再决定是否归档");const Ee=Array.from(he,([g,K])=>({file:g,reason:K})),Le=q.filter(g=>!he.has(g));let ae=0;if(Ee.length&&(ae=await St(Ee)),!Le.length){if(ae>0){const g=v.length?`,${v.length} 张 AVIF 已直接拦截`:"";r(`已将 ${ae} 张被过滤图片放入暂缓区${g}`,"success")}else v.length?r("已拦截 AVIF 图片。此格式不会进入暂缓区,请先转码为 JPG/PNG/GIF/WEBP。","error"):r("图片已被过滤,但写入暂缓区失败","error");await h();return}if(Le.length>50){r("单次上传表情上限为 50 张,请分批次导入","error"),ae&&await h();return}r(`正在转码并上传 ${Le.length} 张表情图片...`,"info");try{const g=[];for(const T of Le){const Ze=await ft(T);g.push({base64:Ze,originalName:T.name})}const K=await fetch(`${G()}/api/admin/collections/${encodeURIComponent(u.value.name)}/images`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({images:g})});if(K.ok){const T=await K.json();if(T.ok&&T.uploaded&&T.uploaded.length>0){const Ze=ae?`,另有 ${ae} 张进入暂缓区`:"",Kt=v.length?`,${v.length} 张 AVIF 已直接拦截`:"";r(`成功将 ${T.uploaded.length} 张表情入库并完成数字重命名${Ze}${Kt}`,"success")}else r("上传图片写入失败","error")}else{const T=await K.json().catch(()=>({}));r(T.error||"上传中继失败","error")}}catch(g){r(`上传网络错误: ${g instanceof Error?g.message:"错误"}`,"error")}finally{await A(u.value.name),await h()}}function ft(l){return new Promise((t,s)=>{const a=new FileReader;a.readAsDataURL(l),a.onload=()=>{const q=a.result.split(",")[1];t(q)},a.onerror=v=>s(v)})}async function Ot(){if(!u.value)return;const l=re.value.trim();if(!l){r("链接文本不能为空","error");return}try{p.value=true;const t=await b("memesluna/addLinks",u.value.name,l);r(`已成功录入 ${t} 条网络图片外链`,"success"),re.value="",await A(u.value.name),await h()}catch(t){r(t instanceof Error?t.message:"添加失败","error")}finally{p.value=false}}async function Ht(l,t){if(confirm("确认删除该图片网络外链直链吗?"))try{p.value=true,await b("memesluna/deleteLink",l,t),r("外链直链已彻底删除","success"),await A(l),await h()}catch(s){r(s instanceof Error?s.message:"删除链接失败","error")}finally{p.value=false}}async function Wt(l,t){if(confirm(`确认永久删除该本地图片素材 "${t}" 吗?此操作无法恢复!`))try{p.value=true,await b("memesluna/deleteLocalImage",l,t),r("该本地图片已永久删除","success"),await A(l),await h()}catch(s){r(s instanceof Error?s.message:"删除失败","error")}finally{p.value=false}}async function Gt(){if(!u.value||!M.value.length)return;const l=M.value;if(confirm(`确认永久删除已选择的 ${l.length} 张本地图片素材吗?此操作无法恢复!`))try{p.value=true;for(const t of l)await b("memesluna/deleteLocalImage",u.value.name,t);r(`已删除 ${l.length} 张本地图片`,"success"),pe(),await A(u.value.name),await h()}catch(t){r(t instanceof Error?t.message:"批量删除失败","error")}finally{p.value=false}}async function jt(l,t,s){try{p.value=true,await b("memesluna/moveLocalImage",l,t,s)?(r(`已将素材移动至表情包 "${t}" 并重命名`,"success"),await A(l),await h()):r("移动失败","error")}catch(a){r(a instanceof Error?a.message:"移库失败","error")}finally{p.value=false}}async function Zt(){if(!u.value||!M.value.length||!ee.value)return;const l=u.value.name,t=ee.value;if(t===l){r("不能移动到当前表情包","error");return}const s=M.value;try{p.value=true;for(const a of s)await b("memesluna/moveLocalImage",l,t,a);r(`已将 ${s.length} 张素材移动至表情包 "${t}"`,"success"),pe(),await A(l),await h()}catch(a){r(a instanceof Error?a.message:"批量移动失败","error")}finally{p.value=false}}function je(l){window.open(l,"_blank")}function qt(l){W.value=W.value===l?null:l}const mt=()=>{se.value=null,W.value=null};return Yt(async()=>{window.addEventListener("click",mt),p.value=true,await h(),p.value=false}),Xt(()=>{window.removeEventListener("click",mt),L.value&&URL.revokeObjectURL(L.value)}),qe(x,()=>{I.value>le.value&&le.value>0&&(I.value=le.value)}),qe([ce,de,ve],()=>{I.value=1}),qe([ye,X],()=>{W.value=null}),(l,t)=>(n(),o("div",as,[d(" MAIN CONTENT AREA "),e("main",ns,[d(" Top Notion Breadcrumbs "),e("header",os,[e("div",is,[t[35]||(t[35]=e("span",{class:"crumb-root"},"MemesLuna 控制台",-1)),t[36]||(t[36]=e("span",{class:"crumb-separator"},"/",-1)),k.value==="resources"?(n(),o("span",rs,"表情包管理")):k.value==="distribution"?(n(),o("span",us,"分发管理")):k.value==="settings"?(n(),o("span",cs,"预览")):k.value==="staging"?(n(),o("span",ds,"暂缓区")):d("v-if",true),k.value==="resources"&&u.value?(n(),o(f,{key:4},[t[34]||(t[34]=e("span",{class:"crumb-separator"},"/",-1)),e("span",vs,"表情包: "+i(u.value.name),1)],64)):d("v-if",true)]),d(" Quick Stats Banner "),p.value?d("v-if",true):(n(),o("div",ps,[e("span",gs,"📂 表情包总数: "+i(C.value.length),1),e("span",fs,"🌐 分发接口: "+i(J.value.length),1),e("span",ms,"🕓 暂缓候选: "+i(F.value.length),1)]))]),d(" NOTION-STYLE HORIZONTAL VIEW SWITCHER "),u.value?d("v-if",true):(n(),o("div",hs,[e("button",{onClick:t[0]||(t[0]=s=>_e("resources")),class:y(["switcher-btn",k.value==="resources"?"active":""])},[...t[37]||(t[37]=[e("span",{class:"switcher-icon"},"📦",-1),e("span",{class:"switcher-label"},"表情包管理",-1)])],2),e("button",{onClick:t[1]||(t[1]=s=>_e("distribution")),class:y(["switcher-btn",k.value==="distribution"?"active":""])},[...t[38]||(t[38]=[e("span",{class:"switcher-icon"},"🌐",-1),e("span",{class:"switcher-label"},"分发管理",-1)])],2),e("button",{onClick:t[2]||(t[2]=s=>_e("staging")),class:y(["switcher-btn",k.value==="staging"?"active":""])},[...t[39]||(t[39]=[e("span",{class:"switcher-icon"},"🕓",-1),e("span",{class:"switcher-label"},"暂缓区",-1)])],2),e("button",{onClick:t[3]||(t[3]=s=>_e("settings")),class:y(["switcher-btn",k.value==="settings"?"active":""])},[...t[40]||(t[40]=[e("span",{class:"switcher-icon"},"👁️",-1),e("span",{class:"switcher-label"},"预览",-1)])],2)])),d(" Global Toast Alert Banner "),es(ts,{name:"fade"},{default:ss(()=>[R.show?(n(),o("div",{key:0,class:y(["toast-banner",R.type])},[R.type==="success"?(n(),o("svg",bs,[...t[41]||(t[41]=[e("polyline",{points:"20 6 9 17 4 12"},null,-1)])])):R.type==="error"?(n(),o("svg",ys,[...t[42]||(t[42]=[e("circle",{cx:"12",cy:"12",r:"10"},null,-1),e("line",{x1:"12",y1:"8",x2:"12",y2:"12"},null,-1),e("line",{x1:"12",y1:"16",x2:"12.01",y2:"16"},null,-1)])])):(n(),o("svg",ws,[...t[43]||(t[43]=[e("circle",{cx:"12",cy:"12",r:"10"},null,-1),e("line",{x1:"12",y1:"16",x2:"12",y2:"12"},null,-1),e("line",{x1:"12",y1:"8",x2:"12.01",y2:"8"},null,-1)])])),e("span",null,i(R.message),1)],2)):d("v-if",true)]),_:1}),d(" Loading Cover "),p.value?(n(),o("div",ks,[...t[44]||(t[44]=[e("div",{class:"spinner"},null,-1),e("p",null,"正在同步数据...",-1)])])):(n(),o(f,{key:2},[d(" MAIN ROUTER BODY "),e("div",Cs,[d(" MENU VIEW 1: RESOURCES (📦) "),k.value==="resources"?(n(),o("div",_s,[d(" Collection Lists (Folder view) "),u.value?(n(),o(f,{key:1},[d(" Collection Details (Inside details view) "),e("div",{class:"collection-detail-layout",onDragover:t[26]||(t[26]=E(s=>fe.value=true,["prevent"]))},[e("div",Gs,[e("div",js,[e("div",Zs,[e("button",{onClick:Pt,class:"detail-back-btn",title:"返回列表"},[...t[56]||(t[56]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("path",{d:"m15 18-6-6 6-6"})],-1),S(" 返回列表 ",-1)])]),t[57]||(t[57]=e("span",{class:"detail-separator"},"/",-1)),e("span",qs,i(u.value.name),1),t[58]||(t[58]=e("span",{class:"detail-separator"},"/",-1)),t[59]||(t[59]=e("span",{class:"detail-crumb-strong"},"图片素材",-1))]),e("div",Ks,[e("button",{onClick:Rt,class:"asset-btn secondary",title:"刷新缓存"},[...t[60]||(t[60]=[Ue('<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" data-v-cbb0f9f4><path d="M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16" data-v-cbb0f9f4></path><path d="M3 21v-5h5" data-v-cbb0f9f4></path><path d="M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8" data-v-cbb0f9f4></path><path d="M16 8h5V3" data-v-cbb0f9f4></path></svg> 刷新缓存 ',2)])]),e("button",{onClick:Dt,class:"asset-btn primary"},[...t[61]||(t[61]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}),e("path",{d:"m17 8-5-5-5 5"}),e("path",{d:"M12 3v12"})],-1),S(" 上传图片 ",-1)])]),e("button",{onClick:t[7]||(t[7]=s=>ue.value=!ue.value),class:"asset-btn secondary"},[...t[62]||(t[62]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("path",{d:"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"}),e("path",{d:"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"})],-1),S(" 导入外链 ",-1)])]),e("button",{onClick:t[8]||(t[8]=s=>dt(u.value.name)),class:"asset-btn danger ghost",title:"删除表情包"},[...t[63]||(t[63]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("path",{d:"M3 6h18"}),e("path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6"}),e("path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"})],-1)])]),e("input",{ref_key:"fileInput",ref:Oe,type:"file",multiple:"",accept:"image/*",class:"hidden-file-input",onChange:Ft},null,544)])]),e("section",Qs,[e("div",Js,[e("div",Ys,[Ye.value?(n(),o("img",{key:0,src:Ye.value,class:"asset-avatar-img",alt:`${u.value.name} 封面`},null,8,Xs)):(n(),o("div",el,[...t[64]||(t[64]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("path",{d:"M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"})],-1)])]))]),e("div",tl,[e("div",sl,[e("h1",null,i(u.value.name),1),t[65]||(t[65]=e("span",{class:"asset-pill"},"本地",-1))]),w(e("input",{"onUpdate:modelValue":t[9]||(t[9]=s=>we.value=s),class:"asset-description-input",placeholder:"添加表情包描述",onBlur:pt,onKeyup:ls(pt,["enter"])},null,544),[[H,we.value]]),e("div",ll,[e("span",null,"创建于 "+i(Ie(u.value.createdAt)),1),e("span",null,"最后更新 "+i(Ie(u.value.updatedAt)),1),e("span",null,"共 "+i(et.value)+" 张图片",1)])])]),e("div",al,[t[68]||(t[68]=e("div",{class:"asset-card-label"},"API 调用地址",-1)),e("div",nl,[e("code",null,i(Xe.value),1),e("button",{onClick:Tt,class:"asset-test-btn",disabled:ke.value},[t[66]||(t[66]=e("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[e("path",{d:"M8 5v14l11-7z"})],-1)),S(" "+i(ke.value?"测试中":"测试接口"),1)],8,ol)]),t[69]||(t[69]=e("div",{class:"asset-api-hint"},"直接访问该链接将随机返回一张表情图片",-1)),L.value?(n(),o("div",il,[e("img",{src:L.value,alt:"API 返回图片预览"},null,8,rl),t[67]||(t[67]=e("span",null,"随机预览",-1))])):d("v-if",true)])]),d(" Drag over drop zone area "),w(e("div",{class:"sidebar-drop-zone-overlay",onDragover:t[10]||(t[10]=E(s=>fe.value=true,["prevent"])),onDragleave:t[11]||(t[11]=E(s=>fe.value=false,["prevent"])),onDrop:E(zt,["prevent"])},[...t[70]||(t[70]=[Ue('<div class="drop-overlay-box" data-v-cbb0f9f4><svg class="drop-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" data-v-cbb0f9f4><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" data-v-cbb0f9f4></path><polyline points="17 8 12 3 7 8" data-v-cbb0f9f4></polyline><line x1="12" y1="3" x2="12" y2="15" data-v-cbb0f9f4></line></svg><p data-v-cbb0f9f4>释放图片文件以导入此表情包</p></div>',1)])],544),[[Be,fe.value]]),w(e("div",ul,[e("div",cl,[t[72]||(t[72]=e("div",null,[e("div",{class:"asset-import-title"},"导入外链图片"),e("div",{class:"asset-import-desc"},"每行一个以 http:// 或 https:// 开头的图片链接")],-1)),e("button",{onClick:t[12]||(t[12]=s=>ue.value=false),class:"asset-icon-btn compact",title:"关闭导入面板"},[...t[71]||(t[71]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("path",{d:"M18 6 6 18"}),e("path",{d:"m6 6 12 12"})],-1)])])]),w(e("textarea",{"onUpdate:modelValue":t[13]||(t[13]=s=>re.value=s),rows:"4",class:"asset-link-textarea",placeholder:"每行一个以 http:// 或 https:// 开头的链接"},null,512),[[H,re.value]]),e("div",dl,[e("button",{onClick:Ot,class:"asset-btn primary"},"确认导入"),e("button",{onClick:t[14]||(t[14]=s=>ue.value=false),class:"asset-btn secondary"},"取消")])],512),[[Be,ue.value]]),e("section",vl,[e("div",pl,[e("div",gl,[e("button",{onClick:t[15]||(t[15]=s=>{O.value="all",I.value=1}),class:y(["asset-tab",O.value==="all"?"active":""])},[t[73]||(t[73]=S(" 全部 ",-1)),e("span",null,i(et.value),1)],2),e("button",{onClick:t[16]||(t[16]=s=>{O.value="local",I.value=1}),class:y(["asset-tab",O.value==="local"?"active":""])},[t[74]||(t[74]=S(" 本地图片 ",-1)),e("span",null,i(x.images.length),1)],2),e("button",{onClick:t[17]||(t[17]=s=>{O.value="external",I.value=1}),class:y(["asset-tab",O.value==="external"?"active":""])},[t[75]||(t[75]=S(" 外链图片 ",-1)),e("span",null,i(x.links.length),1)],2)]),e("div",fl,[e("div",ml,[t[76]||(t[76]=e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("circle",{cx:"11",cy:"11",r:"8"}),e("path",{d:"m21 21-4.3-4.3"})],-1)),w(e("input",{"onUpdate:modelValue":t[18]||(t[18]=s=>ce.value=s),placeholder:"搜索图片或外链"},null,512),[[H,ce.value]])]),w(e("select",{"onUpdate:modelValue":t[19]||(t[19]=s=>ve.value=s),class:"asset-select"},[...t[77]||(t[77]=[e("option",{value:"all"},"筛选: 全部",-1),e("option",{value:"selected"},"筛选: 已选",-1)])],512),[[ne,ve.value]]),w(e("select",{"onUpdate:modelValue":t[20]||(t[20]=s=>de.value=s),class:"asset-select"},[...t[78]||(t[78]=[e("option",{value:"name"},"排序: 文件名",-1),e("option",{value:"nameDesc"},"排序: 文件名倒序",-1)])],512),[[ne,de.value]]),e("div",hl,[e("button",{onClick:t[21]||(t[21]=s=>te.value="grid"),class:y(te.value==="grid"?"active":""),title:"网格视图"},[...t[79]||(t[79]=[Ue('<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" data-v-cbb0f9f4><rect x="3" y="3" width="7" height="7" rx="1" data-v-cbb0f9f4></rect><rect x="14" y="3" width="7" height="7" rx="1" data-v-cbb0f9f4></rect><rect x="3" y="14" width="7" height="7" rx="1" data-v-cbb0f9f4></rect><rect x="14" y="14" width="7" height="7" rx="1" data-v-cbb0f9f4></rect></svg>',1)])],2),e("button",{onClick:t[22]||(t[22]=s=>te.value="list"),class:y(te.value==="list"?"active":""),title:"列表视图"},[...t[80]||(t[80]=[Ue('<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" data-v-cbb0f9f4><path d="M8 6h13" data-v-cbb0f9f4></path><path d="M8 12h13" data-v-cbb0f9f4></path><path d="M8 18h13" data-v-cbb0f9f4></path><path d="M3 6h.01" data-v-cbb0f9f4></path><path d="M3 12h.01" data-v-cbb0f9f4></path><path d="M3 18h.01" data-v-cbb0f9f4></path></svg>',1)])],2)])])]),e("div",bl,[!x.images.length&&!x.links.length?(n(),o("div",yl," 表情包内尚无任何图片资源 ")):Te.value.length?(n(),o("div",kl,[M.value.length?(n(),o("div",Cl,[e("div",_l,[t[81]||(t[81]=e("span",{class:"bulk-title"},"本地素材",-1)),e("span",xl,"已选择 "+i(M.value.length)+" 张",1)]),e("div",Il,[e("button",{onClick:yt,class:"toolbar-btn compact"},i(Je.value?"取消本页":"选择本页"),1),M.value.length?(n(),o("button",{key:0,onClick:pe,class:"toolbar-btn compact"}," 清空选择 ")):d("v-if",true),M.value.length?(n(),o("div",$l,[w(e("select",{"onUpdate:modelValue":t[23]||(t[23]=s=>ee.value=s),class:"flat-select compact-select"},[t[82]||(t[82]=e("option",{value:""},"移动到...",-1)),(n(true),o(f,null,$(C.value,s=>(n(),o("option",{key:s.name,value:s.name,disabled:s.name===u.value.name},i(s.name),9,Ml))),128))],512),[[ne,ee.value]]),e("button",{onClick:Zt,class:"toolbar-btn compact",disabled:!ee.value}," 移动 ",8,El)])):d("v-if",true),t[83]||(t[83]=e("button",{class:"toolbar-btn compact",disabled:""},"设置标签",-1)),M.value.length?(n(),o("button",{key:2,onClick:Gt,class:"toolbar-btn compact danger"}," 批量删除 ")):d("v-if",true)])])):d("v-if",true),e("div",{class:y(["notion-gallery-grid",te.value==="list"?"list-mode":""])},[(n(true),o(f,null,$(De.value,s=>(n(),o("div",{key:s.id,class:y(["notion-gallery-card",{"notion-gallery-card-active-dropdown":s.type==="local"&&se.value===s.value,selected:s.type==="local"&&Pe(s.value),external:s.type==="external"}])},[s.type==="local"?(n(),o("button",{key:0,class:"gallery-select-toggle",onClick:E(a=>Qe(s.value),["stop"]),title:Pe(s.value)?"取消选择":"选择图片"},[Pe(s.value)?(n(),o("svg",Sl,[...t[84]||(t[84]=[e("polyline",{points:"20 6 9 17 4 12"},null,-1)])])):d("v-if",true)],8,Ll)):d("v-if",true),e("div",{class:"gallery-img-container",onClick:a=>wt(s),style:{cursor:"pointer"},title:s.type==="local"&&M.value.length?"切换选择状态":"在新标签页中打开原图"},[e("img",{src:s.src,class:"gallery-img",loading:"lazy"},null,8,Bl),e("span",{class:y(["image-format-badge",s.type])},i(s.type==="external"?"LINK":$e(s.value)),3)],8,Ul),e("div",Al,[e("div",null,i(s.label),1),e("span",null,i(s.type==="external"?"外链图片":$e(s.value)),1)]),e("div",Vl,[s.type==="local"?(n(),o("div",Nl,[e("div",{class:"card-action-btn move move-dropdown-container",onClick:E(a=>bt(s.value),["stop"])},[t[85]||(t[85]=e("span",null,"修改",-1)),w(e("div",Rl,[(n(true),o(f,null,$(C.value,a=>(n(),o(f,null,[a.name!==u.value.name?(n(),o("button",{key:a.name,onClick:E(v=>jt(u.value.name,a.name,s.value),["stop"]),class:"dropdown-item"},i(a.name),9,Tl)):d("v-if",true)],64))),256))],512),[[Be,se.value===s.value]])],8,Pl),e("button",{onClick:E(a=>Wt(u.value.name,s.value),["stop"]),class:"card-action-btn danger"}," 删除 ",8,Dl)])):(n(),o("div",Fl,[e("button",{onClick:E(a=>Z(s.value),["stop"]),class:"card-action-btn"}," 复制 ",8,zl),e("button",{onClick:E(a=>Ht(u.value.name,s.value),["stop"]),class:"card-action-btn danger"}," 删除 ",8,Ol)]))])],2))),128))],2),le.value>1?(n(),o("div",Hl,[e("button",{disabled:I.value===1,onClick:t[24]||(t[24]=s=>I.value--),class:"btn btn-secondary page-btn"}," 上一页 ",8,Wl),e("span",Gl,[t[86]||(t[86]=S("第 ",-1)),e("b",null,i(I.value),1),S(" / "+i(le.value)+" 页",1)]),e("button",{disabled:I.value===le.value,onClick:t[25]||(t[25]=s=>I.value++),class:"btn btn-secondary page-btn"}," 下一页 ",8,jl)])):d("v-if",true)])):(n(),o("div",wl," 没有匹配当前搜索或筛选条件的图片 "))])])])],32)],2112)):(n(),o("div",xs,[d(" Creator bar in Notion Style "),e("div",Is,[t[49]||(t[49]=e("div",null,[e("h1",{class:"notion-main-title"},"表情包管理"),e("p",{class:"section-desc compact"},"管理表情包合集与图片素材")],-1)),e("div",$s,[e("div",Ms,[t[45]||(t[45]=e("svg",{class:"collection-toolbar-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("circle",{cx:"11",cy:"11",r:"8"}),e("path",{d:"m21 21-4.3-4.3"})],-1)),w(e("input",{"onUpdate:modelValue":t[4]||(t[4]=s=>ye.value=s),class:"flat-input collection-search-input",placeholder:"搜索表情包合集..."},null,512),[[H,ye.value]])]),e("label",Es,[t[47]||(t[47]=e("svg",{class:"collection-toolbar-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("path",{d:"M3 4h18l-7 8v6l-4 2v-8z"})],-1)),w(e("select",{"onUpdate:modelValue":t[5]||(t[5]=s=>X.value=s),class:"flat-select collection-filter-select","aria-label":"筛选表情包合集"},[...t[46]||(t[46]=[e("option",{value:"all"},"全部",-1),e("option",{value:"local"},"仅本地",-1),e("option",{value:"external"},"含外链",-1)])],512),[[ne,X.value]])]),e("button",{onClick:Nt,class:"btn btn-primary btn-notion"},[...t[48]||(t[48]=[e("span",{class:"btn-plus"},"+",-1),S(" 新建表情包 ",-1)])])])]),t[55]||(t[55]=e("hr",{class:"notion-hr"},null,-1)),d(" Folders grid layout "),C.value.length?lt.value.length?(n(),o("div",Us,[(n(true),o(f,null,$(lt.value,s=>{var a;return n(),o("div",{key:s.name,class:"folder-card",onClick:v=>vt(s)},[e("div",{class:y(["folder-cover",Ge(s.name).length?"has-preview":"empty"])},[Ge(s.name).length?(n(true),o(f,{key:0},$(Ge(s.name),v=>(n(),o("img",{key:v,src:v,class:"folder-cover-img",loading:"lazy",alt:`${s.name} 预览图`},null,8,As))),128)):(n(),o("div",Vs,[...t[52]||(t[52]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("path",{d:"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"})],-1)])])),(a=$t(s.name))!=null&&a.loading?(n(),o("span",Ns,"同步中")):d("v-if",true)],2),e("div",Ps,[e("div",Rs,[e("div",{class:"folder-name",title:s.description||s.name},i(s.name),9,Ts),e("button",{class:"folder-more-btn",title:"更多操作",onClick:E(v=>qt(s.name),["stop"])},[...t[53]||(t[53]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("circle",{cx:"5",cy:"12",r:"1"}),e("circle",{cx:"12",cy:"12",r:"1"}),e("circle",{cx:"19",cy:"12",r:"1"})],-1)])],8,Ds),W.value===s.name?(n(),o("div",{key:0,class:"folder-action-menu",onClick:t[6]||(t[6]=E(()=>{},["stop"]))},[e("button",{onClick:v=>vt(s)},"打开详情",8,Fs),e("button",{class:"danger",onClick:v=>dt(s.name)},"删除表情包",8,zs)])):d("v-if",true)]),e("div",Os,i(s.totalCount)+" 张图片",1),e("div",Hs,[e("span",Ws,[t[54]||(t[54]=e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("path",{d:"M3 7a2 2 0 0 1 2-2h5l2 3h7a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"})],-1)),S(" 本地 "+i(s.localCount)+" · 外链 "+i(s.linkCount),1)])])])],8,Bs)}),128))])):(n(),o("div",Ss,[...t[51]||(t[51]=[e("div",{class:"empty-icon"},"🔎",-1),e("h3",null,"没有匹配的表情包合集",-1),e("p",null,"换个关键词或筛选条件再试试。",-1)])])):(n(),o("div",Ls,[...t[50]||(t[50]=[e("div",{class:"empty-icon"},"📁",-1),e("h3",null,"尚未创建任何表情包",-1),e("p",null,"点击右上角按钮即可快速创建一个新的表情包合集。",-1)])]))]))])):k.value==="distribution"?(n(),o(f,{key:1},[d(" MENU VIEW 2: DISTRIBUTION (🌐) "),e("div",Zl,[e("div",{class:"notion-db-header page-section-header"},[t[87]||(t[87]=e("div",null,[e("h1",{class:"notion-main-title"},"分发管理"),e("p",{class:"section-desc compact"},"管理统一重定向端点与外部目标地址")],-1)),e("button",{onClick:Ut,class:"btn btn-primary btn-notion"}," + 新建端点 ")]),t[102]||(t[102]=e("hr",{class:"notion-hr"},null,-1)),e("div",ql,[d(" Endpoint Editor Form Panel "),w(e("div",Kl,[e("div",Ql,[e("h2",Jl,i(N.value?"编辑分发端点":"创建新分发端点"),1),e("button",{onClick:ct,class:"icon-btn hover-bg",title:"收起编辑器"},[...t[88]||(t[88]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e("line",{x1:"6",y1:"6",x2:"18",y2:"18"})],-1)])])]),e("div",Yl,[e("div",Xl,[t[89]||(t[89]=e("label",null,"端点名称 *",-1)),w(e("input",{"onUpdate:modelValue":t[27]||(t[27]=s=>m.name=s),disabled:!!N.value,class:"flat-input",placeholder:"例如: moe"},null,8,ea),[[H,m.name]]),t[90]||(t[90]=e("span",{class:"field-hint"},"只能包含字母、数字、下划线和连字符",-1))]),e("div",ta,[t[91]||(t[91]=e("label",null,"描述",-1)),w(e("input",{"onUpdate:modelValue":t[28]||(t[28]=s=>m.description=s),class:"flat-input",placeholder:"例如: 萌版横图"},null,512),[[H,m.description]])]),e("div",sa,[t[92]||(t[92]=e("label",null,"目标 URL *",-1)),w(e("input",{"onUpdate:modelValue":t[29]||(t[29]=s=>m.url=s),class:"flat-input",placeholder:"https://example.com/api"},null,512),[[H,m.url]])]),e("div",la,[t[93]||(t[93]=e("span",null,"访问预览",-1)),e("code",{onClick:t[30]||(t[30]=s=>Z(tt.value))},i(tt.value||"填写端点名称后生成预览"),1)]),e("div",aa,[e("button",{onClick:At,class:"btn btn-primary flex-grow"},i(N.value?"保存修改":"立即创建"),1),e("button",{onClick:ct,class:"btn btn-secondary"}," 取消 ")])])],512),[[Be,ie.value]]),d(" Endpoints Table List "),e("div",na,[e("div",oa,[t[94]||(t[94]=e("h2",{class:"notion-panel-title"},"端点列表",-1)),e("span",ia,i(J.value.length)+" 条路由",1)]),e("div",ra,[e("table",ua,[t[101]||(t[101]=e("thead",null,[e("tr",null,[e("th",{style:{width:"18%"}},"名称"),e("th",{style:{width:"20%"}},"描述"),e("th",{style:{width:"17%"}},"方式"),e("th",{style:{width:"35%"}},"访问路径 & 转发目标"),e("th",{style:{width:"10%","text-align":"right"}},"管理")])],-1)),e("tbody",null,[J.value.length?d("v-if",true):(n(),o("tr",ca,[...t[95]||(t[95]=[e("td",{colspan:"5",class:"empty-cell"},"尚未配置任何转发 API 端点",-1)])])),(n(true),o(f,null,$(J.value,s=>(n(),o("tr",{key:s.name},[e("td",null,[e("div",da,i(s.name),1)]),e("td",{class:"cell-desc",title:s.description},i(s.description||"-"),9,va),t[100]||(t[100]=e("td",null,[e("span",{class:"method-tag redirect"},"重定向"),e("div",{class:"target-url"},"302 重定向")],-1)),e("td",pa,[e("div",ga,[e("span",{class:"link-text",onClick:a=>Z(j(s.name))}," /"+i(s.name),9,fa),e("button",{onClick:a=>Z(j(s.name)),class:"icon-btn-inline",title:"复制完整链接"},[...t[96]||(t[96]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("rect",{x:"9",y:"9",width:"13",height:"13",rx:"2",ry:"2"}),e("path",{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"})],-1)])],8,ma)]),e("div",{class:"target-url truncate",title:s.url}," → "+i(s.url),9,ha)]),e("td",ba,[e("div",ya,[e("a",{href:j(s.name),target:"_blank",class:"icon-btn hover-bg",title:"测试该端点访问"},[...t[97]||(t[97]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"}),e("polyline",{points:"15 3 21 3 21 9"}),e("line",{x1:"10",y1:"14",x2:"21",y2:"3"})],-1)])],8,wa),e("button",{onClick:a=>Bt(s),class:"icon-btn hover-bg",title:"编辑参数"},[...t[98]||(t[98]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("path",{d:"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"}),e("path",{d:"M18.5 2.5a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4 9.5-9.5z"})],-1)])],8,ka),e("button",{onClick:a=>Vt(s.name),class:"icon-btn hover-danger",title:"彻底删除"},[...t[99]||(t[99]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("polyline",{points:"3 6 5 6 21 6"}),e("path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"})],-1)])],8,Ca)])])]))),128))])])])])])])],2112)):k.value==="staging"?(n(),o(f,{key:2},[d(" MENU VIEW 3: STAGING (暂缓区) "),e("div",_a,[e("div",xa,[t[103]||(t[103]=e("div",null,[e("h1",{class:"notion-main-title"},"暂缓区"),e("p",{class:"section-desc compact"},"复核被上传过滤器拦截或自动收集的候选图片,再手动归档到表情包分组")],-1)),e("div",Ia,[e("button",{onClick:Lt,class:y(["btn",z.value==="similar"?"btn-primary":"btn-secondary","btn-notion"]),disabled:Y.value||F.value.length<2},i(Y.value?"筛选中...":z.value==="similar"?"显示全部":"筛选相似图片"),11,$a),e("button",{onClick:me,class:"btn btn-secondary btn-notion"}," 刷新列表 ")])]),e("div",Ma,[e("div",Ea,[t[104]||(t[104]=e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("circle",{cx:"11",cy:"11",r:"8"}),e("path",{d:"m21 21-4.3-4.3"})],-1)),w(e("input",{"onUpdate:modelValue":t[31]||(t[31]=s=>Ae.value=s),placeholder:"搜索文件名、来源或原因"},null,512),[[H,Ae.value]])]),e("div",La,i(z.value==="similar"?Ct.value.length:Ce.value.length)+" / "+i(F.value.length)+" 张候选 ",1)]),F.value.length?z.value==="similar"?(n(),o("div",Ua,[Y.value?(n(),o("div",Ba,"正在筛选相似图片...")):be.value?(n(),o("div",Aa,i(be.value),1)):d("v-if",true),!Y.value&&!Fe.value.length?(n(),o("div",Va," 暂缓区没有匹配当前条件的相似图片 ")):d("v-if",true),(n(true),o(f,null,$(Fe.value,s=>(n(),o("section",{key:s.id,class:"similar-group"},[e("div",Na,[e("div",null,[e("h3",null,"相似组 "+i(s.label),1),e("p",null,i(s.items.length)+" 张候选,最高相似度 "+i(xt(s.similarity)),1)])]),e("div",Pa,[(n(true),o(f,null,$(s.items,a=>(n(),o("article",{key:a.id,class:"staging-card"},[e("button",{class:"staging-image-shell",onClick:v=>je(xe(a.id)),title:"打开原图"},[e("img",{class:"staging-image",src:xe(a.id),alt:a.originalName||a.filename,loading:"lazy"},null,8,Ta)],8,Ra),e("div",Da,[e("div",Fa,[e("div",{class:"staging-title",title:a.originalName||a.filename},i(a.originalName||a.filename),9,za),e("span",Oa,i($e(a.filename)),1)]),e("div",Ha,[e("span",{title:a.reason||"暂缓候选"},i(a.reason||"暂缓候选"),9,Wa),e("span",null,i(a.source||"filter"),1),e("span",null,i(at(a.size)),1),e("span",null,i(Ie(a.createdAt)),1)]),w(e("select",{"onUpdate:modelValue":v=>V.value[a.id]=v,class:"flat-select staging-select",disabled:!C.value.length},[t[106]||(t[106]=e("option",{value:""},"选择目标表情包",-1)),(n(true),o(f,null,$(C.value,v=>(n(),o("option",{key:v.name,value:v.name},i(v.name),9,ja))),128))],8,Ga),[[ne,V.value[a.id]]]),e("div",Za,[e("button",{onClick:v=>rt(a),class:"btn btn-primary staging-action-btn",disabled:U.value===a.id||!V.value[a.id]},i(U.value===a.id?"处理中...":"归档到表情包"),9,qa),e("button",{onClick:v=>ut(a),class:"btn btn-danger staging-action-btn",disabled:U.value===a.id}," 删除 ",8,Ka)])])]))),128))])]))),128))])):Ce.value.length?(n(),o("div",Ja,[(n(true),o(f,null,$(Ce.value,s=>(n(),o("article",{key:s.id,class:"staging-card"},[e("button",{class:"staging-image-shell",onClick:a=>je(xe(s.id)),title:"打开原图"},[e("img",{class:"staging-image",src:xe(s.id),alt:s.originalName||s.filename,loading:"lazy"},null,8,Xa)],8,Ya),e("div",en,[e("div",tn,[e("div",{class:"staging-title",title:s.originalName||s.filename},i(s.originalName||s.filename),9,sn),e("span",ln,i($e(s.filename)),1)]),e("div",an,[e("span",{title:s.reason||"暂缓候选"},i(s.reason||"暂缓候选"),9,nn),e("span",null,i(s.source||"filter"),1),e("span",null,i(at(s.size)),1),e("span",null,i(Ie(s.createdAt)),1)]),w(e("select",{"onUpdate:modelValue":a=>V.value[s.id]=a,class:"flat-select staging-select",disabled:!C.value.length},[t[107]||(t[107]=e("option",{value:""},"选择目标表情包",-1)),(n(true),o(f,null,$(C.value,a=>(n(),o("option",{key:a.name,value:a.name},i(a.name),9,rn))),128))],8,on),[[ne,V.value[s.id]]]),e("div",un,[e("button",{onClick:a=>rt(s),class:"btn btn-primary staging-action-btn",disabled:U.value===s.id||!V.value[s.id]},i(U.value===s.id?"处理中...":"归档到表情包"),9,cn),e("button",{onClick:a=>ut(s),class:"btn btn-danger staging-action-btn",disabled:U.value===s.id}," 删除 ",8,dn)])])]))),128))])):(n(),o("div",Qa," 没有匹配当前搜索条件的暂缓图片 ")):(n(),o("div",Sa,[...t[105]||(t[105]=[e("div",{class:"empty-icon"},"🕓",-1),e("h3",null,"暂缓区为空",-1),e("p",null,"上传时被过滤器拦截或自动收集命中的候选图片会先保存在这里,等待人工复核。",-1)])]))])],2112)):k.value==="settings"?(n(),o(f,{key:3},[d(" MENU VIEW 4: PREVIEW (👁️ 预览) "),e("div",vn,[e("div",pn,[e("div",{class:"notion-db-header page-section-header preview-page-header"},[t[108]||(t[108]=e("div",null,[e("h1",{class:"notion-main-title"},"预览"),e("p",{class:"section-desc compact"},"实时预览路由与最终提示词效果")],-1)),e("button",{onClick:ot,class:"btn btn-secondary btn-notion"}," 刷新预览 ")]),e("div",gn,[e("section",fn,[e("div",mn,[t[109]||(t[109]=e("div",null,[e("div",{class:"preview-card-title"},"路由清单"),e("div",{class:"preview-card-desc"},"{endpoint} 中可供 ChatLuna 使用的合集与端点")],-1)),e("button",{onClick:t[32]||(t[32]=s=>Z(ze.value)),class:"preview-action-btn",disabled:!ze.value,title:"复制路由清单"}," 复制清单 ",8,hn)]),st.value.length?(n(),o("div",bn,[e("table",yn,[t[111]||(t[111]=e("thead",null,[e("tr",null,[e("th",null,"预览"),e("th",null,"包名"),e("th",null,"描述"),e("th",null,"路径"),e("th",null,"操作")])],-1)),e("tbody",null,[(n(true),o(f,null,$(st.value,s=>(n(),o("tr",{key:s.id},[e("td",null,[s.previewImages.length?(n(),o("div",{key:0,class:y(["preview-mini-cover",s.previewImages.length===1?"single":""])},[(n(true),o(f,null,$(s.previewImages,a=>(n(),o("img",{key:a,src:a,alt:`${s.name} 预览`,loading:"lazy",onError:v=>_t(s)},null,40,wn))),128))],2)):(n(),o("div",{key:1,class:y(["preview-route-icon",s.type])},i(s.type==="collection"?"包":"API"),3))]),e("td",null,[e("div",kn,i(s.name),1),e("span",{class:y(["preview-route-type",s.type])},i(s.typeLabel),3)]),e("td",null,[e("div",{class:"preview-route-desc",title:s.description},i(s.description),9,Cn)]),e("td",null,[e("code",{class:"preview-route-path",title:s.fullUrl,onClick:a=>Z(s.fullUrl)},i(s.path),9,_n)]),e("td",null,[e("div",xn,[e("a",{href:s.fullUrl,target:"_blank",class:"icon-btn hover-bg",title:"打开预览"},[...t[110]||(t[110]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"}),e("polyline",{points:"15 3 21 3 21 9"}),e("line",{x1:"10",y1:"14",x2:"21",y2:"3"})],-1)])],8,In)])])]))),128))])])])):(n(),o("div",$n," 暂无可用表情包及路由,请前往表情包管理或分发管理中创建。 "))]),e("section",Mn,[e("div",En,[t[112]||(t[112]=e("div",null,[e("div",{class:"preview-card-title"},"最终提示词"),e("div",{class:"preview-card-desc"},"{memesluna} 注入给 LLM 的完整文本")],-1)),e("button",{onClick:t[33]||(t[33]=s=>Z(ge.value)),class:"preview-action-btn",disabled:!ge.value,title:"复制最终提示词"}," 复制提示词 ",8,Ln)]),e("div",Sn,[ge.value?(n(),o("pre",Un,i(ge.value),1)):(n(),o("pre",Bn,"- 正在获取最终提示词预览... -"))])])])])])],2112)):d("v-if",true)])],2112))])]))}}),Vn=(oe,k)=>{const p=oe.__vccOpts||oe;for(const[D,Q]of k)p[D]=Q;return p},Nn=Vn(An,[["__scopeId","data-v-cbb0f9f4"]]),Pn="M1024 512C1024 229.230208 794.769792 0 512 0 229.230208 0 0 229.230208 0 512 0 794.769792 229.230208 1024 512 1024 629.410831 1024 740.826187 984.331046 830.768465 912.686662 841.557579 904.092491 843.33693 888.379234 834.742758 877.590121 826.148587 866.801009 810.43533 865.021658 799.646219 873.615827 718.470035 938.277495 618.001779 974.048781 512 974.048781 256.817504 974.048781 49.951219 767.182496 49.951219 512 49.951219 256.817504 256.817504 49.951219 512 49.951219 767.182496 49.951219 974.048781 256.817504 974.048781 512 974.048781 599.492834 949.714859 683.336764 904.470807 755.960693 897.177109 767.668243 900.755245 783.071797 912.462793 790.365493 924.170342 797.659191 939.573897 794.081058 946.867595 782.373508 997.013826 701.880796 1024 608.898379 1024 512ZM337.170731 499.512194C371.654852 499.512194 399.609756 471.557291 399.609756 437.073171 399.609756 402.58905 371.654852 374.634146 337.170731 374.634146 302.686611 374.634146 274.731708 402.58905 274.731708 437.073171 274.731708 471.557291 302.686611 499.512194 337.170731 499.512194ZM711.804879 499.512194C746.288998 499.512194 774.243902 471.557291 774.243902 437.073171 774.243902 402.58905 746.288998 374.634146 711.804879 374.634146 677.320757 374.634146 649.365854 402.58905 649.365854 437.073171 649.365854 471.557291 677.320757 499.512194 711.804879 499.512194ZM352.788105 768.770967C396.165222 803.472661 453.151987 824.195121 524.487806 824.195121 595.823622 824.195121 652.810387 803.472661 696.187505 768.770967 722.700531 747.560546 738.882517 725.984565 746.631548 710.486505 752.800254 698.149092 747.799529 683.146916 735.462114 676.978208 723.124702 670.809502 708.122526 675.810227 701.953818 688.147642 701.03616 689.982957 698.492224 694.172969 694.165854 699.941463 686.602473 710.025971 676.927317 720.210345 664.983226 729.765617 630.311565 757.502948 584.273939 774.243902 524.487806 774.243902 464.70167 774.243902 418.664045 757.502948 383.992384 729.765617 372.048292 720.210345 362.373137 710.025971 354.809756 699.941463 350.483386 694.172969 347.93945 689.982957 347.021792 688.147642 340.853084 675.810227 325.850908 670.809502 313.513495 676.978208 301.176081 683.146916 296.175356 698.149092 302.344062 710.486505 310.093092 725.984565 326.275078 747.560546 352.788105 768.770967Z",Rn={name:"MemesLunaIcon",render(){return ht("svg",{class:"k-icon",viewBox:"0 0 1024 1024",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},[ht("path",{fill:"currentColor",d:Pn})])}};Qt.register("MemesLunaEmoji",Rn);const Fn=oe=>{oe.page({name:"MemesLuna",path:"/memesluna",icon:"MemesLunaEmoji",component:Nn,authority:1,order:500})};export{Fn as default};
1
+ import{send as 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&&gt(t.files)}function zt(l){fe.value=false,l.dataTransfer&&l.dataTransfer.files&&gt(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};
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .memesluna-app-layout[data-v-cbb0f9f4]{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-cbb0f9f4]{padding:80px 112px 112px;box-sizing:border-box;max-width:1880px;margin:0 auto}.content-breadcrumb-header[data-v-cbb0f9f4]{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-cbb0f9f4]{display:flex;align-items:center;gap:8px;font-size:.82rem;color:var(--k-text-muted, rgba(55, 53, 47, .5))}.crumb-root[data-v-cbb0f9f4]{font-weight:500}.crumb-parent[data-v-cbb0f9f4]{color:var(--k-text-normal, #37352f);font-weight:500}.crumb-child.active[data-v-cbb0f9f4]{color:var(--k-color-primary, #2383e2);font-weight:600}.crumb-separator[data-v-cbb0f9f4]{color:var(--k-color-border, rgba(55, 53, 47, .25))}.header-quick-stats[data-v-cbb0f9f4]{display:flex;gap:8px}.stat-bubble[data-v-cbb0f9f4]{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-cbb0f9f4]{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-cbb0f9f4]{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-cbb0f9f4]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .04));color:var(--k-text-normal, #37352f)}.switcher-btn.active[data-v-cbb0f9f4]{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-cbb0f9f4]{font-size:.95rem}.notion-db-header[data-v-cbb0f9f4]{display:flex;justify-content:space-between;align-items:center;margin-top:12px;margin-bottom:12px}.collection-list-header[data-v-cbb0f9f4]{gap:20px;justify-content:flex-end}.collection-title-group[data-v-cbb0f9f4]{display:flex;align-items:center;gap:22px;min-width:0}.notion-db-title[data-v-cbb0f9f4]{font-size:1.24rem;font-weight:700;margin:0;color:var(--k-text-normal, #37352f);white-space:nowrap}.collection-total-count[data-v-cbb0f9f4]{color:var(--k-text-muted, rgba(55, 53, 47, .58));font-size:.82rem;white-space:nowrap}.notion-db-actions[data-v-cbb0f9f4]{display:flex;align-items:center;gap:8px}.collection-toolbar[data-v-cbb0f9f4]{flex-wrap:nowrap;justify-content:flex-end}.collection-search-shell[data-v-cbb0f9f4],.collection-filter-shell[data-v-cbb0f9f4]{position:relative;display:inline-flex;align-items:center;color:var(--k-text-muted, rgba(55, 53, 47, .52))}.collection-toolbar-icon[data-v-cbb0f9f4]{position:absolute;right:11px;width:15px;height:15px;pointer-events:none;color:currentColor;z-index:1}.collection-search-shell .collection-search-input[data-v-cbb0f9f4]{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-cbb0f9f4]{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-cbb0f9f4]{width:200px;height:28px;font-size:.78rem}.btn-notion[data-v-cbb0f9f4]{height:36px;padding:0 14px;gap:6px;border-radius:6px;font-size:.84rem;font-weight:600;white-space:nowrap}.btn-plus[data-v-cbb0f9f4]{font-size:1rem;line-height:1}.notion-hr[data-v-cbb0f9f4]{border:none;border-top:1px solid var(--k-color-border, rgba(55, 53, 47, .09));margin:8px 0 20px}.folders-grid[data-v-cbb0f9f4]{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:20px 24px}.folder-card[data-v-cbb0f9f4]{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-cbb0f9f4]:hover{border-color:#2383e247;box-shadow:0 8px 24px #0f172a14;transform:translateY(-1px)}.folder-cover[data-v-cbb0f9f4]{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-cbb0f9f4]{background-color:var(--k-color-border, rgba(15, 23, 42, .08))}.folder-cover.empty[data-v-cbb0f9f4]{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-cbb0f9f4]{color:var(--k-text-muted, rgba(55, 53, 47, .55));background-color:var(--k-bg-button-hover, #f1f1ef)}.folder-cover-empty svg[data-v-cbb0f9f4]{width:32px;height:32px}.folder-cover-img[data-v-cbb0f9f4]{width:100%;height:100%;object-fit:cover;background-color:var(--k-bg-panel, #f7f7f5)}.folder-cover-badge[data-v-cbb0f9f4]{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-cbb0f9f4]{padding:15px 16px 16px;flex:1;display:flex;flex-direction:column;box-sizing:border-box;min-height:108px}.folder-title-row[data-v-cbb0f9f4]{position:relative;display:flex;align-items:center;justify-content:space-between;gap:10px}.folder-name[data-v-cbb0f9f4]{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-cbb0f9f4]{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-cbb0f9f4]: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-cbb0f9f4]{width:17px;height:17px}.folder-action-menu[data-v-cbb0f9f4]{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-cbb0f9f4]{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-cbb0f9f4]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .06))}.folder-action-menu button.danger[data-v-cbb0f9f4]{color:var(--k-color-danger, #eb5757)}.folder-count[data-v-cbb0f9f4]{margin-top:9px;color:var(--k-text-muted, rgba(55, 53, 47, .62));font-size:.86rem;line-height:1.4}.folder-meta-row[data-v-cbb0f9f4]{margin-top:8px;display:flex;align-items:center;min-width:0}.folder-meta-item[data-v-cbb0f9f4]{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-cbb0f9f4]{width:15px;height:15px;flex-shrink:0}.collection-detail-layout[data-v-cbb0f9f4]{margin-top:4px}.asset-detail-shell[data-v-cbb0f9f4]{display:flex;flex-direction:column;gap:14px}.detail-topbar[data-v-cbb0f9f4]{display:flex;align-items:center;justify-content:space-between;gap:16px;padding-bottom:8px}.detail-breadcrumbs[data-v-cbb0f9f4]{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-cbb0f9f4]{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-cbb0f9f4]: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-cbb0f9f4],.asset-btn svg[data-v-cbb0f9f4],.asset-icon-btn svg[data-v-cbb0f9f4],.asset-test-btn svg[data-v-cbb0f9f4],.asset-view-toggle svg[data-v-cbb0f9f4]{width:16px;height:16px;flex:0 0 16px}.detail-separator[data-v-cbb0f9f4]{color:var(--k-color-border, rgba(55, 53, 47, .3))}.detail-crumb-current[data-v-cbb0f9f4],.detail-crumb-strong[data-v-cbb0f9f4]{color:var(--k-text-normal, #111827);font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.detail-top-actions[data-v-cbb0f9f4]{display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:wrap}.asset-btn[data-v-cbb0f9f4],.asset-icon-btn[data-v-cbb0f9f4],.asset-test-btn[data-v-cbb0f9f4]{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-cbb0f9f4]:hover,.asset-icon-btn[data-v-cbb0f9f4]:hover,.asset-test-btn[data-v-cbb0f9f4]:hover{background-color:var(--k-bg-panel, #f8fafc)}.asset-btn.primary[data-v-cbb0f9f4],.asset-test-btn[data-v-cbb0f9f4]{border-color:transparent;background:#1f6feb;color:#fff;box-shadow:none}.asset-btn.primary[data-v-cbb0f9f4]:hover,.asset-test-btn[data-v-cbb0f9f4]:hover{background:#1a5fd0}.asset-btn.secondary[data-v-cbb0f9f4]{background-color:var(--k-bg-card, #ffffff)}.asset-btn.ghost[data-v-cbb0f9f4]{width:36px;padding:0}.asset-btn.danger[data-v-cbb0f9f4]{color:var(--k-color-danger, #eb5757)}.asset-btn.danger[data-v-cbb0f9f4]:hover{background-color:var(--memesluna-danger-soft-bg);border-color:var(--memesluna-danger-border)}.asset-hero-panel[data-v-cbb0f9f4]{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-cbb0f9f4]{display:flex;align-items:center;gap:16px;min-width:0}.asset-avatar-frame[data-v-cbb0f9f4]{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-cbb0f9f4]{width:100%;height:100%;object-fit:cover}.asset-avatar-empty[data-v-cbb0f9f4]{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-cbb0f9f4]{width:34px;height:34px}.asset-title-stack[data-v-cbb0f9f4]{min-width:0;flex:1}.asset-title-row[data-v-cbb0f9f4]{display:flex;align-items:center;gap:9px}.asset-title-row h1[data-v-cbb0f9f4]{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-cbb0f9f4]{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-cbb0f9f4]{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-cbb0f9f4]:focus{color:var(--k-text-normal, #111827)}.asset-meta-line[data-v-cbb0f9f4]{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-cbb0f9f4]{min-width:0;align-self:center;width:100%;box-shadow:none}.asset-card-label[data-v-cbb0f9f4]{color:var(--k-text-normal, #111827);font-size:.8rem;font-weight:720;margin-bottom:9px}.asset-api-row[data-v-cbb0f9f4]{display:grid;grid-template-columns:minmax(260px,1fr) auto;gap:10px;align-items:center}.asset-api-row code[data-v-cbb0f9f4]{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-cbb0f9f4]{min-height:34px;padding:0 11px;border-radius:10px;font-size:.76rem}.asset-icon-btn.compact[data-v-cbb0f9f4]{width:32px;min-height:32px;padding:0}.asset-test-btn[data-v-cbb0f9f4]:disabled{opacity:.68;cursor:wait}.asset-api-hint[data-v-cbb0f9f4]{margin-top:10px;color:var(--k-text-muted, rgba(55, 53, 47, .56));font-size:.74rem}.api-preview-strip[data-v-cbb0f9f4]{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-cbb0f9f4]{width:42px;height:42px;object-fit:cover;border-radius:10px;box-shadow:none}.asset-import-panel[data-v-cbb0f9f4]{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-cbb0f9f4]{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin-bottom:10px}.asset-import-title[data-v-cbb0f9f4]{color:var(--k-text-normal, #111827);font-size:.9rem;font-weight:720}.asset-import-desc[data-v-cbb0f9f4]{margin-top:3px;color:var(--k-text-muted, rgba(55, 53, 47, .56));font-size:.75rem}.asset-link-textarea[data-v-cbb0f9f4]{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-cbb0f9f4]: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-cbb0f9f4]{display:flex;justify-content:flex-end;gap:8px;margin-top:10px}.asset-gallery-section[data-v-cbb0f9f4]{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-cbb0f9f4]{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-cbb0f9f4],.asset-filter-bar[data-v-cbb0f9f4],.asset-view-toggle[data-v-cbb0f9f4]{display:flex;align-items:center;gap:6px}.asset-tabs[data-v-cbb0f9f4]{flex-wrap:wrap}.asset-tab[data-v-cbb0f9f4]{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-cbb0f9f4]:hover,.asset-tab.active[data-v-cbb0f9f4]{color:var(--k-color-primary, #2563eb);background-color:var(--memesluna-primary-soft-bg)}.asset-tab span[data-v-cbb0f9f4]{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-cbb0f9f4]{flex:1;justify-content:flex-end;min-width:0}.asset-search-box[data-v-cbb0f9f4]{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-cbb0f9f4]{width:16px;height:16px;flex:0 0 16px}.asset-search-box input[data-v-cbb0f9f4]{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-cbb0f9f4]{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-cbb0f9f4]{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-cbb0f9f4]{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-cbb0f9f4]{background-color:var(--k-bg-card, #ffffff);color:var(--k-color-primary, #2563eb)}.notion-page-toolbar[data-v-cbb0f9f4]{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-cbb0f9f4]{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-cbb0f9f4]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .04));color:var(--k-text-normal, #37352f)}.toolbar-btn.danger[data-v-cbb0f9f4]{color:var(--k-color-danger, #eb5757)}.toolbar-btn.danger[data-v-cbb0f9f4]:hover{background-color:var(--memesluna-danger-soft-bg)}.toolbar-divider[data-v-cbb0f9f4]{width:1px;height:14px;background-color:var(--k-color-border, rgba(55, 53, 47, .12))}.notion-properties-panel[data-v-cbb0f9f4]{margin-bottom:20px;display:flex;flex-direction:column;gap:6px}.property-row[data-v-cbb0f9f4]{display:flex;align-items:center;font-size:.82rem}.property-label[data-v-cbb0f9f4]{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-cbb0f9f4]{font-size:.95rem}.property-value[data-v-cbb0f9f4]{flex:1}.property-input-text[data-v-cbb0f9f4]{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-cbb0f9f4]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .03))}.property-input-text[data-v-cbb0f9f4]: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-cbb0f9f4]{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-cbb0f9f4]{font-size:1.15rem;-webkit-user-select:none;user-select:none}.callout-content[data-v-cbb0f9f4]{flex:1;min-width:0}.callout-title[data-v-cbb0f9f4]{font-weight:600;font-size:.85rem;color:var(--k-text-normal, #37352f);margin-bottom:2px}.callout-desc[data-v-cbb0f9f4]{font-size:.75rem;color:var(--k-text-muted, rgba(55, 53, 47, .5));margin-bottom:10px;line-height:1.4}.callout-actions[data-v-cbb0f9f4]{display:flex;gap:8px}.btn-small[data-v-cbb0f9f4]{font-size:.75rem;padding:2px 10px;height:24px}.hidden-file-input[data-v-cbb0f9f4]{display:none}.sidebar-drop-zone-overlay[data-v-cbb0f9f4]{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-cbb0f9f4]{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-cbb0f9f4]{width:48px;height:48px;margin-bottom:16px}.gallery-view-switcher[data-v-cbb0f9f4]{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-cbb0f9f4]{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-cbb0f9f4]:hover{color:var(--k-text-normal, #37352f)}.gallery-tab-btn.active[data-v-cbb0f9f4]{color:var(--k-text-normal, #37352f);border-bottom-color:var(--k-text-normal, #37352f)}.gallery-tab-content[data-v-cbb0f9f4]{padding:14px;margin-top:0}.gallery-bulk-toolbar[data-v-cbb0f9f4]{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-cbb0f9f4]{position:sticky;top:8px;z-index:40;max-width:920px}.bulk-status[data-v-cbb0f9f4]{display:flex;align-items:center;gap:8px;min-width:0}.bulk-title[data-v-cbb0f9f4]{font-size:.82rem;font-weight:720;color:var(--k-text-normal, #37352f)}.bulk-meta[data-v-cbb0f9f4]{font-size:.72rem;color:var(--k-text-muted, rgba(55, 53, 47, .55))}.bulk-actions[data-v-cbb0f9f4],.bulk-move-group[data-v-cbb0f9f4]{display:flex;align-items:center;gap:6px;flex-wrap:wrap;justify-content:flex-end}.toolbar-btn.compact[data-v-cbb0f9f4]{font-size:.74rem;padding:5px 9px;border-radius:10px}.toolbar-btn[data-v-cbb0f9f4]:disabled{opacity:.45;cursor:not-allowed}.compact-select[data-v-cbb0f9f4]{height:30px;padding:2px 9px;font-size:.74rem;border-radius:10px}.notion-gallery-grid[data-v-cbb0f9f4]{display:grid;grid-template-columns:repeat(auto-fill,minmax(174px,1fr));gap:7px}.notion-gallery-card[data-v-cbb0f9f4]{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-cbb0f9f4]:hover,.notion-gallery-card.selected[data-v-cbb0f9f4]{box-shadow:none}.notion-gallery-card.selected .gallery-img-container[data-v-cbb0f9f4]{box-shadow:inset 0 0 0 2px var(--k-color-primary, #2563eb)}.notion-gallery-card.external .gallery-img-container[data-v-cbb0f9f4]{background-color:var(--k-bg-card, #ffffff)}.gallery-select-toggle[data-v-cbb0f9f4]{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-cbb0f9f4]{width:14px;height:14px}.notion-gallery-card:hover .gallery-select-toggle[data-v-cbb0f9f4],.notion-gallery-card.selected .gallery-select-toggle[data-v-cbb0f9f4]{opacity:1}.gallery-img-container[data-v-cbb0f9f4]{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-cbb0f9f4]{width:100%;height:100%;object-fit:cover}.image-format-badge[data-v-cbb0f9f4]{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-cbb0f9f4]{background:#0d9488d1}.gallery-list-meta[data-v-cbb0f9f4]{display:none}.notion-gallery-grid.list-mode[data-v-cbb0f9f4]{grid-template-columns:1fr;gap:8px}.notion-gallery-grid.list-mode .notion-gallery-card[data-v-cbb0f9f4]{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-cbb0f9f4]{height:68px}.notion-gallery-grid.list-mode .gallery-list-meta[data-v-cbb0f9f4]{display:block;min-width:0;padding-right:88px}.gallery-list-meta div[data-v-cbb0f9f4]{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-cbb0f9f4]{display:block;margin-top:4px;color:var(--k-text-muted, rgba(55, 53, 47, .55));font-size:.72rem}.gallery-card-overlay[data-v-cbb0f9f4]{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-cbb0f9f4],.notion-gallery-card-active-dropdown .gallery-card-overlay[data-v-cbb0f9f4]{opacity:1}.overlay-actions[data-v-cbb0f9f4]{position:absolute;top:8px;right:8px;display:flex;gap:6px;pointer-events:auto}.overlay-actions .card-action-btn[data-v-cbb0f9f4]{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-cbb0f9f4]:hover{background:var(--k-color-success, #2b8a5c);color:#fff}.overlay-actions .card-action-btn[data-v-cbb0f9f4]:hover{background:var(--k-bg-card, #ffffff);color:var(--k-color-primary, #2563eb)}.overlay-actions .card-action-btn.danger[data-v-cbb0f9f4]{color:var(--k-color-danger, #eb5757)}.overlay-actions .card-action-btn.danger[data-v-cbb0f9f4]:hover{background:var(--k-color-danger, #eb5757);color:#fff}.flat-input[data-v-cbb0f9f4],.flat-select[data-v-cbb0f9f4],.flat-textarea[data-v-cbb0f9f4]{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-cbb0f9f4]:focus,.flat-select[data-v-cbb0f9f4]:focus,.flat-textarea[data-v-cbb0f9f4]: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-cbb0f9f4]::placeholder,.flat-textarea[data-v-cbb0f9f4]::placeholder,.property-input-text[data-v-cbb0f9f4]::placeholder{color:var(--k-text-muted, rgba(55, 53, 47, .45));opacity:.78}.flat-input[data-v-cbb0f9f4]: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-cbb0f9f4]{font-size:.7rem;color:var(--k-text-muted, rgba(55, 53, 47, .45));margin-top:4px;display:block}.btn[data-v-cbb0f9f4]{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-cbb0f9f4]{background-color:var(--k-color-primary, #2383e2);color:#fff}.btn-primary[data-v-cbb0f9f4]:hover{background-color:var(--k-color-primary-shade, #1a6cb8)}.btn-secondary[data-v-cbb0f9f4]{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-cbb0f9f4]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .04))}.btn-danger[data-v-cbb0f9f4]{background-color:var(--k-color-danger, #eb5757);color:#fff}.btn-danger[data-v-cbb0f9f4]:hover{background-color:var(--k-color-danger-shade, #d44c4c)}.w-full[data-v-cbb0f9f4]{width:100%}.mt-2[data-v-cbb0f9f4]{margin-top:8px}.mt-3[data-v-cbb0f9f4]{margin-top:12px}.mt-4[data-v-cbb0f9f4]{margin-top:16px}.empty-placeholder-card[data-v-cbb0f9f4]{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-cbb0f9f4]{font-size:2.5rem;margin-bottom:12px}.empty-placeholder-card h3[data-v-cbb0f9f4]{font-size:.95rem;margin:0 0 6px;font-weight:600}.empty-placeholder-card p[data-v-cbb0f9f4]{font-size:.78rem;color:var(--k-text-muted, rgba(55, 53, 47, .5));margin:0}.empty-gallery[data-v-cbb0f9f4]{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-cbb0f9f4]{position:relative}.move-dropdown-menu[data-v-cbb0f9f4]{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-cbb0f9f4]{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-cbb0f9f4]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .04))}.pagination-container[data-v-cbb0f9f4]{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-cbb0f9f4]{font-size:.78rem;color:var(--k-text-muted, rgba(55, 53, 47, .6))}.page-btn[data-v-cbb0f9f4]{height:28px;padding:0 10px;font-size:.75rem}.links-list-container[data-v-cbb0f9f4]{border:1px solid var(--k-color-border, rgba(55, 53, 47, .09));border-radius:6px;overflow:hidden}.link-item-row[data-v-cbb0f9f4]{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-cbb0f9f4]:last-child{border-bottom:none}.link-item-row[data-v-cbb0f9f4]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .015))}.link-url-wrapper[data-v-cbb0f9f4]{display:flex;align-items:center;gap:8px;flex:1;min-width:0;margin-right:16px}.bullet[data-v-cbb0f9f4]{color:var(--k-text-muted, rgba(55, 53, 47, .35));font-weight:700}.link-url-text[data-v-cbb0f9f4]{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-cbb0f9f4]:hover{color:var(--k-color-primary, #2383e2);text-decoration:underline}.link-actions[data-v-cbb0f9f4]{display:flex;gap:6px}.staging-router-view[data-v-cbb0f9f4]{display:flex;flex-direction:column;gap:16px}.staging-page-header[data-v-cbb0f9f4]{margin-bottom:4px}.staging-header-actions[data-v-cbb0f9f4]{display:flex;align-items:center;gap:8px;flex-wrap:wrap;justify-content:flex-end}.similar-staging-view[data-v-cbb0f9f4]{display:flex;flex-direction:column;gap:16px}.similar-message[data-v-cbb0f9f4]{color:var(--k-text-muted, rgba(55, 53, 47, .58));font-size:.78rem;font-weight:650}.similar-group[data-v-cbb0f9f4]{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-cbb0f9f4]:first-of-type{padding-top:0;border-top:none}.similar-group-header[data-v-cbb0f9f4]{display:flex;align-items:center;justify-content:space-between;gap:12px}.similar-group-header h3[data-v-cbb0f9f4]{margin:0;color:var(--k-text-normal, #111827);font-size:.96rem;font-weight:750}.similar-group-header p[data-v-cbb0f9f4]{margin:4px 0 0;color:var(--k-text-muted, rgba(55, 53, 47, .58));font-size:.74rem}.staging-toolbar[data-v-cbb0f9f4]{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-cbb0f9f4]{max-width:420px}.staging-count-pill[data-v-cbb0f9f4]{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-cbb0f9f4]{margin-top:8px}.staging-grid[data-v-cbb0f9f4]{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:14px}.staging-card[data-v-cbb0f9f4]{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-cbb0f9f4]{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-cbb0f9f4]{width:100%;height:100%;object-fit:contain;display:block}.staging-card-body[data-v-cbb0f9f4]{padding:12px;display:flex;flex-direction:column;gap:10px}.staging-title-row[data-v-cbb0f9f4]{display:flex;align-items:center;justify-content:space-between;gap:8px;min-width:0}.staging-title[data-v-cbb0f9f4]{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-cbb0f9f4]{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-cbb0f9f4]{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-cbb0f9f4]{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.staging-select[data-v-cbb0f9f4]{width:100%;height:34px}.staging-actions[data-v-cbb0f9f4]{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px}.staging-action-btn[data-v-cbb0f9f4]{min-width:0;width:100%;white-space:nowrap}.page-section-header[data-v-cbb0f9f4]{align-items:center;justify-content:space-between;gap:16px;margin-top:0;margin-bottom:14px}.page-section-header>div[data-v-cbb0f9f4]{min-width:0}.page-section-header .notion-main-title[data-v-cbb0f9f4]{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-cbb0f9f4]{align-self:center}.section-desc.compact[data-v-cbb0f9f4]{margin:8px 0 0;max-width:620px;line-height:1.45}.endpoint-layout[data-v-cbb0f9f4]{display:flex;flex-direction:column;gap:16px}.notion-form-panel[data-v-cbb0f9f4]{padding:12px 0}.endpoint-editor-panel[data-v-cbb0f9f4]{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-cbb0f9f4],.table-title-row[data-v-cbb0f9f4]{display:flex;align-items:center;justify-content:space-between;gap:12px}.notion-panel-title[data-v-cbb0f9f4]{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-cbb0f9f4],.table-title-row .notion-panel-title[data-v-cbb0f9f4]{margin-bottom:0}.table-count[data-v-cbb0f9f4]{font-size:.72rem;color:var(--k-text-muted, rgba(55, 53, 47, .5))}.form-fields[data-v-cbb0f9f4]{display:flex;flex-direction:column;gap:12px}.form-group[data-v-cbb0f9f4]{display:flex;flex-direction:column}.endpoint-form-grid[data-v-cbb0f9f4]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:14px}.span-2[data-v-cbb0f9f4]{grid-column:1 / -1}.form-group label[data-v-cbb0f9f4]{font-size:.75rem;font-weight:600;color:var(--k-text-muted, rgba(55, 53, 47, .65));margin-bottom:4px}.form-row[data-v-cbb0f9f4]{display:flex;gap:10px}.form-actions[data-v-cbb0f9f4]{display:flex;gap:8px;margin-top:8px}.flex-grow[data-v-cbb0f9f4]{flex:1}.endpoint-preview[data-v-cbb0f9f4]{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-cbb0f9f4]{color:var(--k-text-muted, rgba(55, 53, 47, .5));font-size:.72rem;font-weight:600;flex-shrink:0}.endpoint-preview code[data-v-cbb0f9f4]{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-cbb0f9f4]{padding:12px 0}.table-title-row[data-v-cbb0f9f4]{margin-bottom:8px}.table-container[data-v-cbb0f9f4]{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-cbb0f9f4]{width:100%;border-collapse:collapse;font-size:.78rem}.flat-table th[data-v-cbb0f9f4]{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-cbb0f9f4]{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-cbb0f9f4]{border-bottom:none}.empty-cell[data-v-cbb0f9f4]{text-align:center;padding:40px!important;color:var(--k-text-muted, rgba(55, 53, 47, .35))}.endpoint-name[data-v-cbb0f9f4]{font-weight:600}.group-badge[data-v-cbb0f9f4]{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-cbb0f9f4]{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-cbb0f9f4]{font-size:.65rem;font-weight:600;padding:1px 5px;border-radius:3px;text-transform:uppercase;margin-right:6px}.method-tag.redirect[data-v-cbb0f9f4]{background-color:var(--memesluna-primary-soft-bg);color:var(--k-color-primary, #2383e2)}.link-text[data-v-cbb0f9f4]{font-weight:500;color:var(--k-color-primary, #2383e2);cursor:pointer}.link-text[data-v-cbb0f9f4]:hover{text-decoration:underline}.target-url[data-v-cbb0f9f4]{font-size:.72rem;color:var(--k-text-muted, rgba(55, 53, 47, .4));max-width:300px;margin-top:2px}.url-line[data-v-cbb0f9f4]{display:flex;align-items:center;gap:4px}.font-mono[data-v-cbb0f9f4]{font-family:SFMono-Regular,Consolas,monospace}.truncate[data-v-cbb0f9f4]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.action-buttons[data-v-cbb0f9f4]{display:flex;justify-content:flex-end;gap:4px}.icon-btn[data-v-cbb0f9f4]{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-cbb0f9f4]{width:12px;height:12px}.icon-btn.hover-bg[data-v-cbb0f9f4]: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-cbb0f9f4]: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-cbb0f9f4]{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-cbb0f9f4]:hover{color:var(--k-color-primary, #2383e2)}.icon-btn-inline svg[data-v-cbb0f9f4]{width:10px;height:10px}.settings-preview-panel[data-v-cbb0f9f4]{width:100%;max-width:none;margin:0 auto}.preview-page-header[data-v-cbb0f9f4]{margin-bottom:12px}.preview-dashboard-grid[data-v-cbb0f9f4]{display:grid;grid-template-columns:minmax(560px,1fr) minmax(420px,.9fr);gap:22px;align-items:start}.preview-card[data-v-cbb0f9f4]{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-cbb0f9f4]{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-cbb0f9f4]{color:var(--k-text-normal, #111827);font-size:1rem;line-height:1.25;font-weight:760}.preview-card-desc[data-v-cbb0f9f4]{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-cbb0f9f4]{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-cbb0f9f4]:hover:not(:disabled){background-color:var(--k-bg-panel, #f8fafc)}.preview-action-btn[data-v-cbb0f9f4]:disabled{opacity:.45;cursor:not-allowed}.preview-table-wrap[data-v-cbb0f9f4]{overflow-x:auto}.preview-route-table[data-v-cbb0f9f4]{width:100%;border-collapse:collapse;table-layout:fixed}.preview-route-table th[data-v-cbb0f9f4],.preview-route-table td[data-v-cbb0f9f4]{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-cbb0f9f4]{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-cbb0f9f4]{border-bottom:none}.preview-route-table th[data-v-cbb0f9f4]:nth-child(1),.preview-route-table td[data-v-cbb0f9f4]:nth-child(1){width:86px}.preview-route-table th[data-v-cbb0f9f4]:nth-child(2),.preview-route-table td[data-v-cbb0f9f4]:nth-child(2){width:130px}.preview-route-table th[data-v-cbb0f9f4]:nth-child(4),.preview-route-table td[data-v-cbb0f9f4]:nth-child(4){width:186px}.preview-route-table th[data-v-cbb0f9f4]:nth-child(5),.preview-route-table td[data-v-cbb0f9f4]:nth-child(5){width:64px;text-align:center}.preview-mini-cover[data-v-cbb0f9f4]{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-cbb0f9f4]{display:block}.preview-mini-cover img[data-v-cbb0f9f4]{width:100%;height:100%;object-fit:cover;background-color:var(--k-bg-panel, #f7f7f5)}.preview-route-icon[data-v-cbb0f9f4]{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-cbb0f9f4]{background-color:var(--memesluna-success-soft-bg);color:var(--k-color-success, #2b8a5c)}.preview-route-name[data-v-cbb0f9f4]{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-cbb0f9f4]{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-cbb0f9f4]{background-color:var(--memesluna-success-soft-bg);color:var(--k-color-success, #2b8a5c)}.preview-route-desc[data-v-cbb0f9f4]{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-cbb0f9f4]{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-cbb0f9f4]{display:flex;align-items:center;justify-content:center}.preview-empty-state[data-v-cbb0f9f4]{padding:64px 20px;color:var(--k-text-muted, rgba(55, 53, 47, .48));text-align:center;font-size:.82rem}.preview-prompt-container[data-v-cbb0f9f4]{display:flex;flex-direction:column;gap:12px}.preview-sub-title[data-v-cbb0f9f4]{font-size:.72rem;font-weight:600;color:var(--k-text-muted, rgba(55, 53, 47, .45));text-transform:uppercase}.preview-sub-desc[data-v-cbb0f9f4]{margin-top:2px;font-size:.72rem;color:var(--k-text-muted, rgba(55, 53, 47, .45))}.preview-block-header[data-v-cbb0f9f4]{display:flex;align-items:flex-end;justify-content:space-between;gap:12px}.preview-code-block[data-v-cbb0f9f4]{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-cbb0f9f4]{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-cbb0f9f4]{max-height:620px;background-color:var(--memesluna-final-prompt-bg);border-color:var(--memesluna-primary-soft-bg)}.preview-code-block.polished[data-v-cbb0f9f4]{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-cbb0f9f4]{color:var(--memesluna-code-text);font-size:.76rem;line-height:1.7}.text-gray-muted[data-v-cbb0f9f4]{color:var(--k-text-muted, rgba(55, 53, 47, .35));font-style:italic}.toast-banner[data-v-cbb0f9f4]{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-cbb0f9f4]{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-cbb0f9f4]{background-color:var(--memesluna-toast-error-bg);border-color:var(--memesluna-danger-border);color:var(--k-color-danger, #eb5757)}.toast-icon[data-v-cbb0f9f4]{width:14px;height:14px;flex-shrink:0}.loading-container[data-v-cbb0f9f4]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:80px 0}.spinner[data-v-cbb0f9f4]{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-cbb0f9f4 .8s linear infinite;margin-bottom:12px}@keyframes spin-cbb0f9f4{to{transform:rotate(360deg)}}.loading-container p[data-v-cbb0f9f4]{font-size:.78rem;color:var(--k-text-muted, rgba(55, 53, 47, .5));margin:0}.fade-enter-active[data-v-cbb0f9f4],.fade-leave-active[data-v-cbb0f9f4]{transition:opacity .15s ease,transform .15s ease}.fade-enter-from[data-v-cbb0f9f4],.fade-leave-to[data-v-cbb0f9f4]{opacity:0;transform:translateY(-8px)}@media (max-width: 1280px){.notion-content[data-v-cbb0f9f4]{padding:64px 80px 96px}.preview-dashboard-grid[data-v-cbb0f9f4]{grid-template-columns:1fr}.staging-grid[data-v-cbb0f9f4]{grid-template-columns:repeat(auto-fill,minmax(210px,1fr))}}@media (max-width: 780px){.memesluna-app-layout[data-v-cbb0f9f4]{padding-left:0}.notion-content[data-v-cbb0f9f4]{padding:18px 16px}.content-breadcrumb-header[data-v-cbb0f9f4],.notion-db-header[data-v-cbb0f9f4],.page-section-header[data-v-cbb0f9f4],.notion-page-header[data-v-cbb0f9f4],.gallery-bulk-toolbar[data-v-cbb0f9f4]{align-items:stretch;flex-direction:column}.notion-db-actions[data-v-cbb0f9f4],.bulk-actions[data-v-cbb0f9f4],.form-actions[data-v-cbb0f9f4],.staging-header-actions[data-v-cbb0f9f4],.collection-name-input-notion[data-v-cbb0f9f4],.notion-db-actions .btn[data-v-cbb0f9f4],.form-actions .btn[data-v-cbb0f9f4]{width:100%}.endpoint-form-grid[data-v-cbb0f9f4]{grid-template-columns:1fr}.span-2[data-v-cbb0f9f4]{grid-column:auto}.folders-grid[data-v-cbb0f9f4]{grid-template-columns:1fr}.notion-gallery-grid[data-v-cbb0f9f4]{grid-template-columns:repeat(auto-fill,minmax(130px,1fr))}.preview-block-header[data-v-cbb0f9f4],.preview-card-header[data-v-cbb0f9f4]{align-items:stretch;flex-direction:column}.preview-action-btn[data-v-cbb0f9f4]{width:100%}.staging-toolbar[data-v-cbb0f9f4]{align-items:stretch;flex-direction:column}.staging-search-box[data-v-cbb0f9f4]{max-width:none;width:100%}.preview-route-table[data-v-cbb0f9f4]{min-width:720px}}@media (max-width: 1180px){.asset-hero-panel[data-v-cbb0f9f4]{grid-template-columns:1fr}}@media (max-width: 980px){.detail-topbar[data-v-cbb0f9f4],.asset-gallery-toolbar[data-v-cbb0f9f4]{align-items:stretch;flex-direction:column}.detail-top-actions[data-v-cbb0f9f4],.asset-filter-bar[data-v-cbb0f9f4]{justify-content:flex-start}.asset-filter-bar[data-v-cbb0f9f4]{flex-wrap:wrap}.asset-search-box[data-v-cbb0f9f4]{max-width:none;width:100%}}@media (max-width: 640px){.asset-hero-panel[data-v-cbb0f9f4]{padding:14px;border-radius:14px}.asset-identity-card[data-v-cbb0f9f4]{align-items:flex-start}.asset-avatar-frame[data-v-cbb0f9f4]{width:72px;height:72px;flex-basis:72px;border-radius:14px}.asset-title-row h1[data-v-cbb0f9f4]{font-size:1.35rem}.asset-api-row[data-v-cbb0f9f4]{grid-template-columns:1fr}.asset-tabs[data-v-cbb0f9f4],.detail-top-actions[data-v-cbb0f9f4]{width:100%}.asset-btn[data-v-cbb0f9f4]{flex:1}.notion-gallery-grid[data-v-cbb0f9f4]{grid-template-columns:repeat(auto-fill,minmax(138px,1fr))}.staging-grid[data-v-cbb0f9f4],.staging-actions[data-v-cbb0f9f4]{grid-template-columns:1fr}}
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}}
package/lib/index.d.ts CHANGED
@@ -3,4 +3,7 @@ import { Config } from './config';
3
3
  export declare function apply(ctx: Context, config: Config): void;
4
4
  export * from './config';
5
5
  export * from './service';
6
- export declare const inject: string[];
6
+ export declare const inject: {
7
+ required: string[];
8
+ optional: string[];
9
+ };
package/lib/index.js CHANGED
@@ -64,23 +64,29 @@ function hashImageBuffer(buffer) {
64
64
  return (0, import_crypto.createHash)("sha256").update(buffer).digest("hex");
65
65
  }
66
66
  __name(hashImageBuffer, "hashImageBuffer");
67
+ var cachedSharp = void 0;
68
+ var cachedPhoton = void 0;
67
69
  function loadOptionalSharp() {
70
+ if (cachedSharp !== void 0) return cachedSharp;
68
71
  try {
69
72
  const packageName = "sharp";
70
73
  const sharpModule = require(packageName);
71
- return sharpModule.default || sharpModule;
74
+ cachedSharp = sharpModule.default || sharpModule;
72
75
  } catch {
73
- return null;
76
+ cachedSharp = null;
74
77
  }
78
+ return cachedSharp;
75
79
  }
76
80
  __name(loadOptionalSharp, "loadOptionalSharp");
77
81
  function loadPhoton() {
82
+ if (cachedPhoton !== void 0) return cachedPhoton;
78
83
  try {
79
84
  const packageName = "@cf-wasm/photon/node";
80
- return require(packageName);
85
+ cachedPhoton = require(packageName);
81
86
  } catch {
82
- return null;
87
+ cachedPhoton = null;
83
88
  }
89
+ return cachedPhoton;
84
90
  }
85
91
  __name(loadPhoton, "loadPhoton");
86
92
  function countHexBitDistance(a, b) {
@@ -203,7 +209,8 @@ var MemesLunaService = class extends import_koishi.Service {
203
209
  },
204
210
  {
205
211
  primary: "id",
206
- unique: [["collection", "index"]]
212
+ unique: [["collection", "index"]],
213
+ indexes: ["hash"]
207
214
  }
208
215
  );
209
216
  this.ctx.database.extend(
@@ -233,7 +240,8 @@ var MemesLunaService = class extends import_koishi.Service {
233
240
  },
234
241
  {
235
242
  primary: "id",
236
- unique: ["filename"]
243
+ unique: ["filename"],
244
+ indexes: ["hash"]
237
245
  }
238
246
  );
239
247
  }
@@ -258,22 +266,27 @@ var MemesLunaService = class extends import_koishi.Service {
258
266
  } catch {
259
267
  return;
260
268
  }
261
- for (const colName of folders) {
269
+ await Promise.all(folders.map(async (colName) => {
262
270
  const colDir = this.getCollectionDir(colName);
263
271
  let files = [];
264
272
  try {
265
273
  const entries = await import_promises.default.readdir(colDir, { withFileTypes: true });
266
274
  files = entries.filter((e) => e.isFile() && this.isImageFile(e.name)).map((e) => e.name);
267
275
  } catch {
268
- continue;
276
+ return;
269
277
  }
278
+ const existingImages = await this.ctx.database.get("memesluna_images", { collection: colName });
279
+ const existingIndices = new Set(existingImages.map((img) => img.index));
280
+ const existingExternalValues = new Set(
281
+ existingImages.filter((img) => img.type === "external").map((img) => img.value)
282
+ );
283
+ let maxIndex = existingImages.reduce((max, img) => Math.max(max, img.index), 0);
270
284
  for (const filename of files) {
271
285
  const ext = import_path.default.extname(filename).toLowerCase();
272
286
  const basename = import_path.default.basename(filename, ext);
273
287
  let index = parseInt(basename, 10);
274
288
  if (isNaN(index) || String(index) !== basename || index < 1 || index > 99999) {
275
- const maxImg = await this.ctx.database.get("memesluna_images", { collection: colName }, { limit: 1, sort: { index: "desc" } });
276
- index = maxImg.length ? maxImg[0].index + 1 : 1;
289
+ index = ++maxIndex;
277
290
  const newFilename = `${index}${ext}`;
278
291
  const oldPath = import_path.default.join(colDir, filename);
279
292
  const newPath = import_path.default.join(colDir, newFilename);
@@ -290,22 +303,27 @@ var MemesLunaService = class extends import_koishi.Service {
290
303
  ...await this.getImageFingerprints(await import_promises.default.readFile(newPath)),
291
304
  created_at: /* @__PURE__ */ new Date()
292
305
  });
306
+ existingIndices.add(index);
293
307
  } catch {
294
308
  }
295
309
  } else {
296
- const existing = await this.ctx.database.get("memesluna_images", { collection: colName, index });
297
- if (!existing.length) {
298
- await this.ctx.database.create("memesluna_images", {
299
- id: (0, import_crypto.randomUUID)(),
300
- collection: colName,
301
- index,
302
- filename,
303
- type: "local",
304
- value: filename,
305
- mime: this.getMimeByFilename(filename),
306
- ...await this.getImageFingerprints(await import_promises.default.readFile(import_path.default.join(colDir, filename))),
307
- created_at: /* @__PURE__ */ new Date()
308
- });
310
+ if (!existingIndices.has(index)) {
311
+ try {
312
+ await this.ctx.database.create("memesluna_images", {
313
+ id: (0, import_crypto.randomUUID)(),
314
+ collection: colName,
315
+ index,
316
+ filename,
317
+ type: "local",
318
+ value: filename,
319
+ mime: this.getMimeByFilename(filename),
320
+ ...await this.getImageFingerprints(await import_promises.default.readFile(import_path.default.join(colDir, filename))),
321
+ created_at: /* @__PURE__ */ new Date()
322
+ });
323
+ existingIndices.add(index);
324
+ maxIndex = Math.max(maxIndex, index);
325
+ } catch {
326
+ }
309
327
  }
310
328
  }
311
329
  }
@@ -314,10 +332,8 @@ var MemesLunaService = class extends import_koishi.Service {
314
332
  const text = await import_promises.default.readFile(linksFile, "utf8");
315
333
  const links = text.split(/\r?\n/g).map((line) => line.trim()).filter((line) => line.startsWith("http://") || line.startsWith("https://"));
316
334
  for (const link of links) {
317
- const existing = await this.ctx.database.get("memesluna_images", { collection: colName, value: link, type: "external" });
318
- if (!existing.length) {
319
- const maxImg = await this.ctx.database.get("memesluna_images", { collection: colName }, { limit: 1, sort: { index: "desc" } });
320
- const index = maxImg.length ? maxImg[0].index + 1 : 1;
335
+ if (!existingExternalValues.has(link)) {
336
+ const index = ++maxIndex;
321
337
  await this.ctx.database.create("memesluna_images", {
322
338
  id: (0, import_crypto.randomUUID)(),
323
339
  collection: colName,
@@ -330,12 +346,14 @@ var MemesLunaService = class extends import_koishi.Service {
330
346
  perceptual_hash: "",
331
347
  created_at: /* @__PURE__ */ new Date()
332
348
  });
349
+ existingExternalValues.add(link);
350
+ existingIndices.add(index);
333
351
  }
334
352
  }
335
353
  await import_promises.default.rm(linksFile, { force: true });
336
354
  } catch {
337
355
  }
338
- }
356
+ }));
339
357
  }
340
358
  async ensureStorage() {
341
359
  await import_promises.default.mkdir(this.getStorageRoot(), { recursive: true });
@@ -742,12 +760,15 @@ var MemesLunaService = class extends import_koishi.Service {
742
760
  if (!normalized.length) {
743
761
  return 0;
744
762
  }
763
+ const existingImages = await this.ctx.database.get("memesluna_images", { collection: collectionName });
764
+ const existingExternalValues = new Set(
765
+ existingImages.filter((img) => img.type === "external").map((img) => img.value)
766
+ );
767
+ let maxIndex = existingImages.reduce((max, img) => Math.max(max, img.index), 0);
745
768
  let addedCount = 0;
746
769
  for (const link of normalized) {
747
- const existing = await this.ctx.database.get("memesluna_images", { collection: collectionName, value: link, type: "external" });
748
- if (!existing.length) {
749
- const maxImg = await this.ctx.database.get("memesluna_images", { collection: collectionName }, { limit: 1, sort: { index: "desc" } });
750
- const index = maxImg.length ? maxImg[0].index + 1 : 1;
770
+ if (!existingExternalValues.has(link)) {
771
+ const index = ++maxIndex;
751
772
  await this.ctx.database.create("memesluna_images", {
752
773
  id: (0, import_crypto.randomUUID)(),
753
774
  collection: collectionName,
@@ -760,6 +781,7 @@ var MemesLunaService = class extends import_koishi.Service {
760
781
  perceptual_hash: "",
761
782
  created_at: /* @__PURE__ */ new Date()
762
783
  });
784
+ existingExternalValues.add(link);
763
785
  addedCount++;
764
786
  }
765
787
  }
@@ -832,15 +854,13 @@ var MemesLunaService = class extends import_koishi.Service {
832
854
  }
833
855
  }
834
856
  }
835
- async addLocalImageBase64(collectionName, base64Data, originalName) {
857
+ async addLocalImageBuffer(collectionName, buffer, originalName, extHint) {
836
858
  this.ensureCollectionName(collectionName);
837
859
  if (!await this.collectionExists(collectionName)) {
838
860
  throw new Error(`Collection not found: ${collectionName}`);
839
861
  }
840
- const { base64, extHint } = this.normalizeBase64(base64Data);
841
- const buffer = Buffer.from(base64, "base64");
842
862
  if (!buffer.length) {
843
- throw new Error("Invalid image base64 payload");
863
+ throw new Error("Invalid image payload");
844
864
  }
845
865
  const fingerprints = await this.getImageFingerprints(buffer);
846
866
  const duplicate = await this.getDuplicateImageByHash(fingerprints.hash, { includeStaged: false, includeImages: true });
@@ -887,6 +907,11 @@ var MemesLunaService = class extends import_koishi.Service {
887
907
  }
888
908
  return finalName;
889
909
  }
910
+ async addLocalImageBase64(collectionName, base64Data, originalName) {
911
+ const { base64, extHint } = this.normalizeBase64(base64Data);
912
+ const buffer = Buffer.from(base64, "base64");
913
+ return this.addLocalImageBuffer(collectionName, buffer, originalName, extHint);
914
+ }
890
915
  async addStagedImageBuffer(buffer, originalName, source = "filter", reason = "") {
891
916
  if (!buffer.length) {
892
917
  throw new Error("Invalid image payload");
@@ -963,7 +988,7 @@ var MemesLunaService = class extends import_koishi.Service {
963
988
  const staged = await this.getStagedImageBuffer(id);
964
989
  if (!staged) return null;
965
990
  const originalName = this.isImageFile(row.original_name) ? row.original_name : row.filename;
966
- const saved = await this.addLocalImageBase64(collectionName, staged.buffer.toString("base64"), originalName);
991
+ const saved = await this.addLocalImageBuffer(collectionName, staged.buffer, originalName);
967
992
  await this.deleteStagedImage(id);
968
993
  return saved;
969
994
  }
@@ -1129,7 +1154,7 @@ var MemesLunaService = class extends import_koishi.Service {
1129
1154
  if (!await this.collectionExists(collectionName)) {
1130
1155
  return null;
1131
1156
  }
1132
- const count = (await this.ctx.database.get("memesluna_images", { collection: collectionName }, ["id"])).length;
1157
+ const count = await this.ctx.database.eval("memesluna_images", (row) => import_koishi.Eval.count(row.id), { collection: collectionName });
1133
1158
  if (count === 0) {
1134
1159
  return null;
1135
1160
  }
@@ -2085,7 +2110,10 @@ function apply(ctx, config) {
2085
2110
  }
2086
2111
  }
2087
2112
  __name(apply, "apply");
2088
- var inject = ["database", "chatluna", "server"];
2113
+ var inject = {
2114
+ required: ["database", "chatluna", "server"],
2115
+ optional: ["memesluna"]
2116
+ };
2089
2117
  // Annotate the CommonJS export names for ESM import in node:
2090
2118
  0 && (module.exports = {
2091
2119
  Config,
package/lib/service.d.ts CHANGED
@@ -118,6 +118,7 @@ export declare class MemesLunaService extends Service {
118
118
  private buildStagedFilename;
119
119
  private resolveStagedImagePath;
120
120
  private deduplicateFilename;
121
+ addLocalImageBuffer(collectionName: string, buffer: Buffer, originalName?: string, extHint?: string): Promise<string>;
121
122
  addLocalImageBase64(collectionName: string, base64Data: string, originalName?: string): Promise<string>;
122
123
  addStagedImageBuffer(buffer: Buffer, originalName?: string, source?: string, reason?: string): Promise<StagedImageInfo>;
123
124
  addStagedImageBase64(base64Data: string, originalName?: string, source?: string, reason?: string): Promise<StagedImageInfo>;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "koishi-plugin-memesluna",
3
3
  "description": "Image Forward service for Koishi with ChatLuna integration",
4
- "version": "0.4.4",
4
+ "version": "0.4.5",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "types": "lib/index.d.ts",
@@ -42,15 +42,13 @@
42
42
  },
43
43
  "dependencies": {
44
44
  "@cf-wasm/photon": "^0.3.6",
45
- "koishi-plugin-chatluna": "^1.3.0-alpha.49",
46
- "koishi-plugin-chatluna-storage-service": "^1.0.6"
45
+ "koishi-plugin-chatluna": "^1.3.0-alpha.49"
47
46
  },
48
47
  "devDependencies": {
49
48
  "@koishijs/client": "^5.30.11",
50
49
  "@koishijs/plugin-console": "^5.30.11",
51
50
  "@koishijs/plugin-server": "^3.2.7",
52
51
  "koishi": "^4.18.9",
53
- "koishi-plugin-chatluna-storage-service": "^1.0.6",
54
52
  "typescript": "^5.0.0",
55
53
  "yakumo": "^1.0.0",
56
54
  "yakumo-esbuild": "^1.0.0",
@@ -60,8 +58,7 @@
60
58
  "@koishijs/plugin-console": "^5.30.11",
61
59
  "@koishijs/plugin-server": "^3.2.7",
62
60
  "koishi": "^4.18.9",
63
- "koishi-plugin-chatluna": "^1.3.0-alpha.49",
64
- "koishi-plugin-chatluna-storage-service": "^1.0.6"
61
+ "koishi-plugin-chatluna": "^1.3.0-alpha.49"
65
62
  },
66
63
  "peerDependenciesMeta": {
67
64
  "@koishijs/plugin-console": {