5 lines
73 KiB
JavaScript
5 lines
73 KiB
JavaScript
import{j as e,r as i,i as Xe}from"./router-zNjPR4CY.js";import{u as ke,g as oe,K as ds,Q as ms,S as Qe,B as j,L as p,I as de,ap as Ye,aq as Ve,ar as xs,as as us,at as hs,au as es,a as ps,E as Ae,av as je,aw as J,ax as Oe,ay as gs,az as js,T as ss,O as ts,P as K,R as pe,A as ee,m as se,n as te,o as ae,q as ne,r as re,s as ie,t as le,v as ce,aA as Te,aB as fs,aC as vs,x as bs,D as Ns,i as ys,j as ws,k as Cs,l as ks,a3 as Ss}from"./index-CuOHsLf7.js";import{u as Ts}from"./use-animation--6lc2CfN.js";import{S as De}from"./switch-Kc2EZ0Ga.js";import{S as $}from"./slider-mDhSC-zv.js";import{A as Ds,a as fe,b as ve,c as be}from"./accordion-BDNDahhI.js";import{C as as}from"./CodeEditor-4JcGD1og.js";import{S as Ne,a as ye,b as we,c as Ce,d as F}from"./select-DGqIoF9r.js";import{a7 as Z,L as He,v as me,as as ze,b3 as Rs,T as ge,aH as Pe,aD as Le,R as _e,D as ns,at as Fs,a3 as As,b as Ee,c as We,$ as Ge,a0 as Je,e as Ls,f as Ms,b4 as Os,aB as Es,s as Is,ai as Bs}from"./icons-DTcdLw9j.js";import{C as Vs}from"./checkbox-DWiVrbnx.js";import{g as Ps,c as Ke}from"./system-api-DeeJapvB.js";import{g as Q,a as Ze,f as Us,s as Re,c as zs,e as _s,i as $s,r as Hs,D as Fe}from"./unified-ws-CBnrIqHW.js";import{l as Ws}from"./log-websocket-BnMQh0M3.js";import"./misc-BwRzHX8c.js";import"./radix-C-ZuImoP.js";import"./utils-DjBw3JGv.js";function Ie(s){if(!s)return"#000000";const c=s.split(" ").filter(Boolean);if(c.length<3)return"#000000";const t=parseFloat(c[0]),r=parseFloat(c[1].replace("%","")),u=parseFloat(c[2].replace("%","")),N=r/100,g=u/100,x=(1-Math.abs(2*g-1))*N,o=x*(1-Math.abs(t/60%2-1)),A=g-x/2;let h=0,a=0,v=0;t>=0&&t<60?(h=x,a=o,v=0):t>=60&&t<120?(h=o,a=x,v=0):t>=120&&t<180?(h=0,a=x,v=o):t>=180&&t<240?(h=0,a=o,v=x):t>=240&&t<300?(h=o,a=0,v=x):t>=300&&t<360&&(h=x,a=0,v=o);const w=L=>{const l=Math.round((L+A)*255).toString(16);return l.length===1?"0"+l:l};return`#${w(h)}${w(a)}${w(v)}`}function S({name:s,description:c,license:t}){return e.jsxs("div",{className:"flex items-start justify-between gap-2 rounded-lg border bg-muted/30 p-2.5 sm:p-3",children:[e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"font-medium text-foreground truncate",children:s}),e.jsx("p",{className:"text-muted-foreground text-xs mt-0.5",children:c})]}),e.jsx("span",{className:"inline-flex items-center rounded-full bg-primary/10 px-2 py-0.5 text-[10px] font-medium text-primary flex-shrink-0",children:t})]})}function Gs(){const{t:s}=ke();return e.jsxs("div",{className:"space-y-4 sm:space-y-6",children:[e.jsx("div",{className:"rounded-lg border-2 border-primary/30 bg-linear-to-r from-primary/5 to-primary/10 p-4 sm:p-6",children:e.jsxs("div",{className:"flex items-start gap-3 sm:gap-4",children:[e.jsx("div",{className:"shrink-0 rounded-lg bg-primary/10 p-2 sm:p-3",children:e.jsx("svg",{className:"h-6 w-6 sm:h-8 sm:w-8 text-primary",fill:"currentColor",viewBox:"0 0 24 24","aria-hidden":"true",children:e.jsx("path",{fillRule:"evenodd",d:"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z",clipRule:"evenodd"})})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("h3",{className:"text-lg sm:text-xl font-bold text-foreground mb-2",children:s("settings.about.openSource")}),e.jsx("p",{className:"text-sm sm:text-base text-muted-foreground mb-3",children:s("settings.about.openSourceDesc")}),e.jsxs("a",{href:"https://github.com/Mai-with-u/MaiBot-Dashboard",target:"_blank",rel:"noopener noreferrer",className:oe("inline-flex items-center gap-2 px-4 py-2 rounded-lg","bg-primary text-primary-foreground font-medium text-sm","hover:bg-primary/90 transition-colors","focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2"),children:[e.jsx("svg",{className:"h-4 w-4",fill:"currentColor",viewBox:"0 0 24 24","aria-hidden":"true",children:e.jsx("path",{fillRule:"evenodd",d:"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z",clipRule:"evenodd"})}),s("settings.about.visitGitHub"),e.jsx("svg",{className:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"})})]})]})]})}),e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6",children:[e.jsxs("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:[s("settings.about.aboutApp")," ",ds]}),e.jsxs("div",{className:"space-y-2 text-xs sm:text-sm text-muted-foreground",children:[e.jsxs("p",{children:[s("settings.about.version")," ",ms]}),e.jsx("p",{children:s("settings.about.appDesc")})]})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6",children:[e.jsx("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:s("settings.about.author")}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx("p",{className:"text-sm font-medium",children:s("settings.about.maimaiCore")}),e.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground",children:"Mai-with-u"})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("p",{className:"text-sm font-medium",children:"WebUI"}),e.jsxs("p",{className:"text-xs sm:text-sm text-muted-foreground",children:["Mai-with-u ",e.jsx("a",{href:"https://github.com/DrSmoothl",target:"_blank",rel:"noopener noreferrer",className:"text-primary underline",children:"@MotricSeven"})]})]})]})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6",children:[e.jsx("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:s("settings.about.techStack")}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-3 text-xs sm:text-sm text-muted-foreground",children:[e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("p",{className:"font-medium text-foreground",children:s("settings.about.frontendFramework")}),e.jsxs("ul",{className:"space-y-0.5 list-disc list-inside",children:[e.jsx("li",{children:"React 19.2.0"}),e.jsx("li",{children:"TypeScript 5.7.2"}),e.jsx("li",{children:"Vite 6.0.7"}),e.jsx("li",{children:"TanStack Router 1.94.2"})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("p",{className:"font-medium text-foreground",children:s("settings.about.uiComponents")}),e.jsxs("ul",{className:"space-y-0.5 list-disc list-inside",children:[e.jsx("li",{children:"shadcn/ui"}),e.jsx("li",{children:"Radix UI"}),e.jsx("li",{children:"Tailwind CSS 4.2.1"}),e.jsx("li",{children:"Lucide Icons"})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("p",{className:"font-medium text-foreground",children:s("settings.about.backend")}),e.jsxs("ul",{className:"space-y-0.5 list-disc list-inside",children:[e.jsx("li",{children:"Python 3.12+"}),e.jsx("li",{children:"FastAPI"}),e.jsx("li",{children:"Uvicorn"}),e.jsx("li",{children:"WebSocket"})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("p",{className:"font-medium text-foreground",children:s("settings.about.buildTool")}),e.jsxs("ul",{className:"space-y-0.5 list-disc list-inside",children:[e.jsx("li",{children:"Bun / npm"}),e.jsx("li",{children:"ESLint 9.17.0"})]})]})]})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6",children:[e.jsx("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:s("settings.about.openSourceThanks")}),e.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground mb-3",children:s("settings.about.openSourceThanksDesc")}),e.jsx(Qe,{className:"h-[300px] sm:h-[400px]",children:e.jsxs("div",{className:"space-y-4 pr-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-sm font-medium text-foreground",children:s("settings.about.uiFrameworkGroup")}),e.jsxs("div",{className:"grid gap-2 text-xs sm:text-sm",children:[e.jsx(S,{name:"React",description:s("settings.about.lib.react"),license:"MIT"}),e.jsx(S,{name:"shadcn/ui",description:s("settings.about.lib.shadcn"),license:"MIT"}),e.jsx(S,{name:"Radix UI",description:s("settings.about.lib.radix"),license:"MIT"}),e.jsx(S,{name:"Tailwind CSS",description:s("settings.about.lib.tailwind"),license:"MIT"}),e.jsx(S,{name:"Lucide React",description:s("settings.about.lib.lucide"),license:"ISC"})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-sm font-medium text-foreground",children:s("settings.about.routingStateGroup")}),e.jsxs("div",{className:"grid gap-2 text-xs sm:text-sm",children:[e.jsx(S,{name:"TanStack Router",description:s("settings.about.lib.tanstackRouter"),license:"MIT"}),e.jsx(S,{name:"Zustand",description:s("settings.about.lib.zustand"),license:"MIT"})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-sm font-medium text-foreground",children:s("settings.about.formGroup")}),e.jsxs("div",{className:"grid gap-2 text-xs sm:text-sm",children:[e.jsx(S,{name:"React Hook Form",description:s("settings.about.lib.reactHookForm"),license:"MIT"}),e.jsx(S,{name:"Zod",description:s("settings.about.lib.zod"),license:"MIT"})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-sm font-medium text-foreground",children:s("settings.about.utilsGroup")}),e.jsxs("div",{className:"grid gap-2 text-xs sm:text-sm",children:[e.jsx(S,{name:"clsx",description:s("settings.about.lib.clsx"),license:"MIT"}),e.jsx(S,{name:"tailwind-merge",description:s("settings.about.lib.tailwindMerge"),license:"MIT"}),e.jsx(S,{name:"class-variance-authority",description:s("settings.about.lib.cva"),license:"Apache-2.0"}),e.jsx(S,{name:"date-fns",description:s("settings.about.lib.dateFns"),license:"MIT"})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-sm font-medium text-foreground",children:s("settings.about.animationGroup")}),e.jsxs("div",{className:"grid gap-2 text-xs sm:text-sm",children:[e.jsx(S,{name:"Framer Motion",description:s("settings.about.lib.framerMotion"),license:"MIT"}),e.jsx(S,{name:"vaul",description:s("settings.about.lib.vaul"),license:"MIT"})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-sm font-medium text-foreground",children:s("settings.about.backendGroup")}),e.jsxs("div",{className:"grid gap-2 text-xs sm:text-sm",children:[e.jsx(S,{name:"FastAPI",description:s("settings.about.lib.fastapi"),license:"MIT"}),e.jsx(S,{name:"Uvicorn",description:s("settings.about.lib.uvicorn"),license:"BSD-3-Clause"}),e.jsx(S,{name:"Pydantic",description:s("settings.about.lib.pydantic"),license:"MIT"}),e.jsx(S,{name:"python-multipart",description:s("settings.about.lib.pythonMultipart"),license:"Apache-2.0"})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-sm font-medium text-foreground",children:s("settings.about.devToolsGroup")}),e.jsxs("div",{className:"grid gap-2 text-xs sm:text-sm",children:[e.jsx(S,{name:"TypeScript",description:s("settings.about.lib.typescript"),license:"Apache-2.0"}),e.jsx(S,{name:"Vite",description:s("settings.about.lib.vite"),license:"MIT"}),e.jsx(S,{name:"ESLint",description:s("settings.about.lib.eslint"),license:"MIT"})]})]})]})})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6",children:[e.jsx("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:s("settings.about.openSourceLicense")}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("div",{className:"rounded-lg bg-primary/5 border border-primary/20 p-3 sm:p-4",children:e.jsxs("div",{className:"flex items-start gap-2 sm:gap-3",children:[e.jsx("div",{className:"mt-0.5 shrink-0",children:e.jsx("div",{className:"rounded-md bg-primary/10 px-2 py-1",children:e.jsx("span",{className:"text-xs sm:text-sm font-bold text-primary",children:"GPLv3"})})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"text-sm sm:text-base font-semibold text-foreground mb-1",children:"MaiBot WebUI"}),e.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground",children:s("settings.about.licenseDesc")})]})]})}),e.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground",children:s("settings.about.licenseDeps")})]})]})]})}function qe(s){if(!s)return"#000000";const c=s.split(" ").filter(Boolean);if(c.length<3)return"#000000";const t=parseFloat(c[0]),r=parseFloat(c[1].replace("%","")),u=parseFloat(c[2].replace("%","")),N=r/100,g=u/100,x=(1-Math.abs(2*g-1))*N,o=x*(1-Math.abs(t/60%2-1)),A=g-x/2;let h=0,a=0,v=0;t>=0&&t<60?(h=x,a=o):t>=60&&t<120?(h=o,a=x):t>=120&&t<180?(a=x,v=o):t>=180&&t<240?(a=o,v=x):t>=240&&t<300?(h=o,v=x):t>=300&&t<360&&(h=x,v=o);const w=L=>{const l=Math.round((L+A)*255).toString(16);return l.length===1?`0${l}`:l};return`#${w(h)}${w(a)}${w(v)}`}function Js({effects:s,onChange:c,disabled:t=!1}){const r=(o,A)=>{t||c({...s,[o]:A})},u=o=>{if(t)return;const A=o.target.value,h=Ve(A);c({...s,overlayColor:h})},N=o=>{t||c({...s,position:o})},g=o=>{t||c({...s,gradientOverlay:o.target.value})},x=()=>{t||c(Ye)};return e.jsxs("div",{className:t?"space-y-6 opacity-50":"space-y-6",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("h3",{className:"text-sm font-medium",children:"背景效果调节"}),e.jsxs(j,{variant:"outline",size:"sm",onClick:x,disabled:t,className:"h-8 px-2 text-xs",children:[e.jsx(Z,{className:"mr-2 h-3.5 w-3.5"}),"重置默认"]})]}),e.jsxs("div",{className:"grid gap-6",children:[e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(p,{children:"模糊程度 (Blur)"}),e.jsxs("span",{className:"text-xs text-muted-foreground",children:[s.blur,"px"]})]}),e.jsx($,{value:[s.blur],min:0,max:50,step:1,disabled:t,onValueChange:o=>r("blur",o[0])})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(p,{children:"遮罩颜色 (Overlay Color)"}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"h-9 w-9 overflow-hidden rounded-md border shadow-sm",children:e.jsx("input",{type:"color",value:qe(s.overlayColor),onChange:u,disabled:t,className:"h-[150%] w-[150%] -translate-x-1/4 -translate-y-1/4 cursor-pointer border-0 p-0"})}),e.jsx(de,{value:qe(s.overlayColor),readOnly:!0,disabled:t,className:"flex-1 font-mono uppercase"})]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(p,{children:"遮罩不透明度 (Opacity)"}),e.jsxs("span",{className:"text-xs text-muted-foreground",children:[Math.round(s.overlayOpacity*100),"%"]})]}),e.jsx($,{value:[s.overlayOpacity*100],min:0,max:100,step:1,disabled:t,onValueChange:o=>r("overlayOpacity",o[0]/100)})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(p,{children:"背景位置 (Position)"}),e.jsxs(Ne,{value:s.position,onValueChange:N,disabled:t,children:[e.jsx(ye,{disabled:t,children:e.jsx(we,{placeholder:"选择位置"})}),e.jsxs(Ce,{children:[e.jsx(F,{value:"cover",children:"覆盖 (Cover)"}),e.jsx(F,{value:"contain",children:"包含 (Contain)"}),e.jsx(F,{value:"center",children:"居中 (Center)"}),e.jsx(F,{value:"stretch",children:"拉伸 (Stretch)"})]})]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(p,{children:"亮度 (Brightness)"}),e.jsxs("span",{className:"text-xs text-muted-foreground",children:[s.brightness,"%"]})]}),e.jsx($,{value:[s.brightness],min:0,max:200,step:1,disabled:t,onValueChange:o=>r("brightness",o[0])})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(p,{children:"对比度 (Contrast)"}),e.jsxs("span",{className:"text-xs text-muted-foreground",children:[s.contrast,"%"]})]}),e.jsx($,{value:[s.contrast],min:0,max:200,step:1,disabled:t,onValueChange:o=>r("contrast",o[0])})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(p,{children:"饱和度 (Saturate)"}),e.jsxs("span",{className:"text-xs text-muted-foreground",children:[s.saturate,"%"]})]}),e.jsx($,{value:[s.saturate],min:0,max:200,step:1,disabled:t,onValueChange:o=>r("saturate",o[0])})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(p,{children:"CSS 渐变叠加 (Gradient Overlay)"}),e.jsx(de,{value:s.gradientOverlay||"",onChange:g,disabled:t,placeholder:"e.g. linear-gradient(to bottom, transparent, black)",className:"font-mono text-xs"}),e.jsx("p",{className:"text-[10px] text-muted-foreground",children:"可选:输入有效的 CSS gradient 字符串"})]})]})]})}function Ks({assetId:s,onAssetSelect:c,className:t,disabled:r=!1}){const{getAssetUrl:u}=xs(),[N,g]=i.useState(!1),[x,o]=i.useState(null),[A,h]=i.useState(!1),[a,v]=i.useState(void 0),[w,L]=i.useState(void 0),[l,b]=i.useState(""),R=i.useRef(null);i.useEffect(()=>{let m=!0;return(async()=>{if(!s){v(void 0),L(void 0);return}try{const z=await u(s),_=await us(s);m&&(z&&_?(v(z),L(_.type)):c(void 0))}catch(z){console.error("Failed to load asset preview:",z)}})(),()=>{m=!1}},[s,u,c]);const I=async m=>{if(!r){o(null),g(!0);try{if(!m.type.startsWith("image/")&&!m.type.startsWith("video/"))throw new Error("不支持的文件类型。请上传图片或视频。");if(m.size>50*1024*1024)throw new Error("文件过大。请上传小于 50MB 的文件。");const M=await hs(m);c(M),b("")}catch(M){o(M instanceof Error?M.message:"上传失败")}finally{g(!1)}}},B=async()=>{if(!(r||!l)){o(null),g(!0);try{const m=await fetch(l);if(!m.ok)throw new Error(`下载失败: ${m.statusText}`);const M=await m.blob(),z=m.headers.get("content-type")||"",_=l.split("/").pop()||"downloaded-file",q=_.includes(".")?_:`${_}.${z.split("/")[1]||"bin"}`,O=new File([M],q,{type:z});await I(O)}catch(m){o(m instanceof Error?m.message:"从 URL 上传失败")}finally{g(!1)}}},W=m=>{m.preventDefault(),m.stopPropagation(),!r&&(m.type==="dragenter"||m.type==="dragover"?h(!0):m.type==="dragleave"&&h(!1))},U=m=>{m.preventDefault(),m.stopPropagation(),h(!1),!r&&m.dataTransfer.files&&m.dataTransfer.files[0]&&I(m.dataTransfer.files[0])},f=()=>{r||(c(void 0),v(void 0),L(void 0),o(null))};return e.jsxs("div",{className:oe("space-y-4",r&&"opacity-50",t),children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx(p,{children:"背景资源"}),e.jsxs("div",{className:oe("relative flex min-h-[200px] flex-col items-center justify-center rounded-lg border-2 border-dashed p-4 transition-colors",r&&"pointer-events-none",A?"border-primary bg-primary/5":"border-muted-foreground/25",x?"border-destructive/50 bg-destructive/5":"",s?"border-solid":""),onDragEnter:W,onDragLeave:W,onDragOver:W,onDrop:U,children:[N?e.jsxs("div",{className:"flex flex-col items-center gap-2 text-muted-foreground",children:[e.jsx(He,{className:"h-8 w-8 animate-spin"}),e.jsx("p",{className:"text-sm",children:"处理中..."})]}):s&&a?e.jsxs("div",{className:"relative h-full w-full",children:[w==="video"?e.jsx("video",{src:a,className:"h-full max-h-[300px] w-full rounded-md object-contain",controls:!1,muted:!0}):e.jsx("img",{src:a,alt:"Background preview",className:"h-full max-h-[300px] w-full rounded-md object-contain"}),e.jsx("div",{className:"absolute right-2 top-2 flex gap-2",children:e.jsx(j,{variant:"destructive",size:"icon",className:"h-8 w-8 shadow-sm",onClick:f,disabled:r,children:e.jsx(me,{className:"h-4 w-4"})})}),e.jsx("div",{className:"absolute bottom-2 left-2 rounded bg-black/50 px-2 py-1 text-xs text-white backdrop-blur",children:w==="video"?"视频":"图片"})]}):e.jsxs("div",{className:"flex flex-col items-center gap-4 text-center",children:[e.jsx("div",{className:"rounded-full bg-muted p-4",children:e.jsx(ze,{className:"h-8 w-8 text-muted-foreground"})}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("p",{className:"font-medium",children:"点击或拖拽上传"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"支持 JPG, PNG, GIF, MP4, WebM"})]}),e.jsx(j,{variant:"outline",size:"sm",onClick:()=>R.current?.click(),disabled:r,children:"选择文件"})]}),e.jsx(de,{ref:R,type:"file",className:"hidden",accept:"image/*,video/mp4,video/webm",onChange:m=>{r||(m.target.files?.[0]&&I(m.target.files[0]),m.target.value="")}})]}),x&&e.jsx("div",{className:"rounded-md bg-destructive/10 p-3 text-sm text-destructive",children:x})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(p,{className:"text-xs text-muted-foreground",children:"或从 URL 获取"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs("div",{className:"relative flex-1",children:[e.jsx(Rs,{className:"absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground"}),e.jsx(de,{placeholder:"https://example.com/image.jpg",className:"pl-9",value:l,disabled:r,onChange:m=>b(m.target.value),onKeyDown:m=>{m.key==="Enter"&&(m.preventDefault(),B())}})]}),e.jsx(j,{variant:"secondary",onClick:B,disabled:r||!l||N,children:N?e.jsx(He,{className:"h-4 w-4 animate-spin"}):"获取"})]})]})]})}function Zs({componentId:s,value:c,onChange:t,label:r,height:u="200px",disabled:N=!1}){const{warnings:g}=es(c);return e.jsxs("div",{className:N?"space-y-2 opacity-50":"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(p,{className:"text-sm font-medium",children:r||"自定义 CSS"}),e.jsxs(j,{variant:"ghost",size:"sm",onClick:()=>t(""),disabled:N||!c,className:"h-7 px-2 text-xs text-muted-foreground hover:text-destructive",title:"清除所有 CSS",children:[e.jsx(me,{className:"mr-1.5 h-3.5 w-3.5"}),"清除"]})]}),e.jsxs("div",{className:"rounded-md border bg-card overflow-hidden",children:[e.jsx(as,{value:c,onChange:N?void 0:t,language:"css",readOnly:N,height:u,placeholder:`/* 为 ${s} 组件编写自定义 CSS */
|
||
|
||
/* 示例: */
|
||
/* .custom-class { background: red; } */`}),g.length>0&&e.jsxs("div",{className:"border-t border-yellow-200 dark:border-yellow-800 bg-yellow-50 dark:bg-yellow-950/30 p-3",children:[e.jsxs("div",{className:"flex items-center gap-2 text-yellow-800 dark:text-yellow-200 text-xs font-medium mb-1",children:[e.jsx(ge,{className:"h-3.5 w-3.5"}),"检测到不安全的 CSS 规则:"]}),e.jsx("ul",{className:"text-[10px] sm:text-xs text-yellow-700 dark:text-yellow-300 space-y-0.5 ml-5 list-disc",children:g.map((x,o)=>e.jsx("li",{children:x},o))})]})]})]})}function Be({value:s,current:c,onChange:t,label:r,description:u}){const N=c===s;return e.jsxs("button",{onClick:()=>t(s),className:oe("relative rounded-lg border-2 p-3 sm:p-4 text-left transition-all","hover:border-primary/50 hover:bg-accent/50",N?"border-primary bg-accent":"border-border"),children:[N&&e.jsx("div",{className:"absolute top-2 right-2 sm:top-3 sm:right-3 h-2 w-2 rounded-full bg-primary"}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("div",{className:"text-sm sm:text-base font-medium",children:r}),e.jsx("div",{className:"text-[10px] sm:text-xs text-muted-foreground",children:u})]}),e.jsxs("div",{className:"mt-2 sm:mt-3 flex gap-1",children:[s==="light"&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"h-2 w-2 rounded-full bg-slate-200"}),e.jsx("div",{className:"h-2 w-2 rounded-full bg-slate-300"}),e.jsx("div",{className:"h-2 w-2 rounded-full bg-slate-400"})]}),s==="dark"&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"h-2 w-2 rounded-full bg-slate-700"}),e.jsx("div",{className:"h-2 w-2 rounded-full bg-slate-800"}),e.jsx("div",{className:"h-2 w-2 rounded-full bg-slate-900"})]}),s==="system"&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"h-2 w-2 rounded-full bg-gradient-to-r from-slate-200 to-slate-700"}),e.jsx("div",{className:"h-2 w-2 rounded-full bg-gradient-to-r from-slate-300 to-slate-800"}),e.jsx("div",{className:"h-2 w-2 rounded-full bg-gradient-to-r from-slate-400 to-slate-900"})]})]})]})}function P(s,c,t,r){if(!s||!s[c])return r;const u=s[c];return!u||!(t in u)?r:u[t]??r}function qs(){const{theme:s,setTheme:c,themeConfig:t,updateThemeConfig:r,resolvedTheme:u,resetTheme:N}=ps(),{enableAnimations:g,setEnableAnimations:x,enableWavesBackground:o,setEnableWavesBackground:A}=Ts(),{toast:h}=Ae(),{t:a}=ke(),[v,w]=i.useState(t.customCSS||""),[L,l]=i.useState(()=>t.accentColor?Ie(t.accentColor):je),[b,R]=i.useState(()=>t.accentColor?Ie(t.accentColor):je),[I,B]=i.useState(t.backgroundConfig??{}),[W,U]=i.useState([]),f=i.useRef(null),m=i.useRef(null),M=i.useRef(null),z=i.useRef(null),_=i.useCallback(n=>/^#[0-9A-F]{6}$/i.test(n),[]),q=i.useCallback(n=>{f.current&&clearTimeout(f.current),f.current=setTimeout(()=>{r({accentColor:Ve(n)})},160)},[r]),O=i.useCallback((n,d)=>{r({tokenOverrides:{...t.tokenOverrides,[n]:{...J[n],...t.tokenOverrides?.[n],...d}}})},[t.tokenOverrides,r]),X=i.useCallback(n=>{const d={...t.tokenOverrides};delete d[n],r({tokenOverrides:d})},[t.tokenOverrides,r]),y=i.useCallback(n=>{w(n);const d=es(n);U(d.warnings),m.current&&clearTimeout(m.current),m.current=setTimeout(()=>{r({customCSS:n})},500)},[r]),V=i.useMemo(()=>_(b)?Ve(b):t.accentColor||Oe,[b,_,t.accentColor]),xe=i.useMemo(()=>({...t,accentColor:V}),[V,t]);i.useEffect(()=>{const n=t.accentColor?Ie(t.accentColor):je;l(n),R(n)},[t.accentColor]),i.useEffect(()=>{B(t.backgroundConfig??{})},[t.backgroundConfig]),i.useEffect(()=>{gs(xe,u==="dark")},[xe,u]),i.useEffect(()=>()=>{f.current&&clearTimeout(f.current),m.current&&clearTimeout(m.current),M.current&&clearTimeout(M.current)},[]);const C=n=>{const d=n.target.value;l(d),R(d),q(d)},T=n=>{const d=n.target.value.toUpperCase();l(d),_(d)&&(R(d),q(d))},ue=()=>{f.current&&clearTimeout(f.current),l(je),R(je),r({accentColor:Oe})},he=()=>{const n=fs(),d=new Blob([n],{type:"application/json"}),D=URL.createObjectURL(d),E=document.createElement("a");E.href=D,E.download=`maibot-theme-${Date.now()}.json`,E.click(),URL.revokeObjectURL(D)},G=n=>{const d=n.target.files?.[0];if(!d)return;const D=new FileReader;D.onload=E=>{const os=E.target?.result,$e=vs(os);$e.success?(h({title:a("settings.appearance.importSuccess"),description:a("settings.appearance.importSuccessDesc")}),setTimeout(()=>window.location.reload(),1e3)):h({title:a("settings.appearance.importFailed"),description:$e.errors.join("; "),variant:"destructive"})},D.readAsText(d),n.target.value=""},Me=()=>{N(),w(""),U([]),h({title:a("settings.appearance.resetSuccess"),description:a("settings.appearance.resetSuccessDesc")})},k=i.useMemo(()=>js(xe,u==="dark").color,[xe,u]),H=I,Se=i.useCallback(n=>{M.current&&clearTimeout(M.current),M.current=setTimeout(()=>{r({backgroundConfig:n})},180)},[r]),rs=(n,d)=>{const D=H[n]??Te,E={...H,[n]:{...D,assetId:d,type:d?"image":"none"}};B(E),Se(E)},is=(n,d)=>{const D=H[n]??Te,E={...H,[n]:{...D,effects:d}};B(E),Se(E)},ls=(n,d)=>{const D=H[n]??Te,E={...H,[n]:{...D,customCSS:d}};B(E),Se(E)},cs=(n,d)=>{const D=H[n]??Te,E={...H,[n]:{...D,inherit:d}};B(E),Se(E)};return e.jsxs("div",{className:"space-y-6 sm:space-y-8",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:a("settings.appearance.themeMode")}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-3 sm:gap-4",children:[e.jsx(Be,{value:"light",current:s,onChange:c,label:a("settings.appearance.light"),description:a("settings.appearance.lightDesc")}),e.jsx(Be,{value:"dark",current:s,onChange:c,label:a("settings.appearance.dark"),description:a("settings.appearance.darkDesc")}),e.jsx(Be,{value:"system",current:s,onChange:c,label:a("settings.appearance.system"),description:a("settings.appearance.systemDesc")})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-3 sm:mb-4",children:[e.jsx("h3",{className:"text-base sm:text-lg font-semibold",children:a("settings.appearance.accentColor")}),e.jsxs(j,{variant:"outline",size:"sm",onClick:ue,disabled:t.accentColor===Oe,className:"h-8",children:[e.jsx(Z,{className:"mr-2 h-3.5 w-3.5"}),a("settings.appearance.resetDefault")]})]}),e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row gap-4 items-start sm:items-center p-4 rounded-lg border bg-card",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"h-10 w-10 rounded-full border-2 border-border overflow-hidden relative shadow-sm",children:e.jsx("input",{type:"color",value:b,onChange:C,className:"absolute inset-0 w-[150%] h-[150%] -top-1/4 -left-1/4 cursor-pointer p-0 border-0"})}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(p,{htmlFor:"accent-color-input",className:"font-medium",children:a("settings.appearance.accentPrimary")}),e.jsx("p",{className:"text-xs text-muted-foreground",children:a("settings.appearance.accentHint")})]})]}),e.jsx("div",{className:"flex-1 w-full sm:w-auto flex items-center gap-2",children:e.jsx(de,{id:"accent-color-input",type:"text",value:L,onChange:T,className:"font-mono uppercase w-32",maxLength:7})})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h4",{className:"text-sm font-medium text-muted-foreground",children:a("settings.appearance.colorPreview")}),e.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-4 md:grid-cols-8 gap-3",children:[e.jsx(Y,{name:"primary",value:k.primary,foreground:k["primary-foreground"]}),e.jsx(Y,{name:"secondary",value:k.secondary,foreground:k["secondary-foreground"]}),e.jsx(Y,{name:"muted",value:k.muted,foreground:k["muted-foreground"]}),e.jsx(Y,{name:"accent",value:k.accent,foreground:k["accent-foreground"]}),e.jsx(Y,{name:"destructive",value:k.destructive,foreground:k["destructive-foreground"]}),e.jsx(Y,{name:"background",value:k.background,foreground:k.foreground,border:!0}),e.jsx(Y,{name:"card",value:k.card,foreground:k["card-foreground"],border:!0}),e.jsx(Y,{name:"border",value:k.border})]})]})]})]}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:a("settings.appearance.styleTweaks")}),e.jsxs(Ds,{type:"single",collapsible:!0,className:"w-full",children:[e.jsxs(fe,{value:"typography",children:[e.jsx(ve,{children:a("settings.appearance.typographyGroup")}),e.jsx(be,{children:e.jsxs("div",{className:"space-y-4 pt-2",children:[e.jsx("div",{className:"flex justify-end",children:e.jsxs(j,{variant:"ghost",size:"sm",onClick:()=>X("typography"),disabled:!t.tokenOverrides?.typography,className:"h-8 text-xs",children:[e.jsx(Z,{className:"mr-2 h-3.5 w-3.5"}),a("settings.appearance.resetDefault")]})}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(p,{children:a("settings.appearance.fontFamilyLabel")}),e.jsxs(Ne,{value:(()=>{const n=P(t.tokenOverrides,"typography","font-family-base","");return n.includes("ui-serif")?"serif":n.includes("ui-monospace")?"mono":n?"sans":"system"})(),onValueChange:n=>{let d=J.typography["font-family-base"];n==="serif"?d='ui-serif, Georgia, Cambria, "Times New Roman", Times, serif':n==="mono"?d='ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace':n==="sans"&&(d='ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif'),O("typography",{"font-family-base":d})},children:[e.jsx(ye,{children:e.jsx(we,{placeholder:a("settings.appearance.fontFamilyPlaceholder")})}),e.jsxs(Ce,{children:[e.jsx(F,{value:"system",children:a("settings.appearance.fontFamilySystem")}),e.jsx(F,{value:"sans",children:a("settings.appearance.fontFamilySans")}),e.jsx(F,{value:"serif",children:a("settings.appearance.fontFamilySerif")}),e.jsx(F,{value:"mono",children:a("settings.appearance.fontFamilyMono")})]})]})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex justify-between",children:[e.jsx(p,{children:a("settings.appearance.baseFontSize")}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:[parseFloat(P(t.tokenOverrides,"typography","font-size-base","1"))*16,"px"]})]}),e.jsx($,{defaultValue:[16],value:[parseFloat(P(t.tokenOverrides,"typography","font-size-base","1"))*16],min:12,max:20,step:1,onValueChange:n=>{O("typography",{"font-size-base":`${n[0]/16}rem`})}})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(p,{children:a("settings.appearance.lineHeight")}),e.jsxs(Ne,{value:String(P(t.tokenOverrides,"typography","line-height-normal",1.5)),onValueChange:n=>{O("typography",{"line-height-normal":parseFloat(n)})},children:[e.jsx(ye,{children:e.jsx(we,{placeholder:a("settings.appearance.lineHeightPlaceholder")})}),e.jsxs(Ce,{children:[e.jsx(F,{value:"1.2",children:a("settings.appearance.lineHeightCompact")}),e.jsx(F,{value:"1.5",children:a("settings.appearance.lineHeightNormal")}),e.jsx(F,{value:"1.75",children:a("settings.appearance.lineHeightLoose")})]})]})]})]})})]}),e.jsxs(fe,{value:"visual",children:[e.jsx(ve,{children:a("settings.appearance.visualGroup")}),e.jsx(be,{children:e.jsxs("div",{className:"space-y-4 pt-2",children:[e.jsx("div",{className:"flex justify-end",children:e.jsxs(j,{variant:"ghost",size:"sm",onClick:()=>X("visual"),disabled:!t.tokenOverrides?.visual,className:"h-8 text-xs",children:[e.jsx(Z,{className:"mr-2 h-3.5 w-3.5"}),a("settings.appearance.resetDefault")]})}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex justify-between",children:[e.jsx(p,{children:a("settings.appearance.borderRadiusLabel")}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:[Math.round(parseFloat(P(t.tokenOverrides,"visual","radius-md","0.375"))*16),"px"]})]}),e.jsx($,{defaultValue:[6],value:[Math.round(parseFloat(P(t.tokenOverrides,"visual","radius-md","0.375"))*16)],min:0,max:24,step:1,onValueChange:n=>{O("visual",{"radius-md":`${n[0]/16}rem`})}})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(p,{children:a("settings.appearance.shadowLabel")}),e.jsxs(Ne,{value:(()=>{const n=String(P(t.tokenOverrides,"visual","shadow-md",""));return n==="none"?"none":n===J.visual["shadow-sm"]?"sm":n===J.visual["shadow-lg"]?"lg":n===J.visual["shadow-xl"]?"xl":"md"})(),onValueChange:n=>{let d=J.visual["shadow-md"];n==="none"?d="none":n==="sm"?d=J.visual["shadow-sm"]:n==="lg"?d=J.visual["shadow-lg"]:n==="xl"&&(d=J.visual["shadow-xl"]),O("visual",{"shadow-md":d})},children:[e.jsx(ye,{children:e.jsx(we,{placeholder:a("settings.appearance.shadowPlaceholder")})}),e.jsxs(Ce,{children:[e.jsx(F,{value:"none",children:a("settings.appearance.shadowNone")}),e.jsx(F,{value:"sm",children:a("settings.appearance.shadowSm")}),e.jsx(F,{value:"md",children:a("settings.appearance.shadowMd")}),e.jsx(F,{value:"lg",children:a("settings.appearance.shadowLg")}),e.jsx(F,{value:"xl",children:a("settings.appearance.shadowXl")})]})]})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(p,{htmlFor:"blur-switch",children:a("settings.appearance.blurLabel")}),e.jsx(De,{id:"blur-switch",checked:P(t.tokenOverrides,"visual","blur-md","0px")!=="0px",onCheckedChange:n=>{O("visual",{"blur-md":n?J.visual["blur-md"]:"0px"})}})]})]})})]}),e.jsxs(fe,{value:"layout",children:[e.jsx(ve,{children:a("settings.appearance.layoutGroup")}),e.jsx(be,{children:e.jsxs("div",{className:"space-y-4 pt-2",children:[e.jsx("div",{className:"flex justify-end",children:e.jsxs(j,{variant:"ghost",size:"sm",onClick:()=>X("layout"),disabled:!t.tokenOverrides?.layout,className:"h-8 text-xs",children:[e.jsx(Z,{className:"mr-2 h-3.5 w-3.5"}),a("settings.appearance.resetDefault")]})}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex justify-between",children:[e.jsx(p,{children:a("settings.appearance.sidebarWidthLabel")}),e.jsx("span",{className:"text-sm text-muted-foreground",children:P(t.tokenOverrides,"layout","sidebar-width","13rem")})]}),e.jsx($,{defaultValue:[16],value:[parseFloat(P(t.tokenOverrides,"layout","sidebar-width","13"))],min:12,max:24,step:.5,onValueChange:n=>{O("layout",{"sidebar-width":`${n[0]}rem`})}})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex justify-between",children:[e.jsx(p,{children:a("settings.appearance.maxContentWidth")}),e.jsx("span",{className:"text-sm text-muted-foreground",children:P(t.tokenOverrides,"layout","max-content-width","1280px")})]}),e.jsx($,{defaultValue:[1280],value:[parseFloat(P(t.tokenOverrides,"layout","max-content-width","1280").replace("px",""))],min:960,max:1600,step:10,onValueChange:n=>{O("layout",{"max-content-width":`${n[0]}px`})}})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex justify-between",children:[e.jsx(p,{children:a("settings.appearance.spacingUnit")}),e.jsx("span",{className:"text-sm text-muted-foreground",children:P(t.tokenOverrides,"layout","space-unit","0.25rem")})]}),e.jsx($,{defaultValue:[.25],value:[parseFloat(P(t.tokenOverrides,"layout","space-unit","0.25").replace("rem",""))],min:.2,max:.4,step:.01,onValueChange:n=>{O("layout",{"space-unit":`${n[0]}rem`})}})]})]})})]}),e.jsxs(fe,{value:"animation",children:[e.jsx(ve,{children:a("settings.appearance.animationGroup")}),e.jsx(be,{children:e.jsxs("div",{className:"space-y-4 pt-2",children:[e.jsx("div",{className:"flex justify-end",children:e.jsxs(j,{variant:"ghost",size:"sm",onClick:()=>X("animation"),disabled:!t.tokenOverrides?.animation,className:"h-8 text-xs",children:[e.jsx(Z,{className:"mr-2 h-3.5 w-3.5"}),a("settings.appearance.resetDefault")]})}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(p,{children:a("settings.appearance.animationSpeedLabel")}),e.jsxs(Ne,{value:(()=>{const n=String(P(t.tokenOverrides,"animation","anim-duration-normal","300ms"));return n==="100ms"?"fast":n==="500ms"?"slow":n==="0ms"?"off":"normal"})(),onValueChange:n=>{let d="300ms";n==="fast"?d="100ms":n==="slow"?d="500ms":n==="off"&&(d="0ms"),n==="off"&&g?x(!1):n!=="off"&&!g&&x(!0),O("animation",{"anim-duration-normal":d})},children:[e.jsx(ye,{children:e.jsx(we,{placeholder:a("settings.appearance.animationSpeedPlaceholder")})}),e.jsxs(Ce,{children:[e.jsx(F,{value:"fast",children:a("settings.appearance.animationFast")}),e.jsx(F,{value:"normal",children:a("settings.appearance.animationNormal")}),e.jsx(F,{value:"slow",children:a("settings.appearance.animationSlow")}),e.jsx(F,{value:"off",children:a("settings.appearance.animationOff")})]})]})]})]})})]}),e.jsxs(fe,{value:"backgrounds",children:[e.jsx(ve,{children:a("settings.appearance.backgroundGroup")}),e.jsx(be,{children:e.jsx("div",{className:"pt-2",children:e.jsxs(ss,{defaultValue:"page",children:[e.jsxs(ts,{className:"w-full grid grid-cols-5",children:[e.jsx(K,{value:"page",children:a("settings.appearance.bgPage")}),e.jsx(K,{value:"sidebar",children:a("settings.appearance.bgSidebar")}),e.jsx(K,{value:"header",children:"Header"}),e.jsx(K,{value:"card",children:"Card"}),e.jsx(K,{value:"dialog",children:"Dialog"})]}),["page","sidebar","header","card","dialog"].map(n=>e.jsx(pe,{value:n,className:"space-y-4 mt-4",children:(()=>{const d=(n==="sidebar"||n==="header")&&(H[n]?.inherit??!1);return e.jsxs(e.Fragment,{children:[n!=="page"&&e.jsxs("div",{className:"flex items-center justify-between rounded-lg border bg-muted/30 px-4 py-3",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx(p,{className:"text-sm font-medium",children:a("settings.appearance.inheritParentBg")}),e.jsx("p",{className:"text-xs text-muted-foreground",children:a("settings.appearance.inheritParentBgDesc")})]}),e.jsx(De,{checked:H[n]?.inherit??!1,onCheckedChange:D=>cs(n,D)})]}),d&&e.jsx("div",{className:"rounded-lg border bg-muted/30 px-4 py-3 text-sm text-muted-foreground",children:"该层当前直接继承界面背景,下面的资源、效果和 CSS 调节已禁用。"}),e.jsx(Ks,{assetId:H[n]?.assetId,onAssetSelect:D=>rs(n,D),disabled:d}),e.jsx(Js,{effects:H[n]?.effects??Ye,onChange:D=>is(n,D),disabled:d}),e.jsx(Zs,{componentId:n,value:H[n]?.customCSS??"",onChange:D=>ls(n,D),disabled:d})]})})()},n))]})})})]})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-3 sm:mb-4",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-base sm:text-lg font-semibold",children:a("settings.appearance.customCss")}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:a("settings.appearance.cssDescription")})]}),e.jsxs(j,{variant:"outline",size:"sm",onClick:()=>{w(""),r({customCSS:""}),U([])},disabled:!t.customCSS,children:[e.jsx(me,{className:"h-4 w-4 mr-1"}),a("settings.appearance.clearCss")]})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-3 sm:p-4 space-y-3",children:[e.jsx(as,{value:v,language:"css",height:"250px",placeholder:a("settings.appearance.cssPlaceholder"),onChange:y}),W.length>0&&e.jsxs("div",{className:"rounded-md bg-yellow-50 dark:bg-yellow-950/30 border border-yellow-200 dark:border-yellow-800 p-3",children:[e.jsxs("div",{className:"flex items-center gap-2 text-yellow-800 dark:text-yellow-200 text-sm font-medium mb-1",children:[e.jsx(ge,{className:"h-4 w-4"}),a("settings.appearance.cssWarningTitle")]}),e.jsx("ul",{className:"text-xs text-yellow-700 dark:text-yellow-300 space-y-0.5 ml-6 list-disc",children:W.map((n,d)=>e.jsx("li",{children:n},d))})]})]})]}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:a("settings.appearance.animationEffect")}),e.jsxs("div",{className:"space-y-2 sm:space-y-3",children:[e.jsx("div",{className:"rounded-lg border bg-card p-3 sm:p-4",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-0.5 flex-1",children:[e.jsx(p,{htmlFor:"animations",className:"text-base font-medium cursor-pointer",children:a("settings.appearance.enableAnimations")}),e.jsx("p",{className:"text-sm text-muted-foreground",children:a("settings.appearance.enableAnimationsDesc")})]}),e.jsx(De,{id:"animations",checked:g,onCheckedChange:x})]})}),e.jsx("div",{className:"rounded-lg border bg-card p-4",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-0.5 flex-1",children:[e.jsx(p,{htmlFor:"waves-background",className:"text-base font-medium cursor-pointer",children:a("settings.appearance.loginWavesBackground")}),e.jsx("p",{className:"text-sm text-muted-foreground",children:a("settings.appearance.loginWavesBackgroundDesc")})]}),e.jsx(De,{id:"waves-background",checked:o,onCheckedChange:A})]})})]})]}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:a("settings.appearance.importExportTheme")}),e.jsxs("div",{className:"rounded-lg border bg-card p-3 sm:p-4 space-y-3",children:[e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-2",children:[e.jsxs(j,{onClick:he,variant:"outline",className:"gap-2",children:[e.jsx(Pe,{className:"h-4 w-4"}),a("settings.appearance.exportTheme")]}),e.jsxs(j,{onClick:()=>z.current?.click(),variant:"outline",className:"gap-2",children:[e.jsx(ze,{className:"h-4 w-4"}),a("settings.appearance.importTheme")]}),e.jsxs(ee,{children:[e.jsx(se,{asChild:!0,children:e.jsxs(j,{variant:"outline",className:"gap-2",children:[e.jsx(Z,{className:"h-4 w-4"}),a("settings.appearance.resetTheme")]})}),e.jsxs(te,{children:[e.jsxs(ae,{children:[e.jsx(ne,{children:a("settings.appearance.confirmResetTheme")}),e.jsx(re,{children:a("settings.appearance.confirmResetThemeDesc")})]}),e.jsxs(ie,{children:[e.jsx(le,{children:a("common.cancel")}),e.jsx(ce,{onClick:Me,children:a("settings.appearance.confirmResetAction")})]})]})]})]}),e.jsx("input",{ref:z,type:"file",accept:".json",onChange:G,className:"hidden"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:a("settings.appearance.exportDesc")})]})]})]})}function Y({name:s,value:c,foreground:t,border:r}){return e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsx("div",{className:oe("h-16 rounded-md shadow-sm flex items-center justify-center text-xs font-medium",r&&"border border-border"),style:{backgroundColor:`hsl(${c})`,color:t?`hsl(${t})`:void 0},children:"Aa"}),e.jsx("div",{className:"text-xs text-muted-foreground text-center truncate",title:s,children:s})]})}const Xs=[{table:"llm_usage",label:"llm_usage",description:"记录 LLM 调用统计信息"},{table:"tool_records",label:"tool_records",description:"记录工具使用记录"},{table:"mai_messages",label:"mai_messages",description:"清理收到的消息"}];function Ue(s){if(!Number.isFinite(s)||s<=0)return"0 B";const c=["B","KB","MB","GB","TB"],t=Math.min(Math.floor(Math.log(s)/Math.log(1024)),c.length-1),r=s/1024**t;return`${r.toFixed(r>=10||t===0?0:1)} ${c[t]}`}function Qs({cacheKey:s}){return s==="images"?e.jsx(Fs,{className:"h-4 w-4 text-primary"}):s==="emoji"||s==="emoji_thumbnails"?e.jsx(As,{className:"h-4 w-4 text-primary"}):e.jsx(Le,{className:"h-4 w-4 text-primary"})}function Ys({item:s,cleanupDisabled:c,onCleanup:t}){const r=s.key==="images"?"images":s.key==="emoji"?"emoji":s.key==="logs"?"log_files":null,u=r==="log_files"?"这会删除 logs 目录中的日志文件。操作不可撤销。":"这会删除对应目录中的文件,并移除数据库里的相关记录。操作不可撤销。";return e.jsxs("div",{className:"rounded-lg border bg-card p-4",children:[e.jsxs("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between",children:[e.jsxs("div",{className:"min-w-0 space-y-2",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Qs,{cacheKey:s.key}),e.jsx("h4",{className:"font-semibold",children:s.label})]}),e.jsx("p",{className:"break-all text-xs text-muted-foreground",children:s.path})]}),r&&e.jsxs(ee,{children:[e.jsx(se,{asChild:!0,children:e.jsxs(j,{variant:"outline",size:"sm",className:"gap-2",disabled:c,children:[e.jsx(me,{className:"h-4 w-4"}),"清理"]})}),e.jsxs(te,{children:[e.jsxs(ae,{children:[e.jsxs(ne,{children:["确认清理",s.label,"?"]}),e.jsx(re,{children:u})]}),e.jsxs(ie,{children:[e.jsx(le,{children:"取消"}),e.jsx(ce,{onClick:()=>t(r),children:"确认清理"})]})]})]})]}),e.jsxs("div",{className:"mt-4 grid grid-cols-2 gap-3 sm:grid-cols-4",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-xs text-muted-foreground",children:"文件数"}),e.jsx("div",{className:"text-lg font-semibold",children:s.file_count})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-xs text-muted-foreground",children:"占用空间"}),e.jsx("div",{className:"text-lg font-semibold",children:Ue(s.total_size)})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-xs text-muted-foreground",children:"数据库记录"}),e.jsx("div",{className:"text-lg font-semibold",children:s.db_records})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-xs text-muted-foreground",children:"目录状态"}),e.jsx("div",{className:"text-lg font-semibold",children:s.exists?"存在":"未创建"})]})]})]})}function et(){const{toast:s}=Ae(),[c,t]=i.useState(null),[r,u]=i.useState(!1),[N,g]=i.useState(null),[x,o]=i.useState([]),A=i.useMemo(()=>{const l=new Map;for(const b of c?.database.tables??[])l.set(b.name,b.rows);return l},[c?.database.tables]),h=x.reduce((l,b)=>l+(A.get(b)??0),0),a=i.useCallback(async()=>{u(!0);try{t(await Ps())}catch(l){s({title:"获取本地缓存失败",description:l instanceof Error?l.message:"请稍后重试",variant:"destructive"})}finally{u(!1)}},[s]),v=async l=>{g(l);try{const b=await Ke(l);await a(),s({title:b.message,description:`删除 ${b.removed_files} 个文件,释放 ${Ue(b.removed_bytes)},移除 ${b.removed_records} 条记录。`})}catch(b){s({title:"清理失败",description:b instanceof Error?b.message:"请稍后重试",variant:"destructive"})}finally{g(null)}},w=async()=>{g("database_logs");try{const l=await Ke("database_logs",x);o([]),await a(),s({title:l.message,description:`已清理 ${l.removed_records} 条数据库记录。`})}catch(l){s({title:"数据库清理失败",description:l instanceof Error?l.message:"请稍后重试",variant:"destructive"})}finally{g(null)}},L=(l,b)=>{o(R=>b?R.includes(l)?R:[...R,l]:R.filter(I=>I!==l))};return i.useEffect(()=>{a()},[a]),e.jsxs("div",{className:"space-y-4 sm:space-y-6",children:[e.jsx("div",{className:"rounded-lg border bg-card p-4 sm:p-6",children:e.jsxs("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",children:[e.jsxs("div",{children:[e.jsxs("h3",{className:"flex items-center gap-2 text-base font-semibold sm:text-lg",children:[e.jsx(Le,{className:"h-5 w-5"}),"本地缓存"]}),e.jsx("p",{className:"mt-1 text-xs text-muted-foreground sm:text-sm",children:"浏览 data 目录中的图片、表情包和数据库存储占用。"})]}),e.jsxs(j,{variant:"outline",onClick:a,disabled:r,className:"gap-2",children:[e.jsx(_e,{className:`h-4 w-4 ${r?"animate-spin":""}`}),"刷新"]})]})}),e.jsx("div",{className:"grid gap-4",children:(c?.directories??[]).map(l=>e.jsx(Ys,{item:l,cleanupDisabled:N!==null||r,onCleanup:v},l.key))}),e.jsx("div",{className:"rounded-lg border bg-card p-4 sm:p-6",children:e.jsxs("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between",children:[e.jsxs("div",{children:[e.jsxs("h3",{className:"flex items-center gap-2 text-base font-semibold sm:text-lg",children:[e.jsx(ns,{className:"h-5 w-5"}),"数据库清理"]}),e.jsx("p",{className:"mt-1 text-xs text-muted-foreground sm:text-sm",children:"清理数据库中的统计、工具和消息记录,不会删除日志文件、图片、表情文件和配置文件。"})]}),e.jsxs(ee,{children:[e.jsx(se,{asChild:!0,children:e.jsxs(j,{variant:"outline",className:"gap-2",disabled:N!==null||r,children:[e.jsx(me,{className:"h-4 w-4"}),"数据库清理"]})}),e.jsxs(te,{children:[e.jsxs(ae,{children:[e.jsx(ne,{children:"选择要清理的数据库记录范围"}),e.jsxs(re,{children:["数据库当前占用 ",Ue(c?.database.total_size??0),"。请手动勾选需要清理的表,默认不会选择任何内容。"]})]}),e.jsx("div",{className:"space-y-3",children:Xs.map(l=>{const b=A.get(l.table)??0,R=x.includes(l.table),I=`log-cleanup-${l.table}`;return e.jsxs("label",{htmlFor:I,className:"flex cursor-pointer items-start gap-3 rounded-md border p-3 hover:bg-muted/50",children:[e.jsx(Vs,{id:I,checked:R,onCheckedChange:B=>L(l.table,B===!0),className:"mt-0.5"}),e.jsxs("span",{className:"min-w-0 flex-1",children:[e.jsx("span",{className:"block text-sm font-medium",children:l.label}),e.jsx("span",{className:"block text-xs text-muted-foreground",children:l.description}),e.jsxs("span",{className:"mt-1 block text-xs text-muted-foreground",children:["当前 ",b," 条记录"]})]})]},l.table)})}),e.jsxs("div",{className:"rounded-md bg-muted/50 p-3 text-xs text-muted-foreground",children:["将清理 ",x.length," 张表,预计删除 ",h," 条记录。删除后数据库文件大小不一定立即缩小。"]}),e.jsxs(ie,{children:[e.jsx(le,{children:"取消"}),e.jsx(ce,{onClick:w,disabled:x.length===0,children:"确认清理"})]})]})]})]})})]})}function st(){const{t:s}=ke(),c=Xe(),{toast:t}=Ae(),[r,u]=i.useState(!1),[N,g]=i.useState(!1),[x,o]=i.useState(()=>Q("logCacheSize")),[A,h]=i.useState(()=>Q("wsReconnectInterval")),[a,v]=i.useState(()=>Q("wsMaxReconnectAttempts")),[w,L]=i.useState(()=>Q("dataSyncInterval")),[l,b]=i.useState(()=>Ze()),[R,I]=i.useState(!1),[B,W]=i.useState(!1),U=i.useRef(null);if(N)throw new Error("这是一个手动触发的测试错误,用于验证错误边界组件是否正常工作。");const f=()=>{b(Ze())},m=C=>{const T=C[0];o(T),Re("logCacheSize",T)},M=C=>{const T=C[0];h(T),Re("wsReconnectInterval",T)},z=C=>{const T=C[0];v(T),Re("wsMaxReconnectAttempts",T)},_=C=>{const T=C[0];L(T),Re("dataSyncInterval",T)},q=()=>{Ws.clearLogs(),t({title:s("settings.other.logCleared"),description:s("settings.other.logClearedDesc")})},O=()=>{const C=zs();f(),t({title:s("settings.other.cacheCleared"),description:s("settings.other.cacheClearedDesc",{count:C.clearedKeys.length})})},X=()=>{I(!0);try{const C=_s(),T=JSON.stringify(C,null,2),ue=new Blob([T],{type:"application/json"}),he=URL.createObjectURL(ue),G=document.createElement("a");G.href=he,G.download=`maibot-webui-settings-${new Date().toISOString().slice(0,10)}.json`,document.body.appendChild(G),G.click(),document.body.removeChild(G),URL.revokeObjectURL(he),t({title:s("settings.other.exportSuccess"),description:s("settings.other.exportSuccessDesc")})}catch(C){console.error("导出设置失败:",C),t({title:s("settings.other.exportFailed"),description:s("settings.other.exportFailedDesc"),variant:"destructive"})}finally{I(!1)}},y=C=>{const T=C.target.files?.[0];if(!T)return;W(!0);const ue=new FileReader;ue.onload=he=>{try{const G=he.target?.result,Me=JSON.parse(G),k=$s(Me);k.success?(o(Q("logCacheSize")),h(Q("wsReconnectInterval")),v(Q("wsMaxReconnectAttempts")),L(Q("dataSyncInterval")),f(),t({title:s("settings.other.importSuccess"),description:s("settings.other.importSuccessDesc",{imported:k.imported.length})+(k.skipped.length>0?s("settings.other.importSkippedSuffix",{skipped:k.skipped.length}):"")}),(k.imported.includes("theme")||k.imported.includes("accentColor"))&&t({title:s("settings.other.importRefreshHint"),description:s("settings.other.importRefreshHintDesc")})):t({title:s("settings.other.importFailed"),description:s("settings.other.importNoDataDesc"),variant:"destructive"})}catch(G){console.error("导入设置失败:",G),t({title:s("settings.other.importFailed"),description:s("settings.other.importInvalidDesc"),variant:"destructive"})}finally{W(!1),U.current&&(U.current.value="")}},ue.readAsText(T)},V=()=>{Hs(),o(Fe.logCacheSize),h(Fe.wsReconnectInterval),v(Fe.wsMaxReconnectAttempts),L(Fe.dataSyncInterval),f(),t({title:s("settings.other.resetDone"),description:s("settings.other.resetDoneDesc")})},xe=async()=>{u(!0);try{const C=await bs("/api/webui/setup/reset",{method:"POST"}),T=await C.json();C.ok&&T.success?(t({title:s("settings.other.resetSuccess"),description:s("settings.other.clearStorageSuccess")}),setTimeout(()=>{c({to:"/setup"})},1e3)):t({title:s("settings.other.resetFailed"),description:T.message||s("settings.other.clearStorageFailed"),variant:"destructive"})}catch(C){console.error("重置配置状态错误:",C),t({title:s("settings.other.resetFailed"),description:s("settings.other.clearStorageFailed"),variant:"destructive"})}finally{u(!1)}};return e.jsxs("div",{className:"space-y-4 sm:space-y-6",children:[e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6",children:[e.jsxs("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4 flex items-center gap-2",children:[e.jsx(ns,{className:"h-5 w-5"}),s("settings.other.performance")]}),e.jsxs("div",{className:"space-y-4 sm:space-y-5",children:[e.jsxs("div",{className:"rounded-lg bg-muted/50 p-3 sm:p-4",children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsxs("span",{className:"text-sm font-medium flex items-center gap-2",children:[e.jsx(Le,{className:"h-4 w-4"}),s("settings.other.localStorage")]}),e.jsx(j,{variant:"ghost",size:"sm",onClick:f,className:"h-7 px-2",children:e.jsx(_e,{className:"h-3 w-3"})})]}),e.jsx("div",{className:"text-2xl font-bold text-primary",children:Us(l.used)}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:s("settings.other.storageItems",{count:l.items})})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(p,{className:"text-sm font-medium",children:s("settings.other.logCache")}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:[x," ",s("settings.other.logCacheSizeUnit")]})]}),e.jsx($,{value:[x],onValueChange:m,min:100,max:5e3,step:100,className:"w-full"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:s("settings.other.logCacheSizeDesc")})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(p,{className:"text-sm font-medium",children:s("settings.other.dataSyncIntervalLabel")}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:[w," ",s("settings.other.dataSyncIntervalUnit")]})]}),e.jsx($,{value:[w],onValueChange:_,min:10,max:120,step:5,className:"w-full"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:s("settings.other.dataSyncIntervalDesc")})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(p,{className:"text-sm font-medium",children:s("settings.other.wsReconnectLabel")}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:[A/1e3," ",s("settings.other.wsReconnectUnit")]})]}),e.jsx($,{value:[A],onValueChange:M,min:1e3,max:1e4,step:500,className:"w-full"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:s("settings.other.wsReconnectDesc")})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(p,{className:"text-sm font-medium",children:s("settings.other.wsMaxReconnectLabel")}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:[a," ",s("settings.other.wsMaxReconnectUnit")]})]}),e.jsx($,{value:[a],onValueChange:z,min:3,max:30,step:1,className:"w-full"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:s("settings.other.wsMaxReconnectDesc")})]}),e.jsxs("div",{className:"flex flex-wrap gap-2 pt-2",children:[e.jsxs(j,{variant:"outline",size:"sm",onClick:q,className:"gap-2",children:[e.jsx(me,{className:"h-4 w-4"}),s("settings.other.clearLogCacheFn")]}),e.jsxs(ee,{children:[e.jsx(se,{asChild:!0,children:e.jsxs(j,{variant:"outline",size:"sm",className:"gap-2",children:[e.jsx(me,{className:"h-4 w-4"}),s("settings.other.clearLocalCache")]})}),e.jsxs(te,{children:[e.jsxs(ae,{children:[e.jsx(ne,{children:s("settings.other.confirmClearCache")}),e.jsx(re,{children:s("settings.other.confirmClearCacheDesc")})]}),e.jsxs(ie,{children:[e.jsx(le,{children:s("common.cancel")}),e.jsx(ce,{onClick:O,children:s("settings.other.confirmClear")})]})]})]})]})]})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6",children:[e.jsxs("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4 flex items-center gap-2",children:[e.jsx(Pe,{className:"h-5 w-5"}),s("settings.other.importExport")]}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground",children:s("settings.other.importExportDesc")}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsxs(j,{variant:"outline",onClick:X,disabled:R,className:"gap-2",children:[e.jsx(Pe,{className:"h-4 w-4"}),s(R?"settings.other.exporting":"settings.other.exportSettings")]}),e.jsx("input",{ref:U,type:"file",accept:".json",onChange:y,className:"hidden"}),e.jsxs(j,{variant:"outline",onClick:()=>U.current?.click(),disabled:B,className:"gap-2",children:[e.jsx(ze,{className:"h-4 w-4"}),s(B?"settings.other.importing":"settings.other.importSettings")]})]}),e.jsx("div",{className:"pt-2 border-t",children:e.jsxs(ee,{children:[e.jsx(se,{asChild:!0,children:e.jsxs(j,{variant:"outline",size:"sm",className:"gap-2 text-destructive hover:text-destructive",children:[e.jsx(Z,{className:"h-4 w-4"}),s("settings.other.resetAllSettingsBtn")]})}),e.jsxs(te,{children:[e.jsxs(ae,{children:[e.jsx(ne,{children:s("settings.other.confirmResetAll")}),e.jsx(re,{children:s("settings.other.confirmResetAllDesc")})]}),e.jsxs(ie,{children:[e.jsx(le,{children:s("common.cancel")}),e.jsx(ce,{onClick:V,children:s("settings.other.resetAllSettingsConfirm")})]})]})]})})]})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6",children:[e.jsx("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:s("settings.other.configWizard")}),e.jsxs("div",{className:"space-y-3 sm:space-y-4",children:[e.jsx("div",{className:"space-y-2",children:e.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground",children:s("settings.other.configWizardDesc")})}),e.jsxs(ee,{children:[e.jsx(se,{asChild:!0,children:e.jsxs(j,{variant:"outline",disabled:r,className:"gap-2",children:[e.jsx(Z,{className:oe("h-4 w-4",r&&"animate-spin")}),s("settings.other.rerunSetup")]})}),e.jsxs(te,{children:[e.jsxs(ae,{children:[e.jsx(ne,{children:s("settings.other.confirmRerunSetup")}),e.jsx(re,{children:s("settings.other.confirmRerunSetupDesc")})]}),e.jsxs(ie,{children:[e.jsx(le,{children:s("common.cancel")}),e.jsx(ce,{onClick:xe,children:s("settings.other.resetAllSettingsConfirm")})]})]})]})]})]}),e.jsxs("div",{className:"rounded-lg border border-dashed border-yellow-500/50 bg-yellow-500/5 p-4 sm:p-6",children:[e.jsxs("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4 flex items-center gap-2",children:[e.jsx(ge,{className:"h-5 w-5 text-yellow-500"}),s("settings.other.devTools")]}),e.jsxs("div",{className:"space-y-3 sm:space-y-4",children:[e.jsx("div",{className:"space-y-2",children:e.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground",children:s("settings.other.devToolsDesc")})}),e.jsxs(ee,{children:[e.jsx(se,{asChild:!0,children:e.jsxs(j,{variant:"destructive",className:"gap-2",children:[e.jsx(ge,{className:"h-4 w-4"}),s("settings.other.triggerError")]})}),e.jsxs(te,{children:[e.jsxs(ae,{children:[e.jsx(ne,{children:s("settings.other.confirmTriggerError")}),e.jsx(re,{children:s("settings.other.confirmTriggerErrorDesc")})]}),e.jsxs(ie,{children:[e.jsx(le,{children:s("common.cancel")}),e.jsx(ce,{onClick:()=>g(!0),className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",children:s("settings.other.confirmTrigger")})]})]})]})]})]})]})}const tt=[{id:"minLength",label:"长度至少 10 位",description:"Token 长度必须大于等于 10 个字符",validate:s=>s.length>=10},{id:"hasUppercase",label:"包含大写字母",description:"至少包含一个大写字母 (A-Z)",validate:s=>/[A-Z]/.test(s)},{id:"hasLowercase",label:"包含小写字母",description:"至少包含一个小写字母 (a-z)",validate:s=>/[a-z]/.test(s)},{id:"hasSpecialChar",label:"包含特殊符号",description:"至少包含一个特殊符号 (!@#$%^&*()_+-=[]{}|;:,.<>?/)",validate:s=>/[!@#$%^&*()_+\-=[\]{}|;:,.<>?/]/.test(s)}];function at(s){const c=tt.map(r=>({id:r.id,label:r.label,description:r.description,passed:r.validate(s)}));return{isValid:c.every(r=>r.passed),rules:c}}function nt(){const{t:s}=ke(),c=Xe(),[t,r]=i.useState(""),[u,N]=i.useState(""),[g,x]=i.useState(!1),[o,A]=i.useState(!1),[h,a]=i.useState(!1),[v,w]=i.useState(!1),[L,l]=i.useState(!1),[b,R]=i.useState(!1),[I,B]=i.useState(""),[W,U]=i.useState(!1),{toast:f}=Ae(),m=i.useMemo(()=>at(u),[u]),M=async y=>{if(!t){f({title:s("settings.security.cannotCopy"),description:s("settings.security.cannotCopyDesc"),variant:"destructive"});return}try{await navigator.clipboard.writeText(y),l(!0),f({title:s("settings.security.copySuccess"),description:s("settings.security.copySuccessDesc")}),setTimeout(()=>l(!1),2e3)}catch{f({title:s("settings.security.copyFailed"),description:s("settings.security.copyFailedDesc"),variant:"destructive"})}},z=async()=>{if(!u.trim()){f({title:s("settings.security.inputError"),description:s("settings.security.inputErrorDesc"),variant:"destructive"});return}if(!m.isValid){const y=m.rules.filter(V=>!V.passed).map(V=>V.label).join(", ");f({title:s("settings.security.formatError"),description:s("settings.security.formatErrorDesc",{failedRules:y}),variant:"destructive"});return}a(!0);try{const y=await fetch("/api/webui/auth/update",{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify({new_token:u.trim()})}),V=await y.json();y.ok&&V.success?(N(""),r(u.trim()),f({title:s("settings.security.updateSuccess"),description:s("settings.security.updateSuccessDesc")}),setTimeout(()=>{c({to:"/auth"})},1500)):f({title:s("settings.security.updateFailed"),description:V.message||s("settings.security.updateFailedDesc"),variant:"destructive"})}catch(y){console.error("更新 Token 错误:",y),f({title:s("settings.security.updateFailed"),description:s("settings.security.updateFailedConn"),variant:"destructive"})}finally{a(!1)}},_=async()=>{w(!0);try{const y=await fetch("/api/webui/auth/regenerate",{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include"}),V=await y.json();y.ok&&V.success?(r(V.token),B(V.token),R(!0),U(!1),f({title:s("settings.security.generateSuccess"),description:s("settings.security.generateSuccessDesc")})):f({title:s("settings.security.generateFailed"),description:V.message||s("settings.security.generateFailedDesc"),variant:"destructive"})}catch(y){console.error("生成 Token 错误:",y),f({title:s("settings.security.generateFailed"),description:s("settings.security.generateFailedConn"),variant:"destructive"})}finally{w(!1)}},q=async()=>{try{await navigator.clipboard.writeText(I),U(!0),f({title:s("settings.security.copySuccess"),description:s("settings.security.copySuccessDesc")})}catch{f({title:s("settings.security.copyFailed"),description:s("settings.security.copyFailedDesc"),variant:"destructive"})}},O=()=>{R(!1),setTimeout(()=>{B(""),U(!1)},300),setTimeout(()=>{c({to:"/auth"})},500)},X=y=>{y||O()};return e.jsxs("div",{className:"space-y-4 sm:space-y-6",children:[e.jsx(Ns,{open:b,onOpenChange:X,children:e.jsxs(ys,{className:"sm:max-w-md",children:[e.jsxs(ws,{children:[e.jsxs(Cs,{className:"flex items-center gap-2",children:[e.jsx(ge,{className:"h-5 w-5 text-yellow-500"}),s("settings.security.dialogTitle")]}),e.jsx(ks,{children:s("settings.security.dialogDesc")})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"rounded-lg border-2 border-primary/20 bg-primary/5 p-4",children:[e.jsx(p,{className:"text-xs text-muted-foreground mb-2 block",children:s("settings.security.dialogTokenLabel")}),e.jsx("div",{className:"font-mono text-sm break-all select-all bg-background p-3 rounded border",children:I})]}),e.jsx("div",{className:"rounded-lg border border-yellow-200 dark:border-yellow-900 bg-yellow-50 dark:bg-yellow-950/30 p-3",children:e.jsxs("div",{className:"flex gap-2",children:[e.jsx(ge,{className:"h-4 w-4 text-yellow-600 dark:text-yellow-500 flex-shrink-0 mt-0.5"}),e.jsxs("div",{className:"text-sm text-yellow-800 dark:text-yellow-300 space-y-1",children:[e.jsx("p",{className:"font-semibold",children:s("settings.security.important")}),e.jsxs("ul",{className:"list-disc list-inside space-y-0.5 text-xs",children:[e.jsx("li",{children:s("settings.security.tip1")}),e.jsx("li",{children:s("settings.security.tip2")}),e.jsx("li",{children:s("settings.security.tip3")}),e.jsx("li",{children:s("settings.security.tip4")})]})]})]})})]}),e.jsxs(Ss,{className:"gap-2 sm:gap-0",children:[e.jsx(j,{variant:"outline",onClick:q,className:"gap-2",children:W?e.jsxs(e.Fragment,{children:[e.jsx(Ee,{className:"h-4 w-4 text-green-500"}),s("settings.security.copied")]}):e.jsxs(e.Fragment,{children:[e.jsx(We,{className:"h-4 w-4"}),s("settings.security.copyToken")]})}),e.jsx(j,{onClick:O,children:s("settings.security.savedClose")})]})]})}),e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6",children:[e.jsx("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:s("settings.security.currentToken")}),e.jsx("div",{className:"space-y-3 sm:space-y-4",children:e.jsxs("div",{className:"space-y-2",children:[e.jsx(p,{htmlFor:"current-token",className:"text-sm",children:s("settings.security.yourToken")}),e.jsxs("div",{className:"flex flex-col sm:flex-row gap-2",children:[e.jsxs("div",{className:"relative flex-1",children:[e.jsx(de,{id:"current-token",type:g?"text":"password",value:t||"••••••••••••••••••••••••••••••••",readOnly:!0,className:"pr-10 font-mono text-sm",placeholder:s("settings.security.tokenStorePlaceholder")}),e.jsx("button",{onClick:()=>{t?x(!g):f({title:s("settings.security.cannotView"),description:s("settings.security.cannotViewDesc")})},className:"absolute right-2 top-1/2 -translate-y-1/2 p-1.5 hover:bg-accent rounded",title:s(g?"settings.security.hide":"settings.security.show"),children:g?e.jsx(Ge,{className:"h-4 w-4 text-muted-foreground"}):e.jsx(Je,{className:"h-4 w-4 text-muted-foreground"})})]}),e.jsxs("div",{className:"flex gap-2 w-full sm:w-auto",children:[e.jsx(j,{variant:"outline",size:"icon",onClick:()=>M(t),title:s("settings.security.copyTip"),className:"flex-shrink-0",disabled:!t,children:L?e.jsx(Ee,{className:"h-4 w-4 text-green-500"}):e.jsx(We,{className:"h-4 w-4"})}),e.jsxs(ee,{children:[e.jsx(se,{asChild:!0,children:e.jsxs(j,{variant:"outline",disabled:v,className:"gap-2 flex-1 sm:flex-none",children:[e.jsx(_e,{className:oe("h-4 w-4",v&&"animate-spin")}),e.jsx("span",{className:"hidden sm:inline",children:s("settings.security.regenerate")}),e.jsx("span",{className:"sm:hidden",children:s("settings.security.regenerateShort")})]})}),e.jsxs(te,{children:[e.jsxs(ae,{children:[e.jsx(ne,{children:s("settings.security.confirmRegenerate")}),e.jsx(re,{children:s("settings.security.confirmRegenerateFullDesc")})]}),e.jsxs(ie,{children:[e.jsx(le,{children:s("settings.security.cancel")}),e.jsx(ce,{onClick:_,children:s("settings.security.confirmGenerate")})]})]})]})]})]}),e.jsx("p",{className:"text-[10px] sm:text-xs text-muted-foreground",children:s("settings.security.safekeepTip")})]})})]}),e.jsxs("div",{className:"rounded-lg border bg-card p-4 sm:p-6",children:[e.jsx("h3",{className:"text-base sm:text-lg font-semibold mb-3 sm:mb-4",children:s("settings.security.customToken")}),e.jsxs("div",{className:"space-y-3 sm:space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(p,{htmlFor:"new-token",className:"text-sm",children:s("settings.security.newTokenLabel")}),e.jsxs("div",{className:"relative",children:[e.jsx(de,{id:"new-token",type:o?"text":"password",value:u,onChange:y=>N(y.target.value),className:"pr-10 font-mono text-sm",placeholder:s("settings.security.customTokenPlaceholder")}),e.jsx("button",{onClick:()=>A(!o),className:"absolute right-2 top-1/2 -translate-y-1/2 p-1.5 hover:bg-accent rounded",title:s(o?"settings.security.hide":"settings.security.show"),children:o?e.jsx(Ge,{className:"h-4 w-4 text-muted-foreground"}):e.jsx(Je,{className:"h-4 w-4 text-muted-foreground"})})]}),u&&e.jsxs("div",{className:"mt-3 space-y-2 p-3 rounded-lg bg-muted/50",children:[e.jsx("p",{className:"text-sm font-medium text-foreground",children:s("settings.security.tokenReqTitle")}),e.jsx("div",{className:"space-y-1.5",children:m.rules.map(y=>e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[y.passed?e.jsx(Ls,{className:"h-4 w-4 text-green-500 flex-shrink-0"}):e.jsx(Ms,{className:"h-4 w-4 text-muted-foreground flex-shrink-0"}),e.jsx("span",{className:oe(y.passed?"text-green-600 dark:text-green-400":"text-muted-foreground"),children:y.label})]},y.id))}),m.isValid&&e.jsx("div",{className:"mt-2 pt-2 border-t border-border",children:e.jsxs("div",{className:"flex items-center gap-2 text-sm text-green-600 dark:text-green-400",children:[e.jsx(Ee,{className:"h-4 w-4"}),e.jsx("span",{className:"font-medium",children:s("settings.security.tokenValid")})]})})]})]}),e.jsx(j,{onClick:z,disabled:h||!m.isValid||!u,className:"w-full sm:w-auto",children:s(h?"settings.security.updating":"settings.security.updateBtn")})]})]}),e.jsxs("div",{className:"rounded-lg border border-yellow-200 dark:border-yellow-900 bg-yellow-50 dark:bg-yellow-950/30 p-3 sm:p-4",children:[e.jsx("h4",{className:"text-sm sm:text-base font-semibold text-yellow-900 dark:text-yellow-200 mb-2",children:s("settings.security.securityTip")}),e.jsxs("ul",{className:"text-xs sm:text-sm text-yellow-800 dark:text-yellow-300 space-y-1 list-disc list-inside",children:[e.jsx("li",{children:s("settings.security.securityTip1")}),e.jsx("li",{children:s("settings.security.securityTip2")}),e.jsx("li",{children:s("settings.security.securityTip3")}),e.jsx("li",{children:s("settings.security.securityTip4")}),e.jsx("li",{children:s("settings.security.securityTip5")}),e.jsx("li",{children:s("settings.security.securityTip6")})]})]})]})}function Nt(){const{t:s}=ke();return e.jsxs("div",{className:"space-y-4 sm:space-y-6 p-4 sm:p-6",children:[e.jsx("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-4",children:e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl sm:text-3xl font-bold",children:s("settings.title")}),e.jsx("p",{className:"text-muted-foreground mt-1 sm:mt-2 text-sm sm:text-base",children:s("settings.description")})]})}),e.jsxs(ss,{defaultValue:"appearance",className:"w-full",children:[e.jsxs(ts,{className:"grid w-full grid-cols-2 sm:grid-cols-5 gap-0.5 sm:gap-1 h-auto p-1",children:[e.jsxs(K,{value:"appearance",className:"gap-1 sm:gap-2 text-xs sm:text-sm px-2 sm:px-3 py-2",children:[e.jsx(Os,{className:"h-3.5 w-3.5 sm:h-4 sm:w-4",strokeWidth:2,fill:"none"}),e.jsx("span",{children:s("settings.tabs.appearance")})]}),e.jsxs(K,{value:"security",className:"gap-1 sm:gap-2 text-xs sm:text-sm px-2 sm:px-3 py-2",children:[e.jsx(Es,{className:"h-3.5 w-3.5 sm:h-4 sm:w-4",strokeWidth:2,fill:"none"}),e.jsx("span",{children:s("settings.tabs.security")})]}),e.jsxs(K,{value:"local-cache",className:"gap-1 sm:gap-2 text-xs sm:text-sm px-2 sm:px-3 py-2",children:[e.jsx(Le,{className:"h-3.5 w-3.5 sm:h-4 sm:w-4",strokeWidth:2,fill:"none"}),e.jsx("span",{children:"本地缓存"})]}),e.jsxs(K,{value:"other",className:"gap-1 sm:gap-2 text-xs sm:text-sm px-2 sm:px-3 py-2",children:[e.jsx(Is,{className:"h-3.5 w-3.5 sm:h-4 sm:w-4",strokeWidth:2,fill:"none"}),e.jsx("span",{children:s("settings.tabs.other")})]}),e.jsxs(K,{value:"about",className:"gap-1 sm:gap-2 text-xs sm:text-sm px-2 sm:px-3 py-2",children:[e.jsx(Bs,{className:"h-3.5 w-3.5 sm:h-4 sm:w-4",strokeWidth:2,fill:"none"}),e.jsx("span",{children:s("settings.tabs.about")})]})]}),e.jsxs(Qe,{className:"h-[calc(100vh-240px)] sm:h-[calc(100vh-280px)] mt-4 sm:mt-6",children:[e.jsx(pe,{value:"appearance",className:"mt-0",children:e.jsx(qs,{})}),e.jsx(pe,{value:"security",className:"mt-0",children:e.jsx(nt,{})}),e.jsx(pe,{value:"local-cache",className:"mt-0",children:e.jsx(et,{})}),e.jsx(pe,{value:"other",className:"mt-0",children:e.jsx(st,{})}),e.jsx(pe,{value:"about",className:"mt-0",children:e.jsx(Gs,{})})]})]})]})}export{Nt as SettingsPage};
|