erudit 3.0.0-dev.2 → 3.0.0-dev.20

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 (286) hide show
  1. package/app/app.vue +193 -172
  2. package/app/assets/icons/graduation.svg +3 -0
  3. package/app/components/Loading.vue +23 -23
  4. package/app/components/SiteAside.vue +393 -382
  5. package/app/components/SiteMain.vue +32 -35
  6. package/app/components/ads/Ads.vue +35 -0
  7. package/app/components/ads/AdsBannerAside.vue +61 -0
  8. package/app/components/ads/AdsBannerBottom.vue +22 -0
  9. package/app/components/ads/AdsProviderCustom.vue +35 -0
  10. package/app/components/ads/AdsProviderYandex.vue +54 -0
  11. package/app/components/ads/AdsReplacer.vue +73 -0
  12. package/app/components/aside/AsideListItem.vue +74 -74
  13. package/app/components/aside/AsideMajor.vue +56 -56
  14. package/app/components/aside/AsideMinor.vue +97 -71
  15. package/app/components/aside/major/PaneContentScroll.vue +23 -23
  16. package/app/components/aside/major/PaneSwitch.vue +54 -54
  17. package/app/components/aside/major/PaneSwitchButton.vue +63 -63
  18. package/app/components/aside/major/SiteInfo.vue +85 -85
  19. package/app/components/aside/major/panes/Language.vue +79 -79
  20. package/app/components/aside/major/panes/Pages.vue +31 -34
  21. package/app/components/aside/major/panes/Search.vue +11 -11
  22. package/app/components/aside/major/panes/nav/Nav.vue +92 -91
  23. package/app/components/aside/major/panes/nav/NavBook.vue +95 -86
  24. package/app/components/aside/major/panes/nav/NavBookLoading.vue +24 -24
  25. package/app/components/aside/major/panes/nav/NavGlobal.vue +16 -16
  26. package/app/components/aside/major/panes/nav/fnav/FNav.vue +105 -105
  27. package/app/components/aside/major/panes/nav/fnav/FNavBook.vue +32 -32
  28. package/app/components/aside/major/panes/nav/fnav/FNavFlags.vue +40 -40
  29. package/app/components/aside/major/panes/nav/fnav/FNavFolder.vue +60 -60
  30. package/app/components/aside/major/panes/nav/fnav/FNavItem.vue +34 -34
  31. package/app/components/aside/major/panes/nav/fnav/FNavSeparator.vue +80 -80
  32. package/app/components/aside/major/panes/nav/fnav/FNavTopic.vue +24 -24
  33. package/app/components/aside/major/panes/other/ItemContent.vue +29 -29
  34. package/app/components/aside/major/panes/other/ItemGenerator.vue +13 -15
  35. package/app/components/aside/major/panes/other/ItemTheme.vue +54 -54
  36. package/app/components/aside/major/panes/other/Other.vue +16 -16
  37. package/app/components/aside/minor/{Contribute.vue → AsideMinorContribute.vue} +175 -145
  38. package/app/components/aside/minor/AsideMinorNews.vue +11 -11
  39. package/app/components/aside/minor/AsideMinorPane.vue +15 -15
  40. package/app/components/aside/minor/AsideMinorTopLink.vue +67 -67
  41. package/app/components/aside/minor/content/AsideMinorContent.vue +89 -92
  42. package/app/components/aside/minor/contributor/AsideMinorContributor.vue +78 -0
  43. package/app/components/aside/minor/contributor/BookContribution.vue +64 -0
  44. package/app/components/aside/minor/topic/AsideMinorTopic.vue +29 -32
  45. package/app/components/aside/minor/topic/TopicContributors.vue +177 -177
  46. package/app/components/aside/minor/topic/TopicNav.vue +49 -49
  47. package/app/components/aside/minor/topic/TopicToc.vue +213 -203
  48. package/app/components/aside/minor/topic/TopicTocItem.vue +32 -31
  49. package/app/components/aside/utils/AsideOverlayPane.vue +40 -40
  50. package/app/components/bitran/BitranContent.vue +91 -63
  51. package/app/components/bitran/RenderWrapper.vue +10 -10
  52. package/app/components/contributor/ContributorAvatar.vue +45 -43
  53. package/app/components/contributor/ContributorListItem.vue +35 -35
  54. package/app/components/main/MainBitranContent.vue +47 -0
  55. package/app/components/main/{utils/Breadcrumb.vue → MainBreadcrumb.vue} +67 -75
  56. package/app/components/main/MainDescription.vue +24 -0
  57. package/app/components/main/MainTitle.vue +76 -0
  58. package/app/components/main/content/ContentBreadcrumb.vue +28 -0
  59. package/app/components/main/{utils → content}/ContentDecoration.vue +29 -29
  60. package/app/components/main/{utils → content}/ContentPopover.vue +188 -176
  61. package/app/components/main/{utils → content}/ContentPopovers.vue +111 -105
  62. package/app/components/main/{utils → content}/ContentReferences.vue +70 -70
  63. package/app/components/main/{utils → content}/ContentSection.vue +45 -45
  64. package/app/components/main/{utils → content}/reference/ReferenceGroup.vue +38 -38
  65. package/app/components/main/{utils → content}/reference/ReferenceItem.vue +70 -68
  66. package/app/components/main/{utils → content}/reference/ReferenceSource.vue +120 -116
  67. package/app/components/main/topic/MainTopic.vue +81 -79
  68. package/app/components/main/topic/TopicPartSwitch.vue +124 -118
  69. package/app/components/preview/Preview.vue +186 -177
  70. package/app/components/preview/PreviewDisplay.vue +139 -139
  71. package/app/components/preview/PreviewFooterAction.vue +73 -73
  72. package/app/components/preview/PreviewLoading.vue +14 -14
  73. package/app/components/preview/PreviewScreen.vue +141 -99
  74. package/app/components/preview/display/Alert.vue +50 -50
  75. package/app/components/preview/display/Custom.vue +18 -18
  76. package/app/components/preview/display/GenericLink.vue +48 -48
  77. package/app/components/preview/display/PageLink.vue +22 -20
  78. package/app/components/preview/display/Unique.vue +46 -49
  79. package/app/components/transition/Fade.vue +19 -19
  80. package/app/components/tree/TreeContainer.vue +11 -11
  81. package/app/components/tree/TreeItem.vue +89 -89
  82. package/app/composables/adsAllowed.ts +11 -0
  83. package/app/composables/bitran.ts +108 -127
  84. package/app/composables/bitranLocation.ts +7 -7
  85. package/app/composables/contentData.ts +38 -36
  86. package/app/composables/contentPage.ts +168 -156
  87. package/app/composables/contentRoute.ts +45 -45
  88. package/app/composables/darkMagic.ts +24 -24
  89. package/app/composables/externalApi.ts +69 -63
  90. package/app/composables/favicon.ts +8 -8
  91. package/app/composables/formatText.ts +99 -86
  92. package/app/composables/majorPane.ts +61 -60
  93. package/app/composables/phrases.ts +77 -80
  94. package/app/composables/theme.ts +29 -29
  95. package/app/composables/url.ts +33 -33
  96. package/app/pages/_test/preview.vue +110 -110
  97. package/app/pages/article/[...articleId].vue +3 -3
  98. package/app/pages/book/[...bookId].vue +42 -47
  99. package/app/pages/contributor/[contributorId].vue +224 -0
  100. package/app/pages/contributors.vue +183 -0
  101. package/app/pages/group/[...groupId].vue +52 -65
  102. package/app/pages/index.vue +32 -32
  103. package/app/pages/practice/[...practice].vue +3 -3
  104. package/app/pages/summary/[...summaryId].vue +3 -3
  105. package/app/plugins/analytics.ts +95 -0
  106. package/app/plugins/prerender.server.ts +22 -0
  107. package/app/public/favicon/article.svg +5 -5
  108. package/app/public/favicon/default.svg +3 -3
  109. package/app/public/favicon/practice.svg +3 -3
  110. package/app/public/favicon/summary.svg +4 -4
  111. package/app/public/logotype.svg +2 -2
  112. package/app/scripts/_immediate.js +9 -9
  113. package/app/scripts/aside/index.ts +59 -59
  114. package/app/scripts/aside/major/nav.ts +26 -26
  115. package/app/scripts/aside/minor/state.ts +37 -37
  116. package/app/scripts/aside/minor/topic.ts +3 -3
  117. package/app/scripts/flag.ts +28 -28
  118. package/app/scripts/og.ts +27 -27
  119. package/app/scripts/preview/build.ts +76 -73
  120. package/app/scripts/preview/data/alert.ts +19 -19
  121. package/app/scripts/preview/data/custom.ts +8 -8
  122. package/app/scripts/preview/data/genericLink.ts +24 -24
  123. package/app/scripts/preview/data/pageLink.ts +23 -20
  124. package/app/scripts/preview/data/unique.ts +69 -70
  125. package/app/scripts/preview/data.ts +24 -24
  126. package/app/scripts/preview/display.ts +37 -37
  127. package/app/scripts/preview/footer.ts +9 -9
  128. package/app/scripts/preview/request.ts +51 -51
  129. package/app/scripts/preview/state.ts +63 -63
  130. package/app/styles/_immediate.css +7 -7
  131. package/app/styles/_util.scss +43 -43
  132. package/app/styles/_utils.scss +44 -44
  133. package/app/styles/app.scss +91 -91
  134. package/app/styles/def/_bp.scss +27 -27
  135. package/app/styles/def/_size.scss +7 -7
  136. package/app/styles/def/_z.scss +5 -5
  137. package/app/styles/normalize.scss +49 -63
  138. package/app/styles/partials/_darkMagic.scss +5 -5
  139. package/app/styles/partials/_fnav.scss +15 -15
  140. package/app/styles/partials/_preview.scss +5 -5
  141. package/bin/erudit.mjs +2 -0
  142. package/const.ts +4 -0
  143. package/globalPath.ts +21 -21
  144. package/globals/bitran.ts +1 -47
  145. package/globals/content.ts +27 -22
  146. package/globals/contributor.ts +5 -5
  147. package/globals/erudit.ts +5 -5
  148. package/globals/register.ts +18 -18
  149. package/languages/en.ts +103 -95
  150. package/languages/ru.ts +107 -99
  151. package/module/bitran.ts +66 -34
  152. package/module/config.ts +35 -34
  153. package/module/imports.ts +67 -46
  154. package/module/index.ts +47 -47
  155. package/module/logger.ts +10 -10
  156. package/module/paths.ts +22 -22
  157. package/module/restart.ts +61 -61
  158. package/nuxt.config.ts +131 -112
  159. package/package.json +22 -15
  160. package/server/api/aside/major/nav/bookIds.ts +5 -5
  161. package/server/api/aside/major/nav/bookNav/[...bookId].ts +17 -20
  162. package/server/api/aside/major/nav/global.ts +7 -7
  163. package/server/api/aside/minor/book/[...bookId].ts +18 -0
  164. package/server/api/aside/minor/contributor/[contributorId].ts +18 -0
  165. package/server/api/aside/minor/group/[...groupId].ts +18 -0
  166. package/server/api/aside/minor/news.ts +7 -7
  167. package/server/api/aside/minor/topic.ts +36 -0
  168. package/server/api/bitran/content/[...location].ts +13 -0
  169. package/server/api/bitran/toc/[...location].ts +9 -0
  170. package/server/api/content/data.ts +75 -72
  171. package/server/api/contributor/count.ts +6 -6
  172. package/server/api/contributor/list.ts +44 -0
  173. package/server/api/contributor/page/[contributorId].ts +14 -0
  174. package/server/api/fake/content.ts +11 -11
  175. package/server/api/fake/shared/languages.ts +12 -12
  176. package/server/api/language/functions.ts +12 -12
  177. package/server/api/language/phrase/[phraseId].ts +19 -19
  178. package/server/api/language/phraseIds.ts +8 -8
  179. package/server/api/prerender.ts +19 -0
  180. package/server/api/preview/page/[...parts].ts +78 -51
  181. package/server/api/preview/unique/{[location].ts → [...location].ts} +48 -55
  182. package/server/api/problem/generator/[...path].ts +26 -0
  183. package/server/plugin/bitran/content.ts +252 -187
  184. package/server/plugin/bitran/{products → elements}/include.ts +229 -230
  185. package/server/plugin/bitran/location.ts +43 -25
  186. package/server/plugin/bitran/toc.ts +94 -83
  187. package/server/plugin/bitran/transpiler.ts +18 -46
  188. package/server/plugin/build/close.ts +12 -10
  189. package/server/plugin/build/jobs/content/builderArgs.ts +8 -8
  190. package/server/plugin/build/jobs/content/generic.ts +191 -176
  191. package/server/plugin/build/jobs/content/parse.ts +113 -100
  192. package/server/plugin/build/jobs/content/path.ts +6 -6
  193. package/server/plugin/build/jobs/content/type/book.ts +9 -9
  194. package/server/plugin/build/jobs/content/type/group.ts +37 -37
  195. package/server/plugin/build/jobs/content/type/topic.ts +36 -36
  196. package/server/plugin/build/jobs/contributors.ts +69 -66
  197. package/server/plugin/build/jobs/language.ts +36 -36
  198. package/server/plugin/build/jobs/nav.ts +345 -210
  199. package/server/plugin/build/process.ts +32 -25
  200. package/server/plugin/build/rebuild.ts +66 -55
  201. package/server/plugin/build/setup.ts +19 -21
  202. package/server/plugin/content/context.ts +119 -112
  203. package/server/plugin/db/entities/Book.ts +7 -7
  204. package/server/plugin/db/entities/Content.ts +45 -49
  205. package/server/plugin/db/entities/Contribution.ts +10 -10
  206. package/server/plugin/db/entities/Contributor.ts +25 -16
  207. package/server/plugin/db/entities/File.ts +10 -0
  208. package/server/plugin/db/entities/Group.ts +14 -14
  209. package/server/plugin/db/entities/Hash.ts +15 -15
  210. package/server/plugin/db/entities/Topic.ts +20 -20
  211. package/server/plugin/db/entities/Unique.ts +21 -21
  212. package/server/plugin/db/reset.ts +12 -0
  213. package/server/plugin/db/setup.ts +49 -34
  214. package/server/plugin/global.ts +16 -18
  215. package/server/plugin/importer.ts +16 -12
  216. package/server/plugin/index.ts +9 -9
  217. package/server/plugin/logger.ts +23 -23
  218. package/server/plugin/nav/node.ts +27 -26
  219. package/server/plugin/nav/utils.ts +179 -129
  220. package/server/plugin/repository/asideMinor.ts +51 -0
  221. package/server/plugin/repository/book.ts +39 -21
  222. package/server/plugin/repository/content.ts +240 -238
  223. package/server/plugin/repository/contentId.ts +40 -0
  224. package/server/plugin/repository/contributor.ts +98 -8
  225. package/server/plugin/repository/file.ts +10 -0
  226. package/server/plugin/repository/frontNav.ts +145 -148
  227. package/server/plugin/repository/topic.ts +35 -32
  228. package/server/tsconfig.json +9 -9
  229. package/shared/aside/minor.ts +55 -50
  230. package/shared/asset.ts +22 -15
  231. package/shared/bitran/content.ts +9 -0
  232. package/shared/bitran/contentId.ts +56 -0
  233. package/shared/bitran/toc.ts +8 -8
  234. package/shared/breadcrumb.ts +7 -0
  235. package/shared/content/bookId.ts +12 -0
  236. package/shared/content/context.ts +9 -9
  237. package/shared/content/data/base.ts +32 -32
  238. package/shared/content/data/index.ts +5 -5
  239. package/shared/content/data/type/book.ts +5 -5
  240. package/shared/content/data/type/group.ts +6 -6
  241. package/shared/content/data/type/topic.ts +11 -11
  242. package/shared/content/previousNext.ts +9 -9
  243. package/shared/contributor.ts +33 -5
  244. package/shared/frontNav.ts +41 -41
  245. package/shared/icons.ts +38 -38
  246. package/shared/image.ts +5 -5
  247. package/shared/link.ts +28 -25
  248. package/shared/popover.ts +8 -0
  249. package/shared/types/language.ts +79 -75
  250. package/shared/utils/objectsEqual.ts +4 -4
  251. package/shared/utils/stringColor.ts +9 -9
  252. package/test/contentId.test.ts +91 -0
  253. package/tsconfig.json +8 -8
  254. package/utils/contentPath.ts +67 -0
  255. package/utils/slash.ts +11 -0
  256. package/utils/stress.ts +9 -9
  257. package/app/components/ads/BannerTemplate.vue +0 -51
  258. package/app/components/ads/BottomBanner.vue +0 -45
  259. package/app/components/ads/LeftBanner.vue +0 -50
  260. package/app/components/aside/minor/AsideMinorContributor.vue +0 -5
  261. package/app/components/main/utils/ContentDescription.vue +0 -19
  262. package/app/components/main/utils/ContentFlag.vue +0 -15
  263. package/app/components/main/utils/ContentTitle.vue +0 -39
  264. package/app/composables/bitranContent.ts +0 -37
  265. package/app/pages/members.vue +0 -6
  266. package/app/styles/default.scss +0 -83
  267. package/server/api/aside/minor/path.ts +0 -78
  268. package/server/api/bitran/content/[location].ts +0 -7
  269. package/server/api/bitran/toc/[location].ts +0 -7
  270. package/server/plugin/bitran/products/link.ts +0 -116
  271. package/server/plugin/bitran/setup.ts +0 -9
  272. package/server/plugin/content/absoluteId.ts +0 -94
  273. package/shared/bitran/context.ts +0 -8
  274. package/shared/bitran/default.ts +0 -46
  275. package/shared/bitran/link/Link.vue +0 -167
  276. package/shared/bitran/link/factory.ts +0 -24
  277. package/shared/bitran/link/icon.svg +0 -3
  278. package/shared/bitran/link/languages/en.ts +0 -7
  279. package/shared/bitran/link/languages/ru.ts +0 -7
  280. package/shared/bitran/link/renderer.ts +0 -21
  281. package/shared/bitran/link/shared.ts +0 -17
  282. package/shared/bitran/link/target.ts +0 -134
  283. package/shared/bitran/link/transpiler.ts +0 -10
  284. package/shared/bitran/location.ts +0 -166
  285. package/test/bitran/link/target.test.ts +0 -141
  286. package/test/bitran/location.test.ts +0 -143
@@ -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
+ // }
@@ -1,3 +1,3 @@
1
- import type { Location } from '@shared/location';
2
-
3
- export const topicLocation = ref<Location>();
1
+ import type { Location } from '@shared/location';
2
+
3
+ export const topicLocation = ref<Location>();
@@ -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,27 @@
1
- import eruditConfig from '#erudit/config';
2
- import type { ImageData } from '@erudit/shared/image';
3
-
4
- export const defaultOgImage = eruditConfig.seo?.defaultOgImage || {
5
- src: eruditAsset('og-default.png'),
6
- width: 300,
7
- height: 300,
8
- };
9
-
10
- export function createOgImageTags(siteUrl: string, data: ImageData | string) {
11
- const tags = [];
12
- const isImage = typeof data !== 'string';
13
-
14
- tags.push({
15
- name: 'og:image',
16
- content: siteUrl + (isImage ? data.src : data),
17
- });
18
-
19
- if (isImage) {
20
- tags.push(
21
- { name: 'og:image:width', content: data.width },
22
- { name: 'og:image:height', content: data.height },
23
- );
24
- }
25
-
26
- return tags;
27
- }
1
+ import eruditConfig from '#erudit/config';
2
+ import type { ImageData } from '@erudit/shared/image';
3
+
4
+ export const defaultOgImage = eruditConfig.seo?.defaultOgImage || {
5
+ src: eruditAsset('og-default.png'),
6
+ width: 300,
7
+ height: 300,
8
+ };
9
+
10
+ export function createOgImageTags(siteUrl: string, data: ImageData | string) {
11
+ const tags = [];
12
+ const isImage = typeof data !== 'string';
13
+
14
+ tags.push({
15
+ name: 'og:image',
16
+ content: siteUrl + (isImage ? data.src : data),
17
+ });
18
+
19
+ if (isImage) {
20
+ tags.push(
21
+ { name: 'og:image:width', content: data.width },
22
+ { name: 'og:image:height', content: data.height },
23
+ );
24
+ }
25
+
26
+ return tags;
27
+ }
@@ -1,73 +1,76 @@
1
- import { PreviewDataType, type PreviewData } from './data';
2
- import { PreviewRequestType, type PreviewRequest } from './request';
3
-
4
- import { buildGenericLink } from './data/genericLink';
5
- import { buildPageLink } from './data/pageLink';
6
- import { buildUnique } from './data/unique';
7
- import { createPreviewError } from './data/alert';
8
- import { PreviewThemeName } from './state';
9
-
10
- const builders = [buildGenericLink, buildPageLink, buildUnique];
11
-
12
- export async function buildPreviewData(
13
- request: PreviewRequest,
14
- ): Promise<PreviewData> {
15
- if (request.type === PreviewRequestType.Data) return request.data;
16
-
17
- if (request.type === PreviewRequestType.MissingElement) {
18
- if (request.hashMismatch) {
19
- const phrase = await usePhrases(
20
- 'preview_missing_title',
21
- 'preview_missing_explain_mismatch',
22
- 'element_id',
23
- 'current_page_hash',
24
- 'expected_page_hash',
25
- );
26
-
27
- return createPreviewError({
28
- title: phrase.preview_missing_title,
29
- message: phrase.preview_missing_explain_mismatch,
30
- pre: `${phrase.element_id}: ${request.elementId}\n${phrase.current_page_hash}: ${request.hashMismatch.current}\n${phrase.expected_page_hash}: ${request.hashMismatch.expected}`,
31
- });
32
- } else {
33
- const phrase = await usePhrases(
34
- 'preview_missing_title',
35
- 'preview_missing_explain',
36
- 'element_id',
37
- );
38
-
39
- return createPreviewError({
40
- title: phrase.preview_missing_title,
41
- message: phrase.preview_missing_explain,
42
- pre: `${phrase.element_id}: ${request.elementId}`,
43
- });
44
- }
45
- }
46
-
47
- if (request.type === PreviewRequestType.HashMismatch) {
48
- const phrase = await usePhrases(
49
- 'preview_hash_mismatch_title',
50
- 'preview_hash_mismatch_explain',
51
- 'current_page_hash',
52
- 'expected_page_hash',
53
- );
54
-
55
- return {
56
- type: PreviewDataType.Alert,
57
- theme: PreviewThemeName.Warn,
58
- title: phrase.preview_hash_mismatch_title,
59
- message: phrase.preview_hash_mismatch_explain,
60
- pre: `${phrase.current_page_hash}: ${request.currentHash}\n${phrase.expected_page_hash}: ${request.expectedHash}`,
61
- };
62
- }
63
-
64
- for (const build of builders) {
65
- const result = await build(request);
66
- if (result) return result;
67
- }
68
-
69
- throw createPreviewError({
70
- message: `Unable to build preview data for request!`,
71
- pre: JSON.stringify(request, null, 4),
72
- });
73
- }
1
+ import { PreviewDataType, type PreviewData } from './data';
2
+ import { createPreviewError } from './data/alert';
3
+ import { PreviewRequestType, type PreviewRequest } from './request';
4
+ import { PreviewThemeName } from './state';
5
+
6
+ const builders = [
7
+ async (request: PreviewRequest) =>
8
+ (await import('./data/genericLink')).buildGenericLink(request),
9
+ async (request: PreviewRequest) =>
10
+ (await import('./data/pageLink')).buildPageLink(request),
11
+ async (request: PreviewRequest) =>
12
+ (await import('./data/unique')).buildUnique(request),
13
+ ];
14
+
15
+ export async function buildPreviewData(
16
+ request: PreviewRequest,
17
+ ): Promise<PreviewData> {
18
+ if (request.type === PreviewRequestType.Data) return request.data;
19
+
20
+ if (request.type === PreviewRequestType.MissingElement) {
21
+ if (request.hashMismatch) {
22
+ const phrase = await usePhrases(
23
+ 'preview_missing_title',
24
+ 'preview_missing_explain_mismatch',
25
+ 'element_id',
26
+ 'current_page_hash',
27
+ 'expected_page_hash',
28
+ );
29
+
30
+ return createPreviewError({
31
+ title: phrase.preview_missing_title,
32
+ message: phrase.preview_missing_explain_mismatch,
33
+ pre: `${phrase.element_id}: ${request.elementId}\n${phrase.current_page_hash}: ${request.hashMismatch.current}\n${phrase.expected_page_hash}: ${request.hashMismatch.expected}`,
34
+ });
35
+ } else {
36
+ const phrase = await usePhrases(
37
+ 'preview_missing_title',
38
+ 'preview_missing_explain',
39
+ 'element_id',
40
+ );
41
+
42
+ return createPreviewError({
43
+ title: phrase.preview_missing_title,
44
+ message: phrase.preview_missing_explain,
45
+ pre: `${phrase.element_id}: ${request.elementId}`,
46
+ });
47
+ }
48
+ }
49
+
50
+ if (request.type === PreviewRequestType.HashMismatch) {
51
+ const phrase = await usePhrases(
52
+ 'preview_hash_mismatch_title',
53
+ 'preview_hash_mismatch_explain',
54
+ 'current_page_hash',
55
+ 'expected_page_hash',
56
+ );
57
+
58
+ return {
59
+ type: PreviewDataType.Alert,
60
+ theme: PreviewThemeName.Warn,
61
+ title: phrase.preview_hash_mismatch_title,
62
+ message: phrase.preview_hash_mismatch_explain,
63
+ pre: `${phrase.current_page_hash}: ${request.currentHash}\n${phrase.expected_page_hash}: ${request.expectedHash}`,
64
+ };
65
+ }
66
+
67
+ for (const build of builders) {
68
+ const result = await build(request);
69
+ if (result) return result;
70
+ }
71
+
72
+ throw createPreviewError({
73
+ message: `Unable to build preview data for request!`,
74
+ pre: JSON.stringify(request, null, 4),
75
+ });
76
+ }
@@ -1,19 +1,19 @@
1
- import { PreviewDataType, type PreviewDataBase } from '../data';
2
- import { PreviewThemeName } from '../state';
3
-
4
- export type AlertData = Partial<{
5
- theme: PreviewThemeName;
6
- title: string;
7
- message: string;
8
- pre: string;
9
- }>;
10
-
11
- export type PreviewDataAlert = PreviewDataBase & AlertData;
12
-
13
- export function createPreviewError(alertData: AlertData): PreviewDataAlert {
14
- return {
15
- type: PreviewDataType.Alert,
16
- theme: PreviewThemeName.Error,
17
- ...alertData,
18
- };
19
- }
1
+ import { PreviewDataType, type PreviewDataBase } from '../data';
2
+ import { PreviewThemeName } from '../state';
3
+
4
+ export type AlertData = Partial<{
5
+ theme: PreviewThemeName;
6
+ title: string;
7
+ message: string;
8
+ pre: string;
9
+ }>;
10
+
11
+ export type PreviewDataAlert = PreviewDataBase & AlertData;
12
+
13
+ export function createPreviewError(alertData: AlertData): PreviewDataAlert {
14
+ return {
15
+ type: PreviewDataType.Alert,
16
+ theme: PreviewThemeName.Error,
17
+ ...alertData,
18
+ };
19
+ }
@@ -1,8 +1,8 @@
1
- import type { PreviewDataBase, PreviewDataType } from '../data';
2
- import type { PreviewFooter } from '../footer';
3
-
4
- export interface PreviewDataCustom extends PreviewDataBase {
5
- type: PreviewDataType.Custom;
6
- message: string;
7
- footer?: PreviewFooter;
8
- }
1
+ import type { PreviewDataBase, PreviewDataType } from '../data';
2
+ import type { PreviewFooter } from '../footer';
3
+
4
+ export interface PreviewDataCustom extends PreviewDataBase {
5
+ type: PreviewDataType.Custom;
6
+ message: string;
7
+ footer?: PreviewFooter;
8
+ }
@@ -1,24 +1,24 @@
1
- import { PreviewDataType, type PreviewDataBase } from '../data';
2
- import { PreviewRequestType, type PreviewRequest } from '../request';
3
-
4
- export interface PreviewDataGenericLink extends PreviewDataBase {
5
- type: PreviewDataType.GenericLink;
6
- external: boolean;
7
- href: string;
8
- }
9
-
10
- export async function buildGenericLink(
11
- request: PreviewRequest,
12
- ): Promise<PreviewDataGenericLink> {
13
- if (request.type !== PreviewRequestType.Link) return;
14
-
15
- const { linkTarget } = request;
16
-
17
- if (!['external', 'absolute'].includes(linkTarget.type)) return;
18
-
19
- return {
20
- type: PreviewDataType.GenericLink,
21
- external: linkTarget.type === 'external',
22
- href: linkTarget.href,
23
- };
24
- }
1
+ import { PreviewDataType, type PreviewDataBase } from '../data';
2
+ import { PreviewRequestType, type PreviewRequest } from '../request';
3
+
4
+ export interface PreviewDataGenericLink extends PreviewDataBase {
5
+ type: PreviewDataType.GenericLink;
6
+ external: boolean;
7
+ href: string;
8
+ }
9
+
10
+ export async function buildGenericLink(
11
+ request: PreviewRequest,
12
+ ): Promise<PreviewDataGenericLink> {
13
+ if (request.type !== PreviewRequestType.Link) return;
14
+
15
+ const { linkTarget } = request;
16
+
17
+ if (!['external', 'absolute'].includes(linkTarget.type)) return;
18
+
19
+ return {
20
+ type: PreviewDataType.GenericLink,
21
+ external: linkTarget.type === 'external',
22
+ href: linkTarget.href,
23
+ };
24
+ }