@qnroa/qtype 0.0.1 → 0.0.3

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.
Files changed (468) hide show
  1. package/CHANGELOG.md +1 -3
  2. package/CHANGELOG.zh.md +1 -2
  3. package/README.md +88 -56
  4. package/README.zh.md +82 -62
  5. package/dist/cli/bootstrap.js +4 -115
  6. package/dist/cli/commands/check/index.js +11 -10
  7. package/dist/cli/commands/config/action.js +5 -9
  8. package/dist/cli/commands/content/lint/action.js +38 -44
  9. package/dist/cli/commands/content/search/action.js +44 -34
  10. package/dist/cli/commands/content/search/i18n.js +6 -0
  11. package/dist/cli/commands/content/search/index.js +19 -1
  12. package/dist/cli/commands/content/validate/action.js +28 -27
  13. package/dist/cli/commands/index.js +1 -3
  14. package/dist/cli/commands/pack/index.js +2 -1
  15. package/dist/cli/commands/publish/build/action.js +39 -11
  16. package/dist/cli/commands/repo/new/action.js +23 -4
  17. package/dist/cli/commands/repo/new/i18n.js +2 -2
  18. package/dist/cli/commands/repo/sync/action.js +24 -4
  19. package/dist/cli/commands/repo/templates.js +2 -1
  20. package/dist/cli/utils/material.js +49 -0
  21. package/dist/core/encrypt.js +24 -1
  22. package/dist/core/index.js +1 -0
  23. package/dist/core/parser/frontmatter.js +39 -34
  24. package/dist/core/parser/parseMaterial.js +174 -24
  25. package/dist/core/romanization/index.js +152 -0
  26. package/dist/core/schemas/both.js +52 -0
  27. package/dist/core/schemas/index.js +3 -0
  28. package/dist/core/schemas/repo.js +55 -0
  29. package/dist/core/schemas/user.js +19 -0
  30. package/dist/core/typing/engine/TypingInput.js +243 -0
  31. package/dist/core/typing/engine/chars.js +30 -0
  32. package/dist/core/typing/engine/feedback.js +15 -0
  33. package/dist/core/typing/engine/index.js +5 -0
  34. package/dist/core/typing/engine/settings.js +8 -0
  35. package/dist/core/typing/engine/stats.js +45 -0
  36. package/dist/core/typing/index.js +9 -1
  37. package/dist/view/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  38. package/dist/view/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  39. package/dist/view/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  40. package/dist/view/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  41. package/dist/view/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  42. package/dist/view/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  43. package/dist/view/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  44. package/dist/view/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  45. package/dist/view/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  46. package/dist/view/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  47. package/dist/view/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  48. package/dist/view/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  49. package/dist/view/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  50. package/dist/view/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  51. package/dist/view/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  52. package/dist/view/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  53. package/dist/view/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  54. package/dist/view/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  55. package/dist/view/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  56. package/dist/view/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  57. package/dist/view/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  58. package/dist/view/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  59. package/dist/view/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  60. package/dist/view/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  61. package/dist/view/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  62. package/dist/view/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  63. package/dist/view/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  64. package/dist/view/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  65. package/dist/view/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  66. package/dist/view/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  67. package/dist/view/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  68. package/dist/view/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  69. package/dist/view/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  70. package/dist/view/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  71. package/dist/view/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  72. package/dist/view/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  73. package/dist/view/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  74. package/dist/view/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  75. package/dist/view/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  76. package/dist/view/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  77. package/dist/view/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  78. package/dist/view/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  79. package/dist/view/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  80. package/dist/view/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  81. package/dist/view/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  82. package/dist/view/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  83. package/dist/view/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  84. package/dist/view/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  85. package/dist/view/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  86. package/dist/view/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  87. package/dist/view/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  88. package/dist/view/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  89. package/dist/view/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  90. package/dist/view/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  91. package/dist/view/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  92. package/dist/view/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  93. package/dist/view/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  94. package/dist/view/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  95. package/dist/view/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  96. package/dist/view/assets/abap-BdImnpbu.js +1 -0
  97. package/dist/view/assets/actionscript-3-B3316cI-.js +1 -0
  98. package/dist/view/assets/ada-bCR0ucgS.js +1 -0
  99. package/dist/view/assets/ahk-CsyLZFj1.js +1 -0
  100. package/dist/view/assets/ahk2-8Zs4aa1G.js +1 -0
  101. package/dist/view/assets/andromeeda-C4gqWexZ.js +1 -0
  102. package/dist/view/assets/angular-html-DA-rfuFy.js +1 -0
  103. package/dist/view/assets/angular-ts-BrjP3tb8.js +1 -0
  104. package/dist/view/assets/apache-Pmp26Uib.js +1 -0
  105. package/dist/view/assets/apex-DhZFqWV2.js +1 -0
  106. package/dist/view/assets/apl-CORt7UWP.js +1 -0
  107. package/dist/view/assets/applescript-Co6uUVPk.js +1 -0
  108. package/dist/view/assets/ara-BRHolxvo.js +1 -0
  109. package/dist/view/assets/asciidoc-CSVQ5wI8.js +1 -0
  110. package/dist/view/assets/asm-D_Q5rh1f.js +1 -0
  111. package/dist/view/assets/astro-HNnZUWAn.js +1 -0
  112. package/dist/view/assets/aurora-x-D-2ljcwZ.js +1 -0
  113. package/dist/view/assets/awk-DMzUqQB5.js +1 -0
  114. package/dist/view/assets/ayu-dark-DYE7WIF3.js +1 -0
  115. package/dist/view/assets/ayu-light-BA47KaF1.js +1 -0
  116. package/dist/view/assets/ayu-mirage-32ctXXKs.js +1 -0
  117. package/dist/view/assets/ballerina-BFfxhgS-.js +1 -0
  118. package/dist/view/assets/bat-CickPsom.js +1 -0
  119. package/dist/view/assets/beancount-k_qm7-4y.js +1 -0
  120. package/dist/view/assets/berry-uYugtg8r.js +1 -0
  121. package/dist/view/assets/bibtex-CHM0blh-.js +1 -0
  122. package/dist/view/assets/bicep-Bmn6On1c.js +1 -0
  123. package/dist/view/assets/bird2-Bx8U0n9b.js +1 -0
  124. package/dist/view/assets/blade-2xfisSek.js +1 -0
  125. package/dist/view/assets/bsl-DlhNcFeZ.js +1 -0
  126. package/dist/view/assets/c-BIGW1oBm.js +1 -0
  127. package/dist/view/assets/c3-Dp5svz6Z.js +1 -0
  128. package/dist/view/assets/cadence-Bv_4Rxtq.js +1 -0
  129. package/dist/view/assets/cairo-KRGpt6FW.js +1 -0
  130. package/dist/view/assets/catppuccin-frappe-CZL1YF0i.js +1 -0
  131. package/dist/view/assets/catppuccin-latte-DH-8KZSZ.js +1 -0
  132. package/dist/view/assets/catppuccin-macchiato-B7yYVSCf.js +1 -0
  133. package/dist/view/assets/catppuccin-mocha-Ct7hS0mc.js +1 -0
  134. package/dist/view/assets/chapel-DTp_pixX.js +1 -0
  135. package/dist/view/assets/clarity-Dn5IMItf.js +1 -0
  136. package/dist/view/assets/clojure-P80f7IUj.js +1 -0
  137. package/dist/view/assets/cmake-D1j8_8rp.js +1 -0
  138. package/dist/view/assets/cobol-nBiQ_Alo.js +1 -0
  139. package/dist/view/assets/codeowners-Bp6g37R7.js +1 -0
  140. package/dist/view/assets/codeql-DsOJ9woJ.js +1 -0
  141. package/dist/view/assets/coffee-Ch7k5sss.js +1 -0
  142. package/dist/view/assets/common-lisp-Cg-RD9OK.js +1 -0
  143. package/dist/view/assets/coq-C7JzOVbR.js +1 -0
  144. package/dist/view/assets/cpp-BMRokrvK.js +1 -0
  145. package/dist/view/assets/crystal-DGywbUpC.js +1 -0
  146. package/dist/view/assets/csharp-DSvCPggb.js +1 -0
  147. package/dist/view/assets/css-CLj8gQPS.js +1 -0
  148. package/dist/view/assets/csv-fuZLfV_i.js +1 -0
  149. package/dist/view/assets/cue-D82EKSYY.js +1 -0
  150. package/dist/view/assets/cypher-COkxafJQ.js +1 -0
  151. package/dist/view/assets/d-85-TOEBH.js +1 -0
  152. package/dist/view/assets/dark-plus-C3mMm8J8.js +1 -0
  153. package/dist/view/assets/dart-bE4Kk8sk.js +1 -0
  154. package/dist/view/assets/dax-CEL-wOlO.js +1 -0
  155. package/dist/view/assets/desktop-BmXAJ9_W.js +1 -0
  156. package/dist/view/assets/diff-D97Zzqfu.js +1 -0
  157. package/dist/view/assets/docker-BcOcwvcX.js +1 -0
  158. package/dist/view/assets/dotenv-Da5cRb03.js +1 -0
  159. package/dist/view/assets/dracula-BzJJZx-M.js +1 -0
  160. package/dist/view/assets/dracula-soft-BXkSAIEj.js +1 -0
  161. package/dist/view/assets/dream-maker-BtqSS_iP.js +1 -0
  162. package/dist/view/assets/edge-FbVlp4U3.js +1 -0
  163. package/dist/view/assets/elixir-CkH2-t6x.js +1 -0
  164. package/dist/view/assets/elm-DbKCFpqz.js +1 -0
  165. package/dist/view/assets/emacs-lisp-C_m_b--Z.js +1 -0
  166. package/dist/view/assets/erb-DXfck5VN.js +1 -0
  167. package/dist/view/assets/erlang-DsQrWhSR.js +1 -0
  168. package/dist/view/assets/everforest-dark-BgDCqdQA.js +1 -0
  169. package/dist/view/assets/everforest-light-C8M2exoo.js +1 -0
  170. package/dist/view/assets/fennel-BYunw83y.js +1 -0
  171. package/dist/view/assets/fish-BvzEVeQv.js +1 -0
  172. package/dist/view/assets/fluent-C4IJs8-o.js +1 -0
  173. package/dist/view/assets/fortran-fixed-form-CkoXwp7k.js +1 -0
  174. package/dist/view/assets/fortran-free-form-BxgE0vQu.js +1 -0
  175. package/dist/view/assets/fsharp-CXgrBDvD.js +1 -0
  176. package/dist/view/assets/gdresource-TyuKm33G.js +1 -0
  177. package/dist/view/assets/gdscript-DqcFQ5yU.js +1 -0
  178. package/dist/view/assets/gdshader-DkwncUOv.js +1 -0
  179. package/dist/view/assets/genie-D0YGMca9.js +1 -0
  180. package/dist/view/assets/gherkin-DyxjwDmM.js +1 -0
  181. package/dist/view/assets/git-commit-F4YmCXRG.js +1 -0
  182. package/dist/view/assets/git-rebase-r7XF79zn.js +1 -0
  183. package/dist/view/assets/github-dark-DHJKELXO.js +1 -0
  184. package/dist/view/assets/github-dark-default-Cuk6v7N8.js +1 -0
  185. package/dist/view/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
  186. package/dist/view/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
  187. package/dist/view/assets/github-light-DAi9KRSo.js +1 -0
  188. package/dist/view/assets/github-light-default-D7oLnXFd.js +1 -0
  189. package/dist/view/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
  190. package/dist/view/assets/gleam-BspZqrRM.js +1 -0
  191. package/dist/view/assets/glimmer-js-ByusRIyA.js +1 -0
  192. package/dist/view/assets/glimmer-ts-BfAWNZQY.js +1 -0
  193. package/dist/view/assets/glsl-DplSGwfg.js +1 -0
  194. package/dist/view/assets/gn-n2N0HUVH.js +1 -0
  195. package/dist/view/assets/gnuplot-DdkO51Og.js +1 -0
  196. package/dist/view/assets/go-C27-OAKa.js +1 -0
  197. package/dist/view/assets/graphql-ChdNCCLP.js +1 -0
  198. package/dist/view/assets/groovy-gcz8RCvz.js +1 -0
  199. package/dist/view/assets/gruvbox-dark-hard-CFHQjOhq.js +1 -0
  200. package/dist/view/assets/gruvbox-dark-medium-GsRaNv29.js +1 -0
  201. package/dist/view/assets/gruvbox-dark-soft-CVdnzihN.js +1 -0
  202. package/dist/view/assets/gruvbox-light-hard-CH1njM8p.js +1 -0
  203. package/dist/view/assets/gruvbox-light-medium-DRw_LuNl.js +1 -0
  204. package/dist/view/assets/gruvbox-light-soft-hJgmCMqR.js +1 -0
  205. package/dist/view/assets/hack-BWmVpMyf.js +1 -0
  206. package/dist/view/assets/haml-D5jkg6IW.js +1 -0
  207. package/dist/view/assets/handlebars-BpdQsYii.js +1 -0
  208. package/dist/view/assets/haskell-Df6bDoY_.js +1 -0
  209. package/dist/view/assets/haxe-CfZj7gIn.js +1 -0
  210. package/dist/view/assets/hcl-BWvSN4gD.js +1 -0
  211. package/dist/view/assets/hjson-D5-asLiD.js +1 -0
  212. package/dist/view/assets/hlsl-D3lLCCz7.js +1 -0
  213. package/dist/view/assets/horizon-BUw7H-hv.js +1 -0
  214. package/dist/view/assets/horizon-bright-CUuTKBJd.js +1 -0
  215. package/dist/view/assets/houston-DnULxvSX.js +1 -0
  216. package/dist/view/assets/html-derivative-DlHx6ybY.js +1 -0
  217. package/dist/view/assets/html-pp8916En.js +1 -0
  218. package/dist/view/assets/http-jrhK8wxY.js +1 -0
  219. package/dist/view/assets/hurl-irOxFIW8.js +1 -0
  220. package/dist/view/assets/hxml-2-FPmUDs.js +1 -0
  221. package/dist/view/assets/hy-DFXneXwc.js +1 -0
  222. package/dist/view/assets/imba-DGztddWO.js +1 -0
  223. package/dist/view/assets/index-BLryk3W4.css +1 -0
  224. package/dist/view/assets/index-ByMJp0a5.js +3 -0
  225. package/dist/view/assets/index-CRh4USfC.js +189 -0
  226. package/dist/view/assets/index-JNx7Ohoj.js +153 -0
  227. package/dist/view/assets/ini-BEwlwnbL.js +1 -0
  228. package/dist/view/assets/java-CylS5w8V.js +1 -0
  229. package/dist/view/assets/javascript-wDzz0qaB.js +1 -0
  230. package/dist/view/assets/jinja-f2NsQr07.js +1 -0
  231. package/dist/view/assets/jison-wvAkD_A8.js +1 -0
  232. package/dist/view/assets/json-Cp-IABpG.js +1 -0
  233. package/dist/view/assets/json5-C9tS-k6U.js +1 -0
  234. package/dist/view/assets/jsonc-Des-eS-w.js +1 -0
  235. package/dist/view/assets/jsonl-DcaNXYhu.js +1 -0
  236. package/dist/view/assets/jsonnet-DFQXde-d.js +1 -0
  237. package/dist/view/assets/jssm-C2t-YnRu.js +1 -0
  238. package/dist/view/assets/jsx-g9-lgVsj.js +1 -0
  239. package/dist/view/assets/julia-5Bft2YPA.js +1 -0
  240. package/dist/view/assets/just-Cwhn7H3k.js +1 -0
  241. package/dist/view/assets/kanagawa-dragon-BuwD2xS4.js +1 -0
  242. package/dist/view/assets/kanagawa-lotus-C3DzagqV.js +1 -0
  243. package/dist/view/assets/kanagawa-wave-DFGoQZhC.js +1 -0
  244. package/dist/view/assets/katex-BYZTj3zW.css +1 -0
  245. package/dist/view/assets/katex-C5jXJg4s.js +257 -0
  246. package/dist/view/assets/kdl-DV7GczEv.js +1 -0
  247. package/dist/view/assets/kotlin-BdnUsdx6.js +1 -0
  248. package/dist/view/assets/kusto-wEQ09or8.js +1 -0
  249. package/dist/view/assets/laserwave-DUszq2jm.js +1 -0
  250. package/dist/view/assets/latex-D5pSuvFb.js +1 -0
  251. package/dist/view/assets/lean-BZvkOJ9d.js +1 -0
  252. package/dist/view/assets/less-B1dDrJ26.js +1 -0
  253. package/dist/view/assets/light-plus-B7mTdjB0.js +1 -0
  254. package/dist/view/assets/liquid-C0sCDyMI.js +1 -0
  255. package/dist/view/assets/llvm-BZoOZj88.js +1 -0
  256. package/dist/view/assets/log-2UxHyX5q.js +1 -0
  257. package/dist/view/assets/logo-BtOb2qkB.js +1 -0
  258. package/dist/view/assets/lua-BaeVxFsk.js +1 -0
  259. package/dist/view/assets/luau-BnpPk5vE.js +1 -0
  260. package/dist/view/assets/make-CHLpvVh8.js +1 -0
  261. package/dist/view/assets/markdown-Cvjx9yec.js +1 -0
  262. package/dist/view/assets/marko-DjSrsDqO.js +1 -0
  263. package/dist/view/assets/material-theme-D5KoaKCx.js +1 -0
  264. package/dist/view/assets/material-theme-darker-BfHTSMKl.js +1 -0
  265. package/dist/view/assets/material-theme-lighter-B0m2ddpp.js +1 -0
  266. package/dist/view/assets/material-theme-ocean-CyktbL80.js +1 -0
  267. package/dist/view/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
  268. package/dist/view/assets/matlab-D7o27uSR.js +1 -0
  269. package/dist/view/assets/mdc-D1_yUvq7.js +1 -0
  270. package/dist/view/assets/mdx-Cmh6b_Ma.js +1 -0
  271. package/dist/view/assets/mermaid-CQcHuHx7.js +1 -0
  272. package/dist/view/assets/min-dark-CafNBF8u.js +1 -0
  273. package/dist/view/assets/min-light-CTRr51gU.js +1 -0
  274. package/dist/view/assets/mipsasm-CKIfxQSi.js +1 -0
  275. package/dist/view/assets/mojo-DJz3ZmWd.js +1 -0
  276. package/dist/view/assets/monokai-BRVnQi9A.js +1 -0
  277. package/dist/view/assets/moonbit-CHtswR0a.js +1 -0
  278. package/dist/view/assets/move-el3G9tDJ.js +1 -0
  279. package/dist/view/assets/narrat-DRg8JJMk.js +1 -0
  280. package/dist/view/assets/nextflow-C-mBbutL.js +1 -0
  281. package/dist/view/assets/nextflow-groovy-vE_lwT2v.js +1 -0
  282. package/dist/view/assets/nginx-BpAMiNFr.js +1 -0
  283. package/dist/view/assets/night-owl-C39BiMTA.js +1 -0
  284. package/dist/view/assets/night-owl-light-CMTm3GFP.js +1 -0
  285. package/dist/view/assets/nim-BIad80T-.js +1 -0
  286. package/dist/view/assets/nix-CwoSXNpI.js +1 -0
  287. package/dist/view/assets/nord-Ddv68eIx.js +1 -0
  288. package/dist/view/assets/nsis-BlV79W_Q.js +1 -0
  289. package/dist/view/assets/nushell-D3jzshHO.js +1 -0
  290. package/dist/view/assets/objective-c-DXmwc3jG.js +1 -0
  291. package/dist/view/assets/objective-cpp-CLxacb5B.js +1 -0
  292. package/dist/view/assets/ocaml-C0hk2d4L.js +1 -0
  293. package/dist/view/assets/odin-BBf5iR-q.js +1 -0
  294. package/dist/view/assets/one-dark-pro-DVMEJ2y_.js +1 -0
  295. package/dist/view/assets/one-light-C3Wv6jpd.js +1 -0
  296. package/dist/view/assets/openscad-C4EeE6gA.js +1 -0
  297. package/dist/view/assets/org-DM6o9KBp.js +1 -0
  298. package/dist/view/assets/pascal-D93ZcfNL.js +1 -0
  299. package/dist/view/assets/perl-B9cMNwum.js +1 -0
  300. package/dist/view/assets/php-Csjmro_R.js +1 -0
  301. package/dist/view/assets/pkl-u5AG7uiY.js +1 -0
  302. package/dist/view/assets/plastic-3e1v2bzS.js +1 -0
  303. package/dist/view/assets/plsql-ChMvpjG-.js +1 -0
  304. package/dist/view/assets/po-BTJTHyun.js +1 -0
  305. package/dist/view/assets/poimandres-CS3Unz2-.js +1 -0
  306. package/dist/view/assets/polar-C0HS_06l.js +1 -0
  307. package/dist/view/assets/postcss-CXtECtnM.js +1 -0
  308. package/dist/view/assets/powerquery-CEu0bR-o.js +1 -0
  309. package/dist/view/assets/powershell-BmBUJMz7.js +1 -0
  310. package/dist/view/assets/prisma-Vru482bI.js +1 -0
  311. package/dist/view/assets/prolog-CbFg5uaA.js +1 -0
  312. package/dist/view/assets/proto-C7zT0LnQ.js +1 -0
  313. package/dist/view/assets/pug-DKIMFp6K.js +1 -0
  314. package/dist/view/assets/puppet-BMWR74SV.js +1 -0
  315. package/dist/view/assets/purescript-CklMAg4u.js +1 -0
  316. package/dist/view/assets/python-B6aJPvgy.js +1 -0
  317. package/dist/view/assets/qml-3beO22l8.js +1 -0
  318. package/dist/view/assets/qmldir-C8lEn-DE.js +1 -0
  319. package/dist/view/assets/qss-IeuSbFQv.js +1 -0
  320. package/dist/view/assets/r-Cf5RLm7j.js +1 -0
  321. package/dist/view/assets/racket-BqYA7rlc.js +1 -0
  322. package/dist/view/assets/raku-DXvB9xmW.js +1 -0
  323. package/dist/view/assets/razor-BjBPvh-w.js +1 -0
  324. package/dist/view/assets/rbs-CpoqiR4B.js +1 -0
  325. package/dist/view/assets/red-hvxz__6c.js +1 -0
  326. package/dist/view/assets/reg-C-SQnVFl.js +1 -0
  327. package/dist/view/assets/regexp-CDVJQ6XC.js +1 -0
  328. package/dist/view/assets/rel-C3B-1QV4.js +1 -0
  329. package/dist/view/assets/riscv-BM1_JUlF.js +1 -0
  330. package/dist/view/assets/ron-D8l8udqQ.js +1 -0
  331. package/dist/view/assets/rose-pine-5qJOZa0Y.js +1 -0
  332. package/dist/view/assets/rose-pine-dawn-zx0QlTCp.js +1 -0
  333. package/dist/view/assets/rose-pine-moon-C9pEdX9L.js +1 -0
  334. package/dist/view/assets/rosmsg-BJDFO7_C.js +1 -0
  335. package/dist/view/assets/rst-bs7f0vWN.js +1 -0
  336. package/dist/view/assets/ruby-C0TQ7zu5.js +1 -0
  337. package/dist/view/assets/rust-B1yitclQ.js +1 -0
  338. package/dist/view/assets/sas-DEy46yEz.js +1 -0
  339. package/dist/view/assets/sass-Cj5Yp3dK.js +1 -0
  340. package/dist/view/assets/scala-CqE71os6.js +1 -0
  341. package/dist/view/assets/scheme-C98Dy4si.js +1 -0
  342. package/dist/view/assets/scss-D5BDwBP9.js +1 -0
  343. package/dist/view/assets/sdbl-DVxCFoDh.js +1 -0
  344. package/dist/view/assets/shaderlab-Dg9Lc6iA.js +1 -0
  345. package/dist/view/assets/shellscript-Yzrsuije.js +1 -0
  346. package/dist/view/assets/shellsession-BADoaaVG.js +1 -0
  347. package/dist/view/assets/slack-dark-BthQWCQV.js +1 -0
  348. package/dist/view/assets/slack-ochin-DqwNpetd.js +1 -0
  349. package/dist/view/assets/smalltalk-BOQMe2GC.js +1 -0
  350. package/dist/view/assets/smithy-cds9vsN8.js +1 -0
  351. package/dist/view/assets/snazzy-light-Bw305WKR.js +1 -0
  352. package/dist/view/assets/solarized-dark-CpvCGNkr.js +1 -0
  353. package/dist/view/assets/solarized-light-Dlz6yCKv.js +1 -0
  354. package/dist/view/assets/solidity-DijEV5ha.js +1 -0
  355. package/dist/view/assets/soy-8wufbnw4.js +1 -0
  356. package/dist/view/assets/sparql-rVzFXLq3.js +1 -0
  357. package/dist/view/assets/splunk-BtCnVYZw.js +1 -0
  358. package/dist/view/assets/sql-CRqJ_cUM.js +1 -0
  359. package/dist/view/assets/ssh-config-_ykCGR6B.js +1 -0
  360. package/dist/view/assets/stata-DI20mbqo.js +1 -0
  361. package/dist/view/assets/stylus-BEDo0Tqx.js +1 -0
  362. package/dist/view/assets/surrealql-Cjom0U5J.js +1 -0
  363. package/dist/view/assets/svelte-Cy7k_4gC.js +1 -0
  364. package/dist/view/assets/swift-C2oV4EkX.js +1 -0
  365. package/dist/view/assets/synthwave-84-CbfX1IO0.js +1 -0
  366. package/dist/view/assets/system-verilog-0hqHdDBg.js +1 -0
  367. package/dist/view/assets/systemd-4A_iFExJ.js +1 -0
  368. package/dist/view/assets/talonscript-CkByrt1z.js +1 -0
  369. package/dist/view/assets/tasl-QIJgUcNo.js +1 -0
  370. package/dist/view/assets/tcl-dwOrl1Do.js +1 -0
  371. package/dist/view/assets/templ-DhtptRzy.js +1 -0
  372. package/dist/view/assets/terraform-BETggiCN.js +1 -0
  373. package/dist/view/assets/tex-D96PA37w.js +1 -0
  374. package/dist/view/assets/tokyo-night-hegEt444.js +1 -0
  375. package/dist/view/assets/toml-vGWfd6FD.js +1 -0
  376. package/dist/view/assets/ts-tags-D351s5mN.js +1 -0
  377. package/dist/view/assets/tsv-B_m7g4N7.js +1 -0
  378. package/dist/view/assets/tsx-COt5Ahok.js +1 -0
  379. package/dist/view/assets/turtle-BsS91CYL.js +1 -0
  380. package/dist/view/assets/twig-27uCiNez.js +1 -0
  381. package/dist/view/assets/typescript-BPQ3VLAy.js +1 -0
  382. package/dist/view/assets/typespec-CAFt9gP4.js +1 -0
  383. package/dist/view/assets/typst-BUadGCkm.js +1 -0
  384. package/dist/view/assets/v-BGw2Nkan.js +1 -0
  385. package/dist/view/assets/vala-CsfeWuGM.js +1 -0
  386. package/dist/view/assets/vb-Cu-pLBUe.js +1 -0
  387. package/dist/view/assets/verilog-nZwndyjY.js +1 -0
  388. package/dist/view/assets/vesper-DRje8inN.js +1 -0
  389. package/dist/view/assets/vhdl-CeAyd5Ju.js +1 -0
  390. package/dist/view/assets/viml-CJc9bBzg.js +1 -0
  391. package/dist/view/assets/vitesse-black-Bkuqu6BP.js +1 -0
  392. package/dist/view/assets/vitesse-dark-D0r3Knsf.js +1 -0
  393. package/dist/view/assets/vitesse-light-CVO1_9PV.js +1 -0
  394. package/dist/view/assets/vue-BqiEGhQt.js +1 -0
  395. package/dist/view/assets/vue-html-AaS7Mt5G.js +1 -0
  396. package/dist/view/assets/vue-vine-BoDAl6tE.js +1 -0
  397. package/dist/view/assets/vyper-CDx5xZoG.js +1 -0
  398. package/dist/view/assets/wasm-CG6Dc4jp.js +1 -0
  399. package/dist/view/assets/wasm-MzD3tlZU.js +1 -0
  400. package/dist/view/assets/wenyan-BV7otONQ.js +1 -0
  401. package/dist/view/assets/wgsl-Dx-B1_4e.js +1 -0
  402. package/dist/view/assets/wikitext-BhOHFoWU.js +1 -0
  403. package/dist/view/assets/wit-5i3qLPDT.js +1 -0
  404. package/dist/view/assets/wolfram-lXgVvXCa.js +1 -0
  405. package/dist/view/assets/xml-sdJ4AIDG.js +1 -0
  406. package/dist/view/assets/xsl-CtQFsRM5.js +1 -0
  407. package/dist/view/assets/yaml-Buea-lGh.js +1 -0
  408. package/dist/view/assets/zenscript-DVFEvuxE.js +1 -0
  409. package/dist/view/assets/zig-VOosw3JB.js +1 -0
  410. package/dist/view/index.html +10 -2
  411. package/docs/README.md +21 -15
  412. package/docs/README.zh.md +15 -9
  413. package/docs/en/authoring.md +85 -80
  414. package/docs/en/cli-reference.md +110 -72
  415. package/docs/en/deployment.md +183 -0
  416. package/docs/en/getting-started.md +112 -0
  417. package/docs/en/material-types.md +241 -0
  418. package/docs/en/settings.md +133 -0
  419. package/docs/en/shortcuts.md +89 -0
  420. package/docs/en/typing-rules.md +208 -0
  421. package/docs/zh/authoring.md +74 -69
  422. package/docs/zh/cli-reference.md +92 -58
  423. package/docs/zh/deployment.md +179 -0
  424. package/docs/zh/getting-started.md +104 -0
  425. package/docs/zh/material-types.md +769 -0
  426. package/docs/zh/settings.md +120 -0
  427. package/docs/zh/shortcuts.md +83 -0
  428. package/docs/zh/typing-rules.md +191 -0
  429. package/package.json +13 -11
  430. package/templates/en/QTYPE.md +155 -495
  431. package/templates/en/README.md +11 -11
  432. package/templates/en/TODO.md +1 -1
  433. package/templates/en/material/article.md +20 -0
  434. package/templates/en/material/assets/article/sunrise.svg +12 -0
  435. package/templates/en/material/assets/code/tree.svg +19 -0
  436. package/templates/en/material/assets/qa/login-flow.svg +17 -0
  437. package/templates/en/material/assets/sentence/pangram.svg +6 -0
  438. package/templates/en/material/assets/snippet/moon.svg +8 -0
  439. package/templates/en/material/assets/word/apple.svg +5 -0
  440. package/templates/en/material/code.md +55 -0
  441. package/templates/en/material/qa.md +33 -0
  442. package/templates/en/material/sentence.md +18 -0
  443. package/templates/en/material/snippet.md +17 -0
  444. package/templates/en/material/word.md +20 -0
  445. package/templates/zh/QTYPE.md +191 -473
  446. package/templates/zh/README.md +6 -6
  447. package/templates/zh/index.md +1 -1
  448. package/templates/zh/material/article.md +18 -0
  449. package/templates/zh/material/assets/article/sunrise.svg +12 -0
  450. package/templates/zh/material/assets/code/tree.svg +19 -0
  451. package/templates/zh/material/assets/qa/login-flow.svg +17 -0
  452. package/templates/zh/material/assets/sentence/pangram.svg +6 -0
  453. package/templates/zh/material/assets/snippet/moon.svg +8 -0
  454. package/templates/zh/material/assets/word/apple.svg +5 -0
  455. package/templates/zh/material/code.md +55 -0
  456. package/templates/zh/material/qa.md +33 -0
  457. package/templates/zh/material/sentence.md +19 -0
  458. package/templates/zh/material/snippet.md +20 -0
  459. package/templates/zh/material/word.md +20 -0
  460. package/dist/cli/commands/check/action.js +0 -56
  461. package/dist/cli/commands/check/i18n.js +0 -26
  462. package/dist/cli/commands/plugin/i18n.js +0 -28
  463. package/dist/cli/commands/plugin/index.js +0 -41
  464. package/dist/core/typing/engine.js +0 -112
  465. package/dist/view/assets/index-DBABH3dG.js +0 -111
  466. package/dist/view/assets/index-RTLZ-zOC.css +0 -1
  467. package/templates/en/material/example.md +0 -47
  468. package/templates/zh/material/example.md +0 -47
@@ -0,0 +1,120 @@
1
+ # Settings 参考
2
+
3
+ English: [settings.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/en/settings.md)
4
+
5
+ qtype 有**两套设置**,分开管:
6
+
7
+ 1. **仓库/命令级配置** —— 走 `qtype config`,存在 `~/.config/qtype/config.json`(user 层)+ `<repo>/.qtype/config.json`(repo 层)。见 [cli-reference.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/zh/cli-reference.md#qtype-config-get--set--unset--list)
8
+ 2. **浏览器/阅读器界面设置** —— 用户在 view 里点齿轮打开的设置对话框,存在浏览器 kv(`qtype.config.user` blob)。这是本文档的内容
9
+
10
+ 阅读器界面设置**只影响本浏览器**,不进 `qtype config`,不进 git,也不影响 CLI。想同步到别的机器可以走浏览器同步 / 手动导出。
11
+
12
+ ---
13
+
14
+ ## Appearance(外观)
15
+
16
+ | 键 | 类型 | 默认 | 说明 |
17
+ |---|---|---|---|
18
+ | `qtype.themeMode` | `auto` / `mocha` / `latte` | `auto` | 主题(dark / light / 跟系统) |
19
+ | `qtype.uiLang` | `auto` / `zh-CN` / `en-US` | `auto` | 界面语言 |
20
+ | `qtype.typingFontSize` | `s` / `m` / `l` | `m` | 打字区字体大小 |
21
+ | `qtype.letterSpacing` | `tight` / `normal` / `wide` | `normal` | 字符间距 |
22
+ | `qtype.spaceGlyph` | `dot` / `dash` / `blank` | `dash` | 打字目标里的空格显示成什么 |
23
+ | `qtype.breakWord` | boolean | true | 单词过长时是否内部断行 |
24
+
25
+ ---
26
+
27
+ ## Typing rules(打字规则)
28
+
29
+ 详细语义见 [typing-rules.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/zh/typing-rules.md)。
30
+
31
+ | 键 | 类型 | 默认 | 说明 |
32
+ |---|---|---|---|
33
+ | `qtype.hint` | `off` / `ghost` | `off` | 是否显示 ghost 目标提示 |
34
+ | `qtype.ignoreCase` | boolean | false | 大小写不敏感对比 |
35
+ | `qtype.ignorePunctuation` | boolean | false | 忽略标点差异(智能引号 / 全半角) |
36
+ | `qtype.allowBackspace` | boolean | true | 允许 Backspace 撤销 |
37
+ | `qtype.tabBehavior` | `reset` / `input` | `reset` | Tab 键:重置本卡 / 当空格输入 |
38
+ | `qtype.tabWidth` | `2` / `4` | `4` | tabBehavior=input 时一个 Tab 展开几个空格 |
39
+ | `qtype.completionMode` | `through` / `perfect` / `lenient` | `through` | 完成一张卡的门槛(见 typing-rules.md) |
40
+ | `qtype.retryOnFail` | `off` / `auto` / `immediate` | `off` | 失败自动重试策略 |
41
+ | `qtype.maxRetries` | 0-20 | 5 | 自动重试上限,0 = 无限 |
42
+ | `qtype.maxWrongRate` | 0-100 | 0 | 错误率阈值(%),超过就锁字。0 = 关闭 |
43
+ | `qtype.targetWpm` | 0-500 | 0 | 目标 WPM(带阴影光标做节拍器)。0 = 关闭 |
44
+
45
+ ---
46
+
47
+ ## Audio(音效)
48
+
49
+ | 键 | 类型 | 默认 | 说明 |
50
+ |---|---|---|---|
51
+ | `qtype.keySoundEnabled` | boolean | false | 按键点击音 |
52
+ | `qtype.keySoundVolume` | 0-100 | 40 | 按键音音量 |
53
+ | `qtype.errorSoundEnabled` | boolean | false | 错误提示音 |
54
+ | `qtype.errorSoundVolume` | 0-100 | 60 | 错误音音量 |
55
+ | `qtype.completeSoundEnabled` | boolean | true | 完成整个 material 时的音效 |
56
+ | `qtype.autoSpeak` | boolean | true | word / sentence 卡切卡时自动朗读 |
57
+ | `qtype.autoSpeakRepeat` | 1-5 | 1 | 自动朗读重复次数 |
58
+ | `qtype.ttsProvider` | `browser` / `youdao` / `google` | `browser` | TTS 提供方 |
59
+ | `qtype.ttsVolume` | 0-100 | 100 | 朗读音量 |
60
+ | `qtype.ttsRate` | 50-200 | 100 | 朗读语速(%) |
61
+
62
+ ---
63
+
64
+ ## Interface(界面)
65
+
66
+ | 键 | 类型 | 默认 | 说明 |
67
+ |---|---|---|---|
68
+ | `qtype.showKeyboard` | boolean | true | 显示屏幕键盘 |
69
+ | `qtype.showHands` | boolean | true | 屏幕键盘上叠加双手指法 |
70
+ | `qtype.keyboardSize` | `s` / `m` / `l` | `m` | 屏幕键盘大小 |
71
+ | `qtype.autoHideCursor` | boolean | true | 3 秒无鼠标移动自动隐藏鼠标 |
72
+ | `qtype.showNeighborPreview` | boolean | true | 左右显示前后卡预览 |
73
+ | `qtype.showPhonetic` | boolean | true | word / sentence 卡默认显示音标 |
74
+ | `qtype.showGloss` | boolean | true | word / sentence 卡默认显示释义 |
75
+ | `qtype.showResultPopup` | boolean | true | 完成后弹窗显示 WPM / 准确率 |
76
+ | `qtype.speedUnit` | `wpm` / `cpm` | `wpm` | 速度单位:词 / 字符每分钟 |
77
+ | `qtype.afkSeconds` | 5-300 | 60 | 多少秒无输入自动暂停(见 [typing-rules](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/zh/typing-rules.md#afk-自动暂停)) |
78
+ | `qtype.minAccuracy` | 0-100 | 0 | 准确率低于此值时提示,0 = 关闭 |
79
+ | `qtype.codeSyntaxHighlight` | boolean | false | code 卡启用 Shiki 语法高亮(默认关,~1MB bundle) |
80
+ | `qtype.mathRenderer` | boolean | true | 用 KaTeX 渲染 `$...$` / `$$...$$` 数学公式(懒加载 ~280KB) |
81
+
82
+ ---
83
+
84
+ ## Side stores(独立存储的数据)
85
+
86
+ 有几类数据不走上面的单 blob,单独存:
87
+
88
+ | 键 | 内容 | 说明 |
89
+ |---|---|---|
90
+ | `qtype.doneState` | `Record<file, Record<idx, CardStats[]>>` | 每张卡的历次 WPM / 准确率 —— 首页 sparkline 数据源 |
91
+ | `qtype.handOffsets` | 键盘校准 | 按键位置相对默认布局的偏移 |
92
+ | `qtype.keybindings` | 快捷键重绑 | 见 [shortcuts.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/zh/shortcuts.md) |
93
+
94
+ 这三个都由 v2 kv migration 收编到统一 blob 里,内部还是独立的子 map,
95
+ 但从 UI 视角看是**唯一 blob** —— `handOffsets` / `keybindings` 也会跟着
96
+ theme / hint 一起进导入导出。
97
+
98
+ ---
99
+
100
+ ## 导入 / 导出
101
+
102
+ Settings 面板的**「数据」**标签页有导入 / 导出按钮:
103
+
104
+ - 导出 → `qtype-settings.json`,包含上面全部设置 + 三类 side store
105
+ - 导入 → 覆盖当前值,进 kv 前会经过 schema 校验
106
+
107
+ **导入不会合并**,是完整覆盖。如果只想改一两个值,直接用 UI 或代码里
108
+ `kvSet('key', value)`。
109
+
110
+ ---
111
+
112
+ ## 让 CLI 感知界面设置?
113
+
114
+ **不能**。上面这些设置**只在浏览器里存在**,CLI 读不到 —— 分工是:
115
+
116
+ - 谁写卡片 / 谁 publish → CLI 层设置(`qtype config`,进 git)
117
+ - 谁在浏览器里练 → 界面层设置(浏览器 kv,per-device)
118
+
119
+ 比如你想让全 team 用一样的默认字体大小 —— 现在**做不到**。这是有意的
120
+ 设计:CLI 层是「作品的一部分」,界面层是「每个人自己的阅读偏好」。
@@ -0,0 +1,83 @@
1
+ # 快捷键
2
+
3
+ English: [shortcuts.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/en/shortcuts.md)
4
+
5
+ 阅读器里的键盘快捷键。这份是**出厂默认**;每一项都可以在 Settings →
6
+ Shortcuts 里重绑,重绑的值存在浏览器 kv 里(不进 git,per-device)。
7
+
8
+ ## 全局(任何页面)
9
+
10
+ | 动作 | mac | Windows / Linux | 说明 |
11
+ |---|---|---|---|
12
+ | 打开命令面板 | `Cmd+K` | `Ctrl+K` | ⌘K 风格的 launcher,可以搜任何动作 / material |
13
+ | 命令面板(纯命令) | `Cmd+Shift+P` | `Ctrl+Shift+P` | 只筛动作,不带 material |
14
+
15
+ ## 打字页(typing route)
16
+
17
+ ### HUD(顶部状态栏)
18
+
19
+ | 动作 | mac | Windows / Linux | 说明 |
20
+ |---|---|---|---|
21
+ | 暂停 / 继续 | `Alt+Space` | `Alt+Space` | 也可以点 HUD 上的 ⏸ 按钮 |
22
+ | 切换 ghost 提示 | `Alt+H` | `Alt+Shift+H` | 在打字目标下方显示褪色目标提示 |
23
+ | 切换屏幕键盘 | `Alt+K` | `Alt+K` | 屏幕键盘可见性 |
24
+ | 切换手部指法 | `Alt+J` | `Alt+J` | 屏幕键盘上叠加双手指法 |
25
+ | 返回首页 | `Alt+R` | `Alt+R` | 退出当前 material |
26
+
27
+ ### 卡片导航
28
+
29
+ | 动作 | mac | Windows / Linux | 说明 |
30
+ |---|---|---|---|
31
+ | 上一张卡 | `Alt+Shift+←` | `Alt+Shift+←` | 卡组内往前跳 |
32
+ | 下一张卡 | `Alt+Shift+→` | `Alt+Shift+→` | 卡组内往后跳 |
33
+
34
+ ### 仅命令面板(无默认按键)
35
+
36
+ 以下动作**没有出厂快捷键**,只能在命令面板里搜到用:
37
+
38
+ - **跳到卡片 N** —— `card.jump`,输入卡号跳过去
39
+ - **换主题** —— `pick.theme`
40
+ - **切换 hint 模式** —— `hint.toggle`
41
+ - **打开设置** —— `settings.open`
42
+ - **搜索 material** —— `search.materials`
43
+ - **切网格视图 / 列表视图** —— `view.grid` / `view.list`(仅首页)
44
+ - **重新加载当前 material** —— `material.reload`
45
+ - **随机跳到一张 material** —— `material.random`
46
+ - **清空所有完成记录** —— `done.clearAll`
47
+ - **重置筛选器** —— `filter.reset`
48
+
49
+ 想给它们绑快捷键,在 Settings → Shortcuts 里点对应行 → 按新的键组合。
50
+
51
+ ## 打字时的键(不算「快捷键」,是引擎行为)
52
+
53
+ 这些是打字过程本身的按键处理,不算可重绑的动作:
54
+
55
+ | 键 | 行为 |
56
+ |---|---|
57
+ | 字母 / 数字 / 标点 / 空格 | 打对 → 光标前进 + 变绿;打错 → 变红,光标不动 |
58
+ | `Backspace` | 撤销一个字符(除非 `allowBackspace: false`,见 [typing-rules.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/zh/typing-rules.md)) |
59
+ | `Enter` | 打进「换行」目标字符(不是提交) |
60
+ | `Tab` | 按 `tabBehavior` 设置:重置本卡 / 输入 2 或 4 个空格 |
61
+ | `Escape` | 让打字区失焦(不暂停) |
62
+ | `←` `→` `↑` `↓` `Home` `End` | **被忽略**(打字工具不需要移动光标) |
63
+
64
+ ## 重绑
65
+
66
+ **Settings → Shortcuts**:
67
+ - 每一行显示动作名 + 当前绑定
68
+ - 点行 → 按新键组合(录制模式)
69
+ - Escape 取消录制,Delete 清空绑定
70
+ - 冲突检测:两个动作绑同一键会警告
71
+ - 「重置默认」按钮恢复所有出厂值
72
+
73
+ **重绑存在哪**:浏览器 kv `qtype.keybindings`,由 v2 migration 收进
74
+ 主 blob,导入 / 导出会跟着走(见 [settings.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/zh/settings.md))。
75
+
76
+ ## 平台差异
77
+
78
+ **Mac** 和 **Windows / Linux** 分开定义。你会看到大部分动作两平台一样
79
+ (纯 Alt 组合无 OS 冲突),但少数用了 `Cmd` vs `Ctrl` —— 用户在 mac 上
80
+ 习惯 Cmd,在 Windows 上习惯 Ctrl。
81
+
82
+ 检测平台是**运行时判断**(`navigator.platform` / `userAgent`),不是构建时。
83
+ 所以一个 dist 部署到跨平台的用户都能用。
@@ -0,0 +1,191 @@
1
+ # 打字规则
2
+
3
+ English: [typing-rules.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/en/typing-rules.md)
4
+
5
+ qtype 有一堆可调的打字规则,决定「打对 / 打错 / 什么时候算完成 / 什么时候
6
+ 自动重试」。所有规则都在 Settings 里能改;开关一览见 [settings.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/zh/settings.md)。
7
+
8
+ 本文档讲清每个规则的**语义 + 常见组合**。
9
+
10
+ ---
11
+
12
+ ## 输入判定
13
+
14
+ ### `ignoreCase`(默认 off)
15
+
16
+ **开启**:输入 `a` 也能匹配目标 `A`;英文卡里按 Shift 按错也不算错。
17
+
18
+ **关闭**:大小写必须完全一致。
19
+
20
+ **什么时候开**:早期练指法、不用记 Shift 位置。**关掉**:练英文段落、
21
+ 要保持严谨。
22
+
23
+ ### `ignorePunctuation`(默认 off)
24
+
25
+ **开启**:引擎在打字时**跳过标点**——目标里出现 `.` `,` `!` `?` `。` `,`
26
+ 等自动向前推进,不需要用户敲。
27
+
28
+ **关闭**:标点也要打对。
29
+
30
+ **什么时候开**:练英文文章、只关心单词部分,不想打 `,` 打错。**关掉**:
31
+ 练精确抄写(法律文书 / 诗词 / 代码)。
32
+
33
+ ### `allowBackspace`(默认 on)
34
+
35
+ **开启**:Backspace 撤销一个字符,可以退回改错。
36
+
37
+ **关闭**:Backspace 无效,打错就得往前走(用 `retryOnFail` / `maxWrongRate` 补救)。
38
+
39
+ **什么时候关**:模拟考试严格模式、让用户敲完整句不能反悔。
40
+
41
+ ---
42
+
43
+ ## 输入限制
44
+
45
+ ### `maxWrongRate`(默认 0 = 关闭,范围 0-100)
46
+
47
+ 上限错误率(%)。**超过**这个值时:
48
+ - 引擎自动 undo 用户最后一个错字
49
+ - HUD 出错误 toast(「错误率超过 X%」)
50
+
51
+ 例:`maxWrongRate: 5` → 累计错误率 > 5% 时,打错就自动回退,强迫用户
52
+ 放慢速度。
53
+
54
+ **什么时候开**:想练准确率而非速度。**留 0**:允许边打边错、只要最终
55
+ 过完就行。
56
+
57
+ ### `retryOnFail`(默认 `off`)
58
+
59
+ 「打完这一张但没达到 `completionMode` 门槛」时的自动重试策略。
60
+
61
+ - **`off`** —— 不自动重试。用户手动 `Alt+R` 才回到卡首
62
+ - **`auto`** —— 完成 + 门槛未过 → arena 抖一下(shake)+ 从头开始
63
+ - **`immediate`** —— 更严格:**打错任何一个字**就立刻重来(不等完成)
64
+
65
+ **maxRetries**(0-20,默认 5):自动重试上限。超过就调 `onSkip` 让路由决定
66
+ (通常直接进下一张)。0 = 无限重试。
67
+
68
+ **组合示例**:
69
+ - `retryOnFail: auto` + `completionMode: perfect` → 每卡必须零错才能过,
70
+ 否则从头
71
+ - `retryOnFail: immediate` + `maxRetries: 3` → 3 次立即重试失败就跳过
72
+
73
+ ---
74
+
75
+ ## 完成判定
76
+
77
+ ### `completionMode`(默认 `through`)
78
+
79
+ 「一张卡打完时,算不算 done?」
80
+
81
+ - **`through`** —— 只要敲到最后一个字就算完成(默认,最宽松)
82
+ - **`lenient`** —— 错误率 ≤ 5% 才算完成
83
+ - **`perfect`** —— 零错才算完成
84
+
85
+ **「不算完成」**发生什么:取决于 `retryOnFail`:
86
+ - `off` → 卡显示为「结束但未完成」,用户可以手动继续下一张
87
+ - `auto` → 从头开始
88
+ - `immediate` → 严格模式下,一般在打错时就已经自动重来了,不会走到这
89
+
90
+ **组合**:completionMode 和 retryOnFail 是**独立**的两个开关:
91
+ - completionMode 决定「什么叫完成」
92
+ - retryOnFail 决定「没完成时怎么办」
93
+
94
+ ---
95
+
96
+ ## Tab 键行为
97
+
98
+ ### `tabBehavior`(默认 `reset`)
99
+
100
+ - **`reset`** —— 按 Tab 重置整张卡(打字工具常见约定)
101
+ - **`input`** —— Tab 作为输入,展开成 `tabWidth` 个空格(练代码常用)
102
+
103
+ ### `tabWidth`(2 或 4,默认 4)
104
+
105
+ `tabBehavior: input` 时,一个 Tab 键 = 几个空格。
106
+
107
+ **练 Python 通常用 `4`,练 Go 或 shell 用 `2`**。代码卡里的目标应该用一致的
108
+ 缩进方式(全是空格或全是 tab 对齐)——qtype 只处理输入,不改目标。
109
+
110
+ ---
111
+
112
+ ## 目标速度提示
113
+
114
+ ### `targetWpm`(默认 0 = 关闭,范围 0-500)
115
+
116
+ 打开后,arena 里显示一个**影子光标**,按目标速度前进。你的实际光标追上
117
+ 或落后于它,肉眼就能判断快慢。
118
+
119
+ 例:`targetWpm: 40` → 影子按 40 WPM 匀速前进,你要追上它 = 达到 40 WPM。
120
+
121
+ 设 0 关闭。开着不影响打字判定,只是节拍器。
122
+
123
+ ---
124
+
125
+ ## AFK 自动暂停
126
+
127
+ ### `afkSeconds`(默认 60,范围 5-300)
128
+
129
+ 多长时间没「活动」就自动暂停。
130
+
131
+ **「活动」= keydown / mousemove / wheel / touchstart / touchmove**。**鼠标
132
+ 悬停不动也算 AFK**(不算移动)。切 tab 或窗口失焦会**立刻**暂停,不等
133
+ AFK 超时。
134
+
135
+ 暂停后 arena 变灰,不接受输入,需要 `Alt+Space` 或 HUD 上的 ▶ 恢复。
136
+
137
+ **为什么默认 60**:留出思考的时间。想要严格计时,调到 15 或 30。
138
+
139
+ ---
140
+
141
+ ## 组合方案参考
142
+
143
+ ### 「刚入门,佛系练」
144
+ ```
145
+ ignoreCase: on
146
+ ignorePunctuation: on
147
+ allowBackspace: on
148
+ completionMode: through
149
+ retryOnFail: off
150
+ maxWrongRate: 0
151
+ ```
152
+ 不管对错,打完就下一张,慢慢积累速度。
153
+
154
+ ### 「日常练打字」(推荐默认)
155
+ ```
156
+ ignoreCase: off
157
+ ignorePunctuation: off
158
+ allowBackspace: on
159
+ completionMode: through
160
+ retryOnFail: auto
161
+ maxRetries: 3
162
+ maxWrongRate: 0
163
+ ```
164
+ 错了能改,过多重来 3 次跳过。
165
+
166
+ ### 「模拟考试严格模式」
167
+ ```
168
+ ignoreCase: off
169
+ ignorePunctuation: off
170
+ allowBackspace: off
171
+ completionMode: perfect
172
+ retryOnFail: immediate
173
+ maxRetries: 0
174
+ ```
175
+ 打错立刻重来,不允许改,零错才过。
176
+
177
+ ### 「快速刷完不 grind」
178
+ ```
179
+ ignoreCase: on
180
+ ignorePunctuation: on
181
+ completionMode: through
182
+ retryOnFail: off
183
+ ```
184
+ 所有卡走一遍,记录 WPM,不磨完美主义。
185
+
186
+ ---
187
+
188
+ ## 相关文档
189
+
190
+ - 每个规则的开关位置:[settings.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/zh/settings.md)
191
+ - 快捷键(暂停 / 上一张 / 下一张):[shortcuts.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/zh/shortcuts.md)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qnroa/qtype",
3
- "version": "0.0.1",
3
+ "version": "0.0.3",
4
4
  "description": "Turn Markdown notes into typing practice — CLI + review + static-site publisher",
5
5
  "keywords": [
6
6
  "typing",
@@ -11,8 +11,7 @@
11
11
  "static-site-generator",
12
12
  "spaced-repetition",
13
13
  "chinese-typing",
14
- "pinyin",
15
- "qrism"
14
+ "pinyin"
16
15
  ],
17
16
  "license": "Apache-2.0",
18
17
  "author": "Qnroa",
@@ -35,12 +34,7 @@
35
34
  "LICENSE",
36
35
  "!dist/**/*.js.map",
37
36
  "!dist/**/*.d.ts.map",
38
- "!docs/**/release.md",
39
- "!docs/**/cli-internals.md",
40
- "!docs/**/architecture.md",
41
- "!docs/**/core-architecture.md",
42
- "!docs/**/cli-architecture.md",
43
- "!docs/**/view-architecture.md"
37
+ "!docs/**/architecture.md"
44
38
  ],
45
39
  "exports": {
46
40
  "./core": "./dist/core/index.js",
@@ -62,10 +56,18 @@
62
56
  },
63
57
  "dependencies": {
64
58
  "@noble/hashes": "^2.2.0",
59
+ "@radix-ui/react-popover": "^1.1.23",
60
+ "@radix-ui/react-tooltip": "^1.2.16",
61
+ "@types/howler": "^2.2.13",
62
+ "cmdk": "^1.1.1",
65
63
  "commander": "^15.0.0",
64
+ "howler": "^2.2.4",
65
+ "katex": "^0.16.47",
66
+ "lucide-react": "^1.33.0",
66
67
  "mermaid": "^11.15.0",
67
- "pinyin-pro": "^3.29.1",
68
- "puppeteer": "^25.4.0"
68
+ "pinyin-pro": "^3.29.3",
69
+ "puppeteer": "^25.4.0",
70
+ "shiki": "^4.4.3"
69
71
  },
70
72
  "devDependencies": {
71
73
  "@radix-ui/react-dialog": "^1.1.23",