erudit 3.0.0-dev.14 → 3.0.0-dev.16

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 (243) hide show
  1. package/app/app.vue +191 -195
  2. package/app/components/Loading.vue +23 -23
  3. package/app/components/SiteAside.vue +393 -393
  4. package/app/components/SiteMain.vue +32 -32
  5. package/app/components/ads/Ads.vue +35 -0
  6. package/app/components/ads/AdsBannerAside.vue +61 -0
  7. package/app/components/ads/AdsBannerBottom.vue +22 -0
  8. package/app/components/ads/AdsProviderCustom.vue +35 -0
  9. package/app/components/ads/AdsProviderYandex.vue +54 -0
  10. package/app/components/ads/AdsReplacer.vue +73 -0
  11. package/app/components/aside/AsideListItem.vue +74 -74
  12. package/app/components/aside/AsideMajor.vue +56 -56
  13. package/app/components/aside/AsideMinor.vue +73 -71
  14. package/app/components/aside/major/PaneContentScroll.vue +23 -23
  15. package/app/components/aside/major/PaneSwitch.vue +54 -54
  16. package/app/components/aside/major/PaneSwitchButton.vue +63 -63
  17. package/app/components/aside/major/SiteInfo.vue +85 -85
  18. package/app/components/aside/major/panes/Language.vue +79 -79
  19. package/app/components/aside/major/panes/Pages.vue +34 -34
  20. package/app/components/aside/major/panes/Search.vue +11 -11
  21. package/app/components/aside/major/panes/nav/Nav.vue +92 -92
  22. package/app/components/aside/major/panes/nav/NavBook.vue +95 -95
  23. package/app/components/aside/major/panes/nav/NavBookLoading.vue +24 -24
  24. package/app/components/aside/major/panes/nav/NavGlobal.vue +16 -16
  25. package/app/components/aside/major/panes/nav/fnav/FNav.vue +105 -105
  26. package/app/components/aside/major/panes/nav/fnav/FNavBook.vue +32 -32
  27. package/app/components/aside/major/panes/nav/fnav/FNavFlags.vue +40 -40
  28. package/app/components/aside/major/panes/nav/fnav/FNavFolder.vue +60 -60
  29. package/app/components/aside/major/panes/nav/fnav/FNavItem.vue +34 -34
  30. package/app/components/aside/major/panes/nav/fnav/FNavSeparator.vue +80 -80
  31. package/app/components/aside/major/panes/nav/fnav/FNavTopic.vue +24 -24
  32. package/app/components/aside/major/panes/other/ItemContent.vue +29 -29
  33. package/app/components/aside/major/panes/other/ItemGenerator.vue +13 -13
  34. package/app/components/aside/major/panes/other/ItemTheme.vue +54 -54
  35. package/app/components/aside/major/panes/other/Other.vue +16 -16
  36. package/app/components/aside/minor/AsideMinorContributor.vue +5 -5
  37. package/app/components/aside/minor/AsideMinorNews.vue +11 -11
  38. package/app/components/aside/minor/AsideMinorPane.vue +15 -15
  39. package/app/components/aside/minor/AsideMinorTopLink.vue +67 -67
  40. package/app/components/aside/minor/Contribute.vue +145 -145
  41. package/app/components/aside/minor/content/AsideMinorContent.vue +92 -92
  42. package/app/components/aside/minor/topic/AsideMinorTopic.vue +32 -32
  43. package/app/components/aside/minor/topic/TopicContributors.vue +177 -177
  44. package/app/components/aside/minor/topic/TopicNav.vue +49 -49
  45. package/app/components/aside/minor/topic/TopicToc.vue +214 -214
  46. package/app/components/aside/minor/topic/TopicTocItem.vue +32 -32
  47. package/app/components/aside/utils/AsideOverlayPane.vue +40 -40
  48. package/app/components/bitran/BitranContent.vue +91 -91
  49. package/app/components/bitran/RenderWrapper.vue +10 -10
  50. package/app/components/contributor/ContributorAvatar.vue +45 -45
  51. package/app/components/contributor/ContributorListItem.vue +35 -35
  52. package/app/components/main/topic/MainTopic.vue +88 -78
  53. package/app/components/main/topic/TopicPartSwitch.vue +118 -118
  54. package/app/components/main/utils/Breadcrumb.vue +74 -70
  55. package/app/components/main/utils/ContentDecoration.vue +29 -29
  56. package/app/components/main/utils/ContentDescription.vue +19 -19
  57. package/app/components/main/utils/ContentPopover.vue +188 -188
  58. package/app/components/main/utils/ContentPopovers.vue +111 -111
  59. package/app/components/main/utils/ContentReferences.vue +70 -70
  60. package/app/components/main/utils/ContentSection.vue +45 -45
  61. package/app/components/main/utils/ContentTitle.vue +63 -63
  62. package/app/components/main/utils/reference/ReferenceGroup.vue +38 -38
  63. package/app/components/main/utils/reference/ReferenceItem.vue +70 -70
  64. package/app/components/main/utils/reference/ReferenceSource.vue +120 -118
  65. package/app/components/preview/Preview.vue +186 -186
  66. package/app/components/preview/PreviewDisplay.vue +139 -139
  67. package/app/components/preview/PreviewFooterAction.vue +73 -73
  68. package/app/components/preview/PreviewLoading.vue +14 -14
  69. package/app/components/preview/PreviewScreen.vue +141 -141
  70. package/app/components/preview/display/Alert.vue +50 -50
  71. package/app/components/preview/display/Custom.vue +18 -18
  72. package/app/components/preview/display/GenericLink.vue +48 -48
  73. package/app/components/preview/display/PageLink.vue +22 -20
  74. package/app/components/preview/display/Unique.vue +55 -55
  75. package/app/components/transition/Fade.vue +19 -19
  76. package/app/components/tree/TreeContainer.vue +11 -11
  77. package/app/components/tree/TreeItem.vue +89 -89
  78. package/app/composables/bitran.ts +108 -108
  79. package/app/composables/bitranContent.ts +92 -92
  80. package/app/composables/bitranLocation.ts +7 -7
  81. package/app/composables/contentData.ts +38 -36
  82. package/app/composables/contentPage.ts +158 -158
  83. package/app/composables/contentRoute.ts +45 -45
  84. package/app/composables/darkMagic.ts +24 -24
  85. package/app/composables/externalApi.ts +69 -63
  86. package/app/composables/favicon.ts +8 -8
  87. package/app/composables/formatText.ts +99 -99
  88. package/app/composables/majorPane.ts +60 -60
  89. package/app/composables/phrases.ts +65 -65
  90. package/app/composables/theme.ts +29 -29
  91. package/app/composables/url.ts +33 -33
  92. package/app/pages/_test/preview.vue +110 -110
  93. package/app/pages/article/[...articleId].vue +3 -3
  94. package/app/pages/book/[...bookId].vue +47 -47
  95. package/app/pages/group/[...groupId].vue +66 -64
  96. package/app/pages/index.vue +32 -32
  97. package/app/pages/members.vue +6 -6
  98. package/app/pages/practice/[...practice].vue +3 -3
  99. package/app/pages/summary/[...summaryId].vue +3 -3
  100. package/app/plugins/analytics.ts +87 -0
  101. package/app/plugins/prerender.server.ts +22 -22
  102. package/app/scripts/_immediate.js +9 -9
  103. package/app/scripts/aside/index.ts +59 -59
  104. package/app/scripts/aside/major/nav.ts +26 -26
  105. package/app/scripts/aside/minor/state.ts +37 -37
  106. package/app/scripts/aside/minor/topic.ts +3 -3
  107. package/app/scripts/flag.ts +28 -28
  108. package/app/scripts/og.ts +27 -27
  109. package/app/scripts/preview/build.ts +76 -76
  110. package/app/scripts/preview/data/alert.ts +19 -19
  111. package/app/scripts/preview/data/custom.ts +8 -8
  112. package/app/scripts/preview/data/genericLink.ts +24 -24
  113. package/app/scripts/preview/data/pageLink.ts +23 -23
  114. package/app/scripts/preview/data/unique.ts +72 -72
  115. package/app/scripts/preview/data.ts +24 -24
  116. package/app/scripts/preview/display.ts +37 -37
  117. package/app/scripts/preview/footer.ts +9 -9
  118. package/app/scripts/preview/request.ts +51 -51
  119. package/app/scripts/preview/state.ts +63 -63
  120. package/app/styles/_immediate.css +7 -7
  121. package/app/styles/_util.scss +43 -43
  122. package/app/styles/_utils.scss +44 -44
  123. package/app/styles/app.scss +91 -91
  124. package/app/styles/def/_bp.scss +27 -27
  125. package/app/styles/def/_size.scss +7 -7
  126. package/app/styles/def/_z.scss +5 -5
  127. package/app/styles/normalize.scss +49 -49
  128. package/app/styles/partials/_darkMagic.scss +5 -5
  129. package/app/styles/partials/_fnav.scss +15 -15
  130. package/app/styles/partials/_preview.scss +5 -5
  131. package/bin/erudit.mjs +2 -2
  132. package/const.ts +4 -4
  133. package/globalPath.ts +21 -21
  134. package/globals/bitran.ts +1 -1
  135. package/globals/content.ts +27 -27
  136. package/globals/contributor.ts +5 -5
  137. package/globals/erudit.ts +5 -5
  138. package/globals/register.ts +18 -18
  139. package/languages/en.ts +94 -94
  140. package/languages/ru.ts +98 -98
  141. package/module/bitran.ts +66 -66
  142. package/module/config.ts +35 -35
  143. package/module/imports.ts +67 -67
  144. package/module/index.ts +47 -49
  145. package/module/logger.ts +10 -10
  146. package/module/paths.ts +22 -22
  147. package/module/restart.ts +61 -61
  148. package/nuxt.config.ts +131 -134
  149. package/package.json +10 -9
  150. package/server/api/aside/major/nav/bookIds.ts +5 -5
  151. package/server/api/aside/major/nav/bookNav/[...bookId].ts +20 -20
  152. package/server/api/aside/major/nav/global.ts +7 -7
  153. package/server/api/aside/minor/news.ts +7 -7
  154. package/server/api/aside/minor/path.ts +82 -82
  155. package/server/api/bitran/content/[...location].ts +10 -10
  156. package/server/api/bitran/toc/[...location].ts +9 -9
  157. package/server/api/content/data.ts +75 -75
  158. package/server/api/contributor/count.ts +6 -6
  159. package/server/api/fake/content.ts +11 -11
  160. package/server/api/fake/shared/languages.ts +12 -12
  161. package/server/api/language/functions.ts +12 -12
  162. package/server/api/language/phrase/[phraseId].ts +19 -19
  163. package/server/api/language/phraseIds.ts +8 -8
  164. package/server/api/prerender.ts +120 -120
  165. package/server/api/preview/page/[...parts].ts +78 -78
  166. package/server/api/preview/unique/[...location].ts +61 -61
  167. package/server/api/problem/generator/[...path].ts +26 -0
  168. package/server/plugin/bitran/content.ts +190 -190
  169. package/server/plugin/bitran/elements/include.ts +229 -229
  170. package/server/plugin/bitran/location.ts +39 -39
  171. package/server/plugin/bitran/toc.ts +94 -94
  172. package/server/plugin/bitran/transpiler.ts +18 -18
  173. package/server/plugin/build/close.ts +12 -12
  174. package/server/plugin/build/jobs/content/builderArgs.ts +8 -8
  175. package/server/plugin/build/jobs/content/generic.ts +191 -191
  176. package/server/plugin/build/jobs/content/parse.ts +113 -113
  177. package/server/plugin/build/jobs/content/path.ts +6 -6
  178. package/server/plugin/build/jobs/content/type/book.ts +9 -9
  179. package/server/plugin/build/jobs/content/type/group.ts +37 -37
  180. package/server/plugin/build/jobs/content/type/topic.ts +36 -36
  181. package/server/plugin/build/jobs/contributors.ts +66 -66
  182. package/server/plugin/build/jobs/language.ts +36 -36
  183. package/server/plugin/build/jobs/nav.ts +345 -227
  184. package/server/plugin/build/process.ts +32 -27
  185. package/server/plugin/build/rebuild.ts +66 -66
  186. package/server/plugin/build/setup.ts +19 -19
  187. package/server/plugin/content/context.ts +119 -119
  188. package/server/plugin/db/entities/Book.ts +7 -7
  189. package/server/plugin/db/entities/Content.ts +45 -45
  190. package/server/plugin/db/entities/Contribution.ts +10 -10
  191. package/server/plugin/db/entities/Contributor.ts +16 -16
  192. package/server/plugin/db/entities/File.ts +10 -10
  193. package/server/plugin/db/entities/Group.ts +14 -14
  194. package/server/plugin/db/entities/Hash.ts +15 -15
  195. package/server/plugin/db/entities/Topic.ts +20 -20
  196. package/server/plugin/db/entities/Unique.ts +21 -21
  197. package/server/plugin/db/reset.ts +12 -12
  198. package/server/plugin/db/setup.ts +49 -49
  199. package/server/plugin/global.ts +16 -16
  200. package/server/plugin/importer.ts +16 -16
  201. package/server/plugin/index.ts +9 -9
  202. package/server/plugin/logger.ts +23 -23
  203. package/server/plugin/nav/node.ts +27 -27
  204. package/server/plugin/nav/utils.ts +175 -175
  205. package/server/plugin/repository/book.ts +21 -21
  206. package/server/plugin/repository/content.ts +240 -249
  207. package/server/plugin/repository/contentId.ts +40 -40
  208. package/server/plugin/repository/contributor.ts +8 -8
  209. package/server/plugin/repository/file.ts +10 -10
  210. package/server/plugin/repository/frontNav.ts +145 -145
  211. package/server/plugin/repository/topic.ts +35 -35
  212. package/server/tsconfig.json +9 -9
  213. package/shared/aside/minor.ts +51 -51
  214. package/shared/asset.ts +22 -22
  215. package/shared/bitran/contentId.ts +56 -56
  216. package/shared/bitran/stringContent.ts +6 -6
  217. package/shared/bitran/toc.ts +8 -8
  218. package/shared/content/bookId.ts +12 -12
  219. package/shared/content/context.ts +9 -9
  220. package/shared/content/data/base.ts +32 -32
  221. package/shared/content/data/index.ts +5 -5
  222. package/shared/content/data/type/book.ts +5 -5
  223. package/shared/content/data/type/group.ts +6 -6
  224. package/shared/content/data/type/topic.ts +11 -11
  225. package/shared/content/previousNext.ts +9 -9
  226. package/shared/contributor.ts +5 -5
  227. package/shared/frontNav.ts +41 -41
  228. package/shared/icons.ts +38 -38
  229. package/shared/image.ts +5 -5
  230. package/shared/link.ts +28 -28
  231. package/shared/popover.ts +8 -8
  232. package/shared/types/language.ts +74 -74
  233. package/shared/utils/objectsEqual.ts +4 -4
  234. package/shared/utils/stringColor.ts +9 -9
  235. package/test/contentId.test.ts +91 -91
  236. package/tsconfig.json +8 -8
  237. package/utils/contentPath.ts +67 -67
  238. package/utils/slash.ts +11 -0
  239. package/utils/stress.ts +9 -9
  240. package/app/components/ads/BannerTemplate.vue +0 -51
  241. package/app/components/ads/BottomBanner.vue +0 -45
  242. package/app/components/ads/LeftBanner.vue +0 -50
  243. package/module/problemGenerators.ts +0 -46
@@ -1,393 +1,393 @@
1
- <script lang="ts" setup>
2
- import { previewVisible } from '@app/scripts/preview/state';
3
- import {
4
- AsideType,
5
- clickTargets,
6
- forcedAside,
7
- switchVisible,
8
- } from '@app/scripts/aside';
9
-
10
- const props = defineProps<{
11
- type: AsideType;
12
- }>();
13
-
14
- const $style = useCssModule();
15
-
16
- const switchElement = useTemplateRef('switchElement');
17
- const asideElement = useTemplateRef('asideElement');
18
-
19
- const mounted = ref(false);
20
-
21
- const canShowSwitch = computed(
22
- () =>
23
- mounted.value &&
24
- switchVisible.value &&
25
- !forcedAside.value &&
26
- !previewVisible.value,
27
- );
28
-
29
- const asideForceVisible = computed(
30
- () => props.type === forcedAside.value && !previewVisible.value,
31
- );
32
-
33
- const typeClass = props.type === AsideType.Major ? $style.major : $style.minor;
34
-
35
- onMounted(() => {
36
- mounted.value = true;
37
-
38
- clickTargets[props.type].push(
39
- ...[switchElement.value!, asideElement.value!],
40
- );
41
- });
42
-
43
- function switchClick() {
44
- forcedAside.value = props.type;
45
- }
46
- </script>
47
-
48
- <template>
49
- <div
50
- ref="switchElement"
51
- @click="switchClick"
52
- :class="[
53
- $style.asideSwitch,
54
- typeClass,
55
- canShowSwitch ? $style.visible : '',
56
- ]"
57
- >
58
- <MyIcon name="aside-open" />
59
- </div>
60
-
61
- <aside
62
- ref="asideElement"
63
- :class="[
64
- $style.aside,
65
- typeClass,
66
- asideForceVisible ? $style.forceVisible : '',
67
- ]"
68
- >
69
- <slot></slot>
70
- <div :class="$style.innerShadow"></div>
71
- </aside>
72
- </template>
73
-
74
- <style lang="scss" module>
75
- @use '$/def/bp';
76
- @use '$/def/z';
77
- @use '$/def/size';
78
-
79
- // !!
80
- // !!
81
- // !! Rewrite the whole logic based on coords relative to main content. It will be 1000% easier. See how <Preview> is implemented!
82
- // !!
83
- // !!
84
-
85
- @function maxLayoutEdge() {
86
- @return calc(
87
- 50% - min(var(--wMainMax), calc(100% - 2 * var(--wAside))) / 2
88
- );
89
- }
90
-
91
- @mixin ___asidePositionLogic {
92
- /* For God's sake, don't ever touch this code */
93
-
94
- --_pos: var(--_posHidden); // Start with hidden position (mobile first)
95
-
96
- --_posHidden: calc(-1 * var(--wAside));
97
- --_posVisible: var(--_posVisibleCorner);
98
-
99
- --_posVisibleCorner: 0;
100
- --_posVisibleMax: calc(#{maxLayoutEdge()} - var(--wAside));
101
-
102
- &.major.forceVisible,
103
- &.minor.forceVisible {
104
- --_pos: var(--_posVisible); // Always visible when forced
105
- }
106
-
107
- &.major {
108
- left: var(--_pos);
109
-
110
- @include bp.above('aside1') {
111
- --_posVisible: var(--_posVisibleCorner);
112
- --_pos: var(--_posVisible);
113
- }
114
-
115
- @include bp.above('aside2') {
116
- --_posVisible: var(--_posVisibleMax);
117
- }
118
- }
119
-
120
- &.minor {
121
- right: var(--_pos);
122
-
123
- @include bp.above('aside2') {
124
- --_posVisible: var(--_posVisibleMax);
125
- --_pos: var(--_posVisible);
126
- }
127
- }
128
- }
129
-
130
- .aside {
131
- //
132
- // Global
133
- //
134
-
135
- position: fixed;
136
- z-index: z.$aside;
137
- top: 0;
138
-
139
- width: var(--wAside);
140
- height: 100dvh;
141
-
142
- background: var(--bgAside);
143
- backdrop-filter: initial;
144
-
145
- --shadowColor: #{rgba(black, 0.065)};
146
-
147
- @include transition(left, right, background, backdrop-filter, box-shadow);
148
-
149
- @include dark {
150
- --shadowColor: #{rgba(white, 0.075)};
151
- }
152
-
153
- //
154
-
155
- @include ___asidePositionLogic;
156
-
157
- //
158
- // Global States
159
- //
160
-
161
- @mixin asideVisible {
162
- }
163
-
164
- @mixin asideHidden {
165
- }
166
-
167
- @mixin asideModal {
168
- background: color-mix(
169
- in srgb,
170
- color-mix(in srgb, var(--bgAside), black 0%),
171
- transparent 22%
172
- );
173
- backdrop-filter: blur(10px);
174
-
175
- box-shadow:
176
- 0px 0px 15px 15px rgba(0, 0, 0, 0.1),
177
- 0px 0px 8px 0px rgba(0, 0, 0, 0.1);
178
-
179
- @include dark {
180
- background: color-mix(in srgb, var(--bgAside), transparent 10%);
181
-
182
- box-shadow:
183
- 0px 0px 15px 15px rgba(255, 255, 255, 0.025),
184
- 0px 0px 8px 0px rgba(255, 255, 255, 0.03);
185
- }
186
- }
187
-
188
- &.major {
189
- //
190
- // Major Aside
191
- //
192
-
193
- box-shadow: -1px 0px 2px 0px var(--shadowColor);
194
-
195
- @include bp.above('aside1') {
196
- //
197
- // Major Visible
198
- //
199
-
200
- @include asideVisible;
201
- }
202
-
203
- @include bp.below('aside1') {
204
- //
205
- // Major Hidden
206
- //
207
-
208
- @include asideHidden;
209
-
210
- &.forceVisible {
211
- //
212
- // Major Modal
213
- //
214
-
215
- @include asideModal;
216
- }
217
- }
218
- }
219
-
220
- &.minor {
221
- //
222
- // Minor Aside
223
- //
224
-
225
- box-shadow: 1px 0px 2px 0px var(--shadowColor);
226
-
227
- @include bp.above('aside2') {
228
- //
229
- // Minor Visible
230
- //
231
-
232
- @include asideVisible;
233
- }
234
-
235
- @include bp.below('aside2') {
236
- //
237
- // Minor Hidden
238
- //
239
-
240
- @include asideHidden;
241
-
242
- &.forceVisible {
243
- //
244
- // Minor Modal
245
- //
246
-
247
- @include asideModal;
248
- }
249
- }
250
- }
251
- }
252
-
253
- //
254
- //
255
- //
256
-
257
- @mixin ___switchPositionLogic {
258
- /* For God's sake, don't ever touch this code */
259
-
260
- --_switchSize: calc(var(--iconSize) + 2 * var(--p) + var(--m));
261
-
262
- --_pos: var(--_posHidden);
263
-
264
- --_posVisible: calc(var(--_posHidden) + var(--_switchSize));
265
- --_posHidden: var(--_posBehindCorner);
266
-
267
- --_posBehindCorner: calc(-1 * var(--_switchSize));
268
- --_posBehindMajorAside: calc(var(--wAside) - var(--_switchSize));
269
- --_posBehindFullLayout: calc(#{maxLayoutEdge()} - var(--_switchSize));
270
-
271
- &.visible {
272
- --_pos: var(--_posVisible);
273
- }
274
-
275
- &.major {
276
- left: var(--_pos);
277
-
278
- @include bp.above('aside1') {
279
- --_posHidden: var(--_posBehindMajorAside);
280
- --_posVisible: var(--_posHidden);
281
- }
282
- }
283
-
284
- &.minor {
285
- right: var(--_pos);
286
-
287
- @include bp.above('aside2') {
288
- --_posVisible: var(--_posHidden);
289
- }
290
- }
291
-
292
- &.major,
293
- &.minor {
294
- @include bp.above('aside2') {
295
- --_posHidden: var(--_posBehindFullLayout);
296
- }
297
- }
298
- }
299
-
300
- .asideSwitch {
301
- --iconSize: 36px;
302
- --p: 12px;
303
- --m: var(--gapBig);
304
-
305
- //
306
-
307
- position: fixed;
308
- z-index: z.$asideSwitch;
309
- bottom: 0;
310
-
311
- font-size: var(--iconSize);
312
- padding: var(--p);
313
- margin: var(--gapBig);
314
-
315
- background: #8c8c8c;
316
- color: var(--bgMain);
317
- box-shadow: 0px 0px 20px 20px var(--bgMain);
318
- opacity: 0.95;
319
-
320
- cursor: pointer;
321
-
322
- @include transition(left, right, opacity, box-shadow);
323
-
324
- @include dark {
325
- background: #8c8c8c;
326
- }
327
-
328
- &:hover {
329
- opacity: 1;
330
- }
331
-
332
- &.minor {
333
- svg {
334
- transform: scaleX(-1);
335
- }
336
- }
337
-
338
- @mixin invisible {
339
- box-shadow: none; /* TODO: Fix missing fade-out transition! */
340
- }
341
-
342
- //
343
-
344
- @include ___switchPositionLogic;
345
-
346
- &:not(.visible) {
347
- @include invisible;
348
- }
349
- &.major {
350
- @include bp.above('aside1') {
351
- @include invisible;
352
- }
353
- }
354
- @include bp.above('aside2') {
355
- @include invisible;
356
- }
357
- }
358
-
359
- //
360
- //
361
- //
362
-
363
- .innerShadow {
364
- position: absolute;
365
- z-index: 9999;
366
- top: 0;
367
- width: 30px;
368
- height: 100%;
369
- pointer-events: none;
370
- touch-action: none;
371
- box-shadow: -1px 0px 2px 0px
372
- color-mix(in srgb, var(--invert), transparent 93%) inset;
373
-
374
- @include transition(box-shadow);
375
-
376
- .major & {
377
- right: 0;
378
-
379
- @include bp.below('aside1') {
380
- box-shadow: none;
381
- }
382
- }
383
-
384
- .minor & {
385
- left: 0;
386
- transform: scaleX(-1);
387
-
388
- @include bp.below('aside2') {
389
- box-shadow: none;
390
- }
391
- }
392
- }
393
- </style>
1
+ <script lang="ts" setup>
2
+ import { previewVisible } from '@app/scripts/preview/state';
3
+ import {
4
+ AsideType,
5
+ clickTargets,
6
+ forcedAside,
7
+ switchVisible,
8
+ } from '@app/scripts/aside';
9
+
10
+ const props = defineProps<{
11
+ type: AsideType;
12
+ }>();
13
+
14
+ const $style = useCssModule();
15
+
16
+ const switchElement = useTemplateRef('switchElement');
17
+ const asideElement = useTemplateRef('asideElement');
18
+
19
+ const mounted = ref(false);
20
+
21
+ const canShowSwitch = computed(
22
+ () =>
23
+ mounted.value &&
24
+ switchVisible.value &&
25
+ !forcedAside.value &&
26
+ !previewVisible.value,
27
+ );
28
+
29
+ const asideForceVisible = computed(
30
+ () => props.type === forcedAside.value && !previewVisible.value,
31
+ );
32
+
33
+ const typeClass = props.type === AsideType.Major ? $style.major : $style.minor;
34
+
35
+ onMounted(() => {
36
+ mounted.value = true;
37
+
38
+ clickTargets[props.type].push(
39
+ ...[switchElement.value!, asideElement.value!],
40
+ );
41
+ });
42
+
43
+ function switchClick() {
44
+ forcedAside.value = props.type;
45
+ }
46
+ </script>
47
+
48
+ <template>
49
+ <div
50
+ ref="switchElement"
51
+ @click="switchClick"
52
+ :class="[
53
+ $style.asideSwitch,
54
+ typeClass,
55
+ canShowSwitch ? $style.visible : '',
56
+ ]"
57
+ >
58
+ <MyIcon name="aside-open" />
59
+ </div>
60
+
61
+ <aside
62
+ ref="asideElement"
63
+ :class="[
64
+ $style.aside,
65
+ typeClass,
66
+ asideForceVisible ? $style.forceVisible : '',
67
+ ]"
68
+ >
69
+ <slot></slot>
70
+ <div :class="$style.innerShadow"></div>
71
+ </aside>
72
+ </template>
73
+
74
+ <style lang="scss" module>
75
+ @use '$/def/bp';
76
+ @use '$/def/z';
77
+ @use '$/def/size';
78
+
79
+ // !!
80
+ // !!
81
+ // !! Rewrite the whole logic based on coords relative to main content. It will be 1000% easier. See how <Preview> is implemented!
82
+ // !!
83
+ // !!
84
+
85
+ @function maxLayoutEdge() {
86
+ @return calc(
87
+ 50% - min(var(--wMainMax), calc(100% - 2 * var(--wAside))) / 2
88
+ );
89
+ }
90
+
91
+ @mixin ___asidePositionLogic {
92
+ /* For God's sake, don't ever touch this code */
93
+
94
+ --_pos: var(--_posHidden); // Start with hidden position (mobile first)
95
+
96
+ --_posHidden: calc(-1 * var(--wAside));
97
+ --_posVisible: var(--_posVisibleCorner);
98
+
99
+ --_posVisibleCorner: 0;
100
+ --_posVisibleMax: calc(#{maxLayoutEdge()} - var(--wAside));
101
+
102
+ &.major.forceVisible,
103
+ &.minor.forceVisible {
104
+ --_pos: var(--_posVisible); // Always visible when forced
105
+ }
106
+
107
+ &.major {
108
+ left: var(--_pos);
109
+
110
+ @include bp.above('aside1') {
111
+ --_posVisible: var(--_posVisibleCorner);
112
+ --_pos: var(--_posVisible);
113
+ }
114
+
115
+ @include bp.above('aside2') {
116
+ --_posVisible: var(--_posVisibleMax);
117
+ }
118
+ }
119
+
120
+ &.minor {
121
+ right: var(--_pos);
122
+
123
+ @include bp.above('aside2') {
124
+ --_posVisible: var(--_posVisibleMax);
125
+ --_pos: var(--_posVisible);
126
+ }
127
+ }
128
+ }
129
+
130
+ .aside {
131
+ //
132
+ // Global
133
+ //
134
+
135
+ position: fixed;
136
+ z-index: z.$aside;
137
+ top: 0;
138
+
139
+ width: var(--wAside);
140
+ height: 100dvh;
141
+
142
+ background: var(--bgAside);
143
+ backdrop-filter: initial;
144
+
145
+ --shadowColor: #{rgba(black, 0.065)};
146
+
147
+ @include transition(left, right, background, backdrop-filter, box-shadow);
148
+
149
+ @include dark {
150
+ --shadowColor: #{rgba(white, 0.075)};
151
+ }
152
+
153
+ //
154
+
155
+ @include ___asidePositionLogic;
156
+
157
+ //
158
+ // Global States
159
+ //
160
+
161
+ @mixin asideVisible {
162
+ }
163
+
164
+ @mixin asideHidden {
165
+ }
166
+
167
+ @mixin asideModal {
168
+ background: color-mix(
169
+ in srgb,
170
+ color-mix(in srgb, var(--bgAside), black 0%),
171
+ transparent 22%
172
+ );
173
+ backdrop-filter: blur(10px);
174
+
175
+ box-shadow:
176
+ 0px 0px 15px 15px rgba(0, 0, 0, 0.1),
177
+ 0px 0px 8px 0px rgba(0, 0, 0, 0.1);
178
+
179
+ @include dark {
180
+ background: color-mix(in srgb, var(--bgAside), transparent 10%);
181
+
182
+ box-shadow:
183
+ 0px 0px 15px 15px rgba(255, 255, 255, 0.025),
184
+ 0px 0px 8px 0px rgba(255, 255, 255, 0.03);
185
+ }
186
+ }
187
+
188
+ &.major {
189
+ //
190
+ // Major Aside
191
+ //
192
+
193
+ box-shadow: -1px 0px 2px 0px var(--shadowColor);
194
+
195
+ @include bp.above('aside1') {
196
+ //
197
+ // Major Visible
198
+ //
199
+
200
+ @include asideVisible;
201
+ }
202
+
203
+ @include bp.below('aside1') {
204
+ //
205
+ // Major Hidden
206
+ //
207
+
208
+ @include asideHidden;
209
+
210
+ &.forceVisible {
211
+ //
212
+ // Major Modal
213
+ //
214
+
215
+ @include asideModal;
216
+ }
217
+ }
218
+ }
219
+
220
+ &.minor {
221
+ //
222
+ // Minor Aside
223
+ //
224
+
225
+ box-shadow: 1px 0px 2px 0px var(--shadowColor);
226
+
227
+ @include bp.above('aside2') {
228
+ //
229
+ // Minor Visible
230
+ //
231
+
232
+ @include asideVisible;
233
+ }
234
+
235
+ @include bp.below('aside2') {
236
+ //
237
+ // Minor Hidden
238
+ //
239
+
240
+ @include asideHidden;
241
+
242
+ &.forceVisible {
243
+ //
244
+ // Minor Modal
245
+ //
246
+
247
+ @include asideModal;
248
+ }
249
+ }
250
+ }
251
+ }
252
+
253
+ //
254
+ //
255
+ //
256
+
257
+ @mixin ___switchPositionLogic {
258
+ /* For God's sake, don't ever touch this code */
259
+
260
+ --_switchSize: calc(var(--iconSize) + 2 * var(--p) + var(--m));
261
+
262
+ --_pos: var(--_posHidden);
263
+
264
+ --_posVisible: calc(var(--_posHidden) + var(--_switchSize));
265
+ --_posHidden: var(--_posBehindCorner);
266
+
267
+ --_posBehindCorner: calc(-1 * var(--_switchSize));
268
+ --_posBehindMajorAside: calc(var(--wAside) - var(--_switchSize));
269
+ --_posBehindFullLayout: calc(#{maxLayoutEdge()} - var(--_switchSize));
270
+
271
+ &.visible {
272
+ --_pos: var(--_posVisible);
273
+ }
274
+
275
+ &.major {
276
+ left: var(--_pos);
277
+
278
+ @include bp.above('aside1') {
279
+ --_posHidden: var(--_posBehindMajorAside);
280
+ --_posVisible: var(--_posHidden);
281
+ }
282
+ }
283
+
284
+ &.minor {
285
+ right: var(--_pos);
286
+
287
+ @include bp.above('aside2') {
288
+ --_posVisible: var(--_posHidden);
289
+ }
290
+ }
291
+
292
+ &.major,
293
+ &.minor {
294
+ @include bp.above('aside2') {
295
+ --_posHidden: var(--_posBehindFullLayout);
296
+ }
297
+ }
298
+ }
299
+
300
+ .asideSwitch {
301
+ --iconSize: 36px;
302
+ --p: 12px;
303
+ --m: var(--gapBig);
304
+
305
+ //
306
+
307
+ position: fixed;
308
+ z-index: z.$asideSwitch;
309
+ bottom: 0;
310
+
311
+ font-size: var(--iconSize);
312
+ padding: var(--p);
313
+ margin: var(--gapBig);
314
+
315
+ background: #8c8c8c;
316
+ color: var(--bgMain);
317
+ box-shadow: 0px 0px 20px 20px var(--bgMain);
318
+ opacity: 0.95;
319
+
320
+ cursor: pointer;
321
+
322
+ @include transition(left, right, opacity, box-shadow);
323
+
324
+ @include dark {
325
+ background: #8c8c8c;
326
+ }
327
+
328
+ &:hover {
329
+ opacity: 1;
330
+ }
331
+
332
+ &.minor {
333
+ svg {
334
+ transform: scaleX(-1);
335
+ }
336
+ }
337
+
338
+ @mixin invisible {
339
+ box-shadow: none; /* TODO: Fix missing fade-out transition! */
340
+ }
341
+
342
+ //
343
+
344
+ @include ___switchPositionLogic;
345
+
346
+ &:not(.visible) {
347
+ @include invisible;
348
+ }
349
+ &.major {
350
+ @include bp.above('aside1') {
351
+ @include invisible;
352
+ }
353
+ }
354
+ @include bp.above('aside2') {
355
+ @include invisible;
356
+ }
357
+ }
358
+
359
+ //
360
+ //
361
+ //
362
+
363
+ .innerShadow {
364
+ position: absolute;
365
+ z-index: 9999;
366
+ top: 0;
367
+ width: 30px;
368
+ height: 100%;
369
+ pointer-events: none;
370
+ touch-action: none;
371
+ box-shadow: -1px 0px 2px 0px
372
+ color-mix(in srgb, var(--invert), transparent 93%) inset;
373
+
374
+ @include transition(box-shadow);
375
+
376
+ .major & {
377
+ right: 0;
378
+
379
+ @include bp.below('aside1') {
380
+ box-shadow: none;
381
+ }
382
+ }
383
+
384
+ .minor & {
385
+ left: 0;
386
+ transform: scaleX(-1);
387
+
388
+ @include bp.below('aside2') {
389
+ box-shadow: none;
390
+ }
391
+ }
392
+ }
393
+ </style>