erudit 4.0.0-dev.4 → 4.0.0-dev.5

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 (336) hide show
  1. package/.nuxtrc +1 -1
  2. package/app/app.vue +34 -34
  3. package/app/components/EruditLink.ts +7 -7
  4. package/app/components/FancyBold.vue +16 -16
  5. package/app/components/FancyCard.vue +52 -58
  6. package/app/components/FancyCardTag.vue +16 -16
  7. package/app/components/Loading.vue +7 -7
  8. package/app/components/Prose.vue +55 -52
  9. package/app/components/ScrollHolder.vue +13 -13
  10. package/app/components/SmartMedia.vue +107 -112
  11. package/app/components/ads/Ads.vue +17 -17
  12. package/app/components/ads/AdsBannerAside.vue +29 -29
  13. package/app/components/ads/AdsBannerBottom.vue +6 -6
  14. package/app/components/ads/AdsReplacer.vue +19 -21
  15. package/app/components/ads/provider/Custom.vue +9 -9
  16. package/app/components/ads/provider/Yandex.vue +56 -56
  17. package/app/components/aside/AsideListItem.vue +47 -52
  18. package/app/components/aside/AsideMajor.vue +6 -6
  19. package/app/components/aside/AsideMinor.vue +47 -52
  20. package/app/components/aside/AsidePlainMessage.vue +9 -9
  21. package/app/components/aside/AsideSwitch.vue +53 -54
  22. package/app/components/aside/major/PaneHolder.vue +61 -61
  23. package/app/components/aside/major/PaneSwitcher.vue +50 -55
  24. package/app/components/aside/major/PaneSwitcherButton.vue +24 -24
  25. package/app/components/aside/major/PaneTemplate.vue +3 -3
  26. package/app/components/aside/major/SiteInfo.vue +40 -42
  27. package/app/components/aside/major/contentNav/PaneBookNav.vue +107 -116
  28. package/app/components/aside/major/contentNav/PaneGlobalNav.vue +19 -19
  29. package/app/components/aside/major/contentNav/items/ContentNavBook.vue +8 -8
  30. package/app/components/aside/major/contentNav/items/ContentNavFolder.vue +55 -56
  31. package/app/components/aside/major/contentNav/items/ContentNavItem.vue +16 -16
  32. package/app/components/aside/major/contentNav/items/ContentNavPage.vue +2 -6
  33. package/app/components/aside/major/contentNav/items/ContentNavSeparator.vue +34 -35
  34. package/app/components/aside/major/contentNav/items/ContentNavTopic.vue +6 -6
  35. package/app/components/aside/major/contentNav/items/Flags.vue +31 -33
  36. package/app/components/aside/major/contentNav/items/ItemTemplate.vue +13 -13
  37. package/app/components/aside/major/languages/PaneLanguages.vue +40 -40
  38. package/app/components/aside/major/pages/PanePages.vue +45 -45
  39. package/app/components/aside/major/search/PaneSearch.vue +109 -100
  40. package/app/components/aside/major/search/SearchInput.vue +52 -53
  41. package/app/components/aside/major/search/SearchResult.vue +123 -75
  42. package/app/components/aside/major/search/SearchStatus.vue +28 -28
  43. package/app/components/aside/major/search/search.worker.ts +129 -129
  44. package/app/components/aside/major/settings/BuildTime.vue +15 -15
  45. package/app/components/aside/major/settings/EngineVersion.vue +8 -7
  46. package/app/components/aside/major/settings/PaneSettings.vue +8 -8
  47. package/app/components/aside/major/settings/ThemeSwitcher.vue +36 -36
  48. package/app/components/aside/major/settings/repository/Repository.vue +18 -18
  49. package/app/components/aside/major/settings/repository/SecondaryGitHub.vue +47 -47
  50. package/app/components/aside/minor/AsideMinorPane.vue +5 -5
  51. package/app/components/aside/minor/AsideMinorPlainHeader.vue +20 -20
  52. package/app/components/aside/minor/content/AsideMinorContentContributions.vue +47 -51
  53. package/app/components/aside/minor/content/AsideMinorContentPage.vue +37 -37
  54. package/app/components/aside/minor/content/AsideMinorContentTopic.vue +61 -66
  55. package/app/components/aside/minor/content/ButtonPaneContributions.vue +101 -114
  56. package/app/components/aside/minor/content/ButtonPaneImprove.vue +112 -123
  57. package/app/components/aside/minor/content/Contribution.vue +36 -36
  58. package/app/components/aside/minor/content/Toc.vue +163 -163
  59. package/app/components/aside/minor/content/TocItem.vue +91 -91
  60. package/app/components/aside/minor/content/TopicPartButton.vue +35 -35
  61. package/app/components/aside/minor/contributor/AsideMinorContributor.vue +36 -39
  62. package/app/components/aside/minor/contributor/ItemBook.vue +33 -39
  63. package/app/components/aside/minor/contributor/ItemContent.vue +17 -17
  64. package/app/components/aside/minor/news/AsideMinorNews.vue +132 -132
  65. package/app/components/aside/minor/news/NewsItem.vue +69 -69
  66. package/app/components/aside/minor/news/RenderNewsElement.vue +42 -42
  67. package/app/components/aside/minor/news/elements/Mix.vue +11 -11
  68. package/app/components/aside/minor/news/elements/P.vue +14 -14
  69. package/app/components/aside/minor/news/elements/Ref.vue +59 -58
  70. package/app/components/aside/minor/news/elements/Text.vue +18 -18
  71. package/app/components/indexPage/IndexPagePersons.vue +116 -117
  72. package/app/components/main/MainAction.vue +26 -26
  73. package/app/components/main/MainBreadcrumbs.vue +28 -28
  74. package/app/components/main/MainContentChild.vue +44 -47
  75. package/app/components/main/MainContentChildren.vue +13 -14
  76. package/app/components/main/MainDecoration.vue +15 -15
  77. package/app/components/main/MainDescription.vue +13 -13
  78. package/app/components/main/MainFlag.vue +129 -133
  79. package/app/components/main/MainFlags.vue +17 -17
  80. package/app/components/main/MainGlow.vue +12 -12
  81. package/app/components/main/MainQuickLink.vue +90 -91
  82. package/app/components/main/MainQuickLinks.vue +40 -40
  83. package/app/components/main/MainQuote.vue +149 -161
  84. package/app/components/main/MainQuoteLoader.vue +86 -86
  85. package/app/components/main/MainSection.vue +44 -44
  86. package/app/components/main/MainSectionPreamble.vue +5 -5
  87. package/app/components/main/MainSubTitle.vue +11 -12
  88. package/app/components/main/MainTitle.vue +32 -32
  89. package/app/components/main/MainTopicPartPage.vue +88 -88
  90. package/app/components/main/MainTopicPartSwitch.vue +67 -71
  91. package/app/components/main/connections/Deps.vue +30 -34
  92. package/app/components/main/connections/Externals.vue +80 -104
  93. package/app/components/main/connections/MainConnections.vue +90 -94
  94. package/app/components/main/connections/MainConnectionsButton.vue +81 -81
  95. package/app/components/main/connections/ScrollPane.vue +10 -10
  96. package/app/components/main/contentStats/Item.vue +28 -34
  97. package/app/components/main/contentStats/ItemElement.vue +19 -19
  98. package/app/components/main/contentStats/ItemMaterials.vue +11 -11
  99. package/app/components/main/contentStats/MainContentStats.vue +50 -53
  100. package/app/components/preview/Preview.vue +110 -118
  101. package/app/components/preview/PreviewError.vue +4 -4
  102. package/app/components/preview/PreviewLoading.vue +3 -3
  103. package/app/components/preview/PreviewScreen.vue +48 -48
  104. package/app/components/preview/PreviewScreenButton.vue +27 -27
  105. package/app/components/preview/screen/ContentPage.vue +27 -30
  106. package/app/components/preview/screen/DirectLink.vue +13 -13
  107. package/app/components/preview/screen/Unique.vue +31 -32
  108. package/app/components/site/SiteAside.vue +50 -51
  109. package/app/components/site/SiteAsideOverlay.vue +8 -8
  110. package/app/components/site/SiteMain.vue +11 -11
  111. package/app/components/transition/Fade.vue +16 -16
  112. package/app/components/transition/Slide.vue +27 -27
  113. package/app/components/tree/TreeContainer.vue +3 -3
  114. package/app/components/tree/TreeItem.vue +27 -31
  115. package/app/composables/ads.ts +11 -11
  116. package/app/composables/analytics.ts +102 -102
  117. package/app/composables/appElements.ts +21 -21
  118. package/app/composables/aside.ts +15 -15
  119. package/app/composables/asideMajorPane.ts +82 -82
  120. package/app/composables/asideMinor.ts +109 -109
  121. package/app/composables/contentNav.ts +7 -7
  122. package/app/composables/favicon.ts +103 -108
  123. package/app/composables/file.ts +4 -3
  124. package/app/composables/formatText.ts +100 -100
  125. package/app/composables/loading.ts +26 -26
  126. package/app/composables/mainContent.ts +22 -22
  127. package/app/composables/og.ts +184 -182
  128. package/app/composables/phrases.ts +98 -98
  129. package/app/composables/preview.ts +44 -44
  130. package/app/composables/route.ts +4 -2
  131. package/app/composables/theme.ts +47 -51
  132. package/app/composables/url.ts +19 -11
  133. package/app/formatters/ru.ts +14 -14
  134. package/app/pages/article/[...articleId].vue +12 -12
  135. package/app/pages/book/[...bookId].vue +56 -56
  136. package/app/pages/contributor/[contributorId].vue +144 -150
  137. package/app/pages/contributors.vue +95 -102
  138. package/app/pages/group/[...groupId].vue +58 -58
  139. package/app/pages/index.vue +113 -117
  140. package/app/pages/page/[...pageId].vue +60 -60
  141. package/app/pages/practice/[...practiceId].vue +12 -12
  142. package/app/pages/sponsors.vue +88 -92
  143. package/app/pages/summary/[...summaryId].vue +12 -12
  144. package/app/plugins/appSetup/client/htmlBranding.ts +6 -6
  145. package/app/plugins/appSetup/client/welcome.ts +37 -35
  146. package/app/plugins/appSetup/config.ts +6 -6
  147. package/app/plugins/appSetup/global.ts +3 -3
  148. package/app/plugins/appSetup/index.ts +27 -28
  149. package/app/plugins/prerender.server.ts +40 -40
  150. package/app/router.options.ts +5 -5
  151. package/app/scripts/theme.js +21 -24
  152. package/app/styles/main.css +128 -124
  153. package/bin/erudit.js +12 -0
  154. package/modules/erudit/env.ts +8 -0
  155. package/modules/erudit/globals/content.ts +4 -4
  156. package/modules/erudit/globals/contributor.ts +1 -1
  157. package/modules/erudit/globals/eruditConfig.ts +5 -10
  158. package/modules/erudit/globals/problem.ts +1 -1
  159. package/modules/erudit/globals/prose.ts +1 -1
  160. package/modules/erudit/globals/public.ts +18 -18
  161. package/modules/erudit/index.ts +50 -60
  162. package/modules/erudit/logger.ts +10 -10
  163. package/modules/erudit/setup/elements/appTemplate.ts +44 -45
  164. package/modules/erudit/setup/elements/globalTemplate.ts +82 -82
  165. package/modules/erudit/setup/elements/globalTypes.ts +259 -273
  166. package/modules/erudit/setup/elements/setup.ts +163 -167
  167. package/modules/erudit/setup/elements/shared.ts +10 -10
  168. package/modules/erudit/setup/elements/tagsTable.ts +28 -28
  169. package/modules/erudit/setup/fullRestart.ts +61 -71
  170. package/modules/erudit/setup/globals.ts +206 -196
  171. package/modules/erudit/setup/publicAssets.ts +43 -52
  172. package/modules/erudit/setup/runtimeConfig.ts +106 -58
  173. package/modules/erudit/watcher.ts +20 -27
  174. package/nuxt.config.ts +102 -84
  175. package/package.json +51 -55
  176. package/server/api/aside/major/frontNav/book/[...shortId].ts +10 -10
  177. package/server/api/aside/major/frontNav/global.ts +5 -5
  178. package/server/api/aside/major/pages.ts +6 -6
  179. package/server/api/contributor/list.ts +60 -61
  180. package/server/api/contributor/page/[contributorId].ts +68 -68
  181. package/server/api/indexPage.ts +81 -81
  182. package/server/api/language/functions.ts +11 -11
  183. package/server/api/language/phrase/[phraseKey].ts +35 -35
  184. package/server/api/main/content/[...contentTypePath].ts +149 -153
  185. package/server/api/news/batch/[batchIndex].ts +5 -5
  186. package/server/api/pageSponsors.ts +56 -58
  187. package/server/api/prerender/content.ts +79 -82
  188. package/server/api/prerender/default.ts +35 -35
  189. package/server/api/prerender/files.ts +10 -10
  190. package/server/api/prerender/frontNav.ts +13 -13
  191. package/server/api/prerender/language.ts +7 -7
  192. package/server/api/prerender/news.ts +8 -8
  193. package/server/api/prerender/quotes.ts +15 -15
  194. package/server/api/preview/contentPage/[...contentTypePath].ts +63 -63
  195. package/server/api/preview/contentUnique/[...contentTypePathUnique].ts +73 -81
  196. package/server/api/problemScript/[...problemScriptPath].ts +88 -92
  197. package/server/api/quote/data/[quoteId].ts +84 -87
  198. package/server/api/quote/ids.ts +3 -3
  199. package/server/erudit/build.ts +132 -137
  200. package/server/erudit/cameos/build.ts +161 -161
  201. package/server/erudit/config.ts +13 -13
  202. package/server/erudit/content/global/build.ts +300 -297
  203. package/server/erudit/content/global/singleton.ts +5 -5
  204. package/server/erudit/content/nav/build.ts +459 -463
  205. package/server/erudit/content/nav/front.ts +125 -127
  206. package/server/erudit/content/nav/repository/books.ts +37 -40
  207. package/server/erudit/content/nav/repository/get.ts +33 -33
  208. package/server/erudit/content/nav/repository/hasChildren.ts +5 -5
  209. package/server/erudit/content/nav/repository/hasNav.ts +3 -3
  210. package/server/erudit/content/nav/repository/hasParent.ts +5 -5
  211. package/server/erudit/content/nav/repository/id.ts +9 -9
  212. package/server/erudit/content/nav/repository/index.ts +9 -9
  213. package/server/erudit/content/nav/repository/order.ts +14 -14
  214. package/server/erudit/content/nav/repository/previousNext.ts +35 -35
  215. package/server/erudit/content/nav/repository/walk.ts +127 -127
  216. package/server/erudit/content/nav/setup.ts +13 -13
  217. package/server/erudit/content/nav/types.ts +24 -24
  218. package/server/erudit/content/repository/breadcrumbs.ts +24 -24
  219. package/server/erudit/content/repository/children.ts +47 -47
  220. package/server/erudit/content/repository/connections.ts +35 -35
  221. package/server/erudit/content/repository/contentLink.ts +16 -16
  222. package/server/erudit/content/repository/decoration.ts +23 -23
  223. package/server/erudit/content/repository/deps.ts +121 -84
  224. package/server/erudit/content/repository/description.ts +11 -11
  225. package/server/erudit/content/repository/elementSnippets.ts +105 -105
  226. package/server/erudit/content/repository/externals.ts +50 -50
  227. package/server/erudit/content/repository/flags.ts +33 -33
  228. package/server/erudit/content/repository/seo.ts +12 -12
  229. package/server/erudit/content/repository/stats.ts +97 -97
  230. package/server/erudit/content/repository/title.ts +27 -27
  231. package/server/erudit/content/repository/topicParts.ts +39 -39
  232. package/server/erudit/content/repository/unique.ts +76 -76
  233. package/server/erudit/content/resolve/book.ts +29 -32
  234. package/server/erudit/content/resolve/group.ts +34 -39
  235. package/server/erudit/content/resolve/index.ts +272 -290
  236. package/server/erudit/content/resolve/page.ts +80 -87
  237. package/server/erudit/content/resolve/topic.ts +220 -246
  238. package/server/erudit/content/resolve/utils/contentError.ts +10 -10
  239. package/server/erudit/content/resolve/utils/insertContentItem.ts +113 -122
  240. package/server/erudit/content/resolve/utils/insertContentResolved.ts +126 -132
  241. package/server/erudit/content/search.ts +146 -163
  242. package/server/erudit/contributors/build.ts +158 -166
  243. package/server/erudit/contributors/global.ts +3 -3
  244. package/server/erudit/contributors/repository/avatarUrl.ts +10 -10
  245. package/server/erudit/contributors/repository/contributions.ts +171 -178
  246. package/server/erudit/contributors/repository/count.ts +3 -3
  247. package/server/erudit/contributors/search.ts +34 -34
  248. package/server/erudit/db/repository/pushFile.ts +23 -26
  249. package/server/erudit/db/repository/pushProblemScript.ts +19 -19
  250. package/server/erudit/db/repository/pushProseLink.ts +40 -40
  251. package/server/erudit/db/schema/cameos.ts +7 -7
  252. package/server/erudit/db/schema/content.ts +18 -18
  253. package/server/erudit/db/schema/contentContributions.ts +15 -15
  254. package/server/erudit/db/schema/contentDeps.ts +21 -21
  255. package/server/erudit/db/schema/contentElementStats.ts +20 -20
  256. package/server/erudit/db/schema/contentProseLinks.ts +23 -23
  257. package/server/erudit/db/schema/contentSnippets.ts +15 -15
  258. package/server/erudit/db/schema/contentToc.ts +16 -16
  259. package/server/erudit/db/schema/contentUniques.ts +19 -25
  260. package/server/erudit/db/schema/contributors.ts +12 -12
  261. package/server/erudit/db/schema/files.ts +11 -11
  262. package/server/erudit/db/schema/groups.ts +6 -6
  263. package/server/erudit/db/schema/index.ts +17 -17
  264. package/server/erudit/db/schema/news.ts +7 -7
  265. package/server/erudit/db/schema/pages.ts +7 -7
  266. package/server/erudit/db/schema/problemScripts.ts +14 -14
  267. package/server/erudit/db/schema/sponsors.ts +9 -9
  268. package/server/erudit/db/schema/topics.ts +9 -9
  269. package/server/erudit/db/setup.ts +62 -62
  270. package/server/erudit/db/types.ts +10 -10
  271. package/server/erudit/global.ts +38 -33
  272. package/server/erudit/importer.ts +94 -97
  273. package/server/erudit/index.ts +96 -90
  274. package/server/erudit/language/list/en.ts +116 -116
  275. package/server/erudit/language/list/ru.ts +120 -120
  276. package/server/erudit/language/list.ts +6 -6
  277. package/server/erudit/language/setup.ts +36 -36
  278. package/server/erudit/language/types.ts +16 -16
  279. package/server/erudit/logger.ts +73 -77
  280. package/server/erudit/news/build.ts +112 -114
  281. package/server/erudit/news/repository/batch.ts +61 -61
  282. package/server/erudit/path.ts +19 -0
  283. package/server/erudit/prose/repository/finalize.ts +68 -68
  284. package/server/erudit/prose/repository/get.ts +54 -54
  285. package/server/erudit/prose/repository/resolve.ts +17 -17
  286. package/server/erudit/prose/storage/callout.ts +16 -14
  287. package/server/erudit/prose/storage/image.ts +22 -20
  288. package/server/erudit/prose/storage/link.ts +222 -226
  289. package/server/erudit/prose/storage/problemScript.ts +23 -21
  290. package/server/erudit/prose/storage/video.ts +16 -14
  291. package/server/erudit/prose/transform/bundleProblemScript.ts +6 -6
  292. package/server/erudit/prose/transform/extensions.ts +15 -15
  293. package/server/erudit/quote/repository/ids.ts +31 -31
  294. package/server/erudit/repository.ts +96 -96
  295. package/server/erudit/sponsors/build.ts +161 -165
  296. package/server/erudit/sponsors/repository/avatarUrl.ts +10 -10
  297. package/server/erudit/sponsors/repository/count.ts +4 -4
  298. package/server/erudit/staticFile.ts +28 -28
  299. package/server/plugins/augmentCss.ts +17 -17
  300. package/server/plugins/lang.ts +5 -7
  301. package/server/plugins/metaViewport.ts +15 -15
  302. package/server/plugins/theme.ts +13 -13
  303. package/server/routes/file/[...path].ts +18 -18
  304. package/server/routes/robots.txt.ts +9 -9
  305. package/server/routes/search.json.gz.ts +76 -75
  306. package/server/routes/sitemap.xml.ts +83 -81
  307. package/shared/search/encoders.ts +10 -10
  308. package/shared/types/asideMajorPages.ts +2 -2
  309. package/shared/types/breadcrumbs.ts +3 -3
  310. package/shared/types/contentChildren.ts +10 -10
  311. package/shared/types/contentConnections.ts +27 -27
  312. package/shared/types/contentStats.ts +6 -6
  313. package/shared/types/elementSnippet.ts +14 -14
  314. package/shared/types/frontContentNav.ts +17 -17
  315. package/shared/types/indexPage.ts +20 -20
  316. package/shared/types/language.ts +174 -174
  317. package/shared/types/mainContent.ts +40 -40
  318. package/shared/types/news.ts +13 -13
  319. package/shared/types/preview.ts +28 -28
  320. package/shared/types/runtimeConfig.ts +29 -48
  321. package/shared/types/search.ts +32 -32
  322. package/shared/utils/contentTypePath.ts +44 -44
  323. package/shared/utils/icons.ts +7 -7
  324. package/shared/utils/pages.ts +19 -20
  325. package/shared/utils/stringColor.ts +8 -8
  326. package/shared/utils/toStringEqual.ts +13 -13
  327. package/shared/utils/zip.ts +64 -64
  328. package/test/shared/utils/zip.test.ts +8 -8
  329. package/tsconfig.json +15 -15
  330. package/bin/erudit.mjs +0 -2
  331. package/modules/erudit/setup/aliases.ts +0 -17
  332. package/modules/erudit/setup/baseUrl.ts +0 -19
  333. package/modules/erudit/setup/nuxtConfig.ts +0 -62
  334. package/modules/erudit/setup/projectConfig.ts +0 -115
  335. package/shared/utils/slasher.ts +0 -64
  336. package/test/shared/utils/slasher.test.ts +0 -75
@@ -1,123 +1,112 @@
1
- <script lang="ts" setup>
2
- import type { TopicPart } from '@erudit-js/core/content/topic';
3
- import type { ContentType } from '@erudit-js/core/content/type';
4
-
5
- const { contentType, contentRelativePath, topicPart } = defineProps<{
6
- contentRelativePath: string;
7
- contentType: ContentType;
8
- topicPart?: TopicPart;
9
- }>();
10
-
11
- const optionsOpened = ref(false);
12
-
13
- const howToImproveLink = ERUDIT.config.project.contributors?.howToImproveLink;
14
- const reportIssueLink = ERUDIT.config.project.contributors?.reportIssueLink;
15
-
16
- const editLink = computed(() => {
17
- const prefix = ERUDIT.config.project.contributors?.editLinkPrefix;
18
-
19
- if (prefix) {
20
- const postfix = (() => {
21
- switch (contentType) {
22
- case 'book':
23
- return '/book.ts';
24
- case 'page':
25
- return '/page.tsx';
26
- case 'group':
27
- return '/group.ts';
28
- case 'topic':
29
- return `/${topicPart!}.tsx`;
30
- }
31
- })();
32
-
33
- return `${prefix}${contentRelativePath}${postfix}`;
34
- }
35
- });
36
-
37
- const contributorsEnabled = ERUDIT.config.project.contributors?.enabled;
38
- const canImprove =
39
- contributorsEnabled && (howToImproveLink || reportIssueLink || editLink);
40
-
41
- const phrase = await usePhrases(
42
- 'make_contribution',
43
- 'improve_material',
44
- 'how_to_improve',
45
- 'report_issue',
46
- 'edit_page',
47
- );
48
- </script>
49
-
50
- <template>
51
- <template v-if="canImprove">
52
- <TransitionFade>
53
- <div
54
- v-if="optionsOpened"
55
- class="absolute top-0 left-0 z-10 h-full w-full"
56
- >
57
- <div
58
- class="bg-bg-aside flex h-full w-full flex-col justify-end"
59
- >
60
- <div
61
- class="nice-scrollbars overflow-auto *:border-t
62
- *:border-b-0"
63
- >
64
- <AsideListItem
65
- v-if="howToImproveLink"
66
- icon="question-circle"
67
- :main="phrase.how_to_improve"
68
- :to="howToImproveLink"
69
- target="_blank"
70
- />
71
- <AsideListItem
72
- v-if="reportIssueLink"
73
- icon="bug"
74
- :main="phrase.report_issue"
75
- :to="reportIssueLink"
76
- target="_blank"
77
- />
78
- <AsideListItem
79
- v-if="editLink"
80
- icon="draw"
81
- :main="phrase.edit_page"
82
- :to="editLink"
83
- target="_blank"
84
- />
85
- </div>
86
- <div
87
- class="border-border flex items-center border-t py-1
88
- pr-0"
89
- >
90
- <div class="pl-normal flex-1 text-sm font-semibold">
91
- {{ formatText(phrase.improve_material) }}
92
- </div>
93
- <button
94
- @click="optionsOpened = false"
95
- class="text-text-muted hocus:text-text p-normal
96
- cursor-pointer transition-[color]"
97
- >
98
- <MyIcon
99
- name="plus"
100
- class="rotate-45 text-[24px] leading-none"
101
- />
102
- </button>
103
- </div>
104
- </div>
105
- </div>
106
- </TransitionFade>
107
- <AsideListItem
108
- :main="formatText(phrase.make_contribution)"
109
- @click="optionsOpened = true"
110
- class="group border-t border-b-0 py-1"
111
- >
112
- <template #icon>
113
- <div
114
- class="border-border group-hocus:border-text-dimmed grid
115
- size-[40px] place-items-center rounded-full border-3
116
- border-dashed transition-[border]"
117
- >
118
- <MyIcon name="draw" class="text-text-muted size-[56%]" />
119
- </div>
120
- </template>
121
- </AsideListItem>
122
- </template>
123
- </template>
1
+ <script lang="ts" setup>
2
+ import type { TopicPart } from '@erudit-js/core/content/topic';
3
+ import type { ContentType } from '@erudit-js/core/content/type';
4
+
5
+ const { contentType, contentRelativePath, topicPart } = defineProps<{
6
+ contentRelativePath: string;
7
+ contentType: ContentType;
8
+ topicPart?: TopicPart;
9
+ }>();
10
+
11
+ const optionsOpened = ref(false);
12
+
13
+ const howToImproveLink = ERUDIT.config.contributors?.howToImproveLink;
14
+ const reportIssueLink = ERUDIT.config.contributors?.reportIssueLink;
15
+
16
+ const editLink = computed(() => {
17
+ const prefix = ERUDIT.config.contributors?.editLinkPrefix;
18
+
19
+ if (prefix) {
20
+ const postfix = (() => {
21
+ switch (contentType) {
22
+ case 'book':
23
+ return '/book.ts';
24
+ case 'page':
25
+ return '/page.tsx';
26
+ case 'group':
27
+ return '/group.ts';
28
+ case 'topic':
29
+ return `/${topicPart!}.tsx`;
30
+ }
31
+ })();
32
+
33
+ return `${prefix}${contentRelativePath}${postfix}`;
34
+ }
35
+ });
36
+
37
+ const contributorsEnabled = ERUDIT.config.contributors?.enabled;
38
+ const canImprove =
39
+ contributorsEnabled && (howToImproveLink || reportIssueLink || editLink);
40
+
41
+ const phrase = await usePhrases(
42
+ 'make_contribution',
43
+ 'improve_material',
44
+ 'how_to_improve',
45
+ 'report_issue',
46
+ 'edit_page',
47
+ );
48
+ </script>
49
+
50
+ <template>
51
+ <template v-if="canImprove">
52
+ <TransitionFade>
53
+ <div
54
+ v-if="optionsOpened"
55
+ class="absolute top-0 left-0 z-10 h-full w-full"
56
+ >
57
+ <div class="bg-bg-aside flex h-full w-full flex-col justify-end">
58
+ <div class="nice-scrollbars overflow-auto *:border-t *:border-b-0">
59
+ <AsideListItem
60
+ v-if="howToImproveLink"
61
+ icon="question-circle"
62
+ :main="phrase.how_to_improve"
63
+ :to="howToImproveLink"
64
+ target="_blank"
65
+ />
66
+ <AsideListItem
67
+ v-if="reportIssueLink"
68
+ icon="bug"
69
+ :main="phrase.report_issue"
70
+ :to="reportIssueLink"
71
+ target="_blank"
72
+ />
73
+ <AsideListItem
74
+ v-if="editLink"
75
+ icon="draw"
76
+ :main="phrase.edit_page"
77
+ :to="editLink"
78
+ target="_blank"
79
+ />
80
+ </div>
81
+ <div class="border-border flex items-center border-t py-1 pr-0">
82
+ <div class="pl-normal flex-1 text-sm font-semibold">
83
+ {{ formatText(phrase.improve_material) }}
84
+ </div>
85
+ <button
86
+ @click="optionsOpened = false"
87
+ class="text-text-muted hocus:text-text p-normal cursor-pointer
88
+ transition-[color]"
89
+ >
90
+ <MyIcon name="plus" class="rotate-45 text-[24px] leading-none" />
91
+ </button>
92
+ </div>
93
+ </div>
94
+ </div>
95
+ </TransitionFade>
96
+ <AsideListItem
97
+ :main="formatText(phrase.make_contribution)"
98
+ @click="optionsOpened = true"
99
+ class="group border-t border-b-0 py-1"
100
+ >
101
+ <template #icon>
102
+ <div
103
+ class="border-border group-hocus:border-text-dimmed grid size-[40px]
104
+ place-items-center rounded-full border-3 border-dashed
105
+ transition-[border]"
106
+ >
107
+ <MyIcon name="draw" class="text-text-muted size-[56%]" />
108
+ </div>
109
+ </template>
110
+ </AsideListItem>
111
+ </template>
112
+ </template>
@@ -1,36 +1,36 @@
1
- <script lang="ts" setup>
2
- import type { ContentContribution } from '@erudit-js/core/content/contributions';
3
-
4
- defineProps<{ contribution: ContentContribution }>();
5
- </script>
6
-
7
- <template>
8
- <EruditLink
9
- :to="PAGES.contributor(contribution.contributorId)"
10
- class="p-normal hocus:bg-bg-accent block bg-transparent
11
- transition-[background]"
12
- >
13
- <div class="gap-normal flex items-center">
14
- <SmartMedia
15
- class="micro:size-[40px] size-[30px] shrink-0 rounded-full"
16
- :style="{
17
- '--mediaColor': stringColor(contribution.contributorId),
18
- }"
19
- :url="
20
- contribution.avatarUrl
21
- ? withBaseUrl(contribution.avatarUrl)
22
- : 'user'
23
- "
24
- />
25
- <span class="text-[0.9em]">{{
26
- contribution.name || contribution.contributorId
27
- }}</span>
28
- </div>
29
- <div
30
- v-if="contribution.description"
31
- class="pt-small text-text-muted text-sm"
32
- >
33
- {{ formatText(contribution.description) }}
34
- </div>
35
- </EruditLink>
36
- </template>
1
+ <script lang="ts" setup>
2
+ import type { ContentContribution } from '@erudit-js/core/content/contributions';
3
+
4
+ defineProps<{ contribution: ContentContribution }>();
5
+
6
+ const withBaseUrl = useBaseUrl();
7
+ </script>
8
+
9
+ <template>
10
+ <EruditLink
11
+ :to="PAGES.contributor(contribution.contributorId)"
12
+ class="p-normal hocus:bg-bg-accent block bg-transparent
13
+ transition-[background]"
14
+ >
15
+ <div class="gap-normal flex items-center">
16
+ <SmartMedia
17
+ class="micro:size-[40px] size-[30px] shrink-0 rounded-full"
18
+ :style="{
19
+ '--mediaColor': stringColor(contribution.contributorId),
20
+ }"
21
+ :url="
22
+ contribution.avatarUrl ? withBaseUrl(contribution.avatarUrl) : 'user'
23
+ "
24
+ />
25
+ <span class="text-[0.9em]">{{
26
+ contribution.name || contribution.contributorId
27
+ }}</span>
28
+ </div>
29
+ <div
30
+ v-if="contribution.description"
31
+ class="pt-small text-text-muted text-sm"
32
+ >
33
+ {{ formatText(contribution.description) }}
34
+ </div>
35
+ </EruditLink>
36
+ </template>
@@ -1,163 +1,163 @@
1
- <script lang="ts" setup>
2
- import type { ResolvedTocItem } from '@erudit-js/prose';
3
-
4
- import TocItem from './TocItem.vue';
5
-
6
- const props = defineProps<{ toc?: ResolvedTocItem[] }>();
7
-
8
- const phrase = await usePhrases('no_toc');
9
-
10
- /**
11
- * Active heading IDs (provided to children)
12
- */
13
- const activeHeadingIds = shallowRef<Set<string>>(new Set());
14
- provide('activeHeadingIds', activeHeadingIds);
15
-
16
- /**
17
- * Collect all heading items from TOC tree (DFS)
18
- */
19
- function collectHeadings(items: ResolvedTocItem[]): ResolvedTocItem[] {
20
- const result: ResolvedTocItem[] = [];
21
-
22
- const walk = (item: ResolvedTocItem) => {
23
- if (item.type === 'heading') {
24
- result.push(item);
25
- item.children.forEach(walk);
26
- }
27
- };
28
-
29
- items.forEach(walk);
30
- return result;
31
- }
32
-
33
- /**
34
- * Find the last heading above the viewport (initial load fix)
35
- */
36
- function findLastHeadingAboveViewport(
37
- elements: { id: string; el: HTMLElement }[],
38
- ): string | null {
39
- const scrollY = window.scrollY;
40
- let last: string | null = null;
41
-
42
- for (const { id, el } of elements) {
43
- if (el.offsetTop < scrollY) {
44
- last = id;
45
- } else {
46
- break;
47
- }
48
- }
49
-
50
- return last;
51
- }
52
-
53
- onMounted(() => {
54
- if (!props.toc) return;
55
-
56
- /**
57
- * 1️⃣ Collect headings
58
- */
59
- const headings = collectHeadings(props.toc);
60
-
61
- /**
62
- * 2️⃣ Resolve DOM elements (once)
63
- */
64
- const elements = headings
65
- .map((h) => ({
66
- id: h.elementId,
67
- el: document.getElementById(h.elementId),
68
- }))
69
- .filter((h): h is { id: string; el: HTMLElement } => !!h.el);
70
-
71
- if (elements.length === 0) return;
72
-
73
- /**
74
- * 3️⃣ Handles page load / refresh in middle of document
75
- */
76
- const visibleIds = new Set<string>();
77
- let lastAboveViewportId = findLastHeadingAboveViewport(elements);
78
-
79
- if (lastAboveViewportId) {
80
- activeHeadingIds.value = new Set([lastAboveViewportId]);
81
- }
82
-
83
- /**
84
- * 4️⃣ IntersectionObserver
85
- */
86
- const observer = new IntersectionObserver(
87
- (entries) => {
88
- let changed = false;
89
-
90
- for (const entry of entries) {
91
- const id = entry.target.id;
92
-
93
- if (entry.isIntersecting) {
94
- if (!visibleIds.has(id)) {
95
- visibleIds.add(id);
96
- changed = true;
97
- }
98
- } else {
99
- if (visibleIds.delete(id)) {
100
- changed = true;
101
- }
102
-
103
- // Track last heading above viewport
104
- if (entry.boundingClientRect.top < 0) {
105
- lastAboveViewportId = id;
106
- } else {
107
- // If heading is below viewport and it was the last one above, clear it
108
- if (lastAboveViewportId === id) {
109
- lastAboveViewportId = null;
110
- }
111
- }
112
- }
113
- }
114
-
115
- if (!changed) return;
116
-
117
- const next = new Set<string>();
118
-
119
- if (visibleIds.size > 0) {
120
- visibleIds.forEach((id) => next.add(id));
121
- } else if (lastAboveViewportId) {
122
- // Verify the heading is still above viewport before using it
123
- const lastEl = document.getElementById(lastAboveViewportId);
124
- if (lastEl && lastEl.getBoundingClientRect().top < 0) {
125
- next.add(lastAboveViewportId);
126
- }
127
- }
128
-
129
- activeHeadingIds.value = next;
130
- },
131
- {
132
- root: null,
133
- },
134
- );
135
-
136
- /**
137
- * 5️⃣ Observe all headings
138
- */
139
- elements.forEach(({ el }) => observer.observe(el));
140
-
141
- /**
142
- * 6️⃣ Cleanup
143
- */
144
- onUnmounted(() => {
145
- observer.disconnect();
146
- });
147
- });
148
- </script>
149
-
150
- <template>
151
- <div v-if="toc">
152
- <TreeContainer>
153
- <TocItem
154
- v-for="tocItem of toc"
155
- :key="tocItem.elementId"
156
- :item="tocItem"
157
- :level="0"
158
- />
159
- </TreeContainer>
160
- </div>
161
-
162
- <AsidePlainMessage v-else :text="phrase.no_toc" />
163
- </template>
1
+ <script lang="ts" setup>
2
+ import type { ResolvedTocItem } from '@erudit-js/prose';
3
+
4
+ import TocItem from './TocItem.vue';
5
+
6
+ const props = defineProps<{ toc?: ResolvedTocItem[] }>();
7
+
8
+ const phrase = await usePhrases('no_toc');
9
+
10
+ /**
11
+ * Active heading IDs (provided to children)
12
+ */
13
+ const activeHeadingIds = shallowRef<Set<string>>(new Set());
14
+ provide('activeHeadingIds', activeHeadingIds);
15
+
16
+ /**
17
+ * Collect all heading items from TOC tree (DFS)
18
+ */
19
+ function collectHeadings(items: ResolvedTocItem[]): ResolvedTocItem[] {
20
+ const result: ResolvedTocItem[] = [];
21
+
22
+ const walk = (item: ResolvedTocItem) => {
23
+ if (item.type === 'heading') {
24
+ result.push(item);
25
+ item.children.forEach(walk);
26
+ }
27
+ };
28
+
29
+ items.forEach(walk);
30
+ return result;
31
+ }
32
+
33
+ /**
34
+ * Find the last heading above the viewport (initial load fix)
35
+ */
36
+ function findLastHeadingAboveViewport(
37
+ elements: { id: string; el: HTMLElement }[],
38
+ ): string | null {
39
+ const scrollY = window.scrollY;
40
+ let last: string | null = null;
41
+
42
+ for (const { id, el } of elements) {
43
+ if (el.offsetTop < scrollY) {
44
+ last = id;
45
+ } else {
46
+ break;
47
+ }
48
+ }
49
+
50
+ return last;
51
+ }
52
+
53
+ onMounted(() => {
54
+ if (!props.toc) return;
55
+
56
+ /**
57
+ * 1️⃣ Collect headings
58
+ */
59
+ const headings = collectHeadings(props.toc);
60
+
61
+ /**
62
+ * 2️⃣ Resolve DOM elements (once)
63
+ */
64
+ const elements = headings
65
+ .map((h) => ({
66
+ id: h.elementId,
67
+ el: document.getElementById(h.elementId),
68
+ }))
69
+ .filter((h): h is { id: string; el: HTMLElement } => !!h.el);
70
+
71
+ if (elements.length === 0) return;
72
+
73
+ /**
74
+ * 3️⃣ Handles page load / refresh in middle of document
75
+ */
76
+ const visibleIds = new Set<string>();
77
+ let lastAboveViewportId = findLastHeadingAboveViewport(elements);
78
+
79
+ if (lastAboveViewportId) {
80
+ activeHeadingIds.value = new Set([lastAboveViewportId]);
81
+ }
82
+
83
+ /**
84
+ * 4️⃣ IntersectionObserver
85
+ */
86
+ const observer = new IntersectionObserver(
87
+ (entries) => {
88
+ let changed = false;
89
+
90
+ for (const entry of entries) {
91
+ const id = entry.target.id;
92
+
93
+ if (entry.isIntersecting) {
94
+ if (!visibleIds.has(id)) {
95
+ visibleIds.add(id);
96
+ changed = true;
97
+ }
98
+ } else {
99
+ if (visibleIds.delete(id)) {
100
+ changed = true;
101
+ }
102
+
103
+ // Track last heading above viewport
104
+ if (entry.boundingClientRect.top < 0) {
105
+ lastAboveViewportId = id;
106
+ } else {
107
+ // If heading is below viewport and it was the last one above, clear it
108
+ if (lastAboveViewportId === id) {
109
+ lastAboveViewportId = null;
110
+ }
111
+ }
112
+ }
113
+ }
114
+
115
+ if (!changed) return;
116
+
117
+ const next = new Set<string>();
118
+
119
+ if (visibleIds.size > 0) {
120
+ visibleIds.forEach((id) => next.add(id));
121
+ } else if (lastAboveViewportId) {
122
+ // Verify the heading is still above viewport before using it
123
+ const lastEl = document.getElementById(lastAboveViewportId);
124
+ if (lastEl && lastEl.getBoundingClientRect().top < 0) {
125
+ next.add(lastAboveViewportId);
126
+ }
127
+ }
128
+
129
+ activeHeadingIds.value = next;
130
+ },
131
+ {
132
+ root: null,
133
+ },
134
+ );
135
+
136
+ /**
137
+ * 5️⃣ Observe all headings
138
+ */
139
+ elements.forEach(({ el }) => observer.observe(el));
140
+
141
+ /**
142
+ * 6️⃣ Cleanup
143
+ */
144
+ onUnmounted(() => {
145
+ observer.disconnect();
146
+ });
147
+ });
148
+ </script>
149
+
150
+ <template>
151
+ <div v-if="toc">
152
+ <TreeContainer>
153
+ <TocItem
154
+ v-for="tocItem of toc"
155
+ :key="tocItem.elementId"
156
+ :item="tocItem"
157
+ :level="0"
158
+ />
159
+ </TreeContainer>
160
+ </div>
161
+
162
+ <AsidePlainMessage v-else :text="phrase.no_toc" />
163
+ </template>