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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +16 -0
- data/README.md +6 -4
- data/_data/content_statistics.yml +401 -0
- data/_data/generate_statistics.rb +275 -0
- data/_data/navigation/home.yml +15 -0
- data/_data/navigation/main.yml +2 -5
- data/_includes/content/sitemap.html +935 -108
- data/_includes/navigation/navbar.html +6 -0
- data/_includes/stats/README.md +273 -0
- data/_includes/stats/stats-categories.html +146 -0
- data/_includes/stats/stats-header.html +123 -0
- data/_includes/stats/stats-metrics.html +243 -0
- data/_includes/stats/stats-no-data.html +180 -0
- data/_includes/stats/stats-overview.html +119 -0
- data/_includes/stats/stats-tags.html +142 -0
- data/_layouts/sitemap-collection.html +500 -0
- data/_layouts/stats.html +178 -0
- data/assets/css/stats.css +392 -0
- metadata +19 -6
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
===================================================================
|
|
3
|
+
STATS TAGS COMPONENT
|
|
4
|
+
===================================================================
|
|
5
|
+
|
|
6
|
+
File: stats-tags.html
|
|
7
|
+
Path: _includes/stats/stats-tags.html
|
|
8
|
+
Purpose: Tags analysis section for statistics dashboard
|
|
9
|
+
|
|
10
|
+
Features:
|
|
11
|
+
- Top tags list with usage counts
|
|
12
|
+
- Tag cloud visualization
|
|
13
|
+
- Bootstrap styled card layout
|
|
14
|
+
- Interactive tag display
|
|
15
|
+
|
|
16
|
+
Dependencies:
|
|
17
|
+
- Bootstrap 5 for styling
|
|
18
|
+
- Bootstrap Icons for iconography
|
|
19
|
+
- site.data.content_statistics.tags
|
|
20
|
+
===================================================================
|
|
21
|
+
-->
|
|
22
|
+
|
|
23
|
+
<!-- ================================================ -->
|
|
24
|
+
<!-- TAGS ANALYSIS SECTION -->
|
|
25
|
+
<!-- Top tags with usage counts -->
|
|
26
|
+
<!-- ================================================ -->
|
|
27
|
+
<div id="tags" class="card shadow-sm h-100">
|
|
28
|
+
<div class="card-header bg-success text-white">
|
|
29
|
+
<div class="d-flex align-items-center justify-content-between">
|
|
30
|
+
<h3 class="mb-0 fw-bold">
|
|
31
|
+
<i class="bi bi-tags me-2"></i> Top Tags
|
|
32
|
+
</h3>
|
|
33
|
+
<span class="badge bg-light text-success">
|
|
34
|
+
{{ site.data.content_statistics.overview.total_tags | default: 0 }}
|
|
35
|
+
</span>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
|
|
39
|
+
<div class="card-body p-0">
|
|
40
|
+
{% if site.data.content_statistics.tags and site.data.content_statistics.tags.size > 0 %}
|
|
41
|
+
|
|
42
|
+
<!-- Tags List -->
|
|
43
|
+
<div class="list-group list-group-flush">
|
|
44
|
+
{% for tag in site.data.content_statistics.tags limit: 15 %}
|
|
45
|
+
<div class="list-group-item d-flex justify-content-between align-items-center py-3">
|
|
46
|
+
<div class="d-flex align-items-center">
|
|
47
|
+
<i class="bi bi-tag text-success me-3"></i>
|
|
48
|
+
<div>
|
|
49
|
+
<span class="fw-medium">{{ tag[0] }}</span>
|
|
50
|
+
{% assign max_tag = site.data.content_statistics.tags | first %}
|
|
51
|
+
{% assign max_count = max_tag[1] | default: 1 %}
|
|
52
|
+
{% assign frequent_threshold = max_count | times: 0.6 | round %}
|
|
53
|
+
{% assign moderate_threshold = max_count | times: 0.2 | round %}
|
|
54
|
+
{% if tag[1] >= frequent_threshold and tag[1] > 3 %}
|
|
55
|
+
<br><small class="text-muted">Frequently used</small>
|
|
56
|
+
{% elsif tag[1] >= moderate_threshold and tag[1] > 1 %}
|
|
57
|
+
<br><small class="text-muted">Moderately used</small>
|
|
58
|
+
{% else %}
|
|
59
|
+
<br><small class="text-muted">Occasionally used</small>
|
|
60
|
+
{% endif %}
|
|
61
|
+
</div>
|
|
62
|
+
</div>
|
|
63
|
+
<div class="text-end">
|
|
64
|
+
<span class="badge bg-success rounded-pill fs-6 px-3 py-2">
|
|
65
|
+
{{ tag[1] }}
|
|
66
|
+
</span>
|
|
67
|
+
<br><small class="text-muted">uses</small>
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
{% endfor %}
|
|
71
|
+
</div>
|
|
72
|
+
|
|
73
|
+
<!-- Tag Cloud Section -->
|
|
74
|
+
<div class="card-footer bg-light">
|
|
75
|
+
<h6 class="mb-3 fw-bold">
|
|
76
|
+
<i class="bi bi-cloud"></i> Tag Cloud
|
|
77
|
+
</h6>
|
|
78
|
+
<div class="tag-cloud">
|
|
79
|
+
{% for tag in site.data.content_statistics.tags limit: 25 %}
|
|
80
|
+
{% assign max_tag = site.data.content_statistics.tags | first %}
|
|
81
|
+
{% assign max_count = max_tag[1] | default: 1 %}
|
|
82
|
+
{% if max_count == 0 %}
|
|
83
|
+
{% assign max_count = 1 %}
|
|
84
|
+
{% endif %}
|
|
85
|
+
{% assign tag_size = tag[1] | times: 100 | divided_by: max_count %}
|
|
86
|
+
{% if tag_size > 80 %}
|
|
87
|
+
{% assign tag_class = "fs-xl" %}
|
|
88
|
+
{% elsif tag_size > 60 %}
|
|
89
|
+
{% assign tag_class = "fs-lg" %}
|
|
90
|
+
{% elsif tag_size > 40 %}
|
|
91
|
+
{% assign tag_class = "fs-md" %}
|
|
92
|
+
{% else %}
|
|
93
|
+
{% assign tag_class = "fs-sm" %}
|
|
94
|
+
{% endif %}
|
|
95
|
+
|
|
96
|
+
<span class="badge bg-outline-success {{ tag_class }}"
|
|
97
|
+
data-bs-toggle="tooltip"
|
|
98
|
+
title="{{ tag[1] }} posts">
|
|
99
|
+
{{ tag[0] }}
|
|
100
|
+
</span>
|
|
101
|
+
{% endfor %}
|
|
102
|
+
</div>
|
|
103
|
+
</div>
|
|
104
|
+
|
|
105
|
+
{% else %}
|
|
106
|
+
|
|
107
|
+
<!-- No Tags Available -->
|
|
108
|
+
<div class="text-center py-5">
|
|
109
|
+
<i class="bi bi-tags-fill display-4 text-muted mb-3"></i>
|
|
110
|
+
<h5 class="text-muted">No tags found</h5>
|
|
111
|
+
<p class="text-muted">Tags will appear here once content is tagged.</p>
|
|
112
|
+
</div>
|
|
113
|
+
|
|
114
|
+
{% endif %}
|
|
115
|
+
</div>
|
|
116
|
+
|
|
117
|
+
<!-- Tags Summary Footer -->
|
|
118
|
+
{% if site.data.content_statistics.tags and site.data.content_statistics.tags.size > 0 %}
|
|
119
|
+
<div class="card-footer bg-light">
|
|
120
|
+
<div class="row text-center">
|
|
121
|
+
<div class="col-4">
|
|
122
|
+
<strong class="text-success">{{ site.data.content_statistics.overview.total_tags | default: 0 }}</strong>
|
|
123
|
+
<br><small class="text-muted">Total Tags</small>
|
|
124
|
+
</div>
|
|
125
|
+
<div class="col-4">
|
|
126
|
+
{% assign top_tag = site.data.content_statistics.tags | first %}
|
|
127
|
+
<strong class="text-primary">{{ top_tag[1] | default: 0 }}</strong>
|
|
128
|
+
<br><small class="text-muted">Most Used</small>
|
|
129
|
+
</div>
|
|
130
|
+
<div class="col-4">
|
|
131
|
+
{% assign total_tag_uses = 0 %}
|
|
132
|
+
{% for tag in site.data.content_statistics.tags %}
|
|
133
|
+
{% assign total_tag_uses = total_tag_uses | plus: tag[1] %}
|
|
134
|
+
{% endfor %}
|
|
135
|
+
{% assign avg_tag_uses = total_tag_uses | divided_by: site.data.content_statistics.tags.size %}
|
|
136
|
+
<strong class="text-info">{{ avg_tag_uses | default: 0 }}</strong>
|
|
137
|
+
<br><small class="text-muted">Avg Uses</small>
|
|
138
|
+
</div>
|
|
139
|
+
</div>
|
|
140
|
+
</div>
|
|
141
|
+
{% endif %}
|
|
142
|
+
</div>
|
|
@@ -0,0 +1,500 @@
|
|
|
1
|
+
---
|
|
2
|
+
layout: default
|
|
3
|
+
---
|
|
4
|
+
<!--
|
|
5
|
+
===================================================================
|
|
6
|
+
COMPREHENSIVE SITEMAP COLLECTION LAYOUT
|
|
7
|
+
===================================================================
|
|
8
|
+
|
|
9
|
+
File: sitemap-collection.html
|
|
10
|
+
Path: _layouts/sitemap-collection.html
|
|
11
|
+
Inherits: default.html
|
|
12
|
+
Purpose: Unified layout combining collection display with site statistics
|
|
13
|
+
and comprehensive site structure overview
|
|
14
|
+
|
|
15
|
+
Features:
|
|
16
|
+
- Complete site overview with statistics
|
|
17
|
+
- Collection-based content organization
|
|
18
|
+
- Advanced search and filtering capabilities
|
|
19
|
+
- Responsive card and table views
|
|
20
|
+
- Site structure analysis
|
|
21
|
+
- Content discovery tools
|
|
22
|
+
|
|
23
|
+
Integration:
|
|
24
|
+
- Merges collection.html functionality
|
|
25
|
+
- Incorporates stats.html dashboard elements
|
|
26
|
+
- Enhanced sitemap.html interactive features
|
|
27
|
+
- Comprehensive site analysis and navigation
|
|
28
|
+
|
|
29
|
+
Dependencies:
|
|
30
|
+
- Bootstrap 5 for responsive design
|
|
31
|
+
- Bootstrap Icons for visual elements
|
|
32
|
+
- Jekyll collections and site data
|
|
33
|
+
- Content statistics data (if available)
|
|
34
|
+
===================================================================
|
|
35
|
+
-->
|
|
36
|
+
|
|
37
|
+
<!-- ================================================ -->
|
|
38
|
+
<!-- SITEMAP HEADER AND OVERVIEW -->
|
|
39
|
+
<!-- ================================================ -->
|
|
40
|
+
<div class="container-fluid px-4">
|
|
41
|
+
|
|
42
|
+
<!-- Page Content -->
|
|
43
|
+
{{ content }}
|
|
44
|
+
|
|
45
|
+
<!-- ================================================ -->
|
|
46
|
+
<!-- SITE STATISTICS OVERVIEW -->
|
|
47
|
+
<!-- High-level metrics and site health -->
|
|
48
|
+
<!-- ================================================ -->
|
|
49
|
+
<div class="row mb-5">
|
|
50
|
+
<div class="col-12">
|
|
51
|
+
<div class="card border-primary">
|
|
52
|
+
<div class="card-header bg-primary text-white">
|
|
53
|
+
<h2 class="mb-0 d-flex align-items-center">
|
|
54
|
+
<i class="bi bi-speedometer2 me-2"></i>
|
|
55
|
+
Site Overview & Statistics
|
|
56
|
+
</h2>
|
|
57
|
+
</div>
|
|
58
|
+
<div class="card-body">
|
|
59
|
+
<div class="row g-3">
|
|
60
|
+
<!-- Total Pages -->
|
|
61
|
+
<div class="col-lg-2 col-md-4 col-sm-6">
|
|
62
|
+
<div class="text-center p-3 border rounded">
|
|
63
|
+
<i class="bi bi-file-text display-4 text-primary mb-2"></i>
|
|
64
|
+
<h3 class="fw-bold">{{ site.pages | size }}</h3>
|
|
65
|
+
<small class="text-muted">Pages</small>
|
|
66
|
+
</div>
|
|
67
|
+
</div>
|
|
68
|
+
|
|
69
|
+
<!-- Total Posts -->
|
|
70
|
+
<div class="col-lg-2 col-md-4 col-sm-6">
|
|
71
|
+
<div class="text-center p-3 border rounded">
|
|
72
|
+
<i class="bi bi-journal-text display-4 text-success mb-2"></i>
|
|
73
|
+
<h3 class="fw-bold">{{ site.posts | size }}</h3>
|
|
74
|
+
<small class="text-muted">Posts</small>
|
|
75
|
+
</div>
|
|
76
|
+
</div>
|
|
77
|
+
|
|
78
|
+
<!-- Collections Count -->
|
|
79
|
+
<div class="col-lg-2 col-md-4 col-sm-6">
|
|
80
|
+
<div class="text-center p-3 border rounded">
|
|
81
|
+
<i class="bi bi-collection display-4 text-info mb-2"></i>
|
|
82
|
+
<h3 class="fw-bold">{{ site.collections | size }}</h3>
|
|
83
|
+
<small class="text-muted">Collections</small>
|
|
84
|
+
</div>
|
|
85
|
+
</div>
|
|
86
|
+
|
|
87
|
+
<!-- Data Files -->
|
|
88
|
+
<div class="col-lg-2 col-md-4 col-sm-6">
|
|
89
|
+
<div class="text-center p-3 border rounded">
|
|
90
|
+
<i class="bi bi-database display-4 text-warning mb-2"></i>
|
|
91
|
+
<h3 class="fw-bold">{{ site.data | size }}</h3>
|
|
92
|
+
<small class="text-muted">Data Files</small>
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
|
|
96
|
+
<!-- Categories -->
|
|
97
|
+
<div class="col-lg-2 col-md-4 col-sm-6">
|
|
98
|
+
<div class="text-center p-3 border rounded">
|
|
99
|
+
<i class="bi bi-tags display-4 text-secondary mb-2"></i>
|
|
100
|
+
{% assign all_categories = site.posts | map: 'categories' | join: ',' | split: ',' | uniq | compact %}
|
|
101
|
+
<h3 class="fw-bold">{{ all_categories | size }}</h3>
|
|
102
|
+
<small class="text-muted">Categories</small>
|
|
103
|
+
</div>
|
|
104
|
+
</div>
|
|
105
|
+
|
|
106
|
+
<!-- Total Content -->
|
|
107
|
+
<div class="col-lg-2 col-md-4 col-sm-6">
|
|
108
|
+
<div class="text-center p-3 border rounded">
|
|
109
|
+
<i class="bi bi-globe display-4 text-danger mb-2"></i>
|
|
110
|
+
{% assign total_content = site.pages | size | plus: site.posts.size %}
|
|
111
|
+
{% for collection in site.collections %}
|
|
112
|
+
{% assign total_content = total_content | plus: site[collection.label].size %}
|
|
113
|
+
{% endfor %}
|
|
114
|
+
<h3 class="fw-bold">{{ total_content }}</h3>
|
|
115
|
+
<small class="text-muted">Total Items</small>
|
|
116
|
+
</div>
|
|
117
|
+
</div>
|
|
118
|
+
</div>
|
|
119
|
+
</div>
|
|
120
|
+
</div>
|
|
121
|
+
</div>
|
|
122
|
+
</div>
|
|
123
|
+
|
|
124
|
+
<!-- ================================================ -->
|
|
125
|
+
<!-- ENHANCED SITEMAP COMPONENT -->
|
|
126
|
+
<!-- Interactive search, filtering, and navigation -->
|
|
127
|
+
<!-- ================================================ -->
|
|
128
|
+
<div class="row mb-5">
|
|
129
|
+
<div class="col-12">
|
|
130
|
+
<div class="card">
|
|
131
|
+
<div class="card-header">
|
|
132
|
+
<h3 class="mb-0 d-flex align-items-center">
|
|
133
|
+
<i class="bi bi-map me-2"></i>
|
|
134
|
+
Interactive Site Map
|
|
135
|
+
</h3>
|
|
136
|
+
</div>
|
|
137
|
+
<div class="card-body">
|
|
138
|
+
{% include content/sitemap.html %}
|
|
139
|
+
</div>
|
|
140
|
+
</div>
|
|
141
|
+
</div>
|
|
142
|
+
</div>
|
|
143
|
+
|
|
144
|
+
<!-- ================================================ -->
|
|
145
|
+
<!-- COLLECTIONS OVERVIEW -->
|
|
146
|
+
<!-- Detailed view of all Jekyll collections -->
|
|
147
|
+
<!-- ================================================ -->
|
|
148
|
+
<div class="row mb-5">
|
|
149
|
+
<div class="col-12">
|
|
150
|
+
<div class="card">
|
|
151
|
+
<div class="card-header bg-success text-white">
|
|
152
|
+
<h3 class="mb-0 d-flex align-items-center">
|
|
153
|
+
<i class="bi bi-collection me-2"></i>
|
|
154
|
+
Collections Overview
|
|
155
|
+
</h3>
|
|
156
|
+
</div>
|
|
157
|
+
<div class="card-body">
|
|
158
|
+
{% if site.collections and site.collections.size > 0 %}
|
|
159
|
+
<div class="row g-4">
|
|
160
|
+
{% for collection in site.collections %}
|
|
161
|
+
<div class="col-lg-4 col-md-6">
|
|
162
|
+
<div class="card h-100 border">
|
|
163
|
+
<div class="card-header">
|
|
164
|
+
<h5 class="mb-0 d-flex align-items-center justify-content-between">
|
|
165
|
+
<span>
|
|
166
|
+
<i class="bi bi-folder me-2"></i>
|
|
167
|
+
{{ collection.label | capitalize }}
|
|
168
|
+
</span>
|
|
169
|
+
<span class="badge bg-primary">{{ site[collection.label] | size }}</span>
|
|
170
|
+
</h5>
|
|
171
|
+
</div>
|
|
172
|
+
<div class="card-body">
|
|
173
|
+
{% if collection.description %}
|
|
174
|
+
<p class="card-text">{{ collection.description }}</p>
|
|
175
|
+
{% endif %}
|
|
176
|
+
|
|
177
|
+
{% if site[collection.label] and site[collection.label].size > 0 %}
|
|
178
|
+
<h6>Recent Items:</h6>
|
|
179
|
+
<ul class="list-unstyled">{% assign recent_items = site[collection.label] | sort: 'date' | reverse | limit: 3 %}{% for item in recent_items %}<li class="mb-1">
|
|
180
|
+
<a href="{{ item.url | relative_url }}" class="text-decoration-none">
|
|
181
|
+
<i class="bi bi-arrow-right me-1"></i>
|
|
182
|
+
{{ item.title | default: item.name | truncate: 30 }}
|
|
183
|
+
</a>
|
|
184
|
+
</li>{% endfor %}</ul>
|
|
185
|
+
{% else %}
|
|
186
|
+
<p class="text-muted">No items in this collection yet.</p>
|
|
187
|
+
{% endif %}
|
|
188
|
+
</div>
|
|
189
|
+
<div class="card-footer">
|
|
190
|
+
<a href="/{{ collection.label }}/" class="btn btn-outline-primary btn-sm">
|
|
191
|
+
<i class="bi bi-eye me-1"></i>
|
|
192
|
+
View Collection
|
|
193
|
+
</a>
|
|
194
|
+
</div>
|
|
195
|
+
</div>
|
|
196
|
+
</div>
|
|
197
|
+
{% endfor %}
|
|
198
|
+
</div>
|
|
199
|
+
{% else %}
|
|
200
|
+
<div class="text-center py-5">
|
|
201
|
+
<i class="bi bi-collection-fill display-4 text-muted mb-3"></i>
|
|
202
|
+
<h5 class="text-muted">No collections found</h5>
|
|
203
|
+
<p class="text-muted">Jekyll collections will appear here when configured.</p>
|
|
204
|
+
</div>
|
|
205
|
+
{% endif %}
|
|
206
|
+
</div>
|
|
207
|
+
</div>
|
|
208
|
+
</div>
|
|
209
|
+
</div>
|
|
210
|
+
|
|
211
|
+
<!-- ================================================ -->
|
|
212
|
+
<!-- SITE STRUCTURE ANALYSIS -->
|
|
213
|
+
<!-- Detailed breakdown of site organization -->
|
|
214
|
+
<!-- ================================================ -->
|
|
215
|
+
<div class="row mb-5">
|
|
216
|
+
<div class="col-lg-6">
|
|
217
|
+
<!-- Categories Analysis -->
|
|
218
|
+
<div class="card h-100">
|
|
219
|
+
<div class="card-header bg-info text-white">
|
|
220
|
+
<h4 class="mb-0">
|
|
221
|
+
<i class="bi bi-tags me-2"></i>
|
|
222
|
+
Categories Analysis
|
|
223
|
+
</h4>
|
|
224
|
+
</div>
|
|
225
|
+
<div class="card-body">
|
|
226
|
+
{% assign all_categories = site.posts | map: 'categories' | join: ',' | split: ',' | compact | uniq | sort %}
|
|
227
|
+
{% if all_categories and all_categories.size > 0 %}
|
|
228
|
+
<div class="row g-2">
|
|
229
|
+
{% for category in all_categories limit: 20 %}
|
|
230
|
+
{% assign category_posts = site.posts | where_exp: "post", "post.categories contains category" %}
|
|
231
|
+
<div class="col-auto">
|
|
232
|
+
<span class="badge bg-info">
|
|
233
|
+
{{ category }} ({{ category_posts | size }})
|
|
234
|
+
</span>
|
|
235
|
+
</div>
|
|
236
|
+
{% endfor %}
|
|
237
|
+
</div>
|
|
238
|
+
{% if all_categories.size > 20 %}
|
|
239
|
+
<p class="mt-3 text-muted">And {{ all_categories.size | minus: 20 }} more categories...</p>
|
|
240
|
+
{% endif %}
|
|
241
|
+
{% else %}
|
|
242
|
+
<p class="text-muted">No categories found.</p>
|
|
243
|
+
{% endif %}
|
|
244
|
+
</div>
|
|
245
|
+
</div>
|
|
246
|
+
</div>
|
|
247
|
+
|
|
248
|
+
<div class="col-lg-6">
|
|
249
|
+
<!-- Tags Analysis -->
|
|
250
|
+
<div class="card h-100">
|
|
251
|
+
<div class="card-header bg-warning text-dark">
|
|
252
|
+
<h4 class="mb-0">
|
|
253
|
+
<i class="bi bi-tag me-2"></i>
|
|
254
|
+
Tags Cloud
|
|
255
|
+
</h4>
|
|
256
|
+
</div>
|
|
257
|
+
<div class="card-body">
|
|
258
|
+
{% assign all_tags = site.posts | map: 'tags' | join: ',' | split: ',' | compact | uniq | sort %}
|
|
259
|
+
{% if all_tags and all_tags.size > 0 %}
|
|
260
|
+
<div class="row g-2">
|
|
261
|
+
{% for tag in all_tags limit: 30 %}
|
|
262
|
+
{% assign tag_posts = site.posts | where_exp: "post", "post.tags contains tag" %}
|
|
263
|
+
<div class="col-auto">
|
|
264
|
+
<span class="badge bg-warning text-dark">
|
|
265
|
+
{{ tag }} ({{ tag_posts | size }})
|
|
266
|
+
</span>
|
|
267
|
+
</div>
|
|
268
|
+
{% endfor %}
|
|
269
|
+
</div>
|
|
270
|
+
{% if all_tags.size > 30 %}
|
|
271
|
+
<p class="mt-3 text-muted">And {{ all_tags.size | minus: 30 }} more tags...</p>
|
|
272
|
+
{% endif %}
|
|
273
|
+
{% else %}
|
|
274
|
+
<p class="text-muted">No tags found.</p>
|
|
275
|
+
{% endif %}
|
|
276
|
+
</div>
|
|
277
|
+
</div>
|
|
278
|
+
</div>
|
|
279
|
+
</div>
|
|
280
|
+
|
|
281
|
+
<!-- ================================================ -->
|
|
282
|
+
<!-- RECENT ACTIVITY OVERVIEW -->
|
|
283
|
+
<!-- Latest content and updates -->
|
|
284
|
+
<!-- ================================================ -->
|
|
285
|
+
<div class="row mb-5">
|
|
286
|
+
<div class="col-12">
|
|
287
|
+
<div class="card">
|
|
288
|
+
<div class="card-header bg-secondary text-white">
|
|
289
|
+
<h3 class="mb-0">
|
|
290
|
+
<i class="bi bi-clock-history me-2"></i>
|
|
291
|
+
Recent Activity
|
|
292
|
+
</h3>
|
|
293
|
+
</div>
|
|
294
|
+
<div class="card-body">
|
|
295
|
+
<div class="row">
|
|
296
|
+
<!-- Recent Posts -->
|
|
297
|
+
<div class="col-lg-4">
|
|
298
|
+
<h5 class="border-bottom pb-2">Recent Posts</h5>
|
|
299
|
+
{% assign recent_posts = site.posts | sort: 'date' | reverse | limit: 5 %}
|
|
300
|
+
{% if recent_posts and recent_posts.size > 0 %}
|
|
301
|
+
<ul class="list-unstyled">{% for post in recent_posts %}<li class="mb-2">
|
|
302
|
+
<a href="{{ post.url | relative_url }}" class="text-decoration-none">
|
|
303
|
+
<i class="bi bi-journal-text me-1"></i>
|
|
304
|
+
{{ post.title | truncate: 40 }}
|
|
305
|
+
</a>
|
|
306
|
+
<br><small class="text-muted">{{ post.date | date: "%b %d, %Y" }}</small>
|
|
307
|
+
</li>{% endfor %}</ul>
|
|
308
|
+
{% else %}
|
|
309
|
+
<p class="text-muted">No recent posts.</p>
|
|
310
|
+
{% endif %}
|
|
311
|
+
</div>
|
|
312
|
+
|
|
313
|
+
<!-- Recent Pages -->
|
|
314
|
+
<div class="col-lg-4">
|
|
315
|
+
<h5 class="border-bottom pb-2">Recent Pages</h5>
|
|
316
|
+
{% assign recent_pages = site.pages | sort: 'lastmod' | reverse | limit: 5 %}
|
|
317
|
+
{% if recent_pages and recent_pages.size > 0 %}
|
|
318
|
+
<ul class="list-unstyled">{% for page in recent_pages %}{% if page.title and page.title != "" %}<li class="mb-2">
|
|
319
|
+
<a href="{{ page.url | relative_url }}" class="text-decoration-none">
|
|
320
|
+
<i class="bi bi-file-text me-1"></i>
|
|
321
|
+
{{ page.title | truncate: 40 }}
|
|
322
|
+
</a>
|
|
323
|
+
<br><small class="text-muted">{{ page.lastmod | date: "%b %d, %Y" }}</small>
|
|
324
|
+
</li>{% endif %}{% endfor %}</ul>
|
|
325
|
+
{% else %}
|
|
326
|
+
<p class="text-muted">No recent pages.</p>
|
|
327
|
+
{% endif %}
|
|
328
|
+
</div>
|
|
329
|
+
|
|
330
|
+
<!-- Quick Stats -->
|
|
331
|
+
<div class="col-lg-4">
|
|
332
|
+
<h5 class="border-bottom pb-2">Quick Stats</h5>
|
|
333
|
+
<ul class="list-unstyled">
|
|
334
|
+
<li class="mb-2">
|
|
335
|
+
<i class="bi bi-calendar-week me-2 text-primary"></i>
|
|
336
|
+
<strong>Last Update:</strong> {{ site.time | date: "%B %d, %Y" }}
|
|
337
|
+
</li>
|
|
338
|
+
<li class="mb-2">
|
|
339
|
+
<i class="bi bi-layers me-2 text-success"></i>
|
|
340
|
+
<strong>Layout Types:</strong> {{ site.layouts | size | default: "Multiple" }}
|
|
341
|
+
</li>
|
|
342
|
+
<li class="mb-2">
|
|
343
|
+
<i class="bi bi-plugin me-2 text-info"></i>
|
|
344
|
+
<strong>Plugins:</strong> {{ site.plugins | size | default: "Several" }}
|
|
345
|
+
</li>
|
|
346
|
+
<li class="mb-2">
|
|
347
|
+
<i class="bi bi-gear me-2 text-warning"></i>
|
|
348
|
+
<strong>Environment:</strong> {{ site.environment | default: "production" }}
|
|
349
|
+
</li>
|
|
350
|
+
</ul>
|
|
351
|
+
</div>
|
|
352
|
+
</div>
|
|
353
|
+
</div>
|
|
354
|
+
</div>
|
|
355
|
+
</div>
|
|
356
|
+
</div>
|
|
357
|
+
|
|
358
|
+
<!-- ================================================ -->
|
|
359
|
+
<!-- SITE HEALTH & PERFORMANCE -->
|
|
360
|
+
<!-- Optional advanced statistics if data available -->
|
|
361
|
+
<!-- ================================================ -->
|
|
362
|
+
{% if site.data.content_statistics %}
|
|
363
|
+
<div class="row mb-5">
|
|
364
|
+
<div class="col-12">
|
|
365
|
+
<div class="card border-success">
|
|
366
|
+
<div class="card-header bg-success text-white">
|
|
367
|
+
<h3 class="mb-0">
|
|
368
|
+
<i class="bi bi-heart-pulse me-2"></i>
|
|
369
|
+
Advanced Site Analytics
|
|
370
|
+
</h3>
|
|
371
|
+
</div>
|
|
372
|
+
<div class="card-body">
|
|
373
|
+
<!-- Include existing stats components if available -->
|
|
374
|
+
{% include stats/stats-overview.html %}
|
|
375
|
+
|
|
376
|
+
<div class="row mt-4">
|
|
377
|
+
<div class="col-lg-6">
|
|
378
|
+
{% include stats/stats-categories.html %}
|
|
379
|
+
</div>
|
|
380
|
+
<div class="col-lg-6">
|
|
381
|
+
{% include stats/stats-tags.html %}
|
|
382
|
+
</div>
|
|
383
|
+
</div>
|
|
384
|
+
|
|
385
|
+
<div class="mt-4">
|
|
386
|
+
{% include stats/stats-metrics.html %}
|
|
387
|
+
</div>
|
|
388
|
+
</div>
|
|
389
|
+
</div>
|
|
390
|
+
</div>
|
|
391
|
+
</div>
|
|
392
|
+
{% endif %}
|
|
393
|
+
|
|
394
|
+
</div>
|
|
395
|
+
|
|
396
|
+
<!-- ================================================ -->
|
|
397
|
+
<!-- ENHANCED SITEMAP JAVASCRIPT -->
|
|
398
|
+
<!-- Additional functionality for comprehensive view -->
|
|
399
|
+
<!-- ================================================ -->
|
|
400
|
+
<script>
|
|
401
|
+
document.addEventListener('DOMContentLoaded', function() {
|
|
402
|
+
// Initialize tooltips
|
|
403
|
+
var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
|
|
404
|
+
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
|
|
405
|
+
return new bootstrap.Tooltip(tooltipTriggerEl);
|
|
406
|
+
});
|
|
407
|
+
|
|
408
|
+
// Add smooth scroll for anchor links
|
|
409
|
+
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
|
410
|
+
anchor.addEventListener('click', function (e) {
|
|
411
|
+
e.preventDefault();
|
|
412
|
+
const target = document.querySelector(this.getAttribute('href'));
|
|
413
|
+
if (target) {
|
|
414
|
+
target.scrollIntoView({
|
|
415
|
+
behavior: 'smooth',
|
|
416
|
+
block: 'start'
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
});
|
|
420
|
+
});
|
|
421
|
+
|
|
422
|
+
// Add fade-in animation to cards
|
|
423
|
+
const observerOptions = {
|
|
424
|
+
threshold: 0.1,
|
|
425
|
+
rootMargin: '0px 0px -50px 0px'
|
|
426
|
+
};
|
|
427
|
+
|
|
428
|
+
const observer = new IntersectionObserver(function(entries) {
|
|
429
|
+
entries.forEach(entry => {
|
|
430
|
+
if (entry.isIntersecting) {
|
|
431
|
+
entry.target.style.opacity = '1';
|
|
432
|
+
entry.target.style.transform = 'translateY(0)';
|
|
433
|
+
}
|
|
434
|
+
});
|
|
435
|
+
}, observerOptions);
|
|
436
|
+
|
|
437
|
+
// Observe all cards for animation
|
|
438
|
+
document.querySelectorAll('.card').forEach(card => {
|
|
439
|
+
card.style.opacity = '0';
|
|
440
|
+
card.style.transform = 'translateY(20px)';
|
|
441
|
+
card.style.transition = 'opacity 0.6s ease, transform 0.6s ease';
|
|
442
|
+
observer.observe(card);
|
|
443
|
+
});
|
|
444
|
+
|
|
445
|
+
// Add click tracking for analytics (optional)
|
|
446
|
+
document.querySelectorAll('a[href]').forEach(link => {
|
|
447
|
+
link.addEventListener('click', function() {
|
|
448
|
+
// Add your analytics tracking here if needed
|
|
449
|
+
console.log('Link clicked:', this.href);
|
|
450
|
+
});
|
|
451
|
+
});
|
|
452
|
+
});
|
|
453
|
+
</script>
|
|
454
|
+
|
|
455
|
+
<!-- ================================================ -->
|
|
456
|
+
<!-- SITEMAP-SPECIFIC STYLES -->
|
|
457
|
+
<!-- ================================================ -->
|
|
458
|
+
<style>
|
|
459
|
+
.sitemap-overview {
|
|
460
|
+
background: linear-gradient(135deg, var(--bs-primary-bg-subtle) 0%, var(--bs-success-bg-subtle) 100%);
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
.stats-card {
|
|
464
|
+
transition: transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out;
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
.stats-card:hover {
|
|
468
|
+
transform: translateY(-2px);
|
|
469
|
+
box-shadow: 0 4px 8px rgba(0,0,0,0.1);
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
.collection-card {
|
|
473
|
+
border-left: 4px solid var(--bs-primary);
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
.category-badge:hover {
|
|
477
|
+
transform: scale(1.05);
|
|
478
|
+
transition: transform 0.1s ease;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
/* Dark mode adjustments */
|
|
482
|
+
@media (prefers-color-scheme: dark) {
|
|
483
|
+
.sitemap-overview {
|
|
484
|
+
background: linear-gradient(135deg, rgba(13, 110, 253, 0.1) 0%, rgba(25, 135, 84, 0.1) 100%);
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
/* Print styles */
|
|
489
|
+
@media print {
|
|
490
|
+
.card {
|
|
491
|
+
break-inside: avoid;
|
|
492
|
+
margin-bottom: 1rem;
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
.btn, .badge {
|
|
496
|
+
-webkit-print-color-adjust: exact;
|
|
497
|
+
print-color-adjust: exact;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
</style>
|