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,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>