koishi-plugin-memesluna 0.2.9 → 0.3.0

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 w,icons as De}from"@koishijs/client";import{defineComponent as Ne,ref as p,reactive as se,computed as ce,onMounted as Ue,onUnmounted as Ve,watch as We,openBlock as l,createElementBlock as a,createCommentVNode as r,createElementVNode as e,Fragment as k,toDisplayString as d,normalizeClass as T,createVNode as Re,Transition as Fe,withCtx as Se,withDirectives as C,withKeys as ue,vModelText as U,renderList as O,createTextVNode as H,withModifiers as P,createStaticVNode as Oe,vShow as z,h as de}from"vue";const He={class:"memesluna-app-layout"},ze={class:"notion-content"},je={class:"content-breadcrumb-header"},Ze={class:"breadcrumbs"},Ge={key:0,class:"crumb-parent"},Ke={key:1,class:"crumb-parent"},Qe={key:2,class:"crumb-parent"},qe={class:"crumb-child active"},Je={key:0,class:"header-quick-stats"},Ye={class:"stat-bubble"},Xe={class:"stat-bubble"},et={key:0,class:"notion-view-switcher"},tt={key:0,class:"toast-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},nt={key:1,class:"toast-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},st={key:2,class:"toast-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},ot={key:1,class:"loading-container"},lt={class:"content-body-wrapper"},at={key:0,class:"resources-router-view"},it={key:0,class:"collections-folder-view"},rt={class:"notion-db-header"},ct={class:"notion-db-actions"},ut={key:0,class:"empty-placeholder-card"},dt={key:1,class:"folders-grid"},vt=["onClick"],pt={class:"folder-body"},mt={class:"folder-name"},ft=["title"],yt={class:"folder-footer"},ht={class:"folder-meta"},gt={class:"notion-page-header"},bt={class:"notion-page-header-left"},wt={class:"notion-page-title-wrapper"},kt={class:"notion-page-title"},Ct={class:"notion-page-meta"},_t={class:"notion-page-header-right"},xt=["href"],$t={class:"notion-page-toolbar"},Et={class:"notion-properties-panel"},It={class:"property-row"},Lt={class:"property-value"},Mt={class:"notion-callout upload-callout mt-4"},Tt={class:"callout-content"},Pt={class:"callout-actions"},Bt={class:"notion-callout links-import-callout mt-3"},At={class:"callout-content w-full"},Dt={class:"callout-actions mt-2"},Nt={class:"gallery-view-switcher mt-4"},Ut={class:"gallery-tab-content"},Vt={key:0,class:"empty-gallery"},Wt={key:1},Rt={class:"notion-gallery-grid"},Ft=["onClick"],St=["src"],Ot={class:"gallery-card-overlay"},Ht={class:"overlay-actions"},zt=["onClick"],jt={class:"move-dropdown-menu"},Zt=["onClick"],Gt=["onClick"],Kt={key:0,class:"pagination-container"},Qt=["disabled"],qt={class:"page-indicator"},Jt=["disabled"],Yt={class:"gallery-tab-content"},Xt={key:0,class:"empty-gallery"},en={key:1,class:"links-list-container"},tn={class:"link-url-wrapper"},nn=["onClick"],sn={class:"link-actions"},on=["onClick"],ln=["onClick"],an={class:"distribution-router-view"},rn={class:"dashboard-grid"},cn={class:"notion-form-panel"},un={class:"notion-panel-title"},dn={class:"form-fields"},vn={class:"form-group"},pn=["disabled"],mn={class:"form-group"},fn={class:"form-group"},yn={class:"form-actions"},hn={class:"notion-table-panel"},gn={class:"table-container"},bn={class:"flat-table"},wn={key:0},kn={class:"endpoint-name"},Cn=["title"],_n={class:"font-mono"},xn={class:"url-line"},$n=["onClick"],En=["onClick"],In=["title"],Ln={style:{"text-align":"right"}},Mn={class:"action-buttons"},Tn=["href"],Pn=["onClick"],Bn=["onClick"],An={class:"settings-router-view"},Dn={class:"settings-centered-layout"},Nn={class:"settings-preview-panel"},Un={class:"preview-prompt-container mt-4"},Vn={class:"preview-code-block"},Wn={key:0},Rn={key:1,class:"text-gray-muted"},Fn={class:"preview-code-block final-prompt"},Sn={key:0},On={key:1,class:"text-gray-muted"},Hn=Ne({__name:"Dashboard",setup(V){const h=p("resources"),u=p(true),m=p("/memesluna"),f=p("http://localhost:5140"),j=p([]),L=p([]);p(null);const x=p(null),v=se({name:"",group:"",description:"",url:"",method:"redirect",urlConstruction:"normal"}),Z=p(""),c=p(null),G=p(""),W=p(""),_=se({images:[],links:[]}),B=p("local"),R=p(false),A=p(null);function ve(n){A.value===n?A.value=null:A.value=n}const $=p(1),K=p(24),D=ce(()=>Math.ceil(_.images.length/K.value)),pe=ce(()=>{const n=($.value-1)*K.value;return _.images.slice(n,n+K.value)}),Q=p(""),q=p(""),F=p(false),J=p(null),E=se({show:false,message:"",type:"info"});let Y=null;function i(n,t="info"){Y&&clearTimeout(Y),E.message=n,E.type=t,E.show=true,Y=setTimeout(()=>{E.show=false},2500)}function X(n){h.value=n,n==="settings"&&me()}function N(n){const t=f.value.endsWith("/")?f.value.slice(0,-1):f.value,s=m.value.startsWith("/")?m.value:`/${m.value}`,o=s.endsWith("/")?s.slice(0,-1):s;return`${t}${o}/${n}`}function oe(n,t){const s=f.value.endsWith("/")?f.value.slice(0,-1):f.value,o=m.value.startsWith("/")?m.value:`/${m.value}`,b=o.endsWith("/")?o.slice(0,-1):o;return`${s}${b}/api/admin/collections/${encodeURIComponent(n)}/images/${encodeURIComponent(t)}`}async function g(){try{f.value=window.location.origin;const n=await w("memesluna/getState");n&&(n.backendPath&&(m.value=n.backendPath),j.value=Array.isArray(n.endpoints)?n.endpoints:[],L.value=Array.isArray(n.collections)?n.collections:[])}catch(n){i(n instanceof Error?n.message:"获取插件状态同步失败","error")}}async function me(){try{const n=f.value.endsWith("/")?f.value.slice(0,-1):f.value,t=m.value.startsWith("/")?m.value:`/${m.value}`,s=t.endsWith("/")?t.slice(0,-1):t,o=await fetch(`${n}${s}/api/homepage-data`);if(o.ok){const b=await o.json();Q.value=b.routeInventory||"",q.value=b.llmPrompt||""}}catch(n){console.error("Failed to sync settings variables preview:",n)}}function ee(){x.value=null,v.name="",v.group="",v.description="",v.url="",v.method="redirect",v.urlConstruction="normal"}function fe(n){x.value=n,v.name=n.name||"",v.group=n.group||"",v.description=n.description||"",v.url=n.url||"",v.method=n.method||"redirect",v.urlConstruction=n.urlConstruction||"normal"}async function ye(){const n=v.name.trim(),t=v.url.trim();if(!n||!t){i("端点名称和目标直链 URL 均必填","error");return}const s={name:n,group:v.group.trim()||"默认分组",description:v.description.trim(),url:t,method:v.method,urlConstruction:v.urlConstruction,queryParams:[],proxySettings:{fallbackAction:"returnJson"}};try{u.value=true,x.value?(await w("memesluna/updateEndpoint",x.value.name,s),i("端点路由参数已成功更新","success")):(await w("memesluna/createEndpoint",s),i("接口端点已成功创建","success")),await g(),ee()}catch(o){i(o instanceof Error?o.message:"保存端点失败","error")}finally{u.value=false}}async function he(n){if(confirm(`确认删除端点路由 "${n}" 吗?`))try{u.value=true,await w("memesluna/deleteEndpoint",n),i("该分发端点已彻底删除","success"),await g(),x.value&&x.value.name===n&&ee()}catch(t){i(t instanceof Error?t.message:"删除端点路由失败","error")}finally{u.value=false}}async function S(n){try{await navigator.clipboard.writeText(n),i("成功复制链接到剪贴板","success")}catch{i("复制失败","error")}}async function le(){const n=Z.value.trim();if(!n){i("表情包名称不能为空","error");return}try{if(u.value=true,!await w("memesluna/createCollection",n)){i("该名称的表情包已存在,请更换其他名称","error");return}i("表情包已成功创建","success"),Z.value="",await g()}catch(t){i(t instanceof Error?t.message:"创建失败","error")}finally{u.value=false}}async function ge(n){if(confirm(`⚠️ 危险操作:确认永久且彻底删除表情包 "${n}",及其包含的所有本地图片文件吗?此项操作不可逆!`))try{u.value=true,await w("memesluna/deleteCollection",n),i("该表情包资源已彻底销毁删除","success"),c.value=null,await g()}catch(t){i(t instanceof Error?t.message:"删除失败","error")}finally{u.value=false}}async function be(n){c.value=n,G.value=n.description||"",W.value="",$.value=1,await M(n.name)}function we(){c.value=null}async function M(n){try{const t=f.value.endsWith("/")?f.value.slice(0,-1):f.value,s=m.value.startsWith("/")?m.value:`/${m.value}`,o=s.endsWith("/")?s.slice(0,-1):s,b=await fetch(`${t}${o}/api/collections/${encodeURIComponent(n)}/resources`);if(b.ok){const y=await b.json();_.images=Array.isArray(y.images)?y.images:[],_.links=Array.isArray(y.links)?y.links:[]}}catch{i("加载该表情包下的图片缓存失败","error")}}async function ke(){if(!c.value)return;u.value=true,await M(c.value.name),await g();const n=L.value.find(t=>t.name===c.value.name);n&&(c.value=n),u.value=false,i("本地及缓存资源数据已刷新成功","success")}async function ae(){if(c.value)try{u.value=true,await w("memesluna/setCollectionDescription",c.value.name,G.value.trim()),i("表情包描述已成功保存","success"),await g();const n=L.value.find(t=>t.name===c.value.name);n&&(c.value=n)}catch(n){i(n instanceof Error?n.message:"保存表情包描述失败","error")}finally{u.value=false}}function Ce(){J.value&&J.value.click()}function _e(n){const t=n.target;t.files&&ie(t.files)}function xe(n){F.value=false,n.dataTransfer&&n.dataTransfer.files&&ie(n.dataTransfer.files)}async function ie(n){if(!c.value)return;const t=Array.from(n);if(t.filter(y=>y.name.toLowerCase().endsWith(".avif")).length>0){i("已自动拦截 avif 图片。QQ 机器人框架无法渲染及读取此格式。","error");return}const o=t.filter(y=>y.type.startsWith("image/"));if(!o.length){i("请拖入或选择有效的图片格式文件","error");return}if(o.length>50){i("单次上传表情上限为 50 张,请分批次导入","error");return}if(o.filter(y=>y.size>10*1024*1024).length>0){i("已拦截大小超出 10MB 的单个图片素材","error");return}i(`正在转码并上传 ${o.length} 张表情图片...`,"info");try{const y=[];for(const I of o){const Ae=await $e(I);y.push({base64:Ae,originalName:I.name})}const Pe=f.value.endsWith("/")?f.value.slice(0,-1):f.value,te=m.value.startsWith("/")?m.value:`/${m.value}`,Be=te.endsWith("/")?te.slice(0,-1):te,ne=await fetch(`${Pe}${Be}/api/admin/collections/${encodeURIComponent(c.value.name)}/images`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({images:y})});if(ne.ok){const I=await ne.json();I.ok&&I.uploaded&&I.uploaded.length>0?i(`成功将 ${I.uploaded.length} 张表情入库并完成数字重命名`,"success"):i("上传图片写入失败","error")}else{const I=await ne.json().catch(()=>({}));i(I.error||"上传中继失败","error")}}catch(y){i(`上传网络错误: ${y instanceof Error?y.message:"错误"}`,"error")}finally{await M(c.value.name),await g()}}function $e(n){return new Promise((t,s)=>{const o=new FileReader;o.readAsDataURL(n),o.onload=()=>{const y=o.result.split(",")[1];t(y)},o.onerror=b=>s(b)})}async function Ee(){if(!c.value)return;const n=W.value.trim();if(!n){i("链接文本不能为空","error");return}try{u.value=true;const t=await w("memesluna/addLinks",c.value.name,n);i(`已成功录入 ${t} 条网络图片外链`,"success"),W.value="",await M(c.value.name),await g()}catch(t){i(t instanceof Error?t.message:"添加失败","error")}finally{u.value=false}}async function Ie(n,t){if(confirm("确认删除该图片网络外链直链吗?"))try{u.value=true,await w("memesluna/deleteLink",n,t),i("外链直链已彻底删除","success"),await M(n),await g()}catch(s){i(s instanceof Error?s.message:"删除链接失败","error")}finally{u.value=false}}async function Le(n,t){if(confirm(`确认永久删除该本地图片素材 "${t}" 吗?此操作无法恢复!`))try{u.value=true,await w("memesluna/deleteLocalImage",n,t),i("该本地图片已永久删除","success"),await M(n),await g()}catch(s){i(s instanceof Error?s.message:"删除失败","error")}finally{u.value=false}}async function Me(n,t,s){try{u.value=true,await w("memesluna/moveLocalImage",n,t,s)?(i(`已将素材移动至表情包 "${t}" 并重命名`,"success"),await M(n),await g()):i("移动失败","error")}catch(o){i(o instanceof Error?o.message:"移库失败","error")}finally{u.value=false}}function Te(n){window.open(n,"_blank")}const re=()=>{A.value=null};return Ue(async()=>{window.addEventListener("click",re),u.value=true,await g(),u.value=false}),Ve(()=>{window.removeEventListener("click",re)}),We(_,()=>{$.value>D.value&&D.value>0&&($.value=D.value)}),(n,t)=>(l(),a("div",He,[r(" MAIN CONTENT AREA "),e("main",ze,[r(" Top Notion Breadcrumbs "),e("header",je,[e("div",Ze,[t[21]||(t[21]=e("span",{class:"crumb-root"},"MemesLuna 控制台",-1)),t[22]||(t[22]=e("span",{class:"crumb-separator"},"/",-1)),h.value==="resources"?(l(),a("span",Ge,"表情包管理")):h.value==="distribution"?(l(),a("span",Ke,"分发管理")):h.value==="settings"?(l(),a("span",Qe,"预览")):r("v-if",true),h.value==="resources"&&c.value?(l(),a(k,{key:3},[t[20]||(t[20]=e("span",{class:"crumb-separator"},"/",-1)),e("span",qe,"表情包: "+d(c.value.name),1)],64)):r("v-if",true)]),r(" Quick Stats Banner "),u.value?r("v-if",true):(l(),a("div",Je,[e("span",Ye,"📂 表情包总数: "+d(L.value.length),1),e("span",Xe,"🌐 分发接口: "+d(j.value.length),1)]))]),r(" NOTION-STYLE HORIZONTAL VIEW SWITCHER "),c.value?r("v-if",true):(l(),a("div",et,[e("button",{onClick:t[0]||(t[0]=s=>X("resources")),class:T(["switcher-btn",h.value==="resources"?"active":""])},[...t[23]||(t[23]=[e("span",{class:"switcher-icon"},"📦",-1),e("span",{class:"switcher-label"},"表情包管理",-1)])],2),e("button",{onClick:t[1]||(t[1]=s=>X("distribution")),class:T(["switcher-btn",h.value==="distribution"?"active":""])},[...t[24]||(t[24]=[e("span",{class:"switcher-icon"},"🌐",-1),e("span",{class:"switcher-label"},"分发管理",-1)])],2),e("button",{onClick:t[2]||(t[2]=s=>X("settings")),class:T(["switcher-btn",h.value==="settings"?"active":""])},[...t[25]||(t[25]=[e("span",{class:"switcher-icon"},"👁️",-1),e("span",{class:"switcher-label"},"预览",-1)])],2)])),r(" Global Toast Alert Banner "),Re(Fe,{name:"fade"},{default:Se(()=>[E.show?(l(),a("div",{key:0,class:T(["toast-banner",E.type])},[E.type==="success"?(l(),a("svg",tt,[...t[26]||(t[26]=[e("polyline",{points:"20 6 9 17 4 12"},null,-1)])])):E.type==="error"?(l(),a("svg",nt,[...t[27]||(t[27]=[e("circle",{cx:"12",cy:"12",r:"10"},null,-1),e("line",{x1:"12",y1:"8",x2:"12",y2:"12"},null,-1),e("line",{x1:"12",y1:"16",x2:"12.01",y2:"16"},null,-1)])])):(l(),a("svg",st,[...t[28]||(t[28]=[e("circle",{cx:"12",cy:"12",r:"10"},null,-1),e("line",{x1:"12",y1:"16",x2:"12",y2:"12"},null,-1),e("line",{x1:"12",y1:"8",x2:"12.01",y2:"8"},null,-1)])])),e("span",null,d(E.message),1)],2)):r("v-if",true)]),_:1}),r(" Loading Cover "),u.value?(l(),a("div",ot,[...t[29]||(t[29]=[e("div",{class:"spinner"},null,-1),e("p",null,"正在同步数据...",-1)])])):(l(),a(k,{key:2},[r(" MAIN ROUTER BODY "),e("div",lt,[r(" MENU VIEW 1: RESOURCES (📦) "),h.value==="resources"?(l(),a("div",at,[r(" Collection Lists (Folder view) "),c.value?(l(),a(k,{key:1},[r(" Collection Details (Inside details view) "),e("div",{class:"collection-detail-layout",onDragover:t[16]||(t[16]=P(s=>F.value=true,["prevent"]))},[r(" Notion Document Title Block "),e("div",gt,[e("div",bt,[t[36]||(t[36]=e("div",{class:"notion-page-icon"},"📂",-1)),e("div",wt,[e("h1",kt,"表情包: "+d(c.value.name),1),e("div",Ct,[t[35]||(t[35]=H(" API 端点: ",-1)),e("code",{class:"code-url",onClick:t[4]||(t[4]=s=>S(N(c.value.name))),title:"点击复制完整 URL"},d(N(c.value.name)),1)])])]),e("div",_t,[e("a",{href:N(c.value.name),target:"_blank",class:"btn-test-link",title:"测试"}," ⚡ 测试 ",8,xt)])]),r(" Page Action Toolbar "),e("div",$t,[e("button",{onClick:we,class:"toolbar-btn"}," ◀ 返回列表 "),e("button",{onClick:ke,class:"toolbar-btn"}," 🔄 刷新缓存 "),t[37]||(t[37]=e("div",{class:"toolbar-divider"},null,-1)),e("button",{onClick:t[5]||(t[5]=s=>ge(c.value.name)),class:"toolbar-btn danger"}," 🗑️ 删除表情包 ")]),r(" Notion Page Properties Block "),e("div",Et,[e("div",It,[t[38]||(t[38]=e("div",{class:"property-label"},[e("span",{class:"prop-icon"},"📝"),H(" 表情包描述 ")],-1)),e("div",Lt,[C(e("input",{"onUpdate:modelValue":t[6]||(t[6]=s=>G.value=s),class:"property-input-text",placeholder:"回车或失去焦点即可自动保存描述(帮助 AI 理解该表情包属性)...",onBlur:ae,onKeyup:ue(ae,["enter"])},null,544),[[U,G.value]])])])]),r(" Upload and Batch Import Area (Notion Callout style) "),e("div",Mt,[t[41]||(t[41]=e("div",{class:"callout-icon"},"📤",-1)),e("div",Tt,[t[39]||(t[39]=e("div",{class:"callout-title"},"上传与导入图片素材",-1)),t[40]||(t[40]=e("div",{class:"callout-desc"},"拖放本地图片文件至页面任何位置,或手动选择文件进行上传。单张限制 10MB。",-1)),e("div",Pt,[e("button",{onClick:Ce,class:"btn btn-secondary btn-small"}," 选择本地文件 "),e("button",{onClick:t[7]||(t[7]=s=>R.value=!R.value),class:"btn btn-secondary btn-small"},d(R.value?"收起外链导入":"批量导入外链"),1),e("input",{ref_key:"fileInput",ref:J,type:"file",multiple:"",accept:"image/*",class:"hidden-file-input",onChange:_e},null,544)])])]),r(" Drag over drop zone area "),C(e("div",{class:"sidebar-drop-zone-overlay",onDragover:t[8]||(t[8]=P(s=>F.value=true,["prevent"])),onDragleave:t[9]||(t[9]=P(s=>F.value=false,["prevent"])),onDrop:P(xe,["prevent"])},[...t[42]||(t[42]=[Oe('<div class="drop-overlay-box" data-v-e08cfc9d><svg class="drop-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" data-v-e08cfc9d><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" data-v-e08cfc9d></path><polyline points="17 8 12 3 7 8" data-v-e08cfc9d></polyline><line x1="12" y1="3" x2="12" y2="15" data-v-e08cfc9d></line></svg><p data-v-e08cfc9d>释放图片文件以导入此表情包</p></div>',1)])],544),[[z,F.value]]),r(" Links Import area "),C(e("div",Bt,[t[45]||(t[45]=e("div",{class:"callout-icon"},"🔗",-1)),e("div",At,[t[43]||(t[43]=e("div",{class:"callout-title"},"批量导入外链",-1)),t[44]||(t[44]=e("div",{class:"callout-desc"},"每行输入一个以 http:// 或 https:// 开头的网络图片链接",-1)),C(e("textarea",{"onUpdate:modelValue":t[10]||(t[10]=s=>W.value=s),rows:"4",class:"flat-textarea w-full mt-2",placeholder:"每行一个以 http:// 或 https:// 开头的链接"},null,512),[[U,W.value]]),e("div",Dt,[e("button",{onClick:Ee,class:"btn btn-primary btn-small"},"确认导入"),e("button",{onClick:t[11]||(t[11]=s=>R.value=false),class:"btn btn-secondary btn-small"},"取消")])])],512),[[z,R.value]]),r(" Notion database view tabs switcher "),e("div",Nt,[e("button",{onClick:t[12]||(t[12]=s=>B.value="local"),class:T(["gallery-tab-btn",B.value==="local"?"active":""])}," 📁 本地存储图片 ("+d(_.images.length)+") ",3),e("button",{onClick:t[13]||(t[13]=s=>B.value="external"),class:T(["gallery-tab-btn",B.value==="external"?"active":""])}," 🔗 外部链接直链 ("+d(_.links.length)+") ",3)]),r(" Tab Content 1: Local Images Gallery "),C(e("div",Ut,[_.images.length?(l(),a("div",Wt,[e("div",Rt,[(l(true),a(k,null,O(pe.value,s=>(l(),a("div",{key:s,class:T(["notion-gallery-card",{"notion-gallery-card-active-dropdown":A.value===s}])},[e("div",{class:"gallery-img-container",onClick:o=>Te(oe(c.value.name,s)),style:{cursor:"pointer"},title:"在新标签页中打开原图"},[e("img",{src:oe(c.value.name,s),class:"gallery-img",loading:"lazy"},null,8,St)],8,Ft),r(" Hover overlay on card (actions) "),e("div",Ot,[e("div",Ht,[e("div",{class:"card-action-btn move move-dropdown-container",onClick:P(o=>ve(s),["stop"])},[t[46]||(t[46]=e("span",null,"修改",-1)),C(e("div",jt,[(l(true),a(k,null,O(L.value,o=>(l(),a(k,null,[o.name!==c.value.name?(l(),a("button",{key:o.name,onClick:P(b=>Me(c.value.name,o.name,s),["stop"]),class:"dropdown-item"},d(o.name),9,Zt)):r("v-if",true)],64))),256))],512),[[z,A.value===s]])],8,zt),e("button",{onClick:P(o=>Le(c.value.name,s),["stop"]),class:"card-action-btn danger"}," 删除 ",8,Gt)])])],2))),128))]),r(" Pagination bar "),D.value>1?(l(),a("div",Kt,[e("button",{disabled:$.value===1,onClick:t[14]||(t[14]=s=>$.value--),class:"btn btn-secondary page-btn"}," 上一页 ",8,Qt),e("span",qt,[t[47]||(t[47]=H("第 ",-1)),e("b",null,d($.value),1),H(" / "+d(D.value)+" 页",1)]),e("button",{disabled:$.value===D.value,onClick:t[15]||(t[15]=s=>$.value++),class:"btn btn-secondary page-btn"}," 下一页 ",8,Jt)])):r("v-if",true)])):(l(),a("div",Vt," 表情包内尚无任何本地图片资源 "))],512),[[z,B.value==="local"]]),r(" Tab Content 2: External Links List "),C(e("div",Yt,[_.links.length?(l(),a("div",en,[(l(true),a(k,null,O(_.links,s=>(l(),a("div",{key:s,class:"link-item-row"},[e("div",tn,[t[48]||(t[48]=e("span",{class:"bullet"},"•",-1)),e("span",{class:"link-url-text truncate",onClick:o=>S(s)},d(s),9,nn)]),e("div",sn,[e("button",{onClick:o=>S(s),class:"icon-btn hover-bg",title:"复制直链链接"},[...t[49]||(t[49]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("rect",{x:"9",y:"9",width:"13",height:"13",rx:"2",ry:"2"}),e("path",{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"})],-1)])],8,on),e("button",{onClick:o=>Ie(c.value.name,s),class:"icon-btn hover-danger",title:"删除该外链"},[...t[50]||(t[50]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("polyline",{points:"3 6 5 6 21 6"}),e("path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"})],-1)])],8,ln)])]))),128))])):(l(),a("div",Xt," 表情包内尚未配置任何外部直链图片 "))],512),[[z,B.value==="external"]])],32)],2112)):(l(),a("div",it,[r(" Creator bar in Notion Style "),e("div",rt,[t[30]||(t[30]=e("h2",{class:"notion-db-title"},"📦 表情包仓库",-1)),e("div",ct,[C(e("input",{"onUpdate:modelValue":t[3]||(t[3]=s=>Z.value=s),class:"flat-input collection-name-input-notion",placeholder:"输入名称并回车创建...",onKeyup:ue(le,["enter"])},null,544),[[U,Z.value]]),e("button",{onClick:le,class:"btn btn-primary btn-notion"}," + 新建表情包 ")])]),t[34]||(t[34]=e("hr",{class:"notion-hr"},null,-1)),r(" Folders grid layout "),L.value.length?(l(),a("div",dt,[(l(true),a(k,null,O(L.value,s=>(l(),a("div",{key:s.name,class:"folder-card",onClick:o=>be(s)},[t[33]||(t[33]=e("div",{class:"folder-header"},[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("path",{d:"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"})])],-1)),e("div",pt,[e("div",null,[e("div",mt,d(s.name),1),e("div",{class:"folder-desc",title:s.description},d(s.description||"暂无描述信息"),9,ft)]),e("div",yt,[e("span",ht,"本地: "+d(s.localCount)+" · 外链: "+d(s.linkCount),1),t[32]||(t[32]=e("span",{class:"folder-manage-link"},[H(" 管理 "),e("svg",{class:"chevron-right",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2.5"},[e("polyline",{points:"9 18 15 12 9 6"})])],-1))])])],8,vt))),128))])):(l(),a("div",ut,[...t[31]||(t[31]=[e("div",{class:"empty-icon"},"📁",-1),e("h3",null,"尚未创建任何表情包",-1),e("p",null,"在右侧输入表情包名称即可快速创建一个新的表情包。",-1)])]))]))])):h.value==="distribution"?(l(),a(k,{key:1},[r(" MENU VIEW 2: DISTRIBUTION (🌐) "),e("div",an,[t[61]||(t[61]=e("div",{class:"notion-title-row"},[e("h1",{class:"notion-main-title"},"🌐 接口分发与路由管理")],-1)),t[62]||(t[62]=e("p",{class:"section-desc"},"通过配置以下分发 API 端点,可以用统一的本地路由分发或代理外部直链。",-1)),t[63]||(t[63]=e("hr",{class:"notion-hr"},null,-1)),e("div",rn,[r(" Endpoint Editor Form Panel "),e("div",cn,[e("h2",un,d(x.value?"📝 编辑分发端点":"➕ 创建新分发端点"),1),e("div",dn,[e("div",vn,[t[51]||(t[51]=e("label",null,"端点名称 *",-1)),C(e("input",{"onUpdate:modelValue":t[17]||(t[17]=s=>v.name=s),disabled:!!x.value,class:"flat-input",placeholder:"例如: moe"},null,8,pn),[[U,v.name]]),t[52]||(t[52]=e("span",{class:"field-hint"},"只能包含字母、数字、下划线和连字符",-1))]),e("div",mn,[t[53]||(t[53]=e("label",null,"描述",-1)),C(e("input",{"onUpdate:modelValue":t[18]||(t[18]=s=>v.description=s),class:"flat-input",placeholder:"例如: 萌版横图"},null,512),[[U,v.description]])]),e("div",fn,[t[54]||(t[54]=e("label",null,"目标 URL *",-1)),C(e("input",{"onUpdate:modelValue":t[19]||(t[19]=s=>v.url=s),class:"flat-input",placeholder:"https://example.com/api"},null,512),[[U,v.url]])]),e("div",yn,[e("button",{onClick:ye,class:"btn btn-primary flex-grow"},d(x.value?"保存修改":"立即创建"),1),e("button",{onClick:ee,class:"btn btn-secondary"}," 取消 ")])])]),r(" Endpoints Table List "),e("div",hn,[e("div",gn,[e("table",bn,[t[60]||(t[60]=e("thead",null,[e("tr",null,[e("th",{style:{width:"20%"}},"名称"),e("th",{style:{width:"25%"}},"描述"),e("th",{style:{width:"40%"}},"访问路径 & 转发目标"),e("th",{style:{width:"15%","text-align":"right"}},"管理")])],-1)),e("tbody",null,[j.value.length?r("v-if",true):(l(),a("tr",wn,[...t[55]||(t[55]=[e("td",{colspan:"4",class:"empty-cell"},"尚未配置任何转发 API 端点",-1)])])),(l(true),a(k,null,O(j.value,s=>(l(),a("tr",{key:s.name},[e("td",null,[e("div",kn,d(s.name),1)]),e("td",{class:"cell-desc",title:s.description},d(s.description||"-"),9,Cn),e("td",_n,[e("div",xn,[e("span",{class:"link-text",onClick:o=>S(N(s.name))}," /"+d(s.name),9,$n),e("button",{onClick:o=>S(N(s.name)),class:"icon-btn-inline",title:"复制完整链接"},[...t[56]||(t[56]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("rect",{x:"9",y:"9",width:"13",height:"13",rx:"2",ry:"2"}),e("path",{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"})],-1)])],8,En)]),e("div",{class:"target-url truncate",title:s.url}," → "+d(s.url),9,In)]),e("td",Ln,[e("div",Mn,[e("a",{href:N(s.name),target:"_blank",class:"icon-btn hover-bg",title:"测试该端点访问"},[...t[57]||(t[57]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"}),e("polyline",{points:"15 3 21 3 21 9"}),e("line",{x1:"10",y1:"14",x2:"21",y2:"3"})],-1)])],8,Tn),e("button",{onClick:o=>fe(s),class:"icon-btn hover-bg",title:"编辑参数"},[...t[58]||(t[58]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("path",{d:"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"}),e("path",{d:"M18.5 2.5a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4 9.5-9.5z"})],-1)])],8,Pn),e("button",{onClick:o=>he(s.name),class:"icon-btn hover-danger",title:"彻底删除"},[...t[59]||(t[59]=[e("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("polyline",{points:"3 6 5 6 21 6"}),e("path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"})],-1)])],8,Bn)])])]))),128))])])])])])])],2112)):h.value==="settings"?(l(),a(k,{key:2},[r(" MENU VIEW 3: PREVIEW (👁️ 预览) "),e("div",An,[e("div",Dn,[r(" Centered: Interactive AI Prompt Variables Preview "),e("div",Nn,[t[66]||(t[66]=e("div",{class:"notion-title-row"},[e("h1",{class:"notion-main-title"},"✨ ChatLuna AI 变量注入预览")],-1)),t[67]||(t[67]=e("p",{class:"section-desc"},"当配置为注入变量时,系统会将当前的表情仓库自动以 Notion 图库的规格变量形式拼接,以下是注入 AI 提示词上下文的真实呈现。",-1)),t[68]||(t[68]=e("hr",{class:"notion-hr"},null,-1)),e("div",Un,[t[64]||(t[64]=e("div",{class:"preview-sub-title"},"注入变量:{endpoint} (格式化后的可用图床表情包)",-1)),e("div",Vn,[Q.value?(l(),a("pre",Wn,d(Q.value),1)):(l(),a("pre",Rn,"- 暂无可用表情包及路由,请前往表情包管理或分发管理中创建 -"))]),t[65]||(t[65]=e("div",{class:"preview-sub-title mt-4"},"最终组合注入:{memesluna} (发送给 LLM 提示词全貌)",-1)),e("div",Fn,[q.value?(l(),a("pre",Sn,d(q.value),1)):(l(),a("pre",On,"- 正在获取最终提示词预览... -"))])])])])])],2112)):r("v-if",true)])],2112))])]))}}),zn=(V,h)=>{const u=V.__vccOpts||V;for(const[m,f]of h)u[m]=f;return u},jn=zn(Hn,[["__scopeId","data-v-e08cfc9d"]]),Zn="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",Gn={name:"MemesLunaIcon",render(){return de("svg",{class:"k-icon",viewBox:"0 0 1024 1024",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},[de("path",{fill:"currentColor",d:Zn})])}};De.register("MemesLunaEmoji",Gn);const qn=V=>{V.page({name:"MemesLuna",path:"/memesluna",icon:"MemesLunaEmoji",component:jn,authority:1,order:500})};export{qn as default};
package/dist/style.css ADDED
@@ -0,0 +1 @@
1
+ .memesluna-app-layout[data-v-e08cfc9d]{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}.notion-content[data-v-e08cfc9d]{padding:24px 32px;box-sizing:border-box;max-width:1200px;margin:0 auto}.content-breadcrumb-header[data-v-e08cfc9d]{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-e08cfc9d]{display:flex;align-items:center;gap:8px;font-size:.82rem;color:var(--k-text-muted, rgba(55, 53, 47, .5))}.crumb-root[data-v-e08cfc9d]{font-weight:500}.crumb-parent[data-v-e08cfc9d]{color:var(--k-text-normal, #37352f);font-weight:500}.crumb-child.active[data-v-e08cfc9d]{color:var(--k-color-primary, #2383e2);font-weight:600}.crumb-separator[data-v-e08cfc9d]{color:var(--k-color-border, rgba(55, 53, 47, .25))}.header-quick-stats[data-v-e08cfc9d]{display:flex;gap:8px}.stat-bubble[data-v-e08cfc9d]{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-e08cfc9d]{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-e08cfc9d]{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-e08cfc9d]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .04));color:var(--k-text-normal, #37352f)}.switcher-btn.active[data-v-e08cfc9d]{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-e08cfc9d]{font-size:.95rem}.notion-db-header[data-v-e08cfc9d]{display:flex;justify-content:space-between;align-items:center;margin-top:12px;margin-bottom:12px}.notion-db-title[data-v-e08cfc9d]{font-size:1.2rem;font-weight:600;margin:0;color:var(--k-text-normal, #37352f)}.notion-db-actions[data-v-e08cfc9d]{display:flex;align-items:center;gap:8px}.collection-name-input-notion[data-v-e08cfc9d]{width:200px;height:28px;font-size:.78rem}.btn-notion[data-v-e08cfc9d]{height:28px;padding:0 10px;font-size:.78rem}.notion-hr[data-v-e08cfc9d]{border:none;border-top:1px solid var(--k-color-border, rgba(55, 53, 47, .09));margin:8px 0 20px}.folders-grid[data-v-e08cfc9d]{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:16px}.folder-card[data-v-e08cfc9d]{background:var(--k-bg-card, #ffffff);border:1px solid var(--k-color-border, rgba(55, 53, 47, .09));border-radius:6px;overflow:hidden;cursor:pointer;transition:border-color .15s ease,background-color .15s ease;display:flex;flex-direction:column}.folder-card[data-v-e08cfc9d]:hover{border-color:var(--k-color-primary, #2383e2);background-color:var(--k-bg-button-hover, #fbfbfa)}.folder-header[data-v-e08cfc9d]{height:80px;background-color:var(--k-bg-panel, #f7f7f5);border-bottom:1px solid var(--k-color-border, rgba(55, 53, 47, .06));display:flex;align-items:center;justify-content:center;color:var(--k-text-muted, rgba(55, 53, 47, .4))}.folder-card:hover .folder-header[data-v-e08cfc9d]{color:var(--k-text-muted, rgba(55, 53, 47, .55));background-color:var(--k-bg-button-hover, #f1f1ef)}.folder-header svg[data-v-e08cfc9d]{width:28px;height:28px}.folder-body[data-v-e08cfc9d]{padding:12px 14px;flex:1;display:flex;flex-direction:column;justify-content:space-between;box-sizing:border-box}.folder-name[data-v-e08cfc9d]{font-size:.85rem;font-weight:600;color:var(--k-text-normal, #37352f);margin-bottom:4px}.folder-desc[data-v-e08cfc9d]{font-size:.75rem;color:var(--k-text-muted, rgba(55, 53, 47, .55));line-height:1.4;height:34px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.folder-footer[data-v-e08cfc9d]{display:flex;justify-content:space-between;align-items:center;margin-top:10px;padding-top:8px;border-top:1px solid var(--k-color-border, rgba(55, 53, 47, .06))}.folder-meta[data-v-e08cfc9d]{font-size:.68rem;color:var(--k-text-muted, rgba(55, 53, 47, .45));font-weight:500}.folder-manage-link[data-v-e08cfc9d]{font-size:.72rem;color:var(--k-color-primary, #2383e2);font-weight:500;display:flex;align-items:center;gap:2px}.folder-card:hover .folder-manage-link[data-v-e08cfc9d]{text-decoration:underline}.chevron-right[data-v-e08cfc9d]{width:8px;height:8px}.notion-page-header[data-v-e08cfc9d]{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;margin-top:12px;margin-bottom:16px}.notion-page-header-left[data-v-e08cfc9d]{display:flex;align-items:flex-start;gap:16px}.notion-page-header-right[data-v-e08cfc9d]{display:flex;align-items:center;align-self:flex-end;margin-bottom:2px}.notion-page-icon[data-v-e08cfc9d]{font-size:2.2rem;-webkit-user-select:none;user-select:none}.notion-page-title-wrapper[data-v-e08cfc9d]{display:flex;flex-direction:column;gap:6px}.notion-page-title[data-v-e08cfc9d]{font-size:1.6rem;font-weight:700;margin:0;color:var(--k-text-normal, #37352f)}.notion-page-meta[data-v-e08cfc9d]{font-size:.78rem;color:var(--k-text-muted, rgba(55, 53, 47, .55));display:flex;align-items:center;gap:8px;flex-wrap:wrap}.code-url[data-v-e08cfc9d]{background-color:var(--k-bg-panel, rgba(135, 131, 120, .15));padding:2px 6px;border-radius:3px;font-family:SFMono-Regular,Consolas,monospace;font-size:.75rem;color:#eb5757;cursor:pointer;transition:background .1s ease}.code-url[data-v-e08cfc9d]:hover{background-color:var(--k-bg-button-hover, rgba(135, 131, 120, .25))}.btn-test-link[data-v-e08cfc9d]{font-size:.72rem;font-weight:600;background-color:var(--k-bg-card, #ffffff);border:1px solid var(--k-color-border, rgba(55, 53, 47, .15));border-radius:4px;padding:1px 6px;color:var(--k-text-normal, #37352f);text-decoration:none;display:inline-flex;align-items:center}.btn-test-link[data-v-e08cfc9d]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .04))}.notion-page-toolbar[data-v-e08cfc9d]{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-e08cfc9d]{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-e08cfc9d]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .04));color:var(--k-text-normal, #37352f)}.toolbar-btn.danger[data-v-e08cfc9d]{color:#eb5757}.toolbar-btn.danger[data-v-e08cfc9d]:hover{background-color:#eb575714}.toolbar-divider[data-v-e08cfc9d]{width:1px;height:14px;background-color:var(--k-color-border, rgba(55, 53, 47, .12))}.notion-properties-panel[data-v-e08cfc9d]{margin-bottom:20px;display:flex;flex-direction:column;gap:6px}.property-row[data-v-e08cfc9d]{display:flex;align-items:center;font-size:.82rem}.property-label[data-v-e08cfc9d]{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-e08cfc9d]{font-size:.95rem}.property-value[data-v-e08cfc9d]{flex:1}.property-input-text[data-v-e08cfc9d]{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-e08cfc9d]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .03))}.property-input-text[data-v-e08cfc9d]: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-e08cfc9d]{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-e08cfc9d]{font-size:1.15rem;-webkit-user-select:none;user-select:none}.callout-content[data-v-e08cfc9d]{flex:1;min-width:0}.callout-title[data-v-e08cfc9d]{font-weight:600;font-size:.85rem;color:var(--k-text-normal, #37352f);margin-bottom:2px}.callout-desc[data-v-e08cfc9d]{font-size:.75rem;color:var(--k-text-muted, rgba(55, 53, 47, .5));margin-bottom:10px;line-height:1.4}.callout-actions[data-v-e08cfc9d]{display:flex;gap:8px}.btn-small[data-v-e08cfc9d]{font-size:.75rem;padding:2px 10px;height:24px}.hidden-file-input[data-v-e08cfc9d]{display:none}.sidebar-drop-zone-overlay[data-v-e08cfc9d]{position:fixed;top:0;left:0;width:100%;height:100%;z-index:9999;background-color:#ffffffd9;display:flex;align-items:center;justify-content:center;padding:40px;box-sizing:border-box}.drop-overlay-box[data-v-e08cfc9d]{border:2px dashed var(--k-color-primary, #2383e2);background-color:#2383e20a;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-e08cfc9d]{width:48px;height:48px;margin-bottom:16px}.gallery-view-switcher[data-v-e08cfc9d]{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-e08cfc9d]{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-e08cfc9d]:hover{color:var(--k-text-normal, #37352f)}.gallery-tab-btn.active[data-v-e08cfc9d]{color:var(--k-text-normal, #37352f);border-bottom-color:var(--k-text-normal, #37352f)}.gallery-tab-content[data-v-e08cfc9d]{margin-top:16px}.notion-gallery-grid[data-v-e08cfc9d]{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:12px}.notion-gallery-card[data-v-e08cfc9d]{background:var(--k-bg-card, #ffffff);border:1px solid var(--k-color-border, rgba(55, 53, 47, .08));border-radius:4px;position:relative;aspect-ratio:1;transition:border-color .12s ease;box-shadow:none}.notion-gallery-card[data-v-e08cfc9d]:hover{border-color:var(--k-color-primary, #2383e2)}.gallery-img-container[data-v-e08cfc9d]{width:100%;height:100%;background-color:var(--k-bg-panel, #f7f7f5);display:flex;align-items:center;justify-content:center;overflow:hidden;border-radius:4px}.gallery-img[data-v-e08cfc9d]{width:100%;height:100%;object-fit:cover}.gallery-card-overlay[data-v-e08cfc9d]{position:absolute;top:0;left:0;right:0;bottom:0;background:linear-gradient(to bottom,#00000038,#0000 35%,#0000);border-radius:4px;opacity:0;transition:opacity .15s ease;pointer-events:none;z-index:10}.notion-gallery-card:hover .gallery-card-overlay[data-v-e08cfc9d],.notion-gallery-card-active-dropdown .gallery-card-overlay[data-v-e08cfc9d]{opacity:1}.overlay-actions[data-v-e08cfc9d]{position:absolute;top:8px;right:8px;display:flex;gap:6px;pointer-events:auto}.overlay-actions .card-action-btn[data-v-e08cfc9d]{border:none;background-color:#ffffffeb;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);color:var(--k-text-normal, #37352f);font-size:.65rem;padding:3px 8px;border-radius:4px;cursor:pointer;font-weight:500;box-shadow:0 1px 3px #0000001f;transition:all .1s ease;display:flex;align-items:center;justify-content:center}.overlay-actions .card-action-btn.move[data-v-e08cfc9d]:hover{background:#2b8a5c;color:#fff}.overlay-actions .card-action-btn.danger[data-v-e08cfc9d]{color:#eb5757}.overlay-actions .card-action-btn.danger[data-v-e08cfc9d]:hover{background:#eb5757;color:#fff}.flat-input[data-v-e08cfc9d],.flat-select[data-v-e08cfc9d],.flat-textarea[data-v-e08cfc9d]{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-e08cfc9d]:focus,.flat-select[data-v-e08cfc9d]:focus,.flat-textarea[data-v-e08cfc9d]:focus{border-color:var(--k-color-primary, #2383e2);background:var(--k-bg-card, #ffffff);box-shadow:0 0 0 2px #2383e226}.flat-input[data-v-e08cfc9d]: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-e08cfc9d]{font-size:.7rem;color:var(--k-text-muted, rgba(55, 53, 47, .45));margin-top:4px;display:block}.btn[data-v-e08cfc9d]{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-e08cfc9d]{background-color:var(--k-color-primary, #2383e2);color:#fff}.btn-primary[data-v-e08cfc9d]:hover{background-color:#1a6cb8}.btn-secondary[data-v-e08cfc9d]{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-e08cfc9d]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .04))}.btn-danger[data-v-e08cfc9d]{background-color:#eb5757;color:#fff}.btn-danger[data-v-e08cfc9d]:hover{background-color:#d44c4c}.w-full[data-v-e08cfc9d]{width:100%}.mt-2[data-v-e08cfc9d]{margin-top:8px}.mt-3[data-v-e08cfc9d]{margin-top:12px}.mt-4[data-v-e08cfc9d]{margin-top:16px}.empty-placeholder-card[data-v-e08cfc9d]{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-e08cfc9d]{font-size:2.5rem;margin-bottom:12px}.empty-placeholder-card h3[data-v-e08cfc9d]{font-size:.95rem;margin:0 0 6px;font-weight:600}.empty-placeholder-card p[data-v-e08cfc9d]{font-size:.78rem;color:var(--k-text-muted, rgba(55, 53, 47, .5));margin:0}.empty-gallery[data-v-e08cfc9d]{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-e08cfc9d]{position:relative}.move-dropdown-menu[data-v-e08cfc9d]{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;box-shadow:0 4px 12px #0f0f0f26;z-index:100;min-width:120px;width:max-content;box-sizing:border-box}.dropdown-item[data-v-e08cfc9d]{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-e08cfc9d]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .04))}.pagination-container[data-v-e08cfc9d]{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-e08cfc9d]{font-size:.78rem;color:var(--k-text-muted, rgba(55, 53, 47, .6))}.page-btn[data-v-e08cfc9d]{height:28px;padding:0 10px;font-size:.75rem}.links-list-container[data-v-e08cfc9d]{border:1px solid var(--k-color-border, rgba(55, 53, 47, .09));border-radius:6px;overflow:hidden}.link-item-row[data-v-e08cfc9d]{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-e08cfc9d]:last-child{border-bottom:none}.link-item-row[data-v-e08cfc9d]:hover{background-color:var(--k-bg-button-hover, rgba(55, 53, 47, .015))}.link-url-wrapper[data-v-e08cfc9d]{display:flex;align-items:center;gap:8px;flex:1;min-width:0;margin-right:16px}.bullet[data-v-e08cfc9d]{color:var(--k-text-muted, rgba(55, 53, 47, .35));font-weight:700}.link-url-text[data-v-e08cfc9d]{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-e08cfc9d]:hover{color:var(--k-color-primary, #2383e2);text-decoration:underline}.link-actions[data-v-e08cfc9d]{display:flex;gap:6px}.dashboard-grid[data-v-e08cfc9d]{display:grid;grid-template-columns:1fr;gap:24px}@media (min-width: 960px){.dashboard-grid[data-v-e08cfc9d]{grid-template-columns:300px 1fr}}.notion-form-panel[data-v-e08cfc9d]{padding:12px 0}.notion-panel-title[data-v-e08cfc9d]{font-size:1rem;font-weight:600;margin-top:0;margin-bottom:16px;color:var(--k-text-normal, #37352f)}.form-fields[data-v-e08cfc9d]{display:flex;flex-direction:column;gap:12px}.form-group[data-v-e08cfc9d]{display:flex;flex-direction:column}.form-group label[data-v-e08cfc9d]{font-size:.75rem;font-weight:600;color:var(--k-text-muted, rgba(55, 53, 47, .65));margin-bottom:4px}.form-row[data-v-e08cfc9d]{display:flex;gap:10px}.form-actions[data-v-e08cfc9d]{display:flex;gap:8px;margin-top:8px}.notion-table-panel[data-v-e08cfc9d]{padding:12px 0}.table-container[data-v-e08cfc9d]{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-e08cfc9d]{width:100%;border-collapse:collapse;font-size:.78rem}.flat-table th[data-v-e08cfc9d]{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-e08cfc9d]{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-e08cfc9d]{border-bottom:none}.empty-cell[data-v-e08cfc9d]{text-align:center;padding:40px!important;color:var(--k-text-muted, rgba(55, 53, 47, .35))}.endpoint-name[data-v-e08cfc9d]{font-weight:600}.group-badge[data-v-e08cfc9d]{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-e08cfc9d]{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-e08cfc9d]{font-size:.65rem;font-weight:600;padding:1px 5px;border-radius:3px;text-transform:uppercase;margin-right:6px}.method-tag.redirect[data-v-e08cfc9d]{background-color:#2383e21a;color:#2383e2}.method-tag.proxy[data-v-e08cfc9d]{background-color:#2b8a5c1a;color:#2b8a5c}.link-text[data-v-e08cfc9d]{font-weight:500;color:var(--k-color-primary, #2383e2);cursor:pointer}.link-text[data-v-e08cfc9d]:hover{text-decoration:underline}.target-url[data-v-e08cfc9d]{font-size:.72rem;color:var(--k-text-muted, rgba(55, 53, 47, .4));max-width:300px;margin-top:2px}.action-buttons[data-v-e08cfc9d]{display:flex;justify-content:flex-end;gap:4px}.icon-btn[data-v-e08cfc9d]{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-e08cfc9d]{width:12px;height:12px}.icon-btn.hover-bg[data-v-e08cfc9d]: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-e08cfc9d]:hover{background-color:#eb57570d;border-color:#eb575740;color:#eb5757}.icon-btn-inline[data-v-e08cfc9d]{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-e08cfc9d]:hover{color:var(--k-color-primary, #2383e2)}.icon-btn-inline svg[data-v-e08cfc9d]{width:10px;height:10px}.settings-centered-layout[data-v-e08cfc9d]{display:flex;justify-content:center;padding:0 16px}.settings-centered-layout .settings-preview-panel[data-v-e08cfc9d]{width:100%;max-width:720px}.preview-prompt-container[data-v-e08cfc9d]{display:flex;flex-direction:column;gap:12px}.preview-sub-title[data-v-e08cfc9d]{font-size:.72rem;font-weight:600;color:var(--k-text-muted, rgba(55, 53, 47, .45));text-transform:uppercase}.preview-code-block[data-v-e08cfc9d]{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-e08cfc9d]{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-e08cfc9d]{max-height:250px;background-color:#2383e205;border-color:#2383e21f}.preview-code-block.final-prompt pre[data-v-e08cfc9d]{color:#1e3a8a}.text-gray-muted[data-v-e08cfc9d]{color:var(--k-text-muted, rgba(55, 53, 47, .35));font-style:italic}.toast-banner[data-v-e08cfc9d]{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:0 4px 16px #0f0f0f1a;color:var(--k-text-normal, #37352f)}.toast-banner.success[data-v-e08cfc9d]{background-color:#f2f9f5;border-color:#2b8a5c40;color:#2b8a5c}.toast-banner.error[data-v-e08cfc9d]{background-color:#fdf2f2;border-color:#eb575740;color:#eb5757}.toast-icon[data-v-e08cfc9d]{width:14px;height:14px;flex-shrink:0}.loading-container[data-v-e08cfc9d]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:80px 0}.spinner[data-v-e08cfc9d]{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-e08cfc9d .8s linear infinite;margin-bottom:12px}@keyframes spin-e08cfc9d{to{transform:rotate(360deg)}}.loading-container p[data-v-e08cfc9d]{font-size:.78rem;color:var(--k-text-muted, rgba(55, 53, 47, .5));margin:0}.fade-enter-active[data-v-e08cfc9d],.fade-leave-active[data-v-e08cfc9d]{transition:opacity .15s ease,transform .15s ease}.fade-enter-from[data-v-e08cfc9d],.fade-leave-to[data-v-e08cfc9d]{opacity:0;transform:translateY(-8px)}
package/lib/config.d.ts CHANGED
@@ -14,7 +14,7 @@ export type ForwardMethod = 'redirect' | 'proxy';
14
14
  export type UrlConstruction = 'normal' | 'special_forward' | 'special_pollinations' | 'special_draw_redirect';
15
15
  export interface Config {
16
16
  backendPath: string;
17
- storagePath: string;
17
+ storagePath?: string;
18
18
  selfUrl: string;
19
19
  injectVariables: boolean;
20
20
  variableRefreshIntervalMs: number;