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