jekyll-theme-zer0 0.2.1 → 0.5.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.
@@ -0,0 +1,178 @@
1
+ ---
2
+ layout: root
3
+ ---
4
+ <!--
5
+ ===================================================================
6
+ STATS LAYOUT - Statistics dashboard layout
7
+ ===================================================================
8
+
9
+ File: stats.html
10
+ Path: _layouts/stats.html
11
+ Inherits: root.html
12
+ Purpose: Dedicated layout for statistics and analytics dashboards
13
+
14
+ Template Logic:
15
+ - Creates a full-width responsive layout optimized for data visualization
16
+ - Includes specialized components for statistics display
17
+ - Uses card-based layout for metric organization
18
+ - Responsive design that adapts to different screen sizes
19
+ - Integrates with Jekyll data files for dynamic content
20
+
21
+ Layout Structure:
22
+ 1. Container wrapper with Bootstrap responsive classes
23
+ 2. Page header with title and metadata
24
+ 3. Statistics overview cards section
25
+ 4. Detailed analytics sections
26
+ 5. Interactive components and charts
27
+
28
+ Dependencies:
29
+ - stats/stats-header.html: Page header and navigation
30
+ - stats/stats-overview.html: Overview metrics cards
31
+ - stats/stats-categories.html: Category analysis
32
+ - stats/stats-tags.html: Tag cloud and analysis
33
+ - stats/stats-metrics.html: Additional metrics and facts
34
+
35
+ Bootstrap Classes Used:
36
+ - container-fluid: Full-width container
37
+ - row/col: Grid system for responsive layout
38
+ - card: Card components for metric display
39
+ - badge: Badges for counts and labels
40
+ ===================================================================
41
+ -->
42
+
43
+ <!-- ================================================ -->
44
+ <!-- STATS LAYOUT CONTAINER -->
45
+ <!-- Full-width responsive container for dashboard -->
46
+ <!-- ================================================ -->
47
+ <div class="container-fluid py-4">
48
+
49
+ <!-- ================================================ -->
50
+ <!-- STATS HEADER SECTION -->
51
+ <!-- Page title, description, and metadata -->
52
+ <!-- ================================================ -->
53
+ {% include stats/stats-header.html %}
54
+
55
+ <!-- ================================================ -->
56
+ <!-- STATS VALIDATION CHECK -->
57
+ <!-- Verify data availability before rendering -->
58
+ <!-- ================================================ -->
59
+ {% if site.data.content_statistics %}
60
+
61
+ <!-- ================================================ -->
62
+ <!-- OVERVIEW METRICS SECTION -->
63
+ <!-- High-level statistics cards -->
64
+ <!-- ================================================ -->
65
+ {% include stats/stats-overview.html %}
66
+
67
+ <!-- ================================================ -->
68
+ <!-- DETAILED ANALYTICS SECTIONS -->
69
+ <!-- Categories, tags, and metrics breakdown -->
70
+ <!-- ================================================ -->
71
+ <div class="row g-4 mb-5">
72
+ <!-- Categories Analysis -->
73
+ <div class="col-lg-6">
74
+ {% include stats/stats-categories.html %}
75
+ </div>
76
+
77
+ <!-- Tags Analysis -->
78
+ <div class="col-lg-6">
79
+ {% include stats/stats-tags.html %}
80
+ </div>
81
+ </div>
82
+
83
+ <!-- ================================================ -->
84
+ <!-- ADDITIONAL METRICS SECTION -->
85
+ <!-- Quick facts and summary information -->
86
+ <!-- ================================================ -->
87
+ {% include stats/stats-metrics.html %}
88
+
89
+ {% else %}
90
+
91
+ <!-- ================================================ -->
92
+ <!-- NO DATA AVAILABLE SECTION -->
93
+ <!-- Error state when statistics are not generated -->
94
+ <!-- ================================================ -->
95
+ {% include stats/stats-no-data.html %}
96
+
97
+ {% endif %}
98
+
99
+ <!-- ================================================ -->
100
+ <!-- MAIN CONTENT AREA -->
101
+ <!-- Additional page content below statistics -->
102
+ <!-- ================================================ -->
103
+ {% if content and content != empty %}
104
+ <div class="row mt-5">
105
+ <div class="col-12">
106
+ <div class="card">
107
+ <div class="card-body">
108
+ {{ content }}
109
+ </div>
110
+ </div>
111
+ </div>
112
+ </div>
113
+ {% endif %}
114
+
115
+ </div>
116
+
117
+ <!-- ================================================ -->
118
+ <!-- STATS-SPECIFIC JAVASCRIPT -->
119
+ <!-- Initialize charts and interactive components -->
120
+ <!-- ================================================ -->
121
+ <script>
122
+ document.addEventListener('DOMContentLoaded', function() {
123
+ // Initialize tooltips for stats elements
124
+ var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
125
+ var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
126
+ return new bootstrap.Tooltip(tooltipTriggerEl);
127
+ });
128
+
129
+ // Add smooth scroll behavior for stats navigation
130
+ document.querySelectorAll('a[href^="#"]').forEach(anchor => {
131
+ anchor.addEventListener('click', function (e) {
132
+ e.preventDefault();
133
+ const target = document.querySelector(this.getAttribute('href'));
134
+ if (target) {
135
+ target.scrollIntoView({
136
+ behavior: 'smooth'
137
+ });
138
+ }
139
+ });
140
+ });
141
+
142
+ // Animate progress bars
143
+ setTimeout(function() {
144
+ document.querySelectorAll('.progress-bar').forEach(function(bar) {
145
+ const width = bar.getAttribute('data-width');
146
+ if (width) {
147
+ bar.style.width = width;
148
+ }
149
+ });
150
+ }, 500);
151
+
152
+ // Add fade-in animation to cards
153
+ setTimeout(function() {
154
+ document.querySelectorAll('.stats-card').forEach(function(card, index) {
155
+ setTimeout(function() {
156
+ card.classList.add('fade-in');
157
+ }, index * 100);
158
+ });
159
+ }, 200);
160
+
161
+ // Add intersection observer for animations
162
+ if ('IntersectionObserver' in window) {
163
+ const observer = new IntersectionObserver(function(entries) {
164
+ entries.forEach(function(entry) {
165
+ if (entry.isIntersecting) {
166
+ entry.target.classList.add('slide-up');
167
+ }
168
+ });
169
+ }, {
170
+ threshold: 0.1
171
+ });
172
+
173
+ document.querySelectorAll('.card:not(.stats-card)').forEach(function(card) {
174
+ observer.observe(card);
175
+ });
176
+ }
177
+ });
178
+ </script>
@@ -0,0 +1,392 @@
1
+ /*
2
+ ===================================================================
3
+ STATISTICS PAGE STYLES - BOOTSTRAP 5 OPTIMIZED
4
+ ===================================================================
5
+
6
+ File: stats.css
7
+ Purpose: Custom styles for the statistics dashboard that cannot be
8
+ achieved with Bootstrap 5 utility classes alone.
9
+
10
+ Philosophy: Bootstrap 5 First Approach
11
+ - Use Bootstrap 5 utility classes for all standard styling
12
+ - Custom CSS only for:
13
+ * Animations and transitions
14
+ * Shimmer effects and loading states
15
+ * Complex visual effects not available in Bootstrap
16
+ * Print styles for accessibility
17
+ * Icon animations and custom dimensions
18
+
19
+ Dependencies:
20
+ - Bootstrap 5.3.3 (primary framework)
21
+ - Bootstrap Icons (for iconography)
22
+
23
+ Note: This file should remain minimal. Most styling is handled
24
+ through Bootstrap 5 utility classes in the HTML components.
25
+ ===================================================================
26
+ */
27
+
28
+ /* ========================================== */
29
+ /* PROGRESS BAR ENHANCEMENTS */
30
+ /* ========================================== */
31
+
32
+ /* Custom progress bar animations */
33
+ .stats-progress {
34
+ height: 1.25rem;
35
+ background-color: var(--bs-gray-200);
36
+ border-radius: 0.5rem;
37
+ overflow: hidden;
38
+ }
39
+
40
+ .stats-progress .progress-bar {
41
+ transition: width 1.5s ease-in-out;
42
+ font-size: 0.875rem;
43
+ font-weight: 600;
44
+ }
45
+
46
+ /* Progress bar animation on load */
47
+ .stats-progress-animate .progress-bar {
48
+ animation: progress-fill 2s ease-in-out;
49
+ }
50
+
51
+ @keyframes progress-fill {
52
+ 0% { width: 0% !important; }
53
+ 100% { width: var(--progress-width, 0%); }
54
+ }
55
+
56
+ /* ========================================== */
57
+ /* TAG CLOUD STYLES */
58
+ /* ========================================== */
59
+
60
+ /* Tag cloud interactive effects */
61
+ .tag-cloud .badge {
62
+ transition: all 0.3s ease;
63
+ cursor: pointer;
64
+ margin: 0.25rem;
65
+ }
66
+
67
+ .tag-cloud .badge:hover {
68
+ transform: scale(1.1);
69
+ background-color: var(--bs-success) !important;
70
+ color: white !important;
71
+ }
72
+
73
+ /* Outline badge style for tags */
74
+ .bg-outline-success {
75
+ background-color: transparent;
76
+ border: 1px solid var(--bs-success);
77
+ color: var(--bs-success);
78
+ }
79
+
80
+ /* Tag size variations */
81
+ .tag-cloud .fs-xl { font-size: 1.5rem; }
82
+ .tag-cloud .fs-lg { font-size: 1.25rem; }
83
+ .tag-cloud .fs-md { font-size: 1rem; }
84
+ .tag-cloud .fs-sm { font-size: 0.875rem; }
85
+
86
+ /* ========================================== */
87
+ /* CUSTOM ICON DIMENSIONS & ANIMATIONS */
88
+ /* ========================================== */
89
+
90
+ /* Header icon container - specific dimensions needed */
91
+ .stats-header-icon {
92
+ width: 100px !important;
93
+ height: 100px !important;
94
+ }
95
+
96
+ /* Icon rotation animation for visual appeal */
97
+ .stats-icon-rotate {
98
+ animation: gentle-rotate 3s ease-in-out infinite;
99
+ }
100
+
101
+ @keyframes gentle-rotate {
102
+ 0%, 100% { transform: rotate(0deg); }
103
+ 50% { transform: rotate(5deg); }
104
+ }
105
+
106
+ /* ========================================== */
107
+ /* SHIMMER LOADING ANIMATIONS */
108
+ /* ========================================== */
109
+
110
+ /* Shimmer effect for loading placeholders */
111
+ .stats-shimmer {
112
+ background: linear-gradient(90deg,
113
+ var(--bs-gray-200) 25%,
114
+ var(--bs-gray-100) 50%,
115
+ var(--bs-gray-200) 75%
116
+ );
117
+ background-size: 200% 100%;
118
+ animation: shimmer 2s infinite;
119
+ }
120
+
121
+ @keyframes shimmer {
122
+ 0% { background-position: -200% 0; }
123
+ 100% { background-position: 200% 0; }
124
+ }
125
+
126
+ /* ========================================== */
127
+ /* ENHANCED VISUAL EFFECTS */
128
+ /* ========================================== */
129
+
130
+ /* Subtle hover animations for interactive elements */
131
+ .stats-card-hover {
132
+ transition: transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out;
133
+ }
134
+
135
+ .stats-card-hover:hover {
136
+ transform: translateY(-2px);
137
+ box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;
138
+ }
139
+
140
+ /* Pulse animation for important metrics */
141
+ .stats-pulse {
142
+ animation: subtle-pulse 2s infinite;
143
+ }
144
+
145
+ @keyframes subtle-pulse {
146
+ 0%, 100% { transform: scale(1); }
147
+ 50% { transform: scale(1.02); }
148
+ }
149
+
150
+ /* ========================================== */
151
+ /* RESPONSIVE ENHANCEMENTS */
152
+ /* ========================================== */
153
+
154
+ /* Enhanced mobile spacing for better touch targets */
155
+ @media (max-width: 576px) {
156
+ .stats-mobile-spacing .btn-group {
157
+ gap: 0.5rem !important;
158
+ }
159
+
160
+ .stats-mobile-spacing .btn {
161
+ min-height: 44px; /* Accessibility touch target */
162
+ }
163
+ }
164
+
165
+ /* ========================================== */
166
+ /* ACCESSIBILITY ENHANCEMENTS */
167
+ /* ========================================== */
168
+
169
+ /* High contrast mode support */
170
+ @media (prefers-contrast: high) {
171
+ .stats-shimmer {
172
+ background: linear-gradient(90deg,
173
+ var(--bs-gray-600) 25%,
174
+ var(--bs-gray-400) 50%,
175
+ var(--bs-gray-600) 75%
176
+ );
177
+ }
178
+ }
179
+
180
+ /* Reduced motion preference support */
181
+ @media (prefers-reduced-motion: reduce) {
182
+ .stats-icon-rotate,
183
+ .stats-shimmer,
184
+ .stats-pulse,
185
+ .stats-card-hover {
186
+ animation: none !important;
187
+ transition: none !important;
188
+ }
189
+ }
190
+
191
+ /* Focus indicators for keyboard navigation */
192
+ .btn:focus-visible,
193
+ .breadcrumb-item a:focus-visible {
194
+ outline: 2px solid var(--bs-primary) !important;
195
+ outline-offset: 2px !important;
196
+ }
197
+
198
+ /* ========================================== */
199
+ /* PRINT STYLES */
200
+ /* ========================================== */
201
+
202
+ @media print {
203
+ /* Hide interactive elements */
204
+ .btn, .alert .btn {
205
+ display: none !important;
206
+ }
207
+
208
+ /* Optimize spacing for print */
209
+ .container-fluid {
210
+ max-width: 100% !important;
211
+ padding: 0 !important;
212
+ }
213
+
214
+ /* Ensure proper page breaks */
215
+ .stats-section {
216
+ page-break-inside: avoid;
217
+ }
218
+
219
+ /* Print-friendly colors */
220
+ .bg-primary, .bg-success, .bg-info, .bg-warning {
221
+ -webkit-print-color-adjust: exact !important;
222
+ print-color-adjust: exact !important;
223
+ }
224
+
225
+ /* Typography adjustments for print */
226
+ .display-1, .display-2, .display-3 {
227
+ font-size: 2rem !important;
228
+ }
229
+
230
+ /* Remove shadows and gradients for print clarity */
231
+ .shadow, .shadow-sm, .shadow-lg,
232
+ .bg-gradient {
233
+ box-shadow: none !important;
234
+ background-image: none !important;
235
+ }
236
+ }
237
+
238
+ /* ================================================ */
239
+ /* CUSTOM ANIMATIONS - NOT AVAILABLE IN BOOTSTRAP */
240
+ /* ================================================ */
241
+
242
+ /* Card hover animations */
243
+ @keyframes cardHover {
244
+ from {
245
+ transform: translateY(0) scale(1);
246
+ }
247
+ to {
248
+ transform: translateY(-8px) scale(1.02);
249
+ }
250
+ }
251
+
252
+ .stats-card-hover:hover {
253
+ animation: cardHover 0.3s ease-out forwards;
254
+ box-shadow: 0 20px 40px rgba(0,0,0,0.15) !important;
255
+ }
256
+
257
+ /* Icon rotation on hover */
258
+ .stats-icon-rotate:hover {
259
+ transform: rotate(10deg) scale(1.1);
260
+ transition: transform 0.3s ease;
261
+ }
262
+
263
+ /* Progress bar shimmer effect */
264
+ @keyframes shimmer {
265
+ 0% {
266
+ background-position: -200px 0;
267
+ }
268
+ 100% {
269
+ background-position: calc(200px + 100%) 0;
270
+ }
271
+ }
272
+
273
+ .progress-shimmer::before {
274
+ content: '';
275
+ position: absolute;
276
+ top: 0;
277
+ left: 0;
278
+ width: 100%;
279
+ height: 100%;
280
+ background: linear-gradient(
281
+ 90deg,
282
+ transparent,
283
+ rgba(255, 255, 255, 0.6),
284
+ transparent
285
+ );
286
+ background-size: 200px 100%;
287
+ animation: shimmer 2s infinite;
288
+ }
289
+
290
+ /* Tag cloud shimmer on hover */
291
+ @keyframes tagShimmer {
292
+ 0% { left: -100%; }
293
+ 100% { left: 100%; }
294
+ }
295
+
296
+ .tag-shimmer {
297
+ position: relative;
298
+ overflow: hidden;
299
+ }
300
+
301
+ .tag-shimmer::before {
302
+ content: '';
303
+ position: absolute;
304
+ top: 0;
305
+ left: -100%;
306
+ width: 100%;
307
+ height: 100%;
308
+ background: linear-gradient(90deg, transparent, rgba(255,255,255,0.6), transparent);
309
+ transition: left 0.5s;
310
+ }
311
+
312
+ .tag-shimmer:hover::before {
313
+ animation: tagShimmer 0.6s ease-out;
314
+ }
315
+
316
+ /* ================================================ */
317
+ /* INTERSECTION OBSERVER ANIMATIONS */
318
+ /* ================================================ */
319
+
320
+ .fade-in-up {
321
+ opacity: 0;
322
+ transform: translateY(30px);
323
+ transition: opacity 0.6s ease, transform 0.6s ease;
324
+ }
325
+
326
+ .fade-in-up.animate {
327
+ opacity: 1;
328
+ transform: translateY(0);
329
+ }
330
+
331
+ /* Staggered animation delays */
332
+ .fade-in-up:nth-child(1) { transition-delay: 0.1s; }
333
+ .fade-in-up:nth-child(2) { transition-delay: 0.2s; }
334
+ .fade-in-up:nth-child(3) { transition-delay: 0.3s; }
335
+ .fade-in-up:nth-child(4) { transition-delay: 0.4s; }
336
+
337
+ /* ================================================ */
338
+ /* RESPONSIVE ADJUSTMENTS FOR MOBILE */
339
+ /* Only needed where Bootstrap classes aren't enough */
340
+ /* ================================================ */
341
+
342
+ @media (max-width: 575.98px) {
343
+ /* Ensure cards don't have excessive padding on mobile */
344
+ .stats-mobile-compact {
345
+ padding: 1rem !important;
346
+ }
347
+
348
+ /* Adjust tag cloud spacing for mobile */
349
+ .tag-cloud-mobile .badge {
350
+ margin: 0.2rem 0.3rem !important;
351
+ font-size: 0.75rem !important;
352
+ }
353
+ }
354
+
355
+ /* ================================================ */
356
+ /* PRINT STYLES */
357
+ /* Optimize for printing - Bootstrap doesn't handle this */
358
+ /* ================================================ */
359
+ @media print {
360
+ .stats-card-hover:hover {
361
+ animation: none !important;
362
+ transform: none !important;
363
+ box-shadow: none !important;
364
+ }
365
+
366
+ .btn,
367
+ .modal,
368
+ .progress-shimmer::before,
369
+ .tag-shimmer::before {
370
+ display: none !important;
371
+ }
372
+
373
+ .progress-bar {
374
+ print-color-adjust: exact;
375
+ }
376
+ }
377
+
378
+ /* ================================================ */
379
+ /* ACCESSIBILITY ENHANCEMENTS */
380
+ /* For users with reduced motion preferences */
381
+ /* ================================================ */
382
+ @media (prefers-reduced-motion: reduce) {
383
+ .stats-card-hover:hover,
384
+ .stats-icon-rotate:hover,
385
+ .fade-in-up,
386
+ .progress-shimmer::before,
387
+ .tag-shimmer::before {
388
+ animation: none !important;
389
+ transition: none !important;
390
+ transform: none !important;
391
+ }
392
+ }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-theme-zer0
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Amr Abdel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-10-01 00:00:00.000000000 Z
11
+ date: 2025-10-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -78,8 +78,11 @@ files:
78
78
  - LICENSE
79
79
  - README.md
80
80
  - _data/README.md
81
+ - _data/content_statistics.yml
82
+ - _data/generate_statistics.rb
81
83
  - _data/navigation/about.yml
82
84
  - _data/navigation/docs.yml
85
+ - _data/navigation/home.yml
83
86
  - _data/navigation/main.yml
84
87
  - _data/navigation/posts.yml
85
88
  - _data/navigation/quickstart.yml
@@ -91,6 +94,7 @@ files:
91
94
  - _includes/components/halfmoon.html
92
95
  - _includes/components/info-section.html
93
96
  - _includes/components/js-cdn.html
97
+ - _includes/components/mermaid.html
94
98
  - _includes/components/powered-by.html
95
99
  - _includes/components/quick-index.html
96
100
  - _includes/components/searchbar.html
@@ -115,6 +119,13 @@ files:
115
119
  - _includes/navigation/sidebar-folders.html
116
120
  - _includes/navigation/sidebar-left.html
117
121
  - _includes/navigation/sidebar-right.html
122
+ - _includes/stats/README.md
123
+ - _includes/stats/stats-categories.html
124
+ - _includes/stats/stats-header.html
125
+ - _includes/stats/stats-metrics.html
126
+ - _includes/stats/stats-no-data.html
127
+ - _includes/stats/stats-overview.html
128
+ - _includes/stats/stats-tags.html
118
129
  - _layouts/README.md
119
130
  - _layouts/blog.html
120
131
  - _layouts/collection.html
@@ -124,6 +135,8 @@ files:
124
135
  - _layouts/journals.html
125
136
  - _layouts/landing.html
126
137
  - _layouts/root.html
138
+ - _layouts/sitemap-collection.html
139
+ - _layouts/stats.html
127
140
  - _sass/custom.scss
128
141
  - _sass/it-journey/_docs.scss
129
142
  - _sass/it-journey/_syntax.scss
@@ -133,6 +146,7 @@ files:
133
146
  - assets/.DS_Store
134
147
  - assets/css/custom.css
135
148
  - assets/css/main.scss
149
+ - assets/css/stats.css
136
150
  - assets/images/favicon_gpt_computer_retro.png
137
151
  - assets/images/gravatar-small.png
138
152
  - assets/images/gravatar.png
@@ -172,7 +186,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
172
186
  requirements:
173
187
  - - ">="
174
188
  - !ruby/object:Gem::Version
175
- version: 2.6.0
189
+ version: 2.7.0
176
190
  required_rubygems_version: !ruby/object:Gem::Requirement
177
191
  requirements:
178
192
  - - ">="