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
@@ -3,9 +3,9 @@ import type { PreviewType } from '@erudit-js/core/preview/type';
3
3
  import type { PreviewRequest } from '@erudit-js/core/preview/request';
4
4
 
5
5
  import {
6
- LazyPreviewScreenContentPage,
7
- LazyPreviewScreenDirectLink,
8
- LazyPreviewScreenUnique,
6
+ LazyPreviewScreenContentPage,
7
+ LazyPreviewScreenDirectLink,
8
+ LazyPreviewScreenUnique,
9
9
  } from '#components';
10
10
 
11
11
  const previewElement = useTemplateRef('preview');
@@ -17,9 +17,9 @@ const screenKey = ref(0);
17
17
  const loading = ref(true);
18
18
 
19
19
  const screenComponents: Record<PreviewType, Component> = {
20
- ['direct-link']: LazyPreviewScreenDirectLink,
21
- ['content-page']: LazyPreviewScreenContentPage,
22
- ['unique']: LazyPreviewScreenUnique,
20
+ ['direct-link']: LazyPreviewScreenDirectLink,
21
+ ['content-page']: LazyPreviewScreenContentPage,
22
+ ['unique']: LazyPreviewScreenUnique,
23
23
  };
24
24
 
25
25
  const currentRequest = shallowRef<PreviewRequest>();
@@ -32,138 +32,130 @@ let resizeObserver: ResizeObserver;
32
32
  watch(() => route.path, closePreview);
33
33
 
34
34
  watch(
35
- () => previewState.value.request,
36
- (newRequest) => {
37
- if (newRequest === undefined) {
38
- // Still render last request for nice closing animation
39
- return;
40
- }
41
-
42
- lastHeight.value =
43
- previewElement.value?.offsetHeight || lastHeight.value;
44
-
45
- currentRequest.value = newRequest;
46
- CurrentScreen.value = screenComponents[newRequest.type];
47
-
48
- screenKey.value++;
49
- loading.value = true;
50
-
51
- // Lock height during loading so it does not collapse
52
- if (previewElement.value) {
53
- previewElement.value.style.height = `${Math.max(lastHeight.value, LOADING_FALLBACK_HEIGHT)}px`;
54
- }
55
- },
56
- );
35
+ () => previewState.value.request,
36
+ (newRequest) => {
37
+ if (newRequest === undefined) {
38
+ // Still render last request for nice closing animation
39
+ return;
40
+ }
57
41
 
58
- function updatePreviewHeight() {
59
- if (!previewElement.value) return;
42
+ lastHeight.value = previewElement.value?.offsetHeight || lastHeight.value;
43
+
44
+ currentRequest.value = newRequest;
45
+ CurrentScreen.value = screenComponents[newRequest.type];
60
46
 
61
- // While loading, keep previous (or fallback) height
62
- if (loading.value) {
63
- previewElement.value.style.height = `${Math.max(lastHeight.value, LOADING_FALLBACK_HEIGHT)}px`;
64
- return;
47
+ screenKey.value++;
48
+ loading.value = true;
49
+
50
+ // Lock height during loading so it does not collapse
51
+ if (previewElement.value) {
52
+ previewElement.value.style.height = `${Math.max(lastHeight.value, LOADING_FALLBACK_HEIGHT)}px`;
65
53
  }
54
+ },
55
+ );
66
56
 
67
- if (previewScreenElement.value) {
68
- const h = previewScreenElement.value.offsetHeight;
69
- previewElement.value.style.height = `${h}px`;
70
- if (h > 0) {
71
- lastHeight.value = h;
72
- }
57
+ function updatePreviewHeight() {
58
+ if (!previewElement.value) return;
59
+
60
+ // While loading, keep previous (or fallback) height
61
+ if (loading.value) {
62
+ previewElement.value.style.height = `${Math.max(lastHeight.value, LOADING_FALLBACK_HEIGHT)}px`;
63
+ return;
64
+ }
65
+
66
+ if (previewScreenElement.value) {
67
+ const h = previewScreenElement.value.offsetHeight;
68
+ previewElement.value.style.height = `${h}px`;
69
+ if (h > 0) {
70
+ lastHeight.value = h;
73
71
  }
72
+ }
74
73
  }
75
74
 
76
75
  async function nextPaint() {
77
- await nextTick();
78
- await new Promise(requestAnimationFrame);
76
+ await nextTick();
77
+ await new Promise(requestAnimationFrame);
79
78
  }
80
79
 
81
80
  async function suspenseResolved() {
82
- await nextPaint();
83
- updatePreviewHeight();
84
- resizeObserver ||= new ResizeObserver(updatePreviewHeight);
85
- resizeObserver.disconnect();
86
- resizeObserver.observe(previewScreenElement.value!);
81
+ await nextPaint();
82
+ updatePreviewHeight();
83
+ resizeObserver ||= new ResizeObserver(updatePreviewHeight);
84
+ resizeObserver.disconnect();
85
+ resizeObserver.observe(previewScreenElement.value!);
87
86
 
88
- await nextPaint();
89
- loading.value = false;
87
+ await nextPaint();
88
+ loading.value = false;
90
89
 
91
- await nextPaint();
92
- updatePreviewHeight();
90
+ await nextPaint();
91
+ updatePreviewHeight();
93
92
  }
94
93
 
95
94
  // Prefetch phrases
96
95
  await usePhrases(
97
- 'book',
98
- 'page',
99
- 'group',
100
- 'topic',
101
- 'article',
102
- 'summary',
103
- 'practice',
104
- 'preview_content_page_description',
96
+ 'book',
97
+ 'page',
98
+ 'group',
99
+ 'topic',
100
+ 'article',
101
+ 'summary',
102
+ 'practice',
103
+ 'preview_content_page_description',
105
104
  );
106
105
  </script>
107
106
 
108
107
  <template>
109
- <div class="sticky top-0 z-100">
108
+ <div
109
+ ref="preview"
110
+ :class="[
111
+ `fixed-main bg-bg-main micro:max-h-[70dvh] border-border
112
+ pointer-events-auto bottom-0 z-100 max-h-[90dvh] touch-auto
113
+ overflow-hidden rounded-[25px] rounded-b-none border-t
114
+ transition-[max-height,height,translate,box-shadow]`,
115
+ previewState.opened
116
+ ? `translate-y-0
117
+ shadow-[0px_-10px_15px_5px_light-dark(rgba(0,0,0,0.1),rgba(255,255,255,0.05))]`
118
+ : 'translate-y-full shadow-transparent',
119
+ ]"
120
+ >
121
+ <!-- Screen -->
122
+ <TransitionFade>
123
+ <div
124
+ v-if="CurrentScreen"
125
+ :key="screenKey"
126
+ ref="previewScreen"
127
+ class="absolute bottom-0 max-h-[inherit] w-full"
128
+ >
129
+ <Suspense @resolve="suspenseResolved">
130
+ <CurrentScreen :request="currentRequest" />
131
+ </Suspense>
132
+ </div>
133
+ </TransitionFade>
134
+
135
+ <!-- Loading overlay -->
136
+ <TransitionFade>
137
+ <div
138
+ v-if="loading"
139
+ class="bg-bg-main absolute bottom-0 flex h-full w-full items-center
140
+ justify-center"
141
+ >
142
+ <Loading class="text-text-dimmed text-[50px]" />
143
+ </div>
144
+ </TransitionFade>
145
+
146
+ <!-- Blink overlay -->
147
+ <TransitionFade>
148
+ <div
149
+ v-if="previewState.blink"
150
+ :key="previewState.blink"
151
+ class="pointer-events-none absolute top-0 left-0 h-full w-full
152
+ touch-none"
153
+ >
110
154
  <div
111
- class="pointer-events-none absolute top-0 right-0 left-0 h-dvh
112
- touch-none"
113
- >
114
- <div
115
- ref="preview"
116
- :class="[
117
- `bg-bg-main micro:max-h-[70dvh] pointer-events-auto absolute
118
- bottom-0 max-h-[90dvh] w-full touch-auto overflow-hidden
119
- rounded-[25px] rounded-b-none
120
- transition-[max-height,height,translate]`,
121
- previewState.opened
122
- ? `border-border translate-y-0 border-t
123
- shadow-[0px_-10px_15px_5px_light-dark(rgba(0,0,0,0.1),rgba(255,255,255,0.05))]`
124
- : 'translate-y-full shadow-none',
125
- ]"
126
- >
127
- <!-- Screen -->
128
- <TransitionFade>
129
- <div
130
- v-if="CurrentScreen"
131
- :key="screenKey"
132
- ref="previewScreen"
133
- class="absolute bottom-0 max-h-[inherit] w-full"
134
- >
135
- <Suspense @resolve="suspenseResolved">
136
- <CurrentScreen :request="currentRequest" />
137
- </Suspense>
138
- </div>
139
- </TransitionFade>
140
-
141
- <!-- Loading overlay -->
142
- <TransitionFade>
143
- <div
144
- v-if="loading"
145
- class="bg-bg-main absolute bottom-0 flex h-full w-full
146
- items-center justify-center"
147
- >
148
- <Loading class="text-text-dimmed text-[50px]" />
149
- </div>
150
- </TransitionFade>
151
-
152
- <!-- Blink overlay -->
153
- <TransitionFade>
154
- <div
155
- v-if="previewState.blink"
156
- :key="previewState.blink"
157
- class="pointer-events-none absolute top-0 left-0 h-full
158
- w-full touch-none"
159
- >
160
- <div
161
- class="bg-brand animate-opacity-blink absolute top-0
162
- left-0 h-full w-full opacity-0"
163
- ></div>
164
- </div>
165
- </TransitionFade>
166
- </div>
167
- </div>
168
- </div>
155
+ class="bg-brand animate-opacity-blink absolute top-0 left-0 h-full
156
+ w-full opacity-0"
157
+ ></div>
158
+ </div>
159
+ </TransitionFade>
160
+ </div>
169
161
  </template>
@@ -3,8 +3,8 @@ defineProps<{ message: string }>();
3
3
  </script>
4
4
 
5
5
  <template>
6
- <div class="h-[230px] bg-red-400">
7
- <strong>Error occurred!</strong>
8
- <div v-html="message"></div>
9
- </div>
6
+ <div class="h-[230px] bg-red-400">
7
+ <strong>Error occurred!</strong>
8
+ <div v-html="message"></div>
9
+ </div>
10
10
  </template>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div class="flex h-[230px] items-center justify-center">
3
- <Loading class="text-text-dimmed text-[50px]" />
4
- </div>
2
+ <div class="flex h-[230px] items-center justify-center">
3
+ <Loading class="text-text-dimmed text-[50px]" />
4
+ </div>
5
5
  </template>
@@ -2,63 +2,63 @@
2
2
  import type { MaybeMyIconName } from '#my-icons';
3
3
 
4
4
  defineProps<{
5
- icon: MaybeMyIconName;
6
- main: string;
7
- secondary?: string;
8
- link?: string;
9
- external?: boolean;
5
+ icon: MaybeMyIconName;
6
+ main: string;
7
+ secondary?: string;
8
+ link?: string;
9
+ external?: boolean;
10
10
  }>();
11
11
 
12
12
  const { closePreview, hasPreviousRequest, setPreviousPreview } = usePreview();
13
13
  </script>
14
14
 
15
15
  <template>
16
- <div class="flex max-h-[inherit] flex-col">
17
- <div class="nice-scrollbars flex-1 overflow-auto">
18
- <slot></slot>
16
+ <div class="flex max-h-[inherit] flex-col">
17
+ <div class="nice-scrollbars flex-1 overflow-auto">
18
+ <slot></slot>
19
+ </div>
20
+ <div
21
+ class="border-border gap-small micro:gap-normal micro:h-[60px] px-main
22
+ flex h-[54px] shrink-0 items-center border-t"
23
+ >
24
+ <MaybeMyIcon
25
+ :name="icon"
26
+ class="text-text-muted micro:text-[34px] shrink-0 text-[30px]"
27
+ />
28
+ <div class="flex flex-1 flex-col justify-center overflow-hidden">
29
+ <div
30
+ class="micro:text-sm overflow-hidden text-xs font-bold text-nowrap
31
+ overflow-ellipsis"
32
+ >
33
+ {{ main }}
19
34
  </div>
20
35
  <div
21
- class="border-border gap-small micro:gap-normal micro:h-[60px]
22
- px-main flex h-[54px] shrink-0 items-center border-t"
36
+ v-if="secondary"
37
+ class="text-text-muted text-tiny micro:text-xs overflow-hidden
38
+ text-nowrap overflow-ellipsis"
23
39
  >
24
- <MaybeMyIcon
25
- :name="icon"
26
- class="text-text-muted micro:text-[34px] shrink-0 text-[30px]"
27
- />
28
- <div class="flex flex-1 flex-col justify-center overflow-hidden">
29
- <div
30
- class="micro:text-sm overflow-hidden text-xs font-bold
31
- text-nowrap overflow-ellipsis"
32
- >
33
- {{ main }}
34
- </div>
35
- <div
36
- v-if="secondary"
37
- class="text-text-muted text-tiny micro:text-xs
38
- overflow-hidden text-nowrap overflow-ellipsis"
39
- >
40
- {{ secondary }}
41
- </div>
42
- </div>
43
- <div class="gap-small flex shrink-0 items-center">
44
- <PreviewScreenButton
45
- :class="hasPreviousRequest ? '' : 'opacity-0'"
46
- icon="arrow/left"
47
- :external="true"
48
- @click="setPreviousPreview"
49
- />
50
- <PreviewScreenButton
51
- icon="plus"
52
- @click="closePreview"
53
- :external="true"
54
- />
55
- <PreviewScreenButton
56
- icon="arrow/outward"
57
- :link
58
- :external
59
- :state="link ? 'brand' : 'disabled'"
60
- />
61
- </div>
40
+ {{ secondary }}
62
41
  </div>
42
+ </div>
43
+ <div class="gap-small flex shrink-0 items-center">
44
+ <PreviewScreenButton
45
+ :class="hasPreviousRequest ? '' : 'opacity-0'"
46
+ icon="arrow/left"
47
+ :external="true"
48
+ @click="setPreviousPreview"
49
+ />
50
+ <PreviewScreenButton
51
+ icon="plus"
52
+ @click="closePreview"
53
+ :external="true"
54
+ />
55
+ <PreviewScreenButton
56
+ icon="arrow/outward"
57
+ :link
58
+ :external
59
+ :state="link ? 'brand' : 'disabled'"
60
+ />
61
+ </div>
63
62
  </div>
63
+ </div>
64
64
  </template>
@@ -3,37 +3,37 @@ import type { MaybeMyIconName } from '#my-icons';
3
3
  import EruditLink from '../EruditLink';
4
4
 
5
5
  const { external } = defineProps<{
6
- icon: MaybeMyIconName;
7
- link?: string;
8
- state?: 'brand' | 'disabled';
9
- external?: boolean;
6
+ icon: MaybeMyIconName;
7
+ link?: string;
8
+ state?: 'brand' | 'disabled';
9
+ external?: boolean;
10
10
  }>();
11
11
 
12
12
  const LinkComponent = external ? h('a') : EruditLink;
13
13
  </script>
14
14
 
15
15
  <template>
16
- <component
17
- :is="LinkComponent"
18
- v-bind="{
19
- [external ? 'href' : 'to']: link,
20
- }"
21
- tabindex="0"
22
- target="_blank"
23
- :class="{
24
- [`micro:size-[32px] size-[28px] cursor-pointer rounded
25
- bg-transparent transition-[background,color,opacity]`]: true,
26
- 'pointer-events-none opacity-15': state === 'disabled',
27
- 'text-brand hocus:bg-brand/20': state === 'brand',
28
- 'text-text-muted hocus:text-text hocus:bg-bg-accent': !state,
29
- }"
30
- >
31
- <MaybeMyIcon
32
- :name="icon"
33
- :class="{
34
- 'size-full': true,
35
- 'scale-120 rotate-45': icon === 'plus',
36
- }"
37
- />
38
- </component>
16
+ <component
17
+ :is="LinkComponent"
18
+ v-bind="{
19
+ [external ? 'href' : 'to']: link,
20
+ }"
21
+ tabindex="0"
22
+ target="_blank"
23
+ :class="{
24
+ [`micro:size-[32px] size-[28px] cursor-pointer rounded bg-transparent
25
+ transition-[background,color,opacity]`]: true,
26
+ 'pointer-events-none opacity-15': state === 'disabled',
27
+ 'text-brand hocus:bg-brand/20': state === 'brand',
28
+ 'text-text-muted hocus:text-text hocus:bg-bg-accent': !state,
29
+ }"
30
+ >
31
+ <MaybeMyIcon
32
+ :name="icon"
33
+ :class="{
34
+ 'size-full': true,
35
+ 'scale-120 rotate-45': icon === 'plus',
36
+ }"
37
+ />
38
+ </component>
39
39
  </template>
@@ -4,47 +4,44 @@ import type { PreviewRequestContentPage } from '@erudit-js/core/preview/request'
4
4
  const { request } = defineProps<{ request: PreviewRequestContentPage }>();
5
5
 
6
6
  const contentTypeKey =
7
- request.contentType === 'topic' ? request.topicPart : request.contentType;
7
+ request.contentType === 'topic' ? request.topicPart : request.contentType;
8
8
 
9
9
  const previewData: PreviewContentPage = await $fetch(
10
- '/api/preview/contentPage/' +
11
- stringifyContentTypePath(contentTypeKey, request.fullId) +
12
- '.json',
13
- {
14
- responseType: 'json',
15
- },
10
+ '/api/preview/contentPage/' +
11
+ stringifyContentTypePath(contentTypeKey, request.fullId) +
12
+ '.json',
13
+ {
14
+ responseType: 'json',
15
+ },
16
16
  );
17
17
 
18
18
  const icon = ICONS[contentTypeKey];
19
19
 
20
20
  const phrase = await usePhrases(
21
- 'book',
22
- 'group',
23
- 'topic',
24
- 'article',
25
- 'summary',
26
- 'practice',
27
- 'page',
28
- 'preview_content_page_description',
21
+ 'book',
22
+ 'group',
23
+ 'topic',
24
+ 'article',
25
+ 'summary',
26
+ 'practice',
27
+ 'page',
28
+ 'preview_content_page_description',
29
29
  );
30
30
 
31
31
  const secondary =
32
- phrase[contentTypeKey] +
33
- (previewData.bookTitle ? ` • ${previewData.bookTitle}` : '');
32
+ phrase[contentTypeKey] +
33
+ (previewData.bookTitle ? ` • ${previewData.bookTitle}` : '');
34
34
  </script>
35
35
 
36
36
  <template>
37
- <PreviewScreen
38
- :icon
39
- :link="previewData.link"
40
- :main="previewData.title"
41
- :secondary
42
- >
43
- <div class="micro:text-base px-main py-main text-sm">
44
- {{
45
- previewData.description ??
46
- phrase.preview_content_page_description
47
- }}
48
- </div>
49
- </PreviewScreen>
37
+ <PreviewScreen
38
+ :icon
39
+ :link="previewData.link"
40
+ :main="previewData.title"
41
+ :secondary
42
+ >
43
+ <div class="micro:text-base px-main py-main text-sm">
44
+ {{ previewData.description ?? phrase.preview_content_page_description }}
45
+ </div>
46
+ </PreviewScreen>
50
47
  </template>
@@ -7,17 +7,17 @@ const phrase = await usePhrases('direct_link', 'direct_link_explain');
7
7
  </script>
8
8
 
9
9
  <template>
10
- <PreviewScreen
11
- icon="arrow/outward-box"
12
- :main="phrase.direct_link"
13
- :link="request.href"
14
- :external="true"
15
- >
16
- <div class="micro:text-base px-main py-main text-sm">
17
- <div>{{ phrase.direct_link_explain }}</div>
18
- <div class="mt-small font-mono wrap-break-word underline">
19
- {{ request.href }}
20
- </div>
21
- </div>
22
- </PreviewScreen>
10
+ <PreviewScreen
11
+ icon="arrow/outward-box"
12
+ :main="phrase.direct_link"
13
+ :link="request.href"
14
+ :external="true"
15
+ >
16
+ <div class="micro:text-base px-main py-main text-sm">
17
+ <div>{{ phrase.direct_link_explain }}</div>
18
+ <div class="mt-small font-mono wrap-break-word underline">
19
+ {{ request.href }}
20
+ </div>
21
+ </div>
22
+ </PreviewScreen>
23
23
  </template>
@@ -4,14 +4,14 @@ import type { PreviewRequestUnique } from '@erudit-js/core/preview/request';
4
4
  const { request } = defineProps<{ request: PreviewRequestUnique }>();
5
5
 
6
6
  const contentTypeKey =
7
- request.contentType === 'topic' ? request.topicPart : request.contentType;
7
+ request.contentType === 'topic' ? request.topicPart : request.contentType;
8
8
 
9
9
  const previewData = await $fetch<PreviewContentUnique>(
10
- `/api/preview/contentUnique/${stringifyContentTypePath(contentTypeKey, request.contentFullId)}/${request.uniqueName}` +
11
- '.json',
12
- {
13
- responseType: 'json',
14
- },
10
+ `/api/preview/contentUnique/${stringifyContentTypePath(contentTypeKey, request.contentFullId)}/${request.uniqueName}` +
11
+ '.json',
12
+ {
13
+ responseType: 'json',
14
+ },
15
15
  );
16
16
 
17
17
  const elementIcon = await getElementIcon(previewData.schemaName);
@@ -19,36 +19,35 @@ const elementPhrase = await getElementPhrase(previewData.schemaName);
19
19
 
20
20
  const main = previewData.elementTitle || elementPhrase.element_name;
21
21
  const secondary = (() => {
22
- if (!previewData.elementTitle) {
23
- return previewData.contentTitle;
24
- }
22
+ if (!previewData.elementTitle) {
23
+ return previewData.contentTitle;
24
+ }
25
25
 
26
- return `${elementPhrase.element_name} • ${previewData.contentTitle}`;
26
+ return `${elementPhrase.element_name} • ${previewData.contentTitle}`;
27
27
  })();
28
28
  </script>
29
29
 
30
30
  <template>
31
- <PreviewScreen
32
- :icon="elementIcon"
33
- :main="main"
34
- :secondary="secondary"
35
- :link="previewData.link"
31
+ <PreviewScreen
32
+ :icon="elementIcon"
33
+ :main="main"
34
+ :secondary="secondary"
35
+ :link="previewData.link"
36
+ >
37
+ <div
38
+ class="nice-scrollbars py-small relative max-h-[inherit] overflow-auto"
36
39
  >
37
- <div
38
- class="nice-scrollbars py-small relative max-h-[inherit]
39
- overflow-auto"
40
- >
41
- <Prose
42
- :element="previewData.proseElement"
43
- :storage="previewData.storage"
44
- :urlPath="'/' + previewData.link.split('#')[0]"
45
- :useHashUrl="false"
46
- />
47
- <div
48
- v-if="previewData.fadeOverlay"
49
- class="to-bg-main pointer-events-none absolute bottom-0 left-0
50
- h-full w-full touch-none bg-linear-to-b from-transparent"
51
- ></div>
52
- </div>
53
- </PreviewScreen>
40
+ <Prose
41
+ :element="previewData.proseElement"
42
+ :storage="previewData.storage"
43
+ :urlPath="'/' + previewData.link.split('#')[0]"
44
+ :useHashUrl="false"
45
+ />
46
+ <div
47
+ v-if="previewData.fadeOverlay"
48
+ class="to-bg-main pointer-events-none absolute bottom-0 left-0 h-full
49
+ w-full touch-none bg-linear-to-b from-transparent"
50
+ ></div>
51
+ </div>
52
+ </PreviewScreen>
54
53
  </template>