import{aP as q,Z as A,a5 as z,a4 as d,ai as ee,aQ as ie,A as O,o as T,i as u,j as Q,B as V,aj as ue,d as M,C as $,al as j,w as Y,F as re,G as Ie,I as Se,aR as Ae,aS as je,aT as le,n as ne,e as ce,r as _e,aU as ze,_ as qe,t as xe,au as We,av as Fe}from"./index-DxY3T2eL.js";import{d as Ve}from"./dataProvider-pUfZYUEz.js";import{V as ye}from"./VAlert-CLzQPrKY.js";import{V as He}from"./VSkeletonLoader-DbL8AWZ4.js";import"./axios-By_VLHe4.js";function Be(e){var t;return!e.examName||!((t=e.examInfos)!=null&&t.length)?!1:e.examInfos.every(r=>r.name&&r.start&&r.end)}function Ue(e){const t=e.examInfos.slice().sort((r,a)=>new Date(r.start).getTime()-new Date(a.start).getTime());for(let r=0;rnew Date(t[r+1].start).getTime())return!0;return!1}function Ze(e){return e.examInfos.slice().sort((t,r)=>new Date(t.start).getTime()-new Date(r.start).getTime())}function se(e){return{...e,examInfos:Ze(e)}}function P(e){return e?e.includes("T")||e.includes("Z")?new Date(e):e.match(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/)?new Date(e.replace(" ","T")):new Date(e):new Date(NaN)}class Qe{constructor(t=()=>Date.now()){this.tasks=new Map,this.timeouts=new Map,this.isRunning=!1,this.timeProvider=t}addTask(t,r,a,o){const n=`${r}-${a.name}-${t}`,i={id:n,executeTime:t,type:r,examInfo:a,callback:o,status:"pending"};return this.tasks.set(n,i),this.isRunning&&this.scheduleTask(i),n}scheduleTask(t){const r=this.timeProvider(),a=t.executeTime-r;if(a<=0)this.executeTask(t);else{const o=setTimeout(()=>{this.executeTask(t)},a);this.timeouts.set(t.id,o)}}executeTask(t){try{t.callback(),t.status="completed"}catch(a){console.error(`任务执行失败: ${t.id}`,a),t.status="failed"}const r=this.timeouts.get(t.id);r&&(clearTimeout(r),this.timeouts.delete(t.id))}createTasksForConfig(t,r={}){if(this.clear(),!t.examInfos||t.examInfos.length===0)return;const a=this.timeProvider();t.examInfos.forEach(o=>{const n=P(o.start).getTime(),i=P(o.end).getTime();if(n>a&&this.addTask(n,"exam-start",o,()=>{var s;console.log(`考试开始: ${o.name}`),(s=r.onExamStart)==null||s.call(r,o)}),i>a&&this.addTask(i,"exam-end",o,()=>{var s;console.log(`考试结束: ${o.name}`),(s=r.onExamEnd)==null||s.call(r,o)}),o.alertTime&&o.alertTime>0){const s=i-o.alertTime*60*1e3;s>a&&this.addTask(s,"exam-alert",o,()=>{var v;console.log(`考试提醒: ${o.name} 将在 ${o.alertTime} 分钟后结束`),(v=r.onExamAlert)==null||v.call(r,o,o.alertTime)})}})}start(){this.isRunning||(this.isRunning=!0,this.tasks.forEach(t=>{t.status==="pending"&&this.scheduleTask(t)}))}stop(){this.isRunning=!1,this.timeouts.forEach(t=>{clearTimeout(t)}),this.timeouts.clear()}clear(){this.stop(),this.tasks.clear()}updateTimeProvider(t){this.timeProvider=t,this.isRunning&&(this.stop(),this.start())}getTaskCount(){return this.tasks.size}getTaskDetails(){return Array.from(this.tasks.values()).map(t=>({id:t.id,executeTime:t.executeTime,type:t.type,examInfo:t.examInfo,status:t.status}))}getPendingTasks(){return this.getTaskDetails().filter(t=>t.status==="pending")}}class Z{static formatExamInfos(t,r){if(!(t!=null&&t.examInfos))return[];const a=se(t);let o="";return a.examInfos.map((n,i)=>{const s=P(n.start),v=P(n.end),C=r;let E="pending",m="未开始";C>v.getTime()?(E="completed",m="已结束"):C>=s.getTime()&&(E="inProgress",m="进行中");const f=s.toLocaleDateString("zh-CN",{month:"2-digit",day:"2-digit"});let S="";return f!==o&&(S=f,o=f),{index:i,name:n.name,date:S,timeRange:`${this.formatHourMinute(s)} ~ ${this.formatHourMinute(v)}`,status:E,statusText:m,rawData:n}})}static getExamStatus(t,r){if(!t)return{status:"unknown",message:"暂无考试安排"};const a=P(t.start).getTime(),o=P(t.end).getTime(),n=r;if(n=a&&n=a&&n0?`${r} ${o}小时${a%60}分钟`:a>0?`${r} ${a}分钟`:r==="剩余"?"即将结束":"未开始"}static formatDuration(t){const r=Math.max(0,Math.floor(t/1e3)),a=Math.floor(r/3600),o=Math.floor(r%3600/60),n=r%60,i=String(o).padStart(2,"0"),s=String(n).padStart(2,"0");return a>0?`${a}:${i}:${s}`:`${i}:${s}`}static formatCurrentTime(t){return new Date(t).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}static getStatusTheme(t){return{pending:"primary",inProgress:"success",completed:"default"}[t]||"default"}static getCurrentExamIndex(t,r){if(!(t!=null&&t.examInfos)||t.examInfos.length===0)return 0;const a=se(t).examInfos,o=r;for(let n=0;n=s&&o{(!o.name||o.name.trim()==="")&&r.push(`第${n+1}场考试名称不能为空`);try{const i=P(o.start),s=P(o.end);i>=s&&r.push(`第${n+1}场考试:开始时间必须早于结束时间`)}catch{r.push(`第${n+1}场考试:时间格式无效`)}o.alertTime&&(o.alertTime<0||o.alertTime>300)&&a.push(`第${n+1}场考试:提醒时间建议在0-300分钟之间`)}),{isValid:r.length===0,errors:r,warnings:a})):(r.push("配置对象为空"),{isValid:!1,errors:r,warnings:a})}}function Ke(e,t={roomNumber:"01"},r={getCurrentTime:()=>Date.now()},a={}){const o=A({currentExamIndex:0,loading:!1,loaded:!1,error:null}),n=A(e),i=A(r.getCurrentTime()),s=new Qe(r.getCurrentTime),v=d(()=>!n.value||o.value.currentExamIndex<0||o.value.currentExamIndex>=n.value.examInfos.length?null:n.value.examInfos[o.value.currentExamIndex]),C=d(()=>n.value?se(n.value).examInfos:[]),E=d(()=>Z.getExamStatus(v.value,i.value)),m=d(()=>{var g;return((g=v.value)==null?void 0:g.name)||"暂无考试"}),f=d(()=>Z.getExamTimeRange(v.value)),S=d(()=>Z.getRemainingTimeText(v.value,i.value)),h=d(()=>Z.formatCurrentTime(i.value)),I=d(()=>Z.formatExamInfos(n.value,i.value)),B=g=>g?Be(g)?Ue(g)?(o.value.error="考试时间存在重叠",o.value.loaded=!1,s.clear(),!1):(n.value=g,o.value.error=null,o.value.loaded=!0,W(),s.createTasksForConfig(g,{onExamStart:w=>{var k;console.log(`考试开始: ${w.name}`),i.value=r.getCurrentTime(),W(),(k=a.onExamStart)==null||k.call(a,w)},onExamEnd:w=>{var k;console.log(`考试结束: ${w.name}`),i.value=r.getCurrentTime(),W(),(k=a.onExamEnd)==null||k.call(a,w)},onExamAlert:(w,k)=>{var N;console.log(`考试提醒: ${w.name} 将在 ${k} 分钟后结束`),(N=a.onExamAlert)==null||N.call(a,w,k)},onExamSwitch:a.onExamSwitch}),s.start(),!0):(o.value.error="配置验证失败",o.value.loaded=!1,s.clear(),!1):(o.value.error="配置为空",o.value.loaded=!1,s.clear(),!1),W=()=>{var g;if(!((g=n.value)!=null&&g.examInfos))return;const w=C.value;if(!w.length)return;let k=Z.getCurrentExamIndex(n.value,i.value);const N=o.value.currentExamIndex,U=w[N];if(U){const K=U?U.end:void 0;if(K){const X=P(K).getTime();i.value>=X&&N{if(!n.value||g<0||g>=n.value.examInfos.length)return!1;const w=o.value.currentExamIndex;if(o.value.currentExamIndex=g,a.onExamSwitch&&w!==g){const k=C.value[w],N=C.value[g];a.onExamSwitch(k,N)}return!0};let x=null;const y=()=>{x||(x=setInterval(()=>{i.value=r.getCurrentTime()},1e3),r.onTimeChange&&r.onTimeChange(()=>{i.value=r.getCurrentTime(),s.updateTimeProvider(r.getCurrentTime)}))},_=()=>{x&&(clearInterval(x),x=null),r.offTimeChange&&r.offTimeChange(()=>{i.value=r.getCurrentTime()}),s.stop()};return z(i,()=>{var g;(g=n.value)!=null&&g.examInfos&&o.value.loaded&&i.value%3e4<1e3&&W()}),ee(()=>{y(),n.value&&B(n.value)}),ie(()=>{_()}),{state:le(o),examConfig:le(n),currentTime:le(i),currentExam:v,sortedExamInfos:C,formattedExamInfos:I,examStatus:E,currentExamName:m,currentExamTimeRange:f,remainingTime:S,formattedCurrentTime:h,updateConfig:B,updateCurrentExam:W,switchToExam:b,startTimeUpdates:y,stopTimeUpdates:_,taskQueue:{getTaskCount:()=>s.getTaskCount(),getTaskDetails:()=>s.getTaskDetails(),getPendingTasks:()=>s.getPendingTasks(),clear:()=>s.clear(),start:()=>s.start(),stop:()=>s.stop()},dataProcessor:Z}}const Ge={class:"card-content"},Je=q({__name:"BaseCard",props:{customClass:{default:""},customStyle:{default:()=>({})}},setup(e){return(t,r)=>(T(),O("div",{class:ce(["base-card",e.customClass]),style:ne(e.customStyle)},[u("div",Ge,[ue(t.$slots,"default",{},void 0)])],6))}}),H=(e,t)=>{const r=e.__vccOpts||e;for(const[a,o]of t)r[a]=o;return r},me=H(Je,[["__scopeId","data-v-1b507f4d"]]),Ye={class:"card-header"},Xe={class:"card-title"},et={class:"card-body"},tt=q({__name:"InfoCardWithIcon",props:{title:{},showIcon:{type:Boolean,default:!0},customClass:{default:""}},emits:["iconClick"],setup(e){return(t,r)=>(T(),Q(me,{"custom-class":e.customClass},{default:Y(()=>[u("div",Ye,[u("h3",Xe,$(e.title),1),e.showIcon?(T(),O("button",{key:0,class:"card-icon",onClick:r[0]||(r[0]=a=>t.$emit("iconClick"))},[...r[1]||(r[1]=[u("svg",{class:"icon-svg",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[u("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z"})],-1)])])):V("",!0)]),u("div",et,[ue(t.$slots,"default",{},void 0,!0)])]),_:3},8,["custom-class"]))}}),at=H(tt,[["__scopeId","data-v-cd49bf6c"]]),rt={class:"info-item"},ot={class:"info-label"},lt={class:"info-value"},nt=q({__name:"InfoItem",props:{label:{},value:{}},setup(e){return(t,r)=>(T(),O("div",rt,[u("div",ot,$(e.label),1),u("div",lt,$(e.value),1)]))}}),ae=H(nt,[["__scopeId","data-v-268ec3a9"]]),st={class:"room-number-display"},it=q({__name:"ExamRoomNumber",props:{roomNumber:{}},emits:["click"],setup(e,{emit:t}){const r=t,a=()=>{console.log("考场号被点击"),r("click")};return(o,n)=>(T(),O("div",{class:"exam-room-number",onClick:a},[u("div",st,$(e.roomNumber),1)]))}}),ut=H(it,[["__scopeId","data-v-cd6f7b3d"]]),ct={class:"exam-info-item"},mt={class:"exam-date"},dt={class:"exam-details"},vt={class:"exam-subject"},ft={class:"exam-time"},gt=q({__name:"ExamInfoItem",props:{date:{},subject:{},time:{},status:{}},setup(e){const t=e,r=d(()=>{switch(t.status){case"已结束":return"status-finished";case"进行中":return"status-ongoing";case"未开始":return"status-pending";default:return""}});return(a,o)=>(T(),O("div",ct,[u("div",mt,$(e.date),1),u("div",dt,[u("div",vt,$(e.subject),1),u("div",ft,$(e.time),1),u("div",{class:ce(["exam-status",r.value])},$(e.status),3)])]))}}),pt=H(gt,[["__scopeId","data-v-a18343db"]]),ht={class:"exam-info-list"},xt={key:0,class:"empty-state"},yt=q({__name:"CurrentExamInfo",props:{examInfos:{default:()=>[]}},setup(e){return(t,r)=>(T(),Q(me,{"custom-class":"current-exam-info-card"},{default:Y(()=>[r[1]||(r[1]=u("div",{class:"card-header"},[u("h3",{class:"card-title"},"本次考试信息")],-1)),u("div",ht,[(T(!0),O(re,null,Ie(e.examInfos,a=>(T(),Q(pt,{key:a.name,date:a.date,subject:a.name,time:a.timeRange,status:a.statusText},null,8,["date","subject","time","status"]))),128)),!e.examInfos||e.examInfos.length===0?(T(),O("div",xt,[...r[0]||(r[0]=[u("span",{class:"empty-text"},"暂无考试安排",-1)])])):V("",!0)])]),_:1}))}}),Ct=H(yt,[["__scopeId","data-v-c11ab571"]]);function Ne(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var Ce=e=>{var t=["strokeLinecap","fillRule","clipRule","strokeWidth"];return t.includes(e)?e.replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g,"$1-$2").toLowerCase():e},de=(e,t)=>{var r={};if(e.attrs)for(var[a,o]of Object.entries(e.attrs))if(typeof o=="string"&&o.startsWith("props.")){var n=o.split(".")[1];r[Ce(a)]=t[n]}else r[Ce(a)]=o;e.tag==="svg"&&(r.class=t.class,r.style=t.style,r.onClick=t.onClick);var i=e.children?e.children.map(s=>de(s,t)):[];return ze(e.tag,r,i)},kt="t",bt={classPrefix:kt};function Tt(){var{classPrefix:e}=bt;return{SIZE:{default:"",xs:"".concat(e,"-size-xs"),small:"".concat(e,"-size-s"),medium:"".concat(e,"-size-m"),large:"".concat(e,"-size-l"),xl:"".concat(e,"-size-xl"),block:"".concat(e,"-size-full-width")},STATUS:{loading:"".concat(e,"-is-loading"),disabled:"".concat(e,"-is-disabled"),focused:"".concat(e,"-is-focused"),success:"".concat(e,"-is-success"),error:"".concat(e,"-is-error"),warning:"".concat(e,"-is-warning"),selected:"".concat(e,"-is-selected"),active:"".concat(e,"-is-active"),checked:"".concat(e,"-is-checked"),current:"".concat(e,"-is-current"),hidden:"".concat(e,"-is-hidden"),visible:"".concat(e,"-is-visible"),expanded:"".concat(e,"-is-expanded"),indeterminate:"".concat(e,"-is-indeterminate")}}}function Pe(e){var t=Tt().SIZE,r=d(()=>e.value in t?t[e.value]:""),a=d(()=>e.value===void 0||e.value in t?{}:{fontSize:e.value});return{style:a,className:r}}function ke(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter(function(o){return Object.getOwnPropertyDescriptor(e,o).enumerable})),r.push.apply(r,a)}return r}function be(e){for(var t=1;te.size),o=d(()=>e.strokeColor?Array.isArray(e.strokeColor)?e.strokeColor[0]:e.strokeColor:"currentColor"),n=d(()=>{var h;return e.strokeColor?Array.isArray(e.strokeColor)?(h=e.strokeColor[1])!==null&&h!==void 0?h:e.strokeColor[0]:e.strokeColor:"currentColor"}),i=d(()=>e.fillColor?Array.isArray(e.fillColor)?e.fillColor[0]:e.fillColor:"transparent"),s=d(()=>{var h;return e.fillColor?Array.isArray(e.fillColor)?(h=e.fillColor[1])!==null&&h!==void 0?h:e.fillColor[0]:e.fillColor:"transparent"}),v=d(()=>e.fillColor?Array.isArray(e.fillColor)?e.fillColor[0]:e.fillColor:"currentColor"),{className:C,style:E}=Pe(a),m=d(()=>["t-icon","t-icon-logout",C.value]),f=d(()=>be(be({fill:"none"},E.value),r.style)),S=d(()=>({class:m.value,style:f.value,onClick:h=>{var I;return(I=e.onClick)===null||I===void 0?void 0:I.call(e,{e:h})},strokeColor1:o.value,strokeColor2:n.value,fillColor1:i.value,fillColor2:s.value,strokeWidth:e.strokeWidth||2,filledColor:v.value}));return()=>de(wt,S.value)}});function Te(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter(function(o){return Object.getOwnPropertyDescriptor(e,o).enumerable})),r.push.apply(r,a)}return r}function we(e){for(var t=1;te.size),o=d(()=>e.strokeColor?Array.isArray(e.strokeColor)?e.strokeColor[0]:e.strokeColor:"currentColor"),n=d(()=>{var h;return e.strokeColor?Array.isArray(e.strokeColor)?(h=e.strokeColor[1])!==null&&h!==void 0?h:e.strokeColor[0]:e.strokeColor:"currentColor"}),i=d(()=>e.fillColor?Array.isArray(e.fillColor)?e.fillColor[0]:e.fillColor:"transparent"),s=d(()=>{var h;return e.fillColor?Array.isArray(e.fillColor)?(h=e.fillColor[1])!==null&&h!==void 0?h:e.fillColor[0]:e.fillColor:"transparent"}),v=d(()=>e.fillColor?Array.isArray(e.fillColor)?e.fillColor[0]:e.fillColor:"currentColor"),{className:C,style:E}=Pe(a),m=d(()=>["t-icon","t-icon-setting",C.value]),f=d(()=>we(we({fill:"none"},E.value),r.style)),S=d(()=>({class:m.value,style:f.value,onClick:h=>{var I;return(I=e.onClick)===null||I===void 0?void 0:I.call(e,{e:h})},strokeColor1:o.value,strokeColor2:n.value,fillColor1:i.value,fillColor2:s.value,strokeWidth:e.strokeWidth||2,filledColor:v.value}));return()=>de(It,S.value)}});const At={class:"action-button-bar"},_t={class:"button-container"},Nt={class:"button-icon"},Pt={class:"button-text"},Ot={class:"button-icon"},$t={class:"ui-scale-bar"},Dt={class:"ui-scale-value"},Mt=q({__name:"ActionButtonBar",emits:["exit"],setup(e,{emit:t}){const r=t,a=A(m()),o=A(!1),n=A(!1),i=A(0),s=A(0);let v=null,C=null,E=null;function m(){const b=window.innerWidth;return b>=1920?1.2:b>=1440?1:b>=1024?.85:.7}const f=b=>{const x=window.autoScaleAnimationId;x&&(cancelAnimationFrame(x),window.autoScaleAnimationId=null),document.documentElement.style.setProperty("--ui-scale",String(b));const y=document.querySelector(".exam-container");y&&y.style.setProperty("--ui-scale",String(b)),console.log("Manual scale set to:",b),console.log("CSS variable --ui-scale is now:",getComputedStyle(document.documentElement).getPropertyValue("--ui-scale"))},S=()=>{console.log("UI Scale input changed:",a.value)};ee(()=>{a.value,f(a.value)}),z(a,b=>{console.log("uiScale watch triggered:",b),f(b),console.log("CSS variable --ui-scale set to:",b)}),ie(()=>{I(),E&&(cancelAnimationFrame(E),E=null)});const h=b=>{b.preventDefault(),console.log("开始长按退出"),n.value=!0,i.value=0,s.value=0;const x=performance.now(),y=3e3,_=1e3;v=window.setTimeout(()=>{B()},y);const g=w=>{const k=w-x;if(i.value=Math.min(k/y,1),k<=_){const N=k/_;s.value=N===1?1:1-Math.pow(2,-10*N)}else s.value=1;i.value<1?C=requestAnimationFrame(g):C=null};C=requestAnimationFrame(g)},I=()=>{v&&(clearTimeout(v),v=null),C&&(cancelAnimationFrame(C),C=null),n.value=!1,i.value=0;const b=s.value,x=performance.now(),y=500;if(b>0){const _=g=>{const w=g-x,k=Math.min(w/y,1),N=1-Math.pow(1-k,4);s.value=b*(1-N),k<1?E=requestAnimationFrame(_):(s.value=0,E=null)};E=requestAnimationFrame(_)}else s.value=0;console.log("取消长按退出")},B=()=>{console.log("退出播放(触发 exit 事件)"),r("exit")},W=()=>{console.log("打开播放设置弹窗"),o.value=!0};return(b,x)=>{const y=_e("t-dialog");return T(),O(re,null,[n.value||s.value>0?(T(),O("div",{key:0,class:"fullscreen-overlay",style:ne({"--darkness":s.value})},null,4)):V("",!0),u("div",At,[u("div",_t,[u("button",{class:ce(["action-button exit-button",{pressing:n.value}]),onMousedown:h,onMouseup:I,onMouseleave:I,onTouchstart:h,onTouchend:I,onTouchcancel:I},[n.value?(T(),O("div",{key:0,class:"progress-border",style:ne({"--progress":i.value})},null,4)):V("",!0),u("div",Nt,[M(j(Et))]),u("div",Pt,$(n.value?"按住退出":"退出播放"),1)],34),u("button",{class:"action-button",onClick:W},[u("div",Ot,[M(j(St))]),x[2]||(x[2]=u("div",{class:"button-text"},"播放设置",-1))])]),u("div",$t,[x[3]||(x[3]=u("label",{for:"ui-scale",class:"ui-scale-label"},"UI缩放:",-1)),Se(u("input",{id:"ui-scale",type:"range",min:"0.5",max:"2",step:"0.01","onUpdate:modelValue":x[0]||(x[0]=_=>a.value=_),onInput:S},null,544),[[Ae,a.value,void 0,{number:!0}]]),u("span",Dt,$(a.value.toFixed(2))+"x",1)])]),M(y,{visible:o.value,"onUpdate:visible":x[1]||(x[1]=_=>o.value=_),header:"播放设置",footer:!1,closeOnOverlayClick:!0,closeOnEscKeydown:!0},null,8,["visible"])],64)}}}),Rt=H(Mt,[["__scopeId","data-v-8847fe6b"]]),Lt={class:"content-wrapper"},jt={class:"left-column"},zt={class:"title-section"},qt={class:"clock-content"},Wt={class:"time-display"},Ft={class:"time-note"},Vt={class:"right-column"},Ht={class:"exam-room-container"},Bt={key:1,class:"room-number-modal"},Ut={class:"modal-content"},Zt={class:"modal-body"},Qt={class:"form-item"},Kt={class:"keyboard-container"},Ee="examaware:roomNumber",Gt=q({__name:"ExamPlayer",props:{examConfig:{},config:{default:()=>({roomNumber:"01"})},timeProvider:{default:()=>({getCurrentTime:()=>Date.now()})},timeSyncStatus:{default:"电脑时间"},roomNumber:{default:"01"},showActionBar:{type:Boolean,default:!0},allowEditRoomNumber:{type:Boolean,default:!0},eventHandlers:{default:()=>({})}},emits:["editClick","roomNumberClick","roomNumberChange","update:roomNumber","exit","examStart","examEnd","examAlert","examSwitch","error"],setup(e,{emit:t}){const r=A(null),a=e,o=t,n={...a.eventHandlers,onExamStart:l=>{var c,p;(p=(c=a.eventHandlers)==null?void 0:c.onExamStart)==null||p.call(c,l),o("examStart",l)},onExamEnd:l=>{var c,p;(p=(c=a.eventHandlers)==null?void 0:c.onExamEnd)==null||p.call(c,l),o("examEnd",l)},onExamAlert:(l,c)=>{var p,D;(D=(p=a.eventHandlers)==null?void 0:p.onExamAlert)==null||D.call(p,l,c),o("examAlert",l,c)},onExamSwitch:(l,c)=>{var p,D;(D=(p=a.eventHandlers)==null?void 0:p.onExamSwitch)==null||D.call(p,l,c),o("examSwitch",l,c)},onError:l=>{var c,p;(p=(c=a.eventHandlers)==null?void 0:c.onError)==null||p.call(c,l),o("error",l)}},i=Ke(a.examConfig,a.config||{roomNumber:a.roomNumber||"01"},a.timeProvider||{getCurrentTime:()=>Date.now()},n);z(()=>a.examConfig,l=>{console.log("ExamPlayer: 配置变化",l),i.updateConfig(l)},{immediate:!1,deep:!0}),z(()=>a.config,l=>{},{deep:!0}),z(()=>a.timeProvider,l=>{l&&(i.taskQueue.stop(),i.taskQueue.start())},{deep:!0});const{examConfig:s,currentExam:v,formattedExamInfos:C,examStatus:E,currentExamName:m,currentExamTimeRange:f,remainingTime:S,formattedCurrentTime:h}=i,I=A(!1),B=()=>{if(typeof window>"u")return null;try{const l=window.localStorage.getItem(Ee);return l&&l.trim()?l.trim():null}catch{return null}},W=l=>{if(!(typeof window>"u"))try{window.localStorage.setItem(Ee,l)}catch{}},b=A(a.roomNumber||B()||"01"),x=d(()=>a.roomNumber??b.value),y=A(x.value),_=A();let g=null;const w=()=>{if(!a.allowEditRoomNumber){o("roomNumberClick");return}y.value=x.value||"01",I.value=!0,setTimeout(()=>{N()},100)},k=l=>{l==="{clear}"?y.value="":l==="{bksp}"?y.value=y.value.slice(0,-1):/^[0-9a-zA-Z]$/.test(l)&&y.value.length<10&&(y.value+=l)},N=()=>{je(()=>import("./index-BvkH3f4i-DeI5J5cs.js"),[],import.meta.url).then(l=>l.i).then(({default:l})=>{_.value&&!g&&(g=new l(_.value,{layout:{default:["1 2 3","4 5 6","7 8 9","{clear} 0 {bksp}"]},display:{"{clear}":"清空","{bksp}":"⌫ 删除"},theme:"hg-theme-default hg-layout-numeric numeric-keyboard-dark",physicalKeyboardHighlight:!1,syncInstanceInputs:!1,mergeDisplay:!0,onKeyPress:c=>k(c)}))}).catch(l=>{console.warn("Failed to load simple-keyboard:",l)})},U=()=>{g&&(g.destroy(),g=null)},K=()=>{if(y.value&&y.value.trim()){const l=y.value.trim();b.value=l,W(l),o("update:roomNumber",l),o("roomNumberChange",l),I.value=!1,U()}else o("error","考场号不能为空")},X=()=>{I.value=!1,y.value=x.value||"01",U()},Oe=d(()=>C.value||[]),$e=d(()=>{var l;return((l=E.value)==null?void 0:l.status)==="pending"?"":S.value||""});ee(()=>{console.log("ExamPlayer: mounted, props.examConfig:",a.examConfig),console.log("ExamPlayer: examPlayer state:",i.state.value),console.log("ExamPlayer: formattedExamInfos:",C.value);const l=B();l&&l!==a.roomNumber&&(b.value=l,o("update:roomNumber",l),o("roomNumberChange",l))});let F=null,te=1;const ve=()=>{const l=window.innerWidth;return l>=1920?1.2:l>=1440?1:l>=1024?.85:.7},De=l=>1-Math.pow(1-l,3),fe=l=>{document.documentElement.style.setProperty("--ui-scale",String(l)),r.value&&r.value.style.setProperty("--ui-scale",String(l)),console.log("Auto-scale set to:",l)},Me=l=>{F&&cancelAnimationFrame(F);const c=te,p=performance.now(),D=400,R=J=>{const Re=J-p,pe=Math.min(Re/D,1),Le=De(pe),he=c+(l-c)*Le;te=he,fe(he),pe<1?(F=requestAnimationFrame(R),window.autoScaleAnimationId=F):(F=null,window.autoScaleAnimationId=null)};F=requestAnimationFrame(R),window.autoScaleAnimationId=F},ge=()=>{const l=ve();Me(l)},L=A(),oe=A(),G=()=>{if(!L.value||!oe.value)return;const l=L.value.parentElement;l&&setTimeout(()=>{const c=l.clientWidth;let p=50;L.value.style.fontSize=`${p}px`,L.value.offsetHeight;let D=L.value.scrollWidth;for(;D>c&&p>12;)p-=.5,L.value.style.fontSize=`${p}px`,L.value.offsetHeight,D=L.value.scrollWidth;p=Math.max(12,p-5),L.value.style.fontSize=`${p}px`;const R=p*.4;oe.value.style.fontSize=`${R}px`},10)};return ee(()=>{G(),window.addEventListener("resize",G),te=ve(),fe(te),window.addEventListener("resize",ge);const l=new MutationObserver(()=>{G()});l.observe(document.documentElement,{attributes:!0,attributeFilter:["style"]}),window.addEventListener("beforeunload",()=>{l.disconnect()})}),ie(()=>{window.removeEventListener("resize",G),window.removeEventListener("resize",ge),F&&cancelAnimationFrame(F)}),z(()=>{var l;return(l=s==null?void 0:s.value)==null?void 0:l.examName},()=>G()),z(()=>{var l;return(l=s==null?void 0:s.value)==null?void 0:l.message},()=>G()),z(()=>a.roomNumber,l=>{l!=null&&(b.value=l,y.value=l)}),(l,c)=>{var p,D;return T(),O("div",{class:"exam-container",ref_key:"rootRef",ref:r},[c[8]||(c[8]=u("div",{class:"background-ellipse"},null,-1)),u("div",Lt,[u("div",jt,[c[5]||(c[5]=u("div",{class:"logo-container"},[u("span",{class:"logo-text"},"DSZ ExamAware 知试")],-1)),u("div",zt,[u("h1",{ref_key:"mainTitleRef",ref:L,class:"main-title"},$(((p=j(s))==null?void 0:p.examName)||"考试"),513),u("p",{ref_key:"subtitleRef",ref:oe,class:"subtitle"},$(((D=j(s))==null?void 0:D.message)||"请遵守考场纪律"),513)]),M(me,{"custom-class":"clock-card"},{default:Y(()=>[u("div",qt,[u("div",Wt,$(j(h)),1),u("div",Ft,[u("div",null,$(e.timeSyncStatus||"电脑时间")+"仅供参考",1),c[3]||(c[3]=u("div",null,"以考场铃声为准",-1))])])]),_:1}),M(at,{title:"当前考试信息",onIconClick:c[0]||(c[0]=R=>l.$emit("editClick")),"custom-class":"exam-info-card"},{default:Y(()=>{var R;return[M(ae,{label:"当前科目",value:j(m)},null,8,["value"]),M(ae,{label:"考试时间",value:j(f)},null,8,["value"]),M(ae,{label:"剩余时间",value:$e.value},null,8,["value"]),(R=j(v))!=null&&R.materials&&j(v).materials.length>0?(T(!0),O(re,{key:0},Ie(j(v).materials,J=>(T(),Q(ae,{key:J.name,label:J.name,value:`${J.quantity}${J.unit}`},null,8,["label","value"]))),128)):V("",!0),c[4]||(c[4]=u("div",null,null,-1))]}),_:1})]),u("div",Vt,[u("div",Ht,[M(ut,{"room-number":x.value,onClick:w},null,8,["room-number"])]),M(Ct,{"exam-infos":Oe.value},null,8,["exam-infos"])])]),e.showActionBar?(T(),Q(Rt,{key:0,onExit:c[1]||(c[1]=R=>o("exit"))})):V("",!0),I.value?(T(),O("div",Bt,[u("div",{class:"modal-overlay",onClick:X}),u("div",Ut,[u("div",{class:"modal-header"},[c[6]||(c[6]=u("h3",null,"设置考场号",-1)),u("button",{class:"close-btn",onClick:X},"×")]),u("div",Zt,[u("div",Qt,[c[7]||(c[7]=u("label",null,"考场号",-1)),Se(u("input",{"onUpdate:modelValue":c[2]||(c[2]=R=>y.value=R),type:"text",placeholder:"请输入考场号",maxlength:"10",readonly:"",class:"room-input"},null,512),[[Ae,y.value]])]),u("div",Kt,[u("div",{ref_key:"keyboardRef",ref:_,class:"virtual-keyboard"},null,512)])]),u("div",{class:"modal-footer"},[u("button",{class:"btn btn-cancel",onClick:X},"取消"),u("button",{class:"btn btn-confirm",onClick:K},"确认")])])])):V("",!0),ue(l.$slots,"extra",{},void 0)],512)}}}),Jt=H(Gt,[["__scopeId","data-v-19483b40"]]),Yt={name:"ExamPlayerPage",components:{ExamPlayer:Jt},setup(){const e=We(),t=Fe(),r=A(!0),a=A(""),o=A(null),n=d(()=>(e.query.roomNumber||e.query.room||"01")+""),i=A(n.value),s=d(()=>({roomNumber:i.value,timeSync:!0,refreshInterval:1e3,fullscreen:!1}));async function v(){r.value=!0,a.value="",o.value=null;try{const m=e.query.url||e.query.configUrl,f=e.query.id;if(m){const S=await fetch(m);if(!S.ok)throw new Error("拉取配置失败: "+S.status);const h=await S.json();o.value=E(h)}else if(f){const S=await Ve.loadData(`es_${f}`);if(!S)throw new Error("未找到该配置");o.value=E(S)}else o.value=null}catch(m){a.value=(m==null?void 0:m.message)||String(m)}finally{r.value=!1}}function C(){t.push("/")}function E(m){return{examName:(m==null?void 0:m.examName)||"未命名考试",message:(m==null?void 0:m.message)||"",examInfos:Array.isArray(m==null?void 0:m.examInfos)?m.examInfos.map(f=>({name:(f==null?void 0:f.name)||"未命名科目",start:(f==null?void 0:f.start)||"",end:(f==null?void 0:f.end)||"",alertTime:typeof(f==null?void 0:f.alertTime)=="number"?f.alertTime:15})):[]}}return ee(v),z(()=>[e.query.id,e.query.url,e.query.configUrl,e.query.room,e.query.roomNumber],v),z(n,m=>{i.value=m}),{loading:r,error:a,config:o,roomNumberLocal:i,playerConfigObj:s,exit:C}}},Xt={key:2},ea={key:3},ta={ref:"playerRef",class:"player"};function aa(e,t,r,a,o,n){const i=_e("ExamPlayer",!0);return T(),O(re,null,[a.error?(T(),Q(ye,{key:0,border:"start",class:"mb-4",closable:"",type:"error",variant:"tonal","onClick:close":t[0]||(t[0]=s=>a.error="")},{default:Y(()=>[xe($(a.error),1)]),_:1})):V("",!0),a.loading?(T(),Q(He,{key:1,type:"article"})):a.config?(T(),O("div",ea,[u("div",ta,[M(i,{"room-number":a.roomNumberLocal,"onUpdate:roomNumber":t[1]||(t[1]=s=>a.roomNumberLocal=s),config:a.playerConfigObj,"exam-config":a.config,"show-action-bar":!0,"time-sync-status":"电脑时间",onExit:t[2]||(t[2]=s=>a.exit())},null,8,["room-number","config","exam-config"])],512)])):(T(),O("div",Xt,[M(ye,{border:"start",type:"warning",variant:"tonal"},{default:Y(()=>[...t[3]||(t[3]=[xe(" 缺少配置,请通过 URL 参数 id 或 url 传入配置。 ",-1)])]),_:1})]))],64)}const ia=qe(Yt,[["render",aa],["__scopeId","data-v-38342629"]]);export{ia as default};