@fecommunity/reactpress-theme-starter 1.0.0-beta.0

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 (163) hide show
  1. package/.env.example +22 -0
  2. package/LICENSE +21 -0
  3. package/README.md +286 -0
  4. package/app/api/[[...path]]/route.ts +69 -0
  5. package/app/archives/page.tsx +28 -0
  6. package/app/article/[id]/page.tsx +92 -0
  7. package/app/category/[category]/page.tsx +60 -0
  8. package/app/globals.css +4969 -0
  9. package/app/knowledge/[pId]/[id]/page.tsx +54 -0
  10. package/app/knowledge/[pId]/page.tsx +47 -0
  11. package/app/knowledge/page.tsx +29 -0
  12. package/app/layout.tsx +76 -0
  13. package/app/llms.txt/route.ts +26 -0
  14. package/app/login/page.tsx +17 -0
  15. package/app/nav/[id]/page.tsx +44 -0
  16. package/app/nav/page.tsx +5 -0
  17. package/app/not-found.tsx +21 -0
  18. package/app/page/[id]/page.tsx +57 -0
  19. package/app/page.tsx +61 -0
  20. package/app/register/page.tsx +17 -0
  21. package/app/robots.ts +14 -0
  22. package/app/rss/route.ts +82 -0
  23. package/app/search/page.tsx +46 -0
  24. package/app/sitemap.ts +38 -0
  25. package/app/suggestions/page.tsx +47 -0
  26. package/app/tag/[tag]/page.tsx +58 -0
  27. package/app/tags/page.tsx +18 -0
  28. package/app/template.tsx +6 -0
  29. package/components/article/ArchiveBanner.tsx +40 -0
  30. package/components/article/ArticleActionsBar.tsx +53 -0
  31. package/components/article/ArticleCarousel.tsx +237 -0
  32. package/components/article/ArticleCopyrightBar.tsx +128 -0
  33. package/components/article/ArticleEndBar.tsx +19 -0
  34. package/components/article/ArticleFeedSection.tsx +59 -0
  35. package/components/article/ArticleList.tsx +170 -0
  36. package/components/article/ArticleReadingChrome.tsx +104 -0
  37. package/components/article/ArticleReadingProgress.tsx +75 -0
  38. package/components/article/ArticleRecommend.tsx +362 -0
  39. package/components/article/ArticleTocPanel.tsx +19 -0
  40. package/components/article/ArticleViewClient.tsx +221 -0
  41. package/components/article/CategoryMenu.tsx +67 -0
  42. package/components/article/CmsPageClient.tsx +92 -0
  43. package/components/article/LoadMore.tsx +59 -0
  44. package/components/article/ReadingContent.tsx +51 -0
  45. package/components/auth/AuthPageClient.tsx +314 -0
  46. package/components/comment/CommentEditor.tsx +290 -0
  47. package/components/comment/CommentEmoji.tsx +110 -0
  48. package/components/comment/CommentIconButton.tsx +37 -0
  49. package/components/comment/CommentItem.tsx +135 -0
  50. package/components/comment/CommentSection.tsx +123 -0
  51. package/components/comment/emojis.ts +152 -0
  52. package/components/knowledge/KnowledgeList.tsx +70 -0
  53. package/components/layout/BackToTop.tsx +27 -0
  54. package/components/layout/ConditionalSiteFooter.tsx +29 -0
  55. package/components/layout/ContentStylesLoader.tsx +9 -0
  56. package/components/layout/DoubleColumnLayout.tsx +171 -0
  57. package/components/layout/HeaderSearch.tsx +23 -0
  58. package/components/layout/LocaleSwitcher.tsx +24 -0
  59. package/components/layout/PageContainer.tsx +11 -0
  60. package/components/layout/PageLoadProgress.tsx +169 -0
  61. package/components/layout/SiteFooter.tsx +75 -0
  62. package/components/layout/SiteHeader.tsx +312 -0
  63. package/components/layout/SystemNotification.tsx +176 -0
  64. package/components/layout/ThemeSwitch.tsx +19 -0
  65. package/components/layout/UserAuth.tsx +130 -0
  66. package/components/search/SearchHero.tsx +323 -0
  67. package/components/search/SearchQuickLinks.tsx +285 -0
  68. package/components/shared/DevChunkRecovery.tsx +8 -0
  69. package/components/shared/Link.tsx +30 -0
  70. package/components/shared/SectionHeading.tsx +38 -0
  71. package/components/shared/ThemeImage.tsx +13 -0
  72. package/components/shared/logo.svg +7 -0
  73. package/components/views/ArchivesClient.tsx +137 -0
  74. package/components/views/CategoryClient.tsx +87 -0
  75. package/components/views/HomeClient.tsx +79 -0
  76. package/components/views/KnowledgeBookClient.tsx +127 -0
  77. package/components/views/KnowledgeChapterClient.tsx +175 -0
  78. package/components/views/KnowledgeClient.tsx +69 -0
  79. package/components/views/LoginClient.tsx +80 -0
  80. package/components/views/NavDetailClient.tsx +177 -0
  81. package/components/views/SearchClient.tsx +100 -0
  82. package/components/views/TagArchiveClient.tsx +105 -0
  83. package/components/views/TagsClient.tsx +46 -0
  84. package/components/widgets/AboutUs.tsx +180 -0
  85. package/components/widgets/ArticleActionButton.tsx +95 -0
  86. package/components/widgets/BookmarkWidget.tsx +61 -0
  87. package/components/widgets/CategoriesWidget.tsx +47 -0
  88. package/components/widgets/HomeSidebar.tsx +40 -0
  89. package/components/widgets/LikesWidget.tsx +77 -0
  90. package/components/widgets/ShareWidget.tsx +120 -0
  91. package/components/widgets/TagCloud.tsx +94 -0
  92. package/components/widgets/TagsWidget.tsx +160 -0
  93. package/eslint.config.mjs +80 -0
  94. package/lib/auth/githubOAuth.ts +26 -0
  95. package/lib/auth/sessionUser.ts +41 -0
  96. package/lib/mock-api/auth.ts +129 -0
  97. package/lib/mock-api/config.ts +11 -0
  98. package/lib/mock-api/cors.ts +53 -0
  99. package/lib/mock-api/data.ts +998 -0
  100. package/lib/mock-api/match-route.ts +202 -0
  101. package/lib/mock-api/proxy.ts +28 -0
  102. package/lib/providers/client.ts +58 -0
  103. package/lib/providers/materializeProvider.ts +9 -0
  104. package/lib/providers/server.ts +8 -0
  105. package/lib/reactpress/appearance.ts +69 -0
  106. package/lib/reactpress/bootstrap.ts +48 -0
  107. package/lib/reactpress/coercePublishedPage.ts +12 -0
  108. package/lib/reactpress/contentSeo.ts +123 -0
  109. package/lib/reactpress/env.ts +31 -0
  110. package/lib/reactpress/feedFooterPlacement.ts +16 -0
  111. package/lib/reactpress/fetchSetting.ts +19 -0
  112. package/lib/reactpress/homeFooter.tsx +27 -0
  113. package/lib/reactpress/layout-shell.tsx +19 -0
  114. package/lib/reactpress/materializeBootstrapCatalog.ts +31 -0
  115. package/lib/reactpress/normalizeApiResponse.ts +25 -0
  116. package/lib/reactpress/providers.tsx +199 -0
  117. package/lib/reactpress/resolveSiteNav.ts +56 -0
  118. package/lib/reactpress/seoMetadata.ts +82 -0
  119. package/lib/reactpress/serverLocale.ts +43 -0
  120. package/lib/reactpress/siteMetadata.ts +151 -0
  121. package/lib/reactpress/staticParams.ts +46 -0
  122. package/lib/reactpress/suggestionsContent.ts +48 -0
  123. package/lib/reactpress/useFeedFooterPlacement.ts +22 -0
  124. package/lib/reactpress/useSiteNavConfig.ts +39 -0
  125. package/lib/utils/archiveBanner.ts +8 -0
  126. package/lib/utils/colors.ts +119 -0
  127. package/lib/utils/comment.ts +46 -0
  128. package/lib/utils/headerPosition.ts +55 -0
  129. package/lib/utils/icons.tsx +238 -0
  130. package/lib/utils/reading.ts +16 -0
  131. package/lib/utils/scroll.ts +8 -0
  132. package/lib/utils/tagCloud.ts +222 -0
  133. package/next.config.js +103 -0
  134. package/package.json +98 -0
  135. package/postcss.config.js +5 -0
  136. package/prettier.config.js +10 -0
  137. package/public/apple-touch-icon.png +0 -0
  138. package/public/cli.png +0 -0
  139. package/public/favicon-32.png +0 -0
  140. package/public/favicon.ico +0 -0
  141. package/public/home-dark.png +0 -0
  142. package/public/home-light.png +0 -0
  143. package/public/icon-192.png +0 -0
  144. package/public/icon-512.png +0 -0
  145. package/public/logo-400.png +0 -0
  146. package/public/logo.png +0 -0
  147. package/public/mobile.png +0 -0
  148. package/public/pad.png +0 -0
  149. package/public/site.webmanifest +19 -0
  150. package/scripts/build-mock.mjs +139 -0
  151. package/scripts/dev.mjs +221 -0
  152. package/scripts/ensure-env.mjs +100 -0
  153. package/scripts/remote-dev.mjs +143 -0
  154. package/scripts/resolve-api-env.mjs +114 -0
  155. package/scripts/set-publish-version.mjs +31 -0
  156. package/scripts/smoke-pages.mjs +113 -0
  157. package/scripts/start-mock.mjs +79 -0
  158. package/scripts/verify-toolkit.mjs +37 -0
  159. package/svg.d.ts +6 -0
  160. package/theme.json +123 -0
  161. package/theme.manifest.schema.json +265 -0
  162. package/tsconfig.json +41 -0
  163. package/vercel.json +12 -0
@@ -0,0 +1,4969 @@
1
+ @import 'tailwindcss';
2
+ @plugin '@tailwindcss/forms';
3
+ @plugin '@tailwindcss/typography';
4
+ @custom-variant dark (&:where(.dark, .dark *));
5
+
6
+ /* Tailwind v4: explicit scan paths (CSS lives in app/, components/lib are siblings). */
7
+ @source '../components/**/*.{js,ts,jsx,tsx}';
8
+ @source '../lib/**/*.{js,ts,jsx,tsx}';
9
+ @source './**/*.{js,ts,jsx,tsx}';
10
+
11
+ /* ReactPress theme variables (aligned with twentytwentyfive) */
12
+ body {
13
+ --primary-color: #f44336;
14
+ --primary-button-bg: #c62828;
15
+ --primary-button-fg: #ffffff;
16
+ --link-color: #4299e1;
17
+ --blink-bg-color: rgba(255, 255, 255, 0.5);
18
+ --border-radius: 8px;
19
+ --bg: #ffffff;
20
+ --bg-second: #f3f5f7;
21
+ --bg-body: #e7eaee;
22
+ --bg-box: var(--bg);
23
+ --bg-code: #f8f8f8;
24
+ --bg-table: var(--bg-code);
25
+ --blockquote-color: rgba(0, 0, 0, 0.65);
26
+ --disable-text-color: rgba(0, 0, 0, 0.55);
27
+ --main-text-color: rgba(0, 0, 0, 0.85);
28
+ --second-text-color: rgba(0, 0, 0, 0.65);
29
+ --border-color: #e5e6eb;
30
+ --box-shadow: 0 1px 3px rgb(18 18 18 / 10%);
31
+ --font-color-base: #ffffff;
32
+ --comment-editor-border-color: #d9d9d9;
33
+ --comment-editor-disable-bg: #f5f5f5;
34
+ }
35
+
36
+ body.dark {
37
+ --primary-color: #ff6b61;
38
+ --primary-button-bg: #c62828;
39
+ --primary-button-fg: #ffffff;
40
+ --link-color: #69b1ff;
41
+ --blink-bg-color: rgba(0, 0, 0, 0);
42
+ --bg: #1e2a36;
43
+ --bg-second: #1a242f;
44
+ --bg-body: var(--bg);
45
+ --bg-box: #1a242f;
46
+ --bg-code: #0b1c2c;
47
+ --bg-table: var(--bg);
48
+ --blockquote-color: #dddbdb;
49
+ --disable-text-color: #8a95a3;
50
+ --main-text-color: #dddbdb;
51
+ --second-text-color: #b8c0cc;
52
+ --border-color: #2f373e;
53
+ --box-shadow: rgba(23, 31, 40, 0.57);
54
+ --comment-editor-border-color: var(--border-color);
55
+ --comment-editor-disable-bg: var(--border-color);
56
+ }
57
+
58
+ html {
59
+ color-scheme: light;
60
+ }
61
+
62
+ html:has(body.dark) {
63
+ color-scheme: dark;
64
+ }
65
+
66
+ /* Core theme configuration */
67
+ @theme {
68
+ /* Font families */
69
+ --font-sans:
70
+ ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol',
71
+ 'Noto Color Emoji';
72
+
73
+ /* Colors */
74
+ --color-primary-50: oklch(0.971 0.014 343.198);
75
+ --color-primary-100: oklch(0.948 0.028 342.258);
76
+ --color-primary-200: oklch(0.899 0.061 343.231);
77
+ --color-primary-300: oklch(0.823 0.12 346.018);
78
+ --color-primary-400: oklch(0.718 0.202 349.761);
79
+ --color-primary-500: oklch(0.656 0.241 354.308);
80
+ --color-primary-600: oklch(0.592 0.249 0.584);
81
+ --color-primary-700: oklch(0.525 0.223 3.958);
82
+ --color-primary-800: oklch(0.459 0.187 3.815);
83
+ --color-primary-900: oklch(0.408 0.153 2.432);
84
+ --color-primary-950: oklch(0.284 0.109 3.907);
85
+
86
+ --color-gray-50: oklch(0.985 0.002 247.839);
87
+ --color-gray-100: oklch(0.967 0.003 264.542);
88
+ --color-gray-200: oklch(0.928 0.006 264.531);
89
+ --color-gray-300: oklch(0.872 0.01 258.338);
90
+ --color-gray-400: oklch(0.707 0.022 261.325);
91
+ --color-gray-500: oklch(0.551 0.027 264.364);
92
+ --color-gray-600: oklch(0.446 0.03 256.802);
93
+ --color-gray-700: oklch(0.373 0.034 259.733);
94
+ --color-gray-800: oklch(0.278 0.033 256.848);
95
+ --color-gray-900: oklch(0.21 0.034 264.665);
96
+ --color-gray-950: oklch(0.13 0.028 261.692);
97
+
98
+ --line-height-11: 2.75rem;
99
+ --line-height-12: 3rem;
100
+ --line-height-13: 3.25rem;
101
+ --line-height-14: 3.5rem;
102
+
103
+ --z-60: 60;
104
+ --z-70: 70;
105
+ --z-80: 80;
106
+ }
107
+
108
+ @layer base {
109
+ img {
110
+ height: auto;
111
+ max-width: 100%;
112
+ }
113
+
114
+ iframe {
115
+ display: block;
116
+ width: 100%;
117
+ max-width: 100%;
118
+ margin: 1rem 0;
119
+ border: 0;
120
+ }
121
+
122
+ *,
123
+ ::after,
124
+ ::before,
125
+ ::backdrop,
126
+ ::file-selector-button {
127
+ border-color: var(--color-gray-200, currentColor);
128
+ }
129
+
130
+ a,
131
+ button {
132
+ outline-color: var(--color-primary-500);
133
+ }
134
+
135
+ a:focus-visible,
136
+ button:focus-visible {
137
+ outline: 2px solid;
138
+ border-radius: var(--radius-sm);
139
+ outline-color: var(--color-primary-500);
140
+ }
141
+
142
+ /* @tailwindcss/forms defaults to blue.600 — overridden unlayered below with --primary-button-bg. */
143
+ input:focus,
144
+ input:focus-visible,
145
+ textarea:focus,
146
+ textarea:focus-visible,
147
+ select:focus,
148
+ select:focus-visible {
149
+ border-color: var(--primary-button-bg);
150
+ outline: none;
151
+ --tw-ring-color: var(--primary-button-bg);
152
+ --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width, 0px))
153
+ var(--primary-button-bg);
154
+ box-shadow:
155
+ var(--tw-ring-offset-shadow, 0 0 #0000),
156
+ var(--tw-ring-shadow, 0 0 0 1px var(--primary-button-bg)), var(--tw-shadow, 0 0 #0000);
157
+ }
158
+ }
159
+
160
+ @layer utilities {
161
+ .prose {
162
+ & a {
163
+ color: var(--color-primary-500);
164
+ &:hover {
165
+ color: var(--color-primary-600);
166
+ }
167
+ & code {
168
+ color: var(--color-primary-400);
169
+ }
170
+ }
171
+ & :where(h1, h2) {
172
+ font-weight: 700;
173
+ letter-spacing: var(--tracking-tight);
174
+ }
175
+ & h3 {
176
+ font-weight: 600;
177
+ }
178
+ & :where(code):not(pre code) {
179
+ color: var(--color-indigo-500);
180
+ }
181
+ }
182
+
183
+ .prose-invert {
184
+ & a {
185
+ color: var(--color-primary-500);
186
+ &:hover {
187
+ color: var(--color-primary-400);
188
+ }
189
+ & code {
190
+ color: var(--color-primary-400);
191
+ }
192
+ }
193
+ & :where(h1, h2, h3, h4, h5, h6) {
194
+ color: var(--color-gray-100);
195
+ }
196
+ }
197
+ }
198
+
199
+ .task-list-item::before {
200
+ @apply hidden;
201
+ }
202
+
203
+ .task-list-item {
204
+ @apply list-none;
205
+ }
206
+
207
+ .footnotes {
208
+ @apply mt-12 border-t border-gray-200 pt-8 dark:border-gray-700;
209
+ }
210
+
211
+ .data-footnote-backref {
212
+ @apply no-underline;
213
+ }
214
+
215
+ .csl-entry {
216
+ @apply my-5;
217
+ }
218
+
219
+ .no-scrollbar::-webkit-scrollbar {
220
+ display: none;
221
+ }
222
+
223
+ .no-scrollbar {
224
+ -ms-overflow-style: none;
225
+ scrollbar-width: none;
226
+ }
227
+
228
+ input:-webkit-autofill,
229
+ input:-webkit-autofill:focus {
230
+ transition:
231
+ background-color 600000s 0s,
232
+ color 600000s 0s;
233
+ }
234
+
235
+ .katex-display {
236
+ overflow: auto hidden;
237
+ }
238
+
239
+ .content-header-link {
240
+ opacity: 0;
241
+ margin-left: -24px;
242
+ padding-right: 4px;
243
+ }
244
+
245
+ .content-header:hover .content-header-link,
246
+ .content-header-link:hover {
247
+ opacity: 1;
248
+ }
249
+
250
+ .linkicon {
251
+ display: inline-block;
252
+ vertical-align: middle;
253
+ }
254
+
255
+ /* ReactPress API HTML — article reading (aligned with twentytwentyfive markdown.scss) */
256
+ .markdown {
257
+ word-break: break-word;
258
+ line-height: 1.75;
259
+ font-weight: 400;
260
+ font-size: 15px;
261
+ overflow-x: hidden;
262
+ letter-spacing: 1.2px;
263
+ color: var(--main-text-color);
264
+ }
265
+
266
+ .markdown h1,
267
+ .markdown h2,
268
+ .markdown h3,
269
+ .markdown h4,
270
+ .markdown h5,
271
+ .markdown h6 {
272
+ line-height: 1.5;
273
+ margin-top: 35px;
274
+ margin-bottom: 10px;
275
+ padding-bottom: 5px;
276
+ color: inherit;
277
+ }
278
+
279
+ .markdown h1 {
280
+ font-size: 30px;
281
+ margin-bottom: 5px;
282
+ }
283
+
284
+ .markdown h2 {
285
+ padding-bottom: 12px;
286
+ font-size: 24px;
287
+ border-bottom: 1px solid var(--border-color);
288
+ }
289
+
290
+ .markdown h3 {
291
+ font-size: 18px;
292
+ padding-bottom: 0;
293
+ }
294
+
295
+ .markdown h4 {
296
+ font-size: 16px;
297
+ }
298
+
299
+ .markdown h5 {
300
+ font-size: 15px;
301
+ }
302
+
303
+ .markdown h6 {
304
+ margin-top: 5px;
305
+ }
306
+
307
+ .markdown p {
308
+ line-height: inherit;
309
+ margin-top: 22px;
310
+ margin-bottom: 22px;
311
+ }
312
+
313
+ .markdown img {
314
+ display: block;
315
+ max-width: 100%;
316
+ width: 100%;
317
+ border-radius: var(--border-radius);
318
+ margin: 20px auto;
319
+ object-fit: contain;
320
+ }
321
+
322
+ .markdown hr {
323
+ border: none;
324
+ border-top: 1px solid var(--border-color);
325
+ margin-top: 32px;
326
+ margin-bottom: 32px;
327
+ }
328
+
329
+ .markdown a,
330
+ .rp-rich-text a {
331
+ color: var(--link-color);
332
+ text-decoration: none;
333
+ border-bottom: 1px solid color-mix(in srgb, var(--link-color) 35%, transparent);
334
+ transition:
335
+ color 0.15s ease,
336
+ border-color 0.15s ease;
337
+ }
338
+
339
+ /* CMS / 后台富文本常带内联 color,统一覆盖为主题链接色 */
340
+ .rp-rich-text a[href] {
341
+ color: var(--link-color) !important;
342
+ text-decoration: none !important;
343
+ }
344
+
345
+ .markdown a:active,
346
+ .markdown a:hover,
347
+ .rp-rich-text a:active,
348
+ .rp-rich-text a:hover {
349
+ color: var(--primary-color);
350
+ border-bottom-color: color-mix(in srgb, var(--primary-color) 45%, transparent);
351
+ }
352
+
353
+ .rp-rich-text a[href]:hover {
354
+ color: var(--primary-color) !important;
355
+ }
356
+
357
+ .rp-inline-link {
358
+ color: var(--link-color);
359
+ text-decoration: none;
360
+ border-bottom: 1px solid color-mix(in srgb, var(--link-color) 35%, transparent);
361
+ transition:
362
+ color 0.15s ease,
363
+ border-color 0.15s ease;
364
+ }
365
+
366
+ .rp-inline-link:hover {
367
+ color: var(--primary-color);
368
+ border-bottom-color: color-mix(in srgb, var(--primary-color) 45%, transparent);
369
+ }
370
+
371
+ .rp-inline-link--muted {
372
+ color: var(--second-text-color);
373
+ border-bottom-color: color-mix(in srgb, var(--second-text-color) 30%, transparent);
374
+ }
375
+
376
+ .rp-inline-link--muted:hover {
377
+ color: var(--primary-color);
378
+ border-bottom-color: color-mix(in srgb, var(--primary-color) 45%, transparent);
379
+ }
380
+
381
+ .rp-article-meta-line {
382
+ display: flex;
383
+ flex-wrap: wrap;
384
+ align-items: center;
385
+ gap: 0.25rem 0.5rem;
386
+ margin: 0;
387
+ }
388
+
389
+ .rp-article-meta-item {
390
+ display: inline-flex;
391
+ flex-wrap: wrap;
392
+ align-items: center;
393
+ gap: 0.25rem;
394
+ }
395
+
396
+ .rp-article-meta-sep {
397
+ color: var(--disable-text-color);
398
+ user-select: none;
399
+ }
400
+
401
+ .markdown blockquote {
402
+ color: var(--blockquote-color);
403
+ margin: 1.375rem 0;
404
+ padding: 0.875rem 1.125rem;
405
+ border: 1px solid color-mix(in srgb, var(--border-color) 70%, transparent);
406
+ border-left: 4px solid var(--disable-text-color);
407
+ border-radius: 0.375rem;
408
+ background-color: var(--bg-second);
409
+ }
410
+
411
+ .markdown blockquote > :first-child {
412
+ margin-top: 0;
413
+ }
414
+
415
+ .markdown blockquote > :last-child {
416
+ margin-bottom: 0;
417
+ }
418
+
419
+ .markdown blockquote > p {
420
+ margin: 0;
421
+ }
422
+
423
+ .markdown blockquote > p + p {
424
+ margin-top: 0.75em;
425
+ }
426
+
427
+ .markdown blockquote ul,
428
+ .markdown blockquote ol {
429
+ margin: 0.625em 0 0;
430
+ padding-left: 1.25rem;
431
+ }
432
+
433
+ .markdown ul {
434
+ list-style-type: disc;
435
+ }
436
+
437
+ .markdown ul ul {
438
+ list-style-type: square;
439
+ }
440
+
441
+ .markdown ol,
442
+ .markdown ul {
443
+ padding-left: 28px;
444
+ }
445
+
446
+ .markdown ol li,
447
+ .markdown ul li {
448
+ margin-bottom: 0;
449
+ list-style: inherit;
450
+ }
451
+
452
+ .markdown ol ol,
453
+ .markdown ol ul,
454
+ .markdown ul ol,
455
+ .markdown ul ul {
456
+ margin-top: 3px;
457
+ }
458
+
459
+ .markdown ol li {
460
+ padding-left: 6px;
461
+ }
462
+
463
+ .markdown .task-list-item {
464
+ display: flex;
465
+ align-items: center;
466
+ gap: 0.5rem;
467
+ list-style: none;
468
+ min-height: 1.625rem;
469
+ padding-left: 0;
470
+ margin-left: 0;
471
+ }
472
+
473
+ .markdown .task-list-item > input {
474
+ flex-shrink: 0;
475
+ margin: 0;
476
+ }
477
+
478
+ .markdown .task-list-item > input::before {
479
+ content: '';
480
+ position: relative;
481
+ top: 0;
482
+ left: 0;
483
+ display: block;
484
+ width: 16px;
485
+ height: 16px;
486
+ border: 1px solid var(--border-color);
487
+ border-radius: 2px;
488
+ background-color: var(--bg-code);
489
+ transition: all 0.3s;
490
+ }
491
+
492
+ .markdown .task-list-item > input:checked::before {
493
+ content: '✅';
494
+ font-size: 18px;
495
+ line-height: 1;
496
+ border: none;
497
+ }
498
+
499
+ .markdown code,
500
+ .markdown pre {
501
+ font-family: Menlo, Monaco, Consolas, 'Courier New', monospace;
502
+ }
503
+
504
+ .markdown code {
505
+ display: inline;
506
+ padding: 2px 4px;
507
+ border-radius: 4px;
508
+ margin: 0 2px;
509
+ color: var(--main-text-color);
510
+ background-color: var(--bg-code);
511
+ font-size: inherit;
512
+ word-wrap: break-word;
513
+ word-break: break-all;
514
+ vertical-align: baseline;
515
+ }
516
+
517
+ .markdown pre {
518
+ position: relative;
519
+ display: flex;
520
+ flex-direction: column;
521
+ border-radius: 5px;
522
+ margin: 10px 0;
523
+ background-color: var(--bg-code);
524
+ font-size: 1em;
525
+ overflow: hidden;
526
+ overscroll-behavior: auto;
527
+ }
528
+
529
+ .markdown pre::before {
530
+ display: none;
531
+ }
532
+
533
+ .rp-code-toolbar {
534
+ display: flex;
535
+ flex-shrink: 0;
536
+ align-items: center;
537
+ gap: 10px;
538
+ height: 30px;
539
+ padding: 0 8px 0 10px;
540
+ background-color: var(--bg-code);
541
+ }
542
+
543
+ .markdown pre:has(> .rp-code-toolbar + code.hljs) .rp-code-toolbar,
544
+ .markdown pre:has(> .rp-code-toolbar + code.hljsln) .rp-code-toolbar,
545
+ .markdown pre:has(> code.hljs) .rp-code-toolbar,
546
+ .markdown pre:has(> code.hljsln) .rp-code-toolbar {
547
+ background-color: #282c34;
548
+ }
549
+
550
+ .markdown pre code {
551
+ display: block;
552
+ max-height: 370px;
553
+ padding: 0.75rem 0.625rem;
554
+ border-radius: 0;
555
+ color: var(--main-text-color);
556
+ background-color: var(--bg-code);
557
+ overflow: auto;
558
+ overscroll-behavior: auto;
559
+ font-size: inherit;
560
+ margin: 0;
561
+ white-space: pre-wrap;
562
+ -webkit-overflow-scrolling: touch;
563
+ }
564
+
565
+ .markdown pre:has(> code.hljs),
566
+ .markdown pre:has(> code.hljsln) {
567
+ background-color: #282c34;
568
+ }
569
+
570
+ .markdown pre:has(> code.hljs)::before,
571
+ .markdown pre:has(> code.hljsln)::before {
572
+ display: none;
573
+ }
574
+
575
+ .markdown pre:has(.rp-code-lang) code[class*='language-']::before {
576
+ content: none !important;
577
+ }
578
+
579
+ .rp-code-window-dots {
580
+ display: flex;
581
+ flex-shrink: 0;
582
+ align-items: center;
583
+ pointer-events: none;
584
+ }
585
+
586
+ .rp-code-lang {
587
+ margin-left: auto;
588
+ flex-shrink: 0;
589
+ font-size: 12px;
590
+ line-height: 1;
591
+ color: hsl(0deg 0% 54.9% / 80%);
592
+ pointer-events: none;
593
+ text-transform: lowercase;
594
+ transition: opacity 0.15s ease;
595
+ }
596
+
597
+ .markdown pre.rp-code-copy-active .rp-code-lang {
598
+ opacity: 0;
599
+ }
600
+
601
+ .markdown pre:has(> code.hljs) .rp-code-lang,
602
+ .markdown pre:has(> code.hljsln) .rp-code-lang {
603
+ color: hsl(0deg 0% 65% / 90%);
604
+ }
605
+
606
+ .markdown pre code.hljs,
607
+ .markdown pre code.hljsln {
608
+ color: #abb2bf;
609
+ background-color: transparent;
610
+ }
611
+
612
+ .markdown strong {
613
+ font-weight: bold;
614
+ }
615
+
616
+ .markdown strong::before {
617
+ content: '「';
618
+ }
619
+
620
+ .markdown strong::after {
621
+ content: '」';
622
+ }
623
+
624
+ .markdown p em {
625
+ font-weight: normal;
626
+ }
627
+
628
+ .markdown em {
629
+ color: var(--main-text-color);
630
+ font-style: normal;
631
+ }
632
+
633
+ .markdown em strong {
634
+ color: var(--main-text-color);
635
+ }
636
+
637
+ .markdown table {
638
+ width: 100%;
639
+ margin-top: 1em;
640
+ border-radius: 4px;
641
+ border-collapse: collapse;
642
+ box-sizing: border-box;
643
+ border: 1px solid var(--border-color);
644
+ }
645
+
646
+ .markdown table thead {
647
+ background-color: var(--bg-table);
648
+ }
649
+
650
+ .markdown table tr:nth-child(2n) {
651
+ background-color: var(--bg-table);
652
+ }
653
+
654
+ .markdown table td,
655
+ .markdown table th {
656
+ position: relative;
657
+ min-width: 100px;
658
+ padding: 0.5rem 0.625rem;
659
+ text-align: left;
660
+ vertical-align: middle;
661
+ border: 1px solid var(--border-color);
662
+ }
663
+
664
+ .markdown code.language-ts::before,
665
+ .markdown code.language-js::before,
666
+ .markdown code.language-typescript::before,
667
+ .markdown code.language-javascript::before,
668
+ .markdown code.language-html::before,
669
+ .markdown code.language-css::before,
670
+ .markdown code.language-php::before,
671
+ .markdown code.language-go::before,
672
+ .markdown code.language-sql::before,
673
+ .markdown code.language-json::before,
674
+ .markdown code.language-bash::before,
675
+ .markdown code.language-less::before,
676
+ .markdown code.language-scss::before,
677
+ .markdown code.language-nginx::before,
678
+ .markdown code.language-shell::before,
679
+ .markdown code.language-stylus::before,
680
+ .markdown code.language-python::before,
681
+ .markdown code.language-yaml::before,
682
+ .markdown code.language-yml::before,
683
+ .markdown code.language-lua::before {
684
+ position: absolute;
685
+ top: 8px;
686
+ right: 45px;
687
+ z-index: 2;
688
+ font-size: 12px;
689
+ line-height: 1;
690
+ cursor: default;
691
+ color: hsl(0deg 0% 54.9% / 80%);
692
+ transition: color 0.1s;
693
+ pointer-events: none;
694
+ }
695
+
696
+ .markdown code.language-ts::before {
697
+ content: 'ts';
698
+ }
699
+ .markdown code.language-js::before {
700
+ content: 'js';
701
+ }
702
+ .markdown code.language-typescript::before {
703
+ content: 'typescript';
704
+ }
705
+ .markdown code.language-javascript::before {
706
+ content: 'javascript';
707
+ }
708
+ .markdown code.language-html::before {
709
+ content: 'html';
710
+ }
711
+ .markdown code.language-css::before {
712
+ content: 'css';
713
+ }
714
+ .markdown code.language-php::before {
715
+ content: 'php';
716
+ }
717
+ .markdown code.language-go::before {
718
+ content: 'go';
719
+ }
720
+ .markdown code.language-sql::before {
721
+ content: 'sql';
722
+ }
723
+ .markdown code.language-json::before {
724
+ content: 'json';
725
+ }
726
+ .markdown code.language-bash::before {
727
+ content: 'bash';
728
+ }
729
+ .markdown code.language-less::before {
730
+ content: 'less';
731
+ }
732
+ .markdown code.language-scss::before {
733
+ content: 'scss';
734
+ }
735
+ .markdown code.language-nginx::before {
736
+ content: 'nginx';
737
+ }
738
+ .markdown code.language-shell::before {
739
+ content: 'shell';
740
+ }
741
+ .markdown code.language-stylus::before {
742
+ content: 'stylus';
743
+ }
744
+ .markdown code.language-python::before {
745
+ content: 'python';
746
+ }
747
+ .markdown code.language-yaml::before {
748
+ content: 'yaml';
749
+ }
750
+ .markdown code.language-yml::before {
751
+ content: 'yml';
752
+ }
753
+ .markdown code.language-lua::before {
754
+ content: 'lua';
755
+ }
756
+
757
+ .hljsln {
758
+ display: block;
759
+ padding-left: 3em !important;
760
+ }
761
+
762
+ .hljsln .ln-bg {
763
+ position: absolute;
764
+ z-index: 1;
765
+ top: 0;
766
+ left: 0;
767
+ width: 2.2em;
768
+ height: 100%;
769
+ pointer-events: none;
770
+ }
771
+
772
+ .hljsln .ln-num {
773
+ position: relative;
774
+ display: inline-block;
775
+ height: 1em;
776
+ -webkit-touch-callout: none;
777
+ user-select: none;
778
+ }
779
+
780
+ .hljsln .ln-num::before {
781
+ position: absolute;
782
+ z-index: 2;
783
+ top: 0;
784
+ right: 0;
785
+ margin-right: 1em;
786
+ color: #777;
787
+ font-style: normal;
788
+ font-weight: normal;
789
+ content: attr(data-num);
790
+ width: max-content;
791
+ }
792
+
793
+ .rp-copy-code-btn {
794
+ flex-shrink: 0;
795
+ min-width: 2em;
796
+ font-size: 12px;
797
+ line-height: 1;
798
+ color: hsl(0deg 0% 54.9% / 80%);
799
+ cursor: pointer;
800
+ background: transparent;
801
+ border: 0;
802
+ padding: 0;
803
+ text-align: center;
804
+ white-space: nowrap;
805
+ }
806
+
807
+ .markdown pre:has(> code.hljs) .rp-copy-code-btn,
808
+ .markdown pre:has(> code.hljsln) .rp-copy-code-btn {
809
+ color: hsl(0deg 0% 65% / 90%);
810
+ }
811
+
812
+ .rp-copy-code-btn:hover {
813
+ opacity: 0.6;
814
+ }
815
+
816
+ .rp-copy-code-btn.rp-copy-code-btn--copied {
817
+ min-width: 1em;
818
+ color: hsl(142deg 45% 62%);
819
+ opacity: 1;
820
+ }
821
+
822
+ .rp-code-window-dots i {
823
+ display: inline-block;
824
+ width: 12px;
825
+ height: 12px;
826
+ border-radius: 6px;
827
+ margin-left: 6px;
828
+ }
829
+
830
+ .rp-code-window-dots i:first-child {
831
+ margin-left: 0;
832
+ }
833
+
834
+ .rp-copy-toast {
835
+ position: fixed;
836
+ bottom: 2rem;
837
+ left: 50%;
838
+ z-index: 9999;
839
+ transform: translateX(-50%);
840
+ padding: 0.5rem 1rem;
841
+ border-radius: 4px;
842
+ background: rgb(0 0 0 / 75%);
843
+ color: #fff;
844
+ font-size: 14px;
845
+ pointer-events: none;
846
+ animation: rp-copy-toast-fade 2s ease forwards;
847
+ }
848
+
849
+ .rp-share-toast {
850
+ position: fixed;
851
+ top: calc(1rem + var(--rp-header-offset, 0px));
852
+ left: 50%;
853
+ z-index: 9999;
854
+ transform: translateX(-50%);
855
+ padding: 0.5rem 1rem;
856
+ border-radius: 0.375rem;
857
+ background: rgb(0 0 0 / 75%);
858
+ color: #fff;
859
+ font-size: 14px;
860
+ pointer-events: none;
861
+ animation: rp-copy-toast-fade 2s ease forwards;
862
+ }
863
+
864
+ @keyframes rp-copy-toast-fade {
865
+ 0%,
866
+ 70% {
867
+ opacity: 1;
868
+ }
869
+ 100% {
870
+ opacity: 0;
871
+ }
872
+ }
873
+
874
+ .rp-html-content {
875
+ overflow-x: hidden;
876
+ word-break: break-word;
877
+ }
878
+
879
+ .rp-article-toc-item {
880
+ display: block;
881
+ width: 100%;
882
+ border: 0;
883
+ border-left: 2px solid transparent;
884
+ background: transparent;
885
+ text-align: left;
886
+ padding: 0.4375rem 0.625rem;
887
+ font-size: 0.8125rem;
888
+ line-height: 1.5;
889
+ color: var(--second-text-color);
890
+ cursor: pointer;
891
+ border-radius: 0.4375rem;
892
+ overflow: hidden;
893
+ text-overflow: ellipsis;
894
+ white-space: nowrap;
895
+ transition:
896
+ color var(--rp-duration-fast) ease,
897
+ border-color var(--rp-duration-normal) var(--rp-ease-out),
898
+ background-color var(--rp-duration-normal) var(--rp-ease-out),
899
+ transform var(--rp-duration-fast) var(--rp-ease-out);
900
+ }
901
+
902
+ .rp-article-toc-item:hover {
903
+ color: var(--main-text-color);
904
+ background: color-mix(in srgb, var(--bg-second) 90%, transparent);
905
+ }
906
+
907
+ .rp-article-toc-item.is-active {
908
+ color: var(--main-text-color);
909
+ font-weight: 600;
910
+ border-left-color: var(--primary-color);
911
+ background: color-mix(in srgb, var(--primary-color) 7%, var(--bg-second));
912
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--primary-color) 10%, transparent);
913
+ }
914
+
915
+ .rp-article-toc-list {
916
+ padding: 0;
917
+ margin: 0;
918
+ }
919
+
920
+ .disable-text-color {
921
+ --disable-text-color: rgba(0, 0, 0, 0.55);
922
+ }
923
+
924
+ body.dark {
925
+ --disable-text-color: #8a95a3;
926
+ }
927
+
928
+ :root {
929
+ --rp-header-offset: 0px;
930
+ --rp-ease-out: cubic-bezier(0.22, 1, 0.36, 1);
931
+ --rp-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
932
+ --rp-duration-fast: 0.2s;
933
+ --rp-duration-normal: 0.32s;
934
+ --rp-duration-slow: 0.55s;
935
+ }
936
+
937
+ html {
938
+ scroll-behavior: smooth;
939
+ }
940
+
941
+ @media (prefers-reduced-motion: reduce) {
942
+ html {
943
+ scroll-behavior: auto;
944
+ }
945
+ }
946
+
947
+ @keyframes rp-logo-blink {
948
+ from {
949
+ transform: translateX(-120%) rotate(-45deg);
950
+ }
951
+ to {
952
+ transform: translateX(220%) rotate(-45deg);
953
+ }
954
+ }
955
+
956
+ .rp-header-logo-link {
957
+ position: relative;
958
+ }
959
+
960
+ .rp-header-logo-link::before {
961
+ content: '';
962
+ position: absolute;
963
+ z-index: 2;
964
+ top: 50%;
965
+ left: 0;
966
+ width: 55%;
967
+ height: 6px;
968
+ margin-top: -3px;
969
+ pointer-events: none;
970
+ background-color: var(--blink-bg-color);
971
+ opacity: 0.85;
972
+ transform: translateX(-120%) rotate(-45deg);
973
+ animation: rp-logo-blink 2s ease-in-out 1.5s infinite;
974
+ }
975
+
976
+ .rp-header-logo:hover img,
977
+ .rp-header-logo:hover svg {
978
+ opacity: 0.85;
979
+ }
980
+
981
+ .rp-container {
982
+ width: calc(100% - 32px);
983
+ max-width: 1240px;
984
+ }
985
+
986
+ @media (min-width: 768px) {
987
+ .rp-container {
988
+ width: 736px;
989
+ }
990
+ }
991
+
992
+ @media (min-width: 992px) {
993
+ .rp-container {
994
+ width: 960px;
995
+ }
996
+ }
997
+
998
+ @media (min-width: 1200px) {
999
+ .rp-container {
1000
+ width: 1140px;
1001
+ }
1002
+ }
1003
+
1004
+ @media (min-width: 1360px) {
1005
+ .rp-container {
1006
+ width: 1240px;
1007
+ }
1008
+ }
1009
+
1010
+ /* Sidebar sticky — offset when fixed header is visible */
1011
+ .rp-sidebar-sticky {
1012
+ top: calc(1rem + var(--rp-header-offset, 0px));
1013
+ }
1014
+
1015
+ /* Article page layout */
1016
+ .rp-double-column {
1017
+ display: flex;
1018
+ flex-wrap: wrap;
1019
+ overflow: visible;
1020
+ }
1021
+
1022
+ /* Grid: main | optional sidebar — reading chrome floats outside content */
1023
+ @media (min-width: 1280px) {
1024
+ .rp-double-column--reading-chrome,
1025
+ .rp-double-column--reading-chrome.rp-double-column--sidebar {
1026
+ display: block;
1027
+ position: relative;
1028
+ }
1029
+
1030
+ .rp-double-column--reading-chrome.rp-double-column--sidebar {
1031
+ display: grid;
1032
+ column-gap: 0.75rem;
1033
+ grid-template-columns: minmax(0, 1fr) 18rem;
1034
+ align-items: stretch;
1035
+ }
1036
+
1037
+ .rp-double-column--sidebar:not(.rp-double-column--reading-chrome) {
1038
+ display: grid;
1039
+ column-gap: 0.75rem;
1040
+ grid-template-columns: minmax(0, 1fr) 18rem;
1041
+ align-items: stretch;
1042
+ }
1043
+
1044
+ .rp-double-column--reading-chrome .rp-double-column__main {
1045
+ width: 100% !important;
1046
+ position: relative;
1047
+ z-index: 1;
1048
+ }
1049
+
1050
+ .rp-double-column--reading-chrome.rp-double-column--sidebar .rp-double-column__main {
1051
+ grid-column: 1;
1052
+ grid-row: 1;
1053
+ }
1054
+
1055
+ .rp-double-column--reading-chrome.rp-double-column--sidebar .rp-double-column__aside {
1056
+ grid-column: 2;
1057
+ grid-row: 1;
1058
+ width: auto !important;
1059
+ margin-left: 0 !important;
1060
+ }
1061
+ }
1062
+
1063
+ .rp-article-page {
1064
+ width: 100%;
1065
+ }
1066
+
1067
+ /* Page load progress — top of viewport, all routes (0 left → 100 right) */
1068
+ html[data-rp-loading]::before {
1069
+ content: '';
1070
+ position: fixed;
1071
+ inset: 0 auto auto 0;
1072
+ width: 0;
1073
+ height: 2px;
1074
+ margin: 0;
1075
+ padding: 0;
1076
+ border: 0;
1077
+ z-index: 10000;
1078
+ pointer-events: none;
1079
+ background: linear-gradient(
1080
+ 90deg,
1081
+ color-mix(in srgb, var(--primary-color, #f44336) 28%, transparent),
1082
+ color-mix(in srgb, var(--primary-color, #f44336) 72%, transparent),
1083
+ var(--primary-color, #f44336)
1084
+ );
1085
+ transform-origin: left center;
1086
+ animation: rp-page-load-indeterminate 1.4s ease-in-out infinite;
1087
+ }
1088
+
1089
+ @keyframes rp-page-load-indeterminate {
1090
+ 0% {
1091
+ width: 0;
1092
+ opacity: 0.7;
1093
+ }
1094
+
1095
+ 50% {
1096
+ width: 62%;
1097
+ opacity: 1;
1098
+ }
1099
+
1100
+ 100% {
1101
+ width: 88%;
1102
+ opacity: 0.85;
1103
+ }
1104
+ }
1105
+
1106
+ .rp-page-load-progress {
1107
+ position: fixed;
1108
+ inset: auto 0 auto 0;
1109
+ width: 100%;
1110
+ height: 2px;
1111
+ margin: 0;
1112
+ padding: 0;
1113
+ border: 0;
1114
+ z-index: 10000;
1115
+ pointer-events: none;
1116
+ overflow: hidden;
1117
+ line-height: 0;
1118
+ }
1119
+
1120
+ .rp-page-load-progress__track {
1121
+ width: 100%;
1122
+ height: 100%;
1123
+ margin: 0;
1124
+ padding: 0;
1125
+ background: color-mix(in srgb, var(--border-color) 35%, transparent);
1126
+ }
1127
+
1128
+ .rp-page-load-progress__bar {
1129
+ height: 100%;
1130
+ margin: 0;
1131
+ padding: 0;
1132
+ background: linear-gradient(
1133
+ 90deg,
1134
+ color-mix(in srgb, var(--primary-color) 28%, transparent),
1135
+ color-mix(in srgb, var(--primary-color) 72%, transparent),
1136
+ var(--primary-color)
1137
+ );
1138
+ transition: width 0.22s ease;
1139
+ box-shadow: 0 0 10px color-mix(in srgb, var(--primary-color) 35%, transparent);
1140
+ }
1141
+
1142
+ /* Article reading progress — fixed at header top (top set inline) */
1143
+ .rp-reading-progress {
1144
+ position: fixed;
1145
+ right: 0;
1146
+ left: 0;
1147
+ z-index: 110;
1148
+ height: 2px;
1149
+ pointer-events: none;
1150
+ overflow: hidden;
1151
+ background: color-mix(in srgb, var(--border-color) 30%, transparent);
1152
+ }
1153
+
1154
+ .rp-reading-progress__bar {
1155
+ display: block;
1156
+ height: 100%;
1157
+ background: linear-gradient(
1158
+ 90deg,
1159
+ color-mix(in srgb, var(--primary-color) 28%, transparent),
1160
+ color-mix(in srgb, var(--primary-color) 72%, transparent),
1161
+ var(--primary-color)
1162
+ );
1163
+ transition: width 0.16s linear;
1164
+ box-shadow: 0 0 10px color-mix(in srgb, var(--primary-color) 35%, transparent);
1165
+ }
1166
+
1167
+ @media (prefers-reduced-motion: reduce) {
1168
+ html[data-rp-loading]::before {
1169
+ animation: none;
1170
+ width: 35%;
1171
+ opacity: 0.85;
1172
+ }
1173
+
1174
+ .rp-page-load-progress__bar,
1175
+ .rp-reading-progress__bar {
1176
+ transition: none;
1177
+ }
1178
+ }
1179
+
1180
+ /* Unified reading dock — desktop side / mobile bottom */
1181
+ .rp-reading-dock--side {
1182
+ display: none;
1183
+ position: fixed;
1184
+ top: 50%;
1185
+ width: 3rem;
1186
+ transform: translateY(-50%);
1187
+ pointer-events: none;
1188
+ z-index: 100;
1189
+ }
1190
+
1191
+ .rp-reading-dock--bottom {
1192
+ display: none;
1193
+ position: fixed;
1194
+ right: 0;
1195
+ bottom: 0;
1196
+ left: 0;
1197
+ z-index: 100;
1198
+ padding: 0.5rem 1rem calc(0.625rem + env(safe-area-inset-bottom, 0px));
1199
+ pointer-events: none;
1200
+ }
1201
+
1202
+ @media (min-width: 1280px) {
1203
+ .rp-reading-dock--side {
1204
+ display: block;
1205
+ /* Align to the left gutter beside .rp-container content (1140px + px-4). */
1206
+ left: max(0.75rem, calc((100vw - 1140px) / 2 + 1rem - 4.5rem));
1207
+ }
1208
+ }
1209
+
1210
+ @media (min-width: 1360px) {
1211
+ .rp-reading-dock--side {
1212
+ left: max(0.75rem, calc((100vw - 1240px) / 2 + 1rem - 5rem));
1213
+ }
1214
+ }
1215
+
1216
+ @media (max-width: 1279px) {
1217
+ .rp-reading-dock--bottom {
1218
+ display: block;
1219
+ }
1220
+
1221
+ .rp-double-column--reading-chrome {
1222
+ padding-bottom: calc(5rem + env(safe-area-inset-bottom, 0px));
1223
+ }
1224
+ }
1225
+
1226
+ .rp-reading-dock--side .rp-reading-dock__actions {
1227
+ display: flex;
1228
+ flex-direction: column;
1229
+ align-items: center;
1230
+ gap: 0.625rem;
1231
+ width: 100%;
1232
+ pointer-events: auto;
1233
+ }
1234
+
1235
+ .rp-reading-dock--bottom .rp-reading-dock__inner {
1236
+ display: flex;
1237
+ align-items: stretch;
1238
+ justify-content: center;
1239
+ gap: 0.375rem;
1240
+ max-width: 24rem;
1241
+ margin: 0 auto;
1242
+ padding: 0.375rem;
1243
+ border-radius: 1.25rem;
1244
+ border: 1px solid color-mix(in srgb, var(--border-color) 65%, transparent);
1245
+ background: color-mix(in srgb, var(--bg-box) 94%, transparent);
1246
+ backdrop-filter: blur(16px) saturate(1.2);
1247
+ -webkit-backdrop-filter: blur(16px) saturate(1.2);
1248
+ box-shadow:
1249
+ 0 0 0 1px color-mix(in srgb, var(--main-text-color) 3%, transparent),
1250
+ 0 -8px 32px color-mix(in srgb, var(--main-text-color) 10%, transparent);
1251
+ pointer-events: auto;
1252
+ }
1253
+
1254
+ .rp-reading-dock__actions {
1255
+ display: flex;
1256
+ flex-direction: column;
1257
+ align-items: center;
1258
+ gap: 0.625rem;
1259
+ width: 100%;
1260
+ }
1261
+
1262
+ .rp-reading-dock__toc {
1263
+ display: inline-flex;
1264
+ align-items: center;
1265
+ justify-content: center;
1266
+ width: 2.5rem;
1267
+ height: 2.5rem;
1268
+ padding: 0;
1269
+ border: 0;
1270
+ border-radius: 0.625rem;
1271
+ background: transparent;
1272
+ color: var(--second-text-color);
1273
+ cursor: pointer;
1274
+ transition:
1275
+ color var(--rp-duration-fast) ease,
1276
+ background-color var(--rp-duration-fast) ease,
1277
+ transform var(--rp-duration-fast) var(--rp-ease-out);
1278
+ }
1279
+
1280
+ .rp-reading-dock__toc:hover {
1281
+ color: var(--primary-color);
1282
+ background: color-mix(in srgb, var(--primary-color) 8%, transparent);
1283
+ }
1284
+
1285
+ .rp-reading-dock__toc.is-open {
1286
+ color: var(--primary-color);
1287
+ background: color-mix(in srgb, var(--primary-color) 12%, transparent);
1288
+ }
1289
+
1290
+ .rp-reading-dock__toc--mobile {
1291
+ flex: 1 1 0;
1292
+ flex-direction: column;
1293
+ gap: 0.125rem;
1294
+ min-width: 0;
1295
+ min-height: 3rem;
1296
+ height: auto;
1297
+ padding: 0.375rem 0.25rem;
1298
+ }
1299
+
1300
+ .rp-reading-dock__toc-label {
1301
+ font-size: 0.625rem;
1302
+ font-weight: 600;
1303
+ line-height: 1;
1304
+ letter-spacing: 0.02em;
1305
+ color: inherit;
1306
+ }
1307
+
1308
+ .rp-reading-dock--side .rp-action-btn {
1309
+ width: 2.75rem;
1310
+ height: auto;
1311
+ min-height: 3rem;
1312
+ flex-direction: column;
1313
+ gap: 0.125rem;
1314
+ padding: 0.25rem 0;
1315
+ border-radius: 0.5rem;
1316
+ }
1317
+
1318
+ .rp-reading-dock--bottom > .rp-reading-dock__inner > .rp-action-btn--mobile {
1319
+ flex: 1 1 0;
1320
+ min-width: 0;
1321
+ }
1322
+
1323
+ @media (max-width: 1279px) {
1324
+ .rp-double-column {
1325
+ padding-bottom: 2rem;
1326
+ }
1327
+ }
1328
+
1329
+ @media (max-width: 767px) {
1330
+ .rp-double-column {
1331
+ padding-top: 0.75rem;
1332
+ padding-bottom: 1.5rem;
1333
+ }
1334
+
1335
+ .rp-article-wrap {
1336
+ border-radius: 0.375rem;
1337
+ }
1338
+
1339
+ .rp-reading-dock--side {
1340
+ display: none;
1341
+ }
1342
+
1343
+ .rp-article-cover-hero,
1344
+ .rp-article-cover-hero img {
1345
+ max-height: min(14rem, 48vw);
1346
+ }
1347
+
1348
+ .rp-article-inner {
1349
+ padding: 1.125rem 0.75rem 1.5rem;
1350
+ }
1351
+
1352
+ .rp-article-wrap:has(.rp-article-cover-hero) .rp-article-inner {
1353
+ padding-top: 1.25rem;
1354
+ }
1355
+
1356
+ .rp-article-header {
1357
+ margin-bottom: 1.25rem;
1358
+ padding-bottom: 1rem;
1359
+ }
1360
+
1361
+ .rp-article-title {
1362
+ font-size: clamp(1.5rem, 6.5vw, 1.875rem);
1363
+ }
1364
+
1365
+ .rp-article-meta-row {
1366
+ gap: 0.375rem 0.5rem;
1367
+ }
1368
+
1369
+ .rp-article-meta-chip {
1370
+ font-size: 0.75rem;
1371
+ }
1372
+
1373
+ .rp-article-body .markdown {
1374
+ font-size: 1rem;
1375
+ line-height: 1.8;
1376
+ }
1377
+
1378
+ .rp-comment-wrap {
1379
+ margin-top: 1.5rem;
1380
+ }
1381
+
1382
+ .rp-article-recommend {
1383
+ margin-top: 1rem;
1384
+ }
1385
+
1386
+ .rp-section-heading {
1387
+ margin-bottom: 0.75rem;
1388
+ }
1389
+
1390
+ .rp-section-heading::before,
1391
+ .rp-section-heading::after {
1392
+ max-width: 2.5rem;
1393
+ }
1394
+ }
1395
+
1396
+ /* Homepage recommend list — hot-rank sidebar (inline mode) */
1397
+ .rp-recommend-item + .rp-recommend-item,
1398
+ .rp-recommend-scroll-row + .rp-recommend-scroll-row {
1399
+ border-top: 1px solid color-mix(in srgb, var(--border-color) 62%, transparent);
1400
+ }
1401
+
1402
+ .rp-recommend-link {
1403
+ border-left: 2px solid transparent;
1404
+ transition:
1405
+ background-color 0.2s ease,
1406
+ border-color 0.2s ease,
1407
+ color 0.2s ease;
1408
+ }
1409
+
1410
+ .rp-recommend-link:hover,
1411
+ .rp-recommend-link:focus-visible {
1412
+ background: color-mix(in srgb, var(--bg-second) 48%, transparent);
1413
+ border-left-color: color-mix(in srgb, var(--primary-color) 55%, transparent);
1414
+ }
1415
+
1416
+ .rp-recommend-rank {
1417
+ flex-shrink: 0;
1418
+ width: 1.375rem;
1419
+ font-size: 0.8125rem;
1420
+ font-weight: 700;
1421
+ font-variant-numeric: tabular-nums;
1422
+ line-height: 1;
1423
+ text-align: center;
1424
+ color: color-mix(in srgb, var(--second-text-color) 44%, transparent);
1425
+ }
1426
+
1427
+ .rp-recommend-rank[data-rank='1'] {
1428
+ font-size: 0.9375rem;
1429
+ color: var(--primary-color);
1430
+ }
1431
+
1432
+ .rp-recommend-rank[data-rank='2'],
1433
+ .rp-recommend-rank[data-rank='3'] {
1434
+ color: color-mix(in srgb, var(--primary-color) 76%, var(--second-text-color));
1435
+ }
1436
+
1437
+ .rp-recommend-title {
1438
+ font-size: 0.8125rem;
1439
+ line-height: 1.4;
1440
+ letter-spacing: -0.01em;
1441
+ }
1442
+
1443
+ .rp-recommend-views {
1444
+ min-width: 2.625rem;
1445
+ justify-content: flex-end;
1446
+ font-size: 0.6875rem;
1447
+ color: color-mix(in srgb, var(--second-text-color) 68%, transparent);
1448
+ transition: color 0.2s ease;
1449
+ }
1450
+
1451
+ .rp-recommend-link:hover .rp-recommend-views,
1452
+ .rp-recommend-link:focus-visible .rp-recommend-views {
1453
+ color: color-mix(in srgb, var(--second-text-color) 88%, transparent);
1454
+ }
1455
+
1456
+ .rp-recommend-scroll {
1457
+ --rp-recommend-row-h: 42px;
1458
+ --rp-recommend-visible: 5;
1459
+ }
1460
+
1461
+ .rp-recommend-scroll-viewport {
1462
+ height: calc(var(--rp-recommend-row-h) * var(--rp-recommend-visible));
1463
+ overflow: hidden;
1464
+ mask-image: linear-gradient(to bottom, transparent 0%, #000 5%, #000 95%, transparent 100%);
1465
+ transition: mask-image 0.35s ease;
1466
+ }
1467
+
1468
+ .rp-recommend-scroll-viewport.is-moving {
1469
+ mask-image: linear-gradient(to bottom, transparent 0%, #000 10%, #000 90%, transparent 100%);
1470
+ }
1471
+
1472
+ .rp-recommend-scroll-track {
1473
+ --rp-recommend-scroll-ms: 0.58s;
1474
+ will-change: transform;
1475
+ transition: transform var(--rp-recommend-scroll-ms) cubic-bezier(0.4, 0, 0.2, 1);
1476
+ }
1477
+
1478
+ .rp-recommend-scroll-track.is-instant {
1479
+ transition: none;
1480
+ }
1481
+
1482
+ .rp-recommend-scroll-row {
1483
+ height: var(--rp-recommend-row-h);
1484
+ box-sizing: border-box;
1485
+ }
1486
+
1487
+ .rp-recommend-scroll-row .rp-recommend-link {
1488
+ height: 100%;
1489
+ padding-block: 0;
1490
+ box-sizing: border-box;
1491
+ }
1492
+
1493
+ .rp-recommend-scroll-track.is-moving .rp-recommend-scroll-row:first-child .rp-recommend-link {
1494
+ animation: rp-recommend-fade-out var(--rp-recommend-scroll-ms, 0.58s) cubic-bezier(0.4, 0, 0.2, 1)
1495
+ forwards;
1496
+ pointer-events: none;
1497
+ }
1498
+
1499
+ .rp-recommend-scroll-track.is-moving .rp-recommend-scroll-row:last-child .rp-recommend-link {
1500
+ animation: rp-recommend-fade-in var(--rp-recommend-scroll-ms, 0.58s) cubic-bezier(0.4, 0, 0.2, 1)
1501
+ 0.08s forwards;
1502
+ opacity: 0;
1503
+ }
1504
+
1505
+ @keyframes rp-recommend-fade-out {
1506
+ from {
1507
+ opacity: 1;
1508
+ }
1509
+
1510
+ to {
1511
+ opacity: 0.25;
1512
+ }
1513
+ }
1514
+
1515
+ @keyframes rp-recommend-fade-in {
1516
+ from {
1517
+ opacity: 0.2;
1518
+ }
1519
+
1520
+ to {
1521
+ opacity: 1;
1522
+ }
1523
+ }
1524
+
1525
+ .rp-recommend-scroll.is-paused .rp-recommend-scroll-viewport {
1526
+ opacity: 0.94;
1527
+ }
1528
+
1529
+ @keyframes recommend-shimmer {
1530
+ 0%,
1531
+ 100% {
1532
+ background-color: var(--bg-second);
1533
+ }
1534
+ 50% {
1535
+ background-color: var(--border-color);
1536
+ }
1537
+ }
1538
+
1539
+ .rp-recommend-skeleton-badge {
1540
+ animation: recommend-shimmer 1.4s ease-in-out infinite;
1541
+ }
1542
+
1543
+ /* ── Homepage motion & glass ── */
1544
+ @keyframes rp-fade-up {
1545
+ from {
1546
+ opacity: 0;
1547
+ transform: translateY(14px);
1548
+ }
1549
+ to {
1550
+ opacity: 1;
1551
+ transform: translateY(0);
1552
+ }
1553
+ }
1554
+
1555
+ @keyframes rp-fade-in {
1556
+ from {
1557
+ opacity: 0;
1558
+ }
1559
+ to {
1560
+ opacity: 1;
1561
+ }
1562
+ }
1563
+
1564
+ @keyframes rp-carousel-text-in {
1565
+ from {
1566
+ opacity: 0;
1567
+ transform: translateY(10px);
1568
+ }
1569
+ to {
1570
+ opacity: 1;
1571
+ transform: translateY(0);
1572
+ }
1573
+ }
1574
+
1575
+ @keyframes rp-dot-progress {
1576
+ from {
1577
+ transform: scaleX(0);
1578
+ }
1579
+ to {
1580
+ transform: scaleX(1);
1581
+ }
1582
+ }
1583
+
1584
+ @keyframes rp-load-pulse {
1585
+ 0%,
1586
+ 100% {
1587
+ opacity: 0.45;
1588
+ }
1589
+ 50% {
1590
+ opacity: 1;
1591
+ }
1592
+ }
1593
+
1594
+ @keyframes rp-load-dots {
1595
+ 0%,
1596
+ 80%,
1597
+ 100% {
1598
+ opacity: 0.35;
1599
+ transform: scale(0.85);
1600
+ }
1601
+ 40% {
1602
+ opacity: 1;
1603
+ transform: scale(1);
1604
+ }
1605
+ }
1606
+
1607
+ .rp-glass {
1608
+ background: color-mix(in srgb, var(--bg-box) 78%, transparent);
1609
+ backdrop-filter: blur(14px) saturate(1.35);
1610
+ -webkit-backdrop-filter: blur(14px) saturate(1.35);
1611
+ border: 1px solid color-mix(in srgb, var(--border-color) 55%, transparent);
1612
+ }
1613
+
1614
+ .rp-glass-dark {
1615
+ background: rgb(0 0 0 / 28%);
1616
+ backdrop-filter: blur(14px) saturate(1.25);
1617
+ -webkit-backdrop-filter: blur(14px) saturate(1.25);
1618
+ border: 1px solid rgb(255 255 255 / 14%);
1619
+ }
1620
+
1621
+ /* Carousel — bottom gradient caption, no heavy glass card */
1622
+ .rp-carousel-overlay {
1623
+ background: linear-gradient(
1624
+ to top,
1625
+ rgb(0 0 0 / 62%) 0%,
1626
+ rgb(0 0 0 / 28%) 38%,
1627
+ rgb(0 0 0 / 6%) 68%,
1628
+ transparent 100%
1629
+ );
1630
+ }
1631
+
1632
+ .rp-carousel-caption {
1633
+ text-shadow: 0 1px 2px rgb(0 0 0 / 35%);
1634
+ }
1635
+
1636
+ .rp-carousel-caption h2 {
1637
+ text-shadow: 0 1px 3px rgb(0 0 0 / 45%);
1638
+ }
1639
+
1640
+ @keyframes rp-carousel-meteor {
1641
+ from {
1642
+ transform: translateX(-100%);
1643
+ }
1644
+
1645
+ to {
1646
+ transform: translateX(400%);
1647
+ }
1648
+ }
1649
+
1650
+ .rp-carousel-progress-track {
1651
+ position: relative;
1652
+ height: 3px;
1653
+ overflow: hidden;
1654
+ background: rgb(255 255 255 / 10%);
1655
+ }
1656
+
1657
+ .rp-carousel-progress-meteor {
1658
+ position: absolute;
1659
+ top: 0;
1660
+ left: 0;
1661
+ width: 28%;
1662
+ height: 100%;
1663
+ background: linear-gradient(
1664
+ to right,
1665
+ transparent 0%,
1666
+ color-mix(in srgb, var(--primary-color) 18%, transparent) 30%,
1667
+ color-mix(in srgb, var(--primary-color) 55%, rgb(255 255 255 / 55%)) 68%,
1668
+ color-mix(in srgb, var(--primary-color) 88%, rgb(255 255 255 / 92%)) 88%,
1669
+ #fff 100%
1670
+ );
1671
+ border-radius: 0 9999px 9999px 0;
1672
+ box-shadow:
1673
+ 0 0 10px color-mix(in srgb, var(--primary-color) 55%, transparent),
1674
+ 0 0 22px color-mix(in srgb, var(--primary-color) 28%, transparent);
1675
+ transform: translateX(-100%);
1676
+ animation: rp-carousel-meteor var(--rp-autoplay-ms, 5s) linear forwards;
1677
+ will-change: transform;
1678
+ }
1679
+
1680
+ .rp-carousel-progress-meteor::after {
1681
+ content: '';
1682
+ position: absolute;
1683
+ top: 50%;
1684
+ right: 0;
1685
+ width: 5px;
1686
+ height: 5px;
1687
+ border-radius: 50%;
1688
+ background: #fff;
1689
+ transform: translate(40%, -50%);
1690
+ box-shadow:
1691
+ 0 0 4px 1px rgb(255 255 255 / 95%),
1692
+ 0 0 10px 3px color-mix(in srgb, var(--primary-color) 75%, transparent);
1693
+ }
1694
+
1695
+ .rp-carousel.is-paused .rp-carousel-progress-meteor {
1696
+ animation-play-state: paused;
1697
+ }
1698
+
1699
+ .rp-carousel-dot {
1700
+ display: block;
1701
+ border-radius: 9999px;
1702
+ background: rgb(255 255 255 / 42%);
1703
+ transition:
1704
+ width 0.3s cubic-bezier(0.22, 1, 0.36, 1),
1705
+ background-color 0.3s ease,
1706
+ opacity 0.3s ease;
1707
+ }
1708
+
1709
+ .rp-carousel-dot.is-active {
1710
+ width: 18px;
1711
+ background: rgb(255 255 255 / 95%);
1712
+ }
1713
+
1714
+ .rp-carousel-dot:not(.is-active) {
1715
+ width: 6px;
1716
+ height: 6px;
1717
+ }
1718
+
1719
+ .rp-carousel-dot:not(.is-active):hover {
1720
+ background: rgb(255 255 255 / 72%);
1721
+ }
1722
+
1723
+ .rp-carousel-nav {
1724
+ background: rgb(255 255 255 / 14%);
1725
+ backdrop-filter: blur(10px) saturate(1.2);
1726
+ -webkit-backdrop-filter: blur(10px) saturate(1.2);
1727
+ border: 1px solid rgb(255 255 255 / 22%);
1728
+ box-shadow: 0 2px 12px rgb(0 0 0 / 18%);
1729
+ }
1730
+
1731
+ .rp-home-enter {
1732
+ animation: rp-fade-up 0.6s cubic-bezier(0.22, 1, 0.36, 1) both;
1733
+ }
1734
+
1735
+ .rp-home-enter-delayed {
1736
+ animation: rp-fade-up 0.65s cubic-bezier(0.22, 1, 0.36, 1) 0.08s both;
1737
+ }
1738
+
1739
+ .rp-home-sidebar-enter {
1740
+ animation: rp-fade-up 0.65s cubic-bezier(0.22, 1, 0.36, 1) 0.14s both;
1741
+ }
1742
+
1743
+ .rp-home-card-enter {
1744
+ animation: rp-fade-up 0.48s cubic-bezier(0.22, 1, 0.36, 1) both;
1745
+ }
1746
+
1747
+ .rp-home-stagger > .rp-article-card:nth-child(1) {
1748
+ animation-delay: 0ms;
1749
+ }
1750
+ .rp-home-stagger > .rp-article-card:nth-child(2) {
1751
+ animation-delay: 55ms;
1752
+ }
1753
+ .rp-home-stagger > .rp-article-card:nth-child(3) {
1754
+ animation-delay: 110ms;
1755
+ }
1756
+ .rp-home-stagger > .rp-article-card:nth-child(4) {
1757
+ animation-delay: 165ms;
1758
+ }
1759
+ .rp-home-stagger > .rp-article-card:nth-child(5) {
1760
+ animation-delay: 220ms;
1761
+ }
1762
+ .rp-home-stagger > .rp-article-card:nth-child(6) {
1763
+ animation-delay: 275ms;
1764
+ }
1765
+ .rp-home-stagger > .rp-article-card:nth-child(n + 7) {
1766
+ animation-delay: 320ms;
1767
+ }
1768
+
1769
+ .rp-carousel-slide {
1770
+ transition:
1771
+ opacity 0.75s cubic-bezier(0.4, 0, 0.2, 1),
1772
+ visibility 0.75s;
1773
+ }
1774
+
1775
+ .rp-carousel-slide.is-active {
1776
+ opacity: 1;
1777
+ visibility: visible;
1778
+ z-index: 2;
1779
+ }
1780
+
1781
+ .rp-carousel-slide:not(.is-active) {
1782
+ opacity: 0;
1783
+ visibility: hidden;
1784
+ z-index: 1;
1785
+ }
1786
+
1787
+ .rp-carousel-text-enter {
1788
+ animation: rp-carousel-text-in 0.55s cubic-bezier(0.22, 1, 0.36, 1) 0.12s both;
1789
+ }
1790
+
1791
+ .rp-carousel-dot-progress {
1792
+ transform-origin: left center;
1793
+ animation: rp-dot-progress var(--rp-autoplay-ms, 5s) linear forwards;
1794
+ }
1795
+
1796
+ .rp-load-indicator {
1797
+ display: inline-flex;
1798
+ align-items: center;
1799
+ gap: 6px;
1800
+ }
1801
+
1802
+ .rp-load-indicator span {
1803
+ display: block;
1804
+ width: 5px;
1805
+ height: 5px;
1806
+ border-radius: 50%;
1807
+ background: var(--primary-color);
1808
+ animation: rp-load-dots 1.2s ease-in-out infinite;
1809
+ }
1810
+
1811
+ .rp-load-indicator span:nth-child(2) {
1812
+ animation-delay: 0.15s;
1813
+ }
1814
+
1815
+ .rp-load-indicator span:nth-child(3) {
1816
+ animation-delay: 0.3s;
1817
+ }
1818
+
1819
+ .rp-category-menu-glass {
1820
+ background: color-mix(in srgb, var(--bg-box) 88%, transparent);
1821
+ backdrop-filter: blur(12px) saturate(1.3);
1822
+ -webkit-backdrop-filter: blur(12px) saturate(1.3);
1823
+ }
1824
+
1825
+ .rp-widget-panel {
1826
+ transition:
1827
+ transform 0.28s cubic-bezier(0.22, 1, 0.36, 1),
1828
+ box-shadow 0.28s cubic-bezier(0.22, 1, 0.36, 1),
1829
+ border-color 0.28s ease;
1830
+ }
1831
+
1832
+ /* Sidebar widgets — aligned card width & body height */
1833
+ .rp-sidebar-widget {
1834
+ --rp-sidebar-widget-body-h: 222px;
1835
+ display: flex;
1836
+ flex-direction: column;
1837
+ width: 100%;
1838
+ }
1839
+
1840
+ .rp-sidebar-widget__header {
1841
+ display: flex;
1842
+ align-items: center;
1843
+ flex-shrink: 0;
1844
+ min-height: 53px;
1845
+ padding: 1rem;
1846
+ border-bottom: 1px solid var(--border-color);
1847
+ font-weight: 700;
1848
+ color: var(--main-text-color);
1849
+ box-sizing: border-box;
1850
+ }
1851
+
1852
+ .rp-sidebar-widget__body {
1853
+ height: var(--rp-sidebar-widget-body-h);
1854
+ min-height: var(--rp-sidebar-widget-body-h);
1855
+ max-height: var(--rp-sidebar-widget-body-h);
1856
+ overflow: hidden;
1857
+ box-sizing: border-box;
1858
+ }
1859
+
1860
+ .rp-sidebar-widget--compact .rp-sidebar-widget__body {
1861
+ height: auto;
1862
+ min-height: 0;
1863
+ max-height: none;
1864
+ }
1865
+
1866
+ .rp-sidebar-widget--compact .rp-sidebar-widget__tags-list {
1867
+ height: auto;
1868
+ min-height: 0;
1869
+ }
1870
+
1871
+ .rp-sidebar-widget__body .rp-recommend-scroll {
1872
+ height: 100%;
1873
+ padding-block: 0.375rem;
1874
+ box-sizing: border-box;
1875
+ }
1876
+
1877
+ .rp-sidebar-widget__body .rp-recommend-list:not(.rp-recommend-scroll-track) {
1878
+ height: 100%;
1879
+ overflow: hidden;
1880
+ padding-block: 0.375rem;
1881
+ box-sizing: border-box;
1882
+ }
1883
+
1884
+ .rp-sidebar-widget__tag-host {
1885
+ position: relative;
1886
+ width: 100%;
1887
+ height: 100%;
1888
+ }
1889
+
1890
+ .rp-sidebar-widget__tag-host .rp-tag-cloud,
1891
+ .rp-sidebar-widget__tag-host .rp-tag-cloud-skeleton {
1892
+ position: absolute;
1893
+ inset: 0;
1894
+ width: 100%;
1895
+ height: 100%;
1896
+ margin: 0;
1897
+ }
1898
+
1899
+ .rp-sidebar-widget__tags-list {
1900
+ display: flex;
1901
+ height: 100%;
1902
+ flex-wrap: wrap;
1903
+ align-content: flex-start;
1904
+ gap: 0.5rem;
1905
+ overflow: auto;
1906
+ padding: 1rem;
1907
+ margin: 0;
1908
+ list-style: none;
1909
+ }
1910
+
1911
+ .rp-widget-panel:hover {
1912
+ box-shadow:
1913
+ 0 4px 16px color-mix(in srgb, var(--main-text-color) 8%, transparent),
1914
+ var(--box-shadow);
1915
+ }
1916
+
1917
+ .rp-recommend-fade-in {
1918
+ animation: rp-fade-in 0.45s cubic-bezier(0.22, 1, 0.36, 1) both;
1919
+ }
1920
+
1921
+ /* ── Site-wide motion ── */
1922
+ .rp-page-enter {
1923
+ animation: rp-fade-up 0.45s var(--rp-ease-out) both;
1924
+ }
1925
+
1926
+ .rp-page-enter-delayed,
1927
+ .rp-home-enter-delayed {
1928
+ animation: rp-fade-up 0.5s var(--rp-ease-out) 0.06s both;
1929
+ }
1930
+
1931
+ .rp-sidebar-enter,
1932
+ .rp-home-sidebar-enter {
1933
+ animation: rp-fade-up 0.55s var(--rp-ease-out) 0.1s both;
1934
+ }
1935
+
1936
+ .rp-surface {
1937
+ border-radius: var(--border-radius);
1938
+ background-color: var(--bg-box);
1939
+ box-shadow: var(--box-shadow);
1940
+ transition:
1941
+ transform var(--rp-duration-normal) var(--rp-ease-out),
1942
+ box-shadow var(--rp-duration-normal) var(--rp-ease-out),
1943
+ border-color var(--rp-duration-fast) ease;
1944
+ }
1945
+
1946
+ .rp-article-card.rp-surface {
1947
+ transition:
1948
+ box-shadow var(--rp-duration-normal) var(--rp-ease-out),
1949
+ border-color var(--rp-duration-fast) ease;
1950
+ }
1951
+
1952
+ .rp-surface--interactive:hover {
1953
+ transform: translateY(-2px);
1954
+ box-shadow:
1955
+ 0 8px 24px color-mix(in srgb, var(--main-text-color) 9%, transparent),
1956
+ var(--box-shadow);
1957
+ }
1958
+
1959
+ .rp-header-bar {
1960
+ transition:
1961
+ transform var(--rp-duration-normal) var(--rp-ease-out),
1962
+ background-color var(--rp-duration-normal) ease,
1963
+ box-shadow var(--rp-duration-normal) ease,
1964
+ border-color var(--rp-duration-normal) ease;
1965
+ }
1966
+
1967
+ .rp-header-bar.is-affix.is-visible {
1968
+ background: color-mix(in srgb, var(--bg-box) 86%, transparent);
1969
+ backdrop-filter: blur(16px) saturate(1.35);
1970
+ -webkit-backdrop-filter: blur(16px) saturate(1.35);
1971
+ box-shadow:
1972
+ 0 1px 0 color-mix(in srgb, var(--border-color) 80%, transparent),
1973
+ 0 4px 20px color-mix(in srgb, var(--main-text-color) 6%, transparent);
1974
+ }
1975
+
1976
+ .rp-nav-link {
1977
+ transition:
1978
+ color var(--rp-duration-fast) ease,
1979
+ border-color var(--rp-duration-fast) ease,
1980
+ background-color var(--rp-duration-normal) var(--rp-ease-out);
1981
+ }
1982
+
1983
+ @keyframes rp-drawer-in {
1984
+ from {
1985
+ opacity: 0;
1986
+ transform: translateY(-10px);
1987
+ }
1988
+ to {
1989
+ opacity: 1;
1990
+ transform: translateY(0);
1991
+ }
1992
+ }
1993
+
1994
+ @keyframes rp-backdrop-in {
1995
+ from {
1996
+ opacity: 0;
1997
+ }
1998
+ to {
1999
+ opacity: 1;
2000
+ }
2001
+ }
2002
+
2003
+ .rp-mobile-drawer {
2004
+ animation: rp-drawer-in 0.3s var(--rp-ease-out) both;
2005
+ }
2006
+
2007
+ .rp-mobile-backdrop {
2008
+ animation: rp-backdrop-in 0.25s ease both;
2009
+ }
2010
+
2011
+ .rp-back-to-top {
2012
+ opacity: 0;
2013
+ transform: translateY(10px) scale(0.94);
2014
+ pointer-events: none;
2015
+ background: color-mix(in srgb, var(--bg-box) 88%, transparent);
2016
+ backdrop-filter: blur(12px) saturate(1.3);
2017
+ -webkit-backdrop-filter: blur(12px) saturate(1.3);
2018
+ transition:
2019
+ opacity var(--rp-duration-normal) var(--rp-ease-out),
2020
+ transform var(--rp-duration-normal) var(--rp-ease-out),
2021
+ color var(--rp-duration-fast) ease,
2022
+ box-shadow var(--rp-duration-normal) var(--rp-ease-out);
2023
+ }
2024
+
2025
+ .rp-back-to-top.is-visible {
2026
+ opacity: 1;
2027
+ transform: translateY(0) scale(1);
2028
+ pointer-events: auto;
2029
+ }
2030
+
2031
+ .rp-back-to-top:hover {
2032
+ box-shadow: 0 4px 16px color-mix(in srgb, var(--main-text-color) 10%, transparent);
2033
+ }
2034
+
2035
+ .rp-icon-btn {
2036
+ transition:
2037
+ color var(--rp-duration-fast) ease,
2038
+ background-color var(--rp-duration-normal) var(--rp-ease-out),
2039
+ transform var(--rp-duration-fast) var(--rp-ease-out);
2040
+ }
2041
+
2042
+ .rp-icon-btn:hover {
2043
+ transform: scale(1.06);
2044
+ }
2045
+
2046
+ .rp-icon-btn:active {
2047
+ transform: scale(0.96);
2048
+ }
2049
+
2050
+ @keyframes rp-like-pop {
2051
+ 0% {
2052
+ transform: scale(1);
2053
+ }
2054
+ 45% {
2055
+ transform: scale(1.24);
2056
+ }
2057
+ 100% {
2058
+ transform: scale(1);
2059
+ }
2060
+ }
2061
+
2062
+ .rp-action-btn {
2063
+ position: relative;
2064
+ display: inline-flex;
2065
+ align-items: center;
2066
+ justify-content: center;
2067
+ width: 2.625rem;
2068
+ height: 2.625rem;
2069
+ padding: 0;
2070
+ border: 0;
2071
+ border-radius: 0.5rem;
2072
+ background: transparent;
2073
+ color: var(--second-text-color);
2074
+ cursor: pointer;
2075
+ -webkit-tap-highlight-color: transparent;
2076
+ transition:
2077
+ transform var(--rp-duration-fast) var(--rp-ease-out),
2078
+ color var(--rp-duration-fast) ease;
2079
+ }
2080
+
2081
+ .rp-action-btn:hover {
2082
+ color: var(--main-text-color);
2083
+ }
2084
+
2085
+ .rp-action-btn:focus-visible {
2086
+ outline: 2px solid color-mix(in srgb, var(--primary-color) 45%, transparent);
2087
+ outline-offset: 2px;
2088
+ }
2089
+
2090
+ .rp-action-btn:active {
2091
+ transform: scale(0.94);
2092
+ }
2093
+
2094
+ .rp-action-btn.is-disabled,
2095
+ .rp-action-btn:disabled {
2096
+ opacity: 0.55;
2097
+ cursor: not-allowed;
2098
+ pointer-events: none;
2099
+ }
2100
+
2101
+ .rp-action-btn.is-disabled:active,
2102
+ .rp-action-btn:disabled:active {
2103
+ transform: none;
2104
+ }
2105
+
2106
+ .rp-action-btn.is-liked,
2107
+ .rp-action-btn.is-bookmarked,
2108
+ .rp-action-btn.is-shared {
2109
+ color: var(--primary-color);
2110
+ }
2111
+
2112
+ .rp-action-btn.is-liked svg {
2113
+ fill: currentColor;
2114
+ stroke: currentColor;
2115
+ }
2116
+
2117
+ .rp-action-btn.is-bookmarked svg {
2118
+ fill: currentColor;
2119
+ }
2120
+
2121
+ .rp-action-btn.is-liked svg,
2122
+ .rp-action-btn.is-bookmarked svg,
2123
+ .rp-action-btn.is-shared svg {
2124
+ animation: rp-like-pop 0.42s var(--rp-ease-out);
2125
+ }
2126
+
2127
+ .rp-action-btn__count-below {
2128
+ min-height: 0.875rem;
2129
+ font-size: 0.6875rem;
2130
+ font-weight: 500;
2131
+ line-height: 1;
2132
+ color: var(--second-text-color);
2133
+ text-align: center;
2134
+ }
2135
+
2136
+ .rp-action-btn.is-liked .rp-action-btn__count-below,
2137
+ .rp-action-btn.is-bookmarked .rp-action-btn__count-below {
2138
+ color: inherit;
2139
+ }
2140
+
2141
+ .rp-action-btn--inline {
2142
+ width: auto;
2143
+ height: auto;
2144
+ min-height: 2.375rem;
2145
+ padding: 0.4375rem 0.875rem;
2146
+ gap: 0.375rem;
2147
+ border-radius: 9999px;
2148
+ border: 1px solid color-mix(in srgb, var(--border-color) 85%, transparent);
2149
+ background: var(--bg-box);
2150
+ font-size: 0.8125rem;
2151
+ font-weight: 500;
2152
+ box-shadow: 0 1px 2px color-mix(in srgb, var(--main-text-color) 4%, transparent);
2153
+ }
2154
+
2155
+ .rp-action-btn--inline:hover {
2156
+ border-color: color-mix(in srgb, var(--primary-color) 35%, var(--border-color));
2157
+ background: color-mix(in srgb, var(--primary-color) 6%, var(--bg-box));
2158
+ transform: translateY(-1px);
2159
+ box-shadow: 0 3px 10px color-mix(in srgb, var(--primary-color) 12%, transparent);
2160
+ }
2161
+
2162
+ .rp-action-btn--inline:active {
2163
+ transform: translateY(0) scale(0.98);
2164
+ }
2165
+
2166
+ .rp-action-btn--inline.is-liked,
2167
+ .rp-action-btn--inline.is-bookmarked {
2168
+ border-color: color-mix(in srgb, var(--primary-color) 35%, var(--border-color));
2169
+ background: color-mix(in srgb, var(--primary-color) 8%, var(--bg-box));
2170
+ color: var(--primary-color);
2171
+ }
2172
+
2173
+ .rp-action-btn--mobile {
2174
+ position: relative;
2175
+ flex-direction: column;
2176
+ width: auto;
2177
+ height: auto;
2178
+ min-height: 3rem;
2179
+ padding: 0.375rem 0.5rem;
2180
+ gap: 0.125rem;
2181
+ border-radius: 0.75rem;
2182
+ background: transparent;
2183
+ }
2184
+
2185
+ .rp-action-btn--mobile:hover {
2186
+ background: color-mix(in srgb, var(--primary-color) 8%, transparent);
2187
+ transform: none;
2188
+ }
2189
+
2190
+ .rp-action-btn--mobile:active {
2191
+ transform: scale(0.95);
2192
+ }
2193
+
2194
+ .rp-action-btn--mobile.is-liked,
2195
+ .rp-action-btn--mobile.is-bookmarked {
2196
+ background: color-mix(in srgb, var(--primary-color) 10%, transparent);
2197
+ }
2198
+
2199
+ .rp-action-btn__mobile-label {
2200
+ font-size: 0.625rem;
2201
+ font-weight: 500;
2202
+ line-height: 1.2;
2203
+ color: inherit;
2204
+ opacity: 0.85;
2205
+ }
2206
+
2207
+ .rp-action-btn__mobile-count {
2208
+ position: absolute;
2209
+ top: 0.25rem;
2210
+ right: 0.375rem;
2211
+ min-width: 0.875rem;
2212
+ padding: 0 0.25rem;
2213
+ border-radius: 9999px;
2214
+ background: var(--primary-color);
2215
+ color: #fff;
2216
+ font-size: 0.5625rem;
2217
+ font-weight: 700;
2218
+ line-height: 0.875rem;
2219
+ text-align: center;
2220
+ }
2221
+
2222
+ .rp-action-btn__icon {
2223
+ display: inline-flex;
2224
+ flex-shrink: 0;
2225
+ }
2226
+
2227
+ .rp-action-btn__label {
2228
+ white-space: nowrap;
2229
+ }
2230
+
2231
+ .rp-action-btn__count {
2232
+ min-width: 1.125rem;
2233
+ padding: 0 0.3rem;
2234
+ border-radius: 9999px;
2235
+ background: color-mix(in srgb, var(--primary-color) 14%, transparent);
2236
+ color: var(--primary-color);
2237
+ font-size: 0.75rem;
2238
+ font-weight: 600;
2239
+ line-height: 1.25rem;
2240
+ }
2241
+
2242
+ @keyframes rp-carousel-kenburns {
2243
+ from {
2244
+ transform: scale(1) translate(0, 0);
2245
+ }
2246
+ to {
2247
+ transform: scale(1.1) translate(-1.5%, -1%);
2248
+ }
2249
+ }
2250
+
2251
+ .rp-cover-zoom {
2252
+ transform-origin: center center;
2253
+ transition: transform 500ms cubic-bezier(0.22, 1, 0.36, 1);
2254
+ }
2255
+
2256
+ .rp-carousel .rp-carousel-slide.is-active .rp-carousel-cover-motion {
2257
+ animation: rp-carousel-kenburns var(--rp-autoplay-ms, 5s) linear forwards;
2258
+ transition: none;
2259
+ }
2260
+
2261
+ .rp-carousel.is-paused .rp-carousel-slide.is-active .rp-carousel-cover-motion {
2262
+ animation-play-state: paused;
2263
+ }
2264
+
2265
+ .rp-cover-zoom-host:hover .rp-cover-zoom,
2266
+ .rp-carousel.is-paused:hover .rp-carousel-slide.is-active .rp-cover-zoom {
2267
+ transform: scale(1.05);
2268
+ }
2269
+
2270
+ @media (prefers-reduced-motion: reduce) {
2271
+ .rp-cover-zoom {
2272
+ transition: none;
2273
+ }
2274
+
2275
+ .rp-carousel .rp-carousel-slide.is-active .rp-carousel-cover-motion {
2276
+ animation: none;
2277
+ }
2278
+
2279
+ .rp-cover-zoom-host:hover .rp-cover-zoom,
2280
+ .rp-carousel.is-paused:hover .rp-carousel-slide.is-active .rp-cover-zoom {
2281
+ transform: none;
2282
+ }
2283
+ }
2284
+
2285
+ .rp-archive-banner {
2286
+ position: relative;
2287
+ }
2288
+
2289
+ .rp-archive-banner::before {
2290
+ content: '';
2291
+ position: absolute;
2292
+ inset: 0;
2293
+ background: linear-gradient(
2294
+ to top,
2295
+ rgb(0 0 0 / 55%) 0%,
2296
+ rgb(0 0 0 / 22%) 45%,
2297
+ rgb(0 0 0 / 8%) 100%
2298
+ );
2299
+ pointer-events: none;
2300
+ }
2301
+
2302
+ .rp-archive-banner__content {
2303
+ position: relative;
2304
+ z-index: 1;
2305
+ animation: rp-fade-up 0.55s var(--rp-ease-out) 0.08s both;
2306
+ }
2307
+
2308
+ .rp-nav-card.rp-surface--interactive {
2309
+ border-radius: 0.75rem;
2310
+ }
2311
+
2312
+ .rp-nav-list-item {
2313
+ transition: transform var(--rp-duration-normal) var(--rp-ease-out);
2314
+ }
2315
+
2316
+ .rp-nav-list-item:hover {
2317
+ transform: translateX(3px);
2318
+ }
2319
+
2320
+ .rp-floating-widget {
2321
+ transition:
2322
+ transform var(--rp-duration-normal) var(--rp-ease-out),
2323
+ opacity var(--rp-duration-normal) ease;
2324
+ }
2325
+
2326
+ /* Article detail page — dev.to inspired reading layout */
2327
+ .rp-article-wrap {
2328
+ animation: rp-fade-up 0.5s var(--rp-ease-out) both;
2329
+ overflow: hidden;
2330
+ border-radius: 0.5rem;
2331
+ background: var(--bg-box);
2332
+ border: 1px solid color-mix(in srgb, var(--border-color) 50%, transparent);
2333
+ box-shadow: 0 1px 3px color-mix(in srgb, var(--main-text-color) 4%, transparent);
2334
+ }
2335
+
2336
+ .rp-article-cover-hero {
2337
+ position: relative;
2338
+ max-height: min(28rem, 52vw);
2339
+ overflow: hidden;
2340
+ background: var(--bg-second);
2341
+ }
2342
+
2343
+ .rp-article-cover-hero::after {
2344
+ content: '';
2345
+ position: absolute;
2346
+ inset: 0;
2347
+ background: linear-gradient(
2348
+ to bottom,
2349
+ transparent 55%,
2350
+ color-mix(in srgb, var(--bg-box) 25%, transparent) 100%
2351
+ );
2352
+ pointer-events: none;
2353
+ }
2354
+
2355
+ .rp-article-cover-hero img {
2356
+ display: block;
2357
+ width: 100%;
2358
+ height: 100%;
2359
+ max-height: min(28rem, 52vw);
2360
+ object-fit: cover;
2361
+ }
2362
+
2363
+ .rp-article-inner {
2364
+ width: 100%;
2365
+ padding: 1.5rem 1.5rem 2.25rem;
2366
+ }
2367
+
2368
+ @media (min-width: 768px) {
2369
+ .rp-article-inner {
2370
+ padding: 1.75rem 2rem 2.5rem;
2371
+ }
2372
+ }
2373
+
2374
+ .rp-article-header {
2375
+ margin-bottom: 1.75rem;
2376
+ padding-bottom: 0;
2377
+ border-bottom: none;
2378
+ }
2379
+
2380
+ .rp-article-wrap:has(.rp-article-cover-hero) .rp-article-inner {
2381
+ padding-top: 1.5rem;
2382
+ }
2383
+
2384
+ .rp-article-title {
2385
+ margin: 0.5rem 0 0;
2386
+ font-size: clamp(1.875rem, 5vw, 2.75rem);
2387
+ font-weight: 800;
2388
+ line-height: 1.2;
2389
+ letter-spacing: -0.03em;
2390
+ color: var(--main-text-color);
2391
+ text-wrap: balance;
2392
+ }
2393
+
2394
+ .rp-article-lead {
2395
+ margin: 0.875rem 0 0;
2396
+ max-width: 42rem;
2397
+ font-size: 1.0625rem;
2398
+ line-height: 1.7;
2399
+ color: var(--second-text-color);
2400
+ }
2401
+
2402
+ .rp-article-meta-row {
2403
+ display: flex;
2404
+ flex-wrap: wrap;
2405
+ align-items: center;
2406
+ gap: 0.5rem 0.625rem;
2407
+ }
2408
+
2409
+ .rp-article-meta-chip {
2410
+ font-size: 0.875rem;
2411
+ line-height: 1.4;
2412
+ color: var(--second-text-color);
2413
+ }
2414
+
2415
+ .rp-article-meta-dot {
2416
+ width: 3px;
2417
+ height: 3px;
2418
+ border-radius: 9999px;
2419
+ background: var(--disable-text-color);
2420
+ flex-shrink: 0;
2421
+ }
2422
+
2423
+ .rp-article-body {
2424
+ padding: 0;
2425
+ }
2426
+
2427
+ .rp-article-body .markdown {
2428
+ letter-spacing: 0.01em;
2429
+ font-size: 1.0625rem;
2430
+ line-height: 1.85;
2431
+ color: var(--main-text-color);
2432
+ }
2433
+
2434
+ .rp-article-body .markdown p {
2435
+ margin-top: 0;
2436
+ margin-bottom: 1.25em;
2437
+ }
2438
+
2439
+ .rp-article-body .markdown blockquote {
2440
+ margin: 1.25rem 0;
2441
+ padding: 0.25rem 0 0.25rem 1rem;
2442
+ border: none;
2443
+ border-left: 4px solid color-mix(in srgb, var(--border-color) 90%, transparent);
2444
+ border-radius: 0;
2445
+ background: transparent;
2446
+ color: var(--second-text-color);
2447
+ }
2448
+
2449
+ .rp-article-body .markdown blockquote p {
2450
+ margin-top: 0;
2451
+ margin-bottom: 0;
2452
+ }
2453
+
2454
+ .rp-article-body .markdown blockquote p + p {
2455
+ margin-top: 0.75em;
2456
+ }
2457
+
2458
+ .rp-article-body .markdown pre {
2459
+ margin: 1.25rem 0;
2460
+ }
2461
+
2462
+ .rp-article-body .markdown table {
2463
+ margin: 1.25rem 0;
2464
+ }
2465
+
2466
+ .rp-article-body .markdown ul,
2467
+ .rp-article-body .markdown ol {
2468
+ margin: 0 0 1.25em;
2469
+ }
2470
+
2471
+ .rp-article-body .markdown li > ul,
2472
+ .rp-article-body .markdown li > ol {
2473
+ margin-bottom: 0;
2474
+ }
2475
+
2476
+ .rp-article-body .markdown h1,
2477
+ .rp-article-body .markdown h2,
2478
+ .rp-article-body .markdown h3,
2479
+ .rp-article-body .markdown h4 {
2480
+ letter-spacing: -0.015em;
2481
+ margin-top: 2em;
2482
+ margin-bottom: 0.65em;
2483
+ }
2484
+
2485
+ .rp-article-body .markdown h2 {
2486
+ padding-bottom: 0.5rem;
2487
+ font-size: 1.375rem;
2488
+ border-bottom: 1px solid color-mix(in srgb, var(--border-color) 65%, transparent);
2489
+ }
2490
+
2491
+ .rp-article-body .markdown h3 {
2492
+ font-size: 1.125rem;
2493
+ }
2494
+
2495
+ .rp-article-body .markdown > :first-child {
2496
+ margin-top: 0;
2497
+ }
2498
+
2499
+ .rp-article-body .markdown a {
2500
+ color: var(--link-color);
2501
+ text-decoration: underline;
2502
+ text-decoration-color: color-mix(in srgb, var(--link-color) 35%, transparent);
2503
+ text-underline-offset: 0.15em;
2504
+ transition: text-decoration-color var(--rp-duration-fast) ease;
2505
+ }
2506
+
2507
+ .rp-article-body .markdown a:hover {
2508
+ text-decoration-color: var(--link-color);
2509
+ }
2510
+
2511
+ .rp-article-body .markdown code:not(pre code) {
2512
+ font-size: 0.9em;
2513
+ padding: 0.15em 0.4em;
2514
+ border-radius: 0.3125rem;
2515
+ background: var(--bg-second);
2516
+ border: 1px solid color-mix(in srgb, var(--border-color) 50%, transparent);
2517
+ }
2518
+
2519
+ .rp-article-footer {
2520
+ margin-top: 2.5rem;
2521
+ padding-top: 0;
2522
+ border-top: none;
2523
+ }
2524
+
2525
+ .rp-article-author-footer {
2526
+ margin-top: 0.25rem;
2527
+ }
2528
+
2529
+ .rp-article-author-panel {
2530
+ overflow: hidden;
2531
+ border-radius: 0.75rem;
2532
+ border: 1px solid color-mix(in srgb, var(--border-color) 55%, transparent);
2533
+ background: color-mix(in srgb, var(--bg-second) 65%, var(--bg-box));
2534
+ }
2535
+
2536
+ .rp-article-author-main {
2537
+ display: flex;
2538
+ align-items: center;
2539
+ gap: 1rem;
2540
+ padding: 1.125rem 1.25rem;
2541
+ }
2542
+
2543
+ .rp-article-author-avatar {
2544
+ display: inline-flex;
2545
+ flex-shrink: 0;
2546
+ align-items: center;
2547
+ justify-content: center;
2548
+ width: 3.5rem;
2549
+ height: 3.5rem;
2550
+ border-radius: 0.75rem;
2551
+ overflow: hidden;
2552
+ border: 1px solid color-mix(in srgb, var(--border-color) 50%, transparent);
2553
+ background: var(--bg-box);
2554
+ text-decoration: none;
2555
+ transition:
2556
+ border-color var(--rp-duration-fast) ease,
2557
+ transform var(--rp-duration-fast) var(--rp-ease-out);
2558
+ }
2559
+
2560
+ .rp-article-author-avatar:hover {
2561
+ border-color: color-mix(in srgb, var(--primary-color) 35%, var(--border-color));
2562
+ transform: translateY(-1px);
2563
+ }
2564
+
2565
+ .rp-article-author-avatar__img {
2566
+ display: block;
2567
+ width: 100%;
2568
+ height: 100%;
2569
+ padding: 0.375rem;
2570
+ object-fit: contain;
2571
+ }
2572
+
2573
+ .rp-article-author-avatar__brand {
2574
+ display: flex;
2575
+ align-items: center;
2576
+ justify-content: center;
2577
+ width: 100%;
2578
+ height: 100%;
2579
+ padding: 0.375rem;
2580
+ }
2581
+
2582
+ .rp-article-author-avatar__brand :where(img, svg) {
2583
+ max-width: 100%;
2584
+ max-height: 100%;
2585
+ object-fit: contain;
2586
+ }
2587
+
2588
+ .rp-article-author-avatar__fallback {
2589
+ display: inline-flex;
2590
+ align-items: center;
2591
+ justify-content: center;
2592
+ width: 100%;
2593
+ height: 100%;
2594
+ border-radius: 0.75rem;
2595
+ color: #fff;
2596
+ font-size: 1.25rem;
2597
+ font-weight: 600;
2598
+ line-height: 1;
2599
+ }
2600
+
2601
+ .rp-article-author-info {
2602
+ min-width: 0;
2603
+ flex: 1;
2604
+ }
2605
+
2606
+ .rp-article-author-label {
2607
+ display: block;
2608
+ margin-bottom: 0.125rem;
2609
+ font-size: 0.6875rem;
2610
+ font-weight: 600;
2611
+ letter-spacing: 0.06em;
2612
+ text-transform: uppercase;
2613
+ color: var(--disable-text-color);
2614
+ }
2615
+
2616
+ .rp-article-author-name {
2617
+ display: block;
2618
+ font-size: 1.0625rem;
2619
+ font-weight: 700;
2620
+ line-height: 1.35;
2621
+ color: var(--main-text-color);
2622
+ text-decoration: none;
2623
+ transition: color var(--rp-duration-fast) ease;
2624
+ }
2625
+
2626
+ .rp-article-author-name:hover {
2627
+ color: var(--primary-color);
2628
+ }
2629
+
2630
+ .rp-article-author-bio {
2631
+ margin: 0.25rem 0 0;
2632
+ font-size: 0.8125rem;
2633
+ line-height: 1.55;
2634
+ color: var(--second-text-color);
2635
+ }
2636
+
2637
+ .rp-article-author-cta {
2638
+ display: none;
2639
+ flex-shrink: 0;
2640
+ align-items: center;
2641
+ gap: 0.25rem;
2642
+ padding: 0.4375rem 0.875rem;
2643
+ border-radius: 9999px;
2644
+ border: 1px solid color-mix(in srgb, var(--border-color) 70%, transparent);
2645
+ background: var(--bg-box);
2646
+ color: var(--second-text-color);
2647
+ font-size: 0.8125rem;
2648
+ font-weight: 500;
2649
+ text-decoration: none;
2650
+ white-space: nowrap;
2651
+ transition:
2652
+ color var(--rp-duration-fast) ease,
2653
+ border-color var(--rp-duration-fast) ease,
2654
+ background-color var(--rp-duration-fast) ease;
2655
+ }
2656
+
2657
+ @media (min-width: 640px) {
2658
+ .rp-article-author-cta {
2659
+ display: inline-flex;
2660
+ }
2661
+ }
2662
+
2663
+ .rp-article-author-cta:hover {
2664
+ color: var(--primary-color);
2665
+ border-color: color-mix(in srgb, var(--primary-color) 35%, var(--border-color));
2666
+ background: color-mix(in srgb, var(--primary-color) 5%, var(--bg-box));
2667
+ }
2668
+
2669
+ .rp-article-author-meta {
2670
+ display: flex;
2671
+ flex-wrap: wrap;
2672
+ align-items: center;
2673
+ gap: 0.375rem 0.5rem;
2674
+ padding: 0.75rem 1.25rem;
2675
+ border-top: 1px solid color-mix(in srgb, var(--border-color) 45%, transparent);
2676
+ background: color-mix(in srgb, var(--bg-box) 55%, transparent);
2677
+ font-size: 0.75rem;
2678
+ line-height: 1.6;
2679
+ color: var(--second-text-color);
2680
+ }
2681
+
2682
+ .rp-article-author-meta__sep {
2683
+ color: var(--disable-text-color);
2684
+ user-select: none;
2685
+ }
2686
+
2687
+ .rp-article-author-license {
2688
+ margin-left: 0.25rem;
2689
+ color: var(--link-color);
2690
+ text-decoration: none;
2691
+ border-bottom: 1px solid color-mix(in srgb, var(--link-color) 30%, transparent);
2692
+ transition:
2693
+ color var(--rp-duration-fast) ease,
2694
+ border-color var(--rp-duration-fast) ease;
2695
+ }
2696
+
2697
+ .rp-article-author-license:hover {
2698
+ color: var(--primary-color);
2699
+ border-bottom-color: color-mix(in srgb, var(--primary-color) 40%, transparent);
2700
+ }
2701
+
2702
+ .rp-article-tags {
2703
+ display: flex;
2704
+ flex-wrap: wrap;
2705
+ gap: 0.5rem 0.75rem;
2706
+ margin: 1.25rem 0 0;
2707
+ }
2708
+
2709
+ .rp-article-tags--header {
2710
+ margin: 0.875rem 0 0;
2711
+ }
2712
+
2713
+ .rp-article-tag {
2714
+ display: inline-flex;
2715
+ align-items: center;
2716
+ gap: 0.375rem;
2717
+ padding: 0.375rem 0.875rem;
2718
+ border-radius: 9999px;
2719
+ border: 1px solid color-mix(in srgb, var(--border-color) 80%, transparent);
2720
+ background: var(--bg-second);
2721
+ color: var(--second-text-color);
2722
+ font-size: 0.8125rem;
2723
+ text-decoration: none;
2724
+ transition:
2725
+ color var(--rp-duration-fast) ease,
2726
+ border-color var(--rp-duration-fast) ease,
2727
+ background-color var(--rp-duration-fast) ease,
2728
+ opacity var(--rp-duration-fast) ease;
2729
+ }
2730
+
2731
+ .rp-article-tag--hash {
2732
+ padding: 0;
2733
+ border: none;
2734
+ background: transparent;
2735
+ font-size: 0.9375rem;
2736
+ font-weight: 500;
2737
+ text-decoration: none;
2738
+ }
2739
+
2740
+ .rp-article-tag--hash:hover {
2741
+ opacity: 0.72;
2742
+ background: transparent;
2743
+ border: none;
2744
+ text-decoration: underline;
2745
+ text-decoration-color: currentColor;
2746
+ text-underline-offset: 0.15em;
2747
+ }
2748
+
2749
+ .rp-article-tag:not(.rp-article-tag--hash):hover {
2750
+ color: var(--primary-button-fg);
2751
+ background: var(--primary-button-bg);
2752
+ border-color: var(--primary-button-bg);
2753
+ }
2754
+
2755
+ .rp-article-tag:not(.rp-article-tag--hash):hover svg {
2756
+ color: inherit;
2757
+ }
2758
+
2759
+ .rp-article-actions-bar {
2760
+ display: flex;
2761
+ flex-wrap: wrap;
2762
+ align-items: center;
2763
+ justify-content: center;
2764
+ gap: 0.625rem;
2765
+ margin: 1.75rem 0 0.5rem;
2766
+ padding: 1rem 0;
2767
+ border-top: 1px solid color-mix(in srgb, var(--border-color) 65%, transparent);
2768
+ border-bottom: 1px solid color-mix(in srgb, var(--border-color) 65%, transparent);
2769
+ }
2770
+
2771
+ @media (min-width: 1280px) {
2772
+ .rp-article-actions-bar {
2773
+ display: none;
2774
+ }
2775
+ }
2776
+
2777
+ .rp-article-recommend,
2778
+ .rp-comment-wrap {
2779
+ width: 100%;
2780
+ }
2781
+
2782
+ .rp-article-recommend {
2783
+ margin-top: 1rem;
2784
+ }
2785
+
2786
+ .rp-article-recommend-panel {
2787
+ overflow: visible;
2788
+ background: transparent;
2789
+ border: 0;
2790
+ }
2791
+
2792
+ .rp-article-recommend-panel .rp-article-list {
2793
+ box-shadow: none;
2794
+ }
2795
+
2796
+ .rp-article-page .rp-article-recommend .rp-section-heading {
2797
+ margin-bottom: 0.75rem;
2798
+ }
2799
+
2800
+ .rp-comment-wrap {
2801
+ margin-top: 1.5rem;
2802
+ }
2803
+
2804
+ .rp-article-page .rp-section-heading {
2805
+ justify-content: flex-start;
2806
+ gap: 0.5rem;
2807
+ margin-bottom: 0.75rem;
2808
+ }
2809
+
2810
+ .rp-article-page .rp-section-heading::before {
2811
+ display: none;
2812
+ }
2813
+
2814
+ .rp-article-page .rp-section-heading::after {
2815
+ flex: 1;
2816
+ max-width: none;
2817
+ --rp-section-line-dir: right;
2818
+ }
2819
+
2820
+ .rp-article-page .rp-section-heading__title {
2821
+ letter-spacing: 0.06em;
2822
+ }
2823
+
2824
+ .rp-section-heading {
2825
+ display: flex;
2826
+ align-items: center;
2827
+ justify-content: center;
2828
+ gap: 0.75rem;
2829
+ margin: 0 0 1rem;
2830
+ }
2831
+
2832
+ .rp-section-heading::before,
2833
+ .rp-section-heading::after {
2834
+ content: '';
2835
+ flex: 1;
2836
+ max-width: 4rem;
2837
+ height: 1px;
2838
+ background: linear-gradient(
2839
+ to var(--rp-section-line-dir, right),
2840
+ transparent,
2841
+ color-mix(in srgb, var(--border-color) 90%, transparent)
2842
+ );
2843
+ }
2844
+
2845
+ .rp-section-heading::after {
2846
+ --rp-section-line-dir: left;
2847
+ }
2848
+
2849
+ .rp-section-heading__title {
2850
+ margin: 0;
2851
+ font-size: 0.875rem;
2852
+ font-weight: 600;
2853
+ letter-spacing: 0.08em;
2854
+ text-transform: uppercase;
2855
+ color: var(--second-text-color);
2856
+ white-space: nowrap;
2857
+ }
2858
+
2859
+ .rp-empty-state {
2860
+ display: flex;
2861
+ flex-direction: column;
2862
+ align-items: center;
2863
+ justify-content: center;
2864
+ gap: 0.625rem;
2865
+ padding: 2.5rem 1.5rem;
2866
+ text-align: center;
2867
+ }
2868
+
2869
+ .rp-empty-state__icon {
2870
+ color: color-mix(in srgb, var(--second-text-color) 45%, transparent);
2871
+ }
2872
+
2873
+ .rp-empty-state__text {
2874
+ margin: 0;
2875
+ font-size: 0.875rem;
2876
+ color: var(--second-text-color);
2877
+ }
2878
+
2879
+ .rp-comment-wrap > .rp-comment-panel {
2880
+ overflow: hidden;
2881
+ border-radius: 0.5rem;
2882
+ background: var(--bg-box);
2883
+ border: 1px solid color-mix(in srgb, var(--border-color) 55%, transparent);
2884
+ }
2885
+
2886
+ .rp-toc-panel {
2887
+ overflow: hidden;
2888
+ background: var(--bg-box);
2889
+ border: 1px solid color-mix(in srgb, var(--border-color) 45%, transparent);
2890
+ box-shadow: -4px 0 20px color-mix(in srgb, var(--main-text-color) 6%, transparent);
2891
+ }
2892
+
2893
+ .rp-toc-panel--minimal {
2894
+ padding: 0.625rem 0.5rem 0.625rem 0.375rem;
2895
+ }
2896
+
2897
+ .rp-toc-panel--minimal .rp-article-toc-list {
2898
+ max-height: none !important;
2899
+ overflow: visible !important;
2900
+ }
2901
+
2902
+ .rp-toc-panel--minimal .rp-article-toc-item {
2903
+ padding-top: 0.25rem;
2904
+ padding-bottom: 0.25rem;
2905
+ padding-right: 0.25rem;
2906
+ font-size: 0.8125rem;
2907
+ line-height: 1.45;
2908
+ border-left: none;
2909
+ border-radius: 0.25rem;
2910
+ color: var(--second-text-color);
2911
+ }
2912
+
2913
+ .rp-toc-panel--minimal .rp-article-toc-item:hover {
2914
+ color: var(--main-text-color);
2915
+ background: color-mix(in srgb, var(--bg-second) 55%, transparent);
2916
+ }
2917
+
2918
+ .rp-toc-panel--minimal .rp-article-toc-item.is-active {
2919
+ color: var(--primary-color);
2920
+ font-weight: 500;
2921
+ background: transparent;
2922
+ box-shadow: none;
2923
+ }
2924
+
2925
+ /* TOC toggle — fixed on right edge */
2926
+ .rp-toc-toggle {
2927
+ display: none;
2928
+ position: fixed;
2929
+ top: 50%;
2930
+ right: 0;
2931
+ z-index: 100;
2932
+ align-items: center;
2933
+ justify-content: center;
2934
+ width: 2.5rem;
2935
+ height: 2.5rem;
2936
+ padding: 0;
2937
+ border: 1px solid color-mix(in srgb, var(--border-color) 65%, transparent);
2938
+ border-right: 0;
2939
+ border-radius: 0.625rem 0 0 0.625rem;
2940
+ background: color-mix(in srgb, var(--bg-box) 96%, transparent);
2941
+ color: var(--second-text-color);
2942
+ cursor: pointer;
2943
+ transform: translateY(-50%);
2944
+ backdrop-filter: blur(12px) saturate(1.15);
2945
+ -webkit-backdrop-filter: blur(12px) saturate(1.15);
2946
+ transition:
2947
+ color var(--rp-duration-fast) ease,
2948
+ background-color var(--rp-duration-fast) ease;
2949
+ }
2950
+
2951
+ .rp-toc-toggle:hover,
2952
+ .rp-toc-toggle.is-open {
2953
+ color: var(--primary-color);
2954
+ background: color-mix(in srgb, var(--primary-color) 8%, var(--bg-box));
2955
+ }
2956
+
2957
+ @media (min-width: 1280px) {
2958
+ .rp-toc-toggle {
2959
+ display: inline-flex;
2960
+ }
2961
+ }
2962
+
2963
+ /* Collapsible TOC — fixed drawer, opens beside toggle */
2964
+ .rp-toc-fixed-drawer {
2965
+ position: fixed;
2966
+ top: 50%;
2967
+ right: 0;
2968
+ z-index: 99;
2969
+ width: 14rem;
2970
+ max-height: min(65vh, calc(100vh - 2rem - var(--rp-header-offset, 0px)));
2971
+ overflow-x: hidden;
2972
+ overflow-y: auto;
2973
+ overscroll-behavior: contain;
2974
+ transform: translateY(-50%);
2975
+ visibility: visible;
2976
+ transition:
2977
+ transform 0.28s var(--rp-ease-out),
2978
+ visibility 0.28s,
2979
+ right 0.28s var(--rp-ease-out);
2980
+ scrollbar-width: thin;
2981
+ scrollbar-color: color-mix(in srgb, var(--border-color) 70%, transparent) transparent;
2982
+ }
2983
+
2984
+ @media (min-width: 1280px) {
2985
+ .rp-toc-fixed-drawer:not(.is-collapsed) {
2986
+ right: 2.5rem;
2987
+ }
2988
+
2989
+ .rp-toc-fixed-drawer.is-collapsed {
2990
+ transform: translateY(-50%) translateX(100%);
2991
+ visibility: hidden;
2992
+ pointer-events: none;
2993
+ }
2994
+ }
2995
+
2996
+ @media (max-width: 1279px) {
2997
+ .rp-toc-fixed-drawer {
2998
+ top: auto;
2999
+ bottom: calc(4.75rem + env(safe-area-inset-bottom, 0px));
3000
+ right: 0.75rem;
3001
+ left: 0.75rem;
3002
+ width: auto;
3003
+ max-height: min(42vh, 18rem);
3004
+ transform: translateY(0);
3005
+ border-radius: 0.875rem;
3006
+ }
3007
+
3008
+ .rp-toc-fixed-drawer.is-collapsed {
3009
+ transform: translateY(calc(100% + 1.5rem));
3010
+ visibility: hidden;
3011
+ pointer-events: none;
3012
+ }
3013
+
3014
+ .rp-toc-fixed-drawer .rp-toc-panel {
3015
+ border-radius: 0.875rem;
3016
+ border-right: 1px solid color-mix(in srgb, var(--border-color) 45%, transparent);
3017
+ }
3018
+ }
3019
+
3020
+ .rp-toc-fixed-drawer__inner {
3021
+ width: 100%;
3022
+ }
3023
+
3024
+ .rp-toc-fixed-drawer .rp-sidebar-sticky {
3025
+ position: static;
3026
+ top: auto;
3027
+ margin-bottom: 0;
3028
+ }
3029
+
3030
+ .rp-toc-fixed-drawer .rp-toc-panel {
3031
+ width: 100%;
3032
+ border-right: 0;
3033
+ border-radius: 0.5rem 0 0 0.5rem;
3034
+ box-shadow: none;
3035
+ }
3036
+
3037
+ /* Collapsible TOC — icon toggle on viewport right */
3038
+ .rp-sidebar-slot {
3039
+ width: 18rem;
3040
+ }
3041
+
3042
+ .rp-sidebar-slot__content {
3043
+ width: 100%;
3044
+ }
3045
+
3046
+ .rp-sidebar-slot__content .rp-toc-panel {
3047
+ width: 100%;
3048
+ border-radius: 0.875rem;
3049
+ box-shadow:
3050
+ 0 1px 2px color-mix(in srgb, var(--main-text-color) 4%, transparent),
3051
+ 0 8px 24px color-mix(in srgb, var(--main-text-color) 5%, transparent);
3052
+ }
3053
+
3054
+ .rp-comment-panel {
3055
+ border-radius: 0.875rem;
3056
+ }
3057
+
3058
+ .rp-footer-icon {
3059
+ display: inline-flex;
3060
+ transition:
3061
+ color var(--rp-duration-fast) ease,
3062
+ transform var(--rp-duration-normal) var(--rp-ease-out);
3063
+ }
3064
+
3065
+ .rp-footer-icon:hover {
3066
+ transform: translateY(-2px) scale(1.08);
3067
+ }
3068
+
3069
+ .rp-primary-action {
3070
+ transition:
3071
+ opacity var(--rp-duration-fast) ease,
3072
+ transform var(--rp-duration-fast) var(--rp-ease-out),
3073
+ box-shadow var(--rp-duration-normal) var(--rp-ease-out);
3074
+ }
3075
+
3076
+ .rp-primary-action:hover {
3077
+ transform: translateY(-1px);
3078
+ box-shadow: 0 4px 14px color-mix(in srgb, var(--primary-color) 35%, transparent);
3079
+ }
3080
+
3081
+ .rp-primary-action:active {
3082
+ transform: translateY(0);
3083
+ }
3084
+
3085
+ .rp-floating-widget {
3086
+ transition:
3087
+ transform var(--rp-duration-normal) var(--rp-ease-out),
3088
+ opacity var(--rp-duration-normal) ease;
3089
+ }
3090
+
3091
+ .rp-category-item {
3092
+ transition:
3093
+ color var(--rp-duration-fast) ease,
3094
+ background-color var(--rp-duration-normal) var(--rp-ease-out);
3095
+ }
3096
+
3097
+ .rp-category-item:hover {
3098
+ background: color-mix(in srgb, var(--primary-color) 7%, transparent);
3099
+ }
3100
+
3101
+ @media (prefers-reduced-motion: reduce) {
3102
+ .rp-page-enter,
3103
+ .rp-page-enter-delayed,
3104
+ .rp-sidebar-enter,
3105
+ .rp-home-enter,
3106
+ .rp-home-enter-delayed,
3107
+ .rp-home-sidebar-enter,
3108
+ .rp-home-card-enter,
3109
+ .rp-carousel-text-enter,
3110
+ .rp-carousel-slide,
3111
+ .rp-carousel-dot-progress,
3112
+ .rp-carousel-progress-meteor,
3113
+ .rp-recommend-fade-in,
3114
+ .rp-mobile-drawer,
3115
+ .rp-mobile-backdrop,
3116
+ .rp-archive-banner__content,
3117
+ .rp-article-wrap,
3118
+ .rp-recommend-scroll-track,
3119
+ .rp-recommend-scroll-track.is-moving .rp-recommend-scroll-row:first-child .rp-recommend-link,
3120
+ .rp-recommend-scroll-track.is-moving .rp-recommend-scroll-row:last-child .rp-recommend-link,
3121
+ .rp-notification-bar,
3122
+ .rp-notification-ticker-item.is-entering,
3123
+ .rp-notification-ticker-item.is-leaving {
3124
+ animation: none !important;
3125
+ transition: none !important;
3126
+ }
3127
+
3128
+ .rp-surface--interactive:hover,
3129
+ .rp-nav-list-item:hover,
3130
+ .rp-icon-btn:hover,
3131
+ .rp-action-btn:hover,
3132
+ .rp-footer-icon:hover,
3133
+ .rp-primary-action:hover {
3134
+ transform: none;
3135
+ }
3136
+
3137
+ .rp-back-to-top,
3138
+ .rp-back-to-top.is-visible {
3139
+ transition: none;
3140
+ }
3141
+
3142
+ .rp-carousel-slide.is-active,
3143
+ .rp-carousel-slide:not(.is-active) {
3144
+ transition: none;
3145
+ }
3146
+ }
3147
+
3148
+ .rp-primary-button {
3149
+ background-color: var(--primary-button-bg);
3150
+ color: var(--primary-button-fg);
3151
+ }
3152
+
3153
+ .rp-notification-close {
3154
+ position: relative;
3155
+ display: inline-flex;
3156
+ align-items: center;
3157
+ justify-content: center;
3158
+ min-width: 1.5rem;
3159
+ min-height: 1.5rem;
3160
+ padding: 0;
3161
+ border: 0;
3162
+ background: transparent;
3163
+ font-size: inherit;
3164
+ line-height: 1;
3165
+ cursor: pointer;
3166
+ transition:
3167
+ color var(--rp-duration-fast) ease,
3168
+ transform var(--rp-duration-fast) var(--rp-ease-out);
3169
+ }
3170
+
3171
+ .rp-notification-close:hover {
3172
+ transform: scale(1.12);
3173
+ }
3174
+
3175
+ .rp-notification-close:active {
3176
+ transform: scale(0.94);
3177
+ }
3178
+
3179
+ .rp-notification-close::before {
3180
+ content: '';
3181
+ position: absolute;
3182
+ inset: -10px;
3183
+ }
3184
+
3185
+ .rp-notification-bar {
3186
+ position: relative;
3187
+ animation: rp-notification-in 0.48s var(--rp-ease-out) both;
3188
+ transition:
3189
+ opacity 0.32s var(--rp-ease-out),
3190
+ transform 0.32s var(--rp-ease-out);
3191
+ }
3192
+
3193
+ .rp-notification-bar.is-dismissing {
3194
+ opacity: 0;
3195
+ transform: translateY(-6px) scale(0.985);
3196
+ overflow: hidden;
3197
+ pointer-events: none;
3198
+ }
3199
+
3200
+ @keyframes rp-notification-in {
3201
+ from {
3202
+ opacity: 0;
3203
+ transform: translateY(-8px);
3204
+ }
3205
+ to {
3206
+ opacity: 1;
3207
+ transform: translateY(0);
3208
+ }
3209
+ }
3210
+
3211
+ .rp-notification-icon {
3212
+ transition: transform 0.35s var(--rp-ease-out);
3213
+ }
3214
+
3215
+ .rp-notification-icon.is-active {
3216
+ animation: rp-notification-bell 0.55s var(--rp-ease-out);
3217
+ }
3218
+
3219
+ @keyframes rp-notification-bell {
3220
+ 0%,
3221
+ 100% {
3222
+ transform: rotate(0);
3223
+ }
3224
+ 20% {
3225
+ transform: rotate(-12deg);
3226
+ }
3227
+ 40% {
3228
+ transform: rotate(10deg);
3229
+ }
3230
+ 60% {
3231
+ transform: rotate(-6deg);
3232
+ }
3233
+ 80% {
3234
+ transform: rotate(4deg);
3235
+ }
3236
+ }
3237
+
3238
+ .rp-notification-text {
3239
+ min-width: 0;
3240
+ width: 100%;
3241
+ overflow: hidden;
3242
+ text-overflow: ellipsis;
3243
+ white-space: nowrap;
3244
+ }
3245
+
3246
+ .rp-notification-text :where(p, div, h1, h2, h3, h4, h5, h6, li, ul, ol) {
3247
+ display: inline;
3248
+ margin: 0;
3249
+ padding: 0;
3250
+ }
3251
+
3252
+ .rp-notification-text :where(p, div, li)::after {
3253
+ content: ' ';
3254
+ }
3255
+
3256
+ .rp-notification-text :where(a, span, strong, em) {
3257
+ display: inline;
3258
+ }
3259
+
3260
+ .rp-notification-ticker-viewport {
3261
+ position: relative;
3262
+ min-width: 0;
3263
+ width: 100%;
3264
+ height: 1.375rem;
3265
+ overflow: hidden;
3266
+ }
3267
+
3268
+ .rp-notification-ticker-item {
3269
+ position: absolute;
3270
+ inset: 0;
3271
+ display: flex;
3272
+ min-width: 0;
3273
+ align-items: center;
3274
+ overflow: hidden;
3275
+ }
3276
+
3277
+ .rp-notification-ticker-item.is-entering {
3278
+ animation: rp-notice-enter 0.52s var(--rp-ease-out) both;
3279
+ }
3280
+
3281
+ .rp-notification-ticker-item.is-leaving {
3282
+ animation: rp-notice-leave 0.52s var(--rp-ease-out) both;
3283
+ }
3284
+
3285
+ @keyframes rp-notice-enter {
3286
+ from {
3287
+ opacity: 0;
3288
+ transform: translateY(100%);
3289
+ }
3290
+ to {
3291
+ opacity: 1;
3292
+ transform: translateY(0);
3293
+ }
3294
+ }
3295
+
3296
+ @keyframes rp-notice-leave {
3297
+ from {
3298
+ opacity: 1;
3299
+ transform: translateY(0);
3300
+ }
3301
+ to {
3302
+ opacity: 0;
3303
+ transform: translateY(-100%);
3304
+ }
3305
+ }
3306
+
3307
+ /* 3D tag cloud — ported from twentytwentyfive TagCloud */
3308
+ .rp-tag-cloud {
3309
+ position: relative;
3310
+ width: 250px;
3311
+ height: 260px;
3312
+ margin: 0 auto;
3313
+ font-size: 12px;
3314
+ color: #333;
3315
+ text-align: center;
3316
+ }
3317
+
3318
+ .rp-tag-cloud a {
3319
+ position: absolute;
3320
+ top: 0;
3321
+ left: 0;
3322
+ display: inline-block;
3323
+ margin: 0 10px 15px 0;
3324
+ padding: 5px 8px;
3325
+ border-radius: 3px;
3326
+ line-height: 18px;
3327
+ font-size: 12px;
3328
+ color: #fff;
3329
+ text-decoration: none;
3330
+ white-space: nowrap;
3331
+ visibility: hidden;
3332
+ pointer-events: none;
3333
+ }
3334
+
3335
+ .rp-tag-cloud.is-ready a {
3336
+ visibility: visible;
3337
+ pointer-events: auto;
3338
+ }
3339
+
3340
+ .rp-tag-cloud-skeleton {
3341
+ position: relative;
3342
+ width: 250px;
3343
+ height: 260px;
3344
+ margin: 0 auto;
3345
+ }
3346
+
3347
+ .rp-tag-cloud-skeleton-item {
3348
+ position: absolute;
3349
+ display: block;
3350
+ height: 28px;
3351
+ border-radius: 3px;
3352
+ background: var(--bg-second);
3353
+ animation: recommend-shimmer 1.4s ease-in-out infinite;
3354
+ }
3355
+
3356
+ .rp-tag-cloud a:hover {
3357
+ background: var(--primary-color) !important;
3358
+ }
3359
+
3360
+ /* Nav page */
3361
+ .rp-nav-subcats-active::before {
3362
+ content: '';
3363
+ position: absolute;
3364
+ top: -12px;
3365
+ left: 50%;
3366
+ margin-left: -8px;
3367
+ border: 8px solid transparent;
3368
+ border-top-color: var(--primary-color);
3369
+ }
3370
+
3371
+ /* Nav cards — aligned with twentytwentyfive NavCard */
3372
+ .rp-nav-card-wrapper {
3373
+ position: relative;
3374
+ }
3375
+
3376
+ .rp-nav-card-list > * {
3377
+ background-color: var(--bg-box);
3378
+ }
3379
+
3380
+ .rp-nav-list-grid {
3381
+ display: grid;
3382
+ gap: 1rem;
3383
+ grid-template-columns: repeat(auto-fill, minmax(12rem, 1fr));
3384
+ list-style: none;
3385
+ margin: 0;
3386
+ padding: 0;
3387
+ }
3388
+
3389
+ .rp-nav-item-desc {
3390
+ display: inline-block;
3391
+ width: 100%;
3392
+ height: 42px;
3393
+ overflow: hidden;
3394
+ text-overflow: ellipsis;
3395
+ white-space: nowrap;
3396
+ }
3397
+
3398
+ .rp-nav-list-item:hover .rp-nav-item-desc {
3399
+ color: var(--second-text-color);
3400
+ }
3401
+
3402
+ @media (max-width: 768px) {
3403
+ .rp-nav-list-grid {
3404
+ grid-template-columns: 1fr;
3405
+ }
3406
+ }
3407
+
3408
+ /* CMS sections */
3409
+ .rp-cms-section-title {
3410
+ margin: 1.25rem 0 0.875rem;
3411
+ text-align: center;
3412
+ font-size: 0.9375rem;
3413
+ font-weight: 600;
3414
+ line-height: 1.4;
3415
+ letter-spacing: 0.05em;
3416
+ color: var(--main-text-color);
3417
+ }
3418
+
3419
+ .rp-cms-page-inner {
3420
+ background-color: var(--bg-second);
3421
+ }
3422
+
3423
+ .rp-cms-content > div {
3424
+ padding-top: 0.5rem;
3425
+ }
3426
+
3427
+ .rp-cms-content img,
3428
+ .rp-cms-content svg,
3429
+ .rp-cms-content video {
3430
+ max-width: 100%;
3431
+ height: auto;
3432
+ }
3433
+
3434
+ .rp-cms-content {
3435
+ overflow-x: hidden;
3436
+ word-break: break-word;
3437
+ }
3438
+
3439
+ /* Comment section — dev.to inspired editor & list */
3440
+ .rp-comment-root {
3441
+ background-color: var(--bg-box);
3442
+ }
3443
+
3444
+ .rp-comment-editor-wrap {
3445
+ padding: 1.25rem 1.5rem 1rem;
3446
+ background-color: var(--bg-box);
3447
+ border-bottom: 1px solid color-mix(in srgb, var(--border-color) 55%, transparent);
3448
+ }
3449
+
3450
+ .rp-theme-input {
3451
+ outline: none;
3452
+ }
3453
+
3454
+ /* Unlayered: beats @tailwindcss/forms base blue focus ring. Match primary buttons. */
3455
+ input.rp-theme-input:focus,
3456
+ input.rp-theme-input:focus-visible,
3457
+ textarea.rp-theme-input:focus,
3458
+ textarea.rp-theme-input:focus-visible,
3459
+ select.rp-theme-input:focus,
3460
+ select.rp-theme-input:focus-visible,
3461
+ input:where([type='text']):focus,
3462
+ input:where(:not([type])):focus,
3463
+ input:where([type='email']):focus,
3464
+ input:where([type='url']):focus,
3465
+ input:where([type='password']):focus,
3466
+ input:where([type='number']):focus,
3467
+ input:where([type='date']):focus,
3468
+ input:where([type='datetime-local']):focus,
3469
+ input:where([type='month']):focus,
3470
+ input:where([type='search']):focus,
3471
+ input:where([type='tel']):focus,
3472
+ input:where([type='time']):focus,
3473
+ input:where([type='week']):focus,
3474
+ textarea:focus,
3475
+ textarea:focus-visible,
3476
+ select:focus,
3477
+ select:focus-visible {
3478
+ outline: 2px solid transparent;
3479
+ outline-offset: 2px;
3480
+ border-color: var(--primary-button-bg);
3481
+ --tw-ring-inset: var(--tw-empty, /*!*/ /*!*/);
3482
+ --tw-ring-offset-width: 0px;
3483
+ --tw-ring-color: var(--primary-button-bg);
3484
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width)
3485
+ var(--tw-ring-offset-color, #fff);
3486
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width))
3487
+ var(--primary-button-bg);
3488
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
3489
+ }
3490
+
3491
+ .rp-theme-input-plain:focus,
3492
+ .rp-theme-input-plain:focus-visible {
3493
+ border-color: transparent !important;
3494
+ box-shadow: none !important;
3495
+ }
3496
+
3497
+ .rp-search-bar:focus-within .rp-theme-input {
3498
+ border-color: var(--primary-button-bg);
3499
+ border-right-color: var(--border-color);
3500
+ }
3501
+
3502
+ .rp-search-field:focus-within {
3503
+ border-color: var(--primary-button-bg);
3504
+ box-shadow: 0 0 0 1px var(--primary-button-bg);
3505
+ }
3506
+
3507
+ /* Search page — search-first layout */
3508
+ .rp-search-page .rp-notification-bar {
3509
+ margin-top: 0.75rem;
3510
+ }
3511
+
3512
+ .rp-search-page > .rp-double-column {
3513
+ position: relative;
3514
+ z-index: 1;
3515
+ padding-top: 0.75rem;
3516
+ }
3517
+
3518
+ .rp-search-page .rp-double-column__main {
3519
+ padding-bottom: 1.5rem;
3520
+ }
3521
+
3522
+ .rp-search-hero {
3523
+ position: relative;
3524
+ z-index: 1;
3525
+ margin-top: 0.75rem;
3526
+ margin-bottom: 0;
3527
+ padding: 1.5rem 0 1.125rem;
3528
+ overflow: visible;
3529
+ }
3530
+
3531
+ .rp-search-hero.is-dropdown-open {
3532
+ z-index: 40;
3533
+ }
3534
+
3535
+ .rp-search-hero--compact {
3536
+ margin-top: 0.5rem;
3537
+ padding: 0.375rem 0 0.875rem;
3538
+ }
3539
+
3540
+ .rp-search-hero__backdrop {
3541
+ position: absolute;
3542
+ inset: 0;
3543
+ border-radius: 0.75rem;
3544
+ background: var(--bg-box);
3545
+ border: 1px solid color-mix(in srgb, var(--border-color) 65%, transparent);
3546
+ box-shadow: none;
3547
+ }
3548
+
3549
+ .rp-search-hero:not(.rp-search-hero--compact) .rp-search-hero__backdrop {
3550
+ background: linear-gradient(
3551
+ 180deg,
3552
+ color-mix(in srgb, var(--primary-color) 4%, var(--bg-box)),
3553
+ var(--bg-box) 42%
3554
+ );
3555
+ }
3556
+
3557
+ .rp-search-hero--compact .rp-search-hero__backdrop {
3558
+ border-radius: 0.75rem;
3559
+ box-shadow: var(--box-shadow);
3560
+ }
3561
+
3562
+ .rp-search-hero__content {
3563
+ position: relative;
3564
+ z-index: 1;
3565
+ max-width: 40rem;
3566
+ margin: 0 auto;
3567
+ padding: 0 0.75rem;
3568
+ }
3569
+
3570
+ .rp-search-hero__header {
3571
+ margin-bottom: 0.875rem;
3572
+ text-align: center;
3573
+ }
3574
+
3575
+ .rp-search-hero__title {
3576
+ margin: 0;
3577
+ font-size: clamp(1.375rem, 2.2vw, 1.75rem);
3578
+ font-weight: 700;
3579
+ line-height: 1.3;
3580
+ color: var(--main-text-color);
3581
+ }
3582
+
3583
+ .rp-search-hero__subtitle {
3584
+ margin: 0.375rem 0 0;
3585
+ font-size: 0.8125rem;
3586
+ line-height: 1.5;
3587
+ color: var(--second-text-color);
3588
+ }
3589
+
3590
+ .rp-search-hero__field-wrap {
3591
+ position: relative;
3592
+ z-index: 5;
3593
+ }
3594
+
3595
+ .rp-search-hero__field {
3596
+ display: flex;
3597
+ align-items: center;
3598
+ gap: 0.375rem;
3599
+ min-height: 2.75rem;
3600
+ padding: 0.25rem 0.25rem 0.25rem 0.875rem;
3601
+ border: 1px solid color-mix(in srgb, var(--border-color) 88%, transparent);
3602
+ border-radius: 9999px;
3603
+ background: var(--bg-box);
3604
+ box-shadow: 0 4px 18px color-mix(in srgb, var(--main-text-color) 5%, transparent);
3605
+ transition:
3606
+ border-color 0.2s ease,
3607
+ box-shadow 0.2s ease;
3608
+ }
3609
+
3610
+ .rp-search-hero__field:focus-within {
3611
+ border-color: color-mix(in srgb, var(--primary-color) 55%, var(--border-color));
3612
+ box-shadow:
3613
+ 0 0 0 3px color-mix(in srgb, var(--primary-color) 12%, transparent),
3614
+ 0 4px 18px color-mix(in srgb, var(--main-text-color) 5%, transparent);
3615
+ }
3616
+
3617
+ .rp-search-hero--compact .rp-search-hero__field {
3618
+ min-height: 2.5rem;
3619
+ box-shadow: var(--box-shadow);
3620
+ }
3621
+
3622
+ .rp-search-hero__field-icon {
3623
+ color: var(--primary-color);
3624
+ }
3625
+
3626
+ .rp-search-hero__submit {
3627
+ min-height: 2rem;
3628
+ padding-inline: 1rem;
3629
+ font-size: 0.8125rem;
3630
+ }
3631
+
3632
+ .rp-search-hero__dropdown {
3633
+ position: absolute;
3634
+ top: calc(100% + 6px);
3635
+ right: 0;
3636
+ left: 0;
3637
+ z-index: 60;
3638
+ overflow: auto;
3639
+ border: 1px solid var(--border-color);
3640
+ border-radius: 0.625rem;
3641
+ background: var(--bg-box);
3642
+ box-shadow:
3643
+ 0 10px 32px color-mix(in srgb, var(--main-text-color) 12%, transparent),
3644
+ var(--box-shadow);
3645
+ }
3646
+
3647
+ .rp-search-hero__categories {
3648
+ position: relative;
3649
+ z-index: 1;
3650
+ display: flex;
3651
+ flex-wrap: wrap;
3652
+ justify-content: center;
3653
+ gap: 0.375rem;
3654
+ margin-bottom: 0.625rem;
3655
+ }
3656
+
3657
+ .rp-search-hero--compact .rp-search-hero__categories {
3658
+ margin-bottom: 0.5rem;
3659
+ }
3660
+
3661
+ .rp-search-hero__category {
3662
+ border: 1px solid color-mix(in srgb, var(--border-color) 82%, transparent);
3663
+ border-radius: 9999px;
3664
+ background: color-mix(in srgb, var(--bg-box) 88%, transparent);
3665
+ padding: 0.3125rem 0.75rem;
3666
+ font-size: 0.75rem;
3667
+ line-height: 1.25;
3668
+ color: var(--main-text-color);
3669
+ cursor: pointer;
3670
+ transition:
3671
+ color 0.2s ease,
3672
+ background-color 0.2s ease,
3673
+ border-color 0.2s ease,
3674
+ box-shadow 0.2s ease;
3675
+ }
3676
+
3677
+ @media (min-width: 768px) {
3678
+ .rp-search-hero__category {
3679
+ padding: 0.375rem 0.875rem;
3680
+ font-size: 0.8125rem;
3681
+ }
3682
+ }
3683
+
3684
+ .rp-search-hero__category:hover {
3685
+ color: var(--primary-color);
3686
+ border-color: color-mix(in srgb, var(--primary-color) 28%, var(--border-color));
3687
+ }
3688
+
3689
+ .rp-search-hero__category.is-active {
3690
+ border-color: transparent;
3691
+ background: var(--primary-button-bg, var(--primary-color));
3692
+ color: var(--primary-button-text, #fff);
3693
+ box-shadow: 0 2px 8px color-mix(in srgb, var(--primary-color) 28%, transparent);
3694
+ }
3695
+
3696
+ .rp-search-hero__subcats {
3697
+ position: relative;
3698
+ z-index: 1;
3699
+ display: flex;
3700
+ flex-wrap: wrap;
3701
+ justify-content: center;
3702
+ gap: 0.375rem;
3703
+ margin-top: 0.625rem;
3704
+ min-height: 1.75rem;
3705
+ }
3706
+
3707
+ .rp-search-hero__subcat {
3708
+ border: 1px solid transparent;
3709
+ border-radius: 9999px;
3710
+ background: transparent;
3711
+ padding: 0.25rem 0.625rem;
3712
+ font-size: 0.75rem;
3713
+ line-height: 1.25;
3714
+ color: var(--second-text-color);
3715
+ cursor: pointer;
3716
+ transition:
3717
+ color 0.2s ease,
3718
+ background-color 0.2s ease,
3719
+ border-color 0.2s ease;
3720
+ }
3721
+
3722
+ @media (min-width: 768px) {
3723
+ .rp-search-hero__subcat {
3724
+ font-size: 0.8125rem;
3725
+ }
3726
+ }
3727
+
3728
+ .rp-search-hero__subcat:hover {
3729
+ color: var(--primary-color);
3730
+ }
3731
+
3732
+ .rp-search-hero__subcat.is-active {
3733
+ border-color: color-mix(in srgb, var(--primary-color) 32%, var(--border-color));
3734
+ background: color-mix(in srgb, var(--primary-color) 8%, var(--bg-box));
3735
+ font-weight: 500;
3736
+ color: var(--primary-color);
3737
+ }
3738
+
3739
+ .rp-search-results__summary {
3740
+ margin-bottom: 0.75rem;
3741
+ padding: 0.75rem 0.875rem;
3742
+ border: 1px solid color-mix(in srgb, var(--border-color) 55%, transparent);
3743
+ border-radius: 0.625rem;
3744
+ background: var(--bg-box);
3745
+ }
3746
+
3747
+ .rp-search-results__list {
3748
+ margin-bottom: 2.5rem;
3749
+ }
3750
+
3751
+ /* Nav portal — flat full-width icon grid */
3752
+ .rp-nav-portal {
3753
+ width: 100%;
3754
+ }
3755
+
3756
+ .rp-nav-portal__card {
3757
+ overflow: hidden;
3758
+ border: 1px solid color-mix(in srgb, var(--border-color) 50%, transparent);
3759
+ border-radius: 0.625rem;
3760
+ background: var(--bg-box);
3761
+ box-shadow: 0 1px 3px color-mix(in srgb, var(--main-text-color) 4%, transparent);
3762
+ }
3763
+
3764
+ .rp-nav-portal__tabs-wrap {
3765
+ position: sticky;
3766
+ top: calc(var(--rp-header-offset, 0px) + 0.5rem);
3767
+ z-index: 20;
3768
+ padding: 0.5rem 0.625rem;
3769
+ border-bottom: 1px solid color-mix(in srgb, var(--border-color) 45%, transparent);
3770
+ background: color-mix(in srgb, var(--bg-box) 88%, transparent);
3771
+ backdrop-filter: blur(10px);
3772
+ -webkit-backdrop-filter: blur(10px);
3773
+ }
3774
+
3775
+ .rp-nav-portal__tabs-track {
3776
+ display: flex;
3777
+ gap: 0.25rem;
3778
+ overflow-x: auto;
3779
+ border-radius: 0.5rem;
3780
+ background: color-mix(in srgb, var(--bg-second) 70%, var(--bg-box));
3781
+ padding: 0.25rem;
3782
+ -ms-overflow-style: none;
3783
+ scrollbar-width: none;
3784
+ scroll-snap-type: x proximity;
3785
+ }
3786
+
3787
+ .rp-nav-portal__tabs-track::-webkit-scrollbar {
3788
+ display: none;
3789
+ }
3790
+
3791
+ .rp-nav-portal__tab {
3792
+ display: inline-flex;
3793
+ flex: 0 0 auto;
3794
+ min-width: max-content;
3795
+ scroll-snap-align: center;
3796
+ align-items: center;
3797
+ justify-content: center;
3798
+ gap: 0.3125rem;
3799
+ border: 0;
3800
+ border-radius: 0.375rem;
3801
+ background: transparent;
3802
+ padding: 0.4375rem 0.75rem;
3803
+ font-size: 0.8125rem;
3804
+ line-height: 1.25;
3805
+ color: var(--second-text-color);
3806
+ cursor: pointer;
3807
+ transition:
3808
+ color 0.2s ease,
3809
+ background-color 0.2s ease,
3810
+ box-shadow 0.2s ease,
3811
+ transform 0.15s ease;
3812
+ }
3813
+
3814
+ .rp-nav-portal__tab:hover {
3815
+ color: var(--main-text-color);
3816
+ }
3817
+
3818
+ .rp-nav-portal__tab:active {
3819
+ transform: scale(0.98);
3820
+ }
3821
+
3822
+ .rp-nav-portal__tab.is-active {
3823
+ background: var(--bg-box);
3824
+ box-shadow: 0 1px 4px color-mix(in srgb, var(--main-text-color) 8%, transparent);
3825
+ font-weight: 600;
3826
+ color: var(--primary-color);
3827
+ }
3828
+
3829
+ .rp-nav-portal__tab-icon {
3830
+ flex-shrink: 0;
3831
+ color: var(--primary-color);
3832
+ opacity: 0.9;
3833
+ }
3834
+
3835
+ .rp-nav-portal__tab-label {
3836
+ white-space: nowrap;
3837
+ }
3838
+
3839
+ .rp-nav-portal__body {
3840
+ background: var(--bg-box);
3841
+ }
3842
+
3843
+ .rp-nav-portal__section {
3844
+ --rp-nav-section-offset: calc(var(--rp-header-offset, 0px) + 3.75rem);
3845
+ scroll-margin-top: var(--rp-nav-section-offset);
3846
+ padding: 0.875rem 0.625rem 0.25rem;
3847
+ transition: background-color 0.35s ease;
3848
+ }
3849
+
3850
+ .rp-nav-portal__section--gap {
3851
+ padding-top: 0.25rem;
3852
+ margin-top: 0.25rem;
3853
+ border-top: 1px dashed color-mix(in srgb, var(--border-color) 42%, transparent);
3854
+ }
3855
+
3856
+ .rp-nav-portal__section.is-active {
3857
+ background: color-mix(in srgb, var(--primary-color) 2.5%, var(--bg-box));
3858
+ }
3859
+
3860
+ .rp-nav-portal__section.is-flash {
3861
+ animation: rp-nav-section-flash 0.85s ease;
3862
+ }
3863
+
3864
+ @keyframes rp-nav-section-flash {
3865
+ 0% {
3866
+ background: color-mix(in srgb, var(--primary-color) 10%, var(--bg-box));
3867
+ }
3868
+ 100% {
3869
+ background: color-mix(in srgb, var(--primary-color) 2.5%, var(--bg-box));
3870
+ }
3871
+ }
3872
+
3873
+ .rp-nav-portal__section-head {
3874
+ display: flex;
3875
+ align-items: center;
3876
+ gap: 0.4375rem;
3877
+ margin-bottom: 0.625rem;
3878
+ padding: 0 0.125rem;
3879
+ }
3880
+
3881
+ .rp-nav-portal__section-head--compact {
3882
+ margin-bottom: 0.5rem;
3883
+ padding-top: 0.125rem;
3884
+ }
3885
+
3886
+ .rp-nav-portal__section-icon {
3887
+ color: var(--primary-color);
3888
+ }
3889
+
3890
+ .rp-nav-portal__section-title {
3891
+ margin: 0;
3892
+ font-size: 0.875rem;
3893
+ font-weight: 600;
3894
+ line-height: 1.3;
3895
+ color: var(--main-text-color);
3896
+ }
3897
+
3898
+ .rp-nav-portal__section-count {
3899
+ margin-left: auto;
3900
+ font-size: 0.75rem;
3901
+ color: var(--second-text-color);
3902
+ }
3903
+
3904
+ .rp-nav-portal__grid {
3905
+ display: grid;
3906
+ grid-template-columns: repeat(auto-fill, minmax(6.75rem, 1fr));
3907
+ gap: 0.375rem;
3908
+ margin: 0;
3909
+ padding: 0 0 0.625rem;
3910
+ list-style: none;
3911
+ }
3912
+
3913
+ @media (min-width: 640px) {
3914
+ .rp-nav-portal__tabs-wrap {
3915
+ padding: 0.5625rem 0.75rem;
3916
+ }
3917
+
3918
+ .rp-nav-portal__section {
3919
+ padding: 1rem 0.75rem 0.375rem;
3920
+ }
3921
+
3922
+ .rp-nav-portal__grid {
3923
+ grid-template-columns: repeat(auto-fill, minmax(7.25rem, 1fr));
3924
+ gap: 0.5rem;
3925
+ padding-bottom: 0.75rem;
3926
+ }
3927
+ }
3928
+
3929
+ @media (min-width: 1024px) {
3930
+ .rp-nav-portal__grid {
3931
+ grid-template-columns: repeat(auto-fill, minmax(7.75rem, 1fr));
3932
+ }
3933
+ }
3934
+
3935
+ .rp-nav-portal__site-item {
3936
+ margin: 0;
3937
+ padding: 0;
3938
+ }
3939
+
3940
+ .rp-nav-portal__site {
3941
+ display: flex;
3942
+ flex-direction: column;
3943
+ align-items: center;
3944
+ gap: 0.375rem;
3945
+ border-radius: 0.5rem;
3946
+ padding: 0.5rem 0.375rem 0.5rem;
3947
+ color: inherit;
3948
+ text-align: center;
3949
+ text-decoration: none;
3950
+ transition:
3951
+ background-color 0.18s ease,
3952
+ transform 0.15s ease;
3953
+ }
3954
+
3955
+ .rp-nav-portal__site:hover {
3956
+ background: color-mix(in srgb, var(--bg-second) 65%, var(--bg-box));
3957
+ transform: translateY(-1px);
3958
+ }
3959
+
3960
+ .rp-nav-portal__site:active {
3961
+ transform: translateY(0);
3962
+ }
3963
+
3964
+ .rp-nav-portal__site:hover .rp-nav-portal__site-name {
3965
+ color: var(--primary-color);
3966
+ }
3967
+
3968
+ .rp-nav-portal__site-icon {
3969
+ display: flex;
3970
+ align-items: center;
3971
+ justify-content: center;
3972
+ width: 2.625rem;
3973
+ height: 2.625rem;
3974
+ border-radius: 0.75rem;
3975
+ background: var(--bg-box);
3976
+ box-shadow:
3977
+ inset 0 0 0 1px color-mix(in srgb, var(--border-color) 55%, transparent),
3978
+ 0 1px 2px color-mix(in srgb, var(--main-text-color) 5%, transparent);
3979
+ transition: box-shadow 0.18s ease;
3980
+ }
3981
+
3982
+ .rp-nav-portal__site:hover .rp-nav-portal__site-icon {
3983
+ box-shadow:
3984
+ inset 0 0 0 1px color-mix(in srgb, var(--primary-color) 25%, var(--border-color)),
3985
+ 0 2px 6px color-mix(in srgb, var(--main-text-color) 8%, transparent);
3986
+ }
3987
+
3988
+ .rp-nav-portal__site-icon-stack {
3989
+ position: relative;
3990
+ display: inline-flex;
3991
+ width: 2.125rem;
3992
+ height: 2.125rem;
3993
+ align-items: center;
3994
+ justify-content: center;
3995
+ }
3996
+
3997
+ .rp-nav-portal__site-img {
3998
+ position: absolute;
3999
+ inset: 0;
4000
+ width: 2.125rem;
4001
+ height: 2.125rem;
4002
+ border-radius: 0.5rem;
4003
+ object-fit: cover;
4004
+ opacity: 0;
4005
+ transition: opacity 0.18s ease;
4006
+ }
4007
+
4008
+ .rp-nav-portal__site-img.is-visible {
4009
+ opacity: 1;
4010
+ }
4011
+
4012
+ .rp-nav-portal__site-fallback {
4013
+ display: inline-flex;
4014
+ width: 2.125rem;
4015
+ height: 2.125rem;
4016
+ align-items: center;
4017
+ justify-content: center;
4018
+ border-radius: 0.5rem;
4019
+ background: color-mix(in srgb, var(--primary-color) 10%, var(--bg-second));
4020
+ font-size: 0.875rem;
4021
+ font-weight: 600;
4022
+ color: var(--primary-color);
4023
+ }
4024
+
4025
+ .rp-nav-portal__site-name {
4026
+ display: -webkit-box;
4027
+ overflow: hidden;
4028
+ width: 100%;
4029
+ max-width: none;
4030
+ padding: 0 0.125rem;
4031
+ -webkit-box-orient: vertical;
4032
+ -webkit-line-clamp: 2;
4033
+ line-clamp: 2;
4034
+ font-size: 0.6875rem;
4035
+ line-height: 1.35;
4036
+ color: var(--main-text-color);
4037
+ overflow-wrap: break-word;
4038
+ word-break: normal;
4039
+ hyphens: auto;
4040
+ transition: color 0.18s ease;
4041
+ }
4042
+
4043
+ @media (min-width: 640px) {
4044
+ .rp-nav-portal__site-name {
4045
+ font-size: 0.75rem;
4046
+ line-height: 1.3;
4047
+ }
4048
+ }
4049
+
4050
+ .sr-only {
4051
+ position: absolute;
4052
+ width: 1px;
4053
+ height: 1px;
4054
+ padding: 0;
4055
+ margin: -1px;
4056
+ overflow: hidden;
4057
+ clip: rect(0, 0, 0, 0);
4058
+ white-space: nowrap;
4059
+ border: 0;
4060
+ }
4061
+
4062
+ /* Nav detail page — /nav/[id] preview */
4063
+ .rp-nav-detail-page .rp-notification-bar {
4064
+ margin-top: 0.75rem;
4065
+ }
4066
+
4067
+ .rp-nav-detail-page > .rp-double-column {
4068
+ padding-top: 0.75rem;
4069
+ }
4070
+
4071
+ .rp-nav-detail__crumb {
4072
+ display: flex;
4073
+ align-items: center;
4074
+ gap: 0.375rem;
4075
+ margin-top: 0.75rem;
4076
+ font-size: 0.8125rem;
4077
+ line-height: 1.4;
4078
+ color: var(--second-text-color);
4079
+ }
4080
+
4081
+ .rp-nav-detail__crumb-link {
4082
+ color: var(--primary-color);
4083
+ text-decoration: none;
4084
+ transition: opacity 0.18s ease;
4085
+ }
4086
+
4087
+ .rp-nav-detail__crumb-link:hover {
4088
+ opacity: 0.85;
4089
+ text-decoration: underline;
4090
+ }
4091
+
4092
+ .rp-nav-detail__crumb-sep {
4093
+ flex-shrink: 0;
4094
+ color: color-mix(in srgb, var(--second-text-color) 70%, transparent);
4095
+ }
4096
+
4097
+ .rp-nav-detail__crumb-current {
4098
+ overflow: hidden;
4099
+ text-overflow: ellipsis;
4100
+ white-space: nowrap;
4101
+ color: var(--main-text-color);
4102
+ font-weight: 500;
4103
+ }
4104
+
4105
+ .rp-nav-detail {
4106
+ display: flex;
4107
+ flex-direction: column;
4108
+ gap: 1rem;
4109
+ }
4110
+
4111
+ .rp-nav-detail__card {
4112
+ overflow: hidden;
4113
+ border: 1px solid color-mix(in srgb, var(--border-color) 50%, transparent);
4114
+ border-radius: 0.625rem;
4115
+ background: var(--bg-box);
4116
+ box-shadow: 0 1px 3px color-mix(in srgb, var(--main-text-color) 4%, transparent);
4117
+ }
4118
+
4119
+ .rp-nav-detail__header {
4120
+ display: flex;
4121
+ align-items: flex-start;
4122
+ gap: 0.75rem;
4123
+ padding: 1.25rem 0.75rem 0 1.25rem;
4124
+ }
4125
+
4126
+ .rp-nav-detail__header-main {
4127
+ display: flex;
4128
+ min-width: 0;
4129
+ flex: 1;
4130
+ align-items: center;
4131
+ gap: 1rem;
4132
+ }
4133
+
4134
+ .rp-nav-detail__icon {
4135
+ display: flex;
4136
+ flex-shrink: 0;
4137
+ align-items: center;
4138
+ justify-content: center;
4139
+ width: 4rem;
4140
+ height: 4rem;
4141
+ border-radius: 1rem;
4142
+ background: var(--bg-box);
4143
+ box-shadow:
4144
+ inset 0 0 0 1px color-mix(in srgb, var(--border-color) 55%, transparent),
4145
+ 0 2px 6px color-mix(in srgb, var(--main-text-color) 6%, transparent);
4146
+ }
4147
+
4148
+ .rp-nav-detail__icon-img {
4149
+ width: 3rem;
4150
+ height: 3rem;
4151
+ border-radius: 0.625rem;
4152
+ object-fit: cover;
4153
+ }
4154
+
4155
+ .rp-nav-detail__icon-fallback {
4156
+ display: inline-flex;
4157
+ width: 3rem;
4158
+ height: 3rem;
4159
+ align-items: center;
4160
+ justify-content: center;
4161
+ border-radius: 0.625rem;
4162
+ background: color-mix(in srgb, var(--primary-color) 10%, var(--bg-second));
4163
+ font-size: 1.25rem;
4164
+ font-weight: 600;
4165
+ color: var(--primary-color);
4166
+ }
4167
+
4168
+ .rp-nav-detail__meta {
4169
+ min-width: 0;
4170
+ }
4171
+
4172
+ .rp-nav-detail__title {
4173
+ margin: 0;
4174
+ font-size: 1.375rem;
4175
+ font-weight: 600;
4176
+ line-height: 1.3;
4177
+ color: var(--main-text-color);
4178
+ }
4179
+
4180
+ .rp-nav-detail__url {
4181
+ margin: 0.3125rem 0 0;
4182
+ overflow: hidden;
4183
+ text-overflow: ellipsis;
4184
+ white-space: nowrap;
4185
+ font-size: 0.8125rem;
4186
+ color: var(--second-text-color);
4187
+ }
4188
+
4189
+ .rp-nav-detail__summary {
4190
+ margin: 0.875rem 0 0;
4191
+ padding: 0 1.25rem;
4192
+ font-size: 0.875rem;
4193
+ line-height: 1.65;
4194
+ color: var(--second-text-color);
4195
+ }
4196
+
4197
+ .rp-nav-detail__actions {
4198
+ display: flex;
4199
+ flex-shrink: 0;
4200
+ flex-wrap: wrap;
4201
+ justify-content: flex-end;
4202
+ gap: 0.5rem;
4203
+ margin-left: auto;
4204
+ }
4205
+
4206
+ .rp-nav-detail__btn {
4207
+ display: inline-flex;
4208
+ align-items: center;
4209
+ justify-content: center;
4210
+ gap: 0.25rem;
4211
+ border-radius: 0.5rem;
4212
+ padding: 0.5rem 0.875rem;
4213
+ font-size: 0.875rem;
4214
+ line-height: 1.25;
4215
+ text-decoration: none;
4216
+ cursor: pointer;
4217
+ transition:
4218
+ background-color 0.18s ease,
4219
+ border-color 0.18s ease,
4220
+ transform 0.15s ease;
4221
+ }
4222
+
4223
+ .rp-nav-detail__btn:active {
4224
+ transform: scale(0.98);
4225
+ }
4226
+
4227
+ .rp-nav-detail__btn--primary {
4228
+ border: 0;
4229
+ background: var(--primary-color);
4230
+ color: #fff;
4231
+ }
4232
+
4233
+ .rp-nav-detail__btn--primary:hover {
4234
+ filter: brightness(1.05);
4235
+ }
4236
+
4237
+ .rp-nav-detail__btn--ghost {
4238
+ border: 1px solid color-mix(in srgb, var(--border-color) 70%, transparent);
4239
+ background: transparent;
4240
+ color: var(--main-text-color);
4241
+ }
4242
+
4243
+ .rp-nav-detail__btn--ghost:hover {
4244
+ border-color: color-mix(in srgb, var(--primary-color) 35%, var(--border-color));
4245
+ color: var(--primary-color);
4246
+ }
4247
+
4248
+ .rp-nav-detail__disclaimer {
4249
+ margin: 1rem 1.25rem 0;
4250
+ border-radius: 0.5rem;
4251
+ border: 1px solid color-mix(in srgb, var(--primary-color) 18%, var(--border-color));
4252
+ background: color-mix(in srgb, var(--primary-color) 5%, var(--bg-box));
4253
+ padding: 0.75rem 0.875rem;
4254
+ font-size: 0.8125rem;
4255
+ line-height: 1.55;
4256
+ color: var(--second-text-color);
4257
+ }
4258
+
4259
+ .rp-nav-detail__preview {
4260
+ margin-top: 1rem;
4261
+ border-top: 1px solid color-mix(in srgb, var(--border-color) 45%, transparent);
4262
+ background: color-mix(in srgb, var(--bg-second) 35%, var(--bg-box));
4263
+ }
4264
+
4265
+ .rp-nav-detail__iframe {
4266
+ display: block;
4267
+ width: 100%;
4268
+ min-height: 28rem;
4269
+ border: 0;
4270
+ background: var(--bg-box);
4271
+ }
4272
+
4273
+ @media (min-width: 640px) {
4274
+ .rp-nav-detail__header {
4275
+ padding: 1.5rem 0.875rem 0 1.5rem;
4276
+ }
4277
+
4278
+ .rp-nav-detail__summary {
4279
+ padding-inline: 1.5rem;
4280
+ }
4281
+
4282
+ .rp-nav-detail__disclaimer {
4283
+ margin-inline: 1.5rem;
4284
+ }
4285
+
4286
+ .rp-nav-detail__iframe {
4287
+ min-height: 32rem;
4288
+ }
4289
+ }
4290
+
4291
+ @media (max-width: 639px) {
4292
+ .rp-nav-detail__header {
4293
+ flex-direction: column;
4294
+ align-items: stretch;
4295
+ }
4296
+
4297
+ .rp-nav-detail__actions {
4298
+ justify-content: flex-end;
4299
+ }
4300
+ }
4301
+
4302
+ .rp-nav-detail__recommend {
4303
+ margin-top: 0.5rem;
4304
+ overflow: visible;
4305
+ }
4306
+
4307
+ .rp-nav-detail__recommend .rp-section-heading {
4308
+ margin-bottom: 1rem;
4309
+ }
4310
+
4311
+ .rp-nav-detail__recommend .rp-article-list {
4312
+ box-shadow: none;
4313
+ }
4314
+
4315
+ .rp-comment-editor .rp-comment-lead {
4316
+ margin: 0 0 0.875rem;
4317
+ color: var(--second-text-color);
4318
+ font-size: 0.8125rem;
4319
+ line-height: 1.5;
4320
+ }
4321
+
4322
+ .rp-comment-editor .rp-comment-author-fields {
4323
+ display: grid;
4324
+ grid-template-columns: repeat(2, minmax(0, 1fr));
4325
+ gap: 0.75rem;
4326
+ margin-bottom: 0.75rem;
4327
+ }
4328
+
4329
+ .rp-comment-editor .rp-comment-field {
4330
+ min-width: 0;
4331
+ }
4332
+
4333
+ .rp-comment-editor .rp-comment-input,
4334
+ .rp-comment-editor .rp-comment-textarea {
4335
+ width: 100%;
4336
+ border: 1px solid var(--border-color);
4337
+ border-radius: 0.375rem;
4338
+ color: var(--main-text-color);
4339
+ background-color: var(--bg-box);
4340
+ padding: 0.625rem 0.75rem;
4341
+ font-size: 0.875rem;
4342
+ line-height: 1.5;
4343
+ outline: none;
4344
+ box-shadow: none;
4345
+ transition:
4346
+ border-color var(--rp-duration-fast) ease,
4347
+ box-shadow var(--rp-duration-fast) ease;
4348
+ }
4349
+
4350
+ .rp-comment-editor .rp-comment-input::placeholder,
4351
+ .rp-comment-editor .rp-comment-textarea::placeholder {
4352
+ color: var(--disable-text-color);
4353
+ }
4354
+
4355
+ .rp-comment-editor .rp-comment-input:focus,
4356
+ .rp-comment-editor .rp-comment-textarea:focus,
4357
+ .rp-comment-editor .rp-comment-input:focus-visible,
4358
+ .rp-comment-editor .rp-comment-textarea:focus-visible {
4359
+ border-color: var(--primary-button-bg);
4360
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--primary-color) 14%, transparent);
4361
+ outline: none;
4362
+ }
4363
+
4364
+ .rp-comment-editor .rp-comment-input:disabled,
4365
+ .rp-comment-editor .rp-comment-textarea:disabled {
4366
+ background-color: var(--bg-box);
4367
+ color: var(--second-text-color);
4368
+ border-color: color-mix(in srgb, var(--border-color) 80%, transparent);
4369
+ cursor: not-allowed;
4370
+ opacity: 1;
4371
+ }
4372
+
4373
+ .rp-comment-editor .rp-comment-input.is-error {
4374
+ border-color: #ff4d4f;
4375
+ }
4376
+
4377
+ .rp-comment-editor .rp-comment-input.is-error:focus,
4378
+ .rp-comment-editor .rp-comment-input.is-error:focus-visible {
4379
+ border-color: #ff4d4f;
4380
+ box-shadow: 0 0 0 3px color-mix(in srgb, #ff4d4f 14%, transparent);
4381
+ }
4382
+
4383
+ .rp-comment-editor .rp-comment-textarea {
4384
+ min-height: 7.5rem;
4385
+ resize: vertical;
4386
+ }
4387
+
4388
+ .rp-comment-editor .rp-comment-field-error {
4389
+ display: block;
4390
+ margin-top: 0.25rem;
4391
+ color: #ff4d4f;
4392
+ font-size: 0.75rem;
4393
+ line-height: 1.4;
4394
+ }
4395
+
4396
+ .rp-comment-editor footer {
4397
+ display: flex;
4398
+ justify-content: space-between;
4399
+ align-items: center;
4400
+ gap: 0.75rem;
4401
+ padding-top: 0.625rem;
4402
+ }
4403
+
4404
+ .rp-comment-editor .rp-comment-emoji-trigger {
4405
+ display: inline-flex;
4406
+ align-items: center;
4407
+ gap: 0.375rem;
4408
+ color: var(--second-text-color);
4409
+ cursor: pointer;
4410
+ border: 0;
4411
+ background: transparent;
4412
+ padding: 0.25rem 0;
4413
+ font-size: 0.8125rem;
4414
+ transition: color var(--rp-duration-fast) ease;
4415
+ }
4416
+
4417
+ .rp-comment-editor .rp-comment-emoji-trigger:hover {
4418
+ color: var(--primary-color);
4419
+ }
4420
+
4421
+ .rp-comment-editor .rp-comment-actions {
4422
+ display: flex;
4423
+ gap: 0.625rem;
4424
+ }
4425
+
4426
+ .rp-comment-editor .rp-comment-btn {
4427
+ border: 1px solid var(--border-color);
4428
+ border-radius: 9999px;
4429
+ background-color: var(--bg-box);
4430
+ color: var(--main-text-color);
4431
+ padding: 0.4375rem 1rem;
4432
+ font-size: 0.8125rem;
4433
+ font-weight: 600;
4434
+ cursor: pointer;
4435
+ transition:
4436
+ border-color var(--rp-duration-fast) ease,
4437
+ color var(--rp-duration-fast) ease,
4438
+ background-color var(--rp-duration-fast) ease;
4439
+ }
4440
+
4441
+ .rp-comment-editor .rp-comment-btn:hover:not(:disabled) {
4442
+ border-color: color-mix(in srgb, var(--primary-color) 45%, var(--border-color));
4443
+ color: var(--primary-color);
4444
+ }
4445
+
4446
+ .rp-comment-editor .rp-comment-btn-primary {
4447
+ border-color: var(--primary-button-bg);
4448
+ background-color: var(--primary-button-bg);
4449
+ color: var(--primary-button-fg);
4450
+ box-shadow: none;
4451
+ }
4452
+
4453
+ .rp-comment-editor .rp-comment-btn-primary:hover:not(:disabled) {
4454
+ filter: brightness(1.05);
4455
+ color: var(--primary-button-fg);
4456
+ }
4457
+
4458
+ .rp-comment-editor .rp-comment-btn-primary:disabled {
4459
+ border-color: var(--border-color);
4460
+ color: var(--disable-text-color);
4461
+ background-color: var(--bg-second);
4462
+ cursor: not-allowed;
4463
+ opacity: 1;
4464
+ }
4465
+
4466
+ .rp-comment-editor.is-small .rp-comment-author-fields {
4467
+ grid-template-columns: 1fr;
4468
+ gap: 8px;
4469
+ margin-bottom: 8px;
4470
+ }
4471
+
4472
+ .rp-comment-editor.is-small .rp-comment-lead {
4473
+ margin-bottom: 8px;
4474
+ font-size: 12px;
4475
+ }
4476
+
4477
+ .rp-comment-item.is-parent {
4478
+ padding: 0 1.25rem;
4479
+ background-color: var(--bg-box);
4480
+ }
4481
+
4482
+ .rp-comment-item.is-parent > div {
4483
+ padding: 1rem 0;
4484
+ border-top: 1px solid color-mix(in srgb, var(--border-color) 55%, transparent);
4485
+ }
4486
+
4487
+ .rp-comment-item.is-parent:last-of-type > div {
4488
+ padding-bottom: 0;
4489
+ }
4490
+
4491
+ .rp-comment-item.is-child {
4492
+ padding: 8px 0;
4493
+ border-bottom: 1px solid var(--border-color);
4494
+ }
4495
+
4496
+ .rp-comment-item.is-child.is-last {
4497
+ border-bottom-width: 0;
4498
+ }
4499
+
4500
+ .rp-comment-item header {
4501
+ display: flex;
4502
+ align-items: center;
4503
+ }
4504
+
4505
+ .rp-comment-item .rp-comment-name {
4506
+ padding: 0 8px;
4507
+ color: var(--main-text-color);
4508
+ }
4509
+
4510
+ .rp-comment-item main {
4511
+ font-size: 0.9rem;
4512
+ }
4513
+
4514
+ .rp-comment-item footer .rp-comment-meta {
4515
+ font-size: 0.8rem;
4516
+ color: var(--disable-text-color);
4517
+ }
4518
+
4519
+ .rp-comment-item footer .rp-comment-reply-btn {
4520
+ margin-left: 8px;
4521
+ cursor: pointer;
4522
+ border: 0;
4523
+ background: transparent;
4524
+ padding: 0;
4525
+ color: inherit;
4526
+ font-size: inherit;
4527
+ }
4528
+
4529
+ .rp-comment-item footer .rp-comment-reply-btn:hover {
4530
+ color: var(--primary-color);
4531
+ }
4532
+
4533
+ .rp-comment-item .rp-comment-reply-editor {
4534
+ padding-top: 16px;
4535
+ }
4536
+
4537
+ .rp-comment-children {
4538
+ padding: 4px 12px 12px;
4539
+ margin-top: 8px;
4540
+ background-color: var(--bg-body);
4541
+ }
4542
+
4543
+ .rp-comment-show-more {
4544
+ padding-top: 12px;
4545
+ color: var(--second-text-color);
4546
+ text-align: center;
4547
+ cursor: pointer;
4548
+ border-top: 1px solid var(--border-color);
4549
+ }
4550
+
4551
+ .rp-comment-pagination {
4552
+ padding: 16px 0;
4553
+ color: var(--second-text-color);
4554
+ text-align: center;
4555
+ background-color: var(--bg-box);
4556
+ }
4557
+
4558
+ .rp-comment-pagination-inner {
4559
+ display: inline-flex;
4560
+ align-items: center;
4561
+ gap: 8px;
4562
+ }
4563
+
4564
+ .rp-comment-pagination-btn {
4565
+ min-width: 32px;
4566
+ height: 32px;
4567
+ border: 1px solid var(--border-color);
4568
+ border-radius: 4px;
4569
+ background: var(--bg-box);
4570
+ color: var(--second-text-color);
4571
+ cursor: pointer;
4572
+ transition:
4573
+ border-color var(--rp-duration-fast) ease,
4574
+ color var(--rp-duration-fast) ease,
4575
+ transform var(--rp-duration-fast) var(--rp-ease-out);
4576
+ }
4577
+
4578
+ .rp-comment-pagination-btn:hover:not(:disabled) {
4579
+ border-color: var(--primary-color);
4580
+ color: var(--primary-color);
4581
+ transform: translateY(-1px);
4582
+ }
4583
+
4584
+ .rp-comment-pagination-btn.is-active {
4585
+ border-color: #ff0064;
4586
+ color: #ff0064;
4587
+ }
4588
+
4589
+ .rp-comment-pagination-btn:disabled {
4590
+ opacity: 0.45;
4591
+ cursor: not-allowed;
4592
+ }
4593
+
4594
+ .rp-comment-emoji-panel {
4595
+ display: flex;
4596
+ flex-wrap: wrap;
4597
+ width: 320px;
4598
+ max-height: 240px;
4599
+ overflow: auto;
4600
+ padding: 8px;
4601
+ border: 1px solid var(--border-color);
4602
+ border-radius: 8px;
4603
+ background: var(--bg-box);
4604
+ box-shadow: var(--box-shadow);
4605
+ }
4606
+
4607
+ .rp-comment-emoji-panel.is-portal {
4608
+ position: fixed;
4609
+ }
4610
+
4611
+ .rp-comment-emoji-panel button {
4612
+ display: flex;
4613
+ width: 32px;
4614
+ height: 32px;
4615
+ align-items: center;
4616
+ justify-content: center;
4617
+ border: 0;
4618
+ background: transparent;
4619
+ font-size: 18px;
4620
+ cursor: pointer;
4621
+ }
4622
+
4623
+ .rp-comment-emoji-panel button:hover {
4624
+ background: var(--bg-second);
4625
+ border-radius: 4px;
4626
+ }
4627
+
4628
+ .rp-comment-emoji-anchor {
4629
+ position: relative;
4630
+ }
4631
+
4632
+ .rp-comment-toast {
4633
+ position: fixed;
4634
+ bottom: 2rem;
4635
+ left: 50%;
4636
+ z-index: 9999;
4637
+ transform: translateX(-50%);
4638
+ padding: 0.5rem 1rem;
4639
+ border-radius: 4px;
4640
+ background: rgb(0 0 0 / 75%);
4641
+ color: #fff;
4642
+ font-size: 14px;
4643
+ pointer-events: none;
4644
+ }
4645
+
4646
+ @media (max-width: 640px) {
4647
+ .rp-comment-editor .rp-comment-author-fields {
4648
+ grid-template-columns: 1fr;
4649
+ }
4650
+ }
4651
+
4652
+ /* Auth — login / register */
4653
+ .rp-auth-page {
4654
+ display: flex;
4655
+ flex: 1;
4656
+ align-items: center;
4657
+ justify-content: center;
4658
+ padding: 2.5rem 0 3.5rem;
4659
+ }
4660
+
4661
+ .rp-auth-card {
4662
+ width: min(100%, 26rem);
4663
+ padding: 2rem;
4664
+ border: 1px solid var(--border-color);
4665
+ border-radius: calc(var(--border-radius) + 4px);
4666
+ background: var(--bg-box);
4667
+ box-shadow: var(--box-shadow);
4668
+ }
4669
+
4670
+ .rp-auth-card--loading {
4671
+ display: flex;
4672
+ flex-direction: column;
4673
+ align-items: center;
4674
+ justify-content: center;
4675
+ gap: 0.75rem;
4676
+ min-height: 16rem;
4677
+ text-align: center;
4678
+ }
4679
+
4680
+ .rp-auth-card__header {
4681
+ margin-bottom: 1.5rem;
4682
+ text-align: center;
4683
+ }
4684
+
4685
+ .rp-auth-card__eyebrow {
4686
+ margin: 0 0 0.375rem;
4687
+ color: var(--primary-color);
4688
+ font-size: 0.75rem;
4689
+ font-weight: 600;
4690
+ letter-spacing: 0.08em;
4691
+ text-transform: uppercase;
4692
+ }
4693
+
4694
+ .rp-auth-card__title {
4695
+ margin: 0;
4696
+ color: var(--main-text-color);
4697
+ font-size: 1.625rem;
4698
+ font-weight: 700;
4699
+ line-height: 1.25;
4700
+ }
4701
+
4702
+ .rp-auth-card__subtitle {
4703
+ margin: 0.625rem 0 0;
4704
+ color: var(--second-text-color);
4705
+ font-size: 0.875rem;
4706
+ line-height: 1.6;
4707
+ }
4708
+
4709
+ .rp-auth-tabs {
4710
+ display: grid;
4711
+ grid-template-columns: repeat(2, minmax(0, 1fr));
4712
+ gap: 0.375rem;
4713
+ margin-bottom: 1.25rem;
4714
+ padding: 0.25rem;
4715
+ border-radius: calc(var(--border-radius) + 2px);
4716
+ background: var(--bg-second);
4717
+ }
4718
+
4719
+ .rp-auth-tabs__item {
4720
+ border: 0;
4721
+ border-radius: var(--border-radius);
4722
+ background: transparent;
4723
+ color: var(--second-text-color);
4724
+ cursor: pointer;
4725
+ font-size: 0.875rem;
4726
+ font-weight: 500;
4727
+ line-height: 1;
4728
+ padding: 0.6875rem 0.75rem;
4729
+ transition:
4730
+ background-color var(--rp-duration-fast) ease,
4731
+ color var(--rp-duration-fast) ease,
4732
+ box-shadow var(--rp-duration-fast) ease;
4733
+ }
4734
+
4735
+ .rp-auth-tabs__item.is-active {
4736
+ background: var(--bg-box);
4737
+ color: var(--main-text-color);
4738
+ box-shadow: var(--box-shadow);
4739
+ }
4740
+
4741
+ .rp-auth-tabs__item:focus-visible {
4742
+ outline: 2px solid color-mix(in srgb, var(--primary-color) 45%, transparent);
4743
+ outline-offset: 2px;
4744
+ }
4745
+
4746
+ .rp-auth-alert {
4747
+ margin-bottom: 1rem;
4748
+ padding: 0.75rem 0.875rem;
4749
+ border-radius: var(--border-radius);
4750
+ font-size: 0.8125rem;
4751
+ line-height: 1.5;
4752
+ }
4753
+
4754
+ .rp-auth-alert.is-error {
4755
+ border: 1px solid color-mix(in srgb, var(--primary-color) 35%, transparent);
4756
+ background: color-mix(in srgb, var(--primary-color) 8%, var(--bg-box));
4757
+ color: var(--main-text-color);
4758
+ }
4759
+
4760
+ .rp-auth-alert.is-success {
4761
+ border: 1px solid color-mix(in srgb, #52c41a 35%, transparent);
4762
+ background: color-mix(in srgb, #52c41a 10%, var(--bg-box));
4763
+ color: var(--main-text-color);
4764
+ }
4765
+
4766
+ .rp-auth-form {
4767
+ display: grid;
4768
+ gap: 1rem;
4769
+ }
4770
+
4771
+ .rp-auth-field {
4772
+ display: grid;
4773
+ gap: 0.375rem;
4774
+ }
4775
+
4776
+ .rp-auth-field__label {
4777
+ color: var(--main-text-color);
4778
+ font-size: 0.8125rem;
4779
+ font-weight: 500;
4780
+ }
4781
+
4782
+ .rp-auth-input-wrap {
4783
+ position: relative;
4784
+ }
4785
+
4786
+ .rp-auth-input {
4787
+ width: 100%;
4788
+ border: 1px solid var(--border-color);
4789
+ border-radius: var(--border-radius);
4790
+ background: var(--bg-box);
4791
+ color: var(--main-text-color);
4792
+ font-size: 0.9375rem;
4793
+ line-height: 1.5;
4794
+ padding: 0.6875rem 0.875rem;
4795
+ outline: none;
4796
+ transition:
4797
+ border-color var(--rp-duration-fast) ease,
4798
+ box-shadow var(--rp-duration-fast) ease;
4799
+ }
4800
+
4801
+ .rp-auth-input-wrap .rp-auth-input {
4802
+ padding-right: 3.25rem;
4803
+ }
4804
+
4805
+ .rp-auth-input::placeholder {
4806
+ color: var(--disable-text-color);
4807
+ }
4808
+
4809
+ .rp-auth-input:focus,
4810
+ .rp-auth-input:focus-visible {
4811
+ border-color: var(--primary-button-bg);
4812
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--primary-color) 14%, transparent);
4813
+ outline: none;
4814
+ }
4815
+
4816
+ .rp-auth-input.is-error {
4817
+ border-color: color-mix(in srgb, var(--primary-color) 55%, var(--border-color));
4818
+ }
4819
+
4820
+ .rp-auth-input-toggle {
4821
+ position: absolute;
4822
+ top: 50%;
4823
+ right: 0.625rem;
4824
+ transform: translateY(-50%);
4825
+ border: 0;
4826
+ background: transparent;
4827
+ color: var(--second-text-color);
4828
+ cursor: pointer;
4829
+ font-size: 0.75rem;
4830
+ font-weight: 500;
4831
+ padding: 0.25rem;
4832
+ }
4833
+
4834
+ .rp-auth-input-toggle:hover {
4835
+ color: var(--primary-color);
4836
+ }
4837
+
4838
+ .rp-auth-field__error {
4839
+ color: var(--primary-color);
4840
+ font-size: 0.75rem;
4841
+ line-height: 1.4;
4842
+ }
4843
+
4844
+ .rp-auth-submit {
4845
+ display: inline-flex;
4846
+ width: 100%;
4847
+ align-items: center;
4848
+ justify-content: center;
4849
+ min-height: 2.75rem;
4850
+ margin-top: 0.25rem;
4851
+ border: 0;
4852
+ border-radius: var(--border-radius);
4853
+ background: var(--primary-button-bg);
4854
+ color: var(--primary-button-fg);
4855
+ cursor: pointer;
4856
+ font-size: 0.9375rem;
4857
+ font-weight: 600;
4858
+ text-decoration: none;
4859
+ transition: opacity var(--rp-duration-fast) ease;
4860
+ }
4861
+
4862
+ .rp-auth-submit:hover {
4863
+ opacity: 0.92;
4864
+ }
4865
+
4866
+ .rp-auth-submit:disabled {
4867
+ cursor: not-allowed;
4868
+ opacity: 0.65;
4869
+ }
4870
+
4871
+ .rp-auth-submit--link {
4872
+ text-align: center;
4873
+ }
4874
+
4875
+ .rp-auth-divider {
4876
+ display: flex;
4877
+ align-items: center;
4878
+ gap: 0.75rem;
4879
+ margin: 1.25rem 0 1rem;
4880
+ color: var(--disable-text-color);
4881
+ font-size: 0.75rem;
4882
+ }
4883
+
4884
+ .rp-auth-divider::before,
4885
+ .rp-auth-divider::after {
4886
+ content: '';
4887
+ flex: 1;
4888
+ height: 1px;
4889
+ background: var(--border-color);
4890
+ }
4891
+
4892
+ .rp-auth-github {
4893
+ display: inline-flex;
4894
+ width: 100%;
4895
+ align-items: center;
4896
+ justify-content: center;
4897
+ gap: 0.625rem;
4898
+ min-height: 2.75rem;
4899
+ border: 1px solid var(--border-color);
4900
+ border-radius: var(--border-radius);
4901
+ background: var(--bg-box);
4902
+ color: var(--main-text-color);
4903
+ font-size: 0.875rem;
4904
+ font-weight: 500;
4905
+ text-decoration: none;
4906
+ transition:
4907
+ border-color var(--rp-duration-fast) ease,
4908
+ color var(--rp-duration-fast) ease;
4909
+ }
4910
+
4911
+ .rp-auth-github:hover {
4912
+ border-color: var(--primary-color);
4913
+ color: var(--primary-color);
4914
+ }
4915
+
4916
+ .rp-auth-switch {
4917
+ margin: 1.25rem 0 0;
4918
+ color: var(--second-text-color);
4919
+ font-size: 0.8125rem;
4920
+ line-height: 1.6;
4921
+ text-align: center;
4922
+ }
4923
+
4924
+ .rp-auth-switch a {
4925
+ color: var(--link-color);
4926
+ font-weight: 500;
4927
+ text-decoration: none;
4928
+ }
4929
+
4930
+ .rp-auth-switch a:hover {
4931
+ color: var(--primary-color);
4932
+ }
4933
+
4934
+ .rp-auth-spinner {
4935
+ width: 2.5rem;
4936
+ height: 2.5rem;
4937
+ border: 3px solid var(--border-color);
4938
+ border-top-color: var(--primary-color);
4939
+ border-radius: 999px;
4940
+ animation: rp-auth-spin 0.75s linear infinite;
4941
+ }
4942
+
4943
+ .rp-auth-loading-text {
4944
+ margin: 0;
4945
+ color: var(--main-text-color);
4946
+ font-size: 0.9375rem;
4947
+ }
4948
+
4949
+ .rp-auth-loading-subtext {
4950
+ margin: 0;
4951
+ color: var(--second-text-color);
4952
+ font-size: 0.8125rem;
4953
+ }
4954
+
4955
+ @keyframes rp-auth-spin {
4956
+ to {
4957
+ transform: rotate(360deg);
4958
+ }
4959
+ }
4960
+
4961
+ @media (max-width: 640px) {
4962
+ .rp-auth-page {
4963
+ padding: 1.5rem 0 2.5rem;
4964
+ }
4965
+
4966
+ .rp-auth-card {
4967
+ padding: 1.5rem;
4968
+ }
4969
+ }