@qnroa/qtype 0.1.3 → 0.2.0

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 CHANGED
@@ -13,7 +13,116 @@ can land in any minor bump (`0.x.0`).
13
13
 
14
14
  ## [Unreleased]
15
15
 
16
- ## [0.1.3] — 2026-08-28
16
+ ## [0.2.0] — 2026-08-31
17
+
18
+ Substantial rework of the typing page. The screen-flow is now a real
19
+ finite state machine (xstate), the ad-hoc `paused / stampKind /
20
+ awaitingAdvance / finished / isReview` booleans are gone, and every
21
+ screen state's UI is derived from one place rather than pieced together
22
+ by view code. Behaviour visible to the user shifts in a few spots —
23
+ see below.
24
+
25
+ ### Added
26
+ - **Session persistence for done state.** Marking a card done writes
27
+ to the persistent kv (`useDoneState`), so the completion streak
28
+ survives page reloads and shows up on Home right next to the
29
+ material title as `3 / 12`. Openng a material now lands on the
30
+ first card the user hasn't finished, not always card 1.
31
+ - **Completed-card review mode.** Coming back to a card you've already
32
+ finished shows the answer painted in green (via `engine.markAllHit`)
33
+ with the HUD still available; pressing ▶ / Alt+Space wipes the done
34
+ flag and lets you retype from scratch.
35
+ - **Card-jump list panel.** The quick-input's card submode now lists
36
+ every card in the queue with its title, done state, and a "current"
37
+ marker. Type text to filter by title, digits to jump by number.
38
+ - **After-pass advance mode.** New setting `advanceMode` — the default
39
+ is now **Confirm** (stay on the finished card until the user hits
40
+ the confirm key) rather than auto-advance after 700ms. Users who
41
+ prefer the old behaviour can flip it back to Auto in settings.
42
+ - **Confirm key setting.** Choose Enter or Space as the "next" key.
43
+ The chosen key is highlighted on the on-screen keyboard during the
44
+ confirmation window so mobile users can see where to tap.
45
+ - **Global keyboard channel.** Typing keeps working after clicks that
46
+ move focus out of the arena — a window-level `keydown` listener
47
+ forwards keystrokes to the engine so users don't have to click back
48
+ into the (invisible) editor after every misplaced tap.
49
+ - **Mobile virtual keyboard inset.** The layout reserves space at the
50
+ bottom equal to the soft-keyboard height (`visualViewport` API), so
51
+ the answer text no longer disappears under the keyboard on iOS /
52
+ Android.
53
+ - **Region-aware TTS default.** New `auto` TTS provider picks Youdao
54
+ for `zh-*` browsers and Google elsewhere, with the "browser" engine
55
+ as fallback. Explicit picks still take precedence.
56
+ - **`?path=` search param on the typing route.** The HUD "back to
57
+ library" button returns to the exact folder the user came from
58
+ instead of the library root.
59
+
60
+ ### Changed
61
+ - **Typing page UI reimplemented as an xstate machine** (`idle` /
62
+ `typing` / `paused` / `passed` / `completed` / `finished`), replacing
63
+ five ad-hoc `useState` booleans. Every screen state's mask / stamp /
64
+ pill / keyboard-hint / HUD-play-icon is derived from one `derived`
65
+ struct rather than assembled by the view. Fixes a class of races
66
+ where two effects would fight over the same visual (e.g. the pass
67
+ stamp being covered by the pause mask because a review-restore
68
+ effect fired half a frame too early).
69
+ - **`useTypingEngine` is now keyed on card id, not answer text.** Two
70
+ cards whose answers happened to be identical used to share one
71
+ engine, leaking cursor / hit-miss marks between them. Every card
72
+ now gets a fresh engine on entry.
73
+ - **First character of each card is now highlighted on the on-screen
74
+ keyboard.** `useHudBridge` derives the first keystroke from the
75
+ engine at mount instead of waiting for the arena to push one.
76
+ - **Backspaced characters render as untyped.** The engine still tags
77
+ them as `Recover` for downstream logic, but the dotted underline
78
+ UI decoration is removed — visually the slot goes back to "pending".
79
+ - **HUD ▶ / Alt+Space in `completed` state means "restart this card"**,
80
+ not "start typing". It clears the done marker + resets the engine +
81
+ moves the machine to typing.
82
+ - **Paused → next card lands in idle, not typing.** Advancing while
83
+ paused now shows the pause mask on the new card so the user still
84
+ has to explicitly start.
85
+ - **Backspace / stamp / advance cleanup are co-located with the user
86
+ action that triggers them**, not smuggled through state-transition
87
+ effects that could fire on incidental transitions (e.g. advancing
88
+ to an un-done card would previously have clobbered the destination's
89
+ done state).
90
+
91
+ ### Removed
92
+ - **`sessionPassed` snapshot store.** Reviewing a passed card no
93
+ longer replays the exact keystroke-by-keystroke record from
94
+ sessionStorage — a static "all hit" view is used instead. That
95
+ removed a whole storage layer and closed the quota concern for
96
+ users with thousands of cards.
97
+ - **`TypingInput.snapshot` / `restore`** (and the `TypingInputSnapshot`
98
+ type). Superseded by `markAllHit`.
99
+
100
+ ### Fixed
101
+ - **Focus loss no longer stops typing.** Clicking HUD buttons or
102
+ outside the arena used to silently drop keystrokes; the global
103
+ keydown fallback catches them now.
104
+ - **Mobile answer text no longer covered by the soft keyboard.**
105
+ - **HUD "back" button returns to origin folder** (see `?path=`
106
+ above), instead of always the library root.
107
+
108
+ ## [0.1.4] — 2026-08-29
109
+
110
+ Two small UX changes: a tappable resume overlay and a completion
111
+ stamp that briefly punctuates each finished card. Both are pure
112
+ display concerns; the engine, timing model, and stats are untouched.
113
+
114
+ ### Added
115
+ - **Pause overlay is now a resume button.** The blur / "Press [key] to
116
+ start" mask that appears when the arena is paused is now a real
117
+ `<button>` — clicking or tapping anywhere on it toggles pause off,
118
+ same effect as the HUD ▶ or the shortcut. Fixes the mobile case
119
+ where the tiny HUD button was hard to hit.
120
+ - **Completion stamp (✓ / ✗).** When a card is scored, a brief
121
+ green ✓ (pass) or red ✗ (fail) is stamped on top of the stage. Pass
122
+ auto-advances 700ms later so the user actually sees the confirmation;
123
+ fail flashes for 800ms and stays on the current card for retry.
124
+ Cleared on card change / unmount so a pending advance never fires
125
+ into a stale route.
17
126
 
18
127
  Adds markdown link support to the display-side renderer. Typing
19
128
  targets are untouched — links only render in descriptive slots
package/CHANGELOG.zh.md CHANGED
@@ -12,7 +12,87 @@ English: [CHANGELOG.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=cod
12
12
 
13
13
  ## [Unreleased]
14
14
 
15
- ## [0.1.3] — 2026-08-28
15
+ ## [0.2.0] — 2026-08-31
16
+
17
+ 打字页面的整体架构重写。屏幕流程改成了真正的有限状态机(xstate),
18
+ 之前散在各处的 `paused / stampKind / awaitingAdvance / finished /
19
+ isReview` 布尔位全部替换成一个状态机,每种状态下的 UI 都从一个统一
20
+ 的派生里读,而不是各处自己拼。用户可感知的行为变化见下面。
21
+
22
+ ### 新增
23
+ - **完成状态持久化。** 通过卡片会写到本地存储(`useDoneState`),
24
+ 刷新页面 / 重启浏览器都保留,Home 里的材料卡上会显示 `3 / 12`
25
+ 完成进度。打开材料时会跳到第一张未完成的卡,不再永远从第一张开始。
26
+ - **已完成卡片的回看模式。** 切回已通过的卡时,答案会整体显示为绿色
27
+ (`engine.markAllHit`),HUD 仍可用;按 ▶ / Alt+Space 会清掉这张
28
+ 卡的完成标记并重置引擎,回到从头开始的可打状态。
29
+ - **卡片跳转列表面板。** 命令面板的卡片跳转模式现在会列出 queue 中
30
+ 每一张卡的标题、完成状态和当前位置。输入文本按标题模糊过滤,输入
31
+ 数字按序号直接跳转。
32
+ - **通过后推进模式。** 新增设置 `advanceMode`,默认改为 **确认**(打
33
+ 完卡等待用户按确认键才进入下一张),不再是原本的 700ms 自动跳。
34
+ 想要旧行为的用户可以在设置里切回自动。
35
+ - **确认键设置。** 可选 Enter 或 Space 作为「进入下一张」的键。选中
36
+ 的键在等待确认时会在虚拟键盘上高亮,方便移动端用户看到点哪。
37
+ - **全局键盘通道。** 点击了 HUD 按钮 / 卡片之外的区域之后依然可以继续
38
+ 打字 —— 一个 window 级别的 keydown 监听会兜底转发到引擎,用户不用
39
+ 再回点隐形编辑器。
40
+ - **移动端虚拟键盘避让。** 布局底部会预留和虚拟键盘等高的空间
41
+ (`visualViewport` API),答题区不再被系统键盘挡住。
42
+ - **区域感知的 TTS 默认值。** 新增 `auto` 语音源,浏览器语言 `zh-*`
43
+ 用有道,其他用 Google,都失败降级到浏览器自带。用户手动选的会覆盖。
44
+ - **typing route 支持 `?path=` search 参数。** HUD 上的「返回」按钮
45
+ 会回到用户进入该材料前所在的文件夹,而不是永远回到根目录。
46
+
47
+ ### 变更
48
+ - **打字页 UI 用 xstate 状态机重写**(`idle` / `typing` / `paused` /
49
+ `passed` / `completed` / `finished` 六态),替换了原本的 5 个散乱
50
+ `useState` 布尔。所有状态的遮罩 / 笑脸 / pill / 键盘高亮 / HUD 播
51
+ 放按钮图标都从一个 `derived` 结构派生。修复了一类由两个副作用抢
52
+ 同一个视觉状态引起的 bug(比如笑脸被 review restore 副作用早触发
53
+ 盖住)。
54
+ - **`useTypingEngine` 现在按 cardId 缓存,不再按答案文本。** 之前两
55
+ 张答案文字相同的卡会共用一个引擎,光标 / 对错标记会串。现在每张
56
+ 卡进入时都是一个干净的新引擎。
57
+ - **每张卡的第一个字符现在会在键盘上高亮。** `useHudBridge` 在挂载
58
+ 时就从引擎派生出第一个 keystroke,不再等 arena push。
59
+ - **删除的字符按待打字状态渲染。** 引擎仍然会打 `Recover` 标记(下
60
+ 游还在用),但视觉上不再显示原本的点状下划线。
61
+ - **completed 状态下按 ▶ / Alt+Space 表示「重打这张卡」**,不是「开始
62
+ 打字」。会清完成标记 + 重置引擎 + 转到 typing。
63
+ - **暂停状态下切下一张会到 idle,不到 typing。** 新卡进去仍显示暂停
64
+ 遮罩,等用户主动开始。
65
+ - **Backspace / stamp / advance 的清理逻辑放到触发它们的用户动作里**,
66
+ 不再依赖状态过渡副作用。避免了「切到未通过的卡时误清目标卡完成状
67
+ 态」这类 bug。
68
+
69
+ ### 删除
70
+ - **`sessionPassed` 快照存储。** 回看已通过的卡不再从 sessionStorage
71
+ 回放当时逐键的完整状态,直接使用「全绿」静态视图。移除了一整层存
72
+ 储,消除了对几千张卡容量上限的顾虑。
73
+ - **`TypingInput.snapshot` / `restore` 方法**(以及 `TypingInputSnapshot`
74
+ 类型)。被 `markAllHit` 取代。
75
+
76
+ ### 修复
77
+ - **焦点丢失不再停止打字。** 点击 HUD 按钮 / 卡片之外会让隐形编辑器
78
+ 失焦,原来会静默吞掉按键。现在有全局 keydown 兜底。
79
+ - **移动端答题区不再被虚拟键盘遮挡。**
80
+ - **HUD「返回」按钮回到进入时的目录**(见上面 `?path=`),不再永远回
81
+ 到根目录。
82
+
83
+ ## [0.1.4] — 2026-08-29
84
+
85
+ 两个小 UX 改动:暂停遮罩可以点击继续,卡片打完时会有一个短暂的
86
+ 盖章反馈。都是纯展示层,引擎、时序、统计都没动。
87
+
88
+ ### 新增
89
+ - **暂停遮罩变成继续按钮**。arena 暂停时那层模糊 + "按 X 开始"提示
90
+ 现在是一个真正的 `<button>` — 点击或触摸任意位置都会继续,跟
91
+ HUD ▶ 或快捷键同效果。修复了手机上 HUD 按钮太小难点的问题。
92
+ - **完成盖章 ✓ / ✗**。卡片评分后,在卡面上盖一枚短暂的绿 ✓ 通过
93
+ 或红 ✗ 未通过。通过后 700ms 自动进下一张,让用户看清确认;未
94
+ 通过闪 800ms 后消失,留在当前卡供重试。切卡或卸载路由时会清
95
+ 掉待触发的定时器,避免误跳。
16
96
 
17
97
  在显示侧渲染器加了 markdown 链接支持。打字目标不动 —— 链接只在
18
98
  描述性 slot(`## Q`、article/snippet 正文、gloss)里生效,`## A`
@@ -140,6 +140,24 @@ export class TypingInput {
140
140
  this.#position = 0;
141
141
  this.#notify();
142
142
  }
143
+ /**
144
+ * Mark every character as Hit — used by the route's `completed`
145
+ * state (a card the user finished earlier) so downstream renderers
146
+ * paint the whole answer in green without needing a full snapshot
147
+ * of the original keystroke stream. Purely cosmetic: stats derived
148
+ * from timestamps stay zero.
149
+ */
150
+ markAllHit() {
151
+ const next = this.#chars.map((c) => ({
152
+ target: c.target,
153
+ typed: c.target,
154
+ attrs: (c.attrs & ~(CharAttr.Miss | CharAttr.Cursor)) | CharAttr.Hit,
155
+ timestamp: 0,
156
+ }));
157
+ this.#chars = next;
158
+ this.#position = this.#length;
159
+ this.#notify();
160
+ }
143
161
  get position() {
144
162
  return this.#position;
145
163
  }
@@ -1,3 +1,3 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-CBeDsCqy.js","assets/index-CihkBUpt.js","assets/index-pFij5fBp.css"])))=>i.map(i=>d[i]);
2
- import{r as l,_ as h,u as g,j as f,C as p,M as m,T as y,a as w}from"./index-CihkBUpt.js";let o=null,c=null;async function L(){return o||c||(c=h(()=>import("./index-CBeDsCqy.js"),__vite__mapDeps([0,1,2])).then(async e=>(o=await e.createHighlighter({themes:["github-dark","github-light"],langs:[]}),o)),c)}async function _(e,t){if(!e.getLoadedLanguages().includes(t))try{await e.loadLanguage(t)}catch{}}function x(e){const[t,n]=l.useState(o);return l.useEffect(()=>{if(!e)return;let r=!1;return(async()=>{const s=await L();await _(s,e),r||n(s)})(),()=>{r=!0}},[e]),t}const A=/```(\w+)/;function E(e){const t=e.toLowerCase();return t.includes("typescript")||t.endsWith(".ts")?"typescript":t.includes("python")||t.endsWith(".py")?"python":t.includes("cpp")||t.includes("c++")?"cpp":t.includes("java")&&!t.includes("script")?"java":t.includes("go")?"go":t.includes("rust")||t.endsWith(".rs")?"rust":t.includes("code-c")||t.endsWith(".c")?"c":"javascript"}function j(e,t){if(e){const n=e.match(A);if(n)return n[1]}return E(t)}function k(e,t,n,r){if(!r||!r.getLoadedLanguages().includes(t))return new Array(Array.from(e).length).fill(null);try{const s=r.codeToTokens(e,{lang:t,theme:n}),i=[];for(const u of s.tokens){for(const a of u)for(const d of a.content)i.push(a.color??null);i.push(null)}return!e.endsWith(`
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-DpS4p4Fg.js","assets/index-zP1tnFzO.js","assets/index-DB9GS9vg.css"])))=>i.map(i=>d[i]);
2
+ import{r as l,_ as h,u as g,j as f,C as p,M as m,T as y,a as w}from"./index-zP1tnFzO.js";let o=null,c=null;async function L(){return o||c||(c=h(()=>import("./index-DpS4p4Fg.js"),__vite__mapDeps([0,1,2])).then(async e=>(o=await e.createHighlighter({themes:["github-dark","github-light"],langs:[]}),o)),c)}async function _(e,t){if(!e.getLoadedLanguages().includes(t))try{await e.loadLanguage(t)}catch{}}function x(e){const[t,n]=l.useState(o);return l.useEffect(()=>{if(!e)return;let r=!1;return(async()=>{const s=await L();await _(s,e),r||n(s)})(),()=>{r=!0}},[e]),t}const A=/```(\w+)/;function E(e){const t=e.toLowerCase();return t.includes("typescript")||t.endsWith(".ts")?"typescript":t.includes("python")||t.endsWith(".py")?"python":t.includes("cpp")||t.includes("c++")?"cpp":t.includes("java")&&!t.includes("script")?"java":t.includes("go")?"go":t.includes("rust")||t.endsWith(".rs")?"rust":t.includes("code-c")||t.endsWith(".c")?"c":"javascript"}function j(e,t){if(e){const n=e.match(A);if(n)return n[1]}return E(t)}function k(e,t,n,r){if(!r||!r.getLoadedLanguages().includes(t))return new Array(Array.from(e).length).fill(null);try{const s=r.codeToTokens(e,{lang:t,theme:n}),i=[];for(const u of s.tokens){for(const a of u)for(const d of a.content)i.push(a.color??null);i.push(null)}return!e.endsWith(`
3
3
  `)&&i.length>Array.from(e).length&&i.pop(),i}catch{return new Array(Array.from(e).length).fill(null)}}function v(e){var d;const{material:t,card:n}=e,[r]=g(),s=l.useMemo(()=>r?j(n.question,t.filePath):"",[n.question,t.filePath,r]),i=typeof document<"u"&&((d=document.documentElement.getAttribute("data-theme"))!=null&&d.includes("latte"))?"github-light":"github-dark",u=x(r?s:""),a=l.useMemo(()=>r?k(n.answer,s,i,u):void 0,[n.answer,s,i,u,r]);return f.jsx(p,{type:"code",variant:"flow",slots:[{role:"title",content:n.title},n.question?{role:"question",content:f.jsx(m,{source:n.question})}:{role:"question",content:null},{role:"arena",content:f.jsx(y,{...w(e),charColors:a},n.id)}]})}export{v as CodeCard};
@@ -0,0 +1 @@
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)}