erudit 3.0.0-dev.2 → 3.0.0-dev.21
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.
- package/app/app.vue +195 -172
- package/app/assets/icons/cameo-add.svg +3 -0
- package/app/assets/icons/diamond.svg +3 -0
- package/app/assets/icons/graduation.svg +3 -0
- package/app/components/Avatar.vue +118 -0
- package/app/components/EruditLink.vue +17 -0
- package/app/components/Loading.vue +23 -23
- package/app/components/SiteAside.vue +393 -382
- package/app/components/SiteMain.vue +32 -35
- package/app/components/ads/Ads.vue +33 -0
- package/app/components/ads/AdsBannerAside.vue +61 -0
- package/app/components/ads/AdsBannerBottom.vue +22 -0
- package/app/components/ads/AdsProviderCustom.vue +35 -0
- package/app/components/ads/AdsProviderYandex.vue +91 -0
- package/app/components/ads/AdsReplacer.vue +73 -0
- package/app/components/aside/AsideListItem.vue +91 -74
- package/app/components/aside/AsideMajor.vue +56 -56
- package/app/components/aside/AsideMinor.vue +97 -71
- package/app/components/aside/major/PaneContentScroll.vue +23 -23
- package/app/components/aside/major/PaneSwitch.vue +54 -54
- package/app/components/aside/major/PaneSwitchButton.vue +63 -63
- package/app/components/aside/major/SiteInfo.vue +85 -85
- package/app/components/aside/major/panes/Language.vue +79 -79
- package/app/components/aside/major/panes/Pages.vue +50 -34
- package/app/components/aside/major/panes/Search.vue +11 -11
- package/app/components/aside/major/panes/nav/Nav.vue +92 -91
- package/app/components/aside/major/panes/nav/NavBook.vue +95 -86
- package/app/components/aside/major/panes/nav/NavBookLoading.vue +24 -24
- package/app/components/aside/major/panes/nav/NavGlobal.vue +16 -16
- package/app/components/aside/major/panes/nav/fnav/FNav.vue +105 -105
- package/app/components/aside/major/panes/nav/fnav/FNavBook.vue +32 -32
- package/app/components/aside/major/panes/nav/fnav/FNavFlags.vue +40 -40
- package/app/components/aside/major/panes/nav/fnav/FNavFolder.vue +60 -60
- package/app/components/aside/major/panes/nav/fnav/FNavItem.vue +34 -34
- package/app/components/aside/major/panes/nav/fnav/FNavSeparator.vue +80 -80
- package/app/components/aside/major/panes/nav/fnav/FNavTopic.vue +24 -24
- package/app/components/aside/major/panes/other/ItemContent.vue +29 -29
- package/app/components/aside/major/panes/other/ItemGenerator.vue +13 -15
- package/app/components/aside/major/panes/other/ItemTheme.vue +54 -54
- package/app/components/aside/major/panes/other/Other.vue +16 -16
- package/app/components/aside/minor/{Contribute.vue → AsideMinorContribute.vue} +175 -145
- package/app/components/aside/minor/AsideMinorNews.vue +11 -11
- package/app/components/aside/minor/AsideMinorPane.vue +15 -15
- package/app/components/aside/minor/AsideMinorTopLink.vue +66 -67
- package/app/components/aside/minor/content/AsideMinorContent.vue +89 -92
- package/app/components/aside/minor/contributor/AsideMinorContributor.vue +78 -0
- package/app/components/aside/minor/contributor/BookContribution.vue +64 -0
- package/app/components/aside/minor/topic/AsideMinorTopic.vue +31 -32
- package/app/components/aside/minor/topic/TopicContributors.vue +183 -177
- package/app/components/aside/minor/topic/TopicNav.vue +49 -49
- package/app/components/aside/minor/topic/TopicToc.vue +212 -203
- package/app/components/aside/minor/topic/TopicTocItem.vue +19 -31
- package/app/components/aside/utils/AsideOverlayPane.vue +40 -40
- package/app/components/bitran/BitranContent.vue +90 -63
- package/app/components/bitran/RenderWrapper.vue +10 -10
- package/app/components/contributor/ContributorListItem.vue +43 -35
- package/app/components/main/MainActionButton.vue +51 -0
- package/app/components/main/MainBitranContent.vue +55 -0
- package/app/components/main/{utils/Breadcrumb.vue → MainBreadcrumb.vue} +63 -75
- package/app/components/main/MainDescription.vue +24 -0
- package/app/components/main/MainSection.vue +58 -0
- package/app/components/main/MainTitle.vue +76 -0
- package/app/components/main/cameo/MainCameo.vue +135 -0
- package/app/components/main/cameo/MainCameoData.vue +232 -0
- package/app/components/main/content/ContentBreadcrumb.vue +28 -0
- package/app/components/main/{utils → content}/ContentDecoration.vue +29 -29
- package/app/components/main/{utils → content}/ContentPopover.vue +188 -176
- package/app/components/main/{utils → content}/ContentPopovers.vue +111 -105
- package/app/components/main/{utils → content}/ContentReferences.vue +70 -70
- package/app/components/main/{utils → content}/reference/ReferenceGroup.vue +38 -38
- package/app/components/main/{utils → content}/reference/ReferenceItem.vue +70 -68
- package/app/components/main/{utils → content}/reference/ReferenceSource.vue +120 -116
- package/app/components/main/topic/MainTopic.vue +76 -79
- package/app/components/main/topic/TopicPartSwitch.vue +119 -118
- package/app/components/preview/Preview.vue +186 -177
- package/app/components/preview/PreviewDisplay.vue +139 -139
- package/app/components/preview/PreviewFooterAction.vue +73 -73
- package/app/components/preview/PreviewLoading.vue +14 -14
- package/app/components/preview/PreviewScreen.vue +141 -99
- package/app/components/preview/display/Alert.vue +50 -50
- package/app/components/preview/display/Custom.vue +18 -18
- package/app/components/preview/display/GenericLink.vue +48 -48
- package/app/components/preview/display/PageLink.vue +22 -20
- package/app/components/preview/display/Unique.vue +46 -49
- package/app/components/sponsor/SponsorTier1.vue +89 -0
- package/app/components/sponsor/SponsorTier2.vue +109 -0
- package/app/components/transition/Fade.vue +19 -19
- package/app/components/tree/TreeContainer.vue +11 -11
- package/app/components/tree/TreeItem.vue +93 -89
- package/app/composables/adsAllowed.ts +11 -0
- package/app/composables/asset.ts +12 -0
- package/app/composables/bitran.ts +108 -127
- package/app/composables/bitranLocation.ts +7 -7
- package/app/composables/contentData.ts +38 -36
- package/app/composables/contentPage.ts +168 -156
- package/app/composables/contentRoute.ts +45 -45
- package/app/composables/darkMagic.ts +24 -24
- package/app/composables/externalApi.ts +69 -63
- package/app/composables/favicon.ts +8 -8
- package/app/composables/formatText.ts +99 -86
- package/app/composables/head.ts +24 -0
- package/app/composables/majorPane.ts +62 -60
- package/app/composables/phrases.ts +77 -80
- package/app/composables/theme.ts +29 -29
- package/app/composables/url.ts +43 -33
- package/app/pages/_test/preview.vue +110 -110
- package/app/pages/article/[...articleId].vue +3 -3
- package/app/pages/book/[...bookId].vue +42 -47
- package/app/pages/contributor/[contributorId].vue +227 -0
- package/app/pages/contributors.vue +184 -0
- package/app/pages/group/[...groupId].vue +53 -65
- package/app/pages/index.vue +32 -32
- package/app/pages/practice/[...practice].vue +3 -3
- package/app/pages/sponsors.vue +95 -0
- package/app/pages/summary/[...summaryId].vue +3 -3
- package/app/plugins/analytics.ts +95 -0
- package/app/plugins/prerender.server.ts +34 -0
- package/app/public/favicon/article.svg +5 -5
- package/app/public/favicon/default.svg +3 -3
- package/app/public/favicon/practice.svg +3 -3
- package/app/public/favicon/summary.svg +4 -4
- package/app/public/logotype.svg +2 -2
- package/app/scripts/_immediate.js +9 -9
- package/app/scripts/aside/index.ts +59 -59
- package/app/scripts/aside/major/nav.ts +26 -26
- package/app/scripts/aside/minor/state.ts +37 -37
- package/app/scripts/flag.ts +28 -28
- package/app/scripts/og.ts +28 -27
- package/app/scripts/preview/build.ts +76 -73
- package/app/scripts/preview/data/alert.ts +19 -19
- package/app/scripts/preview/data/custom.ts +8 -8
- package/app/scripts/preview/data/genericLink.ts +24 -24
- package/app/scripts/preview/data/pageLink.ts +23 -20
- package/app/scripts/preview/data/unique.ts +69 -70
- package/app/scripts/preview/data.ts +24 -24
- package/app/scripts/preview/display.ts +37 -37
- package/app/scripts/preview/footer.ts +9 -9
- package/app/scripts/preview/request.ts +51 -51
- package/app/scripts/preview/state.ts +63 -63
- package/app/styles/_immediate.css +7 -7
- package/app/styles/_util.scss +43 -43
- package/app/styles/_utils.scss +44 -44
- package/app/styles/app.scss +91 -91
- package/app/styles/def/_bp.scss +27 -27
- package/app/styles/def/_size.scss +7 -7
- package/app/styles/def/_z.scss +5 -5
- package/app/styles/normalize.scss +49 -63
- package/app/styles/partials/_darkMagic.scss +5 -5
- package/app/styles/partials/_fnav.scss +15 -15
- package/app/styles/partials/_preview.scss +5 -5
- package/bin/erudit.mjs +2 -0
- package/const.ts +3 -0
- package/globalPath.ts +21 -21
- package/globals/bitran.ts +1 -47
- package/globals/cameo.ts +5 -0
- package/globals/content.ts +27 -22
- package/globals/contributor.ts +5 -5
- package/globals/erudit.ts +5 -5
- package/globals/register.ts +23 -18
- package/globals/sponsor.ts +17 -0
- package/languages/en.ts +108 -95
- package/languages/ru.ts +112 -99
- package/module/bitran.ts +66 -34
- package/module/config.ts +35 -34
- package/module/imports.ts +74 -46
- package/module/index.ts +47 -47
- package/module/logger.ts +10 -10
- package/module/paths.ts +22 -22
- package/module/restart.ts +61 -61
- package/nuxt.config.ts +126 -112
- package/package.json +22 -15
- package/server/api/aside/major/nav/bookIds.ts +5 -5
- package/server/api/aside/major/nav/bookNav/[...bookId].ts +17 -20
- package/server/api/aside/major/nav/global.ts +7 -7
- package/server/api/aside/minor/book/[...bookId].ts +18 -0
- package/server/api/aside/minor/contributor/[contributorId].ts +18 -0
- package/server/api/aside/minor/group/[...groupId].ts +18 -0
- package/server/api/aside/minor/news.ts +7 -7
- package/server/api/aside/minor/topic.ts +36 -0
- package/server/api/bitran/content/[...location].ts +13 -0
- package/server/api/bitran/toc/[...location].ts +9 -0
- package/server/api/cameo/data/[cameoId].ts +42 -0
- package/server/api/cameo/ids.ts +5 -0
- package/server/api/content/data.ts +75 -72
- package/server/api/contributor/count.ts +6 -6
- package/server/api/contributor/list.ts +44 -0
- package/server/api/contributor/page/[contributorId].ts +14 -0
- package/server/api/fake/content.ts +11 -11
- package/server/api/fake/shared/languages.ts +12 -12
- package/server/api/language/functions.ts +12 -12
- package/server/api/language/phrase/[phraseId].ts +19 -19
- package/server/api/language/phraseIds.ts +8 -8
- package/server/api/prerender/assets/cameo.ts +14 -0
- package/server/api/prerender/assets/contributor.ts +12 -0
- package/server/api/prerender/assets/sponsor.ts +13 -0
- package/server/api/prerender/cameos.ts +12 -0
- package/server/api/prerender/language.ts +9 -0
- package/server/api/preview/page/[...parts].ts +78 -51
- package/server/api/preview/unique/{[location].ts → [...location].ts} +48 -55
- package/server/api/problem/generator/[...path].ts +26 -0
- package/server/api/sponsor/cameo/data/[sponsorId].ts +51 -0
- package/server/api/sponsor/cameo/ids.ts +5 -0
- package/server/api/sponsor/count.ts +5 -0
- package/server/api/sponsor/list.ts +36 -0
- package/server/plugin/bitran/content.ts +252 -187
- package/server/plugin/bitran/{products → elements}/include.ts +229 -230
- package/server/plugin/bitran/location.ts +43 -25
- package/server/plugin/bitran/toc.ts +94 -83
- package/server/plugin/bitran/transpiler.ts +18 -46
- package/server/plugin/build/close.ts +12 -10
- package/server/plugin/build/jobs/content/builderArgs.ts +8 -8
- package/server/plugin/build/jobs/content/generic.ts +191 -176
- package/server/plugin/build/jobs/content/parse.ts +113 -100
- package/server/plugin/build/jobs/content/path.ts +6 -6
- package/server/plugin/build/jobs/content/type/book.ts +9 -9
- package/server/plugin/build/jobs/content/type/group.ts +37 -37
- package/server/plugin/build/jobs/content/type/topic.ts +36 -36
- package/server/plugin/build/jobs/contributors.ts +69 -66
- package/server/plugin/build/jobs/language.ts +36 -36
- package/server/plugin/build/jobs/nav.ts +345 -210
- package/server/plugin/build/process.ts +34 -25
- package/server/plugin/build/rebuild.ts +68 -55
- package/server/plugin/build/setup.ts +19 -21
- package/server/plugin/content/context.ts +119 -112
- package/server/plugin/db/entities/Book.ts +7 -7
- package/server/plugin/db/entities/Content.ts +45 -49
- package/server/plugin/db/entities/Contribution.ts +10 -10
- package/server/plugin/db/entities/Contributor.ts +25 -16
- package/server/plugin/db/entities/File.ts +10 -0
- package/server/plugin/db/entities/Group.ts +14 -14
- package/server/plugin/db/entities/Hash.ts +15 -15
- package/server/plugin/db/entities/Topic.ts +20 -20
- package/server/plugin/db/entities/Unique.ts +21 -21
- package/server/plugin/db/reset.ts +12 -0
- package/server/plugin/db/setup.ts +49 -34
- package/server/plugin/global.ts +18 -18
- package/server/plugin/importer.ts +16 -12
- package/server/plugin/index.ts +9 -9
- package/server/plugin/logger.ts +23 -23
- package/server/plugin/nav/node.ts +27 -26
- package/server/plugin/nav/utils.ts +179 -129
- package/server/plugin/repository/asideMinor.ts +51 -0
- package/server/plugin/repository/book.ts +39 -21
- package/server/plugin/repository/cameo.ts +16 -0
- package/server/plugin/repository/content.ts +240 -238
- package/server/plugin/repository/contentId.ts +40 -0
- package/server/plugin/repository/contributor.ts +129 -8
- package/server/plugin/repository/file.ts +10 -0
- package/server/plugin/repository/frontNav.ts +145 -148
- package/server/plugin/repository/topic.ts +35 -32
- package/server/plugin/sponsor/build.ts +82 -0
- package/server/plugin/sponsor/index.ts +5 -0
- package/server/plugin/sponsor/repository.ts +56 -0
- package/server/routes/asset/[...assetPath].ts +34 -0
- package/server/routes/robots.txt.ts +9 -0
- package/server/routes/sitemap.xml.ts +103 -0
- package/server/tsconfig.json +9 -9
- package/shared/aside/minor.ts +55 -50
- package/shared/asset.ts +17 -15
- package/shared/bitran/content.ts +9 -0
- package/shared/bitran/contentId.ts +56 -0
- package/shared/bitran/toc.ts +8 -8
- package/shared/breadcrumb.ts +7 -0
- package/shared/content/bookId.ts +12 -0
- package/shared/content/context.ts +9 -9
- package/shared/content/data/base.ts +32 -32
- package/shared/content/data/index.ts +5 -5
- package/shared/content/data/type/book.ts +5 -5
- package/shared/content/data/type/group.ts +6 -6
- package/shared/content/data/type/topic.ts +11 -11
- package/shared/content/previousNext.ts +9 -9
- package/shared/contributor.ts +34 -5
- package/shared/frontNav.ts +41 -41
- package/shared/icons.ts +38 -38
- package/shared/image.ts +5 -5
- package/shared/link.ts +28 -25
- package/shared/popover.ts +8 -0
- package/shared/types/language.ts +84 -75
- package/shared/utils/objectsEqual.ts +4 -4
- package/shared/utils/stringColor.ts +9 -9
- package/test/contentId.test.ts +91 -0
- package/test/utils/url.test.ts +99 -0
- package/tsconfig.json +8 -8
- package/utils/contentPath.ts +67 -0
- package/utils/ext.ts +41 -0
- package/utils/stress.ts +9 -9
- package/utils/url.ts +23 -0
- package/app/components/ads/BannerTemplate.vue +0 -51
- package/app/components/ads/BottomBanner.vue +0 -45
- package/app/components/ads/LeftBanner.vue +0 -50
- package/app/components/aside/minor/AsideMinorContributor.vue +0 -5
- package/app/components/contributor/ContributorAvatar.vue +0 -43
- package/app/components/main/utils/ContentDescription.vue +0 -19
- package/app/components/main/utils/ContentFlag.vue +0 -15
- package/app/components/main/utils/ContentSection.vue +0 -45
- package/app/components/main/utils/ContentTitle.vue +0 -39
- package/app/composables/bitranContent.ts +0 -37
- package/app/pages/members.vue +0 -6
- package/app/public/user.svg +0 -10
- package/app/scripts/aside/minor/topic.ts +0 -3
- package/app/styles/default.scss +0 -83
- package/server/api/aside/minor/path.ts +0 -78
- package/server/api/bitran/content/[location].ts +0 -7
- package/server/api/bitran/toc/[location].ts +0 -7
- package/server/plugin/bitran/products/link.ts +0 -116
- package/server/plugin/bitran/setup.ts +0 -9
- package/server/plugin/content/absoluteId.ts +0 -94
- package/shared/bitran/context.ts +0 -8
- package/shared/bitran/default.ts +0 -46
- package/shared/bitran/link/Link.vue +0 -167
- package/shared/bitran/link/factory.ts +0 -24
- package/shared/bitran/link/icon.svg +0 -3
- package/shared/bitran/link/languages/en.ts +0 -7
- package/shared/bitran/link/languages/ru.ts +0 -7
- package/shared/bitran/link/renderer.ts +0 -21
- package/shared/bitran/link/shared.ts +0 -17
- package/shared/bitran/link/target.ts +0 -134
- package/shared/bitran/link/transpiler.ts +0 -10
- package/shared/bitran/location.ts +0 -166
- package/test/bitran/link/target.test.ts +0 -141
- package/test/bitran/location.test.ts +0 -143
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<MainTopic />
|
|
3
|
-
</template>
|
|
1
|
+
<template>
|
|
2
|
+
<MainTopic />
|
|
3
|
+
</template>
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import eruditConfig from '#erudit/config';
|
|
2
|
+
|
|
3
|
+
export default defineNuxtPlugin({
|
|
4
|
+
name: 'erudit-analytics',
|
|
5
|
+
hooks: {
|
|
6
|
+
'app:rendered': (context) => {
|
|
7
|
+
if (!context.ssrContext || !eruditConfig.analytics) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
if (typeof eruditConfig?.debug?.analytics === 'undefined') {
|
|
12
|
+
if (import.meta.dev) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
} else if (!Boolean(eruditConfig?.debug?.analytics)) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
if (eruditConfig.analytics.yandex) {
|
|
20
|
+
const yandex = eruditConfig.analytics.yandex;
|
|
21
|
+
|
|
22
|
+
if (yandex.verification) {
|
|
23
|
+
context.ssrContext.head.push({
|
|
24
|
+
meta: [
|
|
25
|
+
{
|
|
26
|
+
name: 'yandex-verification',
|
|
27
|
+
content: yandex.verification,
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (yandex.metricsId) {
|
|
34
|
+
context.ssrContext.head.push({
|
|
35
|
+
script: [
|
|
36
|
+
{
|
|
37
|
+
innerHTML: `
|
|
38
|
+
(function(m,e,t,r,i,k,a){
|
|
39
|
+
m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};
|
|
40
|
+
m[i].l=1*new Date();
|
|
41
|
+
k=e.createElement(t),a=e.getElementsByTagName(t)[0],
|
|
42
|
+
k.async=1,k.src=r,a.parentNode.insertBefore(k,a)
|
|
43
|
+
})(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
|
|
44
|
+
|
|
45
|
+
ym(${yandex.metricsId}, "init", {
|
|
46
|
+
clickmap:true,
|
|
47
|
+
trackLinks:true,
|
|
48
|
+
accurateTrackBounce:true,
|
|
49
|
+
webvisor:true
|
|
50
|
+
});
|
|
51
|
+
`,
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (eruditConfig.analytics.google) {
|
|
59
|
+
const google = eruditConfig.analytics.google;
|
|
60
|
+
|
|
61
|
+
if (google.verification) {
|
|
62
|
+
context.ssrContext.head.push({
|
|
63
|
+
meta: [
|
|
64
|
+
{
|
|
65
|
+
name: 'google-site-verification',
|
|
66
|
+
content: google.verification,
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (google.gtag) {
|
|
73
|
+
context.ssrContext.head.push({
|
|
74
|
+
script: [
|
|
75
|
+
{
|
|
76
|
+
src:
|
|
77
|
+
'https://www.googletagmanager.com/gtag/js?id=' +
|
|
78
|
+
google.gtag,
|
|
79
|
+
async: true,
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
innerHTML: `
|
|
83
|
+
window.dataLayer = window.dataLayer || [];
|
|
84
|
+
function gtag(){window.dataLayer.push(arguments);}
|
|
85
|
+
gtag('js', new Date());
|
|
86
|
+
gtag('config', '${google.gtag}');
|
|
87
|
+
`,
|
|
88
|
+
},
|
|
89
|
+
],
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
let alreadyPrerendered = false;
|
|
2
|
+
let isPrerendering = false;
|
|
3
|
+
|
|
4
|
+
export default defineNuxtPlugin({
|
|
5
|
+
name: 'erudit-prerender',
|
|
6
|
+
async setup(_nuxt) {
|
|
7
|
+
if (import.meta.dev) {
|
|
8
|
+
return; // Server is available so no need to prerender in dev mode
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
if (alreadyPrerendered || isPrerendering) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
isPrerendering = true;
|
|
16
|
+
|
|
17
|
+
const routeProviders = [
|
|
18
|
+
'/api/prerender/language',
|
|
19
|
+
'/api/prerender/cameos',
|
|
20
|
+
|
|
21
|
+
// Assets
|
|
22
|
+
'/api/prerender/assets/cameo',
|
|
23
|
+
'/api/prerender/assets/contributor',
|
|
24
|
+
'/api/prerender/assets/sponsor',
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
for (const provider of routeProviders) {
|
|
28
|
+
const routes = await $fetch<string[]>(provider);
|
|
29
|
+
_nuxt.runWithContext(() => prerenderRoutes(routes));
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
alreadyPrerendered = true;
|
|
33
|
+
},
|
|
34
|
+
});
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
|
|
2
2
|
<defs>
|
|
3
|
-
<linearGradient id="gradient" x1="
|
|
4
|
-
<stop offset="0" stop-color="#
|
|
5
|
-
<stop offset="1" stop-color="#
|
|
3
|
+
<linearGradient id="gradient" x1="75" y1="423" x2="437" y2="61" gradientUnits="userSpaceOnUse">
|
|
4
|
+
<stop offset="0" stop-color="#4aa44c"/>
|
|
5
|
+
<stop offset="1" stop-color="#1278b9"/>
|
|
6
6
|
</linearGradient>
|
|
7
7
|
</defs>
|
|
8
|
-
<circle cx="256" cy="256" r="256"
|
|
9
|
-
<path d="
|
|
8
|
+
<circle fill="url(#gradient)" cx="256" cy="256" r="256"/>
|
|
9
|
+
<path fill="white" d="M372.4,179.3h-232.8c-6.6,0-12-5.4-12-12v-26.3c0-6.6,5.4-12,12-12h232.8c6.6,0,12,5.4,12,12v26.3c0,6.6-5.4,12-12,12ZM384.4,269.2v-26.3c0-6.6-5.4-12-12-12h-232.8c-6.6,0-12,5.4-12,12v26.3c0,6.6,5.4,12,12,12h232.8c6.6,0,12-5.4,12-12ZM384.4,371v-26.3c0-6.6-5.4-12-12-12h-232.8c-6.6,0-12,5.4-12,12v26.3c0,6.6,5.4,12,12,12h232.8c6.6,0,12-5.4,12-12Z"/>
|
|
10
10
|
</svg>
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
|
|
2
2
|
<defs>
|
|
3
3
|
<linearGradient id="gradient" x1="75" y1="423" x2="437" y2="61" gradientUnits="userSpaceOnUse">
|
|
4
|
-
<stop offset="0" stop-color="#
|
|
5
|
-
<stop offset="1" stop-color="#
|
|
4
|
+
<stop offset="0" stop-color="#4aa44c"/>
|
|
5
|
+
<stop offset="1" stop-color="#1278b9"/>
|
|
6
6
|
</linearGradient>
|
|
7
7
|
</defs>
|
|
8
|
-
<circle fill="url(#gradient)"
|
|
8
|
+
<circle fill="url(#gradient)" cx="256" cy="256" r="256"/>
|
|
9
9
|
<path fill="white" d="M385.2,317.4v-91.1l-122.9,61.9c-5.5,2.8-11.4,4.3-17.5,4.3s-12-1.4-17.4-4.3l-126.5-63.9c-3.3-1.7-5.9-4.1-7.9-7s-2.9-6.1-2.9-9.6,1-6.6,2.9-9.6c2-3,4.6-5.4,7.9-7.2l126.5-63.9c2.8-1.5,5.7-2.6,8.6-3.3,2.9-.7,5.9-1,8.9-1s5.9.4,8.9,1c2.9.7,5.8,1.8,8.6,3.3l149.2,75.2c3.1,1.7,5.6,4,7.6,6.9,1.9,2.9,2.9,6.1,2.9,9.8v98.7c0,5-1.8,9.3-5.4,12.9-3.6,3.6-7.8,5.4-12.9,5.4s-9.3-1.8-13-5.4c-3.6-3.6-5.5-7.9-5.5-13h0ZM235.8,388.5c3,.5,5.9.8,8.9.8s5.9-.3,8.9-.8c2.9-.5,5.9-1.6,8.6-3.1l67.9-34.1c6.2-3.1,11.2-7.7,14.9-13.7,3.8-6.1,5.6-12.6,5.6-19.6v-37.9l-88.4,44.6c-5.4,2.9-11.3,4.3-17.4,4.3s-12-1.5-17.5-4.3l-88.4-44.6v37.9c0,7,1.9,13.6,5.6,19.6,3.8,6,8.7,10.6,14.9,13.7l67.9,34.1h0c2.8,1.5,5.7,2.6,8.6,3.1Z"/>
|
|
10
10
|
</svg>
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
|
|
2
2
|
<defs>
|
|
3
3
|
<linearGradient id="gradient" x1="74.98" y1="423.02" x2="437.02" y2="60.98" gradientUnits="userSpaceOnUse">
|
|
4
|
-
<stop offset="0" stop-color="#
|
|
5
|
-
<stop offset="1" stop-color="#
|
|
4
|
+
<stop offset="0" stop-color="#4aa44c"/>
|
|
5
|
+
<stop offset="1" stop-color="#1278b9"/>
|
|
6
6
|
</linearGradient>
|
|
7
7
|
</defs>
|
|
8
8
|
<circle cx="256" cy="256" r="256" fill="url(#gradient)"/>
|
|
9
|
-
<path d="M216.29,267.91l129.71-129.71,52.94,52.94-182.66,182.66-103.24-103.24,52.94-52.94,50.3,50.3Z"
|
|
9
|
+
<path fill="white" d="M216.29,267.91l129.71-129.71,52.94,52.94-182.66,182.66-103.24-103.24,52.94-52.94,50.3,50.3Z" />
|
|
10
10
|
</svg>
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
|
|
2
2
|
<defs>
|
|
3
3
|
<linearGradient id="gradient" x1="74.98" y1="423.02" x2="437.02" y2="60.98" gradientUnits="userSpaceOnUse">
|
|
4
|
-
<stop offset="0" stop-color="#
|
|
5
|
-
<stop offset="1" stop-color="#
|
|
4
|
+
<stop offset="0" stop-color="#4aa44c"/>
|
|
5
|
+
<stop offset="1" stop-color="#1278b9"/>
|
|
6
6
|
</linearGradient>
|
|
7
7
|
</defs>
|
|
8
|
-
<circle cx="256" cy="256" r="256"
|
|
9
|
-
<path d="M271.03,131.48c-2.77-5.75-8.63-9.42-15.07-9.42s-12.24,3.66-15.07,9.42l-33.64,69.21-75.12,11.09c-6.28.94-11.51,5.34-13.44,11.35s-.37,12.66,4.13,17.11l54.51,53.93-12.87,76.22c-1.05,6.28,1.57,12.66,6.75,16.37,5.18,3.71,12.03,4.18,17.68,1.2l67.12-35.83,67.12,35.83c5.65,2.98,12.5,2.56,17.68-1.2,5.18-3.77,7.79-10.1,6.75-16.37l-12.92-76.22,54.51-53.93c4.5-4.45,6.12-11.09,4.13-17.11-1.99-6.02-7.17-10.41-13.44-11.35l-75.17-11.09-33.64-69.21Z"
|
|
8
|
+
<circle fill="url(#gradient)" cx="256" cy="256" r="256" />
|
|
9
|
+
<path fill="white" d="M271.03,131.48c-2.77-5.75-8.63-9.42-15.07-9.42s-12.24,3.66-15.07,9.42l-33.64,69.21-75.12,11.09c-6.28.94-11.51,5.34-13.44,11.35s-.37,12.66,4.13,17.11l54.51,53.93-12.87,76.22c-1.05,6.28,1.57,12.66,6.75,16.37,5.18,3.71,12.03,4.18,17.68,1.2l67.12-35.83,67.12,35.83c5.65,2.98,12.5,2.56,17.68-1.2,5.18-3.77,7.79-10.1,6.75-16.37l-12.92-76.22,54.51-53.93c4.5-4.45,6.12-11.09,4.13-17.11-1.99-6.02-7.17-10.41-13.44-11.35l-75.17-11.09-33.64-69.21Z" />
|
|
10
10
|
</svg>
|
package/app/public/logotype.svg
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 135 135">
|
|
2
2
|
<defs>
|
|
3
3
|
<linearGradient id="gradient" x1="19.77" y1="115.23" x2="115.23" y2="19.77" gradientUnits="userSpaceOnUse">
|
|
4
|
-
<stop offset="0" stop-color="#
|
|
5
|
-
<stop offset="1" stop-color="#
|
|
4
|
+
<stop offset="0" stop-color="#4aa44c"/>
|
|
5
|
+
<stop offset="1" stop-color="#1278b9"/>
|
|
6
6
|
<animateTransform
|
|
7
7
|
attributeName="gradientTransform"
|
|
8
8
|
type="rotate"
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
// Instant color theme setup
|
|
2
|
-
const theme = localStorage.getItem('theme') ?? 'auto';
|
|
3
|
-
const binaryTheme =
|
|
4
|
-
theme === 'auto'
|
|
5
|
-
? window.matchMedia('(prefers-color-scheme: dark)').matches
|
|
6
|
-
? 'dark'
|
|
7
|
-
: 'light'
|
|
8
|
-
: theme;
|
|
9
|
-
document.documentElement.setAttribute('data-theme', binaryTheme);
|
|
1
|
+
// Instant color theme setup
|
|
2
|
+
const theme = localStorage.getItem('theme') ?? 'auto';
|
|
3
|
+
const binaryTheme =
|
|
4
|
+
theme === 'auto'
|
|
5
|
+
? window.matchMedia('(prefers-color-scheme: dark)').matches
|
|
6
|
+
? 'dark'
|
|
7
|
+
: 'light'
|
|
8
|
+
: theme;
|
|
9
|
+
document.documentElement.setAttribute('data-theme', binaryTheme);
|
|
@@ -1,59 +1,59 @@
|
|
|
1
|
-
// TODO: Push this shit into <SiteAside /> or make composable or make something...
|
|
2
|
-
|
|
3
|
-
export enum AsideType {
|
|
4
|
-
Major = 'major',
|
|
5
|
-
Minor = 'minor',
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export const switchVisible = ref<boolean>(true);
|
|
9
|
-
export const forcedAside = ref<AsideType>();
|
|
10
|
-
|
|
11
|
-
export const clickTargets: {
|
|
12
|
-
major: HTMLElement[];
|
|
13
|
-
minor: HTMLElement[];
|
|
14
|
-
} = {
|
|
15
|
-
major: [],
|
|
16
|
-
minor: [],
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
if (import.meta.client) {
|
|
20
|
-
//
|
|
21
|
-
// Switch visibility logic
|
|
22
|
-
//
|
|
23
|
-
|
|
24
|
-
let lastY = window.scrollY;
|
|
25
|
-
let sumDelta = 0;
|
|
26
|
-
let scrollTimeout: any;
|
|
27
|
-
|
|
28
|
-
window.addEventListener('scroll', () => {
|
|
29
|
-
const currentY = window.scrollY;
|
|
30
|
-
const delta = currentY - lastY;
|
|
31
|
-
|
|
32
|
-
sumDelta += delta;
|
|
33
|
-
|
|
34
|
-
switchVisible.value = sumDelta <= -1;
|
|
35
|
-
|
|
36
|
-
lastY = currentY;
|
|
37
|
-
|
|
38
|
-
clearTimeout(scrollTimeout);
|
|
39
|
-
scrollTimeout = setTimeout(() => {
|
|
40
|
-
sumDelta = 0;
|
|
41
|
-
}, 200);
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
//
|
|
45
|
-
// Unpin forced asides when click outside logic
|
|
46
|
-
//
|
|
47
|
-
|
|
48
|
-
window.addEventListener('click', (e) => {
|
|
49
|
-
if (forcedAside.value) {
|
|
50
|
-
const toIgnoreTargets = clickTargets[forcedAside.value]; // Ignore currently pinned aside elements
|
|
51
|
-
|
|
52
|
-
for (const target of toIgnoreTargets)
|
|
53
|
-
if (target.contains(e.target as Element)) return;
|
|
54
|
-
|
|
55
|
-
forcedAside.value = undefined;
|
|
56
|
-
switchVisible.value = true;
|
|
57
|
-
}
|
|
58
|
-
});
|
|
59
|
-
}
|
|
1
|
+
// TODO: Push this shit into <SiteAside /> or make composable or make something...
|
|
2
|
+
|
|
3
|
+
export enum AsideType {
|
|
4
|
+
Major = 'major',
|
|
5
|
+
Minor = 'minor',
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export const switchVisible = ref<boolean>(true);
|
|
9
|
+
export const forcedAside = ref<AsideType>();
|
|
10
|
+
|
|
11
|
+
export const clickTargets: {
|
|
12
|
+
major: HTMLElement[];
|
|
13
|
+
minor: HTMLElement[];
|
|
14
|
+
} = {
|
|
15
|
+
major: [],
|
|
16
|
+
minor: [],
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
if (import.meta.client) {
|
|
20
|
+
//
|
|
21
|
+
// Switch visibility logic
|
|
22
|
+
//
|
|
23
|
+
|
|
24
|
+
let lastY = window.scrollY;
|
|
25
|
+
let sumDelta = 0;
|
|
26
|
+
let scrollTimeout: any;
|
|
27
|
+
|
|
28
|
+
window.addEventListener('scroll', () => {
|
|
29
|
+
const currentY = window.scrollY;
|
|
30
|
+
const delta = currentY - lastY;
|
|
31
|
+
|
|
32
|
+
sumDelta += delta;
|
|
33
|
+
|
|
34
|
+
switchVisible.value = sumDelta <= -1;
|
|
35
|
+
|
|
36
|
+
lastY = currentY;
|
|
37
|
+
|
|
38
|
+
clearTimeout(scrollTimeout);
|
|
39
|
+
scrollTimeout = setTimeout(() => {
|
|
40
|
+
sumDelta = 0;
|
|
41
|
+
}, 200);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
//
|
|
45
|
+
// Unpin forced asides when click outside logic
|
|
46
|
+
//
|
|
47
|
+
|
|
48
|
+
window.addEventListener('click', (e) => {
|
|
49
|
+
if (forcedAside.value) {
|
|
50
|
+
const toIgnoreTargets = clickTargets[forcedAside.value]; // Ignore currently pinned aside elements
|
|
51
|
+
|
|
52
|
+
for (const target of toIgnoreTargets)
|
|
53
|
+
if (target.contains(e.target as Element)) return;
|
|
54
|
+
|
|
55
|
+
forcedAside.value = undefined;
|
|
56
|
+
switchVisible.value = true;
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
import type { InjectionKey, ShallowRef } from 'vue';
|
|
2
|
-
import type { FrontNav } from '@shared/frontNav';
|
|
3
|
-
|
|
4
|
-
export const insideNavBook = ref(false);
|
|
5
|
-
export const navBookId = ref<string>();
|
|
6
|
-
|
|
7
|
-
export const navBookVisible = computed(() => {
|
|
8
|
-
return insideNavBook.value && navBookId.value;
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
type AsideMajorNav = {
|
|
12
|
-
booksIds: string[];
|
|
13
|
-
globalNav: FrontNav;
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
export function getAsideMajorNavPayload() {
|
|
17
|
-
const key = 'aside-major-nav';
|
|
18
|
-
const nuxtApp = useNuxtApp();
|
|
19
|
-
return (nuxtApp.static.data[key] ||= nuxtApp.payload.data[key] ||=
|
|
20
|
-
{}) as AsideMajorNav;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export type NavStateValue = ShallowRef<null | 'active' | 'activePart'>;
|
|
24
|
-
export type NavState = { [contentId: string]: NavStateValue };
|
|
25
|
-
|
|
26
|
-
export const navStateKey = Symbol() as InjectionKey<ShallowRef<NavState>>;
|
|
1
|
+
import type { InjectionKey, ShallowRef } from 'vue';
|
|
2
|
+
import type { FrontNav } from '@shared/frontNav';
|
|
3
|
+
|
|
4
|
+
export const insideNavBook = ref(false);
|
|
5
|
+
export const navBookId = ref<string>();
|
|
6
|
+
|
|
7
|
+
export const navBookVisible = computed(() => {
|
|
8
|
+
return insideNavBook.value && navBookId.value;
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
type AsideMajorNav = {
|
|
12
|
+
booksIds: string[];
|
|
13
|
+
globalNav: FrontNav;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export function getAsideMajorNavPayload() {
|
|
17
|
+
const key = 'aside-major-nav';
|
|
18
|
+
const nuxtApp = useNuxtApp();
|
|
19
|
+
return (nuxtApp.static.data[key] ||= nuxtApp.payload.data[key] ||=
|
|
20
|
+
{}) as AsideMajorNav;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export type NavStateValue = ShallowRef<null | 'active' | 'activePart'>;
|
|
24
|
+
export type NavState = { [contentId: string]: NavStateValue };
|
|
25
|
+
|
|
26
|
+
export const navStateKey = Symbol() as InjectionKey<ShallowRef<NavState>>;
|
|
@@ -1,37 +1,37 @@
|
|
|
1
|
-
import type { InjectionKey, ShallowRef } from 'vue';
|
|
2
|
-
import type {
|
|
3
|
-
AsideMinorData,
|
|
4
|
-
AsideMinorNews,
|
|
5
|
-
AsideMinorTopic,
|
|
6
|
-
AsideMinorType,
|
|
7
|
-
} from '@shared/asideMinor';
|
|
8
|
-
|
|
9
|
-
export const asideMinorKey = Symbol() as InjectionKey<
|
|
10
|
-
ShallowRef<AsideMinorData>
|
|
11
|
-
>;
|
|
12
|
-
|
|
13
|
-
export function injectAsideData<T extends AsideMinorData>() {
|
|
14
|
-
return inject(asideMinorKey) as ShallowRef<T>;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
// export function injectTopicData(): Ref<AsideMinorTopic>
|
|
18
|
-
// {
|
|
19
|
-
// const dataRef = inject(asideMinorKey);
|
|
20
|
-
// return createTypeSafeDataComputed(dataRef, 'topic') as any;
|
|
21
|
-
// }
|
|
22
|
-
|
|
23
|
-
// export function injectNewsData(): Ref<AsideMinorNews>
|
|
24
|
-
// {
|
|
25
|
-
// const dataRef = inject(asideMinorKey);
|
|
26
|
-
// return createTypeSafeDataComputed(dataRef, 'news') as any;
|
|
27
|
-
// }
|
|
28
|
-
|
|
29
|
-
// function createTypeSafeDataComputed(dataRef: Ref<AsideMinorData>, targetType: AsideMinorType)
|
|
30
|
-
// {
|
|
31
|
-
// return computed(() => {
|
|
32
|
-
// if (dataRef.value.type !== targetType)
|
|
33
|
-
// throw new Error(`Aside minor data type mismatch! Expected "${targetType}", got "${dataRef.value.type}"!`);
|
|
34
|
-
|
|
35
|
-
// return dataRef.value;
|
|
36
|
-
// });
|
|
37
|
-
// }
|
|
1
|
+
import type { InjectionKey, ShallowRef } from 'vue';
|
|
2
|
+
import type {
|
|
3
|
+
AsideMinorData,
|
|
4
|
+
AsideMinorNews,
|
|
5
|
+
AsideMinorTopic,
|
|
6
|
+
AsideMinorType,
|
|
7
|
+
} from '@shared/asideMinor';
|
|
8
|
+
|
|
9
|
+
export const asideMinorKey = Symbol() as InjectionKey<
|
|
10
|
+
ShallowRef<AsideMinorData>
|
|
11
|
+
>;
|
|
12
|
+
|
|
13
|
+
export function injectAsideData<T extends AsideMinorData>() {
|
|
14
|
+
return inject(asideMinorKey) as ShallowRef<T>;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// export function injectTopicData(): Ref<AsideMinorTopic>
|
|
18
|
+
// {
|
|
19
|
+
// const dataRef = inject(asideMinorKey);
|
|
20
|
+
// return createTypeSafeDataComputed(dataRef, 'topic') as any;
|
|
21
|
+
// }
|
|
22
|
+
|
|
23
|
+
// export function injectNewsData(): Ref<AsideMinorNews>
|
|
24
|
+
// {
|
|
25
|
+
// const dataRef = inject(asideMinorKey);
|
|
26
|
+
// return createTypeSafeDataComputed(dataRef, 'news') as any;
|
|
27
|
+
// }
|
|
28
|
+
|
|
29
|
+
// function createTypeSafeDataComputed(dataRef: Ref<AsideMinorData>, targetType: AsideMinorType)
|
|
30
|
+
// {
|
|
31
|
+
// return computed(() => {
|
|
32
|
+
// if (dataRef.value.type !== targetType)
|
|
33
|
+
// throw new Error(`Aside minor data type mismatch! Expected "${targetType}", got "${dataRef.value.type}"!`);
|
|
34
|
+
|
|
35
|
+
// return dataRef.value;
|
|
36
|
+
// });
|
|
37
|
+
// }
|
package/app/scripts/flag.ts
CHANGED
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
import type { MyIconName } from '#my-icons';
|
|
2
|
-
import type { ContentFlag } from 'erudit-cog/schema';
|
|
3
|
-
|
|
4
|
-
interface FlagData {
|
|
5
|
-
icon: MyIconName;
|
|
6
|
-
title: EruditPhraseId;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export const flagsData: Record<ContentFlag, FlagData> = {
|
|
10
|
-
//
|
|
11
|
-
// Global Content Flags
|
|
12
|
-
//
|
|
13
|
-
|
|
14
|
-
dev: {
|
|
15
|
-
icon: 'construction',
|
|
16
|
-
title: 'flag_dev',
|
|
17
|
-
},
|
|
18
|
-
|
|
19
|
-
advanced: {
|
|
20
|
-
icon: 'asterisk',
|
|
21
|
-
title: 'flag_advanced',
|
|
22
|
-
},
|
|
23
|
-
|
|
24
|
-
secondary: {
|
|
25
|
-
icon: 'puzzle',
|
|
26
|
-
title: 'flag_secondary',
|
|
27
|
-
},
|
|
28
|
-
};
|
|
1
|
+
import type { MyIconName } from '#my-icons';
|
|
2
|
+
import type { ContentFlag } from '@erudit-js/cog/schema';
|
|
3
|
+
|
|
4
|
+
interface FlagData {
|
|
5
|
+
icon: MyIconName;
|
|
6
|
+
title: EruditPhraseId;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const flagsData: Record<ContentFlag, FlagData> = {
|
|
10
|
+
//
|
|
11
|
+
// Global Content Flags
|
|
12
|
+
//
|
|
13
|
+
|
|
14
|
+
dev: {
|
|
15
|
+
icon: 'construction',
|
|
16
|
+
title: 'flag_dev',
|
|
17
|
+
},
|
|
18
|
+
|
|
19
|
+
advanced: {
|
|
20
|
+
icon: 'asterisk',
|
|
21
|
+
title: 'flag_advanced',
|
|
22
|
+
},
|
|
23
|
+
|
|
24
|
+
secondary: {
|
|
25
|
+
icon: 'puzzle',
|
|
26
|
+
title: 'flag_secondary',
|
|
27
|
+
},
|
|
28
|
+
};
|
package/app/scripts/og.ts
CHANGED
|
@@ -1,27 +1,28 @@
|
|
|
1
|
-
import eruditConfig from '#erudit/config';
|
|
2
|
-
import type { ImageData } from '@erudit/shared/image';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
{ name: 'og:image:
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
1
|
+
import eruditConfig from '#erudit/config';
|
|
2
|
+
import type { ImageData } from '@erudit/shared/image';
|
|
3
|
+
import { normalizeUrl } from '@erudit/utils/url';
|
|
4
|
+
|
|
5
|
+
export const defaultOgImage = eruditConfig.seo?.defaultOgImage || {
|
|
6
|
+
src: eruditAsset('og-default.png'),
|
|
7
|
+
width: 300,
|
|
8
|
+
height: 300,
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export function createOgImageTags(siteUrl: string, data: ImageData | string) {
|
|
12
|
+
const tags = [];
|
|
13
|
+
const isImage = typeof data !== 'string';
|
|
14
|
+
|
|
15
|
+
tags.push({
|
|
16
|
+
name: 'og:image',
|
|
17
|
+
content: normalizeUrl(siteUrl + (isImage ? data.src : data)),
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
if (isImage) {
|
|
21
|
+
tags.push(
|
|
22
|
+
{ name: 'og:image:width', content: data.width },
|
|
23
|
+
{ name: 'og:image:height', content: data.height },
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return tags;
|
|
28
|
+
}
|