hunian commited on
Commit
9ef8a08
·
1 Parent(s): 7083a6e

Refactor code structure for improved readability and maintainability

Browse files
dist/frontend/assets/{FileDropZone-CA8QmgeV.js → FileDropZone-Bnye6SLQ.js} RENAMED
@@ -1 +1 @@
1
- import{j as n}from"./query-BVy6DjHf.js";import{r as t}from"./vendor-BrxV5zWv.js";import{c as i}from"./index-BmzOyGUN.js";import{U as D}from"./ui-3Ja5Lmtv.js";function y({accept:m,multiple:c=!1,onFilesSelected:o,description:u,disabled:r=!1,className:g}){const[s,f]=t.useState(!1),l=t.useRef(null),h=t.useCallback(e=>{e.preventDefault(),r||f(!0)},[r]),x=t.useCallback(e=>{e.preventDefault(),f(!1)},[]),p=t.useCallback(e=>{if(e.preventDefault(),f(!1),r)return;const a=Array.from(e.dataTransfer.files);a.length>0&&o(c?a:[a[0]])},[r,c,o]),d=t.useCallback(()=>{var e;r||(e=l.current)==null||e.click()},[r]),v=t.useCallback(e=>{const a=Array.from(e.target.files||[]);a.length>0&&o(a),l.current&&(l.current.value="")},[o]);return n.jsxs("div",{className:i("relative border-2 border-dashed rounded-xl p-8 text-center cursor-pointer transition-all duration-200","bg-gradient-to-b from-teal-50/30 to-cyan-50/20",s&&"border-teal-400 bg-teal-50/50 scale-[1.02]",!s&&"border-teal-200/50 hover:border-teal-300/70 hover:bg-teal-50/40",r&&"opacity-50 cursor-not-allowed",g),onDragOver:h,onDragLeave:x,onDrop:p,onClick:d,children:[n.jsx("div",{className:i("mx-auto mb-4 h-12 w-12 rounded-xl flex items-center justify-center","bg-gradient-to-br from-teal-500 to-cyan-600","shadow-lg shadow-teal-500/20","transition-transform duration-200",s&&"scale-110"),children:n.jsx(D,{className:"h-6 w-6 text-white"})}),n.jsx("p",{className:i("text-sm font-medium mb-1 transition-colors",s?"text-teal-700":"text-gray-700"),children:s?"松开以上传文件":"点击或拖放文件到此处"}),u&&n.jsx("p",{className:"text-xs text-teal-600/60",children:u}),n.jsx("input",{ref:l,type:"file",accept:m,multiple:c,onChange:v,className:"hidden",disabled:r})]})}export{y as F};
 
1
+ import{j as n}from"./query-BVy6DjHf.js";import{r as t}from"./vendor-BrxV5zWv.js";import{c as i}from"./index-glrVO3jG.js";import{U as D}from"./ui-DGAKiEyf.js";function y({accept:m,multiple:c=!1,onFilesSelected:o,description:u,disabled:r=!1,className:g}){const[s,f]=t.useState(!1),l=t.useRef(null),h=t.useCallback(e=>{e.preventDefault(),r||f(!0)},[r]),x=t.useCallback(e=>{e.preventDefault(),f(!1)},[]),p=t.useCallback(e=>{if(e.preventDefault(),f(!1),r)return;const a=Array.from(e.dataTransfer.files);a.length>0&&o(c?a:[a[0]])},[r,c,o]),d=t.useCallback(()=>{var e;r||(e=l.current)==null||e.click()},[r]),v=t.useCallback(e=>{const a=Array.from(e.target.files||[]);a.length>0&&o(a),l.current&&(l.current.value="")},[o]);return n.jsxs("div",{className:i("relative border-2 border-dashed rounded-xl p-8 text-center cursor-pointer transition-all duration-200","bg-gradient-to-b from-teal-50/30 to-cyan-50/20",s&&"border-teal-400 bg-teal-50/50 scale-[1.02]",!s&&"border-teal-200/50 hover:border-teal-300/70 hover:bg-teal-50/40",r&&"opacity-50 cursor-not-allowed",g),onDragOver:h,onDragLeave:x,onDrop:p,onClick:d,children:[n.jsx("div",{className:i("mx-auto mb-4 h-12 w-12 rounded-xl flex items-center justify-center","bg-gradient-to-br from-teal-500 to-cyan-600","shadow-lg shadow-teal-500/20","transition-transform duration-200",s&&"scale-110"),children:n.jsx(D,{className:"h-6 w-6 text-white"})}),n.jsx("p",{className:i("text-sm font-medium mb-1 transition-colors",s?"text-teal-700":"text-gray-700"),children:s?"松开以上传文件":"点击或拖放文件到此处"}),u&&n.jsx("p",{className:"text-xs text-teal-600/60",children:u}),n.jsx("input",{ref:l,type:"file",accept:m,multiple:c,onChange:v,className:"hidden",disabled:r})]})}export{y as F};
dist/frontend/assets/{index-B_uzSks3.js → index-BVdyMB5y.js} RENAMED
@@ -1 +1 @@
1
- import{j as e}from"./query-BVy6DjHf.js";import{r as l}from"./vendor-BrxV5zWv.js";import{C as d,a as m,b as x,d as A,A as I,e as _,i as f,L as v,j as b,E as $,B as g}from"./index-BmzOyGUN.js";import{F as L}from"./FileDropZone-CA8QmgeV.js";import{F as z,a as B,A as M,s as C,x as P,D as U,T as O,I as V,V as H,M as R}from"./ui-3Ja5Lmtv.js";const p="/plugins/file_cache_plugin/api";function Q(){const[c,E]=l.useState([]),[h,N]=l.useState("temp"),[o,w]=l.useState(null),[F,y]=l.useState(!1),t=(s,a)=>{w({type:s,text:a}),setTimeout(()=>w(null),3e3)},n=l.useCallback(async()=>{try{const s=await fetch(`${p}/list`);if(!s.ok)throw new Error;const a=await s.json();E(a.files||[])}catch(s){console.error("Failed to load file list",s)}},[]);l.useEffect(()=>{n();const s=setInterval(n,3e4);return()=>clearInterval(s)},[n]);const T=async s=>{if(s.length===0)return;const a=s[0];y(!0),t("error","上传中...");const r=new FormData;r.append("file",a),r.append("file_type",h);try{const i=await fetch(`${p}/upload`,{method:"POST",body:r});if(!i.ok){const u=await i.json();throw new Error(u.detail)}t("success","上传成功"),n()}catch(i){const u=i instanceof Error?i.message:"上传失败";t("error",u)}y(!1)},k=async s=>{const a=`${window.location.origin}${p}/file/${s}`;try{await navigator.clipboard.writeText(a),t("success","已复制")}catch{t("error","复制失败")}},D=async s=>{if(window.confirm("确定要删除此文件吗?"))try{if(!(await fetch(`${p}/file/${s}`,{method:"DELETE"})).ok)throw new Error;t("success","文件已删除"),n()}catch{t("error","删除失败")}},S=s=>{var r;const a=((r=s.split(".").pop())==null?void 0:r.toLowerCase())||"";return["jpg","jpeg","png","gif","bmp","webp"].includes(a)?e.jsx(V,{className:"h-4 w-4"}):["mp4","avi","mov","mkv","flv","wmv","webm"].includes(a)?e.jsx(H,{className:"h-4 w-4"}):["mp3","wav","aac","flac","ogg","m4a"].includes(a)?e.jsx(R,{className:"h-4 w-4"}):e.jsx(C,{className:"h-4 w-4"})},j={total:c.length,temp:c.filter(s=>s.type==="temp").length,permanent:c.filter(s=>s.type==="permanent").length};return e.jsxs("div",{className:"space-y-6",children:[e.jsx(d,{children:e.jsxs(m,{children:[e.jsxs(x,{className:"flex items-center gap-2",children:[e.jsx(z,{className:"h-5 w-5"}),"文件缓存管理"]}),e.jsx(A,{children:"上传和管理你的文件,支持图片、视频、音频、文档"})]})}),o&&e.jsxs(I,{variant:o.type==="error"?"destructive":"default",children:[o.type==="success"?e.jsx(B,{className:"h-4 w-4"}):e.jsx(M,{className:"h-4 w-4"}),e.jsx(_,{children:o.text})]}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-6",children:[e.jsxs("div",{className:"lg:col-span-2 space-y-6",children:[e.jsxs(d,{children:[e.jsx(m,{className:"pb-3",children:e.jsx(x,{className:"text-base",children:"上传文件"})}),e.jsxs(f,{className:"space-y-4",children:[e.jsx(L,{accept:"image/*,video/*,audio/*,.md,.txt,.pdf,.doc,.docx",multiple:!1,onFilesSelected:T,description:"支持图片、视频、音频、文档文件",disabled:F}),e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs(v,{className:"flex items-center gap-2 cursor-pointer",children:[e.jsx("input",{type:"radio",name:"fileType",checked:h==="temp",onChange:()=>N("temp"),className:"h-4 w-4"}),e.jsx("span",{className:"text-sm",children:"临时文件"}),e.jsx(b,{variant:"secondary",className:"text-xs",children:"8小时后删除"})]}),e.jsxs(v,{className:"flex items-center gap-2 cursor-pointer",children:[e.jsx("input",{type:"radio",name:"fileType",checked:h==="permanent",onChange:()=>N("permanent"),className:"h-4 w-4"}),e.jsx("span",{className:"text-sm",children:"永久文件"})]})]})]})]}),e.jsxs(d,{children:[e.jsx(m,{className:"pb-3",children:e.jsx(x,{className:"text-base",children:"文件列表"})}),e.jsx(f,{children:c.length===0?e.jsx($,{icon:e.jsx(C,{className:"h-8 w-8"}),title:"暂无文件",description:"上传文件后,它们将显示在这里"}):e.jsx("div",{className:"space-y-3",children:c.map(s=>e.jsxs("div",{className:"flex items-center justify-between p-3 bg-muted/30 rounded-lg",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"h-8 w-8 rounded-lg bg-muted flex items-center justify-center",children:S(s.name)}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"font-medium text-sm truncate",title:s.name,children:s.name}),e.jsx("p",{className:"text-xs text-muted-foreground",children:new Date(s.created).toLocaleString("zh-CN")})]}),e.jsx(b,{variant:s.type==="temp"?"secondary":"default",children:s.type==="temp"?"临时":"永久"})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(g,{variant:"outline",size:"sm",onClick:()=>k(s.file_id),children:[e.jsx(P,{className:"h-3 w-3 mr-1"}),"复制"]}),e.jsx(g,{variant:"outline",size:"sm",asChild:!0,children:e.jsx("a",{href:s.url,download:!0,children:e.jsx(U,{className:"h-3 w-3"})})}),e.jsx(g,{variant:"ghost",size:"sm",onClick:()=>D(s.file_id),children:e.jsx(O,{className:"h-3 w-3"})})]})]},s.file_id))})})]})]}),e.jsx("div",{className:"space-y-4",children:e.jsxs(d,{children:[e.jsx(m,{className:"pb-3",children:e.jsx(x,{className:"text-base",children:"统计概览"})}),e.jsxs(f,{className:"space-y-4",children:[e.jsxs("div",{className:"p-3 bg-muted/30 rounded-lg",children:[e.jsx("p",{className:"text-xs text-muted-foreground mb-1",children:"总文件数"}),e.jsx("p",{className:"text-2xl font-semibold",children:j.total})]}),e.jsxs("div",{className:"p-3 bg-muted/30 rounded-lg",children:[e.jsx("p",{className:"text-xs text-muted-foreground mb-1",children:"临时文件"}),e.jsx("p",{className:"text-xl font-semibold",children:j.temp})]}),e.jsxs("div",{className:"p-3 bg-muted/30 rounded-lg",children:[e.jsx("p",{className:"text-xs text-muted-foreground mb-1",children:"永久文件"}),e.jsx("p",{className:"text-xl font-semibold",children:j.permanent})]})]})]})})]})]})}export{Q as default};
 
1
+ import{j as e}from"./query-BVy6DjHf.js";import{r as l}from"./vendor-BrxV5zWv.js";import{C as d,a as m,b as x,d as A,A as I,e as _,i as f,L as v,j as b,E as $,B as g}from"./index-glrVO3jG.js";import{F as L}from"./FileDropZone-Bnye6SLQ.js";import{F as z,b as B,A as M,u as C,y as P,D as U,T as O,I as V,V as H,s as R}from"./ui-DGAKiEyf.js";const p="/plugins/file_cache_plugin/api";function Q(){const[c,E]=l.useState([]),[h,N]=l.useState("temp"),[o,w]=l.useState(null),[F,y]=l.useState(!1),t=(s,a)=>{w({type:s,text:a}),setTimeout(()=>w(null),3e3)},n=l.useCallback(async()=>{try{const s=await fetch(`${p}/list`);if(!s.ok)throw new Error;const a=await s.json();E(a.files||[])}catch(s){console.error("Failed to load file list",s)}},[]);l.useEffect(()=>{n();const s=setInterval(n,3e4);return()=>clearInterval(s)},[n]);const T=async s=>{if(s.length===0)return;const a=s[0];y(!0),t("error","上传中...");const r=new FormData;r.append("file",a),r.append("file_type",h);try{const i=await fetch(`${p}/upload`,{method:"POST",body:r});if(!i.ok){const u=await i.json();throw new Error(u.detail)}t("success","上传成功"),n()}catch(i){const u=i instanceof Error?i.message:"上传失败";t("error",u)}y(!1)},k=async s=>{const a=`${window.location.origin}${p}/file/${s}`;try{await navigator.clipboard.writeText(a),t("success","已复制")}catch{t("error","复制失败")}},D=async s=>{if(window.confirm("确定要删除此文件吗?"))try{if(!(await fetch(`${p}/file/${s}`,{method:"DELETE"})).ok)throw new Error;t("success","文件已删除"),n()}catch{t("error","删除失败")}},S=s=>{var r;const a=((r=s.split(".").pop())==null?void 0:r.toLowerCase())||"";return["jpg","jpeg","png","gif","bmp","webp"].includes(a)?e.jsx(V,{className:"h-4 w-4"}):["mp4","avi","mov","mkv","flv","wmv","webm"].includes(a)?e.jsx(H,{className:"h-4 w-4"}):["mp3","wav","aac","flac","ogg","m4a"].includes(a)?e.jsx(R,{className:"h-4 w-4"}):e.jsx(C,{className:"h-4 w-4"})},j={total:c.length,temp:c.filter(s=>s.type==="temp").length,permanent:c.filter(s=>s.type==="permanent").length};return e.jsxs("div",{className:"space-y-6",children:[e.jsx(d,{children:e.jsxs(m,{children:[e.jsxs(x,{className:"flex items-center gap-2",children:[e.jsx(z,{className:"h-5 w-5"}),"文件缓存管理"]}),e.jsx(A,{children:"上传和管理你的文件,支持图片、视频、音频、文档"})]})}),o&&e.jsxs(I,{variant:o.type==="error"?"destructive":"default",children:[o.type==="success"?e.jsx(B,{className:"h-4 w-4"}):e.jsx(M,{className:"h-4 w-4"}),e.jsx(_,{children:o.text})]}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-6",children:[e.jsxs("div",{className:"lg:col-span-2 space-y-6",children:[e.jsxs(d,{children:[e.jsx(m,{className:"pb-3",children:e.jsx(x,{className:"text-base",children:"上传文件"})}),e.jsxs(f,{className:"space-y-4",children:[e.jsx(L,{accept:"image/*,video/*,audio/*,.md,.txt,.pdf,.doc,.docx",multiple:!1,onFilesSelected:T,description:"支持图片、视频、音频、文档文件",disabled:F}),e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs(v,{className:"flex items-center gap-2 cursor-pointer",children:[e.jsx("input",{type:"radio",name:"fileType",checked:h==="temp",onChange:()=>N("temp"),className:"h-4 w-4"}),e.jsx("span",{className:"text-sm",children:"临时文件"}),e.jsx(b,{variant:"secondary",className:"text-xs",children:"8小时后删除"})]}),e.jsxs(v,{className:"flex items-center gap-2 cursor-pointer",children:[e.jsx("input",{type:"radio",name:"fileType",checked:h==="permanent",onChange:()=>N("permanent"),className:"h-4 w-4"}),e.jsx("span",{className:"text-sm",children:"永久文件"})]})]})]})]}),e.jsxs(d,{children:[e.jsx(m,{className:"pb-3",children:e.jsx(x,{className:"text-base",children:"文件列表"})}),e.jsx(f,{children:c.length===0?e.jsx($,{icon:e.jsx(C,{className:"h-8 w-8"}),title:"暂无文件",description:"上传文件后,它们将显示在这里"}):e.jsx("div",{className:"space-y-3",children:c.map(s=>e.jsxs("div",{className:"flex items-center justify-between p-3 bg-muted/30 rounded-lg",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"h-8 w-8 rounded-lg bg-muted flex items-center justify-center",children:S(s.name)}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"font-medium text-sm truncate",title:s.name,children:s.name}),e.jsx("p",{className:"text-xs text-muted-foreground",children:new Date(s.created).toLocaleString("zh-CN")})]}),e.jsx(b,{variant:s.type==="temp"?"secondary":"default",children:s.type==="temp"?"临时":"永久"})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(g,{variant:"outline",size:"sm",onClick:()=>k(s.file_id),children:[e.jsx(P,{className:"h-3 w-3 mr-1"}),"复制"]}),e.jsx(g,{variant:"outline",size:"sm",asChild:!0,children:e.jsx("a",{href:s.url,download:!0,children:e.jsx(U,{className:"h-3 w-3"})})}),e.jsx(g,{variant:"ghost",size:"sm",onClick:()=>D(s.file_id),children:e.jsx(O,{className:"h-3 w-3"})})]})]},s.file_id))})})]})]}),e.jsx("div",{className:"space-y-4",children:e.jsxs(d,{children:[e.jsx(m,{className:"pb-3",children:e.jsx(x,{className:"text-base",children:"统计概览"})}),e.jsxs(f,{className:"space-y-4",children:[e.jsxs("div",{className:"p-3 bg-muted/30 rounded-lg",children:[e.jsx("p",{className:"text-xs text-muted-foreground mb-1",children:"总文件数"}),e.jsx("p",{className:"text-2xl font-semibold",children:j.total})]}),e.jsxs("div",{className:"p-3 bg-muted/30 rounded-lg",children:[e.jsx("p",{className:"text-xs text-muted-foreground mb-1",children:"临时文件"}),e.jsx("p",{className:"text-xl font-semibold",children:j.temp})]}),e.jsxs("div",{className:"p-3 bg-muted/30 rounded-lg",children:[e.jsx("p",{className:"text-xs text-muted-foreground mb-1",children:"永久文件"}),e.jsx("p",{className:"text-xl font-semibold",children:j.permanent})]})]})]})})]})]})}export{Q as default};
dist/frontend/assets/{index-DuJHIIAm.js → index-CstZx59R.js} RENAMED
@@ -1 +1 @@
1
- import{j as e}from"./query-BVy6DjHf.js";import{r as c}from"./vendor-BrxV5zWv.js";import{C as N,a as f,b,d as w,i as v,j as i,L as C,I as y,B as o}from"./index-BmzOyGUN.js";import{N as S,d as k,O as I,R as x,Q as B}from"./ui-3Ja5Lmtv.js";const u="/plugins/welcome_plugin/api";function L(){const[l,h]=c.useState("访客"),[p,d]=c.useState("消息将显示在这里..."),[a,m]=c.useState(null),[t,n]=c.useState(!1),g=async()=>{n(!0);try{const r=await(await fetch(`${u}/welcome?name=${encodeURIComponent(l)}`)).json();d(r.message)}catch{d("获取消息失败")}n(!1)},j=async()=>{n(!0);try{const r=await(await fetch(`${u}/status`)).json();m({enabled:r.enabled,message:r.message||"运行正常"})}catch{m({enabled:!1,message:"获取状态失败"})}n(!1)};return e.jsx("div",{className:"space-y-6",children:e.jsxs(N,{children:[e.jsxs(f,{children:[e.jsxs(b,{className:"flex items-center gap-2",children:[e.jsx(S,{className:"h-5 w-5"}),"欢迎插件"]}),e.jsx(w,{children:"一个简单的欢迎插件,用于验证插件管理系统"})]}),e.jsxs(v,{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-center gap-3 p-4 bg-muted/50 rounded-xl",children:[e.jsx("span",{className:"text-sm font-medium text-muted-foreground",children:"插件状态"}),a?e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(i,{variant:a.enabled?"secondary":"destructive",className:"gap-1.5",children:a.enabled?e.jsxs(e.Fragment,{children:[e.jsx(k,{className:"h-3 w-3"}),"运行中"]}):e.jsxs(e.Fragment,{children:[e.jsx(I,{className:"h-3 w-3"}),"已停止"]})}),e.jsx("span",{className:"text-sm text-muted-foreground",children:a.message})]}):e.jsxs(i,{variant:"outline",className:"gap-1.5",children:[e.jsx(x,{className:"h-3 w-3 animate-spin"}),"等待检查"]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(C,{htmlFor:"userName",children:"请输入您的名字"}),e.jsx(y,{id:"userName",value:l,onChange:s=>h(s.target.value),placeholder:"请输入名字",className:"max-w-sm"})]}),e.jsxs("div",{className:"flex flex-wrap gap-3",children:[e.jsxs(o,{onClick:g,disabled:t,className:"gap-2",children:[e.jsx(B,{className:"h-4 w-4"}),t?"加载中...":"获取欢迎消息"]}),e.jsxs(o,{variant:"outline",onClick:j,disabled:t,className:"gap-2",children:[e.jsx(x,{className:`h-4 w-4 ${t?"animate-spin":""}`}),"检查状态"]})]}),e.jsxs("div",{className:"p-4 border rounded-lg bg-background",children:[e.jsx("div",{className:"text-sm font-medium text-muted-foreground mb-1",children:"消息"}),e.jsx("p",{className:"text-base",children:p})]})]})]})})}export{L as default};
 
1
+ import{j as e}from"./query-BVy6DjHf.js";import{r as c}from"./vendor-BrxV5zWv.js";import{C as N,a as f,b,d as w,i as v,j as i,L as C,I as y,B as o}from"./index-glrVO3jG.js";import{O as S,e as k,Q as I,R as x,W as B}from"./ui-DGAKiEyf.js";const u="/plugins/welcome_plugin/api";function L(){const[l,h]=c.useState("访客"),[p,d]=c.useState("消息将显示在这里..."),[a,m]=c.useState(null),[t,n]=c.useState(!1),g=async()=>{n(!0);try{const r=await(await fetch(`${u}/welcome?name=${encodeURIComponent(l)}`)).json();d(r.message)}catch{d("获取消息失败")}n(!1)},j=async()=>{n(!0);try{const r=await(await fetch(`${u}/status`)).json();m({enabled:r.enabled,message:r.message||"运行正常"})}catch{m({enabled:!1,message:"获取状态失败"})}n(!1)};return e.jsx("div",{className:"space-y-6",children:e.jsxs(N,{children:[e.jsxs(f,{children:[e.jsxs(b,{className:"flex items-center gap-2",children:[e.jsx(S,{className:"h-5 w-5"}),"欢迎插件"]}),e.jsx(w,{children:"一个简单的欢迎插件,用于验证插件管理系统"})]}),e.jsxs(v,{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-center gap-3 p-4 bg-muted/50 rounded-xl",children:[e.jsx("span",{className:"text-sm font-medium text-muted-foreground",children:"插件状态"}),a?e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(i,{variant:a.enabled?"secondary":"destructive",className:"gap-1.5",children:a.enabled?e.jsxs(e.Fragment,{children:[e.jsx(k,{className:"h-3 w-3"}),"运行中"]}):e.jsxs(e.Fragment,{children:[e.jsx(I,{className:"h-3 w-3"}),"已停止"]})}),e.jsx("span",{className:"text-sm text-muted-foreground",children:a.message})]}):e.jsxs(i,{variant:"outline",className:"gap-1.5",children:[e.jsx(x,{className:"h-3 w-3 animate-spin"}),"等待检查"]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(C,{htmlFor:"userName",children:"请输入您的名字"}),e.jsx(y,{id:"userName",value:l,onChange:s=>h(s.target.value),placeholder:"请输入名字",className:"max-w-sm"})]}),e.jsxs("div",{className:"flex flex-wrap gap-3",children:[e.jsxs(o,{onClick:g,disabled:t,className:"gap-2",children:[e.jsx(B,{className:"h-4 w-4"}),t?"加载中...":"获取欢迎消息"]}),e.jsxs(o,{variant:"outline",onClick:j,disabled:t,className:"gap-2",children:[e.jsx(x,{className:`h-4 w-4 ${t?"animate-spin":""}`}),"检查状态"]})]}),e.jsxs("div",{className:"p-4 border rounded-lg bg-background",children:[e.jsx("div",{className:"text-sm font-medium text-muted-foreground mb-1",children:"消息"}),e.jsx("p",{className:"text-base",children:p})]})]})]})})}export{L as default};
dist/frontend/assets/{index-CYltYunp.js → index-D3CEv5ex.js} RENAMED
@@ -1,3 +1,3 @@
1
- import{j as e}from"./query-BVy6DjHf.js";import{r as c}from"./vendor-BrxV5zWv.js";import{C as B,a as P,b as R,d as _,i as z,A as I,e as M,L as d,j as x,B as m,E as V}from"./index-BmzOyGUN.js";import{S as $,a as H,b as J,c as Z,d as C}from"./select-DuJYwYQS.js";import{F as q}from"./FileDropZone-CA8QmgeV.js";import{E as p,a as G,A as K,s as Q,z as S,J as T,T as W,x as X,D as Y}from"./ui-3Ja5Lmtv.js";const k="/plugins/text_cleaner_plugin/api";function ne(){const[n,h]=c.useState(""),[t,j]=c.useState(""),[f,A]=c.useState("standard"),[i,o]=c.useState(!1),[g,w]=c.useState(""),[u,D]=c.useState("info"),N={chars:n.length,lines:n.split(`
2
  `).length},b={chars:t.length,lines:t.split(`
3
- `).length},r=(s,l)=>{w(s),D(l),setTimeout(()=>{w("")},3e3)},E=async()=>{if(!n.trim()){r("请输入或上传文本内容","error");return}o(!0);try{const s=new FormData;s.append("text",n),s.append("mode",f);const l=await fetch(`${k}/process`,{method:"POST",body:s});if(!l.ok)throw new Error("Processing failed");const a=await l.json();j(a.cleaned_text||a.result||""),r("清理完成","success")}catch{r("处理失败","error")}o(!1)},L=async s=>{const l=s[0];if(l){o(!0);try{const a=new FormData;a.append("file",l);const v=await fetch(`${k}/upload`,{method:"POST",body:a});if(!v.ok)throw new Error("Upload failed");const y=await v.json();h(y.text||y.content||""),r("文件已上传","success")}catch{r("文件上传失败","error")}o(!1)}},F=()=>{h(""),j("")},O=async()=>{if(!t.trim()){r("没有可复制的内容","error");return}try{await navigator.clipboard.writeText(t),r("已复制到剪贴板","success")}catch{r("复制失败","error")}},U=()=>{if(!t.trim()){r("没有可下载的内容","error");return}const s=new Blob([t],{type:"text/plain;charset=utf-8"}),l=URL.createObjectURL(s),a=document.createElement("a");a.href=l,a.download="cleaned_text.txt",document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(l),r("下载已开始","success")};return e.jsx("div",{className:"space-y-6",children:e.jsxs(B,{children:[e.jsxs(P,{children:[e.jsxs(R,{className:"flex items-center gap-2",children:[e.jsx(p,{className:"h-5 w-5"}),"文本清理"]}),e.jsx(_,{children:"文本清理工具,去除多余换行和标点符号替换"})]}),e.jsxs(z,{className:"space-y-6",children:[g&&e.jsxs(I,{variant:u==="error"?"destructive":"default",children:[u==="success"?e.jsx(G,{className:"h-4 w-4"}):u==="error"?e.jsx(K,{className:"h-4 w-4"}):e.jsx(Q,{className:"h-4 w-4"}),e.jsx(M,{children:g})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(d,{children:"清理模式"}),e.jsxs($,{value:f,onValueChange:A,children:[e.jsx(H,{className:"w-full rounded-xl",children:e.jsx(J,{})}),e.jsxs(Z,{children:[e.jsx(C,{value:"standard",children:"标准模式"}),e.jsx(C,{value:"compact",children:"紧凑模式"})]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(d,{children:"上传文件"}),e.jsx(q,{accept:".txt,.md,.html,.json",multiple:!1,onFilesSelected:L,description:"支持格式: txt, md, html, json",disabled:i})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(d,{children:"原始文本"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(x,{variant:"outline",className:"flex items-center gap-1",children:[e.jsx(S,{className:"h-3 w-3"}),N.chars," 字符"]}),e.jsxs(x,{variant:"secondary",className:"flex items-center gap-1",children:[e.jsx(T,{className:"h-3 w-3"}),N.lines," 行"]})]})]}),e.jsx("textarea",{className:"w-full min-h-[200px] p-3 border rounded-xl resize-y bg-background text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring",placeholder:"请输入需要清理的文本...",value:n,onChange:s=>h(s.target.value),disabled:i})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(m,{onClick:E,disabled:i||!n.trim(),children:[i?e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"animate-spin h-4 w-4 border-2 border-current border-t-transparent rounded-full"}),"加载中..."]}):e.jsx(p,{className:"h-4 w-4 mr-2"}),"开始清理"]}),e.jsxs(m,{variant:"outline",onClick:F,disabled:i,children:[e.jsx(W,{className:"h-4 w-4 mr-2"}),"清空"]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(d,{children:"清理后文本"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(x,{variant:"outline",className:"flex items-center gap-1",children:[e.jsx(S,{className:"h-3 w-3"}),b.chars," 字符"]}),e.jsxs(x,{variant:"secondary",className:"flex items-center gap-1",children:[e.jsx(T,{className:"h-3 w-3"}),b.lines," 行"]})]})]}),t.trim()?e.jsx("textarea",{className:"w-full min-h-[200px] p-3 border rounded-xl resize-y bg-background text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring",placeholder:"清理结果将显示在这里...",value:t,readOnly:!0}):e.jsx("div",{className:"border rounded-xl bg-muted/30",children:e.jsx(V,{icon:e.jsx(p,{className:"h-6 w-6"}),title:"等待清理",description:"输入文本并点击开始清理按钮"})})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(m,{variant:"outline",onClick:O,disabled:!t.trim(),children:[e.jsx(X,{className:"h-4 w-4 mr-2"}),"复制"]}),e.jsxs(m,{variant:"outline",onClick:U,disabled:!t.trim(),children:[e.jsx(Y,{className:"h-4 w-4 mr-2"}),"下载"]})]})]})]})})}export{ne as default};
 
1
+ import{j as e}from"./query-BVy6DjHf.js";import{r as c}from"./vendor-BrxV5zWv.js";import{C as B,a as P,b as R,d as _,i as I,A as M,e as z,L as d,j as x,B as m,E as V}from"./index-glrVO3jG.js";import{S as $,a as H,b as J,c as K,d as C}from"./select-DU-WcEOz.js";import{F as Z}from"./FileDropZone-Bnye6SLQ.js";import{E as p,b as q,A as G,u as Q,J as S,K as T,T as W,y as X,D as Y}from"./ui-DGAKiEyf.js";const k="/plugins/text_cleaner_plugin/api";function ne(){const[n,h]=c.useState(""),[t,j]=c.useState(""),[f,A]=c.useState("standard"),[i,o]=c.useState(!1),[g,w]=c.useState(""),[u,D]=c.useState("info"),N={chars:n.length,lines:n.split(`
2
  `).length},b={chars:t.length,lines:t.split(`
3
+ `).length},r=(s,l)=>{w(s),D(l),setTimeout(()=>{w("")},3e3)},E=async()=>{if(!n.trim()){r("请输入或上传文本内容","error");return}o(!0);try{const s=new FormData;s.append("text",n),s.append("mode",f);const l=await fetch(`${k}/process`,{method:"POST",body:s});if(!l.ok)throw new Error("Processing failed");const a=await l.json();j(a.cleaned_text||a.result||""),r("清理完成","success")}catch{r("处理失败","error")}o(!1)},L=async s=>{const l=s[0];if(l){o(!0);try{const a=new FormData;a.append("file",l);const y=await fetch(`${k}/upload`,{method:"POST",body:a});if(!y.ok)throw new Error("Upload failed");const v=await y.json();h(v.text||v.content||""),r("文件已上传","success")}catch{r("文件上传失败","error")}o(!1)}},F=()=>{h(""),j("")},O=async()=>{if(!t.trim()){r("没有可复制的内容","error");return}try{await navigator.clipboard.writeText(t),r("已复制到剪贴板","success")}catch{r("复制失败","error")}},U=()=>{if(!t.trim()){r("没有可下载的内容","error");return}const s=new Blob([t],{type:"text/plain;charset=utf-8"}),l=URL.createObjectURL(s),a=document.createElement("a");a.href=l,a.download="cleaned_text.txt",document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(l),r("下载已开始","success")};return e.jsx("div",{className:"space-y-6",children:e.jsxs(B,{children:[e.jsxs(P,{children:[e.jsxs(R,{className:"flex items-center gap-2",children:[e.jsx(p,{className:"h-5 w-5"}),"文本清理"]}),e.jsx(_,{children:"文本清理工具,去除多余换行和标点符号替换"})]}),e.jsxs(I,{className:"space-y-6",children:[g&&e.jsxs(M,{variant:u==="error"?"destructive":"default",children:[u==="success"?e.jsx(q,{className:"h-4 w-4"}):u==="error"?e.jsx(G,{className:"h-4 w-4"}):e.jsx(Q,{className:"h-4 w-4"}),e.jsx(z,{children:g})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(d,{children:"清理模式"}),e.jsxs($,{value:f,onValueChange:A,children:[e.jsx(H,{className:"w-full rounded-xl",children:e.jsx(J,{})}),e.jsxs(K,{children:[e.jsx(C,{value:"standard",children:"标准模式"}),e.jsx(C,{value:"compact",children:"紧凑模式"})]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(d,{children:"上传文件"}),e.jsx(Z,{accept:".txt,.md,.html,.json",multiple:!1,onFilesSelected:L,description:"支持格式: txt, md, html, json",disabled:i})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(d,{children:"原始文本"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(x,{variant:"outline",className:"flex items-center gap-1",children:[e.jsx(S,{className:"h-3 w-3"}),N.chars," 字符"]}),e.jsxs(x,{variant:"secondary",className:"flex items-center gap-1",children:[e.jsx(T,{className:"h-3 w-3"}),N.lines," 行"]})]})]}),e.jsx("textarea",{className:"w-full min-h-[200px] p-3 border rounded-xl resize-y bg-background text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring",placeholder:"请输入需要清理的文本...",value:n,onChange:s=>h(s.target.value),disabled:i})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(m,{onClick:E,disabled:i||!n.trim(),children:[i?e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"animate-spin h-4 w-4 border-2 border-current border-t-transparent rounded-full"}),"加载中..."]}):e.jsx(p,{className:"h-4 w-4 mr-2"}),"开始清理"]}),e.jsxs(m,{variant:"outline",onClick:F,disabled:i,children:[e.jsx(W,{className:"h-4 w-4 mr-2"}),"清空"]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(d,{children:"清理后文本"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(x,{variant:"outline",className:"flex items-center gap-1",children:[e.jsx(S,{className:"h-3 w-3"}),b.chars," 字符"]}),e.jsxs(x,{variant:"secondary",className:"flex items-center gap-1",children:[e.jsx(T,{className:"h-3 w-3"}),b.lines," 行"]})]})]}),t.trim()?e.jsx("textarea",{className:"w-full min-h-[200px] p-3 border rounded-xl resize-y bg-background text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring",placeholder:"清理结果将显示在这里...",value:t,readOnly:!0}):e.jsx("div",{className:"border rounded-xl bg-muted/30",children:e.jsx(V,{icon:e.jsx(p,{className:"h-6 w-6"}),title:"等待清理",description:"输入文本并点击开始清理按钮"})})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(m,{variant:"outline",onClick:O,disabled:!t.trim(),children:[e.jsx(X,{className:"h-4 w-4 mr-2"}),"复制"]}),e.jsxs(m,{variant:"outline",onClick:U,disabled:!t.trim(),children:[e.jsx(Y,{className:"h-4 w-4 mr-2"}),"下载"]})]})]})]})})}export{ne as default};
dist/frontend/assets/index-DH3iE3Xn.css ADDED
@@ -0,0 +1 @@
 
 
1
+ *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--background: 0 0% 100%;--foreground: 222.2 84% 4.9%;--card: 0 0% 100%;--card-foreground: 222.2 84% 4.9%;--popover: 0 0% 100%;--popover-foreground: 222.2 84% 4.9%;--primary: 222.2 47.4% 11.2%;--primary-foreground: 210 40% 98%;--secondary: 210 40% 96.1%;--secondary-foreground: 222.2 47.4% 11.2%;--muted: 210 40% 96.1%;--muted-foreground: 215.4 16.3% 46.9%;--accent: 210 40% 96.1%;--accent-foreground: 222.2 47.4% 11.2%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 210 40% 98%;--border: 214.3 31.8% 91.4%;--input: 214.3 31.8% 91.4%;--ring: 222.2 84% 4.9%;--radius: .5rem}.dark{--background: 222.2 84% 4.9%;--foreground: 210 40% 98%;--card: 222.2 84% 4.9%;--card-foreground: 210 40% 98%;--popover: 222.2 84% 4.9%;--popover-foreground: 210 40% 98%;--primary: 210 40% 98%;--primary-foreground: 222.2 47.4% 11.2%;--secondary: 217.2 32.6% 17.5%;--secondary-foreground: 210 40% 98%;--muted: 217.2 32.6% 17.5%;--muted-foreground: 215 20.2% 65.1%;--accent: 217.2 32.6% 17.5%;--accent-foreground: 210 40% 98%;--destructive: 0 62.8% 30.6%;--destructive-foreground: 210 40% 98%;--border: 217.2 32.6% 17.5%;--input: 217.2 32.6% 17.5%;--ring: 212.7 26.8% 83.9%}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground));font-family:Inter,sans-serif}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.bottom-0{bottom:0}.left-0{left:0}.left-2{left:.5rem}.left-3{left:.75rem}.left-\[50\%\]{left:50%}.right-4{right:1rem}.top-0{top:0}.top-1\/2{top:50%}.top-14{top:3.5rem}.top-4{top:1rem}.top-\[50\%\]{top:50%}.z-20{z-index:20}.z-30{z-index:30}.z-50{z-index:50}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.ml-0{margin-left:0}.ml-4{margin-left:1rem}.ml-6{margin-left:1.5rem}.mr-1{margin-right:.25rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-24{height:6rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-full{height:100%}.h-px{height:1px}.max-h-\[--radix-select-content-available-height\]{max-height:var(--radix-select-content-available-height)}.min-h-\[calc\(100vh-3\.5rem\)\]{min-height:calc(100vh - 3.5rem)}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-12{width:3rem}.w-16{width:4rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[24px\]{min-width:24px}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.max-w-\[calc\(100vw-2rem\)\]{max-width:calc(100vw - 2rem)}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.origin-\[--radix-select-content-transform-origin\]{transform-origin:var(--radix-select-content-transform-origin)}.-translate-x-full{--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[-50\%\]{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\[-50\%\]{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-110{--tw-scale-x: 1.1;--tw-scale-y: 1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-\[1\.02\]{--tw-scale-x: 1.02;--tw-scale-y: 1.02;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize{resize:both}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-r{border-right-width:1px}.border-dashed{border-style:dashed}.border-destructive\/50{border-color:hsl(var(--destructive) / .5)}.border-input{border-color:hsl(var(--input))}.border-teal-200\/50{border-color:#99f6e480}.border-teal-400{--tw-border-opacity: 1;border-color:rgb(45 212 191 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.bg-background{background-color:hsl(var(--background))}.bg-black\/50{background-color:#00000080}.bg-black\/80{background-color:#000c}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-blue-500{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.bg-card{background-color:hsl(var(--card))}.bg-destructive{background-color:hsl(var(--destructive))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-gray-500{--tw-bg-opacity: 1;background-color:rgb(107 114 128 / var(--tw-bg-opacity, 1))}.bg-gray-900{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.bg-green-100{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.bg-green-50{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-muted{background-color:hsl(var(--muted))}.bg-muted\/30{background-color:hsl(var(--muted) / .3)}.bg-popover{background-color:hsl(var(--popover))}.bg-primary{background-color:hsl(var(--primary))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-secondary{background-color:hsl(var(--secondary))}.bg-teal-50\/50{background-color:#f0fdfa80}.bg-yellow-100{--tw-bg-opacity: 1;background-color:rgb(254 249 195 / var(--tw-bg-opacity, 1))}.bg-yellow-500{--tw-bg-opacity: 1;background-color:rgb(234 179 8 / var(--tw-bg-opacity, 1))}.bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.from-teal-100\/80{--tw-gradient-from: rgb(204 251 241 / .8) var(--tw-gradient-from-position);--tw-gradient-to: rgb(204 251 241 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-teal-50\/30{--tw-gradient-from: rgb(240 253 250 / .3) var(--tw-gradient-from-position);--tw-gradient-to: rgb(240 253 250 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-teal-500{--tw-gradient-from: #14b8a6 var(--tw-gradient-from-position);--tw-gradient-to: rgb(20 184 166 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-cyan-100\/50{--tw-gradient-to: rgb(207 250 254 / .5) var(--tw-gradient-to-position)}.to-cyan-50\/20{--tw-gradient-to: rgb(236 254 255 / .2) var(--tw-gradient-to-position)}.to-cyan-600{--tw-gradient-to: #0891b2 var(--tw-gradient-to-position)}.p-1{padding:.25rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pl-10{padding-left:2.5rem}.pl-8{padding-left:2rem}.pr-2{padding-right:.5rem}.pt-0{padding-top:0}.text-center{text-align:center}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.leading-none{line-height:1}.tracking-tight{letter-spacing:-.025em}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-card-foreground{color:hsl(var(--card-foreground))}.text-destructive{color:hsl(var(--destructive))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-foreground{color:hsl(var(--foreground))}.text-gray-100{--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-green-700{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-700{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-teal-600{--tw-text-opacity: 1;color:rgb(13 148 136 / var(--tw-text-opacity, 1))}.text-teal-600\/60{color:#0d948899}.text-teal-700{--tw-text-opacity: 1;color:rgb(15 118 110 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-500{--tw-text-opacity: 1;color:rgb(234 179 8 / var(--tw-text-opacity, 1))}.text-yellow-600{--tw-text-opacity: 1;color:rgb(202 138 4 / var(--tw-text-opacity, 1))}.underline-offset-4{text-underline-offset:4px}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-teal-500\/20{--tw-shadow-color: rgb(20 184 166 / .2);--tw-shadow: var(--tw-shadow-colored)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-offset-background{--tw-ring-offset-color: hsl(var(--background))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}.duration-200{animation-duration:.2s}.duration-300{animation-duration:.3s}.file\:border-0::file-selector-button{border-width:0px}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.placeholder\:text-muted-foreground::-moz-placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.hover\:border-primary:hover{border-color:hsl(var(--primary))}.hover\:border-teal-300\/70:hover{border-color:#5eead4b3}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-destructive\/80:hover{background-color:hsl(var(--destructive) / .8)}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive) / .9)}.hover\:bg-green-500\/80:hover{background-color:#22c55ecc}.hover\:bg-primary\/80:hover{background-color:hsl(var(--primary) / .8)}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary) / .9)}.hover\:bg-secondary\/80:hover{background-color:hsl(var(--secondary) / .8)}.hover\:bg-teal-50\/40:hover{background-color:#f0fdfa66}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-primary:hover{color:hsl(var(--primary))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.focus\:bg-accent:focus{background-color:hsl(var(--accent))}.focus\:text-accent-foreground:focus{color:hsl(var(--accent-foreground))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-ring:focus{--tw-ring-color: hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color: hsl(var(--ring))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.peer:disabled~.peer-disabled\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\:opacity-70{opacity:.7}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:hsl(var(--background))}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:hsl(var(--accent))}.data-\[placeholder\]\:text-muted-foreground[data-placeholder]{color:hsl(var(--muted-foreground))}.data-\[state\=active\]\:text-foreground[data-state=active]{color:hsl(var(--foreground))}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:hsl(var(--muted-foreground))}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[state\=active\]\:shadow-sm[data-state=active]{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.data-\[state\=open\]\:animate-in[data-state=open]{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation-name:exit;animation-duration:.15s;--tw-exit-opacity: initial;--tw-exit-scale: initial;--tw-exit-rotate: initial;--tw-exit-translate-x: initial;--tw-exit-translate-y: initial}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity: 0}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity: 0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale: .95}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale: .95}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y: -.5rem}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x: .5rem}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x: -.5rem}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y: .5rem}.data-\[state\=closed\]\:slide-out-to-left-1\/2[data-state=closed]{--tw-exit-translate-x: -50%}.data-\[state\=closed\]\:slide-out-to-top-\[48\%\][data-state=closed]{--tw-exit-translate-y: -48%}.data-\[state\=open\]\:slide-in-from-left-1\/2[data-state=open]{--tw-enter-translate-x: -50%}.data-\[state\=open\]\:slide-in-from-top-\[48\%\][data-state=open]{--tw-enter-translate-y: -48%}.dark\:border-destructive:is(.dark *){border-color:hsl(var(--destructive))}@media (min-width: 640px){.sm\:mt-0{margin-top:0}.sm\:inline{display:inline}.sm\:max-w-\[500px\]{max-width:500px}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}.sm\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius)}.sm\:text-left{text-align:left}}@media (min-width: 768px){.md\:ml-64{margin-left:16rem}.md\:flex{display:flex}.md\:hidden{display:none}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:gap-6{gap:1.5rem}.md\:p-6{padding:1.5rem}}@media (min-width: 1024px){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}.\[\&\>span\]\:line-clamp-1>span{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.\[\&\>svg\+div\]\:translate-y-\[-3px\]>svg+div{--tw-translate-y: -3px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\[\&\>svg\]\:absolute>svg{position:absolute}.\[\&\>svg\]\:left-4>svg{left:1rem}.\[\&\>svg\]\:top-4>svg{top:1rem}.\[\&\>svg\]\:text-destructive>svg{color:hsl(var(--destructive))}.\[\&\>svg\]\:text-foreground>svg{color:hsl(var(--foreground))}.\[\&\>svg\~\*\]\:pl-7>svg~*{padding-left:1.75rem}.\[\&_p\]\:leading-relaxed p{line-height:1.625}
dist/frontend/assets/index-DfP-YqFs.css DELETED
@@ -1 +0,0 @@
1
- *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--background: 0 0% 100%;--foreground: 222.2 84% 4.9%;--card: 0 0% 100%;--card-foreground: 222.2 84% 4.9%;--popover: 0 0% 100%;--popover-foreground: 222.2 84% 4.9%;--primary: 222.2 47.4% 11.2%;--primary-foreground: 210 40% 98%;--secondary: 210 40% 96.1%;--secondary-foreground: 222.2 47.4% 11.2%;--muted: 210 40% 96.1%;--muted-foreground: 215.4 16.3% 46.9%;--accent: 210 40% 96.1%;--accent-foreground: 222.2 47.4% 11.2%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 210 40% 98%;--border: 214.3 31.8% 91.4%;--input: 214.3 31.8% 91.4%;--ring: 222.2 84% 4.9%;--radius: .5rem}.dark{--background: 222.2 84% 4.9%;--foreground: 210 40% 98%;--card: 222.2 84% 4.9%;--card-foreground: 210 40% 98%;--popover: 222.2 84% 4.9%;--popover-foreground: 210 40% 98%;--primary: 210 40% 98%;--primary-foreground: 222.2 47.4% 11.2%;--secondary: 217.2 32.6% 17.5%;--secondary-foreground: 210 40% 98%;--muted: 217.2 32.6% 17.5%;--muted-foreground: 215 20.2% 65.1%;--accent: 217.2 32.6% 17.5%;--accent-foreground: 210 40% 98%;--destructive: 0 62.8% 30.6%;--destructive-foreground: 210 40% 98%;--border: 217.2 32.6% 17.5%;--input: 217.2 32.6% 17.5%;--ring: 212.7 26.8% 83.9%}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground));font-family:Inter,sans-serif}.container{width:100%;margin-right:auto;margin-left:auto;padding-right:2rem;padding-left:2rem}@media (min-width: 1400px){.container{max-width:1400px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.bottom-0{bottom:0}.left-0{left:0}.left-2{left:.5rem}.left-3{left:.75rem}.left-\[50\%\]{left:50%}.right-4{right:1rem}.top-0{top:0}.top-1\/2{top:50%}.top-14{top:3.5rem}.top-4{top:1rem}.top-\[50\%\]{top:50%}.z-30{z-index:30}.z-50{z-index:50}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.ml-4{margin-left:1rem}.ml-6{margin-left:1.5rem}.mr-1{margin-right:.25rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-24{height:6rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-full{height:100%}.h-px{height:1px}.max-h-\[--radix-select-content-available-height\]{max-height:var(--radix-select-content-available-height)}.min-h-\[calc\(100vh-3\.5rem\)\]{min-height:calc(100vh - 3.5rem)}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-12{width:3rem}.w-16{width:4rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[24px\]{min-width:24px}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.origin-\[--radix-select-content-transform-origin\]{transform-origin:var(--radix-select-content-transform-origin)}.-translate-x-full{--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[-50\%\]{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\[-50\%\]{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-110{--tw-scale-x: 1.1;--tw-scale-y: 1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-\[1\.02\]{--tw-scale-x: 1.02;--tw-scale-y: 1.02;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize{resize:both}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-r{border-right-width:1px}.border-dashed{border-style:dashed}.border-destructive\/50{border-color:hsl(var(--destructive) / .5)}.border-input{border-color:hsl(var(--input))}.border-teal-200\/50{border-color:#99f6e480}.border-teal-400{--tw-border-opacity: 1;border-color:rgb(45 212 191 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.bg-background{background-color:hsl(var(--background))}.bg-black\/80{background-color:#000c}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-blue-500{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.bg-card{background-color:hsl(var(--card))}.bg-destructive{background-color:hsl(var(--destructive))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-gray-500{--tw-bg-opacity: 1;background-color:rgb(107 114 128 / var(--tw-bg-opacity, 1))}.bg-gray-900{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.bg-green-100{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.bg-green-50{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-muted{background-color:hsl(var(--muted))}.bg-muted\/30{background-color:hsl(var(--muted) / .3)}.bg-popover{background-color:hsl(var(--popover))}.bg-primary{background-color:hsl(var(--primary))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-secondary{background-color:hsl(var(--secondary))}.bg-teal-50\/50{background-color:#f0fdfa80}.bg-yellow-100{--tw-bg-opacity: 1;background-color:rgb(254 249 195 / var(--tw-bg-opacity, 1))}.bg-yellow-500{--tw-bg-opacity: 1;background-color:rgb(234 179 8 / var(--tw-bg-opacity, 1))}.bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.from-teal-100\/80{--tw-gradient-from: rgb(204 251 241 / .8) var(--tw-gradient-from-position);--tw-gradient-to: rgb(204 251 241 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-teal-50\/30{--tw-gradient-from: rgb(240 253 250 / .3) var(--tw-gradient-from-position);--tw-gradient-to: rgb(240 253 250 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-teal-500{--tw-gradient-from: #14b8a6 var(--tw-gradient-from-position);--tw-gradient-to: rgb(20 184 166 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-cyan-100\/50{--tw-gradient-to: rgb(207 250 254 / .5) var(--tw-gradient-to-position)}.to-cyan-50\/20{--tw-gradient-to: rgb(236 254 255 / .2) var(--tw-gradient-to-position)}.to-cyan-600{--tw-gradient-to: #0891b2 var(--tw-gradient-to-position)}.p-1{padding:.25rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pl-10{padding-left:2.5rem}.pl-8{padding-left:2rem}.pr-2{padding-right:.5rem}.pt-0{padding-top:0}.text-center{text-align:center}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.leading-none{line-height:1}.tracking-tight{letter-spacing:-.025em}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-card-foreground{color:hsl(var(--card-foreground))}.text-destructive{color:hsl(var(--destructive))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-foreground{color:hsl(var(--foreground))}.text-gray-100{--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-green-700{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-700{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-teal-600{--tw-text-opacity: 1;color:rgb(13 148 136 / var(--tw-text-opacity, 1))}.text-teal-600\/60{color:#0d948899}.text-teal-700{--tw-text-opacity: 1;color:rgb(15 118 110 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-500{--tw-text-opacity: 1;color:rgb(234 179 8 / var(--tw-text-opacity, 1))}.text-yellow-600{--tw-text-opacity: 1;color:rgb(202 138 4 / var(--tw-text-opacity, 1))}.underline-offset-4{text-underline-offset:4px}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-teal-500\/20{--tw-shadow-color: rgb(20 184 166 / .2);--tw-shadow: var(--tw-shadow-colored)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-offset-background{--tw-ring-offset-color: hsl(var(--background))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}.duration-200{animation-duration:.2s}.duration-300{animation-duration:.3s}.file\:border-0::file-selector-button{border-width:0px}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.placeholder\:text-muted-foreground::-moz-placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.hover\:border-primary:hover{border-color:hsl(var(--primary))}.hover\:border-teal-300\/70:hover{border-color:#5eead4b3}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-destructive\/80:hover{background-color:hsl(var(--destructive) / .8)}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive) / .9)}.hover\:bg-green-500\/80:hover{background-color:#22c55ecc}.hover\:bg-primary\/80:hover{background-color:hsl(var(--primary) / .8)}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary) / .9)}.hover\:bg-secondary\/80:hover{background-color:hsl(var(--secondary) / .8)}.hover\:bg-teal-50\/40:hover{background-color:#f0fdfa66}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-primary:hover{color:hsl(var(--primary))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.focus\:bg-accent:focus{background-color:hsl(var(--accent))}.focus\:text-accent-foreground:focus{color:hsl(var(--accent-foreground))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-ring:focus{--tw-ring-color: hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color: hsl(var(--ring))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.peer:disabled~.peer-disabled\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\:opacity-70{opacity:.7}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:hsl(var(--background))}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:hsl(var(--accent))}.data-\[placeholder\]\:text-muted-foreground[data-placeholder]{color:hsl(var(--muted-foreground))}.data-\[state\=active\]\:text-foreground[data-state=active]{color:hsl(var(--foreground))}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:hsl(var(--muted-foreground))}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[state\=active\]\:shadow-sm[data-state=active]{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.data-\[state\=open\]\:animate-in[data-state=open]{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation-name:exit;animation-duration:.15s;--tw-exit-opacity: initial;--tw-exit-scale: initial;--tw-exit-rotate: initial;--tw-exit-translate-x: initial;--tw-exit-translate-y: initial}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity: 0}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity: 0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale: .95}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale: .95}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y: -.5rem}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x: .5rem}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x: -.5rem}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y: .5rem}.data-\[state\=closed\]\:slide-out-to-left-1\/2[data-state=closed]{--tw-exit-translate-x: -50%}.data-\[state\=closed\]\:slide-out-to-top-\[48\%\][data-state=closed]{--tw-exit-translate-y: -48%}.data-\[state\=open\]\:slide-in-from-left-1\/2[data-state=open]{--tw-enter-translate-x: -50%}.data-\[state\=open\]\:slide-in-from-top-\[48\%\][data-state=open]{--tw-enter-translate-y: -48%}.dark\:border-destructive:is(.dark *){border-color:hsl(var(--destructive))}@media (min-width: 640px){.sm\:mt-0{margin-top:0}.sm\:max-w-\[500px\]{max-width:500px}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}.sm\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius)}.sm\:text-left{text-align:left}}@media (min-width: 768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width: 1024px){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}.\[\&\>span\]\:line-clamp-1>span{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.\[\&\>svg\+div\]\:translate-y-\[-3px\]>svg+div{--tw-translate-y: -3px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\[\&\>svg\]\:absolute>svg{position:absolute}.\[\&\>svg\]\:left-4>svg{left:1rem}.\[\&\>svg\]\:top-4>svg{top:1rem}.\[\&\>svg\]\:text-destructive>svg{color:hsl(var(--destructive))}.\[\&\>svg\]\:text-foreground>svg{color:hsl(var(--foreground))}.\[\&\>svg\~\*\]\:pl-7>svg~*{padding-left:1.75rem}.\[\&_p\]\:leading-relaxed p{line-height:1.625}
 
 
dist/frontend/assets/{index-JYrcwpXe.js → index-S_ho_fSD.js} RENAMED
@@ -1 +1 @@
1
- import{j as e}from"./query-BVy6DjHf.js";import{r as o}from"./vendor-BrxV5zWv.js";import{c as g,B as m,C as x,a as u,b as h,d as $,A as D,e as I,T as X,f as Z,g as B,h as E,i as N,E as G}from"./index-BmzOyGUN.js";import{F as W}from"./FileDropZone-CA8QmgeV.js";import{g as H,I as K,V as q,M as J,s as v,a as Q,A as Y,u as ee,v as se,w as te}from"./ui-3Ja5Lmtv.js";const ae={yellow:"bg-yellow-100 text-yellow-600",green:"bg-green-100 text-green-600",blue:"bg-blue-100 text-blue-600",gray:"bg-gray-100 text-gray-600"},re=l=>{if(l===0)return"0 Bytes";const n=1024,r=["Bytes","KB","MB","GB"],c=Math.floor(Math.log(l)/Math.log(n));return parseFloat((l/Math.pow(n,c)).toFixed(2))+" "+r[c]},le=l=>{var c;const n=((c=l.name.split(".").pop())==null?void 0:c.toLowerCase())||"",r=l.type;return r.startsWith("image/")||["jpg","jpeg","png","gif","bmp","webp","svg"].includes(n)?e.jsx(K,{className:"h-5 w-5"}):r.startsWith("video/")||["mp4","avi","mov","mkv","webm"].includes(n)?e.jsx(q,{className:"h-5 w-5"}):r.startsWith("audio/")||["mp3","wav","aac","flac","ogg"].includes(n)?e.jsx(J,{className:"h-5 w-5"}):e.jsx(v,{className:"h-5 w-5"})},ne=l=>{var c;const n=((c=l.name.split(".").pop())==null?void 0:c.toLowerCase())||"",r=l.type;return r.startsWith("image/")||["jpg","jpeg","png","gif","bmp","webp","svg"].includes(n)?"blue":r.startsWith("audio/")||["mp3","wav","aac","flac","ogg"].includes(n)?"green":["md","txt","html","json","csv"].includes(n)?"yellow":"gray"};function _({file:l,index:n,onRemove:r,iconColor:c,className:p}){const w=c||ne(l),j=le(l);return e.jsxs("div",{className:g("flex items-center gap-3 p-3 bg-muted/30 rounded-lg",p),children:[n!==void 0&&e.jsx("span",{className:g("bg-primary text-primary-foreground text-xs px-2 py-0.5 rounded","font-medium min-w-[24px] text-center"),children:n+1}),e.jsx("div",{className:g("h-10 w-10 rounded-lg flex items-center justify-center",ae[w]),children:j}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"text-sm font-medium truncate",children:l.name}),e.jsx("p",{className:"text-xs text-muted-foreground",children:re(l.size)})]}),e.jsx(m,{variant:"destructive",size:"icon",className:"h-7 w-7",onClick:r,children:e.jsx(H,{className:"h-4 w-4"})})]})}const A="/plugins/document_merge_split_plugin/api";function pe(){const[l,n]=o.useState("merge"),[r,c]=o.useState([]),[p,w]=o.useState("md"),[j,y]=o.useState(!1),[f,C]=o.useState(null),[F,z]=o.useState("md"),[S,M]=o.useState(!1),[b,k]=o.useState(null),d=(s,t)=>{k({type:s,text:t}),setTimeout(()=>k(null),3e3)},R=o.useCallback(s=>{const t=s.filter(a=>a.name.endsWith(".md")||a.name.endsWith(".txt")).filter(a=>!r.find(i=>i.file.name===a.name)).map(a=>({file:a,id:Math.random().toString(36).slice(2)}));c(a=>[...a,...t])},[r]),T=(s,t)=>{const a=s+t;if(a<0||a>=r.length)return;const i=[...r];[i[s],i[a]]=[i[a],i[s]],c(i)},U=s=>{c(t=>t.filter(a=>a.id!==s))},P=async()=>{if(r.length===0){d("error","请至少上传一个文件");return}y(!0);const s=new FormData;r.forEach(t=>s.append("files",t.file)),s.append("order",r.map((t,a)=>a).join(",")),s.append("output_format",p);try{const t=await fetch(`${A}/merge`,{method:"POST",body:s});if(!t.ok)throw new Error("合并失败");const a=await t.blob();L(a,`merged_document.${p}`),d("success","文档合并成功,已开始下载")}catch{d("error","合并失败")}y(!1)},O=o.useCallback(s=>{const t=s[0];t&&(t.name.endsWith(".md")||t.name.endsWith(".txt"))&&C(t)},[]),V=async()=>{if(!f){d("error","请上传要拆分的文件");return}M(!0);const s=new FormData;s.append("file",f),s.append("output_format",F);try{const t=await fetch(`${A}/split`,{method:"POST",body:s});if(!t.ok)throw new Error("拆分失败");const a=await t.blob();L(a,"split_documents.zip"),d("success","文档拆分成功,已开始下载")}catch{d("error","拆分失败")}M(!1)},L=(s,t)=>{const a=URL.createObjectURL(s),i=document.createElement("a");i.href=a,i.download=t,i.click(),URL.revokeObjectURL(a)};return e.jsxs("div",{className:"space-y-6",children:[e.jsx(x,{children:e.jsxs(u,{children:[e.jsxs(h,{className:"flex items-center gap-2",children:[e.jsx(v,{className:"h-5 w-5"}),"文档合并拆分"]}),e.jsx($,{children:"合并多个文档或将单个文档按章节拆分"})]})}),b&&e.jsxs(D,{variant:b.type==="error"?"destructive":"default",children:[b.type==="success"?e.jsx(Q,{className:"h-4 w-4"}):e.jsx(Y,{className:"h-4 w-4"}),e.jsx(I,{children:b.text})]}),e.jsxs(X,{value:l,onValueChange:n,children:[e.jsxs(Z,{children:[e.jsx(B,{value:"merge",children:"合并文档"}),e.jsx(B,{value:"split",children:"拆分文档"})]}),e.jsxs(E,{value:"merge",className:"space-y-4",children:[e.jsxs(x,{children:[e.jsx(u,{className:"pb-3",children:e.jsx(h,{className:"text-base",children:"上传文档"})}),e.jsx(N,{children:e.jsx(W,{accept:".md,.txt",multiple:!0,onFilesSelected:R,description:"支持格式: md, txt"})})]}),e.jsxs(x,{children:[e.jsx(u,{className:"pb-3",children:e.jsx(h,{className:"text-base",children:"文件列表"})}),e.jsxs(N,{className:"space-y-4",children:[r.length===0?e.jsx(G,{icon:e.jsx(v,{className:"h-8 w-8"}),title:"暂无文件",description:"请上传文档文件进行合并"}):e.jsx("div",{className:"space-y-2",children:r.map((s,t)=>e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"flex-1",children:e.jsx(_,{file:s.file,index:t,onRemove:()=>U(s.id),iconColor:"yellow"})}),e.jsxs("div",{className:"flex gap-1",children:[e.jsx(m,{variant:"outline",size:"icon",className:"h-7 w-7 rounded-full",onClick:()=>T(t,-1),disabled:t===0,children:e.jsx(ee,{className:"h-4 w-4"})}),e.jsx(m,{variant:"outline",size:"icon",className:"h-7 w-7 rounded-full",onClick:()=>T(t,1),disabled:t===r.length-1,children:e.jsx(se,{className:"h-4 w-4"})})]})]},s.id))}),e.jsxs("div",{className:"flex items-center gap-4 p-3 bg-muted/30 rounded-lg",children:[e.jsx("span",{className:"text-sm font-medium",children:"输出格式"}),e.jsx("div",{className:"flex gap-2",children:["md","txt"].map(s=>e.jsxs("button",{className:g("px-4 py-1.5 text-sm border rounded-full transition-colors",p===s?"bg-primary text-primary-foreground border-primary":"border-gray-200 hover:bg-muted hover:border-gray-300"),onClick:()=>w(s),children:[".",s]},s))})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(m,{className:"flex-1 rounded-full",onClick:P,disabled:j,children:j?"合并中...":"合并并下载"}),e.jsx(m,{variant:"outline",className:"rounded-full",onClick:()=>c([]),children:"清空文件"})]})]})]})]}),e.jsxs(E,{value:"split",className:"space-y-4",children:[e.jsxs(x,{children:[e.jsx(u,{className:"pb-3",children:e.jsx(h,{className:"text-base",children:"上传文档"})}),e.jsx(N,{children:e.jsx(W,{accept:".md,.txt",onFilesSelected:O,description:"支持格式: md, txt"})})]}),f&&e.jsxs(x,{children:[e.jsx(u,{className:"pb-3",children:e.jsx(h,{className:"text-base",children:"已选文件"})}),e.jsxs(N,{className:"space-y-4",children:[e.jsx(_,{file:f,onRemove:()=>C(null),iconColor:"yellow"}),e.jsxs("div",{className:"flex items-center gap-4 p-3 bg-muted/30 rounded-lg",children:[e.jsx("span",{className:"text-sm font-medium",children:"输出格式"}),e.jsx("div",{className:"flex gap-2",children:["md","txt"].map(s=>e.jsxs("button",{className:g("px-4 py-1.5 text-sm border rounded-full transition-colors",F===s?"bg-primary text-primary-foreground border-primary":"border-gray-200 hover:bg-muted hover:border-gray-300"),onClick:()=>z(s),children:[".",s]},s))})]}),e.jsx(m,{className:"w-full rounded-full",onClick:V,disabled:S,children:S?"拆分中...":"拆分并下载"})]})]}),e.jsxs(D,{children:[e.jsx(te,{className:"h-4 w-4"}),e.jsxs(I,{className:"space-y-1",children:[e.jsx("p",{className:"font-medium",children:"拆分说明:"}),e.jsx("p",{className:"text-sm",children:'自动识别"第X章"格式的章节标记(如:第1章、第2章)'}),e.jsx("p",{className:"text-sm",children:"章节标题将作为拆分文件的文件名和首行"}),e.jsx("p",{className:"text-sm",children:"拆分结果打包为 ZIP 文件下载"})]})]})]})]})]})}export{pe as default};
 
1
+ import{j as e}from"./query-BVy6DjHf.js";import{r as o}from"./vendor-BrxV5zWv.js";import{c as g,B as m,C as p,a as u,b as h,d as $,A as D,e as I,T as X,f as Z,g as B,h as E,i as N,E as G}from"./index-glrVO3jG.js";import{F as W}from"./FileDropZone-Bnye6SLQ.js";import{X as H,I as K,V as q,s as J,u as v,b as Q,A as Y,v as ee,w as se,x as te}from"./ui-DGAKiEyf.js";const ae={yellow:"bg-yellow-100 text-yellow-600",green:"bg-green-100 text-green-600",blue:"bg-blue-100 text-blue-600",gray:"bg-gray-100 text-gray-600"},re=l=>{if(l===0)return"0 Bytes";const n=1024,r=["Bytes","KB","MB","GB"],c=Math.floor(Math.log(l)/Math.log(n));return parseFloat((l/Math.pow(n,c)).toFixed(2))+" "+r[c]},le=l=>{var c;const n=((c=l.name.split(".").pop())==null?void 0:c.toLowerCase())||"",r=l.type;return r.startsWith("image/")||["jpg","jpeg","png","gif","bmp","webp","svg"].includes(n)?e.jsx(K,{className:"h-5 w-5"}):r.startsWith("video/")||["mp4","avi","mov","mkv","webm"].includes(n)?e.jsx(q,{className:"h-5 w-5"}):r.startsWith("audio/")||["mp3","wav","aac","flac","ogg"].includes(n)?e.jsx(J,{className:"h-5 w-5"}):e.jsx(v,{className:"h-5 w-5"})},ne=l=>{var c;const n=((c=l.name.split(".").pop())==null?void 0:c.toLowerCase())||"",r=l.type;return r.startsWith("image/")||["jpg","jpeg","png","gif","bmp","webp","svg"].includes(n)?"blue":r.startsWith("audio/")||["mp3","wav","aac","flac","ogg"].includes(n)?"green":["md","txt","html","json","csv"].includes(n)?"yellow":"gray"};function _({file:l,index:n,onRemove:r,iconColor:c,className:x}){const w=c||ne(l),j=le(l);return e.jsxs("div",{className:g("flex items-center gap-3 p-3 bg-muted/30 rounded-lg",x),children:[n!==void 0&&e.jsx("span",{className:g("bg-primary text-primary-foreground text-xs px-2 py-0.5 rounded","font-medium min-w-[24px] text-center"),children:n+1}),e.jsx("div",{className:g("h-10 w-10 rounded-lg flex items-center justify-center",ae[w]),children:j}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"text-sm font-medium truncate",children:l.name}),e.jsx("p",{className:"text-xs text-muted-foreground",children:re(l.size)})]}),e.jsx(m,{variant:"destructive",size:"icon",className:"h-7 w-7",onClick:r,children:e.jsx(H,{className:"h-4 w-4"})})]})}const A="/plugins/document_merge_split_plugin/api";function xe(){const[l,n]=o.useState("merge"),[r,c]=o.useState([]),[x,w]=o.useState("md"),[j,y]=o.useState(!1),[f,C]=o.useState(null),[F,z]=o.useState("md"),[S,k]=o.useState(!1),[b,M]=o.useState(null),d=(s,t)=>{M({type:s,text:t}),setTimeout(()=>M(null),3e3)},R=o.useCallback(s=>{const t=s.filter(a=>a.name.endsWith(".md")||a.name.endsWith(".txt")).filter(a=>!r.find(i=>i.file.name===a.name)).map(a=>({file:a,id:Math.random().toString(36).slice(2)}));c(a=>[...a,...t])},[r]),T=(s,t)=>{const a=s+t;if(a<0||a>=r.length)return;const i=[...r];[i[s],i[a]]=[i[a],i[s]],c(i)},U=s=>{c(t=>t.filter(a=>a.id!==s))},P=async()=>{if(r.length===0){d("error","请至少上传一个文件");return}y(!0);const s=new FormData;r.forEach(t=>s.append("files",t.file)),s.append("order",r.map((t,a)=>a).join(",")),s.append("output_format",x);try{const t=await fetch(`${A}/merge`,{method:"POST",body:s});if(!t.ok)throw new Error("合并失败");const a=await t.blob();L(a,`merged_document.${x}`),d("success","文档合并成功,已开始下载")}catch{d("error","合并失败")}y(!1)},O=o.useCallback(s=>{const t=s[0];t&&(t.name.endsWith(".md")||t.name.endsWith(".txt"))&&C(t)},[]),V=async()=>{if(!f){d("error","请上传要拆分的文件");return}k(!0);const s=new FormData;s.append("file",f),s.append("output_format",F);try{const t=await fetch(`${A}/split`,{method:"POST",body:s});if(!t.ok)throw new Error("拆分失败");const a=await t.blob();L(a,"split_documents.zip"),d("success","文档拆分成功,已开始下载")}catch{d("error","拆分失败")}k(!1)},L=(s,t)=>{const a=URL.createObjectURL(s),i=document.createElement("a");i.href=a,i.download=t,i.click(),URL.revokeObjectURL(a)};return e.jsxs("div",{className:"space-y-6",children:[e.jsx(p,{children:e.jsxs(u,{children:[e.jsxs(h,{className:"flex items-center gap-2",children:[e.jsx(v,{className:"h-5 w-5"}),"文档合并拆分"]}),e.jsx($,{children:"合并多个文档或将单个文档按章节拆分"})]})}),b&&e.jsxs(D,{variant:b.type==="error"?"destructive":"default",children:[b.type==="success"?e.jsx(Q,{className:"h-4 w-4"}):e.jsx(Y,{className:"h-4 w-4"}),e.jsx(I,{children:b.text})]}),e.jsxs(X,{value:l,onValueChange:n,children:[e.jsxs(Z,{children:[e.jsx(B,{value:"merge",children:"合并文档"}),e.jsx(B,{value:"split",children:"拆分文档"})]}),e.jsxs(E,{value:"merge",className:"space-y-4",children:[e.jsxs(p,{children:[e.jsx(u,{className:"pb-3",children:e.jsx(h,{className:"text-base",children:"上传文档"})}),e.jsx(N,{children:e.jsx(W,{accept:".md,.txt",multiple:!0,onFilesSelected:R,description:"支持格式: md, txt"})})]}),e.jsxs(p,{children:[e.jsx(u,{className:"pb-3",children:e.jsx(h,{className:"text-base",children:"文件列表"})}),e.jsxs(N,{className:"space-y-4",children:[r.length===0?e.jsx(G,{icon:e.jsx(v,{className:"h-8 w-8"}),title:"暂无文件",description:"请上传文档文件进行合并"}):e.jsx("div",{className:"space-y-2",children:r.map((s,t)=>e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"flex-1",children:e.jsx(_,{file:s.file,index:t,onRemove:()=>U(s.id),iconColor:"yellow"})}),e.jsxs("div",{className:"flex gap-1",children:[e.jsx(m,{variant:"outline",size:"icon",className:"h-7 w-7 rounded-full",onClick:()=>T(t,-1),disabled:t===0,children:e.jsx(ee,{className:"h-4 w-4"})}),e.jsx(m,{variant:"outline",size:"icon",className:"h-7 w-7 rounded-full",onClick:()=>T(t,1),disabled:t===r.length-1,children:e.jsx(se,{className:"h-4 w-4"})})]})]},s.id))}),e.jsxs("div",{className:"flex items-center gap-4 p-3 bg-muted/30 rounded-lg",children:[e.jsx("span",{className:"text-sm font-medium",children:"输出格式"}),e.jsx("div",{className:"flex gap-2",children:["md","txt"].map(s=>e.jsxs("button",{className:g("px-4 py-1.5 text-sm border rounded-full transition-colors",x===s?"bg-primary text-primary-foreground border-primary":"border-gray-200 hover:bg-muted hover:border-gray-300"),onClick:()=>w(s),children:[".",s]},s))})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(m,{className:"flex-1 rounded-full",onClick:P,disabled:j,children:j?"合并中...":"合并并下载"}),e.jsx(m,{variant:"outline",className:"rounded-full",onClick:()=>c([]),children:"清空文件"})]})]})]})]}),e.jsxs(E,{value:"split",className:"space-y-4",children:[e.jsxs(p,{children:[e.jsx(u,{className:"pb-3",children:e.jsx(h,{className:"text-base",children:"上传文档"})}),e.jsx(N,{children:e.jsx(W,{accept:".md,.txt",onFilesSelected:O,description:"支持格式: md, txt"})})]}),f&&e.jsxs(p,{children:[e.jsx(u,{className:"pb-3",children:e.jsx(h,{className:"text-base",children:"已选文件"})}),e.jsxs(N,{className:"space-y-4",children:[e.jsx(_,{file:f,onRemove:()=>C(null),iconColor:"yellow"}),e.jsxs("div",{className:"flex items-center gap-4 p-3 bg-muted/30 rounded-lg",children:[e.jsx("span",{className:"text-sm font-medium",children:"输出格式"}),e.jsx("div",{className:"flex gap-2",children:["md","txt"].map(s=>e.jsxs("button",{className:g("px-4 py-1.5 text-sm border rounded-full transition-colors",F===s?"bg-primary text-primary-foreground border-primary":"border-gray-200 hover:bg-muted hover:border-gray-300"),onClick:()=>z(s),children:[".",s]},s))})]}),e.jsx(m,{className:"w-full rounded-full",onClick:V,disabled:S,children:S?"拆分中...":"拆分并下载"})]})]}),e.jsxs(D,{children:[e.jsx(te,{className:"h-4 w-4"}),e.jsxs(I,{className:"space-y-1",children:[e.jsx("p",{className:"font-medium",children:"拆分说明:"}),e.jsx("p",{className:"text-sm",children:'自动识别"第X章"格式的章节标记(如:第1章、第2章)'}),e.jsx("p",{className:"text-sm",children:"章节标题将作为拆分文件的文件名和首行"}),e.jsx("p",{className:"text-sm",children:"拆分结果打包为 ZIP 文件下载"})]})]})]})]})]})}export{xe as default};
dist/frontend/assets/{index-BmzOyGUN.js → index-glrVO3jG.js} RENAMED
The diff for this file is too large to render. See raw diff
 
dist/frontend/assets/{index-ClOqV94C.js → index-qBHqhlLD.js} RENAMED
@@ -1 +1 @@
1
- import{j as e}from"./query-BVy6DjHf.js";import{r as n}from"./vendor-BrxV5zWv.js";import{C as $,a as B,b as H,d as W,i as L,A as U,e as M,E as O,c as I,L as A,B as u,j as R}from"./index-BmzOyGUN.js";import{S as J,a as V,b as Z,c as q,d as K}from"./select-DuJYwYQS.js";import{F as Q}from"./FileDropZone-CA8QmgeV.js";import{I as j,a as X,A as Y,y as ee,T as se,D}from"./ui-3Ja5Lmtv.js";const E="/plugins/image_resizer_plugin/api",ae=[16,32,48,128],le=["PNG","JPEG","WEBP"];function de(){const[l,N]=n.useState(null),[w,b]=n.useState(null),[x,T]=n.useState("PNG"),[m,p]=n.useState([]),[c,h]=n.useState(!1),[f,v]=n.useState(!1),[y,S]=n.useState(""),[g,k]=n.useState("info"),o=(s,a)=>{S(s),k(a),setTimeout(()=>{S("")},3e3)},F=n.useCallback(async s=>{var t;const a=s[0];if(a){h(!0);try{const d=new FormData;d.append("file",a);const i=await fetch(`${E}/upload`,{method:"POST",body:d});if(!i.ok)throw new Error("Upload failed");const r=await i.json();b(a),N({fileName:r.filename||r.file_name||a.name,originalWidth:r.width||r.original_width||0,originalHeight:r.height||r.original_height||0,format:r.format||((t=a.type.split("/")[1])==null?void 0:t.toUpperCase())||"PNG",url:r.url||r.file_url||""}),p([]),o("图片上传成功","success")}catch{o("上传失败","error")}h(!1)}},[]),z=()=>{N(null),b(null),p([])},G=async()=>{if(!l||!w)return;h(!0);const s=[];for(const a of ae){const t=l.originalWidth>=a&&l.originalHeight>=a;let d="";if(t)try{const i=new FormData;i.append("file",w),i.append("size",String(a)),i.append("format",x);const r=await fetch(`${E}/generate`,{method:"POST",body:i});if(r.ok){const P=await r.json();d=P.url||P.file_url||""}}catch{}s.push({size:a,format:x,url:d,available:t&&d!==""})}p(s),h(!1)},C=async s=>{var a;if(s.url)try{const t=document.createElement("a");t.href=s.url,t.download=`${(a=l==null?void 0:l.fileName)==null?void 0:a.split(".")[0]}_${s.size}.${s.format.toLowerCase()}`,document.body.appendChild(t),t.click(),document.body.removeChild(t)}catch{o("下载失败","error")}},_=async()=>{const s=m.filter(a=>a.available);if(s.length===0){o("没有可下载的图片","error");return}v(!0),o("下载中...","info");for(const a of s)await C(a),await new Promise(t=>setTimeout(t,100));v(!1),o("下载完成","success")};return e.jsx("div",{className:"space-y-6",children:e.jsxs($,{children:[e.jsxs(B,{children:[e.jsxs(H,{className:"flex items-center gap-2",children:[e.jsx(j,{className:"h-5 w-5"}),"图片缩放"]}),e.jsx(W,{children:"快速生成 16px, 32px, 48px, 128px 尺寸的图片"})]}),e.jsxs(L,{className:"space-y-6",children:[y&&e.jsxs(U,{variant:g==="error"?"destructive":"default",children:[g==="success"?e.jsx(X,{className:"h-4 w-4"}):g==="error"?e.jsx(Y,{className:"h-4 w-4"}):e.jsx(j,{className:"h-4 w-4"}),e.jsx(M,{children:y})]}),!l&&e.jsx(Q,{accept:"image/png,image/jpeg,image/webp",multiple:!1,onFilesSelected:F,description:"支持 PNG, JPG, WEBP 格式",disabled:c}),!l&&!c&&e.jsx(O,{icon:e.jsx(ee,{className:"h-8 w-8"}),title:"开始缩放图片",description:"上传图片后,可生成多种尺寸用于 favicon、图标等场景"}),l&&e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{className:"flex justify-center",children:e.jsx("div",{className:I("relative rounded-xl shadow-sm border p-4 max-w-md","bg-gradient-to-b from-white to-gray-50/30"),children:e.jsx("img",{src:l.url,alt:l.fileName,className:"max-w-full h-auto rounded-lg",style:{maxHeight:"200px"}})})}),e.jsxs("div",{className:"grid grid-cols-2 gap-4 text-sm",children:[e.jsxs("div",{className:"rounded-lg bg-muted/30 p-3",children:[e.jsx("span",{className:"text-muted-foreground",children:"文件名: "}),e.jsx("span",{className:"font-medium",children:l.fileName})]}),e.jsxs("div",{className:"rounded-lg bg-muted/30 p-3",children:[e.jsx("span",{className:"text-muted-foreground",children:"原始尺寸: "}),e.jsxs("span",{className:"font-medium",children:[l.originalWidth," x ",l.originalHeight]})]}),e.jsxs("div",{className:"rounded-lg bg-muted/30 p-3",children:[e.jsx("span",{className:"text-muted-foreground",children:"格式: "}),e.jsx("span",{className:"font-medium",children:l.format})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(A,{children:"输出格式"}),e.jsxs(J,{value:x,onValueChange:T,disabled:c,children:[e.jsx(V,{className:"w-full",children:e.jsx(Z,{})}),e.jsx(q,{children:le.map(s=>e.jsx(K,{value:s,children:s},s))})]})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(u,{onClick:G,disabled:c,className:"flex-1",children:[c?e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"animate-spin h-4 w-4 border-2 border-current border-t-transparent rounded-full"}),"加载中..."]}):e.jsx(j,{className:"h-4 w-4 mr-2"}),"生成尺寸"]}),e.jsxs(u,{variant:"outline",onClick:z,disabled:c,children:[e.jsx(se,{className:"h-4 w-4 mr-2"}),"清空"]})]}),m.length>0&&e.jsxs("div",{className:"space-y-4",children:[e.jsx(A,{children:"可用尺寸:"}),e.jsx("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4",children:m.map(s=>e.jsxs("div",{className:I("rounded-xl border p-4 text-center space-y-3","bg-gradient-to-b from-white to-gray-50/30",s.available?"shadow-sm":"opacity-60"),children:[e.jsxs(R,{variant:s.available?"default":"secondary",className:"text-sm",children:[s.size,"x",s.size]}),e.jsx("div",{className:"text-xs text-muted-foreground",children:s.available?"可下载":"图片过小"}),s.available&&e.jsxs(u,{size:"sm",variant:"outline",onClick:()=>C(s),disabled:f,className:"w-full",children:[e.jsx(D,{className:"h-3 w-3 mr-1"}),"下载"]})]},`${s.size}-${s.format}`))}),e.jsxs(u,{onClick:_,disabled:f||!m.some(s=>s.available),className:"w-full",children:[f?e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"animate-spin h-4 w-4 border-2 border-current border-t-transparent rounded-full"}),"下载中..."]}):e.jsx(D,{className:"h-4 w-4 mr-2"}),"一键下载全部"]})]})]})]})]})})}export{de as default};
 
1
+ import{j as e}from"./query-BVy6DjHf.js";import{r as n}from"./vendor-BrxV5zWv.js";import{C as $,a as B,b as H,d as W,i as L,A as U,e as M,E as O,c as I,L as A,B as u,j as R}from"./index-glrVO3jG.js";import{S as J,a as V,b as Z,c as q,d as K}from"./select-DU-WcEOz.js";import{F as Q}from"./FileDropZone-Bnye6SLQ.js";import{I as j,b as X,A as Y,z as ee,T as se,D}from"./ui-DGAKiEyf.js";const E="/plugins/image_resizer_plugin/api",ae=[16,32,48,128],le=["PNG","JPEG","WEBP"];function de(){const[l,N]=n.useState(null),[w,b]=n.useState(null),[x,T]=n.useState("PNG"),[m,p]=n.useState([]),[c,h]=n.useState(!1),[f,v]=n.useState(!1),[y,S]=n.useState(""),[g,k]=n.useState("info"),o=(s,a)=>{S(s),k(a),setTimeout(()=>{S("")},3e3)},z=n.useCallback(async s=>{var t;const a=s[0];if(a){h(!0);try{const d=new FormData;d.append("file",a);const i=await fetch(`${E}/upload`,{method:"POST",body:d});if(!i.ok)throw new Error("Upload failed");const r=await i.json();b(a),N({fileName:r.filename||r.file_name||a.name,originalWidth:r.width||r.original_width||0,originalHeight:r.height||r.original_height||0,format:r.format||((t=a.type.split("/")[1])==null?void 0:t.toUpperCase())||"PNG",url:r.url||r.file_url||""}),p([]),o("图片上传成功","success")}catch{o("上传失败","error")}h(!1)}},[]),F=()=>{N(null),b(null),p([])},G=async()=>{if(!l||!w)return;h(!0);const s=[];for(const a of ae){const t=l.originalWidth>=a&&l.originalHeight>=a;let d="";if(t)try{const i=new FormData;i.append("file",w),i.append("size",String(a)),i.append("format",x);const r=await fetch(`${E}/generate`,{method:"POST",body:i});if(r.ok){const P=await r.json();d=P.url||P.file_url||""}}catch{}s.push({size:a,format:x,url:d,available:t&&d!==""})}p(s),h(!1)},C=async s=>{var a;if(s.url)try{const t=document.createElement("a");t.href=s.url,t.download=`${(a=l==null?void 0:l.fileName)==null?void 0:a.split(".")[0]}_${s.size}.${s.format.toLowerCase()}`,document.body.appendChild(t),t.click(),document.body.removeChild(t)}catch{o("下载失败","error")}},_=async()=>{const s=m.filter(a=>a.available);if(s.length===0){o("没有可下载的图片","error");return}v(!0),o("下载中...","info");for(const a of s)await C(a),await new Promise(t=>setTimeout(t,100));v(!1),o("下载完成","success")};return e.jsx("div",{className:"space-y-6",children:e.jsxs($,{children:[e.jsxs(B,{children:[e.jsxs(H,{className:"flex items-center gap-2",children:[e.jsx(j,{className:"h-5 w-5"}),"图片缩放"]}),e.jsx(W,{children:"快速生成 16px, 32px, 48px, 128px 尺寸的图片"})]}),e.jsxs(L,{className:"space-y-6",children:[y&&e.jsxs(U,{variant:g==="error"?"destructive":"default",children:[g==="success"?e.jsx(X,{className:"h-4 w-4"}):g==="error"?e.jsx(Y,{className:"h-4 w-4"}):e.jsx(j,{className:"h-4 w-4"}),e.jsx(M,{children:y})]}),!l&&e.jsx(Q,{accept:"image/png,image/jpeg,image/webp",multiple:!1,onFilesSelected:z,description:"支持 PNG, JPG, WEBP 格式",disabled:c}),!l&&!c&&e.jsx(O,{icon:e.jsx(ee,{className:"h-8 w-8"}),title:"开始缩放图片",description:"上传图片后,可生成多种尺寸用于 favicon、图标等场景"}),l&&e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{className:"flex justify-center",children:e.jsx("div",{className:I("relative rounded-xl shadow-sm border p-4 max-w-md","bg-gradient-to-b from-white to-gray-50/30"),children:e.jsx("img",{src:l.url,alt:l.fileName,className:"max-w-full h-auto rounded-lg",style:{maxHeight:"200px"}})})}),e.jsxs("div",{className:"grid grid-cols-2 gap-4 text-sm",children:[e.jsxs("div",{className:"rounded-lg bg-muted/30 p-3",children:[e.jsx("span",{className:"text-muted-foreground",children:"文件名: "}),e.jsx("span",{className:"font-medium",children:l.fileName})]}),e.jsxs("div",{className:"rounded-lg bg-muted/30 p-3",children:[e.jsx("span",{className:"text-muted-foreground",children:"原始尺寸: "}),e.jsxs("span",{className:"font-medium",children:[l.originalWidth," x ",l.originalHeight]})]}),e.jsxs("div",{className:"rounded-lg bg-muted/30 p-3",children:[e.jsx("span",{className:"text-muted-foreground",children:"格式: "}),e.jsx("span",{className:"font-medium",children:l.format})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(A,{children:"输出格式"}),e.jsxs(J,{value:x,onValueChange:T,disabled:c,children:[e.jsx(V,{className:"w-full",children:e.jsx(Z,{})}),e.jsx(q,{children:le.map(s=>e.jsx(K,{value:s,children:s},s))})]})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(u,{onClick:G,disabled:c,className:"flex-1",children:[c?e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"animate-spin h-4 w-4 border-2 border-current border-t-transparent rounded-full"}),"加载中..."]}):e.jsx(j,{className:"h-4 w-4 mr-2"}),"生成尺寸"]}),e.jsxs(u,{variant:"outline",onClick:F,disabled:c,children:[e.jsx(se,{className:"h-4 w-4 mr-2"}),"清空"]})]}),m.length>0&&e.jsxs("div",{className:"space-y-4",children:[e.jsx(A,{children:"可用尺寸:"}),e.jsx("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4",children:m.map(s=>e.jsxs("div",{className:I("rounded-xl border p-4 text-center space-y-3","bg-gradient-to-b from-white to-gray-50/30",s.available?"shadow-sm":"opacity-60"),children:[e.jsxs(R,{variant:s.available?"default":"secondary",className:"text-sm",children:[s.size,"x",s.size]}),e.jsx("div",{className:"text-xs text-muted-foreground",children:s.available?"可下载":"图片过小"}),s.available&&e.jsxs(u,{size:"sm",variant:"outline",onClick:()=>C(s),disabled:f,className:"w-full",children:[e.jsx(D,{className:"h-3 w-3 mr-1"}),"下载"]})]},`${s.size}-${s.format}`))}),e.jsxs(u,{onClick:_,disabled:f||!m.some(s=>s.available),className:"w-full",children:[f?e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"animate-spin h-4 w-4 border-2 border-current border-t-transparent rounded-full"}),"下载中..."]}):e.jsx(D,{className:"h-4 w-4 mr-2"}),"一键下载全部"]})]})]})]})]})})}export{de as default};
dist/frontend/assets/{select-DuJYwYQS.js → select-DU-WcEOz.js} RENAMED
The diff for this file is too large to render. See raw diff
 
dist/frontend/assets/{ui-3Ja5Lmtv.js → ui-DGAKiEyf.js} RENAMED
@@ -158,12 +158,17 @@ import{r as F}from"./vendor-BrxV5zWv.js";/**
158
  *
159
  * This source code is licensed under the ISC license.
160
  * See the LICENSE file in the root directory of this source tree.
161
- */const ft=l("Music",[["path",{d:"M9 18V5l12-2v13",key:"1jmyc2"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}],["circle",{cx:"18",cy:"16",r:"3",key:"1hluhg"}]]);/**
162
  * @license lucide-react v0.344.0 - ISC
163
  *
164
  * This source code is licensed under the ISC license.
165
  * See the LICENSE file in the root directory of this source tree.
166
- */const xt=l("Package",[["path",{d:"m7.5 4.27 9 5.15",key:"1c824w"}],["path",{d:"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z",key:"hh9hay"}],["path",{d:"m3.3 7 8.7 5 8.7-5",key:"g66t2b"}],["path",{d:"M12 22V12",key:"d0xqtd"}]]);/**
 
 
 
 
 
167
  * @license lucide-react v0.344.0 - ISC
168
  *
169
  * This source code is licensed under the ISC license.
@@ -173,69 +178,69 @@ import{r as F}from"./vendor-BrxV5zWv.js";/**
173
  *
174
  * This source code is licensed under the ISC license.
175
  * See the LICENSE file in the root directory of this source tree.
176
- */const kt=l("Play",[["polygon",{points:"5 3 19 12 5 21 5 3",key:"191637"}]]);/**
177
  * @license lucide-react v0.344.0 - ISC
178
  *
179
  * This source code is licensed under the ISC license.
180
  * See the LICENSE file in the root directory of this source tree.
181
- */const wt=l("Plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]);/**
182
  * @license lucide-react v0.344.0 - ISC
183
  *
184
  * This source code is licensed under the ISC license.
185
  * See the LICENSE file in the root directory of this source tree.
186
- */const Mt=l("Puzzle",[["path",{d:"M19.439 7.85c-.049.322.059.648.289.878l1.568 1.568c.47.47.706 1.087.706 1.704s-.235 1.233-.706 1.704l-1.611 1.611a.98.98 0 0 1-.837.276c-.47-.07-.802-.48-.968-.925a2.501 2.501 0 1 0-3.214 3.214c.446.166.855.497.925.968a.979.979 0 0 1-.276.837l-1.61 1.61a2.404 2.404 0 0 1-1.705.707 2.402 2.402 0 0 1-1.704-.706l-1.568-1.568a1.026 1.026 0 0 0-.877-.29c-.493.074-.84.504-1.02.968a2.5 2.5 0 1 1-3.237-3.237c.464-.18.894-.527.967-1.02a1.026 1.026 0 0 0-.289-.877l-1.568-1.568A2.402 2.402 0 0 1 1.998 12c0-.617.236-1.234.706-1.704L4.23 8.77c.24-.24.581-.353.917-.303.515.077.877.528 1.073 1.01a2.5 2.5 0 1 0 3.259-3.259c-.482-.196-.933-.558-1.01-1.073-.05-.336.062-.676.303-.917l1.525-1.525A2.402 2.402 0 0 1 12 1.998c.617 0 1.234.236 1.704.706l1.568 1.568c.23.23.556.338.877.29.493-.074.84-.504 1.02-.968a2.5 2.5 0 1 1 3.237 3.237c-.464.18-.894.527-.967 1.02Z",key:"i0oyt7"}]]);/**
187
  * @license lucide-react v0.344.0 - ISC
188
  *
189
  * This source code is licensed under the ISC license.
190
  * See the LICENSE file in the root directory of this source tree.
191
- */const Ct=l("RefreshCw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]);/**
192
  * @license lucide-react v0.344.0 - ISC
193
  *
194
  * This source code is licensed under the ISC license.
195
  * See the LICENSE file in the root directory of this source tree.
196
- */const zt=l("Search",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]]);/**
197
  * @license lucide-react v0.344.0 - ISC
198
  *
199
  * This source code is licensed under the ISC license.
200
  * See the LICENSE file in the root directory of this source tree.
201
- */const At=l("Send",[["path",{d:"m22 2-7 20-4-9-9-4Z",key:"1q3vgg"}],["path",{d:"M22 2 11 13",key:"nzbqef"}]]);/**
202
  * @license lucide-react v0.344.0 - ISC
203
  *
204
  * This source code is licensed under the ISC license.
205
  * See the LICENSE file in the root directory of this source tree.
206
- */const St=l("Settings",[["path",{d:"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z",key:"1qme2f"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);/**
207
  * @license lucide-react v0.344.0 - ISC
208
  *
209
  * This source code is licensed under the ISC license.
210
  * See the LICENSE file in the root directory of this source tree.
211
- */const jt=l("Square",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]]);/**
212
  * @license lucide-react v0.344.0 - ISC
213
  *
214
  * This source code is licensed under the ISC license.
215
  * See the LICENSE file in the root directory of this source tree.
216
- */const Pt=l("Trash2",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]]);/**
217
  * @license lucide-react v0.344.0 - ISC
218
  *
219
  * This source code is licensed under the ISC license.
220
  * See the LICENSE file in the root directory of this source tree.
221
- */const Lt=l("Type",[["polyline",{points:"4 7 4 4 20 4 20 7",key:"1nosan"}],["line",{x1:"9",x2:"15",y1:"20",y2:"20",key:"swin9y"}],["line",{x1:"12",x2:"12",y1:"4",y2:"20",key:"1tx1rr"}]]);/**
222
  * @license lucide-react v0.344.0 - ISC
223
  *
224
  * This source code is licensed under the ISC license.
225
  * See the LICENSE file in the root directory of this source tree.
226
- */const qt=l("Upload",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"17 8 12 3 7 8",key:"t8dd8p"}],["line",{x1:"12",x2:"12",y1:"3",y2:"15",key:"widbto"}]]);/**
227
  * @license lucide-react v0.344.0 - ISC
228
  *
229
  * This source code is licensed under the ISC license.
230
  * See the LICENSE file in the root directory of this source tree.
231
- */const Gt=l("Video",[["path",{d:"m22 8-6 4 6 4V8Z",key:"50v9me"}],["rect",{width:"14",height:"12",x:"2",y:"6",rx:"2",ry:"2",key:"1rqjg6"}]]);/**
232
  * @license lucide-react v0.344.0 - ISC
233
  *
234
  * This source code is licensed under the ISC license.
235
  * See the LICENSE file in the root directory of this source tree.
236
- */const Rt=l("XCircle",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"m9 9 6 6",key:"z0biqf"}]]);/**
237
  * @license lucide-react v0.344.0 - ISC
238
  *
239
  * This source code is licensed under the ISC license.
240
  * See the LICENSE file in the root directory of this source tree.
241
- */const Vt=l("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);function re(e){var r,t,o="";if(typeof e=="string"||typeof e=="number")o+=e;else if(typeof e=="object")if(Array.isArray(e)){var s=e.length;for(r=0;r<s;r++)e[r]&&(t=re(e[r]))&&(o&&(o+=" "),o+=t)}else for(t in e)e[t]&&(o&&(o+=" "),o+=t);return o}function de(){for(var e,r,t=0,o="",s=arguments.length;t<s;t++)(e=arguments[t])&&(r=re(e))&&(o&&(o+=" "),o+=r);return o}const B="-",pe=e=>{const r=he(e),{conflictingClassGroups:t,conflictingClassGroupModifiers:o}=e;return{getClassGroupId:i=>{const a=i.split(B);return a[0]===""&&a.length!==1&&a.shift(),oe(a,r)||ue(i)},getConflictingClassGroupIds:(i,a)=>{const p=t[i]||[];return a&&o[i]?[...p,...o[i]]:p}}},oe=(e,r)=>{var i;if(e.length===0)return r.classGroupId;const t=e[0],o=r.nextPart.get(t),s=o?oe(e.slice(1),o):void 0;if(s)return s;if(r.validators.length===0)return;const n=e.join(B);return(i=r.validators.find(({validator:a})=>a(n)))==null?void 0:i.classGroupId},Y=/^\[(.+)\]$/,ue=e=>{if(Y.test(e)){const r=Y.exec(e)[1],t=r==null?void 0:r.substring(0,r.indexOf(":"));if(t)return"arbitrary.."+t}},he=e=>{const{theme:r,prefix:t}=e,o={nextPart:new Map,validators:[]};return ge(Object.entries(e.classGroups),t).forEach(([n,i])=>{$(i,o,n,r)}),o},$=(e,r,t,o)=>{e.forEach(s=>{if(typeof s=="string"){const n=s===""?r:D(r,s);n.classGroupId=t;return}if(typeof s=="function"){if(ye(s)){$(s(o),r,t,o);return}r.validators.push({validator:s,classGroupId:t});return}Object.entries(s).forEach(([n,i])=>{$(i,D(r,n),t,o)})})},D=(e,r)=>{let t=e;return r.split(B).forEach(o=>{t.nextPart.has(o)||t.nextPart.set(o,{nextPart:new Map,validators:[]}),t=t.nextPart.get(o)}),t},ye=e=>e.isThemeGetter,ge=(e,r)=>r?e.map(([t,o])=>{const s=o.map(n=>typeof n=="string"?r+n:typeof n=="object"?Object.fromEntries(Object.entries(n).map(([i,a])=>[r+i,a])):n);return[t,s]}):e,be=e=>{if(e<1)return{get:()=>{},set:()=>{}};let r=0,t=new Map,o=new Map;const s=(n,i)=>{t.set(n,i),r++,r>e&&(r=0,o=t,t=new Map)};return{get(n){let i=t.get(n);if(i!==void 0)return i;if((i=o.get(n))!==void 0)return s(n,i),i},set(n,i){t.has(n)?t.set(n,i):s(n,i)}}},ne="!",me=e=>{const{separator:r,experimentalParseClassName:t}=e,o=r.length===1,s=r[0],n=r.length,i=a=>{const p=[];let d=0,y=0,f;for(let u=0;u<a.length;u++){let x=a[u];if(d===0){if(x===s&&(o||a.slice(u,u+n)===r)){p.push(a.slice(y,u)),y=u+n;continue}if(x==="/"){f=u;continue}}x==="["?d++:x==="]"&&d--}const b=p.length===0?a:a.substring(y),w=b.startsWith(ne),v=w?b.substring(1):b,m=f&&f>y?f-y:void 0;return{modifiers:p,hasImportantModifier:w,baseClassName:v,maybePostfixModifierPosition:m}};return t?a=>t({className:a,parseClassName:i}):i},fe=e=>{if(e.length<=1)return e;const r=[];let t=[];return e.forEach(o=>{o[0]==="["?(r.push(...t.sort(),o),t=[]):t.push(o)}),r.push(...t.sort()),r},xe=e=>({cache:be(e.cacheSize),parseClassName:me(e),...pe(e)}),ve=/\s+/,ke=(e,r)=>{const{parseClassName:t,getClassGroupId:o,getConflictingClassGroupIds:s}=r,n=[],i=e.trim().split(ve);let a="";for(let p=i.length-1;p>=0;p-=1){const d=i[p],{modifiers:y,hasImportantModifier:f,baseClassName:b,maybePostfixModifierPosition:w}=t(d);let v=!!w,m=o(v?b.substring(0,w):b);if(!m){if(!v){a=d+(a.length>0?" "+a:a);continue}if(m=o(b),!m){a=d+(a.length>0?" "+a:a);continue}v=!1}const u=fe(y).join(":"),x=f?u+ne:u,k=x+m;if(n.includes(k))continue;n.push(k);const L=s(m,v);for(let S=0;S<L.length;++S){const V=L[S];n.push(x+V)}a=d+(a.length>0?" "+a:a)}return a};function we(){let e=0,r,t,o="";for(;e<arguments.length;)(r=arguments[e++])&&(t=ae(r))&&(o&&(o+=" "),o+=t);return o}const ae=e=>{if(typeof e=="string")return e;let r,t="";for(let o=0;o<e.length;o++)e[o]&&(r=ae(e[o]))&&(t&&(t+=" "),t+=r);return t};function Me(e,...r){let t,o,s,n=i;function i(p){const d=r.reduce((y,f)=>f(y),e());return t=xe(d),o=t.cache.get,s=t.cache.set,n=a,a(p)}function a(p){const d=o(p);if(d)return d;const y=ke(p,t);return s(p,y),y}return function(){return n(we.apply(null,arguments))}}const h=e=>{const r=t=>t[e]||[];return r.isThemeGetter=!0,r},se=/^\[(?:([a-z-]+):)?(.+)\]$/i,Ce=/^\d+\/\d+$/,ze=new Set(["px","full","screen"]),Ae=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,Se=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,je=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,Pe=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,Le=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,C=e=>j(e)||ze.has(e)||Ce.test(e),z=e=>P(e,"length",He),j=e=>!!e&&!Number.isNaN(Number(e)),W=e=>P(e,"number",j),G=e=>!!e&&Number.isInteger(Number(e)),qe=e=>e.endsWith("%")&&j(e.slice(0,-1)),c=e=>se.test(e),A=e=>Ae.test(e),Ge=new Set(["length","size","percentage"]),Re=e=>P(e,Ge,le),Ve=e=>P(e,"position",le),Ie=new Set(["image","url"]),Te=e=>P(e,Ie,Oe),Ne=e=>P(e,"",Ee),R=()=>!0,P=(e,r,t)=>{const o=se.exec(e);return o?o[1]?typeof r=="string"?o[1]===r:r.has(o[1]):t(o[2]):!1},He=e=>Se.test(e)&&!je.test(e),le=()=>!1,Ee=e=>Pe.test(e),Oe=e=>Le.test(e),Fe=()=>{const e=h("colors"),r=h("spacing"),t=h("blur"),o=h("brightness"),s=h("borderColor"),n=h("borderRadius"),i=h("borderSpacing"),a=h("borderWidth"),p=h("contrast"),d=h("grayscale"),y=h("hueRotate"),f=h("invert"),b=h("gap"),w=h("gradientColorStops"),v=h("gradientColorStopPositions"),m=h("inset"),u=h("margin"),x=h("opacity"),k=h("padding"),L=h("saturate"),S=h("scale"),V=h("sepia"),U=h("skew"),Z=h("space"),_=h("translate"),N=()=>["auto","contain","none"],H=()=>["auto","hidden","clip","visible","scroll"],E=()=>["auto",c,r],g=()=>[c,r],X=()=>["",C,z],I=()=>["auto",j,c],J=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],T=()=>["solid","dashed","dotted","double","none"],K=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],O=()=>["start","end","center","between","around","evenly","stretch"],q=()=>["","0",c],Q=()=>["auto","avoid","all","avoid-page","page","left","right","column"],M=()=>[j,c];return{cacheSize:500,separator:":",theme:{colors:[R],spacing:[C,z],blur:["none","",A,c],brightness:M(),borderColor:[e],borderRadius:["none","","full",A,c],borderSpacing:g(),borderWidth:X(),contrast:M(),grayscale:q(),hueRotate:M(),invert:q(),gap:g(),gradientColorStops:[e],gradientColorStopPositions:[qe,z],inset:E(),margin:E(),opacity:M(),padding:g(),saturate:M(),scale:M(),sepia:q(),skew:M(),space:g(),translate:g()},classGroups:{aspect:[{aspect:["auto","square","video",c]}],container:["container"],columns:[{columns:[A]}],"break-after":[{"break-after":Q()}],"break-before":[{"break-before":Q()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...J(),c]}],overflow:[{overflow:H()}],"overflow-x":[{"overflow-x":H()}],"overflow-y":[{"overflow-y":H()}],overscroll:[{overscroll:N()}],"overscroll-x":[{"overscroll-x":N()}],"overscroll-y":[{"overscroll-y":N()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[m]}],"inset-x":[{"inset-x":[m]}],"inset-y":[{"inset-y":[m]}],start:[{start:[m]}],end:[{end:[m]}],top:[{top:[m]}],right:[{right:[m]}],bottom:[{bottom:[m]}],left:[{left:[m]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",G,c]}],basis:[{basis:E()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",c]}],grow:[{grow:q()}],shrink:[{shrink:q()}],order:[{order:["first","last","none",G,c]}],"grid-cols":[{"grid-cols":[R]}],"col-start-end":[{col:["auto",{span:["full",G,c]},c]}],"col-start":[{"col-start":I()}],"col-end":[{"col-end":I()}],"grid-rows":[{"grid-rows":[R]}],"row-start-end":[{row:["auto",{span:[G,c]},c]}],"row-start":[{"row-start":I()}],"row-end":[{"row-end":I()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",c]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",c]}],gap:[{gap:[b]}],"gap-x":[{"gap-x":[b]}],"gap-y":[{"gap-y":[b]}],"justify-content":[{justify:["normal",...O()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...O(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...O(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[k]}],px:[{px:[k]}],py:[{py:[k]}],ps:[{ps:[k]}],pe:[{pe:[k]}],pt:[{pt:[k]}],pr:[{pr:[k]}],pb:[{pb:[k]}],pl:[{pl:[k]}],m:[{m:[u]}],mx:[{mx:[u]}],my:[{my:[u]}],ms:[{ms:[u]}],me:[{me:[u]}],mt:[{mt:[u]}],mr:[{mr:[u]}],mb:[{mb:[u]}],ml:[{ml:[u]}],"space-x":[{"space-x":[Z]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[Z]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",c,r]}],"min-w":[{"min-w":[c,r,"min","max","fit"]}],"max-w":[{"max-w":[c,r,"none","full","min","max","fit","prose",{screen:[A]},A]}],h:[{h:[c,r,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[c,r,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[c,r,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[c,r,"auto","min","max","fit"]}],"font-size":[{text:["base",A,z]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",W]}],"font-family":[{font:[R]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",c]}],"line-clamp":[{"line-clamp":["none",j,W]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",C,c]}],"list-image":[{"list-image":["none",c]}],"list-style-type":[{list:["none","disc","decimal",c]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[e]}],"placeholder-opacity":[{"placeholder-opacity":[x]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[e]}],"text-opacity":[{"text-opacity":[x]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...T(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",C,z]}],"underline-offset":[{"underline-offset":["auto",C,c]}],"text-decoration-color":[{decoration:[e]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:g()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",c]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",c]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[x]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...J(),Ve]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",Re]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},Te]}],"bg-color":[{bg:[e]}],"gradient-from-pos":[{from:[v]}],"gradient-via-pos":[{via:[v]}],"gradient-to-pos":[{to:[v]}],"gradient-from":[{from:[w]}],"gradient-via":[{via:[w]}],"gradient-to":[{to:[w]}],rounded:[{rounded:[n]}],"rounded-s":[{"rounded-s":[n]}],"rounded-e":[{"rounded-e":[n]}],"rounded-t":[{"rounded-t":[n]}],"rounded-r":[{"rounded-r":[n]}],"rounded-b":[{"rounded-b":[n]}],"rounded-l":[{"rounded-l":[n]}],"rounded-ss":[{"rounded-ss":[n]}],"rounded-se":[{"rounded-se":[n]}],"rounded-ee":[{"rounded-ee":[n]}],"rounded-es":[{"rounded-es":[n]}],"rounded-tl":[{"rounded-tl":[n]}],"rounded-tr":[{"rounded-tr":[n]}],"rounded-br":[{"rounded-br":[n]}],"rounded-bl":[{"rounded-bl":[n]}],"border-w":[{border:[a]}],"border-w-x":[{"border-x":[a]}],"border-w-y":[{"border-y":[a]}],"border-w-s":[{"border-s":[a]}],"border-w-e":[{"border-e":[a]}],"border-w-t":[{"border-t":[a]}],"border-w-r":[{"border-r":[a]}],"border-w-b":[{"border-b":[a]}],"border-w-l":[{"border-l":[a]}],"border-opacity":[{"border-opacity":[x]}],"border-style":[{border:[...T(),"hidden"]}],"divide-x":[{"divide-x":[a]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[a]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[x]}],"divide-style":[{divide:T()}],"border-color":[{border:[s]}],"border-color-x":[{"border-x":[s]}],"border-color-y":[{"border-y":[s]}],"border-color-s":[{"border-s":[s]}],"border-color-e":[{"border-e":[s]}],"border-color-t":[{"border-t":[s]}],"border-color-r":[{"border-r":[s]}],"border-color-b":[{"border-b":[s]}],"border-color-l":[{"border-l":[s]}],"divide-color":[{divide:[s]}],"outline-style":[{outline:["",...T()]}],"outline-offset":[{"outline-offset":[C,c]}],"outline-w":[{outline:[C,z]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:X()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[e]}],"ring-opacity":[{"ring-opacity":[x]}],"ring-offset-w":[{"ring-offset":[C,z]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",A,Ne]}],"shadow-color":[{shadow:[R]}],opacity:[{opacity:[x]}],"mix-blend":[{"mix-blend":[...K(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":K()}],filter:[{filter:["","none"]}],blur:[{blur:[t]}],brightness:[{brightness:[o]}],contrast:[{contrast:[p]}],"drop-shadow":[{"drop-shadow":["","none",A,c]}],grayscale:[{grayscale:[d]}],"hue-rotate":[{"hue-rotate":[y]}],invert:[{invert:[f]}],saturate:[{saturate:[L]}],sepia:[{sepia:[V]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[t]}],"backdrop-brightness":[{"backdrop-brightness":[o]}],"backdrop-contrast":[{"backdrop-contrast":[p]}],"backdrop-grayscale":[{"backdrop-grayscale":[d]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[y]}],"backdrop-invert":[{"backdrop-invert":[f]}],"backdrop-opacity":[{"backdrop-opacity":[x]}],"backdrop-saturate":[{"backdrop-saturate":[L]}],"backdrop-sepia":[{"backdrop-sepia":[V]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[i]}],"border-spacing-x":[{"border-spacing-x":[i]}],"border-spacing-y":[{"border-spacing-y":[i]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",c]}],duration:[{duration:M()}],ease:[{ease:["linear","in","out","in-out",c]}],delay:[{delay:M()}],animate:[{animate:["none","spin","ping","pulse","bounce",c]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[S]}],"scale-x":[{"scale-x":[S]}],"scale-y":[{"scale-y":[S]}],rotate:[{rotate:[G,c]}],"translate-x":[{"translate-x":[_]}],"translate-y":[{"translate-y":[_]}],"skew-x":[{"skew-x":[U]}],"skew-y":[{"skew-y":[U]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",c]}],accent:[{accent:["auto",e]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",c]}],"caret-color":[{caret:[e]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":g()}],"scroll-mx":[{"scroll-mx":g()}],"scroll-my":[{"scroll-my":g()}],"scroll-ms":[{"scroll-ms":g()}],"scroll-me":[{"scroll-me":g()}],"scroll-mt":[{"scroll-mt":g()}],"scroll-mr":[{"scroll-mr":g()}],"scroll-mb":[{"scroll-mb":g()}],"scroll-ml":[{"scroll-ml":g()}],"scroll-p":[{"scroll-p":g()}],"scroll-px":[{"scroll-px":g()}],"scroll-py":[{"scroll-py":g()}],"scroll-ps":[{"scroll-ps":g()}],"scroll-pe":[{"scroll-pe":g()}],"scroll-pt":[{"scroll-pt":g()}],"scroll-pr":[{"scroll-pr":g()}],"scroll-pb":[{"scroll-pb":g()}],"scroll-pl":[{"scroll-pl":g()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",c]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[C,z,W]}],stroke:[{stroke:[e,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}},It=Me(Fe),ee=e=>typeof e=="boolean"?`${e}`:e===0?"0":e,te=de,Tt=(e,r)=>t=>{var o;if((r==null?void 0:r.variants)==null)return te(e,t==null?void 0:t.class,t==null?void 0:t.className);const{variants:s,defaultVariants:n}=r,i=Object.keys(s).map(d=>{const y=t==null?void 0:t[d],f=n==null?void 0:n[d];if(y===null)return null;const b=ee(y)||ee(f);return s[d][b]}),a=t&&Object.entries(t).reduce((d,y)=>{let[f,b]=y;return b===void 0||(d[f]=b),d},{}),p=r==null||(o=r.compoundVariants)===null||o===void 0?void 0:o.reduce((d,y)=>{let{class:f,className:b,...w}=y;return Object.entries(w).every(v=>{let[m,u]=v;return Array.isArray(u)?u.includes({...n,...a}[m]):{...n,...a}[m]===u})?[...d,f,b]:d},[]);return te(e,i,p,t==null?void 0:t.class,t==null?void 0:t.className)};export{$e as A,Xe as B,Ye as C,ot as D,nt as E,lt as F,ct as G,ut as H,yt as I,Ue as J,Ke as K,mt as L,ft as M,pt as N,jt as O,xt as P,At as Q,Ct as R,St as S,Pt as T,qt as U,Gt as V,Rt as X,Je as a,Tt as b,de as c,kt as d,vt as e,bt as f,Vt as g,wt as h,zt as i,Mt as j,at as k,it as l,et as m,Be as n,rt as o,Ze as p,dt as q,_e as r,st as s,It as t,De as u,Qe as v,gt as w,tt as x,ht as y,Lt as z};
 
158
  *
159
  * This source code is licensed under the ISC license.
160
  * See the LICENSE file in the root directory of this source tree.
161
+ */const ft=l("Menu",[["line",{x1:"4",x2:"20",y1:"12",y2:"12",key:"1e0a9i"}],["line",{x1:"4",x2:"20",y1:"6",y2:"6",key:"1owob3"}],["line",{x1:"4",x2:"20",y1:"18",y2:"18",key:"yk5zj1"}]]);/**
162
  * @license lucide-react v0.344.0 - ISC
163
  *
164
  * This source code is licensed under the ISC license.
165
  * See the LICENSE file in the root directory of this source tree.
166
+ */const xt=l("Music",[["path",{d:"M9 18V5l12-2v13",key:"1jmyc2"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}],["circle",{cx:"18",cy:"16",r:"3",key:"1hluhg"}]]);/**
167
+ * @license lucide-react v0.344.0 - ISC
168
+ *
169
+ * This source code is licensed under the ISC license.
170
+ * See the LICENSE file in the root directory of this source tree.
171
+ */const kt=l("Package",[["path",{d:"m7.5 4.27 9 5.15",key:"1c824w"}],["path",{d:"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z",key:"hh9hay"}],["path",{d:"m3.3 7 8.7 5 8.7-5",key:"g66t2b"}],["path",{d:"M12 22V12",key:"d0xqtd"}]]);/**
172
  * @license lucide-react v0.344.0 - ISC
173
  *
174
  * This source code is licensed under the ISC license.
 
178
  *
179
  * This source code is licensed under the ISC license.
180
  * See the LICENSE file in the root directory of this source tree.
181
+ */const wt=l("Play",[["polygon",{points:"5 3 19 12 5 21 5 3",key:"191637"}]]);/**
182
  * @license lucide-react v0.344.0 - ISC
183
  *
184
  * This source code is licensed under the ISC license.
185
  * See the LICENSE file in the root directory of this source tree.
186
+ */const Mt=l("Plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]);/**
187
  * @license lucide-react v0.344.0 - ISC
188
  *
189
  * This source code is licensed under the ISC license.
190
  * See the LICENSE file in the root directory of this source tree.
191
+ */const Ct=l("Puzzle",[["path",{d:"M19.439 7.85c-.049.322.059.648.289.878l1.568 1.568c.47.47.706 1.087.706 1.704s-.235 1.233-.706 1.704l-1.611 1.611a.98.98 0 0 1-.837.276c-.47-.07-.802-.48-.968-.925a2.501 2.501 0 1 0-3.214 3.214c.446.166.855.497.925.968a.979.979 0 0 1-.276.837l-1.61 1.61a2.404 2.404 0 0 1-1.705.707 2.402 2.402 0 0 1-1.704-.706l-1.568-1.568a1.026 1.026 0 0 0-.877-.29c-.493.074-.84.504-1.02.968a2.5 2.5 0 1 1-3.237-3.237c.464-.18.894-.527.967-1.02a1.026 1.026 0 0 0-.289-.877l-1.568-1.568A2.402 2.402 0 0 1 1.998 12c0-.617.236-1.234.706-1.704L4.23 8.77c.24-.24.581-.353.917-.303.515.077.877.528 1.073 1.01a2.5 2.5 0 1 0 3.259-3.259c-.482-.196-.933-.558-1.01-1.073-.05-.336.062-.676.303-.917l1.525-1.525A2.402 2.402 0 0 1 12 1.998c.617 0 1.234.236 1.704.706l1.568 1.568c.23.23.556.338.877.29.493-.074.84-.504 1.02-.968a2.5 2.5 0 1 1 3.237 3.237c-.464.18-.894.527-.967 1.02Z",key:"i0oyt7"}]]);/**
192
  * @license lucide-react v0.344.0 - ISC
193
  *
194
  * This source code is licensed under the ISC license.
195
  * See the LICENSE file in the root directory of this source tree.
196
+ */const zt=l("RefreshCw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]);/**
197
  * @license lucide-react v0.344.0 - ISC
198
  *
199
  * This source code is licensed under the ISC license.
200
  * See the LICENSE file in the root directory of this source tree.
201
+ */const At=l("Search",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]]);/**
202
  * @license lucide-react v0.344.0 - ISC
203
  *
204
  * This source code is licensed under the ISC license.
205
  * See the LICENSE file in the root directory of this source tree.
206
+ */const St=l("Send",[["path",{d:"m22 2-7 20-4-9-9-4Z",key:"1q3vgg"}],["path",{d:"M22 2 11 13",key:"nzbqef"}]]);/**
207
  * @license lucide-react v0.344.0 - ISC
208
  *
209
  * This source code is licensed under the ISC license.
210
  * See the LICENSE file in the root directory of this source tree.
211
+ */const jt=l("Settings",[["path",{d:"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z",key:"1qme2f"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);/**
212
  * @license lucide-react v0.344.0 - ISC
213
  *
214
  * This source code is licensed under the ISC license.
215
  * See the LICENSE file in the root directory of this source tree.
216
+ */const Pt=l("Square",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]]);/**
217
  * @license lucide-react v0.344.0 - ISC
218
  *
219
  * This source code is licensed under the ISC license.
220
  * See the LICENSE file in the root directory of this source tree.
221
+ */const Lt=l("Trash2",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]]);/**
222
  * @license lucide-react v0.344.0 - ISC
223
  *
224
  * This source code is licensed under the ISC license.
225
  * See the LICENSE file in the root directory of this source tree.
226
+ */const qt=l("Type",[["polyline",{points:"4 7 4 4 20 4 20 7",key:"1nosan"}],["line",{x1:"9",x2:"15",y1:"20",y2:"20",key:"swin9y"}],["line",{x1:"12",x2:"12",y1:"4",y2:"20",key:"1tx1rr"}]]);/**
227
  * @license lucide-react v0.344.0 - ISC
228
  *
229
  * This source code is licensed under the ISC license.
230
  * See the LICENSE file in the root directory of this source tree.
231
+ */const Gt=l("Upload",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"17 8 12 3 7 8",key:"t8dd8p"}],["line",{x1:"12",x2:"12",y1:"3",y2:"15",key:"widbto"}]]);/**
232
  * @license lucide-react v0.344.0 - ISC
233
  *
234
  * This source code is licensed under the ISC license.
235
  * See the LICENSE file in the root directory of this source tree.
236
+ */const Rt=l("Video",[["path",{d:"m22 8-6 4 6 4V8Z",key:"50v9me"}],["rect",{width:"14",height:"12",x:"2",y:"6",rx:"2",ry:"2",key:"1rqjg6"}]]);/**
237
  * @license lucide-react v0.344.0 - ISC
238
  *
239
  * This source code is licensed under the ISC license.
240
  * See the LICENSE file in the root directory of this source tree.
241
+ */const Vt=l("XCircle",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"m9 9 6 6",key:"z0biqf"}]]);/**
242
  * @license lucide-react v0.344.0 - ISC
243
  *
244
  * This source code is licensed under the ISC license.
245
  * See the LICENSE file in the root directory of this source tree.
246
+ */const It=l("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);function re(e){var r,t,o="";if(typeof e=="string"||typeof e=="number")o+=e;else if(typeof e=="object")if(Array.isArray(e)){var s=e.length;for(r=0;r<s;r++)e[r]&&(t=re(e[r]))&&(o&&(o+=" "),o+=t)}else for(t in e)e[t]&&(o&&(o+=" "),o+=t);return o}function de(){for(var e,r,t=0,o="",s=arguments.length;t<s;t++)(e=arguments[t])&&(r=re(e))&&(o&&(o+=" "),o+=r);return o}const B="-",pe=e=>{const r=he(e),{conflictingClassGroups:t,conflictingClassGroupModifiers:o}=e;return{getClassGroupId:i=>{const a=i.split(B);return a[0]===""&&a.length!==1&&a.shift(),oe(a,r)||ue(i)},getConflictingClassGroupIds:(i,a)=>{const p=t[i]||[];return a&&o[i]?[...p,...o[i]]:p}}},oe=(e,r)=>{var i;if(e.length===0)return r.classGroupId;const t=e[0],o=r.nextPart.get(t),s=o?oe(e.slice(1),o):void 0;if(s)return s;if(r.validators.length===0)return;const n=e.join(B);return(i=r.validators.find(({validator:a})=>a(n)))==null?void 0:i.classGroupId},Y=/^\[(.+)\]$/,ue=e=>{if(Y.test(e)){const r=Y.exec(e)[1],t=r==null?void 0:r.substring(0,r.indexOf(":"));if(t)return"arbitrary.."+t}},he=e=>{const{theme:r,prefix:t}=e,o={nextPart:new Map,validators:[]};return ge(Object.entries(e.classGroups),t).forEach(([n,i])=>{$(i,o,n,r)}),o},$=(e,r,t,o)=>{e.forEach(s=>{if(typeof s=="string"){const n=s===""?r:D(r,s);n.classGroupId=t;return}if(typeof s=="function"){if(ye(s)){$(s(o),r,t,o);return}r.validators.push({validator:s,classGroupId:t});return}Object.entries(s).forEach(([n,i])=>{$(i,D(r,n),t,o)})})},D=(e,r)=>{let t=e;return r.split(B).forEach(o=>{t.nextPart.has(o)||t.nextPart.set(o,{nextPart:new Map,validators:[]}),t=t.nextPart.get(o)}),t},ye=e=>e.isThemeGetter,ge=(e,r)=>r?e.map(([t,o])=>{const s=o.map(n=>typeof n=="string"?r+n:typeof n=="object"?Object.fromEntries(Object.entries(n).map(([i,a])=>[r+i,a])):n);return[t,s]}):e,be=e=>{if(e<1)return{get:()=>{},set:()=>{}};let r=0,t=new Map,o=new Map;const s=(n,i)=>{t.set(n,i),r++,r>e&&(r=0,o=t,t=new Map)};return{get(n){let i=t.get(n);if(i!==void 0)return i;if((i=o.get(n))!==void 0)return s(n,i),i},set(n,i){t.has(n)?t.set(n,i):s(n,i)}}},ne="!",me=e=>{const{separator:r,experimentalParseClassName:t}=e,o=r.length===1,s=r[0],n=r.length,i=a=>{const p=[];let d=0,y=0,f;for(let u=0;u<a.length;u++){let x=a[u];if(d===0){if(x===s&&(o||a.slice(u,u+n)===r)){p.push(a.slice(y,u)),y=u+n;continue}if(x==="/"){f=u;continue}}x==="["?d++:x==="]"&&d--}const b=p.length===0?a:a.substring(y),w=b.startsWith(ne),k=w?b.substring(1):b,m=f&&f>y?f-y:void 0;return{modifiers:p,hasImportantModifier:w,baseClassName:k,maybePostfixModifierPosition:m}};return t?a=>t({className:a,parseClassName:i}):i},fe=e=>{if(e.length<=1)return e;const r=[];let t=[];return e.forEach(o=>{o[0]==="["?(r.push(...t.sort(),o),t=[]):t.push(o)}),r.push(...t.sort()),r},xe=e=>({cache:be(e.cacheSize),parseClassName:me(e),...pe(e)}),ke=/\s+/,ve=(e,r)=>{const{parseClassName:t,getClassGroupId:o,getConflictingClassGroupIds:s}=r,n=[],i=e.trim().split(ke);let a="";for(let p=i.length-1;p>=0;p-=1){const d=i[p],{modifiers:y,hasImportantModifier:f,baseClassName:b,maybePostfixModifierPosition:w}=t(d);let k=!!w,m=o(k?b.substring(0,w):b);if(!m){if(!k){a=d+(a.length>0?" "+a:a);continue}if(m=o(b),!m){a=d+(a.length>0?" "+a:a);continue}k=!1}const u=fe(y).join(":"),x=f?u+ne:u,v=x+m;if(n.includes(v))continue;n.push(v);const L=s(m,k);for(let S=0;S<L.length;++S){const V=L[S];n.push(x+V)}a=d+(a.length>0?" "+a:a)}return a};function we(){let e=0,r,t,o="";for(;e<arguments.length;)(r=arguments[e++])&&(t=ae(r))&&(o&&(o+=" "),o+=t);return o}const ae=e=>{if(typeof e=="string")return e;let r,t="";for(let o=0;o<e.length;o++)e[o]&&(r=ae(e[o]))&&(t&&(t+=" "),t+=r);return t};function Me(e,...r){let t,o,s,n=i;function i(p){const d=r.reduce((y,f)=>f(y),e());return t=xe(d),o=t.cache.get,s=t.cache.set,n=a,a(p)}function a(p){const d=o(p);if(d)return d;const y=ve(p,t);return s(p,y),y}return function(){return n(we.apply(null,arguments))}}const h=e=>{const r=t=>t[e]||[];return r.isThemeGetter=!0,r},se=/^\[(?:([a-z-]+):)?(.+)\]$/i,Ce=/^\d+\/\d+$/,ze=new Set(["px","full","screen"]),Ae=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,Se=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,je=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,Pe=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,Le=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,C=e=>j(e)||ze.has(e)||Ce.test(e),z=e=>P(e,"length",He),j=e=>!!e&&!Number.isNaN(Number(e)),W=e=>P(e,"number",j),G=e=>!!e&&Number.isInteger(Number(e)),qe=e=>e.endsWith("%")&&j(e.slice(0,-1)),c=e=>se.test(e),A=e=>Ae.test(e),Ge=new Set(["length","size","percentage"]),Re=e=>P(e,Ge,le),Ve=e=>P(e,"position",le),Ie=new Set(["image","url"]),Te=e=>P(e,Ie,Oe),Ne=e=>P(e,"",Ee),R=()=>!0,P=(e,r,t)=>{const o=se.exec(e);return o?o[1]?typeof r=="string"?o[1]===r:r.has(o[1]):t(o[2]):!1},He=e=>Se.test(e)&&!je.test(e),le=()=>!1,Ee=e=>Pe.test(e),Oe=e=>Le.test(e),Fe=()=>{const e=h("colors"),r=h("spacing"),t=h("blur"),o=h("brightness"),s=h("borderColor"),n=h("borderRadius"),i=h("borderSpacing"),a=h("borderWidth"),p=h("contrast"),d=h("grayscale"),y=h("hueRotate"),f=h("invert"),b=h("gap"),w=h("gradientColorStops"),k=h("gradientColorStopPositions"),m=h("inset"),u=h("margin"),x=h("opacity"),v=h("padding"),L=h("saturate"),S=h("scale"),V=h("sepia"),U=h("skew"),Z=h("space"),_=h("translate"),N=()=>["auto","contain","none"],H=()=>["auto","hidden","clip","visible","scroll"],E=()=>["auto",c,r],g=()=>[c,r],X=()=>["",C,z],I=()=>["auto",j,c],J=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],T=()=>["solid","dashed","dotted","double","none"],K=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],O=()=>["start","end","center","between","around","evenly","stretch"],q=()=>["","0",c],Q=()=>["auto","avoid","all","avoid-page","page","left","right","column"],M=()=>[j,c];return{cacheSize:500,separator:":",theme:{colors:[R],spacing:[C,z],blur:["none","",A,c],brightness:M(),borderColor:[e],borderRadius:["none","","full",A,c],borderSpacing:g(),borderWidth:X(),contrast:M(),grayscale:q(),hueRotate:M(),invert:q(),gap:g(),gradientColorStops:[e],gradientColorStopPositions:[qe,z],inset:E(),margin:E(),opacity:M(),padding:g(),saturate:M(),scale:M(),sepia:q(),skew:M(),space:g(),translate:g()},classGroups:{aspect:[{aspect:["auto","square","video",c]}],container:["container"],columns:[{columns:[A]}],"break-after":[{"break-after":Q()}],"break-before":[{"break-before":Q()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...J(),c]}],overflow:[{overflow:H()}],"overflow-x":[{"overflow-x":H()}],"overflow-y":[{"overflow-y":H()}],overscroll:[{overscroll:N()}],"overscroll-x":[{"overscroll-x":N()}],"overscroll-y":[{"overscroll-y":N()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[m]}],"inset-x":[{"inset-x":[m]}],"inset-y":[{"inset-y":[m]}],start:[{start:[m]}],end:[{end:[m]}],top:[{top:[m]}],right:[{right:[m]}],bottom:[{bottom:[m]}],left:[{left:[m]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",G,c]}],basis:[{basis:E()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",c]}],grow:[{grow:q()}],shrink:[{shrink:q()}],order:[{order:["first","last","none",G,c]}],"grid-cols":[{"grid-cols":[R]}],"col-start-end":[{col:["auto",{span:["full",G,c]},c]}],"col-start":[{"col-start":I()}],"col-end":[{"col-end":I()}],"grid-rows":[{"grid-rows":[R]}],"row-start-end":[{row:["auto",{span:[G,c]},c]}],"row-start":[{"row-start":I()}],"row-end":[{"row-end":I()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",c]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",c]}],gap:[{gap:[b]}],"gap-x":[{"gap-x":[b]}],"gap-y":[{"gap-y":[b]}],"justify-content":[{justify:["normal",...O()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...O(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...O(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[v]}],px:[{px:[v]}],py:[{py:[v]}],ps:[{ps:[v]}],pe:[{pe:[v]}],pt:[{pt:[v]}],pr:[{pr:[v]}],pb:[{pb:[v]}],pl:[{pl:[v]}],m:[{m:[u]}],mx:[{mx:[u]}],my:[{my:[u]}],ms:[{ms:[u]}],me:[{me:[u]}],mt:[{mt:[u]}],mr:[{mr:[u]}],mb:[{mb:[u]}],ml:[{ml:[u]}],"space-x":[{"space-x":[Z]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[Z]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",c,r]}],"min-w":[{"min-w":[c,r,"min","max","fit"]}],"max-w":[{"max-w":[c,r,"none","full","min","max","fit","prose",{screen:[A]},A]}],h:[{h:[c,r,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[c,r,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[c,r,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[c,r,"auto","min","max","fit"]}],"font-size":[{text:["base",A,z]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",W]}],"font-family":[{font:[R]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",c]}],"line-clamp":[{"line-clamp":["none",j,W]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",C,c]}],"list-image":[{"list-image":["none",c]}],"list-style-type":[{list:["none","disc","decimal",c]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[e]}],"placeholder-opacity":[{"placeholder-opacity":[x]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[e]}],"text-opacity":[{"text-opacity":[x]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...T(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",C,z]}],"underline-offset":[{"underline-offset":["auto",C,c]}],"text-decoration-color":[{decoration:[e]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:g()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",c]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",c]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[x]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...J(),Ve]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",Re]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},Te]}],"bg-color":[{bg:[e]}],"gradient-from-pos":[{from:[k]}],"gradient-via-pos":[{via:[k]}],"gradient-to-pos":[{to:[k]}],"gradient-from":[{from:[w]}],"gradient-via":[{via:[w]}],"gradient-to":[{to:[w]}],rounded:[{rounded:[n]}],"rounded-s":[{"rounded-s":[n]}],"rounded-e":[{"rounded-e":[n]}],"rounded-t":[{"rounded-t":[n]}],"rounded-r":[{"rounded-r":[n]}],"rounded-b":[{"rounded-b":[n]}],"rounded-l":[{"rounded-l":[n]}],"rounded-ss":[{"rounded-ss":[n]}],"rounded-se":[{"rounded-se":[n]}],"rounded-ee":[{"rounded-ee":[n]}],"rounded-es":[{"rounded-es":[n]}],"rounded-tl":[{"rounded-tl":[n]}],"rounded-tr":[{"rounded-tr":[n]}],"rounded-br":[{"rounded-br":[n]}],"rounded-bl":[{"rounded-bl":[n]}],"border-w":[{border:[a]}],"border-w-x":[{"border-x":[a]}],"border-w-y":[{"border-y":[a]}],"border-w-s":[{"border-s":[a]}],"border-w-e":[{"border-e":[a]}],"border-w-t":[{"border-t":[a]}],"border-w-r":[{"border-r":[a]}],"border-w-b":[{"border-b":[a]}],"border-w-l":[{"border-l":[a]}],"border-opacity":[{"border-opacity":[x]}],"border-style":[{border:[...T(),"hidden"]}],"divide-x":[{"divide-x":[a]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[a]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[x]}],"divide-style":[{divide:T()}],"border-color":[{border:[s]}],"border-color-x":[{"border-x":[s]}],"border-color-y":[{"border-y":[s]}],"border-color-s":[{"border-s":[s]}],"border-color-e":[{"border-e":[s]}],"border-color-t":[{"border-t":[s]}],"border-color-r":[{"border-r":[s]}],"border-color-b":[{"border-b":[s]}],"border-color-l":[{"border-l":[s]}],"divide-color":[{divide:[s]}],"outline-style":[{outline:["",...T()]}],"outline-offset":[{"outline-offset":[C,c]}],"outline-w":[{outline:[C,z]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:X()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[e]}],"ring-opacity":[{"ring-opacity":[x]}],"ring-offset-w":[{"ring-offset":[C,z]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",A,Ne]}],"shadow-color":[{shadow:[R]}],opacity:[{opacity:[x]}],"mix-blend":[{"mix-blend":[...K(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":K()}],filter:[{filter:["","none"]}],blur:[{blur:[t]}],brightness:[{brightness:[o]}],contrast:[{contrast:[p]}],"drop-shadow":[{"drop-shadow":["","none",A,c]}],grayscale:[{grayscale:[d]}],"hue-rotate":[{"hue-rotate":[y]}],invert:[{invert:[f]}],saturate:[{saturate:[L]}],sepia:[{sepia:[V]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[t]}],"backdrop-brightness":[{"backdrop-brightness":[o]}],"backdrop-contrast":[{"backdrop-contrast":[p]}],"backdrop-grayscale":[{"backdrop-grayscale":[d]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[y]}],"backdrop-invert":[{"backdrop-invert":[f]}],"backdrop-opacity":[{"backdrop-opacity":[x]}],"backdrop-saturate":[{"backdrop-saturate":[L]}],"backdrop-sepia":[{"backdrop-sepia":[V]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[i]}],"border-spacing-x":[{"border-spacing-x":[i]}],"border-spacing-y":[{"border-spacing-y":[i]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",c]}],duration:[{duration:M()}],ease:[{ease:["linear","in","out","in-out",c]}],delay:[{delay:M()}],animate:[{animate:["none","spin","ping","pulse","bounce",c]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[S]}],"scale-x":[{"scale-x":[S]}],"scale-y":[{"scale-y":[S]}],rotate:[{rotate:[G,c]}],"translate-x":[{"translate-x":[_]}],"translate-y":[{"translate-y":[_]}],"skew-x":[{"skew-x":[U]}],"skew-y":[{"skew-y":[U]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",c]}],accent:[{accent:["auto",e]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",c]}],"caret-color":[{caret:[e]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":g()}],"scroll-mx":[{"scroll-mx":g()}],"scroll-my":[{"scroll-my":g()}],"scroll-ms":[{"scroll-ms":g()}],"scroll-me":[{"scroll-me":g()}],"scroll-mt":[{"scroll-mt":g()}],"scroll-mr":[{"scroll-mr":g()}],"scroll-mb":[{"scroll-mb":g()}],"scroll-ml":[{"scroll-ml":g()}],"scroll-p":[{"scroll-p":g()}],"scroll-px":[{"scroll-px":g()}],"scroll-py":[{"scroll-py":g()}],"scroll-ps":[{"scroll-ps":g()}],"scroll-pe":[{"scroll-pe":g()}],"scroll-pt":[{"scroll-pt":g()}],"scroll-pr":[{"scroll-pr":g()}],"scroll-pb":[{"scroll-pb":g()}],"scroll-pl":[{"scroll-pl":g()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",c]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[C,z,W]}],stroke:[{stroke:[e,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}},Tt=Me(Fe),ee=e=>typeof e=="boolean"?`${e}`:e===0?"0":e,te=de,Nt=(e,r)=>t=>{var o;if((r==null?void 0:r.variants)==null)return te(e,t==null?void 0:t.class,t==null?void 0:t.className);const{variants:s,defaultVariants:n}=r,i=Object.keys(s).map(d=>{const y=t==null?void 0:t[d],f=n==null?void 0:n[d];if(y===null)return null;const b=ee(y)||ee(f);return s[d][b]}),a=t&&Object.entries(t).reduce((d,y)=>{let[f,b]=y;return b===void 0||(d[f]=b),d},{}),p=r==null||(o=r.compoundVariants)===null||o===void 0?void 0:o.reduce((d,y)=>{let{class:f,className:b,...w}=y;return Object.entries(w).every(k=>{let[m,u]=k;return Array.isArray(u)?u.includes({...n,...a}[m]):{...n,...a}[m]===u})?[...d,f,b]:d},[]);return te(e,i,p,t==null?void 0:t.class,t==null?void 0:t.className)};export{$e as A,Xe as B,Ye as C,ot as D,nt as E,lt as F,ct as G,ut as H,yt as I,qt as J,Ue as K,mt as L,ft as M,Ke as N,pt as O,kt as P,Pt as Q,zt as R,jt as S,Lt as T,Gt as U,Rt as V,St as W,It as X,Nt as a,Je as b,de as c,Vt as d,wt as e,vt as f,bt as g,Mt as h,At as i,Ct as j,at as k,it as l,et as m,Be as n,rt as o,Ze as p,dt as q,_e as r,xt as s,Tt as t,st as u,De as v,Qe as w,gt as x,tt as y,ht as z};
dist/frontend/index.html CHANGED
@@ -8,11 +8,11 @@
8
  <link rel="preconnect" href="https://fonts.googleapis.com">
9
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
11
- <script type="module" crossorigin src="/assets/index-BmzOyGUN.js"></script>
12
  <link rel="modulepreload" crossorigin href="/assets/vendor-BrxV5zWv.js">
13
  <link rel="modulepreload" crossorigin href="/assets/query-BVy6DjHf.js">
14
- <link rel="modulepreload" crossorigin href="/assets/ui-3Ja5Lmtv.js">
15
- <link rel="stylesheet" crossorigin href="/assets/index-DfP-YqFs.css">
16
  </head>
17
  <body>
18
  <div id="root"></div>
 
8
  <link rel="preconnect" href="https://fonts.googleapis.com">
9
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
11
+ <script type="module" crossorigin src="/assets/index-glrVO3jG.js"></script>
12
  <link rel="modulepreload" crossorigin href="/assets/vendor-BrxV5zWv.js">
13
  <link rel="modulepreload" crossorigin href="/assets/query-BVy6DjHf.js">
14
+ <link rel="modulepreload" crossorigin href="/assets/ui-DGAKiEyf.js">
15
+ <link rel="stylesheet" crossorigin href="/assets/index-DH3iE3Xn.css">
16
  </head>
17
  <body>
18
  <div id="root"></div>
frontend/src/components/features/InstallModal.tsx CHANGED
@@ -105,7 +105,7 @@ export function InstallModal({ open, onClose, onSuccess }: InstallModalProps) {
105
  onClose();
106
  }
107
  }}>
108
- <DialogContent className="sm:max-w-[500px]">
109
  <DialogHeader>
110
  <DialogTitle>安装插件</DialogTitle>
111
  </DialogHeader>
 
105
  onClose();
106
  }
107
  }}>
108
+ <DialogContent className="max-w-[calc(100vw-2rem)] sm:max-w-[500px]">
109
  <DialogHeader>
110
  <DialogTitle>安装插件</DialogTitle>
111
  </DialogHeader>
frontend/src/components/layout/Layout.tsx CHANGED
@@ -9,23 +9,32 @@ export function Layout() {
9
  return (
10
  <div className="min-h-screen bg-background">
11
  <Navbar />
12
- <div className="relative">
13
- {/* 侧栏使用绝对定位,不影响主内容布局 */}
14
- <div
15
- className={`fixed left-0 top-14 bottom-0 z-30 transition-transform duration-300 ${
16
- sidebarOpen ? 'translate-x-0' : '-translate-x-full'
17
- }`}
18
- >
19
- <Sidebar />
20
- </div>
21
-
22
- {/* 主内容区域始终在视口居中 */}
23
- <main className="min-h-[calc(100vh-3.5rem)]">
24
- <div className="container mx-auto px-4 py-6">
25
- <Outlet />
26
- </div>
27
- </main>
28
  </div>
 
 
 
 
 
 
 
 
 
 
 
29
  </div>
30
  );
31
  }
 
9
  return (
10
  <div className="min-h-screen bg-background">
11
  <Navbar />
12
+ {/* 侧边栏:小屏幕下作为覆盖层,大屏幕下固定定位 */}
13
+ <div
14
+ className={`fixed left-0 top-14 bottom-0 z-30 transition-transform duration-300 ${
15
+ sidebarOpen ? 'translate-x-0' : '-translate-x-full'
16
+ }`}
17
+ >
18
+ <Sidebar />
19
+ {/* 小屏幕下侧边栏打开时添加遮罩层 */}
20
+ {sidebarOpen && (
21
+ <div
22
+ className="fixed inset-0 top-14 bg-black/50 z-20 md:hidden"
23
+ onClick={() => useUIStore.getState().setSidebarOpen(false)}
24
+ />
25
+ )}
 
 
26
  </div>
27
+
28
+ {/* 主内容区域:大屏幕下根据侧边栏状态调整边距,小屏幕下始终全宽 */}
29
+ <main
30
+ className={`min-h-[calc(100vh-3.5rem)] transition-all duration-300 ${
31
+ sidebarOpen ? 'ml-0 md:ml-64' : 'ml-0'
32
+ }`}
33
+ >
34
+ <div className="p-4 md:p-6">
35
+ <Outlet />
36
+ </div>
37
+ </main>
38
  </div>
39
  );
40
  }
frontend/src/components/layout/Navbar.tsx CHANGED
@@ -1,9 +1,12 @@
1
  import { Link, useLocation } from 'react-router-dom';
2
- import { LayoutTemplate } from 'lucide-react';
3
  import { cn } from '@lib/utils';
 
 
4
 
5
  export function Navbar() {
6
  const location = useLocation();
 
7
 
8
  const navItems = [
9
  { path: '/', label: '首页' },
@@ -13,13 +16,26 @@ export function Navbar() {
13
 
14
  return (
15
  <nav className="sticky top-0 z-50 border-b bg-card">
16
- <div className="container mx-auto px-4 h-14 flex items-center justify-between">
17
- <Link to="/" className="flex items-center gap-2 font-semibold">
18
- <LayoutTemplate className="h-5 w-5" />
19
- <span>Message Function Center</span>
20
- </Link>
 
 
 
 
 
 
 
21
 
22
- <ul className="flex items-center gap-6">
 
 
 
 
 
 
23
  {navItems.map((item) => (
24
  <li key={item.path}>
25
  <Link
 
1
  import { Link, useLocation } from 'react-router-dom';
2
+ import { LayoutTemplate, Menu, X } from 'lucide-react';
3
  import { cn } from '@lib/utils';
4
+ import { useUIStore } from '@stores/uiStore';
5
+ import { Button } from '@components/ui/button';
6
 
7
  export function Navbar() {
8
  const location = useLocation();
9
+ const { sidebarOpen, toggleSidebar } = useUIStore();
10
 
11
  const navItems = [
12
  { path: '/', label: '首页' },
 
16
 
17
  return (
18
  <nav className="sticky top-0 z-50 border-b bg-card">
19
+ <div className="px-4 h-14 flex items-center justify-between">
20
+ <div className="flex items-center gap-2">
21
+ {/* 侧边栏切换按钮 */}
22
+ <Button
23
+ variant="ghost"
24
+ size="icon"
25
+ onClick={toggleSidebar}
26
+ className="md:flex"
27
+ aria-label={sidebarOpen ? '关闭侧边栏' : '打开侧边栏'}
28
+ >
29
+ {sidebarOpen ? <X className="h-5 w-5" /> : <Menu className="h-5 w-5" />}
30
+ </Button>
31
 
32
+ <Link to="/" className="flex items-center gap-2 font-semibold">
33
+ <LayoutTemplate className="h-5 w-5" />
34
+ <span className="hidden sm:inline">Message Function Center</span>
35
+ </Link>
36
+ </div>
37
+
38
+ <ul className="flex items-center gap-4 md:gap-6">
39
  {navItems.map((item) => (
40
  <li key={item.path}>
41
  <Link
frontend/src/stores/uiStore.ts CHANGED
@@ -12,10 +12,18 @@ interface UIState {
12
  setTheme: (theme: 'light' | 'dark') => void;
13
  }
14
 
 
 
 
 
 
 
 
 
15
  export const useUIStore = create<UIState>()(
16
  persist(
17
  (set) => ({
18
- sidebarOpen: true,
19
  language: 'zh-CN',
20
  theme: 'light',
21
 
 
12
  setTheme: (theme: 'light' | 'dark') => void;
13
  }
14
 
15
+ // 初始化时检测屏幕宽度,小屏幕下默认关闭侧边栏
16
+ const getInitialSidebarState = () => {
17
+ if (typeof window !== 'undefined') {
18
+ return window.innerWidth >= 768; // md breakpoint
19
+ }
20
+ return true;
21
+ };
22
+
23
  export const useUIStore = create<UIState>()(
24
  persist(
25
  (set) => ({
26
+ sidebarOpen: getInitialSidebarState(),
27
  language: 'zh-CN',
28
  theme: 'light',
29
 
skills-lock.json CHANGED
@@ -6,15 +6,45 @@
6
  "sourceType": "github",
7
  "computedHash": "516bd2154eb843a8240e43d5b285229129853114ad7075a5e141e1c08e408c84"
8
  },
 
 
 
 
 
 
 
 
 
 
 
 
9
  "mcp-builder": {
10
  "source": "anthropics/skills",
11
  "sourceType": "github",
12
  "computedHash": "f08cbdec74dba480ec5217363446dae154b7576b8c3d9b4cb17aff234f15973b"
13
  },
 
 
 
 
 
 
 
 
 
 
 
 
14
  "shadcn": {
15
  "source": "shadcn/ui",
16
  "sourceType": "github",
17
  "computedHash": "642a177bee320618caa49f5106cadb4e7594c606e867f61ba7b56d19cf745cd5"
 
 
 
 
 
 
18
  }
19
  }
20
  }
 
6
  "sourceType": "github",
7
  "computedHash": "516bd2154eb843a8240e43d5b285229129853114ad7075a5e141e1c08e408c84"
8
  },
9
+ "implementation-planning": {
10
+ "source": "ANIAN0/pick-skills",
11
+ "sourceType": "github",
12
+ "skillPath": "skills/implementation-planning/SKILL.md",
13
+ "computedHash": "a6150b56c8505508c78ac65be350730b2a717017f4e5f06c749dc37e98b23fb7"
14
+ },
15
+ "issue-troubleshooting": {
16
+ "source": "ANIAN0/pick-skills",
17
+ "sourceType": "github",
18
+ "skillPath": "skills/issue-troubleshooting/SKILL.md",
19
+ "computedHash": "8ff137138fdd9d80ad696284c96e02fd876eb5094297c47c0c8d52a1685a2406"
20
+ },
21
  "mcp-builder": {
22
  "source": "anthropics/skills",
23
  "sourceType": "github",
24
  "computedHash": "f08cbdec74dba480ec5217363446dae154b7576b8c3d9b4cb17aff234f15973b"
25
  },
26
+ "plan-execution": {
27
+ "source": "ANIAN0/pick-skills",
28
+ "sourceType": "github",
29
+ "skillPath": "skills/plan-execution/SKILL.md",
30
+ "computedHash": "774c4934e196c08f5a2a7c32da9b2681ed793067bba44f47865ab686d521ebb8"
31
+ },
32
+ "requirements-workshop": {
33
+ "source": "ANIAN0/pick-skills",
34
+ "sourceType": "github",
35
+ "skillPath": "skills/requirements-workshop/SKILL.md",
36
+ "computedHash": "80e794c02e0da1d28e291529ac3469011e8a9da5334d8130940dd75b0ee41104"
37
+ },
38
  "shadcn": {
39
  "source": "shadcn/ui",
40
  "sourceType": "github",
41
  "computedHash": "642a177bee320618caa49f5106cadb4e7594c606e867f61ba7b56d19cf745cd5"
42
+ },
43
+ "tech-design": {
44
+ "source": "ANIAN0/pick-skills",
45
+ "sourceType": "github",
46
+ "skillPath": "skills/tech-design/SKILL.md",
47
+ "computedHash": "d703af1f63e97c80cb98be1cb96f56ce3e99dbbaaa3a13ecde244b9ade65344a"
48
  }
49
  }
50
  }
需求.md DELETED
@@ -1,596 +0,0 @@
1
- 1. 现有首页没有内容
2
- - 新增启用插件列表,展示插件名称和描述,点击可打开插件页面
3
- - 新增用户反馈记录和提交用户反馈的输入框。反馈记录记录包括用户名、反馈内容、反馈时间。
4
-
5
- 参考UI
6
- <!DOCTYPE html>
7
- <html lang="zh-CN">
8
- <head>
9
- <meta charset="UTF-8">
10
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
11
- <title>念的工具集 - 首页</title>
12
- <style>
13
- * {
14
- margin: 0;
15
- padding: 0;
16
- box-sizing: border-box;
17
- }
18
-
19
- body {
20
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans SC', Roboto, sans-serif;
21
- background: #f5f7fa;
22
- color: #2c3e50;
23
- line-height: 1.6;
24
- }
25
-
26
- /* 导航栏样式 - 保持原有设计 */
27
- .navbar {
28
- width: 100%;
29
- height: 70px;
30
- background: #2C3E50;
31
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.10);
32
- position: fixed;
33
- top: 0;
34
- left: 0;
35
- z-index: 1000;
36
- }
37
-
38
- .navbar-container {
39
- width: 1200px;
40
- height: 38px;
41
- margin: 16px auto;
42
- padding: 0 16px;
43
- display: flex;
44
- justify-content: space-between;
45
- align-items: center;
46
- }
47
-
48
- .logo {
49
- color: white;
50
- font-size: 24px;
51
- font-weight: 700;
52
- line-height: 32px;
53
- }
54
-
55
- .nav-menu {
56
- display: flex;
57
- gap: 32px;
58
- }
59
-
60
- .nav-item {
61
- padding: 8px 16px;
62
- border-radius: 4px;
63
- color: white;
64
- font-size: 16px;
65
- font-family: Roboto;
66
- font-weight: 400;
67
- text-decoration: none;
68
- transition: background-color 0.2s ease;
69
- cursor: pointer;
70
- }
71
-
72
- .nav-item:hover {
73
- background-color: rgba(255, 255, 255, 0.1);
74
- }
75
-
76
- .nav-item.active {
77
- background-color: rgba(255, 255, 255, 0.15);
78
- }
79
-
80
- /* 主内容区域 */
81
- .main-container {
82
- width: 1200px;
83
- margin: 100px auto 40px;
84
- padding: 0 16px;
85
- }
86
-
87
- /* 页面标题 */
88
- .page-header {
89
- margin-bottom: 32px;
90
- }
91
-
92
- .page-title {
93
- font-size: 32px;
94
- font-weight: 700;
95
- color: #2c3e50;
96
- margin-bottom: 8px;
97
- }
98
-
99
- .page-subtitle {
100
- font-size: 16px;
101
- color: #6c7a89;
102
- }
103
-
104
- /* 网格布局 */
105
- .content-grid {
106
- display: grid;
107
- grid-template-columns: 2fr 1fr;
108
- gap: 24px;
109
- }
110
-
111
- /* 卡片基础样式 */
112
- .card {
113
- background: white;
114
- border-radius: 8px;
115
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
116
- border: 1px solid #e0e6ed;
117
- transition: box-shadow 0.2s ease;
118
- }
119
-
120
- .card:hover {
121
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
122
- }
123
-
124
- .card-header {
125
- padding: 20px 24px;
126
- border-bottom: 1px solid #e0e6ed;
127
- }
128
-
129
- .card-body {
130
- padding: 20px 24px;
131
- }
132
-
133
- .card-title {
134
- font-size: 20px;
135
- font-weight: 600;
136
- color: #2c3e50;
137
- }
138
-
139
- /* 插件列表样式 */
140
- .plugin-grid {
141
- display: grid;
142
- grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
143
- gap: 16px;
144
- }
145
-
146
- .plugin-card {
147
- padding: 20px;
148
- border-radius: 8px;
149
- background: white;
150
- border: 1px solid #e0e6ed;
151
- cursor: pointer;
152
- transition: all 0.2s ease;
153
- }
154
-
155
- .plugin-card:hover {
156
- border-color: #3498db;
157
- box-shadow: 0 4px 12px rgba(52, 152, 219, 0.15);
158
- transform: translateY(-2px);
159
- }
160
-
161
- .plugin-name {
162
- font-size: 18px;
163
- font-weight: 600;
164
- color: #2c3e50;
165
- margin-bottom: 8px;
166
- }
167
-
168
- .plugin-description {
169
- font-size: 14px;
170
- color: #6c7a89;
171
- line-height: 1.5;
172
- }
173
-
174
- .plugin-status {
175
- display: inline-flex;
176
- align-items: center;
177
- gap: 4px;
178
- margin-top: 12px;
179
- font-size: 12px;
180
- color: #27ae60;
181
- font-weight: 500;
182
- }
183
-
184
- .status-dot {
185
- width: 6px;
186
- height: 6px;
187
- border-radius: 50%;
188
- background: #27ae60;
189
- }
190
-
191
- /* 反馈表单样式 */
192
- .feedback-form {
193
- margin-bottom: 24px;
194
- }
195
-
196
- .form-group {
197
- margin-bottom: 16px;
198
- }
199
-
200
- .form-label {
201
- display: block;
202
- font-size: 14px;
203
- font-weight: 500;
204
- color: #2c3e50;
205
- margin-bottom: 6px;
206
- }
207
-
208
- .form-input {
209
- width: 100%;
210
- padding: 10px 12px;
211
- border: 1px solid #d0d8e0;
212
- border-radius: 6px;
213
- font-size: 14px;
214
- font-family: inherit;
215
- transition: border-color 0.2s ease;
216
- }
217
-
218
- .form-input:focus {
219
- outline: none;
220
- border-color: #3498db;
221
- box-shadow: 0 0 0 3px rgba(52, 152, 219, 0.15);
222
- }
223
-
224
- .form-textarea {
225
- width: 100%;
226
- min-height: 80px;
227
- padding: 12px;
228
- border: 1px solid #d0d8e0;
229
- border-radius: 6px;
230
- font-size: 14px;
231
- font-family: inherit;
232
- resize: vertical;
233
- transition: border-color 0.2s ease;
234
- }
235
-
236
- .form-textarea:focus {
237
- outline: none;
238
- border-color: #3498db;
239
- box-shadow: 0 0 0 3px rgba(52, 152, 219, 0.15);
240
- }
241
-
242
- .submit-btn {
243
- width: 100%;
244
- padding: 10px 20px;
245
- background: #3498db;
246
- color: white;
247
- border: none;
248
- border-radius: 6px;
249
- font-size: 14px;
250
- font-weight: 500;
251
- cursor: pointer;
252
- transition: background-color 0.2s ease;
253
- }
254
-
255
- .submit-btn:hover {
256
- background: #2980b9;
257
- }
258
-
259
- .submit-btn:active {
260
- transform: scale(0.98);
261
- }
262
-
263
- /* 反馈记录样式 */
264
- .feedback-list {
265
- max-height: 500px;
266
- overflow-y: auto;
267
- }
268
-
269
- .feedback-item {
270
- padding: 16px;
271
- border-bottom: 1px solid #f0f4f8;
272
- transition: background-color 0.2s ease;
273
- }
274
-
275
- .feedback-item:hover {
276
- background: #f8fafc;
277
- }
278
-
279
- .feedback-item:last-child {
280
- border-bottom: none;
281
- }
282
-
283
- .feedback-header {
284
- display: flex;
285
- justify-content: space-between;
286
- align-items: center;
287
- margin-bottom: 8px;
288
- }
289
-
290
- .feedback-user {
291
- display: flex;
292
- align-items: center;
293
- gap: 8px;
294
- }
295
-
296
- .user-avatar {
297
- width: 32px;
298
- height: 32px;
299
- border-radius: 50%;
300
- background: #3498db;
301
- display: flex;
302
- align-items: center;
303
- justify-content: center;
304
- color: white;
305
- font-size: 14px;
306
- font-weight: 600;
307
- }
308
-
309
- .user-name {
310
- font-size: 14px;
311
- font-weight: 500;
312
- color: #2c3e50;
313
- }
314
-
315
- .feedback-time {
316
- font-size: 12px;
317
- color: #95a5a6;
318
- }
319
-
320
- .feedback-content {
321
- font-size: 14px;
322
- color: #6c7a89;
323
- line-height: 1.5;
324
- margin-left: 40px;
325
- }
326
-
327
- /* 滚动条样式 */
328
- .feedback-list::-webkit-scrollbar {
329
- width: 6px;
330
- }
331
-
332
- .feedback-list::-webkit-scrollbar-track {
333
- background: #f0f4f8;
334
- border-radius: 3px;
335
- }
336
-
337
- .feedback-list::-webkit-scrollbar-thumb {
338
- background: #d0d8e0;
339
- border-radius: 3px;
340
- }
341
-
342
- .feedback-list::-webkit-scrollbar-thumb:hover {
343
- background: #b0b8c0;
344
- }
345
-
346
- /* 空状态提示 */
347
- .empty-state {
348
- text-align: center;
349
- padding: 40px;
350
- color: #95a5a6;
351
- }
352
-
353
- .empty-icon {
354
- font-size: 48px;
355
- margin-bottom: 16px;
356
- opacity: 0.5;
357
- }
358
-
359
- /* 响应式设计 */
360
- @media (max-width: 1240px) {
361
- .navbar-container,
362
- .main-container {
363
- width: 100%;
364
- padding-left: 20px;
365
- padding-right: 20px;
366
- }
367
- }
368
-
369
- @media (max-width: 968px) {
370
- .content-grid {
371
- grid-template-columns: 1fr;
372
- }
373
-
374
- .plugin-grid {
375
- grid-template-columns: 1fr;
376
- }
377
- }
378
- </style>
379
- </head>
380
- <body>
381
- <!-- 导航栏 -->
382
- <nav class="navbar">
383
- <div class="navbar-container">
384
- <div class="logo">念的工具集</div>
385
- <div class="nav-menu">
386
- <a class="nav-item active">首页</a>
387
- <a class="nav-item">插件管理</a>
388
- <a class="nav-item">框架管理</a>
389
- </div>
390
- </div>
391
- </nav>
392
-
393
- <!-- 主内容区域 -->
394
- <div class="main-container">
395
- <!-- 页面标题 -->
396
- <div class="page-header">
397
- <h1 class="page-title">欢迎使用工具集</h1>
398
- <p class="page-subtitle">管理您的插件并查看用户反馈</p>
399
- </div>
400
-
401
- <!-- 内容网格 -->
402
- <div class="content-grid">
403
- <!-- 左侧:插件列表 -->
404
- <div class="card">
405
- <div class="card-header">
406
- <h2 class="card-title">已启用插件</h2>
407
- </div>
408
- <div class="card-body">
409
- <div class="plugin-grid">
410
- <div class="plugin-card" onclick="openPlugin('data-viewer')">
411
- <div class="plugin-name">数据查看器</div>
412
- <div class="plugin-description">实时查看和分析系统数据,支持多种格式导出</div>
413
- <div class="plugin-status">
414
- <span class="status-dot"></span>
415
- <span>已启用</span>
416
- </div>
417
- </div>
418
-
419
- <div class="plugin-card" onclick="openPlugin('task-scheduler')">
420
- <div class="plugin-name">任务调度器</div>
421
- <div class="plugin-description">自动化任务管理,支持定时执行和优先级设置</div>
422
- <div class="plugin-status">
423
- <span class="status-dot"></span>
424
- <span>已启用</span>
425
- </div>
426
- </div>
427
-
428
- <div class="plugin-card" onclick="openPlugin('file-manager')">
429
- <div class="plugin-name">文件管理器</div>
430
- <div class="plugin-description">集中管理所有文件,支持版本控制和快速检索</div>
431
- <div class="plugin-status">
432
- <span class="status-dot"></span>
433
- <span>已启用</span>
434
- </div>
435
- </div>
436
-
437
- <div class="plugin-card" onclick="openPlugin('report-generator')">
438
- <div class="plugin-name">报表生成器</div>
439
- <div class="plugin-description">一键生成各类统计报表,支持自定义模板</div>
440
- <div class="plugin-status">
441
- <span class="status-dot"></span>
442
- <span>已启用</span>
443
- </div>
444
- </div>
445
-
446
- <div class="plugin-card" onclick="openPlugin('notification-center')">
447
- <div class="plugin-name">通知中心</div>
448
- <div class="plugin-description">统一管理各类通知,支持多渠道推送</div>
449
- <div class="plugin-status">
450
- <span class="status-dot"></span>
451
- <span>已启用</span>
452
- </div>
453
- </div>
454
-
455
- <div class="plugin-card" onclick="openPlugin('api-monitor')">
456
- <div class="plugin-name">API监控</div>
457
- <div class="plugin-description">实时监控API状态,自动告警异常</div>
458
- <div class="plugin-status">
459
- <span class="status-dot"></span>
460
- <span>已启用</span>
461
- </div>
462
- </div>
463
- </div>
464
- </div>
465
- </div>
466
-
467
- <!-- 右侧:用户反馈 -->
468
- <div class="card">
469
- <div class="card-header">
470
- <h2 class="card-title">用户反馈</h2>
471
- </div>
472
- <div class="card-body">
473
- <!-- 反馈表单 -->
474
- <form class="feedback-form" onsubmit="submitFeedback(event)">
475
- <div class="form-group">
476
- <label class="form-label">您的姓名</label>
477
- <input type="text" class="form-input" id="usernameInput" placeholder="请输入您的姓名" maxlength="20" required>
478
- </div>
479
- <div class="form-group">
480
- <label class="form-label">反馈内容</label>
481
- <textarea class="form-textarea" id="feedbackInput" placeholder="请描述您的问题或建议..." required></textarea>
482
- </div>
483
- <button type="submit" class="submit-btn">提交反馈</button>
484
- </form>
485
-
486
- <!-- 反馈记录列表 -->
487
- <div class="feedback-list" id="feedbackList">
488
- <div class="feedback-item">
489
- <div class="feedback-header">
490
- <div class="feedback-user">
491
- <div class="user-avatar">张</div>
492
- <span class="user-name">张三</span>
493
- </div>
494
- <span class="feedback-time">2024-01-02 14:30</span>
495
- </div>
496
- <div class="feedback-content">
497
- 数据查看器的导出功能非常好用,希望能增加Excel格式支持。
498
- </div>
499
- </div>
500
-
501
- <div class="feedback-item">
502
- <div class="feedback-header">
503
- <div class="feedback-user">
504
- <div class="user-avatar">李</div>
505
- <span class="user-name">李四</span>
506
- </div>
507
- <span class="feedback-time">2024-01-02 10:15</span>
508
- </div>
509
- <div class="feedback-content">
510
- 任务调度器的界面可以更直观一些,现在设置定时任务需要学习成本。
511
- </div>
512
- </div>
513
-
514
- <div class="feedback-item">
515
- <div class="feedback-header">
516
- <div class="feedback-user">
517
- <div class="user-avatar">王</div>
518
- <span class="user-name">王五</span>
519
- </div>
520
- <span class="feedback-time">2024-01-01 18:45</span>
521
- </div>
522
- <div class="feedback-content">
523
- 文件管理器的搜索速度很快,但是希望能支持模糊搜索功能。
524
- </div>
525
- </div>
526
-
527
- <div class="feedback-item">
528
- <div class="feedback-header">
529
- <div class="feedback-user">
530
- <div class="user-avatar">赵</div>
531
- <span class="user-name">赵六</span>
532
- </div>
533
- <span class="feedback-time">2024-01-01 09:20</span>
534
- </div>
535
- <div class="feedback-content">
536
- 通知中心的邮件推送功能有时会有延迟,希望能优化一下。
537
- </div>
538
- </div>
539
- </div>
540
- </div>
541
- </div>
542
- </div>
543
- </div>
544
-
545
- <script>
546
- // 模拟打开插件页面
547
- function openPlugin(pluginId) {
548
- console.log(`打开插件: ${pluginId}`);
549
- // 实际项目中这里会跳转到插件详情页
550
- alert(`即将打开插件: ${pluginId}`);
551
- }
552
-
553
- // 模拟提交反馈
554
- function submitFeedback(event) {
555
- event.preventDefault();
556
-
557
- const username = document.getElementById('usernameInput').value.trim();
558
- const feedbackContent = document.getElementById('feedbackInput').value.trim();
559
-
560
- if (username && feedbackContent) {
561
- // 创建新反馈项
562
- const feedbackItem = document.createElement('div');
563
- feedbackItem.className = 'feedback-item';
564
-
565
- const now = new Date();
566
- const timeString = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')} ${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}`;
567
-
568
- // 获取用户名的首字作为头像
569
- const firstChar = username.charAt(0);
570
-
571
- feedbackItem.innerHTML = `
572
- <div class="feedback-header">
573
- <div class="feedback-user">
574
- <div class="user-avatar">${firstChar}</div>
575
- <span class="user-name">${username}</span>
576
- </div>
577
- <span class="feedback-time">${timeString}</span>
578
- </div>
579
- <div class="feedback-content">${feedbackContent}</div>
580
- `;
581
-
582
- // 添加到列表顶部
583
- const feedbackList = document.getElementById('feedbackList');
584
- feedbackList.insertBefore(feedbackItem, feedbackList.firstChild);
585
-
586
- // 清空输入框
587
- document.getElementById('usernameInput').value = '';
588
- document.getElementById('feedbackInput').value = '';
589
-
590
- // 显示成功提示
591
- alert('反馈提交成功!感谢您的建议。');
592
- }
593
- }
594
- </script>
595
- </body>
596
- </html>