@erudit-js/prose 3.0.0-dev.25

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 (355) hide show
  1. package/dist/app/appElement.d.ts +19 -0
  2. package/dist/app/appElement.js +12 -0
  3. package/dist/app/component.d.ts +6 -0
  4. package/dist/app/component.js +6 -0
  5. package/dist/app/composables/anchor.d.ts +16 -0
  6. package/dist/app/composables/anchor.js +89 -0
  7. package/dist/app/composables/appElement.d.ts +4 -0
  8. package/dist/app/composables/appElement.js +16 -0
  9. package/dist/app/composables/context.d.ts +22 -0
  10. package/dist/app/composables/context.js +5 -0
  11. package/dist/app/composables/elementIcon.d.ts +3 -0
  12. package/dist/app/composables/elementIcon.js +5 -0
  13. package/dist/app/composables/formatText.d.ts +1 -0
  14. package/dist/app/composables/formatText.js +5 -0
  15. package/dist/app/composables/language.d.ts +8 -0
  16. package/dist/app/composables/language.js +13 -0
  17. package/dist/app/composables/storage.d.ts +5 -0
  18. package/dist/app/composables/storage.js +23 -0
  19. package/dist/app/default/Inliners.vue +11 -0
  20. package/dist/app/default/Mix.vue +11 -0
  21. package/dist/app/default/Text.vue +21 -0
  22. package/dist/app/icon.d.ts +5 -0
  23. package/dist/app/icon.js +7 -0
  24. package/dist/app/index.d.ts +18 -0
  25. package/dist/app/index.js +18 -0
  26. package/dist/app/language/element.d.ts +10 -0
  27. package/dist/app/language/element.js +12 -0
  28. package/dist/app/language/list/en.d.ts +3 -0
  29. package/dist/app/language/list/en.js +5 -0
  30. package/dist/app/language/list/ru.d.ts +3 -0
  31. package/dist/app/language/list/ru.js +5 -0
  32. package/dist/app/language/prose.d.ts +9 -0
  33. package/dist/app/language/prose.js +4 -0
  34. package/dist/app/shared/Prose.vue +36 -0
  35. package/dist/app/shared/Render.vue +51 -0
  36. package/dist/app/shared/assets/block.svg +3 -0
  37. package/dist/app/shared/assets/check.svg +3 -0
  38. package/dist/app/shared/assets/inliner.svg +3 -0
  39. package/dist/app/shared/assets/plus.svg +3 -0
  40. package/dist/app/shared/assets/share.svg +3 -0
  41. package/dist/app/shared/block/AsideMenu.vue +44 -0
  42. package/dist/app/shared/block/AsideMenuButton.vue +53 -0
  43. package/dist/app/shared/block/AsideMenuCopyLink.vue +40 -0
  44. package/dist/app/shared/block/AsideMenuSeparator.vue +3 -0
  45. package/dist/app/shared/block/Block.vue +270 -0
  46. package/dist/app/shared/inliner/Inliner.vue +11 -0
  47. package/dist/app/shared/invert.d.ts +2 -0
  48. package/dist/app/shared/invert.js +2 -0
  49. package/dist/app/shared/photoswipe/composable.d.ts +9 -0
  50. package/dist/app/shared/photoswipe/composable.js +68 -0
  51. package/dist/app/shared/photoswipe/style.css +26 -0
  52. package/dist/context.d.ts +4 -0
  53. package/dist/context.js +1 -0
  54. package/dist/coreElement.d.ts +10 -0
  55. package/dist/coreElement.js +6 -0
  56. package/dist/elements/accent/Accent.vue +92 -0
  57. package/dist/elements/accent/AccentColumnSection.vue +61 -0
  58. package/dist/elements/accent/AccentRowSections.vue +65 -0
  59. package/dist/elements/accent/app.d.ts +21 -0
  60. package/dist/elements/accent/app.js +16 -0
  61. package/dist/elements/accent/core.d.ts +340 -0
  62. package/dist/elements/accent/core.js +175 -0
  63. package/dist/elements/callout/Callout.vue +88 -0
  64. package/dist/elements/callout/_global.d.ts +15 -0
  65. package/dist/elements/callout/app.d.ts +9 -0
  66. package/dist/elements/callout/app.js +11 -0
  67. package/dist/elements/callout/core.d.ts +80 -0
  68. package/dist/elements/callout/core.js +37 -0
  69. package/dist/elements/callout/icon.svg +3 -0
  70. package/dist/elements/callout/languages/en.d.ts +4 -0
  71. package/dist/elements/callout/languages/en.js +2 -0
  72. package/dist/elements/callout/languages/ru.d.ts +4 -0
  73. package/dist/elements/callout/languages/ru.js +2 -0
  74. package/dist/elements/callout/storage.d.ts +2 -0
  75. package/dist/elements/callout/storage.js +5 -0
  76. package/dist/elements/caption/Caption.vue +47 -0
  77. package/dist/elements/caption/_global.d.ts +26 -0
  78. package/dist/elements/caption/app.d.ts +9 -0
  79. package/dist/elements/caption/app.js +6 -0
  80. package/dist/elements/caption/core.d.ts +114 -0
  81. package/dist/elements/caption/core.js +61 -0
  82. package/dist/elements/details/Details.vue +51 -0
  83. package/dist/elements/details/_global.d.ts +27 -0
  84. package/dist/elements/details/app.d.ts +9 -0
  85. package/dist/elements/details/app.js +11 -0
  86. package/dist/elements/details/core.d.ts +68 -0
  87. package/dist/elements/details/core.js +30 -0
  88. package/dist/elements/details/icon.svg +3 -0
  89. package/dist/elements/details/languages/en.d.ts +4 -0
  90. package/dist/elements/details/languages/en.js +2 -0
  91. package/dist/elements/details/languages/ru.d.ts +4 -0
  92. package/dist/elements/details/languages/ru.js +2 -0
  93. package/dist/elements/diagram/Diagram.vue +364 -0
  94. package/dist/elements/diagram/_global.d.ts +19 -0
  95. package/dist/elements/diagram/app.d.ts +30 -0
  96. package/dist/elements/diagram/app.js +11 -0
  97. package/dist/elements/diagram/core.d.ts +194 -0
  98. package/dist/elements/diagram/core.js +36 -0
  99. package/dist/elements/diagram/icon.svg +3 -0
  100. package/dist/elements/diagram/languages/en.d.ts +4 -0
  101. package/dist/elements/diagram/languages/en.js +2 -0
  102. package/dist/elements/diagram/languages/ru.d.ts +4 -0
  103. package/dist/elements/diagram/languages/ru.js +2 -0
  104. package/dist/elements/emphasis/Emphasis.vue +25 -0
  105. package/dist/elements/emphasis/_global.d.ts +18 -0
  106. package/dist/elements/emphasis/app.d.ts +9 -0
  107. package/dist/elements/emphasis/app.js +6 -0
  108. package/dist/elements/emphasis/core.d.ts +90 -0
  109. package/dist/elements/emphasis/core.js +32 -0
  110. package/dist/elements/flex/Flex.vue +32 -0
  111. package/dist/elements/flex/_global.d.ts +23 -0
  112. package/dist/elements/flex/app.d.ts +9 -0
  113. package/dist/elements/flex/app.js +11 -0
  114. package/dist/elements/flex/core.d.ts +67 -0
  115. package/dist/elements/flex/core.js +28 -0
  116. package/dist/elements/flex/icon.svg +3 -0
  117. package/dist/elements/flex/languages/en.d.ts +4 -0
  118. package/dist/elements/flex/languages/en.js +2 -0
  119. package/dist/elements/flex/languages/ru.d.ts +4 -0
  120. package/dist/elements/flex/languages/ru.js +2 -0
  121. package/dist/elements/gallery/Gallery.vue +56 -0
  122. package/dist/elements/gallery/_global.d.ts +18 -0
  123. package/dist/elements/gallery/app.d.ts +23 -0
  124. package/dist/elements/gallery/app.js +11 -0
  125. package/dist/elements/gallery/core.d.ts +138 -0
  126. package/dist/elements/gallery/core.js +21 -0
  127. package/dist/elements/gallery/icon.svg +3 -0
  128. package/dist/elements/gallery/languages/en.d.ts +4 -0
  129. package/dist/elements/gallery/languages/en.js +2 -0
  130. package/dist/elements/gallery/languages/ru.d.ts +4 -0
  131. package/dist/elements/gallery/languages/ru.js +2 -0
  132. package/dist/elements/heading/Heading.vue +44 -0
  133. package/dist/elements/heading/_global.d.ts +45 -0
  134. package/dist/elements/heading/app.d.ts +9 -0
  135. package/dist/elements/heading/app.js +11 -0
  136. package/dist/elements/heading/core.d.ts +108 -0
  137. package/dist/elements/heading/core.js +52 -0
  138. package/dist/elements/heading/icon.svg +3 -0
  139. package/dist/elements/heading/languages/en.d.ts +4 -0
  140. package/dist/elements/heading/languages/en.js +2 -0
  141. package/dist/elements/heading/languages/ru.d.ts +4 -0
  142. package/dist/elements/heading/languages/ru.js +2 -0
  143. package/dist/elements/horizontalLine/HorizontalLine.vue +6 -0
  144. package/dist/elements/horizontalLine/_global.d.ts +17 -0
  145. package/dist/elements/horizontalLine/app.d.ts +9 -0
  146. package/dist/elements/horizontalLine/app.js +6 -0
  147. package/dist/elements/horizontalLine/core.d.ts +54 -0
  148. package/dist/elements/horizontalLine/core.js +19 -0
  149. package/dist/elements/image/Image.vue +15 -0
  150. package/dist/elements/image/ImageElement.vue +80 -0
  151. package/dist/elements/image/_global.d.ts +18 -0
  152. package/dist/elements/image/app.d.ts +16 -0
  153. package/dist/elements/image/app.js +11 -0
  154. package/dist/elements/image/core.d.ts +136 -0
  155. package/dist/elements/image/core.js +44 -0
  156. package/dist/elements/image/icon.svg +3 -0
  157. package/dist/elements/image/languages/en.d.ts +4 -0
  158. package/dist/elements/image/languages/en.js +2 -0
  159. package/dist/elements/image/languages/ru.d.ts +4 -0
  160. package/dist/elements/image/languages/ru.js +2 -0
  161. package/dist/elements/image/storage.d.ts +6 -0
  162. package/dist/elements/image/storage.js +23 -0
  163. package/dist/elements/lineBreak/LineBreak.vue +3 -0
  164. package/dist/elements/lineBreak/_global.d.ts +18 -0
  165. package/dist/elements/lineBreak/app.d.ts +9 -0
  166. package/dist/elements/lineBreak/app.js +6 -0
  167. package/dist/elements/lineBreak/core.d.ts +54 -0
  168. package/dist/elements/lineBreak/core.js +19 -0
  169. package/dist/elements/link/BlockLink.vue +111 -0
  170. package/dist/elements/link/Link.vue +93 -0
  171. package/dist/elements/link/core.d.ts +13 -0
  172. package/dist/elements/link/core.js +12 -0
  173. package/dist/elements/link/dependency/_global.d.ts +47 -0
  174. package/dist/elements/link/dependency/app.d.ts +16 -0
  175. package/dist/elements/link/dependency/app.js +14 -0
  176. package/dist/elements/link/dependency/core.d.ts +125 -0
  177. package/dist/elements/link/dependency/core.js +51 -0
  178. package/dist/elements/link/dependency/languages/en.d.ts +4 -0
  179. package/dist/elements/link/dependency/languages/en.js +2 -0
  180. package/dist/elements/link/dependency/languages/ru.d.ts +4 -0
  181. package/dist/elements/link/dependency/languages/ru.js +2 -0
  182. package/dist/elements/link/icon.svg +3 -0
  183. package/dist/elements/link/reference/_global.d.ts +49 -0
  184. package/dist/elements/link/reference/app.d.ts +16 -0
  185. package/dist/elements/link/reference/app.js +14 -0
  186. package/dist/elements/link/reference/core.d.ts +120 -0
  187. package/dist/elements/link/reference/core.js +35 -0
  188. package/dist/elements/link/reference/languages/en.d.ts +4 -0
  189. package/dist/elements/link/reference/languages/en.js +2 -0
  190. package/dist/elements/link/reference/languages/ru.d.ts +4 -0
  191. package/dist/elements/link/reference/languages/ru.js +2 -0
  192. package/dist/elements/link/storage.d.ts +34 -0
  193. package/dist/elements/link/storage.js +20 -0
  194. package/dist/elements/list/List.vue +63 -0
  195. package/dist/elements/list/_global.d.ts +50 -0
  196. package/dist/elements/list/app.d.ts +16 -0
  197. package/dist/elements/list/app.js +11 -0
  198. package/dist/elements/list/core.d.ts +169 -0
  199. package/dist/elements/list/core.js +49 -0
  200. package/dist/elements/list/icon.svg +3 -0
  201. package/dist/elements/list/languages/en.d.ts +4 -0
  202. package/dist/elements/list/languages/en.js +2 -0
  203. package/dist/elements/list/languages/ru.d.ts +4 -0
  204. package/dist/elements/list/languages/ru.js +2 -0
  205. package/dist/elements/math/_global.d.ts +72 -0
  206. package/dist/elements/math/_global.ts +3 -0
  207. package/dist/elements/math/app.d.ts +16 -0
  208. package/dist/elements/math/app.js +20 -0
  209. package/dist/elements/math/block.d.ts +75 -0
  210. package/dist/elements/math/block.js +115 -0
  211. package/dist/elements/math/components/BlockMath.vue +30 -0
  212. package/dist/elements/math/components/InlinerMath.vue +65 -0
  213. package/dist/elements/math/components/Katex.vue +89 -0
  214. package/dist/elements/math/components/MathGroup.vue +39 -0
  215. package/dist/elements/math/core.d.ts +66 -0
  216. package/dist/elements/math/core.js +11 -0
  217. package/dist/elements/math/icon.svg +3 -0
  218. package/dist/elements/math/inliner.d.ts +64 -0
  219. package/dist/elements/math/inliner.js +85 -0
  220. package/dist/elements/math/katex.d.ts +8 -0
  221. package/dist/elements/math/katex.js +18 -0
  222. package/dist/elements/math/languages/en.d.ts +4 -0
  223. package/dist/elements/math/languages/en.js +2 -0
  224. package/dist/elements/math/languages/ru.d.ts +4 -0
  225. package/dist/elements/math/languages/ru.js +2 -0
  226. package/dist/elements/math/macros.d.ts +13 -0
  227. package/dist/elements/math/macros.js +12 -0
  228. package/dist/elements/paragraph/Paragraph.vue +27 -0
  229. package/dist/elements/paragraph/_global.d.ts +27 -0
  230. package/dist/elements/paragraph/app.d.ts +9 -0
  231. package/dist/elements/paragraph/app.js +11 -0
  232. package/dist/elements/paragraph/core.d.ts +67 -0
  233. package/dist/elements/paragraph/core.js +29 -0
  234. package/dist/elements/paragraph/icon.svg +4 -0
  235. package/dist/elements/paragraph/languages/en.d.ts +4 -0
  236. package/dist/elements/paragraph/languages/en.js +2 -0
  237. package/dist/elements/paragraph/languages/ru.d.ts +4 -0
  238. package/dist/elements/paragraph/languages/ru.js +2 -0
  239. package/dist/elements/problem/_global.d.ts +112 -0
  240. package/dist/elements/problem/app.d.ts +30 -0
  241. package/dist/elements/problem/app.js +27 -0
  242. package/dist/elements/problem/assets/actions/answer.svg +3 -0
  243. package/dist/elements/problem/assets/actions/check.svg +3 -0
  244. package/dist/elements/problem/assets/actions/generate.svg +3 -0
  245. package/dist/elements/problem/assets/actions/hint.svg +3 -0
  246. package/dist/elements/problem/assets/actions/note.svg +3 -0
  247. package/dist/elements/problem/assets/actions/solution.svg +3 -0
  248. package/dist/elements/problem/assets/attributes/applied.svg +3 -0
  249. package/dist/elements/problem/assets/attributes/inter.svg +3 -0
  250. package/dist/elements/problem/assets/attributes/method.svg +3 -0
  251. package/dist/elements/problem/assets/attributes/pretty.svg +1 -0
  252. package/dist/elements/problem/assets/icon.svg +3 -0
  253. package/dist/elements/problem/components/Problem.vue +22 -0
  254. package/dist/elements/problem/components/ProblemButton.vue +21 -0
  255. package/dist/elements/problem/components/ProblemContainer.vue +9 -0
  256. package/dist/elements/problem/components/ProblemContent.vue +371 -0
  257. package/dist/elements/problem/components/ProblemExpander.vue +7 -0
  258. package/dist/elements/problem/components/ProblemExpanderSection.vue +58 -0
  259. package/dist/elements/problem/components/ProblemHeader.vue +106 -0
  260. package/dist/elements/problem/components/Problems.vue +87 -0
  261. package/dist/elements/problem/components/SubProblem.vue +14 -0
  262. package/dist/elements/problem/components/expanders/Check.vue +151 -0
  263. package/dist/elements/problem/components/expanders/Checks.vue +83 -0
  264. package/dist/elements/problem/components/expanders/DefaultPlusSections.vue +38 -0
  265. package/dist/elements/problem/components/expanders/Hint.vue +26 -0
  266. package/dist/elements/problem/composables/phrase.d.ts +2 -0
  267. package/dist/elements/problem/composables/phrase.js +7 -0
  268. package/dist/elements/problem/composables/problemScript.d.ts +3 -0
  269. package/dist/elements/problem/composables/problemScript.js +11 -0
  270. package/dist/elements/problem/core.d.ts +248 -0
  271. package/dist/elements/problem/core.js +17 -0
  272. package/dist/elements/problem/languages/en.d.ts +3 -0
  273. package/dist/elements/problem/languages/en.js +24 -0
  274. package/dist/elements/problem/languages/ru.d.ts +3 -0
  275. package/dist/elements/problem/languages/ru.js +24 -0
  276. package/dist/elements/problem/phrases.d.ts +16 -0
  277. package/dist/elements/problem/phrases.js +1 -0
  278. package/dist/elements/problem/problem.d.ts +106 -0
  279. package/dist/elements/problem/problem.js +37 -0
  280. package/dist/elements/problem/problemContent.d.ts +439 -0
  281. package/dist/elements/problem/problemContent.js +236 -0
  282. package/dist/elements/problem/problemScript.d.ts +26 -0
  283. package/dist/elements/problem/problemScript.js +79 -0
  284. package/dist/elements/problem/problems.d.ts +212 -0
  285. package/dist/elements/problem/problems.js +74 -0
  286. package/dist/elements/problem/rng.d.ts +18 -0
  287. package/dist/elements/problem/rng.js +76 -0
  288. package/dist/elements/problem/shared.d.ts +28 -0
  289. package/dist/elements/problem/shared.js +42 -0
  290. package/dist/elements/problem/step.d.ts +5 -0
  291. package/dist/elements/problem/step.js +13 -0
  292. package/dist/elements/problem/storage.d.ts +5 -0
  293. package/dist/elements/problem/storage.js +8 -0
  294. package/dist/elements/table/Table.vue +104 -0
  295. package/dist/elements/table/_global.d.ts +36 -0
  296. package/dist/elements/table/app.d.ts +30 -0
  297. package/dist/elements/table/app.js +11 -0
  298. package/dist/elements/table/core.d.ts +324 -0
  299. package/dist/elements/table/core.js +65 -0
  300. package/dist/elements/table/icon.svg +3 -0
  301. package/dist/elements/table/languages/en.d.ts +4 -0
  302. package/dist/elements/table/languages/en.js +2 -0
  303. package/dist/elements/table/languages/ru.d.ts +4 -0
  304. package/dist/elements/table/languages/ru.js +2 -0
  305. package/dist/elements/video/Video.vue +109 -0
  306. package/dist/elements/video/_global.d.ts +18 -0
  307. package/dist/elements/video/app.d.ts +16 -0
  308. package/dist/elements/video/app.js +11 -0
  309. package/dist/elements/video/core.d.ts +128 -0
  310. package/dist/elements/video/core.js +43 -0
  311. package/dist/elements/video/icon.svg +3 -0
  312. package/dist/elements/video/languages/en.d.ts +4 -0
  313. package/dist/elements/video/languages/en.js +2 -0
  314. package/dist/elements/video/languages/ru.d.ts +4 -0
  315. package/dist/elements/video/languages/ru.js +2 -0
  316. package/dist/elements/video/storage.d.ts +2 -0
  317. package/dist/elements/video/storage.js +5 -0
  318. package/dist/include.d.ts +6 -0
  319. package/dist/include.js +42 -0
  320. package/dist/index.d.ts +15 -0
  321. package/dist/index.js +15 -0
  322. package/dist/rawElement.d.ts +6 -0
  323. package/dist/rawElement.js +3 -0
  324. package/dist/resolve.d.ts +20 -0
  325. package/dist/resolve.js +99 -0
  326. package/dist/resolveStep.d.ts +9 -0
  327. package/dist/resolveStep.js +3 -0
  328. package/dist/shared/filePath.d.ts +5 -0
  329. package/dist/shared/filePath.js +11 -0
  330. package/dist/shared/invert.d.ts +1 -0
  331. package/dist/shared/invert.js +1 -0
  332. package/dist/shared/paragraphWrap.d.ts +3 -0
  333. package/dist/shared/paragraphWrap.js +15 -0
  334. package/dist/shared/photoswipe.d.ts +10 -0
  335. package/dist/shared/photoswipe.js +10 -0
  336. package/dist/slugify/index.d.ts +1 -0
  337. package/dist/slugify/index.js +12 -0
  338. package/dist/slugify/languages/en.d.ts +2 -0
  339. package/dist/slugify/languages/en.js +3 -0
  340. package/dist/slugify/languages/ru.d.ts +2 -0
  341. package/dist/slugify/languages/ru.js +38 -0
  342. package/dist/snippet.d.ts +66 -0
  343. package/dist/snippet.js +57 -0
  344. package/dist/tag.d.ts +22 -0
  345. package/dist/tag.js +20 -0
  346. package/dist/title.d.ts +8 -0
  347. package/dist/title.js +6 -0
  348. package/dist/toc.d.ts +34 -0
  349. package/dist/toc.js +52 -0
  350. package/dist/utils/case.d.ts +4 -0
  351. package/dist/utils/case.js +8 -0
  352. package/dist/utils/docs.d.ts +1 -0
  353. package/dist/utils/docs.js +22 -0
  354. package/package.json +48 -0
  355. package/types.d.ts +4 -0
@@ -0,0 +1,151 @@
1
+ <script lang="ts" setup>
2
+ import { useTemplateRef, ref, watch } from 'vue';
3
+ import type { ProseElement } from '@jsprose/core';
4
+
5
+ import type { problemCheckSchema } from '../../problemContent.js';
6
+ import checkIcon from '../../assets/actions/check.svg?raw';
7
+ import plusIcon from '../../../../app/shared/assets/plus.svg?raw';
8
+ import successIcon from '../../../../app/shared/assets/check.svg?raw';
9
+ import { useFormatText } from '../../../../app/composables/formatText.js';
10
+ import { useProseContext } from '../../../../app/index.js';
11
+ import { useProblemPhrase } from '../../composables/phrase.js';
12
+
13
+ type CheckStatus = 'default' | 'correct' | 'wrong';
14
+ type CheckState = {
15
+ icon: string;
16
+ iconClass?: string;
17
+ labelClass: string;
18
+ inputClass: string;
19
+ buttonClass: string;
20
+ };
21
+
22
+ const { check, script } = defineProps<{
23
+ check: ProseElement<typeof problemCheckSchema>;
24
+ script?: {
25
+ check: (answer: string | undefined) => boolean;
26
+ clear: () => void;
27
+ };
28
+ }>();
29
+
30
+ const states: Record<CheckStatus, CheckState> = {
31
+ default: {
32
+ icon: checkIcon,
33
+ labelClass: 'text-text-muted',
34
+ inputClass: 'border-border text-text',
35
+ buttonClass:
36
+ 'text-text-muted border-border hocus:border-text-muted hocus:text-text',
37
+ },
38
+ correct: {
39
+ icon: successIcon,
40
+ labelClass: 'text-lime-600',
41
+ inputClass: 'text-lime-600 border-lime-500',
42
+ buttonClass: 'text-lime-600 border-lime-500',
43
+ },
44
+ wrong: {
45
+ icon: plusIcon,
46
+ iconClass: 'rotate-45',
47
+ labelClass: 'text-red-700 dark:text-red-400',
48
+ inputClass: 'text-red-700 dark:text-red-400 border-red-400',
49
+ buttonClass: 'text-red-700 dark:text-red-400 border-red-400',
50
+ },
51
+ };
52
+
53
+ const state = ref<CheckStatus>('default');
54
+
55
+ const formatText = useFormatText();
56
+ const { EruditIcon, EruditTransition } = useProseContext();
57
+ const phrase = await useProblemPhrase();
58
+
59
+ const answerInputElement = useTemplateRef('answer');
60
+ const answerInput = ref<string>('');
61
+ const lastCheckedInput = ref<string | undefined | null>(null);
62
+
63
+ watch(answerInput, () => {
64
+ state.value = 'default';
65
+ lastCheckedInput.value = null;
66
+ script?.clear();
67
+ });
68
+
69
+ function doCheck() {
70
+ let newInput = answerInput.value.trim().replace(/\s+/g, ' ') || undefined;
71
+
72
+ if (newInput === lastCheckedInput.value) {
73
+ return;
74
+ }
75
+
76
+ lastCheckedInput.value = newInput;
77
+
78
+ if (script) {
79
+ const isCorrect = script.check(newInput);
80
+ state.value = isCorrect ? 'correct' : 'wrong';
81
+ return;
82
+ }
83
+
84
+ const isCorrect = check.data.answers?.includes(newInput);
85
+ state.value = isCorrect ? 'correct' : 'wrong';
86
+ }
87
+ </script>
88
+
89
+ <template>
90
+ <div class="gap-small flex w-full flex-col">
91
+ <div
92
+ :class="[
93
+ 'text-main-sm font-medium transition-[color]',
94
+ states[state].labelClass,
95
+ ]"
96
+ >
97
+ <span @click="answerInputElement?.focus()">
98
+ {{ formatText(check.data.label ?? phrase.action_answer) + ':' }}
99
+ </span>
100
+ </div>
101
+ <form class="flex" @submit.prevent="doCheck">
102
+ <input
103
+ ref="answer"
104
+ type="text"
105
+ name="answer"
106
+ v-model="answerInput"
107
+ :placeholder="check.data.placeholder"
108
+ autocomplete="off"
109
+ :class="[
110
+ `bg-bg-main text-main-sm relative z-10 min-w-0 flex-1
111
+ rounded rounded-tr-none rounded-br-none border border-r-0
112
+ px-2.5 py-1 transition-[border,color,background]`,
113
+ states[state].inputClass,
114
+ ]"
115
+ />
116
+ <button
117
+ type="submit"
118
+ :class="[
119
+ `bg-bg-main relative w-[50px] cursor-pointer rounded
120
+ rounded-tl-none rounded-bl-none border outline-0
121
+ transition-[border,color,background]`,
122
+ states[state].buttonClass,
123
+ ]"
124
+ >
125
+ <EruditIcon
126
+ :key="state"
127
+ :name="states[state].icon"
128
+ :class="[
129
+ 'invisible m-auto text-[1.2em]',
130
+ states[state].iconClass,
131
+ ]"
132
+ />
133
+ <EruditTransition>
134
+ <EruditIcon
135
+ :key="state"
136
+ :name="states[state].icon"
137
+ :class="[
138
+ `absolute top-1/2 left-1/2 -translate-1/2
139
+ text-[1.2em]`,
140
+ states[state].iconClass,
141
+ ]"
142
+ />
143
+ </EruditTransition>
144
+ </button>
145
+ </form>
146
+
147
+ <div class="text-text-dimmed text-main-xs italic">
148
+ {{ check.data.hint ? formatText(check.data.hint) : '' }}
149
+ </div>
150
+ </div>
151
+ </template>
@@ -0,0 +1,83 @@
1
+ <script setup lang="ts">
2
+ import { ref, watchEffect } from 'vue';
3
+ import type { ProseElement } from '@jsprose/core';
4
+
5
+ import type {
6
+ CheckFunction,
7
+ problemCheckSchema,
8
+ } from '../../problemContent.js';
9
+ import ProblemExpander from '../ProblemExpander.vue';
10
+ import Check from './Check.vue';
11
+
12
+ const { value } = defineProps<{
13
+ value: {
14
+ checkElements: ProseElement<typeof problemCheckSchema>[];
15
+ checkFunction?: CheckFunction;
16
+ };
17
+ }>();
18
+
19
+ const scriptCheckFunction = (answer: string | undefined, name: string) => {
20
+ if (!value.checkFunction) {
21
+ console.warn('No check function defined for script checks!');
22
+ return false;
23
+ }
24
+
25
+ const checkResult = value.checkFunction({
26
+ answer,
27
+ name,
28
+ answers: scriptAnswers.value,
29
+ });
30
+
31
+ if (checkResult === true) {
32
+ scriptAnswers.value[name] = answer;
33
+ } else {
34
+ delete scriptAnswers.value[name];
35
+ }
36
+
37
+ return checkResult;
38
+ };
39
+
40
+ const scriptClearFunction = (name: string) => {
41
+ delete scriptAnswers.value[name];
42
+ };
43
+
44
+ const scriptCheckNameMap = new Map<
45
+ ProseElement<typeof problemCheckSchema>,
46
+ string
47
+ >();
48
+ for (const checkElement of value.checkElements) {
49
+ if (checkElement.data.script) {
50
+ scriptCheckNameMap.set(checkElement, checkElement.data.script);
51
+ }
52
+ }
53
+
54
+ const scriptAnswers = ref<Record<string, string | undefined>>({});
55
+ </script>
56
+
57
+ <template>
58
+ <ProblemExpander>
59
+ <div
60
+ class="micro:grid-cols-2 grid gap-(--proseAsideWidth)
61
+ p-(--proseAsideWidth)"
62
+ >
63
+ <Check
64
+ v-for="check of value.checkElements"
65
+ :check
66
+ :script="
67
+ check.data.script
68
+ ? {
69
+ check: (answer: string | undefined) => {
70
+ const name = scriptCheckNameMap.get(check)!;
71
+ return scriptCheckFunction(answer, name);
72
+ },
73
+ clear: () => {
74
+ const name = scriptCheckNameMap.get(check)!;
75
+ scriptClearFunction(name);
76
+ },
77
+ }
78
+ : undefined
79
+ "
80
+ />
81
+ </div>
82
+ </ProblemExpander>
83
+ </template>
@@ -0,0 +1,38 @@
1
+ <script lang="ts" setup>
2
+ import { watchEffect } from 'vue';
3
+ import {
4
+ isProseElement,
5
+ type AnySchema,
6
+ type ProseElement,
7
+ } from '@jsprose/core';
8
+
9
+ import { problemSectionSchema } from '../../problemContent.js';
10
+ import { useArrayContainsAnchor } from '../../../../app/composables/anchor.js';
11
+ import ProblemExpander from '../ProblemExpander.vue';
12
+ import ProblemExpanderSection from '../ProblemExpanderSection.vue';
13
+ import Render from '../../../../app/shared/Render.vue';
14
+
15
+ const { value } = defineProps<{ value: ProseElement<AnySchema> }>();
16
+
17
+ const defaultBlocks = value.children!.filter(
18
+ (element) => !isProseElement(element, problemSectionSchema),
19
+ );
20
+
21
+ const sections = value.children!.filter((element) =>
22
+ isProseElement(element, problemSectionSchema),
23
+ ) as ProseElement<typeof problemSectionSchema>[];
24
+ </script>
25
+
26
+ <template>
27
+ <ProblemExpander>
28
+ <div v-if="defaultBlocks.length" class="py-(--proseAsideWidth)">
29
+ <Render v-for="child of defaultBlocks" :element="child" />
30
+ </div>
31
+ <ProblemExpanderSection
32
+ v-if="sections.length"
33
+ v-for="section of sections"
34
+ :title="section.data"
35
+ :element="section"
36
+ />
37
+ </ProblemExpander>
38
+ </template>
@@ -0,0 +1,26 @@
1
+ <script lang="ts" setup>
2
+ import type { ProseElement } from '@jsprose/core';
3
+
4
+ import type { problemHintSchema } from '../../problemContent.js';
5
+ import { useProblemPhrase } from '../../composables/phrase.js';
6
+ import ProblemExpander from '../ProblemExpander.vue';
7
+ import Render from '../../../../app/shared/Render.vue';
8
+ import ProblemExpanderSection from '../ProblemExpanderSection.vue';
9
+
10
+ defineProps<{ value: ProseElement<typeof problemHintSchema>[] }>();
11
+ const phrase = await useProblemPhrase();
12
+ </script>
13
+
14
+ <template>
15
+ <ProblemExpander>
16
+ <div v-if="value.length === 1" class="py-(--proseAsideWidth)">
17
+ <Render v-for="child of value[0]!.children" :element="child" />
18
+ </div>
19
+ <ProblemExpanderSection
20
+ v-else
21
+ v-for="(hint, i) of value"
22
+ :title="phrase.action_hint + ' ' + (i + 1)"
23
+ :element="hint"
24
+ />
25
+ </ProblemExpander>
26
+ </template>
@@ -0,0 +1,2 @@
1
+ import type { ProblemPhrases } from '../phrases.js';
2
+ export declare function useProblemPhrase(): Promise<ProblemPhrases>;
@@ -0,0 +1,7 @@
1
+ import { useProseContext } from "../../../app/composables/context.js";
2
+ import { problemSchema } from "../problem.js";
3
+ export async function useProblemPhrase() {
4
+ const { appElements, languageCode } = useProseContext();
5
+ const problemAppElement = appElements[problemSchema.name];
6
+ return await problemAppElement.languages[languageCode]();
7
+ }
@@ -0,0 +1,3 @@
1
+ import type { AnyUnique } from '@jsprose/core';
2
+ import type { ProblemScriptInstance } from '../problemScript.js';
3
+ export declare function createProblemScriptInstance(scriptUrl?: string, scriptUniques?: Record<string, AnyUnique>): Promise<ProblemScriptInstance | undefined>;
@@ -0,0 +1,11 @@
1
+ export async function createProblemScriptInstance(scriptUrl, scriptUniques) {
2
+ if (!scriptUrl || !scriptUniques) {
3
+ return;
4
+ }
5
+ const problemScriptModule = await import(
6
+ /* @vite-ignore */
7
+ scriptUrl
8
+ );
9
+ const problemScript = problemScriptModule.default;
10
+ return problemScript(scriptUniques);
11
+ }
@@ -0,0 +1,248 @@
1
+ declare const _default: [{
2
+ registryItem: import("@jsprose/core").RegistryItem<{
3
+ name: "problemDescription";
4
+ type: "block";
5
+ linkable: false;
6
+ Data: undefined;
7
+ Storage: undefined;
8
+ Children: import("@jsprose/core").AnySchema[];
9
+ }, {
10
+ ProblemDescription: import("@jsprose/core").Tag<"ProblemDescription", {
11
+ name: "problemDescription";
12
+ type: "block";
13
+ linkable: false;
14
+ Data: undefined;
15
+ Storage: undefined;
16
+ Children: import("@jsprose/core").AnySchema[];
17
+ }, import("@jsprose/core").TagChildren>;
18
+ }, undefined>;
19
+ }, {
20
+ registryItem: import("@jsprose/core").RegistryItem<{
21
+ name: "problemHint";
22
+ type: "block";
23
+ linkable: false;
24
+ Data: undefined;
25
+ Storage: undefined;
26
+ Children: import("@jsprose/core").AnySchema[];
27
+ }, {
28
+ ProblemHint: import("@jsprose/core").Tag<"ProblemHint", {
29
+ name: "problemHint";
30
+ type: "block";
31
+ linkable: false;
32
+ Data: undefined;
33
+ Storage: undefined;
34
+ Children: import("@jsprose/core").AnySchema[];
35
+ }, import("@jsprose/core").TagChildren>;
36
+ }, undefined>;
37
+ }, {
38
+ registryItem: import("@jsprose/core").RegistryItem<{
39
+ name: "problemAnswer";
40
+ type: "block";
41
+ linkable: false;
42
+ Data: undefined;
43
+ Storage: undefined;
44
+ Children: import("@jsprose/core").AnySchema[];
45
+ }, {
46
+ ProblemAnswer: import("@jsprose/core").Tag<"ProblemAnswer", {
47
+ name: "problemAnswer";
48
+ type: "block";
49
+ linkable: false;
50
+ Data: undefined;
51
+ Storage: undefined;
52
+ Children: import("@jsprose/core").AnySchema[];
53
+ }, import("@jsprose/core").TagChildren>;
54
+ }, undefined>;
55
+ }, {
56
+ registryItem: import("@jsprose/core").RegistryItem<{
57
+ name: "problemSolution";
58
+ type: "block";
59
+ linkable: false;
60
+ Data: undefined;
61
+ Storage: undefined;
62
+ Children: import("@jsprose/core").AnySchema[];
63
+ }, {
64
+ ProblemSolution: import("@jsprose/core").Tag<"ProblemSolution", {
65
+ name: "problemSolution";
66
+ type: "block";
67
+ linkable: false;
68
+ Data: undefined;
69
+ Storage: undefined;
70
+ Children: import("@jsprose/core").AnySchema[];
71
+ }, import("@jsprose/core").TagChildren>;
72
+ }, undefined>;
73
+ }, {
74
+ registryItem: import("@jsprose/core").RegistryItem<{
75
+ name: "problemNote";
76
+ type: "block";
77
+ linkable: false;
78
+ Data: undefined;
79
+ Storage: undefined;
80
+ Children: import("@jsprose/core").AnySchema[];
81
+ }, {
82
+ ProblemNote: import("@jsprose/core").Tag<"ProblemNote", {
83
+ name: "problemNote";
84
+ type: "block";
85
+ linkable: false;
86
+ Data: undefined;
87
+ Storage: undefined;
88
+ Children: import("@jsprose/core").AnySchema[];
89
+ }, import("@jsprose/core").TagChildren>;
90
+ }, undefined>;
91
+ }, {
92
+ registryItem: import("@jsprose/core").RegistryItem<{
93
+ name: "problemCheck";
94
+ type: "block";
95
+ linkable: false;
96
+ Data: import("./problemContent.js").ProblemCheckData;
97
+ Storage: undefined;
98
+ Children: import("@jsprose/core").BlockSchema[];
99
+ }, {
100
+ ProblemCheck: import("@jsprose/core").Tag<"ProblemCheck", {
101
+ name: "problemCheck";
102
+ type: "block";
103
+ linkable: false;
104
+ Data: import("./problemContent.js").ProblemCheckData;
105
+ Storage: undefined;
106
+ Children: import("@jsprose/core").BlockSchema[];
107
+ }, ({
108
+ label?: string;
109
+ hint?: string;
110
+ placeholder?: string;
111
+ } & (({
112
+ answer: string | number;
113
+ answers?: undefined;
114
+ script?: undefined;
115
+ } | {
116
+ answers: (string | number)[];
117
+ answer?: undefined;
118
+ script?: undefined;
119
+ } | {
120
+ script: string;
121
+ answers?: undefined;
122
+ answer?: undefined;
123
+ }) & import("@jsprose/core").NoTagChildren)) & {}>;
124
+ }, undefined>;
125
+ }, {
126
+ registryItem: import("@jsprose/core").RegistryItem<{
127
+ name: "problemSection";
128
+ type: "block";
129
+ linkable: false;
130
+ Data: string;
131
+ Storage: undefined;
132
+ Children: import("@jsprose/core").AnySchema[];
133
+ }, {
134
+ ProblemSection: import("@jsprose/core").Tag<"ProblemSection", {
135
+ name: "problemSection";
136
+ type: "block";
137
+ linkable: false;
138
+ Data: string;
139
+ Storage: undefined;
140
+ Children: import("@jsprose/core").AnySchema[];
141
+ }, {
142
+ title: string;
143
+ } & import("@jsprose/core").TagChildren>;
144
+ }, undefined>;
145
+ }, {
146
+ registryItem: import("@jsprose/core").RegistryItem<{
147
+ name: "problem";
148
+ type: "block";
149
+ linkable: true;
150
+ Data: import("./problem.js").ProblemData;
151
+ Storage: import("./storage.js").ProblemScriptStorage;
152
+ Children: import("./problemContent.js").ProblemContentChild[];
153
+ }, {
154
+ Problem: import("@jsprose/core").Tag<"Problem", {
155
+ name: "problem";
156
+ type: "block";
157
+ linkable: true;
158
+ Data: import("./problem.js").ProblemData;
159
+ Storage: import("./storage.js").ProblemScriptStorage;
160
+ Children: import("./problemContent.js").ProblemContentChild[];
161
+ }, ({
162
+ title: string;
163
+ level: import("./shared.js").ProblemLevel;
164
+ attributes?: (import("./shared.js").ProblemAttribute | import("./shared.js").ProblemCustomAttribute)[];
165
+ } & {
166
+ pretty?: true | undefined;
167
+ applied?: true | undefined;
168
+ method?: true | undefined;
169
+ inter?: true | undefined;
170
+ } & ({
171
+ children: {};
172
+ script?: undefined;
173
+ } | {
174
+ script: import("./problemScript.js").ProblemScriptInstance;
175
+ children?: undefined;
176
+ })) & import("../../toc.js").ObjPropToc & import("../../snippet.js").ObjPropSnippet & import("../../snippet.js").ObjPropSearch & import("../../snippet.js").ObjPropQuick & import("../../snippet.js").ObjPropSeo>;
177
+ }, undefined>;
178
+ }, {
179
+ registryItem: import("@jsprose/core").RegistryItem<{
180
+ name: "subProblem";
181
+ type: "block";
182
+ linkable: false;
183
+ Data: import("./problems.js").SubProblemData;
184
+ Storage: import("./storage.js").ProblemScriptStorage;
185
+ Children: import("./problemContent.js").ProblemContentChild[];
186
+ }, {
187
+ SubProblem: import("@jsprose/core").Tag<"SubProblem", {
188
+ name: "subProblem";
189
+ type: "block";
190
+ linkable: false;
191
+ Data: import("./problems.js").SubProblemData;
192
+ Storage: import("./storage.js").ProblemScriptStorage;
193
+ Children: import("./problemContent.js").ProblemContentChild[];
194
+ }, ({
195
+ label?: string;
196
+ } & {
197
+ children: {};
198
+ script?: undefined;
199
+ }) | ({
200
+ label?: string;
201
+ } & {
202
+ script: import("./problemScript.js").ProblemScriptInstance;
203
+ children?: undefined;
204
+ })>;
205
+ }, undefined>;
206
+ }, {
207
+ registryItem: import("@jsprose/core").RegistryItem<{
208
+ name: "problems";
209
+ type: "block";
210
+ linkable: true;
211
+ Data: import("./shared.js").ProblemInfo;
212
+ Storage: undefined;
213
+ Children: (import("@jsprose/core").BlockSchema | {
214
+ name: "subProblem";
215
+ type: "block";
216
+ linkable: false;
217
+ Data: import("./problems.js").SubProblemData;
218
+ Storage: import("./storage.js").ProblemScriptStorage;
219
+ Children: import("./problemContent.js").ProblemContentChild[];
220
+ })[];
221
+ }, {
222
+ Problems: import("@jsprose/core").Tag<"Problems", {
223
+ name: "problems";
224
+ type: "block";
225
+ linkable: true;
226
+ Data: import("./shared.js").ProblemInfo;
227
+ Storage: undefined;
228
+ Children: (import("@jsprose/core").BlockSchema | {
229
+ name: "subProblem";
230
+ type: "block";
231
+ linkable: false;
232
+ Data: import("./problems.js").SubProblemData;
233
+ Storage: import("./storage.js").ProblemScriptStorage;
234
+ Children: import("./problemContent.js").ProblemContentChild[];
235
+ })[];
236
+ }, {
237
+ title: string;
238
+ level: import("./shared.js").ProblemLevel;
239
+ attributes?: (import("./shared.js").ProblemAttribute | import("./shared.js").ProblemCustomAttribute)[];
240
+ } & {
241
+ pretty?: true | undefined;
242
+ applied?: true | undefined;
243
+ method?: true | undefined;
244
+ inter?: true | undefined;
245
+ } & import("@jsprose/core").TagChildren & import("../../toc.js").ObjPropToc & import("../../snippet.js").ObjPropSnippet & import("../../snippet.js").ObjPropSearch & import("../../snippet.js").ObjPropQuick & import("../../snippet.js").ObjPropSeo>;
246
+ }, undefined>;
247
+ }];
248
+ export default _default;
@@ -0,0 +1,17 @@
1
+ import { defineEruditProseCoreElements } from "../../coreElement.js";
2
+ import { problemCoreElement } from "./problem.js";
3
+ import { problemAnswer, problemCheckCoreElement, problemDescriptionCoreElement, problemHintCoreElement, problemNote, problemSectionCoreElement, problemSolution } from "./problemContent.js";
4
+ import { problemsCoreElement, subProblemCoreElement } from "./problems.js";
5
+ export default defineEruditProseCoreElements(
6
+ problemDescriptionCoreElement,
7
+ problemHintCoreElement,
8
+ problemAnswer.coreElement,
9
+ problemSolution.coreElement,
10
+ problemNote.coreElement,
11
+ problemCheckCoreElement,
12
+ problemSectionCoreElement,
13
+ //
14
+ problemCoreElement,
15
+ subProblemCoreElement,
16
+ problemsCoreElement
17
+ );
@@ -0,0 +1,3 @@
1
+ import type { ProblemPhrases } from '../phrases.js';
2
+ declare const _default: ProblemPhrases;
3
+ export default _default;
@@ -0,0 +1,24 @@
1
+ import { defineElementLanguage } from "../../../app/language/element.js";
2
+ export default defineElementLanguage({
3
+ element_name: "Problem",
4
+ "level.example": "Example",
5
+ "level.easy": "Elementary",
6
+ "level.medium": "Intermediate",
7
+ "level.hard": "Advanced",
8
+ "attribute.pretty": "Elegant",
9
+ "attribute_explain.pretty": "This problem has an elegant and pretty solution.",
10
+ "attribute.applied": "Applied",
11
+ "attribute_explain.applied": "This problem makes practical sense in real life or useful in other subjects.",
12
+ "attribute.method": "Method",
13
+ "attribute_explain.method": "This problem introduces a handy method or technique for solving similar problems.",
14
+ "attribute.inter": "Inter-Subject",
15
+ "attribute_explain.inter": "This problem connects different subjects or topics.",
16
+ level_hint: "Level of mastery of material",
17
+ action_hint: "Hint",
18
+ action_solution: "Solution",
19
+ action_answer: "Answer",
20
+ action_note: "Note",
21
+ action_check: "Check",
22
+ action_generate: "Similar",
23
+ seed_explain: "The seed from which all random values in the problem are calculated. Same seeds = completely identical problems."
24
+ });
@@ -0,0 +1,3 @@
1
+ import type { ProblemPhrases } from '../phrases.js';
2
+ declare const _default: ProblemPhrases;
3
+ export default _default;
@@ -0,0 +1,24 @@
1
+ import { defineElementLanguage } from "../../../app/language/element.js";
2
+ export default defineElementLanguage({
3
+ element_name: "Задача",
4
+ "level.example": "Пример",
5
+ "level.easy": "Ликбез",
6
+ "level.medium": "Нормальный",
7
+ "level.hard": "Продвинутый",
8
+ "attribute.pretty": "Красивая",
9
+ "attribute_explain.pretty": "Эта задача имеет элегантное и красивое решение.",
10
+ "attribute.applied": "Прикладная",
11
+ "attribute_explain.applied": "Эта задача имеет практический смысл в реальной жизни или полезна в других предметах.",
12
+ "attribute.method": "Прием",
13
+ "attribute_explain.method": "Эта задача вводит полезный метод или технику для решения аналогичных задач.",
14
+ "attribute.inter": "Межпредметная",
15
+ "attribute_explain.inter": "Эта задача объединяет разные предметы или темы.",
16
+ level_hint: "Уровень владения материалом",
17
+ action_hint: "Подсказка",
18
+ action_solution: "Решение",
19
+ action_answer: "Ответ",
20
+ action_note: "Примечание",
21
+ action_check: "Проверить",
22
+ action_generate: "Аналог",
23
+ seed_explain: "Зерно, от которого высчитываются все случайные величины в задаче. Одинаковые зерна = полностью идентичные задачи."
24
+ });
@@ -0,0 +1,16 @@
1
+ import type { ElementPhrases } from '../../app/language/element.js';
2
+ import type { ProblemAttribute, ProblemLevel } from './shared.js';
3
+ export type ProblemPhrases = ElementPhrases<{
4
+ [K in `level.${ProblemLevel}`]: string;
5
+ } & {
6
+ [K in `attribute.${ProblemAttribute}` | `attribute_explain.${ProblemAttribute}`]: string;
7
+ } & {
8
+ level_hint: string;
9
+ action_hint: string;
10
+ action_solution: string;
11
+ action_answer: string;
12
+ action_note: string;
13
+ action_check: string;
14
+ action_generate: string;
15
+ seed_explain: string;
16
+ }>;
@@ -0,0 +1 @@
1
+ export {};