koishi-plugin-memesluna 0.2.10 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{icons as r}from"@koishijs/client";import{h as e}from"vue";const o="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",a={name:"MemesLunaIcon",render(){return e("svg",{class:"k-icon",viewBox:"0 0 1024 1024",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},[e("path",{fill:"currentColor",d:o})])}},s={name:"MemesLunaDashboard",render(){return e("iframe",{src:"/memesluna/",style:"width: 100%; height: calc(100vh - 120px); border: 0; background: transparent;"})}};r.register("MemesLunaEmoji",a);const c=n=>{n.page({name:"MemesLuna",path:"/memesluna/",icon:"MemesLunaEmoji",component:s,authority:3,order:500})};export{c as default};
1
+ import{send as x,icons as _t}from"@koishijs/client";import{defineComponent as $t,ref as d,reactive as ve,computed as $,onMounted as It,onUnmounted as Et,watch as Ee,openBlock as n,createElementBlock as a,createCommentVNode as c,createElementVNode as t,Fragment as w,toDisplayString as u,normalizeClass as g,createVNode as Mt,Transition as Lt,withCtx as Ut,withDirectives as h,vModelText as z,vModelSelect as pe,createTextVNode as U,renderList as V,withModifiers as I,createStaticVNode as fe,withKeys as Bt,vShow as me,h as Qe}from"vue";const St={class:"memesluna-app-layout"},Rt={class:"notion-content"},Tt={class:"content-breadcrumb-header"},Pt={class:"breadcrumbs"},At={key:0,class:"crumb-parent"},Dt={key:1,class:"crumb-parent"},Vt={key:2,class:"crumb-parent"},Nt={class:"crumb-child active"},Ft={key:0,class:"header-quick-stats"},Ot={class:"stat-bubble"},zt={class:"stat-bubble"},Ht={key:0,class:"notion-view-switcher"},jt={key:0,class:"toast-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},Wt={key:1,class:"toast-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},Gt={key:2,class:"toast-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},Qt={key:1,class:"loading-container"},Zt={class:"content-body-wrapper"},qt={key:0,class:"resources-router-view"},Kt={key:0,class:"collections-folder-view"},Yt={class:"notion-db-header page-section-header collection-list-header"},Jt={class:"notion-db-actions collection-toolbar"},Xt={class:"collection-search-shell"},el={class:"collection-filter-shell"},tl={key:0,class:"empty-placeholder-card"},ll={key:1,class:"empty-placeholder-card"},sl={key:2,class:"folders-grid"},nl=["onClick"],al=["src","alt"],ol={key:1,class:"folder-cover-empty"},il={key:2,class:"folder-cover-badge"},rl={class:"folder-body"},ul={class:"folder-title-row"},cl=["title"],dl=["onClick"],vl=["onClick"],pl=["onClick"],fl={class:"folder-count"},ml={class:"folder-meta-row"},gl={class:"folder-meta-item"},yl={class:"asset-detail-shell"},hl={class:"detail-topbar"},bl={class:"detail-breadcrumbs"},wl={class:"detail-crumb-current"},kl={class:"detail-top-actions"},Cl={class:"asset-hero-panel"},xl={class:"asset-identity-card"},_l={class:"asset-avatar-frame"},$l=["src","alt"],Il={key:1,class:"asset-avatar-empty"},El={class:"asset-title-stack"},Ml={class:"asset-title-row"},Ll={class:"asset-meta-line"},Ul={class:"asset-api-card"},Bl={class:"asset-api-row"},Sl=["disabled"],Rl={key:0,class:"api-preview-strip"},Tl=["src"],Pl={class:"asset-import-panel"},Al={class:"asset-import-header"},Dl={class:"asset-import-actions"},Vl={class:"asset-gallery-section"},Nl={class:"asset-gallery-toolbar"},Fl={class:"asset-tabs"},Ol={class:"asset-filter-bar"},zl={class:"asset-search-box"},Hl={class:"asset-view-toggle"},jl={class:"gallery-tab-content"},Wl={key:0,class:"empty-gallery"},Gl={key:1,class:"empty-gallery"},Ql={key:2},Zl={key:0,class:"gallery-bulk-toolbar floating"},ql={class:"bulk-status"},Kl={class:"bulk-meta"},Yl={class:"bulk-actions"},Jl={key:1,class:"bulk-move-group"},Xl=["value","disabled"],es=["disabled"],ts=["onClick","title"],ls={key:0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2.5"},ss=["onClick","title"],ns=["src"],as={class:"gallery-list-meta"},os={class:"gallery-card-overlay"},is={key:0,class:"overlay-actions"},rs=["onClick"],us={class:"move-dropdown-menu"},cs=["onClick"],ds=["onClick"],vs={key:1,class:"overlay-actions"},ps=["onClick"],fs=["onClick"],ms={key:1,class:"pagination-container"},gs=["disabled"],ys={class:"page-indicator"},hs=["disabled"],bs={class:"distribution-router-view"},ws={class:"endpoint-layout"},ks={class:"notion-form-panel endpoint-editor-panel"},Cs={class:"panel-title-row"},xs={class:"notion-panel-title"},_s={class:"form-fields endpoint-form-grid"},$s={class:"form-group"},Is=["disabled"],Es={class:"form-group"},Ms={class:"form-group span-2"},Ls={class:"endpoint-preview span-2"},Us={class:"form-actions span-2"},Bs={class:"notion-table-panel"},Ss={class:"table-title-row"},Rs={class:"table-count"},Ts={class:"table-container"},Ps={class:"flat-table"},As={key:0},Ds={class:"endpoint-name"},Vs=["title"],Ns={class:"font-mono"},Fs={class:"url-line"},Os=["onClick"],zs=["onClick"],Hs=["title"],js={style:{"text-align":"right"}},Ws={class:"action-buttons"},Gs=["href"],Qs=["onClick"],Zs=["onClick"],qs={class:"settings-router-view"},Ks={class:"settings-preview-panel"},Ys={class:"preview-dashboard-grid"},Js={class:"preview-card route-table-card"},Xs={class:"preview-card-header"},en=["disabled"],tn={key:0,class:"preview-table-wrap"},ln={class:"preview-route-table"},sn=["src","alt","onError"],nn={class:"preview-route-name"},an=["title"],on=["title","onClick"],rn={class:"preview-row-actions"},un=["href"],cn={key:1,class:"preview-empty-state"},dn={class:"preview-card prompt-card"},vn={class:"preview-card-header"},pn=["disabled"],fn={class:"preview-code-block final-prompt polished"},mn={key:0},gn={key:1,class:"text-gray-muted"},yn=$t({__name:"Dashboard",setup(Y){const k=d("resources"),v=d(true),A=d("/memesluna"),H=d("http://localhost:5140"),j=d([]),E=d([]),J=d(false),S=d(null),f=ve({name:"",group:"",description:"",url:""}),ge=d(new Set),Me=d(""),i=d(null),re=d(""),W=d("all"),N=d(null),ue=d(""),X=d(""),b=ve({images:[],links:[]}),R=ve({}),D=d("all"),ee=d(false),B=d(new Set),G=d(""),te=d(""),le=d("name"),se=d("all"),Q=d("grid"),M=d(""),ce=d(false),Z=d(null);function Ze(s){Z.value===s?Z.value=null:Z.value=s}function ye(s){return B.value.has(s)}function Le(s){const e=new Set(B.value);e.has(s)?e.delete(s):e.add(s),B.value=e}function ne(){B.value=new Set,G.value=""}function qe(){const s=new Set(B.value),e=we.value.filter(l=>l.type==="local");Ue.value?e.forEach(l=>s.delete(l.value)):e.forEach(l=>s.add(l.value)),B.value=s}function Ke(s){if(s.type==="local"&&_.value.length){Le(s.value);return}kt(s.src)}const C=d(1),he=d(24),Ye=$(()=>{if(!i.value)return[];const s=b.images.map(l=>({id:`local:${l}`,type:"local",label:l,src:$e(i.value.name,l),value:l})),e=b.links.map(l=>({id:`external:${l}`,type:"external",label:Xe(l),src:l,value:l}));return D.value==="local"?s:D.value==="external"?e:[...s,...e]}),be=$(()=>{const s=te.value.trim().toLowerCase();let e=Ye.value.filter(l=>s?l.label.toLowerCase().includes(s)||l.value.toLowerCase().includes(s):true);return se.value==="selected"&&(e=e.filter(l=>l.type==="local"&&B.value.has(l.value))),[...e].sort((l,o)=>le.value==="nameDesc"?o.label.localeCompare(l.label):l.label.localeCompare(o.label))}),q=$(()=>Math.max(1,Math.ceil(be.value.length/he.value))),we=$(()=>{const s=(C.value-1)*he.value;return be.value.slice(s,s+he.value)}),_=$(()=>Array.from(B.value)),Ue=$(()=>{const s=we.value.filter(e=>e.type==="local");return s.length>0&&s.every(e=>B.value.has(e.value))}),Be=$(()=>{if(!i.value)return"";const s=b.images[0];return s?$e(i.value.name,s):b.links[0]||""}),Se=$(()=>i.value?F(i.value.name):""),Re=$(()=>{var s;return((s=i.value)==null?void 0:s.totalCount)||b.images.length+b.links.length}),Te=$(()=>{const s=f.name.trim();return s?F(s):""}),Pe=$(()=>{const s=E.value.filter(l=>l.hasContent).map(l=>({id:`collection:${l.name}`,type:"collection",typeLabel:"表情包",name:l.name,description:l.description||`${l.name} 表情包`,path:`${A.value}/${l.name}`,fullUrl:F(l.name),previewImages:Ne(l.name).slice(0,3)})),e=j.value.map(l=>{const o=F(l.name),p=ge.value.has(`endpoint:${l.name}`)?[]:[o];return{id:`endpoint:${l.name}`,type:"endpoint",typeLabel:"重定向",name:l.name,description:l.description||"302 重定向",path:`${A.value}/${l.name}`,fullUrl:o,previewImages:p}});return[...s,...e]}),Ae=$(()=>{const s=re.value.trim().toLowerCase();return E.value.filter(e=>{const l=!s||e.name.toLowerCase().includes(s)||(e.description||"").toLowerCase().includes(s),o=W.value==="all"||W.value==="local"&&e.localCount>0&&e.linkCount===0||W.value==="external"&&e.linkCount>0;return l&&o})}),ke=d(""),ae=d(""),oe=d(false),Ce=d(null),T=ve({show:false,message:"",type:"info"});let xe=null;function r(s,e="info"){xe&&clearTimeout(xe),T.message=s,T.type=e,T.show=true,xe=setTimeout(()=>{T.show=false},2500)}function _e(s){k.value=s,s==="settings"&&Fe()}function K(){const s=H.value.endsWith("/")?H.value.slice(0,-1):H.value,e=A.value.startsWith("/")?A.value:`/${A.value}`,l=e.endsWith("/")?e.slice(0,-1):e;return`${s}${l}`}function F(s){return`${K()}/${s}`}function $e(s,e){return`${K()}/api/admin/collections/${encodeURIComponent(s)}/images/${encodeURIComponent(e)}`}function Je(s){if(s.type!=="endpoint")return;const e=new Set(ge.value);e.add(s.id),ge.value=e}function De(s){if(!s)return"-";const e=new Date(s);return Number.isNaN(e.getTime())?"-":e.toLocaleDateString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit"})}function Ve(s){const e=s.split(".").pop();return e?e.toUpperCase():"IMG"}function Xe(s){try{const e=new URL(s);return decodeURIComponent(e.pathname.split("/").filter(Boolean).pop()||e.hostname)||e.hostname}catch{return s}}function et(s){return R[s]}function Ne(s){var e;return((e=R[s])==null?void 0:e.images)||[]}function Ie(s){return Ne(s).slice(0,6)}async function tt(s){var e;if(!(!s.hasContent||(e=R[s.name])!=null&&e.images.length)){R[s.name]=R[s.name]||{loading:true,images:[]},R[s.name].loading=true;try{const l=await fetch(`${K()}/api/collections/${encodeURIComponent(s.name)}/resources`);if(!l.ok)return;const o=await l.json(),p=9,m=Array.isArray(o.images)?o.images.slice(0,p).map(L=>$e(s.name,L)):[],ie=Array.isArray(o.links)?o.links.slice(0,p-m.length):[];R[s.name].images=[...m,...ie]}catch{R[s.name].images=[]}finally{R[s.name].loading=false}}}function lt(){E.value.filter(s=>s.hasContent).slice(0,24).forEach(s=>{tt(s)})}async function y(){try{H.value=window.location.origin;const s=await x("memesluna/getState");s&&(s.backendPath&&(A.value=s.backendPath),j.value=Array.isArray(s.endpoints)?s.endpoints:[],E.value=Array.isArray(s.collections)?s.collections:[],lt())}catch(s){r(s instanceof Error?s.message:"获取插件状态同步失败","error")}}async function Fe(){try{const s=await fetch(`${K()}/api/homepage-data`);if(s.ok){const e=await s.json();ke.value=e.routeInventory||"",ae.value=e.llmPrompt||""}}catch(s){console.error("Failed to sync settings variables preview:",s)}}function st(){de(),J.value=true}function Oe(){de(),J.value=false}function de(){S.value=null,f.name="",f.group="",f.description="",f.url=""}function nt(s){S.value=s,J.value=true,f.name=s.name||"",f.group=s.group||"",f.description=s.description||"",f.url=s.url||""}async function at(){const s=f.name.trim(),e=f.url.trim();if(!s||!e){r("端点名称和目标直链 URL 均必填","error");return}const l={name:s,group:f.group.trim()||"默认分组",description:f.description.trim(),url:e,method:"redirect"};try{v.value=true,S.value?(await x("memesluna/updateEndpoint",S.value.name,l),r("端点路由参数已成功更新","success")):(await x("memesluna/createEndpoint",l),r("接口端点已成功创建","success")),await y(),de(),J.value=false}catch(o){r(o instanceof Error?o.message:"保存端点失败","error")}finally{v.value=false}}async function ot(s){if(confirm(`确认删除端点路由 "${s}" 吗?`))try{v.value=true,await x("memesluna/deleteEndpoint",s),r("该分发端点已彻底删除","success"),await y(),S.value&&S.value.name===s&&de()}catch(e){r(e instanceof Error?e.message:"删除端点路由失败","error")}finally{v.value=false}}async function O(s){try{await navigator.clipboard.writeText(s),r("成功复制链接到剪贴板","success")}catch{r("复制失败","error")}}async function it(){var e;let s=Me.value.trim();if(s||(s=((e=window.prompt("请输入表情包名称"))==null?void 0:e.trim())||""),!s){r("表情包名称不能为空","error");return}try{if(v.value=true,!await x("memesluna/createCollection",s)){r("该名称的表情包已存在,请更换其他名称","error");return}r("表情包已成功创建","success"),Me.value="",await y()}catch(l){r(l instanceof Error?l.message:"创建失败","error")}finally{v.value=false}}async function ze(s){if(N.value=null,!!confirm(`⚠️ 危险操作:确认永久且彻底删除表情包 "${s}",及其包含的所有本地图片文件吗?此项操作不可逆!`))try{v.value=true,await x("memesluna/deleteCollection",s),r("该表情包资源已彻底销毁删除","success"),i.value=null,await y()}catch(e){r(e instanceof Error?e.message:"删除失败","error")}finally{v.value=false}}async function He(s){N.value=null,i.value=s,ue.value=s.description||"",X.value="",te.value="",le.value="name",se.value="all",Q.value="grid",M.value="",C.value=1,ne(),await P(s.name)}function rt(){i.value=null,M.value&&URL.revokeObjectURL(M.value),M.value="",ne()}async function P(s){try{const e=await fetch(`${K()}/api/collections/${encodeURIComponent(s)}/resources`);if(e.ok){const l=await e.json();b.images=Array.isArray(l.images)?l.images:[],b.links=Array.isArray(l.links)?l.links:[];const o=new Set(b.images);B.value=new Set(_.value.filter(p=>o.has(p)))}}catch{r("加载该表情包下的图片缓存失败","error")}}async function ut(){if(!i.value)return;v.value=true,await P(i.value.name),await y();const s=E.value.find(e=>e.name===i.value.name);s&&(i.value=s),v.value=false,r("本地及缓存资源数据已刷新成功","success")}async function ct(){if(i.value){ce.value=true;try{const s=await fetch(Se.value,{redirect:"follow"});if(!s.ok){r("测试接口未返回可用图片","error");return}const e=await s.blob();if(!e.type.startsWith("image/")){r("测试接口返回的不是图片资源","error");return}M.value&&URL.revokeObjectURL(M.value),M.value=URL.createObjectURL(e),r("已获取随机图片预览","success"),await y();const l=E.value.find(o=>{var p;return o.name===((p=i.value)==null?void 0:p.name)});l&&(i.value=l)}catch(s){r(s instanceof Error?s.message:"测试接口失败","error")}finally{ce.value=false}}}async function je(){if(i.value)try{v.value=true,await x("memesluna/setCollectionDescription",i.value.name,ue.value.trim()),r("表情包描述已成功保存","success"),await y();const s=E.value.find(e=>e.name===i.value.name);s&&(i.value=s)}catch(s){r(s instanceof Error?s.message:"保存表情包描述失败","error")}finally{v.value=false}}function dt(){Ce.value&&Ce.value.click()}function vt(s){const e=s.target;e.files&&We(e.files)}function pt(s){oe.value=false,s.dataTransfer&&s.dataTransfer.files&&We(s.dataTransfer.files)}async function We(s){if(!i.value)return;const e=Array.from(s);if(e.filter(m=>m.name.toLowerCase().endsWith(".avif")).length>0){r("已自动拦截 avif 图片。QQ 机器人框架无法渲染及读取此格式。","error");return}const o=e.filter(m=>m.type.startsWith("image/"));if(!o.length){r("请拖入或选择有效的图片格式文件","error");return}if(o.length>50){r("单次上传表情上限为 50 张,请分批次导入","error");return}if(o.filter(m=>m.size>10*1024*1024).length>0){r("已拦截大小超出 10MB 的单个图片素材","error");return}r(`正在转码并上传 ${o.length} 张表情图片...`,"info");try{const m=[];for(const L of o){const xt=await ft(L);m.push({base64:xt,originalName:L.name})}const ie=await fetch(`${K()}/api/admin/collections/${encodeURIComponent(i.value.name)}/images`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({images:m})});if(ie.ok){const L=await ie.json();L.ok&&L.uploaded&&L.uploaded.length>0?r(`成功将 ${L.uploaded.length} 张表情入库并完成数字重命名`,"success"):r("上传图片写入失败","error")}else{const L=await ie.json().catch(()=>({}));r(L.error||"上传中继失败","error")}}catch(m){r(`上传网络错误: ${m instanceof Error?m.message:"错误"}`,"error")}finally{await P(i.value.name),await y()}}function ft(s){return new Promise((e,l)=>{const o=new FileReader;o.readAsDataURL(s),o.onload=()=>{const m=o.result.split(",")[1];e(m)},o.onerror=p=>l(p)})}async function mt(){if(!i.value)return;const s=X.value.trim();if(!s){r("链接文本不能为空","error");return}try{v.value=true;const e=await x("memesluna/addLinks",i.value.name,s);r(`已成功录入 ${e} 条网络图片外链`,"success"),X.value="",await P(i.value.name),await y()}catch(e){r(e instanceof Error?e.message:"添加失败","error")}finally{v.value=false}}async function gt(s,e){if(confirm("确认删除该图片网络外链直链吗?"))try{v.value=true,await x("memesluna/deleteLink",s,e),r("外链直链已彻底删除","success"),await P(s),await y()}catch(l){r(l instanceof Error?l.message:"删除链接失败","error")}finally{v.value=false}}async function yt(s,e){if(confirm(`确认永久删除该本地图片素材 "${e}" 吗?此操作无法恢复!`))try{v.value=true,await x("memesluna/deleteLocalImage",s,e),r("该本地图片已永久删除","success"),await P(s),await y()}catch(l){r(l instanceof Error?l.message:"删除失败","error")}finally{v.value=false}}async function ht(){if(!i.value||!_.value.length)return;const s=_.value;if(confirm(`确认永久删除已选择的 ${s.length} 张本地图片素材吗?此操作无法恢复!`))try{v.value=true;for(const e of s)await x("memesluna/deleteLocalImage",i.value.name,e);r(`已删除 ${s.length} 张本地图片`,"success"),ne(),await P(i.value.name),await y()}catch(e){r(e instanceof Error?e.message:"批量删除失败","error")}finally{v.value=false}}async function bt(s,e,l){try{v.value=true,await x("memesluna/moveLocalImage",s,e,l)?(r(`已将素材移动至表情包 "${e}" 并重命名`,"success"),await P(s),await y()):r("移动失败","error")}catch(o){r(o instanceof Error?o.message:"移库失败","error")}finally{v.value=false}}async function wt(){if(!i.value||!_.value.length||!G.value)return;const s=i.value.name,e=G.value;if(e===s){r("不能移动到当前表情包","error");return}const l=_.value;try{v.value=true;for(const o of l)await x("memesluna/moveLocalImage",s,e,o);r(`已将 ${l.length} 张素材移动至表情包 "${e}"`,"success"),ne(),await P(s),await y()}catch(o){r(o instanceof Error?o.message:"批量移动失败","error")}finally{v.value=false}}function kt(s){window.open(s,"_blank")}function Ct(s){N.value=N.value===s?null:s}const Ge=()=>{Z.value=null,N.value=null};return It(async()=>{window.addEventListener("click",Ge),v.value=true,await y(),v.value=false}),Et(()=>{window.removeEventListener("click",Ge),M.value&&URL.revokeObjectURL(M.value)}),Ee(b,()=>{C.value>q.value&&q.value>0&&(C.value=q.value)}),Ee([te,le,se],()=>{C.value=1}),Ee([re,W],()=>{N.value=null}),(s,e)=>(n(),a("div",St,[c(" MAIN CONTENT AREA "),t("main",Rt,[c(" Top Notion Breadcrumbs "),t("header",Tt,[t("div",Pt,[e[33]||(e[33]=t("span",{class:"crumb-root"},"MemesLuna 控制台",-1)),e[34]||(e[34]=t("span",{class:"crumb-separator"},"/",-1)),k.value==="resources"?(n(),a("span",At,"表情包管理")):k.value==="distribution"?(n(),a("span",Dt,"分发管理")):k.value==="settings"?(n(),a("span",Vt,"预览")):c("v-if",true),k.value==="resources"&&i.value?(n(),a(w,{key:3},[e[32]||(e[32]=t("span",{class:"crumb-separator"},"/",-1)),t("span",Nt,"表情包: "+u(i.value.name),1)],64)):c("v-if",true)]),c(" Quick Stats Banner "),v.value?c("v-if",true):(n(),a("div",Ft,[t("span",Ot,"📂 表情包总数: "+u(E.value.length),1),t("span",zt,"🌐 分发接口: "+u(j.value.length),1)]))]),c(" NOTION-STYLE HORIZONTAL VIEW SWITCHER "),i.value?c("v-if",true):(n(),a("div",Ht,[t("button",{onClick:e[0]||(e[0]=l=>_e("resources")),class:g(["switcher-btn",k.value==="resources"?"active":""])},[...e[35]||(e[35]=[t("span",{class:"switcher-icon"},"📦",-1),t("span",{class:"switcher-label"},"表情包管理",-1)])],2),t("button",{onClick:e[1]||(e[1]=l=>_e("distribution")),class:g(["switcher-btn",k.value==="distribution"?"active":""])},[...e[36]||(e[36]=[t("span",{class:"switcher-icon"},"🌐",-1),t("span",{class:"switcher-label"},"分发管理",-1)])],2),t("button",{onClick:e[2]||(e[2]=l=>_e("settings")),class:g(["switcher-btn",k.value==="settings"?"active":""])},[...e[37]||(e[37]=[t("span",{class:"switcher-icon"},"👁️",-1),t("span",{class:"switcher-label"},"预览",-1)])],2)])),c(" Global Toast Alert Banner "),Mt(Lt,{name:"fade"},{default:Ut(()=>[T.show?(n(),a("div",{key:0,class:g(["toast-banner",T.type])},[T.type==="success"?(n(),a("svg",jt,[...e[38]||(e[38]=[t("polyline",{points:"20 6 9 17 4 12"},null,-1)])])):T.type==="error"?(n(),a("svg",Wt,[...e[39]||(e[39]=[t("circle",{cx:"12",cy:"12",r:"10"},null,-1),t("line",{x1:"12",y1:"8",x2:"12",y2:"12"},null,-1),t("line",{x1:"12",y1:"16",x2:"12.01",y2:"16"},null,-1)])])):(n(),a("svg",Gt,[...e[40]||(e[40]=[t("circle",{cx:"12",cy:"12",r:"10"},null,-1),t("line",{x1:"12",y1:"16",x2:"12",y2:"12"},null,-1),t("line",{x1:"12",y1:"8",x2:"12.01",y2:"8"},null,-1)])])),t("span",null,u(T.message),1)],2)):c("v-if",true)]),_:1}),c(" Loading Cover "),v.value?(n(),a("div",Qt,[...e[41]||(e[41]=[t("div",{class:"spinner"},null,-1),t("p",null,"正在同步数据...",-1)])])):(n(),a(w,{key:2},[c(" MAIN ROUTER BODY "),t("div",Zt,[c(" MENU VIEW 1: RESOURCES (📦) "),k.value==="resources"?(n(),a("div",qt,[c(" Collection Lists (Folder view) "),i.value?(n(),a(w,{key:1},[c(" Collection Details (Inside details view) "),t("div",{class:"collection-detail-layout",onDragover:e[25]||(e[25]=I(l=>oe.value=true,["prevent"]))},[t("div",yl,[t("div",hl,[t("div",bl,[t("button",{onClick:rt,class:"detail-back-btn",title:"返回列表"},[...e[53]||(e[53]=[t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("path",{d:"m15 18-6-6 6-6"})],-1),U(" 返回列表 ",-1)])]),e[54]||(e[54]=t("span",{class:"detail-separator"},"/",-1)),t("span",wl,u(i.value.name),1),e[55]||(e[55]=t("span",{class:"detail-separator"},"/",-1)),e[56]||(e[56]=t("span",{class:"detail-crumb-strong"},"图片素材",-1))]),t("div",kl,[t("button",{onClick:ut,class:"asset-btn secondary",title:"刷新缓存"},[...e[57]||(e[57]=[fe('<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" data-v-e3a296f0><path d="M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16" data-v-e3a296f0></path><path d="M3 21v-5h5" data-v-e3a296f0></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-e3a296f0></path><path d="M16 8h5V3" data-v-e3a296f0></path></svg> 刷新缓存 ',2)])]),t("button",{onClick:dt,class:"asset-btn primary"},[...e[58]||(e[58]=[t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}),t("path",{d:"m17 8-5-5-5 5"}),t("path",{d:"M12 3v12"})],-1),U(" 上传图片 ",-1)])]),t("button",{onClick:e[6]||(e[6]=l=>ee.value=!ee.value),class:"asset-btn secondary"},[...e[59]||(e[59]=[t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("path",{d:"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"}),t("path",{d:"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"})],-1),U(" 导入外链 ",-1)])]),t("button",{onClick:e[7]||(e[7]=l=>ze(i.value.name)),class:"asset-btn danger ghost",title:"删除表情包"},[...e[60]||(e[60]=[t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("path",{d:"M3 6h18"}),t("path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6"}),t("path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"})],-1)])]),t("input",{ref_key:"fileInput",ref:Ce,type:"file",multiple:"",accept:"image/*",class:"hidden-file-input",onChange:vt},null,544)])]),t("section",Cl,[t("div",xl,[t("div",_l,[Be.value?(n(),a("img",{key:0,src:Be.value,class:"asset-avatar-img",alt:`${i.value.name} 封面`},null,8,$l)):(n(),a("div",Il,[...e[61]||(e[61]=[t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("path",{d:"M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"})],-1)])]))]),t("div",El,[t("div",Ml,[t("h1",null,u(i.value.name),1),e[62]||(e[62]=t("span",{class:"asset-pill"},"本地",-1))]),h(t("input",{"onUpdate:modelValue":e[8]||(e[8]=l=>ue.value=l),class:"asset-description-input",placeholder:"添加表情包描述",onBlur:je,onKeyup:Bt(je,["enter"])},null,544),[[z,ue.value]]),t("div",Ll,[t("span",null,"创建于 "+u(De(i.value.createdAt)),1),t("span",null,"最后更新 "+u(De(i.value.updatedAt)),1),t("span",null,"共 "+u(Re.value)+" 张图片",1)])])]),t("div",Ul,[e[65]||(e[65]=t("div",{class:"asset-card-label"},"API 调用地址",-1)),t("div",Bl,[t("code",null,u(Se.value),1),t("button",{onClick:ct,class:"asset-test-btn",disabled:ce.value},[e[63]||(e[63]=t("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[t("path",{d:"M8 5v14l11-7z"})],-1)),U(" "+u(ce.value?"测试中":"测试接口"),1)],8,Sl)]),e[66]||(e[66]=t("div",{class:"asset-api-hint"},"直接访问该链接将随机返回一张表情图片",-1)),M.value?(n(),a("div",Rl,[t("img",{src:M.value,alt:"API 返回图片预览"},null,8,Tl),e[64]||(e[64]=t("span",null,"随机预览",-1))])):c("v-if",true)])]),c(" Drag over drop zone area "),h(t("div",{class:"sidebar-drop-zone-overlay",onDragover:e[9]||(e[9]=I(l=>oe.value=true,["prevent"])),onDragleave:e[10]||(e[10]=I(l=>oe.value=false,["prevent"])),onDrop:I(pt,["prevent"])},[...e[67]||(e[67]=[fe('<div class="drop-overlay-box" data-v-e3a296f0><svg class="drop-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" data-v-e3a296f0><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" data-v-e3a296f0></path><polyline points="17 8 12 3 7 8" data-v-e3a296f0></polyline><line x1="12" y1="3" x2="12" y2="15" data-v-e3a296f0></line></svg><p data-v-e3a296f0>释放图片文件以导入此表情包</p></div>',1)])],544),[[me,oe.value]]),h(t("div",Pl,[t("div",Al,[e[69]||(e[69]=t("div",null,[t("div",{class:"asset-import-title"},"导入外链图片"),t("div",{class:"asset-import-desc"},"每行一个以 http:// 或 https:// 开头的图片链接")],-1)),t("button",{onClick:e[11]||(e[11]=l=>ee.value=false),class:"asset-icon-btn compact",title:"关闭导入面板"},[...e[68]||(e[68]=[t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("path",{d:"M18 6 6 18"}),t("path",{d:"m6 6 12 12"})],-1)])])]),h(t("textarea",{"onUpdate:modelValue":e[12]||(e[12]=l=>X.value=l),rows:"4",class:"asset-link-textarea",placeholder:"每行一个以 http:// 或 https:// 开头的链接"},null,512),[[z,X.value]]),t("div",Dl,[t("button",{onClick:mt,class:"asset-btn primary"},"确认导入"),t("button",{onClick:e[13]||(e[13]=l=>ee.value=false),class:"asset-btn secondary"},"取消")])],512),[[me,ee.value]]),t("section",Vl,[t("div",Nl,[t("div",Fl,[t("button",{onClick:e[14]||(e[14]=l=>{D.value="all",C.value=1}),class:g(["asset-tab",D.value==="all"?"active":""])},[e[70]||(e[70]=U(" 全部 ",-1)),t("span",null,u(Re.value),1)],2),t("button",{onClick:e[15]||(e[15]=l=>{D.value="local",C.value=1}),class:g(["asset-tab",D.value==="local"?"active":""])},[e[71]||(e[71]=U(" 本地图片 ",-1)),t("span",null,u(b.images.length),1)],2),t("button",{onClick:e[16]||(e[16]=l=>{D.value="external",C.value=1}),class:g(["asset-tab",D.value==="external"?"active":""])},[e[72]||(e[72]=U(" 外链图片 ",-1)),t("span",null,u(b.links.length),1)],2)]),t("div",Ol,[t("div",zl,[e[73]||(e[73]=t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("circle",{cx:"11",cy:"11",r:"8"}),t("path",{d:"m21 21-4.3-4.3"})],-1)),h(t("input",{"onUpdate:modelValue":e[17]||(e[17]=l=>te.value=l),placeholder:"搜索图片或外链"},null,512),[[z,te.value]])]),h(t("select",{"onUpdate:modelValue":e[18]||(e[18]=l=>se.value=l),class:"asset-select"},[...e[74]||(e[74]=[t("option",{value:"all"},"筛选: 全部",-1),t("option",{value:"selected"},"筛选: 已选",-1)])],512),[[pe,se.value]]),h(t("select",{"onUpdate:modelValue":e[19]||(e[19]=l=>le.value=l),class:"asset-select"},[...e[75]||(e[75]=[t("option",{value:"name"},"排序: 文件名",-1),t("option",{value:"nameDesc"},"排序: 文件名倒序",-1)])],512),[[pe,le.value]]),t("div",Hl,[t("button",{onClick:e[20]||(e[20]=l=>Q.value="grid"),class:g(Q.value==="grid"?"active":""),title:"网格视图"},[...e[76]||(e[76]=[fe('<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" data-v-e3a296f0><rect x="3" y="3" width="7" height="7" rx="1" data-v-e3a296f0></rect><rect x="14" y="3" width="7" height="7" rx="1" data-v-e3a296f0></rect><rect x="3" y="14" width="7" height="7" rx="1" data-v-e3a296f0></rect><rect x="14" y="14" width="7" height="7" rx="1" data-v-e3a296f0></rect></svg>',1)])],2),t("button",{onClick:e[21]||(e[21]=l=>Q.value="list"),class:g(Q.value==="list"?"active":""),title:"列表视图"},[...e[77]||(e[77]=[fe('<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" data-v-e3a296f0><path d="M8 6h13" data-v-e3a296f0></path><path d="M8 12h13" data-v-e3a296f0></path><path d="M8 18h13" data-v-e3a296f0></path><path d="M3 6h.01" data-v-e3a296f0></path><path d="M3 12h.01" data-v-e3a296f0></path><path d="M3 18h.01" data-v-e3a296f0></path></svg>',1)])],2)])])]),t("div",jl,[!b.images.length&&!b.links.length?(n(),a("div",Wl," 表情包内尚无任何图片资源 ")):be.value.length?(n(),a("div",Ql,[_.value.length?(n(),a("div",Zl,[t("div",ql,[e[78]||(e[78]=t("span",{class:"bulk-title"},"本地素材",-1)),t("span",Kl,"已选择 "+u(_.value.length)+" 张",1)]),t("div",Yl,[t("button",{onClick:qe,class:"toolbar-btn compact"},u(Ue.value?"取消本页":"选择本页"),1),_.value.length?(n(),a("button",{key:0,onClick:ne,class:"toolbar-btn compact"}," 清空选择 ")):c("v-if",true),_.value.length?(n(),a("div",Jl,[h(t("select",{"onUpdate:modelValue":e[22]||(e[22]=l=>G.value=l),class:"flat-select compact-select"},[e[79]||(e[79]=t("option",{value:""},"移动到...",-1)),(n(true),a(w,null,V(E.value,l=>(n(),a("option",{key:l.name,value:l.name,disabled:l.name===i.value.name},u(l.name),9,Xl))),128))],512),[[pe,G.value]]),t("button",{onClick:wt,class:"toolbar-btn compact",disabled:!G.value}," 移动 ",8,es)])):c("v-if",true),e[80]||(e[80]=t("button",{class:"toolbar-btn compact",disabled:""},"设置标签",-1)),_.value.length?(n(),a("button",{key:2,onClick:ht,class:"toolbar-btn compact danger"}," 批量删除 ")):c("v-if",true)])])):c("v-if",true),t("div",{class:g(["notion-gallery-grid",Q.value==="list"?"list-mode":""])},[(n(true),a(w,null,V(we.value,l=>(n(),a("div",{key:l.id,class:g(["notion-gallery-card",{"notion-gallery-card-active-dropdown":l.type==="local"&&Z.value===l.value,selected:l.type==="local"&&ye(l.value),external:l.type==="external"}])},[l.type==="local"?(n(),a("button",{key:0,class:"gallery-select-toggle",onClick:I(o=>Le(l.value),["stop"]),title:ye(l.value)?"取消选择":"选择图片"},[ye(l.value)?(n(),a("svg",ls,[...e[81]||(e[81]=[t("polyline",{points:"20 6 9 17 4 12"},null,-1)])])):c("v-if",true)],8,ts)):c("v-if",true),t("div",{class:"gallery-img-container",onClick:o=>Ke(l),style:{cursor:"pointer"},title:l.type==="local"&&_.value.length?"切换选择状态":"在新标签页中打开原图"},[t("img",{src:l.src,class:"gallery-img",loading:"lazy"},null,8,ns),t("span",{class:g(["image-format-badge",l.type])},u(l.type==="external"?"LINK":Ve(l.value)),3)],8,ss),t("div",as,[t("div",null,u(l.label),1),t("span",null,u(l.type==="external"?"外链图片":Ve(l.value)),1)]),t("div",os,[l.type==="local"?(n(),a("div",is,[t("div",{class:"card-action-btn move move-dropdown-container",onClick:I(o=>Ze(l.value),["stop"])},[e[82]||(e[82]=t("span",null,"修改",-1)),h(t("div",us,[(n(true),a(w,null,V(E.value,o=>(n(),a(w,null,[o.name!==i.value.name?(n(),a("button",{key:o.name,onClick:I(p=>bt(i.value.name,o.name,l.value),["stop"]),class:"dropdown-item"},u(o.name),9,cs)):c("v-if",true)],64))),256))],512),[[me,Z.value===l.value]])],8,rs),t("button",{onClick:I(o=>yt(i.value.name,l.value),["stop"]),class:"card-action-btn danger"}," 删除 ",8,ds)])):(n(),a("div",vs,[t("button",{onClick:I(o=>O(l.value),["stop"]),class:"card-action-btn"}," 复制 ",8,ps),t("button",{onClick:I(o=>gt(i.value.name,l.value),["stop"]),class:"card-action-btn danger"}," 删除 ",8,fs)]))])],2))),128))],2),q.value>1?(n(),a("div",ms,[t("button",{disabled:C.value===1,onClick:e[23]||(e[23]=l=>C.value--),class:"btn btn-secondary page-btn"}," 上一页 ",8,gs),t("span",ys,[e[83]||(e[83]=U("第 ",-1)),t("b",null,u(C.value),1),U(" / "+u(q.value)+" 页",1)]),t("button",{disabled:C.value===q.value,onClick:e[24]||(e[24]=l=>C.value++),class:"btn btn-secondary page-btn"}," 下一页 ",8,hs)])):c("v-if",true)])):(n(),a("div",Gl," 没有匹配当前搜索或筛选条件的图片 "))])])])],32)],2112)):(n(),a("div",Kt,[c(" Creator bar in Notion Style "),t("div",Yt,[e[46]||(e[46]=t("div",null,[t("h1",{class:"notion-main-title"},"表情包管理"),t("p",{class:"section-desc compact"},"管理表情包合集与图片素材")],-1)),t("div",Jt,[t("div",Xt,[e[42]||(e[42]=t("svg",{class:"collection-toolbar-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("circle",{cx:"11",cy:"11",r:"8"}),t("path",{d:"m21 21-4.3-4.3"})],-1)),h(t("input",{"onUpdate:modelValue":e[3]||(e[3]=l=>re.value=l),class:"flat-input collection-search-input",placeholder:"搜索表情包合集..."},null,512),[[z,re.value]])]),t("label",el,[e[44]||(e[44]=t("svg",{class:"collection-toolbar-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("path",{d:"M3 4h18l-7 8v6l-4 2v-8z"})],-1)),h(t("select",{"onUpdate:modelValue":e[4]||(e[4]=l=>W.value=l),class:"flat-select collection-filter-select","aria-label":"筛选表情包合集"},[...e[43]||(e[43]=[t("option",{value:"all"},"全部",-1),t("option",{value:"local"},"仅本地",-1),t("option",{value:"external"},"含外链",-1)])],512),[[pe,W.value]])]),t("button",{onClick:it,class:"btn btn-primary btn-notion"},[...e[45]||(e[45]=[t("span",{class:"btn-plus"},"+",-1),U(" 新建表情包 ",-1)])])])]),e[52]||(e[52]=t("hr",{class:"notion-hr"},null,-1)),c(" Folders grid layout "),E.value.length?Ae.value.length?(n(),a("div",sl,[(n(true),a(w,null,V(Ae.value,l=>{var o;return n(),a("div",{key:l.name,class:"folder-card",onClick:p=>He(l)},[t("div",{class:g(["folder-cover",Ie(l.name).length?"has-preview":"empty"])},[Ie(l.name).length?(n(true),a(w,{key:0},V(Ie(l.name),p=>(n(),a("img",{key:p,src:p,class:"folder-cover-img",loading:"lazy",alt:`${l.name} 预览图`},null,8,al))),128)):(n(),a("div",ol,[...e[49]||(e[49]=[t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("path",{d:"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"})],-1)])])),(o=et(l.name))!=null&&o.loading?(n(),a("span",il,"同步中")):c("v-if",true)],2),t("div",rl,[t("div",ul,[t("div",{class:"folder-name",title:l.description||l.name},u(l.name),9,cl),t("button",{class:"folder-more-btn",title:"更多操作",onClick:I(p=>Ct(l.name),["stop"])},[...e[50]||(e[50]=[t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("circle",{cx:"5",cy:"12",r:"1"}),t("circle",{cx:"12",cy:"12",r:"1"}),t("circle",{cx:"19",cy:"12",r:"1"})],-1)])],8,dl),N.value===l.name?(n(),a("div",{key:0,class:"folder-action-menu",onClick:e[5]||(e[5]=I(()=>{},["stop"]))},[t("button",{onClick:p=>He(l)},"打开详情",8,vl),t("button",{class:"danger",onClick:p=>ze(l.name)},"删除表情包",8,pl)])):c("v-if",true)]),t("div",fl,u(l.totalCount)+" 张图片",1),t("div",ml,[t("span",gl,[e[51]||(e[51]=t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("path",{d:"M3 7a2 2 0 0 1 2-2h5l2 3h7a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"})],-1)),U(" 本地 "+u(l.localCount)+" · 外链 "+u(l.linkCount),1)])])])],8,nl)}),128))])):(n(),a("div",ll,[...e[48]||(e[48]=[t("div",{class:"empty-icon"},"🔎",-1),t("h3",null,"没有匹配的表情包合集",-1),t("p",null,"换个关键词或筛选条件再试试。",-1)])])):(n(),a("div",tl,[...e[47]||(e[47]=[t("div",{class:"empty-icon"},"📁",-1),t("h3",null,"尚未创建任何表情包",-1),t("p",null,"点击右上角按钮即可快速创建一个新的表情包合集。",-1)])]))]))])):k.value==="distribution"?(n(),a(w,{key:1},[c(" MENU VIEW 2: DISTRIBUTION (🌐) "),t("div",bs,[t("div",{class:"notion-db-header page-section-header"},[e[84]||(e[84]=t("div",null,[t("h1",{class:"notion-main-title"},"分发管理"),t("p",{class:"section-desc compact"},"管理统一重定向端点与外部目标地址")],-1)),t("button",{onClick:st,class:"btn btn-primary btn-notion"}," + 新建端点 ")]),e[99]||(e[99]=t("hr",{class:"notion-hr"},null,-1)),t("div",ws,[c(" Endpoint Editor Form Panel "),h(t("div",ks,[t("div",Cs,[t("h2",xs,u(S.value?"编辑分发端点":"创建新分发端点"),1),t("button",{onClick:Oe,class:"icon-btn hover-bg",title:"收起编辑器"},[...e[85]||(e[85]=[t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),t("line",{x1:"6",y1:"6",x2:"18",y2:"18"})],-1)])])]),t("div",_s,[t("div",$s,[e[86]||(e[86]=t("label",null,"端点名称 *",-1)),h(t("input",{"onUpdate:modelValue":e[26]||(e[26]=l=>f.name=l),disabled:!!S.value,class:"flat-input",placeholder:"例如: moe"},null,8,Is),[[z,f.name]]),e[87]||(e[87]=t("span",{class:"field-hint"},"只能包含字母、数字、下划线和连字符",-1))]),t("div",Es,[e[88]||(e[88]=t("label",null,"描述",-1)),h(t("input",{"onUpdate:modelValue":e[27]||(e[27]=l=>f.description=l),class:"flat-input",placeholder:"例如: 萌版横图"},null,512),[[z,f.description]])]),t("div",Ms,[e[89]||(e[89]=t("label",null,"目标 URL *",-1)),h(t("input",{"onUpdate:modelValue":e[28]||(e[28]=l=>f.url=l),class:"flat-input",placeholder:"https://example.com/api"},null,512),[[z,f.url]])]),t("div",Ls,[e[90]||(e[90]=t("span",null,"访问预览",-1)),t("code",{onClick:e[29]||(e[29]=l=>O(Te.value))},u(Te.value||"填写端点名称后生成预览"),1)]),t("div",Us,[t("button",{onClick:at,class:"btn btn-primary flex-grow"},u(S.value?"保存修改":"立即创建"),1),t("button",{onClick:Oe,class:"btn btn-secondary"}," 取消 ")])])],512),[[me,J.value]]),c(" Endpoints Table List "),t("div",Bs,[t("div",Ss,[e[91]||(e[91]=t("h2",{class:"notion-panel-title"},"端点列表",-1)),t("span",Rs,u(j.value.length)+" 条路由",1)]),t("div",Ts,[t("table",Ps,[e[98]||(e[98]=t("thead",null,[t("tr",null,[t("th",{style:{width:"18%"}},"名称"),t("th",{style:{width:"20%"}},"描述"),t("th",{style:{width:"17%"}},"方式"),t("th",{style:{width:"35%"}},"访问路径 & 转发目标"),t("th",{style:{width:"10%","text-align":"right"}},"管理")])],-1)),t("tbody",null,[j.value.length?c("v-if",true):(n(),a("tr",As,[...e[92]||(e[92]=[t("td",{colspan:"5",class:"empty-cell"},"尚未配置任何转发 API 端点",-1)])])),(n(true),a(w,null,V(j.value,l=>(n(),a("tr",{key:l.name},[t("td",null,[t("div",Ds,u(l.name),1)]),t("td",{class:"cell-desc",title:l.description},u(l.description||"-"),9,Vs),e[97]||(e[97]=t("td",null,[t("span",{class:"method-tag redirect"},"重定向"),t("div",{class:"target-url"},"302 重定向")],-1)),t("td",Ns,[t("div",Fs,[t("span",{class:"link-text",onClick:o=>O(F(l.name))}," /"+u(l.name),9,Os),t("button",{onClick:o=>O(F(l.name)),class:"icon-btn-inline",title:"复制完整链接"},[...e[93]||(e[93]=[t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("rect",{x:"9",y:"9",width:"13",height:"13",rx:"2",ry:"2"}),t("path",{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"})],-1)])],8,zs)]),t("div",{class:"target-url truncate",title:l.url}," → "+u(l.url),9,Hs)]),t("td",js,[t("div",Ws,[t("a",{href:F(l.name),target:"_blank",class:"icon-btn hover-bg",title:"测试该端点访问"},[...e[94]||(e[94]=[t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"}),t("polyline",{points:"15 3 21 3 21 9"}),t("line",{x1:"10",y1:"14",x2:"21",y2:"3"})],-1)])],8,Gs),t("button",{onClick:o=>nt(l),class:"icon-btn hover-bg",title:"编辑参数"},[...e[95]||(e[95]=[t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("path",{d:"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"}),t("path",{d:"M18.5 2.5a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4 9.5-9.5z"})],-1)])],8,Qs),t("button",{onClick:o=>ot(l.name),class:"icon-btn hover-danger",title:"彻底删除"},[...e[96]||(e[96]=[t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("polyline",{points:"3 6 5 6 21 6"}),t("path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"})],-1)])],8,Zs)])])]))),128))])])])])])])],2112)):k.value==="settings"?(n(),a(w,{key:2},[c(" MENU VIEW 3: PREVIEW (👁️ 预览) "),t("div",qs,[t("div",Ks,[t("div",{class:"notion-db-header page-section-header preview-page-header"},[e[100]||(e[100]=t("div",null,[t("h1",{class:"notion-main-title"},"预览"),t("p",{class:"section-desc compact"},"实时预览路由与最终提示词效果")],-1)),t("button",{onClick:Fe,class:"btn btn-secondary btn-notion"}," 刷新预览 ")]),t("div",Ys,[t("section",Js,[t("div",Xs,[e[101]||(e[101]=t("div",null,[t("div",{class:"preview-card-title"},"路由清单"),t("div",{class:"preview-card-desc"},"{endpoint} 中可供 ChatLuna 使用的合集与端点")],-1)),t("button",{onClick:e[30]||(e[30]=l=>O(ke.value)),class:"preview-action-btn",disabled:!ke.value,title:"复制路由清单"}," 复制清单 ",8,en)]),Pe.value.length?(n(),a("div",tn,[t("table",ln,[e[103]||(e[103]=t("thead",null,[t("tr",null,[t("th",null,"预览"),t("th",null,"包名"),t("th",null,"描述"),t("th",null,"路径"),t("th",null,"操作")])],-1)),t("tbody",null,[(n(true),a(w,null,V(Pe.value,l=>(n(),a("tr",{key:l.id},[t("td",null,[l.previewImages.length?(n(),a("div",{key:0,class:g(["preview-mini-cover",l.previewImages.length===1?"single":""])},[(n(true),a(w,null,V(l.previewImages,o=>(n(),a("img",{key:o,src:o,alt:`${l.name} 预览`,loading:"lazy",onError:p=>Je(l)},null,40,sn))),128))],2)):(n(),a("div",{key:1,class:g(["preview-route-icon",l.type])},u(l.type==="collection"?"包":"API"),3))]),t("td",null,[t("div",nn,u(l.name),1),t("span",{class:g(["preview-route-type",l.type])},u(l.typeLabel),3)]),t("td",null,[t("div",{class:"preview-route-desc",title:l.description},u(l.description),9,an)]),t("td",null,[t("code",{class:"preview-route-path",title:l.fullUrl,onClick:o=>O(l.fullUrl)},u(l.path),9,on)]),t("td",null,[t("div",rn,[t("a",{href:l.fullUrl,target:"_blank",class:"icon-btn hover-bg",title:"打开预览"},[...e[102]||(e[102]=[t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"}),t("polyline",{points:"15 3 21 3 21 9"}),t("line",{x1:"10",y1:"14",x2:"21",y2:"3"})],-1)])],8,un)])])]))),128))])])])):(n(),a("div",cn," 暂无可用表情包及路由,请前往表情包管理或分发管理中创建。 "))]),t("section",dn,[t("div",vn,[e[104]||(e[104]=t("div",null,[t("div",{class:"preview-card-title"},"最终提示词"),t("div",{class:"preview-card-desc"},"{memesluna} 注入给 LLM 的完整文本")],-1)),t("button",{onClick:e[31]||(e[31]=l=>O(ae.value)),class:"preview-action-btn",disabled:!ae.value,title:"复制最终提示词"}," 复制提示词 ",8,pn)]),t("div",fn,[ae.value?(n(),a("pre",mn,u(ae.value),1)):(n(),a("pre",gn,"- 正在获取最终提示词预览... -"))])])])])])],2112)):c("v-if",true)])],2112))])]))}}),hn=(Y,k)=>{const v=Y.__vccOpts||Y;for(const[A,H]of k)v[A]=H;return v},bn=hn(yn,[["__scopeId","data-v-e3a296f0"]]),wn="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",kn={name:"MemesLunaIcon",render(){return Qe("svg",{class:"k-icon",viewBox:"0 0 1024 1024",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},[Qe("path",{fill:"currentColor",d:wn})])}};_t.register("MemesLunaEmoji",kn);const _n=Y=>{Y.page({name:"MemesLuna",path:"/memesluna",icon:"MemesLunaEmoji",component:bn,authority:1,order:500})};export{_n as default};
package/dist/style.css ADDED
@@ -0,0 +1 @@
1
+ .memesluna-app-layout[data-v-e3a296f0]{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-e3a296f0]{padding:80px 112px 112px;box-sizing:border-box;max-width:1880px;margin:0 auto}.content-breadcrumb-header[data-v-e3a296f0]{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-e3a296f0]{display:flex;align-items:center;gap:8px;font-size:.82rem;color:var(--k-text-muted, rgba(55, 53, 47, .5))}.crumb-root[data-v-e3a296f0]{font-weight:500}.crumb-parent[data-v-e3a296f0]{color:var(--k-text-normal, #37352f);font-weight:500}.crumb-child.active[data-v-e3a296f0]{color:var(--k-color-primary, #2383e2);font-weight:600}.crumb-separator[data-v-e3a296f0]{color:var(--k-color-border, rgba(55, 53, 47, .25))}.header-quick-stats[data-v-e3a296f0]{display:flex;gap:8px}.stat-bubble[data-v-e3a296f0]{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-e3a296f0]{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-e3a296f0]{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-e3a296f0]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .04));color:var(--k-text-normal, #37352f)}.switcher-btn.active[data-v-e3a296f0]{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-e3a296f0]{font-size:.95rem}.notion-db-header[data-v-e3a296f0]{display:flex;justify-content:space-between;align-items:center;margin-top:12px;margin-bottom:12px}.collection-list-header[data-v-e3a296f0]{gap:20px;justify-content:flex-end}.collection-title-group[data-v-e3a296f0]{display:flex;align-items:center;gap:22px;min-width:0}.notion-db-title[data-v-e3a296f0]{font-size:1.24rem;font-weight:700;margin:0;color:var(--k-text-normal, #37352f);white-space:nowrap}.collection-total-count[data-v-e3a296f0]{color:var(--k-text-muted, rgba(55, 53, 47, .58));font-size:.82rem;white-space:nowrap}.notion-db-actions[data-v-e3a296f0]{display:flex;align-items:center;gap:8px}.collection-toolbar[data-v-e3a296f0]{flex-wrap:nowrap;justify-content:flex-end}.collection-search-shell[data-v-e3a296f0],.collection-filter-shell[data-v-e3a296f0]{position:relative;display:inline-flex;align-items:center;color:var(--k-text-muted, rgba(55, 53, 47, .52))}.collection-toolbar-icon[data-v-e3a296f0]{position:absolute;right:11px;width:15px;height:15px;pointer-events:none;color:currentColor;z-index:1}.collection-search-shell .collection-search-input[data-v-e3a296f0]{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-e3a296f0]{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-e3a296f0]{width:200px;height:28px;font-size:.78rem}.btn-notion[data-v-e3a296f0]{height:36px;padding:0 14px;gap:6px;border-radius:6px;font-size:.84rem;font-weight:600;white-space:nowrap}.btn-plus[data-v-e3a296f0]{font-size:1rem;line-height:1}.notion-hr[data-v-e3a296f0]{border:none;border-top:1px solid var(--k-color-border, rgba(55, 53, 47, .09));margin:8px 0 20px}.folders-grid[data-v-e3a296f0]{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:20px 24px}.folder-card[data-v-e3a296f0]{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-e3a296f0]:hover{border-color:#2383e247;box-shadow:0 8px 24px #0f172a14;transform:translateY(-1px)}.folder-cover[data-v-e3a296f0]{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-e3a296f0]{background-color:var(--k-color-border, rgba(15, 23, 42, .08))}.folder-cover.empty[data-v-e3a296f0]{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-e3a296f0]{color:var(--k-text-muted, rgba(55, 53, 47, .55));background-color:var(--k-bg-button-hover, #f1f1ef)}.folder-cover-empty svg[data-v-e3a296f0]{width:32px;height:32px}.folder-cover-img[data-v-e3a296f0]{width:100%;height:100%;object-fit:cover;background-color:var(--k-bg-panel, #f7f7f5)}.folder-cover-badge[data-v-e3a296f0]{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-e3a296f0]{padding:15px 16px 16px;flex:1;display:flex;flex-direction:column;box-sizing:border-box;min-height:108px}.folder-title-row[data-v-e3a296f0]{position:relative;display:flex;align-items:center;justify-content:space-between;gap:10px}.folder-name[data-v-e3a296f0]{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-e3a296f0]{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-e3a296f0]: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-e3a296f0]{width:17px;height:17px}.folder-action-menu[data-v-e3a296f0]{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-e3a296f0]{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-e3a296f0]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .06))}.folder-action-menu button.danger[data-v-e3a296f0]{color:var(--k-color-danger, #eb5757)}.folder-count[data-v-e3a296f0]{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-e3a296f0]{margin-top:8px;display:flex;align-items:center;min-width:0}.folder-meta-item[data-v-e3a296f0]{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-e3a296f0]{width:15px;height:15px;flex-shrink:0}.collection-detail-layout[data-v-e3a296f0]{margin-top:4px}.asset-detail-shell[data-v-e3a296f0]{display:flex;flex-direction:column;gap:14px}.detail-topbar[data-v-e3a296f0]{display:flex;align-items:center;justify-content:space-between;gap:16px;padding-bottom:8px}.detail-breadcrumbs[data-v-e3a296f0]{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-e3a296f0]{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-e3a296f0]: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-e3a296f0],.asset-btn svg[data-v-e3a296f0],.asset-icon-btn svg[data-v-e3a296f0],.asset-test-btn svg[data-v-e3a296f0],.asset-view-toggle svg[data-v-e3a296f0]{width:16px;height:16px;flex:0 0 16px}.detail-separator[data-v-e3a296f0]{color:var(--k-color-border, rgba(55, 53, 47, .3))}.detail-crumb-current[data-v-e3a296f0],.detail-crumb-strong[data-v-e3a296f0]{color:var(--k-text-normal, #111827);font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.detail-top-actions[data-v-e3a296f0]{display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:wrap}.asset-btn[data-v-e3a296f0],.asset-icon-btn[data-v-e3a296f0],.asset-test-btn[data-v-e3a296f0]{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-e3a296f0]:hover,.asset-icon-btn[data-v-e3a296f0]:hover,.asset-test-btn[data-v-e3a296f0]:hover{background-color:var(--k-bg-panel, #f8fafc)}.asset-btn.primary[data-v-e3a296f0],.asset-test-btn[data-v-e3a296f0]{border-color:transparent;background:#1f6feb;color:#fff;box-shadow:none}.asset-btn.primary[data-v-e3a296f0]:hover,.asset-test-btn[data-v-e3a296f0]:hover{background:#1a5fd0}.asset-btn.secondary[data-v-e3a296f0]{background-color:var(--k-bg-card, #ffffff)}.asset-btn.ghost[data-v-e3a296f0]{width:36px;padding:0}.asset-btn.danger[data-v-e3a296f0]{color:var(--k-color-danger, #eb5757)}.asset-btn.danger[data-v-e3a296f0]:hover{background-color:var(--memesluna-danger-soft-bg);border-color:var(--memesluna-danger-border)}.asset-hero-panel[data-v-e3a296f0]{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-e3a296f0]{display:flex;align-items:center;gap:16px;min-width:0}.asset-avatar-frame[data-v-e3a296f0]{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-e3a296f0]{width:100%;height:100%;object-fit:cover}.asset-avatar-empty[data-v-e3a296f0]{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-e3a296f0]{width:34px;height:34px}.asset-title-stack[data-v-e3a296f0]{min-width:0;flex:1}.asset-title-row[data-v-e3a296f0]{display:flex;align-items:center;gap:9px}.asset-title-row h1[data-v-e3a296f0]{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-e3a296f0]{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-e3a296f0]{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-e3a296f0]:focus{color:var(--k-text-normal, #111827)}.asset-meta-line[data-v-e3a296f0]{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-e3a296f0]{min-width:0;align-self:center;width:100%;box-shadow:none}.asset-card-label[data-v-e3a296f0]{color:var(--k-text-normal, #111827);font-size:.8rem;font-weight:720;margin-bottom:9px}.asset-api-row[data-v-e3a296f0]{display:grid;grid-template-columns:minmax(260px,1fr) auto;gap:10px;align-items:center}.asset-api-row code[data-v-e3a296f0]{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-e3a296f0]{min-height:34px;padding:0 11px;border-radius:10px;font-size:.76rem}.asset-icon-btn.compact[data-v-e3a296f0]{width:32px;min-height:32px;padding:0}.asset-test-btn[data-v-e3a296f0]:disabled{opacity:.68;cursor:wait}.asset-api-hint[data-v-e3a296f0]{margin-top:10px;color:var(--k-text-muted, rgba(55, 53, 47, .56));font-size:.74rem}.api-preview-strip[data-v-e3a296f0]{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-e3a296f0]{width:42px;height:42px;object-fit:cover;border-radius:10px;box-shadow:none}.asset-import-panel[data-v-e3a296f0]{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-e3a296f0]{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin-bottom:10px}.asset-import-title[data-v-e3a296f0]{color:var(--k-text-normal, #111827);font-size:.9rem;font-weight:720}.asset-import-desc[data-v-e3a296f0]{margin-top:3px;color:var(--k-text-muted, rgba(55, 53, 47, .56));font-size:.75rem}.asset-link-textarea[data-v-e3a296f0]{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-e3a296f0]: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-e3a296f0]{display:flex;justify-content:flex-end;gap:8px;margin-top:10px}.asset-gallery-section[data-v-e3a296f0]{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-e3a296f0]{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-e3a296f0],.asset-filter-bar[data-v-e3a296f0],.asset-view-toggle[data-v-e3a296f0]{display:flex;align-items:center;gap:6px}.asset-tabs[data-v-e3a296f0]{flex-wrap:wrap}.asset-tab[data-v-e3a296f0]{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-e3a296f0]:hover,.asset-tab.active[data-v-e3a296f0]{color:var(--k-color-primary, #2563eb);background-color:var(--memesluna-primary-soft-bg)}.asset-tab span[data-v-e3a296f0]{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-e3a296f0]{flex:1;justify-content:flex-end;min-width:0}.asset-search-box[data-v-e3a296f0]{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-e3a296f0]{width:16px;height:16px;flex:0 0 16px}.asset-search-box input[data-v-e3a296f0]{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-e3a296f0]{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-e3a296f0]{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-e3a296f0]{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-e3a296f0]{background-color:var(--k-bg-card, #ffffff);color:var(--k-color-primary, #2563eb)}.notion-page-toolbar[data-v-e3a296f0]{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-e3a296f0]{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-e3a296f0]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .04));color:var(--k-text-normal, #37352f)}.toolbar-btn.danger[data-v-e3a296f0]{color:var(--k-color-danger, #eb5757)}.toolbar-btn.danger[data-v-e3a296f0]:hover{background-color:var(--memesluna-danger-soft-bg)}.toolbar-divider[data-v-e3a296f0]{width:1px;height:14px;background-color:var(--k-color-border, rgba(55, 53, 47, .12))}.notion-properties-panel[data-v-e3a296f0]{margin-bottom:20px;display:flex;flex-direction:column;gap:6px}.property-row[data-v-e3a296f0]{display:flex;align-items:center;font-size:.82rem}.property-label[data-v-e3a296f0]{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-e3a296f0]{font-size:.95rem}.property-value[data-v-e3a296f0]{flex:1}.property-input-text[data-v-e3a296f0]{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-e3a296f0]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .03))}.property-input-text[data-v-e3a296f0]: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-e3a296f0]{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-e3a296f0]{font-size:1.15rem;-webkit-user-select:none;user-select:none}.callout-content[data-v-e3a296f0]{flex:1;min-width:0}.callout-title[data-v-e3a296f0]{font-weight:600;font-size:.85rem;color:var(--k-text-normal, #37352f);margin-bottom:2px}.callout-desc[data-v-e3a296f0]{font-size:.75rem;color:var(--k-text-muted, rgba(55, 53, 47, .5));margin-bottom:10px;line-height:1.4}.callout-actions[data-v-e3a296f0]{display:flex;gap:8px}.btn-small[data-v-e3a296f0]{font-size:.75rem;padding:2px 10px;height:24px}.hidden-file-input[data-v-e3a296f0]{display:none}.sidebar-drop-zone-overlay[data-v-e3a296f0]{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-e3a296f0]{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-e3a296f0]{width:48px;height:48px;margin-bottom:16px}.gallery-view-switcher[data-v-e3a296f0]{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-e3a296f0]{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-e3a296f0]:hover{color:var(--k-text-normal, #37352f)}.gallery-tab-btn.active[data-v-e3a296f0]{color:var(--k-text-normal, #37352f);border-bottom-color:var(--k-text-normal, #37352f)}.gallery-tab-content[data-v-e3a296f0]{padding:14px;margin-top:0}.gallery-bulk-toolbar[data-v-e3a296f0]{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-e3a296f0]{position:sticky;top:8px;z-index:40;max-width:920px}.bulk-status[data-v-e3a296f0]{display:flex;align-items:center;gap:8px;min-width:0}.bulk-title[data-v-e3a296f0]{font-size:.82rem;font-weight:720;color:var(--k-text-normal, #37352f)}.bulk-meta[data-v-e3a296f0]{font-size:.72rem;color:var(--k-text-muted, rgba(55, 53, 47, .55))}.bulk-actions[data-v-e3a296f0],.bulk-move-group[data-v-e3a296f0]{display:flex;align-items:center;gap:6px;flex-wrap:wrap;justify-content:flex-end}.toolbar-btn.compact[data-v-e3a296f0]{font-size:.74rem;padding:5px 9px;border-radius:10px}.toolbar-btn[data-v-e3a296f0]:disabled{opacity:.45;cursor:not-allowed}.compact-select[data-v-e3a296f0]{height:30px;padding:2px 9px;font-size:.74rem;border-radius:10px}.notion-gallery-grid[data-v-e3a296f0]{display:grid;grid-template-columns:repeat(auto-fill,minmax(174px,1fr));gap:7px}.notion-gallery-card[data-v-e3a296f0]{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-e3a296f0]:hover,.notion-gallery-card.selected[data-v-e3a296f0]{box-shadow:none}.notion-gallery-card.selected .gallery-img-container[data-v-e3a296f0]{box-shadow:inset 0 0 0 2px var(--k-color-primary, #2563eb)}.notion-gallery-card.external .gallery-img-container[data-v-e3a296f0]{background-color:var(--k-bg-card, #ffffff)}.gallery-select-toggle[data-v-e3a296f0]{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-e3a296f0]{width:14px;height:14px}.notion-gallery-card:hover .gallery-select-toggle[data-v-e3a296f0],.notion-gallery-card.selected .gallery-select-toggle[data-v-e3a296f0]{opacity:1}.gallery-img-container[data-v-e3a296f0]{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-e3a296f0]{width:100%;height:100%;object-fit:cover}.image-format-badge[data-v-e3a296f0]{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-e3a296f0]{background:#0d9488d1}.gallery-list-meta[data-v-e3a296f0]{display:none}.notion-gallery-grid.list-mode[data-v-e3a296f0]{grid-template-columns:1fr;gap:8px}.notion-gallery-grid.list-mode .notion-gallery-card[data-v-e3a296f0]{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-e3a296f0]{height:68px}.notion-gallery-grid.list-mode .gallery-list-meta[data-v-e3a296f0]{display:block;min-width:0;padding-right:88px}.gallery-list-meta div[data-v-e3a296f0]{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-e3a296f0]{display:block;margin-top:4px;color:var(--k-text-muted, rgba(55, 53, 47, .55));font-size:.72rem}.gallery-card-overlay[data-v-e3a296f0]{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-e3a296f0],.notion-gallery-card-active-dropdown .gallery-card-overlay[data-v-e3a296f0]{opacity:1}.overlay-actions[data-v-e3a296f0]{position:absolute;top:8px;right:8px;display:flex;gap:6px;pointer-events:auto}.overlay-actions .card-action-btn[data-v-e3a296f0]{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-e3a296f0]:hover{background:var(--k-color-success, #2b8a5c);color:#fff}.overlay-actions .card-action-btn[data-v-e3a296f0]:hover{background:var(--k-bg-card, #ffffff);color:var(--k-color-primary, #2563eb)}.overlay-actions .card-action-btn.danger[data-v-e3a296f0]{color:var(--k-color-danger, #eb5757)}.overlay-actions .card-action-btn.danger[data-v-e3a296f0]:hover{background:var(--k-color-danger, #eb5757);color:#fff}.flat-input[data-v-e3a296f0],.flat-select[data-v-e3a296f0],.flat-textarea[data-v-e3a296f0]{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-e3a296f0]:focus,.flat-select[data-v-e3a296f0]:focus,.flat-textarea[data-v-e3a296f0]: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-e3a296f0]::placeholder,.flat-textarea[data-v-e3a296f0]::placeholder,.property-input-text[data-v-e3a296f0]::placeholder{color:var(--k-text-muted, rgba(55, 53, 47, .45));opacity:.78}.flat-input[data-v-e3a296f0]: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-e3a296f0]{font-size:.7rem;color:var(--k-text-muted, rgba(55, 53, 47, .45));margin-top:4px;display:block}.btn[data-v-e3a296f0]{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-e3a296f0]{background-color:var(--k-color-primary, #2383e2);color:#fff}.btn-primary[data-v-e3a296f0]:hover{background-color:var(--k-color-primary-shade, #1a6cb8)}.btn-secondary[data-v-e3a296f0]{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-e3a296f0]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .04))}.btn-danger[data-v-e3a296f0]{background-color:var(--k-color-danger, #eb5757);color:#fff}.btn-danger[data-v-e3a296f0]:hover{background-color:var(--k-color-danger-shade, #d44c4c)}.w-full[data-v-e3a296f0]{width:100%}.mt-2[data-v-e3a296f0]{margin-top:8px}.mt-3[data-v-e3a296f0]{margin-top:12px}.mt-4[data-v-e3a296f0]{margin-top:16px}.empty-placeholder-card[data-v-e3a296f0]{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-e3a296f0]{font-size:2.5rem;margin-bottom:12px}.empty-placeholder-card h3[data-v-e3a296f0]{font-size:.95rem;margin:0 0 6px;font-weight:600}.empty-placeholder-card p[data-v-e3a296f0]{font-size:.78rem;color:var(--k-text-muted, rgba(55, 53, 47, .5));margin:0}.empty-gallery[data-v-e3a296f0]{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-e3a296f0]{position:relative}.move-dropdown-menu[data-v-e3a296f0]{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-e3a296f0]{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-e3a296f0]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .04))}.pagination-container[data-v-e3a296f0]{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-e3a296f0]{font-size:.78rem;color:var(--k-text-muted, rgba(55, 53, 47, .6))}.page-btn[data-v-e3a296f0]{height:28px;padding:0 10px;font-size:.75rem}.links-list-container[data-v-e3a296f0]{border:1px solid var(--k-color-border, rgba(55, 53, 47, .09));border-radius:6px;overflow:hidden}.link-item-row[data-v-e3a296f0]{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-e3a296f0]:last-child{border-bottom:none}.link-item-row[data-v-e3a296f0]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .015))}.link-url-wrapper[data-v-e3a296f0]{display:flex;align-items:center;gap:8px;flex:1;min-width:0;margin-right:16px}.bullet[data-v-e3a296f0]{color:var(--k-text-muted, rgba(55, 53, 47, .35));font-weight:700}.link-url-text[data-v-e3a296f0]{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-e3a296f0]:hover{color:var(--k-color-primary, #2383e2);text-decoration:underline}.link-actions[data-v-e3a296f0]{display:flex;gap:6px}.page-section-header[data-v-e3a296f0]{align-items:center;justify-content:space-between;gap:16px;margin-top:0;margin-bottom:14px}.page-section-header>div[data-v-e3a296f0]{min-width:0}.page-section-header .notion-main-title[data-v-e3a296f0]{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-e3a296f0]{align-self:center}.section-desc.compact[data-v-e3a296f0]{margin:8px 0 0;max-width:620px;line-height:1.45}.endpoint-layout[data-v-e3a296f0]{display:flex;flex-direction:column;gap:16px}.notion-form-panel[data-v-e3a296f0]{padding:12px 0}.endpoint-editor-panel[data-v-e3a296f0]{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-e3a296f0],.table-title-row[data-v-e3a296f0]{display:flex;align-items:center;justify-content:space-between;gap:12px}.notion-panel-title[data-v-e3a296f0]{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-e3a296f0],.table-title-row .notion-panel-title[data-v-e3a296f0]{margin-bottom:0}.table-count[data-v-e3a296f0]{font-size:.72rem;color:var(--k-text-muted, rgba(55, 53, 47, .5))}.form-fields[data-v-e3a296f0]{display:flex;flex-direction:column;gap:12px}.form-group[data-v-e3a296f0]{display:flex;flex-direction:column}.endpoint-form-grid[data-v-e3a296f0]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:14px}.span-2[data-v-e3a296f0]{grid-column:1 / -1}.form-group label[data-v-e3a296f0]{font-size:.75rem;font-weight:600;color:var(--k-text-muted, rgba(55, 53, 47, .65));margin-bottom:4px}.form-row[data-v-e3a296f0]{display:flex;gap:10px}.form-actions[data-v-e3a296f0]{display:flex;gap:8px;margin-top:8px}.flex-grow[data-v-e3a296f0]{flex:1}.endpoint-preview[data-v-e3a296f0]{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-e3a296f0]{color:var(--k-text-muted, rgba(55, 53, 47, .5));font-size:.72rem;font-weight:600;flex-shrink:0}.endpoint-preview code[data-v-e3a296f0]{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-e3a296f0]{padding:12px 0}.table-title-row[data-v-e3a296f0]{margin-bottom:8px}.table-container[data-v-e3a296f0]{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-e3a296f0]{width:100%;border-collapse:collapse;font-size:.78rem}.flat-table th[data-v-e3a296f0]{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-e3a296f0]{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-e3a296f0]{border-bottom:none}.empty-cell[data-v-e3a296f0]{text-align:center;padding:40px!important;color:var(--k-text-muted, rgba(55, 53, 47, .35))}.endpoint-name[data-v-e3a296f0]{font-weight:600}.group-badge[data-v-e3a296f0]{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-e3a296f0]{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-e3a296f0]{font-size:.65rem;font-weight:600;padding:1px 5px;border-radius:3px;text-transform:uppercase;margin-right:6px}.method-tag.redirect[data-v-e3a296f0]{background-color:var(--memesluna-primary-soft-bg);color:var(--k-color-primary, #2383e2)}.link-text[data-v-e3a296f0]{font-weight:500;color:var(--k-color-primary, #2383e2);cursor:pointer}.link-text[data-v-e3a296f0]:hover{text-decoration:underline}.target-url[data-v-e3a296f0]{font-size:.72rem;color:var(--k-text-muted, rgba(55, 53, 47, .4));max-width:300px;margin-top:2px}.url-line[data-v-e3a296f0]{display:flex;align-items:center;gap:4px}.font-mono[data-v-e3a296f0]{font-family:SFMono-Regular,Consolas,monospace}.truncate[data-v-e3a296f0]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.action-buttons[data-v-e3a296f0]{display:flex;justify-content:flex-end;gap:4px}.icon-btn[data-v-e3a296f0]{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-e3a296f0]{width:12px;height:12px}.icon-btn.hover-bg[data-v-e3a296f0]: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-e3a296f0]: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-e3a296f0]{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-e3a296f0]:hover{color:var(--k-color-primary, #2383e2)}.icon-btn-inline svg[data-v-e3a296f0]{width:10px;height:10px}.settings-preview-panel[data-v-e3a296f0]{width:100%;max-width:none;margin:0 auto}.preview-page-header[data-v-e3a296f0]{margin-bottom:12px}.preview-dashboard-grid[data-v-e3a296f0]{display:grid;grid-template-columns:minmax(560px,1fr) minmax(420px,.9fr);gap:22px;align-items:start}.preview-card[data-v-e3a296f0]{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-e3a296f0]{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-e3a296f0]{color:var(--k-text-normal, #111827);font-size:1rem;line-height:1.25;font-weight:760}.preview-card-desc[data-v-e3a296f0]{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-e3a296f0]{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-e3a296f0]:hover:not(:disabled){background-color:var(--k-bg-panel, #f8fafc)}.preview-action-btn[data-v-e3a296f0]:disabled{opacity:.45;cursor:not-allowed}.preview-table-wrap[data-v-e3a296f0]{overflow-x:auto}.preview-route-table[data-v-e3a296f0]{width:100%;border-collapse:collapse;table-layout:fixed}.preview-route-table th[data-v-e3a296f0],.preview-route-table td[data-v-e3a296f0]{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-e3a296f0]{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-e3a296f0]{border-bottom:none}.preview-route-table th[data-v-e3a296f0]:nth-child(1),.preview-route-table td[data-v-e3a296f0]:nth-child(1){width:86px}.preview-route-table th[data-v-e3a296f0]:nth-child(2),.preview-route-table td[data-v-e3a296f0]:nth-child(2){width:130px}.preview-route-table th[data-v-e3a296f0]:nth-child(4),.preview-route-table td[data-v-e3a296f0]:nth-child(4){width:186px}.preview-route-table th[data-v-e3a296f0]:nth-child(5),.preview-route-table td[data-v-e3a296f0]:nth-child(5){width:64px;text-align:center}.preview-mini-cover[data-v-e3a296f0]{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-e3a296f0]{display:block}.preview-mini-cover img[data-v-e3a296f0]{width:100%;height:100%;object-fit:cover;background-color:var(--k-bg-panel, #f7f7f5)}.preview-route-icon[data-v-e3a296f0]{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-e3a296f0]{background-color:var(--memesluna-success-soft-bg);color:var(--k-color-success, #2b8a5c)}.preview-route-name[data-v-e3a296f0]{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-e3a296f0]{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-e3a296f0]{background-color:var(--memesluna-success-soft-bg);color:var(--k-color-success, #2b8a5c)}.preview-route-desc[data-v-e3a296f0]{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-e3a296f0]{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-e3a296f0]{display:flex;align-items:center;justify-content:center}.preview-empty-state[data-v-e3a296f0]{padding:64px 20px;color:var(--k-text-muted, rgba(55, 53, 47, .48));text-align:center;font-size:.82rem}.preview-prompt-container[data-v-e3a296f0]{display:flex;flex-direction:column;gap:12px}.preview-sub-title[data-v-e3a296f0]{font-size:.72rem;font-weight:600;color:var(--k-text-muted, rgba(55, 53, 47, .45));text-transform:uppercase}.preview-sub-desc[data-v-e3a296f0]{margin-top:2px;font-size:.72rem;color:var(--k-text-muted, rgba(55, 53, 47, .45))}.preview-block-header[data-v-e3a296f0]{display:flex;align-items:flex-end;justify-content:space-between;gap:12px}.preview-code-block[data-v-e3a296f0]{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-e3a296f0]{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-e3a296f0]{max-height:620px;background-color:var(--memesluna-final-prompt-bg);border-color:var(--memesluna-primary-soft-bg)}.preview-code-block.polished[data-v-e3a296f0]{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-e3a296f0]{color:var(--memesluna-code-text);font-size:.76rem;line-height:1.7}.text-gray-muted[data-v-e3a296f0]{color:var(--k-text-muted, rgba(55, 53, 47, .35));font-style:italic}.toast-banner[data-v-e3a296f0]{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-e3a296f0]{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-e3a296f0]{background-color:var(--memesluna-toast-error-bg);border-color:var(--memesluna-danger-border);color:var(--k-color-danger, #eb5757)}.toast-icon[data-v-e3a296f0]{width:14px;height:14px;flex-shrink:0}.loading-container[data-v-e3a296f0]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:80px 0}.spinner[data-v-e3a296f0]{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-e3a296f0 .8s linear infinite;margin-bottom:12px}@keyframes spin-e3a296f0{to{transform:rotate(360deg)}}.loading-container p[data-v-e3a296f0]{font-size:.78rem;color:var(--k-text-muted, rgba(55, 53, 47, .5));margin:0}.fade-enter-active[data-v-e3a296f0],.fade-leave-active[data-v-e3a296f0]{transition:opacity .15s ease,transform .15s ease}.fade-enter-from[data-v-e3a296f0],.fade-leave-to[data-v-e3a296f0]{opacity:0;transform:translateY(-8px)}@media (max-width: 1280px){.notion-content[data-v-e3a296f0]{padding:64px 80px 96px}.preview-dashboard-grid[data-v-e3a296f0]{grid-template-columns:1fr}}@media (max-width: 780px){.memesluna-app-layout[data-v-e3a296f0]{padding-left:0}.notion-content[data-v-e3a296f0]{padding:18px 16px}.content-breadcrumb-header[data-v-e3a296f0],.notion-db-header[data-v-e3a296f0],.page-section-header[data-v-e3a296f0],.notion-page-header[data-v-e3a296f0],.gallery-bulk-toolbar[data-v-e3a296f0]{align-items:stretch;flex-direction:column}.notion-db-actions[data-v-e3a296f0],.bulk-actions[data-v-e3a296f0],.form-actions[data-v-e3a296f0],.collection-name-input-notion[data-v-e3a296f0],.notion-db-actions .btn[data-v-e3a296f0],.form-actions .btn[data-v-e3a296f0]{width:100%}.endpoint-form-grid[data-v-e3a296f0]{grid-template-columns:1fr}.span-2[data-v-e3a296f0]{grid-column:auto}.folders-grid[data-v-e3a296f0]{grid-template-columns:1fr}.notion-gallery-grid[data-v-e3a296f0]{grid-template-columns:repeat(auto-fill,minmax(130px,1fr))}.preview-block-header[data-v-e3a296f0],.preview-card-header[data-v-e3a296f0]{align-items:stretch;flex-direction:column}.preview-action-btn[data-v-e3a296f0]{width:100%}.preview-route-table[data-v-e3a296f0]{min-width:720px}}@media (max-width: 1180px){.asset-hero-panel[data-v-e3a296f0]{grid-template-columns:1fr}}@media (max-width: 980px){.detail-topbar[data-v-e3a296f0],.asset-gallery-toolbar[data-v-e3a296f0]{align-items:stretch;flex-direction:column}.detail-top-actions[data-v-e3a296f0],.asset-filter-bar[data-v-e3a296f0]{justify-content:flex-start}.asset-filter-bar[data-v-e3a296f0]{flex-wrap:wrap}.asset-search-box[data-v-e3a296f0]{max-width:none;width:100%}}@media (max-width: 640px){.asset-hero-panel[data-v-e3a296f0]{padding:14px;border-radius:14px}.asset-identity-card[data-v-e3a296f0]{align-items:flex-start}.asset-avatar-frame[data-v-e3a296f0]{width:72px;height:72px;flex-basis:72px;border-radius:14px}.asset-title-row h1[data-v-e3a296f0]{font-size:1.35rem}.asset-api-row[data-v-e3a296f0]{grid-template-columns:1fr}.asset-tabs[data-v-e3a296f0],.detail-top-actions[data-v-e3a296f0]{width:100%}.asset-btn[data-v-e3a296f0]{flex:1}.notion-gallery-grid[data-v-e3a296f0]{grid-template-columns:repeat(auto-fill,minmax(138px,1fr))}}
package/lib/config.d.ts CHANGED
@@ -1,20 +1,7 @@
1
1
  import { Schema } from 'koishi';
2
- export interface QueryParamConfig {
3
- name: string;
4
- required?: boolean;
5
- defaultValue?: string;
6
- validValues?: string[];
7
- }
8
- export interface ProxySettings {
9
- imageUrlField?: string;
10
- imageUrlFieldFromParamDefault?: string;
11
- fallbackAction?: 'returnJson' | 'error';
12
- }
13
- export type ForwardMethod = 'redirect' | 'proxy';
14
- export type UrlConstruction = 'normal' | 'special_forward' | 'special_pollinations' | 'special_draw_redirect';
15
2
  export interface Config {
16
3
  backendPath: string;
17
- storagePath: string;
4
+ storagePath?: string;
18
5
  selfUrl: string;
19
6
  injectVariables: boolean;
20
7
  variableRefreshIntervalMs: number;