LabCodeHub öffentliche Ansicht
Anmelden
Küpper / Quildrop öffentlich
Branch: main
Quildrop / themes / default / static / css / style.css
Verlauf Rohdaten
R Rüdiger Küpper add binaries
e6455c95 vor 16 Tagen
themes/default/static/css/style.css 1390 Zeilen · 29.1 KB · CSS
1
/* === Reset & Base === */
2
*, *::before, *::after {
3
    margin: 0;
4
    padding: 0;
5
    box-sizing: border-box;
6
}
7
8
/* === Theme Variables === */
9
:root, [data-theme="dark"] {
10
    --bg-primary: #0a0e17;
11
    --bg-secondary: #0f1420;
12
    --bg-card: #141924;
13
    --bg-card-hover: #1a2030;
14
    --text-primary: #e2e8f0;
15
    --text-secondary: #8892a4;
16
    --text-muted: #5a6478;
17
    --accent: #38bdf8;
18
    --accent-dim: #1d7bb5;
19
    --accent-glow: rgba(56, 189, 248, 0.12);
20
    --accent-glow-strong: rgba(56, 189, 248, 0.25);
21
    --border: #1e293b;
22
    --border-subtle: #162032;
23
    --code-bg: #0d1117;
24
    --code-border: #1e293b;
25
    --tag-bg: rgba(56, 189, 248, 0.08);
26
    --tag-border: rgba(56, 189, 248, 0.3);
27
    --nav-bg: rgba(10, 14, 23, 0.85);
28
    --shadow: 0 4px 24px rgba(0, 0, 0, 0.3);
29
    --shadow-glow: 0 0 30px rgba(56, 189, 248, 0.08);
30
    --gradient-hero: linear-gradient(135deg, rgba(56, 189, 248, 0.05) 0%, transparent 60%);
31
}
32
33
[data-theme="light"] {
34
    --bg-primary: #f0f4f8;
35
    --bg-secondary: #ffffff;
36
    --bg-card: #ffffff;
37
    --bg-card-hover: #f8fafc;
38
    --text-primary: #1a202c;
39
    --text-secondary: #4a5568;
40
    --text-muted: #718096;
41
    --accent: #0284c7;
42
    --accent-dim: #0369a1;
43
    --accent-glow: rgba(2, 132, 199, 0.08);
44
    --accent-glow-strong: rgba(2, 132, 199, 0.15);
45
    --border: #e2e8f0;
46
    --border-subtle: #edf2f7;
47
    --code-bg: #f1f5f9;
48
    --code-border: #e2e8f0;
49
    --tag-bg: rgba(2, 132, 199, 0.06);
50
    --tag-border: rgba(2, 132, 199, 0.25);
51
    --nav-bg: rgba(255, 255, 255, 0.9);
52
    --shadow: 0 4px 24px rgba(0, 0, 0, 0.06);
53
    --shadow-glow: 0 0 30px rgba(2, 132, 199, 0.05);
54
    --gradient-hero: linear-gradient(135deg, rgba(2, 132, 199, 0.04) 0%, transparent 60%);
55
}
56
57
/* === Typography === */
58
body {
59
    font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
60
    font-size: 16px;
61
    line-height: 1.7;
62
    color: var(--text-primary);
63
    background-color: var(--bg-primary);
64
    transition: background-color 0.3s ease, color 0.3s ease;
65
    min-height: 100vh;
66
    display: flex;
67
    flex-direction: column;
68
}
69
70
/* === Navigation === */
71
.navbar {
72
    position: sticky;
73
    top: 0;
74
    z-index: 100;
75
    background: var(--nav-bg);
76
    backdrop-filter: blur(20px);
77
    -webkit-backdrop-filter: blur(20px);
78
    border-bottom: 1px solid var(--border-subtle);
79
}
80
81
.nav-inner {
82
    max-width: 900px;
83
    margin: 0 auto;
84
    padding: 1rem 1.5rem;
85
    display: flex;
86
    align-items: center;
87
    justify-content: space-between;
88
}
89
90
.nav-brand {
91
    font-family: 'JetBrains Mono', monospace;
92
    font-weight: 700;
93
    font-size: 1.2rem;
94
    color: var(--accent);
95
    text-decoration: none;
96
    letter-spacing: -0.02em;
97
}
98
99
.nav-brand:hover {
100
    text-shadow: 0 0 20px var(--accent-glow-strong);
101
}
102
103
.nav-links {
104
    display: flex;
105
    align-items: center;
106
    gap: 1.5rem;
107
}
108
109
.nav-links > a,
110
.nav-dropdown-toggle {
111
    color: var(--text-secondary);
112
    text-decoration: none;
113
    font-size: 0.9rem;
114
    font-weight: 500;
115
    transition: color 0.2s ease;
116
}
117
118
.nav-links > a:hover,
119
.nav-dropdown-toggle:hover {
120
    color: var(--accent);
121
}
122
123
/* Hamburger button */
124
.hamburger {
125
    display: none;
126
    flex-direction: column;
127
    gap: 4px;
128
    background: none;
129
    border: 1px solid var(--border);
130
    border-radius: 8px;
131
    padding: 8px 7px;
132
    cursor: pointer;
133
    z-index: 110;
134
}
135
136
.hamburger span {
137
    display: block;
138
    width: 20px;
139
    height: 2px;
140
    background: var(--text-secondary);
141
    border-radius: 2px;
142
    transition: all 0.3s ease;
143
}
144
145
.hamburger.active span:nth-child(1) {
146
    transform: rotate(45deg) translate(4px, 4px);
147
}
148
.hamburger.active span:nth-child(2) {
149
    opacity: 0;
150
}
151
.hamburger.active span:nth-child(3) {
152
    transform: rotate(-45deg) translate(5px, -5px);
153
}
154
155
/* Dropdown */
156
.nav-dropdown {
157
    position: relative;
158
}
159
160
.nav-dropdown-toggle {
161
    background: none;
162
    border: none;
163
    cursor: pointer;
164
    display: flex;
165
    align-items: center;
166
    gap: 0.35rem;
167
    font-family: inherit;
168
    padding: 0;
169
}
170
171
.nav-dropdown-toggle svg {
172
    transition: transform 0.2s ease;
173
}
174
175
.nav-dropdown:hover .nav-dropdown-toggle svg,
176
.nav-dropdown.open .nav-dropdown-toggle svg {
177
    transform: rotate(180deg);
178
}
179
180
.nav-dropdown-menu {
181
    position: absolute;
182
    top: calc(100% + 0.6rem);
183
    left: 50%;
184
    transform: translateX(-50%);
185
    background: var(--bg-card);
186
    border: 1px solid var(--border);
187
    border-radius: 10px;
188
    padding: 0.5rem 0;
189
    min-width: 180px;
190
    opacity: 0;
191
    visibility: hidden;
192
    transform: translateX(-50%) translateY(-8px);
193
    transition: all 0.2s ease;
194
    box-shadow: var(--shadow);
195
    z-index: 200;
196
}
197
198
.nav-dropdown:hover .nav-dropdown-menu,
199
.nav-dropdown.open .nav-dropdown-menu {
200
    opacity: 1;
201
    visibility: visible;
202
    transform: translateX(-50%) translateY(0);
203
}
204
205
.nav-dropdown-menu a {
206
    display: block;
207
    padding: 0.5rem 1.2rem;
208
    color: var(--text-secondary);
209
    text-decoration: none;
210
    font-size: 0.88rem;
211
    font-weight: 500;
212
    transition: all 0.15s ease;
213
    white-space: nowrap;
214
}
215
216
.nav-dropdown-menu a:hover {
217
    color: var(--accent);
218
    background: var(--accent-glow);
219
}
220
221
/* RSS icon */
222
.nav-rss {
223
    display: flex;
224
    align-items: center;
225
    color: var(--text-muted);
226
    transition: color 0.2s ease;
227
}
228
229
.nav-rss:hover {
230
    color: var(--accent);
231
}
232
233
/* Theme toggle */
234
#theme-toggle {
235
    background: none;
236
    border: 1px solid var(--border);
237
    color: var(--text-secondary);
238
    cursor: pointer;
239
    padding: 0.4rem 0.6rem;
240
    border-radius: 8px;
241
    font-size: 1rem;
242
    transition: all 0.2s ease;
243
    line-height: 1;
244
}
245
246
#theme-toggle:hover {
247
    border-color: var(--accent);
248
    color: var(--accent);
249
    box-shadow: 0 0 12px var(--accent-glow);
250
}
251
252
/* === Search === */
253
.search-container {
254
    position: relative;
255
    display: flex;
256
    align-items: center;
257
}
258
259
.search-toggle {
260
    background: none;
261
    border: 1px solid var(--border);
262
    color: var(--text-secondary);
263
    cursor: pointer;
264
    padding: 0.4rem 0.6rem;
265
    border-radius: 8px;
266
    display: flex;
267
    align-items: center;
268
    justify-content: center;
269
    transition: all 0.2s ease;
270
    line-height: 1;
271
}
272
273
.search-toggle:hover {
274
    border-color: var(--accent);
275
    color: var(--accent);
276
    box-shadow: 0 0 12px var(--accent-glow);
277
}
278
279
.search-container.active .search-toggle {
280
    border-color: var(--accent);
281
    color: var(--accent);
282
}
283
284
.search-box {
285
    display: none;
286
    position: absolute;
287
    top: calc(100% + 0.75rem);
288
    right: 0;
289
    width: 360px;
290
    z-index: 1000;
291
}
292
293
.search-container.active .search-box {
294
    display: block;
295
}
296
297
#search-input {
298
    width: 100%;
299
    padding: 0.7rem 1rem;
300
    border: 1px solid var(--border);
301
    border-radius: 10px;
302
    background: var(--bg-card);
303
    color: var(--text-primary);
304
    font-family: inherit;
305
    font-size: 0.9rem;
306
    outline: none;
307
    transition: border-color 0.2s ease, box-shadow 0.2s ease;
308
    box-sizing: border-box;
309
}
310
311
#search-input:focus {
312
    border-color: var(--accent);
313
    box-shadow: 0 0 0 3px var(--accent-glow);
314
}
315
316
#search-input::placeholder {
317
    color: var(--text-muted);
318
}
319
320
.search-results {
321
    display: none;
322
    margin-top: 0.5rem;
323
    background: var(--bg-card);
324
    border: 1px solid var(--border);
325
    border-radius: 10px;
326
    overflow: hidden;
327
    box-shadow: 0 8px 32px rgba(0,0,0,0.3);
328
    max-height: 420px;
329
    overflow-y: auto;
330
}
331
332
.search-results.visible {
333
    display: block;
334
}
335
336
.search-result-item {
337
    display: block;
338
    padding: 0.75rem 1rem;
339
    text-decoration: none;
340
    color: var(--text-primary);
341
    border-bottom: 1px solid var(--border);
342
    transition: background 0.15s ease;
343
}
344
345
.search-result-item:last-child {
346
    border-bottom: none;
347
}
348
349
.search-result-item:hover {
350
    background: var(--bg-secondary);
351
}
352
353
.search-result-title {
354
    font-size: 0.9rem;
355
    font-weight: 600;
356
    line-height: 1.3;
357
    margin-bottom: 0.3rem;
358
}
359
360
.search-result-title mark {
361
    background: var(--accent-glow);
362
    color: var(--accent);
363
    border-radius: 2px;
364
    padding: 0 2px;
365
}
366
367
.search-result-meta {
368
    display: flex;
369
    align-items: center;
370
    gap: 0.5rem;
371
    flex-wrap: wrap;
372
}
373
374
.search-result-date {
375
    font-family: 'JetBrains Mono', monospace;
376
    font-size: 0.7rem;
377
    color: var(--text-muted);
378
}
379
380
.search-result-tags {
381
    display: flex;
382
    gap: 0.3rem;
383
}
384
385
.search-result-tag {
386
    font-family: 'JetBrains Mono', monospace;
387
    font-size: 0.65rem;
388
    padding: 0.1rem 0.4rem;
389
    border-radius: 4px;
390
    background: var(--bg-secondary);
391
    color: var(--accent);
392
    border: 1px solid var(--border);
393
}
394
395
.search-no-results {
396
    padding: 1rem;
397
    text-align: center;
398
    color: var(--text-muted);
399
    font-size: 0.85rem;
400
}
401
402
/* === Container === */
403
.container {
404
    max-width: 900px;
405
    margin: 0 auto;
406
    padding: 2rem 1.5rem;
407
    flex: 1;
408
    width: 100%;
409
}
410
411
/* === Hero === */
412
.hero {
413
    text-align: center;
414
    padding: 3rem 0 2rem;
415
    background: var(--gradient-hero);
416
    border-radius: 16px;
417
    margin-bottom: 2.5rem;
418
}
419
420
.hero-title {
421
    font-family: 'JetBrains Mono', monospace;
422
    font-size: 2.2rem;
423
    font-weight: 700;
424
    color: var(--text-primary);
425
    letter-spacing: -0.03em;
426
    margin-bottom: 0.5rem;
427
}
428
429
.hero-sub {
430
    color: var(--text-muted);
431
    font-size: 1rem;
432
    font-weight: 400;
433
}
434
435
/* === Post Cards === */
436
.post-list {
437
    display: flex;
438
    flex-direction: column;
439
    gap: 1.5rem;
440
}
441
442
.post-card {
443
    background: var(--bg-card);
444
    border: 1px solid var(--border);
445
    border-radius: 12px;
446
    transition: all 0.3s ease;
447
    position: relative;
448
    overflow: hidden;
449
}
450
451
.post-card:not(.has-cover) {
452
    padding: 1.8rem;
453
}
454
455
.post-card::before {
456
    content: '';
457
    position: absolute;
458
    top: 0;
459
    left: 0;
460
    right: 0;
461
    bottom: 0;
462
    border-radius: 12px;
463
    box-shadow: var(--shadow-glow);
464
    opacity: 0;
465
    transition: opacity 0.3s ease;
466
    pointer-events: none;
467
}
468
469
.post-card:hover {
470
    background: var(--bg-card-hover);
471
    border-color: var(--accent-dim);
472
    transform: translateY(-2px);
473
}
474
475
.post-card:hover::before {
476
    opacity: 1;
477
}
478
479
/* Cover image in card */
480
.post-card-cover {
481
    display: block;
482
    overflow: hidden;
483
    aspect-ratio: 21 / 9;
484
}
485
486
.post-card-cover img {
487
    width: 100%;
488
    height: 100%;
489
    object-fit: cover;
490
    transition: transform 0.4s ease;
491
}
492
493
.post-card:hover .post-card-cover img {
494
    transform: scale(1.03);
495
}
496
497
.post-card-body {
498
    padding: 1.5rem 1.8rem 1.8rem;
499
}
500
501
.post-card-meta {
502
    display: flex;
503
    align-items: center;
504
    justify-content: space-between;
505
    margin-bottom: 0.8rem;
506
    flex-wrap: wrap;
507
    gap: 0.5rem;
508
}
509
510
.post-card-meta time {
511
    font-family: 'JetBrains Mono', monospace;
512
    font-size: 0.8rem;
513
    color: var(--text-muted);
514
    letter-spacing: 0.02em;
515
}
516
517
.post-card-title {
518
    font-size: 1.3rem;
519
    font-weight: 600;
520
    margin-bottom: 0.6rem;
521
    line-height: 1.35;
522
}
523
524
.post-card-title a {
525
    color: var(--text-primary);
526
    text-decoration: none;
527
    transition: color 0.2s ease;
528
}
529
530
.post-card-title a:hover {
531
    color: var(--accent);
532
}
533
534
.post-card-preview {
535
    color: var(--text-secondary);
536
    font-size: 0.95rem;
537
    line-height: 1.6;
538
    margin-bottom: 1rem;
539
}
540
541
.read-more {
542
    font-family: 'JetBrains Mono', monospace;
543
    font-size: 0.85rem;
544
    color: var(--accent);
545
    text-decoration: none;
546
    font-weight: 500;
547
    transition: all 0.2s ease;
548
}
549
550
.read-more:hover {
551
    text-shadow: 0 0 12px var(--accent-glow-strong);
552
}
553
554
/* === Tags === */
555
.post-tags {
556
    display: flex;
557
    flex-wrap: wrap;
558
    gap: 0.4rem;
559
}
560
561
.tag {
562
    font-family: 'JetBrains Mono', monospace;
563
    font-size: 0.72rem;
564
    color: var(--accent);
565
    background: var(--tag-bg);
566
    border: 1px solid var(--tag-border);
567
    padding: 0.2rem 0.6rem;
568
    border-radius: 6px;
569
    text-decoration: none;
570
    transition: all 0.2s ease;
571
    white-space: nowrap;
572
}
573
574
.tag:hover {
575
    background: var(--accent-glow-strong);
576
    box-shadow: 0 0 10px var(--accent-glow);
577
}
578
579
.tag-large {
580
    font-size: 0.85rem;
581
    padding: 0.4rem 0.9rem;
582
    border-radius: 8px;
583
}
584
585
.tag-count {
586
    opacity: 0.6;
587
    margin-left: 0.3rem;
588
}
589
590
/* === Pagination === */
591
.pagination {
592
    display: flex;
593
    align-items: center;
594
    justify-content: center;
595
    gap: 0.5rem;
596
    margin-top: 2.5rem;
597
    padding-top: 2rem;
598
    border-top: 1px solid var(--border);
599
    flex-wrap: wrap;
600
}
601
602
.pagination-btn {
603
    font-family: 'JetBrains Mono', monospace;
604
    font-size: 0.85rem;
605
    font-weight: 500;
606
    color: var(--accent);
607
    text-decoration: none;
608
    padding: 0.5rem 1rem;
609
    border: 1px solid var(--border);
610
    border-radius: 8px;
611
    transition: all 0.2s ease;
612
    background: var(--bg-card);
613
}
614
615
.pagination-btn:hover:not(.disabled) {
616
    border-color: var(--accent);
617
    box-shadow: 0 0 12px var(--accent-glow);
618
    background: var(--bg-card-hover);
619
}
620
621
.pagination-btn.disabled {
622
    color: var(--text-muted);
623
    cursor: default;
624
    opacity: 0.4;
625
}
626
627
.pagination-pages {
628
    display: flex;
629
    gap: 0.3rem;
630
}
631
632
.pagination-num {
633
    font-family: 'JetBrains Mono', monospace;
634
    font-size: 0.85rem;
635
    font-weight: 500;
636
    width: 2.2rem;
637
    height: 2.2rem;
638
    display: flex;
639
    align-items: center;
640
    justify-content: center;
641
    border-radius: 8px;
642
    text-decoration: none;
643
    color: var(--text-secondary);
644
    border: 1px solid var(--border);
645
    background: var(--bg-card);
646
    transition: all 0.2s ease;
647
}
648
649
.pagination-num:hover:not(.active) {
650
    color: var(--accent);
651
    border-color: var(--accent);
652
}
653
654
.pagination-num.active {
655
    color: var(--bg-primary);
656
    background: var(--accent);
657
    border-color: var(--accent);
658
    font-weight: 700;
659
}
660
.pagination-ellipsis {
661
    color: var(--text-secondary);
662
    font-size: 1rem;
663
    padding: 0 0.25rem;
664
    user-select: none;
665
}
666
667
/* === Tags Page === */
668
.tags-page h1,
669
.tag-page h1 {
670
    font-size: 1.8rem;
671
    margin-bottom: 1.5rem;
672
}
673
674
.tags-cloud {
675
    display: flex;
676
    flex-wrap: wrap;
677
    gap: 0.7rem;
678
}
679
680
.highlight {
681
    color: var(--accent);
682
}
683
684
/* === Single Post === */
685
.post-single {
686
    max-width: 780px;
687
    margin: 0 auto;
688
}
689
690
.post-header {
691
    margin-bottom: 2rem;
692
    padding-bottom: 1.5rem;
693
    border-bottom: 1px solid var(--border);
694
}
695
696
/* Cover image on single post page */
697
.post-cover {
698
    margin-bottom: 2.5rem;
699
    border-radius: 12px;
700
    overflow: hidden;
701
    border: 1px solid var(--border);
702
}
703
704
.post-cover img {
705
    width: 100%;
706
    height: auto;
707
    display: block;
708
}
709
710
.post-header-meta {
711
    display: flex;
712
    align-items: center;
713
    gap: 1rem;
714
    margin-bottom: 1rem;
715
    font-family: 'JetBrains Mono', monospace;
716
    font-size: 0.8rem;
717
    color: var(--text-muted);
718
}
719
720
.post-title {
721
    font-size: 2rem;
722
    font-weight: 700;
723
    line-height: 1.25;
724
    margin-bottom: 1rem;
725
    letter-spacing: -0.02em;
726
}
727
728
/* === Table of Contents === */
729
.toc {
730
    background: var(--bg-card);
731
    border: 1px solid var(--border);
732
    border-radius: 10px;
733
    padding: 1.2rem 1.5rem;
734
    margin-bottom: 2rem;
735
}
736
737
.toc h3 {
738
    font-family: 'JetBrains Mono', monospace;
739
    font-size: 0.85rem;
740
    color: var(--text-muted);
741
    text-transform: uppercase;
742
    letter-spacing: 0.1em;
743
    margin-bottom: 0.8rem;
744
}
745
746
.toc ul {
747
    list-style: none;
748
    padding: 0;
749
}
750
751
.toc li {
752
    margin-bottom: 0.3rem;
753
}
754
755
.toc li a {
756
    color: var(--text-secondary);
757
    text-decoration: none;
758
    font-size: 0.9rem;
759
    transition: color 0.2s ease;
760
}
761
762
.toc li a:hover {
763
    color: var(--accent);
764
}
765
766
.toc .toc-level-0 {
767
    padding-left: 0;
768
}
769
770
.toc .toc-level-1 {
771
    padding-left: 1.2rem;
772
}
773
774
.toc .toc-level-2 {
775
    padding-left: 2.4rem;
776
}
777
778
/* === Post Content === */
779
.post-content {
780
    font-size: 1rem;
781
    line-height: 1.8;
782
}
783
784
.post-content h1 {
785
    font-size: 1.7rem;
786
    font-weight: 700;
787
    margin: 2.5rem 0 1rem;
788
    letter-spacing: -0.02em;
789
}
790
791
.post-content h2 {
792
    font-size: 1.4rem;
793
    font-weight: 600;
794
    margin: 2.2rem 0 0.8rem;
795
    color: var(--text-primary);
796
}
797
798
.post-content h3 {
799
    font-size: 1.15rem;
800
    font-weight: 600;
801
    margin: 1.8rem 0 0.6rem;
802
}
803
804
.post-content p {
805
    margin-bottom: 1.2rem;
806
}
807
808
.post-content a {
809
    color: var(--accent);
810
    text-decoration: none;
811
    border-bottom: 1px solid var(--tag-border);
812
    transition: all 0.2s ease;
813
}
814
815
.post-content a:hover {
816
    border-bottom-color: var(--accent);
817
}
818
819
.post-content img {
820
    max-width: 100%;
821
    height: auto;
822
    border-radius: 10px;
823
    margin: 1.5rem 0;
824
    border: 1px solid var(--border);
825
}
826
827
.post-content ul, .post-content ol {
828
    margin-bottom: 1.2rem;
829
    padding-left: 1.5rem;
830
}
831
832
.post-content li {
833
    margin-bottom: 0.4rem;
834
}
835
836
.post-content blockquote {
837
    border-left: 3px solid var(--accent);
838
    padding: 0.8rem 1.2rem;
839
    margin: 1.5rem 0;
840
    background: var(--bg-card);
841
    border-radius: 0 8px 8px 0;
842
    color: var(--text-secondary);
843
    font-style: italic;
844
}
845
846
/* Code - inline */
847
.post-content code {
848
    font-family: 'JetBrains Mono', monospace;
849
    font-size: 0.88em;
850
    background: var(--code-bg);
851
    border: 1px solid var(--code-border);
852
    padding: 0.15em 0.4em;
853
    border-radius: 5px;
854
    color: var(--accent);
855
}
856
857
/* Code - blocks */
858
.post-content pre {
859
    background: var(--code-bg);
860
    border: 1px solid var(--code-border);
861
    border-radius: 10px;
862
    padding: 1.2rem;
863
    margin: 1.5rem 0;
864
    overflow-x: auto;
865
    font-size: 0.88rem;
866
    line-height: 1.6;
867
}
868
869
.post-content pre code {
870
    background: none;
871
    border: none;
872
    padding: 0;
873
    color: var(--text-primary);
874
    font-size: inherit;
875
}
876
877
/* Tables */
878
.post-content table {
879
    width: 100%;
880
    border-collapse: collapse;
881
    margin: 1.5rem 0;
882
    font-size: 0.9rem;
883
    overflow-x: auto;
884
    display: block;
885
}
886
887
.post-content th, .post-content td {
888
    padding: 0.7rem 1rem;
889
    text-align: left;
890
    border-bottom: 1px solid var(--border);
891
}
892
893
.post-content th {
894
    font-weight: 600;
895
    color: var(--accent);
896
    background: var(--bg-card);
897
}
898
899
.post-content tr:hover td {
900
    background: var(--bg-card);
901
}
902
903
/* === Post Footer === */
904
/* === Post Navigation (Prev/Next) === */
905
.post-nav {
906
    display: flex;
907
    gap: 1.5rem;
908
    margin-top: 3rem;
909
    padding-top: 1.5rem;
910
    border-top: 1px solid var(--border);
911
}
912
913
.post-nav-link {
914
    flex: 1;
915
    display: flex;
916
    flex-direction: column;
917
    gap: 0.3rem;
918
    padding: 1rem;
919
    border-radius: 10px;
920
    background: var(--bg-card);
921
    border: 1px solid var(--border);
922
    text-decoration: none;
923
    transition: all 0.2s ease;
924
}
925
926
.post-nav-link:hover {
927
    border-color: var(--accent);
928
    background: var(--bg-card-hover);
929
    box-shadow: 0 0 16px var(--accent-glow);
930
}
931
932
.post-nav-link.disabled {
933
    visibility: hidden;
934
}
935
936
.post-nav-prev {
937
    align-items: flex-start;
938
}
939
940
.post-nav-next {
941
    align-items: flex-end;
942
    text-align: right;
943
}
944
945
.post-nav-label {
946
    font-family: 'JetBrains Mono', monospace;
947
    font-size: 0.75rem;
948
    color: var(--text-muted);
949
    text-transform: uppercase;
950
    letter-spacing: 0.05em;
951
}
952
953
.post-nav-title {
954
    font-size: 0.9rem;
955
    font-weight: 600;
956
    color: var(--accent);
957
    line-height: 1.3;
958
}
959
960
@media (max-width: 640px) {
961
    .post-nav {
962
        flex-direction: column;
963
        gap: 0.75rem;
964
    }
965
    .post-nav-next {
966
        align-items: flex-start;
967
        text-align: left;
968
    }
969
}
970
971
.post-footer {
972
    margin-top: 1.5rem;
973
    padding-top: 1rem;
974
}
975
976
.back-link {
977
    font-family: 'JetBrains Mono', monospace;
978
    font-size: 0.85rem;
979
    color: var(--accent);
980
    text-decoration: none;
981
    transition: all 0.2s ease;
982
}
983
984
.back-link:hover {
985
    text-shadow: 0 0 12px var(--accent-glow-strong);
986
}
987
988
/* === Footer === */
989
.footer {
990
    border-top: 1px solid var(--border-subtle);
991
    margin-top: auto;
992
}
993
994
.footer-inner {
995
    max-width: 900px;
996
    margin: 0 auto;
997
    padding: 1.5rem;
998
    text-align: center;
999
}
1000
1001
.footer p {
1002
    font-size: 0.85rem;
1003
    color: var(--text-muted);
1004
}
1005
1006
/* === Chroma Syntax Highlighting (Dracula) === */
1007
.chroma { color: #f8f8f2 }
1008
.chroma .err { color: #ff5555 }
1009
.chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; }
1010
.chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; width: auto; overflow: auto; display: block; }
1011
.chroma .hl { display: block; width: 100%; background-color: #3d3f4a }
1012
.chroma .ln { margin-right: 0.4em; padding: 0 0.4em 0 0.4em; color: #7f7f7f }
1013
.chroma .lnt { margin-right: 0.4em; padding: 0 0.4em 0 0.4em; color: #7f7f7f }
1014
.chroma .k { color: #ff79c6 }
1015
.chroma .kc { color: #ff79c6 }
1016
.chroma .kd { color: #8be9fd; font-style: italic }
1017
.chroma .kn { color: #ff79c6 }
1018
.chroma .kp { color: #ff79c6 }
1019
.chroma .kr { color: #ff79c6 }
1020
.chroma .kt { color: #8be9fd }
1021
.chroma .na { color: #50fa7b }
1022
.chroma .nb { color: #8be9fd; font-style: italic }
1023
.chroma .nc { color: #50fa7b }
1024
.chroma .no { color: #8be9fd }
1025
.chroma .nd { color: #50fa7b }
1026
.chroma .ni { color: #f8f8f2 }
1027
.chroma .ne { color: #50fa7b }
1028
.chroma .nf { color: #50fa7b }
1029
.chroma .nl { color: #8be9fd; font-style: italic }
1030
.chroma .nn { color: #f8f8f2 }
1031
.chroma .nt { color: #ff79c6 }
1032
.chroma .nv { color: #8be9fd; font-style: italic }
1033
.chroma .s { color: #f1fa8c }
1034
.chroma .sa { color: #f1fa8c }
1035
.chroma .sb { color: #f1fa8c }
1036
.chroma .sc { color: #f1fa8c }
1037
.chroma .dl { color: #f1fa8c }
1038
.chroma .sd { color: #f1fa8c }
1039
.chroma .s2 { color: #f1fa8c }
1040
.chroma .se { color: #f1fa8c }
1041
.chroma .sh { color: #f1fa8c }
1042
.chroma .si { color: #f1fa8c }
1043
.chroma .sx { color: #f1fa8c }
1044
.chroma .sr { color: #f1fa8c }
1045
.chroma .s1 { color: #f1fa8c }
1046
.chroma .ss { color: #f1fa8c }
1047
.chroma .m { color: #bd93f9 }
1048
.chroma .mb { color: #bd93f9 }
1049
.chroma .mf { color: #bd93f9 }
1050
.chroma .mh { color: #bd93f9 }
1051
.chroma .mi { color: #bd93f9 }
1052
.chroma .il { color: #bd93f9 }
1053
.chroma .mo { color: #bd93f9 }
1054
.chroma .o { color: #ff79c6 }
1055
.chroma .ow { color: #ff79c6 }
1056
.chroma .c { color: #6272a4 }
1057
.chroma .ch { color: #6272a4 }
1058
.chroma .cm { color: #6272a4 }
1059
.chroma .c1 { color: #6272a4 }
1060
.chroma .cs { color: #6272a4 }
1061
.chroma .cp { color: #ff79c6 }
1062
.chroma .cpf { color: #6272a4 }
1063
.chroma .gd { color: #ff5555 }
1064
.chroma .ge { font-style: italic }
1065
.chroma .gi { color: #50fa7b }
1066
.chroma .gs { font-weight: bold }
1067
.chroma .gh { color: #f8f8f2; font-weight: bold }
1068
.chroma .gu { color: #6272a4; font-weight: bold }
1069
.chroma .gl { text-decoration: underline }
1070
.chroma .w { color: #f8f8f2 }
1071
.chroma .p { color: #f8f8f2 }
1072
1073
/* Light mode syntax highlighting override */
1074
[data-theme="light"] .chroma { color: #24292e }
1075
[data-theme="light"] .chroma .k { color: #d73a49 }
1076
[data-theme="light"] .chroma .kc { color: #005cc5 }
1077
[data-theme="light"] .chroma .kd { color: #d73a49 }
1078
[data-theme="light"] .chroma .kn { color: #d73a49 }
1079
[data-theme="light"] .chroma .kp { color: #d73a49 }
1080
[data-theme="light"] .chroma .kr { color: #d73a49 }
1081
[data-theme="light"] .chroma .kt { color: #005cc5 }
1082
[data-theme="light"] .chroma .na { color: #005cc5 }
1083
[data-theme="light"] .chroma .nb { color: #005cc5 }
1084
[data-theme="light"] .chroma .nc { color: #6f42c1 }
1085
[data-theme="light"] .chroma .no { color: #005cc5 }
1086
[data-theme="light"] .chroma .nd { color: #6f42c1 }
1087
[data-theme="light"] .chroma .nf { color: #6f42c1 }
1088
[data-theme="light"] .chroma .nl { color: #005cc5 }
1089
[data-theme="light"] .chroma .nt { color: #22863a }
1090
[data-theme="light"] .chroma .nv { color: #e36209 }
1091
[data-theme="light"] .chroma .s { color: #032f62 }
1092
[data-theme="light"] .chroma .sa { color: #032f62 }
1093
[data-theme="light"] .chroma .sb { color: #032f62 }
1094
[data-theme="light"] .chroma .sc { color: #032f62 }
1095
[data-theme="light"] .chroma .dl { color: #032f62 }
1096
[data-theme="light"] .chroma .sd { color: #032f62 }
1097
[data-theme="light"] .chroma .s2 { color: #032f62 }
1098
[data-theme="light"] .chroma .se { color: #032f62 }
1099
[data-theme="light"] .chroma .sh { color: #032f62 }
1100
[data-theme="light"] .chroma .si { color: #032f62 }
1101
[data-theme="light"] .chroma .sx { color: #032f62 }
1102
[data-theme="light"] .chroma .sr { color: #032f62 }
1103
[data-theme="light"] .chroma .s1 { color: #032f62 }
1104
[data-theme="light"] .chroma .ss { color: #032f62 }
1105
[data-theme="light"] .chroma .m { color: #005cc5 }
1106
[data-theme="light"] .chroma .mb { color: #005cc5 }
1107
[data-theme="light"] .chroma .mf { color: #005cc5 }
1108
[data-theme="light"] .chroma .mh { color: #005cc5 }
1109
[data-theme="light"] .chroma .mi { color: #005cc5 }
1110
[data-theme="light"] .chroma .il { color: #005cc5 }
1111
[data-theme="light"] .chroma .mo { color: #005cc5 }
1112
[data-theme="light"] .chroma .o { color: #d73a49 }
1113
[data-theme="light"] .chroma .ow { color: #d73a49 }
1114
[data-theme="light"] .chroma .c { color: #6a737d }
1115
[data-theme="light"] .chroma .ch { color: #6a737d }
1116
[data-theme="light"] .chroma .cm { color: #6a737d }
1117
[data-theme="light"] .chroma .c1 { color: #6a737d }
1118
[data-theme="light"] .chroma .cs { color: #6a737d }
1119
[data-theme="light"] .chroma .cp { color: #d73a49 }
1120
[data-theme="light"] .chroma .cpf { color: #6a737d }
1121
[data-theme="light"] .chroma .gd { color: #b31d28 }
1122
[data-theme="light"] .chroma .gi { color: #22863a }
1123
[data-theme="light"] .chroma .p { color: #24292e }
1124
1125
/* === Scrollbar === */
1126
::-webkit-scrollbar {
1127
    width: 8px;
1128
    height: 8px;
1129
}
1130
1131
::-webkit-scrollbar-track {
1132
    background: var(--bg-primary);
1133
}
1134
1135
::-webkit-scrollbar-thumb {
1136
    background: var(--border);
1137
    border-radius: 4px;
1138
}
1139
1140
::-webkit-scrollbar-thumb:hover {
1141
    background: var(--text-muted);
1142
}
1143
1144
/* === Page (static pages) === */
1145
.page-single {
1146
    max-width: 780px;
1147
    margin: 0 auto;
1148
}
1149
1150
.page-header {
1151
    margin-bottom: 2rem;
1152
    padding-bottom: 1.5rem;
1153
    border-bottom: 1px solid var(--border);
1154
}
1155
1156
.page-title {
1157
    font-size: 2rem;
1158
    font-weight: 700;
1159
    line-height: 1.25;
1160
    letter-spacing: -0.02em;
1161
}
1162
1163
/* === Responsive === */
1164
@media (max-width: 768px) {
1165
    .navbar {
1166
        position: fixed;
1167
        top: 0;
1168
        left: 0;
1169
        right: 0;
1170
        z-index: 1000;
1171
        backdrop-filter: none;
1172
        -webkit-backdrop-filter: none;
1173
        background: var(--bg-primary);
1174
    }
1175
1176
    body {
1177
        padding-top: 3.5rem;
1178
    }
1179
1180
    .hamburger {
1181
        display: flex;
1182
        position: relative;
1183
        z-index: 1020;
1184
    }
1185
1186
    .nav-links {
1187
        display: none;
1188
        position: fixed;
1189
        top: 0;
1190
        left: 0;
1191
        width: 100%;
1192
        height: 100%;
1193
        background: var(--bg-primary);
1194
        flex-direction: column;
1195
        align-items: center;
1196
        gap: 1.2rem;
1197
        padding: 5rem 2rem 2rem;
1198
        z-index: 1010;
1199
        overflow-y: auto;
1200
        -webkit-overflow-scrolling: touch;
1201
    }
1202
1203
    .nav-links.open {
1204
        display: flex;
1205
    }
1206
1207
    .nav-links > a,
1208
    .nav-links > .nav-dropdown > .nav-dropdown-toggle {
1209
        font-size: 1.15rem;
1210
        color: var(--text-primary);
1211
        display: block;
1212
        text-align: center;
1213
        padding: 0.3rem 0;
1214
    }
1215
1216
    .nav-dropdown {
1217
        text-align: center;
1218
    }
1219
1220
    .nav-dropdown-menu {
1221
        position: static;
1222
        transform: none;
1223
        opacity: 1;
1224
        visibility: visible;
1225
        background: transparent;
1226
        border: none;
1227
        box-shadow: none;
1228
        padding: 0.3rem 0 0 0;
1229
        min-width: auto;
1230
        text-align: center;
1231
        display: none;
1232
    }
1233
1234
    .nav-dropdown.open .nav-dropdown-menu {
1235
        display: block;
1236
        transform: none;
1237
    }
1238
1239
    .nav-dropdown-menu a {
1240
        padding: 0.4rem 0;
1241
        font-size: 0.95rem;
1242
        color: var(--text-secondary);
1243
    }
1244
1245
    .search-container {
1246
        width: 100%;
1247
        justify-content: center;
1248
    }
1249
1250
    .search-box {
1251
        position: fixed;
1252
        top: 5rem;
1253
        left: 1rem;
1254
        right: 1rem;
1255
        width: auto;
1256
        z-index: 1015;
1257
    }
1258
1259
    .search-results {
1260
        max-height: calc(100vh - 10rem);
1261
    }
1262
1263
    .nav-rss {
1264
        color: var(--text-primary);
1265
    }
1266
1267
    .nav-rss svg {
1268
        fill: var(--text-primary);
1269
    }
1270
1271
    #theme-toggle {
1272
        color: var(--text-primary);
1273
        border-color: var(--text-muted);
1274
    }
1275
}
1276
1277
@media (max-width: 640px) {
1278
    .nav-inner {
1279
        padding: 0.8rem 1rem;
1280
    }
1281
1282
    .container {
1283
        padding: 1.5rem 1rem;
1284
    }
1285
1286
    .hero {
1287
        padding: 2rem 1rem 1.5rem;
1288
    }
1289
1290
    .hero-title {
1291
        font-size: 1.6rem;
1292
    }
1293
1294
    .post-card {
1295
        padding: 1.3rem;
1296
    }
1297
1298
    .post-card-title {
1299
        font-size: 1.15rem;
1300
    }
1301
1302
    .post-title,
1303
    .page-title {
1304
        font-size: 1.5rem;
1305
    }
1306
1307
    .post-content h1 {
1308
        font-size: 1.4rem;
1309
    }
1310
1311
    .post-content h2 {
1312
        font-size: 1.2rem;
1313
    }
1314
1315
    .post-content pre {
1316
        padding: 0.8rem;
1317
        font-size: 0.82rem;
1318
        border-radius: 8px;
1319
    }
1320
}
1321
1322
/* === Animations === */
1323
@media (prefers-reduced-motion: no-preference) {
1324
    .post-card {
1325
        animation: fadeInUp 0.4s ease both;
1326
    }
1327
1328
    .post-card:nth-child(1) { animation-delay: 0.05s; }
1329
    .post-card:nth-child(2) { animation-delay: 0.1s; }
1330
    .post-card:nth-child(3) { animation-delay: 0.15s; }
1331
    .post-card:nth-child(4) { animation-delay: 0.2s; }
1332
    .post-card:nth-child(5) { animation-delay: 0.25s; }
1333
}
1334
1335
@keyframes fadeInUp {
1336
    from {
1337
        opacity: 0;
1338
        transform: translateY(16px);
1339
    }
1340
    to {
1341
        opacity: 1;
1342
        transform: translateY(0);
1343
    }
1344
}
1345
1346
/* Footnotes */
1347
.post-content .footnotes {
1348
    margin-top: 3rem;
1349
    padding-top: 1.5rem;
1350
    border-top: 1px solid var(--border);
1351
    font-size: 0.88rem;
1352
    color: var(--text-secondary);
1353
}
1354
1355
.post-content .footnotes hr {
1356
    display: none;
1357
}
1358
1359
.post-content .footnotes ol {
1360
    padding-left: 1.5rem;
1361
}
1362
1363
.post-content .footnotes li {
1364
    margin-bottom: 0.5rem;
1365
}
1366
1367
.post-content sup a.footnote-ref {
1368
    color: var(--accent);
1369
    text-decoration: none;
1370
    font-weight: 600;
1371
    padding: 0 2px;
1372
}
1373
1374
.post-content sup a.footnote-ref:hover {
1375
    text-decoration: underline;
1376
}
1377
1378
.post-content .footnote-backref {
1379
    color: var(--accent);
1380
    text-decoration: none;
1381
    margin-left: 0.3rem;
1382
}
1383
1384
/* Video elements */
1385
.post-content video {
1386
    max-width: 100%;
1387
    height: auto;
1388
    border-radius: 10px;
1389
    margin: 1.5rem 0;
1390
}