jekyll-theme-zer0 0.4.0 → 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.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Amr Abdel
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-10-10 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
@@ -116,6 +119,13 @@ files:
116
119
  - _includes/navigation/sidebar-folders.html
117
120
  - _includes/navigation/sidebar-left.html
118
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
119
129
  - _layouts/README.md
120
130
  - _layouts/blog.html
121
131
  - _layouts/collection.html
@@ -125,6 +135,8 @@ files:
125
135
  - _layouts/journals.html
126
136
  - _layouts/landing.html
127
137
  - _layouts/root.html
138
+ - _layouts/sitemap-collection.html
139
+ - _layouts/stats.html
128
140
  - _sass/custom.scss
129
141
  - _sass/it-journey/_docs.scss
130
142
  - _sass/it-journey/_syntax.scss
@@ -134,6 +146,7 @@ files:
134
146
  - assets/.DS_Store
135
147
  - assets/css/custom.css
136
148
  - assets/css/main.scss
149
+ - assets/css/stats.css
137
150
  - assets/images/favicon_gpt_computer_retro.png
138
151
  - assets/images/gravatar-small.png
139
152
  - assets/images/gravatar.png
@@ -165,7 +178,7 @@ metadata:
165
178
  changelog_uri: https://github.com/bamr87/zer0-mistakes/blob/main/CHANGELOG.md
166
179
  documentation_uri: https://github.com/bamr87/zer0-mistakes#readme
167
180
  allowed_push_host: https://rubygems.org
168
- post_install_message:
181
+ post_install_message:
169
182
  rdoc_options: []
170
183
  require_paths:
171
184
  - lib
@@ -180,8 +193,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
180
193
  - !ruby/object:Gem::Version
181
194
  version: '0'
182
195
  requirements: []
183
- rubygems_version: 3.3.25
184
- signing_key:
196
+ rubygems_version: 3.0.3.1
197
+ signing_key:
185
198
  specification_version: 4
186
199
  summary: Jekyll theme based on bootstrap and compatible with github pages
187
200
  test_files: []