import{V as Ye,c as Lt,e as At,p as Re,f as Mt,_ as $e,a as Ot,b as jt,d as Fe}from"./VAppBarTitle-BNNBNBux.js";import{_ as Q,aL as Xe,Z as g,an as Ne,aM as Pt,F as L,D as f,k as n,B as z,E as s,J as d,K as N,G as O,A as C,$ as x,V as A,T as Ve,am as Ut,H as oe,aN as ve,ap as Ze,ao as De,I as ye,r as Te,ac as Bt,aO as ze,aP as et,aQ as Rt,g as tt,p as nt,Q as Ft,aR as zt,aS as Qt,aT as Qe,a1 as He,aU as Ht,aV as Kt,j as qt,W as Wt,x as Jt,z as Gt}from"./index-BeUFf4mM.js";import{f as P,g as W,c as J,d as I,e as j,V as Ie,a as fe,i as st}from"./VList-mxXRVYSU.js";import{a as Ee,c as Yt,b as $t}from"./VSwitch-BcDKPi3v.js";import{b as ae,V as it,a as at,g as Xt,h as Zt}from"./VTextarea-iKuPPRV_.js";import{a as re,b as X,i as Le,V as te,l as Ae,g as me,e as R,h as ot,k as rt,f as en,d as tn}from"./VRow-D3TggiFy.js";import{V as nn}from"./VAlert-AXD1S3cp.js";import{V as sn,a as an,b as on,c as rn}from"./VExpansionPanels-BKomIywD.js";import"./ssrBoot-CbpyJ2Nq.js";const un={name:"SettingItem",props:{settingKey:{type:String,required:!0},icon:{type:String,default:null},disabled:{type:Boolean,default:!1},title:{type:String,default:null},description:{type:String,default:null}},data(){return{localValue:null,definition:null,type:null,selectOptions:[],hasOptions:!1,minValue:0,maxValue:100,stepValue:1,showSnackbar:!1,snackbarText:"",fontFamilies:[{title:"Arial",value:"Arial, sans-serif"},{title:"Calibri",value:"Calibri, sans-serif"},{title:"Cambria",value:"Cambria, serif"},{title:"Consolas",value:"Consolas, monospace"},{title:"Courier New",value:"Courier New, monospace"},{title:"Georgia",value:"Georgia, serif"},{title:"Helvetica",value:"Helvetica, sans-serif"},{title:"Segoe UI",value:"Segoe UI, sans-serif"},{title:"Times New Roman",value:"Times New Roman, serif"},{title:"Trebuchet MS",value:"Trebuchet MS, sans-serif"},{title:"Verdana",value:"Verdana, sans-serif"},{title:"Monospace",value:"monospace"},{title:"Sans-serif",value:"sans-serif"},{title:"Serif",value:"serif"}],displayValueMappings:{"display.emptySubjectDisplay":{card:"卡片",button:"按钮"},"theme.mode":{light:"浅色",dark:"深色"},"server.provider":{server:"远程服务器",indexedDB:"本地存储"}},defaultIcons:{boolean:"mdi-toggle-switch-outline",number:"mdi-numeric",string:"mdi-form-textbox"}}},computed:{displayTitle(){if(this.title)return this.title;if(this.definition&&this.definition.description)return this.definition.description;const t=this.settingKey.split(".");return t[t.length-1]},displayDescription(){return this.description?this.description:this.settingKey},isFontFamily(){return this.settingKey.toLowerCase().includes("fontfamily")||this.settingKey.toLowerCase().includes("font.family")},isDefaultValue(){return this.definition?typeof this.localValue=="object"&&this.localValue!==null?JSON.stringify(this.localValue)===JSON.stringify(this.definition.default):this.localValue===this.definition.default:!0},settingIcon(){return this.icon?this.icon:this.definition&&this.definition.icon?this.definition.icon:this.defaultIcons[this.type]||"mdi-cog-outline"}},created(){this.loadSetting()},methods:{loadSetting(){if(this.definition=Pt(this.settingKey),!this.definition){console.error(`未找到设置项定义: ${this.settingKey}`);return}if(this.type=this.definition.type,this.localValue=g(this.settingKey),this.type==="string"){if(this.isFontFamily)this.selectOptions=this.fontFamilies,this.hasOptions=!0;else if(this.settingKey in this.displayValueMappings){const t=this.displayValueMappings[this.settingKey];this.selectOptions=Object.entries(t).map(([e,i])=>({title:i,value:e})),this.hasOptions=!0}else if(this.definition.validate){const e=this.definition.validate.toString().match(/\[(.*?)\]/);if(e){const l=e[1].split(",").map(a=>{const u=a.trim().replace(/['"]/g,"");return{title:this.getDisplayValue(u)||u,value:u}});l.length>0&&(this.selectOptions=l,this.hasOptions=!0)}}}if(this.type==="number"&&this.definition.validate){const t=this.definition.validate.toString(),e=t.match(/value\s*>=\s*(\d+)/);e&&(this.minValue=Number(e[1]));const i=t.match(/value\s*<=\s*(\d+)/);i&&(this.maxValue=Number(i[1]));const l=this.maxValue-this.minValue;l>100?this.stepValue=10:l>20?this.stepValue=5:l>10?this.stepValue=2:this.stepValue=1}},getDisplayValue(t){return this.settingKey in this.displayValueMappings&&this.displayValueMappings[this.settingKey][t]||t},updateSetting(t){let e=t;this.type==="boolean"?e=!!t:this.type==="number"&&(e=Number(t),ethis.maxValue&&(e=this.maxValue)),Ne(this.settingKey,e)?this.$emit("update",this.settingKey,e):(this.localValue=g(this.settingKey),this.$emit("error",this.settingKey))},adjustValue(t){if(this.type!=="number")return;const e=this.localValue+t;e>=this.minValue&&e<=this.maxValue&&(this.localValue=e,this.updateSetting(e))},copySettingId(){navigator.clipboard.writeText(this.settingKey).then(()=>{this.showSnackbarMessage("设置ID已复制到剪贴板")}).catch(t=>{console.error("复制失败:",t)})},copySettingValue(){let t="";typeof this.localValue=="object"&&this.localValue!==null?t=JSON.stringify(this.localValue):t=String(this.localValue),navigator.clipboard.writeText(t).then(()=>{this.showSnackbarMessage("设置值已复制到剪贴板")}).catch(e=>{console.error("复制失败:",e)})},resetToDefault(){this.definition&&(Xe(this.settingKey),this.localValue=g(this.settingKey),this.showSnackbarMessage("已重置为默认值"),this.$emit("update",this.settingKey,this.localValue))},showSnackbarMessage(t){this.snackbarText=t,this.showSnackbar=!0}}},ln={class:"text-caption text-grey-darken-1"},dn={class:"d-flex flex-column flex-sm-row align-center"},cn={key:0,class:"me-2"},hn={key:2,class:"d-flex align-center"},wn={key:0,class:"px-4 pb-2 pt-0"};function pn(t,e,i,l,a,u){return f(),L(oe,null,[n(I,{class:"setting-item",disabled:i.disabled},{prepend:s(()=>[n(A,{icon:u.settingIcon},null,8,["icon"])]),append:s(()=>[O("div",dn,[a.type!=="string"||a.hasOptions?(f(),L("div",cn,[a.type==="boolean"?(f(),C(Ee,{key:0,modelValue:a.localValue,"onUpdate:modelValue":[e[0]||(e[0]=r=>a.localValue=r),u.updateSetting],density:"comfortable","hide-details":"",disabled:i.disabled},null,8,["modelValue","disabled","onUpdate:modelValue"])):a.type==="string"&&a.hasOptions?(f(),C(Yt,{key:1,modelValue:a.localValue,"onUpdate:modelValue":[e[1]||(e[1]=r=>a.localValue=r),u.updateSetting],items:a.selectOptions,density:"compact","hide-details":"",disabled:i.disabled,class:"setting-select",variant:"outlined","bg-color":"surface","item-title":"title","item-value":"value"},null,8,["modelValue","items","disabled","onUpdate:modelValue"])):a.type==="number"?(f(),L("div",hn,[n(x,{icon:"mdi-minus",size:"small",variant:"text",disabled:i.disabled||a.localValue<=a.minValue,onClick:e[2]||(e[2]=r=>u.adjustValue(-a.stepValue))},null,8,["disabled"]),n(ae,{modelValue:a.localValue,"onUpdate:modelValue":[e[3]||(e[3]=r=>a.localValue=r),u.updateSetting],modelModifiers:{number:!0},type:"number",density:"compact","hide-details":"",min:a.minValue,max:a.maxValue,step:a.stepValue,disabled:i.disabled,class:"mx-2 setting-number-field",style:{width:"80px"},variant:"outlined","bg-color":"surface"},null,8,["modelValue","min","max","step","disabled","onUpdate:modelValue"]),n(x,{icon:"mdi-plus",size:"small",variant:"text",disabled:i.disabled||a.localValue>=a.maxValue,onClick:e[4]||(e[4]=r=>u.adjustValue(a.stepValue))},null,8,["disabled"])])):z("",!0)])):z("",!0),n(it,{location:"bottom"},{activator:s(({props:r})=>[n(x,Ve({icon:"mdi-dots-vertical",size:"small",variant:"text"},r,{class:"ml-2",disabled:i.disabled}),null,16,["disabled"])]),default:s(()=>[n(J,{density:"compact"},{default:s(()=>[n(I,{onClick:u.copySettingId},{prepend:s(()=>[n(A,{icon:"mdi-key",size:"small"})]),default:s(()=>[n(P,null,{default:s(()=>e[7]||(e[7]=[d("复制设置ID")])),_:1})]),_:1},8,["onClick"]),n(I,{onClick:u.copySettingValue},{prepend:s(()=>[n(A,{icon:"mdi-content-copy",size:"small"})]),default:s(()=>[n(P,null,{default:s(()=>e[8]||(e[8]=[d("复制设置值")])),_:1})]),_:1},8,["onClick"]),n(j),n(I,{onClick:u.resetToDefault,disabled:u.isDefaultValue},{prepend:s(()=>[n(A,{icon:"mdi-restore",size:"small"})]),default:s(()=>[n(P,null,{default:s(()=>e[9]||(e[9]=[d("重置为默认值")])),_:1})]),_:1},8,["onClick","disabled"])]),_:1})]),_:1})])]),default:s(()=>[n(P,{class:"text-wrap"},{default:s(()=>[d(N(u.displayTitle),1)]),_:1}),n(W,{class:"d-flex align-center text-wrap"},{default:s(()=>[O("span",ln,N(i.settingKey),1)]),_:1})]),_:1},8,["disabled"]),a.type==="string"&&!a.hasOptions?(f(),L("div",wn,[n(ae,{modelValue:a.localValue,"onUpdate:modelValue":[e[5]||(e[5]=r=>a.localValue=r),u.updateSetting],density:"compact","hide-details":"",disabled:i.disabled,class:"setting-text-field mt-1",variant:"outlined","bg-color":"surface"},null,8,["modelValue","disabled","onUpdate:modelValue"])])):z("",!0),n(Ut,{modelValue:a.showSnackbar,"onUpdate:modelValue":e[6]||(e[6]=r=>a.showSnackbar=r),timeout:2e3,color:"success",location:"top"},{default:s(()=>[d(N(a.snackbarText),1)]),_:1},8,["modelValue"])],64)}const ue=Q(un,[["render",pn],["__scopeId","data-v-d5f17fb4"]]),fn={name:"SettingsExplorer",components:{SettingItem:ue},data(){return{searchQuery:"",currentSettings:{},unwatchFunction:null}},computed:{isDeveloperMode(){return g("developer.enabled")},allSettings(){var e;const t=[];for(const[i,l]of Object.entries(De))this.searchQuery&&!i.toLowerCase().includes(this.searchQuery.toLowerCase())&&!((e=l.description)!=null&&e.toLowerCase().includes(this.searchQuery.toLowerCase()))||t.push({key:i,...l});return t},formattedSettings(){return JSON.stringify(this.currentSettings,null,2)}},created(){this.updateCurrentSettings(),this.unwatchFunction=Ze(()=>{this.updateCurrentSettings()})},beforeUnmount(){this.unwatchFunction&&this.unwatchFunction()},methods:{updateCurrentSettings(){this.currentSettings=ve()},onSettingUpdate(t,e){this.$emit("update",t,e),this.updateCurrentSettings()},onSettingError(t){this.$emit("error",t)},copySettingsToClipboard(){navigator.clipboard.writeText(JSON.stringify(this.currentSettings)).then(()=>{this.$emit("message",{type:"success",text:"设置已复制到剪贴板"})}).catch(t=>{console.error("复制到剪贴板失败:",t),this.$emit("message",{type:"error",text:"复制到剪贴板失败"})})}}},mn={class:"settings-explorer"},gn={class:"settings-json"};function bn(t,e,i,l,a,u){const r=ue;return f(),L("div",mn,[O("div",null,[n(ae,{modelValue:a.searchQuery,"onUpdate:modelValue":e[0]||(e[0]=c=>a.searchQuery=c),label:"搜索设置","prepend-inner-icon":"mdi-magnify",clearable:"",variant:"outlined",density:"comfortable",class:"mb-4"},null,8,["modelValue"]),n(J,null,{default:s(()=>[(f(!0),L(oe,null,ye(u.allSettings,c=>(f(),L("div",{key:c.key},[(f(),C(r,{key:c.key,"setting-key":c.key,disabled:c.requireDeveloper&&!u.isDeveloperMode,onUpdate:u.onSettingUpdate,onError:u.onSettingError},null,8,["setting-key","disabled","onUpdate","onError"])),n(j,{class:"my-2"})]))),128))]),_:1}),n(te,{border:""},{default:s(()=>[n(re,{class:"text-subtitle-1"},{default:s(()=>e[1]||(e[1]=[d("当前配置")])),_:1}),n(X,null,{default:s(()=>[O("pre",gn,N(u.formattedSettings),1)]),_:1}),n(Le,null,{default:s(()=>[n(Ie),n(x,{onClick:u.copySettingsToClipboard},{default:s(()=>[e[3]||(e[3]=d(" 复制到剪贴板 ")),n(A,{right:""},{default:s(()=>e[2]||(e[2]=[d("mdi-content-copy")])),_:1})]),_:1},8,["onClick"])]),_:1})]),_:1})])])}const ut=Q(fn,[["render",bn],["__scopeId","data-v-da09fd0e"]]),vn="Classworks",yn="module",xn="0.0.0",Sn={dev:"vite --host",build:"vite build",preview:"vite preview",lint:"eslint . --fix"},kn={"@mdi/font":"7.4.47",axios:"^1.8.4",idb:"^8.0.2","pinyin-pro":"^3.26.0","roboto-fontface":"*","typewriter-effect":"^2.21.0",vue:"^3.4.31",vuetify:"^3.8.0"},_n={"@eslint/js":"^9.14.0","@vite-pwa/assets-generator":"^1.0.0","@vitejs/plugin-vue":"^5.2.3",eslint:"^9.14.0","eslint-plugin-import":"^2.29.1","eslint-plugin-n":"^16.6.2","eslint-plugin-node":"^11.1.0","eslint-plugin-promise":"^6.4.0","eslint-plugin-vue":"^9.30.0",pinia:"^3.0.1",sass:"1.86.3","sass-embedded":"^1.86.3","unplugin-auto-import":"^19.1.2","unplugin-fonts":"^1.3.1","unplugin-vue-components":"^28.4.1","unplugin-vue-router":"^0.12.0",vite:"^5.4.17","vite-plugin-pwa":"^1.0.0","vite-plugin-vue-layouts":"^0.11.0","vite-plugin-vuetify":"^2.1.1","vue-router":"^4.5.0"},Ke={name:vn,private:!0,type:yn,version:xn,scripts:Sn,dependencies:kn,devDependencies:_n},Cn={name:"AboutCard",setup(){const t=Te([]),e=Te(!1),i=()=>{try{const a={...Ke.dependencies||{},...Ke.devDependencies||{}},u=Object.entries(a).map(([r,c])=>({name:r,version:c.replace(/[\^~]/g,""),description:l(r)}));t.value=u}catch(a){console.error("加载依赖信息失败:",a),t.value=[]}},l=a=>({vue:"渐进式 JavaScript 框架",vuetify:"材料设计组件框架",axios:"Promise 基础的 HTTP 客户端",pinia:"Vue 状态管理库","vue-router":"Vue.js 官方路由管理器","@vitejs/plugin-vue":"Vite 的 Vue 插件"})[a]||"";return Bt(()=>{i()}),{Dependencies:t,showDeps:e}}},Vn={class:"d-flex flex-column align-start"},Dn={class:"d-flex gap-2 flex-wrap mb-6"},Tn={class:"text-caption text-medium-emphasis"};function En(t,e,i,l,a,u){return f(),C(te,{border:""},{default:s(()=>[n(Ae,null,{prepend:s(()=>[n(A,{icon:"mdi-information",size:"large",class:"mr-2"})]),default:s(()=>[n(re,{class:"text-h6"},{default:s(()=>e[3]||(e[3]=[d("关于")])),_:1})]),_:1}),n(X,null,{default:s(()=>[n(me,null,{default:s(()=>[n(R,{cols:"12",md:"8",class:"mx-auto"},{default:s(()=>[O("div",Vn,[n(ot,{size:"120",class:"mb-4"},{default:s(()=>[n(rt,{src:"https://github.com/SunWuyuan.png",alt:"Sunwuyuan"})]),_:1}),e[20]||(e[20]=O("h2",{class:"text-h5 mb-2"},"Classworks",-1)),e[21]||(e[21]=O("p",{class:"text-body-1 mb-4"},"适用于班级大屏的作业板小工具",-1)),O("div",Dn,[n(x,{color:"red",variant:"tonal",href:"https://github.com/ClassworksDev/Classworks/issues",target:"_blank","prepend-icon":"mdi-bug"},{default:s(()=>e[4]||(e[4]=[d(" 报告问题 ")])),_:1}),n(x,{color:"primary",variant:"tonal",href:"https://qm.qq.com/q/qNBX4ZZVeg",target:"_blank","prepend-icon":"mdi-qqchat"},{default:s(()=>e[5]||(e[5]=[d(" QQ 群 ")])),_:1}),n(x,{variant:"text",href:"https://github.com/ClassworksDev/Classworks",target:"_blank","prepend-icon":"mdi-github"},{default:s(()=>e[6]||(e[6]=[d(" 前端 ")])),_:1}),n(x,{variant:"text",href:"https://github.com/ClassworksDev/ClassworksServer",target:"_blank","prepend-icon":"mdi-github"},{default:s(()=>e[7]||(e[7]=[d(" 后端 ")])),_:1})]),n(j,{class:"mb-4 w-100"}),e[22]||(e[22]=O("h3",{class:"text-h6 mb-2"},"备注与致谢",-1)),n(J,{class:"mb-4 bg-transparent"},{default:s(()=>[n(I,{href:"https://github.com/EnderWolf006/HomeworkBoard",target:"_blank","append-icon":"mdi-link"},{default:s(()=>[n(P,null,{default:s(()=>e[8]||(e[8]=[d(" 本项目受到 HomeworkBoard 的启发而开发 ")])),_:1}),n(W,null,{default:s(()=>e[9]||(e[9]=[d(" 感谢 EnderWolf006 (@EnderWolf) fhzit(@Hellofhz) KeyFac 等人的贡献 ")])),_:1})]),_:1}),n(I,{href:"https://hlyun.org",target:"_blank","append-icon":"mdi-link"},{default:s(()=>[n(P,null,{default:s(()=>e[10]||(e[10]=[d(" Classworks 由"),O("strong",null,"厚浪云",-1),d("提供 ")])),_:1}),n(W,null,{default:s(()=>e[11]||(e[11]=[d(" 长江后浪推前浪 浮事新人换旧人 ")])),_:1})]),_:1}),n(I,{href:"https://zerocat.houlangs.com",target:"_blank","append-icon":"mdi-link"},{default:s(()=>[n(P,null,{default:s(()=>e[12]||(e[12]=[d(" 感谢 ZeroCat 社区的开发者们 ")])),_:1}),n(W,null,{default:s(()=>e[13]||(e[13]=[d(" 新一代,开源,编程社区 ")])),_:1})]),_:1}),n(j,{class:"ma-1"}),n(I,{href:"https://github.com/HUSX100/IslandCaller",target:"_blank","append-icon":"mdi-link"},{default:s(()=>[n(P,null,{default:s(()=>e[14]||(e[14]=[d(" 本项目与 IslandCaller 没有从属关系 ")])),_:1}),n(W,null,{default:s(()=>e[15]||(e[15]=[d(" IslandCaller 是由 HUSX100 开发的基于 ClassIsland 提醒服务的轻量级点名器 ")])),_:1})]),_:1}),n(I,{href:"https://classisland.tech",target:"_blank","append-icon":"mdi-link"},{default:s(()=>[n(P,null,{default:s(()=>e[16]||(e[16]=[d(" 本项目与 ClassIsland 没有从属关系 ")])),_:1}),n(W,null,{default:s(()=>e[17]||(e[17]=[d(" ClassIsland 是由 HelloWRC 开发的适用于班级大屏的课表信息显示工具 ")])),_:1})]),_:1})]),_:1}),n(x,{variant:"text",class:"mb-4","prepend-icon":"mdi-package-variant",onClick:e[0]||(e[0]=r=>l.showDeps=!0)},{default:s(()=>e[18]||(e[18]=[d(" 查看使用的第三方库 ")])),_:1}),n(Ye,{modelValue:l.showDeps,"onUpdate:modelValue":e[2]||(e[2]=r=>l.showDeps=r),transition:"dialog-bottom-transition",fullscreen:""},{default:s(()=>[n(te,null,{default:s(()=>[n(Lt,null,{default:s(()=>[n(x,{icon:"mdi-close",onClick:e[1]||(e[1]=r=>l.showDeps=!1)}),n(At,null,{default:s(()=>e[19]||(e[19]=[d("使用的第三方库")])),_:1}),n(Ie)]),_:1}),n(X,null,{default:s(()=>[n(J,null,{default:s(()=>[(f(!0),L(oe,null,ye(l.Dependencies,r=>(f(),C(I,{key:r.name,href:"https://www.npmjs.com/package/"+r.name,target:"_blank","append-icon":"mdi-link"},{default:s(()=>[n(P,null,{default:s(()=>[d(N(r.name),1)]),_:2},1024),n(W,null,{default:s(()=>[d(" v"+N(r.version),1)]),_:2},1024)]),_:2},1032,["href"]))),128))]),_:1})]),_:1})]),_:1})]),_:1},8,["modelValue"]),O("p",Tn," Copyright © "+N(new Date().getFullYear())+" Sunwuyuan ",1)])]),_:1})]),_:1})]),_:1})]),_:1})}const lt=Q(Cn,[["render",En]]),Nn={name:"SettingsCard",props:{title:{type:String,required:!0},icon:{type:String,required:!0},loading:{type:Boolean,default:!1}}};function In(t,e,i,l,a,u){return f(),C(te,{elevation:"2",class:"settings-card rounded-lg"},{default:s(()=>[n(Ae,null,{prepend:s(()=>[n(A,{icon:i.icon,size:"large",class:"mr-2"},null,8,["icon"])]),default:s(()=>[n(re,{class:"text-h6"},{default:s(()=>[d(N(i.title),1)]),_:1})]),_:1}),n(X,null,{default:s(()=>[i.loading?(f(),C(et,{key:0,indeterminate:"",color:"primary",class:"mb-4"})):z("",!0),ze(t.$slots,"default",{},void 0,!0)]),_:3}),t.$slots.actions?(f(),C(Le,{key:0,class:"pa-4"},{default:s(()=>[ze(t.$slots,"actions",{},void 0,!0)]),_:3})):z("",!0)]),_:3})}const H=Q(Nn,[["render",In],["__scopeId","data-v-3e8918ff"]]);var Ln=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function An(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var dt={exports:{}};(function(t,e){(function(i,l){t.exports=l()})(typeof self<"u"?self:Ln,()=>(()=>{var i={75:function(r){(function(){var c,p,k,b,S,M;typeof performance<"u"&&performance!==null&&performance.now?r.exports=function(){return performance.now()}:typeof process<"u"&&process!==null&&process.hrtime?(r.exports=function(){return(c()-S)/1e6},p=process.hrtime,b=(c=function(){var T;return 1e9*(T=p())[0]+T[1]})(),M=1e9*process.uptime(),S=b-M):Date.now?(r.exports=function(){return Date.now()-k},k=Date.now()):(r.exports=function(){return new Date().getTime()-k},k=new Date().getTime())}).call(this)},4087:(r,c,p)=>{for(var k=p(75),b=typeof window>"u"?p.g:window,S=["moz","webkit"],M="AnimationFrame",T=b["request"+M],F=b["cancel"+M]||b["cancelRequest"+M],G=0;!T&&G{var c=r&&r.__esModule?()=>r.default:()=>r;return a.d(c,{a:c}),c},a.d=(r,c)=>{for(var p in c)a.o(c,p)&&!a.o(r,p)&&Object.defineProperty(r,p,{enumerable:!0,get:c[p]})},a.g=function(){if(typeof globalThis=="object")return globalThis;try{return this||new Function("return this")()}catch{if(typeof window=="object")return window}}(),a.o=(r,c)=>Object.prototype.hasOwnProperty.call(r,c);var u={};return(()=>{a.d(u,{default:()=>kt});var r=a(4087),c=a.n(r);const p=function(v){return new RegExp(/<[a-z][\s\S]*>/i).test(v)},k=function(v,h){return Math.floor(Math.random()*(h-v+1))+v};var b="TYPE_CHARACTER",S="REMOVE_CHARACTER",M="REMOVE_ALL",T="REMOVE_LAST_VISIBLE_NODE",F="PAUSE_FOR",G="CALL_FUNCTION",ne="ADD_HTML_TAG_ELEMENT",Z="CHANGE_DELETE_SPEED",K="CHANGE_DELAY",E="CHANGE_CURSOR",Y="PASTE_STRING",ce="HTML_TAG";function ee(v){return ee=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(h){return typeof h}:function(h){return h&&typeof Symbol=="function"&&h.constructor===Symbol&&h!==Symbol.prototype?"symbol":typeof h},ee(v)}function se(v,h){var y=Object.keys(v);if(Object.getOwnPropertySymbols){var m=Object.getOwnPropertySymbols(v);h&&(m=m.filter(function($){return Object.getOwnPropertyDescriptor(v,$).enumerable})),y.push.apply(y,m)}return y}function le(v){for(var h=1;hv.length)&&(h=v.length);for(var y=0,m=new Array(h);y1&&arguments[1]!==void 0?arguments[1]:null;if(p(w))return o.typeOutHTMLString(w,_);if(w){var U=(o.options||{}).stringSplitter,B=typeof U=="function"?U(w):w.split("");o.typeCharacters(B,_)}return o}),V(this,"pasteString",function(w){var _=arguments.length>1&&arguments[1]!==void 0?arguments[1]:null;return p(w)?o.typeOutHTMLString(w,_,!0):(w&&o.addEventToQueue(Y,{character:w,node:_}),o)}),V(this,"typeOutHTMLString",function(w){var _=arguments.length>1&&arguments[1]!==void 0?arguments[1]:null,U=arguments.length>2?arguments[2]:void 0,B=function(he){var we=document.createElement("div");return we.innerHTML=he,we.childNodes}(w);if(B.length>0)for(var D=0;D0&&arguments[0]!==void 0?arguments[0]:"natural";return o.addEventToQueue(M,{speed:w}),o}),V(this,"changeDeleteSpeed",function(w){if(!w)throw new Error("Must provide new delete speed");return o.addEventToQueue(Z,{speed:w}),o}),V(this,"changeDelay",function(w){if(!w)throw new Error("Must provide new delay");return o.addEventToQueue(K,{delay:w}),o}),V(this,"changeCursor",function(w){if(!w)throw new Error("Must provide new cursor");return o.addEventToQueue(E,{cursor:w}),o}),V(this,"deleteChars",function(w){if(!w)throw new Error("Must provide amount of characters to delete");for(var _=0;_1&&arguments[1]!==void 0?arguments[1]:null;if(!w||!Array.isArray(w))throw new Error("Characters must be an array");return w.forEach(function(U){o.addEventToQueue(b,{character:U,node:_})}),o}),V(this,"removeCharacters",function(w){if(!w||!Array.isArray(w))throw new Error("Characters must be an array");return w.forEach(function(){o.addEventToQueue(S)}),o}),V(this,"addEventToQueue",function(w,_){var U=arguments.length>2&&arguments[2]!==void 0&&arguments[2];return o.addEventToStateProperty(w,_,U,"eventQueue")}),V(this,"addReverseCalledEvent",function(w,_){var U=arguments.length>2&&arguments[2]!==void 0&&arguments[2];return o.options.loop?o.addEventToStateProperty(w,_,U,"reverseCalledEvents"):o}),V(this,"addEventToStateProperty",function(w,_){var U=arguments.length>2&&arguments[2]!==void 0&&arguments[2],B=arguments.length>3?arguments[3]:void 0,D={eventName:w,eventArgs:_||{}};return o.state[B]=U?[D].concat(ie(o.state[B])):[].concat(ie(o.state[B]),[D]),o}),V(this,"runEventLoop",function(){o.state.lastFrameTime||(o.state.lastFrameTime=Date.now());var w=Date.now(),_=w-o.state.lastFrameTime;if(!o.state.eventQueue.length){if(!o.options.loop)return;o.state.eventQueue=ie(o.state.calledEvents),o.state.calledEvents=[],o.options=le({},o.state.initialOptions)}if(o.state.eventLoop=c()(o.runEventLoop),!o.state.eventLoopPaused){if(o.state.pauseUntil){if(w({typewriter:null,sourceWriter:null,currentQuote:Je,hasClicked:!1}),mounted(){this.initTypewriters()},methods:{initTypewriters(){this.typewriter=new qe(this.$refs.typewriter,Ge.main),this.sourceWriter=new qe(this.$refs.sourceWriter,Ge.source),this.typeQuote(Je)},typeQuote(t){this.typewriter.deleteAll(30).typeString(t.text).start(),t.author&&this.sourceWriter.deleteAll(20).typeString(t.author).start()},async handleClick(){this.hasClicked||(this.hasClicked=!0),await this.copyToClipboard(),this.currentQuote=this.getRandomQuote(),this.typeQuote(this.currentQuote)},getRandomQuote(){return We.quotes[Math.floor(Math.random()*We.quotes.length)]},async copyToClipboard(){if(!this.currentQuote)return;const{text:t,author:e,contributor:i,link:l}=this.currentQuote,a=[t,e&&`作者:${e}`,i&&`贡献者:${i}`,(l||i)&&`来源:${l||`https://github.com/${i}`}`].filter(Boolean);try{await navigator.clipboard.writeText(a.join(` `))}catch(u){console.error("复制失败:",u)}}},beforeUnmount(){[this.typewriter,this.sourceWriter].forEach(t=>t==null?void 0:t.stop())}},Pn={ref:"typewriter",class:"typewriter-text"},Un={ref:"sourceWriter",class:"source-text"};function Bn(t,e,i,l,a,u){const r=H;return f(),C(r,{border:"",title:"回声洞",icon:"mdi-thought-bubble",onClick:u.handleClick},{default:s(()=>[n(X,null,{default:s(()=>[O("div",Pn,null,512),O("div",Un,null,512)]),_:1}),n(Rt,{name:"fade"},{default:s(()=>{var c;return[(c=t.currentQuote)!=null&&c.contributor?(f(),C(fe,{key:0,class:"contributor"},{default:s(()=>[n(ot,{start:""},{default:s(()=>[n(rt,{src:`https://github.com/${t.currentQuote.contributor}.png`},null,8,["src"])]),_:1}),d(" "+N(t.currentQuote.contributor),1)]),_:1})):z("",!0)]}),_:1})]),_:1},8,["onClick"])}const ct=Q(jn,[["render",Bn],["__scopeId","data-v-5c15976c"]]),Rn={name:"UnsavedWarning",props:{show:Boolean,message:{type:String,default:"未保存"}}},Fn={class:"warning-container"};function zn(t,e,i,l,a,u){return f(),L("div",Fn,[i.show?(f(),C(fe,{key:0,color:"warning",size:"small",class:"warning-chip"},{default:s(()=>[d(N(i.message),1)]),_:1})):z("",!0)])}const ht=Q(Rn,[["render",zn],["__scopeId","data-v-0668f179"]]),Qn=nt({disabled:Boolean,modelValue:{type:Boolean,default:null},...Qt()},"VHover"),Hn=tt()({name:"VHover",props:Qn(),emits:{"update:modelValue":t=>!0},setup(t,e){let{slots:i}=e;const l=Ft(t,"modelValue"),{runOpenDelay:a,runCloseDelay:u}=zt(t,r=>!t.disabled&&(l.value=r));return()=>{var r;return(r=i.default)==null?void 0:r.call(i,{isHovering:l.value,props:{onMouseenter:a,onMouseleave:u}})}}}),Kn={name:"StudentListCard",components:{UnsavedWarning:ht},props:{modelValue:{type:Object,required:!0,default:()=>({list:[],text:"",advanced:!1})},loading:Boolean,error:String,isMobile:Boolean,unsavedChanges:Boolean},data(){return{newStudentName:"",editState:{index:-1,name:""}}},emits:["update:modelValue","save","reload"],computed:{text:{get(){return this.modelValue.text},set(t){this.handleTextInput(t)}}},methods:{toggleAdvanced(){const t=!this.modelValue.advanced;this.updateModelValue({advanced:t,text:t?this.modelValue.list.join(` `):this.modelValue.text,list:this.modelValue.list})},updateModelValue(t){this.$emit("update:modelValue",{...this.modelValue,...t})},addStudent(){const t=this.newStudentName.trim();if(!t||this.modelValue.list.includes(t))return;const e=[...this.modelValue.list,t];this.updateModelValue({list:e,text:e.join(` `)}),this.newStudentName=""},removeStudent(t){const e=this.modelValue.list.filter((i,l)=>l!==t);this.updateModelValue({list:e,text:e.join(` `)})},moveStudent(t,e){const i=[...this.modelValue.list];let l;if(e==="top"?l=0:e==="up"?l=t-1:l=t+1,l>=0&&li.trim()).filter(i=>i);this.updateModelValue({text:t,list:e})},sortStudentsByPinyin(){const t=[...this.modelValue.list].sort((e,i)=>{const l=Re(e,{toneType:"none",mode:"surname"}),a=Re(i,{toneType:"none",mode:"surname"});return l.localeCompare(a)});this.updateModelValue({list:t,text:t.join(` `)})}}},qn={key:0},Wn=["onClick"],Jn={key:1,class:"pt-2"};function Gn(t,e,i,l,a,u){const r=ht;return f(),C(te,{border:"",color:i.unsavedChanges?"warning-subtle":void 0,class:He({"unsaved-changes":i.unsavedChanges})},{default:s(()=>[n(Ae,null,{prepend:s(()=>[n(A,{icon:"mdi-account-group",size:"large",class:"mr-2"})]),append:s(()=>[n(r,{show:i.unsavedChanges,message:"有未保存的更改"},null,8,["show"]),n(x,{"prepend-icon":"mdi-sort-alphabetical-variant",variant:"text",class:"mr-2",onClick:u.sortStudentsByPinyin,disabled:i.modelValue.list.length===0},{default:s(()=>e[6]||(e[6]=[d(" 按姓名首字母排序 ")])),_:1},8,["onClick","disabled"]),n(x,{color:i.modelValue.advanced?"primary":void 0,variant:"text","prepend-icon":"mdi-code-braces",onClick:u.toggleAdvanced},{default:s(()=>[d(N(i.modelValue.advanced?"返回基础编辑":"高级编辑"),1)]),_:1},8,["color","onClick"])]),default:s(()=>[n(re,{class:"text-h6"},{default:s(()=>e[5]||(e[5]=[d("学生列表")])),_:1})]),_:1}),n(X,null,{default:s(()=>[i.loading?(f(),C(et,{key:0,indeterminate:"",color:"primary",class:"mb-4"})):z("",!0),i.error?(f(),C(nn,{key:1,type:"error",variant:"tonal",closable:"",class:"mb-4"},{default:s(()=>[d(N(i.error),1)]),_:1})):z("",!0),n(st,null,{default:s(()=>[i.modelValue.advanced?(f(),L("div",Jn,[n(at,{modelValue:u.text,"onUpdate:modelValue":e[2]||(e[2]=c=>u.text=c),label:"批量编辑学生列表",placeholder:"每行输入一个学生姓名",hint:"使用文本编辑模式批量编辑学生名单,保存时会自动去除空行","persistent-hint":"",variant:"outlined",rows:"10",onInput:u.handleTextInput},null,8,["modelValue","onInput"])])):(f(),L("div",qn,[n(me,{class:"mb-6"},{default:s(()=>[n(R,{cols:"12",sm:"6",md:"4"},{default:s(()=>[n(ae,{modelValue:a.newStudentName,"onUpdate:modelValue":e[0]||(e[0]=c=>a.newStudentName=c),label:"添加学生",placeholder:"输入学生姓名后回车添加","prepend-inner-icon":"mdi-account-plus",variant:"outlined","hide-details":"",class:"mb-4",onKeyup:Qe(u.addStudent,["enter"])},{append:s(()=>[n(x,{icon:"mdi-plus",variant:"text",color:"primary",disabled:!a.newStudentName.trim(),onClick:u.addStudent},null,8,["disabled","onClick"])]),_:1},8,["modelValue","onKeyup"])]),_:1})]),_:1}),n(me,null,{default:s(()=>[(f(!0),L(oe,null,ye(i.modelValue.list,(c,p)=>(f(),C(R,{key:p,cols:"12",sm:"6",md:"4",lg:"3"},{default:s(()=>[n(Hn,null,{default:s(({isHovering:k,props:b})=>[n(te,Ve({ref_for:!0},b,{elevation:i.isMobile?1:k?4:1,class:"student-card",border:""}),{default:s(()=>[n(X,{class:"d-flex align-center pa-3"},{default:s(()=>[n(it,{location:"bottom","open-on-hover":!i.isMobile},{activator:s(({props:S})=>[n(x,Ve({variant:"tonal",size:"small",class:"mr-3 font-weight-medium",ref_for:!0},S),{default:s(()=>[d(N(p+1),1)]),_:2},1040)]),default:s(()=>[n(J,{density:"compact",nav:""},{default:s(()=>[n(I,{"prepend-icon":"mdi-arrow-up-bold",disabled:p===0,onClick:S=>u.moveStudent(p,"top")},{default:s(()=>e[7]||(e[7]=[d(" 置顶 ")])),_:2},1032,["disabled","onClick"]),n(j),n(I,{"prepend-icon":"mdi-arrow-up",disabled:p===0,onClick:S=>u.moveStudent(p,"up")},{default:s(()=>e[8]||(e[8]=[d(" 上移 ")])),_:2},1032,["disabled","onClick"]),n(I,{"prepend-icon":"mdi-arrow-down",disabled:p===i.modelValue.list.length-1,onClick:S=>u.moveStudent(p,"down")},{default:s(()=>e[9]||(e[9]=[d(" 下移 ")])),_:2},1032,["disabled","onClick"])]),_:2},1024)]),_:2},1032,["open-on-hover"]),a.editState.index===p?(f(),C(ae,{key:0,modelValue:a.editState.name,"onUpdate:modelValue":e[1]||(e[1]=S=>a.editState.name=S),density:"compact",variant:"underlined","hide-details":"",class:"flex-grow-1",autofocus:"",onKeyup:Qe(u.saveEdit,["enter"]),onBlur:u.saveEdit},null,8,["modelValue","onKeyup","onBlur"])):(f(),L("span",{key:1,class:"text-body-1 flex-grow-1",onClick:S=>u.handleClick(p,c)},N(c),9,Wn)),O("div",{class:He(["d-flex gap-1 action-buttons",{"opacity-100":k||i.isMobile}])},[n(x,{icon:"mdi-pencil",variant:"text",color:"primary",size:"small",onClick:S=>u.startEdit(p,c)},null,8,["onClick"]),n(x,{icon:"mdi-delete",variant:"text",color:"error",size:"small",onClick:S=>u.removeStudent(p)},null,8,["onClick"])],2)]),_:2},1024)]),_:2},1040,["elevation"])]),_:2},1024)]),_:2},1024))),128))]),_:1})]))]),_:1}),n(me,{class:"mt-6"},{default:s(()=>[n(R,{cols:"12",class:"d-flex gap-2"},{default:s(()=>[n(x,{color:"primary","prepend-icon":"mdi-content-save",size:"large",loading:i.loading,disabled:i.loading,onClick:e[3]||(e[3]=c=>t.$emit("save"))},{default:s(()=>e[10]||(e[10]=[d(" 保存名单 ")])),_:1},8,["loading","disabled"]),n(x,{color:"error",variant:"outlined","prepend-icon":"mdi-refresh",size:"large",loading:i.loading,disabled:i.loading,onClick:e[4]||(e[4]=c=>t.$emit("reload"))},{default:s(()=>e[11]||(e[11]=[d(" 重载名单 ")])),_:1},8,["loading","disabled"])]),_:1})]),_:1})]),_:1})]),_:1},8,["color","class"])}const wt=Q(Kn,[["render",Gn],["__scopeId","data-v-9de1f8ce"]]),Yn={name:"SettingsLinkGenerator",data(){return{selectedItems:[],generatedLink:"",linkCopied:!1,search:"",headers:[{title:"",key:"data-table-select"},{title:"设置项",key:"description",sortable:!0},{title:"当前值",key:"value",sortable:!0},{title:"键名",key:"key",class:"d-none d-sm-table-cell",sortable:!0},{title:"状态",key:"isChanged",sortable:!0}]}},computed:{settingItems(){const t=ve(),e=[];for(const[i,l]of Object.entries(De)){if(l.requireDeveloper&&!t["developer.enabled"])continue;const a=t[i]!==l.default;e.push({key:i,description:l.description||i,value:t[i],icon:l.icon||"mdi-cog",isChanged:a,defaultValue:l.default})}return e.sort((i,l)=>i.key.localeCompare(l.key))},filteredItems(){if(!this.search)return this.settingItems;const t=this.search.toLowerCase();return t==="已修改"?this.settingItems.filter(e=>e.isChanged):t==="是"||t==="否"?this.settingItems.filter(e=>typeof e.value=="boolean"&&(t==="是"?e.value:!e.value)):this.settingItems.filter(e=>{const i=e.description.toLowerCase(),l=e.key.toLowerCase(),a=String(e.value).toLowerCase(),u=e.isChanged?"已修改":"默认";return i.includes(t)||l.includes(t)||a.includes(t)||u.includes(t)})},hasDisplaySettings(){return this.selectedItems.some(t=>t.startsWith("display."))},hasEditSettings(){return this.selectedItems.some(t=>t.startsWith("edit."))},hasServerSettings(){return this.selectedItems.some(t=>t.startsWith("server."))},hasChangedSettings(){const t=ve();return this.selectedItems.some(e=>{const i=De[e];return i&&t[e]!==i.default})}},methods:{handleSelectionChange(t){this.selectedItems=t.map(e=>e.key),this.generateLink()},generateLink(){const t=`${window.location.protocol}//${window.location.host}/`,e=ve(),i={};for(const l of this.selectedItems)i[l]=e[l];if(Object.keys(i).length===0){this.generatedLink=t;return}try{const l=JSON.stringify(i),u=new TextEncoder().encode(l),c={config:btoa(Array.from(u).map(S=>String.fromCharCode(S)).join(""))},k=new URLSearchParams(window.location.search).get("date");k&&(c.date=k);const b=new URLSearchParams(c).toString();this.generatedLink=`${t}?${b}`}catch(l){console.error("生成链接失败:",l),this.generatedLink="链接生成失败,请重试"}this.linkCopied=!1},async copyLink(){this.generatedLink||this.generateLink();try{await navigator.clipboard.writeText(this.generatedLink),this.linkCopied=!0,setTimeout(()=>{this.linkCopied=!1},3e3)}catch(t){console.error("复制链接失败:",t)}},resetSelection(){this.selectedItems=[],this.generatedLink="",this.linkCopied=!1},selectAll(){this.selectedItems=this.settingItems.map(t=>t.key),this.generateLink()},selectDataSourceSettings(){const t=this.settingItems.filter(e=>e.key.startsWith("server.")).map(e=>e.key);this.selectedItems=t,this.generateLink()},selectChangedSettings(){const t=this.settingItems.filter(e=>e.isChanged).map(e=>e.key);this.selectedItems=t,this.generateLink()},selectByPrefix(t){const e=this.settingItems.filter(i=>i.key.startsWith(`${t}.`)).map(i=>i.key);this.selectedItems=e},autoGenerateLink(){this.selectedItems.length>0?this.generateLink():this.generatedLink=""},getSettingDescription(t){const e=this.settingItems.find(i=>i.key===t);return e?e.description:t}},watch:{selectedItems:{handler(){this.autoGenerateLink()},deep:!0}}},$n={class:"d-flex mb-3 gap-2 flex-wrap"},Xn={class:"d-flex align-center mt-3 mb-3 flex-wrap gap-2"},Zn={class:"d-flex align-center"},es={key:0},ts={key:1},ns={class:"text-caption text-grey"};function ss(t,e,i,l,a,u){return f(),C(te,{border:"",class:"settings-link-generator mb-4"},{default:s(()=>[n(re,{class:"text-h6"},{default:s(()=>[n(A,{start:"",icon:"mdi-link-variant",class:"mr-2"}),e[3]||(e[3]=d(" 设置分享 "))]),_:1}),n(X,null,{default:s(()=>[O("div",$n,[n(x,{size:"small",variant:"tonal",color:"primary","prepend-icon":"mdi-select-all",onClick:u.selectAll},{default:s(()=>e[4]||(e[4]=[d(" 全选 ")])),_:1},8,["onClick"]),n(x,{size:"small",variant:"tonal",color:"primary","prepend-icon":"mdi-server-network",onClick:u.selectDataSourceSettings},{default:s(()=>e[5]||(e[5]=[d(" 数据源设置 ")])),_:1},8,["onClick"]),n(x,{size:"small",variant:"tonal",color:"primary","prepend-icon":"mdi-compare",onClick:u.selectChangedSettings},{default:s(()=>e[6]||(e[6]=[d(" 已变更设置 ")])),_:1},8,["onClick"]),n(x,{size:"small",variant:"tonal",color:"error","prepend-icon":"mdi-select-remove",onClick:u.resetSelection},{default:s(()=>e[7]||(e[7]=[d(" 取消选择 ")])),_:1},8,["onClick"])]),O("div",Xn,[n(fe,{color:"primary",class:"mr-2"},{default:s(()=>[d(" 已选 "+N(a.selectedItems.length)+" 项设置 ",1)]),_:1}),a.selectedItems.length>0?(f(!0),L(oe,{key:0},ye(a.selectedItems,r=>(f(),C(fe,{key:r,size:"small",class:"mr-1",variant:"text"},{default:s(()=>[d(N(u.getSettingDescription(r)),1)]),_:2},1024))),128)):z("",!0)]),n(ae,{modelValue:a.generatedLink,"onUpdate:modelValue":e[0]||(e[0]=r=>a.generatedLink=r),label:"生成的链接",readonly:"",variant:"outlined",class:"mb-2","append-inner-icon":a.linkCopied?"mdi-check":"mdi-content-copy","onClick:appendInner":u.copyLink},null,8,["modelValue","append-inner-icon","onClick:appendInner"]),n(sn,{variant:"accordion"},{default:s(()=>[n(an,null,{default:s(()=>[n(on,null,{default:s(()=>e[8]||(e[8]=[d(" 显示设置列表详情 ")])),_:1}),n(rn,null,{default:s(()=>[n($t,{"items-per-page":u.settingItems.length,headers:a.headers,items:u.filteredItems,"item-value":"key",modelValue:a.selectedItems,"onUpdate:modelValue":e[2]||(e[2]=r=>a.selectedItems=r),"show-select":"",density:"compact",class:"rounded setting-table","onUpdate:selected":u.handleSelectionChange,"sort-by":[{key:"isChanged",order:"desc"}]},{top:s(()=>[n(ae,{modelValue:a.search,"onUpdate:modelValue":e[1]||(e[1]=r=>a.search=r),label:"搜索设置","prepend-inner-icon":"mdi-magnify","single-line":"","hide-details":"",class:"mb-4"},null,8,["modelValue"])]),"item.description":s(({item:r})=>[O("div",Zn,[n(A,{size:"small",icon:r.icon,class:"mr-2"},null,8,["icon"]),d(" "+N(r.description),1)])]),"item.value":s(({item:r})=>[typeof r.value=="boolean"?(f(),L("span",es,N(r.value?"是":"否"),1)):(f(),L("span",ts,N(r.value),1))]),"item.key":s(({item:r})=>[O("span",ns,N(r.key),1)]),"item.isChanged":s(({item:r})=>[n(fe,{size:"x-small",color:r.isChanged?"warning":"success",text:r.isChanged?"已修改":"默认",density:"compact"},null,8,["color","text"])]),_:2},1032,["items-per-page","headers","items","modelValue","onUpdate:selected"])]),_:1})]),_:1})]),_:1})]),_:1})]),_:1})}const pt=Q(Yn,[["render",ss]]),is={name:"ThemeSettingsCard",components:{SettingsCard:H},data(){return{localTheme:g("theme.mode")}},watch:{localTheme(t){Ne("theme.mode",t),this.updateTheme(t)}},setup(){return{theme:Ht()}},methods:{updateTheme(t){this.theme.global.name.value=t}}};function as(t,e,i,l,a,u){const r=H;return f(),C(r,{title:"主题设置",icon:"mdi-palette"},{default:s(()=>[n(J,null,{default:s(()=>[n(I,null,{prepend:s(()=>[n(A,{icon:"mdi-theme-light-dark",class:"mr-3"})]),append:s(()=>[n(Kt,{modelValue:a.localTheme,"onUpdate:modelValue":e[0]||(e[0]=c=>a.localTheme=c),density:"comfortable",color:"primary"},{default:s(()=>[n(x,{value:"light"},{default:s(()=>[n(A,{icon:"mdi-white-balance-sunny",class:"mr-2"}),e[3]||(e[3]=d(" 明亮 "))]),_:1}),n(x,{value:"dark"},{default:s(()=>[n(A,{icon:"mdi-moon-waning-crescent",class:"mr-2"}),e[4]||(e[4]=d(" 暗黑 "))]),_:1})]),_:1},8,["modelValue"])]),default:s(()=>[n(P,null,{default:s(()=>e[1]||(e[1]=[d("主题模式")])),_:1}),n(W,null,{default:s(()=>e[2]||(e[2]=[d("选择明亮或暗黑主题")])),_:1})]),_:1})]),_:1})]),_:1})}const ft=Q(is,[["render",as]]),os={name:"DisplaySettingsCard",components:{SettingsCard:H,SettingItem:ue},data(){return{}}};function rs(t,e,i,l,a,u){const r=ue,c=H;return f(),C(c,{title:"显示设置",icon:"mdi-monitor",border:""},{default:s(()=>[n(J,null,{default:s(()=>[n(r,{"setting-key":"display.emptySubjectDisplay"}),n(j,{class:"my-2"}),n(r,{"setting-key":"display.dynamicSort"}),n(j,{class:"my-2"}),n(r,{"setting-key":"display.showRandomButton"}),n(j,{class:"my-2"}),n(r,{"setting-key":"display.showFullscreenButton"}),n(j,{class:"my-2"}),n(r,{"setting-key":"display.cardHoverEffect"}),n(j,{class:"my-2"}),n(r,{"setting-key":"display.enhancedTouchMode"}),n(j,{class:"my-2"}),n(r,{"setting-key":"display.showAntiScreenBurnCard"})]),_:1})]),_:1})}const mt=Q(os,[["render",rs]]),us=nt({...Jt(),...Zt()},"VForm"),gt=tt()({name:"VForm",props:us(),emits:{"update:modelValue":t=>!0,submit:t=>!0},setup(t,e){let{slots:i,emit:l}=e;const a=Xt(t),u=Te();function r(p){p.preventDefault(),a.reset()}function c(p){const k=p,b=a.validate();k.then=b.then.bind(b),k.catch=b.catch.bind(b),k.finally=b.finally.bind(b),l("submit",k),k.defaultPrevented||b.then(S=>{var T;let{valid:M}=S;M&&((T=u.value)==null||T.submit())}),k.preventDefault()}return qt(()=>{var p;return n("form",{ref:u,class:["v-form",t.class],style:t.style,novalidate:!0,onReset:r,onSubmit:c},[(p=i.default)==null?void 0:p.call(i,a)])}),Wt(a,u)}}),ls={name:"RefreshSettingsCard",components:{SettingsCard:H},data(){return{}}};function ds(t,e,i,l,a,u){const r=ue,c=H;return f(),C(c,{title:"刷新设置",icon:"mdi-refresh-circle"},{default:s(()=>[n(gt,null,{default:s(()=>[n(J,null,{default:s(()=>[n(r,{"setting-key":"refresh.auto",title:"自动刷新"}),e[0]||(e[0]=d()),n(j,{class:"my-2"}),n(r,{"setting-key":"refresh.interval",title:"刷新间隔"})]),_:1})]),_:1})]),_:1})}const bt=Q(ls,[["render",ds]]),cs={};function hs(t,e,i,l,a,u){const r=ue,c=H;return f(),C(c,{title:"编辑设置",icon:"mdi-cog"},{default:s(()=>[n(J,null,{default:s(()=>[n(r,{"setting-key":"edit.autoSave"}),n(j,{class:"my-2"}),n(r,{"setting-key":"edit.blockNonTodayAutoSave"}),n(j,{class:"my-2"}),n(r,{"setting-key":"edit.confirmNonTodaySave"}),n(j,{class:"my-2"}),n(r,{"setting-key":"edit.refreshBeforeEdit"})]),_:1})]),_:1})}const vt=Q(cs,[["render",hs]]),ws={name:"DataProviderSettingsCard",components:{SettingsCard:H},data(){return{loading:!1,serverchecktime:{},confirmDialog:!1,confirmTitle:"",confirmMessage:"",confirmAction:null}},computed:{currentProvider(){return g("server.provider")}},methods:{async checkServerConnection(){this.loading=!0,this.serverchecktime=new Date;try{const t=g("server.domain");if((await Mt.get(`${t}/api/test`,{method:"GET",headers:{Accept:"application/json"}})).data.status==="success")this.$message.success("连接成功","服务器连接正常 延迟"+(new Date-this.serverchecktime)+"ms");else throw new Error("服务器响应异常")}catch(t){this.$message.error("连接失败",t.message||"无法连接到服务器")}finally{this.loading=!1}},confirmClearLocalStorage(){this.confirmTitle="确认清除",this.confirmMessage="此操作将清除所有本地存储的数据,确定要继续吗?",this.confirmAction=this.clearLocalStorage,this.confirmDialog=!0},clearLocalStorage(){try{localStorage.clear(),this.$message.success("清除成功","本地存储数据已清除"),this.confirmDialog=!1}catch(t){this.$message.error("清除失败",t.message)}},confirmClearIndexedDB(){this.confirmTitle="确认清除",this.confirmMessage="此操作将清除所有IndexedDB中的数据,确定要继续吗?",this.confirmAction=this.clearIndexedDB,this.confirmDialog=!0},async clearIndexedDB(){try{await window.indexedDB.deleteDatabase("ClassworksDB"),this.$message.success("清除成功","数据库缓存已清除"),this.confirmDialog=!1}catch(t){this.$message.error("清除失败",t.message)}},async exportData(){try{const t="ClassworksDB",e={indexedDB:{}},i=await new Promise((p,k)=>{const b=window.indexedDB.open(t);b.onerror=()=>k(b.error),b.onsuccess=()=>p(b.result)}),l=Array.from(i.objectStoreNames);for(const p of l){const b=i.transaction(p,"readonly").objectStore(p),S=await new Promise((M,T)=>{const F=b.getAll();F.onerror=()=>T(F.error),F.onsuccess=()=>M(F.result)});e.indexedDB[p]=S}const a=new Blob([JSON.stringify(e,null,2)],{type:"application/json"}),u=URL.createObjectURL(a),r=document.createElement("a"),c=new Date().toISOString().split("T")[0];r.href=u,r.download=`homework-indexeddb-${c}.json`,r.click(),URL.revokeObjectURL(u),this.$message.success("导出成功","IndexedDB数据已导出")}catch(t){console.error("导出失败:",t),this.$message.error("导出失败",t.message||"无法导出数据库数据")}},handleConfirm(){this.confirmAction&&this.confirmAction()}}};function ps(t,e,i,l,a,u){const r=H;return f(),C(r,{title:"数据源设置",icon:"mdi-database-cog"},{default:s(()=>[n(J,null,{default:s(()=>[u.currentProvider==="server"?(f(),C(I,{key:0},{prepend:s(()=>[n(A,{icon:"mdi-lan-connect",class:"mr-3"})]),append:s(()=>[n(x,{loading:a.loading,variant:"tonal",onClick:u.checkServerConnection},{default:s(()=>e[3]||(e[3]=[d(" 测试连接 ")])),_:1},8,["loading","onClick"])]),default:s(()=>[n(P,null,{default:s(()=>e[2]||(e[2]=[d("检查服务器连接")])),_:1})]),_:1})):z("",!0),u.currentProvider==="indexedDB"?(f(),L(oe,{key:1},[n(I,null,{prepend:s(()=>[n(A,{icon:"mdi-database",class:"mr-3"})]),append:s(()=>[n(x,{color:"error",variant:"tonal",onClick:u.confirmClearIndexedDB},{default:s(()=>e[6]||(e[6]=[d(" 清除 ")])),_:1},8,["onClick"])]),default:s(()=>[n(P,null,{default:s(()=>e[4]||(e[4]=[d("清除数据库缓存")])),_:1}),n(W,null,{default:s(()=>e[5]||(e[5]=[d("这将清除所有IndexedDB中的数据")])),_:1})]),_:1}),n(I,null,{prepend:s(()=>[n(A,{icon:"mdi-database-export",class:"mr-3"})]),append:s(()=>[n(x,{variant:"tonal",onClick:u.exportData},{default:s(()=>e[8]||(e[8]=[d(" 导出 ")])),_:1},8,["onClick"])]),default:s(()=>[n(P,null,{default:s(()=>e[7]||(e[7]=[d("导出数据库")])),_:1})]),_:1})],64)):z("",!0),n(I,null,{prepend:s(()=>[n(A,{icon:"mdi-lan-connect",class:"mr-3"})]),append:s(()=>[n(x,{variant:"tonal",to:"/cachemanagement"},{default:s(()=>e[10]||(e[10]=[d(" 查看 ")])),_:1})]),default:s(()=>[n(P,null,{default:s(()=>e[9]||(e[9]=[d("查看本地缓存")])),_:1})]),_:1})]),_:1}),n(Ye,{modelValue:a.confirmDialog,"onUpdate:modelValue":e[1]||(e[1]=c=>a.confirmDialog=c),"max-width":"400"},{default:s(()=>[n(te,null,{default:s(()=>[n(re,null,{default:s(()=>[d(N(a.confirmTitle),1)]),_:1}),n(X,null,{default:s(()=>[d(N(a.confirmMessage),1)]),_:1}),n(Le,null,{default:s(()=>[n(Ie),n(x,{color:"grey",variant:"text",onClick:e[0]||(e[0]=c=>a.confirmDialog=!1)},{default:s(()=>e[11]||(e[11]=[d("取消")])),_:1}),n(x,{color:"error",variant:"tonal",onClick:u.handleConfirm},{default:s(()=>e[12]||(e[12]=[d("确认")])),_:1},8,["onClick"])]),_:1})]),_:1})]),_:1},8,["modelValue"])]),_:1})}const yt=Q(ws,[["render",ps]]),fs={name:"ServerSettingsCard",components:{SettingsCard:H},props:{loading:Boolean},data(){return{}}};function ms(t,e,i,l,a,u){const r=ue,c=H;return f(),C(c,{title:"数据源设置",icon:"mdi-database",loading:i.loading},{default:s(()=>[n(gt,null,{default:s(()=>[n(r,{"setting-key":"server.provider",title:"数据提供者"}),n(j,{class:"my-2"}),n(r,{"setting-key":"server.domain",title:"服务器域名"}),e[0]||(e[0]=d()),n(j,{class:"my-2"}),n(r,{"setting-key":"server.classNumber",title:"班号"})]),_:1})]),_:1},8,["loading"])}const xt=Q(fs,[["render",ms]]),gs={name:"Settings",components:{ServerSettingsCard:xt,EditSettingsCard:vt,RefreshSettingsCard:bt,DisplaySettingsCard:mt,MessageLog:$e,SettingsCard:H,StudentListCard:wt,AboutCard:lt,DataProviderSettingsCard:yt,ThemeSettingsCard:ft,EchoChamberCard:ct,SettingsExplorer:ut,SettingsLinkGenerator:pt},setup(){const{mobile:t}=Gt();return{isMobile:t}},data(){return{settings:{server:{domain:g("server.domain"),classNumber:g("server.classNumber"),provider:g("server.provider")},refresh:{auto:g("refresh.auto"),interval:g("refresh.interval")},font:{size:g("font.size")},edit:{autoSave:g("edit.autoSave"),blockNonTodayAutoSave:g("edit.blockNonTodayAutoSave"),confirmNonTodaySave:g("edit.confirmNonTodaySave"),refreshBeforeEdit:g("edit.refreshBeforeEdit")},display:{emptySubjectDisplay:g("display.emptySubjectDisplay"),dynamicSort:g("display.dynamicSort"),showRandomButton:g("display.showRandomButton"),showFullscreenButton:g("display.showFullscreenButton")},developer:{enabled:g("developer.enabled"),showDebugConfig:g("developer.showDebugConfig")},message:{showSidebar:g("message.showSidebar"),maxActiveMessages:g("message.maxActiveMessages"),timeout:g("message.timeout"),saveHistory:g("message.saveHistory")}},dataProviders:[{title:"服务器",value:"server"},{title:"本地数据库",value:"indexedDB"}],studentData:{list:[],text:"",advanced:!1},newStudent:"",editingIndex:-1,editingName:"",deleteDialog:!1,studentToDelete:null,numberDialog:!1,newPosition:"",studentToMove:null,touchStartTime:0,touchTimeout:null,studentsLoading:!1,studentsError:null,debugConfig:"",loading:{server:!1,students:!1},hasUnsavedChanges:!1,lastSavedData:null}},watch:{settings:{handler(t){this.handleSettingsChange(t)},deep:!0},studentData:{handler(t){this.lastSavedData&&(this.hasUnsavedChanges=JSON.stringify(t.list)!==JSON.stringify(this.lastSavedData)),this.studentData.text=t.list.join(` `)},deep:!0}},mounted(){this.loadAllSettings(),this.unwatchSettings=Ze(()=>{this.loadAllSettings()}),this.loadStudentList(),this.refreshDebugConfig(),this.settings.developer.enabled||(this.settings.developer.showDebugConfig=!1,this.handleSettingsChange(this.settings))},beforeUnmount(){this.unwatchSettings&&this.unwatchSettings()},methods:{loadAllSettings(){Object.keys(this.settings).forEach(t=>{Object.keys(this.settings[t]).forEach(e=>{this.settings[t][e]=g(`${t}.${e}`)})})},handleSettingsChange(t){this.settingsChangeTimeout&&clearTimeout(this.settingsChangeTimeout),this.settingsChangeTimeout=setTimeout(()=>{Object.entries(t).forEach(([e,i])=>{Object.entries(i).forEach(([l,a])=>{const u=`${e}.${l}`,r=g(u);a!==r&&(Ne(u,a)?this.showMessage("设置已更新",`${u} 已保存`):(this.showError("保存失败",`${u} 设置失败`),this.settings[e][l]=r))})})},100)},showMessage(t,e="",i="success"){this.$message[i](t,e)},showError(t,e=""){this.$message.error(t,e)},async loadStudentList(){try{this.loading.students=!0,this.studentsError=null;const t=g("server.domain"),e=g("server.classNumber"),i=g("server.provider");if(!e)throw new Error("请先设置班号");const l=i==="server"?`${t}/${e}`:e,a=await Fe.loadConfig(i,l);if(!a.success)throw new Error(a.error.message);a.data&&Array.isArray(a.data.studentList)&&(this.studentData.list=a.data.studentList,this.studentData.text=a.data.studentList.join(` `),this.lastSavedData=[...a.data.studentList],this.hasUnsavedChanges=!1)}catch(t){console.error("加载学生列表失败:",t),this.studentsError=t.message||"加载失败,请检查设置",this.showError("加载失败",this.studentsError)}finally{this.loading.students=!1}},async saveStudents(){try{const t=g("server.domain"),e=g("server.classNumber"),i=g("server.provider");if(!e)throw new Error("请先设置班号");const l=i==="server"?`${t}/${e}`:e,a=await Fe.saveConfig(i,l,{studentList:this.studentData.list});if(!a.success)throw new Error(a.error.message);this.lastSavedData=[...this.studentData.list],this.hasUnsavedChanges=!1,this.showMessage("保存成功","学生列表已更新")}catch(t){console.error("保存学生列表失败:",t),this.showError("保存失败",t.message||"请重试")}},handleStudentDataChange(t){JSON.stringify(t.list)!==JSON.stringify(this.studentData.list)&&(this.studentData={...t},this.hasUnsavedChanges=!0)},saveEdit(){if(this.editingIndex!==-1){const t=this.editingName.trim();t&&t!==this.studentData.list[this.editingIndex]&&(this.studentData.list[this.editingIndex]=t),this.editingIndex=-1,this.editingName=""}},startEdit(t,e){this.editingIndex=t,this.editingName=e},confirmDelete(t){this.studentToDelete={index:t,name:this.studentData.list[t]},this.deleteDialog=!0},moveStudent(t,e){const i=e==="up"?t-1:t+1;i>=0&&i=0&&t0){const e=this.studentData.list[t];this.studentData.list.splice(t,1),this.studentData.list.unshift(e)}},addStudent(){const t=this.newStudent.trim();t&&!this.studentData.list.includes(t)&&(this.studentData.list.push(t),this.newStudent="")},removeStudent(t){t!==void 0&&(this.studentData.list.splice(t,1),this.deleteDialog=!1,this.studentToDelete=null)},resetFontSize(){Xe("font.size"),this.settings.font.size=g("font.size"),this.showMessage("字体已重置","字体大小已恢复默认值")},refreshDebugConfig(){const t={};Object.keys(this.settings).forEach(e=>{t[e]={},Object.keys(this.settings[e]).forEach(i=>{t[e][i]=g(`${e}.${i}`)})}),this.debugConfig=JSON.stringify(t,null,2)},async copyDebugConfig(){try{await navigator.clipboard.writeText(this.debugConfig),this.showMessage("复制成功","配置信息已复制到剪贴板")}catch(t){console.error("复制失败:",t),this.showError("复制失败","请手动复制")}},handleDeveloperChange(t){t||(this.settings.developer.showDebugConfig=!1,this.settings.message={showSidebar:!0,maxActiveMessages:5,timeout:5e3,saveHistory:!0})},resetDeveloperSettings(){this.settings.developer={enabled:!1,showDebugConfig:!1},this.settings.message={showSidebar:!0,maxActiveMessages:5,timeout:5e3,saveHistory:!0},this.handleSettingsChange(this.settings),this.showMessage("已重置","开发者设置已重置为默认值","warning")},adjustFontSize(t){const i=this.settings.font.size;t==="up"&&i<100?this.settings.font.size=i+2:t==="down"&&i>16&&(this.settings.font.size=i-2),this.handleSettingsChange(this.settings)},onSettingsSaved(){this.showMessage("设置已更新","您的设置已成功保存")},onSettingUpdate(t,e){this.showMessage("设置已更新",`${t} 已保存为 ${e}`)}}},bs={class:"settings-page"},vs={key:0},ys={class:"d-flex gap-2"};function xs(t,e,i,l,a,u){const r=xt,c=yt,p=vt,k=bt,b=mt,S=ft,M=pt,T=H,F=wt,G=ct,ne=lt,Z=ut,K=$e;return f(),L("div",bs,[n(jt,{elevation:"1"},{prepend:s(()=>[n(x,{icon:"mdi-arrow-left",variant:"text",onClick:e[0]||(e[0]=E=>t.$router.push("/"))})]),default:s(()=>[n(Ot,{class:"text-h6"},{default:s(()=>e[5]||(e[5]=[d("设置")])),_:1})]),_:1}),n(tn,{class:"py-4"},{default:s(()=>[n(me,null,{default:s(()=>[n(R,{cols:"12",md:"6"},{default:s(()=>[n(r,{border:"",loading:a.loading.server,onSaved:u.onSettingsSaved},null,8,["loading","onSaved"])]),_:1}),n(R,{cols:"12",md:"6"},{default:s(()=>[n(c,{border:""})]),_:1}),n(R,{cols:"12",md:"6"},{default:s(()=>[n(p,{onSaved:u.onSettingsSaved,border:""},null,8,["onSaved"])]),_:1}),n(R,{cols:"12",md:"6"},{default:s(()=>[n(k,{onSaved:u.onSettingsSaved,border:""},null,8,["onSaved"])]),_:1}),n(R,{cols:"12",md:"6"},{default:s(()=>[n(b,{onSaved:u.onSettingsSaved,border:""},null,8,["onSaved"])]),_:1}),n(R,{cols:"12",md:"6"},{default:s(()=>[n(S,{border:""})]),_:1}),n(R,{cols:"12"},{default:s(()=>[n(M,{border:""})]),_:1}),n(R,{cols:12,md:a.settings.developer.enabled?12:6},{default:s(()=>[n(T,{border:"",title:"开发者选项",icon:"mdi-developer-board"},{default:s(()=>[n(J,null,{default:s(()=>[n(I,null,{prepend:s(()=>[n(A,{icon:"mdi-code-tags",class:"mr-3"})]),append:s(()=>[n(Ee,{modelValue:a.settings.developer.enabled,"onUpdate:modelValue":e[1]||(e[1]=E=>a.settings.developer.enabled=E),density:"comfortable","hide-details":"",onChange:u.handleDeveloperChange},null,8,["modelValue","onChange"])]),default:s(()=>[n(P,null,{default:s(()=>e[6]||(e[6]=[d("启用开发者选项")])),_:1}),n(W,null,{default:s(()=>e[7]||(e[7]=[d("启用后可以查看和修改开发者设置")])),_:1})]),_:1}),a.settings.developer.enabled?(f(),L(oe,{key:0},[n(j,{class:"my-2"}),n(I,null,{prepend:s(()=>[n(A,{icon:"mdi-file-code",class:"mr-3"})]),append:s(()=>[n(Ee,{modelValue:a.settings.developer.showDebugConfig,"onUpdate:modelValue":e[2]||(e[2]=E=>a.settings.developer.showDebugConfig=E),density:"comfortable","hide-details":""},null,8,["modelValue"])]),default:s(()=>[n(P,null,{default:s(()=>e[8]||(e[8]=[d("显示调试配置")])),_:1}),n(W,null,{default:s(()=>e[9]||(e[9]=[d("显示当前的调试配置信息")])),_:1})]),_:1}),n(st,null,{default:s(()=>[a.settings.developer.showDebugConfig?(f(),L("div",vs,[n(j,{class:"my-2"}),n(at,{modelValue:a.debugConfig,"onUpdate:modelValue":e[3]||(e[3]=E=>a.debugConfig=E),label:"调试配置",readonly:"",rows:"10",class:"font-monospace mt-2"},null,8,["modelValue"]),O("div",ys,[n(x,{"prepend-icon":"mdi-refresh",variant:"text",onClick:u.refreshDebugConfig},{default:s(()=>e[10]||(e[10]=[d(" 刷新 ")])),_:1},8,["onClick"]),n(x,{"prepend-icon":"mdi-content-copy",variant:"text",onClick:u.copyDebugConfig},{default:s(()=>e[11]||(e[11]=[d(" 复制 ")])),_:1},8,["onClick"])])])):z("",!0)]),_:1})],64)):z("",!0)]),_:1})]),_:1})]),_:1},8,["md"]),n(R,{cols:"12"},{default:s(()=>[n(F,{modelValue:a.studentData,"onUpdate:modelValue":[e[4]||(e[4]=E=>a.studentData=E),u.handleStudentDataChange],loading:a.loading.students,error:a.studentsError,"is-mobile":l.isMobile,"unsaved-changes":a.hasUnsavedChanges,onSave:u.saveStudents,onReload:u.loadStudentList},null,8,["modelValue","loading","error","is-mobile","unsaved-changes","onSave","onReload","onUpdate:modelValue"])]),_:1}),n(R,{cols:"12"},{default:s(()=>[n(G,{border:""})]),_:1}),n(R,{cols:"12"},{default:s(()=>[n(ne)]),_:1}),a.settings.developer.enabled?(f(),C(R,{key:0,cols:"12"},{default:s(()=>[n(te,{border:""},{default:s(()=>[n(re,{class:"d-flex align-center"},{default:s(()=>[n(A,{icon:"mdi-cog-outline",class:"mr-2"}),e[12]||(e[12]=d(" 所有设置 "))]),_:1}),n(en,null,{default:s(()=>e[13]||(e[13]=[d(" 浏览和修改所有可用设置 ")])),_:1}),n(X,null,{default:s(()=>[n(Z,{onUpdate:u.onSettingUpdate},null,8,["onUpdate"])]),_:1})]),_:1})]),_:1})):z("",!0)]),_:1})]),_:1}),n(K,{ref:"messageLog"},null,512)])}const Is=Q(gs,[["render",xs]]);export{Is as default};