@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,53 @@
1
+ <script lang="ts" setup>
2
+ import { ref, watch } from 'vue';
3
+
4
+ import { useProseContext } from '../../composables/context.js';
5
+
6
+ const { icon, title } = defineProps<{
7
+ icon: string;
8
+ title: string;
9
+ brand?: boolean;
10
+ }>();
11
+
12
+ const { EruditIcon, EruditTransition } = useProseContext();
13
+
14
+ const key = ref(0);
15
+ watch(
16
+ () => [icon, title],
17
+ () => {
18
+ key.value++;
19
+ },
20
+ );
21
+ </script>
22
+
23
+ <template>
24
+ <button
25
+ :class="[
26
+ `relative cursor-pointer text-left text-xs
27
+ transition-[color,background]`,
28
+ brand
29
+ ? 'text-brand bg-brand/10'
30
+ : 'hocus:bg-bg-accent text-text-muted hocus:text-text',
31
+ ]"
32
+ >
33
+ <div
34
+ class="pointer-events-none invisible flex touch-none flex-wrap
35
+ items-center gap-(--asideMenuGapBig) px-(--asideMenuGapBig)
36
+ py-(--asideMenuGap)"
37
+ >
38
+ <EruditIcon :name="icon" class="shrink-0 text-[1.2em]" />
39
+ <div>{{ title }}</div>
40
+ </div>
41
+ <EruditTransition>
42
+ <div
43
+ :key
44
+ class="absolute top-0 left-0 flex flex-wrap items-center
45
+ gap-(--asideMenuGapBig) px-(--asideMenuGapBig)
46
+ py-(--asideMenuGap)"
47
+ >
48
+ <EruditIcon :name="icon" class="shrink-0 text-[1.2em]" />
49
+ <div>{{ title }}</div>
50
+ </div>
51
+ </EruditTransition>
52
+ </button>
53
+ </template>
@@ -0,0 +1,40 @@
1
+ <script lang="ts" setup>
2
+ import { ref } from 'vue';
3
+
4
+ import { useProseContext } from '../../composables/context.js';
5
+ import { useProseLanguage } from '../../composables/language.js';
6
+ import AsideMenuButton from './AsideMenuButton.vue';
7
+ import shareIcon from '../assets/share.svg?raw';
8
+ import checkIcon from '../assets/check.svg?raw';
9
+
10
+ const { elementId } = defineProps<{
11
+ elementId: string;
12
+ }>();
13
+
14
+ const { pathUrl, baseUrl } = useProseContext();
15
+ const prosePhrase = await useProseLanguage();
16
+
17
+ const copied = ref(false);
18
+ let resetTimer: number | undefined;
19
+
20
+ async function copyLink() {
21
+ await navigator.clipboard.writeText(
22
+ location.origin + baseUrl + pathUrl.substring(1) + '#' + elementId,
23
+ );
24
+ copied.value = true;
25
+ if (resetTimer) clearTimeout(resetTimer);
26
+ resetTimer = window.setTimeout(() => {
27
+ copied.value = false;
28
+ resetTimer = undefined;
29
+ }, 2500);
30
+ }
31
+ </script>
32
+
33
+ <template>
34
+ <AsideMenuButton
35
+ :brand="copied"
36
+ :icon="copied ? checkIcon : shareIcon"
37
+ :title="copied ? prosePhrase.copied : prosePhrase.copy_link"
38
+ @click="copyLink"
39
+ />
40
+ </template>
@@ -0,0 +1,3 @@
1
+ <template>
2
+ <hr class="border-border/80 my-(--asideMenuGap)" />
3
+ </template>
@@ -0,0 +1,270 @@
1
+ <script lang="ts" setup>
2
+ import {
3
+ onBeforeUnmount,
4
+ onMounted,
5
+ ref,
6
+ useTemplateRef,
7
+ watch,
8
+ watchEffect,
9
+ } from 'vue';
10
+ import { useFloating, autoUpdate, offset, shift } from '@floating-ui/vue';
11
+ import type { BlockSchema, ProseElement } from '@jsprose/core';
12
+
13
+ import { useProseContext } from '../../composables/context.js';
14
+ import { useElementIcon } from '../../composables/elementIcon.js';
15
+ import {
16
+ useIsAnchor,
17
+ useJumpToAnchor,
18
+ useResolveAnchor,
19
+ } from '../../composables/anchor.js';
20
+ import AsideMenu from './AsideMenu.vue';
21
+
22
+ const { element } = defineProps<{ element: ProseElement<BlockSchema> }>();
23
+ const { EruditIcon, EruditTransition } = useProseContext();
24
+ const elementIcon = await useElementIcon(element);
25
+
26
+ const blockElement = useTemplateRef('block');
27
+ const asideElement = useTemplateRef('aside');
28
+ const asideMenuElement = useTemplateRef('asideMenu');
29
+ const hover = ref(false);
30
+ const menuVisible = ref(false);
31
+
32
+ const { floatingStyles: floatingMenuStyle } = useFloating(
33
+ asideElement,
34
+ asideMenuElement,
35
+ {
36
+ whileElementsMounted: autoUpdate,
37
+ placement: 'right-start',
38
+ strategy: 'fixed',
39
+ middleware: [offset(10), shift({ rootBoundary: 'viewport' })],
40
+ },
41
+ );
42
+
43
+ const outsideClickHandler = (e: MouseEvent) => {
44
+ if (!menuVisible.value) return;
45
+ const aside = asideElement.value;
46
+ if (!aside) return;
47
+ if (aside.contains(e.target as Node)) return;
48
+ menuVisible.value = false;
49
+ };
50
+
51
+ const isAnchor = useIsAnchor(element);
52
+ const jumpToAnchor = useJumpToAnchor();
53
+ const resolveAnchor = useResolveAnchor();
54
+
55
+ /**
56
+ * Waits for the element's position to be stable in the viewport before resolving the anchor.
57
+ * Stability is defined as the element remaining in the same position for some duration.
58
+ * If the element moves during this period, the timer is reset.
59
+ *
60
+ * @param element - The DOM element to monitor for position stability
61
+ * @param onStable - Callback to execute once the element is stable
62
+ * @param onCleanup - Vue's cleanup callback to register cleanup handlers
63
+ */
64
+ const waitForStablePosition = (
65
+ element: HTMLElement,
66
+ onStable: () => void,
67
+ onCleanup: (fn: () => void) => void,
68
+ ) => {
69
+ const stableDuration = 300;
70
+
71
+ let lastPosition = { top: 0, left: 0 };
72
+ let stableTimer: number | undefined;
73
+ let animationFrameId: number | undefined;
74
+ let resolved = false;
75
+
76
+ /**
77
+ * Continuously checks if the element's position has changed.
78
+ * If a change is detected, the stability timer is reset.
79
+ * Uses requestAnimationFrame for efficient, synchronized position monitoring.
80
+ */
81
+ const checkStability = () => {
82
+ if (resolved) return;
83
+
84
+ const rect = element.getBoundingClientRect();
85
+ const currentPosition = { top: rect.top, left: rect.left };
86
+
87
+ // Detect position changes and reset stability timer
88
+ if (
89
+ lastPosition.top !== currentPosition.top ||
90
+ lastPosition.left !== currentPosition.left
91
+ ) {
92
+ lastPosition = currentPosition;
93
+ clearTimeout(stableTimer);
94
+
95
+ // Start new 200ms countdown for stability
96
+ stableTimer = window.setTimeout(() => {
97
+ resolved = true;
98
+ onStable();
99
+ }, stableDuration);
100
+ }
101
+
102
+ // Continue monitoring on next frame
103
+ animationFrameId = requestAnimationFrame(checkStability);
104
+ };
105
+
106
+ // Initialize tracking with current position
107
+ const initialRect = element.getBoundingClientRect();
108
+ lastPosition = { top: initialRect.top, left: initialRect.left };
109
+
110
+ // Start initial stability timer
111
+ stableTimer = window.setTimeout(() => {
112
+ resolved = true;
113
+ cancelAnimationFrame(animationFrameId!);
114
+ onStable();
115
+ }, stableDuration);
116
+
117
+ // Begin position monitoring
118
+ animationFrameId = requestAnimationFrame(checkStability);
119
+
120
+ // Cleanup timers and animation frames when effect is disposed
121
+ onCleanup(() => {
122
+ clearTimeout(stableTimer);
123
+ if (animationFrameId !== undefined) {
124
+ cancelAnimationFrame(animationFrameId);
125
+ }
126
+ });
127
+ };
128
+
129
+ watch(menuVisible, (visible) => {
130
+ if (visible) {
131
+ document.addEventListener('click', outsideClickHandler);
132
+ } else {
133
+ document.removeEventListener('click', outsideClickHandler);
134
+ }
135
+ });
136
+
137
+ onMounted(() => {
138
+ watchEffect(async (onCleanup) => {
139
+ if (isAnchor.value) {
140
+ jumpToAnchor(blockElement.value!);
141
+ waitForStablePosition(
142
+ blockElement.value!,
143
+ () => {
144
+ jumpToAnchor(blockElement.value!);
145
+ resolveAnchor();
146
+ },
147
+ onCleanup,
148
+ );
149
+ }
150
+ });
151
+
152
+ hover.value = blockElement.value!.matches(':hover');
153
+
154
+ blockElement.value!.addEventListener('mouseenter', () => {
155
+ hover.value = true;
156
+ });
157
+
158
+ blockElement.value!.addEventListener('mouseleave', () => {
159
+ hover.value = false;
160
+ });
161
+ });
162
+
163
+ onBeforeUnmount(() => {
164
+ document.removeEventListener('click', outsideClickHandler);
165
+ });
166
+ </script>
167
+
168
+ <template>
169
+ <div
170
+ ref="block"
171
+ :id="element.id"
172
+ :class="[$style.block, 'scroll-mt-big pr-(--proseAsideWidth)']"
173
+ >
174
+ <div :class="[$style.blockAbove, 'h-(--proseGap)']"></div>
175
+
176
+ <div class="relative">
177
+ <!-- Block Aside -->
178
+ <aside
179
+ ref="aside"
180
+ @click="menuVisible = !menuVisible"
181
+ class="group/aside absolute top-0 left-0 h-full
182
+ w-(--proseAsideWidth) cursor-pointer"
183
+ >
184
+ <!-- Aside Background -->
185
+ <div
186
+ class="micro:rounded-sm group-hocus/aside:bg-bg-accent
187
+ absolute top-0 left-0 h-full w-full bg-transparent
188
+ transition-[background]"
189
+ ></div>
190
+ <!-- Aside Icon -->
191
+ <div class="sticky top-0">
192
+ <EruditTransition mode="out-in">
193
+ <div v-if="hover" :key="elementIcon">
194
+ <EruditIcon
195
+ :name="elementIcon"
196
+ class="text-text-dimmed
197
+ group-hocus/aside:text-text m-auto mt-0.5
198
+ aspect-square w-[80%] transition-[color]"
199
+ />
200
+ </div>
201
+ </EruditTransition>
202
+ </div>
203
+ <!-- Aside Menu -->
204
+ <EruditTransition>
205
+ <div
206
+ ref="asideMenu"
207
+ :style="floatingMenuStyle"
208
+ v-if="menuVisible"
209
+ @click.stop
210
+ class="z-10 cursor-auto"
211
+ >
212
+ <AsideMenu :element />
213
+ </div>
214
+ </EruditTransition>
215
+ </aside>
216
+
217
+ <!-- Block Content -->
218
+ <main class="relative ml-(--proseAsideWidth)">
219
+ <slot></slot>
220
+ <!-- Anchor Overlay -->
221
+ <EruditTransition>
222
+ <div v-if="isAnchor">
223
+ <div
224
+ class="bg-brand animate-fade-out pointer-events-none
225
+ absolute -top-(--overlayPadding)
226
+ -right-(--overlayPadding)
227
+ -bottom-(--overlayPadding)
228
+ -left-(--overlayPadding) touch-none rounded
229
+ opacity-0
230
+ shadow-[0_0_18px_1px_var(--color-brand)]
231
+ [--overlayPadding:5px]"
232
+ ></div>
233
+ </div>
234
+ </EruditTransition>
235
+ </main>
236
+ </div>
237
+
238
+ <div :class="[$style.blockBelow, 'h-(--proseGap)']"></div>
239
+ </div>
240
+ </template>
241
+
242
+ <style module>
243
+ /* Always hide corresponding block gaps for frist/last blocks. */
244
+
245
+ .block:first-child > .blockAbove {
246
+ display: none !important;
247
+ }
248
+
249
+ .block:last-child > .blockBelow {
250
+ display: none !important;
251
+ }
252
+
253
+ /* Hiding bottom block gap by default, to compensate next block's top gap. */
254
+
255
+ .blockBelow {
256
+ display: none;
257
+ }
258
+
259
+ /* When hover/focus show block bottom gap to increase hoverable area and hide next block's top gap so no gap duplication happens. */
260
+
261
+ .block:hover:has(+ .block) > .blockBelow,
262
+ .block:focus:has(+ .block) > .blockBelow {
263
+ display: block;
264
+ }
265
+
266
+ .block:hover + .block > .blockAbove,
267
+ .block:focus + .block > .blockAbove {
268
+ display: none;
269
+ }
270
+ </style>
@@ -0,0 +1,11 @@
1
+ <script lang="ts" setup>
2
+ import type { InlinerSchema, ProseElement } from '@jsprose/core';
3
+
4
+ defineProps<{ element: ProseElement<InlinerSchema> }>();
5
+ </script>
6
+
7
+ <template>
8
+ <span>
9
+ <slot></slot>
10
+ </span>
11
+ </template>
@@ -0,0 +1,2 @@
1
+ export declare const lightInvert = "not-dark:invert not-dark:hue-rotate-180 transition-[filter]";
2
+ export declare const darkInvert = "dark:invert dark:hue-rotate-180 transition-[filter]";
@@ -0,0 +1,2 @@
1
+ export const lightInvert = "not-dark:invert not-dark:hue-rotate-180 transition-[filter]";
2
+ export const darkInvert = "dark:invert dark:hue-rotate-180 transition-[filter]";
@@ -0,0 +1,9 @@
1
+ import PhotoSwipeLightbox, { type PhotoSwipeOptions } from 'photoswipe/lightbox';
2
+ import 'photoswipe/style.css';
3
+ import './style.css';
4
+ export declare function usePhotoSwipe(): {
5
+ lightbox: import("vue").ShallowRef<PhotoSwipeLightbox | undefined, PhotoSwipeLightbox | undefined>;
6
+ initLightbox: (options: PhotoSwipeOptions, captionElement?: HTMLElement) => PhotoSwipeLightbox;
7
+ destroyLightbox: () => void;
8
+ patchCaptionHtml: (el: HTMLElement) => string;
9
+ };
@@ -0,0 +1,68 @@
1
+ import { shallowRef, onUnmounted } from "vue";
2
+ import PhotoSwipeLightbox from "photoswipe/lightbox";
3
+ import "photoswipe/style.css";
4
+ import "./style.css";
5
+ export function usePhotoSwipe() {
6
+ const lightbox = shallowRef();
7
+ const initLightbox = (options, captionElement) => {
8
+ lightbox.value = new PhotoSwipeLightbox({
9
+ pswpModule: () => import("photoswipe"),
10
+ imageClickAction: "toggle-controls",
11
+ bgClickAction: "close",
12
+ doubleTapAction: "zoom",
13
+ wheelToZoom: true,
14
+ bgOpacity: 1,
15
+ preloaderDelay: 0,
16
+ showAnimationDuration: 200,
17
+ hideAnimationDuration: 200,
18
+ ...options
19
+ });
20
+ lightbox.value.addFilter("isContentZoomable", () => true);
21
+ if (captionElement) {
22
+ lightbox.value.on("uiRegister", () => {
23
+ lightbox.value.pswp?.ui?.registerElement({
24
+ name: "caption",
25
+ className: "text-xs micro:text-sm absolute bottom-0 w-full text-center p-normal bg-bg-main/50 backdrop-blur-md",
26
+ order: 9,
27
+ isButton: false,
28
+ appendTo: "root",
29
+ html: patchCaptionHtml(captionElement)
30
+ });
31
+ });
32
+ }
33
+ lightbox.value.init();
34
+ lightbox.value.on("contentAppend", (e) => {
35
+ const { content } = e;
36
+ if (!content || !content.element) return;
37
+ const el = content.element;
38
+ el.style.opacity = "0";
39
+ el.style.transition = "opacity 0.2s ease";
40
+ requestAnimationFrame(() => {
41
+ el.style.opacity = "1";
42
+ });
43
+ });
44
+ return lightbox.value;
45
+ };
46
+ const patchCaptionHtml = (el) => {
47
+ const cloned = el.cloneNode(true);
48
+ cloned.querySelectorAll("a[href]").forEach((a) => {
49
+ a.setAttribute("target", "_blank");
50
+ });
51
+ return cloned.innerHTML;
52
+ };
53
+ const destroyLightbox = () => {
54
+ if (lightbox.value) {
55
+ lightbox.value.destroy();
56
+ lightbox.value = undefined;
57
+ }
58
+ };
59
+ onUnmounted(() => {
60
+ destroyLightbox();
61
+ });
62
+ return {
63
+ lightbox,
64
+ initLightbox,
65
+ destroyLightbox,
66
+ patchCaptionHtml
67
+ };
68
+ }
@@ -0,0 +1,26 @@
1
+ .pswp__icn {
2
+ width: 40px;
3
+ height: 40px;
4
+ padding: 3px;
5
+ background: color-mix(
6
+ in srgb,
7
+ light-dark(#d7d7d7, #3c3c3c),
8
+ transparent 30%
9
+ );
10
+ border-radius: 50%;
11
+ }
12
+
13
+ :root {
14
+ .pswp {
15
+ --pswp-bg: var(--color-bg-main);
16
+ --pswp-placeholder-bg: transparent;
17
+ }
18
+ }
19
+
20
+ :root[data-theme='light'] {
21
+ .pswp {
22
+ --pswp-icon-color: #3f3f3f;
23
+ --pswp-icon-color-secondary: white;
24
+ --pswp-icon-stroke-color: #3f3f3f;
25
+ }
26
+ }
@@ -0,0 +1,4 @@
1
+ export interface EruditProseContext {
2
+ language: string;
3
+ linkable?: boolean;
4
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,10 @@
1
+ import type { AnyRegistryItem } from '@jsprose/core';
2
+ export interface EruditProseCoreElement {
3
+ registryItem: AnyRegistryItem;
4
+ dependencies?: Record<string, {
5
+ transpile?: boolean;
6
+ optimize?: boolean;
7
+ }>;
8
+ }
9
+ export declare function defineEruditProseCoreElement<TElement extends EruditProseCoreElement>(coreElement: TElement): TElement;
10
+ export declare function defineEruditProseCoreElements<TElements extends readonly EruditProseCoreElement[]>(...coreElements: [...TElements]): TElements;
@@ -0,0 +1,6 @@
1
+ export function defineEruditProseCoreElement(coreElement) {
2
+ return coreElement;
3
+ }
4
+ export function defineEruditProseCoreElements(...coreElements) {
5
+ return coreElements;
6
+ }
@@ -0,0 +1,92 @@
1
+ <script lang="ts" setup>
2
+ import { shallowRef } from 'vue';
3
+ import { type ProseElement } from '@jsprose/core';
4
+
5
+ import {
6
+ isAccentMainElement,
7
+ type AccentMainSchema,
8
+ type AccentSchema,
9
+ type AccentSectionSchema,
10
+ } from './core.js';
11
+ import { accentSectionNamePhrase, type AccentAppOptions } from './app.js';
12
+ import { useAppElement } from '../../app/composables/appElement.js';
13
+ import { useElementPhrase } from '../../app/composables/language.js';
14
+ import { useElementIcon } from '../../app/composables/elementIcon.js';
15
+ import { useProseContext, type ElementPhrases } from '../../app/index.js';
16
+ import { useFormatText } from '../../app/composables/formatText.js';
17
+ import Block from '../../app/shared/block/Block.vue';
18
+ import Render from '../../app/shared/Render.vue';
19
+ import AccentColumnSection from './AccentColumnSection.vue';
20
+ import AccentRowSections from './AccentRowSections.vue';
21
+
22
+ const { element } = defineProps<{ element: ProseElement<AccentSchema> }>();
23
+
24
+ const { EruditIcon } = useProseContext();
25
+ const formatText = useFormatText();
26
+ const appElement = useAppElement(element);
27
+ const accentIcon = await useElementIcon(element);
28
+ const phrase =
29
+ await useElementPhrase<ElementPhrases<Record<string, string>>>(element);
30
+
31
+ const mainSection = shallowRef<ProseElement<AccentMainSchema>>();
32
+ const sections = shallowRef<ProseElement<AccentSectionSchema>[]>([]);
33
+
34
+ for (const child of element.children) {
35
+ if (isAccentMainElement(child)) {
36
+ mainSection.value = child;
37
+ } else {
38
+ sections.value.push(child);
39
+ }
40
+ }
41
+
42
+ const sectionTitles = sections.value.map((section) => {
43
+ if (section.data.type === 'manual') {
44
+ return formatText(section.data.title);
45
+ }
46
+
47
+ return formatText(phrase[accentSectionNamePhrase(section.data.name)]);
48
+ });
49
+
50
+ const accentOptions = (appElement as any)['accent'] as AccentAppOptions;
51
+ </script>
52
+
53
+ <template>
54
+ <Block :element>
55
+ <div
56
+ :style="{
57
+ '--accentText': accentOptions.colors.text,
58
+ '--accentBackground': accentOptions.colors.background,
59
+ '--accentBorder': accentOptions.colors.border,
60
+ }"
61
+ :class="[
62
+ `rounded-xl border border-(--accentBorder)
63
+ bg-(--accentBackground) transition-[background,border]`,
64
+ ]"
65
+ >
66
+ <div
67
+ class="text-main-lg flex items-center gap-(--proseAsideWidth)
68
+ px-(--proseAsideWidth) py-(--proseAsideWidth) font-semibold
69
+ text-(--accentText) transition-[color]"
70
+ >
71
+ <EruditIcon
72
+ :name="accentIcon"
73
+ class="-mr-1 shrink-0 text-[1.3em]"
74
+ />
75
+ <h2>{{ formatText(element.data.title) }}</h2>
76
+ </div>
77
+ <div class="pb-(--proseAsideWidth)">
78
+ <Render
79
+ v-for="sectionChild of mainSection!.children"
80
+ :element="sectionChild"
81
+ />
82
+ </div>
83
+ <AccentColumnSection
84
+ v-if="element.data.layout === 'column'"
85
+ v-for="(section, i) of sections"
86
+ :section
87
+ :title="sectionTitles[i]"
88
+ />
89
+ <AccentRowSections v-else :sections :sectionTitles />
90
+ </div>
91
+ </Block>
92
+ </template>
@@ -0,0 +1,61 @@
1
+ <script lang="ts" setup>
2
+ import { ref, watchEffect } from 'vue';
3
+ import type { ProseElement } from '@jsprose/core';
4
+
5
+ import type { AccentSectionSchema } from './core.js';
6
+ import { useProseContext } from '../../app/composables/context.js';
7
+ import { useContainsAnchor } from '../../app/composables/anchor.js';
8
+ import plusIcon from '../../app/shared/assets/plus.svg?raw';
9
+ import Render from '../../app/shared/Render.vue';
10
+
11
+ const { section } = defineProps<{
12
+ title: string;
13
+ section: ProseElement<AccentSectionSchema>;
14
+ }>();
15
+
16
+ const { EruditIcon } = useProseContext();
17
+ const containsAnchor = useContainsAnchor(section);
18
+
19
+ const opened = ref(false);
20
+
21
+ watchEffect(() => {
22
+ if (containsAnchor.value) {
23
+ opened.value = true;
24
+ }
25
+ });
26
+ </script>
27
+
28
+ <template>
29
+ <div>
30
+ <div
31
+ @click="opened = !opened"
32
+ class="group relative flex cursor-pointer items-center border-t
33
+ border-(--accentBorder) p-(--proseAsideWidth) font-medium
34
+ text-(--accentText) transition-[border]"
35
+ >
36
+ <div class="flex-1">{{ title }}</div>
37
+ <button
38
+ class="group-hocus:bg-(--accentBorder)/70 shrink-0 rounded
39
+ bg-transparent p-0.5 transition-[background]"
40
+ >
41
+ <EruditIcon
42
+ :name="plusIcon"
43
+ :class="[
44
+ 'micro:text-[26px] text-[22px] transition-[rotate]',
45
+ opened ? 'rotate-45' : '',
46
+ ]"
47
+ />
48
+ </button>
49
+ <div
50
+ :class="[
51
+ `absolute bottom-0 left-0 w-full border-b border-dashed
52
+ border-(--accentBorder) transition-[border]`,
53
+ opened ? 'opacity-100' : 'opacity-0',
54
+ ]"
55
+ ></div>
56
+ </div>
57
+ <div class="py-(--proseAsideWidth)" v-if="opened">
58
+ <Render v-for="child of section.children" :element="child" />
59
+ </div>
60
+ </div>
61
+ </template>