erudit 3.0.0-dev.17 → 3.0.0-dev.19

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 (250) hide show
  1. package/app/app.vue +193 -191
  2. package/app/assets/icons/graduation.svg +3 -0
  3. package/app/components/Loading.vue +23 -23
  4. package/app/components/SiteAside.vue +393 -393
  5. package/app/components/SiteMain.vue +32 -32
  6. package/app/components/aside/AsideListItem.vue +74 -74
  7. package/app/components/aside/AsideMajor.vue +56 -56
  8. package/app/components/aside/AsideMinor.vue +97 -73
  9. package/app/components/aside/major/PaneContentScroll.vue +23 -23
  10. package/app/components/aside/major/PaneSwitch.vue +54 -54
  11. package/app/components/aside/major/PaneSwitchButton.vue +63 -63
  12. package/app/components/aside/major/SiteInfo.vue +85 -85
  13. package/app/components/aside/major/panes/Language.vue +79 -79
  14. package/app/components/aside/major/panes/Pages.vue +31 -34
  15. package/app/components/aside/major/panes/Search.vue +11 -11
  16. package/app/components/aside/major/panes/nav/Nav.vue +92 -92
  17. package/app/components/aside/major/panes/nav/NavBook.vue +95 -95
  18. package/app/components/aside/major/panes/nav/NavBookLoading.vue +24 -24
  19. package/app/components/aside/major/panes/nav/NavGlobal.vue +16 -16
  20. package/app/components/aside/major/panes/nav/fnav/FNav.vue +105 -105
  21. package/app/components/aside/major/panes/nav/fnav/FNavBook.vue +32 -32
  22. package/app/components/aside/major/panes/nav/fnav/FNavFlags.vue +40 -40
  23. package/app/components/aside/major/panes/nav/fnav/FNavFolder.vue +60 -60
  24. package/app/components/aside/major/panes/nav/fnav/FNavItem.vue +34 -34
  25. package/app/components/aside/major/panes/nav/fnav/FNavSeparator.vue +80 -80
  26. package/app/components/aside/major/panes/nav/fnav/FNavTopic.vue +24 -24
  27. package/app/components/aside/major/panes/other/ItemContent.vue +29 -29
  28. package/app/components/aside/major/panes/other/ItemGenerator.vue +13 -13
  29. package/app/components/aside/major/panes/other/ItemTheme.vue +54 -54
  30. package/app/components/aside/major/panes/other/Other.vue +16 -16
  31. package/app/components/aside/minor/{Contribute.vue → AsideMinorContribute.vue} +175 -145
  32. package/app/components/aside/minor/AsideMinorNews.vue +11 -11
  33. package/app/components/aside/minor/AsideMinorPane.vue +15 -15
  34. package/app/components/aside/minor/AsideMinorTopLink.vue +67 -67
  35. package/app/components/aside/minor/content/AsideMinorContent.vue +89 -92
  36. package/app/components/aside/minor/contributor/AsideMinorContributor.vue +78 -0
  37. package/app/components/aside/minor/contributor/BookContribution.vue +64 -0
  38. package/app/components/aside/minor/topic/AsideMinorTopic.vue +29 -32
  39. package/app/components/aside/minor/topic/TopicContributors.vue +177 -177
  40. package/app/components/aside/minor/topic/TopicNav.vue +49 -49
  41. package/app/components/aside/minor/topic/TopicToc.vue +213 -214
  42. package/app/components/aside/minor/topic/TopicTocItem.vue +32 -32
  43. package/app/components/aside/utils/AsideOverlayPane.vue +40 -40
  44. package/app/components/bitran/BitranContent.vue +90 -91
  45. package/app/components/bitran/RenderWrapper.vue +10 -10
  46. package/app/components/contributor/ContributorAvatar.vue +45 -45
  47. package/app/components/contributor/ContributorListItem.vue +35 -35
  48. package/app/components/main/MainBitranContent.vue +41 -0
  49. package/app/components/main/{utils/Breadcrumb.vue → MainBreadcrumb.vue} +67 -74
  50. package/app/components/main/MainDescription.vue +24 -0
  51. package/app/components/main/{utils/ContentTitle.vue → MainTitle.vue} +72 -63
  52. package/app/components/main/content/ContentBreadcrumb.vue +28 -0
  53. package/app/components/main/{utils → content}/ContentDecoration.vue +29 -29
  54. package/app/components/main/{utils → content}/ContentPopover.vue +188 -188
  55. package/app/components/main/{utils → content}/ContentPopovers.vue +111 -111
  56. package/app/components/main/{utils → content}/ContentReferences.vue +70 -70
  57. package/app/components/main/{utils → content}/ContentSection.vue +45 -45
  58. package/app/components/main/{utils → content}/reference/ReferenceGroup.vue +38 -38
  59. package/app/components/main/{utils → content}/reference/ReferenceItem.vue +70 -70
  60. package/app/components/main/{utils → content}/reference/ReferenceSource.vue +120 -120
  61. package/app/components/main/topic/MainTopic.vue +83 -88
  62. package/app/components/main/topic/TopicPartSwitch.vue +124 -118
  63. package/app/components/preview/Preview.vue +186 -186
  64. package/app/components/preview/PreviewDisplay.vue +139 -139
  65. package/app/components/preview/PreviewFooterAction.vue +73 -73
  66. package/app/components/preview/PreviewLoading.vue +14 -14
  67. package/app/components/preview/PreviewScreen.vue +141 -141
  68. package/app/components/preview/display/Alert.vue +50 -50
  69. package/app/components/preview/display/Custom.vue +18 -18
  70. package/app/components/preview/display/GenericLink.vue +48 -48
  71. package/app/components/preview/display/PageLink.vue +22 -22
  72. package/app/components/preview/display/Unique.vue +46 -55
  73. package/app/components/transition/Fade.vue +19 -19
  74. package/app/components/tree/TreeContainer.vue +11 -11
  75. package/app/components/tree/TreeItem.vue +89 -89
  76. package/app/composables/adsAllowed.ts +11 -0
  77. package/app/composables/bitran.ts +108 -108
  78. package/app/composables/bitranLocation.ts +7 -7
  79. package/app/composables/contentData.ts +38 -38
  80. package/app/composables/contentPage.ts +168 -158
  81. package/app/composables/contentRoute.ts +45 -45
  82. package/app/composables/darkMagic.ts +24 -24
  83. package/app/composables/externalApi.ts +69 -69
  84. package/app/composables/favicon.ts +8 -8
  85. package/app/composables/formatText.ts +99 -99
  86. package/app/composables/majorPane.ts +61 -60
  87. package/app/composables/phrases.ts +77 -65
  88. package/app/composables/theme.ts +29 -29
  89. package/app/composables/url.ts +33 -33
  90. package/app/pages/_test/preview.vue +110 -110
  91. package/app/pages/article/[...articleId].vue +3 -3
  92. package/app/pages/book/[...bookId].vue +42 -47
  93. package/app/pages/contributor/[contributorId].vue +225 -0
  94. package/app/pages/contributors.vue +183 -0
  95. package/app/pages/group/[...groupId].vue +58 -66
  96. package/app/pages/index.vue +32 -32
  97. package/app/pages/practice/[...practice].vue +3 -3
  98. package/app/pages/summary/[...summaryId].vue +3 -3
  99. package/app/plugins/analytics.ts +8 -0
  100. package/app/plugins/prerender.server.ts +22 -22
  101. package/app/scripts/_immediate.js +9 -9
  102. package/app/scripts/aside/index.ts +59 -59
  103. package/app/scripts/aside/major/nav.ts +26 -26
  104. package/app/scripts/aside/minor/state.ts +37 -37
  105. package/app/scripts/aside/minor/topic.ts +3 -3
  106. package/app/scripts/flag.ts +28 -28
  107. package/app/scripts/og.ts +27 -27
  108. package/app/scripts/preview/build.ts +76 -76
  109. package/app/scripts/preview/data/alert.ts +19 -19
  110. package/app/scripts/preview/data/custom.ts +8 -8
  111. package/app/scripts/preview/data/genericLink.ts +24 -24
  112. package/app/scripts/preview/data/pageLink.ts +23 -23
  113. package/app/scripts/preview/data/unique.ts +69 -72
  114. package/app/scripts/preview/data.ts +24 -24
  115. package/app/scripts/preview/display.ts +37 -37
  116. package/app/scripts/preview/footer.ts +9 -9
  117. package/app/scripts/preview/request.ts +51 -51
  118. package/app/scripts/preview/state.ts +63 -63
  119. package/app/styles/_immediate.css +7 -7
  120. package/app/styles/_util.scss +43 -43
  121. package/app/styles/_utils.scss +44 -44
  122. package/app/styles/app.scss +91 -91
  123. package/app/styles/def/_bp.scss +27 -27
  124. package/app/styles/def/_size.scss +7 -7
  125. package/app/styles/def/_z.scss +5 -5
  126. package/app/styles/normalize.scss +49 -49
  127. package/app/styles/partials/_darkMagic.scss +5 -5
  128. package/app/styles/partials/_fnav.scss +15 -15
  129. package/app/styles/partials/_preview.scss +5 -5
  130. package/bin/erudit.mjs +2 -2
  131. package/const.ts +4 -4
  132. package/globalPath.ts +21 -21
  133. package/globals/bitran.ts +1 -1
  134. package/globals/content.ts +27 -27
  135. package/globals/contributor.ts +5 -5
  136. package/globals/erudit.ts +5 -5
  137. package/globals/register.ts +18 -18
  138. package/languages/en.ts +103 -94
  139. package/languages/ru.ts +107 -98
  140. package/module/bitran.ts +66 -66
  141. package/module/config.ts +35 -35
  142. package/module/imports.ts +67 -67
  143. package/module/index.ts +47 -47
  144. package/module/logger.ts +10 -10
  145. package/module/paths.ts +22 -22
  146. package/module/restart.ts +61 -61
  147. package/nuxt.config.ts +131 -131
  148. package/package.json +5 -5
  149. package/server/api/aside/major/nav/bookIds.ts +5 -5
  150. package/server/api/aside/major/nav/bookNav/[...bookId].ts +17 -20
  151. package/server/api/aside/major/nav/global.ts +7 -7
  152. package/server/api/aside/minor/book/[...bookId].ts +18 -0
  153. package/server/api/aside/minor/contributor/[contributorId].ts +18 -0
  154. package/server/api/aside/minor/group/[...groupId].ts +18 -0
  155. package/server/api/aside/minor/news.ts +7 -7
  156. package/server/api/aside/minor/topic.ts +36 -0
  157. package/server/api/bitran/content/[...location].ts +13 -10
  158. package/server/api/bitran/toc/[...location].ts +9 -9
  159. package/server/api/content/data.ts +75 -75
  160. package/server/api/contributor/count.ts +6 -6
  161. package/server/api/contributor/list.ts +44 -0
  162. package/server/api/contributor/page/[contributorId].ts +14 -0
  163. package/server/api/fake/content.ts +11 -11
  164. package/server/api/fake/shared/languages.ts +12 -12
  165. package/server/api/language/functions.ts +12 -12
  166. package/server/api/language/phrase/[phraseId].ts +19 -19
  167. package/server/api/language/phraseIds.ts +8 -8
  168. package/server/api/prerender.ts +19 -120
  169. package/server/api/preview/page/[...parts].ts +78 -78
  170. package/server/api/preview/unique/[...location].ts +48 -61
  171. package/server/plugin/bitran/content.ts +252 -190
  172. package/server/plugin/bitran/elements/include.ts +229 -229
  173. package/server/plugin/bitran/location.ts +43 -39
  174. package/server/plugin/bitran/toc.ts +94 -94
  175. package/server/plugin/bitran/transpiler.ts +18 -18
  176. package/server/plugin/build/close.ts +12 -12
  177. package/server/plugin/build/jobs/content/builderArgs.ts +8 -8
  178. package/server/plugin/build/jobs/content/generic.ts +191 -191
  179. package/server/plugin/build/jobs/content/parse.ts +113 -113
  180. package/server/plugin/build/jobs/content/path.ts +6 -6
  181. package/server/plugin/build/jobs/content/type/book.ts +9 -9
  182. package/server/plugin/build/jobs/content/type/group.ts +37 -37
  183. package/server/plugin/build/jobs/content/type/topic.ts +36 -36
  184. package/server/plugin/build/jobs/contributors.ts +69 -66
  185. package/server/plugin/build/jobs/language.ts +36 -36
  186. package/server/plugin/build/jobs/nav.ts +345 -345
  187. package/server/plugin/build/process.ts +32 -32
  188. package/server/plugin/build/rebuild.ts +66 -66
  189. package/server/plugin/build/setup.ts +19 -19
  190. package/server/plugin/content/context.ts +119 -119
  191. package/server/plugin/db/entities/Book.ts +7 -7
  192. package/server/plugin/db/entities/Content.ts +45 -45
  193. package/server/plugin/db/entities/Contribution.ts +10 -10
  194. package/server/plugin/db/entities/Contributor.ts +25 -16
  195. package/server/plugin/db/entities/File.ts +10 -10
  196. package/server/plugin/db/entities/Group.ts +14 -14
  197. package/server/plugin/db/entities/Hash.ts +15 -15
  198. package/server/plugin/db/entities/Topic.ts +20 -20
  199. package/server/plugin/db/entities/Unique.ts +21 -21
  200. package/server/plugin/db/reset.ts +12 -12
  201. package/server/plugin/db/setup.ts +49 -49
  202. package/server/plugin/global.ts +16 -16
  203. package/server/plugin/importer.ts +16 -16
  204. package/server/plugin/index.ts +9 -9
  205. package/server/plugin/logger.ts +23 -23
  206. package/server/plugin/nav/node.ts +27 -27
  207. package/server/plugin/nav/utils.ts +179 -175
  208. package/server/plugin/repository/asideMinor.ts +51 -0
  209. package/server/plugin/repository/book.ts +39 -21
  210. package/server/plugin/repository/content.ts +240 -240
  211. package/server/plugin/repository/contentId.ts +40 -40
  212. package/server/plugin/repository/contributor.ts +98 -8
  213. package/server/plugin/repository/file.ts +10 -10
  214. package/server/plugin/repository/frontNav.ts +145 -145
  215. package/server/plugin/repository/topic.ts +35 -35
  216. package/server/tsconfig.json +9 -9
  217. package/shared/aside/minor.ts +55 -51
  218. package/shared/asset.ts +22 -22
  219. package/shared/bitran/content.ts +9 -0
  220. package/shared/bitran/contentId.ts +56 -56
  221. package/shared/bitran/toc.ts +8 -8
  222. package/shared/breadcrumb.ts +7 -0
  223. package/shared/content/bookId.ts +12 -12
  224. package/shared/content/context.ts +9 -9
  225. package/shared/content/data/base.ts +32 -32
  226. package/shared/content/data/index.ts +5 -5
  227. package/shared/content/data/type/book.ts +5 -5
  228. package/shared/content/data/type/group.ts +6 -6
  229. package/shared/content/data/type/topic.ts +11 -11
  230. package/shared/content/previousNext.ts +9 -9
  231. package/shared/contributor.ts +33 -5
  232. package/shared/frontNav.ts +41 -41
  233. package/shared/icons.ts +38 -38
  234. package/shared/image.ts +5 -5
  235. package/shared/link.ts +28 -28
  236. package/shared/popover.ts +8 -8
  237. package/shared/types/language.ts +79 -74
  238. package/shared/utils/objectsEqual.ts +4 -4
  239. package/shared/utils/stringColor.ts +9 -9
  240. package/test/contentId.test.ts +91 -91
  241. package/tsconfig.json +8 -8
  242. package/utils/contentPath.ts +67 -67
  243. package/utils/slash.ts +11 -11
  244. package/utils/stress.ts +9 -9
  245. package/app/components/aside/minor/AsideMinorContributor.vue +0 -5
  246. package/app/components/main/utils/ContentDescription.vue +0 -19
  247. package/app/composables/bitranContent.ts +0 -92
  248. package/app/pages/members.vue +0 -6
  249. package/server/api/aside/minor/path.ts +0 -82
  250. package/shared/bitran/stringContent.ts +0 -6
@@ -0,0 +1,225 @@
1
+ <script lang="ts" setup>
2
+ import eruditConfig from '#erudit/config';
3
+ import { type PageContributor } from '@shared/contributor';
4
+ import ContentSection from '@app/components/main/content/ContentSection.vue';
5
+
6
+ const route = useRoute();
7
+ const nuxtApp = useNuxtApp();
8
+ const contributor = shallowRef<PageContributor>(null as any);
9
+ const contributorColor = ref<string>('');
10
+ const resolved = computed(() => {
11
+ const title = (() => {
12
+ return contributor.value.displayName || contributor.value.contributorId;
13
+ })();
14
+
15
+ return {
16
+ title,
17
+ };
18
+ });
19
+
20
+ let requestCounter = 0;
21
+
22
+ function getPayloadCache() {
23
+ const payloadKey = 'contributor';
24
+ return (nuxtApp.static.data[payloadKey] ||= nuxtApp.payload.data[
25
+ payloadKey
26
+ ] ||=
27
+ {});
28
+ }
29
+
30
+ async function fetchContributorData(contributorId: string, requestId: number) {
31
+ const payloadCache = getPayloadCache();
32
+
33
+ if (!payloadCache[contributorId]) {
34
+ try {
35
+ const data = await $fetch(`/api/contributor/page/${contributorId}`);
36
+
37
+ if (requestId === requestCounter) {
38
+ payloadCache[contributorId] = data;
39
+ }
40
+ } catch (error) {
41
+ console.error(
42
+ `Error fetching contributor ${contributorId}:`,
43
+ error,
44
+ );
45
+ }
46
+ }
47
+
48
+ contributor.value = payloadCache[contributorId];
49
+ contributorColor.value = stringColor(contributor.value.contributorId);
50
+ }
51
+
52
+ await fetchContributorData(
53
+ route.params.contributorId as string,
54
+ ++requestCounter,
55
+ );
56
+
57
+ const phrase = await usePhrases(
58
+ 'contributors',
59
+ 'contributor',
60
+ 'contributor_description',
61
+ 'editor',
62
+ );
63
+
64
+ useHead({
65
+ title:
66
+ resolved.value.title +
67
+ ' | ' +
68
+ (contributor.value.isEditor ? phrase.editor : phrase.contributor) +
69
+ ' - ' +
70
+ (eruditConfig.seo?.title || eruditConfig.site?.title),
71
+ });
72
+
73
+ useSeoMeta({
74
+ ogTitle:
75
+ resolved.value.title +
76
+ ' | ' +
77
+ (contributor.value.isEditor ? phrase.editor : phrase.contributor) +
78
+ ' - ' +
79
+ (eruditConfig.seo?.title || eruditConfig.site?.title),
80
+ description: phrase.contributor_description(resolved.value.title),
81
+ });
82
+ </script>
83
+
84
+ <template>
85
+ <MainBreadcrumb
86
+ :items="[
87
+ {
88
+ title: phrase.contributors,
89
+ icon: 'users',
90
+ link: '/contributors',
91
+ },
92
+ ]"
93
+ />
94
+ <header
95
+ :class="$style.header"
96
+ :style="{ ['--contributorColor']: contributorColor }"
97
+ >
98
+ <div style="position: relative">
99
+ <ContributorAvatar
100
+ :class="$style.avatar"
101
+ :contributorId="contributor.contributorId"
102
+ :avatar="contributor.avatar"
103
+ />
104
+ <MyIcon
105
+ v-if="contributor.isEditor"
106
+ name="graduation"
107
+ :class="$style.editorIcon"
108
+ :title="phrase.editor"
109
+ />
110
+ </div>
111
+ <h1 :class="$style.name">
112
+ {{ resolved.title }}
113
+ </h1>
114
+ <div v-if="contributor.slogan" :class="$style.slogan">
115
+ {{ contributor.slogan }}
116
+ </div>
117
+ <div v-if="contributor.links" :class="$style.links">
118
+ <div v-for="(link, label) of contributor.links">
119
+ <a
120
+ :href="link"
121
+ target="_blank"
122
+ rel="noopener noreferrer"
123
+ :class="$style.link"
124
+ >
125
+ {{ label }}
126
+ </a>
127
+ </div>
128
+ </div>
129
+ </header>
130
+ <ContentSection v-if="contributor.hasDescription">
131
+ <MainBitranContent
132
+ :location="{ type: 'contributor', path: contributor.contributorId }"
133
+ />
134
+ </ContentSection>
135
+ </template>
136
+
137
+ <style lang="scss" module>
138
+ @use '$/def/bp';
139
+
140
+ .header {
141
+ display: flex;
142
+ flex-direction: column;
143
+ align-items: center;
144
+ gap: var(--gap);
145
+ padding-top: 20px;
146
+ padding-left: var(--gapBig);
147
+ padding-right: var(--gapBig);
148
+
149
+ .avatar {
150
+ --_avatarSize: 110px;
151
+ border: 2px solid var(--bgMain);
152
+ outline: 2px solid var(--contributorColor);
153
+ box-shadow: 0 0 100px 100px
154
+ color-mix(in srgb, var(--contributorColor), transparent 90%);
155
+ }
156
+
157
+ .editorIcon {
158
+ position: absolute;
159
+ right: 50%;
160
+ transform: translate(50%, -50%);
161
+ color: color-mix(in srgb, var(--text), var(--contributorColor) 50%);
162
+ font-size: 16px;
163
+ background: var(--bgMain);
164
+ padding: 4px;
165
+ border-radius: 50%;
166
+ outline: 2px solid var(--contributorColor);
167
+ cursor: help;
168
+ }
169
+
170
+ .name,
171
+ .slogan,
172
+ .links {
173
+ text-align: center;
174
+ }
175
+
176
+ .name {
177
+ padding-top: 6px;
178
+ line-height: 1.2;
179
+ font-size: 2em;
180
+ color: color-mix(in srgb, var(--textDeep), var(--contributorColor) 15%);
181
+ text-shadow: 2px 2px
182
+ color-mix(in srgb, var(--contributorColor), transparent 80%);
183
+
184
+ @include bp.below('mobile') {
185
+ font-size: 1.8em;
186
+ }
187
+ }
188
+
189
+ .slogan {
190
+ font-size: 1.2em;
191
+ font-weight: 600;
192
+ padding-bottom: 8px;
193
+ color: var(--textMuted);
194
+ }
195
+
196
+ .links {
197
+ display: flex;
198
+ gap: var(--gap);
199
+ justify-content: center;
200
+ flex-wrap: wrap;
201
+
202
+ .link {
203
+ line-height: 2;
204
+ font-size: 1em;
205
+ font-weight: 600;
206
+ color: color-mix(in srgb, var(--text), var(--contributorColor) 20%);
207
+ border: 1.5px solid
208
+ color-mix(in srgb, var(--contributorColor), transparent 50%);
209
+ border-radius: 3px;
210
+ padding: 4px 10px;
211
+ text-decoration: none;
212
+
213
+ @include transition(background);
214
+
215
+ &:hover {
216
+ background: color-mix(
217
+ in srgb,
218
+ var(--contributorColor),
219
+ transparent 90%
220
+ );
221
+ }
222
+ }
223
+ }
224
+ }
225
+ </style>
@@ -0,0 +1,183 @@
1
+ <script lang="ts" setup>
2
+ import eruditConfig from '#erudit/config';
3
+
4
+ const { data: contributorList } = await useFetch(`/api/contributor/list`, {
5
+ key: 'contributor-list',
6
+ });
7
+
8
+ const editorsNumber = computed(() => {
9
+ return contributorList.value?.filter((i) => i.isEditor)?.length ?? 0;
10
+ });
11
+
12
+ const phrase = await usePhrases(
13
+ 'contributors',
14
+ 'contributors_page_description',
15
+ 'contributors_page_invite',
16
+ 'contributions_explain',
17
+ 'editor',
18
+ );
19
+
20
+ useHead({
21
+ title:
22
+ phrase.contributors +
23
+ ' - ' +
24
+ (eruditConfig.seo?.title || eruditConfig.site?.title),
25
+ });
26
+
27
+ useSeoMeta({
28
+ title:
29
+ phrase.contributors +
30
+ ' - ' +
31
+ (eruditConfig.seo?.title || eruditConfig.site?.title),
32
+ description: phrase.contributors_page_description,
33
+ });
34
+
35
+ const fullDescription = (() => {
36
+ let _description = phrase.contributors_page_description;
37
+
38
+ if (eruditConfig.content?.howToImproveLink) {
39
+ _description +=
40
+ ' ' +
41
+ phrase.contributors_page_invite(
42
+ eruditConfig.content.howToImproveLink,
43
+ );
44
+ }
45
+
46
+ return _description;
47
+ })();
48
+ </script>
49
+
50
+ <template>
51
+ <MainTitle icon="users" :title="phrase.contributors" />
52
+ <MainDescription
53
+ :class="$style.pageDescription"
54
+ :html="true"
55
+ :description="fullDescription"
56
+ />
57
+ <section :class="$style.contributors">
58
+ <NuxtLink
59
+ :to="`/contributor/${contributor.contributorId}`"
60
+ :prefetch="false"
61
+ v-for="(contributor, i) of contributorList"
62
+ :class="$style.contributor"
63
+ :style="{
64
+ '--contributorColor': stringColor(contributor.contributorId),
65
+ }"
66
+ >
67
+ <ContributorAvatar
68
+ :contributorId="contributor.contributorId"
69
+ :avatar="contributor.avatar"
70
+ :class="$style.avatar"
71
+ />
72
+ <div :class="$style.info">
73
+ <div :class="$style.main">
74
+ <div :class="$style.position">
75
+ <template v-if="contributor.isEditor">
76
+ <MyIcon
77
+ :title="phrase.editor"
78
+ :class="$style.editor"
79
+ name="graduation"
80
+ />
81
+ </template>
82
+ <template v-else>
83
+ {{ i - editorsNumber + 1 }}.
84
+ </template>
85
+ </div>
86
+ <div :class="$style.name">
87
+ {{
88
+ contributor.displayName || contributor.contributorId
89
+ }}
90
+ </div>
91
+ </div>
92
+ <div :class="$style.contributions">
93
+ {{
94
+ phrase.contributions_explain(contributor.contributions)
95
+ }}
96
+ </div>
97
+ </div>
98
+ </NuxtLink>
99
+ </section>
100
+ </template>
101
+
102
+ <style lang="scss" module>
103
+ @use '$/def/bp';
104
+
105
+ .pageDescription a {
106
+ color: inherit;
107
+ text-decoration-style: dashed;
108
+ text-decoration-color: var(--textDimmed);
109
+
110
+ &:hover {
111
+ text-decoration-style: solid;
112
+ text-decoration-color: var(--text);
113
+ }
114
+ }
115
+
116
+ .contributors {
117
+ padding: var(--_pMainY) var(--_pMainX);
118
+ display: grid;
119
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
120
+ gap: var(--gap);
121
+
122
+ @include bp.below('mobile') {
123
+ padding: var(--_pMainY) 0;
124
+ gap: 0;
125
+ }
126
+
127
+ .contributor {
128
+ display: flex;
129
+ align-items: center;
130
+ gap: var(--gap);
131
+ padding: var(--gap);
132
+ border-radius: 5px;
133
+ text-decoration: none;
134
+ color: inherit;
135
+ @include transition(background);
136
+
137
+ &:hover {
138
+ background: var(--bgAccent);
139
+ }
140
+
141
+ @include bp.below('mobile') {
142
+ border-radius: 0;
143
+ }
144
+
145
+ .avatar {
146
+ --_avatarSize: 50px;
147
+ flex-shrink: 0;
148
+ box-shadow: 0 0 5px 5px
149
+ color-mix(in srgb, var(--contributorColor), transparent 85%);
150
+ }
151
+
152
+ .info {
153
+ display: flex;
154
+ flex-direction: column;
155
+
156
+ .main {
157
+ display: flex;
158
+ align-items: center;
159
+ gap: 5px;
160
+
161
+ .position {
162
+ font-size: 0.9em;
163
+ font-weight: 600;
164
+ color: var(--textMuted);
165
+
166
+ .editor {
167
+ cursor: help;
168
+ }
169
+ }
170
+
171
+ .name {
172
+ font-weight: 600;
173
+ }
174
+ }
175
+
176
+ .contributions {
177
+ color: var(--textMuted);
178
+ font-size: 0.85em;
179
+ }
180
+ }
181
+ }
182
+ }
183
+ </style>
@@ -1,66 +1,58 @@
1
- <script lang="ts" setup>
2
- import { NO_ALIASES } from '@erudit-js/cog/schema';
3
- import eruditConfig from '#erudit/config';
4
-
5
- import { type ContentGroupData } from '@shared/content/data/type/group';
6
- import { locationIcon } from '@erudit/shared/icons';
7
- import ContentDecoration from '@app/components/main/utils/ContentDecoration.vue';
8
- import Breadcrumb from '@app/components/main/utils/Breadcrumb.vue';
9
- import ContentTitle from '@app/components/main/utils/ContentTitle.vue';
10
- import ContentDescription from '@app/components/main/utils/ContentDescription.vue';
11
- import ContentPopovers from '@app/components/main/utils/ContentPopovers.vue';
12
- import ContentSection from '@app/components/main/utils/ContentSection.vue';
13
-
14
- const location = useBitranLocation();
15
-
16
- const groupData = await useContentData<ContentGroupData>();
17
- await useContentPage(groupData);
18
-
19
- const content = await useBitranContent(location);
20
- const phrase = await usePhrases('group');
21
- </script>
22
-
23
- <template>
24
- <ContentDecoration
25
- v-if="groupData.generic.decoration"
26
- :decoration="groupData.generic.decoration"
27
- />
28
-
29
- <Breadcrumb
30
- v-if="groupData.generic.context?.length > 1"
31
- :context="groupData.generic.context"
32
- />
33
-
34
- <ContentTitle
35
- :title="
36
- groupData.generic?.title ||
37
- groupData.generic.contentId.split('/').pop()!
38
- "
39
- :icon="locationIcon(location!)"
40
- :hint="phrase.group"
41
- />
42
-
43
- <ContentDescription
44
- v-if="groupData.generic?.description"
45
- :description="groupData.generic?.description"
46
- />
47
-
48
- <ContentPopovers :generic="groupData.generic" />
49
-
50
- <!-- TODO: List of materials in group -->
51
-
52
- <div style="clear: both"></div>
53
-
54
- <hr style="display: none" />
55
-
56
- <ContentSection>
57
- <BitranContent
58
- :content
59
- :context="{ location, aliases: NO_ALIASES() }"
60
- />
61
- </ContentSection>
62
-
63
- <ContentSection v-if="eruditConfig.ads?.bottom">
64
- <AdsBannerBottom />
65
- </ContentSection>
66
- </template>
1
+ <script lang="ts" setup>
2
+ import { type BitranLocation } from '@erudit-js/cog/schema';
3
+ import eruditConfig from '#erudit/config';
4
+
5
+ import { type ContentGroupData } from '@shared/content/data/type/group';
6
+ import { locationIcon } from '@erudit/shared/icons';
7
+
8
+ import ContentBreadcrumb from '@app/components/main/content/ContentBreadcrumb.vue';
9
+ import ContentDecoration from '@app/components/main/content/ContentDecoration.vue';
10
+ import ContentPopovers from '@app/components/main/content/ContentPopovers.vue';
11
+ import ContentSection from '@app/components/main/content/ContentSection.vue';
12
+
13
+ const location = useBitranLocation() as Ref<BitranLocation>;
14
+
15
+ const groupData = await useContentData<ContentGroupData>();
16
+ await useContentPage(groupData);
17
+
18
+ const phrase = await usePhrases('group');
19
+ </script>
20
+
21
+ <template>
22
+ <ContentDecoration
23
+ v-if="groupData.generic.decoration"
24
+ :decoration="groupData.generic.decoration"
25
+ />
26
+
27
+ <ContentBreadcrumb :context="groupData.generic.context" />
28
+
29
+ <MainTitle
30
+ :title="
31
+ groupData.generic?.title ||
32
+ groupData.generic.contentId.split('/').pop()!
33
+ "
34
+ :icon="locationIcon(location!)"
35
+ :hint="phrase.group"
36
+ />
37
+
38
+ <MainDescription
39
+ v-if="groupData.generic?.description"
40
+ :description="groupData.generic?.description"
41
+ />
42
+
43
+ <ContentPopovers :generic="groupData.generic" />
44
+
45
+ <!-- TODO: List of materials in group -->
46
+
47
+ <div style="clear: both"></div>
48
+
49
+ <hr style="display: none" />
50
+
51
+ <ContentSection>
52
+ <MainBitranContent :location />
53
+ </ContentSection>
54
+
55
+ <ContentSection v-if="adsAllowed() && eruditConfig.ads?.bottom">
56
+ <AdsBannerBottom />
57
+ </ContentSection>
58
+ </template>
@@ -1,32 +1,32 @@
1
- <script lang="ts" setup>
2
- import eruditConfig from '#erudit/config';
3
-
4
- const phrase = await usePhrases('seo_index_title', 'seo_index_description');
5
-
6
- const seoTitle =
7
- eruditConfig.seo?.indexTitle ||
8
- eruditConfig.seo?.title ||
9
- phrase.seo_index_title;
10
- const seoDescription =
11
- eruditConfig.seo?.indexDescription || phrase.seo_index_description;
12
-
13
- useSeoMeta({
14
- title: seoTitle,
15
- ogTitle: seoTitle,
16
- description: seoDescription,
17
- ogDescription: seoDescription,
18
- });
19
- </script>
20
-
21
- <template>
22
- <div style="padding: var(--_pMainY) var(--_pMainX)">
23
- <h1>
24
- {{
25
- eruditConfig.seo?.title ||
26
- eruditConfig.site?.title ||
27
- phrase.seo_index_title
28
- }}
29
- </h1>
30
- <p>TODO</p>
31
- </div>
32
- </template>
1
+ <script lang="ts" setup>
2
+ import eruditConfig from '#erudit/config';
3
+
4
+ const phrase = await usePhrases('seo_index_title', 'seo_index_description');
5
+
6
+ const seoTitle =
7
+ eruditConfig.seo?.indexTitle ||
8
+ eruditConfig.seo?.title ||
9
+ phrase.seo_index_title;
10
+ const seoDescription =
11
+ eruditConfig.seo?.indexDescription || phrase.seo_index_description;
12
+
13
+ useSeoMeta({
14
+ title: seoTitle,
15
+ ogTitle: seoTitle,
16
+ description: seoDescription,
17
+ ogDescription: seoDescription,
18
+ });
19
+ </script>
20
+
21
+ <template>
22
+ <div style="padding: var(--_pMainY) var(--_pMainX)">
23
+ <h1>
24
+ {{
25
+ eruditConfig.seo?.title ||
26
+ eruditConfig.site?.title ||
27
+ phrase.seo_index_title
28
+ }}
29
+ </h1>
30
+ <p>TODO</p>
31
+ </div>
32
+ </template>
@@ -1,3 +1,3 @@
1
- <template>
2
- <MainTopic />
3
- </template>
1
+ <template>
2
+ <MainTopic />
3
+ </template>
@@ -1,3 +1,3 @@
1
- <template>
2
- <MainTopic />
3
- </template>
1
+ <template>
2
+ <MainTopic />
3
+ </template>
@@ -8,6 +8,14 @@ export default defineNuxtPlugin({
8
8
  return;
9
9
  }
10
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
+
11
19
  if (eruditConfig.analytics.yandex) {
12
20
  const yandex = eruditConfig.analytics.yandex;
13
21
 
@@ -1,22 +1,22 @@
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 routesToPrerender = await $fetch<string[]>('/api/prerender');
18
- _nuxt.runWithContext(() => prerenderRoutes(routesToPrerender));
19
-
20
- alreadyPrerendered = true;
21
- },
22
- });
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 routesToPrerender = await $fetch<string[]>('/api/prerender');
18
+ _nuxt.runWithContext(() => prerenderRoutes(routesToPrerender));
19
+
20
+ alreadyPrerendered = true;
21
+ },
22
+ });