@qnroa/qtype 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +26 -0
- package/CHANGELOG.zh.md +21 -0
- package/dist/cli/commands/config/action.js +68 -0
- package/dist/cli/commands/config/i18n.js +8 -0
- package/dist/cli/commands/config/index.js +50 -0
- package/dist/cli/registry/help.js +6 -0
- package/dist/core/schemas/both.js +15 -13
- package/dist/core/schemas/repo.js +8 -15
- package/dist/core/schemas/user.js +4 -0
- package/dist/view/assets/index-B8531CqV.css +1 -0
- package/dist/view/assets/{index-BsZ7hVEw.js → index-B_HnQEsb.js} +2 -2
- package/dist/view/assets/{index-DpS4p4Fg.js → index-BbG90BH8.js} +1 -1
- package/dist/view/assets/{index-zP1tnFzO.js → index-eEQRUOZD.js} +1 -1
- package/dist/view/index.html +2 -2
- package/package.json +1 -1
- package/dist/view/assets/index-DB9GS9vg.css +0 -1
|
@@ -177,7 +177,7 @@ Error generating stack: `+o.message+`
|
|
|
177
177
|
`)}function WP(e){const{card:t}=e,n=t.question?KP(t.question):"";return f.jsx(gc,{type:"snippet",variant:"centered",slots:[{role:"title",content:t.title},n?{role:"image",content:f.jsx(Ag,{source:n})}:{role:"image",content:null},{role:"arena",content:f.jsx(ml,{...yl(e)},t.id)}]})}function KP(e){const t=[];for(const n of e.split(`
|
|
178
178
|
`))/!\[[^\]]*\]\([^)]*\)/.test(n)&&t.push(n);return t.join(`
|
|
179
179
|
|
|
180
|
-
`)}function t6(e){const{card:t}=e;return f.jsx(gc,{type:"qa",variant:"flow",slots:[{role:"title",content:t.title},t.question?{role:"question",content:f.jsx(Ag,{source:t.question})}:{role:"question",content:null},{role:"arena",content:f.jsx(ml,{...yl(e)},t.id)}]})}const $P=v.lazy(()=>tg(()=>import("./index-BsZ7hVEw.js"),[]).then(e=>({default:e.CodeCard})));function GP(e){switch(e.card.type){case"word":return f.jsx(BP,{...e});case"sentence":return f.jsx(FP,{...e});case"article":return f.jsx(HP,{...e});case"snippet":return f.jsx(WP,{...e});case"qa":return f.jsx(t6,{...e});case"code":return f.jsx(v.Suspense,{fallback:f.jsx(t6,{...e}),children:f.jsx($P,{...e})});default:return f.jsx(_P,{...e})}}const QP="doneCards";function Ll(e){return typeof e=="number"&&Number.isFinite(e)}function ov(e){const t=e;return{wpm:Ll(t==null?void 0:t.wpm)?t.wpm:0,cpm:Ll(t==null?void 0:t.cpm)?t.cpm:0,accuracy:Ll(t==null?void 0:t.accuracy)?t.accuracy:0,elapsedMs:Ll(t==null?void 0:t.elapsedMs)?t.elapsedMs:0,ts:Ll(t==null?void 0:t.ts)?t.ts:0}}const n6={serialize:e=>JSON.stringify(e),deserialize:e=>{try{const t=JSON.parse(e);if(t&&typeof t=="object"&&!Array.isArray(t)){const n={};for(const[r,i]of Object.entries(t))if(!(typeof r!="string"||r.length===0)&&Array.isArray(i)){const o=[];for(const s of i)o.push(ov(s));n[r]=o}return n}}catch{}return{}}};function rg(){const[e,t]=de("progress",QP,()=>({}),n6),n=v.useCallback(()=>{t({})},[t]),r=v.useCallback(y=>{t(q=>{const m={...q};let A=!1;for(const w of y)w in m&&(delete m[w],A=!0);return A?m:q})},[t]),i=v.useCallback((y,q)=>{let m=!1;const A=ov({...q,ts:(q==null?void 0:q.ts)??Date.now()});return t(w=>{const x=w[y]??[];x.length===0&&(m=!0);const V=[...x,A].slice(-20);return{...w,[y]:V}}),m},[t]),o=v.useCallback(y=>e[y]!==void 0,[e]),s=v.useCallback(y=>{const q=e[y];return q&&q.length>0?q[q.length-1]:null},[e]),l=v.useCallback(y=>e[y]??[],[e]),a=v.useCallback(y=>{let q=0;for(const m of y)e[m]!==void 0&&q++;return q},[e]),c=v.useCallback(y=>{if(y.length===0)return!1;for(const q of y)if(e[q]===void 0)return!1;return!0},[e]),h=v.useCallback(y=>{const q=[];for(const m of y){const A=e[m];if(!A||A.length===0)continue;const w=A[A.length-1];w.ts>0&&q.push(w.wpm)}return q},[e]),d=v.useCallback(y=>{let q=0,m=0,A=!1;for(const w of y){const x=e[w];if(!x||x.length===0)continue;const V=x[x.length-1];A=!0,V.wpm>q&&(q=V.wpm),V.ts>m&&(m=V.ts)}return A?{peakWpm:q,latestTs:m}:null},[e]),u=v.useCallback(()=>({cardMap:e}),[e]),p=v.useCallback(y=>{if(!y||typeof y!="object")throw new Error("err.badData");const q=y,m=q.cardMap&&typeof q.cardMap=="object"?q.cardMap:{},A=n6.deserialize(JSON.stringify(m));t(A)},[t]);return v.useMemo(()=>({cardMap:e,clearAll:n,clearIds:r,markCardDone:i,isCardDone:o,cardStats:s,cardHistory:l,doneCountOf:a,isMaterialDone:c,wpmSeriesOf:h,bestOf:d,exportProgress:u,importProgress:p}),[e,n,r,i,o,s,l,a,c,h,d,u,p])}let Nh=null;const If=new Set;function r6(){for(const e of If)e()}const wo={get(){return Nh},set(e){Nh=e,r6()},clear(){Nh=null,r6()},subscribe(e){return If.add(e),()=>{If.delete(e)}}};function YP(){return v.useSyncExternalStore(wo.subscribe,wo.get,wo.get)}function ZP(){if(typeof globalThis<"u")return globalThis;if(typeof self<"u")return self;if(typeof window<"u")return window;if(typeof global<"u")return global}function XP(){const e=ZP();if(e.__xstate__)return e.__xstate__}const JP=e=>{if(typeof window>"u")return;const t=XP();t&&t.register(e)};class i6{constructor(t){this._process=t,this._active=!1,this._current=null,this._last=null}start(){this._active=!0,this.flush()}clear(){this._current&&(this._current.next=null,this._last=this._current)}enqueue(t){const n={value:t,next:null};if(this._current){this._last.next=n,this._last=n;return}this._current=n,this._last=n,this._active&&this.flush()}flush(){for(;this._current;){const t=this._current;this._process(t.value),this._current=t.next}this._last=null}}const sv=".",eI="",lv="",tI="#",nI="*",av="xstate.init",rI="xstate.error",Lf="xstate.stop";function iI(e,t){return{type:`xstate.after.${e}.${t}`}}function Nf(e,t){return{type:`xstate.done.state.${e}`,output:t}}function oI(e,t){return{type:`xstate.done.actor.${e}`,output:t,actorId:e}}function cv(e,t){return{type:`xstate.error.actor.${e}`,error:t,actorId:e}}function uv(e){return{type:av,input:e}}function Jn(e){setTimeout(()=>{throw e})}const sI=typeof Symbol=="function"&&Symbol.observable||"@@observable";function dv(e,t){const n=o6(e),r=o6(t);return typeof r=="string"?typeof n=="string"?r===n:!1:typeof n=="string"?n in r:Object.keys(n).every(i=>i in r?dv(n[i],r[i]):!1)}function ig(e){if(fv(e))return e;const t=[];let n="";for(let r=0;r<e.length;r++){switch(e.charCodeAt(r)){case 92:n+=e[r+1],r++;continue;case 46:t.push(n),n="";continue}n+=e[r]}return t.push(n),t}function o6(e){if(HI(e))return e.value;if(typeof e!="string")return e;const t=ig(e);return lI(t)}function lI(e){if(e.length===1)return e[0];const t={};let n=t;for(let r=0;r<e.length-1;r++)if(r===e.length-2)n[e[r]]=e[r+1];else{const i=n;n={},i[e[r]]=n}return t}function s6(e,t){const n={},r=Object.keys(e);for(let i=0;i<r.length;i++){const o=r[i];n[o]=t(e[o],o,e,i)}return n}function hv(e){return fv(e)?e:[e]}function Ai(e){return e===void 0?[]:hv(e)}function Df(e,t,n,r){return typeof e=="function"?e({context:t,event:n,self:r}):e}function fv(e){return Array.isArray(e)}function aI(e){return e.type.startsWith("xstate.error.actor")}function as(e){return hv(e).map(t=>typeof t>"u"||typeof t=="string"?{target:t}:t)}function gv(e){if(!(e===void 0||e===eI))return Ai(e)}function Tu(e,t,n){var o,s,l;const r=typeof e=="object",i=r?e:void 0;return{next:(o=r?e.next:e)==null?void 0:o.bind(i),error:(s=r?e.error:t)==null?void 0:s.bind(i),complete:(l=r?e.complete:n)==null?void 0:l.bind(i)}}function l6(e,t){return`${t}.${e}`}function og(e,t){const n=t.match(/^xstate\.invoke\.(\d+)\.(.*)/);if(!n)return e.implementations.actors[t];const[,r,i]=n,s=e.getStateNodeById(i).config.invoke;return(Array.isArray(s)?s[r]:s).src}function cI(e,t){if(t===e||t===nI)return!0;if(!t.endsWith(".*"))return!1;const n=t.split("."),r=e.split(".");for(let i=0;i<n.length;i++){const o=n[i],s=r[i];if(o==="*")return i===n.length-1;if(o!==s)return!1}return!0}function a6(e,t){return`${e.sessionId}.${t}`}let uI=0;function dI(e,t){const n=new Map,r=new Map,i=new WeakMap,o=new Set,s={},{clock:l,logger:a}=t,c={schedule:(u,p,g,y,q=Math.random().toString(36).slice(2))=>{const m={source:u,target:p,event:g,delay:y,id:q,startedAt:Date.now()},A=a6(u,q);d._snapshot._scheduledEvents[A]=m;const w=l.setTimeout(()=>{delete s[A],delete d._snapshot._scheduledEvents[A],d._relay(u,p,g)},y);s[A]=w},cancel:(u,p)=>{const g=a6(u,p),y=s[g];delete s[g],delete d._snapshot._scheduledEvents[g],y!==void 0&&l.clearTimeout(y)},cancelAll:u=>{for(const p in d._snapshot._scheduledEvents){const g=d._snapshot._scheduledEvents[p];g.source===u&&c.cancel(u,g.id)}}},h=u=>{if(!o.size)return;const p={...u,rootId:e.sessionId};o.forEach(g=>{var y;return(y=g.next)==null?void 0:y.call(g,p)})},d={_snapshot:{_scheduledEvents:((t==null?void 0:t.snapshot)&&t.snapshot.scheduler)??{}},_bookId:()=>`x:${uI++}`,_register:(u,p)=>(n.set(u,p),u),_unregister:u=>{n.delete(u.sessionId);const p=i.get(u);p!==void 0&&(r.delete(p),i.delete(u))},get:u=>r.get(u),getAll:()=>Object.fromEntries(r.entries()),_set:(u,p)=>{const g=r.get(u);if(g&&g!==p)throw new Error(`Actor with system ID '${u}' already exists.`);r.set(u,p),i.set(p,u)},inspect:u=>{const p=Tu(u);return o.add(p),{unsubscribe(){o.delete(p)}}},_sendInspectionEvent:h,_relay:(u,p,g)=>{d._sendInspectionEvent({type:"@xstate.event",sourceRef:u,actorRef:p,event:g}),p._send(g)},scheduler:c,getSnapshot:()=>({_scheduledEvents:{...d._snapshot._scheduledEvents}}),start:()=>{const u=d._snapshot._scheduledEvents;d._snapshot._scheduledEvents={};for(const p in u){const{source:g,target:y,event:q,delay:m,id:A}=u[p];c.schedule(g,y,q,m,A)}},_clock:l,_logger:a};return d}let Dh=!1;const sg=1;let Qt=function(e){return e[e.NotStarted=0]="NotStarted",e[e.Running=1]="Running",e[e.Stopped=2]="Stopped",e}({});const hI={clock:{setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e)},logger:console.log.bind(console),devTools:!1};class fI{constructor(t,n){this.logic=t,this._snapshot=void 0,this.clock=void 0,this.options=void 0,this.id=void 0,this.mailbox=new i6(this._process.bind(this)),this.observers=new Set,this.eventListeners=new Map,this.logger=void 0,this._processingStatus=Qt.NotStarted,this._parent=void 0,this._syncSnapshot=void 0,this.ref=void 0,this._actorScope=void 0,this.systemId=void 0,this.sessionId=void 0,this.system=void 0,this._doneEvent=void 0,this.src=void 0,this._deferred=[];const r={...hI,...n},{clock:i,logger:o,parent:s,syncSnapshot:l,id:a,systemId:c,inspect:h}=r;this.system=s?s.system:dI(this,{clock:i,logger:o}),h&&!s&&this.system.inspect(Tu(h)),this.sessionId=this.system._bookId(),this.id=a??this.sessionId,this.logger=(n==null?void 0:n.logger)??this.system._logger,this.clock=(n==null?void 0:n.clock)??this.system._clock,this._parent=s,this._syncSnapshot=l,this.options=r,this.src=r.src??t,this.ref=this,this._actorScope={self:this,id:this.id,sessionId:this.sessionId,logger:this.logger,defer:d=>{this._deferred.push(d)},system:this.system,stopChild:d=>{if(d._parent!==this)throw new Error(`Cannot stop child actor ${d.id} of ${this.id} because it is not a child`);d._stop()},emit:d=>{const u=this.eventListeners.get(d.type),p=this.eventListeners.get("*");if(!u&&!p)return;const g=[...u?u.values():[],...p?p.values():[]];for(const y of g)try{y(d)}catch(q){Jn(q)}},actionExecutor:d=>{const u=()=>{if(this._actorScope.system._sendInspectionEvent({type:"@xstate.action",actorRef:this,action:{type:d.type,params:d.params}}),!d.exec)return;const p=Dh;try{Dh=!0,d.exec(d.info,d.params)}finally{Dh=p}};this._processingStatus===Qt.Running?u():this._deferred.push(u)}},this.send=this.send.bind(this),this.system._sendInspectionEvent({type:"@xstate.actor",actorRef:this}),c&&(this.systemId=c,this.system._set(c,this)),this._initState((n==null?void 0:n.snapshot)??(n==null?void 0:n.state)),c&&this._snapshot.status!=="active"&&this.system._unregister(this)}_initState(t){var n;try{this._snapshot=t?this.logic.restoreSnapshot?this.logic.restoreSnapshot(t,this._actorScope):t:this.logic.getInitialSnapshot(this._actorScope,(n=this.options)==null?void 0:n.input)}catch(r){this._snapshot={status:"error",output:void 0,error:r}}}update(t,n){var i,o;this._snapshot=t;let r;for(;r=this._deferred.shift();)try{r()}catch(s){this._deferred.length=0,this._snapshot={...t,status:"error",error:s}}switch(this._snapshot.status){case"active":for(const s of this.observers)try{(i=s.next)==null||i.call(s,t)}catch(l){Jn(l)}break;case"done":for(const s of this.observers)try{(o=s.next)==null||o.call(s,t)}catch(l){Jn(l)}this._stopProcedure(),this._complete(),this._doneEvent=oI(this.id,this._snapshot.output),this._parent&&this.system._relay(this,this._parent,this._doneEvent);break;case"error":this._error(this._snapshot.error);break}this.system._sendInspectionEvent({type:"@xstate.snapshot",actorRef:this,event:n,snapshot:t})}subscribe(t,n,r){var o;const i=Tu(t,n,r);if(this._processingStatus!==Qt.Stopped)this.observers.add(i);else switch(this._snapshot.status){case"done":try{(o=i.complete)==null||o.call(i)}catch(s){Jn(s)}break;case"error":{const s=this._snapshot.error;if(!i.error)Jn(s);else try{i.error(s)}catch(l){Jn(l)}break}}return{unsubscribe:()=>{this.observers.delete(i)}}}on(t,n){let r=this.eventListeners.get(t);r||(r=new Set,this.eventListeners.set(t,r));const i=n.bind(void 0);return r.add(i),{unsubscribe:()=>{r.delete(i)}}}select(t,n=Object.is){return{subscribe:r=>{const i=Tu(r),o=this.getSnapshot();let s=t(o);return this.subscribe(l=>{var c;const a=t(l);n(s,a)||(s=a,(c=i.next)==null||c.call(i,a))})},get:()=>t(this.getSnapshot())}}start(){if(this._processingStatus===Qt.Running)return this;this._syncSnapshot&&this.subscribe({next:r=>{r.status==="active"&&this.system._relay(this,this._parent,{type:`xstate.snapshot.${this.id}`,snapshot:r})},error:()=>{}}),this.system._register(this.sessionId,this),this.systemId&&this.system._set(this.systemId,this),this._processingStatus=Qt.Running;const t=uv(this.options.input);switch(this.system._sendInspectionEvent({type:"@xstate.event",sourceRef:this._parent,actorRef:this,event:t}),this._snapshot.status){case"done":return this.update(this._snapshot,t),this;case"error":return this._error(this._snapshot.error),this}if(this._parent||this.system.start(),this.logic.start)try{this.logic.start(this._snapshot,this._actorScope)}catch(r){return this._snapshot={...this._snapshot,status:"error",error:r},this._error(r),this}return this.update(this._snapshot,t),this.options.devTools&&this.attachDevTools(),this.mailbox.start(),this}_process(t){let n,r;try{n=this.logic.transition(this._snapshot,t,this._actorScope)}catch(i){r={err:i}}if(r){const{err:i}=r;this._snapshot={...this._snapshot,status:"error",error:i},this._error(i);return}this.update(n,t),t.type===Lf&&(this._stopProcedure(),this._complete())}_stop(){return this._processingStatus===Qt.Stopped?this:(this.mailbox.clear(),this._processingStatus===Qt.NotStarted?(this._processingStatus=Qt.Stopped,this):(this.mailbox.enqueue({type:Lf}),this))}stop(){if(this._parent)throw new Error("A non-root actor cannot be stopped directly.");return this._stop()}_complete(){var t;for(const n of this.observers)try{(t=n.complete)==null||t.call(n)}catch(r){Jn(r)}this.observers.clear(),this.eventListeners.clear()}_reportError(t){if(!this.observers.size){this._parent||Jn(t),this.eventListeners.clear();return}let n=!1;for(const r of this.observers){const i=r.error;n||(n=!i);try{i==null||i(t)}catch(o){Jn(o)}}this.observers.clear(),this.eventListeners.clear(),n&&Jn(t)}_error(t){this._stopProcedure(),this._reportError(t),this._parent&&this.system._relay(this,this._parent,cv(this.id,t))}_stopProcedure(){return this._processingStatus!==Qt.Running?this:(this.system.scheduler.cancelAll(this),this.mailbox.clear(),this.mailbox=new i6(this._process.bind(this)),this._processingStatus=Qt.Stopped,this.system._unregister(this),this)}_send(t){this._processingStatus!==Qt.Stopped&&this.mailbox.enqueue(t)}send(t){this.system._relay(void 0,this,t)}attachDevTools(){const{devTools:t}=this.options;t&&(typeof t=="function"?t:JP)(this)}toJSON(){return{xstate$$type:sg,id:this.id}}getPersistedSnapshot(t){return this.logic.getPersistedSnapshot(this._snapshot,t)}[sI](){return this}getSnapshot(){return this._snapshot}}function il(e,...[t]){return new fI(e,t)}function gI(e,t,n,r,{sendId:i}){const o=typeof i=="function"?i(n,r):i;return[t,{sendId:o},void 0]}function pI(e,t){e.defer(()=>{e.system.scheduler.cancel(e.self,t.sendId)})}function lg(e){function t(n,r){}return t.type="xstate.cancel",t.sendId=e,t.resolve=gI,t.execute=pI,t}function mI(e,t,n,r,{id:i,systemId:o,src:s,input:l,syncSnapshot:a}){const c=typeof s=="string"?og(t.machine,s):s,h=typeof i=="function"?i(n):i;let d,u;return c&&(u=typeof l=="function"?l({context:t.context,event:n.event,self:e.self}):l,d=il(c,{id:h,src:s,parent:e.self,syncSnapshot:a,systemId:o,input:u})),[Bi(t,{children:{...t.children,[h]:d}}),{id:i,systemId:o,actorRef:d,src:s,input:u},void 0]}function yI(e,{actorRef:t}){t&&e.defer(()=>{t._processingStatus!==Qt.Stopped&&t.start()})}function ag(...[e,{id:t,systemId:n,input:r,syncSnapshot:i=!1}={}]){function o(s,l){}return o.type="xstate.spawnChild",o.id=t,o.systemId=n,o.src=e,o.input=r,o.syncSnapshot=i,o.resolve=mI,o.execute=yI,o}function AI(e,t,n,r,{actorRef:i}){const o=typeof i=="function"?i(n,r):i,s=typeof o=="string"?t.children[o]:o;let l=t.children;return s&&(l={...l},delete l[s.id]),[Bi(t,{children:l}),s,void 0]}function pv(e,t){const n=t.getSnapshot();if(n&&"children"in n)for(const r of Object.values(n.children))pv(e,r);e.system._unregister(t)}function vI(e,t){if(t){if(pv(e,t),t._processingStatus!==Qt.Running){e.stopChild(t);return}e.defer(()=>{e.stopChild(t)})}}function jd(e){function t(n,r){}return t.type="xstate.stopChild",t.actorRef=e,t.resolve=AI,t.execute=vI,t}function qI(e,{context:t,event:n},{guards:r}){return r.every(i=>pc(i,t,n,e))}function wI(e){function t(n,r){return!1}return t.check=qI,t.guards=e,t}function pc(e,t,n,r){const{machine:i}=r,o=typeof e=="function",s=o?e:i.implementations.guards[typeof e=="string"?e:e.type];if(!o&&!s)throw new Error(`Guard '${typeof e=="string"?e:e.type}' is not implemented.'.`);if(typeof s!="function")return pc(s,t,n,r);const l={context:t,event:n},a=o||typeof e=="string"?void 0:"params"in e?typeof e.params=="function"?e.params({context:t,event:n}):e.params:void 0;return"check"in s?s.check(r,l,s):s(l,a)}function cg(e){return e.type==="atomic"||e.type==="final"}function ol(e){return Object.values(e.states).filter(t=>t.type!=="history")}function mc(e,t){const n=[];if(t===e)return n;let r=e.parent;for(;r&&r!==t;)n.push(r),r=r.parent;return n}function S1(e){const t=new Set(e),n=yv(t);for(const r of t)if(r.type==="compound"&&(!n.get(r)||!n.get(r).length))c6(r).forEach(i=>t.add(i));else if(r.type==="parallel"){for(const i of ol(r))if(i.type!=="history"&&!t.has(i)){const o=c6(i);for(const s of o)t.add(s)}}for(const r of t){let i=r.parent;for(;i;)t.add(i),i=i.parent}return t}function mv(e,t){const n=t.get(e);if(!n)return{};if(e.type==="compound"){const i=n[0];if(i){if(cg(i))return i.key}else return{}}const r={};for(const i of n)r[i.key]=mv(i,t);return r}function yv(e){const t=new Map;for(const n of e)t.has(n)||t.set(n,[]),n.parent&&(t.has(n.parent)||t.set(n.parent,[]),t.get(n.parent).push(n));return t}function Av(e,t){const n=S1(t);return mv(e,yv(n))}function ug(e,t){return t.type==="compound"?ol(t).some(n=>n.type==="final"&&e.has(n)):t.type==="parallel"?ol(t).every(n=>ug(e,n)):t.type==="final"}const zd=e=>e[0]===tI;function xI(e,t){const n=e.transitions.get(t),r=[...e.transitions.keys()].filter(i=>i!==t&&cI(t,i)).sort((i,o)=>o.length-i.length).flatMap(i=>e.transitions.get(i));return n?[...n,...r]:r}function bI(e){const t=e.config.after;if(!t)return[];const n=i=>{const o=iI(i,e.id),s=o.type;return e.entry.push(fg(o,{id:s,delay:i})),e.exit.push(lg(s)),s};return Object.keys(t).flatMap(i=>{const o=t[i],s=typeof o=="string"?{target:o}:o,l=Number.isNaN(+i)?i:+i,a=n(l);return Ai(s).map(c=>({...c,event:a,delay:l}))}).map(i=>{const{delay:o}=i;return{...ui(e,i.event,i),delay:o}})}function ui(e,t,n){const r=gv(n.target),i=n.reenter??!1,o=zI(e,r),s={...n,actions:Ai(n.actions),guard:n.guard,target:o,source:e,reenter:i,eventType:t,toJSON:()=>({...s,source:`#${e.id}`,target:o?o.map(l=>`#${l.id}`):void 0})};return s}function VI(e){const t=new Map;if(e.config.on)for(const n of Object.keys(e.config.on)){if(n===lv)throw new Error('Null events ("") cannot be specified as a transition key. Use `always: { ... }` instead.');const r=e.config.on[n];t.set(n,as(r).map(i=>ui(e,n,i)))}if(e.config.onDone){const n=`xstate.done.state.${e.id}`;t.set(n,as(e.config.onDone).map(r=>ui(e,n,r)))}for(const n of e.invoke){if(n.onDone){const r=`xstate.done.actor.${n.id}`;t.set(r,as(n.onDone).map(i=>ui(e,r,i)))}if(n.onError){const r=`xstate.error.actor.${n.id}`;t.set(r,as(n.onError).map(i=>ui(e,r,i)))}if(n.onSnapshot){const r=`xstate.snapshot.${n.id}`;t.set(r,as(n.onSnapshot).map(i=>ui(e,r,i)))}}for(const n of e.after){let r=t.get(n.eventType);r||(r=[],t.set(n.eventType,r)),r.push(n)}return t}function kI(e){const t=[],n=r=>{Object.values(r).forEach(i=>{if(i.config.route&&i.config.id){const o=i.config.id,s=i.config.route.guard,l=({event:c})=>c.to===`#${o}`,a={...i.config.route,guard:s?wI([l,s]):l,target:`#${o}`};t.push(ui(e,"xstate.route",a))}i.states&&n(i.states)})};n(e.states),t.length>0&&e.transitions.set("xstate.route",t)}function jI(e,t){const n=typeof t=="string"?e.states[t]:t?e.states[t.target]:void 0;if(!n&&t)throw new Error(`Initial state node "${t}" not found on parent state node #${e.id}`);const r={source:e,actions:!t||typeof t=="string"?[]:Ai(t.actions),eventType:null,reenter:!1,target:n?[n]:[],toJSON:()=>({...r,source:`#${e.id}`,target:n?[`#${n.id}`]:[]})};return r}function zI(e,t){if(t!==void 0)return t.map(n=>{if(typeof n!="string")return n;if(zd(n))return e.machine.getStateNodeById(n);const r=n[0]===sv;if(r&&!e.parent)return C1(e,n.slice(1));const i=r?e.key+n:n;if(e.parent)try{return C1(e.parent,i)}catch(o){throw new Error(`Invalid transition definition for state node '${e.id}':
|
|
180
|
+
`)}function t6(e){const{card:t}=e;return f.jsx(gc,{type:"qa",variant:"flow",slots:[{role:"title",content:t.title},t.question?{role:"question",content:f.jsx(Ag,{source:t.question})}:{role:"question",content:null},{role:"arena",content:f.jsx(ml,{...yl(e)},t.id)}]})}const $P=v.lazy(()=>tg(()=>import("./index-B_HnQEsb.js"),[]).then(e=>({default:e.CodeCard})));function GP(e){switch(e.card.type){case"word":return f.jsx(BP,{...e});case"sentence":return f.jsx(FP,{...e});case"article":return f.jsx(HP,{...e});case"snippet":return f.jsx(WP,{...e});case"qa":return f.jsx(t6,{...e});case"code":return f.jsx(v.Suspense,{fallback:f.jsx(t6,{...e}),children:f.jsx($P,{...e})});default:return f.jsx(_P,{...e})}}const QP="doneCards";function Ll(e){return typeof e=="number"&&Number.isFinite(e)}function ov(e){const t=e;return{wpm:Ll(t==null?void 0:t.wpm)?t.wpm:0,cpm:Ll(t==null?void 0:t.cpm)?t.cpm:0,accuracy:Ll(t==null?void 0:t.accuracy)?t.accuracy:0,elapsedMs:Ll(t==null?void 0:t.elapsedMs)?t.elapsedMs:0,ts:Ll(t==null?void 0:t.ts)?t.ts:0}}const n6={serialize:e=>JSON.stringify(e),deserialize:e=>{try{const t=JSON.parse(e);if(t&&typeof t=="object"&&!Array.isArray(t)){const n={};for(const[r,i]of Object.entries(t))if(!(typeof r!="string"||r.length===0)&&Array.isArray(i)){const o=[];for(const s of i)o.push(ov(s));n[r]=o}return n}}catch{}return{}}};function rg(){const[e,t]=de("progress",QP,()=>({}),n6),n=v.useCallback(()=>{t({})},[t]),r=v.useCallback(y=>{t(q=>{const m={...q};let A=!1;for(const w of y)w in m&&(delete m[w],A=!0);return A?m:q})},[t]),i=v.useCallback((y,q)=>{let m=!1;const A=ov({...q,ts:(q==null?void 0:q.ts)??Date.now()});return t(w=>{const x=w[y]??[];x.length===0&&(m=!0);const V=[...x,A].slice(-20);return{...w,[y]:V}}),m},[t]),o=v.useCallback(y=>e[y]!==void 0,[e]),s=v.useCallback(y=>{const q=e[y];return q&&q.length>0?q[q.length-1]:null},[e]),l=v.useCallback(y=>e[y]??[],[e]),a=v.useCallback(y=>{let q=0;for(const m of y)e[m]!==void 0&&q++;return q},[e]),c=v.useCallback(y=>{if(y.length===0)return!1;for(const q of y)if(e[q]===void 0)return!1;return!0},[e]),h=v.useCallback(y=>{const q=[];for(const m of y){const A=e[m];if(!A||A.length===0)continue;const w=A[A.length-1];w.ts>0&&q.push(w.wpm)}return q},[e]),d=v.useCallback(y=>{let q=0,m=0,A=!1;for(const w of y){const x=e[w];if(!x||x.length===0)continue;const V=x[x.length-1];A=!0,V.wpm>q&&(q=V.wpm),V.ts>m&&(m=V.ts)}return A?{peakWpm:q,latestTs:m}:null},[e]),u=v.useCallback(()=>({cardMap:e}),[e]),p=v.useCallback(y=>{if(!y||typeof y!="object")throw new Error("err.badData");const q=y,m=q.cardMap&&typeof q.cardMap=="object"?q.cardMap:{},A=n6.deserialize(JSON.stringify(m));t(A)},[t]);return v.useMemo(()=>({cardMap:e,clearAll:n,clearIds:r,markCardDone:i,isCardDone:o,cardStats:s,cardHistory:l,doneCountOf:a,isMaterialDone:c,wpmSeriesOf:h,bestOf:d,exportProgress:u,importProgress:p}),[e,n,r,i,o,s,l,a,c,h,d,u,p])}let Nh=null;const If=new Set;function r6(){for(const e of If)e()}const wo={get(){return Nh},set(e){Nh=e,r6()},clear(){Nh=null,r6()},subscribe(e){return If.add(e),()=>{If.delete(e)}}};function YP(){return v.useSyncExternalStore(wo.subscribe,wo.get,wo.get)}function ZP(){if(typeof globalThis<"u")return globalThis;if(typeof self<"u")return self;if(typeof window<"u")return window;if(typeof global<"u")return global}function XP(){const e=ZP();if(e.__xstate__)return e.__xstate__}const JP=e=>{if(typeof window>"u")return;const t=XP();t&&t.register(e)};class i6{constructor(t){this._process=t,this._active=!1,this._current=null,this._last=null}start(){this._active=!0,this.flush()}clear(){this._current&&(this._current.next=null,this._last=this._current)}enqueue(t){const n={value:t,next:null};if(this._current){this._last.next=n,this._last=n;return}this._current=n,this._last=n,this._active&&this.flush()}flush(){for(;this._current;){const t=this._current;this._process(t.value),this._current=t.next}this._last=null}}const sv=".",eI="",lv="",tI="#",nI="*",av="xstate.init",rI="xstate.error",Lf="xstate.stop";function iI(e,t){return{type:`xstate.after.${e}.${t}`}}function Nf(e,t){return{type:`xstate.done.state.${e}`,output:t}}function oI(e,t){return{type:`xstate.done.actor.${e}`,output:t,actorId:e}}function cv(e,t){return{type:`xstate.error.actor.${e}`,error:t,actorId:e}}function uv(e){return{type:av,input:e}}function Jn(e){setTimeout(()=>{throw e})}const sI=typeof Symbol=="function"&&Symbol.observable||"@@observable";function dv(e,t){const n=o6(e),r=o6(t);return typeof r=="string"?typeof n=="string"?r===n:!1:typeof n=="string"?n in r:Object.keys(n).every(i=>i in r?dv(n[i],r[i]):!1)}function ig(e){if(fv(e))return e;const t=[];let n="";for(let r=0;r<e.length;r++){switch(e.charCodeAt(r)){case 92:n+=e[r+1],r++;continue;case 46:t.push(n),n="";continue}n+=e[r]}return t.push(n),t}function o6(e){if(HI(e))return e.value;if(typeof e!="string")return e;const t=ig(e);return lI(t)}function lI(e){if(e.length===1)return e[0];const t={};let n=t;for(let r=0;r<e.length-1;r++)if(r===e.length-2)n[e[r]]=e[r+1];else{const i=n;n={},i[e[r]]=n}return t}function s6(e,t){const n={},r=Object.keys(e);for(let i=0;i<r.length;i++){const o=r[i];n[o]=t(e[o],o,e,i)}return n}function hv(e){return fv(e)?e:[e]}function Ai(e){return e===void 0?[]:hv(e)}function Df(e,t,n,r){return typeof e=="function"?e({context:t,event:n,self:r}):e}function fv(e){return Array.isArray(e)}function aI(e){return e.type.startsWith("xstate.error.actor")}function as(e){return hv(e).map(t=>typeof t>"u"||typeof t=="string"?{target:t}:t)}function gv(e){if(!(e===void 0||e===eI))return Ai(e)}function Tu(e,t,n){var o,s,l;const r=typeof e=="object",i=r?e:void 0;return{next:(o=r?e.next:e)==null?void 0:o.bind(i),error:(s=r?e.error:t)==null?void 0:s.bind(i),complete:(l=r?e.complete:n)==null?void 0:l.bind(i)}}function l6(e,t){return`${t}.${e}`}function og(e,t){const n=t.match(/^xstate\.invoke\.(\d+)\.(.*)/);if(!n)return e.implementations.actors[t];const[,r,i]=n,s=e.getStateNodeById(i).config.invoke;return(Array.isArray(s)?s[r]:s).src}function cI(e,t){if(t===e||t===nI)return!0;if(!t.endsWith(".*"))return!1;const n=t.split("."),r=e.split(".");for(let i=0;i<n.length;i++){const o=n[i],s=r[i];if(o==="*")return i===n.length-1;if(o!==s)return!1}return!0}function a6(e,t){return`${e.sessionId}.${t}`}let uI=0;function dI(e,t){const n=new Map,r=new Map,i=new WeakMap,o=new Set,s={},{clock:l,logger:a}=t,c={schedule:(u,p,g,y,q=Math.random().toString(36).slice(2))=>{const m={source:u,target:p,event:g,delay:y,id:q,startedAt:Date.now()},A=a6(u,q);d._snapshot._scheduledEvents[A]=m;const w=l.setTimeout(()=>{delete s[A],delete d._snapshot._scheduledEvents[A],d._relay(u,p,g)},y);s[A]=w},cancel:(u,p)=>{const g=a6(u,p),y=s[g];delete s[g],delete d._snapshot._scheduledEvents[g],y!==void 0&&l.clearTimeout(y)},cancelAll:u=>{for(const p in d._snapshot._scheduledEvents){const g=d._snapshot._scheduledEvents[p];g.source===u&&c.cancel(u,g.id)}}},h=u=>{if(!o.size)return;const p={...u,rootId:e.sessionId};o.forEach(g=>{var y;return(y=g.next)==null?void 0:y.call(g,p)})},d={_snapshot:{_scheduledEvents:((t==null?void 0:t.snapshot)&&t.snapshot.scheduler)??{}},_bookId:()=>`x:${uI++}`,_register:(u,p)=>(n.set(u,p),u),_unregister:u=>{n.delete(u.sessionId);const p=i.get(u);p!==void 0&&(r.delete(p),i.delete(u))},get:u=>r.get(u),getAll:()=>Object.fromEntries(r.entries()),_set:(u,p)=>{const g=r.get(u);if(g&&g!==p)throw new Error(`Actor with system ID '${u}' already exists.`);r.set(u,p),i.set(p,u)},inspect:u=>{const p=Tu(u);return o.add(p),{unsubscribe(){o.delete(p)}}},_sendInspectionEvent:h,_relay:(u,p,g)=>{d._sendInspectionEvent({type:"@xstate.event",sourceRef:u,actorRef:p,event:g}),p._send(g)},scheduler:c,getSnapshot:()=>({_scheduledEvents:{...d._snapshot._scheduledEvents}}),start:()=>{const u=d._snapshot._scheduledEvents;d._snapshot._scheduledEvents={};for(const p in u){const{source:g,target:y,event:q,delay:m,id:A}=u[p];c.schedule(g,y,q,m,A)}},_clock:l,_logger:a};return d}let Dh=!1;const sg=1;let Qt=function(e){return e[e.NotStarted=0]="NotStarted",e[e.Running=1]="Running",e[e.Stopped=2]="Stopped",e}({});const hI={clock:{setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e)},logger:console.log.bind(console),devTools:!1};class fI{constructor(t,n){this.logic=t,this._snapshot=void 0,this.clock=void 0,this.options=void 0,this.id=void 0,this.mailbox=new i6(this._process.bind(this)),this.observers=new Set,this.eventListeners=new Map,this.logger=void 0,this._processingStatus=Qt.NotStarted,this._parent=void 0,this._syncSnapshot=void 0,this.ref=void 0,this._actorScope=void 0,this.systemId=void 0,this.sessionId=void 0,this.system=void 0,this._doneEvent=void 0,this.src=void 0,this._deferred=[];const r={...hI,...n},{clock:i,logger:o,parent:s,syncSnapshot:l,id:a,systemId:c,inspect:h}=r;this.system=s?s.system:dI(this,{clock:i,logger:o}),h&&!s&&this.system.inspect(Tu(h)),this.sessionId=this.system._bookId(),this.id=a??this.sessionId,this.logger=(n==null?void 0:n.logger)??this.system._logger,this.clock=(n==null?void 0:n.clock)??this.system._clock,this._parent=s,this._syncSnapshot=l,this.options=r,this.src=r.src??t,this.ref=this,this._actorScope={self:this,id:this.id,sessionId:this.sessionId,logger:this.logger,defer:d=>{this._deferred.push(d)},system:this.system,stopChild:d=>{if(d._parent!==this)throw new Error(`Cannot stop child actor ${d.id} of ${this.id} because it is not a child`);d._stop()},emit:d=>{const u=this.eventListeners.get(d.type),p=this.eventListeners.get("*");if(!u&&!p)return;const g=[...u?u.values():[],...p?p.values():[]];for(const y of g)try{y(d)}catch(q){Jn(q)}},actionExecutor:d=>{const u=()=>{if(this._actorScope.system._sendInspectionEvent({type:"@xstate.action",actorRef:this,action:{type:d.type,params:d.params}}),!d.exec)return;const p=Dh;try{Dh=!0,d.exec(d.info,d.params)}finally{Dh=p}};this._processingStatus===Qt.Running?u():this._deferred.push(u)}},this.send=this.send.bind(this),this.system._sendInspectionEvent({type:"@xstate.actor",actorRef:this}),c&&(this.systemId=c,this.system._set(c,this)),this._initState((n==null?void 0:n.snapshot)??(n==null?void 0:n.state)),c&&this._snapshot.status!=="active"&&this.system._unregister(this)}_initState(t){var n;try{this._snapshot=t?this.logic.restoreSnapshot?this.logic.restoreSnapshot(t,this._actorScope):t:this.logic.getInitialSnapshot(this._actorScope,(n=this.options)==null?void 0:n.input)}catch(r){this._snapshot={status:"error",output:void 0,error:r}}}update(t,n){var i,o;this._snapshot=t;let r;for(;r=this._deferred.shift();)try{r()}catch(s){this._deferred.length=0,this._snapshot={...t,status:"error",error:s}}switch(this._snapshot.status){case"active":for(const s of this.observers)try{(i=s.next)==null||i.call(s,t)}catch(l){Jn(l)}break;case"done":for(const s of this.observers)try{(o=s.next)==null||o.call(s,t)}catch(l){Jn(l)}this._stopProcedure(),this._complete(),this._doneEvent=oI(this.id,this._snapshot.output),this._parent&&this.system._relay(this,this._parent,this._doneEvent);break;case"error":this._error(this._snapshot.error);break}this.system._sendInspectionEvent({type:"@xstate.snapshot",actorRef:this,event:n,snapshot:t})}subscribe(t,n,r){var o;const i=Tu(t,n,r);if(this._processingStatus!==Qt.Stopped)this.observers.add(i);else switch(this._snapshot.status){case"done":try{(o=i.complete)==null||o.call(i)}catch(s){Jn(s)}break;case"error":{const s=this._snapshot.error;if(!i.error)Jn(s);else try{i.error(s)}catch(l){Jn(l)}break}}return{unsubscribe:()=>{this.observers.delete(i)}}}on(t,n){let r=this.eventListeners.get(t);r||(r=new Set,this.eventListeners.set(t,r));const i=n.bind(void 0);return r.add(i),{unsubscribe:()=>{r.delete(i)}}}select(t,n=Object.is){return{subscribe:r=>{const i=Tu(r),o=this.getSnapshot();let s=t(o);return this.subscribe(l=>{var c;const a=t(l);n(s,a)||(s=a,(c=i.next)==null||c.call(i,a))})},get:()=>t(this.getSnapshot())}}start(){if(this._processingStatus===Qt.Running)return this;this._syncSnapshot&&this.subscribe({next:r=>{r.status==="active"&&this.system._relay(this,this._parent,{type:`xstate.snapshot.${this.id}`,snapshot:r})},error:()=>{}}),this.system._register(this.sessionId,this),this.systemId&&this.system._set(this.systemId,this),this._processingStatus=Qt.Running;const t=uv(this.options.input);switch(this.system._sendInspectionEvent({type:"@xstate.event",sourceRef:this._parent,actorRef:this,event:t}),this._snapshot.status){case"done":return this.update(this._snapshot,t),this;case"error":return this._error(this._snapshot.error),this}if(this._parent||this.system.start(),this.logic.start)try{this.logic.start(this._snapshot,this._actorScope)}catch(r){return this._snapshot={...this._snapshot,status:"error",error:r},this._error(r),this}return this.update(this._snapshot,t),this.options.devTools&&this.attachDevTools(),this.mailbox.start(),this}_process(t){let n,r;try{n=this.logic.transition(this._snapshot,t,this._actorScope)}catch(i){r={err:i}}if(r){const{err:i}=r;this._snapshot={...this._snapshot,status:"error",error:i},this._error(i);return}this.update(n,t),t.type===Lf&&(this._stopProcedure(),this._complete())}_stop(){return this._processingStatus===Qt.Stopped?this:(this.mailbox.clear(),this._processingStatus===Qt.NotStarted?(this._processingStatus=Qt.Stopped,this):(this.mailbox.enqueue({type:Lf}),this))}stop(){if(this._parent)throw new Error("A non-root actor cannot be stopped directly.");return this._stop()}_complete(){var t;for(const n of this.observers)try{(t=n.complete)==null||t.call(n)}catch(r){Jn(r)}this.observers.clear(),this.eventListeners.clear()}_reportError(t){if(!this.observers.size){this._parent||Jn(t),this.eventListeners.clear();return}let n=!1;for(const r of this.observers){const i=r.error;n||(n=!i);try{i==null||i(t)}catch(o){Jn(o)}}this.observers.clear(),this.eventListeners.clear(),n&&Jn(t)}_error(t){this._stopProcedure(),this._reportError(t),this._parent&&this.system._relay(this,this._parent,cv(this.id,t))}_stopProcedure(){return this._processingStatus!==Qt.Running?this:(this.system.scheduler.cancelAll(this),this.mailbox.clear(),this.mailbox=new i6(this._process.bind(this)),this._processingStatus=Qt.Stopped,this.system._unregister(this),this)}_send(t){this._processingStatus!==Qt.Stopped&&this.mailbox.enqueue(t)}send(t){this.system._relay(void 0,this,t)}attachDevTools(){const{devTools:t}=this.options;t&&(typeof t=="function"?t:JP)(this)}toJSON(){return{xstate$$type:sg,id:this.id}}getPersistedSnapshot(t){return this.logic.getPersistedSnapshot(this._snapshot,t)}[sI](){return this}getSnapshot(){return this._snapshot}}function il(e,...[t]){return new fI(e,t)}function gI(e,t,n,r,{sendId:i}){const o=typeof i=="function"?i(n,r):i;return[t,{sendId:o},void 0]}function pI(e,t){e.defer(()=>{e.system.scheduler.cancel(e.self,t.sendId)})}function lg(e){function t(n,r){}return t.type="xstate.cancel",t.sendId=e,t.resolve=gI,t.execute=pI,t}function mI(e,t,n,r,{id:i,systemId:o,src:s,input:l,syncSnapshot:a}){const c=typeof s=="string"?og(t.machine,s):s,h=typeof i=="function"?i(n):i;let d,u;return c&&(u=typeof l=="function"?l({context:t.context,event:n.event,self:e.self}):l,d=il(c,{id:h,src:s,parent:e.self,syncSnapshot:a,systemId:o,input:u})),[Bi(t,{children:{...t.children,[h]:d}}),{id:i,systemId:o,actorRef:d,src:s,input:u},void 0]}function yI(e,{actorRef:t}){t&&e.defer(()=>{t._processingStatus!==Qt.Stopped&&t.start()})}function ag(...[e,{id:t,systemId:n,input:r,syncSnapshot:i=!1}={}]){function o(s,l){}return o.type="xstate.spawnChild",o.id=t,o.systemId=n,o.src=e,o.input=r,o.syncSnapshot=i,o.resolve=mI,o.execute=yI,o}function AI(e,t,n,r,{actorRef:i}){const o=typeof i=="function"?i(n,r):i,s=typeof o=="string"?t.children[o]:o;let l=t.children;return s&&(l={...l},delete l[s.id]),[Bi(t,{children:l}),s,void 0]}function pv(e,t){const n=t.getSnapshot();if(n&&"children"in n)for(const r of Object.values(n.children))pv(e,r);e.system._unregister(t)}function vI(e,t){if(t){if(pv(e,t),t._processingStatus!==Qt.Running){e.stopChild(t);return}e.defer(()=>{e.stopChild(t)})}}function jd(e){function t(n,r){}return t.type="xstate.stopChild",t.actorRef=e,t.resolve=AI,t.execute=vI,t}function qI(e,{context:t,event:n},{guards:r}){return r.every(i=>pc(i,t,n,e))}function wI(e){function t(n,r){return!1}return t.check=qI,t.guards=e,t}function pc(e,t,n,r){const{machine:i}=r,o=typeof e=="function",s=o?e:i.implementations.guards[typeof e=="string"?e:e.type];if(!o&&!s)throw new Error(`Guard '${typeof e=="string"?e:e.type}' is not implemented.'.`);if(typeof s!="function")return pc(s,t,n,r);const l={context:t,event:n},a=o||typeof e=="string"?void 0:"params"in e?typeof e.params=="function"?e.params({context:t,event:n}):e.params:void 0;return"check"in s?s.check(r,l,s):s(l,a)}function cg(e){return e.type==="atomic"||e.type==="final"}function ol(e){return Object.values(e.states).filter(t=>t.type!=="history")}function mc(e,t){const n=[];if(t===e)return n;let r=e.parent;for(;r&&r!==t;)n.push(r),r=r.parent;return n}function S1(e){const t=new Set(e),n=yv(t);for(const r of t)if(r.type==="compound"&&(!n.get(r)||!n.get(r).length))c6(r).forEach(i=>t.add(i));else if(r.type==="parallel"){for(const i of ol(r))if(i.type!=="history"&&!t.has(i)){const o=c6(i);for(const s of o)t.add(s)}}for(const r of t){let i=r.parent;for(;i;)t.add(i),i=i.parent}return t}function mv(e,t){const n=t.get(e);if(!n)return{};if(e.type==="compound"){const i=n[0];if(i){if(cg(i))return i.key}else return{}}const r={};for(const i of n)r[i.key]=mv(i,t);return r}function yv(e){const t=new Map;for(const n of e)t.has(n)||t.set(n,[]),n.parent&&(t.has(n.parent)||t.set(n.parent,[]),t.get(n.parent).push(n));return t}function Av(e,t){const n=S1(t);return mv(e,yv(n))}function ug(e,t){return t.type==="compound"?ol(t).some(n=>n.type==="final"&&e.has(n)):t.type==="parallel"?ol(t).every(n=>ug(e,n)):t.type==="final"}const zd=e=>e[0]===tI;function xI(e,t){const n=e.transitions.get(t),r=[...e.transitions.keys()].filter(i=>i!==t&&cI(t,i)).sort((i,o)=>o.length-i.length).flatMap(i=>e.transitions.get(i));return n?[...n,...r]:r}function bI(e){const t=e.config.after;if(!t)return[];const n=i=>{const o=iI(i,e.id),s=o.type;return e.entry.push(fg(o,{id:s,delay:i})),e.exit.push(lg(s)),s};return Object.keys(t).flatMap(i=>{const o=t[i],s=typeof o=="string"?{target:o}:o,l=Number.isNaN(+i)?i:+i,a=n(l);return Ai(s).map(c=>({...c,event:a,delay:l}))}).map(i=>{const{delay:o}=i;return{...ui(e,i.event,i),delay:o}})}function ui(e,t,n){const r=gv(n.target),i=n.reenter??!1,o=zI(e,r),s={...n,actions:Ai(n.actions),guard:n.guard,target:o,source:e,reenter:i,eventType:t,toJSON:()=>({...s,source:`#${e.id}`,target:o?o.map(l=>`#${l.id}`):void 0})};return s}function VI(e){const t=new Map;if(e.config.on)for(const n of Object.keys(e.config.on)){if(n===lv)throw new Error('Null events ("") cannot be specified as a transition key. Use `always: { ... }` instead.');const r=e.config.on[n];t.set(n,as(r).map(i=>ui(e,n,i)))}if(e.config.onDone){const n=`xstate.done.state.${e.id}`;t.set(n,as(e.config.onDone).map(r=>ui(e,n,r)))}for(const n of e.invoke){if(n.onDone){const r=`xstate.done.actor.${n.id}`;t.set(r,as(n.onDone).map(i=>ui(e,r,i)))}if(n.onError){const r=`xstate.error.actor.${n.id}`;t.set(r,as(n.onError).map(i=>ui(e,r,i)))}if(n.onSnapshot){const r=`xstate.snapshot.${n.id}`;t.set(r,as(n.onSnapshot).map(i=>ui(e,r,i)))}}for(const n of e.after){let r=t.get(n.eventType);r||(r=[],t.set(n.eventType,r)),r.push(n)}return t}function kI(e){const t=[],n=r=>{Object.values(r).forEach(i=>{if(i.config.route&&i.config.id){const o=i.config.id,s=i.config.route.guard,l=({event:c})=>c.to===`#${o}`,a={...i.config.route,guard:s?wI([l,s]):l,target:`#${o}`};t.push(ui(e,"xstate.route",a))}i.states&&n(i.states)})};n(e.states),t.length>0&&e.transitions.set("xstate.route",t)}function jI(e,t){const n=typeof t=="string"?e.states[t]:t?e.states[t.target]:void 0;if(!n&&t)throw new Error(`Initial state node "${t}" not found on parent state node #${e.id}`);const r={source:e,actions:!t||typeof t=="string"?[]:Ai(t.actions),eventType:null,reenter:!1,target:n?[n]:[],toJSON:()=>({...r,source:`#${e.id}`,target:n?[`#${n.id}`]:[]})};return r}function zI(e,t){if(t!==void 0)return t.map(n=>{if(typeof n!="string")return n;if(zd(n))return e.machine.getStateNodeById(n);const r=n[0]===sv;if(r&&!e.parent)return C1(e,n.slice(1));const i=r?e.key+n:n;if(e.parent)try{return C1(e.parent,i)}catch(o){throw new Error(`Invalid transition definition for state node '${e.id}':
|
|
181
181
|
${o.message}`)}else throw new Error(`Invalid target: "${n}" is not a valid target from the root node. Did you mean ".${n}"?`)})}function vv(e){const t=gv(e.config.target);return t?{target:t.map(n=>typeof n=="string"?C1(e.parent,n):n)}:e.parent.type==="parallel"?{target:[e.parent]}:e.parent.initial}function go(e){return e.type==="history"}function c6(e){const t=qv(e);for(const n of t)for(const r of mc(n,e))t.add(r);return t}function qv(e){const t=new Set;function n(r){if(!t.has(r)){if(t.add(r),r.type==="compound")n(r.initial.target[0]);else if(r.type==="parallel")for(const i of ol(r))n(i)}}return n(e),t}function sl(e,t){if(zd(t))return e.machine.getStateNodeById(t);if(!e.states)throw new Error(`Unable to retrieve child state '${t}' from '${e.id}'; no child states exist.`);const n=e.states[t];if(!n)throw new Error(`Child state '${t}' does not exist on '${e.id}'`);return n}function C1(e,t){if(typeof t=="string"&&zd(t))try{return e.machine.getStateNodeById(t)}catch{}const n=ig(t).slice();let r=e;for(;n.length;){const i=n.shift();if(!i.length)break;r=sl(r,i)}return r}function E1(e,t){if(typeof t=="string"){const i=e.states[t];if(!i)throw new Error(`State '${t}' does not exist on '${e.id}'`);return[e,i]}const n=Object.keys(t),r=n.map(i=>sl(e,i)).filter(Boolean);return[e.machine.root,e].concat(r,n.reduce((i,o)=>{const s=sl(e,o);if(!s)return i;const l=E1(s,t[o]);return i.concat(l)},[]))}function SI(e,t,n,r){const o=sl(e,t).next(n,r);return!o||!o.length?e.next(n,r):o}function CI(e,t,n,r){const i=Object.keys(t),o=sl(e,i[0]),s=dg(o,t[i[0]],n,r);return!s||!s.length?e.next(n,r):s}function EI(e,t,n,r){const i=[];for(const o of Object.keys(t)){const s=t[o];if(!s)continue;const l=sl(e,o),a=dg(l,s,n,r);a&&i.push(...a)}return i.length?i:e.next(n,r)}function dg(e,t,n,r){return typeof t=="string"?SI(e,t,n,r):Object.keys(t).length===1?CI(e,t,n,r):EI(e,t,n,r)}function RI(e){return Object.keys(e.states).map(t=>e.states[t]).filter(t=>t.type==="history")}function Oi(e,t){let n=e;for(;n.parent&&n.parent!==t;)n=n.parent;return n.parent===t}function _I(e,t){const n=new Set(e),r=new Set(t);for(const i of n)if(r.has(i))return!0;for(const i of r)if(n.has(i))return!0;return!1}function wv(e,t,n){const r=new Set;for(const i of e){let o=!1;const s=new Set;for(const l of r)if(_I(Of([i],t,n),Of([l],t,n)))if(Oi(i.source,l.source))s.add(l);else{o=!0;break}if(!o){for(const l of s)r.delete(l);r.add(i)}}return Array.from(r)}function TI(e){const[t,...n]=e;for(const r of mc(t,void 0))if(n.every(i=>Oi(i,r)))return r}function hg(e,t){if(!e.target)return[];const n=new Set;for(const r of e.target)if(go(r))if(t[r.id])for(const i of t[r.id])n.add(i);else for(const i of hg(vv(r),t))n.add(i);else n.add(r);return[...n]}function xv(e,t){const n=hg(e,t);if(!n)return;if(!e.reenter&&n.every(i=>i===e.source||Oi(i,e.source)))return e.source;const r=TI(n.concat(e.source));if(r)return r;if(!e.reenter)return e.source.machine.root}function Of(e,t,n){var i;const r=new Set;for(const o of e)if((i=o.target)!=null&&i.length){const s=xv(o,n);o.reenter&&o.source===s&&r.add(s);for(const l of t)Oi(l,s)&&r.add(l)}return[...r]}function MI(e,t){if(e.length!==t.size)return!1;for(const n of e)if(!t.has(n))return!1;return!0}function PI(e,t,n,r,i){return Bf([{target:[...qv(e)],source:e,reenter:!0,actions:[],eventType:null,toJSON:null}],t,n,r,!0,i)}function Bf(e,t,n,r,i,o){const s=[];if(!e.length)return[t,s];const l=n.actionExecutor;n.actionExecutor=a=>{s.push(a),l(a)};try{const a=new Set(t._nodes);let c=t.historyValue;const h=wv(e,a,c);let d=t;i||([d,c]=DI(d,r,n,h,a,c,o,n.actionExecutor)),d=ll(d,r,n,h.flatMap(p=>p.actions),o,void 0),d=LI(d,r,n,h,a,o,c,i);const u=[...a];d.status==="done"&&(d=ll(d,r,n,u.sort((p,g)=>g.order-p.order).flatMap(p=>p.exit),o,void 0));try{return c===t.historyValue&&MI(t._nodes,a)?[d,s]:[Bi(d,{_nodes:u,historyValue:c}),s]}catch(p){throw p}}finally{n.actionExecutor=l}}function II(e,t,n,r,i){if(r.output===void 0)return;const o=Nf(i.id,i.output!==void 0&&i.parent?Df(i.output,e.context,t,n.self):void 0);return Df(r.output,e.context,o,n.self)}function LI(e,t,n,r,i,o,s,l){let a=e;const c=new Set,h=new Set;NI(r,s,h,c),l&&h.add(e.machine.root);const d=new Set;for(const u of[...c].sort((p,g)=>p.order-g.order)){i.add(u);const p=[];p.push(...u.entry);for(const g of u.invoke)p.push(ag(g.src,{...g,syncSnapshot:!!g.onSnapshot}));if(h.has(u)){const g=u.initial.actions;p.push(...g)}if(a=ll(a,t,n,p,o,u.invoke.map(g=>g.id)),u.type==="final"){const g=u.parent;let y=(g==null?void 0:g.type)==="parallel"?g:g==null?void 0:g.parent,q=y||u;for((g==null?void 0:g.type)==="compound"&&o.push(Nf(g.id,u.output!==void 0?Df(u.output,a.context,t,n.self):void 0));(y==null?void 0:y.type)==="parallel"&&!d.has(y)&&ug(i,y);)d.add(y),o.push(Nf(y.id)),q=y,y=y.parent;if(y)continue;a=Bi(a,{status:"done",output:II(a,t,n,a.machine.root,q)})}}return a}function NI(e,t,n,r){for(const i of e){const o=xv(i,t);for(const l of i.target||[])!go(l)&&(i.source!==l||i.source!==o||i.reenter)&&(r.add(l),n.add(l)),ks(l,t,n,r);const s=hg(i,t);for(const l of s){const a=mc(l,o);(o==null?void 0:o.type)==="parallel"&&a.push(o),bv(r,t,n,a,!i.source.parent&&i.reenter?void 0:o)}}}function ks(e,t,n,r){var i;if(go(e))if(t[e.id]){const o=t[e.id];for(const s of o)r.add(s),ks(s,t,n,r);for(const s of o)Oh(s,e.parent,r,t,n)}else{const o=vv(e);for(const s of o.target)r.add(s),o===((i=e.parent)==null?void 0:i.initial)&&n.add(e.parent),ks(s,t,n,r);for(const s of o.target)Oh(s,e.parent,r,t,n)}else if(e.type==="compound"){const[o]=e.initial.target;go(o)||(r.add(o),n.add(o)),ks(o,t,n,r),Oh(o,e,r,t,n)}else if(e.type==="parallel")for(const o of ol(e).filter(s=>!go(s)))[...r].some(s=>Oi(s,o))||(go(o)||(r.add(o),n.add(o)),ks(o,t,n,r))}function bv(e,t,n,r,i){for(const o of r)if((!i||Oi(o,i))&&e.add(o),o.type==="parallel")for(const s of ol(o).filter(l=>!go(l)))[...e].some(l=>Oi(l,s))||(e.add(s),ks(s,t,n,e))}function Oh(e,t,n,r,i){bv(n,r,i,mc(e,t))}function DI(e,t,n,r,i,o,s,l){let a=e;const c=Of(r,i,o);c.sort((d,u)=>u.order-d.order);let h;for(const d of c)for(const u of RI(d)){let p;u.history==="deep"?p=g=>cg(g)&&Oi(g,d):p=g=>g.parent===d,h??(h={...o}),h[u.id]=Array.from(i).filter(p)}for(const d of c)a=ll(a,t,n,[...d.exit,...d.invoke.map(u=>jd(u.id))],s,void 0),i.delete(d);return[a,h||o]}function OI(e,t){return e.implementations.actions[t]}function Vv(e,t,n,r,i,o){const{machine:s}=e;let l=e;for(const a of r){const c=typeof a=="function",h=c?a:OI(s,typeof a=="string"?a:a.type),d={context:l.context,event:t,self:n.self,system:n.system},u=c||typeof a=="string"?void 0:"params"in a?typeof a.params=="function"?a.params({context:l.context,event:t}):a.params:void 0;if(!h||!("resolve"in h)){n.actionExecutor({type:typeof a=="string"?a:typeof a=="object"?a.type:a.name||"(anonymous)",info:d,params:u,exec:h});continue}const p=h,[g,y,q]=p.resolve(n,l,d,u,h,i);l=g,"retryResolve"in p&&(o==null||o.push([p,y])),"execute"in p&&n.actionExecutor({type:p.type,info:d,params:y,exec:p.execute.bind(null,n,y)}),q&&(l=Vv(l,t,n,q,i,o))}return l}function ll(e,t,n,r,i,o){const s=o?[]:void 0,l=Vv(e,t,n,r,{internalQueue:i,deferredActorIds:o},s);return s==null||s.forEach(([a,c])=>{a.retryResolve(n,l,c)}),l}function Bh(e,t,n,r){var d;let i=e;const o=[];function s(u,p,g){n.system._sendInspectionEvent({type:"@xstate.microstep",actorRef:n.self,event:p,snapshot:u[0],_transitions:g}),o.push(u)}if(t.type===Lf)return i=Bi(u6(i,t,n),{status:"stopped"}),s([i,[]],t,[]),{snapshot:i,microsteps:o};let l=t;if(l.type!==av){const u=l,p=aI(u),g=d6(u,i);if(p&&!g.length)return i=Bi(e,{status:"error",error:u.error}),s([i,[]],u,[]),{snapshot:i,microsteps:o};const y=Bf(g,e,n,l,!1,r);i=y[0],s(y,u,g)}let a=!0;const c=((d=e.machine.options)==null?void 0:d.maxIterations)??1/0;let h=0;for(;i.status==="active";){if(h++,h>c)throw new Error(`Infinite loop detected: the machine has processed more than ${c} microsteps without reaching a stable state. This usually happens when there's a cycle of transitions (e.g., eventless transitions or raised events causing state A -> B -> C -> A).`);let u=a?BI(i,l):[];const p=u.length?i:void 0;if(!u.length){if(!r.length)break;l=r.shift(),u=d6(l,i)}const g=Bf(u,i,n,l,!1,r);i=g[0],a=i!==p,s(g,l,u)}return i.status!=="active"&&u6(i,l,n),{snapshot:i,microsteps:o}}function u6(e,t,n){return ll(e,t,n,Object.values(e.children).map(r=>jd(r)),[],void 0)}function d6(e,t){return t.machine.getTransitionData(t,e)}function BI(e,t){const n=new Set,r=e._nodes.filter(cg);for(const i of r)e:for(const o of[i].concat(mc(i,void 0)))if(o.always){for(const s of o.always)if(s.guard===void 0||pc(s.guard,e.context,t,e)){n.add(s);break e}}return wv(Array.from(n),new Set(e._nodes),e.historyValue)}function FI(e,t){const n=S1(E1(e,t));return Av(e,[...n])}function HI(e){return!!e&&typeof e=="object"&&"machine"in e&&"value"in e}const UI=function(t){return dv(t,this.value)},WI=function(t){return this.tags.has(t)},KI=function(t){const n=this.machine.getTransitionData(this,t);return!!(n!=null&&n.length)&&n.some(r=>r.target!==void 0||r.actions.length)},$I=function(){const{_nodes:t,tags:n,machine:r,getMeta:i,toJSON:o,can:s,hasTag:l,matches:a,...c}=this;return{...c,tags:Array.from(n)}},GI=function(){return this._nodes.reduce((t,n)=>(n.meta!==void 0&&(t[n.id]=n.meta),t),{})};function Gl(e,t){return{status:e.status,output:e.output,error:e.error,machine:t,context:e.context,_nodes:e._nodes,value:Av(t.root,e._nodes),tags:new Set(e._nodes.flatMap(n=>n.tags)),children:e.children,historyValue:e.historyValue||{},matches:UI,hasTag:WI,can:KI,getMeta:GI,toJSON:$I}}function Bi(e,t={}){return Gl({...e,...t},e.machine)}function QI(e){if(typeof e!="object"||e===null)return{};const t={};for(const n in e){const r=e[n];Array.isArray(r)&&(t[n]=r.map(i=>({id:i.id})))}return t}function YI(e,t){const{_nodes:n,tags:r,machine:i,children:o,context:s,can:l,hasTag:a,matches:c,getMeta:h,toJSON:d,...u}=e,p={};for(const y in o){const q=o[y];p[y]={snapshot:q.getPersistedSnapshot(t),src:q.src,systemId:q.systemId,syncSnapshot:q._syncSnapshot}}return{...u,context:kv(s),children:p,historyValue:QI(u.historyValue)}}function kv(e){let t;for(const n in e){const r=e[n];if(r&&typeof r=="object")if("sessionId"in r&&"send"in r&&"ref"in r)t??(t=Array.isArray(e)?e.slice():{...e}),t[n]={xstate$$type:sg,id:r.id};else{const i=kv(r);i!==r&&(t??(t=Array.isArray(e)?e.slice():{...e}),t[n]=i)}}return t??e}function ZI(e,t,n,r,{event:i,id:o,delay:s},{internalQueue:l}){const a=t.machine.implementations.delays;if(typeof i=="string")throw new Error(`Only event objects may be used with raise; use raise({ type: "${i}" }) instead`);const c=typeof i=="function"?i(n,r):i;let h;if(typeof s=="string"){const d=a&&a[s];h=typeof d=="function"?d(n,r):d}else h=typeof s=="function"?s(n,r):s;return typeof h!="number"&&l.push(c),[t,{event:c,id:o,delay:h},void 0]}function XI(e,t){const{event:n,delay:r,id:i}=t;if(typeof r=="number"){e.defer(()=>{const o=e.self;e.system.scheduler.schedule(o,o,n,r,i)});return}}function fg(e,t){function n(r,i){}return n.type="xstate.raise",n.event=e,n.id=t==null?void 0:t.id,n.delay=t==null?void 0:t.delay,n.resolve=ZI,n.execute=XI,n}function JI(e,{machine:t,context:n},r,i){const o=(s,l)=>{if(typeof s=="string"){const a=og(t,s);if(!a)throw new Error(`Actor logic '${s}' not implemented in machine '${t.id}'`);const c=il(a,{id:l==null?void 0:l.id,parent:e.self,syncSnapshot:l==null?void 0:l.syncSnapshot,input:typeof(l==null?void 0:l.input)=="function"?l.input({context:n,event:r,self:e.self}):l==null?void 0:l.input,src:s,systemId:l==null?void 0:l.systemId});return i[c.id]=c,c}else return il(s,{id:l==null?void 0:l.id,parent:e.self,syncSnapshot:l==null?void 0:l.syncSnapshot,input:l==null?void 0:l.input,src:s,systemId:l==null?void 0:l.systemId})};return(s,l)=>{const a=o(s,l);return i[a.id]=a,e.defer(()=>{a._processingStatus!==Qt.Stopped&&a.start()}),a}}function eL(e,t,n,r,{assignment:i}){if(!t.context)throw new Error("Cannot assign to undefined `context`. Ensure that `context` is defined in the machine config.");const o={},s={context:t.context,event:n.event,spawn:JI(e,t,n.event,o),self:e.self,system:e.system};let l={};if(typeof i=="function")l=i(s,r);else for(const c of Object.keys(i)){const h=i[c];l[c]=typeof h=="function"?h(s,r):h}const a=Object.assign({},t.context,l);return[Bi(t,{context:a,children:Object.keys(o).length?{...t.children,...o}:t.children}),void 0,void 0]}function di(e){function t(n,r){}return t.type="xstate.assign",t.assignment=e,t.resolve=eL,t}const h6=new WeakMap;function ns(e,t,n){let r=h6.get(e);return r?t in r||(r[t]=n()):(r={[t]:n()},h6.set(e,r)),r[t]}const tL={},Nl=e=>typeof e=="string"?{type:e}:typeof e=="function"?"resolve"in e?{type:e.type}:{type:e.name}:e;class R1{constructor(t,n){if(this.config=t,this.key=void 0,this.id=void 0,this.type=void 0,this.path=void 0,this.states=void 0,this.history=void 0,this.entry=void 0,this.exit=void 0,this.parent=void 0,this.machine=void 0,this.meta=void 0,this.output=void 0,this.order=-1,this.description=void 0,this.tags=[],this.transitions=void 0,this.always=void 0,this.parent=n._parent,this.key=n._key,this.machine=n._machine,this.path=this.parent?this.parent.path.concat(this.key):[],this.id=this.config.id||[this.machine.id,...this.path].join(sv),this.type=this.config.type||(this.config.states&&Object.keys(this.config.states).length?"compound":this.config.history?"history":"atomic"),this.description=this.config.description,this.order=this.machine.idMap.size,this.machine.idMap.set(this.id,this),this.states=this.config.states?s6(this.config.states,(r,i)=>new R1(r,{_parent:this,_key:i,_machine:this.machine})):tL,this.type==="compound"&&!this.config.initial)throw new Error(`No initial state specified for compound state node "#${this.id}". Try adding { initial: "${Object.keys(this.states)[0]}" } to the state config.`);this.history=this.config.history===!0?"shallow":this.config.history||!1,this.entry=Ai(this.config.entry).slice(),this.exit=Ai(this.config.exit).slice(),this.meta=this.config.meta,this.output=this.type==="final"||!this.parent?this.config.output:void 0,this.tags=Ai(t.tags).slice()}_initialize(){this.transitions=VI(this),this.config.always&&(this.always=as(this.config.always).map(t=>ui(this,lv,t))),Object.keys(this.states).forEach(t=>{this.states[t]._initialize()})}get definition(){return{id:this.id,key:this.key,version:this.machine.version,type:this.type,initial:this.initial?{target:this.initial.target,source:this,actions:this.initial.actions.map(Nl),eventType:null,reenter:!1,toJSON:()=>({target:this.initial.target.map(t=>`#${t.id}`),source:`#${this.id}`,actions:this.initial.actions.map(Nl),eventType:null})}:void 0,history:this.history,states:s6(this.states,t=>t.definition),on:this.on,transitions:[...this.transitions.values()].flat().map(t=>({...t,actions:t.actions.map(Nl)})),entry:this.entry.map(Nl),exit:this.exit.map(Nl),meta:this.meta,order:this.order||-1,output:this.output,invoke:this.invoke,description:this.description,tags:this.tags}}toJSON(){return this.definition}get invoke(){return ns(this,"invoke",()=>Ai(this.config.invoke).map((t,n)=>{const{src:r,systemId:i}=t,o=t.id??l6(this.id,n),s=typeof r=="string"?r:`xstate.invoke.${l6(this.id,n)}`;return{...t,src:s,id:o,systemId:i,toJSON(){const{onDone:l,onError:a,...c}=t;return{...c,type:"xstate.invoke",src:s,id:o}}}}))}get on(){return ns(this,"on",()=>[...this.transitions].flatMap(([n,r])=>r.map(i=>[n,i])).reduce((n,[r,i])=>(n[r]=n[r]||[],n[r].push(i),n),{}))}get after(){return ns(this,"delayedTransitions",()=>bI(this))}get initial(){return ns(this,"initial",()=>jI(this,this.config.initial))}next(t,n){const r=n.type,i=[];let o;const s=ns(this,`candidates-${r}`,()=>xI(this,r));for(const l of s){const{guard:a}=l,c=t.context;let h=!1;try{h=!a||pc(a,c,n,t)}catch(d){const u=typeof a=="string"?a:typeof a=="object"?a.type:void 0;throw new Error(`Unable to evaluate guard ${u?`'${u}' `:""}in transition for event '${r}' in state node '${this.id}':
|
|
182
182
|
${d.message}`)}if(h){i.push(...l.actions),o=l;break}}return o?[o]:void 0}get events(){return ns(this,"events",()=>{const{states:t}=this,n=new Set(this.ownEvents);if(t)for(const r of Object.keys(t)){const i=t[r];if(i.states)for(const o of i.events)n.add(`${o}`)}return Array.from(n)})}get ownEvents(){const t=Object.keys(Object.fromEntries(this.transitions)),n=new Set(t.filter(r=>this.transitions.get(r).some(i=>!(!i.target&&!i.actions.length&&!i.reenter))));return Array.from(n)}}const nL="#";class gg{constructor(t,n){this.config=t,this.version=void 0,this.schemas=void 0,this.implementations=void 0,this.options=void 0,this.__xstatenode=!0,this.idMap=new Map,this.root=void 0,this.id=void 0,this.states=void 0,this.events=void 0,this.id=t.id||"(machine)",this.implementations={actors:(n==null?void 0:n.actors)??{},actions:(n==null?void 0:n.actions)??{},delays:(n==null?void 0:n.delays)??{},guards:(n==null?void 0:n.guards)??{}},this.version=this.config.version,this.schemas=this.config.schemas,this.options={maxIterations:1/0,...this.config.options},this.transition=this.transition.bind(this),this.getInitialSnapshot=this.getInitialSnapshot.bind(this),this.getPersistedSnapshot=this.getPersistedSnapshot.bind(this),this.restoreSnapshot=this.restoreSnapshot.bind(this),this.start=this.start.bind(this),this.root=new R1(t,{_key:this.id,_machine:this}),this.root._initialize(),kI(this.root),this.states=this.root.states,this.events=this.root.events}provide(t){const{actions:n,guards:r,actors:i,delays:o}=this.implementations;return new gg(this.config,{actions:{...n,...t.actions},guards:{...r,...t.guards},actors:{...i,...t.actors},delays:{...o,...t.delays}})}resolveState(t){const n=FI(this.root,t.value),r=S1(E1(this.root,n));return Gl({_nodes:[...r],context:t.context||{},children:{},status:ug(r,this.root)?"done":t.status||"active",output:t.output,error:t.error,historyValue:t.historyValue},this)}transition(t,n,r){return Bh(t,n,r,[]).snapshot}microstep(t,n,r){return Bh(t,n,r,[]).microsteps.map(([i])=>i)}getTransitionData(t,n){return dg(this.root,t.value,t,n)||[]}_getPreInitialState(t,n,r){const{context:i}=this.config,o=Gl({context:typeof i!="function"&&i?i:{},_nodes:[this.root],children:{},status:"active"},this);return typeof i=="function"?ll(o,n,t,[di(({spawn:l,event:a,self:c})=>i({spawn:l,input:a.input,self:c}))],r,void 0):o}getInitialSnapshot(t,n){const r=uv(n),i=[];let o=Gl({context:typeof this.config.context!="function"&&this.config.context?this.config.context:{},_nodes:[this.root],children:{},status:"active"},this);try{o=this._getPreInitialState(t,r,i);const[s]=PI(this.root,o,t,r,i),{snapshot:l}=Bh(s,r,t,i);return l}catch(s){return Bi(o,{status:"error",error:s})}}start(t){Object.values(t.children).forEach(n=>{n.getSnapshot().status==="active"&&n.start()})}getStateNodeById(t){const n=ig(t),r=n.slice(1),i=zd(n[0])?n[0].slice(nL.length):n[0],o=this.idMap.get(i);if(!o)throw new Error(`Child state node '#${i}' does not exist on machine '${this.id}'`);return C1(o,r)}get definition(){return this.root.definition}toJSON(){return this.definition}getPersistedSnapshot(t,n){return YI(t,n)}restoreSnapshot(t,n){const r={},i=t.children;Object.keys(i).forEach(d=>{const u=i[d],p=u.snapshot,g=u.src,y=typeof g=="string"?og(this,g):g;if(!y)return;const q=il(y,{id:d,parent:n.self,syncSnapshot:u.syncSnapshot,snapshot:p,src:g,systemId:u.systemId});r[d]=q});function o(d,u){if(u instanceof R1)return u;try{return d.machine.getStateNodeById(u.id)}catch{}}function s(d,u){if(!u||typeof u!="object")return{};const p={};for(const g in u){const y=u[g];for(const q of y){const m=o(d,q);m&&(p[g]??(p[g]=[]),p[g].push(m))}}return p}const l=s(this.root,t.historyValue),a=Gl({...t,children:r,_nodes:Array.from(S1(E1(this.root,t.value))),historyValue:l},this),c=new Set;function h(d,u){if(!c.has(d)){c.add(d);for(const p in d){const g=d[p];if(g&&typeof g=="object"){if("xstate$$type"in g&&g.xstate$$type===sg){d[p]=u[g.id];continue}h(g,u)}}}}return h(a.context,r),a}}function rL(e,t,n,r,{event:i}){const o=typeof i=="function"?i(n,r):i;return[t,{event:o},void 0]}function iL(e,{event:t}){e.defer(()=>e.emit(t))}function jv(e){function t(n,r){}return t.type="xstate.emit",t.event=e,t.resolve=rL,t.execute=iL,t}let Ff=function(e){return e.Parent="#_parent",e.Internal="#_internal",e}({});function oL(e,t,n,r,{to:i,event:o,id:s,delay:l},a){var g;const c=t.machine.implementations.delays;if(typeof o=="string")throw new Error(`Only event objects may be used with sendTo; use sendTo({ type: "${o}" }) instead`);const h=typeof o=="function"?o(n,r):o;let d;if(typeof l=="string"){const y=c&&c[l];d=typeof y=="function"?y(n,r):y}else d=typeof l=="function"?l(n,r):l;const u=typeof i=="function"?i(n,r):i;let p;if(typeof u=="string"){if(u===Ff.Parent?p=e.self._parent:u===Ff.Internal?p=e.self:u.startsWith("#_")?p=t.children[u.slice(2)]:p=(g=a.deferredActorIds)!=null&&g.includes(u)?u:t.children[u],!p)throw new Error(`Unable to send event to actor '${u}' from machine '${t.machine.id}'.`)}else p=u||e.self;return[t,{to:p,targetId:typeof u=="string"?u:void 0,event:h,id:s,delay:d},void 0]}function sL(e,t,n){typeof n.to=="string"&&(n.to=t.children[n.to])}function lL(e,t){e.defer(()=>{const{to:n,event:r,delay:i,id:o}=t;if(typeof i=="number"){e.system.scheduler.schedule(e.self,n,r,i,o);return}e.system._relay(e.self,n,r.type===rI?cv(e.self.id,r.data):r)})}function pg(e,t,n){function r(i,o){}return r.type="xstate.sendTo",r.to=e,r.event=t,r.id=n==null?void 0:n.id,r.delay=n==null?void 0:n.delay,r.resolve=oL,r.retryResolve=sL,r.execute=lL,r}function aL(e,t){return pg(Ff.Parent,e,t)}function cL(e,t,n,r,{collect:i}){const o=[],s=function(a){o.push(a)};return s.assign=(...l)=>{o.push(di(...l))},s.cancel=(...l)=>{o.push(lg(...l))},s.raise=(...l)=>{o.push(fg(...l))},s.sendTo=(...l)=>{o.push(pg(...l))},s.sendParent=(...l)=>{o.push(aL(...l))},s.spawnChild=(...l)=>{o.push(ag(...l))},s.stopChild=(...l)=>{o.push(jd(...l))},s.emit=(...l)=>{o.push(jv(...l))},i({context:n.context,event:n.event,enqueue:s,check:l=>pc(l,t.context,n.event,t),self:e.self,system:e.system},r),[t,void 0,o]}function uL(e){function t(n,r){}return t.type="xstate.enqueueActions",t.collect=e,t.resolve=cL,t}function dL(e,t,n,r,{value:i,label:o}){return[t,{value:typeof i=="function"?i(n,r):i,label:o},void 0]}function hL({logger:e},{value:t,label:n}){n?e(n,t):e(t)}function fL(e=({context:n,event:r})=>({context:n,event:r}),t){function n(r,i){}return n.type="xstate.log",n.value=e,n.label=t,n.resolve=dL,n.execute=hL,n}function gL(e,t){return new gg(e,t)}function zv({schemas:e,actors:t,actions:n,guards:r,delays:i}){return{assign:di,sendTo:pg,raise:fg,log:fL,cancel:lg,stopChild:jd,enqueueActions:uL,emit:jv,spawnChild:ag,createStateConfig:o=>o,createAction:o=>o,createMachine:o=>gL({...o,schemas:e},{actors:t,actions:n,guards:r,delays:i}),extend:o=>zv({schemas:e,actors:t,actions:{...n,...o.actions},guards:{...r,...o.guards},delays:{...i,...o.delays}})}}const pL=zv({actions:{absorbCardEnter:di(({event:e})=>e.type!=="CARD_ENTER"?{}:{cardId:e.cardId,answerLen:e.answerLen,advanceMode:e.advanceMode,confirmKey:e.confirmKey,isDone:e.isDone,awaitingAdvance:!1}),absorbModeChange:di(({event:e})=>e.type!=="MODE_CHANGE"?{}:{advanceMode:e.advanceMode,confirmKey:e.confirmKey}),clearAwaitingAdvance:di({awaitingAdvance:!1}),clearIsDone:di({isDone:!1})},guards:{isDone:({event:e})=>e.type==="CARD_ENTER"&&e.isDone===!0}}).createMachine({id:"typing",initial:"idle",context:({input:e})=>({cardId:e.cardId,answerLen:e.answerLen,advanceMode:e.advanceMode,confirmKey:e.confirmKey,isDone:e.isDone,awaitingAdvance:!1}),states:{idle:{on:{START:"typing",CARD_ENTER:[{guard:"isDone",target:"completed",actions:"absorbCardEnter"},{target:"idle",actions:"absorbCardEnter",reenter:!0}],MODE_CHANGE:{actions:"absorbModeChange"}}},typing:{on:{PAUSE:"paused",ENGINE_FINISH:{target:"passed",actions:di(({context:e})=>({awaitingAdvance:e.advanceMode==="manual"}))},CARD_ENTER:[{guard:"isDone",target:"completed",actions:"absorbCardEnter"},{target:"typing",actions:"absorbCardEnter",reenter:!0}],MODE_CHANGE:{actions:"absorbModeChange"}}},paused:{on:{START:"typing",CARD_ENTER:[{guard:"isDone",target:"completed",actions:"absorbCardEnter"},{target:"idle",actions:"absorbCardEnter"}],MODE_CHANGE:{actions:"absorbModeChange"}}},passed:{on:{STAMP_TIMEOUT:{actions:"clearAwaitingAdvance"},CONFIRM_ADVANCE:{actions:"clearAwaitingAdvance"},ADVANCE_END:"finished",CARD_ENTER:[{guard:"isDone",target:"completed",actions:"absorbCardEnter"},{target:"typing",actions:"absorbCardEnter",reenter:!0}],MODE_CHANGE:{actions:"absorbModeChange"}}},completed:{on:{RESTART:{target:"typing",actions:"clearIsDone"},CARD_ENTER:[{guard:"isDone",target:"completed",actions:"absorbCardEnter",reenter:!0},{target:"typing",actions:"absorbCardEnter"}],MODE_CHANGE:{actions:"absorbModeChange"}}},finished:{on:{CARD_ENTER:[{guard:"isDone",target:"completed",actions:"absorbCardEnter"},{target:"typing",actions:"absorbCardEnter"}],MODE_CHANGE:{actions:"absorbModeChange"}}}}});var mL=v.useLayoutEffect;const Sv=(e,t)=>{t(e);const n=e.getSnapshot().children;n&&Object.values(n).forEach(r=>{Sv(r,t)})};function yL(e){var r,i;const t=[];Sv(e,o=>{t.push([o,o.getSnapshot()]),o.observers=new Set});const n=(i=(r=e.system).getSnapshot)==null?void 0:i.call(r);e.stop(),e.system._snapshot=n,t.forEach(([o,s])=>{o._processingStatus=0,o._snapshot=s})}function AL(e,...[t]){let[[n,r],i]=v.useState(()=>{const o=il(e,t);return[e.config,o]});if(e.config!==n){const o=il(e,{...t,snapshot:r.getPersistedSnapshot({__unsafeAllowInlineActors:!0})});i([e.config,o]),r=o}return mL(()=>{r.logic.implementations=e.implementations}),r}function vL(e,...[t]){const n=AL(e,t),r=v.useCallback(()=>n.getSnapshot(),[n]),i=v.useCallback(l=>{const{unsubscribe:a}=n.subscribe({next:l,error:l});return a},[n]),o=_8.useSyncExternalStore(i,r,r),s="status"in o?o:void 0;if((s==null?void 0:s.status)==="error")throw s.error;return v.useEffect(()=>(n.start(),()=>{yL(n)}),[n]),[o,n.send,n]}function qL(e,...[t]){return vL(e,t)}function wL(e){const{cardId:t,answerLen:n,advanceMode:r,confirmKey:i,isDone:o,currentKeystroke:s}=e,[l,a]=qL(pL,{input:{cardId:t,answerLen:n,advanceMode:r,confirmKey:i,isDone:o}}),c=v.useRef(o);c.current=o;const h=v.useRef(r);h.current=r;const d=v.useRef(i);d.current=i,v.useEffect(()=>{a({type:"CARD_ENTER",cardId:t,answerLen:n,isDone:c.current,advanceMode:h.current,confirmKey:d.current})},[t,n]),v.useEffect(()=>{a({type:"MODE_CHANGE",advanceMode:r,confirmKey:i})},[r,i]);const u=l.value,p=l.context.awaitingAdvance,g=v.useMemo(()=>({kind:u,awaitingAdvance:p,showMask:u==="idle"||u==="paused",hudPaused:u!=="typing",showStamp:u==="passed"?"pass":null,showPill:u==="passed"&&p,keyboardKeystroke:u==="passed"&&p?{key:i==="Space"?"space":"enter"}:u==="completed"||u==="finished"||u==="passed"?null:s,acceptTyping:u==="typing",finished:u==="finished"}),[u,p,i,s]);return{kind:u,awaitingAdvance:p,send:a,derived:g}}function xL(e,t){const[n]=O4(),[r]=B4(),[i]=F4(),o=v.useMemo(()=>new d_(t,{ignoreCase:n,ignorePunctuation:r,allowBackspace:i}),[e,t]);return o.settings.ignoreCase=n,o.settings.ignorePunctuation=r,o.settings.allowBackspace=i,o}const bL={cpm:0,wpm:0,accuracy:1,elapsedMs:0};function VL(e){return{target:e.target,typed:"",cursor:0,correctCount:0,wrongCount:0,startedAt:null,finishedAt:null,composing:!1}}function kL(e){var n;return((n=G4(e.target)[0])==null?void 0:n.keystrokes[0])??null}function jL(e){const t=v.useMemo(()=>e?VL(e):null,[e]),n=v.useMemo(()=>e?kL(e):null,[e]),[r,i]=v.useState(null),[o,s]=v.useState(null),[l,a]=v.useState(null),c=v.useCallback((h,d,u)=>{i(h),s(d),a(u)},[]);return v.useEffect(()=>{i(null),s(null),a(null)},[e]),{typingState:r??t,typingMetrics:o??(t?bL:null),currentKeystroke:l??n,handleTypingChange:c}}function zL({open:e,onOpenChange:t,title:n,message:r,confirmLabel:i,cancelLabel:o,danger:s,alertOnly:l,onConfirm:a,onCancel:c}){const{t:h}=ve();return f.jsx(sc,{open:e,onOpenChange:t,children:f.jsxs(lc,{children:[f.jsx(ac,{className:"qt-confirm__overlay"}),f.jsxs(cc,{className:"qt-confirm__content",onEscapeKeyDown:d=>{l&&(d.preventDefault(),a())},children:[n&&f.jsx(pd,{className:"qt-confirm__title",children:n}),f.jsx(uy,{className:"qt-confirm__message",children:r}),f.jsxs("div",{className:"qt-confirm__actions",children:[!l&&f.jsx("button",{type:"button",className:"qt-confirm__btn",onClick:()=>{c==null||c(),t(!1)},children:o??h("common.cancel")}),f.jsx("button",{type:"button",className:`qt-confirm__btn qt-confirm__btn--primary ${s?"qt-confirm__btn--danger":""}`,onClick:()=>{a(),t(!1)},autoFocus:!0,children:i??h("common.confirm")})]})]})]})})}const _1=[];let Fh=null,lu=null;function Cv(){Fh||(lu=document.createElement("div"),lu.id="qt-confirm-root",document.body.appendChild(lu),Fh=W3(lu),Fh.render(f.jsx(SL,{})))}let qn=null;function SL(){const[e,t]=v.useState(null),[n,r]=v.useState(!1);v.useEffect(()=>(qn=()=>{t(o=>{if(o)return o;const s=_1.shift()??null;return s&&r(!0),s})},qn(),()=>{qn=null}),[]);const i=o=>{e&&(e.resolve(o),t(null),r(!1),setTimeout(()=>{_1.length>0&&(qn==null||qn())},100))};return e?f.jsx(zL,{open:n,onOpenChange:o=>{o||i(!1)},title:e.opts.title,message:e.opts.message,confirmLabel:e.opts.confirmLabel,cancelLabel:e.opts.cancelLabel,danger:e.opts.danger,alertOnly:e.alertOnly,onConfirm:()=>i(!0),onCancel:()=>i(!1)}):null}function T1(e){return new Promise(t=>{Cv(),_1.push({opts:e,alertOnly:!1,resolve:t}),qn==null||qn()})}function f6(e){const t=typeof e=="string"?{message:e}:e;return new Promise(n=>{Cv(),_1.push({opts:{message:t.message,title:t.title,confirmLabel:t.confirmLabel},alertOnly:!0,resolve:()=>n()}),qn==null||qn()})}function CL(){const{t:e}=ve(),{cardMap:t,clearAll:n,exportProgress:r,importProgress:i}=rg(),o=Object.keys(t).length,s=()=>{BA(r(),"qtype-progress.json")},l=async()=>{try{const c=await LM();if(!await T1({message:e("confirm.overwriteImport"),danger:!0}))return;i(c),await f6({message:e("toast.importOk")})}catch(c){const h=c instanceof Error?c.message:String(c),d=h.startsWith("err.")?e(h):h;await f6({message:e("toast.importFail",{msg:d})})}},a=async()=>{if(o===0)return;await T1({message:e("confirm.resetDone"),danger:!0})&&n()};return f.jsxs("div",{children:[f.jsx(Wo,{title:e("settings.data.title"),subtitle:e("settings.data.subtitle")}),f.jsx(fe,{title:e("settings.data.completed"),description:e("settings.data.completed.desc",{count:o}),divider:!1,children:f.jsx("button",{className:"qt-danger-btn",onClick:a,disabled:o===0,children:e("settings.data.resetAll")})}),f.jsx(fe,{title:e("settings.data.export"),description:e("settings.data.export.desc"),children:f.jsx("button",{className:"qt-setting-btn",onClick:s,children:e("settings.data.export.action")})}),f.jsx(fe,{title:e("settings.data.import"),description:e("settings.data.import.desc"),children:f.jsx("button",{className:"qt-setting-btn",onClick:l,children:e("settings.data.import.action")})})]})}function EL(){const{t:e}=ve(),[t,n]=hA(),[r,i]=fA(),[o,s]=wd(),[l,a]=xd(),[c,h]=gA(),[d,u]=pA(),[p,g]=nR(),[y,q]=yA();return f.jsxs("div",{children:[f.jsx(Wo,{title:e("settings.interface.title"),subtitle:e("settings.interface.subtitle")}),f.jsx(fe,{id:"showPhonetic",title:e("settings.interface.showPhonetic"),description:e("settings.interface.showPhonetic.desc"),divider:!1,children:f.jsx(kt,{checked:o,onChange:s})}),f.jsx(fe,{id:"showGloss",title:e("settings.interface.showGloss"),description:e("settings.interface.showGloss.desc"),children:f.jsx(kt,{checked:l,onChange:a})}),f.jsx(fe,{id:"neighborPreview",title:e("settings.interface.neighborPreview"),description:e("settings.interface.neighborPreview.desc"),children:f.jsx(kt,{checked:r,onChange:i})}),f.jsx(fe,{id:"autoHideCursor",title:e("settings.interface.autoHideCursor"),description:e("settings.interface.autoHideCursor.desc"),children:f.jsx(kt,{checked:t,onChange:n})}),f.jsx(fe,{id:"showResultPopup",title:e("settings.interface.showResultPopup"),description:e("settings.interface.showResultPopup.desc"),children:f.jsx(kt,{checked:c,onChange:h})}),f.jsx(fe,{id:"codeSyntaxHighlight",title:e("settings.interface.codeSyntaxHighlight"),description:e("settings.interface.codeSyntaxHighlight.desc"),children:f.jsx(kt,{checked:p,onChange:g})}),f.jsx(fe,{id:"mathRenderer",title:e("settings.interface.mathRenderer"),description:e("settings.interface.mathRenderer.desc"),children:f.jsx(kt,{checked:y,onChange:q})}),f.jsx(fe,{id:"afkSeconds",title:e("settings.interface.afkSeconds"),description:e("settings.interface.afkSeconds.desc"),children:f.jsx(ot,{value:String(d),onChange:m=>u(parseInt(m,10)),options:[{value:"10",label:"10s"},{value:"15",label:"15s"},{value:"30",label:"30s"},{value:"60",label:"60s"},{value:"120",label:"2m"}]})})]})}const g6=800,RL=4,ni=(()=>{const e=["LHome","L00","L01","L02","L03","L04","L05","L10","L11","L12","L13","L14","L15","L20","L21","L22","L23","L24","L25","L30","L31","L32","L33","L34","L35","L40"],t=["RHome","R00","R01","R02","R03","R04","R05","R06","R07","R10","R11","R12","R13","R14","R15","R16","R17","R20","R21","R22","R23","R24","R25","R26","R30","R31","R32","R33","R34","R35","R40"],n=[];return e.forEach((r,i)=>{r==="LHome"?n.push({id:r,label:"L·home",side:"left"}):n.push({id:r,label:`L${i-1}`,side:"left"})}),t.forEach((r,i)=>{r==="RHome"?n.push({id:r,label:"R·home",side:"right"}):n.push({id:r,label:`R${i-1}`,side:"right"})}),n})();function _L({open:e,onOpenChange:t}){var R,T,E;const{t:n}=ve(),[r,i]=v.useState(0),o=ni[r],[s,l]=v.useState(()=>yi()),[a,c]=v.useState(null),[h,d]=v.useState(!1);v.useEffect(()=>c(null),[r]);const u=s[o.id]??Vs[o.id]??{x:0,y:0,svg:o.id},p=a??u,g=p.svg??o.id,y=a!==null,q=s[o.id],m=!!q&&(q.x!==((R=Vs[o.id])==null?void 0:R.x)||q.y!==((T=Vs[o.id])==null?void 0:T.y)||q.svg!==((E=Vs[o.id])==null?void 0:E.svg)),A=v.useRef(null),w=v.useCallback(C=>{C.preventDefault();const _=C.currentTarget.offsetParent,L=_==null?void 0:_.getBoundingClientRect(),D=L&&(_!=null&&_.offsetWidth)?L.width/_.offsetWidth:1;A.current={startX:C.clientX,startY:C.clientY,origX:p.x,origY:p.y,scale:D,moved:!1};const M=C.currentTarget;M.setPointerCapture(C.pointerId);const N=$=>{const P=A.current;if(!P)return;const H=$.clientX-P.startX,Z=$.clientY-P.startY;if(!P.moved&&Math.hypot(H,Z)>RL&&(P.moved=!0),P.moved){const G=H/P.scale,Q=Z/P.scale;c(le=>({x:P.origX+G,y:P.origY+Q,svg:(le==null?void 0:le.svg)??p.svg}))}},O=$=>{M.releasePointerCapture($.pointerId),M.removeEventListener("pointermove",N),M.removeEventListener("pointerup",O),M.removeEventListener("pointercancel",O);const P=A.current;A.current=null,P&&!P.moved&&d(!0)};M.addEventListener("pointermove",N),M.addEventListener("pointerup",O),M.addEventListener("pointercancel",O)},[p.x,p.y,p.svg]);v.useEffect(()=>{if(!e||h)return;const C=_=>{var M;const L=(M=_.target)==null?void 0:M.tagName;if(L==="INPUT"||L==="TEXTAREA")return;const D=_.shiftKey?10:1;if(_.key==="ArrowLeft"||_.key==="ArrowRight"||_.key==="ArrowUp"||_.key==="ArrowDown"){_.preventDefault();const N=_.key==="ArrowLeft"?-D:_.key==="ArrowRight"?D:0,O=_.key==="ArrowUp"?-D:_.key==="ArrowDown"?D:0;c($=>({x:(($==null?void 0:$.x)??p.x)+N,y:(($==null?void 0:$.y)??p.y)+O,svg:($==null?void 0:$.svg)??p.svg}))}else _.key==="["?i(N=>(N-1+ni.length)%ni.length):_.key==="]"&&i(N=>(N+1)%ni.length)};return window.addEventListener("keydown",C),()=>window.removeEventListener("keydown",C)},[e,h,p.x,p.y,p.svg]);const x=()=>{a&&(NM(o.id,{x:a.x,y:a.y,svg:a.svg??g}),l(yi()),c(null))},V=()=>c(null),k=()=>{DM(o.id),l(yi()),c(null)},b=async()=>{await T1({message:n("confirm.resetAllOffsets"),danger:!0})&&(OM(),l(yi()),c(null))},j=()=>BM("keyBindings.json"),z=()=>i(C=>(C-1+ni.length)%ni.length),S=()=>i(C=>(C+1)%ni.length);return f.jsxs(f.Fragment,{children:[f.jsx(sc,{open:e,onOpenChange:t,children:f.jsxs(lc,{children:[f.jsx(ac,{className:"qt-kcal__overlay"}),f.jsxs(cc,{className:"qt-kcal__content",children:[f.jsxs("div",{className:"qt-kcal__header",children:[f.jsx(pd,{className:"qt-kcal__title",children:n("calibrator.title")}),f.jsx("span",{className:"qt-kcal__hint",children:n("calibrator.hint")}),f.jsx(V4,{className:"qt-kcal__close","aria-label":n("common.close"),children:"×"})]}),f.jsxs("div",{className:"qt-kcal__body",children:[f.jsxs("div",{className:"qt-kcal__nav",children:[f.jsx("button",{className:"qt-kcal__btn",onClick:z,children:n("calibrator.prev")}),f.jsxs("div",{className:"qt-kcal__pose-label",children:[f.jsx("span",{className:"qt-kcal__pose-side",children:o.side==="left"?n("calibrator.leftHand"):n("calibrator.rightHand")}),f.jsx("span",{className:"qt-kcal__pose-name",children:o.label}),f.jsxs("span",{className:"qt-kcal__pose-idx",children:[r+1," / ",ni.length]})]}),f.jsx("button",{className:"qt-kcal__btn",onClick:S,children:n("calibrator.next")})]}),f.jsx("div",{className:"qt-kcal__stage",children:f.jsx(HA,{showHands:!0,calibration:{handId:o.id,svgId:g,offset:{x:p.x,y:p.y},onHandPointerDown:w}})}),f.jsxs("div",{className:"qt-kcal__coords",children:[f.jsxs("span",{children:[f.jsx("b",{children:o.id}),f.jsxs("span",{className:"qt-kcal__svg-tag",children:[" → svg: ",g]})]}),f.jsxs("span",{children:["x: ",p.x.toFixed(1)]}),f.jsxs("span",{children:["y: ",p.y.toFixed(1)]}),y&&f.jsx("span",{className:"qt-kcal__dirty",children:n("calibrator.unsaved")}),!y&&m&&f.jsx("span",{className:"qt-kcal__customized",children:n("calibrator.customized")})]}),f.jsxs("div",{className:"qt-kcal__actions",children:[f.jsx("button",{className:"qt-kcal__btn qt-kcal__btn--primary",onClick:x,disabled:!y,children:n("calibrator.save")}),f.jsx("button",{className:"qt-kcal__btn",onClick:V,disabled:!y,children:n("calibrator.cancel")}),f.jsx("button",{className:"qt-kcal__btn",onClick:k,disabled:!m&&!y,children:n("calibrator.resetThis")})]})]}),f.jsxs("div",{className:"qt-kcal__footer",children:[f.jsx("button",{className:"qt-kcal__btn",onClick:b,children:n("calibrator.resetAll")}),f.jsx("div",{className:"qt-kcal__footer-spacer"}),f.jsx("button",{className:"qt-kcal__btn qt-kcal__btn--primary",onClick:j,children:n("calibrator.export")})]})]})]})}),f.jsx(TL,{open:h,currentSvg:g,side:o.side,onPick:C=>{c(_=>({x:(_==null?void 0:_.x)??p.x,y:(_==null?void 0:_.y)??p.y,svg:C})),d(!1)},onClose:()=>d(!1)})]})}function TL({open:e,currentSvg:t,side:n,onPick:r,onClose:i}){const{t:o}=ve(),s=v.useMemo(()=>{const l=n==="left"?"L":"R";return Object.keys(z1).filter(a=>a.startsWith(l)).sort((a,c)=>{const h=a==="LHome"||a==="RHome"?-1:parseInt(a.slice(1),10),d=c==="LHome"||c==="RHome"?-1:parseInt(c.slice(1),10);return h-d})},[n]);return f.jsx(sc,{open:e,onOpenChange:l=>!l&&i(),children:f.jsxs(lc,{children:[f.jsx(ac,{className:"qt-kcal__picker-overlay"}),f.jsxs(cc,{className:"qt-kcal__picker",children:[f.jsxs("div",{className:"qt-kcal__picker-header",children:[f.jsx(pd,{className:"qt-kcal__picker-title",children:o("calibrator.picker.title",{side:o(n==="left"?"calibrator.leftHand":"calibrator.rightHand")})}),f.jsx(V4,{className:"qt-kcal__close","aria-label":o("common.close"),children:"×"})]}),f.jsx("div",{className:"qt-kcal__picker-grid",children:s.map(l=>{const a=z1[l];return f.jsx("button",{className:`qt-kcal__picker-cell ${l===t?"is-selected":""}`,onClick:()=>r(l),title:l,children:f.jsx("svg",{viewBox:`0 0 ${g6} ${g6}`,width:bs/3,height:bs/3,dangerouslySetInnerHTML:{__html:a}})},l)})})]})]})})}function ML(){const{t:e}=ve(),[t,n]=cA(),[r,i]=uA(),[o,s]=dA(),[l,a]=v.useState(!1);return f.jsxs("div",{children:[f.jsx(Wo,{title:e("settings.keyboard.title"),subtitle:e("settings.keyboard.subtitle")}),f.jsx(fe,{id:"showKeyboard",title:e("settings.keyboard.showKeyboard"),description:e("settings.keyboard.showKeyboard.desc"),divider:!1,children:f.jsx(kt,{checked:t,onChange:n})}),f.jsx(fe,{id:"showHands",title:e("settings.keyboard.showHands"),description:e("settings.keyboard.showHands.desc"),children:f.jsx(kt,{checked:r&&t,onChange:i})}),f.jsx(fe,{id:"keyboardSize",title:e("settings.keyboard.size"),description:e("settings.keyboard.size.desc"),children:f.jsx(ot,{value:o,onChange:s,options:[{value:"s",label:e("size.s")},{value:"m",label:e("size.m")},{value:"l",label:e("size.l")}]})}),f.jsx(fe,{id:"calibrate",title:e("settings.keyboard.calibrate"),description:e("settings.keyboard.calibrate.desc"),children:f.jsx("button",{type:"button",className:"qt-setting-btn",onClick:()=>a(!0),children:e("settings.keyboard.calibrate.open")})}),f.jsx(_L,{open:l,onOpenChange:a})]})}function PL(){const{t:e}=ve(),[t,n]=v.useState(null),r=v.useMemo(()=>{const o=new Map;for(const s of pl){if(s.paletteOnly)continue;const l=s.group??"other",a=o.get(l)??[];a.push(s),o.set(l,a)}return Array.from(o.entries())},[]);v.useEffect(()=>{if(!t)return;const o=s=>{if(s.preventDefault(),s.stopPropagation(),s.key==="Escape"){n(null);return}const l=qy(s);l&&(by(t,[CC(l)]),n(null))};return window.addEventListener("keydown",o,!0),()=>window.removeEventListener("keydown",o,!0)},[t]);const i=async()=>{await T1({message:e("settings.shortcuts.confirmResetAll"),danger:!0})&&LC()};return f.jsxs("div",{children:[f.jsx(Wo,{title:e("settings.shortcuts.title"),subtitle:e("settings.shortcuts.subtitle")}),f.jsx("div",{className:"qt-shortcuts",children:r.map(([o,s])=>f.jsxs("div",{className:"qt-shortcuts__group",children:[f.jsx("div",{className:"qt-shortcuts__group-title",children:e(`settings.shortcuts.group.${o}`)}),s.map(l=>f.jsx(IL,{actionId:l.id,labelKey:l.labelKey,recording:t===l.id,onRecord:()=>n(l.id),onCancel:()=>n(null)},l.id))]},o))}),f.jsx(fe,{title:"",description:"",children:f.jsx("button",{className:"qt-setting-btn",onClick:i,children:e("settings.shortcuts.resetAll")})})]})}function IL({actionId:e,labelKey:t,recording:n,onRecord:r,onCancel:i}){var h;const{t:o}=ve(),s=ai(e),l=s[0]??"",a=l?NC(l,e):[],c=l?!PC(l):!1;return f.jsxs("div",{className:"qt-shortcut-row",children:[f.jsx("div",{className:"qt-shortcut-row__label",children:o(t)}),f.jsx("button",{className:`qt-shortcut-row__key ${n?"is-recording":""}`,onClick:()=>n?i():r(),children:n?f.jsx("span",{className:"qt-shortcut-row__hint",children:o("settings.shortcuts.recording")}):s.length===0?f.jsx("span",{className:"qt-shortcut-row__disabled",children:o("settings.shortcuts.disabled")}):f.jsx("kbd",{className:"qt-shortcut-row__kbd",children:Ho(s)})}),f.jsx("button",{className:"qt-shortcut-row__btn",onClick:()=>IC(e),title:o("settings.shortcuts.reset"),"aria-label":o("settings.shortcuts.reset"),children:"↻"}),f.jsx("button",{className:"qt-shortcut-row__btn qt-shortcut-row__btn--danger",onClick:()=>by(e,[]),"aria-label":o("settings.shortcuts.disabled"),children:"×"}),(a.length>0||c)&&f.jsxs("div",{className:"qt-shortcut-row__warn",children:[a.length>0&&f.jsx("span",{children:o("settings.shortcuts.conflict",{name:o(((h=z4(a[0]))==null?void 0:h.labelKey)??a[0])})}),c&&f.jsx("span",{children:o("settings.shortcuts.noModifier")})]})]})}function LL(){const{t:e}=ve(),[t,n]=de("settings","hint","ghost",{serialize:_=>_,deserialize:_=>_==="none"||_==="ghost"?_:"ghost"}),[r,i]=Zy(),[o,s]=D4(),[l,a]=Xy(),[c,h]=K4(),[d,u]=Jy(),[p,g]=eA(),[y,q]=tA(),[m,A]=nA(),[w,x]=rA(),[V,k]=iA(),[b,j]=O4(),[z,S]=B4(),[R,T]=F4(),[E,C]=mA();return f.jsxs("div",{children:[f.jsx(Wo,{title:e("settings.typing.title"),subtitle:e("settings.typing.subtitle")}),f.jsx(fe,{id:"hint",title:e("settings.typing.hint"),description:e("settings.typing.hint.desc"),divider:!1,children:f.jsx(ot,{value:t,onChange:n,options:[{value:"none",label:e("common.off")},{value:"ghost",label:e("common.on")}]})}),f.jsx(fe,{id:"speedUnit",title:e("settings.typing.speedUnit"),description:e("settings.typing.speedUnit.desc"),children:f.jsx(ot,{value:c,onChange:h,options:[{value:"wpm",label:"WPM"},{value:"cpm",label:"CPM"}]})}),f.jsx(fe,{id:"targetWpm",title:e("settings.typing.targetWpm"),description:e("settings.typing.targetWpm.desc"),children:f.jsx(ot,{value:String(r),onChange:_=>i(parseInt(_,10)),options:[{value:"0",label:e("common.off")},{value:"20",label:"20"},{value:"40",label:"40"},{value:"60",label:"60"},{value:"80",label:"80"}]})}),f.jsx(fe,{id:"maxWrongRate",title:e("settings.typing.maxWrongRate"),description:e("settings.typing.maxWrongRate.desc"),children:f.jsx(ot,{value:String(d),onChange:_=>u(parseInt(_,10)),options:[{value:"0",label:e("common.off")},{value:"5",label:"5%"},{value:"10",label:"10%"},{value:"20",label:"20%"}]})}),f.jsx(fe,{id:"tabBehavior",title:e("settings.typing.tabBehavior"),description:e("settings.typing.tabBehavior.desc"),children:f.jsx(ot,{value:o,onChange:s,options:[{value:"reset",label:e("settings.typing.tabBehavior.reset")},{value:"input",label:e("settings.typing.tabBehavior.input")}]})}),o==="input"&&f.jsx(fe,{id:"tabWidth",title:e("settings.typing.tabWidth"),description:e("settings.typing.tabWidth.desc"),children:f.jsx(ot,{value:String(l),onChange:_=>a(_==="2"?2:4),options:[{value:"2",label:e("settings.typing.tabWidth.2")},{value:"4",label:e("settings.typing.tabWidth.4")}]})}),f.jsx(fe,{id:"completion",title:e("settings.typing.completion"),description:e("settings.typing.completion.desc"),children:f.jsx(ot,{value:p,onChange:g,options:[{value:"through",label:e("settings.typing.completion.through")},{value:"lenient",label:e("settings.typing.completion.lenient")},{value:"perfect",label:e("settings.typing.completion.perfect")}]})}),f.jsx(fe,{id:"advance",title:e("settings.typing.advance"),description:e("settings.typing.advance.desc"),children:f.jsx(ot,{value:y,onChange:q,options:[{value:"auto",label:e("settings.typing.advance.auto")},{value:"manual",label:e("settings.typing.advance.manual")}]})}),y==="manual"&&f.jsx(fe,{id:"confirmKey",title:e("settings.typing.confirmKey"),description:e("settings.typing.confirmKey.desc"),children:f.jsx(ot,{value:m,onChange:A,options:[{value:"Enter",label:e("settings.typing.confirmKey.enter")},{value:"Space",label:e("settings.typing.confirmKey.space")}]})}),f.jsx(fe,{id:"retry",title:e("settings.typing.retry"),description:e("settings.typing.retry.desc"),children:f.jsx(ot,{value:w,onChange:x,options:[{value:"off",label:e("settings.typing.retry.off")},{value:"auto",label:e("settings.typing.retry.auto")},{value:"immediate",label:e("settings.typing.retry.immediate")}]})}),f.jsx(fe,{id:"maxRetries",title:e("settings.typing.maxRetries"),description:e("settings.typing.maxRetries.desc"),children:f.jsx(ot,{value:String(V),onChange:_=>k(parseInt(_,10)),options:[{value:"3",label:"3"},{value:"5",label:"5"},{value:"10",label:"10"},{value:"0",label:e("settings.typing.maxRetries.unlimited")}]})}),f.jsx(fe,{id:"ignoreCase",title:e("settings.typing.ignoreCase"),description:e("settings.typing.ignoreCase.desc"),children:f.jsx(kt,{checked:b,onChange:j})}),f.jsx(fe,{id:"ignorePunctuation",title:e("settings.typing.ignorePunctuation"),description:e("settings.typing.ignorePunctuation.desc"),children:f.jsx(kt,{checked:z,onChange:S})}),f.jsx(fe,{id:"allowBackspace",title:e("settings.typing.allowBackspace"),description:e("settings.typing.allowBackspace.desc"),children:f.jsx(kt,{checked:R,onChange:T})}),f.jsx(fe,{id:"minAccuracy",title:e("settings.typing.minAccuracy"),description:e("settings.typing.minAccuracy.desc"),children:f.jsx(ot,{value:String(E),onChange:_=>C(parseInt(_,10)),options:[{value:"0",label:e("common.off")},{value:"70",label:"70%"},{value:"80",label:"80%"},{value:"90",label:"90%"},{value:"95",label:"95%"}]})})]})}function p6({text:e,query:t,className:n}){const r=t.trim();if(!r)return f.jsx("span",{className:n,children:e});const i=e.toLowerCase(),o=r.toLowerCase(),s=[];let l=0,a=i.indexOf(o,l),c=0;for(;a!==-1;)a>l&&s.push(e.slice(l,a)),s.push(f.jsx("mark",{className:"qt-settings__highlight",children:e.slice(a,a+o.length)},c++)),l=a+o.length,a=i.indexOf(o,l);return l<e.length&&s.push(e.slice(l)),f.jsx("span",{className:n,children:s})}function NL({query:e,matches:t,onPick:n}){const{t:r}=ve();if(t.length===0)return f.jsx("div",{className:"qt-settings-search__empty",children:r("settings.search.empty",{query:e})});const i=new Map;for(const o of t){const s=i.get(o.tab)??[];s.push(o),i.set(o.tab,s)}return f.jsxs("div",{className:"qt-settings-search",children:[f.jsx("div",{className:"qt-settings-search__count",children:r("settings.search.resultCount",{count:t.length})}),Array.from(i.entries()).map(([o,s])=>f.jsxs("div",{className:"qt-settings-search__group",children:[f.jsx("div",{className:"qt-settings-search__group-label",children:r(Hy[o])}),s.map(l=>f.jsxs("button",{type:"button",className:"qt-settings-search__row",onClick:()=>n(l.id,l.tab),children:[f.jsx("div",{className:"qt-settings-search__row-title",children:f.jsx(p6,{text:r(l.titleKey),query:e})}),l.descKey&&f.jsx("div",{className:"qt-settings-search__row-desc",children:f.jsx(p6,{text:r(l.descKey),query:e})})]},l.id))]},o))]})}function DL({activeTab:e,expandedGroups:t,onTabChange:n,onGroupToggle:r,matchCounts:i,searching:o=!1}){const{t:s}=ve();return f.jsx("nav",{className:"qt-settings-sidebar","aria-label":s("settings.sidebar.aria"),children:N4.map(l=>{const a=t.has(l.id),c=o?l.tabs.reduce((d,u)=>d+((i==null?void 0:i.get(u))??0),0):0,h=o&&c===0;return f.jsxs("div",{className:"qt-settings-sidebar__group",children:[f.jsxs("button",{type:"button",className:`qt-settings-sidebar__group-row ${h?"is-dim":""}`,onClick:()=>r(l.id),"aria-expanded":a,children:[f.jsx(n4,{size:12,className:`qt-settings-sidebar__chevron ${a?"is-open":""}`}),f.jsx("span",{className:"qt-settings-sidebar__group-label",children:s(l.labelKey)}),o&&c>0&&f.jsx("span",{className:"qt-settings-sidebar__count",children:c})]}),a&&f.jsx("div",{role:"list",className:"qt-settings-sidebar__tabs",children:l.tabs.map(d=>{const u=(i==null?void 0:i.get(d))??0,p=o&&u===0;return f.jsxs("button",{type:"button",role:"listitem",className:`qt-settings-sidebar__tab ${e===d?"is-active":""} ${p?"is-dim":""}`,onClick:()=>n(d),"aria-current":e===d?"page":void 0,disabled:p,children:[f.jsx("span",{className:"qt-settings-sidebar__tab-label",children:s(Hy[d])}),o&&u>0&&f.jsx("span",{className:"qt-settings-sidebar__count",children:u})]},d)})})]},l.id)})})}const OL="qtype.settings-dialog.sidebar",BL="qtype.settings-dialog.content",FL=["[data-separator]","[data-panel-resize-handle-enabled]","[data-panel-group]","[data-group]"].join(",");function m6(e){return e instanceof HTMLElement?e.closest(FL)!==null:!1}function HL(e){switch(e){case"appearance":return f.jsx(rR,{});case"data":return f.jsx(CL,{});case"typing-rules":return f.jsx(LL,{});case"audio":return f.jsx(iR,{});case"interface":return f.jsx(EL,{});case"keyboard":return f.jsx(ML,{});case"shortcuts":return f.jsx(PL,{});default:return null}}function UL(){const{isOpen:e,isExpanded:t,activeTab:n,expandedGroups:r,query:i,close:o,setTab:s,toggleGroup:l,toggleExpanded:a,setQuery:c,clearQuery:h,revealSetting:d}=Wy(),{t:u}=ve(),p=v.useMemo(()=>i?eR(i,u):[],[i,u]),g=v.useMemo(()=>{const q=new Map;for(const m of p)q.set(m.tab,(q.get(m.tab)??0)+1);return q},[p]),y=i.trim().length>0;return f.jsx(sc,{open:e,onOpenChange:q=>!q&&o(),children:f.jsxs(lc,{children:[f.jsx(ac,{className:"qt-settings__overlay"}),f.jsxs(cc,{className:`qt-settings__content ${t?"is-expanded":""}`,onOpenAutoFocus:q=>q.preventDefault(),onPointerDownOutside:q=>{m6(q.target)&&q.preventDefault()},onInteractOutside:q=>{m6(q.target)&&q.preventDefault()},children:[f.jsxs("div",{className:"qt-settings__titlebar",children:[f.jsxs("div",{className:"qt-settings__brand",children:[f.jsx(Q8,{size:14,strokeWidth:1.6}),f.jsx(pd,{className:"qt-settings__brand-text",children:u("settings.title")})]}),f.jsx(uy,{className:"qt-sr-only",children:u("settings.subtitle")}),f.jsxs("div",{className:"qt-settings__titlebar-actions",children:[f.jsx("button",{type:"button",className:"qt-settings__icon-btn",onClick:a,"aria-label":u(t?"settings.action.shrink":"settings.action.expand"),title:u(t?"settings.action.shrink":"settings.action.expand"),children:t?f.jsx(Nk,{size:14,strokeWidth:1.6}):f.jsx(Lk,{size:14,strokeWidth:1.6})}),f.jsx(V4,{asChild:!0,children:f.jsx("button",{type:"button",className:"qt-settings__icon-btn","aria-label":u("common.close"),children:f.jsx(w0,{size:15,strokeWidth:1.6})})})]})]}),f.jsxs("div",{className:"qt-settings__body",children:[f.jsxs("div",{className:"qt-settings__search",children:[f.jsx(Ik,{size:13,strokeWidth:1.6}),f.jsx("input",{type:"text",value:i,onChange:q=>c(q.target.value),placeholder:u("settings.search.placeholder"),"aria-label":u("settings.search.placeholder"),autoFocus:!0}),i&&f.jsx("button",{type:"button",className:"qt-settings__search-clear",onClick:h,"aria-label":u("common.close"),children:f.jsx(w0,{size:15,strokeWidth:1.6})})]}),f.jsxs(By,{id:"qtype.settings-dialog",orientation:"horizontal",className:"qt-settings__group",children:[f.jsx(Af,{id:OL,defaultSize:"220px",minSize:"120px",className:"qt-settings__pane",children:f.jsx("div",{className:"qt-settings__card",children:f.jsx(DL,{activeTab:n,expandedGroups:r,onTabChange:s,onGroupToggle:l,matchCounts:g,searching:y})})}),f.jsx(Fy,{className:"qt-settings__separator"}),f.jsx(Af,{id:BL,minSize:"300px",className:"qt-settings__pane",children:f.jsx("div",{className:"qt-settings__card",children:f.jsx("div",{className:"qt-settings__content-scroll",children:y?f.jsx(NL,{query:i,matches:p,onPick:d}):HL(n)})})})]})]})]})]})})}function WL(){return typeof navigator>"u"?"browser":(navigator.language||"").toLowerCase().startsWith("zh")?"youdao":"google"}function mg(){const[e]=lA();return v.useMemo(()=>e!=="auto"?e:WL(),[e])}let Hh=null,y6=!1;function KL(){y6||(y6=!0,tg(()=>Promise.resolve({}),__vite__mapDeps([0])))}function $L(){return Hh||(KL(),Hh=tg(()=>import("./katex-C5jXJg4s.js"),[]).then(e=>({renderToString:e.default.renderToString}))),Hh}function GL(e){const[t,n]=v.useState(null);return v.useEffect(()=>{if(!e)return;let r=!1;return $L().then(i=>{r||n(i)}),()=>{r=!0}},[e]),t}const yg=v.createContext({svgs:{},ensureFile:()=>{}});function QL({children:e}){const[t,n]=v.useState({}),r=v.useRef(new Set),i=v.useRef(!1),o=v.useMemo(()=>l=>{if(r.current.has(l))return;r.current.add(l);const a=l.replace(/\.md$/,".mermaid.json");fetch(`/material/${a}`).then(c=>c.ok?c.json():null).then(c=>{if(!c||typeof c!="object"||(n(d=>({...d,...c})),i.current))return;i.current=!0;const h="qt-mermaid-css";document.getElementById(h)||fetch("/material/mermaid.css").then(d=>{d.ok&&d.text().then(u=>{const p=document.createElement("style");p.id=h,p.textContent=u,document.head.appendChild(p)})})}).catch(()=>{})},[]),s=v.useMemo(()=>({svgs:t,ensureFile:o}),[t,o]);return f.jsx(yg.Provider,{value:s,children:e})}function YL(){return v.useContext(yg).ensureFile}const ZL=/\$\$([\s\S]+?)\$\$/,XL=/\$([^$\n]+?)\$/,JL="/material";function eN(e){return/^(?:[a-z][a-z0-9+.-]*:|\/\/|\/)/i.test(e)?e:`${JL}/${e.replace(/^\.\//,"")}`}function Ag({source:e}){const{svgs:t}=v.useContext(yg),[n]=yA(),r=n&&(ZL.test(e)||XL.test(e)),i=GL(r),o=v.useMemo(()=>tN(e,t,n,i),[e,t,n,i]),s=v.useRef(null);return v.useEffect(()=>{if(!i||!s.current)return;s.current.querySelectorAll(".qt-md-math[data-math-pending], .qt-md-math-inline[data-math-pending]").forEach(a=>{const c=a.dataset.mathSrc;if(c===void 0)return;const h=a.classList.contains("qt-md-math");try{a.innerHTML=i.renderToString(c,{throwOnError:!1,displayMode:h})}catch{a.textContent=c}delete a.dataset.mathPending})},[i,o]),f.jsx("div",{ref:s,className:"qt-md",dangerouslySetInnerHTML:{__html:o}})}function tN(e,t,n,r){const i=x=>x.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">"),o=[],s=e.replace(/\$\$([\s\S]+?)\$\$/g,(x,V)=>{const k=o.length;return o.push(String(V).trim()),`
|
|
183
183
|
|
package/dist/view/index.html
CHANGED
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
<meta name="referrer" content="no-referrer" />
|
|
14
14
|
<link rel="icon" type="image/svg+xml" href="/qtype-mark.svg" />
|
|
15
15
|
<title>qtype — 打字复习</title>
|
|
16
|
-
<script type="module" crossorigin src="/assets/index-
|
|
17
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
16
|
+
<script type="module" crossorigin src="/assets/index-eEQRUOZD.js"></script>
|
|
17
|
+
<link rel="stylesheet" crossorigin href="/assets/index-B8531CqV.css">
|
|
18
18
|
</head>
|
|
19
19
|
<body>
|
|
20
20
|
<div id="root"></div>
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.qt-qi{position:relative;width:100%}.qt-qi__input{width:100%;height:var(--search-h);padding:0 var(--space-3);padding-right:2.4rem;border-radius:var(--radius);background:var(--qt-base);color:var(--qt-text);border:1px solid var(--qt-border);outline:none;font-family:inherit;font-size:var(--fs-ui);transition:border-color .12s ease}.qt-qi__input::placeholder{color:var(--qt-text-muted)}.qt-qi__input:focus{border-color:var(--qt-accent)}.qt-qi__kbd{position:absolute;right:8px;top:50%;transform:translateY(-50%);padding:.1em .5em;font-size:.72em;border-radius:3px;color:var(--qt-text-muted);background:var(--qt-mantle);border:1px solid var(--qt-border);font-family:var(--font-mono);pointer-events:none}.qt-qi__panel{position:absolute;top:calc(100% + 4px);left:0;right:0;max-height:60vh;overflow-y:auto;background:var(--qt-mantle);border:1px solid var(--qt-border);border-radius:var(--radius);box-shadow:0 12px 32px #00000052;padding:var(--space-1);z-index:40}.qt-qi__row{width:100%;display:flex;align-items:center;gap:10px;padding:8px 12px;min-height:var(--control-h);background:transparent;border:none;border-left:2px solid transparent;border-radius:4px;color:var(--qt-text);text-align:left;font-family:inherit;font-size:var(--fs-ui);cursor:pointer;transition:background .12s ease}.qt-qi__row.is-focused{background:var(--qt-surface-hover)}.qt-qi__row.is-active{border-left-color:var(--qt-accent);font-weight:600}.qt-qi__row.is-disabled{opacity:.5;cursor:not-allowed}.qt-qi__body{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.qt-qi__label{color:var(--qt-text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.qt-qi__detail{color:var(--qt-text-muted);font-size:var(--fs-caption);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.qt-qi__desc{color:var(--qt-text-muted);font-family:var(--font-mono);font-size:var(--fs-caption);flex-shrink:0}.qt-header{height:var(--header-h);display:grid;align-items:center;padding:0 max(var(--gutter),env(safe-area-inset-left));background:var(--qt-mantle);border-bottom:1px solid var(--qt-border);color:var(--qt-text);position:sticky;top:0;z-index:30}.qt-header--ml{grid-template-columns:minmax(0,1fr) minmax(clamp(120px,30vw,240px),2fr) minmax(0,1fr);gap:var(--space-2)}.qt-header--s{grid-template-columns:auto minmax(0,1fr) auto;gap:8px}.qt-brand{display:flex;align-items:center;gap:var(--space-2);background:transparent;border:none;padding:0;cursor:pointer;color:inherit;font-family:inherit;transition:color .12s ease}.qt-brand:hover .qt-brand__name{color:var(--qt-accent)}.qt-brand:focus-visible{outline:none}.qt-brand:focus-visible .qt-brand__name{color:var(--qt-accent)}.qt-brand__logo{display:block;width:28px;height:28px;flex-shrink:0}.qt-brand__name{font-size:var(--fs-title);font-weight:600;color:var(--qt-text);letter-spacing:.01em}.qt-header--s .qt-brand__name{display:none}.qt-header-search{width:100%}.qt-header-right{display:flex;align-items:center;gap:var(--space-2);justify-self:end}.qt-header-count{color:var(--qt-text-muted);font-family:var(--font-mono);font-size:var(--fs-caption)}.qt-header-stats{display:flex;align-items:center;gap:10px;justify-self:end}.qt-header-count-pct{color:var(--qt-green)}.qt-header-pct{color:var(--qt-green);font-family:var(--font-mono);font-size:var(--fs-caption);font-weight:600;min-width:2.8em;text-align:right}.qt-header-bar{width:90px;height:5px;background:var(--qt-border);border-radius:3px;overflow:hidden;flex-shrink:0}.qt-header-bar__fill{height:100%;width:var(--qt-progress, 0%);background:var(--qt-green);transition:width .22s ease}.qt-header{position:sticky;top:0;z-index:30}.qt-footer{position:relative;height:26px;display:flex;align-items:center;gap:var(--space-3);padding:0 max(var(--gutter),env(safe-area-inset-left));background:var(--qt-mantle);border-top:1px solid var(--qt-border);color:var(--qt-text-muted);font-size:var(--fs-caption);font-family:var(--font-ui)}.qt-footer__left{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.qt-footer__center{position:absolute;left:50%;transform:translate(-50%);display:flex;align-items:center;color:var(--qt-text-muted);font-family:var(--font-mono)}.qt-footer__right{display:flex;align-items:center;gap:4px;flex-shrink:0}.qt-footer__stat{width:22px;height:22px;padding:0;background:transparent;border:none;color:var(--qt-text-muted);font-size:.85rem;border-radius:4px;cursor:pointer;transition:background .12s ease,color .12s ease;display:inline-flex;align-items:center;justify-content:center}.qt-footer__icon{display:block;vertical-align:middle}.qt-footer__stat:hover:not(:disabled){background:color-mix(in srgb,var(--qt-text) 8%,transparent);color:var(--qt-text)}.qt-footer__stat:disabled{opacity:.4;cursor:not-allowed}.qt-footer__stat.is-off{opacity:.55}.qt-combobox{display:inline-flex;flex-direction:column;gap:var(--space-2);min-width:120px}.qt-combobox__trigger{display:inline-flex;align-items:center;justify-content:space-between;gap:8px;height:var(--control-h);padding:0 12px;min-width:120px;background:var(--qt-mantle);border:1px solid var(--qt-border);border-radius:var(--radius);color:var(--qt-text-muted);font-family:inherit;font-size:var(--fs-ui);cursor:pointer;transition:background .12s ease,border-color .12s ease,color .12s ease}.qt-combobox__trigger:hover{border-color:color-mix(in srgb,var(--qt-text) 20%,var(--qt-border))}.qt-combobox__trigger[data-state=open]{border-color:var(--qt-accent)}.qt-combobox__trigger.has-value{color:var(--qt-text)}.qt-combobox__label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.qt-combobox__chev{color:var(--qt-text-muted);flex-shrink:0}.qt-combobox__panel{min-width:var(--radix-popover-trigger-width);width:fit-content;max-width:min(360px,calc(100vw - 24px));background:var(--qt-mantle);border:1px solid var(--qt-border);border-radius:8px;box-shadow:0 8px 24px #00000040;overflow:hidden;z-index:60;animation:qt-combobox-in .1s ease-out}@keyframes qt-combobox-in{0%{opacity:0;transform:translateY(-2px)}to{opacity:1;transform:translateY(0)}}.qt-combobox__cmd{display:flex;flex-direction:column}.qt-combobox__searchwrap{padding:0 var(--space-3);border-bottom:1px solid var(--qt-border)}.qt-combobox__search{width:100%;height:32px;padding:0;background:transparent;border:none;color:var(--qt-text);font-family:inherit;font-size:13px;outline:none}.qt-combobox__search::placeholder{color:var(--qt-text-muted)}.qt-combobox__list{max-height:280px;overflow-y:auto;padding:4px 0}.qt-combobox__empty{padding:20px 12px;text-align:center;color:var(--qt-text-muted);font-size:12px}.qt-combobox__group [cmdk-group-heading]{padding:8px var(--space-3) 4px;color:var(--qt-text-muted);font-size:10.5px;font-weight:500;letter-spacing:.08em;text-transform:uppercase}.qt-combobox__item{display:flex;align-items:center;gap:8px;padding:6px var(--space-3);color:var(--qt-text);font-size:13px;cursor:pointer;-webkit-user-select:none;user-select:none}.qt-combobox__item[data-selected=true],.qt-combobox__item[aria-selected=true]{background:color-mix(in srgb,var(--qt-text) 6%,transparent)}.qt-combobox__check{width:14px;color:transparent;font-size:12px;flex-shrink:0;text-align:center}.qt-combobox__check.is-on{color:var(--qt-accent)}.qt-combobox__item-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.qt-combobox__footer{display:flex;align-items:center;justify-content:space-between;padding:6px var(--space-3);border-top:1px solid var(--qt-border);gap:8px}.qt-combobox__footer-count{color:var(--qt-text-muted);font-size:11.5px;font-family:var(--font-mono)}.qt-combobox__footer-clear{background:transparent;border:none;padding:2px 8px;color:var(--qt-text-muted);font-family:inherit;font-size:12px;cursor:pointer;border-radius:4px;transition:color .12s ease,background .12s ease}.qt-combobox__footer-clear:hover:not(:disabled){color:var(--qt-red, #f38ba8);background:color-mix(in srgb,var(--qt-text) 6%,transparent)}.qt-combobox__footer-clear:disabled{opacity:.4;cursor:not-allowed}.qt-combobox__chips{display:flex;flex-wrap:wrap;gap:6px}.qt-combobox__chip{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;background:color-mix(in srgb,var(--qt-accent) 14%,transparent);color:var(--qt-accent);border:1px solid transparent;border-radius:6px;font-size:11.5px;letter-spacing:.02em}.qt-combobox__chip-x{background:transparent;border:none;padding:0 2px;color:var(--qt-text-muted);font-size:14px;line-height:1;cursor:pointer;border-radius:3px}.qt-combobox__chip-x:hover{color:var(--qt-text);background:color-mix(in srgb,var(--qt-text) 8%,transparent)}.qt-toolbar{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);padding:0;position:relative;z-index:15}.qt-toolbar__filters{display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap}.qt-toolbar--selection{align-items:center;min-height:var(--control-h);gap:6px}.qt-selbar__count{flex:0 0 auto;color:var(--qt-text-muted);font-family:var(--font-mono);font-size:var(--fs-caption);padding:0 var(--space-2)}.qt-selbar__count b{color:var(--qt-accent);font-weight:600}.qt-selbar__spacer{flex:1}.qt-selbar__btn{background:transparent;border:1px solid var(--qt-border);color:var(--qt-text-muted);padding:0 12px;height:var(--control-h);border-radius:var(--radius);font-family:inherit;font-size:var(--fs-ui);cursor:pointer;transition:color .12s ease,border-color .12s ease,background .12s ease}.qt-selbar__btn:hover:not(:disabled){color:var(--qt-text);border-color:color-mix(in srgb,var(--qt-accent) 40%,var(--qt-border))}.qt-selbar__btn--danger:hover:not(:disabled){color:var(--qt-red);border-color:color-mix(in srgb,var(--qt-red) 50%,var(--qt-border));background:color-mix(in srgb,var(--qt-red) 10%,transparent)}.qt-selbar__btn:disabled{opacity:.4;cursor:not-allowed}.qt-right-stack{flex-shrink:0;display:flex;align-items:center;gap:6px;height:var(--control-h)}.qt-select-btn{display:inline-flex;align-items:center;justify-content:center;width:var(--icon-btn);height:var(--icon-btn);padding:0;background:transparent;border:1px solid var(--qt-border);border-radius:var(--radius);color:var(--qt-text-muted);cursor:pointer;transition:color .12s ease,border-color .12s ease,background .12s ease}.qt-select-btn:hover{color:var(--qt-accent);border-color:var(--qt-accent);background:var(--qt-surface-hover)}.qt-select-btn.is-active{color:var(--qt-accent);border-color:var(--qt-accent);background:color-mix(in srgb,var(--qt-accent) 12%,transparent)}.qt-chip-hidden-badge{display:inline-flex;align-items:center;height:var(--control-h);padding:0 8px;border-radius:9999px;background:color-mix(in srgb,var(--qt-accent) 18%,transparent);color:var(--qt-accent);font-family:var(--font-mono);font-size:var(--fs-caption);line-height:1;border:1px solid transparent;flex-shrink:0;-webkit-user-select:none;user-select:none}.qt-tag-clickcatcher{position:fixed;top:0;right:0;bottom:0;left:0;background:transparent;z-index:10}.qt-chips{flex:1;min-width:0;position:relative;transition:background .16s ease-out,box-shadow .16s ease-out,padding .16s ease-out,border-color .16s ease-out;border-radius:var(--radius);border:1px solid transparent;overflow:hidden}.qt-chips.is-expanded{z-index:20;overflow:visible}.qt-chips__row{display:flex;align-items:center;gap:6px;flex-wrap:nowrap;transition:flex-wrap 0s}.qt-chips__row.is-expanded{flex-wrap:wrap}.qt-chips__measure{position:absolute;visibility:hidden;pointer-events:none;top:0;left:0;width:max-content;max-width:none;display:flex;gap:6px;white-space:nowrap}.qt-chip{background:transparent;border:1px solid var(--qt-border);color:var(--qt-text-muted);padding:0 12px;height:var(--control-h);border-radius:9999px;font-family:inherit;font-size:var(--fs-ui);line-height:1;white-space:nowrap;cursor:pointer;transition:background .12s ease,color .12s ease,border-color .12s ease;display:inline-flex;align-items:center;gap:4px}.qt-chip__icon{flex-shrink:0;display:block}.qt-chip:hover{color:var(--qt-text);border-color:color-mix(in srgb,var(--qt-accent) 40%,var(--qt-border))}.qt-chip.is-active{background:color-mix(in srgb,var(--qt-accent) 18%,transparent);color:var(--qt-accent);border-color:var(--qt-accent)}.qt-chip--more{color:var(--qt-text-muted)}.qt-chip--more.is-open{color:var(--qt-text);border-color:var(--qt-accent);background:var(--qt-surface-hover)}.qt-chip--more.has-selected{color:var(--qt-accent);border-color:var(--qt-accent)}.qt-chip-more__badge{display:inline-flex;align-items:center;justify-content:center;min-width:16px;height:16px;padding:0 5px;border-radius:8px;background:var(--qt-accent);color:#fff;font-size:10px;font-family:var(--font-mono)}.qt-chip--reset{color:var(--qt-text-muted);padding:0 10px;gap:6px}.qt-chip--reset:hover{color:var(--qt-red);border-color:color-mix(in srgb,var(--qt-red) 50%,var(--qt-border));background:color-mix(in srgb,var(--qt-red) 10%,transparent)}.qt-viewtoggle{display:inline-flex;border:1px solid var(--qt-border);border-radius:var(--radius);overflow:hidden;flex-shrink:0;height:var(--control-h);align-self:center}.qt-viewtoggle button{display:inline-flex;align-items:center;justify-content:center;width:var(--icon-btn);height:100%;border:none;background:transparent;color:var(--qt-text-muted);padding:0;transition:background .12s ease,color .12s ease}.qt-viewtoggle button:hover{background:var(--qt-surface-hover);color:var(--qt-text)}.qt-viewtoggle button.is-active{background:var(--qt-surface-hover);color:var(--qt-accent)}.qt-shell{display:flex;flex-direction:column;height:100vh;height:100dvh;min-height:0;width:100%;color:var(--qt-text);background:var(--qt-base);padding-bottom:var(--qt-kbd-inset, 0px)}.qt-shell__header{flex:0 0 auto}.qt-shell__main{flex:1;min-height:0;min-width:0;display:flex;flex-direction:column;overflow:hidden}.qt-shell__footer{flex:0 0 auto}.qt-home-layout{display:flex;flex-direction:column;flex:1;min-height:0;padding:var(--space-3);gap:var(--space-3)}.qt-home-layout__toolbar,.qt-home-layout__breadcrumb{flex:0 0 auto}.qt-home-layout__content{flex:1;min-height:0;overflow-y:auto;padding-top:2px}.qt-home-layout__content::-webkit-scrollbar{width:10px}.qt-home-layout__content::-webkit-scrollbar-thumb{background:transparent;border-radius:5px;border:2px solid transparent;background-clip:content-box;transition:background .12s ease}.qt-home-layout__content:hover::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--qt-border) 70%,transparent);background-clip:content-box}.qt-home-layout__content::-webkit-scrollbar-thumb:hover{background:color-mix(in srgb,var(--qt-border) 100%,transparent);background-clip:content-box}.qt-breadcrumb{display:flex;align-items:center;flex-wrap:wrap;gap:4px;padding:var(--space-2) var(--space-3);font-size:var(--fs-caption)}.qt-breadcrumb__crumb{background:transparent;border:none;padding:2px 6px;border-radius:4px;color:var(--qt-text-muted);font-family:inherit;font-size:inherit;cursor:pointer;transition:color .12s ease,background .12s ease}.qt-breadcrumb__crumb:hover{color:var(--qt-text);background:color-mix(in srgb,var(--qt-text) 6%,transparent)}.qt-breadcrumb__crumb.is-current{color:var(--qt-text);cursor:default;font-weight:500}.qt-breadcrumb__sep{color:var(--qt-text-muted);opacity:.5;-webkit-user-select:none;user-select:none}.qt-breadcrumb__group{display:inline-flex;align-items:center;gap:4px}.qt-completion-stamp{position:absolute;top:24px;right:32px;transform:rotate(-6deg);transform-origin:center;z-index:6;color:var(--stamp-color);line-height:0;animation:qt-completion-stamp-in .25s cubic-bezier(.34,1.56,.64,1);pointer-events:none;-webkit-user-select:none;user-select:none}.qt-completion-stamp--pass{--stamp-color: var(--qt-green)}.qt-completion-stamp--fail{--stamp-color: var(--qt-red)}@keyframes qt-completion-stamp-in{0%{opacity:0;transform:rotate(-30deg) scale(1.8)}to{opacity:1;transform:rotate(-6deg) scale(1)}}.qt-tlayout{display:flex;flex-direction:column;flex:1;min-height:0}.qt-tlayout__top,.qt-tlayout__bottom{padding:var(--space-3);display:flex;justify-content:center;flex-shrink:0}.qt-tlayout__top{position:relative;z-index:5;isolation:isolate}.qt-tlayout__middle{flex:1;min-height:0;display:grid;grid-template-columns:minmax(0,1fr) minmax(0,3fr) minmax(0,1fr);gap:var(--space-3);padding:0 3%;position:relative}@media (max-width: 1100px){.qt-tlayout__middle{grid-template-columns:0 minmax(0,1fr) 0;gap:0;padding:0 var(--space-3)}}.qt-tlayout__stage{position:relative;min-height:0;display:flex;flex-direction:column;overflow:hidden}.qt-tlayout__mask{position:absolute;top:0;right:0;bottom:0;left:0;display:none;align-items:center;justify-content:center;background:color-mix(in srgb,var(--qt-base) 25%,transparent);z-index:5;cursor:pointer;pointer-events:none;animation:qt-tlayout-mask-in .16s ease;border:0;padding:0;color:inherit;font:inherit;text-align:inherit}.qt-tlayout__mask:focus-visible{outline:2px solid var(--qt-accent);outline-offset:-4px}.qt-tlayout__middle:has(.qt-typing-arena.is-paused)>.qt-tlayout__stage{filter:blur(2px);transition:filter .12s ease}.qt-tlayout__middle:has(.qt-typing-arena.is-paused)>.qt-tlayout__aside{visibility:hidden}.qt-tlayout__middle:has(.qt-typing-arena.is-paused)>.qt-tlayout__mask{display:flex;pointer-events:auto;cursor:pointer}.qt-tlayout__middle:has(.qt-typing-arena.is-paused)>.qt-tlayout__mask:hover{background:color-mix(in srgb,var(--qt-base) 20%,transparent)}.qt-tlayout__middle:has(.qt-typing-arena.is-paused)>.qt-tlayout__mask:active{background:color-mix(in srgb,var(--qt-base) 15%,transparent)}.qt-tlayout__mask-tip{color:var(--qt-text-muted);font-size:1.5rem;font-weight:500;display:inline-flex;align-items:center;gap:12px}.qt-tlayout__mask-icon{color:var(--qt-accent);flex-shrink:0;animation:qt-tlayout-mask-icon-pulse 1.6s ease-in-out infinite}@keyframes qt-tlayout-mask-icon-pulse{0%,to{transform:translateY(0) scale(1);opacity:1}50%{transform:translateY(-1px) scale(1.06);opacity:.85}}.qt-tlayout__mask-kbd{display:inline-flex;align-items:center;min-width:60px;height:32px;padding:0 12px;font-family:var(--font-mono);font-size:15px;font-weight:600;color:var(--qt-text);background:color-mix(in srgb,var(--qt-base) 60%,transparent);border:1px solid color-mix(in srgb,var(--qt-text) 14%,transparent);border-bottom-width:2px;border-radius:6px;justify-content:center}@keyframes qt-tlayout-mask-in{0%{opacity:0}to{opacity:1}}.qt-tlayout__advance-pill{position:absolute;left:50%;top:100%;transform:translate(-50%,8px);padding:8px 18px;font-family:var(--font-body);font-size:14px;font-weight:500;color:var(--qt-text);background:color-mix(in srgb,var(--qt-base) 96%,transparent);border:1px solid color-mix(in srgb,var(--qt-text) 18%,transparent);border-radius:999px;z-index:4;box-shadow:0 4px 14px color-mix(in srgb,var(--qt-text) 14%,transparent);animation:qt-tlayout-pill-in .22s cubic-bezier(.2,.8,.2,1);white-space:nowrap;pointer-events:none;-webkit-user-select:none;user-select:none}@keyframes qt-tlayout-pill-in{0%{opacity:0;transform:translate(-50%,-4px)}to{opacity:1;transform:translate(-50%,8px)}}.qt-setting-row{padding:var(--space-4) 0}.qt-setting-row.has-divider{border-top:1px solid var(--qt-border)}.qt-setting-row.has-divider:first-child{border-top:none;padding-top:0}.qt-setting-row__title{font-size:var(--fs-body);color:var(--qt-text);font-weight:500;line-height:1.4;letter-spacing:.01em}.qt-setting-row__desc{color:var(--qt-text-muted);font-size:var(--fs-caption);margin-top:6px;line-height:1.6}.qt-setting-row__control{margin-top:12px;display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap}.qt-setting-btn{padding:6px 14px;background:var(--qt-mantle);border:1px solid color-mix(in srgb,var(--qt-text) 12%,transparent);border-radius:6px;color:var(--qt-text);font-size:13px;cursor:pointer}.qt-setting-btn:hover{background:color-mix(in srgb,var(--qt-text) 8%,var(--qt-mantle))}.qt-setting-range{flex:1;min-width:100px;max-width:180px;accent-color:var(--qt-accent)}.qt-setting-range:disabled{opacity:.4}.qt-setting-range-value{min-width:32px;text-align:right;font-family:var(--font-mono);font-size:12px;color:var(--qt-text-muted)}.qt-setting-row.is-revealed{animation:qt-setting-row-pulse 1.6s ease-out;border-radius:6px}@keyframes qt-setting-row-pulse{0%{background:color-mix(in srgb,var(--qt-accent) 22%,transparent)}to{background:transparent}}.qt-segmented{display:inline-flex;border:1px solid var(--qt-border);border-radius:var(--radius);overflow:hidden;background:var(--qt-base)}.qt-segmented__btn{background:transparent;border:none;color:var(--qt-text-muted);padding:0 var(--space-3);height:28px;font-family:inherit;font-size:var(--fs-ui);cursor:pointer;transition:background .12s ease,color .12s ease}.qt-segmented__btn:hover{color:var(--qt-text);background:var(--qt-surface-hover)}.qt-segmented__btn.is-active{background:var(--qt-accent);color:#fff}.qt-switch{display:inline-flex;align-items:center;gap:8px;background:transparent;border:none;padding:0;cursor:pointer;color:var(--qt-text-muted);font-family:inherit;font-size:var(--fs-ui)}.qt-switch__track{position:relative;width:34px;height:20px;border-radius:10px;background:var(--qt-border);transition:background .16s ease}.qt-switch__thumb{position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;background:#fff;transition:transform .16s ease}.qt-switch.is-on .qt-switch__track{background:var(--qt-accent)}.qt-switch.is-on .qt-switch__thumb{transform:translate(14px)}.qt-switch.is-on{color:var(--qt-text)}.qt-panel-header{padding-bottom:var(--space-4);border-bottom:1px solid var(--qt-border);margin-bottom:var(--space-5)}.qt-panel-header__title{font-size:1.35rem;font-weight:600;color:var(--qt-text);margin:0;letter-spacing:.02em}.qt-panel-header__sub{margin:6px 0 0;color:var(--qt-text-muted);font-size:var(--fs-caption);line-height:1.5}.qt-toast-stack{position:fixed;left:50%;bottom:32px;transform:translate(-50%);z-index:300;display:flex;flex-direction:column;align-items:center;gap:8px;pointer-events:none}.qt-toast{padding:8px 16px;min-width:120px;max-width:min(90vw,460px);border-radius:8px;font-size:13px;font-family:inherit;color:var(--qt-text);background:var(--qt-mantle);border:1px solid color-mix(in srgb,var(--qt-text) 14%,transparent);box-shadow:0 8px 24px #00000059;text-align:center;pointer-events:auto;opacity:0;transform:translateY(6px);transition:opacity .16s ease,transform .16s ease}.qt-toast.is-in{opacity:1;transform:translateY(0)}.qt-toast.is-out{opacity:0;transform:translateY(-4px)}.qt-toast--success{border-color:color-mix(in srgb,var(--qt-accent) 40%,transparent);color:var(--qt-accent)}.qt-toast--warn{border-color:color-mix(in srgb,var(--qt-yellow, #f9e2af) 60%,transparent);color:var(--qt-yellow, #f9e2af)}.qt-toast--error{border-color:color-mix(in srgb,var(--qt-red, #f38ba8) 60%,transparent);color:var(--qt-red, #f38ba8)}.qt-caret{position:absolute;left:0;top:0;width:2px;height:1.4em;background:var(--qt-accent);border-radius:1px;pointer-events:none;z-index:3;animation:qt-caret-blink .9s steps(2,start) infinite;will-change:transform,height}.qt-caret.is-paused{animation:none;opacity:0}.qt-caret.is-hidden{display:none!important}.qt-caret--shadow{background:var(--qt-text-muted);opacity:.4;animation:none}@keyframes qt-caret-blink{to{opacity:0}}.qt-char{position:relative;transition:color 80ms ease,background 80ms ease}.qt-char.is-hit{color:var(--qt-green)}.qt-char.is-miss{color:var(--qt-red)}.qt-char__placeholder{color:var(--qt-text-muted);opacity:.55}.qt-char-icon{display:inline-block;width:.9em;height:.9em;vertical-align:-.1em;color:inherit;opacity:.55}.qt-char.is-hit .qt-char-icon{opacity:.7}.qt-char.is-miss .qt-char-icon{opacity:1}.qt-char-icon--enter{margin-right:2px}.qt-char.is-newline{position:relative;display:inline}.qt-char.is-newline .qt-char-icon--enter{position:absolute;left:0;top:50%;transform:translateY(-50%);margin-right:0;pointer-events:none}.qt-char.is-newline:after{content:"\a";white-space:pre}.qt-char-dot{opacity:.55}.qt-char.is-hit .qt-char-dot{opacity:.7}.qt-char.is-miss .qt-char-dot{opacity:1}.qt-typing-arena{position:relative;padding:0;cursor:text;display:flex;flex-direction:column;flex:1;min-height:0}.qt-typing-arena.is-shaking{animation:qt-arena-shake .3s cubic-bezier(.36,.07,.19,.97)}@keyframes qt-arena-shake{10%,90%{transform:translate(-2px)}20%,80%{transform:translate(4px)}30%,50%,70%{transform:translate(-6px)}40%,60%{transform:translate(6px)}}.qt-typing-arena__text{font-family:var(--font-mono);font-size:var(--qt-typing-font-size, 1.05rem);letter-spacing:var(--qt-typing-letter-spacing, 0);line-height:1.85;white-space:pre-wrap;word-break:var(--qt-typing-word-break, break-word);min-height:0;padding:24px 32px;overflow-y:auto;flex:1;color:var(--qt-text);position:relative;z-index:1;transition:filter .16s ease}.qt-typing-arena__text.is-blind .qt-char:not(.is-hit):not(.is-miss):not(.is-recover):not(.is-cursor){color:transparent}.qt-typing-arena__text.is-blind .qt-char.is-cursor:not(.is-hit):not(.is-miss){color:var(--qt-text-muted)}.qt-typing-arena__text.is-ghost .qt-char:not(.is-hit):not(.is-miss){color:var(--qt-text-muted);opacity:.35}.qt-shadow-marker{display:inline-block;width:0;height:1em;vertical-align:baseline}.qt-char.is-eof{display:inline-block;width:0}.qt-typing-arena__editor{position:absolute;width:1px;z-index:2;padding:0;border:0;margin:0;outline:none;background:transparent;color:transparent;caret-color:transparent;font-family:var(--font-mono);font-size:1.05rem;line-height:1.85;white-space:pre;opacity:0}.qt-typing-arena__preedit{position:absolute;z-index:3;padding:3px 8px;font-family:var(--font-mono);font-size:.85rem;line-height:1.2;color:var(--qt-accent);background:var(--qt-mantle);border:1px solid color-mix(in srgb,var(--qt-accent) 40%,transparent);border-radius:999px;box-shadow:0 4px 12px color-mix(in srgb,var(--qt-accent) 30%,transparent);pointer-events:none;white-space:pre;transform:translateY(calc(-100% - 4px))}.qt-typing-arena__preedit-ch{color:inherit}.qt-typing-arena__preedit-ch.is-wrong{color:var(--qt-red, #e5484d)}.qt-typing-arena.is-paused{-webkit-user-select:none;user-select:none}.qt-typing-arena.is-cursor-idle,.qt-typing-arena.is-cursor-idle *{cursor:none}.qt-hud-more{background:var(--qt-mantle);border-radius:10px;box-shadow:0 10px 30px #00000047,0 0 0 1px color-mix(in srgb,var(--qt-text) 6%,transparent);padding:4px;outline:none;z-index:60;display:flex;flex-direction:column;gap:1px}.qt-hud-more__item{display:flex;align-items:center;gap:10px;width:100%;padding:8px 10px;background:transparent;border:none;border-radius:6px;cursor:pointer;color:var(--qt-text);font-size:var(--fs-ui);font-family:inherit;text-align:left;transition:background .12s ease,color .12s ease}.qt-hud-more__item:hover:not(:disabled){background:var(--qt-surface-hover)}.qt-hud-more__item:disabled{opacity:.4;cursor:not-allowed}.qt-hud-more__item:focus-visible{outline:none;box-shadow:0 0 0 2px color-mix(in srgb,var(--qt-accent) 55%,transparent)}.qt-hud-more__item.is-on .qt-hud-more__icon{color:var(--qt-accent)}.qt-hud-more__icon{display:inline-flex;align-items:center;justify-content:center;color:var(--qt-text-muted)}.qt-hud-more__label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.qt-hud-more__kbd{color:var(--qt-text-muted);font-size:var(--fs-caption);font-family:var(--font-mono);letter-spacing:.03em;white-space:nowrap;padding:1px 6px;border-radius:4px;background:color-mix(in srgb,var(--qt-text) 6%,transparent)}.qt-hud-more__check{margin-left:auto;display:inline-flex;align-items:center;justify-content:center;width:16px;color:var(--qt-accent);flex-shrink:0}.qt-hud{display:flex;flex-direction:column;align-items:center;width:100%;color:var(--qt-text-muted);font-family:var(--font-mono);font-size:var(--fs-caption);-webkit-user-select:none;user-select:none;pointer-events:none}.qt-hud>*{pointer-events:auto}.qt-hud__bar{display:flex;align-items:center;justify-content:center;gap:6px;flex-wrap:wrap;max-width:100%}.qt-hud-btn--pause.is-running{color:var(--qt-green)}.qt-hud-btn--pause.is-paused{color:var(--qt-accent);animation:qt-hud-pulse 1.4s ease-in-out infinite}@keyframes qt-hud-pulse{0%,to{opacity:1}50%{opacity:.55}}.qt-hud-item{color:var(--qt-text-muted);display:inline-flex;align-items:center;gap:4px;padding:0 6px;height:24px;box-sizing:border-box}.qt-hud-item b{color:var(--qt-text);font-weight:600}.qt-hud-item--warn,.qt-hud-item--warn b{color:var(--qt-danger, #e5484d)}.qt-hud-unit{color:var(--qt-text-muted);font-size:10px;margin-left:3px;letter-spacing:.03em}.qt-hud-icon{color:var(--qt-text-muted);flex-shrink:0}.qt-hud-sep{display:none}.qt-hud-btn{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;background:transparent;border:none;color:var(--qt-text-muted);border-radius:4px;cursor:pointer;outline:none;transition:color .12s ease,background .12s ease}.qt-hud-btn:focus-visible{box-shadow:0 0 0 2px color-mix(in srgb,var(--qt-accent) 60%,transparent)}.qt-hud-btn:hover:not(:disabled){color:var(--qt-accent);background:color-mix(in srgb,var(--qt-text) 8%,transparent)}.qt-hud-btn.is-on{color:var(--qt-accent)}.qt-hud-btn.is-off{opacity:.5}.qt-hud-btn:disabled{opacity:.3;cursor:not-allowed}.qt-tk{--qt-tk-user-scale: 1.3;--qt-tk-native-w: 454px;--qt-tk-native-h: 170px;--qt-tk-fit-scale: calc((100vw - 32px) / var(--qt-tk-native-w));--qt-tk-scale: min(var(--qt-tk-user-scale), var(--qt-tk-fit-scale));width:calc(var(--qt-tk-native-w) * var(--qt-tk-scale));height:calc(var(--qt-tk-native-h) * var(--qt-tk-scale));display:flex;justify-content:center;-webkit-user-select:none;user-select:none;pointer-events:none;font-family:var(--font-mono)}.qt-tk__stage{position:relative;width:var(--qt-tk-native-w);display:flex;flex-direction:column;padding:10px;box-sizing:border-box;transform:scale(var(--qt-tk-scale));transform-origin:top center}.qt-tk__row{display:flex;justify-content:space-between}.qt-tk__row.is-space-row{justify-content:flex-start}.qt-tk__key{position:relative;width:28px;height:28px;margin:1px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px;box-sizing:border-box;border:1px solid color-mix(in srgb,var(--qt-text) 6%,transparent);border-radius:5px 5px 7px 7px;background:color-mix(in srgb,var(--qt-mantle) 55%,transparent);backdrop-filter:blur(12px) saturate(1.4);-webkit-backdrop-filter:blur(12px) saturate(1.4);box-shadow:0 1px color-mix(in srgb,var(--qt-text) 10%,transparent) inset,0 2px 6px #0000002e,0 1px 2px #0000001a;color:var(--qt-text);opacity:.85;font-size:13px;font-weight:500;transition:background .2s ease,color .2s ease,border-color .2s ease,opacity .2s ease,transform .12s ease}.qt-tk__key.is-tab{width:42px;font-size:10px}.qt-tk__key.is-caps,.qt-tk__key.is-enter{width:49px;font-size:10px}.qt-tk__key.is-lshift,.qt-tk__key.is-rshift{width:63px;font-size:10px}.qt-tk__key.is-backspace{width:42px;font-size:10px}.qt-tk__key.is-space{width:140px;font-size:10px}.qt-tk__key.is-bump:after{content:"";position:absolute;bottom:3px;left:50%;transform:translate(-50%);width:8px;height:2px;background:currentColor;opacity:.6;border-radius:1px}.qt-tk__key-sub{font-size:9px;opacity:.7;line-height:1}.qt-tk__key-main{line-height:1}.qt-tk__key.is-next{background:transparent;color:var(--qt-accent);border-color:var(--qt-accent);border-width:2px;opacity:1}.qt-tk__key.is-shift-hint{background:transparent;color:var(--qt-accent);border-color:var(--qt-accent);opacity:.9}.qt-tk__key.is-wrong{background:transparent;color:var(--qt-red, #e5484d);border-color:var(--qt-red, #e5484d);border-width:2px;opacity:1}.qt-tk__hand{color:var(--qt-text);opacity:.75;pointer-events:none;z-index:2}.qt-tk__hand svg{width:100%;height:100%;display:block}.qt-tk__hand.is-interactive{pointer-events:auto;cursor:grab;touch-action:none}.qt-tk__hand.is-interactive:active{cursor:grabbing}.qt-tk__hand.is-interactive svg{pointer-events:none}.qt-tk__row{position:relative;z-index:1}@media (max-width: 640px){.qt-tk{display:none}}.qt-cardnav{display:inline-flex;align-items:center;gap:8px;max-width:500px;color:inherit;-webkit-user-select:none;user-select:none;line-height:1}.qt-cardnav__btn{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;padding:0;border:none;border-radius:3px;background:transparent;color:inherit;cursor:pointer;transition:background .12s ease,color .12s ease}.qt-cardnav__btn:hover:not(:disabled){background:color-mix(in srgb,var(--qt-text) 12%,transparent);color:var(--qt-text)}.qt-cardnav__btn:disabled{opacity:.3;cursor:not-allowed}.qt-cardnav__dots{display:inline-flex;align-items:center;gap:4px}.qt-cardnav__dot{width:7px;height:7px;padding:0;border:1px solid currentColor;border-radius:50%;background:transparent;opacity:.4;cursor:pointer;transition:opacity .12s ease,background .12s ease,transform .12s ease,box-shadow .12s ease}.qt-cardnav__dot:hover{opacity:.75}.qt-cardnav__dot.is-done{background:currentColor;border-color:transparent;opacity:.85}.qt-cardnav__dot.is-current{opacity:1;box-shadow:0 0 0 1.5px var(--qt-accent, var(--qt-green));transform:scale(1.2)}.qt-cardnav__dot.is-current.is-done{background:var(--qt-accent, var(--qt-green))}.qt-cardnav__track{position:relative;flex:1 1 auto;min-width:100px;height:3px;border-radius:2px;background:currentColor;opacity:.22}.qt-cardnav__track-fill{position:absolute;left:0;top:0;bottom:0;border-radius:2px;background:currentColor;opacity:.75}.qt-cardnav__track-cursor{position:absolute;top:50%;width:6px;height:6px;margin-left:-3px;margin-top:-3px;border-radius:50%;background:var(--qt-accent, var(--qt-green))}.qt-cardnav__frac{font-family:var(--font-mono, ui-monospace, monospace);font-size:var(--fs-caption);min-width:3.5em;text-align:center;color:inherit;opacity:.8;display:inline-flex;align-items:center;justify-content:center;gap:2px}.qt-cardnav__sep{opacity:.4;margin:0 1px}.qt-cardnav__jump-btn{padding:0 2px;border:none;background:transparent;color:inherit;font:inherit;cursor:pointer;border-radius:3px}.qt-cardnav__jump-btn:hover{background:color-mix(in srgb,var(--qt-text) 12%,transparent);color:var(--qt-text)}.qt-cardnav__jump{width:2.4em;padding:0 2px;border:1px solid var(--qt-mauve, currentColor);border-radius:3px;background:transparent;color:var(--qt-text);font:inherit;text-align:center;outline:none}.qt-cardnav__frac--editing{opacity:1}.qt-carousel{position:relative;width:100%;flex:1;min-height:0;display:flex;justify-content:center;align-items:stretch;overflow:hidden}.qt-carousel__current{position:relative;z-index:5;width:100%;max-width:800px;display:flex;flex-direction:column;min-height:0}.qt-tooltip{background:var(--qt-mantle);color:var(--qt-text);border:1px solid var(--qt-border);border-radius:6px;padding:6px 10px;font-size:var(--fs-caption);font-family:var(--font-body);box-shadow:0 4px 16px #0003;z-index:100;animation:qt-tooltip-in .1s ease-out}.qt-tooltip__arrow{fill:var(--qt-mantle)}@keyframes qt-tooltip-in{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}.qt-question{min-width:0;overflow:hidden}.qt-question__title{color:var(--qt-text);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.qt-question__subtitle{margin-top:4px;color:var(--qt-text-muted);font-size:.85em;line-height:1.4;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.qt-neighbor{display:grid;grid-template-columns:auto minmax(0,1fr);align-items:start;gap:10px;box-sizing:border-box;width:100%;max-height:60vh;overflow:hidden;padding:0;background:transparent;border:0;cursor:pointer;font-family:var(--font-mono);font-size:.9rem;color:var(--qt-text-muted);text-align:left;opacity:.55;transition:opacity .14s ease,transform .14s ease}.qt-neighbor:hover{opacity:1}.qt-neighbor:active{transform:scale(.98)}.qt-neighbor--next{grid-template-columns:minmax(0,1fr) auto;text-align:right}.qt-neighbor__arrow{flex-shrink:0;color:var(--qt-text-muted);transition:color .14s ease}.qt-neighbor:hover .qt-neighbor__arrow{color:var(--qt-accent)}.qt-cardbase{flex:1;min-height:0;display:flex;flex-direction:column;padding:var(--space-3);gap:var(--space-2)}.qt-cardbase__prompt{color:var(--qt-text-muted);font-size:.95rem;line-height:1.5}.qt-cardbase__arena{flex:1;min-height:0;min-width:0;display:flex;flex-direction:column}.qt-speak{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;background:transparent;border:none;color:var(--qt-text-muted);cursor:pointer;transition:color .12s ease}.qt-speak:hover{color:var(--qt-accent)}.qt-card{position:relative;width:100%;height:100%;padding:var(--space-3);overflow-y:auto;min-height:0;display:flex}.qt-card--centered{align-items:safe center;justify-content:safe center}.qt-card--flow{flex-direction:column}.qt-card__stack{display:flex;flex-direction:column;gap:var(--space-3);width:100%;max-width:900px;margin:0 auto}.qt-card--flow .qt-card__stack{flex:1;min-height:0}.qt-card--centered .qt-card__stack{align-items:center}.qt-card__slot{width:100%}.qt-card__title{font-size:1.3rem;font-weight:600;color:var(--qt-text);text-align:center;flex-shrink:0;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;word-break:break-word}.qt-card__phonetic{font-family:var(--font-mono);font-size:1rem;color:var(--qt-text-muted);text-align:center;letter-spacing:.02em}.qt-card__question{color:var(--qt-text-muted);font-size:.95rem;line-height:1.6;max-height:30vh;overflow-y:auto;flex-shrink:0}.qt-card__question img{max-width:min(100%,480px);height:auto;display:block;margin:var(--space-3) auto}.qt-card__arena{min-height:0;min-width:0;display:flex;flex-direction:column}.qt-card--flow .qt-card__arena{flex:1}.qt-card__arena .qt-typing-arena__text{padding:0}.qt-card__gloss{font-size:1rem;color:var(--qt-text);text-align:center;line-height:1.5}.qt-card__image{margin:0 auto;text-align:center}.qt-card__image img{max-width:100%;height:auto;display:inline-block;margin:0 auto}.qt-card__image .qt-md,.qt-card__image .qt-md p{margin:0}.qt-card--word .qt-card__stack{max-width:720px}.qt-card--word .qt-card__arena .qt-typing-arena__text{font-size:3rem;font-weight:500;letter-spacing:.05em;text-align:center}.qt-card--word .qt-card__image{width:120px;opacity:.85}.qt-card--sentence .qt-card__image{width:140px;opacity:.85}.qt-card--article .qt-card__image{width:260px;opacity:.9}.qt-card--snippet .qt-card__image{width:200px;opacity:.9}.qt-card--sentence .qt-card__arena .qt-typing-arena__text{font-size:1.6rem;line-height:1.6;text-align:center}.qt-card--snippet .qt-card__stack{max-width:720px}.qt-card--snippet .qt-card__title{font-size:1.15rem;font-weight:500;color:var(--qt-text-muted);letter-spacing:.05em}.qt-card--snippet .qt-card__arena .qt-typing-arena__text{font-size:1.4rem;line-height:2;text-align:center;letter-spacing:.03em}.qt-card--article .qt-card__arena .qt-typing-arena__text{font-size:1.15rem;line-height:1.7}.qt-card--qa .qt-card__arena .qt-typing-arena__text{font-size:1.1rem;line-height:1.7}.qt-card--code .qt-card__stack{font-family:var(--font-mono)}.qt-card--code .qt-card__title{font-size:1.15rem}.qt-card--code .qt-card__question pre,.qt-card--code .qt-card__question code{font-family:var(--font-mono);font-size:.85rem}.qt-card--code .qt-card__question{font-size:.9rem;line-height:1.5}.qt-card--code .qt-card__arena .qt-typing-arena__text{font-family:var(--font-mono);white-space:pre-wrap;text-align:left}.qt-word__arena-wrap{position:relative;width:fit-content;margin:0 auto}.qt-word__speak{position:absolute;left:100%;top:50%;transform:translateY(-50%);margin-left:8px;display:flex;align-items:center;justify-content:center}.qt-sentence__arena-wrap{position:relative;width:fit-content;max-width:100%;margin:0 auto}.qt-sentence__speak{position:absolute;left:100%;top:50%;transform:translateY(-50%);margin-left:8px;display:flex;align-items:center}.qt-confirm__overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#0000008c;z-index:200;animation:qt-confirm-fade .12s ease}.qt-confirm__content{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:201;width:min(420px,calc(100vw - 32px));background:var(--qt-base);border:1px solid color-mix(in srgb,var(--qt-text) 12%,transparent);border-radius:12px;box-shadow:0 24px 60px #00000073;padding:20px 22px 16px;animation:qt-confirm-pop .14s ease}@keyframes qt-confirm-fade{0%{opacity:0}to{opacity:1}}@keyframes qt-confirm-pop{0%{opacity:0;transform:translate(-50%,-48%)}to{opacity:1;transform:translate(-50%,-50%)}}.qt-confirm__title{font-size:15px;font-weight:600;color:var(--qt-text);margin:0 0 10px}.qt-confirm__message{color:var(--qt-text);font-size:13.5px;line-height:1.55;margin:0 0 18px;word-break:break-word}.qt-confirm__actions{display:flex;justify-content:flex-end;gap:8px}.qt-confirm__btn{padding:6px 16px;background:var(--qt-mantle);border:1px solid color-mix(in srgb,var(--qt-text) 12%,transparent);border-radius:6px;color:var(--qt-text);font-size:13px;cursor:pointer;font-family:inherit;min-width:64px}.qt-confirm__btn:hover{background:color-mix(in srgb,var(--qt-text) 8%,var(--qt-mantle))}.qt-confirm__btn:focus-visible{outline:2px solid var(--qt-accent);outline-offset:1px}.qt-confirm__btn--primary{background:var(--qt-accent);color:var(--qt-base);border-color:var(--qt-accent)}.qt-confirm__btn--primary:hover{filter:brightness(1.05)}.qt-confirm__btn--danger{background:var(--qt-red, #f38ba8);border-color:var(--qt-red, #f38ba8);color:var(--qt-base)}.qt-confirm__btn--danger:hover{filter:brightness(1.05)}.qt-danger-btn{background:transparent;border:1px solid var(--qt-border);color:var(--qt-text-muted);padding:0 var(--space-3);height:28px;border-radius:var(--radius);font-family:inherit;font-size:var(--fs-ui);cursor:pointer;transition:color .12s ease,border-color .12s ease,background .12s ease}.qt-danger-btn:hover:not(:disabled){color:var(--qt-red);border-color:color-mix(in srgb,var(--qt-red) 50%,var(--qt-border));background:color-mix(in srgb,var(--qt-red) 10%,transparent)}.qt-danger-btn:disabled{opacity:.4;cursor:not-allowed}.qt-kcal__overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#0000008c;z-index:100;animation:qt-kcal-fade .12s ease}.qt-kcal__content{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:101;display:flex;flex-direction:column;width:min(880px,calc(100vw - 32px));max-height:calc(100dvh - 32px);background:var(--qt-base);border:1px solid color-mix(in srgb,var(--qt-text) 12%,transparent);border-radius:12px;box-shadow:0 24px 60px #00000073;overflow:hidden;animation:qt-kcal-pop .14s ease}@keyframes qt-kcal-fade{0%{opacity:0}to{opacity:1}}@keyframes qt-kcal-pop{0%{opacity:0;transform:translate(-50%,-48%)}to{opacity:1;transform:translate(-50%,-50%)}}.qt-kcal__header{display:flex;align-items:center;gap:16px;padding:12px 16px;border-bottom:1px solid color-mix(in srgb,var(--qt-text) 10%,transparent)}.qt-kcal__title{font-size:15px;font-weight:600;color:var(--qt-text);margin:0}.qt-kcal__hint{flex:1;color:var(--qt-text-muted);font-size:12px}.qt-kcal__close{background:transparent;border:0;color:var(--qt-text-muted);font-size:20px;line-height:1;cursor:pointer;padding:4px 8px}.qt-kcal__close:hover{color:var(--qt-text)}.qt-kcal__body{display:flex;flex-direction:column;gap:16px;padding:20px 24px;min-height:0;overflow:auto}.qt-kcal__nav{display:flex;align-items:center;gap:12px}.qt-kcal__pose-label{flex:1;display:flex;align-items:baseline;justify-content:center;gap:12px}.qt-kcal__pose-side{color:var(--qt-text-muted);font-size:13px}.qt-kcal__pose-name{color:var(--qt-accent);font-size:22px;font-weight:600;font-family:var(--font-mono)}.qt-kcal__pose-idx{color:var(--qt-text-muted);font-size:12px;font-family:var(--font-mono)}.qt-kcal__stage{display:flex;justify-content:center;padding:8px;background:color-mix(in srgb,var(--qt-text) 3%,transparent);border-radius:8px;overflow:hidden;position:relative;z-index:0}.qt-kcal__nav,.qt-kcal__actions,.qt-kcal__coords{position:relative;z-index:1}.qt-kcal__coords{display:flex;align-items:center;gap:16px;padding:8px 12px;background:color-mix(in srgb,var(--qt-text) 5%,transparent);border-radius:6px;font-family:var(--font-mono);font-size:12.5px;color:var(--qt-text)}.qt-kcal__svg-tag{color:var(--qt-accent);font-size:11.5px}.qt-kcal__dirty{margin-left:auto;padding:2px 8px;background:color-mix(in srgb,var(--qt-red, #f38ba8) 22%,transparent);color:var(--qt-red, #f38ba8);border-radius:999px;font-size:11px}.qt-kcal__customized{margin-left:auto;color:var(--qt-accent);font-size:11px}.qt-kcal__actions{display:flex;gap:8px;justify-content:flex-end}.qt-kcal__footer{display:flex;align-items:center;gap:8px;padding:12px 16px;border-top:1px solid color-mix(in srgb,var(--qt-text) 10%,transparent);background:color-mix(in srgb,var(--qt-text) 3%,transparent)}.qt-kcal__footer-spacer{flex:1}.qt-kcal__btn{padding:6px 14px;background:var(--qt-mantle);border:1px solid color-mix(in srgb,var(--qt-text) 12%,transparent);border-radius:6px;color:var(--qt-text);font-size:13px;cursor:pointer;font-family:inherit}.qt-kcal__btn:hover:not(:disabled){background:color-mix(in srgb,var(--qt-text) 8%,var(--qt-mantle))}.qt-kcal__btn:disabled{opacity:.4;cursor:not-allowed}.qt-kcal__btn--primary{background:var(--qt-accent);color:var(--qt-base);border-color:var(--qt-accent)}.qt-kcal__btn--primary:hover:not(:disabled){filter:brightness(1.05)}.qt-kcal__picker-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#000000a6;z-index:110;animation:qt-kcal-fade .12s ease}.qt-kcal__picker{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:111;display:flex;flex-direction:column;width:min(720px,calc(100vw - 32px));max-height:calc(100dvh - 48px);background:var(--qt-base);border:1px solid color-mix(in srgb,var(--qt-text) 12%,transparent);border-radius:12px;box-shadow:0 24px 60px #0000008c;overflow:hidden}.qt-kcal__picker-header{display:flex;align-items:center;padding:12px 16px;border-bottom:1px solid color-mix(in srgb,var(--qt-text) 10%,transparent)}.qt-kcal__picker-title{flex:1;font-size:14px;font-weight:600;color:var(--qt-text);margin:0}.qt-kcal__picker-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(96px,1fr));gap:8px;padding:16px;overflow-y:auto}.qt-kcal__picker-cell{display:flex;align-items:center;justify-content:center;height:96px;background:color-mix(in srgb,var(--qt-text) 4%,transparent);border:1px solid color-mix(in srgb,var(--qt-text) 10%,transparent);border-radius:8px;cursor:pointer;color:var(--qt-text);padding:4px}.qt-kcal__picker-cell:hover{background:color-mix(in srgb,var(--qt-accent) 10%,transparent);border-color:color-mix(in srgb,var(--qt-accent) 40%,transparent)}.qt-kcal__picker-cell.is-selected{border-color:var(--qt-accent);background:color-mix(in srgb,var(--qt-accent) 15%,transparent)}.qt-shortcuts{display:flex;flex-direction:column;gap:20px;margin-top:12px}.qt-shortcuts__group-title{font-size:12px;font-weight:600;color:var(--qt-text-muted);text-transform:uppercase;letter-spacing:.05em;margin-bottom:6px}.qt-shortcut-row{display:grid;grid-template-columns:1fr auto auto auto;grid-column-gap:8px;align-items:center;padding:6px 0;border-top:1px solid color-mix(in srgb,var(--qt-text) 6%,transparent)}.qt-shortcut-row:first-of-type{border-top:0}.qt-shortcut-row__label{font-size:13px;color:var(--qt-text)}.qt-shortcut-row__key{min-width:120px;padding:4px 10px;background:color-mix(in srgb,var(--qt-text) 4%,transparent);border:1px solid color-mix(in srgb,var(--qt-text) 12%,transparent);border-radius:6px;color:var(--qt-text);cursor:pointer;font-family:var(--font-mono);font-size:12px;text-align:center}.qt-shortcut-row__key:hover{background:color-mix(in srgb,var(--qt-text) 8%,transparent)}.qt-shortcut-row__key.is-recording{border-color:var(--qt-accent);background:color-mix(in srgb,var(--qt-accent) 12%,transparent)}.qt-shortcut-row__kbd{font-family:var(--font-mono);font-size:12px}.qt-shortcut-row__disabled{color:var(--qt-text-muted);font-style:italic}.qt-shortcut-row__hint{color:var(--qt-accent)}.qt-shortcut-row__btn{width:24px;height:24px;padding:0;background:transparent;border:0;border-radius:4px;color:var(--qt-text-muted);font-size:14px;cursor:pointer;line-height:1}.qt-shortcut-row__btn:hover{background:color-mix(in srgb,var(--qt-text) 8%,transparent);color:var(--qt-text)}.qt-shortcut-row__btn--danger:hover{color:var(--qt-red, #f38ba8)}.qt-shortcut-row__warn{grid-column:1 / -1;padding:4px 0 2px;font-size:11.5px;color:color-mix(in srgb,var(--qt-red, #f38ba8) 80%,var(--qt-text));display:flex;gap:12px;flex-wrap:wrap}.qt-settings-search{display:flex;flex-direction:column;gap:var(--space-3)}.qt-settings-search__count{font-size:var(--fs-caption);color:var(--qt-text-muted);letter-spacing:.03em;padding-bottom:var(--space-2)}.qt-settings-search__group{display:flex;flex-direction:column;gap:2px}.qt-settings-search__group-label{font-size:var(--fs-caption);color:var(--qt-text-muted);text-transform:uppercase;letter-spacing:.08em;padding:6px 8px}.qt-settings-search__row{display:flex;flex-direction:column;gap:4px;padding:10px 12px;background:transparent;border:none;border-radius:8px;color:var(--qt-text);font-family:inherit;text-align:left;cursor:pointer;transition:background .12s ease}.qt-settings-search__row:hover{background:var(--qt-surface-hover)}.qt-settings-search__row-title{font-size:var(--fs-ui);font-weight:500}.qt-settings-search__row-desc{font-size:var(--fs-caption);color:var(--qt-text-muted);line-height:1.5}.qt-settings-search__empty{padding:var(--space-5);text-align:center;color:var(--qt-text-muted);font-size:var(--fs-ui)}.qt-settings__highlight{background:color-mix(in srgb,var(--qt-accent) 28%,transparent);color:inherit;padding:0 2px;border-radius:2px}.qt-settings-sidebar{display:flex;flex-direction:column;gap:var(--space-1);padding:var(--space-2) var(--space-1);height:100%;overflow-y:auto}.qt-settings-sidebar__group{display:flex;flex-direction:column;gap:2px}.qt-settings-sidebar__group-row{display:flex;align-items:center;gap:6px;padding:6px 8px;background:transparent;border:none;border-radius:4px;color:var(--qt-text-muted);font-size:var(--fs-caption);letter-spacing:.05em;text-transform:uppercase;cursor:pointer;transition:color .12s ease,background .12s ease}.qt-settings-sidebar__group-row:hover{color:var(--qt-text)}.qt-settings-sidebar__chevron{flex-shrink:0;transition:transform .16s ease}.qt-settings-sidebar__chevron.is-open{transform:rotate(90deg)}.qt-settings-sidebar__group-label{flex:1;min-width:0;text-align:left;overflow:hidden;text-overflow:ellipsis}.qt-settings-sidebar__tabs{display:flex;flex-direction:column;gap:1px;padding-left:12px}.qt-settings-sidebar__tab{display:block;width:100%;padding:6px 10px;background:transparent;border:none;border-radius:4px;color:var(--qt-text);font-size:var(--fs-ui);text-align:left;cursor:pointer;transition:color .12s ease,background .12s ease;outline:none}.qt-settings-sidebar__tab:hover{background:var(--qt-surface-hover)}.qt-settings-sidebar__tab.is-active{background:color-mix(in srgb,var(--qt-accent) 12%,transparent);color:var(--qt-accent);font-weight:500}.qt-settings-sidebar__tab:focus-visible{box-shadow:0 0 0 2px color-mix(in srgb,var(--qt-accent) 60%,transparent)}.qt-settings-sidebar__tab.is-dim,.qt-settings-sidebar__group-row.is-dim{opacity:.4;cursor:not-allowed}.qt-settings-sidebar__tab.is-dim:hover{background:transparent}.qt-settings-sidebar__tab-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis}.qt-settings-sidebar__tab{display:flex;align-items:center;gap:8px}.qt-settings-sidebar__count{flex-shrink:0;padding:0 6px;min-width:20px;height:18px;display:inline-flex;align-items:center;justify-content:center;background:color-mix(in srgb,var(--qt-accent) 20%,transparent);color:var(--qt-accent);border-radius:9px;font-size:11px;font-weight:600;font-family:var(--font-mono)}.qt-settings__overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#0006;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);animation:qt-fade-in .12s ease-out;z-index:40}@keyframes qt-fade-in{0%{opacity:0}to{opacity:1}}.qt-settings__content{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:min(900px,92vw);height:min(620px,85dvh);background:var(--qt-mantle);border-radius:16px;box-shadow:0 12px 40px #0006;display:flex;flex-direction:column;overflow:hidden;z-index:50;animation:qt-dialog-in .16s ease-out}.qt-settings__content.is-expanded{width:96vw;height:92dvh}@keyframes qt-dialog-in{0%{opacity:0;transform:translate(-50%,-50%) scale(.96)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}.qt-settings__titlebar{height:40px;padding:0 var(--space-3);display:flex;align-items:center;justify-content:space-between;flex-shrink:0}.qt-settings__brand{display:flex;align-items:center;gap:8px;color:var(--qt-text-muted)}.qt-settings__brand-text{margin:0;font-size:var(--fs-caption);color:var(--qt-text);letter-spacing:.08em;-webkit-user-select:none;user-select:none}.qt-settings__titlebar-actions{display:flex;align-items:center;gap:2px}.qt-settings__icon-btn{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;padding:0;background:transparent;border:none;border-radius:4px;color:var(--qt-text-muted);cursor:pointer;outline:none;transition:color .12s ease,background .12s ease}.qt-settings__icon-btn:hover{color:var(--qt-text);background:var(--qt-surface-hover)}.qt-settings__icon-btn:focus-visible{box-shadow:0 0 0 2px color-mix(in srgb,var(--qt-accent) 60%,transparent)}.qt-settings__body{flex:1;min-height:0;display:flex;flex-direction:column;gap:6px;padding:6px}.qt-settings__search{display:flex;align-items:center;gap:10px;height:36px;padding:0 var(--space-3);border-radius:12px;background:var(--qt-base);color:var(--qt-text-muted);flex-shrink:0}.qt-settings__search input{flex:1;min-width:0;border:none;outline:none;background:transparent;color:var(--qt-text);font-family:inherit;font-size:var(--fs-ui)}.qt-settings__search input:disabled{cursor:not-allowed;color:var(--qt-text-muted)}.qt-settings__search-clear{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;background:transparent;border:none;border-radius:4px;color:var(--qt-text-muted);cursor:pointer;transition:color .12s ease,background .12s ease}.qt-settings__search-clear:hover{color:var(--qt-text);background:var(--qt-surface-hover)}.qt-settings__group{flex:1;min-height:0;display:flex}.qt-settings__pane{min-height:0;min-width:0}.qt-settings__card{width:100%;height:100%;border-radius:12px;background:var(--qt-base);display:flex;flex-direction:column;overflow:hidden}.qt-settings__content-scroll{flex:1;min-height:0;overflow-y:auto;padding:var(--space-5) var(--space-5)}.qt-settings__separator{width:6px;background:transparent;outline:none}.qt-settings__separator:focus,.qt-settings__separator:focus-visible{outline:none}.qt-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.qt-md{color:var(--qt-text);line-height:1.75;font-size:var(--fs-body)}.qt-md h1,.qt-md h2,.qt-md h3,.qt-md h4{margin:0 0 var(--space-3);color:var(--qt-text);font-weight:600}.qt-md h1{font-size:var(--fs-display)}.qt-md h2{font-size:1.05rem}.qt-md h3{font-size:var(--fs-body)}.qt-md p{margin:0 0 var(--space-3)}.qt-md p:last-child{margin-bottom:0}.qt-md code{background:var(--qt-base);padding:0 3px;border-radius:3px}.qt-md pre{margin:var(--space-3) 0}.qt-md pre code{background:transparent;padding:0}.qt-md strong{color:var(--qt-text);font-weight:600}.qt-md img{max-width:min(100%,480px);height:auto;display:block;margin:var(--space-3) auto}.qt-md-mermaid{margin:var(--space-3) 0;overflow-x:auto}.qt-md-mermaid__dark,.qt-md-mermaid__light{display:none}html[data-theme=mocha] .qt-md-mermaid__dark,html[data-theme=dark] .qt-md-mermaid__dark,:root:not([data-theme=latte]):not([data-theme=light]) .qt-md-mermaid__dark{display:block}html[data-theme=latte] .qt-md-mermaid__light,html[data-theme=light] .qt-md-mermaid__light{display:block}.qt-md-mermaid svg{max-width:100%;height:auto}.qt-md-math{display:block;margin:var(--space-3) 0;text-align:center;overflow-x:auto}.qt-md-math-inline{display:inline}.qt-md-math[data-math-pending],.qt-md-math-inline[data-math-pending]{font-family:var(--font-mono);color:var(--qt-text-muted);opacity:.7}.qt-md-link{color:var(--qt-accent);text-decoration:underline;text-underline-offset:2px}.qt-md-link:hover{color:var(--qt-accent-strong, var(--qt-accent));text-decoration-thickness:2px}.qt-more-btn{background:transparent;border:none;outline:none;color:var(--qt-text-muted);width:26px;height:26px;border-radius:4px;font-size:16px;line-height:1;padding:0;cursor:pointer;transition:color .12s ease}.qt-more-btn:hover{color:var(--qt-text)}.qt-more-btn:focus,.qt-more-btn:focus-visible{outline:none;box-shadow:none}.qt-more-menu{min-width:140px;background:var(--qt-mantle);border:none;border-radius:var(--radius);box-shadow:0 12px 32px #00000052;z-index:40;padding:4px;outline:none}.qt-more-menu__opt{width:100%;background:transparent;border:none;color:var(--qt-text);padding:6px 10px;border-radius:3px;text-align:left;font-family:inherit;font-size:var(--fs-ui);cursor:pointer;transition:background .12s ease}.qt-more-menu__opt:hover:not(:disabled){background:var(--qt-surface-hover)}.qt-more-menu__opt:disabled{color:var(--qt-text-muted);cursor:not-allowed;opacity:.5}.qt-sparkline{display:inline-block;vertical-align:middle;overflow:visible}.qt-sparkline__line{fill:none;stroke:var(--qt-accent, currentColor);stroke-linecap:round;stroke-linejoin:round}.qt-sparkline__dot{fill:var(--qt-accent, currentColor)}.qt-wpm-history{display:flex;flex-direction:column;gap:4px;min-width:180px;font-family:var(--font-mono);font-size:var(--fs-caption)}.qt-wpm-history .qt-sparkline{align-self:center;margin-bottom:4px}.qt-wpm-history__row{display:flex;justify-content:space-between;gap:12px}.qt-wpm-history__label{color:var(--qt-text-muted)}.qt-wpm-history__value{color:var(--qt-text);font-weight:500}.qt-deckcard{display:flex;flex-direction:column;padding:0;background:var(--qt-mantle);border:1px solid transparent;border-radius:12px;color:var(--qt-text);text-align:left;cursor:pointer;transition:transform .12s ease,opacity .12s ease,background .12s ease;min-width:0;min-height:16rem;overflow:hidden;position:relative;word-break:break-word}.qt-deckcard.is-selected{border-color:var(--qt-accent);background:color-mix(in srgb,var(--qt-accent) 8%,var(--qt-mantle))}.qt-deckcard__checkbox{position:absolute;top:10px;left:10px;width:18px;height:18px;border-radius:4px;border:1.5px solid var(--qt-border);background:var(--qt-mantle);color:#fff;font-size:11px;font-weight:700;line-height:1;padding:0;cursor:pointer;display:none;align-items:center;justify-content:center;flex-shrink:0;z-index:3;transition:border-color .12s ease,background .12s ease}.qt-deckcard.is-selection-mode .qt-deckcard__checkbox{display:inline-flex}.qt-deckcard__checkbox:hover{border-color:var(--qt-accent)}.qt-deckcard__checkbox.is-checked{background:var(--qt-accent);border-color:var(--qt-accent)}.qt-deckcard__stamp{position:absolute;right:12px;bottom:8px;padding:3px 10px;border:2px solid var(--qt-green);border-radius:4px;color:var(--qt-green);font-family:var(--font-mono);font-size:10px;font-weight:700;letter-spacing:.15em;transform:rotate(-8deg);background:color-mix(in srgb,var(--qt-green) 8%,transparent);pointer-events:none;-webkit-user-select:none;user-select:none;line-height:1.2;z-index:3}.qt-deckcard:hover{border-color:var(--qt-accent);transform:translateY(-1px)}.qt-deckcard:focus-visible{outline:none;border-color:var(--qt-accent)}.qt-deckcard__done-icon{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:50%;background:color-mix(in srgb,var(--qt-green) 22%,transparent);color:var(--qt-green);font-size:11px;font-weight:700;line-height:1}.qt-deckcard__cover{position:relative;flex:1;display:flex;flex-direction:column;background:linear-gradient(135deg,color-mix(in srgb,var(--qt-accent) 24%,var(--qt-mantle)) 0%,color-mix(in srgb,var(--qt-accent) 8%,var(--qt-mantle)) 50%,var(--qt-mantle) 100%);border-bottom:1px solid var(--qt-border);overflow:hidden}.qt-deckcard__topbar{display:flex;justify-content:space-between;align-items:flex-start;padding:var(--space-3) var(--space-3);padding-bottom:0;z-index:1}.qt-deckcard.is-selection-mode .qt-deckcard__topbar{padding-left:36px}.qt-deckcard__tags{display:flex;gap:6px;flex-wrap:wrap;flex:1;min-width:0}.qt-deckcard__tag{background:var(--qt-base);color:var(--qt-text-muted);padding:3px 10px;border-radius:9999px;font-family:var(--font-mono);font-size:var(--fs-caption);line-height:1;border:1px solid var(--qt-border);max-width:12ch;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.qt-deckcard__tag--more{cursor:help;color:var(--qt-text-muted);opacity:.8}.qt-deckcard__topright{display:flex;align-items:center;gap:4px}.qt-deckcard__check{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:50%;background:color-mix(in srgb,var(--qt-green) 22%,transparent);color:var(--qt-green);font-size:11px;font-weight:700}.qt-deckcard__menuwrap{position:relative}.qt-deckcard__menu-btn{background:transparent;border:none;outline:none;color:var(--qt-text-muted);width:24px;height:24px;border-radius:4px;font-size:16px;line-height:1;padding:0;cursor:pointer;transition:background .12s ease,color .12s ease}.qt-deckcard__menu-btn:focus,.qt-deckcard__menu-btn:focus-visible{outline:none;box-shadow:none}.qt-deckcard__menu-btn:hover{color:var(--qt-text)}.qt-deckcard__menu{position:absolute;top:calc(100% + 4px);right:0;min-width:140px;background:var(--qt-mantle);border:none;border-radius:var(--radius);box-shadow:0 12px 32px #00000052;z-index:20;padding:4px}.qt-deckcard__menu-opt{width:100%;background:transparent;border:none;color:var(--qt-text);padding:6px 10px;border-radius:3px;text-align:left;font-family:inherit;font-size:var(--fs-ui);cursor:pointer;transition:background .12s ease,color .12s ease}.qt-deckcard__menu-opt:hover:not(:disabled){background:var(--qt-surface-hover)}.qt-deckcard__menu-opt:disabled{color:var(--qt-text-muted);cursor:not-allowed;opacity:.5}.qt-deckcard__center{position:relative;flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:var(--space-4) var(--space-4);text-align:center}.qt-deckcard__title{font-size:1.5rem;font-weight:600;color:var(--qt-text);line-height:1.3;letter-spacing:.01em;min-width:0;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.qt-deckcard__count{color:var(--qt-text-muted);font-family:var(--font-mono);font-size:var(--fs-caption)}.qt-deckcard__cover-foot{display:flex;justify-content:space-between;align-items:flex-end;padding:var(--space-3) var(--space-3);padding-top:0;min-height:24px}.qt-deckcard__cover-foot .qt-deckcard__count{padding-left:4px}.qt-deckcard__peak{color:var(--qt-accent);font-family:var(--font-mono);font-size:var(--fs-caption);padding-right:4px;cursor:help}.qt-deckcard__bottom{padding:var(--space-3) var(--space-3);background:var(--qt-mantle);display:flex;flex-direction:column;gap:6px;flex-shrink:0}.qt-deckcard__preview{color:var(--qt-text-muted);font-size:var(--fs-caption);line-height:1.4;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;height:2.8em;word-break:break-word}.qt-deckcard__meta{display:flex;align-items:center;gap:var(--space-2)}.qt-deckcard__status{padding:2px 8px;border-radius:9999px;font-size:var(--fs-caption);font-family:var(--font-mono);color:var(--qt-text-muted);background:var(--qt-base);border:1px solid var(--qt-border)}.qt-deckcard__status.is-done{color:var(--qt-green);background:color-mix(in srgb,var(--qt-green) 12%,transparent);border-color:color-mix(in srgb,var(--qt-green) 40%,var(--qt-border))}.qt-deckcard.is-done{cursor:not-allowed}.qt-deckcard.is-done:hover{transform:none;border-color:var(--qt-border)}.qt-deckcard.is-done .qt-deckcard__topbar,.qt-deckcard.is-done .qt-deckcard__center,.qt-deckcard.is-done .qt-deckcard__cover-foot,.qt-deckcard.is-done .qt-deckcard__bottom{filter:grayscale(1);opacity:.55}.qt-deckcard.is-done .qt-deckcard__cover{background:var(--qt-mantle)}.qt-deckrow{display:flex;align-items:center;gap:14px;padding:10px 16px 10px 8px;background:transparent;border:1px solid transparent;border-radius:8px;color:var(--qt-text);text-align:left;font-family:inherit;font-size:var(--fs-body);transition:background .12s ease,border-color .12s ease,opacity .12s ease;width:100%;min-width:0;min-height:92px;cursor:pointer;outline:none;word-break:break-word}.qt-deckrow>*{min-width:0}.qt-deckrow:hover,.qt-deckrow:focus-visible{background:var(--qt-surface-hover)}.qt-deckrow.is-selected{background:color-mix(in srgb,var(--qt-accent) 10%,transparent);border-color:var(--qt-accent)}.qt-deckrow__checkbox{width:16px;height:16px;border-radius:3px;border:1.5px solid var(--qt-border);background:transparent;color:#fff;font-size:10px;font-weight:700;line-height:1;padding:0;cursor:pointer;display:none;align-items:center;justify-content:center;flex-shrink:0;transition:border-color .12s ease,background .12s ease}.qt-deckrow.is-selection-mode .qt-deckrow__checkbox{display:inline-flex}.qt-deckrow__checkbox:hover{border-color:var(--qt-accent)}.qt-deckrow__checkbox.is-checked{background:var(--qt-accent);border-color:var(--qt-accent)}.qt-deckrow__thumb{flex-shrink:0;width:64px;height:64px;border-radius:10px;background:linear-gradient(135deg,color-mix(in srgb,var(--qt-accent) 22%,var(--qt-mantle)),var(--qt-mantle));border:1px solid var(--qt-border);display:flex;align-items:center;justify-content:center;color:var(--qt-text);font-family:var(--font-mono);font-size:15px;font-weight:600;letter-spacing:.02em;-webkit-user-select:none;user-select:none}.qt-deckrow__body{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}.qt-deckrow__line1{display:flex;align-items:center;gap:10px;min-width:0}.qt-deckrow__title{font-weight:600;font-size:var(--fs-body);color:var(--qt-text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:0 1 auto}.qt-deckrow__tags{position:relative;display:flex;gap:4px;overflow:hidden;flex-wrap:nowrap;min-width:0;flex:1 1 auto}.qt-deckrow__tags-measure{position:absolute;visibility:hidden;pointer-events:none;top:0;left:0;display:flex;gap:4px;white-space:nowrap}.qt-deckrow__tag{background:color-mix(in srgb,var(--qt-accent) 14%,transparent);color:var(--qt-accent);padding:1px 8px;border-radius:3px;font-size:var(--fs-caption);font-family:var(--font-mono);line-height:1.4;white-space:nowrap;flex-shrink:0}.qt-deckrow__tag--more{background:transparent;color:var(--qt-text-muted);border:1px solid var(--qt-border);cursor:help}.qt-deckrow__preview{color:var(--qt-text-muted);font-size:var(--fs-caption);line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.qt-deckrow__line2{display:flex;align-items:center;gap:6px;color:var(--qt-text-muted);font-family:var(--font-mono);font-size:var(--fs-caption);overflow:hidden;white-space:nowrap;min-width:0}.qt-deckrow__line2>span:first-child{overflow:hidden;text-overflow:ellipsis;min-width:0}.qt-deckrow__sep{opacity:.5;flex-shrink:0}.qt-deckrow__stamp{padding:3px 10px;border:2px solid var(--qt-green);border-radius:4px;color:var(--qt-green);font-family:var(--font-mono);font-size:10px;font-weight:700;letter-spacing:.15em;transform:rotate(-6deg);opacity:.85;background:color-mix(in srgb,var(--qt-green) 6%,transparent);pointer-events:none;-webkit-user-select:none;user-select:none;line-height:1.2;flex-shrink:0;align-self:center}.qt-deckrow__menuwrap{position:relative;flex-shrink:0}.qt-deckrow__menu-btn{background:transparent;border:none;outline:none;color:var(--qt-text-muted);width:26px;height:26px;border-radius:4px;font-size:16px;line-height:1;padding:0;cursor:pointer;transition:background .12s ease,color .12s ease}.qt-deckrow__menu-btn:focus,.qt-deckrow__menu-btn:focus-visible{outline:none;box-shadow:none}.qt-deckrow__menu-btn:hover{color:var(--qt-text)}.qt-deckrow__menu{position:absolute;top:calc(100% + 4px);right:0;min-width:140px;background:var(--qt-mantle);border:none;border-radius:var(--radius);box-shadow:0 12px 32px #00000052;z-index:20;padding:4px}.qt-deckrow__menu-opt{width:100%;background:transparent;border:none;color:var(--qt-text);padding:6px 10px;border-radius:3px;text-align:left;font-family:inherit;font-size:var(--fs-ui);cursor:pointer;transition:background .12s ease}.qt-deckrow__menu-opt:hover:not(:disabled){background:var(--qt-surface-hover)}.qt-deckrow__menu-opt:disabled{color:var(--qt-text-muted);cursor:not-allowed;opacity:.5}.qt-deckrow.is-done{cursor:not-allowed}.qt-deckrow.is-done:hover{background:transparent;border-color:transparent}.qt-deckrow.is-done .qt-deckrow__thumb,.qt-deckrow.is-done .qt-deckrow__body{filter:grayscale(1);opacity:.5}.qt-deckrow.is-done .qt-deckrow__stamp{filter:none;opacity:.85}.qt-deckrow__peak{color:var(--qt-accent);cursor:help}.qt-deckcard--dir .qt-deckcard__center{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-2)}.qt-dircard__glyph{color:var(--qt-accent);opacity:.85;display:flex;align-items:center;justify-content:center}.qt-deckcard--dir:hover .qt-dircard__glyph{opacity:1}.qt-deckcard--dir .qt-deckcard__title{text-align:center;width:100%}.qt-deckrow--dir .qt-deckrow__thumb{color:var(--qt-accent);display:flex;align-items:center;justify-content:center}.qt-cardhitcard__type{display:inline-block;padding:3px 8px;border-radius:4px;background:var(--qt-surface-hover);color:var(--qt-text-muted);font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.02em;flex:0 0 auto}.qt-cardhitcard__loc{color:var(--qt-text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}.qt-cardhitcard__pos{color:var(--qt-text-muted);font-family:var(--font-mono);font-size:var(--fs-caption);flex:0 0 auto;margin-left:6px}.qt-cardhit__type{display:inline-block;padding:1px 6px;border-radius:4px;background:var(--qt-surface-hover);color:var(--qt-text-muted);font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.02em;flex:0 0 auto;margin-right:6px}.qt-cardhit__loc{color:var(--qt-text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:40ch}.qt-pw{flex:1;min-height:100vh;display:flex;align-items:center;justify-content:center;padding:var(--space-5)}.qt-pw__box{display:flex;flex-direction:column;gap:var(--space-3);width:min(360px,100%);padding:var(--space-5);border:1px solid var(--qt-border);border-radius:var(--radius);background:var(--qt-mantle)}.qt-pw__title{margin:0;font-size:var(--fs-display);color:var(--qt-text);letter-spacing:.05em}.qt-pw__desc{margin:0;color:var(--qt-text-muted);font-size:var(--fs-ui)}.qt-pw__input{height:var(--control-h);padding:0 var(--space-3);border:1px solid var(--qt-border);border-radius:var(--radius);background:var(--qt-base);color:var(--qt-text);font-family:var(--font-mono);font-size:var(--fs-body)}.qt-pw__input:focus{outline:none;border-color:var(--qt-accent)}.qt-pw__error{color:var(--qt-red);font-size:var(--fs-caption)}.qt-pw__hint{margin:0;color:var(--qt-text-muted);font-size:var(--fs-caption);opacity:.7}@keyframes qt-pw-shake{0%,to{transform:translate(0)}20%{transform:translate(-6px)}40%{transform:translate(6px)}60%{transform:translate(-4px)}80%{transform:translate(4px)}}.qt-pw__box--shake{animation:qt-pw-shake .4s ease-in-out}:root{--qt-base: #252528;--qt-mantle: #2b2b2f;--qt-text: #dadada;--qt-text-muted: #b3b3b3;--qt-accent: #7e6ad8;--qt-mauve: #a882ff;--qt-border: #363636;--qt-surface-hover: rgba(255, 255, 255, .067);--qt-green: #44cf6e;--qt-yellow: #e0de71;--qt-peach: #e9973f;--qt-red: #fb464c}:root{--space-1: .25rem;--space-2: .5rem;--space-3: .75rem;--space-4: 1rem;--space-5: 1.125rem;--control-h: 1.75rem;--icon-btn: 1.625rem;--header-h: clamp(40px, 56px - 1.25vw, 44px);--footer-h: clamp(28px, 40px - .85vw, 34px);--search-h: calc(var(--header-h) - .625rem);--gutter: clamp(12px, 3vw, 16px);--radius: 6px}:root{font-size:clamp(13px,9px + 1vw,16px);--fs-caption: .6875rem;--fs-ui: .75rem;--fs-body: .875rem;--fs-title: .875rem;--fs-display: 1.25rem;--font-ui: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif;--font-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace}*,*:before,*:after{box-sizing:border-box}html,body{margin:0;padding:0;height:100%;overflow:hidden;font-family:var(--font-ui);font-size:var(--fs-body);background:var(--qt-base);color:var(--qt-text);-webkit-font-smoothing:antialiased}*{scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--qt-border) 80%,transparent) transparent}*::-webkit-scrollbar{width:8px;height:8px}*::-webkit-scrollbar-track{background:transparent}*::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--qt-border) 60%,transparent);border-radius:4px;border:2px solid transparent;background-clip:content-box}*::-webkit-scrollbar-thumb:hover{background:color-mix(in srgb,var(--qt-border) 90%,transparent);background-clip:content-box}*::-webkit-scrollbar-corner{background:transparent}#root{height:100%;display:flex;flex-direction:column;overflow:hidden}button{font-family:inherit;font-size:inherit;color:inherit;cursor:pointer}a{color:var(--qt-accent);text-decoration:none}a:hover{text-decoration:underline}kbd{font-family:var(--font-mono)}pre{font-family:var(--font-mono);font-size:var(--fs-body);background:var(--qt-base);border:1px solid var(--qt-border);border-radius:var(--radius);padding:var(--space-3);overflow:auto;line-height:1.5;margin:var(--space-3) 0}code{font-family:var(--font-mono);font-size:.95em;background:var(--qt-base);padding:0 3px;border-radius:3px}pre code{background:transparent;padding:0}.qt-app{display:flex;flex-direction:column;height:100vh;height:100dvh;background:var(--qt-base);overflow:hidden}.qt-empty{color:var(--qt-text-muted);text-align:center;padding:var(--space-5);font-size:var(--fs-body)}.qt-tag{background:color-mix(in srgb,var(--qt-accent) 14%,transparent);color:var(--qt-accent);padding:0 var(--space-2);border-radius:3px;font-size:var(--fs-caption);font-family:var(--font-mono)}.qt-home__grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(200px,45vw),1fr));gap:var(--space-3);min-width:0}.qt-home__list{display:flex;flex-direction:column}.qt-home__virt-grid,.qt-home__virt-list{height:100%;min-height:400px}.qt-card-warning{background:color-mix(in srgb,var(--qt-yellow, #f9e2af) 15%,transparent);border:1px solid color-mix(in srgb,var(--qt-yellow, #f9e2af) 50%,var(--qt-border));color:var(--qt-text);padding:var(--space-2) var(--space-3);border-radius:var(--radius);font-size:var(--fs-caption);margin-bottom:var(--space-2)}.qt-card-warning code{background:color-mix(in srgb,var(--qt-text) 10%,transparent);padding:0 4px;border-radius:3px;margin-left:4px;font-family:var(--font-mono)}.qt-session-done{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-3);padding:var(--space-5)}.qt-session-done__stamp{padding:12px 32px;border:3px solid var(--qt-green);border-radius:8px;color:var(--qt-green);font-family:var(--font-mono);font-size:1.5rem;font-weight:700;letter-spacing:.2em;transform:rotate(-6deg);background:color-mix(in srgb,var(--qt-green) 8%,transparent);animation:qt-stamp-in .4s cubic-bezier(.34,1.56,.64,1)}@keyframes qt-stamp-in{0%{opacity:0;transform:rotate(-30deg) scale(1.6)}to{opacity:1;transform:rotate(-6deg) scale(1)}}.qt-primary{background:var(--qt-accent);color:#fff;padding:0 var(--space-4);height:var(--control-h);border:none;border-radius:var(--radius);font-family:inherit;font-weight:500;font-size:var(--fs-ui);transition:filter .12s ease}.qt-primary:hover{filter:brightness(1.1)}
|