jekyll-theme-zer0 1.19.1 → 1.20.2

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 (86) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +395 -0
  3. data/README.md +27 -19
  4. data/_data/authors.yml +154 -5
  5. data/_data/backlog.yml +5 -5
  6. data/_data/content_statistics.yml +273 -297
  7. data/_data/features.yml +4 -25
  8. data/_data/navigation/README.md +24 -0
  9. data/_data/navigation/about.yml +2 -0
  10. data/_data/navigation/main.yml +2 -7
  11. data/_data/roadmap.yml +86 -12
  12. data/_includes/components/author-avatar-url.html +28 -0
  13. data/_includes/components/author-bio.html +86 -0
  14. data/_includes/components/author-card.html +184 -121
  15. data/_includes/components/author-eeat.html +10 -4
  16. data/_includes/components/info-section.html +1 -1
  17. data/_includes/components/mermaid.html +0 -3
  18. data/_includes/components/post-card.html +19 -9
  19. data/_includes/content/giscus.html +3 -2
  20. data/_includes/core/footer-fabs.html +28 -0
  21. data/_includes/core/footer.html +7 -17
  22. data/_includes/core/head.html +2 -2
  23. data/_includes/navigation/breadcrumbs.html +20 -2
  24. data/_includes/navigation/local-graph.html +18 -2
  25. data/_includes/obsidian/full-graph.html +4 -6
  26. data/_layouts/article.html +44 -74
  27. data/_layouts/author.html +274 -0
  28. data/_layouts/authors.html +55 -0
  29. data/_layouts/news.html +3 -3
  30. data/_layouts/note.html +21 -6
  31. data/_layouts/notebook.html +21 -6
  32. data/_layouts/root.html +31 -17
  33. data/_layouts/section.html +3 -3
  34. data/_plugins/author_pages_generator.rb +121 -0
  35. data/_sass/components/_author.scss +219 -0
  36. data/_sass/components/_content-tables.scss +16 -1
  37. data/_sass/components/_notes-index.scss +102 -0
  38. data/_sass/components/_search-modal.scss +40 -0
  39. data/_sass/components/_ui-enhancements.scss +570 -0
  40. data/_sass/core/_docs-code-examples.scss +463 -0
  41. data/_sass/core/_docs-layout.scss +0 -453
  42. data/_sass/core/_navbar.scss +253 -0
  43. data/_sass/core/_sidebar-extras.scss +79 -0
  44. data/_sass/core/_toc.scss +87 -0
  45. data/_sass/core/_variables.scss +7 -142
  46. data/_sass/custom.scss +24 -1122
  47. data/_sass/layouts/_global-chrome.scss +59 -0
  48. data/assets/css/main.scss +19 -2
  49. data/assets/js/author-profile.js +190 -0
  50. data/assets/js/modules/navigation/navbar.js +104 -0
  51. data/assets/js/obsidian-graph.js +2 -2
  52. data/assets/js/obsidian-local-graph.js +11 -5
  53. data/assets/vendor/cytoscape/cytoscape.min.js +32 -0
  54. data/scripts/README.md +39 -0
  55. data/scripts/bin/validate +11 -1
  56. data/scripts/dev/css-diff.sh +49 -0
  57. data/scripts/dev/shot.js +37 -0
  58. data/scripts/features/generate-preview-images +110 -6
  59. data/scripts/features/pixelate-preview-images +126 -0
  60. data/scripts/features/pixelate_images.py +662 -0
  61. data/scripts/github-setup.sh +0 -0
  62. data/scripts/lib/preview_generator.py +47 -3
  63. data/scripts/pixelate-preview-images.sh +12 -0
  64. data/scripts/test/integration/auto-version +10 -8
  65. data/scripts/test/lib/run_tests.sh +2 -0
  66. data/scripts/test/lib/test_content_review.sh +205 -0
  67. data/scripts/test/lib/test_pixelate_images.sh +108 -0
  68. metadata +25 -20
  69. data/_data/hub.yml +0 -68
  70. data/_data/hub_index.yml +0 -203
  71. data/_data/navigation/hub.yml +0 -110
  72. data/assets/vendor/font-awesome/css/all.min.css +0 -9
  73. data/assets/vendor/font-awesome/webfonts/fa-brands-400.ttf +0 -0
  74. data/assets/vendor/font-awesome/webfonts/fa-brands-400.woff2 +0 -0
  75. data/assets/vendor/font-awesome/webfonts/fa-regular-400.ttf +0 -0
  76. data/assets/vendor/font-awesome/webfonts/fa-regular-400.woff2 +0 -0
  77. data/assets/vendor/font-awesome/webfonts/fa-solid-900.ttf +0 -0
  78. data/assets/vendor/font-awesome/webfonts/fa-solid-900.woff2 +0 -0
  79. data/assets/vendor/font-awesome/webfonts/fa-v4compatibility.ttf +0 -0
  80. data/assets/vendor/font-awesome/webfonts/fa-v4compatibility.woff2 +0 -0
  81. data/assets/vendor/jquery/jquery-3.7.1.min.js +0 -2
  82. data/scripts/lib/hub.rb +0 -208
  83. data/scripts/provision-org-sites.rb +0 -252
  84. data/scripts/provision-org-sites.sh +0 -23
  85. data/scripts/sync-hub-metadata.rb +0 -184
  86. data/scripts/sync-hub-metadata.sh +0 -22
@@ -0,0 +1,570 @@
1
+ // ============================================================================
2
+
3
+ // UI/UX enhancements — Bootstrap component polish (buttons, cards, hero, etc.)
4
+
5
+ // ----------------------------------------------------------------------------
6
+
7
+ // Extracted from custom.scss (Phase 5). Global element/loading styles plus the
8
+
9
+ // interaction/animation polish layered on top of Bootstrap components.
10
+
11
+ // ============================================================================
12
+
13
+ img {
14
+ display: inline-block;
15
+ max-width: 100%;
16
+ height: auto;
17
+ }
18
+
19
+ // MOVED → _sass/core/_navbar.scss — navbar-brand logo sizing + the #navbar
20
+ // fixed/auto-hide desktop grid + responsive/mobile navbar layout now live with
21
+ // the rest of the navbar styling.
22
+
23
+ // MOVED → _sass/components/_search-modal.scss (search modal + folder tree).
24
+
25
+ // ==============================================================================
26
+ // UI/UX ENHANCEMENTS - Modern, polished interactions
27
+ // ==============================================================================
28
+
29
+ // Hero Section Enhancements
30
+ // NOTE: Exclude .zer0-bg-hero so skin-specific gradients from _backgrounds.scss take precedence
31
+ .bg-primary:not(.zer0-bg-hero) {
32
+ position: relative;
33
+ overflow: hidden;
34
+
35
+ &::before {
36
+ content: '';
37
+ position: absolute;
38
+ top: 0;
39
+ left: 0;
40
+ right: 0;
41
+ bottom: 0;
42
+ background: linear-gradient(135deg, rgba(255,255,255,0.1) 0%, rgba(255,255,255,0) 100%);
43
+ pointer-events: none;
44
+ }
45
+ }
46
+
47
+ // Hero content animations
48
+ .bg-primary .container-xl {
49
+ animation: fadeInUp 0.8s ease-out;
50
+ }
51
+
52
+ @keyframes fadeInUp {
53
+ from {
54
+ opacity: 0;
55
+ transform: translateY(30px);
56
+ }
57
+ to {
58
+ opacity: 1;
59
+ transform: translateY(0);
60
+ }
61
+ }
62
+
63
+ // Enhanced Button Styles
64
+ .btn {
65
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
66
+ position: relative;
67
+ overflow: hidden;
68
+
69
+ &::before {
70
+ content: '';
71
+ position: absolute;
72
+ top: 50%;
73
+ left: 50%;
74
+ width: 0;
75
+ height: 0;
76
+ border-radius: 50%;
77
+ background: rgba(255, 255, 255, 0.2);
78
+ transform: translate(-50%, -50%);
79
+ transition: width 0.6s, height 0.6s;
80
+ }
81
+
82
+ &:hover::before {
83
+ width: 300px;
84
+ height: 300px;
85
+ }
86
+
87
+ &:hover {
88
+ transform: translateY(-2px);
89
+ box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);
90
+ }
91
+
92
+ &:active {
93
+ transform: translateY(0);
94
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
95
+ }
96
+
97
+ &.btn-lg {
98
+ padding: 0.75rem 1.5rem;
99
+ font-size: 1.125rem;
100
+ }
101
+ }
102
+
103
+ .btn-outline-light:hover {
104
+ background-color: rgba(255, 255, 255, 0.95);
105
+ color: var(--bs-primary);
106
+ border-color: rgba(255, 255, 255, 0.95);
107
+ }
108
+
109
+ .btn-light:hover {
110
+ background-color: rgba(255, 255, 255, 0.9);
111
+ transform: translateY(-2px);
112
+ }
113
+
114
+ // Enhanced Card Styles
115
+ .card {
116
+ transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
117
+ border: 1px solid rgba(0, 0, 0, 0.08);
118
+
119
+ &:hover {
120
+ transform: translateY(-8px);
121
+ box-shadow: 0 12px 24px rgba(0, 0, 0, 0.15);
122
+ border-color: rgba(var(--bs-primary-rgb), 0.2);
123
+ }
124
+
125
+ .card-header {
126
+ transition: all 0.3s ease;
127
+ }
128
+
129
+ &:hover .card-header {
130
+ background-color: rgba(255, 255, 255, 0.1);
131
+ }
132
+ }
133
+
134
+ // Feature Cards - Icon Animation
135
+ .card-body {
136
+ .rounded-circle {
137
+ transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
138
+ }
139
+
140
+ i {
141
+ transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1);
142
+ }
143
+ }
144
+
145
+ .card:hover .rounded-circle {
146
+ transform: scale(1.1) rotate(5deg);
147
+ box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);
148
+ }
149
+
150
+ .card:hover .rounded-circle i {
151
+ transform: scale(1.2);
152
+ }
153
+
154
+ // Code Block Enhancements
155
+ pre {
156
+ position: relative;
157
+ transition: all 0.3s ease;
158
+ border: 1px solid rgba(0, 0, 0, 0.1);
159
+
160
+ &:hover {
161
+ border-color: rgba(var(--bs-primary-rgb), 0.3);
162
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
163
+ }
164
+
165
+ code {
166
+ font-family: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace;
167
+ font-size: 0.875rem;
168
+ line-height: 1.6;
169
+ }
170
+ }
171
+
172
+ // Quick Links Bar Enhancements
173
+ .bg-dark {
174
+ .btn-outline-light {
175
+ transition: all 0.3s ease;
176
+ border-width: 2px;
177
+
178
+ &:hover {
179
+ background-color: rgba(255, 255, 255, 0.95);
180
+ color: var(--bs-dark);
181
+ transform: translateY(-2px);
182
+ box-shadow: 0 4px 8px rgba(255, 255, 255, 0.2);
183
+ }
184
+ }
185
+ }
186
+
187
+ // Smooth Scroll Enhancement
188
+ html {
189
+ scroll-behavior: smooth;
190
+ scroll-padding-top: 80px; // Account for fixed navbar
191
+ }
192
+
193
+ // Section Spacing Improvements
194
+ // Ensure anchored elements clear the fixed navbar when scrolled to
195
+ section,
196
+ .py-5,
197
+ [id] {
198
+ scroll-margin-top: 80px;
199
+ }
200
+
201
+ // Landing Page Quick Links Animation
202
+ .bg-dark {
203
+ animation: slideDown 0.6s ease-out;
204
+ }
205
+
206
+ @keyframes slideDown {
207
+ from {
208
+ opacity: 0;
209
+ transform: translateY(-20px);
210
+ }
211
+ to {
212
+ opacity: 1;
213
+ transform: translateY(0);
214
+ }
215
+ }
216
+
217
+ // Feature Section Cards Stagger Animation
218
+ .bg-body-tertiary .row.g-4 > * {
219
+ animation: fadeInUp 0.6s ease-out backwards;
220
+
221
+ &:nth-child(1) { animation-delay: 0.1s; }
222
+ &:nth-child(2) { animation-delay: 0.2s; }
223
+ &:nth-child(3) { animation-delay: 0.3s; }
224
+ }
225
+
226
+ // Installation Cards Enhancement
227
+ #get-started .card {
228
+ border-top: 3px solid transparent;
229
+ transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
230
+
231
+ &:hover {
232
+ border-top-color: var(--bs-primary);
233
+ }
234
+
235
+ &.card-header.bg-primary ~ .card-body {
236
+ border-top-color: var(--bs-primary);
237
+ }
238
+
239
+ &.card-header.bg-info ~ .card-body {
240
+ border-top-color: var(--bs-info);
241
+ }
242
+
243
+ &.card-header.bg-secondary ~ .card-body {
244
+ border-top-color: var(--bs-secondary);
245
+ }
246
+ }
247
+
248
+ // Mobile Responsiveness Improvements
249
+ @media (max-width: 768px) {
250
+ .bg-primary .display-4 {
251
+ font-size: 2rem;
252
+ }
253
+
254
+ .bg-primary .lead {
255
+ font-size: 1rem;
256
+ }
257
+
258
+ .btn-lg {
259
+ padding: 0.625rem 1.25rem;
260
+ font-size: 1rem;
261
+ }
262
+
263
+ .card {
264
+ margin-bottom: 1rem;
265
+ }
266
+
267
+ // Reduce hover effects on mobile for better performance
268
+ .card:hover {
269
+ transform: translateY(-4px);
270
+ }
271
+
272
+ .btn:hover {
273
+ transform: none;
274
+ }
275
+ }
276
+
277
+ // Loading State for Images
278
+ img {
279
+ transition: opacity 0.3s ease;
280
+
281
+ &[loading="lazy"] {
282
+ opacity: 0;
283
+
284
+ &.loaded {
285
+ opacity: 1;
286
+ }
287
+ }
288
+ }
289
+
290
+ // Focus States for Accessibility
291
+ .btn:focus-visible,
292
+ .card:focus-visible,
293
+ a:focus-visible {
294
+ outline: 3px solid rgba(var(--bs-primary-rgb), 0.5);
295
+ outline-offset: 2px;
296
+ }
297
+
298
+ // Reduce Motion: the global `*,*::before,*::after` reduced-motion reset lives in
299
+ // _sass/utilities/_motion.scss (imported earlier, identical `!important` body).
300
+ // This duplicate was removed — no compiled change. The navbar-scoped
301
+ // `#navbar { transition: none }` reduced-motion rule above is kept (it targets a
302
+ // specific element, not the universal reset).
303
+
304
+ // Table Enhancements
305
+ .table {
306
+ transition: all 0.3s ease;
307
+
308
+ tbody tr {
309
+ transition: background-color 0.2s ease;
310
+
311
+ &:hover {
312
+ background-color: rgba(var(--bs-primary-rgb), 0.05);
313
+ }
314
+ }
315
+ }
316
+
317
+ // Badge Enhancements
318
+ .badge {
319
+ transition: all 0.3s ease;
320
+
321
+ &:hover {
322
+ transform: scale(1.05);
323
+ }
324
+ }
325
+
326
+ // Feature category badges on /features/
327
+ .feature-categories {
328
+ .badge {
329
+ &:hover,
330
+ &:focus-visible {
331
+ color: var(--bs-badge-color, #fff);
332
+ text-decoration: none;
333
+ filter: brightness(1.12);
334
+ transform: scale(1.05);
335
+ outline: 2px solid rgba(var(--bs-primary-rgb), 0.55);
336
+ outline-offset: 2px;
337
+ }
338
+ }
339
+ }
340
+
341
+ // Link Enhancements
342
+ a:not(.btn) {
343
+ transition: color 0.2s ease;
344
+ text-decoration: none;
345
+
346
+ &:hover {
347
+ text-decoration: underline;
348
+ text-underline-offset: 3px;
349
+ }
350
+ }
351
+
352
+ // Container Enhancements
353
+ .container-xl {
354
+ position: relative;
355
+ }
356
+
357
+ // Hero Image Animation
358
+ .bg-primary img {
359
+ animation: fadeInRight 1s ease-out 0.3s backwards;
360
+ filter: drop-shadow(0 10px 30px rgba(0, 0, 0, 0.3));
361
+ transition: transform 0.3s ease;
362
+
363
+ &:hover {
364
+ transform: scale(1.02);
365
+ }
366
+ }
367
+
368
+ @keyframes fadeInRight {
369
+ from {
370
+ opacity: 0;
371
+ transform: translateX(30px);
372
+ }
373
+ to {
374
+ opacity: 1;
375
+ transform: translateX(0);
376
+ }
377
+ }
378
+
379
+ // Improved Shadow Utilities
380
+ .shadow-sm {
381
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08) !important;
382
+ }
383
+
384
+ .shadow {
385
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.12) !important;
386
+ }
387
+
388
+ .shadow-lg {
389
+ box-shadow: 0 8px 16px rgba(0, 0, 0, 0.15) !important;
390
+ }
391
+
392
+ // Button Ripple Effect — JS-injected `.ripple` click element.
393
+ // `position: relative` / `overflow: hidden` are already set on `.btn` by the
394
+ // "Enhanced Button Styles" block above; the duplicate declarations here were
395
+ // removed (no compiled change — they resolved to the same values).
396
+ .btn {
397
+ .ripple {
398
+ position: absolute;
399
+ border-radius: 50%;
400
+ background: rgba(255, 255, 255, 0.6);
401
+ transform: scale(0);
402
+ animation: ripple-animation 0.6s ease-out;
403
+ pointer-events: none;
404
+ }
405
+ }
406
+
407
+ @keyframes ripple-animation {
408
+ to {
409
+ transform: scale(4);
410
+ opacity: 0;
411
+ }
412
+ }
413
+
414
+ // Mobile Navigation Enhancements
415
+ @media (max-width: 991.98px) {
416
+ .navbar-collapse {
417
+ background-color: var(--bs-body-bg);
418
+ border-radius: 0.5rem;
419
+ margin-top: 1rem;
420
+ padding: 1rem;
421
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
422
+ }
423
+
424
+ .navbar-nav .nav-link {
425
+ padding: 0.75rem 1rem;
426
+ border-radius: 0.375rem;
427
+ transition: all 0.2s ease;
428
+
429
+ &:hover {
430
+ background-color: rgba(var(--bs-primary-rgb), 0.1);
431
+ }
432
+ }
433
+ }
434
+
435
+ // Improved Mobile Hero Section
436
+ @media (max-width: 768px) {
437
+ .bg-primary {
438
+ padding: 2rem 0 !important;
439
+
440
+ .display-4 {
441
+ font-size: 1.75rem;
442
+ line-height: 1.3;
443
+ }
444
+
445
+ .lead {
446
+ font-size: 0.95rem;
447
+ }
448
+
449
+ .btn-lg {
450
+ width: 100%;
451
+ margin-bottom: 0.5rem;
452
+ }
453
+ }
454
+
455
+ // Better card spacing on mobile
456
+ .row.g-4 > * {
457
+ margin-bottom: 1rem;
458
+ }
459
+
460
+ // Improved code block readability on mobile
461
+ pre {
462
+ font-size: 0.8rem;
463
+ overflow-x: auto;
464
+ -webkit-overflow-scrolling: touch;
465
+
466
+ &:not(.highlight) {
467
+ padding: var(--zer0-space-2);
468
+ }
469
+ }
470
+
471
+ .highlight:not(pre) pre,
472
+ pre.highlight {
473
+ padding: 0;
474
+ }
475
+ }
476
+
477
+ // Touch-friendly tap targets
478
+ @media (hover: none) and (pointer: coarse) {
479
+ .btn,
480
+ .card,
481
+ a {
482
+ min-height: 44px; // iOS HIG recommendation
483
+ min-width: 44px;
484
+ }
485
+
486
+ // Disable hover effects on touch devices
487
+ .card:hover {
488
+ transform: none;
489
+ }
490
+
491
+ .btn:hover {
492
+ transform: none;
493
+ }
494
+ }
495
+
496
+ // Improved focus visibility for keyboard navigation
497
+ *:focus-visible {
498
+ outline: 2px solid var(--bs-primary);
499
+ outline-offset: 2px;
500
+ border-radius: 0.25rem;
501
+ }
502
+
503
+ // Enhanced active link states
504
+ .nav-link.active,
505
+ .btn.active {
506
+ position: relative;
507
+
508
+ &::after {
509
+ content: '';
510
+ position: absolute;
511
+ bottom: 0;
512
+ left: 50%;
513
+ transform: translateX(-50%);
514
+ width: 80%;
515
+ height: 2px;
516
+ background-color: currentColor;
517
+ border-radius: 2px;
518
+ }
519
+ }
520
+
521
+ // Better table responsiveness
522
+ @media (max-width: 768px) {
523
+ .table-responsive {
524
+ border-radius: 0.5rem;
525
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
526
+ }
527
+
528
+ .table {
529
+ font-size: 0.875rem;
530
+
531
+ th, td {
532
+ padding: 0.5rem;
533
+ }
534
+ }
535
+ }
536
+
537
+ // Improved badge styling
538
+ .badge {
539
+ font-weight: 500;
540
+ letter-spacing: 0.025em;
541
+ padding: 0.35em 0.65em;
542
+ }
543
+
544
+ // Enhanced form controls
545
+ .form-control:focus,
546
+ .form-select:focus {
547
+ border-color: var(--bs-primary);
548
+ box-shadow: 0 0 0 0.25rem rgba(var(--bs-primary-rgb), 0.25);
549
+ transform: translateY(-1px);
550
+ transition: all 0.2s ease;
551
+ }
552
+
553
+ // MOVED → _sass/components/_skeleton.scss (token-aware, dark-mode-safe)
554
+
555
+ // Print optimizations
556
+ @media print {
557
+ .btn,
558
+ .card:hover,
559
+ .navbar,
560
+ .footer {
561
+ box-shadow: none !important;
562
+ transform: none !important;
563
+ }
564
+
565
+ a[href^="#"]::after {
566
+ content: " (" attr(href) ")";
567
+ font-size: 0.8em;
568
+ color: #666;
569
+ }
570
+ }