clarity-theme 0.1.0 → 0.1.2

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 (154) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +70 -4
  3. package/README.zh-CN.md +67 -4
  4. package/nuxt.config.ts +217 -214
  5. package/package.json +35 -37
  6. package/{app → src}/app.config.ts +110 -110
  7. package/{app → src}/app.vue +5 -5
  8. package/{app → src}/components/blog/BlogAside.vue +25 -25
  9. package/{app → src}/components/blog/BlogFooter.vue +25 -25
  10. package/{app → src}/components/blog/BlogHeader.global.vue +48 -48
  11. package/{app → src}/components/blog/BlogPanel.vue +43 -43
  12. package/{app → src}/components/blog/BlogSidebar.vue +53 -53
  13. package/{app → src}/components/blog/BlogWidget.vue +42 -42
  14. package/{app → src}/components/blog/Mask.vue +25 -25
  15. package/{app → src}/components/blog/SkipToContent.vue +9 -9
  16. package/{app → src}/components/blog/ThemeToggle.vue +22 -22
  17. package/{app → src}/components/content/Badge.vue +45 -45
  18. package/{app → src}/components/content/Blur.vue +14 -14
  19. package/{app → src}/components/content/CardList.vue +8 -8
  20. package/{app → src}/components/content/Chat.vue +41 -41
  21. package/{app → src}/components/content/Copy.vue +71 -71
  22. package/{app → src}/components/content/EmojiClock.vue +49 -49
  23. package/{app → src}/components/content/FeedCard.vue +96 -96
  24. package/{app → src}/components/content/FeedGroup.vue +61 -61
  25. package/{app → src}/components/content/Folding.vue +19 -19
  26. package/{app → src}/components/content/Key.vue +143 -143
  27. package/{app → src}/components/content/LinkBanner.vue +27 -27
  28. package/{app → src}/components/content/LinkCard.vue +28 -28
  29. package/{app → src}/components/content/MdTitle.vue +8 -8
  30. package/{app → src}/components/content/Mermaid.vue +99 -99
  31. package/{app → src}/components/content/MusicScore.vue +63 -63
  32. package/{app → src}/components/content/Pic.vue +49 -49
  33. package/{app → src}/components/content/Poetry.vue +27 -27
  34. package/{app → src}/components/content/ProseA.vue +24 -24
  35. package/{app → src}/components/content/ProseCode.vue +16 -16
  36. package/{app → src}/components/content/ProsePre.vue +117 -117
  37. package/{app → src}/components/content/ProseTable.vue +23 -23
  38. package/{app → src}/components/content/Quote.vue +21 -21
  39. package/{app → src}/components/content/Tab.vue +32 -32
  40. package/{app → src}/components/content/Timeline.vue +33 -33
  41. package/{app → src}/components/content/Tip.vue +40 -40
  42. package/{app → src}/components/content/VideoEmbed.vue +112 -112
  43. package/{app → src}/components/partial/Button.vue +36 -36
  44. package/{app → src}/components/partial/DlGroup.vue +31 -31
  45. package/{app → src}/components/partial/Dropdown.vue +21 -21
  46. package/{app → src}/components/partial/Error.vue +39 -39
  47. package/{app → src}/components/partial/Expand.vue +26 -26
  48. package/{app → src}/components/partial/IconNavList.vue +24 -24
  49. package/{app → src}/components/partial/Pagination.vue +62 -62
  50. package/{app → src}/components/partial/RadioGroup.vue +30 -30
  51. package/{app → src}/components/partial/Secret.vue +11 -11
  52. package/{app → src}/components/partial/Slider.vue +48 -48
  53. package/{app → src}/components/partial/Toggle.vue +17 -17
  54. package/{app → src}/components/popover/Lightbox.vue +44 -44
  55. package/{app → src}/components/popover/Search.vue +143 -143
  56. package/{app → src}/components/popover/SearchItem.vue +28 -28
  57. package/{app → src}/components/post/Archive.vue +40 -40
  58. package/{app → src}/components/post/Article.vue +49 -49
  59. package/{app → src}/components/post/Comment.vue +119 -119
  60. package/{app → src}/components/post/Excerpt.vue +40 -40
  61. package/{app → src}/components/post/OrderToggle.vue +70 -70
  62. package/{app → src}/components/post/PostFooter.vue +52 -52
  63. package/{app → src}/components/post/PostHeader.vue +66 -66
  64. package/{app → src}/components/post/PostSurround.vue +51 -51
  65. package/{app → src}/components/post/Slide.vue +85 -85
  66. package/{app → src}/components/util/Date.vue +62 -62
  67. package/{app → src}/components/util/HydrateSafe.vue +10 -10
  68. package/{app → src}/components/util/Img.vue +38 -38
  69. package/{app → src}/components/util/Link.vue +11 -11
  70. package/{app → src}/components/widget/BlogLog.vue +23 -23
  71. package/{app → src}/components/widget/BlogStats.vue +38 -38
  72. package/{app → src}/components/widget/BlogTech.vue +57 -57
  73. package/{app → src}/components/widget/Empty.vue +3 -3
  74. package/{app → src}/components/widget/Toc.vue +67 -67
  75. package/{app → src}/composables/useArticle.ts +115 -115
  76. package/{app → src}/composables/useAvoid.ts +87 -87
  77. package/{app → src}/composables/useCopy.ts +21 -21
  78. package/{app → src}/composables/usePagination.ts +70 -70
  79. package/{app → src}/composables/useShiki.ts +129 -129
  80. package/{app → src}/composables/useToc.ts +57 -57
  81. package/{app → src}/composables/useWidgets.ts +56 -56
  82. package/{config → src/config}/app.ts +62 -62
  83. package/{config → src/config}/content.ts +75 -75
  84. package/{config → src/config}/define.ts +3 -3
  85. package/src/config/feeds.empty.ts +6 -0
  86. package/{config → src/config}/index.ts +1 -1
  87. package/{config → src/config}/schema.ts +89 -89
  88. package/{app → src}/error.vue +31 -31
  89. package/{img → src/img}/index.ts +2 -2
  90. package/{app → src}/layouts/default.vue +25 -25
  91. package/{modules → src/modules}/clarity-config/index.ts +168 -162
  92. package/src/modules/clarity-source-layout/index.ts +78 -0
  93. package/{app → src}/pages/[...slug].vue +59 -59
  94. package/{app → src}/pages/archive.vue +129 -129
  95. package/{app → src}/pages/index.vue +76 -76
  96. package/{app → src}/pages/link.vue +62 -62
  97. package/{app → src}/pages/preview.vue +46 -46
  98. package/{app → src}/plugins/easter-egg.ts +23 -23
  99. package/{app → src}/plugins/init.ts +6 -6
  100. package/{app → src}/plugins/tippy.ts +22 -22
  101. package/{public → src/public}/assets/atom.css +274 -274
  102. package/{public → src/public}/assets/atom.xsl +109 -109
  103. package/{remark-plugins → src/remark-plugins}/rehype-meta-slots.ts +58 -58
  104. package/{remark-plugins → src/remark-plugins}/remark-code-component.ts +41 -41
  105. package/{server → src/server}/api/stats.get.ts +84 -83
  106. package/{server → src/server}/routes/atom.xml.get.ts +85 -85
  107. package/{server → src/server}/routes/subscriptions.opml.get.ts +64 -64
  108. package/{shared → src/shared}/utils/clarity.ts +24 -24
  109. package/{shared → src/shared}/utils/icon.ts +218 -218
  110. package/{shared → src/shared}/utils/link.ts +52 -52
  111. package/{shared → src/shared}/utils/str.ts +88 -88
  112. package/{shared → src/shared}/utils/time.ts +115 -115
  113. package/{app → src}/shiki.config.ts +8 -8
  114. package/{app → src}/stores/layout.ts +34 -34
  115. package/{app → src}/stores/search.ts +37 -37
  116. package/{app → src}/types/article.ts +16 -16
  117. package/src/types/feed.ts +1 -0
  118. package/{app → src}/types/index.ts +14 -14
  119. package/{app → src}/types/nav.ts +11 -11
  120. package/{app → src}/utils/anim.ts +37 -37
  121. package/{app → src}/utils/img.ts +83 -83
  122. package/app/types/feed.ts +0 -1
  123. package/config/feeds.empty.ts +0 -4
  124. package/{app → src}/assets/css/_variable.scss +0 -0
  125. package/{app → src}/assets/css/animation.scss +0 -0
  126. package/{app → src}/assets/css/article.scss +0 -0
  127. package/{app → src}/assets/css/color.scss +0 -0
  128. package/{app → src}/assets/css/font.scss +0 -0
  129. package/{app → src}/assets/css/main.scss +0 -0
  130. package/{app → src}/assets/css/reusable.scss +0 -0
  131. package/{app → src}/assets/icons/solar-rewind-back-bold-duotone.svg +0 -0
  132. package/{app → src}/assets/icons/solar-rewind-forward-bold-duotone.svg +0 -0
  133. package/{app → src}/components/content/Alert.vue +0 -0
  134. package/{config → src/config}/content.d.mts +0 -0
  135. package/{config → src/config}/content.mjs +0 -0
  136. package/{config → src/config}/define.mjs +0 -0
  137. package/{config → src/config}/feed.ts +0 -0
  138. package/{config → src/config}/index.d.mts +0 -0
  139. package/{config → src/config}/index.mjs +0 -0
  140. package/{config → src/config}/public.ts +1 -1
  141. package/{config → src/config}/schema.d.mts +0 -0
  142. package/{config → src/config}/schema.mjs +0 -0
  143. package/{config → src/config}/server.ts +1 -1
  144. /package/{img → src/img}/index.d.mts +0 -0
  145. /package/{img → src/img}/index.mjs +0 -0
  146. /package/{modules → src/modules}/clarity-config/anti-mirror-client.ts +0 -0
  147. /package/{public → src/public}/fonts/AlimamaFangYuanTi.woff2 +0 -0
  148. /package/{remark-plugins → src/remark-plugins}/rehype-meta-slots.d.mts +0 -0
  149. /package/{remark-plugins → src/remark-plugins}/rehype-meta-slots.mjs +0 -0
  150. /package/{remark-plugins → src/remark-plugins}/remark-code-component.d.mts +0 -0
  151. /package/{remark-plugins → src/remark-plugins}/remark-code-component.mjs +0 -0
  152. /package/{server → src/server}/utils/clarity.ts +0 -0
  153. /package/{shared → src/shared}/types/content.ts +0 -0
  154. /package/{app → src}/types/modal.ts +0 -0
@@ -1,23 +1,23 @@
1
- export default defineNuxtPlugin(() => {
2
- const dir = useTextDirection()
3
- const konamiCode = ['ArrowUp', 'ArrowUp', 'ArrowDown', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'ArrowLeft', 'ArrowRight', 'KeyB', 'KeyA']
4
- let currentStep = 0
5
-
6
- function step(step: boolean, resetForward: boolean) {
7
- if (step === false) {
8
- currentStep = resetForward ? 1 : 0
9
- return
10
- }
11
-
12
- currentStep++
13
-
14
- if (currentStep === konamiCode.length) {
15
- dir.value = dir.value === 'ltr' ? 'rtl' : 'ltr'
16
- currentStep = 0
17
- }
18
- }
19
-
20
- useEventListener('keydown', ({ code }) => {
21
- step(code === konamiCode[currentStep], code === konamiCode[0])
22
- })
23
- })
1
+ export default defineNuxtPlugin(() => {
2
+ const dir = useTextDirection()
3
+ const konamiCode = ['ArrowUp', 'ArrowUp', 'ArrowDown', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'ArrowLeft', 'ArrowRight', 'KeyB', 'KeyA']
4
+ let currentStep = 0
5
+
6
+ function step(step: boolean, resetForward: boolean) {
7
+ if (step === false) {
8
+ currentStep = resetForward ? 1 : 0
9
+ return
10
+ }
11
+
12
+ currentStep++
13
+
14
+ if (currentStep === konamiCode.length) {
15
+ dir.value = dir.value === 'ltr' ? 'rtl' : 'ltr'
16
+ currentStep = 0
17
+ }
18
+ }
19
+
20
+ useEventListener('keydown', ({ code }) => {
21
+ step(code === konamiCode[currentStep], code === konamiCode[0])
22
+ })
23
+ })
@@ -1,6 +1,6 @@
1
- export default defineNuxtPlugin(() => {
2
- // 开发环境禁用 Umami 统计
3
- if (import.meta.client && import.meta.dev) {
4
- localStorage.setItem('umami.disabled', 'true')
5
- }
6
- })
1
+ export default defineNuxtPlugin(() => {
2
+ // 开发环境禁用 Umami 统计
3
+ if (import.meta.client && import.meta.dev) {
4
+ localStorage.setItem('umami.disabled', 'true')
5
+ }
6
+ })
@@ -1,22 +1,22 @@
1
- import type { directive, Tippy } from 'vue-tippy'
2
- import VueTippy, { roundArrow } from 'vue-tippy'
3
- import 'tippy.js/dist/svg-arrow.css'
4
-
5
- declare module 'vue' {
6
- interface GlobalComponents {
7
- Tooltip: typeof Tippy
8
- }
9
- interface GlobalDirectives {
10
- vTip: typeof directive
11
- }
12
- }
13
-
14
- export default defineNuxtPlugin((nuxtApp) => {
15
- nuxtApp.vueApp.use(VueTippy, {
16
- component: 'Tooltip',
17
- directive: 'tip',
18
- defaultProps: {
19
- arrow: roundArrow,
20
- },
21
- })
22
- })
1
+ import type { directive, Tippy } from 'vue-tippy'
2
+ import VueTippy, { roundArrow } from 'vue-tippy'
3
+ import 'tippy.js/dist/svg-arrow.css'
4
+
5
+ declare module 'vue' {
6
+ interface GlobalComponents {
7
+ Tooltip: typeof Tippy
8
+ }
9
+ interface GlobalDirectives {
10
+ vTip: typeof directive
11
+ }
12
+ }
13
+
14
+ export default defineNuxtPlugin((nuxtApp) => {
15
+ nuxtApp.vueApp.use(VueTippy, {
16
+ component: 'Tooltip',
17
+ directive: 'tip',
18
+ defaultProps: {
19
+ arrow: roundArrow,
20
+ },
21
+ })
22
+ })
@@ -1,274 +1,274 @@
1
- :root {
2
- --xsl-bg-1: #F3F7F9;
3
- --xsl-bg-alt: #FFF;
4
- --xsl-text-1: #333;
5
- --xsl-text-2: #666;
6
- --xsl-text-3: #999;
7
- --xsl-shadow-1: 0 0.1em 0.2em rgb(0 0 0 / 10%);
8
- --xsl-shadow-2: 0 0.4em 0.5em rgb(0 0 0 / 15%);
9
-
10
- background-color: var(--xsl-bg-1);
11
- font-family: Inter, sans-serif;
12
- line-height: 1.6;
13
- text-autospace: normal;
14
- color: var(--xsl-text-1);
15
- color-scheme: light dark;
16
- transition: background-color 0.3s, color 0.1s;
17
- }
18
-
19
- @media (prefers-color-scheme: dark) {
20
- :root {
21
- --xsl-bg-1: #1E1E1E;
22
- --xsl-bg-alt: #333;
23
- --xsl-text-1: #EEE;
24
- --xsl-text-2: #AAA;
25
- --xsl-text-3: #666;
26
- --xsl-shadow-1: 0 0.1em 0.2em rgb(255 255 255 / 10%);
27
- --xsl-shadow-2: 0 0.4em 0.5em rgb(255 255 255 / 15%);
28
-
29
- color-scheme: dark;
30
- }
31
- }
32
-
33
- body {
34
- max-width: 800px;
35
- margin: 0 auto;
36
- padding: 20px;
37
- }
38
-
39
- @font-face {
40
- font-family: AlimamaFangYuanTi;
41
- src: url("/fonts/AlimamaFangYuanTi.woff2");
42
- }
43
-
44
- * {
45
- margin: 0;
46
- padding: 0;
47
- }
48
-
49
- a {
50
- text-decoration: none;
51
- color: inherit;
52
- }
53
-
54
- p {
55
- margin: 0.5em 0;
56
- }
57
-
58
- blockquote {
59
- margin: 1em 0;
60
- padding: 0 0.8em;
61
- border-inline-start: 0.2em solid var(--xsl-text-3);
62
- }
63
-
64
- code, pre {
65
- text-autospace: none;
66
- }
67
-
68
- .logo-header {
69
- display: flex;
70
- align-items: center;
71
- gap: 0.5em;
72
- margin: 0.5em 0;
73
- font-size: clamp(1em, 5vw, 1.5em);
74
- line-height: 1.4;
75
- }
76
-
77
- .logo {
78
- height: 2.4em;
79
- border-radius: 50%;
80
- corner-shape: superellipse(1.2);
81
- box-shadow: var(--xsl-shadow-1);
82
- }
83
-
84
- .title {
85
- font-family: AlimamaFangYuanTi, sans-serif;
86
- font-variation-settings: "wght" 600, "BEVL" 100;
87
- font-size: 1.2em;
88
- }
89
-
90
- .subtitle {
91
- font-size: 0.8em;
92
- color: var(--xsl-text-2);
93
- }
94
-
95
- .entry {
96
- contain: paint;
97
- display: block;
98
- margin: 1em 0;
99
- border-radius: 0.8em;
100
- box-shadow: var(--xsl-shadow-1);
101
- background-color: var(--xsl-bg-alt);
102
- transition: all 0.2s;
103
- }
104
-
105
- .entry > article {
106
- display: grid;
107
- gap: 0.5em;
108
- padding: 1em;
109
- }
110
-
111
- .entry:hover {
112
- box-shadow: var(--xsl-shadow-2);
113
- transform: translateY(-0.1em);
114
- }
115
-
116
- .entry:hover > .entry-image {
117
- opacity: 1;
118
- }
119
-
120
- .entry-title {
121
- font-size: 1.2em;
122
- color: var(--xsl-text-1);
123
- }
124
-
125
- .entry-meta {
126
- font-size: 0.9em;
127
- color: var(--xsl-text-2);
128
- }
129
-
130
- .entry-summary {
131
- font-size: 0.9em;
132
- color: var(--xsl-text-2);
133
- }
134
-
135
- .entry-summary:empty {
136
- display: none;
137
- }
138
-
139
- .entry-image {
140
- position: absolute;
141
- opacity: 0.8;
142
- top: 0;
143
- right: 0;
144
- width: min(320px, 50%);
145
- height: 100%;
146
- margin: 0;
147
- mask-image: linear-gradient(to right, transparent, #FFF 50%);
148
- transition: opacity 0.2s;
149
- object-fit: cover;
150
- }
151
-
152
- img {
153
- contain: layout;
154
- display: inline-block;
155
-
156
- &::before {
157
- position: absolute;
158
- inset: 0;
159
- }
160
-
161
- &::before {
162
- content: attr(alt);
163
- display: grid;
164
- place-content: center;
165
- overflow: visible;
166
- padding: 0.5em;
167
- background-color: var(--xsl-bg-alt);
168
- font-size: 1.5em;
169
- font-weight: bold;
170
- line-height: 1.2;
171
- word-break: normal;
172
- text-align: center;
173
- text-shadow: none;
174
- color: var(--xsl-text-3);
175
- }
176
- }
177
-
178
- .entry-image + article {
179
- position: relative;
180
- width: 60%;
181
- }
182
-
183
- @media (max-width: 600px) {
184
- .entry-image {
185
- position: revert;
186
- width: 100%;
187
- height: auto;
188
- max-width: none;
189
- max-height: 256px;
190
- aspect-ratio: 2.4;
191
- margin-bottom: -10%;
192
- mask-image: linear-gradient(#FFF 50%, transparent);
193
- }
194
-
195
- .entry-image + article {
196
- width: auto;
197
- }
198
- }
199
-
200
- .entry-content-container {
201
- display: none;
202
- }
203
-
204
- .entry-content-container:target {
205
- display: flex;
206
- align-items: center;
207
- justify-content: center;
208
- position: fixed;
209
- inset: 0;
210
- z-index: 1;
211
- }
212
-
213
- .entry-content {
214
- position: relative;
215
- overflow: auto;
216
- max-width: min(80%, 50rem);
217
- max-height: 80%;
218
- padding: 1.5em 2em;
219
- border-radius: 0.8em;
220
- box-shadow: var(--xsl-shadow-2);
221
- background-color: var(--xsl-bg-1);
222
- }
223
-
224
- .entry-content > figcaption {
225
- margin-bottom: 1em;
226
- font-size: 1.2em;
227
- font-weight: bold;
228
- text-align: center;
229
- }
230
-
231
- .entry-content img {
232
- height: auto;
233
- max-width: 100%;
234
- border-radius: 0.2em;
235
- }
236
-
237
- .entry-content-close {
238
- position: absolute;
239
- top: 1em;
240
- right: 1em;
241
- font-size: 2em;
242
- line-height: 1;
243
- color: white;
244
- }
245
-
246
- .entry-content-close::before {
247
- content: "";
248
- position: fixed;
249
- inset: 0;
250
- background-color: rgb(0 0 0 / 70%);
251
- cursor: default;
252
- z-index: -2;
253
- }
254
-
255
- .view-full {
256
- position: fixed;
257
- bottom: 1em;
258
- left: 50%;
259
- padding: 0.5em 1em;
260
- border-radius: 0.8em;
261
- background-color: var(--xsl-bg-alt);
262
- font-size: 1.2em;
263
- font-weight: bold;
264
- text-align: center;
265
- color: var(--xsl-text-1);
266
- transform: translateX(-50%);
267
- }
268
-
269
- footer {
270
- margin-top: 2em;
271
- font-size: 0.8em;
272
- text-align: center;
273
- color: var(--xsl-text-2);
274
- }
1
+ :root {
2
+ --xsl-bg-1: #F3F7F9;
3
+ --xsl-bg-alt: #FFF;
4
+ --xsl-text-1: #333;
5
+ --xsl-text-2: #666;
6
+ --xsl-text-3: #999;
7
+ --xsl-shadow-1: 0 0.1em 0.2em rgb(0 0 0 / 10%);
8
+ --xsl-shadow-2: 0 0.4em 0.5em rgb(0 0 0 / 15%);
9
+
10
+ background-color: var(--xsl-bg-1);
11
+ font-family: Inter, sans-serif;
12
+ line-height: 1.6;
13
+ text-autospace: normal;
14
+ color: var(--xsl-text-1);
15
+ color-scheme: light dark;
16
+ transition: background-color 0.3s, color 0.1s;
17
+ }
18
+
19
+ @media (prefers-color-scheme: dark) {
20
+ :root {
21
+ --xsl-bg-1: #1E1E1E;
22
+ --xsl-bg-alt: #333;
23
+ --xsl-text-1: #EEE;
24
+ --xsl-text-2: #AAA;
25
+ --xsl-text-3: #666;
26
+ --xsl-shadow-1: 0 0.1em 0.2em rgb(255 255 255 / 10%);
27
+ --xsl-shadow-2: 0 0.4em 0.5em rgb(255 255 255 / 15%);
28
+
29
+ color-scheme: dark;
30
+ }
31
+ }
32
+
33
+ body {
34
+ max-width: 800px;
35
+ margin: 0 auto;
36
+ padding: 20px;
37
+ }
38
+
39
+ @font-face {
40
+ font-family: AlimamaFangYuanTi;
41
+ src: url("/fonts/AlimamaFangYuanTi.woff2");
42
+ }
43
+
44
+ * {
45
+ margin: 0;
46
+ padding: 0;
47
+ }
48
+
49
+ a {
50
+ text-decoration: none;
51
+ color: inherit;
52
+ }
53
+
54
+ p {
55
+ margin: 0.5em 0;
56
+ }
57
+
58
+ blockquote {
59
+ margin: 1em 0;
60
+ padding: 0 0.8em;
61
+ border-inline-start: 0.2em solid var(--xsl-text-3);
62
+ }
63
+
64
+ code, pre {
65
+ text-autospace: none;
66
+ }
67
+
68
+ .logo-header {
69
+ display: flex;
70
+ align-items: center;
71
+ gap: 0.5em;
72
+ margin: 0.5em 0;
73
+ font-size: clamp(1em, 5vw, 1.5em);
74
+ line-height: 1.4;
75
+ }
76
+
77
+ .logo {
78
+ height: 2.4em;
79
+ border-radius: 50%;
80
+ corner-shape: superellipse(1.2);
81
+ box-shadow: var(--xsl-shadow-1);
82
+ }
83
+
84
+ .title {
85
+ font-family: AlimamaFangYuanTi, sans-serif;
86
+ font-variation-settings: "wght" 600, "BEVL" 100;
87
+ font-size: 1.2em;
88
+ }
89
+
90
+ .subtitle {
91
+ font-size: 0.8em;
92
+ color: var(--xsl-text-2);
93
+ }
94
+
95
+ .entry {
96
+ contain: paint;
97
+ display: block;
98
+ margin: 1em 0;
99
+ border-radius: 0.8em;
100
+ box-shadow: var(--xsl-shadow-1);
101
+ background-color: var(--xsl-bg-alt);
102
+ transition: all 0.2s;
103
+ }
104
+
105
+ .entry > article {
106
+ display: grid;
107
+ gap: 0.5em;
108
+ padding: 1em;
109
+ }
110
+
111
+ .entry:hover {
112
+ box-shadow: var(--xsl-shadow-2);
113
+ transform: translateY(-0.1em);
114
+ }
115
+
116
+ .entry:hover > .entry-image {
117
+ opacity: 1;
118
+ }
119
+
120
+ .entry-title {
121
+ font-size: 1.2em;
122
+ color: var(--xsl-text-1);
123
+ }
124
+
125
+ .entry-meta {
126
+ font-size: 0.9em;
127
+ color: var(--xsl-text-2);
128
+ }
129
+
130
+ .entry-summary {
131
+ font-size: 0.9em;
132
+ color: var(--xsl-text-2);
133
+ }
134
+
135
+ .entry-summary:empty {
136
+ display: none;
137
+ }
138
+
139
+ .entry-image {
140
+ position: absolute;
141
+ opacity: 0.8;
142
+ top: 0;
143
+ right: 0;
144
+ width: min(320px, 50%);
145
+ height: 100%;
146
+ margin: 0;
147
+ mask-image: linear-gradient(to right, transparent, #FFF 50%);
148
+ transition: opacity 0.2s;
149
+ object-fit: cover;
150
+ }
151
+
152
+ img {
153
+ contain: layout;
154
+ display: inline-block;
155
+
156
+ &::before {
157
+ position: absolute;
158
+ inset: 0;
159
+ }
160
+
161
+ &::before {
162
+ content: attr(alt);
163
+ display: grid;
164
+ place-content: center;
165
+ overflow: visible;
166
+ padding: 0.5em;
167
+ background-color: var(--xsl-bg-alt);
168
+ font-size: 1.5em;
169
+ font-weight: bold;
170
+ line-height: 1.2;
171
+ word-break: normal;
172
+ text-align: center;
173
+ text-shadow: none;
174
+ color: var(--xsl-text-3);
175
+ }
176
+ }
177
+
178
+ .entry-image + article {
179
+ position: relative;
180
+ width: 60%;
181
+ }
182
+
183
+ @media (max-width: 600px) {
184
+ .entry-image {
185
+ position: revert;
186
+ width: 100%;
187
+ height: auto;
188
+ max-width: none;
189
+ max-height: 256px;
190
+ aspect-ratio: 2.4;
191
+ margin-bottom: -10%;
192
+ mask-image: linear-gradient(#FFF 50%, transparent);
193
+ }
194
+
195
+ .entry-image + article {
196
+ width: auto;
197
+ }
198
+ }
199
+
200
+ .entry-content-container {
201
+ display: none;
202
+ }
203
+
204
+ .entry-content-container:target {
205
+ display: flex;
206
+ align-items: center;
207
+ justify-content: center;
208
+ position: fixed;
209
+ inset: 0;
210
+ z-index: 1;
211
+ }
212
+
213
+ .entry-content {
214
+ position: relative;
215
+ overflow: auto;
216
+ max-width: min(80%, 50rem);
217
+ max-height: 80%;
218
+ padding: 1.5em 2em;
219
+ border-radius: 0.8em;
220
+ box-shadow: var(--xsl-shadow-2);
221
+ background-color: var(--xsl-bg-1);
222
+ }
223
+
224
+ .entry-content > figcaption {
225
+ margin-bottom: 1em;
226
+ font-size: 1.2em;
227
+ font-weight: bold;
228
+ text-align: center;
229
+ }
230
+
231
+ .entry-content img {
232
+ height: auto;
233
+ max-width: 100%;
234
+ border-radius: 0.2em;
235
+ }
236
+
237
+ .entry-content-close {
238
+ position: absolute;
239
+ top: 1em;
240
+ right: 1em;
241
+ font-size: 2em;
242
+ line-height: 1;
243
+ color: white;
244
+ }
245
+
246
+ .entry-content-close::before {
247
+ content: "";
248
+ position: fixed;
249
+ inset: 0;
250
+ background-color: rgb(0 0 0 / 70%);
251
+ cursor: default;
252
+ z-index: -2;
253
+ }
254
+
255
+ .view-full {
256
+ position: fixed;
257
+ bottom: 1em;
258
+ left: 50%;
259
+ padding: 0.5em 1em;
260
+ border-radius: 0.8em;
261
+ background-color: var(--xsl-bg-alt);
262
+ font-size: 1.2em;
263
+ font-weight: bold;
264
+ text-align: center;
265
+ color: var(--xsl-text-1);
266
+ transform: translateX(-50%);
267
+ }
268
+
269
+ footer {
270
+ margin-top: 2em;
271
+ font-size: 0.8em;
272
+ text-align: center;
273
+ color: var(--xsl-text-2);
274
+ }