jekyll-theme-zer0 0.4.0 → 0.6.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>
data/assets/css/main.scss CHANGED
@@ -6,9 +6,9 @@
6
6
  @charset "utf-8";
7
7
 
8
8
  // Styling Variables
9
- @import "it-journey/variables";
10
- @import "it-journey/docs";
11
- @import "it-journey/theme";
9
+ @import "core/variables";
10
+ @import "core/docs";
11
+ @import "core/theme";
12
12
 
13
13
  // Bootstrap Styles
14
14
  // @import "bootstrap.scss";
@@ -17,6 +17,6 @@
17
17
  @import "custom.scss";
18
18
 
19
19
  // Custom Features
20
- @import "it-journey/code-copy";
21
- @import "it-journey/syntax";
20
+ @import "core/code-copy";
21
+ @import "core/syntax";
22
22
 
@@ -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.6.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-10 00:00:00.000000000 Z
11
+ date: 2025-11-23 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
@@ -87,6 +90,8 @@ files:
87
90
  - _includes/analytics/google-analytics.html
88
91
  - _includes/analytics/google-tag-manager-body.html
89
92
  - _includes/analytics/google-tag-manager-head.html
93
+ - _includes/analytics/posthog.html
94
+ - _includes/components/cookie-consent.html
90
95
  - _includes/components/dev-shortcuts.html
91
96
  - _includes/components/halfmoon.html
92
97
  - _includes/components/info-section.html
@@ -96,6 +101,7 @@ files:
96
101
  - _includes/components/quick-index.html
97
102
  - _includes/components/searchbar.html
98
103
  - _includes/components/svg.html
104
+ - _includes/components/theme-info.html
99
105
  - _includes/components/zer0-env-var.html
100
106
  - _includes/content/giscus.html
101
107
  - _includes/content/intro.html
@@ -116,6 +122,13 @@ files:
116
122
  - _includes/navigation/sidebar-folders.html
117
123
  - _includes/navigation/sidebar-left.html
118
124
  - _includes/navigation/sidebar-right.html
125
+ - _includes/stats/README.md
126
+ - _includes/stats/stats-categories.html
127
+ - _includes/stats/stats-header.html
128
+ - _includes/stats/stats-metrics.html
129
+ - _includes/stats/stats-no-data.html
130
+ - _includes/stats/stats-overview.html
131
+ - _includes/stats/stats-tags.html
119
132
  - _layouts/README.md
120
133
  - _layouts/blog.html
121
134
  - _layouts/collection.html
@@ -125,15 +138,18 @@ files:
125
138
  - _layouts/journals.html
126
139
  - _layouts/landing.html
127
140
  - _layouts/root.html
141
+ - _layouts/sitemap-collection.html
142
+ - _layouts/stats.html
143
+ - _sass/core/_docs.scss
144
+ - _sass/core/_syntax.scss
145
+ - _sass/core/_theme.scss
146
+ - _sass/core/_variables.scss
147
+ - _sass/core/code-copy.scss
128
148
  - _sass/custom.scss
129
- - _sass/it-journey/_docs.scss
130
- - _sass/it-journey/_syntax.scss
131
- - _sass/it-journey/_theme.scss
132
- - _sass/it-journey/_variables.scss
133
- - _sass/it-journey/code-copy.scss
134
149
  - assets/.DS_Store
135
150
  - assets/css/custom.css
136
151
  - assets/css/main.scss
152
+ - assets/css/stats.css
137
153
  - assets/images/favicon_gpt_computer_retro.png
138
154
  - assets/images/gravatar-small.png
139
155
  - assets/images/gravatar.png
File without changes
File without changes
File without changes
File without changes
File without changes