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