moonwalk-tokyonight 0.1.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 (44) hide show
  1. checksums.yaml +7 -0
  2. data/404.html +38 -0
  3. data/LICENSE +23 -0
  4. data/README.md +60 -0
  5. data/_config.yml +49 -0
  6. data/_data/home.yml +104 -0
  7. data/_includes/back_to_top.html +53 -0
  8. data/_includes/card_list.html +26 -0
  9. data/_includes/code_copy.html +31 -0
  10. data/_includes/custom_head.html +3 -0
  11. data/_includes/date_and_social_share.html +32 -0
  12. data/_includes/footnotes.html +39 -0
  13. data/_includes/github_alerts.html +41 -0
  14. data/_includes/head.html +42 -0
  15. data/_includes/horizontal_list.html +10 -0
  16. data/_includes/link_preview.html +56 -0
  17. data/_includes/post_list.html +12 -0
  18. data/_includes/post_nav.html +10 -0
  19. data/_includes/progress_bar.html +25 -0
  20. data/_includes/search.html +61 -0
  21. data/_includes/toc.html +42 -0
  22. data/_includes/toggle_theme_button.html +16 -0
  23. data/_includes/toggle_theme_js.html +36 -0
  24. data/_includes/vertical_list.html +19 -0
  25. data/_layouts/blog.html +14 -0
  26. data/_layouts/default.html +47 -0
  27. data/_layouts/home.html +45 -0
  28. data/_layouts/post.html +23 -0
  29. data/_sass/list.scss +75 -0
  30. data/_sass/moonwalk-tokyonight.scss +897 -0
  31. data/_sass/syntax.scss +171 -0
  32. data/assets/css/main.scss +8 -0
  33. data/assets/images/favicon/android-chrome-192x192.png +0 -0
  34. data/assets/images/favicon/android-chrome-256x256.png +0 -0
  35. data/assets/images/favicon/apple-touch-icon.png +0 -0
  36. data/assets/images/favicon/browserconfig.xml +9 -0
  37. data/assets/images/favicon/favicon-16x16.png +0 -0
  38. data/assets/images/favicon/favicon-32x32.png +0 -0
  39. data/assets/images/favicon/favicon.ico +0 -0
  40. data/assets/images/favicon/mstile-150x150.png +0 -0
  41. data/assets/images/favicon/safari-pinned-tab.svg +19 -0
  42. data/assets/images/favicon/site.webmanifest +19 -0
  43. data/search.json +15 -0
  44. metadata +174 -0
@@ -0,0 +1,897 @@
1
+ $tokyonight-moon-bg: #222436;
2
+ $tokyonight-moon-bg-secondary: #2a2e45;
3
+ $tokyonight-moon-bg-subtle: #1e2030;
4
+ $tokyonight-moon-headings: #c8d3f5;
5
+ $tokyonight-moon-text: #b4c0e8;
6
+ $tokyonight-moon-text-secondary: #7a88cf;
7
+ $tokyonight-moon-links: #82aaff;
8
+ $tokyonight-moon-highlight: #2d3f76;
9
+ $tokyonight-moon-code-text: #86e1fc;
10
+ $tokyonight-moon-share-text: #a9b8e8;
11
+ $tokyonight-moon-border: #3b4261;
12
+ $tokyonight-moon-border-subtle: #2f3655;
13
+ $tokyonight-moon-code-bg: #1b1d2b;
14
+ $tokyonight-moon-code-border: #2f3655;
15
+ $tokyonight-day-bg: #e6e7ed;
16
+ $tokyonight-day-bg-secondary: #dfe2ea;
17
+ $tokyonight-day-bg-subtle: #f2f3f8;
18
+ $tokyonight-day-headings: #1f2335;
19
+ $tokyonight-day-text: #3760bf;
20
+ $tokyonight-day-text-secondary: #6172b0;
21
+ $tokyonight-day-links: #2e7de9;
22
+ $tokyonight-day-highlight: #d5d6db;
23
+ $tokyonight-day-code-text: #9854f1;
24
+ $tokyonight-day-share-text: #6172b0;
25
+ $tokyonight-day-border: #c4c8da;
26
+ $tokyonight-day-border-subtle: #d5d8e6;
27
+ $tokyonight-day-code-bg: #f2f3f8;
28
+ $tokyonight-day-code-border: #d5d8e6;
29
+
30
+ :root {
31
+ --font-sans: "Geist", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Helvetica, Arial, sans-serif;
32
+ --font-mono: "Geist Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
33
+ --radius-sm: 0.25rem;
34
+ --radius-md: 0.5rem;
35
+ --radius-lg: 0.75rem;
36
+ }
37
+
38
+ html { height: 100%; }
39
+
40
+ body {
41
+ font-family: var(--font-sans);
42
+ font-size: 1.125rem;
43
+ line-height: 1.7;
44
+ margin: 0;
45
+ min-height: 100%;
46
+ -webkit-font-smoothing: antialiased;
47
+ -moz-osx-font-smoothing: grayscale;
48
+ text-rendering: optimizeLegibility;
49
+ }
50
+ pre, code {
51
+ font-family: var(--font-mono);
52
+ font-size: 0.92rem;
53
+ }
54
+
55
+ h1 {
56
+ font-size: 1.85rem;
57
+ letter-spacing: -0.025em;
58
+ font-weight: 700;
59
+ line-height: 1.15;
60
+ }
61
+ h2 {
62
+ font-size: 1.4rem;
63
+ letter-spacing: -0.02em;
64
+ font-weight: 600;
65
+ line-height: 1.2;
66
+ }
67
+ h3 { font-size: 1.1rem; letter-spacing: -0.01em; font-weight: 600; }
68
+ @media screen and (min-width: 768px) {
69
+ h1 { font-size: 2.15rem; }
70
+ h2 { font-size: 1.55rem; }
71
+ h3 { font-size: 1.2rem; }
72
+ }
73
+ @media screen and (min-width: 1200px) {
74
+ h1 { font-size: 2.4rem; }
75
+ h2 { font-size: 1.7rem; }
76
+ h3 { font-size: 1.25rem; }
77
+ }
78
+ h2, h3, h4, h5 { margin-top: 1.6em; }
79
+
80
+ hr { margin: 1em 0; }
81
+
82
+ p { margin: 1.25em 0; }
83
+
84
+ li { margin: 0.4em 0; }
85
+
86
+ .w {
87
+ max-width: 720px;
88
+ margin: 0 auto;
89
+ padding: 4em 2em;
90
+ }
91
+ @media screen and (max-width: 600px) {
92
+ .w {
93
+ padding: 2em 1.25em;
94
+ }
95
+ }
96
+
97
+ table {
98
+ width: 100%;
99
+ border-collapse: collapse;
100
+ display: block;
101
+ overflow-x: auto;
102
+ -webkit-overflow-scrolling: touch;
103
+ }
104
+ table, th, td {
105
+ border: 1px solid var(--border);
106
+ padding: 0.55em 0.75em;
107
+ }
108
+ th {
109
+ background-color: var(--bg-subtle);
110
+ font-weight: 600;
111
+ text-align: left;
112
+ }
113
+
114
+ div.highlighter-rouge {
115
+ position: relative;
116
+ }
117
+ div.highlighter-rouge pre code, pre code.highlighter-rouge {
118
+ display: block;
119
+ overflow-x: auto;
120
+ padding: 1em;
121
+ background: var(--code-bg);
122
+ border: 1px solid var(--code-border);
123
+ }
124
+ // Language label, derived from rouge's language-* class via JS (see code_copy.html)
125
+ .code-lang {
126
+ position: absolute;
127
+ top: 0.5em;
128
+ left: 0.75em;
129
+ font-family: var(--font-mono);
130
+ font-size: 0.65rem;
131
+ letter-spacing: 0.06em;
132
+ text-transform: uppercase;
133
+ font-weight: 500;
134
+ color: var(--text-secondary);
135
+ opacity: 0.7;
136
+ user-select: none;
137
+ pointer-events: none;
138
+ }
139
+
140
+ blockquote {
141
+ font-style: normal;
142
+ border: none;
143
+ border-left: 3px solid var(--links);
144
+ padding: 0.75em 1.25em;
145
+ margin: 1.5em 0;
146
+ color: var(--text-secondary);
147
+ background-color: var(--bg-subtle);
148
+ border-radius: 0 var(--radius-md) var(--radius-md) 0;
149
+
150
+ p { margin: 0.4em 0; }
151
+ p:first-child { margin-top: 0; }
152
+ p:last-child { margin-bottom: 0; }
153
+ }
154
+
155
+ img {
156
+ max-width: 100%;
157
+ display: block;
158
+ margin: 0 auto;
159
+ }
160
+ .page-content img {
161
+ border-radius: 0.5em;
162
+ box-shadow: 0 2px 8px rgba(0,0,0,0.08);
163
+ }
164
+ @mixin light-appearance($palette: "moon") {
165
+ html, body {
166
+ @if $palette == "day" {
167
+ --bg: #{$tokyonight-day-bg};
168
+ --bg-secondary: #{$tokyonight-day-bg-secondary};
169
+ --bg-subtle: #{$tokyonight-day-bg-subtle};
170
+ --headings: #{$tokyonight-day-headings};
171
+ --text: #{$tokyonight-day-text};
172
+ --text-secondary: #{$tokyonight-day-text-secondary};
173
+ --links: #{$tokyonight-day-links};
174
+ --highlight: #{$tokyonight-day-highlight};
175
+ --code-text: #{$tokyonight-day-code-text};
176
+ --share-text: #{$tokyonight-day-share-text};
177
+ --border: #{$tokyonight-day-border};
178
+ --border-subtle: #{$tokyonight-day-border-subtle};
179
+ --code-bg: #{$tokyonight-day-code-bg};
180
+ --code-border: #{$tokyonight-day-code-border};
181
+ } @else {
182
+ --bg: #fcfcfc;
183
+ --bg-secondary: #f1f2f4;
184
+ --bg-subtle: #f6f7f8;
185
+ --headings: #0f172a;
186
+ --text: #2b2f36;
187
+ --text-secondary: #5b6470;
188
+ --links: #4f46e5;
189
+ --highlight: #FFECB2;
190
+ --code-text: #9D174D;
191
+ --share-text: #999;
192
+ --border: rgba(15, 23, 42, 0.08);
193
+ --border-subtle: rgba(15, 23, 42, 0.05);
194
+ --code-bg: #f6f8fa;
195
+ --code-border: rgba(15, 23, 42, 0.08);
196
+ }
197
+ }
198
+ }
199
+ // -------------- THEME SWITCHER -------------- //
200
+ @mixin dark-appearance($palette: "moon") {
201
+ html, body {
202
+ @if $palette == "moon" {
203
+ --headings: #{$tokyonight-moon-headings};
204
+ --links: #{$tokyonight-moon-links};
205
+ --highlight: #{$tokyonight-moon-highlight};
206
+ --bg: #{$tokyonight-moon-bg};
207
+ --bg-secondary: #{$tokyonight-moon-bg-secondary};
208
+ --bg-subtle: #{$tokyonight-moon-bg-subtle};
209
+ --text: #{$tokyonight-moon-text};
210
+ --text-secondary: #{$tokyonight-moon-text-secondary};
211
+ --code-text: #{$tokyonight-moon-code-text};
212
+ --share-text: #{$tokyonight-moon-share-text};
213
+ --border: #{$tokyonight-moon-border};
214
+ --border-subtle: #{$tokyonight-moon-border-subtle};
215
+ --code-bg: #{$tokyonight-moon-code-bg};
216
+ --code-border: #{$tokyonight-moon-code-border};
217
+ } @else {
218
+ --headings: #{$tokyonight-moon-headings};
219
+ --links: #{$tokyonight-moon-links};
220
+ --highlight: #{$tokyonight-moon-highlight};
221
+ --bg: #{$tokyonight-moon-bg};
222
+ --bg-secondary: #{$tokyonight-moon-bg-secondary};
223
+ --bg-subtle: #{$tokyonight-moon-bg-subtle};
224
+ --text: #{$tokyonight-moon-text};
225
+ --text-secondary: #{$tokyonight-moon-text-secondary};
226
+ --code-text: #{$tokyonight-moon-code-text};
227
+ --share-text: #{$tokyonight-moon-share-text};
228
+ --border: #{$tokyonight-moon-border};
229
+ --border-subtle: #{$tokyonight-moon-border-subtle};
230
+ --code-bg: #{$tokyonight-moon-code-bg};
231
+ --code-border: #{$tokyonight-moon-code-border};
232
+ }
233
+ };
234
+ }
235
+
236
+ $theme-palette: "moon" !default;
237
+
238
+ html[data-theme="dark"] { @include dark-appearance($theme-palette); }
239
+ html[data-theme="light"] { @include light-appearance($theme-palette); }
240
+
241
+ @media (prefers-color-scheme: dark) {
242
+ body[data-theme="auto"] { @include dark-appearance($theme-palette); }
243
+ }
244
+ @media (prefers-color-scheme: light) {
245
+ body[data-theme="auto"] { @include light-appearance($theme-palette); }
246
+ }
247
+
248
+ // -------------------------------------------- //
249
+
250
+ html, body {
251
+ background-color: var(--bg);
252
+ color: var(--text);
253
+ }
254
+ h1, h2, h3, h4, h5, h6 {
255
+ color: var(--headings);
256
+ font-family: var(--font-sans);
257
+ line-height: 1.25;
258
+ }
259
+ p, strong, b, em, small, li, hr, table, figcaption {
260
+ color: var(--text);
261
+ }
262
+ .highlight, pre code, blockquote {
263
+ border-radius: 0.5em;
264
+ }
265
+ a {
266
+ color: var(--links);
267
+ }
268
+ *:target { background-color: var(--bg-secondary); }
269
+
270
+ @media (prefers-reduced-motion: no-preference) {
271
+ html.transition,
272
+ html.transition *,
273
+ html.transition *:before,
274
+ html.transition *:after {
275
+ transition: all 250ms !important;
276
+ transition-delay: 0 !important;
277
+ }
278
+ }
279
+
280
+ noscript .theme-toggle { display: none; }
281
+
282
+ .theme-toggle {
283
+ color: var(--text);
284
+ background-color: transparent;
285
+ padding: 4px;
286
+ cursor: pointer;
287
+ margin: 1em;
288
+ position: fixed;
289
+ right: 0;
290
+ top: 0;
291
+ border: 2px transparent solid;
292
+ outline: none;
293
+ }
294
+
295
+ .theme-toggle:hover {
296
+ color: var(--links);
297
+ outline: none;
298
+ }
299
+ .theme-toggle:focus {
300
+ outline: none;
301
+ }
302
+ @media screen and (max-width: 600px) {
303
+ .theme-toggle {
304
+ margin: 0.5em;
305
+ }
306
+ }
307
+ .dashed {
308
+ border-top: 1px var(--text) dashed;
309
+ margin: 0.5em 0;
310
+ }
311
+ mark {
312
+ padding: 0.4em;
313
+ background-color: var(--highlight);
314
+ color: var(--headings);
315
+ font-size: 0.6em;
316
+ letter-spacing: 1px;
317
+ }
318
+
319
+ .post-date {
320
+ color: var(--text-secondary);
321
+ margin-top: 1rem;
322
+ font-size: 0.75em;
323
+ font-family: var(--font-mono);
324
+ letter-spacing: 0.01em;
325
+ }
326
+
327
+ // -------------- POST HEADER -------------- //
328
+ .post-meta {
329
+ margin: 0.5rem 0 2.5rem;
330
+ padding-bottom: 1.25rem;
331
+ border-bottom: 1px solid var(--border-subtle);
332
+ }
333
+ .post-meta-line {
334
+ display: flex;
335
+ flex-wrap: wrap;
336
+ align-items: center;
337
+ gap: 0.5em;
338
+ font-family: var(--font-mono);
339
+ font-size: 0.78rem;
340
+ color: var(--text-secondary);
341
+ letter-spacing: 0.01em;
342
+ text-transform: uppercase;
343
+ }
344
+ .post-meta-sep {
345
+ opacity: 0.5;
346
+ }
347
+ .post-meta-author {
348
+ font-weight: 500;
349
+ color: var(--text);
350
+ }
351
+ .post-meta-tags {
352
+ margin-top: 0.85rem;
353
+ display: flex;
354
+ flex-wrap: wrap;
355
+ gap: 0.4em;
356
+ .tag { margin-right: 0; }
357
+ }
358
+ .post-meta .soopr-btn {
359
+ margin-top: 1rem;
360
+ }
361
+
362
+ // -------------- DROP CAP (opt-in via dropcap: true) -------------- //
363
+ .has-dropcap > p:first-of-type::first-letter {
364
+ font-family: var(--font-sans);
365
+ font-size: 3.6em;
366
+ line-height: 0.85;
367
+ float: left;
368
+ margin: 0.08em 0.1em 0 -0.04em;
369
+ font-weight: 700;
370
+ letter-spacing: -0.04em;
371
+ color: var(--headings);
372
+ }
373
+ .home-date {
374
+ font-family: var(--font-mono);
375
+ font-size: 0.85em;
376
+ color: var(--text-secondary);
377
+ }
378
+ .post-list-item a {
379
+ text-decoration: none;
380
+ }
381
+ .text-bold {
382
+ font-weight: bold;
383
+ }
384
+ .text-upcase {
385
+ text-transform: uppercase;
386
+ letter-spacing: 1px;
387
+ }
388
+ p code, li code {
389
+ background-color: var(--bg-subtle);
390
+ padding: 0.15rem 0.4rem;
391
+ color: var(--code-text);
392
+ font-weight: 500;
393
+ border-radius: var(--radius-sm);
394
+ border: 1px solid var(--border-subtle);
395
+ font-size: 0.875em;
396
+ }
397
+ .code-copy {
398
+ position: absolute;
399
+ top: 0.5em;
400
+ right: 0.5em;
401
+ padding: 0.25em 0.65em;
402
+ font-size: 0.72rem;
403
+ font-family: var(--font-sans);
404
+ font-weight: 500;
405
+ color: var(--text-secondary);
406
+ background-color: var(--bg-secondary);
407
+ border: 1px solid var(--border);
408
+ border-radius: var(--radius-sm);
409
+ cursor: pointer;
410
+ opacity: 0;
411
+ transition: opacity 0.2s ease, color 0.2s ease;
412
+ }
413
+ div.highlighter-rouge:hover .code-copy {
414
+ opacity: 1;
415
+ }
416
+ .code-copy:hover {
417
+ color: var(--links);
418
+ }
419
+ @media screen and (max-width: 600px) {
420
+ .code-copy {
421
+ opacity: 1;
422
+ }
423
+ }
424
+
425
+ .back-link {
426
+ display: inline-flex;
427
+ align-items: center;
428
+ justify-content: center;
429
+ width: 40px;
430
+ height: 40px;
431
+ border-radius: 50%;
432
+ border: 1px solid var(--border);
433
+ background: var(--bg-secondary);
434
+ color: var(--text);
435
+ text-decoration: none;
436
+ transition: color 0.3s ease;
437
+ &:hover { color: var(--links); }
438
+ @media screen and (max-width: 600px) {
439
+ width: 36px;
440
+ height: 36px;
441
+ }
442
+ }
443
+
444
+ .post-title {
445
+ margin-bottom: 0.6rem;
446
+ }
447
+ .project-title {
448
+ margin-bottom: 0.8rem;
449
+ }
450
+ .credits {
451
+ font-size: 0.8em;
452
+ color: var(--text);
453
+ margin: 8em auto -4em auto;
454
+ text-align: center;
455
+ a {
456
+ color: var(--text);
457
+ text-decoration: none;
458
+ font-weight: bold;
459
+ }
460
+ a:hover {
461
+ color: var(--links);
462
+ }
463
+ }
464
+ // -------------- GITHUB MARKDOWN ALERTS -------------- //
465
+ .markdown-alert {
466
+ font-style: normal;
467
+ padding: 0.5em 1em;
468
+ margin: 1em 0;
469
+ border: none;
470
+ border-left: 4px solid;
471
+ border-radius: 0.25em;
472
+ background-color: var(--bg-secondary);
473
+
474
+ p { color: var(--text); }
475
+
476
+ .markdown-alert-title {
477
+ display: flex;
478
+ align-items: center;
479
+ gap: 0.5em;
480
+ font-weight: 700;
481
+ font-size: 0.9em;
482
+ margin: 0.4em 0;
483
+
484
+ svg {
485
+ display: inline-block;
486
+ fill: currentColor;
487
+ vertical-align: text-bottom;
488
+ }
489
+ }
490
+ }
491
+
492
+ .markdown-alert-note {
493
+ border-left-color: var(--alert-note, #4493f8);
494
+ .markdown-alert-title { color: var(--alert-note, #4493f8); }
495
+ }
496
+ .markdown-alert-tip {
497
+ border-left-color: var(--alert-tip, #3fb950);
498
+ .markdown-alert-title { color: var(--alert-tip, #3fb950); }
499
+ }
500
+ .markdown-alert-important {
501
+ border-left-color: var(--alert-important, #a371f7);
502
+ .markdown-alert-title { color: var(--alert-important, #a371f7); }
503
+ }
504
+ .markdown-alert-warning {
505
+ border-left-color: var(--alert-warning, #d29922);
506
+ .markdown-alert-title { color: var(--alert-warning, #d29922); }
507
+ }
508
+ .markdown-alert-caution {
509
+ border-left-color: var(--alert-caution, #f85149);
510
+ .markdown-alert-title { color: var(--alert-caution, #f85149); }
511
+ }
512
+ // ----------------------------------------------------- //
513
+
514
+ .tag {
515
+ font-family: var(--font-mono);
516
+ color: var(--text-secondary);
517
+ padding: 0.3em 0.85em;
518
+ margin-right: 0.4em;
519
+ border-radius: 1em;
520
+ background-color: var(--bg-subtle);
521
+ border: 1px solid var(--border-subtle);
522
+ font-size: 0.72em;
523
+ font-weight: 500;
524
+ text-transform: lowercase;
525
+ text-decoration: none;
526
+ display: inline-block;
527
+ letter-spacing: 0.01em;
528
+ transition: color 0.2s ease, border-color 0.2s ease;
529
+ &:hover {
530
+ color: var(--links);
531
+ border-color: var(--links);
532
+ }
533
+ }
534
+
535
+ // -------------- TAG CLOUD / TAG PAGE -------------- //
536
+ .tag-cloud {
537
+ display: flex;
538
+ flex-wrap: wrap;
539
+ gap: 0.4em;
540
+ margin: 1.5em 0 3em;
541
+ padding: 1.25em;
542
+ background-color: var(--bg-subtle);
543
+ border-radius: var(--radius-md);
544
+ border: 1px solid var(--border-subtle);
545
+ }
546
+ .tag-cloud-item {
547
+ display: inline-flex;
548
+ align-items: baseline;
549
+ gap: 0.35em;
550
+ .tag-count {
551
+ font-size: 0.7em;
552
+ color: var(--text-secondary);
553
+ opacity: 0.7;
554
+ }
555
+ }
556
+ .tag-section {
557
+ margin: 2.5em 0;
558
+ }
559
+ .tag-section-title {
560
+ display: flex;
561
+ align-items: baseline;
562
+ gap: 0.6em;
563
+ border-bottom: 1px solid var(--border-subtle);
564
+ padding-bottom: 0.4em;
565
+ }
566
+ .tag-section-count {
567
+ font-family: var(--font-mono);
568
+ font-size: 0.7rem;
569
+ font-weight: 400;
570
+ color: var(--text-secondary);
571
+ text-transform: uppercase;
572
+ letter-spacing: 0.05em;
573
+ }
574
+
575
+ // -------------- 404 -------------- //
576
+ .not-found {
577
+ text-align: left;
578
+ padding: 2em 0;
579
+ }
580
+ .not-found-code {
581
+ font-family: var(--font-mono);
582
+ font-size: 4rem;
583
+ font-weight: 500;
584
+ color: var(--links);
585
+ line-height: 1;
586
+ letter-spacing: -0.04em;
587
+ margin-bottom: 0.2em;
588
+ }
589
+ .not-found-title {
590
+ margin-top: 0;
591
+ margin-bottom: 0.5em;
592
+ }
593
+ .not-found-lede {
594
+ font-size: 1.05rem;
595
+ color: var(--text-secondary);
596
+ max-width: 36em;
597
+ margin-bottom: 2em;
598
+ }
599
+ .not-found-actions {
600
+ display: flex;
601
+ flex-wrap: wrap;
602
+ gap: 0.75em;
603
+ margin-bottom: 3em;
604
+ }
605
+ .not-found-cta {
606
+ display: inline-block;
607
+ padding: 0.6em 1.1em;
608
+ background-color: var(--links);
609
+ color: var(--bg);
610
+ text-decoration: none;
611
+ border-radius: var(--radius-md);
612
+ font-weight: 500;
613
+ font-size: 0.92rem;
614
+ transition: opacity 0.2s ease, transform 0.2s ease;
615
+ &:hover { opacity: 0.9; transform: translateY(-1px); color: var(--bg); }
616
+ }
617
+ .not-found-cta-secondary {
618
+ background-color: var(--bg-subtle);
619
+ color: var(--text);
620
+ border: 1px solid var(--border);
621
+ &:hover { color: var(--text); border-color: var(--links); }
622
+ }
623
+ .not-found-recent {
624
+ margin-top: 2em;
625
+ h3 {
626
+ font-size: 0.85rem;
627
+ text-transform: uppercase;
628
+ letter-spacing: 0.06em;
629
+ color: var(--text-secondary);
630
+ font-weight: 500;
631
+ margin-bottom: 0.5em;
632
+ }
633
+ }
634
+
635
+ // -------------- POST NAVIGATION -------------- //
636
+ .post-nav {
637
+ display: flex;
638
+ justify-content: space-between;
639
+ margin-top: 3em;
640
+ padding-top: 1.5em;
641
+ border-top: 1px solid var(--border);
642
+ font-size: 0.9em;
643
+
644
+ a {
645
+ color: var(--links);
646
+ text-decoration: none;
647
+ max-width: 45%;
648
+ &:hover { text-decoration: underline; }
649
+ }
650
+ .post-nav-next {
651
+ margin-left: auto;
652
+ text-align: right;
653
+ }
654
+ }
655
+ @media screen and (max-width: 600px) {
656
+ .post-nav {
657
+ flex-direction: column;
658
+ gap: 1em;
659
+ a { max-width: 100%; }
660
+ .post-nav-next { text-align: left; }
661
+ }
662
+ }
663
+ // --------------------------------------------- //
664
+
665
+ // -------------- TABLE OF CONTENTS -------------- //
666
+ .toc {
667
+ background-color: var(--bg-secondary);
668
+ border-radius: 0.5em;
669
+ padding: 1em 1.5em;
670
+ margin: 1.5em 0;
671
+ font-size: 0.9em;
672
+
673
+ summary {
674
+ cursor: pointer;
675
+ font-weight: 600;
676
+ font-family: var(--font-sans);
677
+ color: var(--headings);
678
+ margin-bottom: 0.5em;
679
+ }
680
+
681
+ ul {
682
+ margin: 0;
683
+ padding-left: 1.5em;
684
+ }
685
+ li {
686
+ margin: 0.3em 0;
687
+ }
688
+ a {
689
+ color: var(--text);
690
+ text-decoration: none;
691
+ &:hover { color: var(--links); }
692
+ }
693
+ .toc-sub {
694
+ padding-left: 1em;
695
+ }
696
+ }
697
+ // ----------------------------------------------- //
698
+
699
+ // -------------- MICRO-INTERACTIONS -------------- //
700
+ @media (prefers-reduced-motion: no-preference) {
701
+ .page-content a:not(.tag):not(.card a):not(.back-link):not(.not-found-cta) {
702
+ text-decoration: none;
703
+ background-image: linear-gradient(var(--links), var(--links));
704
+ background-size: 0% 1px;
705
+ background-position: left bottom;
706
+ background-repeat: no-repeat;
707
+ transition: background-size 0.3s ease;
708
+ }
709
+ .page-content a:not(.tag):not(.card a):not(.back-link):not(.not-found-cta):hover {
710
+ background-size: 100% 1px;
711
+ }
712
+
713
+ .page-content {
714
+ animation: fadeIn 0.4s ease-out;
715
+ }
716
+ }
717
+ @keyframes fadeIn {
718
+ from { opacity: 0; transform: translateY(8px); }
719
+ to { opacity: 1; transform: translateY(0); }
720
+ }
721
+ // ------------------------------------------------ //
722
+
723
+ // -------------- SELECTION COLOR -------------- //
724
+ ::selection {
725
+ background: var(--highlight);
726
+ color: var(--headings);
727
+ }
728
+ // --------------------------------------------- //
729
+
730
+ // -------------- DARK MODE SCROLLBAR -------------- //
731
+ html[data-theme="dark"] {
732
+ scrollbar-color: var(--bg-secondary) var(--bg);
733
+ }
734
+ // ------------------------------------------------- //
735
+
736
+ // -------------- SEARCH -------------- //
737
+ .search {
738
+ margin: 1.5em 0;
739
+ position: relative;
740
+ }
741
+ .search-input {
742
+ width: 100%;
743
+ padding: 0.65em 0.9em;
744
+ font-family: var(--font-sans);
745
+ font-size: 0.95rem;
746
+ color: var(--text);
747
+ background-color: var(--bg-subtle);
748
+ border: 1px solid var(--border);
749
+ border-radius: var(--radius-md);
750
+ outline: none;
751
+ transition: border-color 0.2s ease, background-color 0.2s ease;
752
+
753
+ &:focus {
754
+ border-color: var(--links);
755
+ background-color: var(--bg);
756
+ }
757
+ &::placeholder { color: var(--text-secondary); }
758
+ }
759
+ .search-results {
760
+ list-style: none;
761
+ margin: 0.4em 0 0;
762
+ padding: 0;
763
+
764
+ .search-result a {
765
+ display: flex;
766
+ justify-content: space-between;
767
+ align-items: baseline;
768
+ gap: 1em;
769
+ padding: 0.55em 0.75em;
770
+ border-radius: var(--radius-sm);
771
+ text-decoration: none;
772
+ color: var(--text);
773
+ &:hover { background-color: var(--bg-subtle); }
774
+ }
775
+ .search-result-title { font-weight: 500; }
776
+ .search-result-date {
777
+ font-family: var(--font-mono);
778
+ font-size: 0.75rem;
779
+ color: var(--text-secondary);
780
+ flex-shrink: 0;
781
+ }
782
+ .search-empty {
783
+ padding: 0.75em;
784
+ color: var(--text-secondary);
785
+ font-style: italic;
786
+ }
787
+ }
788
+
789
+ // -------------- FOOTNOTE TOOLTIP -------------- //
790
+ .fn-tooltip {
791
+ position: absolute;
792
+ max-width: 90vw;
793
+ width: 420px;
794
+ padding: 0.75em 1em;
795
+ background-color: var(--bg);
796
+ color: var(--text);
797
+ border: 1px solid var(--border);
798
+ border-radius: var(--radius-md);
799
+ box-shadow: 0 6px 24px rgba(0,0,0,0.12);
800
+ font-size: 0.9rem;
801
+ line-height: 1.55;
802
+ z-index: 1000;
803
+ opacity: 0;
804
+ pointer-events: none;
805
+ transition: opacity 0.15s ease;
806
+ p { margin: 0; }
807
+ p + p { margin-top: 0.5em; }
808
+ }
809
+ .fn-tooltip.visible { opacity: 1; }
810
+
811
+ // -------------- COLLAPSIBLE / DETAILS -------------- //
812
+ // Polish the native <details> element so it feels intentional. Use it for
813
+ // asides, "long version" expansions, spoilers, etc.
814
+ details:not(.toc):not([class*="markdown-alert"]) {
815
+ margin: 1.5em 0;
816
+ padding: 0.75em 1.15em;
817
+ background-color: var(--bg-subtle);
818
+ border: 1px solid var(--border-subtle);
819
+ border-radius: var(--radius-md);
820
+ transition: border-color 0.2s ease;
821
+
822
+ &[open] { border-color: var(--border); }
823
+ > summary {
824
+ cursor: pointer;
825
+ font-weight: 600;
826
+ color: var(--headings);
827
+ list-style: none;
828
+ display: flex;
829
+ align-items: center;
830
+ gap: 0.55em;
831
+ &::-webkit-details-marker { display: none; }
832
+ &::before {
833
+ content: "›";
834
+ display: inline-block;
835
+ font-family: var(--font-mono);
836
+ transition: transform 0.2s ease;
837
+ color: var(--text-secondary);
838
+ }
839
+ }
840
+ &[open] > summary::before { transform: rotate(90deg); }
841
+ > *:not(summary) { margin-top: 0.75em; }
842
+ }
843
+
844
+ // -------------- LINK PREVIEW CARD -------------- //
845
+ .link-preview {
846
+ position: absolute;
847
+ max-width: 80vw;
848
+ width: 360px;
849
+ padding: 0.85em 1em;
850
+ background-color: var(--bg);
851
+ border: 1px solid var(--border);
852
+ border-radius: var(--radius-md);
853
+ box-shadow: 0 8px 28px rgba(0,0,0,0.12);
854
+ z-index: 1000;
855
+ opacity: 0;
856
+ pointer-events: none;
857
+ transition: opacity 0.15s ease;
858
+ font-size: 0.85rem;
859
+ line-height: 1.5;
860
+
861
+ .lp-title {
862
+ font-weight: 600;
863
+ color: var(--headings);
864
+ margin-bottom: 0.25em;
865
+ }
866
+ .lp-excerpt {
867
+ color: var(--text-secondary);
868
+ display: -webkit-box;
869
+ -webkit-line-clamp: 3;
870
+ -webkit-box-orient: vertical;
871
+ overflow: hidden;
872
+ }
873
+ .lp-meta {
874
+ margin-top: 0.4em;
875
+ font-family: var(--font-mono);
876
+ font-size: 0.7rem;
877
+ text-transform: uppercase;
878
+ letter-spacing: 0.05em;
879
+ color: var(--text-secondary);
880
+ opacity: 0.7;
881
+ }
882
+ }
883
+ .link-preview.visible { opacity: 1; }
884
+
885
+ // -------------- VIEW TRANSITIONS -------------- //
886
+ // Smooth crossfade on cross-document navigation in supporting browsers
887
+ // (Chrome/Edge/Safari). No-op everywhere else.
888
+ @view-transition {
889
+ navigation: auto;
890
+ }
891
+ @media (prefers-reduced-motion: no-preference) {
892
+ ::view-transition-old(root),
893
+ ::view-transition-new(root) {
894
+ animation-duration: 0.25s;
895
+ }
896
+ }
897
+ // ----------------------------------------------- //