cotutor 0.2.0 → 0.3.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.
Files changed (871) hide show
  1. package/LICENSE +247 -21
  2. package/NOTICE +42 -0
  3. package/README.md +92 -20
  4. package/bin/cotutor.js +4 -4
  5. package/cards/canvas/card.css +8 -0
  6. package/cards/canvas/card.md +68 -0
  7. package/cards/choice/card.css +18 -0
  8. package/cards/choice/card.md +55 -0
  9. package/cards/code/card.css +5 -0
  10. package/cards/code/card.md +46 -0
  11. package/cards/dictation/card.css +10 -0
  12. package/cards/dictation/card.md +97 -0
  13. package/cards/image/card.css +10 -0
  14. package/cards/image/card.md +52 -0
  15. package/cards/lecture/card.css +9 -0
  16. package/cards/lecture/card.md +69 -0
  17. package/cards/paint/card.css +20 -0
  18. package/cards/paint/card.md +77 -0
  19. package/cards/photo/card.css +15 -0
  20. package/cards/photo/card.md +61 -0
  21. package/cards/read/card.css +6 -0
  22. package/cards/read/card.md +51 -0
  23. package/cards/text/card.css +3 -0
  24. package/cards/text/card.md +69 -0
  25. package/cards/tianzige/card.css +17 -0
  26. package/cards/tianzige/card.md +78 -0
  27. package/cards/tutor/card.css +66 -0
  28. package/cards/tutor/card.md +148 -0
  29. package/cards/word/card.css +24 -0
  30. package/cards/word/card.md +91 -0
  31. package/cards//346/235/277/344/271/246/346/200/216/344/271/210/345/206/231.md +159 -0
  32. package/dist/app/activity-eval-rules.d.ts +62 -0
  33. package/dist/app/activity-eval-rules.js +276 -0
  34. package/dist/app/activity-eval.d.ts +65 -0
  35. package/dist/app/activity-eval.js +158 -0
  36. package/dist/app/build.d.ts +11 -0
  37. package/dist/app/build.js +45 -0
  38. package/dist/app/cli/activities.d.ts +63 -0
  39. package/dist/app/cli/activities.js +158 -0
  40. package/dist/{cli → app/cli}/cert.js +3 -3
  41. package/dist/app/cli/chalk/bake.d.ts +10 -0
  42. package/dist/app/cli/chalk/bake.js +58 -0
  43. package/dist/app/cli/chalk/browser.d.ts +16 -0
  44. package/dist/app/cli/chalk/browser.js +142 -0
  45. package/dist/app/cli/chalk/build.d.ts +14 -0
  46. package/dist/app/cli/chalk/build.js +100 -0
  47. package/dist/app/cli/chalk/dub.d.ts +51 -0
  48. package/dist/app/cli/chalk/dub.js +106 -0
  49. package/dist/app/cli/chalk/load-scene.d.ts +34 -0
  50. package/dist/app/cli/chalk/load-scene.js +117 -0
  51. package/dist/app/cli/chalk/main.d.ts +7 -0
  52. package/dist/app/cli/chalk/main.js +198 -0
  53. package/dist/app/cli/chalk/serve.d.ts +4 -0
  54. package/dist/app/cli/chalk/serve.js +28 -0
  55. package/dist/app/cli/chalk/snap.d.ts +65 -0
  56. package/dist/app/cli/chalk/snap.js +103 -0
  57. package/dist/app/cli/chalk/typecheck.d.ts +7 -0
  58. package/dist/app/cli/chalk/typecheck.js +51 -0
  59. package/dist/{cli → app/cli}/doctor.d.ts +4 -3
  60. package/dist/app/cli/doctor.js +617 -0
  61. package/dist/app/cli/grades.d.ts +14 -0
  62. package/dist/app/cli/grades.js +44 -0
  63. package/dist/{cli → app/cli}/init.d.ts +3 -1
  64. package/dist/app/cli/init.js +155 -0
  65. package/dist/app/cli/main.js +715 -0
  66. package/dist/app/cli/migrate.d.ts +58 -0
  67. package/dist/app/cli/migrate.js +253 -0
  68. package/dist/{cli → app/cli}/serve.d.ts +12 -5
  69. package/dist/app/cli/serve.js +98 -0
  70. package/dist/app/cli/shipped.d.ts +30 -0
  71. package/dist/app/cli/shipped.js +47 -0
  72. package/dist/app/cli/skeleton.d.ts +38 -0
  73. package/dist/app/cli/skeleton.js +161 -0
  74. package/dist/app/cli/skills.d.ts +55 -0
  75. package/dist/app/cli/skills.js +189 -0
  76. package/dist/app/cli/themes.d.ts +52 -0
  77. package/dist/app/cli/themes.js +148 -0
  78. package/dist/{cli → app/cli}/tutors.d.ts +15 -26
  79. package/dist/{cli → app/cli}/tutors.js +86 -110
  80. package/dist/app/cli/usage.d.ts +2 -0
  81. package/dist/app/cli/usage.js +30 -0
  82. package/dist/app/dictation/recognize.d.ts +18 -0
  83. package/dist/app/dictation/recognize.js +6 -0
  84. package/dist/app/dictation/route.d.ts +52 -0
  85. package/dist/app/dictation/route.js +510 -0
  86. package/dist/app/diff.d.ts +11 -0
  87. package/dist/app/diff.js +71 -0
  88. package/dist/app/http/access.d.ts +62 -0
  89. package/dist/app/http/access.js +180 -0
  90. package/dist/app/http/app.d.ts +246 -0
  91. package/dist/app/http/app.js +1212 -0
  92. package/dist/app/http/dev-activities.d.ts +115 -0
  93. package/dist/app/http/dev-activities.js +193 -0
  94. package/dist/app/http/dev-overview.d.ts +108 -0
  95. package/dist/app/http/dev-overview.js +209 -0
  96. package/dist/app/http/dev-tutor-files.d.ts +80 -0
  97. package/dist/app/http/dev-tutor-files.js +151 -0
  98. package/dist/app/http/parent-home.d.ts +37 -0
  99. package/dist/app/http/parent-home.js +203 -0
  100. package/dist/app/http/range.d.ts +9 -0
  101. package/dist/app/http/range.js +19 -0
  102. package/dist/app/http/raw-view.d.ts +117 -0
  103. package/dist/app/http/raw-view.js +149 -0
  104. package/dist/app/http/send-file.d.ts +7 -0
  105. package/dist/app/http/send-file.js +29 -0
  106. package/dist/{server → app/http}/stage.d.ts +9 -0
  107. package/dist/{server → app/http}/stage.js +34 -6
  108. package/dist/app/http/theme.d.ts +13 -0
  109. package/dist/app/http/theme.js +41 -0
  110. package/dist/app/machine/bailian.d.ts +28 -0
  111. package/dist/app/machine/bailian.js +88 -0
  112. package/dist/app/mock/mock-live.d.ts +16 -0
  113. package/dist/app/mock/mock-live.js +140 -0
  114. package/dist/{server → app/mock}/mock.d.ts +36 -5
  115. package/dist/app/mock/mock.js +1117 -0
  116. package/dist/app/replay.d.ts +94 -0
  117. package/dist/app/replay.js +170 -0
  118. package/dist/app/skills/analyze-doc.d.ts +3 -0
  119. package/dist/app/skills/analyze-doc.js +47 -0
  120. package/dist/app/skills/home-doc.d.ts +5 -0
  121. package/dist/app/skills/home-doc.js +112 -0
  122. package/dist/app/skills/tune-doc.d.ts +3 -0
  123. package/dist/app/skills/tune-doc.js +80 -0
  124. package/dist/app/talk/list.d.ts +11 -0
  125. package/dist/app/talk/list.js +9 -0
  126. package/dist/app/talk/route.d.ts +16 -0
  127. package/dist/app/talk/route.js +142 -0
  128. package/dist/app/workspace.d.ts +58 -0
  129. package/dist/{cli → app}/workspace.js +77 -52
  130. package/dist/app/ws/route.d.ts +25 -0
  131. package/dist/app/ws/route.js +29 -0
  132. package/dist/app/ws/ws.d.ts +31 -0
  133. package/dist/app/ws/ws.js +169 -0
  134. package/dist/board/canvas-chat.d.ts +97 -0
  135. package/dist/board/canvas-chat.js +175 -0
  136. package/dist/board/card-guards.d.ts +15 -0
  137. package/dist/board/card-guards.js +38 -0
  138. package/dist/board/cards/canvas.d.ts +41 -0
  139. package/dist/board/cards/canvas.js +83 -0
  140. package/dist/{cards → board/cards}/choice.js +0 -12
  141. package/dist/{cards → board/cards}/code.js +0 -3
  142. package/dist/board/cards/dictation.d.ts +42 -0
  143. package/dist/board/cards/dictation.js +105 -0
  144. package/dist/board/cards/docs.d.ts +47 -0
  145. package/dist/board/cards/docs.js +152 -0
  146. package/dist/{cards → board/cards}/image.js +1 -10
  147. package/dist/board/cards/index.d.ts +62 -0
  148. package/dist/board/cards/index.js +144 -0
  149. package/dist/{cards → board/cards}/kind.d.ts +10 -4
  150. package/dist/board/cards/kind.js +9 -0
  151. package/dist/board/cards/lecture.d.ts +26 -0
  152. package/dist/board/cards/lecture.js +62 -0
  153. package/dist/board/cards/paint.d.ts +38 -0
  154. package/dist/board/cards/paint.js +85 -0
  155. package/dist/board/cards/photo.d.ts +15 -0
  156. package/dist/board/cards/photo.js +29 -0
  157. package/dist/{cards → board/cards}/read.js +1 -10
  158. package/dist/board/cards/text.d.ts +20 -0
  159. package/dist/board/cards/text.js +59 -0
  160. package/dist/board/cards/tianzige.d.ts +16 -0
  161. package/dist/board/cards/tianzige.js +64 -0
  162. package/dist/board/cards/tutor.d.ts +72 -0
  163. package/dist/board/cards/tutor.js +134 -0
  164. package/dist/board/cards/word.d.ts +20 -0
  165. package/dist/board/cards/word.js +76 -0
  166. package/dist/board/lecture.d.ts +100 -0
  167. package/dist/board/lecture.js +204 -0
  168. package/dist/board/paper.d.ts +20 -0
  169. package/dist/board/paper.js +76 -0
  170. package/dist/board/parse.d.ts +120 -0
  171. package/dist/board/parse.js +330 -0
  172. package/dist/board/presentation.d.ts +295 -0
  173. package/dist/board/presentation.js +615 -0
  174. package/dist/board/sections.d.ts +16 -0
  175. package/dist/board/sections.js +130 -0
  176. package/dist/brain/api-tools.d.ts +8 -0
  177. package/dist/brain/api-tools.js +190 -0
  178. package/dist/brain/api.d.ts +62 -0
  179. package/dist/brain/api.js +411 -0
  180. package/dist/brain/cli/adapters.d.ts +60 -0
  181. package/dist/brain/cli/adapters.js +91 -0
  182. package/dist/brain/cli/qwen.d.ts +11 -0
  183. package/dist/brain/cli/qwen.js +141 -0
  184. package/dist/brain/cli/run-plan.d.ts +59 -0
  185. package/dist/brain/cli/run-plan.js +71 -0
  186. package/dist/brain/cli/run.d.ts +35 -0
  187. package/dist/brain/cli/run.js +256 -0
  188. package/dist/brain/cli/stream-json.d.ts +18 -0
  189. package/dist/brain/cli/stream-json.js +86 -0
  190. package/dist/brain/cli/types.d.ts +144 -0
  191. package/dist/brain/cli/types.js +3 -0
  192. package/dist/brain/cli/warm.d.ts +53 -0
  193. package/dist/brain/cli/warm.js +103 -0
  194. package/dist/brain/index.d.ts +145 -0
  195. package/dist/brain/index.js +74 -0
  196. package/dist/brain/stream.d.ts +20 -0
  197. package/dist/brain/stream.js +70 -0
  198. package/dist/brain/transcript.d.ts +45 -0
  199. package/dist/brain/transcript.js +132 -0
  200. package/dist/chalk/actions.d.ts +37 -0
  201. package/dist/chalk/actions.js +69 -0
  202. package/dist/chalk/bundle.d.ts +26 -0
  203. package/dist/chalk/bundle.js +69 -0
  204. package/dist/chalk/check.d.ts +28 -0
  205. package/dist/chalk/check.js +291 -0
  206. package/dist/chalk/circle.d.ts +64 -0
  207. package/dist/chalk/circle.js +193 -0
  208. package/dist/chalk/clock.d.ts +84 -0
  209. package/dist/chalk/clock.js +84 -0
  210. package/dist/chalk/geometry.d.ts +44 -0
  211. package/dist/chalk/geometry.js +139 -0
  212. package/dist/chalk/glyphs/capitals.d.ts +12 -0
  213. package/dist/chalk/glyphs/capitals.js +264 -0
  214. package/dist/chalk/glyphs/index.d.ts +21 -0
  215. package/dist/chalk/glyphs/index.js +18 -0
  216. package/dist/chalk/glyphs/letters.d.ts +13 -0
  217. package/dist/chalk/glyphs/letters.js +280 -0
  218. package/dist/chalk/glyphs/metrics.d.ts +33 -0
  219. package/dist/chalk/glyphs/metrics.js +28 -0
  220. package/dist/chalk/glyphs/registry.d.ts +7 -0
  221. package/dist/chalk/glyphs/registry.js +8 -0
  222. package/dist/chalk/glyphs/sample.d.ts +32 -0
  223. package/dist/chalk/glyphs/sample.js +102 -0
  224. package/dist/chalk/glyphs/skeleton.d.ts +64 -0
  225. package/dist/chalk/glyphs/skeleton.js +126 -0
  226. package/dist/chalk/glyphs/types.d.ts +58 -0
  227. package/dist/chalk/glyphs/types.js +17 -0
  228. package/dist/chalk/index.d.ts +23 -0
  229. package/dist/chalk/index.js +15 -0
  230. package/dist/chalk/manifest.d.ts +41 -0
  231. package/dist/chalk/manifest.js +6 -0
  232. package/dist/chalk/paint.d.ts +180 -0
  233. package/dist/chalk/paint.js +210 -0
  234. package/dist/chalk/pointer.d.ts +8 -0
  235. package/dist/chalk/pointer.js +21 -0
  236. package/dist/chalk/prepare.d.ts +11 -0
  237. package/dist/chalk/prepare.js +15 -0
  238. package/dist/chalk/scene-schema.d.ts +199 -0
  239. package/dist/chalk/scene-schema.js +91 -0
  240. package/dist/chalk/seed.d.ts +3 -0
  241. package/dist/chalk/seed.js +10 -0
  242. package/dist/chalk/text-metrics.d.ts +8 -0
  243. package/dist/chalk/text-metrics.js +156 -0
  244. package/dist/chalk/timeline.d.ts +47 -0
  245. package/dist/chalk/timeline.js +84 -0
  246. package/dist/chalk/types.d.ts +150 -0
  247. package/dist/chalk/types.js +8 -0
  248. package/dist/lib/index.d.ts +14 -12
  249. package/dist/lib/index.js +14 -12
  250. package/dist/media/draw.d.ts +23 -0
  251. package/dist/media/draw.js +44 -0
  252. package/dist/media/mp3.d.ts +6 -0
  253. package/dist/media/mp3.js +58 -0
  254. package/dist/media/mp4.d.ts +1 -0
  255. package/dist/media/mp4.js +58 -0
  256. package/dist/media/tts-voices.d.ts +18 -0
  257. package/dist/media/tts-voices.js +606 -0
  258. package/dist/media/tts.d.ts +56 -0
  259. package/dist/media/tts.js +174 -0
  260. package/dist/media/vision.d.ts +25 -0
  261. package/dist/media/vision.js +71 -0
  262. package/dist/memory/commit.d.ts +67 -0
  263. package/dist/memory/commit.js +130 -0
  264. package/dist/memory/context.d.ts +86 -0
  265. package/dist/memory/context.js +97 -0
  266. package/dist/memory/diary.d.ts +84 -0
  267. package/dist/memory/diary.js +183 -0
  268. package/dist/memory/grade.d.ts +2 -0
  269. package/dist/memory/grade.js +7 -0
  270. package/dist/{lib → memory}/plan.d.ts +1 -1
  271. package/dist/{lib → memory}/plan.js +1 -1
  272. package/dist/memory/proposals.d.ts +11 -0
  273. package/dist/memory/proposals.js +43 -0
  274. package/dist/memory/retrieval.d.ts +44 -0
  275. package/dist/memory/retrieval.js +157 -0
  276. package/dist/{lib → memory}/timetable.d.ts +0 -3
  277. package/dist/{lib → memory}/timetable.js +0 -11
  278. package/dist/memory/vault-notes.d.ts +165 -0
  279. package/dist/memory/vault-notes.js +359 -0
  280. package/dist/memory/vault.d.ts +70 -0
  281. package/dist/memory/vault.js +169 -0
  282. package/dist/realtime/bailian.d.ts +120 -0
  283. package/dist/realtime/bailian.js +288 -0
  284. package/dist/realtime/cues.d.ts +51 -0
  285. package/dist/realtime/cues.js +94 -0
  286. package/dist/realtime/listen.d.ts +32 -0
  287. package/dist/realtime/listen.js +53 -0
  288. package/dist/realtime/preview.d.ts +23 -0
  289. package/dist/realtime/preview.js +38 -0
  290. package/dist/realtime/prompt.d.ts +8 -0
  291. package/dist/realtime/prompt.js +13 -0
  292. package/dist/realtime/voices.d.ts +19 -0
  293. package/dist/realtime/voices.js +71 -0
  294. package/dist/runtime/activities.d.ts +17 -0
  295. package/dist/runtime/activities.js +46 -0
  296. package/dist/runtime/activity-state.d.ts +22 -0
  297. package/dist/runtime/activity-state.js +83 -0
  298. package/dist/runtime/activity.d.ts +63 -0
  299. package/dist/runtime/activity.js +428 -0
  300. package/dist/runtime/agent-file.d.ts +24 -0
  301. package/dist/runtime/agent-file.js +59 -0
  302. package/dist/runtime/auto-bookkeep.d.ts +30 -0
  303. package/dist/runtime/auto-bookkeep.js +84 -0
  304. package/dist/{lib → runtime/context}/context-pack.d.ts +3 -3
  305. package/dist/runtime/context/context-pack.js +182 -0
  306. package/dist/runtime/context/thread-digest.d.ts +4 -0
  307. package/dist/runtime/context/thread-digest.js +35 -0
  308. package/dist/runtime/context/tutor-rules.d.ts +25 -0
  309. package/dist/runtime/context/tutor-rules.js +47 -0
  310. package/dist/runtime/delivery/delivery.d.ts +94 -0
  311. package/dist/runtime/delivery/delivery.js +145 -0
  312. package/dist/runtime/delivery/playback.d.ts +25 -0
  313. package/dist/runtime/delivery/playback.js +29 -0
  314. package/dist/runtime/delivery/player.d.ts +145 -0
  315. package/dist/runtime/delivery/player.js +221 -0
  316. package/dist/runtime/delivery/queue.d.ts +89 -0
  317. package/dist/runtime/delivery/queue.js +59 -0
  318. package/dist/runtime/home/edit.d.ts +39 -0
  319. package/dist/runtime/home/edit.js +132 -0
  320. package/dist/runtime/home/home.d.ts +180 -0
  321. package/dist/runtime/home/home.js +311 -0
  322. package/dist/runtime/home/store.d.ts +142 -0
  323. package/dist/runtime/home/store.js +440 -0
  324. package/dist/runtime/journal/conversation.d.ts +46 -0
  325. package/dist/runtime/journal/conversation.js +89 -0
  326. package/dist/runtime/journal/events.d.ts +27 -0
  327. package/dist/runtime/journal/events.js +136 -0
  328. package/dist/runtime/journal/kid-log.d.ts +105 -0
  329. package/dist/runtime/journal/kid-log.js +133 -0
  330. package/dist/runtime/journal/ledger.d.ts +17 -0
  331. package/dist/{lib → runtime/journal}/ledger.js +7 -40
  332. package/dist/runtime/journal/mix.d.ts +33 -0
  333. package/dist/runtime/journal/mix.js +88 -0
  334. package/dist/runtime/journal/mouth-index.d.ts +26 -0
  335. package/dist/runtime/journal/mouth-index.js +34 -0
  336. package/dist/runtime/journal/mouth.d.ts +54 -0
  337. package/dist/runtime/journal/mouth.js +102 -0
  338. package/dist/runtime/journal/recorder.d.ts +46 -0
  339. package/dist/runtime/journal/recorder.js +58 -0
  340. package/dist/runtime/journal/store.d.ts +123 -0
  341. package/dist/runtime/journal/store.js +316 -0
  342. package/dist/runtime/kid-input.d.ts +16 -0
  343. package/dist/runtime/kid-input.js +195 -0
  344. package/dist/runtime/kid-view.d.ts +124 -0
  345. package/dist/runtime/kid-view.js +157 -0
  346. package/dist/runtime/lecture.d.ts +86 -0
  347. package/dist/runtime/lecture.js +237 -0
  348. package/dist/runtime/live/call.d.ts +219 -0
  349. package/dist/runtime/live/call.js +1211 -0
  350. package/dist/runtime/live/turns.d.ts +48 -0
  351. package/dist/runtime/live/turns.js +102 -0
  352. package/dist/runtime/runner.d.ts +289 -0
  353. package/dist/runtime/runner.js +898 -0
  354. package/dist/runtime/talk-run.d.ts +21 -0
  355. package/dist/runtime/talk-run.js +34 -0
  356. package/dist/scenes/dictation/match.d.ts +57 -0
  357. package/dist/scenes/dictation/match.js +255 -0
  358. package/dist/scenes/dictation/recognize.d.ts +86 -0
  359. package/dist/scenes/dictation/recognize.js +163 -0
  360. package/dist/scenes/dictation/store.d.ts +112 -0
  361. package/dist/scenes/dictation/store.js +99 -0
  362. package/dist/scenes/look.d.ts +26 -0
  363. package/dist/scenes/look.js +1 -0
  364. package/dist/scenes/paint/painter.d.ts +84 -0
  365. package/dist/scenes/paint/painter.js +170 -0
  366. package/dist/scenes/paint/prompt.d.ts +23 -0
  367. package/dist/scenes/paint/prompt.js +36 -0
  368. package/dist/scenes/talk/en-words.d.ts +8 -0
  369. package/dist/scenes/talk/en-words.js +44 -0
  370. package/dist/scenes/talk/list.d.ts +44 -0
  371. package/dist/scenes/talk/list.js +88 -0
  372. package/dist/scenes/talk/store.d.ts +27 -0
  373. package/dist/scenes/talk/store.js +61 -0
  374. package/dist/scenes/talk/warmup.d.ts +16 -0
  375. package/dist/scenes/talk/warmup.js +39 -0
  376. package/dist/schema/activity.d.ts +149 -0
  377. package/dist/schema/activity.js +113 -0
  378. package/dist/schema/board.d.ts +143 -2
  379. package/dist/schema/board.js +15 -3
  380. package/dist/schema/config.d.ts +309 -94
  381. package/dist/schema/config.js +259 -72
  382. package/dist/schema/context-pack.d.ts +76 -14
  383. package/dist/schema/context-pack.js +91 -10
  384. package/dist/{lib/conversation.d.ts → schema/conversation-files.d.ts} +11 -33
  385. package/dist/schema/conversation-files.js +26 -0
  386. package/dist/schema/conversation.d.ts +385 -49
  387. package/dist/schema/conversation.js +135 -19
  388. package/dist/schema/events.d.ts +138 -0
  389. package/dist/schema/events.js +1 -0
  390. package/dist/schema/home.d.ts +46 -0
  391. package/dist/schema/home.js +30 -0
  392. package/dist/schema/index.d.ts +14 -3
  393. package/dist/schema/index.js +14 -3
  394. package/dist/schema/kid-device.d.ts +20 -0
  395. package/dist/schema/kid-device.js +32 -0
  396. package/dist/schema/ledger.d.ts +8 -63
  397. package/dist/schema/ledger.js +7 -31
  398. package/dist/schema/memory.d.ts +73 -0
  399. package/dist/schema/memory.js +47 -0
  400. package/dist/schema/plan.d.ts +2 -2
  401. package/dist/schema/plan.js +2 -2
  402. package/dist/schema/sections.d.ts +32 -25
  403. package/dist/schema/sections.js +21 -22
  404. package/dist/schema/theme.d.ts +25 -0
  405. package/dist/schema/theme.js +26 -0
  406. package/dist/schema/timetable.d.ts +2 -2
  407. package/dist/schema/timetable.js +2 -2
  408. package/dist/schema/workspace.d.ts +41 -0
  409. package/dist/schema/workspace.js +9 -0
  410. package/dist/shared/errors.d.ts +8 -0
  411. package/dist/shared/errors.js +13 -0
  412. package/dist/shared/home.d.ts +2 -0
  413. package/dist/shared/home.js +16 -0
  414. package/dist/shared/human-notes.d.ts +5 -0
  415. package/dist/shared/human-notes.js +7 -0
  416. package/dist/shared/qianwen.d.ts +50 -0
  417. package/dist/shared/qianwen.js +109 -0
  418. package/dist/shared/time.d.ts +9 -0
  419. package/dist/shared/time.js +22 -0
  420. package/dist/shared/tokens.d.ts +18 -0
  421. package/dist/shared/tokens.js +11 -0
  422. package/dist/shared/wav.d.ts +10 -0
  423. package/dist/shared/wav.js +50 -0
  424. package/dist/stage/chunk-226TNLQA.js +129 -0
  425. package/dist/stage/chunk-24LGQEKE.js +1 -0
  426. package/dist/stage/chunk-25XV6UY3.js +10 -0
  427. package/dist/stage/chunk-2AZI3NHJ.js +1 -0
  428. package/dist/stage/chunk-2BQZTTBE.js +1 -0
  429. package/dist/stage/chunk-2M7CGY3Y.js +11 -0
  430. package/dist/stage/chunk-2VR4WFQ7.js +10 -0
  431. package/dist/stage/chunk-2ZYXBUWG.js +9 -0
  432. package/dist/stage/chunk-32LAWMGY.js +1 -0
  433. package/dist/stage/chunk-3LEMTSOO.js +11 -0
  434. package/dist/stage/chunk-3QCKGZYE.js +32 -0
  435. package/dist/stage/chunk-44P66WFA.js +1 -0
  436. package/dist/stage/chunk-4AM6FRR6.js +7 -0
  437. package/dist/stage/chunk-4QDE4SUK.js +1 -0
  438. package/dist/stage/chunk-4QESHV3U.js +1 -0
  439. package/dist/stage/chunk-4SG5QPHB.js +2 -0
  440. package/dist/stage/chunk-4T4UVCOC.js +1 -0
  441. package/dist/stage/chunk-4WUEPPG3.js +34 -0
  442. package/dist/stage/chunk-4YCN6UZ5.js +99 -0
  443. package/dist/stage/chunk-5V7ZY2AP.js +1 -0
  444. package/dist/stage/chunk-5VS5Y2VJ.js +6 -0
  445. package/dist/stage/chunk-5W4NO2ZD.js +62 -0
  446. package/dist/stage/chunk-65CRNICM.js +1 -0
  447. package/dist/stage/chunk-66MULO7F.js +5 -0
  448. package/dist/stage/chunk-6COFQTBS.js +162 -0
  449. package/dist/stage/chunk-6VZG3M3I.js +8 -0
  450. package/dist/stage/chunk-7HVDH43T.js +1 -0
  451. package/dist/stage/chunk-7JLJN4EZ.js +8 -0
  452. package/dist/stage/chunk-7QDSP4LN.js +1 -0
  453. package/dist/stage/chunk-7R6OQAO3.js +1 -0
  454. package/dist/stage/chunk-7VTTHZKW.js +7 -0
  455. package/dist/stage/chunk-ATHR5KEN.js +10 -0
  456. package/dist/stage/chunk-B6R5LTP2.js +36 -0
  457. package/dist/stage/chunk-BD4WE264.js +1 -0
  458. package/dist/stage/chunk-BONANU47.js +206 -0
  459. package/dist/stage/chunk-BTVW7OFK.js +89 -0
  460. package/dist/stage/chunk-BUTJIDHG.js +8 -0
  461. package/dist/stage/chunk-C2IPYMML.js +84 -0
  462. package/dist/stage/chunk-C54FTPPV.js +9 -0
  463. package/dist/stage/chunk-C6LOUF2Z.js +90 -0
  464. package/dist/stage/chunk-CFF3PILO.js +339 -0
  465. package/dist/stage/chunk-CI2FQ2JY.js +9 -0
  466. package/dist/stage/chunk-CW5O4RV7.js +12 -0
  467. package/dist/stage/chunk-CYABNQYD.js +1 -0
  468. package/dist/stage/chunk-D7FFA4NS.js +15 -0
  469. package/dist/stage/chunk-DUNNXU6Z.js +8 -0
  470. package/dist/stage/chunk-E3E4Q6JF.js +6 -0
  471. package/dist/stage/chunk-EB3U3LH7.js +9 -0
  472. package/dist/stage/chunk-EGSZ736B.js +8 -0
  473. package/dist/stage/chunk-EOBXW5VQ.js +2 -0
  474. package/dist/stage/chunk-ERZC3B7Y.js +11 -0
  475. package/dist/stage/chunk-ESDOOBIH.js +11 -0
  476. package/dist/stage/chunk-EVU4QAL4.js +178 -0
  477. package/dist/stage/chunk-EVVZI2NY.js +39 -0
  478. package/dist/stage/chunk-FBKAZUKD.js +39 -0
  479. package/dist/stage/chunk-FDVKYQJN.js +1 -0
  480. package/dist/stage/chunk-FGPVYHVR.js +5 -0
  481. package/dist/stage/chunk-FHUD4AZC.js +1 -0
  482. package/dist/stage/chunk-FKUJ2DMY.js +96 -0
  483. package/dist/stage/chunk-FNZGVIJV.js +1 -0
  484. package/dist/stage/chunk-GBYSEGYM.js +78 -0
  485. package/dist/stage/chunk-GCO4TDHX.js +1 -0
  486. package/dist/stage/chunk-GKTML2LG.js +10 -0
  487. package/dist/stage/chunk-GMDIHHXQ.js +11 -0
  488. package/dist/stage/chunk-GOUNACI3.js +10 -0
  489. package/dist/stage/chunk-GXAYATPF.js +3 -0
  490. package/dist/stage/chunk-H2K2DDXV.js +8 -0
  491. package/dist/stage/chunk-H3UJI6ZY.js +13 -0
  492. package/dist/stage/chunk-H6PUGCME.js +7 -0
  493. package/dist/stage/chunk-HNBUIMIG.js +1 -0
  494. package/dist/stage/chunk-HRZY2BJQ.js +10 -0
  495. package/dist/stage/chunk-HSPJGALW.js +30 -0
  496. package/dist/stage/chunk-IBYORHIP.js +25 -0
  497. package/dist/stage/chunk-IHF4EWTY.js +1 -0
  498. package/dist/stage/chunk-ISBRPNKI.js +1 -0
  499. package/dist/stage/chunk-IZ3OI3C2.js +2 -0
  500. package/dist/stage/chunk-JEFZAC2R.js +1 -0
  501. package/dist/stage/chunk-JFIGRDPO.js +1 -0
  502. package/dist/stage/chunk-JFVYBOOC.js +9 -0
  503. package/dist/stage/chunk-JGD4TUTQ.js +1 -0
  504. package/dist/stage/chunk-JO4BEHDH.js +4 -0
  505. package/dist/stage/chunk-JOWBS42C.js +1 -0
  506. package/dist/stage/chunk-JP3TM2TG.js +1 -0
  507. package/dist/stage/chunk-JVK2C52O.js +1 -0
  508. package/dist/stage/chunk-K4I76XBX.js +14 -0
  509. package/dist/stage/chunk-KA6CZZ4M.js +1 -0
  510. package/dist/stage/chunk-KESSJ36M.js +1 -0
  511. package/dist/stage/chunk-LKATEVRU.js +1 -0
  512. package/dist/stage/chunk-LS4EJ2EI.js +1 -0
  513. package/dist/stage/chunk-LUKJQC2X.js +70 -0
  514. package/dist/stage/chunk-LWULR3SM.js +1 -0
  515. package/dist/stage/chunk-LWVRFMKX.js +2 -0
  516. package/dist/stage/chunk-LXC4ZBPZ.js +1 -0
  517. package/dist/stage/chunk-M2UP255H.js +1 -0
  518. package/dist/stage/chunk-MAPPXUZQ.js +231 -0
  519. package/dist/stage/chunk-MBMPW7Z5.js +1 -0
  520. package/dist/stage/chunk-MD3HMMTK.js +1 -0
  521. package/dist/stage/chunk-MLPCUIKR.js +17 -0
  522. package/dist/stage/chunk-MNQIRPDQ.js +8 -0
  523. package/dist/stage/chunk-MRG7MJVS.js +1 -0
  524. package/dist/stage/chunk-MU6EXW72.js +10 -0
  525. package/dist/stage/chunk-MVU2X6LU.js +4 -0
  526. package/dist/stage/chunk-N6UA5CZV.js +36 -0
  527. package/dist/stage/chunk-NLZIT2TJ.js +7 -0
  528. package/dist/stage/chunk-NOJR3J7M.js +1 -0
  529. package/dist/stage/chunk-NT7ARDOL.js +1 -0
  530. package/dist/stage/chunk-NWOGMPZH.js +1 -0
  531. package/dist/stage/chunk-NXE4KMG3.js +40 -0
  532. package/dist/stage/chunk-O4YCZXD2.js +257 -0
  533. package/dist/stage/chunk-OAJZ7HLK.js +1 -0
  534. package/dist/stage/chunk-OCFCFASO.js +1 -0
  535. package/dist/stage/chunk-ODGPG5RY.js +7 -0
  536. package/dist/stage/chunk-ODUEA52Q.js +3 -0
  537. package/dist/stage/chunk-OGDJ3FCI.js +1 -0
  538. package/dist/stage/chunk-OLDJ55TT.js +1 -0
  539. package/dist/stage/chunk-OOCL4ATI.js +2 -0
  540. package/dist/stage/chunk-OQEFDUDV.js +1 -0
  541. package/dist/stage/chunk-OQWVEWG7.js +4 -0
  542. package/dist/stage/chunk-OUIX6BGK.js +1 -0
  543. package/dist/stage/chunk-OV7OZYUO.js +7 -0
  544. package/dist/stage/chunk-PFGDY33O.js +1 -0
  545. package/dist/stage/chunk-PFJDUJB3.js +139 -0
  546. package/dist/stage/chunk-PGEW76ER.js +1 -0
  547. package/dist/stage/chunk-PP76TAQX.js +32 -0
  548. package/dist/stage/chunk-PTBOP4OT.js +2 -0
  549. package/dist/stage/chunk-PX2RVHCK.js +1 -0
  550. package/dist/stage/chunk-Q7K3PNAD.js +1 -0
  551. package/dist/stage/chunk-QDDPLZDB.js +1 -0
  552. package/dist/stage/chunk-QLGLZ77F.js +1 -0
  553. package/dist/stage/chunk-QOPFDFHI.js +1 -0
  554. package/dist/stage/chunk-QXT4KAEJ.js +1 -0
  555. package/dist/stage/chunk-R4YVZCIT.js +1 -0
  556. package/dist/stage/chunk-R6P6EHWA.js +62 -0
  557. package/dist/stage/chunk-RCH3OXBI.js +9 -0
  558. package/dist/stage/chunk-RHPE44I2.js +1 -0
  559. package/dist/stage/chunk-RJ2R4FVC.js +1 -0
  560. package/dist/stage/chunk-RJH2YVTD.js +1 -0
  561. package/dist/stage/chunk-RLWWW5OB.js +6 -0
  562. package/dist/stage/chunk-S3WO35Z7.js +120 -0
  563. package/dist/stage/chunk-S7ZGX6MW.js +1 -0
  564. package/dist/stage/chunk-SIAWX27B.js +1 -0
  565. package/dist/stage/chunk-SLG4X622.js +1 -0
  566. package/dist/stage/chunk-SLJRBC77.js +168 -0
  567. package/dist/stage/chunk-SRORWQJZ.js +1 -0
  568. package/dist/stage/chunk-STZTUIIF.js +2 -0
  569. package/dist/stage/chunk-SVQ6MWNV.js +9 -0
  570. package/dist/stage/chunk-TL3HLL2S.js +132 -0
  571. package/dist/stage/chunk-U3DOE6SF.js +24 -0
  572. package/dist/stage/chunk-UABQIZKW.js +6 -0
  573. package/dist/stage/chunk-UDK3R764.js +1 -0
  574. package/dist/stage/chunk-UFF4E54B.js +41 -0
  575. package/dist/stage/chunk-UFP5Q4AY.js +1 -0
  576. package/dist/stage/chunk-UMH2TSW2.js +72 -0
  577. package/dist/stage/chunk-UTASVNF5.js +10 -0
  578. package/dist/stage/chunk-UW7ML5ML.js +88 -0
  579. package/dist/stage/chunk-V3J7F6OP.js +1 -0
  580. package/dist/stage/chunk-VEHP5B5Q.js +5 -0
  581. package/dist/stage/chunk-VRXWB733.js +9 -0
  582. package/dist/stage/chunk-VVDHBBS5.js +5 -0
  583. package/dist/stage/chunk-VYFOH6FU.js +106 -0
  584. package/dist/stage/chunk-W3VZTLQS.js +3 -0
  585. package/dist/stage/chunk-W7WNRWTZ.js +8 -0
  586. package/dist/stage/chunk-WHUCV53C.js +1 -0
  587. package/dist/stage/chunk-WULMYHIF.js +1 -0
  588. package/dist/stage/chunk-X54EX7AW.js +9 -0
  589. package/dist/stage/chunk-X565ISZM.js +1 -0
  590. package/dist/stage/chunk-XGZMDECB.js +1 -0
  591. package/dist/stage/chunk-XHONC4RF.js +172 -0
  592. package/dist/stage/chunk-XIK4XQ6E.js +24 -0
  593. package/dist/stage/chunk-XJQQWFTE.js +1 -0
  594. package/dist/stage/chunk-XM4WOU3I.js +13 -0
  595. package/dist/stage/chunk-XM7Y5HP5.js +38 -0
  596. package/dist/stage/chunk-XNYYRGD5.js +292 -0
  597. package/dist/stage/chunk-XOYVR3SV.js +1 -0
  598. package/dist/stage/chunk-XQIW5HCE.js +1 -0
  599. package/dist/stage/chunk-YEWL7FUW.js +8 -0
  600. package/dist/stage/chunk-YI55PY3V.js +1 -0
  601. package/dist/stage/chunk-YM63HI6W.js +1 -0
  602. package/dist/stage/chunk-YNLGLU4P.js +9 -0
  603. package/dist/stage/chunk-YTNMNOWP.js +1 -0
  604. package/dist/stage/chunk-YV62XKTC.js +1 -0
  605. package/dist/stage/chunk-YVBA3QW6.js +1 -0
  606. package/dist/stage/chunk-Z2SY2HOC.js +1 -0
  607. package/dist/stage/chunk-ZBTCQEBK.js +10 -0
  608. package/dist/stage/chunk-ZCUFN74D.js +1 -0
  609. package/dist/stage/chunk-ZHOULXEJ.js +11 -0
  610. package/dist/stage/chunk-ZTRZIET2.js +1 -0
  611. package/dist/stage/index.html +1 -0
  612. package/dist/stage/stage.css +1 -1
  613. package/dist/stage/stage.js +1 -4383
  614. package/dist/ui/dev/dev-page.d.ts +1 -0
  615. package/dist/ui/dev/dev-page.js +2248 -0
  616. package/dist/ui/dev/dev-theme.d.ts +6 -0
  617. package/dist/ui/dev/dev-theme.js +67 -0
  618. package/dist/ui/dev/qr-page.d.ts +8 -0
  619. package/dist/ui/dev/qr-page.js +61 -0
  620. package/dist/ui/dev/voice-gallery-page.d.ts +1 -0
  621. package/dist/ui/dev/voice-gallery-page.js +121 -0
  622. package/dist/ui/dev/voice-scenes.d.ts +21 -0
  623. package/dist/ui/dev/voice-scenes.js +30 -0
  624. package/dist/ui/dictation/en-box.d.ts +2 -0
  625. package/dist/ui/dictation/en-box.js +86 -0
  626. package/dist/ui/dictation/en-page.d.ts +1 -0
  627. package/dist/ui/dictation/en-page.js +484 -0
  628. package/dist/ui/dictation/page.d.ts +1 -0
  629. package/dist/ui/dictation/page.js +1084 -0
  630. package/dist/ui/dictation/parent-page.d.ts +1 -0
  631. package/dist/ui/dictation/parent-page.js +234 -0
  632. package/dist/ui/dictation/reel-mode.d.ts +1 -0
  633. package/dist/ui/dictation/reel-mode.js +87 -0
  634. package/dist/ui/dictation/reel-page.d.ts +1 -0
  635. package/dist/ui/dictation/reel-page.js +62 -0
  636. package/dist/ui/dictation/reel.d.ts +163 -0
  637. package/dist/ui/dictation/reel.js +436 -0
  638. package/dist/ui/dictation/ui.d.ts +44 -0
  639. package/dist/ui/dictation/ui.js +80 -0
  640. package/dist/ui/dictation/unlock.d.ts +7 -0
  641. package/dist/ui/dictation/unlock.js +16 -0
  642. package/dist/ui/kid/audio-client.d.ts +11 -0
  643. package/dist/ui/kid/audio-client.js +74 -0
  644. package/dist/ui/kid/board-mark-art.d.ts +37 -0
  645. package/dist/ui/kid/board-mark-art.js +5 -0
  646. package/dist/ui/kid/board-mark.d.ts +24 -0
  647. package/dist/ui/kid/board-mark.js +58 -0
  648. package/dist/ui/kid/kid-log.d.ts +15 -0
  649. package/dist/ui/kid/kid-log.js +87 -0
  650. package/dist/ui/kid/kid-nav.d.ts +11 -0
  651. package/dist/ui/kid/kid-nav.js +22 -0
  652. package/dist/ui/kid/kid-page.d.ts +9 -0
  653. package/dist/ui/kid/kid-page.js +3719 -0
  654. package/dist/ui/kid/letters.d.ts +26 -0
  655. package/dist/ui/kid/letters.js +51 -0
  656. package/dist/ui/kid/photo-edit.d.ts +83 -0
  657. package/dist/ui/kid/photo-edit.js +106 -0
  658. package/dist/ui/kid/photo-ui.d.ts +23 -0
  659. package/dist/ui/kid/photo-ui.js +60 -0
  660. package/dist/ui/kid/reel.d.ts +419 -0
  661. package/dist/ui/kid/reel.js +648 -0
  662. package/dist/ui/kid/tianzige.d.ts +8 -0
  663. package/dist/ui/kid/tianzige.js +45 -0
  664. package/dist/ui/kid/tutor-face.d.ts +35 -0
  665. package/dist/ui/kid/tutor-face.js +84 -0
  666. package/dist/ui/kid/voice-ui.d.ts +70 -0
  667. package/dist/ui/kid/voice-ui.js +316 -0
  668. package/dist/ui/kid/voice-view.d.ts +71 -0
  669. package/dist/ui/kid/voice-view.js +75 -0
  670. package/dist/ui/kid/word-draw.d.ts +2 -0
  671. package/dist/ui/kid/word-draw.js +107 -0
  672. package/dist/ui/kid/word-emoji.d.ts +10 -0
  673. package/dist/ui/kid/word-emoji.js +66 -0
  674. package/dist/ui/kid/word-layout.d.ts +25 -0
  675. package/dist/ui/kid/word-layout.js +29 -0
  676. package/dist/ui/parent/parent-home-page.d.ts +1 -0
  677. package/dist/ui/parent/parent-home-page.js +414 -0
  678. package/dist/ui/parent/parent-page.d.ts +2 -0
  679. package/dist/ui/parent/parent-page.js +507 -0
  680. package/dist/ui/shared/brand.d.ts +36 -0
  681. package/dist/ui/shared/brand.js +51 -0
  682. package/dist/ui/shared/favicon.d.ts +12 -0
  683. package/dist/ui/shared/favicon.js +96 -0
  684. package/dist/ui/shared/icon.d.ts +9 -0
  685. package/dist/ui/shared/icon.js +35 -0
  686. package/dist/ui/shared/inline-lib.d.ts +1 -0
  687. package/dist/ui/shared/inline-lib.js +28 -0
  688. package/dist/ui/shared/logo.d.ts +31 -0
  689. package/dist/ui/shared/logo.js +43 -0
  690. package/dist/ui/shared/page-dom.d.ts +12 -0
  691. package/dist/ui/shared/page-dom.js +36 -0
  692. package/dist/ui/shared/png.d.ts +1 -0
  693. package/dist/ui/shared/png.js +45 -0
  694. package/dist/ui/shared/qr-svg.d.ts +3 -0
  695. package/dist/ui/shared/qr-svg.js +32 -0
  696. package/dist/ui/shared/qr.d.ts +14 -0
  697. package/dist/ui/shared/qr.js +281 -0
  698. package/dist/ui/shared/reel-dock.d.ts +22 -0
  699. package/dist/ui/shared/reel-dock.js +365 -0
  700. package/dist/ui/shared/tutor-color.d.ts +15 -0
  701. package/dist/ui/shared/tutor-color.js +47 -0
  702. package/dist/ui/talk/page.d.ts +6 -0
  703. package/dist/ui/talk/page.js +294 -0
  704. package/grades/grade-2/README.md +11 -0
  705. package/grades/grade-2/VALIDATION.md +41 -0
  706. package/grades/grade-2/agents/chinese-tutor/activities//344/275/240/350/257/264/346/210/221/347/224/273.md +157 -0
  707. package/grades/grade-2/agents/chinese-tutor/activities//344/275/240/350/257/264/346/210/221/347/224/273./344/276/213/345/255/220.md +78 -0
  708. package/grades/grade-2/agents/chinese-tutor/activities//344/276/213/345/255/220/345/233/276//345/200/237/344/274/236.jpg +0 -0
  709. package/grades/grade-2/agents/chinese-tutor/activities//344/276/213/345/255/220/345/233/276//345/260/217/347/214/264/346/221/230/346/241/203.jpg +0 -0
  710. package/grades/grade-2/agents/chinese-tutor/activities//345/206/231/350/257/235.md +64 -0
  711. package/grades/grade-2/agents/chinese-tutor/activities//345/206/231/350/257/235./344/276/213/345/255/220.md +31 -0
  712. package/grades/grade-2/agents/chinese-tutor/activities//345/220/254/345/206/231.md +48 -0
  713. package/grades/grade-2/agents/chinese-tutor/activities//345/244/215/344/271/240.md +79 -0
  714. package/grades/grade-2/agents/chinese-tutor/activities//345/244/215/344/271/240./344/276/213/345/255/220.md +35 -0
  715. package/grades/grade-2/agents/chinese-tutor/activities//345/260/217/350/257/276/345/240/202.md +53 -0
  716. package/grades/grade-2/agents/chinese-tutor/activities//346/211/271/346/224/271.md +81 -0
  717. package/grades/grade-2/agents/chinese-tutor/activities//346/211/271/346/224/271./344/276/213/345/255/220.md +35 -0
  718. package/grades/grade-2/agents/chinese-tutor/activities//347/234/213/345/233/276/350/257/264/350/257/235.md +94 -0
  719. package/grades/grade-2/agents/chinese-tutor/activities//347/234/213/345/233/276/350/257/264/350/257/235./344/276/213/345/255/220.md +63 -0
  720. package/grades/grade-2/agents/chinese-tutor/activities//351/242/204/344/271/240.md +82 -0
  721. package/grades/grade-2/agents/chinese-tutor/activities//351/242/204/344/271/240./344/276/213/345/255/220.md +35 -0
  722. package/grades/grade-2/agents/chinese-tutor.md +59 -0
  723. package/grades/grade-2/agents/english-tutor/activities//345/217/243/350/257/255/350/257/276.md +149 -0
  724. package/grades/grade-2/agents/english-tutor/activities//345/217/243/350/257/255/350/257/276./344/276/213/345/255/220.md +13 -0
  725. package/grades/grade-2/agents/english-tutor/activities//345/220/254/345/206/231.md +47 -0
  726. package/grades/grade-2/agents/english-tutor/activities//345/244/215/344/271/240.md +78 -0
  727. package/grades/grade-2/agents/english-tutor/activities//345/244/215/344/271/240./344/276/213/345/255/220.md +35 -0
  728. package/grades/grade-2/agents/english-tutor/activities//345/260/217/350/257/276/345/240/202.md +53 -0
  729. package/grades/grade-2/agents/english-tutor/activities//346/211/271/346/224/271.md +80 -0
  730. package/grades/grade-2/agents/english-tutor/activities//346/211/271/346/224/271./344/276/213/345/255/220.md +35 -0
  731. package/grades/grade-2/agents/english-tutor/activities//351/242/204/344/271/240.md +86 -0
  732. package/grades/grade-2/agents/english-tutor/activities//351/242/204/344/271/240./344/276/213/345/255/220.md +35 -0
  733. package/grades/grade-2/agents/english-tutor.md +57 -0
  734. package/grades/grade-2/agents/math-tutor/activities//345/244/215/344/271/240.md +78 -0
  735. package/grades/grade-2/agents/math-tutor/activities//345/244/215/344/271/240./344/276/213/345/255/220.md +35 -0
  736. package/grades/grade-2/agents/math-tutor/activities//345/260/217/350/257/276/345/240/202.md +56 -0
  737. package/grades/grade-2/agents/math-tutor/activities//345/260/217/350/257/276/345/240/202./344/276/213/345/255/220.md +52 -0
  738. package/grades/grade-2/agents/math-tutor/activities//346/211/271/346/224/271.md +80 -0
  739. package/grades/grade-2/agents/math-tutor/activities//346/211/271/346/224/271./344/276/213/345/255/220.md +35 -0
  740. package/grades/grade-2/agents/math-tutor/activities//351/242/204/344/271/240.md +81 -0
  741. package/grades/grade-2/agents/math-tutor/activities//351/242/204/344/271/240./344/276/213/345/255/220.md +35 -0
  742. package/grades/grade-2/agents/math-tutor.md +51 -0
  743. package/grades/grade-2/examples/2026-10-27-pingjunfen/audio/index.json +44 -0
  744. package/grades/grade-2/examples/2026-10-27-pingjunfen/audio/step-1.mp3 +0 -0
  745. package/grades/grade-2/examples/2026-10-27-pingjunfen/audio/step-2.mp3 +0 -0
  746. package/grades/grade-2/examples/2026-10-27-pingjunfen/audio/step-3.mp3 +0 -0
  747. package/grades/grade-2/examples/2026-10-27-pingjunfen/audio/step-4.mp3 +0 -0
  748. package/grades/grade-2/examples/2026-10-27-pingjunfen/audio/step-5.mp3 +0 -0
  749. package/grades/grade-2/examples/2026-10-27-pingjunfen/bake.json +1 -0
  750. package/grades/grade-2/examples/2026-10-27-pingjunfen/manifest.json +63 -0
  751. package/grades/grade-2/examples/2026-10-27-pingjunfen/scene.json +247 -0
  752. package/grades/grade-2/examples/2026-10-27-pingjunfen.md +40 -0
  753. package/grades/grade-2/examples/2026-10-27-pingjunfen.ts +26 -0
  754. package/grades/grade-2/examples//345/271/263/345/235/207/345/210/206./344/276/213/345/255/220.md +24 -0
  755. package/grades/grade-2/examples//346/225/260/345/255/246/345/271/263/345/235/207/345/210/206.md +42 -0
  756. package/grades/grade-2/validation/2026-10-27.json +4410 -0
  757. package/package.json +26 -15
  758. package/skills/chalk-cli/SKILL.md +62 -0
  759. package/skills/chalk-scene/SKILL.md +91 -0
  760. package/skills/chalk-teaching/SKILL.md +82 -0
  761. package/skills/chalk-teaching/models//344/272/244/351/224/231/346/225/260/345/210/227/345/210/206/350/241/214.md +8 -0
  762. package/skills/chalk-teaching/models//345/207/221/345/215/201.md +7 -0
  763. package/skills/chalk-teaching/models//345/221/250/346/234/237/350/247/204/345/276/213.md +6 -0
  764. package/skills/chalk-teaching/models//345/256/236/347/211/251/345/233/276-/345/242/236/345/207/217.md +6 -0
  765. package/skills/chalk-teaching/models//345/256/236/347/211/251/345/233/276-/346/257/224/345/244/232/345/260/221-/346/261/202/345/244/247/346/225/260/346/261/202/345/260/217/346/225/260.md +7 -0
  766. package/skills/chalk-teaching/models//345/256/236/347/211/251/345/233/276-/346/257/224/345/244/232/345/260/221-/346/261/202/345/267/256.md +6 -0
  767. package/skills/chalk-teaching/models//345/260/217/346/243/222/350/277/233/344/275/215/345/212/240.md +7 -0
  768. package/skills/chalk-teaching/models//345/260/217/346/243/222/351/200/200/344/275/215/345/207/217.md +6 -0
  769. package/skills/chalk-teaching/models//346/216/222/351/230/237/347/202/271/351/230/265.md +7 -0
  770. package/skills/chalk-teaching/models//346/227/266/351/227/264/346/225/260/350/275/264.md +6 -0
  771. package/skills/chalk-teaching/models//346/245/274/345/261/202/351/227/264/351/232/224/345/233/276.md +7 -0
  772. package/skills/chalk-teaching/models//347/240/264/345/215/201.md +7 -0
  773. package/skills/chalk-teaching/models//347/253/226/345/274/217/351/200/200/344/275/215.md +6 -0
  774. package/skills/chalk-teaching/models//347/272/277/346/256/265/345/233/276.md +7 -0
  775. package/skills/chalk-teaching/models-index.md +24 -0
  776. package/skills/chalk-teaching/references//350/256/262/350/247/243/346/250/241/346/235/277/344/270/211/346/241/243.md +32 -0
  777. package/skills/chalk-teaching/references//350/257/264/346/230/216/346/226/207/344/273/266.md +102 -0
  778. package/skills/chalk-verify/SKILL.md +57 -0
  779. package/skills/chalk-verify/references//350/257/204/345/210/244/346/240/207/345/207/206.md +69 -0
  780. package/skills/cotutor-analyze/SKILL.md +106 -0
  781. package/skills/cotutor-analyze/references//345/221/275/344/273/244/344/270/216/346/226/207/344/273/266.md +31 -0
  782. package/skills/cotutor-board/SKILL.md +373 -0
  783. package/skills/cotutor-board/references/README.md +38 -0
  784. package/skills/cotutor-board/references/canvas.md +68 -0
  785. package/skills/cotutor-board/references/choice.md +55 -0
  786. package/skills/cotutor-board/references/code.md +46 -0
  787. package/skills/cotutor-board/references/image.md +52 -0
  788. package/skills/cotutor-board/references/lecture.md +69 -0
  789. package/skills/cotutor-board/references/paint.md +77 -0
  790. package/skills/cotutor-board/references/photo.md +61 -0
  791. package/skills/cotutor-board/references/read.md +51 -0
  792. package/skills/cotutor-board/references/text.md +69 -0
  793. package/skills/cotutor-board/references/tianzige.md +78 -0
  794. package/skills/cotutor-board/references/word.md +91 -0
  795. package/skills/cotutor-home/SKILL.md +169 -0
  796. package/skills/cotutor-home/references/dictation.md +97 -0
  797. package/skills/cotutor-home/references/tutor.md +148 -0
  798. package/skills/cotutor-home/references//345/221/275/344/273/244.md +21 -0
  799. package/skills/cotutor-home/references//351/246/226/351/241/265/350/257/255/346/263/225.md +142 -0
  800. package/skills/cotutor-tune/SKILL.md +147 -0
  801. package/skills/cotutor-tune/references//345/255/227/346/256/265.md +50 -0
  802. package/skills/cotutor-tutor/SKILL.md +261 -0
  803. package/skills/cotutor-tutor/references//344/270/212/344/270/213/346/226/207/345/214/205.md +78 -0
  804. package/themes/default/kid.css +86 -0
  805. package/themes/default/theme.json +26 -0
  806. package/agents/chinese-tutor.md +0 -67
  807. package/agents/homework-tutor.md +0 -17
  808. package/agents/math-tutor.md +0 -68
  809. package/agents/planner.md +0 -18
  810. package/agents/reading-tutor.md +0 -65
  811. package/agents/scene-maker.md +0 -41
  812. package/dist/cards/canvas.d.ts +0 -22
  813. package/dist/cards/canvas.js +0 -65
  814. package/dist/cards/fill.d.ts +0 -14
  815. package/dist/cards/fill.js +0 -64
  816. package/dist/cards/index.d.ts +0 -48
  817. package/dist/cards/index.js +0 -115
  818. package/dist/cards/kind.js +0 -7
  819. package/dist/cards/scene.d.ts +0 -24
  820. package/dist/cards/scene.js +0 -67
  821. package/dist/cards/text.d.ts +0 -18
  822. package/dist/cards/text.js +0 -41
  823. package/dist/cli/doctor.js +0 -355
  824. package/dist/cli/init.js +0 -116
  825. package/dist/cli/main.js +0 -243
  826. package/dist/cli/serve.js +0 -56
  827. package/dist/cli/skeleton.d.ts +0 -39
  828. package/dist/cli/skeleton.js +0 -184
  829. package/dist/cli/skills.d.ts +0 -40
  830. package/dist/cli/skills.js +0 -170
  831. package/dist/cli/workspace.d.ts +0 -69
  832. package/dist/lib/agent-file.d.ts +0 -10
  833. package/dist/lib/agent-file.js +0 -16
  834. package/dist/lib/board.d.ts +0 -15
  835. package/dist/lib/board.js +0 -107
  836. package/dist/lib/context-pack.js +0 -55
  837. package/dist/lib/conversation.js +0 -88
  838. package/dist/lib/kid-board.d.ts +0 -148
  839. package/dist/lib/kid-board.js +0 -294
  840. package/dist/lib/kid-view.d.ts +0 -63
  841. package/dist/lib/kid-view.js +0 -93
  842. package/dist/lib/ledger.d.ts +0 -29
  843. package/dist/lib/run-plan.d.ts +0 -30
  844. package/dist/lib/run-plan.js +0 -32
  845. package/dist/lib/sections.d.ts +0 -12
  846. package/dist/lib/sections.js +0 -151
  847. package/dist/lib/stream.d.ts +0 -15
  848. package/dist/lib/stream.js +0 -69
  849. package/dist/lib/transcript.d.ts +0 -36
  850. package/dist/lib/transcript.js +0 -95
  851. package/dist/server/app.d.ts +0 -74
  852. package/dist/server/app.js +0 -406
  853. package/dist/server/kid-page.d.ts +0 -1
  854. package/dist/server/kid-page.js +0 -768
  855. package/dist/server/mock.js +0 -403
  856. package/dist/server/parent-page.d.ts +0 -8
  857. package/dist/server/parent-page.js +0 -393
  858. package/dist/server/runner.d.ts +0 -64
  859. package/dist/server/runner.js +0 -277
  860. package/dist/server/scene-props.d.ts +0 -16
  861. package/dist/server/scene-props.js +0 -39
  862. package/dist/server/store.d.ts +0 -43
  863. package/dist/server/store.js +0 -210
  864. package/dist/server/tts.d.ts +0 -51
  865. package/dist/server/tts.js +0 -99
  866. /package/dist/{cli → app/cli}/cert.d.ts +0 -0
  867. /package/dist/{cli → app/cli}/main.d.ts +0 -0
  868. /package/dist/{cards → board/cards}/choice.d.ts +0 -0
  869. /package/dist/{cards → board/cards}/code.d.ts +0 -0
  870. /package/dist/{cards → board/cards}/image.d.ts +0 -0
  871. /package/dist/{cards → board/cards}/read.d.ts +0 -0
@@ -0,0 +1,74 @@
1
+ /**
2
+ * 孩子端的声音(口语课与实时老师共用,插进各页的内联脚本):getUserMedia → AudioWorklet 降到 16k PCM16,100 毫秒一块交给 onChunk(静音时不交);
3
+ * 下来的 24k PCM16 一块块排进 AudioContext 放(上一块放完或现在 + 60 毫秒,取晚的;录像的混音 src/runtime/journal/mix.ts 照这个排法)。
4
+ * makeAudio() 回一个对象:open()(要在一次点击里调,Safari 才给起 AudioContext 与麦)、play(ArrayBuffer)、playing()、flush()、close(),
5
+ * 回调 onChunk(ArrayBuffer) / onLevel(0–1),muted 缺省 true(连上了再放开)。没有 AudioWorklet 的退到 ScriptProcessor。
6
+ * duck(v):放出来的声音压到 v(0–1,一直听时孩子开口先压低嘴,1 恢复);放声都过一个总的 GainNode,后面一个 AnalyserNode,outLevel() 回放出去的音量(0–1 左右,压低之前的)。
7
+ * 页面自己开着麦克风的(孩子端老师页的常开那路)不用 open:点击里先 wake()(只起 AudioContext),拿到那路再 use(stream)——
8
+ * iPad 上再 getUserMedia 一次会把先开的那路弄哑;use 的那路不归它管,close 不停它,换了一路就换源。
9
+ * 脚本里不写反斜杠、反引号、美元加花括号(插进去的地方是模板字符串,见 AGENTS.md「坑」)。
10
+ */
11
+ export const AUDIO_CLIENT_JS = `
12
+ const WORKLET = 'class P extends AudioWorkletProcessor { constructor() { super(); this.buf = []; this.n = 0; this.acc = 0; } process(inputs) { const ch = inputs[0] && inputs[0][0]; if (!ch) return true; const ratio = sampleRate / 16000; const out = []; for (let i = 0; i < ch.length; i++) { this.acc += 1; if (this.acc >= ratio) { this.acc -= ratio; out.push(ch[i]); } } for (const v of out) { this.buf.push(v); } if (this.buf.length >= 1600) { const n = 1600; const pcm = new Int16Array(n); let s = 0; for (let i = 0; i < n; i++) { const v = Math.max(-1, Math.min(1, this.buf[i])); pcm[i] = v < 0 ? v * 32768 : v * 32767; s += v * v; } this.buf = this.buf.slice(n); this.port.postMessage({ pcm: pcm.buffer, rms: Math.sqrt(s / n) }, [pcm.buffer]); } return true; } } registerProcessor("cotutor-pcm16", P);';
13
+ function makeAudio() {
14
+ const A = { ctx: null, stream: null, own: false, src: null, node: null, nodeReady: null, playAt: 0, sources: [], onChunk: null, onLevel: null, muted: true, out: null, level: 1 };
15
+ const out = () => { if (!A.out || A.out.context !== A.ctx) { A.out = A.ctx.createGain(); A.out.gain.value = A.level; A.an = A.ctx.createAnalyser(); A.an.fftSize = 512; A.out.connect(A.an); A.an.connect(A.ctx.destination); } return A.out; };
16
+ // 放出去的音量(老师在说时按钮旁那三道小弧的深浅,src/ui/kid/voice-ui.ts):总 GainNode 后面接一个 AnalyserNode,取的是压低之前的
17
+ A.outLevel = () => {
18
+ if (!A.an || !A.ctx || A.an.context !== A.ctx || !A.playing()) return 0;
19
+ const d = A.anBuf || (A.anBuf = new Uint8Array(A.an.fftSize));
20
+ A.an.getByteTimeDomainData(d);
21
+ let s = 0;
22
+ for (let i = 0; i < d.length; i++) { const v = (d[i] - 128) / 128; s += v * v; }
23
+ return Math.sqrt(s / d.length) / Math.max(0.05, A.level);
24
+ };
25
+ A.duck = (v) => { A.level = v; if (A.out && A.ctx && A.out.context === A.ctx) { try { A.out.gain.setTargetAtTime(v, A.ctx.currentTime, 0.05); } catch (e) { A.out.gain.value = v; } } };
26
+ A.wake = () => { if (!A.ctx) A.ctx = new (window.AudioContext || window.webkitAudioContext)(); return A.ctx.resume(); };
27
+ const node = () => A.nodeReady || (A.nodeReady = (async () => {
28
+ if (A.ctx.audioWorklet) {
29
+ const url = URL.createObjectURL(new Blob([WORKLET], { type: 'application/javascript' }));
30
+ await A.ctx.audioWorklet.addModule(url);
31
+ A.node = new AudioWorkletNode(A.ctx, 'cotutor-pcm16', { numberOfInputs: 1, numberOfOutputs: 1, channelCount: 1 });
32
+ A.node.port.onmessage = (e) => { if (A.onLevel) A.onLevel(e.data.rms); if (!A.muted && A.onChunk) A.onChunk(e.data.pcm); };
33
+ const sink = A.ctx.createGain(); sink.gain.value = 0; A.node.connect(sink); sink.connect(A.ctx.destination);
34
+ } else {
35
+ const sp = A.ctx.createScriptProcessor(4096, 1, 1);
36
+ let buf = [], acc = 0;
37
+ sp.onaudioprocess = (e) => {
38
+ const ch = e.inputBuffer.getChannelData(0); const ratio = A.ctx.sampleRate / 16000;
39
+ for (let i = 0; i < ch.length; i++) { acc += 1; if (acc >= ratio) { acc -= ratio; buf.push(ch[i]); } }
40
+ while (buf.length >= 1600) { const pcm = new Int16Array(1600); let s = 0; for (let i = 0; i < 1600; i++) { const v = Math.max(-1, Math.min(1, buf[i])); pcm[i] = v < 0 ? v * 32768 : v * 32767; s += v * v; } buf = buf.slice(1600); if (A.onLevel) A.onLevel(Math.sqrt(s / 1600)); if (!A.muted && A.onChunk) A.onChunk(pcm.buffer); }
41
+ };
42
+ const sink = A.ctx.createGain(); sink.gain.value = 0; sp.connect(sink); sink.connect(A.ctx.destination);
43
+ A.node = sp;
44
+ }
45
+ })());
46
+ A.use = async (stream) => {
47
+ await A.wake(); await node();
48
+ if (stream === A.stream) return;
49
+ if (A.src) { try { A.src.disconnect(); } catch (e) {} }
50
+ if (A.own && A.stream) for (const t of A.stream.getTracks()) t.stop();
51
+ A.stream = stream; A.own = false;
52
+ A.src = A.ctx.createMediaStreamSource(stream); A.src.connect(A.node);
53
+ };
54
+ A.open = async () => {
55
+ await A.wake();
56
+ const st = await navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } });
57
+ await A.use(st); A.own = true;
58
+ };
59
+ A.play = (ab) => {
60
+ if (!A.ctx) return;
61
+ const i16 = new Int16Array(ab); const n = i16.length; if (!n) return;
62
+ const buf = A.ctx.createBuffer(1, n, 24000); const d = buf.getChannelData(0);
63
+ for (let i = 0; i < n; i++) d[i] = i16[i] / 32768;
64
+ const s = A.ctx.createBufferSource(); s.buffer = buf; s.connect(out());
65
+ const now = A.ctx.currentTime; if (A.playAt < now + 0.06) A.playAt = now + 0.06;
66
+ s.start(A.playAt); A.playAt += buf.duration; A.sources.push(s);
67
+ s.onended = () => { const k = A.sources.indexOf(s); if (k >= 0) A.sources.splice(k, 1); };
68
+ };
69
+ A.playing = () => Boolean(A.ctx) && A.playAt > A.ctx.currentTime + 0.02;
70
+ A.flush = () => { for (const s of A.sources) { try { s.stop(); } catch (e) {} } A.sources = []; A.playAt = 0; };
71
+ A.close = () => { A.flush(); if (A.own && A.stream) for (const t of A.stream.getTracks()) t.stop(); if (A.ctx) { try { A.ctx.close().catch(() => {}); } catch (e) {} } A.ctx = null; A.stream = null; A.src = null; A.node = null; A.nodeReady = null; A.out = null; A.an = null; };
72
+ return A;
73
+ }
74
+ `;
@@ -0,0 +1,37 @@
1
+ /**
2
+ * 板书底纹的学科字轮廓:scripts/bake-board-marks.py 生成的,别手改(改字体、排法改那个脚本再跑一遍)。
3
+ * 单位:中文一个字的字号 = 1;w、h 是贴紧的外框,d 的坐标是这个单位的千分之一(viewBox 0 0 w*1000 h*1000),y 朝下。
4
+ * 字体都是 SIL Open Font License 1.1(见仓根 NOTICE)。
5
+ */
6
+ export interface BoardMarkArt {
7
+ /** 写的是什么 */
8
+ text: string;
9
+ /** 照哪款字体烤的 */
10
+ font: string;
11
+ w: number;
12
+ h: number;
13
+ d: string;
14
+ }
15
+ export declare const BOARD_MARK_ART: {
16
+ readonly yuwen: {
17
+ readonly text: "语文";
18
+ readonly font: "Ma Shan Zheng";
19
+ readonly w: 0.925;
20
+ readonly h: 1.823;
21
+ readonly d: "M395 472Q409 476 439 463Q469 451 503 446Q536 441 591 439Q636 438 652 441Q667 445 688 460Q703 473 705 473Q710 473 713 490Q716 506 714 516Q710 530 708 555Q703 593 694 621Q684 649 673 656Q667 660 674 665Q682 670 691 686Q699 701 703 715Q706 731 694 749Q682 768 670 771Q659 774 631 763Q602 753 570 755Q541 757 503 766Q465 775 460 780Q456 785 446 799Q426 824 417 803Q412 794 399 772Q385 750 387 744Q389 738 380 701Q370 664 364 633Q359 602 352 583Q340 545 343 524Q346 502 366 482Q375 471 380 470Q385 469 395 472ZM585 542Q585 539 558 538Q531 538 500 541Q469 545 454 548L431 557L433 596Q436 635 440 643Q444 651 446 668L448 685L467 682Q485 678 520 673L556 666L564 642Q570 626 577 588Q585 551 585 542ZM121 49Q124 30 129 27Q134 23 168 24Q201 25 226 35Q250 46 252 49Q254 52 260 82Q264 101 263 109Q263 117 259 131Q250 151 245 151Q241 151 241 157Q241 163 233 168Q226 173 209 160Q192 147 181 140Q171 133 163 117Q154 101 136 85Q124 72 122 67Q120 62 121 49ZM556 4Q570 0 594 0Q619 0 625 3Q633 8 634 30Q634 46 633 52Q631 59 621 69Q610 82 602 83Q594 84 577 77Q560 68 548 71Q535 74 533 70Q530 65 521 66Q517 66 516 68Q514 71 515 80Q520 94 526 109Q533 125 528 130Q521 142 539 144Q548 145 564 145Q599 148 630 163Q661 176 666 184Q671 191 663 211Q654 230 656 233Q658 237 651 275Q645 312 646 313Q648 314 719 312Q791 310 820 313Q849 316 857 318Q866 319 873 331Q884 350 878 369Q872 389 855 397Q844 402 819 402Q794 402 790 398Q783 394 655 387Q623 386 571 393Q519 400 466 406Q396 412 353 423Q311 434 311 443Q311 448 307 449Q304 451 295 472Q286 492 283 503Q281 515 270 546Q260 576 256 591Q233 701 220 721Q217 725 213 744Q212 762 198 785Q185 808 171 812Q158 818 147 816Q138 813 119 796Q100 779 96 769Q93 758 88 753Q74 737 73 729Q73 722 80 703Q100 654 107 622Q113 590 113 531Q114 491 113 442Q113 393 111 359Q109 325 108 325Q104 325 89 336Q75 347 64 359Q51 372 43 373Q35 374 20 364Q8 357 3 344Q-2 331 2 321Q5 315 6 310Q6 297 51 266Q97 235 132 223Q149 217 167 221Q184 224 192 236Q198 243 198 247Q198 252 194 265Q190 279 187 357Q184 436 184 499Q184 562 187 572Q189 571 209 542Q229 512 232 505Q234 500 249 479Q264 461 264 454Q265 447 255 445Q242 442 234 432Q226 423 229 413Q230 401 236 401Q241 401 247 393Q255 385 335 364Q378 354 378 336Q378 332 391 315Q401 301 415 268Q430 235 429 225Q429 217 426 217Q422 217 403 225Q389 230 385 230Q382 231 374 225L365 216L374 205Q383 192 409 181L434 167L439 133Q442 99 446 88Q446 81 445 79Q444 76 438 76Q429 77 417 84Q404 92 388 87Q364 82 363 69Q363 64 367 62Q374 58 373 51Q373 44 382 37Q402 24 501 12Q548 6 556 4ZM558 198Q556 195 531 196Q493 198 493 219Q494 238 466 284Q454 302 454 306Q454 310 446 320Q438 331 438 336Q438 337 457 337Q475 337 497 336Q519 334 529 331Q538 330 541 323Q545 315 551 282Q554 259 556 230Q559 201 558 198ZM393 1435Q399 1431 401 1421Q404 1412 415 1385Q426 1358 426 1351Q426 1345 432 1329Q437 1314 437 1301Q437 1287 443 1270Q450 1253 457 1253Q470 1252 499 1289Q528 1325 529 1343Q529 1350 507 1397Q486 1445 475 1462Q465 1478 460 1495Q454 1506 456 1510Q457 1514 467 1523Q480 1536 493 1542Q507 1548 527 1563Q547 1578 597 1599Q646 1620 685 1631Q723 1642 761 1658Q798 1675 804 1675Q810 1674 827 1682Q844 1690 857 1690Q879 1690 902 1707Q926 1723 925 1739Q924 1747 921 1748Q919 1750 910 1749Q895 1749 891 1753Q886 1757 868 1763Q850 1768 826 1793Q806 1815 795 1820Q784 1826 768 1822Q750 1819 714 1803Q678 1788 666 1780Q630 1753 566 1713Q492 1668 431 1616Q413 1600 408 1599Q403 1599 396 1607Q390 1614 380 1622L341 1658Q317 1680 276 1709Q234 1739 208 1753Q185 1765 169 1779Q133 1804 89 1808Q70 1808 62 1807Q55 1805 55 1795Q55 1787 72 1777Q90 1768 92 1764Q95 1761 142 1731Q209 1687 264 1628Q289 1599 318 1563Q346 1527 346 1523Q346 1520 337 1512Q319 1494 295 1449Q266 1394 260 1377Q253 1360 259 1350Q263 1341 272 1341Q280 1341 317 1370Q322 1372 348 1400Q378 1431 383 1436Q389 1440 393 1435ZM299 1033Q290 1016 293 1012Q296 1007 302 997Q308 987 323 989Q338 992 354 1002Q369 1011 375 1011Q381 1011 408 1018Q427 1024 432 1028Q437 1031 441 1040Q444 1053 444 1072Q443 1092 443 1113Q444 1134 432 1157Q421 1180 424 1183Q430 1184 489 1178Q549 1171 572 1165Q633 1151 677 1153Q721 1154 736 1170Q746 1182 742 1206Q739 1230 724 1242Q710 1255 686 1243Q674 1237 646 1229Q617 1221 542 1225Q471 1227 430 1233Q389 1240 339 1257Q314 1267 297 1269Q255 1277 222 1289Q189 1301 181 1311Q164 1333 127 1313Q112 1306 103 1292Q94 1279 100 1274Q103 1270 128 1261Q153 1251 161 1251Q169 1251 176 1246Q183 1242 237 1226Q291 1210 325 1203Q358 1196 360 1194Q361 1193 352 1175Q343 1158 333 1131Q323 1104 323 1095Q322 1079 299 1033Z";
22
+ };
23
+ readonly shuxue: {
24
+ readonly text: "数学";
25
+ readonly font: "Noto Serif SC Black";
26
+ readonly w: 0.971;
27
+ readonly h: 1.952;
28
+ readonly d: "M408 558V586H23L14 558ZM350 558 418 493 530 590Q522 602 491 606Q455 694 392 762Q328 831 234 878Q140 924 11 948L5 935Q155 880 243 784Q331 688 362 558ZM61 700Q174 691 252 698Q329 705 376 722Q423 740 445 764Q467 787 469 810Q471 833 458 852Q446 870 424 878Q403 885 378 877Q352 851 313 826Q274 802 228 781Q182 760 135 745Q88 730 47 722ZM47 722Q63 698 82 662Q102 625 122 584Q141 544 156 508Q172 472 180 450L330 503Q326 512 313 518Q300 523 264 516L293 504Q280 531 258 573Q236 615 212 658Q188 702 166 736ZM846 137Q846 137 858 148Q871 158 890 174Q910 190 932 208Q953 226 971 242Q967 258 942 258H596V230H776ZM771 45Q768 55 758 62Q749 68 732 69Q697 218 640 334Q584 449 498 531L486 524Q511 455 530 369Q550 283 563 188Q576 94 580 3ZM897 230Q887 354 858 466Q830 577 771 670Q712 764 612 835Q512 906 360 950L355 941Q467 879 540 802Q614 724 657 633Q700 542 718 440Q737 339 740 230ZM576 246Q597 389 646 500Q694 610 774 690Q853 770 966 822L963 832Q912 843 882 872Q853 902 839 951Q747 884 692 783Q636 682 607 552Q578 421 565 267ZM522 76Q519 85 510 91Q500 97 484 97Q457 125 426 153Q395 181 366 201L352 194Q359 164 366 120Q374 75 381 32ZM46 36Q106 49 138 70Q170 92 180 115Q190 138 184 158Q178 179 161 192Q144 204 122 202Q99 201 76 181Q75 144 63 106Q51 68 37 41ZM319 260Q389 264 430 282Q471 301 488 325Q505 349 503 372Q501 396 485 413Q469 430 444 432Q420 435 391 417Q385 390 372 362Q359 335 343 310Q327 284 311 265ZM303 239Q262 319 184 380Q107 440 9 481L0 468Q58 421 100 356Q141 290 163 223H303ZM364 15Q363 24 356 30Q349 37 331 40V433Q331 437 314 445Q298 453 274 459Q249 465 224 465H201V0ZM453 141Q453 141 470 156Q487 170 510 191Q533 212 551 230Q548 246 525 246H16L8 218H398ZM185 1362H646V1390H194ZM16 1594H738L814 1493Q814 1493 828 1504Q842 1515 864 1532Q886 1550 910 1570Q933 1589 952 1606Q948 1622 922 1622H24ZM400 1490 587 1505Q584 1525 554 1531V1784Q554 1833 540 1868Q526 1903 483 1924Q440 1944 351 1952Q347 1916 340 1890Q333 1865 315 1848Q297 1831 272 1819Q247 1807 194 1797V1785Q194 1785 210 1786Q226 1787 251 1788Q276 1790 302 1792Q329 1793 350 1794Q371 1795 379 1795Q391 1795 396 1791Q400 1787 400 1777ZM138 1226H838V1254H138ZM116 1140 128 1139Q165 1208 170 1264Q175 1319 158 1356Q141 1394 112 1410Q82 1427 50 1418Q19 1408 8 1376Q-2 1344 14 1321Q29 1298 56 1285Q83 1268 104 1228Q124 1189 116 1140ZM764 1226H753L830 1149L962 1273Q956 1280 948 1283Q939 1286 922 1287Q898 1302 864 1318Q831 1335 796 1350Q760 1365 729 1375L724 1370Q732 1349 740 1323Q747 1297 754 1271Q760 1245 764 1226ZM163 1012Q241 1022 285 1046Q329 1070 346 1099Q363 1128 359 1156Q355 1183 336 1200Q316 1218 288 1220Q260 1221 229 1197Q226 1165 215 1132Q204 1100 188 1070Q173 1040 155 1017ZM393 1000Q468 1017 508 1044Q548 1071 560 1101Q572 1131 564 1157Q556 1183 534 1198Q512 1213 483 1210Q454 1208 425 1181Q426 1149 420 1118Q415 1087 406 1058Q396 1028 385 1004ZM667 1000 846 1067Q842 1075 832 1080Q823 1085 806 1083Q767 1117 712 1160Q656 1203 600 1236H576Q593 1202 610 1160Q627 1119 642 1076Q657 1034 667 1000ZM599 1362H587L667 1287L796 1410Q790 1417 782 1420Q773 1422 756 1424Q721 1440 674 1459Q626 1478 578 1496Q530 1513 490 1525L485 1519Q504 1497 526 1469Q547 1441 566 1412Q586 1383 599 1362Z";
29
+ };
30
+ readonly english: {
31
+ readonly text: "ENGLISH";
32
+ readonly font: "Barlow SemiBold";
33
+ readonly w: 0.315;
34
+ readonly h: 1.881;
35
+ readonly d: "M268 203V53Q268 51 265 51H183Q181 51 181 53V154Q181 156 179 158Q178 159 176 159H142Q140 159 138 158Q137 156 137 154V53Q137 51 135 51H50Q48 51 48 53V203Q48 205 46 207Q44 209 42 209H9Q7 209 5 207Q4 205 4 203V5Q4 3 5 2Q7 0 9 0H306Q308 0 310 2Q312 3 312 5V203Q312 205 310 207Q308 209 306 209H273Q271 209 269 207Q268 205 268 203ZM312 480V521Q312 523 310 524Q308 526 306 526H9Q7 526 5 524Q4 523 4 521V481Q4 477 7 475L215 348Q216 348 216 347Q216 346 214 346L9 347Q7 347 5 345Q4 344 4 341V301Q4 299 5 297Q7 296 9 296H306Q308 296 310 297Q312 299 312 301V340Q312 345 308 346L100 473Q99 473 99 474Q99 475 101 475L306 475Q308 475 310 476Q312 478 312 480ZM104 618H211Q242 618 266 631Q289 645 302 670Q315 695 315 728Q315 761 302 786Q290 810 268 824Q246 838 218 838H214Q212 838 211 836Q209 835 209 832V792Q209 790 211 789Q212 787 214 787H216Q240 787 256 771Q271 755 271 728Q271 701 255 685Q239 669 213 669H103Q76 669 60 686Q44 703 44 730Q44 757 58 772Q72 787 96 787H123Q125 787 125 785V731Q125 729 127 727Q128 726 131 726H163Q165 726 167 727Q169 729 169 731V832Q169 835 167 836Q165 838 163 838H107Q56 838 28 808Q0 778 0 728Q0 695 13 670Q26 645 50 631Q73 618 104 618ZM9 930H306Q308 930 310 932Q312 933 312 935V976Q312 978 310 980Q308 981 306 981H50Q48 981 48 983V1131Q48 1133 46 1135Q44 1136 42 1136H9Q7 1136 5 1135Q4 1133 4 1131V935Q4 933 5 932Q7 930 9 930ZM9 1217H306Q308 1217 310 1218Q312 1220 312 1222V1262Q312 1265 310 1266Q308 1268 306 1268H9Q7 1268 5 1266Q4 1265 4 1262V1222Q4 1220 5 1218Q7 1217 9 1217ZM88 1353H99Q102 1353 103 1355Q105 1357 105 1359V1398Q105 1400 103 1402Q102 1403 99 1403H91Q71 1403 57 1421Q44 1439 44 1470Q44 1497 55 1511Q67 1525 85 1525Q97 1525 106 1517Q114 1510 121 1496Q128 1482 139 1454Q150 1423 161 1404Q171 1384 188 1371Q205 1358 231 1358Q270 1358 293 1386Q315 1415 315 1462Q315 1495 304 1520Q292 1545 272 1559Q251 1573 224 1573H217Q215 1573 213 1572Q212 1570 212 1568V1529Q212 1526 213 1525Q215 1523 217 1523H222Q242 1523 257 1506Q271 1489 271 1459Q271 1435 261 1422Q251 1408 232 1408Q219 1408 211 1415Q202 1423 196 1437Q189 1451 178 1480Q166 1511 157 1530Q147 1549 130 1562Q112 1576 86 1576Q47 1576 23 1546Q0 1517 0 1467Q0 1432 11 1407Q22 1381 42 1367Q62 1353 88 1353ZM312 1835V1876Q312 1878 310 1879Q308 1881 306 1881H9Q7 1881 5 1879Q4 1878 4 1876V1835Q4 1833 5 1831Q7 1830 9 1830H135Q137 1830 137 1828V1716Q137 1713 135 1713H9Q7 1713 5 1712Q4 1710 4 1708V1668Q4 1665 5 1664Q7 1662 9 1662H306Q308 1662 310 1664Q312 1665 312 1668V1708Q312 1710 310 1712Q308 1713 306 1713H183Q181 1713 181 1716V1828Q181 1830 183 1830H306Q308 1830 310 1831Q312 1833 312 1835Z";
36
+ };
37
+ };
@@ -0,0 +1,5 @@
1
+ export const BOARD_MARK_ART = {
2
+ yuwen: { text: '语文', font: 'Ma Shan Zheng', w: 0.925, h: 1.823, d: 'M395 472Q409 476 439 463Q469 451 503 446Q536 441 591 439Q636 438 652 441Q667 445 688 460Q703 473 705 473Q710 473 713 490Q716 506 714 516Q710 530 708 555Q703 593 694 621Q684 649 673 656Q667 660 674 665Q682 670 691 686Q699 701 703 715Q706 731 694 749Q682 768 670 771Q659 774 631 763Q602 753 570 755Q541 757 503 766Q465 775 460 780Q456 785 446 799Q426 824 417 803Q412 794 399 772Q385 750 387 744Q389 738 380 701Q370 664 364 633Q359 602 352 583Q340 545 343 524Q346 502 366 482Q375 471 380 470Q385 469 395 472ZM585 542Q585 539 558 538Q531 538 500 541Q469 545 454 548L431 557L433 596Q436 635 440 643Q444 651 446 668L448 685L467 682Q485 678 520 673L556 666L564 642Q570 626 577 588Q585 551 585 542ZM121 49Q124 30 129 27Q134 23 168 24Q201 25 226 35Q250 46 252 49Q254 52 260 82Q264 101 263 109Q263 117 259 131Q250 151 245 151Q241 151 241 157Q241 163 233 168Q226 173 209 160Q192 147 181 140Q171 133 163 117Q154 101 136 85Q124 72 122 67Q120 62 121 49ZM556 4Q570 0 594 0Q619 0 625 3Q633 8 634 30Q634 46 633 52Q631 59 621 69Q610 82 602 83Q594 84 577 77Q560 68 548 71Q535 74 533 70Q530 65 521 66Q517 66 516 68Q514 71 515 80Q520 94 526 109Q533 125 528 130Q521 142 539 144Q548 145 564 145Q599 148 630 163Q661 176 666 184Q671 191 663 211Q654 230 656 233Q658 237 651 275Q645 312 646 313Q648 314 719 312Q791 310 820 313Q849 316 857 318Q866 319 873 331Q884 350 878 369Q872 389 855 397Q844 402 819 402Q794 402 790 398Q783 394 655 387Q623 386 571 393Q519 400 466 406Q396 412 353 423Q311 434 311 443Q311 448 307 449Q304 451 295 472Q286 492 283 503Q281 515 270 546Q260 576 256 591Q233 701 220 721Q217 725 213 744Q212 762 198 785Q185 808 171 812Q158 818 147 816Q138 813 119 796Q100 779 96 769Q93 758 88 753Q74 737 73 729Q73 722 80 703Q100 654 107 622Q113 590 113 531Q114 491 113 442Q113 393 111 359Q109 325 108 325Q104 325 89 336Q75 347 64 359Q51 372 43 373Q35 374 20 364Q8 357 3 344Q-2 331 2 321Q5 315 6 310Q6 297 51 266Q97 235 132 223Q149 217 167 221Q184 224 192 236Q198 243 198 247Q198 252 194 265Q190 279 187 357Q184 436 184 499Q184 562 187 572Q189 571 209 542Q229 512 232 505Q234 500 249 479Q264 461 264 454Q265 447 255 445Q242 442 234 432Q226 423 229 413Q230 401 236 401Q241 401 247 393Q255 385 335 364Q378 354 378 336Q378 332 391 315Q401 301 415 268Q430 235 429 225Q429 217 426 217Q422 217 403 225Q389 230 385 230Q382 231 374 225L365 216L374 205Q383 192 409 181L434 167L439 133Q442 99 446 88Q446 81 445 79Q444 76 438 76Q429 77 417 84Q404 92 388 87Q364 82 363 69Q363 64 367 62Q374 58 373 51Q373 44 382 37Q402 24 501 12Q548 6 556 4ZM558 198Q556 195 531 196Q493 198 493 219Q494 238 466 284Q454 302 454 306Q454 310 446 320Q438 331 438 336Q438 337 457 337Q475 337 497 336Q519 334 529 331Q538 330 541 323Q545 315 551 282Q554 259 556 230Q559 201 558 198ZM393 1435Q399 1431 401 1421Q404 1412 415 1385Q426 1358 426 1351Q426 1345 432 1329Q437 1314 437 1301Q437 1287 443 1270Q450 1253 457 1253Q470 1252 499 1289Q528 1325 529 1343Q529 1350 507 1397Q486 1445 475 1462Q465 1478 460 1495Q454 1506 456 1510Q457 1514 467 1523Q480 1536 493 1542Q507 1548 527 1563Q547 1578 597 1599Q646 1620 685 1631Q723 1642 761 1658Q798 1675 804 1675Q810 1674 827 1682Q844 1690 857 1690Q879 1690 902 1707Q926 1723 925 1739Q924 1747 921 1748Q919 1750 910 1749Q895 1749 891 1753Q886 1757 868 1763Q850 1768 826 1793Q806 1815 795 1820Q784 1826 768 1822Q750 1819 714 1803Q678 1788 666 1780Q630 1753 566 1713Q492 1668 431 1616Q413 1600 408 1599Q403 1599 396 1607Q390 1614 380 1622L341 1658Q317 1680 276 1709Q234 1739 208 1753Q185 1765 169 1779Q133 1804 89 1808Q70 1808 62 1807Q55 1805 55 1795Q55 1787 72 1777Q90 1768 92 1764Q95 1761 142 1731Q209 1687 264 1628Q289 1599 318 1563Q346 1527 346 1523Q346 1520 337 1512Q319 1494 295 1449Q266 1394 260 1377Q253 1360 259 1350Q263 1341 272 1341Q280 1341 317 1370Q322 1372 348 1400Q378 1431 383 1436Q389 1440 393 1435ZM299 1033Q290 1016 293 1012Q296 1007 302 997Q308 987 323 989Q338 992 354 1002Q369 1011 375 1011Q381 1011 408 1018Q427 1024 432 1028Q437 1031 441 1040Q444 1053 444 1072Q443 1092 443 1113Q444 1134 432 1157Q421 1180 424 1183Q430 1184 489 1178Q549 1171 572 1165Q633 1151 677 1153Q721 1154 736 1170Q746 1182 742 1206Q739 1230 724 1242Q710 1255 686 1243Q674 1237 646 1229Q617 1221 542 1225Q471 1227 430 1233Q389 1240 339 1257Q314 1267 297 1269Q255 1277 222 1289Q189 1301 181 1311Q164 1333 127 1313Q112 1306 103 1292Q94 1279 100 1274Q103 1270 128 1261Q153 1251 161 1251Q169 1251 176 1246Q183 1242 237 1226Q291 1210 325 1203Q358 1196 360 1194Q361 1193 352 1175Q343 1158 333 1131Q323 1104 323 1095Q322 1079 299 1033Z' },
3
+ shuxue: { text: '数学', font: 'Noto Serif SC Black', w: 0.971, h: 1.952, d: 'M408 558V586H23L14 558ZM350 558 418 493 530 590Q522 602 491 606Q455 694 392 762Q328 831 234 878Q140 924 11 948L5 935Q155 880 243 784Q331 688 362 558ZM61 700Q174 691 252 698Q329 705 376 722Q423 740 445 764Q467 787 469 810Q471 833 458 852Q446 870 424 878Q403 885 378 877Q352 851 313 826Q274 802 228 781Q182 760 135 745Q88 730 47 722ZM47 722Q63 698 82 662Q102 625 122 584Q141 544 156 508Q172 472 180 450L330 503Q326 512 313 518Q300 523 264 516L293 504Q280 531 258 573Q236 615 212 658Q188 702 166 736ZM846 137Q846 137 858 148Q871 158 890 174Q910 190 932 208Q953 226 971 242Q967 258 942 258H596V230H776ZM771 45Q768 55 758 62Q749 68 732 69Q697 218 640 334Q584 449 498 531L486 524Q511 455 530 369Q550 283 563 188Q576 94 580 3ZM897 230Q887 354 858 466Q830 577 771 670Q712 764 612 835Q512 906 360 950L355 941Q467 879 540 802Q614 724 657 633Q700 542 718 440Q737 339 740 230ZM576 246Q597 389 646 500Q694 610 774 690Q853 770 966 822L963 832Q912 843 882 872Q853 902 839 951Q747 884 692 783Q636 682 607 552Q578 421 565 267ZM522 76Q519 85 510 91Q500 97 484 97Q457 125 426 153Q395 181 366 201L352 194Q359 164 366 120Q374 75 381 32ZM46 36Q106 49 138 70Q170 92 180 115Q190 138 184 158Q178 179 161 192Q144 204 122 202Q99 201 76 181Q75 144 63 106Q51 68 37 41ZM319 260Q389 264 430 282Q471 301 488 325Q505 349 503 372Q501 396 485 413Q469 430 444 432Q420 435 391 417Q385 390 372 362Q359 335 343 310Q327 284 311 265ZM303 239Q262 319 184 380Q107 440 9 481L0 468Q58 421 100 356Q141 290 163 223H303ZM364 15Q363 24 356 30Q349 37 331 40V433Q331 437 314 445Q298 453 274 459Q249 465 224 465H201V0ZM453 141Q453 141 470 156Q487 170 510 191Q533 212 551 230Q548 246 525 246H16L8 218H398ZM185 1362H646V1390H194ZM16 1594H738L814 1493Q814 1493 828 1504Q842 1515 864 1532Q886 1550 910 1570Q933 1589 952 1606Q948 1622 922 1622H24ZM400 1490 587 1505Q584 1525 554 1531V1784Q554 1833 540 1868Q526 1903 483 1924Q440 1944 351 1952Q347 1916 340 1890Q333 1865 315 1848Q297 1831 272 1819Q247 1807 194 1797V1785Q194 1785 210 1786Q226 1787 251 1788Q276 1790 302 1792Q329 1793 350 1794Q371 1795 379 1795Q391 1795 396 1791Q400 1787 400 1777ZM138 1226H838V1254H138ZM116 1140 128 1139Q165 1208 170 1264Q175 1319 158 1356Q141 1394 112 1410Q82 1427 50 1418Q19 1408 8 1376Q-2 1344 14 1321Q29 1298 56 1285Q83 1268 104 1228Q124 1189 116 1140ZM764 1226H753L830 1149L962 1273Q956 1280 948 1283Q939 1286 922 1287Q898 1302 864 1318Q831 1335 796 1350Q760 1365 729 1375L724 1370Q732 1349 740 1323Q747 1297 754 1271Q760 1245 764 1226ZM163 1012Q241 1022 285 1046Q329 1070 346 1099Q363 1128 359 1156Q355 1183 336 1200Q316 1218 288 1220Q260 1221 229 1197Q226 1165 215 1132Q204 1100 188 1070Q173 1040 155 1017ZM393 1000Q468 1017 508 1044Q548 1071 560 1101Q572 1131 564 1157Q556 1183 534 1198Q512 1213 483 1210Q454 1208 425 1181Q426 1149 420 1118Q415 1087 406 1058Q396 1028 385 1004ZM667 1000 846 1067Q842 1075 832 1080Q823 1085 806 1083Q767 1117 712 1160Q656 1203 600 1236H576Q593 1202 610 1160Q627 1119 642 1076Q657 1034 667 1000ZM599 1362H587L667 1287L796 1410Q790 1417 782 1420Q773 1422 756 1424Q721 1440 674 1459Q626 1478 578 1496Q530 1513 490 1525L485 1519Q504 1497 526 1469Q547 1441 566 1412Q586 1383 599 1362Z' },
4
+ english: { text: 'ENGLISH', font: 'Barlow SemiBold', w: 0.315, h: 1.881, d: 'M268 203V53Q268 51 265 51H183Q181 51 181 53V154Q181 156 179 158Q178 159 176 159H142Q140 159 138 158Q137 156 137 154V53Q137 51 135 51H50Q48 51 48 53V203Q48 205 46 207Q44 209 42 209H9Q7 209 5 207Q4 205 4 203V5Q4 3 5 2Q7 0 9 0H306Q308 0 310 2Q312 3 312 5V203Q312 205 310 207Q308 209 306 209H273Q271 209 269 207Q268 205 268 203ZM312 480V521Q312 523 310 524Q308 526 306 526H9Q7 526 5 524Q4 523 4 521V481Q4 477 7 475L215 348Q216 348 216 347Q216 346 214 346L9 347Q7 347 5 345Q4 344 4 341V301Q4 299 5 297Q7 296 9 296H306Q308 296 310 297Q312 299 312 301V340Q312 345 308 346L100 473Q99 473 99 474Q99 475 101 475L306 475Q308 475 310 476Q312 478 312 480ZM104 618H211Q242 618 266 631Q289 645 302 670Q315 695 315 728Q315 761 302 786Q290 810 268 824Q246 838 218 838H214Q212 838 211 836Q209 835 209 832V792Q209 790 211 789Q212 787 214 787H216Q240 787 256 771Q271 755 271 728Q271 701 255 685Q239 669 213 669H103Q76 669 60 686Q44 703 44 730Q44 757 58 772Q72 787 96 787H123Q125 787 125 785V731Q125 729 127 727Q128 726 131 726H163Q165 726 167 727Q169 729 169 731V832Q169 835 167 836Q165 838 163 838H107Q56 838 28 808Q0 778 0 728Q0 695 13 670Q26 645 50 631Q73 618 104 618ZM9 930H306Q308 930 310 932Q312 933 312 935V976Q312 978 310 980Q308 981 306 981H50Q48 981 48 983V1131Q48 1133 46 1135Q44 1136 42 1136H9Q7 1136 5 1135Q4 1133 4 1131V935Q4 933 5 932Q7 930 9 930ZM9 1217H306Q308 1217 310 1218Q312 1220 312 1222V1262Q312 1265 310 1266Q308 1268 306 1268H9Q7 1268 5 1266Q4 1265 4 1262V1222Q4 1220 5 1218Q7 1217 9 1217ZM88 1353H99Q102 1353 103 1355Q105 1357 105 1359V1398Q105 1400 103 1402Q102 1403 99 1403H91Q71 1403 57 1421Q44 1439 44 1470Q44 1497 55 1511Q67 1525 85 1525Q97 1525 106 1517Q114 1510 121 1496Q128 1482 139 1454Q150 1423 161 1404Q171 1384 188 1371Q205 1358 231 1358Q270 1358 293 1386Q315 1415 315 1462Q315 1495 304 1520Q292 1545 272 1559Q251 1573 224 1573H217Q215 1573 213 1572Q212 1570 212 1568V1529Q212 1526 213 1525Q215 1523 217 1523H222Q242 1523 257 1506Q271 1489 271 1459Q271 1435 261 1422Q251 1408 232 1408Q219 1408 211 1415Q202 1423 196 1437Q189 1451 178 1480Q166 1511 157 1530Q147 1549 130 1562Q112 1576 86 1576Q47 1576 23 1546Q0 1517 0 1467Q0 1432 11 1407Q22 1381 42 1367Q62 1353 88 1353ZM312 1835V1876Q312 1878 310 1879Q308 1881 306 1881H9Q7 1881 5 1879Q4 1878 4 1876V1835Q4 1833 5 1831Q7 1830 9 1830H135Q137 1830 137 1828V1716Q137 1713 135 1713H9Q7 1713 5 1712Q4 1710 4 1708V1668Q4 1665 5 1664Q7 1662 9 1662H306Q308 1662 310 1664Q312 1665 312 1668V1708Q312 1710 310 1712Q308 1713 306 1713H183Q181 1713 181 1716V1828Q181 1830 183 1830H306Q308 1830 310 1831Q312 1833 312 1835Z' },
5
+ };
@@ -0,0 +1,24 @@
1
+ import { BOARD_MARK_ART } from './board-mark-art.ts';
2
+ export type BoardMarkId = keyof typeof BOARD_MARK_ART;
3
+ /** 这位老师的板上写什么:三门主科(含别名)各一个,别的 null(空着) */
4
+ export declare function boardMarkOf(subject: string | null | undefined): BoardMarkId | null;
5
+ /**
6
+ * 怎么摆:right = 外框右沿离板右沿多远(乘 s;负数出纸边),top = 离板顶多少 px(加安全区),o = 不透明度。
7
+ * top 从两角按钮下面起(实时页回首页胶囊下沿 64、「更多」54,再空出十几 px),右手不让「更多」压着、左撇子不让胶囊压着;
8
+ * 三种字墨量差得多(粗宋最重、ENGLISH 最轻),浓淡分开压到看着一样淡;ENGLISH 是孩子认得的词,字母不切边
9
+ */
10
+ export declare const BOARD_MARK_PLACE: Readonly<Record<BoardMarkId, {
11
+ right: number;
12
+ top: number;
13
+ o: number;
14
+ }>>;
15
+ /** 字的下沿离板底至少多少 px:字太高就缩,不出板的底边 */
16
+ export declare const BOARD_MARK_BOTTOM = 16;
17
+ /** 字的墨色(暖一点的深褐,压在纸色上) */
18
+ export declare const BOARD_INK = "#4a3f2e";
19
+ /** 老师页的样式:字在 #bmark */
20
+ export declare const BOARD_MARK_CSS = "\n #bmark { position:absolute; inset:0; z-index:-1; overflow:hidden; pointer-events:none; container-type:size; color:#4a3f2e; }\n #bmark[hidden] { display:none; }\n #bmark svg { position:absolute; display:block; --s:min(48vh, 72vw, (100vh - env(safe-area-inset-top) - var(--bm-top) * 1px - 16px) / var(--bm-h)); top:calc(env(safe-area-inset-top) + var(--bm-top) * 1px); right:calc(var(--s) * var(--bm-right)); width:calc(var(--s) * var(--bm-w)); height:calc(var(--s) * var(--bm-h)); opacity:var(--bm-o); }\n @supports (width:1cqh) { #bmark svg { --s:min(48cqh, 72cqw, (100cqh - env(safe-area-inset-top) - var(--bm-top) * 1px - 16px) / var(--bm-h)); } }\n";
21
+ /** 平板横屏实时、左撇子:白纸在右边,字挪到左边(插进老师页那段横屏媒体查询里) */
22
+ export declare const BOARD_MARK_HAND_LEFT_CSS = "body.live.hand-left #bmark svg { right:auto; left:calc(var(--s) * var(--bm-right)); }";
23
+ /** markBoard(el, t):把 t.mark 那个字放进 el(#bmark);t 没有 mark(别的老师、还不知道是谁)就收起来 */
24
+ export declare const BOARD_MARK_JS: string;
@@ -0,0 +1,58 @@
1
+ /**
2
+ * 板书的底纹:三门主科在板右边竖着写一个很淡的学科名,像课本的书脊;板是平的纸色,不铺纸纹。
3
+ * - 字:照课本封面——语文毛笔「语文」、数学粗宋「数学」、英语「ENGLISH」;轮廓是 board-mark-art.ts 里烤好的(scripts/bake-board-marks.py),页面不加载字体
4
+ * 别的老师(家长自己加的)不写字
5
+ * 字放在 #wrap 里垫底的 #bmark:不跟板书滚,卡铺上来盖住就盖住;字从两角按钮下面起,字号 s 跟着板走(板高的 48%、板宽的 72% 取小的,太高就再缩到下沿离板底 16)。
6
+ * 脚本是 ES5、没有反斜杠与反引号(插进老师页的模板字符串)。tests/board-mark.test.ts 盯着。
7
+ */
8
+ import { canonicalSubject } from "../../schema/config.js";
9
+ import { BOARD_MARK_ART } from "./board-mark-art.js";
10
+ const BY_SUBJECT = { 语文: 'yuwen', 数学: 'shuxue', 英语: 'english' };
11
+ /** 这位老师的板上写什么:三门主科(含别名)各一个,别的 null(空着) */
12
+ export function boardMarkOf(subject) {
13
+ return BY_SUBJECT[canonicalSubject(subject) ?? ''] ?? null;
14
+ }
15
+ /**
16
+ * 怎么摆:right = 外框右沿离板右沿多远(乘 s;负数出纸边),top = 离板顶多少 px(加安全区),o = 不透明度。
17
+ * top 从两角按钮下面起(实时页回首页胶囊下沿 64、「更多」54,再空出十几 px),右手不让「更多」压着、左撇子不让胶囊压着;
18
+ * 三种字墨量差得多(粗宋最重、ENGLISH 最轻),浓淡分开压到看着一样淡;ENGLISH 是孩子认得的词,字母不切边
19
+ */
20
+ export const BOARD_MARK_PLACE = {
21
+ yuwen: { right: -0.07, top: 82, o: 0.065 },
22
+ shuxue: { right: -0.07, top: 80, o: 0.05 },
23
+ english: { right: 0.03, top: 86, o: 0.05 },
24
+ };
25
+ /** 字的下沿离板底至少多少 px:字太高就缩,不出板的底边 */
26
+ export const BOARD_MARK_BOTTOM = 16;
27
+ /** 字的墨色(暖一点的深褐,压在纸色上) */
28
+ export const BOARD_INK = '#4a3f2e';
29
+ /** 老师页的样式:字在 #bmark */
30
+ export const BOARD_MARK_CSS = `
31
+ #bmark { position:absolute; inset:0; z-index:-1; overflow:hidden; pointer-events:none; container-type:size; color:${BOARD_INK}; }
32
+ #bmark[hidden] { display:none; }
33
+ #bmark svg { position:absolute; display:block; --s:min(48vh, 72vw, (100vh - env(safe-area-inset-top) - var(--bm-top) * 1px - ${BOARD_MARK_BOTTOM}px) / var(--bm-h)); top:calc(env(safe-area-inset-top) + var(--bm-top) * 1px); right:calc(var(--s) * var(--bm-right)); width:calc(var(--s) * var(--bm-w)); height:calc(var(--s) * var(--bm-h)); opacity:var(--bm-o); }
34
+ @supports (width:1cqh) { #bmark svg { --s:min(48cqh, 72cqw, (100cqh - env(safe-area-inset-top) - var(--bm-top) * 1px - ${BOARD_MARK_BOTTOM}px) / var(--bm-h)); } }
35
+ `;
36
+ /** 平板横屏实时、左撇子:白纸在右边,字挪到左边(插进老师页那段横屏媒体查询里) */
37
+ export const BOARD_MARK_HAND_LEFT_CSS = `body.live.hand-left #bmark svg { right:auto; left:calc(var(--s) * var(--bm-right)); }`;
38
+ const MARKS_JSON = JSON.stringify(Object.fromEntries(Object.keys(BOARD_MARK_ART).map((id) => {
39
+ const a = BOARD_MARK_ART[id];
40
+ const p = BOARD_MARK_PLACE[id];
41
+ return [id, { w: a.w, h: a.h, d: a.d, right: p.right, top: p.top, o: p.o }];
42
+ })));
43
+ /** markBoard(el, t):把 t.mark 那个字放进 el(#bmark);t 没有 mark(别的老师、还不知道是谁)就收起来 */
44
+ export const BOARD_MARK_JS = `
45
+ var BOARD_MARKS = ${MARKS_JSON};
46
+ var markBoard = function (el, t) {
47
+ if (!el) return;
48
+ var id = t && t.mark;
49
+ var m = id ? BOARD_MARKS[id] : null;
50
+ if (!m) { el.hidden = true; el.textContent = ''; el.removeAttribute('data-mark'); return; }
51
+ if (el.getAttribute('data-mark') === id) { el.hidden = false; return; }
52
+ el.setAttribute('data-mark', id);
53
+ el.innerHTML = '<svg viewBox="0 0 ' + Math.round(m.w * 1000) + ' ' + Math.round(m.h * 1000) + '" preserveAspectRatio="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="' + m.d + '"></path></svg>';
54
+ var s = el.firstChild.style;
55
+ s.setProperty('--bm-w', m.w); s.setProperty('--bm-h', m.h); s.setProperty('--bm-right', m.right); s.setProperty('--bm-top', m.top); s.setProperty('--bm-o', m.o);
56
+ el.hidden = false;
57
+ };
58
+ `;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * 孩子端的流水,页面这一半:各页共用的那段脚本,把打开、出错、前台时长、权限、连接报给 POST /api/kid/log。
3
+ * 服务端收、存、读(.cotutor/kid-log/<日期>.jsonl 与设备表 .cotutor/devices.json)在 src/runtime/journal/kid-log.ts。
4
+ */
5
+ /**
6
+ * 各页共用的那段脚本:装上出错的监听,kidLog.start({page, mode, v, ctx}) 报一次打开(只在 mode 是 kid 时)。
7
+ * 孩子端模式下还在前台计时(7.4):切到后台、离开页面时记一笔 fg,一直开着每 5 分钟也记一笔;不满 1 秒的不记。
8
+ * 打开那行带 caps(7.2):麦克风权限(问 navigator.permissions,问不出 unknown;最多等 1.5 秒)、有没有 getUserMedia;
9
+ * 麦克风权限变了、kidLog.blocked('autoplay')(老师的声音被浏览器拦了,一次打开只记一次)各记一行 perm。
10
+ * 连接(7.3):kidLog.offline(on) 心跳断了 / 又通了,通了那一下记 net offline 与断了多久;kidLog.live(opened, ms) 实时老师的连接不是孩子自己收的、自己关了。
11
+ * 同一次打开里同一条报错只报一次、最多 20 条(防一个死循环写满文件,是护栏不是限额);只收脚本错,图片、声音读不出不收。
12
+ * 用在首页 / 老师页(kid-page.ts,各种模式都带)、听写(中、英)、口语课;tests/kid-log.test.ts 盯着这几页都带它。
13
+ * 脚本是 ES5、没有反斜杠与反引号(插进各页的模板字符串)。
14
+ */
15
+ export declare const KID_LOG_JS = "\n var kidLog = (function () {\n var sent = {}, n = 0, page = '', mode = 'kid', v = '', ctx = null, fgSince = 0, blocked = {}, offSince = 0;\n var cut = function (s, k) { s = String(s == null ? '' : s); return s.length > k ? s.slice(0, k) : s; };\n var post = function (row) { try { fetch('/api/kid/log', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify(row), keepalive: true, credentials: 'same-origin' }).catch(function () {}); } catch (e) {} };\n var report = function (msg, where, stack) {\n var key = msg + '@' + where;\n if (sent[key] || n >= 20) return;\n sent[key] = 1; n++;\n var c = null;\n try { c = ctx ? ctx() : null; } catch (e) { c = null; }\n post({ k: 'error', page: page, mode: mode, v: v, msg: cut(msg, 300), where: where, stack: cut(stack, 1500), ua: cut(navigator.userAgent, 400), ctx: c });\n };\n window.addEventListener('error', function (e) {\n if (!e || typeof e.message !== 'string') return;\n report(e.message || 'error', (e.lineno || 0) + ':' + (e.colno || 0), e.error && e.error.stack);\n });\n var flushFg = function () {\n if (!fgSince) return;\n var ms = Date.now() - fgSince;\n if (ms < 1000 && !document.hidden) return;\n fgSince = document.hidden ? 0 : Date.now();\n if (ms >= 1000) post({ k: 'fg', page: page, ms: Math.round(ms) });\n };\n window.addEventListener('unhandledrejection', function (e) {\n var r = e ? e.reason : null;\n report('unhandledrejection: ' + (r && r.message ? r.message : String(r)), '', r && r.stack);\n });\n return {\n offline: function (on) {\n if (mode !== 'kid') return;\n if (on) { if (!offSince) offSince = Date.now(); return; }\n if (!offSince) return;\n var ms = Date.now() - offSince;\n offSince = 0;\n post({ k: 'net', page: page, what: 'offline', ms: Math.round(ms) });\n },\n live: function (opened, ms) {\n if (mode !== 'kid') return;\n post({ k: 'net', page: page, what: 'live', opened: Boolean(opened), ms: Math.round(ms || 0) });\n },\n blocked: function (what) {\n if (mode !== 'kid' || blocked[what]) return;\n blocked[what] = 1;\n post({ k: 'perm', page: page, what: what, state: 'blocked' });\n },\n start: function (o) {\n page = o.page || ''; mode = o.mode || 'kid'; v = o.v || ''; ctx = o.ctx || null;\n if (mode !== 'kid') return;\n var standalone = Boolean(navigator.standalone);\n try { standalone = standalone || matchMedia('(display-mode: standalone)').matches; } catch (e) {}\n var caps = { mic: 'unknown', gum: Boolean(navigator.mediaDevices && navigator.mediaDevices.getUserMedia) };\n var opened = false;\n var sendOpen = function (mic) {\n if (opened) return;\n opened = true; caps.mic = mic;\n post({ k: 'open', page: page, v: v, ua: cut(navigator.userAgent, 400), touch: navigator.maxTouchPoints || 0, standalone: standalone, w: screen.width, h: screen.height, vw: innerWidth, vh: innerHeight, dpr: window.devicePixelRatio || 1, lang: cut(navigator.language, 20), caps: caps });\n };\n setTimeout(function () { sendOpen('unknown'); }, 1500);\n try {\n navigator.permissions.query({ name: 'microphone' }).then(function (st) {\n sendOpen(st.state);\n st.onchange = function () { post({ k: 'perm', page: page, what: 'mic', state: st.state }); };\n }, function () { sendOpen('unknown'); });\n } catch (e) { sendOpen('unknown'); }\n fgSince = document.hidden ? 0 : Date.now();\n document.addEventListener('visibilitychange', function () { if (document.hidden) flushFg(); else fgSince = Date.now(); });\n window.addEventListener('pagehide', flushFg);\n setInterval(function () { if (!document.hidden) flushFg(); }, 300000);\n },\n };\n })();\n";
@@ -0,0 +1,87 @@
1
+ /**
2
+ * 孩子端的流水,页面这一半:各页共用的那段脚本,把打开、出错、前台时长、权限、连接报给 POST /api/kid/log。
3
+ * 服务端收、存、读(.cotutor/kid-log/<日期>.jsonl 与设备表 .cotutor/devices.json)在 src/runtime/journal/kid-log.ts。
4
+ */
5
+ /**
6
+ * 各页共用的那段脚本:装上出错的监听,kidLog.start({page, mode, v, ctx}) 报一次打开(只在 mode 是 kid 时)。
7
+ * 孩子端模式下还在前台计时(7.4):切到后台、离开页面时记一笔 fg,一直开着每 5 分钟也记一笔;不满 1 秒的不记。
8
+ * 打开那行带 caps(7.2):麦克风权限(问 navigator.permissions,问不出 unknown;最多等 1.5 秒)、有没有 getUserMedia;
9
+ * 麦克风权限变了、kidLog.blocked('autoplay')(老师的声音被浏览器拦了,一次打开只记一次)各记一行 perm。
10
+ * 连接(7.3):kidLog.offline(on) 心跳断了 / 又通了,通了那一下记 net offline 与断了多久;kidLog.live(opened, ms) 实时老师的连接不是孩子自己收的、自己关了。
11
+ * 同一次打开里同一条报错只报一次、最多 20 条(防一个死循环写满文件,是护栏不是限额);只收脚本错,图片、声音读不出不收。
12
+ * 用在首页 / 老师页(kid-page.ts,各种模式都带)、听写(中、英)、口语课;tests/kid-log.test.ts 盯着这几页都带它。
13
+ * 脚本是 ES5、没有反斜杠与反引号(插进各页的模板字符串)。
14
+ */
15
+ export const KID_LOG_JS = `
16
+ var kidLog = (function () {
17
+ var sent = {}, n = 0, page = '', mode = 'kid', v = '', ctx = null, fgSince = 0, blocked = {}, offSince = 0;
18
+ var cut = function (s, k) { s = String(s == null ? '' : s); return s.length > k ? s.slice(0, k) : s; };
19
+ var post = function (row) { try { fetch('/api/kid/log', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify(row), keepalive: true, credentials: 'same-origin' }).catch(function () {}); } catch (e) {} };
20
+ var report = function (msg, where, stack) {
21
+ var key = msg + '@' + where;
22
+ if (sent[key] || n >= 20) return;
23
+ sent[key] = 1; n++;
24
+ var c = null;
25
+ try { c = ctx ? ctx() : null; } catch (e) { c = null; }
26
+ post({ k: 'error', page: page, mode: mode, v: v, msg: cut(msg, 300), where: where, stack: cut(stack, 1500), ua: cut(navigator.userAgent, 400), ctx: c });
27
+ };
28
+ window.addEventListener('error', function (e) {
29
+ if (!e || typeof e.message !== 'string') return;
30
+ report(e.message || 'error', (e.lineno || 0) + ':' + (e.colno || 0), e.error && e.error.stack);
31
+ });
32
+ var flushFg = function () {
33
+ if (!fgSince) return;
34
+ var ms = Date.now() - fgSince;
35
+ if (ms < 1000 && !document.hidden) return;
36
+ fgSince = document.hidden ? 0 : Date.now();
37
+ if (ms >= 1000) post({ k: 'fg', page: page, ms: Math.round(ms) });
38
+ };
39
+ window.addEventListener('unhandledrejection', function (e) {
40
+ var r = e ? e.reason : null;
41
+ report('unhandledrejection: ' + (r && r.message ? r.message : String(r)), '', r && r.stack);
42
+ });
43
+ return {
44
+ offline: function (on) {
45
+ if (mode !== 'kid') return;
46
+ if (on) { if (!offSince) offSince = Date.now(); return; }
47
+ if (!offSince) return;
48
+ var ms = Date.now() - offSince;
49
+ offSince = 0;
50
+ post({ k: 'net', page: page, what: 'offline', ms: Math.round(ms) });
51
+ },
52
+ live: function (opened, ms) {
53
+ if (mode !== 'kid') return;
54
+ post({ k: 'net', page: page, what: 'live', opened: Boolean(opened), ms: Math.round(ms || 0) });
55
+ },
56
+ blocked: function (what) {
57
+ if (mode !== 'kid' || blocked[what]) return;
58
+ blocked[what] = 1;
59
+ post({ k: 'perm', page: page, what: what, state: 'blocked' });
60
+ },
61
+ start: function (o) {
62
+ page = o.page || ''; mode = o.mode || 'kid'; v = o.v || ''; ctx = o.ctx || null;
63
+ if (mode !== 'kid') return;
64
+ var standalone = Boolean(navigator.standalone);
65
+ try { standalone = standalone || matchMedia('(display-mode: standalone)').matches; } catch (e) {}
66
+ var caps = { mic: 'unknown', gum: Boolean(navigator.mediaDevices && navigator.mediaDevices.getUserMedia) };
67
+ var opened = false;
68
+ var sendOpen = function (mic) {
69
+ if (opened) return;
70
+ opened = true; caps.mic = mic;
71
+ post({ k: 'open', page: page, v: v, ua: cut(navigator.userAgent, 400), touch: navigator.maxTouchPoints || 0, standalone: standalone, w: screen.width, h: screen.height, vw: innerWidth, vh: innerHeight, dpr: window.devicePixelRatio || 1, lang: cut(navigator.language, 20), caps: caps });
72
+ };
73
+ setTimeout(function () { sendOpen('unknown'); }, 1500);
74
+ try {
75
+ navigator.permissions.query({ name: 'microphone' }).then(function (st) {
76
+ sendOpen(st.state);
77
+ st.onchange = function () { post({ k: 'perm', page: page, what: 'mic', state: st.state }); };
78
+ }, function () { sendOpen('unknown'); });
79
+ } catch (e) { sendOpen('unknown'); }
80
+ fgSince = document.hidden ? 0 : Date.now();
81
+ document.addEventListener('visibilitychange', function () { if (document.hidden) flushFg(); else fgSince = Date.now(); });
82
+ window.addEventListener('pagehide', flushFg);
83
+ setInterval(function () { if (!document.hidden) flushFg(); }, 300000);
84
+ },
85
+ };
86
+ })();
87
+ `;
@@ -0,0 +1,11 @@
1
+ /**
2
+ * 孩子端的整页跳转:孩子端不往浏览器历史里加东西。首页 ↔ 听写、首页 ↔ 口语课、口语单交给老师页、打完电话回首页都是「替换当前页」,
3
+ * 孩子端在历史里永远只占一条——浏览器的后退、iPad 左边缘右滑在孩子端里不会把孩子带到旧页面,回首页只认左上角那颗胶囊。
4
+ * 起因:10-21 Jack 在 iPad 与 Mac Safari 上按后退没反应或像卡住——做过一次听写,历史成了「首页 → 听写 → 首页」,后退回到旧听写页或一个一样的首页,
5
+ * 孩子端开着麦克风与实时连接,Safari 不能原样存着秒回,只能整页重载、再连老师。
6
+ * 万一页面是从浏览器缓存里原样恢复的(pageshow.persisted),重载一次,不让孩子看到一个停住的旧画面。
7
+ * 用在孩子端首页 / 老师页(kid-page.ts,家长端、录像、预览不用)、听写(中、英)、口语课;tests/kid-nav.test.ts 盯着这几页都带它、没有 location.href 跳转。
8
+ * 脚本是 ES5、没有反斜杠与反引号(插进各页的模板字符串)。
9
+ */
10
+ /** kidGo(url):孩子端里跳到另一页,替换当前这条历史;页面里以 / 开头的同站链接点了也走它 */
11
+ export declare const KID_NAV_JS = "\n var kidGo = function (url) { location.replace(url); };\n document.addEventListener('click', function (e) {\n if (e.defaultPrevented || e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;\n var a = e.target && e.target.closest ? e.target.closest('a[href]') : null;\n if (!a || a.target) return;\n var href = a.getAttribute('href') || '';\n if (href.charAt(0) !== '/' || href.charAt(1) === '/') return;\n e.preventDefault(); kidGo(href);\n });\n window.addEventListener('pageshow', function (e) { if (e.persisted) location.reload(); });\n";
@@ -0,0 +1,22 @@
1
+ /**
2
+ * 孩子端的整页跳转:孩子端不往浏览器历史里加东西。首页 ↔ 听写、首页 ↔ 口语课、口语单交给老师页、打完电话回首页都是「替换当前页」,
3
+ * 孩子端在历史里永远只占一条——浏览器的后退、iPad 左边缘右滑在孩子端里不会把孩子带到旧页面,回首页只认左上角那颗胶囊。
4
+ * 起因:10-21 Jack 在 iPad 与 Mac Safari 上按后退没反应或像卡住——做过一次听写,历史成了「首页 → 听写 → 首页」,后退回到旧听写页或一个一样的首页,
5
+ * 孩子端开着麦克风与实时连接,Safari 不能原样存着秒回,只能整页重载、再连老师。
6
+ * 万一页面是从浏览器缓存里原样恢复的(pageshow.persisted),重载一次,不让孩子看到一个停住的旧画面。
7
+ * 用在孩子端首页 / 老师页(kid-page.ts,家长端、录像、预览不用)、听写(中、英)、口语课;tests/kid-nav.test.ts 盯着这几页都带它、没有 location.href 跳转。
8
+ * 脚本是 ES5、没有反斜杠与反引号(插进各页的模板字符串)。
9
+ */
10
+ /** kidGo(url):孩子端里跳到另一页,替换当前这条历史;页面里以 / 开头的同站链接点了也走它 */
11
+ export const KID_NAV_JS = `
12
+ var kidGo = function (url) { location.replace(url); };
13
+ document.addEventListener('click', function (e) {
14
+ if (e.defaultPrevented || e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;
15
+ var a = e.target && e.target.closest ? e.target.closest('a[href]') : null;
16
+ if (!a || a.target) return;
17
+ var href = a.getAttribute('href') || '';
18
+ if (href.charAt(0) !== '/' || href.charAt(1) === '/') return;
19
+ e.preventDefault(); kidGo(href);
20
+ });
21
+ window.addEventListener('pageshow', function (e) { if (e.persisted) location.reload(); });
22
+ `;
@@ -0,0 +1,9 @@
1
+ export declare const KID_PAGE: string;
2
+ export interface KidPageMode {
3
+ /** 录像里孩子的屏幕(/reel):孩子端的样子,数据是 /reel 给的一个话题,只读、不记、点不动 */
4
+ reel?: boolean;
5
+ /** 家长端「首页」里的预览(/preview):孩子端首页本身,点了告诉家长页,不跳走、不记看过了 */
6
+ preview?: boolean;
7
+ }
8
+ /** 孩子端页面(录像、预览也是它):标题(已转义)填进去;mode 见 KidPageMode,不给 = 孩子端 */
9
+ export declare function kidPage(title: string, mode?: KidPageMode, stageV?: string): string;